From 7d7e58007af55e7697223009fd24daf76aa908e2 Mon Sep 17 00:00:00 2001 From: tamirms Date: Tue, 13 Apr 2021 13:31:22 +0200 Subject: [PATCH 01/67] Update changelog for 2.2.0 release (#3539) --- services/horizon/CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index c5c14c9d67..b6a6ba5237 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -3,9 +3,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## Unreleased +## v2.2.0 -* Add `claimable_balances` to asset stat summaries at `/assets` ([3502](https://github.com/stellar/go/pull/3502)). +**Upgrading to this version will trigger state rebuild. During this process (which can take up to 20 minutes) it will not ingest new ledgers.** + +* Add `num_claimable_balances` and `claimable_balances_amount` fields to asset stat summaries at `/assets` ([3502](https://github.com/stellar/go/pull/3502)). +* Improve ingestion reliability when running multiple Horizon ingestion instances ([3518](https://github.com/stellar/go/pull/3518)). ## v2.1.1 From 23dc1773ac85e4ac18e7e3fc67d251019a9ba60a Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Thu, 15 Apr 2021 15:21:09 +0200 Subject: [PATCH 02/67] Add txnbuild/horizonclient CHANGELOG entries for release 7.0 (#3541) (#3542) --- clients/horizonclient/CHANGELOG.md | 8 ++++++++ txnbuild/CHANGELOG.md | 3 +++ 2 files changed, 11 insertions(+) diff --git a/clients/horizonclient/CHANGELOG.md b/clients/horizonclient/CHANGELOG.md index bc45e6956b..292f9aae93 100644 --- a/clients/horizonclient/CHANGELOG.md +++ b/clients/horizonclient/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [v7.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v7.0.0) - 2021-05-15 + +None + +## [v6.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v6.0.0) - 2021-02-22 + +None + ## [v5.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v5.0.0) - 2020-11-12 None diff --git a/txnbuild/CHANGELOG.md b/txnbuild/CHANGELOG.md index 094765565e..dbea01d93d 100644 --- a/txnbuild/CHANGELOG.md +++ b/txnbuild/CHANGELOG.md @@ -5,6 +5,8 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +## [v7.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v7.0.0) - 2021-05-15 + ### Breaking changes * `AllowTrustOpAsset` was renamed to `AssetCode`, `{Must}NewAllowTrustAsset` was renamed to `{Must}NewAssetCodeFromString`. @@ -18,6 +20,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). * Some methods from the `Operation` interface (`BuildXDR()`,`FromXDR()` and `Validate()`) now take an additional `bool` parameter (`withMuxedAccounts`) * The parameters from `NewFeeBumpTransaction()` and `NewTransaction()` now include a new field (`EnableMuxedAccounts`) to enable M-strekeys. * `TransactionFromXDR()` now allows passing a `TransactionFromXDROptionEnableMuxedAccounts` option, to enable M-strkey parsing. + ## [v6.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v6.0.0) - 2021-02-22 ### Breaking changes From fcd228fb9fad2e51ea391e6d9b9c2a03c4314092 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 15 Apr 2021 13:42:14 -0400 Subject: [PATCH 03/67] protocols/horizon: Make the ClawbackClaimableBalanceOp ID a required string (#3540) --- protocols/horizon/operations/main.go | 2 +- services/horizon/internal/integration/protocol16_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/horizon/operations/main.go b/protocols/horizon/operations/main.go index 9eb7bfad5c..4e00f85a0d 100644 --- a/protocols/horizon/operations/main.go +++ b/protocols/horizon/operations/main.go @@ -280,7 +280,7 @@ type Clawback struct { // ClawbackClaimableBalance. type ClawbackClaimableBalance struct { Base - ClaimableBalanceID *string `json:"balance_id,omitempty"` + BalanceID string `json:"balance_id"` } // SetTrustLineFlags is the json resource representing a single operation whose type is diff --git a/services/horizon/internal/integration/protocol16_test.go b/services/horizon/internal/integration/protocol16_test.go index 080ea65fed..22d29dfc0f 100644 --- a/services/horizon/internal/integration/protocol16_test.go +++ b/services/horizon/internal/integration/protocol16_test.go @@ -381,7 +381,7 @@ func TestHappyClawbackClaimableBalance(t *testing.T) { tt.NoError(err) if tt.Len(opDetailsResponse.Embedded.Records, 1) { clawbackOp := opDetailsResponse.Embedded.Records[0].(operations.ClawbackClaimableBalance) - tt.Equal(cbID, *clawbackOp.ClaimableBalanceID) + tt.Equal(cbID, clawbackOp.BalanceID) } // Check the operation effects From db62b5a82d97aaa37e88135d0cee1867e11d4fd5 Mon Sep 17 00:00:00 2001 From: tamirms Date: Fri, 16 Apr 2021 13:59:10 +0200 Subject: [PATCH 04/67] services/horizon: Fix changelog for horizon 2.1.0 (#3548) --- services/horizon/CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index c5c14c9d67..82ecd75fd8 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -19,6 +19,13 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). **The migration will be performed by the ingestion system (through a state rebuild) and, thus, if some of your Horizon nodes are not ingestors (i.e. no `--ingestion` flag enabled) you may experience 500s in the `GET /claimable_balances/` requests until an ingestion node is upgraded. Also, it's worth noting that the rebuild process will take several minutes and no new ledgers will be ingested until the rebuild is finished.** +### Breaking changes + +* Add a flag `--captive-core-storage-path/CAPTIVE_CORE_STORAGE_PATH` that allows users to control the storage location for Captive Core bucket data ([3479](https://github.com/stellar/go/pull/3479)). + Previously, Horizon created a directory in `/tmp` to store Captive Core bucket data. Now, if the captive core storage path flag is not set, Horizon will default to using the current working directory. +* Add a flag `--captive-core-log-path`/`CAPTIVE_CORE_LOG_PATH` that allows users to control the location of the logs emitted by Captive Core ([3472](https://github.com/stellar/go/pull/3472)). If you have a `LOG_FILE_PATH` entry in your Captive Core toml file remove that entry and use the horizon flag instead. +* `--stellar-core-db-url` / `STELLAR_CORE_DATABASE_URL` should only be configured if Horizon ingestion is enabled otherwise Horizon will not start ([3477](https://github.com/stellar/go/pull/3477)). + ### New features * Add an endpoint which determines if Horizon is healthy enough to receive traffic ([3435](https://github.com/stellar/go/pull/3435)). @@ -26,7 +33,6 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). * Add asset stat summaries per trust-line flag category ([3454](https://github.com/stellar/go/pull/3454)). - The `amount`, and `num_accounts` fields in `/assets` endpoint are deprecated. Fields will be removed in Horizon 3.0. You can find the same data under `balances.authorized`, and `accounts.authorized`, respectively. * Add a flag `--captive-core-peer-port`/`CAPTIVE_CORE_PEER_PORT` that allows users to control which port the Captive Core subprocess will bind to for connecting to the Stellar swarm. ([3483](https://github.com/stellar/go/pull/3484)). -* Add a flag `--captive-core-storage-path/CAPTIVE_CORE_STORAGE_PATH` that allows users to control the storage location for Captive Core bucket data ([3479](https://github.com/stellar/go/pull/3479)). * Add 2 new HTTP endpoints `GET claimable_balances/{id}/transactions` and `GET claimable_balances/{id}/operations`, which respectively return the transactions and operations related to a provided Claimable Balance Identifier `{id}`. * Add Stellar Protocol 16 support. This release comes with support for Protocol 16 ([CAP 35](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0035.md): asset clawback). See [the downstream SDK issue template](https://gist.github.com/2opremio/89c4775104635382d51b6f5e41cbf6d5) for details on what changed on Horizon's side. For full details, please read [CAP 35](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0035.md). From 3b1409bd844fcf0d4d339030f17a823059dc4372 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Fri, 16 Apr 2021 14:03:42 +0200 Subject: [PATCH 05/67] ingest/ledgerbackend: Add missing GetLedger tests (#3547) This commit adds a test I forgot to add in 3d97762. It also fixes the test broken while resolving conflicts in 0821039. --- ingest/ledgerbackend/captive_core_backend.go | 1 - .../captive_core_backend_test.go | 90 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/ingest/ledgerbackend/captive_core_backend.go b/ingest/ledgerbackend/captive_core_backend.go index a4f00c191b..3730e01d1d 100644 --- a/ingest/ledgerbackend/captive_core_backend.go +++ b/ingest/ledgerbackend/captive_core_backend.go @@ -553,7 +553,6 @@ func (c *CaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMe c.previousLedgerHash = ¤tLedgerHash // Update cache with the latest value because we incremented nextLedger. - // TODO add test for this case! c.cachedMeta = result.LedgerCloseMeta if seq == sequence { diff --git a/ingest/ledgerbackend/captive_core_backend_test.go b/ingest/ledgerbackend/captive_core_backend_test.go index 3870199f61..6fbf873ec9 100644 --- a/ingest/ledgerbackend/captive_core_backend_test.go +++ b/ingest/ledgerbackend/captive_core_backend_test.go @@ -603,6 +603,72 @@ func TestCaptiveGetLedger(t *testing.T) { mockRunner.AssertExpectations(t) } +// TestCaptiveGetLedgerCacheLatestLedger test the following case: +// 1. Prepare Unbounded range. +// 2. GetLedger that is still not in the buffer. +// 3. Get latest ledger in the buffer using GetLedger. +// +// Before 3d97762 this test failed because cachedMeta was only updated when +// the ledger with a requested sequence was reached while streaming meta. +func TestCaptiveGetLedgerCacheLatestLedger(t *testing.T) { + tt := assert.New(t) + metaChan := make(chan metaResult, 300) + + for i := 2; i <= 67; i++ { + meta := buildLedgerCloseMeta(testLedgerHeader{sequence: uint32(i)}) + metaChan <- metaResult{ + LedgerCloseMeta: &meta, + } + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mockRunner := &stellarCoreRunnerMock{} + mockRunner.On("runFrom", uint32(62), "0101010100000000000000000000000000000000000000000000000000000000").Return(nil).Once() + mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) + mockRunner.On("context").Return(ctx) + + mockArchive := &historyarchive.MockArchive{} + mockArchive. + On("GetRootHAS"). + Return(historyarchive.HistoryArchiveState{ + CurrentLedger: uint32(200), + }, nil) + + mockArchive. + On("GetLedgerHeader", uint32(63)). + Return(xdr.LedgerHeaderHistoryEntry{ + Header: xdr.LedgerHeader{ + PreviousLedgerHash: xdr.Hash{1, 1, 1, 1}, + }, + }, nil).Once() + + captiveBackend := CaptiveStellarCore{ + archive: mockArchive, + stellarCoreRunnerFactory: func(_ stellarCoreRunnerMode) (stellarCoreRunnerInterface, error) { + return mockRunner, nil + }, + checkpointManager: historyarchive.NewCheckpointManager(64), + } + + err := captiveBackend.PrepareRange(UnboundedRange(66)) + assert.NoError(t, err) + + found, _, err := captiveBackend.GetLedger(68) + tt.NoError(err) + tt.False(found) + tt.Equal(uint32(67), captiveBackend.cachedMeta.LedgerSequence()) + tt.Equal(uint32(68), captiveBackend.nextLedger) + + found, meta, err := captiveBackend.GetLedger(67) + tt.NoError(err) + tt.True(found) + tt.Equal(uint32(67), meta.LedgerSequence()) + + mockArchive.AssertExpectations(t) + mockRunner.AssertExpectations(t) +} + func TestCaptiveGetLedger_NextLedgerIsDifferentToLedgerFromBuffer(t *testing.T) { metaChan := make(chan metaResult, 100) @@ -624,6 +690,30 @@ func TestCaptiveGetLedger_NextLedgerIsDifferentToLedgerFromBuffer(t *testing.T) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) mockRunner.On("context").Return(context.Background()) mockRunner.On("close").Return(nil) + + mockArchive := &historyarchive.MockArchive{} + mockArchive. + On("GetRootHAS"). + Return(historyarchive.HistoryArchiveState{ + CurrentLedger: uint32(200), + }, nil) + + captiveBackend := CaptiveStellarCore{ + archive: mockArchive, + stellarCoreRunnerFactory: func(_ stellarCoreRunnerMode) (stellarCoreRunnerInterface, error) { + return mockRunner, nil + }, + checkpointManager: historyarchive.NewCheckpointManager(64), + } + + err := captiveBackend.PrepareRange(BoundedRange(65, 66)) + assert.NoError(t, err) + + _, _, err = captiveBackend.GetLedger(66) + assert.EqualError(t, err, "unexpected ledger sequence (expected=66 actual=68)") + + mockArchive.AssertExpectations(t) + mockRunner.AssertExpectations(t) } func TestCaptiveStellarCore_PrepareRangeAfterClose(t *testing.T) { From 56d94a2f370fde4e8a7500658cc7fa57ddfc08e4 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 19 Apr 2021 18:02:29 +0100 Subject: [PATCH 06/67] Fix TestOpen_openAndPingFails (#3551) --- .../recoverysigner/internal/db/db_test.go | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/exp/services/recoverysigner/internal/db/db_test.go b/exp/services/recoverysigner/internal/db/db_test.go index 3ef0bc34e1..91dba7d5b2 100644 --- a/exp/services/recoverysigner/internal/db/db_test.go +++ b/exp/services/recoverysigner/internal/db/db_test.go @@ -1,6 +1,9 @@ package db import ( + "fmt" + "net" + "regexp" "testing" "github.com/stellar/go/support/db/dbtest" @@ -20,10 +23,25 @@ func TestOpen_openAndPingSucceeds(t *testing.T) { } func TestOpen_openAndPingFails(t *testing.T) { - sqlxDB, err := Open("postgres://localhost:0") + // Find an empty port + listener, err := net.Listen("tcp", ":0") + require.NoError(t, err) + port := listener.Addr().(*net.TCPAddr).Port + require.NoError(t, listener.Close()) + // Slight race here with other stuff on the system, which could claim this port. + + sqlxDB, err := Open(fmt.Sprintf("postgres://localhost:%d", port)) require.NoError(t, err) assert.Equal(t, "postgres", sqlxDB.DriverName()) err = sqlxDB.Ping() - require.EqualError(t, err, "dial tcp 127.0.0.1:0: connect: connection refused") + require.Error(t, err) + require.Regexp( + t, + regexp.MustCompile( + // regex to support both ipv4 and ipv6, on the port we found. + fmt.Sprintf("dial tcp (127\\.0\\.0\\.1|\\[::1\\]):%d: connect: connection refused", port), + ), + err.Error(), + ) } From cebefa7f0af3f508cab14c28cbca9709b63345a0 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Tue, 20 Apr 2021 17:08:40 +0200 Subject: [PATCH 07/67] services/horizon/docker/verify-range: Update base image and Stellar-Core version (#3553) --- services/horizon/docker/verify-range/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/horizon/docker/verify-range/Dockerfile b/services/horizon/docker/verify-range/Dockerfile index dbbb123e42..13a4a3207a 100644 --- a/services/horizon/docker/verify-range/Dockerfile +++ b/services/horizon/docker/verify-range/Dockerfile @@ -1,8 +1,8 @@ -FROM ubuntu:18.04 +FROM ubuntu:20.04 MAINTAINER Bartek Nowotarski -ENV STELLAR_CORE_VERSION 15.0.0-40 +ENV STELLAR_CORE_VERSION 16.0.0-529.0e35ac6.focal # to remove tzdata interactive flow ENV DEBIAN_FRONTEND=noninteractive From dcfb6997030fc21f7045b808cebe92bc49211acb Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Tue, 20 Apr 2021 14:35:06 -0700 Subject: [PATCH 08/67] all: update go versions to 1.16.3 and 1.15.11 (#3538) Update Go versions used in tests and CI to 1.16.3 and 1.15.11. They were released on Apr 1st. --- .circleci/config.yml | 14 +++++++------- exp/services/recoverysigner/docker/Dockerfile | 2 +- exp/services/webauth/docker/Dockerfile | 2 +- exp/tools/dump-ledger-state/Dockerfile | 2 +- services/friendbot/docker/Dockerfile | 2 +- services/horizon/docker/Dockerfile.dev | 2 +- services/horizon/docker/verify-range/dependencies | 4 ++-- .../internal/scripts/check_release_hash/Dockerfile | 2 +- services/keystore/docker/Dockerfile | 2 +- .../docker/Dockerfile | 2 +- services/ticker/docker/Dockerfile | 2 +- services/ticker/docker/Dockerfile-dev | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ec6fe9d45d..063130240e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -115,8 +115,8 @@ commands: name: Download and install golang command: | sudo rm -rf /usr/local/go - wget https://dl.google.com/go/go1.16.linux-amd64.tar.gz - sudo tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz + wget https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz + sudo tar -C /usr/local -xzf go1.16.3.linux-amd64.tar.gz # install_go_deps installs the go dependencies of the project. install_go_deps: @@ -248,7 +248,7 @@ jobs: test_code_1_15: working_directory: /go/src/github.com/stellar/go docker: - - image: golang:1.15.10 + - image: golang:1.15.11 environment: GO111MODULE: "on" PGHOST: localhost @@ -268,7 +268,7 @@ jobs: test_code_1_15_postgres10: working_directory: /go/src/github.com/stellar/go docker: - - image: golang:1.15.10 + - image: golang:1.15.11 environment: GO111MODULE: "on" PGHOST: localhost @@ -290,7 +290,7 @@ jobs: test_code_1_16: working_directory: /go/src/github.com/stellar/go docker: - - image: golang:1.16.2 + - image: golang:1.16.3 environment: GO111MODULE: "on" PGHOST: localhost @@ -310,7 +310,7 @@ jobs: test_code_1_16_postgres10: working_directory: /go/src/github.com/stellar/go docker: - - image: golang:1.16.2 + - image: golang:1.16.3 environment: GO111MODULE: "on" PGHOST: localhost @@ -334,7 +334,7 @@ jobs: publish_artifacts: working_directory: /go/src/github.com/stellar/go docker: - - image: golang:1.16.2 + - image: golang:1.16.3 steps: - check_deprecations - install_go_deps diff --git a/exp/services/recoverysigner/docker/Dockerfile b/exp/services/recoverysigner/docker/Dockerfile index 3f4ff4197f..a9806b3db0 100644 --- a/exp/services/recoverysigner/docker/Dockerfile +++ b/exp/services/recoverysigner/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/recoverysigner WORKDIR /src/recoverysigner diff --git a/exp/services/webauth/docker/Dockerfile b/exp/services/webauth/docker/Dockerfile index 4da32a5539..b9e29aee5c 100644 --- a/exp/services/webauth/docker/Dockerfile +++ b/exp/services/webauth/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/webauth WORKDIR /src/webauth diff --git a/exp/tools/dump-ledger-state/Dockerfile b/exp/tools/dump-ledger-state/Dockerfile index 3a9fe4feb3..57c95dbf39 100644 --- a/exp/tools/dump-ledger-state/Dockerfile +++ b/exp/tools/dump-ledger-state/Dockerfile @@ -21,7 +21,7 @@ RUN echo "host all all all trust" > /etc/postgresql/9.6/main/pg_hba.conf # And add `listen_addresses` to `/etc/postgresql/9.6/main/postgresql.conf` RUN echo "listen_addresses='*'" >> /etc/postgresql/9.6/main/postgresql.conf -RUN curl -sL https://storage.googleapis.com/golang/go1.16.2.linux-amd64.tar.gz | tar -C /usr/local -xz +RUN curl -sL https://storage.googleapis.com/golang/go1.16.3.linux-amd64.tar.gz | tar -C /usr/local -xz RUN ln -s /usr/local/go/bin/go /usr/local/bin/go WORKDIR /go/src/github.com/stellar/go COPY go.mod go.sum ./ diff --git a/services/friendbot/docker/Dockerfile b/services/friendbot/docker/Dockerfile index da9fdbe2bd..06f3c13ec2 100644 --- a/services/friendbot/docker/Dockerfile +++ b/services/friendbot/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/friendbot WORKDIR /src/friendbot diff --git a/services/horizon/docker/Dockerfile.dev b/services/horizon/docker/Dockerfile.dev index ba4ed08075..3d2f69b960 100644 --- a/services/horizon/docker/Dockerfile.dev +++ b/services/horizon/docker/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM golang:1.16.2 AS builder +FROM golang:1.16.3 AS builder WORKDIR /go/src/github.com/stellar/go COPY go.mod go.sum ./ diff --git a/services/horizon/docker/verify-range/dependencies b/services/horizon/docker/verify-range/dependencies index af62303c8e..0dd005c7fa 100644 --- a/services/horizon/docker/verify-range/dependencies +++ b/services/horizon/docker/verify-range/dependencies @@ -10,8 +10,8 @@ echo "deb https://apt.stellar.org/public stable/" | tee -a /etc/apt/sources.list apt-get update apt-get install -y stellar-core -wget https://dl.google.com/go/go1.16.2.linux-amd64.tar.gz -tar -C /usr/local -xzf go1.16.2.linux-amd64.tar.gz +wget https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz +tar -C /usr/local -xzf go1.16.3.linux-amd64.tar.gz # configure postgres service postgresql start diff --git a/services/horizon/internal/scripts/check_release_hash/Dockerfile b/services/horizon/internal/scripts/check_release_hash/Dockerfile index 39087c3157..36a3d8cc2f 100644 --- a/services/horizon/internal/scripts/check_release_hash/Dockerfile +++ b/services/horizon/internal/scripts/check_release_hash/Dockerfile @@ -1,5 +1,5 @@ # Change to Go version used in CI or rebuild with --build-arg. -ARG GO_IMAGE=golang:1.16.2 +ARG GO_IMAGE=golang:1.16.3 FROM $GO_IMAGE WORKDIR /go/src/github.com/stellar/go diff --git a/services/keystore/docker/Dockerfile b/services/keystore/docker/Dockerfile index 2c1735c524..45c9292957 100644 --- a/services/keystore/docker/Dockerfile +++ b/services/keystore/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/keystore WORKDIR /src/keystore diff --git a/services/regulated-assets-approval-server/docker/Dockerfile b/services/regulated-assets-approval-server/docker/Dockerfile index 938cdf43ac..e29a355f7b 100644 --- a/services/regulated-assets-approval-server/docker/Dockerfile +++ b/services/regulated-assets-approval-server/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/regulated-assets-approval-server WORKDIR /src/regulated-assets-approval-server diff --git a/services/ticker/docker/Dockerfile b/services/ticker/docker/Dockerfile index f47c01f636..d2dcd5e458 100644 --- a/services/ticker/docker/Dockerfile +++ b/services/ticker/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16.2 as build +FROM golang:1.16.3 as build ADD . /src/ticker WORKDIR /src/ticker diff --git a/services/ticker/docker/Dockerfile-dev b/services/ticker/docker/Dockerfile-dev index c8c7434f55..8be2701822 100644 --- a/services/ticker/docker/Dockerfile-dev +++ b/services/ticker/docker/Dockerfile-dev @@ -1,4 +1,4 @@ -FROM golang:1.16.2-stretch as build +FROM golang:1.16.3-stretch as build LABEL maintainer="Alex Cordeiro " From 13c2d95458b6557e0058f8aa6ad2d9d5b870463f Mon Sep 17 00:00:00 2001 From: Jacek Nykis Date: Wed, 21 Apr 2021 11:17:55 +0100 Subject: [PATCH 09/67] Switch friendbot to 20.04 image --- services/friendbot/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/friendbot/docker/Dockerfile b/services/friendbot/docker/Dockerfile index 06f3c13ec2..e02b0f4fbd 100644 --- a/services/friendbot/docker/Dockerfile +++ b/services/friendbot/docker/Dockerfile @@ -4,9 +4,9 @@ ADD . /src/friendbot WORKDIR /src/friendbot RUN go build -o /bin/friendbot ./services/friendbot -FROM ubuntu:18.04 +FROM ubuntu:20.04 -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/friendbot /app/ EXPOSE 8004 ENTRYPOINT ["/app/friendbot"] From 7c92b23f34181a00a510914d80fc458372aa13b0 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Wed, 21 Apr 2021 14:28:56 +0200 Subject: [PATCH 10/67] services/horizon: Add --skip-migrations-check flag (#3557) This commit adds `--skip-migrations-check` flag that, when set, will skip checking if there are any migrations required to start Horizon. When checking if there are any migrations required Horizon calls `migrate.PlanMigration` which sends `CREATE TABLE gorp_migrations`. This query is forbidden when using read only database (like replica). --- services/horizon/internal/config.go | 3 +++ services/horizon/internal/flags.go | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/services/horizon/internal/config.go b/services/horizon/internal/config.go index 2bca813e91..f96851527b 100644 --- a/services/horizon/internal/config.go +++ b/services/horizon/internal/config.go @@ -74,6 +74,9 @@ type Config struct { // ApplyMigrations will apply pending migrations to the horizon database // before starting the horizon service ApplyMigrations bool + // SkipMigrationsCheck will skip checking if there are any migrations + // required + SkipMigrationsCheck bool // CheckpointFrequency establishes how many ledgers exist between checkpoints CheckpointFrequency uint32 // BehindCloudflare determines if Horizon instance is behind Cloudflare. In diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index 491be01803..a17a89a534 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -386,6 +386,14 @@ func Flags() (*Config, support.ConfigOptions) { Required: false, Usage: "applies pending migrations before starting horizon", }, + &support.ConfigOption{ + Name: "skip-migrations-check", + ConfigKey: &config.SkipMigrationsCheck, + OptType: types.Bool, + FlagDefault: false, + Required: false, + Usage: "skips checking if there are migrations required", + }, &support.ConfigOption{ Name: "checkpoint-frequency", ConfigKey: &config.CheckpointFrequency, @@ -443,7 +451,9 @@ func ApplyFlags(config *Config, flags support.ConfigOptions) { } // Migrations should be checked as early as possible - checkMigrations(*config) + if !config.SkipMigrationsCheck { + checkMigrations(*config) + } // Validate options that should be provided together validateBothOrNeither("tls-cert", "tls-key") From 3544e1328ffba36a1c326e2b14b80d7cc5cbe4c8 Mon Sep 17 00:00:00 2001 From: Jacek Nykis Date: Fri, 23 Apr 2021 13:32:42 +0100 Subject: [PATCH 11/67] Move recoverysigner docker image to 20.04 base --- exp/services/recoverysigner/docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exp/services/recoverysigner/docker/Dockerfile b/exp/services/recoverysigner/docker/Dockerfile index a9806b3db0..681202f75e 100644 --- a/exp/services/recoverysigner/docker/Dockerfile +++ b/exp/services/recoverysigner/docker/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /src/recoverysigner RUN go build -o /bin/recoverysigner ./exp/services/recoverysigner -FROM ubuntu:18.04 +FROM ubuntu:20.04 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/recoverysigner /app/ From f362e0c5d7f8a013d92ff191d37c1daac0555a2f Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Fri, 23 Apr 2021 17:51:47 +0100 Subject: [PATCH 12/67] all: Refactor db.Session to take ctx into each call, instead of storing it on the session level (#3545) * Refactoring to add ctx to db calls * Avoid changing the LedgerBackend interface * Pull out exp/services/captivecore ctx changes * Add explicit close to LedgerHashStore, instead of relying on implicit db ctx cancellation * Propagate root ctx to ensure ledgerbackend and hash store shutdown --- .../captivecore/internal/server_test.go | 2 + exp/services/captivecore/main.go | 3 +- exp/tools/dump-ledger-state/main.go | 2 +- handlers/federation/handler.go | 12 +- handlers/federation/handler_test.go | 3 +- handlers/federation/main.go | 5 +- handlers/federation/reverse_sql_driver.go | 9 +- handlers/federation/sql_driver.go | 12 +- ingest/ledgerbackend/captive_core_backend.go | 7 + .../captive_core_backend_test.go | 50 +++++-- ingest/ledgerbackend/database_backend.go | 31 ++-- ingest/ledgerbackend/ledger_backend.go | 6 +- ingest/ledgerbackend/ledger_hash_store.go | 26 +++- ingest/ledgerbackend/mock_database_backend.go | 3 +- ingest/ledgerbackend/remote_captive_core.go | 14 +- ingest/stats_change_processor.go | 3 +- ingest/stats_change_processor_test.go | 32 ++-- services/horizon/cmd/db.go | 6 +- services/horizon/cmd/ingest.go | 7 +- .../horizon/internal/action_offers_test.go | 14 +- services/horizon/internal/actions/account.go | 40 ++--- .../horizon/internal/actions/account_data.go | 2 +- .../horizon/internal/actions/account_test.go | 48 +++--- services/horizon/internal/actions/asset.go | 12 +- .../horizon/internal/actions/asset_test.go | 8 +- .../internal/actions/claimable_balance.go | 8 +- .../actions/claimable_balance_test.go | 14 +- services/horizon/internal/actions/effects.go | 23 +-- services/horizon/internal/actions/ledger.go | 4 +- services/horizon/internal/actions/offer.go | 7 +- .../horizon/internal/actions/offer_test.go | 26 ++-- .../horizon/internal/actions/operation.go | 16 +- .../internal/actions/operation_test.go | 4 +- .../horizon/internal/actions/orderbook.go | 2 +- .../internal/actions/orderbook_test.go | 10 +- services/horizon/internal/actions/path.go | 2 +- services/horizon/internal/actions/trade.go | 25 ++-- .../horizon/internal/actions/transaction.go | 21 +-- .../horizon/internal/actions_account_test.go | 6 +- .../horizon/internal/actions_data_test.go | 10 +- .../horizon/internal/actions_effects_test.go | 4 +- .../actions_operation_fee_stats_test.go | 20 +-- .../internal/actions_operation_test.go | 4 +- .../horizon/internal/actions_path_test.go | 16 +- .../horizon/internal/actions_payment_test.go | 8 +- .../horizon/internal/actions_root_test.go | 6 +- .../horizon/internal/actions_trade_test.go | 2 +- .../internal/actions_transaction_test.go | 6 +- services/horizon/internal/app.go | 42 +++--- .../internal/db2/assets/asset_stat_test.go | 3 +- .../horizon/internal/db2/history/account.go | 17 ++- .../internal/db2/history/account_data.go | 33 ++-- .../account_data_batch_insert_builder.go | 10 +- .../account_data_batch_insert_builder_test.go | 6 +- .../internal/db2/history/account_data_test.go | 40 ++--- .../internal/db2/history/account_signers.go | 22 +-- .../account_signers_batch_insert_builder.go | 12 +- .../db2/history/account_signers_test.go | 34 ++--- .../internal/db2/history/account_test.go | 8 +- .../horizon/internal/db2/history/accounts.go | 36 +++-- .../history/accounts_batch_insert_builder.go | 10 +- .../internal/db2/history/accounts_test.go | 110 +++++++------- .../horizon/internal/db2/history/asset.go | 13 +- .../internal/db2/history/asset_stats.go | 27 ++-- .../internal/db2/history/asset_stats_test.go | 54 +++---- .../internal/db2/history/asset_test.go | 8 +- .../db2/history/claimable_balances.go | 45 +++--- ...able_balances_batch_insert_builder_test.go | 6 +- .../db2/history/claimable_balances_test.go | 44 +++--- .../horizon/internal/db2/history/effect.go | 17 ++- .../history/effect_batch_insert_builder.go | 12 +- .../effect_batch_insert_builder_test.go | 8 +- .../internal/db2/history/fee_bump_scenario.go | 20 ++- .../db2/history/history_claimable_balances.go | 43 +++--- .../horizon/internal/db2/history/ingestion.go | 8 +- .../horizon/internal/db2/history/key_value.go | 41 ++--- .../horizon/internal/db2/history/ledger.go | 22 +-- .../internal/db2/history/ledger_cache.go | 6 +- .../internal/db2/history/ledger_cache_test.go | 2 +- .../internal/db2/history/ledger_test.go | 14 +- services/horizon/internal/db2/history/main.go | 141 +++++++++--------- .../horizon/internal/db2/history/main_test.go | 10 +- .../mock_account_data_batch_insert_builder.go | 9 +- ...ck_account_signers_batch_insert_builder.go | 9 +- .../mock_effect_batch_insert_builder.go | 9 +- .../mock_offers_batch_insert_builder.go | 9 +- ...ration_participant_batch_insert_builder.go | 9 +- .../mock_operations_batch_insert_builder.go | 9 +- .../internal/db2/history/mock_q_accounts.go | 13 +- .../db2/history/mock_q_asset_stats.go | 33 ++-- .../db2/history/mock_q_claimable_balances.go | 29 ++-- .../internal/db2/history/mock_q_data.go | 22 +-- .../internal/db2/history/mock_q_effects.go | 5 +- .../mock_q_history_claimable_balances.go | 21 +-- .../internal/db2/history/mock_q_ledgers.go | 9 +- .../internal/db2/history/mock_q_offers.go | 29 ++-- .../db2/history/mock_q_participants.go | 13 +- .../internal/db2/history/mock_q_signers.go | 37 ++--- .../internal/db2/history/mock_q_trades.go | 19 ++- .../db2/history/mock_q_trust_lines.go | 22 +-- .../mock_transactions_batch_insert_builder.go | 10 +- .../horizon/internal/db2/history/offers.go | 55 +++---- .../history/offers_batch_insert_builder.go | 12 +- .../internal/db2/history/offers_test.go | 110 +++++++------- .../horizon/internal/db2/history/operation.go | 33 ++-- .../history/operation_batch_insert_builder.go | 12 +- .../operation_batch_insert_builder_test.go | 10 +- ...ration_participant_batch_insert_builder.go | 12 +- ...n_participant_batch_insert_builder_test.go | 6 +- .../internal/db2/history/operation_test.go | 82 +++++----- .../horizon/internal/db2/history/orderbook.go | 9 +- .../internal/db2/history/orderbook_test.go | 46 +++--- .../internal/db2/history/participants.go | 14 +- .../internal/db2/history/participants_test.go | 8 +- .../internal/db2/history/sequence_provider.go | 6 +- .../db2/history/sequence_provider_test.go | 10 +- .../horizon/internal/db2/history/trade.go | 23 +-- .../db2/history/trade_batch_insert_builder.go | 13 +- .../internal/db2/history/trade_test.go | 40 ++--- .../internal/db2/history/transaction.go | 27 ++-- .../transaction_batch_insert_builder.go | 13 +- .../internal/db2/history/transaction_test.go | 54 +++---- .../internal/db2/history/trust_lines.go | 39 ++--- .../trust_lines_batch_insert_builder.go | 10 +- .../internal/db2/history/trust_lines_test.go | 68 ++++----- services/horizon/internal/health.go | 2 +- services/horizon/internal/health_test.go | 7 +- services/horizon/internal/httpt_test.go | 7 +- services/horizon/internal/httpx/handler.go | 4 +- services/horizon/internal/httpx/middleware.go | 21 ++- .../internal/httpx/stream_handler_test.go | 17 ++- .../internal/ingest/build_state_test.go | 94 ++++++------ .../internal/ingest/database_backend_test.go | 4 +- .../internal/ingest/db_integration_test.go | 7 +- services/horizon/internal/ingest/fsm.go | 109 +++++++------- .../internal/ingest/group_processors.go | 17 ++- .../internal/ingest/group_processors_test.go | 61 ++++---- .../ingest/ingest_history_range_state_test.go | 122 +++++++-------- .../internal/ingest/init_state_test.go | 108 +++++++------- services/horizon/internal/ingest/main.go | 18 +-- services/horizon/internal/ingest/main_test.go | 94 ++++++------ services/horizon/internal/ingest/orderbook.go | 34 ++--- .../horizon/internal/ingest/orderbook_test.go | 121 ++++++++------- .../internal/ingest/processor_runner.go | 22 +-- .../internal/ingest/processor_runner_test.go | 67 +++++---- .../processors/account_data_processor.go | 16 +- .../accounts_data_processor_test.go | 30 ++-- .../ingest/processors/accounts_processor.go | 12 +- .../processors/accounts_processor_test.go | 31 ++-- .../processors/asset_stats_processor.go | 21 +-- .../processors/asset_stats_processor_test.go | 129 ++++++++-------- .../ingest/processors/change_processors.go | 11 +- .../processors/change_processors_test.go | 9 +- .../claimable_balances_change_processor.go | 16 +- ...laimable_balances_change_processor_test.go | 28 ++-- ...laimable_balances_transaction_processor.go | 28 ++-- ...ble_balances_transaction_processor_test.go | 21 +-- .../ingest/processors/effects_processor.go | 19 +-- .../processors/effects_processor_test.go | 32 ++-- .../ingest/processors/ledgers_processor.go | 8 +- .../processors/ledgers_processor_test.go | 15 +- .../processors/mock_change_processor.go | 6 +- .../ingest/processors/offers_processor.go | 22 +-- .../processors/offers_processor_test.go | 84 ++++++----- .../ingest/processors/operations_processor.go | 9 +- .../processors/operations_processor_test.go | 18 ++- .../processors/participants_processor.go | 27 ++-- .../processors/participants_processor_test.go | 111 +++++++------- .../processors/signer_processor_test.go | 77 ++++++---- .../ingest/processors/signers_processor.go | 16 +- .../stats_ledger_transaction_processor.go | 3 +- ...stats_ledger_transaction_processor_test.go | 5 +- .../ingest/processors/trades_processor.go | 13 +- .../processors/trades_processor_test.go | 94 ++++++------ .../processors/transactions_processor.go | 9 +- .../processors/transactions_processor_test.go | 31 ++-- .../processors/trust_lines_processor.go | 12 +- .../processors/trust_lines_processor_test.go | 68 +++++---- .../internal/ingest/resume_state_test.go | 90 +++++------ .../horizon/internal/ingest/stress_test.go | 42 +++--- services/horizon/internal/ingest/verify.go | 51 ++++--- .../ingest/verify_range_state_test.go | 86 +++++------ services/horizon/internal/init.go | 4 +- services/horizon/internal/middleware_test.go | 9 +- services/horizon/internal/reap/system.go | 17 ++- services/horizon/internal/reap/system_test.go | 14 +- services/horizon/internal/test/t.go | 10 +- services/horizon/internal/test/trades/main.go | 11 +- .../horizon/internal/txsub/helpers_test.go | 16 +- services/horizon/internal/txsub/results.go | 15 +- .../horizon/internal/txsub/results_test.go | 6 +- services/horizon/internal/txsub/system.go | 22 +-- .../horizon/internal/txsub/system_test.go | 94 ++++++------ services/ticker/cmd/clean.go | 3 +- services/ticker/cmd/generate.go | 3 +- services/ticker/cmd/ingest.go | 7 +- services/ticker/internal/actions_asset.go | 11 +- services/ticker/internal/actions_market.go | 4 +- services/ticker/internal/actions_orderbook.go | 8 +- services/ticker/internal/actions_trade.go | 15 +- .../ticker/internal/gql/resolvers_asset.go | 5 +- .../ticker/internal/gql/resolvers_issuer.go | 5 +- .../ticker/internal/gql/resolvers_market.go | 9 +- services/ticker/internal/tickerdb/helpers.go | 5 +- services/ticker/internal/tickerdb/main.go | 2 - .../ticker/internal/tickerdb/queries_asset.go | 20 ++- .../internal/tickerdb/queries_issuer.go | 9 +- .../internal/tickerdb/queries_market.go | 17 ++- .../internal/tickerdb/queries_orderbook.go | 8 +- .../ticker/internal/tickerdb/queries_trade.go | 19 +-- .../tickerdb_test/queries_asset_test.go | 32 ++-- .../tickerdb_test/queries_issuer_test.go | 14 +- .../tickerdb_test/queries_market_test.go | 81 +++++----- .../tickerdb_test/queries_orderbook_test.go | 22 +-- .../tickerdb_test/queries_trade_test.go | 62 ++++---- .../tickerdb/tickerdbtest/tickerdbtest.go | 46 +++--- support/db/batch_insert_builder.go | 15 +- support/db/batch_insert_builder_test.go | 37 ++--- support/db/delete_builder.go | 5 +- support/db/delete_builder_test.go | 7 +- support/db/get_builder.go | 5 +- support/db/get_builder_test.go | 4 +- support/db/insert_builder.go | 5 +- support/db/insert_builder_test.go | 13 +- support/db/main.go | 37 ++--- support/db/main_test.go | 3 +- support/db/mock_session.go | 45 +++--- support/db/schema/main.go | 5 +- support/db/select_builder.go | 5 +- support/db/select_builder_test.go | 4 +- support/db/session.go | 107 ++++++------- support/db/session_test.go | 33 ++-- support/db/update_builder.go | 5 +- 233 files changed, 3071 insertions(+), 2678 deletions(-) diff --git a/exp/services/captivecore/internal/server_test.go b/exp/services/captivecore/internal/server_test.go index 1923767ee4..8339641e2b 100644 --- a/exp/services/captivecore/internal/server_test.go +++ b/exp/services/captivecore/internal/server_test.go @@ -1,6 +1,7 @@ package internal import ( + "context" "fmt" "io/ioutil" "net/http" @@ -35,6 +36,7 @@ func (s *ServerTestSuite) SetupTest() { s.server = httptest.NewServer(s.handler) var err error s.client, err = ledgerbackend.NewRemoteCaptive( + context.Background(), s.server.URL, ledgerbackend.PrepareRangePollInterval(time.Millisecond), ) diff --git a/exp/services/captivecore/main.go b/exp/services/captivecore/main.go index f5ec78447d..d0f2fdd425 100644 --- a/exp/services/captivecore/main.go +++ b/exp/services/captivecore/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "go/types" "strings" @@ -138,7 +139,7 @@ func main() { if err != nil { logger.WithError(err).Fatal("Could not create db connection instance") } - captiveConfig.LedgerHashStore = ledgerbackend.NewHorizonDBLedgerHashStore(dbConn) + captiveConfig.LedgerHashStore = ledgerbackend.NewHorizonDBLedgerHashStore(context.Background(), dbConn) } core, err := ledgerbackend.NewCaptive(captiveConfig) diff --git a/exp/tools/dump-ledger-state/main.go b/exp/tools/dump-ledger-state/main.go index 2fe9f35923..d3292ac1e1 100644 --- a/exp/tools/dump-ledger-state/main.go +++ b/exp/tools/dump-ledger-state/main.go @@ -78,7 +78,7 @@ func (processor csvProcessor) ProcessChange(change ingest.Change) error { if !ok { return nil } - if err := processor.changeStats.ProcessChange(change); err != nil { + if err := processor.changeStats.ProcessChange(context.Background(), change); err != nil { return err } diff --git a/handlers/federation/handler.go b/handlers/federation/handler.go index 97d1822d05..3a7bcfd11e 100644 --- a/handlers/federation/handler.go +++ b/handlers/federation/handler.go @@ -26,9 +26,9 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch typ { case "name": - h.lookupByName(w, q) + h.lookupByName(w, r, q) case "id": - h.lookupByID(w, q) + h.lookupByID(w, r, q) case "forward": h.lookupByForward(w, r.URL.Query()) case "txid": @@ -55,7 +55,7 @@ func (h *Handler) failNotImplemented(w http.ResponseWriter, msg string) { }, http.StatusNotImplemented) } -func (h *Handler) lookupByID(w http.ResponseWriter, q string) { +func (h *Handler) lookupByID(w http.ResponseWriter, r *http.Request, q string) { rd, ok := h.Driver.(ReverseDriver) if !ok { @@ -65,7 +65,7 @@ func (h *Handler) lookupByID(w http.ResponseWriter, q string) { // TODO: validate that `q` is a strkey encoded address - rec, err := rd.LookupReverseRecord(q) + rec, err := rd.LookupReverseRecord(r.Context(), q) if err != nil { h.writeError(w, errors.Wrap(err, "lookup record")) return @@ -81,7 +81,7 @@ func (h *Handler) lookupByID(w http.ResponseWriter, q string) { }, http.StatusOK) } -func (h *Handler) lookupByName(w http.ResponseWriter, q string) { +func (h *Handler) lookupByName(w http.ResponseWriter, r *http.Request, q string) { name, domain, err := address.Split(q) if err != nil { h.writeJSON(w, ErrorResponse{ @@ -91,7 +91,7 @@ func (h *Handler) lookupByName(w http.ResponseWriter, q string) { return } - rec, err := h.Driver.LookupRecord(name, domain) + rec, err := h.Driver.LookupRecord(r.Context(), name, domain) if err != nil { h.writeError(w, errors.Wrap(err, "lookupByName")) return diff --git a/handlers/federation/handler_test.go b/handlers/federation/handler_test.go index 114e4ec605..377831f75b 100644 --- a/handlers/federation/handler_test.go +++ b/handlers/federation/handler_test.go @@ -1,6 +1,7 @@ package federation import ( + "context" "net/http" "net/url" "testing" @@ -200,7 +201,7 @@ func (fd ForwardTestDriver) LookupForwardingRecord(query url.Values) (*Record, e } } -func (fd ForwardTestDriver) LookupRecord(name string, domain string) (*Record, error) { +func (fd ForwardTestDriver) LookupRecord(ctx context.Context, name string, domain string) (*Record, error) { return nil, nil } diff --git a/handlers/federation/main.go b/handlers/federation/main.go index ea120e65d6..00c192713a 100644 --- a/handlers/federation/main.go +++ b/handlers/federation/main.go @@ -11,6 +11,7 @@ package federation import ( + "context" "database/sql" "net/url" "sync" @@ -25,7 +26,7 @@ type Driver interface { // federation request to lookup a `Record` using the provided stellar address. // An implementation should return a nil `*Record` value if the lookup // successfully executed but no result was found. - LookupRecord(name string, domain string) (*Record, error) + LookupRecord(ctx context.Context, name, domain string) (*Record, error) } // ErrorResponse represents the JSON response sent to a client when the request @@ -65,7 +66,7 @@ type ReverseDriver interface { // federation request to lookup a `ReverseRecord` using the provided strkey // encoded accountID. An implementation should return a nil `*ReverseRecord` // value if the lookup successfully executed but no result was found. - LookupReverseRecord(accountID string) (*ReverseRecord, error) + LookupReverseRecord(ctx context.Context, accountID string) (*ReverseRecord, error) } // ForwardDriver represents a data source against which forward queries can diff --git a/handlers/federation/reverse_sql_driver.go b/handlers/federation/reverse_sql_driver.go index 6fdf09f4a4..62059d513f 100644 --- a/handlers/federation/reverse_sql_driver.go +++ b/handlers/federation/reverse_sql_driver.go @@ -1,16 +1,21 @@ package federation -import "github.com/stellar/go/support/errors" +import ( + "context" + + "github.com/stellar/go/support/errors" +) // LookupReverseRecord implements `ReverseDriver` by performing // `drv.LookupReverseRecordQuery` against `drv.DB` using the provided parameter func (drv *ReverseSQLDriver) LookupReverseRecord( + ctx context.Context, accountid string, ) (*ReverseRecord, error) { drv.initDB() var result ReverseRecord - err := drv.db.GetRaw(&result, drv.LookupReverseRecordQuery, accountid) + err := drv.db.GetRaw(ctx, &result, drv.LookupReverseRecordQuery, accountid) if drv.db.NoRows(err) { return nil, nil diff --git a/handlers/federation/sql_driver.go b/handlers/federation/sql_driver.go index 2ecd1ee22a..bab79bc62b 100644 --- a/handlers/federation/sql_driver.go +++ b/handlers/federation/sql_driver.go @@ -1,15 +1,19 @@ package federation -import "github.com/stellar/go/support/db" -import "github.com/stellar/go/support/errors" +import ( + "context" + + "github.com/stellar/go/support/db" + "github.com/stellar/go/support/errors" +) // LookupRecord implements `Driver` by performing `drv.LookupRecordQuery` // against `drv.DB` using the provided parameters -func (drv *SQLDriver) LookupRecord(name, domain string) (*Record, error) { +func (drv *SQLDriver) LookupRecord(ctx context.Context, name, domain string) (*Record, error) { drv.initDB() var result Record - err := drv.db.GetRaw(&result, drv.LookupRecordQuery, name, domain) + err := drv.db.GetRaw(ctx, &result, drv.LookupRecordQuery, name, domain) if drv.db.NoRows(err) { return nil, nil diff --git a/ingest/ledgerbackend/captive_core_backend.go b/ingest/ledgerbackend/captive_core_backend.go index 3730e01d1d..ea09b9aa3e 100644 --- a/ingest/ledgerbackend/captive_core_backend.go +++ b/ingest/ledgerbackend/captive_core_backend.go @@ -650,8 +650,15 @@ func (c *CaptiveStellarCore) Close() error { // after the CaptiveStellarCore context is canceled all subsequent calls to PrepareRange() will fail c.cancel() + // TODO: Sucks to ignore the error here, but no worse than it was before, + // so... + if c.ledgerHashStore != nil { + c.ledgerHashStore.Close() + } + if c.stellarCoreRunner != nil { return c.stellarCoreRunner.close() } + return nil } diff --git a/ingest/ledgerbackend/captive_core_backend_test.go b/ingest/ledgerbackend/captive_core_backend_test.go index 6fbf873ec9..29aeb9aa22 100644 --- a/ingest/ledgerbackend/captive_core_backend_test.go +++ b/ingest/ledgerbackend/captive_core_backend_test.go @@ -162,10 +162,11 @@ func TestCaptivePrepareRange(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(100), uint32(200)).Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -199,12 +200,13 @@ func TestCaptivePrepareRange(t *testing.T) { func TestCaptivePrepareRangeCrash(t *testing.T) { metaChan := make(chan metaResult) close(metaChan) + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(100), uint32(200)).Return(nil).Once() mockRunner.On("getProcessExitError").Return(true, errors.New("exit code -1")) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) mockRunner.On("close").Return(nil).Once() - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -239,10 +241,11 @@ func TestCaptivePrepareRangeTerminated(t *testing.T) { } } close(metaChan) + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(100), uint32(200)).Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -266,9 +269,10 @@ func TestCaptivePrepareRangeTerminated(t *testing.T) { } func TestCaptivePrepareRange_ErrClosingSession(t *testing.T) { + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("close").Return(fmt.Errorf("transient error")) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) captiveBackend := CaptiveStellarCore{ nextLedger: 300, @@ -336,10 +340,11 @@ func TestCaptivePrepareRange_ToIsAheadOfRootHAS(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(100), uint32(192)).Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -448,10 +453,11 @@ func TestCaptivePrepareRangeUnboundedRange_ReuseSession(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("runFrom", uint32(62), "0000000000000000000000000000000000000000000000000000000000000000").Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -494,10 +500,11 @@ func TestGetLatestLedgerSequence(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("runFrom", uint32(62), "0000000000000000000000000000000000000000000000000000000000000000").Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -540,7 +547,8 @@ func TestCaptiveGetLedger(t *testing.T) { } } - ctx, cancel := context.WithCancel(context.Background()) + ctx := context.Background() + ctx, cancel := context.WithCancel(ctx) mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(65), uint32(66)).Return(nil) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) @@ -685,10 +693,11 @@ func TestCaptiveGetLedger_NextLedgerIsDifferentToLedgerFromBuffer(t *testing.T) } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(65), uint32(66)).Return(nil) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockRunner.On("close").Return(nil) mockArchive := &historyarchive.MockArchive{} @@ -769,10 +778,11 @@ func TestCaptiveGetLedger_ErrReadingMetaResult(t *testing.T) { err: fmt.Errorf("unmarshalling error"), } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(65), uint32(66)).Return(nil) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(ctx) mockRunner.On("context").Return(ctx) mockRunner.On("getProcessExitError").Return(false, nil) mockRunner.On("close").Return(nil).Run(func(args mock.Arguments) { @@ -825,10 +835,11 @@ func TestCaptiveGetLedger_ErrClosingAfterLastLedger(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(65), uint32(66)).Return(nil) mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockRunner.On("close").Return(fmt.Errorf("transient error")).Once() mockArchive := &historyarchive.MockArchive{} @@ -920,10 +931,11 @@ func TestGetLedgerBoundsCheck(t *testing.T) { } } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(128), uint32(130)).Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockArchive := &historyarchive.MockArchive{} mockArchive. @@ -1021,10 +1033,11 @@ func TestCaptiveGetLedgerTerminatedUnexpectedly(t *testing.T) { } close(metaChan) + ctx := testCase.ctx mockRunner := &stellarCoreRunnerMock{} mockRunner.On("catchup", uint32(64), uint32(100)).Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockRunner.On("getProcessExitError").Return(testCase.processExited, testCase.processExitedError) mockRunner.On("close").Return(nil).Once() @@ -1082,10 +1095,14 @@ func TestCaptiveUseOfLedgerHashStore(t *testing.T) { mockLedgerHashStore.On("GetLedgerHash", uint32(2)). Return("mnb", true, nil).Once() + cancelCalled := false captiveBackend := CaptiveStellarCore{ archive: mockArchive, ledgerHashStore: mockLedgerHashStore, checkpointManager: historyarchive.NewCheckpointManager(64), + cancel: context.CancelFunc(func() { + cancelCalled = true + }), } runFrom, ledgerHash, nextLedger, err := captiveBackend.runFromParams(24) @@ -1115,6 +1132,10 @@ func TestCaptiveUseOfLedgerHashStore(t *testing.T) { assert.Equal(t, "0101010100000000000000000000000000000000000000000000000000000000", ledgerHash) assert.Equal(t, uint32(192), nextLedger, "nextLedger") + mockLedgerHashStore.On("Close").Return(nil).Once() + err = captiveBackend.Close() + assert.NoError(t, err) + assert.True(t, cancelCalled) mockLedgerHashStore.AssertExpectations(t) mockArchive.AssertExpectations(t) } @@ -1249,10 +1270,11 @@ func TestCaptivePreviousLedgerCheck(t *testing.T) { } + ctx := context.Background() mockRunner := &stellarCoreRunnerMock{} mockRunner.On("runFrom", uint32(254), "0101010100000000000000000000000000000000000000000000000000000000").Return(nil).Once() mockRunner.On("getMetaPipe").Return((<-chan metaResult)(metaChan)) - mockRunner.On("context").Return(context.Background()) + mockRunner.On("context").Return(ctx) mockRunner.On("close").Return(nil).Once() mockArchive := &historyarchive.MockArchive{} diff --git a/ingest/ledgerbackend/database_backend.go b/ingest/ledgerbackend/database_backend.go index 25bbfc8a6b..0cd19a79b0 100644 --- a/ingest/ledgerbackend/database_backend.go +++ b/ingest/ledgerbackend/database_backend.go @@ -1,6 +1,7 @@ package ledgerbackend import ( + "context" "database/sql" "sort" "time" @@ -26,21 +27,32 @@ var _ LedgerBackend = (*DatabaseBackend)(nil) // DatabaseBackend implements a database data store. type DatabaseBackend struct { + cancel context.CancelFunc + ctx context.Context networkPassphrase string session session } -func NewDatabaseBackend(dataSourceName, networkPassphrase string) (*DatabaseBackend, error) { +func NewDatabaseBackend(ctx context.Context, dataSourceName, networkPassphrase string) (*DatabaseBackend, error) { session, err := createSession(dataSourceName) if err != nil { return nil, err } - return &DatabaseBackend{session: session, networkPassphrase: networkPassphrase}, nil + return NewDatabaseBackendFromSession(ctx, session, networkPassphrase) } -func NewDatabaseBackendFromSession(session *db.Session, networkPassphrase string) (*DatabaseBackend, error) { - return &DatabaseBackend{session: session, networkPassphrase: networkPassphrase}, nil +func NewDatabaseBackendFromSession(ctx context.Context, session *db.Session, networkPassphrase string) (*DatabaseBackend, error) { + // TODO: To avoid changing the LedgerBackend interface in this call we create + // a context once for this, so that Close() can cancel any in-progress method-calls. + ctx, cancel := context.WithCancel(ctx) + + return &DatabaseBackend{ + cancel: cancel, + ctx: ctx, + session: session, + networkPassphrase: networkPassphrase, + }, nil } func (dbb *DatabaseBackend) PrepareRange(ledgerRange Range) error { @@ -75,7 +87,7 @@ func (*DatabaseBackend) IsPrepared(ledgerRange Range) (bool, error) { // GetLatestLedgerSequence returns the most recent ledger sequence number present in the database. func (dbb *DatabaseBackend) GetLatestLedgerSequence() (uint32, error) { var ledger []ledgerHeader - err := dbb.session.SelectRaw(&ledger, latestLedgerSeqQuery) + err := dbb.session.SelectRaw(dbb.ctx, &ledger, latestLedgerSeqQuery) if err != nil { return 0, errors.Wrap(err, "couldn't select ledger sequence") } @@ -147,7 +159,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - ledgerheader var lRow ledgerHeaderHistory - err := dbb.session.GetRaw(&lRow, ledgerHeaderQuery, sequence) + err := dbb.session.GetRaw(dbb.ctx, &lRow, ledgerHeaderQuery, sequence) // Return errors... if err != nil { switch err { @@ -168,7 +180,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - txhistory var txhRows []txHistory - err = dbb.session.SelectRaw(&txhRows, txHistoryQuery+orderBy, sequence) + err = dbb.session.SelectRaw(dbb.ctx, &txhRows, txHistoryQuery+orderBy, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting txHistory") @@ -194,7 +206,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - txfeehistory var txfhRows []txFeeHistory - err = dbb.session.SelectRaw(&txfhRows, txFeeHistoryQuery+orderBy, sequence) + err = dbb.session.SelectRaw(dbb.ctx, &txfhRows, txFeeHistoryQuery+orderBy, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting txFeeHistory") @@ -211,7 +223,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - upgradehistory var upgradeHistoryRows []upgradeHistory - err = dbb.session.SelectRaw(&upgradeHistoryRows, upgradeHistoryQuery, sequence) + err = dbb.session.SelectRaw(dbb.ctx, &upgradeHistoryRows, upgradeHistoryQuery, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting upgradeHistoryRows") @@ -240,5 +252,6 @@ func createSession(dataSourceName string) (*db.Session, error) { // Close disconnects an active database session. func (dbb *DatabaseBackend) Close() error { + dbb.cancel() return dbb.session.Close() } diff --git a/ingest/ledgerbackend/ledger_backend.go b/ingest/ledgerbackend/ledger_backend.go index 7a7c1eda81..2e2a7db1de 100644 --- a/ingest/ledgerbackend/ledger_backend.go +++ b/ingest/ledgerbackend/ledger_backend.go @@ -1,6 +1,8 @@ package ledgerbackend import ( + "context" + "github.com/stellar/go/xdr" ) @@ -25,8 +27,8 @@ type LedgerBackend interface { // session is the interface needed to access a persistent database session. // TODO can't use this until we add Close() to the existing db.Session object type session interface { - GetRaw(dest interface{}, query string, args ...interface{}) error - SelectRaw(dest interface{}, query string, args ...interface{}) error + GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error + SelectRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error Close() error } diff --git a/ingest/ledgerbackend/ledger_hash_store.go b/ingest/ledgerbackend/ledger_hash_store.go index 00fa4e224b..13cd3e4d6d 100644 --- a/ingest/ledgerbackend/ledger_hash_store.go +++ b/ingest/ledgerbackend/ledger_hash_store.go @@ -1,6 +1,8 @@ package ledgerbackend import ( + "context" + sq "github.com/Masterminds/squirrel" "github.com/stretchr/testify/mock" @@ -13,16 +15,24 @@ import ( type TrustedLedgerHashStore interface { // GetLedgerHash returns the ledger hash for the given sequence number GetLedgerHash(seq uint32) (string, bool, error) + Close() error } // HorizonDBLedgerHashStore is a TrustedLedgerHashStore which uses horizon's db to look up ledger hashes type HorizonDBLedgerHashStore struct { + cancel context.CancelFunc + ctx context.Context session *db.Session } // NewHorizonDBLedgerHashStore constructs a new TrustedLedgerHashStore backed by the horizon db -func NewHorizonDBLedgerHashStore(session *db.Session) TrustedLedgerHashStore { - return HorizonDBLedgerHashStore{session: session} +func NewHorizonDBLedgerHashStore(ctx context.Context, session *db.Session) TrustedLedgerHashStore { + ctx, cancel := context.WithCancel(ctx) + return HorizonDBLedgerHashStore{ + cancel: cancel, + ctx: ctx, + session: session, + } } // GetLedgerHash returns the ledger hash for the given sequence number @@ -31,13 +41,18 @@ func (h HorizonDBLedgerHashStore) GetLedgerHash(seq uint32) (string, bool, error Limit(1).Where("sequence = ?", seq) var hash string - err := h.session.Get(&hash, sql) + err := h.session.Get(h.ctx, &hash, sql) if h.session.NoRows(err) { return hash, false, nil } return hash, true, err } +func (h HorizonDBLedgerHashStore) Close() error { + h.cancel() + return h.session.Close() +} + // MockLedgerHashStore is a mock implementation of TrustedLedgerHashStore type MockLedgerHashStore struct { mock.Mock @@ -48,3 +63,8 @@ func (m *MockLedgerHashStore) GetLedgerHash(seq uint32) (string, bool, error) { args := m.Called(seq) return args.Get(0).(string), args.Get(1).(bool), args.Error(2) } + +func (m *MockLedgerHashStore) Close() error { + args := m.Called() + return args.Error(0) +} diff --git a/ingest/ledgerbackend/mock_database_backend.go b/ingest/ledgerbackend/mock_database_backend.go index b60c93bd67..67d9a367d7 100644 --- a/ingest/ledgerbackend/mock_database_backend.go +++ b/ingest/ledgerbackend/mock_database_backend.go @@ -1,8 +1,9 @@ package ledgerbackend import ( - "github.com/stellar/go/xdr" "github.com/stretchr/testify/mock" + + "github.com/stellar/go/xdr" ) var _ LedgerBackend = (*MockDatabaseBackend)(nil) diff --git a/ingest/ledgerbackend/remote_captive_core.go b/ingest/ledgerbackend/remote_captive_core.go index 49553ae92c..52332ac76e 100644 --- a/ingest/ledgerbackend/remote_captive_core.go +++ b/ingest/ledgerbackend/remote_captive_core.go @@ -67,6 +67,7 @@ type RemoteCaptiveStellarCore struct { client *http.Client lock *sync.Mutex cancel context.CancelFunc + parentCtx context.Context prepareRangePollInterval time.Duration } @@ -84,7 +85,7 @@ func PrepareRangePollInterval(d time.Duration) RemoteCaptiveOption { // NewRemoteCaptive returns a new RemoteCaptiveStellarCore instance. // // Only the captiveCoreURL parameter is required. -func NewRemoteCaptive(captiveCoreURL string, options ...RemoteCaptiveOption) (RemoteCaptiveStellarCore, error) { +func NewRemoteCaptive(ctx context.Context, captiveCoreURL string, options ...RemoteCaptiveOption) (RemoteCaptiveStellarCore, error) { u, err := url.Parse(captiveCoreURL) if err != nil { return RemoteCaptiveStellarCore{}, errors.Wrap(err, "unparseable url") @@ -95,6 +96,7 @@ func NewRemoteCaptive(captiveCoreURL string, options ...RemoteCaptiveOption) (Re url: u, client: &http.Client{Timeout: 5 * time.Second}, lock: &sync.Mutex{}, + parentCtx: ctx, } for _, option := range options { option(&client) @@ -128,6 +130,8 @@ func decodeResponse(response *http.Response, payload interface{}) error { // the latest sequence closed by the network. It's always the last value available // in the backend. func (c RemoteCaptiveStellarCore) GetLatestLedgerSequence() (sequence uint32, err error) { + // TODO: Have a context on this request so we can cancel all outstanding + // requests, not just PrepareRange. u := *c.url u.Path = path.Join(u.Path, "latest-sequence") @@ -158,11 +162,13 @@ func (c RemoteCaptiveStellarCore) createContext() context.Context { c.lock.Lock() defer c.lock.Unlock() + // Cancel any outstanding PrepareRange request if c.cancel != nil { c.cancel() } - ctx, cancel := context.WithCancel(context.Background()) + // Make a new context for this new request. + ctx, cancel := context.WithCancel(c.parentCtx) c.cancel = cancel return ctx } @@ -220,6 +226,8 @@ func (c RemoteCaptiveStellarCore) PrepareRange(ledgerRange Range) error { // IsPrepared returns true if a given ledgerRange is prepared. func (c RemoteCaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { + // TODO: Have a context on this request so we can cancel all outstanding + // requests, not just PrepareRange. u := *c.url u.Path = path.Join(u.Path, "prepare-range") rangeBytes, err := json.Marshal(ledgerRange) @@ -260,6 +268,8 @@ func (c RemoteCaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { // the first argument equal false. // This is done to provide maximum performance when streaming old ledgers. func (c RemoteCaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { + // TODO: Have a context on this request so we can cancel all outstanding + // requests, not just PrepareRange. u := *c.url u.Path = path.Join(u.Path, "ledger", strconv.FormatUint(uint64(sequence), 10)) diff --git a/ingest/stats_change_processor.go b/ingest/stats_change_processor.go index 929922126d..4dd744a95a 100644 --- a/ingest/stats_change_processor.go +++ b/ingest/stats_change_processor.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "github.com/stellar/go/xdr" ) @@ -33,7 +34,7 @@ type StatsChangeProcessorResults struct { TrustLinesRemoved int64 } -func (p *StatsChangeProcessor) ProcessChange(change Change) error { +func (p *StatsChangeProcessor) ProcessChange(ctx context.Context, change Change) error { switch change.Type { case xdr.LedgerEntryTypeAccount: switch change.LedgerEntryChangeType() { diff --git a/ingest/stats_change_processor_test.go b/ingest/stats_change_processor_test.go index a17a74de62..d39ac092e0 100644 --- a/ingest/stats_change_processor_test.go +++ b/ingest/stats_change_processor_test.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "testing" "github.com/stellar/go/xdr" @@ -8,96 +9,97 @@ import ( ) func TestStatsChangeProcessor(t *testing.T) { + ctx := context.Background() processor := &StatsChangeProcessor{} // Created - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeData, Pre: nil, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeOffer, Pre: nil, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{}, })) // Updated - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{}, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &xdr.LedgerEntry{}, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeData, Pre: &xdr.LedgerEntry{}, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{}, Post: &xdr.LedgerEntry{}, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{}, Post: &xdr.LedgerEntry{}, })) // Removed - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{}, Post: nil, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &xdr.LedgerEntry{}, Post: nil, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeData, Pre: &xdr.LedgerEntry{}, Post: nil, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{}, Post: nil, })) - assert.NoError(t, processor.ProcessChange(Change{ + assert.NoError(t, processor.ProcessChange(ctx, Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{}, Post: nil, diff --git a/services/horizon/cmd/db.go b/services/horizon/cmd/db.go index 640a94e742..67323cd3f0 100644 --- a/services/horizon/cmd/db.go +++ b/services/horizon/cmd/db.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "database/sql" "fmt" "go/types" @@ -113,8 +114,9 @@ var dbReapCmd = &cobra.Command{ Long: "reap removes any historical data that is earlier than the configured retention cutoff", Run: func(cmd *cobra.Command, args []string) { app := horizon.NewAppFromFlags(config, flags) - app.UpdateLedgerState() - err := app.DeleteUnretainedHistory() + ctx := context.Background() + app.UpdateLedgerState(ctx) + err := app.DeleteUnretainedHistory(ctx) if err != nil { log.Fatal(err) } diff --git a/services/horizon/cmd/ingest.go b/services/horizon/cmd/ingest.go index 1063941463..d66aad2676 100644 --- a/services/horizon/cmd/ingest.go +++ b/services/horizon/cmd/ingest.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "fmt" "go/types" "net/http" @@ -227,6 +228,7 @@ var ingestTriggerStateRebuildCmd = &cobra.Command{ Use: "trigger-state-rebuild", Short: "updates a database to trigger state rebuild, state will be rebuilt by a running Horizon instance, DO NOT RUN production DB, some endpoints will be unavailable until state is rebuilt", Run: func(cmd *cobra.Command, args []string) { + ctx := context.Background() horizon.ApplyFlags(config, flags) horizonSession, err := db.Open("postgres", config.DatabaseURL) @@ -235,7 +237,7 @@ var ingestTriggerStateRebuildCmd = &cobra.Command{ } historyQ := &history.Q{horizonSession} - err = historyQ.UpdateIngestVersion(0) + err = historyQ.UpdateIngestVersion(ctx, 0) if err != nil { log.Fatalf("cannot trigger state rebuild: %v", err) } @@ -248,6 +250,7 @@ var ingestInitGenesisStateCmd = &cobra.Command{ Use: "init-genesis-state", Short: "ingests genesis state (ledger 1)", Run: func(cmd *cobra.Command, args []string) { + ctx := context.Background() horizon.ApplyFlags(config, flags) horizonSession, err := db.Open("postgres", config.DatabaseURL) @@ -257,7 +260,7 @@ var ingestInitGenesisStateCmd = &cobra.Command{ historyQ := &history.Q{horizonSession} - lastIngestedLedger, err := historyQ.GetLastLedgerIngestNonBlocking() + lastIngestedLedger, err := historyQ.GetLastLedgerIngestNonBlocking(ctx) if err != nil { log.Fatalf("cannot get last ledger value: %v", err) } diff --git a/services/horizon/internal/action_offers_test.go b/services/horizon/internal/action_offers_test.go index b354e71ad1..737afe2fac 100644 --- a/services/horizon/internal/action_offers_test.go +++ b/services/horizon/internal/action_offers_test.go @@ -1,6 +1,7 @@ package horizon import ( + "context" "encoding/json" "testing" "time" @@ -15,14 +16,15 @@ func TestOfferActions_Show(t *testing.T) { ht := StartHTTPTestWithoutScenario(t) defer ht.Finish() q := &history.Q{ht.HorizonSession()} + ctx := context.Background() - err := q.UpdateLastLedgerIngest(100) + err := q.UpdateLastLedgerIngest(ctx, 100) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ctx, ingest.CurrentVersion) ht.Assert.NoError(err) ledgerCloseTime := time.Now().Unix() - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err = q.InsertLedger(ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 100, ScpValue: xdr.StellarValue{ @@ -67,11 +69,11 @@ func TestOfferActions_Show(t *testing.T) { } batch := q.NewOffersBatchInsertBuilder(3) - err = batch.Add(eurOffer) + err = batch.Add(ctx, eurOffer) ht.Assert.NoError(err) - err = batch.Add(usdOffer) + err = batch.Add(ctx, usdOffer) ht.Assert.NoError(err) - ht.Assert.NoError(batch.Exec()) + ht.Assert.NoError(batch.Exec(ctx)) w := ht.Get("/offers") if ht.Assert.Equal(200, w.Code) { diff --git a/services/horizon/internal/actions/account.go b/services/horizon/internal/actions/account.go index 3555c6619a..a6d4278fc6 100644 --- a/services/horizon/internal/actions/account.go +++ b/services/horizon/internal/actions/account.go @@ -26,27 +26,27 @@ func AccountInfo(ctx context.Context, hq *history.Q, addr string) (*protocol.Acc resouce protocol.Account ) - record, err := hq.GetAccountByID(addr) + record, err := hq.GetAccountByID(ctx, addr) if err != nil { return nil, errors.Wrap(err, "getting history account record") } - data, err = hq.GetAccountDataByAccountID(addr) + data, err = hq.GetAccountDataByAccountID(ctx, addr) if err != nil { return nil, errors.Wrap(err, "getting history account data") } - signers, err = hq.GetAccountSignersByAccountID(addr) + signers, err = hq.GetAccountSignersByAccountID(ctx, addr) if err != nil { return nil, errors.Wrap(err, "getting history signers") } - trustlines, err = hq.GetSortedTrustLinesByAccountID(addr) + trustlines, err = hq.GetSortedTrustLinesByAccountID(ctx, addr) if err != nil { return nil, errors.Wrap(err, "getting history trustlines") } - ledger, err := getLedgerBySequence(hq, int32(record.LastModifiedLedger)) + ledger, err := getLedgerBySequence(ctx, hq, int32(record.LastModifiedLedger)) if err != nil { return nil, err } @@ -149,17 +149,17 @@ func (handler GetAccountsHandler) GetResourcePage( var records []history.AccountEntry if len(qp.Sponsor) > 0 { - records, err = historyQ.AccountsForSponsor(qp.Sponsor, pq) + records, err = historyQ.AccountsForSponsor(ctx, qp.Sponsor, pq) if err != nil { return nil, errors.Wrap(err, "loading account records") } } else if len(qp.Signer) > 0 { - records, err = historyQ.AccountEntriesForSigner(qp.Signer, pq) + records, err = historyQ.AccountEntriesForSigner(ctx, qp.Signer, pq) if err != nil { return nil, errors.Wrap(err, "loading account records") } } else { - records, err = historyQ.AccountsForAsset(*qp.Asset(), pq) + records, err = historyQ.AccountsForAsset(ctx, *qp.Asset(), pq) if err != nil { return nil, errors.Wrap(err, "loading account records") } @@ -177,17 +177,17 @@ func (handler GetAccountsHandler) GetResourcePage( accountIDs = append(accountIDs, record.AccountID) } - signers, err := handler.loadSigners(historyQ, accountIDs) + signers, err := handler.loadSigners(ctx, historyQ, accountIDs) if err != nil { return nil, err } - trustlines, err := handler.loadTrustlines(historyQ, accountIDs) + trustlines, err := handler.loadTrustlines(ctx, historyQ, accountIDs) if err != nil { return nil, err } - data, err := handler.loadData(historyQ, accountIDs) + data, err := handler.loadData(ctx, historyQ, accountIDs) if err != nil { return nil, err } @@ -197,7 +197,7 @@ func (handler GetAccountsHandler) GetResourcePage( ledgerCache.Queue(int32(record.LastModifiedLedger)) } - if err := ledgerCache.Load(historyQ); err != nil { + if err := ledgerCache.Load(ctx, historyQ); err != nil { return nil, errors.Wrap(err, "failed to load ledger batch") } @@ -218,10 +218,10 @@ func (handler GetAccountsHandler) GetResourcePage( return accounts, nil } -func (handler GetAccountsHandler) loadData(historyQ *history.Q, accounts []string) (map[string][]history.Data, error) { +func (handler GetAccountsHandler) loadData(ctx context.Context, historyQ *history.Q, accounts []string) (map[string][]history.Data, error) { data := make(map[string][]history.Data) - records, err := historyQ.GetAccountDataByAccountsID(accounts) + records, err := historyQ.GetAccountDataByAccountsID(ctx, accounts) if err != nil { return data, errors.Wrap(err, "loading account data records by accounts id") } @@ -233,10 +233,10 @@ func (handler GetAccountsHandler) loadData(historyQ *history.Q, accounts []strin return data, nil } -func (handler GetAccountsHandler) loadTrustlines(historyQ *history.Q, accounts []string) (map[string][]history.TrustLine, error) { +func (handler GetAccountsHandler) loadTrustlines(ctx context.Context, historyQ *history.Q, accounts []string) (map[string][]history.TrustLine, error) { trustLines := make(map[string][]history.TrustLine) - records, err := historyQ.GetSortedTrustLinesByAccountIDs(accounts) + records, err := historyQ.GetSortedTrustLinesByAccountIDs(ctx, accounts) if err != nil { return trustLines, errors.Wrap(err, "loading trustline records by accounts") } @@ -248,10 +248,10 @@ func (handler GetAccountsHandler) loadTrustlines(historyQ *history.Q, accounts [ return trustLines, nil } -func (handler GetAccountsHandler) loadSigners(historyQ *history.Q, accounts []string) (map[string][]history.AccountSigner, error) { +func (handler GetAccountsHandler) loadSigners(ctx context.Context, historyQ *history.Q, accounts []string) (map[string][]history.AccountSigner, error) { signers := make(map[string][]history.AccountSigner) - records, err := historyQ.SignersForAccounts(accounts) + records, err := historyQ.SignersForAccounts(ctx, accounts) if err != nil { return signers, errors.Wrap(err, "loading account signers by account") } @@ -263,9 +263,9 @@ func (handler GetAccountsHandler) loadSigners(historyQ *history.Q, accounts []st return signers, nil } -func getLedgerBySequence(hq *history.Q, sequence int32) (*history.Ledger, error) { +func getLedgerBySequence(ctx context.Context, hq *history.Q, sequence int32) (*history.Ledger, error) { ledger := &history.Ledger{} - err := hq.LedgerBySequence(ledger, sequence) + err := hq.LedgerBySequence(ctx, ledger, sequence) switch { case hq.NoRows(err): return nil, nil diff --git a/services/horizon/internal/actions/account_data.go b/services/horizon/internal/actions/account_data.go index f0a3224e35..9b3e7e499c 100644 --- a/services/horizon/internal/actions/account_data.go +++ b/services/horizon/internal/actions/account_data.go @@ -60,7 +60,7 @@ func loadAccountData(r *http.Request) (history.Data, error) { if err != nil { return history.Data{}, err } - data, err := historyQ.GetAccountDataByName(qp.AccountID, qp.Key) + data, err := historyQ.GetAccountDataByName(r.Context(), qp.AccountID, qp.Key) if err != nil { return history.Data{}, err } diff --git a/services/horizon/internal/actions/account_test.go b/services/horizon/internal/actions/account_test.go index a192d8ce0f..7695394a72 100644 --- a/services/horizon/internal/actions/account_test.go +++ b/services/horizon/internal/actions/account_test.go @@ -240,13 +240,13 @@ func TestAccountInfo(t *testing.T) { }, } batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(accountEntry) + err := batch.Add(tt.Ctx, accountEntry) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(xdr.LedgerEntry{ + _, err = q.InsertTrustLine(tt.Ctx, xdr.LedgerEntry{ LastModifiedLedgerSeq: 6, Data: xdr.LedgerEntryData{ Type: xdr.LedgerEntryTypeTrustline, @@ -264,7 +264,7 @@ func TestAccountInfo(t *testing.T) { }) assert.NoError(t, err) - _, err = q.InsertTrustLine(xdr.LedgerEntry{ + _, err = q.InsertTrustLine(tt.Ctx, xdr.LedgerEntry{ LastModifiedLedgerSeq: 1234, Data: xdr.LedgerEntryData{ Type: xdr.LedgerEntryTypeTrustline, @@ -283,7 +283,7 @@ func TestAccountInfo(t *testing.T) { assert.NoError(t, err) ledgerFourCloseTime := time.Now().Unix() - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err = q.InsertLedger(tt.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 4, ScpValue: xdr.StellarValue{ @@ -355,16 +355,16 @@ func TestGetAccountsHandlerPageResultsBySigner(t *testing.T) { handler := &GetAccountsHandler{} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - err = batch.Add(account3) + err = batch.Add(tt.Ctx, account3) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) for _, row := range accountSigners { - q.CreateAccountSigner(row.Account, row.Signer, row.Weight, nil) + q.CreateAccountSigner(tt.Ctx, row.Account, row.Signer, row.Weight, nil) } records, err := handler.GetResourcePage( @@ -435,16 +435,16 @@ func TestGetAccountsHandlerPageResultsBySponsor(t *testing.T) { handler := &GetAccountsHandler{} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - err = batch.Add(account3) + err = batch.Add(tt.Ctx, account3) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) for _, row := range accountSigners { - q.CreateAccountSigner(row.Account, row.Signer, row.Weight, nil) + q.CreateAccountSigner(tt.Ctx, row.Account, row.Signer, row.Weight, nil) } records, err := handler.GetResourcePage( @@ -473,13 +473,13 @@ func TestGetAccountsHandlerPageResultsByAsset(t *testing.T) { handler := &GetAccountsHandler{} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) ledgerCloseTime := time.Now().Unix() - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err = q.InsertLedger(tt.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 1234, ScpValue: xdr.StellarValue{ @@ -490,13 +490,13 @@ func TestGetAccountsHandlerPageResultsByAsset(t *testing.T) { assert.NoError(t, err) for _, row := range accountSigners { - _, err = q.CreateAccountSigner(row.Account, row.Signer, row.Weight, nil) + _, err = q.CreateAccountSigner(tt.Ctx, row.Account, row.Signer, row.Weight, nil) tt.Assert.NoError(err) } - _, err = q.InsertAccountData(data1) + _, err = q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) - _, err = q.InsertAccountData(data2) + _, err = q.InsertAccountData(tt.Ctx, data2) assert.NoError(t, err) var assetType, code, issuer string @@ -518,9 +518,9 @@ func TestGetAccountsHandlerPageResultsByAsset(t *testing.T) { tt.Assert.NoError(err) tt.Assert.Equal(0, len(records)) - _, err = q.InsertTrustLine(eurTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, eurTrustLine) assert.NoError(t, err) - _, err = q.InsertTrustLine(usdTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) assert.NoError(t, err) records, err = handler.GetResourcePage( diff --git a/services/horizon/internal/actions/asset.go b/services/horizon/internal/actions/asset.go index 8b014dc1d1..86dee222e3 100644 --- a/services/horizon/internal/actions/asset.go +++ b/services/horizon/internal/actions/asset.go @@ -1,12 +1,13 @@ package actions import ( + "context" "fmt" "net/http" "strings" "github.com/stellar/go/protocols/horizon" - "github.com/stellar/go/services/horizon/internal/context" + horizonContext "github.com/stellar/go/services/horizon/internal/context" "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/ledger" @@ -78,6 +79,7 @@ func (handler AssetStatsHandler) validateAssetParams(code, issuer string, pq db2 } func (handler AssetStatsHandler) findIssuersForAssets( + ctx context.Context, historyQ *history.Q, assetStats []history.ExpAssetStat, ) (map[string]history.AccountEntry, error) { @@ -92,7 +94,7 @@ func (handler AssetStatsHandler) findIssuersForAssets( } accountsByID := map[string]history.AccountEntry{} - accounts, err := historyQ.GetAccountsByIDs(issuers) + accounts, err := historyQ.GetAccountsByIDs(ctx, issuers) if err != nil { return nil, err } @@ -134,17 +136,17 @@ func (handler AssetStatsHandler) GetResourcePage( return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } - assetStats, err := historyQ.GetAssetStats(code, issuer, pq) + assetStats, err := historyQ.GetAssetStats(ctx, code, issuer, pq) if err != nil { return nil, err } - issuerAccounts, err := handler.findIssuersForAssets(historyQ, assetStats) + issuerAccounts, err := handler.findIssuersForAssets(ctx, historyQ, assetStats) if err != nil { return nil, err } diff --git a/services/horizon/internal/actions/asset_test.go b/services/horizon/internal/actions/asset_test.go index c8416a5292..12969da2b5 100644 --- a/services/horizon/internal/actions/asset_test.go +++ b/services/horizon/internal/actions/asset_test.go @@ -303,7 +303,7 @@ func TestAssetStats(t *testing.T) { otherUSDAssetStat, usdAssetStat, } { - numChanged, err := q.InsertAssetStat(assetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) } @@ -326,9 +326,9 @@ func TestAssetStats(t *testing.T) { t.Fatalf("unexpected error %v", err) } batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(accountEntry) + err := batch.Add(tt.Ctx, accountEntry) tt.Assert.NoError(err) - tt.Assert.NoError(batch.Exec()) + tt.Assert.NoError(batch.Exec(tt.Ctx)) } for _, testCase := range []struct { @@ -446,7 +446,7 @@ func TestAssetStatsIssuerDoesNotExist(t *testing.T) { Amount: "1", NumAccounts: 2, } - numChanged, err := q.InsertAssetStat(usdAssetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, usdAssetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) diff --git a/services/horizon/internal/actions/claimable_balance.go b/services/horizon/internal/actions/claimable_balance.go index 9e6bbea6e2..c5953d13a9 100644 --- a/services/horizon/internal/actions/claimable_balance.go +++ b/services/horizon/internal/actions/claimable_balance.go @@ -64,12 +64,12 @@ func (handler GetClaimableBalanceByIDHandler) GetResource(w HeaderWriter, r *htt if err != nil { return nil, err } - cb, err := historyQ.FindClaimableBalanceByID(balanceID) + cb, err := historyQ.FindClaimableBalanceByID(ctx, balanceID) if err != nil { return nil, err } ledger := &history.Ledger{} - err = historyQ.LedgerBySequence( + err = historyQ.LedgerBySequence(ctx, ledger, int32(cb.LastModifiedLedger), ) @@ -179,7 +179,7 @@ func (handler GetClaimableBalancesHandler) GetResourcePage( } func getClaimableBalancesPage(ctx context.Context, historyQ *history.Q, query history.ClaimableBalancesQuery) ([]hal.Pageable, error) { - records, err := historyQ.GetClaimableBalances(query) + records, err := historyQ.GetClaimableBalances(ctx, query) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func getClaimableBalancesPage(ctx context.Context, historyQ *history.Q, query hi for _, record := range records { ledgerCache.Queue(int32(record.LastModifiedLedger)) } - if err := ledgerCache.Load(historyQ); err != nil { + if err := ledgerCache.Load(ctx, historyQ); err != nil { return nil, errors.Wrap(err, "failed to load ledger batch") } diff --git a/services/horizon/internal/actions/claimable_balance_test.go b/services/horizon/internal/actions/claimable_balance_test.go index d50f27ac53..5cc3ea466b 100644 --- a/services/horizon/internal/actions/claimable_balance_test.go +++ b/services/horizon/internal/actions/claimable_balance_test.go @@ -52,10 +52,10 @@ func TestGetClaimableBalanceByID(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) tt.Assert.NoError(err) @@ -200,11 +200,11 @@ func TestGetClaimableBalances(t *testing.T) { for _, e := range entriesMeta { entry := buildClaimableBalance(e.id, e.accountID, e.ledger, e.asset) entries = append(entries, entry) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) } - err := builder.Exec() + err := builder.Exec(tt.Ctx) tt.Assert.NoError(err) handler := GetClaimableBalancesHandler{} @@ -293,7 +293,7 @@ func TestGetClaimableBalances(t *testing.T) { SponsoringId: xdr.MustAddressPtr("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), } entryToBeUpdated.LastModifiedLedgerSeq = xdr.Uint32(1238) - q.UpdateClaimableBalance(entryToBeUpdated) + q.UpdateClaimableBalance(tt.Ctx, entryToBeUpdated) entriesMeta = []struct { id xdr.Hash @@ -319,10 +319,10 @@ func TestGetClaimableBalances(t *testing.T) { for _, e := range entriesMeta { entry := buildClaimableBalance(e.id, e.accountID, e.ledger, e.asset) entries = append(entries, entry) - tt.Assert.NoError(builder.Add(&entry)) + tt.Assert.NoError(builder.Add(tt.Ctx, &entry)) } - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) response, err = handler.GetResourcePage(httptest.NewRecorder(), makeRequest( diff --git a/services/horizon/internal/actions/effects.go b/services/horizon/internal/actions/effects.go index aaa0d502f3..4625583f64 100644 --- a/services/horizon/internal/actions/effects.go +++ b/services/horizon/internal/actions/effects.go @@ -1,9 +1,10 @@ package actions import ( + "context" "net/http" - "github.com/stellar/go/services/horizon/internal/context" + horizonContext "github.com/stellar/go/services/horizon/internal/context" "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/ledger" @@ -64,17 +65,17 @@ func (handler GetEffectsHandler) GetResourcePage(w HeaderWriter, r *http.Request return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } - records, err := loadEffectRecords(historyQ, qp.AccountID, int64(qp.OperationID), qp.TxHash, qp.LedgerID, pq) + records, err := loadEffectRecords(r.Context(), historyQ, qp.AccountID, int64(qp.OperationID), qp.TxHash, qp.LedgerID, pq) if err != nil { return nil, errors.Wrap(err, "loading transaction records") } - ledgers, err := loadEffectLedgers(historyQ, records) + ledgers, err := loadEffectLedgers(r.Context(), historyQ, records) if err != nil { return nil, errors.Wrap(err, "loading ledgers") } @@ -91,35 +92,35 @@ func (handler GetEffectsHandler) GetResourcePage(w HeaderWriter, r *http.Request return result, nil } -func loadEffectRecords(hq *history.Q, accountID string, operationID int64, transactionHash string, ledgerID uint32, +func loadEffectRecords(ctx context.Context, hq *history.Q, accountID string, operationID int64, transactionHash string, ledgerID uint32, pq db2.PageQuery) ([]history.Effect, error) { effects := hq.Effects() switch { case accountID != "": - effects.ForAccount(accountID) + effects.ForAccount(ctx, accountID) case ledgerID > 0: - effects.ForLedger(int32(ledgerID)) + effects.ForLedger(ctx, int32(ledgerID)) case operationID > 0: effects.ForOperation(operationID) case transactionHash != "": - effects.ForTransaction(transactionHash) + effects.ForTransaction(ctx, transactionHash) } var result []history.Effect - err := effects.Page(pq).Select(&result) + err := effects.Page(pq).Select(ctx, &result) return result, err } -func loadEffectLedgers(hq *history.Q, effects []history.Effect) (map[int32]history.Ledger, error) { +func loadEffectLedgers(ctx context.Context, hq *history.Q, effects []history.Effect) (map[int32]history.Ledger, error) { ledgers := &history.LedgerCache{} for _, e := range effects { ledgers.Queue(e.LedgerSequence()) } - if err := ledgers.Load(hq); err != nil { + if err := ledgers.Load(ctx, hq); err != nil { return nil, err } return ledgers.Records, nil diff --git a/services/horizon/internal/actions/ledger.go b/services/horizon/internal/actions/ledger.go index db1ead097d..37fddb5bd9 100644 --- a/services/horizon/internal/actions/ledger.go +++ b/services/horizon/internal/actions/ledger.go @@ -33,7 +33,7 @@ func (handler GetLedgersHandler) GetResourcePage(w HeaderWriter, r *http.Request } var records []history.Ledger - if err = historyQ.Ledgers().Page(pq).Select(&records); err != nil { + if err = historyQ.Ledgers().Page(pq).Select(r.Context(), &records); err != nil { return nil, err } @@ -73,7 +73,7 @@ func (handler GetLedgerByIDHandler) GetResource(w HeaderWriter, r *http.Request) return nil, err } var ledger history.Ledger - err = historyQ.LedgerBySequence(&ledger, int32(qp.LedgerID)) + err = historyQ.LedgerBySequence(r.Context(), &ledger, int32(qp.LedgerID)) if err != nil { return nil, err } diff --git a/services/horizon/internal/actions/offer.go b/services/horizon/internal/actions/offer.go index a8456dda2e..c5de593c4b 100644 --- a/services/horizon/internal/actions/offer.go +++ b/services/horizon/internal/actions/offer.go @@ -35,13 +35,14 @@ func (handler GetOfferByID) GetResource(w HeaderWriter, r *http.Request) (interf return nil, err } - record, err := historyQ.GetOfferByID(int64(qp.OfferID)) + record, err := historyQ.GetOfferByID(r.Context(), int64(qp.OfferID)) if err != nil { return nil, err } ledger := &history.Ledger{} err = historyQ.LedgerBySequence( + r.Context(), ledger, int32(record.LastModifiedLedger), ) @@ -181,7 +182,7 @@ func (handler GetAccountOffersHandler) GetResourcePage( } func getOffersPage(ctx context.Context, historyQ *history.Q, query history.OffersQuery) ([]hal.Pageable, error) { - records, err := historyQ.GetOffers(query) + records, err := historyQ.GetOffers(ctx, query) if err != nil { return nil, err } @@ -191,7 +192,7 @@ func getOffersPage(ctx context.Context, historyQ *history.Q, query history.Offer ledgerCache.Queue(int32(record.LastModifiedLedger)) } - if err := ledgerCache.Load(historyQ); err != nil { + if err := ledgerCache.Load(ctx, historyQ); err != nil { return nil, errors.Wrap(err, "failed to load ledger batch") } diff --git a/services/horizon/internal/actions/offer_test.go b/services/horizon/internal/actions/offer_test.go index 19bff5c350..11c5f63f5b 100644 --- a/services/horizon/internal/actions/offer_test.go +++ b/services/horizon/internal/actions/offer_test.go @@ -79,7 +79,7 @@ func TestGetOfferByIDHandler(t *testing.T) { handler := GetOfferByID{} ledgerCloseTime := time.Now().Unix() - _, err := q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err := q.InsertLedger(tt.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 3, ScpValue: xdr.StellarValue{ @@ -90,11 +90,11 @@ func TestGetOfferByIDHandler(t *testing.T) { tt.Assert.NoError(err) batch := q.NewOffersBatchInsertBuilder(0) - err = batch.Add(eurOffer) + err = batch.Add(tt.Ctx, eurOffer) tt.Assert.NoError(err) - err = batch.Add(usdOffer) + err = batch.Add(tt.Ctx, usdOffer) tt.Assert.NoError(err) - tt.Assert.NoError(batch.Exec()) + tt.Assert.NoError(batch.Exec(tt.Ctx)) for _, testCase := range []struct { name string @@ -190,7 +190,7 @@ func TestGetOffersHandler(t *testing.T) { handler := GetOffersHandler{} ledgerCloseTime := time.Now().Unix() - _, err := q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err := q.InsertLedger(tt.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 3, ScpValue: xdr.StellarValue{ @@ -201,13 +201,13 @@ func TestGetOffersHandler(t *testing.T) { tt.Assert.NoError(err) batch := q.NewOffersBatchInsertBuilder(0) - err = batch.Add(eurOffer) + err = batch.Add(tt.Ctx, eurOffer) tt.Assert.NoError(err) - err = batch.Add(twoEurOffer) + err = batch.Add(tt.Ctx, twoEurOffer) tt.Assert.NoError(err) - err = batch.Add(usdOffer) + err = batch.Add(tt.Ctx, usdOffer) tt.Assert.NoError(err) - tt.Assert.NoError(batch.Exec()) + tt.Assert.NoError(batch.Exec(tt.Ctx)) t.Run("No filter", func(t *testing.T) { records, err := handler.GetResourcePage( @@ -478,12 +478,12 @@ func TestGetAccountOffersHandler(t *testing.T) { handler := GetAccountOffersHandler{} batch := q.NewOffersBatchInsertBuilder(0) - err := batch.Add(eurOffer) - err = batch.Add(twoEurOffer) + err := batch.Add(tt.Ctx, eurOffer) + err = batch.Add(tt.Ctx, twoEurOffer) tt.Assert.NoError(err) - err = batch.Add(usdOffer) + err = batch.Add(tt.Ctx, usdOffer) tt.Assert.NoError(err) - tt.Assert.NoError(batch.Exec()) + tt.Assert.NoError(batch.Exec(tt.Ctx)) records, err := handler.GetResourcePage( httptest.NewRecorder(), diff --git a/services/horizon/internal/actions/operation.go b/services/horizon/internal/actions/operation.go index 8bc16dc5de..505ebd08d8 100644 --- a/services/horizon/internal/actions/operation.go +++ b/services/horizon/internal/actions/operation.go @@ -94,17 +94,17 @@ func (handler GetOperationsHandler) GetResourcePage(w HeaderWriter, r *http.Requ switch { case qp.AccountID != "": - query.ForAccount(qp.AccountID) + query.ForAccount(ctx, qp.AccountID) case qp.ClaimableBalanceID != "": cbID, parseErr := balanceIDHex2XDR(qp.ClaimableBalanceID, "claimable_balance_id") if parseErr != nil { return nil, parseErr } - query.ForClaimableBalance(cbID) + query.ForClaimableBalance(ctx, cbID) case qp.LedgerID > 0: - query.ForLedger(int32(qp.LedgerID)) + query.ForLedger(ctx, int32(qp.LedgerID)) case qp.TransactionHash != "": - query.ForTransaction(qp.TransactionHash) + query.ForTransaction(ctx, qp.TransactionHash) } // When querying operations for transaction return both successful // and failed operations. We assume that because the user is querying @@ -121,7 +121,7 @@ func (handler GetOperationsHandler) GetResourcePage(w HeaderWriter, r *http.Requ query.OnlyPayments() } - ops, txs, err := query.Page(pq).Fetch() + ops, txs, err := query.Page(pq).Fetch(ctx) if err != nil { return nil, err } @@ -165,13 +165,13 @@ func (handler GetOperationByIDHandler) GetResource(w HeaderWriter, r *http.Reque if err != nil { return nil, err } - op, tx, err := historyQ.OperationByID(qp.IncludeTransactions(), int64(qp.ID)) + op, tx, err := historyQ.OperationByID(ctx, qp.IncludeTransactions(), int64(qp.ID)) if err != nil { return nil, err } var ledger history.Ledger - err = historyQ.LedgerBySequence(&ledger, op.LedgerSequence()) + err = historyQ.LedgerBySequence(ctx, &ledger, op.LedgerSequence()) if err != nil { return nil, err } @@ -191,7 +191,7 @@ func buildOperationsPage(ctx context.Context, historyQ *history.Q, operations [] ledgerCache.Queue(record.LedgerSequence()) } - if err := ledgerCache.Load(historyQ); err != nil { + if err := ledgerCache.Load(ctx, historyQ); err != nil { return nil, errors.Wrap(err, "failed to load ledger batch") } diff --git a/services/horizon/internal/actions/operation_test.go b/services/horizon/internal/actions/operation_test.go index 555236a475..7af114a964 100644 --- a/services/horizon/internal/actions/operation_test.go +++ b/services/horizon/internal/actions/operation_test.go @@ -294,7 +294,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { } // NULL value - _, err = tt.HorizonSession().ExecRaw( + _, err = tt.HorizonSession().ExecRaw(tt.Ctx, `UPDATE history_transactions SET successful = NULL WHERE transaction_hash = ?`, "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", ) @@ -504,7 +504,7 @@ func TestOperation_CreatedAt(t *testing.T) { tt.Assert.NoError(err) l := history.Ledger{} - tt.Assert.NoError(q.LedgerBySequence(&l, 3)) + tt.Assert.NoError(q.LedgerBySequence(tt.Ctx, &l, 3)) record := records[0].(operations.Payment) diff --git a/services/horizon/internal/actions/orderbook.go b/services/horizon/internal/actions/orderbook.go index aca7a8ed68..c00d5ceae4 100644 --- a/services/horizon/internal/actions/orderbook.go +++ b/services/horizon/internal/actions/orderbook.go @@ -100,7 +100,7 @@ func (handler GetOrderbookHandler) GetResource(w HeaderWriter, r *http.Request) return nil, err } - summary, err := historyQ.GetOrderBookSummary(selling, buying, int(limit)) + summary, err := historyQ.GetOrderBookSummary(r.Context(), selling, buying, int(limit)) if err != nil { return nil, err } diff --git a/services/horizon/internal/actions/orderbook_test.go b/services/horizon/internal/actions/orderbook_test.go index 3c1c25f28d..0b1d4de0c0 100644 --- a/services/horizon/internal/actions/orderbook_test.go +++ b/services/horizon/internal/actions/orderbook_test.go @@ -574,19 +574,19 @@ func TestOrderbookGetResource(t *testing.T) { otherSellEurOffer, } - assert.NoError(t, q.TruncateTables([]string{"offers"})) + assert.NoError(t, q.TruncateTables(tt.Ctx, []string{"offers"})) batch := q.NewOffersBatchInsertBuilder(0) for _, offer := range offers { - assert.NoError(t, batch.Add(offer)) + assert.NoError(t, batch.Add(tt.Ctx, offer)) } - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - assert.NoError(t, q.BeginTx(&sql.TxOptions{ + assert.NoError(t, q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, })) - defer q.Rollback() + defer q.Rollback(tt.Ctx) fullResponse := empty fullResponse.Asks = []protocol.PriceLevel{ diff --git a/services/horizon/internal/actions/path.go b/services/horizon/internal/actions/path.go index 680b99332d..6ea093cba6 100644 --- a/services/horizon/internal/actions/path.go +++ b/services/horizon/internal/actions/path.go @@ -334,5 +334,5 @@ func assetsForAddress(r *http.Request, addy string) ([]xdr.Asset, []xdr.Int64, e if err != nil { return nil, nil, err } - return historyQ.AssetsForAddress(addy) + return historyQ.AssetsForAddress(r.Context(), addy) } diff --git a/services/horizon/internal/actions/trade.go b/services/horizon/internal/actions/trade.go index 5cce1cd2a3..2d639afb11 100644 --- a/services/horizon/internal/actions/trade.go +++ b/services/horizon/internal/actions/trade.go @@ -1,13 +1,14 @@ package actions import ( + "context" "fmt" "net/http" "strconv" gTime "time" "github.com/stellar/go/protocols/horizon" - "github.com/stellar/go/services/horizon/internal/context" + horizonContext "github.com/stellar/go/services/horizon/internal/context" "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/ledger" @@ -125,7 +126,7 @@ func (handler GetTradesHandler) GetResourcePage(w HeaderWriter, r *http.Request) return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } @@ -133,7 +134,7 @@ func (handler GetTradesHandler) GetResourcePage(w HeaderWriter, r *http.Request) trades := historyQ.Trades() if qp.AccountID != "" { - trades.ForAccount(qp.AccountID) + trades.ForAccount(ctx, qp.AccountID) } baseAsset, err := qp.Base() @@ -142,7 +143,7 @@ func (handler GetTradesHandler) GetResourcePage(w HeaderWriter, r *http.Request) } if baseAsset != nil { - baseAssetID, err2 := historyQ.GetAssetID(*baseAsset) + baseAssetID, err2 := historyQ.GetAssetID(ctx, *baseAsset) if err2 != nil { return nil, err2 } @@ -152,7 +153,7 @@ func (handler GetTradesHandler) GetResourcePage(w HeaderWriter, r *http.Request) return nil, err2 } - counterAssetID, err2 := historyQ.GetAssetID(*counterAsset) + counterAssetID, err2 := historyQ.GetAssetID(ctx, *counterAsset) if err2 != nil { return nil, err2 } @@ -164,7 +165,7 @@ func (handler GetTradesHandler) GetResourcePage(w HeaderWriter, r *http.Request) } var records []history.Trade - if err = trades.Page(pq).Select(&records); err != nil { + if err = trades.Page(ctx, pq).Select(ctx, &records); err != nil { return nil, err } var response []hal.Pageable @@ -256,12 +257,12 @@ func (handler GetTradeAggregationsHandler) GetResource(w HeaderWriter, r *http.R return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } - records, err := handler.fetchRecords(historyQ, qp, pq) + records, err := handler.fetchRecords(ctx, historyQ, qp, pq) if err != nil { return nil, err } @@ -279,13 +280,13 @@ func (handler GetTradeAggregationsHandler) GetResource(w HeaderWriter, r *http.R return handler.buildPage(r, aggregations) } -func (handler GetTradeAggregationsHandler) fetchRecords(historyQ *history.Q, qp TradeAggregationsQuery, pq db2.PageQuery) ([]history.TradeAggregation, error) { +func (handler GetTradeAggregationsHandler) fetchRecords(ctx context.Context, historyQ *history.Q, qp TradeAggregationsQuery, pq db2.PageQuery) ([]history.TradeAggregation, error) { baseAsset, err := qp.Base() if err != nil { return nil, err } - baseAssetID, err := historyQ.GetAssetID(*baseAsset) + baseAssetID, err := historyQ.GetAssetID(ctx, *baseAsset) if err != nil { p := problem.BadRequest if historyQ.NoRows(err) { @@ -304,7 +305,7 @@ func (handler GetTradeAggregationsHandler) fetchRecords(historyQ *history.Q, qp return nil, err } - counterAssetID, err := historyQ.GetAssetID(*counterAsset) + counterAssetID, err := historyQ.GetAssetID(ctx, *counterAsset) if err != nil { p := problem.BadRequest if historyQ.NoRows(err) { @@ -358,7 +359,7 @@ func (handler GetTradeAggregationsHandler) fetchRecords(historyQ *history.Q, qp } var records []history.TradeAggregation - err = historyQ.Select(&records, tradeAggregationsQ.GetSql()) + err = historyQ.Select(ctx, &records, tradeAggregationsQ.GetSql()) if err != nil { return nil, err } diff --git a/services/horizon/internal/actions/transaction.go b/services/horizon/internal/actions/transaction.go index 392ab69f1d..1491878e38 100644 --- a/services/horizon/internal/actions/transaction.go +++ b/services/horizon/internal/actions/transaction.go @@ -1,10 +1,11 @@ package actions import ( + "context" "net/http" "github.com/stellar/go/protocols/horizon" - "github.com/stellar/go/services/horizon/internal/context" + horizonContext "github.com/stellar/go/services/horizon/internal/context" "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/ledger" @@ -33,7 +34,7 @@ func (handler GetTransactionByHashHandler) GetResource(w HeaderWriter, r *http.R return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } @@ -43,7 +44,7 @@ func (handler GetTransactionByHashHandler) GetResource(w HeaderWriter, r *http.R resource horizon.Transaction ) - err = historyQ.TransactionByHash(&record, qp.TransactionHash) + err = historyQ.TransactionByHash(ctx, &record, qp.TransactionHash) if err != nil { return resource, errors.Wrap(err, "loading transaction record") } @@ -109,7 +110,7 @@ func (handler GetTransactionsHandler) GetResourcePage(w HeaderWriter, r *http.Re return nil, err } - historyQ, err := context.HistoryQFromRequest(r) + historyQ, err := horizonContext.HistoryQFromRequest(r) if err != nil { return nil, err } @@ -123,7 +124,7 @@ func (handler GetTransactionsHandler) GetResourcePage(w HeaderWriter, r *http.Re } cbID = &cb } - records, err := loadTransactionRecords(historyQ, qp.AccountID, cbID, int32(qp.LedgerID), qp.IncludeFailedTransactions, pq) + records, err := loadTransactionRecords(ctx, historyQ, qp.AccountID, cbID, int32(qp.LedgerID), qp.IncludeFailedTransactions, pq) if err != nil { return nil, errors.Wrap(err, "loading transaction records") } @@ -145,7 +146,7 @@ func (handler GetTransactionsHandler) GetResourcePage(w HeaderWriter, r *http.Re // loadTransactionRecords returns a slice of transaction records of an // account/ledger identified by accountID/ledgerID based on pq and // includeFailedTx. -func loadTransactionRecords(hq *history.Q, accountID string, cbID *xdr.ClaimableBalanceId, ledgerID int32, includeFailedTx bool, pq db2.PageQuery) ([]history.Transaction, error) { +func loadTransactionRecords(ctx context.Context, hq *history.Q, accountID string, cbID *xdr.ClaimableBalanceId, ledgerID int32, includeFailedTx bool, pq db2.PageQuery) ([]history.Transaction, error) { if accountID != "" && ledgerID != 0 { return nil, errors.New("conflicting exclusive fields are present: account_id and ledger_id") } @@ -155,18 +156,18 @@ func loadTransactionRecords(hq *history.Q, accountID string, cbID *xdr.Claimable txs := hq.Transactions() switch { case accountID != "": - txs.ForAccount(accountID) + txs.ForAccount(ctx, accountID) case cbID != nil: - txs.ForClaimableBalance(*cbID) + txs.ForClaimableBalance(ctx, *cbID) case ledgerID > 0: - txs.ForLedger(ledgerID) + txs.ForLedger(ctx, ledgerID) } if includeFailedTx { txs.IncludeFailed() } - err := txs.Page(pq).Select(&records) + err := txs.Page(pq).Select(ctx, &records) if err != nil { return nil, errors.Wrap(err, "executing transaction records query") } diff --git a/services/horizon/internal/actions_account_test.go b/services/horizon/internal/actions_account_test.go index c83b27bec3..541300c3a6 100644 --- a/services/horizon/internal/actions_account_test.go +++ b/services/horizon/internal/actions_account_test.go @@ -14,11 +14,11 @@ func TestAccountActions_InvalidID(t *testing.T) { // Makes StateMiddleware happy q := history.Q{ht.HorizonSession()} - err := q.UpdateLastLedgerIngest(100) + err := q.UpdateLastLedgerIngest(ht.Ctx, 100) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ht.Ctx, ingest.CurrentVersion) ht.Assert.NoError(err) - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err = q.InsertLedger(ht.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 100, }, diff --git a/services/horizon/internal/actions_data_test.go b/services/horizon/internal/actions_data_test.go index 2c2590af29..137087aedf 100644 --- a/services/horizon/internal/actions_data_test.go +++ b/services/horizon/internal/actions_data_test.go @@ -53,22 +53,22 @@ func TestDataActions_Show(t *testing.T) { q := &history.Q{ht.HorizonSession()} // Makes StateMiddleware happy - err := q.UpdateLastLedgerIngest(100) + err := q.UpdateLastLedgerIngest(ht.Ctx, 100) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ht.Ctx, ingest.CurrentVersion) ht.Assert.NoError(err) - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + _, err = q.InsertLedger(ht.Ctx, xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ LedgerSeq: 100, }, }, 0, 0, 0, 0, 0) ht.Assert.NoError(err) - rows, err := q.InsertAccountData(data1) + rows, err := q.InsertAccountData(ht.Ctx, data1) assert.NoError(t, err) ht.Assert.Equal(int64(1), rows) - rows, err = q.InsertAccountData(data2) + rows, err = q.InsertAccountData(ht.Ctx, data2) assert.NoError(t, err) ht.Assert.Equal(int64(1), rows) diff --git a/services/horizon/internal/actions_effects_test.go b/services/horizon/internal/actions_effects_test.go index 1a82df7092..176368b1d4 100644 --- a/services/horizon/internal/actions_effects_test.go +++ b/services/horizon/internal/actions_effects_test.go @@ -43,9 +43,9 @@ func TestEffectActions_Index(t *testing.T) { // Makes StateMiddleware happy q := history.Q{ht.HorizonSession()} - err := q.UpdateLastLedgerIngest(3) + err := q.UpdateLastLedgerIngest(ht.Ctx, 3) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ht.Ctx, ingest.CurrentVersion) ht.Assert.NoError(err) // checks if empty param returns 404 instead of all payments diff --git a/services/horizon/internal/actions_operation_fee_stats_test.go b/services/horizon/internal/actions_operation_fee_stats_test.go index a4b451200f..c1556dee71 100644 --- a/services/horizon/internal/actions_operation_fee_stats_test.go +++ b/services/horizon/internal/actions_operation_fee_stats_test.go @@ -151,10 +151,10 @@ func TestOperationFeeTestsActions_Show(t *testing.T) { defer ht.Finish() // Update max_tx_set_size on ledgers - _, err := ht.HorizonSession().ExecRaw("UPDATE history_ledgers SET max_tx_set_size = 50") + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_ledgers SET max_tx_set_size = 50") ht.Require.NoError(err) - ht.App.UpdateFeeStatsState() + ht.App.UpdateFeeStatsState(ht.Ctx) w := ht.Get("/fee_stats") @@ -205,14 +205,14 @@ func TestOperationFeeTestsActions_ShowMultiOp(t *testing.T) { defer ht.Finish() // Update max_tx_set_size on ledgers - _, err := ht.HorizonSession().ExecRaw("UPDATE history_ledgers SET max_tx_set_size = 50") + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_ledgers SET max_tx_set_size = 50") ht.Require.NoError(err) // Update number of ops on each transaction - _, err = ht.HorizonSession().ExecRaw("UPDATE history_transactions SET operation_count = operation_count * 2") + _, err = ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_transactions SET operation_count = operation_count * 2") ht.Require.NoError(err) - ht.App.UpdateFeeStatsState() + ht.App.UpdateFeeStatsState(ht.Ctx) w := ht.Get("/fee_stats") @@ -271,14 +271,14 @@ func TestOperationFeeTestsActions_NotInterpolating(t *testing.T) { defer ht.Finish() // Update max_tx_set_size on ledgers - _, err := ht.HorizonSession().ExecRaw("UPDATE history_ledgers SET max_tx_set_size = 50") + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_ledgers SET max_tx_set_size = 50") ht.Require.NoError(err) // Update one tx to a huge fee - _, err = ht.HorizonSession().ExecRaw("UPDATE history_transactions SET max_fee = 256000, operation_count = 16 WHERE transaction_hash = '6a349e7331e93a251367287e274fb1699abaf723bde37aebe96248c76fd3071a'") + _, err = ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_transactions SET max_fee = 256000, operation_count = 16 WHERE transaction_hash = '6a349e7331e93a251367287e274fb1699abaf723bde37aebe96248c76fd3071a'") ht.Require.NoError(err) - ht.App.UpdateFeeStatsState() + ht.App.UpdateFeeStatsState(ht.Ctx) w := ht.Get("/fee_stats") @@ -326,13 +326,13 @@ func TestOperationFeeTestsActions_FeeBump(t *testing.T) { defer ht.Finish() // Update one tx to be a fee bump - result, err := ht.HorizonSession().ExecRaw("UPDATE history_transactions SET max_fee = 10, new_max_fee = 1000, fee_charged = 200 WHERE transaction_hash = '6a349e7331e93a251367287e274fb1699abaf723bde37aebe96248c76fd3071a'") + result, err := ht.HorizonSession().ExecRaw(ht.Ctx, "UPDATE history_transactions SET max_fee = 10, new_max_fee = 1000, fee_charged = 200 WHERE transaction_hash = '6a349e7331e93a251367287e274fb1699abaf723bde37aebe96248c76fd3071a'") ht.Require.NoError(err) rowsAffected, err := result.RowsAffected() ht.Require.NoError(err) ht.Require.Equal(int64(1), rowsAffected) - ht.App.UpdateFeeStatsState() + ht.App.UpdateFeeStatsState(ht.Ctx) w := ht.Get("/fee_stats") diff --git a/services/horizon/internal/actions_operation_test.go b/services/horizon/internal/actions_operation_test.go index de3a37c2f9..f1ab63901a 100644 --- a/services/horizon/internal/actions_operation_test.go +++ b/services/horizon/internal/actions_operation_test.go @@ -169,7 +169,7 @@ func TestOperationActions_Show_Failed(t *testing.T) { } // NULL value - _, err := ht.HorizonSession().ExecRaw( + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, `UPDATE history_transactions SET successful = NULL WHERE transaction_hash = ?`, "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", ) @@ -280,7 +280,7 @@ func TestOperation_CreatedAt(t *testing.T) { l := history.Ledger{} hq := history.Q{Session: ht.HorizonSession()} - ht.Require.NoError(hq.LedgerBySequence(&l, 3)) + ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 3)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) } diff --git a/services/horizon/internal/actions_path_test.go b/services/horizon/internal/actions_path_test.go index cab47284f4..07794d05ce 100644 --- a/services/horizon/internal/actions_path_test.go +++ b/services/horizon/internal/actions_path_test.go @@ -50,11 +50,11 @@ func mockPathFindingClient( router.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { s := session.Clone() - s.BeginTx(&sql.TxOptions{ + s.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) - defer s.Rollback() + defer s.Rollback(tt.Ctx) ctx := context.WithValue( r.Context(), @@ -168,9 +168,9 @@ func TestPathActionsStrictReceive(t *testing.T) { } batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account) + err := batch.Add(tt.Ctx, account) assert.NoError(t, err) - err = batch.Exec() + err = batch.Exec(tt.Ctx) assert.NoError(t, err) assetsByKeys := map[string]xdr.Asset{} @@ -204,7 +204,7 @@ func TestPathActionsStrictReceive(t *testing.T) { }, } - rows, err1 := q.InsertTrustLine(trustline) + rows, err1 := q.InsertTrustLine(tt.Ctx, trustline) assert.NoError(t, err1) assert.Equal(t, int64(1), rows) } @@ -526,9 +526,9 @@ func TestPathActionsStrictSend(t *testing.T) { } batch := historyQ.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account) + err := batch.Add(tt.Ctx, account) assert.NoError(t, err) - err = batch.Exec() + err = batch.Exec(tt.Ctx) assert.NoError(t, err) assetsByKeys := map[string]xdr.Asset{} @@ -562,7 +562,7 @@ func TestPathActionsStrictSend(t *testing.T) { }, } - rows, err := historyQ.InsertTrustLine(trustline) + rows, err := historyQ.InsertTrustLine(tt.Ctx, trustline) assert.NoError(t, err) assert.Equal(t, int64(1), rows) } diff --git a/services/horizon/internal/actions_payment_test.go b/services/horizon/internal/actions_payment_test.go index f96aea04f4..839e8efe9e 100644 --- a/services/horizon/internal/actions_payment_test.go +++ b/services/horizon/internal/actions_payment_test.go @@ -35,9 +35,9 @@ func TestPaymentActions(t *testing.T) { // Makes StateMiddleware happy initializeStateMiddleware := func() { q := history.Q{ht.HorizonSession()} - err := q.UpdateLastLedgerIngest(3) + err := q.UpdateLastLedgerIngest(ht.Ctx, 3) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ht.Ctx, ingest.CurrentVersion) ht.Assert.NoError(err) } initializeStateMiddleware() @@ -212,7 +212,7 @@ func TestPaymentActions_Show_Failed(t *testing.T) { } // NULL value - _, err := ht.HorizonSession().ExecRaw( + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, `UPDATE history_transactions SET successful = NULL WHERE transaction_hash = ?`, "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", ) @@ -241,7 +241,7 @@ func TestPayment_CreatedAt(t *testing.T) { l := history.Ledger{} hq := history.Q{Session: ht.HorizonSession()} - ht.Require.NoError(hq.LedgerBySequence(&l, 3)) + ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 3)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) } diff --git a/services/horizon/internal/actions_root_test.go b/services/horizon/internal/actions_root_test.go index 8a7897037f..8066beaa6d 100644 --- a/services/horizon/internal/actions_root_test.go +++ b/services/horizon/internal/actions_root_test.go @@ -28,8 +28,8 @@ func TestRootAction(t *testing.T) { ht.App.config.StellarCoreURL = server.URL ht.App.config.NetworkPassphrase = "test" - ht.App.UpdateStellarCoreInfo() - ht.App.UpdateLedgerState() + ht.App.UpdateStellarCoreInfo(ht.Ctx) + ht.App.UpdateLedgerState(ht.Ctx) w := ht.Get("/") @@ -94,7 +94,7 @@ func TestRootCoreClientInfoErrored(t *testing.T) { defer server.Close() ht.App.config.StellarCoreURL = server.URL - ht.App.UpdateLedgerState() + ht.App.UpdateLedgerState(ht.Ctx) w := ht.Get("/") diff --git a/services/horizon/internal/actions_trade_test.go b/services/horizon/internal/actions_trade_test.go index d86f813ad4..03978d44c5 100644 --- a/services/horizon/internal/actions_trade_test.go +++ b/services/horizon/internal/actions_trade_test.go @@ -36,7 +36,7 @@ func TestTradeActions_Index(t *testing.T) { // ensure created_at is populated correctly l := history.Ledger{} hq := history.Q{Session: ht.HorizonSession()} - ht.Require.NoError(hq.LedgerBySequence(&l, 9)) + ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 9)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) } diff --git a/services/horizon/internal/actions_transaction_test.go b/services/horizon/internal/actions_transaction_test.go index d2f3c9a89c..caefe2846c 100644 --- a/services/horizon/internal/actions_transaction_test.go +++ b/services/horizon/internal/actions_transaction_test.go @@ -145,7 +145,7 @@ func TestTransactionActions_Show_Failed(t *testing.T) { } // NULL value - _, err := ht.HorizonSession().ExecRaw( + _, err := ht.HorizonSession().ExecRaw(ht.Ctx, `UPDATE history_transactions SET successful = NULL WHERE transaction_hash = ?`, "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", ) @@ -193,9 +193,9 @@ func TestTransactionActions_Index(t *testing.T) { // Makes StateMiddleware happy q := history.Q{ht.HorizonSession()} - err := q.UpdateLastLedgerIngest(100) + err := q.UpdateLastLedgerIngest(ht.Ctx, 100) ht.Assert.NoError(err) - err = q.UpdateIngestVersion(ingest.CurrentVersion) + err = q.UpdateIngestVersion(ht.Ctx, ingest.CurrentVersion) ht.Assert.NoError(err) // checks if empty param returns 404 instead of all payments diff --git a/services/horizon/internal/app.go b/services/horizon/internal/app.go index 10bca22743..1aaa529cda 100644 --- a/services/horizon/internal/app.go +++ b/services/horizon/internal/app.go @@ -194,14 +194,14 @@ func (a *App) Ingestion() ingest.System { } // HorizonSession returns a new session that loads data from the horizon -// database. The returned session is bound to `ctx`. -func (a *App) HorizonSession(ctx context.Context) *db.Session { - return &db.Session{DB: a.historyQ.Session.DB, Ctx: ctx} +// database. +func (a *App) HorizonSession() *db.Session { + return &db.Session{DB: a.historyQ.Session.DB} } // UpdateLedgerState triggers a refresh of several metrics gauges, such as open // db connections and ledger state -func (a *App) UpdateLedgerState() { +func (a *App) UpdateLedgerState(ctx context.Context) { var next ledger.Status logErr := func(err error, msg string) { @@ -221,19 +221,19 @@ func (a *App) UpdateLedgerState() { next.CoreLatest = int32(coreInfo.Info.Ledger.Num) next.HistoryLatest, next.HistoryLatestClosedAt, err = - a.HistoryQ().LatestLedgerSequenceClosedAt() + a.HistoryQ().LatestLedgerSequenceClosedAt(ctx) if err != nil { logErr(err, "failed to load the latest known ledger state from history DB") return } - err = a.HistoryQ().ElderLedger(&next.HistoryElder) + err = a.HistoryQ().ElderLedger(ctx, &next.HistoryElder) if err != nil { logErr(err, "failed to load the oldest known ledger state from history DB") return } - next.ExpHistoryLatest, err = a.HistoryQ().GetLastLedgerIngestNonBlocking() + next.ExpHistoryLatest, err = a.HistoryQ().GetLastLedgerIngestNonBlocking(ctx) if err != nil { logErr(err, "failed to load the oldest known exp ledger state from history DB") return @@ -243,7 +243,7 @@ func (a *App) UpdateLedgerState() { } // UpdateFeeStatsState triggers a refresh of several operation fee metrics. -func (a *App) UpdateFeeStatsState() { +func (a *App) UpdateFeeStatsState(ctx context.Context) { var ( next operationfeestats.State latest history.LatestLedger @@ -262,7 +262,7 @@ func (a *App) UpdateFeeStatsState() { cur, ok := operationfeestats.CurrentState() - err := a.HistoryQ().LatestLedgerBaseFeeAndSequence(&latest) + err := a.HistoryQ().LatestLedgerBaseFeeAndSequence(ctx, &latest) if err != nil { logErr(err, "failed to load the latest known ledger's base fee and sequence number") return @@ -276,13 +276,13 @@ func (a *App) UpdateFeeStatsState() { next.LastBaseFee = int64(latest.BaseFee) next.LastLedger = uint32(latest.Sequence) - err = a.HistoryQ().FeeStats(latest.Sequence, &feeStats) + err = a.HistoryQ().FeeStats(ctx, latest.Sequence, &feeStats) if err != nil { logErr(err, "failed to load operation fee stats") return } - err = a.HistoryQ().LedgerCapacityUsageStats(latest.Sequence, &capacityStats) + err = a.HistoryQ().LedgerCapacityUsageStats(ctx, latest.Sequence, &capacityStats) if err != nil { logErr(err, "failed to load ledger capacity usage stats") return @@ -365,7 +365,7 @@ func (a *App) UpdateFeeStatsState() { // UpdateStellarCoreInfo updates the value of CoreVersion, // CurrentProtocolVersion, and CoreSupportedProtocolVersion from the Stellar // core API. -func (a *App) UpdateStellarCoreInfo() { +func (a *App) UpdateStellarCoreInfo(ctx context.Context) { if a.config.StellarCoreURL == "" { return } @@ -374,7 +374,7 @@ func (a *App) UpdateStellarCoreInfo() { URL: a.config.StellarCoreURL, } - resp, err := core.Info(context.Background()) + resp, err := core.Info(ctx) if err != nil { log.Warnf("could not load stellar-core info: %s", err) return @@ -396,8 +396,8 @@ func (a *App) UpdateStellarCoreInfo() { // DeleteUnretainedHistory forwards to the app's reaper. See // `reap.DeleteUnretainedHistory` for details -func (a *App) DeleteUnretainedHistory() error { - return a.reaper.DeleteUnretainedHistory() +func (a *App) DeleteUnretainedHistory(ctx context.Context) error { + return a.reaper.DeleteUnretainedHistory(ctx) } // Tick triggers horizon to update all of it's background processes such as @@ -407,13 +407,13 @@ func (a *App) Tick() { log.Debug("ticking app") // update ledger state, operation fee state, and stellar-core info in parallel wg.Add(3) - go func() { a.UpdateLedgerState(); wg.Done() }() - go func() { a.UpdateFeeStatsState(); wg.Done() }() - go func() { a.UpdateStellarCoreInfo(); wg.Done() }() + go func() { a.UpdateLedgerState(a.ctx); wg.Done() }() + go func() { a.UpdateFeeStatsState(a.ctx); wg.Done() }() + go func() { a.UpdateStellarCoreInfo(a.ctx); wg.Done() }() wg.Wait() wg.Add(2) - go func() { a.reaper.Tick(); wg.Done() }() + go func() { a.reaper.Tick(a.ctx); wg.Done() }() go func() { a.submitter.Tick(a.ctx); wg.Done() }() wg.Wait() @@ -437,7 +437,7 @@ func (a *App) init() error { initLogglyLog(a) // stellarCoreInfo - a.UpdateStellarCoreInfo() + a.UpdateStellarCoreInfo(a.ctx) // horizon-db and core-db mustInitHorizonDB(a) @@ -452,7 +452,7 @@ func (a *App) init() error { initSubmissionSystem(a) // reaper - a.reaper = reap.New(a.config.HistoryRetentionCount, a.HorizonSession(context.Background()), a.ledgerState) + a.reaper = reap.New(a.config.HistoryRetentionCount, a.HorizonSession(), a.ledgerState) // metrics and log.metrics a.prometheusRegistry = prometheus.NewRegistry() diff --git a/services/horizon/internal/db2/assets/asset_stat_test.go b/services/horizon/internal/db2/assets/asset_stat_test.go index 9408d10b60..c7ef50fe90 100644 --- a/services/horizon/internal/db2/assets/asset_stat_test.go +++ b/services/horizon/internal/db2/assets/asset_stat_test.go @@ -1,6 +1,7 @@ package assets import ( + "context" "strconv" "testing" @@ -91,7 +92,7 @@ func TestAssetsStatsQExec(t *testing.T) { tt.Require.NoError(err) var results []AssetStatsR - err = history.Q{Session: tt.HorizonSession()}.Select(&results, sql) + err = history.Q{Session: tt.HorizonSession()}.Select(context.Background(), &results, sql) tt.Require.NoError(err) if !tt.Assert.Equal(3, len(results)) { return diff --git a/services/horizon/internal/db2/history/account.go b/services/horizon/internal/db2/history/account.go index 6bd10e3487..6f5c921ea8 100644 --- a/services/horizon/internal/db2/history/account.go +++ b/services/horizon/internal/db2/history/account.go @@ -1,6 +1,7 @@ package history import ( + "context" "sort" sq "github.com/Masterminds/squirrel" @@ -10,22 +11,22 @@ import ( ) // AccountByAddress loads a row from `history_accounts`, by address -func (q *Q) AccountByAddress(dest interface{}, addy string) error { +func (q *Q) AccountByAddress(ctx context.Context, dest interface{}, addy string) error { sql := selectAccount.Limit(1).Where("ha.address = ?", addy) - return q.Get(dest, sql) + return q.Get(ctx, dest, sql) } // AccountsByAddresses loads a rows from `history_accounts`, by addresses -func (q *Q) AccountsByAddresses(dest interface{}, addresses []string) error { +func (q *Q) AccountsByAddresses(ctx context.Context, dest interface{}, addresses []string) error { sql := selectAccount.Where(map[string]interface{}{ "ha.address": addresses, // ha.address IN (...) }) - return q.Select(dest, sql) + return q.Select(ctx, dest, sql) } // CreateAccounts creates rows in the history_accounts table for a given list of addresses. // CreateAccounts returns a mapping of account address to its corresponding id in the history_accounts table -func (q *Q) CreateAccounts(addresses []string, batchSize int) (map[string]int64, error) { +func (q *Q) CreateAccounts(ctx context.Context, addresses []string, batchSize int) (map[string]int64, error) { builder := &db.BatchInsertBuilder{ Table: q.GetTable("history_accounts"), MaxBatchSize: batchSize, @@ -36,7 +37,7 @@ func (q *Q) CreateAccounts(addresses []string, batchSize int) (map[string]int64, // https://github.com/stellar/go/issues/2370 sort.Strings(addresses) for _, address := range addresses { - err := builder.Row(map[string]interface{}{ + err := builder.Row(ctx, map[string]interface{}{ "address": address, }) if err != nil { @@ -44,7 +45,7 @@ func (q *Q) CreateAccounts(addresses []string, batchSize int) (map[string]int64, } } - err := builder.Exec() + err := builder.Exec(ctx) if err != nil { return nil, errors.Wrap(err, "could not exec asset insert builder") } @@ -60,7 +61,7 @@ func (q *Q) CreateAccounts(addresses []string, batchSize int) (map[string]int64, } subset := addresses[i:end] - if err := q.AccountsByAddresses(&accounts, subset); err != nil { + if err := q.AccountsByAddresses(ctx, &accounts, subset); err != nil { return nil, errors.Wrap(err, "could not select accounts") } diff --git a/services/horizon/internal/db2/history/account_data.go b/services/horizon/internal/db2/history/account_data.go index 827e2be72c..290d686156 100644 --- a/services/horizon/internal/db2/history/account_data.go +++ b/services/horizon/internal/db2/history/account_data.go @@ -1,6 +1,7 @@ package history import ( + "context" "encoding/base64" sq "github.com/Masterminds/squirrel" @@ -8,11 +9,11 @@ import ( "github.com/stellar/go/xdr" ) -func (q *Q) CountAccountsData() (int, error) { +func (q *Q) CountAccountsData(ctx context.Context) (int, error) { sql := sq.Select("count(*)").From("accounts_data") var count int - if err := q.Get(&count, sql); err != nil { + if err := q.Get(ctx, &count, sql); err != nil { return 0, errors.Wrap(err, "could not run select query") } @@ -20,26 +21,26 @@ func (q *Q) CountAccountsData() (int, error) { } // GetAccountDataByName loads account data for a given account ID and data name -func (q *Q) GetAccountDataByName(id, name string) (Data, error) { +func (q *Q) GetAccountDataByName(ctx context.Context, id, name string) (Data, error) { var data Data sql := selectAccountData.Where(sq.Eq{ "account_id": id, "name": name, }).Limit(1) - err := q.Get(&data, sql) + err := q.Get(ctx, &data, sql) return data, err } // GetAccountDataByAccountID loads account data for a given account ID -func (q *Q) GetAccountDataByAccountID(id string) ([]Data, error) { +func (q *Q) GetAccountDataByAccountID(ctx context.Context, id string) ([]Data, error) { var data []Data sql := selectAccountData.Where(sq.Eq{"account_id": id}) - err := q.Select(&data, sql) + err := q.Select(ctx, &data, sql) return data, err } // GetAccountDataByKeys loads a row from the `accounts_data` table, selected by multiple keys. -func (q *Q) GetAccountDataByKeys(keys []xdr.LedgerKeyData) ([]Data, error) { +func (q *Q) GetAccountDataByKeys(ctx context.Context, keys []xdr.LedgerKeyData) ([]Data, error) { var data []Data lkeys := make([]string, 0, len(keys)) for _, key := range keys { @@ -50,7 +51,7 @@ func (q *Q) GetAccountDataByKeys(keys []xdr.LedgerKeyData) ([]Data, error) { lkeys = append(lkeys, lkey) } sql := selectAccountData.Where(map[string]interface{}{"accounts_data.ledger_key": lkeys}) - err := q.Select(&data, sql) + err := q.Select(ctx, &data, sql) return data, err } @@ -80,7 +81,7 @@ func dataEntryToLedgerKeyString(entry xdr.LedgerEntry) (string, error) { // InsertAccountData creates a row in the accounts_data table. // Returns number of rows affected and error. -func (q *Q) InsertAccountData(entry xdr.LedgerEntry) (int64, error) { +func (q *Q) InsertAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { data := entry.Data.MustData() // Add lkey only when inserting rows @@ -100,7 +101,7 @@ func (q *Q) InsertAccountData(entry xdr.LedgerEntry) (int64, error) { ledgerEntrySponsorToNullString(entry), ) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -110,7 +111,7 @@ func (q *Q) InsertAccountData(entry xdr.LedgerEntry) (int64, error) { // UpdateAccountData updates a row in the accounts_data table. // Returns number of rows affected and error. -func (q *Q) UpdateAccountData(entry xdr.LedgerEntry) (int64, error) { +func (q *Q) UpdateAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { data := entry.Data.MustData() key, err := dataEntryToLedgerKeyString(entry) @@ -124,7 +125,7 @@ func (q *Q) UpdateAccountData(entry xdr.LedgerEntry) (int64, error) { "sponsor": ledgerEntrySponsorToNullString(entry), }). Where(sq.Eq{"ledger_key": key}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -134,7 +135,7 @@ func (q *Q) UpdateAccountData(entry xdr.LedgerEntry) (int64, error) { // RemoveAccountData deletes a row in the accounts_data table. // Returns number of rows affected and error. -func (q *Q) RemoveAccountData(key xdr.LedgerKeyData) (int64, error) { +func (q *Q) RemoveAccountData(ctx context.Context, key xdr.LedgerKeyData) (int64, error) { lkey, err := ledgerKeyDataToString(key) if err != nil { return 0, errors.Wrap(err, "Error running ledgerKeyDataToString") @@ -142,7 +143,7 @@ func (q *Q) RemoveAccountData(key xdr.LedgerKeyData) (int64, error) { sql := sq.Delete("accounts_data"). Where(sq.Eq{"ledger_key": lkey}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -151,10 +152,10 @@ func (q *Q) RemoveAccountData(key xdr.LedgerKeyData) (int64, error) { } // GetAccountDataByAccountsID loads account data for a list of account ID -func (q *Q) GetAccountDataByAccountsID(id []string) ([]Data, error) { +func (q *Q) GetAccountDataByAccountsID(ctx context.Context, id []string) ([]Data, error) { var data []Data sql := selectAccountData.Where(sq.Eq{"account_id": id}) - err := q.Select(&data, sql) + err := q.Select(ctx, &data, sql) return data, err } diff --git a/services/horizon/internal/db2/history/account_data_batch_insert_builder.go b/services/horizon/internal/db2/history/account_data_batch_insert_builder.go index e1a1e6f38b..be3ac4c24e 100644 --- a/services/horizon/internal/db2/history/account_data_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/account_data_batch_insert_builder.go @@ -1,11 +1,13 @@ package history import ( + "context" + "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) -func (i *accountDataBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { +func (i *accountDataBatchInsertBuilder) Add(ctx context.Context, entry xdr.LedgerEntry) error { data := entry.Data.MustData() // Add ledger_key only when inserting rows key, err := dataEntryToLedgerKeyString(entry) @@ -13,7 +15,7 @@ func (i *accountDataBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { return errors.Wrap(err, "Error running dataEntryToLedgerKeyString") } - return i.builder.Row(map[string]interface{}{ + return i.builder.Row(ctx, map[string]interface{}{ "ledger_key": key, "account_id": data.AccountId.Address(), "name": data.DataName, @@ -23,6 +25,6 @@ func (i *accountDataBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { }) } -func (i *accountDataBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *accountDataBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/account_data_batch_insert_builder_test.go b/services/horizon/internal/db2/history/account_data_batch_insert_builder_test.go index 4920532819..6198281398 100644 --- a/services/horizon/internal/db2/history/account_data_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/account_data_batch_insert_builder_test.go @@ -35,13 +35,13 @@ func TestDataBatchInsertBuilderAdd(t *testing.T) { builder := q.NewAccountDataBatchInsertBuilder(2) - err := builder.Add(entry) + err := builder.Add(tt.Ctx, entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) - record, err := q.GetAccountDataByName(accountID.Address(), "foo") + record, err := q.GetAccountDataByName(tt.Ctx, accountID.Address(), "foo") tt.Assert.NoError(err) tt.Assert.Equal(data.DataName, xdr.String64(record.Name)) diff --git a/services/horizon/internal/db2/history/account_data_test.go b/services/horizon/internal/db2/history/account_data_test.go index a8482da55f..9300f024b7 100644 --- a/services/horizon/internal/db2/history/account_data_test.go +++ b/services/horizon/internal/db2/history/account_data_test.go @@ -47,11 +47,11 @@ func TestInsertAccountData(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertAccountData(data1) + rows, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) - rows, err = q.InsertAccountData(data2) + rows, err = q.InsertAccountData(tt.Ctx, data2) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) @@ -60,7 +60,7 @@ func TestInsertAccountData(t *testing.T) { {AccountId: data2.Data.Data.AccountId, DataName: data2.Data.Data.DataName}, } - datas, err := q.GetAccountDataByKeys(keys) + datas, err := q.GetAccountDataByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, datas, 2) @@ -79,21 +79,21 @@ func TestUpdateAccountData(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertAccountData(data1) + rows, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) modifiedData := data1 modifiedData.Data.Data.DataValue[0] = 1 - rows, err = q.UpdateAccountData(modifiedData) + rows, err = q.UpdateAccountData(tt.Ctx, modifiedData) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) keys := []xdr.LedgerKeyData{ {AccountId: data1.Data.Data.AccountId, DataName: data1.Data.Data.DataName}, } - datas, err := q.GetAccountDataByKeys(keys) + datas, err := q.GetAccountDataByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, datas, 1) @@ -108,21 +108,21 @@ func TestRemoveAccountData(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertAccountData(data1) + rows, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) key := xdr.LedgerKeyData{AccountId: data1.Data.Data.AccountId, DataName: data1.Data.Data.DataName} - rows, err = q.RemoveAccountData(key) + rows, err = q.RemoveAccountData(tt.Ctx, key) assert.NoError(t, err) tt.Assert.Equal(int64(1), rows) - datas, err := q.GetAccountDataByKeys([]xdr.LedgerKeyData{key}) + datas, err := q.GetAccountDataByKeys(tt.Ctx, []xdr.LedgerKeyData{key}) assert.NoError(t, err) assert.Len(t, datas, 0) // Doesn't exist anymore - rows, err = q.RemoveAccountData(key) + rows, err = q.RemoveAccountData(tt.Ctx, key) assert.NoError(t, err) tt.Assert.Equal(int64(0), rows) } @@ -133,16 +133,16 @@ func TestGetAccountDataByAccountsID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.InsertAccountData(data1) + _, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) - _, err = q.InsertAccountData(data2) + _, err = q.InsertAccountData(tt.Ctx, data2) assert.NoError(t, err) ids := []string{ data1.Data.Data.AccountId.Address(), data2.Data.Data.AccountId.Address(), } - datas, err := q.GetAccountDataByAccountsID(ids) + datas, err := q.GetAccountDataByAccountsID(tt.Ctx, ids) assert.NoError(t, err) assert.Len(t, datas, 2) @@ -159,12 +159,12 @@ func TestGetAccountDataByAccountID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.InsertAccountData(data1) + _, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) - _, err = q.InsertAccountData(data2) + _, err = q.InsertAccountData(tt.Ctx, data2) assert.NoError(t, err) - records, err := q.GetAccountDataByAccountID(data1.Data.Data.AccountId.Address()) + records, err := q.GetAccountDataByAccountID(tt.Ctx, data1.Data.Data.AccountId.Address()) assert.NoError(t, err) assert.Len(t, records, 2) @@ -181,17 +181,17 @@ func TestGetAccountDataByName(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.InsertAccountData(data1) + _, err := q.InsertAccountData(tt.Ctx, data1) assert.NoError(t, err) - _, err = q.InsertAccountData(data2) + _, err = q.InsertAccountData(tt.Ctx, data2) assert.NoError(t, err) - record, err := q.GetAccountDataByName(data1.Data.Data.AccountId.Address(), string(data1.Data.Data.DataName)) + record, err := q.GetAccountDataByName(tt.Ctx, data1.Data.Data.AccountId.Address(), string(data1.Data.Data.DataName)) assert.NoError(t, err) tt.Assert.Equal(data1.Data.Data.DataName, xdr.String64(record.Name)) tt.Assert.Equal([]byte(data1.Data.Data.DataValue), []byte(record.Value)) - record, err = q.GetAccountDataByName(data1.Data.Data.AccountId.Address(), string(data2.Data.Data.DataName)) + record, err = q.GetAccountDataByName(tt.Ctx, data1.Data.Data.AccountId.Address(), string(data2.Data.Data.DataName)) assert.NoError(t, err) tt.Assert.Equal(data2.Data.Data.DataName, xdr.String64(record.Name)) tt.Assert.Equal([]byte(data2.Data.Data.DataValue), []byte(record.Value)) diff --git a/services/horizon/internal/db2/history/account_signers.go b/services/horizon/internal/db2/history/account_signers.go index bcc6b00cf1..32c6cdc583 100644 --- a/services/horizon/internal/db2/history/account_signers.go +++ b/services/horizon/internal/db2/history/account_signers.go @@ -1,31 +1,33 @@ package history import ( + "context" + sq "github.com/Masterminds/squirrel" "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/support/errors" ) -func (q *Q) GetAccountSignersByAccountID(id string) ([]AccountSigner, error) { +func (q *Q) GetAccountSignersByAccountID(ctx context.Context, id string) ([]AccountSigner, error) { sql := selectAccountSigners. Where(sq.Eq{"accounts_signers.account_id": id}). OrderBy("accounts_signers.signer asc") var results []AccountSigner - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } return results, nil } -func (q *Q) SignersForAccounts(accounts []string) ([]AccountSigner, error) { +func (q *Q) SignersForAccounts(ctx context.Context, accounts []string) ([]AccountSigner, error) { sql := selectAccountSigners. Where(map[string]interface{}{"accounts_signers.account_id": accounts}) var results []AccountSigner - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -33,7 +35,7 @@ func (q *Q) SignersForAccounts(accounts []string) ([]AccountSigner, error) { } // AccountsForSigner returns a list of `AccountSigner` rows for a given signer -func (q *Q) AccountsForSigner(signer string, page db2.PageQuery) ([]AccountSigner, error) { +func (q *Q) AccountsForSigner(ctx context.Context, signer string, page db2.PageQuery) ([]AccountSigner, error) { sql := selectAccountSigners.Where("accounts_signers.signer = ?", signer) sql, err := page.ApplyToUsingCursor(sql, "accounts_signers.account_id", page.Cursor) if err != nil { @@ -41,7 +43,7 @@ func (q *Q) AccountsForSigner(signer string, page db2.PageQuery) ([]AccountSigne } var results []AccountSigner - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -50,12 +52,12 @@ func (q *Q) AccountsForSigner(signer string, page db2.PageQuery) ([]AccountSigne // CreateAccountSigner creates a row in the accounts_signers table. // Returns number of rows affected and error. -func (q *Q) CreateAccountSigner(account, signer string, weight int32, sponsor *string) (int64, error) { +func (q *Q) CreateAccountSigner(ctx context.Context, account, signer string, weight int32, sponsor *string) (int64, error) { sql := sq.Insert("accounts_signers"). Columns("account_id", "signer", "weight", "sponsor"). Values(account, signer, weight, sponsor) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -65,13 +67,13 @@ func (q *Q) CreateAccountSigner(account, signer string, weight int32, sponsor *s // RemoveAccountSigner deletes a row in the accounts_signers table. // Returns number of rows affected and error. -func (q *Q) RemoveAccountSigner(account, signer string) (int64, error) { +func (q *Q) RemoveAccountSigner(ctx context.Context, account, signer string) (int64, error) { sql := sq.Delete("accounts_signers").Where(sq.Eq{ "account_id": account, "signer": signer, }) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } diff --git a/services/horizon/internal/db2/history/account_signers_batch_insert_builder.go b/services/horizon/internal/db2/history/account_signers_batch_insert_builder.go index 203b84288b..fd1cab291c 100644 --- a/services/horizon/internal/db2/history/account_signers_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/account_signers_batch_insert_builder.go @@ -1,7 +1,11 @@ package history -func (i *accountSignersBatchInsertBuilder) Add(signer AccountSigner) error { - return i.builder.Row(map[string]interface{}{ +import ( + "context" +) + +func (i *accountSignersBatchInsertBuilder) Add(ctx context.Context, signer AccountSigner) error { + return i.builder.Row(ctx, map[string]interface{}{ "account_id": signer.Account, "signer": signer.Signer, "weight": signer.Weight, @@ -9,6 +13,6 @@ func (i *accountSignersBatchInsertBuilder) Add(signer AccountSigner) error { }) } -func (i *accountSignersBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *accountSignersBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/account_signers_test.go b/services/horizon/internal/db2/history/account_signers_test.go index 31d2ea87c5..bf4183396b 100644 --- a/services/horizon/internal/db2/history/account_signers_test.go +++ b/services/horizon/internal/db2/history/account_signers_test.go @@ -15,7 +15,7 @@ func TestQueryEmptyAccountSigners(t *testing.T) { q := &Q{tt.HorizonSession()} signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO0" - results, err := q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err := q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 0) } @@ -29,7 +29,7 @@ func TestInsertAccountSigner(t *testing.T) { account := "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2" signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4" weight := int32(123) - rowsAffected, err := q.CreateAccountSigner(account, signer, weight, nil) + rowsAffected, err := q.CreateAccountSigner(tt.Ctx, account, signer, weight, nil) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) @@ -38,13 +38,13 @@ func TestInsertAccountSigner(t *testing.T) { Signer: signer, Weight: weight, } - results, err := q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err := q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 1) tt.Assert.Equal(expected, results[0]) weight = 321 - _, err = q.CreateAccountSigner(account, signer, weight, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account, signer, weight, nil) tt.Assert.Error(err) tt.Assert.EqualError(err, `exec failed: pq: duplicate key value violates unique constraint "accounts_signers_pkey"`) } @@ -59,7 +59,7 @@ func TestInsertAccountSignerSponsor(t *testing.T) { signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4" weight := int32(123) sponsor := "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H" - rowsAffected, err := q.CreateAccountSigner(account, signer, weight, &sponsor) + rowsAffected, err := q.CreateAccountSigner(tt.Ctx, account, signer, weight, &sponsor) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) @@ -69,7 +69,7 @@ func TestInsertAccountSignerSponsor(t *testing.T) { Weight: weight, Sponsor: null.StringFrom(sponsor), } - results, err := q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err := q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 1) tt.Assert.Equal(expected, results[0]) @@ -84,13 +84,13 @@ func TestMultipleAccountsForSigner(t *testing.T) { account := "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH1" signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO2" weight := int32(123) - rowsAffected, err := q.CreateAccountSigner(account, signer, weight, nil) + rowsAffected, err := q.CreateAccountSigner(tt.Ctx, account, signer, weight, nil) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) anotherAccount := "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H" anotherWeight := int32(321) - rowsAffected, err = q.CreateAccountSigner(anotherAccount, signer, anotherWeight, nil) + rowsAffected, err = q.CreateAccountSigner(tt.Ctx, anotherAccount, signer, anotherWeight, nil) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) @@ -106,7 +106,7 @@ func TestMultipleAccountsForSigner(t *testing.T) { Weight: anotherWeight, }, } - results, err := q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err := q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 2) tt.Assert.Equal(expected, results) @@ -120,7 +120,7 @@ func TestRemoveNonExistantAccountSigner(t *testing.T) { account := "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH3" signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO5" - rowsAffected, err := q.RemoveAccountSigner(account, signer) + rowsAffected, err := q.RemoveAccountSigner(tt.Ctx, account, signer) tt.Assert.NoError(err) tt.Assert.Equal(int64(0), rowsAffected) } @@ -134,7 +134,7 @@ func TestRemoveAccountSigner(t *testing.T) { account := "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH6" signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO7" weight := int32(123) - _, err := q.CreateAccountSigner(account, signer, weight, nil) + _, err := q.CreateAccountSigner(tt.Ctx, account, signer, weight, nil) tt.Assert.NoError(err) expected := AccountSigner{ @@ -142,16 +142,16 @@ func TestRemoveAccountSigner(t *testing.T) { Signer: signer, Weight: weight, } - results, err := q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err := q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 1) tt.Assert.Equal(expected, results[0]) - rowsAffected, err := q.RemoveAccountSigner(account, signer) + rowsAffected, err := q.RemoveAccountSigner(tt.Ctx, account, signer) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) - results, err = q.AccountsForSigner(signer, db2.PageQuery{Order: "asc", Limit: 10}) + results, err = q.AccountsForSigner(tt.Ctx, signer, db2.PageQuery{Order: "asc", Limit: 10}) tt.Assert.NoError(err) tt.Assert.Len(results, 0) } @@ -165,13 +165,13 @@ func TestGetAccountSignersByAccountID(t *testing.T) { account := "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH6" signer := "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO7" weight := int32(123) - _, err := q.CreateAccountSigner(account, signer, weight, nil) + _, err := q.CreateAccountSigner(tt.Ctx, account, signer, weight, nil) tt.Assert.NoError(err) signer2 := "GC2WJF6YWMAEHGGAK2UOMZCIOMH4RU7KY2CQEWZQJV2ZQJVXJ335ZSXG" weight2 := int32(100) sponsor := "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H" - _, err = q.CreateAccountSigner(account, signer2, weight2, &sponsor) + _, err = q.CreateAccountSigner(tt.Ctx, account, signer2, weight2, &sponsor) tt.Assert.NoError(err) expected := []AccountSigner{ @@ -187,7 +187,7 @@ func TestGetAccountSignersByAccountID(t *testing.T) { Sponsor: null.StringFrom(sponsor), }, } - results, err := q.GetAccountSignersByAccountID(account) + results, err := q.GetAccountSignersByAccountID(tt.Ctx, account) tt.Assert.NoError(err) tt.Assert.Len(results, 2) tt.Assert.Equal(expected, results) diff --git a/services/horizon/internal/db2/history/account_test.go b/services/horizon/internal/db2/history/account_test.go index 1e69aea215..c74571c4b6 100644 --- a/services/horizon/internal/db2/history/account_test.go +++ b/services/horizon/internal/db2/history/account_test.go @@ -60,7 +60,7 @@ func TestCreateAccountsSortedOrder(t *testing.T) { "GBYSBDAJZMHL5AMD7QXQ3JEP3Q4GLKADWIJURAAHQALNAWD6Z5XF2RAC", "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", } - accounts, err := q.CreateAccounts(addresses, 1) + accounts, err := q.CreateAccounts(tt.Ctx, addresses, 1) tt.Assert.NoError(err) idToAddress := map[int64]string{} @@ -93,12 +93,12 @@ func TestCreateAccounts(t *testing.T) { "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", } - accounts, err := q.CreateAccounts(addresses, 1) + accounts, err := q.CreateAccounts(tt.Ctx, addresses, 1) tt.Assert.NoError(err) tt.Assert.Len(accounts, 2) assertAccountsContainAddresses(tt, accounts, addresses) - dupAccounts, err := q.CreateAccounts([]string{ + dupAccounts, err := q.CreateAccounts(tt.Ctx, []string{ "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", }, 2) @@ -111,7 +111,7 @@ func TestCreateAccounts(t *testing.T) { "GCYVFGI3SEQJGBNQQG7YCMFWEYOHK3XPVOVPA6C566PXWN4SN7LILZSM", "GBYSBDAJZMHL5AMD7QXQ3JEP3Q4GLKADWIJURAAHQALNAWD6Z5XF2RAC", } - accounts, err = q.CreateAccounts(addresses, 1) + accounts, err = q.CreateAccounts(tt.Ctx, addresses, 1) tt.Assert.NoError(err) assertAccountsContainAddresses(tt, accounts, addresses) for address, accountID := range dupAccounts { diff --git a/services/horizon/internal/db2/history/accounts.go b/services/horizon/internal/db2/history/accounts.go index 250139dcce..73cb182618 100644 --- a/services/horizon/internal/db2/history/accounts.go +++ b/services/horizon/internal/db2/history/accounts.go @@ -1,6 +1,8 @@ package history import ( + "context" + sq "github.com/Masterminds/squirrel" "github.com/guregu/null" "github.com/lib/pq" @@ -34,28 +36,28 @@ func (account AccountEntry) IsAuthClawbackEnabled() bool { return xdr.AccountFlags(account.Flags).IsAuthClawbackEnabled() } -func (q *Q) CountAccounts() (int, error) { +func (q *Q) CountAccounts(ctx context.Context) (int, error) { sql := sq.Select("count(*)").From("accounts") var count int - if err := q.Get(&count, sql); err != nil { + if err := q.Get(ctx, &count, sql); err != nil { return 0, errors.Wrap(err, "could not run select query") } return count, nil } -func (q *Q) GetAccountByID(id string) (AccountEntry, error) { +func (q *Q) GetAccountByID(ctx context.Context, id string) (AccountEntry, error) { var account AccountEntry sql := selectAccounts.Where(sq.Eq{"account_id": id}) - err := q.Get(&account, sql) + err := q.Get(ctx, &account, sql) return account, err } -func (q *Q) GetAccountsByIDs(ids []string) ([]AccountEntry, error) { +func (q *Q) GetAccountsByIDs(ctx context.Context, ids []string) ([]AccountEntry, error) { var accounts []AccountEntry sql := selectAccounts.Where(map[string]interface{}{"accounts.account_id": ids}) - err := q.Select(&accounts, sql) + err := q.Select(ctx, &accounts, sql) return accounts, err } @@ -93,7 +95,7 @@ func accountToMap(entry xdr.LedgerEntry) map[string]interface{} { // There's currently no limit of the number of accounts this method can // accept other than 2GB limit of the query string length what should be enough // for each ledger with the current limits. -func (q *Q) UpsertAccounts(accounts []xdr.LedgerEntry) error { +func (q *Q) UpsertAccounts(ctx context.Context, accounts []xdr.LedgerEntry) error { var accountID, inflationDestination []string var homeDomain []xdr.String32 var balance, buyingLiabilities, sellingLiabilities []xdr.Int64 @@ -187,7 +189,9 @@ func (q *Q) UpsertAccounts(accounts []xdr.LedgerEntry) error { num_sponsored = excluded.num_sponsored, num_sponsoring = excluded.num_sponsoring` - _, err := q.ExecRaw(sql, + _, err := q.ExecRaw( + ctx, + sql, pq.Array(accountID), pq.Array(balance), pq.Array(buyingLiabilities), @@ -211,9 +215,9 @@ func (q *Q) UpsertAccounts(accounts []xdr.LedgerEntry) error { // RemoveAccount deletes a row in the accounts table. // Returns number of rows affected and error. -func (q *Q) RemoveAccount(accountID string) (int64, error) { +func (q *Q) RemoveAccount(ctx context.Context, accountID string) (int64, error) { sql := sq.Delete("accounts").Where(sq.Eq{"account_id": accountID}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -223,7 +227,7 @@ func (q *Q) RemoveAccount(accountID string) (int64, error) { // AccountsForAsset returns a list of `AccountEntry` rows who are trustee to an // asset -func (q *Q) AccountsForAsset(asset xdr.Asset, page db2.PageQuery) ([]AccountEntry, error) { +func (q *Q) AccountsForAsset(ctx context.Context, asset xdr.Asset, page db2.PageQuery) ([]AccountEntry, error) { var assetType, code, issuer string asset.MustExtract(&assetType, &code, &issuer) @@ -243,7 +247,7 @@ func (q *Q) AccountsForAsset(asset xdr.Asset, page db2.PageQuery) ([]AccountEntr } var results []AccountEntry - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -296,7 +300,7 @@ func selectUnionBySponsor(tables []string, sponsor string, page db2.PageQuery) ( // AccountsForSponsor return all the accounts where `sponsor`` is sponsoring the account entry or // any of its subentries (trust lines, signers, data, or account entry) -func (q *Q) AccountsForSponsor(sponsor string, page db2.PageQuery) ([]AccountEntry, error) { +func (q *Q) AccountsForSponsor(ctx context.Context, sponsor string, page db2.PageQuery) ([]AccountEntry, error) { sql, err := selectUnionBySponsor( []string{"accounts", "accounts_data", "accounts_signers", "trust_lines"}, sponsor, @@ -307,7 +311,7 @@ func (q *Q) AccountsForSponsor(sponsor string, page db2.PageQuery) ([]AccountEnt } var results []AccountEntry - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -315,7 +319,7 @@ func (q *Q) AccountsForSponsor(sponsor string, page db2.PageQuery) ([]AccountEnt } // AccountEntriesForSigner returns a list of `AccountEntry` rows for a given signer -func (q *Q) AccountEntriesForSigner(signer string, page db2.PageQuery) ([]AccountEntry, error) { +func (q *Q) AccountEntriesForSigner(ctx context.Context, signer string, page db2.PageQuery) ([]AccountEntry, error) { sql := sq. Select("accounts.*"). From("accounts"). @@ -330,7 +334,7 @@ func (q *Q) AccountEntriesForSigner(signer string, page db2.PageQuery) ([]Accoun } var results []AccountEntry - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } diff --git a/services/horizon/internal/db2/history/accounts_batch_insert_builder.go b/services/horizon/internal/db2/history/accounts_batch_insert_builder.go index b3ed471674..7c4e0abddc 100644 --- a/services/horizon/internal/db2/history/accounts_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/accounts_batch_insert_builder.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/db" "github.com/stellar/go/xdr" ) @@ -10,10 +12,10 @@ type accountsBatchInsertBuilder struct { builder db.BatchInsertBuilder } -func (i *accountsBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { - return i.builder.Row(accountToMap(entry)) +func (i *accountsBatchInsertBuilder) Add(ctx context.Context, entry xdr.LedgerEntry) error { + return i.builder.Row(ctx, accountToMap(entry)) } -func (i *accountsBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *accountsBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/accounts_test.go b/services/horizon/internal/db2/history/accounts_test.go index b2eca16453..c8a6f0b2da 100644 --- a/services/horizon/internal/db2/history/accounts_test.go +++ b/services/horizon/internal/db2/history/accounts_test.go @@ -111,13 +111,13 @@ func TestInsertAccount(t *testing.T) { q := &Q{tt.HorizonSession()} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - accounts, err := q.GetAccountsByIDs([]string{ + accounts, err := q.GetAccountsByIDs(tt.Ctx, []string{ "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", "GCT2NQM5KJJEF55NPMY444C6M6CA7T33HRNCMA6ZFBIIXKNCRO6J25K7", }) @@ -153,7 +153,7 @@ func TestUpsertAccount(t *testing.T) { q := &Q{tt.HorizonSession()} ledgerEntries := []xdr.LedgerEntry{account1, account2} - err := q.UpsertAccounts(ledgerEntries) + err := q.UpsertAccounts(tt.Ctx, ledgerEntries) assert.NoError(t, err) modifiedAccount := xdr.LedgerEntry{ @@ -182,14 +182,14 @@ func TestUpsertAccount(t *testing.T) { }, } - err = q.UpsertAccounts([]xdr.LedgerEntry{modifiedAccount}) + err = q.UpsertAccounts(tt.Ctx, []xdr.LedgerEntry{modifiedAccount}) assert.NoError(t, err) keys := []string{ account1.Data.Account.AccountId.Address(), account2.Data.Account.AccountId.Address(), } - accounts, err := q.GetAccountsByIDs(keys) + accounts, err := q.GetAccountsByIDs(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, accounts, 2) @@ -201,7 +201,7 @@ func TestUpsertAccount(t *testing.T) { assert.Equal(t, uint32(0), accounts[1].NumSponsoring) assert.Equal(t, null.String{}, accounts[1].Sponsor) - accounts, err = q.GetAccountsByIDs([]string{account1.Data.Account.AccountId.Address()}) + accounts, err = q.GetAccountsByIDs(tt.Ctx, []string{account1.Data.Account.AccountId.Address()}) assert.NoError(t, err) assert.Len(t, accounts, 1) @@ -238,7 +238,7 @@ func TestUpsertAccount(t *testing.T) { assert.Equal(t, expectedBinary, actualBinary) assert.Equal(t, uint32(1234), accounts[0].LastModifiedLedger) - accounts, err = q.GetAccountsByIDs([]string{account2.Data.Account.AccountId.Address()}) + accounts, err = q.GetAccountsByIDs(tt.Ctx, []string{account2.Data.Account.AccountId.Address()}) assert.NoError(t, err) assert.Len(t, accounts, 1) @@ -283,21 +283,21 @@ func TestRemoveAccount(t *testing.T) { q := &Q{tt.HorizonSession()} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) var rows int64 - rows, err = q.RemoveAccount("GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB") + rows, err = q.RemoveAccount(tt.Ctx, "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB") assert.NoError(t, err) assert.Equal(t, int64(1), rows) - accounts, err := q.GetAccountsByIDs([]string{"GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB"}) + accounts, err := q.GetAccountsByIDs(tt.Ctx, []string{"GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB"}) assert.NoError(t, err) assert.Len(t, accounts, 0) // Doesn't exist anymore - rows, err = q.RemoveAccount("GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB") + rows, err = q.RemoveAccount(tt.Ctx, "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB") assert.NoError(t, err) assert.Equal(t, int64(0), rows) } @@ -312,15 +312,15 @@ func TestAccountsForAsset(t *testing.T) { usdTrustLine.Data.TrustLine.AccountId = account2.Data.Account.AccountId batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - _, err = q.InsertTrustLine(eurTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(usdTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) tt.Assert.NoError(err) pq := db2.PageQuery{ @@ -329,18 +329,18 @@ func TestAccountsForAsset(t *testing.T) { Cursor: "", } - accounts, err := q.AccountsForAsset(eurTrustLine.Data.TrustLine.Asset, pq) + accounts, err := q.AccountsForAsset(tt.Ctx, eurTrustLine.Data.TrustLine.Asset, pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) tt.Assert.Equal(account1.Data.Account.AccountId.Address(), accounts[0].AccountID) - accounts, err = q.AccountsForAsset(usdTrustLine.Data.TrustLine.Asset, pq) + accounts, err = q.AccountsForAsset(tt.Ctx, usdTrustLine.Data.TrustLine.Asset, pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) tt.Assert.Equal(account2.Data.Account.AccountId.Address(), accounts[0].AccountID) pq.Cursor = account2.Data.Account.AccountId.Address() - accounts, err = q.AccountsForAsset(usdTrustLine.Data.TrustLine.Asset, pq) + accounts, err = q.AccountsForAsset(tt.Ctx, usdTrustLine.Data.TrustLine.Asset, pq) assert.NoError(t, err) tt.Assert.Len(accounts, 0) @@ -350,7 +350,7 @@ func TestAccountsForAsset(t *testing.T) { Cursor: "", } - accounts, err = q.AccountsForAsset(eurTrustLine.Data.TrustLine.Asset, pq) + accounts, err = q.AccountsForAsset(tt.Ctx, eurTrustLine.Data.TrustLine.Asset, pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) } @@ -365,28 +365,28 @@ func TestAccountsForSponsor(t *testing.T) { usdTrustLine.Data.TrustLine.AccountId = account2.Data.Account.AccountId batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - err = batch.Add(account3) + err = batch.Add(tt.Ctx, account3) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - _, err = q.InsertTrustLine(eurTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(usdTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account1.Data.Account.AccountId.Address(), account1.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), account1.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account2.Data.Account.AccountId.Address(), account2.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account2.Data.Account.AccountId.Address(), account2.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account3.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account3.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account1.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account2.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account2.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) pq := db2.PageQuery{ @@ -395,7 +395,7 @@ func TestAccountsForSponsor(t *testing.T) { Cursor: "", } - accounts, err := q.AccountsForSponsor(sponsor.Address(), pq) + accounts, err := q.AccountsForSponsor(tt.Ctx, sponsor.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 2) tt.Assert.Equal(account1.Data.Account.AccountId.Address(), accounts[0].AccountID) @@ -412,28 +412,28 @@ func TestAccountEntriesForSigner(t *testing.T) { usdTrustLine.Data.TrustLine.AccountId = account2.Data.Account.AccountId batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - err = batch.Add(account3) + err = batch.Add(tt.Ctx, account3) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - _, err = q.InsertTrustLine(eurTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(usdTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account1.Data.Account.AccountId.Address(), account1.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), account1.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account2.Data.Account.AccountId.Address(), account2.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account2.Data.Account.AccountId.Address(), account2.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account3.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account3.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account1.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) - _, err = q.CreateAccountSigner(account2.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) + _, err = q.CreateAccountSigner(tt.Ctx, account2.Data.Account.AccountId.Address(), account3.Data.Account.AccountId.Address(), 1, nil) tt.Assert.NoError(err) pq := db2.PageQuery{ @@ -442,12 +442,12 @@ func TestAccountEntriesForSigner(t *testing.T) { Cursor: "", } - accounts, err := q.AccountEntriesForSigner(account1.Data.Account.AccountId.Address(), pq) + accounts, err := q.AccountEntriesForSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) tt.Assert.Equal(account1.Data.Account.AccountId.Address(), accounts[0].AccountID) - accounts, err = q.AccountEntriesForSigner(account2.Data.Account.AccountId.Address(), pq) + accounts, err = q.AccountEntriesForSigner(tt.Ctx, account2.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) tt.Assert.Equal(account2.Data.Account.AccountId.Address(), accounts[0].AccountID) @@ -458,7 +458,7 @@ func TestAccountEntriesForSigner(t *testing.T) { account3.Data.Account.AccountId.Address(): true, } - accounts, err = q.AccountEntriesForSigner(account3.Data.Account.AccountId.Address(), pq) + accounts, err = q.AccountEntriesForSigner(tt.Ctx, account3.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 3) @@ -470,12 +470,12 @@ func TestAccountEntriesForSigner(t *testing.T) { tt.Assert.Len(want, 0) pq.Cursor = accounts[len(accounts)-1].AccountID - accounts, err = q.AccountEntriesForSigner(account3.Data.Account.AccountId.Address(), pq) + accounts, err = q.AccountEntriesForSigner(tt.Ctx, account3.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 0) pq.Order = "desc" - accounts, err = q.AccountEntriesForSigner(account3.Data.Account.AccountId.Address(), pq) + accounts, err = q.AccountEntriesForSigner(tt.Ctx, account3.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 2) @@ -485,7 +485,7 @@ func TestAccountEntriesForSigner(t *testing.T) { Cursor: "", } - accounts, err = q.AccountEntriesForSigner(account1.Data.Account.AccountId.Address(), pq) + accounts, err = q.AccountEntriesForSigner(tt.Ctx, account1.Data.Account.AccountId.Address(), pq) assert.NoError(t, err) tt.Assert.Len(accounts, 1) } @@ -497,11 +497,11 @@ func TestGetAccountByID(t *testing.T) { q := &Q{tt.HorizonSession()} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - resultAccount, err := q.GetAccountByID(account1.Data.Account.AccountId.Address()) + resultAccount, err := q.GetAccountByID(tt.Ctx, account1.Data.Account.AccountId.Address()) assert.NoError(t, err) assert.Equal(t, "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", resultAccount.AccountID) diff --git a/services/horizon/internal/db2/history/asset.go b/services/horizon/internal/db2/history/asset.go index 09bd34da50..f6a73b819e 100644 --- a/services/horizon/internal/db2/history/asset.go +++ b/services/horizon/internal/db2/history/asset.go @@ -1,6 +1,7 @@ package history import ( + "context" "sort" sq "github.com/Masterminds/squirrel" @@ -10,7 +11,7 @@ import ( ) // GetAssetID fetches the id for an Asset -func (q *Q) GetAssetID(asset xdr.Asset) (id int64, err error) { +func (q *Q) GetAssetID(ctx context.Context, asset xdr.Asset) (id int64, err error) { var ( assetType string assetCode string @@ -27,12 +28,12 @@ func (q *Q) GetAssetID(asset xdr.Asset) (id int64, err error) { "asset_code": assetCode, "asset_issuer": assetIssuer}) - err = q.Get(&id, sql) + err = q.Get(ctx, &id, sql) return } // CreateAssets creates rows in the history_assets table for a given list of assets. -func (q *Q) CreateAssets(assets []xdr.Asset, batchSize int) (map[string]Asset, error) { +func (q *Q) CreateAssets(ctx context.Context, assets []xdr.Asset, batchSize int) (map[string]Asset, error) { searchStrings := make([]string, 0, len(assets)) assetToKey := map[[3]string]string{} @@ -54,7 +55,7 @@ func (q *Q) CreateAssets(assets []xdr.Asset, batchSize int) (map[string]Asset, e return nil, errors.Wrap(err, "could not extract asset details") } - err = builder.Row(map[string]interface{}{ + err = builder.Row(ctx, map[string]interface{}{ "asset_type": assetType, "asset_code": assetCode, "asset_issuer": assetIssuer, @@ -74,7 +75,7 @@ func (q *Q) CreateAssets(assets []xdr.Asset, batchSize int) (map[string]Asset, e } } - err := builder.Exec() + err := builder.Exec(ctx) if err != nil { return nil, errors.Wrap(err, "could not exec asset insert builder") } @@ -89,7 +90,7 @@ func (q *Q) CreateAssets(assets []xdr.Asset, batchSize int) (map[string]Asset, e } subset := searchStrings[i:end] - err = q.Select(&rows, sq.Select("*").From("history_assets").Where(sq.Eq{ + err = q.Select(ctx, &rows, sq.Select("*").From("history_assets").Where(sq.Eq{ "concat(asset_type, '/', asset_code, '/', asset_issuer)": subset, })) if err != nil { diff --git a/services/horizon/internal/db2/history/asset_stats.go b/services/horizon/internal/db2/history/asset_stats.go index 81174b676a..e24f3fe887 100644 --- a/services/horizon/internal/db2/history/asset_stats.go +++ b/services/horizon/internal/db2/history/asset_stats.go @@ -1,6 +1,7 @@ package history import ( + "context" "fmt" "strings" @@ -32,19 +33,19 @@ func assetStatToPrimaryKeyMap(assetStat ExpAssetStat) map[string]interface{} { } // InsertAssetStats a set of asset stats into the exp_asset_stats -func (q *Q) InsertAssetStats(assetStats []ExpAssetStat, batchSize int) error { +func (q *Q) InsertAssetStats(ctx context.Context, assetStats []ExpAssetStat, batchSize int) error { builder := &db.BatchInsertBuilder{ Table: q.GetTable("exp_asset_stats"), MaxBatchSize: batchSize, } for _, assetStat := range assetStats { - if err := builder.Row(assetStatToMap(assetStat)); err != nil { + if err := builder.Row(ctx, assetStatToMap(assetStat)); err != nil { return errors.Wrap(err, "could not insert asset assetStat row") } } - if err := builder.Exec(); err != nil { + if err := builder.Exec(ctx); err != nil { return errors.Wrap(err, "could not exec asset assetStats insert builder") } @@ -53,9 +54,9 @@ func (q *Q) InsertAssetStats(assetStats []ExpAssetStat, batchSize int) error { // InsertAssetStat a single asset assetStat row into the exp_asset_stats // Returns number of rows affected and error. -func (q *Q) InsertAssetStat(assetStat ExpAssetStat) (int64, error) { +func (q *Q) InsertAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) { sql := sq.Insert("exp_asset_stats").SetMap(assetStatToMap(assetStat)) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -65,11 +66,11 @@ func (q *Q) InsertAssetStat(assetStat ExpAssetStat) (int64, error) { // UpdateAssetStat updates a row in the exp_asset_stats table. // Returns number of rows affected and error. -func (q *Q) UpdateAssetStat(assetStat ExpAssetStat) (int64, error) { +func (q *Q) UpdateAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) { sql := sq.Update("exp_asset_stats"). SetMap(assetStatToMap(assetStat)). Where(assetStatToPrimaryKeyMap(assetStat)) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -78,14 +79,14 @@ func (q *Q) UpdateAssetStat(assetStat ExpAssetStat) (int64, error) { } // RemoveAssetStat removes a row in the exp_asset_stats table. -func (q *Q) RemoveAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) { +func (q *Q) RemoveAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) { sql := sq.Delete("exp_asset_stats"). Where(map[string]interface{}{ "asset_type": assetType, "asset_code": assetCode, "asset_issuer": assetIssuer, }) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -94,14 +95,14 @@ func (q *Q) RemoveAssetStat(assetType xdr.AssetType, assetCode, assetIssuer stri } // GetAssetStat returns a row in the exp_asset_stats table. -func (q *Q) GetAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) { +func (q *Q) GetAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) { sql := selectAssetStats.Where(map[string]interface{}{ "asset_type": assetType, "asset_code": assetCode, "asset_issuer": assetIssuer, }) var assetStat ExpAssetStat - err := q.Get(&assetStat, sql) + err := q.Get(ctx, &assetStat, sql) return assetStat, err } @@ -137,7 +138,7 @@ func parseAssetStatsCursor(cursor string) (string, string, error) { } // GetAssetStats returns a page of exp_asset_stats rows. -func (q *Q) GetAssetStats(assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) { +func (q *Q) GetAssetStats(ctx context.Context, assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) { sql := selectAssetStats filters := map[string]interface{}{} if assetCode != "" { @@ -173,7 +174,7 @@ func (q *Q) GetAssetStats(assetCode, assetIssuer string, page db2.PageQuery) ([] sql = sql.OrderBy("(asset_code, asset_issuer) " + orderBy).Limit(page.Limit) var results []ExpAssetStat - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } diff --git a/services/horizon/internal/db2/history/asset_stats_test.go b/services/horizon/internal/db2/history/asset_stats_test.go index 63d478a583..9a813e4b4c 100644 --- a/services/horizon/internal/db2/history/asset_stats_test.go +++ b/services/horizon/internal/db2/history/asset_stats_test.go @@ -14,7 +14,7 @@ func TestInsertAssetStats(t *testing.T) { defer tt.Finish() test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - tt.Assert.NoError(q.InsertAssetStats([]ExpAssetStat{}, 1)) + tt.Assert.NoError(q.InsertAssetStats(tt.Ctx, []ExpAssetStat{}, 1)) assetStats := []ExpAssetStat{ { @@ -52,10 +52,10 @@ func TestInsertAssetStats(t *testing.T) { NumAccounts: 1, }, } - tt.Assert.NoError(q.InsertAssetStats(assetStats, 1)) + tt.Assert.NoError(q.InsertAssetStats(tt.Ctx, assetStats, 1)) for _, assetStat := range assetStats { - got, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) } @@ -105,11 +105,11 @@ func TestInsertAssetStat(t *testing.T) { } for _, assetStat := range assetStats { - numChanged, err := q.InsertAssetStat(assetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) - got, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) } @@ -139,23 +139,23 @@ func TestInsertAssetStatAlreadyExistsError(t *testing.T) { NumAccounts: 2, } - numChanged, err := q.InsertAssetStat(assetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) - numChanged, err = q.InsertAssetStat(assetStat) + numChanged, err = q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.Error(err) tt.Assert.Equal(numChanged, int64(0)) assetStat.NumAccounts = 4 assetStat.Amount = "3" - numChanged, err = q.InsertAssetStat(assetStat) + numChanged, err = q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.Error(err) tt.Assert.Equal(numChanged, int64(0)) assetStat.NumAccounts = 2 assetStat.Amount = "1" - got, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) } @@ -184,11 +184,11 @@ func TestUpdateAssetStatDoesNotExistsError(t *testing.T) { NumAccounts: 2, } - numChanged, err := q.UpdateAssetStat(assetStat) + numChanged, err := q.UpdateAssetStat(tt.Ctx, assetStat) tt.Assert.Nil(err) tt.Assert.Equal(numChanged, int64(0)) - _, err = q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + _, err = q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.Equal(err, sql.ErrNoRows) } @@ -217,22 +217,22 @@ func TestUpdateStat(t *testing.T) { NumAccounts: 2, } - numChanged, err := q.InsertAssetStat(assetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) - got, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) assetStat.NumAccounts = 50 assetStat.Amount = "23" - numChanged, err = q.UpdateAssetStat(assetStat) + numChanged, err = q.UpdateAssetStat(tt.Ctx, assetStat) tt.Assert.Nil(err) tt.Assert.Equal(numChanged, int64(1)) - got, err = q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err = q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) } @@ -261,7 +261,7 @@ func TestGetAssetStatDoesNotExist(t *testing.T) { NumAccounts: 2, } - _, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + _, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.Equal(err, sql.ErrNoRows) } @@ -290,7 +290,7 @@ func TestRemoveAssetStat(t *testing.T) { NumAccounts: 2, } - numChanged, err := q.RemoveAssetStat( + numChanged, err := q.RemoveAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer, @@ -298,15 +298,15 @@ func TestRemoveAssetStat(t *testing.T) { tt.Assert.Nil(err) tt.Assert.Equal(numChanged, int64(0)) - numChanged, err = q.InsertAssetStat(assetStat) + numChanged, err = q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) - got, err := q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + got, err := q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.NoError(err) tt.Assert.Equal(got, assetStat) - numChanged, err = q.RemoveAssetStat( + numChanged, err = q.RemoveAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer, @@ -314,7 +314,7 @@ func TestRemoveAssetStat(t *testing.T) { tt.Assert.Nil(err) tt.Assert.Equal(numChanged, int64(1)) - _, err = q.GetAssetStat(assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) + _, err = q.GetAssetStat(tt.Ctx, assetStat.AssetType, assetStat.AssetCode, assetStat.AssetIssuer) tt.Assert.Equal(err, sql.ErrNoRows) } @@ -367,7 +367,7 @@ func TestGetAssetStatsCursorValidation(t *testing.T) { Order: "asc", Limit: 5, } - results, err := q.GetAssetStats("", "", page) + results, err := q.GetAssetStats(tt.Ctx, "", "", page) tt.Assert.Empty(results) tt.Assert.NotNil(err) tt.Assert.Contains(err.Error(), testCase.expectedError) @@ -386,7 +386,7 @@ func TestGetAssetStatsOrderValidation(t *testing.T) { Order: "invalid", Limit: 5, } - results, err := q.GetAssetStats("", "", page) + results, err := q.GetAssetStats(tt.Ctx, "", "", page) tt.Assert.Empty(results) tt.Assert.NotNil(err) tt.Assert.Contains(err.Error(), "invalid page order") @@ -481,7 +481,7 @@ func TestGetAssetStatsFiltersAndCursor(t *testing.T) { usdAssetStat, } for _, assetStat := range assetStats { - numChanged, err := q.InsertAssetStat(assetStat) + numChanged, err := q.InsertAssetStat(tt.Ctx, assetStat) tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) } @@ -721,12 +721,12 @@ func TestGetAssetStatsFiltersAndCursor(t *testing.T) { Cursor: testCase.cursor, Limit: 5, } - results, err := q.GetAssetStats(testCase.assetCode, testCase.assetIssuer, page) + results, err := q.GetAssetStats(tt.Ctx, testCase.assetCode, testCase.assetIssuer, page) tt.Assert.NoError(err) tt.Assert.Equal(testCase.expected, results) page.Limit = 1 - results, err = q.GetAssetStats(testCase.assetCode, testCase.assetIssuer, page) + results, err = q.GetAssetStats(tt.Ctx, testCase.assetCode, testCase.assetIssuer, page) tt.Assert.NoError(err) if len(testCase.expected) == 0 { tt.Assert.Equal(testCase.expected, results) @@ -738,7 +738,7 @@ func TestGetAssetStatsFiltersAndCursor(t *testing.T) { page = page.Invert() page.Limit = 5 - results, err = q.GetAssetStats(testCase.assetCode, testCase.assetIssuer, page) + results, err = q.GetAssetStats(tt.Ctx, testCase.assetCode, testCase.assetIssuer, page) tt.Assert.NoError(err) reverseAssetStats(results) tt.Assert.Equal(testCase.expected, results) diff --git a/services/horizon/internal/db2/history/asset_test.go b/services/horizon/internal/db2/history/asset_test.go index c345c43805..9289f44622 100644 --- a/services/horizon/internal/db2/history/asset_test.go +++ b/services/horizon/internal/db2/history/asset_test.go @@ -18,7 +18,7 @@ func TestCreateAssetsSortedOrder(t *testing.T) { usdAsset, nativeAsset, eurAsset, xdr.MustNewCreditAsset("CNY", issuer.Address()), } - assetMap, err := q.CreateAssets( + assetMap, err := q.CreateAssets(tt.Ctx, assets, 2, ) @@ -61,7 +61,7 @@ func TestCreateAssets(t *testing.T) { assets := []xdr.Asset{ nativeAsset, eurAsset, } - assetMap, err := q.CreateAssets(assets, 1) + assetMap, err := q.CreateAssets(tt.Ctx, assets, 1) tt.Assert.NoError(err) tt.Assert.Len(assetMap, len(assets)) @@ -81,7 +81,7 @@ func TestCreateAssets(t *testing.T) { } // CreateAssets handles duplicates - assetMap, err = q.CreateAssets( + assetMap, err = q.CreateAssets(tt.Ctx, []xdr.Asset{ nativeAsset, nativeAsset, eurAsset, eurAsset, nativeAsset, nativeAsset, eurAsset, eurAsset, @@ -106,7 +106,7 @@ func TestCreateAssets(t *testing.T) { // CreateAssets handles duplicates and new rows assets = append(assets, usdAsset) - assetMap, err = q.CreateAssets(assets, 2) + assetMap, err = q.CreateAssets(tt.Ctx, assets, 2) tt.Assert.NoError(err) tt.Assert.Len(assetMap, len(assets)) diff --git a/services/horizon/internal/db2/history/claimable_balances.go b/services/horizon/internal/db2/history/claimable_balances.go index 8b020a3140..75757b5393 100644 --- a/services/horizon/internal/db2/history/claimable_balances.go +++ b/services/horizon/internal/db2/history/claimable_balances.go @@ -1,6 +1,7 @@ package history import ( + "context" "database/sql/driver" "encoding/json" "strconv" @@ -116,17 +117,17 @@ type Claimant struct { } type ClaimableBalancesBatchInsertBuilder interface { - Add(entry *xdr.LedgerEntry) error - Exec() error + Add(ctx context.Context, entry *xdr.LedgerEntry) error + Exec(ctx context.Context) error } // QClaimableBalances defines account related queries. type QClaimableBalances interface { NewClaimableBalancesBatchInsertBuilder(maxBatchSize int) ClaimableBalancesBatchInsertBuilder - UpdateClaimableBalance(entry xdr.LedgerEntry) (int64, error) - RemoveClaimableBalance(cBalance xdr.ClaimableBalanceEntry) (int64, error) - GetClaimableBalancesByID(ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) - CountClaimableBalances() (int, error) + UpdateClaimableBalance(ctx context.Context, entry xdr.LedgerEntry) (int64, error) + RemoveClaimableBalance(ctx context.Context, cBalance xdr.ClaimableBalanceEntry) (int64, error) + GetClaimableBalancesByID(ctx context.Context, ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) + CountClaimableBalances(ctx context.Context) (int, error) } // NewClaimableBalancesBatchInsertBuilder constructs a new ClaimableBalancesBatchInsertBuilder instance @@ -140,11 +141,11 @@ func (q *Q) NewClaimableBalancesBatchInsertBuilder(maxBatchSize int) ClaimableBa } // CountClaimableBalances returns the total number of claimable balances in the DB -func (q *Q) CountClaimableBalances() (int, error) { +func (q *Q) CountClaimableBalances(ctx context.Context) (int, error) { sql := sq.Select("count(*)").From("claimable_balances") var count int - if err := q.Get(&count, sql); err != nil { + if err := q.Get(ctx, &count, sql); err != nil { return 0, errors.Wrap(err, "could not run select query") } @@ -152,17 +153,17 @@ func (q *Q) CountClaimableBalances() (int, error) { } // GetClaimableBalancesByID finds all claimable balances by ClaimableBalanceId -func (q *Q) GetClaimableBalancesByID(ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) { +func (q *Q) GetClaimableBalancesByID(ctx context.Context, ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) { var cBalances []ClaimableBalance sql := selectClaimableBalances.Where(map[string]interface{}{"cb.id": ids}) - err := q.Select(&cBalances, sql) + err := q.Select(ctx, &cBalances, sql) return cBalances, err } // UpdateClaimableBalance updates a row in the claimable_balances table. // The only updatable value on claimable_balances is sponsor // Returns number of rows affected and error. -func (q *Q) UpdateClaimableBalance(entry xdr.LedgerEntry) (int64, error) { +func (q *Q) UpdateClaimableBalance(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { cBalance := entry.Data.MustClaimableBalance() cBalanceMap := map[string]interface{}{ "last_modified_ledger": entry.LastModifiedLedgerSeq, @@ -170,7 +171,7 @@ func (q *Q) UpdateClaimableBalance(entry xdr.LedgerEntry) (int64, error) { } sql := sq.Update("claimable_balances").SetMap(cBalanceMap).Where("id = ?", cBalance.BalanceId) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -180,10 +181,10 @@ func (q *Q) UpdateClaimableBalance(entry xdr.LedgerEntry) (int64, error) { // RemoveClaimableBalance deletes a row in the claimable_balances table. // Returns number of rows affected and error. -func (q *Q) RemoveClaimableBalance(cBalance xdr.ClaimableBalanceEntry) (int64, error) { +func (q *Q) RemoveClaimableBalance(ctx context.Context, cBalance xdr.ClaimableBalanceEntry) (int64, error) { sql := sq.Delete("claimable_balances"). Where(sq.Eq{"id": cBalance.BalanceId}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -192,15 +193,15 @@ func (q *Q) RemoveClaimableBalance(cBalance xdr.ClaimableBalanceEntry) (int64, e } // FindClaimableBalanceByID returns a claimable balance. -func (q *Q) FindClaimableBalanceByID(balanceID xdr.ClaimableBalanceId) (ClaimableBalance, error) { +func (q *Q) FindClaimableBalanceByID(ctx context.Context, balanceID xdr.ClaimableBalanceId) (ClaimableBalance, error) { var claimableBalance ClaimableBalance sql := selectClaimableBalances.Limit(1).Where("cb.id = ?", balanceID) - err := q.Get(&claimableBalance, sql) + err := q.Get(ctx, &claimableBalance, sql) return claimableBalance, err } // GetClaimableBalances finds all claimable balances where accountID is one of the claimants -func (q *Q) GetClaimableBalances(query ClaimableBalancesQuery) ([]ClaimableBalance, error) { +func (q *Q) GetClaimableBalances(ctx context.Context, query ClaimableBalancesQuery) ([]ClaimableBalance, error) { sql, err := query.ApplyCursor(selectClaimableBalances) if err != nil { return nil, errors.Wrap(err, "could not apply query to page") @@ -230,7 +231,7 @@ func (q *Q) GetClaimableBalances(query ClaimableBalancesQuery) ([]ClaimableBalan ) var results []ClaimableBalance - if err := q.Select(&results, sql); err != nil { + if err := q.Select(ctx, &results, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -254,7 +255,7 @@ func buildClaimants(claimants []xdr.Claimant) Claimants { return hClaimants } -func (i *claimableBalancesBatchInsertBuilder) Add(entry *xdr.LedgerEntry) error { +func (i *claimableBalancesBatchInsertBuilder) Add(ctx context.Context, entry *xdr.LedgerEntry) error { cBalance := entry.Data.MustClaimableBalance() row := ClaimableBalance{ BalanceID: cBalance.BalanceId, @@ -265,11 +266,11 @@ func (i *claimableBalancesBatchInsertBuilder) Add(entry *xdr.LedgerEntry) error LastModifiedLedger: uint32(entry.LastModifiedLedgerSeq), Flags: uint32(cBalance.Flags()), } - return i.builder.RowStruct(row) + return i.builder.RowStruct(ctx, row) } -func (i *claimableBalancesBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *claimableBalancesBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } var claimableBalancesSelectStatement = "cb.id, " + diff --git a/services/horizon/internal/db2/history/claimable_balances_batch_insert_builder_test.go b/services/horizon/internal/db2/history/claimable_balances_batch_insert_builder_test.go index 2ae97c9a38..c360fb1f61 100644 --- a/services/horizon/internal/db2/history/claimable_balances_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/claimable_balances_batch_insert_builder_test.go @@ -59,14 +59,14 @@ func TestAddClaimableBalance(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) cbs := []ClaimableBalance{} - err = q.Select(&cbs, selectClaimableBalances) + err = q.Select(tt.Ctx, &cbs, selectClaimableBalances) if tt.Assert.NoError(err) { tt.Assert.Len(cbs, 1) diff --git a/services/horizon/internal/db2/history/claimable_balances_test.go b/services/horizon/internal/db2/history/claimable_balances_test.go index 19fa573332..c95320757a 100644 --- a/services/horizon/internal/db2/history/claimable_balances_test.go +++ b/services/horizon/internal/db2/history/claimable_balances_test.go @@ -47,22 +47,22 @@ func TestRemoveClaimableBalance(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) - r, err := q.FindClaimableBalanceByID(cBalance.BalanceId) + r, err := q.FindClaimableBalanceByID(tt.Ctx, cBalance.BalanceId) tt.Assert.NoError(err) tt.Assert.NotNil(r) - removed, err := q.RemoveClaimableBalance(cBalance) + removed, err := q.RemoveClaimableBalance(tt.Ctx, cBalance) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), removed) cbs := []ClaimableBalance{} - err = q.Select(&cbs, selectClaimableBalances) + err = q.Select(tt.Ctx, &cbs, selectClaimableBalances) if tt.Assert.NoError(err) { tt.Assert.Len(cbs, 0) @@ -110,7 +110,7 @@ func TestFindClaimableBalancesByDestination(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) balanceID = xdr.ClaimableBalanceId{ @@ -150,10 +150,10 @@ func TestFindClaimableBalancesByDestination(t *testing.T) { LastModifiedLedgerSeq: lastModifiedLedgerSeq, } - err = builder.Add(&entry) + err = builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) query := ClaimableBalancesQuery{ @@ -161,7 +161,7 @@ func TestFindClaimableBalancesByDestination(t *testing.T) { Claimant: xdr.MustAddressPtr(dest1), } - cbs, err := q.GetClaimableBalances(query) + cbs, err := q.GetClaimableBalances(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(cbs, 2) @@ -170,7 +170,7 @@ func TestFindClaimableBalancesByDestination(t *testing.T) { } query.Claimant = xdr.MustAddressPtr(dest2) - cbs, err = q.GetClaimableBalances(query) + cbs, err = q.GetClaimableBalances(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(cbs, 1) tt.Assert.Equal(dest2, cbs[0].Claimants[1].Destination) @@ -215,10 +215,10 @@ func TestUpdateClaimableBalance(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(1) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) entry = xdr.LedgerEntry{ @@ -235,12 +235,12 @@ func TestUpdateClaimableBalance(t *testing.T) { }, } - updated, err := q.UpdateClaimableBalance(entry) + updated, err := q.UpdateClaimableBalance(tt.Ctx, entry) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), updated) cbs := []ClaimableBalance{} - err = q.Select(&cbs, selectClaimableBalances) + err = q.Select(tt.Ctx, &cbs, selectClaimableBalances) tt.Assert.NoError(err) tt.Assert.Equal("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", cbs[0].Sponsor.String) tt.Assert.Equal(uint32(lastModifiedLedgerSeq+1), cbs[0].LastModifiedLedger) @@ -285,13 +285,13 @@ func TestFindClaimableBalance(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) - cb, err := q.FindClaimableBalanceByID(cBalance.BalanceId) + cb, err := q.FindClaimableBalanceByID(tt.Ctx, cBalance.BalanceId) tt.Assert.NoError(err) tt.Assert.Equal(cBalance.BalanceId, cb.BalanceID) @@ -344,21 +344,21 @@ func TestGetClaimableBalancesByID(t *testing.T) { builder := q.NewClaimableBalancesBatchInsertBuilder(2) - err := builder.Add(&entry) + err := builder.Add(tt.Ctx, &entry) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) - r, err := q.GetClaimableBalancesByID([]xdr.ClaimableBalanceId{cBalance.BalanceId}) + r, err := q.GetClaimableBalancesByID(tt.Ctx, []xdr.ClaimableBalanceId{cBalance.BalanceId}) tt.Assert.NoError(err) tt.Assert.Len(r, 1) - removed, err := q.RemoveClaimableBalance(cBalance) + removed, err := q.RemoveClaimableBalance(tt.Ctx, cBalance) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), removed) - r, err = q.GetClaimableBalancesByID([]xdr.ClaimableBalanceId{cBalance.BalanceId}) + r, err = q.GetClaimableBalancesByID(tt.Ctx, []xdr.ClaimableBalanceId{cBalance.BalanceId}) tt.Assert.NoError(err) tt.Assert.Len(r, 0) } diff --git a/services/horizon/internal/db2/history/effect.go b/services/horizon/internal/db2/history/effect.go index 1a400a9250..efc24425da 100644 --- a/services/horizon/internal/db2/history/effect.go +++ b/services/horizon/internal/db2/history/effect.go @@ -1,6 +1,7 @@ package history import ( + "context" "encoding/json" "fmt" "math" @@ -48,9 +49,9 @@ func (q *Q) Effects() *EffectsQ { } // ForAccount filters the operations collection to a specific account -func (q *EffectsQ) ForAccount(aid string) *EffectsQ { +func (q *EffectsQ) ForAccount(ctx context.Context, aid string) *EffectsQ { var account Account - q.Err = q.parent.AccountByAddress(&account, aid) + q.Err = q.parent.AccountByAddress(ctx, &account, aid) if q.Err != nil { return q } @@ -62,9 +63,9 @@ func (q *EffectsQ) ForAccount(aid string) *EffectsQ { // ForLedger filters the query to only effects in a specific ledger, // specified by its sequence. -func (q *EffectsQ) ForLedger(seq int32) *EffectsQ { +func (q *EffectsQ) ForLedger(ctx context.Context, seq int32) *EffectsQ { var ledger Ledger - q.Err = q.parent.LedgerBySequence(&ledger, seq) + q.Err = q.parent.LedgerBySequence(ctx, &ledger, seq) if q.Err != nil { return q } @@ -97,9 +98,9 @@ func (q *EffectsQ) ForOperation(id int64) *EffectsQ { // ForTransaction filters the query to only effects in a specific // transaction, specified by the transactions's hex-encoded hash. -func (q *EffectsQ) ForTransaction(hash string) *EffectsQ { +func (q *EffectsQ) ForTransaction(ctx context.Context, hash string) *EffectsQ { var tx Transaction - q.Err = q.parent.TransactionByHash(&tx, hash) + q.Err = q.parent.TransactionByHash(ctx, &tx, hash) if q.Err != nil { return q } @@ -162,12 +163,12 @@ func (q *EffectsQ) Page(page db2.PageQuery) *EffectsQ { } // Select loads the results of the query specified by `q` into `dest`. -func (q *EffectsQ) Select(dest interface{}) error { +func (q *EffectsQ) Select(ctx context.Context, dest interface{}) error { if q.Err != nil { return q.Err } - q.Err = q.parent.Select(dest, q.sql) + q.Err = q.parent.Select(ctx, dest, q.sql) return q.Err } diff --git a/services/horizon/internal/db2/history/effect_batch_insert_builder.go b/services/horizon/internal/db2/history/effect_batch_insert_builder.go index 90c463a1e3..3a0bab6836 100644 --- a/services/horizon/internal/db2/history/effect_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/effect_batch_insert_builder.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/db" ) @@ -8,13 +10,14 @@ import ( // history_effects table type EffectBatchInsertBuilder interface { Add( + ctx context.Context, accountID int64, operationID int64, order uint32, effectType EffectType, details []byte, ) error - Exec() error + Exec(ctx context.Context) error } // effectBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -34,13 +37,14 @@ func (q *Q) NewEffectBatchInsertBuilder(maxBatchSize int) EffectBatchInsertBuild // Add adds a effect to the batch func (i *effectBatchInsertBuilder) Add( + ctx context.Context, accountID int64, operationID int64, order uint32, effectType EffectType, details []byte, ) error { - return i.builder.Row(map[string]interface{}{ + return i.builder.Row(ctx, map[string]interface{}{ "history_account_id": accountID, "history_operation_id": operationID, "\"order\"": order, @@ -49,6 +53,6 @@ func (i *effectBatchInsertBuilder) Add( }) } -func (i *effectBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *effectBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go b/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go index 213dd2399f..3e4ac3f83c 100644 --- a/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go @@ -15,7 +15,7 @@ func TestAddEffect(t *testing.T) { q := &Q{tt.HorizonSession()} address := "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON" - accounIDs, err := q.CreateAccounts([]string{address}, 1) + accounIDs, err := q.CreateAccounts(tt.Ctx, []string{address}, 1) tt.Assert.NoError(err) builder := q.NewEffectBatchInsertBuilder(2) @@ -25,7 +25,7 @@ func TestAddEffect(t *testing.T) { "asset_type": "native", }) - err = builder.Add( + err = builder.Add(tt.Ctx, accounIDs[address], toid.New(sequence, 1, 1).ToInt64(), 1, @@ -34,11 +34,11 @@ func TestAddEffect(t *testing.T) { ) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) effects := []Effect{} - tt.Assert.NoError(q.Effects().Select(&effects)) + tt.Assert.NoError(q.Effects().Select(tt.Ctx, &effects)) tt.Assert.Len(effects, 1) effect := effects[0] diff --git a/services/horizon/internal/db2/history/fee_bump_scenario.go b/services/horizon/internal/db2/history/fee_bump_scenario.go index fe2c843fff..e96acb7454 100644 --- a/services/horizon/internal/db2/history/fee_bump_scenario.go +++ b/services/horizon/internal/db2/history/fee_bump_scenario.go @@ -1,6 +1,7 @@ package history import ( + "context" "encoding/hex" "encoding/json" "testing" @@ -113,7 +114,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { } *fixture.Ledger.SuccessfulTransactionCount = 1 *fixture.Ledger.FailedTransactionCount = 0 - _, err := q.Exec(sq.Insert("history_ledgers").SetMap(ledgerToMap(fixture.Ledger))) + _, err := q.Exec(context.Background(), sq.Insert("history_ledgers").SetMap(ledgerToMap(fixture.Ledger))) tt.Assert.NoError(err) fixture.Envelope = xdr.TransactionEnvelope{ @@ -242,12 +243,13 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { metaXDR: "AAAAAQAAAAAAAAAA", hash: "edba3051b2f2d9b713e8a08709d631eccb72c59864ff3c564c68792271bb24a7", }) + ctx := context.Background() insertBuilder := q.NewTransactionBatchInsertBuilder(2) // include both fee bump and normal transaction in the same batch // to make sure both kinds of transactions can be inserted using a single exec statement - tt.Assert.NoError(insertBuilder.Add(feeBumpTransaction, sequence)) - tt.Assert.NoError(insertBuilder.Add(normalTransaction, sequence)) - tt.Assert.NoError(insertBuilder.Exec()) + tt.Assert.NoError(insertBuilder.Add(ctx, feeBumpTransaction, sequence)) + tt.Assert.NoError(insertBuilder.Add(ctx, normalTransaction, sequence)) + tt.Assert.NoError(insertBuilder.Exec(ctx)) account := fixture.Envelope.SourceAccount().ToAccountId() feeBumpAccount := fixture.Envelope.FeeBumpAccount().ToAccountId() @@ -259,6 +261,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { tt.Assert.NoError(err) tt.Assert.NoError(opBuilder.Add( + ctx, toid.New(fixture.Ledger.Sequence, 1, 1).ToInt64(), toid.New(fixture.Ledger.Sequence, 1, 0).ToInt64(), 1, @@ -266,16 +269,17 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { details, account.Address(), )) - tt.Assert.NoError(opBuilder.Exec()) + tt.Assert.NoError(opBuilder.Exec(ctx)) effectBuilder := q.NewEffectBatchInsertBuilder(2) details, err = json.Marshal(map[string]interface{}{"new_seq": 98}) tt.Assert.NoError(err) - accounIDs, err := q.CreateAccounts([]string{account.Address()}, 1) + accounIDs, err := q.CreateAccounts(ctx, []string{account.Address()}, 1) tt.Assert.NoError(err) err = effectBuilder.Add( + ctx, accounIDs[account.Address()], toid.New(fixture.Ledger.Sequence, 1, 1).ToInt64(), 1, @@ -283,7 +287,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { details, ) tt.Assert.NoError(err) - tt.Assert.NoError(effectBuilder.Exec()) + tt.Assert.NoError(effectBuilder.Exec(ctx)) fixture.Transaction = Transaction{ TransactionWithoutLedger: TransactionWithoutLedger{ @@ -333,7 +337,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { }, } - results, err := q.TransactionsByIDs(fixture.Transaction.ID, fixture.NormalTransaction.ID) + results, err := q.TransactionsByIDs(ctx, fixture.Transaction.ID, fixture.NormalTransaction.ID) tt.Assert.NoError(err) fixture.Transaction.CreatedAt = results[fixture.Transaction.ID].CreatedAt diff --git a/services/horizon/internal/db2/history/history_claimable_balances.go b/services/horizon/internal/db2/history/history_claimable_balances.go index c8d5527366..371323c5f9 100644 --- a/services/horizon/internal/db2/history/history_claimable_balances.go +++ b/services/horizon/internal/db2/history/history_claimable_balances.go @@ -2,6 +2,7 @@ package history import ( "bytes" + "context" "sort" sq "github.com/Masterminds/squirrel" @@ -13,14 +14,14 @@ import ( // QHistoryClaimableBalances defines account related queries. type QHistoryClaimableBalances interface { - CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, batchSize int) (map[string]int64, error) + CreateHistoryClaimableBalances(ctx context.Context, ids []xdr.ClaimableBalanceId, batchSize int) (map[string]int64, error) NewOperationClaimableBalanceBatchInsertBuilder(maxBatchSize int) OperationClaimableBalanceBatchInsertBuilder NewTransactionClaimableBalanceBatchInsertBuilder(maxBatchSize int) TransactionClaimableBalanceBatchInsertBuilder } // CreateHistoryClaimableBalances creates rows in the history_claimable_balances table for a given list of ids. // CreateHistoryClaimableBalances returns a mapping of id to its corresponding internal id in the history_claimable_balances table -func (q *Q) CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, batchSize int) (map[string]int64, error) { +func (q *Q) CreateHistoryClaimableBalances(ctx context.Context, ids []xdr.ClaimableBalanceId, batchSize int) (map[string]int64, error) { builder := &db.BatchInsertBuilder{ Table: q.GetTable("history_claimable_balances"), MaxBatchSize: batchSize, @@ -33,7 +34,7 @@ func (q *Q) CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, batchSi return bytes.Compare(ids[i].V0[:], ids[j].V0[:]) < 0 }) for _, id := range ids { - err := builder.Row(map[string]interface{}{ + err := builder.Row(ctx, map[string]interface{}{ "claimable_balance_id": id, }) if err != nil { @@ -41,7 +42,7 @@ func (q *Q) CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, batchSi } } - err := builder.Exec() + err := builder.Exec(ctx) if err != nil { return nil, errors.Wrap(err, "could not exec claimable balance insert builder") } @@ -57,7 +58,7 @@ func (q *Q) CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, batchSi } subset := ids[i:end] - cbs, err = q.ClaimableBalancesByIDs(subset) + cbs, err = q.ClaimableBalancesByIDs(ctx, subset) if err != nil { return nil, errors.Wrap(err, "could not select claimable balances") } @@ -83,24 +84,24 @@ type HistoryClaimableBalance struct { var selectHistoryClaimableBalance = sq.Select("hcb.*").From("history_claimable_balances hcb") // ClaimableBalancesByIDs loads rows from `history_claimable_balances`, by claimable_balance_id -func (q *Q) ClaimableBalancesByIDs(ids []xdr.ClaimableBalanceId) (dest []HistoryClaimableBalance, err error) { +func (q *Q) ClaimableBalancesByIDs(ctx context.Context, ids []xdr.ClaimableBalanceId) (dest []HistoryClaimableBalance, err error) { sql := selectHistoryClaimableBalance.Where(map[string]interface{}{ "hcb.claimable_balance_id": ids, // hcb.claimable_balance_id IN (...) }) - err = q.Select(&dest, sql) + err = q.Select(ctx, &dest, sql) return dest, err } // ClaimableBalanceByID loads a row from `history_claimable_balances`, by claimable_balance_id -func (q *Q) ClaimableBalanceByID(id xdr.ClaimableBalanceId) (dest HistoryClaimableBalance, err error) { +func (q *Q) ClaimableBalanceByID(ctx context.Context, id xdr.ClaimableBalanceId) (dest HistoryClaimableBalance, err error) { sql := selectHistoryClaimableBalance.Limit(1).Where("hcb.claimable_balance_id = ?", id) - err = q.Get(&dest, sql) + err = q.Get(ctx, &dest, sql) return dest, err } type OperationClaimableBalanceBatchInsertBuilder interface { - Add(operationID, internalID int64) error - Exec() error + Add(ctx context.Context, operationID, internalID int64) error + Exec(ctx context.Context) error } type operationClaimableBalanceBatchInsertBuilder struct { @@ -117,21 +118,21 @@ func (q *Q) NewOperationClaimableBalanceBatchInsertBuilder(maxBatchSize int) Ope } // Add adds a new operation claimable balance to the batch -func (i *operationClaimableBalanceBatchInsertBuilder) Add(operationID, internalID int64) error { - return i.builder.Row(map[string]interface{}{ +func (i *operationClaimableBalanceBatchInsertBuilder) Add(ctx context.Context, operationID, internalID int64) error { + return i.builder.Row(ctx, map[string]interface{}{ "history_operation_id": operationID, "history_claimable_balance_id": internalID, }) } // Exec flushes all pending operation claimable balances to the db -func (i *operationClaimableBalanceBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *operationClaimableBalanceBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } type TransactionClaimableBalanceBatchInsertBuilder interface { - Add(transactionID, internalID int64) error - Exec() error + Add(ctx context.Context, transactionID, internalID int64) error + Exec(ctx context.Context) error } type transactionClaimableBalanceBatchInsertBuilder struct { @@ -148,14 +149,14 @@ func (q *Q) NewTransactionClaimableBalanceBatchInsertBuilder(maxBatchSize int) T } // Add adds a new transaction claimable balance to the batch -func (i *transactionClaimableBalanceBatchInsertBuilder) Add(transactionID, internalID int64) error { - return i.builder.Row(map[string]interface{}{ +func (i *transactionClaimableBalanceBatchInsertBuilder) Add(ctx context.Context, transactionID, internalID int64) error { + return i.builder.Row(ctx, map[string]interface{}{ "history_transaction_id": transactionID, "history_claimable_balance_id": internalID, }) } // Exec flushes all pending transaction claimable balances to the db -func (i *transactionClaimableBalanceBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *transactionClaimableBalanceBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/ingestion.go b/services/horizon/internal/db2/history/ingestion.go index 686d7926b5..d88001e96f 100644 --- a/services/horizon/internal/db2/history/ingestion.go +++ b/services/horizon/internal/db2/history/ingestion.go @@ -1,12 +1,16 @@ package history +import ( + "context" +) + // TruncateIngestStateTables clears out ingestion state tables. // Ingestion state tables are horizon database tables populated by // the ingestion system using history archive snapshots. // Any horizon database tables which cannot be populated using // history archive snapshots will not be truncated. -func (q *Q) TruncateIngestStateTables() error { - return q.TruncateTables([]string{ +func (q *Q) TruncateIngestStateTables(ctx context.Context) error { + return q.TruncateTables(ctx, []string{ "accounts", "accounts_data", "accounts_signers", diff --git a/services/horizon/internal/db2/history/key_value.go b/services/horizon/internal/db2/history/key_value.go index 9214599b46..5a54ca73ea 100644 --- a/services/horizon/internal/db2/history/key_value.go +++ b/services/horizon/internal/db2/history/key_value.go @@ -1,6 +1,7 @@ package history import ( + "context" "database/sql" "strconv" @@ -22,8 +23,8 @@ const ( // it does not block the value and does not return error if the value // has not been previously set. // This is used in status reporting (ex. in root resource of Horizon). -func (q *Q) GetLastLedgerIngestNonBlocking() (uint32, error) { - lastIngestedLedger, err := q.getValueFromStore(lastLedgerKey, false) +func (q *Q) GetLastLedgerIngestNonBlocking(ctx context.Context) (uint32, error) { + lastIngestedLedger, err := q.getValueFromStore(ctx, lastLedgerKey, false) if err != nil { return 0, err } @@ -46,8 +47,8 @@ func (q *Q) GetLastLedgerIngestNonBlocking() (uint32, error) { // transactions.This behaviour is critical in distributed ingestion so do not change // it unless you know what you are doing. // The value can be set using UpdateLastLedgerIngest. -func (q *Q) GetLastLedgerIngest() (uint32, error) { - lastIngestedLedger, err := q.getValueFromStore(lastLedgerKey, true) +func (q *Q) GetLastLedgerIngest(ctx context.Context) (uint32, error) { + lastIngestedLedger, err := q.getValueFromStore(ctx, lastLedgerKey, true) if err != nil { return 0, err } @@ -68,8 +69,9 @@ func (q *Q) GetLastLedgerIngest() (uint32, error) { // UpdateLastLedgerIngest updates the last ledger ingested by ingest system. // Can be read using GetLastLedgerExpIngest. -func (q *Q) UpdateLastLedgerIngest(ledgerSequence uint32) error { +func (q *Q) UpdateLastLedgerIngest(ctx context.Context, ledgerSequence uint32) error { return q.updateValueInStore( + ctx, lastLedgerKey, strconv.FormatUint(uint64(ledgerSequence), 10), ) @@ -77,8 +79,8 @@ func (q *Q) UpdateLastLedgerIngest(ledgerSequence uint32) error { // GetIngestVersion returns the ingestion version. Returns zero // if there is no value. -func (q *Q) GetIngestVersion() (int, error) { - expVersion, err := q.getValueFromStore(ingestVersion, false) +func (q *Q) GetIngestVersion(ctx context.Context) (int, error) { + expVersion, err := q.getValueFromStore(ctx, ingestVersion, false) if err != nil { return 0, err } @@ -96,8 +98,9 @@ func (q *Q) GetIngestVersion() (int, error) { } // UpdateIngestVersion updates the ingestion version. -func (q *Q) UpdateIngestVersion(version int) error { +func (q *Q) UpdateIngestVersion(ctx context.Context, version int) error { return q.updateValueInStore( + ctx, ingestVersion, strconv.FormatUint(uint64(version), 10), ) @@ -105,8 +108,8 @@ func (q *Q) UpdateIngestVersion(version int) error { // GetExpStateInvalid returns true if the state was found to be invalid. // Returns false otherwise. -func (q *Q) GetExpStateInvalid() (bool, error) { - invalid, err := q.getValueFromStore(stateInvalid, false) +func (q *Q) GetExpStateInvalid(ctx context.Context) (bool, error) { + invalid, err := q.getValueFromStore(ctx, stateInvalid, false) if err != nil { return false, err } @@ -124,8 +127,9 @@ func (q *Q) GetExpStateInvalid() (bool, error) { } // UpdateExpStateInvalid updates the state invalid value. -func (q *Q) UpdateExpStateInvalid(val bool) error { +func (q *Q) UpdateExpStateInvalid(ctx context.Context, val bool) error { return q.updateValueInStore( + ctx, stateInvalid, strconv.FormatBool(val), ) @@ -133,8 +137,8 @@ func (q *Q) UpdateExpStateInvalid(val bool) error { // GetOfferCompactionSequence returns the sequence number corresponding to the // last time the offers table was compacted. -func (q *Q) GetOfferCompactionSequence() (uint32, error) { - sequence, err := q.getValueFromStore(offerCompactionSequence, false) +func (q *Q) GetOfferCompactionSequence(ctx context.Context) (uint32, error) { + sequence, err := q.getValueFromStore(ctx, offerCompactionSequence, false) if err != nil { return 0, err } @@ -152,8 +156,9 @@ func (q *Q) GetOfferCompactionSequence() (uint32, error) { // UpdateOfferCompactionSequence sets the sequence number corresponding to the // last time the offers table was compacted. -func (q *Q) UpdateOfferCompactionSequence(sequence uint32) error { +func (q *Q) UpdateOfferCompactionSequence(ctx context.Context, sequence uint32) error { return q.updateValueInStore( + ctx, offerCompactionSequence, strconv.FormatUint(uint64(sequence), 10), ) @@ -161,7 +166,7 @@ func (q *Q) UpdateOfferCompactionSequence(sequence uint32) error { // getValueFromStore returns a value for a given key from KV store. If value // is not present in the key value store "" will be returned. -func (q *Q) getValueFromStore(key string, forUpdate bool) (string, error) { +func (q *Q) getValueFromStore(ctx context.Context, key string, forUpdate bool) (string, error) { query := sq.Select("key_value_store.value"). From("key_value_store"). Where("key_value_store.key = ?", key) @@ -171,7 +176,7 @@ func (q *Q) getValueFromStore(key string, forUpdate bool) (string, error) { } var value string - if err := q.Get(&value, query); err != nil { + if err := q.Get(ctx, &value, query); err != nil { if errors.Cause(err) == sql.ErrNoRows { return "", nil } @@ -182,12 +187,12 @@ func (q *Q) getValueFromStore(key string, forUpdate bool) (string, error) { } // updateValueInStore updates a value for a given key in KV store -func (q *Q) updateValueInStore(key, value string) error { +func (q *Q) updateValueInStore(ctx context.Context, key, value string) error { query := sq.Insert("key_value_store"). Columns("key", "value"). Values(key, value). Suffix("ON CONFLICT (key) DO UPDATE SET value=EXCLUDED.value") - _, err := q.Exec(query) + _, err := q.Exec(ctx, query) return err } diff --git a/services/horizon/internal/db2/history/ledger.go b/services/horizon/internal/db2/history/ledger.go index ceb083e902..927295bd0d 100644 --- a/services/horizon/internal/db2/history/ledger.go +++ b/services/horizon/internal/db2/history/ledger.go @@ -1,6 +1,7 @@ package history import ( + "context" "encoding/hex" "fmt" "time" @@ -14,12 +15,12 @@ import ( ) // LedgerBySequence loads the single ledger at `seq` into `dest` -func (q *Q) LedgerBySequence(dest interface{}, seq int32) error { +func (q *Q) LedgerBySequence(ctx context.Context, dest interface{}, seq int32) error { sql := selectLedger. Limit(1). Where("sequence = ?", seq) - return q.Get(dest, sql) + return q.Get(ctx, dest, sql) } // Ledgers provides a helper to filter rows from the `history_ledgers` table @@ -33,7 +34,7 @@ func (q *Q) Ledgers() *LedgersQ { // LedgersBySequence loads the a set of ledgers identified by the sequences // `seqs` into `dest`. -func (q *Q) LedgersBySequence(dest interface{}, seqs ...int32) error { +func (q *Q) LedgersBySequence(ctx context.Context, dest interface{}, seqs ...int32) error { if len(seqs) == 0 { return errors.New("no sequence arguments provided") } @@ -46,15 +47,15 @@ func (q *Q) LedgersBySequence(dest interface{}, seqs ...int32) error { sql := selectLedger.Where(in, whereArgs...) - return q.Select(dest, sql) + return q.Select(ctx, dest, sql) } // LedgerCapacityUsageStats returns ledger capacity stats for the last 5 ledgers. // Currently, we hard code the query to return the last 5 ledgers. // TODO: make the number of ledgers configurable. -func (q *Q) LedgerCapacityUsageStats(currentSeq int32, dest *LedgerCapacityUsageStats) error { +func (q *Q) LedgerCapacityUsageStats(ctx context.Context, currentSeq int32, dest *LedgerCapacityUsageStats) error { const ledgers int32 = 5 - return q.GetRaw(dest, ` + return q.GetRaw(ctx, dest, ` SELECT ROUND(SUM(CAST(operation_count as decimal))/SUM(max_tx_set_size), 2) as ledger_capacity_usage FROM (SELECT hl.sequence, COALESCE(SUM(ht.operation_count), 0) as operation_count, hl.max_tx_set_size @@ -76,18 +77,19 @@ func (q *LedgersQ) Page(page db2.PageQuery) *LedgersQ { } // Select loads the results of the query specified by `q` into `dest`. -func (q *LedgersQ) Select(dest interface{}) error { +func (q *LedgersQ) Select(ctx context.Context, dest interface{}) error { if q.Err != nil { return q.Err } - q.Err = q.parent.Select(dest, q.sql) + q.Err = q.parent.Select(ctx, dest, q.sql) return q.Err } // QLedgers defines ingestion ledger related queries. type QLedgers interface { InsertLedger( + ctx context.Context, ledger xdr.LedgerHeaderHistoryEntry, successTxsCount int, failedTxsCount int, @@ -99,7 +101,7 @@ type QLedgers interface { // InsertLedger creates a row in the history_ledgers table. // Returns number of rows affected and error. -func (q *Q) InsertLedger( +func (q *Q) InsertLedger(ctx context.Context, ledger xdr.LedgerHeaderHistoryEntry, successTxsCount int, failedTxsCount int, @@ -120,7 +122,7 @@ func (q *Q) InsertLedger( } sql := sq.Insert("history_ledgers").SetMap(m) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } diff --git a/services/horizon/internal/db2/history/ledger_cache.go b/services/horizon/internal/db2/history/ledger_cache.go index f966ab706a..3318048ef7 100644 --- a/services/horizon/internal/db2/history/ledger_cache.go +++ b/services/horizon/internal/db2/history/ledger_cache.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/errors" ) @@ -18,7 +20,7 @@ func (lc *LedgerCache) Queue(seq int32) { // Load loads a batch of ledgers identified by `sequences`, using `q`, // and populates the cache with the results -func (lc *LedgerCache) Load(q *Q) error { +func (lc *LedgerCache) Load(ctx context.Context, q *Q) error { lc.lock.Lock() defer lc.lock.Unlock() @@ -32,7 +34,7 @@ func (lc *LedgerCache) Load(q *Q) error { } var ledgers []Ledger - err := q.LedgersBySequence(&ledgers, sequences...) + err := q.LedgersBySequence(ctx, &ledgers, sequences...) if err != nil { return errors.Wrap(err, "failed to load ledger batch") } diff --git a/services/horizon/internal/db2/history/ledger_cache_test.go b/services/horizon/internal/db2/history/ledger_cache_test.go index ca758624ad..17720a72fe 100644 --- a/services/horizon/internal/db2/history/ledger_cache_test.go +++ b/services/horizon/internal/db2/history/ledger_cache_test.go @@ -16,7 +16,7 @@ func TestLedgerCache(t *testing.T) { lc.Queue(2) lc.Queue(3) - err := lc.Load(q) + err := lc.Load(tt.Ctx, q) if tt.Assert.NoError(err) { tt.Assert.Contains(lc.Records, int32(2)) diff --git a/services/horizon/internal/db2/history/ledger_test.go b/services/horizon/internal/db2/history/ledger_test.go index 8f639fd624..c148b6ed8e 100644 --- a/services/horizon/internal/db2/history/ledger_test.go +++ b/services/horizon/internal/db2/history/ledger_test.go @@ -21,22 +21,22 @@ func TestLedgerQueries(t *testing.T) { // Test LedgerBySequence var l Ledger - err := q.LedgerBySequence(&l, 3) + err := q.LedgerBySequence(tt.Ctx, &l, 3) tt.Assert.NoError(err) - err = q.LedgerBySequence(&l, 100000) + err = q.LedgerBySequence(tt.Ctx, &l, 100000) tt.Assert.Equal(err, sql.ErrNoRows) // Test Ledgers() ls := []Ledger{} - err = q.Ledgers().Select(&ls) + err = q.Ledgers().Select(tt.Ctx, &ls) if tt.Assert.NoError(err) { tt.Assert.Len(ls, 3) } // LedgersBySequence - err = q.LedgersBySequence(&ls, 1, 2, 3) + err = q.LedgersBySequence(tt.Ctx, &ls, 1, 2, 3) if tt.Assert.NoError(err) { tt.Assert.Len(ls, 3) @@ -58,7 +58,7 @@ func TestInsertLedger(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - ledgerHashStore := ledgerbackend.NewHorizonDBLedgerHashStore(tt.HorizonSession()) + ledgerHashStore := ledgerbackend.NewHorizonDBLedgerHashStore(tt.Ctx, tt.HorizonSession()) _, exists, err := ledgerHashStore.GetLedgerHash(100) tt.Assert.NoError(err) tt.Assert.False(exists) @@ -116,7 +116,7 @@ func TestInsertLedger(t *testing.T) { tt.Assert.NoError(err) expectedLedger.LedgerHeaderXDR = null.NewString(ledgerHeaderBase64, true) - rowsAffected, err := q.InsertLedger( + rowsAffected, err := q.InsertLedger(tt.Ctx, ledgerEntry, 12, 3, @@ -128,7 +128,7 @@ func TestInsertLedger(t *testing.T) { tt.Assert.Equal(rowsAffected, int64(1)) var ledgerFromDB Ledger - err = q.LedgerBySequence(&ledgerFromDB, 69859) + err = q.LedgerBySequence(tt.Ctx, &ledgerFromDB, 69859) tt.Assert.NoError(err) expectedLedger.CreatedAt = ledgerFromDB.CreatedAt diff --git a/services/horizon/internal/db2/history/main.go b/services/horizon/internal/db2/history/main.go index 0c9f0fb3ed..e5ac0903e5 100644 --- a/services/horizon/internal/db2/history/main.go +++ b/services/horizon/internal/db2/history/main.go @@ -3,6 +3,7 @@ package history import ( + "context" "database/sql" "database/sql/driver" "encoding/json" @@ -215,8 +216,8 @@ type AccountEntry struct { } type AccountsBatchInsertBuilder interface { - Add(entry xdr.LedgerEntry) error - Exec() error + Add(ctx context.Context, entry xdr.LedgerEntry) error + Exec(ctx context.Context) error } type IngestionQ interface { @@ -237,32 +238,32 @@ type IngestionQ interface { QSigners //QTrades NewTradeBatchInsertBuilder(maxBatchSize int) TradeBatchInsertBuilder - CreateAssets(assets []xdr.Asset, batchSize int) (map[string]Asset, error) + CreateAssets(ctx context.Context, assets []xdr.Asset, batchSize int) (map[string]Asset, error) QTransactions QTrustLines - Begin() error - BeginTx(*sql.TxOptions) error - Commit() error + Begin(context.Context) error + BeginTx(context.Context, *sql.TxOptions) error + Commit(context.Context) error CloneIngestionQ() IngestionQ - Rollback() error + Rollback(context.Context) error GetTx() *sqlx.Tx - GetIngestVersion() (int, error) - UpdateExpStateInvalid(bool) error - UpdateIngestVersion(int) error - GetExpStateInvalid() (bool, error) - GetLatestHistoryLedger() (uint32, error) - GetOfferCompactionSequence() (uint32, error) - TruncateIngestStateTables() error - DeleteRangeAll(start, end int64) error + GetIngestVersion(context.Context) (int, error) + UpdateExpStateInvalid(context.Context, bool) error + UpdateIngestVersion(context.Context, int) error + GetExpStateInvalid(context.Context) (bool, error) + GetLatestHistoryLedger(context.Context) (uint32, error) + GetOfferCompactionSequence(context.Context) (uint32, error) + TruncateIngestStateTables(context.Context) error + DeleteRangeAll(ctx context.Context, start, end int64) error } // QAccounts defines account related queries. type QAccounts interface { NewAccountsBatchInsertBuilder(maxBatchSize int) AccountsBatchInsertBuilder - GetAccountsByIDs(ids []string) ([]AccountEntry, error) - UpsertAccounts(accounts []xdr.LedgerEntry) error - RemoveAccount(accountID string) (int64, error) + GetAccountsByIDs(ctx context.Context, ids []string) ([]AccountEntry, error) + UpsertAccounts(ctx context.Context, accounts []xdr.LedgerEntry) error + RemoveAccount(ctx context.Context, accountID string) (int64, error) } // AccountSigner is a row of data from the `accounts_signers` table @@ -274,8 +275,8 @@ type AccountSigner struct { } type AccountSignersBatchInsertBuilder interface { - Add(signer AccountSigner) error - Exec() error + Add(ctx context.Context, signer AccountSigner) error + Exec(ctx context.Context) error } // accountSignersBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -295,8 +296,8 @@ type Data struct { type AccountDataValue []byte type AccountDataBatchInsertBuilder interface { - Add(entry xdr.LedgerEntry) error - Exec() error + Add(ctx context.Context, entry xdr.LedgerEntry) error + Exec(ctx context.Context) error } // accountDataBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -307,11 +308,11 @@ type accountDataBatchInsertBuilder struct { // QData defines account data related queries. type QData interface { NewAccountDataBatchInsertBuilder(maxBatchSize int) AccountDataBatchInsertBuilder - CountAccountsData() (int, error) - GetAccountDataByKeys(keys []xdr.LedgerKeyData) ([]Data, error) - InsertAccountData(entry xdr.LedgerEntry) (int64, error) - UpdateAccountData(entry xdr.LedgerEntry) (int64, error) - RemoveAccountData(key xdr.LedgerKeyData) (int64, error) + CountAccountsData(ctx context.Context) (int, error) + GetAccountDataByKeys(ctx context.Context, keys []xdr.LedgerKeyData) ([]Data, error) + InsertAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) + UpdateAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) + RemoveAccountData(ctx context.Context, key xdr.LedgerKeyData) (int64, error) } // Asset is a row of data from the `history_assets` table @@ -400,17 +401,17 @@ func (e *ExpAssetStatBalances) Scan(src interface{}) error { // QAssetStats defines exp_asset_stats related queries. type QAssetStats interface { - InsertAssetStats(stats []ExpAssetStat, batchSize int) error - InsertAssetStat(stat ExpAssetStat) (int64, error) - UpdateAssetStat(stat ExpAssetStat) (int64, error) - GetAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) - RemoveAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) - GetAssetStats(assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) - CountTrustLines() (int, error) + InsertAssetStats(ctx context.Context, stats []ExpAssetStat, batchSize int) error + InsertAssetStat(ctx context.Context, stat ExpAssetStat) (int64, error) + UpdateAssetStat(ctx context.Context, stat ExpAssetStat) (int64, error) + GetAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) + RemoveAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) + GetAssetStats(ctx context.Context, assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) + CountTrustLines(ctx context.Context) (int, error) } type QCreateAccountsHistory interface { - CreateAccounts(addresses []string, maxBatchSize int) (map[string]int64, error) + CreateAccounts(ctx context.Context, addresses []string, maxBatchSize int) (map[string]int64, error) } // Effect is a row of data from the `history_effects` table @@ -580,8 +581,8 @@ type Offer struct { } type OffersBatchInsertBuilder interface { - Add(offer Offer) error - Exec() error + Add(ctx context.Context, offer Offer) error + Exec(ctx context.Context) error } // offersBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -608,15 +609,15 @@ type Q struct { // QSigners defines signer related queries. type QSigners interface { - GetLastLedgerIngestNonBlocking() (uint32, error) - GetLastLedgerIngest() (uint32, error) - UpdateLastLedgerIngest(ledgerSequence uint32) error - AccountsForSigner(signer string, page db2.PageQuery) ([]AccountSigner, error) + GetLastLedgerIngestNonBlocking(ctx context.Context) (uint32, error) + GetLastLedgerIngest(ctx context.Context) (uint32, error) + UpdateLastLedgerIngest(ctx context.Context, ledgerSequence uint32) error + AccountsForSigner(ctx context.Context, signer string, page db2.PageQuery) ([]AccountSigner, error) NewAccountSignersBatchInsertBuilder(maxBatchSize int) AccountSignersBatchInsertBuilder - CreateAccountSigner(account, signer string, weight int32, sponsor *string) (int64, error) - RemoveAccountSigner(account, signer string) (int64, error) - SignersForAccounts(accounts []string) ([]AccountSigner, error) - CountAccounts() (int, error) + CreateAccountSigner(ctx context.Context, account, signer string, weight int32, sponsor *string) (int64, error) + RemoveAccountSigner(ctx context.Context, account, signer string) (int64, error) + SignersForAccounts(ctx context.Context, accounts []string) ([]AccountSigner, error) + CountAccounts(ctx context.Context) (int, error) } // OffersQuery is a helper struct to configure queries to offers @@ -709,16 +710,16 @@ type TrustLine struct { // QTrustLines defines trust lines related queries. type QTrustLines interface { NewTrustLinesBatchInsertBuilder(maxBatchSize int) TrustLinesBatchInsertBuilder - GetTrustLinesByKeys(keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) - InsertTrustLine(entry xdr.LedgerEntry) (int64, error) - UpdateTrustLine(entry xdr.LedgerEntry) (int64, error) - UpsertTrustLines(entries []xdr.LedgerEntry) error - RemoveTrustLine(key xdr.LedgerKeyTrustLine) (int64, error) + GetTrustLinesByKeys(ctx context.Context, keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) + InsertTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) + UpdateTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) + UpsertTrustLines(ctx context.Context, entries []xdr.LedgerEntry) error + RemoveTrustLine(ctx context.Context, key xdr.LedgerKeyTrustLine) (int64, error) } type TrustLinesBatchInsertBuilder interface { - Add(entry xdr.LedgerEntry) error - Exec() error + Add(ctx context.Context, entry xdr.LedgerEntry) error + Exec(ctx context.Context) error } // trustLinesBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -772,31 +773,31 @@ func (q *Q) NewTrustLinesBatchInsertBuilder(maxBatchSize int) TrustLinesBatchIns } // ElderLedger loads the oldest ledger known to the history database -func (q *Q) ElderLedger(dest interface{}) error { - return q.GetRaw(dest, `SELECT COALESCE(MIN(sequence), 0) FROM history_ledgers`) +func (q *Q) ElderLedger(ctx context.Context, dest interface{}) error { + return q.GetRaw(ctx, dest, `SELECT COALESCE(MIN(sequence), 0) FROM history_ledgers`) } // GetLatestHistoryLedger loads the latest known ledger. Returns 0 if no ledgers in // `history_ledgers` table. -func (q *Q) GetLatestHistoryLedger() (uint32, error) { +func (q *Q) GetLatestHistoryLedger(ctx context.Context) (uint32, error) { var value uint32 - err := q.LatestLedger(&value) + err := q.LatestLedger(ctx, &value) return value, err } // LatestLedger loads the latest known ledger -func (q *Q) LatestLedger(dest interface{}) error { - return q.GetRaw(dest, `SELECT COALESCE(MAX(sequence), 0) FROM history_ledgers`) +func (q *Q) LatestLedger(ctx context.Context, dest interface{}) error { + return q.GetRaw(ctx, dest, `SELECT COALESCE(MAX(sequence), 0) FROM history_ledgers`) } // LatestLedgerSequenceClosedAt loads the latest known ledger sequence and close time, // returns empty values if no ledgers in a DB. -func (q *Q) LatestLedgerSequenceClosedAt() (int32, time.Time, error) { +func (q *Q) LatestLedgerSequenceClosedAt(ctx context.Context) (int32, time.Time, error) { ledger := struct { Sequence int32 `db:"sequence"` ClosedAt time.Time `db:"closed_at"` }{} - err := q.GetRaw(&ledger, `SELECT sequence, closed_at FROM history_ledgers ORDER BY sequence DESC LIMIT 1`) + err := q.GetRaw(ctx, &ledger, `SELECT sequence, closed_at FROM history_ledgers ORDER BY sequence DESC LIMIT 1`) if err == sql.ErrNoRows { // Will return empty values return ledger.Sequence, ledger.ClosedAt, nil @@ -806,8 +807,8 @@ func (q *Q) LatestLedgerSequenceClosedAt() (int32, time.Time, error) { // LatestLedgerBaseFeeAndSequence loads the latest known ledger's base fee and // sequence number. -func (q *Q) LatestLedgerBaseFeeAndSequence(dest interface{}) error { - return q.GetRaw(dest, ` +func (q *Q) LatestLedgerBaseFeeAndSequence(ctx context.Context, dest interface{}) error { + return q.GetRaw(ctx, dest, ` SELECT base_fee, sequence FROM history_ledgers WHERE sequence = (SELECT COALESCE(MAX(sequence), 0) FROM history_ledgers) @@ -821,32 +822,32 @@ func (q *Q) CloneIngestionQ() IngestionQ { // DeleteRangeAll deletes a range of rows from all history tables between // `start` and `end` (exclusive). -func (q *Q) DeleteRangeAll(start, end int64) error { - err := q.DeleteRange(start, end, "history_effects", "history_operation_id") +func (q *Q) DeleteRangeAll(ctx context.Context, start, end int64) error { + err := q.DeleteRange(ctx, start, end, "history_effects", "history_operation_id") if err != nil { return errors.Wrap(err, "Error clearing history_effects") } - err = q.DeleteRange(start, end, "history_operation_participants", "history_operation_id") + err = q.DeleteRange(ctx, start, end, "history_operation_participants", "history_operation_id") if err != nil { return errors.Wrap(err, "Error clearing history_operation_participants") } - err = q.DeleteRange(start, end, "history_operations", "id") + err = q.DeleteRange(ctx, start, end, "history_operations", "id") if err != nil { return errors.Wrap(err, "Error clearing history_operations") } - err = q.DeleteRange(start, end, "history_transaction_participants", "history_transaction_id") + err = q.DeleteRange(ctx, start, end, "history_transaction_participants", "history_transaction_id") if err != nil { return errors.Wrap(err, "Error clearing history_transaction_participants") } - err = q.DeleteRange(start, end, "history_transactions", "id") + err = q.DeleteRange(ctx, start, end, "history_transactions", "id") if err != nil { return errors.Wrap(err, "Error clearing history_transactions") } - err = q.DeleteRange(start, end, "history_ledgers", "id") + err = q.DeleteRange(ctx, start, end, "history_ledgers", "id") if err != nil { return errors.Wrap(err, "Error clearing history_ledgers") } - err = q.DeleteRange(start, end, "history_trades", "history_operation_id") + err = q.DeleteRange(ctx, start, end, "history_trades", "history_operation_id") if err != nil { return errors.Wrap(err, "Error clearing history_trades") } diff --git a/services/horizon/internal/db2/history/main_test.go b/services/horizon/internal/db2/history/main_test.go index d2b966f7c9..c94154b463 100644 --- a/services/horizon/internal/db2/history/main_test.go +++ b/services/horizon/internal/db2/history/main_test.go @@ -14,7 +14,7 @@ func TestLatestLedger(t *testing.T) { q := &Q{tt.HorizonSession()} var seq int - err := q.LatestLedger(&seq) + err := q.LatestLedger(tt.Ctx, &seq) if tt.Assert.NoError(err) { tt.Assert.Equal(3, seq) @@ -27,7 +27,7 @@ func TestLatestLedgerSequenceClosedAt(t *testing.T) { defer tt.Finish() q := &Q{tt.HorizonSession()} - sequence, closedAt, err := q.LatestLedgerSequenceClosedAt() + sequence, closedAt, err := q.LatestLedgerSequenceClosedAt(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Equal(int32(3), sequence) tt.Assert.Equal("2019-10-31T13:19:46Z", closedAt.Format(time.RFC3339)) @@ -35,7 +35,7 @@ func TestLatestLedgerSequenceClosedAt(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) - sequence, closedAt, err = q.LatestLedgerSequenceClosedAt() + sequence, closedAt, err = q.LatestLedgerSequenceClosedAt(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Equal(int32(0), sequence) tt.Assert.Equal("0001-01-01T00:00:00Z", closedAt.Format(time.RFC3339)) @@ -48,7 +48,7 @@ func TestGetLatestHistoryLedgerEmptyDB(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - value, err := q.GetLatestHistoryLedger() + value, err := q.GetLatestHistoryLedger(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(uint32(0), value) } @@ -60,7 +60,7 @@ func TestElderLedger(t *testing.T) { q := &Q{tt.HorizonSession()} var seq int - err := q.ElderLedger(&seq) + err := q.ElderLedger(tt.Ctx, &seq) if tt.Assert.NoError(err) { tt.Assert.Equal(1, seq) diff --git a/services/horizon/internal/db2/history/mock_account_data_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_account_data_batch_insert_builder.go index 27dc38b3af..7f2d2173c9 100644 --- a/services/horizon/internal/db2/history/mock_account_data_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_account_data_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stellar/go/xdr" "github.com/stretchr/testify/mock" ) @@ -9,12 +10,12 @@ type MockAccountDataBatchInsertBuilder struct { mock.Mock } -func (m *MockAccountDataBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { - a := m.Called(entry) +func (m *MockAccountDataBatchInsertBuilder) Add(ctx context.Context, entry xdr.LedgerEntry) error { + a := m.Called(ctx, entry) return a.Error(0) } -func (m *MockAccountDataBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockAccountDataBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_account_signers_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_account_signers_batch_insert_builder.go index d40a737a9a..3f786f65ac 100644 --- a/services/horizon/internal/db2/history/mock_account_signers_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_account_signers_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -8,12 +9,12 @@ type MockAccountSignersBatchInsertBuilder struct { mock.Mock } -func (m *MockAccountSignersBatchInsertBuilder) Add(signer AccountSigner) error { - a := m.Called(signer) +func (m *MockAccountSignersBatchInsertBuilder) Add(ctx context.Context, signer AccountSigner) error { + a := m.Called(ctx, signer) return a.Error(0) } -func (m *MockAccountSignersBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockAccountSignersBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go index b5ceecde50..87777a70ff 100644 --- a/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -10,14 +11,14 @@ type MockEffectBatchInsertBuilder struct { } // Add mock -func (m *MockEffectBatchInsertBuilder) Add( +func (m *MockEffectBatchInsertBuilder) Add(ctx context.Context, accountID int64, operationID int64, order uint32, effectType EffectType, details []byte, ) error { - a := m.Called( + a := m.Called(ctx, accountID, operationID, order, @@ -28,7 +29,7 @@ func (m *MockEffectBatchInsertBuilder) Add( } // Exec mock -func (m *MockEffectBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockEffectBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_offers_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_offers_batch_insert_builder.go index bc6a358291..75e88f3263 100644 --- a/services/horizon/internal/db2/history/mock_offers_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_offers_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -8,12 +9,12 @@ type MockOffersBatchInsertBuilder struct { mock.Mock } -func (m *MockOffersBatchInsertBuilder) Add(row Offer) error { - a := m.Called(row) +func (m *MockOffersBatchInsertBuilder) Add(ctx context.Context, row Offer) error { + a := m.Called(ctx, row) return a.Error(0) } -func (m *MockOffersBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockOffersBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_operation_participant_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_operation_participant_batch_insert_builder.go index b6cbcb91f1..014763f989 100644 --- a/services/horizon/internal/db2/history/mock_operation_participant_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_operation_participant_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -10,13 +11,13 @@ type MockOperationParticipantBatchInsertBuilder struct { } // Add mock -func (m *MockOperationParticipantBatchInsertBuilder) Add(operationID int64, accountID int64) error { - a := m.Called(operationID, accountID) +func (m *MockOperationParticipantBatchInsertBuilder) Add(ctx context.Context, operationID int64, accountID int64) error { + a := m.Called(ctx, operationID, accountID) return a.Error(0) } // Exec mock -func (m *MockOperationParticipantBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockOperationParticipantBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go index 6b9f2e068c..a2f00f1fb7 100644 --- a/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stellar/go/xdr" "github.com/stretchr/testify/mock" ) @@ -11,7 +12,7 @@ type MockOperationsBatchInsertBuilder struct { } // Add mock -func (m *MockOperationsBatchInsertBuilder) Add( +func (m *MockOperationsBatchInsertBuilder) Add(ctx context.Context, id int64, transactionID int64, applicationOrder uint32, @@ -19,7 +20,7 @@ func (m *MockOperationsBatchInsertBuilder) Add( details []byte, sourceAccount string, ) error { - a := m.Called( + a := m.Called(ctx, id, transactionID, applicationOrder, @@ -31,7 +32,7 @@ func (m *MockOperationsBatchInsertBuilder) Add( } // Exec mock -func (m *MockOperationsBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockOperationsBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_q_accounts.go b/services/horizon/internal/db2/history/mock_q_accounts.go index 0e17d4db26..3db8f7c91d 100644 --- a/services/horizon/internal/db2/history/mock_q_accounts.go +++ b/services/horizon/internal/db2/history/mock_q_accounts.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" "github.com/stellar/go/xdr" @@ -11,8 +12,8 @@ type MockQAccounts struct { mock.Mock } -func (m *MockQAccounts) GetAccountsByIDs(ids []string) ([]AccountEntry, error) { - a := m.Called(ids) +func (m *MockQAccounts) GetAccountsByIDs(ctx context.Context, ids []string) ([]AccountEntry, error) { + a := m.Called(ctx, ids) return a.Get(0).([]AccountEntry), a.Error(1) } @@ -21,12 +22,12 @@ func (m *MockQAccounts) NewAccountsBatchInsertBuilder(maxBatchSize int) Accounts return a.Get(0).(AccountsBatchInsertBuilder) } -func (m *MockQAccounts) UpsertAccounts(accounts []xdr.LedgerEntry) error { - a := m.Called(accounts) +func (m *MockQAccounts) UpsertAccounts(ctx context.Context, accounts []xdr.LedgerEntry) error { + a := m.Called(ctx, accounts) return a.Error(0) } -func (m *MockQAccounts) RemoveAccount(accountID string) (int64, error) { - a := m.Called(accountID) +func (m *MockQAccounts) RemoveAccount(ctx context.Context, accountID string) (int64, error) { + a := m.Called(ctx, accountID) return a.Get(0).(int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_asset_stats.go b/services/horizon/internal/db2/history/mock_q_asset_stats.go index f172792b1b..17334039e8 100644 --- a/services/horizon/internal/db2/history/mock_q_asset_stats.go +++ b/services/horizon/internal/db2/history/mock_q_asset_stats.go @@ -1,9 +1,12 @@ package history import ( + "context" + + "github.com/stretchr/testify/mock" + "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/xdr" - "github.com/stretchr/testify/mock" ) // MockQAssetStats is a mock implementation of the QAssetStats interface @@ -11,37 +14,37 @@ type MockQAssetStats struct { mock.Mock } -func (m *MockQAssetStats) InsertAssetStats(assetStats []ExpAssetStat, batchSize int) error { - a := m.Called(assetStats, batchSize) +func (m *MockQAssetStats) InsertAssetStats(ctx context.Context, assetStats []ExpAssetStat, batchSize int) error { + a := m.Called(ctx, assetStats, batchSize) return a.Error(0) } -func (m *MockQAssetStats) InsertAssetStat(assetStat ExpAssetStat) (int64, error) { - a := m.Called(assetStat) +func (m *MockQAssetStats) InsertAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) { + a := m.Called(ctx, assetStat) return a.Get(0).(int64), a.Error(1) } -func (m *MockQAssetStats) UpdateAssetStat(assetStat ExpAssetStat) (int64, error) { - a := m.Called(assetStat) +func (m *MockQAssetStats) UpdateAssetStat(ctx context.Context, assetStat ExpAssetStat) (int64, error) { + a := m.Called(ctx, assetStat) return a.Get(0).(int64), a.Error(1) } -func (m *MockQAssetStats) GetAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) { - a := m.Called(assetType, assetCode, assetIssuer) +func (m *MockQAssetStats) GetAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (ExpAssetStat, error) { + a := m.Called(ctx, assetType, assetCode, assetIssuer) return a.Get(0).(ExpAssetStat), a.Error(1) } -func (m *MockQAssetStats) RemoveAssetStat(assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) { - a := m.Called(assetType, assetCode, assetIssuer) +func (m *MockQAssetStats) RemoveAssetStat(ctx context.Context, assetType xdr.AssetType, assetCode, assetIssuer string) (int64, error) { + a := m.Called(ctx, assetType, assetCode, assetIssuer) return a.Get(0).(int64), a.Error(1) } -func (m *MockQAssetStats) GetAssetStats(assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) { - a := m.Called(assetCode, assetIssuer, page) +func (m *MockQAssetStats) GetAssetStats(ctx context.Context, assetCode, assetIssuer string, page db2.PageQuery) ([]ExpAssetStat, error) { + a := m.Called(ctx, assetCode, assetIssuer, page) return a.Get(0).([]ExpAssetStat), a.Error(1) } -func (m *MockQAssetStats) CountTrustLines() (int, error) { - a := m.Called() +func (m *MockQAssetStats) CountTrustLines(ctx context.Context) (int, error) { + a := m.Called(ctx) return a.Get(0).(int), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_claimable_balances.go b/services/horizon/internal/db2/history/mock_q_claimable_balances.go index 0354afa944..c50e81603e 100644 --- a/services/horizon/internal/db2/history/mock_q_claimable_balances.go +++ b/services/horizon/internal/db2/history/mock_q_claimable_balances.go @@ -1,8 +1,11 @@ package history import ( - "github.com/stellar/go/xdr" + "context" + "github.com/stretchr/testify/mock" + + "github.com/stellar/go/xdr" ) // MockQClaimableBalances is a mock implementation of the QAccounts interface @@ -15,23 +18,23 @@ func (m *MockQClaimableBalances) NewClaimableBalancesBatchInsertBuilder(maxBatch return a.Get(0).(ClaimableBalancesBatchInsertBuilder) } -func (m *MockQClaimableBalances) CountClaimableBalances() (int, error) { - a := m.Called() +func (m *MockQClaimableBalances) CountClaimableBalances(ctx context.Context) (int, error) { + a := m.Called(ctx) return a.Get(0).(int), a.Error(1) } -func (m *MockQClaimableBalances) GetClaimableBalancesByID(ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) { - a := m.Called(ids) +func (m *MockQClaimableBalances) GetClaimableBalancesByID(ctx context.Context, ids []xdr.ClaimableBalanceId) ([]ClaimableBalance, error) { + a := m.Called(ctx, ids) return a.Get(0).([]ClaimableBalance), a.Error(1) } -func (m *MockQClaimableBalances) UpdateClaimableBalance(entry xdr.LedgerEntry) (int64, error) { - a := m.Called(entry) +func (m *MockQClaimableBalances) UpdateClaimableBalance(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { + a := m.Called(ctx, entry) return a.Get(0).(int64), a.Error(1) } -func (m *MockQClaimableBalances) RemoveClaimableBalance(cBalance xdr.ClaimableBalanceEntry) (int64, error) { - a := m.Called(cBalance) +func (m *MockQClaimableBalances) RemoveClaimableBalance(ctx context.Context, cBalance xdr.ClaimableBalanceEntry) (int64, error) { + a := m.Called(ctx, cBalance) return a.Get(0).(int64), a.Error(1) } @@ -39,12 +42,12 @@ type MockClaimableBalancesBatchInsertBuilder struct { mock.Mock } -func (m *MockClaimableBalancesBatchInsertBuilder) Add(entry *xdr.LedgerEntry) error { - a := m.Called(entry) +func (m *MockClaimableBalancesBatchInsertBuilder) Add(ctx context.Context, entry *xdr.LedgerEntry) error { + a := m.Called(ctx, entry) return a.Error(0) } -func (m *MockClaimableBalancesBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockClaimableBalancesBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_q_data.go b/services/horizon/internal/db2/history/mock_q_data.go index 93986fc717..653ca56f6f 100644 --- a/services/horizon/internal/db2/history/mock_q_data.go +++ b/services/horizon/internal/db2/history/mock_q_data.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stretchr/testify/mock" "github.com/stellar/go/xdr" @@ -11,13 +13,13 @@ type MockQData struct { mock.Mock } -func (m *MockQData) GetAccountDataByKeys(keys []xdr.LedgerKeyData) ([]Data, error) { - a := m.Called() +func (m *MockQData) GetAccountDataByKeys(ctx context.Context, keys []xdr.LedgerKeyData) ([]Data, error) { + a := m.Called(ctx) return a.Get(0).([]Data), a.Error(1) } -func (m *MockQData) CountAccountsData() (int, error) { - a := m.Called() +func (m *MockQData) CountAccountsData(ctx context.Context) (int, error) { + a := m.Called(ctx) return a.Get(0).(int), a.Error(1) } @@ -26,17 +28,17 @@ func (m *MockQData) NewAccountDataBatchInsertBuilder(maxBatchSize int) AccountDa return a.Get(0).(AccountDataBatchInsertBuilder) } -func (m *MockQData) InsertAccountData(entry xdr.LedgerEntry) (int64, error) { - a := m.Called(entry) +func (m *MockQData) InsertAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { + a := m.Called(ctx, entry) return a.Get(0).(int64), a.Error(1) } -func (m *MockQData) UpdateAccountData(entry xdr.LedgerEntry) (int64, error) { - a := m.Called(entry) +func (m *MockQData) UpdateAccountData(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { + a := m.Called(ctx, entry) return a.Get(0).(int64), a.Error(1) } -func (m *MockQData) RemoveAccountData(key xdr.LedgerKeyData) (int64, error) { - a := m.Called(key) +func (m *MockQData) RemoveAccountData(ctx context.Context, key xdr.LedgerKeyData) (int64, error) { + a := m.Called(ctx, key) return a.Get(0).(int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_effects.go b/services/horizon/internal/db2/history/mock_q_effects.go index a9b1452f6d..d8bdd97765 100644 --- a/services/horizon/internal/db2/history/mock_q_effects.go +++ b/services/horizon/internal/db2/history/mock_q_effects.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -14,7 +15,7 @@ func (m *MockQEffects) NewEffectBatchInsertBuilder(maxBatchSize int) EffectBatch return a.Get(0).(EffectBatchInsertBuilder) } -func (m *MockQEffects) CreateAccounts(addresses []string, maxBatchSize int) (map[string]int64, error) { - a := m.Called(addresses, maxBatchSize) +func (m *MockQEffects) CreateAccounts(ctx context.Context, addresses []string, maxBatchSize int) (map[string]int64, error) { + a := m.Called(ctx, addresses, maxBatchSize) return a.Get(0).(map[string]int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_history_claimable_balances.go b/services/horizon/internal/db2/history/mock_q_history_claimable_balances.go index 5f09371cbd..ee5bbb38c3 100644 --- a/services/horizon/internal/db2/history/mock_q_history_claimable_balances.go +++ b/services/horizon/internal/db2/history/mock_q_history_claimable_balances.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stellar/go/xdr" "github.com/stretchr/testify/mock" @@ -11,8 +12,8 @@ type MockQHistoryClaimableBalances struct { mock.Mock } -func (m *MockQHistoryClaimableBalances) CreateHistoryClaimableBalances(ids []xdr.ClaimableBalanceId, maxBatchSize int) (map[string]int64, error) { - a := m.Called(ids, maxBatchSize) +func (m *MockQHistoryClaimableBalances) CreateHistoryClaimableBalances(ctx context.Context, ids []xdr.ClaimableBalanceId, maxBatchSize int) (map[string]int64, error) { + a := m.Called(ctx, ids, maxBatchSize) return a.Get(0).(map[string]int64), a.Error(1) } @@ -27,13 +28,13 @@ type MockTransactionClaimableBalanceBatchInsertBuilder struct { mock.Mock } -func (m *MockTransactionClaimableBalanceBatchInsertBuilder) Add(transactionID, accountID int64) error { - a := m.Called(transactionID, accountID) +func (m *MockTransactionClaimableBalanceBatchInsertBuilder) Add(ctx context.Context, transactionID, accountID int64) error { + a := m.Called(ctx, transactionID, accountID) return a.Error(0) } -func (m *MockTransactionClaimableBalanceBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockTransactionClaimableBalanceBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } @@ -49,12 +50,12 @@ type MockOperationClaimableBalanceBatchInsertBuilder struct { mock.Mock } -func (m *MockOperationClaimableBalanceBatchInsertBuilder) Add(transactionID, accountID int64) error { - a := m.Called(transactionID, accountID) +func (m *MockOperationClaimableBalanceBatchInsertBuilder) Add(ctx context.Context, transactionID, accountID int64) error { + a := m.Called(ctx, transactionID, accountID) return a.Error(0) } -func (m *MockOperationClaimableBalanceBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockOperationClaimableBalanceBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_q_ledgers.go b/services/horizon/internal/db2/history/mock_q_ledgers.go index b024c907bc..16d3ef5524 100644 --- a/services/horizon/internal/db2/history/mock_q_ledgers.go +++ b/services/horizon/internal/db2/history/mock_q_ledgers.go @@ -1,15 +1,18 @@ package history import ( - "github.com/stellar/go/xdr" + "context" + "github.com/stretchr/testify/mock" + + "github.com/stellar/go/xdr" ) type MockQLedgers struct { mock.Mock } -func (m *MockQLedgers) InsertLedger( +func (m *MockQLedgers) InsertLedger(ctx context.Context, ledger xdr.LedgerHeaderHistoryEntry, successTxsCount int, failedTxsCount int, @@ -17,6 +20,6 @@ func (m *MockQLedgers) InsertLedger( txSetOpCount int, ingestVersion int, ) (int64, error) { - a := m.Called(ledger, successTxsCount, failedTxsCount, opCount, txSetOpCount, ingestVersion) + a := m.Called(ctx, ledger, successTxsCount, failedTxsCount, opCount, txSetOpCount, ingestVersion) return a.Get(0).(int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_offers.go b/services/horizon/internal/db2/history/mock_q_offers.go index 84150e49e9..0b23720b7f 100644 --- a/services/horizon/internal/db2/history/mock_q_offers.go +++ b/services/horizon/internal/db2/history/mock_q_offers.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -9,23 +10,23 @@ type MockQOffers struct { mock.Mock } -func (m *MockQOffers) GetAllOffers() ([]Offer, error) { - a := m.Called() +func (m *MockQOffers) GetAllOffers(ctx context.Context) ([]Offer, error) { + a := m.Called(ctx) return a.Get(0).([]Offer), a.Error(1) } -func (m *MockQOffers) GetOffersByIDs(ids []int64) ([]Offer, error) { - a := m.Called(ids) +func (m *MockQOffers) GetOffersByIDs(ctx context.Context, ids []int64) ([]Offer, error) { + a := m.Called(ctx, ids) return a.Get(0).([]Offer), a.Error(1) } -func (m *MockQOffers) GetUpdatedOffers(newerThanSequence uint32) ([]Offer, error) { - a := m.Called(newerThanSequence) +func (m *MockQOffers) GetUpdatedOffers(ctx context.Context, newerThanSequence uint32) ([]Offer, error) { + a := m.Called(ctx, newerThanSequence) return a.Get(0).([]Offer), a.Error(1) } -func (m *MockQOffers) CountOffers() (int, error) { - a := m.Called() +func (m *MockQOffers) CountOffers(ctx context.Context) (int, error) { + a := m.Called(ctx) return a.Get(0).(int), a.Error(1) } @@ -34,17 +35,17 @@ func (m *MockQOffers) NewOffersBatchInsertBuilder(maxBatchSize int) OffersBatchI return a.Get(0).(OffersBatchInsertBuilder) } -func (m *MockQOffers) UpdateOffer(row Offer) (int64, error) { - a := m.Called(row) +func (m *MockQOffers) UpdateOffer(ctx context.Context, row Offer) (int64, error) { + a := m.Called(ctx, row) return a.Get(0).(int64), a.Error(1) } -func (m *MockQOffers) RemoveOffers(offerIDs []int64, lastModifiedLedger uint32) (int64, error) { - a := m.Called(offerIDs, lastModifiedLedger) +func (m *MockQOffers) RemoveOffers(ctx context.Context, offerIDs []int64, lastModifiedLedger uint32) (int64, error) { + a := m.Called(ctx, offerIDs, lastModifiedLedger) return a.Get(0).(int64), a.Error(1) } -func (m *MockQOffers) CompactOffers(cutOffSequence uint32) (int64, error) { - a := m.Called(cutOffSequence) +func (m *MockQOffers) CompactOffers(ctx context.Context, cutOffSequence uint32) (int64, error) { + a := m.Called(ctx, cutOffSequence) return a.Get(0).(int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_participants.go b/services/horizon/internal/db2/history/mock_q_participants.go index 04758e43de..9365e06db3 100644 --- a/services/horizon/internal/db2/history/mock_q_participants.go +++ b/services/horizon/internal/db2/history/mock_q_participants.go @@ -1,6 +1,7 @@ package history import ( + "context" "github.com/stretchr/testify/mock" ) @@ -9,8 +10,8 @@ type MockQParticipants struct { mock.Mock } -func (m *MockQParticipants) CreateAccounts(addresses []string, maxBatchSize int) (map[string]int64, error) { - a := m.Called(addresses, maxBatchSize) +func (m *MockQParticipants) CreateAccounts(ctx context.Context, addresses []string, maxBatchSize int) (map[string]int64, error) { + a := m.Called(ctx, addresses, maxBatchSize) return a.Get(0).(map[string]int64), a.Error(1) } @@ -25,13 +26,13 @@ type MockTransactionParticipantsBatchInsertBuilder struct { mock.Mock } -func (m *MockTransactionParticipantsBatchInsertBuilder) Add(transactionID, accountID int64) error { - a := m.Called(transactionID, accountID) +func (m *MockTransactionParticipantsBatchInsertBuilder) Add(ctx context.Context, transactionID, accountID int64) error { + a := m.Called(ctx, transactionID, accountID) return a.Error(0) } -func (m *MockTransactionParticipantsBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockTransactionParticipantsBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_q_signers.go b/services/horizon/internal/db2/history/mock_q_signers.go index da5e8a6c48..81f56d9fd1 100644 --- a/services/horizon/internal/db2/history/mock_q_signers.go +++ b/services/horizon/internal/db2/history/mock_q_signers.go @@ -1,31 +1,34 @@ package history import ( - "github.com/stellar/go/services/horizon/internal/db2" + "context" + "github.com/stretchr/testify/mock" + + "github.com/stellar/go/services/horizon/internal/db2" ) type MockQSigners struct { mock.Mock } -func (m *MockQSigners) GetLastLedgerIngestNonBlocking() (uint32, error) { - a := m.Called() +func (m *MockQSigners) GetLastLedgerIngestNonBlocking(ctx context.Context) (uint32, error) { + a := m.Called(ctx) return a.Get(0).(uint32), a.Error(1) } -func (m *MockQSigners) GetLastLedgerIngest() (uint32, error) { - a := m.Called() +func (m *MockQSigners) GetLastLedgerIngest(ctx context.Context) (uint32, error) { + a := m.Called(ctx) return a.Get(0).(uint32), a.Error(1) } -func (m *MockQSigners) UpdateLastLedgerIngest(ledgerSequence uint32) error { - a := m.Called(ledgerSequence) +func (m *MockQSigners) UpdateLastLedgerIngest(ctx context.Context, ledgerSequence uint32) error { + a := m.Called(ctx, ledgerSequence) return a.Error(0) } -func (m *MockQSigners) AccountsForSigner(signer string, page db2.PageQuery) ([]AccountSigner, error) { - a := m.Called(signer, page) +func (m *MockQSigners) AccountsForSigner(ctx context.Context, signer string, page db2.PageQuery) ([]AccountSigner, error) { + a := m.Called(ctx, signer, page) return a.Get(0).([]AccountSigner), a.Error(1) } @@ -34,22 +37,22 @@ func (m *MockQSigners) NewAccountSignersBatchInsertBuilder(maxBatchSize int) Acc return a.Get(0).(AccountSignersBatchInsertBuilder) } -func (m *MockQSigners) CreateAccountSigner(account, signer string, weight int32, sponsor *string) (int64, error) { - a := m.Called(account, signer, weight, sponsor) +func (m *MockQSigners) CreateAccountSigner(ctx context.Context, account, signer string, weight int32, sponsor *string) (int64, error) { + a := m.Called(ctx, account, signer, weight, sponsor) return a.Get(0).(int64), a.Error(1) } -func (m *MockQSigners) RemoveAccountSigner(account, signer string) (int64, error) { - a := m.Called(account, signer) +func (m *MockQSigners) RemoveAccountSigner(ctx context.Context, account, signer string) (int64, error) { + a := m.Called(ctx, account, signer) return a.Get(0).(int64), a.Error(1) } -func (m *MockQSigners) SignersForAccounts(accounts []string) ([]AccountSigner, error) { - a := m.Called(accounts) +func (m *MockQSigners) SignersForAccounts(ctx context.Context, accounts []string) ([]AccountSigner, error) { + a := m.Called(ctx, accounts) return a.Get(0).([]AccountSigner), a.Error(1) } -func (m *MockQSigners) CountAccounts() (int, error) { - a := m.Called() +func (m *MockQSigners) CountAccounts(ctx context.Context) (int, error) { + a := m.Called(ctx) return a.Get(0).(int), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_q_trades.go b/services/horizon/internal/db2/history/mock_q_trades.go index e64afcb24c..e204c5d443 100644 --- a/services/horizon/internal/db2/history/mock_q_trades.go +++ b/services/horizon/internal/db2/history/mock_q_trades.go @@ -1,7 +1,10 @@ package history import ( + "context" + "github.com/stellar/go/xdr" + "github.com/stretchr/testify/mock" ) @@ -9,13 +12,13 @@ type MockQTrades struct { mock.Mock } -func (m *MockQTrades) CreateAccounts(addresses []string, maxBatchSize int) (map[string]int64, error) { - a := m.Called(addresses, maxBatchSize) +func (m *MockQTrades) CreateAccounts(ctx context.Context, addresses []string, maxBatchSize int) (map[string]int64, error) { + a := m.Called(ctx, addresses, maxBatchSize) return a.Get(0).(map[string]int64), a.Error(1) } -func (m *MockQTrades) CreateAssets(assets []xdr.Asset, maxBatchSize int) (map[string]Asset, error) { - a := m.Called(assets, maxBatchSize) +func (m *MockQTrades) CreateAssets(ctx context.Context, assets []xdr.Asset, maxBatchSize int) (map[string]Asset, error) { + a := m.Called(ctx, assets, maxBatchSize) return a.Get(0).(map[string]Asset), a.Error(1) } @@ -28,12 +31,12 @@ type MockTradeBatchInsertBuilder struct { mock.Mock } -func (m *MockTradeBatchInsertBuilder) Add(entries ...InsertTrade) error { - a := m.Called(entries) +func (m *MockTradeBatchInsertBuilder) Add(ctx context.Context, entries ...InsertTrade) error { + a := m.Called(ctx, entries) return a.Error(0) } -func (m *MockTradeBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockTradeBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/mock_q_trust_lines.go b/services/horizon/internal/db2/history/mock_q_trust_lines.go index fd9eeb33c9..ab9a903913 100644 --- a/services/horizon/internal/db2/history/mock_q_trust_lines.go +++ b/services/horizon/internal/db2/history/mock_q_trust_lines.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stretchr/testify/mock" "github.com/stellar/go/xdr" @@ -16,27 +18,27 @@ func (m *MockQTrustLines) NewTrustLinesBatchInsertBuilder(maxBatchSize int) Trus return a.Get(0).(TrustLinesBatchInsertBuilder) } -func (m *MockQTrustLines) GetTrustLinesByKeys(keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) { - a := m.Called(keys) +func (m *MockQTrustLines) GetTrustLinesByKeys(ctx context.Context, keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) { + a := m.Called(ctx, keys) return a.Get(0).([]TrustLine), a.Error(1) } -func (m *MockQTrustLines) InsertTrustLine(entry xdr.LedgerEntry) (int64, error) { - a := m.Called(entry) +func (m *MockQTrustLines) InsertTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { + a := m.Called(ctx, entry) return a.Get(0).(int64), a.Error(1) } -func (m *MockQTrustLines) UpdateTrustLine(entry xdr.LedgerEntry) (int64, error) { - a := m.Called(entry) +func (m *MockQTrustLines) UpdateTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { + a := m.Called(ctx, entry) return a.Get(0).(int64), a.Error(1) } -func (m *MockQTrustLines) UpsertTrustLines(trustLines []xdr.LedgerEntry) error { - a := m.Called(trustLines) +func (m *MockQTrustLines) UpsertTrustLines(ctx context.Context, trustLines []xdr.LedgerEntry) error { + a := m.Called(ctx, trustLines) return a.Error(0) } -func (m *MockQTrustLines) RemoveTrustLine(key xdr.LedgerKeyTrustLine) (int64, error) { - a := m.Called(key) +func (m *MockQTrustLines) RemoveTrustLine(ctx context.Context, key xdr.LedgerKeyTrustLine) (int64, error) { + a := m.Called(ctx, key) return a.Get(0).(int64), a.Error(1) } diff --git a/services/horizon/internal/db2/history/mock_transactions_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_transactions_batch_insert_builder.go index c9997ed088..8e2608d553 100644 --- a/services/horizon/internal/db2/history/mock_transactions_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_transactions_batch_insert_builder.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stretchr/testify/mock" "github.com/stellar/go/ingest" @@ -10,12 +12,12 @@ type MockTransactionsBatchInsertBuilder struct { mock.Mock } -func (m *MockTransactionsBatchInsertBuilder) Add(transaction ingest.LedgerTransaction, sequence uint32) error { - a := m.Called(transaction, sequence) +func (m *MockTransactionsBatchInsertBuilder) Add(ctx context.Context, transaction ingest.LedgerTransaction, sequence uint32) error { + a := m.Called(ctx, transaction, sequence) return a.Error(0) } -func (m *MockTransactionsBatchInsertBuilder) Exec() error { - a := m.Called() +func (m *MockTransactionsBatchInsertBuilder) Exec(ctx context.Context) error { + a := m.Called(ctx) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/offers.go b/services/horizon/internal/db2/history/offers.go index 515cf3928b..fe37ba91c9 100644 --- a/services/horizon/internal/db2/history/offers.go +++ b/services/horizon/internal/db2/history/offers.go @@ -1,27 +1,30 @@ package history import ( + "context" + sq "github.com/Masterminds/squirrel" + "github.com/stellar/go/support/errors" ) // QOffers defines offer related queries. type QOffers interface { - GetAllOffers() ([]Offer, error) - GetOffersByIDs(ids []int64) ([]Offer, error) - CountOffers() (int, error) - GetUpdatedOffers(newerThanSequence uint32) ([]Offer, error) + GetAllOffers(ctx context.Context) ([]Offer, error) + GetOffersByIDs(ctx context.Context, ids []int64) ([]Offer, error) + CountOffers(ctx context.Context) (int, error) + GetUpdatedOffers(ctx context.Context, newerThanSequence uint32) ([]Offer, error) NewOffersBatchInsertBuilder(maxBatchSize int) OffersBatchInsertBuilder - UpdateOffer(offer Offer) (int64, error) - RemoveOffers(offerIDs []int64, lastModifiedLedger uint32) (int64, error) - CompactOffers(cutOffSequence uint32) (int64, error) + UpdateOffer(ctx context.Context, offer Offer) (int64, error) + RemoveOffers(ctx context.Context, offerIDs []int64, lastModifiedLedger uint32) (int64, error) + CompactOffers(ctx context.Context, cutOffSequence uint32) (int64, error) } -func (q *Q) CountOffers() (int, error) { +func (q *Q) CountOffers(ctx context.Context) (int, error) { sql := sq.Select("count(*)").Where("deleted = ?", false).From("offers") var count int - if err := q.Get(&count, sql); err != nil { + if err := q.Get(ctx, &count, sql); err != nil { return 0, errors.Wrap(err, "could not run select query") } @@ -29,25 +32,25 @@ func (q *Q) CountOffers() (int, error) { } // GetOfferByID loads a row from the `offers` table, selected by offerid. -func (q *Q) GetOfferByID(id int64) (Offer, error) { +func (q *Q) GetOfferByID(ctx context.Context, id int64) (Offer, error) { var offer Offer sql := selectOffers.Where("deleted = ?", false). Where("offers.offer_id = ?", id) - err := q.Get(&offer, sql) + err := q.Get(ctx, &offer, sql) return offer, err } // GetOffersByIDs loads a row from the `offers` table, selected by multiple offerid. -func (q *Q) GetOffersByIDs(ids []int64) ([]Offer, error) { +func (q *Q) GetOffersByIDs(ctx context.Context, ids []int64) ([]Offer, error) { var offers []Offer sql := selectOffers.Where("deleted = ?", false). Where(map[string]interface{}{"offers.offer_id": ids}) - err := q.Select(&offers, sql) + err := q.Select(ctx, &offers, sql) return offers, err } // GetOffers loads rows from `offers` by paging query. -func (q *Q) GetOffers(query OffersQuery) ([]Offer, error) { +func (q *Q) GetOffers(ctx context.Context, query OffersQuery) ([]Offer, error) { sql := selectOffers.Where("deleted = ?", false) sql, err := query.PageQuery.ApplyTo(sql, "offers.offer_id") @@ -72,7 +75,7 @@ func (q *Q) GetOffers(query OffersQuery) ([]Offer, error) { } var offers []Offer - if err := q.Select(&offers, sql); err != nil { + if err := q.Select(ctx, &offers, sql); err != nil { return nil, errors.Wrap(err, "could not run select query") } @@ -80,24 +83,24 @@ func (q *Q) GetOffers(query OffersQuery) ([]Offer, error) { } // GetAllOffers loads all non deleted offers -func (q *Q) GetAllOffers() ([]Offer, error) { +func (q *Q) GetAllOffers(ctx context.Context) ([]Offer, error) { var offers []Offer - err := q.Select(&offers, selectOffers.Where("deleted = ?", false)) + err := q.Select(ctx, &offers, selectOffers.Where("deleted = ?", false)) return offers, err } // GetUpdatedOffers returns all offers created, updated, or deleted after the given ledger sequence. -func (q *Q) GetUpdatedOffers(newerThanSequence uint32) ([]Offer, error) { +func (q *Q) GetUpdatedOffers(ctx context.Context, newerThanSequence uint32) ([]Offer, error) { var offers []Offer - err := q.Select(&offers, selectOffers.Where("offers.last_modified_ledger > ?", newerThanSequence)) + err := q.Select(ctx, &offers, selectOffers.Where("offers.last_modified_ledger > ?", newerThanSequence)) return offers, err } // UpdateOffer updates a row in the offers table. // Returns number of rows affected and error. -func (q *Q) UpdateOffer(offer Offer) (int64, error) { +func (q *Q) UpdateOffer(ctx context.Context, offer Offer) (int64, error) { updateBuilder := q.GetTable("offers").Update() - result, err := updateBuilder.SetStruct(offer, []string{}).Where("offer_id = ?", offer.OfferID).Exec() + result, err := updateBuilder.SetStruct(offer, []string{}).Where("offer_id = ?", offer.OfferID).Exec(ctx) if err != nil { return 0, err } @@ -106,13 +109,13 @@ func (q *Q) UpdateOffer(offer Offer) (int64, error) { // RemoveOffers marks rows in the offers table as deleted. // Returns number of rows affected and error. -func (q *Q) RemoveOffers(offerIDs []int64, lastModifiedLedger uint32) (int64, error) { +func (q *Q) RemoveOffers(ctx context.Context, offerIDs []int64, lastModifiedLedger uint32) (int64, error) { sql := sq.Update("offers"). Set("deleted", true). Set("last_modified_ledger", lastModifiedLedger). Where(map[string]interface{}{"offer_id": offerIDs}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -121,17 +124,17 @@ func (q *Q) RemoveOffers(offerIDs []int64, lastModifiedLedger uint32) (int64, er } // CompactOffers removes rows from the offers table which are marked for deletion. -func (q *Q) CompactOffers(cutOffSequence uint32) (int64, error) { +func (q *Q) CompactOffers(ctx context.Context, cutOffSequence uint32) (int64, error) { sql := sq.Delete("offers"). Where("deleted = ?", true). Where("last_modified_ledger <= ?", cutOffSequence) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, errors.Wrap(err, "cannot delete offer rows") } - if err = q.UpdateOfferCompactionSequence(cutOffSequence); err != nil { + if err = q.UpdateOfferCompactionSequence(ctx, cutOffSequence); err != nil { return 0, errors.Wrap(err, "cannot update offer compaction sequence") } diff --git a/services/horizon/internal/db2/history/offers_batch_insert_builder.go b/services/horizon/internal/db2/history/offers_batch_insert_builder.go index 4278223bde..c1d3b628a9 100644 --- a/services/horizon/internal/db2/history/offers_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/offers_batch_insert_builder.go @@ -1,10 +1,14 @@ package history +import ( + "context" +) + // Add adds a new offer entry to the batch. -func (i *offersBatchInsertBuilder) Add(offer Offer) error { - return i.builder.RowStruct(offer) +func (i *offersBatchInsertBuilder) Add(ctx context.Context, offer Offer) error { + return i.builder.RowStruct(ctx, offer) } -func (i *offersBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *offersBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/offers_test.go b/services/horizon/internal/db2/history/offers_test.go index 79ee19c0eb..2218ffc71a 100644 --- a/services/horizon/internal/db2/history/offers_test.go +++ b/services/horizon/internal/db2/history/offers_test.go @@ -63,13 +63,13 @@ var ( } ) -func insertOffer(q *Q, offer Offer) error { +func insertOffer(tt *test.T, q *Q, offer Offer) error { batch := q.NewOffersBatchInsertBuilder(0) - err := batch.Add(offer) + err := batch.Add(tt.Ctx, offer) if err != nil { return err } - return batch.Exec() + return batch.Exec(tt.Ctx) } func TestGetOfferByID(t *testing.T) { @@ -78,9 +78,9 @@ func TestGetOfferByID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - err := insertOffer(q, eurOffer) + err := insertOffer(tt, q, eurOffer) tt.Assert.NoError(err) - offer, err := q.GetOfferByID(eurOffer.OfferID) + offer, err := q.GetOfferByID(tt.Ctx, eurOffer.OfferID) tt.Assert.NoError(err) tt.Assert.Equal(offer, eurOffer) } @@ -91,7 +91,7 @@ func TestGetNonExistentOfferByID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.GetOfferByID(12345) + _, err := q.GetOfferByID(tt.Ctx, 12345) tt.Assert.True(q.NoRows(err)) } @@ -101,22 +101,22 @@ func TestQueryEmptyOffers(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - offers, err := q.GetAllOffers() + offers, err := q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 0) - updated, err := q.GetUpdatedOffers(0) + updated, err := q.GetUpdatedOffers(tt.Ctx, 0) tt.Assert.NoError(err) tt.Assert.Len(updated, 0) - count, err := q.CountOffers() + count, err := q.CountOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(0, count) - numRemoved, err := q.CompactOffers(100) + numRemoved, err := q.CompactOffers(tt.Ctx, 100) tt.Assert.NoError(err) tt.Assert.Equal(int64(0), numRemoved) - seq, err := q.GetOfferCompactionSequence() + seq, err := q.GetOfferCompactionSequence(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(uint32(100), seq) } @@ -127,12 +127,12 @@ func TestInsertOffers(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - err := insertOffer(q, eurOffer) + err := insertOffer(tt, q, eurOffer) tt.Assert.NoError(err) - err = insertOffer(q, twoEurOffer) + err = insertOffer(tt, q, twoEurOffer) tt.Assert.NoError(err) - offers, err := q.GetAllOffers() + offers, err := q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 2) @@ -144,22 +144,22 @@ func TestInsertOffers(t *testing.T) { tt.Assert.Equal(offersByID[eurOffer.OfferID], eurOffer) tt.Assert.Equal(offersByID[twoEurOffer.OfferID], twoEurOffer) - count, err := q.CountOffers() + count, err := q.CountOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(2, count) - numRemoved, err := q.CompactOffers(12350) + numRemoved, err := q.CompactOffers(tt.Ctx, 12350) tt.Assert.NoError(err) tt.Assert.Equal(int64(0), numRemoved) - seq, err := q.GetOfferCompactionSequence() + seq, err := q.GetOfferCompactionSequence(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(uint32(12350), seq) - afterCompactionCount, err := q.CountOffers() + afterCompactionCount, err := q.CountOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(2, afterCompactionCount) - afterCompactionOffers, err := q.GetAllOffers() + afterCompactionOffers, err := q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(afterCompactionOffers, 2) } @@ -170,22 +170,22 @@ func TestUpdateOffer(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - err := insertOffer(q, eurOffer) + err := insertOffer(tt, q, eurOffer) tt.Assert.NoError(err) - offers, err := q.GetAllOffers() + offers, err := q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) - updatedOffers, err := q.GetUpdatedOffers(1233) + updatedOffers, err := q.GetUpdatedOffers(tt.Ctx, 1233) tt.Assert.NoError(err) tt.Assert.Equal(offers, updatedOffers) - updatedOffers, err = q.GetUpdatedOffers(100) + updatedOffers, err = q.GetUpdatedOffers(tt.Ctx, 100) tt.Assert.NoError(err) tt.Assert.Equal(offers, updatedOffers) - updatedOffers, err = q.GetUpdatedOffers(1234) + updatedOffers, err = q.GetUpdatedOffers(tt.Ctx, 1234) tt.Assert.NoError(err) tt.Assert.Len(updatedOffers, 0) @@ -194,19 +194,19 @@ func TestUpdateOffer(t *testing.T) { modifiedEurOffer := eurOffer modifiedEurOffer.Amount -= 10 - rowsAffected, err := q.UpdateOffer(modifiedEurOffer) + rowsAffected, err := q.UpdateOffer(tt.Ctx, modifiedEurOffer) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), rowsAffected) - offers, err = q.GetAllOffers() + offers, err = q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) - updatedOffers, err = q.GetUpdatedOffers(1233) + updatedOffers, err = q.GetUpdatedOffers(tt.Ctx, 1233) tt.Assert.NoError(err) tt.Assert.Equal(offers, updatedOffers) - updatedOffers, err = q.GetUpdatedOffers(1235) + updatedOffers, err = q.GetUpdatedOffers(tt.Ctx, 1235) tt.Assert.NoError(err) tt.Assert.Len(updatedOffers, 0) @@ -219,7 +219,7 @@ func TestRemoveNonExistantOffer(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - numAffected, err := q.RemoveOffers([]int64{12345}, 1236) + numAffected, err := q.RemoveOffers(tt.Ctx, []int64{12345}, 1236) tt.Assert.NoError(err) tt.Assert.Equal(int64(0), numAffected) } @@ -230,51 +230,51 @@ func TestRemoveOffer(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - err := insertOffer(q, eurOffer) + err := insertOffer(tt, q, eurOffer) tt.Assert.NoError(err) - offers, err := q.GetAllOffers() + offers, err := q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) tt.Assert.Equal(offers[0], eurOffer) expectedUpdates := offers - rowsAffected, err := q.RemoveOffers([]int64{eurOffer.OfferID}, 1236) + rowsAffected, err := q.RemoveOffers(tt.Ctx, []int64{eurOffer.OfferID}, 1236) tt.Assert.Equal(int64(1), rowsAffected) tt.Assert.NoError(err) expectedUpdates[0].LastModifiedLedger = 1236 expectedUpdates[0].Deleted = true - offers, err = q.GetAllOffers() + offers, err = q.GetAllOffers(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(offers, 0) - offers, err = q.GetOffersByIDs([]int64{int64(expectedUpdates[0].OfferID)}) + offers, err = q.GetOffersByIDs(tt.Ctx, []int64{int64(expectedUpdates[0].OfferID)}) tt.Assert.NoError(err) tt.Assert.Len(offers, 0) - _, err = q.GetOfferByID(int64(expectedUpdates[0].OfferID)) + _, err = q.GetOfferByID(tt.Ctx, int64(expectedUpdates[0].OfferID)) tt.Assert.True(q.NoRows(err)) - updated, err := q.GetUpdatedOffers(1234) + updated, err := q.GetUpdatedOffers(tt.Ctx, 1234) tt.Assert.NoError(err) tt.Assert.Equal(expectedUpdates, updated) - count, err := q.CompactOffers(1235) + count, err := q.CompactOffers(tt.Ctx, 1235) tt.Assert.NoError(err) tt.Assert.Equal(int64(0), count) - updated, err = q.GetUpdatedOffers(1234) + updated, err = q.GetUpdatedOffers(tt.Ctx, 1234) tt.Assert.NoError(err) tt.Assert.Equal(expectedUpdates, updated) - count, err = q.CompactOffers(1236) + count, err = q.CompactOffers(tt.Ctx, 1236) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), count) - seq, err := q.GetOfferCompactionSequence() + seq, err := q.GetOfferCompactionSequence(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(uint32(1236), seq) - updated, err = q.GetUpdatedOffers(1234) + updated, err = q.GetUpdatedOffers(tt.Ctx, 1234) tt.Assert.NoError(err) tt.Assert.Len(updated, 0) } @@ -285,15 +285,15 @@ func TestGetOffers(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - err := insertOffer(q, eurOffer) + err := insertOffer(tt, q, eurOffer) tt.Assert.NoError(err) - err = insertOffer(q, twoEurOffer) + err = insertOffer(tt, q, twoEurOffer) tt.Assert.NoError(err) // check removed offers aren't included in GetOffer queries - err = insertOffer(q, threeEurOffer) + err = insertOffer(tt, q, threeEurOffer) tt.Assert.NoError(err) - count, err := q.RemoveOffers([]int64{threeEurOffer.OfferID}, 1235) + count, err := q.RemoveOffers(tt.Ctx, []int64{threeEurOffer.OfferID}, 1235) tt.Assert.NoError(err) tt.Assert.Equal(int64(1), count) @@ -306,7 +306,7 @@ func TestGetOffers(t *testing.T) { Selling: &usdAsset, } - offers, err := q.GetOffers(query) + offers, err := q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 0) @@ -315,7 +315,7 @@ func TestGetOffers(t *testing.T) { Selling: &nativeAsset, } - offers, err = q.GetOffers(query) + offers, err = q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 2) @@ -330,7 +330,7 @@ func TestGetOffers(t *testing.T) { Buying: &eurAsset, } - offers, err := q.GetOffers(query) + offers, err := q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 2) @@ -343,7 +343,7 @@ func TestGetOffers(t *testing.T) { Buying: &usdAsset, } - offers, err = q.GetOffers(query) + offers, err = q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 0) }) @@ -355,7 +355,7 @@ func TestGetOffers(t *testing.T) { SellerID: sellerID, } - offers, err := q.GetOffers(query) + offers, err := q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) @@ -368,7 +368,7 @@ func TestGetOffers(t *testing.T) { Sponsor: sponsor.Address(), } - offers, err := q.GetOffers(query) + offers, err := q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) @@ -383,7 +383,7 @@ func TestGetOffers(t *testing.T) { PageQuery: pageQuery, } - offers, err := q.GetOffers(query) + offers, err := q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 2) @@ -401,7 +401,7 @@ func TestGetOffers(t *testing.T) { PageQuery: pageQuery, } - offers, err = q.GetOffers(query) + offers, err = q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) @@ -413,7 +413,7 @@ func TestGetOffers(t *testing.T) { PageQuery: pageQuery, } - offers, err = q.GetOffers(query) + offers, err = q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) @@ -430,7 +430,7 @@ func TestGetOffers(t *testing.T) { PageQuery: pageQuery, } - offers, err = q.GetOffers(query) + offers, err = q.GetOffers(tt.Ctx, query) tt.Assert.NoError(err) tt.Assert.Len(offers, 1) diff --git a/services/horizon/internal/db2/history/operation.go b/services/horizon/internal/db2/history/operation.go index 6a5a1551dd..949f861d23 100644 --- a/services/horizon/internal/db2/history/operation.go +++ b/services/horizon/internal/db2/history/operation.go @@ -2,6 +2,7 @@ package history import ( "bytes" + "context" "encoding/json" "text/template" @@ -54,7 +55,7 @@ WHERE ledger_sequence > $1 AND ledger_sequence <= $2`)) // FeeStats returns operation fee stats for the last 5 ledgers. // Currently, we hard code the query to return the last 5 ledgers worth of transactions. // TODO: make the number of ledgers configurable. -func (q *Q) FeeStats(currentSeq int32, dest *FeeStats) error { +func (q *Q) FeeStats(ctx context.Context, currentSeq int32, dest *FeeStats) error { percentiles := []int{10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 99} var buf bytes.Buffer @@ -63,7 +64,7 @@ func (q *Q) FeeStats(currentSeq int32, dest *FeeStats) error { return errors.Wrap(err, "error executing the query template") } - return q.GetRaw(dest, buf.String(), currentSeq-5, currentSeq) + return q.GetRaw(ctx, dest, buf.String(), currentSeq-5, currentSeq) } // Operations provides a helper to filter the operations table with pre-defined @@ -81,20 +82,20 @@ func (q *Q) Operations() *OperationsQ { } // OperationByID returns an Operation and optionally a Transaction given an operation id -func (q *Q) OperationByID(includeTransactions bool, id int64) (Operation, *Transaction, error) { +func (q *Q) OperationByID(ctx context.Context, includeTransactions bool, id int64) (Operation, *Transaction, error) { sql := selectOperation. Limit(1). Where("hop.id = ?", id) var operation Operation - err := q.Get(&operation, sql) + err := q.Get(ctx, &operation, sql) if err != nil { return operation, nil, err } if includeTransactions { var transaction Transaction - if err = q.TransactionByHash(&transaction, operation.TransactionHash); err != nil { + if err = q.TransactionByHash(ctx, &transaction, operation.TransactionHash); err != nil { return operation, nil, err } @@ -109,9 +110,9 @@ func (q *Q) OperationByID(includeTransactions bool, id int64) (Operation, *Trans } // ForAccount filters the operations collection to a specific account -func (q *OperationsQ) ForAccount(aid string) *OperationsQ { +func (q *OperationsQ) ForAccount(ctx context.Context, aid string) *OperationsQ { var account Account - q.Err = q.parent.AccountByAddress(&account, aid) + q.Err = q.parent.AccountByAddress(ctx, &account, aid) if q.Err != nil { return q } @@ -129,9 +130,9 @@ func (q *OperationsQ) ForAccount(aid string) *OperationsQ { // ForClaimableBalance filters the query to only operations pertaining to a // claimable balance, specified by the claimable balance's hex-encoded id. -func (q *OperationsQ) ForClaimableBalance(cbID xdr.ClaimableBalanceId) *OperationsQ { +func (q *OperationsQ) ForClaimableBalance(ctx context.Context, cbID xdr.ClaimableBalanceId) *OperationsQ { var hCB HistoryClaimableBalance - hCB, q.Err = q.parent.ClaimableBalanceByID(cbID) + hCB, q.Err = q.parent.ClaimableBalanceByID(ctx, cbID) if q.Err != nil { return q } @@ -149,9 +150,9 @@ func (q *OperationsQ) ForClaimableBalance(cbID xdr.ClaimableBalanceId) *Operatio // ForLedger filters the query to a only operations in a specific ledger, // specified by its sequence. -func (q *OperationsQ) ForLedger(seq int32) *OperationsQ { +func (q *OperationsQ) ForLedger(ctx context.Context, seq int32) *OperationsQ { var ledger Ledger - q.Err = q.parent.LedgerBySequence(&ledger, seq) + q.Err = q.parent.LedgerBySequence(ctx, &ledger, seq) if q.Err != nil { return q } @@ -169,9 +170,9 @@ func (q *OperationsQ) ForLedger(seq int32) *OperationsQ { // ForTransaction filters the query to only operations in a specific // transaction, specified by the transactions's hex-encoded hash. -func (q *OperationsQ) ForTransaction(hash string) *OperationsQ { +func (q *OperationsQ) ForTransaction(ctx context.Context, hash string) *OperationsQ { var tx Transaction - q.Err = q.parent.TransactionByHash(&tx, hash) + q.Err = q.parent.TransactionByHash(ctx, &tx, hash) if q.Err != nil { return q } @@ -225,7 +226,7 @@ func (q *OperationsQ) Page(page db2.PageQuery) *OperationsQ { } // Fetch returns results specified by a filtered operations query -func (q *OperationsQ) Fetch() ([]Operation, []Transaction, error) { +func (q *OperationsQ) Fetch(ctx context.Context) ([]Operation, []Transaction, error) { if q.Err != nil { return nil, nil, q.Err } @@ -237,7 +238,7 @@ func (q *OperationsQ) Fetch() ([]Operation, []Transaction, error) { var operations []Operation var transactions []Transaction - q.Err = q.parent.Select(&operations, q.sql) + q.Err = q.parent.Select(ctx, &operations, q.sql) if q.Err != nil { return nil, nil, q.Err } @@ -277,7 +278,7 @@ func (q *OperationsQ) Fetch() ([]Operation, []Transaction, error) { } if q.includeTransactions && len(transactionIDs) > 0 { - transactionsByID, err := q.parent.TransactionsByIDs(transactionIDs...) + transactionsByID, err := q.parent.TransactionsByIDs(ctx, transactionIDs...) if err != nil { return nil, nil, err } diff --git a/services/horizon/internal/db2/history/operation_batch_insert_builder.go b/services/horizon/internal/db2/history/operation_batch_insert_builder.go index 78b0116b39..73525b97cb 100644 --- a/services/horizon/internal/db2/history/operation_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/operation_batch_insert_builder.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/db" "github.com/stellar/go/xdr" ) @@ -9,6 +11,7 @@ import ( // history_operations table type OperationBatchInsertBuilder interface { Add( + ctx context.Context, id int64, transactionID int64, applicationOrder uint32, @@ -16,7 +19,7 @@ type OperationBatchInsertBuilder interface { details []byte, sourceAccount string, ) error - Exec() error + Exec(ctx context.Context) error } // operationBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -36,6 +39,7 @@ func (q *Q) NewOperationBatchInsertBuilder(maxBatchSize int) OperationBatchInser // Add adds a transaction's operations to the batch func (i *operationBatchInsertBuilder) Add( + ctx context.Context, id int64, transactionID int64, applicationOrder uint32, @@ -43,7 +47,7 @@ func (i *operationBatchInsertBuilder) Add( details []byte, sourceAccount string, ) error { - return i.builder.Row(map[string]interface{}{ + return i.builder.Row(ctx, map[string]interface{}{ "id": id, "transaction_id": transactionID, "application_order": applicationOrder, @@ -54,6 +58,6 @@ func (i *operationBatchInsertBuilder) Add( } -func (i *operationBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *operationBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go b/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go index 72e012f118..fd7d44271c 100644 --- a/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go @@ -34,8 +34,8 @@ func TestAddOperation(t *testing.T) { ) sequence := int32(56) - tt.Assert.NoError(txBatch.Add(transaction, uint32(sequence))) - tt.Assert.NoError(txBatch.Exec()) + tt.Assert.NoError(txBatch.Add(tt.Ctx, transaction, uint32(sequence))) + tt.Assert.NoError(txBatch.Exec(tt.Ctx)) details, err := json.Marshal(map[string]string{ "to": "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", @@ -45,7 +45,7 @@ func TestAddOperation(t *testing.T) { }) tt.Assert.NoError(err) - err = builder.Add( + err = builder.Add(tt.Ctx, toid.New(sequence, 1, 1).ToInt64(), toid.New(sequence, 1, 0).ToInt64(), 1, @@ -55,11 +55,11 @@ func TestAddOperation(t *testing.T) { ) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) ops := []Operation{} - err = q.Select(&ops, selectOperation) + err = q.Select(tt.Ctx, &ops, selectOperation) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 1) diff --git a/services/horizon/internal/db2/history/operation_participant_batch_insert_builder.go b/services/horizon/internal/db2/history/operation_participant_batch_insert_builder.go index c0aa2da3c2..6b2b3afb56 100644 --- a/services/horizon/internal/db2/history/operation_participant_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/operation_participant_batch_insert_builder.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/db" ) @@ -8,10 +10,11 @@ import ( // history_operations table type OperationParticipantBatchInsertBuilder interface { Add( + ctx context.Context, operationID int64, accountID int64, ) error - Exec() error + Exec(ctx context.Context) error } // operationParticipantBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -31,15 +34,16 @@ func (q *Q) NewOperationParticipantBatchInsertBuilder(maxBatchSize int) Operatio // Add adds an operation participant to the batch func (i *operationParticipantBatchInsertBuilder) Add( + ctx context.Context, operationID int64, accountID int64, ) error { - return i.builder.Row(map[string]interface{}{ + return i.builder.Row(ctx, map[string]interface{}{ "history_operation_id": operationID, "history_account_id": accountID, }) } -func (i *operationParticipantBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *operationParticipantBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/operation_participant_batch_insert_builder_test.go b/services/horizon/internal/db2/history/operation_participant_batch_insert_builder_test.go index 612acba3bd..51a0c4800d 100644 --- a/services/horizon/internal/db2/history/operation_participant_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/operation_participant_batch_insert_builder_test.go @@ -14,10 +14,10 @@ func TestAddOperationParticipants(t *testing.T) { q := &Q{tt.HorizonSession()} builder := q.NewOperationParticipantBatchInsertBuilder(1) - err := builder.Add(240518172673, 1) + err := builder.Add(tt.Ctx, 240518172673, 1) tt.Assert.NoError(err) - err = builder.Exec() + err = builder.Exec(tt.Ctx) tt.Assert.NoError(err) type hop struct { @@ -26,7 +26,7 @@ func TestAddOperationParticipants(t *testing.T) { } ops := []hop{} - err = q.Select(&ops, sq.Select( + err = q.Select(tt.Ctx, &ops, sq.Select( "hopp.history_operation_id, "+ "hopp.history_account_id"). From("history_operation_participants hopp"), diff --git a/services/horizon/internal/db2/history/operation_test.go b/services/horizon/internal/db2/history/operation_test.go index 8d1287d62f..a26d43beca 100644 --- a/services/horizon/internal/db2/history/operation_test.go +++ b/services/horizon/internal/db2/history/operation_test.go @@ -15,7 +15,7 @@ func TestOperationQueries(t *testing.T) { q := &Q{tt.HorizonSession()} // Test OperationByID - op, transaction, err := q.OperationByID(false, 8589938689) + op, transaction, err := q.OperationByID(tt.Ctx, false, 8589938689) if tt.Assert.NoError(err) { tt.Assert.Equal(int64(8589938689), op.ID) } @@ -23,15 +23,15 @@ func TestOperationQueries(t *testing.T) { // Test Operations() ops, transactions, err := q.Operations(). - ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). - Fetch() + ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). + Fetch(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 2) } tt.Assert.Len(transactions, 0) // ledger filter works - ops, transactions, err = q.Operations().ForLedger(2).Fetch() + ops, transactions, err = q.Operations().ForLedger(tt.Ctx, 2).Fetch(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 3) } @@ -39,7 +39,7 @@ func TestOperationQueries(t *testing.T) { // tx filter works hash := "2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d" - ops, transactions, err = q.Operations().ForTransaction(hash).Fetch() + ops, transactions, err = q.Operations().ForTransaction(tt.Ctx, hash).Fetch(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 1) } @@ -47,7 +47,7 @@ func TestOperationQueries(t *testing.T) { // payment filter works tt.Scenario("pathed_payment") - ops, transactions, err = q.Operations().OnlyPayments().Fetch() + ops, transactions, err = q.Operations().OnlyPayments().Fetch(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 10) } @@ -55,7 +55,7 @@ func TestOperationQueries(t *testing.T) { // payment filter includes account merges tt.Scenario("account_merge") - ops, transactions, err = q.Operations().OnlyPayments().Fetch() + ops, transactions, err = q.Operations().OnlyPayments().Fetch(tt.Ctx) if tt.Assert.NoError(err) { tt.Assert.Len(ops, 3) } @@ -68,7 +68,7 @@ func TestOperationQueryBuilder(t *testing.T) { defer tt.Finish() q := &Q{tt.HorizonSession()} - opsQ := q.Operations().ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON").Page(db2.PageQuery{Cursor: "8589938689", Order: "asc", Limit: 10}) + opsQ := q.Operations().ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON").Page(db2.PageQuery{Cursor: "8589938689", Order: "asc", Limit: 10}) tt.Assert.NoError(opsQ.Err) got, _, err := opsQ.sql.ToSql() tt.Assert.NoError(err) @@ -77,7 +77,7 @@ func TestOperationQueryBuilder(t *testing.T) { want := "SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hopp.history_account_id = ? AND hopp.history_operation_id > ? ORDER BY hopp.history_operation_id asc LIMIT 10" tt.Assert.EqualValues(want, got) - opsQ = q.Operations().ForLedger(2).Page(db2.PageQuery{Cursor: "8589938689", Order: "asc", Limit: 10}) + opsQ = q.Operations().ForLedger(tt.Ctx, 2).Page(db2.PageQuery{Cursor: "8589938689", Order: "asc", Limit: 10}) tt.Assert.NoError(opsQ.Err) got, _, err = opsQ.sql.ToSql() tt.Assert.NoError(err) @@ -98,9 +98,9 @@ func TestOperationSuccessfulOnly(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") - operations, transactions, err := query.Fetch() + operations, transactions, err := query.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(transactions, 0) @@ -124,10 +124,10 @@ func TestOperationIncludeFailed(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). IncludeFailed() - operations, transactions, err := query.Fetch() + operations, transactions, err := query.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(transactions, 0) @@ -160,9 +160,9 @@ func TestPaymentsSuccessfulOnly(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). OnlyPayments(). - ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON") + ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON") - operations, transactions, err := query.Fetch() + operations, transactions, err := query.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(transactions, 0) @@ -187,10 +187,10 @@ func TestPaymentsIncludeFailed(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). OnlyPayments(). - ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). + ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). IncludeFailed() - operations, transactions, err := query.Fetch() + operations, transactions, err := query.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(transactions, 0) @@ -224,10 +224,10 @@ func TestExtraChecksOperationsTransactionSuccessfulTrueResultFalse(t *testing.T) q := &Q{tt.HorizonSession()} query := q.Operations(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). IncludeFailed() - _, _, err = query.Fetch() + _, _, err = query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.Contains(err.Error(), "Corrupted data! `successful=true` but returned transaction is not success") } @@ -245,10 +245,10 @@ func TestExtraChecksOperationsTransactionSuccessfulFalseResultTrue(t *testing.T) q := &Q{tt.HorizonSession()} query := q.Operations(). - ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). + ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). IncludeFailed() - _, _, err = query.Fetch() + _, _, err = query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.Contains(err.Error(), "Corrupted data! `successful=false` but returned transaction is success") } @@ -271,9 +271,9 @@ func TestOperationIncludeTransactions(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). IncludeTransactions(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) - operations, transactions, err := query.Fetch() + operations, transactions, err := query.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(transactions, 3) tt.Assert.Len(transactions, len(operations)) @@ -285,27 +285,27 @@ func TestOperationIncludeTransactions(t *testing.T) { } withoutTransactionsQuery := (&Q{tt.HorizonSession()}).Operations(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) var expectedTransactions []Transaction - err = (&Q{tt.HorizonSession()}).Transactions().ForAccount(accountID).Select(&expectedTransactions) + err = (&Q{tt.HorizonSession()}).Transactions().ForAccount(tt.Ctx, accountID).Select(tt.Ctx, &expectedTransactions) tt.Assert.NoError(err) - expectedOperations, _, err := withoutTransactionsQuery.Fetch() + expectedOperations, _, err := withoutTransactionsQuery.Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(operations, expectedOperations) tt.Assert.Equal(transactions, expectedTransactions) - op, transaction, err := q.OperationByID(true, expectedOperations[0].ID) + op, transaction, err := q.OperationByID(tt.Ctx, true, expectedOperations[0].ID) tt.Assert.NoError(err) tt.Assert.Equal(op, expectedOperations[0]) tt.Assert.Equal(*transaction, expectedTransactions[0]) assertOperationMatchesTransaction(tt, op, *transaction) - _, err = q.Exec(sq.Delete("history_transactions")) + _, err = q.Exec(tt.Ctx, sq.Delete("history_transactions")) tt.Assert.NoError(err) - _, _, err = q.OperationByID(true, 17179877377) + _, _, err = q.OperationByID(tt.Ctx, true, 17179877377) tt.Assert.Error(err) } @@ -329,13 +329,13 @@ func TestValidateTransactionForOperation(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Operations(). IncludeTransactions(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) - _, _, err := query.Fetch() + _, _, err := query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction with id 17179877376 could not be found") - _, _, err = q.OperationByID(true, 17179877377) + _, _, err = q.OperationByID(tt.Ctx, true, 17179877377) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction id 0 does not match transaction id in operation 17179877376") @@ -346,13 +346,13 @@ func TestValidateTransactionForOperation(t *testing.T) { From("history_transactions ht") query = q.Operations(). IncludeTransactions(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) - _, _, err = query.Fetch() + _, _, err = query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction result does not match transaction result in operation AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=") - _, _, err = q.OperationByID(true, 17179877377) + _, _, err = q.OperationByID(tt.Ctx, true, 17179877377) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction result does not match transaction result in operation AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=") @@ -363,13 +363,13 @@ func TestValidateTransactionForOperation(t *testing.T) { From("history_transactions ht") query = q.Operations(). IncludeTransactions(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) - _, _, err = query.Fetch() + _, _, err = query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction hash does not match transaction hash in operation 1c454630267aa8767ec8c8e30450cea6ba660145e9c924abb75d7a6669b6c28a") - _, _, err = q.OperationByID(true, 17179877377) + _, _, err = q.OperationByID(tt.Ctx, true, 17179877377) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction hash does not match transaction hash in operation 1c454630267aa8767ec8c8e30450cea6ba660145e9c924abb75d7a6669b6c28a") @@ -380,13 +380,13 @@ func TestValidateTransactionForOperation(t *testing.T) { From("history_transactions ht") query = q.Operations(). IncludeTransactions(). - ForAccount(accountID) + ForAccount(tt.Ctx, accountID) - _, _, err = query.Fetch() + _, _, err = query.Fetch(tt.Ctx) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction successful flag false does not match transaction successful flag in operation true") - _, _, err = q.OperationByID(true, 17179877377) + _, _, err = q.OperationByID(tt.Ctx, true, 17179877377) tt.Assert.Error(err) tt.Assert.EqualError(err, "transaction successful flag false does not match transaction successful flag in operation true") } diff --git a/services/horizon/internal/db2/history/orderbook.go b/services/horizon/internal/db2/history/orderbook.go index cfa96c418e..4ea068f022 100644 --- a/services/horizon/internal/db2/history/orderbook.go +++ b/services/horizon/internal/db2/history/orderbook.go @@ -1,10 +1,11 @@ package history import ( + "context" "database/sql" - "github.com/stellar/go/amount" "math/big" + "github.com/stellar/go/amount" "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) @@ -40,7 +41,7 @@ type OrderBookSummary struct { // GetOrderBookSummary returns an OrderBookSummary for a given trading pair. // GetOrderBookSummary should only be called in a repeatable read transaction. -func (q *Q) GetOrderBookSummary(sellingAsset, buyingAsset xdr.Asset, maxPriceLevels int) (OrderBookSummary, error) { +func (q *Q) GetOrderBookSummary(ctx context.Context, sellingAsset, buyingAsset xdr.Asset, maxPriceLevels int) (OrderBookSummary, error) { var result OrderBookSummary if tx := q.GetTx(); tx == nil { @@ -100,12 +101,12 @@ func (q *Q) GetOrderBookSummary(sellingAsset, buyingAsset xdr.Asset, maxPriceLev LIMIT $3 ) ` - err = q.SelectRaw(&levels, selectPriceLevels, selling, buying, maxPriceLevels) + err = q.SelectRaw(ctx, &levels, selectPriceLevels, selling, buying, maxPriceLevels) if err != nil { return result, errors.Wrap(err, "cannot select price levels") } - err = q.SelectRaw(&offers, selectOfferSummaries, selling, buying, maxPriceLevels) + err = q.SelectRaw(ctx, &offers, selectOfferSummaries, selling, buying, maxPriceLevels) if err != nil { return result, errors.Wrap(err, "cannot select offer summaries") } diff --git a/services/horizon/internal/db2/history/orderbook_test.go b/services/horizon/internal/db2/history/orderbook_test.go index 004e4d6a27..4d4d35e6da 100644 --- a/services/horizon/internal/db2/history/orderbook_test.go +++ b/services/horizon/internal/db2/history/orderbook_test.go @@ -15,13 +15,13 @@ func TestGetOrderBookSummaryRequiresTransaction(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.GetOrderBookSummary(nativeAsset, eurAsset, 10) + _, err := q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, 10) assert.EqualError(t, err, "cannot be called outside of a transaction") - assert.NoError(t, q.Begin()) - defer q.Rollback() + assert.NoError(t, q.Begin(tt.Ctx)) + defer q.Rollback(tt.Ctx) - _, err = q.GetOrderBookSummary(nativeAsset, eurAsset, 10) + _, err = q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, 10) assert.EqualError(t, err, "should only be called in a repeatable read transaction") } @@ -212,21 +212,21 @@ func TestGetOrderBookSummary(t *testing.T) { }, } { t.Run(testCase.name, func(t *testing.T) { - assert.NoError(t, q.TruncateTables([]string{"offers"})) + assert.NoError(t, q.TruncateTables(tt.Ctx, []string{"offers"})) batch := q.NewOffersBatchInsertBuilder(0) for _, offer := range testCase.offers { - assert.NoError(t, batch.Add(offer)) + assert.NoError(t, batch.Add(tt.Ctx, offer)) } - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - assert.NoError(t, q.BeginTx(&sql.TxOptions{ + assert.NoError(t, q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, })) - defer q.Rollback() + defer q.Rollback(tt.Ctx) - result, err := q.GetOrderBookSummary(nativeAsset, eurAsset, testCase.limit) + result, err := q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, testCase.limit) assert.NoError(t, err) assert.Equal(t, testCase.expected, result) }) @@ -262,54 +262,54 @@ func TestGetOrderBookSummaryExcludesRemovedOffers(t *testing.T) { batch := q.NewOffersBatchInsertBuilder(0) for _, offer := range offers { - assert.NoError(t, batch.Add(offer)) + assert.NoError(t, batch.Add(tt.Ctx, offer)) } - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - assert.NoError(t, q.BeginTx(&sql.TxOptions{ + assert.NoError(t, q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, })) - result, err := q.GetOrderBookSummary(nativeAsset, eurAsset, 100) + result, err := q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, 100) assert.NoError(t, err) assert.Len(t, result.Asks, 2) assert.Len(t, result.Bids, 1) - assert.NoError(t, q.Rollback()) + assert.NoError(t, q.Rollback(tt.Ctx)) for i, offer := range offers { var count int64 - count, err = q.RemoveOffers([]int64{offer.OfferID}, uint32(i+2)) + count, err = q.RemoveOffers(tt.Ctx, []int64{offer.OfferID}, uint32(i+2)) assert.NoError(t, err) assert.Equal(t, int64(1), count) } - assert.NoError(t, q.BeginTx(&sql.TxOptions{ + assert.NoError(t, q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, })) - result, err = q.GetOrderBookSummary(nativeAsset, eurAsset, 100) + result, err = q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, 100) assert.NoError(t, err) assert.Len(t, result.Asks, 0) assert.Len(t, result.Bids, 0) - assert.NoError(t, q.Rollback()) + assert.NoError(t, q.Rollback(tt.Ctx)) - count, err := q.CompactOffers(1000) + count, err := q.CompactOffers(tt.Ctx, 1000) assert.NoError(t, err) assert.Equal(t, int64(len(offers)), count) - assert.NoError(t, q.BeginTx(&sql.TxOptions{ + assert.NoError(t, q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, })) - result, err = q.GetOrderBookSummary(nativeAsset, eurAsset, 100) + result, err = q.GetOrderBookSummary(tt.Ctx, nativeAsset, eurAsset, 100) assert.NoError(t, err) assert.Len(t, result.Asks, 0) assert.Len(t, result.Bids, 0) - assert.NoError(t, q.Rollback()) + assert.NoError(t, q.Rollback(tt.Ctx)) } diff --git a/services/horizon/internal/db2/history/participants.go b/services/horizon/internal/db2/history/participants.go index 462ffda2da..658e877f78 100644 --- a/services/horizon/internal/db2/history/participants.go +++ b/services/horizon/internal/db2/history/participants.go @@ -1,6 +1,8 @@ package history import ( + "context" + "github.com/stellar/go/support/db" ) @@ -14,8 +16,8 @@ type QParticipants interface { // TransactionParticipantsBatchInsertBuilder is used to insert transaction participants into the // history_transaction_participants table type TransactionParticipantsBatchInsertBuilder interface { - Add(transactionID, accountID int64) error - Exec() error + Add(ctx context.Context, transactionID, accountID int64) error + Exec(ctx context.Context) error } type transactionParticipantsBatchInsertBuilder struct { @@ -33,14 +35,14 @@ func (q *Q) NewTransactionParticipantsBatchInsertBuilder(maxBatchSize int) Trans } // Add adds a new transaction participant to the batch -func (i *transactionParticipantsBatchInsertBuilder) Add(transactionID, accountID int64) error { - return i.builder.Row(map[string]interface{}{ +func (i *transactionParticipantsBatchInsertBuilder) Add(ctx context.Context, transactionID, accountID int64) error { + return i.builder.Row(ctx, map[string]interface{}{ "history_transaction_id": transactionID, "history_account_id": accountID, }) } // Exec flushes all pending transaction participants to the db -func (i *transactionParticipantsBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *transactionParticipantsBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/participants_test.go b/services/horizon/internal/db2/history/participants_test.go index 1c656ef883..ee37f2b833 100644 --- a/services/horizon/internal/db2/history/participants_test.go +++ b/services/horizon/internal/db2/history/participants_test.go @@ -18,7 +18,7 @@ func getTransactionParticipants(tt *test.T, q *Q) []transactionParticipant { From("history_transaction_participants"). OrderBy("(history_transaction_id, history_account_id) asc") - err := q.Select(&participants, sql) + err := q.Select(tt.Ctx, &participants, sql) if err != nil { tt.T.Fatal(err) } @@ -39,11 +39,11 @@ func TestTransactionParticipantsBatch(t *testing.T) { accountID := int64(100) for i := int64(0); i < 3; i++ { - tt.Assert.NoError(batch.Add(transactionID, accountID+i)) + tt.Assert.NoError(batch.Add(tt.Ctx, transactionID, accountID+i)) } - tt.Assert.NoError(batch.Add(otherTransactionID, accountID)) - tt.Assert.NoError(batch.Exec()) + tt.Assert.NoError(batch.Add(tt.Ctx, otherTransactionID, accountID)) + tt.Assert.NoError(batch.Exec(tt.Ctx)) participants := getTransactionParticipants(tt, q) tt.Assert.Equal( diff --git a/services/horizon/internal/db2/history/sequence_provider.go b/services/horizon/internal/db2/history/sequence_provider.go index ac26053480..97f53e9253 100644 --- a/services/horizon/internal/db2/history/sequence_provider.go +++ b/services/horizon/internal/db2/history/sequence_provider.go @@ -1,16 +1,18 @@ package history import ( + "context" + sq "github.com/Masterminds/squirrel" "github.com/stellar/go/support/errors" ) -func (q *Q) GetSequenceNumbers(addresses []string) (map[string]uint64, error) { +func (q *Q) GetSequenceNumbers(ctx context.Context, addresses []string) (map[string]uint64, error) { var accounts []AccountEntry sql := sq.Select("account_id, sequence_number").From("accounts"). Where(map[string]interface{}{"accounts.account_id": addresses}) - if err := q.Select(&accounts, sql); err != nil { + if err := q.Select(ctx, &accounts, sql); err != nil { return nil, errors.Wrap(err, "could not query accounts") } diff --git a/services/horizon/internal/db2/history/sequence_provider_test.go b/services/horizon/internal/db2/history/sequence_provider_test.go index f56054cae1..5ed67d7731 100644 --- a/services/horizon/internal/db2/history/sequence_provider_test.go +++ b/services/horizon/internal/db2/history/sequence_provider_test.go @@ -17,7 +17,7 @@ func TestSequenceProviderEmptyDB(t *testing.T) { "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", } - results, err := q.GetSequenceNumbers(addresses) + results, err := q.GetSequenceNumbers(tt.Ctx, addresses) assert.NoError(t, err) assert.Len(t, results, 0) } @@ -29,13 +29,13 @@ func TestSequenceProviderGet(t *testing.T) { q := &Q{tt.HorizonSession()} batch := q.NewAccountsBatchInsertBuilder(0) - err := batch.Add(account1) + err := batch.Add(tt.Ctx, account1) assert.NoError(t, err) - err = batch.Add(account2) + err = batch.Add(tt.Ctx, account2) assert.NoError(t, err) - assert.NoError(t, batch.Exec()) + assert.NoError(t, batch.Exec(tt.Ctx)) - results, err := q.GetSequenceNumbers([]string{ + results, err := q.GetSequenceNumbers(tt.Ctx, []string{ "GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB", "GCT2NQM5KJJEF55NPMY444C6M6CA7T33HRNCMA6ZFBIIXKNCRO6J25K7", "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", diff --git a/services/horizon/internal/db2/history/trade.go b/services/horizon/internal/db2/history/trade.go index d034072087..a291d0357e 100644 --- a/services/horizon/internal/db2/history/trade.go +++ b/services/horizon/internal/db2/history/trade.go @@ -1,6 +1,7 @@ package history import ( + "context" "fmt" "math" @@ -77,9 +78,9 @@ func (q *TradesQ) forAssetPair(baseAssetId int64, counterAssetId int64) *TradesQ } // ForAccount filter Trades by account id -func (q *TradesQ) ForAccount(aid string) *TradesQ { +func (q *TradesQ) ForAccount(ctx context.Context, aid string) *TradesQ { var account Account - q.Err = q.parent.AccountByAddress(&account, aid) + q.Err = q.parent.AccountByAddress(ctx, &account, aid) if q.Err != nil { return q } @@ -89,7 +90,7 @@ func (q *TradesQ) ForAccount(aid string) *TradesQ { } // Page specifies the paging constraints for the query being built by `q`. -func (q *TradesQ) Page(page db2.PageQuery) *TradesQ { +func (q *TradesQ) Page(ctx context.Context, page db2.PageQuery) *TradesQ { if q.Err != nil { return q } @@ -119,8 +120,8 @@ func (q *TradesQ) Page(page db2.PageQuery) *TradesQ { secondSelect = q.sql.Where("htrd.counter_offer_id = ?", q.forOfferID) } - firstSelect = q.appendOrdering(firstSelect, op, idx, page.Order) - secondSelect = q.appendOrdering(secondSelect, op, idx, page.Order) + firstSelect = q.appendOrdering(ctx, firstSelect, op, idx, page.Order) + secondSelect = q.appendOrdering(ctx, secondSelect, op, idx, page.Order) firstSQL, firstArgs, err := firstSelect.ToSql() if err != nil { @@ -149,13 +150,13 @@ func (q *TradesQ) Page(page db2.PageQuery) *TradesQ { // Reset sql so it's not used accidentally q.sql = sq.SelectBuilder{} } else { - q.sql = q.appendOrdering(q.sql, op, idx, page.Order) + q.sql = q.appendOrdering(ctx, q.sql, op, idx, page.Order) q.sql = q.sql.Limit(page.Limit) } return q } -func (q *TradesQ) appendOrdering(sel sq.SelectBuilder, op, idx int64, order string) sq.SelectBuilder { +func (q *TradesQ) appendOrdering(ctx context.Context, sel sq.SelectBuilder, op, idx int64, order string) sq.SelectBuilder { // NOTE: Remember to test the queries below with EXPLAIN / EXPLAIN ANALYZE // before changing them. // This condition is using multicolumn index and it's easy to write it in a way that @@ -185,7 +186,7 @@ func (q *TradesQ) appendOrdering(sel sq.SelectBuilder, op, idx int64, order stri } // Select loads the results of the query specified by `q` into `dest`. -func (q *TradesQ) Select(dest interface{}) error { +func (q *TradesQ) Select(ctx context.Context, dest interface{}) error { if q.Err != nil { return q.Err } @@ -195,9 +196,9 @@ func (q *TradesQ) Select(dest interface{}) error { } if q.rawSQL != "" { - q.Err = q.parent.SelectRaw(dest, q.rawSQL, q.rawArgs...) + q.Err = q.parent.SelectRaw(ctx, dest, q.rawSQL, q.rawArgs...) } else { - q.Err = q.parent.Select(dest, q.sql) + q.Err = q.parent.Select(ctx, dest, q.sql) } return q.Err } @@ -269,5 +270,5 @@ func getCanonicalAssetOrder(assetId1 int64, assetId2 int64) (orderPreserved bool type QTrades interface { QCreateAccountsHistory NewTradeBatchInsertBuilder(maxBatchSize int) TradeBatchInsertBuilder - CreateAssets(assets []xdr.Asset, maxBatchSize int) (map[string]Asset, error) + CreateAssets(ctx context.Context, assets []xdr.Asset, maxBatchSize int) (map[string]Asset, error) } diff --git a/services/horizon/internal/db2/history/trade_batch_insert_builder.go b/services/horizon/internal/db2/history/trade_batch_insert_builder.go index f017ab7874..5c47082e8d 100644 --- a/services/horizon/internal/db2/history/trade_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/trade_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "time" "github.com/stellar/go/support/db" @@ -27,8 +28,8 @@ type InsertTrade struct { // TradeBatchInsertBuilder is used to insert trades into the // history_trades table type TradeBatchInsertBuilder interface { - Add(entries ...InsertTrade) error - Exec() error + Add(ctx context.Context, entries ...InsertTrade) error + Exec(ctx context.Context) error } // tradeBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -47,12 +48,12 @@ func (q *Q) NewTradeBatchInsertBuilder(maxBatchSize int) TradeBatchInsertBuilder } // Exec flushes all outstanding trades to the database -func (i *tradeBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *tradeBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } // Add adds a new trade to the batch -func (i *tradeBatchInsertBuilder) Add(entries ...InsertTrade) error { +func (i *tradeBatchInsertBuilder) Add(ctx context.Context, entries ...InsertTrade) error { for _, entry := range entries { sellOfferID := EncodeOfferId(uint64(entry.Trade.OfferId), CoreOfferIDType) @@ -90,7 +91,7 @@ func (i *tradeBatchInsertBuilder) Add(entries ...InsertTrade) error { entry.SellPrice.Invert() } - err := i.builder.Row(map[string]interface{}{ + err := i.builder.Row(ctx, map[string]interface{}{ "history_operation_id": entry.HistoryOperationID, "\"order\"": entry.Order, "ledger_closed_at": entry.LedgerCloseTime, diff --git a/services/horizon/internal/db2/history/trade_test.go b/services/horizon/internal/db2/history/trade_test.go index 591fbe2e3f..8d1cefb354 100644 --- a/services/horizon/internal/db2/history/trade_test.go +++ b/services/horizon/internal/db2/history/trade_test.go @@ -20,7 +20,7 @@ func TestTradeQueries(t *testing.T) { var trades []Trade // All trades - err := q.Trades().Page(db2.MustPageQuery("", false, "asc", 100)).Select(&trades) + err := q.Trades().Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)).Select(tt.Ctx, &trades) if tt.Assert.NoError(err) { tt.Assert.Len(trades, 4) } @@ -29,7 +29,7 @@ func TestTradeQueries(t *testing.T) { pq := db2.MustPageQuery(trades[0].PagingToken(), false, "asc", 1) var pt []Trade - err = q.Trades().Page(pq).Select(&pt) + err = q.Trades().Page(tt.Ctx, pq).Select(tt.Ctx, &pt) if tt.Assert.NoError(err) { if tt.Assert.Len(pt, 1) { tt.Assert.Equal(trades[1], pt[0]) @@ -38,25 +38,25 @@ func TestTradeQueries(t *testing.T) { // Cursor bounds checking pq = db2.MustPageQuery("", false, "desc", 1) - err = q.Trades().Page(pq).Select(&pt) + err = q.Trades().Page(tt.Ctx, pq).Select(tt.Ctx, &pt) tt.Require.NoError(err) // test for asset pairs - lumen, err := q.GetAssetID(xdr.MustNewNativeAsset()) + lumen, err := q.GetAssetID(tt.Ctx, xdr.MustNewNativeAsset()) tt.Require.NoError(err) - assetUSD, err := q.GetAssetID(xdr.MustNewCreditAsset("USD", "GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD")) + assetUSD, err := q.GetAssetID(tt.Ctx, xdr.MustNewCreditAsset("USD", "GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD")) tt.Require.NoError(err) - assetEUR, err := q.GetAssetID(xdr.MustNewCreditAsset("EUR", "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU")) + assetEUR, err := q.GetAssetID(tt.Ctx, xdr.MustNewCreditAsset("EUR", "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU")) tt.Require.NoError(err) - err = q.TradesForAssetPair(assetUSD, assetEUR).Page(db2.MustPageQuery("", false, "asc", 100)).Select(&trades) + err = q.TradesForAssetPair(assetUSD, assetEUR).Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)).Select(tt.Ctx, &trades) tt.Require.NoError(err) tt.Assert.Len(trades, 0) - assetUSD, err = q.GetAssetID(xdr.MustNewCreditAsset("USD", "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU")) + assetUSD, err = q.GetAssetID(tt.Ctx, xdr.MustNewCreditAsset("USD", "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU")) tt.Require.NoError(err) - err = q.TradesForAssetPair(lumen, assetUSD).Page(db2.MustPageQuery("", false, "asc", 100)).Select(&trades) + err = q.TradesForAssetPair(lumen, assetUSD).Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)).Select(tt.Ctx, &trades) tt.Require.NoError(err) tt.Assert.Len(trades, 1) @@ -65,7 +65,7 @@ func TestTradeQueries(t *testing.T) { tt.Assert.Equal(true, trades[0].BaseIsSeller) // reverse assets - err = q.TradesForAssetPair(assetUSD, lumen).Page(db2.MustPageQuery("", false, "asc", 100)).Select(&trades) + err = q.TradesForAssetPair(assetUSD, lumen).Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)).Select(tt.Ctx, &trades) tt.Require.NoError(err) tt.Assert.Len(trades, 1) @@ -130,7 +130,7 @@ func createInsertTrades( func createAccountsAndAssets( tt *test.T, q *Q, accounts []string, assets []xdr.Asset, ) ([]int64, []int64) { - addressToAccounts, err := q.CreateAccounts(accounts, 2) + addressToAccounts, err := q.CreateAccounts(tt.Ctx, accounts, 2) tt.Assert.NoError(err) accountIDs := []int64{} @@ -138,7 +138,7 @@ func createAccountsAndAssets( accountIDs = append(accountIDs, addressToAccounts[account]) } - assetMap, err := q.CreateAssets(assets, 2) + assetMap, err := q.CreateAssets(tt.Ctx, assets, 2) tt.Assert.NoError(err) assetIDs := []int64{} @@ -195,12 +195,12 @@ func TestBatchInsertTrade(t *testing.T) { builder := q.NewTradeBatchInsertBuilder(1) tt.Assert.NoError( - builder.Add(first, second, third), + builder.Add(tt.Ctx, first, second, third), ) - tt.Assert.NoError(builder.Exec()) + tt.Assert.NoError(builder.Exec(tt.Ctx)) var rows []Trade - tt.Assert.NoError(q.Trades().Page(db2.MustPageQuery("", false, "asc", 100)).Select(&rows)) + tt.Assert.NoError(q.Trades().Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)).Select(tt.Ctx, &rows)) idToAccount := buildIDtoAccountMapping(addresses, accountIDs) idToAsset := buildIDtoAssetMapping(assets, assetIDs) @@ -324,11 +324,11 @@ func TestTradesQueryForAccount(t *testing.T) { var trades []Trade account := "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU" - tradesQ.ForAccount(account) + tradesQ.ForAccount(tt.Ctx, account) tt.Assert.Equal(int64(15), tradesQ.forAccountID) tt.Assert.Equal(int64(0), tradesQ.forOfferID) - tradesQ.Page(db2.MustPageQuery("", false, "desc", 100)) + tradesQ.Page(tt.Ctx, db2.MustPageQuery("", false, "desc", 100)) _, _, err := tradesQ.sql.ToSql() // q.sql was reset in Page so should return error tt.Assert.EqualError(err, "select statements must have at least one result column") @@ -346,7 +346,7 @@ func TestTradesQueryForAccount(t *testing.T) { )) ORDER BY htrd.history_operation_id desc, htrd.order desc) ORDER BY history_operation_id desc, "order" desc LIMIT 100` tt.Assert.Equal(expectedRawSQL, tradesQ.rawSQL) - err = tradesQ.Select(&trades) + err = tradesQ.Select(tt.Ctx, &trades) tt.Assert.NoError(err) tt.Assert.Len(trades, 3) @@ -376,7 +376,7 @@ func TestTradesQueryForOffer(t *testing.T) { tt.Assert.Equal(int64(0), tradesQ.forAccountID) tt.Assert.Equal(int64(2), tradesQ.forOfferID) - tradesQ.Page(db2.MustPageQuery("", false, "asc", 100)) + tradesQ.Page(tt.Ctx, db2.MustPageQuery("", false, "asc", 100)) _, _, err := tradesQ.sql.ToSql() // q.sql was reset in Page so should return error tt.Assert.EqualError(err, "select statements must have at least one result column") @@ -394,7 +394,7 @@ func TestTradesQueryForOffer(t *testing.T) { )) ORDER BY htrd.history_operation_id asc, htrd.order asc) ORDER BY history_operation_id asc, "order" asc LIMIT 100` tt.Assert.Equal(expectedRawSQL, tradesQ.rawSQL) - err = tradesQ.Select(&trades) + err = tradesQ.Select(tt.Ctx, &trades) tt.Assert.NoError(err) tt.Assert.Len(trades, 2) diff --git a/services/horizon/internal/db2/history/transaction.go b/services/horizon/internal/db2/history/transaction.go index 63075488c7..622bf60287 100644 --- a/services/horizon/internal/db2/history/transaction.go +++ b/services/horizon/internal/db2/history/transaction.go @@ -1,7 +1,10 @@ package history import ( + "context" + sq "github.com/Masterminds/squirrel" + "github.com/stellar/go/services/horizon/internal/db2" "github.com/stellar/go/services/horizon/internal/toid" "github.com/stellar/go/support/errors" @@ -10,7 +13,7 @@ import ( // TransactionByHash is a query that loads a single row from the // `history_transactions` table based upon the provided hash. -func (q *Q) TransactionByHash(dest interface{}, hash string) error { +func (q *Q) TransactionByHash(ctx context.Context, dest interface{}, hash string) error { byHash := selectTransaction. Where("ht.transaction_hash = ?", hash) byInnerHash := selectTransaction. @@ -22,12 +25,12 @@ func (q *Q) TransactionByHash(dest interface{}, hash string) error { } union := byHash.Suffix("UNION ALL "+byInnerHashString, args...) - return q.Get(dest, union) + return q.Get(ctx, dest, union) } // TransactionsByIDs fetches transactions from the `history_transactions` table // which match the given ids -func (q *Q) TransactionsByIDs(ids ...int64) (map[int64]Transaction, error) { +func (q *Q) TransactionsByIDs(ctx context.Context, ids ...int64) (map[int64]Transaction, error) { if len(ids) == 0 { return nil, errors.New("no id arguments provided") } @@ -37,7 +40,7 @@ func (q *Q) TransactionsByIDs(ids ...int64) (map[int64]Transaction, error) { }) var transactions []Transaction - if err := q.Select(&transactions, sql); err != nil { + if err := q.Select(ctx, &transactions, sql); err != nil { return nil, err } @@ -61,9 +64,9 @@ func (q *Q) Transactions() *TransactionsQ { } // ForAccount filters the transactions collection to a specific account -func (q *TransactionsQ) ForAccount(aid string) *TransactionsQ { +func (q *TransactionsQ) ForAccount(ctx context.Context, aid string) *TransactionsQ { var account Account - q.Err = q.parent.AccountByAddress(&account, aid) + q.Err = q.parent.AccountByAddress(ctx, &account, aid) if q.Err != nil { return q } @@ -76,10 +79,10 @@ func (q *TransactionsQ) ForAccount(aid string) *TransactionsQ { } // ForClaimableBalance filters the transactions collection to a specific claimable balance -func (q *TransactionsQ) ForClaimableBalance(cbID xdr.ClaimableBalanceId) *TransactionsQ { +func (q *TransactionsQ) ForClaimableBalance(ctx context.Context, cbID xdr.ClaimableBalanceId) *TransactionsQ { var hCB HistoryClaimableBalance - hCB, q.Err = q.parent.ClaimableBalanceByID(cbID) + hCB, q.Err = q.parent.ClaimableBalanceByID(ctx, cbID) if q.Err != nil { return q } @@ -93,9 +96,9 @@ func (q *TransactionsQ) ForClaimableBalance(cbID xdr.ClaimableBalanceId) *Transa // ForLedger filters the query to a only transactions in a specific ledger, // specified by its sequence. -func (q *TransactionsQ) ForLedger(seq int32) *TransactionsQ { +func (q *TransactionsQ) ForLedger(ctx context.Context, seq int32) *TransactionsQ { var ledger Ledger - q.Err = q.parent.LedgerBySequence(&ledger, seq) + q.Err = q.parent.LedgerBySequence(ctx, &ledger, seq) if q.Err != nil { return q } @@ -128,7 +131,7 @@ func (q *TransactionsQ) Page(page db2.PageQuery) *TransactionsQ { } // Select loads the results of the query specified by `q` into `dest`. -func (q *TransactionsQ) Select(dest interface{}) error { +func (q *TransactionsQ) Select(ctx context.Context, dest interface{}) error { if q.Err != nil { return q.Err } @@ -138,7 +141,7 @@ func (q *TransactionsQ) Select(dest interface{}) error { Where("(ht.successful = true OR ht.successful IS NULL)") } - q.Err = q.parent.Select(dest, q.sql) + q.Err = q.parent.Select(ctx, dest, q.sql) if q.Err != nil { return q.Err } diff --git a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go index 256f4a59fa..eb8e24c644 100644 --- a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go @@ -1,6 +1,7 @@ package history import ( + "context" "database/sql/driver" "encoding/base64" "encoding/hex" @@ -24,8 +25,8 @@ import ( // TransactionBatchInsertBuilder is used to insert transactions into the // history_transactions table type TransactionBatchInsertBuilder interface { - Add(transaction ingest.LedgerTransaction, sequence uint32) error - Exec() error + Add(ctx context.Context, transaction ingest.LedgerTransaction, sequence uint32) error + Exec(ctx context.Context) error } // transactionBatchInsertBuilder is a simple wrapper around db.BatchInsertBuilder @@ -44,17 +45,17 @@ func (q *Q) NewTransactionBatchInsertBuilder(maxBatchSize int) TransactionBatchI } // Add adds a new transaction to the batch -func (i *transactionBatchInsertBuilder) Add(transaction ingest.LedgerTransaction, sequence uint32) error { +func (i *transactionBatchInsertBuilder) Add(ctx context.Context, transaction ingest.LedgerTransaction, sequence uint32) error { row, err := transactionToRow(transaction, sequence) if err != nil { return err } - return i.builder.RowStruct(row) + return i.builder.RowStruct(ctx, row) } -func (i *transactionBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *transactionBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } // TimeBounds represents the time bounds of a Stellar transaction diff --git a/services/horizon/internal/db2/history/transaction_test.go b/services/horizon/internal/db2/history/transaction_test.go index 1ff437ad41..e07d24e9c3 100644 --- a/services/horizon/internal/db2/history/transaction_test.go +++ b/services/horizon/internal/db2/history/transaction_test.go @@ -22,11 +22,11 @@ func TestTransactionQueries(t *testing.T) { // Test TransactionByHash var tx Transaction real := "2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d" - err := q.TransactionByHash(&tx, real) + err := q.TransactionByHash(tt.Ctx, &tx, real) tt.Assert.NoError(err) fake := "not_real" - err = q.TransactionByHash(&tx, fake) + err = q.TransactionByHash(tt.Ctx, &tx, fake) tt.Assert.Equal(err, sql.ErrNoRows) } @@ -43,9 +43,9 @@ func TestTransactionSuccessfulOnly(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Transactions(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") - err := query.Select(&transactions) + err := query.Select(tt.Ctx, &transactions) tt.Assert.NoError(err) tt.Assert.Equal(3, len(transactions)) @@ -70,10 +70,10 @@ func TestTransactionIncludeFailed(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Transactions(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). IncludeFailed() - err := query.Select(&transactions) + err := query.Select(tt.Ctx, &transactions) tt.Assert.NoError(err) var failed, successful int @@ -108,10 +108,10 @@ func TestExtraChecksTransactionSuccessfulTrueResultFalse(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Transactions(). - ForAccount("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). + ForAccount(tt.Ctx, "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"). IncludeFailed() - err = query.Select(&transactions) + err = query.Select(tt.Ctx, &transactions) tt.Assert.Error(err) tt.Assert.Contains(err.Error(), "Corrupted data! `successful=true` but returned transaction is not success") } @@ -131,10 +131,10 @@ func TestExtraChecksTransactionSuccessfulFalseResultTrue(t *testing.T) { q := &Q{tt.HorizonSession()} query := q.Transactions(). - ForAccount("GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). + ForAccount(tt.Ctx, "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"). IncludeFailed() - err = query.Select(&transactions) + err = query.Select(tt.Ctx, &transactions) tt.Assert.Error(err) tt.Assert.Contains(err.Error(), "Corrupted data! `successful=false` but returned transaction is success") } @@ -165,12 +165,12 @@ func TestInsertTransactionDoesNotAllowDuplicateIndex(t *testing.T) { hash: "7e2def20d5a21a56be2a457b648f702ee1af889d3df65790e92a05081e9fabf1", }) - tt.Assert.NoError(insertBuilder.Add(firstTransaction, sequence)) - tt.Assert.NoError(insertBuilder.Exec()) + tt.Assert.NoError(insertBuilder.Add(tt.Ctx, firstTransaction, sequence)) + tt.Assert.NoError(insertBuilder.Exec(tt.Ctx)) - tt.Assert.NoError(insertBuilder.Add(secondTransaction, sequence)) + tt.Assert.NoError(insertBuilder.Add(tt.Ctx, secondTransaction, sequence)) tt.Assert.EqualError( - insertBuilder.Exec(), + insertBuilder.Exec(tt.Ctx), "error adding values while inserting to history_transactions: "+ "exec failed: pq: duplicate key value violates unique constraint "+ "\"hs_transaction_by_id\"", @@ -197,11 +197,11 @@ func TestInsertTransactionDoesNotAllowDuplicateIndex(t *testing.T) { } *ledger.SuccessfulTransactionCount = 12 *ledger.FailedTransactionCount = 3 - _, err := q.Exec(sq.Insert("history_ledgers").SetMap(ledgerToMap(ledger))) + _, err := q.Exec(tt.Ctx, sq.Insert("history_ledgers").SetMap(ledgerToMap(ledger))) tt.Assert.NoError(err) var transactions []Transaction - tt.Assert.NoError(q.Transactions().Select(&transactions)) + tt.Assert.NoError(q.Transactions().Select(tt.Ctx, &transactions)) tt.Assert.Len(transactions, 1) tt.Assert.Equal( "19aaa18db88605aedec04659fb45e06f240b022eb2d429e05133e4d53cd945ba", @@ -237,7 +237,7 @@ func TestInsertTransaction(t *testing.T) { } *ledger.SuccessfulTransactionCount = 12 *ledger.FailedTransactionCount = 3 - _, err := q.Exec(sq.Insert("history_ledgers").SetMap(ledgerToMap(ledger))) + _, err := q.Exec(tt.Ctx, sq.Insert("history_ledgers").SetMap(ledgerToMap(ledger))) tt.Assert.NoError(err) insertBuilder := q.NewTransactionBatchInsertBuilder(0) @@ -692,11 +692,11 @@ func TestInsertTransaction(t *testing.T) { }, } { t.Run(testCase.name, func(t *testing.T) { - tt.Assert.NoError(insertBuilder.Add(testCase.toInsert, sequence)) - tt.Assert.NoError(insertBuilder.Exec()) + tt.Assert.NoError(insertBuilder.Add(tt.Ctx, testCase.toInsert, sequence)) + tt.Assert.NoError(insertBuilder.Exec(tt.Ctx)) var transactions []Transaction - tt.Assert.NoError(q.Transactions().IncludeFailed().Select(&transactions)) + tt.Assert.NoError(q.Transactions().IncludeFailed().Select(tt.Ctx, &transactions)) tt.Assert.Len(transactions, 1) transaction := transactions[0] @@ -712,7 +712,7 @@ func TestInsertTransaction(t *testing.T) { tt.Assert.True(closedAt.Equal(testCase.expected.LedgerCloseTime)) tt.Assert.Equal(transaction, testCase.expected) - _, err = q.Exec(sq.Delete("history_transactions")) + _, err = q.Exec(tt.Ctx, sq.Delete("history_transactions")) tt.Assert.NoError(err) }) } @@ -727,20 +727,20 @@ func TestFetchFeeBumpTransaction(t *testing.T) { fixture := FeeBumpScenario(tt, q, true) var byOuterhash, byInnerHash Transaction - tt.Assert.NoError(q.TransactionByHash(&byOuterhash, fixture.OuterHash)) - tt.Assert.NoError(q.TransactionByHash(&byInnerHash, fixture.InnerHash)) + tt.Assert.NoError(q.TransactionByHash(tt.Ctx, &byOuterhash, fixture.OuterHash)) + tt.Assert.NoError(q.TransactionByHash(tt.Ctx, &byInnerHash, fixture.InnerHash)) tt.Assert.Equal(byOuterhash, byInnerHash) tt.Assert.Equal(byOuterhash, fixture.Transaction) outerOps, outerTransactions, err := q.Operations().IncludeTransactions(). - ForTransaction(fixture.OuterHash).Fetch() + ForTransaction(tt.Ctx, fixture.OuterHash).Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(outerTransactions, 1) tt.Assert.Len(outerOps, 1) innerOps, innerTransactions, err := q.Operations().IncludeTransactions(). - ForTransaction(fixture.InnerHash).Fetch() + ForTransaction(tt.Ctx, fixture.InnerHash).Fetch(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Len(innerTransactions, 1) tt.Assert.Equal(innerOps, outerOps) @@ -754,11 +754,11 @@ func TestFetchFeeBumpTransaction(t *testing.T) { } var outerEffects, innerEffects []Effect - err = q.Effects().ForTransaction(fixture.OuterHash).Select(&outerEffects) + err = q.Effects().ForTransaction(tt.Ctx, fixture.OuterHash).Select(tt.Ctx, &outerEffects) tt.Assert.NoError(err) tt.Assert.Len(outerEffects, 1) - err = q.Effects().ForTransaction(fixture.InnerHash).Select(&innerEffects) + err = q.Effects().ForTransaction(tt.Ctx, fixture.InnerHash).Select(tt.Ctx, &innerEffects) tt.Assert.NoError(err) tt.Assert.Equal(outerEffects, innerEffects) } diff --git a/services/horizon/internal/db2/history/trust_lines.go b/services/horizon/internal/db2/history/trust_lines.go index 27c3705643..1d351c9cd3 100644 --- a/services/horizon/internal/db2/history/trust_lines.go +++ b/services/horizon/internal/db2/history/trust_lines.go @@ -1,6 +1,7 @@ package history import ( + "context" "database/sql" "encoding/base64" @@ -31,7 +32,7 @@ func (trustLine TrustLine) IsClawbackEnabled() bool { // AssetsForAddress returns a list of assets and balances for those assets held by // a given address. -func (q *Q) AssetsForAddress(addy string) ([]xdr.Asset, []xdr.Int64, error) { +func (q *Q) AssetsForAddress(ctx context.Context, addy string) ([]xdr.Asset, []xdr.Int64, error) { if tx := q.GetTx(); tx == nil { return nil, nil, errors.New("cannot be called outside of a transaction") } @@ -39,7 +40,7 @@ func (q *Q) AssetsForAddress(addy string) ([]xdr.Asset, []xdr.Int64, error) { return nil, nil, errors.New("should only be called in a repeatable read transaction") } - account, err := q.GetAccountByID(addy) + account, err := q.GetAccountByID(ctx, addy) if q.NoRows(err) { // if there is no account for the given address then @@ -50,7 +51,7 @@ func (q *Q) AssetsForAddress(addy string) ([]xdr.Asset, []xdr.Int64, error) { } var tls []TrustLine - err = q.Select(&tls, selectTrustLines.Where(sq.Eq{"account_id": addy})) + err = q.Select(ctx, &tls, selectTrustLines.Where(sq.Eq{"account_id": addy})) if err != nil { return nil, nil, err } @@ -68,23 +69,23 @@ func (q *Q) AssetsForAddress(addy string) ([]xdr.Asset, []xdr.Int64, error) { return assets, balances, err } -func (q *Q) CountTrustLines() (int, error) { +func (q *Q) CountTrustLines(ctx context.Context) (int, error) { sql := sq.Select("count(*)").From("trust_lines") var count int - if err := q.Get(&count, sql); err != nil { + if err := q.Get(ctx, &count, sql); err != nil { return 0, errors.Wrap(err, "could not run select query") } return count, nil } -func (q *Q) GetSortedTrustLinesByAccountID(id string) ([]TrustLine, error) { - return q.GetSortedTrustLinesByAccountIDs([]string{id}) +func (q *Q) GetSortedTrustLinesByAccountID(ctx context.Context, id string) ([]TrustLine, error) { + return q.GetSortedTrustLinesByAccountIDs(ctx, []string{id}) } // GetTrustLinesByKeys loads a row from the `trust_lines` table, selected by multiple keys. -func (q *Q) GetTrustLinesByKeys(keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) { +func (q *Q) GetTrustLinesByKeys(ctx context.Context, keys []xdr.LedgerKeyTrustLine) ([]TrustLine, error) { var trustLines []TrustLine lkeys := make([]string, 0, len(keys)) for _, key := range keys { @@ -95,13 +96,13 @@ func (q *Q) GetTrustLinesByKeys(keys []xdr.LedgerKeyTrustLine) ([]TrustLine, err lkeys = append(lkeys, lkey) } sql := selectTrustLines.Where(map[string]interface{}{"trust_lines.ledger_key": lkeys}) - err := q.Select(&trustLines, sql) + err := q.Select(ctx, &trustLines, sql) return trustLines, err } // InsertTrustLine creates a row in the trust lines table. // Returns number of rows affected and error. -func (q *Q) InsertTrustLine(entry xdr.LedgerEntry) (int64, error) { +func (q *Q) InsertTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { m := trustLineToMap(entry) // Add lkey only when inserting rows @@ -112,7 +113,7 @@ func (q *Q) InsertTrustLine(entry xdr.LedgerEntry) (int64, error) { m["ledger_key"] = key sql := sq.Insert("trust_lines").SetMap(m) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -122,7 +123,7 @@ func (q *Q) InsertTrustLine(entry xdr.LedgerEntry) (int64, error) { // UpdateTrustLine updates a row in the trust lines table. // Returns number of rows affected and error. -func (q *Q) UpdateTrustLine(entry xdr.LedgerEntry) (int64, error) { +func (q *Q) UpdateTrustLine(ctx context.Context, entry xdr.LedgerEntry) (int64, error) { key, err := trustLineEntryToLedgerKeyString(entry) if err != nil { return 0, errors.Wrap(err, "Error running trustLineEntryToLedgerKeyString") @@ -131,7 +132,7 @@ func (q *Q) UpdateTrustLine(entry xdr.LedgerEntry) (int64, error) { sql := sq.Update("trust_lines"). SetMap(trustLineToMap(entry)). Where(map[string]interface{}{"ledger_key": key}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -143,7 +144,7 @@ func (q *Q) UpdateTrustLine(entry xdr.LedgerEntry) (int64, error) { // There's currently no limit of the number of trust lines this method can // accept other than 2GB limit of the query string length what should be enough // for each ledger with the current limits. -func (q *Q) UpsertTrustLines(trustLines []xdr.LedgerEntry) error { +func (q *Q) UpsertTrustLines(ctx context.Context, trustLines []xdr.LedgerEntry) error { var ledgerKey, accountID, assetIssuer, assetCode []string var balance, limit, buyingLiabilities, sellingLiabilities []xdr.Int64 var flags, lastModifiedLedger []xdr.Uint32 @@ -220,7 +221,7 @@ func (q *Q) UpsertTrustLines(trustLines []xdr.LedgerEntry) error { last_modified_ledger = excluded.last_modified_ledger, sponsor = excluded.sponsor` - _, err := q.ExecRaw(sql, + _, err := q.ExecRaw(ctx, sql, pq.Array(ledgerKey), pq.Array(accountID), pq.Array(assetType), @@ -238,7 +239,7 @@ func (q *Q) UpsertTrustLines(trustLines []xdr.LedgerEntry) error { // RemoveTrustLine deletes a row in the trust lines table. // Returns number of rows affected and error. -func (q *Q) RemoveTrustLine(ledgerKey xdr.LedgerKeyTrustLine) (int64, error) { +func (q *Q) RemoveTrustLine(ctx context.Context, ledgerKey xdr.LedgerKeyTrustLine) (int64, error) { key, err := ledgerKeyTrustLineToString(ledgerKey) if err != nil { return 0, errors.Wrap(err, "Error ledgerKeyTrustLineToString MarshalBinaryCompress") @@ -246,7 +247,7 @@ func (q *Q) RemoveTrustLine(ledgerKey xdr.LedgerKeyTrustLine) (int64, error) { sql := sq.Delete("trust_lines"). Where(map[string]interface{}{"ledger_key": key}) - result, err := q.Exec(sql) + result, err := q.Exec(ctx, sql) if err != nil { return 0, err } @@ -255,10 +256,10 @@ func (q *Q) RemoveTrustLine(ledgerKey xdr.LedgerKeyTrustLine) (int64, error) { } // GetSortedTrustLinesByAccountIDs loads trust lines for a list of accounts ID, ordered by asset and issuer -func (q *Q) GetSortedTrustLinesByAccountIDs(id []string) ([]TrustLine, error) { +func (q *Q) GetSortedTrustLinesByAccountIDs(ctx context.Context, id []string) ([]TrustLine, error) { var data []TrustLine sql := selectTrustLines.Where(sq.Eq{"account_id": id}).OrderBy("asset_code", "asset_issuer") - err := q.Select(&data, sql) + err := q.Select(ctx, &data, sql) return data, err } diff --git a/services/horizon/internal/db2/history/trust_lines_batch_insert_builder.go b/services/horizon/internal/db2/history/trust_lines_batch_insert_builder.go index aa6b32dc5b..cb710b5c4b 100644 --- a/services/horizon/internal/db2/history/trust_lines_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/trust_lines_batch_insert_builder.go @@ -1,13 +1,15 @@ package history import ( + "context" + "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) // Add adds a new trust line entry to the batch. `lastModifiedLedger` is another // parameter because `xdr.TrustLineEntry` does not have a field to hold this value. -func (i *trustLinesBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { +func (i *trustLinesBatchInsertBuilder) Add(ctx context.Context, entry xdr.LedgerEntry) error { m := trustLineToMap(entry) // Add lkey only when inserting rows @@ -17,9 +19,9 @@ func (i *trustLinesBatchInsertBuilder) Add(entry xdr.LedgerEntry) error { } m["ledger_key"] = key - return i.builder.Row(m) + return i.builder.Row(ctx, m) } -func (i *trustLinesBatchInsertBuilder) Exec() error { - return i.builder.Exec() +func (i *trustLinesBatchInsertBuilder) Exec(ctx context.Context) error { + return i.builder.Exec(ctx) } diff --git a/services/horizon/internal/db2/history/trust_lines_test.go b/services/horizon/internal/db2/history/trust_lines_test.go index 49aca2fa53..204567d241 100644 --- a/services/horizon/internal/db2/history/trust_lines_test.go +++ b/services/horizon/internal/db2/history/trust_lines_test.go @@ -108,11 +108,11 @@ func TestInsertTrustLine(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertTrustLine(eurTrustLine) + rows, err := q.InsertTrustLine(tt.Ctx, eurTrustLine) assert.NoError(t, err) assert.Equal(t, int64(1), rows) - rows, err = q.InsertTrustLine(usdTrustLine) + rows, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) assert.NoError(t, err) assert.Equal(t, int64(1), rows) @@ -121,7 +121,7 @@ func TestInsertTrustLine(t *testing.T) { {Asset: usdTrustLine.Data.TrustLine.Asset, AccountId: usdTrustLine.Data.TrustLine.AccountId}, } - lines, err := q.GetTrustLinesByKeys(keys) + lines, err := q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 2) @@ -134,7 +134,7 @@ func TestUpdateTrustLine(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertTrustLine(eurTrustLine) + rows, err := q.InsertTrustLine(tt.Ctx, eurTrustLine) assert.NoError(t, err) assert.Equal(t, int64(1), rows) @@ -145,14 +145,14 @@ func TestUpdateTrustLine(t *testing.T) { modifiedTrustLine.Ext.V1 = &v1Copy modifiedTrustLine.Data.TrustLine.Balance = 30000 - rows, err = q.UpdateTrustLine(modifiedTrustLine) + rows, err = q.UpdateTrustLine(tt.Ctx, modifiedTrustLine) assert.NoError(t, err) assert.Equal(t, int64(1), rows) keys := []xdr.LedgerKeyTrustLine{ {Asset: eurTrustLine.Data.TrustLine.Asset, AccountId: eurTrustLine.Data.TrustLine.AccountId}, } - lines, err := q.GetTrustLinesByKeys(keys) + lines, err := q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 1) @@ -189,25 +189,25 @@ func TestUpsertTrustLines(t *testing.T) { q := &Q{tt.HorizonSession()} // Upserting nothing is no op - err := q.UpsertTrustLines([]xdr.LedgerEntry{}) + err := q.UpsertTrustLines(tt.Ctx, []xdr.LedgerEntry{}) assert.NoError(t, err) ledgerEntries := []xdr.LedgerEntry{eurTrustLine, usdTrustLine} - err = q.UpsertTrustLines(ledgerEntries) + err = q.UpsertTrustLines(tt.Ctx, ledgerEntries) assert.NoError(t, err) keys := []xdr.LedgerKeyTrustLine{ {Asset: eurTrustLine.Data.TrustLine.Asset, AccountId: eurTrustLine.Data.TrustLine.AccountId}, } - lines, err := q.GetTrustLinesByKeys(keys) + lines, err := q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 1) keys = []xdr.LedgerKeyTrustLine{ {Asset: usdTrustLine.Data.TrustLine.Asset, AccountId: usdTrustLine.Data.TrustLine.AccountId}, } - lines, err = q.GetTrustLinesByKeys(keys) + lines, err = q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 1) @@ -216,13 +216,13 @@ func TestUpsertTrustLines(t *testing.T) { ledgerEntries = []xdr.LedgerEntry{modifiedTrustLine} - err = q.UpsertTrustLines(ledgerEntries) + err = q.UpsertTrustLines(tt.Ctx, ledgerEntries) assert.NoError(t, err) keys = []xdr.LedgerKeyTrustLine{ {Asset: eurTrustLine.Data.TrustLine.Asset, AccountId: eurTrustLine.Data.TrustLine.AccountId}, } - lines, err = q.GetTrustLinesByKeys(keys) + lines, err = q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 1) @@ -267,7 +267,7 @@ func TestUpsertTrustLines(t *testing.T) { keys = []xdr.LedgerKeyTrustLine{ {Asset: usdTrustLine.Data.TrustLine.Asset, AccountId: usdTrustLine.Data.TrustLine.AccountId}, } - lines, err = q.GetTrustLinesByKeys(keys) + lines, err = q.GetTrustLinesByKeys(tt.Ctx, keys) assert.NoError(t, err) assert.Len(t, lines, 1) @@ -309,21 +309,21 @@ func TestRemoveTrustLine(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - rows, err := q.InsertTrustLine(eurTrustLine) + rows, err := q.InsertTrustLine(tt.Ctx, eurTrustLine) assert.NoError(t, err) assert.Equal(t, int64(1), rows) key := xdr.LedgerKeyTrustLine{Asset: eurTrustLine.Data.TrustLine.Asset, AccountId: eurTrustLine.Data.TrustLine.AccountId} - rows, err = q.RemoveTrustLine(key) + rows, err = q.RemoveTrustLine(tt.Ctx, key) assert.NoError(t, err) assert.Equal(t, int64(1), rows) - lines, err := q.GetTrustLinesByKeys([]xdr.LedgerKeyTrustLine{key}) + lines, err := q.GetTrustLinesByKeys(tt.Ctx, []xdr.LedgerKeyTrustLine{key}) assert.NoError(t, err) assert.Len(t, lines, 0) // Doesn't exist anymore - rows, err = q.RemoveTrustLine(key) + rows, err = q.RemoveTrustLine(tt.Ctx, key) assert.NoError(t, err) assert.Equal(t, int64(0), rows) } @@ -333,11 +333,11 @@ func TestGetSortedTrustLinesByAccountsID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.InsertTrustLine(eurTrustLine) + _, err := q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(usdTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine) tt.Assert.NoError(err) - _, err = q.InsertTrustLine(usdTrustLine2) + _, err = q.InsertTrustLine(tt.Ctx, usdTrustLine2) tt.Assert.NoError(err) ids := []string{ @@ -345,7 +345,7 @@ func TestGetSortedTrustLinesByAccountsID(t *testing.T) { usdTrustLine.Data.TrustLine.AccountId.Address(), } - records, err := q.GetSortedTrustLinesByAccountIDs(ids) + records, err := q.GetSortedTrustLinesByAccountIDs(tt.Ctx, ids) tt.Assert.NoError(err) tt.Assert.Len(records, 2) @@ -378,10 +378,10 @@ func TestGetTrustLinesByAccountID(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, err := q.InsertTrustLine(eurTrustLine) + _, err := q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) - record, err := q.GetSortedTrustLinesByAccountID(eurTrustLine.Data.TrustLine.AccountId.Address()) + record, err := q.GetSortedTrustLinesByAccountID(tt.Ctx, eurTrustLine.Data.TrustLine.AccountId.Address()) tt.Assert.NoError(err) asset := xdr.MustNewCreditAsset(record[0].AssetCode, record[0].AssetIssuer) @@ -401,13 +401,13 @@ func TestAssetsForAddressRequiresTransaction(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - _, _, err := q.AssetsForAddress(eurTrustLine.Data.TrustLine.AccountId.Address()) + _, _, err := q.AssetsForAddress(tt.Ctx, eurTrustLine.Data.TrustLine.AccountId.Address()) assert.EqualError(t, err, "cannot be called outside of a transaction") - assert.NoError(t, q.Begin()) - defer q.Rollback() + assert.NoError(t, q.Begin(tt.Ctx)) + defer q.Rollback(tt.Ctx) - _, _, err = q.AssetsForAddress(eurTrustLine.Data.TrustLine.AccountId.Address()) + _, _, err = q.AssetsForAddress(tt.Ctx, eurTrustLine.Data.TrustLine.AccountId.Address()) assert.EqualError(t, err, "should only be called in a repeatable read transaction") } @@ -419,10 +419,10 @@ func TestAssetsForAddress(t *testing.T) { ledgerEntries := []xdr.LedgerEntry{account1} - err := q.UpsertAccounts(ledgerEntries) + err := q.UpsertAccounts(tt.Ctx, ledgerEntries) assert.NoError(t, err) - _, err = q.InsertTrustLine(eurTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, eurTrustLine) tt.Assert.NoError(err) brlTrustLine := xdr.LedgerEntry{ @@ -448,22 +448,22 @@ func TestAssetsForAddress(t *testing.T) { }, } - _, err = q.InsertTrustLine(brlTrustLine) + _, err = q.InsertTrustLine(tt.Ctx, brlTrustLine) tt.Assert.NoError(err) - err = q.BeginTx(&sql.TxOptions{ + err = q.BeginTx(tt.Ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) assert.NoError(t, err) - defer q.Rollback() + defer q.Rollback(tt.Ctx) - assets, balances, err := q.AssetsForAddress(usdTrustLine.Data.TrustLine.AccountId.Address()) + assets, balances, err := q.AssetsForAddress(tt.Ctx, usdTrustLine.Data.TrustLine.AccountId.Address()) tt.Assert.NoError(err) tt.Assert.Empty(assets) tt.Assert.Empty(balances) - assets, balances, err = q.AssetsForAddress(account1.Data.Account.AccountId.Address()) + assets, balances, err = q.AssetsForAddress(tt.Ctx, account1.Data.Account.AccountId.Address()) tt.Assert.NoError(err) assetsToBalance := map[string]xdr.Int64{} diff --git a/services/horizon/internal/health.go b/services/horizon/internal/health.go index b15214fc03..c41e4c8007 100644 --- a/services/horizon/internal/health.go +++ b/services/horizon/internal/health.go @@ -68,7 +68,7 @@ func (h healthCheck) runCheck() healthResponse { CoreUp: true, CoreSynced: true, } - if err := h.session.Ping(dbPingTimeout); err != nil { + if err := h.session.Ping(h.ctx, dbPingTimeout); err != nil { healthLogger.Warnf("could not ping db: %s", err) response.DatabaseConnected = false } diff --git a/services/horizon/internal/health_test.go b/services/horizon/internal/health_test.go index 7e1fc4d9c5..c235f6c8ce 100644 --- a/services/horizon/internal/health_test.go +++ b/services/horizon/internal/health_test.go @@ -118,9 +118,9 @@ func TestHealthCheck(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { - session := &db.MockSession{} - session.On("Ping", dbPingTimeout).Return(tc.pingErr).Once() ctx := context.Background() + session := &db.MockSession{} + session.On("Ping", ctx, dbPingTimeout).Return(tc.pingErr).Once() core := &mockStellarCore{} core.On("Info", ctx).Return(tc.coreResponse, tc.coreErr).Once() @@ -180,8 +180,9 @@ func TestHealthCheckCache(t *testing.T) { assert.True(t, h.cache.lastUpdate.Equal(time.Unix(0, 0))) } + ctx := context.Background() session := &db.MockSession{} - session.On("Ping", dbPingTimeout).Return(nil).Once() + session.On("Ping", ctx, dbPingTimeout).Return(nil).Once() core := &mockStellarCore{} core.On("Info", h.ctx).Return(&stellarcore.InfoResponse{}, fmt.Errorf("core err")).Once() h.session = session diff --git a/services/horizon/internal/httpt_test.go b/services/horizon/internal/httpt_test.go index 11628fb319..1799822d5d 100644 --- a/services/horizon/internal/httpt_test.go +++ b/services/horizon/internal/httpt_test.go @@ -1,6 +1,7 @@ package horizon import ( + "context" "net/http" "net/http/httptest" "net/url" @@ -41,7 +42,7 @@ func startHTTPTest(t *testing.T, scenario string) *HTTPT { }`) ret.App.config.StellarCoreURL = ret.coreServer.URL - ret.App.UpdateLedgerState() + ret.App.UpdateLedgerState(context.Background()) return ret } @@ -98,7 +99,7 @@ func (ht *HTTPT) Post( // setting the retention count to the provided number. func (ht *HTTPT) ReapHistory(retention uint) { ht.App.reaper.RetentionCount = retention - err := ht.App.DeleteUnretainedHistory() + err := ht.App.DeleteUnretainedHistory(context.Background()) ht.Require.NoError(err) - ht.App.UpdateLedgerState() + ht.App.UpdateLedgerState(context.Background()) } diff --git a/services/horizon/internal/httpx/handler.go b/services/horizon/internal/httpx/handler.go index 39fd3c15f5..24ea92c338 100644 --- a/services/horizon/internal/httpx/handler.go +++ b/services/horizon/internal/httpx/handler.go @@ -104,14 +104,14 @@ func repeatableReadStream( return func() ([]sse.Event, error) { if session != nil { - err := session.BeginTx(&sql.TxOptions{ + err := session.BeginTx(r.Context(), &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) if err != nil { return nil, errors.Wrap(err, "Error starting repeatable read transaction") } - defer session.Rollback() + defer session.Rollback(r.Context()) } return generateEvents() diff --git a/services/horizon/internal/httpx/middleware.go b/services/horizon/internal/httpx/middleware.go index b4d77faf81..164bc0d5fb 100644 --- a/services/horizon/internal/httpx/middleware.go +++ b/services/horizon/internal/httpx/middleware.go @@ -224,7 +224,6 @@ func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, sessi } requestSession := session.Clone() - requestSession.Ctx = r.Context() h.ServeHTTP(w, r.WithContext( context.WithValue( r.Context(), @@ -246,15 +245,15 @@ type StateMiddleware struct { NoStateVerification bool } -func ingestionStatus(q *history.Q) (uint32, bool, error) { - version, err := q.GetIngestVersion() +func ingestionStatus(ctx context.Context, q *history.Q) (uint32, bool, error) { + version, err := q.GetIngestVersion(ctx) if err != nil { return 0, false, supportErrors.Wrap( err, "Error running GetIngestVersion", ) } - lastIngestedLedger, err := q.GetLastLedgerIngestNonBlocking() + lastIngestedLedger, err := q.GetLastLedgerIngestNonBlocking(ctx) if err != nil { return 0, false, supportErrors.Wrap( err, "Error running GetLastLedgerIngestNonBlocking", @@ -262,7 +261,7 @@ func ingestionStatus(q *history.Q) (uint32, bool, error) { } var lastHistoryLedger uint32 - err = q.LatestLedger(&lastHistoryLedger) + err = q.LatestLedger(ctx, &lastHistoryLedger) if err != nil { return 0, false, supportErrors.Wrap(err, "Error running LatestLedger") } @@ -277,6 +276,7 @@ func ingestionStatus(q *history.Q) (uint32, bool, error) { // WrapFunc executes the middleware on a given HTTP handler function func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() session := m.HorizonSession.Clone() q := &history.Q{session} sseRequest := render.Negotiate(r) == render.MimeEventStream @@ -286,8 +286,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { // Otherwise, because the ingestion system is running concurrently with this request, // it is possible to have one read fetch data from ledger N and another read // fetch data from ledger N+1 . - session.Ctx = r.Context() - err := session.BeginTx(&sql.TxOptions{ + err := session.BeginTx(ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) @@ -296,10 +295,10 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { problem.Render(r.Context(), w, err) return } - defer session.Rollback() + defer session.Rollback(ctx) if !m.NoStateVerification { - stateInvalid, invalidErr := q.GetExpStateInvalid() + stateInvalid, invalidErr := q.GetExpStateInvalid(ctx) if invalidErr != nil { invalidErr = supportErrors.Wrap(invalidErr, "Error running GetExpStateInvalid") problem.Render(r.Context(), w, invalidErr) @@ -311,7 +310,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { } } - lastIngestedLedger, ready, err := ingestionStatus(q) + lastIngestedLedger, ready, err := ingestionStatus(ctx, q) if err != nil { problem.Render(r.Context(), w, err) return @@ -325,7 +324,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { // otherwise, the stream will not pick up updates occurring in future // ledgers if sseRequest { - if err = session.Rollback(); err != nil { + if err = session.Rollback(ctx); err != nil { problem.Render( r.Context(), w, diff --git a/services/horizon/internal/httpx/stream_handler_test.go b/services/horizon/internal/httpx/stream_handler_test.go index fa293ca479..ffc1149512 100644 --- a/services/horizon/internal/httpx/stream_handler_test.go +++ b/services/horizon/internal/httpx/stream_handler_test.go @@ -13,6 +13,7 @@ import ( "testing" "github.com/go-chi/chi" + "github.com/stretchr/testify/mock" "github.com/stellar/go/services/horizon/internal/actions" horizonContext "github.com/stellar/go/services/horizon/internal/context" @@ -477,17 +478,17 @@ func TestRepeatableReadStream(t *testing.T) { } session := &db.MockSession{} - session.On("BeginTx", &sql.TxOptions{ + session.On("BeginTx", mock.Anything, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - session.On("Rollback").Return(nil).Once() + session.On("Rollback", mock.Anything).Return(nil).Once() - session.On("BeginTx", &sql.TxOptions{ + session.On("BeginTx", mock.Anything, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - session.On("Rollback").Return(nil).Once() + session.On("Rollback", mock.Anything).Return(nil).Once() request := streamRequest(t, "limit=2") request = request.WithContext(context.WithValue( @@ -516,17 +517,17 @@ func TestRepeatableReadStream(t *testing.T) { } session := &db.MockSession{} - session.On("BeginTx", &sql.TxOptions{ + session.On("BeginTx", mock.Anything, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - session.On("Rollback").Return(nil).Once() + session.On("Rollback", mock.Anything).Return(nil).Once() - session.On("BeginTx", &sql.TxOptions{ + session.On("BeginTx", mock.Anything, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - session.On("Rollback").Return(nil).Once() + session.On("Rollback", mock.Anything).Return(nil).Once() request := streamRequest(t, "") request = request.WithContext(context.WithValue( diff --git a/services/horizon/internal/ingest/build_state_test.go b/services/horizon/internal/ingest/build_state_test.go index 72c73f563c..6b13539043 100644 --- a/services/horizon/internal/ingest/build_state_test.go +++ b/services/horizon/internal/ingest/build_state_test.go @@ -20,6 +20,7 @@ func TestBuildStateTestSuite(t *testing.T) { type BuildStateTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter ledgerBackend *ledgerbackend.MockDatabaseBackend @@ -31,6 +32,7 @@ type BuildStateTestSuite struct { } func (s *BuildStateTestSuite) SetupTest() { + s.ctx = context.Background() s.historyQ = &mockDBQ{} s.runner = &mockProcessorsRunner{} s.historyAdapter = &mockHistoryArchiveAdapter{} @@ -39,7 +41,7 @@ func (s *BuildStateTestSuite) SetupTest() { s.checkpointLedger = uint32(63) s.lastLedger = 0 s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, ledgerBackend: s.ledgerBackend, @@ -48,8 +50,8 @@ func (s *BuildStateTestSuite) SetupTest() { } s.system.initMetrics() - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(63)).Return(nil).Once() @@ -76,11 +78,11 @@ func (s *BuildStateTestSuite) TearDownTest() { } func (s *BuildStateTestSuite) mockCommonHistoryQ() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", s.lastLedger).Return(nil).Once() - s.historyQ.On("UpdateExpStateInvalid", false).Return(nil).Once() - s.historyQ.On("TruncateIngestStateTables").Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.lastLedger).Return(nil).Once() + s.historyQ.On("UpdateExpStateInvalid", s.ctx, false).Return(nil).Once() + s.historyQ.On("TruncateIngestStateTables", s.ctx).Return(nil).Once() s.stellarCoreClient.On( "SetCursor", mock.AnythingOfType("*context.timerCtx"), @@ -134,7 +136,7 @@ func (s *BuildStateTestSuite) TestRangeNotPreparedSuccessPrepareGetLedgerFail() func (s *BuildStateTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove assertions. *s.historyQ = mockDBQ{} - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) s.Assert().Error(err) @@ -143,7 +145,7 @@ func (s *BuildStateTestSuite) TestBeginReturnsError() { } func (s *BuildStateTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, errors.New("my error")).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) s.Assert().Error(err) @@ -151,8 +153,8 @@ func (s *BuildStateTestSuite) TestGetLastLedgerIngestReturnsError() { s.Assert().Equal(transition{node: startState{}, sleepDuration: defaultSleep}, next) } func (s *BuildStateTestSuite) TestGetIngestVersionReturnsError() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, errors.New("my error")).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) s.Assert().Error(err) @@ -161,8 +163,8 @@ func (s *BuildStateTestSuite) TestGetIngestVersionReturnsError() { } func (s *BuildStateTestSuite) TestAnotherInstanceHasCompletedBuildState() { - s.historyQ.On("GetLastLedgerIngest").Return(s.checkpointLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.checkpointLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) s.Assert().NoError(err) @@ -170,9 +172,9 @@ func (s *BuildStateTestSuite) TestAnotherInstanceHasCompletedBuildState() { } func (s *BuildStateTestSuite) TestUpdateLastLedgerIngestReturnsError() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", s.lastLedger).Return(errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.lastLedger).Return(errors.New("my error")).Once() s.stellarCoreClient.On( "SetCursor", mock.AnythingOfType("*context.timerCtx"), @@ -188,10 +190,10 @@ func (s *BuildStateTestSuite) TestUpdateLastLedgerIngestReturnsError() { } func (s *BuildStateTestSuite) TestUpdateExpStateInvalidReturnsError() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", s.lastLedger).Return(nil).Once() - s.historyQ.On("UpdateExpStateInvalid", false).Return(errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.lastLedger).Return(nil).Once() + s.historyQ.On("UpdateExpStateInvalid", s.ctx, false).Return(errors.New("my error")).Once() s.stellarCoreClient.On( "SetCursor", mock.AnythingOfType("*context.timerCtx"), @@ -207,11 +209,11 @@ func (s *BuildStateTestSuite) TestUpdateExpStateInvalidReturnsError() { } func (s *BuildStateTestSuite) TestTruncateIngestStateTablesReturnsError() { - s.historyQ.On("GetLastLedgerIngest").Return(s.lastLedger, nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", s.lastLedger).Return(nil).Once() - s.historyQ.On("UpdateExpStateInvalid", false).Return(nil).Once() - s.historyQ.On("TruncateIngestStateTables").Return(errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(s.lastLedger, nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.lastLedger).Return(nil).Once() + s.historyQ.On("UpdateExpStateInvalid", s.ctx, false).Return(nil).Once() + s.historyQ.On("TruncateIngestStateTables", s.ctx).Return(errors.New("my error")).Once() s.stellarCoreClient.On( "SetCursor", @@ -244,11 +246,11 @@ func (s *BuildStateTestSuite) TestRunHistoryArchiveIngestionGenesisReturnsError( // Recreate mock in this single test to remove assertions. *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(0)).Return(nil).Once() - s.historyQ.On("UpdateExpStateInvalid", false).Return(nil).Once() - s.historyQ.On("TruncateIngestStateTables").Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(0)).Return(nil).Once() + s.historyQ.On("UpdateExpStateInvalid", s.ctx, false).Return(nil).Once() + s.historyQ.On("TruncateIngestStateTables", s.ctx).Return(nil).Once() s.stellarCoreClient.On( "SetCursor", mock.AnythingOfType("*context.timerCtx"), @@ -273,10 +275,10 @@ func (s *BuildStateTestSuite) TestUpdateLastLedgerIngestAfterIngestReturnsError( On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(nil). Once() - s.historyQ.On("UpdateLastLedgerIngest", s.checkpointLedger). + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.checkpointLedger). Return(errors.New("my error")). Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) @@ -292,7 +294,7 @@ func (s *BuildStateTestSuite) TestUpdateIngestVersionIngestReturnsError() { On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(errors.New("my error")). Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) @@ -308,13 +310,13 @@ func (s *BuildStateTestSuite) TestUpdateCommitReturnsError() { On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateLastLedgerIngest", s.checkpointLedger). + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.checkpointLedger). Return(nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(nil). Once() - s.historyQ.On("Commit"). + s.historyQ.On("Commit", s.ctx). Return(errors.New("my error")). Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) @@ -330,13 +332,13 @@ func (s *BuildStateTestSuite) TestBuildStateSucceeds() { On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateLastLedgerIngest", s.checkpointLedger). + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.checkpointLedger). Return(nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(nil). Once() - s.historyQ.On("Commit"). + s.historyQ.On("Commit", s.ctx). Return(nil). Once() @@ -358,13 +360,13 @@ func (s *BuildStateTestSuite) TestUpdateCommitReturnsErrorStop() { On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateLastLedgerIngest", s.checkpointLedger). + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.checkpointLedger). Return(nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(nil). Once() - s.historyQ.On("Commit"). + s.historyQ.On("Commit", s.ctx). Return(errors.New("my error")). Once() next, err := buildState{checkpointLedger: s.checkpointLedger, stop: true}.run(s.system) @@ -380,13 +382,13 @@ func (s *BuildStateTestSuite) TestBuildStateSucceedStop() { On("RunHistoryArchiveIngestion", s.checkpointLedger, MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}). Return(ingest.StatsChangeProcessorResults{}, nil). Once() - s.historyQ.On("UpdateLastLedgerIngest", s.checkpointLedger). + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, s.checkpointLedger). Return(nil). Once() - s.historyQ.On("UpdateIngestVersion", CurrentVersion). + s.historyQ.On("UpdateIngestVersion", s.ctx, CurrentVersion). Return(nil). Once() - s.historyQ.On("Commit"). + s.historyQ.On("Commit", s.ctx). Return(nil). Once() diff --git a/services/horizon/internal/ingest/database_backend_test.go b/services/horizon/internal/ingest/database_backend_test.go index 1290e3a0e9..64769b602a 100644 --- a/services/horizon/internal/ingest/database_backend_test.go +++ b/services/horizon/internal/ingest/database_backend_test.go @@ -13,7 +13,7 @@ func TestGetLatestLedger(t *testing.T) { tt.ScenarioWithoutHorizon("base") defer tt.Finish() - backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.CoreSession(), network.TestNetworkPassphrase) + backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.Ctx, tt.CoreSession(), network.TestNetworkPassphrase) tt.Assert.NoError(err) seq, err := backend.GetLatestLedgerSequence() tt.Assert.NoError(err) @@ -28,7 +28,7 @@ func TestGetLatestLedgerNotFound(t *testing.T) { _, err := tt.CoreDB.Exec(`DELETE FROM ledgerheaders`) tt.Assert.NoError(err, "failed to remove ledgerheaders") - backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.CoreSession(), network.TestNetworkPassphrase) + backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.Ctx, tt.CoreSession(), network.TestNetworkPassphrase) tt.Assert.NoError(err) _, err = backend.GetLatestLedgerSequence() tt.Assert.EqualError(err, "no ledgers exist in ledgerheaders table") diff --git a/services/horizon/internal/ingest/db_integration_test.go b/services/horizon/internal/ingest/db_integration_test.go index 63a870d7b3..6f20de97bf 100644 --- a/services/horizon/internal/ingest/db_integration_test.go +++ b/services/horizon/internal/ingest/db_integration_test.go @@ -3,6 +3,7 @@ package ingest import ( + "context" "io" "io/ioutil" "path/filepath" @@ -57,6 +58,7 @@ func TestDBTestSuite(t *testing.T) { type DBTestSuite struct { suite.Suite + ctx context.Context sampleFile string sequence uint32 ledgerBackend *ledgerbackend.MockDatabaseBackend @@ -87,6 +89,7 @@ func (s *DBTestSuite) SetupTest() { }) s.Assert().NoError(err) s.system = sIface.(*system) + s.ctx = s.system.ctx s.sequence = uint32(28660351) s.setupMocksForBuildState() @@ -99,7 +102,7 @@ func (s *DBTestSuite) SetupTest() { func (s *DBTestSuite) mockChangeReader() { changeReader, err := loadChanges(s.sampleFile) s.Assert().NoError(err) - s.historyAdapter.On("GetState", s.system.ctx, s.sequence). + s.historyAdapter.On("GetState", s.ctx, s.sequence). Return(ingest.ChangeReader(changeReader), nil).Once() } func (s *DBTestSuite) setupMocksForBuildState() { @@ -153,7 +156,7 @@ func (s *DBTestSuite) TestVersionMismatchTriggersRebuild() { s.TestBuildState() s.Assert().NoError( - s.system.historyQ.UpdateIngestVersion(CurrentVersion - 1), + s.system.historyQ.UpdateIngestVersion(context.Background(), CurrentVersion-1), ) s.setupMocksForBuildState() diff --git a/services/horizon/internal/ingest/fsm.go b/services/horizon/internal/ingest/fsm.go index 0a8d7651b0..88eeafa8b7 100644 --- a/services/horizon/internal/ingest/fsm.go +++ b/services/horizon/internal/ingest/fsm.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "fmt" "strings" "time" @@ -111,18 +112,18 @@ func (startState) String() string { } func (state startState) run(s *system) (transition, error) { - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { return start(), errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // This will get the value `FOR UPDATE`, blocking it for other nodes. - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest(s.ctx) if err != nil { return start(), errors.Wrap(err, getLastIngestedErrMsg) } - ingestVersion, err := s.historyQ.GetIngestVersion() + ingestVersion, err := s.historyQ.GetIngestVersion(s.ctx) if err != nil { return start(), errors.Wrap(err, getIngestVersionErrMsg) } @@ -135,7 +136,7 @@ func (state startState) run(s *system) (transition, error) { return stop(), nil } - lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger() + lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger(s.ctx) if err != nil { return start(), errors.Wrap(err, "Error getting last history ledger sequence") } @@ -188,11 +189,11 @@ func (state startState) run(s *system) (transition, error) { // Now it's on by default but the latest history ledger is greater // than the latest ingest ledger. We reset the exp ledger sequence // so init state will rebuild the state correctly. - err = s.historyQ.UpdateLastLedgerIngest(0) + err = s.historyQ.UpdateLastLedgerIngest(s.ctx, 0) if err != nil { return start(), errors.Wrap(err, updateLastLedgerIngestErrMsg) } - err = s.historyQ.Commit() + err = s.historyQ.Commit(s.ctx) if err != nil { return start(), errors.Wrap(err, commitErrMsg) } @@ -243,7 +244,7 @@ func (b buildState) run(s *system) (transition, error) { // ProcessorRunner.RunHistoryArchiveIngestion(). var ledgerCloseMeta xdr.LedgerCloseMeta if b.checkpointLedger != 1 { - err := s.maybePrepareRange(b.checkpointLedger) + err := s.maybePrepareRange(s.ctx, b.checkpointLedger) if err != nil { return nextFailState, err } @@ -260,19 +261,19 @@ func (b buildState) run(s *system) (transition, error) { }).Info("Ledger returned from the backend") } - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { return nextFailState, errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // We need to get this value `FOR UPDATE` so all other instances // are blocked. - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest(s.ctx) if err != nil { return nextFailState, errors.Wrap(err, getLastIngestedErrMsg) } - ingestVersion, err := s.historyQ.GetIngestVersion() + ingestVersion, err := s.historyQ.GetIngestVersion(s.ctx) if err != nil { return nextFailState, errors.Wrap(err, getIngestVersionErrMsg) } @@ -293,20 +294,20 @@ func (b buildState) run(s *system) (transition, error) { log.Info("Starting ingestion system from empty state...") // Clear last_ingested_ledger in key value store - err = s.historyQ.UpdateLastLedgerIngest(0) + err = s.historyQ.UpdateLastLedgerIngest(s.ctx, 0) if err != nil { return nextFailState, errors.Wrap(err, updateLastLedgerIngestErrMsg) } // Clear invalid state in key value store. It's possible that upgraded // ingestion is fixing it. - err = s.historyQ.UpdateExpStateInvalid(false) + err = s.historyQ.UpdateExpStateInvalid(s.ctx, false) if err != nil { return nextFailState, errors.Wrap(err, updateExpStateInvalidErrMsg) } // State tables should be empty. - err = s.historyQ.TruncateIngestStateTables() + err = s.historyQ.TruncateIngestStateTables(s.ctx) if err != nil { return nextFailState, errors.Wrap(err, "Error clearing ingest tables") } @@ -331,11 +332,11 @@ func (b buildState) run(s *system) (transition, error) { return nextFailState, errors.Wrap(err, "Error ingesting history archive") } - if err = s.historyQ.UpdateIngestVersion(CurrentVersion); err != nil { + if err = s.historyQ.UpdateIngestVersion(s.ctx, CurrentVersion); err != nil { return nextFailState, errors.Wrap(err, "Error updating ingestion version") } - if err = s.completeIngestion(b.checkpointLedger); err != nil { + if err = s.completeIngestion(s.ctx, b.checkpointLedger); err != nil { return nextFailState, err } @@ -371,7 +372,7 @@ func (r resumeState) run(s *system) (transition, error) { ingestLedger := r.latestSuccessfullyProcessedLedger + 1 - err := s.maybePrepareRange(ingestLedger) + err := s.maybePrepareRange(s.ctx, ingestLedger) if err != nil { return start(), err } @@ -387,14 +388,14 @@ func (r resumeState) run(s *system) (transition, error) { "duration": time.Since(startTime).Seconds(), }).Info("Ledger returned from the backend") - if err = s.historyQ.Begin(); err != nil { + if err = s.historyQ.Begin(s.ctx); err != nil { return retryResume(r), errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // This will get the value `FOR UPDATE`, blocking it for other nodes. - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest(s.ctx) if err != nil { return retryResume(r), errors.Wrap(err, getLastIngestedErrMsg) } @@ -411,7 +412,7 @@ func (r resumeState) run(s *system) (transition, error) { }), nil } - ingestVersion, err := s.historyQ.GetIngestVersion() + ingestVersion, err := s.historyQ.GetIngestVersion(s.ctx) if err != nil { return retryResume(r), errors.Wrap(err, getIngestVersionErrMsg) } @@ -424,7 +425,7 @@ func (r resumeState) run(s *system) (transition, error) { return start(), nil } - lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger() + lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger(s.ctx) if err != nil { return retryResume(r), errors.Wrap(err, "could not get latest history ledger") } @@ -455,7 +456,7 @@ func (r resumeState) run(s *system) (transition, error) { return retryResume(r), errors.Wrap(err, "Error running processors on ledger") } - if err = s.completeIngestion(ingestLedger); err != nil { + if err = s.completeIngestion(s.ctx, ingestLedger); err != nil { return retryResume(r), err } @@ -530,22 +531,22 @@ func (h historyRangeState) run(s *system) (transition, error) { return start(), errors.Errorf("invalid range: [%d, %d]", h.fromLedger, h.toLedger) } - err := s.maybePrepareRange(h.fromLedger) + err := s.maybePrepareRange(s.ctx, h.fromLedger) if err != nil { return start(), err } - if err = s.historyQ.Begin(); err != nil { + if err = s.historyQ.Begin(s.ctx); err != nil { return start(), errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // acquire distributed lock so no one else can perform ingestion operations. - if _, err = s.historyQ.GetLastLedgerIngest(); err != nil { + if _, err = s.historyQ.GetLastLedgerIngest(s.ctx); err != nil { return start(), errors.Wrap(err, getLastIngestedErrMsg) } - lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger() + lastHistoryLedger, err := s.historyQ.GetLatestHistoryLedger(s.ctx) if err != nil { return start(), errors.Wrap(err, "could not get latest history ledger") } @@ -567,7 +568,7 @@ func (h historyRangeState) run(s *system) (transition, error) { ledgerCloseMeta, err = s.ledgerBackend.GetLedgerBlocking(cur) if err != nil { // Commit finished work in case of ledger backend error. - commitErr := s.historyQ.Commit() + commitErr := s.historyQ.Commit(s.ctx) if commitErr != nil { log.WithError(commitErr).Error("Error commiting partial range results") } else { @@ -586,7 +587,7 @@ func (h historyRangeState) run(s *system) (transition, error) { } } - if err = s.historyQ.Commit(); err != nil { + if err = s.historyQ.Commit(s.ctx); err != nil { return start(), errors.Wrap(err, commitErrMsg) } @@ -649,7 +650,7 @@ func (h reingestHistoryRangeState) ingestRange(s *system, fromLedger, toLedger u return errors.Wrap(err, "Invalid range") } - err = s.historyQ.DeleteRangeAll(start, end) + err = s.historyQ.DeleteRangeAll(s.ctx, start, end) if err != nil { return errors.Wrap(err, "error in DeleteRangeAll") } @@ -704,13 +705,13 @@ func (h reingestHistoryRangeState) run(s *system) (transition, error) { startTime = time.Now() if h.force { - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { return stop(), errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // acquire distributed lock so no one else can perform ingestion operations. - if _, err := s.historyQ.GetLastLedgerIngest(); err != nil { + if _, err := s.historyQ.GetLastLedgerIngest(s.ctx); err != nil { return stop(), errors.Wrap(err, getLastIngestedErrMsg) } @@ -718,11 +719,11 @@ func (h reingestHistoryRangeState) run(s *system) (transition, error) { return stop(), err } - if err := s.historyQ.Commit(); err != nil { + if err := s.historyQ.Commit(s.ctx); err != nil { return stop(), errors.Wrap(err, commitErrMsg) } } else { - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngestNonBlocking() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngestNonBlocking(s.ctx) if err != nil { return stop(), errors.Wrap(err, getLastIngestedErrMsg) } @@ -733,10 +734,10 @@ func (h reingestHistoryRangeState) run(s *system) (transition, error) { for cur := h.fromLedger; cur <= h.toLedger; cur++ { err := func(ledger uint32) error { - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { return errors.Wrap(err, "Error starting a transaction") } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // ingest each ledger in a separate transaction to prevent deadlocks // when acquiring ShareLocks from multiple parallel reingest range processes @@ -744,7 +745,7 @@ func (h reingestHistoryRangeState) run(s *system) (transition, error) { return err } - if err := s.historyQ.Commit(); err != nil { + if err := s.historyQ.Commit(s.ctx); err != nil { return errors.Wrap(err, commitErrMsg) } @@ -798,14 +799,14 @@ func (v verifyRangeState) run(s *system) (transition, error) { return stop(), errors.Errorf("invalid range: [%d, %d]", v.fromLedger, v.toLedger) } - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { err = errors.Wrap(err, "Error starting a transaction") return stop(), err } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // Simple check if DB clean - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest(s.ctx) if err != nil { err = errors.Wrap(err, getLastIngestedErrMsg) return stop(), err @@ -851,7 +852,7 @@ func (v verifyRangeState) run(s *system) (transition, error) { return stop(), err } - if err = s.completeIngestion(v.fromLedger); err != nil { + if err = s.completeIngestion(s.ctx, v.fromLedger); err != nil { return stop(), err } @@ -872,7 +873,7 @@ func (v verifyRangeState) run(s *system) (transition, error) { }).Info("Processing ledger") startTime := time.Now() - if err = s.historyQ.Begin(); err != nil { + if err = s.historyQ.Begin(s.ctx); err != nil { err = errors.Wrap(err, "Error starting a transaction") return stop(), err } @@ -897,7 +898,7 @@ func (v verifyRangeState) run(s *system) (transition, error) { return stop(), err } - if err = s.completeIngestion(sequence); err != nil { + if err = s.completeIngestion(s.ctx, sequence); err != nil { return stop(), err } @@ -928,14 +929,14 @@ func (stressTestState) String() string { } func (stressTestState) run(s *system) (transition, error) { - if err := s.historyQ.Begin(); err != nil { + if err := s.historyQ.Begin(s.ctx); err != nil { err = errors.Wrap(err, "Error starting a transaction") return stop(), err } - defer s.historyQ.Rollback() + defer s.historyQ.Rollback(s.ctx) // Simple check if DB clean - lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest() + lastIngestedLedger, err := s.historyQ.GetLastLedgerIngest(s.ctx) if err != nil { err = errors.Wrap(err, getLastIngestedErrMsg) return stop(), err @@ -973,7 +974,7 @@ func (stressTestState) run(s *system) (transition, error) { return stop(), err } - if err = s.completeIngestion(sequence); err != nil { + if err = s.completeIngestion(s.ctx, sequence); err != nil { return stop(), err } @@ -995,17 +996,17 @@ func (stressTestState) run(s *system) (transition, error) { return stop(), nil } -func (s *system) completeIngestion(ledger uint32) error { +func (s *system) completeIngestion(ctx context.Context, ledger uint32) error { if ledger == 0 { return errors.New("ledger must be positive") } - if err := s.historyQ.UpdateLastLedgerIngest(ledger); err != nil { + if err := s.historyQ.UpdateLastLedgerIngest(ctx, ledger); err != nil { err = errors.Wrap(err, updateLastLedgerIngestErrMsg) return err } - if err := s.historyQ.Commit(); err != nil { + if err := s.historyQ.Commit(ctx); err != nil { return errors.Wrap(err, commitErrMsg) } @@ -1013,7 +1014,7 @@ func (s *system) completeIngestion(ledger uint32) error { } // maybePrepareRange checks if the range is prepared and, if not, prepares it. -func (s *system) maybePrepareRange(from uint32) error { +func (s *system) maybePrepareRange(ctx context.Context, from uint32) error { ledgerRange := ledgerbackend.UnboundedRange(from) prepared, err := s.ledgerBackend.IsPrepared(ledgerRange) diff --git a/services/horizon/internal/ingest/group_processors.go b/services/horizon/internal/ingest/group_processors.go index d2389676cc..b35f940a6b 100644 --- a/services/horizon/internal/ingest/group_processors.go +++ b/services/horizon/internal/ingest/group_processors.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "fmt" "time" @@ -26,10 +27,10 @@ func newGroupChangeProcessors(processors []horizonChangeProcessor) *groupChangeP } } -func (g groupChangeProcessors) ProcessChange(change ingest.Change) error { +func (g groupChangeProcessors) ProcessChange(ctx context.Context, change ingest.Change) error { for _, p := range g.processors { startTime := time.Now() - if err := p.ProcessChange(change); err != nil { + if err := p.ProcessChange(ctx, change); err != nil { return errors.Wrapf(err, "error in %T.ProcessChange", p) } g.AddRunDuration(fmt.Sprintf("%T", p), startTime) @@ -37,10 +38,10 @@ func (g groupChangeProcessors) ProcessChange(change ingest.Change) error { return nil } -func (g groupChangeProcessors) Commit() error { +func (g groupChangeProcessors) Commit(ctx context.Context) error { for _, p := range g.processors { startTime := time.Now() - if err := p.Commit(); err != nil { + if err := p.Commit(ctx); err != nil { return errors.Wrapf(err, "error in %T.Commit", p) } g.AddRunDuration(fmt.Sprintf("%T", p), startTime) @@ -60,10 +61,10 @@ func newGroupTransactionProcessors(processors []horizonTransactionProcessor) *gr } } -func (g groupTransactionProcessors) ProcessTransaction(tx ingest.LedgerTransaction) error { +func (g groupTransactionProcessors) ProcessTransaction(ctx context.Context, tx ingest.LedgerTransaction) error { for _, p := range g.processors { startTime := time.Now() - if err := p.ProcessTransaction(tx); err != nil { + if err := p.ProcessTransaction(ctx, tx); err != nil { return errors.Wrapf(err, "error in %T.ProcessTransaction", p) } g.AddRunDuration(fmt.Sprintf("%T", p), startTime) @@ -71,10 +72,10 @@ func (g groupTransactionProcessors) ProcessTransaction(tx ingest.LedgerTransacti return nil } -func (g groupTransactionProcessors) Commit() error { +func (g groupTransactionProcessors) Commit(ctx context.Context) error { for _, p := range g.processors { startTime := time.Now() - if err := p.Commit(); err != nil { + if err := p.Commit(ctx); err != nil { return errors.Wrapf(err, "error in %T.Commit", p) } g.AddRunDuration(fmt.Sprintf("%T", p), startTime) diff --git a/services/horizon/internal/ingest/group_processors_test.go b/services/horizon/internal/ingest/group_processors_test.go index eaa357fa80..6848c24a66 100644 --- a/services/horizon/internal/ingest/group_processors_test.go +++ b/services/horizon/internal/ingest/group_processors_test.go @@ -3,6 +3,7 @@ package ingest import ( + "context" "errors" "testing" @@ -18,13 +19,13 @@ type mockHorizonChangeProcessor struct { mock.Mock } -func (m *mockHorizonChangeProcessor) ProcessChange(change ingest.Change) error { - args := m.Called(change) +func (m *mockHorizonChangeProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { + args := m.Called(ctx, change) return args.Error(0) } -func (m *mockHorizonChangeProcessor) Commit() error { - args := m.Called() +func (m *mockHorizonChangeProcessor) Commit(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } @@ -34,18 +35,19 @@ type mockHorizonTransactionProcessor struct { mock.Mock } -func (m *mockHorizonTransactionProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) error { - args := m.Called(transaction) +func (m *mockHorizonTransactionProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error { + args := m.Called(ctx, transaction) return args.Error(0) } -func (m *mockHorizonTransactionProcessor) Commit() error { - args := m.Called() +func (m *mockHorizonTransactionProcessor) Commit(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } type GroupChangeProcessorsTestSuiteLedger struct { suite.Suite + ctx context.Context processors *groupChangeProcessors processorA *mockHorizonChangeProcessor processorB *mockHorizonChangeProcessor @@ -56,6 +58,7 @@ func TestGroupChangeProcessorsTestSuiteLedger(t *testing.T) { } func (s *GroupChangeProcessorsTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.processorA = &mockHorizonChangeProcessor{} s.processorB = &mockHorizonChangeProcessor{} s.processors = newGroupChangeProcessors([]horizonChangeProcessor{ @@ -72,10 +75,10 @@ func (s *GroupChangeProcessorsTestSuiteLedger) TearDownTest() { func (s *GroupChangeProcessorsTestSuiteLedger) TestProcessChangeFails() { change := ingest.Change{} s.processorA. - On("ProcessChange", change). + On("ProcessChange", s.ctx, change). Return(errors.New("transient error")).Once() - err := s.processors.ProcessChange(change) + err := s.processors.ProcessChange(s.ctx, change) s.Assert().Error(err) s.Assert().EqualError(err, "error in *ingest.mockHorizonChangeProcessor.ProcessChange: transient error") } @@ -83,40 +86,41 @@ func (s *GroupChangeProcessorsTestSuiteLedger) TestProcessChangeFails() { func (s *GroupChangeProcessorsTestSuiteLedger) TestProcessChangeSucceeds() { change := ingest.Change{} s.processorA. - On("ProcessChange", change). + On("ProcessChange", s.ctx, change). Return(nil).Once() s.processorB. - On("ProcessChange", change). + On("ProcessChange", s.ctx, change). Return(nil).Once() - err := s.processors.ProcessChange(change) + err := s.processors.ProcessChange(s.ctx, change) s.Assert().NoError(err) } func (s *GroupChangeProcessorsTestSuiteLedger) TestCommitFails() { s.processorA. - On("Commit"). + On("Commit", s.ctx). Return(errors.New("transient error")).Once() - err := s.processors.Commit() + err := s.processors.Commit(s.ctx) s.Assert().Error(err) s.Assert().EqualError(err, "error in *ingest.mockHorizonChangeProcessor.Commit: transient error") } func (s *GroupChangeProcessorsTestSuiteLedger) TestCommitSucceeds() { s.processorA. - On("Commit"). + On("Commit", s.ctx). Return(nil).Once() s.processorB. - On("Commit"). + On("Commit", s.ctx). Return(nil).Once() - err := s.processors.Commit() + err := s.processors.Commit(s.ctx) s.Assert().NoError(err) } type GroupTransactionProcessorsTestSuiteLedger struct { suite.Suite + ctx context.Context processors *groupTransactionProcessors processorA *mockHorizonTransactionProcessor processorB *mockHorizonTransactionProcessor @@ -127,6 +131,7 @@ func TestGroupTransactionProcessorsTestSuiteLedger(t *testing.T) { } func (s *GroupTransactionProcessorsTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.processorA = &mockHorizonTransactionProcessor{} s.processorB = &mockHorizonTransactionProcessor{} s.processors = newGroupTransactionProcessors([]horizonTransactionProcessor{ @@ -143,10 +148,10 @@ func (s *GroupTransactionProcessorsTestSuiteLedger) TearDownTest() { func (s *GroupTransactionProcessorsTestSuiteLedger) TestProcessTransactionFails() { transaction := ingest.LedgerTransaction{} s.processorA. - On("ProcessTransaction", transaction). + On("ProcessTransaction", s.ctx, transaction). Return(errors.New("transient error")).Once() - err := s.processors.ProcessTransaction(transaction) + err := s.processors.ProcessTransaction(s.ctx, transaction) s.Assert().Error(err) s.Assert().EqualError(err, "error in *ingest.mockHorizonTransactionProcessor.ProcessTransaction: transient error") } @@ -154,34 +159,34 @@ func (s *GroupTransactionProcessorsTestSuiteLedger) TestProcessTransactionFails( func (s *GroupTransactionProcessorsTestSuiteLedger) TestProcessTransactionSucceeds() { transaction := ingest.LedgerTransaction{} s.processorA. - On("ProcessTransaction", transaction). + On("ProcessTransaction", s.ctx, transaction). Return(nil).Once() s.processorB. - On("ProcessTransaction", transaction). + On("ProcessTransaction", s.ctx, transaction). Return(nil).Once() - err := s.processors.ProcessTransaction(transaction) + err := s.processors.ProcessTransaction(s.ctx, transaction) s.Assert().NoError(err) } func (s *GroupTransactionProcessorsTestSuiteLedger) TestCommitFails() { s.processorA. - On("Commit"). + On("Commit", s.ctx). Return(errors.New("transient error")).Once() - err := s.processors.Commit() + err := s.processors.Commit(s.ctx) s.Assert().Error(err) s.Assert().EqualError(err, "error in *ingest.mockHorizonTransactionProcessor.Commit: transient error") } func (s *GroupTransactionProcessorsTestSuiteLedger) TestCommitSucceeds() { s.processorA. - On("Commit"). + On("Commit", s.ctx). Return(nil).Once() s.processorB. - On("Commit"). + On("Commit", s.ctx). Return(nil).Once() - err := s.processors.Commit() + err := s.processors.Commit(s.ctx) s.Assert().NoError(err) } diff --git a/services/horizon/internal/ingest/ingest_history_range_state_test.go b/services/horizon/internal/ingest/ingest_history_range_state_test.go index f6a5b8181b..751e5bbfa3 100644 --- a/services/horizon/internal/ingest/ingest_history_range_state_test.go +++ b/services/horizon/internal/ingest/ingest_history_range_state_test.go @@ -22,6 +22,7 @@ func TestIngestHistoryRangeStateTestSuite(t *testing.T) { type IngestHistoryRangeStateTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter ledgerBackend *ledgerbackend.MockDatabaseBackend @@ -30,12 +31,13 @@ type IngestHistoryRangeStateTestSuite struct { } func (s *IngestHistoryRangeStateTestSuite) SetupTest() { + s.ctx = context.Background() s.historyQ = &mockDBQ{} s.ledgerBackend = &ledgerbackend.MockDatabaseBackend{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.runner = &mockProcessorsRunner{} s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, ledgerBackend: s.ledgerBackend, @@ -43,7 +45,7 @@ func (s *IngestHistoryRangeStateTestSuite) SetupTest() { } s.system.initMetrics() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(100)).Return(nil).Once() @@ -101,7 +103,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove Rollback assertion. *s.historyQ = mockDBQ{} - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -110,8 +112,8 @@ func (s *IngestHistoryRangeStateTestSuite) TestBeginReturnsError() { } func (s *IngestHistoryRangeStateTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -120,9 +122,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestGetLastLedgerIngestReturnsError() } func (s *IngestHistoryRangeStateTestSuite) TestGetLatestLedgerReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -133,9 +135,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestGetLatestLedgerReturnsError() { // TestAnotherNodeIngested tests the case when another node has ingested the range. // In such case we go back to `init` state without processing. func (s *IngestHistoryRangeStateTestSuite) TestAnotherNodeIngested() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(200), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(200), nil).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().NoError(err) @@ -143,9 +145,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestAnotherNodeIngested() { } func (s *IngestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedgerReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(99), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(99), nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -171,9 +173,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedgerR } func (s *IngestHistoryRangeStateTestSuite) TestSuccess() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(99), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(99), nil).Once() for i := 100; i <= 200; i++ { meta := xdr.LedgerCloseMeta{ @@ -194,7 +196,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccess() { ).Once() } - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().NoError(err) @@ -202,9 +204,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccess() { } func (s *IngestHistoryRangeStateTestSuite) TestSuccessOneLedger() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(99), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(99), nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -223,7 +225,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccessOneLedger() { nil, ).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 100}.run(s.system) s.Assert().NoError(err) @@ -231,9 +233,9 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccessOneLedger() { } func (s *IngestHistoryRangeStateTestSuite) TestCommitsWorkOnLedgerBackendFailure() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(99), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(99), nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -254,7 +256,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestCommitsWorkOnLedgerBackendFailure nil, ).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 102}.run(s.system) s.Assert().Error(err) @@ -268,6 +270,7 @@ func TestReingestHistoryRangeStateTestSuite(t *testing.T) { type ReingestHistoryRangeStateTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter ledgerBackend *mockLedgerBackend @@ -276,12 +279,13 @@ type ReingestHistoryRangeStateTestSuite struct { } func (s *ReingestHistoryRangeStateTestSuite) SetupTest() { + s.ctx = context.Background() s.historyQ = &mockDBQ{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.ledgerBackend = &mockLedgerBackend{} s.runner = &mockProcessorsRunner{} s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, ledgerBackend: s.ledgerBackend, @@ -289,8 +293,8 @@ func (s *ReingestHistoryRangeStateTestSuite) SetupTest() { } s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("Rollback").Return(nil).Once() - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() } @@ -324,9 +328,9 @@ func (s *ReingestHistoryRangeStateTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove Rollback assertion. *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil) - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().EqualError(err, "Error starting a transaction: my error") @@ -336,7 +340,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestGetLastLedgerIngestNonBlockingE *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), errors.New("my error")).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().EqualError(err, "Error getting last ingested ledger: my error") @@ -346,7 +350,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeOverlaps() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(190), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(190), nil).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().Equal(err, ErrReingestRangeConflict) @@ -356,7 +360,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeOverlapsAtEnd() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(200), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(200), nil).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().Equal(err, ErrReingestRangeConflict) @@ -365,17 +369,17 @@ func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeOverlapsAtEnd() { func (s *ReingestHistoryRangeStateTestSuite) TestClearHistoryFails() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(100, 0, 0) toidTo := toid.New(101, 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(errors.New("my error")).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().EqualError(err, "error in DeleteRangeAll: my error") @@ -384,14 +388,14 @@ func (s *ReingestHistoryRangeStateTestSuite) TestClearHistoryFails() { func (s *ReingestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedgerReturnsError() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(100, 0, 0) toidTo := toid.New(101, 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -411,7 +415,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedge processorsRunDurations{}, errors.New("my error"), ).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().EqualError(err, "error processing ledger sequence=100: my error") @@ -420,14 +424,14 @@ func (s *ReingestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedge func (s *ReingestHistoryRangeStateTestSuite) TestCommitFails() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(100, 0, 0) toidTo := toid.New(101, 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -447,8 +451,8 @@ func (s *ReingestHistoryRangeStateTestSuite) TestCommitFails() { nil, ).Once() - s.historyQ.On("Commit").Return(errors.New("my error")).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(errors.New("my error")).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() err := s.system.ReingestRange(100, 200, false) s.Assert().EqualError(err, "Error committing db transaction: my error") @@ -457,16 +461,16 @@ func (s *ReingestHistoryRangeStateTestSuite) TestCommitFails() { func (s *ReingestHistoryRangeStateTestSuite) TestSuccess() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() for i := uint32(100); i <= uint32(200); i++ { - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(int32(i), 0, 0) toidTo := toid.New(int32(i+1), 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -486,8 +490,8 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccess() { nil, ).Once() - s.historyQ.On("Commit").Return(nil).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() } err := s.system.ReingestRange(100, 200, false) @@ -495,13 +499,13 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccess() { } func (s *ReingestHistoryRangeStateTestSuite) TestSuccessOneLedger() { - s.historyQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(0), nil).Once() + s.historyQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(0), nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(100, 0, 0) toidTo := toid.New(101, 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -519,7 +523,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccessOneLedger() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() // Recreate mock in this single test to remove previous assertion. *s.ledgerBackend = mockLedgerBackend{} @@ -531,21 +535,21 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccessOneLedger() { } func (s *ReingestHistoryRangeStateTestSuite) TestGetLastLedgerIngestError() { - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() err := s.system.ReingestRange(100, 200, true) s.Assert().EqualError(err, "Error getting last ingested ledger: my error") } func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeForce() { - s.historyQ.On("GetLastLedgerIngest").Return(uint32(190), nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(190), nil).Once() s.historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() toidFrom := toid.New(100, 0, 0) toidTo := toid.New(201, 0, 0) s.historyQ.On( - "DeleteRangeAll", toidFrom.ToInt64(), toidTo.ToInt64(), + "DeleteRangeAll", s.ctx, toidFrom.ToInt64(), toidTo.ToInt64(), ).Return(nil).Once() for i := 100; i <= 200; i++ { @@ -567,7 +571,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeForce() { ).Once() } - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() err := s.system.ReingestRange(100, 200, true) s.Assert().NoError(err) diff --git a/services/horizon/internal/ingest/init_state_test.go b/services/horizon/internal/ingest/init_state_test.go index c5858fa494..a209cab7fb 100644 --- a/services/horizon/internal/ingest/init_state_test.go +++ b/services/horizon/internal/ingest/init_state_test.go @@ -16,22 +16,24 @@ func TestInitStateTestSuite(t *testing.T) { type InitStateTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter system *system } func (s *InitStateTestSuite) SetupTest() { + s.ctx = context.Background() s.historyQ = &mockDBQ{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, } s.system.initMetrics() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() } func (s *InitStateTestSuite) TearDownTest() { @@ -43,7 +45,7 @@ func (s *InitStateTestSuite) TearDownTest() { func (s *InitStateTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove Rollback assertion. *s.historyQ = mockDBQ{} - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() next, err := startState{}.run(s.system) s.Assert().Error(err) @@ -52,8 +54,8 @@ func (s *InitStateTestSuite) TestBeginReturnsError() { } func (s *InitStateTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := startState{}.run(s.system) s.Assert().Error(err) @@ -62,9 +64,9 @@ func (s *InitStateTestSuite) TestGetLastLedgerIngestReturnsError() { } func (s *InitStateTestSuite) TestGetIngestVersionReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, errors.New("my error")).Once() next, err := startState{}.run(s.system) s.Assert().Error(err) @@ -73,9 +75,9 @@ func (s *InitStateTestSuite) TestGetIngestVersionReturnsError() { } func (s *InitStateTestSuite) TestCurrentVersionIsOutdated() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(1), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion+1, nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(1), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion+1, nil).Once() next, err := startState{}.run(s.system) s.Assert().NoError(err) @@ -83,10 +85,10 @@ func (s *InitStateTestSuite) TestCurrentVersionIsOutdated() { } func (s *InitStateTestSuite) TestGetLatestLedgerReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := startState{}.run(s.system) s.Assert().Error(err) @@ -95,10 +97,10 @@ func (s *InitStateTestSuite) TestGetLatestLedgerReturnsError() { } func (s *InitStateTestSuite) TestBuildStateEmptyDatabase() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), nil).Once() s.historyAdapter.On("GetLatestLedgerSequence").Return(uint32(63), nil).Once() @@ -111,10 +113,10 @@ func (s *InitStateTestSuite) TestBuildStateEmptyDatabase() { } func (s *InitStateTestSuite) TestBuildStateEmptyDatabaseFromSuggestedCheckpoint() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), nil).Once() next, err := startState{suggestedCheckpoint: 127}.run(s.system) s.Assert().NoError(err) @@ -128,10 +130,10 @@ func (s *InitStateTestSuite) TestBuildStateEmptyDatabaseFromSuggestedCheckpoint( // * the ingest system version has been incremented or no ingest ledger, // * the old system is in front of the latest checkpoint. func (s *InitStateTestSuite) TestBuildStateWait() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(100), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(100), nil).Once() s.historyAdapter.On("GetLatestLedgerSequence").Return(uint32(63), nil).Once() @@ -147,10 +149,10 @@ func (s *InitStateTestSuite) TestBuildStateWait() { // * the ingest system version has been incremented or no ingest ledger, // * the old system is behind the latest checkpoint. func (s *InitStateTestSuite) TestBuildStateCatchup() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(100), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(100), nil).Once() s.historyAdapter.On("GetLatestLedgerSequence").Return(uint32(127), nil).Once() @@ -169,10 +171,10 @@ func (s *InitStateTestSuite) TestBuildStateCatchup() { // * the ingest system version has been incremented or no ingest ledger, // * the old system latest ledger is equal to the latest checkpoint. func (s *InitStateTestSuite) TestBuildStateOldHistory() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(127), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(127), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(127), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(127), nil).Once() s.historyAdapter.On("GetLatestLedgerSequence").Return(uint32(127), nil).Once() @@ -191,13 +193,13 @@ func (s *InitStateTestSuite) TestBuildStateOldHistory() { // * state doesn't need to be rebuilt, // * history is in front of ingest. func (s *InitStateTestSuite) TestResumeStateInFront() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(130), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(130), nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(0)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(0)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() next, err := startState{}.run(s.system) s.Assert().NoError(err) @@ -208,10 +210,10 @@ func (s *InitStateTestSuite) TestResumeStateInFront() { // * state doesn't need to be rebuilt, // * history is behind of ingest. func (s *InitStateTestSuite) TestResumeStateBehind() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(130), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(100), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(130), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(100), nil).Once() next, err := startState{}.run(s.system) s.Assert().NoError(err) @@ -229,10 +231,10 @@ func (s *InitStateTestSuite) TestResumeStateBehind() { // * there are no ledgers in history tables. // In such case we load offers and continue ingesting the next ledger. func (s *InitStateTestSuite) TestResumeStateBehindHistory0() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(130), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(130), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), nil).Once() next, err := startState{}.run(s.system) s.Assert().NoError(err) @@ -249,10 +251,10 @@ func (s *InitStateTestSuite) TestResumeStateBehindHistory0() { // * state doesn't need to be rebuilt, // * history is in sync with ingest. func (s *InitStateTestSuite) TestResumeStateSync() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(130), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(130), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(130), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(130), nil).Once() next, err := startState{}.run(s.system) s.Assert().NoError(err) diff --git a/services/horizon/internal/ingest/main.go b/services/horizon/internal/ingest/main.go index 79feb9a44e..ac4669b412 100644 --- a/services/horizon/internal/ingest/main.go +++ b/services/horizon/internal/ingest/main.go @@ -188,7 +188,7 @@ func NewSystem(config Config) (System, error) { var ledgerBackend ledgerbackend.LedgerBackend if config.EnableCaptiveCore { if len(config.RemoteCaptiveCoreURL) > 0 { - ledgerBackend, err = ledgerbackend.NewRemoteCaptive(config.RemoteCaptiveCoreURL) + ledgerBackend, err = ledgerbackend.NewRemoteCaptive(ctx, config.RemoteCaptiveCoreURL) if err != nil { cancel() return nil, errors.Wrap(err, "error creating captive core backend") @@ -206,7 +206,7 @@ func NewSystem(config Config) (System, error) { NetworkPassphrase: config.NetworkPassphrase, HistoryArchiveURLs: []string{config.HistoryArchiveURL}, CheckpointFrequency: config.CheckpointFrequency, - LedgerHashStore: ledgerbackend.NewHorizonDBLedgerHashStore(config.HistorySession), + LedgerHashStore: ledgerbackend.NewHorizonDBLedgerHashStore(ctx, config.HistorySession), Log: logger, Context: ctx, }, @@ -218,8 +218,7 @@ func NewSystem(config Config) (System, error) { } } else { coreSession := config.CoreSession.Clone() - coreSession.Ctx = ctx - ledgerBackend, err = ledgerbackend.NewDatabaseBackendFromSession(coreSession, config.NetworkPassphrase) + ledgerBackend, err = ledgerbackend.NewDatabaseBackendFromSession(ctx, coreSession, config.NetworkPassphrase) if err != nil { cancel() return nil, errors.Wrap(err, "error creating ledger backend") @@ -227,7 +226,6 @@ func NewSystem(config Config) (System, error) { } historyQ := &history.Q{config.HistorySession.Clone()} - historyQ.Ctx = ctx historyAdapter := newHistoryArchiveAdapter(archive) @@ -279,7 +277,7 @@ func (s *system) initMetrics() { Help: "equals 1 if state invalid, 0 otherwise", }, func() float64 { - invalid, err := s.historyQ.CloneIngestionQ().GetExpStateInvalid() + invalid, err := s.historyQ.CloneIngestionQ().GetExpStateInvalid(s.ctx) if err != nil { log.WithError(err).Error("Error in initMetrics/GetExpStateInvalid") return 0 @@ -487,7 +485,7 @@ func (s *system) runStateMachine(cur stateMachineNode) error { } func (s *system) maybeVerifyState(lastIngestedLedger uint32) { - stateInvalid, err := s.historyQ.GetExpStateInvalid() + stateInvalid, err := s.historyQ.GetExpStateInvalid(s.ctx) if err != nil && !isCancelledError(err) { log.WithField("err", err).Error("Error getting state invalid value") } @@ -509,7 +507,7 @@ func (s *system) maybeVerifyState(lastIngestedLedger uint32) { errorCount := s.incrementStateVerificationErrors() switch errors.Cause(err).(type) { case ingest.StateError: - markStateInvalid(s.historyQ, err) + markStateInvalid(s.ctx, s.historyQ, err) default: logger := log.WithField("err", err).Warn if errorCount >= stateVerificationErrorThreshold { @@ -572,10 +570,10 @@ func (s *system) Shutdown() { } } -func markStateInvalid(historyQ history.IngestionQ, err error) { +func markStateInvalid(ctx context.Context, historyQ history.IngestionQ, err error) { log.WithField("err", err).Error("STATE IS INVALID!") q := historyQ.CloneIngestionQ() - if err := q.UpdateExpStateInvalid(true); err != nil { + if err := q.UpdateExpStateInvalid(ctx, true); err != nil { log.WithField("err", err).Error(updateExpStateInvalidErrMsg) } } diff --git a/services/horizon/internal/ingest/main_test.go b/services/horizon/internal/ingest/main_test.go index 92d99262d6..bddafb3239 100644 --- a/services/horizon/internal/ingest/main_test.go +++ b/services/horizon/internal/ingest/main_test.go @@ -79,14 +79,8 @@ func TestCheckVerifyStateVersion(t *testing.T) { func TestNewSystem(t *testing.T) { config := Config{ - CoreSession: &db.Session{ - DB: &sqlx.DB{}, - Ctx: context.Background(), - }, - HistorySession: &db.Session{ - DB: &sqlx.DB{}, - Ctx: context.Background(), - }, + CoreSession: &db.Session{DB: &sqlx.DB{}}, + HistorySession: &db.Session{DB: &sqlx.DB{}}, DisableStateVerification: true, HistoryArchiveURL: "https://history.stellar.org/prd/core-live/core_live_001", CheckpointFrequency: 64, @@ -125,7 +119,7 @@ func TestStateMachineTransition(t *testing.T) { } historyQ.On("GetTx").Return(nil).Once() - historyQ.On("Begin").Return(errors.New("my error")).Once() + historyQ.On("Begin", system.ctx).Return(errors.New("my error")).Once() historyQ.On("GetTx").Return(&sqlx.Tx{}).Once() assert.PanicsWithValue(t, "unexpected transaction", func() { @@ -142,7 +136,7 @@ func TestContextCancel(t *testing.T) { } historyQ.On("GetTx").Return(nil).Once() - historyQ.On("Begin").Return(errors.New("my error")).Once() + historyQ.On("Begin", system.ctx).Return(errors.New("my error")).Once() cancel() assert.NoError(t, system.runStateMachine(startState{})) @@ -183,10 +177,10 @@ func TestMaybeVerifyStateGetExpStateInvalidDBErrCancelOrContextCanceled(t *testi log = logger defer func() { log = oldLogger }() - historyQ.On("GetExpStateInvalid").Return(false, db.ErrCancelled).Once() + historyQ.On("GetExpStateInvalid", system.ctx).Return(false, db.ErrCancelled).Once() system.maybeVerifyState(0) - historyQ.On("GetExpStateInvalid").Return(false, context.Canceled).Once() + historyQ.On("GetExpStateInvalid", system.ctx).Return(false, context.Canceled).Once() system.maybeVerifyState(0) logged := done() @@ -210,15 +204,15 @@ func TestMaybeVerifyInternalDBErrCancelOrContextCanceled(t *testing.T) { log = logger defer func() { log = oldLogger }() - historyQ.On("GetExpStateInvalid").Return(false, nil).Twice() - historyQ.On("Rollback").Return(nil).Twice() + historyQ.On("GetExpStateInvalid", system.ctx, mock.Anything).Return(false, nil).Twice() + historyQ.On("Rollback", system.ctx, mock.Anything).Return(nil).Twice() historyQ.On("CloneIngestionQ").Return(historyQ).Twice() - historyQ.On("BeginTx", mock.Anything).Return(db.ErrCancelled).Once() + historyQ.On("BeginTx", system.ctx, mock.Anything).Return(db.ErrCancelled).Once() system.maybeVerifyState(63) system.wg.Wait() - historyQ.On("BeginTx", mock.Anything).Return(context.Canceled).Once() + historyQ.On("BeginTx", system.ctx, mock.Anything).Return(context.Canceled).Once() system.maybeVerifyState(63) system.wg.Wait() @@ -247,13 +241,13 @@ type mockDBQ struct { history.MockQTrustLines } -func (m *mockDBQ) Begin() error { - args := m.Called() +func (m *mockDBQ) Begin(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } -func (m *mockDBQ) BeginTx(txOpts *sql.TxOptions) error { - args := m.Called(txOpts) +func (m *mockDBQ) BeginTx(ctx context.Context, txOpts *sql.TxOptions) error { + args := m.Called(ctx, txOpts) return args.Error(0) } @@ -262,13 +256,13 @@ func (m *mockDBQ) CloneIngestionQ() history.IngestionQ { return args.Get(0).(history.IngestionQ) } -func (m *mockDBQ) Commit() error { - args := m.Called() +func (m *mockDBQ) Commit(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } -func (m *mockDBQ) Rollback() error { - args := m.Called() +func (m *mockDBQ) Rollback(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } @@ -280,63 +274,63 @@ func (m *mockDBQ) GetTx() *sqlx.Tx { return args.Get(0).(*sqlx.Tx) } -func (m *mockDBQ) GetLastLedgerIngest() (uint32, error) { - args := m.Called() +func (m *mockDBQ) GetLastLedgerIngest(ctx context.Context) (uint32, error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *mockDBQ) GetOfferCompactionSequence() (uint32, error) { - args := m.Called() +func (m *mockDBQ) GetOfferCompactionSequence(ctx context.Context) (uint32, error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *mockDBQ) GetLastLedgerIngestNonBlocking() (uint32, error) { - args := m.Called() +func (m *mockDBQ) GetLastLedgerIngestNonBlocking(ctx context.Context) (uint32, error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *mockDBQ) GetIngestVersion() (int, error) { - args := m.Called() +func (m *mockDBQ) GetIngestVersion(ctx context.Context) (int, error) { + args := m.Called(ctx) return args.Get(0).(int), args.Error(1) } -func (m *mockDBQ) UpdateLastLedgerIngest(sequence uint32) error { - args := m.Called(sequence) +func (m *mockDBQ) UpdateLastLedgerIngest(ctx context.Context, sequence uint32) error { + args := m.Called(ctx, sequence) return args.Error(0) } -func (m *mockDBQ) UpdateExpStateInvalid(invalid bool) error { - args := m.Called(invalid) +func (m *mockDBQ) UpdateExpStateInvalid(ctx context.Context, invalid bool) error { + args := m.Called(ctx, invalid) return args.Error(0) } -func (m *mockDBQ) UpdateIngestVersion(version int) error { - args := m.Called(version) +func (m *mockDBQ) UpdateIngestVersion(ctx context.Context, version int) error { + args := m.Called(ctx, version) return args.Error(0) } -func (m *mockDBQ) GetExpStateInvalid() (bool, error) { - args := m.Called() +func (m *mockDBQ) GetExpStateInvalid(ctx context.Context) (bool, error) { + args := m.Called(ctx) return args.Get(0).(bool), args.Error(1) } -func (m *mockDBQ) GetAllOffers() ([]history.Offer, error) { - args := m.Called() +func (m *mockDBQ) GetAllOffers(ctx context.Context) ([]history.Offer, error) { + args := m.Called(ctx) return args.Get(0).([]history.Offer), args.Error(1) } -func (m *mockDBQ) GetLatestHistoryLedger() (uint32, error) { - args := m.Called() +func (m *mockDBQ) GetLatestHistoryLedger(ctx context.Context) (uint32, error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *mockDBQ) TruncateIngestStateTables() error { - args := m.Called() +func (m *mockDBQ) TruncateIngestStateTables(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } -func (m *mockDBQ) DeleteRangeAll(start, end int64) error { - args := m.Called(start, end) +func (m *mockDBQ) DeleteRangeAll(ctx context.Context, start, end int64) error { + args := m.Called(ctx, start, end) return args.Error(0) } @@ -357,8 +351,8 @@ func (m *mockDBQ) NewTradeBatchInsertBuilder(maxBatchSize int) history.TradeBatc return args.Get(0).(history.TradeBatchInsertBuilder) } -func (m *mockDBQ) CreateAssets(assets []xdr.Asset, batchSize int) (map[string]history.Asset, error) { - args := m.Called(assets) +func (m *mockDBQ) CreateAssets(ctx context.Context, assets []xdr.Asset, batchSize int) (map[string]history.Asset, error) { + args := m.Called(ctx, assets) return args.Get(0).(map[string]history.Asset), args.Error(1) } diff --git a/services/horizon/internal/ingest/orderbook.go b/services/horizon/internal/ingest/orderbook.go index cf3805e699..fc057afddb 100644 --- a/services/horizon/internal/ingest/orderbook.go +++ b/services/horizon/internal/ingest/orderbook.go @@ -55,25 +55,25 @@ type ingestionStatus struct { LastOfferCompactionLedger uint32 } -func (o *OrderBookStream) getIngestionStatus() (ingestionStatus, error) { +func (o *OrderBookStream) getIngestionStatus(ctx context.Context) (ingestionStatus, error) { var status ingestionStatus var err error - status.StateInvalid, err = o.historyQ.GetExpStateInvalid() + status.StateInvalid, err = o.historyQ.GetExpStateInvalid(ctx) if err != nil { return status, errors.Wrap(err, "Error from GetExpStateInvalid") } var lastHistoryLedger uint32 - lastHistoryLedger, err = o.historyQ.GetLatestHistoryLedger() + lastHistoryLedger, err = o.historyQ.GetLatestHistoryLedger(ctx) if err != nil { return status, errors.Wrap(err, "Error from GetLatestHistoryLedger") } - status.LastIngestedLedger, err = o.historyQ.GetLastLedgerIngestNonBlocking() + status.LastIngestedLedger, err = o.historyQ.GetLastLedgerIngestNonBlocking(ctx) if err != nil { return status, errors.Wrap(err, "Error from GetLastLedgerIngestNonBlocking") } - status.LastOfferCompactionLedger, err = o.historyQ.GetOfferCompactionSequence() + status.LastOfferCompactionLedger, err = o.historyQ.GetOfferCompactionSequence(ctx) if err != nil { return status, errors.Wrap(err, "Error from GetOfferCompactionSequence") } @@ -103,7 +103,7 @@ func addOfferToGraph(graph orderbook.OBGraph, offer history.Offer) { } // update returns true if the order book graph was reset -func (o *OrderBookStream) update(status ingestionStatus) (bool, error) { +func (o *OrderBookStream) update(ctx context.Context, status ingestionStatus) (bool, error) { reset := o.lastLedger == 0 if status.StateInvalid { log.WithField("status", status).Warn("ingestion state is invalid") @@ -135,7 +135,7 @@ func (o *OrderBookStream) update(status ingestionStatus) (bool, error) { defer o.graph.Discard() - offers, err := o.historyQ.GetAllOffers() + offers, err := o.historyQ.GetAllOffers(ctx) if err != nil { return true, errors.Wrap(err, "Error from GetAllOffers") } @@ -159,7 +159,7 @@ func (o *OrderBookStream) update(status ingestionStatus) (bool, error) { defer o.graph.Discard() - offers, err := o.historyQ.GetUpdatedOffers(o.lastLedger) + offers, err := o.historyQ.GetUpdatedOffers(ctx, o.lastLedger) if err != nil { return false, errors.Wrap(err, "Error from GetUpdatedOffers") } @@ -180,9 +180,9 @@ func (o *OrderBookStream) update(status ingestionStatus) (bool, error) { return false, nil } -func (o *OrderBookStream) verifyAllOffers() { +func (o *OrderBookStream) verifyAllOffers(ctx context.Context) { offers := o.graph.Offers() - ingestionOffers, err := o.historyQ.GetAllOffers() + ingestionOffers, err := o.historyQ.GetAllOffers(ctx) if err != nil { if !isCancelledError(err) { log.WithError(err).Info("Could not verify offers because of error from GetAllOffers") @@ -231,18 +231,18 @@ func (o *OrderBookStream) verifyAllOffers() { // last time Update() was called. Those changes will then be applied to the in memory order book graph. // After calling this function, the the in memory order book graph should be consistent with the // Horizon DB (assuming no error is returned). -func (o *OrderBookStream) Update() error { - if err := o.historyQ.BeginTx(&sql.TxOptions{ReadOnly: true, Isolation: sql.LevelRepeatableRead}); err != nil { +func (o *OrderBookStream) Update(ctx context.Context) error { + if err := o.historyQ.BeginTx(ctx, &sql.TxOptions{ReadOnly: true, Isolation: sql.LevelRepeatableRead}); err != nil { return errors.Wrap(err, "Error starting repeatable read transaction") } - defer o.historyQ.Rollback() + defer o.historyQ.Rollback(ctx) - status, err := o.getIngestionStatus() + status, err := o.getIngestionStatus(ctx) if err != nil { return errors.Wrap(err, "Error obtaining ingestion status") } - if reset, err := o.update(status); err != nil { + if reset, err := o.update(ctx, status); err != nil { return errors.Wrap(err, "Error updating") } else if reset { return nil @@ -255,7 +255,7 @@ func (o *OrderBookStream) Update() error { time.Since(o.lastVerification) >= verificationFrequency+jitter if requiresVerification { - o.verifyAllOffers() + o.verifyAllOffers(ctx) } return nil } @@ -268,7 +268,7 @@ func (o *OrderBookStream) Run(ctx context.Context) { for { select { case <-ticker.C: - if err := o.Update(); err != nil && !isCancelledError(err) { + if err := o.Update(ctx); err != nil && !isCancelledError(err) { log.WithError(err).Error("could not apply updates from order book stream") } case <-ctx.Done(): diff --git a/services/horizon/internal/ingest/orderbook_test.go b/services/horizon/internal/ingest/orderbook_test.go index ddb37372db..1535e45c13 100644 --- a/services/horizon/internal/ingest/orderbook_test.go +++ b/services/horizon/internal/ingest/orderbook_test.go @@ -3,6 +3,7 @@ package ingest import ( + "context" "fmt" "testing" "time" @@ -14,6 +15,7 @@ import ( type IngestionStatusTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ stream *OrderBookStream } @@ -23,6 +25,7 @@ func TestIngestionStatus(t *testing.T) { } func (t *IngestionStatusTestSuite) SetupTest() { + t.ctx = context.Background() t.historyQ = &mockDBQ{} t.stream = NewOrderBookStream(t.historyQ, &mockOrderBookGraph{}) } @@ -32,81 +35,81 @@ func (t *IngestionStatusTestSuite) TearDownTest() { } func (t *IngestionStatusTestSuite) TestGetExpStateInvalidError() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(false, fmt.Errorf("state invalid error")). Once() - _, err := t.stream.getIngestionStatus() + _, err := t.stream.getIngestionStatus(t.ctx) t.Assert().EqualError(err, "Error from GetExpStateInvalid: state invalid error") } func (t *IngestionStatusTestSuite) TestGetLatestLedgerError() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(false, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(0), fmt.Errorf("latest ledger error")). Once() - _, err := t.stream.getIngestionStatus() + _, err := t.stream.getIngestionStatus(t.ctx) t.Assert().EqualError(err, "Error from GetLatestHistoryLedger: latest ledger error") } func (t *IngestionStatusTestSuite) TestGetLastLedgerIngestNonBlockingError() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(false, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetLastLedgerIngestNonBlocking"). + t.historyQ.On("GetLastLedgerIngestNonBlocking", t.ctx). Return(uint32(0), fmt.Errorf("ingest error")). Once() - _, err := t.stream.getIngestionStatus() + _, err := t.stream.getIngestionStatus(t.ctx) t.Assert().EqualError(err, "Error from GetLastLedgerIngestNonBlocking: ingest error") } func (t *IngestionStatusTestSuite) TestGetOfferCompactionSequenceError() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(false, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetLastLedgerIngestNonBlocking"). + t.historyQ.On("GetLastLedgerIngestNonBlocking", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetOfferCompactionSequence"). + t.historyQ.On("GetOfferCompactionSequence", t.ctx). Return(uint32(0), fmt.Errorf("compaction error")). Once() - _, err := t.stream.getIngestionStatus() + _, err := t.stream.getIngestionStatus(t.ctx) t.Assert().EqualError(err, "Error from GetOfferCompactionSequence: compaction error") } func (t *IngestionStatusTestSuite) TestStateInvalid() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(true, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetLastLedgerIngestNonBlocking"). + t.historyQ.On("GetLastLedgerIngestNonBlocking", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetOfferCompactionSequence"). + t.historyQ.On("GetOfferCompactionSequence", t.ctx). Return(uint32(100), nil). Once() - status, err := t.stream.getIngestionStatus() + status, err := t.stream.getIngestionStatus(t.ctx) t.Assert().NoError(err) t.Assert().Equal(ingestionStatus{ HistoryConsistentWithState: true, @@ -117,23 +120,23 @@ func (t *IngestionStatusTestSuite) TestStateInvalid() { } func (t *IngestionStatusTestSuite) TestHistoryInconsistentWithState() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(true, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(200), nil). Once() - t.historyQ.On("GetLastLedgerIngestNonBlocking"). + t.historyQ.On("GetLastLedgerIngestNonBlocking", t.ctx). Return(uint32(201), nil). Once() - t.historyQ.On("GetOfferCompactionSequence"). + t.historyQ.On("GetOfferCompactionSequence", t.ctx). Return(uint32(100), nil). Once() - status, err := t.stream.getIngestionStatus() + status, err := t.stream.getIngestionStatus(t.ctx) t.Assert().NoError(err) t.Assert().Equal(ingestionStatus{ HistoryConsistentWithState: false, @@ -144,23 +147,23 @@ func (t *IngestionStatusTestSuite) TestHistoryInconsistentWithState() { } func (t *IngestionStatusTestSuite) TestHistoryLatestLedgerZero() { - t.historyQ.On("GetExpStateInvalid"). + t.historyQ.On("GetExpStateInvalid", t.ctx). Return(false, nil). Once() - t.historyQ.On("GetLatestHistoryLedger"). + t.historyQ.On("GetLatestHistoryLedger", t.ctx). Return(uint32(0), nil). Once() - t.historyQ.On("GetLastLedgerIngestNonBlocking"). + t.historyQ.On("GetLastLedgerIngestNonBlocking", t.ctx). Return(uint32(201), nil). Once() - t.historyQ.On("GetOfferCompactionSequence"). + t.historyQ.On("GetOfferCompactionSequence", t.ctx). Return(uint32(100), nil). Once() - status, err := t.stream.getIngestionStatus() + status, err := t.stream.getIngestionStatus(t.ctx) t.Assert().NoError(err) t.Assert().Equal(ingestionStatus{ HistoryConsistentWithState: true, @@ -172,6 +175,7 @@ func (t *IngestionStatusTestSuite) TestHistoryLatestLedgerZero() { type UpdateOrderBookStreamTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ graph *mockOrderBookGraph stream *OrderBookStream @@ -182,6 +186,7 @@ func TestUpdateOrderBookStream(t *testing.T) { } func (t *UpdateOrderBookStreamTestSuite) SetupTest() { + t.ctx = context.Background() t.historyQ = &mockDBQ{} t.graph = &mockOrderBookGraph{} t.stream = NewOrderBookStream(t.historyQ, t.graph) @@ -201,12 +206,12 @@ func (t *UpdateOrderBookStreamTestSuite) TestGetAllOffersError() { } t.graph.On("Clear").Return().Once() t.graph.On("Discard").Return().Once() - t.historyQ.On("GetAllOffers"). + t.historyQ.On("GetAllOffers", t.ctx). Return([]history.Offer{}, fmt.Errorf("offers error")). Once() t.stream.lastLedger = 300 - _, err := t.stream.update(status) + _, err := t.stream.update(t.ctx, status) t.Assert().EqualError(err, "Error from GetAllOffers: offers error") t.Assert().Equal(uint32(0), t.stream.lastLedger) } @@ -232,7 +237,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestResetApplyError() { SellerId: xdr.MustAddress(sellerID), OfferId: 20, } - t.historyQ.On("GetAllOffers"). + t.historyQ.On("GetAllOffers", t.ctx). Return([]history.Offer{offer, otherOffer}, nil). Once() @@ -244,7 +249,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestResetApplyError() { Once() t.stream.lastLedger = 300 - _, err := t.stream.update(status) + _, err := t.stream.update(t.ctx, status) t.Assert().EqualError(err, "Error applying changes to order book: apply error") t.Assert().Equal(uint32(0), t.stream.lastLedger) } @@ -265,7 +270,7 @@ func (t *UpdateOrderBookStreamTestSuite) mockReset(status ingestionStatus) { OfferId: 20, } offers := []history.Offer{offer, otherOffer} - t.historyQ.On("GetAllOffers"). + t.historyQ.On("GetAllOffers", t.ctx). Return(offers, nil). Once() @@ -286,7 +291,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestFirstUpdateSucceeds() { } t.mockReset(status) - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(201), t.stream.lastLedger) t.Assert().True(reset) @@ -301,7 +306,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestInvalidState() { } t.graph.On("Clear").Return().Once() - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().True(reset) @@ -310,7 +315,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestInvalidState() { t.graph.On("Clear").Return().Once() - reset, err = t.stream.update(status) + reset, err = t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().True(reset) @@ -325,7 +330,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestHistoryInconsistentWithState() { } t.graph.On("Clear").Return().Once() - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().True(reset) @@ -334,7 +339,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestHistoryInconsistentWithState() { t.graph.On("Clear").Return().Once() - reset, err = t.stream.update(status) + reset, err = t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().True(reset) @@ -350,7 +355,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestLastIngestedLedgerBehindStream() { t.mockReset(status) t.stream.lastLedger = 300 - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(201), t.stream.lastLedger) t.Assert().True(reset) @@ -366,7 +371,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestStreamBehindLastCompactionLedger() t.mockReset(status) t.stream.lastLedger = 99 - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(201), t.stream.lastLedger) t.Assert().True(reset) @@ -381,7 +386,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestStreamLedgerEqualsLastIngestedLedge } t.stream.lastLedger = 201 - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(uint32(201), t.stream.lastLedger) t.Assert().False(reset) @@ -397,11 +402,11 @@ func (t *UpdateOrderBookStreamTestSuite) TestGetUpdatedOffersError() { t.graph.On("Discard").Return().Once() t.stream.lastLedger = 100 - t.historyQ.MockQOffers.On("GetUpdatedOffers", uint32(100)). + t.historyQ.MockQOffers.On("GetUpdatedOffers", t.ctx, uint32(100)). Return([]history.Offer{}, fmt.Errorf("updated offers error")). Once() - _, err := t.stream.update(status) + _, err := t.stream.update(t.ctx, status) t.Assert().EqualError(err, "Error from GetUpdatedOffers: updated offers error") t.Assert().Equal(uint32(100), t.stream.lastLedger) } @@ -423,7 +428,7 @@ func (t *UpdateOrderBookStreamTestSuite) mockUpdate() { } deletedOffer := history.Offer{OfferID: 30, SellerID: sellerID, LastModifiedLedger: 103, Deleted: true} offers := []history.Offer{offer, otherOffer, deletedOffer} - t.historyQ.MockQOffers.On("GetUpdatedOffers", t.stream.lastLedger). + t.historyQ.MockQOffers.On("GetUpdatedOffers", t.ctx, t.stream.lastLedger). Return(offers, nil). Once() @@ -446,7 +451,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestApplyUpdatesError() { Return(fmt.Errorf("apply error")). Once() - _, err := t.stream.update(status) + _, err := t.stream.update(t.ctx, status) t.Assert().EqualError(err, "Error applying changes to order book: apply error") t.Assert().Equal(uint32(100), t.stream.lastLedger) } @@ -465,7 +470,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestApplyUpdatesSucceeds() { Return(nil). Once() - reset, err := t.stream.update(status) + reset, err := t.stream.update(t.ctx, status) t.Assert().NoError(err) t.Assert().Equal(status.LastIngestedLedger, t.stream.lastLedger) t.Assert().False(reset) @@ -473,6 +478,7 @@ func (t *UpdateOrderBookStreamTestSuite) TestApplyUpdatesSucceeds() { type VerifyOrderBookStreamTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ graph *mockOrderBookGraph stream *OrderBookStream @@ -484,6 +490,7 @@ func TestVerifyOrderBookStream(t *testing.T) { } func (t *VerifyOrderBookStreamTestSuite) SetupTest() { + t.ctx = context.Background() t.historyQ = &mockDBQ{} t.graph = &mockOrderBookGraph{} t.stream = NewOrderBookStream(t.historyQ, t.graph) @@ -527,22 +534,22 @@ func (t *VerifyOrderBookStreamTestSuite) TearDownTest() { } func (t *VerifyOrderBookStreamTestSuite) TestGetAllOffersError() { - t.historyQ.On("GetAllOffers"). + t.historyQ.On("GetAllOffers", t.ctx). Return([]history.Offer{}, fmt.Errorf("offers error")). Once() t.stream.lastLedger = 300 - t.stream.verifyAllOffers() + t.stream.verifyAllOffers(t.ctx) t.Assert().Equal(uint32(300), t.stream.lastLedger) t.Assert().True(t.stream.lastVerification.Equal(t.initialTime)) } func (t *VerifyOrderBookStreamTestSuite) TestEmptyDBOffers() { var offers []history.Offer - t.historyQ.On("GetAllOffers").Return(offers, nil).Once() + t.historyQ.On("GetAllOffers", t.ctx).Return(offers, nil).Once() t.stream.lastLedger = 300 - t.stream.verifyAllOffers() + t.stream.verifyAllOffers(t.ctx) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().False(t.stream.lastVerification.Equal(t.initialTime)) } @@ -563,10 +570,10 @@ func (t *VerifyOrderBookStreamTestSuite) TestLengthMismatch() { LastModifiedLedger: 1, }, } - t.historyQ.On("GetAllOffers").Return(offers, nil).Once() + t.historyQ.On("GetAllOffers", t.ctx).Return(offers, nil).Once() t.stream.lastLedger = 300 - t.stream.verifyAllOffers() + t.stream.verifyAllOffers(t.ctx) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().False(t.stream.lastVerification.Equal(t.initialTime)) } @@ -600,10 +607,10 @@ func (t *VerifyOrderBookStreamTestSuite) TestContentMismatch() { LastModifiedLedger: 1, }, } - t.historyQ.On("GetAllOffers").Return(offers, nil).Once() + t.historyQ.On("GetAllOffers", t.ctx).Return(offers, nil).Once() t.stream.lastLedger = 300 - t.stream.verifyAllOffers() + t.stream.verifyAllOffers(t.ctx) t.Assert().Equal(uint32(0), t.stream.lastLedger) t.Assert().False(t.stream.lastVerification.Equal(t.initialTime)) } @@ -637,10 +644,10 @@ func (t *VerifyOrderBookStreamTestSuite) TestSuccess() { LastModifiedLedger: 1, }, } - t.historyQ.On("GetAllOffers").Return(offers, nil).Once() + t.historyQ.On("GetAllOffers", t.ctx).Return(offers, nil).Once() t.stream.lastLedger = 300 - t.stream.verifyAllOffers() + t.stream.verifyAllOffers(t.ctx) t.Assert().Equal(uint32(300), t.stream.lastLedger) t.Assert().False(t.stream.lastVerification.Equal(t.initialTime)) } diff --git a/services/horizon/internal/ingest/processor_runner.go b/services/horizon/internal/ingest/processor_runner.go index a791304c4c..87c1156a55 100644 --- a/services/horizon/internal/ingest/processor_runner.go +++ b/services/horizon/internal/ingest/processor_runner.go @@ -23,19 +23,19 @@ const ( type horizonChangeProcessor interface { processors.ChangeProcessor - Commit() error + Commit(context.Context) error } type horizonTransactionProcessor interface { processors.LedgerTransactionProcessor - Commit() error + Commit(context.Context) error } type statsChangeProcessor struct { *ingest.StatsChangeProcessor } -func (statsChangeProcessor) Commit() error { +func (statsChangeProcessor) Commit(ctx context.Context) error { return nil } @@ -43,7 +43,7 @@ type statsLedgerTransactionProcessor struct { *processors.StatsLedgerTransactionProcessor } -func (statsLedgerTransactionProcessor) Commit() error { +func (statsLedgerTransactionProcessor) Commit(ctx context.Context) error { return nil } @@ -189,7 +189,7 @@ func (s *ProcessorRunner) RunHistoryArchiveIngestion( changeProcessor := s.buildChangeProcessor(&changeStats, historyArchiveSource, checkpointLedger) if checkpointLedger == 1 { - if err := changeProcessor.ProcessChange(ingest.GenesisChange(s.config.NetworkPassphrase)); err != nil { + if err := changeProcessor.ProcessChange(s.ctx, ingest.GenesisChange(s.config.NetworkPassphrase)); err != nil { return changeStats.GetResults(), errors.Wrap(err, "Error ingesting genesis ledger") } } else { @@ -211,7 +211,7 @@ func (s *ProcessorRunner) RunHistoryArchiveIngestion( log.WithField("ledger", checkpointLedger). Info("Processing entries from History Archive Snapshot") - err = processors.StreamChanges(changeProcessor, newloggingChangeReader( + err = processors.StreamChanges(s.ctx, changeProcessor, newloggingChangeReader( changeReader, "historyArchive", checkpointLedger, @@ -223,7 +223,7 @@ func (s *ProcessorRunner) RunHistoryArchiveIngestion( } } - if err := changeProcessor.Commit(); err != nil { + if err := changeProcessor.Commit(s.ctx); err != nil { return changeStats.GetResults(), errors.Wrap(err, "Error commiting changes from processor") } @@ -246,11 +246,11 @@ func (s *ProcessorRunner) runChangeProcessorOnLedger( logFrequency, s.logMemoryStats, ) - if err = processors.StreamChanges(changeProcessor, changeReader); err != nil { + if err = processors.StreamChanges(s.ctx, changeProcessor, changeReader); err != nil { return errors.Wrap(err, "Error streaming changes from ledger") } - err = changeProcessor.Commit() + err = changeProcessor.Commit(s.ctx) if err != nil { return errors.Wrap(err, "Error commiting changes from processor") } @@ -280,13 +280,13 @@ func (s *ProcessorRunner) RunTransactionProcessorsOnLedger(ledger xdr.LedgerClos } groupTransactionProcessors := s.buildTransactionProcessor(&ledgerTransactionStats, transactionReader.GetHeader()) - err = processors.StreamLedgerTransactions(groupTransactionProcessors, transactionReader) + err = processors.StreamLedgerTransactions(s.ctx, groupTransactionProcessors, transactionReader) if err != nil { err = errors.Wrap(err, "Error streaming changes from ledger") return } - err = groupTransactionProcessors.Commit() + err = groupTransactionProcessors.Commit(s.ctx) if err != nil { err = errors.Wrap(err, "Error commiting changes from processor") return diff --git a/services/horizon/internal/ingest/processor_runner_test.go b/services/horizon/internal/ingest/processor_runner_test.go index 32751acd65..48ee414237 100644 --- a/services/horizon/internal/ingest/processor_runner_test.go +++ b/services/horizon/internal/ingest/processor_runner_test.go @@ -18,6 +18,7 @@ import ( ) func TestProcessorRunnerRunHistoryArchiveIngestionGenesis(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 q := &mockDBQ{} @@ -25,23 +26,23 @@ func TestProcessorRunnerRunHistoryArchiveIngestionGenesis(t *testing.T) { // Batches mockOffersBatchInsertBuilder := &history.MockOffersBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockOffersBatchInsertBuilder) - mockOffersBatchInsertBuilder.On("Exec").Return(nil).Once() + mockOffersBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQOffers.On("NewOffersBatchInsertBuilder", maxBatchSize). Return(mockOffersBatchInsertBuilder).Once() mockAccountDataBatchInsertBuilder := &history.MockAccountDataBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockAccountDataBatchInsertBuilder) - mockAccountDataBatchInsertBuilder.On("Exec").Return(nil).Once() + mockAccountDataBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQData.On("NewAccountDataBatchInsertBuilder", maxBatchSize). Return(mockAccountDataBatchInsertBuilder).Once() mockClaimableBalancesBatchInsertBuilder := &history.MockClaimableBalancesBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockClaimableBalancesBatchInsertBuilder) - mockClaimableBalancesBatchInsertBuilder.On("Exec").Return(nil).Once() + mockClaimableBalancesBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQClaimableBalances.On("NewClaimableBalancesBatchInsertBuilder", maxBatchSize). Return(mockClaimableBalancesBatchInsertBuilder).Once() - q.MockQAccounts.On("UpsertAccounts", []xdr.LedgerEntry{ + q.MockQAccounts.On("UpsertAccounts", ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: 1, Data: xdr.LedgerEntryData{ @@ -58,20 +59,21 @@ func TestProcessorRunnerRunHistoryArchiveIngestionGenesis(t *testing.T) { mockAccountSignersBatchInsertBuilder := &history.MockAccountSignersBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockAccountSignersBatchInsertBuilder) - mockAccountSignersBatchInsertBuilder.On("Add", history.AccountSigner{ + mockAccountSignersBatchInsertBuilder.On("Add", ctx, history.AccountSigner{ Account: "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7", Signer: "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7", Weight: 1, Sponsor: null.String{}, }).Return(nil).Once() - mockAccountSignersBatchInsertBuilder.On("Exec").Return(nil).Once() + mockAccountSignersBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQSigners.On("NewAccountSignersBatchInsertBuilder", maxBatchSize). Return(mockAccountSignersBatchInsertBuilder).Once() - q.MockQAssetStats.On("InsertAssetStats", []history.ExpAssetStat{}, 100000). + q.MockQAssetStats.On("InsertAssetStats", ctx, []history.ExpAssetStat{}, 100000). Return(nil) runner := ProcessorRunner{ + ctx: ctx, config: Config{ NetworkPassphrase: network.PublicNetworkPassphrase, }, @@ -83,6 +85,7 @@ func TestProcessorRunnerRunHistoryArchiveIngestionGenesis(t *testing.T) { } func TestProcessorRunnerRunHistoryArchiveIngestionHistoryArchive(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 config := Config{ @@ -103,11 +106,7 @@ func TestProcessorRunnerRunHistoryArchiveIngestionHistoryArchive(t *testing.T) { m.On("Close").Return(nil).Once() historyAdapter. - On( - "GetState", - mock.AnythingOfType("*context.emptyCtx"), - uint32(63), - ). + On("GetState", ctx, uint32(63)). Return( m, nil, @@ -116,23 +115,23 @@ func TestProcessorRunnerRunHistoryArchiveIngestionHistoryArchive(t *testing.T) { // Batches mockOffersBatchInsertBuilder := &history.MockOffersBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockOffersBatchInsertBuilder) - mockOffersBatchInsertBuilder.On("Exec").Return(nil).Once() + mockOffersBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQOffers.On("NewOffersBatchInsertBuilder", maxBatchSize). Return(mockOffersBatchInsertBuilder).Once() mockAccountDataBatchInsertBuilder := &history.MockAccountDataBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockAccountDataBatchInsertBuilder) - mockAccountDataBatchInsertBuilder.On("Exec").Return(nil).Once() + mockAccountDataBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQData.On("NewAccountDataBatchInsertBuilder", maxBatchSize). Return(mockAccountDataBatchInsertBuilder).Once() mockClaimableBalancesBatchInsertBuilder := &history.MockClaimableBalancesBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockClaimableBalancesBatchInsertBuilder) - mockClaimableBalancesBatchInsertBuilder.On("Exec").Return(nil).Once() + mockClaimableBalancesBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQClaimableBalances.On("NewClaimableBalancesBatchInsertBuilder", maxBatchSize). Return(mockClaimableBalancesBatchInsertBuilder).Once() - q.MockQAccounts.On("UpsertAccounts", []xdr.LedgerEntry{ + q.MockQAccounts.On("UpsertAccounts", ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: 1, Data: xdr.LedgerEntryData{ @@ -149,20 +148,20 @@ func TestProcessorRunnerRunHistoryArchiveIngestionHistoryArchive(t *testing.T) { mockAccountSignersBatchInsertBuilder := &history.MockAccountSignersBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockAccountSignersBatchInsertBuilder) - mockAccountSignersBatchInsertBuilder.On("Add", history.AccountSigner{ + mockAccountSignersBatchInsertBuilder.On("Add", ctx, history.AccountSigner{ Account: "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7", Signer: "GAAZI4TCR3TY5OJHCTJC2A4QSY6CJWJH5IAJTGKIN2ER7LBNVKOCCWN7", Weight: 1, }).Return(nil).Once() - mockAccountSignersBatchInsertBuilder.On("Exec").Return(nil).Once() + mockAccountSignersBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQSigners.On("NewAccountSignersBatchInsertBuilder", maxBatchSize). Return(mockAccountSignersBatchInsertBuilder).Once() - q.MockQAssetStats.On("InsertAssetStats", []history.ExpAssetStat{}, 100000). + q.MockQAssetStats.On("InsertAssetStats", ctx, []history.ExpAssetStat{}, 100000). Return(nil) runner := ProcessorRunner{ - ctx: context.Background(), + ctx: ctx, config: config, historyQ: q, historyAdapter: historyAdapter, @@ -173,6 +172,7 @@ func TestProcessorRunnerRunHistoryArchiveIngestionHistoryArchive(t *testing.T) { } func TestProcessorRunnerRunHistoryArchiveIngestionProtocolVersionNotSupported(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 config := Config{ @@ -205,11 +205,11 @@ func TestProcessorRunnerRunHistoryArchiveIngestionProtocolVersionNotSupported(t q.MockQSigners.On("NewAccountSignersBatchInsertBuilder", maxBatchSize). Return(mockAccountSignersBatchInsertBuilder).Once() - q.MockQAssetStats.On("InsertAssetStats", []history.ExpAssetStat{}, 100000). + q.MockQAssetStats.On("InsertAssetStats", ctx, []history.ExpAssetStat{}, 100000). Return(nil) runner := ProcessorRunner{ - ctx: context.Background(), + ctx: ctx, config: config, historyQ: q, historyAdapter: historyAdapter, @@ -220,6 +220,7 @@ func TestProcessorRunnerRunHistoryArchiveIngestionProtocolVersionNotSupported(t } func TestProcessorRunnerBuildChangeProcessor(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 q := &mockDBQ{} @@ -234,6 +235,7 @@ func TestProcessorRunnerBuildChangeProcessor(t *testing.T) { Return(&history.MockAccountSignersBatchInsertBuilder{}).Twice() runner := ProcessorRunner{ + ctx: ctx, historyQ: q, } @@ -254,6 +256,7 @@ func TestProcessorRunnerBuildChangeProcessor(t *testing.T) { assert.IsType(t, &processors.TrustLinesProcessor{}, processor.processors[6]) runner = ProcessorRunner{ + ctx: ctx, historyQ: q, } @@ -274,6 +277,7 @@ func TestProcessorRunnerBuildChangeProcessor(t *testing.T) { } func TestProcessorRunnerBuildTransactionProcessor(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 q := &mockDBQ{} @@ -285,6 +289,7 @@ func TestProcessorRunnerBuildTransactionProcessor(t *testing.T) { Return(&history.MockTransactionsBatchInsertBuilder{}).Twice() runner := ProcessorRunner{ + ctx: ctx, config: Config{}, historyQ: q, } @@ -304,6 +309,7 @@ func TestProcessorRunnerBuildTransactionProcessor(t *testing.T) { } func TestProcessorRunnerRunAllProcessorsOnLedger(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 config := Config{ @@ -326,13 +332,13 @@ func TestProcessorRunnerRunAllProcessorsOnLedger(t *testing.T) { // Batches mockOffersBatchInsertBuilder := &history.MockOffersBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockOffersBatchInsertBuilder) - mockOffersBatchInsertBuilder.On("Exec").Return(nil).Once() + mockOffersBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQOffers.On("NewOffersBatchInsertBuilder", maxBatchSize). Return(mockOffersBatchInsertBuilder).Once() mockAccountDataBatchInsertBuilder := &history.MockAccountDataBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockAccountDataBatchInsertBuilder) - mockAccountDataBatchInsertBuilder.On("Exec").Return(nil).Once() + mockAccountDataBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQData.On("NewAccountDataBatchInsertBuilder", maxBatchSize). Return(mockAccountDataBatchInsertBuilder).Once() @@ -343,27 +349,27 @@ func TestProcessorRunnerRunAllProcessorsOnLedger(t *testing.T) { mockOperationsBatchInsertBuilder := &history.MockOperationsBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockOperationsBatchInsertBuilder) - mockOperationsBatchInsertBuilder.On("Exec").Return(nil).Once() + mockOperationsBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQOperations.On("NewOperationBatchInsertBuilder", maxBatchSize). Return(mockOperationsBatchInsertBuilder).Twice() mockTransactionsBatchInsertBuilder := &history.MockTransactionsBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockTransactionsBatchInsertBuilder) - mockTransactionsBatchInsertBuilder.On("Exec").Return(nil).Once() + mockTransactionsBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQTransactions.On("NewTransactionBatchInsertBuilder", maxBatchSize). Return(mockTransactionsBatchInsertBuilder).Twice() mockClaimableBalancesBatchInsertBuilder := &history.MockClaimableBalancesBatchInsertBuilder{} defer mock.AssertExpectationsForObjects(t, mockClaimableBalancesBatchInsertBuilder) - mockClaimableBalancesBatchInsertBuilder.On("Exec").Return(nil).Once() + mockClaimableBalancesBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() q.MockQClaimableBalances.On("NewClaimableBalancesBatchInsertBuilder", maxBatchSize). Return(mockClaimableBalancesBatchInsertBuilder).Once() - q.MockQLedgers.On("InsertLedger", ledger.V0.LedgerHeader, 0, 0, 0, 0, CurrentVersion). + q.MockQLedgers.On("InsertLedger", ctx, ledger.V0.LedgerHeader, 0, 0, 0, 0, CurrentVersion). Return(int64(1), nil).Once() runner := ProcessorRunner{ - ctx: context.Background(), + ctx: ctx, config: config, historyQ: q, } @@ -373,6 +379,7 @@ func TestProcessorRunnerRunAllProcessorsOnLedger(t *testing.T) { } func TestProcessorRunnerRunAllProcessorsOnLedgerProtocolVersionNotSupported(t *testing.T) { + ctx := context.Background() maxBatchSize := 100000 config := Config{ @@ -424,7 +431,7 @@ func TestProcessorRunnerRunAllProcessorsOnLedgerProtocolVersionNotSupported(t *t Return(mockClaimableBalancesBatchInsertBuilder).Once() runner := ProcessorRunner{ - ctx: context.Background(), + ctx: ctx, config: config, historyQ: q, } diff --git a/services/horizon/internal/ingest/processors/account_data_processor.go b/services/horizon/internal/ingest/processors/account_data_processor.go index acd06c5948..411a6a7c0d 100644 --- a/services/horizon/internal/ingest/processors/account_data_processor.go +++ b/services/horizon/internal/ingest/processors/account_data_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -23,7 +25,7 @@ func (p *AccountDataProcessor) reset() { p.cache = ingest.NewChangeCompactor() } -func (p *AccountDataProcessor) ProcessChange(change ingest.Change) error { +func (p *AccountDataProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { // We're interested in data only if change.Type != xdr.LedgerEntryTypeData { return nil @@ -35,7 +37,7 @@ func (p *AccountDataProcessor) ProcessChange(change ingest.Change) error { } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -45,7 +47,7 @@ func (p *AccountDataProcessor) ProcessChange(change ingest.Change) error { return nil } -func (p *AccountDataProcessor) Commit() error { +func (p *AccountDataProcessor) Commit(ctx context.Context) error { batch := p.dataQ.NewAccountDataBatchInsertBuilder(maxBatchSize) changes := p.cache.GetChanges() @@ -59,7 +61,7 @@ func (p *AccountDataProcessor) Commit() error { case change.Pre == nil && change.Post != nil: // Created action = "inserting" - err = batch.Add(*change.Post) + err = batch.Add(ctx, *change.Post) rowsAffected = 1 // We don't track this when batch inserting case change.Pre != nil && change.Post == nil: // Removed @@ -69,7 +71,7 @@ func (p *AccountDataProcessor) Commit() error { if err != nil { return errors.Wrap(err, "Error creating ledger key") } - rowsAffected, err = p.dataQ.RemoveAccountData(*ledgerKey.Data) + rowsAffected, err = p.dataQ.RemoveAccountData(ctx, *ledgerKey.Data) default: // Updated action = "updating" @@ -78,7 +80,7 @@ func (p *AccountDataProcessor) Commit() error { if err != nil { return errors.Wrap(err, "Error creating ledger key") } - rowsAffected, err = p.dataQ.UpdateAccountData(*change.Post) + rowsAffected, err = p.dataQ.UpdateAccountData(ctx, *change.Post) } if err != nil { @@ -96,7 +98,7 @@ func (p *AccountDataProcessor) Commit() error { } } - err := batch.Exec() + err := batch.Exec(ctx) if err != nil { return errors.Wrap(err, "error executing batch") } diff --git a/services/horizon/internal/ingest/processors/accounts_data_processor_test.go b/services/horizon/internal/ingest/processors/accounts_data_processor_test.go index fec0b3bb0a..7ba09b4822 100644 --- a/services/horizon/internal/ingest/processors/accounts_data_processor_test.go +++ b/services/horizon/internal/ingest/processors/accounts_data_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stellar/go/ingest" @@ -17,12 +18,14 @@ func TestAccountsDataProcessorTestSuiteState(t *testing.T) { type AccountsDataProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *AccountDataProcessor mockQ *history.MockQData mockBatchInsertBuilder *history.MockAccountDataBatchInsertBuilder } func (s *AccountsDataProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQData{} s.mockBatchInsertBuilder = &history.MockAccountDataBatchInsertBuilder{} @@ -34,8 +37,8 @@ func (s *AccountsDataProcessorTestSuiteState) SetupTest() { } func (s *AccountsDataProcessorTestSuiteState) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) s.mockBatchInsertBuilder.AssertExpectations(s.T()) @@ -59,9 +62,9 @@ func (s *AccountsDataProcessorTestSuiteState) TestCreatesAccounts() { }, LastModifiedLedgerSeq: lastModifiedLedgerSeq, } - s.mockBatchInsertBuilder.On("Add", entry).Return(nil).Once() + s.mockBatchInsertBuilder.On("Add", s.ctx, entry).Return(nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeData, Pre: nil, Post: &entry, @@ -75,12 +78,14 @@ func TestAccountsDataProcessorTestSuiteLedger(t *testing.T) { type AccountsDataProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *AccountDataProcessor mockQ *history.MockQData mockBatchInsertBuilder *history.MockAccountDataBatchInsertBuilder } func (s *AccountsDataProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQData{} s.mockBatchInsertBuilder = &history.MockAccountDataBatchInsertBuilder{} @@ -92,8 +97,8 @@ func (s *AccountsDataProcessorTestSuiteLedger) SetupTest() { } func (s *AccountsDataProcessorTestSuiteLedger) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -109,7 +114,7 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestNewAccountData() { } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeData, Pre: nil, Post: &xdr.LedgerEntry{ @@ -136,7 +141,7 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestNewAccountData() { LastModifiedLedgerSeq: lastModifiedLedgerSeq, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeData, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -150,7 +155,7 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestNewAccountData() { s.Assert().NoError(err) // We use LedgerEntryChangesCache so all changes are squashed - s.mockBatchInsertBuilder.On("Add", updatedEntry).Return(nil).Once() + s.mockBatchInsertBuilder.On("Add", s.ctx, updatedEntry).Return(nil).Once() } func (s *AccountsDataProcessorTestSuiteLedger) TestUpdateAccountData() { @@ -175,7 +180,7 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestUpdateAccountData() { LastModifiedLedgerSeq: lastModifiedLedgerSeq, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeData, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -188,11 +193,11 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestUpdateAccountData() { }) s.Assert().NoError(err) - s.mockQ.On("UpdateAccountData", updatedEntry).Return(int64(1), nil).Once() + s.mockQ.On("UpdateAccountData", s.ctx, updatedEntry).Return(int64(1), nil).Once() } func (s *AccountsDataProcessorTestSuiteLedger) TestRemoveAccountData() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeData, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -210,6 +215,7 @@ func (s *AccountsDataProcessorTestSuiteLedger) TestRemoveAccountData() { s.mockQ.On( "RemoveAccountData", + s.ctx, xdr.LedgerKeyData{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), DataName: "test", diff --git a/services/horizon/internal/ingest/processors/accounts_processor.go b/services/horizon/internal/ingest/processors/accounts_processor.go index 8f82d8712d..289ad23de5 100644 --- a/services/horizon/internal/ingest/processors/accounts_processor.go +++ b/services/horizon/internal/ingest/processors/accounts_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -23,7 +25,7 @@ func (p *AccountsProcessor) reset() { p.cache = ingest.NewChangeCompactor() } -func (p *AccountsProcessor) ProcessChange(change ingest.Change) error { +func (p *AccountsProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeAccount { return nil } @@ -34,7 +36,7 @@ func (p *AccountsProcessor) ProcessChange(change ingest.Change) error { } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -44,7 +46,7 @@ func (p *AccountsProcessor) ProcessChange(change ingest.Change) error { return nil } -func (p *AccountsProcessor) Commit() error { +func (p *AccountsProcessor) Commit(ctx context.Context) error { batchUpsertAccounts := []xdr.LedgerEntry{} changes := p.cache.GetChanges() @@ -66,7 +68,7 @@ func (p *AccountsProcessor) Commit() error { // Removed account := change.Pre.Data.MustAccount() accountID := account.AccountId.Address() - rowsAffected, err := p.accountsQ.RemoveAccount(accountID) + rowsAffected, err := p.accountsQ.RemoveAccount(ctx, accountID) if err != nil { return err @@ -86,7 +88,7 @@ func (p *AccountsProcessor) Commit() error { // Upsert accounts if len(batchUpsertAccounts) > 0 { - err := p.accountsQ.UpsertAccounts(batchUpsertAccounts) + err := p.accountsQ.UpsertAccounts(ctx, batchUpsertAccounts) if err != nil { return errors.Wrap(err, "errors in UpsertAccounts") } diff --git a/services/horizon/internal/ingest/processors/accounts_processor_test.go b/services/horizon/internal/ingest/processors/accounts_processor_test.go index b9707ecc3e..65dc2997e9 100644 --- a/services/horizon/internal/ingest/processors/accounts_processor_test.go +++ b/services/horizon/internal/ingest/processors/accounts_processor_test.go @@ -18,18 +18,20 @@ func TestAccountsProcessorTestSuiteState(t *testing.T) { type AccountsProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *AccountsProcessor mockQ *history.MockQAccounts } func (s *AccountsProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQAccounts{} s.processor = NewAccountsProcessor(s.mockQ) } func (s *AccountsProcessorTestSuiteState) TearDownTest() { - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -46,7 +48,7 @@ func (s *AccountsProcessorTestSuiteState) TestCreatesAccounts() { // We use LedgerEntryChangesCache so all changes are squashed s.mockQ.On( - "UpsertAccounts", + "UpsertAccounts", s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -58,7 +60,7 @@ func (s *AccountsProcessorTestSuiteState) TestCreatesAccounts() { }, ).Return(nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -78,19 +80,20 @@ func TestAccountsProcessorTestSuiteLedger(t *testing.T) { type AccountsProcessorTestSuiteLedger struct { suite.Suite - context context.Context + ctx context.Context processor *AccountsProcessor mockQ *history.MockQAccounts } func (s *AccountsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQAccounts{} s.processor = NewAccountsProcessor(s.mockQ) } func (s *AccountsProcessorTestSuiteLedger) TearDownTest() { - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -105,7 +108,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestNewAccount() { } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -124,7 +127,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestNewAccount() { HomeDomain: "stellar.org", } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -146,6 +149,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestNewAccount() { // We use LedgerEntryChangesCache so all changes are squashed s.mockQ.On( "UpsertAccounts", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -161,10 +165,11 @@ func (s *AccountsProcessorTestSuiteLedger) TestNewAccount() { func (s *AccountsProcessorTestSuiteLedger) TestRemoveAccount() { s.mockQ.On( "RemoveAccount", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", ).Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -187,7 +192,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestProcessUpgradeChange() { } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -206,7 +211,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestProcessUpgradeChange() { HomeDomain: "stellar.org", } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -227,6 +232,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.mockQ.On( "UpsertAccounts", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq + 1, @@ -240,7 +246,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestProcessUpgradeChange() { } func (s *AccountsProcessorTestSuiteLedger) TestFeeProcessedBeforeEverythingElse() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -263,7 +269,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestFeeProcessedBeforeEverythingElse( }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -293,6 +299,7 @@ func (s *AccountsProcessorTestSuiteLedger) TestFeeProcessedBeforeEverythingElse( s.mockQ.On( "UpsertAccounts", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: 0, diff --git a/services/horizon/internal/ingest/processors/asset_stats_processor.go b/services/horizon/internal/ingest/processors/asset_stats_processor.go index f8f20cbc83..818465d984 100644 --- a/services/horizon/internal/ingest/processors/asset_stats_processor.go +++ b/services/horizon/internal/ingest/processors/asset_stats_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "database/sql" "github.com/stellar/go/ingest" @@ -39,12 +40,12 @@ func (p *AssetStatsProcessor) reset() { p.assetStatSet = AssetStatSet{} } -func (p *AssetStatsProcessor) ProcessChange(change ingest.Change) error { +func (p *AssetStatsProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeClaimableBalance && change.Type != xdr.LedgerEntryTypeTrustline { return nil } if p.useLedgerEntryCache { - return p.addToCache(change) + return p.addToCache(ctx, change) } if change.Pre != nil || change.Post == nil { return errors.New("AssetStatsProcessor is in insert only mode") @@ -60,14 +61,14 @@ func (p *AssetStatsProcessor) ProcessChange(change ingest.Change) error { } } -func (p *AssetStatsProcessor) addToCache(change ingest.Change) error { +func (p *AssetStatsProcessor) addToCache(ctx context.Context, change ingest.Change) error { err := p.cache.AddChange(change) if err != nil { return errors.Wrap(err, "error adding to ledgerCache") } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -76,9 +77,9 @@ func (p *AssetStatsProcessor) addToCache(change ingest.Change) error { return nil } -func (p *AssetStatsProcessor) Commit() error { +func (p *AssetStatsProcessor) Commit(ctx context.Context) error { if !p.useLedgerEntryCache { - return p.assetStatsQ.InsertAssetStats(p.assetStatSet.All(), maxBatchSize) + return p.assetStatsQ.InsertAssetStats(ctx, p.assetStatSet.All(), maxBatchSize) } changes := p.cache.GetChanges() @@ -104,7 +105,7 @@ func (p *AssetStatsProcessor) Commit() error { var stat history.ExpAssetStat var err error - stat, err = p.assetStatsQ.GetAssetStat( + stat, err = p.assetStatsQ.GetAssetStat(ctx, delta.AssetType, delta.AssetCode, delta.AssetIssuer, @@ -148,7 +149,7 @@ func (p *AssetStatsProcessor) Commit() error { // Insert var errInsert error - rowsAffected, errInsert = p.assetStatsQ.InsertAssetStat(delta) + rowsAffected, errInsert = p.assetStatsQ.InsertAssetStat(ctx, delta) if errInsert != nil { return errors.Wrap(errInsert, "could not insert asset stat") } @@ -176,7 +177,7 @@ func (p *AssetStatsProcessor) Commit() error { delta.AssetIssuer, )) } - rowsAffected, err = p.assetStatsQ.RemoveAssetStat( + rowsAffected, err = p.assetStatsQ.RemoveAssetStat(ctx, delta.AssetType, delta.AssetCode, delta.AssetIssuer, @@ -186,7 +187,7 @@ func (p *AssetStatsProcessor) Commit() error { } } else { // Update - rowsAffected, err = p.assetStatsQ.UpdateAssetStat(history.ExpAssetStat{ + rowsAffected, err = p.assetStatsQ.UpdateAssetStat(ctx, history.ExpAssetStat{ AssetType: delta.AssetType, AssetCode: delta.AssetCode, AssetIssuer: delta.AssetIssuer, diff --git a/services/horizon/internal/ingest/processors/asset_stats_processor_test.go b/services/horizon/internal/ingest/processors/asset_stats_processor_test.go index 53c15d9c3a..78ef55ea31 100644 --- a/services/horizon/internal/ingest/processors/asset_stats_processor_test.go +++ b/services/horizon/internal/ingest/processors/asset_stats_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "database/sql" "testing" @@ -18,17 +19,19 @@ func TestAssetStatsProcessorTestSuiteState(t *testing.T) { type AssetStatsProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *AssetStatsProcessor mockQ *history.MockQAssetStats } func (s *AssetStatsProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQAssetStats{} s.processor = NewAssetStatsProcessor(s.mockQ, false) } func (s *AssetStatsProcessorTestSuiteState) TearDownTest() { - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -40,7 +43,7 @@ func (s *AssetStatsProcessorTestSuiteState) TestCreateTrustLine() { } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -53,7 +56,7 @@ func (s *AssetStatsProcessorTestSuiteState) TestCreateTrustLine() { }) s.Assert().NoError(err) - s.mockQ.On("InsertAssetStats", []history.ExpAssetStat{ + s.mockQ.On("InsertAssetStats", s.ctx, []history.ExpAssetStat{ { AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), @@ -77,7 +80,7 @@ func (s *AssetStatsProcessorTestSuiteState) TestCreateTrustLineUnauthorized() { Asset: xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()), } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -90,7 +93,7 @@ func (s *AssetStatsProcessorTestSuiteState) TestCreateTrustLineUnauthorized() { }) s.Assert().NoError(err) - s.mockQ.On("InsertAssetStats", []history.ExpAssetStat{ + s.mockQ.On("InsertAssetStats", s.ctx, []history.ExpAssetStat{ { AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), @@ -114,11 +117,13 @@ func TestAssetStatsProcessorTestSuiteLedger(t *testing.T) { type AssetStatsProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *AssetStatsProcessor mockQ *history.MockQAssetStats } func (s *AssetStatsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQAssetStats{} s.processor = NewAssetStatsProcessor(s.mockQ, true) @@ -150,7 +155,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { // test inserts - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{ @@ -163,7 +168,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{ @@ -185,7 +190,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { }, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{ @@ -203,7 +208,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { updatedClaimableBalance := claimableBalance updatedClaimableBalance.Amount *= 2 - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -222,12 +227,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -244,12 +249,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { NumAccounts: 0, }).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "USD", @@ -266,12 +271,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalance() { NumAccounts: 0, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { // should be ignored because it's not an trust line type - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -300,7 +305,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { } lastModifiedLedgerSeq := xdr.Uint32(1234) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -313,7 +318,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -338,7 +343,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { Balance: 10, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -357,7 +362,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -376,12 +381,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -398,12 +403,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { NumAccounts: 1, }).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "USD", @@ -420,7 +425,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertTrustLine() { NumAccounts: 0, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalanceAndTrustline() { @@ -441,7 +446,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalanceAndTrustl } lastModifiedLedgerSeq := xdr.Uint32(1234) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{ @@ -454,7 +459,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalanceAndTrustl }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -467,12 +472,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalanceAndTrustl }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -490,7 +495,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestInsertClaimableBalanceAndTrustl NumAccounts: 1, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLine() { @@ -509,7 +514,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLine() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -528,7 +533,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLine() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), @@ -546,7 +551,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLine() { Amount: "100", NumAccounts: 1, }, nil).Once() - s.mockQ.On("UpdateAssetStat", history.ExpAssetStat{ + s.mockQ.On("UpdateAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -561,7 +566,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLine() { NumAccounts: 1, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() { @@ -607,7 +612,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag), } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -626,7 +631,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -645,7 +650,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -664,7 +669,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), @@ -684,7 +689,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() Amount: "0", NumAccounts: 0, }, nil).Once() - s.mockQ.On("UpdateAssetStat", history.ExpAssetStat{ + s.mockQ.On("UpdateAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -701,7 +706,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() NumAccounts: 1, }).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), @@ -721,7 +726,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() Amount: "100", NumAccounts: 1, }, nil).Once() - s.mockQ.On("UpdateAssetStat", history.ExpAssetStat{ + s.mockQ.On("UpdateAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "USD", @@ -738,7 +743,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() NumAccounts: 0, }).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "ETH", trustLineIssuer.Address(), @@ -758,7 +763,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() Amount: "100", NumAccounts: 1, }, nil).Once() - s.mockQ.On("UpdateAssetStat", history.ExpAssetStat{ + s.mockQ.On("UpdateAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "ETH", @@ -775,7 +780,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() NumAccounts: 0, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { @@ -796,7 +801,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { }, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -808,7 +813,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -820,7 +825,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), @@ -840,13 +845,13 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { Amount: "0", NumAccounts: 0, }, nil).Once() - s.mockQ.On("RemoveAssetStat", + s.mockQ.On("RemoveAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), @@ -867,7 +872,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { Amount: "0", NumAccounts: 0, }, nil).Once() - s.mockQ.On("UpdateAssetStat", history.ExpAssetStat{ + s.mockQ.On("UpdateAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "USD", @@ -882,7 +887,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveClaimableBalance() { NumAccounts: 0, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { @@ -898,7 +903,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { Balance: 0, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -910,7 +915,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -922,7 +927,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), @@ -942,13 +947,13 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { Amount: "0", NumAccounts: 1, }, nil).Once() - s.mockQ.On("RemoveAssetStat", + s.mockQ.On("RemoveAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(int64(1), nil).Once() - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), @@ -968,13 +973,13 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestRemoveTrustLine() { Amount: "0", NumAccounts: 0, }, nil).Once() - s.mockQ.On("RemoveAssetStat", + s.mockQ.On("RemoveAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "USD", trustLineIssuer.Address(), ).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AssetStatsProcessorTestSuiteLedger) TestProcessUpgradeChange() { @@ -987,7 +992,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestProcessUpgradeChange() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Post: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -1006,7 +1011,7 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestProcessUpgradeChange() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -1025,12 +1030,12 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestProcessUpgradeChange() { }) s.Assert().NoError(err) - s.mockQ.On("GetAssetStat", + s.mockQ.On("GetAssetStat", s.ctx, xdr.AssetTypeAssetTypeCreditAlphanum4, "EUR", trustLineIssuer.Address(), ).Return(history.ExpAssetStat{}, sql.ErrNoRows).Once() - s.mockQ.On("InsertAssetStat", history.ExpAssetStat{ + s.mockQ.On("InsertAssetStat", s.ctx, history.ExpAssetStat{ AssetType: xdr.AssetTypeAssetTypeCreditAlphanum4, AssetIssuer: trustLineIssuer.Address(), AssetCode: "EUR", @@ -1046,5 +1051,5 @@ func (s *AssetStatsProcessorTestSuiteLedger) TestProcessUpgradeChange() { Amount: "10", NumAccounts: 1, }).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } diff --git a/services/horizon/internal/ingest/processors/change_processors.go b/services/horizon/internal/ingest/processors/change_processors.go index eab4305604..6c939288b8 100644 --- a/services/horizon/internal/ingest/processors/change_processors.go +++ b/services/horizon/internal/ingest/processors/change_processors.go @@ -1,6 +1,7 @@ package processors import ( + "context" "io" "github.com/stellar/go/ingest" @@ -8,14 +9,15 @@ import ( ) type ChangeProcessor interface { - ProcessChange(change ingest.Change) error + ProcessChange(ctx context.Context, change ingest.Change) error } type LedgerTransactionProcessor interface { - ProcessTransaction(transaction ingest.LedgerTransaction) error + ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error } func StreamLedgerTransactions( + ctx context.Context, txProcessor LedgerTransactionProcessor, reader *ingest.LedgerTransactionReader, ) error { @@ -27,7 +29,7 @@ func StreamLedgerTransactions( if err != nil { return errors.Wrap(err, "could not read transaction") } - if err = txProcessor.ProcessTransaction(tx); err != nil { + if err = txProcessor.ProcessTransaction(ctx, tx); err != nil { return errors.Wrapf( err, "could not process transaction %v", @@ -38,6 +40,7 @@ func StreamLedgerTransactions( } func StreamChanges( + ctx context.Context, changeProcessor ChangeProcessor, reader ingest.ChangeReader, ) error { @@ -50,7 +53,7 @@ func StreamChanges( return errors.Wrap(err, "could not read transaction") } - if err = changeProcessor.ProcessChange(change); err != nil { + if err = changeProcessor.ProcessChange(ctx, change); err != nil { return errors.Wrap( err, "could not process change", diff --git a/services/horizon/internal/ingest/processors/change_processors_test.go b/services/horizon/internal/ingest/processors/change_processors_test.go index 1b3104aa59..829552543f 100644 --- a/services/horizon/internal/ingest/processors/change_processors_test.go +++ b/services/horizon/internal/ingest/processors/change_processors_test.go @@ -1,6 +1,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -11,6 +12,7 @@ import ( func TestStreamReaderError(t *testing.T) { tt := assert.New(t) + ctx := context.Background() mockChangeReader := &ingest.MockChangeReader{} mockChangeReader. @@ -18,12 +20,13 @@ func TestStreamReaderError(t *testing.T) { Return(ingest.Change{}, errors.New("transient error")).Once() mockChangeProcessor := &MockChangeProcessor{} - err := StreamChanges(mockChangeProcessor, mockChangeReader) + err := StreamChanges(ctx, mockChangeProcessor, mockChangeReader) tt.EqualError(err, "could not read transaction: transient error") } func TestStreamChangeProcessorError(t *testing.T) { tt := assert.New(t) + ctx := context.Background() change := ingest.Change{} mockChangeReader := &ingest.MockChangeReader{} @@ -34,11 +37,11 @@ func TestStreamChangeProcessorError(t *testing.T) { mockChangeProcessor := &MockChangeProcessor{} mockChangeProcessor. On( - "ProcessChange", + "ProcessChange", ctx, change, ). Return(errors.New("transient error")).Once() - err := StreamChanges(mockChangeProcessor, mockChangeReader) + err := StreamChanges(ctx, mockChangeProcessor, mockChangeReader) tt.EqualError(err, "could not process change: transient error") } diff --git a/services/horizon/internal/ingest/processors/claimable_balances_change_processor.go b/services/horizon/internal/ingest/processors/claimable_balances_change_processor.go index 79dc442697..390172217a 100644 --- a/services/horizon/internal/ingest/processors/claimable_balances_change_processor.go +++ b/services/horizon/internal/ingest/processors/claimable_balances_change_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -24,7 +26,7 @@ func (p *ClaimableBalancesChangeProcessor) reset() { p.cache = ingest.NewChangeCompactor() } -func (p *ClaimableBalancesChangeProcessor) ProcessChange(change ingest.Change) error { +func (p *ClaimableBalancesChangeProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeClaimableBalance { return nil } @@ -35,7 +37,7 @@ func (p *ClaimableBalancesChangeProcessor) ProcessChange(change ingest.Change) e } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -45,7 +47,7 @@ func (p *ClaimableBalancesChangeProcessor) ProcessChange(change ingest.Change) e return nil } -func (p *ClaimableBalancesChangeProcessor) Commit() error { +func (p *ClaimableBalancesChangeProcessor) Commit(ctx context.Context) error { batch := p.qClaimableBalances.NewClaimableBalancesBatchInsertBuilder(maxBatchSize) changes := p.cache.GetChanges() @@ -59,7 +61,7 @@ func (p *ClaimableBalancesChangeProcessor) Commit() error { case change.Pre == nil && change.Post != nil: // Created action = "inserting" - err = batch.Add(change.Post) + err = batch.Add(ctx, change.Post) rowsAffected = 1 case change.Pre != nil && change.Post == nil: // Removed @@ -69,7 +71,7 @@ func (p *ClaimableBalancesChangeProcessor) Commit() error { if err != nil { return errors.Wrap(err, "Error creating ledger key") } - rowsAffected, err = p.qClaimableBalances.RemoveClaimableBalance(cBalance) + rowsAffected, err = p.qClaimableBalances.RemoveClaimableBalance(ctx, cBalance) default: // Updated action = "updating" @@ -78,7 +80,7 @@ func (p *ClaimableBalancesChangeProcessor) Commit() error { if err != nil { return errors.Wrap(err, "Error creating ledger key") } - rowsAffected, err = p.qClaimableBalances.UpdateClaimableBalance(*change.Post) + rowsAffected, err = p.qClaimableBalances.UpdateClaimableBalance(ctx, *change.Post) } if err != nil { @@ -99,7 +101,7 @@ func (p *ClaimableBalancesChangeProcessor) Commit() error { } } - err := batch.Exec() + err := batch.Exec(ctx) if err != nil { return errors.Wrap(err, "error executing batch") } diff --git a/services/horizon/internal/ingest/processors/claimable_balances_change_processor_test.go b/services/horizon/internal/ingest/processors/claimable_balances_change_processor_test.go index 049fb90fa9..93b5792017 100644 --- a/services/horizon/internal/ingest/processors/claimable_balances_change_processor_test.go +++ b/services/horizon/internal/ingest/processors/claimable_balances_change_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/suite" @@ -18,12 +19,14 @@ func TestClaimableBalancesChangeProcessorTestSuiteState(t *testing.T) { type ClaimableBalancesChangeProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *ClaimableBalancesChangeProcessor mockQ *history.MockQClaimableBalances mockBatchInsertBuilder *history.MockClaimableBalancesBatchInsertBuilder } func (s *ClaimableBalancesChangeProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQClaimableBalances{} s.mockBatchInsertBuilder = &history.MockClaimableBalancesBatchInsertBuilder{} @@ -35,8 +38,8 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteState) SetupTest() { } func (s *ClaimableBalancesChangeProcessorTestSuiteState) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) s.mockBatchInsertBuilder.AssertExpectations(s.T()) } @@ -57,7 +60,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteState) TestCreatesClaimableBal Amount: 10, } - s.mockBatchInsertBuilder.On("Add", &xdr.LedgerEntry{ + s.mockBatchInsertBuilder.On("Add", s.ctx, &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, Data: xdr.LedgerEntryData{ Type: xdr.LedgerEntryTypeClaimableBalance, @@ -65,7 +68,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteState) TestCreatesClaimableBal }, }).Return(nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &xdr.LedgerEntry{ @@ -85,12 +88,14 @@ func TestClaimableBalancesChangeProcessorTestSuiteLedger(t *testing.T) { type ClaimableBalancesChangeProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *ClaimableBalancesChangeProcessor mockQ *history.MockQClaimableBalances mockBatchInsertBuilder *history.MockClaimableBalancesBatchInsertBuilder } func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQClaimableBalances{} s.mockBatchInsertBuilder = &history.MockClaimableBalancesBatchInsertBuilder{} @@ -102,8 +107,8 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) SetupTest() { } func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -135,7 +140,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestNewClaimableBalanc }, }, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: nil, Post: &entry, @@ -158,7 +163,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestNewClaimableBalanc } entry.LastModifiedLedgerSeq = entry.LastModifiedLedgerSeq - 1 - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &entry, Post: &updated, @@ -168,6 +173,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestNewClaimableBalanc // We use LedgerEntryChangesCache so all changes are squashed s.mockBatchInsertBuilder.On( "Add", + s.ctx, &updated, ).Return(nil).Once() } @@ -213,7 +219,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestUpdateClaimableBal }, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &pre, Post: &updated, @@ -222,6 +228,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestUpdateClaimableBal s.mockQ.On( "UpdateClaimableBalance", + s.ctx, updated, ).Return(int64(1), nil).Once() } @@ -250,7 +257,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestRemoveClaimableBal }, }, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeClaimableBalance, Pre: &pre, Post: nil, @@ -259,6 +266,7 @@ func (s *ClaimableBalancesChangeProcessorTestSuiteLedger) TestRemoveClaimableBal s.mockQ.On( "RemoveClaimableBalance", + s.ctx, cBalance, ).Return(int64(1), nil).Once() } diff --git a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor.go b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor.go index f67d9d0b4f..c301418ca4 100644 --- a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor.go +++ b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/toid" @@ -42,7 +44,7 @@ func NewClaimableBalancesTransactionProcessor(Q history.QHistoryClaimableBalance } } -func (p *ClaimableBalancesTransactionProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) error { +func (p *ClaimableBalancesTransactionProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error { err := p.addTransactionClaimableBalances(p.claimableBalanceSet, p.sequence, transaction) if err != nil { return err @@ -173,17 +175,17 @@ func claimableBalancesForOperations(transaction ingest.LedgerTransaction, sequen return cbs, nil } -func (p *ClaimableBalancesTransactionProcessor) Commit() error { +func (p *ClaimableBalancesTransactionProcessor) Commit(ctx context.Context) error { if len(p.claimableBalanceSet) > 0 { - if err := p.loadClaimableBalanceIDs(p.claimableBalanceSet); err != nil { + if err := p.loadClaimableBalanceIDs(ctx, p.claimableBalanceSet); err != nil { return err } - if err := p.insertDBTransactionClaimableBalances(p.claimableBalanceSet); err != nil { + if err := p.insertDBTransactionClaimableBalances(ctx, p.claimableBalanceSet); err != nil { return err } - if err := p.insertDBOperationsClaimableBalances(p.claimableBalanceSet); err != nil { + if err := p.insertDBOperationsClaimableBalances(ctx, p.claimableBalanceSet); err != nil { return err } } @@ -191,13 +193,13 @@ func (p *ClaimableBalancesTransactionProcessor) Commit() error { return nil } -func (p *ClaimableBalancesTransactionProcessor) loadClaimableBalanceIDs(claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { +func (p *ClaimableBalancesTransactionProcessor) loadClaimableBalanceIDs(ctx context.Context, claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { ids := make([]xdr.ClaimableBalanceId, 0, len(claimableBalanceSet)) for id := range claimableBalanceSet { ids = append(ids, id) } - toInternalID, err := p.qClaimableBalances.CreateHistoryClaimableBalances(ids, maxBatchSize) + toInternalID, err := p.qClaimableBalances.CreateHistoryClaimableBalances(ctx, ids, maxBatchSize) if err != nil { return errors.Wrap(err, "Could not create claimable balance ids") } @@ -221,35 +223,35 @@ func (p *ClaimableBalancesTransactionProcessor) loadClaimableBalanceIDs(claimabl return nil } -func (p ClaimableBalancesTransactionProcessor) insertDBTransactionClaimableBalances(claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { +func (p ClaimableBalancesTransactionProcessor) insertDBTransactionClaimableBalances(ctx context.Context, claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { batch := p.qClaimableBalances.NewTransactionClaimableBalanceBatchInsertBuilder(maxBatchSize) for _, entry := range claimableBalanceSet { for transactionID := range entry.transactionSet { - if err := batch.Add(transactionID, entry.internalID); err != nil { + if err := batch.Add(ctx, transactionID, entry.internalID); err != nil { return errors.Wrap(err, "could not insert transaction claimable balance in db") } } } - if err := batch.Exec(); err != nil { + if err := batch.Exec(ctx); err != nil { return errors.Wrap(err, "could not flush transaction claimable balances to db") } return nil } -func (p ClaimableBalancesTransactionProcessor) insertDBOperationsClaimableBalances(claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { +func (p ClaimableBalancesTransactionProcessor) insertDBOperationsClaimableBalances(ctx context.Context, claimableBalanceSet map[xdr.ClaimableBalanceId]claimableBalance) error { batch := p.qClaimableBalances.NewOperationClaimableBalanceBatchInsertBuilder(maxBatchSize) for _, entry := range claimableBalanceSet { for operationID := range entry.operationSet { - if err := batch.Add(operationID, entry.internalID); err != nil { + if err := batch.Add(ctx, operationID, entry.internalID); err != nil { return errors.Wrap(err, "could not insert operation claimable balance in db") } } } - if err := batch.Exec(); err != nil { + if err := batch.Exec(ctx); err != nil { return errors.Wrap(err, "could not flush operation claimable balances to db") } return nil diff --git a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go index a9b1c30792..e482c88ef6 100644 --- a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go +++ b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/mock" @@ -15,6 +16,7 @@ import ( type ClaimableBalancesTransactionProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *ClaimableBalancesTransactionProcessor mockQ *history.MockQHistoryClaimableBalances mockTransactionBatchInsertBuilder *history.MockTransactionClaimableBalanceBatchInsertBuilder @@ -28,6 +30,7 @@ func TestClaimableBalancesTransactionProcessorTestSuiteLedger(t *testing.T) { } func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQHistoryClaimableBalances{} s.mockTransactionBatchInsertBuilder = &history.MockTransactionClaimableBalanceBatchInsertBuilder{} s.mockOperationBatchInsertBuilder = &history.MockOperationClaimableBalanceBatchInsertBuilder{} @@ -46,16 +49,16 @@ func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) TearDownTest() { } func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) mockTransactionBatchAdd(transactionID, internalID int64, err error) { - s.mockTransactionBatchInsertBuilder.On("Add", transactionID, internalID).Return(err).Once() + s.mockTransactionBatchInsertBuilder.On("Add", s.ctx, transactionID, internalID).Return(err).Once() } func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) mockOperationBatchAdd(operationID, internalID int64, err error) { - s.mockOperationBatchInsertBuilder.On("Add", operationID, internalID).Return(err).Once() + s.mockOperationBatchInsertBuilder.On("Add", s.ctx, operationID, internalID).Return(err).Once() } func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) TestEmptyClaimableBalances() { // What is this expecting? Doesn't seem to assert anything meaningful... - err := s.processor.Commit() + err := s.processor.Commit(context.Background()) s.Assert().NoError(err) } @@ -109,9 +112,9 @@ func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) testOperationInse hexID, _ := xdr.MarshalHex(balanceID) // Setup a q - s.mockQ.On("CreateHistoryClaimableBalances", mock.AnythingOfType("[]xdr.ClaimableBalanceId"), maxBatchSize). + s.mockQ.On("CreateHistoryClaimableBalances", s.ctx, mock.AnythingOfType("[]xdr.ClaimableBalanceId"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.ClaimableBalanceId) + arg := args.Get(1).([]xdr.ClaimableBalanceId) s.Assert().ElementsMatch( []xdr.ClaimableBalanceId{ balanceID, @@ -126,18 +129,18 @@ func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) testOperationInse s.mockQ.On("NewTransactionClaimableBalanceBatchInsertBuilder", maxBatchSize). Return(s.mockTransactionBatchInsertBuilder).Once() s.mockTransactionBatchAdd(txnID, internalID, nil) - s.mockTransactionBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockTransactionBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() // Prepare to process operations successfully s.mockQ.On("NewOperationClaimableBalanceBatchInsertBuilder", maxBatchSize). Return(s.mockOperationBatchInsertBuilder).Once() s.mockOperationBatchAdd(opID, internalID, nil) - s.mockOperationBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockOperationBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() // Process the transaction - err := s.processor.ProcessTransaction(txn) + err := s.processor.ProcessTransaction(s.ctx, txn) s.Assert().NoError(err) - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().NoError(err) } diff --git a/services/horizon/internal/ingest/processors/effects_processor.go b/services/horizon/internal/ingest/processors/effects_processor.go index 9708f94d03..93e129cd9c 100644 --- a/services/horizon/internal/ingest/processors/effects_processor.go +++ b/services/horizon/internal/ingest/processors/effects_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "encoding/base64" "encoding/json" "fmt" @@ -29,13 +30,13 @@ func NewEffectProcessor(effectsQ history.QEffects, sequence uint32) *EffectProce } } -func (p *EffectProcessor) loadAccountIDs(accountSet map[string]int64) error { +func (p *EffectProcessor) loadAccountIDs(ctx context.Context, accountSet map[string]int64) error { addresses := make([]string, 0, len(accountSet)) for address := range accountSet { addresses = append(addresses, address) } - addressToID, err := p.effectsQ.CreateAccounts(addresses, maxBatchSize) + addressToID, err := p.effectsQ.CreateAccounts(ctx, addresses, maxBatchSize) if err != nil { return errors.Wrap(err, "Could not create account ids") } @@ -73,7 +74,7 @@ func operationsEffects(transaction ingest.LedgerTransaction, sequence uint32) ([ return effects, nil } -func (p *EffectProcessor) insertDBOperationsEffects(effects []effect, accountSet map[string]int64) error { +func (p *EffectProcessor) insertDBOperationsEffects(ctx context.Context, effects []effect, accountSet map[string]int64) error { batch := p.effectsQ.NewEffectBatchInsertBuilder(maxBatchSize) for _, effect := range effects { @@ -90,7 +91,7 @@ func (p *EffectProcessor) insertDBOperationsEffects(effects []effect, accountSet return errors.Wrapf(err, "Error marshaling details for operation effect %v", effect.operationID) } - if err := batch.Add( + if err := batch.Add(ctx, accountID, effect.operationID, effect.order, @@ -101,13 +102,13 @@ func (p *EffectProcessor) insertDBOperationsEffects(effects []effect, accountSet } } - if err := batch.Exec(); err != nil { + if err := batch.Exec(ctx); err != nil { return errors.Wrap(err, "could not flush operation effects to db") } return nil } -func (p *EffectProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) (err error) { +func (p *EffectProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) (err error) { // Failed transactions don't have operation effects if !transaction.Result.Successful() { return nil @@ -123,7 +124,7 @@ func (p *EffectProcessor) ProcessTransaction(transaction ingest.LedgerTransactio return nil } -func (p *EffectProcessor) Commit() (err error) { +func (p *EffectProcessor) Commit(ctx context.Context) (err error) { if len(p.effects) > 0 { accountSet := map[string]int64{} @@ -131,11 +132,11 @@ func (p *EffectProcessor) Commit() (err error) { accountSet[effect.address] = 0 } - if err = p.loadAccountIDs(accountSet); err != nil { + if err = p.loadAccountIDs(ctx, accountSet); err != nil { return err } - if err = p.insertDBOperationsEffects(p.effects, accountSet); err != nil { + if err = p.insertDBOperationsEffects(ctx, p.effects, accountSet); err != nil { return err } } diff --git a/services/horizon/internal/ingest/processors/effects_processor_test.go b/services/horizon/internal/ingest/processors/effects_processor_test.go index 5ff9bf6a0d..8672c82cb3 100644 --- a/services/horizon/internal/ingest/processors/effects_processor_test.go +++ b/services/horizon/internal/ingest/processors/effects_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -19,6 +20,7 @@ import ( type EffectsProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *EffectProcessor mockQ *history.MockQEffects mockBatchInsertBuilder *history.MockEffectBatchInsertBuilder @@ -42,6 +44,7 @@ func TestEffectsProcessorTestSuiteLedger(t *testing.T) { } func (s *EffectsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQEffects{} s.mockBatchInsertBuilder = &history.MockEffectBatchInsertBuilder{} @@ -131,6 +134,7 @@ func (s *EffectsProcessorTestSuiteLedger) TearDownTest() { func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[2]], toid.New(int32(s.sequence), 1, 1).ToInt64(), uint32(1), @@ -139,6 +143,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { ).Return(nil).Once() s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[2]], toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(1), @@ -147,6 +152,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { ).Return(nil).Once() s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[1]], toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(2), @@ -155,6 +161,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { ).Return(nil).Once() s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[2]], toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(3), @@ -164,6 +171,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[0]], toid.New(int32(s.sequence), 3, 1).ToInt64(), uint32(1), @@ -173,6 +181,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { s.mockBatchInsertBuilder.On( "Add", + s.ctx, s.addressToID[s.addresses[0]], toid.New(int32(s.sequence), 3, 1).ToInt64(), uint32(2), @@ -184,16 +193,17 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulCreateAccounts() { s.mockQ.On( "CreateAccounts", + s.ctx, mock.AnythingOfType("[]string"), maxBatchSize, ).Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch(s.addresses, arg) }).Return(s.addressToID, nil).Once() } func (s *EffectsProcessorTestSuiteLedger) TestEmptyEffects() { - err := s.processor.Commit() + err := s.processor.Commit(context.Background()) s.Assert().NoError(err) } @@ -204,25 +214,25 @@ func (s *EffectsProcessorTestSuiteLedger) TestIngestEffectsSucceeds() { s.mockSuccessfulEffectBatchAdds() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().NoError(err) } func (s *EffectsProcessorTestSuiteLedger) TestCreateAccountsFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Return(s.addressToID, errors.New("transient error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "Could not create account ids: transient error") } @@ -232,7 +242,7 @@ func (s *EffectsProcessorTestSuiteLedger) TestBatchAddFails() { Return(s.mockBatchInsertBuilder).Once() s.mockBatchInsertBuilder.On( - "Add", + "Add", s.ctx, s.addressToID[s.addresses[2]], toid.New(int32(s.sequence), 1, 1).ToInt64(), uint32(1), @@ -240,10 +250,10 @@ func (s *EffectsProcessorTestSuiteLedger) TestBatchAddFails() { []byte("{\"new_seq\":300000000000}"), ).Return(errors.New("transient error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "could not insert operation effect in db: transient error") } diff --git a/services/horizon/internal/ingest/processors/ledgers_processor.go b/services/horizon/internal/ingest/processors/ledgers_processor.go index e5d846b0e6..01c29b43d9 100644 --- a/services/horizon/internal/ingest/processors/ledgers_processor.go +++ b/services/horizon/internal/ingest/processors/ledgers_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -29,7 +31,7 @@ func NewLedgerProcessor( } } -func (p *LedgersProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) (err error) { +func (p *LedgersProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) (err error) { opCount := len(transaction.Envelope.Operations()) p.txSetOpCount += opCount if transaction.Result.Successful() { @@ -42,8 +44,8 @@ func (p *LedgersProcessor) ProcessTransaction(transaction ingest.LedgerTransacti return nil } -func (p *LedgersProcessor) Commit() error { - rowsAffected, err := p.ledgersQ.InsertLedger( +func (p *LedgersProcessor) Commit(ctx context.Context) error { + rowsAffected, err := p.ledgersQ.InsertLedger(ctx, p.ledger, p.successTxCount, p.failedTxCount, diff --git a/services/horizon/internal/ingest/processors/ledgers_processor_test.go b/services/horizon/internal/ingest/processors/ledgers_processor_test.go index 67b7b0ae3b..438e269d98 100644 --- a/services/horizon/internal/ingest/processors/ledgers_processor_test.go +++ b/services/horizon/internal/ingest/processors/ledgers_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stellar/go/ingest" @@ -107,8 +108,10 @@ func (s *LedgersProcessorTestSuiteLedger) TearDownTest() { } func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerSucceeds() { + ctx := context.Background() s.mockQ.On( "InsertLedger", + ctx, s.header, s.successCount, s.failedCount, @@ -118,17 +121,19 @@ func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerSucceeds() { ).Return(int64(1), nil) for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().NoError(err) } func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerReturnsError() { + ctx := context.Background() s.mockQ.On( "InsertLedger", + ctx, mock.Anything, mock.Anything, mock.Anything, @@ -137,14 +142,16 @@ func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerReturnsError() { mock.Anything, ).Return(int64(0), errors.New("transient error")) - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().Error(err) s.Assert().EqualError(err, "Could not insert ledger: transient error") } func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerNoRowsAffected() { + ctx := context.Background() s.mockQ.On( "InsertLedger", + ctx, mock.Anything, mock.Anything, mock.Anything, @@ -153,7 +160,7 @@ func (s *LedgersProcessorTestSuiteLedger) TestInsertLedgerNoRowsAffected() { mock.Anything, ).Return(int64(0), nil) - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().Error(err) s.Assert().EqualError(err, "0 rows affected when ingesting new ledger: 20") } diff --git a/services/horizon/internal/ingest/processors/mock_change_processor.go b/services/horizon/internal/ingest/processors/mock_change_processor.go index 6df7374aef..6d2ab64a8f 100644 --- a/services/horizon/internal/ingest/processors/mock_change_processor.go +++ b/services/horizon/internal/ingest/processors/mock_change_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stretchr/testify/mock" "github.com/stellar/go/ingest" @@ -12,7 +14,7 @@ type MockChangeProcessor struct { mock.Mock } -func (m *MockChangeProcessor) ProcessChange(change ingest.Change) error { - args := m.Called(change) +func (m *MockChangeProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { + args := m.Called(ctx, change) return args.Error(0) } diff --git a/services/horizon/internal/ingest/processors/offers_processor.go b/services/horizon/internal/ingest/processors/offers_processor.go index 74c55e3f31..5a99d0a24c 100644 --- a/services/horizon/internal/ingest/processors/offers_processor.go +++ b/services/horizon/internal/ingest/processors/offers_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -32,7 +34,7 @@ func (p *OffersProcessor) reset() { p.removeBatch = []int64{} } -func (p *OffersProcessor) ProcessChange(change ingest.Change) error { +func (p *OffersProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeOffer { return nil } @@ -42,7 +44,7 @@ func (p *OffersProcessor) ProcessChange(change ingest.Change) error { } if p.cache.Size() > maxBatchSize { - if err := p.flushCache(); err != nil { + if err := p.flushCache(ctx); err != nil { return errors.Wrap(err, "error in Commit") } p.reset() @@ -68,7 +70,7 @@ func (p *OffersProcessor) ledgerEntryToRow(entry *xdr.LedgerEntry) history.Offer } } -func (p *OffersProcessor) flushCache() error { +func (p *OffersProcessor) flushCache(ctx context.Context) error { changes := p.cache.GetChanges() for _, change := range changes { var rowsAffected int64 @@ -81,7 +83,7 @@ func (p *OffersProcessor) flushCache() error { // Created action = "inserting" row := p.ledgerEntryToRow(change.Post) - err = p.insertBatch.Add(row) + err = p.insertBatch.Add(ctx, row) rowsAffected = 1 // We don't track this when batch inserting case change.Pre != nil && change.Post == nil: // Removed @@ -95,7 +97,7 @@ func (p *OffersProcessor) flushCache() error { offer := change.Post.Data.MustOffer() offerID = offer.OfferId row := p.ledgerEntryToRow(change.Post) - rowsAffected, err = p.offersQ.UpdateOffer(row) + rowsAffected, err = p.offersQ.UpdateOffer(ctx, row) } if err != nil { @@ -112,13 +114,13 @@ func (p *OffersProcessor) flushCache() error { } } - err := p.insertBatch.Exec() + err := p.insertBatch.Exec(ctx) if err != nil { return errors.Wrap(err, "error executing batch") } if len(p.removeBatch) > 0 { - _, err = p.offersQ.RemoveOffers(p.removeBatch, p.sequence) + _, err = p.offersQ.RemoveOffers(ctx, p.removeBatch, p.sequence) if err != nil { return errors.Wrap(err, "error in RemoveOffers") } @@ -127,14 +129,14 @@ func (p *OffersProcessor) flushCache() error { return nil } -func (p *OffersProcessor) Commit() error { - if err := p.flushCache(); err != nil { +func (p *OffersProcessor) Commit(ctx context.Context) error { + if err := p.flushCache(ctx); err != nil { return errors.Wrap(err, "error flushing cache") } if p.sequence > offerCompactionWindow { // trim offers table by removing offers which were deleted before the cutoff ledger - if offerRowsRemoved, err := p.offersQ.CompactOffers(p.sequence - offerCompactionWindow); err != nil { + if offerRowsRemoved, err := p.offersQ.CompactOffers(ctx, p.sequence-offerCompactionWindow); err != nil { return errors.Wrap(err, "could not compact offers") } else { log.WithField("offer_rows_removed", offerRowsRemoved).Info("Trimmed offers table") diff --git a/services/horizon/internal/ingest/processors/offers_processor_test.go b/services/horizon/internal/ingest/processors/offers_processor_test.go index 95135ff703..c49bbaf26a 100644 --- a/services/horizon/internal/ingest/processors/offers_processor_test.go +++ b/services/horizon/internal/ingest/processors/offers_processor_test.go @@ -22,7 +22,7 @@ import ( func TestFuzzOffers(t *testing.T) { tt := test.Start(t) test.ResetHorizonDB(t, tt.HorizonDB) - q := &history.Q{&db.Session{DB: tt.HorizonDB, Ctx: context.Background()}} + q := &history.Q{&db.Session{DB: tt.HorizonDB}} pp := NewOffersProcessor(q, 10) gen := randxdr.NewGenerator() @@ -47,10 +47,10 @@ func TestFuzzOffers(t *testing.T) { } for _, change := range ingest.GetChangesFromLedgerEntryChanges(changes) { - tt.Assert.NoError(pp.ProcessChange(change)) + tt.Assert.NoError(pp.ProcessChange(tt.Ctx, change)) } - tt.Assert.NoError(pp.Commit()) + tt.Assert.NoError(pp.Commit(tt.Ctx)) } func TestOffersProcessorTestSuiteState(t *testing.T) { @@ -59,6 +59,7 @@ func TestOffersProcessorTestSuiteState(t *testing.T) { type OffersProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *OffersProcessor mockQ *history.MockQOffers mockBatchInsertBuilder *history.MockOffersBatchInsertBuilder @@ -66,6 +67,7 @@ type OffersProcessorTestSuiteState struct { } func (s *OffersProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQOffers{} s.mockBatchInsertBuilder = &history.MockOffersBatchInsertBuilder{} @@ -78,9 +80,9 @@ func (s *OffersProcessorTestSuiteState) SetupTest() { } func (s *OffersProcessorTestSuiteState) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockQ.On("CompactOffers", s.sequence-100).Return(int64(0), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100).Return(int64(0), nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) s.mockBatchInsertBuilder.AssertExpectations(s.T()) @@ -101,7 +103,7 @@ func (s *OffersProcessorTestSuiteState) TestCreateOffer() { LastModifiedLedgerSeq: lastModifiedLedgerSeq, } - s.mockBatchInsertBuilder.On("Add", history.Offer{ + s.mockBatchInsertBuilder.On("Add", s.ctx, history.Offer{ SellerID: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", OfferID: 1, Pricen: int32(1), @@ -110,7 +112,7 @@ func (s *OffersProcessorTestSuiteState) TestCreateOffer() { LastModifiedLedger: uint32(lastModifiedLedgerSeq), }).Return(nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: nil, Post: &entry, @@ -124,6 +126,7 @@ func TestOffersProcessorTestSuiteLedger(t *testing.T) { type OffersProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *OffersProcessor mockQ *history.MockQOffers mockBatchInsertBuilder *history.MockOffersBatchInsertBuilder @@ -131,6 +134,7 @@ type OffersProcessorTestSuiteLedger struct { } func (s *OffersProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQOffers{} s.mockBatchInsertBuilder = &history.MockOffersBatchInsertBuilder{} @@ -149,7 +153,7 @@ func (s *OffersProcessorTestSuiteLedger) TearDownTest() { func (s *OffersProcessorTestSuiteLedger) setupInsertOffer() { // should be ignored because it's not an offer type - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -172,7 +176,7 @@ func (s *OffersProcessorTestSuiteLedger) setupInsertOffer() { } lastModifiedLedgerSeq := xdr.Uint32(1234) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: nil, Post: &xdr.LedgerEntry{ @@ -199,7 +203,7 @@ func (s *OffersProcessorTestSuiteLedger) setupInsertOffer() { }, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -213,7 +217,7 @@ func (s *OffersProcessorTestSuiteLedger) setupInsertOffer() { s.Assert().NoError(err) // We use LedgerEntryChangesCache so all changes are squashed - s.mockBatchInsertBuilder.On("Add", history.Offer{ + s.mockBatchInsertBuilder.On("Add", s.ctx, history.Offer{ SellerID: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", OfferID: 2, Pricen: int32(1), @@ -222,32 +226,32 @@ func (s *OffersProcessorTestSuiteLedger) setupInsertOffer() { LastModifiedLedger: uint32(lastModifiedLedgerSeq), }).Return(nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() } func (s *OffersProcessorTestSuiteLedger) TestInsertOffer() { s.setupInsertOffer() - s.mockQ.On("CompactOffers", s.sequence-100).Return(int64(0), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100).Return(int64(0), nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *OffersProcessorTestSuiteLedger) TestSkipCompactionIfSequenceEqualsWindow() { s.processor.sequence = offerCompactionWindow s.setupInsertOffer() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *OffersProcessorTestSuiteLedger) TestSkipCompactionIfSequenceLessThanWindow() { s.processor.sequence = offerCompactionWindow - 1 s.setupInsertOffer() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *OffersProcessorTestSuiteLedger) TestCompactionError() { s.setupInsertOffer() - s.mockQ.On("CompactOffers", s.sequence-100). + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100). Return(int64(0), errors.New("compaction error")).Once() - s.Assert().EqualError(s.processor.Commit(), "could not compact offers: compaction error") + s.Assert().EqualError(s.processor.Commit(s.ctx), "could not compact offers: compaction error") } func (s *OffersProcessorTestSuiteLedger) TestUpdateOfferNoRowsAffected() { @@ -272,7 +276,7 @@ func (s *OffersProcessorTestSuiteLedger) TestUpdateOfferNoRowsAffected() { }, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -285,7 +289,7 @@ func (s *OffersProcessorTestSuiteLedger) TestUpdateOfferNoRowsAffected() { }) s.Assert().NoError(err) - s.mockQ.On("UpdateOffer", history.Offer{ + s.mockQ.On("UpdateOffer", s.ctx, history.Offer{ SellerID: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", OfferID: 2, Pricen: int32(1), @@ -294,14 +298,14 @@ func (s *OffersProcessorTestSuiteLedger) TestUpdateOfferNoRowsAffected() { LastModifiedLedger: uint32(lastModifiedLedgerSeq), }).Return(int64(0), nil).Once() - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().IsType(ingest.StateError{}, errors.Cause(err)) s.Assert().EqualError(err, "error flushing cache: 0 rows affected when updating offer 2") } func (s *OffersProcessorTestSuiteLedger) TestRemoveOffer() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -317,11 +321,11 @@ func (s *OffersProcessorTestSuiteLedger) TestRemoveOffer() { }) s.Assert().NoError(err) - s.mockQ.On("RemoveOffers", []int64{3}, s.sequence).Return(int64(1), nil).Once() + s.mockQ.On("RemoveOffers", s.ctx, []int64{3}, s.sequence).Return(int64(1), nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockQ.On("CompactOffers", s.sequence-100).Return(int64(0), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100).Return(int64(0), nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *OffersProcessorTestSuiteLedger) TestProcessUpgradeChange() { @@ -333,7 +337,7 @@ func (s *OffersProcessorTestSuiteLedger) TestProcessUpgradeChange() { } lastModifiedLedgerSeq := xdr.Uint32(1234) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Post: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -359,7 +363,7 @@ func (s *OffersProcessorTestSuiteLedger) TestProcessUpgradeChange() { }, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -373,7 +377,7 @@ func (s *OffersProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.Assert().NoError(err) // We use LedgerEntryChangesCache so all changes are squashed - s.mockBatchInsertBuilder.On("Add", history.Offer{ + s.mockBatchInsertBuilder.On("Add", s.ctx, history.Offer{ SellerID: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", OfferID: 2, Pricen: int32(1), @@ -382,13 +386,13 @@ func (s *OffersProcessorTestSuiteLedger) TestProcessUpgradeChange() { LastModifiedLedger: uint32(lastModifiedLedgerSeq), }).Return(nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockQ.On("CompactOffers", s.sequence-100).Return(int64(0), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100).Return(int64(0), nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *OffersProcessorTestSuiteLedger) TestRemoveMultipleOffers() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -404,7 +408,7 @@ func (s *OffersProcessorTestSuiteLedger) TestRemoveMultipleOffers() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeOffer, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -420,14 +424,14 @@ func (s *OffersProcessorTestSuiteLedger) TestRemoveMultipleOffers() { }) s.Assert().NoError(err) - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockQ.On("CompactOffers", s.sequence-100).Return(int64(0), nil).Once() - s.mockQ.On("RemoveOffers", mock.Anything, s.sequence).Run(func(args mock.Arguments) { + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockQ.On("CompactOffers", s.ctx, s.sequence-100).Return(int64(0), nil).Once() + s.mockQ.On("RemoveOffers", s.ctx, mock.Anything, s.sequence).Run(func(args mock.Arguments) { // To fix order issue due to using ChangeCompactor - ids := args.Get(0).([]int64) + ids := args.Get(1).([]int64) s.Assert().ElementsMatch(ids, []int64{3, 4}) }).Return(int64(0), nil).Once() - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().NoError(err) } diff --git a/services/horizon/internal/ingest/processors/operations_processor.go b/services/horizon/internal/ingest/processors/operations_processor.go index 31aa39d7fe..ba9fa3ede6 100644 --- a/services/horizon/internal/ingest/processors/operations_processor.go +++ b/services/horizon/internal/ingest/processors/operations_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "encoding/base64" "encoding/json" "fmt" @@ -30,7 +31,7 @@ func NewOperationProcessor(operationsQ history.QOperations, sequence uint32) *Op } // ProcessTransaction process the given transaction -func (p *OperationProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) error { +func (p *OperationProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error { for i, op := range transaction.Envelope.Operations() { operation := transactionOperationWrapper{ index: uint32(i), @@ -48,7 +49,7 @@ func (p *OperationProcessor) ProcessTransaction(transaction ingest.LedgerTransac return errors.Wrapf(err, "Error marshaling details for operation %v", operation.ID()) } - if err := p.batch.Add( + if err := p.batch.Add(ctx, operation.ID(), operation.TransactionID(), operation.Order(), @@ -63,8 +64,8 @@ func (p *OperationProcessor) ProcessTransaction(transaction ingest.LedgerTransac return nil } -func (p *OperationProcessor) Commit() error { - return p.batch.Exec() +func (p *OperationProcessor) Commit(ctx context.Context) error { + return p.batch.Exec(ctx) } // transactionOperationWrapper represents the data for a single operation within a transaction diff --git a/services/horizon/internal/ingest/processors/operations_processor_test.go b/services/horizon/internal/ingest/processors/operations_processor_test.go index 332138936a..23a9e0e65c 100644 --- a/services/horizon/internal/ingest/processors/operations_processor_test.go +++ b/services/horizon/internal/ingest/processors/operations_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "encoding/json" "testing" @@ -17,6 +18,7 @@ import ( type OperationsProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *OperationProcessor mockQ *history.MockQOperations mockBatchInsertBuilder *history.MockOperationsBatchInsertBuilder @@ -27,6 +29,7 @@ func TestOperationProcessorTestSuiteLedger(t *testing.T) { } func (s *OperationsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQOperations{} s.mockBatchInsertBuilder = &history.MockOperationsBatchInsertBuilder{} s.mockQ. @@ -64,6 +67,7 @@ func (s *OperationsProcessorTestSuiteLedger) mockBatchInsertAdds(txs []ingest.Le s.mockBatchInsertBuilder.On( "Add", + s.ctx, expected.ID(), expected.TransactionID(), expected.Order(), @@ -110,11 +114,11 @@ func (s *OperationsProcessorTestSuiteLedger) TestAddOperationSucceeds() { err = s.mockBatchInsertAdds(txs, uint32(56)) s.Assert().NoError(err) - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) for _, tx := range txs { - err = s.processor.ProcessTransaction(tx) + err = s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } } @@ -124,7 +128,7 @@ func (s *OperationsProcessorTestSuiteLedger) TestAddOperationFails() { s.mockBatchInsertBuilder. On( - "Add", + "Add", s.ctx, mock.Anything, mock.Anything, mock.Anything, @@ -133,14 +137,14 @@ func (s *OperationsProcessorTestSuiteLedger) TestAddOperationFails() { mock.Anything, ).Return(errors.New("transient error")).Once() - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().Error(err) s.Assert().EqualError(err, "Error batch inserting operation rows: transient error") } func (s *OperationsProcessorTestSuiteLedger) TestExecFails() { - s.mockBatchInsertBuilder.On("Exec").Return(errors.New("transient error")).Once() - err := s.processor.Commit() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(errors.New("transient error")).Once() + err := s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().EqualError(err, "transient error") } diff --git a/services/horizon/internal/ingest/processors/participants_processor.go b/services/horizon/internal/ingest/processors/participants_processor.go index 8e17bfe9aa..8b285bb91d 100644 --- a/services/horizon/internal/ingest/processors/participants_processor.go +++ b/services/horizon/internal/ingest/processors/participants_processor.go @@ -3,6 +3,7 @@ package processors import ( + "context" "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/toid" @@ -46,13 +47,13 @@ func (p *participant) addOperationID(id int64) { p.operationSet[id] = struct{}{} } -func (p *ParticipantsProcessor) loadAccountIDs(participantSet map[string]participant) error { +func (p *ParticipantsProcessor) loadAccountIDs(ctx context.Context, participantSet map[string]participant) error { addresses := make([]string, 0, len(participantSet)) for address := range participantSet { addresses = append(addresses, address) } - addressToID, err := p.participantsQ.CreateAccounts(addresses, maxBatchSize) + addressToID, err := p.participantsQ.CreateAccounts(ctx, addresses, maxBatchSize) if err != nil { return errors.Wrap(err, "Could not create account ids") } @@ -226,41 +227,41 @@ func (p *ParticipantsProcessor) addOperationsParticipants( return nil } -func (p *ParticipantsProcessor) insertDBTransactionParticipants(participantSet map[string]participant) error { +func (p *ParticipantsProcessor) insertDBTransactionParticipants(ctx context.Context, participantSet map[string]participant) error { batch := p.participantsQ.NewTransactionParticipantsBatchInsertBuilder(maxBatchSize) for _, entry := range participantSet { for transactionID := range entry.transactionSet { - if err := batch.Add(transactionID, entry.accountID); err != nil { + if err := batch.Add(ctx, transactionID, entry.accountID); err != nil { return errors.Wrap(err, "Could not insert transaction participant in db") } } } - if err := batch.Exec(); err != nil { + if err := batch.Exec(ctx); err != nil { return errors.Wrap(err, "Could not flush transaction participants to db") } return nil } -func (p *ParticipantsProcessor) insertDBOperationsParticipants(participantSet map[string]participant) error { +func (p *ParticipantsProcessor) insertDBOperationsParticipants(ctx context.Context, participantSet map[string]participant) error { batch := p.participantsQ.NewOperationParticipantBatchInsertBuilder(maxBatchSize) for _, entry := range participantSet { for operationID := range entry.operationSet { - if err := batch.Add(operationID, entry.accountID); err != nil { + if err := batch.Add(ctx, operationID, entry.accountID); err != nil { return errors.Wrap(err, "could not insert operation participant in db") } } } - if err := batch.Exec(); err != nil { + if err := batch.Exec(ctx); err != nil { return errors.Wrap(err, "could not flush operation participants to db") } return nil } -func (p *ParticipantsProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) (err error) { +func (p *ParticipantsProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) (err error) { err = p.addTransactionParticipants(p.participantSet, p.sequence, transaction) if err != nil { return err @@ -274,17 +275,17 @@ func (p *ParticipantsProcessor) ProcessTransaction(transaction ingest.LedgerTran return nil } -func (p *ParticipantsProcessor) Commit() (err error) { +func (p *ParticipantsProcessor) Commit(ctx context.Context) (err error) { if len(p.participantSet) > 0 { - if err = p.loadAccountIDs(p.participantSet); err != nil { + if err = p.loadAccountIDs(ctx, p.participantSet); err != nil { return err } - if err = p.insertDBTransactionParticipants(p.participantSet); err != nil { + if err = p.insertDBTransactionParticipants(ctx, p.participantSet); err != nil { return err } - if err = p.insertDBOperationsParticipants(p.participantSet); err != nil { + if err = p.insertDBOperationsParticipants(ctx, p.participantSet); err != nil { return err } } diff --git a/services/horizon/internal/ingest/processors/participants_processor_test.go b/services/horizon/internal/ingest/processors/participants_processor_test.go index a816c1ce5f..cf6fcc5f6d 100644 --- a/services/horizon/internal/ingest/processors/participants_processor_test.go +++ b/services/horizon/internal/ingest/processors/participants_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/mock" @@ -17,6 +18,7 @@ import ( type ParticipantsProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *ParticipantsProcessor mockQ *history.MockQParticipants mockBatchInsertBuilder *history.MockTransactionParticipantsBatchInsertBuilder @@ -38,6 +40,7 @@ func TestParticipantsProcessorTestSuiteLedger(t *testing.T) { } func (s *ParticipantsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQParticipants{} s.mockBatchInsertBuilder = &history.MockTransactionParticipantsBatchInsertBuilder{} s.mockOperationsBatchInsertBuilder = &history.MockOperationParticipantBatchInsertBuilder{} @@ -99,37 +102,37 @@ func (s *ParticipantsProcessorTestSuiteLedger) TearDownTest() { func (s *ParticipantsProcessorTestSuiteLedger) mockSuccessfulTransactionBatchAdds() { s.mockBatchInsertBuilder.On( - "Add", s.firstTxID, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.firstTxID, s.addressToID[s.addresses[0]], ).Return(nil).Once() s.mockBatchInsertBuilder.On( - "Add", s.secondTxID, s.addressToID[s.addresses[1]], + "Add", s.ctx, s.secondTxID, s.addressToID[s.addresses[1]], ).Return(nil).Once() s.mockBatchInsertBuilder.On( - "Add", s.secondTxID, s.addressToID[s.addresses[2]], + "Add", s.ctx, s.secondTxID, s.addressToID[s.addresses[2]], ).Return(nil).Once() s.mockBatchInsertBuilder.On( - "Add", s.thirdTxID, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.thirdTxID, s.addressToID[s.addresses[0]], ).Return(nil).Once() } func (s *ParticipantsProcessorTestSuiteLedger) mockSuccessfulOperationBatchAdds() { s.mockOperationsBatchInsertBuilder.On( - "Add", s.firstTxID+1, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.firstTxID+1, s.addressToID[s.addresses[0]], ).Return(nil).Once() s.mockOperationsBatchInsertBuilder.On( - "Add", s.secondTxID+1, s.addressToID[s.addresses[1]], + "Add", s.ctx, s.secondTxID+1, s.addressToID[s.addresses[1]], ).Return(nil).Once() s.mockOperationsBatchInsertBuilder.On( - "Add", s.secondTxID+1, s.addressToID[s.addresses[2]], + "Add", s.ctx, s.secondTxID+1, s.addressToID[s.addresses[2]], ).Return(nil).Once() s.mockOperationsBatchInsertBuilder.On( - "Add", s.thirdTxID+1, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.thirdTxID+1, s.addressToID[s.addresses[0]], ).Return(nil).Once() } func (s *ParticipantsProcessorTestSuiteLedger) TestEmptyParticipants() { - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().NoError(err) } @@ -168,9 +171,9 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestFeeBumptransaction() { addresses[0]: s.addressToID[addresses[0]], addresses[1]: s.addressToID[addresses[1]], } - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( addresses, arg, @@ -182,23 +185,23 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestFeeBumptransaction() { Return(s.mockOperationsBatchInsertBuilder).Once() s.mockBatchInsertBuilder.On( - "Add", feeBumpTxID, addressToID[addresses[0]], + "Add", s.ctx, feeBumpTxID, addressToID[addresses[0]], ).Return(nil).Once() s.mockBatchInsertBuilder.On( - "Add", feeBumpTxID, addressToID[addresses[1]], + "Add", s.ctx, feeBumpTxID, addressToID[addresses[1]], ).Return(nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockOperationsBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockOperationsBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() - s.Assert().NoError(s.processor.ProcessTransaction(feeBumpTx)) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.ProcessTransaction(s.ctx, feeBumpTx)) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *ParticipantsProcessorTestSuiteLedger) TestIngestParticipantsSucceeds() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( s.addresses, arg, @@ -212,32 +215,32 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestIngestParticipantsSucceeds() s.mockSuccessfulTransactionBatchAdds() s.mockSuccessfulOperationBatchAdds() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockOperationsBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockOperationsBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().NoError(err) } func (s *ParticipantsProcessorTestSuiteLedger) TestCreateAccountsFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Return(s.addressToID, errors.New("transient error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "Could not create account ids: transient error") } func (s *ParticipantsProcessorTestSuiteLedger) TestBatchAddFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( s.addresses, arg, @@ -247,31 +250,31 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestBatchAddFails() { Return(s.mockBatchInsertBuilder).Once() s.mockBatchInsertBuilder.On( - "Add", s.firstTxID, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.firstTxID, s.addressToID[s.addresses[0]], ).Return(errors.New("transient error")).Once() s.mockBatchInsertBuilder.On( - "Add", s.secondTxID, s.addressToID[s.addresses[1]], + "Add", s.ctx, s.secondTxID, s.addressToID[s.addresses[1]], ).Return(nil).Maybe() s.mockBatchInsertBuilder.On( - "Add", s.secondTxID, s.addressToID[s.addresses[2]], + "Add", s.ctx, s.secondTxID, s.addressToID[s.addresses[2]], ).Return(nil).Maybe() s.mockBatchInsertBuilder.On( - "Add", s.thirdTxID, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.thirdTxID, s.addressToID[s.addresses[0]], ).Return(nil).Maybe() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "Could not insert transaction participant in db: transient error") } func (s *ParticipantsProcessorTestSuiteLedger) TestOperationParticipantsBatchAddFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( s.addresses, arg, @@ -285,32 +288,32 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestOperationParticipantsBatchAdd s.mockSuccessfulTransactionBatchAdds() s.mockOperationsBatchInsertBuilder.On( - "Add", s.firstTxID+1, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.firstTxID+1, s.addressToID[s.addresses[0]], ).Return(errors.New("transient error")).Once() s.mockOperationsBatchInsertBuilder.On( - "Add", s.secondTxID+1, s.addressToID[s.addresses[1]], + "Add", s.ctx, s.secondTxID+1, s.addressToID[s.addresses[1]], ).Return(nil).Maybe() s.mockOperationsBatchInsertBuilder.On( - "Add", s.secondTxID+1, s.addressToID[s.addresses[2]], + "Add", s.ctx, s.secondTxID+1, s.addressToID[s.addresses[2]], ).Return(nil).Maybe() s.mockOperationsBatchInsertBuilder.On( - "Add", s.thirdTxID+1, s.addressToID[s.addresses[0]], + "Add", s.ctx, s.thirdTxID+1, s.addressToID[s.addresses[0]], ).Return(nil).Maybe() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "could not insert operation participant in db: transient error") } func (s *ParticipantsProcessorTestSuiteLedger) TestBatchAddExecFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( s.addresses, arg, @@ -321,20 +324,20 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestBatchAddExecFails() { s.mockSuccessfulTransactionBatchAdds() - s.mockBatchInsertBuilder.On("Exec").Return(errors.New("transient error")).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(errors.New("transient error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "Could not flush transaction participants to db: transient error") } func (s *ParticipantsProcessorTestSuiteLedger) TestOpeartionBatchAddExecFails() { - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", s.ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( s.addresses, arg, @@ -348,13 +351,13 @@ func (s *ParticipantsProcessorTestSuiteLedger) TestOpeartionBatchAddExecFails() s.mockSuccessfulTransactionBatchAdds() s.mockSuccessfulOperationBatchAdds() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.mockOperationsBatchInsertBuilder.On("Exec").Return(errors.New("transient error")).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.mockOperationsBatchInsertBuilder.On("Exec", s.ctx).Return(errors.New("transient error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(s.ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(s.ctx) s.Assert().EqualError(err, "could not flush operation participants to db: transient error") } diff --git a/services/horizon/internal/ingest/processors/signer_processor_test.go b/services/horizon/internal/ingest/processors/signer_processor_test.go index 79abbc260b..de5c70bddc 100644 --- a/services/horizon/internal/ingest/processors/signer_processor_test.go +++ b/services/horizon/internal/ingest/processors/signer_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/guregu/null" @@ -20,12 +21,14 @@ func TestAccountsSignerProcessorTestSuiteState(t *testing.T) { type AccountsSignerProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *SignersProcessor mockQ *history.MockQSigners mockBatchInsertBuilder *history.MockAccountSignersBatchInsertBuilder } func (s *AccountsSignerProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQSigners{} s.mockBatchInsertBuilder = &history.MockAccountSignersBatchInsertBuilder{} @@ -37,8 +40,8 @@ func (s *AccountsSignerProcessorTestSuiteState) SetupTest() { } func (s *AccountsSignerProcessorTestSuiteState) TearDownTest() { - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) s.mockBatchInsertBuilder.AssertExpectations(s.T()) @@ -50,13 +53,13 @@ func (s *AccountsSignerProcessorTestSuiteState) TestNoEntries() { func (s *AccountsSignerProcessorTestSuiteState) TestCreatesSigners() { s.mockBatchInsertBuilder. - On("Add", history.AccountSigner{ + On("Add", s.ctx, history.AccountSigner{ Account: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", Signer: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", Weight: int32(1), }).Return(nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -72,13 +75,13 @@ func (s *AccountsSignerProcessorTestSuiteState) TestCreatesSigners() { s.Assert().NoError(err) s.mockBatchInsertBuilder. - On("Add", history.AccountSigner{ + On("Add", s.ctx, history.AccountSigner{ Account: "GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX", Signer: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", Weight: int32(10), }).Return(nil).Once() - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -102,7 +105,7 @@ func (s *AccountsSignerProcessorTestSuiteState) TestCreatesSigners() { func (s *AccountsSignerProcessorTestSuiteState) TestCreatesSignerWithSponsor() { s.mockBatchInsertBuilder. - On("Add", history.AccountSigner{ + On("Add", s.ctx, history.AccountSigner{ Account: "GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX", Signer: "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", Weight: int32(10), @@ -111,7 +114,7 @@ func (s *AccountsSignerProcessorTestSuiteState) TestCreatesSignerWithSponsor() { sponsorshipDescriptor := xdr.MustAddress("GDWZ6MKJP5ESVIB7O5RW4UFFGSCDILPEKDXWGG4HXXSHEZZPTKLR6UVG") - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -153,11 +156,13 @@ func TestAccountsSignerProcessorTestSuiteLedger(t *testing.T) { type AccountsSignerProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *SignersProcessor mockQ *history.MockQSigners } func (s *AccountsSignerProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQSigners{} s.mockQ. On("NewAccountSignersBatchInsertBuilder", maxBatchSize). @@ -172,13 +177,14 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TearDownTest() { func (s *AccountsSignerProcessorTestSuiteLedger) TestNoTransactions() { // Nothing processed, assertions in TearDownTest. - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(context.Background())) } func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccount() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", int32(1), @@ -186,7 +192,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccount() { ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -200,11 +206,11 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccount() { }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AccountsSignerProcessorTestSuiteLedger) TestNoUpdatesWhenNoSignerChanges() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -226,7 +232,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNoUpdatesWhenNoSignerChange }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { @@ -234,6 +240,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", ). @@ -243,6 +250,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", int32(10), @@ -253,6 +261,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS", int32(15), @@ -260,7 +269,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -296,7 +305,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewSigner() { }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { @@ -304,6 +313,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", ). @@ -312,6 +322,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS", ). @@ -321,6 +332,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS", int32(15), @@ -328,7 +340,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -364,7 +376,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerRemoved() { }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } // TestSignerPreAuthTxRemovedTxFailed tests if removing preauthorized transaction @@ -374,6 +386,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerPreAuthTxRemovedTxFai s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", ). @@ -382,6 +395,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerPreAuthTxRemovedTxFai s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "TBU2RRGLXH3E5CQHTD3ODLDF2BWDCYUSSBLLZ5GNW7JXHDIYKXZWHXL7", ). @@ -391,6 +405,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerPreAuthTxRemovedTxFai s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", int32(10), @@ -398,7 +413,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerPreAuthTxRemovedTxFai ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -434,19 +449,20 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestSignerPreAuthTxRemovedTxFai }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AccountsSignerProcessorTestSuiteLedger) TestRemoveAccount() { s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -460,13 +476,14 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestRemoveAccount() { Post: nil, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccountNoRowsAffected() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", int32(1), @@ -474,7 +491,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccountNoRowsAffected() ). Return(int64(0), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -489,7 +506,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestNewAccountNoRowsAffected() }) s.Assert().NoError(err) - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().IsType(ingest.StateError{}, errors.Cause(err)) s.Assert().EqualError( @@ -504,12 +521,13 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestRemoveAccountNoRowsAffected s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", ). Return(int64(0), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -524,7 +542,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestRemoveAccountNoRowsAffected }) s.Assert().NoError(err) - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().IsType(ingest.StateError{}, errors.Cause(err)) s.Assert().EqualError( @@ -541,6 +559,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.mockQ. On( "RemoveAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", ). @@ -550,6 +569,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCBBDQLCTNASZJ3MTKAOYEOWRGSHDFAJVI7VPZUOP7KXNHYR3HP2BUKV", int32(12), @@ -560,6 +580,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.mockQ. On( "CreateAccountSigner", + s.ctx, "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", "GCAHY6JSXQFKWKP6R7U5JPXDVNV4DJWOWRFLY3Y6YPBF64QRL4BPFDNS", int32(15), @@ -567,7 +588,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { ). Return(int64(1), nil).Once() - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -604,7 +625,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: 1000, @@ -642,7 +663,7 @@ func (s *AccountsSignerProcessorTestSuiteLedger) TestProcessUpgradeChange() { }, }) s.Assert().NoError(err) - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func createTransactionMeta(opMeta []xdr.OperationMeta) xdr.TransactionMeta { diff --git a/services/horizon/internal/ingest/processors/signers_processor.go b/services/horizon/internal/ingest/processors/signers_processor.go index 0be39ba84e..77fe54ebc2 100644 --- a/services/horizon/internal/ingest/processors/signers_processor.go +++ b/services/horizon/internal/ingest/processors/signers_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/guregu/null" "github.com/stellar/go/ingest" @@ -33,7 +35,7 @@ func (p *SignersProcessor) reset() { p.cache = ingest.NewChangeCompactor() } -func (p *SignersProcessor) ProcessChange(change ingest.Change) error { +func (p *SignersProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeAccount { return nil } @@ -45,7 +47,7 @@ func (p *SignersProcessor) ProcessChange(change ingest.Change) error { } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -69,7 +71,7 @@ func (p *SignersProcessor) ProcessChange(change ingest.Change) error { sponsor = null.StringFrom(sponsorDesc.Address()) } - err := p.batch.Add(history.AccountSigner{ + err := p.batch.Add(ctx, history.AccountSigner{ Account: account, Signer: signer, Weight: weight, @@ -83,9 +85,9 @@ func (p *SignersProcessor) ProcessChange(change ingest.Change) error { return nil } -func (p *SignersProcessor) Commit() error { +func (p *SignersProcessor) Commit(ctx context.Context) error { if !p.useLedgerEntryCache { - return p.batch.Exec() + return p.batch.Exec(ctx) } changes := p.cache.GetChanges() @@ -99,7 +101,7 @@ func (p *SignersProcessor) Commit() error { if change.Pre != nil { preAccountEntry := change.Pre.Data.MustAccount() for signer := range preAccountEntry.SignerSummary() { - rowsAffected, err := p.signersQ.RemoveAccountSigner(preAccountEntry.AccountId.Address(), signer) + rowsAffected, err := p.signersQ.RemoveAccountSigner(ctx, preAccountEntry.AccountId.Address(), signer) if err != nil { return errors.Wrap(err, "Error removing a signer") } @@ -129,7 +131,7 @@ func (p *SignersProcessor) Commit() error { } } - rowsAffected, err := p.signersQ.CreateAccountSigner( + rowsAffected, err := p.signersQ.CreateAccountSigner(ctx, postAccountEntry.AccountId.Address(), signer, weight, diff --git a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor.go b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor.go index 1839203b87..999d31e7e9 100644 --- a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor.go +++ b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "fmt" "github.com/stellar/go/ingest" @@ -47,7 +48,7 @@ type StatsLedgerTransactionProcessorResults struct { OperationsSetTrustLineFlags int64 } -func (p *StatsLedgerTransactionProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) error { +func (p *StatsLedgerTransactionProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error { p.results.Transactions++ ops := int64(len(transaction.Envelope.Operations())) p.results.Operations += ops diff --git a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go index 1b83307214..0d6da1e7bd 100644 --- a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go +++ b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go @@ -1,6 +1,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -13,7 +14,7 @@ func TestStatsLedgerTransactionProcessor(t *testing.T) { processor := &StatsLedgerTransactionProcessor{} // Successful - assert.NoError(t, processor.ProcessTransaction(ingest.LedgerTransaction{ + assert.NoError(t, processor.ProcessTransaction(context.Background(), ingest.LedgerTransaction{ Result: xdr.TransactionResultPair{ Result: xdr.TransactionResult{ Result: xdr.TransactionResultResult{ @@ -54,7 +55,7 @@ func TestStatsLedgerTransactionProcessor(t *testing.T) { })) // Failed - assert.NoError(t, processor.ProcessTransaction(ingest.LedgerTransaction{ + assert.NoError(t, processor.ProcessTransaction(context.Background(), ingest.LedgerTransaction{ Result: xdr.TransactionResultPair{ Result: xdr.TransactionResult{ Result: xdr.TransactionResultResult{ diff --git a/services/horizon/internal/ingest/processors/trades_processor.go b/services/horizon/internal/ingest/processors/trades_processor.go index 8024a240f8..529f3b18c3 100644 --- a/services/horizon/internal/ingest/processors/trades_processor.go +++ b/services/horizon/internal/ingest/processors/trades_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "time" "github.com/stellar/go/ingest" @@ -29,7 +30,7 @@ func NewTradeProcessor(tradesQ history.QTrades, ledger xdr.LedgerHeaderHistoryEn } // ProcessTransaction process the given transaction -func (p *TradeProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) (err error) { +func (p *TradeProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) (err error) { if !transaction.Result.Successful() { return nil } @@ -54,16 +55,16 @@ func (p *TradeProcessor) ProcessTransaction(transaction ingest.LedgerTransaction return nil } -func (p *TradeProcessor) Commit() error { +func (p *TradeProcessor) Commit(ctx context.Context) error { if len(p.inserts) > 0 { batch := p.tradesQ.NewTradeBatchInsertBuilder(maxBatchSize) - accountSet, err := p.tradesQ.CreateAccounts(mapKeysToList(p.accountSet), maxBatchSize) + accountSet, err := p.tradesQ.CreateAccounts(ctx, mapKeysToList(p.accountSet), maxBatchSize) if err != nil { return errors.Wrap(err, "Error creating account ids") } var assetMap map[string]history.Asset - assetMap, err = p.tradesQ.CreateAssets(p.assets, maxBatchSize) + assetMap, err = p.tradesQ.CreateAssets(ctx, p.assets, maxBatchSize) if err != nil { return errors.Wrap(err, "Error creating asset ids") } @@ -73,12 +74,12 @@ func (p *TradeProcessor) Commit() error { insert.SellerAccountID = accountSet[insert.Trade.SellerId.Address()] insert.SoldAssetID = assetMap[insert.Trade.AssetSold.String()].ID insert.BoughtAssetID = assetMap[insert.Trade.AssetBought.String()].ID - if err = batch.Add(insert); err != nil { + if err = batch.Add(ctx, insert); err != nil { return errors.Wrap(err, "Error adding trade to batch") } } - if err = batch.Exec(); err != nil { + if err = batch.Exec(ctx); err != nil { return errors.Wrap(err, "Error flushing operation batch") } } diff --git a/services/horizon/internal/ingest/processors/trades_processor_test.go b/services/horizon/internal/ingest/processors/trades_processor_test.go index 5782e893cf..678c94ca45 100644 --- a/services/horizon/internal/ingest/processors/trades_processor_test.go +++ b/services/horizon/internal/ingest/processors/trades_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "fmt" "testing" "time" @@ -156,10 +157,11 @@ func (s *TradeProcessorTestSuiteLedger) TearDownTest() { } func (s *TradeProcessorTestSuiteLedger) TestIgnoreFailedTransactions() { - err := s.processor.ProcessTransaction(createTransaction(false, 1)) + ctx := context.Background() + err := s.processor.ProcessTransaction(ctx, createTransaction(false, 1)) s.Assert().NoError(err) - err = s.processor.Commit() + err = s.processor.Commit(ctx) s.Assert().NoError(err) } @@ -491,20 +493,21 @@ func (s *TradeProcessorTestSuiteLedger) mockReadTradeTransactions( } func (s *TradeProcessorTestSuiteLedger) TestIngestTradesSucceeds() { + ctx := context.Background() inserts := s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, ) }).Return(s.unmuxedAccountToID, nil).Once() - s.mockQ.On("CreateAssets", mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). + s.mockQ.On("CreateAssets", ctx, mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.Asset) + arg := args.Get(1).([]xdr.Asset) s.Assert().ElementsMatch( s.assets, arg, @@ -512,28 +515,29 @@ func (s *TradeProcessorTestSuiteLedger) TestIngestTradesSucceeds() { }).Return(s.assetToID, nil).Once() for _, insert := range inserts { - s.mockBatchInsertBuilder.On("Add", []history.InsertTrade{ + s.mockBatchInsertBuilder.On("Add", ctx, []history.InsertTrade{ insert, }).Return(nil).Once() } - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().NoError(err) } func (s *TradeProcessorTestSuiteLedger) TestCreateAccountsError() { + ctx := context.Background() s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, @@ -541,30 +545,31 @@ func (s *TradeProcessorTestSuiteLedger) TestCreateAccountsError() { }).Return(map[string]int64{}, fmt.Errorf("create accounts error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().EqualError(err, "Error creating account ids: create accounts error") } func (s *TradeProcessorTestSuiteLedger) TestCreateAssetsError() { + ctx := context.Background() s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, ) }).Return(s.unmuxedAccountToID, nil).Once() - s.mockQ.On("CreateAssets", mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). + s.mockQ.On("CreateAssets", ctx, mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.Asset) + arg := args.Get(1).([]xdr.Asset) s.Assert().ElementsMatch( s.assets, arg, @@ -572,111 +577,114 @@ func (s *TradeProcessorTestSuiteLedger) TestCreateAssetsError() { }).Return(s.assetToID, fmt.Errorf("create assets error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().EqualError(err, "Error creating asset ids: create assets error") } func (s *TradeProcessorTestSuiteLedger) TestBatchAddError() { + ctx := context.Background() s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, ) }).Return(s.unmuxedAccountToID, nil).Once() - s.mockQ.On("CreateAssets", mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). + s.mockQ.On("CreateAssets", ctx, mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.Asset) + arg := args.Get(1).([]xdr.Asset) s.Assert().ElementsMatch( s.assets, arg, ) }).Return(s.assetToID, nil).Once() - s.mockBatchInsertBuilder.On("Add", mock.AnythingOfType("[]history.InsertTrade")). + s.mockBatchInsertBuilder.On("Add", ctx, mock.AnythingOfType("[]history.InsertTrade")). Return(fmt.Errorf("batch add error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().EqualError(err, "Error adding trade to batch: batch add error") } func (s *TradeProcessorTestSuiteLedger) TestBatchExecError() { + ctx := context.Background() insert := s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, ) }).Return(s.unmuxedAccountToID, nil).Once() - s.mockQ.On("CreateAssets", mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). + s.mockQ.On("CreateAssets", ctx, mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.Asset) + arg := args.Get(1).([]xdr.Asset) s.Assert().ElementsMatch( s.assets, arg, ) }).Return(s.assetToID, nil).Once() - s.mockBatchInsertBuilder.On("Add", mock.AnythingOfType("[]history.InsertTrade")). + s.mockBatchInsertBuilder.On("Add", ctx, mock.AnythingOfType("[]history.InsertTrade")). Return(nil).Times(len(insert)) - s.mockBatchInsertBuilder.On("Exec").Return(fmt.Errorf("exec error")).Once() + s.mockBatchInsertBuilder.On("Exec", ctx).Return(fmt.Errorf("exec error")).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().EqualError(err, "Error flushing operation batch: exec error") } func (s *TradeProcessorTestSuiteLedger) TestIgnoreCheckIfSmallLedger() { + ctx := context.Background() insert := s.mockReadTradeTransactions(s.processor.ledger) - s.mockQ.On("CreateAccounts", mock.AnythingOfType("[]string"), maxBatchSize). + s.mockQ.On("CreateAccounts", ctx, mock.AnythingOfType("[]string"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]string) + arg := args.Get(1).([]string) s.Assert().ElementsMatch( mapKeysToList(s.unmuxedAccountToID), arg, ) }).Return(s.unmuxedAccountToID, nil).Once() - s.mockQ.On("CreateAssets", mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). + s.mockQ.On("CreateAssets", ctx, mock.AnythingOfType("[]xdr.Asset"), maxBatchSize). Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.Asset) + arg := args.Get(1).([]xdr.Asset) s.Assert().ElementsMatch( s.assets, arg, ) }).Return(s.assetToID, nil).Once() - s.mockBatchInsertBuilder.On("Add", mock.AnythingOfType("[]history.InsertTrade")). + s.mockBatchInsertBuilder.On("Add", ctx, mock.AnythingOfType("[]history.InsertTrade")). Return(nil).Times(len(insert)) - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", ctx).Return(nil).Once() for _, tx := range s.txs { - err := s.processor.ProcessTransaction(tx) + err := s.processor.ProcessTransaction(ctx, tx) s.Assert().NoError(err) } - err := s.processor.Commit() + err := s.processor.Commit(ctx) s.Assert().NoError(err) } diff --git a/services/horizon/internal/ingest/processors/transactions_processor.go b/services/horizon/internal/ingest/processors/transactions_processor.go index 8ba007bd87..4e47cb96ba 100644 --- a/services/horizon/internal/ingest/processors/transactions_processor.go +++ b/services/horizon/internal/ingest/processors/transactions_processor.go @@ -1,6 +1,7 @@ package processors import ( + "context" "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -20,16 +21,16 @@ func NewTransactionProcessor(transactionsQ history.QTransactions, sequence uint3 } } -func (p *TransactionProcessor) ProcessTransaction(transaction ingest.LedgerTransaction) error { - if err := p.batch.Add(transaction, p.sequence); err != nil { +func (p *TransactionProcessor) ProcessTransaction(ctx context.Context, transaction ingest.LedgerTransaction) error { + if err := p.batch.Add(ctx, transaction, p.sequence); err != nil { return errors.Wrap(err, "Error batch inserting transaction rows") } return nil } -func (p *TransactionProcessor) Commit() error { - if err := p.batch.Exec(); err != nil { +func (p *TransactionProcessor) Commit(ctx context.Context) error { + if err := p.batch.Exec(ctx); err != nil { return errors.Wrap(err, "Error flushing transaction batch") } diff --git a/services/horizon/internal/ingest/processors/transactions_processor_test.go b/services/horizon/internal/ingest/processors/transactions_processor_test.go index d04aaec44d..ec1cf105e5 100644 --- a/services/horizon/internal/ingest/processors/transactions_processor_test.go +++ b/services/horizon/internal/ingest/processors/transactions_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stellar/go/services/horizon/internal/db2/history" @@ -12,6 +13,7 @@ import ( type TransactionsProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *TransactionProcessor mockQ *history.MockQTransactions mockBatchInsertBuilder *history.MockTransactionsBatchInsertBuilder @@ -22,6 +24,7 @@ func TestTransactionsProcessorTestSuiteLedger(t *testing.T) { } func (s *TransactionsProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQTransactions{} s.mockBatchInsertBuilder = &history.MockTransactionsBatchInsertBuilder{} @@ -44,29 +47,29 @@ func (s *TransactionsProcessorTestSuiteLedger) TestAddTransactionsSucceeds() { secondTx := createTransaction(false, 3) thirdTx := createTransaction(true, 4) - s.mockBatchInsertBuilder.On("Add", firstTx, sequence).Return(nil).Once() - s.mockBatchInsertBuilder.On("Add", secondTx, sequence).Return(nil).Once() - s.mockBatchInsertBuilder.On("Add", thirdTx, sequence).Return(nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.mockBatchInsertBuilder.On("Add", s.ctx, firstTx, sequence).Return(nil).Once() + s.mockBatchInsertBuilder.On("Add", s.ctx, secondTx, sequence).Return(nil).Once() + s.mockBatchInsertBuilder.On("Add", s.ctx, thirdTx, sequence).Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(nil).Once() + s.Assert().NoError(s.processor.Commit(s.ctx)) - err := s.processor.ProcessTransaction(firstTx) + err := s.processor.ProcessTransaction(s.ctx, firstTx) s.Assert().NoError(err) - err = s.processor.ProcessTransaction(secondTx) + err = s.processor.ProcessTransaction(s.ctx, secondTx) s.Assert().NoError(err) - err = s.processor.ProcessTransaction(thirdTx) + err = s.processor.ProcessTransaction(s.ctx, thirdTx) s.Assert().NoError(err) } func (s *TransactionsProcessorTestSuiteLedger) TestAddTransactionsFails() { sequence := uint32(20) firstTx := createTransaction(true, 1) - s.mockBatchInsertBuilder.On("Add", firstTx, sequence). + s.mockBatchInsertBuilder.On("Add", s.ctx, firstTx, sequence). Return(errors.New("transient error")).Once() - err := s.processor.ProcessTransaction(firstTx) + err := s.processor.ProcessTransaction(s.ctx, firstTx) s.Assert().Error(err) s.Assert().EqualError(err, "Error batch inserting transaction rows: transient error") } @@ -75,13 +78,13 @@ func (s *TransactionsProcessorTestSuiteLedger) TestExecFails() { sequence := uint32(20) firstTx := createTransaction(true, 1) - s.mockBatchInsertBuilder.On("Add", firstTx, sequence).Return(nil).Once() - s.mockBatchInsertBuilder.On("Exec").Return(errors.New("transient error")).Once() + s.mockBatchInsertBuilder.On("Add", s.ctx, firstTx, sequence).Return(nil).Once() + s.mockBatchInsertBuilder.On("Exec", s.ctx).Return(errors.New("transient error")).Once() - err := s.processor.ProcessTransaction(firstTx) + err := s.processor.ProcessTransaction(s.ctx, firstTx) s.Assert().NoError(err) - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().EqualError(err, "Error flushing transaction batch: transient error") } diff --git a/services/horizon/internal/ingest/processors/trust_lines_processor.go b/services/horizon/internal/ingest/processors/trust_lines_processor.go index ac1a6b7e45..c97e47e709 100644 --- a/services/horizon/internal/ingest/processors/trust_lines_processor.go +++ b/services/horizon/internal/ingest/processors/trust_lines_processor.go @@ -1,6 +1,8 @@ package processors import ( + "context" + "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/errors" @@ -23,7 +25,7 @@ func (p *TrustLinesProcessor) reset() { p.cache = ingest.NewChangeCompactor() } -func (p *TrustLinesProcessor) ProcessChange(change ingest.Change) error { +func (p *TrustLinesProcessor) ProcessChange(ctx context.Context, change ingest.Change) error { if change.Type != xdr.LedgerEntryTypeTrustline { return nil } @@ -34,7 +36,7 @@ func (p *TrustLinesProcessor) ProcessChange(change ingest.Change) error { } if p.cache.Size() > maxBatchSize { - err = p.Commit() + err = p.Commit(ctx) if err != nil { return errors.Wrap(err, "error in Commit") } @@ -44,7 +46,7 @@ func (p *TrustLinesProcessor) ProcessChange(change ingest.Change) error { return nil } -func (p *TrustLinesProcessor) Commit() error { +func (p *TrustLinesProcessor) Commit(ctx context.Context) error { batchUpsertTrustLines := []xdr.LedgerEntry{} changes := p.cache.GetChanges() @@ -66,7 +68,7 @@ func (p *TrustLinesProcessor) Commit() error { if err != nil { return errors.Wrap(err, "Error creating ledger key") } - rowsAffected, err = p.trustLinesQ.RemoveTrustLine(*ledgerKey.TrustLine) + rowsAffected, err = p.trustLinesQ.RemoveTrustLine(ctx, *ledgerKey.TrustLine) if err != nil { return err } @@ -87,7 +89,7 @@ func (p *TrustLinesProcessor) Commit() error { // Upsert accounts if len(batchUpsertTrustLines) > 0 { - err := p.trustLinesQ.UpsertTrustLines(batchUpsertTrustLines) + err := p.trustLinesQ.UpsertTrustLines(ctx, batchUpsertTrustLines) if err != nil { return errors.Wrap(err, "errors in UpsertTrustLines") } diff --git a/services/horizon/internal/ingest/processors/trust_lines_processor_test.go b/services/horizon/internal/ingest/processors/trust_lines_processor_test.go index 98b3f6b5ed..2ca13189d2 100644 --- a/services/horizon/internal/ingest/processors/trust_lines_processor_test.go +++ b/services/horizon/internal/ingest/processors/trust_lines_processor_test.go @@ -3,6 +3,7 @@ package processors import ( + "context" "testing" "github.com/stretchr/testify/mock" @@ -22,17 +23,19 @@ func TestTrustLinesProcessorTestSuiteState(t *testing.T) { type TrustLinesProcessorTestSuiteState struct { suite.Suite + ctx context.Context processor *TrustLinesProcessor mockQ *history.MockQTrustLines } func (s *TrustLinesProcessorTestSuiteState) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQTrustLines{} s.processor = NewTrustLinesProcessor(s.mockQ) } func (s *TrustLinesProcessorTestSuiteState) TearDownTest() { - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) s.mockQ.AssertExpectations(s.T()) } @@ -44,7 +47,7 @@ func (s *TrustLinesProcessorTestSuiteState) TestCreateTrustLine() { } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -59,6 +62,7 @@ func (s *TrustLinesProcessorTestSuiteState) TestCreateTrustLine() { s.mockQ.On( "UpsertTrustLines", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -77,7 +81,7 @@ func (s *TrustLinesProcessorTestSuiteState) TestCreateTrustLineUnauthorized() { Asset: xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()), } lastModifiedLedgerSeq := xdr.Uint32(123) - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -92,6 +96,7 @@ func (s *TrustLinesProcessorTestSuiteState) TestCreateTrustLineUnauthorized() { s.mockQ.On( "UpsertTrustLines", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -110,11 +115,13 @@ func TestTrustLinesProcessorTestSuiteLedger(t *testing.T) { type TrustLinesProcessorTestSuiteLedger struct { suite.Suite + ctx context.Context processor *TrustLinesProcessor mockQ *history.MockQTrustLines } func (s *TrustLinesProcessorTestSuiteLedger) SetupTest() { + s.ctx = context.Background() s.mockQ = &history.MockQTrustLines{} s.processor = NewTrustLinesProcessor(s.mockQ) } @@ -125,12 +132,12 @@ func (s *TrustLinesProcessorTestSuiteLedger) TearDownTest() { func (s *TrustLinesProcessorTestSuiteLedger) TestNoIngestUpdateState() { // Nothing processed, assertions in TearDownTest. - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { // should be ignored because it's not an trust line type - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeAccount, Pre: nil, Post: &xdr.LedgerEntry{ @@ -159,7 +166,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { } lastModifiedLedgerSeq := xdr.Uint32(1234) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -172,7 +179,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: nil, Post: &xdr.LedgerEntry{ @@ -197,7 +204,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { Balance: 10, } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -216,7 +223,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -237,9 +244,10 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { s.mockQ.On( "UpsertTrustLines", + s.ctx, mock.AnythingOfType("[]xdr.LedgerEntry"), ).Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.LedgerEntry) + arg := args.Get(1).([]xdr.LedgerEntry) s.Assert().ElementsMatch( []xdr.LedgerEntry{ { @@ -260,7 +268,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestInsertTrustLine() { arg, ) }).Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLine() { @@ -279,7 +287,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLine() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -300,6 +308,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLine() { s.mockQ.On( "UpsertTrustLines", + s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -310,7 +319,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLine() { }, }, ).Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() { @@ -340,7 +349,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() Balance: 10, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -359,7 +368,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq - 1, @@ -380,9 +389,10 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() s.mockQ.On( "UpsertTrustLines", + s.ctx, mock.AnythingOfType("[]xdr.LedgerEntry"), ).Run(func(args mock.Arguments) { - arg := args.Get(0).([]xdr.LedgerEntry) + arg := args.Get(1).([]xdr.LedgerEntry) s.Assert().ElementsMatch( []xdr.LedgerEntry{ { @@ -403,7 +413,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestUpdateTrustLineAuthorization() arg, ) }).Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustLine() { @@ -413,7 +423,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustLine() { Balance: 0, } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -430,7 +440,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustLine() { }) s.Assert().NoError(err) - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -443,20 +453,20 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustLine() { s.Assert().NoError(err) s.mockQ.On( - "RemoveTrustLine", + "RemoveTrustLine", s.ctx, xdr.LedgerKeyTrustLine{ AccountId: xdr.MustAddress("GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB"), Asset: xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()), }, ).Return(int64(1), nil).Once() s.mockQ.On( - "RemoveTrustLine", + "RemoveTrustLine", s.ctx, xdr.LedgerKeyTrustLine{ AccountId: xdr.MustAddress("GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB"), Asset: xdr.MustNewCreditAsset("USD", trustLineIssuer.Address()), }, ).Return(int64(1), nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestProcessUpgradeChange() { @@ -469,7 +479,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestProcessUpgradeChange() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Post: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -488,7 +498,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestProcessUpgradeChange() { Flags: xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag), } - err = s.processor.ProcessChange(ingest.Change{ + err = s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -508,7 +518,7 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestProcessUpgradeChange() { s.Assert().NoError(err) s.mockQ.On( - "UpsertTrustLines", + "UpsertTrustLines", s.ctx, []xdr.LedgerEntry{ { LastModifiedLedgerSeq: lastModifiedLedgerSeq, @@ -519,11 +529,11 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestProcessUpgradeChange() { }, }, ).Return(nil).Once() - s.Assert().NoError(s.processor.Commit()) + s.Assert().NoError(s.processor.Commit(s.ctx)) } func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustlineNoRowsAffected() { - err := s.processor.ProcessChange(ingest.Change{ + err := s.processor.ProcessChange(s.ctx, ingest.Change{ Type: xdr.LedgerEntryTypeTrustline, Pre: &xdr.LedgerEntry{ Data: xdr.LedgerEntryData{ @@ -541,14 +551,14 @@ func (s *TrustLinesProcessorTestSuiteLedger) TestRemoveTrustlineNoRowsAffected() s.Assert().NoError(err) s.mockQ.On( - "RemoveTrustLine", + "RemoveTrustLine", s.ctx, xdr.LedgerKeyTrustLine{ AccountId: xdr.MustAddress("GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB"), Asset: xdr.MustNewCreditAsset("EUR", trustLineIssuer.Address()), }, ).Return(int64(0), nil).Once() - err = s.processor.Commit() + err = s.processor.Commit(s.ctx) s.Assert().Error(err) s.Assert().IsType(ingest.StateError{}, errors.Cause(err)) s.Assert().EqualError(err, "0 rows affected when removing trustline: GAOQJGUAB7NI7K7I62ORBXMN3J4SSWQUQ7FOEPSDJ322W2HMCNWPHXFB credit_alphanum4/EUR/GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H") diff --git a/services/horizon/internal/ingest/resume_state_test.go b/services/horizon/internal/ingest/resume_state_test.go index 2647f4a6e9..92c95a675d 100644 --- a/services/horizon/internal/ingest/resume_state_test.go +++ b/services/horizon/internal/ingest/resume_state_test.go @@ -23,6 +23,7 @@ func TestResumeTestTestSuite(t *testing.T) { type ResumeTestTestSuite struct { suite.Suite + ctx context.Context ledgerBackend *ledgerbackend.MockDatabaseBackend historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter @@ -32,13 +33,14 @@ type ResumeTestTestSuite struct { } func (s *ResumeTestTestSuite) SetupTest() { + s.ctx = context.Background() s.ledgerBackend = &ledgerbackend.MockDatabaseBackend{} s.historyQ = &mockDBQ{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.runner = &mockProcessorsRunner{} s.stellarCoreClient = &mockStellarCoreClient{} s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, runner: s.runner, @@ -48,7 +50,7 @@ func (s *ResumeTestTestSuite) SetupTest() { } s.system.initMetrics() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(101)).Return(nil).Once() @@ -124,7 +126,7 @@ func (s *ResumeTestTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove Rollback assertion. *s.historyQ = mockDBQ{} - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -139,8 +141,8 @@ func (s *ResumeTestTestSuite) TestBeginReturnsError() { } func (s *ResumeTestTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -155,8 +157,8 @@ func (s *ResumeTestTestSuite) TestGetLastLedgerIngestReturnsError() { } func (s *ResumeTestTestSuite) TestGetLatestLedgerLessThanCurrent() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(99), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(99), nil).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -168,9 +170,9 @@ func (s *ResumeTestTestSuite) TestGetLatestLedgerLessThanCurrent() { } func (s *ResumeTestTestSuite) TestGetIngestionVersionError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(0, errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(0, errors.New("my error")).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -185,9 +187,9 @@ func (s *ResumeTestTestSuite) TestGetIngestionVersionError() { } func (s *ResumeTestTestSuite) TestIngestionVersionLessThanCurrentVersion() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion-1, nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion-1, nil).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().NoError(err) @@ -198,9 +200,9 @@ func (s *ResumeTestTestSuite) TestIngestionVersionLessThanCurrentVersion() { } func (s *ResumeTestTestSuite) TestIngestionVersionGreaterThanCurrentVersion() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion+1, nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion+1, nil).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().NoError(err) @@ -211,10 +213,10 @@ func (s *ResumeTestTestSuite) TestIngestionVersionGreaterThanCurrentVersion() { } func (s *ResumeTestTestSuite) TestGetLatestLedgerError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(0), errors.New("my error")) + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(0), errors.New("my error")) next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -229,10 +231,10 @@ func (s *ResumeTestTestSuite) TestGetLatestLedgerError() { } func (s *ResumeTestTestSuite) TestLatestHistoryLedgerLessThanIngestLedger() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(99), nil) + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(99), nil) next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().NoError(err) @@ -243,10 +245,10 @@ func (s *ResumeTestTestSuite) TestLatestHistoryLedgerLessThanIngestLedger() { } func (s *ResumeTestTestSuite) TestLatestHistoryLedgerGreaterThanIngestLedger() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(101), nil) + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(101), nil) next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().NoError(err) @@ -257,10 +259,10 @@ func (s *ResumeTestTestSuite) TestLatestHistoryLedgerGreaterThanIngestLedger() { } func (s *ResumeTestTestSuite) mockSuccessfulIngestion() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(100), nil) + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(100), nil) s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")). Run(func(args mock.Arguments) { @@ -274,8 +276,8 @@ func (s *ResumeTestTestSuite) mockSuccessfulIngestion() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(101)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(101)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() s.stellarCoreClient.On( "SetCursor", @@ -284,7 +286,7 @@ func (s *ResumeTestTestSuite) mockSuccessfulIngestion() { int32(101), ).Return(nil).Once() - s.historyQ.On("GetExpStateInvalid").Return(false, nil).Once() + s.historyQ.On("GetExpStateInvalid", s.ctx).Return(false, nil).Once() } func (s *ResumeTestTestSuite) TestBumpIngestLedger() { *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} @@ -303,8 +305,8 @@ func (s *ResumeTestTestSuite) TestBumpIngestLedger() { }, }, nil).Once() - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(101), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(101), nil).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 99}.run(s.system) s.Assert().NoError(err) @@ -332,10 +334,10 @@ func (s *ResumeTestTestSuite) TestIngestAllMasterNode() { } func (s *ResumeTestTestSuite) TestErrorSettingCursorIgnored() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() - s.historyQ.On("GetIngestVersion").Return(CurrentVersion, nil).Once() - s.historyQ.On("GetLatestHistoryLedger").Return(uint32(100), nil) + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() + s.historyQ.On("GetIngestVersion", s.ctx).Return(CurrentVersion, nil).Once() + s.historyQ.On("GetLatestHistoryLedger", s.ctx).Return(uint32(100), nil) s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")). Run(func(args mock.Arguments) { @@ -349,8 +351,8 @@ func (s *ResumeTestTestSuite) TestErrorSettingCursorIgnored() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(101)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(101)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() s.stellarCoreClient.On( "SetCursor", @@ -359,7 +361,7 @@ func (s *ResumeTestTestSuite) TestErrorSettingCursorIgnored() { int32(101), ).Return(errors.New("my error")).Once() - s.historyQ.On("GetExpStateInvalid").Return(false, nil).Once() + s.historyQ.On("GetExpStateInvalid", s.ctx).Return(false, nil).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().NoError(err) diff --git a/services/horizon/internal/ingest/stress_test.go b/services/horizon/internal/ingest/stress_test.go index b3d2d9dd56..852ad8ed57 100644 --- a/services/horizon/internal/ingest/stress_test.go +++ b/services/horizon/internal/ingest/stress_test.go @@ -3,6 +3,7 @@ package ingest import ( + "context" "testing" "github.com/stretchr/testify/mock" @@ -19,6 +20,7 @@ func TestStressTestStateTestSuite(t *testing.T) { type StressTestStateTestSuite struct { suite.Suite + ctx context.Context historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter runner *mockProcessorsRunner @@ -26,10 +28,12 @@ type StressTestStateTestSuite struct { } func (s *StressTestStateTestSuite) SetupTest() { + s.ctx = context.Background() s.historyQ = &mockDBQ{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.runner = &mockProcessorsRunner{} s.system = &system{ + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, runner: s.runner, @@ -37,7 +41,7 @@ func (s *StressTestStateTestSuite) SetupTest() { s.system.initMetrics() s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() s.runner.On("EnableMemoryStatsLogging").Return() } @@ -65,31 +69,31 @@ func (s *StressTestStateTestSuite) TestBounds() { func (s *StressTestStateTestSuite) TestBeginReturnsError() { *s.historyQ = mockDBQ{} s.historyQ.On("GetTx").Return(nil).Once() - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() err := s.system.StressTest(10, 4) s.Assert().EqualError(err, "Error starting a transaction: my error") } func (s *StressTestStateTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() err := s.system.StressTest(10, 4) s.Assert().EqualError(err, "Error getting last ingested ledger: my error") } func (s *StressTestStateTestSuite) TestGetLastLedgerIngestNonEmpty() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() err := s.system.StressTest(10, 4) s.Assert().EqualError(err, "Database not empty") } func (s *StressTestStateTestSuite) TestRunAllProcessorsOnLedgerReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")).Return( ingest.StatsChangeProcessorResults{}, @@ -104,8 +108,8 @@ func (s *StressTestStateTestSuite) TestRunAllProcessorsOnLedgerReturnsError() { } func (s *StressTestStateTestSuite) TestUpdateLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")).Return( ingest.StatsChangeProcessorResults{}, processorsRunDurations{}, @@ -113,15 +117,15 @@ func (s *StressTestStateTestSuite) TestUpdateLastLedgerIngestReturnsError() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(1)).Return(errors.New("my error")).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(1)).Return(errors.New("my error")).Once() err := s.system.StressTest(10, 4) s.Assert().EqualError(err, "Error updating last ingested ledger: my error") } func (s *StressTestStateTestSuite) TestCommitReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")).Return( ingest.StatsChangeProcessorResults{}, processorsRunDurations{}, @@ -129,16 +133,16 @@ func (s *StressTestStateTestSuite) TestCommitReturnsError() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(1)).Return(nil).Once() - s.historyQ.On("Commit").Return(errors.New("my error")).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(1)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(errors.New("my error")).Once() err := s.system.StressTest(10, 4) s.Assert().EqualError(err, "Error committing db transaction: my error") } func (s *StressTestStateTestSuite) TestSucceeds() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.runner.On("RunAllProcessorsOnLedger", mock.AnythingOfType("xdr.LedgerCloseMeta")).Return( ingest.StatsChangeProcessorResults{}, processorsRunDurations{}, @@ -146,8 +150,8 @@ func (s *StressTestStateTestSuite) TestSucceeds() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(1)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(1)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() err := s.system.StressTest(10, 4) s.Assert().NoError(err) diff --git a/services/horizon/internal/ingest/verify.go b/services/horizon/internal/ingest/verify.go index 7d239aa0cd..f7c47dfaea 100644 --- a/services/horizon/internal/ingest/verify.go +++ b/services/horizon/internal/ingest/verify.go @@ -59,8 +59,8 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { } historyQ := s.historyQ.CloneIngestionQ() - defer historyQ.Rollback() - err := historyQ.BeginTx(&sql.TxOptions{ + defer historyQ.Rollback(s.ctx) + err := historyQ.BeginTx(s.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) @@ -69,7 +69,7 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { } // Ensure the ledger is a checkpoint ledger - ledgerSequence, err := historyQ.GetLastLedgerIngestNonBlocking() + ledgerSequence, err := historyQ.GetLastLedgerIngestNonBlocking(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.GetLastLedgerIngestNonBlocking") } @@ -183,27 +183,27 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { } } - err = addAccountsToStateVerifier(verifier, historyQ, accounts) + err = addAccountsToStateVerifier(s.ctx, verifier, historyQ, accounts) if err != nil { return errors.Wrap(err, "addAccountsToStateVerifier failed") } - err = addDataToStateVerifier(verifier, historyQ, data) + err = addDataToStateVerifier(s.ctx, verifier, historyQ, data) if err != nil { return errors.Wrap(err, "addDataToStateVerifier failed") } - err = addOffersToStateVerifier(verifier, historyQ, offers) + err = addOffersToStateVerifier(s.ctx, verifier, historyQ, offers) if err != nil { return errors.Wrap(err, "addOffersToStateVerifier failed") } - err = addTrustLinesToStateVerifier(verifier, assetStats, historyQ, trustLines) + err = addTrustLinesToStateVerifier(s.ctx, verifier, assetStats, historyQ, trustLines) if err != nil { return errors.Wrap(err, "addTrustLinesToStateVerifier failed") } - err = addClaimableBalanceToStateVerifier(verifier, assetStats, historyQ, cBalances) + err = addClaimableBalanceToStateVerifier(s.ctx, verifier, assetStats, historyQ, cBalances) if err != nil { return errors.Wrap(err, "addClaimableBalanceToStateVerifier failed") } @@ -214,27 +214,27 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { localLog.WithField("total", total).Info("Finished writing to StateVerifier") - countAccounts, err := historyQ.CountAccounts() + countAccounts, err := historyQ.CountAccounts(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.CountAccounts") } - countData, err := historyQ.CountAccountsData() + countData, err := historyQ.CountAccountsData(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.CountData") } - countOffers, err := historyQ.CountOffers() + countOffers, err := historyQ.CountOffers(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.CountOffers") } - countTrustLines, err := historyQ.CountTrustLines() + countTrustLines, err := historyQ.CountTrustLines(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.CountTrustLines") } - countClaimableBalances, err := historyQ.CountClaimableBalances() + countClaimableBalances, err := historyQ.CountClaimableBalances(s.ctx) if err != nil { return errors.Wrap(err, "Error running historyQ.CountClaimableBalances") } @@ -244,7 +244,7 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { return errors.Wrap(err, "verifier.Verify failed") } - err = checkAssetStats(assetStats, historyQ) + err = checkAssetStats(s.ctx, assetStats, historyQ) if err != nil { return errors.Wrap(err, "checkAssetStats failed") } @@ -254,14 +254,14 @@ func (s *system) verifyState(verifyAgainstLatestCheckpoint bool) error { return nil } -func checkAssetStats(set processors.AssetStatSet, q history.IngestionQ) error { +func checkAssetStats(ctx context.Context, set processors.AssetStatSet, q history.IngestionQ) error { page := db2.PageQuery{ Order: "asc", Limit: assetStatsBatchSize, } for { - assetStats, err := q.GetAssetStats("", "", page) + assetStats, err := q.GetAssetStats(ctx, "", "", page) if err != nil { return errors.Wrap(err, "could not fetch asset stats from db") } @@ -304,17 +304,17 @@ func checkAssetStats(set processors.AssetStatSet, q history.IngestionQ) error { return nil } -func addAccountsToStateVerifier(verifier *verify.StateVerifier, q history.IngestionQ, ids []string) error { +func addAccountsToStateVerifier(ctx context.Context, verifier *verify.StateVerifier, q history.IngestionQ, ids []string) error { if len(ids) == 0 { return nil } - accounts, err := q.GetAccountsByIDs(ids) + accounts, err := q.GetAccountsByIDs(ctx, ids) if err != nil { return errors.Wrap(err, "Error running history.Q.GetAccountsByIDs") } - signers, err := q.SignersForAccounts(ids) + signers, err := q.SignersForAccounts(ctx, ids) if err != nil { return errors.Wrap(err, "Error running history.Q.SignersForAccounts") } @@ -420,12 +420,12 @@ func addAccountsToStateVerifier(verifier *verify.StateVerifier, q history.Ingest return nil } -func addDataToStateVerifier(verifier *verify.StateVerifier, q history.IngestionQ, keys []xdr.LedgerKeyData) error { +func addDataToStateVerifier(ctx context.Context, verifier *verify.StateVerifier, q history.IngestionQ, keys []xdr.LedgerKeyData) error { if len(keys) == 0 { return nil } - data, err := q.GetAccountDataByKeys(keys) + data, err := q.GetAccountDataByKeys(ctx, keys) if err != nil { return errors.Wrap(err, "Error running history.Q.GetAccountDataByKeys") } @@ -453,6 +453,7 @@ func addDataToStateVerifier(verifier *verify.StateVerifier, q history.IngestionQ } func addOffersToStateVerifier( + ctx context.Context, verifier *verify.StateVerifier, q history.IngestionQ, ids []int64, @@ -461,7 +462,7 @@ func addOffersToStateVerifier( return nil } - offers, err := q.GetOffersByIDs(ids) + offers, err := q.GetOffersByIDs(ctx, ids) if err != nil { return errors.Wrap(err, "Error running history.Q.GetOfferByIDs") } @@ -496,6 +497,7 @@ func addOffersToStateVerifier( } func addTrustLinesToStateVerifier( + ctx context.Context, verifier *verify.StateVerifier, assetStats processors.AssetStatSet, q history.IngestionQ, @@ -505,7 +507,7 @@ func addTrustLinesToStateVerifier( return nil } - trustLines, err := q.GetTrustLinesByKeys(keys) + trustLines, err := q.GetTrustLinesByKeys(ctx, keys) if err != nil { return errors.Wrap(err, "Error running history.Q.GetTrustLinesByKeys") } @@ -558,6 +560,7 @@ func addTrustLinesToStateVerifier( } func addClaimableBalanceToStateVerifier( + ctx context.Context, verifier *verify.StateVerifier, assetStats processors.AssetStatSet, q history.IngestionQ, @@ -567,7 +570,7 @@ func addClaimableBalanceToStateVerifier( return nil } - cBalances, err := q.GetClaimableBalancesByID(ids) + cBalances, err := q.GetClaimableBalancesByID(ctx, ids) if err != nil { return errors.Wrap(err, "Error running history.Q.GetClaimableBalancesByID") } diff --git a/services/horizon/internal/ingest/verify_range_state_test.go b/services/horizon/internal/ingest/verify_range_state_test.go index 55c90fae86..5eb763e992 100644 --- a/services/horizon/internal/ingest/verify_range_state_test.go +++ b/services/horizon/internal/ingest/verify_range_state_test.go @@ -30,6 +30,7 @@ func TestVerifyRangeStateTestSuite(t *testing.T) { type VerifyRangeStateTestSuite struct { suite.Suite + ctx context.Context ledgerBackend *ledgerbackend.MockDatabaseBackend historyQ *mockDBQ historyAdapter *mockHistoryArchiveAdapter @@ -38,12 +39,13 @@ type VerifyRangeStateTestSuite struct { } func (s *VerifyRangeStateTestSuite) SetupTest() { + s.ctx = context.Background() s.ledgerBackend = &ledgerbackend.MockDatabaseBackend{} s.historyQ = &mockDBQ{} s.historyAdapter = &mockHistoryArchiveAdapter{} s.runner = &mockProcessorsRunner{} s.system = &system{ - ctx: context.Background(), + ctx: s.ctx, historyQ: s.historyQ, historyAdapter: s.historyAdapter, ledgerBackend: s.ledgerBackend, @@ -52,7 +54,7 @@ func (s *VerifyRangeStateTestSuite) SetupTest() { } s.system.initMetrics() - s.historyQ.On("Rollback").Return(nil).Once() + s.historyQ.On("Rollback", s.ctx).Return(nil).Once() } func (s *VerifyRangeStateTestSuite) TearDownTest() { @@ -102,7 +104,7 @@ func (s *VerifyRangeStateTestSuite) TestInvalidRange() { func (s *VerifyRangeStateTestSuite) TestBeginReturnsError() { // Recreate mock in this single test to remove Rollback assertion. *s.historyQ = mockDBQ{} - s.historyQ.On("Begin").Return(errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(errors.New("my error")).Once() next, err := verifyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -114,8 +116,8 @@ func (s *VerifyRangeStateTestSuite) TestBeginReturnsError() { } func (s *VerifyRangeStateTestSuite) TestGetLastLedgerIngestReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), errors.New("my error")).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), errors.New("my error")).Once() next, err := verifyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -127,8 +129,8 @@ func (s *VerifyRangeStateTestSuite) TestGetLastLedgerIngestReturnsError() { } func (s *VerifyRangeStateTestSuite) TestGetLastLedgerIngestNonEmpty() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(100), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(100), nil).Once() next, err := verifyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -140,8 +142,8 @@ func (s *VerifyRangeStateTestSuite) TestGetLastLedgerIngestNonEmpty() { } func (s *VerifyRangeStateTestSuite) TestRunHistoryArchiveIngestionReturnsError() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -168,8 +170,8 @@ func (s *VerifyRangeStateTestSuite) TestRunHistoryArchiveIngestionReturnsError() } func (s *VerifyRangeStateTestSuite) TestSuccess() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -186,11 +188,11 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() s.runner.On("RunHistoryArchiveIngestion", uint32(100), MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}).Return(ingest.StatsChangeProcessorResults{}, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(100)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(100)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() for i := uint32(101); i <= 200; i++ { - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -210,8 +212,8 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", i).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, i).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() } next, err := verifyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) @@ -223,8 +225,8 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { } func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { - s.historyQ.On("Begin").Return(nil).Once() - s.historyQ.On("GetLastLedgerIngest").Return(uint32(0), nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() + s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 110)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ @@ -241,11 +243,11 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() s.runner.On("RunHistoryArchiveIngestion", uint32(100), MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}).Return(ingest.StatsChangeProcessorResults{}, nil).Once() - s.historyQ.On("UpdateLastLedgerIngest", uint32(100)).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(100)).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() for i := uint32(101); i <= 110; i++ { - s.historyQ.On("Begin").Return(nil).Once() + s.historyQ.On("Begin", s.ctx).Return(nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -265,20 +267,20 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { processorsRunDurations{}, nil, ).Once() - s.historyQ.On("UpdateLastLedgerIngest", i).Return(nil).Once() - s.historyQ.On("Commit").Return(nil).Once() + s.historyQ.On("UpdateLastLedgerIngest", s.ctx, i).Return(nil).Once() + s.historyQ.On("Commit", s.ctx).Return(nil).Once() } clonedQ := &mockDBQ{} s.historyQ.On("CloneIngestionQ").Return(clonedQ).Once() - clonedQ.On("BeginTx", mock.Anything).Run(func(args mock.Arguments) { - arg := args.Get(0).(*sql.TxOptions) + clonedQ.On("BeginTx", s.ctx, mock.AnythingOfType("*sql.TxOptions")).Run(func(args mock.Arguments) { + arg := args.Get(1).(*sql.TxOptions) s.Assert().Equal(sql.LevelRepeatableRead, arg.Isolation) s.Assert().True(arg.ReadOnly) }).Return(nil).Once() - clonedQ.On("Rollback").Return(nil).Once() - clonedQ.On("GetLastLedgerIngestNonBlocking").Return(uint32(63), nil).Once() + clonedQ.On("Rollback", s.ctx).Return(nil).Once() + clonedQ.On("GetLastLedgerIngestNonBlocking", s.ctx).Return(uint32(63), nil).Once() mockChangeReader := &ingest.MockChangeReader{} mockChangeReader.On("Close").Return(nil).Once() mockAccountID := "GACMZD5VJXTRLKVET72CETCYKELPNCOTTBDC6DHFEUPLG5DHEK534JQX" @@ -422,7 +424,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { mockChangeReader.On("Read").Return(claimableBalanceChange, nil).Once() mockChangeReader.On("Read").Return(ingest.Change{}, io.EOF).Once() mockChangeReader.On("Read").Return(ingest.Change{}, io.EOF).Once() - s.historyAdapter.On("GetState", mock.AnythingOfType("*context.emptyCtx"), uint32(63)).Return(mockChangeReader, nil).Once() + s.historyAdapter.On("GetState", s.ctx, uint32(63)).Return(mockChangeReader, nil).Once() mockAccount := history.AccountEntry{ AccountID: mockAccountID, Balance: 600, @@ -435,8 +437,8 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { Sponsor: null.StringFrom("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), } - clonedQ.MockQAccounts.On("GetAccountsByIDs", []string{mockAccountID}).Return([]history.AccountEntry{mockAccount}, nil).Once() - clonedQ.MockQSigners.On("SignersForAccounts", []string{mockAccountID}).Return([]history.AccountSigner{ + clonedQ.MockQAccounts.On("GetAccountsByIDs", s.ctx, []string{mockAccountID}).Return([]history.AccountEntry{mockAccount}, nil).Once() + clonedQ.MockQSigners.On("SignersForAccounts", s.ctx, []string{mockAccountID}).Return([]history.AccountSigner{ { Account: mockAccountID, Signer: mockAccountID, @@ -460,7 +462,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { Sponsor: null.StringFrom(mockAccountID), }, }, nil).Once() - clonedQ.MockQSigners.On("CountAccounts").Return(1, nil).Once() + clonedQ.MockQSigners.On("CountAccounts", s.ctx).Return(1, nil).Once() mockOffer := history.Offer{ SellerID: eurOffer.SellerId.Address(), OfferID: int64(eurOffer.OfferId), @@ -474,19 +476,19 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { LastModifiedLedger: 62, Sponsor: null.StringFrom("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), } - clonedQ.MockQOffers.On("GetOffersByIDs", []int64{int64(eurOffer.OfferId)}).Return([]history.Offer{mockOffer}, nil).Once() - clonedQ.MockQOffers.On("CountOffers").Return(1, nil).Once() + clonedQ.MockQOffers.On("GetOffersByIDs", s.ctx, []int64{int64(eurOffer.OfferId)}).Return([]history.Offer{mockOffer}, nil).Once() + clonedQ.MockQOffers.On("CountOffers", s.ctx).Return(1, nil).Once() // TODO: add accounts data, trustlines and asset stats - clonedQ.MockQData.On("CountAccountsData").Return(0, nil).Once() - clonedQ.MockQAssetStats.On("CountTrustLines").Return(0, nil).Once() - clonedQ.MockQAssetStats.On("GetAssetStats", "", "", db2.PageQuery{ + clonedQ.MockQData.On("CountAccountsData", s.ctx).Return(0, nil).Once() + clonedQ.MockQAssetStats.On("CountTrustLines", s.ctx).Return(0, nil).Once() + clonedQ.MockQAssetStats.On("GetAssetStats", s.ctx, "", "", db2.PageQuery{ Order: "asc", Limit: assetStatsBatchSize, }).Return([]history.ExpAssetStat{}, nil).Once() - clonedQ.MockQClaimableBalances.On("CountClaimableBalances").Return(1, nil).Once() + clonedQ.MockQClaimableBalances.On("CountClaimableBalances", s.ctx).Return(1, nil).Once() clonedQ.MockQClaimableBalances. - On("GetClaimableBalancesByID", []xdr.ClaimableBalanceId{claimableBalanceChange.Post.Data.ClaimableBalance.BalanceId}). + On("GetClaimableBalancesByID", s.ctx, []xdr.ClaimableBalanceId{claimableBalanceChange.Post.Data.ClaimableBalance.BalanceId}). Return([]history.ClaimableBalance{claimableBalance}, nil).Once() next, err := verifyRangeState{ @@ -535,19 +537,19 @@ func (s *VerifyRangeStateTestSuite) TestVerifyFailsWhenAssetStatsMismatch() { NumAccounts: 0, } - s.historyQ.MockQAssetStats.On("GetAssetStats", "", "", db2.PageQuery{ + s.historyQ.MockQAssetStats.On("GetAssetStats", s.ctx, "", "", db2.PageQuery{ Order: "asc", Limit: assetStatsBatchSize, }).Return([]history.ExpAssetStat{stat}, nil).Once() - s.historyQ.MockQAssetStats.On("GetAssetStats", "", "", db2.PageQuery{ + s.historyQ.MockQAssetStats.On("GetAssetStats", s.ctx, "", "", db2.PageQuery{ Cursor: stat.PagingToken(), Order: "asc", Limit: assetStatsBatchSize, }).Return([]history.ExpAssetStat{}, nil).Once() - err := checkAssetStats(set, s.historyQ) + err := checkAssetStats(s.ctx, set, s.historyQ) s.Assert().EqualError(err, fmt.Sprintf("db asset stat with code EUR issuer %s does not match asset stat from HAS", trustLineIssuer.Address())) // Satisfy the mock - s.historyQ.Rollback() + s.historyQ.Rollback(s.ctx) } diff --git a/services/horizon/internal/init.go b/services/horizon/internal/init.go index db6a87573b..bc9a5056bd 100644 --- a/services/horizon/internal/init.go +++ b/services/horizon/internal/init.go @@ -88,7 +88,7 @@ func initIngester(app *App) { func initPathFinder(app *App) { orderBookGraph := orderbook.NewOrderBookGraph() app.orderBookStream = ingest.NewOrderBookStream( - &history.Q{app.HorizonSession(app.ctx)}, + &history.Q{app.HorizonSession()}, orderBookGraph, ) @@ -304,7 +304,7 @@ func initSubmissionSystem(app *App) { Submitter: txsub.NewDefaultSubmitter(http.DefaultClient, app.config.StellarCoreURL), SubmissionQueue: sequence.NewManager(), DB: func(ctx context.Context) txsub.HorizonDB { - return &history.Q{Session: app.HorizonSession(ctx)} + return &history.Q{Session: app.HorizonSession()} }, } } diff --git a/services/horizon/internal/middleware_test.go b/services/horizon/internal/middleware_test.go index ecae31a138..c7c1e92142 100644 --- a/services/horizon/internal/middleware_test.go +++ b/services/horizon/internal/middleware_test.go @@ -3,6 +3,7 @@ package horizon import ( + "context" "net/http" "net/http/httptest" "strconv" @@ -270,8 +271,8 @@ func TestStateMiddleware(t *testing.T) { } { t.Run(testCase.name, func(t *testing.T) { stateMiddleware.NoStateVerification = testCase.noStateVerification - tt.Assert.NoError(q.UpdateExpStateInvalid(testCase.stateInvalid)) - _, err = q.InsertLedger(xdr.LedgerHeaderHistoryEntry{ + tt.Assert.NoError(q.UpdateExpStateInvalid(context.Background(), testCase.stateInvalid)) + _, err = q.InsertLedger(context.Background(), xdr.LedgerHeaderHistoryEntry{ Hash: xdr.Hash{byte(i)}, Header: xdr.LedgerHeader{ LedgerSeq: testCase.latestHistoryLedger, @@ -279,8 +280,8 @@ func TestStateMiddleware(t *testing.T) { }, }, 0, 0, 0, 0, 0) tt.Assert.NoError(err) - tt.Assert.NoError(q.UpdateLastLedgerIngest(testCase.lastIngestedLedger)) - tt.Assert.NoError(q.UpdateIngestVersion(testCase.ingestionVersion)) + tt.Assert.NoError(q.UpdateLastLedgerIngest(context.Background(), testCase.lastIngestedLedger)) + tt.Assert.NoError(q.UpdateIngestVersion(context.Background(), testCase.ingestionVersion)) if testCase.sseRequest { request.Header.Set("Accept", "text/event-stream") diff --git a/services/horizon/internal/reap/system.go b/services/horizon/internal/reap/system.go index 25127bdea3..66c695ddf2 100644 --- a/services/horizon/internal/reap/system.go +++ b/services/horizon/internal/reap/system.go @@ -1,6 +1,7 @@ package reap import ( + "context" "time" "github.com/stellar/go/services/horizon/internal/errors" @@ -9,7 +10,7 @@ import ( ) // DeleteUnretainedHistory removes all data associated with unretained ledgers. -func (r *System) DeleteUnretainedHistory() error { +func (r *System) DeleteUnretainedHistory(ctx context.Context) error { // RetentionCount of 0 indicates "keep all history" if r.RetentionCount == 0 { return nil @@ -24,7 +25,7 @@ func (r *System) DeleteUnretainedHistory() error { return nil } - err := r.clearBefore(targetElder) + err := r.clearBefore(ctx, targetElder) if err != nil { return err } @@ -38,16 +39,16 @@ func (r *System) DeleteUnretainedHistory() error { // Tick triggers the reaper system to update itself, deleted unretained history // if it is the appropriate time. -func (r *System) Tick() { +func (r *System) Tick(ctx context.Context) { if time.Now().Before(r.nextRun) { return } - r.runOnce() + r.runOnce(ctx) r.nextRun = time.Now().Add(1 * time.Hour) } -func (r *System) runOnce() { +func (r *System) runOnce(ctx context.Context) { defer func() { if rec := recover(); rec != nil { err := errors.FromPanic(rec) @@ -56,13 +57,13 @@ func (r *System) runOnce() { } }() - err := r.DeleteUnretainedHistory() + err := r.DeleteUnretainedHistory(ctx) if err != nil { log.Errorf("reaper failed: %s", err) } } -func (r *System) clearBefore(seq int32) error { +func (r *System) clearBefore(ctx context.Context, seq int32) error { log.WithField("new_elder", seq).Info("reaper: clearing") start, end, err := toid.LedgerRangeInclusive(1, seq-1) @@ -70,7 +71,7 @@ func (r *System) clearBefore(seq int32) error { return err } - err = r.HistoryQ.DeleteRangeAll(start, end) + err = r.HistoryQ.DeleteRangeAll(ctx, start, end) if err != nil { return err } diff --git a/services/horizon/internal/reap/system_test.go b/services/horizon/internal/reap/system_test.go index c5a081d719..695a5ea3dc 100644 --- a/services/horizon/internal/reap/system_test.go +++ b/services/horizon/internal/reap/system_test.go @@ -21,30 +21,30 @@ func TestDeleteUnretainedHistory(t *testing.T) { prev int cur int ) - err := db.GetRaw(&prev, `SELECT COUNT(*) FROM history_ledgers`) + err := db.GetRaw(tt.Ctx, &prev, `SELECT COUNT(*) FROM history_ledgers`) tt.Require.NoError(err) - err = sys.DeleteUnretainedHistory() + err = sys.DeleteUnretainedHistory(tt.Ctx) if tt.Assert.NoError(err) { - err = db.GetRaw(&cur, `SELECT COUNT(*) FROM history_ledgers`) + err = db.GetRaw(tt.Ctx, &cur, `SELECT COUNT(*) FROM history_ledgers`) tt.Require.NoError(err) tt.Assert.Equal(prev, cur, "Ledgers deleted when RetentionCount == 0") } ledgerState.SetStatus(tt.LoadLedgerStatus()) sys.RetentionCount = 10 - err = sys.DeleteUnretainedHistory() + err = sys.DeleteUnretainedHistory(tt.Ctx) if tt.Assert.NoError(err) { - err = db.GetRaw(&cur, `SELECT COUNT(*) FROM history_ledgers`) + err = db.GetRaw(tt.Ctx, &cur, `SELECT COUNT(*) FROM history_ledgers`) tt.Require.NoError(err) tt.Assert.Equal(10, cur) } ledgerState.SetStatus(tt.LoadLedgerStatus()) sys.RetentionCount = 1 - err = sys.DeleteUnretainedHistory() + err = sys.DeleteUnretainedHistory(tt.Ctx) if tt.Assert.NoError(err) { - err = db.GetRaw(&cur, `SELECT COUNT(*) FROM history_ledgers`) + err = db.GetRaw(tt.Ctx, &cur, `SELECT COUNT(*) FROM history_ledgers`) tt.Require.NoError(err) tt.Assert.Equal(1, cur) } diff --git a/services/horizon/internal/test/t.go b/services/horizon/internal/test/t.go index 1c80c85ab0..d1992bd142 100644 --- a/services/horizon/internal/test/t.go +++ b/services/horizon/internal/test/t.go @@ -18,8 +18,7 @@ import ( // CoreSession returns a db.Session instance pointing at the stellar core test database func (t *T) CoreSession() *db.Session { return &db.Session{ - DB: t.CoreDB, - Ctx: t.Ctx, + DB: t.CoreDB, } } @@ -38,8 +37,7 @@ func (t *T) Finish() { // database func (t *T) HorizonSession() *db.Session { return &db.Session{ - DB: t.HorizonDB, - Ctx: t.Ctx, + DB: t.HorizonDB, } } @@ -137,7 +135,7 @@ func (t *T) UnmarshalExtras(r io.Reader) map[string]string { func (t *T) LoadLedgerStatus() ledger.Status { var next ledger.Status - err := t.CoreSession().GetRaw(&next, ` + err := t.CoreSession().GetRaw(t.Ctx, &next, ` SELECT COALESCE(MAX(ledgerseq), 0) as core_latest FROM ledgerheaders @@ -147,7 +145,7 @@ func (t *T) LoadLedgerStatus() ledger.Status { panic(err) } - err = t.HorizonSession().GetRaw(&next, ` + err = t.HorizonSession().GetRaw(t.Ctx, &next, ` SELECT COALESCE(MIN(sequence), 0) as history_elder, COALESCE(MAX(sequence), 0) as history_latest diff --git a/services/horizon/internal/test/trades/main.go b/services/horizon/internal/test/trades/main.go index 5a07624024..111ad0414c 100644 --- a/services/horizon/internal/test/trades/main.go +++ b/services/horizon/internal/test/trades/main.go @@ -2,6 +2,8 @@ package trades import ( + "context" + "github.com/stellar/go/keypair" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/time" @@ -49,17 +51,18 @@ func IngestTestTrade( D: xdr.Int32(amountSold), } - accounts, err := q.CreateAccounts([]string{seller.Address(), buyer.Address()}, 2) + ctx := context.Background() + accounts, err := q.CreateAccounts(ctx, []string{seller.Address(), buyer.Address()}, 2) if err != nil { return err } - assets, err := q.CreateAssets([]xdr.Asset{assetBought, assetSold}, 2) + assets, err := q.CreateAssets(ctx, []xdr.Asset{assetBought, assetSold}, 2) if err != nil { return err } batch := q.NewTradeBatchInsertBuilder(0) - batch.Add(history.InsertTrade{ + batch.Add(ctx, history.InsertTrade{ HistoryOperationID: opCounter, Order: 0, BuyOfferExists: false, @@ -72,7 +75,7 @@ func IngestTestTrade( BuyerAccountID: accounts[buyer.Address()], SellerAccountID: accounts[seller.Address()], }) - return batch.Exec() + return batch.Exec(ctx) } //PopulateTestTrades generates and ingests trades between two assets according to given parameters diff --git a/services/horizon/internal/txsub/helpers_test.go b/services/horizon/internal/txsub/helpers_test.go index 3483ca28cb..e73ed4be1d 100644 --- a/services/horizon/internal/txsub/helpers_test.go +++ b/services/horizon/internal/txsub/helpers_test.go @@ -28,13 +28,13 @@ type mockDBQ struct { mock.Mock } -func (m *mockDBQ) BeginTx(txOpts *sql.TxOptions) error { - args := m.Called(txOpts) +func (m *mockDBQ) BeginTx(ctx context.Context, txOpts *sql.TxOptions) error { + args := m.Called(ctx, txOpts) return args.Error(0) } -func (m *mockDBQ) Rollback() error { - args := m.Called() +func (m *mockDBQ) Rollback(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } @@ -43,12 +43,12 @@ func (m *mockDBQ) NoRows(err error) bool { return args.Bool(0) } -func (m *mockDBQ) GetSequenceNumbers(addresses []string) (map[string]uint64, error) { - args := m.Called(addresses) +func (m *mockDBQ) GetSequenceNumbers(ctx context.Context, addresses []string) (map[string]uint64, error) { + args := m.Called(ctx, addresses) return args.Get(0).(map[string]uint64), args.Error(1) } -func (m *mockDBQ) TransactionByHash(dest interface{}, hash string) error { - args := m.Called(dest, hash) +func (m *mockDBQ) TransactionByHash(ctx context.Context, dest interface{}, hash string) error { + args := m.Called(ctx, dest, hash) return args.Error(0) } diff --git a/services/horizon/internal/txsub/results.go b/services/horizon/internal/txsub/results.go index f8cb0099e0..844816700b 100644 --- a/services/horizon/internal/txsub/results.go +++ b/services/horizon/internal/txsub/results.go @@ -1,6 +1,7 @@ package txsub import ( + "context" "database/sql" "github.com/stellar/go/services/horizon/internal/db2/history" @@ -8,10 +9,10 @@ import ( "github.com/stellar/go/xdr" ) -func txResultByHash(db HorizonDB, hash string) (history.Transaction, error) { +func txResultByHash(ctx context.Context, db HorizonDB, hash string) (history.Transaction, error) { // query history database var hr history.Transaction - err := db.TransactionByHash(&hr, hash) + err := db.TransactionByHash(ctx, &hr, hash) if err == nil { return txResultFromHistory(hr) } @@ -45,20 +46,20 @@ func txResultFromHistory(tx history.Transaction) (history.Transaction, error) { // queries execute on different ledgers. In this case, txsub can mistakenly respond with a bad_seq error // because the first query occurs when the tx is not yet ingested and the second query occurs when the tx // is ingested. -func checkTxAlreadyExists(db HorizonDB, hash, sourceAddress string) (history.Transaction, uint64, error) { - err := db.BeginTx(&sql.TxOptions{ +func checkTxAlreadyExists(ctx context.Context, db HorizonDB, hash, sourceAddress string) (history.Transaction, uint64, error) { + err := db.BeginTx(ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }) if err != nil { return history.Transaction{}, 0, errors.Wrap(err, "cannot start repeatable read tx") } - defer db.Rollback() + defer db.Rollback(ctx) - tx, err := txResultByHash(db, hash) + tx, err := txResultByHash(ctx, db, hash) if err == ErrNoResults { var sequenceNumbers map[string]uint64 - sequenceNumbers, err = db.GetSequenceNumbers([]string{sourceAddress}) + sequenceNumbers, err = db.GetSequenceNumbers(ctx, []string{sourceAddress}) if err != nil { return tx, 0, errors.Wrapf(err, "cannot fetch sequence number for %v", sourceAddress) } diff --git a/services/horizon/internal/txsub/results_test.go b/services/horizon/internal/txsub/results_test.go index 2277245879..09e1ea5b18 100644 --- a/services/horizon/internal/txsub/results_test.go +++ b/services/horizon/internal/txsub/results_test.go @@ -13,7 +13,7 @@ func TestGetIngestedTx(t *testing.T) { defer tt.Finish() q := &history.Q{Session: tt.HorizonSession()} hash := "2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d" - tx, err := txResultByHash(q, hash) + tx, err := txResultByHash(tt.Ctx, q, hash) tt.Assert.NoError(err) tt.Assert.Equal(hash, tx.TransactionHash) } @@ -25,7 +25,7 @@ func TestGetMissingTx(t *testing.T) { q := &history.Q{Session: tt.HorizonSession()} hash := "adf1efb9fd253f53cbbe6230c131d2af19830328e52b610464652d67d2fb7195" - _, err := txResultByHash(q, hash) + _, err := txResultByHash(tt.Ctx, q, hash) tt.Assert.Equal(ErrNoResults, err) } @@ -36,6 +36,6 @@ func TestGetFailedTx(t *testing.T) { q := &history.Q{Session: tt.HorizonSession()} hash := "aa168f12124b7c196c0adaee7c73a64d37f99428cacb59a91ff389626845e7cf" - _, err := txResultByHash(q, hash) + _, err := txResultByHash(tt.Ctx, q, hash) tt.Assert.Equal("AAAAAAAAAGT/////AAAAAQAAAAAAAAAB/////gAAAAA=", err.(*FailedTransactionError).ResultXDR) } diff --git a/services/horizon/internal/txsub/system.go b/services/horizon/internal/txsub/system.go index 903931b47c..86b5fe3fc4 100644 --- a/services/horizon/internal/txsub/system.go +++ b/services/horizon/internal/txsub/system.go @@ -14,10 +14,10 @@ import ( ) type HorizonDB interface { - TransactionByHash(dest interface{}, hash string) error - GetSequenceNumbers(addresses []string) (map[string]uint64, error) - BeginTx(*sql.TxOptions) error - Rollback() error + TransactionByHash(ctx context.Context, dest interface{}, hash string) error + GetSequenceNumbers(ctx context.Context, addresses []string) (map[string]uint64, error) + BeginTx(context.Context, *sql.TxOptions) error + Rollback(context.Context) error NoRows(error) bool } @@ -98,7 +98,7 @@ func (sys *System) Submit( "tx": rawTx, }).Info("Processing transaction") - tx, sequenceNumber, err := checkTxAlreadyExists(db, hash, sourceAddress) + tx, sequenceNumber, err := checkTxAlreadyExists(ctx, db, hash, sourceAddress) if err == nil { sys.Log.Ctx(ctx).WithField("hash", hash).Info("Found submission result in a DB") sys.finish(ctx, hash, response, Result{Transaction: tx}) @@ -164,7 +164,7 @@ func (sys *System) Submit( } // If error is txBAD_SEQ, check for the result again - tx, err = txResultByHash(db, hash) + tx, err = txResultByHash(ctx, db, hash) if err == nil { // If the found use it as the result sys.finish(ctx, hash, response, Result{Transaction: tx}) @@ -187,7 +187,7 @@ func (sys *System) waitUntilAccountSequence(ctx context.Context, db HorizonDB, s defer timer.Stop() for { - sequenceNumbers, err := db.GetSequenceNumbers([]string{sourceAddress}) + sequenceNumbers, err := db.GetSequenceNumbers(ctx, []string{sourceAddress}) if err != nil { sys.Log.Ctx(ctx). WithError(err). @@ -287,15 +287,15 @@ func (sys *System) Tick(ctx context.Context) { Isolation: sql.LevelRepeatableRead, ReadOnly: true, } - if err := db.BeginTx(options); err != nil { + if err := db.BeginTx(ctx, options); err != nil { logger.WithError(err).Error("could not start repeatable read transaction for txsub tick") return } - defer db.Rollback() + defer db.Rollback(ctx) addys := sys.SubmissionQueue.Addresses() if len(addys) > 0 { - curSeq, err := db.GetSequenceNumbers(addys) + curSeq, err := db.GetSequenceNumbers(ctx, addys) if err != nil { logger.WithStack(err).Error(err) return @@ -305,7 +305,7 @@ func (sys *System) Tick(ctx context.Context) { } for _, hash := range sys.Pending.Pending(ctx) { - tx, err := txResultByHash(db, hash) + tx, err := txResultByHash(ctx, db, hash) if err == nil { logger.WithField("hash", hash).Debug("finishing open submission") diff --git a/services/horizon/internal/txsub/system_test.go b/services/horizon/internal/txsub/system_test.go index 96d0ed3b1a..145b5a4bf1 100644 --- a/services/horizon/internal/txsub/system_test.go +++ b/services/horizon/internal/txsub/system_test.go @@ -122,14 +122,14 @@ func (suite *SystemTestSuite) TearDownTest() { // Returns the result provided by the ResultProvider. func (suite *SystemTestSuite) TestSubmit_Basic() { - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Run(func(args mock.Arguments) { - ptr := args.Get(0).(*history.Transaction) + ptr := args.Get(1).(*history.Transaction) *ptr = suite.successTx.Transaction }). Return(nil).Once() @@ -157,15 +157,15 @@ func getMetricValue(metric prometheus.Metric) *dto.Metric { // Returns the error from submission if no result is found by hash and the suite.submitter returns an error. func (suite *SystemTestSuite) TestSubmit_NotFoundError() { - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 0}, nil). Once() @@ -187,23 +187,23 @@ func (suite *SystemTestSuite) TestSubmit_NotFoundError() { // If the error is bad_seq and the result at the transaction's sequence number is for the same hash, return result. func (suite *SystemTestSuite) TestSubmit_BadSeq() { suite.submitter.R = suite.badSeq - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 0}, nil). Once() - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 1}, nil). Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Run(func(args mock.Arguments) { - ptr := args.Get(0).(*history.Transaction) + ptr := args.Get(1).(*history.Transaction) *ptr = suite.successTx.Transaction }). Return(nil).Once() @@ -223,18 +223,18 @@ func (suite *SystemTestSuite) TestSubmit_BadSeq() { // If error is bad_seq and no result is found, return error. func (suite *SystemTestSuite) TestSubmit_BadSeqNotFound() { suite.submitter.R = suite.badSeq - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Twice() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Twice() - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 0}, nil). Times(3) - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 1}, nil). Once() @@ -255,15 +255,15 @@ func (suite *SystemTestSuite) TestSubmit_BadSeqNotFound() { // If no result found and no error submitting, add to open transaction list. func (suite *SystemTestSuite) TestSubmit_OpenTransactionList() { - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() - suite.db.On("GetSequenceNumbers", []string{suite.unmuxedSource.Address()}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{suite.unmuxedSource.Address()}). Return(map[string]uint64{suite.unmuxedSource.Address(): 0}, nil). Once() @@ -283,11 +283,11 @@ func (suite *SystemTestSuite) TestSubmit_OpenTransactionList() { // Tick should be a no-op if there are no open submissions. func (suite *SystemTestSuite) TestTick_Noop() { - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() + suite.db.On("Rollback", suite.ctx).Return(nil).Once() suite.system.Tick(suite.ctx) } @@ -298,15 +298,15 @@ func (suite *SystemTestSuite) TestTick_Noop() { // `sys.Sequences.Get(addys)` is delayed by 1 second. It allows to simulate two // calls to `Tick()` executed at the same time. func (suite *SystemTestSuite) TestTick_Deadlock() { - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() + suite.db.On("Rollback", suite.ctx).Return(nil).Once() // Start first Tick suite.system.SubmissionQueue.Push("address", 0) - suite.db.On("GetSequenceNumbers", []string{"address"}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{"address"}). Return(map[string]uint64{}, nil). Run(func(args mock.Arguments) { // Start second tick @@ -322,12 +322,12 @@ func (suite *SystemTestSuite) TestTick_FinishesTransactions() { l := make(chan Result, 1) suite.system.Pending.Add(suite.ctx, suite.successTx.Transaction.TransactionHash, l) - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() @@ -336,14 +336,14 @@ func (suite *SystemTestSuite) TestTick_FinishesTransactions() { assert.Equal(suite.T(), 0, len(l)) assert.Equal(suite.T(), 1, len(suite.system.Pending.Pending(suite.ctx))) - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Run(func(args mock.Arguments) { - ptr := args.Get(0).(*history.Transaction) + ptr := args.Get(1).(*history.Transaction) *ptr = suite.successTx.Transaction }). Return(nil).Once() @@ -374,15 +374,15 @@ func (suite *SystemTestSuite) TestTickFinishFeeBumpTransaction() { }, } - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, innerHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, innerHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() - suite.db.On("GetSequenceNumbers", []string{"GABQGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2MX"}). + suite.db.On("GetSequenceNumbers", suite.ctx, []string{"GABQGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2MX"}). Return(map[string]uint64{"GABQGAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2MX": 96}, nil). Once() @@ -390,14 +390,14 @@ func (suite *SystemTestSuite) TestTickFinishFeeBumpTransaction() { assert.Equal(suite.T(), 0, len(l)) assert.Equal(suite.T(), 1, len(suite.system.Pending.Pending(suite.ctx))) - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, innerHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, innerHash). Run(func(args mock.Arguments) { - ptr := args.Get(0).(*history.Transaction) + ptr := args.Get(1).(*history.Transaction) *ptr = feeBumpTx.Transaction }). Return(nil).Once() @@ -418,12 +418,12 @@ func (suite *SystemTestSuite) TestTick_RemovesStaleSubmissions() { suite.system.Pending.Add(suite.ctx, suite.successTx.Transaction.TransactionHash, l) <-time.After(101 * time.Millisecond) - suite.db.On("BeginTx", &sql.TxOptions{ + suite.db.On("BeginTx", suite.ctx, &sql.TxOptions{ Isolation: sql.LevelRepeatableRead, ReadOnly: true, }).Return(nil).Once() - suite.db.On("Rollback").Return(nil).Once() - suite.db.On("TransactionByHash", mock.Anything, suite.successTx.Transaction.TransactionHash). + suite.db.On("Rollback", suite.ctx).Return(nil).Once() + suite.db.On("TransactionByHash", suite.ctx, mock.Anything, suite.successTx.Transaction.TransactionHash). Return(sql.ErrNoRows).Once() suite.db.On("NoRows", sql.ErrNoRows).Return(true).Once() diff --git a/services/ticker/cmd/clean.go b/services/ticker/cmd/clean.go index 08bbbffd87..5582029bcb 100644 --- a/services/ticker/cmd/clean.go +++ b/services/ticker/cmd/clean.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "time" "github.com/lib/pq" @@ -45,7 +46,7 @@ var cmdCleanTrades = &cobra.Command{ now := time.Now() minDate := now.AddDate(0, 0, -DaysToKeep) Logger.Infof("Deleting trade entries older than %d days", DaysToKeep) - err = session.DeleteOldTrades(minDate) + err = session.DeleteOldTrades(context.Background(), minDate) if err != nil { Logger.Fatal("could not delete trade entries:", err) } diff --git a/services/ticker/cmd/generate.go b/services/ticker/cmd/generate.go index b726d78f54..75c8dfb49b 100644 --- a/services/ticker/cmd/generate.go +++ b/services/ticker/cmd/generate.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "github.com/lib/pq" "github.com/spf13/cobra" ticker "github.com/stellar/go/services/ticker/internal" @@ -74,7 +75,7 @@ var cmdGenerateAssetData = &cobra.Command{ } Logger.Infof("Starting asset data generation, outputting to: %s\n", AssetsOutFile) - err = ticker.GenerateAssetsFile(&session, Logger, AssetsOutFile) + err = ticker.GenerateAssetsFile(context.Background(), &session, Logger, AssetsOutFile) if err != nil { Logger.Fatal("could not generate asset data:", err) } diff --git a/services/ticker/cmd/ingest.go b/services/ticker/cmd/ingest.go index 17869319d3..4068a8d7f5 100644 --- a/services/ticker/cmd/ingest.go +++ b/services/ticker/cmd/ingest.go @@ -54,7 +54,8 @@ var cmdIngestAssets = &cobra.Command{ } defer session.DB.Close() - err = ticker.RefreshAssets(&session, Client, Logger) + ctx := context.Background() + err = ticker.RefreshAssets(ctx, &session, Client, Logger) if err != nil { Logger.Fatal("could not refresh asset database:", err) } @@ -76,20 +77,20 @@ var cmdIngestTrades = &cobra.Command{ } defer session.DB.Close() + ctx := context.Background() numDays := float32(BackfillHours) / 24.0 Logger.Infof( "Backfilling Trade data for the past %d hour(s) [%.2f days]\n", BackfillHours, numDays, ) - err = ticker.BackfillTrades(&session, Client, Logger, BackfillHours, 0) + err = ticker.BackfillTrades(ctx, &session, Client, Logger, BackfillHours, 0) if err != nil { Logger.Fatal("could not refresh trade database:", err) } if ShouldStream { Logger.Info("Streaming new data (this is a continuous process)") - ctx := context.Background() err = ticker.StreamTrades(ctx, &session, Client, Logger) if err != nil { Logger.Fatal("could not refresh trade database:", err) diff --git a/services/ticker/internal/actions_asset.go b/services/ticker/internal/actions_asset.go index 3106d8ab57..c34f8ad182 100644 --- a/services/ticker/internal/actions_asset.go +++ b/services/ticker/internal/actions_asset.go @@ -1,6 +1,7 @@ package ticker import ( + "context" "encoding/json" "strings" "time" @@ -13,7 +14,7 @@ import ( ) // RefreshAssets scrapes the most recent asset list and ingests then into the db. -func RefreshAssets(s *tickerdb.TickerSession, c *horizonclient.Client, l *hlog.Entry) (err error) { +func RefreshAssets(ctx context.Context, s *tickerdb.TickerSession, c *horizonclient.Client, l *hlog.Entry) (err error) { sc := scraper.ScraperConfig{ Client: c, Logger: l, @@ -28,14 +29,14 @@ func RefreshAssets(s *tickerdb.TickerSession, c *horizonclient.Client, l *hlog.E if dbIssuer.PublicKey == "" { dbIssuer.PublicKey = finalAsset.Issuer } - issuerID, err := s.InsertOrUpdateIssuer(&dbIssuer, []string{"public_key"}) + issuerID, err := s.InsertOrUpdateIssuer(ctx, &dbIssuer, []string{"public_key"}) if err != nil { l.Error("Error inserting issuer:", dbIssuer, err) continue } dbAsset := finalAssetToDBAsset(finalAsset, issuerID) - err = s.InsertOrUpdateAsset(&dbAsset, []string{"code", "issuer_account", "issuer_id"}) + err = s.InsertOrUpdateAsset(ctx, &dbAsset, []string{"code", "issuer_account", "issuer_id"}) if err != nil { l.Error("Error inserting asset:", dbAsset, err) } @@ -45,10 +46,10 @@ func RefreshAssets(s *tickerdb.TickerSession, c *horizonclient.Client, l *hlog.E } // GenerateAssetsFile generates a file with the info about all valid scraped Assets -func GenerateAssetsFile(s *tickerdb.TickerSession, l *hlog.Entry, filename string) error { +func GenerateAssetsFile(ctx context.Context, s *tickerdb.TickerSession, l *hlog.Entry, filename string) error { l.Infoln("Retrieving asset data from db...") var assets []Asset - validAssets, err := s.GetAssetsWithNestedIssuer() + validAssets, err := s.GetAssetsWithNestedIssuer(ctx) if err != nil { return err } diff --git a/services/ticker/internal/actions_market.go b/services/ticker/internal/actions_market.go index 933a1b4f94..c60f57be8a 100644 --- a/services/ticker/internal/actions_market.go +++ b/services/ticker/internal/actions_market.go @@ -1,6 +1,7 @@ package ticker import ( + "context" "encoding/json" "time" @@ -40,8 +41,9 @@ func GenerateMarketSummary(s *tickerdb.TickerSession) (ms MarketSummary, err err now := time.Now() nowMillis := utils.TimeToUnixEpoch(now) nowRFC339 := utils.TimeToRFC3339(now) + ctx := context.Background() - dbMarkets, err := s.RetrieveMarketData() + dbMarkets, err := s.RetrieveMarketData(ctx) if err != nil { return } diff --git a/services/ticker/internal/actions_orderbook.go b/services/ticker/internal/actions_orderbook.go index e68b6db88c..ab39d10a2e 100644 --- a/services/ticker/internal/actions_orderbook.go +++ b/services/ticker/internal/actions_orderbook.go @@ -1,6 +1,7 @@ package ticker import ( + "context" "time" horizonclient "github.com/stellar/go/clients/horizonclient" @@ -17,9 +18,10 @@ func RefreshOrderbookEntries(s *tickerdb.TickerSession, c *horizonclient.Client, Client: c, Logger: l, } + ctx := context.Background() // Retrieve relevant markets for the past 7 days (168 hours): - mkts, err := s.Retrieve7DRelevantMarkets() + mkts, err := s.Retrieve7DRelevantMarkets(ctx) if err != nil { return errors.Wrap(err, "could not retrieve partial markets") } @@ -39,7 +41,7 @@ func RefreshOrderbookEntries(s *tickerdb.TickerSession, c *horizonclient.Client, } dbOS := orderbookStatsToDBOrderbookStats(ob, mkt.BaseAssetID, mkt.CounterAssetID) - err = s.InsertOrUpdateOrderbookStats(&dbOS, []string{"base_asset_id", "counter_asset_id"}) + err = s.InsertOrUpdateOrderbookStats(ctx, &dbOS, []string{"base_asset_id", "counter_asset_id"}) if err != nil { l.Error(errors.Wrap(err, "could not insert orderbook stats into db")) continue @@ -60,7 +62,7 @@ func RefreshOrderbookEntries(s *tickerdb.TickerSession, c *horizonclient.Client, } dbIOS := orderbookStatsToDBOrderbookStats(iob, mkt.CounterAssetID, mkt.BaseAssetID) - err = s.InsertOrUpdateOrderbookStats(&dbIOS, []string{"base_asset_id", "counter_asset_id"}) + err = s.InsertOrUpdateOrderbookStats(ctx, &dbIOS, []string{"base_asset_id", "counter_asset_id"}) if err != nil { l.Error(errors.Wrap(err, "could not insert reverse orderbook stats into db")) } diff --git a/services/ticker/internal/actions_trade.go b/services/ticker/internal/actions_trade.go index 1e2ab885ad..abfefc3034 100644 --- a/services/ticker/internal/actions_trade.go +++ b/services/ticker/internal/actions_trade.go @@ -29,7 +29,7 @@ func StreamTrades( handler := func(trade hProtocol.Trade) { l.Infof("New trade arrived. ID: %v; Close Time: %v\n", trade.ID, trade.LedgerCloseTime) scraper.NormalizeTradeAssets(&trade) - bID, cID, err := findBaseAndCounter(s, trade) + bID, cID, err := findBaseAndCounter(ctx, s, trade) if err != nil { l.Errorln(err) return @@ -40,14 +40,14 @@ func StreamTrades( return } - err = s.BulkInsertTrades([]tickerdb.Trade{dbTrade}) + err = s.BulkInsertTrades(ctx, []tickerdb.Trade{dbTrade}) if err != nil { l.Errorln("Could not insert trade in database: ", trade.ID) } } // Ensure we start streaming from the last stored trade - lastTrade, err := s.GetLastTrade() + lastTrade, err := s.GetLastTrade(ctx) if err != nil { return err } @@ -59,6 +59,7 @@ func StreamTrades( // BackfillTrades ingest the most recent trades (limited to numDays) directly from Horizon // into the database. func BackfillTrades( + ctx context.Context, s *tickerdb.TickerSession, c *horizonclient.Client, l *hlog.Entry, @@ -80,7 +81,7 @@ func BackfillTrades( for _, trade := range trades { var bID, cID int32 - bID, cID, err = findBaseAndCounter(s, trade) + bID, cID, err = findBaseAndCounter(ctx, s, trade) if err != nil { continue } @@ -95,7 +96,7 @@ func BackfillTrades( } l.Infof("Inserting %d entries in the database.\n", len(dbTrades)) - err = s.BulkInsertTrades(dbTrades) + err = s.BulkInsertTrades(ctx, dbTrades) if err != nil { fmt.Println(err) } @@ -105,8 +106,9 @@ func BackfillTrades( // findBaseAndCounter tries to find the Base and Counter assets IDs in the database, // and returns an error if it doesn't find any. -func findBaseAndCounter(s *tickerdb.TickerSession, trade hProtocol.Trade) (bID int32, cID int32, err error) { +func findBaseAndCounter(ctx context.Context, s *tickerdb.TickerSession, trade hProtocol.Trade) (bID int32, cID int32, err error) { bFound, bID, err := s.GetAssetByCodeAndIssuerAccount( + ctx, trade.BaseAssetCode, trade.BaseAssetIssuer, ) @@ -115,6 +117,7 @@ func findBaseAndCounter(s *tickerdb.TickerSession, trade hProtocol.Trade) (bID i } cFound, cID, err := s.GetAssetByCodeAndIssuerAccount( + ctx, trade.CounterAssetCode, trade.CounterAssetIssuer, ) diff --git a/services/ticker/internal/gql/resolvers_asset.go b/services/ticker/internal/gql/resolvers_asset.go index 3428403747..a385220105 100644 --- a/services/ticker/internal/gql/resolvers_asset.go +++ b/services/ticker/internal/gql/resolvers_asset.go @@ -1,14 +1,15 @@ package gql import ( + "context" "errors" "github.com/stellar/go/services/ticker/internal/tickerdb" ) // Assets resolves the assets() GraphQL query. -func (r *resolver) Assets() (assets []*asset, err error) { - dbAssets, err := r.db.GetAllValidAssets() +func (r *resolver) Assets(ctx context.Context) (assets []*asset, err error) { + dbAssets, err := r.db.GetAllValidAssets(ctx) if err != nil { // obfuscating sql errors to avoid exposing underlying // implementation diff --git a/services/ticker/internal/gql/resolvers_issuer.go b/services/ticker/internal/gql/resolvers_issuer.go index 02f66dc6c2..15bca92e5d 100644 --- a/services/ticker/internal/gql/resolvers_issuer.go +++ b/services/ticker/internal/gql/resolvers_issuer.go @@ -1,14 +1,15 @@ package gql import ( + "context" "errors" "github.com/stellar/go/services/ticker/internal/tickerdb" ) // Issuers resolves the issuers() GraphQL query. -func (r *resolver) Issuers() (issuers []*tickerdb.Issuer, err error) { - dbIssuers, err := r.db.GetAllIssuers() +func (r *resolver) Issuers(ctx context.Context) (issuers []*tickerdb.Issuer, err error) { + dbIssuers, err := r.db.GetAllIssuers(ctx) if err != nil { // obfuscating sql errors to avoid exposing underlying // implementation diff --git a/services/ticker/internal/gql/resolvers_market.go b/services/ticker/internal/gql/resolvers_market.go index 6efcba3822..5712da9df2 100644 --- a/services/ticker/internal/gql/resolvers_market.go +++ b/services/ticker/internal/gql/resolvers_market.go @@ -1,6 +1,7 @@ package gql import ( + "context" "errors" "fmt" "strings" @@ -11,7 +12,7 @@ import ( ) // Markets resolves the markets() GraphQL query. -func (r *resolver) Markets(args struct { +func (r *resolver) Markets(ctx context.Context, args struct { BaseAssetCode *string BaseAssetIssuer *string CounterAssetCode *string @@ -28,7 +29,7 @@ func (r *resolver) Markets(args struct { pairName = fmt.Sprintf("%s:%s / %s:%s", *args.BaseAssetCode, *args.BaseAssetIssuer, *args.CounterAssetCode, *args.CounterAssetIssuer) } - dbMarkets, err := r.db.RetrievePartialMarkets( + dbMarkets, err := r.db.RetrievePartialMarkets(ctx, args.BaseAssetCode, args.BaseAssetIssuer, args.CounterAssetCode, @@ -57,7 +58,7 @@ func (r *resolver) Markets(args struct { } // Ticker resolves the ticker() GraphQL query (TODO) -func (r *resolver) Ticker( +func (r *resolver) Ticker(ctx context.Context, args struct { Code *string PairNames *[]*string @@ -74,7 +75,7 @@ func (r *resolver) Ticker( return } - dbMarkets, err := r.db.RetrievePartialAggMarkets(args.Code, args.PairNames, numHours) + dbMarkets, err := r.db.RetrievePartialAggMarkets(ctx, args.Code, args.PairNames, numHours) if err != nil { // obfuscating sql errors to avoid exposing underlying // implementation diff --git a/services/ticker/internal/tickerdb/helpers.go b/services/ticker/internal/tickerdb/helpers.go index ace6cf1b09..deebdc245a 100644 --- a/services/ticker/internal/tickerdb/helpers.go +++ b/services/ticker/internal/tickerdb/helpers.go @@ -1,6 +1,7 @@ package tickerdb import ( + "context" "errors" "fmt" "reflect" @@ -172,7 +173,7 @@ func orderBaseAndCounter( // performUpsertQuery introspects a dbStruct interface{} and performs an insert query // (if the conflictConstraint isn't broken), otherwise it updates the instance on the // db, preserving the old values for the fields in preserveFields -func (s *TickerSession) performUpsertQuery(dbStruct interface{}, tableName string, conflictConstraint string, preserveFields []string) error { +func (s *TickerSession) performUpsertQuery(ctx context.Context, dbStruct interface{}, tableName string, conflictConstraint string, preserveFields []string) error { dbFields := getDBFieldTags(dbStruct, true) dbFieldsString := strings.Join(dbFields, ", ") dbValues := getDBFieldValues(dbStruct, true) @@ -183,6 +184,6 @@ func (s *TickerSession) performUpsertQuery(dbStruct interface{}, tableName strin qs := fmt.Sprintf("INSERT INTO %s (", tableName) + dbFieldsString + ")" qs += " VALUES (" + generatePlaceholders(dbValues) + ")" qs += " " + createOnConflictFragment(conflictConstraint, toUpdateFields) + ";" - _, err := s.ExecRaw(qs, dbValues...) + _, err := s.ExecRaw(ctx, qs, dbValues...) return err } diff --git a/services/ticker/internal/tickerdb/main.go b/services/ticker/internal/tickerdb/main.go index 2f539a53de..369feec247 100644 --- a/services/ticker/internal/tickerdb/main.go +++ b/services/ticker/internal/tickerdb/main.go @@ -1,7 +1,6 @@ package tickerdb import ( - "context" "time" "github.com/jmoiron/sqlx" @@ -175,7 +174,6 @@ func CreateSession(driverName, dataSourceName string) (session TickerSession, er } session.DB = dbconn - session.Ctx = context.Background() return } diff --git a/services/ticker/internal/tickerdb/queries_asset.go b/services/ticker/internal/tickerdb/queries_asset.go index 5d4e636c32..a55e861ebb 100644 --- a/services/ticker/internal/tickerdb/queries_asset.go +++ b/services/ticker/internal/tickerdb/queries_asset.go @@ -1,14 +1,18 @@ package tickerdb +import ( + "context" +) + // InsertOrUpdateAsset inserts an Asset on the database (if new), // or updates an existing one -func (s *TickerSession) InsertOrUpdateAsset(a *Asset, preserveFields []string) (err error) { - return s.performUpsertQuery(*a, "assets", "assets_code_issuer_account", preserveFields) +func (s *TickerSession) InsertOrUpdateAsset(ctx context.Context, a *Asset, preserveFields []string) (err error) { + return s.performUpsertQuery(ctx, *a, "assets", "assets_code_issuer_account", preserveFields) } // GetAssetByCodeAndIssuerAccount searches for an Asset with the given code // and public key, and returns its ID in case it is found. -func (s *TickerSession) GetAssetByCodeAndIssuerAccount( +func (s *TickerSession) GetAssetByCodeAndIssuerAccount(ctx context.Context, code string, issuerAccount string, ) (found bool, id int32, err error) { @@ -20,7 +24,7 @@ func (s *TickerSession) GetAssetByCodeAndIssuerAccount( "assets.code = ? AND assets.issuer_account = ?", code, issuerAccount, - ).Exec() + ).Exec(ctx) if err != nil { return } @@ -34,20 +38,20 @@ func (s *TickerSession) GetAssetByCodeAndIssuerAccount( // GetAllValidAssets returns a slice with all assets in the database // with is_valid = true -func (s *TickerSession) GetAllValidAssets() (assets []Asset, err error) { +func (s *TickerSession) GetAllValidAssets(ctx context.Context) (assets []Asset, err error) { tbl := s.GetTable("assets") err = tbl.Select( &assets, "assets.is_valid = TRUE", - ).Exec() + ).Exec(ctx) return } // GetAssetsWithNestedIssuer returns a slice with all assets in the database // with is_valid = true, also adding the nested Issuer attribute -func (s *TickerSession) GetAssetsWithNestedIssuer() (assets []Asset, err error) { +func (s *TickerSession) GetAssetsWithNestedIssuer(ctx context.Context) (assets []Asset, err error) { const q = ` SELECT a.code, a.issuer_account, a.type, a.num_accounts, a.auth_required, a.auth_revocable, @@ -62,7 +66,7 @@ func (s *TickerSession) GetAssetsWithNestedIssuer() (assets []Asset, err error) WHERE a.is_valid = TRUE ` - rows, err := s.DB.Query(q) + rows, err := s.DB.QueryContext(ctx, q) if err != nil { return } diff --git a/services/ticker/internal/tickerdb/queries_issuer.go b/services/ticker/internal/tickerdb/queries_issuer.go index 072edb40d8..1b0d0f2d2c 100644 --- a/services/ticker/internal/tickerdb/queries_issuer.go +++ b/services/ticker/internal/tickerdb/queries_issuer.go @@ -1,6 +1,7 @@ package tickerdb import ( + "context" "strings" "github.com/stellar/go/services/ticker/internal/utils" @@ -8,7 +9,7 @@ import ( // InsertOrUpdateIssuer inserts an Issuer on the database (if new), // or updates an existing one -func (s *TickerSession) InsertOrUpdateIssuer(issuer *Issuer, preserveFields []string) (id int32, err error) { +func (s *TickerSession) InsertOrUpdateIssuer(ctx context.Context, issuer *Issuer, preserveFields []string) (id int32, err error) { dbFields := getDBFieldTags(*issuer, true) dbFieldsString := strings.Join(dbFields, ", ") dbValues := getDBFieldValues(*issuer, true) @@ -21,7 +22,7 @@ func (s *TickerSession) InsertOrUpdateIssuer(issuer *Issuer, preserveFields []st qs += " " + createOnConflictFragment("public_key_unique", toUpdateFields) qs += " RETURNING id;" - rows, err := s.QueryRaw(qs, dbValues...) + rows, err := s.QueryRaw(ctx, qs, dbValues...) if err != nil { return } @@ -33,7 +34,7 @@ func (s *TickerSession) InsertOrUpdateIssuer(issuer *Issuer, preserveFields []st } // GetAllIssuers returns a slice with all issuers in the database -func (s *TickerSession) GetAllIssuers() (issuers []Issuer, err error) { - err = s.SelectRaw(&issuers, "SELECT * FROM issuers") +func (s *TickerSession) GetAllIssuers(ctx context.Context) (issuers []Issuer, err error) { + err = s.SelectRaw(ctx, &issuers, "SELECT * FROM issuers") return } diff --git a/services/ticker/internal/tickerdb/queries_market.go b/services/ticker/internal/tickerdb/queries_market.go index 10d7b91142..7765ea59d5 100644 --- a/services/ticker/internal/tickerdb/queries_market.go +++ b/services/ticker/internal/tickerdb/queries_market.go @@ -1,6 +1,7 @@ package tickerdb import ( + "context" "errors" "fmt" "strings" @@ -8,14 +9,14 @@ import ( // RetrieveMarketData retrieves the 24h- and 7d aggregated market data for all // markets that were active during this period. -func (s *TickerSession) RetrieveMarketData() (markets []Market, err error) { - err = s.SelectRaw(&markets, marketQuery) +func (s *TickerSession) RetrieveMarketData(ctx context.Context) (markets []Market, err error) { + err = s.SelectRaw(ctx, &markets, marketQuery) return } // RetrievePartialAggMarkets retrieves the aggregated market data for all // markets (or for a specific one if PairNames != nil) for a given period. -func (s *TickerSession) RetrievePartialAggMarkets( +func (s *TickerSession) RetrievePartialAggMarkets(ctx context.Context, code *string, pairNames *[]*string, numHoursAgo int, @@ -56,7 +57,7 @@ func (s *TickerSession) RetrievePartialAggMarkets( argsInterface[i] = v } - err = s.SelectRaw(&partialMkts, q, argsInterface...) + err = s.SelectRaw(ctx, &partialMkts, q, argsInterface...) return } @@ -97,7 +98,7 @@ func (s *TickerSession) constructPartialAggMarketsWhere( // RetrievePartialMarkets retrieves data in the PartialMarket format from the database. // It optionally filters the data according to the provided base and counter asset params // provided, as well as the numHoursAgo time offset. -func (s *TickerSession) RetrievePartialMarkets( +func (s *TickerSession) RetrievePartialMarkets(ctx context.Context, baseAssetCode *string, baseAssetIssuer *string, counterAssetCode *string, @@ -133,13 +134,13 @@ func (s *TickerSession) RetrievePartialMarkets( for i, v := range args { argsInterface[i] = v } - err = s.SelectRaw(&partialMkts, q, argsInterface...) + err = s.SelectRaw(ctx, &partialMkts, q, argsInterface...) return } // Retrieve7DRelevantMarkets retrieves the base and counter asset data of the markets // that were relevant in the last 7-day period. -func (s *TickerSession) Retrieve7DRelevantMarkets() (partialMkts []PartialMarket, err error) { +func (s *TickerSession) Retrieve7DRelevantMarkets(ctx context.Context) (partialMkts []PartialMarket, err error) { q := ` SELECT ba.id as base_asset_id, ba.type AS base_asset_type, ba.code AS base_asset_code, ba.issuer_account AS base_asset_issuer, @@ -150,7 +151,7 @@ func (s *TickerSession) Retrieve7DRelevantMarkets() (partialMkts []PartialMarket WHERE ba.is_valid = TRUE AND ca.is_valid = TRUE AND t.ledger_close_time > now() - interval '7 days' GROUP BY ba.id, ba.type, ba.code, ba.issuer_account, ca.id, ca.type, ca.code, ca.issuer_account ` - err = s.SelectRaw(&partialMkts, q) + err = s.SelectRaw(ctx, &partialMkts, q) return } diff --git a/services/ticker/internal/tickerdb/queries_orderbook.go b/services/ticker/internal/tickerdb/queries_orderbook.go index e31dfee1c9..9b8bc5c855 100644 --- a/services/ticker/internal/tickerdb/queries_orderbook.go +++ b/services/ticker/internal/tickerdb/queries_orderbook.go @@ -1,7 +1,11 @@ package tickerdb +import ( + "context" +) + // InsertOrUpdateOrderbookStats inserts an OrdebookStats entry on the database (if new), // or updates an existing one -func (s *TickerSession) InsertOrUpdateOrderbookStats(o *OrderbookStats, preserveFields []string) (err error) { - return s.performUpsertQuery(*o, "orderbook_stats", "orderbook_stats_base_counter_asset_key", preserveFields) +func (s *TickerSession) InsertOrUpdateOrderbookStats(ctx context.Context, o *OrderbookStats, preserveFields []string) (err error) { + return s.performUpsertQuery(ctx, *o, "orderbook_stats", "orderbook_stats_base_counter_asset_key", preserveFields) } diff --git a/services/ticker/internal/tickerdb/queries_trade.go b/services/ticker/internal/tickerdb/queries_trade.go index d3cb5e2be8..8a5cc5db70 100644 --- a/services/ticker/internal/tickerdb/queries_trade.go +++ b/services/ticker/internal/tickerdb/queries_trade.go @@ -1,6 +1,7 @@ package tickerdb import ( + "context" "math" "strings" "time" @@ -9,14 +10,14 @@ import ( // BulkInsertTrades inserts a slice of trades in the database. Trades // that are already in the database (i.e. horizon_id already exists) // are ignored. -func (s *TickerSession) BulkInsertTrades(trades []Trade) (err error) { +func (s *TickerSession) BulkInsertTrades(ctx context.Context, trades []Trade) (err error) { if len(trades) <= 50 { - return performInsertTrades(s, trades) + return performInsertTrades(ctx, s, trades) } chunks := chunkifyDBTrades(trades, 50) for _, chunk := range chunks { - err = performInsertTrades(s, chunk) + err = performInsertTrades(ctx, s, chunk) if err != nil { return } @@ -26,14 +27,14 @@ func (s *TickerSession) BulkInsertTrades(trades []Trade) (err error) { } // GetLastTrade returns the newest Trade object in the database. -func (s *TickerSession) GetLastTrade() (trade Trade, err error) { - err = s.GetRaw(&trade, "SELECT * FROM trades ORDER BY ledger_close_time DESC LIMIT 1") +func (s *TickerSession) GetLastTrade(ctx context.Context) (trade Trade, err error) { + err = s.GetRaw(ctx, &trade, "SELECT * FROM trades ORDER BY ledger_close_time DESC LIMIT 1") return } // DeleteOldTrades deletes trades in the database older than minDate. -func (s *TickerSession) DeleteOldTrades(minDate time.Time) error { - _, err := s.ExecRaw("DELETE FROM trades WHERE ledger_close_time < ?", minDate) +func (s *TickerSession) DeleteOldTrades(ctx context.Context, minDate time.Time) error { + _, err := s.ExecRaw(ctx, "DELETE FROM trades WHERE ledger_close_time < ?", minDate) return err } @@ -61,7 +62,7 @@ func chunkifyDBTrades(sl []Trade, chunkSize int) [][]Trade { return chunkedSlice } -func performInsertTrades(s *TickerSession, trades []Trade) (err error) { +func performInsertTrades(ctx context.Context, s *TickerSession, trades []Trade) (err error) { var t Trade var placeholders string var dbValues []interface{} @@ -83,6 +84,6 @@ func performInsertTrades(s *TickerSession, trades []Trade) (err error) { qs += " VALUES " + placeholders qs += " ON CONFLICT ON CONSTRAINT trades_horizon_id_key DO NOTHING;" - _, err = s.ExecRaw(qs, dbValues...) + _, err = s.ExecRaw(ctx, qs, dbValues...) return } diff --git a/services/ticker/internal/tickerdb/tickerdb_test/queries_asset_test.go b/services/ticker/internal/tickerdb/tickerdb_test/queries_asset_test.go index 7888890a8b..323e9b1e59 100644 --- a/services/ticker/internal/tickerdb/tickerdb_test/queries_asset_test.go +++ b/services/ticker/internal/tickerdb/tickerdb_test/queries_asset_test.go @@ -19,8 +19,8 @@ func TestInsertOrUpdateAsset(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -41,10 +41,10 @@ func TestInsertOrUpdateAsset(t *testing.T) { Name: name, } tbl := session.GetTable("issuers") - _, err = tbl.Insert(issuer).IgnoreCols("id").Exec() + _, err = tbl.Insert(issuer).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var dbIssuer tickerdb.Issuer - err = session.GetRaw(&dbIssuer, ` + err = session.GetRaw(ctx, &dbIssuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -62,11 +62,11 @@ func TestInsertOrUpdateAsset(t *testing.T) { LastValid: firstTime, LastChecked: firstTime, } - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_account", "issuer_id"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_account", "issuer_id"}) require.NoError(t, err) var dbAsset1 tickerdb.Asset - err = session.GetRaw(&dbAsset1, ` + err = session.GetRaw(ctx, &dbAsset1, ` SELECT * FROM assets ORDER BY id DESC @@ -93,11 +93,11 @@ func TestInsertOrUpdateAsset(t *testing.T) { t.Log("secondTime:", secondTime) a.LastValid = secondTime a.LastChecked = secondTime - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_account", "issuer_id"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_account", "issuer_id"}) require.NoError(t, err) var dbAsset2 tickerdb.Asset - err = session.GetRaw(&dbAsset2, ` + err = session.GetRaw(ctx, &dbAsset2, ` SELECT * FROM assets ORDER BY id DESC @@ -128,10 +128,10 @@ func TestInsertOrUpdateAsset(t *testing.T) { t.Log("thirdTime:", thirdTime) a.LastValid = thirdTime a.LastChecked = thirdTime - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_id", "last_valid", "last_checked", "issuer_account"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_id", "last_valid", "last_checked", "issuer_account"}) require.NoError(t, err) var dbAsset3 tickerdb.Asset - err = session.GetRaw(&dbAsset3, ` + err = session.GetRaw(ctx, &dbAsset3, ` SELECT * FROM assets ORDER BY id DESC @@ -163,8 +163,8 @@ func TestGetAssetByCodeAndIssuerAccount(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -185,10 +185,10 @@ func TestGetAssetByCodeAndIssuerAccount(t *testing.T) { Name: name, } tbl := session.GetTable("issuers") - _, err = tbl.Insert(issuer).IgnoreCols("id").Exec() + _, err = tbl.Insert(issuer).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var dbIssuer tickerdb.Issuer - err = session.GetRaw(&dbIssuer, ` + err = session.GetRaw(ctx, &dbIssuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -205,11 +205,11 @@ func TestGetAssetByCodeAndIssuerAccount(t *testing.T) { LastValid: firstTime, LastChecked: firstTime, } - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_account", "issuer_id"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_account", "issuer_id"}) require.NoError(t, err) var dbAsset tickerdb.Asset - err = session.GetRaw(&dbAsset, ` + err = session.GetRaw(ctx, &dbAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -218,13 +218,13 @@ func TestGetAssetByCodeAndIssuerAccount(t *testing.T) { require.NoError(t, err) // Searching for an asset that exists: - found, id, err := session.GetAssetByCodeAndIssuerAccount(code, issuerAccount) + found, id, err := session.GetAssetByCodeAndIssuerAccount(ctx, code, issuerAccount) require.NoError(t, err) assert.Equal(t, dbAsset.ID, id) assert.True(t, found) // Now searching for an asset that does not exist: - found, _, err = session.GetAssetByCodeAndIssuerAccount( + found, _, err = session.GetAssetByCodeAndIssuerAccount(ctx, "NONEXISTENT CODE", issuerAccount, ) diff --git a/services/ticker/internal/tickerdb/tickerdb_test/queries_issuer_test.go b/services/ticker/internal/tickerdb/tickerdb_test/queries_issuer_test.go index 7c6a939ef4..66f88fbd35 100644 --- a/services/ticker/internal/tickerdb/tickerdb_test/queries_issuer_test.go +++ b/services/ticker/internal/tickerdb/tickerdb_test/queries_issuer_test.go @@ -18,8 +18,8 @@ func TestInsertOrUpdateIssuer(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -37,11 +37,11 @@ func TestInsertOrUpdateIssuer(t *testing.T) { PublicKey: publicKey, Name: name, } - id, err := session.InsertOrUpdateIssuer(&issuer, []string{"public_key"}) + id, err := session.InsertOrUpdateIssuer(ctx, &issuer, []string{"public_key"}) require.NoError(t, err) var dbIssuer tickerdb.Issuer - err = session.GetRaw(&dbIssuer, ` + err = session.GetRaw(ctx, &dbIssuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -57,11 +57,11 @@ func TestInsertOrUpdateIssuer(t *testing.T) { PublicKey: "ANOTHERKEY", Name: "Hello from the other side", } - id2, err := session.InsertOrUpdateIssuer(&issuer2, []string{"public_key"}) + id2, err := session.InsertOrUpdateIssuer(ctx, &issuer2, []string{"public_key"}) require.NoError(t, err) var dbIssuer2 tickerdb.Issuer - err = session.GetRaw(&dbIssuer2, ` + err = session.GetRaw(ctx, &dbIssuer2, ` SELECT * FROM issuers ORDER BY id DESC @@ -79,11 +79,11 @@ func TestInsertOrUpdateIssuer(t *testing.T) { PublicKey: publicKey, Name: name3, } - id, err = session.InsertOrUpdateIssuer(&issuer3, []string{"public_key"}) + id, err = session.InsertOrUpdateIssuer(ctx, &issuer3, []string{"public_key"}) require.NoError(t, err) var dbIssuer3 tickerdb.Issuer - err = session.GetRaw( + err = session.GetRaw(ctx, &dbIssuer3, "SELECT * FROM issuers WHERE id=?", id, diff --git a/services/ticker/internal/tickerdb/tickerdb_test/queries_market_test.go b/services/ticker/internal/tickerdb/tickerdb_test/queries_market_test.go index 7932ff08e3..599580f8aa 100644 --- a/services/ticker/internal/tickerdb/tickerdb_test/queries_market_test.go +++ b/services/ticker/internal/tickerdb/tickerdb_test/queries_market_test.go @@ -21,8 +21,8 @@ func TestRetrieveMarketData(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -37,10 +37,10 @@ func TestRetrieveMarketData(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -49,14 +49,14 @@ func TestRetrieveMarketData(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var xlmAsset tickerdb.Asset - err = session.GetRaw(&xlmAsset, ` + err = session.GetRaw(ctx, &xlmAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -65,14 +65,14 @@ func TestRetrieveMarketData(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var btcAsset tickerdb.Asset - err = session.GetRaw(&btcAsset, ` + err = session.GetRaw(ctx, &btcAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -81,14 +81,14 @@ func TestRetrieveMarketData(t *testing.T) { require.NoError(t, err) // Adding a third asset: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "ETH", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var ethAsset tickerdb.Asset - err = session.GetRaw(ðAsset, ` + err = session.GetRaw(ctx, ðAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -155,7 +155,7 @@ func TestRetrieveMarketData(t *testing.T) { LedgerCloseTime: oneMonthAgo, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) // Adding some orderbook stats: @@ -173,14 +173,14 @@ func TestRetrieveMarketData(t *testing.T) { SpreadMidPoint: 0.35, UpdatedAt: obTime, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obBTCETH1 tickerdb.OrderbookStats - err = session.GetRaw(&obBTCETH1, ` + err = session.GetRaw(ctx, &obBTCETH1, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -201,14 +201,14 @@ func TestRetrieveMarketData(t *testing.T) { SpreadMidPoint: 0.36, UpdatedAt: obTime, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obBTCETH2 tickerdb.OrderbookStats - err = session.GetRaw(&obBTCETH2, ` + err = session.GetRaw(ctx, &obBTCETH2, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -217,7 +217,7 @@ func TestRetrieveMarketData(t *testing.T) { require.NoError(t, err) assert.NotEqual(t, obBTCETH1.ID, obBTCETH2.ID) - markets, err := session.RetrieveMarketData() + markets, err := session.RetrieveMarketData(ctx) require.NoError(t, err) assert.Equal(t, 2, len(markets)) @@ -307,6 +307,7 @@ func TestRetrieveMarketData(t *testing.T) { func TestRetrievePartialMarkets(t *testing.T) { session := tickerdbtest.SetupTickerTestSession(t, "../migrations") defer session.DB.Close() + ctx := context.Background() issuer1PK := "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB" issuer2PK := "ABF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB" @@ -314,7 +315,7 @@ func TestRetrievePartialMarkets(t *testing.T) { tenMinutesAgo := now.Add(-10 * time.Minute) oneHourAgo := now.Add(-1 * time.Hour) - partialMkts, err := session.RetrievePartialMarkets( + partialMkts, err := session.RetrievePartialMarkets(ctx, nil, nil, nil, nil, 12, ) require.NoError(t, err) @@ -385,7 +386,7 @@ func TestRetrievePartialMarkets(t *testing.T) { assert.Equal(t, 0.70, btceth2Mkt.LowestAskReverse) // Now let's use the same data, but aggregating by asset pair - partialAggMkts, err := session.RetrievePartialAggMarkets(nil, nil, 12) + partialAggMkts, err := session.RetrievePartialAggMarkets(ctx, nil, nil, 12) require.NoError(t, err) assert.Equal(t, 2, len(partialAggMkts)) @@ -411,7 +412,7 @@ func TestRetrievePartialMarkets(t *testing.T) { // Validate the pair name parsing: pairNames := []*string{&btcEthStr} - partialAggMkts, err = session.RetrievePartialAggMarkets(nil, &pairNames, 12) + partialAggMkts, err = session.RetrievePartialAggMarkets(ctx, nil, &pairNames, 12) require.NoError(t, err) assert.Equal(t, 1, len(partialAggMkts)) assert.Equal(t, int32(3), partialAggMkts[0].TradeCount) @@ -433,7 +434,7 @@ func TestRetrievePartialMarkets(t *testing.T) { // Validate that both markets are parsed. btcXlmStr := "BTC_XLM" pairNames = []*string{&btcEthStr, &btcXlmStr} - partialAggMkts, err = session.RetrievePartialAggMarkets(nil, &pairNames, 12) + partialAggMkts, err = session.RetrievePartialAggMarkets(ctx, nil, &pairNames, 12) require.NoError(t, err) assert.Equal(t, 2, len(partialAggMkts)) assert.Equal(t, int32(3), partialAggMkts[0].TradeCount) @@ -441,12 +442,12 @@ func TestRetrievePartialMarkets(t *testing.T) { // Validate that passing a code works. btcStr := "BTC" - partialAggMkts, err = session.RetrievePartialAggMarkets(&btcStr, nil, 12) + partialAggMkts, err = session.RetrievePartialAggMarkets(ctx, &btcStr, nil, 12) require.NoError(t, err) assert.Equal(t, 2, len(partialAggMkts)) // Make sure there's an error with a non-nil code and non-nil pair names. - partialAggMkts, err = session.RetrievePartialAggMarkets(&btcStr, &pairNames, 12) + partialAggMkts, err = session.RetrievePartialAggMarkets(ctx, &btcStr, &pairNames, 12) require.Error(t, err) } @@ -456,8 +457,8 @@ func Test24hStatsFallback(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -472,10 +473,10 @@ func Test24hStatsFallback(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -484,14 +485,14 @@ func Test24hStatsFallback(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var xlmAsset tickerdb.Asset - err = session.GetRaw(&xlmAsset, ` + err = session.GetRaw(ctx, &xlmAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -500,14 +501,14 @@ func Test24hStatsFallback(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var btcAsset tickerdb.Asset - err = session.GetRaw(&btcAsset, ` + err = session.GetRaw(ctx, &btcAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -541,10 +542,10 @@ func Test24hStatsFallback(t *testing.T) { LedgerCloseTime: threeDaysAgo, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) - markets, err := session.RetrieveMarketData() + markets, err := session.RetrieveMarketData(ctx) require.NoError(t, err) assert.Equal(t, 1, len(markets)) mkt := markets[0] @@ -562,8 +563,8 @@ func TestPreferAnchorAssetCode(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -578,10 +579,10 @@ func TestPreferAnchorAssetCode(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -590,14 +591,14 @@ func TestPreferAnchorAssetCode(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, IsValid: true, }, []string{"code", "issuer_id"}) require.NoError(t, err) var xlmAsset tickerdb.Asset - err = session.GetRaw(&xlmAsset, ` + err = session.GetRaw(ctx, &xlmAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -606,7 +607,7 @@ func TestPreferAnchorAssetCode(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "EURT", IssuerID: issuer.ID, IsValid: true, @@ -614,7 +615,7 @@ func TestPreferAnchorAssetCode(t *testing.T) { }, []string{"code", "issuer_id"}) require.NoError(t, err) var btcAsset tickerdb.Asset - err = session.GetRaw(&btcAsset, ` + err = session.GetRaw(ctx, &btcAsset, ` SELECT * FROM assets ORDER BY id DESC @@ -648,17 +649,17 @@ func TestPreferAnchorAssetCode(t *testing.T) { LedgerCloseTime: threeDaysAgo, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) - markets, err := session.RetrieveMarketData() + markets, err := session.RetrieveMarketData(ctx) require.NoError(t, err) require.Equal(t, 1, len(markets)) for _, mkt := range markets { require.Equal(t, "XLM_EUR", mkt.TradePair) } - partialAggMkts, err := session.RetrievePartialAggMarkets(nil, nil, 168) + partialAggMkts, err := session.RetrievePartialAggMarkets(ctx, nil, nil, 168) require.NoError(t, err) assert.Equal(t, 1, len(partialAggMkts)) for _, aggMkt := range partialAggMkts { diff --git a/services/ticker/internal/tickerdb/tickerdb_test/queries_orderbook_test.go b/services/ticker/internal/tickerdb/tickerdb_test/queries_orderbook_test.go index aeb1a4fcfa..c3cc9a8884 100644 --- a/services/ticker/internal/tickerdb/tickerdb_test/queries_orderbook_test.go +++ b/services/ticker/internal/tickerdb/tickerdb_test/queries_orderbook_test.go @@ -18,8 +18,8 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -40,10 +40,10 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { Name: name, } tbl := session.GetTable("issuers") - _, err = tbl.Insert(issuer).IgnoreCols("id").Exec() + _, err = tbl.Insert(issuer).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var dbIssuer tickerdb.Issuer - err = session.GetRaw(&dbIssuer, ` + err = session.GetRaw(ctx, &dbIssuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -60,11 +60,11 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { LastValid: firstTime, LastChecked: firstTime, } - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_account", "issuer_id"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_account", "issuer_id"}) require.NoError(t, err) var dbAsset1 tickerdb.Asset - err = session.GetRaw(&dbAsset1, ` + err = session.GetRaw(ctx, &dbAsset1, ` SELECT * FROM assets ORDER BY id DESC @@ -82,11 +82,11 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { secondTime := time.Now() a.LastValid = secondTime a.LastChecked = secondTime - err = session.InsertOrUpdateAsset(&a, []string{"code", "issuer_account", "issuer_id"}) + err = session.InsertOrUpdateAsset(ctx, &a, []string{"code", "issuer_account", "issuer_id"}) require.NoError(t, err) var dbAsset2 tickerdb.Asset - err = session.GetRaw(&dbAsset2, ` + err = session.GetRaw(ctx, &dbAsset2, ` SELECT * FROM assets ORDER BY id DESC @@ -109,14 +109,14 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { SpreadMidPoint: 0.35, UpdatedAt: obTime, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var dbOS tickerdb.OrderbookStats - err = session.GetRaw(&dbOS, ` + err = session.GetRaw(ctx, &dbOS, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -151,14 +151,14 @@ func TestInsertOrUpdateOrderbokStats(t *testing.T) { SpreadMidPoint: 0.7, UpdatedAt: obTime2, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats2, []string{"base_asset_id", "counter_asset_id", "lowest_ask"}, ) require.NoError(t, err) var dbOS2 tickerdb.OrderbookStats - err = session.GetRaw(&dbOS2, ` + err = session.GetRaw(ctx, &dbOS2, ` SELECT * FROM orderbook_stats ORDER BY id DESC diff --git a/services/ticker/internal/tickerdb/tickerdb_test/queries_trade_test.go b/services/ticker/internal/tickerdb/tickerdb_test/queries_trade_test.go index dffd03364d..9e404252a7 100644 --- a/services/ticker/internal/tickerdb/tickerdb_test/queries_trade_test.go +++ b/services/ticker/internal/tickerdb/tickerdb_test/queries_trade_test.go @@ -20,8 +20,8 @@ func TestBulkInsertTrades(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -36,10 +36,10 @@ func TestBulkInsertTrades(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -48,13 +48,13 @@ func TestBulkInsertTrades(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset1 tickerdb.Asset - err = session.GetRaw(&asset1, ` + err = session.GetRaw(ctx, &asset1, ` SELECT * FROM assets ORDER BY id DESC @@ -63,13 +63,13 @@ func TestBulkInsertTrades(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset2 tickerdb.Asset - err = session.GetRaw(&asset2, ` + err = session.GetRaw(ctx, &asset2, ` SELECT * FROM assets ORDER BY id DESC @@ -95,11 +95,11 @@ func TestBulkInsertTrades(t *testing.T) { LedgerCloseTime: time.Now(), }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) // Ensure only two were created: - rows, err := session.QueryRaw("SELECT * FROM trades") + rows, err := session.QueryRaw(ctx, "SELECT * FROM trades") require.NoError(t, err) rowsCount := 0 for rows.Next() { @@ -108,10 +108,10 @@ func TestBulkInsertTrades(t *testing.T) { assert.Equal(t, 2, rowsCount) // Re-insert the same trades and check if count remains = 2: - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) - rows, err = session.QueryRaw("SELECT * FROM trades") + rows, err = session.QueryRaw(ctx, "SELECT * FROM trades") require.NoError(t, err) rowsCount2 := 0 for rows.Next() { @@ -126,8 +126,8 @@ func TestGetLastTrade(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -138,7 +138,7 @@ func TestGetLastTrade(t *testing.T) { require.NoError(t, err) // Sanity Check (there are no trades in the database) - _, err = session.GetLastTrade() + _, err = session.GetLastTrade(ctx) require.Error(t, err) // Adding a seed issuer to be used later: @@ -146,10 +146,10 @@ func TestGetLastTrade(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -158,13 +158,13 @@ func TestGetLastTrade(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset1 tickerdb.Asset - err = session.GetRaw(&asset1, ` + err = session.GetRaw(ctx, &asset1, ` SELECT * FROM assets ORDER BY id DESC @@ -173,13 +173,13 @@ func TestGetLastTrade(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset2 tickerdb.Asset - err = session.GetRaw(&asset2, ` + err = session.GetRaw(ctx, &asset2, ` SELECT * FROM assets ORDER BY id DESC @@ -216,10 +216,10 @@ func TestGetLastTrade(t *testing.T) { } // Re-insert the same trades and check if count remains = 2: - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) - lastTrade, err := session.GetLastTrade() + lastTrade, err := session.GetLastTrade(ctx) require.NoError(t, err) assert.WithinDuration(t, now.Local(), lastTrade.LedgerCloseTime.Local(), 10*time.Millisecond) } @@ -230,8 +230,8 @@ func TestDeleteOldTrades(t *testing.T) { var session tickerdb.TickerSession session.DB = db.Open() - session.Ctx = context.Background() defer session.DB.Close() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -246,10 +246,10 @@ func TestDeleteOldTrades(t *testing.T) { _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: "GCF3TQXKZJNFJK7HCMNE2O2CUNKCJH2Y2ROISTBPLC7C5EIA5NNG2XZB", Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer tickerdb.Issuer - err = session.GetRaw(&issuer, ` + err = session.GetRaw(ctx, &issuer, ` SELECT * FROM issuers ORDER BY id DESC @@ -258,13 +258,13 @@ func TestDeleteOldTrades(t *testing.T) { require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset1 tickerdb.Asset - err = session.GetRaw(&asset1, ` + err = session.GetRaw(ctx, &asset1, ` SELECT * FROM assets ORDER BY id DESC @@ -273,13 +273,13 @@ func TestDeleteOldTrades(t *testing.T) { require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerID: issuer.ID, }, []string{"code", "issuer_id"}) require.NoError(t, err) var asset2 tickerdb.Asset - err = session.GetRaw(&asset2, ` + err = session.GetRaw(ctx, &asset2, ` SELECT * FROM assets ORDER BY id DESC @@ -323,16 +323,16 @@ func TestDeleteOldTrades(t *testing.T) { LedgerCloseTime: oneYearAgo, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) // Deleting trades older than 1 day ago: - err = session.DeleteOldTrades(oneDayAgo) + err = session.DeleteOldTrades(ctx, oneDayAgo) require.NoError(t, err) var dbTrades []tickerdb.Trade var trade1, trade2 tickerdb.Trade - err = session.SelectRaw(&dbTrades, "SELECT * FROM trades") + err = session.SelectRaw(ctx, &dbTrades, "SELECT * FROM trades") require.NoError(t, err) assert.Equal(t, 2, len(dbTrades)) diff --git a/services/ticker/internal/tickerdb/tickerdbtest/tickerdbtest.go b/services/ticker/internal/tickerdb/tickerdbtest/tickerdbtest.go index b01998c521..34bebb6602 100644 --- a/services/ticker/internal/tickerdb/tickerdbtest/tickerdbtest.go +++ b/services/ticker/internal/tickerdb/tickerdbtest/tickerdbtest.go @@ -17,7 +17,7 @@ import ( func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerdb.TickerSession) { db := dbtest.Postgres(t) session.DB = db.Open() - session.Ctx = context.Background() + ctx := context.Background() // Run migrations to make sure the tests are run // on the most updated schema version @@ -33,11 +33,11 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: issuer1PK, Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer1 tickerdb.Issuer - err = session.GetRaw(&issuer1, ` + err = session.GetRaw(ctx, &issuer1, ` SELECT * FROM issuers WHERE public_key = ?`, @@ -50,11 +50,11 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd _, err = tbl.Insert(tickerdb.Issuer{ PublicKey: issuer2PK, Name: "FOO BAR", - }).IgnoreCols("id").Exec() + }).IgnoreCols("id").Exec(ctx) require.NoError(t, err) var issuer2 tickerdb.Issuer - err = session.GetRaw(&issuer2, ` + err = session.GetRaw(ctx, &issuer2, ` SELECT * FROM issuers WHERE public_key = ?`, @@ -63,7 +63,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "ETH", IssuerAccount: issuer1PK, IssuerID: issuer1.ID, @@ -71,7 +71,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd }, []string{"code", "issuer_id"}) require.NoError(t, err) var ethAsset1 tickerdb.Asset - err = session.GetRaw(ðAsset1, ` + err = session.GetRaw(ctx, ðAsset1, ` SELECT * FROM assets WHERE code = ? @@ -82,7 +82,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) // Adding a seed asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "ETH", IssuerAccount: issuer2PK, IssuerID: issuer2.ID, @@ -91,7 +91,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) var ethAsset2 tickerdb.Asset - err = session.GetRaw(ðAsset2, ` + err = session.GetRaw(ctx, ðAsset2, ` SELECT * FROM assets WHERE code = ? @@ -102,7 +102,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) // Adding another asset to be used later: - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "BTC", IssuerAccount: issuer1PK, IssuerID: issuer1.ID, @@ -111,7 +111,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) var btcAsset tickerdb.Asset - err = session.GetRaw(&btcAsset, ` + err = session.GetRaw(ctx, &btcAsset, ` SELECT * FROM assets WHERE code = ? @@ -166,7 +166,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd LedgerCloseTime: threeDaysAgo, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) // Adding some orderbook stats: @@ -184,14 +184,14 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd SpreadMidPoint: 0.35, UpdatedAt: obTime, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obBTCETH1 tickerdb.OrderbookStats - err = session.GetRaw(&obBTCETH1, ` + err = session.GetRaw(ctx, &obBTCETH1, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -211,14 +211,14 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd Spread: 0.55, SpreadMidPoint: 0.85, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obETH1BTC tickerdb.OrderbookStats - err = session.GetRaw(&obETH1BTC, ` + err = session.GetRaw(ctx, &obETH1BTC, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -239,14 +239,14 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd SpreadMidPoint: 0.36, UpdatedAt: obTime, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obBTCETH2 tickerdb.OrderbookStats - err = session.GetRaw(&obBTCETH2, ` + err = session.GetRaw(ctx, &obBTCETH2, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -267,14 +267,14 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd Spread: 150.0, SpreadMidPoint: 200.0, } - err = session.InsertOrUpdateOrderbookStats( + err = session.InsertOrUpdateOrderbookStats(ctx, &orderbookStats, []string{"base_asset_id", "counter_asset_id"}, ) require.NoError(t, err) var obETH2BTC tickerdb.OrderbookStats - err = session.GetRaw(&obETH2BTC, ` + err = session.GetRaw(ctx, &obETH2BTC, ` SELECT * FROM orderbook_stats ORDER BY id DESC @@ -283,7 +283,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) // Add an XLM asset. - err = session.InsertOrUpdateAsset(&tickerdb.Asset{ + err = session.InsertOrUpdateAsset(ctx, &tickerdb.Asset{ Code: "XLM", IssuerAccount: issuer1PK, IssuerID: issuer1.ID, @@ -292,7 +292,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd require.NoError(t, err) var xlmAsset tickerdb.Asset - err = session.GetRaw(&xlmAsset, ` + err = session.GetRaw(ctx, &xlmAsset, ` SELECT * FROM assets WHERE code = ? @@ -323,7 +323,7 @@ func SetupTickerTestSession(t *testing.T, migrationsDir string) (session tickerd LedgerCloseTime: now, }, } - err = session.BulkInsertTrades(trades) + err = session.BulkInsertTrades(ctx, trades) require.NoError(t, err) return diff --git a/support/db/batch_insert_builder.go b/support/db/batch_insert_builder.go index baa009ac8b..2bcc94beeb 100644 --- a/support/db/batch_insert_builder.go +++ b/support/db/batch_insert_builder.go @@ -1,6 +1,7 @@ package db import ( + "context" "fmt" "reflect" "sort" @@ -32,7 +33,7 @@ type BatchInsertBuilder struct { // (map keys). Otherwise, error will be returned. Please note that rows are not // added one by one but in batches when `Exec` is called (or `MaxBatchSize` is // reached). -func (b *BatchInsertBuilder) Row(row map[string]interface{}) error { +func (b *BatchInsertBuilder) Row(ctx context.Context, row map[string]interface{}) error { if b.columns == nil { b.columns = make([]string, 0, len(row)) b.rows = make([][]interface{}, 0) @@ -61,13 +62,13 @@ func (b *BatchInsertBuilder) Row(row map[string]interface{}) error { // Call Exec when MaxBatchSize is reached. if len(b.rows) == b.MaxBatchSize { - return b.Exec() + return b.Exec(ctx) } return nil } -func (b *BatchInsertBuilder) RowStruct(row interface{}) error { +func (b *BatchInsertBuilder) RowStruct(ctx context.Context, row interface{}) error { if b.columns == nil { b.columns = columnsForStruct(row) b.rows = make([][]interface{}, 0) @@ -93,7 +94,7 @@ func (b *BatchInsertBuilder) RowStruct(row interface{}) error { // Call Exec when MaxBatchSize is reached. if len(b.rows) == b.MaxBatchSize { - return b.Exec() + return b.Exec(ctx) } return nil @@ -109,7 +110,7 @@ func (b *BatchInsertBuilder) insertSQL() sq.InsertBuilder { // Exec inserts rows in batches. In case of errors it's possible that some batches // were added so this should be run in a DB transaction for easy rollbacks. -func (b *BatchInsertBuilder) Exec() error { +func (b *BatchInsertBuilder) Exec(ctx context.Context) error { sql := b.insertSQL() paramsCount := 0 @@ -118,7 +119,7 @@ func (b *BatchInsertBuilder) Exec() error { paramsCount += len(row) if paramsCount > postgresQueryMaxParams-2*len(b.columns) { - _, err := b.Table.Session.Exec(sql) + _, err := b.Table.Session.Exec(ctx, sql) if err != nil { return errors.Wrap(err, fmt.Sprintf("error adding values while inserting to %s", b.Table.Name)) } @@ -129,7 +130,7 @@ func (b *BatchInsertBuilder) Exec() error { // Insert last batch if paramsCount > 0 { - _, err := b.Table.Session.Exec(sql) + _, err := b.Table.Session.Exec(ctx, sql) if err != nil { return errors.Wrap(err, fmt.Sprintf("error adding values while inserting to %s", b.Table.Name)) } diff --git a/support/db/batch_insert_builder_test.go b/support/db/batch_insert_builder_test.go index 0463a1aefc..10077b0f51 100644 --- a/support/db/batch_insert_builder_test.go +++ b/support/db/batch_insert_builder_test.go @@ -23,32 +23,33 @@ type invalidHungerRow struct { func TestBatchInsertBuilder(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() + ctx := context.Background() insertBuilder := &BatchInsertBuilder{ Table: sess.GetTable("people"), } // exec on the empty set should produce no errors - assert.NoError(t, insertBuilder.Exec()) + assert.NoError(t, insertBuilder.Exec(ctx)) var err error - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hunger_level": "120", }) assert.NoError(t, err) - err = insertBuilder.RowStruct(hungerRow{ + err = insertBuilder.RowStruct(ctx, hungerRow{ Name: "bubba2", HungerLevel: "1202", }) assert.NoError(t, err) // Extra column - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hunger_level": "120", "abc": "def", @@ -56,30 +57,30 @@ func TestBatchInsertBuilder(t *testing.T) { assert.EqualError(t, err, "invalid number of columns (expected=2, actual=3)") // Not enough columns - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", }) assert.EqualError(t, err, "invalid number of columns (expected=2, actual=1)") // Invalid column - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hello": "120", }) assert.EqualError(t, err, `column "hunger_level" does not exist`) - err = insertBuilder.RowStruct(invalidHungerRow{ + err = insertBuilder.RowStruct(ctx, invalidHungerRow{ Name: "Max", HungerLevel: "500", }) assert.EqualError(t, err, `expected value of type "db.hungerRow" but got "db.invalidHungerRow" value`) - err = insertBuilder.Exec() + err = insertBuilder.Exec(ctx) assert.NoError(t, err) // Check rows var found []person - err = sess.SelectRaw(&found, `SELECT * FROM people WHERE name like 'bubba%'`) + err = sess.SelectRaw(ctx, &found, `SELECT * FROM people WHERE name like 'bubba%'`) require.NoError(t, err) assert.Equal( @@ -91,13 +92,13 @@ func TestBatchInsertBuilder(t *testing.T) { }, ) - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hunger_level": "1", }) assert.NoError(t, err) - err = insertBuilder.Exec() + err = insertBuilder.Exec(ctx) assert.EqualError( t, err, "error adding values while inserting to people: exec failed: pq:"+ " duplicate key value violates unique constraint \"people_pkey\"", @@ -105,16 +106,16 @@ func TestBatchInsertBuilder(t *testing.T) { insertBuilder.Suffix = "ON CONFLICT (name) DO NOTHING" - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hunger_level": "1", }) assert.NoError(t, err) - err = insertBuilder.Exec() + err = insertBuilder.Exec(ctx) assert.NoError(t, err) - err = sess.SelectRaw(&found, `SELECT * FROM people WHERE name like 'bubba%'`) + err = sess.SelectRaw(ctx, &found, `SELECT * FROM people WHERE name like 'bubba%'`) require.NoError(t, err) assert.Equal( @@ -128,16 +129,16 @@ func TestBatchInsertBuilder(t *testing.T) { insertBuilder.Suffix = "ON CONFLICT (name) DO UPDATE SET hunger_level = EXCLUDED.hunger_level" - err = insertBuilder.Row(map[string]interface{}{ + err = insertBuilder.Row(ctx, map[string]interface{}{ "name": "bubba", "hunger_level": "1", }) assert.NoError(t, err) - err = insertBuilder.Exec() + err = insertBuilder.Exec(ctx) assert.NoError(t, err) - err = sess.SelectRaw(&found, `SELECT * FROM people WHERE name like 'bubba%'`) + err = sess.SelectRaw(ctx, &found, `SELECT * FROM people WHERE name like 'bubba%'`) require.NoError(t, err) assert.Equal( diff --git a/support/db/delete_builder.go b/support/db/delete_builder.go index 4ed699abfe..e467f6da91 100644 --- a/support/db/delete_builder.go +++ b/support/db/delete_builder.go @@ -1,6 +1,7 @@ package db import ( + "context" "database/sql" "github.com/pkg/errors" @@ -8,8 +9,8 @@ import ( // Exec executes the query represented by the builder, deleting any rows that // match the queries where clauses. -func (delb *DeleteBuilder) Exec() (sql.Result, error) { - r, err := delb.Table.Session.Exec(delb.sql) +func (delb *DeleteBuilder) Exec(ctx context.Context) (sql.Result, error) { + r, err := delb.Table.Session.Exec(ctx, delb.sql) if err != nil { return nil, errors.Wrap(err, "delete failed") } diff --git a/support/db/delete_builder_test.go b/support/db/delete_builder_test.go index 481eeea2ce..cf0eb40594 100644 --- a/support/db/delete_builder_test.go +++ b/support/db/delete_builder_test.go @@ -12,11 +12,12 @@ import ( func TestDeleteBuilder_Exec(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() + ctx := context.Background() tbl := sess.GetTable("people") - r, err := tbl.Delete("name = ?", "scott").Exec() + r, err := tbl.Delete("name = ?", "scott").Exec(ctx) if assert.NoError(t, err, "query error") { actual, err := r.RowsAffected() @@ -24,7 +25,7 @@ func TestDeleteBuilder_Exec(t *testing.T) { assert.Equal(t, int64(1), actual) var found int - err = sess.GetRaw(&found, "SELECT COUNT(*) FROM people WHERE name = ?", "scott") + err = sess.GetRaw(ctx, &found, "SELECT COUNT(*) FROM people WHERE name = ?", "scott") require.NoError(t, err) assert.Equal(t, 0, found) } diff --git a/support/db/get_builder.go b/support/db/get_builder.go index 11b252cb94..6d5ef64134 100644 --- a/support/db/get_builder.go +++ b/support/db/get_builder.go @@ -1,14 +1,15 @@ package db import ( + "context" "github.com/stellar/go/support/errors" ) // Exec executes the query represented by the builder, populating the // destination with the results returned by running the query against the // current database session. -func (gb *GetBuilder) Exec() error { - err := gb.Table.Session.Get(gb.dest, gb.sql) +func (gb *GetBuilder) Exec(ctx context.Context) error { + err := gb.Table.Session.Get(ctx, gb.dest, gb.sql) if err != nil { return errors.Wrap(err, "get failed") } diff --git a/support/db/get_builder_test.go b/support/db/get_builder_test.go index b982f93b6a..7af3d47372 100644 --- a/support/db/get_builder_test.go +++ b/support/db/get_builder_test.go @@ -11,13 +11,13 @@ import ( func TestGetBuilder_Exec(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() var found person tbl := sess.GetTable("people") - err := tbl.Get(&found, "name = ?", "scott").Exec() + err := tbl.Get(&found, "name = ?", "scott").Exec(context.Background()) if assert.NoError(t, err, "query error") { assert.Equal(t, "scott", found.Name) diff --git a/support/db/insert_builder.go b/support/db/insert_builder.go index 8085abc3f9..5cfe13297a 100644 --- a/support/db/insert_builder.go +++ b/support/db/insert_builder.go @@ -1,6 +1,7 @@ package db import ( + "context" "database/sql" "reflect" @@ -9,7 +10,7 @@ import ( // Exec executes the query represented by the builder, inserting each val // provided to the builder into the database. -func (ib *InsertBuilder) Exec() (sql.Result, error) { +func (ib *InsertBuilder) Exec(ctx context.Context) (sql.Result, error) { if len(ib.rows) == 0 { return nil, &NoRowsError{} } @@ -49,7 +50,7 @@ func (ib *InsertBuilder) Exec() (sql.Result, error) { // TODO: support return inserted id - r, err := ib.Table.Session.Exec(sql) + r, err := ib.Table.Session.Exec(ctx, sql) if err != nil { return nil, errors.Wrap(err, "insert failed") } diff --git a/support/db/insert_builder_test.go b/support/db/insert_builder_test.go index 3ea3bc0331..85c2465640 100644 --- a/support/db/insert_builder_test.go +++ b/support/db/insert_builder_test.go @@ -10,9 +10,10 @@ import ( ) func TestInsertBuilder_Exec(t *testing.T) { + ctx := context.Background() db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() tbl := sess.GetTable("people") @@ -20,11 +21,11 @@ func TestInsertBuilder_Exec(t *testing.T) { _, err := tbl.Insert(person{ Name: "bubba", HungerLevel: "120", - }).Exec() + }).Exec(ctx) if assert.NoError(t, err) { var found []person - err = sess.SelectRaw( + err = sess.SelectRaw(ctx, &found, "SELECT * FROM people WHERE name = ?", "bubba", @@ -39,7 +40,7 @@ func TestInsertBuilder_Exec(t *testing.T) { } // no rows - _, err = tbl.Insert().Exec() + _, err = tbl.Insert().Exec(ctx) if assert.Error(t, err) { assert.IsType(t, &NoRowsError{}, err) assert.EqualError(t, err, "no rows provided to insert") @@ -52,7 +53,7 @@ func TestInsertBuilder_Exec(t *testing.T) { }, person{ Name: "bubba3", HungerLevel: "120", - }).Exec() + }).Exec(ctx) if assert.NoError(t, err) { count, err2 := r.RowsAffected() @@ -69,7 +70,7 @@ func TestInsertBuilder_Exec(t *testing.T) { Name: "bubba2", HungerLevel: "120", NotAColumn: 3, - }).Exec() + }).Exec(ctx) assert.Error(t, err) } diff --git a/support/db/main.go b/support/db/main.go index d467bd4a5c..49d7d9216d 100644 --- a/support/db/main.go +++ b/support/db/main.go @@ -92,38 +92,33 @@ type UpdateBuilder struct { } // Session provides helper methods for making queries against `DB` and provides -// utilities such as automatic query logging and transaction management. NOTE: -// A Session is designed to be lightweight and temporarily lived (usually -// request scoped) which is one reason it is acceptable for it to store a -// context. It is not presently intended to cross goroutine boundaries and is -// not concurrency safe. +// utilities such as automatic query logging and transaction management. NOTE: +// Because transaction-handling is stateful, it is not presently intended to +// cross goroutine boundaries and is not concurrency safe. type Session struct { // DB is the database connection that queries should be executed against. DB *sqlx.DB - // Ctx is the context in which the repo is operating under. - Ctx context.Context - tx *sqlx.Tx txOptions *sql.TxOptions } type SessionInterface interface { - BeginTx(opts *sql.TxOptions) error - Begin() error - Rollback() error - TruncateTables(tables []string) error + BeginTx(ctx context.Context, opts *sql.TxOptions) error + Begin(ctx context.Context) error + Rollback(ctx context.Context) error + TruncateTables(ctx context.Context, tables []string) error Clone() *Session Close() error - Get(dest interface{}, query squirrel.Sqlizer) error - GetRaw(dest interface{}, query string, args ...interface{}) error - Select(dest interface{}, query squirrel.Sqlizer) error - SelectRaw(dest interface{}, query string, args ...interface{}) error + Get(ctx context.Context, dest interface{}, query squirrel.Sqlizer) error + GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error + Select(ctx context.Context, dest interface{}, query squirrel.Sqlizer) error + SelectRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error GetTable(name string) *Table - Exec(query squirrel.Sqlizer) (sql.Result, error) - ExecRaw(query string, args ...interface{}) (sql.Result, error) + Exec(ctx context.Context, query squirrel.Sqlizer) (sql.Result, error) + ExecRaw(ctx context.Context, query string, args ...interface{}) (sql.Result, error) NoRows(err error) bool - Ping(timeout time.Duration) error + Ping(ctx context.Context, timeout time.Duration) error } // Table helps to build sql queries against a given table. It logically @@ -157,7 +152,7 @@ func Open(dialect, dsn string) (*Session, error) { return nil, errors.Wrap(err, "ping failed") } - return &Session{DB: db, Ctx: context.Background()}, nil + return &Session{DB: db}, nil } // Wrap wraps a bare *sql.DB (from the database/sql stdlib package) in a @@ -165,7 +160,7 @@ func Open(dialect, dsn string) (*Session, error) { // control the instantiation of the database connection, but would still like to // leverage the facilities provided in Session. func Wrap(base *sql.DB, dialect string) *Session { - return &Session{DB: sqlx.NewDb(base, dialect), Ctx: context.Background()} + return &Session{DB: sqlx.NewDb(base, dialect)} } // ensure various types conform to Conn interface diff --git a/support/db/main_test.go b/support/db/main_test.go index 237e01578c..8ca94f1e3b 100644 --- a/support/db/main_test.go +++ b/support/db/main_test.go @@ -1,7 +1,6 @@ package db import ( - "context" "testing" "github.com/stellar/go/support/db/dbtest" @@ -18,7 +17,7 @@ type person struct { func TestGetTable(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() tbl := sess.GetTable("users") diff --git a/support/db/mock_session.go b/support/db/mock_session.go index 90d66d0bcb..18898de94c 100644 --- a/support/db/mock_session.go +++ b/support/db/mock_session.go @@ -1,6 +1,7 @@ package db import ( + "context" "database/sql" "time" @@ -15,23 +16,23 @@ type MockSession struct { mock.Mock } -func (m *MockSession) Begin() error { - args := m.Called() +func (m *MockSession) Begin(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } -func (m *MockSession) BeginTx(opts *sql.TxOptions) error { - args := m.Called(opts) +func (m *MockSession) BeginTx(ctx context.Context, opts *sql.TxOptions) error { + args := m.Called(ctx, opts) return args.Error(0) } -func (m *MockSession) Rollback() error { - args := m.Called() +func (m *MockSession) Rollback(ctx context.Context) error { + args := m.Called(ctx) return args.Error(0) } -func (m *MockSession) TruncateTables(tables []string) error { - args := m.Called(tables) +func (m *MockSession) TruncateTables(ctx context.Context, tables []string) error { + args := m.Called(ctx, tables) return args.Error(0) } @@ -45,27 +46,27 @@ func (m *MockSession) Close() error { return args.Error(0) } -func (m *MockSession) Get(dest interface{}, query sq.Sqlizer) error { - args := m.Called(dest, query) +func (m *MockSession) Get(ctx context.Context, dest interface{}, query sq.Sqlizer) error { + args := m.Called(ctx, dest, query) return args.Error(0) } -func (m *MockSession) GetRaw(dest interface{}, query string, args ...interface{}) error { - argss := m.Called(dest, query, args) +func (m *MockSession) GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error { + argss := m.Called(ctx, dest, query, args) return argss.Error(0) } -func (m *MockSession) Select(dest interface{}, query squirrel.Sqlizer) error { - argss := m.Called(dest, query) +func (m *MockSession) Select(ctx context.Context, dest interface{}, query squirrel.Sqlizer) error { + argss := m.Called(ctx, dest, query) return argss.Error(0) } -func (m *MockSession) SelectRaw( +func (m *MockSession) SelectRaw(ctx context.Context, dest interface{}, query string, args ...interface{}, ) error { - argss := m.Called(dest, query, args) + argss := m.Called(ctx, dest, query, args) return argss.Error(0) } @@ -74,13 +75,13 @@ func (m *MockSession) GetTable(name string) *Table { return args.Get(0).(*Table) } -func (m *MockSession) Exec(query squirrel.Sqlizer) (sql.Result, error) { - args := m.Called(query) +func (m *MockSession) Exec(ctx context.Context, query squirrel.Sqlizer) (sql.Result, error) { + args := m.Called(ctx, query) return args.Get(0).(sql.Result), args.Error(1) } -func (m *MockSession) ExecRaw(query string, args ...interface{}) (sql.Result, error) { - argss := m.Called(query, args) +func (m *MockSession) ExecRaw(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { + argss := m.Called(ctx, query, args) return argss.Get(0).(sql.Result), argss.Error(1) } @@ -89,6 +90,6 @@ func (m *MockSession) NoRows(err error) bool { return args.Get(0).(bool) } -func (m *MockSession) Ping(timeout time.Duration) error { - return m.Called(timeout).Error(0) +func (m *MockSession) Ping(ctx context.Context, timeout time.Duration) error { + return m.Called(ctx, timeout).Error(0) } diff --git a/support/db/schema/main.go b/support/db/schema/main.go index b541b949cb..8eff0ff8f4 100644 --- a/support/db/schema/main.go +++ b/support/db/schema/main.go @@ -1,6 +1,7 @@ package schema import ( + "context" "database/sql" "errors" @@ -21,8 +22,8 @@ const ( ) // Init installs the latest schema into db after clearing it first -func Init(db *db.Session, latest []byte) error { - return db.ExecAll(string(latest)) +func Init(ctx context.Context, db *db.Session, latest []byte) error { + return db.ExecAll(ctx, string(latest)) } // Migrate performs schema migration. Migrations can occur in one of three diff --git a/support/db/select_builder.go b/support/db/select_builder.go index 540d34b3c0..968c4b58c2 100644 --- a/support/db/select_builder.go +++ b/support/db/select_builder.go @@ -1,14 +1,15 @@ package db import ( + "context" "github.com/stellar/go/support/errors" ) // Exec executes the query represented by the builder, populating the // destination with the results returned by running the query against the // current database session. -func (sb *SelectBuilder) Exec() error { - err := sb.Table.Session.Select(sb.dest, sb.sql) +func (sb *SelectBuilder) Exec(ctx context.Context) error { + err := sb.Table.Session.Select(ctx, sb.dest, sb.sql) if err != nil { return errors.Wrap(err, "select failed") } diff --git a/support/db/select_builder_test.go b/support/db/select_builder_test.go index 121b9a8eb7..93cc888aeb 100644 --- a/support/db/select_builder_test.go +++ b/support/db/select_builder_test.go @@ -12,7 +12,7 @@ import ( func TestSelectBuilder_Exec(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() var results []person @@ -30,7 +30,7 @@ func TestSelectBuilder_Exec(t *testing.T) { assert.Equal(t, "scott", args[0]) } - err = sb.Exec() + err = sb.Exec(context.Background()) if assert.NoError(t, err, "query error") { if assert.Len(t, results, 1) { diff --git a/support/db/session.go b/support/db/session.go index d55e883436..f5cbc74ef8 100644 --- a/support/db/session.go +++ b/support/db/session.go @@ -16,12 +16,12 @@ import ( ) // Begin binds this session to a new transaction. -func (s *Session) Begin() error { +func (s *Session) Begin(ctx context.Context) error { if s.tx != nil { return errors.New("already in transaction") } - tx, err := s.DB.BeginTxx(s.Ctx, nil) + tx, err := s.DB.BeginTxx(ctx, nil) if err != nil { if s.cancelled(err) { return ErrCancelled @@ -29,8 +29,7 @@ func (s *Session) Begin() error { return errors.Wrap(err, "beginx failed") } - s.logBegin() - + log.Ctx(ctx).Debug("sql: begin") s.tx = tx s.txOptions = nil return nil @@ -38,12 +37,12 @@ func (s *Session) Begin() error { // BeginTx binds this session to a new transaction which is configured with the // given transaction options -func (s *Session) BeginTx(opts *sql.TxOptions) error { +func (s *Session) BeginTx(ctx context.Context, opts *sql.TxOptions) error { if s.tx != nil { return errors.New("already in transaction") } - tx, err := s.DB.BeginTxx(s.Ctx, opts) + tx, err := s.DB.BeginTxx(ctx, opts) if err != nil { if s.cancelled(err) { return ErrCancelled @@ -51,7 +50,7 @@ func (s *Session) BeginTx(opts *sql.TxOptions) error { return errors.Wrap(err, "beginTx failed") } - s.logBegin() + log.Ctx(ctx).Debug("sql: begin") s.tx = tx s.txOptions = opts @@ -71,8 +70,7 @@ func (s *Session) GetTxOptions() *sql.TxOptions { // source is currently within. func (s *Session) Clone() *Session { return &Session{ - DB: s.DB, - Ctx: s.Ctx, + DB: s.DB, } } @@ -84,13 +82,13 @@ func (s *Session) Close() error { } // Commit commits the current transaction -func (s *Session) Commit() error { +func (s *Session) Commit(ctx context.Context) error { if s.tx == nil { return errors.New("not in transaction") } err := s.tx.Commit() - s.logCommit() + log.Ctx(ctx).Debug("sql: commit") s.tx = nil s.txOptions = nil return err @@ -104,6 +102,7 @@ func (s *Session) Dialect() string { // DeleteRange deletes a range of rows from a sql table between `start` and // `end` (exclusive). func (s *Session) DeleteRange( + ctx context.Context, start, end int64, table string, idCol string, @@ -113,31 +112,31 @@ func (s *Session) DeleteRange( start, end, ) - _, err := s.Exec(del) + _, err := s.Exec(ctx, del) return err } // Get runs `query`, setting the first result found on `dest`, if // any. -func (s *Session) Get(dest interface{}, query sq.Sqlizer) error { +func (s *Session) Get(ctx context.Context, dest interface{}, query sq.Sqlizer) error { sql, args, err := s.build(query) if err != nil { return err } - return s.GetRaw(dest, sql, args...) + return s.GetRaw(ctx, dest, sql, args...) } // GetRaw runs `query` with `args`, setting the first result found on // `dest`, if any. -func (s *Session) GetRaw(dest interface{}, query string, args ...interface{}) error { +func (s *Session) GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error { query, err := s.ReplacePlaceholders(query) if err != nil { return errors.Wrap(err, "replace placeholders failed") } start := time.Now() - err = s.conn().GetContext(s.Ctx, dest, query, args...) - s.log("get", start, query, args) + err = s.conn().GetContext(ctx, dest, query, args...) + s.log(ctx, "get", start, query, args) if err == nil { return nil @@ -162,51 +161,51 @@ func (s *Session) GetTable(name string) *Table { } } -func (s *Session) TruncateTables(tables []string) error { +func (s *Session) TruncateTables(ctx context.Context, tables []string) error { truncateCmd := fmt.Sprintf("truncate %s restart identity cascade", strings.Join(tables[:], ",")) - _, err := s.ExecRaw(truncateCmd) + _, err := s.ExecRaw(ctx, truncateCmd) return err } // Exec runs `query` -func (s *Session) Exec(query sq.Sqlizer) (sql.Result, error) { +func (s *Session) Exec(ctx context.Context, query sq.Sqlizer) (sql.Result, error) { sql, args, err := s.build(query) if err != nil { return nil, err } - return s.ExecRaw(sql, args...) + return s.ExecRaw(ctx, sql, args...) } // ExecAll runs all sql commands in `script` against `r` within a single // transaction. -func (s *Session) ExecAll(script string) error { - err := s.Begin() +func (s *Session) ExecAll(ctx context.Context, script string) error { + err := s.Begin(ctx) if err != nil { return err } - defer s.Rollback() + defer s.Rollback(ctx) for _, cmd := range sqlutils.AllStatements(script) { - _, err = s.ExecRaw(cmd) + _, err = s.ExecRaw(ctx, cmd) if err != nil { return err } } - return s.Commit() + return s.Commit(ctx) } // ExecRaw runs `query` with `args` -func (s *Session) ExecRaw(query string, args ...interface{}) (sql.Result, error) { +func (s *Session) ExecRaw(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { query, err := s.ReplacePlaceholders(query) if err != nil { return nil, errors.Wrap(err, "replace placeholders failed") } start := time.Now() - result, err := s.conn().ExecContext(s.Ctx, query, args...) - s.log("exec", start, query, args) + result, err := s.conn().ExecContext(ctx, query, args...) + s.log(ctx, "exec", start, query, args) if err == nil { return result, nil @@ -235,24 +234,24 @@ func (s *Session) cancelled(err error) bool { } // Query runs `query`, returns a *sqlx.Rows instance -func (s *Session) Query(query sq.Sqlizer) (*sqlx.Rows, error) { +func (s *Session) Query(ctx context.Context, query sq.Sqlizer) (*sqlx.Rows, error) { sql, args, err := s.build(query) if err != nil { return nil, err } - return s.QueryRaw(sql, args...) + return s.QueryRaw(ctx, sql, args...) } // QueryRaw runs `query` with `args` -func (s *Session) QueryRaw(query string, args ...interface{}) (*sqlx.Rows, error) { +func (s *Session) QueryRaw(ctx context.Context, query string, args ...interface{}) (*sqlx.Rows, error) { query, err := s.ReplacePlaceholders(query) if err != nil { return nil, errors.Wrap(err, "replace placeholders failed") } start := time.Now() - result, err := s.conn().QueryxContext(s.Ctx, query, args...) - s.log("query", start, query, args) + result, err := s.conn().QueryxContext(ctx, query, args...) + s.log(ctx, "query", start, query, args) if err == nil { return result, nil @@ -282,13 +281,13 @@ func (s *Session) ReplacePlaceholders(query string) (string, error) { } // Rollback rolls back the current transaction -func (s *Session) Rollback() error { +func (s *Session) Rollback(ctx context.Context) error { if s.tx == nil { return errors.New("not in transaction") } err := s.tx.Rollback() - s.logRollback() + log.Ctx(ctx).Debug("sql: rollback") s.tx = nil s.txOptions = nil return err @@ -296,23 +295,24 @@ func (s *Session) Rollback() error { // Ping verifies a connection to the database is still alive, // establishing a connection if necessary. -func (s *Session) Ping(timeout time.Duration) error { - ctx, cancel := context.WithTimeout(s.Ctx, timeout) +func (s *Session) Ping(ctx context.Context, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() return s.DB.PingContext(ctx) } // Select runs `query`, setting the results found on `dest`. -func (s *Session) Select(dest interface{}, query sq.Sqlizer) error { +func (s *Session) Select(ctx context.Context, dest interface{}, query sq.Sqlizer) error { sql, args, err := s.build(query) if err != nil { return err } - return s.SelectRaw(dest, sql, args...) + return s.SelectRaw(ctx, dest, sql, args...) } // SelectRaw runs `query` with `args`, setting the results found on `dest`. func (s *Session) SelectRaw( + ctx context.Context, dest interface{}, query string, args ...interface{}, @@ -324,8 +324,8 @@ func (s *Session) SelectRaw( } start := time.Now() - err = s.conn().SelectContext(s.Ctx, dest, query, args...) - s.log("select", start, query, args) + err = s.conn().SelectContext(ctx, dest, query, args...) + s.log(ctx, "select", start, query, args) if err == nil { return nil @@ -382,31 +382,10 @@ func (s *Session) conn() Conn { return s.DB } -func (s *Session) log(typ string, start time.Time, query string, args []interface{}) { +func (s *Session) log(ctx context.Context, typ string, start time.Time, query string, args []interface{}) { log. - Ctx(s.logCtx()). WithField("args", args). WithField("sql", query). WithField("dur", time.Since(start).String()). Debugf("sql: %s", typ) } - -func (s *Session) logBegin() { - log.Ctx(s.logCtx()).Debug("sql: begin") -} - -func (s *Session) logCommit() { - log.Ctx(s.logCtx()).Debug("sql: commit") -} - -func (s *Session) logRollback() { - log.Ctx(s.logCtx()).Debug("sql: rollback") -} - -func (s *Session) logCtx() context.Context { - if s.Ctx != nil { - return s.Ctx - } - - return context.Background() -} diff --git a/support/db/session_test.go b/support/db/session_test.go index 0219e4806e..624e66a143 100644 --- a/support/db/session_test.go +++ b/support/db/session_test.go @@ -13,24 +13,25 @@ func TestSession(t *testing.T) { db := dbtest.Postgres(t).Load(testSchema) defer db.Close() + ctx := context.Background() assert := assert.New(t) require := require.New(t) - sess := &Session{DB: db.Open(), Ctx: context.Background()} + sess := &Session{DB: db.Open()} defer sess.DB.Close() assert.Equal("postgres", sess.Dialect()) var count int - err := sess.GetRaw(&count, "SELECT COUNT(*) FROM people") + err := sess.GetRaw(ctx, &count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(3, count) var names []string - err = sess.SelectRaw(&names, "SELECT name FROM people") + err = sess.SelectRaw(ctx, &names, "SELECT name FROM people") assert.NoError(err) assert.Len(names, 3) - ret, err := sess.ExecRaw("DELETE FROM people") + ret, err := sess.ExecRaw(ctx, "DELETE FROM people") assert.NoError(err) deleted, err := ret.RowsAffected() assert.NoError(err) @@ -40,7 +41,7 @@ func TestSession(t *testing.T) { // during execution) db.Load(testSchema) var name string - err = sess.GetRaw( + err = sess.GetRaw(ctx, &name, "SELECT name FROM people WHERE hunger_level = ? AND name != '??'", 1000000, @@ -49,7 +50,7 @@ func TestSession(t *testing.T) { assert.Equal("scott", name) // Test NoRows - err = sess.GetRaw( + err = sess.GetRaw(ctx, &name, "SELECT name FROM people WHERE hunger_level = ?", 1234, @@ -58,29 +59,29 @@ func TestSession(t *testing.T) { // Test transactions db.Load(testSchema) - require.NoError(sess.Begin(), "begin failed") - err = sess.GetRaw(&count, "SELECT COUNT(*) FROM people") + require.NoError(sess.Begin(ctx), "begin failed") + err = sess.GetRaw(ctx, &count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(3, count) - _, err = sess.ExecRaw("DELETE FROM people") + _, err = sess.ExecRaw(ctx, "DELETE FROM people") assert.NoError(err) - err = sess.GetRaw(&count, "SELECT COUNT(*) FROM people") + err = sess.GetRaw(ctx, &count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(0, count, "people did not appear deleted inside transaction") - assert.NoError(sess.Rollback(), "rollback failed") + assert.NoError(sess.Rollback(ctx), "rollback failed") // Ensure commit works - require.NoError(sess.Begin(), "begin failed") - sess.ExecRaw("DELETE FROM people") - assert.NoError(sess.Commit(), "commit failed") - err = sess.GetRaw(&count, "SELECT COUNT(*) FROM people") + require.NoError(sess.Begin(ctx), "begin failed") + sess.ExecRaw(ctx, "DELETE FROM people") + assert.NoError(sess.Commit(ctx), "commit failed") + err = sess.GetRaw(ctx, &count, "SELECT COUNT(*) FROM people") assert.NoError(err) assert.Equal(0, count) // ensure that selecting into a populated slice clears the slice first db.Load(testSchema) require.Len(names, 3, "ids slice was not preloaded with data") - err = sess.SelectRaw(&names, "SELECT name FROM people limit 2") + err = sess.SelectRaw(ctx, &names, "SELECT name FROM people limit 2") assert.NoError(err) assert.Len(names, 2) diff --git a/support/db/update_builder.go b/support/db/update_builder.go index 6f862b345a..cd6e3373d5 100644 --- a/support/db/update_builder.go +++ b/support/db/update_builder.go @@ -1,6 +1,7 @@ package db import ( + "context" "database/sql" "reflect" @@ -9,8 +10,8 @@ import ( // Exec executes the query that has been previously configured on the // UpdateBuilder. -func (ub *UpdateBuilder) Exec() (sql.Result, error) { - r, err := ub.Table.Session.Exec(ub.sql) +func (ub *UpdateBuilder) Exec(ctx context.Context) (sql.Result, error) { + r, err := ub.Table.Session.Exec(ctx, ub.sql) if err != nil { return nil, errors.Wrap(err, "select failed") } From 23485750ec4a202ab1067cda8c14303f4d389c6c Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 26 Apr 2021 16:11:24 +0100 Subject: [PATCH 13/67] services/horizon: Add 1s timeout to horizon.App.Tick (#3567) * add 1s timeout to horizon.App.Tick Fixes #3344 * Increase tickerMaxDuration to 10s --- services/horizon/internal/app.go | 26 ++++++++++++++++++-------- services/horizon/internal/app_test.go | 13 +++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/services/horizon/internal/app.go b/services/horizon/internal/app.go index 1aaa529cda..8b9109a22d 100644 --- a/services/horizon/internal/app.go +++ b/services/horizon/internal/app.go @@ -88,13 +88,16 @@ func (a *App) GetCoreSettings() actions.CoreSettings { return a.coreSettings.get() } +const tickerMaxFrequency = 1 * time.Second +const tickerMaxDuration = 10 * time.Second + // NewApp constructs an new App instance from the provided config. func NewApp(config Config) (*App, error) { a := &App{ config: config, ledgerState: &ledger.State{}, horizonVersion: app.Version(), - ticks: time.NewTicker(1 * time.Second), + ticks: time.NewTicker(tickerMaxFrequency), done: make(chan struct{}), } @@ -402,22 +405,24 @@ func (a *App) DeleteUnretainedHistory(ctx context.Context) error { // Tick triggers horizon to update all of it's background processes such as // transaction submission, metrics, ingestion and reaping. -func (a *App) Tick() { +func (a *App) Tick(ctx context.Context) error { var wg sync.WaitGroup log.Debug("ticking app") + // update ledger state, operation fee state, and stellar-core info in parallel wg.Add(3) - go func() { a.UpdateLedgerState(a.ctx); wg.Done() }() - go func() { a.UpdateFeeStatsState(a.ctx); wg.Done() }() - go func() { a.UpdateStellarCoreInfo(a.ctx); wg.Done() }() + go func() { a.UpdateLedgerState(ctx); wg.Done() }() + go func() { a.UpdateFeeStatsState(ctx); wg.Done() }() + go func() { a.UpdateStellarCoreInfo(ctx); wg.Done() }() wg.Wait() wg.Add(2) - go func() { a.reaper.Tick(a.ctx); wg.Done() }() - go func() { a.submitter.Tick(a.ctx); wg.Done() }() + go func() { a.reaper.Tick(ctx); wg.Done() }() + go func() { a.submitter.Tick(ctx); wg.Done() }() wg.Wait() log.Debug("finished ticking app") + return ctx.Err() } // Init initializes app, using the config to populate db connections and @@ -530,7 +535,12 @@ func (a *App) run() { for { select { case <-a.ticks.C: - a.Tick() + ctx, cancel := context.WithTimeout(a.ctx, tickerMaxDuration) + err := a.Tick(ctx) + if err != nil { + log.Warnf("error ticking app: %s", err) + } + cancel() // Release timer case <-a.ctx.Done(): log.Info("finished background ticker") return diff --git a/services/horizon/internal/app_test.go b/services/horizon/internal/app_test.go index cd4bb83768..866b22cb39 100644 --- a/services/horizon/internal/app_test.go +++ b/services/horizon/internal/app_test.go @@ -1,6 +1,7 @@ package horizon import ( + "context" "net/http" "testing" @@ -36,6 +37,7 @@ func TestGenericHTTPFeatures(t *testing.T) { w = ht.Get("/ledgers/") ht.Assert.Equal(200, w.Code) } + func TestMetrics(t *testing.T) { ht := StartHTTPTest(t, "base") defer ht.Finish() @@ -55,6 +57,17 @@ func TestMetrics(t *testing.T) { ht.Require.EqualValues(64, getMetricValue(cl).GetCounter().GetValue()) } +func TestTick(t *testing.T) { + ht := StartHTTPTest(t, "base") + defer ht.Finish() + + // Just sanity-check that we return the context error... + ctx, cancel := context.WithCancel(context.Background()) + cancel() + err := ht.App.Tick(ctx) + ht.Assert.EqualError(err, context.Canceled.Error()) +} + func getMetricValue(metric prometheus.Metric) *dto.Metric { value := &dto.Metric{} err := metric.Write(value) From bed1e7cdad63d220fbd332f1fccc986459256d2b Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 26 Apr 2021 18:52:08 +0200 Subject: [PATCH 14/67] Rename LedgerTransaction's Meta to UnsafeMeta (#3561) --- ingest/ledger_transaction.go | 17 ++++++------ ingest/ledger_transaction_reader.go | 2 +- ingest/ledger_transaction_test.go | 26 +++++++++---------- .../internal/db2/history/fee_bump_scenario.go | 4 +-- .../transaction_batch_insert_builder.go | 2 +- .../transaction_batch_insert_builder_test.go | 2 +- ...ble_balances_transaction_processor_test.go | 4 +-- .../processors/effects_processor_test.go | 18 ++++++------- .../processors/ledgers_processor_test.go | 2 +- .../processors/participants_processor.go | 2 +- .../ingest/processors/participants_test.go | 2 +- .../processors/trades_processor_test.go | 4 +-- .../transaction_operation_wrapper_test.go | 22 ++++++++-------- .../internal/test/transactions/main.go | 4 +-- 14 files changed, 56 insertions(+), 55 deletions(-) diff --git a/ingest/ledger_transaction.go b/ingest/ledger_transaction.go index 1ff9040d5c..9410dcd0eb 100644 --- a/ingest/ledger_transaction.go +++ b/ingest/ledger_transaction.go @@ -10,11 +10,12 @@ type LedgerTransaction struct { Index uint32 Envelope xdr.TransactionEnvelope Result xdr.TransactionResultPair - // FeeChanges and Meta are low level values. + // FeeChanges and UnsafeMeta are low level values, do not use them directly unless + // you know what you are doing. // Use LedgerTransaction.GetChanges() for higher level access to ledger // entry changes. FeeChanges xdr.LedgerEntryChanges - Meta xdr.TransactionMeta + UnsafeMeta xdr.TransactionMeta } func (t *LedgerTransaction) txInternalError() bool { @@ -35,11 +36,11 @@ func (t *LedgerTransaction) GetChanges() ([]Change, error) { var changes []Change // Transaction meta - switch t.Meta.V { + switch t.UnsafeMeta.V { case 0: return changes, errors.New("TransactionMeta.V=0 not supported") case 1: - v1Meta := t.Meta.MustV1() + v1Meta := t.UnsafeMeta.MustV1() txChanges := GetChangesFromLedgerEntryChanges(v1Meta.TxChanges) changes = append(changes, txChanges...) @@ -56,7 +57,7 @@ func (t *LedgerTransaction) GetChanges() ([]Change, error) { } case 2: - v2Meta := t.Meta.MustV2() + v2Meta := t.UnsafeMeta.MustV2() txChangesBefore := GetChangesFromLedgerEntryChanges(v2Meta.TxChangesBefore) changes = append(changes, txChangesBefore...) @@ -88,7 +89,7 @@ func (t *LedgerTransaction) GetOperationChanges(operationIndex uint32) ([]Change changes := []Change{} // Transaction meta - switch t.Meta.V { + switch t.UnsafeMeta.V { case 0: return changes, errors.New("TransactionMeta.V=0 not supported") case 1: @@ -97,7 +98,7 @@ func (t *LedgerTransaction) GetOperationChanges(operationIndex uint32) ([]Change return changes, nil } - v1Meta := t.Meta.MustV1() + v1Meta := t.UnsafeMeta.MustV1() changes = operationChanges(v1Meta.Operations, operationIndex) case 2: // Ignore operations meta if txInternalError https://github.com/stellar/go/issues/2111 @@ -105,7 +106,7 @@ func (t *LedgerTransaction) GetOperationChanges(operationIndex uint32) ([]Change return changes, nil } - v2Meta := t.Meta.MustV2() + v2Meta := t.UnsafeMeta.MustV2() changes = operationChanges(v2Meta.Operations, operationIndex) default: return changes, errors.New("Unsupported TransactionMeta version") diff --git a/ingest/ledger_transaction_reader.go b/ingest/ledger_transaction_reader.go index c3bb969257..a33355261c 100644 --- a/ingest/ledger_transaction_reader.go +++ b/ingest/ledger_transaction_reader.go @@ -102,7 +102,7 @@ func (reader *LedgerTransactionReader) storeTransactions(lcm xdr.LedgerCloseMeta Index: uint32(i + 1), // Transactions start at '1' Envelope: envelope, Result: result, - Meta: lcm.V0.TxProcessing[i].TxApplyProcessing, + UnsafeMeta: lcm.V0.TxProcessing[i].TxApplyProcessing, FeeChanges: lcm.V0.TxProcessing[i].FeeProcessing, }) } diff --git a/ingest/ledger_transaction_test.go b/ingest/ledger_transaction_test.go index 96fe96961e..348b1d9688 100644 --- a/ingest/ledger_transaction_test.go +++ b/ingest/ledger_transaction_test.go @@ -45,7 +45,7 @@ func TestFeeMetaAndOperationsChangesSeparate(t *testing.T) { }, }, }, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 1, V1: &xdr.TransactionMetaV1{ Operations: []xdr.OperationMeta{ @@ -146,11 +146,11 @@ func TestFailedTransactionOperationChangesMeta(t *testing.T) { }, }, }, - Meta: tc.meta, + UnsafeMeta: tc.meta, } operationChanges, err := tx.GetOperationChanges(0) - if tx.Meta.V == 0 { + if tx.UnsafeMeta.V == 0 { assert.Error(t, err) assert.EqualError(t, err, "TransactionMeta.V=0 not supported") } else { @@ -162,7 +162,7 @@ func TestFailedTransactionOperationChangesMeta(t *testing.T) { } func TestMetaV2Order(t *testing.T) { tx := LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ TxChangesBefore: xdr.LedgerEntryChanges{ @@ -333,7 +333,7 @@ func TestMetaV2Order(t *testing.T) { func TestMetaV0(t *testing.T) { tx := LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 0, }} @@ -449,7 +449,7 @@ func TestChangeAccountChangedExceptSignersSignerChange(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -464,7 +464,7 @@ func TestChangeAccountChangedExceptSignersSignerChange(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 2, }, @@ -497,7 +497,7 @@ func TestChangeAccountChangedExceptSignersNoChanges(t *testing.T) { HomeDomain: "stellar.org", Thresholds: [4]byte{1, 1, 1, 1}, Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -528,7 +528,7 @@ func TestChangeAccountChangedExceptSignersNoChanges(t *testing.T) { HomeDomain: "stellar.org", Thresholds: [4]byte{1, 1, 1, 1}, Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -708,7 +708,7 @@ func TestChangeAccountSignersChangedSignerAdded(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -731,7 +731,7 @@ func TestChangeAccountSignersChangedSignerRemoved(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -764,7 +764,7 @@ func TestChangeAccountSignersChangedSignerWeightChanged(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 1, }, @@ -779,7 +779,7 @@ func TestChangeAccountSignersChangedSignerWeightChanged(t *testing.T) { Account: &xdr.AccountEntry{ AccountId: xdr.MustAddress("GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML"), Signers: []xdr.Signer{ - xdr.Signer{ + { Key: xdr.MustSigner("GCCCU34WDY2RATQTOOQKY6SZWU6J5DONY42SWGW2CIXGW4LICAGNRZKX"), Weight: 2, }, diff --git a/services/horizon/internal/db2/history/fee_bump_scenario.go b/services/horizon/internal/db2/history/fee_bump_scenario.go index e96acb7454..98dd49ec3a 100644 --- a/services/horizon/internal/db2/history/fee_bump_scenario.go +++ b/services/horizon/internal/db2/history/fee_bump_scenario.go @@ -57,7 +57,7 @@ func buildLedgerTransaction(t *testing.T, tx testTransaction) ingest.LedgerTrans Envelope: xdr.TransactionEnvelope{}, Result: xdr.TransactionResultPair{}, FeeChanges: xdr.LedgerEntryChanges{}, - Meta: xdr.TransactionMeta{}, + UnsafeMeta: xdr.TransactionMeta{}, } tt := assert.New(t) @@ -66,7 +66,7 @@ func buildLedgerTransaction(t *testing.T, tx testTransaction) ingest.LedgerTrans tt.NoError(err) err = xdr.SafeUnmarshalBase64(tx.resultXDR, &transaction.Result.Result) tt.NoError(err) - err = xdr.SafeUnmarshalBase64(tx.metaXDR, &transaction.Meta) + err = xdr.SafeUnmarshalBase64(tx.metaXDR, &transaction.UnsafeMeta) tt.NoError(err) err = xdr.SafeUnmarshalBase64(tx.feeChangesXDR, &transaction.FeeChanges) tt.NoError(err) diff --git a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go index eb8e24c644..345550a189 100644 --- a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go @@ -236,7 +236,7 @@ func transactionToRow(transaction ingest.LedgerTransaction, sequence uint32) (Tr if err != nil { return TransactionWithoutLedger{}, err } - metaBase64, err := xdr.MarshalBase64(transaction.Meta) + metaBase64, err := xdr.MarshalBase64(transaction.UnsafeMeta) if err != nil { return TransactionWithoutLedger{}, err } diff --git a/services/horizon/internal/db2/history/transaction_batch_insert_builder_test.go b/services/horizon/internal/db2/history/transaction_batch_insert_builder_test.go index b3125a7a7b..8043edb76c 100644 --- a/services/horizon/internal/db2/history/transaction_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/transaction_batch_insert_builder_test.go @@ -75,7 +75,7 @@ func TestTransactionToMap_muxed(t *testing.T) { }, }, }, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 1, Operations: &[]xdr.OperationMeta{}, V1: &xdr.TransactionMetaV1{ diff --git a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go index e482c88ef6..bc7a3f438b 100644 --- a/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go +++ b/services/horizon/internal/ingest/processors/claimable_balances_transaction_processor_test.go @@ -67,8 +67,8 @@ func (s *ClaimableBalancesTransactionProcessorTestSuiteLedger) testOperationInse internalID := int64(1234) txn := createTransaction(true, 1) txn.Envelope.Operations()[0].Body = body - txn.Meta.V = 2 - txn.Meta.V2.Operations = []xdr.OperationMeta{ + txn.UnsafeMeta.V = 2 + txn.UnsafeMeta.V2.Operations = []xdr.OperationMeta{ {Changes: xdr.LedgerEntryChanges{ { Type: xdr.LedgerEntryChangeTypeLedgerEntryState, diff --git a/services/horizon/internal/ingest/processors/effects_processor_test.go b/services/horizon/internal/ingest/processors/effects_processor_test.go index 8672c82cb3..977fa37363 100644 --- a/services/horizon/internal/ingest/processors/effects_processor_test.go +++ b/services/horizon/internal/ingest/processors/effects_processor_test.go @@ -1509,7 +1509,7 @@ func TestOperationEffects(t *testing.T) { func TestOperationEffectsSetOptionsSignersOrder(t *testing.T) { tt := assert.New(t) transaction := ingest.LedgerTransaction{ - Meta: createTransactionMeta([]xdr.OperationMeta{ + UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{ { Changes: []xdr.LedgerEntryChange{ // State @@ -1640,7 +1640,7 @@ func TestOperationEffectsSetOptionsSignersOrder(t *testing.T) { func TestOperationEffectsSetOptionsSignersNoUpdated(t *testing.T) { tt := assert.New(t) transaction := ingest.LedgerTransaction{ - Meta: createTransactionMeta([]xdr.OperationMeta{ + UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{ { Changes: []xdr.LedgerEntryChange{ // State @@ -1761,7 +1761,7 @@ func TestOperationRegressionAccountTrustItself(t *testing.T) { // NOTE: when an account trusts itself, the transaction is successful but // no ledger entries are actually modified. transaction := ingest.LedgerTransaction{ - Meta: createTransactionMeta([]xdr.OperationMeta{}), + UnsafeMeta: createTransactionMeta([]xdr.OperationMeta{}), } transaction.Index = 1 transaction.Envelope.Type = xdr.EnvelopeTypeEnvelopeTypeTx @@ -1813,7 +1813,7 @@ func TestOperationEffectsAllowTrustAuthorizedToMaintainLiabilities(t *testing.T) operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{}, }, @@ -1874,7 +1874,7 @@ func TestOperationEffectsClawback(t *testing.T) { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{}, }, @@ -1934,7 +1934,7 @@ func TestOperationEffectsClawbackClaimableBalance(t *testing.T) { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{}, }, @@ -1983,7 +1983,7 @@ func TestOperationEffectsSetTrustLineFlags(t *testing.T) { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{}, }, @@ -2121,7 +2121,7 @@ func (s *CreateClaimableBalanceEffectsTestSuite) SetupTest() { }, }, FeeChanges: xdr.LedgerEntryChanges{}, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: []xdr.OperationMeta{ @@ -2349,7 +2349,7 @@ func (s *ClaimClaimableBalanceEffectsTestSuite) SetupTest() { }, }, FeeChanges: xdr.LedgerEntryChanges{}, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: []xdr.OperationMeta{ diff --git a/services/horizon/internal/ingest/processors/ledgers_processor_test.go b/services/horizon/internal/ingest/processors/ledgers_processor_test.go index 438e269d98..05bd2c3c3b 100644 --- a/services/horizon/internal/ingest/processors/ledgers_processor_test.go +++ b/services/horizon/internal/ingest/processors/ledgers_processor_test.go @@ -68,7 +68,7 @@ func createTransaction(successful bool, numOps int) ingest.LedgerTransaction { }, }, }, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, numOps, numOps), diff --git a/services/horizon/internal/ingest/processors/participants_processor.go b/services/horizon/internal/ingest/processors/participants_processor.go index 8b285bb91d..50f4187132 100644 --- a/services/horizon/internal/ingest/processors/participants_processor.go +++ b/services/horizon/internal/ingest/processors/participants_processor.go @@ -149,7 +149,7 @@ func participantsForTransaction( participants = append(participants, transaction.Envelope.FeeBumpAccount().ToAccountId()) } - p, err := participantsForMeta(transaction.Meta) + p, err := participantsForMeta(transaction.UnsafeMeta) if err != nil { return nil, err } diff --git a/services/horizon/internal/ingest/processors/participants_test.go b/services/horizon/internal/ingest/processors/participants_test.go index 370fa6d5b2..73684c0555 100644 --- a/services/horizon/internal/ingest/processors/participants_test.go +++ b/services/horizon/internal/ingest/processors/participants_test.go @@ -41,7 +41,7 @@ func TestParticipantsForTransaction(t *testing.T) { Index: 1, Envelope: envelope, FeeChanges: feeChanges, - Meta: meta, + UnsafeMeta: meta, Result: xdr.TransactionResultPair{ Result: xdr.TransactionResult{ Result: xdr.TransactionResultResult{ diff --git a/services/horizon/internal/ingest/processors/trades_processor_test.go b/services/horizon/internal/ingest/processors/trades_processor_test.go index 678c94ca45..47c481b3bd 100644 --- a/services/horizon/internal/ingest/processors/trades_processor_test.go +++ b/services/horizon/internal/ingest/processors/trades_processor_test.go @@ -440,7 +440,7 @@ func (s *TradeProcessorTestSuiteLedger) mockReadTradeTransactions( }, Index: 1, FeeChanges: []xdr.LedgerEntryChange{}, - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: []xdr.OperationMeta{ @@ -453,7 +453,7 @@ func (s *TradeProcessorTestSuiteLedger) mockReadTradeTransactions( } for i, trade := range s.allTrades { - tx.Meta.V2.Operations = append(tx.Meta.V2.Operations, xdr.OperationMeta{ + tx.UnsafeMeta.V2.Operations = append(tx.UnsafeMeta.V2.Operations, xdr.OperationMeta{ Changes: xdr.LedgerEntryChanges{ xdr.LedgerEntryChange{ Type: xdr.LedgerEntryChangeTypeLedgerEntryState, diff --git a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go index 9c39ef049b..054c56dab1 100644 --- a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go +++ b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go @@ -1042,7 +1042,7 @@ func TestTransactionOperationAllowTrustDetails(t *testing.T) { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1172,7 +1172,7 @@ func (s *CreateClaimableBalanceOpTestSuite) TestDetails() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1218,7 +1218,7 @@ func (s *CreateClaimableBalanceOpTestSuite) TestParticipants() { s.T().Run(tc.desc, func(t *testing.T) { operation := transactionOperationWrapper{ index: 0, - transaction: ingest.LedgerTransaction{Meta: xdr.TransactionMeta{ + transaction: ingest.LedgerTransaction{UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1269,7 +1269,7 @@ func (s *ClaimClaimableBalanceOpTestSuite) TestDetails() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1288,7 +1288,7 @@ func (s *ClaimClaimableBalanceOpTestSuite) TestParticipants() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1319,7 +1319,7 @@ func getSponsoredSandwichWrappers() []*transactionOperationWrapper { const ledgerSeq = uint32(12345) tx := createTransaction(true, 3) tx.Index = 1 - tx.Meta = xdr.TransactionMeta{ + tx.UnsafeMeta = xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 3, 3), @@ -1358,7 +1358,7 @@ func getSponsoredSandwichWrappers() []*transactionOperationWrapper { } sponsoreeMuxed := sponsoree.ToMuxedAccount() tx.Envelope.Operations()[1].SourceAccount = &sponsoreeMuxed - tx.Meta.V2.Operations[1] = xdr.OperationMeta{Changes: []xdr.LedgerEntryChange{ + tx.UnsafeMeta.V2.Operations[1] = xdr.OperationMeta{Changes: []xdr.LedgerEntryChange{ { Type: xdr.LedgerEntryChangeTypeLedgerEntryCreated, Created: &xdr.LedgerEntry{ @@ -1485,7 +1485,7 @@ func (s *ClawbackTestSuite) TestDetails() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1504,7 +1504,7 @@ func (s *ClawbackTestSuite) TestParticipants() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1567,7 +1567,7 @@ func (s *SetTrustLineFlagsTestSuite) TestDetails() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), @@ -1586,7 +1586,7 @@ func (s *SetTrustLineFlagsTestSuite) TestParticipants() { operation := transactionOperationWrapper{ index: 0, transaction: ingest.LedgerTransaction{ - Meta: xdr.TransactionMeta{ + UnsafeMeta: xdr.TransactionMeta{ V: 2, V2: &xdr.TransactionMetaV2{ Operations: make([]xdr.OperationMeta, 1, 1), diff --git a/services/horizon/internal/test/transactions/main.go b/services/horizon/internal/test/transactions/main.go index 102d8eb5de..2cf9a9340a 100644 --- a/services/horizon/internal/test/transactions/main.go +++ b/services/horizon/internal/test/transactions/main.go @@ -27,7 +27,7 @@ func BuildLedgerTransaction(t *testing.T, tx TestTransaction) ingest.LedgerTrans Envelope: xdr.TransactionEnvelope{}, Result: xdr.TransactionResultPair{}, FeeChanges: xdr.LedgerEntryChanges{}, - Meta: xdr.TransactionMeta{}, + UnsafeMeta: xdr.TransactionMeta{}, } tt := assert.New(t) @@ -36,7 +36,7 @@ func BuildLedgerTransaction(t *testing.T, tx TestTransaction) ingest.LedgerTrans tt.NoError(err) err = xdr.SafeUnmarshalBase64(tx.ResultXDR, &transaction.Result.Result) tt.NoError(err) - err = xdr.SafeUnmarshalBase64(tx.MetaXDR, &transaction.Meta) + err = xdr.SafeUnmarshalBase64(tx.MetaXDR, &transaction.UnsafeMeta) tt.NoError(err) err = xdr.SafeUnmarshalBase64(tx.FeeChangesXDR, &transaction.FeeChanges) tt.NoError(err) From 10afb0a5a88bd3b37bdcfb49bfa34f7fec9808e4 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 26 Apr 2021 19:51:49 +0200 Subject: [PATCH 15/67] horizon: Test consistency and coverage of effect typenames (and cleanup unused effects) (#3562) --- protocols/horizon/effects/main.go | 65 ++++++++++--------- services/horizon/internal/db2/history/main.go | 9 ++- .../internal/resourceadapter/effects.go | 58 +++++++++-------- .../internal/resourceadapter/effects_test.go | 40 ++++++++++++ 4 files changed, 108 insertions(+), 64 deletions(-) diff --git a/protocols/horizon/effects/main.go b/protocols/horizon/effects/main.go index 28006e4fe7..1e5cb54590 100644 --- a/protocols/horizon/effects/main.go +++ b/protocols/horizon/effects/main.go @@ -43,6 +43,7 @@ const ( // account flags, either clearing or setting. EffectAccountFlagsUpdated EffectType = 6 // from set_options + // unused // EffectAccountInflationDestinationUpdated effects occur when an account changes its // inflation destination. EffectAccountInflationDestinationUpdated EffectType = 7 // from set_options @@ -92,14 +93,13 @@ const ( // trading effects + // unused // EffectOfferCreated occurs when an account offers to trade an asset - EffectOfferCreated EffectType = 30 // from manage_offer, creat_passive_offer - + // EffectOfferCreated EffectType = 30 // from manage_offer, creat_passive_offer // EffectOfferRemoved occurs when an account removes an offer - EffectOfferRemoved EffectType = 31 // from manage_offer, creat_passive_offer, path_payment - + // EffectOfferRemoved EffectType = 31 // from manage_offer, creat_passive_offer, path_payment // EffectOfferUpdated occurs when an offer is updated by the offering account. - EffectOfferUpdated EffectType = 32 // from manage_offer, creat_passive_offer, path_payment + // EffectOfferUpdated EffectType = 32 // from manage_offer, creat_passive_offer, path_payment // EffectTrade occurs when a trade is initiated because of a path payment or // offer operation. @@ -208,33 +208,34 @@ var EffectTypeNames = map[EffectType]string{ EffectTrustlineAuthorizedToMaintainLiabilities: "trustline_authorized_to_maintain_liabilities", EffectTrustlineDeauthorized: "trustline_deauthorized", EffectTrustlineFlagsUpdated: "trustline_flags_updated", - EffectOfferCreated: "offer_created", - EffectOfferRemoved: "offer_removed", - EffectOfferUpdated: "offer_updated", - EffectTrade: "trade", - EffectDataCreated: "data_created", - EffectDataRemoved: "data_removed", - EffectDataUpdated: "data_updated", - EffectSequenceBumped: "sequence_bumped", - EffectClaimableBalanceCreated: "claimable_balance_created", - EffectClaimableBalanceClaimed: "claimable_balance_claimed", - EffectClaimableBalanceClaimantCreated: "claimable_balance_claimant_created", - EffectAccountSponsorshipCreated: "account_sponsorship_created", - EffectAccountSponsorshipUpdated: "account_sponsorship_updated", - EffectAccountSponsorshipRemoved: "account_sponsorship_removed", - EffectTrustlineSponsorshipCreated: "trustline_sponsorship_created", - EffectTrustlineSponsorshipUpdated: "trustline_sponsorship_updated", - EffectTrustlineSponsorshipRemoved: "trustline_sponsorship_removed", - EffectDataSponsorshipCreated: "data_sponsorship_created", - EffectDataSponsorshipUpdated: "data_sponsorship_updated", - EffectDataSponsorshipRemoved: "data_sponsorship_removed", - EffectClaimableBalanceSponsorshipCreated: "claimable_balance_sponsorship_created", - EffectClaimableBalanceSponsorshipUpdated: "claimable_balance_sponsorship_updated", - EffectClaimableBalanceSponsorshipRemoved: "claimable_balance_sponsorship_removed", - EffectSignerSponsorshipCreated: "signer_sponsorship_created", - EffectSignerSponsorshipUpdated: "signer_sponsorship_updated", - EffectSignerSponsorshipRemoved: "signer_sponsorship_removed", - EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", + // unused + // EffectOfferCreated: "offer_created", + // EffectOfferRemoved: "offer_removed", + // EffectOfferUpdated: "offer_updated", + EffectTrade: "trade", + EffectDataCreated: "data_created", + EffectDataRemoved: "data_removed", + EffectDataUpdated: "data_updated", + EffectSequenceBumped: "sequence_bumped", + EffectClaimableBalanceCreated: "claimable_balance_created", + EffectClaimableBalanceClaimed: "claimable_balance_claimed", + EffectClaimableBalanceClaimantCreated: "claimable_balance_claimant_created", + EffectAccountSponsorshipCreated: "account_sponsorship_created", + EffectAccountSponsorshipUpdated: "account_sponsorship_updated", + EffectAccountSponsorshipRemoved: "account_sponsorship_removed", + EffectTrustlineSponsorshipCreated: "trustline_sponsorship_created", + EffectTrustlineSponsorshipUpdated: "trustline_sponsorship_updated", + EffectTrustlineSponsorshipRemoved: "trustline_sponsorship_removed", + EffectDataSponsorshipCreated: "data_sponsorship_created", + EffectDataSponsorshipUpdated: "data_sponsorship_updated", + EffectDataSponsorshipRemoved: "data_sponsorship_removed", + EffectClaimableBalanceSponsorshipCreated: "claimable_balance_sponsorship_created", + EffectClaimableBalanceSponsorshipUpdated: "claimable_balance_sponsorship_updated", + EffectClaimableBalanceSponsorshipRemoved: "claimable_balance_sponsorship_removed", + EffectSignerSponsorshipCreated: "signer_sponsorship_created", + EffectSignerSponsorshipUpdated: "signer_sponsorship_updated", + EffectSignerSponsorshipRemoved: "signer_sponsorship_removed", + EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", } // Base provides the common structure for any effect resource effect. diff --git a/services/horizon/internal/db2/history/main.go b/services/horizon/internal/db2/history/main.go index e5ac0903e5..4da6945006 100644 --- a/services/horizon/internal/db2/history/main.go +++ b/services/horizon/internal/db2/history/main.go @@ -97,14 +97,13 @@ const ( // trading effects + // unused // EffectOfferCreated occurs when an account offers to trade an asset - EffectOfferCreated EffectType = 30 // from manage_offer, creat_passive_offer - + // EffectOfferCreated EffectType = 30 // from manage_offer, creat_passive_offer // EffectOfferRemoved occurs when an account removes an offer - EffectOfferRemoved EffectType = 31 // from manage_offer, create_passive_offer, path_payment - + // EffectOfferRemoved EffectType = 31 // from manage_offer, create_passive_offer, path_payment // EffectOfferUpdated occurs when an offer is updated by the offering account. - EffectOfferUpdated EffectType = 32 // from manage_offer, creat_passive_offer, path_payment + // EffectOfferUpdated EffectType = 32 // from manage_offer, creat_passive_offer, path_payment // EffectTrade occurs when a trade is initiated because of a path payment or // offer operation. diff --git a/services/horizon/internal/resourceadapter/effects.go b/services/horizon/internal/resourceadapter/effects.go index 9a8121ff07..ab9fdc9867 100644 --- a/services/horizon/internal/resourceadapter/effects.go +++ b/services/horizon/internal/resourceadapter/effects.go @@ -29,33 +29,34 @@ var EffectTypeNames = map[history.EffectType]string{ history.EffectTrustlineAuthorizedToMaintainLiabilities: "trustline_authorized_to_maintain_liabilities", history.EffectTrustlineDeauthorized: "trustline_deauthorized", history.EffectTrustlineFlagsUpdated: "trustline_flags_updated", - history.EffectOfferCreated: "offer_created", - history.EffectOfferRemoved: "offer_removed", - history.EffectOfferUpdated: "offer_updated", - history.EffectTrade: "trade", - history.EffectDataCreated: "data_created", - history.EffectDataRemoved: "data_removed", - history.EffectDataUpdated: "data_updated", - history.EffectSequenceBumped: "sequence_bumped", - history.EffectClaimableBalanceCreated: "claimable_balance_created", - history.EffectClaimableBalanceClaimantCreated: "claimable_balance_claimant_created", - history.EffectClaimableBalanceClaimed: "claimable_balance_claimed", - history.EffectAccountSponsorshipCreated: "account_sponsorship_created", - history.EffectAccountSponsorshipUpdated: "account_sponsorship_updated", - history.EffectAccountSponsorshipRemoved: "account_sponsorship_removed", - history.EffectTrustlineSponsorshipCreated: "trustline_sponsorship_created", - history.EffectTrustlineSponsorshipUpdated: "trustline_sponsorship_updated", - history.EffectTrustlineSponsorshipRemoved: "trustline_sponsorship_removed", - history.EffectDataSponsorshipCreated: "data_sponsorship_created", - history.EffectDataSponsorshipUpdated: "data_sponsorship_updated", - history.EffectDataSponsorshipRemoved: "data_sponsorship_removed", - history.EffectClaimableBalanceSponsorshipCreated: "claimable_balance_sponsorship_created", - history.EffectClaimableBalanceSponsorshipUpdated: "claimable_balance_sponsorship_updated", - history.EffectClaimableBalanceSponsorshipRemoved: "claimable_balance_sponsorship_removed", - history.EffectSignerSponsorshipCreated: "signer_sponsorship_created", - history.EffectSignerSponsorshipUpdated: "signer_sponsorship_updated", - history.EffectSignerSponsorshipRemoved: "signer_sponsorship_removed", - history.EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", + // unused + // history.EffectOfferCreated: "offer_created", + // history.EffectOfferRemoved: "offer_removed", + // history.EffectOfferUpdated: "offer_updated", + history.EffectTrade: "trade", + history.EffectDataCreated: "data_created", + history.EffectDataRemoved: "data_removed", + history.EffectDataUpdated: "data_updated", + history.EffectSequenceBumped: "sequence_bumped", + history.EffectClaimableBalanceCreated: "claimable_balance_created", + history.EffectClaimableBalanceClaimantCreated: "claimable_balance_claimant_created", + history.EffectClaimableBalanceClaimed: "claimable_balance_claimed", + history.EffectAccountSponsorshipCreated: "account_sponsorship_created", + history.EffectAccountSponsorshipUpdated: "account_sponsorship_updated", + history.EffectAccountSponsorshipRemoved: "account_sponsorship_removed", + history.EffectTrustlineSponsorshipCreated: "trustline_sponsorship_created", + history.EffectTrustlineSponsorshipUpdated: "trustline_sponsorship_updated", + history.EffectTrustlineSponsorshipRemoved: "trustline_sponsorship_removed", + history.EffectDataSponsorshipCreated: "data_sponsorship_created", + history.EffectDataSponsorshipUpdated: "data_sponsorship_updated", + history.EffectDataSponsorshipRemoved: "data_sponsorship_removed", + history.EffectClaimableBalanceSponsorshipCreated: "claimable_balance_sponsorship_created", + history.EffectClaimableBalanceSponsorshipUpdated: "claimable_balance_sponsorship_updated", + history.EffectClaimableBalanceSponsorshipRemoved: "claimable_balance_sponsorship_removed", + history.EffectSignerSponsorshipCreated: "signer_sponsorship_created", + history.EffectSignerSponsorshipUpdated: "signer_sponsorship_updated", + history.EffectSignerSponsorshipRemoved: "signer_sponsorship_removed", + history.EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", } // NewEffect creates a new effect resource from the provided database representation @@ -247,6 +248,9 @@ func NewEffect( e := effects.ClaimableBalanceClawedBack{Base: basev} err = row.UnmarshalDetails(&e) result = e + case history.EffectAccountRemoved: + // there is no explicit data structure for account removed + fallthrough default: result = basev } diff --git a/services/horizon/internal/resourceadapter/effects_test.go b/services/horizon/internal/resourceadapter/effects_test.go index 794dba41be..3e95a329bd 100644 --- a/services/horizon/internal/resourceadapter/effects_test.go +++ b/services/horizon/internal/resourceadapter/effects_test.go @@ -1,6 +1,7 @@ package resourceadapter import ( + "context" "encoding/json" "testing" @@ -12,6 +13,45 @@ import ( "github.com/stretchr/testify/assert" ) +func TestNewEffectAllEffectsCovered(t *testing.T) { + for typ, s := range EffectTypeNames { + if typ == history.EffectAccountRemoved || typ == history.EffectAccountInflationDestinationUpdated { + // these effects use the base representation + continue + } + e := history.Effect{ + Type: typ, + } + result, err := NewEffect(context.TODO(), e, history.Ledger{}) + assert.NoError(t, err, s) + // it shouldn't be a base type + _, ok := result.(effects.Base) + assert.False(t, ok, s) + } + + // verify that the check works for an unknown effect + e := history.Effect{ + Type: 20000, + } + result, err := NewEffect(context.TODO(), e, history.Ledger{}) + assert.NoError(t, err) + _, ok := result.(effects.Base) + assert.True(t, ok) +} + +func TestEffectTypeNamesAreConsistentWithAdapterTypeNames(t *testing.T) { + for typ, s := range EffectTypeNames { + s2, ok := effects.EffectTypeNames[effects.EffectType(typ)] + assert.True(t, ok, s) + assert.Equal(t, s, s2) + } + for typ, s := range effects.EffectTypeNames { + s2, ok := EffectTypeNames[history.EffectType(typ)] + assert.True(t, ok, s) + assert.Equal(t, s, s2) + } +} + func TestNewEffect_EffectTrustlineAuthorizedToMaintainLiabilities(t *testing.T) { tt := assert.New(t) ctx, _ := test.ContextWithLogBuffer() From 0d2f10160a0c5f4b26f32317c2e4ed882a4ab9d0 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 26 Apr 2021 23:17:10 +0200 Subject: [PATCH 16/67] services/horizon: Test full coverage of operation type switches (#3560) --- protocols/horizon/operations/main_test.go | 32 +++++ services/horizon/internal/codes/main_test.go | 28 ++++ .../processors/effects_processor_test.go | 55 ++++++++ ...stats_ledger_transaction_processor_test.go | 33 +++++ .../transaction_operation_wrapper_test.go | 120 ++++++++++++++++++ .../resourceadapter/operations_test.go | 24 ++++ xdr/main.go | 2 + 7 files changed, 294 insertions(+) create mode 100644 protocols/horizon/operations/main_test.go diff --git a/protocols/horizon/operations/main_test.go b/protocols/horizon/operations/main_test.go new file mode 100644 index 0000000000..b08a0d5f25 --- /dev/null +++ b/protocols/horizon/operations/main_test.go @@ -0,0 +1,32 @@ +package operations + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/stellar/go/xdr" +) + +func TestTypeNamesAllCovered(t *testing.T) { + for typ, s := range xdr.OperationTypeToStringMap { + _, ok := TypeNames[xdr.OperationType(typ)] + assert.True(t, ok, s) + } +} + +func TestUnmarshalOperationAllCovered(t *testing.T) { + mistmatchErr := errors.New("Invalid operation format, unable to unmarshal json response") + for typ, s := range xdr.OperationTypeToStringMap { + _, err := UnmarshalOperation(typ, []byte{}) + assert.Error(t, err, s) + // it should be a parsing error, not the default branch + assert.NotEqual(t, mistmatchErr, err, s) + } + + // make sure the check works for an unknown operation type + _, err := UnmarshalOperation(200000, []byte{}) + assert.Error(t, err) + assert.Equal(t, mistmatchErr, err) +} diff --git a/services/horizon/internal/codes/main_test.go b/services/horizon/internal/codes/main_test.go index 152832c803..1dae4d3280 100644 --- a/services/horizon/internal/codes/main_test.go +++ b/services/horizon/internal/codes/main_test.go @@ -7,6 +7,34 @@ import ( "github.com/stretchr/testify/assert" ) +func TestForOperationResultCoversForAllOpTypes(t *testing.T) { + for typ, s := range xdr.OperationTypeToStringMap { + result := xdr.OperationResult{ + Code: xdr.OperationResultCodeOpInner, + Tr: &xdr.OperationResultTr{ + Type: xdr.OperationType(typ), + }, + } + f := func() { + ForOperationResult(result) + } + // it must panic because the operation result is not set + assert.Panics(t, f, s) + } + // make sure the check works for an unknown operation type + result := xdr.OperationResult{ + Code: xdr.OperationResultCodeOpInner, + Tr: &xdr.OperationResultTr{ + Type: xdr.OperationType(200000), + }, + } + f := func() { + ForOperationResult(result) + } + // it doesn't panic because it doesn't branch out into the operation type + assert.NotPanics(t, f) +} + func TestString(t *testing.T) { tests := []struct { Input interface{} diff --git a/services/horizon/internal/ingest/processors/effects_processor_test.go b/services/horizon/internal/ingest/processors/effects_processor_test.go index 977fa37363..0b0da1049f 100644 --- a/services/horizon/internal/ingest/processors/effects_processor_test.go +++ b/services/horizon/internal/ingest/processors/effects_processor_test.go @@ -426,6 +426,61 @@ func getRevokeSponsorshipMeta(t *testing.T) (string, []effect) { return b64, expectedEffects } +func TestEffectsCoversAllOperationTypes(t *testing.T) { + for typ, s := range xdr.OperationTypeToStringMap { + op := xdr.Operation{ + Body: xdr.OperationBody{ + Type: xdr.OperationType(typ), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling effects should either panic (because the operation field is set to nil) + // or not error + func() { + var err error + defer func() { + err2 := recover() + if err != nil { + assert.NotContains(t, err.Error(), "Unknown operation type") + } + assert.True(t, err2 != nil || err == nil, s) + }() + _, err = operation.effects() + }() + } + + // make sure the check works for an unknown operation type + op := xdr.Operation{ + Body: xdr.OperationBody{ + Type: xdr.OperationType(20000), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling effects should error due to the unknown operation + _, err := operation.effects() + assert.Contains(t, err.Error(), "Unknown operation type") +} + func TestOperationEffects(t *testing.T) { sourceAID := xdr.MustAddress("GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V") diff --git a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go index 0d6da1e7bd..ef4f15ce61 100644 --- a/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go +++ b/services/horizon/internal/ingest/processors/stats_ledger_transaction_processor_test.go @@ -10,6 +10,39 @@ import ( "github.com/stellar/go/xdr" ) +func TestStatsLedgerTransactionProcessoAllOpTypesCovered(t *testing.T) { + txTemplate := ingest.LedgerTransaction{ + Envelope: xdr.TransactionEnvelope{ + Type: xdr.EnvelopeTypeEnvelopeTypeTx, + V1: &xdr.TransactionV1Envelope{ + Tx: xdr.Transaction{ + Operations: []xdr.Operation{ + {Body: xdr.OperationBody{Type: 0}}, + }, + }, + }, + }, + } + for typ, s := range xdr.OperationTypeToStringMap { + tx := txTemplate + txTemplate.Envelope.V1.Tx.Operations[0].Body.Type = xdr.OperationType(typ) + f := func() { + var p StatsLedgerTransactionProcessor + p.ProcessTransaction(context.Background(), tx) + } + assert.NotPanics(t, f, s) + } + + // make sure the check works for an unreasonable operation type + tx := txTemplate + txTemplate.Envelope.V1.Tx.Operations[0].Body.Type = 20000 + f := func() { + var p StatsLedgerTransactionProcessor + p.ProcessTransaction(context.Background(), tx) + } + assert.Panics(t, f) +} + func TestStatsLedgerTransactionProcessor(t *testing.T) { processor := &StatsLedgerTransactionProcessor{} diff --git a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go index 054c56dab1..8979047d24 100644 --- a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go +++ b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go @@ -1608,3 +1608,123 @@ func (s *SetTrustLineFlagsTestSuite) TestParticipants() { func TestSetTrustLineFlagsTestSuite(t *testing.T) { suite.Run(t, new(SetTrustLineFlagsTestSuite)) } + +func TestParticipantsCoversAllOperationTypes(t *testing.T) { + source := xdr.MustMuxedAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") + for typ, s := range xdr.OperationTypeToStringMap { + op := xdr.Operation{ + SourceAccount: &source, + Body: xdr.OperationBody{ + Type: xdr.OperationType(typ), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling Participants should either panic (because the operation field is set to nil) + // or not error + func() { + var err error + defer func() { + err2 := recover() + if err != nil { + assert.NotContains(t, err.Error(), "Unknown operation type") + } + assert.True(t, err2 != nil || err == nil, s) + }() + _, err = operation.Participants() + }() + } + + // make sure the check works for an unknown operation type + op := xdr.Operation{ + SourceAccount: &source, + Body: xdr.OperationBody{ + Type: xdr.OperationType(20000), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling Participants should error due to the unknown operation + _, err := operation.Participants() + assert.Contains(t, err.Error(), "Unknown operation type") +} + +func TestDetailsCoversAllOperationTypes(t *testing.T) { + source := xdr.MustMuxedAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") + for typ, s := range xdr.OperationTypeToStringMap { + op := xdr.Operation{ + SourceAccount: &source, + Body: xdr.OperationBody{ + Type: xdr.OperationType(typ), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling Details should either panic (because the operation field is set to nil) + // or not error + func() { + var err error + defer func() { + err2 := recover() + if err2 != nil { + if err3, ok := err2.(error); ok { + assert.NotContains(t, "Unknown operation type", err3.Error()) + } + } + assert.True(t, err2 != nil || err == nil, s) + }() + _, err = operation.Details() + }() + } + + // make sure the check works for an unknown operation type + op := xdr.Operation{ + SourceAccount: &source, + Body: xdr.OperationBody{ + Type: xdr.OperationType(20000), + }, + } + operation := transactionOperationWrapper{ + index: 0, + transaction: ingest.LedgerTransaction{ + UnsafeMeta: xdr.TransactionMeta{ + V: 2, + V2: &xdr.TransactionMetaV2{}, + }, + }, + operation: op, + ledgerSequence: 1, + } + // calling Details should panic with unknown operation type + f := func() { + operation.Details() + } + assert.PanicsWithError(t, "Unknown operation type: ", f) +} diff --git a/services/horizon/internal/resourceadapter/operations_test.go b/services/horizon/internal/resourceadapter/operations_test.go index b85d0a7d18..a1248305f3 100644 --- a/services/horizon/internal/resourceadapter/operations_test.go +++ b/services/horizon/internal/resourceadapter/operations_test.go @@ -1,6 +1,7 @@ package resourceadapter import ( + "context" "encoding/json" "testing" @@ -12,6 +13,29 @@ import ( "github.com/stretchr/testify/assert" ) +func TestNewOperationAllTypesCovered(t *testing.T) { + for typ, s := range xdr.OperationTypeToStringMap { + row := history.Operation{ + Type: xdr.OperationType(typ), + } + op, err := NewOperation(context.Background(), row, "foo", &history.Transaction{}, history.Ledger{}) + assert.NoError(t, err, s) + // if we got a base type, the operation is not covered + if _, ok := op.(operations.Base); ok { + assert.Fail(t, s) + } + } + + // make sure the check works for an unreasonable operation type + row := history.Operation{ + Type: xdr.OperationType(200000), + } + op, err := NewOperation(context.Background(), row, "foo", &history.Transaction{}, history.Ledger{}) + assert.NoError(t, err) + assert.IsType(t, op, operations.Base{}) + +} + // TestPopulateOperation_Successful tests operation object population. func TestPopulateOperation_Successful(t *testing.T) { ctx, _ := test.ContextWithLogBuffer() diff --git a/xdr/main.go b/xdr/main.go index de80952918..220eb29d5c 100644 --- a/xdr/main.go +++ b/xdr/main.go @@ -23,6 +23,8 @@ type Keyer interface { var _ = LedgerEntry{} var _ = LedgerKey{} +var OperationTypeToStringMap = operationTypeMap + func Uint32Ptr(val uint32) *Uint32 { pval := Uint32(val) return &pval From 783eeb659e47879bbd09ca243e7797aad7099172 Mon Sep 17 00:00:00 2001 From: Jacek Nykis Date: Tue, 27 Apr 2021 12:07:32 +0100 Subject: [PATCH 17/67] Switch ticker to ubuntu 20.04 base --- services/ticker/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/ticker/docker/Dockerfile b/services/ticker/docker/Dockerfile index d2dcd5e458..327ce8578d 100644 --- a/services/ticker/docker/Dockerfile +++ b/services/ticker/docker/Dockerfile @@ -5,9 +5,9 @@ WORKDIR /src/ticker RUN go build -o /bin/ticker ./services/ticker -FROM ubuntu:18.04 +FROM ubuntu:20.04 -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/ticker /app/ EXPOSE 8000 ENTRYPOINT ["/app/ticker"] From 88ff3ee53aad7870ed6eed64db26fe42aa63a7eb Mon Sep 17 00:00:00 2001 From: Jacek Nykis Date: Tue, 27 Apr 2021 12:09:43 +0100 Subject: [PATCH 18/67] Switch webauth to ubuntu 20.04 base --- exp/services/webauth/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exp/services/webauth/docker/Dockerfile b/exp/services/webauth/docker/Dockerfile index b9e29aee5c..20b0591ac1 100644 --- a/exp/services/webauth/docker/Dockerfile +++ b/exp/services/webauth/docker/Dockerfile @@ -5,9 +5,9 @@ WORKDIR /src/webauth RUN go build -o /bin/webauth ./exp/services/webauth -FROM ubuntu:18.04 +FROM ubuntu:20.04 -RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/webauth /app/ EXPOSE 8000 ENTRYPOINT ["/app/webauth"] From 163b47780d9a9d331a1af222732398ca0b082ee1 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Tue, 27 Apr 2021 18:14:11 +0200 Subject: [PATCH 19/67] Remove unused test scenarios (#3573) --- .../test/scenarios/allow_trust-core.sql | 753 ----------- .../test/scenarios/allow_trust-horizon.sql | 1007 --------------- .../internal/test/scenarios/allow_trust.rb | 22 - .../scenarios/asset_stat_account-core.sql | 739 ----------- .../scenarios/asset_stat_account-horizon.sql | 997 -------------- .../test/scenarios/asset_stat_account.rb | 23 - .../scenarios/asset_stat_operations-core.sql | 733 ----------- .../asset_stat_operations-horizon.sql | 982 -------------- .../test/scenarios/asset_stat_operations.rb | 34 - .../asset_stat_trustlines_1-core.sql | 724 ----------- .../asset_stat_trustlines_1-horizon.sql | 955 -------------- .../test/scenarios/asset_stat_trustlines_1.rb | 10 - .../asset_stat_trustlines_2-core.sql | 728 ----------- .../asset_stat_trustlines_2-horizon.sql | 961 -------------- .../test/scenarios/asset_stat_trustlines_2.rb | 13 - .../asset_stat_trustlines_3-core.sql | 727 ----------- .../asset_stat_trustlines_3-horizon.sql | 962 -------------- .../test/scenarios/asset_stat_trustlines_3.rb | 11 - .../asset_stat_trustlines_4-core.sql | 727 ----------- .../asset_stat_trustlines_4-horizon.sql | 962 -------------- .../test/scenarios/asset_stat_trustlines_4.rb | 11 - .../asset_stat_trustlines_5-core.sql | 728 ----------- .../asset_stat_trustlines_5-horizon.sql | 964 -------------- .../test/scenarios/asset_stat_trustlines_5.rb | 13 - .../asset_stat_trustlines_6-core.sql | 728 ----------- .../asset_stat_trustlines_6-horizon.sql | 964 -------------- .../test/scenarios/asset_stat_trustlines_6.rb | 14 - .../asset_stat_trustlines_7-core.sql | 738 ----------- .../asset_stat_trustlines_7-horizon.sql | 988 -------------- .../test/scenarios/asset_stat_trustlines_7.rb | 20 - .../internal/test/scenarios/bindata.go | 970 +------------- .../test/scenarios/change_trust-core.sql | 733 ----------- .../test/scenarios/change_trust-horizon.sql | 966 -------------- .../internal/test/scenarios/change_trust.rb | 14 - .../core_database_schema_version_8-core.sql | 222 ---- .../core_database_schema_version_9-core.sql | 227 ---- .../internal/test/scenarios/kahuna-2-core.sql | 727 ----------- .../test/scenarios/kahuna-2-horizon.sql | 951 -------------- .../internal/test/scenarios/kahuna-2.rb | 44 - .../scenarios/non_native_payment-core.sql | 738 ----------- .../scenarios/non_native_payment-horizon.sql | 988 -------------- .../test/scenarios/non_native_payment.rb | 22 - .../test/scenarios/order_books-core.sql | 786 ----------- .../test/scenarios/order_books-horizon.sql | 1065 --------------- .../internal/test/scenarios/order_books.rb | 45 - .../test/scenarios/order_books_310-core.sql | 847 ------------ .../scenarios/order_books_310-horizon.sql | 1148 ----------------- .../test/scenarios/order_books_310.rb | 66 - .../test/scenarios/self_send-core.sql | 720 ----------- .../test/scenarios/self_send-horizon.sql | 944 -------------- .../internal/test/scenarios/self_send.rb | 11 - .../test/scenarios/send_to_issuer-core.sql | 732 ----------- .../test/scenarios/send_to_issuer-horizon.sql | 973 -------------- .../internal/test/scenarios/send_to_issuer.rb | 20 - .../test/scenarios/set_options-core.sql | 758 ----------- .../test/scenarios/set_options-horizon.sql | 1005 --------------- .../internal/test/scenarios/set_options.rb | 21 - 57 files changed, 48 insertions(+), 32933 deletions(-) delete mode 100644 services/horizon/internal/test/scenarios/allow_trust-core.sql delete mode 100644 services/horizon/internal/test/scenarios/allow_trust-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/allow_trust.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_account-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_account-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_account.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_operations-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_operations-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_operations.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_1-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_1-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_1.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_2-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_2-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_2.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_3-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_3-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_3.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_4-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_4-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_4.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_5-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_5-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_5.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_6-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_6-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_6.rb delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_7-core.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_7-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/asset_stat_trustlines_7.rb delete mode 100644 services/horizon/internal/test/scenarios/change_trust-core.sql delete mode 100644 services/horizon/internal/test/scenarios/change_trust-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/change_trust.rb delete mode 100644 services/horizon/internal/test/scenarios/core_database_schema_version_8-core.sql delete mode 100644 services/horizon/internal/test/scenarios/core_database_schema_version_9-core.sql delete mode 100644 services/horizon/internal/test/scenarios/kahuna-2-core.sql delete mode 100644 services/horizon/internal/test/scenarios/kahuna-2-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/kahuna-2.rb delete mode 100644 services/horizon/internal/test/scenarios/non_native_payment-core.sql delete mode 100644 services/horizon/internal/test/scenarios/non_native_payment-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/non_native_payment.rb delete mode 100644 services/horizon/internal/test/scenarios/order_books-core.sql delete mode 100644 services/horizon/internal/test/scenarios/order_books-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/order_books.rb delete mode 100644 services/horizon/internal/test/scenarios/order_books_310-core.sql delete mode 100644 services/horizon/internal/test/scenarios/order_books_310-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/order_books_310.rb delete mode 100644 services/horizon/internal/test/scenarios/self_send-core.sql delete mode 100644 services/horizon/internal/test/scenarios/self_send-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/self_send.rb delete mode 100644 services/horizon/internal/test/scenarios/send_to_issuer-core.sql delete mode 100644 services/horizon/internal/test/scenarios/send_to_issuer-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/send_to_issuer.rb delete mode 100644 services/horizon/internal/test/scenarios/set_options-core.sql delete mode 100644 services/horizon/internal/test/scenarios/set_options-horizon.sql delete mode 100644 services/horizon/internal/test/scenarios/set_options.rb diff --git a/services/horizon/internal/test/scenarios/allow_trust-core.sql b/services/horizon/internal/test/scenarios/allow_trust-core.sql deleted file mode 100644 index e5b80c072a..0000000000 --- a/services/horizon/internal/test/scenarios/allow_trust-core.sql +++ /dev/null @@ -1,753 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999969999999700, 3, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999500, 8589934597, 0, NULL, '', 'AQAAAA==', 3, 8, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('6baec8d27b7cd6fd51f52d29177ab7091add263fa44d66266ffb954e0ebf17e9', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '23f6f5243a4e5db5fc67196fdb701e8c1c2b433f2fed5822408028472d9464d5', 2, 1559579749, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZU7nPOoI7SirHEO1Sa67WumwKQ62PpQGlvJvyyQ8QGEYAAAAAXPVMZQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAj6+p+aI7JvbSfHisaUUAXhzcG+/2YWJE2bnf4zuV8i4j9vUkOk5dtfxnGW/bcB6MHCtDPy/tWCJAgChHLZRk1QAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('5478ec2487f0f1288bd06885075187168de8ceaa2bf49b61f5b0dd16fd15c8d3', '6baec8d27b7cd6fd51f52d29177ab7091add263fa44d66266ffb954e0ebf17e9', '7f075212d3a0fed1c81d3e8237f52b28a28516ee8bae8f4eec95c2ffc081572f', 3, 1559579750, 'AAAAC2uuyNJ7fNb9UfUtKRd6twka3SY/pE1mJm/7lU4OvxfphWD90LNKVE27wGnXgnm8lMvOHfDLez+LD6lekshRaMAAAAAAXPVMZgAAAAAAAAAATlvjBWe7MinR9n7UosajCKxUpgQMBBbhmF6bHAvPHGV/B1IS06D+0cgdPoI39SsoooUW7ouuj07slcL/wIFXLwAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('0bf3a200e3c6780dc6959a968663f18b028cbaa6c9b3dc75acdc786ad6393578', '5478ec2487f0f1288bd06885075187168de8ceaa2bf49b61f5b0dd16fd15c8d3', 'd79767593cf88e66f790741443a68bb7180323e8b0ba96c47dc3fb10d2141c1a', 4, 1559579751, 'AAAAC1R47CSH8PEoi9BohQdRhxaN6M6qK/SbYfWw3Rb9FcjT42xySXzEXCxN+8wF0VV0djkKp9z/N6Rzeh8Y3xY2sQgAAAAAXPVMZwAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPDXl2dZPPiOZveQdBRDpou3GAMj6LC6lsR9w/sQ0hQcGgAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('18a40e55f50102d4dee5b09a22f5548e65352c7e7a34c8fe6f39751e8f147c66', '0bf3a200e3c6780dc6959a968663f18b028cbaa6c9b3dc75acdc786ad6393578', '504bd637c5d4decfcbdf1fa128a75e4616cabca352b3fe8ac991a6c3a9f79dc1', 5, 1559579752, 'AAAACwvzogDjxngNxpWaloZj8YsCjLqmybPcdazceGrWOTV4fTokoMnHd2mbTjn+EpjK1E1Nhy96TB9Tru0p92TQ3DIAAAAAXPVMaAAAAAAAAAAAxlJuyWie0d1LzUCR1K4LD2g+0KuAHvbJ+SgmGHyguLVQS9Y3xdTez8vfH6Eop15GFsq8o1Kz/orJkabDqfedwQAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('5f341eddfb0f2a46317a399bab66b03ece78082891716e9d0e5532a1234cb00c', '18a40e55f50102d4dee5b09a22f5548e65352c7e7a34c8fe6f39751e8f147c66', '7f8143b022e85052652ba8a4db115886ea9f1bf646c103bcd61c490736f0e41c', 6, 1559579753, 'AAAACxikDlX1AQLU3uWwmiL1VI5lNSx+ejTI/m85dR6PFHxmuXzNyzH8ehpU2xSNT+qW+zBhR6vOC7kqgpgmqXr023wAAAAAXPVMaQAAAAAAAAAAFp2fvkMO7OW+Jq1zFYvyIp0pN6KM6DetMmxOjZVOCKd/gUOwIuhQUmUrqKTbEViG6p8b9kbBA7zWHEkHNvDkHAAAAAYN4Lazp2QAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('609d9d97b1a8b02deb8d5ee5831d9c8c04a0089a1fd34ef5cfde9c604d9fe715', '5f341eddfb0f2a46317a399bab66b03ece78082891716e9d0e5532a1234cb00c', '284ec247599bcccaeaa0e4093d4225753f55ae45ba69278f1c6463990f94f6e6', 7, 1559579754, 'AAAAC180Ht37DypGMXo5m6tmsD7OeAgokXFunQ5VMqEjTLAM/BtWb8A5xj0T4ezCfoxv6QEiZ4EnxHPyiUPvpquGnLkAAAAAXPVMagAAAAAAAAAA2F0xW7K6lNYrXRzu7d5HyBUnPlumNFQipNBwSQNAx1IoTsJHWZvMyuqg5Ak9QiV1P1WuRbppJ48cZGOZD5T25gAAAAcN4Lazp2QAAAAAAAAAAAOEAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('2f255f04551f6afeea21a0974313303f6664b0d47a1135d53eccc6a15b5033f3', '609d9d97b1a8b02deb8d5ee5831d9c8c04a0089a1fd34ef5cfde9c604d9fe715', 'bd21bbb78e05efba24d017105ef7b94c8224db355fab3177c41beb4056410281', 8, 1559579755, 'AAAAC2CdnZexqLAt641e5YMdnIwEoAiaH9NO9c/enGBNn+cVOp8HkEvM+k++maYD2SHmOqh+h77YyP7hd5pc5bdDuxgAAAAAXPVMawAAAAAAAAAA17tytOKBxgu8yeo5X/akyYnyYlyrUb7gJWE+zfCgC2C9Ibu3jgXvuiTQFxBe97lMgiTbNV+rMXfEG+tAVkECgQAAAAgN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('e28639230b548f9da67603a89665b61fb23f5301974a58bc50fac7daaa37ba32', '2f255f04551f6afeea21a0974313303f6664b0d47a1135d53eccc6a15b5033f3', 'bd21bbb78e05efba24d017105ef7b94c8224db355fab3177c41beb4056410281', 9, 1559579756, 'AAAACy8lXwRVH2r+6iGgl0MTMD9mZLDUehE11T7MxqFbUDPzAmndzDaKyOupQT763G1TTS131dtwNuiESSWEa7BENWcAAAAAXPVMbAAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERm9Ibu3jgXvuiTQFxBe97lMgiTbNV+rMXfEG+tAVkECgQAAAAkN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 2, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAIAAAACAAAAAQAAAEhTuc86gjtKKscQ7VJrrta6bApDrY+lAaW8m/LJDxAYRgAAAABc9UxlAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABA048MiD8z7p62LLFZD1GTT+c0yKknMssLhGpo3DidqzP5UgsS2zBtQ+SMxQXwDf89RqKcru8J8CXbVLpyTw9rBA=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 3, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAMAAAACAAAAAQAAADCFYP3Qs0pUTbvAadeCebyUy84d8Mt7P4sPqV6SyFFowAAAAABc9UxmAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAYdXorGm/ezkwwVHLWbCf3cqXIdBpYMLHHlubY2QafElyd+Nmf2jrRWP4tuYkOxgvWmc98t5995qzk+VR1KHdBQ=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 4, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAQAAAACAAAAAQAAADDjbHJJfMRcLE37zAXRVXR2OQqn3P83pHN6HxjfFjaxCAAAAABc9UxnAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAdYPAZZMhRz2CYSO4c2CirU4KGZ5jeqUC04RYWRPkK3yzpIMWzRwZ00cTusK2432gf5VSLcOuTrDpsV0mWGoiAA=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 5, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAUAAAACAAAAAQAAADB9OiSgycd3aZtOOf4SmMrUTU2HL3pMH1Ou7Sn3ZNDcMgAAAABc9UxoAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAjMfdYVGbwFYJgN7qPqvS7/wURcD7aF/buKNa98M1bg8hTozh3d2HxWOkLYlItGgq1hZyvRIsSS6VjxJeZSFEAQ=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 6, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAYAAAACAAAAAQAAADC5fM3LMfx6GlTbFI1P6pb7MGFHq84LuSqCmCapevTbfAAAAABc9UxpAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAi3p6s80itjHTpvvZ28WhuY0FkXbnPpHmjHYWTko5RDv+p4GJ026w6IzldrC1YsaMF/LTKETRCY5bRHPcuSmOAg=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 7, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAcAAAACAAAAAQAAADD8G1ZvwDnGPRPh7MJ+jG/pASJngSfEc/KJQ++mq4acuQAAAABc9UxqAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAe5T2wcVv+vsBjOgYzSoEiigW6G7SSMklZl0RNph2rBtiP4eYCJvykoINYXfJ/GZanAyqyxukiPWt1QhntkQQDQ=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 8, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAgAAAACAAAAAQAAADA6nweQS8z6T76ZpgPZIeY6qH6HvtjI/uF3mlzlt0O7GAAAAABc9UxrAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAAq0rGe5ZC/OIJQQUmttl+ubIo6N/k363+4lSgFohDVpx4USQewACJnw8wcIjHqVVWgPKVYsk7GQwvWuDgQcrDg=='); -INSERT INTO scphistory VALUES ('GCZ2ERNZMGKRSTYIUYAA3ZXSSHBQ7MHLHFJBBQIHH6SVYBFXOKW7RHB7', 9, 'AAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAAAAAAkAAAACAAAAAQAAADACad3MNorI66lBPvrcbVNNLXfV23A26IRJJYRrsEQ1ZwAAAABc9UxsAAAAAAAAAAAAAAABdicUkRziBK+Q9bThB+84NSbIJ1VZ+rH5Tx4qsDZBhn0AAABAebfHp0UDQm/+bC5F9he9/FwU3+0Z0HaVsZCpGR8bsiiH/cLrX9hIUzdKDfsvEbEYc7WSph0vKLaa/4Sz5ZkgAg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('762714911ce204af90f5b4e107ef383526c8275559fab1f94f1e2ab03641867d', 9, 'AAAAAQAAAAEAAAAAs6JFuWGVGU8IpgAN5vKRww+w6zlSEMEHP6VcBLdyrfgAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'e28639230b548f9da67603a89665b61fb23f5301974a58bc50fac7daaa37ba32'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 9, - "currentBuckets": [ - { - "curr": "6d8ba01a011be3496c42e8248a2aa003b2225a97ede7cd9486333973624da5fa", - "next": { - "state": 0 - }, - "snap": "047b5ccfa4e01588a70d767ab0643e4abed920b99e72be4c30dca4aa1f40c886" - }, - { - "curr": "012b45a29f46b9d3af33464315aab41bb669037827635dc0e5bc756a41c4bd36", - "next": { - "state": 1, - "output": "fbec47c59d1686a88c806a198dbf3538070f527d7f22942d935c1573fbdbfc89" - }, - "snap": "923189f3817faacbeb3b804fb08c59d21ac6d78fcd1c2e68444bfa6c5eb5dc23" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "923189f3817faacbeb3b804fb08c59d21ac6d78fcd1c2e68444bfa6c5eb5dc23" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACzokW5YZUZTwimAA3m8pHDD7DrOVIQwQc/pVwEt3Kt+AAAAAAAAAAJAAAAA3YnFJEc4gSvkPW04QfvODUmyCdVWfqx+U8eKrA2QYZ9AAAAAQAAAJgCad3MNorI66lBPvrcbVNNLXfV23A26IRJJYRrsEQ1ZwAAAABc9UxsAAAAAAAAAAEAAAAAs6JFuWGVGU8IpgAN5vKRww+w6zlSEMEHP6VcBLdyrfgAAABAulWgr1846GTk8eU1Ni8S/p+EeOw4pORLXn7/ZMabAqzcWpZmTTEre4mXILXtNEJDcyOs2FMtMXv0izKDOUlvAAAAAAEAAACYAmndzDaKyOupQT763G1TTS131dtwNuiESSWEa7BENWcAAAAAXPVMbAAAAAAAAAABAAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAQLpVoK9fOOhk5PHlNTYvEv6fhHjsOKTkS15+/2TGmwKs3FqWZk0xK3uJlyC17TRCQ3MjrNhTLTF79IsygzlJbwAAAABAOZves1hGUNmLeSq/RbOH6phw9TjzKt7G/ZJxzOJITywINPyAFnTPp7e47rq9S8hf7fv7CxdPmosA/xf7E2QnBwAAAACzokW5YZUZTwimAA3m8pHDD7DrOVIQwQc/pVwEt3Kt+AAAAAAAAAAJAAAAAgAAAAEAAAAwAmndzDaKyOupQT763G1TTS131dtwNuiESSWEa7BENWcAAAAAXPVMbAAAAAAAAAAAAAAAAXYnFJEc4gSvkPW04QfvODUmyCdVWfqx+U8eKrA2QYZ9AAAAQHm3x6dFA0Jv/mwuRfYXvfxcFN/tGdB2lbGQqRkfG7Ioh/3C61/YSFM3Sg37LxGxGHO1kqYdLyi2mv+Es+WZIAIAAAABLyVfBFUfav7qIaCXQxMwP2ZksNR6ETXVPszGoVtQM/MAAAAAAAAAAQAAAAEAAAABAAAAALOiRblhlRlPCKYADebykcMPsOs5UhDBBz+lXAS3cq34AAAAAA=='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 0, 1, 6, NULL, NULL); -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 40000000000, 0, 0, 8, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('7a707186a5cc36a0e520548ae511b53896c0391ce166d40da80588cbaae6aa2c', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c6bfdd93f1470df9dfa3ef95d57ba28cecace068d9f2bb040a79ffc7c5d96cb9', 3, 2, 'AAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('b55d768a4e8e712da20efdee0e7d85f02948f9b6fd3ef2daefd3a5a147ecd63d', 5, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3b666a253313fc7a0d241ee28064eec78aaa5ebd0a7c0ae7f85259e80fad029f', 6, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3f2aa00ba539e24ba9c0ba62f50318d8c7180f2d6757cc76e9984055c5e19ff4', 7, 1, 'AAAAAgAAAAMAAAAGAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAMAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3ce9fc1159c25adc62c9686792cd41f06908280b899744057856db33bafe75de', 8, 1, 'AAAAAgAAAAMAAAAHAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAIAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+IMAAAAAgAAAAQAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBdX4R/Ghzq8/r+u8PL+sNriHsS5lW1Vt+9eCe0nnWMNTzMgcUbarePbrpD2gr8DjVumcmpVH9wG2GXtWvwzXoL', 'kIgKxTgV2shEGt0CIKdjHvXqw9V8LoljTqm1ID9hqOQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('7a707186a5cc36a0e520548ae511b53896c0391ce166d40da80588cbaae6aa2c', 3, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEDBhDOsFWP2KCoZuJDRXuiNm0CjgVKLLtdZi/A3OfrCsgvX8izhAllXkRqrXyitSvGo3kQh6V/S/tnQbrYgHQQG', 'enBxhqXMNqDlIFSK5RG1OJbAORzhZtQNqAWIy6rmqiwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c6bfdd93f1470df9dfa3ef95d57ba28cecace068d9f2bb040a79ffc7c5d96cb9', 3, 2, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEBVJkTQTFlpFKoMhcibMpdJ5khR91LY3zPQwv/e5Ov7XIcWKGIv5sDfgyhaK/x5WYWfawNWcc5fMlW7c/PxGOQJ', 'xr/dk/FHDfnfo++V1XuijOys4GjZ8rsECnn/x8XZbLkAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 4, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('b55d768a4e8e712da20efdee0e7d85f02948f9b6fd3ef2daefd3a5a147ecd63d', 5, 1, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAAAAAAFvFIhaAAAAQBlpm/6rv5JvbN2AKUSlH+4idIlX0cM678QXxK+il0u7z3KLORdzKSkLnS5WdLZlAB6iDmoKI5WbydQLktNtDQA=', 'tV12ik6OcS2iDv3uDn2F8ClI+bb9PvLa79OloUfs1j0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3b666a253313fc7a0d241ee28064eec78aaa5ebd0a7c0ae7f85259e80fad029f', 6, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAEAAAAAAAAAAfmQLe8AAABAL6czYFvSBhdVeD4fbXOHuXFa2CDqLpFfc+QJnoiPLt/23YViURGLyfg388FKMKsbNJEgmFsCJjtgl3fj7wr/Aw==', 'O2ZqJTMT/HoNJB7igGTux4qqXr0KfArn+FJZ6A+tAp8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAcAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvi1AAAAAIAAAACAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvi1AAAAAIAAAADAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3f2aa00ba539e24ba9c0ba62f50318d8c7180f2d6757cc76e9984055c5e19ff4', 7, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAEAAAAAAAAAAfmQLe8AAABA1TAQBu/2f7XHs/ctAJ5W7Ytk4jvQBopdO05zkSQoS8piu1mZm/tTvDTXEq/QUufpt/E8NBgKtNpcJXuMv5aPCw==', 'PyqgC6U54kupwLpi9QMY2McYDy1nV8x26ZhAVcXhn/QAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAcAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3ce9fc1159c25adc62c9686792cd41f06908280b899744057856db33bafe75de', 8, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAAAAAAAAAAAAfmQLe8AAABASafHp/zp11tF81MRvbAnx9gQNTXdLW4DmoIofkgoG+jJw/Xj/k+N5WvSjqGrGF33uB6KnD+wAfQIhf0/DlxpBQ==', 'POn8EVnCWtxiyWhnks1B8GkIKAuJl0QFeFbbM7r+dd4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAcAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAACAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAviDAAAAAIAAAAEAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAviDAAAAAIAAAAFAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAHAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAAAAAAEAAAAIAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/allow_trust-horizon.sql b/services/horizon/internal/test/scenarios/allow_trust-horizon.sql deleted file mode 100644 index 5ec29ff811..0000000000 --- a/services/horizon/internal/test/scenarios/allow_trust-horizon.sql +++ /dev/null @@ -1,1007 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 3, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_accounts VALUES (3, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 4, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 34359742465, 1, 24, '{"trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 30064775169, 1, 23, '{"trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 25769807873, 1, 23, '{"trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 21474840577, 1, 20, '{"limit": "4000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179873281, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 6, '{"auth_required_flag": true}'); -INSERT INTO history_effects VALUES (1, 12884910081, 1, 6, '{"auth_revocable_flag": true}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589946881, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 3, 10, '{"weight": 1, "public_key": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (9, 'e28639230b548f9da67603a89665b61fb23f5301974a58bc50fac7daaa37ba32', '2f255f04551f6afeea21a0974313303f6664b0d47a1135d53eccc6a15b5033f3', 0, 0, '2019-06-03 16:35:56', '2019-06-03 16:35:52.453681', '2019-06-03 16:35:52.453681', 38654705664, 16, 1000000000000000000, 1000, 100, 100000000, 1000000, 11, 'AAAACy8lXwRVH2r+6iGgl0MTMD9mZLDUehE11T7MxqFbUDPzAmndzDaKyOupQT763G1TTS131dtwNuiESSWEa7BENWcAAAAAXPVMbAAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERm9Ibu3jgXvuiTQFxBe97lMgiTbNV+rMXfEG+tAVkECgQAAAAkN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); -INSERT INTO history_ledgers VALUES (8, '2f255f04551f6afeea21a0974313303f6664b0d47a1135d53eccc6a15b5033f3', '609d9d97b1a8b02deb8d5ee5831d9c8c04a0089a1fd34ef5cfde9c604d9fe715', 1, 1, '2019-06-03 16:35:55', '2019-06-03 16:35:52.461994', '2019-06-03 16:35:52.461994', 34359738368, 16, 1000000000000000000, 1000, 100, 100000000, 1000000, 11, 'AAAAC2CdnZexqLAt641e5YMdnIwEoAiaH9NO9c/enGBNn+cVOp8HkEvM+k++maYD2SHmOqh+h77YyP7hd5pc5bdDuxgAAAAAXPVMawAAAAAAAAAA17tytOKBxgu8yeo5X/akyYnyYlyrUb7gJWE+zfCgC2C9Ibu3jgXvuiTQFxBe97lMgiTbNV+rMXfEG+tAVkECgQAAAAgN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (7, '609d9d97b1a8b02deb8d5ee5831d9c8c04a0089a1fd34ef5cfde9c604d9fe715', '5f341eddfb0f2a46317a399bab66b03ece78082891716e9d0e5532a1234cb00c', 1, 1, '2019-06-03 16:35:54', '2019-06-03 16:35:52.477905', '2019-06-03 16:35:52.477905', 30064771072, 16, 1000000000000000000, 900, 100, 100000000, 1000000, 11, 'AAAAC180Ht37DypGMXo5m6tmsD7OeAgokXFunQ5VMqEjTLAM/BtWb8A5xj0T4ezCfoxv6QEiZ4EnxHPyiUPvpquGnLkAAAAAXPVMagAAAAAAAAAA2F0xW7K6lNYrXRzu7d5HyBUnPlumNFQipNBwSQNAx1IoTsJHWZvMyuqg5Ak9QiV1P1WuRbppJ48cZGOZD5T25gAAAAcN4Lazp2QAAAAAAAAAAAOEAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (6, '5f341eddfb0f2a46317a399bab66b03ece78082891716e9d0e5532a1234cb00c', '18a40e55f50102d4dee5b09a22f5548e65352c7e7a34c8fe6f39751e8f147c66', 1, 1, '2019-06-03 16:35:53', '2019-06-03 16:35:52.492661', '2019-06-03 16:35:52.492661', 25769803776, 16, 1000000000000000000, 800, 100, 100000000, 1000000, 11, 'AAAACxikDlX1AQLU3uWwmiL1VI5lNSx+ejTI/m85dR6PFHxmuXzNyzH8ehpU2xSNT+qW+zBhR6vOC7kqgpgmqXr023wAAAAAXPVMaQAAAAAAAAAAFp2fvkMO7OW+Jq1zFYvyIp0pN6KM6DetMmxOjZVOCKd/gUOwIuhQUmUrqKTbEViG6p8b9kbBA7zWHEkHNvDkHAAAAAYN4Lazp2QAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (5, '18a40e55f50102d4dee5b09a22f5548e65352c7e7a34c8fe6f39751e8f147c66', '0bf3a200e3c6780dc6959a968663f18b028cbaa6c9b3dc75acdc786ad6393578', 1, 1, '2019-06-03 16:35:52', '2019-06-03 16:35:52.505868', '2019-06-03 16:35:52.505869', 21474836480, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAACwvzogDjxngNxpWaloZj8YsCjLqmybPcdazceGrWOTV4fTokoMnHd2mbTjn+EpjK1E1Nhy96TB9Tru0p92TQ3DIAAAAAXPVMaAAAAAAAAAAAxlJuyWie0d1LzUCR1K4LD2g+0KuAHvbJ+SgmGHyguLVQS9Y3xdTez8vfH6Eop15GFsq8o1Kz/orJkabDqfedwQAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, '0bf3a200e3c6780dc6959a968663f18b028cbaa6c9b3dc75acdc786ad6393578', '5478ec2487f0f1288bd06885075187168de8ceaa2bf49b61f5b0dd16fd15c8d3', 1, 1, '2019-06-03 16:35:51', '2019-06-03 16:35:52.523332', '2019-06-03 16:35:52.523332', 17179869184, 16, 1000000000000000000, 600, 100, 100000000, 1000000, 11, 'AAAAC1R47CSH8PEoi9BohQdRhxaN6M6qK/SbYfWw3Rb9FcjT42xySXzEXCxN+8wF0VV0djkKp9z/N6Rzeh8Y3xY2sQgAAAAAXPVMZwAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPDXl2dZPPiOZveQdBRDpou3GAMj6LC6lsR9w/sQ0hQcGgAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '5478ec2487f0f1288bd06885075187168de8ceaa2bf49b61f5b0dd16fd15c8d3', '6baec8d27b7cd6fd51f52d29177ab7091add263fa44d66266ffb954e0ebf17e9', 2, 2, '2019-06-03 16:35:50', '2019-06-03 16:35:52.538285', '2019-06-03 16:35:52.538285', 12884901888, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAAC2uuyNJ7fNb9UfUtKRd6twka3SY/pE1mJm/7lU4OvxfphWD90LNKVE27wGnXgnm8lMvOHfDLez+LD6lekshRaMAAAAAAXPVMZgAAAAAAAAAATlvjBWe7MinR9n7UosajCKxUpgQMBBbhmF6bHAvPHGV/B1IS06D+0cgdPoI39SsoooUW7ouuj07slcL/wIFXLwAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, '6baec8d27b7cd6fd51f52d29177ab7091add263fa44d66266ffb954e0ebf17e9', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 3, 3, '2019-06-03 16:35:49', '2019-06-03 16:35:52.550865', '2019-06-03 16:35:52.550866', 8589934592, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZU7nPOoI7SirHEO1Sa67WumwKQ62PpQGlvJvyyQ8QGEYAAAAAXPVMZQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAj6+p+aI7JvbSfHisaUUAXhzcG+/2YWJE2bnf4zuV8i4j9vUkOk5dtfxnGW/bcB6MHCtDPy/tWCJAgChHLZRk1QAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 3, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:35:52.581599', '2019-06-03 16:35:52.5816', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 34359742465, 1); -INSERT INTO history_operation_participants VALUES (2, 34359742465, 2); -INSERT INTO history_operation_participants VALUES (3, 30064775169, 1); -INSERT INTO history_operation_participants VALUES (4, 30064775169, 2); -INSERT INTO history_operation_participants VALUES (5, 25769807873, 1); -INSERT INTO history_operation_participants VALUES (6, 25769807873, 3); -INSERT INTO history_operation_participants VALUES (7, 21474840577, 2); -INSERT INTO history_operation_participants VALUES (8, 17179873281, 3); -INSERT INTO history_operation_participants VALUES (9, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (10, 12884910081, 1); -INSERT INTO history_operation_participants VALUES (11, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (12, 8589938689, 1); -INSERT INTO history_operation_participants VALUES (13, 8589942785, 4); -INSERT INTO history_operation_participants VALUES (14, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (15, 8589946881, 2); -INSERT INTO history_operation_participants VALUES (16, 8589946881, 4); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 16, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (34359742465, 34359742464, 1, 7, '{"trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "authorize": false, "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (30064775169, 30064775168, 1, 7, '{"trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "authorize": true, "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (25769807873, 25769807872, 1, 7, '{"trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "authorize": true, "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 6, '{"limit": "4000.0000000", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 5, '{"set_flags": [1], "set_flags_s": ["auth_required"]}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 5, '{"set_flags": [2], "set_flags_s": ["auth_revocable"]}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 34359742464, 2); -INSERT INTO history_transaction_participants VALUES (2, 34359742464, 1); -INSERT INTO history_transaction_participants VALUES (3, 30064775168, 1); -INSERT INTO history_transaction_participants VALUES (4, 30064775168, 2); -INSERT INTO history_transaction_participants VALUES (5, 25769807872, 1); -INSERT INTO history_transaction_participants VALUES (6, 25769807872, 3); -INSERT INTO history_transaction_participants VALUES (7, 21474840576, 2); -INSERT INTO history_transaction_participants VALUES (8, 17179873280, 3); -INSERT INTO history_transaction_participants VALUES (9, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (10, 12884910080, 1); -INSERT INTO history_transaction_participants VALUES (11, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (12, 8589938688, 1); -INSERT INTO history_transaction_participants VALUES (13, 8589942784, 4); -INSERT INTO history_transaction_participants VALUES (14, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (15, 8589946880, 4); -INSERT INTO history_transaction_participants VALUES (16, 8589946880, 2); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 16, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('3ce9fc1159c25adc62c9686792cd41f06908280b899744057856db33bafe75de', 8, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934597, 100, 1, '2019-06-03 16:35:52.462154', '2019-06-03 16:35:52.462154', 34359742464, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAAAAAAAAAAAAfmQLe8AAABASafHp/zp11tF81MRvbAnx9gQNTXdLW4DmoIofkgoG+jJw/Xj/k+N5WvSjqGrGF33uB6KnD+wAfQIhf0/DlxpBQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAACAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAviDAAAAAIAAAAEAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAviDAAAAAIAAAAFAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAHAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAAAAAAEAAAAIAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAHAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAIAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+IMAAAAAgAAAAQAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{SafHp/zp11tF81MRvbAnx9gQNTXdLW4DmoIofkgoG+jJw/Xj/k+N5WvSjqGrGF33uB6KnD+wAfQIhf0/DlxpBQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3f2aa00ba539e24ba9c0ba62f50318d8c7180f2d6757cc76e9984055c5e19ff4', 7, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934596, 100, 1, '2019-06-03 16:35:52.478131', '2019-06-03 16:35:52.478132', 30064775168, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAEAAAAAAAAAAfmQLe8AAABA1TAQBu/2f7XHs/ctAJ5W7Ytk4jvQBopdO05zkSQoS8piu1mZm/tTvDTXEq/QUufpt/E8NBgKtNpcJXuMv5aPCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAGAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAMAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{1TAQBu/2f7XHs/ctAJ5W7Ytk4jvQBopdO05zkSQoS8piu1mZm/tTvDTXEq/QUufpt/E8NBgKtNpcJXuMv5aPCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3b666a253313fc7a0d241ee28064eec78aaa5ebd0a7c0ae7f85259e80fad029f', 6, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934595, 100, 1, '2019-06-03 16:35:52.492865', '2019-06-03 16:35:52.492865', 25769807872, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAEAAAAAAAAAAfmQLe8AAABAL6czYFvSBhdVeD4fbXOHuXFa2CDqLpFfc+QJnoiPLt/23YViURGLyfg388FKMKsbNJEgmFsCJjtgl3fj7wr/Aw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAHAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvi1AAAAAIAAAACAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvi1AAAAAIAAAADAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{L6czYFvSBhdVeD4fbXOHuXFa2CDqLpFfc+QJnoiPLt/23YViURGLyfg388FKMKsbNJEgmFsCJjtgl3fj7wr/Aw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b55d768a4e8e712da20efdee0e7d85f02948f9b6fd3ef2daefd3a5a147ecd63d', 5, 1, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934593, 100, 1, '2019-06-03 16:35:52.506148', '2019-06-03 16:35:52.506149', 21474840576, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAAAAAAFvFIhaAAAAQBlpm/6rv5JvbN2AKUSlH+4idIlX0cM678QXxK+il0u7z3KLORdzKSkLnS5WdLZlAB6iDmoKI5WbydQLktNtDQA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GWmb/qu/km9s3YApRKUf7iJ0iVfRwzrvxBfEr6KXS7vPcos5F3MpKQudLlZ0tmUAHqIOagojlZvJ1AuS020NAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 4, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:35:52.523591', '2019-06-03 16:35:52.523592', 17179873280, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('7a707186a5cc36a0e520548ae511b53896c0391ce166d40da80588cbaae6aa2c', 3, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:35:52.538445', '2019-06-03 16:35:52.538446', 12884905984, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEDBhDOsFWP2KCoZuJDRXuiNm0CjgVKLLtdZi/A3OfrCsgvX8izhAllXkRqrXyitSvGo3kQh6V/S/tnQbrYgHQQG', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{wYQzrBVj9igqGbiQ0V7ojZtAo4FSiy7XWYvwNzn6wrIL1/Is4QJZV5Eaq18orUrxqN5EIelf0v7Z0G62IB0EBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c6bfdd93f1470df9dfa3ef95d57ba28cecace068d9f2bb040a79ffc7c5d96cb9', 3, 2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934594, 100, 1, '2019-06-03 16:35:52.538629', '2019-06-03 16:35:52.538629', 12884910080, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEBVJkTQTFlpFKoMhcibMpdJ5khR91LY3zPQwv/e5Ov7XIcWKGIv5sDfgyhaK/x5WYWfawNWcc5fMlW7c/PxGOQJ', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{VSZE0ExZaRSqDIXImzKXSeZIUfdS2N8z0ML/3uTr+1yHFihiL+bA34MoWiv8eVmFn2sDVnHOXzJVu3Pz8RjkCQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:35:52.551045', '2019-06-03 16:35:52.551046', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:35:52.551274', '2019-06-03 16:35:52.551275', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:35:52.551526', '2019-06-03 16:35:52.551527', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBdX4R/Ghzq8/r+u8PL+sNriHsS5lW1Vt+9eCe0nnWMNTzMgcUbarePbrpD2gr8DjVumcmpVH9wG2GXtWvwzXoL', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{XV+Efxoc6vP6/rvDy/rDa4h7EuZVtVbfvXgntJ51jDU8zIHFG2q3j266Q9oK/A41bpnJqVR/cBthl7Vr8M16Cw==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/allow_trust.rb b/services/horizon/internal/test/scenarios/allow_trust.rb deleted file mode 100644 index 3d6201e681..0000000000 --- a/services/horizon/internal/test/scenarios/allow_trust.rb +++ /dev/null @@ -1,22 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -create_account :andrew - -close_ledger - -require_trust_auth :usd_gateway -set_flags :usd_gateway, [:auth_revocable_flag] - -close_ledger - -trust :scott, :usd_gateway, "USD" ; close_ledger -change_trust :andrew, :usd_gateway, "USD", 4000 ; close_ledger -allow_trust :usd_gateway, :scott, "USD" ; close_ledger -allow_trust :usd_gateway, :andrew, "USD" ; close_ledger -revoke_trust :usd_gateway, :andrew, "USD" ; close_ledger - -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_account-core.sql b/services/horizon/internal/test/scenarios/asset_stat_account-core.sql deleted file mode 100644 index 4af103fbce..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_account-core.sql +++ /dev/null @@ -1,739 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999959999999600, 4, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 3, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 9999999800, 8589934594, 0, NULL, '', 'AQAAAA==', 2, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 9999999800, 8589934594, 0, NULL, 'YWJjLmNvbQ==', 'AQAAAA==', 1, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999900, 8589934593, 0, NULL, 'ZXhhbXBsZS5jb20=', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('ee372db805c4649d12da0db5f7ae9f6f5fd73f6fc6c1492f007ea75f7f16049b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '10c929c404fb221210dbbe2e30b30a03298ba201b14adaaf33e71ecf244404e0', 2, 1559579880, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZscGG1OkysoQqFH5/E8iDeQerrqbg9nZyFDtaAzodV6gAAAAAXPVM6AAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP3+y2Yo1bFnwdbq5SkW6ZHGyFTUCOM0jd0OrEn834kcQySnEBPsiEhDbvi4wswoDKYuiAbFK2q8z5x7PJEQE4AAAAAIN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('b840b422497ef10629bc47af2c80e5ab0709016478a7e911fffecca5cabae754', 'ee372db805c4649d12da0db5f7ae9f6f5fd73f6fc6c1492f007ea75f7f16049b', '7411283d436f3fd4650ed049dd7a9991d45b4da7df6639e0a9064d4805666d53', 3, 1559579881, 'AAAAC+43LbgFxGSdEtoNtfeun29f1z9vxsFJLwB+p19/FgSbV0Mp7QsV07OIjyMFH7yF8uqcYMo35M03/y43tybrExQAAAAAXPVM6QAAAAAAAAAAY8B/JRimfMVbhaV6D0lsYPxgvQSH1XDQ4SJj/7cfxqt0ESg9Q28/1GUO0EndepmR1FtNp99mOeCpBk1IBWZtUwAAAAMN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCBWDZSRE6DSDJAECXR5CDN6F5MYKDJSOYJBZY3KMXH2GMK5VVFSCHQH', 2, 'AAAAAINh5lEnhyGkBBXj0Q2+L1mFDTJ2EhzjamXPozFdrUshAAAAAAAAAAIAAAACAAAAAQAAAEixwYbU6TKyhCoUfn8TyIN5B6uupuD2dnIUO1oDOh1XqAAAAABc9UzoAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABYpy7+qYpe/uPxDUOrzUQt3UA5cVP4WVMWaLb6bBcnjkAAABA3iLLlMYEYTpB8w4Q7OXGOu2gIGMSYW34OuYArYBT54+5HkbRa2L5IODI+pGP8AA1FhrKTvaPsy33UB/GAUGWCg=='); -INSERT INTO scphistory VALUES ('GCBWDZSRE6DSDJAECXR5CDN6F5MYKDJSOYJBZY3KMXH2GMK5VVFSCHQH', 3, 'AAAAAINh5lEnhyGkBBXj0Q2+L1mFDTJ2EhzjamXPozFdrUshAAAAAAAAAAMAAAACAAAAAQAAADBXQyntCxXTs4iPIwUfvIXy6pxgyjfkzTf/Lje3JusTFAAAAABc9UzpAAAAAAAAAAAAAAABYpy7+qYpe/uPxDUOrzUQt3UA5cVP4WVMWaLb6bBcnjkAAABA9vUPsLBKUz738nYw3xhf9MuW1T8vIlkDj17y5lxH+2+qJSdLksB4v/77MrGNSRlixq5VCNz68+6Wo/lOUsgfBg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('629cbbfaa6297bfb8fc4350eaf3510b77500e5c54fe1654c59a2dbe9b05c9e39', 3, 'AAAAAQAAAAEAAAAAg2HmUSeHIaQEFePRDb4vWYUNMnYSHONqZc+jMV2tSyEAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACDYeZRJ4chpAQV49ENvi9ZhQ0ydhIc42plz6MxXa1LIQAAAAAAAAADAAAAA2Kcu/qmKXv7j8Q1Dq81ELd1AOXFT+FlTFmi2+mwXJ45AAAAAQAAAJhXQyntCxXTs4iPIwUfvIXy6pxgyjfkzTf/Lje3JusTFAAAAABc9UzpAAAAAAAAAAEAAAAAg2HmUSeHIaQEFePRDb4vWYUNMnYSHONqZc+jMV2tSyEAAABA494Zhr4+3RqoKwW+/OW75EKMQUOSDqcvPowllkSELvn/BT1swTvOoOOxAL1sJFtXlUhX6ZH40ziw5UgGYg2IDQAAAAEAAACYV0Mp7QsV07OIjyMFH7yF8uqcYMo35M03/y43tybrExQAAAAAXPVM6QAAAAAAAAABAAAAAINh5lEnhyGkBBXj0Q2+L1mFDTJ2EhzjamXPozFdrUshAAAAQOPeGYa+Pt0aqCsFvvzlu+RCjEFDkg6nLz6MJZZEhC75/wU9bME7zqDjsQC9bCRbV5VIV+mR+NM4sOVIBmINiA0AAABA4FvRTAaEr3vrEE9GEJTeyeNWZKeQfriN9H9Zm6E6bdv0EZcmD9ka3Gry49YCUwc+5H4/ZwOKPKZoLIXlpf91DQAAAACDYeZRJ4chpAQV49ENvi9ZhQ0ydhIc42plz6MxXa1LIQAAAAAAAAADAAAAAgAAAAEAAAAwV0Mp7QsV07OIjyMFH7yF8uqcYMo35M03/y43tybrExQAAAAAXPVM6QAAAAAAAAAAAAAAAWKcu/qmKXv7j8Q1Dq81ELd1AOXFT+FlTFmi2+mwXJ45AAAAQPb1D7CwSlM+9/J2MN8YX/TLltU/LyJZA49e8uZcR/tvqiUnS5LAeL/++zKxjUkZYsauVQjc+vPulqP5TlLIHwYAAAAB7jctuAXEZJ0S2g21966fb1/XP2/GwUkvAH6nX38WBJsAAAAGAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEBTN2f3Ze/XH3TWj7Q9wf3r9M7+8ftPryhxFB/A6lwR5ICiidCl24UqDbO153ccgqd3cMsGqCtE6JZywBKQb88LAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEBzzvdpZTqxPYVXalv5Mxbfw1KQbtHkOweJYU2iEU9qX/9pWN01cGBcA3gLG3pJyo11wbEy6q26Bo4Lq6Mky+cKAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEAhQmiMSoK3bdG8/cMO3aYhJZWGhRzP9NCVmFSZaWZ7oEp7RysFJShIL2wAw+CYYevaS3VQ4PlG9SblNTLOOh8AAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC2V4YW1wbGUuY29tAAAAAAAAAAAAAAAAAa7kvkwAAABAyfE1Bq+ojZFnfczsV/5ZPFNT9FRpeVdjfR8KEX8McvuNFPgKRV32p8p5Rfw+lx3JC/Wo4Ap5bQolJGqNoGeKBwAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAGQAAAACAAAAAgAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAdhYmMuY29tAAAAAAAAAAAAAAAAASdyItUAAABA7mPZK+Aa8yL+8m5PVudcUuLf2zAz+P35T6BalWf5nstdzUv5wCeStJ+OBScceL7o/VucQ0Pe7ye7AJ3kOjWQCwAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAGQAAAACAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASdyItUAAABAsFVOzo691F4kssPIlH/NsZLqHpCaEWT1T80A+yOTqMSrHBTkMVdIC6PP44xyf/ViohgVkmSl6mmh0/s4iuPEDAAAAAEAAAABAAAAAQAAAACDYeZRJ4chpAQV49ENvi9ZhQ0ydhIc42plz6MxXa1LIQAAAAA='); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'b840b422497ef10629bc47af2c80e5ab0709016478a7e911fffecca5cabae754'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "02e92233811202873269c06b024e409d67443160ffabdee28c8c48a75210002c", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('d55be296c632a0da12694260ee59de3b3056116f308df1b3d867384ba4bc501f', 2, 4, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('303f80a93d90ac54f6c19cba102c15691c5074d0a45bfda94b3cc14841aefba4', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('9583238fc99d27f44f6b60e36110b766f521fbcabb68f09e1dab91c402e30658', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c54713f50ce473f861155482c2a068e6d10491a6bf973022b5fc799e43668424', 3, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('7566bd8b48d5baf686c899d4f8e732ce16ad1a4a4fdf5bc54c5a5f636dbaf093', 3, 4, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('e55a573c27be38f6eef4ca4522540e46961f2ddc9b0ea696114380cd95ba4072', 3, 5, 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('43ce5c493b66081919bc5c4f9a80a4c26756129fc0e7bd3b3d6baa1eaea16720', 3, 6, 'AAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDt3KwmaPuPdFSUxdAFeb6OQetyQKIWazlbSMMhmHKNLD4sqhEqUZcQP0l+X/Op+osWmN6+FUYbsz75Q2jG4vMM', 'sqInw5xkpE/Hq9TJaBlFbwOZkG0SxHbXC0Ar/bKW1qMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEA3xWbxPObnZMiBGFKLJQufJLguTsHJxyAsPP5F9Zj561aXnvN/HVRJbFsEcitGbgi9dWVdKRYvmVWCizIdmLID', 'Nr5w+3eC+YAc3O3BIG4h+ZKTyZhgoV5EH0dJdHoKN6sAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBdX4R/Ghzq8/r+u8PL+sNriHsS5lW1Vt+9eCe0nnWMNTzMgcUbarePbrpD2gr8DjVumcmpVH9wG2GXtWvwzXoL', 'kIgKxTgV2shEGt0CIKdjHvXqw9V8LoljTqm1ID9hqOQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('d55be296c632a0da12694260ee59de3b3056116f308df1b3d867384ba4bc501f', 2, 4, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAECCLWxqLddjkFkxGzPyIWRq3DsxF75d7ulJo2ZJxS739M7vVVMPCFDgy7IS8iCmRZ6/65y7IyrJlEEfzJiavYEG', '1VvilsYyoNoSaUJg7lneOzBWEW8wjfGz2Gc4S6S8UB8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqpXNG5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('303f80a93d90ac54f6c19cba102c15691c5074d0a45bfda94b3cc14841aefba4', 3, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEBzzvdpZTqxPYVXalv5Mxbfw1KQbtHkOweJYU2iEU9qX/9pWN01cGBcA3gLG3pJyo11wbEy6q26Bo4Lq6Mky+cK', 'MD+AqT2QrFT2wZy6ECwVaRxQdNCkW/2pSzzBSEGu+6QAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('9583238fc99d27f44f6b60e36110b766f521fbcabb68f09e1dab91c402e30658', 3, 2, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEBTN2f3Ze/XH3TWj7Q9wf3r9M7+8ftPryhxFB/A6lwR5ICiidCl24UqDbO153ccgqd3cMsGqCtE6JZywBKQb88L', 'lYMjj8mdJ/RPa2DjYRC3ZvUh+8q7aPCeHauRxALjBlgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c54713f50ce473f861155482c2a068e6d10491a6bf973022b5fc799e43668424', 3, 3, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ3Ii1QAAAECwVU7Ojr3UXiSyw8iUf82xkuoekJoRZPVPzQD7I5OoxKscFOQxV0gLo8/jjHJ/9WKiGBWSZKXqaaHT+ziK48QM', 'xUcT9Qzkc/hhFVSCwqBo5tEEkaa/lzAitfx5nkNmhCQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('7566bd8b48d5baf686c899d4f8e732ce16ad1a4a4fdf5bc54c5a5f636dbaf093', 3, 4, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC2V4YW1wbGUuY29tAAAAAAAAAAAAAAAAAa7kvkwAAABAyfE1Bq+ojZFnfczsV/5ZPFNT9FRpeVdjfR8KEX8McvuNFPgKRV32p8p5Rfw+lx3JC/Wo4Ap5bQolJGqNoGeKBw==', 'dWa9i0jVuvaGyJnU+OcyzhatGkpP31vFTFpfY2268JMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAALZXhhbXBsZS5jb20AAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('e55a573c27be38f6eef4ca4522540e46961f2ddc9b0ea696114380cd95ba4072', 3, 5, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEAhQmiMSoK3bdG8/cMO3aYhJZWGhRzP9NCVmFSZaWZ7oEp7RysFJShIL2wAw+CYYevaS3VQ4PlG9SblNTLOOh8A', '5VpXPCe+OPbu9MpFIlQORpYfLdybDqaWEUOAzZW6QHIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAACAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAACAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('43ce5c493b66081919bc5c4f9a80a4c26756129fc0e7bd3b3d6baa1eaea16720', 3, 6, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAB2FiYy5jb20AAAAAAAAAAAAAAAABJ3Ii1QAAAEDuY9kr4BrzIv7ybk9W51xS4t/bMDP4/flPoFqVZ/mey13NS/nAJ5K0n44FJxx4vuj9W5xDQ97vJ7sAneQ6NZAL', 'Q85cSTtmCBkZvFxPmoCkwmdWEp/A5707PWuqHq6hZyAAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAHYWJjLmNvbQABAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_account-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_account-horizon.sql deleted file mode 100644 index 3d8849f1e3..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_account-horizon.sql +++ /dev/null @@ -1,997 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_accounts VALUES (3, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); -INSERT INTO history_accounts VALUES (4, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (5, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 5, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, false); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 12884905985, 1, 6, '{"auth_required_flag": true, "auth_revocable_flag": true}'); -INSERT INTO history_effects VALUES (2, 12884910081, 1, 6, '{"auth_revocable_flag": true}'); -INSERT INTO history_effects VALUES (3, 12884914177, 1, 6, '{"auth_required_flag": true}'); -INSERT INTO history_effects VALUES (4, 12884918273, 1, 5, '{"home_domain": "example.com"}'); -INSERT INTO history_effects VALUES (3, 12884926465, 1, 5, '{"home_domain": "abc.com"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 3, 10, '{"weight": 1, "public_key": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589946881, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 3, 10, '{"weight": 1, "public_key": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"}'); -INSERT INTO history_effects VALUES (1, 8589950977, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589950977, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589950977, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, 'b840b422497ef10629bc47af2c80e5ab0709016478a7e911fffecca5cabae754', 'ee372db805c4649d12da0db5f7ae9f6f5fd73f6fc6c1492f007ea75f7f16049b', 6, 6, '2019-06-03 16:38:01', '2019-06-03 16:38:03.053035', '2019-06-03 16:38:03.053035', 12884901888, 16, 1000000000000000000, 1000, 100, 100000000, 1000000, 11, 'AAAAC+43LbgFxGSdEtoNtfeun29f1z9vxsFJLwB+p19/FgSbV0Mp7QsV07OIjyMFH7yF8uqcYMo35M03/y43tybrExQAAAAAXPVM6QAAAAAAAAAAY8B/JRimfMVbhaV6D0lsYPxgvQSH1XDQ4SJj/7cfxqt0ESg9Q28/1GUO0EndepmR1FtNp99mOeCpBk1IBWZtUwAAAAMN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 6, 0); -INSERT INTO history_ledgers VALUES (2, 'ee372db805c4649d12da0db5f7ae9f6f5fd73f6fc6c1492f007ea75f7f16049b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 4, 4, '2019-06-03 16:38:00', '2019-06-03 16:38:03.072448', '2019-06-03 16:38:03.072448', 8589934592, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZscGG1OkysoQqFH5/E8iDeQerrqbg9nZyFDtaAzodV6gAAAAAXPVM6AAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP3+y2Yo1bFnwdbq5SkW6ZHGyFTUCOM0jd0OrEn834kcQySnEBPsiEhDbvi4wswoDKYuiAbFK2q8z5x7PJEQE4AAAAAIN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:38:03.088013', '2019-06-03 16:38:03.088013', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (2, 12884910081, 2); -INSERT INTO history_operation_participants VALUES (3, 12884914177, 3); -INSERT INTO history_operation_participants VALUES (4, 12884918273, 4); -INSERT INTO history_operation_participants VALUES (5, 12884922369, 2); -INSERT INTO history_operation_participants VALUES (6, 12884926465, 3); -INSERT INTO history_operation_participants VALUES (7, 8589938689, 5); -INSERT INTO history_operation_participants VALUES (8, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (9, 8589942785, 5); -INSERT INTO history_operation_participants VALUES (10, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (11, 8589946881, 5); -INSERT INTO history_operation_participants VALUES (12, 8589946881, 2); -INSERT INTO history_operation_participants VALUES (13, 8589950977, 5); -INSERT INTO history_operation_participants VALUES (14, 8589950977, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 14, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 5, '{"set_flags": [1, 2], "set_flags_s": ["auth_required", "auth_revocable"]}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 5, '{"set_flags": [2], "set_flags_s": ["auth_revocable"]}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884914177, 12884914176, 1, 5, '{"set_flags": [1], "set_flags_s": ["auth_required"]}', 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); -INSERT INTO history_operations VALUES (12884918273, 12884918272, 1, 5, '{"home_domain": "example.com"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884922369, 12884922368, 1, 5, '{}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884926465, 12884926464, 1, 5, '{"home_domain": "abc.com"}', 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589950977, 8589950976, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (2, 12884910080, 2); -INSERT INTO history_transaction_participants VALUES (3, 12884914176, 3); -INSERT INTO history_transaction_participants VALUES (4, 12884918272, 4); -INSERT INTO history_transaction_participants VALUES (5, 12884922368, 2); -INSERT INTO history_transaction_participants VALUES (6, 12884926464, 3); -INSERT INTO history_transaction_participants VALUES (7, 8589938688, 5); -INSERT INTO history_transaction_participants VALUES (8, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (9, 8589942784, 5); -INSERT INTO history_transaction_participants VALUES (10, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (11, 8589946880, 5); -INSERT INTO history_transaction_participants VALUES (12, 8589946880, 2); -INSERT INTO history_transaction_participants VALUES (13, 8589950976, 5); -INSERT INTO history_transaction_participants VALUES (14, 8589950976, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 14, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('303f80a93d90ac54f6c19cba102c15691c5074d0a45bfda94b3cc14841aefba4', 3, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:38:03.053201', '2019-06-03 16:38:03.053201', 12884905984, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+ZAt7wAAAEBzzvdpZTqxPYVXalv5Mxbfw1KQbtHkOweJYU2iEU9qX/9pWN01cGBcA3gLG3pJyo11wbEy6q26Bo4Lq6Mky+cK', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{c873aWU6sT2FV2pb+TMW38NSkG7R5DsHiWFNohFPal//aVjdNXBgXAN4Cxt6ScqNdcGxMuqtugaOC6ujJMvnCg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('9583238fc99d27f44f6b60e36110b766f521fbcabb68f09e1dab91c402e30658', 3, 2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934593, 100, 1, '2019-06-03 16:38:03.053458', '2019-06-03 16:38:03.053458', 12884910080, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEBTN2f3Ze/XH3TWj7Q9wf3r9M7+8ftPryhxFB/A6lwR5ICiidCl24UqDbO153ccgqd3cMsGqCtE6JZywBKQb88L', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Uzdn92Xv1x901o+0PcH96/TO/vH7T68ocRQfwOpcEeSAoonQpduFKg2zted3HIKnd3DLBqgrROiWcsASkG/PCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c54713f50ce473f861155482c2a068e6d10491a6bf973022b5fc799e43668424', 3, 3, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 8589934593, 100, 1, '2019-06-03 16:38:03.053577', '2019-06-03 16:38:03.053577', 12884914176, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJ3Ii1QAAAECwVU7Ojr3UXiSyw8iUf82xkuoekJoRZPVPzQD7I5OoxKscFOQxV0gLo8/jjHJ/9WKiGBWSZKXqaaHT+ziK48QM', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{sFVOzo691F4kssPIlH/NsZLqHpCaEWT1T80A+yOTqMSrHBTkMVdIC6PP44xyf/ViohgVkmSl6mmh0/s4iuPEDA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('7566bd8b48d5baf686c899d4f8e732ce16ad1a4a4fdf5bc54c5a5f636dbaf093', 3, 4, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:38:03.053695', '2019-06-03 16:38:03.053695', 12884918272, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAC2V4YW1wbGUuY29tAAAAAAAAAAAAAAAAAa7kvkwAAABAyfE1Bq+ojZFnfczsV/5ZPFNT9FRpeVdjfR8KEX8McvuNFPgKRV32p8p5Rfw+lx3JC/Wo4Ap5bQolJGqNoGeKBw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAALZXhhbXBsZS5jb20AAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{yfE1Bq+ojZFnfczsV/5ZPFNT9FRpeVdjfR8KEX8McvuNFPgKRV32p8p5Rfw+lx3JC/Wo4Ap5bQolJGqNoGeKBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('e55a573c27be38f6eef4ca4522540e46961f2ddc9b0ea696114380cd95ba4072', 3, 5, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934594, 100, 1, '2019-06-03 16:38:03.053818', '2019-06-03 16:38:03.053818', 12884922368, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEAhQmiMSoK3bdG8/cMO3aYhJZWGhRzP9NCVmFSZaWZ7oEp7RysFJShIL2wAw+CYYevaS3VQ4PlG9SblNTLOOh8A', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAACAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAACAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAIAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{IUJojEqCt23RvP3DDt2mISWVhoUcz/TQlZhUmWlme6BKe0crBSUoSC9sAMPgmGHr2kt1UOD5RvUm5TUyzjofAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('43ce5c493b66081919bc5c4f9a80a4c26756129fc0e7bd3b3d6baa1eaea16720', 3, 6, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 8589934594, 100, 1, '2019-06-03 16:38:03.053925', '2019-06-03 16:38:03.053925', 12884926464, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAB2FiYy5jb20AAAAAAAAAAAAAAAABJ3Ii1QAAAEDuY9kr4BrzIv7ybk9W51xS4t/bMDP4/flPoFqVZ/mey13NS/nAJ5K0n44FJxx4vuj9W5xDQ97vJ7sAneQ6NZAL', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjOAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAAAAAAEAAAAHYWJjLmNvbQABAAAAAAAAAAAAAAAAAAAA', 'AAAAAgAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{7mPZK+Aa8yL+8m5PVudcUuLf2zAz+P35T6BalWf5nstdzUv5wCeStJ+OBScceL7o/VucQ0Pe7ye7AJ3kOjWQCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:38:03.072644', '2019-06-03 16:38:03.072645', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDt3KwmaPuPdFSUxdAFeb6OQetyQKIWazlbSMMhmHKNLD4sqhEqUZcQP0l+X/Op+osWmN6+FUYbsz75Q2jG4vMM', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{7dysJmj7j3RUlMXQBXm+jkHrckCiFms5W0jDIZhyjSw+LKoRKlGXED9Jfl/zqfqLFpjevhVGG7M++UNoxuLzDA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:38:03.072838', '2019-06-03 16:38:03.072839', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEA3xWbxPObnZMiBGFKLJQufJLguTsHJxyAsPP5F9Zj561aXnvN/HVRJbFsEcitGbgi9dWVdKRYvmVWCizIdmLID', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{N8Vm8Tzm52TIgRhSiyULnyS4Lk7ByccgLDz+RfWY+etWl57zfx1USWxbBHIrRm4IvXVlXSkWL5lVgosyHZiyAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('90880ac53815dac8441add0220a7631ef5eac3d57c2e89634ea9b5203f61a8e4', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:38:03.072966', '2019-06-03 16:38:03.072966', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBdX4R/Ghzq8/r+u8PL+sNriHsS5lW1Vt+9eCe0nnWMNTzMgcUbarePbrpD2gr8DjVumcmpVH9wG2GXtWvwzXoL', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{XV+Efxoc6vP6/rvDy/rDa4h7EuZVtVbfvXgntJ51jDU8zIHFG2q3j266Q9oK/A41bpnJqVR/cBthl7Vr8M16Cw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('d55be296c632a0da12694260ee59de3b3056116f308df1b3d867384ba4bc501f', 2, 4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 4, 100, 1, '2019-06-03 16:38:03.073086', '2019-06-03 16:38:03.073086', 8589950976, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAECCLWxqLddjkFkxGzPyIWRq3DsxF75d7ulJo2ZJxS739M7vVVMPCFDgy7IS8iCmRZ6/65y7IyrJlEEfzJiavYEG', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqpXNG5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{gi1sai3XY5BZMRsz8iFkatw7MRe+Xe7pSaNmScUu9/TO71VTDwhQ4MuyEvIgpkWev+ucuyMqyZRBH8yYmr2BBg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_account.rb b/services/horizon/internal/test/scenarios/asset_stat_account.rb deleted file mode 100644 index 74479ec32b..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_account.rb +++ /dev/null @@ -1,23 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :scott -create_account :bartek -create_account :andrew -create_account :usd_gateway -close_ledger - -# :scott has no flags set -set_home_domain :scott, "example.com" - -set_flags :bartek, [:auth_required_flag] -set_home_domain :bartek, "abc.com" - -set_flags :andrew, [:auth_revocable_flag] -set_home_domain :andrew, "" - -set_flags :usd_gateway, [:auth_required_flag, :auth_revocable_flag] -# no home domain set - -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_operations-core.sql b/services/horizon/internal/test/scenarios/asset_stat_operations-core.sql deleted file mode 100644 index 9a18a5c103..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_operations-core.sql +++ /dev/null @@ -1,733 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999959999999600, 4, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('0dc75706bf9958fdd2326dca73c429ba839b3565bf43959c972460e2e741d52b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '4a4bacf70ee86458779f2ff4e54fd8710a5434bf0d58307e88dfc105d9038419', 2, 1559579667, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZAl4xVs7p/dHViPjkvi2jwT71A96KVxBFTiVfkaPKPPMAAAAAXPVMEwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAi4Ue20vNo0cmNykBLoF1m6yPEvTdv3MfCquWXwc7NpxKS6z3DuhkWHefL/TlT9hxClQ0vw1YMH6I38EF2QOEGQAAAAIN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('18cbb37ab371dcb900c846a1fd8000c2a09c68ea23ba43858c0deed05df2d9cd', '0dc75706bf9958fdd2326dca73c429ba839b3565bf43959c972460e2e741d52b', '255d96414b66ee031f96ac428fd27dfeea5137eab44cd9e878180d9bac6c1a57', 3, 1559579668, 'AAAACw3HVwa/mVj90jJtynPEKbqDmzVlv0OVnJckYOLnQdUrEfAYHWfAn84njhZoaIFZlI1KsNuRDfce9f6vVb64XJ0AAAAAXPVMFAAAAAAAAAAAhSD66Lhzb7ZNorUyzTQqB11nd0srMHPv8kaiQLT5higlXZZBS2buAx+WrEKP0n3+6lE36rRM2eh4GA2brGwaVwAAAAMN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCHSPAWNLVYEOJ5QIWN5DRT2KFGOFRRXPBMGGD2C2X2ZCFXBXIN32XTI', 2, 'AAAAAI8ngs1dcEcnsEWb0cZ6UUzixjd4WGMPQtX1kRbhuhu9AAAAAAAAAAIAAAACAAAAAQAAAEgCXjFWzun90dWI+OS+LaPBPvUD3opXEEVOJV+Ro8o88wAAAABc9UwTAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABZgcwdPbe7XdMFPZ8j87J0zEqCP++XEJkH0Ddvf9ZmLIAAABA8ubzb3l+hx93XhuSnGYNuHPuKwYEo46Lz/ZrK1ghbHD99B5+JzOokzf8BD+q8XBrBz8A0k4xF7H79EoOZ/QlDA=='); -INSERT INTO scphistory VALUES ('GCHSPAWNLVYEOJ5QIWN5DRT2KFGOFRRXPBMGGD2C2X2ZCFXBXIN32XTI', 3, 'AAAAAI8ngs1dcEcnsEWb0cZ6UUzixjd4WGMPQtX1kRbhuhu9AAAAAAAAAAMAAAACAAAAAQAAADAR8BgdZ8CfzieOFmhogVmUjUqw25EN9x71/q9VvrhcnQAAAABc9UwUAAAAAAAAAAAAAAABZgcwdPbe7XdMFPZ8j87J0zEqCP++XEJkH0Ddvf9ZmLIAAABAaED18lLRkFoinjFqAE7h52NkZQKxOKA84a7hHsj9V3xBjc6g+MGz67Db7Cxo7wFPbRTwAnBJN+n9DY9t93eBBg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('66073074f6deed774c14f67c8fcec9d3312a08ffbe5c42641f40ddbdff5998b2', 3, 'AAAAAQAAAAEAAAAAjyeCzV1wRyewRZvRxnpRTOLGN3hYYw9C1fWRFuG6G70AAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '18cbb37ab371dcb900c846a1fd8000c2a09c68ea23ba43858c0deed05df2d9cd'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "f21f6db99c8ac25b8bf672e8f75360230a9864a52509699e1ba03a21d7d884bd", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACPJ4LNXXBHJ7BFm9HGelFM4sY3eFhjD0LV9ZEW4bobvQAAAAAAAAADAAAAA2YHMHT23u13TBT2fI/OydMxKgj/vlxCZB9A3b3/WZiyAAAAAQAAAJgR8BgdZ8CfzieOFmhogVmUjUqw25EN9x71/q9VvrhcnQAAAABc9UwUAAAAAAAAAAEAAAAAjyeCzV1wRyewRZvRxnpRTOLGN3hYYw9C1fWRFuG6G70AAABAs4etSBgrBvS2X4JMge/H2K0HB3HoU/e8RNnqPmHNjyQBpxRSNsNUk8alITPvmo3nA4fyvJC4QlVUySFY+rvHCgAAAAEAAACYEfAYHWfAn84njhZoaIFZlI1KsNuRDfce9f6vVb64XJ0AAAAAXPVMFAAAAAAAAAABAAAAAI8ngs1dcEcnsEWb0cZ6UUzixjd4WGMPQtX1kRbhuhu9AAAAQLOHrUgYKwb0tl+CTIHvx9itBwdx6FP3vETZ6j5hzY8kAacUUjbDVJPGpSEz75qN5wOH8ryQuEJVVMkhWPq7xwoAAABA+IBefeM9vDmssNIeMVdovciRH8A3ilS42BRnH0zck8ZwZ3LtFhJlY45HIDC/TVMBZA5WNTQUWmoUY/OLCCI5DgAAAACPJ4LNXXBHJ7BFm9HGelFM4sY3eFhjD0LV9ZEW4bobvQAAAAAAAAADAAAAAgAAAAEAAAAwEfAYHWfAn84njhZoaIFZlI1KsNuRDfce9f6vVb64XJ0AAAAAXPVMFAAAAAAAAAAAAAAAAWYHMHT23u13TBT2fI/OydMxKgj/vlxCZB9A3b3/WZiyAAAAQGhA9fJS0ZBaIp4xagBO4edjZGUCsTigPOGu4R7I/Vd8QY3OoPjBs+uw2+wsaO8BT20U8AJwSTfp/Q2Pbfd3gQYAAAABDcdXBr+ZWP3SMm3Kc8QpuoObNWW/Q5WclyRg4udB1SsAAAACAAAAALC5vdT6K4OcG7qgXmA8tzNjlJFjofVz6LAapoShalLSAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACLmzdgdUsGaDmeb/fz9pI5Bhki9paFvU4c2jXVWctB0H//////////AAAAAAAAAAGhalLSAAAAQCnZlvEITlesuWctD/z9XMvJSujWqCYBR5F6tzeyStpEqiQXeyOEtJrGO3ulubYfi4kuwxETF5+CORR/2+0IKA4AAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAABkAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAAAFVU0QAAAAAAAPzMg9PcY0TlEsW0GXjJRT1cABD43Rk6smoiIvFfpYIf/////////8AAAAAAAAAATznDSkAAABACD1Q1IWv8UnBj7YBwTe/bL9Tit2zfm4Mnzy8/z7qVZHEtNlkl9mSQ9CG1IbRVnjgc7c4sswvgy/6kYuGBeiaAAAAAAEAAAABAAAAAQAAAACPJ4LNXXBHJ7BFm9HGelFM4sY3eFhjD0LV9ZEW4bobvQAAAAA='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO', 1, 'GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); -INSERT INTO trustlines VALUES ('GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5', 1, 'GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('c6c673dd3f0f5248f1e2c85bc88daebedafa4de71202bede4980667c10292821', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('790c7fd5024a5da930b7cd55ed31bff4dd4a279ee20a2c1fc089e97557573424', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('834f6076a7870b4921347be0a6128487d900fabc1078be433f473b2f3139837f', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('ff8874bbd46e02dfe9b47aafd35b817d3f44bf769a0dff0bf73b16e6bc0a33ef', 2, 4, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('a407d1e59a681499d7b1af4752df7b73953c631772eb40ca758989b96018d692', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3cb0f6b31e0a73f6c3a316d930f5deb4d9a825abd80310dcf0c587d7e12c7624', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('c6c673dd3f0f5248f1e2c85bc88daebedafa4de71202bede4980667c10292821', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDr7G099qIL7nPbxze2xCgJGbUVZ4rvCgTyz+zsKbHqYfSJAlqq+1LJAUIH9fbjTjbNObVelKRa90ri/p2RHXIJ', 'xsZz3T8PUkjx4shbyI2uvtr6TecSAr7eSYBmfBApKCEAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('790c7fd5024a5da930b7cd55ed31bff4dd4a279ee20a2c1fc089e97557573424', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvkAAAAAAAAAAABVvwF9wAAAEAquSOIytKAx1/dElrYoSuRdTbRtVMQvtE9gAa4uM/elgMLXsdxSsar7SZL+p7I/+J8ZIwivYxnGjOXipt5f4UJ', 'eQx/1QJKXakwt81V7TG/9N1KJ57iCiwfwInpdVdXNCQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('834f6076a7870b4921347be0a6128487d900fabc1078be433f473b2f3139837f', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAi5s3YHVLBmg5nm/38/aSOQYZIvaWhb1OHNo11VnLQdAAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDSRx2tkaPmowO5+GO4a5qEZ6/6BwbkoAK+N9Ad4Ie8Gu6f4XWu7RjxQ7fbuLLW6kipomxVIfFJ8+Tiv5Zd4UME', 'g09gdqeHC0khNHvgphKEh9kA+rwQeL5DP0c7LzE5g38AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACLmzdgdUsGaDmeb/fz9pI5Bhki9paFvU4c2jXVWctB0AAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('ff8874bbd46e02dfe9b47aafd35b817d3f44bf769a0dff0bf73b16e6bc0a33ef', 2, 4, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAA/MyD09xjROUSxbQZeMlFPVwAEPjdGTqyaiIi8V+lggAAAACVAvkAAAAAAAAAAABVvwF9wAAAEABI+RIBTA9OBOHPtApTdYY2ABBRoR55l4dwEYszn8laVt52bZNa+1NfBVuZffVTyHbaww6Q0/sfo2OfF5c0HwN', '/4h0u9RuAt/ptHqv01uBfT9Ev3aaDf8L9zsW5rwKM+8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqpXNG5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAD8zIPT3GNE5RLFtBl4yUU9XAAQ+N0ZOrJqIiLxX6WCAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('a407d1e59a681499d7b1af4752df7b73953c631772eb40ca758989b96018d692', 3, 1, 'AAAAALC5vdT6K4OcG7qgXmA8tzNjlJFjofVz6LAapoShalLSAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACLmzdgdUsGaDmeb/fz9pI5Bhki9paFvU4c2jXVWctB0H//////////AAAAAAAAAAGhalLSAAAAQCnZlvEITlesuWctD/z9XMvJSujWqCYBR5F6tzeyStpEqiQXeyOEtJrGO3ulubYfi4kuwxETF5+CORR/2+0IKA4=', 'pAfR5ZpoFJnXsa9HUt97c5U8Yxdy60DKdYmJuWAY1pIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAFVU0QAAAAAAIubN2B1SwZoOZ5v9/P2kjkGGSL2loW9ThzaNdVZy0HQAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3cb0f6b31e0a73f6c3a316d930f5deb4d9a825abd80310dcf0c587d7e12c7624', 3, 2, 'AAAAAKV+PHTL9hX3Ws1YW4iJ71qiOORiEffJictAAkk85w0pAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAAD8zIPT3GNE5RLFtBl4yUU9XAAQ+N0ZOrJqIiLxX6WCH//////////AAAAAAAAAAE85w0pAAAAQAg9UNSFr/FJwY+2AcE3v2y/U4rds35uDJ88vP8+6lWRxLTZZJfZkkPQhtSG0VZ44HO3OLLML4Mv+pGLhgXomgA=', 'PLD2sx4Kc/bDoxbZMPXetNmoJavYAxDc8MWH1+EsdiQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAFVU0QAAAAAAAPzMg9PcY0TlEsW0GXjJRT1cABD43Rk6smoiIvFfpYIAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_operations-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_operations-horizon.sql deleted file mode 100644 index fca7159bd2..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_operations-horizon.sql +++ /dev/null @@ -1,982 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); -INSERT INTO asset_stats VALUES (2, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5'); -INSERT INTO history_accounts VALUES (2, 'GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO'); -INSERT INTO history_accounts VALUES (3, 'GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3'); -INSERT INTO history_accounts VALUES (4, 'GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN'); -INSERT INTO history_accounts VALUES (5, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 5, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN'); -INSERT INTO history_assets VALUES (2, 'credit_alphanum4', 'USD', 'GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 2, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3"}'); -INSERT INTO history_effects VALUES (2, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO"}'); -INSERT INTO history_effects VALUES (3, 8589946881, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589946881, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589946881, 3, 10, '{"weight": 1, "public_key": "GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3"}'); -INSERT INTO history_effects VALUES (4, 8589950977, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (5, 8589950977, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (4, 8589950977, 3, 10, '{"weight": 1, "public_key": "GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, '18cbb37ab371dcb900c846a1fd8000c2a09c68ea23ba43858c0deed05df2d9cd', '0dc75706bf9958fdd2326dca73c429ba839b3565bf43959c972460e2e741d52b', 2, 2, '2019-06-03 16:34:28', '2019-06-03 16:34:30.786903', '2019-06-03 16:34:30.786903', 12884901888, 16, 1000000000000000000, 600, 100, 100000000, 1000000, 11, 'AAAACw3HVwa/mVj90jJtynPEKbqDmzVlv0OVnJckYOLnQdUrEfAYHWfAn84njhZoaIFZlI1KsNuRDfce9f6vVb64XJ0AAAAAXPVMFAAAAAAAAAAAhSD66Lhzb7ZNorUyzTQqB11nd0srMHPv8kaiQLT5higlXZZBS2buAx+WrEKP0n3+6lE36rRM2eh4GA2brGwaVwAAAAMN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, '0dc75706bf9958fdd2326dca73c429ba839b3565bf43959c972460e2e741d52b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 4, 4, '2019-06-03 16:34:27', '2019-06-03 16:34:30.804493', '2019-06-03 16:34:30.804493', 8589934592, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZAl4xVs7p/dHViPjkvi2jwT71A96KVxBFTiVfkaPKPPMAAAAAXPVMEwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAi4Ue20vNo0cmNykBLoF1m6yPEvTdv3MfCquWXwc7NpxKS6z3DuhkWHefL/TlT9hxClQ0vw1YMH6I38EF2QOEGQAAAAIN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:34:30.817439', '2019-06-03 16:34:30.81744', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (2, 12884910081, 2); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 5); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 1); -INSERT INTO history_operation_participants VALUES (5, 8589942785, 5); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 2); -INSERT INTO history_operation_participants VALUES (7, 8589946881, 5); -INSERT INTO history_operation_participants VALUES (8, 8589946881, 3); -INSERT INTO history_operation_participants VALUES (9, 8589950977, 5); -INSERT INTO history_operation_participants VALUES (10, 8589950977, 4); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 10, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3", "trustor": "GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3"}', 'GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN", "trustor": "GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN"}', 'GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589950977, 8589950976, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (2, 12884910080, 2); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 5); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 1); -INSERT INTO history_transaction_participants VALUES (5, 8589942784, 5); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 2); -INSERT INTO history_transaction_participants VALUES (7, 8589946880, 5); -INSERT INTO history_transaction_participants VALUES (8, 8589946880, 3); -INSERT INTO history_transaction_participants VALUES (9, 8589950976, 5); -INSERT INTO history_transaction_participants VALUES (10, 8589950976, 4); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 10, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('a407d1e59a681499d7b1af4752df7b73953c631772eb40ca758989b96018d692', 3, 1, 'GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5', 8589934593, 100, 1, '2019-06-03 16:34:30.787087', '2019-06-03 16:34:30.787087', 12884905984, 'AAAAALC5vdT6K4OcG7qgXmA8tzNjlJFjofVz6LAapoShalLSAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACLmzdgdUsGaDmeb/fz9pI5Bhki9paFvU4c2jXVWctB0H//////////AAAAAAAAAAGhalLSAAAAQCnZlvEITlesuWctD/z9XMvJSujWqCYBR5F6tzeyStpEqiQXeyOEtJrGO3ulubYfi4kuwxETF5+CORR/2+0IKA4=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAFVU0QAAAAAAIubN2B1SwZoOZ5v9/P2kjkGGSL2loW9ThzaNdVZy0HQAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{KdmW8QhOV6y5Zy0P/P1cy8lK6NaoJgFHkXq3N7JK2kSqJBd7I4S0msY7e6W5th+LiS7DERMXn4I5FH/b7QgoDg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3cb0f6b31e0a73f6c3a316d930f5deb4d9a825abd80310dcf0c587d7e12c7624', 3, 2, 'GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO', 8589934593, 100, 1, '2019-06-03 16:34:30.787358', '2019-06-03 16:34:30.787358', 12884910080, 'AAAAAKV+PHTL9hX3Ws1YW4iJ71qiOORiEffJictAAkk85w0pAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAAD8zIPT3GNE5RLFtBl4yUU9XAAQ+N0ZOrJqIiLxX6WCH//////////AAAAAAAAAAE85w0pAAAAQAg9UNSFr/FJwY+2AcE3v2y/U4rds35uDJ88vP8+6lWRxLTZZJfZkkPQhtSG0VZ44HO3OLLML4Mv+pGLhgXomgA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAFVU0QAAAAAAAPzMg9PcY0TlEsW0GXjJRT1cABD43Rk6smoiIvFfpYIAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{CD1Q1IWv8UnBj7YBwTe/bL9Tit2zfm4Mnzy8/z7qVZHEtNlkl9mSQ9CG1IbRVnjgc7c4sswvgy/6kYuGBeiaAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c6c673dd3f0f5248f1e2c85bc88daebedafa4de71202bede4980667c10292821', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:34:30.804685', '2019-06-03 16:34:30.804686', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAsLm91Porg5wbuqBeYDy3M2OUkWOh9XPosBqmhKFqUtIAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDr7G099qIL7nPbxze2xCgJGbUVZ4rvCgTyz+zsKbHqYfSJAlqq+1LJAUIH9fbjTjbNObVelKRa90ri/p2RHXIJ', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACwub3U+iuDnBu6oF5gPLczY5SRY6H1c+iwGqaEoWpS0gAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{6+xtPfaiC+5z28c3tsQoCRm1FWeK7woE8s/s7Cmx6mH0iQJaqvtSyQFCB/X24042zTm1XpSkWvdK4v6dkR1yCQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('790c7fd5024a5da930b7cd55ed31bff4dd4a279ee20a2c1fc089e97557573424', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:34:30.804872', '2019-06-03 16:34:30.804872', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAApX48dMv2FfdazVhbiInvWqI45GIR98mJy0ACSTznDSkAAAACVAvkAAAAAAAAAAABVvwF9wAAAEAquSOIytKAx1/dElrYoSuRdTbRtVMQvtE9gAa4uM/elgMLXsdxSsar7SZL+p7I/+J8ZIwivYxnGjOXipt5f4UJ', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBpwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAClfjx0y/YV91rNWFuIie9aojjkYhH3yYnLQAJJPOcNKQAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{KrkjiMrSgMdf3RJa2KErkXU20bVTEL7RPYAGuLjP3pYDC17HcUrGq+0mS/qeyP/ifGSMIr2MZxozl4qbeX+FCQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('834f6076a7870b4921347be0a6128487d900fabc1078be433f473b2f3139837f', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:34:30.804999', '2019-06-03 16:34:30.804999', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAi5s3YHVLBmg5nm/38/aSOQYZIvaWhb1OHNo11VnLQdAAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDSRx2tkaPmowO5+GO4a5qEZ6/6BwbkoAK+N9Ad4Ie8Gu6f4XWu7RjxQ7fbuLLW6kipomxVIfFJ8+Tiv5Zd4UME', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDZwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACLmzdgdUsGaDmeb/fz9pI5Bhki9paFvU4c2jXVWctB0AAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{0kcdrZGj5qMDufhjuGuahGev+gcG5KACvjfQHeCHvBrun+F1ru0Y8UO327iy1upIqaJsVSHxSfPk4r+WXeFDBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('ff8874bbd46e02dfe9b47aafd35b817d3f44bf769a0dff0bf73b16e6bc0a33ef', 2, 4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 4, 100, 1, '2019-06-03 16:34:30.805228', '2019-06-03 16:34:30.805229', 8589950976, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAA/MyD09xjROUSxbQZeMlFPVwAEPjdGTqyaiIi8V+lggAAAACVAvkAAAAAAAAAAABVvwF9wAAAEABI+RIBTA9OBOHPtApTdYY2ABBRoR55l4dwEYszn8laVt52bZNa+1NfBVuZffVTyHbaww6Q0/sfo2OfF5c0HwN', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFJwAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqpXNG5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAD8zIPT3GNE5RLFtBl4yUU9XAAQ+N0ZOrJqIiLxX6WCAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/5wAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ASPkSAUwPTgThz7QKU3WGNgAQUaEeeZeHcBGLM5/JWlbedm2TWvtTXwVbmX31U8h22sMOkNP7H6NjnxeXNB8DQ==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_operations.rb b/services/horizon/internal/test/scenarios/asset_stat_operations.rb deleted file mode 100644 index ad22a220f7..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_operations.rb +++ /dev/null @@ -1,34 +0,0 @@ -# Secret seed: SANFNPZPA4LWBD3RPDSCJU63KCBU3OBFOM5FFBJCGIOCVIABMRTKBAU2 -# Address: GCYLTPOU7IVYHHA3XKQF4YB4W4ZWHFERMOQ7K47IWANKNBFBNJJNEOG5 -# Asset Code Issued: USD -account :source, Stellar::KeyPair.from_seed("SANFNPZPA4LWBD3RPDSCJU63KCBU3OBFOM5FFBJCGIOCVIABMRTKBAU2") - -# Secret seed: SABP5P625YBETJV4BCEWQD674ED4FF4QVNBRL6TQCRODJUWBNJBMND5O -# Address: GCSX4PDUZP3BL522ZVMFXCEJ55NKEOHEMII7PSMJZNAAESJ444GSSJMO -# Asset Code Issued: EUR -account :dest, Stellar::KeyPair.from_seed("SABP5P625YBETJV4BCEWQD674ED4FF4QVNBRL6TQCRODJUWBNJBMND5O") - -# Secret seed: SCCUFFUANIXJPAWBHDXZXY5D4GB32QPM6MOUWDD6PTYBLPE6JVYZFE76 -# Address: GCFZWN3AOVFQM2BZTZX7P47WSI4QMGJC62LILPKODTNDLVKZZNA5BQJ3 -# Asset Code Issued: USD -account :issuer, Stellar::KeyPair.from_seed("SCCUFFUANIXJPAWBHDXZXY5D4GB32QPM6MOUWDD6PTYBLPE6JVYZFE76") - -# Secret seed: SAISD7SISIIW5YNQ7GY5727L6MOFS667K3LVIPYPPUBIPCRQUORFLQMN -# Address: GAB7GMQPJ5YY2E4UJMLNAZPDEUKPK4AAIPRXIZHKZGUIRC6FP2LAQSDN -# Asset Code Issued: USD -account :another, Stellar::KeyPair.from_seed("SAISD7SISIIW5YNQ7GY5727L6MOFS667K3LVIPYPPUBIPCRQUORFLQMN") - -use_manual_close - -# create accounts -create_account :source -create_account :dest -create_account :issuer -create_account :another -close_ledger - -# add a trust line so the :source account lists USD:issuer as a currency it holds -trust :source, :issuer, "USD" -# add a trust line so the :dest account lists USD:another as a currency it holds -trust :dest, :another, "USD" -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-core.sql deleted file mode 100644 index 32b6833b1e..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-core.sql +++ /dev/null @@ -1,724 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('98cb2efcf21ebee074103b289cde84b91c04c03a15943d1ce466359066d36f28', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579739, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMWwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('3d1582f6553a00296493dba6bb3d463c0eb7c417daf0c727391fcf832fefb05e', '98cb2efcf21ebee074103b289cde84b91c04c03a15943d1ce466359066d36f28', '90d0d3fb695b7e03b5c2de781e7a8839c18b2d4c713fb2e27f28d9a992860963', 3, 1559579740, 'AAAAC5jLLvzyHr7gdBA7KJzehLkcBMA6FZQ9HORmNZBm028ofrSv2cs96S7UgH9hGCX2w2tJu6/3Np99jSWhyIyAxr8AAAAAXPVMXAAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GAGDAOMXIXF5U47SLBC5MBHNQKLX4VJXOA27LSA3CHBXAS3BFQTS34WF', 2, 'AAAAAAwwOZdFy9pz8lhF1gTtgpd+VTdwNfXIGxHDcEthLCctAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9UxbAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABRdQWOXYDLSbw6F/Iayel0O4dVlEMLmVgdRjE4tQqGYIAAABAiFaFK5WBUuMeaY1OfQR9hO0y47tbypqwIv0tb0pYBf2vRg9Y7Dy6AbhnZw9uJas1g4LwaU55OCMWcZQwZtguDA=='); -INSERT INTO scphistory VALUES ('GAGDAOMXIXF5U47SLBC5MBHNQKLX4VJXOA27LSA3CHBXAS3BFQTS34WF', 3, 'AAAAAAwwOZdFy9pz8lhF1gTtgpd+VTdwNfXIGxHDcEthLCctAAAAAAAAAAMAAAACAAAAAQAAADB+tK/Zyz3pLtSAf2EYJfbDa0m7r/c2n32NJaHIjIDGvwAAAABc9UxcAAAAAAAAAAAAAAABRdQWOXYDLSbw6F/Iayel0O4dVlEMLmVgdRjE4tQqGYIAAABAlAP9o9j8qk8W4EPo8W/EHvaEWACEEXuPDUgF3Bb+FDvZwOFl9iAdaq+AK9i6SCWm6WC1HAH9SzN1Ho7DguiRAw=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('45d4163976032d26f0e85fc86b27a5d0ee1d56510c2e65607518c4e2d42a1982', 3, 'AAAAAQAAAAEAAAAADDA5l0XL2nPyWEXWBO2Cl35VN3A19cgbEcNwS2EsJy0AAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '3d1582f6553a00296493dba6bb3d463c0eb7c417daf0c727391fcf832fefb05e'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAAMMDmXRcvac/JYRdYE7YKXflU3cDX1yBsRw3BLYSwnLQAAAAAAAAADAAAAA0XUFjl2Ay0m8OhfyGsnpdDuHVZRDC5lYHUYxOLUKhmCAAAAAQAAAJh+tK/Zyz3pLtSAf2EYJfbDa0m7r/c2n32NJaHIjIDGvwAAAABc9UxcAAAAAAAAAAEAAAAADDA5l0XL2nPyWEXWBO2Cl35VN3A19cgbEcNwS2EsJy0AAABA9W+I4dWqD7dZnjp+nT/NyUl0MXtIWh/MLFJuDvk11FWrpWZVexb/rFAalDJl+otKoaquk2Dku1VlSgDupA8LBgAAAAEAAACYfrSv2cs96S7UgH9hGCX2w2tJu6/3Np99jSWhyIyAxr8AAAAAXPVMXAAAAAAAAAABAAAAAAwwOZdFy9pz8lhF1gTtgpd+VTdwNfXIGxHDcEthLCctAAAAQPVviOHVqg+3WZ46fp0/zclJdDF7SFofzCxSbg75NdRVq6VmVXsW/6xQGpQyZfqLSqGqrpNg5LtVZUoA7qQPCwYAAABA5CM3Lb93LPj2uUojF+kpk3foRerGKfbDgJfiiYmBllLilNWfJMrsUoKaCDeOOXltGiK/wgVC19uUiv7i8eJCAgAAAAAMMDmXRcvac/JYRdYE7YKXflU3cDX1yBsRw3BLYSwnLQAAAAAAAAADAAAAAgAAAAEAAAAwfrSv2cs96S7UgH9hGCX2w2tJu6/3Np99jSWhyIyAxr8AAAAAXPVMXAAAAAAAAAAAAAAAAUXUFjl2Ay0m8OhfyGsnpdDuHVZRDC5lYHUYxOLUKhmCAAAAQJQD/aPY/KpPFuBD6PFvxB72hFgAhBF7jw1IBdwW/hQ72cDhZfYgHWqvgCvYukglpulgtRwB/UszdR6Ow4LokQMAAAABmMsu/PIevuB0EDsonN6EuRwEwDoVlD0c5GY1kGbTbygAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAYAAAABAAAAAQAAAAEAAAAADDA5l0XL2nPyWEXWBO2Cl35VN3A19cgbEcNwS2EsJy0AAAAA'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-horizon.sql deleted file mode 100644 index b7466e939b..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1-horizon.sql +++ /dev/null @@ -1,955 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, '3d1582f6553a00296493dba6bb3d463c0eb7c417daf0c727391fcf832fefb05e', '98cb2efcf21ebee074103b289cde84b91c04c03a15943d1ce466359066d36f28', 1, 1, '2019-06-03 16:35:40', '2019-06-03 16:35:42.432775', '2019-06-03 16:35:42.432775', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC5jLLvzyHr7gdBA7KJzehLkcBMA6FZQ9HORmNZBm028ofrSv2cs96S7UgH9hGCX2w2tJu6/3Np99jSWhyIyAxr8AAAAAXPVMXAAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '98cb2efcf21ebee074103b289cde84b91c04c03a15943d1ce466359066d36f28', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:35:39', '2019-06-03 16:35:42.448289', '2019-06-03 16:35:42.448289', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMWwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:35:42.461054', '2019-06-03 16:35:42.461054', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (2, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (4, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (5, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 5, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (2, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (4, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (5, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 5, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:35:42.432963', '2019-06-03 16:35:42.432963', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:35:42.448424', '2019-06-03 16:35:42.448424', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:35:42.448605', '2019-06-03 16:35:42.448605', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_1.rb deleted file mode 100644 index ccfb21be67..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_1.rb +++ /dev/null @@ -1,10 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD" -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-core.sql deleted file mode 100644 index 441d3f42ab..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-core.sql +++ /dev/null @@ -1,728 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999800, 8589934594, 1, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('3609e559ce9335b37e174b44c582b721d3f11dc4eb49de0efb672f76b41b9eec', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579853, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMzQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1276d34ca36295958f45f61de5659be4e1abdd9d66455adc13e9ec048ec6f2d6', '3609e559ce9335b37e174b44c582b721d3f11dc4eb49de0efb672f76b41b9eec', '90d0d3fb695b7e03b5c2de781e7a8839c18b2d4c713fb2e27f28d9a992860963', 3, 1559579854, 'AAAACzYJ5VnOkzWzfhdLRMWCtyHT8R3E60neDvtnL3a0G57sCW6zWwwoK9T+JmR/5oRTEhLJ7wlHg6aCX28MpKtXJxkAAAAAXPVMzgAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('a30feb1145fd3354ad5afc7d5b1f94d05b6dcfaecb0810d71fea1fee2d6b6052', '1276d34ca36295958f45f61de5659be4e1abdd9d66455adc13e9ec048ec6f2d6', 'af3f614d8425b8141cf20ccae41c149123549b96ff0359bbb218b6832d8d1e52', 4, 1559579855, 'AAAACxJ200yjYpWVj0X2HeVlm+Thq92dZkVa3BPp7ASOxvLWq8h8Dblv+wye4hdRsuy90Y3iCPafp7x2aYKeXPqn7vEAAAAAXPVMzwAAAAAAAAAA33EmKJw3Wal+OUXaW5YmJOts5uge1kmyR6dBxxKsgl2vP2FNhCW4FBzyDMrkHBSRI1Sblv8DWbuyGLaDLY0eUgAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCKUMVWLCKJ6WRKQV6TIEKQGEU7WJJHGSW56TANKNICMYBEXLSQWMSOY', 2, 'AAAAAJVGVssSk+tFUK+mgioGJT9kpOaVu+mBqmoEzASXXKFmAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9UzNAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABgOVCq4HOTTvRmr9C9eQN/Bx/d3oGBKU3NZjuT7q/SLAAAABAcK8Z0BCph+YH3QoxXjLf5t1d7AG8+vXP9i/T/kp61bBWcGGv63ttgkZjURIqPkB7Kb30MQqVi6Y4IzXgor3/BA=='); -INSERT INTO scphistory VALUES ('GCKUMVWLCKJ6WRKQV6TIEKQGEU7WJJHGSW56TANKNICMYBEXLSQWMSOY', 3, 'AAAAAJVGVssSk+tFUK+mgioGJT9kpOaVu+mBqmoEzASXXKFmAAAAAAAAAAMAAAACAAAAAQAAADAJbrNbDCgr1P4mZH/mhFMSEsnvCUeDpoJfbwykq1cnGQAAAABc9UzOAAAAAAAAAAAAAAABgOVCq4HOTTvRmr9C9eQN/Bx/d3oGBKU3NZjuT7q/SLAAAABAXzYkkA6k47JCx0DQwJ21l8w7TD6oxXfaHACMsbyzYiotIqwoF/dkf6g2/enQRzUvvFSmUQqDmwO3Y3249CXMCw=='); -INSERT INTO scphistory VALUES ('GCKUMVWLCKJ6WRKQV6TIEKQGEU7WJJHGSW56TANKNICMYBEXLSQWMSOY', 4, 'AAAAAJVGVssSk+tFUK+mgioGJT9kpOaVu+mBqmoEzASXXKFmAAAAAAAAAAQAAAACAAAAAQAAADCryHwNuW/7DJ7iF1Gy7L3RjeII9p+nvHZpgp5c+qfu8QAAAABc9UzPAAAAAAAAAAAAAAABgOVCq4HOTTvRmr9C9eQN/Bx/d3oGBKU3NZjuT7q/SLAAAABAIpmkMk9L1tGeI0Dc/EWJ91stWrm396pHYvdxd8bAJU8KL8dGI4w09tpcSo5XhngOHYOUHOVoiYlYDtyNu6O9AA=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('80e542ab81ce4d3bd19abf42f5e40dfc1c7f777a0604a5373598ee4fbabf48b0', 4, 'AAAAAQAAAAEAAAAAlUZWyxKT60VQr6aCKgYlP2Sk5pW76YGqagTMBJdcoWYAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 4, - "currentBuckets": [ - { - "curr": "fb148baeabc8528a03169adaecc8e9a16ee1356f6d52a54095090215acbf5f0c", - "next": { - "state": 0 - }, - "snap": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACVRlbLEpPrRVCvpoIqBiU/ZKTmlbvpgapqBMwEl1yhZgAAAAAAAAAEAAAAA4DlQquBzk070Zq/QvXkDfwcf3d6BgSlNzWY7k+6v0iwAAAAAQAAAJiryHwNuW/7DJ7iF1Gy7L3RjeII9p+nvHZpgp5c+qfu8QAAAABc9UzPAAAAAAAAAAEAAAAAlUZWyxKT60VQr6aCKgYlP2Sk5pW76YGqagTMBJdcoWYAAABAknaRqBLBJyJPdMkjBap/9/ZTCqwmdAgLaaemrGZg5DB6QWzdzAdmTtohwYsi5RWHN6E+z/yXHGmE5fcnJJtjAQAAAAEAAACYq8h8Dblv+wye4hdRsuy90Y3iCPafp7x2aYKeXPqn7vEAAAAAXPVMzwAAAAAAAAABAAAAAJVGVssSk+tFUK+mgioGJT9kpOaVu+mBqmoEzASXXKFmAAAAQJJ2kagSwSciT3TJIwWqf/f2UwqsJnQIC2mnpqxmYOQwekFs3cwHZk7aIcGLIuUVhzehPs/8lxxphOX3JySbYwEAAABAq/i0Fua8QcibSHCTT6xV/nj3AWI3EINa6sMH3zmEUj9A10PpAfl4KyKIVWdxs/33N64j6Via121cfW1+JrE6BQAAAACVRlbLEpPrRVCvpoIqBiU/ZKTmlbvpgapqBMwEl1yhZgAAAAAAAAAEAAAAAgAAAAEAAAAwq8h8Dblv+wye4hdRsuy90Y3iCPafp7x2aYKeXPqn7vEAAAAAXPVMzwAAAAAAAAAAAAAAAYDlQquBzk070Zq/QvXkDfwcf3d6BgSlNzWY7k+6v0iwAAAAQCKZpDJPS9bRniNA3PxFifdbLVq5t/eqR2L3cXfGwCVPCi/HRiOMNPbaXEqOV4Z4Dh2DlBzlaImJWA7cjbujvQAAAAABEnbTTKNilZWPRfYd5WWb5OGr3Z1mRVrcE+nsBI7G8tYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFp8rsD4Au1oeZkBT1RHIJRyxWayau3f5UjeA0w4+0LzjLEyi9nGMs8elAH4lDhhDJxCJ8HhxbG+XT/cmQsu1QAAAAABAAAAAQAAAAEAAAAAlUZWyxKT60VQr6aCKgYlP2Sk5pW76YGqagTMBJdcoWYAAAAA'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'a30feb1145fd3354ad5afc7d5b1f94d05b6dcfaecb0810d71fea1fee2d6b6052'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 0, 1, 4, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('4486298e04ffb1f3620c521f81adb5207f5d12c21b08a076589d2be3d8dae543', 4, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('4486298e04ffb1f3620c521f81adb5207f5d12c21b08a076589d2be3d8dae543', 4, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFp8rsD4Au1oeZkBT1RHIJRyxWayau3f5UjeA0w4+0LzjLEyi9nGMs8elAH4lDhhDJxCJ8HhxbG+XT/cmQsu1QA=', 'RIYpjgT/sfNiDFIfga21IH9dEsIbCKB2WJ0r49ja5UMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-horizon.sql deleted file mode 100644 index db1db21bd9..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2-horizon.sql +++ /dev/null @@ -1,961 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_accounts VALUES (3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 17179873281, 1, 22, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (4, 'a30feb1145fd3354ad5afc7d5b1f94d05b6dcfaecb0810d71fea1fee2d6b6052', '1276d34ca36295958f45f61de5659be4e1abdd9d66455adc13e9ec048ec6f2d6', 1, 1, '2019-06-03 16:37:35', '2019-06-03 16:37:36.392159', '2019-06-03 16:37:36.392159', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAACxJ200yjYpWVj0X2HeVlm+Thq92dZkVa3BPp7ASOxvLWq8h8Dblv+wye4hdRsuy90Y3iCPafp7x2aYKeXPqn7vEAAAAAXPVMzwAAAAAAAAAA33EmKJw3Wal+OUXaW5YmJOts5uge1kmyR6dBxxKsgl2vP2FNhCW4FBzyDMrkHBSRI1Sblv8DWbuyGLaDLY0eUgAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '1276d34ca36295958f45f61de5659be4e1abdd9d66455adc13e9ec048ec6f2d6', '3609e559ce9335b37e174b44c582b721d3f11dc4eb49de0efb672f76b41b9eec', 1, 1, '2019-06-03 16:37:34', '2019-06-03 16:37:36.410538', '2019-06-03 16:37:36.410539', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACzYJ5VnOkzWzfhdLRMWCtyHT8R3E60neDvtnL3a0G57sCW6zWwwoK9T+JmR/5oRTEhLJ7wlHg6aCX28MpKtXJxkAAAAAXPVMzgAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '3609e559ce9335b37e174b44c582b721d3f11dc4eb49de0efb672f76b41b9eec', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:37:33', '2019-06-03 16:37:36.421018', '2019-06-03 16:37:36.421018', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMzQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:37:36.435274', '2019-06-03 16:37:36.435274', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (2, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (5, 8589942785, 2); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 6, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (2, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (5, 8589942784, 2); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 6, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('4486298e04ffb1f3620c521f81adb5207f5d12c21b08a076589d2be3d8dae543', 4, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:37:36.392424', '2019-06-03 16:37:36.392424', 17179873280, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFp8rsD4Au1oeZkBT1RHIJRyxWayau3f5UjeA0w4+0LzjLEyi9nGMs8elAH4lDhhDJxCJ8HhxbG+XT/cmQsu1QA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{WnyuwPgC7Wh5mQFPVEcglHLFZrJq7d/lSN4DTDj7QvOMsTKL2cYyzx6UAfiUOGEMnEInweHFsb5dP9yZCy7VAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:37:36.410725', '2019-06-03 16:37:36.410726', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:37:36.421144', '2019-06-03 16:37:36.421144', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:37:36.421317', '2019-06-03 16:37:36.421317', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_2.rb deleted file mode 100644 index ca7046d767..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_2.rb +++ /dev/null @@ -1,13 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD" -close_ledger - -trust :scott, :usd_gateway, "USD" -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-core.sql deleted file mode 100644 index 12b0d0d81d..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-core.sql +++ /dev/null @@ -1,727 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999800, 8589934594, 2, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('7432efa86301e55aaf0772778f996607a4945206a3afa626ee66eb31d38d4837', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579836, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMvAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('0936020da1ec96a4a0c69e895a9080fd74767067417fe5fb1b0cdecf19fc1ab8', '7432efa86301e55aaf0772778f996607a4945206a3afa626ee66eb31d38d4837', '3f512ddd1f53ac05a81aad7e5b8ebf1d0f18f3c5c593047ae70c2ad14f8a0192', 3, 1559579837, 'AAAAC3Qy76hjAeVarwdyd4+ZZgeklFIGo6+mJu5m6zHTjUg3dXqDplvemlCQM2Eody4ZBZGHd1krjbstYqYhd/Rby1UAAAAAXPVMvQAAAAAAAAAAqZ+gKTLothY9s7mUE9wPGSzC2wvgaWBDyFO+d3wnDjI/US3dH1OsBagarX5bjr8dDxjzxcWTBHrnDCrRT4oBkgAAAAMN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GBJ4IGN5UMNLX74J4GLBB44FFWGMXULYJKU5NAFZCZK6PHNROHYC34SX', 2, 'AAAAAFPEGb2jGrv/ieGWEPOFLYzL0XhKqdaAuRZV552xcfAtAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9Uy8AAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABBc/MAEUGFFSjJd4Z5WQq+eH+7dSqCr1TUQKlC3gNfQUAAABANpwYYgSyUzriiK5pOT4fkjlpH3gdqNmpEYMp1Bvekq9aFiFDHHH3uIDmq85cs9FnNCibCYirFtIr0S3fIk/fAQ=='); -INSERT INTO scphistory VALUES ('GBJ4IGN5UMNLX74J4GLBB44FFWGMXULYJKU5NAFZCZK6PHNROHYC34SX', 3, 'AAAAAFPEGb2jGrv/ieGWEPOFLYzL0XhKqdaAuRZV552xcfAtAAAAAAAAAAMAAAACAAAAAQAAADB1eoOmW96aUJAzYSh3LhkFkYd3WSuNuy1ipiF39FvLVQAAAABc9Uy9AAAAAAAAAAAAAAABBc/MAEUGFFSjJd4Z5WQq+eH+7dSqCr1TUQKlC3gNfQUAAABA9Z+uUzrpFVeM5bdwOSubQlieCiXWBamGnR4o6bqV8AWAuK/opeM4DQwz9TMW9QWaCvfdKOl3xsa5EDFr7IBICQ=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('05cfcc0045061454a325de19e5642af9e1feedd4aa0abd535102a50b780d7d05', 3, 'AAAAAQAAAAEAAAAAU8QZvaMau/+J4ZYQ84UtjMvReEqp1oC5FlXnnbFx8C0AAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '0936020da1ec96a4a0c69e895a9080fd74767067417fe5fb1b0cdecf19fc1ab8'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "d3656f6420186a7b97c63b78f5c407f1576d99ceaf5309339f5eab53d29b1308", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAABTxBm9oxq7/4nhlhDzhS2My9F4SqnWgLkWVeedsXHwLQAAAAAAAAADAAAAAwXPzABFBhRUoyXeGeVkKvnh/u3Uqgq9U1ECpQt4DX0FAAAAAQAAAJh1eoOmW96aUJAzYSh3LhkFkYd3WSuNuy1ipiF39FvLVQAAAABc9Uy9AAAAAAAAAAEAAAAAU8QZvaMau/+J4ZYQ84UtjMvReEqp1oC5FlXnnbFx8C0AAABArzND55LUdHGo6jjcij57/6mxrOsaGr9Ly4z+iV2mI/U5SFOnT48ZZEjPpiSskD715V4+vI0tbab+B2vqfA8sAAAAAAEAAACYdXqDplvemlCQM2Eody4ZBZGHd1krjbstYqYhd/Rby1UAAAAAXPVMvQAAAAAAAAABAAAAAFPEGb2jGrv/ieGWEPOFLYzL0XhKqdaAuRZV552xcfAtAAAAQK8zQ+eS1HRxqOo43Io+e/+psazrGhq/S8uM/oldpiP1OUhTp0+PGWRIz6YkrJA+9eVePryNLW2m/gdr6nwPLAAAAABAInShh5nj3I2wjrnx41caB3S1Dcvofe1A7Tpf/0TEoUrCCq1Y0bFUFv7EqoNGKy5CTX6YAntgV3TNNNGx4WZ+DQAAAABTxBm9oxq7/4nhlhDzhS2My9F4SqnWgLkWVeedsXHwLQAAAAAAAAADAAAAAgAAAAEAAAAwdXqDplvemlCQM2Eody4ZBZGHd1krjbstYqYhd/Rby1UAAAAAXPVMvQAAAAAAAAAAAAAAAQXPzABFBhRUoyXeGeVkKvnh/u3Uqgq9U1ECpQt4DX0FAAAAQPWfrlM66RVXjOW3cDkrm0JYngol1gWphp0eKOm6lfAFgLiv6KXjOA0MM/UzFvUFmgr33Sjpd8bGuRAxa+yASAkAAAABdDLvqGMB5VqvB3J3j5lmB6SUUgajr6Ym7mbrMdONSDcAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEMgAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFIuyQo5bQLTEoP2UHNr/GyjDMHoqL9x3Zvsfw/Nz6c6pYtnWfb/TyhwkTctbte/EF0zzmevTiTz3COG3vJgWwoAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAAAFVU0QxAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vf/////////8AAAAAAAAAAa7kvkwAAABAlnxa5Z5su4ezAE1OQOcKgCguO9e1poqNj/bmON3IebZNmeh48q6uvJ10Y9OES5jsZhEnKZ1aSI6oN+cM+nQ0BgAAAAEAAAABAAAAAQAAAABTxBm9oxq7/4nhlhDzhS2My9F4SqnWgLkWVeedsXHwLQAAAAA='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD1', 9223372036854775807, 0, 1, 3, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD2', 9223372036854775807, 0, 1, 3, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c1fb42a38cf10241a172e577a71760921f59764ef844c88e70a8aa8a45cc95b3', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('373bb9329939fdb7d4448e72b01a4063e350b04a6c0f0434bc43413440d95bc0', 3, 2, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c1fb42a38cf10241a172e577a71760921f59764ef844c88e70a8aa8a45cc95b3', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEMQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQJZ8WuWebLuHswBNTkDnCoAoLjvXtaaKjY/25jjdyHm2TZnoePKurryddGPThEuY7GYRJymdWkiOqDfnDPp0NAY=', 'wftCo4zxAkGhcuV3pxdgkh9Zdk74RMiOcKiqikXMlbMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QxAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('373bb9329939fdb7d4448e72b01a4063e350b04a6c0f0434bc43413440d95bc0', 3, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEMgAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFIuyQo5bQLTEoP2UHNr/GyjDMHoqL9x3Zvsfw/Nz6c6pYtnWfb/TyhwkTctbte/EF0zzmevTiTz3COG3vJgWwo=', 'Nzu5Mpk5/bfURI5ysBpAY+NQsEpsDwQ0vENBNEDZW8AAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QyAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-horizon.sql deleted file mode 100644 index 86f3bb1089..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3-horizon.sql +++ /dev/null @@ -1,962 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); -INSERT INTO asset_stats VALUES (2, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD1', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_assets VALUES (2, 'credit_alphanum4', 'USD2', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 2, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD1", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD2", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, '0936020da1ec96a4a0c69e895a9080fd74767067417fe5fb1b0cdecf19fc1ab8', '7432efa86301e55aaf0772778f996607a4945206a3afa626ee66eb31d38d4837', 2, 2, '2019-06-03 16:37:17', '2019-06-03 16:37:19.125178', '2019-06-03 16:37:19.125178', 12884901888, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC3Qy76hjAeVarwdyd4+ZZgeklFIGo6+mJu5m6zHTjUg3dXqDplvemlCQM2Eody4ZBZGHd1krjbstYqYhd/Rby1UAAAAAXPVMvQAAAAAAAAAAqZ+gKTLothY9s7mUE9wPGSzC2wvgaWBDyFO+d3wnDjI/US3dH1OsBagarX5bjr8dDxjzxcWTBHrnDCrRT4oBkgAAAAMN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, '7432efa86301e55aaf0772778f996607a4945206a3afa626ee66eb31d38d4837', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:37:16', '2019-06-03 16:37:19.142791', '2019-06-03 16:37:19.142792', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMvAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:37:19.155776', '2019-06-03 16:37:19.155776', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (2, 12884910081, 1); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (5, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 6, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD1", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD2", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (2, 12884910080, 1); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (5, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 6, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('c1fb42a38cf10241a172e577a71760921f59764ef844c88e70a8aa8a45cc95b3', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:37:19.125465', '2019-06-03 16:37:19.125465', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEMQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQJZ8WuWebLuHswBNTkDnCoAoLjvXtaaKjY/25jjdyHm2TZnoePKurryddGPThEuY7GYRJymdWkiOqDfnDPp0NAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QxAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{lnxa5Z5su4ezAE1OQOcKgCguO9e1poqNj/bmON3IebZNmeh48q6uvJ10Y9OES5jsZhEnKZ1aSI6oN+cM+nQ0Bg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('373bb9329939fdb7d4448e72b01a4063e350b04a6c0f0434bc43413440d95bc0', 3, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:37:19.125835', '2019-06-03 16:37:19.125836', 12884910080, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEMgAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQFIuyQo5bQLTEoP2UHNr/GyjDMHoqL9x3Zvsfw/Nz6c6pYtnWfb/TyhwkTctbte/EF0zzmevTiTz3COG3vJgWwo=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QyAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Ui7JCjltAtMSg/ZQc2v8bKMMweiov3Hdm+x/D83Ppzqli2dZ9v9PKHCRNy1u178QXTPOZ69OJPPcI4be8mBbCg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:37:19.143014', '2019-06-03 16:37:19.143015', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:37:19.143366', '2019-06-03 16:37:19.143367', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_3.rb deleted file mode 100644 index 0b2732fd35..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_3.rb +++ /dev/null @@ -1,11 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD1" -trust :scott, :usd_gateway, "USD2" -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-core.sql deleted file mode 100644 index 192d347437..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-core.sql +++ /dev/null @@ -1,727 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('8f12435bd1a23276222695e5b65019af41e0b410395644ac360ab34ff5d72add', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579792, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMkAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('8aebdbebcb22c9e850aed4fc170a46f04cdbad757304ff80bdae9647d09e26e2', '8f12435bd1a23276222695e5b65019af41e0b410395644ac360ab34ff5d72add', 'dd2112db5529f4afd1ae4b55abde902c39c85289978be8667df794d92f46e2dc', 3, 1559579793, 'AAAAC48SQ1vRojJ2IiaV5bZQGa9B4LQQOVZErDYKs0/11yrdc7p1d2ioS/oGKu4qKjuT1c0Fvkqtyx6YdW1LbIMYKPcAAAAAXPVMkQAAAAAAAAAA49F11bpUjk7WVHNZpzNSuDZE+6J2QRCzbusrKlZkk6/dIRLbVSn0r9GuS1Wr3pAsOchSiZeL6GZ995TZL0bi3AAAAAMN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCKEESBPDVRVAYOZA4AQ77ABE6OISVH5VLANSOLKJDWAXGC4BDQ3T3FL', 2, 'AAAAAJRCSC8dY1Bh2QcBD/wBJ5yJVP2qwNk5akjsC5hcCOG5AAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9UyQAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABlrS/lBN1EwkwHTwMMTktFeIkfvPl7oinun5NXzwY5EcAAABAEz32lpwwRmsv/m8nb8UYFZV7UKYCcj/IPO9cfmYytdrZhPZ9dvJg5cLLb3muSB2YnNWMIZCLDE42NVIHmkIGAQ=='); -INSERT INTO scphistory VALUES ('GCKEESBPDVRVAYOZA4AQ77ABE6OISVH5VLANSOLKJDWAXGC4BDQ3T3FL', 3, 'AAAAAJRCSC8dY1Bh2QcBD/wBJ5yJVP2qwNk5akjsC5hcCOG5AAAAAAAAAAMAAAACAAAAAQAAADBzunV3aKhL+gYq7ioqO5PVzQW+Sq3LHph1bUtsgxgo9wAAAABc9UyRAAAAAAAAAAAAAAABlrS/lBN1EwkwHTwMMTktFeIkfvPl7oinun5NXzwY5EcAAABAH020Spzy8Ph9E25r7V3e19G4oFXOS2b3/YaWemzpiMWs2frQ9uHw4Jrk2EmxvCna7hgt31XC+Aviq4IEZb76BQ=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('96b4bf9413751309301d3c0c31392d15e2247ef3e5ee88a7ba7e4d5f3c18e447', 3, 'AAAAAQAAAAEAAAAAlEJILx1jUGHZBwEP/AEnnIlU/arA2TlqSOwLmFwI4bkAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '8aebdbebcb22c9e850aed4fc170a46f04cdbad757304ff80bdae9647d09e26e2'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "8f3301b4fe61769399f5fc9b495f3d6432acb10c1edcb691f45322c08d61154c", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACUQkgvHWNQYdkHAQ/8ASeciVT9qsDZOWpI7AuYXAjhuQAAAAAAAAADAAAAA5a0v5QTdRMJMB08DDE5LRXiJH7z5e6Ip7p+TV88GORHAAAAAQAAAJhzunV3aKhL+gYq7ioqO5PVzQW+Sq3LHph1bUtsgxgo9wAAAABc9UyRAAAAAAAAAAEAAAAAlEJILx1jUGHZBwEP/AEnnIlU/arA2TlqSOwLmFwI4bkAAABAHjCp6WI44GWSwOh2jGU84+45MBqG0CkgZtWG/8LePTpzFM4sQnNbdCfOn1Ir+PrELdadWYqyMCfIwnbv5j1vCwAAAAEAAACYc7p1d2ioS/oGKu4qKjuT1c0Fvkqtyx6YdW1LbIMYKPcAAAAAXPVMkQAAAAAAAAABAAAAAJRCSC8dY1Bh2QcBD/wBJ5yJVP2qwNk5akjsC5hcCOG5AAAAQB4wqeliOOBlksDodoxlPOPuOTAahtApIGbVhv/C3j06cxTOLEJzW3Qnzp9SK/j6xC3WnVmKsjAnyMJ27+Y9bwsAAABA/hey7v0d3+Fdz6XCw9urslSsijpsNNjFFxO4JgGPuuA3DT/Z24tQswwpt/RxeDpbMr1xcH/rdDmne1OOn8v4BwAAAACUQkgvHWNQYdkHAQ/8ASeciVT9qsDZOWpI7AuYXAjhuQAAAAAAAAADAAAAAgAAAAEAAAAwc7p1d2ioS/oGKu4qKjuT1c0Fvkqtyx6YdW1LbIMYKPcAAAAAXPVMkQAAAAAAAAAAAAAAAZa0v5QTdRMJMB08DDE5LRXiJH7z5e6Ip7p+TV88GORHAAAAQB9NtEqc8vD4fRNua+1d3tfRuKBVzktm9/2Glnps6YjFrNn60Pbh8OCa5NhJsbwp2u4YLd9VwvgL4quCBGW++gUAAAABjxJDW9GiMnYiJpXltlAZr0HgtBA5VkSsNgqzT/XXKt0AAAACAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TH//////////AAAAAAAAAAH5kC3vAAAAQKsXCTQaskp1gtnIfwAT8+KKY2+hL/bv7UMFLJ/Hz9usgndf5XhE/65EFJ936u99chtOaMCYDHFXzsAF//2LogMAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vf/////////8AAAAAAAAAAa7kvkwAAABAH2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBgAAAAEAAAABAAAAAQAAAACUQkgvHWNQYdkHAQ/8ASeciVT9qsDZOWpI7AuYXAjhuQAAAAA='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('2e85d9a320409ec6017076f0fb34809dcd723202d5af498af04350faa9a7e361', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('2e85d9a320409ec6017076f0fb34809dcd723202d5af498af04350faa9a7e361', 3, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TH//////////AAAAAAAAAAH5kC3vAAAAQKsXCTQaskp1gtnIfwAT8+KKY2+hL/bv7UMFLJ/Hz9usgndf5XhE/65EFJ936u99chtOaMCYDHFXzsAF//2LogM=', 'LoXZoyBAnsYBcHbw+zSAnc1yMgLVr0mK8ENQ+qmn42EAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-horizon.sql deleted file mode 100644 index b8bd9b28fb..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4-horizon.sql +++ /dev/null @@ -1,962 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); -INSERT INTO asset_stats VALUES (2, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_assets VALUES (2, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 2, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (2, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, '8aebdbebcb22c9e850aed4fc170a46f04cdbad757304ff80bdae9647d09e26e2', '8f12435bd1a23276222695e5b65019af41e0b410395644ac360ab34ff5d72add', 2, 2, '2019-06-03 16:36:33', '2019-06-03 16:36:35.723236', '2019-06-03 16:36:35.723236', 12884901888, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC48SQ1vRojJ2IiaV5bZQGa9B4LQQOVZErDYKs0/11yrdc7p1d2ioS/oGKu4qKjuT1c0Fvkqtyx6YdW1LbIMYKPcAAAAAXPVMkQAAAAAAAAAA49F11bpUjk7WVHNZpzNSuDZE+6J2QRCzbusrKlZkk6/dIRLbVSn0r9GuS1Wr3pAsOchSiZeL6GZ995TZL0bi3AAAAAMN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, '8f12435bd1a23276222695e5b65019af41e0b410395644ac360ab34ff5d72add', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:36:32', '2019-06-03 16:36:35.742229', '2019-06-03 16:36:35.742229', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMkAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:36:35.753194', '2019-06-03 16:36:35.753194', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (2, 12884910081, 1); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (5, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 6, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "trustor": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (2, 12884910080, 1); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (5, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 6, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('2e85d9a320409ec6017076f0fb34809dcd723202d5af498af04350faa9a7e361', 3, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:36:35.723448', '2019-06-03 16:36:35.723448', 12884905984, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TH//////////AAAAAAAAAAH5kC3vAAAAQKsXCTQaskp1gtnIfwAT8+KKY2+hL/bv7UMFLJ/Hz9usgndf5XhE/65EFJ936u99chtOaMCYDHFXzsAF//2LogM=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{qxcJNBqySnWC2ch/ABPz4opjb6Ev9u/tQwUsn8fP26yCd1/leET/rkQUn3fq731yG05owJgMcVfOwAX//YuiAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:36:35.723693', '2019-06-03 16:36:35.723693', 12884910080, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:36:35.74236', '2019-06-03 16:36:35.742361', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:36:35.742537', '2019-06-03 16:36:35.742537', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_4.rb deleted file mode 100644 index 91bde4fe1f..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_4.rb +++ /dev/null @@ -1,11 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD" -trust :usd_gateway, :scott, "USD" -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-core.sql deleted file mode 100644 index 1c05523ebd..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-core.sql +++ /dev/null @@ -1,728 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9899999800, 8589934594, 1, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 10100000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('3f34ac8ae79b89cf78bfd062a56b414eddb9c455125a23519084e9080609b6e6', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579784, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMiAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('4894f2f6ee4f3711000766708b952334b2c9e5cd9adf9766eba635ada86e07c8', '3f34ac8ae79b89cf78bfd062a56b414eddb9c455125a23519084e9080609b6e6', '90d0d3fb695b7e03b5c2de781e7a8839c18b2d4c713fb2e27f28d9a992860963', 3, 1559579785, 'AAAACz80rIrnm4nPeL/QYqVrQU7ducRVElojUZCE6QgGCbbm5qzEzYm6SssmcCmds1lUPaUqGPn6FnpRzo8OHaOcpjQAAAAAXPVMiQAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('f2cc16fb7bb74a913184795ec5e82b3bb312ba33b88805b127c6fab01fdbc845', '4894f2f6ee4f3711000766708b952334b2c9e5cd9adf9766eba635ada86e07c8', '91216354bd8994cf9383cd1650315e3f8b05ecfcb82564e34db2e392f008d97b', 4, 1559579786, 'AAAAC0iU8vbuTzcRAAdmcIuVIzSyyeXNmt+XZuumNa2obgfImVUk9WfW40WDvmUH4I5yOpRMKMngWIn7p53JiyLVJ44AAAAAXPVMigAAAAAAAAAA6Ap3Xy0qNN834YP/UI/nracOqnsrZT8u288mLAvc1ByRIWNUvYmUz5ODzRZQMV4/iwXs/LglZONNsuOS8AjZewAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GBYRMKMP6PTAYP4FZX4MZW4PLKG2YI4Y5S5UROX3TSV7BCFUWDNGYXQQ', 2, 'AAAAAHEWKY/z5gw/hc34zNuPWo2sI5jsu0i6+5yr8Ii0sNpsAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9UyIAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABOJ7dLC0I1XqEtb6jUp/WXiqSWPbj+TI5RPD7EvuDmkYAAABAY9aYGzkIyd9gFrcHElyDUUADaGYi908yjHcL/BNLNyoEEKDY39SJjyZSUppGqQMKHY9CopD38qOqy98aOzn5Bw=='); -INSERT INTO scphistory VALUES ('GBYRMKMP6PTAYP4FZX4MZW4PLKG2YI4Y5S5UROX3TSV7BCFUWDNGYXQQ', 3, 'AAAAAHEWKY/z5gw/hc34zNuPWo2sI5jsu0i6+5yr8Ii0sNpsAAAAAAAAAAMAAAACAAAAAQAAADDmrMTNibpKyyZwKZ2zWVQ9pSoY+foWelHOjw4do5ymNAAAAABc9UyJAAAAAAAAAAAAAAABOJ7dLC0I1XqEtb6jUp/WXiqSWPbj+TI5RPD7EvuDmkYAAABAP6q33Bftdq0MZL2yw7n6rDxDsMIZ5OnNmDnLBu23DZrGgsiy4/H8cyPQQsWIKYvR/8l4AQGLQ7ls2v2veuGvBA=='); -INSERT INTO scphistory VALUES ('GBYRMKMP6PTAYP4FZX4MZW4PLKG2YI4Y5S5UROX3TSV7BCFUWDNGYXQQ', 4, 'AAAAAHEWKY/z5gw/hc34zNuPWo2sI5jsu0i6+5yr8Ii0sNpsAAAAAAAAAAQAAAACAAAAAQAAADCZVST1Z9bjRYO+ZQfgjnI6lEwoyeBYifunncmLItUnjgAAAABc9UyKAAAAAAAAAAAAAAABOJ7dLC0I1XqEtb6jUp/WXiqSWPbj+TI5RPD7EvuDmkYAAABArr+UB51X7Yuf62iJQSEVzwjXI/Jzsr2B4W/77tvE/mrK8IvUn6+U4P422xV4dC7+K1UeZfz2paQbGhq7ErODDA=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('389edd2c2d08d57a84b5bea3529fd65e2a9258f6e3f9323944f0fb12fb839a46', 4, 'AAAAAQAAAAEAAAAAcRYpj/PmDD+FzfjM249ajawjmOy7SLr7nKvwiLSw2mwAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 4, - "currentBuckets": [ - { - "curr": "854f6be6f46266f9d2fee50ba44a5b997fa6a973e737dd1985acb395199490c0", - "next": { - "state": 0 - }, - "snap": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAABxFimP8+YMP4XN+Mzbj1qNrCOY7LtIuvucq/CItLDabAAAAAAAAAAEAAAAAzie3SwtCNV6hLW+o1Kf1l4qklj24/kyOUTw+xL7g5pGAAAAAQAAAJiZVST1Z9bjRYO+ZQfgjnI6lEwoyeBYifunncmLItUnjgAAAABc9UyKAAAAAAAAAAEAAAAAcRYpj/PmDD+FzfjM249ajawjmOy7SLr7nKvwiLSw2mwAAABALOkpCJPnJLZ4gvuhu5cBD12PK2vUMx8stp+Kg5ETgmbFfxMUWpDjKVd/6VuRtiyjIdn0qC4WAJQu7USHggBzCgAAAAEAAACYmVUk9WfW40WDvmUH4I5yOpRMKMngWIn7p53JiyLVJ44AAAAAXPVMigAAAAAAAAABAAAAAHEWKY/z5gw/hc34zNuPWo2sI5jsu0i6+5yr8Ii0sNpsAAAAQCzpKQiT5yS2eIL7obuXAQ9djytr1DMfLLafioORE4JmxX8TFFqQ4ylXf+lbkbYsoyHZ9KguFgCULu1Eh4IAcwoAAABA4ySgQHshZ/lpvjxOSguIK0vyxJGW0nlEH05l3iXjmQopBTAR4UcvbN4JpfxgNuPBzZN/b/pBTspQrPhZ6xKmCwAAAABxFimP8+YMP4XN+Mzbj1qNrCOY7LtIuvucq/CItLDabAAAAAAAAAAEAAAAAgAAAAEAAAAwmVUk9WfW40WDvmUH4I5yOpRMKMngWIn7p53JiyLVJ44AAAAAXPVMigAAAAAAAAAAAAAAATie3SwtCNV6hLW+o1Kf1l4qklj24/kyOUTw+xL7g5pGAAAAQK6/lAedV+2Ln+toiUEhFc8I1yPyc7K9geFv++7bxP5qyvCL1J+vlOD+NtsVeHQu/itVHmX89qWkGxoauxKzgwwAAAABSJTy9u5PNxEAB2Zwi5UjNLLJ5c2a35dm66Y1rahuB8gAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAAAX14QAAAAAAAAAAAa7kvkwAAABAD8OHQOSeNgKiCX3tTSvuXhy2/pE8FTbrkHZ0FfVBYAjka/2DIQuvVw98shOatgxBUcAAE6v10atB+uEfUIRCAgAAAAEAAAABAAAAAQAAAABxFimP8+YMP4XN+Mzbj1qNrCOY7LtIuvucq/CItLDabAAAAAA='); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'f2cc16fb7bb74a913184795ec5e82b3bb312ba33b88805b127c6fab01fdbc845'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 0, 1, 3, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5eba4195dc8326158c5d87c641a2f17a3a276f8889c1ade84b5c60b462684bc0', 4, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5eba4195dc8326158c5d87c641a2f17a3a276f8889c1ade84b5c60b462684bc0', 4, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAAAX14QAAAAAAAAAAAa7kvkwAAABAD8OHQOSeNgKiCX3tTSvuXhy2/pE8FTbrkHZ0FfVBYAjka/2DIQuvVw98shOatgxBUcAAE6v10atB+uEfUIRCAg==', 'XrpBldyDJhWMXYfGQaLxejonb4iJwa3oS1xgtGJoS8AAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJaAcUAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJOFgI4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-horizon.sql deleted file mode 100644 index ff2a4c1594..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5-horizon.sql +++ /dev/null @@ -1,964 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '0', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 17179873281, 1, 2, '{"amount": "10.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 17179873281, 2, 3, '{"amount": "10.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (4, 'f2cc16fb7bb74a913184795ec5e82b3bb312ba33b88805b127c6fab01fdbc845', '4894f2f6ee4f3711000766708b952334b2c9e5cd9adf9766eba635ada86e07c8', 1, 1, '2019-06-03 16:36:26', '2019-06-03 16:36:27.204137', '2019-06-03 16:36:27.204137', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC0iU8vbuTzcRAAdmcIuVIzSyyeXNmt+XZuumNa2obgfImVUk9WfW40WDvmUH4I5yOpRMKMngWIn7p53JiyLVJ44AAAAAXPVMigAAAAAAAAAA6Ap3Xy0qNN834YP/UI/nracOqnsrZT8u288mLAvc1ByRIWNUvYmUz5ODzRZQMV4/iwXs/LglZONNsuOS8AjZewAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '4894f2f6ee4f3711000766708b952334b2c9e5cd9adf9766eba635ada86e07c8', '3f34ac8ae79b89cf78bfd062a56b414eddb9c455125a23519084e9080609b6e6', 1, 1, '2019-06-03 16:36:25', '2019-06-03 16:36:27.227916', '2019-06-03 16:36:27.227916', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACz80rIrnm4nPeL/QYqVrQU7ducRVElojUZCE6QgGCbbm5qzEzYm6SssmcCmds1lUPaUqGPn6FnpRzo8OHaOcpjQAAAAAXPVMiQAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '3f34ac8ae79b89cf78bfd062a56b414eddb9c455125a23519084e9080609b6e6', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:36:24', '2019-06-03 16:36:27.241769', '2019-06-03 16:36:27.241769', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMiAAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:36:27.25427', '2019-06-03 16:36:27.25427', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (2, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (3, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (5, 8589938689, 1); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (7, 8589942785, 2); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 7, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "amount": "10.0000000", "asset_type": "native"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (2, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (3, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (5, 8589938688, 1); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (7, 8589942784, 2); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 7, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('5eba4195dc8326158c5d87c641a2f17a3a276f8889c1ade84b5c60b462684bc0', 4, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:36:27.204356', '2019-06-03 16:36:27.204356', 17179873280, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAAAX14QAAAAAAAAAAAa7kvkwAAABAD8OHQOSeNgKiCX3tTSvuXhy2/pE8FTbrkHZ0FfVBYAjka/2DIQuvVw98shOatgxBUcAAE6v10atB+uEfUIRCAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJaAcUAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJOFgI4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{D8OHQOSeNgKiCX3tTSvuXhy2/pE8FTbrkHZ0FfVBYAjka/2DIQuvVw98shOatgxBUcAAE6v10atB+uEfUIRCAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:36:27.228085', '2019-06-03 16:36:27.228085', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:36:27.242034', '2019-06-03 16:36:27.242034', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:36:27.242277', '2019-06-03 16:36:27.242277', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_5.rb deleted file mode 100644 index 7f4d2b94e5..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_5.rb +++ /dev/null @@ -1,13 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD" -close_ledger - -payment :scott, :usd_gateway, [:native, "10.00"] -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-core.sql deleted file mode 100644 index 2f850ae136..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-core.sql +++ /dev/null @@ -1,728 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1a53a62e971d98d3d68ee79d441faae6cd2630ba77d001d45e746d285c493c88', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579870, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVM3gAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('0ec1fa4449aca562f2faa84cb742bbeb3c058c1f1bb824a252be217fd7b20c3a', '1a53a62e971d98d3d68ee79d441faae6cd2630ba77d001d45e746d285c493c88', '90d0d3fb695b7e03b5c2de781e7a8839c18b2d4c713fb2e27f28d9a992860963', 3, 1559579871, 'AAAACxpTpi6XHZjT1o7nnUQfqubNJjC6d9AB1F50bShcSTyIZS9kdwZoE5n2wefynfMkhpZJIZb7Li/oLXyYsPVCmWUAAAAAXPVM3wAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('d37666cd87e03990ff15d97dfb78842d45d8ee1b1647e3b3ce442b24b48eb897', '0ec1fa4449aca562f2faa84cb742bbeb3c058c1f1bb824a252be217fd7b20c3a', 'c77022f15d1ada8ef257889b9f2e9cc6d5137903fbd9100af411602fe7efab2d', 4, 1559579872, 'AAAACw7B+kRJrKVi8vqoTLdCu+s8BYwfG7gkolK+IX/Xsgw6mLQGbHGkrhoGuUXXla4bmbTTTPC7Sqc+4AriwFv0lj4AAAAAXPVM4AAAAAAAAAAAD7vJ2GXYn9oO/fo5QrmHKnTVIqBarv7BmCtsbOtbf6THcCLxXRrajvJXiJufLpzG1RN5A/vZEAr0EWAv5++rLQAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCIHGSHT7XIJVBEMNTY43I2EVB57FPDVIZWKOHPHXUNFADPVCLDQDC22', 2, 'AAAAAJBzSPP90JqEjGzxzaNEqHvyvHVGbKcd570aUA31EscBAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9UzeAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABmU6Za5Mcq2/JocOLDKqxpcAQj3/DF6akjjzmnxLc2EUAAABATtNudx1qB1EeBJ99+9ymFQOyDj0VP/Brj3Um5lT4nOcqyqMLEAsjcDDutPkB8l0I9Boia6mYPckJFxvkk7xvDQ=='); -INSERT INTO scphistory VALUES ('GCIHGSHT7XIJVBEMNTY43I2EVB57FPDVIZWKOHPHXUNFADPVCLDQDC22', 3, 'AAAAAJBzSPP90JqEjGzxzaNEqHvyvHVGbKcd570aUA31EscBAAAAAAAAAAMAAAACAAAAAQAAADBlL2R3BmgTmfbB5/Kd8ySGlkkhlvsuL+gtfJiw9UKZZQAAAABc9UzfAAAAAAAAAAAAAAABmU6Za5Mcq2/JocOLDKqxpcAQj3/DF6akjjzmnxLc2EUAAABA/7xv6cxg7+ajR/IDW5hqLWMEkOgWyq9q6wMaLBid/xkmqIvUsn7STtNC10Yymh9CdiRxTtlZYc8jGgDT14WFBQ=='); -INSERT INTO scphistory VALUES ('GCIHGSHT7XIJVBEMNTY43I2EVB57FPDVIZWKOHPHXUNFADPVCLDQDC22', 4, 'AAAAAJBzSPP90JqEjGzxzaNEqHvyvHVGbKcd570aUA31EscBAAAAAAAAAAQAAAACAAAAAQAAADCYtAZscaSuGga5RdeVrhuZtNNM8LtKpz7gCuLAW/SWPgAAAABc9UzgAAAAAAAAAAAAAAABmU6Za5Mcq2/JocOLDKqxpcAQj3/DF6akjjzmnxLc2EUAAABARfIwF5ma212VUNa/+89u8QmwvxItXhaygOzyR5OOhkc6NYVH+iv/TWpD3Np5szZyiK6zWfGaGdF9bY5Xb9+fCA=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('994e996b931cab6fc9a1c38b0caab1a5c0108f7fc317a6a48e3ce69f12dcd845', 4, 'AAAAAQAAAAEAAAAAkHNI8/3QmoSMbPHNo0Soe/K8dUZspx3nvRpQDfUSxwEAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 4, - "currentBuckets": [ - { - "curr": "20ccae7eb93c304f558db1b9754d92de16660361a274da8f7bf36746466891e9", - "next": { - "state": 0 - }, - "snap": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACQc0jz/dCahIxs8c2jRKh78rx1RmynHee9GlAN9RLHAQAAAAAAAAAEAAAAA5lOmWuTHKtvyaHDiwyqsaXAEI9/wxempI485p8S3NhFAAAAAQAAAJiYtAZscaSuGga5RdeVrhuZtNNM8LtKpz7gCuLAW/SWPgAAAABc9UzgAAAAAAAAAAEAAAAAkHNI8/3QmoSMbPHNo0Soe/K8dUZspx3nvRpQDfUSxwEAAABACeMTSdGKh0uqmNYXE3suqhmtAUOoShd+2sIjSR/F5ICkIx/hm1fA30c2+viAMlTdRBYRrwPJTpLBxmC44LvxAAAAAAEAAACYmLQGbHGkrhoGuUXXla4bmbTTTPC7Sqc+4AriwFv0lj4AAAAAXPVM4AAAAAAAAAABAAAAAJBzSPP90JqEjGzxzaNEqHvyvHVGbKcd570aUA31EscBAAAAQAnjE0nRiodLqpjWFxN7LqoZrQFDqEoXftrCI0kfxeSApCMf4ZtXwN9HNvr4gDJU3UQWEa8DyU6SwcZguOC78QAAAABAs7AVy2qSuNnrmWVjV0hX4PSl86iS8q9i/frvuW20lWGmp/af5SlekWZlbiHCP24kKws2JkSdoMzcQzfO9ldlAgAAAACQc0jz/dCahIxs8c2jRKh78rx1RmynHee9GlAN9RLHAQAAAAAAAAAEAAAAAgAAAAEAAAAwmLQGbHGkrhoGuUXXla4bmbTTTPC7Sqc+4AriwFv0lj4AAAAAXPVM4AAAAAAAAAAAAAAAAZlOmWuTHKtvyaHDiwyqsaXAEI9/wxempI485p8S3NhFAAAAQEXyMBeZmttdlVDWv/vPbvEJsL8SLV4WsoDs8keTjoZHOjWFR/or/01qQ9zaebM2coius1nxmhnRfW2OV2/fnwgAAAABDsH6REmspWLy+qhMt0K76zwFjB8buCSiUr4hf9eyDDoAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA8VyioAAAAAAAAAAH5kC3vAAAAQEceJbYupnWlUerU60gfpFg8Nk2a3A6QMSfVgQoNFZOLjN7zc4w7jBxwiFIUi6pyXJNNQpL2OQxTnV4gs9lDrgQAAAABAAAAAQAAAAEAAAAAkHNI8/3QmoSMbPHNo0Soe/K8dUZspx3nvRpQDfUSxwEAAAAA'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'd37666cd87e03990ff15d97dfb78842d45d8ee1b1647e3b3ce442b24b48eb897'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 1012345000, 1, 4, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA8VyioAAAAAAAAAAH5kC3vAAAAQEceJbYupnWlUerU60gfpFg8Nk2a3A6QMSfVgQoNFZOLjN7zc4w7jBxwiFIUi6pyXJNNQpL2OQxTnV4gs9lDrgQ=', 'UkPGk08PtQF3WIaao7/1Pdw4nPgYYc+uYQzCJarhjMwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-horizon.sql deleted file mode 100644 index bb0c1ec2f3..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6-horizon.sql +++ /dev/null @@ -1,964 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '1012345000', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 17179873281, 1, 2, '{"amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179873281, 2, 3, '{"amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (4, 'd37666cd87e03990ff15d97dfb78842d45d8ee1b1647e3b3ce442b24b48eb897', '0ec1fa4449aca562f2faa84cb742bbeb3c058c1f1bb824a252be217fd7b20c3a', 1, 1, '2019-06-03 16:37:52', '2019-06-03 16:37:54.220083', '2019-06-03 16:37:54.220083', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAACw7B+kRJrKVi8vqoTLdCu+s8BYwfG7gkolK+IX/Xsgw6mLQGbHGkrhoGuUXXla4bmbTTTPC7Sqc+4AriwFv0lj4AAAAAXPVM4AAAAAAAAAAAD7vJ2GXYn9oO/fo5QrmHKnTVIqBarv7BmCtsbOtbf6THcCLxXRrajvJXiJufLpzG1RN5A/vZEAr0EWAv5++rLQAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '0ec1fa4449aca562f2faa84cb742bbeb3c058c1f1bb824a252be217fd7b20c3a', '1a53a62e971d98d3d68ee79d441faae6cd2630ba77d001d45e746d285c493c88', 1, 1, '2019-06-03 16:37:51', '2019-06-03 16:37:54.251432', '2019-06-03 16:37:54.251432', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACxpTpi6XHZjT1o7nnUQfqubNJjC6d9AB1F50bShcSTyIZS9kdwZoE5n2wefynfMkhpZJIZb7Li/oLXyYsPVCmWUAAAAAXPVM3wAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '1a53a62e971d98d3d68ee79d441faae6cd2630ba77d001d45e746d285c493c88', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:37:50', '2019-06-03 16:37:54.261839', '2019-06-03 16:37:54.261839', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVM3gAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:37:54.275122', '2019-06-03 16:37:54.275122', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (2, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (3, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (5, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (7, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 7, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (2, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (3, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (5, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (7, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 7, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:37:54.220262', '2019-06-03 16:37:54.220262', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA8VyioAAAAAAAAAAH5kC3vAAAAQEceJbYupnWlUerU60gfpFg8Nk2a3A6QMSfVgQoNFZOLjN7zc4w7jBxwiFIUi6pyXJNNQpL2OQxTnV4gs9lDrgQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Rx4lti6mdaVR6tTrSB+kWDw2TZrcDpAxJ9WBCg0Vk4uM3vNzjDuMHHCIUhSLqnJck01CkvY5DFOdXiCz2UOuBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:37:54.251653', '2019-06-03 16:37:54.251653', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:37:54.261943', '2019-06-03 16:37:54.261944', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:37:54.262125', '2019-06-03 16:37:54.262125', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_6.rb deleted file mode 100644 index 4405628441..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_6.rb +++ /dev/null @@ -1,14 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -close_ledger - -trust :scott, :usd_gateway, "USD" -close_ledger - -# issue asset to :scott -payment :usd_gateway, :scott, ["USD", :usd_gateway, "101.2345"] -close_ledger diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-core.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-core.sql deleted file mode 100644 index a6366a0911..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-core.sql +++ /dev/null @@ -1,738 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999969999999700, 3, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 9999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999800, 8589934594, 1, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('f323001ebc2b87bd5e6d5f876dc04b4c14752d5739dd6db1b85b31cfb961718b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 'ed397b2691125cc979a57b664a163ce14e4d2edf5759a08917e75ba89dc7cfe3', 2, 1559579819, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Z9GwX6q8KzxXUDk3+fdZshszCWX2SbuAnJNMiSoulCykAAAAAXPVMqwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAACyk/eWGAYEOhla9SxZHjkxGIQ61pIijmPF9hVp1Qv5rtOXsmkRJcyXmle2ZKFjzhTk0u31dZoIkX51uoncfP4wAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('5d5396461879e749e998097d068ea7bf49c01084ab407bd1cd17290194de5c34', 'f323001ebc2b87bd5e6d5f876dc04b4c14752d5739dd6db1b85b31cfb961718b', 'f2d7ce37add2f34386fe1aeb375d6ff4d946cf097f32c6e066bddee98ecbab22', 3, 1559579820, 'AAAAC/MjAB68K4e9Xm1fh23AS0wUdS1XOd1tsbhbMc+5YXGLxuKqOY6UQEYjj1Z8YTay62+StbkZ1TpuQgaIZivyX44AAAAAXPVMrAAAAAAAAAAACZ7JC4EHnY0GXRNEwciolY7p1One+T5tlBKrlCdwa0Dy1843rdLzQ4b+Gus3XW/02UbPCX8yxuBmvd7pjsurIgAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('62ae95288153ec34e794eb0a3ec2b9788d1e82a48ee0629f4139312a37b35924', '5d5396461879e749e998097d068ea7bf49c01084ab407bd1cd17290194de5c34', 'ef4a8106cff703b8f6c6e83a40d84adec3a532d76c34f967b35fa38d49193854', 4, 1559579821, 'AAAAC11TlkYYeedJ6ZgJfQaOp79JwBCEq0B70c0XKQGU3lw0jAOj6Tx085X3/Z6J7mYHycS8g7u514DI1J/3rp8DNHkAAAAAXPVMrQAAAAAAAAAAD7vJ2GXYn9oO/fo5QrmHKnTVIqBarv7BmCtsbOtbf6TvSoEGz/cDuPbG6DpA2Erew6Uy12w0+WezX6ONSRk4VAAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('a9769933d6fe5907b5b883df11c175e31a7c7c19d4024862b2c7c39845f62a2a', '62ae95288153ec34e794eb0a3ec2b9788d1e82a48ee0629f4139312a37b35924', 'd550cc0ecc2742bd740e8ed99512b38302165ac5c1cc4208c6b4e33152240a4f', 5, 1559579822, 'AAAAC2KulSiBU+w055TrCj7CuXiNHoKkjuBin0E5MSo3s1kk9buypkSeADep/pTWlpB9E6Equk5xmpuvFyFwqdZLY9sAAAAAXPVMrgAAAAAAAAAAuMBMcxg1gTklVN8u2mY/OPQmKCMsWP3OArGw6LUyTlnVUMwOzCdCvXQOjtmVErODAhZaxcHMQgjGtOMxUiQKTwAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GA6Z2PV5PPSFWXY2ZK3QZPBUMEF77JU4E2N422RG23T3HLLZBD4DXPDN', 2, 'AAAAAD2dPr175FtfGsq3DLw0YQv/ppwmm81qJtbns615CPg7AAAAAAAAAAIAAAACAAAAAQAAAEj0bBfqrwrPFdQOTf591myGzMJZfZJu4Cck0yJKi6ULKQAAAABc9UyrAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABKEizrp6YhYIss7axnG1vFu/Vdo162i2I7WS3QaaKdkUAAABA9isi1BV16raSAeVWGxedpdvFWZOa0PW/Of3cY8mcPeyX0AtD1wokZb1c4/t3+n54NTLm2zJp01tgth66bc+fAQ=='); -INSERT INTO scphistory VALUES ('GA6Z2PV5PPSFWXY2ZK3QZPBUMEF77JU4E2N422RG23T3HLLZBD4DXPDN', 3, 'AAAAAD2dPr175FtfGsq3DLw0YQv/ppwmm81qJtbns615CPg7AAAAAAAAAAMAAAACAAAAAQAAADDG4qo5jpRARiOPVnxhNrLrb5K1uRnVOm5CBohmK/JfjgAAAABc9UysAAAAAAAAAAAAAAABKEizrp6YhYIss7axnG1vFu/Vdo162i2I7WS3QaaKdkUAAABA+f/bSq3rRLRcbNHPkSqVjqQV9Ne63hRFp0W4sYGV6UI7cjuo+CstigkhYYRdhRK6HJNSgb3aXBi7gjXgeloUDA=='); -INSERT INTO scphistory VALUES ('GA6Z2PV5PPSFWXY2ZK3QZPBUMEF77JU4E2N422RG23T3HLLZBD4DXPDN', 4, 'AAAAAD2dPr175FtfGsq3DLw0YQv/ppwmm81qJtbns615CPg7AAAAAAAAAAQAAAACAAAAAQAAADCMA6PpPHTzlff9nonuZgfJxLyDu7nXgMjUn/eunwM0eQAAAABc9UytAAAAAAAAAAAAAAABKEizrp6YhYIss7axnG1vFu/Vdo162i2I7WS3QaaKdkUAAABA2nniVMXOZiv5k9ilhn8/wiROd/tMC82cRMFfP9qn4cs24XDkpTbnVWdQEDm3Wmzbwyoul7EHrxnSZGtuzlmqDg=='); -INSERT INTO scphistory VALUES ('GA6Z2PV5PPSFWXY2ZK3QZPBUMEF77JU4E2N422RG23T3HLLZBD4DXPDN', 5, 'AAAAAD2dPr175FtfGsq3DLw0YQv/ppwmm81qJtbns615CPg7AAAAAAAAAAUAAAACAAAAAQAAADD1u7KmRJ4AN6n+lNaWkH0ToSq6TnGam68XIXCp1ktj2wAAAABc9UyuAAAAAAAAAAAAAAABKEizrp6YhYIss7axnG1vFu/Vdo162i2I7WS3QaaKdkUAAABAvDzHDnTbYb1i0qh6st4L9fSPvmOdmklzKlLlWJnpZZ4wm+DL+XmslROrtAVSaQBCaLBq99A+clJDLE3U/mYSCQ=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('2848b3ae9e9885822cb3b6b19c6d6f16efd5768d7ada2d88ed64b741a68a7645', 5, 'AAAAAQAAAAEAAAAAPZ0+vXvkW18ayrcMvDRhC/+mnCabzWom1uezrXkI+DsAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastclosedledger ', 'a9769933d6fe5907b5b883df11c175e31a7c7c19d4024862b2c7c39845f62a2a'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 5, - "currentBuckets": [ - { - "curr": "008f9a7dd08840564efe5a0e1fbd74cc3539c1745bf2f35dcb35cf7d6f7d0686", - "next": { - "state": 0 - }, - "snap": "2a93b268c88dae143487e146e2c0fc5234a596d85c750b47ea1ac7b6f0b2fc82" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "2a93b268c88dae143487e146e2c0fc5234a596d85c750b47ea1ac7b6f0b2fc82" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAA9nT69e+RbXxrKtwy8NGEL/6acJpvNaibW57OteQj4OwAAAAAAAAAFAAAAAyhIs66emIWCLLO2sZxtbxbv1XaNetotiO1kt0GminZFAAAAAQAAAJj1u7KmRJ4AN6n+lNaWkH0ToSq6TnGam68XIXCp1ktj2wAAAABc9UyuAAAAAAAAAAEAAAAAPZ0+vXvkW18ayrcMvDRhC/+mnCabzWom1uezrXkI+DsAAABAiBPvxOHIiXZSj6szlWODBZIt54EF8UTErjYzWXcp+/lVul7IxmraghQXJwUrljfzIl0mU5xFr8+5he6pxBQ8DwAAAAEAAACY9buypkSeADep/pTWlpB9E6Equk5xmpuvFyFwqdZLY9sAAAAAXPVMrgAAAAAAAAABAAAAAD2dPr175FtfGsq3DLw0YQv/ppwmm81qJtbns615CPg7AAAAQIgT78ThyIl2Uo+rM5VjgwWSLeeBBfFExK42M1l3Kfv5VbpeyMZq2oIUFycFK5Y38yJdJlOcRa/PuYXuqcQUPA8AAABArGSTP6ytQRmZfEJrAj6tPeRf+YGMrZxjVadOxNEqc9drej1KaOIGWH4EPsgKDiE3qOgeuyOMej7ydrylZMdTAgAAAAA9nT69e+RbXxrKtwy8NGEL/6acJpvNaibW57OteQj4OwAAAAAAAAAFAAAAAgAAAAEAAAAw9buypkSeADep/pTWlpB9E6Equk5xmpuvFyFwqdZLY9sAAAAAXPVMrgAAAAAAAAAAAAAAAShIs66emIWCLLO2sZxtbxbv1XaNetotiO1kt0GminZFAAAAQLw8xw5022G9YtKoerLeC/X0j75jnZpJcypS5ViZ6WWeMJvgy/l5rJUTq7QFUmkAQmiwavfQPnJSQyxN1P5mEgkAAAABYq6VKIFT7DTnlOsKPsK5eI0egqSO4GKfQTkxKjezWSQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAGCKWwAAAAAAAAAAGu5L5MAAAAQOduHh8u6n4aETFH/A6BiFlfEPqDszcZVcoCIRvAY33jJ+1aQxY8IyUQpF0oXbcKVegzVZNO81OUEN/9I5F/DgIAAAABAAAAAQAAAAEAAAAAPZ0+vXvkW18ayrcMvDRhC/+mnCabzWom1uezrXkI+DsAAAAA'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 101230000, 1, 5, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 911115000, 1, 5, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('725756b1fbdf83b08127f385efedf0909cc820b6cce71f1c0897d15427cb5add', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('00ab9cfce2b4c4141d8bb6768dd094bdbb1c7406710dbb3ba0ef98870f63a344', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('d867852608d9aaf21e1f7bacb98e75fd5cb39be10d70c9cbcc80391d73728869', 5, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('725756b1fbdf83b08127f385efedf0909cc820b6cce71f1c0897d15427cb5add', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBj4gBQ/BAbgqf7qOotatgZUHjDlsOtDNdp7alZR5/Fk9fGj+lxEygAZWzY7/LY1Z3SF6c0qs172LhAkkvV8p0M', 'cldWsfvfg7CBJ/OF7+3wkJzIILbM5x8cCJfRVCfLWt0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('00ab9cfce2b4c4141d8bb6768dd094bdbb1c7406710dbb3ba0ef98870f63a344', 3, 1, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAEnciLVAAAAQLVbII+1LeizxgncDI46KHyBt05+H92n1+R328J9zNl2fgJW2nfn3FIoLVs2qV1+CUpr121a2B7AM6HKr4nBLAI=', 'AKuc/OK0xBQdi7Z2jdCUvbscdAZxDbs7oO+Yhw9jo0QAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA8VyioAAAAAAAAAAH5kC3vAAAAQEceJbYupnWlUerU60gfpFg8Nk2a3A6QMSfVgQoNFZOLjN7zc4w7jBxwiFIUi6pyXJNNQpL2OQxTnV4gs9lDrgQ=', 'UkPGk08PtQF3WIaao7/1Pdw4nPgYYc+uYQzCJarhjMwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('d867852608d9aaf21e1f7bacb98e75fd5cb39be10d70c9cbcc80391d73728869', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAGCKWwAAAAAAAAAAGu5L5MAAAAQOduHh8u6n4aETFH/A6BiFlfEPqDszcZVcoCIRvAY33jJ+1aQxY8IyUQpF0oXbcKVegzVZNO81OUEN/9I5F/DgI=', '2GeFJgjZqvIeH3usuY51/Vyzm+ENcMnLzIA5HXNyiGkAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAADAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAYIpbB//////////wAAAAEAAAAAAAAAAAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADZOgvh//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-horizon.sql b/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-horizon.sql deleted file mode 100644 index e6a1c36888..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7-horizon.sql +++ /dev/null @@ -1,988 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '1012345000', 2, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); -INSERT INTO history_accounts VALUES (3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 4, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (2, 21474840577, 1, 2, '{"amount": "10.1230000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 21474840577, 2, 3, '{"amount": "10.1230000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179873281, 1, 2, '{"amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179873281, 2, 3, '{"amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589946881, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589946881, 3, 10, '{"weight": 1, "public_key": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (5, 'a9769933d6fe5907b5b883df11c175e31a7c7c19d4024862b2c7c39845f62a2a', '62ae95288153ec34e794eb0a3ec2b9788d1e82a48ee0629f4139312a37b35924', 1, 1, '2019-06-03 16:37:02', '2019-06-03 16:37:02.133323', '2019-06-03 16:37:02.133323', 21474836480, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAAC2KulSiBU+w055TrCj7CuXiNHoKkjuBin0E5MSo3s1kk9buypkSeADep/pTWlpB9E6Equk5xmpuvFyFwqdZLY9sAAAAAXPVMrgAAAAAAAAAAuMBMcxg1gTklVN8u2mY/OPQmKCMsWP3OArGw6LUyTlnVUMwOzCdCvXQOjtmVErODAhZaxcHMQgjGtOMxUiQKTwAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, '62ae95288153ec34e794eb0a3ec2b9788d1e82a48ee0629f4139312a37b35924', '5d5396461879e749e998097d068ea7bf49c01084ab407bd1cd17290194de5c34', 1, 1, '2019-06-03 16:37:01', '2019-06-03 16:37:02.151435', '2019-06-03 16:37:02.151435', 17179869184, 16, 1000000000000000000, 600, 100, 100000000, 1000000, 11, 'AAAAC11TlkYYeedJ6ZgJfQaOp79JwBCEq0B70c0XKQGU3lw0jAOj6Tx085X3/Z6J7mYHycS8g7u514DI1J/3rp8DNHkAAAAAXPVMrQAAAAAAAAAAD7vJ2GXYn9oO/fo5QrmHKnTVIqBarv7BmCtsbOtbf6TvSoEGz/cDuPbG6DpA2Erew6Uy12w0+WezX6ONSRk4VAAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '5d5396461879e749e998097d068ea7bf49c01084ab407bd1cd17290194de5c34', 'f323001ebc2b87bd5e6d5f876dc04b4c14752d5739dd6db1b85b31cfb961718b', 2, 2, '2019-06-03 16:37:00', '2019-06-03 16:37:02.162998', '2019-06-03 16:37:02.162999', 12884901888, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAAC/MjAB68K4e9Xm1fh23AS0wUdS1XOd1tsbhbMc+5YXGLxuKqOY6UQEYjj1Z8YTay62+StbkZ1TpuQgaIZivyX44AAAAAXPVMrAAAAAAAAAAACZ7JC4EHnY0GXRNEwciolY7p1One+T5tlBKrlCdwa0Dy1843rdLzQ4b+Gus3XW/02UbPCX8yxuBmvd7pjsurIgAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, 'f323001ebc2b87bd5e6d5f876dc04b4c14752d5739dd6db1b85b31cfb961718b', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 3, 3, '2019-06-03 16:36:59', '2019-06-03 16:37:02.173609', '2019-06-03 16:37:02.173609', 8589934592, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Z9GwX6q8KzxXUDk3+fdZshszCWX2SbuAnJNMiSoulCykAAAAAXPVMqwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAACyk/eWGAYEOhla9SxZHjkxGIQ61pIijmPF9hVp1Qv5rtOXsmkRJcyXmle2ZKFjzhTk0u31dZoIkX51uoncfP4wAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 3, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:37:02.187642', '2019-06-03 16:37:02.187642', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (2, 21474840577, 2); -INSERT INTO history_operation_participants VALUES (3, 17179873281, 3); -INSERT INTO history_operation_participants VALUES (4, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (5, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (6, 12884910081, 1); -INSERT INTO history_operation_participants VALUES (7, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (8, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (9, 8589942785, 4); -INSERT INTO history_operation_participants VALUES (10, 8589942785, 1); -INSERT INTO history_operation_participants VALUES (11, 8589946881, 4); -INSERT INTO history_operation_participants VALUES (12, 8589946881, 2); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 12, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 1, '{"to": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "amount": "10.1230000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "101.2345000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (2, 21474840576, 2); -INSERT INTO history_transaction_participants VALUES (3, 17179873280, 3); -INSERT INTO history_transaction_participants VALUES (4, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (5, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (6, 12884910080, 1); -INSERT INTO history_transaction_participants VALUES (7, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (8, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (9, 8589942784, 4); -INSERT INTO history_transaction_participants VALUES (10, 8589942784, 1); -INSERT INTO history_transaction_participants VALUES (11, 8589946880, 4); -INSERT INTO history_transaction_participants VALUES (12, 8589946880, 2); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 12, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('d867852608d9aaf21e1f7bacb98e75fd5cb39be10d70c9cbcc80391d73728869', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:37:02.133553', '2019-06-03 16:37:02.133553', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAGCKWwAAAAAAAAAAGu5L5MAAAAQOduHh8u6n4aETFH/A6BiFlfEPqDszcZVcoCIRvAY33jJ+1aQxY8IyUQpF0oXbcKVegzVZNO81OUEN/9I5F/DgI=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAADAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAYIpbB//////////wAAAAEAAAAAAAAAAAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADZOgvh//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{524eHy7qfhoRMUf8DoGIWV8Q+oOzNxlVygIhG8BjfeMn7VpDFjwjJRCkXShdtwpV6DNVk07zU5QQ3/0jkX8OAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5243c6934f0fb5017758869aa3bff53ddc389cf81861cfae610cc225aae18ccc', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:37:02.15159', '2019-06-03 16:37:02.15159', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA8VyioAAAAAAAAAAH5kC3vAAAAQEceJbYupnWlUerU60gfpFg8Nk2a3A6QMSfVgQoNFZOLjN7zc4w7jBxwiFIUi6pyXJNNQpL2OQxTnV4gs9lDrgQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADxXKKh//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Rx4lti6mdaVR6tTrSB+kWDw2TZrcDpAxJ9WBCg0Vk4uM3vNzjDuMHHCIUhSLqnJck01CkvY5DFOdXiCz2UOuBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('00ab9cfce2b4c4141d8bb6768dd094bdbb1c7406710dbb3ba0ef98870f63a344', 3, 1, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 8589934593, 100, 1, '2019-06-03 16:37:02.163152', '2019-06-03 16:37:02.163152', 12884905984, 'AAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAEnciLVAAAAQLVbII+1LeizxgncDI46KHyBt05+H92n1+R328J9zNl2fgJW2nfn3FIoLVs2qV1+CUpr121a2B7AM6HKr4nBLAI=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{tVsgj7Ut6LPGCdwMjjoofIG3Tn4f3afX5Hfbwn3M2XZ+Albad+fcUigtWzapXX4JSmvXbVrYHsAzocqvicEsAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:37:02.163352', '2019-06-03 16:37:02.163352', 12884910080, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:37:02.173754', '2019-06-03 16:37:02.173754', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:37:02.173938', '2019-06-03 16:37:02.173938', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('725756b1fbdf83b08127f385efedf0909cc820b6cce71f1c0897d15427cb5add', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:37:02.174056', '2019-06-03 16:37:02.174057', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBj4gBQ/BAbgqf7qOotatgZUHjDlsOtDNdp7alZR5/Fk9fGj+lxEygAZWzY7/LY1Z3SF6c0qs172LhAkkvV8p0M', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDbUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtqyrQFLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Y+IAUPwQG4Kn+6jqLWrYGVB4w5bDrQzXae2pWUefxZPXxo/pcRMoAGVs2O/y2NWd0henNKrNe9i4QJJL1fKdDA==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7.rb b/services/horizon/internal/test/scenarios/asset_stat_trustlines_7.rb deleted file mode 100644 index cfba7e6a21..0000000000 --- a/services/horizon/internal/test/scenarios/asset_stat_trustlines_7.rb +++ /dev/null @@ -1,20 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott -create_account :bartek -close_ledger - -trust :scott, :usd_gateway, "USD" -trust :bartek, :usd_gateway, "USD" -close_ledger - -# issue asset to :scott -payment :usd_gateway, :scott, ["USD", :usd_gateway, "101.2345"] -close_ledger - -# :scott pays :bartek -payment :scott, :bartek, ["USD", :usd_gateway, "10.123"] -close_ledger diff --git a/services/horizon/internal/test/scenarios/bindata.go b/services/horizon/internal/test/scenarios/bindata.go index 9b5919dfb6..f56e041c07 100644 --- a/services/horizon/internal/test/scenarios/bindata.go +++ b/services/horizon/internal/test/scenarios/bindata.go @@ -2,42 +2,14 @@ // sources: // account_merge-core.sql (26.849kB) // account_merge-horizon.sql (36.385kB) -// allow_trust-core.sql (43.697kB) -// allow_trust-horizon.sql (57.667kB) -// asset_stat_account-core.sql (37.928kB) -// asset_stat_account-horizon.sql (50.23kB) -// asset_stat_operations-core.sql (32.058kB) -// asset_stat_operations-horizon.sql (44.04kB) -// asset_stat_trustlines_1-core.sql (27.224kB) -// asset_stat_trustlines_1-horizon.sql (36.508kB) -// asset_stat_trustlines_2-core.sql (29.742kB) -// asset_stat_trustlines_2-horizon.sql (39.687kB) -// asset_stat_trustlines_3-core.sql (29.243kB) -// asset_stat_trustlines_3-horizon.sql (39.187kB) -// asset_stat_trustlines_4-core.sql (29.24kB) -// asset_stat_trustlines_4-horizon.sql (39.18kB) -// asset_stat_trustlines_5-core.sql (29.926kB) -// asset_stat_trustlines_5-horizon.sql (39.887kB) -// asset_stat_trustlines_6-core.sql (29.846kB) -// asset_stat_trustlines_6-horizon.sql (40.082kB) -// asset_stat_trustlines_7-core.sql (35.896kB) -// asset_stat_trustlines_7-horizon.sql (48.894kB) // base-core.sql (29.682kB) // base-horizon.sql (52.175kB) -// change_trust-core.sql (33.073kB) -// change_trust-horizon.sql (43.637kB) -// core_database_schema_version_8-core.sql (8.369kB) -// core_database_schema_version_9-core.sql (8.029kB) // failed_transactions-core.sql (38.723kB) // failed_transactions-horizon.sql (54.67kB) // ingest_asset_stats-core.sql (61.38kB) // ingest_asset_stats-horizon.sql (87.473kB) -// kahuna-2-core.sql (29.749kB) -// kahuna-2-horizon.sql (37.751kB) // kahuna-core.sql (232.639kB) // kahuna-horizon.sql (301.496kB) -// non_native_payment-core.sql (35.893kB) -// non_native_payment-horizon.sql (48.887kB) // offer_ids-core.sql (61.677kB) // offer_ids-horizon.sql (85.572kB) // operation_fee_stats_1-core.sql (48.276kB) @@ -46,20 +18,10 @@ // operation_fee_stats_2-horizon.sql (32.011kB) // operation_fee_stats_3-core.sql (45.051kB) // operation_fee_stats_3-horizon.sql (58.503kB) -// order_books-core.sql (77.742kB) -// order_books-horizon.sql (99.263kB) -// order_books_310-core.sql (132.118kB) -// order_books_310-horizon.sql (155.941kB) // pathed_payment-core.sql (52.308kB) // pathed_payment-horizon.sql (76.08kB) // paths_strict_send-core.sql (70.821kB) // paths_strict_send-horizon.sql (92.703kB) -// self_send-core.sql (25.186kB) -// self_send-horizon.sql (33.348kB) -// send_to_issuer-core.sql (32.414kB) -// send_to_issuer-horizon.sql (43.662kB) -// set_options-core.sql (51.466kB) -// set_options-horizon.sql (63.246kB) // trades-core.sql (64.752kB) // trades-horizon.sql (85.918kB) @@ -170,406 +132,6 @@ func account_mergeHorizonSql() (*asset, error) { return a, nil } -var _allow_trustCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x67\x8f\xe3\x38\xd6\x36\xfc\x7d\x7e\x85\x31\x5f\x7a\x16\xee\x59\x8b\x0a\xa4\x34\xf3\xce\x0d\xc8\x39\xc8\x39\xfb\xc5\x83\x06\x49\x91\xb2\x6c\x25\x2b\x38\x3d\xb8\xff\xfb\x03\x87\x2a\x87\x72\x55\xb9\xaa\xdc\xbb\x03\xec\x0a\xe8\x6a\xdb\x3a\x3a\xe7\xf0\xe2\x75\x0e\x93\x28\xfd\xfe\xfb\x2f\xbf\xff\x9e\x6a\xf9\x51\x6c\x85\xac\xdb\x36\x52\x26\x8e\x31\xc1\x11\x4b\x99\x89\x1b\xfc\xf2\xfb\xef\xbf\xec\xce\xe7\x13\x37\x60\x66\x8a\x87\xbe\x7b\x12\x58\xb2\x30\xb2\x7d\x2f\xa5\xfd\x13\xfe\x13\x9c\x49\x91\x4d\x2a\xb0\x7e\xec\x2e\xbf\x12\xf9\xa5\x5b\xe8\xa5\xa2\x18\xc7\xcc\x65\x5e\xfc\x23\xb6\x5d\xe6\x27\x71\xea\xaf\x94\xf0\xe7\xfe\x94\xe3\xd3\xf9\xcb\x5f\x6d\xd3\x61\x3f\x6c\xef\x47\x1c\x62\x2f\xc2\x34\xb6\x7d\xef\x47\xc4\xa2\x9d\xde\x97\xc2\xd4\xb1\x77\xaa\x99\x47\x7d\xd3\xf6\xac\xd4\x5f\xa9\x6f\xfd\x5e\x51\xfd\xf6\xe7\x93\x6d\xcf\xc4\xa1\xf9\x83\xfa\x1e\xf7\x43\xd7\xf6\xac\x1f\x51\x1c\xda\x9e\x15\xa5\xfe\x4a\xf9\xde\x51\xc7\x94\xd1\xf9\x0f\x9e\x78\x07\x5b\xc4\x37\x6d\xb6\x3b\xcf\xb1\x13\xb1\x0b\x33\xae\xed\xfd\x70\x59\x14\x61\x6b\x2f\xb0\xc2\xa1\x67\x7b\xd6\x41\x24\xf4\x57\x3f\x22\x46\x93\xd0\x8e\x37\x3b\xe5\x9c\xff\x79\x04\x80\xe1\x90\x4e\x7f\x04\x38\x9e\xa6\xfe\x4a\x05\x09\x71\x6c\xfa\x7d\x87\x18\xc5\x31\x76\x7c\xeb\xcf\x5f\x7e\xc9\x77\x9a\xad\x54\xa5\x91\x2f\x8c\x52\x95\x62\xaa\x30\xaa\x74\x7b\xdd\xa3\xe4\x3f\x93\xc0\x0a\xb1\xc9\xa6\x76\x14\x93\x4d\xc4\x16\x7f\xbe\x29\x1d\xd1\x60\x91\xf8\x61\xe2\x46\xf7\x09\x33\x6f\x79\x8f\xa4\xc3\x4c\x8b\x85\xf7\x48\xee\xfc\xe4\x8c\xdd\x29\x79\x87\x18\x61\x51\xec\x73\xce\x42\xdb\x33\xd9\xfa\x6d\x59\x4c\xa9\x9f\x78\x31\xc1\x0e\xf6\x28\x8b\xfe\xfc\x45\x37\x7a\x85\x4e\xaa\xa7\x67\x8d\xc2\x99\x74\xb3\x61\x8c\x6f\xc0\xeb\x87\x9b\xd4\x5e\x7b\xae\xd9\xe8\xf6\x3a\x7a\xa5\xd1\x3b\xbb\xe8\x52\xf0\x47\x30\x67\x9b\x7b\xf4\xc7\xeb\xf7\x55\x3f\xcb\x7c\x40\x2b\x67\x77\xf8\x7c\x2e\x76\xbf\xee\x30\x89\x62\xc7\xf6\x58\xf4\x96\xe6\x67\xa1\xbb\xf5\xee\xbc\x60\xfb\x6c\xf0\x86\xde\x93\xd0\xfd\x7a\x9f\x29\xff\x96\xde\x67\xa1\xbb\xf5\x1e\xe4\x6d\x8f\xfb\x6f\xe8\x3d\x09\xdd\xad\x37\x48\x48\x94\x90\x37\x74\x1e\x04\x3e\xa2\xcf\xb1\xa3\xe9\x22\x61\xc9\x5b\xc8\x9e\x8b\xdd\xaf\x9b\xb1\xf0\x2d\x58\xf7\xe7\xef\xd6\xb6\x0f\xe3\xb7\xd4\x1d\x04\xee\xd6\x77\xc8\x4a\x53\x86\xcd\xb7\xd5\x5e\xc8\xfd\x64\xed\xc7\x4c\xc9\x16\x3f\xee\x34\x43\xb0\xf7\x86\x72\x82\xbd\xbb\x1d\x3e\x66\xbf\xb7\x7c\x7d\x12\xf9\xa8\xce\x5d\x1f\xe0\x7d\xb5\x3b\xa9\xa3\xe6\xbd\xec\xb5\xe2\x9b\x29\xf7\x6d\xd9\xe7\xd4\xf8\x9e\xd8\x29\xd1\xbd\x23\xf9\x9c\xb8\xde\x96\x3b\x25\xa2\x77\xe4\x9e\x13\xcb\xbb\x72\x77\xf9\x77\x4a\x28\x6f\xcb\x1d\x92\xc4\xbb\x32\xcf\x21\xff\x8e\xe4\x2e\x8e\xdf\x16\x39\xc4\xe6\xdb\x32\x17\xa1\xf0\xb6\x28\xc1\xde\xdb\x02\x4f\x54\xbd\x4b\x6a\xc7\xbc\xa3\x60\x61\xd4\x2b\x34\xba\x95\x66\xe3\x5c\xd8\x09\xac\x68\xe1\x1c\x25\xba\xb9\x72\xa1\xae\xbf\xd0\xf5\xe7\x2f\x87\xbe\x71\x03\xbb\xec\x8f\xa7\xdf\x52\xbd\x4d\xc0\xfe\x38\x5e\xf2\x67\xaa\x4b\xa7\xcc\xc5\x7f\xa4\x7e\xff\x33\xd5\x5c\x79\x2c\xfc\x23\xf5\xfb\xbe\xcb\x9c\xeb\x14\xf4\x5e\xe1\x49\xf3\x93\xbe\x5f\x2e\x34\x5e\x9e\x3c\x2a\xce\x35\xeb\xf5\x42\xa3\xf7\x86\xe6\x83\x40\xaa\xd9\xb8\x54\x90\xaa\x74\x53\xdf\x9e\xfa\xb7\x4f\xbf\x45\x7b\x25\xdf\xae\x2d\x3f\x15\xff\x68\xf3\x19\xa1\x77\xcb\x73\x81\x65\xa3\xd9\xbb\xc2\x33\x35\xac\xf4\xca\xcf\x6e\x9d\x77\x68\x2f\xcc\x9f\xb4\x5c\x39\xf2\x91\xc2\xbf\x50\xb2\x07\xa0\x65\x64\x02\x6b\x37\x8a\x09\x42\x9f\x32\x33\x09\xb1\x93\x72\xb0\x67\x25\xd8\x62\x7b\x18\xee\xec\x80\xef\xc4\x4c\xc6\x71\xe2\xc4\x3f\x62\x4c\x1c\x16\x05\x98\xb2\xdd\x68\xe2\xdb\xd5\xd9\x95\x1d\x4f\x7f\xf8\xb6\x79\x36\x40\xb8\x28\xec\x39\x21\x8f\xc5\xdc\x53\xf7\x54\xc8\x27\x02\xdc\x02\xfc\xc0\xf2\xf3\xa4\xfb\xdb\x2f\xa9\x54\xea\xe9\x17\xdb\x4c\xd1\x29\x0e\x31\x8d\x59\x98\x5a\xe2\x70\x63\x7b\xd6\x6f\x0a\xfc\xc7\xbe\x6e\x1a\x7d\xc3\xf8\xbe\x97\xde\x5d\xe8\x61\x97\xdd\x10\x56\xd5\x5b\xc2\x4b\xec\x24\xb7\xa4\x01\x10\xaf\xc5\x1d\x1c\xc5\xae\x6f\xda\xdc\x66\x66\xca\xf6\x62\x66\xb1\xf0\x59\xe4\x97\x7f\x5c\xd7\xfd\x73\x14\x7f\x11\x8b\xe8\x53\x40\x1c\x07\x02\x29\x62\x5b\xb6\x17\x5f\x9d\x8c\xd8\xc2\x4b\xdc\xdb\xe7\xbc\xc4\x8d\x12\xc2\xbc\x38\xdc\x0d\x05\xaf\x8b\x79\x90\xb1\x3d\xee\xe0\xdd\x88\xd1\x64\x51\x7c\xdb\x9d\x83\xe0\xd4\x77\x99\xe9\xbb\xd8\xf6\x6e\x48\xc9\xf2\xb5\xd3\xf1\x34\x64\xd1\xd4\x77\xcc\x28\x15\xb3\xf5\xb5\x67\xdc\xc1\xd6\x6b\x1e\xbd\x59\x37\x47\x44\x92\x9d\x55\xc7\xc6\xc4\x76\xec\x78\x57\xb8\x43\xf9\x9f\x20\x71\x9c\xb7\x4e\xdb\x96\xb7\xeb\x0b\xed\xdc\x3a\xfc\x72\xd6\x1b\x78\xee\x5a\x1c\x41\xff\xb1\x1f\x56\xa7\x72\xe5\x42\xae\x96\xfa\xed\xb7\xa7\xaa\xf8\x9f\xbf\x52\xc2\x3f\xfe\xf1\xc6\xd5\xd7\x0e\x5e\xeb\x79\x51\x80\xf7\x34\x5e\xd4\xe5\x95\xb6\xcb\x7a\x7e\x4f\xd3\x4b\x78\xae\xd4\xdd\xc0\xef\xa0\xf3\x65\x60\xec\xda\xbf\xcf\xc6\xc4\xae\xcb\x78\x08\x07\xcf\x37\xd9\x79\x2c\x5c\xc4\xc0\x4b\xa3\x97\xed\xf3\x67\xcd\x5f\x76\x8c\x0f\x8e\x1c\x7f\xc3\xd1\xf4\xcc\x19\xf8\x82\xdb\x41\xc8\x96\xef\x0a\x91\x84\xce\x59\xec\xd8\x51\xfc\xae\xe8\x73\x6f\xfb\x89\xee\x87\x9f\xa9\xe3\x47\x2c\xb6\xdd\x57\x22\x7f\x9f\x58\x6f\xc4\xd6\x59\x9d\x5f\x76\xea\x9f\xf5\x5d\xd5\xf7\xc9\xce\x2b\xd4\x79\x6d\x6c\x70\xa9\xe6\x54\x8a\xd7\xd8\x72\xec\x7c\x7d\xb6\xc6\x8e\x03\xaf\xdf\x9e\x83\x9c\x85\x77\x66\xd0\xc3\xcc\x8b\xf9\x5a\x06\xdd\xd3\x1d\x47\x11\x8b\x6f\xe1\x79\x88\xd5\x57\x4f\x63\x77\x17\x56\xb7\x55\x07\xa1\x4d\x99\xf7\x4a\x12\xdb\x9f\x7c\x2d\xc3\xed\x4f\xa6\x4c\x3f\x21\x0e\xdb\xf1\x8d\xda\xfb\x19\xc9\x87\x66\xd1\xb3\x1a\x3e\x0e\x59\x0f\x65\xb9\xaa\xd7\x63\x01\x5f\xe1\xc6\xf1\xca\x23\xc2\x57\x97\x3e\xe1\xfe\x1a\x21\x0e\x1d\xf6\xcf\xf2\xe1\x30\xac\x3f\xd0\xc1\x0e\x6e\x35\xfc\xca\x8b\xc8\xf5\xc3\xf8\x19\x8d\x7c\xa1\xa8\xf7\x8d\x5e\x4a\xb8\x6e\x36\xd9\x3a\xc6\x71\xcc\xdc\x20\x4e\xed\xc2\x22\x8a\xb1\x1b\xa4\x76\x5d\x26\x3f\x39\xfc\x92\xda\xfa\x1e\x7b\xd9\xd8\x72\x6c\x3b\x49\x78\xd6\xd4\xbe\x66\x21\xde\x04\xec\xfd\x4a\x39\x4c\x4b\x9c\xe9\x7d\x99\xf6\x9f\x2d\xbe\x52\x3b\xc7\x99\x0d\x3f\xbc\xae\xd4\xdf\xf6\x48\xfc\x4f\x4a\xf8\x47\x4a\x6f\xe4\x53\x87\xaf\xff\xdf\x5f\x29\xa8\x28\x92\xf2\x8f\x9b\x75\x75\x3e\x0c\xfb\x74\x95\x9d\xcf\xf2\x9c\xe7\xdc\x57\xd0\x38\x4c\xb4\xed\xa2\xee\xa6\x43\xbb\xb1\xe3\x17\x5c\x89\x12\x72\x74\x22\x64\xd1\x45\x03\x24\xdd\xec\x31\x86\x0c\x3f\xc7\xd2\x4b\x7f\xce\xc6\xbc\x9f\xf5\xe9\x6c\xb2\xee\x8e\x96\xf1\xe0\xd8\x22\x62\x6f\xb5\x30\x2f\xfd\x3c\x1b\xc3\x7f\xd6\xcf\x93\x8a\xfb\xfd\x7c\xd1\xc8\x5d\x9d\x67\xde\x92\x39\x7e\xc0\xde\x69\xd2\x4e\xa6\xbf\xd0\x10\x9d\x4d\x77\x7c\x01\x82\xa7\xf9\xda\xdf\xee\xa9\x87\x13\x8b\xde\x03\x62\xf1\x4a\x43\x73\x09\xc2\xd3\x3c\xf0\x85\xc6\x6b\x20\x2e\xac\xbd\x0a\xc6\x69\x8e\xe8\xd3\x60\x9c\x26\xc5\x7f\x3b\xc5\xed\xe5\xe0\xed\x46\x4c\xbd\x15\xdd\x67\x33\x5c\x9f\xf5\xea\x6c\x09\xe0\x33\xc3\xae\x7d\x8b\xff\x46\xa6\xb6\xa3\x28\x61\xe1\xfd\xaa\xa8\x6f\xde\x1c\x9d\xbe\x80\x25\x76\x6c\xd7\x7e\xa5\x47\xf1\xe6\x58\xf0\xdf\x39\xaa\x3a\x63\xe7\xd9\xaa\xca\xa7\x46\x51\xe7\xd7\x3f\x6a\x1c\x75\xa6\xf3\xf3\xe3\x9f\xb7\xb4\x1e\x2a\xed\x4a\xd3\xb1\x26\xff\xe7\x76\xe0\x5d\x4c\xf7\x7e\x9a\xe4\xe7\x6b\x68\x07\x9a\xc7\xeb\x8b\x54\x7c\xc7\x78\xe3\x9a\x80\xeb\xfd\x2a\xe5\xab\x67\xe9\x14\x7b\x16\xbb\x39\xb0\x3f\x07\xe7\x7c\xd9\xee\xf3\xb9\xfa\x34\x77\xfe\x79\x88\xfe\xc5\xf8\x10\xdf\xdc\xdc\x02\x27\x5e\x87\x2c\x4a\x9c\x9b\xd9\x3d\x5e\xbb\xec\xdd\xf1\xdc\x69\x89\xf5\xf3\x78\x5e\xad\x5b\x7c\x16\xd4\xab\x15\xe7\xdf\xee\x02\xee\x78\xd1\x5b\xe8\x1d\x45\x6e\x01\x71\x1f\xed\xae\x56\xb8\x3f\x03\x54\x7e\x37\xb2\xe6\x7e\xf8\xce\x64\x68\x2a\xaf\xf7\xf4\x77\x30\x7b\x5b\x65\xf4\x61\x7d\x95\x46\xb7\xd0\xe9\xa5\x2a\x8d\x5e\xf3\x34\xa9\x38\xd0\x8d\x7e\xa1\x9b\xfa\xed\x5b\x29\xdb\x69\x8d\xcb\x15\x43\xcc\x55\xa4\x62\xa3\x2d\x67\x47\x46\xb1\xde\xc8\x1b\xc5\x6a\xbf\xd1\xea\x8b\xe5\xb1\x34\xa9\x17\xbb\xe5\x66\xa3\x9f\x2b\x34\xf5\xee\x10\xb5\x73\xa8\x39\x12\xcb\xdf\xbe\xa7\xb4\xc3\x01\x8f\xff\x23\x41\xf8\x9e\x92\xbe\xa7\x84\xef\x07\x94\x53\xdf\xbe\x7d\x4f\x7d\xd3\xdb\xba\xae\xeb\x7f\xfd\xf5\x6d\x7f\x42\x7c\x3a\x77\xfa\xfb\x8f\x3f\xdf\xf3\x30\x37\xaa\x95\x60\xa7\x21\x37\x1b\x95\x42\x2b\x57\x6f\x14\xb3\x48\x12\x75\x59\x82\x13\xa5\xd5\xc8\x77\x3b\x46\x69\x58\x43\xa5\xac\x91\xab\xb7\x8d\x4a\xb1\x29\x77\x51\x61\x3c\x1c\xf4\x4f\x1e\x6a\x3b\xcf\x54\x45\xd5\x34\x49\x56\x34\xe9\x7b\x0a\xbc\xe1\xa2\xfc\x19\x17\xb3\xa3\x52\xbb\x3a\x1c\x18\xc3\xe6\xb8\x5c\x34\x06\xbd\xda\x70\xa0\x14\x4b\x65\x5d\x32\x1a\xe3\xb1\x58\x6d\xd7\xea\xa8\xa9\x57\xf5\x7e\xa1\x5d\xec\x43\xa3\x95\xeb\x16\x8a\x83\x51\xb3\xf1\x49\x17\x95\x4f\xa1\x28\x4a\xed\xa2\x58\xee\x17\x14\x51\xaf\x8f\xfa\xc5\x7e\x59\xd2\xc7\x55\x7d\x34\x2a\x8d\x46\x03\x71\x50\x1e\x8d\xc7\x1d\x58\x18\x8f\x0a\xbd\x56\x2d\x3f\x9a\x74\xf5\x21\x44\xa3\xa6\x7c\x72\x51\xb9\x70\x11\xbd\x51\xd1\xd2\xf7\x94\x7a\xd3\xc5\x57\xa8\x7d\x3d\x25\xf8\x85\x28\x79\x7d\xa2\xef\xa3\xa1\x72\x39\xd9\xf7\x8c\x23\x94\x4c\x4d\xe5\x8a\x04\x19\x83\xaa\x09\x88\x88\x88\x42\x54\x8d\x8b\x12\xe6\x8a\x04\x00\x41\x0a\xd4\xb0\x28\x73\xcc\x81\x2c\x48\xd8\x14\x88\x22\x12\x28\x49\x44\x40\x84\x69\xda\x0e\x2a\xe1\x8b\xc7\x4e\x87\x82\x44\x2c\x32\x49\xe4\x5c\x94\x55\x2c\x20\x22\x30\x24\x70\x13\x70\x68\x4a\x40\xa5\x80\x63\x6a\x8a\x02\x81\x94\x0a\x2a\x95\x24\x53\x41\x48\x11\x15\x4d\x85\x2a\x10\x15\x0c\xe0\xb7\x3d\xc5\x84\x5d\xc5\xfd\x6d\x8f\xec\xa8\x66\xcb\x9b\xcc\xa6\x5b\xcb\xa2\xbc\x97\xd7\xca\xa2\xb0\x9e\x65\xd3\x91\x60\xc5\xd1\xaa\xb2\xda\x82\x91\xd9\x1d\x8e\x71\xb6\x8a\x8b\xd6\x4e\xbe\xd0\x90\x0d\xbc\x0d\xc4\xf6\xbb\x9a\x27\xfa\x08\xc8\x7b\xb1\xec\xfc\x5f\x50\x90\x87\x1e\xdf\xae\x62\xfd\x35\xa2\x12\xcc\xa8\x6a\x8a\x88\x20\x6a\x42\x6e\x2a\x80\x2b\xa2\x29\x6a\x00\x21\x4c\x90\xa0\x01\x6c\x9a\x22\x94\x38\x96\x65\x13\x42\x11\x42\xce\x89\xa6\xc8\x4c\x60\x84\x03\xc4\xf6\x44\x7d\x04\xd9\x45\x89\x43\xae\x88\xb2\x84\x65\xa6\x98\x44\xe1\x14\x22\xa0\x41\x6e\x12\x24\x00\xa6\x52\x40\x45\x22\x4b\x12\x17\x39\x33\x15\x55\x14\x65\x41\x15\x44\x55\x46\xa2\xa9\xc9\x50\x36\x95\x6f\xfb\x56\x03\x28\x8a\xa6\x20\x0d\xc9\xda\x91\xb1\x39\xb1\x35\x99\x81\x46\xa2\xf8\x02\xa9\xa2\xa1\xec\x6d\x9a\xcb\xfe\xba\x24\x0d\x02\x7f\x9e\x5e\x16\xf5\x66\x9c\x03\x35\xb1\x8e\xb2\x08\x4e\xfa\xc8\x6b\x35\xfd\x0a\xea\xda\x61\xb9\xd0\x04\x5d\x0c\xd1\x30\x71\x57\xb5\x36\x14\x5b\x41\xbb\xe4\x2c\xab\xcb\xcd\xa6\xad\xb6\x4b\x85\xf1\x1e\xe1\x51\x6b\x50\x9f\xec\xd9\x51\x79\xfe\x73\x48\x6f\xd1\xe9\xfb\x4a\x6f\xb5\x8f\xdc\x99\xc1\x74\x90\xc6\x15\x54\x5d\x92\x2e\x2f\xdb\x11\xee\xf7\xf5\xd1\x74\x4b\x4b\xe9\x8c\x38\x1e\x56\x0b\x22\xf1\xb8\xbc\x4d\x06\xaa\x2d\xcf\xb4\x65\x7f\xde\x9c\x2b\x66\xcc\xd7\x5e\x69\x98\x21\x34\x0b\xeb\xe5\x5c\x9c\x6f\x6d\x32\xf1\x30\x57\xd5\xad\xdc\xb4\x6c\x4c\x3a\x73\x70\xb0\x7f\x83\xd1\x85\xe8\x16\x2b\x9e\x18\x9d\x17\xaa\x3f\x91\x7b\x3f\xe7\xb8\x93\xd1\x8a\x8c\x54\x46\x45\x59\x45\x5c\xe0\x40\x54\x55\x62\x0a\x50\x55\x15\x01\x29\x40\x45\x00\xaa\x26\x53\x29\xc3\x58\x24\x5c\xd6\x08\x04\x5c\x21\x82\x69\x02\xc8\x4d\xa0\x50\xd5\x94\xf6\x8c\x7e\x40\x54\x20\x2e\x20\x45\x04\xa2\x29\x61\x81\x33\x13\x50\x15\x98\x12\x53\x45\x09\x71\x45\x24\xa2\x8a\x45\x55\x01\x90\x31\x95\x60\xa6\x72\x99\x31\xaa\x29\x54\xe4\x9c\x0a\x2a\x50\x90\xc8\x0f\x2d\xe4\x13\xa3\x15\xe1\x99\xd1\x49\xb2\x69\x54\x11\x6f\x10\xad\xcf\xfb\x71\xad\x63\xc2\x78\x35\xc7\x52\x77\x9c\x09\x0a\xc0\xad\xba\x19\xe4\xf4\xe5\xe6\x72\xcd\x83\xe9\x30\xaf\x09\x46\xa3\x36\x28\x88\x68\x55\xf2\x46\x96\xe7\xaa\x4e\x7d\xd9\x2c\xf3\xbc\xc1\xb6\x69\x23\x0f\x1d\x36\x8f\xa6\x1d\x5c\x3f\x20\xbc\x67\xb4\x75\x42\xbc\xe7\x2c\x67\xd9\x21\x43\x75\xdb\xeb\x68\x1e\xea\xfb\x11\x9e\xe5\x6a\xeb\x7e\x60\xb5\xeb\xd9\x2c\x99\xba\x45\x48\xca\xfa\xb2\x55\x2e\x0d\x32\x59\x50\xe9\x0a\x30\x9f\x16\xa8\x65\xb6\xfc\x8a\xa4\x75\x23\xdf\xf7\xfb\x43\xe4\x27\xc9\x4c\x40\x91\x43\x8d\xcc\xaa\x52\x1c\x19\xab\x9d\xe6\xfa\x0d\xc6\x96\x85\x5b\xb5\xfe\x1f\xc0\x58\x81\x70\x09\x8b\x82\xc0\x24\x0a\x91\x2a\x98\x14\x6a\x8a\x86\x35\xa8\x42\x28\x71\xa0\x12\x41\x54\x29\xc1\x18\x52\x8d\x48\x26\x45\x0a\xa6\x26\x45\x2a\xc4\x26\x94\x34\x49\x41\xea\xbe\xa1\x7f\x00\xeb\x4d\xa4\x21\x88\x14\x4d\xa2\x5c\x55\x19\x84\x1c\x69\x02\x92\x81\x2c\x4b\x18\xaa\x84\x20\xa0\x0a\x92\x28\x31\x95\x08\x04\x6b\x90\xca\xc8\xa4\x12\x27\x40\x30\x45\x20\x03\x0a\xf0\xb7\x7d\xb7\xf8\x99\xb1\xe0\x89\xb1\xa0\x23\xa3\x5c\xb7\xac\xb6\x0a\xbe\xad\x65\xfd\x69\xdb\xec\x4c\xd7\xb8\x01\xeb\x70\x51\xcb\x74\xc9\x98\x0f\x57\x52\x87\x68\x45\x3a\xeb\xc9\xe2\x7a\xd3\x1d\x6d\x0b\xa3\xdc\xba\x91\x56\x57\x45\x61\x30\x10\xcc\xd9\xbc\x16\x68\xdb\x4c\x03\x76\xb6\x6c\xaa\x8e\xa5\xf5\x58\x8c\xda\x07\x9a\xee\x19\xbb\x3a\x21\x6e\x18\xb5\x16\xa9\xfb\xb3\x72\xba\xd3\x49\xf7\xba\xd9\x7c\xad\x94\xcd\xc4\x09\x2f\x8b\xae\x01\x44\x4a\x73\xe5\x10\x54\x3d\x11\x6d\x5a\xf9\x91\x23\x9a\x93\x56\xcb\x6e\x4e\x96\xac\x6d\x66\x3b\xf9\xc0\x4f\xa4\x92\x5e\x9f\x41\x23\x07\x9d\xa8\xa3\xad\x32\x51\x5b\x98\xb6\x69\x69\x6f\xaa\x7d\x83\xb1\xd5\xf1\xad\x5a\xff\x0f\x60\x2c\x50\xb1\x2c\x30\x45\xe1\x8a\x00\x04\xd1\x94\x4d\xc6\x14\x22\x68\x58\x14\xb9\xa2\xc8\x2a\x83\x8a\xa4\x88\x14\x31\x84\x25\x99\xaa\x9c\x41\x2e\xed\x08\xc1\x54\x0e\x64\x44\x21\xdc\x77\x6f\x1f\xc1\x7a\x41\x26\x26\x94\x10\x55\x76\x3e\x50\x4e\x89\xc9\x01\xc7\x40\x54\x31\x52\x98\x0c\x01\xa4\x98\x50\x2c\x29\x22\x91\x38\x53\x31\xd5\x34\x80\x21\x95\xb0\xc6\x91\x66\x52\xf0\x6d\x3f\x4a\x7a\x66\xac\xf8\xc4\xd8\xd5\x72\xeb\x5b\xf9\xd9\xda\xb3\x1a\xeb\x60\x88\x1d\x7f\x32\x53\xc7\x51\x6e\x66\x2c\xdc\x0d\x69\x51\x13\x6f\x29\x2b\x85\xc3\x66\x6f\x20\xf3\x9e\x3f\xf7\xeb\x5e\xd9\x14\x5d\xd2\x9b\x79\xe9\x42\x30\xab\x81\x02\x68\x4c\x37\x1a\xec\x65\xb5\x5e\x98\x08\x81\x26\xf6\xda\x52\xfe\xd0\x21\xd8\x31\x16\x9f\x21\xbe\x76\xaa\xc9\x66\x68\x33\xc1\x04\xc6\xb6\x9f\xeb\x80\x9a\x6c\xe4\x45\x2b\x2d\xd4\x12\xbd\xbc\x24\xd5\x74\xd7\x72\x4b\xe5\x8d\x95\x18\x83\x76\x57\x1b\x4b\x6b\xb3\xc7\xb6\xea\x92\x97\x61\xc1\x0f\x80\x52\x2a\x46\x0b\xd5\x07\xb5\x6d\xc6\x0f\xab\x73\x4c\xf2\x0b\xce\xcc\xd5\x9e\xa4\xfd\x1b\x8c\xad\xa9\xb7\x6a\xfd\x3f\x80\xb1\x0a\x97\x64\xc0\x4c\x93\x13\x81\x8b\x58\x86\x12\x40\x58\xd2\x34\x82\x09\x84\x44\x90\x18\x65\x48\x15\x54\x51\xd5\x00\x02\x90\x69\xe6\x8e\xdd\x92\x88\x81\x28\xc9\x94\x08\x02\xdd\xb1\xed\x11\xac\x47\x5c\x05\xb2\x44\x04\x51\x64\xaa\x22\x28\x22\x54\x44\x82\x55\x2c\x9b\x04\x00\x45\x55\x21\xc3\x1a\x07\x84\x43\x19\x52\x20\x48\x84\x9a\x10\x50\x59\x13\x90\x04\xb9\xc0\x64\xb0\xf3\x03\x9e\x31\x56\x7a\x62\xec\xda\x9e\xe7\x9d\x11\xd0\xdb\x46\x5f\x4a\x86\x2b\xd7\x36\xc0\xa0\xa2\x38\x8d\xee\x3a\xcd\x66\xbd\x4a\xc6\x55\x15\xb3\x03\x5b\xc5\xf2\xda\x4d\x46\xdb\xc6\x66\x5b\x56\xd9\x34\xe8\x8b\xeb\x6e\xa3\x97\x5e\x0c\xd3\xdb\xec\xb4\x03\x97\xcd\x1c\x9a\x2f\xac\xc0\x72\x17\xa3\x50\x10\xa5\x43\x62\xdd\x33\xf6\x8c\x44\xc5\x40\xe4\xcb\x79\xbd\x89\x9a\xc3\x74\x75\x01\xb6\xc5\xf1\x72\x53\x09\x84\xa0\x01\x6b\x75\x98\x67\x71\xdd\x5d\x37\x67\x93\x41\x33\x57\x33\x33\x56\xbf\xb9\xaa\x24\xd3\x76\xdf\xed\x87\x8b\x5a\x8f\x14\x06\x76\x09\x06\x2a\xd1\xe6\x24\xab\xa3\xed\xb0\x5c\x98\x97\x1b\xcb\xfc\xbc\xbc\xd7\x3c\xbe\xc1\xd8\xba\x75\xab\xd6\xff\x03\x18\x0b\x05\xcd\xd4\x4c\x0d\x11\x80\x77\xc9\xd0\x64\x44\x35\x15\xc6\x14\x55\x02\xa6\x46\x55\x2a\xc8\x58\x10\x54\x0d\x03\x6e\x4a\x32\xe3\x0a\xe5\x26\xd3\x28\x14\x64\x53\xe3\x0c\x01\x65\x9f\x1f\x1f\xc0\x7a\x51\x95\x77\x1d\x0b\xa4\x68\x1a\xa1\x94\x62\x86\xb1\xc0\x64\x41\x93\x4c\x59\x14\x15\xa4\x48\x5c\x51\x30\x93\x15\x82\xa1\x26\x22\x95\x03\x0a\x65\x28\x69\x9a\xc0\x35\x99\x43\xb6\x63\x3d\x3a\x63\xac\xfc\xdc\x2b\x50\x85\x72\x2c\xa1\xfc\x26\x28\xd5\x47\xbe\xe2\xc2\xd8\x8d\xf2\xa8\xc9\x74\xcb\x9f\x8f\x8a\x89\xd7\x56\x06\xf5\x45\x61\xd6\x33\xf4\x7a\x26\x1b\x0f\x89\xaa\x2b\xeb\x99\xd0\x93\xd9\x36\xc7\xfd\xf5\x12\xb6\x0b\xf6\x44\x2e\x78\xeb\x72\x6b\x63\xf7\x5b\xcb\x60\x91\x94\x3c\xe3\x30\xd4\xda\x33\xf6\x8c\x37\x62\x51\x58\x0f\x51\x0d\x3a\x8d\x71\x38\xea\x6c\x13\x64\x2a\xe5\x4d\xb6\xef\xb5\x9c\xc4\x6d\x14\xdb\x76\xd0\xc8\xae\xba\xed\x86\xbe\x06\x15\xbf\x17\x55\xcb\xc3\xc9\xb2\xbe\x49\x16\x96\xa2\xcf\xb5\xb6\x3d\x00\x2d\x30\x4c\x3a\x24\x08\xaa\xb2\x4a\x27\xa5\xe6\x24\xaf\xf4\x44\x65\xaf\x9f\xde\x60\x6c\xb3\x70\xab\xd6\xff\x03\x18\x2b\x72\x51\x51\xb8\x20\x2b\x0a\xe0\x10\x73\xc6\xb0\x08\xb0\xa0\x21\x59\x02\x92\x24\x48\x1c\x42\x28\x13\xc1\x94\x11\x06\x40\x52\x4c\x45\x62\x94\x52\x88\x81\x42\x14\x41\x92\xf8\x61\xe4\xf5\x00\xd6\x13\x53\x04\x84\x10\xa4\x32\x41\x61\x9c\x60\x51\x36\x05\x80\xc0\xee\x0b\x22\x9a\x4c\x55\x51\x94\x4d\x22\x29\x0a\xc7\x44\x02\x08\x51\x19\x10\x46\x64\x41\x81\x32\x10\x44\x75\xd7\x2b\x50\xcf\x18\xab\x3c\x8f\xbc\x72\xa6\x37\x61\xeb\x85\xa1\xc7\x50\x06\x4c\x19\xd7\x4d\xaf\xb2\x2a\xf8\xba\x8d\xcb\x5a\xa3\xa9\xd1\x0c\xf3\x4a\xd9\x86\x97\xa6\x83\x66\xa0\x96\xe7\x85\x65\x3d\x3d\x4f\xa7\x5d\x3c\xce\x8b\xdd\xb2\xdb\x5c\x4c\xd3\x53\x84\xc6\x9b\x16\x9a\x9a\x4a\x40\x15\x62\xe6\x93\xf5\xa9\x1f\x8b\xcf\xfa\xb1\x00\xc5\x9b\xb8\x59\xcb\xae\xad\x44\xdd\x30\x5f\x19\x65\xf0\x7c\x33\xf6\x36\x63\x67\x13\xf6\x09\xb2\xaa\xc3\x42\x7a\xcb\x73\x56\x4e\xcc\x69\x15\x92\x48\x33\x6b\xb4\x4c\xec\x5e\xbb\xb8\xce\x32\x0d\x39\x75\xcb\xee\x91\xc6\x20\x1d\xd6\x47\xbc\x50\x4a\xc7\xfa\x60\x5e\xc8\x59\x7b\x92\x5a\x37\x18\xdb\xf2\x6f\xd5\xfa\x7f\x00\x63\x99\xa8\x42\x49\x13\x25\x81\x28\xb2\xca\x35\x13\x43\x04\x05\x09\xab\x1a\x84\xca\x6e\x90\x44\x44\x89\x2b\x92\x00\x34\x24\x63\x45\x25\x54\x11\x38\xa6\xc8\xc4\x18\x4b\x88\x60\x49\xdc\xe7\xc7\x07\xb0\xfe\x01\x8c\xd5\xce\x18\x0b\x9f\x18\xbb\x51\x9d\xd1\xaa\x33\x28\x8b\x61\x1a\xda\x25\xcb\x11\xea\xbd\x7a\x5e\x73\x27\x46\xbe\xcf\xa6\x05\x00\x7a\xa8\xbe\x5e\x14\x49\x3f\xdf\xda\xea\xae\x67\x6e\xf3\xb8\xb6\x69\x26\x41\xbb\x87\xa0\x54\x02\xbd\x5e\x17\x48\xc0\x8c\x57\x8d\xc4\x2e\x74\xbb\xc3\x02\x46\xd9\x42\x63\x48\xf7\x08\xef\x18\x4b\xce\x10\x97\xb6\xda\xd4\xd5\xbb\x81\xa1\xc5\xfa\x60\x3d\x8f\xd7\x79\x69\xd4\x6d\x06\x92\x1d\xaf\xbb\xcb\x82\x5b\x87\x7a\x7f\xbe\xca\x76\xe5\x42\xc7\xfd\x20\x63\xe7\xff\x31\x8c\x7d\x65\xb5\xe2\xc6\xdd\xad\x5f\x58\xfb\x78\x79\x6b\xe4\x57\x94\xbd\x76\xef\xde\xd7\x74\x5e\xdf\x7e\xf7\x05\x6d\xaf\xdc\x3c\xf7\x05\x8d\xaf\xdc\xe6\xf6\xd1\x95\xa3\xb3\x5b\xdd\xce\x96\xdf\x26\x62\xa1\xd3\x98\xd4\x4b\xb5\x4e\xb7\x37\xae\xf4\xc7\xba\x2e\x4d\x46\xdd\x6e\x39\xdb\x46\xf5\xb2\x51\x2e\x56\xb3\xd9\x76\xa5\x5c\x86\xdd\xc1\x38\x5b\x1c\x35\x6b\x43\xd4\x29\x67\xd1\x61\xf6\xfb\xb0\x46\x63\x34\xed\x0e\x71\xa6\x4e\xc7\x69\xe5\x6a\x63\x3d\xcf\xc8\x66\x4e\xeb\xad\xa8\x19\x29\xfd\x69\x3e\x9b\xdd\xa6\x9d\x91\xde\x95\xe8\x42\x92\x4f\xec\xdb\x8f\x4d\x73\xfb\x8f\xbb\x30\x2b\x4c\x7b\x09\x55\xa1\x35\x8b\x6b\xb5\x88\xb6\xd1\xa0\x1a\x86\x31\x86\x44\x0f\xf2\xe1\x38\xed\xe8\x78\xa8\xba\x19\xa3\x9a\x5f\xeb\xe3\xce\xbe\x01\xcb\x52\xad\xbf\x76\xf6\xd7\x5b\xcf\x7f\xb2\x7b\xa5\xab\xe7\xef\x79\x5d\xd7\x72\x67\x51\x9c\x35\x6d\xda\x9f\x77\xb6\x76\xb6\x96\x6e\x6b\xa4\x37\xcd\xa6\x55\xb9\xd1\x25\x95\x2a\x18\x4c\xd2\x61\x59\xe9\xad\xe5\x45\x94\x9f\x64\xa7\x9e\xb0\x57\x27\xc8\x6a\xdd\xce\xab\x5b\x14\x40\xd1\x30\x8a\x93\x3c\x28\xf5\x7a\x69\x2a\x6c\x6a\x73\xaf\x1e\x45\xc6\xb4\x14\xf8\x52\xde\x36\x17\xdb\x96\xd2\xb7\xa2\xae\xb8\xcd\xc6\xed\x74\xb7\xbe\x6e\x8f\x56\x79\xae\x6a\x9d\x45\x8d\x86\x89\x5a\x55\x73\x23\x32\x30\x82\x4d\x6f\xa5\x85\x59\xfd\xaf\xbf\xae\x5b\x8b\x07\x57\x8d\xf4\xa5\xaa\xa9\x5f\x56\x4d\x3e\x57\x1c\xb7\xa4\x76\x24\x04\xfd\x1e\x59\xea\xd8\x64\x39\x46\x36\xfd\x8d\x2a\x9b\x6a\x3d\x46\x2d\x39\x6a\x2d\x06\xb0\xbb\x29\x16\xfd\x43\x7f\x62\x5f\x35\xee\x55\xb6\xf9\x30\xf4\x63\x73\xe4\x87\x25\x37\xc3\xb6\xf3\xd5\x6a\x50\x36\x86\x24\xc7\x25\xba\x18\x55\xcc\x6c\x30\xae\x1b\xe5\xb2\x93\x90\xb1\xd8\xc6\xbc\xe0\x6c\xcc\x74\xc3\xe5\xe2\x2c\xec\x0c\x5b\x72\x9c\x8c\xe7\xcd\xb5\xb5\x1c\xba\x54\x53\x63\x45\xd3\x94\xc5\x76\x9e\x1e\x74\x40\xad\x6c\x66\xdb\x3f\x1d\x7a\xf9\x4b\xd0\xb7\xaf\xa0\xcf\xcf\x48\xb9\x5a\xe5\xf5\x0e\x35\x0a\x12\xda\xea\xa3\xce\x60\xd4\x11\x9b\xed\x85\x27\xb5\x54\x29\x28\x37\x60\x79\x3d\xe3\xc5\x19\x5e\xe7\x4e\xd0\x7b\x5f\x85\xde\x1c\xb7\xf4\xc9\xa4\x3e\xed\x6c\xc5\xdc\xb8\xdb\x94\xa9\x98\xb3\xc3\xbe\x5c\x2b\x4d\x94\x19\x5b\xf4\x73\x82\xdc\x19\x0f\x3b\xad\x79\x4d\xda\x6c\x83\x4a\x7d\xb8\xed\xac\x26\x82\x40\x7b\x49\x54\x13\x65\x49\xb4\xb8\x32\xe8\x1a\xb4\x99\xf4\xc2\x7c\x10\x0d\x04\x77\x58\xf2\x6d\xfd\xe7\xb3\x5e\xf9\x12\xf4\xfd\x2b\xe8\xb3\x5a\xd3\xee\x5a\x1b\x6a\x4a\x78\x12\x37\x9b\x5c\xee\xba\xf5\xb0\xdf\xeb\x8b\x65\x43\x0a\xea\x65\xd0\x4c\x50\xd7\x93\x26\x8d\x3c\xad\x9f\x12\xd2\x75\x27\xe1\xc3\xd0\xcf\xea\xdc\x1c\x0f\x4a\x64\x55\x1c\x57\xad\x06\x5a\xb4\x16\xcb\x2e\xca\xac\xfa\x1d\x9a\x47\xb8\x98\x21\x49\xad\x81\x35\xb5\x0e\x88\xa5\x4e\x7b\xfe\x76\x2a\x99\x62\x79\x3d\x6c\xce\x8d\xb1\x53\x89\x4b\xd6\x02\x4c\x27\x9b\x65\xa7\x12\x75\xbb\x70\x30\x5b\x57\xd9\xa4\x5b\x2c\xe8\x3f\x9f\xf5\xf0\x4b\xd0\x8f\xaf\x13\x8e\xc2\xeb\x92\x51\xe7\x6b\x58\x72\x7a\xa4\x58\x01\x2d\x18\x10\x54\x2f\x15\xcb\x0b\x55\x36\x92\xee\x22\xe7\xe6\x70\xc0\x96\x3d\xc2\x4f\xac\x0f\xbe\x0a\xbd\x2d\x05\x30\x52\x05\x3b\x9e\x95\x7b\xc1\x72\x39\x11\xd5\xe1\x34\x19\x0b\xc5\xf9\x88\x78\xad\xa0\xec\xce\xca\xe3\x61\x6f\xee\x2b\x9d\xfc\x32\x1d\xc8\xa5\xaa\x20\xc2\x15\xac\x6c\x1d\x33\xcc\x81\x71\x84\xeb\xc5\x8c\xd1\xab\x15\x7a\x9d\xdc\x58\x21\x9d\x72\x8b\x26\x5d\xb7\xa9\x5b\x3f\x1d\x7a\xf4\x25\xe8\xe9\x75\xc2\x51\x4b\x60\xb2\x5c\xe5\xbd\x52\xab\xd3\x9a\xa2\x7a\x35\x3d\x2b\x65\x02\xbd\x5b\xf5\xac\x2e\x2f\xd0\x4c\xad\xda\x4e\xa7\xdd\x85\x8c\x69\xd2\x7e\x86\x7e\xf1\x55\xe8\x99\xd2\x13\x57\x74\xb0\x4c\x2f\xa3\xec\xac\x69\x8d\xb7\x5d\xbf\x60\xdb\xd6\x10\x96\x50\xb7\x5b\x9f\x3b\x13\x47\xe8\x34\x82\xa9\x18\x66\x63\xbb\x25\xb3\x71\xae\xba\xdc\xcc\xfd\x4a\x63\x3c\xe2\xd5\x4c\x69\x82\x3d\x7d\xb3\xd8\xac\x93\xb9\xdd\x1a\xc6\xa0\x3d\xf5\xe2\x79\xbb\x9d\xff\xf9\xac\x57\xbf\x04\xbd\x75\x05\xbd\x0e\xbd\x15\x6b\x77\xd5\x2d\xec\x21\x38\x09\xac\xd6\xa4\xc2\xc6\x70\x51\x86\xe5\x65\x3c\xab\x64\x92\xa2\xe4\x3a\x5b\x27\x16\x9a\xa8\x74\x62\x7d\xf8\x55\xe8\xf5\x85\x10\x96\x98\x32\xc9\x65\x9a\x95\x6a\xbb\xdd\x77\xe3\xd8\x49\x27\xa4\xe2\xc3\x46\x66\x2e\x41\x29\x2d\x3b\x5d\xab\xe8\x4f\xf3\x83\x60\x2d\xf7\xbb\x6d\xb6\xd2\x73\x55\x6f\xa5\xae\x68\x65\x56\x5e\x0c\x06\x43\xab\x55\x1b\x8c\xa3\x39\x2a\xb5\x57\xcb\x61\x92\xb7\xda\x34\xcc\xff\x7c\xd6\x6b\x5f\x82\x7e\x7e\x0d\x7d\x0e\x9b\x52\xbd\xe1\x87\x15\x08\x9d\x6c\x6b\x19\x52\x32\x68\x34\x8c\x11\x1f\x88\x92\x2e\xc2\x4a\xa7\x5a\x1d\x77\xc2\xa8\xd0\x06\x87\xa5\xbf\x3d\xf4\xd7\xb7\x3b\x7c\x9c\xf5\x84\x97\x03\xa1\x9f\x6f\xbb\x99\x34\xc9\x29\x45\x6d\xca\xb4\x4c\x71\xd5\x97\xd2\xc2\x44\x28\xe3\x41\x34\xc9\x05\xa5\x8e\x4a\x22\xdb\x2e\x67\xa8\x11\x8e\xb4\x69\xa5\xbf\x35\x6b\x79\x1e\x2d\x0b\xa4\x30\xa6\x68\xd8\x0d\xa6\xc2\xb2\x66\x60\x9c\x91\xbb\x5b\x65\x32\xb7\x9e\x12\xce\xeb\x23\x89\x5b\xbb\x45\x3e\x31\x92\x78\xda\x31\xf2\x5c\x99\x08\x8a\x08\xc8\x1a\x00\x94\x89\x82\x8c\xb9\x26\x70\x85\xc8\x0c\x08\x88\x71\x49\x95\x14\x11\x52\x55\x44\x8a\xa2\x68\x1c\x13\xc0\x35\x99\x03\x26\x62\x22\x48\x50\x06\x2a\x44\xe6\x79\xa5\xee\x53\xcb\x61\x52\x33\x82\xd5\x62\x32\x2c\x0d\x4a\x7d\xb5\x12\x58\x7a\x43\x59\xd6\x3a\xab\x55\x7a\x05\xb7\x4e\xb7\x50\x2f\x94\x5b\x70\x40\xb3\x86\xb9\x09\xf9\x61\x5e\xeb\xad\xc2\xdf\xde\x1d\xf2\xe1\xc2\x9f\x76\x88\x3c\x17\xfe\xe9\x91\x6c\x87\xe7\x3d\xa4\x5e\x1c\xfb\xc5\x1c\xe1\x45\x4c\xdc\xd0\xe4\xb1\x78\xe5\x87\xf3\x00\x47\x51\x30\x0d\x71\xc4\x6e\x68\xea\xb1\x28\x4e\x75\xf3\xc5\x54\xe3\x20\x9c\xfa\x33\xd5\x65\x41\xcc\x5c\xc2\xc2\x94\x28\x00\xe5\x1e\x43\xdc\x0f\x29\x8b\x68\xe0\x7b\x1e\x5b\xc7\x0e\x4e\x3c\x3a\xbd\x36\xb4\x7f\x9e\xc2\x3d\xca\x0e\xb3\x5d\xc7\xfb\x95\xa3\xdb\xe5\xff\xbf\xfb\xdb\x9b\x7f\x8d\x6d\x97\xfd\xfa\x47\x4a\x38\xdc\xed\xfc\xeb\xf1\x01\x75\xbf\xfe\x91\x3a\x9c\xdf\xff\x38\xc5\xd1\xaf\x7f\x1c\x9e\xe6\xb0\xff\xf1\x7f\x8f\xc2\x9c\xb1\xfb\x04\x5d\xbc\x8e\xd7\x91\xbd\xbd\x53\x3c\x64\x11\x0b\x97\xef\x09\xff\xf2\xbf\x77\x41\x81\xa3\x78\xbf\x0d\xd9\x3c\x6e\x07\xbc\x01\xc5\x97\x67\x01\xef\xf0\xe3\x98\x6d\x71\x48\xa7\xf6\xf2\x78\xf2\x95\x2a\x39\xd5\x01\x38\x02\xb2\x87\x23\xfc\xf5\x8f\xd4\xaf\x4b\x00\xfe\x09\xfe\x29\xfc\x7a\x3c\x41\x93\x30\x64\x5e\x6c\xec\x8b\xf6\xeb\x1f\x29\xed\xf2\xf7\xec\x7e\xa7\xf8\x0e\xb7\xff\xff\x19\xc8\x13\xa4\xcf\x92\x3b\xc5\xd0\x54\x09\x16\x00\x16\x00\x20\x4c\x92\x35\x48\x65\x91\xa9\xa2\xac\x62\x11\x63\x41\x90\x88\x28\x8a\x0a\xd6\x10\x33\x19\xa2\xa6\x26\xab\x50\x92\x24\x0d\x49\x50\x94\x4d\xac\x70\x7c\xf4\xe8\x59\xef\x8e\xc5\x17\x15\xf8\x7c\x66\x5f\xf6\x1d\xe5\x2e\x4e\xfd\xef\xd5\xf5\x91\x87\x83\x9d\x5f\x82\x8c\x88\x42\x29\xc7\x32\x13\x80\xa2\xaa\x18\x09\x26\x82\x08\x13\x01\xca\x12\x93\x31\x61\xa6\x26\x0a\x44\xd3\x18\x12\x09\x93\xa9\x24\x98\x14\xcb\x18\x03\x2e\x0b\x54\x55\xe1\xaf\xbf\xdc\xb0\xf0\x0a\x06\x02\x10\x89\xac\x60\x51\xe3\x32\x24\x9a\x29\x61\x2e\x49\x32\x94\x25\xa0\x60\x4c\x64\x40\x08\x84\x9a\x20\x21\x55\x44\x50\x52\x4c\x2a\x30\x85\x50\xa4\x40\x2c\x03\x2a\x13\x53\x82\x1f\xc7\x00\x7c\x7f\x79\xce\x4f\xe2\x20\xd9\x5d\xf7\x2b\x27\x8c\xca\x88\x2a\x9a\x09\xa0\x0a\xb1\xaa\x52\x55\x80\x18\x68\xaa\x49\xb8\xa4\x48\xaa\x80\x04\xae\x88\xc8\x44\x5c\x14\x35\x59\x34\x35\x49\xa1\x40\x41\x12\x27\x26\xe1\x54\xd5\x7e\xbd\x0b\x61\x4d\x94\x80\xaa\x71\x49\x05\x88\x63\x4c\x09\x23\x12\x51\x05\x99\x13\x41\xdd\x99\x16\x01\xa6\xd0\x44\x2a\xa7\x26\xa0\x22\x83\xaa\x2c\xcb\x84\x63\x48\x15\x46\x14\x93\x8a\xd2\x87\x10\xfe\xe2\xf1\x68\x84\x1f\x57\xf6\xb7\x10\xfe\x72\xa9\xff\xd6\x08\xdf\x19\xc7\xff\xc5\xe0\xbf\x18\xfc\x17\x83\xff\x62\xf0\x5f\x0c\xfe\x8b\xc1\x7f\x31\xf8\x59\x18\xec\x3f\xfd\x9f\xfb\x87\x46\x11\x0d\xf6\x4f\x7b\xba\x75\x7c\x7b\x1a\xff\x1f\xa6\xc6\xb6\xfe\x7c\xa8\x8c\x27\xfd\x49\x6f\x65\xbb\xba\x2e\xb9\x6a\x50\xce\xe7\x51\x3e\x6c\x0e\x2a\xed\x55\x9b\x66\x82\xc1\xaa\x10\x4b\xb5\x38\x7d\x9a\x84\x39\x2c\xc3\x4b\x63\xaf\x58\x2d\x50\xd9\xea\x2e\xe7\xad\xa1\x20\xb7\xf9\xb2\x99\xef\xbb\x9b\x9c\x39\x18\xf2\xc5\x3a\xdd\x57\x59\x2d\xd4\xc5\xf6\x78\xa2\x3d\xcf\x37\x54\xad\x2f\x4e\x02\x7d\x66\xbe\x22\xab\x27\xce\xd0\x0a\x81\x2a\xc3\x52\x6f\xae\xb2\x3e\x68\xd8\x6a\x37\x13\xa4\x0b\xac\xb9\x92\x83\x66\xc7\x18\x79\x28\x33\xa9\x63\xa2\x2f\xb6\x74\x18\x4c\xdc\x5e\xaf\x10\x32\xd9\x1d\x55\x8c\x51\xdc\x28\x54\xf3\x74\xd3\x8c\xc4\x62\x3d\xae\x8f\x96\x82\xbd\xad\xe5\x9b\x7d\x67\x79\xf2\x27\x37\xfe\xe2\x5d\x16\xd9\xcf\x4c\xb2\xb5\x8d\x60\xe0\xd7\x34\xde\x6c\x4e\xe7\x4a\xab\xec\x34\x7a\xe3\x65\x61\x09\xf9\xb4\x3c\x8b\x9a\xb5\xde\xbc\x0b\x94\x74\x46\xec\x95\xdc\x55\x2d\x92\x8a\x8b\xe1\x64\x2e\xac\x6b\x52\x52\x75\x36\x39\x80\x7a\x9d\x5c\x5b\xaa\xcf\xc2\xc6\xb4\x67\xf4\x8a\x48\xab\x44\x1b\x6b\xeb\x54\xc9\x01\x73\xbd\x39\x59\xb2\x08\x4c\x4b\xfd\x86\x6b\xb0\xee\x22\xd3\x21\xcd\x32\x0c\xa6\x2b\xad\x37\xdb\xd6\x62\x54\xca\x4c\xaa\xeb\x6d\xb3\x5a\xe9\x6d\x56\x95\x46\x6b\xa3\x17\xbd\x5e\x2b\x40\x4c\x46\xe1\x42\xeb\xaa\x53\x8e\xf8\x12\xe5\xd6\x66\xcb\xf5\x23\x3d\xb3\xe6\xa8\x20\xb6\xbd\xec\xea\x8b\x7c\xb3\x9e\xeb\x7f\xf5\xd5\xbb\x5a\x0e\x3f\x7e\x8c\xbf\xed\xb2\x2b\xad\xa1\x59\xd4\x85\xea\x32\xe3\xae\x92\x0e\x1f\x8f\x96\x7c\x4d\x8b\x8d\x4c\x5c\x32\xb3\xa2\x43\x4a\xed\x45\x67\xce\x4b\xa8\xe2\x4f\x33\x52\x0e\x82\xcc\xb8\x5b\xac\x4b\x5d\x4b\x42\xc6\xba\xb4\x2e\x95\x9b\x60\xbe\x18\x9b\xc6\xc6\x16\xdd\x65\xba\x10\xa5\x87\x93\xca\x61\x85\x3e\x6b\x6c\x06\x3c\x5b\xec\x73\xbc\x44\x8b\x0a\xce\x8d\xda\xeb\xfa\xaa\x25\x4e\xe6\x51\xa3\x03\x0b\xbd\xd1\xa0\x15\x6d\x4b\xfe\x20\x6e\xd7\x33\xf5\x93\xff\xa7\xf9\xbb\x4f\xf1\xe7\x69\xad\xf0\x95\x79\xbc\x57\x9e\xa7\xf2\xd1\x79\xbc\xb3\x67\xaa\x3c\x62\x4f\x37\xf8\x9e\xfa\xca\x66\xe6\x6f\xfd\x6e\xfe\xdb\xf7\x94\x26\x8a\x92\x84\x44\x41\x82\xaa\x22\x23\xa4\xa8\xc2\x61\x43\x33\xd8\xaf\xb1\xbd\xba\xaf\xfa\x66\x59\x3e\xbf\xf9\xfb\x31\x65\x91\x4f\x0d\xc6\xbe\x0c\xc2\xd5\xf6\xeb\x37\x6a\xf8\xb5\xc7\x89\x7c\xb8\x8e\xcf\x1f\x29\x72\x9a\xad\x25\x92\xa6\x32\x22\x63\xa6\x6a\x48\x81\x92\xa8\x40\x59\xa2\xd8\x14\x01\xd5\x64\x06\x24\xc2\xa9\x80\x64\x22\x89\x12\x63\xaa\xc4\x80\x0c\x08\x47\x02\xc0\x8a\xa9\x09\x32\x07\xe4\xb8\xf5\xf3\xa2\xb5\xaa\x9f\xd8\x7e\x48\x9c\x76\x26\x2b\x18\x42\xb5\xb4\x89\xa7\xab\x06\x70\xc6\x02\xde\x04\x3e\xd0\x1a\xe5\xf5\xd2\xc8\x6d\x9a\x4a\x9c\x2d\xd0\xdc\x60\xb9\x2a\x6a\x2b\xc9\x8a\xc3\xa6\x37\xb9\xce\x02\xb7\x8e\x57\xb7\x10\xef\xa3\x2d\xf7\x15\xfb\xe3\x4c\x9a\x5e\xe9\xbb\xd3\xfe\xcb\xd5\x9e\xdb\xb8\x73\x0d\x51\xcc\x39\x26\x2a\x05\x50\x10\x25\x2c\x21\x55\x95\x01\x54\x28\x11\x88\xc4\x39\xc0\x58\x34\x31\xdf\xf1\x86\x33\x2e\x6b\xa6\x08\x18\xa7\xaa\x8c\x4c\x93\x70\xc2\xf0\x01\x77\xf1\x25\xee\xff\xa6\x72\x3f\x0a\x77\xf5\xfa\xbe\xa8\x07\xe3\xae\x09\xaa\x2a\x60\xaa\x48\x2a\x50\x4c\x4c\x55\x59\x06\xd8\x34\x05\x51\x14\x30\x82\x12\x60\x5c\x61\x98\x4a\xa6\x82\xa8\xc8\x54\x0d\x4a\x32\xc3\x1a\x51\x44\x41\xe2\x10\x60\x95\xc9\x07\xdc\xa5\x87\xe3\xfe\xd9\x72\x3f\x0a\x77\xd4\x3f\x5d\x5f\xff\x09\xb8\x23\x8c\x04\x04\x54\x88\x15\x4a\x25\x88\x05\xa6\x88\x82\x22\xab\x98\x29\x00\x10\x45\x52\x35\x48\x05\x49\x03\x94\x01\x08\x4d\x59\x30\xb1\x2a\x28\xea\x7e\x0f\x1a\x83\x18\x8b\xf4\xb8\x21\xf7\x4d\xdc\x73\x20\xc9\x9a\x65\xbf\x97\x58\xf5\x65\x3b\xce\xa3\xec\xb4\x62\x48\x0d\xa6\x99\x83\x16\x2f\x55\xd2\x55\x5b\xa9\x2e\xfb\xcd\xf4\x44\x8f\xd1\xbe\x97\x53\xed\xe7\xd2\xc7\x42\xdd\xdc\xe7\x72\x17\xee\xf9\xaf\xd9\x6f\xd2\xcf\xd9\xbf\x17\x77\x0a\x09\x37\x4d\x4d\xe2\x40\x46\x82\xc9\x35\x93\x63\x89\x71\x4d\x31\x15\x44\xb0\xa8\x52\x46\x31\x65\x02\x54\x4d\x8d\x8b\x84\x08\xb2\x80\x91\xc6\x39\x45\x54\x31\x35\x48\x89\x76\xc0\xfd\x46\x9e\xf9\x37\x95\xfb\x51\xb8\xd7\xe5\x9f\x8b\x3b\x31\x65\x15\x9a\x64\x97\x5a\x4c\x19\x0a\x2a\x40\x10\x01\x2a\x63\x05\x23\xa6\x99\x90\xa9\x50\xa1\x58\xd4\x28\x91\x01\x83\xa2\x89\x30\xe6\x48\xc0\x22\x67\x4c\x21\x12\x34\xd9\x71\x3b\xef\xdb\x7c\x4f\x7c\xc9\x8f\x65\x65\x91\x6b\x15\xd6\x41\x3b\x23\xf9\xe5\x46\x7a\x0b\x50\x67\x63\x47\xc0\xe1\xf5\xe2\xd8\x6d\x0f\xad\x30\xe9\xa6\x7b\xba\xfe\x28\xbe\x17\xbe\x66\xff\x67\xf3\x9d\x28\x8a\x89\xa0\x8a\x65\xa6\x32\x04\x44\x13\x8b\x02\xe3\x26\x63\x02\x43\xa6\xaa\x70\x41\xd4\x64\x95\x6b\x04\x72\x53\x62\x5c\x34\x31\xe3\xa6\x84\x15\x0c\x64\xc4\xa8\x09\x25\xf3\xb8\x29\xf5\xed\xfc\x9e\xe0\x1c\x19\x8c\x26\x62\xde\x19\x0d\x71\x38\x80\xfd\xf5\x8a\x0c\xa5\x52\xa3\x6a\x05\x9e\xa4\x77\x73\xd3\x4a\x31\x50\xc8\xba\x5b\x19\x5a\x0f\xc3\xbd\xf8\x35\xfb\x3f\x1b\x77\x89\x40\x08\xb1\xa8\x48\x12\x90\x38\x45\x58\x30\x45\x19\x30\x26\xaa\x02\x94\x19\xa3\x48\xc5\x18\x2b\x8c\x98\x02\x46\x54\xc0\x0c\x71\x55\x11\x15\x8d\xa9\x02\xc7\xa6\x20\x6a\xfc\xb8\xb5\xf2\xe1\x79\xe6\x3c\xce\xaf\xdb\xd5\xfa\x3d\xb8\x97\xbe\x66\xdf\xe8\x7f\xce\xfe\xdd\xb8\xf3\xfd\x12\x31\xc1\x8a\xa4\x31\x51\x26\x58\xa3\x02\xc1\x50\xe4\x8a\x20\x01\xd5\x54\x29\x02\xaa\xc0\x45\x13\x22\x05\x51\x8a\x20\xd3\x34\x55\x16\x14\x85\x2a\x0c\x68\x9c\xcb\xc7\x0d\x82\x2f\x71\x7f\x60\xb9\xaf\xfb\x13\x77\xe1\x5e\xfe\x9a\xfd\xea\xea\x73\xf6\xef\xc6\x9d\x32\x8d\x53\x00\x14\x8d\x8a\x0a\x36\x29\x14\xa9\x06\x55\x88\x34\x91\x9a\x32\xe0\x02\xd4\x04\x55\x54\x05\xa2\x6a\x1a\x92\x65\x41\x41\xaa\x02\x4d\x22\x49\x04\x73\x86\x94\x7d\x7e\x57\x6f\xe2\xfe\xc0\x72\x5f\x17\xf0\x2e\xdc\x2b\x5f\xb3\x5f\xa9\x7f\xce\xfe\xdb\xb3\x1c\x37\x1f\x16\xf9\xf1\x01\xf0\xcf\x1e\xfd\x96\x0c\xb5\xdc\x5e\xb6\xe7\xa4\x26\x96\x75\x69\x38\x98\x75\xc2\x9a\x3b\x1b\x09\x02\x2f\xa9\x91\x51\x41\xae\x50\xe8\xac\xaa\xc3\x8c\x3e\x92\xf4\xfd\x8e\xa9\xe7\x23\x7b\x05\xc7\xf5\x77\x3d\x26\xd6\xa8\x03\x0b\xc8\xcf\x1b\x82\xd1\x4e\xaf\xc6\xdd\x9c\xb6\x1d\x2d\x47\x83\x9e\xb4\xb6\x5b\xf6\x38\xe9\x12\x90\x5f\xba\x6d\x83\xed\x1f\x32\x90\x1b\xe8\xcb\xf3\xa7\x66\x65\x0f\xbd\xfd\x7d\x25\x8f\x67\x6d\xda\xea\x89\x25\x65\xba\xf0\xb2\xae\x55\x2a\x31\x4b\xab\xaa\x8e\x4c\x41\xc1\xeb\x3b\xeb\xb9\x53\x70\xca\x5a\xb4\x98\x84\x82\x86\x40\x11\x36\x8d\x21\x67\x19\x57\x9e\x07\xc5\xb8\x92\x8e\x2a\x82\x0d\x16\x86\x1d\x2b\xba\x50\xdd\x0c\x3d\x32\x1d\x1b\x43\xc5\xcf\xef\x37\xe3\x6d\xdd\x66\x5c\x83\x55\x73\x58\x77\x26\xf9\x4d\x5c\xa1\x4e\xb3\x80\x32\xba\x69\xd4\x67\xc8\x6f\x4d\xdb\x44\x5b\x95\x1c\xb1\xdd\x3b\x9b\x2a\x7e\x03\x83\x13\x33\x2e\xee\x85\x3b\x93\x5d\xe9\x0f\x1a\x7d\x7d\x76\xf4\xa3\x3f\x60\xf4\x55\xec\x0d\xb3\xe1\x17\xec\xeb\xfa\xbf\x6f\x14\x74\x2b\x5b\xfe\xec\xa9\x8e\xcf\x07\x59\xee\xca\xfb\x17\x84\x0b\x17\x0d\x68\xb0\x26\xb6\x66\xeb\x3a\xee\xb7\x34\x98\xdd\xf2\x48\x63\x02\xf5\xc3\xc6\x64\xb4\xcd\x0e\xab\xf3\xa2\x5f\x43\xf3\xe5\xfc\x30\x4b\xfe\x7a\x90\x65\xdd\x5a\xd0\xb5\x96\xe1\xaa\xd6\x14\x85\x51\xae\xc9\xc7\x7c\x14\x95\x0a\x85\x7e\xbc\x1a\x63\x5c\xe0\x8b\x6e\x02\x37\x6e\xd5\x75\xf2\x2e\x4e\x57\x46\xb0\x82\x2a\x96\x45\xfa\x93\xba\x4f\xdb\xe6\x44\x93\x2b\x75\x9d\xd7\xcc\xb6\xde\x58\x8c\x48\xa5\x89\x36\xd1\x8a\xb1\x7a\x6e\x17\x08\xe9\xd1\x66\x99\x0e\x67\xd9\x71\xae\x39\x63\x95\xf6\x70\x64\xe4\xb6\x99\xf5\xc2\x16\x97\x6d\x3d\x9f\xd6\xaa\xc2\x14\xa9\xd3\xb2\x44\xd2\xe9\xd3\x06\x8c\x7f\x7f\x90\x7d\x95\xe4\x5f\x0c\xb2\x05\xca\xf4\xf2\xe4\x91\x41\xf6\x2f\x1c\x7a\xdd\x15\x64\x0f\x9e\xd7\xfa\x7c\x90\xe5\xaf\xbc\x7f\x41\x38\xe2\x5a\x2e\x18\x88\xa6\xa5\x0c\x80\xbb\x00\xcc\xa9\xd3\x12\x88\xd7\xb3\xee\xb8\x36\xd1\x56\x05\xcb\xef\x66\x31\x1b\xaa\x7d\xbb\xb8\x27\xf0\x5b\x41\x66\x8e\xe4\x4e\xa6\x34\xdd\x2e\xd4\x4c\x98\x4e\xd4\x96\x91\x8e\x1a\xa1\x5d\x8e\xba\x8a\x33\x04\x83\x38\xad\xb1\x1c\x13\x3c\x6f\x58\x6f\xf4\xb6\x75\x8b\xf6\x09\x0e\x59\x8b\x84\x41\x5e\xb4\x42\x35\x3f\x1b\x24\x2e\x75\x83\x41\x59\x5b\x95\xc4\xd2\x28\x1e\x2e\x57\xdb\x91\x6f\xec\x02\x61\x5e\xb1\x6a\xeb\x9e\x35\x10\xa3\x69\xa1\x14\x0b\xb9\x4a\xcd\x9c\x95\x97\xa3\xc5\x4a\x1b\xa8\x86\xef\xcc\x7a\x0b\x17\x54\xf2\xda\x74\xd1\x3c\xd5\xd8\xbf\x3d\xc8\xbe\x4c\xf2\xaf\x06\xd9\x26\x6c\x17\x8d\x07\x06\xd9\xbf\x72\x9c\x7d\x57\x90\x3d\x78\x12\xd3\x18\xca\x45\x81\x4d\x9b\x50\xdf\x68\x39\xa1\x15\x95\x0a\xd6\x92\x02\x04\x40\x5f\x53\xc7\x33\xd9\x35\xe6\xae\xd6\x46\xca\x3c\x27\xed\x97\xb1\x0f\x04\x3b\x2c\x45\x5e\x79\x7f\xf6\xbd\x7f\xab\xa0\xd9\x3b\x80\xbf\xd0\xf7\xdc\x3d\x28\xe4\xb3\xd3\x7c\x33\x2a\x0e\x5b\x62\x2d\xe7\x4f\x92\x6a\xbe\x33\x4a\xec\x86\x2b\xe4\x66\xd6\xa0\x66\x18\xb1\x39\xb1\x33\xba\xd4\xe4\x61\x2e\xb2\x96\x23\xd5\xde\x4e\x75\xc7\x19\xcd\x3b\x8b\x70\xb4\xb1\xe3\xee\xb2\xe4\x4b\xf3\xf6\x14\x0e\x32\xdd\x4c\xec\xb5\x49\x38\xb6\xca\xed\x76\x69\x7f\xe7\xb7\x97\x5d\x4f\x17\xa3\x7a\x63\x91\x77\x2a\xc5\x6e\x4d\xe9\x94\x40\xb3\x4a\xf4\x66\x67\x3b\x9d\xc4\xed\xc6\x42\x1f\x56\x36\x30\x74\x17\xf6\xe9\xd9\x1c\xb7\x83\xac\x7f\x59\x91\x17\x41\xb6\xc7\xeb\x90\x94\xce\x1e\xf1\xf1\x89\xee\xf4\xac\x79\xc2\xff\x95\xe3\x95\x05\x93\x8b\x20\x7f\x88\xfd\x57\x12\xcc\x3b\xf6\x7f\xca\xa4\xca\xa7\x16\x89\x7e\xa2\xfd\xc2\x1b\xf6\xef\x0a\xf2\x07\xcf\x98\x7f\x3e\xc8\xdf\xe8\xae\xbe\x11\xe4\x6f\x65\xbe\x2b\x7d\xa7\x20\xcf\x0e\xaa\xf3\x5e\xbb\x57\x74\x82\x62\xcd\xaf\x4f\xa9\x4d\xea\x81\x59\x55\xe6\xd3\x8e\x06\x8c\xb1\xb4\x6d\xb5\x57\xcb\x0c\x53\x9a\x4b\x34\xaa\xd0\x61\xad\x54\x59\x2a\x51\x9e\x5b\x9b\x29\xae\x65\xd6\xca\x70\x3c\xe4\x78\xd5\x18\x52\xaa\xf0\xba\x33\x44\x34\xd3\x5a\x97\x9a\xed\xea\x2e\x10\xd7\x61\xc6\x9c\x67\x8a\xe5\x3c\xf7\xb8\x9f\x4e\x0f\xc0\x28\xb1\x67\xcd\x4d\x24\x97\x66\x13\x35\x8c\x0a\x39\xcf\xcb\xac\xd5\xd1\x84\x18\xa7\x46\xfe\x6f\x12\xe4\xaf\x24\xd9\x7f\x59\x90\xbf\x52\xff\xff\x8e\x20\xbf\x4e\x7a\x6f\x05\x99\xfe\x13\x82\xfc\xab\x33\xa7\x3f\x7b\x79\xa6\x06\x67\xcc\x96\x66\xae\x5f\x51\x7b\x25\x27\x9f\x61\x16\x95\x50\x6b\x14\x97\x6b\xb5\xed\x70\xa0\xae\x06\xf6\x24\x8b\x73\x89\x62\x28\x7b\xcf\xef\x6b\xc9\xf7\x5b\xc1\xb3\x83\x41\xa3\xf0\x61\x10\xa5\xcc\xf3\x71\xd2\x57\x7a\xb6\xdf\xce\x6a\x73\xb7\x36\x14\x17\xd2\x12\xb5\xf9\x46\x6d\xd5\xd9\xbc\x40\x40\xaf\x57\x51\xec\xf5\x62\x5e\x11\xb2\xbe\x35\x0a\x9b\x31\xb2\x9a\x00\x8a\x6d\x32\x9f\x8a\x66\xb7\xd7\xe7\x2c\xef\x2f\xa9\xd0\xd2\x31\x9f\xe6\x47\xeb\x78\x3a\xd0\x9d\xc8\x48\x66\x4e\xd6\xdd\xcc\xb2\xfa\x78\x1f\x94\xcb\xfe\x34\x5e\x9a\x7a\xdc\xb1\xac\xd1\x64\xbd\xae\x0d\x3d\x68\x12\x7f\x42\xfd\x60\x23\x94\x5d\x63\xb4\x58\xd2\x9a\x91\x56\x48\x23\x3e\xad\x78\xdf\x0e\xf8\xf1\x65\xa5\xbe\x12\xf0\xe7\x00\x7e\x62\xfc\x3e\xf3\xf4\x5b\x04\x3b\x3f\xde\x0e\xb8\x07\xda\xff\x5c\xab\x7e\x1a\x3a\x3c\x70\x69\xee\x53\xad\xfa\xa3\xed\xbf\xc4\xe3\xed\x1e\x6c\xe1\x24\xf3\x51\xfb\xc5\x41\x5f\x38\x2a\xff\x60\x83\x7d\xac\x8a\x53\xc0\xad\xae\xdd\xba\x2f\x21\x3d\x76\xdd\xb2\xa4\xf8\xd5\x78\x60\x7a\xe3\xe6\xc0\x9c\x2c\xe2\x51\xd0\x2b\x67\x63\x42\xc7\x82\x9b\x73\x39\xcd\x56\x6a\x05\x6b\xe8\x39\xcb\x62\x65\xba\x7f\x1c\xee\x4f\x4f\x48\x7b\x50\x9c\xb6\xa1\x9c\xab\x2e\x3e\xdb\x6f\x67\x9d\xc0\xcd\xc0\x70\xa9\x54\x97\xa4\x21\xea\xb5\x7e\xd7\x29\xa7\x65\xdb\xac\x38\x23\x81\xd6\x21\x52\xdb\xa3\x75\x2d\x6d\x3b\x42\x82\xb6\x52\xcd\x68\x76\xcc\x6d\xad\x3b\x37\xbc\xae\x32\x34\x8d\x89\xa3\x67\xa1\x9d\x77\xfd\x5a\x45\x19\x92\x8d\xd9\x36\xe6\x71\x23\xce\xb7\xf5\x7d\xd2\x88\x07\x40\xb4\xe7\xb0\x49\xbb\xa2\x9d\x5f\x4a\x49\xde\x13\x8b\x6a\xce\xa9\xa4\x09\xd1\x5a\x4b\x03\x23\xad\xe9\xf8\x7d\x1e\x81\xd9\xe9\x11\xe8\x5f\x4a\x48\x67\x24\xfd\xc4\x5c\xc7\xd7\x13\xd2\xe3\xec\x7f\x35\x21\x3d\x70\xcd\xfa\x53\x09\xe9\xd1\xf6\x3f\x9a\x90\x8a\x27\x99\x8f\xda\xff\x6a\x42\xd2\xf5\xcb\x09\x91\xf3\xe3\xae\x84\xf4\xe0\x05\xfd\xcf\x0f\x83\xde\x98\x50\x3c\xd4\xcf\x07\x5b\xdd\xb3\x04\x76\x46\x2a\xfe\xd4\x0d\xcf\xea\x06\xa4\xdb\x71\x71\xd9\xcd\x4e\xcd\x01\xcb\xcb\x9c\x8c\x9a\xe5\x64\x54\xc4\x62\x2e\xbf\x30\x82\x22\xa7\xe9\x76\xd5\xf3\xed\x96\x11\x67\x44\x69\x3c\xb0\xfb\x9d\x92\xb1\xe1\x96\xa4\xaa\xc5\x5a\xbd\x16\x91\x46\xb5\x60\xb9\xc5\x28\x57\x9d\xc5\x96\x23\xf1\x19\x5a\x85\x19\x7d\x75\x48\x18\x4d\x71\xb2\xa8\xf6\xea\xbd\x4c\xd9\x6f\x54\xb3\xc8\xb6\x4a\xbd\x64\x2d\x2f\x16\xa3\x50\xa8\x71\x3d\xf4\xd2\xc5\xea\x04\xea\xe9\x58\x0f\x4e\xcf\x0a\xbf\x9d\x8c\xe8\x65\x85\xbe\x96\x8c\xce\x86\x83\x9f\x18\x8e\xd8\xe0\x54\x0f\xd7\xc3\x91\xfc\x0b\x0c\x6f\xd4\xd3\x03\xed\x5f\xf3\xe0\x2e\xfb\x67\xc3\xa1\xbf\x69\xef\x40\xbf\xbc\xd1\xe4\x6f\xe1\xdf\x39\xa6\xf7\x25\x8b\xc7\xde\x85\xf2\xf9\x64\x71\xcd\x86\x17\x01\xf3\xc1\x16\xf1\xdd\x64\x01\x7a\x7a\x3b\x9b\x64\x44\x8e\x46\xe5\x28\x43\x63\xbd\xaa\x0c\xd1\x38\x9e\xcb\xb3\x65\x3b\xeb\x07\x66\x53\x50\xb6\xf3\x6e\xdb\xef\xaa\x81\x9d\x00\x77\xe2\x66\xe2\xde\x32\xdf\x1b\x15\x16\x99\x76\x3f\xe1\x41\x9c\x29\xa8\x8d\xac\x55\x8b\x1b\x01\xad\x8e\x92\xfa\x52\xc1\xad\xdc\x31\x59\xb4\x36\x0b\x2b\x07\xfb\x8a\x3c\x4f\x82\x95\x11\xd8\x5a\xbb\x3e\x16\xeb\x74\x9c\xdf\x00\x6f\xa0\xae\x45\x38\x99\xea\x03\x3a\x9a\x7a\x99\xf7\x56\x21\xee\x4c\x16\x5f\x9b\xbb\xb0\xa9\xae\x7f\x29\x58\x1f\x68\xff\xda\xd0\x47\x93\xc5\xdf\xb4\xe5\xd6\x2f\xef\x8e\xfa\x5b\xf8\xf7\xf1\x64\xf1\xd8\x5b\xa7\x3e\x9f\x2c\x8a\x37\x49\xb0\x3f\xbe\x9a\x2c\xce\x8e\xb3\x64\xd1\xc5\xbc\x1c\x64\xb6\x01\x00\x71\x51\x05\xf5\xce\x92\xe8\xde\x5a\xb3\xda\x8d\xde\xc8\x34\x86\x72\xde\xf5\x2b\x3e\x9f\x5b\x7e\x29\x3d\xab\xae\x32\xa3\x59\x66\x9e\x6e\x28\xc3\x65\x77\xb6\x28\x85\xa5\xa2\x24\x25\x59\x58\xf3\xf2\xe9\x95\xce\xdb\x95\x29\x17\x32\x79\x67\x1d\xec\x9f\xe3\xb9\x4b\x16\x4d\x4f\x2d\x0c\xbc\xdc\x30\x5e\xdb\x9b\xe1\xd4\x9b\x47\x20\xab\x96\xe6\x95\x9a\x9e\x54\x1d\xa1\x5d\x64\x45\x42\xea\x28\x4c\x9b\xe6\x7b\xf3\x2e\xf7\x25\x8b\xf3\xee\xc0\x67\x82\x35\x7f\xaa\x87\x4f\x05\xeb\x03\xed\x5f\xf3\xe0\xa3\xc9\xe2\x6f\x1a\x8c\xfa\xe5\x2d\x7d\x7f\x0b\xff\xce\x8f\x37\x6f\xf9\x7b\xe3\x7d\xc6\x1f\xbd\xef\xef\xea\x9d\xc6\x4f\x79\xe8\xfc\xc6\xbd\xc3\x8b\x03\x4f\x5c\xbf\x91\xc8\x5e\xd7\xf2\xbc\xd4\x73\x78\xdd\xe0\x0b\x2d\x97\x2f\x6a\x3e\x7b\xed\xf0\xf9\xe7\x1f\xc1\x9c\x3d\x17\xf3\xf4\xde\xe3\x77\x8a\xa9\x1b\xbd\x42\xe7\x88\x4a\xb3\x61\x8c\xcf\x35\xee\x77\xa3\xeb\xf9\xfc\xf9\x5b\x94\xaf\x0d\xa6\x5a\x9d\x4a\x5d\xef\x8c\x53\xb5\xc2\x38\xf5\xdb\xf3\x8b\xf4\xbf\xa7\x76\x12\x1e\x76\xd9\x6b\xee\x47\xcf\x1f\x1e\xeb\x78\xf4\x86\xd7\xd1\x5b\x2e\xbf\x70\x94\x60\x6f\xf7\xef\x41\xee\x11\xec\xdd\xf2\xec\xc9\xc0\xa5\x53\x9e\x6f\xb2\x1b\x1e\x5d\xbe\x06\xe1\xe2\xdb\xd9\xfb\xac\x1f\xe2\xee\x85\xf2\x5b\x8e\xbf\x61\x3d\xd5\x6f\x54\xda\xfd\x42\xea\xf4\x2e\xed\x0f\x95\xe4\x31\x78\x7f\xb0\x00\x2f\xeb\xe0\x78\x1e\x47\xd3\x17\xde\x1f\x9e\xe8\x7f\xfc\xef\x41\xfe\x1e\x94\xdd\x72\xf4\xcc\xcc\xa5\x87\xfb\x13\x37\x68\xb2\x7f\x45\xc0\xe1\xef\x83\x9c\xdb\xeb\xba\xe5\xdb\xc9\xc8\xa5\x6b\x76\xf0\x3d\x15\xf8\x61\xfc\xd2\xb7\xb3\x37\x0e\x5c\x7c\x79\x94\xa7\x67\x2a\x6f\x3a\x7c\x6d\xf2\x56\xa5\xdf\xf2\x3a\x4a\xc8\xf1\xbf\xc7\x79\x1a\x25\xe4\x15\x1f\x9f\xcc\x5c\x7a\x17\xb2\xe8\x46\x75\x9f\x5e\x91\x70\xf6\xf1\x41\x4e\x9e\x14\xde\x72\xf4\xca\xdc\x5d\x39\xec\xec\x69\xa7\xa7\x8f\x0f\xf2\xf6\xa4\xf0\x96\xb7\x57\xe6\x2e\xbd\x5d\x44\x2c\xbe\x19\xeb\x67\x8f\x5e\x39\x7d\x7c\x94\xbf\xcf\x0a\x6f\xfa\x7b\x69\xee\xd2\xdf\xfd\xef\x37\xdb\xd7\xb3\xa7\x17\x9c\x3e\x3e\xc8\xe1\x93\xc2\x5b\x0e\x5f\x99\x7b\xb5\x6b\x60\x47\x51\xc2\xc2\xef\x29\x1c\x45\x2c\xa6\xbe\x79\xa3\x0c\xe7\x3b\x66\xce\xbf\x3c\xaa\x1c\x67\x2a\x6f\x96\xe4\xda\xe4\xad\x2c\x11\xb1\xc5\xf7\x54\xbc\xb6\x3d\x93\xad\x6f\x94\xe0\xe4\xfe\xa3\x7d\x7f\xd3\xf1\x2f\x79\x7d\xd5\x45\xbd\xfc\xfa\x20\xff\x2f\x95\xde\x2a\xc4\x0d\xb3\xaf\x96\xe4\x28\x7b\xbb\x38\x47\xce\x11\xec\x60\x8f\x9e\x1e\x70\x52\x69\xe4\x0b\xa3\x77\xdc\xce\x75\x0a\x7a\xaf\x70\x10\xbd\xd6\x93\x6a\x36\x4e\xbd\xd8\x7e\xb7\xd2\x28\xa5\x48\x1c\x32\x96\xfa\xed\x28\xf1\x8f\xd4\xb0\x5c\xe8\x14\x9e\xbf\xa7\xfe\xe7\xaf\x14\x78\x7e\x7c\xc7\xcb\x8e\x26\x8b\xe2\x43\x5b\xbe\x2b\xc5\xa7\xbd\xbc\x54\xb3\x73\xf2\xd8\x4f\xb9\x70\x31\x62\x8e\x63\x7b\xd6\x3e\xf6\xbe\xa7\x48\xb2\x39\x7d\x09\x42\x9b\xbe\x8c\xc5\x5d\x35\x90\x4d\xc4\x16\x9f\x76\xec\x59\xc3\xce\xa7\x53\x60\x5c\xb8\xf5\x7a\x57\x71\x27\xce\x19\xfb\xba\x0b\x4f\x4a\x0e\x5e\x9c\x25\x98\x3b\x1d\x39\x9e\xf9\x9a\x23\xe7\x4a\x76\x8e\x5c\x76\x84\xef\xf4\x24\xa2\x01\xf3\x96\x5f\xf4\xe4\x5c\xc9\xce\x93\xb3\x67\xca\xdf\xef\xc6\xb1\x41\xfd\xb2\x27\xe7\x7a\x8e\xce\x3c\xf5\x12\x2e\x9d\xc1\x51\xfc\xba\x43\x67\x89\xe3\x6b\x1e\x5d\x2b\xda\xb9\x74\x95\x1b\xdf\xc5\xa8\xe5\x47\xb1\x15\xb2\x6e\xdb\x48\x3d\x3d\xd0\x3c\x65\x26\x6e\x90\xa2\xbe\x1b\x38\x2c\x66\x7b\xb3\xff\x2f\x00\x00\xff\xff\x2e\xd5\x1b\xea\xb1\xaa\x00\x00") - -func allow_trustCoreSqlBytes() ([]byte, error) { - return bindataRead( - _allow_trustCoreSql, - "allow_trust-core.sql", - ) -} - -func allow_trustCoreSql() (*asset, error) { - bytes, err := allow_trustCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "allow_trust-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x95, 0x9, 0x9e, 0x40, 0xdb, 0x1c, 0x6c, 0xe1, 0x6c, 0xe5, 0x85, 0x12, 0x74, 0xfd, 0x5a, 0x81, 0x43, 0xb9, 0xc1, 0x6a, 0xee, 0xd4, 0xa9, 0xc7, 0x13, 0x94, 0x39, 0x18, 0x1, 0x51, 0xb3, 0xc}} - return a, nil -} - -var _allow_trustHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\xf9\x8e\xa3\xb8\xf6\xf0\xff\xf3\x14\xa8\x75\xa5\x9a\x51\xaa\x27\x98\xc5\x40\xcf\x37\x57\x22\x09\xd9\xf7\x3d\x75\x35\x8a\x0c\x98\x84\x2c\x40\x01\x59\xaf\x7e\xef\xfe\x29\x90\x54\x08\x15\x12\xb2\x74\x4f\x5f\x0d\x6a\xb5\x02\xb6\xcf\xe6\xb3\xf8\xd8\x07\xea\xeb\xd7\x5f\xbe\x7e\x25\xea\xa6\xe3\x8e\x6c\xdc\x6a\x94\x09\x15\xb9\x48\x46\x0e\x26\xd4\xc5\xdc\xfa\xe5\xeb\xd7\x5f\x76\xed\x99\xc5\xdc\xc2\x2a\xa1\xd9\xe6\xfc\xd8\x61\x89\x6d\x47\x37\x0d\x42\xf8\x1d\xfe\x0e\x02\xbd\xe4\x0d\x61\x8d\x86\xbb\xe1\xa1\x2e\xbf\xb4\xa4\x36\xe1\xb8\xc8\xc5\x73\x6c\xb8\x43\x57\x9f\x63\x73\xe1\x12\x7f\x12\xe4\x1f\x5e\xd3\xcc\x54\xa6\x9f\x9f\x2a\x33\x7d\xd7\x1b\x1b\x8a\xa9\xea\xc6\x88\xf8\x93\x78\xe9\xb4\xb3\xfc\xcb\x1f\x07\x70\x86\x8a\x6c\x75\xa8\x98\x86\x66\xda\x73\xdd\x18\x0d\x1d\xd7\xd6\x8d\x91\x43\xfc\x49\x98\xc6\x1e\xc6\x18\x2b\xd3\xa1\xb6\x30\x14\x57\x37\x8d\xa1\x6c\xaa\x3a\xde\xb5\x6b\x68\xe6\xe0\x13\x34\x73\xdd\x18\xce\xb1\xe3\xa0\x91\xd7\x61\x85\x6c\x43\x37\x46\x7f\xec\x69\xc7\xc8\x56\xc6\x43\x0b\xb9\x63\xe2\x4f\xc2\x5a\xc8\x33\x5d\x79\xdd\x31\xab\x20\x17\xcd\xcc\x5d\x37\xb1\xdc\x96\x9a\x44\x5b\x4c\x95\x25\xa2\x90\x25\xa4\x7e\xa1\xd5\x6e\x11\xb5\x6a\x79\xb0\xef\xff\xfb\x58\x77\x5c\xd3\xde\x0c\x5d\x1b\xa9\xd8\x21\x32\xcd\x5a\x9d\x48\xd7\xaa\xad\x76\x53\x2c\x54\xdb\x81\x41\xa7\x1d\x87\x8a\xb9\x30\x5c\x6c\x0f\x91\xe3\x60\x77\xa8\xab\x43\x6d\x8a\x37\x7f\xfc\x08\x84\x8a\xf7\xeb\x47\xa0\xdc\xe9\xd5\x8f\x63\xd0\xc7\x76\x3b\x77\x3e\x81\x3b\x45\xbe\x84\x2c\xd0\xeb\x08\xdc\xeb\x5e\xa8\x66\xa4\x7e\xa0\xe7\x1e\xac\x47\xd5\x10\x6b\x1a\x56\x5c\x67\x28\x6f\x86\xa6\xad\x62\x7b\x28\x9b\xe6\xf4\xf2\x40\xdd\x50\xf1\x7a\x18\x60\xce\x70\x90\xa7\xe8\xce\xd0\x34\x86\xba\x7a\xcb\x68\xd3\xc2\x36\xfa\x18\xeb\x6e\x2c\xfc\xc0\xe8\x23\x25\x0f\x51\x71\xdb\xd8\x19\x56\x47\xd8\xf6\x06\x3a\xf8\x7d\x81\x0d\xe5\x26\x16\x02\xc3\x2d\x1b\x2f\x75\x73\xe1\xec\x9f\x0d\xc7\xc8\x19\xdf\x09\xea\x71\x08\xfa\xdc\x32\xed\x9d\x39\xee\x7d\xea\xbd\x60\xee\x95\xa5\x32\x33\x1d\xac\x0e\x91\x7b\xcb\xf8\x83\x32\xdf\xa1\x4a\x7b\xbb\xbc\x83\xe8\xe0\x48\xa4\xaa\x36\x76\x9c\xcb\xc3\xc7\xae\xad\x7a\x71\x67\x38\x33\xcd\xe9\xc2\x8a\xd1\xdb\xba\x46\x92\xdf\x0b\xe9\xf6\x8d\x80\x0f\x4e\x37\xf6\x80\x9d\x9f\xd0\x34\x6c\xc7\xeb\x7a\x00\x7f\xc7\x90\xbd\x58\xe3\x0d\xf2\x5c\xeb\x0d\x48\x82\xae\xf8\xda\x08\x6b\x37\x60\xec\x5e\x9d\x01\xe7\xc4\x01\xc9\x9b\xab\x6a\x34\xfe\xb0\xf4\x38\x9d\x4d\x9f\x0e\xf3\x6a\x47\xdd\x71\x87\xee\x7a\x68\x5d\x07\xb9\xeb\x69\x5a\x71\x7b\xe2\xb8\xdd\x0e\xa1\xe4\x72\x67\xf9\x60\xee\x57\xbb\x5d\xf7\x62\xf2\x26\xde\x64\xfa\x31\x72\x27\x6d\xc7\x59\x5c\xc3\xfc\xd1\x59\x31\x55\x7c\xe3\xba\xe0\x43\x0d\x2c\x64\xbb\xba\xa2\x5b\xc8\xb8\x18\xbc\xaf\x0d\x1d\x5a\x37\xae\x4d\x3e\x22\xda\xad\x14\x9c\x1f\x78\x33\x7e\x4f\x78\x71\xf0\xf9\x1d\xbf\x3b\x7c\x7f\x32\x77\x33\xb9\xff\xb9\x8b\x0f\x87\xa5\x9f\xa7\x0c\xc3\x98\x14\x8c\x4c\xdb\x1a\xce\xf5\xd1\x7e\xc1\x70\x81\x84\x50\xcf\xd8\x3c\xde\xbe\xde\xbb\x04\x39\xae\x72\xfa\xa3\xd3\xb5\x72\xa7\x52\x25\x74\xd5\xc7\x9c\x91\xb2\x62\xa7\xdc\x8e\x09\x3b\x42\xe9\x9e\x00\x79\x3f\xdd\x97\x21\x79\x77\xf1\xd9\x3f\x44\xe9\x96\xd4\xe8\x48\xd5\xf4\x1d\x32\xdb\xad\xb3\x1d\xfc\x7e\x33\xe6\x13\x20\xb1\x47\xab\x38\x66\xdf\xe3\x6a\x36\x36\x87\x11\x56\x7f\x0b\x7f\xe7\x41\xc4\x1b\xbb\x5f\xf7\xc5\xeb\xbc\x5f\xe4\xc5\xe6\x6d\xef\x01\x6e\xe1\xc5\x1f\x12\xb3\xef\x7e\xf9\x17\x9f\x9e\xc3\x7a\x31\x0e\x45\x21\x1f\x72\xb9\x73\xc0\x25\xec\x3b\x8a\xb9\x5c\x53\xca\x89\xed\x33\x9d\xe7\xfa\x2e\xe3\xd0\x15\xfc\xab\xb1\x98\x63\x5b\x57\xfe\xf3\xd7\x6f\x31\x46\xa1\xf5\x1d\xa3\x66\xc8\x71\x7f\x45\xc6\x06\xcf\xbc\xad\x98\x18\x23\x34\xdd\x3e\x3b\x24\xdb\xa9\xa6\xdb\x85\x5a\xf5\x02\x3f\x43\x34\x1a\x1d\xa9\x7b\x25\x3e\x11\x7a\x01\xc6\x81\xbb\x07\x60\xec\x78\xf5\x86\x1f\x89\x7f\x25\x6e\x61\xc4\x63\x3d\x06\x04\xa9\xdf\x96\xaa\xad\x10\x88\x99\x35\x72\xde\x67\x07\x5d\x4c\xe7\xa5\x8a\xf8\x09\xc3\x1f\xbf\xf8\xbb\x70\x55\x34\xc7\xdf\x0e\xcf\x88\xf6\xc6\xc2\xdf\xf6\x43\xfe\x20\x5a\xca\x18\xcf\xd1\x37\xe2\xeb\x1f\x44\x6d\x65\x60\xfb\x1b\xf1\xd5\xdb\x9c\x4b\x37\xa5\xdd\x7c\xed\x21\x1f\xe0\xfd\x72\x02\xf1\xb4\x71\x0f\x38\x5d\xab\x54\xa4\x6a\xfb\x02\x64\xbf\x03\x51\xab\x9e\x02\x20\x0a\x2d\xe2\xe5\xb0\xed\x76\x78\xe6\x78\x40\x5e\xc2\x98\x0f\xec\xef\x71\x7e\x48\xe8\x2a\x3f\x27\xb2\xac\xd6\xda\x21\x79\x12\xbd\x42\x3b\xff\x41\x56\x70\xff\xed\x04\xfd\x11\x4a\x88\x90\x5b\x98\xff\x04\xc4\x13\x40\xbd\x9c\xb4\x46\xad\x46\x99\xb0\x6c\x53\xc1\xea\xc2\x46\x33\x62\x86\x8c\xd1\x02\x8d\xb0\x27\x86\x98\xfb\x85\x41\x72\xaf\x2b\xda\x9e\xfc\x83\xae\x1e\xe9\x3f\xcc\xed\x39\x59\x7e\x68\xf6\x55\xf8\x44\x53\x6a\x77\x9a\xd5\x56\xe0\xd9\x2f\x04\x41\x10\x65\xb1\x9a\xeb\x88\x39\x89\xf0\xb8\xaf\x54\x3a\xbe\xbf\x6b\xb5\x9b\x85\x74\xdb\xeb\x21\xb6\x88\x7f\x0d\xff\x45\xb4\xa4\xb2\x94\x6e\x13\xff\x02\xbb\xbb\xf0\x6c\x5c\x35\xc4\xc7\xb8\xbb\x06\xfe\x69\xcc\x51\xe7\x98\x8b\xe3\xa9\x1e\xe3\x2f\x06\x86\x0f\x16\x3f\x1e\xdd\xc5\xe1\xaf\xbf\x10\x44\x5a\x6c\x49\x44\x2f\x2f\x55\x89\x7f\x81\xff\x80\xbf\x92\xff\x02\xff\xa1\xfe\xfa\xf7\xbf\x28\xef\x37\xf5\x1f\xea\x2f\xa2\xed\x37\x12\x52\xb9\x25\xed\x84\x22\x55\x33\xbf\x9d\x95\x4c\x8c\x38\xf0\xa0\x64\xae\x63\xf8\xde\x92\xf9\x7f\xf7\x48\xe6\x73\x4c\xdd\xcb\xe1\x23\x0e\xc7\x13\xc4\x31\x6c\x7f\x82\xe8\x51\x4c\x10\xad\x9d\xac\x88\x3f\x8f\x1e\xe0\xd5\x7f\xdc\x1e\xd4\x25\xe2\xcf\xa0\x45\xfc\x76\xce\x6a\x9f\x4a\x63\x18\x60\x88\xc4\x83\x19\xc7\xa7\xf0\xec\x12\xe8\x51\x2a\xcf\x01\x0d\x51\x7a\x62\x90\xa7\xe4\x1e\xb5\xec\x33\xb5\xe7\x96\x79\x0f\x53\x7b\x06\x68\x98\xda\xa0\x91\x5c\xa4\x76\x17\xb9\x54\xac\xa1\xc5\xcc\x1d\xba\x48\x9e\x61\xc7\x42\x0a\x26\xfe\x24\x5e\x5e\xfe\x38\x6d\x5d\xe9\xee\x78\x68\xea\x6a\xe0\x28\xed\x84\xd7\xe0\xfa\x77\xcf\xa2\x67\x60\xf1\xd8\xf3\x6d\x31\x98\x7c\xfb\x1c\xe9\x2a\x21\xeb\x23\xdd\x70\xbd\x85\x41\xb5\x53\x2e\xfb\xec\xa0\xf9\x6e\x19\x4f\x28\x63\x64\x23\xc5\xc5\x36\xb1\x44\xf6\x46\x37\x46\xa1\x6e\xc6\x62\xfe\xb1\xe4\x27\x74\xc3\xc5\x23\x6c\x87\xba\x68\x33\x34\x72\x08\x67\x8e\x66\xb3\xcf\x68\x5c\x73\x3e\xfb\x8c\xe4\x57\x8a\x65\x7f\xfb\xe8\xf9\x79\xda\xc3\x79\xc3\xbd\xe2\x08\xef\x76\x7c\x88\xc4\xc5\xeb\x4f\x02\xb1\xac\x99\xee\xed\xd9\x13\xae\x3e\xc7\x8e\x8b\xe6\x16\xb1\x9b\x33\xef\x96\xd8\x9a\x06\xfe\x4c\x68\x54\x56\x74\x58\x8f\xee\xd3\xa9\x78\x34\x7f\x24\x5f\x11\x50\xf7\x6a\x28\x36\xdb\xfe\x8a\x0e\x78\x0f\x0a\xd5\x74\x53\xf2\x96\x5f\xa9\xc1\xfe\x51\xb5\x46\x54\x0a\xd5\xae\x58\xee\x48\x1f\xf7\x62\xff\x78\x9f\x16\xd3\x79\x89\x00\xd7\x98\xb9\x5b\xec\x61\x40\x9f\x54\x71\xbf\xe9\x41\x18\x78\xed\x2e\xd1\xec\xd7\x97\x08\x8e\x5f\xbe\x7d\xb3\xf1\x48\x99\x21\xc7\xf9\x2d\x3c\x5d\xfe\x59\xc5\x19\xdd\x82\xcc\x6f\x17\x26\xca\xcf\x8d\x1f\xe6\xcc\xdf\xd1\xf9\xe0\xeb\xbc\x65\x1c\xf7\xea\xce\x93\x79\xb6\xbb\x62\xaa\xe7\xba\x03\xea\x7c\x77\x7f\xfb\xef\xcc\x00\x16\x5e\xb2\xb0\xf3\xdb\x0b\x4f\x52\xdb\x20\xcc\x1f\xa6\xb4\x97\x18\x21\x6a\xbd\xaa\x94\x21\x52\x83\x2b\x1c\xf9\x3b\x74\x97\x19\xfa\x80\x15\x6a\xfe\x5d\x57\xa3\x68\x3b\xec\xf9\x3c\xaa\x75\x7b\x38\x7b\xb5\x0b\xd9\xcc\x30\xca\xd3\x7f\xde\xe2\x8a\xea\xf9\xc5\x3b\xf8\xf8\x12\xa1\xcd\x9e\x1e\x9f\x6f\x52\xb1\x8b\xf4\x99\x43\x4c\x1c\xd3\x90\xa3\x95\xed\xb0\x51\xf6\xa8\x1c\xf6\x70\xf6\x72\x38\x9c\x5b\x47\xd0\x16\x38\x4c\x8e\x65\x85\xe7\xce\xb1\xcf\x0f\xdc\x8b\x25\xb0\x33\xea\x4d\xc4\x07\x1d\x07\x2f\x47\x86\x30\x1c\x27\x22\x5e\xff\x8f\xc3\xe4\x50\x60\x32\x17\xee\x31\x36\x85\xc7\xd8\x18\xb9\x57\x07\xf9\x7d\x17\x96\x1a\xbb\xef\x87\xea\xec\x6f\x43\xe7\xec\x9f\x78\x01\x9f\xd6\x03\x2e\x9a\x0d\x15\x53\x37\x9c\xf3\x3a\xa8\x61\x3c\xb4\x4c\x73\x76\xbe\xd5\x3b\xf9\xd4\x70\xd4\x5c\x7b\xcd\x36\x76\xb0\xbd\x8c\xea\xb2\x5b\x87\xba\xeb\xa1\xb7\x4c\xd2\xb7\x51\xbd\x2c\xdb\x74\x4d\xc5\x9c\x45\xf2\x15\x9e\xa3\x83\xb2\x60\xa4\x62\xdb\x5b\x5e\xf8\xcf\x9d\x85\xa2\x60\xc7\xd1\x16\xb3\x61\xa4\xa2\xec\x19\x47\xfa\x0c\xab\xd1\xbd\xa2\xcd\x2a\x62\xef\xfa\x51\x2b\x8b\x38\x0f\xb9\x12\xf3\xe2\x7b\x9b\xeb\xfe\xeb\x56\x96\x9f\x1b\xc6\x2e\xe2\xf8\x51\x61\xed\x26\x46\x1f\x0c\x73\x17\x71\x7d\x0e\x7b\xe7\xbb\x5f\x08\x83\x81\x93\x9d\xa7\xe9\xe6\xb5\x34\xe7\xb4\xaa\x2a\x22\x15\xda\xad\xfc\x15\x9f\x15\x2f\x02\x3e\x18\x00\xf7\x96\x6f\x2e\x6c\xe5\xa3\x4c\x23\x22\xf4\x1c\xdc\xc9\xcb\xcb\xb7\x6f\xd1\xa9\x58\xb4\x1d\xec\x0f\xd6\x1e\x15\xe7\xbe\x16\xf0\xd7\xa7\xae\x17\xf6\x2e\xf1\x9e\xe8\xe5\xd5\xc2\x44\xa2\x0d\x55\x22\x5e\xea\xb4\x2f\x8e\xbc\xd4\xc5\xcf\x83\xcf\x76\xf8\x5c\xd3\x79\xa5\xdf\x45\x74\x1f\xbd\x2e\x60\xf4\x48\xd2\x9d\xa1\x83\x67\x33\x6c\x13\xb2\x69\xce\x30\x32\x0e\x31\x49\x57\xf0\xd0\x38\x89\xbf\xfe\xb3\xd3\x98\x7c\xac\x26\x1a\x86\xa2\xf5\x49\x3d\x53\xb8\x31\x70\x4c\x7f\xb6\xf2\xd3\xa3\x7a\xe8\xd5\x06\x13\xe9\xbc\x94\x2e\x11\xbf\xfe\x1a\x94\xe0\xbf\x09\xf2\xb7\xdf\xae\x81\x3a\x37\xfc\x20\xb4\xff\xf7\x49\x8e\x31\xe0\x9d\xc8\x34\x04\x3e\x24\x70\x8f\xc0\x8b\xa6\x74\xfe\x84\xfb\x09\xc6\x75\xbe\x66\x21\x66\x24\x8d\xe3\xc2\x1e\x89\xa5\xd7\xea\x03\x9e\x13\x4d\xaf\x60\xf9\x51\xf1\xf4\x46\x66\x1f\x8c\xa8\x57\xb0\x7d\x8e\xa9\x51\x03\x2e\x44\xd5\x93\x9a\x90\x27\xea\xea\x41\x3f\x83\x24\xc5\x4e\xa2\xf6\xbe\xff\x4a\x6a\x16\x37\xf0\x5e\x8e\xa1\x67\xfb\x1e\x51\x9f\xb5\x97\x5d\x16\x10\x9d\x46\x44\x25\x68\x7f\x4b\x8a\xe5\xae\x87\xd8\x58\xe2\x99\x69\xe1\x73\xdb\x96\xee\x7a\x97\xf0\x2c\x66\x6e\x44\xe3\x1c\xbb\x28\xa2\x69\x97\x6a\x45\x35\x3b\xfa\xc8\x40\xee\xc2\xc6\xe7\x76\xd8\x04\xf8\xdb\x7f\xfe\x3a\xae\x5d\xfe\xfb\x7f\xe7\x56\x2f\xff\xf9\x2b\x2c\x73\x3c\x37\x23\x36\xc3\x8e\xb0\x0c\xd3\xc0\x17\xd7\x42\x47\x58\x9f\xc1\xec\x39\xd3\xe7\x78\x28\x9b\x0b\x43\xf5\x76\xac\x79\x1b\x19\x23\x1c\xce\xc6\x4e\x43\xeb\x4e\x12\x3b\x68\x23\xac\x5e\x4f\xb7\xf6\x7b\x7f\xba\x7a\xb0\xb6\x43\x09\x57\x1c\x17\xe1\x9b\x9b\x57\x2f\x77\xa5\x3a\xac\x25\xb5\x2f\xec\x93\x06\x77\xa4\x82\xbb\xa4\xb7\xe5\x11\xcf\x63\x22\x66\xf1\xdc\x45\xa6\x2e\xe6\x1f\x71\x98\x8c\x8c\xb4\x4f\x63\x33\x76\xfd\xe1\x45\x46\xaf\x84\x85\xf3\xac\x66\x90\x8b\x08\xcd\xb4\xaf\x9c\x16\x11\x19\xb1\x2d\x5e\x61\xaf\x50\x6d\x49\xcd\x36\x51\xa8\xb6\x6b\x27\x27\x46\x5e\x14\x6d\x11\xbf\x82\x57\xe2\x85\x7c\x79\x25\xc0\x2b\x41\xbf\x12\x2f\x2f\xd1\x54\x5c\x3a\xa8\xb9\x95\x92\xf0\x61\xcd\x81\x9a\x17\x30\xd4\x0d\xdd\xd5\xd1\x6c\xe8\x17\xce\xfc\xee\xbc\xcf\x5e\x5e\x89\x17\x8a\x04\xc2\x57\x12\x7e\x25\x69\x02\xf0\xdf\x28\xfe\x1b\xc3\xfd\x4e\xd2\x14\x23\xc0\x04\x49\xed\x88\x8e\x05\x9d\x1a\xfa\x2f\x44\x9c\x4c\x84\xbc\x19\xba\xa6\xae\x5e\xc6\x24\x40\x96\xbb\x05\x13\x3d\x5c\x38\xf8\x23\x30\x0d\x75\xe3\xd3\x4b\x18\x17\xf1\x31\x0c\xc9\xf0\xb7\xe0\x63\x86\x48\x55\x87\xe1\xad\xac\x8b\x38\x58\x86\xa5\xa9\x5b\x70\xb0\x43\x3f\x0c\x1e\x16\xe4\xde\x11\xe8\x45\x14\x90\x26\xa9\x9b\xd8\x80\x07\x14\x7b\xa7\x17\x03\x05\xcf\x00\xf6\x16\x14\xdc\x70\x6e\xaa\xba\xb6\x89\xcf\x05\x0f\x20\x75\x13\x0a\xfe\x84\x8b\x7d\xe5\x73\x0c\x3c\x1c\x03\xe9\xdb\xf0\xec\x26\x1d\x8d\x46\x36\x1e\x21\xd7\xb4\x2f\xeb\x94\x40\x02\x52\xb8\x05\xbc\xe0\x81\xf7\xb7\x39\x87\x6b\xd5\xbe\x0c\x9d\xe2\xc0\x4d\x53\x0d\x48\x0f\xfc\x7e\x16\xbc\xe4\xf6\x32\x02\x56\xe0\x6e\x92\x0e\x00\x41\x04\x1f\xd9\xd2\xce\x01\x5c\x46\x24\x40\xe1\x36\x4e\xa8\x93\x89\xde\xe7\xa7\xfe\xbb\xb6\x97\x30\x01\x92\x63\x99\x9b\x66\x04\xd0\x3e\x3b\x1f\x59\xfd\xc5\x19\x07\x80\xe2\xe0\x6d\x9c\x30\x43\x4d\x5f\x1f\xde\x3b\x30\xe7\xb3\xa1\xa6\xe3\xd9\x45\xd7\x08\x00\x0b\xc0\x4d\x4e\x18\xb0\x87\xe3\x96\xc3\x36\xf8\xfa\x0a\x1b\x90\xbb\xcd\xcd\x03\x38\xd4\x8d\x11\x76\xdc\xe1\xe7\x8d\xf6\x2b\xa8\x38\x81\xbf\x6d\x46\xb8\x93\x08\xef\x9d\x68\xa0\xcb\xc1\x04\x50\x24\x49\x33\x7b\x24\x11\xb1\xf6\xe2\xf1\xfc\xad\xc1\xf6\xd3\x11\x7d\x30\xf6\xe7\xd2\x14\xdd\xc8\x52\xf9\x8e\xc4\x52\x62\xa5\xdf\xc9\x76\xf2\xb4\x38\x28\x8a\xfd\x7e\xae\xdf\xef\x52\xdd\x7c\x7f\x30\x68\x42\x69\xd0\x97\xda\xf5\x52\xa6\xff\xd6\x12\x7b\x90\xeb\xd7\x98\xb0\x84\x22\x91\x50\x3b\x24\xa9\x7e\xae\x51\xec\x75\xcb\xbd\xda\x20\x9f\x2d\x77\xdb\xa5\x5e\x97\xcd\xe6\xf2\x22\x5d\xae\x0e\x06\x54\xb1\x51\xaa\x70\x35\xb1\x28\x76\xa4\x46\xb6\x03\xcb\xf5\x74\x4b\xca\x76\xfb\xb5\x6a\x6c\x24\xb4\xc7\x49\xbf\x94\x83\xcd\x2a\x53\xab\x16\xa4\x7a\xba\x52\xcd\xa6\x38\x9a\x12\x19\x1a\xbe\xb1\xf5\x6a\xa6\xd5\x2c\xe7\x7a\x25\x2e\x97\x2a\xa7\x2b\x8d\x72\x21\x5b\x63\x5a\x9c\x34\xe8\x75\x3b\xb1\x91\x30\x1e\x27\xcd\xfa\x20\x5f\x28\x53\xe9\x02\x9d\xad\x36\x98\x54\xbf\x9c\xad\x54\x33\xe5\x6c\xb1\x53\xad\x77\xa8\xfc\x80\x7e\xab\x64\x5b\xf9\x5a\xb5\x93\x96\x6a\x62\xab\xc7\x35\xd2\x5c\xad\x4f\xe5\x5f\xee\x2d\x27\xd9\xad\x2e\xaf\xcc\xf5\xbe\x04\xef\x58\x3d\xfb\xbb\x83\x2f\x97\x5a\xbc\x12\xcc\x2b\xe1\xda\x0b\x1c\x43\x03\x3f\x17\x51\xdc\xad\x7f\x7e\xf2\x13\xd4\x3e\xc5\xc6\xaa\xee\x0e\xd1\xcc\x1a\x23\x63\x31\x67\x76\x36\xd3\x69\x65\x5e\x1e\x54\xcc\x7b\xca\x06\x9e\x22\xe7\x93\x54\xcd\x5b\x54\xc7\x93\xf2\xb9\xaa\x81\x7b\xc5\x7c\xa8\x1c\x08\xc8\x99\x66\x68\x56\xe0\x18\x8a\x81\xac\x47\x14\xb5\x53\xe5\xff\x7e\x71\xed\xc5\x6e\xc8\x97\x6f\xc4\x97\x7b\x2d\xf4\xcb\x2b\xf1\xe5\x58\xcb\xb2\x83\xd4\x69\x65\x8e\x0f\xdd\x8d\xe5\x3d\x0c\xcf\xf3\xb1\x87\x5f\xd3\xe2\x91\x70\xe7\x84\x7f\xf9\xbf\x28\x0b\x3e\x27\x09\x92\x84\x0c\xc7\xb1\x00\x0a\xbe\x24\xe8\x7f\xaa\x24\x28\x96\x83\x02\x4f\x72\x3c\x47\x47\x49\xe2\x4e\x87\xfa\x3f\x25\x09\xea\x95\xa0\x00\xc3\x31\x3c\x43\xb2\x1c\xe7\x4b\x82\xf4\x24\x31\xd3\xe7\xba\xbb\x23\x82\x21\x49\xf2\x77\xd2\xbf\xfe\xa7\x78\xdb\x4d\x2c\xb7\x5b\xd2\x70\x34\xc5\x83\xb3\xbc\x09\x14\x45\xd3\x1c\x45\xd2\x90\x67\x7f\xdf\x19\x06\x4f\x72\xff\x53\x3c\xee\xd8\xa2\x78\x9e\x11\x48\x56\xe0\x7d\xef\x06\x3d\x16\xd1\xc2\x1d\x0f\x6d\xfc\xbe\xd0\x6d\xac\x0e\xb5\x19\x1a\x7d\xf9\xe6\x79\xe3\xdb\x41\x03\x92\xdc\x8b\xef\x04\xf4\xd2\x54\x76\x39\xdd\xbd\xb0\x79\x96\x17\x04\x9a\x87\xbc\xef\x89\xfc\x89\x71\x5c\x64\xbb\xba\x31\x1a\xca\x68\x86\x0c\xc5\x13\x34\x08\xea\x5f\x6c\x0c\xcc\x29\x06\xca\xdf\xdf\xf9\xef\x17\x3f\x3d\xf9\x04\xf7\xd3\xf4\x1a\xc8\xd5\x97\xf8\xa6\x89\x08\xe2\xdb\xe9\x9e\xcf\xd2\x0a\xeb\xa3\xf1\x0e\x21\x78\x25\xbe\xf8\x51\x6c\x38\xc5\x9b\x1f\x66\x02\x1e\x55\x0c\xc5\xed\xb5\xe3\x7b\xc9\x79\x8f\xe1\xbb\xcb\x39\xc4\x51\x4c\x39\xdf\xe9\xc9\x6f\x71\xa3\x3e\x55\x90\xdf\x9b\xca\x77\x93\xb3\x8f\xe1\xbb\xcb\x39\xc4\x51\x3c\x39\xdf\xbb\x76\xf8\xbf\x18\xb9\xe0\xb9\x8a\xca\x7b\xd7\x88\x87\xaa\xca\x03\xb3\xc2\x2b\xf1\x82\x29\x1e\xd2\x02\x45\x93\x32\xcb\xf0\x9a\xa0\x22\xc8\x41\x92\x46\xbc\x00\x21\x2b\x43\xa0\xc9\x14\xad\xb1\x34\x09\x04\x8e\x41\x2c\x2f\x2b\x2c\xa9\x21\x85\x53\x11\x42\x34\x27\x23\x9a\xf2\xf2\x5d\x8d\x62\x59\x8d\x64\x58\x16\x68\x10\x69\x18\x23\x0a\x20\x52\xe0\x18\x1a\xd0\x34\x49\x6b\x10\x42\x46\x26\x55\x86\x43\x00\xd0\xac\xca\xd2\x58\x51\x14\x88\x00\x2b\xb3\x24\x4d\x6b\xf4\x8b\xa7\x37\x64\x28\x73\x86\xdf\x68\xf6\x1b\x0b\xc3\x09\xb5\xff\x98\xfa\x9d\x61\x69\xc8\x83\xab\xad\x34\x0f\x59\x86\x23\x59\x08\x99\x57\x02\xc0\xdd\x7c\x7e\xba\xfc\x87\xde\xff\x81\xf6\x8f\x9f\xaf\x04\xd8\x65\x2d\xa2\x28\x8a\xe9\x0d\x3f\xeb\xaf\x9a\xdd\x3c\x65\x27\xa0\x9e\x1b\xcd\xc8\x4a\xbb\x92\x11\xe6\x6f\xe5\x4c\x07\x8f\x25\x00\xda\x5c\x65\xfd\x9e\x95\x3b\x99\xfa\x56\x9c\x1b\xea\x36\x83\x4a\x9b\xda\xc2\x6a\xb4\x39\x48\xe7\x40\xbb\xdd\x02\x34\x50\xdd\x55\x75\xa1\x4b\xad\x56\x4f\x42\x5c\x4a\xaa\xf6\x94\x1d\x68\xb1\x5f\xef\x56\x64\xf1\x78\xd1\x5b\x61\x3c\x17\x5b\x56\x59\x70\xc5\xee\x7a\xea\xae\x33\x74\xbf\x55\xb3\x68\xdd\x5d\xb7\x96\xd2\xbc\x02\xc5\xce\x74\x95\x6a\x31\x52\x73\x2e\x14\xe4\x05\x3d\x19\xf5\x97\x0b\xbd\xdd\xc8\xae\x53\x58\xe0\x66\x95\x91\xde\x96\xab\xdd\x84\x5d\xe9\x6b\x52\x2e\xe1\x8a\xdd\xa9\x94\x1e\x35\x76\x90\xa7\x55\xa6\x8c\xb6\x16\xd5\x08\x60\xab\x9b\xe2\x99\xeb\x4d\xec\x03\xa6\x21\x8a\x19\xb2\x78\xae\xf9\xa7\xbe\xf6\x5a\x15\x61\xf8\x61\x5b\xe0\x9f\xa3\xc7\x2f\x90\x14\x54\x41\x15\x38\x19\x20\x5e\x26\x29\x15\xcb\xbc\xca\x62\xcc\xf2\x34\x50\x05\x85\x57\x48\x06\x91\x24\x2f\x20\xa0\xa9\x34\x83\x35\x56\xd1\x54\x2c\x28\x90\x64\x54\x41\xc3\x1c\x60\xfd\xfc\x11\x9c\x55\x6b\x36\x52\xdb\x21\x10\x04\xe6\x6a\xab\x9f\x10\xd2\x3c\x0d\xf9\x67\xd8\x02\x95\x56\x8d\x37\xbc\x7e\x2f\x8b\x2e\x64\x00\x66\x07\x15\xd5\x28\xac\x24\x53\xd4\x51\x5e\xa8\xd6\x04\x25\x89\x8d\x5c\xaa\x6a\x24\x94\x6e\xcd\xe2\xf3\x53\x69\x59\x49\x4c\x13\x89\x39\x1a\x64\xa8\x56\x7e\x5e\x7b\x1f\x27\xc6\x1c\x37\xd8\xd4\xb9\xb1\xca\x5a\x0a\x2b\xab\x99\xc5\x7a\xe4\xcd\xdd\xce\x16\xd0\xea\x38\x97\x80\x73\x37\x6e\xad\x94\x5a\x8f\x16\xfc\x06\x9b\x6c\x3f\x89\xa6\x9b\x81\xb1\x19\xcc\x36\x76\x47\xe6\x46\xc5\x9e\x94\xd8\x6a\xe9\x51\x9a\x4a\xdf\x68\x0b\xa3\x7f\x8a\x2d\x80\xf8\xb6\xc0\x3d\x47\x8f\x5f\x58\x8d\x66\x00\x56\x55\x4d\x26\x35\x0a\x31\x90\x06\x1c\xa2\x05\x41\x46\x32\x84\x32\x49\x63\x05\x73\x3c\xc9\x53\xbc\x00\x38\x00\xb1\xa0\x92\x98\x65\x69\x0a\x01\x8a\x66\x14\x99\x24\x95\x4b\xb6\x10\xad\xed\x1c\x27\x90\xd1\x96\x72\x68\xdd\x6f\x09\x00\x92\xa3\x2e\xd8\x82\x10\xd3\x14\x00\x4f\xe6\x5d\x9a\xcb\x6c\xac\x5c\xa5\x6f\xb2\x73\xe8\xce\x9d\x0c\x57\xc3\xe2\xc8\x9c\xf6\xb3\x0b\xa3\xc1\x76\x2b\xef\xd2\xa4\x5d\x16\x2b\xc9\x94\xdb\x93\x79\x91\x5d\x4f\xc8\x36\x83\xb7\x69\xcd\x5c\x2f\x61\x43\xd2\xdf\x18\xc9\x58\xe7\xeb\x1b\xbd\x53\x5f\x5a\xef\x8b\x9c\x51\x9e\x7a\x53\xe7\x99\xc2\xe8\x38\x95\x54\x96\x5c\xf7\xb8\x12\x9c\x55\x07\x76\xbf\xb9\x5d\x70\x2a\x9b\xdf\xa4\x3a\x46\x7d\xb6\x98\x57\xb3\x0d\xdd\xaa\xa6\x56\xad\x46\x55\x5c\x83\x82\xd9\x76\x8a\xf9\xde\xdb\xb2\xb2\x59\xbc\x8f\x58\x71\x2a\x34\xf4\x2e\xa8\x83\xde\xa2\x29\x5b\x56\x91\xe1\x95\xb7\x5c\xed\x2d\xc3\xb6\x29\xd6\x83\xaf\x9c\x31\x85\x9a\x74\x4e\x9d\xfe\x39\xa6\x00\x9f\xa3\xc6\x2f\x80\x47\xcc\xee\xb9\xc6\x92\x80\xa4\x54\x46\xc5\x98\x95\x49\x01\x51\x94\xc6\xb2\x0c\x8f\x21\x4b\xb3\x94\xc2\x61\x0e\xd1\x8c\xc2\x6b\x18\x6a\xb4\xc0\xb1\x00\xf3\x1a\x60\x38\x05\xc2\x4b\xa6\x40\x47\x2a\xbb\x40\x41\x18\xbd\x44\x3a\xb4\xee\xf7\x84\x68\x8e\x83\x17\x4c\x81\x8f\x69\x0a\x6b\x7d\x9a\x99\xf5\x81\xd8\x28\x77\xe8\x45\x6f\x35\xd7\xcb\xa0\x5b\x60\x67\xd5\xd6\x3a\x81\x27\xed\x42\x72\xce\xb3\x6a\x13\xd6\xb3\xf9\xf5\x7c\xd1\xdf\x56\x37\xdb\x3c\x8f\xc7\x56\x87\x5a\xb7\xaa\xed\xc4\x7b\x2f\xb1\x4d\x8d\x9b\x70\x59\x4b\x73\xd3\xf7\x91\x35\x9a\xbf\xf7\x6d\x92\xa2\xfd\x50\xe0\x99\x42\x40\x3b\xb3\x16\xa5\x2d\xa7\x95\x1a\x57\xeb\x25\x8a\xef\x60\x9b\x1d\x2c\x37\x05\x8b\xb4\xaa\xb0\x54\x81\x19\xec\x56\xe6\xeb\xda\xe4\xad\x5b\x4b\x97\xd4\xe4\xa8\x53\x5b\x15\x16\xe3\x46\x67\xde\xb1\xdf\x4b\x6d\x59\xea\xea\x39\x68\xf1\xb2\x30\x95\x53\x22\xb7\xed\xe5\xa5\x69\xbe\xba\xcc\x4c\xf3\x1e\xe4\xc1\x19\x53\xa8\x8c\xce\xa9\xd3\x3f\xc7\x14\xd8\xe7\xa8\xf1\x0b\x29\x6b\x34\xa2\x48\x12\xd3\x0a\xe4\x78\x52\x55\xa0\xc0\x0a\x48\x80\x3c\x84\xb4\x06\x76\xc1\x86\x57\x64\x84\xa0\x22\xc8\xb4\xaa\x70\x2c\x52\x54\x85\xe3\x21\x52\x21\x2d\xd0\x2c\xc7\x5f\x32\x05\x2a\x4a\xd9\x59\x92\xe5\x21\x7f\xb1\x55\x78\x39\x6c\x0a\xd2\x90\xe1\xc9\x0b\xa6\xc0\xc5\x34\x85\xd5\x72\x6b\x8e\x32\x93\xb5\x31\xaa\xae\xad\x1e\x9a\x99\x6f\x13\x7e\xe0\xa4\x27\xe5\xf7\xf9\x46\xae\x2b\x2a\xda\x2a\x38\x67\xf7\x6a\xed\x2e\xa3\xb5\xcd\xa9\x59\x31\xf2\x2a\x35\x97\xdb\x13\x23\x21\x59\x93\x12\x90\x40\x75\xbc\x11\x60\x3b\x25\xb4\xed\x05\x69\x09\x54\xbb\x41\x67\x0a\xde\xd4\x79\xa6\x10\x98\xca\xf5\xac\xb8\xd8\xf4\x74\x4c\xaa\xa0\xbc\xed\xa4\x9b\xa0\xc4\x94\x33\xd4\x28\x41\x96\x16\x62\x7e\x29\x17\x13\xad\xd1\x3c\x97\xdf\x8c\x16\xe5\x6e\xa3\x25\x0c\xe8\xb5\xda\xc6\x5b\x7e\xa9\xe5\xa1\x64\x5a\x80\xcd\x65\x9d\x77\xde\x04\xa5\x6d\xd2\xb4\x8b\x53\x24\x67\xde\x35\xac\xae\x3c\xed\xef\x9c\x31\x85\x12\x7f\x4e\x9d\xfe\x39\xa6\xc0\x3c\x47\x8d\x5f\x58\x86\xe3\xb1\x42\x31\x3c\xa7\x91\x1a\xa0\x78\x5e\x56\x49\xc8\xf3\x2c\xc9\xb1\x80\xe7\x00\xe4\x55\xcc\x2b\x18\x21\x4a\xd6\x18\x61\x97\x8d\xb3\x32\xa9\xaa\x00\x6a\x2a\x60\x15\x5e\xa5\x2f\x99\x42\xa4\xdf\x67\x29\x9a\xa6\xa3\x0d\xe5\xd0\xea\xef\x21\x43\x01\xf0\x97\x12\x67\x18\x77\x81\xd4\x64\xb8\x74\x2b\xcf\xd7\x25\x53\x17\x52\xe6\xb8\xa1\x36\xc7\x6b\x54\x85\x15\xf8\x5e\x4a\xb6\xe4\x81\xd6\x5b\xd1\x4d\x59\xc8\x2a\x93\x36\x43\xad\x37\xad\xfe\x56\xea\xa7\xd7\xd5\x04\xbf\xca\x92\xdd\x2e\xa9\x4e\xa6\x25\x4b\xd8\x26\xab\xb0\xb9\xc5\x63\x7e\x40\xaf\x07\x94\xd3\x38\xe6\x0a\x6f\x81\x5c\xa1\x5c\x2e\xd5\xe5\x8a\x39\xc9\x27\x9a\xcd\x44\xbb\x95\xca\x94\x72\xa9\xa4\xbb\xd0\xf2\xd4\xbc\x0c\x28\x45\x49\xe7\x6d\x50\x34\x28\x6e\x53\xcf\xf4\x67\x94\xfa\x56\xaf\xeb\xb5\xb7\x25\x6e\xa8\xa9\x66\xc6\x32\x17\x74\x4e\xac\x4c\x60\x39\x0d\x67\x4e\x53\x58\x25\x9d\x06\x39\x6e\x28\x39\x0f\x55\xe3\x8c\x29\x14\x07\xe7\xd4\xe9\x9f\x63\x0a\xf4\x73\xd4\xf8\x05\xca\x08\x2b\xbc\x4a\x71\x32\xa7\xa8\x50\x53\x59\xa0\xb1\x94\x4a\x09\x80\xe3\x90\xcc\x91\x02\x40\xaa\x4a\x41\x5a\x43\x0c\xa3\x42\x48\x41\xa8\x69\xb2\xc0\x32\x98\xc4\xb2\x06\x38\xec\x39\x6f\xef\xdf\x19\xad\x26\x23\x95\x9d\xe6\x29\x3e\x32\x57\xf8\x68\xdd\x1f\x35\x00\x9e\xbf\x94\x37\xb3\x71\xd3\xe6\xc5\x62\x53\x2d\x72\x5a\x55\x16\x3a\x5a\xc7\x2d\x35\x55\xe8\xae\xa6\x88\x6e\x0d\x92\x96\x04\xe6\xc5\x79\x92\x9b\x75\x98\xda\x72\xad\x59\xe3\x5e\x46\x20\xcb\xd5\x52\x57\xa2\xb8\x55\xce\xe8\x8f\x8c\x39\x3f\xab\x2c\x6b\x79\x2d\x53\xc6\xdb\x44\x39\x03\x67\x78\xea\x8c\x9b\xa8\xe2\x4f\x9d\x67\x0a\x81\x65\x4a\x7b\xb6\x9c\xa4\x7a\x98\xab\xe8\x46\x53\x30\xb8\x8e\xe9\xa0\x49\xba\xb4\xee\x58\xa3\x46\x25\x95\x92\xc7\xf3\x2c\x94\xf3\xe2\xb2\x9e\xcf\x75\x93\x29\x50\x68\x91\x30\x93\x20\x95\x91\x5a\x37\x0b\xb4\xd0\x72\x4c\xd3\xec\xf4\x38\x73\xb1\x98\x90\x9c\x33\x53\xca\xc9\x55\x21\xdb\x2f\x7b\xa6\x56\x39\x63\x0a\x79\xf2\x9c\x3a\xfd\x8f\x9b\x02\x15\xdf\x14\xa8\xe7\xa8\xf1\x0b\xa4\x55\x81\xd7\x58\x1a\x62\x0c\x79\x15\xc8\x14\x27\xb3\x32\x2f\x68\x14\x8d\x34\x96\x06\x40\xe6\x58\x28\x20\x8a\xd1\x90\x06\x18\x92\x46\x2a\x29\xb3\x94\x0c\x69\x5a\x26\x39\x19\x0b\x3b\x18\xb4\xbf\x4f\xfe\x49\xab\x19\x21\x52\xd9\x59\x92\x87\xd1\xa6\xb0\x6b\xdd\xad\xde\xfc\xc3\x1e\x86\x15\x2e\x65\xcd\x74\x5c\x4b\xa8\xbf\x4d\x40\x75\xc1\x9a\xa4\x5c\xe4\x7a\x8c\xb1\xa9\x2d\x3b\xeb\x1c\xdd\xb5\xcc\x69\x62\x99\x15\x6b\x6e\x1a\x94\xa8\x0a\x97\xe2\xe0\x5b\x87\x33\xea\x35\xb3\xc0\xb5\x74\x3b\x2f\xd5\x40\x0b\x41\xae\xb7\x98\xaf\x4a\x0d\x48\xd5\xad\x46\x6e\xb6\x2c\x2e\x37\x9b\x06\xdf\xc8\x49\xbe\x3f\xf6\x2c\xc1\x53\xce\xc2\xc7\x7f\xa2\x77\xef\x1c\xef\x57\x62\xbd\xe1\x27\xd9\xe2\x04\x26\xac\x04\x2a\x70\xc5\xa5\xdc\xd2\xf2\xba\x83\x3a\x1d\xb1\x3f\xde\x2a\xb9\x44\x92\x1a\xf4\x8a\x12\x25\x1b\x1a\xb3\x5d\x74\x79\x9d\x99\x08\xcb\xce\xb4\x36\x65\x55\x57\x5b\x1b\xb9\x5e\x52\x56\x52\xb0\x92\x4f\xbb\x99\xfa\x26\xe9\xf6\xd2\x45\x71\x94\x1e\xe7\xcb\x6f\xcd\x29\xf0\xf1\x9f\xb1\x14\xc9\x39\xa7\x6d\xff\xe3\x96\x42\xc7\xb7\x14\xf0\x1c\x2d\xf7\xde\x16\x39\x1c\x1d\x00\x81\x23\xbf\x92\xe0\x2b\x09\x08\x92\xfc\xe6\xfd\x8b\xd4\x66\x1e\xb0\x42\xb4\x25\xf0\x60\xa7\xe9\x0c\x25\x30\x02\xe4\x28\xe1\x52\x52\x7c\x5e\xcf\x7d\x82\xfe\xee\x29\x89\xbe\x52\xfd\x92\xce\x6c\x92\x9b\x56\x29\xc5\x65\x8c\x8c\x90\xa7\xc8\xf5\x24\x95\x70\xc8\x91\xeb\xac\x0a\xab\x2d\xe8\xab\xad\xde\x00\xa5\x8a\x28\xeb\x05\x13\xe9\x8c\x0a\x9f\xbf\x0e\x2a\x2c\x8a\xa9\xe9\x0f\x60\xe4\xa9\xd7\xf1\xbc\xe0\xca\x91\x5c\x8c\xaf\x31\xdc\x7b\x42\x17\xf1\x92\x4d\x64\x51\x57\x84\xbd\x5d\x01\x43\x85\xc0\x50\xf7\x81\xa1\xc3\x85\x55\xf7\x81\x61\x42\x60\xee\xa4\x86\x0d\x17\x37\xdd\x07\x06\x86\xc0\xd0\xf7\x81\xe1\x42\x05\x46\x77\x32\xc5\x87\x6a\x79\xee\xa4\x46\x08\x97\xcb\xdc\x07\x06\x90\xe1\xda\x98\x3b\xe1\x84\xaa\x46\x98\x3b\xc1\x50\xa1\x72\x9a\x3b\xc1\x84\x6a\x2b\xee\xa5\x26\x54\x12\x72\xe7\x54\x01\x36\x54\xf1\x70\x27\x18\x78\x0a\x86\x79\xce\x87\x56\x9e\x52\x2f\x7b\xf9\x2d\x40\x3f\xda\xc6\x2b\xa0\x8d\xf8\xde\xc8\xc3\xde\x37\xe0\xe3\x82\x7e\xf2\x78\xc3\x78\x39\x32\x77\xac\x9d\xc4\xf8\xa1\xca\xa6\x57\xe2\x69\xc5\xa8\x0b\x77\x6c\xda\xfa\x76\x47\x8f\xf7\x0d\xca\x9f\xa2\xac\xef\x3b\xbc\x72\x70\x6e\xb2\x82\x61\xe4\x78\xc3\xff\x4f\x4c\xd6\x4e\xe3\xff\x41\x73\x75\x12\x64\x8f\x37\xd4\xf7\x9d\xab\x47\x6a\x9b\xff\xc1\x73\x75\xb2\x92\xf9\xb8\x81\x81\xe2\xd8\xc8\xb2\xe9\x9f\xcc\xe0\x7e\x8a\x19\x7b\xf2\x7b\x51\x67\x66\xec\xb4\x00\xfc\xe3\x86\x3c\x37\x63\x51\xc5\xe0\x3f\x99\xf9\xfd\x14\x33\xf7\xe4\x97\xcd\xce\xcd\xdc\xc9\x3a\xfd\xe3\xc6\x5f\x70\xb0\x7e\x75\x2d\x76\xbd\xea\x73\xe7\xcb\x37\xe2\x3f\xe0\xaf\x57\xe2\xf8\x64\xe8\x3d\x3b\xad\x82\xff\xf2\xd7\x8f\xf2\x13\xa7\xb9\xc1\xc7\x0d\x19\x45\x3b\x75\x81\xf6\x7d\x99\xfd\x8f\x23\x3e\x98\x49\x7c\xfc\xe6\x03\x45\xcd\xda\xc2\x50\xf7\x4a\x74\xe7\xeb\x80\x9e\x42\xfa\x2f\xe5\x3d\x6a\x55\x31\x2a\xac\x1f\x7c\x6f\xf1\x16\xb1\xed\x53\x9e\x8f\xdf\xcc\xf7\x15\xdb\xfd\x5e\xe4\x27\x13\x9b\x9f\x9b\x7d\xfc\x26\xbf\xab\xd8\x1e\x08\x9b\xdf\x5f\x6c\x57\x12\xbd\x33\x5f\x41\x8c\x93\xe4\x5d\x87\x7a\xfd\x83\x70\xf7\x26\x93\x91\x1f\x92\x39\xbb\x99\xc7\x44\x67\xfa\x57\x01\x51\xe1\xcc\xf4\x5e\x40\x74\x38\x6b\xba\x17\x10\x13\x02\x74\x37\x6b\x6c\x38\x37\xb8\x17\x10\x0c\x01\x8a\xda\x9d\xb9\x0a\x28\xbc\x02\xbe\x9b\x35\x3e\xb4\x30\xbb\x9b\x22\x21\xbc\x4e\xb8\x17\xd0\xe9\xf6\x1e\xf9\x08\x24\x70\x1a\x43\xa3\xb6\xd4\xae\x03\xa2\x42\xc1\xf8\x6e\x40\xf4\x69\x78\xba\x9f\x22\xe6\x14\xd0\xdd\xd3\x76\xb2\xd1\x47\x3e\x42\x11\x3c\x05\x44\x3d\xeb\x3b\x90\x4f\xd9\xec\xbb\xf6\x25\xac\x5b\xb6\xfb\x22\x3f\x84\xf8\x04\x1f\x1d\xfc\x8a\x93\x82\x05\x4d\x01\x80\x15\x14\x8a\x45\xaa\x02\x29\x45\x80\x3c\xe4\x04\x4a\x51\x19\xa0\x91\x50\x20\x79\x8a\x27\x65\x5e\x10\x38\x66\xe7\x06\x78\x16\xaa\x32\x4d\xcb\x48\xc3\x1c\xab\xe2\x97\x57\xc2\x5f\x37\xde\xbf\x6c\x0d\x1c\xb4\x73\x87\x23\xc6\xc8\xb7\x3b\x28\x70\xa1\x1a\xfe\xd0\x7a\x12\x21\xfc\xb3\xc9\x72\x8f\xc9\x92\x78\x5c\x83\xe2\x46\x48\x93\x75\x27\x27\x8d\x96\x0a\xe0\x00\xe8\x08\xfc\x60\xc2\xcc\xcb\xd3\xb9\xd0\xe0\xd8\x69\x9a\x5e\x8a\xde\xd9\x9e\x78\x38\x39\xcf\x86\x8e\xce\x52\xc7\x9f\xfe\xbb\x4c\xf2\x7c\x34\x07\x5d\x4a\x1d\xb1\x5d\x30\x7f\x07\x78\x56\x51\x72\xc0\x5d\x4f\x5a\x83\xd2\x9b\xb0\x92\x46\x66\x2b\x85\x70\x8f\xef\xe8\x59\xef\x55\x8b\x54\xb7\x5b\xfd\x5c\x68\xae\xcd\x1b\x65\xcc\x7b\xe0\x5b\x48\xcb\x5b\xc9\xad\x05\x80\x9b\xe5\x41\xa5\xb9\x94\x45\x63\x2d\x8c\x1a\xd5\x76\x5f\x2d\xf7\x98\xcc\xdc\x2c\x98\xda\x74\x64\xe6\x12\x93\xe2\x2a\xd9\x9f\x24\xa7\x89\x2a\xdb\x5b\xb6\x26\xef\x39\x3b\x97\xa5\xe9\x45\x0a\x96\x8c\x4c\x62\x25\x6a\x8d\xc2\x58\x23\x93\x99\xd9\xda\x4a\x35\xfe\xfc\xf3\x25\x78\x4e\x9b\x0b\x9c\x6f\x1e\x7f\xe6\x03\x14\x1d\xfb\x1f\x4b\x0b\x32\xbb\xff\xd2\x81\x4e\xae\x3c\xea\x37\xa1\xc4\x99\x99\x32\x59\x6e\x24\x56\x83\x56\x5a\xd8\xf6\x97\xfd\x6e\x9b\x5e\xeb\x75\x7d\xb0\x68\xc9\x20\xb3\x3c\xf0\x26\xa6\xbb\xe2\x52\xcf\x1c\x65\x1b\x96\x83\xdf\xf4\xe9\xf1\xa9\xec\x9f\x88\x3f\x3c\xb7\xb1\xf0\x8b\xde\x39\x71\xe5\x28\x2f\xff\x0c\x78\x81\xd2\x72\xb7\xff\x46\x65\x66\xfd\x1e\xb2\xbb\xb0\xb3\x5e\xc9\x3d\x3a\x57\x2d\x8e\x2c\x83\x16\x5b\xe9\x71\x21\x6b\xb1\xf2\xba\x55\xe8\x79\xe3\xb3\xdd\x0e\xb9\x17\xfc\x8d\xba\x19\xb8\x8a\x9d\x74\xa2\x71\x9e\x66\x49\x3c\x2d\x05\xf9\xbb\xe9\x0b\x5e\x01\x5d\x0c\xcb\xd2\xbb\xd2\x60\x91\x52\xf3\x66\x7b\x31\xaa\x2c\x1b\x6e\x86\x4b\x8d\x0b\x65\xba\x8a\x05\xb5\x5b\xd7\x72\x85\x44\x51\x67\x8b\xcb\x4e\x2d\xf1\x26\xba\xdc\xea\x80\xa6\xb8\x3a\xc2\x0b\xa3\xdc\x57\x8c\x45\x1e\xe9\x07\x64\x75\x37\xfe\x42\xe5\x3e\xfc\xbe\x2c\xfe\xfb\xbd\x8c\xde\x4b\x56\xbc\xcf\x90\x1e\x4a\x48\xfc\xff\xfd\x5d\x5d\x40\x46\x55\xb1\x44\x44\x0b\x8d\x42\x88\x24\x65\xc4\xd2\x02\xa6\x18\x19\x09\x0a\x29\x23\x48\x69\x2c\x49\x03\x5e\xe5\x15\x0e\xf0\xa4\x46\xa9\x90\x63\x39\x45\xe1\x20\x16\x84\xdd\xda\x91\x55\x58\x0c\x04\x4d\xdb\xf9\x66\xee\x79\xd1\x02\x5e\x8b\x16\x1c\x0f\xe8\xe8\x57\x42\x76\xad\xd4\x4b\x68\xf5\xfe\x68\xb4\x08\x9b\xe1\x13\xa3\x45\x00\x74\x20\x5a\x80\xb6\xd8\x48\x2d\x92\x94\xc6\xf5\xf3\x4e\x52\x71\xc5\x22\xdb\xe3\x06\xee\x94\x99\x2c\x1b\x29\xd3\x52\x6b\x24\xbb\x9d\xb6\x1a\x66\x8b\xb7\xf4\x05\x98\xbf\xcd\x93\x6e\x7b\x99\x69\xf7\xa5\xf7\x64\xa3\xb3\xd0\x2c\x37\x29\xf1\xd5\xd4\xa8\xe4\x56\x2d\xa5\xd8\x5f\x54\x96\x2c\xaa\xa7\x57\xcf\x8b\x16\xa9\x40\xb5\xf2\x3d\xde\x5a\x11\x4f\xe1\x05\xae\x58\xde\xfa\x89\xf8\xef\x8a\x56\x01\x0f\x97\x3d\xca\xe7\x67\xf2\xc6\x1f\x3c\xfc\xa4\xd1\xec\x6c\xb4\xc8\x1d\xdb\xef\xf1\xd6\xe5\x4e\x08\x5e\xe0\x8a\x15\x2d\x9e\x18\xad\x6e\xc1\xbf\x8f\x16\xdf\xcb\xe8\x9f\x1c\x2d\x64\x08\x21\xa2\x58\x9a\x06\xb4\xa6\x70\x88\x54\x29\x06\x60\x4c\xf1\x24\x64\x30\x56\x38\x1e\x21\xc4\x62\x59\x25\x11\xa7\x90\x08\x73\x1a\xcf\x52\xac\x80\x79\x52\x43\x2a\x49\x09\xda\x8b\x77\x7c\xf3\xac\x68\xc1\x5e\x8b\x16\x02\x75\xa1\x28\xf8\xa3\xf5\x64\x67\xe5\xd1\x68\x11\xf6\x68\x9f\xa2\x85\xfd\x5e\x85\x65\x5c\x43\xa3\xc9\xba\x82\x3a\x75\x01\xa6\xb6\x9a\x23\x60\x52\x31\xed\xea\x5b\x7f\x9b\xea\x15\xa7\x59\xb3\xc4\x4d\x97\x53\x4f\xa1\xae\x46\x8b\x32\x54\xb6\x83\xec\xb2\x95\x1a\xab\x5d\x9c\x61\x34\xb9\x5f\xcb\x2f\xfa\x59\x44\xa5\x33\xef\x65\x2b\xab\x29\x89\x46\xd1\x30\xf5\x7a\xd9\x4d\x52\xf4\xa0\xab\x77\x9a\xb9\xf2\x46\x1b\xd1\x3c\x9f\x2d\x55\x4a\x8e\x5c\x2d\x4a\xa3\x79\xd6\x49\x17\x27\xee\x68\x46\x6b\x13\x6e\x65\x27\xc5\x67\x46\x8b\x40\x41\xff\x3d\xde\x1a\x1c\x65\x9b\x0e\xc9\x36\x5e\xb4\x78\x1e\xfe\xbb\xa2\x55\xc0\x23\x48\x47\xf9\xa4\x17\x26\x6d\xba\x0c\xfb\x9e\xae\x4b\x6b\xab\x91\xa4\xcd\x7c\x35\xb1\x05\x5c\x73\xa3\x3b\x60\xa6\x55\xb2\x83\x79\xa3\x37\xb2\x17\xad\x44\xdb\x1b\xf4\xa8\x37\x4e\x25\x3f\xae\xd5\x39\x52\x3d\xd2\x72\x3f\x0f\x7d\x57\xa3\x45\x60\x2e\xee\xf1\xd6\x15\xe6\x08\xaf\x10\x92\x45\xac\x68\xf1\xc4\x68\x75\x0b\xfe\x7d\xb4\xf8\x5e\x46\xff\xdc\x68\x21\xb3\xac\xca\x41\x1e\x31\x98\xc7\x1c\xa0\x54\x44\x91\x58\x53\x31\x26\x31\xa7\xf2\xac\x46\x52\x02\xc3\x6b\x82\x0c\x35\x95\xc6\x1a\xa5\x22\xac\xa9\x34\x62\x11\x60\x38\xac\xa8\x90\x56\x5f\xbc\x63\x57\xf0\x48\xcd\x41\x20\x5a\xd0\x57\xa2\x05\x4b\x42\xc0\x5c\x78\xc7\x16\x02\xe6\xf8\x8e\xed\x7e\xfb\xdc\xd7\xca\x1c\x6b\x16\xdd\xae\x6a\x0c\x6a\x5d\xf5\xed\xdd\xed\x5b\xed\x7c\xca\x95\x95\x01\x39\x4f\xcf\x35\x25\x55\x28\x49\xa3\x9e\x31\x5b\x66\x0b\x63\xef\x9d\xd7\x40\xb4\x48\x85\xa6\x37\x70\xef\xbd\x08\x12\xf0\xfe\xb7\x6a\xd9\xac\x51\x66\x83\xa0\xb3\x1f\xf8\x1b\xa9\x99\x35\x4f\x42\x7b\xc9\x16\x97\x72\x95\x12\x4b\x9d\xd6\x2c\x9f\x60\x74\xb5\x30\xeb\x93\x4a\x05\x72\x7c\xa3\xbf\x2e\x25\xf4\x19\xb9\xe0\xb6\x74\xa9\x5c\x6b\xaa\xdb\x52\x6b\x5a\x36\x5a\x6c\x4f\x2d\xbf\xcd\xc4\x14\xd4\x33\x73\xb3\x54\x60\x7b\xf2\x46\x6d\x94\xa7\x6e\xd5\xcd\x34\xc4\x38\x11\x23\x17\x54\xe5\xc8\x88\x11\x18\x7a\x63\x6e\xb5\xf3\xd8\x13\x43\x3c\x67\x55\xc1\xeb\x4a\xc4\x78\x1e\xfe\xf0\xfc\xc6\xc2\x2f\xfa\xaf\xa8\x89\xa7\xbb\x59\xb7\xae\xdf\x77\x5e\xa6\xe6\x2f\x39\x46\x17\x70\x5e\xf6\x72\xcf\xc6\xff\x59\x1e\x97\x5f\xca\xf8\x49\xf3\xab\xb3\x11\x29\xfd\x98\xac\xf6\x68\xce\x7e\xa5\xe1\x9a\xac\x9e\x3d\x57\xb7\xe0\xdf\x47\xa4\x5c\x6f\x2e\x27\xdf\x17\xc9\xe9\x5c\x70\xe8\x81\x68\x35\x4b\x1d\x8d\xd3\x8b\xa4\xde\xd5\x9a\xab\xad\xbd\x5c\xa7\x34\xc9\x86\xa5\x7e\x8b\x5b\xd6\x15\xd3\x61\xb3\x74\xc5\x2a\x35\x16\x6a\x79\xf6\x46\xba\xf3\x8e\x98\x7f\x2f\xd4\xd0\xc8\x9c\xcc\xde\x96\x45\x20\x2e\x5a\x24\x45\x56\x77\xc0\x9f\x1c\x91\x54\x86\x87\xaa\xac\xaa\x24\xa5\x32\x90\xe4\x01\x07\x39\xa0\x30\x88\x45\x1c\x16\x54\x88\x79\xc8\x2a\x88\x12\x14\x99\x01\x18\x52\x2a\x87\x90\xc6\x91\x88\xd2\x30\x66\x65\x1a\x7a\x67\x23\xcc\x21\x7f\xb9\xb3\x96\xea\x96\x88\x44\xd1\xac\x70\xe9\x45\x78\x56\x38\xbe\xea\xbe\x3f\x87\xf5\xb5\xb2\x04\x27\x58\xa7\x27\x73\xb3\xc0\xb7\x73\xb3\x4c\x12\x8f\x14\x9a\xab\xf7\xdd\x7c\xa9\xb4\xed\x75\xf9\x55\x57\x7f\x4b\xa1\xf4\x82\x2d\xb3\x9e\xea\x7e\xf7\x88\x44\x1f\x97\x77\x47\x78\xb9\x0f\xfc\x8d\x94\x30\x9d\x97\x7a\xd4\x3b\xbd\xe4\x1a\xda\x86\xaf\x57\xf0\x54\x92\x41\xbb\x5d\x60\xf5\xf5\xfb\xb4\x40\xa6\xcc\x51\xdf\xae\xb9\xdc\xa8\x06\x20\xd5\x90\xa7\x63\x4a\x6d\xb5\x3b\x1a\xce\x98\x4b\x85\xac\x8b\x48\x1b\x67\xfa\x6b\x77\xdc\x15\x67\x4e\x79\x31\x99\xa5\xe6\x9b\x49\x4a\x1c\x3c\x2f\x22\x05\x3a\xdd\x98\xbf\x3d\x27\x22\x3d\x0f\xff\xa3\x11\x29\xd0\xf1\xd6\x1c\xe1\x29\x11\xe9\xd9\xf8\x6f\x8d\x48\x3f\x69\x0e\x77\x2d\x22\xdd\x23\xab\x87\x23\xd2\x13\xe7\xea\x16\xfc\xfb\x88\x94\xa7\x5a\x03\x4b\x46\x36\x4e\xba\xa9\x64\x79\xc5\xaf\x61\xa3\xb9\xec\x56\x2b\x93\x79\x39\xf7\xde\x98\x34\x72\x7a\x0a\x3b\x90\x5e\x88\x5c\xdf\x7e\x4b\x2d\x5a\xf9\x37\x50\xac\x36\x05\xa6\xa6\x0b\xdb\x06\x9f\xb2\x12\x52\x55\xcb\x51\xd9\x4e\xba\xb7\x5a\xc0\x5a\x27\x27\x97\x2a\x52\x6a\xf4\xec\x88\xc4\x21\x8e\xe4\x00\x0f\x11\xab\x28\x34\x44\x24\x66\x29\x92\x65\x78\x84\x59\x00\x64\x96\xe6\x05\xa8\x90\xb4\x00\x14\x0c\x20\x54\x19\x52\x45\x3c\xc9\xf2\xde\xa7\x59\x30\x44\x88\x52\xfc\x37\x97\x9f\xb5\xa3\x76\x35\x22\xd1\x3c\xc3\x5c\xfa\xe2\x04\xc3\xc0\x97\x50\x41\xcf\xa3\x3b\x6a\x17\x22\x52\xe7\x9c\x26\xa4\x2e\x6b\xe6\xa7\x2b\xf5\x91\x33\x49\x99\xd4\x38\x53\x73\xb2\xbd\x3a\x55\x4a\x9b\x6f\x8b\x62\xa6\xd9\x5f\xe8\xd5\x39\x99\x9e\x8c\xba\xa5\x72\xd9\x55\xdf\xf4\xa4\x48\xd7\x34\x3b\xed\x8c\x96\x7d\x5e\xdf\x8e\xc5\xd9\xac\x3f\x6d\xbe\xdb\xfd\x8d\xee\xb6\x96\x39\x93\x9e\x36\xc6\xb0\x9b\x6c\x25\x5d\xa3\x21\xdb\x83\x51\xbe\xd1\xc8\xc5\x88\x42\xc1\x53\xeb\xc8\x28\x24\x3e\x76\xee\x31\xa9\x1d\x65\x1a\x71\xc5\x89\x02\x4f\xc1\x7f\x5f\x14\xfa\x2e\xbb\x3f\x77\x45\xa1\xef\x88\x5f\xba\x80\xff\xaa\x97\xbf\x83\x96\x87\xbd\xfc\x83\xb2\x78\xd0\xcb\xaf\x06\x8d\xad\x9d\xea\x4e\x04\x7d\xf4\x9e\x93\xf5\x06\xd9\xe5\xcc\xc9\x9b\x2b\x9a\x4c\xb6\xa5\x6f\xb8\x7e\x6f\xb0\x5c\x55\xb7\x06\x5c\xd9\x85\x32\x48\x16\x1c\xa6\x51\x7c\xeb\xb2\x12\x7a\x07\xbc\x69\x77\xec\xf5\x7b\x95\x95\x0a\x78\xa6\x91\x4b\xee\x8d\xcc\x41\xaa\x90\x22\xbf\x83\x97\x57\xa0\xac\xa9\xaa\x40\x6b\x80\xe1\x48\x55\x13\x54\x0d\xd1\x58\x13\x58\x95\xe5\x64\x44\xf1\x0a\x56\x90\x82\x49\xc8\xab\x82\x46\xc9\x32\xc9\x90\x88\x13\x34\x4d\xe1\x14\x56\x15\xa0\x22\xef\xbf\x89\x42\x3d\xc9\xcb\x33\xd7\xbd\x3c\xa4\xa2\x3f\x30\x71\x68\x3d\x29\xb6\x7c\xd4\xcb\x87\xf7\xf6\xe3\x79\xf9\x4b\x5a\x13\x82\x77\xf4\xf2\xa9\x6e\x71\xda\x6e\xb4\xb3\x33\x2b\x5b\x32\x2b\x63\x45\x97\x2b\x96\x5a\x64\xa7\xe3\xa6\x00\xca\x03\x7a\x5b\x6f\xac\x96\x49\xcc\xd6\x96\x5c\xbf\xa0\xf4\x4a\xb9\xc2\x92\x75\x32\xda\x68\x33\x46\xa5\xe4\x9a\xed\x0d\x7a\x1a\x5a\x55\x7b\x8a\xc2\x6a\x95\x59\x8f\x53\x92\xf5\x75\xae\xd6\x28\xfe\x84\x5e\x3e\x22\x72\xfe\x30\x2f\x1f\x31\xa7\x7f\x87\x97\x0f\x47\xbd\x4b\x5e\x56\xfc\x0e\x5e\xfe\xf6\x3d\xfe\xe7\xca\xe2\x5e\x2f\xfb\x3d\x64\x71\x0b\xfe\xbd\x97\xef\xb6\xde\x24\x52\x5a\xbf\xa1\x66\xeb\x3d\x53\xe8\x17\xe6\xdb\x52\xbf\x85\xdf\x0a\x1d\x4d\x6d\x51\x55\x7e\x4b\x56\xca\x49\x7a\xd1\xb6\x13\x60\x93\xcf\xea\x63\xbd\x9c\x90\x45\x9a\xa9\x98\x3d\x7d\xc9\xe3\xee\x3c\x6b\x50\x4e\xa6\x6b\xe4\x6b\xfd\x6d\xb1\xbb\xa0\xeb\x5b\xbe\x39\x99\xa6\x9f\x5e\x4b\xa5\xca\xb4\xc0\x63\x99\x41\x98\x17\x38\x16\xd2\x14\x0b\x19\x5a\x41\x2a\x05\x14\x81\xc1\x80\x96\x35\x85\xe4\x18\x99\xa6\x68\x8c\x79\x1a\x03\x06\xc8\x1a\x47\x02\xc4\xaa\x02\xc9\x68\x40\xf6\xbf\xd7\x05\x1e\x79\x17\xc5\xff\xa2\xe2\x45\xe7\xce\x02\xf2\xc2\x12\x7e\xd7\x7a\xfc\x52\x96\x5f\xb6\xbe\x3f\xe5\x28\xf3\xf9\xc6\xb2\x31\x95\x4b\x54\x5e\xa4\x7b\xdd\x49\xd3\x2e\xcd\x27\x7d\x92\xd4\x72\xbc\x53\x2e\x70\x73\x52\x6a\xae\x8a\xbd\xa4\xd8\xa7\xc5\x0f\xdf\xee\x5d\x17\x56\xf0\xfe\x75\x87\x9f\x09\x7e\x9f\x27\xd5\x5d\xae\xb2\x82\xe7\xdb\xc5\xc1\xa4\xa1\xd4\xdb\x54\x8e\x1d\xbf\x1b\xa9\xf9\x28\x97\xc3\x23\xa1\xc8\xcf\x18\x05\x48\x46\x67\xb6\x9e\xce\xa4\x59\x5e\x70\xde\xdf\x6c\x52\xe0\x40\x16\xd6\xca\x3d\x0d\x27\xe7\xcc\xd4\xca\xba\x85\x84\x53\x20\x75\xf0\x5e\xd6\x5d\x56\x24\x8b\x9b\x9e\x21\x8f\x07\xe5\x1e\x6b\x66\x62\xf8\xf6\x13\xa5\x3d\xf5\xed\x01\x9e\x8f\xfb\x28\xc1\xdd\x62\x3d\x99\x22\xcb\x64\x31\xb7\x71\xc7\xab\x2a\x98\x0d\x48\xb4\xb1\x4c\x20\x54\xf3\xeb\x65\x39\xbd\xa9\xb1\x6e\x4a\x52\xd2\x3e\x8f\xf4\xc8\xb5\x6b\xc6\x20\xc9\x05\x82\x62\xb8\xda\xe4\x22\x6d\x07\x7b\x7e\x00\x7f\xb6\xdd\x4b\xd9\x0f\xe0\x17\xc5\xbf\x6f\xd5\x7a\xd6\xb7\xa6\xee\x97\x45\xcd\x78\xbb\xc8\xe6\x35\x59\x3c\x3a\x17\x3b\x5d\x48\x28\x21\x78\x37\xc9\xe2\xbf\xb9\x02\x99\xcf\x90\xc2\x78\x31\x40\xd6\xea\xcd\x4c\x8d\x0d\xb3\xde\xd2\x8a\x38\x5f\x6d\x16\x41\x51\x79\x2b\x36\x8b\xcd\xa4\x5c\x9a\x23\xa1\x8e\x85\x26\x9e\xe8\xc0\xa0\x97\xec\xa2\x58\x6a\xca\xad\xba\x9d\xae\x16\x5c\xa4\x33\x36\x6e\x54\xd3\xca\xcc\xa2\x98\x5e\x1a\x2c\xd0\xf3\xcf\x92\x35\x81\x53\x90\xa6\x21\x99\x57\x00\x24\x29\x1a\xd1\x1c\xcf\x33\x00\xb2\x8a\x4c\xca\xb4\xa6\x01\x84\x28\x15\x69\x0c\x49\x92\x1a\xd6\x18\x41\xa5\x00\xd6\x14\x9e\xe1\x54\x55\xd6\x64\x8c\x8e\x1f\xd8\x7c\xc0\xb7\x52\xd7\x7d\x2b\xc5\x45\xbe\xcc\xe0\xb5\xb2\x2f\xa7\x2f\xe0\x3c\xea\x5b\x2f\xac\x9b\xfd\xeb\x8e\xfd\xe2\x08\xdf\x9a\x9a\x97\xac\xd6\x68\x69\xaf\x4a\x35\x8a\xec\xa7\x6b\xda\x40\xeb\x3b\x39\x49\xea\xb8\xab\x01\x42\x92\xf6\xde\x5a\xc0\xcd\xbc\x38\x9f\x65\xe6\x28\x51\xe8\xc3\x02\x57\x18\x8d\xe4\xce\x5b\xc5\x54\x1a\xea\x9b\xc0\x14\x2a\xa2\x56\x52\x1b\x62\xf5\xbd\x2f\x17\x6a\xdc\xc6\x59\x61\x5c\x49\xff\x5c\xbe\xf5\x51\xdf\xf6\xa0\x3d\xbf\x73\xc9\x76\x46\x7e\xa6\x6f\xfd\x81\xfb\xbe\x57\x4f\x45\x7f\xa0\x6f\x13\x9f\xe4\x5b\x79\xe6\x38\x3e\x62\xe7\xec\x92\x6f\x7d\xd3\xdf\x3b\x66\x19\xf2\xe9\x89\xeb\x66\x57\x13\x83\xca\x03\x2e\x35\x4e\x65\xcb\x4a\x2e\x37\x1f\xe7\xe1\xd4\x5e\x38\x96\xfe\x66\x35\xd8\xf9\x52\xcf\x26\xf4\xda\xa6\x50\xc8\x81\x5c\xbb\x94\x97\xf2\x3d\x0d\xa7\x33\x62\x7e\x63\x74\xc4\x0c\x9a\x51\x9b\xcc\x82\xb7\x2b\x79\x63\x22\x3e\x7d\x77\x42\x20\x79\x9e\x44\x0a\x4b\xf3\x80\x55\x91\xc2\x33\x0c\x40\xaa\x4a\x52\x14\x89\x38\x48\x03\xac\xb1\x18\x29\xb4\xca\x72\x0a\x85\x79\x01\xd2\x0c\x46\x82\xcc\x52\x24\xad\x41\x80\x78\xcc\xbc\x7c\xfc\x65\xb3\x07\x7c\xeb\xd5\xad\x67\x16\xb0\x54\xe4\x9f\xd3\xf2\x5a\xb9\x97\xd3\x57\x09\x1f\xf5\xad\x17\x6a\x39\xfd\xeb\x8e\xea\x90\x28\xdf\xaa\xf6\x99\x66\x32\x37\xde\xbe\xf3\x49\x3b\xb1\xe0\xeb\xe5\x84\x53\xb5\xf5\xbc\xd3\x62\x67\x3d\xd0\x75\x13\x02\x4e\x63\xd2\x30\x7a\x95\x6a\x7b\x5b\x19\x29\x1d\x19\xd9\xb8\x2e\xdb\x56\x86\x1a\xd9\x7c\x66\xd2\x5d\xcc\x95\xb9\xd5\xcd\x0b\xab\x1c\x95\xeb\xbb\xbd\xe5\x6a\xdb\x37\xcb\x3f\x95\x6f\x7d\xd8\xb7\x3d\xea\x5b\x37\x76\x23\x5b\x7e\xa2\x6f\xfd\x91\x55\x1e\xdf\xc3\xb7\xde\xeb\xdb\xc4\x27\xf9\xd6\x7b\x73\x98\xbd\x6f\xed\x77\x13\x92\xb6\x36\x15\xb8\xac\xc3\xa4\xbd\xcc\x6c\x92\x76\x06\x31\x63\x4e\x5a\xbc\x75\xdd\xae\xac\x2d\xfb\x23\xc3\x2d\xb2\x60\x92\xe9\xf0\xdb\x42\x3e\x9b\xa3\xde\xe9\x09\x05\x61\x43\x30\x4b\x49\x91\x01\xb2\x65\x14\xdf\xbb\xcd\xa4\x92\x72\xc7\x33\xae\x6b\xf3\x15\x00\xe3\x56\xcc\x9f\xbe\xa0\xec\x7f\xa5\xc7\x71\x91\xeb\x04\x7f\x0f\xad\x29\xde\x1c\x5e\xf4\x4d\xd7\xaa\xad\x76\x53\x2c\x54\xaf\xbd\x93\x2c\x96\xdb\x52\x73\xff\x5e\x70\xad\x5a\x1e\x04\x21\xfe\x42\x10\x04\x21\x66\x32\x01\x68\x9f\x10\x12\xf5\x66\xa1\x22\x36\x07\x44\x49\x1a\x10\xbf\xea\xea\x27\x6a\x47\xa6\x6d\x0d\xe7\xfa\xe8\xf0\x4d\x8f\xd0\xfd\x93\xa8\x0e\x41\x3d\x47\xf9\x39\xc4\x57\xa9\x0f\xfd\x5d\xf6\xd0\x1f\x31\x3f\x7e\x66\x69\x78\xfc\xb8\xd2\x30\xf8\x15\xa5\xe1\x53\xb8\x3b\x45\x7b\x8e\xb9\xbb\x08\x23\x3a\xd5\x42\xa3\x23\x11\xbf\x1e\xbb\xbf\x12\xc7\xfe\x87\xdf\xfe\x80\x1b\x45\xf3\x9c\x69\xbd\x99\xf1\x9b\x26\x35\xe2\xab\xa0\x57\xbe\xbc\xf9\x5c\xce\xce\x23\xb9\xc4\xe9\x05\xb2\x62\x73\x1e\xf9\x99\x84\xab\x1f\x22\x78\x2e\xf7\x51\x68\x2e\xf1\x7f\x91\xb4\xab\x12\xf0\x55\x5a\xde\x78\xda\x7e\x60\xa4\x50\xcd\x48\xfd\x2b\x3c\xa4\x9b\x92\xd8\x96\xfc\xae\xa7\x50\x88\x5a\x35\x6c\x0c\x9d\x56\xa1\x9a\x23\x64\xd7\xc6\x38\x68\x5d\xd1\xd4\xf8\x36\xf6\x38\x3d\x3e\x9c\x78\x14\x45\xd8\xb5\xbc\x19\xee\x3f\x84\x74\x37\x39\x47\x10\x41\x4a\x4e\xb2\x81\x53\x7a\xfc\xce\xaf\xc4\xfe\xc7\xd0\xc1\xef\x0b\x6c\x28\x9f\x05\x26\x6f\x86\x63\xe4\x8c\x1f\xa1\x6c\x37\x3e\x1e\x59\x41\x4d\xdb\x8d\x3a\x47\x8d\xff\xb1\xfe\x47\xe8\xf1\x21\xc4\xa3\xc8\xef\xfb\x21\x9e\x57\x02\x59\xd6\x4c\x57\x7c\x77\x60\xda\x6a\x84\x9b\x1e\xe2\x9d\x6e\x78\xed\x77\x50\xba\x8f\x12\x3e\xc1\x21\x70\x41\xb2\x0f\x7f\x1d\xfa\x84\xe2\xcf\x5e\x4b\x57\x5f\x89\x2f\xde\xe0\x2f\x51\xc4\xea\xea\x93\xc8\xd4\xd5\xd8\x04\x1e\x54\x6f\x47\xde\x1d\x44\x9b\xd6\xd0\x7a\x16\xdd\x7b\x58\x41\xd2\x23\x42\xd5\x5d\x9c\x9c\x67\xc0\x5d\x3f\x8f\x81\x3d\xac\x08\x9d\xbe\x93\x85\x20\x84\x73\x4c\x98\xd6\x4e\x2b\xc7\xe6\x5d\x3c\xec\x89\x3f\xc2\xb8\x57\xf8\x97\x05\xed\xec\xad\xdd\x73\xd5\x8f\xcb\xfa\x14\x5c\x90\xe4\xc3\xdf\x10\x39\xa1\xf1\x3c\x45\x41\xb9\x3e\x8b\xac\x4f\x30\xe3\xb9\xb7\x73\x04\xba\xfe\x94\xb8\x8f\x4c\xeb\x11\xc6\xfd\x2a\x79\x4d\xfd\x5c\x5b\xdd\x21\x91\x91\x83\x1f\x8e\x9f\xe7\x80\x85\x28\x57\x71\x88\xce\x60\xdf\xab\x04\x9a\x9a\xf6\x40\xd0\xfa\x0c\x2a\x16\x71\x5e\xcf\x4b\xa4\x79\xb4\x63\xfb\x69\xe2\x0b\xc1\xbb\x46\x64\xa8\x7b\x1c\x4a\x9f\x23\xc7\x13\x68\x71\xa9\xbc\x2a\xcd\xe7\xd0\x16\x8b\xa6\xcb\xb4\x1c\x28\x9e\x99\xe6\x74\x61\x3d\x46\xd1\x29\xac\xd8\x33\xea\xaf\x77\x23\xe8\xb3\x90\x6e\x0f\x5d\x7d\x8e\x9f\x42\x61\x18\x5a\x3c\xbb\xdd\x13\xf8\x4a\x84\x49\x7e\x25\xf6\x2e\x5e\x99\x99\x0e\x56\x87\xc8\x8d\x60\xe2\x09\x7e\x7b\x0f\xe7\x1a\xc5\x37\xae\x8e\x76\x50\x9f\x26\xdd\x1b\x04\x7b\x55\x6e\xba\xa1\xe2\xf5\x30\xb4\xe4\x70\x86\xa6\x31\x44\xaa\x6a\x63\xc7\x79\x54\xa0\x57\x11\x9c\xe4\x69\xfb\xe6\x50\x66\xe4\x77\xbc\x81\xf6\xc7\xf5\xe0\x12\xec\xeb\x14\x9f\xb1\xb2\x53\x80\xfb\x55\xf8\x0e\x9e\xbb\xb1\xee\xcf\xc1\x2f\x42\xbd\xba\xec\xdf\x75\xba\x42\xe8\x7e\x0d\xb5\x03\xf9\xa1\x44\x4f\xa2\xf6\x1c\xe8\xab\xcb\xb7\xb8\x9a\x1c\x00\xfe\x6c\x65\x38\x01\x7d\xcf\x7a\x33\x1a\xdc\xdc\x32\xed\x9d\xe3\x5b\x62\xdb\xd1\x4d\xe3\xf9\x82\x0e\x63\xb8\x4e\x7e\x68\x40\x7c\x66\xf6\xae\xe7\xce\x9d\x8a\x78\xf2\x0f\xe0\xb8\xca\x49\xa0\x6f\x7c\x26\x2c\x1b\x2f\x75\x73\xe1\xfc\x10\x6e\xce\x21\xbb\xca\xd6\xb9\x41\xf1\xf9\x3b\x6c\xa2\x7c\x37\x9e\x0e\x08\xae\xf2\x11\xb9\xdb\x75\x0a\xfa\xf8\x61\xf4\xef\x61\xda\x61\xe8\x67\x13\xe0\x5b\x0d\xfc\x14\xe8\x69\x0a\xf5\x24\x0b\xbf\x84\x22\x0e\x0f\x57\xf2\xba\x8b\xc8\x9e\x17\xbe\x3e\x03\x8e\x45\xfb\xf5\x20\x16\x4c\xb6\xbf\x87\xda\x7c\x86\x7f\x77\xaa\xef\x2d\xe2\x3e\x02\xf9\x61\x87\x71\x28\x9b\xe6\xf4\x6e\x29\x5f\x80\x79\x75\x89\xf0\xeb\xaf\x2a\x76\x91\x3e\x73\x88\xaf\xff\xfe\x37\xf1\xe2\x98\x33\x35\x70\x9a\xf6\xf2\xed\x9b\x8b\xd7\xee\x6f\xbf\xbd\x12\xd1\x1d\x15\x53\x8d\xd7\xd1\xdf\x8b\x8f\xee\x2a\x9b\x8b\xd1\xd8\x8d\x85\xfe\xa4\xeb\x65\x02\x4e\xba\x86\x48\xf8\x8d\xe8\xe5\xa5\xa6\xe4\x2b\x19\xf1\x27\x41\xd3\xb1\x0f\xa2\x75\x75\xa8\x05\x8e\x89\xb2\xa5\x1f\x73\x1c\xbd\x47\x4b\x64\x6b\x4d\xa9\x90\xab\x7e\x1c\x01\x11\x4d\x29\x2b\x35\xa5\x6a\x5a\x6a\x85\x4e\x45\xbc\xd6\x5a\x95\xe8\xd4\x33\x3b\x95\x69\x4a\xad\x76\xb3\x90\x6e\xef\x1e\x65\xa4\xb2\xd4\x96\x88\xb4\xd8\x4a\x8b\x19\xe9\xc2\x39\xda\x2e\xef\x38\xbd\x1d\x86\xb6\x62\x9e\x27\x8c\x53\x3c\x57\x0e\xc9\xa2\x28\x39\x95\x4f\x78\xdb\xe8\xac\xb0\xf6\x0b\xfd\x2b\x27\x8a\x91\x92\xd8\xa7\xb2\x7f\xbb\x1c\x82\x74\x9c\x93\xc2\x61\x97\xe0\xb2\xc2\xdc\x26\x81\xcf\x9b\x4a\x7f\xa3\x18\x22\x88\x39\x95\xc5\x99\x6d\xb0\xe7\x2a\x45\x78\x8b\xe3\x67\x10\x48\xb4\x6a\x7c\xda\x43\x8a\xab\x1d\x75\xd3\x71\x47\x36\x6e\x35\xca\x84\x8a\x5c\xb4\x53\x31\x42\x5d\xcc\x2d\x42\x31\xe7\xd6\x0c\xbb\xd8\xe3\xe1\xff\x07\x00\x00\xff\xff\x06\x23\x89\x36\x43\xe1\x00\x00") - -func allow_trustHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _allow_trustHorizonSql, - "allow_trust-horizon.sql", - ) -} - -func allow_trustHorizonSql() (*asset, error) { - bytes, err := allow_trustHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "allow_trust-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0xf5, 0x95, 0x37, 0xf8, 0x65, 0x80, 0x8d, 0x5d, 0x12, 0xee, 0xb2, 0xa8, 0x5d, 0x1f, 0xf3, 0x93, 0x52, 0x51, 0x6, 0xb6, 0x3, 0x26, 0xa9, 0xae, 0x21, 0x9, 0xe8, 0x9f, 0xd5, 0x53, 0xb}} - return a, nil -} - -var _asset_stat_accountCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xf9\xb3\xa2\xc8\xf2\xef\xef\xfd\x57\x10\xf3\x4b\xf7\x84\x3d\x57\xf6\x65\xfa\xcd\x37\x02\x10\xdc\x10\x50\xc4\xed\xc5\x8b\x8e\xa2\x28\x14\x45\x50\x16\xb7\x17\xf7\x7f\x7f\xe1\x72\xdc\x8e\x7a\x6c\xb5\xa7\xef\x8b\x3b\xc4\x44\x8f\x47\xd2\xcc\x4f\x7d\x2a\xb3\xc8\xaa\x02\xf2\x8f\x3f\x3e\xfd\xf1\x07\x66\x46\x49\xda\x8f\x91\x55\xd7\x30\x17\xa4\xc0\x01\x09\xc2\xdc\x6c\x3c\xf9\xf4\xc7\x1f\x9f\xd6\xe7\x0b\xd9\x78\x82\x5c\xcc\x8b\xa3\xf1\x41\x60\x86\xe2\xc4\x8f\x42\x4c\xf8\x17\xfb\x2f\xe2\x48\xca\x59\x62\x93\xfe\xf7\xf5\xcf\xcf\x44\x3e\x59\x4a\x13\x4b\x52\x90\xa2\x31\x0a\xd3\xef\xa9\x3f\x46\x51\x96\x62\x7f\x61\xf8\xb7\xcd\xa9\x20\x82\xa3\xf7\xdf\xfa\x6e\x80\xbe\xfb\xe1\xf7\x34\x06\x61\x02\x60\xea\x47\xe1\xf7\x04\x25\x6b\xbd\xef\x85\x61\xe0\xaf\x55\xa3\x10\x46\xae\x1f\xf6\xb1\xbf\xb0\xcf\x76\x53\xe5\x3f\x7f\x7b\xb3\x1d\xba\x20\x76\xbf\xc3\x28\xf4\xa2\x78\xec\x87\xfd\xef\x49\x1a\xfb\x61\x3f\xc1\xfe\xc2\xa2\x70\xa7\x63\x80\xe0\xe8\xbb\x97\x85\x5b\x5b\x4e\xe4\xfa\x68\x7d\xde\x03\x41\x82\x4e\xcc\x8c\xfd\xf0\xfb\x18\x25\x09\xe8\x6f\x04\xe6\x20\x0e\xfd\xb0\xbf\x15\x89\xa3\xf9\xf7\x04\xc1\x2c\xf6\xd3\xe5\x5a\xb9\xe7\x7d\xdb\x11\x80\x40\x0c\x07\xdf\x27\x20\x1d\x60\x7f\x61\x93\xcc\x09\x7c\xf8\x75\xcd\x18\x04\x29\x08\xa2\xfe\xb7\x4f\x9f\x0a\x0d\xc3\xc4\xca\x7a\x41\xe9\x60\x65\x15\x53\x3a\x65\xab\x69\xed\x24\xff\x95\x4d\xfa\x31\x70\xd1\xc0\x4f\x52\x67\x99\xa0\xe9\xb7\x9b\xd2\x09\x9c\x4c\xb3\x28\xce\xc6\xc9\x7d\xc2\x28\x9c\xdd\x23\x19\x20\xb7\x8f\xe2\x7b\x24\xd7\x38\x3d\x84\xee\x94\xbc\x43\xcc\x41\x49\x1a\x79\x1e\x8a\xfd\xd0\x45\x8b\xdb\xb2\x00\xc2\x28\x0b\x53\x07\x04\x20\x84\x28\xf9\xf6\x49\xd4\x9a\x4a\x03\x6b\x8a\x92\xa6\x1c\x49\x1b\xba\xd6\xbd\x40\x6f\x14\x2f\xb1\x8d\x76\xd9\xd0\xad\x66\x43\x2c\xeb\xcd\xa3\x1f\x9d\x0a\x7e\x9f\x8c\xd0\xf2\x1e\xfd\xe9\xe2\x63\xd5\x7b\x99\x1f\xd0\xea\xa1\x3b\x30\x1f\x8b\xdd\xaf\x3b\xce\x92\x34\xf0\x43\x94\xdc\xd2\xbc\x17\xba\x5b\xef\x1a\x05\xda\x8c\x06\x37\xf4\x1e\x84\xee\xd7\xbb\x77\xf9\x5b\x7a\xf7\x42\x77\xeb\xdd\xca\xfb\xa1\x17\xdd\xd0\x7b\x10\xba\x5b\xef\x24\x73\x92\xcc\xb9\xa1\x73\x2b\xf0\x23\xfa\x02\x3f\x19\x4c\x33\x94\xdd\x62\xf6\x58\xec\x7e\xdd\x08\xc5\xb7\x68\xdd\x9c\xbf\x5b\xdb\x26\x8c\x6f\xa9\xdb\x0a\xdc\xad\x6f\x3b\x2a\x0d\x10\x70\x6f\xab\x3d\x91\xfb\xc9\xda\x77\x23\x25\x9a\x7e\xbf\xd3\x8c\x03\xc2\x1b\xca\x1d\x10\xde\x0d\x78\x37\xfa\xdd\xc2\xfa\x26\xf2\xa3\x3a\xd7\x39\xc0\xc7\x6a\xd7\x52\x3b\xcd\x1b\xd9\x73\xc5\x17\x87\xdc\xdb\xb2\xfb\xa1\xf1\x23\xb1\xc3\x40\xf7\x81\xe4\x7e\xe0\xba\x2d\x77\x18\x88\x3e\x90\xdb\x0f\x2c\x1f\xca\xdd\x85\xef\x30\xa0\xdc\x96\xdb\x0e\x12\x1f\xca\xec\x43\xfe\x03\xc9\x75\x1c\xdf\x16\xd9\xc6\xe6\x6d\x99\x93\x50\xb8\x2d\xea\x80\xf0\xb6\xc0\x9b\xab\xde\x25\xb5\xf6\xbc\x9d\xa0\xd2\x69\x2a\xba\x55\x36\xf4\x63\xe1\x60\xd2\x4f\xa6\xc1\x4e\xc2\x92\x4b\x4a\x4d\x7c\xa7\xeb\xdb\xa7\x6d\x6e\xac\x83\x31\xfa\xf3\xed\x3b\xac\xb9\x9c\xa0\x3f\x77\x3f\xf9\x86\x59\x70\x80\xc6\xe0\x4f\xec\x8f\x6f\x98\x31\x0f\x51\xfc\x27\xf6\xc7\x26\x65\x96\x1b\x8a\xd8\x54\xde\x34\xbf\xe9\xfb\x74\xa2\xf1\xf4\xe4\x4e\xb1\x6c\xd4\x6a\x8a\xde\xbc\xa1\x79\x2b\x80\x19\xfa\xa9\x02\xac\x6c\x61\x9f\xdf\xf2\xdb\xb7\xef\x92\x8d\x92\xcf\xe7\x96\xdf\x9a\xbf\xb3\xb9\x67\xe8\xc3\xf6\x9c\x70\xa9\x1b\xcd\x33\x3e\xb1\x76\xb9\x59\xda\xc3\x3a\x4e\x68\x4f\xcc\x1f\xb4\x9c\x01\xf9\x91\xc6\xbf\x53\xb2\x21\xc0\xd4\xf2\x93\xfe\x7a\x16\x33\x89\x23\x88\xdc\x2c\x06\x01\x16\x80\xb0\x9f\x81\x3e\xda\xd0\x70\x67\x02\xbe\x16\x73\x91\x07\xb2\x20\xfd\x9e\x02\x27\x40\xc9\x04\x40\xb4\x9e\x4d\x7c\x3e\x3b\x3b\xf7\xd3\xc1\xf7\xc8\x77\x8f\x26\x08\x27\x8d\x3d\x76\xc8\x5d\x33\x37\xae\x7b\x68\xe4\x9b\x03\x5c\x22\x7c\xeb\xe5\xc7\x83\xee\x97\x4f\x18\x86\xbd\x7d\xe3\xbb\x18\x1c\x80\x18\xc0\x14\xc5\xd8\x0c\xc4\x4b\x3f\xec\x7f\x61\xd8\xdf\x37\x7d\xa3\xdb\x9a\xf6\x75\x23\xbd\xfe\x61\x08\xc6\xe8\x82\x30\xcf\x5f\x12\x9e\x81\x20\xbb\x24\x4d\x10\xe4\xb9\x78\x00\x92\x74\x1c\xb9\xbe\xe7\x23\x17\xf3\xc3\x14\xf5\x51\xbc\x17\xf9\xf4\xfb\x79\xdf\xef\xa3\xf8\x49\x2e\x92\x87\x88\xd8\x4d\x04\x30\xc7\xef\xfb\x61\x7a\x76\x32\x41\xd3\x30\x1b\x5f\x3e\x17\x66\xe3\x24\x73\x50\x98\xc6\xeb\xa9\xe0\x79\x33\xb7\x32\x7e\xe8\x05\x60\x3d\x63\x74\x51\x92\x5e\x86\xb3\x15\x1c\x44\x63\xe4\x46\x63\xe0\x87\x17\xa4\x68\xfa\x1c\x74\x3a\x88\x51\x32\x88\x02\x37\xc1\x52\xb4\x38\x47\xe6\x05\xa0\x7f\x0d\xd1\xcd\xbe\xd9\x31\x92\xad\xad\x06\x3e\x70\xfc\xc0\x4f\xd7\x8d\xdb\xb6\xff\x8d\x92\x20\xb8\x75\xda\xef\x87\xeb\x5c\x68\x0d\x6b\xfb\xcd\x51\x36\xb0\x4f\x2d\x76\xa4\x7f\xdf\x4c\xab\x31\xb9\xa4\xc8\x55\xec\xcb\x97\xb7\xae\xf8\x9f\xbf\x30\xfc\xf7\xdf\x6f\xfc\xfa\x1c\xe0\xb9\x9e\x77\x0d\xf8\x48\xe3\x49\x5f\x9e\x69\x3b\xed\xe7\x8f\x34\xbd\xa7\xe7\x4c\xdd\x05\xfe\xb6\x3a\xdf\x07\xc6\xfa\xfa\xf7\x68\x4c\xac\x53\xc6\x6d\x38\x84\x91\x8b\x8e\x63\xe1\x24\x06\xde\x1b\x3d\xbd\x3e\x3f\x6a\xfe\x34\x31\xde\x02\xd9\x7d\x07\x92\xc1\x11\x18\xf6\x9d\x6f\x4f\x62\x34\xfb\x50\xc8\xc9\xe0\x08\xa5\x81\x9f\xa4\x1f\x8a\xee\xb3\xed\x37\x77\xdf\x7e\x0d\x83\x28\x41\xa9\x3f\xbe\x12\xf9\x9b\x81\xf5\x42\x6c\x1d\xf5\xf9\x69\x52\xbf\xd7\x77\xd6\xdf\x07\x3b\x57\x5c\xe7\xda\xdc\xe0\x54\xcd\xa1\x15\xd7\xbc\x65\x97\x7c\x3d\xda\x63\xbb\x89\xd7\x97\x7d\x90\xa3\xf8\xce\x11\x74\xbb\xf2\xe2\x5e\x1b\x41\x37\xee\x0e\x92\x04\xa5\x97\xf8\xdc\xc6\xea\xd5\xd3\x60\xbc\x0e\xab\xcb\xaa\x27\xb1\x0f\x51\x78\x65\x10\xdb\x9c\xbc\x36\xc2\x6d\x4e\x62\x6e\x94\x39\x01\x5a\xfb\x1b\xf4\x37\x2b\x92\x2f\x1d\x45\x8f\x7a\x78\x37\x65\xdd\xb6\xe5\xac\x5f\x77\x0d\xbc\xe2\x1b\xbb\x5f\xee\x18\x3e\xfb\xe9\x1b\xef\xd7\x1c\x62\x9b\xb0\x3f\xea\x0f\xdb\x69\xfd\xd6\x1d\xfc\xc9\xa5\x0b\x3f\xf3\x2e\x72\xa3\x38\xdd\xb3\x51\x50\x54\xd1\xd6\x9a\x18\x7e\x7e\xd9\x44\x8b\x14\xa4\x29\x1a\x4f\x52\x6c\x1d\x16\x49\x0a\xc6\x13\x6c\x9d\x32\x45\xd9\xf6\x1b\x6c\x15\x85\xe8\xfd\xc5\xd6\x03\x7e\x90\xc5\x47\x97\xda\x6b\x16\xd2\xe5\x04\x7d\xdc\x29\xdb\x65\x89\x23\xbd\xef\x87\xfd\xbd\xc5\x2b\xbd\xb3\x5b\xd9\x88\xe2\xf3\x4e\xfd\xb2\x61\xe2\x7f\x30\xfc\x77\x4c\xd4\x0b\xd8\xf6\xcf\xff\xf5\x17\xc6\x32\x0c\xc5\xfc\x7e\xb1\xaf\x8e\xa7\x61\x0f\x77\xd9\xf1\x2a\xcf\xf1\x98\x7b\x85\x8d\xed\x42\xdb\x3a\xea\x2e\x02\x5a\xcf\x1d\x9f\x80\x92\x64\xce\x0e\x44\x8c\x92\x93\x0b\x10\x75\x31\x63\x8c\x11\xd8\xc7\xd2\x7b\x3c\x47\x73\xde\x47\x31\x1d\x2d\xd6\xdd\x71\x65\xdc\x02\x9b\x26\xe8\xd6\x15\xe6\x3d\xce\xa3\x39\xfc\xa3\x38\x0f\x2a\xee\xc7\xf9\xee\x22\x77\x76\x1e\x85\x33\x14\x44\x13\xf4\xc1\x25\xed\x60\xfa\x89\x0b\xd1\xd1\x72\xc7\x13\x14\xbc\xad\xd7\x7e\xb9\xa7\x1f\x0e\x5e\xf4\x11\x11\xd3\x2b\x17\x9a\x53\x12\xde\xd6\x81\x4f\x34\x9e\x13\x71\x62\xed\x2a\x19\x87\x35\xa2\x87\xc9\x38\x2c\x8a\x7f\x39\xc4\xed\xe9\xe4\xed\x42\x4c\xdd\x8a\xee\xa3\x15\xae\x47\x51\x1d\x6d\x01\x3c\x32\xed\xda\x5c\xf1\x6f\x8c\xd4\x7e\x92\x64\x28\xbe\x5f\x15\x8c\xdc\x8b\xb3\xd3\x77\xb4\xa4\x81\x3f\xf6\xaf\x64\x14\x37\xe7\x82\xbf\x72\x56\x75\xe4\x9d\x47\xbb\x2a\x0f\xcd\xa2\x8e\x7f\xff\xaa\x79\xd4\x91\xce\xc7\xe7\x3f\xb7\xb4\x6e\x3b\xed\x4c\xd3\xae\x27\xff\xe7\x72\xe0\x9d\x2c\xf7\x3e\xec\xe4\xc7\x7b\x68\x5b\x37\x4f\x17\x27\x43\xf1\x1d\xf3\x8d\x73\x07\x5c\x6c\x76\x29\xaf\x9e\x85\x03\x10\xf6\xd1\xc5\x89\xfd\x31\x39\xc7\xdb\x76\x8f\x8f\xd5\x87\xb5\xf3\xc7\x29\xfa\x9b\xf9\x71\x22\x77\x79\x89\x9c\x74\x11\xa3\x24\x0b\x2e\x8e\xee\xe9\x62\x8c\x3e\x9c\xcf\x1d\xb6\x58\x1f\xe7\xf3\x6c\xdf\xe2\x51\x52\xcf\x76\x9c\xbf\xdc\x45\xdc\xee\x47\xb7\xd8\xdb\x89\x5c\x22\xe2\x3e\xb7\x3b\xdb\xe1\x7e\x84\xa8\xc2\x7a\x66\xed\x45\xf1\x07\x8b\xa1\x58\x41\x6c\x8a\x1f\x70\x76\x5b\x65\xf2\xc3\xfa\xca\xba\xa5\x34\x9a\x58\x59\x6f\x1a\x87\x45\xc5\x96\xa8\xd9\x8a\x85\x7d\xf9\x5c\x94\x1a\x66\xb7\x54\xd6\x48\xb9\x4c\xa9\x7a\x9d\x96\x3a\x9a\x5a\xd3\x0b\x9a\x5a\xb1\x75\xd3\x26\x4b\x5d\xaa\x57\x53\xad\x92\xa1\xdb\xb2\x62\x88\x56\x9b\xab\xcb\x9c\xd1\x21\x4b\x9f\xbf\x62\xc2\xf6\x60\x76\xff\x67\x71\xfc\x2b\x46\x7f\xc5\xf0\xaf\x5b\x96\xb1\xcf\x9f\xbf\x62\x9f\xc5\xba\x28\x8a\xe2\x5f\x7f\x7d\xde\x9c\x20\xdf\xce\x1d\xfe\xfd\xfd\xdb\x47\x08\x65\x92\xaa\xab\x64\xc9\x56\x18\x52\xac\x75\x6c\xd5\x2e\x51\x62\xb7\x22\x76\x3a\xc5\x4e\xa7\x45\xb6\x4a\x9d\x6e\xb7\xc1\x2a\xdd\x8e\xd2\x34\xab\x85\x4e\xcf\x12\xdb\x2c\xd7\x31\xe8\x03\x42\x61\x8d\x8c\x67\x78\x41\xa0\x68\x46\xa0\x6e\x40\xa4\x36\xff\xfd\x38\x44\xa9\x53\xac\x57\xda\x2d\xad\x6d\x74\x4b\xaa\xd6\x6a\x56\xdb\x2d\x46\x2d\x96\x44\x4a\xd3\xbb\x5d\xb2\x52\xaf\xd6\x38\x43\xac\x88\xb6\x52\x57\x6d\x56\x33\x65\x4b\x51\x5b\x1d\x43\x3f\x40\xe4\x4f\x20\xde\x62\x91\x7c\x10\xa2\xc8\xb4\x25\xb3\x2b\x32\x5d\xba\x2d\x2a\xa5\x4e\xbb\x41\xda\x55\x83\xb4\x0d\x5a\xb2\x8b\x25\xbb\xce\xd1\x8a\x6d\x56\x0d\x9d\xac\x97\x5a\x74\xbb\x51\x32\xca\x0d\xbd\x5a\x2d\x91\x77\x41\xec\xb6\x2b\x43\x6d\xac\xcf\x9c\xfa\x06\xe2\x31\x5c\xe2\x41\xb8\x72\xa7\x5a\x64\x1b\x3a\x6d\xe8\x65\xc5\x94\x6b\xba\x2a\x71\x14\x29\xd2\x14\xdb\x63\x4c\xbd\x60\x35\xb4\x62\xbb\xca\x15\x25\x4d\xae\xd5\xb5\xb2\x6a\xd0\x16\xa7\x74\xdb\x2d\xfb\xae\x4e\xef\x75\x06\x03\xa7\x23\x25\x3d\x8b\x19\x3a\x24\x7e\x0e\x19\xbf\x06\xf9\x4a\x64\x9e\xaf\x68\x3e\x11\xe4\xd7\xd7\x29\x7f\x34\xd2\x4f\xd7\x2a\xf7\xbc\xb2\x94\x2b\xf0\x1e\x43\xb1\x08\xb1\xbc\x4b\x38\x24\xe7\x30\x0e\x2f\x78\x24\x05\x3c\x86\x22\x08\x87\x63\x58\x01\x90\xb4\x07\x3c\x82\xc6\x29\xe0\xe2\x0e\x43\x3a\x2c\x45\x39\x38\xe7\x20\x41\x58\x53\x85\x3f\x79\xac\x75\x30\x1c\x09\x48\x44\x91\x9e\x47\xd2\x3c\xc0\x39\x07\x47\x1c\xee\xb9\x84\xc7\xba\x14\xc1\x43\xc2\x03\xd0\x25\x71\x87\x85\x10\xe7\x21\x45\xb9\x0c\xc7\x31\x24\x23\xf0\x2c\x4f\x90\x0c\x20\xd8\xad\x67\xe1\xeb\x8e\xfb\x8f\x3d\xa4\x4e\xd5\xa7\x97\xf9\xa5\x55\x95\xb8\x42\x58\x10\x4a\x24\xbe\x18\x4a\xb9\x04\xef\xa7\xc9\xbc\x3c\x5f\x11\x1d\xd7\x6a\x77\x81\x54\x01\x6a\x7f\x2d\xaf\xe8\xb4\x06\x56\x13\xb2\xfe\xa1\xe6\x9e\xd8\x21\xe8\x8d\x98\x34\xfa\x1b\x1a\xf2\xd2\xe3\xf3\x59\xec\x5f\x71\x54\x84\x28\x8e\x74\x1d\x1e\x67\x20\xcd\xd2\x82\x4b\x90\x2e\xc0\x5d\x87\xf1\x38\x80\x04\x8f\xf5\x18\xcf\xe5\x28\x8f\xf5\x20\x0b\x09\x5a\x20\x3d\x1c\xe7\x10\xe0\x18\x8f\xf3\x08\x16\xa7\x05\x67\xed\x64\xaf\x70\x76\x02\x87\x02\x29\x40\x1a\xa7\x3d\x87\x24\x09\x92\xc0\x5d\xc7\x41\x24\xa2\x70\x87\xc2\x01\x4e\x91\x02\xef\x00\x12\x27\x1c\x82\x06\x2e\x00\x1e\x45\x21\x8e\x40\xd0\x23\x69\x9a\xc6\x69\x84\x6f\x47\x6c\x82\x61\x04\x86\x13\x78\xfe\xcd\x63\x65\xd2\xec\x0d\x09\x3d\x63\x22\xdc\xa9\x70\x6d\x3a\x5c\x1a\x33\x7b\x51\xa4\x5a\x93\x68\x94\x9b\xa9\xa2\x91\xca\x44\x95\xac\x71\x12\xc7\xf6\x12\x58\x2c\x12\xc6\x68\x99\x44\xf5\xa9\x5a\x62\xf2\x0a\xef\x17\x50\x1d\xc5\xf1\xd4\xe9\x0b\x61\x6f\xa9\x16\x52\x20\xae\x22\xb7\xc5\x6e\xdc\x48\xec\x98\xad\x1a\xbb\xf9\x54\xde\xff\xb3\x1d\xde\x92\xc3\xdf\x73\xd1\xac\xef\x7c\xc7\xa4\x72\x4b\xb2\x1b\x11\x8e\x1a\xce\x5d\x67\xca\x58\xa3\x36\xdb\x2b\x15\x97\x6a\xd3\x96\x8d\x1a\x3e\x74\x71\x23\x56\x42\x9e\xa2\x47\xb0\xbe\xb4\x42\x45\x32\x13\x5f\x19\x14\x9c\x99\x4f\xcf\x93\x79\x54\xa8\x76\x33\x5f\x74\xd4\x2a\x39\xe5\x57\xcc\x82\x33\x2b\x4a\x5d\xa1\xb7\xf6\x2f\x78\x74\xf1\xa2\x7b\xbf\x79\x74\x01\xaf\xfc\x34\xcf\xfb\x59\xc7\x9d\x1e\xed\xf0\x34\xee\xd0\x24\x49\x0b\x1c\xf2\x08\x9c\x25\x05\x07\xd2\x1c\xf0\x48\xc8\xe3\x88\x01\x0e\xce\xe1\x02\x4e\xb0\x34\xc7\x03\x0e\x09\x04\xe1\x79\x1e\x82\x10\x30\x10\x38\x00\x71\xcc\x3a\x9f\x79\x49\x54\x70\x34\x41\x90\x3c\xe5\xd2\x14\xeb\x51\x9e\x4b\xb3\x0c\x8e\x5c\x9c\x16\x5c\x97\x03\x82\x20\x10\x2e\xcd\x38\xb4\x0b\x38\xd7\x63\x59\x4a\x40\x38\x10\x70\x96\x76\x69\x1e\x67\x58\x96\x75\x19\x6a\x9b\x26\xed\x3d\x9a\x78\xf3\xe8\x1c\x4d\x69\x4e\x5f\x5d\x14\x2d\x57\x49\x23\x3d\xf5\x50\x16\x92\x82\x47\xac\x84\xd9\x22\x51\x2b\xda\x5c\xca\x4d\x08\x21\xaf\xf6\x2d\xa7\x85\xd7\x26\x5c\x3d\x69\xe1\x9c\x51\x1e\x2e\x6b\x6a\x89\x5b\xaa\x7c\x36\x85\xdd\x5a\x44\x31\x35\x9c\xca\x2f\x69\x2a\x5d\x3a\xb1\xb2\xd8\x3a\xcb\xc6\xa3\x8f\xfc\xa6\xcb\x4b\xf9\x4a\xc3\x1f\x7b\xb5\x96\x33\x00\x2d\xb6\x80\x07\x49\xd7\x5c\xf4\x67\x75\xab\x44\x74\x0a\x75\xda\xaa\x0c\xf3\x1c\xf4\x16\xd3\x14\x57\xac\xbe\x50\x27\xf9\x3c\x51\xb4\x0d\x5c\x09\x5d\x34\x19\x37\x08\x35\xd5\x27\x82\x30\x36\x90\x3c\x91\x46\x44\x59\x6a\xf7\x52\x7b\xbe\xd6\x5c\xbb\xe0\xb1\x66\x74\xa9\xd7\xff\x7f\xf7\xd8\x2b\x19\xc8\x85\x0d\xb7\x27\xf2\x99\xf7\xbb\x35\xcf\x28\xbb\xb6\x9d\xf0\x9c\xce\xf3\x1d\x81\x27\xb4\x5d\x59\xcf\x7f\x42\xe3\x95\x95\xf7\x1f\xcd\x06\x8f\x56\xdf\x8f\x52\x6c\xa9\x5d\xe8\x59\x0d\x85\x2d\x58\x85\x8a\xa8\xc8\x9d\x06\x23\x17\x74\x56\x65\x6a\xdd\x6a\xa1\x62\x19\xdd\x8a\xd4\xeb\x52\xd5\x5a\xa7\x44\x16\x6b\x55\xa6\xd5\x52\x2d\xb9\x54\x2f\x6d\xaf\x68\xdb\xbc\xab\xac\x0f\x98\x40\x09\x07\xcb\xe2\x48\x92\x3a\x43\xbc\x4e\xe6\x34\x62\xac\x16\x9a\x15\x52\x19\xac\x86\x60\xdc\x31\xa3\x95\xea\xc6\x76\x32\x38\x78\xdf\xe6\x02\x24\x6f\x3e\xae\xc3\x4c\xf1\x17\xf3\xae\x63\xb3\xcd\xea\x72\x20\x47\xb6\x17\xf2\xcd\x65\x59\x67\x24\x36\xcb\x26\x59\x81\x74\xc3\xb2\x6d\x10\x51\xc1\x18\x10\x9d\xe9\xe6\x47\x12\x14\xec\xd5\x36\x26\xfb\xfb\x7f\xa4\x8d\xd2\xf9\xfe\xef\x82\x28\x0a\xf2\x51\x14\x4b\xdd\xc9\x92\xcb\x4d\xbb\x13\x94\xcf\xcc\x45\xc1\x36\xe2\x95\x5d\x4f\x29\x5b\x64\x60\xcb\xa4\xdb\xad\x5a\x1b\x68\x0e\xeb\x48\x30\x1c\x8e\x36\xea\x28\x5f\xd3\x82\x5a\x57\xe9\x36\x27\x12\x3f\xa7\xeb\x9c\xd1\x29\x1a\x19\xd9\x2f\x17\x6b\x56\xb7\x4d\xd1\x46\xd6\x15\xe3\xae\xd4\x64\xe8\x1c\x53\x1a\x39\x0d\x40\x6a\x4c\xd9\x28\x94\x73\x93\xa2\xc9\x8b\x22\xa1\x0e\xe2\x6a\x73\x06\xcc\x64\x49\x51\xb6\x94\x2f\x8a\x76\xb1\x2d\xf7\xff\xfa\xeb\xfc\x6a\xf1\xe2\xae\xa1\x9e\xea\x9a\xda\x69\xd7\x14\xa4\x4e\x7d\x19\xa6\xf2\xa2\xd3\x4c\x68\xdf\x2c\xcf\x6d\x6f\x56\xee\x2c\xd9\xc9\xa2\xbf\x1c\x7a\xa3\x55\xd3\xcb\x6b\x43\x44\x55\xb2\xa4\xa9\x1e\xba\x66\x72\x36\xda\xfc\x30\xf5\xc2\xcc\x36\x13\x4d\xaa\xda\x2b\x8e\xe2\xc3\xee\x9c\x5a\x0c\x3c\xa1\x96\xb5\x89\x26\x3f\x2b\x07\xa3\xc2\x90\xe0\x96\x4c\xb0\x28\xe5\xc8\xdc\xb4\x62\xb9\xda\x28\x91\xe8\x59\x9e\xe3\x6a\x71\x51\xb7\x1a\x81\xbf\x98\x32\x2d\x59\x5f\xb1\x7c\x8e\x6d\x47\xf9\xc0\xb0\x93\xbe\x27\xed\xa8\xbf\x1e\x67\x97\xb6\x77\x1e\x88\xb3\xb7\x2d\x9e\xc3\x94\x8b\x14\xa0\xe3\x78\x00\xb0\xa4\xc0\x39\x9e\xc3\x7b\x90\xa6\x18\x1c\x01\x8f\x62\x08\xdc\xe1\x38\x06\xc7\x11\x03\x19\xda\x43\x04\xcb\xd0\x90\x11\x00\xe9\x3a\x48\x70\x70\x06\x0a\x88\x12\x8e\x3b\x75\xe3\xd0\xca\xd6\xf5\xc9\xd2\xd8\xb6\x50\xa9\x0c\xea\x8a\x8a\xcc\x46\xc1\xa1\x67\xed\xae\xad\xd7\xc2\xae\x55\x32\xf4\x69\x0f\xe6\x86\xb5\x16\x99\x5a\x4b\xe5\xa3\x31\xff\xca\x76\xce\x0f\x37\xfe\xb0\xa5\xb3\x6f\x7c\x00\x92\x34\x81\x93\xcd\x8d\x27\x97\x8e\xcf\x6f\x2d\xdb\x04\xad\x5c\xe8\xa2\x5e\xa3\x42\xc3\xc1\x44\xac\xb7\x68\x41\xd1\x67\xbe\xd0\x1b\xd4\xf1\xa5\x3b\x28\x43\x9a\x9c\x04\x2b\xb6\xb6\xe8\x00\x42\x2b\x1f\x42\xbb\xb0\xf9\x97\xac\xc2\x2c\x3f\x1d\x57\x3b\x33\x6e\xc8\xd7\x89\xc2\x94\x27\x14\xcd\x25\x44\xa3\xa3\x36\x73\x6a\xd0\x54\xc7\x3e\x99\x1b\xcf\x3b\x15\x9a\xd9\x33\x59\x19\x3c\xe9\xde\x8f\xf4\x84\x24\xd2\x02\xdd\x1b\xc4\x74\x8e\x6a\x4c\xa3\xea\xbc\x9d\xcb\x1b\x6d\x8e\x51\xaa\xb5\xba\x6d\x58\x85\x29\x9c\x99\xd1\x3c\x08\x46\x96\xa2\xcd\xc2\xbc\xd4\x24\x92\x79\x73\x66\x44\x86\xb1\x10\x35\x22\xa9\xa8\x69\x27\xb0\x07\x1d\xb6\x57\xa2\xf1\x95\x3f\x67\xec\x7e\xb1\xdb\x27\xcb\x85\xbd\x67\xc8\xdd\x27\xb3\x2b\xe9\x91\xe1\xa3\x6e\x98\xa8\xd8\x05\x39\x33\xc5\xc1\x54\x4e\xd4\xd9\x6c\x15\x64\xb9\x86\x3c\x54\xd4\xc2\xa8\xcf\x86\xda\x8a\xad\x55\x7a\x3d\x65\x20\x73\x4c\x7e\x6e\x0b\x4e\x4d\xe1\x56\xd3\xc2\x30\xa9\xcb\x82\x23\x37\x9c\x16\xd3\x2a\xb7\x72\xe3\x46\x4e\xaf\xd1\x89\xd1\x2a\x4b\xe3\xb2\xee\x8b\xf8\x96\x2f\x75\xd6\x68\x8a\x40\x89\xa9\x59\xac\x28\x42\x51\xa9\x34\xd1\x12\xe9\xed\x5e\x15\xd5\xbd\xd8\xd7\x85\x92\xd0\x1b\xb3\x0a\xeb\xb8\x33\x5c\xe9\xc1\x71\x41\x18\x01\xaa\x18\x2f\x69\xa1\x2b\xdb\x73\x98\x63\x4a\x74\xbe\x37\x37\xaa\x66\xb5\x17\x69\xe5\x4e\x30\xf1\x04\x62\xcb\xd7\x13\xfe\xd6\xdf\xf7\xff\xfc\xd9\x6c\x76\x73\xb4\x7f\xcc\x7f\xeb\xa6\x43\x14\x38\x79\x6e\x05\xb5\x9c\x90\xaf\x90\x35\x9d\xef\x76\xf2\x4d\x2d\x48\xed\xbc\xb6\xac\xf4\x44\x5a\x40\x7c\xd6\x83\x8d\x7c\x3a\x9b\xfa\x76\x68\x31\x9a\x88\xb4\x7c\x2e\xb7\xaa\x2e\x86\xf6\xa8\xd7\x4d\x40\xd6\xaa\x0f\x61\x6e\x66\x66\xc1\xd4\x64\x9a\x81\x56\x2e\xcd\xbb\x9b\xfe\xe7\x86\x30\xcd\xc4\x8e\xd2\xab\xe0\x16\xd9\x27\x09\x81\x65\x3d\x87\xc8\x77\x4c\x32\x5f\x9c\xdb\xa3\x99\x58\x62\xc3\x0e\xc5\xb7\xa5\xca\x66\x3e\x59\xdc\xe0\x2f\x32\x51\x25\x6d\xb9\x61\xd7\x68\xb9\xbd\x69\xda\x99\x34\x4b\x52\xea\xc0\x2e\x3e\x96\xc7\x1e\x94\xca\x55\xa5\xdf\x0e\x83\x99\x5a\x1e\x00\x71\x93\x3d\xef\x33\x01\xe9\xfc\x72\x71\xf8\x68\x1f\x3e\x9e\xfb\x67\x5f\xbc\xf7\x90\x9c\x85\x55\x6e\xaf\xe5\x15\xa9\xa9\x93\x1e\xd5\x43\xf9\x4e\x89\x6a\xb6\x87\x5c\x5d\x98\x7b\x54\x2c\xd4\xb8\x1c\xef\xa5\x66\xbc\x1c\x2c\x54\x29\x2f\xb2\xc1\xbc\xc1\x94\x65\xdf\x77\xe5\x80\xa4\xed\x69\xc1\x31\x08\x86\x82\xb0\x3f\x75\x29\x58\x4b\x8a\x53\x39\x55\xd8\x4a\x6f\x39\x97\xaa\x75\x87\xe7\xb5\x8d\x15\xad\x4d\xab\x38\x1a\x18\xac\xb8\x14\x64\xdc\x4c\x8a\x4a\x7f\x06\x09\x8e\x20\x6c\x81\xef\x0e\xe9\xb1\x36\x1a\x0b\x75\x8e\x19\xc9\xd4\xec\x25\xed\x9f\xdf\xdf\xfe\x5c\x4f\x4c\xb9\xf9\xa6\xfd\xab\xd5\xcc\x9d\xf4\x9a\xd3\x85\xd9\x6d\x75\x40\x30\x63\x6a\x0b\xc7\x9b\x13\xd5\xba\x93\x96\x46\xc6\x1c\x55\xba\x36\xe9\x2b\xb6\x30\xed\xe4\x85\x49\x5b\xc7\x09\x58\x94\xa0\x48\xf5\xb5\x22\x35\xa9\x2c\x23\x82\x98\x3b\xca\x92\x9d\x92\xac\x14\xd1\xda\x94\xad\x8d\x96\x39\x58\xdd\x58\x79\xbc\xff\xe5\x87\xda\x7f\xff\x71\xd4\xff\xe2\xa0\x3e\xf6\x6b\x56\x54\xa5\x1c\xb7\xc8\xe7\x61\xcd\xa0\x40\x77\x50\xe9\xb5\x8b\x83\xc6\xca\x14\x74\xb9\x35\x56\xad\x1e\x68\xf7\xb8\x48\x99\x70\x8d\x65\xa2\x56\xac\x41\x59\x23\xe7\xe2\x3c\x27\x77\xbb\x68\x06\x2c\xaa\x55\xa7\xcd\xa0\x28\x58\x4e\xa0\x37\x35\xc3\x18\xf0\x5b\x2b\x55\x76\x88\x7c\x6a\x38\x8e\xca\x7c\xb3\x18\x14\xf2\xa8\x0f\x29\xce\xec\xa4\xa5\x6a\x75\xd5\x6e\xf1\xf3\x96\xdf\x93\x80\x9c\x31\x1a\x53\x13\x5f\xd1\xff\x37\xda\x2b\x6e\xd6\x97\x5a\x74\xb7\x4d\xcc\x9d\xa2\x9d\x75\x49\x21\x7d\x27\x05\xb8\xd1\x6c\x34\xdf\x88\x2f\x3d\x85\x90\xa6\xb9\x68\xd8\x53\x43\x0f\xae\x92\x56\x9e\xe9\x99\xaa\xde\x14\xd4\xc6\x04\xb5\xdc\xa1\xd7\xe0\xab\x4a\x87\xaf\xc1\x59\xa6\xab\x66\xbf\xda\x68\x51\xe4\x84\x9f\x30\x0d\x6f\x9e\x0b\x16\x54\x45\xce\xb7\x23\x5a\x9c\x30\x4e\x3d\x0a\x2a\xc5\xa9\x1e\x15\x51\x55\xda\xfa\x27\xd7\xd5\x78\x91\x1b\x06\x7d\xc5\x44\xb8\x6b\xdb\x5c\xab\x04\x0b\xf5\x05\x5b\xcf\xcf\x83\xd2\x14\x52\x76\x81\x60\x40\x85\x2a\xfb\x44\x7d\xbf\x34\xb4\xf5\x87\xf3\xf8\x3e\xb4\x5f\x3d\x7c\xa9\x5c\x3a\x7f\xf9\xd8\x9c\x77\x07\xdd\x71\xed\x32\x1f\x96\xbb\x2c\xa7\xf6\x86\x0f\x6e\x6c\xf6\xaa\x39\x11\xf0\x4b\x2d\xc7\x8f\x19\xb3\x95\xb9\xd0\xce\x34\x8f\x5c\x89\xab\x9c\x49\x31\x4d\x56\x02\x41\xdb\x63\xc2\x24\x75\x57\xf6\x8c\x99\xcb\xc8\x4a\x2b\x39\x43\xb2\x20\x44\x1a\x17\xe5\x5b\x19\xac\xe3\x26\xe2\x96\x88\x13\x2b\xd4\xc8\x18\xb6\xeb\xf2\xb3\x7c\x9c\xb7\xef\x2e\x3e\x94\x0f\x48\xb9\xdc\xfe\x44\x6d\x19\xab\x88\x15\x08\x95\x1e\x25\x89\x59\x0e\x4a\x79\x3d\xe9\x69\xd3\xd2\x44\x06\x4a\xbb\x49\x34\x79\x5c\xcc\x2d\x8d\xe6\xb4\x66\xc5\x25\xa9\x39\xaa\xb5\xdc\xb2\xcc\x9a\x26\x4d\x2f\x96\x5e\xbe\xe5\x47\x83\x7e\x6b\x34\xb6\x02\x76\x3c\x1e\xe0\xf9\x84\xf6\x33\x53\x29\x1c\xf0\x49\x07\x7c\x3f\x7c\xfd\x7d\x3f\x7b\xba\x90\x73\xbe\x3d\xb7\xbf\x7d\x28\xe8\x72\xce\x49\xe0\xf7\x68\x0a\x51\x3a\x8f\xe2\xd1\x04\x24\xc9\x64\x10\x83\x04\x5d\xd0\xd4\x44\x49\x8a\x59\x05\x15\xd3\xb7\xc2\xd8\x37\xcc\x42\x93\x14\x8d\x1d\x14\x63\x24\x4e\x30\xf7\x18\xf2\xa2\x18\xa2\x04\x4e\xa2\x30\x44\x8b\x34\x00\x59\x08\x07\xe7\x86\x36\x0f\xdd\xdc\xa3\x6c\xbb\xfe\xb8\xdb\xd4\x4e\x2e\xb7\xff\xff\x6e\xf6\xc0\x7f\x4b\xfd\x31\xfa\xed\x4f\x0c\xdf\x6e\x89\xff\xb6\x7b\x8b\xc1\x6f\x7f\x62\xdb\xf3\x9b\x2f\x07\x20\xf9\xed\xcf\xed\x23\x3f\x9b\x2f\xff\xbd\x13\xf6\x10\xba\x4f\x70\x0c\x16\xe9\x22\xf1\x57\x77\x8a\xc7\x28\x41\xf1\xec\x23\xe1\x4f\xff\xbe\x8b\x0a\x90\xa4\x9b\x7b\xd5\xdd\xdd\x3d\xa3\x17\xa8\x78\x7a\x5d\xf6\x0e\x1c\xbb\x19\x3e\x88\xe1\xc0\x9f\xed\x4e\x5e\xe9\x92\x43\x1f\x10\x3b\x42\x36\x74\xc4\xbf\xfd\x89\xfd\x36\x23\x88\x7f\x11\xff\xc2\x7f\xdb\x9d\x80\x59\x1c\xa3\x30\xd5\x36\x4d\xfb\xed\x4f\x8c\x3a\xfd\x5e\xda\x3c\x4e\xb0\xe6\xed\x7f\xef\x89\x3c\x50\xba\x97\x5c\x2b\xc6\x49\x24\x90\x24\x45\xf1\x04\x41\xe2\x24\xcf\x51\x24\x2b\x40\x9c\x75\x70\x92\x46\x34\x2e\xb8\x2c\x47\xd3\x14\xc1\xe2\x9e\x07\x1c\x17\x21\x92\x87\x3c\xa4\x79\xc0\x31\x24\x81\xe3\x38\x09\x77\x88\xf6\x7a\xd7\x5e\x7c\xd2\x81\xfb\x33\x9b\xb6\xaf\x5d\xee\xe4\xd4\xbf\xcf\x7e\x9f\x84\x60\xb2\xc6\x85\x3c\x8a\x00\x24\x0e\x28\x81\x47\x88\xa3\x20\x22\x49\x92\x63\x10\xe0\x09\x8e\xe3\x78\xd6\x01\x90\xa1\x59\x86\xf5\x28\xca\x85\x90\xf6\x28\x0f\x41\x16\x77\x19\xc6\x75\x3d\x82\xa5\x5c\xe1\xb7\x4f\x17\x2c\x5c\xe3\xe0\xc9\xe3\xc7\x39\x20\xbe\xbe\x3f\x17\x65\xe9\x24\x4b\x5f\xdb\xf6\x5b\x0c\x3f\xdd\xea\xff\x68\x86\xef\xf3\xb2\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x9f\xc8\xc1\xe6\xd3\xff\xd9\x4e\x5e\xae\xec\xc6\x5c\x79\x8c\xe5\x89\x4d\xe4\xab\x4f\x0d\xfc\xe8\x0e\xcf\xc9\x93\x03\x87\x1b\x5b\x48\x40\x92\x1c\xa4\x04\xc8\xd2\x80\xa6\x3d\xc8\x01\xc7\xa5\xa1\xc0\xf2\x84\x40\x33\xac\x87\x53\x82\x20\xe0\xac\x4b\x90\x90\xe6\x58\x97\xc3\x1d\x1a\x27\x1d\xcf\x75\x48\x81\x75\x59\x40\xed\x6e\x91\x3a\xd9\x09\xaa\x89\xa7\x2b\x5d\x92\x9f\x97\x70\x0d\xaf\x14\x97\xe9\x60\xae\x13\x41\x17\x07\xcb\x49\x44\x08\x7a\x69\x31\xd3\xe4\xa5\xc1\xa4\x92\x02\xe5\xd6\x6c\xae\x0a\x73\xaa\x9f\xc6\x46\xd8\xbb\x67\xd5\xe3\xea\xaa\xd1\x66\xa5\x42\x7e\xc6\x7e\x37\x9f\x83\x67\xfa\xee\xb4\xff\x7e\x8f\xf8\x32\xef\x14\xeb\x20\x0e\xf7\x1c\x8e\xe3\x49\x4f\xe0\x71\x02\xba\x10\xb9\x90\x20\x71\x16\x91\x84\x27\x08\xa4\x40\x41\x41\xe0\x59\x1c\x10\x0c\xa2\x69\xc2\xa3\x39\x5a\xe0\x68\x0e\xe0\x80\xe2\x80\xb3\xe5\x9d\x7c\xcf\xfb\x2f\x6a\xf7\xab\x78\xe7\xe9\xc3\xef\xcb\x3f\x81\x77\x01\xe7\x79\x1c\x40\x86\xe2\x09\xc6\x05\x90\xa7\x69\x02\xb8\x2e\x4e\x92\x38\xe0\x58\x8a\x40\x1e\x83\x00\xa4\x5c\x86\x83\x24\xe2\x05\x96\xa2\x11\x10\x1c\x86\xc4\x29\x8f\x25\x00\x8f\xe8\xfd\x4d\xdc\x2f\xe6\xfd\xd1\x76\xbf\x8a\x77\xee\x68\xb9\xba\xf6\x13\x78\x77\x19\xc6\x41\xa4\xc0\x42\x96\x22\x01\xee\x02\x82\x64\x05\x9a\x64\x71\x84\x18\xc1\x45\x94\x43\xe1\x0c\x4b\x10\xac\x47\xe1\xbc\xeb\x11\x0e\xe5\xf2\x2c\x47\xf1\xb4\x03\x68\x07\x32\x38\xe1\x6d\x79\xa7\x5f\xce\xfb\xa3\xed\x7e\x15\xef\xcc\xfc\x43\x43\xcf\x8d\x33\x38\xe5\xf1\x38\x10\x28\x57\x58\xbb\x3d\xed\xb1\x90\x10\xa0\x03\x08\x9c\x84\x04\xc3\x0a\x04\x64\x70\x8e\x76\x71\x40\x33\x8e\xe7\x02\x81\x76\x28\x08\x09\x9a\xa7\x09\x80\x3c\x07\xd0\xbb\x1b\x06\x6f\xf2\x2e\x13\x99\xe4\x96\xa2\x66\xd6\xaf\xcd\xea\x69\x81\x93\x06\x65\x8d\xd2\x91\xe0\xb6\x4c\xaf\x58\xce\x55\x7c\xa6\x32\xb3\x8d\xfd\x4e\x96\x58\xb1\xe5\xdc\xae\x51\xb7\x76\x02\x6f\xf3\x5e\x78\xce\xbe\x01\x1f\xb3\x7f\xf7\x38\xc3\xf0\x14\x49\xf1\x1e\x14\x04\x97\xe4\x3c\x9a\xf6\x58\x87\xc5\x11\xc5\x12\x04\xee\x70\x2c\xeb\x31\x24\xe1\x39\x10\x38\x0e\xcb\x7b\xb8\x80\x08\x17\x38\x02\x01\x69\x9c\x44\x14\xce\x32\xfc\x96\xf7\x0f\xc6\xf7\x0c\xc8\x4e\xab\xd3\x23\x0b\x41\xa7\x0d\xe2\x16\x6b\x2f\xe6\x4e\x9b\x2a\xea\x95\xfe\x24\xa4\x44\x4b\x1e\x94\xd5\x09\xb3\xdf\x41\x7b\x39\xef\x8f\xd8\xff\xd9\xbc\x43\x86\xe6\x08\xca\x63\x70\x88\x68\x8e\xf2\x78\x96\x20\x18\x86\xe6\x49\x48\x02\x9c\xe5\x11\xeb\x12\x38\x2d\x10\x80\x75\x3c\x81\xa3\x70\x92\x74\x18\x0f\x72\x82\x80\x68\x8a\x65\x79\x9a\xa4\xf7\xcf\x11\xdd\xe0\xfd\x07\x77\x82\x5e\xce\xfb\x23\xf6\x7f\x36\xef\x1c\xc3\xb2\x8e\xcb\x3b\x34\xef\x32\x0e\xf0\x58\x9e\x85\xbc\x20\xb8\xb4\xc7\x23\x8e\x22\x21\x22\x58\xe0\x12\x80\x06\xb4\xe7\x7a\x8c\x03\x19\x1a\x32\x80\xf1\x58\x8a\x75\x1d\xe0\xe1\xc2\xee\xc6\xe4\xdb\xe3\xbb\x9c\x45\x54\x94\xd2\xcc\x54\x36\x95\xc5\xa4\x9e\xa7\xa2\x92\x9e\x5b\x11\x5c\x63\xe9\x27\x44\xe0\xd5\xd4\xee\xb8\xde\xee\xc7\x99\x95\x6b\x8a\x3f\x83\xf7\x47\xec\xff\x6c\xde\x11\xc3\x00\x86\xa3\x20\xc9\x39\x88\xe2\x3d\x16\x21\x8f\x86\x80\x66\x48\x92\xa1\x71\x44\xb3\x02\x4b\x78\xa4\xeb\x42\xc1\xc1\x11\x58\xff\x45\xd0\x14\x8f\x43\x57\x60\x1c\x40\xe3\x1c\xb9\xe5\x9d\x79\xcf\xfb\x2f\x8a\xf3\x4b\xbc\x3f\x62\xbf\x46\xff\x5c\xde\x69\x0a\x22\x06\xd2\x02\xe5\xb0\x2c\xce\x13\x02\x21\x38\x90\x81\xb4\x27\x00\x1e\x07\x34\x24\x59\x8e\x61\x09\x52\xf0\x20\x8e\x38\xc7\xa5\x1c\xca\x65\x1d\x00\x08\x04\x10\x20\x58\x8e\xc4\xb7\xbc\xb3\x37\x79\xff\x3b\xe3\xfc\x12\xef\x8f\xd8\x7f\x8e\xf7\xab\x73\xe0\xd7\x4c\x80\x7f\xf6\xec\xb7\xa8\xf1\xa5\xfa\xac\x3e\x72\xaa\x64\x49\xa4\xda\xad\x61\x23\xae\x8e\x87\x1d\x1c\xf7\x8a\x7c\xa2\x95\xb9\x31\xae\x34\xe6\x95\x76\x5e\xec\x50\xe2\xfe\x3e\x92\xcd\x71\xe3\x3e\x92\xed\x11\x4f\x75\x56\x43\x06\xe8\x0f\x17\x35\x60\x9b\x02\x2b\xad\xbc\x44\x40\x38\x8c\x62\xbd\xd7\x59\x49\xed\xca\x48\x8d\xaa\x6f\xf7\x85\x88\x72\x4b\x9c\x1d\x3f\x5d\x26\x6d\xb3\xce\x75\x27\x17\x52\xaa\x3a\x1f\x03\x33\x33\x5d\xd5\xb2\x17\xae\xa8\x22\x87\x35\xea\x28\x5d\xd6\xab\xe5\x36\x58\x05\x8e\x55\xab\x0d\xc6\xa5\xaa\xae\x15\xe8\x64\x3a\x50\xa6\x76\x0f\xd6\x4d\x3c\xc8\x75\xf2\xc6\x24\x17\x25\xed\xb1\xce\xe6\x54\xbb\xeb\x24\x2b\x8e\xa9\x93\xc3\x22\x3d\xab\xd5\x3e\x7f\xc5\x3e\x27\xd3\x72\x38\x67\x16\xa3\x89\x92\x2f\x4d\x85\x66\x05\x48\x81\xea\xcc\x8d\xde\xa8\x88\x5b\x8b\x92\xd3\x91\x71\x31\xce\x3b\xd5\x36\x31\x3d\x64\xda\x37\x38\x38\x78\xc6\xc9\x1d\xb4\x47\xb2\xdb\xa7\x3e\xc4\x5f\x97\x85\x8b\x2f\x98\x05\xa8\xcd\xb6\x34\x79\xc2\xbe\x28\xfe\xba\xab\xe4\xa5\xd1\xf2\x67\x2f\x75\x3c\x1e\x64\x37\x6e\x56\xdb\x1e\x06\x29\xe7\x45\x83\x66\xba\x52\x81\x4a\x4b\x2d\xd5\x20\x1a\x94\x88\xd7\xd0\xc8\xe4\x2b\x0d\x36\xd4\x09\x51\x40\x6d\xff\xed\x66\x9b\x5b\x41\x26\x52\x8b\xb6\xb3\x30\x0d\x27\xec\xd5\x7c\xa9\xa8\x56\xb5\x4a\x3d\xf3\x2a\x5a\x3f\x6b\x26\xa5\xca\x62\x29\x26\xa6\xc9\xa8\x42\x6f\xc8\xb0\x04\xe8\x84\x33\x3d\x5f\x6a\x35\x2a\x8e\x9a\x28\xd0\x4f\x8b\x4e\xdf\x17\xdc\x76\xcb\xad\x36\xba\xb3\x71\xab\x2d\xfb\xab\xb2\x3b\xd6\xca\x85\x75\x20\xe8\x31\x33\xcf\x51\x48\xce\x75\x45\x48\x19\x94\x54\x2e\xd2\x83\x5c\xaf\xda\x5c\xf6\x06\xfd\xa8\xc5\x28\x25\xdc\xad\xb8\xa5\xa8\xaa\xb3\xc9\x1e\xd8\xaf\x0f\xb2\x67\x9d\xfc\xc9\x20\x9b\x72\xf9\x66\xa1\xf7\xc2\x20\xfb\x3b\xa7\x00\x77\x05\xd9\x8b\xd7\xb5\x1e\x0f\xb2\xc2\x19\xfa\x77\x0e\xe7\x8c\xfb\x63\xa2\x45\xba\x7d\xa6\x45\x8c\xa7\x04\x0a\x6a\xb0\x48\xa4\x8b\xa1\xd5\xad\xf6\x84\xb9\xd2\x8f\x2c\x09\xa0\x36\x6f\xfb\xea\xe6\x31\xa1\x1b\x41\x26\xb9\x1d\xba\x91\x2f\x0e\x56\x53\x3e\x1f\xe7\x32\xde\xd4\x72\x89\x1e\xfb\xa5\xc4\x62\x82\x36\xd1\x4a\x73\x02\x92\x11\x1e\x86\xed\x9a\xde\x5c\xd5\xfa\xd0\x76\x40\x8c\x4c\x27\x9e\x14\xc8\x7e\xcc\x17\x86\xad\x6c\x0c\xc7\x93\x56\x49\x98\x17\xc9\x62\x27\x6d\xcf\xe6\xab\x4e\xa4\xad\x03\x61\x54\xee\x57\x17\xcd\x7e\x8b\x4c\x06\x4a\x31\xc5\xe5\x72\xd5\x1d\x96\x66\x9d\xe9\x5c\x68\xf1\x5a\x14\x0c\x9b\xd3\x31\x51\x2e\x08\x83\xa9\x71\xe8\xb1\x5f\x1e\x64\x4f\x3b\xf9\xb3\x41\xb6\x8c\xeb\x6a\xe5\x85\x41\xf6\x77\xae\x6f\xdc\x15\x64\x2f\x5e\xc4\x7c\x3c\xc8\xce\x57\xe6\xdf\x39\x5c\xea\xf4\x3b\x0d\x56\xe1\xa2\x82\x86\x6b\xf5\xdc\xbc\x6b\xc9\xc2\xaa\x33\xeb\xb4\x9a\xd4\xc2\x37\xfd\x6e\x66\x39\x44\x61\x36\xae\x6b\x68\x73\x0b\xf4\x8d\x20\x93\x65\xad\xbd\x98\x6a\xae\x3b\x1c\xa9\xa3\x45\x71\x65\x2e\xcb\xed\xc6\x94\x2a\x24\x0b\x95\x63\x5c\x2e\x0b\x2a\x11\xd9\xab\x2c\x2c\x8e\x12\x6a\xdc\xac\xd5\xaa\x99\xb2\x5a\xe8\x2f\xb9\xb2\xc5\xfb\xf2\xb8\xd1\x63\xf3\x2c\xb3\xe4\xca\xcb\xb8\x12\x28\x8a\xb7\xaa\xf8\x60\xd6\x55\x8a\x9b\xdb\x38\x5b\x33\x3f\x48\xba\xcb\x48\x8f\x2c\x60\x57\xfa\x5c\x10\x22\x63\x25\xb5\x95\x36\x3f\x1f\x7a\xc5\x15\x59\x84\xb4\xc5\x5a\xbc\x2d\xf1\x7b\x60\xbf\x3e\xc8\x9e\x75\xf2\x67\x83\x6c\xd2\xd1\x8b\xcf\xa4\xab\xa2\xf8\xeb\x16\x6f\xef\x4b\x17\x5f\xbb\x62\xfd\x5f\xfc\x6c\xc7\x3a\x10\x6a\x85\x9c\x38\x6d\x92\xf5\x58\x6d\x92\xf3\xde\x92\x55\xe4\x79\x0b\x34\x16\x75\x57\x97\x47\xed\x3c\x39\xb1\x56\x2b\xc9\x52\x8a\x59\x8e\xfd\xe8\x4a\x66\x9f\x76\xe4\x49\x90\x6d\xf8\x2a\x9c\xb7\xff\x81\x41\x68\x18\x1e\xf8\xbf\x72\x5c\xbd\x2f\xfe\x1d\xff\x4f\xda\xbf\x32\xc0\x7c\x60\xff\xe2\x4a\xce\xb3\x3b\x14\x0f\xed\xc4\xfe\x44\xfb\xb5\x1b\xf6\xef\x4b\x57\x5f\xbb\x3d\xf2\x5f\xfc\x00\xdb\x3a\x10\x83\x6e\x6d\x38\xe4\xc7\x6e\x25\xdf\x30\x01\x59\x18\x76\x1b\x32\xd5\x9b\xd9\x83\x1c\x3f\xe5\x80\x29\xa3\x12\xc8\x1a\x0b\x51\x1b\x4a\xc1\x01\xf8\xab\x82\xfc\x81\x74\x7e\x68\x1c\xf8\xbf\x72\xdc\x1f\xe4\x4f\xda\x7f\x61\x90\x3f\xbb\x4c\xfd\x6c\x90\xbf\xda\x7e\xf9\x86\xfd\xbb\x82\xfc\xc5\x7b\x71\x85\xb4\x3f\x9b\x17\x32\xa3\x2d\xd6\x05\xae\x41\x34\x9a\xa9\xed\xce\xf5\x42\x69\x52\xc8\xcb\x36\x9a\xac\xdc\xba\xd9\x09\xa2\x10\xfa\x5a\x4b\x7c\x45\x90\x7f\xfc\x2a\xaf\xbd\xfc\x7e\xa2\xbf\xbe\xbc\xda\x9c\x31\x8c\x29\xbb\xe3\x5b\xcb\x39\xef\xdb\x1e\x4f\x2e\x46\x59\x84\x46\x95\xa8\xd1\x33\x5b\xe6\xaa\x5e\xe0\xca\x8c\x11\x2d\xaa\x09\x54\x8d\xfa\xa2\x85\xf7\xb5\x88\xcf\x0f\x87\xa5\x4a\x5e\x68\x57\xfd\xa2\xd4\xb6\x7a\xd5\xce\x14\x80\x52\x33\xb7\xf2\xab\x34\x5f\xdf\xac\xae\x2e\x6c\xd8\x14\xea\xab\x11\xcc\x0f\x06\x6a\xcb\x92\xe7\x53\x29\x62\x52\x45\x19\x01\x90\x0f\x56\xa2\x9f\x7a\x0b\x26\x1c\xe9\xe3\x81\xfc\xfa\x2b\xf9\x03\x0b\x63\x2f\x0d\xf2\x27\xed\xbf\x30\xc8\x9f\xdd\x13\x79\x36\xc8\x5f\x6d\x5f\xb9\x61\xff\xae\x20\x7f\xf1\xc6\xef\x3f\x8f\xe2\x9e\x3d\x8a\xbb\x0d\x50\xb7\x0d\x04\x1f\x1f\xb6\xb2\x19\x28\x2e\x2b\xa1\x9d\x33\xe0\x72\x35\x00\x69\x71\x34\x31\x29\x62\xa6\x36\xd5\x89\xd7\x25\x49\x96\xaf\x7c\xb4\xb5\xf2\xe3\xc1\xff\xc0\xd6\xd3\x4b\xd3\xf8\x27\xed\xbf\x32\x8d\x7f\xf2\x06\x80\xa7\xd3\xf8\x9f\x61\x5f\x3b\x7b\xa3\xea\x33\x83\xc1\x8b\xef\x46\xf8\x2f\x7e\x2f\xc1\xe6\x3d\xab\xad\x49\xc7\x94\x51\xce\x30\x9d\x4c\xa8\x4d\xd4\x72\x50\x37\x1a\x93\xae\xa7\xb9\x4b\xa7\x30\x05\x6d\xc5\x36\xc4\x55\xaf\xcd\xd6\x4b\x87\x40\xfb\x0f\x49\xeb\xcf\xf9\xdc\xf5\xc7\xdf\x96\xd6\x9f\xf7\xff\x7d\xf6\x7f\x4a\x5a\x7f\x3e\x08\xde\x4a\xab\xc5\x9f\x90\xd6\xff\x88\xfd\xbb\x82\xfc\xc5\xb7\xbe\x3c\x9e\xd6\xbf\x3a\xc8\x37\xe7\x25\x52\xf5\xbb\xcb\xdd\x48\x78\x76\xfe\x90\xe6\x17\xb2\xae\x30\x8a\x69\x29\x5e\x95\x67\xdc\xd2\x19\x09\x6d\x86\x58\x58\x74\x9a\x77\x6a\x05\x93\xce\x7b\x81\x19\xa9\xd3\x56\x2f\x3f\x46\x4b\x82\xd2\xad\x7c\x28\x56\x98\x2a\x1e\xd2\xb4\x5a\x59\x2c\xe8\x59\x36\x14\xda\xcc\xa2\x50\x17\xb8\x59\x85\x4b\xc4\x10\xd5\x59\xbd\x27\x6e\xe6\xf2\x75\x9e\x81\x56\x33\x1d\xcb\xd2\xa8\x37\x53\x17\xe6\x38\x92\x47\xf3\xb1\xdb\x56\x26\x79\x91\xe1\x70\xce\x6c\x67\xd3\xd2\x94\x1d\xf4\x96\x07\x60\xff\x21\x69\xfe\x95\x0c\xec\x6f\x4b\xf3\xaf\xf8\xc3\xaf\x48\xf3\xcf\x83\xee\x56\x9a\x2d\xfe\x84\x34\xff\xa2\xfd\xd2\xe1\x55\xef\x97\x63\xe1\xc6\x2d\x58\x37\xca\x48\xfc\xe8\x7d\x58\x67\xa5\x24\xde\xc6\x95\xe3\x1b\xa9\xb6\x2f\x3c\x3e\xf8\xec\x85\x81\xe9\xba\x96\xfd\xaa\xe0\xf6\x35\xc9\xef\xb4\x5c\x2d\x7d\xfb\xbe\x22\xf8\xbe\xe4\xef\x5b\xb9\x89\x0f\x9a\x79\x5c\x9a\x7c\x53\x90\xfc\x48\xe3\xe6\xe9\x31\xb1\x50\xb8\x50\xa4\x73\x6f\x10\x33\x1b\xe5\x9a\xd8\xe8\x62\x55\xa5\x8b\x7d\xd9\xd7\x2f\xfa\xba\x2f\x8e\x7b\xb5\x54\xed\x59\x91\xf4\x57\x01\x4f\x6e\xa0\x4e\x6e\x41\xbe\x54\x3a\xf4\x50\x17\xfe\x69\x78\x0e\x08\x2f\x21\x7b\x33\x70\x0a\x6a\x5b\xad\xec\x76\x5d\xd1\x9b\x05\xf1\x9f\x86\x7b\xa2\xfc\x12\xf0\x1b\xd6\x31\x5b\x2f\xd7\x6d\x05\x3b\x94\x30\xf9\xa1\x96\xbc\x86\xef\x1f\x6c\xc0\xfb\x3e\x38\x94\x5a\xbd\x52\x26\xf4\xad\xb2\xe4\x6b\xf0\x6e\x95\x5d\x02\x7a\x64\xe6\x14\xe1\xae\x78\xe5\xe5\xa2\x95\x6f\x95\x15\x5f\x02\x6e\xa3\xeb\x12\xb6\x83\x91\x53\x68\xfe\xe4\xeb\xa6\x94\xe5\xcd\x22\x8d\x27\x7f\xbc\x0a\xe9\x91\xca\x8b\x80\xcf\x4d\x5e\xea\xf4\x2b\x95\x1c\x77\xff\x7b\x1d\xd2\x24\x73\xae\x60\x7c\x33\x73\x8a\x6e\x53\x04\xf2\x46\x59\xc7\xa3\x8f\x2f\x02\x79\x50\x78\x09\xe8\x99\xb9\xbb\xc6\xb0\xa3\x77\xd6\x1e\x15\x09\x7c\x0d\xda\x83\xc2\x4b\x68\xcf\xcc\x9d\xa2\x7d\x2b\x8e\x78\xa3\xf8\xe0\xd1\xc7\x57\xe1\xdd\x2b\xbc\x88\xf7\xd4\xdc\x29\xde\x7d\xfd\xc2\x1b\x75\x09\x8f\xab\xbf\xbd\x06\xf0\x41\xe1\x25\xc0\x67\xe6\xae\xa6\x06\xdb\xba\x84\x5f\x0f\x45\x07\x6f\x16\x9e\x3b\x2d\xd3\xf6\xa2\x76\x1c\xa9\xbc\xd8\x92\x73\x93\x97\x46\x89\x04\x4d\xbf\xbe\x55\x5a\xbb\x5e\x14\xee\xa8\x24\xda\xab\xb0\xdf\x04\xfe\x14\xea\xb3\x14\xf5\xac\x52\xd9\x6b\xf0\x9f\x2a\xbd\xd4\x88\x0b\x66\xaf\xb6\xe4\xb8\x60\xdb\xb5\x54\x73\x57\xcd\x71\xff\x82\x83\xb2\x5e\x50\x3a\xf7\x95\x92\xdb\x88\x9e\xeb\xc1\x0c\xfd\x90\xc5\xda\x56\x59\x2f\x62\x4e\x1a\x23\x84\xbd\xd5\x8d\xfc\x1d\x6b\x97\x94\x86\x82\x1d\xd7\x91\x24\xf6\xef\x67\x78\x9f\x68\xa2\x24\xdd\x5e\xcb\xd7\xad\x78\x18\xe5\xa9\x9a\x35\xc8\x5d\x9e\x72\x02\xf1\xb8\x98\xf8\xd7\xe3\xd2\xe1\x5f\xb7\x25\xbd\xdf\xa1\x5b\x77\x83\xb3\x4c\xd0\xf4\x61\x60\x7b\x0d\x6b\x4c\x87\xc0\x38\x81\x75\x3d\x55\x5c\x8b\x7b\x08\x3d\x0f\xe1\x4d\xc9\x16\xc5\xd1\x00\x73\x27\x90\xdd\x99\xe7\x80\x1c\x2b\x59\x03\x39\x4d\x84\xef\x44\x92\xc0\x09\x0a\x67\x4f\x22\x39\x56\xb2\x46\x72\x54\x19\xe0\x7e\x18\xbb\x0b\xea\xd3\x48\x8e\xf5\xec\xc0\xbc\x65\x09\xa7\x60\x8e\x0b\x06\xdf\x1a\xbe\x9e\x43\x74\xae\x68\x0d\xe9\x6c\x6c\xfc\x90\x23\x33\x4a\xd2\x7e\x8c\xac\xba\x86\xbd\xbd\x22\x14\x73\xb3\xf1\x04\x83\xd1\x78\x12\xa0\x14\x6d\xcc\xfe\xbf\x00\x00\x00\xff\xff\xb6\x37\xc2\x05\x28\x94\x00\x00") - -func asset_stat_accountCoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_accountCoreSql, - "asset_stat_account-core.sql", - ) -} - -func asset_stat_accountCoreSql() (*asset, error) { - bytes, err := asset_stat_accountCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_account-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x45, 0x9, 0xf5, 0x53, 0xcf, 0x8, 0xd0, 0xf8, 0x6, 0xf8, 0x22, 0xdb, 0x18, 0x2b, 0xef, 0x3a, 0xba, 0xd2, 0x49, 0xcf, 0x20, 0xd0, 0xd2, 0x2, 0x31, 0x7a, 0xb0, 0x4a, 0x3e, 0xaa, 0x84, 0x12}} - return a, nil -} - -var _asset_stat_accountHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x79\xaf\xa2\x48\xf7\xf0\xff\xf3\x29\x48\x67\x92\xdb\x9d\x7b\x7b\x64\x5f\x7a\x7e\xfd\x24\xa8\xb8\xef\xbb\x4e\x26\xa6\x80\x42\x51\x04\x05\x5c\x9f\x3c\xdf\xfd\x8d\x80\x1b\xca\xe2\x72\x7b\xe6\x25\x9d\x8e\x50\xa7\xce\x56\xa7\xce\x39\x75\xaa\xb8\x7c\xff\xfe\xdb\xf7\xef\x48\xcd\xb0\xec\x91\x09\x9b\xf5\x12\x22\x03\x1b\x88\xc0\x82\x88\xbc\x9c\xcd\x7f\xfb\xfe\xfd\xb7\x7d\x7b\x7a\x39\x9b\x43\x19\x51\x4c\x63\x76\x02\x58\x41\xd3\x52\x0d\x1d\xe1\xfe\xa0\xff\xc0\xce\xa0\xc4\x2d\x32\x1f\x0d\xf7\xdd\x7d\x20\xbf\x35\x85\x16\x62\xd9\xc0\x86\x33\xa8\xdb\x43\x5b\x9d\x41\x63\x69\x23\x3f\x11\xf4\x4f\xa7\x49\x33\xa4\xe9\xf5\x53\x49\x53\xf7\xd0\x50\x97\x0c\x59\xd5\x47\xc8\x4f\xe4\xad\xdd\xca\xb0\x6f\x7f\x1e\xd0\xe9\x32\x30\xe5\xa1\x64\xe8\x8a\x61\xce\x54\x7d\x34\xb4\x6c\x53\xd5\x47\x16\xf2\x13\x31\x74\x0f\xc7\x18\x4a\xd3\xa1\xb2\xd4\x25\x5b\x35\xf4\xa1\x68\xc8\x2a\xdc\xb7\x2b\x40\xb3\xe0\x05\x99\x99\xaa\x0f\x67\xd0\xb2\xc0\xc8\x01\x58\x03\x53\x57\xf5\xd1\x9f\x1e\xef\x10\x98\xd2\x78\x38\x07\xf6\x18\xf9\x89\xcc\x97\xa2\xa6\x4a\x1f\x7b\x61\x25\x60\x03\xcd\xd8\x83\xf1\xa5\x96\xd0\x40\x5a\x7c\xb2\x24\x20\xf9\x0c\x22\xf4\xf2\xcd\x56\x13\xa9\x56\x4a\x7d\x0f\xfe\x8f\xb1\x6a\xd9\x86\xb9\x1d\xda\x26\x90\xa1\x85\xa4\x1b\xd5\x1a\x92\xaa\x56\x9a\xad\x06\x9f\xaf\xb4\xce\x3a\x5d\x02\x0e\x25\x63\xa9\xdb\xd0\x1c\x02\xcb\x82\xf6\x50\x95\x87\xca\x14\x6e\xff\xfc\x15\x04\x25\xe7\xd7\xaf\x20\xb9\xb7\xab\x5f\x27\xa0\x4b\xed\x7e\xe9\x5c\x06\xf7\x86\x1c\x46\xec\x0c\xea\x84\xdc\x01\xcf\x57\xd2\x42\xef\x0c\xd2\x43\xeb\x70\x35\x84\x8a\x02\x25\xdb\x1a\x8a\xdb\xa1\x61\xca\xd0\x1c\x8a\x86\x31\x0d\xef\xa8\xea\x32\xdc\x0c\xcf\x84\xd3\x2d\xe0\x18\xba\x35\x34\xf4\xa1\x2a\xdf\xd3\xdb\x98\x43\x13\x1c\xfb\xda\xdb\x39\x7c\xa2\xf7\x89\x93\xa7\xb8\xb8\xaf\xaf\x06\xe5\x11\x34\x9d\x8e\x16\x5c\x2c\xa1\x2e\xdd\x25\xc2\x59\xf7\xb9\x09\x57\xaa\xb1\xb4\xbc\x67\xc3\x31\xb0\xc6\x0f\xa2\x7a\x1e\x83\x3a\x9b\x1b\xe6\x7e\x3a\x7a\x3e\xf5\x51\x34\x8f\xea\x52\xd2\x0c\x0b\xca\x43\x60\xdf\xd3\xff\x60\xcc\x0f\x98\x92\x37\x2f\x1f\x60\xfa\xbc\x27\x90\x65\x13\x5a\x56\x78\xf7\xb1\x6d\xca\x4e\xdc\x19\x6a\x86\x31\x5d\xce\x63\x40\xcf\xa3\x58\x72\xa1\x80\x6a\xde\x89\xf8\xe0\x74\x63\x77\xd8\xfb\x09\x45\x81\x66\x3c\xd0\x03\xfa\x07\xba\x78\x6a\x8d\xd7\xc9\x71\xad\x77\x10\x39\x77\xc5\x51\x3d\xe6\xfb\x0e\x63\x3b\x72\x04\xac\x0b\x07\x24\x6e\x23\xcd\x68\x7c\x9c\xe9\x71\x80\x0d\x97\x0f\x23\x12\x50\xb5\xec\xa1\xbd\x19\xce\xa3\x51\xee\x21\x8d\x79\x5c\x48\x18\x17\xec\x10\x4a\xc2\x81\xc5\xc3\x74\x8f\x04\x8b\xf6\x62\xe2\x36\xde\x60\xba\x31\x72\xaf\x6d\xcb\x5a\x46\x51\x3e\x02\x4b\x86\x0c\xef\xcc\x0b\x8e\x66\x30\x07\xa6\xad\x4a\xea\x1c\xe8\xa1\xc1\x3b\xaa\xeb\x70\x7e\x67\x6e\x72\x8c\x68\xf7\x72\x70\xbb\xe3\xdd\xf4\x1d\xe5\xc5\xa1\xe7\x02\x7e\x3a\x7e\x77\x30\xf7\x23\xe9\xfd\xdc\xc7\x87\x43\xea\xe7\x18\xc3\x30\x26\x07\x23\xc3\x9c\x0f\x67\xea\xc8\x4b\x18\x42\x58\xf0\x41\xc6\x96\xf1\xfe\x7c\x2f\x0c\x73\x5c\xe3\x74\x7b\xa7\xaa\xa5\x76\xb9\x82\xa8\xb2\x4b\x39\x2d\x64\xf8\x76\xa9\x15\x13\x77\x80\xd1\xbd\x00\xb3\x37\xdc\xe1\x98\x9c\xbb\xf8\xe2\x1f\xa2\x74\x53\xa8\xb7\x85\x4a\xea\x01\x9d\xed\xf3\x6c\x0b\x2e\xee\xa6\x7c\x81\x24\x76\x6f\x19\xc6\x84\x3d\x65\xb3\xb1\x25\x0c\x98\xf5\xf7\xc8\x77\x1b\x45\xbc\xbe\x5e\xde\x17\x0f\xd8\x4b\xf2\x62\xcb\xe6\x79\x80\x7b\x64\x71\xbb\xc4\x84\xf5\xd2\xbf\xf8\xfc\x1c\xf2\xc5\x38\x1c\xf9\x7c\x48\x38\xf0\x99\x4b\xf0\x00\xf9\x6c\xb6\x21\x64\xf9\xd6\x0d\xe0\x99\xba\x5f\x71\xa8\x12\xfc\xaa\x2f\x67\xd0\x54\xa5\xbf\xfe\xfe\x16\xa3\x17\xd8\x3c\xd0\x4b\x03\x96\xfd\x15\xe8\x5b\xa8\x39\xa5\x98\x18\x3d\x14\xd5\xbc\xd9\x25\xd3\xae\xa4\x5a\xf9\x6a\x25\x44\x9e\x21\x18\x8d\x4e\xdc\x7d\x20\x57\x8c\x86\xe0\x38\x48\xf7\x04\x8e\xbd\xac\x4e\xf7\x13\xf3\x1f\xc8\x3d\x82\x38\xa2\xc7\xc0\x20\xf4\x5a\x42\xa5\xe9\x43\xa1\xcd\x47\xd6\x42\x3b\xd8\x62\x2a\x27\x94\xf9\x2b\x0a\x7f\xfe\xe6\x56\xe1\x2a\x60\x06\x7f\x1c\x9e\x21\xad\xed\x1c\xfe\xf0\xba\xfc\x89\x34\xa5\x31\x9c\x81\x1f\xc8\xf7\x3f\x91\xea\x5a\x87\xe6\x0f\xe4\xbb\x53\x9c\x4b\x35\x84\xfd\x78\x79\x98\x0f\xf8\x7e\xbb\xc0\x78\xd9\xe8\x21\x4e\x55\xcb\x65\xa1\xd2\x0a\xc1\xec\x02\x20\xd5\xca\x25\x02\x24\xdf\x44\xde\x0e\x65\xb7\xc3\x33\xcb\x41\xf2\xe6\xa7\x7c\x10\xdf\xa3\x79\xd4\x50\xa4\x3c\x17\xba\xac\x54\x5b\x3e\x7d\x22\xdd\x7c\x2b\x77\x64\xeb\xbc\xfe\x76\x41\xfe\x84\xc5\xc7\xc8\x3d\xc2\x5f\x21\x71\x14\x50\x2b\x25\xe6\xa3\x66\xbd\x84\xcc\x4d\x43\x82\xf2\xd2\x04\x1a\xa2\x01\x7d\xb4\x04\x23\xe8\xa8\x21\x66\xbd\xf0\x9c\xdd\x68\x43\xf3\xd8\x3f\xd8\xea\x89\xff\xc3\xd8\xde\xd2\xe5\xd1\xb2\x23\xf1\x23\x0d\xa1\xd5\x6e\x54\x9a\x67\xcf\x7e\x43\x10\x04\x29\xf1\x95\x6c\x9b\xcf\x0a\x88\x23\x7d\xb9\xdc\x76\xfd\x5d\xb3\xd5\xc8\xa7\x5a\x0e\x04\xdf\x44\x7e\x1f\xfe\x8e\x34\x85\x92\x90\x6a\x21\xbf\x63\xfb\x3b\xff\x68\x44\x4e\xc4\xe7\xa4\x8b\x42\xff\x32\xe1\xf0\x5b\xc2\xc5\xf1\x54\xcf\xc9\x17\x83\xc2\x51\xc4\xe3\xa3\x87\x24\xfc\xfa\x1b\x82\xa4\xf8\xa6\x80\x74\x73\x42\x05\xf9\x1d\xfb\x0b\xfb\x3b\xf1\x3b\xf6\x17\xfe\xf7\x7f\x7e\xc7\x9d\xdf\xf8\x5f\xf8\xdf\x48\xcb\x6d\x44\x84\x52\x53\xd8\x2b\x45\xa8\xa4\xbf\xdd\xd4\x4c\x8c\x38\xf0\xa4\x66\xa2\x29\x7c\xb6\x66\xfe\xef\x11\xcd\x5c\xc7\x54\x4f\x0f\xc7\x38\x1c\x4f\x11\xa7\xb0\x7d\x85\xd1\xe1\x18\x41\x9a\x7b\x5d\x21\x3f\x4f\x1e\xe0\xc3\x7d\xdc\xea\xd7\x04\xe4\xe7\xf9\x8c\xf8\x76\x6b\xd6\xbe\x94\x47\x3f\x42\x1f\x8b\x87\x69\x1c\x9f\xc3\x9b\x29\xd0\xb3\x5c\xde\x42\xea\xe3\xf4\x62\x42\x5e\xb2\x7b\xb2\xb2\x6b\x6e\x6f\xa5\x79\x4f\x73\x7b\x03\xa9\x9f\xdb\xf3\x49\x12\xca\xed\x3e\x72\xc9\x50\x01\x4b\xcd\x1e\xda\x40\xd4\xa0\x35\x07\x12\x44\x7e\x22\x6f\x6f\x7f\x5e\xb6\xae\x55\x7b\x3c\x34\x54\xf9\x6c\x2b\xed\x42\xd6\xf3\xfc\xd7\x13\xd1\x99\x60\xf1\xc4\x73\xe7\xe2\xf9\xe2\xdb\x95\x48\x95\x11\x51\x1d\xa9\xba\xed\x24\x06\x95\x76\xa9\xe4\x8a\x03\x66\xfb\x34\x1e\x91\xc6\xc0\x04\x92\x0d\x4d\x64\x05\xcc\xad\xaa\x8f\x7c\x60\xfa\x72\x76\x4c\xf9\x11\x55\xb7\xe1\x08\x9a\x3e\x10\x45\x03\x23\x0b\xb1\x66\x40\xd3\xae\xc9\xd8\xc6\x4c\xbb\x26\xf2\x15\xa7\xa8\x6f\x47\xc8\xeb\x61\xf7\xaf\x1b\x1e\x55\x87\xbf\xda\x71\x54\x89\x0d\x37\x57\x0a\x99\xcf\x35\xd5\xa9\xd9\x23\xb6\x3a\x83\x96\x0d\x66\x73\x64\x3f\x66\xce\x2d\xb2\x33\x74\x78\xcd\x68\xd0\xaa\xe8\x90\x8f\x7a\xcb\xa9\x78\x3c\x1f\x17\x5f\x01\x58\x3d\x33\xe4\x1b\x2d\x37\xa3\xc3\x9c\x07\xf9\x4a\xaa\x21\x38\xe9\x57\xb2\xef\x3d\xaa\x54\x91\x72\xbe\xd2\xe1\x4b\x6d\xe1\x78\xcf\xf7\x4e\xf7\x29\x3e\x95\x13\x10\x2c\x4a\x98\x87\xd5\xee\x47\x74\x65\x8a\x5e\xd1\x03\xd1\xe1\xc6\x5e\x01\xed\xeb\x5b\x80\xc4\x6f\x3f\x7e\x98\x70\x24\x69\xc0\xb2\xbe\xf9\x87\xcb\xdd\xab\xb8\x61\x5b\x34\xf9\x2d\x64\xa0\xdc\xb5\xf1\xd3\x92\xb9\x15\x9d\xa3\x5c\xb7\x67\xc6\xa9\x56\x77\x9b\xcd\x9b\xe0\x92\x21\xdf\x02\xc7\xf0\xdb\xe0\x6e\xf9\xef\x46\x07\x8a\x0e\x9b\x61\xb7\xcb\x0b\x2f\x32\xdb\x73\x9c\xbf\xcc\x68\xc3\x04\x41\xaa\xdd\x8a\x90\x46\x92\xfd\x08\x89\xdc\x0a\x5d\xb8\x40\x47\x5c\xbe\xe6\x3f\x54\x39\x88\xb7\x43\xcd\xe7\x59\xab\xf3\xf0\x78\x66\xe7\x9b\x33\xc3\x20\x4f\x7f\x5d\xe2\x0a\x82\xfc\xe2\x6c\x7c\x7c\x09\xb0\x66\xc7\x8e\x6f\x37\xc9\xd0\x06\xaa\x66\x21\x13\xcb\xd0\xc5\x60\x63\x3b\x14\xca\x9e\xd5\x83\x87\xc7\xd3\xc3\x61\xdf\x3a\x80\xb7\xb3\xcd\xe4\x58\xb3\xf0\xd6\x3e\xf6\xed\x8e\x9e\x5a\xce\x2a\xa3\xce\x40\x1c\xf9\x38\x78\x39\xd4\x47\xe1\x34\x10\xf1\xe0\x8f\x9b\xc9\xbe\xc0\x64\x2c\xed\x53\x6c\xf2\xf7\x31\x21\xb0\x23\x3b\xb9\xb0\xcb\xb9\x1c\x1b\xf6\x68\x3a\xde\xad\x6f\x9f\xfd\x4a\x16\xec\x2a\x1f\xb0\x81\x36\x94\x0c\x55\xb7\x6e\xdb\xa0\x02\xe1\x70\x6e\x18\xda\xed\x56\x67\xe7\x53\x81\x41\x63\xed\x34\x9b\xd0\x82\xe6\x2a\x08\x64\x9f\x87\xda\x9b\xa1\x93\x26\xa9\xbb\x20\xa8\xb9\x69\xd8\x86\x64\x68\x81\x72\xf9\xc7\xe8\x60\x2c\x10\xc8\xd0\x74\xd2\x0b\xf7\xb9\xb5\x94\x24\x68\x59\xca\x52\x1b\x06\x1a\x8a\x27\x38\x50\x35\x28\x07\x43\x05\x4f\xab\x80\xda\xf5\xb3\xb3\x2c\x60\x3f\x24\x22\xe6\xc5\xf7\x36\xd1\xfe\xeb\x5e\x91\x5f\x1b\xc6\x42\x69\xfc\xaa\xb0\x76\x97\xa0\x4f\x86\xb9\x50\x5a\xd7\x61\xef\x36\x78\x48\x18\x3c\xdb\xd9\x79\x99\x6d\x46\x2d\x73\x2e\x4f\x55\x05\x2c\x85\xf6\x99\xbf\xe4\x8a\xe2\x44\xc0\x27\x03\xa0\x37\xf3\x8d\xa5\x29\x1d\x8f\x69\x04\x84\x9e\x83\x3b\x79\x7b\xfb\xf1\x23\x78\x29\x16\x3c\x0f\xbc\x8d\xb5\x67\xd5\xe9\x9d\x05\xfc\xfa\xd2\x7c\xc1\x73\x89\x8f\x44\x2f\xe7\x2c\x4c\x20\x59\xdf\x49\xc4\x30\x20\xef\x70\x64\x18\x88\xbb\x0e\xbe\x09\x70\x7d\xa6\x33\x02\x2e\x94\xdc\x11\x2a\x84\xa2\xc3\x92\x6a\x0d\x2d\xa8\x69\xd0\x44\x44\xc3\xd0\x20\xd0\x0f\x31\x49\x95\xe0\x50\xbf\x88\xbf\xee\xb3\xcb\x98\x7c\x3a\x4d\x34\xf4\x45\xeb\x8b\xf3\x4c\xfe\xc6\xb3\x6d\xfa\x9b\x27\x3f\x1d\xae\x87\xce\xd9\x60\x24\x95\x13\x52\x45\xe4\xeb\xd7\x73\x0d\xfe\x07\x41\xbf\x7d\x8b\x42\x75\xab\xfb\x41\x69\xff\x77\xa5\xc7\x18\xf8\x2e\x74\xea\x43\xef\x53\xb8\xc3\x60\xe8\x54\xba\xbd\xc3\xfd\x82\xc9\x75\xfb\xcc\x42\xcc\x48\x1a\xc7\x85\x3d\x13\x4b\xa3\xce\x07\xbc\x26\x9a\x46\x50\xf9\x55\xf1\xf4\x4e\x61\x9f\x8c\xa8\x11\xd4\xae\x63\x6a\x50\x87\x90\xa8\x7a\x71\x26\xe4\x85\xb6\x7a\xb0\xcf\x73\x96\x62\x2f\xa2\x3c\xdf\x1f\xb1\x34\x8b\x1b\x78\xc3\x63\xe8\x4d\xd8\x13\xe9\x9b\xf3\x65\xbf\x0a\x08\x5e\x46\x04\x2d\xd0\xfe\x91\x25\x96\xbd\x19\x42\x7d\x05\x35\x63\x0e\x6f\x95\x2d\xed\xcd\x7e\xc1\xb3\xd4\xec\x80\xc6\x19\xb4\x41\x40\xd3\x7e\xa9\x15\xd4\x6c\xa9\x23\x1d\xd8\x4b\x13\xde\xaa\xb0\x71\xf4\xb7\xbf\xfe\x3e\xe5\x2e\xff\xfd\xdf\xad\xec\xe5\xaf\xbf\xfd\x3a\x87\x33\x23\xa0\x18\x76\xc2\xa5\x1b\x3a\x0c\xcd\x85\x4e\xb8\xae\xd1\x78\x92\xa9\x33\x38\x14\x8d\xa5\x2e\x3b\x15\x6b\xd6\x04\xfa\x08\xfa\x57\x63\x97\xa1\x75\xaf\x89\x3d\xb6\x11\x94\xa3\x97\x5b\x5e\xed\x4f\x95\x0f\xb3\xed\x70\x84\x2b\x8e\x8b\x70\xa7\x9b\x73\x5e\x2e\xe2\x74\x58\x53\x68\x85\xd4\x49\xcf\x2b\x52\xe7\x55\xd2\xfb\xd6\x11\xaf\x13\x22\xe6\xe1\xb9\x50\xa1\x42\xd7\x1f\x71\x84\x0c\x8c\xb4\x2f\x13\x33\xf6\xf9\xc3\x50\x41\x23\xc2\xc2\x6d\x51\xd3\xc0\x06\x88\x62\x98\x11\xbb\x45\x48\x9a\x6f\xf1\x11\xe2\x05\xa0\x0c\xdb\x75\x89\x83\x36\x5f\x69\x0a\x8d\x16\x92\xaf\xb4\xaa\x57\x3b\x2f\x4e\x80\x6e\x22\x5f\xdf\xb0\xa1\xaa\xab\xb6\x0a\xb4\xa1\x7b\x0a\xe6\x0f\x6b\xa1\xbd\x7d\x20\x6f\x38\x8a\x71\xdf\x51\xfa\x3b\x4a\x20\x18\xfb\x03\x67\x7f\x90\xcc\x1f\x28\x81\x93\x1c\xfd\x8e\xe2\x6f\xdf\xfe\x8c\x87\x1d\x1f\xba\x6f\x37\x5c\x68\x55\xdc\x0e\x6d\x43\x95\xc3\x29\x71\x34\xc5\xdc\x43\x89\x18\x2e\x2d\x78\x8c\x32\x43\x55\xbf\x7a\xa3\x22\x94\x1e\x49\xa2\x24\x7b\x0f\x3d\x72\x08\x64\x79\xe8\xaf\x4b\x85\xd2\xa0\x48\x8a\xc0\xef\xa1\x41\x0d\xdd\x98\x76\xc8\xae\x9d\xfd\xcc\x50\x12\x34\x81\xe2\x77\x89\x41\x1f\x48\x78\x1e\x2c\x06\x09\x96\xc4\xa8\x7b\x48\x30\xc3\x99\x21\xab\xca\x36\xbe\x14\x2c\x46\xe3\x77\x91\x60\x2f\xa4\xf0\x8e\x31\xc7\xa0\xc3\x90\x34\x71\x1f\x9d\xfd\xa0\x83\xd1\xc8\x84\x23\x60\x1b\x66\xb8\x4d\x71\x28\x86\x72\xf7\xa0\xe7\x1c\xf4\x6e\xcd\x72\xb8\x91\xcd\x70\xec\x38\x83\xdd\x35\xd4\x18\xea\xa0\xf7\x46\xc1\x59\xa9\x86\x13\xa0\x38\xe6\x2e\xed\x60\xd8\x39\x81\xe3\xd2\x67\xef\x00\xc2\x09\x71\x34\x77\x9f\x24\xf8\xc5\x40\x7b\x8b\x4d\xf7\xc5\xd9\x30\x4a\x18\xca\x50\xe4\x5d\x23\x82\x11\xae\x38\xc7\x25\x7a\xe8\x88\x63\x18\xce\xd0\xf7\x49\x42\x0e\x15\x75\x73\x78\x89\xc0\x98\x69\x43\x45\x85\x5a\xa8\x6b\xc4\x30\x0a\xc3\xee\x72\xc2\x18\x75\xd8\x3b\x39\xd4\xb4\x37\x11\x62\xd0\xcc\x7d\x6e\x1e\xa3\x87\xaa\x3e\x82\x96\x3d\xbc\xae\x9a\x47\x90\x62\x38\xf6\xbe\x11\x61\x2e\xc2\xb5\xb3\x3d\x01\xc2\x83\x09\x86\xa3\x28\x41\x7a\x44\x02\x62\x6d\xe8\x5e\xfb\xbd\xc1\xf6\x6a\xbf\xfd\xc0\x3d\xf6\x81\xbc\x65\x53\x38\x51\xcf\xe0\xb9\xb6\x40\xe1\x7c\xb9\xd7\xce\xb4\x73\x04\xdf\x2f\xf0\xbd\x5e\xb6\xd7\xeb\xe0\x9d\x5c\xaf\xdf\x6f\xd0\x42\xbf\x27\xb4\x6a\xc5\x74\x6f\xd0\xe4\xbb\x34\xd3\xab\x92\x7e\x0d\x05\x12\xc1\xf7\x44\x92\xbd\x6c\xbd\xd0\xed\x94\xba\xd5\x7e\x2e\x53\xea\xb4\x8a\xdd\x0e\x95\xc9\xe6\x78\xa2\x54\xe9\xf7\xf1\x42\xbd\x58\x66\xaa\x7c\x81\x6f\x0b\xf5\x4c\x9b\x2e\xd5\x52\x4d\x21\xd3\xe9\x55\x2b\xb1\x89\x10\x7b\x22\x3c\xd5\x4d\xd6\xfa\x3c\xd5\x27\xbb\xbc\x90\xeb\x75\x1b\x78\xbb\x58\xc5\xdb\x55\x32\xd9\xce\xe6\xda\x75\x86\x14\xda\xb5\x62\xb5\x82\xd7\x73\x1d\xb2\xdb\xc8\x55\xf3\x8d\x4a\xb1\x98\xbb\x1a\xeb\x40\x22\xa4\xa3\xae\x5e\x31\x4b\x37\x2a\x64\xb5\x92\x17\x6a\xa9\x72\x25\x93\x64\x08\x9c\x27\x09\x7a\x40\xd5\x2a\xe9\x66\xa3\x94\xed\x16\x99\x6c\xb2\x94\x2a\xd7\x4b\xf9\x4c\x95\x6c\x32\x42\xbf\xdb\x69\xc7\x26\x42\x39\xea\x6a\xd4\xfa\xb9\x7c\x09\x4f\xe5\x89\x4c\xa5\x4e\x26\x7b\xa5\x4c\xb9\x92\x2e\x65\x0a\xed\x4a\xad\x8d\xe7\xfa\xc4\xa0\x9c\x69\xe6\xaa\x95\x76\x4a\xa8\xf2\xcd\x2e\x53\x4f\x31\xd5\x1e\x9e\x7b\x7b\xf4\x00\xca\x3e\x1f\x8d\x30\x28\xef\xd0\xde\xe9\xbc\xed\x1f\x16\x0c\x3f\x9c\xf1\x81\x50\x1f\x88\x6d\x2e\x61\x0c\x33\xbf\x3e\x76\x71\x4f\xa2\x7a\xcf\x56\xff\x4b\x24\xbd\x58\x5e\x7d\x20\xd8\x87\x7b\x62\x2b\x5a\xd0\x5b\x5b\xfd\x8f\x4e\xe7\xc3\x76\xff\xd9\x6c\xc6\x70\x96\x25\x39\x94\xe2\x58\xca\xe1\x8a\xfe\x40\xde\xfe\xfb\x05\x2c\xed\xf1\xd0\x84\x8b\xa5\x6a\x42\x79\xa8\x68\x60\xf4\xe5\x87\x33\x30\x1f\xc8\xa1\x6d\x65\x48\xfb\xf4\xe4\xbc\xf1\x7f\x41\x26\xeb\xa7\x8b\x1f\xe8\x62\x28\xca\x62\xd7\x74\x9f\xc1\x4d\x1c\x71\x93\x18\xc3\xc4\x91\x29\x36\x6a\xf2\x88\x9a\xc5\x19\xc2\x41\x4d\x39\xa8\xc7\xc6\x0c\x0e\x65\x63\x06\x54\xfd\xcb\x0f\xe4\x0b\xdc\x80\xd9\x5c\x83\x7f\x48\xc6\xec\xcb\xfd\x7c\xe3\x34\x49\x53\xc1\xc8\x81\x28\xdd\x87\x98\xfc\x40\x58\x8a\xe5\x38\x82\xa5\x59\xce\xc1\x8b\x3a\x78\x2d\x7b\xbf\xa4\xd1\x47\x43\x11\x68\x40\x97\xe0\x1e\x39\x86\xa2\xe8\x1f\xa8\x7b\xc5\xa7\x40\x5d\x52\xc0\x3f\x10\xc2\xd5\xb8\x93\xd6\x5c\xe1\xdd\xdb\xd0\xf1\x1c\xd3\xbe\x55\x07\xb6\xba\x82\x0f\x4b\xb4\xd7\x9c\x2b\xd2\x1a\xaa\xa3\xf1\x9e\x20\xf6\x81\x7c\x71\x67\xc5\x70\x0a\xb7\x7b\x1a\x8f\x7a\xe1\xbb\x06\xd0\xe1\x8a\xc4\x19\x6f\x2e\x7d\x96\x9e\x3d\x0a\x9f\xae\x67\x9f\x44\xf1\xf4\xfc\x60\x48\x8d\xcf\x15\x7e\xe0\x8a\x66\x3d\xdf\xf1\x69\x7a\x76\x29\x7c\xba\x9e\x7d\x12\xc5\xd3\xf3\x83\xf9\x51\x7c\xae\x30\x8f\x2b\x0a\xe5\x3c\x3f\xfa\x59\x7a\xf6\x28\x7c\xba\x9e\x7d\x12\xc5\xf4\x1b\x8f\x25\xbb\x2e\x57\x11\xb1\xfd\xd6\xf1\xb5\x47\x63\xfb\xe1\x08\xdb\x79\x7e\x2b\xb2\x24\x2a\x92\x38\x4e\x72\x0c\x54\x30\x94\xc6\x39\x51\x22\x19\xa0\xe0\x12\x8b\x42\x0a\x88\x28\xb3\x5f\xe2\xd3\x24\xc3\x02\x06\x72\x18\xa6\xec\x15\x26\x01\x4a\x02\x22\x80\x0c\x45\xee\xd7\x23\x10\x12\x0c\x2e\x8b\x2c\x4a\x49\x24\x4d\x72\x32\x86\xcb\x00\x95\x45\x4a\x61\x00\xe4\x14\x5a\xa1\x14\x99\x21\x14\x5a\x91\x68\x09\x23\x39\x5c\x41\x51\x06\x02\x86\x52\x18\x05\xa3\x51\x92\x13\xdf\x9c\xf8\x4b\xfb\x56\x36\xf4\x0f\x82\xfd\x81\x62\xfe\x05\x8f\xfb\x98\xf8\x03\xa5\x08\x94\xa0\x22\x5b\xbd\xe4\x05\x63\x59\xf6\x03\xc1\xe8\xfd\x78\x5e\x5d\xee\x43\xe7\xff\xb3\xf6\xe3\xcf\x0f\x04\xdb\xaf\x69\x78\x9e\xe7\x53\xef\x24\x51\x12\x47\x99\x4d\xb6\x29\x0b\xb6\x51\xb1\x15\xb8\xd4\x71\x4e\xc1\x76\xdc\x6a\x63\x65\x0a\xa5\x75\xf2\x7d\x8e\x71\x89\xcc\xa8\x29\x76\xd0\xf2\x9c\xa9\x5b\x1d\x94\xa9\xe6\x27\xdb\x72\x26\xc7\x6c\x33\xec\x72\x21\xf5\xcb\x06\x41\x95\x51\x22\xb1\x25\x09\x7b\x2b\x9a\xc2\xa6\xbe\x47\xcd\xf7\x6a\x9d\x32\xed\xfe\x74\xae\x3e\x9b\x4c\x14\x1a\xea\x4c\x29\x77\xc4\x31\xe8\xd0\x69\x54\xb3\xfa\xb5\xcd\x68\x55\x6f\xe6\xb0\x5e\xba\x4e\x36\x0b\x93\x04\x23\x29\x9b\x85\x8d\x0a\xcd\x11\x57\xc7\xd9\x04\x96\x6d\x57\x51\x41\x97\xe1\x7c\xd6\xc0\x32\x76\x65\xce\x71\xb3\x2a\x4c\xcd\x93\x53\x2c\x9f\xec\x0e\xec\xf6\x7a\x8f\xb9\x5c\x21\x4b\x60\x37\xc7\xcf\x88\xf1\x35\x83\xbf\x71\x0d\xf8\x1e\x46\xd6\x79\x3e\x8d\x16\x6e\x35\xff\xab\x2f\xd7\xaa\xd0\x80\x89\xef\x9f\x0b\xf8\x6b\xec\xf8\x8d\x26\x64\x8e\x55\x28\x82\x86\x90\x66\x65\x4c\xc4\x19\x91\x12\x59\x4e\xc1\x09\xa0\x50\x04\x86\x89\x0c\x45\x73\x00\x27\x15\xa0\x60\x24\x4a\x00\x19\x15\x29\x5c\xa4\x09\x42\x44\x19\x11\x72\xdc\xdb\x07\x42\x3a\xff\x6e\x98\x35\x1a\x68\xed\x0c\x4e\x92\x6c\x64\xab\x9b\x11\x91\x14\x87\x87\x4c\x05\x32\xe6\x4c\xc0\x6b\x83\x09\x56\x59\x52\x06\x2a\x16\x98\x2e\xa9\x6f\xab\xab\xf6\x26\x4b\x74\xe6\xc6\xf4\x7d\x95\xe1\xab\x76\x0a\x2b\xe2\x65\x26\xc9\xd0\x03\x4b\xca\x66\xb1\xea\x74\x6b\x19\xf5\x45\x26\x47\x25\x04\x56\x4d\xc3\x3a\x34\xcd\x85\x38\xe2\xf4\xc1\x36\x93\xb6\x01\xbf\x33\xe4\x0e\x3d\x72\x46\xce\x99\x09\xce\xaf\xfc\xf1\x3f\xde\x31\x56\xeb\x74\xbf\xe6\x6b\xf5\xa9\x3b\xd2\x35\xe2\x7d\x8b\xf7\x0d\x4c\xcc\xe8\x6b\x59\x5c\x50\xcd\x69\x97\x1e\xe4\xb2\xdb\x4c\xab\x9d\xaa\x96\xd1\x89\x8c\x56\x4d\x41\x67\x09\x72\x2a\xd5\xb7\x4d\x5d\x48\xd6\x2c\x55\x18\xa7\xc5\x95\x4a\xae\xad\xb5\x91\x2e\xf6\x97\x2a\x2f\x66\x8a\xf8\x82\xdd\x51\x1b\xa6\x56\x10\xea\x02\xe9\xd2\xbf\x31\x53\xb2\xf5\x5b\xd6\xf6\xff\xf9\x4c\x21\xe3\xcf\x14\xec\x35\x56\xee\xec\xab\xee\xf3\x85\x7d\x7c\xc5\x38\x06\xfd\x8e\x62\xdf\x51\x0c\x41\xd1\x1f\xce\xbf\x40\x6b\x66\x59\x14\x23\x22\x5b\x49\x9c\x23\x39\x9a\xc1\x39\x3a\xc4\xd6\x6f\x5b\xba\xcb\xd2\x3f\x3d\x28\xc1\x57\xb2\x57\x54\xc9\x6d\x62\xdb\x2c\x26\x99\xb4\x9e\xe6\x72\x38\xba\x99\x24\xdf\x2d\x74\x64\x5b\xeb\xfc\x7a\x87\xf5\xe4\x66\xb7\x0f\x92\x05\x90\x71\xe6\x93\x70\xc3\x88\x6f\x5f\x07\x23\xe6\xf9\xe4\xf4\x17\x08\xf2\xd2\xeb\xcd\x35\xa6\xe8\x8c\x2a\xc6\xc9\xe5\x47\x13\xac\x80\x0d\xe9\xc0\x5a\x4a\xc0\x8c\x8b\x40\xe3\x2f\x8d\xe0\x8f\xa1\xf1\x57\x41\x88\xc7\xd0\xf8\x2b\x1e\xe4\x63\x68\xa8\x63\x6d\x03\x27\x68\xee\x61\xa1\x68\x5f\x89\xe4\x41\xa1\x98\xcb\xf2\x01\xf5\x18\x16\xf6\x12\xcb\x83\x9a\xe1\x2e\x97\xd8\x0f\xf2\xb2\x5f\xc6\x5c\xac\xd4\x1f\x44\x83\x5d\x2e\x44\x1f\xe5\xc6\xb7\x9e\x7d\x70\xb4\x31\xe2\x72\xb9\xf6\x28\x37\xa4\x6f\x1d\xfb\x9a\x57\x00\x5e\x52\x15\x0e\x3f\x9f\xf2\x81\xec\x79\x8f\x57\x0e\x0f\x38\x09\xff\xb4\xaf\x3b\x1f\xd5\x73\xe7\x76\xbc\x21\xcf\x2a\x95\xfb\xb5\xb9\xf3\xee\xee\x97\x1f\xc8\x5f\xfb\x81\xff\xfb\x03\x39\x3d\x1c\x3a\x8f\x2f\xcb\xb0\x5f\xae\xea\xc9\x5f\xfe\xfe\xdf\xdb\x27\xec\x31\x05\x0a\x74\xa8\x40\x1f\x6f\xd0\x20\x81\xc2\xa4\xf1\x31\xff\xe2\xbd\xab\x60\xe6\xbd\x12\xf7\xf1\x86\x0e\x1c\x8d\xe8\xa1\xf0\x78\x7f\xf1\x96\x58\x30\xef\x5e\x0d\xfd\x78\x83\xc7\x2d\xa8\x7f\xc2\x9e\x5a\x20\x97\x5e\xc0\x3a\xdd\xb0\x27\x2e\x7f\xed\x58\x1f\xb6\x05\x8e\x37\x64\x9c\x3d\x82\x5f\x33\xa2\xe7\x81\xf0\xf8\x9b\x3d\xab\x19\x2a\x4b\x5d\x86\xa6\x5b\xb7\x7c\x6c\xa3\xd2\xf1\x14\xee\x76\xe1\x53\xe5\xfc\xfd\x34\x88\x2e\x60\x3e\xb9\xa3\x7a\x8f\xda\xbc\x90\x7d\xfc\x4d\x7e\xaa\xda\x1e\xad\xce\xff\xfb\xd4\xe6\xe6\x16\xc7\xdf\xe8\xa7\xaa\xed\xd1\x62\xfb\xbf\x4e\x6d\x5e\x12\x74\xfc\x4d\x7f\xee\x24\x7d\xb0\x76\xfe\x4b\xd4\x16\x91\x51\xdd\x78\x11\xee\x89\x93\xb0\x77\xbd\x13\xf4\x68\xd6\x16\x78\x96\xf8\xe6\x1a\x95\x0c\x5e\xa3\x46\x22\xc2\x7d\x19\x53\x50\x8a\x1f\x89\x88\xf0\x65\x2f\x41\x2b\x97\x48\x44\xa4\x2f\x95\x08\x5a\x8f\x45\x22\xa2\x7c\xd1\xfe\x61\xd1\x68\x5f\xb0\x7e\x58\x34\xe6\x32\xa8\x06\xad\x83\x22\xf1\xb0\x97\x78\x1e\xd6\x10\x77\x19\xad\x1e\xe6\xe7\x62\xd5\xfa\x8c\x82\x30\x5f\x20\x78\x9c\x23\xfc\x12\xd1\xc3\x63\x7f\xb1\x76\xa5\x9f\xe1\x88\xf4\x39\xeb\x57\xbd\x74\xf7\x92\xf5\x6b\xd4\x6b\x07\xf7\xac\x60\x03\xdf\x3a\x7b\x81\x37\x3c\x3f\x65\x8f\x12\x0a\x8b\x02\x8e\x90\x39\x14\x48\x14\xa9\xd0\x12\xc6\x49\x22\xc0\x50\x5c\xc2\x28\x9a\xc3\x24\x0a\x65\x48\x19\x05\x24\x25\x2a\x32\xe0\x48\x91\x90\x24\x8c\x64\x49\x0c\x40\x45\x04\xe4\x9b\xbb\x6f\xfc\xcc\x12\xf5\x6c\xaf\x86\x38\xd4\xa8\x83\x77\x3a\xf1\xd0\x5d\x52\xb7\xf5\xc2\xa9\xbb\xc5\xed\x52\x97\xcc\xa0\x70\x5c\xa5\xf9\x2d\x97\x42\x6b\x56\x56\x18\xad\x24\x8c\xc1\xb0\x36\xc7\xf6\x27\xe4\xac\x34\x9d\x71\x75\x86\x9a\xa6\x88\x15\xef\x14\x87\xf9\xc3\xe6\x4b\xd2\x57\x7b\x3d\xbb\x6f\x9f\x7e\xd6\x7d\xed\xeb\xd8\xb5\xdc\xe4\xfb\x80\xb7\x99\x3d\xbc\x90\xdc\xed\x56\xf2\x7c\xd0\x5a\x6c\x6a\xfd\x4e\x0f\x68\x2b\xaa\xbc\x11\x95\x35\x56\xac\x8b\x76\x6e\x5a\x5d\xc3\x42\xbf\x8d\xab\x42\x9b\x5b\xf4\x12\xdc\xbc\x5b\x41\x31\x29\x9b\x94\x78\x62\x54\xca\x12\xf3\xc2\xd6\xc0\xb0\xb5\x28\x6c\xe9\x05\x4e\x27\x0d\xb2\xb4\xa0\xcb\xd3\xed\xbb\x54\x7c\x3b\x2f\xf0\x9f\x6f\xe8\x9c\x7e\x66\xce\xf8\xf9\x79\x84\xaf\x1f\x75\x90\xf6\xcb\x64\x8b\xa3\x5e\x83\x16\x18\x23\x5d\x42\x4b\xf5\xf7\x75\xbf\x99\xe2\x76\xbd\x55\xaf\xd3\x22\x36\x6a\x4d\xed\x2f\x9b\x22\x96\x5e\xcd\xea\x25\xc8\xee\xc1\x53\x1d\x7e\x35\xd1\x4f\x3a\x0d\xb8\x84\x40\x1d\xbd\x98\xbe\x7f\x4c\xe3\xd1\x77\x36\x18\xca\x27\x7d\x38\x57\x0a\x5b\x26\xe5\x9c\xd1\x5a\x8e\xca\xab\xba\x9d\x66\x92\xe3\x7c\x89\xa8\x40\x4e\xee\xd4\x94\x6c\xfe\xbd\xa0\x52\x85\x55\xbb\x7a\x1c\x63\xbe\xd0\x4e\xbd\x57\xa5\x13\xbe\x00\x9a\x81\xfb\x17\xc2\x27\xd3\x2f\x87\xd0\xff\x79\xb2\x8d\x93\x2e\x52\xcf\xf1\xe2\x11\x1a\x05\xc9\xfb\x2b\x75\x71\x0f\x7d\x57\x17\xff\x95\x58\x86\x00\xdd\x36\x6d\xb5\xf0\x4c\x07\x9f\x8b\xef\xad\x72\x97\x60\x2b\xcd\x69\x96\x69\x50\x69\x2b\xa7\x76\x33\x15\x63\x9c\xa9\x01\x2d\x91\x00\x9d\x89\x5c\xe9\x25\x47\x3d\xbe\x42\xa6\x36\x36\xdd\x94\x16\x15\x59\xca\x6e\xca\xcb\x85\xbd\x1c\x81\x6a\x8a\x5e\x4e\x0a\xe5\x95\x9e\x1a\xfd\xfc\xe9\xa4\xf3\xce\xbb\x9a\x87\xdd\x43\xf7\x7f\xf7\xd0\x29\x86\x06\x6d\x60\xde\xf6\xf2\x1c\xc5\x12\x38\xc1\x2a\x12\xc7\xc9\x38\xa3\x90\xa4\x42\x8b\x34\x0a\x09\x1a\xc3\x50\x91\xa1\x69\x85\xc2\x31\x45\x94\x80\x28\xd2\xac\x82\x72\x10\x93\x81\xc8\x61\x12\x89\xe2\x90\x40\x69\x8a\x75\xbd\xfc\x53\xe7\xd0\xef\xf3\xf2\x24\x15\xbc\xc3\x7f\x68\xbd\xc8\xb8\x5d\xab\xcc\x52\x46\xc1\xee\xc8\x7a\xbf\xda\x91\x07\x0b\xbb\x37\x6f\xe5\x92\xb6\x28\xf5\xd1\x59\x6a\xa6\x48\xc9\x7c\x51\x18\x75\x75\x6d\x95\xc9\x8f\x01\xff\x0a\x2f\x1f\x66\x35\x3e\x7c\xe2\xa6\x99\xef\x8e\x1c\x2f\xdf\xaa\xe0\x0a\x31\x80\x89\x5e\x8e\x68\x75\x27\x4c\x9d\x5b\x2b\x84\xc9\x95\x99\x77\x56\xb1\x6b\xe6\x76\xbc\xc9\x24\x13\x3c\xad\xad\x1b\x54\x3e\xa5\xaa\x72\x4a\xc3\xc9\xf6\x22\x2d\x56\x31\x8a\x90\xa4\xd1\x42\x26\xa4\xb2\x95\x5d\xa4\x6c\x81\x2e\x0c\xb6\xeb\x64\xb1\x2e\xb2\x6c\xe9\x33\xbc\xbc\x38\x1b\xcd\xb0\x0e\x2e\x8f\xa8\x0e\x36\x5b\x60\x50\x2b\x4b\x59\xcc\xde\x4c\x9a\xfd\xe2\x80\x5b\x0b\x23\xa3\x99\x04\xb0\xcb\xb6\xd5\x8c\x73\xa0\xc6\xf1\xb2\xd5\x93\x4e\x03\xae\xf8\x5e\xfe\x49\xfa\x2f\xf4\xf2\xc9\x25\x48\x89\x9d\xde\x00\x4f\x6b\xbd\x2e\x30\x3b\x74\x7b\xb3\x16\xbb\x44\xb6\x52\x18\xcd\x75\x82\x6f\xa6\xc6\xf9\xcc\x9c\x3a\x8e\xb1\xe3\x59\xca\xe4\x09\xdf\xb3\x5e\xfe\xd5\xf4\xf3\x21\xf4\xa3\xbc\xfc\x23\xbc\xbc\xd2\xcb\x3f\x42\xff\x49\x2f\xdf\xde\xc9\x3a\x87\xf7\x56\xd8\x86\x43\x31\xe3\x1d\xad\x49\x39\x8e\x4e\xb4\xaa\x89\x55\x8e\x69\xd1\xac\x21\x35\xea\xca\xba\x3a\x97\x04\xd8\xe4\x0d\x43\xaf\xcf\xe5\x65\xa6\x38\xc2\x77\x36\x94\x89\x5c\xbe\xa8\xcb\x44\xba\x94\x5c\x8c\xcc\x46\x55\xed\x4a\x16\xdf\x9c\x66\x13\xb5\xd4\xfa\xd5\x5e\x5e\xa2\x48\x06\x23\x14\x0a\x95\x20\xc9\x10\x0a\x4b\x63\x18\x45\x91\x2c\x2e\xe1\x00\xa5\x59\x48\xcb\x18\x4a\x72\x18\xa0\x45\x85\x63\x08\x14\xc7\x45\x4a\x91\x18\x8e\x83\x24\x41\xd3\x2c\x89\x7b\xb9\xfc\x53\x2f\x02\xdd\xe7\xe5\x29\x86\x09\xf1\xf2\x6e\xeb\x45\x39\xc4\xb5\xca\xb4\x3d\x5a\xad\xd3\xcb\x6a\x97\xaf\x73\x4c\x03\x6b\xb4\xec\xb6\xbc\xae\xa4\x73\xf3\x74\x22\xd5\x86\xf3\x9d\x5c\xaf\xf5\x34\x43\x97\xd4\x52\x87\x7f\x85\x97\x8f\x3e\x4b\x72\x84\x2f\x10\x79\x15\xdb\xc3\x0b\xa9\x75\xa7\xcd\x54\x27\x26\xd1\xee\xa9\xcd\xed\x9a\x55\xdb\x0a\x8b\x6f\xa6\x4b\x03\x4e\x0b\x46\x63\x50\xeb\xd4\x76\xf5\x34\x93\xa7\xaa\xc6\xa6\x68\x49\x99\x6a\x7d\xd3\x41\x47\x25\x83\x4d\x4c\x26\xb9\x42\x82\xeb\x16\xd5\x6c\xb2\xdb\x1c\x14\x7b\x0b\x00\x72\xad\xf7\x9d\x5a\x24\xd9\x7a\xf9\x33\xbc\x7c\x15\x4f\x25\xf8\x2a\x49\xf5\x93\x69\xc2\xce\x75\x32\x55\xac\x41\xf0\x68\x19\x4e\x6b\x6c\xa1\x41\xeb\x15\x8c\xe7\x60\x57\x95\xb7\x79\xdb\xd1\xd1\xcb\xbd\xfc\x93\xf4\x5f\xe8\xe5\x79\xa6\x5f\x62\x79\x66\xa2\x8d\x84\x1a\x44\xe5\x76\x9b\xe9\xe4\xa4\x74\x7d\x43\xd7\x13\x6b\x2d\xb7\x90\x88\x76\x1a\xa3\xc0\x71\x8c\x5f\xee\xe5\x5f\x4d\x5f\x08\xa1\x1f\xe5\xe5\x1f\xe1\xe5\x95\x5e\xfe\x11\xfa\x4f\x7a\x79\x2b\xd3\xa9\xee\x0c\x9a\xc3\x32\xe4\xd4\xb2\x6a\x79\x2d\x97\xa8\x58\x83\xd2\x22\x37\x4f\x01\xa1\xdb\xc2\x5a\x2c\xca\xbf\x6f\xab\xad\x45\xb9\x69\xe6\x92\xad\x69\xb9\x23\xe7\x53\x74\xad\x46\x92\x9b\xad\x92\xe8\xa8\xc6\x78\xd4\x99\xce\x9a\x1a\x3d\x9b\x8d\xd1\x84\x45\xaa\xcb\x9a\x90\xe6\x5f\xed\xe5\x19\x8a\xa6\x45\x99\x15\x49\x56\xa6\x44\xa0\xd0\x2c\x2d\xb1\x1c\x27\x93\x0a\x0b\x19\x02\x97\x20\x46\x03\x19\x03\x24\x20\x15\x59\xa1\x44\x89\x22\x25\x0a\x50\x0a\x4d\xd0\xb2\x08\x14\x94\x23\x5c\x2f\xff\xd4\x9b\x98\xf7\x79\x79\x9a\x0b\x3b\xb9\xee\xb6\x5e\xd4\xaa\x5d\xab\x2c\xd2\x13\xa8\x12\x93\x99\x91\x67\x5b\x59\x2d\x9d\x80\x23\x89\x60\x6a\x3d\x3b\x57\x2c\xee\xba\x1d\x76\xdd\x51\x07\x49\x90\x5a\x52\x25\xca\x31\xdd\xa7\xbd\x7c\xf0\xe5\xb4\xa7\xf0\x0e\xd9\xef\x62\x6b\x31\xdb\x5e\xf6\x71\xce\xbe\x82\x02\xcc\x74\x35\x5d\x3b\xe0\x5b\x45\xc0\x92\x8b\x77\x63\x32\xc8\xe8\x8a\xb4\xb3\x3a\x09\x6a\x50\xcb\x54\x5a\x5c\xa6\x31\x87\x1d\x79\xa2\x34\xd8\xa2\xd0\x63\xcb\xd2\x6a\x59\xc9\xd4\x46\xc5\x46\x87\xc0\xe7\xec\x9c\x6a\x28\xeb\x77\x6d\x43\x14\x52\x89\xae\x41\xf2\x73\x4a\xac\x1b\x5a\x21\xbb\xa8\x18\x59\x58\x4c\xae\xcf\x66\x2c\xff\x3a\xef\x6f\x2e\x2a\x74\x09\x56\xc1\x68\xb2\x29\x83\x76\x8d\xa3\x93\x3b\xc5\xe2\x20\x2a\x19\x66\x65\xd0\xdb\x25\xbb\x85\x69\xc6\x28\x1e\x64\x7b\x7d\x25\xe7\x49\xfa\xaf\xac\xe4\x2c\x0d\xc2\xb0\x49\x6a\x91\xaa\x09\x9b\x79\x3d\x41\x18\xb9\xca\xfb\x0e\x63\x1a\x5b\xd5\xc2\x34\xa5\x9c\xe9\xcf\xea\xdd\x91\xb9\x6c\xbe\xb7\x1c\xf8\x97\x57\x72\x3e\x83\x7e\x69\xd0\x1b\x8f\xc5\x5e\xd2\x1a\x34\xa9\x89\x88\xa3\x8f\x56\x76\x1e\xe0\xed\xa5\x95\x9d\x27\x75\x73\x0f\x7d\x2f\x1a\x7c\xd6\x24\x7e\x6d\x34\x80\x14\x05\x28\x86\x90\x70\x46\x84\x04\xab\xd0\x10\x2a\xa4\x04\x48\x0a\xc7\x29\x12\x85\x24\xcd\xd1\x98\x82\xcb\xb2\xc4\x89\x28\x04\xfb\x3b\x8c\x24\x58\x54\x92\x39\x4a\x04\x24\xca\xe0\x6e\x34\xa0\x5e\x54\xd9\x21\xa3\xa3\x01\x8b\x85\x55\x76\xdc\xd6\x8b\x0d\xc7\x67\x2b\x3b\x29\xdf\xf0\x3e\x1b\x0d\xfc\xd7\x59\x65\x87\x1f\xd7\x67\x6a\xb9\x69\x14\x09\x51\xce\xb2\x09\xa9\x5c\x25\x40\x7f\x5c\x18\x74\xb3\xe3\xc6\xae\xc6\x55\x52\x9d\x59\xa6\x39\x00\xdd\x01\x63\x08\x73\xa6\xb1\xb5\x32\x85\xe6\x38\x5f\xc2\xd7\xfc\xfa\x3d\xd5\xef\xc3\x15\x68\x12\x9d\x3a\x59\xd3\xb2\x5c\x53\xd4\x2a\xad\x52\xb5\x3a\x66\xf9\x7f\x61\x65\xc7\xaf\x23\x4f\xc7\xbf\xac\xb2\xe3\x1f\xd3\x78\xf4\x3f\xa5\xb2\xe3\x8f\x82\x61\x95\x15\xfe\x13\x2a\x3b\xf7\xd0\xbf\xe9\xe5\xff\xa1\xca\xca\x67\xe8\xe2\x1e\xfa\x9e\x97\xcf\xb7\x0b\xc6\x44\x58\xa4\x6c\x9c\x68\xac\x6a\x44\x3a\x6d\xe3\xb3\x7c\xb3\xdb\x19\x1b\x6d\x69\x97\x68\xd5\xb5\xc1\xb8\x3d\xeb\x6a\x33\x48\x27\x8b\x10\x95\xcc\x64\xb3\x6d\x34\x53\x9c\xc5\x97\x6b\xa3\x59\x36\x67\xe2\x53\x1b\x6b\x57\xd3\x54\x63\xd5\x9e\x51\xad\xf6\x76\x37\x31\x14\xfe\xe5\x39\x3f\x49\x48\x90\x92\x48\x8e\x10\x69\x1a\x65\x31\x0e\xe3\x44\x89\x92\x48\x85\x03\x2c\x0a\x48\x09\xa7\x19\x8a\xc6\x70\x4e\x91\x50\xc8\x88\x32\x21\x12\x32\x2d\x02\x80\x41\x00\x01\x46\x33\x38\xea\x7a\x79\xfa\x45\x95\x9d\x18\x5e\x9e\xc3\xc3\x72\x7e\xb7\xf5\xe2\x34\xc8\xb3\x95\x9d\x57\x7b\x79\xa7\x3d\x89\x67\xd4\xfe\xd6\xcb\x9b\x7c\xed\xa7\x4a\x4f\x7a\xd9\xe7\xa6\x26\x99\x34\x77\xf9\x15\xb3\x15\xa7\x5c\x97\xc2\x36\x4d\xd2\x4e\x88\xe5\x74\x8d\x4c\x28\x5a\xcd\xc8\x2c\x3a\x83\xc4\x0c\x6e\x31\xa2\xd2\x4c\xe8\x7c\x81\x2a\xa2\x3a\x49\x66\x0a\x9b\x0d\xb9\x5a\x4e\xb8\x2e\xb5\x49\xd7\x39\x66\x55\x60\x2c\x5e\x87\x75\xba\x32\xe0\x3f\xa5\x9e\xff\xe2\x4a\x8b\x77\xff\xcb\x2a\x3d\x01\x63\xfc\x4f\x54\x7a\xfc\x5e\x37\xac\xd2\xc2\x7f\x42\xa5\xe7\x26\xfd\x5c\xbf\x5b\x98\x94\x66\x95\x95\x58\xbf\x6d\xdf\xe1\xde\xff\x57\x56\x5c\x3e\x43\x27\xf7\xd0\xf7\xbc\x3f\x33\xab\x0d\x8a\xef\x3c\x60\xb7\xa5\x77\x76\x46\xd5\x3a\x4b\x59\x6a\x2f\x4b\x0a\xbe\xe3\x77\xef\x35\x82\x6a\xd1\x49\xa0\x75\x15\x4a\xb7\x6c\x79\xd7\x5e\x51\xeb\x14\x6c\xda\x85\xf7\x6a\xb2\x29\x49\xb0\xc4\x18\x89\xce\x52\xaa\xa3\x35\xc8\x6c\x21\xc3\x17\x88\x69\x75\xd2\xad\xbf\xbe\xae\x2f\xe2\x00\xc7\x19\x89\xe0\x24\x9a\x04\x24\xa9\x48\x0c\x10\x65\x52\xe2\x68\x16\xe3\x48\x8a\x56\x50\x82\xe3\x38\x94\x96\x31\x5c\x22\x19\x5a\x66\x50\x91\x44\x71\x51\x91\x45\x9c\xa3\x65\x1a\x10\x6f\xce\xd6\x2d\xf6\xcc\xf9\x50\xa7\x7b\xb8\xd3\x67\x70\x9a\x24\x43\x5e\xcb\xa6\x49\xea\xed\xf2\xc4\x9d\x97\xd9\x97\xd8\x5c\x7d\x55\x9f\x8a\x45\x3c\xc7\x13\xdd\xce\xa4\x61\x16\x67\x93\x1e\x8a\x2a\x59\xd6\x2a\xe5\x99\x19\x2a\x34\xd6\x85\x6e\x82\xef\x11\xfc\xd1\xe7\x3b\x57\x48\x9d\xc7\xbd\x1e\xa8\x2d\x9c\xbf\x0a\x9a\xec\xac\xd6\x19\xce\x39\x99\x93\xb6\x89\xe2\x7a\x06\x6a\xcb\x9a\x9c\x69\xb6\x37\x32\x9f\x81\x22\x5d\xad\x43\x7b\x5b\x2f\xe6\xbb\x60\xa7\x89\xcd\x72\x79\x3c\xcb\x15\x2b\xa5\x34\x69\x2d\xc6\xc2\xa2\x3d\x90\xea\x35\x54\x7b\xef\x25\xaa\xf3\x77\xc3\xea\xce\x2a\xf4\x7b\xa6\xdd\x17\xad\x1d\x43\xd5\xf1\x49\x96\x5c\x95\xe3\x54\xf3\x2f\x8c\xf6\xd2\xc7\x9f\xc9\xec\xfe\xa5\x03\xde\xb7\x4f\xa7\x26\x92\x68\x09\x2d\x64\xb7\xf6\x78\x5d\xc1\xb4\x3e\x0a\xb6\x73\x03\xe3\x2a\xb9\xcd\xaa\x94\xda\x56\x29\x3b\x29\x48\x29\x57\x46\x62\x64\x9b\x55\xbd\x9f\xa0\xd6\x51\x4c\x44\xcc\xe7\x27\xe8\x67\x5a\xdd\xe4\xfc\x09\xfa\x3c\xff\xcf\xd5\x2c\x6e\x66\xd6\xc9\xc7\x75\x51\xd5\x07\xa1\x62\x46\xe9\xe2\xd9\xb1\xd8\xdb\xc2\xbb\xe4\xc3\x77\x97\x2e\xfe\xcb\xc8\x5b\xab\x30\x9b\x30\x13\xa2\xd1\xd6\xca\xbd\x7a\xb2\x37\x7b\x9f\x4c\x73\xa6\x34\x4d\xa9\x99\x99\x45\x75\xd1\x49\x3a\x3f\x18\x6f\x27\xcd\xf5\x7b\xa9\x68\x34\x8a\x5a\xb6\x27\xa4\xb9\x82\xa2\x25\x76\x0b\x65\x51\xca\xcc\x27\x70\x35\xee\x64\xb3\x4c\xf9\xfd\xbd\x5d\x31\x36\xcb\xd2\xee\xf5\xd5\x74\x82\x16\x21\x83\x2a\x22\xc3\xb0\xb8\xc2\xb1\x28\x26\xc9\x12\x94\x25\x0c\x47\x69\x88\x63\x0a\xc7\xe1\x1c\x21\x71\x1c\x4b\xa3\x00\xa3\x20\x49\x62\x0a\xc9\x90\x1c\x43\x32\x00\x05\x04\x03\x44\xd7\xb7\xe2\xcf\xf9\x56\x3c\xda\xb7\xb2\x44\xd8\x9f\xbc\x60\x09\xee\xed\xf2\xf0\xf0\xb3\xbe\x35\x24\x9f\x76\xaf\x07\x72\xb9\x00\xdf\xca\x13\x9b\xae\xb8\xa9\x55\x45\x7d\x50\x56\x93\xd9\x4c\xb1\x54\xa8\x2f\x95\x42\x69\xb4\x6c\x59\xb9\xc2\x66\xcb\x5b\xb5\x1a\x95\xe1\x06\x13\x8a\xc6\x40\x4f\x5f\x55\x12\xb9\x4e\xa3\x20\x66\x2c\x41\x52\xed\xac\x38\x52\x39\xb9\xdb\x91\x8b\x8d\xfe\x6a\xd6\xe9\xa6\xd4\x5d\x5e\x9e\x95\xf2\xe9\x7f\x97\x6f\x7d\xd6\xb7\x3d\x39\x9f\x17\x4c\xa2\x95\x1e\xbc\xd0\xb7\xfe\xca\xdd\xc1\xc8\xf3\x28\xbf\xd0\xb7\xf1\x2f\xf2\xad\x2c\x79\xea\x1f\xb0\x8f\x12\xe6\x5b\x2b\x6c\x67\xc6\xb6\x76\x33\x0a\x6f\xe5\x47\x8d\x71\x53\xdd\xb6\x4b\xfa\xb6\x49\x96\xa6\x4c\x72\x2b\x49\xa3\x52\x7a\xf7\xde\x50\xba\xfd\x77\x68\x77\x35\x8a\xd9\x29\x1b\xac\xdd\xec\x6e\xc4\x64\x2e\x6f\x36\x66\x64\x7e\xd5\xeb\x68\xbd\xe6\xb4\x5b\xa2\xb4\xce\xc8\xb0\xb6\xb9\x81\xba\xe5\x5f\x9e\xb7\x72\x28\xcb\xa2\x40\xa2\x08\x16\xa3\x64\x20\xb1\x24\x89\x01\x59\x46\x71\x1c\x05\x0c\x4d\x60\x50\xa1\x20\x90\x08\x99\x62\x24\x1c\xb2\x1c\x4d\x90\x10\x70\x22\x85\xa3\x84\x42\x63\x80\x85\xe4\xdb\xf1\x6f\xa0\x3d\xe1\x5b\x23\x37\x28\x19\x9c\xa3\xe9\x10\xdf\xea\xb6\x9e\xbf\x06\xf1\xac\x6f\x4d\xfb\x06\xf5\xca\xb7\x3e\x50\x1d\x0d\xf0\xad\x49\xb9\x47\x36\x12\xd9\xf1\x6e\xc1\x26\xcc\xf7\x25\x5b\x2b\xbd\x5b\x15\x53\xcd\x59\x4d\x4a\xeb\x62\x1d\xfb\x9d\x83\x29\x88\xea\x7a\xb7\x5c\x69\xed\xca\x23\xa9\x2d\x02\x13\xd6\x44\x73\x9e\xc6\x47\x26\x9b\x9e\x74\x96\x33\x69\x36\xef\xe4\xb8\x75\x16\xcf\xf6\xec\xee\x6a\xbd\xeb\x19\x71\x6a\x13\x17\x46\xfb\xa9\xbe\xf5\x69\xdf\xf6\xac\x6f\xdd\x9a\xf5\x4c\xe1\x85\xbe\xf5\x57\x9e\xaf\xfb\x0c\xdf\xfa\xa8\x6f\xe3\x5f\xe4\x5b\x99\xb3\x82\x5f\xf9\x6e\x5d\xfc\xb7\xd7\x79\x17\x94\x8d\x21\xd1\xab\x1a\x9d\x30\x57\xe9\x6d\xc2\x4c\x03\x72\xcc\x08\xcb\x41\xc7\xee\x88\xca\xaa\x37\xd2\xed\x02\x85\x4d\xd2\x6d\x76\x97\xcf\x65\xb2\xf8\x82\x98\xe0\x34\x5d\xe7\x8c\x62\x82\x27\x31\x71\xae\x17\x16\x9d\x46\x42\x4a\xda\x63\x8d\xe9\x98\x6c\x19\xa3\x5f\x5f\x13\x90\x29\x4a\x84\x38\x47\x4b\x34\x81\x03\x54\x06\x18\x4e\x73\x24\x4e\xa3\x10\x52\x9c\x0c\x09\x91\x40\x29\x1a\xc3\x68\x85\x40\x59\x59\xc1\x44\x42\x66\x69\x86\x60\x49\x11\x90\xa2\x44\xa1\x98\xe2\xfa\x56\xf2\x39\xdf\x1a\x59\x08\x66\x08\x94\x0d\xf1\xad\x5e\xeb\xf9\x0b\x5d\xcf\xfa\x56\x7f\x30\xbf\xf2\xad\x0f\xbc\x39\x12\xe0\x5b\x53\xa9\x52\x77\xb3\x28\xc9\xf2\x64\x9a\x99\x6e\xb2\xbb\xda\x36\xdf\x6d\x2c\x88\xb4\xb5\xc9\x30\x94\xcc\x2c\xb5\x82\x81\x0f\x0a\x9b\x26\x43\x70\x65\x66\xd5\xe9\x94\x6b\xa9\x4c\x7a\xb4\x65\xf2\x4d\x56\x4d\xcd\x1a\x03\x3a\x41\x53\x5b\x26\xbf\x35\x0b\x9a\x20\x28\xbb\x82\x0a\x56\x7d\x21\xfb\xef\xf2\xad\xcf\xfa\xb6\x67\x7d\xeb\xbc\x57\xc9\x3e\x53\x93\xe0\xf9\x7f\xee\x0d\x95\xcf\xf0\xad\x8f\xfa\x36\xfe\x45\xbe\xf5\xd1\xb1\xf0\x7c\xeb\x48\xc5\x2c\xa0\x12\xbd\x3e\x95\x1c\x94\x1b\xd6\x8e\x55\x33\x53\x60\xaf\x99\x72\x03\xbe\xf7\x20\x33\x6f\x82\xca\xac\x29\xb5\x97\x5c\xa2\x55\x65\xb0\x4e\x2b\xbd\x1e\xd7\xc9\xf2\x72\x2b\xac\xf2\xa3\xf9\xb4\x0b\x57\xef\x4b\x69\xb9\x2d\x2f\xb6\x83\x46\x32\xc7\x6e\xfb\x33\x13\x4f\x26\x63\xbe\x2d\x73\xf9\x9a\xe8\xd9\xe7\x46\xce\x7f\x0f\xe7\x53\xb8\x3d\xbc\x6e\x79\xfa\x2a\xe6\xbd\x5f\xb3\x3a\xc3\xe8\x7c\xfe\x8c\x4f\xa7\xcf\xbf\xb1\xe9\x27\x88\xd4\x1a\xf9\x32\xdf\xe8\x23\x45\xa1\x8f\x7c\x55\xe5\x2b\x6e\xfd\x1f\xcf\xf0\xdd\xbf\x88\x6b\x1f\xd6\x5b\x9c\xdf\x22\x1c\xc9\xbd\xef\x3b\x6c\xbe\x6f\x00\xb8\xca\x90\x0c\xf9\xf0\xb1\x1f\x7b\x3b\x3f\x7e\xb4\xd4\xb2\x96\xd0\x1c\xbe\x44\xba\x4b\xb2\xb7\x84\x7b\x88\x31\xa4\x5d\xc9\xd7\xdb\x02\xf2\xf5\x04\xfe\x81\x9c\xe0\x0f\xbf\xdd\x0e\x77\xaa\xe6\x35\xc3\x7a\xb7\xe0\x77\x0d\x6a\xc0\x9f\x1b\x8b\xf8\x93\x5e\xaf\x95\xec\x36\x91\x30\x49\x43\xd8\x8a\x2d\x79\xe0\xcb\xea\x91\xaf\x83\xbf\x56\xfa\x20\x32\x61\xf2\x87\xb2\x16\xa9\x01\xd7\xa4\xc5\xad\x63\xed\x07\x41\xf2\x95\xb4\xd0\x8b\xf7\x49\x54\x07\xf4\x12\x0b\x52\xad\xf8\x27\x43\xbb\x99\xaf\x64\x11\xd1\x36\x21\x3c\x9f\x5d\xc1\xdc\xb8\x73\xec\x79\x7e\x5c\x3c\xf1\x38\x0a\x98\xd7\xe2\xf1\x63\x2e\x0f\xb3\x73\x42\x71\xce\xc9\xc5\x6a\xe0\x92\x1f\x17\xf8\xe3\xea\x03\xad\xb7\x98\x1b\x03\x6b\xfc\x0c\x67\xce\x77\x6a\x63\xb1\xe5\xff\xba\xed\x2d\x6e\xdc\xbf\xba\xfb\x0c\x3f\x2e\x86\x78\x1c\xf9\x3e\x9d\xfb\x71\xfd\x95\xdc\x9b\x53\x7e\x08\xf7\xb6\xe1\xb4\x3f\xc0\xa9\x17\x25\x5c\x86\x7d\xe8\xce\xd9\x3e\xfc\x8d\xfe\x0b\x8e\xaf\xbd\x96\x2a\x7f\x1c\x3e\x0e\x1f\xc4\xec\xe9\x93\x9c\x4f\xb2\xa9\xca\xb1\x19\x3c\x7d\x1d\xfb\xe3\x86\xab\x8d\x64\xda\x98\x0f\xe7\xaf\xe2\xdb\xc3\x75\xce\x7a\x40\xa8\x7a\x48\x92\xdb\x02\xd8\x9b\xd7\x09\xe0\xe1\x0a\xb0\xe9\x07\x45\xb8\xfc\xd4\xf9\xb5\x10\xc6\x7c\x6f\x95\x63\xe3\x21\x19\x3c\xe6\x4f\x38\x1e\x55\x7e\xb8\xa2\xad\xc3\xc7\xef\xf6\xae\xfa\x79\x5d\x5f\xa2\x3b\x67\xf9\xf0\xc7\xc0\x2f\x78\xbc\xcd\xd1\xb9\x5e\x5f\xc5\xd6\x15\xce\x78\xee\xed\x16\x83\xb6\x3b\x24\xf6\x33\xc3\x7a\xc2\xf1\xb8\x49\x46\x99\x9f\x6d\xca\x7b\x22\x22\xb0\xe0\xd3\xf1\xf3\x16\x32\x1f\xe7\x32\xf4\xf1\x79\x0e\x1b\xc9\xa0\xf3\x05\xc9\xd7\xb0\xe7\xa0\x8a\xc5\xdc\xe1\xb3\x95\x81\xac\x39\xbc\x43\xf3\x65\xea\xf3\xe1\x8b\x62\xd2\x07\x1e\x87\xd3\xd7\xe8\xf1\x02\x5b\x5c\x2e\x23\xb5\xf9\x1a\xde\x62\xf1\x14\xce\xcb\x81\x63\xcd\x30\xa6\xcb\xf9\x73\x1c\x5d\xe2\x8a\x3d\xa2\x6e\xbe\x1b\xc0\xdf\x1c\xa8\xe6\xd0\xf9\x30\xfc\x2b\x38\xf4\x63\x8b\x37\x6f\x3d\x06\x3f\x10\x3f\xcb\x1f\x88\xe7\xe2\x25\xcd\xb0\xa0\x3c\x04\x76\x80\x10\x2f\xf0\xdb\x1e\x9e\x28\x8e\xef\xcc\x8e\xf6\x58\x5f\xa6\xdd\x3b\x14\x1b\xa9\x37\xf7\x6b\xe0\xbe\x94\xc3\x1a\x1a\xfa\x10\xc8\xb2\x09\x2d\xeb\x59\x85\x46\x12\xb8\x58\xa7\x1d\xbe\x05\x7a\xb9\x32\x72\x01\xef\xe0\xfd\x79\x3b\x08\xc3\x1d\xcd\xf1\x8d\x59\x76\x89\xd0\xcb\xc2\xf7\xf8\xec\xed\xfc\xf1\x35\x78\x28\xd6\xc8\xb4\x7f\x0f\x14\xc1\xa8\x97\x43\xed\x51\x1e\x8d\xe8\x45\xdc\xde\x42\x1d\x99\xbe\xc5\xb5\xe4\x33\xe4\xaf\x36\x86\x0b\xd4\x8f\xe4\x9b\xc1\xe8\x66\x73\xc3\xdc\x3b\x3e\xef\xe3\xf5\xaf\x57\xb4\x9f\x42\x34\xfb\xbe\x0e\xf1\x85\xf1\x5c\xcf\x83\x95\x8a\x78\xfa\x3f\xa3\x11\x29\xc9\x19\x6c\x7c\x21\xe6\x26\x5c\xa9\xc6\xd2\xfa\x25\xd2\xdc\x22\x16\x29\xd6\xad\x4e\xf1\xe5\x3b\x14\x51\x3e\x4d\xa6\x03\x81\x48\x39\x02\xab\x5d\x97\xa8\x4f\x7f\x08\xfa\x33\xa6\xb6\x1f\xfb\xcd\x05\xf0\xbd\x13\xfc\x12\xe9\xe5\x12\xea\x45\x33\x3c\x8c\x44\x1c\x19\x22\xd6\x75\xa1\xc4\x5e\x17\xbe\xae\x11\xc7\xe2\x3d\x3a\x88\x9d\x2f\xb6\x3f\xc3\x6c\xae\xf1\x3f\xbc\xd4\x77\x92\xb8\x63\x20\x3f\x54\x18\x87\xa2\x61\x4c\x1f\xd6\x72\x08\xce\xc8\x14\xe1\xeb\x57\x19\xda\x40\xd5\x2c\xe4\xfb\x7f\xfe\x83\xbc\x59\x86\x26\x9f\xed\xa6\xbd\xfd\xf8\x61\xc3\x8d\xfd\xed\xdb\x07\x12\x0c\x28\x19\x72\x3c\x40\xb7\x16\x1f\x0c\x2a\x1a\xcb\xd1\xd8\x8e\x45\xfe\x02\x34\x9c\x81\x0b\x50\x1f\x0b\xdf\x90\x6e\x4e\x68\x08\xae\x91\x21\x3f\x11\x82\x88\xbd\x11\xad\xca\x43\xe5\x6c\x9b\x28\x53\xfc\x35\xdb\xd1\x1e\x59\x24\x53\x6d\x08\xf9\x6c\xe5\xb8\x05\x84\x34\x84\x8c\xd0\x10\x2a\x29\xa1\xe9\xdb\x15\x71\x5a\xab\x15\xa4\x5d\x4b\xef\x4d\xa6\x21\x34\x5b\x8d\x7c\xaa\xb5\x7f\x94\x16\x4a\x42\x4b\x40\x52\x7c\x33\xc5\xa7\x85\x90\x7d\xb4\xfd\xba\xe3\xf2\x76\xe8\x2b\xc5\xbc\x4e\x19\x97\x74\x22\x36\xc9\x82\x38\xb9\xd4\x8f\xbf\x6c\x74\x53\x59\x5e\xa2\x1f\xb1\xa3\x18\xa8\x09\x6f\x29\xfb\x8f\xeb\xe1\x9c\x8f\x5b\x5a\x38\x54\x09\xc2\x0d\xe6\x3e\x0d\x5c\x17\x95\xfe\x41\x35\x04\x30\x73\xa9\x8b\x1b\x65\xb0\xd7\x1a\x85\xbf\xc4\xf1\x6f\x50\x48\xb0\x69\x5c\xd5\x90\xe2\x5a\x47\xcd\xb0\xec\x91\x09\x9b\xf5\x12\x22\x03\x1b\xec\x4d\x0c\x91\x97\xb3\x39\x22\x19\xb3\xb9\x06\x6d\xe8\xc8\xf0\xff\x02\x00\x00\xff\xff\x2b\xd9\xc0\xec\x36\xc4\x00\x00") - -func asset_stat_accountHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_accountHorizonSql, - "asset_stat_account-horizon.sql", - ) -} - -func asset_stat_accountHorizonSql() (*asset, error) { - bytes, err := asset_stat_accountHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_account-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf7, 0xa8, 0xb, 0x52, 0x14, 0xea, 0x72, 0xb1, 0x31, 0x42, 0x61, 0x8, 0x11, 0x47, 0xa4, 0x23, 0xe8, 0x40, 0xb, 0xa8, 0x7c, 0xce, 0x5c, 0x49, 0x48, 0x16, 0xe2, 0xa7, 0x84, 0x5b, 0x61, 0xaa}} - return a, nil -} - -var _asset_stat_operationsCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x59\x93\xe2\xb8\xf2\xef\x7b\x7f\x0a\x47\xbf\x54\x4f\x50\x33\x78\x5f\xba\xef\x9c\x08\x1b\x0c\x18\x8c\xcd\x62\xd6\x1b\x37\x3a\x64\x4b\x06\x83\xb1\xc1\x0b\xdb\x8d\xf3\xdd\xff\x81\xa1\xc0\xac\x45\x41\xf5\x99\xf3\x8f\x68\x3f\x54\x57\x5b\xe9\xcc\xd4\x4f\x99\x29\x29\xa5\x92\xfe\xfc\xf3\xcb\x9f\x7f\x62\x35\x3f\x8c\x06\x01\x6a\xd6\x55\x0c\x82\x08\x98\x20\x44\x18\x8c\x27\xd3\x2f\x7f\xfe\xf9\x65\x53\x9e\x8f\x27\x53\x04\x31\x3b\xf0\x27\x07\x82\x39\x0a\x42\xc7\xf7\x30\xe1\x2f\xf6\x2f\x22\x45\x65\xae\xb0\xe9\xe0\xe7\xe6\xf3\x13\x92\x2f\x4d\xd9\xc0\xc2\x08\x44\x68\x82\xbc\xe8\x67\xe4\x4c\x90\x1f\x47\xd8\xdf\x18\xfe\x23\x29\x72\x7d\x6b\x7c\xfe\xd6\x81\x2e\xfa\xe9\x78\x3f\xa3\x00\x78\x21\xb0\x22\xc7\xf7\x7e\x86\x28\xdc\xf0\x3d\x27\xb6\x5c\x67\xc3\x1a\x79\x96\x0f\x1d\x6f\x80\xfd\x8d\xbd\xb4\x8c\x02\xff\xf2\xe3\x4d\xb6\x07\x41\x00\x7f\x5a\xbe\x67\xfb\xc1\xc4\xf1\x06\x3f\xc3\x28\x70\xbc\x41\x88\xfd\x8d\xf9\xde\x8e\xc7\x10\x59\xe3\x9f\x76\xec\x6d\x65\x99\x3e\x74\xd0\xa6\xdc\x06\x6e\x88\x8e\xc4\x4c\x1c\xef\xe7\x04\x85\x21\x18\x24\x04\x0b\x10\x78\x8e\x37\xd8\x92\x04\xfe\xe2\x67\x88\xac\x38\x70\xa2\xd5\x86\xb9\x6d\xff\xd8\x01\x80\x40\x60\x0d\x7f\x4e\x41\x34\xc4\xfe\xc6\xa6\xb1\xe9\x3a\xd6\xeb\x06\x31\x0b\x44\xc0\xf5\x07\x3f\xbe\x7c\xc9\x37\xf4\x1a\xa6\x68\x79\xb9\x8b\x29\x05\x4c\xee\x2a\x4d\xa3\xb9\xa3\xfc\x2b\x9e\x0e\x02\x00\xd1\xd0\x09\x23\x73\x15\xa2\xd9\x8f\x9b\xd4\xa1\x35\x9d\xc5\x7e\x10\x4f\xc2\xfb\x88\x91\x37\xbf\x87\xd2\x45\x70\x80\x82\x7b\x28\x37\x7a\xda\x08\xdd\x49\x79\x07\x99\x89\xc2\xc8\xb7\x6d\x14\x38\x1e\x44\xcb\xdb\xb4\xc0\xb2\xfc\xd8\x8b\x4c\xe0\x02\xcf\x42\xe1\x8f\x2f\xa2\x6a\xc8\x0d\xcc\x10\x25\x55\x4e\x51\xeb\x9a\xda\xbb\x00\xaf\x1f\xac\xb0\x84\x7b\x4e\xd7\x9a\x46\x43\x54\x34\x23\xf5\xd1\x31\xe1\xcf\xe9\x18\xad\xee\xe1\x1f\x2d\xdf\x67\xbd\xa7\xf9\x00\x57\x1b\xdd\xa1\x73\x9a\xec\x7e\xde\x41\x1c\x46\xae\xe3\xa1\xf0\x16\xe7\x3d\xd1\xdd\x7c\x37\x5a\xa0\x24\x1a\xdc\xe0\x7b\x20\xba\x9f\xef\xde\xe4\x6f\xf1\xdd\x13\xdd\xcd\x77\x4b\xef\x78\xb6\x7f\x83\xef\x81\xe8\x6e\xbe\xd3\xd8\x0c\x63\xf3\x06\xcf\x2d\xc1\x47\xf8\xb9\x4e\x38\x9c\xc5\x28\xbe\x85\x6c\x9a\xec\x7e\xde\x08\x05\xb7\x60\x4d\xca\xef\xe6\x96\xb8\xf1\x2d\x76\x5b\x82\xbb\xf9\x6d\xa3\xd2\x10\x01\x78\x9b\xed\x11\xdd\x2f\xe6\xbe\x8b\x94\x68\xf6\xf3\x4e\x31\x26\xf0\x6e\x30\x37\x81\x77\xb7\xc2\xbb\xe8\x77\x4b\xd7\x37\x92\x8f\xf2\xdc\x8c\x01\xde\x67\xbb\xa1\xda\x71\x4e\x68\x4f\x19\x5f\x0c\xb9\xb7\x69\xf7\xa1\xf1\x3d\xb2\x43\xa0\x7b\x87\x72\x1f\xb8\x6e\xd3\x1d\x02\xd1\x3b\x74\xfb\xc0\xf2\x2e\xdd\x5d\xfa\x1d\x02\xca\x6d\xba\x6d\x90\x78\x97\x66\xef\xf2\xef\x50\x6e\xfc\xf8\x36\xc9\xd6\x37\x6f\xd3\x1c\xb9\xc2\x6d\x52\x13\x78\xb7\x09\xde\x4c\xf5\x2e\xaa\x8d\xe5\xed\x08\xe5\xae\x21\x6b\x4d\x45\xd7\xd2\xc4\xee\x74\x10\xce\xdc\x1d\x45\x33\x57\x92\xab\xe2\x19\xaf\x1f\x5f\xb6\x63\x63\x0d\x4c\xd0\xf7\xb7\x77\x98\xb1\x9a\xa2\xef\xbb\x4f\x7e\x60\x4d\x6b\x88\x26\xe0\x3b\xf6\xe7\x0f\x4c\x5f\x78\x28\xf8\x8e\xfd\x99\x0c\x99\x73\x0d\x59\x34\xe4\x37\xce\x6f\xfc\xbe\x1c\x71\x3c\x2e\xdc\x31\xce\xe9\xd5\xaa\xac\x19\x37\x38\x6f\x09\x30\x5d\x3b\x66\x80\x29\x4d\xec\xe5\x6d\x7c\xfb\xf6\x2e\x4c\x98\xbc\x9c\x4a\x7e\xab\xfe\x4e\xe6\x1e\xa1\x77\xeb\x73\x84\xa5\xa6\x1b\x27\x78\x62\x1d\xc5\x28\xed\xd5\x4a\x0f\x68\x8f\xc4\x1f\xb8\x9c\x28\xf2\x91\xca\x9f\x31\x49\x00\xa8\xa9\xd9\xe9\x60\x33\x8b\x99\x06\xbe\x85\x60\x1c\x00\x17\x73\x81\x37\x88\xc1\x00\x25\x30\xdc\x39\x00\xdf\x90\x41\x64\x83\xd8\x8d\x7e\x46\xc0\x74\x51\x38\x05\x16\xda\xcc\x26\x5e\x4e\x4a\x17\x4e\x34\xfc\xe9\x3b\x30\x35\x41\x38\xaa\x6c\xda\x20\x77\xd5\x4c\x4c\xf7\x50\xc9\x37\x03\xb8\x04\xf8\xd6\xca\xd3\x41\xf7\xdb\x17\x0c\xc3\xde\xde\x38\x10\xb3\x86\x20\x00\x56\x84\x02\x6c\x0e\x82\x95\xe3\x0d\xbe\x31\xec\x1f\x49\xdb\x68\x2d\x55\x7d\x4d\xa8\x37\x1f\x7a\x60\x82\x2e\x10\xf3\xfc\x25\xe2\x39\x70\xe3\x4b\xd4\x04\x41\x9e\x92\xbb\x20\x8c\x26\x3e\x74\x6c\x07\x41\xcc\xf1\x22\x34\x40\xc1\x9e\xe4\xcb\x1f\xa7\x6d\xbf\xf7\xe2\x27\xb1\x08\x1f\x02\x62\x37\x11\xc0\x4c\x67\xe0\x78\xd1\x49\x61\x88\x66\x5e\x3c\xb9\x5c\xe6\xc5\x93\x30\x36\x91\x17\x05\x9b\xa9\xe0\x69\x35\xb7\x34\x8e\x67\xbb\x60\x33\x63\x84\x28\x8c\x2e\xab\xb3\x25\x1c\xfa\x13\x04\xfd\x09\x70\xbc\x0b\x54\x34\x7d\xaa\x74\x34\x0c\x50\x38\xf4\x5d\x18\x62\x11\x5a\x9e\x6a\x66\xbb\x60\x70\x4d\xa3\x9b\x6d\xb3\x43\x24\xde\x48\x75\x1d\x60\x3a\xae\x13\x6d\x2a\xb7\xad\xff\x1b\x24\xae\x7b\xab\xd8\x19\x78\x9b\xb1\xd0\x46\xad\xed\x9b\xd4\x68\x60\x3f\xb4\xd8\x81\xfe\x33\x99\x56\x63\xb9\x92\x9c\xab\x60\xdf\xbe\xbd\x35\xc5\xbf\xfe\xc6\xf0\x3f\xfe\xb8\xf1\xf5\xa9\x82\xa7\x7c\xce\x2a\xf0\x1e\xc7\xa3\xb6\x3c\xe1\x76\xdc\xce\xef\x71\x3a\x87\xe7\x84\xdd\x05\xfc\xb6\x3c\xcf\x1d\x63\xd3\xff\x3d\xea\x13\x9b\x21\xe3\xd6\x1d\x3c\x1f\xa2\xb4\x2f\x1c\xf9\xc0\xb9\xd0\xe3\xfe\xf9\x51\xf1\xc7\x03\xe3\xad\x22\xbb\x77\x20\x1c\xa6\x94\x61\xcf\x6c\x7b\x1a\xa0\xf9\xbb\x44\x66\x6c\x8d\x51\xe4\x3a\x61\xf4\x2e\xe9\x7e\xb4\xfd\x66\xee\xdb\xd7\x96\xeb\x87\x28\x72\x26\x57\x3c\x3f\x09\xac\x17\x7c\x2b\xd5\xe6\xc7\x83\xfa\x3d\xbf\x93\xf6\x3e\xc8\xb9\x62\x3a\xd7\xe6\x06\xc7\x6c\x0e\xb5\xb8\x66\x2d\xbb\xc1\xd7\xa3\x2d\xb6\x9b\x78\x7d\xdb\x3b\x39\x0a\xee\x8c\xa0\xdb\xcc\x0b\xbc\x16\x41\x13\x73\x07\x61\x88\xa2\x4b\x78\x6e\x7d\xf5\x6a\x31\x98\x6c\xdc\xea\x32\xeb\x69\xe0\x58\xc8\xbb\x12\xc4\x92\xc2\x6b\x11\x2e\x29\xc4\xa0\x1f\x9b\x2e\xda\xd8\x9b\xe5\x24\x19\xc9\x4f\x8d\xa2\xa9\x16\xde\x4d\x59\xb7\x75\x39\x69\xd7\x5d\x05\xaf\xd8\xc6\xee\xcb\x1d\xc2\x27\x9f\xbe\xe1\x7e\xcd\x20\xb6\x03\xf6\x47\xed\x61\x3b\xad\xdf\x9a\x83\x33\xbd\xd4\xf1\x33\x67\x9e\xeb\x07\xd1\x1e\x8d\xbc\x5c\x10\x5b\xaa\x81\xe1\xa7\xdd\x26\x5a\x46\x20\x8a\xd0\x64\x1a\x61\x1b\xb7\x08\x23\x30\x99\x62\x9b\x21\x93\x1f\x6f\xdf\x60\x6b\xdf\x43\xe7\x9d\xad\x0d\x1c\x37\x0e\x52\x5d\xed\x35\x09\xd1\x6a\x8a\xde\x6f\x94\x6d\x5a\x22\xc5\xf7\x3c\xec\xef\x25\x5e\x69\x9d\x5d\x66\xc3\x0f\x4e\x1b\xf5\x5b\x82\xc4\xbf\x30\xfc\x0f\x4c\xd4\xf2\xd8\xf6\xbf\xff\xe7\x6f\x8c\x65\x18\x8a\xf9\xe3\x62\x5b\xa5\xa7\x61\x0f\x37\x59\x3a\xcb\x93\x8e\xb9\x57\xd0\xd8\x26\xda\x36\x5e\x77\x51\xa1\xcd\xdc\xf1\x09\x55\xc2\xd8\xdc\x29\x11\xa0\xf0\xa8\x03\xa2\x2e\x8e\x18\x03\x04\xf6\xbe\x74\xae\x4f\x6a\xce\xfb\xa8\x4e\xa9\x64\xdd\x1d\x3d\xe3\x56\xb1\x59\x88\x6e\xf5\x30\xe7\x7a\xa6\xe6\xf0\x8f\xea\x79\x60\x71\xbf\x9e\x67\x9d\xdc\x49\x39\xf2\xe6\xc8\xf5\xa7\xe8\x9d\x2e\xed\x20\xfa\x89\x8e\x28\x95\xee\x78\x02\x82\xb7\x7c\xed\xb7\x7b\xda\xe1\x60\x45\xef\x01\x31\xbb\xd2\xd1\x1c\x83\xf0\x96\x07\x3e\xe2\x78\x0a\xc4\x91\xb4\xab\x60\x1c\x72\x44\x0f\x83\x71\x48\x8a\x7f\x3b\xf8\xed\xf1\xe4\xed\x82\x4f\xdd\xf2\xee\x54\x86\xeb\x51\xad\x52\x4b\x00\x8f\x4c\xbb\x92\x1e\xff\x46\xa4\x76\xc2\x30\x46\xc1\xfd\xac\x2c\x1f\x5e\x9c\x9d\x9e\xc1\x12\xb9\xce\xc4\xb9\x32\xa2\xb8\x39\x17\xfc\x27\x67\x55\x29\xeb\x4c\xad\xaa\x3c\x34\x8b\x4a\x7f\xff\x59\xf3\xa8\x14\xcf\xc7\xe7\x3f\xb7\xb8\x6e\x1b\xed\x84\xd3\xae\x25\xff\x75\xd9\xf1\x8e\xd2\xbd\x0f\x1b\x79\x7a\x0d\x6d\x6b\xe6\xd1\xf2\x28\x14\xdf\x31\xdf\x38\x35\xc0\x65\xb2\x4a\x79\xb5\xd4\x1a\x02\x6f\x80\x2e\x4e\xec\xd3\xe0\xa4\x97\xed\x1e\x8f\xd5\x87\xdc\xf9\xe3\x10\xfd\x87\xf1\x31\x7d\xb8\xba\x04\x4e\xb4\x0c\x50\x18\xbb\x17\xa3\x7b\xb4\x9c\xa0\x77\xe7\x73\x87\x25\xd6\xc7\xf1\x3c\x59\xb7\x78\x14\xd4\x93\x15\xe7\x6f\x77\x01\xb7\xfb\xe8\x16\x7a\x3b\x92\x4b\x40\xdc\x67\x76\x27\x2b\xdc\x8f\x00\x95\xdf\xcc\xac\x6d\x3f\x78\x27\x19\x8a\xe5\x45\x43\x7c\x07\xb3\xdb\x2c\xc3\x0f\xf3\x53\xb4\xa6\xdc\x30\x30\x45\x33\xf4\x43\x52\xb1\x2d\xaa\x2d\xb9\x89\x7d\x7b\x29\x4a\x8d\x5a\xaf\xa4\xa8\x64\x4e\xa1\x0a\x5a\x9d\x96\xba\x6a\xa1\xaa\xe5\xd5\x42\xb9\xa5\xd5\x5a\x64\xa9\x47\xf5\xab\x85\x66\x49\xd7\x5a\x39\x59\x17\x9b\x1d\xae\x9e\xe3\xf4\x2e\x59\x7a\x79\xc5\x84\xed\xc3\xec\xfe\x65\x71\xfc\x15\xa3\x5f\x31\xfc\x75\x8b\x32\xf6\xf2\xf2\x8a\xbd\x88\x75\x51\x14\xc5\xbf\xff\x7e\x49\x0a\xc8\xb7\xb2\xc3\xcf\x3f\x7e\xbc\xa7\x61\xae\xd0\xef\x68\x94\xa8\xb7\x0b\xf5\x2a\x29\xf5\x8d\x7e\x97\xab\xd1\x5c\xa7\xa9\xd0\xf5\x6a\xb1\x9c\x63\x49\x55\x51\x6b\x15\x3d\x6f\x68\x79\xb5\x5d\xe9\xf7\x35\x91\x91\xea\x65\xea\xe5\x15\x23\xf0\xfd\xf3\x8a\xf1\x0c\x2f\x08\x14\xcd\x08\xe4\x2f\xd0\x51\x94\xb8\x62\xb5\x5e\x2b\x33\xbd\x1e\x29\xd3\xad\x72\x55\xd5\xc4\x7e\x2d\x2f\xb7\x2a\xb5\x0a\x2d\x8a\x4a\xad\xd1\x55\xfa\xa5\x4a\xbf\xd8\x52\x1a\x39\xb6\x50\x23\x55\xb1\xde\xcc\x6b\xff\x51\x1d\x73\xcd\x2e\x5d\xcb\xb7\xfa\x35\x4a\x52\x19\x92\xec\xb7\xab\x85\x6e\x4e\x2e\x33\x8c\x56\x91\xf5\x92\x5c\x55\x14\xae\xd6\xac\x96\xfb\x9a\x28\xca\xcd\x32\x4d\xd3\xc5\x66\xb3\x5c\xd5\x0f\x2d\x2d\x1c\xa9\x48\xbd\x62\xc4\x0d\x15\xa9\x87\x54\xec\xa9\x46\x4d\x6f\x71\x4a\xbb\x57\x2a\x89\x54\xb7\x52\x2f\xd0\x3d\x89\xee\xd0\xfd\x4e\xa9\x20\x37\xaa\x7a\x9d\xab\xd0\x9c\xd2\x11\xb5\x8a\x26\x15\x24\xad\x5c\xd6\x64\xbd\xc8\x7c\xaa\x8a\x57\xfc\xef\x34\x6f\xf9\x84\x2b\x5f\xcf\x46\x7e\xd4\x9f\x8f\x33\x92\x7b\x1c\x59\x0a\x0a\xbc\xcd\x50\x2c\x42\x2c\x0f\x09\x93\xe4\x4c\xc6\xe4\x05\x9b\xa4\x80\xcd\x50\x04\x61\x72\x0c\x2b\x00\x92\xb6\x81\x4d\xd0\x38\x05\x20\x6e\x32\xa4\xc9\x52\x94\x89\x73\x26\x12\x84\x0d\x54\xf8\x93\xcf\x86\x07\xc3\x91\x80\x44\x14\x69\xdb\x24\xcd\x03\x9c\x33\x71\xc4\xe1\x36\x24\x6c\x16\x52\x04\x6f\x11\x36\xb0\x20\x89\x9b\xac\x65\xe1\xbc\x45\x51\x90\xe1\x38\x86\x64\x04\x9e\xe5\x09\x92\x01\x04\xfb\x92\xb4\x1f\xbe\x69\xb8\xff\xda\x47\xea\x56\x1c\x7a\x95\x5d\x35\x2b\x12\x97\xf7\xf2\x42\x89\xc4\x97\x23\x29\x13\xe2\x83\x28\x5c\x28\x8b\x35\xd1\x85\xcd\x4e\x0f\x48\x65\x50\x18\x6c\xe8\x65\x8d\x56\xc1\x7a\x4a\xd6\xdf\xe5\xdc\x17\xbb\x04\x9d\x90\x49\xe3\xff\x40\x45\x3e\xf5\x79\x39\xf1\xf5\x2b\x86\x8a\x43\x8b\x63\x38\x9c\x35\x6d\x41\x60\x78\x1b\x42\x92\x22\x59\x68\x01\x8e\xb2\x68\x52\x30\x01\x4f\x09\x26\xc5\xb0\x8c\x69\xd3\x94\xc0\x08\x96\xc0\x91\x34\x8b\x23\x12\x71\x34\x01\x19\xd2\xdc\x18\xd9\x67\x18\x3b\x0d\x68\x13\x58\x36\x87\x23\xc4\xb3\x34\xc3\x73\x9c\x60\x93\xb6\x4d\x23\x86\xb6\x21\xcf\x11\x38\x60\x68\x8a\x36\x6d\x1c\x32\x3c\x85\x73\x88\xe7\xa1\x6d\x11\x38\x03\x05\x9c\xe2\x69\x62\xc3\x83\x7c\xc5\x08\x86\x11\x18\x4e\x60\x59\x6e\x67\xb1\x39\xb2\xd6\x1f\x11\x5a\xcc\xf8\xb8\x59\xe6\x3a\xb4\xb7\xd2\xe7\xad\x65\x91\x6a\x4f\xfd\x71\x66\x5e\x10\xf5\x28\x47\x54\xc8\x2a\x27\x71\x6c\x5f\x74\xe9\x65\x3b\xe4\xa6\x59\x58\x6a\x3b\xb5\xd1\x78\xee\x90\xa3\x85\xc1\x11\xa2\xc0\x56\xda\x4b\xa9\x60\x38\x6d\x7b\x0c\x6a\x95\x5a\xad\x9a\x20\xdc\xad\xb5\xab\xf2\x62\xf3\x9b\xb2\xff\xb1\x0d\x6f\xe1\xe1\xff\x0b\xb1\x56\xdf\xd9\x8e\x43\xb7\x10\x89\xcf\x35\x1f\xb7\x26\xda\x6a\x2c\xa9\x7e\x81\x98\xb0\xab\x9a\x3c\x37\xe0\x9c\xaa\xda\xb9\x59\xdc\xe9\x2e\x2c\x4e\x9b\x2e\x2b\x4d\x76\x4d\xe5\xe3\xe1\xb8\x53\x42\xb6\x9a\x35\x5c\x43\x18\x2e\x73\x6e\x1d\x9f\x2f\x88\x5e\xb5\xc4\x2a\x14\x2f\x17\xc8\xba\x2e\x17\x13\x79\xca\x05\x8b\x2e\x5e\x34\xef\x37\x8b\xce\xe3\xe5\x5f\x68\x7b\xbf\xe6\xb9\xd3\xa2\x09\xde\x32\x4d\x8a\x03\x26\xc5\x11\xd0\x32\x05\x1c\xb7\x78\x9a\x05\x84\x0d\x79\x1c\xc7\x2d\x12\xe0\x82\xc5\xf2\x08\x90\x94\x09\x68\x8a\x67\x78\x0b\x87\x08\x41\x9c\x81\x36\x09\x05\x0b\x26\xa1\xf7\x13\xbc\x82\x64\x18\x28\xb0\x34\x41\x9b\x2c\x8b\x10\x4e\x11\xb6\xc0\x02\x8b\x26\x79\x1b\x92\x1c\xb4\x11\x02\x0c\x41\x71\x08\x98\x34\x6d\x41\x01\xf1\x1c\x4f\xf0\x38\x14\x4c\x60\xb1\x16\x01\x18\xee\x25\xe9\x1e\xf7\x16\xcd\xbf\x59\xf4\x82\x2a\xb5\x17\x20\x3b\x69\x8f\x04\x7c\x54\x8e\x56\x5e\x4d\xae\x98\xb3\xfc\x64\xdd\x76\xe7\xb8\xde\xf6\xca\xd6\xb8\xa7\xab\x5e\x1d\xb6\x02\xd9\x16\x7b\xa5\x8e\x2d\x7a\x3c\xed\x8d\x86\x7d\x1f\x28\x85\xbe\xab\x10\x95\x50\x8b\x1b\x79\xdb\x42\x82\xcd\xce\xdb\x26\x4b\x77\xcb\x78\x82\xf0\xc6\xa2\x0b\x29\xc4\x87\xcd\x3c\xcb\xaa\xc3\xb5\xc9\xf5\x35\x3f\x68\xad\xd6\x46\x7d\x26\x11\x84\x07\xf1\x30\xa8\x96\x6a\x73\x7e\x0c\x9c\xba\x6a\x30\x43\x67\xe0\x76\xfb\x7d\xa9\x49\x9a\xb1\xb8\xcc\x74\x02\xb9\x52\xc3\x3d\x2a\xc3\xba\x32\xc5\x06\x8d\x2a\x89\x86\x74\x51\x24\xcd\xa0\xb8\x00\xed\xc4\x63\xaa\x17\x2c\xb6\xdc\xbb\xd4\xea\xff\xdb\x2d\xf6\xca\x08\xe4\xc2\xb2\xda\x13\xe3\x99\xf3\x35\x99\x67\x98\x5d\x5b\x34\x78\x8e\xe7\x69\xde\xff\x09\x6e\x57\xb2\xf6\x4f\x70\xbc\x92\x5f\xff\xe8\x68\x30\x95\x63\x4f\x0d\xa9\x4b\xcd\x9a\xd8\xd1\xd4\x76\x4f\xd6\xcb\x4c\x5d\xe9\x68\x4c\xbe\x61\x90\x95\x42\x51\x2f\x34\x1a\xdd\x9a\x54\x2d\x16\xf3\x64\x8e\xec\x92\xfd\x5c\xa1\x2b\x75\x15\x8d\x22\xbb\x86\xb2\xed\xd1\xb6\xe3\x2e\x85\xf7\x06\x21\x01\x2d\xd9\xf2\x42\xb9\x63\xe2\x56\x9f\x6d\xb5\xd6\xce\x72\x04\xe9\x4e\xb1\x5a\xab\x47\x5d\x62\xdc\x30\x87\xf1\x30\x16\x0e\xd6\x97\x74\x40\xb9\xe4\xd7\x8d\x9b\xc9\x83\x5c\x77\x54\xe8\xac\x63\x4f\xc0\x61\x47\xc9\xe8\xcd\x8c\x0a\x6a\x52\x6d\xde\xca\x53\xfe\xb4\x2b\xcb\x6d\xbd\xdc\xce\x34\x7c\xde\xe7\xf9\xc4\x47\x25\x4b\x68\x2d\x8c\xe4\xfb\xc1\xfe\x87\x94\x30\x5d\xec\xff\x9f\x17\x45\x21\x97\xf2\x62\xa9\x3f\xb0\x16\xb0\x66\x22\xae\x0b\xab\x85\x5a\x9f\x1f\xf1\x5c\x19\x5f\xcb\xb3\x5c\x2d\x93\xe9\xca\xe5\x71\x09\xcf\xc3\xb9\x2d\xf4\x27\xaa\x92\xb0\xe3\x63\x73\x6d\x52\x6e\x66\xb8\x14\xa8\xee\x30\x6e\x7a\xc5\x9e\x16\x97\x6a\x71\x65\xd1\x93\x7d\x9a\x55\xd7\xd9\x7e\x50\x21\x06\x43\xb3\x94\x17\x04\x89\xc9\x94\xd7\xba\x3f\x5e\xdb\xbc\x94\xcf\xcc\xf8\xae\x14\x48\x6b\x5e\xc4\xc7\xf4\xb2\xc0\x95\x38\x41\xf6\xf5\x7e\xb6\xee\xe6\x37\x13\x8c\x93\xde\xe2\x93\x9b\x86\x7a\xaa\x69\xaa\xc7\x4d\x93\x17\x1b\xbc\x34\x80\x7d\x3e\x67\xaf\x1d\xa4\x17\x26\x43\x7f\xd0\x9e\xb4\x46\xad\xd9\x82\x64\x64\x4d\x58\x72\x44\x76\x26\xb4\xe7\xc1\xd0\xf2\xea\xfb\xa6\x69\x9d\x44\x9b\x0f\x43\x0f\xe4\x3c\xc1\xbb\x6a\x63\x5c\xf0\x1d\x6f\x54\x98\x89\x32\x37\x64\x48\x6d\xdc\xaf\x57\x96\x7a\x45\xe4\x69\xc0\x0d\x4b\xe1\x48\x68\x53\x4b\x69\x64\xb1\x83\x4c\xb5\xb8\x66\xb9\xbc\xc9\xe5\x96\x3e\xb7\x28\xd4\xcc\x86\xb1\x10\x3d\xa9\xac\x65\x3c\x21\xdf\x13\x22\x81\x42\x92\x34\xd8\x42\x7f\xdd\xcf\x2e\x2d\xe2\x3c\xe0\x67\x6f\x0b\x39\x87\x29\x17\x8b\x73\x14\xce\xd1\x36\xbb\xe9\xce\x39\x8e\xb6\x08\xda\x66\x39\x8b\xb7\x2d\x64\x09\x90\xa2\x08\x12\xe0\xbc\x6d\x9b\x88\xb1\x68\x92\xa5\x09\x9b\xc6\x21\x34\xa1\x6d\x33\x82\xc0\x9b\x64\xba\x51\x13\x90\xe5\xe4\xd7\xd1\x0a\xe5\xd6\x6d\x62\xd1\x58\xa1\x45\xa3\x3f\x6f\x2c\xbd\x69\xc3\xd0\xd5\xa2\x46\x0d\x7b\xbd\x85\x90\x23\xec\x4e\xa3\x10\x17\xd9\x22\x87\xbf\x17\xf3\xaf\x2c\xda\x7c\xb8\xf2\x87\x85\x9b\x7d\xe5\xdf\xfe\x52\x6a\xbb\x0d\x13\x3b\x7b\x36\x03\x12\x02\x3f\xf3\x89\x0b\x9c\x3c\x14\x2d\xfc\x60\x3c\x05\x61\x38\x1d\x06\x20\x44\x17\x38\x19\x28\x8c\xb0\x66\xbe\x80\x69\x5b\x62\xec\x07\xd6\x44\xd3\x08\x4d\x4c\x14\x60\x24\x4e\x30\xf7\x08\xb2\xfd\xc0\x42\xa1\x35\xf5\x3d\x0f\x2d\x23\x17\xc4\x9e\x35\x3c\x15\x94\x6c\x73\xbc\x87\xd9\x76\x2c\xb8\x4b\x23\x86\x97\xeb\xff\xff\x93\xac\xe3\xd7\xc8\x99\xa0\xaf\xdf\x31\x7c\x9b\x84\xfc\xba\xfb\xbb\xb1\xaf\xdf\xb1\x6d\x79\xf2\x72\x08\xc2\xaf\xdf\xb7\x9b\x2c\x93\x97\xff\xde\x11\xdb\x08\xdd\x47\x38\x01\xcb\x68\x19\x3a\xeb\x3b\xc9\x03\x14\xa2\x60\xfe\x1e\xf1\x97\x7f\xdf\x05\x05\x08\xa3\x64\x77\x10\xdc\xad\xd2\x5f\x32\x85\x67\xc7\xc8\x77\xe8\xb1\x8b\xb6\x20\xb0\x86\xce\x7c\x57\x78\xa5\x49\x0e\x6d\x40\xec\x00\x49\xe0\x08\xbe\x7e\xc7\xbe\xce\x09\xe2\x2f\xe2\x2f\xfc\xeb\xae\xc0\x8a\x83\x00\x79\x91\x9a\x54\xed\xeb\x77\x8c\x3a\x7e\x2f\x25\x1b\xb8\x36\xb8\xfd\xdf\x3d\x90\x07\x48\xf7\x94\x1b\xc6\x36\x49\xd8\x2c\x34\x05\xc1\xe2\x81\x45\x32\x26\x6f\xda\x2c\x47\x22\xde\xe6\x18\x8a\xc5\x49\x0a\x07\x02\xcf\xd2\x80\x21\x19\x5c\x60\x05\x01\x11\x26\xc0\x29\x40\x12\x90\x83\x3c\x4f\x9b\x70\xa7\xd1\x9e\xef\xc6\x8a\x8f\x1a\x70\x5f\x92\xd4\x7d\x63\x72\x47\x45\xff\x3e\xf9\x3e\xf4\xc0\x74\xa3\x17\xb2\x29\x02\x90\x38\xa0\x04\x1e\x21\x8e\xb2\x10\x49\x92\x1c\x83\x00\x4f\x70\x1c\xc7\xb3\x26\xb0\x18\x9a\x65\x58\x9b\xa2\xa0\x65\xd1\x36\x65\x23\x8b\xc5\x21\xc3\x40\x68\x13\x9b\x99\xf8\xd7\x2f\x17\x24\x5c\xc1\xe0\xd9\x14\xd3\xc7\x31\x20\x5e\xcf\xcb\xfc\x38\x9a\xc6\xd1\xe7\xd6\xfd\x16\xc2\x4f\xd7\xfa\xbf\x1a\xe1\xfb\xac\xec\x37\x06\xbf\x31\xf8\x8d\xc1\x6f\x0c\x7e\x63\xf0\x1b\x83\xdf\x18\xfc\xc6\xe0\x17\x62\x90\xfc\xf6\xff\xee\x9f\xbc\x84\xd6\x34\xf9\x33\x89\x4b\xcf\xcb\xdb\x0c\x3d\x49\x3e\xe5\x6a\x65\x5a\xd5\xba\x5d\xa9\x54\xe6\xa4\xc2\x44\x28\x15\x91\x5b\xa8\xd2\x61\x8f\x42\x85\xe1\x28\x8f\xab\x6d\xa1\x2f\x77\x68\xd3\x37\xe7\x87\x14\x55\x3e\xf9\x49\xf6\x4a\xd5\x92\x41\x52\x31\x41\x19\x92\x41\xda\x4a\x56\x5f\xc1\xea\xb2\x32\x18\x65\xe7\xee\x32\xd7\x97\x04\x91\x32\xa9\x6c\xa7\xef\xac\xf6\x19\x81\xf2\xe0\xc9\x34\xcd\x23\x19\x05\x49\x0c\x69\x14\x35\xa5\x41\x20\xcd\x9b\x64\x97\x2e\x57\x07\x28\x5b\x22\x2b\x78\x49\xa2\x4a\x7e\x2b\x8b\xf8\x86\xe6\xcd\x6a\x93\x92\x36\x5a\xd5\xa5\xe9\xb2\xd1\xd4\x42\xad\x35\xe6\x81\xab\x18\xb5\xf9\xc4\xa7\x3c\x91\xb6\x57\xf3\x72\x8e\xae\xbb\xed\xd6\xaa\x59\xe8\x65\x82\x79\x29\x37\x78\xd3\x27\xd7\x7b\x72\x95\x40\x7a\x24\x0d\x56\x57\xf5\x52\xd0\x1a\xf4\x2a\x0b\x13\x8f\xdc\x4c\xce\x50\x4a\xf3\xa5\xe0\x44\xd2\x02\x2e\xd9\x42\x8d\x9a\xcb\x46\x9f\x1d\x31\xc3\x75\x8f\x1f\x8b\xc0\x6a\xb5\x46\x66\xbe\x5d\xae\x15\xa7\x4d\x79\xcd\x31\x33\x8d\x59\xe8\x25\x3e\x58\xd5\x63\xb9\xdc\x6e\x57\xc7\xc3\x4e\x6d\xc6\x2d\x17\x7e\xa2\x4e\x46\x91\x90\x8d\xaa\xc2\x3c\x3f\x09\x43\x4d\x41\xd5\x36\xf4\xe7\x96\xd3\x28\xf1\x22\xe5\xb8\x4d\x9a\x94\x1a\x5e\x09\x5f\x5b\x63\xbe\xbf\xe8\x53\x6a\x54\x18\x96\xdd\x1e\xcd\x94\x94\x7c\x2e\x6b\xb4\xab\x52\x5f\x64\x3a\x9a\x51\x6f\x75\x26\x7e\xab\x97\xd5\xd5\x5c\x4e\x61\xf2\xcf\xda\xdb\x1e\x6f\x71\xf1\xec\xaa\x4c\xf2\x74\x3e\x66\xbf\xf5\xe2\x50\x14\xec\x72\x13\xef\x4b\x40\x99\xd2\x4b\x30\x90\x74\x1a\xc1\x51\xbf\xd8\xca\x85\x86\x33\xa8\xe9\xc5\x98\x6e\x70\x4a\xb6\x0d\xf9\x7a\x8f\xd2\xfd\xda\x48\x0a\x33\xf1\x82\xcc\x2c\x42\xa0\xf3\x92\x41\xe2\x2d\x5e\x2c\x2f\x9a\x86\x3d\xcd\xd6\xc9\x9a\x69\x43\x6a\x50\x4f\x16\x6c\xa4\xbc\x05\xbb\x52\x90\xe9\x77\x6a\x54\xb3\x3a\xa1\x2a\x16\x5f\x9f\xc6\xbe\x6e\x6a\x9d\x4e\xb6\xce\x74\x2c\x77\xd5\x18\xd0\x31\x94\x88\x66\x78\x48\x7b\xaa\x39\x66\x0e\x0d\xb6\x42\xeb\x56\x91\x9b\x0d\xba\x13\x91\x8f\xd6\xda\xc8\x2d\x17\x46\xbe\xdd\x5e\xb3\xaa\x08\xa6\x7e\x73\x08\x5c\xb5\x29\x26\xab\x40\xfb\x8c\xb6\x74\x9a\xf6\x3c\xfc\xba\xd5\xa7\xdd\xd6\xb6\x8e\x26\xe6\xd4\xc9\x1a\x0e\x60\x2b\x2c\x82\xfc\x04\x99\x59\x7b\x2d\x4c\x15\x46\x1a\x8e\x1d\x61\x0a\x0a\xf3\x16\x6d\x91\xa3\x6e\xbb\x63\x45\x12\x5e\xca\xee\x9f\x03\xbf\xe2\x5e\x7e\x3d\xe7\xf5\xdd\xb9\xac\x18\x2e\x0a\xe3\x8e\x15\xe5\xb3\x6b\xa1\x5b\x9d\x97\x9b\xf1\xa8\x33\xcb\xf5\xa4\x06\x53\x60\xa3\x35\x5a\x35\xa3\xa9\x3c\x73\xea\x5d\xb4\xd2\xe5\xa8\x1c\x14\x75\x2a\x76\x63\xb3\x67\x3b\xf4\x38\x5e\x2c\x65\xa3\xc0\x64\x72\x7a\xa3\x91\x25\x33\xb8\x52\x11\xe9\x44\xca\xb4\x4b\xf3\xb0\x3a\x27\x0b\x36\x04\xeb\xf6\xd0\x74\x14\x6f\xde\x99\x29\x34\x53\x54\x1a\x02\x3f\x29\xaf\x70\x31\xd7\x34\xd6\x5e\xbe\x39\x3e\xec\x44\x38\xd8\x93\x78\x1a\x5f\x12\x10\x92\xf2\x42\xbb\x85\xbf\x19\x62\x6d\x5d\x1d\x08\x35\xab\x87\x1b\xae\x1c\x76\xf0\x62\x77\x54\x6e\x18\x84\x25\x4a\x79\x9a\x6a\x8c\xd9\x70\xe2\x3b\xca\xbc\x60\x4f\x7b\x8a\xbd\x47\x82\x3f\xb0\x3e\xc8\x17\x73\x79\xa2\x4e\x28\x9d\x39\xdf\xf2\xa4\x11\xd7\x93\x16\x06\xca\x9a\xaa\x60\x38\x11\xb9\xb6\x27\x74\xd5\x5b\xaf\xf8\xec\x9a\x9b\xb5\xfb\x25\x39\xd2\xdc\xb1\x2b\x4c\x9a\x75\x21\x57\x24\x14\xb3\xd1\xf6\x46\x03\x8b\xb3\xe8\x30\x5c\xcc\x07\xab\x2c\x3b\xee\xc5\x45\x09\x39\x20\xa5\xff\xb6\x3d\xeb\x0f\xf9\xdb\xad\xd4\xf3\x95\xcd\xe9\x1f\xcd\xbe\xa6\x36\xa8\x7f\xc6\xc6\x2e\xe2\x15\x7b\x66\xef\xda\x4b\xab\x99\x7f\x79\xc5\x04\x92\xa4\x28\x8e\xc4\x29\x96\x67\x68\x8e\x63\x78\x9c\x4b\x76\xed\x10\x27\x5b\xac\x4e\x7a\xe0\xcb\x75\x79\x78\x07\x58\x52\x97\xc7\xf7\x0a\x7e\xbc\x2e\xd7\x5a\xfa\xda\x1e\xed\x0f\xb7\x75\x7a\x9f\xf6\x1e\x21\x8b\xb5\x58\x8e\x82\x90\xb2\x71\x9b\x21\x69\xde\x26\x10\x69\xf1\x8c\x69\xf1\x3c\x04\xc8\x44\x10\xd8\x80\x86\x88\x23\x48\x9c\x34\x11\x44\xb4\xc0\xe3\x2c\xcb\x59\x04\x4e\x0a\x24\x4f\x12\xbb\xad\x2a\x47\x23\x99\xea\x49\x24\x93\x9c\xac\x84\xab\x78\xb9\xb8\x8a\x86\x0b\x8d\x70\x7b\x38\x58\x4d\x7d\x42\xd0\x4a\xcb\xb9\x9a\x5b\xe9\x4c\x24\xc9\x56\xae\x3d\x5f\x14\x84\x05\x35\x88\x02\xdd\xeb\x9f\xf6\x10\x97\x9e\xab\x5b\x9e\x12\xcf\xcb\x3d\x23\xbf\x97\xcd\x58\x97\x22\xd1\xfb\xf2\xcf\xd7\xea\x2e\xe3\xce\x09\xb8\xc5\xd9\x90\xc1\x49\x1a\x30\x10\x08\x14\x6e\x72\x16\x64\x18\x04\x29\xc2\xb4\x6d\x1a\x42\x1a\x90\x9c\x80\x10\x89\x03\xd2\x22\x6c\x0b\xe7\x05\x24\x70\x0c\xc3\x31\x1c\x45\x93\xf4\x16\x77\xf2\x1c\xf7\x7f\xa8\xde\x9f\x85\x3b\x4f\x1f\xbe\x57\x7e\x01\xee\x3c\x45\xdb\x2c\xce\xb1\x80\xe3\x39\xdc\xa4\x05\x92\xa0\x68\xce\x44\x38\x60\x09\x92\xa7\x79\x0e\x0a\x38\x6e\x03\xd3\x22\x70\x8e\x37\x11\x4d\x51\x36\xcd\x51\x26\x69\x53\x04\x25\xf0\x14\x67\x6f\x71\xa7\x3e\x1d\xf7\x47\xeb\xfd\x59\xb8\x73\xa9\x91\x7d\xf5\x17\xe0\x6e\xdb\x3c\xcf\xd1\xa6\x09\x69\x16\xe1\x24\xb4\x91\x60\xd2\x1c\x00\x36\xa4\x18\x93\x27\x38\x48\xd9\x34\x6d\xda\x1c\x2b\x00\x1c\xda\x36\x6e\xda\x1c\x65\x12\x2c\x62\x4d\x0b\x07\x14\x85\x76\xb8\xd3\x9f\x8e\xfb\xa3\xf5\xfe\x2c\xdc\x99\xc5\xbb\x82\x9e\xc2\x1d\xd0\x38\x07\x09\xc4\x08\x80\xe5\x09\x5a\x10\x20\x67\x12\xc0\xa6\x39\x86\x84\x36\x67\x72\x94\xc0\x50\x16\x4b\x11\x1c\x47\x22\x93\xc6\x2d\xc0\x31\xbc\xc0\x0b\xa6\xc0\xe2\x04\x0f\x59\x61\xb7\x90\x7c\x21\xbe\xa7\xea\x9d\x5b\xc4\x26\xd5\xca\x38\x71\xde\x93\x62\xd6\x2f\x30\x83\x9a\x6a\xad\x7b\x4c\xb3\xd1\x63\x4b\x84\x95\x71\x16\xc5\x19\x90\xfd\xce\xb4\x89\x27\xdf\x97\x5b\xb9\xcc\xae\x52\x83\x6b\xd8\xbe\x8b\x7b\xfe\x39\xf9\xba\xf5\x98\xfc\x7b\x71\xa7\x2c\x13\xb7\x59\x93\x22\x10\x0e\x38\xca\x66\x2d\x0a\x50\x04\x0b\x05\x0a\xb7\x19\x88\x4c\x1a\x0a\x80\x27\x19\x60\x42\x1e\xa7\x08\x1c\x5a\x36\x6e\x31\x3c\x07\x39\x44\x90\x16\xc7\x26\xf1\x9d\x7a\x2f\xbe\xe7\x5c\x7b\xb4\xc4\x57\xd9\x5e\x5b\x20\x02\xad\x53\x88\x15\x07\x09\xc0\x1f\x8d\xc6\xbd\x61\x89\x5a\xf5\x3c\xb5\x2e\x96\xcb\x35\xdd\xd2\x2a\xf5\x5f\x82\xfb\x03\xf2\x9f\xc3\xfd\xea\x18\xe9\x73\x06\x48\xbf\x7a\x74\x54\x54\xf9\x52\x7d\x5e\x1f\x9b\x15\xb2\x24\x52\x9d\xf6\xa8\x11\x54\x26\xa3\x2e\x8e\xdb\x45\x3e\x54\x15\x6e\x82\xcb\x8d\x45\xb9\x93\x15\xbb\x94\xb8\x9f\x27\x26\xcf\x8d\x79\xe2\xf6\x09\xd5\x89\x40\xd4\xfc\x60\xc0\x2c\xcc\x78\x26\xa1\x5e\x7e\x45\x55\x49\xbd\x35\xee\xe8\x43\xa1\x5b\xf3\x43\x69\x36\x19\x56\x0a\xb3\x56\xb4\xdd\x49\xd5\x16\xe7\xe9\x5d\xe0\xd2\x36\x2a\x6d\x1a\x39\x1f\x70\x45\x5c\x10\x66\x8a\xca\x79\x35\x73\xb9\x46\xe4\x32\x37\x28\x17\xcd\x56\xbb\x4f\x07\xf3\xdc\xc0\x58\xad\x33\xeb\xb0\x62\x96\x66\x3d\xbb\x59\x16\xdd\xd9\x2c\x43\xa8\x65\xb1\xa5\x94\x04\xdb\x1c\x19\x23\x53\xd3\xcd\x36\x72\x2b\x0d\x20\xe0\x81\x93\x9d\x92\x8d\x52\x57\x29\x6f\x86\xc4\xcb\xb0\xbf\xa6\x0c\xbe\xd6\x1a\x8f\x96\x74\x38\x34\x57\x0a\x19\xcf\xa3\x80\x35\x90\xd5\x14\x03\x0e\x35\x7b\xd2\xc4\x96\xc4\x69\x25\x77\x18\x79\xdc\xc0\xe0\x60\x19\x47\x3b\x5d\x52\xb4\xdb\xdd\x99\xe2\x3f\x17\xa5\xc5\x4f\xe8\x25\x0a\x46\x47\x9a\x3e\x21\x5f\x14\xff\xb9\x68\x7d\x29\x5a\xfe\xea\xa1\xf0\xe3\x4e\x96\x3b\xd1\xfe\xcc\xe0\x3e\x96\xdc\xb8\xe5\x64\xe2\x2c\x6e\xea\xca\x2a\xaa\x88\x4b\x22\x0b\x65\x37\xe8\xf9\xcd\xb8\x01\x0d\xb3\x11\xb5\xab\xf5\x79\x24\x0b\x03\x11\xd0\x71\x35\x8b\xdc\x41\x55\xed\x86\x70\xd9\x0c\x41\xc0\x35\xfb\x6a\x66\xca\x29\xd9\x4c\x99\xef\x2b\x0b\x67\xde\x5b\x7a\xc5\x91\xde\x75\xa6\x11\x63\xd3\xad\xc4\xc9\x50\x7d\x99\x25\xea\xe5\x4a\x17\x8c\x17\x11\x4f\xb4\x39\xa3\x98\x15\x34\xa2\x52\x66\x38\x27\xe7\x2c\xec\x85\xe2\x4d\x61\x1b\x76\xb5\xd4\x46\xc7\x7f\xde\xc9\x9e\x35\xf2\x27\x9d\x6c\xc6\x65\x8d\x7c\xff\x33\x9d\xec\x3f\xd8\x35\xdf\xe5\x64\x9f\x3c\xef\x79\xdc\xc9\xf2\x27\xda\x9f\x19\x9c\xc3\x84\x54\xaf\xd4\x56\xa5\xc9\x80\xf1\x26\x59\x8a\xcf\x82\xa6\x5e\xef\xf5\x95\x39\xe8\x0c\x4d\x42\x2f\x69\x3e\x41\xb4\x3d\xb5\x0e\xb7\x48\xdf\xe8\xc9\x9a\x8d\x25\x19\x8d\x41\x6d\xe2\x2f\x74\x26\x53\xd4\x69\xc0\xcc\xe4\x3e\x9b\x65\xa5\x85\x39\xf6\xc5\x4a\x46\x13\x44\x48\x2b\x88\x2f\xc6\xac\x4d\x77\x3b\x31\xd7\x18\x2d\xeb\x9c\x6d\xc6\xaa\xda\x61\xc7\xce\xd4\x9f\x2c\xdb\x8a\x5d\x28\xf3\x19\xc3\x99\x33\x7d\x48\xb7\xaa\xf2\xc6\x11\x06\xb8\x30\x80\x33\x54\xca\xe1\xe3\xa1\x56\x9a\x0f\xa6\xc3\x8a\x3c\x14\xc6\x62\x26\x58\xd4\x91\xca\xe4\x6b\xb8\xc5\xa9\x6b\x99\x19\x50\x87\xac\xe3\x3f\xee\x64\x4f\x1b\xf9\xb3\x4e\xb6\x0a\xea\x85\xf2\x67\x3a\xd9\xfd\x19\xf1\x84\xfe\x97\x3b\xd9\x27\x4f\x72\x1f\x77\xb2\xd3\xcc\xcd\xb9\xc1\x65\xab\xab\x3c\x2e\x2c\x47\x0d\xbd\xd5\x5c\x9a\xf5\x3e\xaa\xba\x85\x5a\x7b\x21\xca\xb5\x11\x2c\x1a\xb3\x15\x70\x14\x87\x6f\x67\xdc\xc1\x76\xad\xe8\x46\x4f\x26\x29\x99\x86\x22\x19\xa2\xa0\x4b\x7a\xa9\x16\x89\x53\x03\xf6\x7a\xa4\x28\x49\x0d\xbf\xc1\x30\x2e\x0d\x17\x72\x2f\x5c\x7b\xbc\x0b\xda\x11\x43\x9a\x7d\x0d\x64\x08\xcd\x96\xda\x71\xdf\xb6\xdb\xc6\xaa\x64\x82\xc5\x82\xad\xe3\xd9\xd0\xf6\x49\xdd\x2e\x30\x16\x5e\x5a\x24\xd9\xe0\x2c\x3d\xc4\x63\xa1\x11\x8b\x51\x76\x1a\x95\x66\x73\x9c\x88\x25\xdb\x10\xe4\x39\x05\x40\xde\xe6\x55\x61\x1d\x76\x98\x60\x51\xa9\x66\xfe\x9b\x9c\xec\x59\x23\x7f\xd6\xc9\xa6\x5d\xad\xf8\xcc\x70\x55\x3c\x91\x2f\xe6\xf9\xb5\x52\x33\xa8\xa2\x26\x33\x0d\xb5\x10\x49\x2e\xbd\x6a\xb5\x84\xae\x28\xd6\x33\x1a\xde\xd7\x83\xf2\x4c\x71\xd4\x65\x97\xed\x6c\x3f\xfa\xe5\x4e\xf6\xc9\x19\x8d\xdf\x6b\x77\x4a\x45\xa4\x13\xa7\x98\x8a\x76\x83\xe9\x4f\xfd\x42\xd9\xeb\x86\x40\x28\xb5\x22\x81\xb3\x98\x16\xdf\x5b\xc2\x15\x8b\xe7\x2b\xb0\x37\x29\xc7\x1d\xb1\x47\x4c\x0f\x19\xca\xcb\x0e\xd7\x3b\x6e\xd4\x23\x87\x4b\xbe\xdd\x8e\x02\x52\x66\xfa\xc0\xfc\x75\xe4\x1d\xda\xe2\xca\x73\x25\x83\x7d\xe4\xf0\x9f\x22\xff\x4a\xb0\xb9\x47\x7e\x55\xfc\xdc\x6c\xd6\x43\x59\xfb\xcf\x96\x7f\x8e\xc7\xed\x80\x93\x3f\xd0\x7c\x54\x7e\x6a\x5d\x58\x89\x4d\x8d\x94\x88\xe6\xa2\xef\xeb\x7d\x66\x2e\x64\x6b\xe4\x78\x34\x2e\x16\x9b\x2a\xe9\xfa\x1d\xc1\x18\xae\x81\x06\xdb\xfd\x15\x5e\x4a\xff\x91\xd7\xc1\xe1\x16\xa7\xf8\xdd\x15\x90\x3e\x39\xd5\x57\x69\x67\x6a\x25\x43\x15\x86\x5d\xaa\x13\x12\xbd\x0e\xed\x94\x39\x62\xe6\xe8\x7a\xc3\x91\x6d\xbb\xec\x58\x91\x28\x8e\xc7\x3c\xb3\xc0\xa7\xe2\xc3\x01\xe9\x03\x51\xfd\x62\x40\x92\xf7\xf2\xeb\xe2\x40\x68\x69\xcd\x42\x90\x2d\x94\x17\xbd\x0c\x29\x5a\x32\x35\x27\x57\xd9\x16\x1d\xc0\x90\x62\xe2\x7c\x99\xe7\xe7\x35\x3e\xc3\xba\x9d\xc6\x52\x35\xfa\xfd\xb2\xdd\x1f\x8f\x6b\xf5\x61\xd4\x2c\xe2\xed\x3e\x4d\x97\x74\x4a\x57\xd5\xaa\x4a\x57\xe7\x99\x69\x51\x1d\x0e\xba\xfe\x64\x20\x26\x41\xa3\xa6\xe6\xc9\x70\x49\x57\xac\xac\x99\xf7\x97\x66\xbf\x5a\xeb\xa2\x48\x9b\xf8\x65\x30\xef\x89\xcb\xbc\xc5\x57\x3b\x25\x22\x23\x87\xd0\x79\x6f\x2e\xfb\xf1\x80\xf4\xc0\x5c\xff\x53\x03\xd2\x93\xf2\x3f\x33\x20\x3d\x99\xe6\x7d\x3a\x20\x7d\x86\xfc\x67\x02\xd2\x07\xe5\x3f\xb6\x51\x25\xd5\x14\xef\x06\xa4\x2b\x69\xf0\x1b\x07\x6b\x7d\x34\x17\x7e\x72\xb8\xd6\x5b\xac\x4b\x27\xb3\xb7\x87\x43\x1c\x7c\xe9\x42\xb0\xbc\xce\x65\x1f\xed\xb6\x47\x4a\x9c\x71\xb9\x7a\x19\xc0\xf9\x1d\x29\xfb\x4b\x10\xde\x0e\xe0\x7a\xa7\x9a\xe9\xcb\x5a\x92\x2b\x5a\x52\x1c\x93\xdd\x9d\x62\x3e\x7f\xe1\xd8\xf2\xbd\x40\xac\xd6\x50\xaa\x62\xa3\x87\x55\xe4\x1e\xf6\x6d\x7f\xa2\xe3\xeb\xfe\xba\x80\xab\x87\xf7\x9f\x5c\x1b\xf3\x59\x8a\x87\x37\xb4\x0e\x6f\xa9\x7c\xe9\x30\xf5\xc3\x4d\x39\x4f\xab\x67\x02\xef\x92\x66\x6f\x02\x8e\x95\xda\x9e\xdf\x7a\xfb\xa4\xf5\x9b\x57\x04\x3d\xad\xee\x11\xf3\x4b\x8a\xdf\x90\x8e\xb5\x34\xa5\xde\x92\xb1\xc3\xa1\x6e\x1f\xaa\xc9\xe7\xe0\xfd\xc1\x0a\x9c\xb7\xc1\xe1\xf0\xf9\x2b\x07\xa7\x1f\x5d\x2c\xf5\xb4\xbe\x5b\x66\x97\x14\x4d\x89\x39\xd6\x70\x77\x9c\xf7\xe5\x63\xbc\xd3\xb7\x68\x3d\xad\x5c\xc2\xeb\x92\x6e\x07\x21\xc7\xaa\x39\xd3\xd7\xe4\x70\xef\x9b\xc7\x56\x5f\xb8\x3d\xec\x79\x4d\x53\x2c\x2f\x2a\x7c\x2a\xf2\x52\xa3\x5f\x39\xdb\xfa\xe8\x0e\xb5\xcf\xd0\x34\x8c\xcd\x2b\x3a\xbe\x89\x39\xd6\x2e\x39\x16\xfb\xc6\x41\xd7\x67\x17\xc7\x3d\xad\xe4\x81\xe1\x25\x45\x4f\xc4\xdd\x15\xc3\x52\x7f\xdf\x7f\x7a\x7d\xde\xd3\xda\x1e\x18\x5e\xd2\xf6\x44\xdc\xb1\xb6\x6f\xc7\x45\xdf\x38\x8e\xf9\xec\x1a\xc1\xe7\xf5\xdd\x33\xbc\xa8\xef\xb1\xb8\x63\x7d\xf7\x27\x3a\xdf\x38\xa9\xf9\xec\x3e\xc5\xa7\x15\x3e\x30\xbc\xa4\xf0\x89\xb8\xab\x43\x83\xed\x49\xcd\xaf\x87\x63\x98\x6f\x1e\xc5\x7b\xe1\xbe\xc9\xe7\xeb\x91\x62\x79\xb1\x26\xa7\x22\x2f\x45\x89\x10\xcd\x5e\xdf\xce\x9e\xbd\x7e\x4c\xee\xe9\x3d\x9c\x9f\xa0\xfb\x4d\xc5\x9f\xd2\xfa\x64\x88\x7a\xe9\x76\xd2\xa7\xf5\x3f\x66\x7a\xa9\x12\x17\xc4\x5e\xad\x49\xfa\x08\xdb\x6b\x43\xcd\xfd\xcd\xad\x3b\xdd\x93\x7b\x5e\xef\x3b\x5c\x77\x7b\x25\xec\x09\x1f\x4c\xd7\x0e\xa3\xd8\x56\x53\xd1\x8a\x98\x19\x05\x08\x61\x6f\x27\x69\xff\x81\x75\x4a\x72\x43\xc6\xd2\x27\x6b\x1f\x8e\x22\x3d\x1f\x68\x1e\x5f\x46\xfb\xa8\x96\xc7\x6c\x36\x4a\xee\xc6\x29\x47\x2a\xa6\xaf\x57\x79\x4d\x5f\xa6\xf2\xba\xbd\xe4\xe4\x4c\xbb\xc3\x8d\xba\x8f\x2a\xb6\xe7\xb0\xd1\xe9\xe0\x18\x47\x6a\x5d\x1f\x2a\x1e\xdd\xfd\xfb\x8c\x0a\x6f\x4c\xb6\x5a\xa4\x02\xcc\x9d\x8a\x1c\x5d\x57\xfc\xa8\x22\x69\x26\x1b\x45\x8e\x07\xc2\x77\x6a\x72\x74\xc5\xf2\xa3\x9a\xa4\x99\x6c\x34\x49\x9d\xa2\x74\xbf\x1a\x47\xd7\x42\x3f\xa1\x49\x9a\xcf\x4e\x99\xb7\x51\xc2\xb1\x32\xe9\x2b\x14\x6e\x85\xaf\xe7\x34\x3a\x65\xb4\x51\xe9\x24\x36\xbe\x8b\xd1\xb5\xdb\xd0\x31\xcb\x9f\x4c\x5d\x14\xa1\x44\xec\xff\x04\x00\x00\xff\xff\x15\x48\x69\x0b\x3a\x7d\x00\x00") - -func asset_stat_operationsCoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_operationsCoreSql, - "asset_stat_operations-core.sql", - ) -} - -func asset_stat_operationsCoreSql() (*asset, error) { - bytes, err := asset_stat_operationsCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_operations-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0xa6, 0x32, 0xd9, 0xbd, 0x47, 0xfe, 0x7a, 0x51, 0x7f, 0x70, 0xfd, 0xd9, 0x48, 0x97, 0xb7, 0x6c, 0xc2, 0xc1, 0x8d, 0xda, 0x1, 0x75, 0x3b, 0xb0, 0xf5, 0x58, 0x7b, 0x65, 0xcf, 0xe, 0x6e}} - return a, nil -} - -var _asset_stat_operationsHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x67\x8f\xa3\xc8\xf3\xf0\xfb\xfb\x14\x68\x75\xd2\xec\x6a\x66\xd7\xe4\xb0\xfb\xdf\x93\xb0\x8d\xb3\x71\xc0\xf9\x74\xb2\x08\x8d\xcd\x18\x83\x07\x70\x9a\xd3\xef\xbb\x3f\x32\xe0\x84\x49\x0e\xb3\xb7\x8f\x35\x1a\xd9\x50\x5d\xa9\xab\xab\xaa\xab\x1b\xfa\xeb\xd7\x3f\xbe\x7e\x85\x9a\xa6\xed\x4c\x2c\x20\xb4\x6a\x90\x22\x3a\xa2\x24\xda\x00\x52\x96\xf3\xc5\x1f\x5f\xbf\xfe\xb1\xbb\x9f\x5f\xce\x17\x40\x81\x54\xcb\x9c\x1f\x01\x56\xc0\xb2\x35\xd3\x80\x98\x6f\xe4\x37\xe4\x04\x4a\xda\x42\x8b\xc9\x78\xd7\x3c\x00\xf2\x87\xc0\x75\x20\xdb\x11\x1d\x30\x07\x86\x33\x76\xb4\x39\x30\x97\x0e\xf4\x13\x82\x7f\xb8\xb7\x74\x53\x9e\x5d\x5e\x95\x75\x6d\x07\x0d\x0c\xd9\x54\x34\x63\x02\xfd\x84\x9e\xba\x9d\x02\xfd\xf4\x63\x8f\xce\x50\x44\x4b\x19\xcb\xa6\xa1\x9a\xd6\x5c\x33\x26\x63\xdb\xb1\x34\x63\x62\x43\x3f\x21\xd3\xf0\x71\x4c\x81\x3c\x1b\xab\x4b\x43\x76\x34\xd3\x18\x4b\xa6\xa2\x81\xdd\x7d\x55\xd4\x6d\x70\x46\x66\xae\x19\xe3\x39\xb0\x6d\x71\xe2\x02\xac\x45\xcb\xd0\x8c\xc9\x0f\x9f\x77\x20\x5a\xf2\x74\xbc\x10\x9d\x29\xf4\x13\x5a\x2c\x25\x5d\x93\x5f\x76\xc2\xca\xa2\x23\xea\xe6\x0e\x8c\xad\x75\xb8\x36\xd4\x61\xb3\x35\x0e\x2a\x17\x20\x6e\x50\x16\x3a\x02\xd4\xe0\x6b\x43\x1f\xfe\xdb\x54\xb3\x1d\xd3\xda\x8e\x1d\x4b\x54\x80\x0d\xe5\xdb\x8d\x26\x94\x6b\xf0\x42\xa7\xcd\x96\xf9\xce\x49\xa3\x73\xc0\xb1\x6c\x2e\x0d\x07\x58\x63\xd1\xb6\x81\x33\xd6\x94\xb1\x3a\x03\xdb\x1f\xbf\x82\xa0\xec\x7e\xfb\x15\x24\x77\x76\xf5\xeb\x04\xf4\xa8\x5d\x2f\x9d\xc7\xe0\xce\x90\xe3\x88\x9d\x40\x1d\x91\xbb\xe0\x65\x3e\xcf\x0d\x4e\x20\x7d\xb4\x2e\x57\x63\xa0\xaa\x40\x76\xec\xb1\xb4\x1d\x9b\x96\x02\xac\xb1\x64\x9a\xb3\xf8\x86\x9a\xa1\x80\xcd\xf8\x44\x38\xc3\x16\x5d\x43\xb7\xc7\xa6\x31\xd6\x94\x6b\x5a\x9b\x0b\x60\x89\x87\xb6\xce\x76\x01\xee\x68\x7d\xe4\xe4\x2e\x2e\xae\x6b\xab\x03\x65\x02\x2c\xb7\xa1\x0d\xde\x96\xc0\x90\xaf\x12\xe1\xa4\xf9\xc2\x02\x2b\xcd\x5c\xda\xfe\xb5\xf1\x54\xb4\xa7\x37\xa2\xba\x1f\x83\x36\x5f\x98\xd6\x6e\x38\xfa\x3e\xf5\x56\x34\xb7\xea\x52\xd6\x4d\x1b\x28\x63\xd1\xb9\xa6\xfd\xde\x98\x6f\x30\x25\x7f\x5c\xde\xc0\xf4\x69\x4b\x51\x51\x2c\x60\xdb\xf1\xcd\xa7\x8e\xa5\xb8\x71\x67\xac\x9b\xe6\x6c\xb9\x48\x01\xbd\x48\x62\xc9\x83\x12\x35\xeb\x4a\xc4\x7b\xa7\x9b\xba\xc1\xce\x4f\xa8\x2a\xb0\xd2\x81\xee\xd1\xdf\xd0\xc4\x57\x6b\xba\x46\xae\x6b\xbd\x82\xc8\xa9\x2b\x4e\x6a\xb1\xd8\x35\x98\x3a\x89\x3d\x60\x9f\x39\x20\x69\x9b\x68\x46\xd3\xc3\x48\x4f\x03\x6c\x7a\x7c\x98\x89\x80\x9a\xed\x8c\x9d\xcd\x78\x91\x8c\x72\x07\x69\x2e\xd2\x42\x82\xb4\x60\xfb\x50\x12\x0f\x2c\xed\x87\x7b\x22\x58\xb2\x17\x93\xb6\xe9\x3a\xd3\x8b\x91\x3b\x6d\xdb\xf6\x32\x89\xf2\x01\x58\x36\x15\x70\x65\x5e\x70\x30\x83\x85\x68\x39\x9a\xac\x2d\x44\x23\x36\x78\x27\x35\x1d\x2f\xae\xcc\x4d\x0e\x11\xed\x5a\x0e\xc2\x1b\x5e\x4d\xdf\x55\x5e\x1a\x7a\x1e\xe0\x87\xe3\xf7\x3a\x73\xd7\x93\xfe\xd7\x5d\x7c\xd8\xa7\x7e\xae\x31\x8c\x53\x72\x30\x31\xad\xc5\x78\xae\x4d\xfc\x84\x21\x86\x85\x00\x64\x6a\x19\xaf\xcf\xf7\xe2\x30\xa7\x35\x4e\xaf\x75\xae\x51\xeb\xd6\x79\x48\x53\x3c\xca\x79\xae\xc0\x76\x6b\x9d\x94\xb8\x23\x8c\xee\x01\x98\xfd\xee\x8e\xc7\xe4\xfe\x4a\x2f\xfe\x3e\x4a\x0b\x5c\xab\xcb\xf1\xb9\x1b\x74\xb6\xcb\xb3\x6d\xf0\x76\x35\xe5\x33\x24\xa9\x5b\x2b\x20\x25\xec\x31\x9b\x4d\x2d\x61\xc4\xa8\xbf\x46\xbe\x70\x14\xe9\xda\xfa\x79\x5f\x3a\x60\x3f\xc9\x4b\x2d\x9b\xef\x01\xae\x91\xc5\x6b\x92\x12\xd6\x4f\xff\xd2\xf3\xb3\xcf\x17\xd3\x70\x14\xf0\x21\xf1\xc0\x27\x2e\xc1\x07\x64\x8b\xc5\x36\x57\x64\x3b\x21\xc0\x73\x6d\x37\xe3\xd0\x64\xf0\xd9\x58\xce\x81\xa5\xc9\x7f\xff\xf3\x25\x45\x2b\x71\x73\x43\x2b\x5d\xb4\x9d\xcf\xa2\xb1\x05\xba\x5b\x8a\x49\xd1\x42\xd5\xac\xd0\x26\x85\x2e\x9f\xeb\x94\x1b\x7c\x8c\x3c\x63\x71\x32\x39\x72\xf7\x02\x5d\x30\x1a\x83\x63\x2f\xdd\x1d\x38\x76\xb2\xba\xcd\x8f\xcc\xbf\x40\xd7\x08\xe2\x8a\x9e\x02\x03\x37\xe8\x70\xbc\x10\x40\xa1\x2f\x26\xf6\x9b\xbe\xb7\xc5\x5c\x89\xab\xb3\x17\x14\x7e\xfc\xe1\x55\xe1\x78\x71\x0e\xbe\xef\xaf\x41\x9d\xed\x02\x7c\xf7\x9b\xfc\x80\x04\x79\x0a\xe6\xe2\x77\xe8\xeb\x0f\xa8\xb1\x36\x80\xf5\x1d\xfa\xea\x16\xe7\x72\x6d\x6e\xd7\x5f\x3e\xe6\x3d\xbe\x3f\xce\x30\x9e\xdf\xf4\x11\xe7\x1a\xf5\x3a\xc7\x77\x62\x30\x7b\x00\x50\x83\x3f\x47\x00\x95\x05\xe8\x69\x5f\x76\xdb\x5f\xb3\x5d\x24\x4f\x41\xca\x7b\xf1\x7d\x9a\x07\x0d\x25\xca\x73\xa6\x4b\xbe\xd1\x09\xe8\x13\xea\x97\x3b\xa5\x03\x5b\xa7\xf5\xb7\x33\xf2\x47\x2c\x01\x46\xae\x11\xfe\x02\x89\xab\x80\x66\x2d\xb3\x98\x08\xad\x1a\xb4\xb0\x4c\x19\x28\x4b\x4b\xd4\x21\x5d\x34\x26\x4b\x71\x02\x5c\x35\xa4\xac\x17\x9e\xb2\x9b\x6c\x68\x3e\xfb\x7b\x5b\x3d\xf2\xbf\xef\xdb\x30\x5d\x1e\x2c\x3b\x11\x3f\xd4\xe6\x3a\xdd\x36\x2f\x9c\x5c\xfb\x03\x82\x20\xa8\xc6\xf2\xc5\x2e\x5b\xe4\x20\x57\xfa\x7a\xbd\xeb\xf9\x3b\xa1\xd3\x2e\xe7\x3a\x2e\x04\x2b\x40\x7f\x8e\xff\x84\x04\xae\xc6\xe5\x3a\xd0\x9f\xc8\xee\x57\xb0\x37\x12\x07\xe2\x7d\xd2\x25\xa1\x7f\x98\x70\x68\x98\x70\x69\x3c\xd5\x7d\xf2\xa5\xa0\x70\x10\xf1\x70\xe9\x26\x09\x3f\xff\x01\x41\x39\x56\xe0\xa0\x7e\x89\xe3\xa1\x3f\x91\xbf\x91\x7f\x32\x7f\x22\x7f\xa3\xff\xfc\xf5\x27\xea\x7e\x47\xff\x46\xff\x81\x3a\xde\x4d\x88\xab\x09\xdc\x4e\x29\x1c\x9f\xff\x12\xaa\x99\x14\x71\xe0\x4e\xcd\x24\x53\xf8\x68\xcd\xfc\xdf\x2d\x9a\xb9\x8c\xa9\xbe\x1e\x0e\x71\x38\x9d\x22\x8e\x61\xfb\x02\xa3\xcb\x31\x04\x09\x3b\x5d\x41\x3f\x8f\x1e\xe0\xc5\xbb\xdc\x19\x36\x39\xe8\xe7\xe9\x88\xf8\x12\x36\x6a\x1f\xca\x63\x10\x61\x80\xc5\xfd\x30\x4e\xcf\x61\x68\x0a\x74\x2f\x97\x61\x48\x03\x9c\x9e\x0d\xc8\x73\x76\x8f\x56\x76\xc9\x6d\x58\x9a\x77\x37\xb7\x21\x48\x83\xdc\x9e\x0e\x92\x58\x6e\x77\x91\x4b\x01\xaa\xb8\xd4\x9d\xb1\x23\x4a\x3a\xb0\x17\xa2\x0c\xa0\x9f\xd0\xd3\xd3\x8f\xf3\xbb\x6b\xcd\x99\x8e\x4d\x4d\x39\x59\x4a\x3b\x93\xf5\x34\xff\xf5\x45\x74\x07\x58\x3a\xf1\xbc\xb1\x78\x3a\xf9\xf6\x24\xd2\x14\x48\xd2\x26\x9a\xe1\xb8\x89\x01\xdf\xad\xd5\x3c\x71\xc4\xf9\x2e\x8d\x87\xe4\xa9\x68\x89\xb2\x03\x2c\x68\x25\x5a\x5b\xcd\x98\x04\xc0\x8c\xe5\xfc\x90\xf2\x43\x9a\xe1\x80\x09\xb0\x02\x20\xaa\x2e\x4e\x6c\xc8\x9e\x8b\xba\x7e\x49\xc6\x31\xe7\xfa\x25\x91\xcf\x28\x41\x7c\x39\x40\x5e\x76\x7b\x70\xde\x70\xab\x3a\x82\xd5\x8e\x83\x4a\x1c\xb0\xb9\x50\xc8\x62\xa1\x6b\x6e\xcd\x1e\x72\xb4\x39\xb0\x1d\x71\xbe\x80\x76\x7d\xe6\xfe\x84\xde\x4d\x03\x5c\x32\x1a\x35\x2b\xda\xe7\xa3\xfe\x74\x2a\x1d\xcf\x87\xc9\x57\x04\x56\xdf\x0c\xd9\x76\xc7\xcb\xe8\x10\xf7\x42\x99\xcf\xb5\x39\x37\xfd\xca\x0e\xfd\x4b\x7c\x03\xaa\x97\xf9\x1e\x5b\xeb\x72\x87\xdf\xec\xe0\xf8\x3b\xc7\xe6\x4a\x1c\x84\x24\x09\x73\xb3\xda\x83\x88\x2e\x4c\xd1\x2f\x7a\x40\x06\xd8\x38\x2b\x51\xff\xfc\x14\x21\xf1\xd3\xf7\xef\x16\x98\xc8\xba\x68\xdb\x5f\x82\xdd\xe5\xad\x55\x84\xd8\x16\x89\x7f\x89\xe9\x28\x6f\x6e\x7c\xb7\x64\x5e\x45\xe7\x20\x57\xf8\xc8\x38\xd6\xea\xc2\xd9\x0c\x05\x97\x4d\x25\x0c\x1c\x41\xc3\xc1\xbd\xf2\x5f\x48\x03\x82\x8c\x1b\x61\xe1\xe5\x85\x07\x99\xed\x29\xce\x5f\x66\xb4\x71\x82\x40\x8d\x3e\xcf\xe5\xa1\xec\x30\x41\x22\xaf\x42\x17\x2f\xd0\x01\x57\xe0\xf6\x37\x4d\x89\xe2\x6d\x5f\xf3\xb9\xd7\xea\x7c\x3c\xbe\xd9\x05\xc6\xcc\x38\xca\xd3\x5f\x96\xb8\xa2\x20\x3f\xb9\x0b\x1f\x9f\x22\xac\xd9\xb5\xe3\xf0\x5b\x0a\x70\x44\x4d\xb7\xa1\x57\xdb\x34\xa4\x68\x63\xdb\x17\xca\xee\xd5\x83\x8f\xc7\xd7\xc3\x7e\xdd\x3a\x82\xb7\x93\xc5\xe4\x54\xa3\x30\x6c\x1d\x3b\xbc\xa1\xaf\x96\x93\xca\xa8\xdb\x11\x07\x3e\xf6\x5e\x0e\x0e\x50\x38\x76\x44\x3a\xf8\xc3\x62\x72\x20\x30\x99\x4b\xe7\x18\x9b\x82\x6d\x2c\x20\x3a\x89\x8d\x3c\xd8\xe5\x42\x49\x0d\x7b\x30\x1d\xff\x67\x60\x9d\xfd\x42\x16\xe4\x22\x1f\x70\x44\x7d\x2c\x9b\x9a\x61\x87\xdb\xa0\x0a\xc0\x78\x61\x9a\x7a\xf8\x5d\x77\xe5\x53\x05\x51\x7d\xed\xde\xb6\x80\x0d\xac\x55\x14\xc8\x2e\x0f\x75\x36\x63\x37\x4d\xd2\xde\xa3\xa0\x16\x96\xe9\x98\xb2\xa9\x47\xca\x15\xec\xa3\xbd\xb1\x00\x51\x01\x96\x9b\x5e\x78\xd7\xed\xa5\x2c\x03\xdb\x56\x97\xfa\x38\xd2\x50\x7c\xc1\x45\x4d\x07\x4a\x34\x54\xf4\xb0\x8a\xa8\x5d\xdf\x3b\xca\x22\xd6\x43\x12\x62\x5e\x7a\x6f\x93\xec\xbf\xae\x15\xf9\xb1\x61\x2c\x96\xc6\xaf\x0a\x6b\x57\x09\x7a\x67\x98\x8b\xa5\x75\x19\xf6\xc2\xc1\x63\xc2\xe0\xc9\xca\xce\xc3\x6c\x33\x69\x9a\x73\xbe\xab\x2a\x62\x2a\xb4\xcb\xfc\x65\x4f\x14\x37\x02\xde\x19\x00\xfd\x91\x6f\x2e\x2d\xf9\xb0\x4d\x23\x22\xf4\xec\xdd\xc9\xd3\xd3\xf7\xef\xd1\x53\xb1\xe8\x71\xe0\x2f\xac\xdd\xab\x4e\x7f\x2f\xe0\xe7\x87\xe6\x0b\xbe\x4b\xbc\x25\x7a\xb9\x7b\x61\x22\xc9\x06\x76\x22\xc6\x01\xf9\x9b\x23\xe3\x40\xbc\x79\x70\x28\xc0\xe5\x9e\xce\x04\xb8\x58\x72\x07\xa8\x18\x8a\x2e\x4b\x9a\x3d\xb6\x81\xae\x03\x0b\x92\x4c\x53\x07\xa2\xb1\x8f\x49\x9a\x0c\xc6\xc6\x59\xfc\xf5\xae\x9d\xc7\xe4\xe3\x6e\xa2\x71\x20\x5a\x9f\xed\x67\x0a\xde\x3c\x59\xa6\x0f\xdd\xf9\xe9\x72\x3d\x76\xf7\x06\x43\xb9\x12\x97\xab\x42\x9f\x3f\x9f\x6a\xf0\x2f\x08\xfe\xf2\x25\x09\x55\x58\xf3\xbd\xd2\xfe\xef\x42\x8f\x29\xf0\x9d\xe9\x34\x80\x3e\xa0\x70\x97\xc1\xd8\xa1\x14\xbe\xc2\xfd\x80\xc1\x15\xbe\x67\x21\x65\x24\x4d\xe3\xc2\xee\x89\xa5\x49\xfb\x03\x1e\x13\x4d\x13\xa8\xfc\xaa\x78\x7a\xa5\xb0\x77\x46\xd4\x04\x6a\x97\x31\x35\xaa\x41\x4c\x54\x3d\xdb\x13\xf2\x40\x5b\xdd\xdb\xe7\x29\x4b\xa9\x27\x51\xbe\xef\x4f\x98\x9a\xa5\x0d\xbc\xf1\x31\x34\x14\xf6\x48\x3a\x74\xbc\xec\x66\x01\xd1\xd3\x88\xa8\x09\xda\x7f\x32\xc5\x72\x36\x63\x60\xac\x80\x6e\x2e\x40\x58\xd9\xd2\xd9\xec\x26\x3c\x4b\xdd\x89\xb8\x39\x07\x8e\x18\x71\x6b\x37\xd5\x8a\xba\x6d\x6b\x13\x43\x74\x96\x16\x08\xab\xb0\x31\xe4\x97\xbf\xff\x39\xe6\x2e\xff\xfe\x2f\x2c\x7b\xf9\xfb\x9f\xa0\xce\xc1\xdc\x8c\x28\x86\x1d\x71\x19\xa6\x01\x62\x73\xa1\x23\xae\x4b\x34\xbe\x64\xda\x1c\x8c\x25\x73\x69\x28\x6e\xc5\x9a\xb6\x44\x63\x02\x82\xb3\xb1\xf3\xd0\xba\xd3\xc4\x0e\xdb\x04\x28\xc9\xd3\x2d\xbf\xf6\xa7\x29\xfb\xd1\xb6\xdf\xc2\x95\xc6\x45\x78\xc3\xcd\xdd\x2f\x97\xb0\x3b\x4c\xe0\x3a\x31\x75\xd2\xd3\x8a\xd4\x69\x95\xf4\xba\x79\xc4\xe3\x84\x48\xb9\x79\x2e\x56\xa8\xd8\xf9\x47\x1a\x21\x23\x23\xed\xc3\xc4\x4c\xbd\xff\x30\x56\xd0\x84\xb0\x10\x2e\x6a\x5e\x74\x44\x48\x35\xad\x84\xd5\x22\x28\xcf\x76\xd8\x04\xf1\xca\xbc\xc0\xb5\x3b\x50\x99\xef\x34\xce\x56\x8c\xdc\x28\x2a\x40\x9f\x91\x17\xe8\x09\x7e\x7a\x81\x90\x17\x08\x7e\x81\x9e\x9e\xbe\xfc\x48\x6c\x82\x5e\x36\x89\x60\x3c\x6e\x6d\xe7\x5a\xe6\x83\xeb\x3b\x7b\x6e\x9e\x90\xb1\x66\x68\x8e\x26\xea\x63\x6f\xaf\xcd\x37\xfb\x4d\x7f\x7a\x81\x9e\x50\x18\x61\xbe\xc2\xe4\x57\x18\x83\x10\xfa\x3b\x4a\x7f\xc7\xa9\x6f\x30\x86\xe2\x0c\xf9\x0c\xa3\x41\x39\x23\xb1\xa3\x63\xef\x19\x8a\xb3\xbe\x93\xb6\x63\xc7\xd4\x94\x78\x4a\x0c\x49\x50\xd7\x50\xc2\xc6\x4b\x1b\x1c\x62\xd9\x58\x33\x2e\x9e\xdb\x88\xa5\x87\xe3\x30\x4e\x5f\x43\x0f\x1f\x8b\x8a\x32\x0e\x56\xbf\x62\x69\x10\x38\x81\xa1\xd7\xd0\x20\xc6\x5e\xe4\xdc\xe7\xf0\xee\xaa\x69\x2c\x09\x12\x83\xd1\xab\xc4\x20\xf7\x24\x7c\x3f\x99\x82\x04\x8d\x23\xc4\x35\x24\xa8\xf1\xdc\x54\x34\x75\x9b\x5e\x0a\x1a\x21\xd1\xab\x48\xd0\x67\x52\xf8\x9b\xa5\x53\xd0\xa1\x70\x12\xbb\x8e\xce\xae\xd3\xc5\xc9\xc4\x02\x13\xd1\x31\xad\x78\x9b\x62\x60\x04\x66\xae\x41\xcf\xb8\xe8\xbd\xca\xe8\x78\xa3\x58\xf1\xd8\x51\x0a\xb9\xaa\xab\x11\xd8\x45\xef\xf7\x82\x3b\x1f\x8e\x27\x40\x30\xd4\x55\xda\x41\x90\x53\x02\x87\x09\xd6\xce\x01\xc4\x13\x62\x48\xe6\x3a\x49\xd0\xb3\x8e\xf6\xa7\xb4\xde\xe3\xb9\x71\x94\x10\x98\x22\xf0\xab\x7a\x04\xc1\x3c\x71\x0e\x85\x80\xd8\x1e\x47\x10\x94\x22\xaf\x93\x04\x1f\xab\xda\x66\xff\xa8\x82\x39\xd7\xc7\xaa\x06\xf4\x58\xd7\x88\x20\x04\x82\x5c\xe5\x84\x11\x62\xbf\x42\xb3\xaf\x9c\x6f\x12\xc4\x20\xa9\xeb\xdc\x3c\x42\x8e\x35\x63\x02\x6c\x67\x7c\x59\x9b\x4f\x20\x45\x31\xf4\x75\x3d\x42\x9d\x25\x05\xee\x22\x88\x18\x1f\x4c\x10\x14\x86\x31\xdc\x27\x12\x11\x6b\x63\x57\xf4\xaf\x0d\xb6\x17\xab\xfa\xa7\xe9\x42\x31\x37\xac\x75\x9a\x8d\x2e\x55\xee\x0d\x4b\x25\x16\x1b\x54\x5b\x05\x7c\x98\xc5\xfb\xf8\xa8\x5f\x2a\x70\xed\x7a\xa3\x45\x55\x71\xaa\xdc\x67\xf9\x2a\x9f\x2d\x64\xf9\x4a\x85\xe7\x1a\x45\x22\xa8\xa1\x48\x22\xa8\x4b\x44\x18\xe0\xcd\x7c\x77\xd4\xc4\xb2\x35\x02\x45\x47\xbd\x7a\x61\x90\xe3\x2a\x04\xc1\x57\xb9\x46\x89\xab\x97\xcb\x54\x53\xa8\x57\x46\x3c\xcb\x72\x42\x05\xc7\xf1\xa2\x20\x54\xea\x8d\xd4\x44\x30\x97\x48\x61\xd4\xe7\x31\xb6\xd1\x2b\xb4\xea\x68\x76\xd4\x19\x0d\xa8\x26\x4e\xf5\x85\x32\xde\xaa\x17\x2b\x39\x12\xad\x95\x6b\xcd\x6a\x23\xdf\xe1\xf3\xb5\x5e\x75\x34\xe2\x59\x22\xdb\xaa\x60\xa9\x89\xe0\x3b\x22\x6c\x96\x2a\xd6\x5b\xcd\x0a\x31\x1c\xa2\x1c\xde\xad\xd4\x6b\x3c\x3b\x6a\xe6\xb9\x6e\xb5\x59\xc5\x59\xb6\xdc\x6c\x0f\xca\xa3\x52\x75\x54\xec\x96\xdb\x39\xb2\xd0\x44\x6b\x6c\x4b\xc8\xf3\xa9\x89\x10\x3b\x22\xd9\x76\x73\x58\x2a\xd7\xd0\x5c\x19\x2b\xf0\x2d\x3c\x3b\xa8\x15\xea\x7c\xbe\x56\xa8\x74\xf9\x66\x17\x2d\x0d\xb1\x51\xbd\x20\x94\x1a\x7c\x37\xc7\x35\x58\xa1\x4f\xb5\x72\x54\x63\x80\x96\x9e\x6e\xdd\xe6\xb2\xcb\x7a\x13\x0c\xca\xdf\x1a\x78\xdc\xd5\xfb\xcd\x06\xf1\x5b\x40\x5e\x20\xe2\x05\x72\xac\x25\x48\x61\xe6\x97\x9b\x3b\x6e\x36\x72\x6f\x52\x76\x6a\xe2\xb2\x05\x14\xcd\x19\x8b\xfa\x62\x2a\x1a\xcb\x39\xbe\x1b\x98\x5d\x21\xff\xf4\x11\xdd\x79\x4e\x1d\x4d\xa0\x7e\x87\xc5\xde\xb2\x99\xe2\x21\xbd\x7c\x36\x81\x7d\x81\xd0\xb4\x7d\x1c\xb6\x97\xe2\xd6\x4e\xde\xef\xa7\x38\xe9\x65\x04\xa5\x69\x9c\x81\x09\x86\x26\xdc\xc9\x0c\xba\x9b\xcd\xfc\xfb\x49\xd7\xe6\x9a\xf3\xe9\x3b\xf4\x89\x41\x51\x0c\xa3\x50\x18\x23\x69\xe2\x1b\x4e\x51\x04\x0d\x53\x9f\x5e\xa0\x4f\xc7\xbd\x3b\x3b\xa8\xae\x90\x3f\x5e\x74\xb6\x0b\xf7\x62\xb0\x07\x8f\x10\xde\x1e\x9e\x1d\xcc\xad\x5d\xf9\xe9\x7f\x51\xa6\x14\x94\x11\xdd\xcb\x88\xc0\x30\x8d\xfc\x27\x32\xde\x38\x58\xd2\xcb\x88\xbc\x40\x34\x41\x33\x0c\x46\x93\x34\x73\x98\x93\xfe\xfb\xc9\x76\x76\x13\x36\x63\x32\x96\x44\x5d\x34\x64\x97\x63\x04\x86\xe1\x6f\xb0\xf7\x49\x4f\x81\x38\xa7\x80\xbe\x40\x98\x4b\xc1\x4b\xda\x2e\xf0\x5e\xe8\xc9\x10\x1d\x6d\x05\x6e\x96\x08\x7b\x81\x10\x4f\xa4\x35\xd0\x26\xd3\x1d\x41\xe4\x05\xfa\xe4\x19\xfe\x78\x06\xb6\x9e\x2d\xdd\x16\x92\xaf\xb2\x25\x97\x2b\x1c\xa5\xfc\xe1\xf2\x51\x7a\xf6\x29\x7c\xb8\x9e\x03\x12\xa5\xd4\xf3\x6d\x59\x49\x7a\xae\xb0\x3d\x57\x24\xed\x0f\xd9\x0f\xd3\xb3\x47\xe1\xc3\xf5\x1c\x90\x28\xa5\x9e\x3f\xda\x37\xe2\x3e\x57\x04\xcc\x50\xd4\x87\xea\xd9\xa7\xf0\xe1\x7a\x0e\x48\x94\x4e\xcf\x77\xf9\xe7\x84\xf0\x1d\xb6\x05\xf0\xd6\xf0\xbd\xdf\x06\x78\x9a\xbd\x23\xb4\x2c\x49\x18\x25\x4a\x18\x85\x28\xb2\xc4\xc0\xb0\x4c\xe3\xa4\x88\xa8\x0a\x0d\xc3\xb0\x8c\x8a\x30\x23\x93\x34\x10\x51\x4c\x12\x71\x8c\x26\x68\x19\x56\x00\x50\x60\x42\x51\x51\x85\x91\x95\x5d\x3e\x05\x2b\x32\x45\x50\x30\x29\xa9\x0c\x43\xd0\xaa\xa2\xa0\x18\x4a\x2a\xb2\x48\x61\x32\x8e\x32\x92\x48\x63\x8c\x84\x11\x24\x21\xa9\x38\xc6\x10\x8c\xcc\x50\x28\x4e\xc2\x00\x05\x14\x8e\x28\x04\x2a\x79\xe9\x0c\x1a\x98\xb7\x91\xdf\x31\xfc\x3b\x4a\x07\xa7\x73\xee\x65\x0c\xfe\x46\xd1\x24\x03\x63\x89\x77\xfd\xfc\x04\xa1\x69\xfa\x05\x42\xc8\x5d\x7f\x5e\x7c\x5e\x20\x72\xf7\x0f\xf1\xff\xed\x2f\x22\x87\x2f\xbb\x6c\x96\x65\x59\x36\xb7\xc6\x4a\xbd\xb5\x98\x99\xf7\x5e\x19\xf8\xb5\xe2\x6c\x8d\x26\x57\x95\xde\xf2\xf3\xf7\x9e\xbe\x82\x1b\x3d\xa3\x22\xcf\x86\x8d\x9a\xd1\x52\xba\x16\xa7\xb2\xc3\x52\x5f\x65\x0d\x1a\x37\x5e\xa7\x23\x53\x2c\x17\x46\x7a\x19\xa9\xda\xfc\xb2\x9d\x57\x65\xc0\xa8\xe4\xaa\x27\x91\xf8\xa0\x02\xef\x50\xb3\x83\x66\xaf\x5e\x60\x8f\x9f\xa9\x90\x27\xc9\xda\xf4\x5d\xa2\x46\xbc\x69\x75\xb7\xef\x9d\xd6\x5b\x16\x41\x0c\x05\xb6\xad\x7a\xa9\xb9\xa2\x67\xa2\xd6\xaa\x75\x88\xa9\x36\xd1\x07\xa3\x51\x56\x40\xa5\x25\xbb\x79\xee\x5b\x5c\xb5\x09\x1b\xd8\x33\xa9\x73\x18\x69\xb5\xeb\x28\x98\xe2\x45\x16\x95\xac\xe2\x5a\xec\xad\x77\x98\xeb\x3c\x5e\x13\xdf\x17\x68\xeb\x84\x5a\x65\xc8\x86\x7c\x46\xec\x00\xc1\x5b\x2c\x9b\x87\x2b\x61\xb7\x7f\xeb\x8f\x67\x54\x70\xc4\xb8\x0f\x0e\x05\xf4\x31\x66\xfc\x44\x62\x0a\x43\xab\x04\x46\x02\x40\xd2\x0a\x22\xa1\x94\x44\x48\x34\xa3\xa2\x98\xa8\x12\x18\x82\x48\x14\x41\x32\x22\x8a\xab\xa2\x8a\xe0\x30\x26\x2a\xb0\x44\xa0\x12\x89\x61\x12\x4c\x49\x80\x61\x9e\x5e\x20\xdc\xfd\x0b\x19\x0a\x54\x94\xb1\xd3\x30\x8e\x33\x91\x43\xe1\x70\xd7\x4b\x88\x70\x82\x41\x63\x46\x02\x9e\x72\x24\xa0\xcd\xd1\x2b\xc2\x2f\x09\x13\x96\x2a\x54\x1f\x37\xb6\x8d\x55\x77\x53\xc4\x7a\x0b\x73\xf6\xbc\x2a\xb0\x0d\x27\x87\x54\xd1\x3a\x95\xa5\xc8\x11\xab\xe3\x9b\x9e\x4d\x2d\x32\x4a\xa9\xa7\x35\x5f\x67\x2b\x0d\x7d\x5d\x77\x28\x84\x65\xc8\x6a\x6f\x93\x2d\x74\xb4\x9e\x3a\x13\x9b\xd5\x66\xb3\xee\xf6\xdc\x6e\x24\x70\xae\xa5\x96\x0f\xff\x58\xd7\x58\xed\xe3\xef\x35\xdb\x6c\xcd\xbc\x9e\xd6\xf0\x2e\x40\xe1\x15\x6f\xc2\xf2\x9c\xdf\xce\xb2\x35\xb3\x80\xcc\xc9\x6d\x93\x5b\x75\x94\x15\x56\x57\x73\x6f\xcb\xfe\x60\x2d\x53\xfc\x62\x53\x15\xc8\x77\x2c\xbf\x9c\xce\xfa\x25\xa0\xd6\x32\x1d\xbd\xc3\x4c\x37\x39\xbd\x05\xaf\xd6\xc8\xb0\x5e\x22\xcb\x18\xcd\x15\xd0\x56\x83\x2b\xba\xf4\xca\x21\x23\xa5\xd8\x0a\xb3\xb6\xff\xcf\x47\x0a\x9e\x7e\xa4\x20\x8f\xb1\x72\x77\x69\x7a\x97\x2e\xec\xc2\x2b\xc2\x50\xf0\x57\x18\xf9\x0a\x23\x10\x0c\x7f\x77\xff\x22\xad\x19\xa1\x70\x8c\x89\xbb\xbb\x9b\xe9\xe3\x28\x83\x33\x24\x85\x32\x64\x8c\xa9\x87\x1b\xba\xc7\xd1\x7f\xdd\x27\xd1\x9f\xec\xa0\xaa\xe1\xdb\xcc\x56\xa8\x66\xa9\xbc\x91\x67\x4a\x28\xbc\x79\xcd\x3e\xdb\xf0\xc4\xb1\xd7\xe5\xf5\x3b\x32\x50\x84\xfe\x50\xcc\x56\xc4\xc2\x64\x07\xcf\x85\xd8\x70\xf8\x67\x6f\xc3\x2c\x9b\x9d\xfd\x02\x41\x1e\xfa\x79\xf2\x6c\x29\x39\x9f\x4a\xb1\xf7\xfb\xd6\xf4\x2a\x62\x49\x3f\xb2\x58\x12\x31\xe0\x12\xd0\x04\xeb\x11\xe8\x6d\x68\xb0\xf3\x09\x32\x71\x1b\x16\x3c\x50\x38\xb8\x0d\x4b\x60\xd2\x7a\x23\x2f\x64\x60\xea\x7b\x1b\x16\xea\x7c\xa2\x75\x23\x2f\x74\x60\xba\x76\x1b\x16\xe6\x7c\x32\x72\x23\x2f\xbb\x09\xcc\x29\x1a\xfc\x31\x0f\x09\x3c\xa4\xaa\x19\xbf\x83\xc5\x9b\x7c\xa5\x2b\x73\x46\xec\x95\xbf\x7b\x2c\x9f\xe8\xf1\x6c\xf0\x1e\x7e\xe0\xee\xbc\x97\x4c\x57\x11\x74\xac\xa5\xed\x00\x70\xd7\xec\x7c\x8f\xc6\xb4\xee\x2a\x5a\xfd\x16\x35\xd8\x0f\x58\x08\x8b\xec\xb9\x7d\xfd\xf6\xf0\x03\xbe\xb5\xe7\x6e\x9d\xef\x07\x7b\xee\xc6\x32\xd8\x6f\x51\x59\xfe\x80\xd5\xc5\x90\x9e\x3b\x0d\x2e\x87\xef\xf4\x49\xa5\x49\x5d\x1a\x8a\x2f\xcb\x8d\x8b\x77\xae\x5e\xbc\x25\xb4\x7b\xc7\x53\x8a\xb2\xd7\x9d\xab\x8c\xd7\xa8\xcd\x8f\x83\x87\xef\xf8\xc7\xaa\xed\x76\x63\xfe\xcd\xd4\xe6\x85\xec\xc3\x77\xf8\x63\xd5\x76\x7b\x10\xf8\xbd\xd4\xe6\x27\x17\x87\xef\xe4\x87\xaa\xed\x0e\x0f\xfc\xf1\x6a\x4b\xc8\x54\x42\x1e\x41\x4b\x93\xa5\x24\x63\x4d\x7e\x1a\xe7\xd6\x6c\x28\x72\x17\x6f\xe8\xdc\x06\x8f\x9e\x08\x24\x22\x42\x03\x01\x3a\x2a\x8b\x4f\x44\x84\x9d\x07\x8c\xa8\xdc\x39\x11\x0f\x1e\x08\x3c\xb7\xe2\x09\x78\xe2\x9b\xf9\x21\xcf\xf1\xdc\xac\x1f\xea\xdc\xc5\xdd\xcc\x0f\x7d\x8e\x27\x6a\xa6\x93\x88\x87\x39\xf7\x1d\x37\xf3\x73\x36\xdb\x21\xe3\x66\x3b\xd7\x3e\xd9\xf4\x88\xf9\x4e\xd2\x46\xf6\x6b\x66\x3c\x91\xcf\x31\x3d\x60\x94\x9f\xec\xb4\x13\x71\x98\x52\x10\x40\x30\x22\x49\x23\x38\xc3\x28\x94\x84\x88\x2a\x4e\x11\xa8\xa2\x52\x12\x85\x31\x04\x26\x93\x18\x42\x51\x28\x90\x70\x58\x16\x29\x82\x66\x68\x46\x62\x48\x18\xa1\x15\x92\x41\x9f\xbc\x55\xb4\x7b\x32\xfd\x93\xd2\x35\xb6\xaf\xd9\x45\xae\xfb\x50\x30\x1d\x59\x28\x3f\xdc\x3d\x73\x56\x5e\xb1\xaf\x96\x23\x56\x4a\x87\xac\xe2\x0d\xb9\x48\xbd\x4d\x06\x73\x96\x76\xde\xf9\x57\xbd\x52\x78\x35\xd5\xde\x3b\x59\x63\xc5\x85\x29\x4c\x45\xbd\x26\xb0\x6e\xb1\x8c\xdd\xd7\xa2\xb3\x81\x5a\xd4\xc9\x6f\x77\x55\x25\xdb\xeb\xf1\x9c\xf7\x3b\x57\x9b\xbf\x2b\x13\xa5\x6b\x17\xc5\xfc\x1c\x48\x19\xf5\x9d\x59\x94\x89\xec\x74\xa6\x31\x0b\xb1\xb0\xea\xe2\x32\xfa\x3a\xe8\xf5\x65\x27\x0b\x97\x32\x87\xcf\x11\x5f\xf1\x40\xbf\x95\x33\x46\xfa\x8a\x2b\x77\x74\x60\x2f\xfb\xb2\x93\xcf\xbc\x33\x83\xfa\xaa\x22\x2c\x5f\xfb\x6f\xb9\x61\xb6\x4d\x14\x48\xe7\x1d\x6c\x05\x67\xc1\xbd\x69\xad\x01\xd8\x36\x38\xa7\x62\x15\x1b\xd8\x52\x5f\x4a\x43\x55\xc3\x67\xcb\xf5\x86\xeb\x14\x88\xe7\x5c\xa3\xdd\xce\xa0\xcf\x70\xb9\xca\xe2\x3f\x9f\x4e\x8b\x9f\xa7\xb5\xee\xe3\xd7\xe2\x89\xac\x47\xf8\xd6\x41\x1f\x79\xf7\xf7\xfa\x08\x64\xd7\xe6\x0c\xd2\x34\xad\x09\xb1\x96\x96\x6f\x59\x30\xcc\x6f\xb1\x3a\xda\xe8\xce\xfa\x8d\x29\x33\x68\x9a\x76\xf6\x6d\x3e\xad\x16\xde\xba\x8e\xdb\x3e\xd7\x63\x57\xaf\xc6\x51\xbf\x11\x1f\x2e\xea\x46\xf6\xc1\xf4\x83\xfd\x7b\x05\xfd\xfa\x51\x1f\xee\x27\xb7\x5e\x4a\x58\xf7\x59\x5b\xe6\x8d\xec\x92\x34\x0b\xc4\xa4\x59\x93\xdf\x87\x84\xd0\x1e\x92\x25\x44\x7e\xd6\xd6\xc5\x37\x91\x33\xfb\x0b\x01\x76\x8b\xb7\x95\x6e\xee\xb9\x21\xbb\x4d\x27\x31\x34\x23\x6b\xbb\xdc\x47\xd0\xbf\xd4\x47\x7c\x6d\x39\x7f\x84\xb9\x96\x7e\xa1\xd7\x85\x7d\xe4\xe5\xa5\xc4\xa3\x59\x44\x58\x8f\xcc\xc6\x88\x58\x31\x99\x26\x3a\x7b\x9d\x15\x8b\x42\x0d\xd5\xcd\x3e\xd3\x99\xbe\x8b\xbc\xd2\x1b\x6d\xe1\xd2\x09\x37\xd9\xe3\x20\x5a\x07\xf5\xf7\xf3\x68\xbb\x2e\x2d\xb7\xaf\x72\xf7\xe9\xca\x27\x3d\x89\xd1\xc6\x2f\xeb\xab\x6b\xe8\x7b\xba\xf8\xb7\xaa\xcc\xfb\x74\x6b\xda\xe8\x91\x5b\x62\xb4\x85\x9b\x99\x26\x22\x6f\x69\xbd\x4a\xf2\xa2\x59\x99\x14\x4a\xb3\xc1\x1b\xc6\x53\x95\x2a\x3a\x13\xde\x2a\x59\x85\x2a\xe3\x02\x3c\xb7\x87\x14\x20\xfb\x84\x33\x7d\xae\x69\x02\x95\xe7\xda\xf5\x81\x81\x97\x89\x42\x29\x23\x51\xad\x89\x99\x9f\xfc\xfc\xe9\xa6\xd4\xee\x93\x8a\xfb\x85\x1f\xef\xff\x2e\xd0\xb9\x0e\x3d\x39\xda\x9f\x3e\xe3\x23\x4b\xb0\x4a\x4a\x18\x02\x60\x91\xc2\x54\x52\xc6\x44\x0c\x21\x15\x06\x83\x55\x42\x01\x12\xae\x30\x22\x8d\x12\xa2\xa4\xd0\x30\x86\xc0\x8a\xac\xc2\x32\x41\x53\x0a\x05\x10\x54\xa6\x48\x14\xf7\x22\xd2\x5d\xfb\xa3\xaf\x8b\x48\x18\x11\xb3\x8b\xc1\xbf\x7b\x96\xf5\x7a\x56\x59\xed\x3d\x37\x4b\x9d\x1a\x33\x1d\x60\x7d\x1b\x19\xf6\x71\xad\x42\x21\x6f\x5a\xa3\xd1\xd6\x38\x55\xad\x68\xb2\xc3\xb2\xb3\x19\x4d\xac\xe1\x05\x7b\x73\x44\x62\xf3\xf4\x7b\xb9\xd9\xc1\x8a\x3c\x47\xb4\x6b\x05\x27\xab\xe3\xdb\x6e\x97\x19\xb0\x6c\xeb\x99\x87\x47\x0d\xab\xf2\x56\xd6\x6a\x9b\x01\xd9\xcf\x85\x46\x24\xee\x40\xbf\xc5\x4e\x98\x2e\x2f\x14\xac\x4c\xa1\xb2\x1e\x3e\xa3\xac\xcc\x61\x2b\x74\x9b\xe9\xe2\x96\x62\x63\xc4\x32\x5f\xa1\xe9\x55\x93\x7e\x26\xf5\x7e\x7b\x53\xeb\x8c\x46\x15\x75\x34\x9b\x35\x5b\x53\x47\x28\xc2\xbd\x11\x8e\x97\x1a\x58\xa3\x56\xab\xd7\xf0\xfa\xea\x79\x51\xac\x4d\x27\x03\x73\x3e\x61\x3f\x24\x22\x2d\x06\x38\xad\xd4\x57\x68\x41\x55\xc4\xf7\xde\x54\xd2\xca\xc6\xaa\xff\x56\xc6\x89\x62\xb9\xcd\xd0\xf3\xca\x16\x66\x73\x42\xe7\xdd\xc8\x0b\xee\x4a\xd8\xc3\x23\xd2\x9d\xf4\x1f\x19\x91\x74\xf5\x75\x03\x6f\x33\xc3\x1e\x83\x58\x7c\xbf\xb0\x2c\x6b\x80\x11\xcd\xd7\xd7\xd9\x70\x5a\xc2\xb6\x43\xa3\xd6\x62\x2b\x95\x66\x43\xe6\xab\xae\x3e\x1f\x1e\x91\x1e\x41\xff\x9e\x88\x74\x25\xfd\x93\x88\xc4\x36\xdf\xeb\x13\xa6\x29\x0f\xe1\x8e\xce\xd9\x7d\xb8\x38\x78\xad\xb4\x3b\x88\xcc\x66\xf3\x38\xd6\x9e\x91\xf6\xdc\xd4\xca\xab\x82\xba\x18\x9e\x18\xcd\x5d\x11\xe9\x06\x5d\x3d\x34\x22\xdd\xd9\x57\xd7\xd0\xf7\x23\x52\x2e\x8f\xb4\x90\x72\x7f\x45\x77\x8d\xec\x2b\x35\xcc\xae\x3b\x20\x23\xd5\x98\x8e\xe6\xa0\xef\xea\x1c\xaf\x1b\xef\x5b\x3a\xf3\x4e\xbd\xf5\x46\x25\xce\xe1\xf5\x99\xce\xcc\x85\x16\x93\x2b\x22\x65\xa9\xdd\x33\x5e\x27\x32\x25\xe3\xb6\xbd\x5e\x4d\xb6\x19\x72\x36\x5c\x16\xb3\x40\x13\x77\xc8\x1f\x1b\x91\x64\x52\x26\x29\x4c\x51\x30\x15\x56\x09\x14\xa7\x55\x04\xa0\x32\x4d\x48\x32\x4d\x2b\x22\x90\x80\x22\xaa\x22\xae\x00\x0a\x41\x61\x54\x02\x0a\xc0\x19\x1a\x26\x49\x4a\x46\x60\x94\x41\x69\x14\xf1\xf6\x2a\x21\xf7\xd4\x9d\xdc\xe6\xb1\x81\x88\x86\x71\x92\x26\x62\x76\x09\x91\x34\xf9\x74\x5e\xed\xf0\x6c\xb1\x58\xa3\x4b\xad\x55\x6b\x26\x55\xd1\x12\x8b\xf5\x7b\xaf\x6d\xab\x3a\x7f\x1d\xc0\xb0\x5a\xa4\xed\x5a\x99\x9a\xc3\x5c\x7b\x5d\xe9\x67\xd8\x01\xc6\x1e\xe2\x90\xfb\x89\x89\x43\xde\xe7\x86\xcc\xfc\x74\x6b\x42\xb6\xb7\x5a\x17\x98\xdd\x38\xe2\xf2\x16\x55\x84\x19\xe6\xad\x5c\xa3\x8c\xa6\xb4\x79\x07\xe8\x26\x37\xa9\x14\xa5\x6e\x6f\x84\x5b\xab\xdc\xa4\xb3\x7d\x7f\x7e\xb7\xab\x52\xe9\x6d\xa8\x0a\x15\x56\x7f\x7b\x7b\x46\x6a\x15\xb6\x5b\x2e\x31\xaa\xf4\xda\x79\x95\xf8\x86\xd4\x03\x7a\xb5\x2d\x32\xb0\xa5\x65\x16\x68\xbb\x34\x28\x57\x52\xc4\x9e\x33\xa3\x3d\x8f\x3d\x27\x32\x1f\x7d\xef\xc9\x78\xce\x6a\x99\x2c\x5c\x83\x2b\xc5\xad\x33\x5d\xf3\x88\x3e\x84\xc5\xed\xc2\x44\x18\xbe\xb4\x59\xd5\x72\xdb\x06\xe1\x64\x39\x39\xe7\xc9\x88\x4d\x1c\xab\x61\x0c\x33\xc4\x3a\x89\x89\x84\xf1\x7c\x07\xfd\x42\xa7\x9f\x5d\xdc\x41\x9f\x65\xff\xbb\x0c\x3b\xd4\xb7\x66\x6f\xd7\x45\xc3\x18\xc5\x8a\x99\xa4\x8b\x7b\xfb\x62\x67\x0b\xcf\x72\x00\xdf\x55\xba\xf8\x97\x7c\xde\x38\x4d\x55\xd4\x72\xcf\xc4\x3b\x4a\xcb\x98\x63\xb7\xcc\x5c\x7b\x8e\x14\xfa\xa0\x4a\xad\x4d\x8e\xb6\x33\x36\x95\x9b\x6f\xc8\x79\x09\xd6\x5a\x15\xf1\x6d\xe5\x08\xdb\x56\x21\x97\xcd\x0c\x50\x1c\xc6\xd1\xf7\xce\x1c\x19\x2c\x84\x59\x7f\xa5\x54\xf1\x15\xa9\xcc\xda\xc8\x36\xd7\x7a\xb4\x6f\xa5\x18\x58\xa6\x54\x85\x80\x51\x5c\x24\x14\x91\xc1\x60\x89\x92\x15\x82\x00\x0a\x86\x48\xaa\x8a\x2b\x0a\x2e\xa2\x14\x03\x00\x0a\x8b\xa8\x8c\xa8\x32\x4c\x33\x80\xa1\x08\x82\x22\x28\x0c\x77\xb3\x7d\x7f\x73\xf1\x1d\xbe\x15\x4d\xf6\xad\x34\x85\xc6\xf8\x56\xef\xee\x69\xe5\xf6\x5e\xdf\x9a\x0b\x74\xea\x85\x6f\xbd\x21\xc7\x8c\xf0\xad\xec\xdb\x52\x68\x94\xb7\x4e\x95\xdd\x20\x19\x85\xd3\xad\xa1\x29\x2c\xdb\x4a\x47\x6a\x3b\xbd\x7a\x6b\xe5\x70\xcc\x84\x15\xf1\x65\x3d\x03\xf4\x49\xbd\x36\xb0\x95\x8d\x60\x8b\x16\x25\x8c\x6a\xcf\x0b\xaa\x9c\x79\xae\xd0\xa3\xf2\x5a\x5b\x0d\x37\x46\xf1\xb5\x31\xd0\x16\x0e\xa1\xe2\xdd\xdf\xcc\xb7\xde\xeb\xdb\xee\x1c\xcf\x6f\x54\xa6\x93\x1f\x3d\xd2\xb7\xfe\xc2\x5c\x31\x29\x6f\xfd\x95\xbe\x8d\x7d\x90\x6f\xa5\xf1\x63\xfb\x88\x39\x5f\x6c\x25\xc5\x9a\xbd\x6a\x75\x4b\x98\xd4\x15\x15\x6b\x57\x44\xb4\xca\x59\xb3\x41\x17\x85\xa5\x5e\x87\xab\x51\xed\xe6\x90\x2d\x2e\x6b\xaf\x4d\x6c\x31\xcc\xe7\x10\xaa\x24\x77\xad\xe2\xdb\x33\x3c\x17\x32\x6f\x60\xdb\xcc\x68\x6a\x51\xa8\x97\x2d\xb4\x3e\xda\x98\xef\x3a\xfe\x26\x81\xc1\x73\xe1\xf1\xbe\x95\xc6\x70\x95\x84\x29\x52\xa4\x68\x0a\x96\x70\x06\x45\x30\x9c\x92\x00\x2c\x92\x08\x4a\xe3\x34\xa5\x30\x30\xac\x8a\x92\x8c\xc0\x14\x2d\x01\x1c\xc3\x54\x9c\xc2\x24\x54\xc5\x10\x8c\xa1\x31\x4a\x7d\x3a\x3c\x91\x73\x87\x6f\x4d\x2a\xa0\xd0\x30\xce\x30\xd1\x3b\x7e\xf7\x77\x4f\x57\xa1\xee\xf5\xad\xf9\x40\xa7\x5e\xf8\x56\x8d\xb0\xb1\x61\xa9\x57\xcb\xce\x27\x84\x31\xcf\x60\x74\x46\x14\x1a\xad\xe1\xa8\xbc\x12\xfb\x53\x09\x69\x94\x78\x13\x41\x7a\x46\xad\xa5\xb8\xe0\x71\x79\xab\xd0\xde\xa0\xce\x4c\x6c\xce\xcd\x75\x83\x78\x2e\x36\x70\x91\x78\xe3\x46\x64\x86\xcc\xae\xa5\x99\xc9\x56\x9f\x79\x86\x55\xf0\x32\xa0\x8b\x4b\x52\xc5\x07\xfd\x25\xd5\x7e\xdd\xb4\x28\x55\x5a\xd6\x6a\x7d\x72\xa6\x2d\xcc\xf9\xa6\x57\x56\x0b\x15\xfa\xb9\xa3\xad\x88\x91\x82\x77\xeb\xdc\x6f\xe5\x5b\xef\xf6\x6d\xf7\xfa\xd6\xad\xd5\x2a\x54\x1e\xe9\x5b\xd3\xaf\xe2\xb8\xf0\xbf\x9b\x6f\xbd\xd5\xb7\xb1\x0f\xf2\xad\x54\xf7\xd8\xbe\x7e\xb5\x2e\xfe\x85\x67\xb2\x62\x8d\x8a\xaf\xc4\x5b\x3d\xbf\x54\xa7\xaf\xcb\xe2\x52\x9c\x16\xc1\xea\x79\x22\x17\x89\x2a\x9b\x5b\xbd\xaa\xad\x12\xc8\x95\x56\x59\x6b\x69\x3c\x17\x10\x6b\x09\x0f\xe9\x6e\x03\x43\x29\x6d\x8b\x2c\x17\xe5\x37\xb1\x62\xf7\x84\xd2\x46\x50\x9b\x33\xdc\x7a\xee\x0f\x40\x21\x9f\x7d\x78\x4d\x40\x55\x69\x9a\xc2\x25\x49\xc1\x49\x00\xa3\x8a\x0a\x18\x09\xa7\x44\x51\x55\x30\x42\xa2\x11\x4a\xc1\x54\x1c\x97\x54\x8a\x64\x44\x58\x51\x55\x58\x52\x29\x4c\x42\x48\x40\x4a\x32\x2c\x62\x18\xf0\x7d\x2b\x7e\x9f\x6f\xc5\x13\x7d\x2b\x81\x46\x3f\x62\xe7\xde\x3d\xf8\x56\x7f\x41\xfd\x5e\xdf\x1a\x0c\xe6\x97\xb5\xbb\x4c\x7d\x9b\x87\x99\xcd\x6b\xbb\xd1\x15\x36\x52\x6b\x04\xea\x7a\xa1\xd9\x5b\xb3\x5c\xf3\x55\x29\x76\xde\xb6\xa2\x56\xd6\xe8\xde\xb3\x3e\x71\x07\x44\x5c\xde\x9a\x2d\x3f\xb7\xcb\xd9\x0e\xcb\x34\xb2\x8d\x52\xd3\x61\x17\x1d\x65\x38\x44\xd9\x6c\xb6\x6d\xb6\x09\x42\xc7\x95\x35\x37\xb4\xdf\x0d\x5a\x17\x7b\x0e\x81\x4a\x23\x5e\x7c\x46\x78\x35\xdb\x5b\x8e\x54\xb5\xd7\xd9\x96\x24\x71\xbd\x26\x5b\x70\xc6\x56\x4d\xb4\xa1\x16\x08\x19\x2e\xad\xf9\xdf\xcb\xb7\xde\xeb\xdb\xee\xf5\xad\x8b\x01\x5f\xbc\xa7\x26\xc1\x06\xe8\x5f\xb1\x1e\xe1\x82\xff\x6e\xbe\xf5\x56\xdf\xc6\x3e\xc8\xb7\xde\xda\x17\xbe\x6f\x65\x85\xe6\x4c\x60\xbb\xeb\x66\x67\xd2\x99\xbe\x53\xad\x6a\x17\xeb\x17\xf9\x09\xdb\xea\x8a\x1c\x00\x23\x50\x92\xb3\xc5\x5a\x9d\xc8\x54\xfa\xba\x04\x94\x39\xda\xe9\xaf\x9c\xce\x60\xdd\x93\xe6\x03\x0c\xe9\xd2\x53\x14\xb5\xeb\x8d\x19\xdf\xa4\x4a\x24\xff\x6a\x6c\xc0\x80\xcf\xd2\xf9\x94\x79\x6b\xe4\xe9\x5e\x97\x87\x5f\x1f\x0e\xda\xdc\xbf\xe7\xfa\xda\xf7\x53\x9e\x60\xf4\x0e\xe2\xcb\xe7\x4f\xdf\x9a\x1d\x24\x08\x35\xdb\xe5\x3a\xdb\x1e\x42\x55\x6e\x08\x7d\xd6\x94\xa4\x03\xb8\xc2\x0f\x03\xbf\x9b\xeb\x00\xd6\x30\xce\xc3\x08\x27\x72\x1f\x78\x8d\x4e\xe0\x9d\x33\x29\x0f\x53\xbf\x5b\xba\x73\xb2\x61\xc2\xdd\xc4\x18\xd4\xe5\xcb\xad\x2e\x07\x7d\x3e\x82\xbf\x9c\x9c\x34\xf5\x72\x76\x2e\xd4\x95\xaa\x79\x4c\xb7\x5e\x2d\xf8\x55\x9d\x1a\xf1\x78\x50\xc2\x23\x38\x8f\x95\x2c\x9c\x48\x9c\xa4\x31\x6c\xa5\x96\x3c\x72\xb3\x60\xe2\x76\xbc\xc7\x4a\x1f\x45\x26\x4e\xfe\x58\xd6\x12\x35\xe0\x99\xb4\xb4\x75\xad\x7d\x2f\x48\x99\xcf\x73\x83\x74\x2f\x39\x77\x41\xcf\xb1\x40\x0d\x3e\x38\x18\xba\x42\x99\x2f\x42\x92\x63\x01\x70\x3a\xba\xa2\xb9\xf1\xc6\xd8\xfd\xfc\xf8\x67\xb8\xa5\xe2\x28\x62\x5c\x4b\x87\x17\xa7\xdd\xcc\xce\x11\xc5\x29\x27\x67\xb3\x81\x73\x7e\x3c\xe0\x97\x8b\x57\xae\x87\x31\x37\x15\xed\xe9\x3d\x9c\xb9\x6f\x9e\x4f\xc5\x56\xf0\x7d\xf5\x61\xdc\x78\x0f\x81\xdf\xc3\x8f\x87\x21\x1d\x47\x81\x97\xe1\xbf\x5c\xbe\xf7\x3e\x74\xc8\x8f\xc1\xce\x36\xdc\xfb\x37\x70\xea\x47\x09\x8f\xe1\x00\xba\x53\xb6\xf7\x6f\x8c\x39\xe3\x38\xec\x08\x98\x97\xfd\x71\x2f\x51\xcc\x1e\x5f\xb2\x7d\x27\x9b\x9a\x92\x9a\xc1\xe3\x79\x17\x2f\xa1\xe7\xd6\x24\x30\x6d\x2e\xc6\x8b\x47\xf1\xed\xe3\x3a\x65\x3d\x22\x54\xdd\x24\x49\xb8\x00\xce\xe6\x71\x02\xf8\xb8\x22\x6c\xfa\x46\x11\xce\x0f\x2f\xb9\x14\xc2\x5c\xec\xac\x72\x6a\xde\x24\x83\xcf\xfc\x11\xc7\xad\xca\x8f\x57\xf4\xe1\x28\xc0\x9d\xab\xbe\x5f\xd7\xe7\xe8\x4e\x59\xde\xbf\x9b\xe2\x8c\xc7\x70\x8e\x4e\xf5\xfa\x28\xb6\x2e\x70\xa6\x73\x6f\x61\x0c\x3a\x5e\x97\x38\xf7\x74\xeb\x11\xc7\xed\x26\x99\x64\x7e\x8e\xa5\xec\x88\x9c\x9e\x28\x75\x07\xc3\x97\xc8\x02\x9c\x2b\x20\xc0\x67\xe0\x28\xab\x78\x06\xdd\xb7\x35\x3f\x86\x3d\x17\x55\x2a\xe6\xf6\xaf\x88\x8e\x64\x2d\x70\x48\xd6\xdd\xfc\x05\xf0\x25\x31\x79\x79\x46\x57\x22\xa7\x8f\xd1\xe3\x19\xb6\xb4\x5c\x26\x6a\xf3\x31\xbc\xa5\xe2\x29\x9e\x97\x3d\xc7\xba\x69\xce\x96\x8b\xfb\x38\x3a\xc7\x95\xba\x47\xf7\xa7\x80\x85\xf2\xb7\x10\x35\x6b\xec\x1e\xf5\xf2\x08\x0e\x83\xd8\xd2\x8d\x5b\x9f\xc1\x97\x8b\x83\xcb\x5e\x2e\x0e\xbf\x8b\x10\xe2\x01\x7e\xdb\xc7\x93\xc4\xf1\x95\xd9\xd1\x0e\xeb\xc3\xb4\x7b\x85\x62\x13\xf5\xe6\x9d\xbc\x71\xf1\xb2\x68\xd3\x18\xfb\x27\x82\xdf\xab\xd0\x44\x02\x67\xf3\xb4\xfd\x7b\xb7\xcf\x67\x46\x1e\xe0\x15\xbc\xdf\x6f\x07\x71\xb8\x93\x39\x0e\x19\x65\xe7\x08\xfd\x2c\x7c\x87\xcf\xd9\x2e\x6e\x9f\x83\xc7\x62\x4d\x4c\xfb\x77\x40\x09\x8c\xfa\x39\xd4\x0e\xe5\xc1\x88\x1e\xc4\x6d\x18\xea\xc4\xf4\x2d\xad\x25\x9f\x20\x7f\xb4\x31\x9c\xa1\xbe\x25\xdf\x8c\x46\x17\x38\xfe\xf9\xf1\x8a\xbe\x38\x60\x3a\x91\xfd\x40\x83\xf4\xc2\x9c\x9c\xf7\xfd\x61\xfa\x3f\x3d\x53\x3c\x49\x92\x13\xd8\xf4\x42\x84\x9d\x5e\xfe\x61\xd2\x84\x1e\x95\x9e\x24\x56\x58\xa3\xf4\xf2\xed\x8b\x28\x1f\x26\xd3\xe1\xdc\xc0\x24\x39\x22\xab\x5d\xe7\xa8\x8f\x2f\x98\xf8\x88\xa1\x1d\xc4\x1e\x3a\x01\xbe\x76\x80\x9f\x23\x3d\x9f\x42\x3d\x68\x84\xc7\x91\x48\x23\x43\xc2\xbc\x2e\x96\xd8\xe3\xc2\xd7\x25\xe2\x54\xbc\x27\x07\xb1\xd3\xc9\xf6\x47\x98\xcd\x25\xfe\x9b\xa7\xfa\xde\x41\x42\xfb\x40\xbe\xaf\x30\x8e\x25\xd3\x9c\xdd\xac\xe5\x18\x9c\x89\x29\xc2\xe7\xcf\xfb\xb3\xb8\xbf\xfe\xf5\x17\xf4\x64\x9b\xba\x72\xb2\x9a\xf6\xf4\xfd\xbb\x03\x36\xce\x97\x2f\x2f\x50\x34\xa0\x6c\x2a\xe9\x00\xbd\x5a\x7c\x34\xa8\x64\x2e\x27\x53\x27\x15\xf9\x33\xd0\x78\x06\xce\x40\x03\x2c\x7c\x81\xfa\x25\xae\xcd\x79\x46\x06\xfd\x84\x30\x2c\xf5\x42\xb4\xa6\x8c\xd5\x93\x65\xa2\x42\xf5\xd7\x2c\x47\xfb\x64\xa1\x42\xa3\xcd\x95\x8b\xfc\x61\x09\x08\x6a\x73\x05\xae\xcd\xf1\x39\x4e\x08\xac\x8a\xb8\x77\x1b\x3c\xd4\x6d\xe6\x77\x26\xd3\xe6\x84\x4e\xbb\x9c\xeb\xec\x2e\xe5\xb9\x1a\xd7\xe1\xa0\x1c\x2b\xe4\xd8\x3c\x17\x7f\x68\x7a\xe0\xe7\x38\x50\x8a\x79\x9c\x32\xce\xe9\x24\x2c\x92\x45\x71\x72\xae\x9f\x60\xd9\x28\x54\x59\x7e\xa2\x9f\xb0\xa2\x18\xa9\x09\x7f\x2a\xfb\x9f\xeb\xe1\x94\x8f\x30\x2d\xec\xab\x04\xf1\x06\x73\x9d\x06\x2e\x8b\x4a\xff\xa1\x1a\x22\x98\x39\xd7\x45\x48\x19\xec\xb1\x46\x11\x2c\x71\xfc\x0e\x0a\x89\x36\x8d\x8b\x1a\x52\x5a\xeb\x68\x9a\xb6\x33\xb1\x80\xd0\xaa\x41\x8a\xe8\x88\x3b\x13\x83\x94\xe5\x7c\x01\xc9\xe6\x7c\xa1\x03\x07\xb8\x32\xfc\xbf\x00\x00\x00\xff\xff\xa3\x3e\x13\xdc\x08\xac\x00\x00") - -func asset_stat_operationsHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_operationsHorizonSql, - "asset_stat_operations-horizon.sql", - ) -} - -func asset_stat_operationsHorizonSql() (*asset, error) { - bytes, err := asset_stat_operationsHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_operations-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfd, 0x37, 0xb2, 0xca, 0x86, 0xbf, 0x3b, 0x4a, 0x4f, 0x59, 0x7f, 0xa6, 0xd2, 0xf3, 0x93, 0x52, 0xd8, 0x3b, 0xf3, 0x83, 0x5b, 0xb0, 0x7f, 0xd2, 0x5a, 0xd1, 0xcd, 0xfe, 0xbb, 0xd8, 0x1e, 0x1a}} - return a, nil -} - -var _asset_stat_trustlines_1CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xa2\xce\xf2\xee\xfb\xf9\x14\xc4\xbc\xe9\x99\xb0\xe7\x27\xfb\x32\x73\xe7\x44\x80\xe0\x8a\xfb\x86\xde\xb8\xd1\x51\x40\x81\xb4\x2c\xca\xe2\xd2\x37\xce\x77\xbf\x21\xb8\xa0\xa2\x6d\x6b\xcf\x39\xff\x1b\x31\xbc\x98\xb1\x25\x79\xea\xa9\xac\xcc\xac\xac\x02\x93\x1f\x3f\xbe\xfc\xf8\x81\xb4\xbc\x20\x34\x7d\xd8\x6d\xcb\x88\x0e\x42\xa0\x82\x00\x22\x7a\xe4\xcc\xbe\xfc\xf8\xf1\x65\x73\x5e\x8c\x9c\x19\xd4\x11\xc3\xf7\x9c\x83\xc0\x02\xfa\x81\xe5\xb9\x08\xf7\x0f\xfd\x0f\x96\x92\x52\xd7\xc8\xcc\x7c\xd9\x5c\x7e\x22\xf2\xa5\x2b\xf5\x90\x20\x04\x21\x74\xa0\x1b\xbe\x84\x96\x03\xbd\x28\x44\x7e\x23\xe8\xaf\xf8\x94\xed\x69\xd3\xf3\x6f\x2d\xdd\x86\x2f\x96\xfb\x12\xfa\xc0\x0d\x80\x16\x5a\x9e\xfb\x12\xc0\x60\x83\x7b\x2e\xac\xd9\xd6\x06\x1a\xba\x9a\xa7\x5b\xae\x89\xfc\x46\x9e\xfa\xbd\x22\xfb\xf4\x6b\xd7\xb6\xab\x03\x5f\x7f\xd1\x3c\xd7\xf0\x7c\xc7\x72\xcd\x97\x20\xf4\x2d\xd7\x0c\x90\xdf\x88\xe7\x6e\x31\x26\x50\x9b\xbe\x18\x91\x9b\xb4\xa5\x7a\xba\x05\x37\xe7\x0d\x60\x07\xf0\xa8\x19\xc7\x72\x5f\x1c\x18\x04\xc0\x8c\x05\x96\xc0\x77\x2d\xd7\x4c\x44\x7c\x6f\xf9\x12\x40\x2d\xf2\xad\x70\xbd\x01\x37\x8c\x5f\x5b\x05\x40\xe0\x6b\x93\x97\x19\x08\x27\xc8\x6f\x64\x16\xa9\xb6\xa5\x3d\x6f\x34\xa6\x81\x10\xd8\x9e\xf9\xeb\xcb\x17\xb1\xd3\x6c\x21\x95\x86\x28\x29\x48\xa5\x88\x48\x4a\xa5\xdb\xeb\x6e\x25\xff\x89\x66\xa6\x0f\x74\x38\xb1\x82\x50\x5d\x07\x70\xfe\xeb\xaa\x74\xa0\xcd\xe6\x91\xe7\x47\x4e\x70\x9b\x30\x74\x17\xb7\x48\xda\x50\x37\xa1\x7f\x8b\xe4\x86\xa7\x01\xe1\x8d\x92\x37\x88\xa9\x30\x08\x3d\xc3\x80\xbe\xe5\xea\x70\x75\x5d\x16\x68\x9a\x17\xb9\xa1\x0a\x6c\xe0\x6a\x30\xf8\xf5\x85\x97\x7b\x52\x07\xe9\xf1\x82\x2c\xa5\xa4\x9b\x0d\x79\x94\xa1\x5e\xcf\x5f\x23\x31\x7a\xa1\xd9\xe8\xf6\x3a\x7c\xa5\xd1\x4b\x5d\x74\x2c\xf8\x32\x9b\xc2\xf5\x2d\xf8\xe1\xea\x7d\xe8\xbd\xcc\x07\x50\x0d\x78\x03\xe7\xb4\xd8\xed\xd8\x7e\x14\x84\xb6\xe5\xc2\xe0\x1a\xf2\x5e\xe8\x66\xdc\x0d\x0b\x18\x47\x83\x2b\xb8\x07\xa1\xdb\x71\xf7\x26\x7f\x0d\x77\x2f\x74\x33\x6e\x22\x6f\xb9\x86\x77\x05\xf7\x20\x74\x33\xee\x2c\x52\x83\x48\xbd\x82\x99\x08\x7c\x04\xcf\xb6\x82\xc9\x3c\x82\xd1\x35\xcd\xa6\xc5\x6e\xc7\x86\xd0\xbf\xa6\xd6\xf8\xfc\xcd\x68\xb1\x1b\x5f\x83\x4b\x04\x6e\xc6\x4b\xa2\xd2\x04\x02\xfd\x3a\xec\x91\xdc\x1f\x46\xdf\x46\x4a\x38\x7f\xb9\xb1\x19\x15\xb8\x57\xc0\x55\xe0\xde\x4c\x78\x1b\xfd\xae\x71\xdd\x89\x7c\x14\x73\x93\x03\xbc\x0f\xbb\x91\xda\x22\xc7\xb2\xa7\xc0\x99\x21\xf7\xba\xec\x3e\x34\xbe\x27\x76\x08\x74\xef\x48\xee\x03\xd7\x75\xb9\x43\x20\x7a\x47\x6e\x1f\x58\xde\x95\xbb\x89\xdf\x21\xa0\x5c\x97\x4b\x82\xc4\xbb\x32\x7b\x97\x7f\x47\x72\xe3\xc7\xd7\x45\x12\xdf\xbc\x2e\x73\xe4\x0a\xd7\x45\x55\xe0\x5e\x17\xd8\x99\xea\x4d\x52\x1b\xcb\xdb\x0a\x4a\x4a\x4f\x6a\x74\x2b\xcd\x46\x5a\xd8\x9e\x99\xc1\xdc\xde\x4a\x74\x0b\x65\xa9\xce\x9f\x61\xfd\xfa\x92\xe4\xc6\x0d\xe0\xc0\x9f\xbb\xef\x90\xde\x7a\x06\x7f\x6e\x2f\xf9\x85\x74\xb5\x09\x74\xc0\x4f\xe4\xc7\x2f\xa4\xb9\x74\xa1\xff\x13\xf9\x11\xa7\xcc\x85\x8e\xc4\xf7\xa4\x1d\xf2\x0e\xef\xcb\x11\xe2\xf1\xc9\x2d\x70\xa1\x59\xaf\x4b\x8d\xde\x15\xe4\x44\x00\x69\x36\x8e\x01\x90\x4a\x17\x79\xda\xe5\xb7\xbb\xef\x82\x18\xe4\xe9\xb4\xe5\x5d\xf7\xb7\x6d\xee\x35\xf4\x6e\x7f\x8e\x74\xd9\x68\xf6\x4e\xf4\x89\x0c\x2b\xbd\xf2\x9e\x56\x3a\xa1\x3d\x6a\xfe\x80\x72\x42\xe4\x23\x9d\x3f\x03\x89\x15\xd0\x92\xf3\x33\x73\xb3\x8a\x99\xf9\x9e\x06\xf5\xc8\x07\x36\x62\x03\xd7\x8c\x80\x09\x63\x35\xdc\x98\x80\x6f\xc4\x74\x68\x80\xc8\x0e\x5f\x42\xa0\xda\x30\x98\x01\x0d\x6e\x56\x13\x4f\x27\x67\x97\x56\x38\x79\xf1\x2c\x3d\xb5\x40\x38\xea\x6c\xda\x20\xb7\xdd\x8c\x4d\xf7\xd0\xc9\x9d\x01\x64\x29\x3c\xb1\xf2\x74\xd0\xfd\xf6\x05\x41\x90\xdd\x37\x96\x8e\x68\x13\xe0\x03\x2d\x84\x3e\xb2\x00\xfe\xda\x72\xcd\x6f\x14\xfd\x3d\x1e\x9b\x46\x5f\x96\x9f\x63\xe9\xcd\x85\x2e\x70\x60\x86\x30\xcb\x66\x09\x2f\x80\x1d\x65\x49\x63\x18\x7e\x2a\x6e\x83\x20\x74\x3c\xdd\x32\x2c\xa8\x23\x96\x1b\x42\x13\xfa\x7b\x91\x2f\xdf\x4f\xc7\x7e\xef\xc5\x0f\xea\x22\xb8\x4b\x11\xdb\x85\x00\xa2\x5a\xa6\xe5\x86\x27\x27\x03\x38\x77\x23\x27\xfb\x9c\x1b\x39\x41\xa4\x42\x37\xf4\x37\x4b\xc1\xd3\x6e\x26\x32\x96\x6b\xd8\x60\xb3\x62\xd4\x61\x10\x66\xd3\x49\x04\x27\x9e\x03\x75\xcf\x01\x96\x9b\x21\x45\x92\xa7\xa4\xc3\x89\x0f\x83\x89\x67\xeb\x01\x12\xc2\xd5\x29\x33\xc3\x06\xe6\x25\x46\x57\xc7\x66\xab\x91\x68\xd3\xaa\x6d\x01\xd5\xb2\xad\x70\xd3\xb9\xa4\xff\x3b\x95\xd8\xf6\xb5\xd3\x96\xe9\x6e\x72\xa1\x0d\xad\xe4\x9b\x54\x36\xb0\x4f\x2d\xb6\x4a\x7f\x89\x97\xd5\x48\xa1\x2c\x15\x6a\xc8\xb7\x6f\xbb\xa1\xf8\xd7\x6f\x04\xfd\xfe\xfd\xca\xd5\xa7\x04\x4f\x71\xce\x3a\xf0\x1e\xe2\xd1\x58\x9e\xa0\x1d\x8f\xf3\x7b\x48\xe7\xea\x39\x81\xcb\xd0\x5f\x82\x79\xee\x18\x9b\xf9\xef\x5e\x9f\xd8\xa4\x8c\x89\x3b\xb8\x9e\x0e\xd3\xbe\x70\xe4\x03\xe7\x8d\x1e\xcf\xcf\xf7\x36\x7f\x9c\x18\x27\x44\xb6\xdf\x81\x60\x92\x22\x43\x9f\xd9\xf6\xcc\x87\x8b\x77\x85\xd4\x48\x9b\xc2\xd0\xb6\x82\xf0\x5d\xd1\x7d\xb6\xbd\x33\xf7\xe4\x6b\xcd\xf6\x02\x18\x5a\xce\x05\xcf\x8f\x03\x6b\x86\x6f\xa5\xc6\xfc\x38\xa9\xdf\xe3\x9d\x8c\xf7\xa1\x9d\x0b\xa6\x73\x69\x6d\x70\x0c\x73\xe8\xc5\x25\x6b\xd9\x26\x5f\xf7\x8e\xd8\x76\xe1\xf5\x6d\xef\xe4\xd0\xbf\x31\x82\x26\x3b\x2f\xfa\xa5\x08\x1a\x9b\x3b\x08\x02\x18\x66\xe9\x33\xf1\xd5\x8b\xa7\x81\xb3\x71\xab\x6c\xe8\x99\x6f\x69\xd0\xbd\x10\xc4\xe2\x93\x97\x22\x5c\x7c\x12\xd1\xbd\x48\xb5\xe1\xc6\xde\x34\x2b\xde\x91\xfc\xd4\x28\x9a\x1a\xe1\xed\x92\x35\xe9\xcb\xc9\xb8\x6e\x3b\x78\xc1\x36\xb6\x57\x6e\x35\x7c\x72\xe9\x4e\xef\x97\x0c\x22\x49\xd8\xef\xb5\x87\x64\x59\x9f\x98\x83\x35\xcb\x9a\xf8\xa9\x33\xcf\xf5\xfc\x70\xaf\x0d\x51\x2a\xf2\x7d\xb9\x87\xa0\xa7\xd3\x26\x5c\x85\x20\x0c\xa1\x33\x0b\x91\x8d\x5b\x04\x21\x70\x66\xc8\x26\x65\xf2\xa2\xe4\x1b\xe4\xcd\x73\xe1\xf9\x64\x6b\x00\xcb\x8e\xfc\xd4\x54\x7b\xa9\x85\x70\x3d\x83\xef\x0f\x4a\xb2\x2d\x91\xc2\x3d\x0f\xfb\xfb\x16\x2f\x8c\xce\x76\x67\xc3\xf3\x4f\x07\xf5\x5b\xac\x89\x7f\x21\xe8\x77\x84\x6f\x88\x48\xf2\xe7\xff\xfa\x8d\xd0\x14\x45\x50\xdf\x33\xc7\x2a\xbd\x0c\xbb\x7b\xc8\xd2\xbb\x3c\xe9\x98\x7b\x41\x1b\xc9\x46\xdb\xc6\xeb\x32\x09\x6d\xd6\x8e\x0f\x50\x09\x22\x75\x4b\xc2\x87\xc1\xd1\x04\x44\x64\x66\x8c\x3e\x04\x7b\x5f\x3a\xe7\x93\x5a\xf3\xde\xcb\x29\xb5\x59\x77\xc3\xcc\x98\x10\x9b\x07\xf0\xda\x0c\x73\xce\x33\xb5\x86\xbf\x97\xe7\x01\xe2\x76\x9e\x67\x93\xdc\xc9\x79\xe8\x2e\xa0\xed\xcd\xe0\x3b\x53\xda\xa1\xe9\x07\x26\xa2\xd4\x76\xc7\x03\x2a\xd8\xed\xd7\x7e\xbb\x65\x1c\x0e\x56\xf4\x9e\x22\xe6\x17\x26\x9a\x63\x25\xec\xf6\x81\x8f\x10\x4f\x15\x71\xd4\xda\x45\x65\x1c\xf6\x88\xee\x56\xc6\x61\x53\xfc\xdb\xc1\x6f\x8f\x17\x6f\x19\x3e\x75\xcd\xbb\x53\x3b\x5c\xf7\xb2\x4a\xdd\x02\xb8\x67\xd9\x15\xcf\xf8\x57\x22\xb5\x15\x04\x11\xf4\x6f\x87\xd2\x3c\x3d\x73\x75\x7a\xa6\x96\xd0\xb6\x1c\xeb\x42\x46\x71\x75\x2d\xf8\xdf\x5c\x55\xa5\xac\x33\x75\x57\xe5\xae\x55\x54\xfa\xfa\xcf\x5a\x47\xa5\x30\xef\x5f\xff\x5c\x43\x4d\x06\xed\x04\x69\x3b\x92\xff\xca\x76\xbc\xa3\xed\xde\xbb\x8d\x3c\x7d\x0f\x2d\x31\xf3\x70\x75\x14\x8a\x6f\x58\x6f\x9c\x1a\xe0\x2a\xbe\x4b\x79\xf1\xac\x36\x01\xae\x09\x33\x17\xf6\x69\xe5\xa4\x6f\xdb\xdd\x1f\xab\x0f\x7b\xe7\xf7\xab\xe8\x3f\xac\x1f\xd5\xd3\xd7\x59\xca\x09\x57\x3e\x0c\x22\x3b\x33\xba\x87\x2b\x07\xbe\xbb\x9e\x3b\xdc\x62\xbd\x5f\x9f\x27\xf7\x2d\xee\x55\xea\xc9\x1d\xe7\x6f\x37\x29\x6e\x7b\xd1\x35\xed\x6d\x45\xb2\x14\x71\x9b\xd9\x9d\xdc\xe1\xbe\x47\x51\xe2\x66\x65\x6d\x78\xfe\x3b\x9b\xa1\x88\xc8\xf7\xf8\x77\x74\x76\x1d\x32\xf8\x30\x5e\xa5\xd1\x95\x3a\x3d\xa4\xd2\xe8\x35\x0f\x9b\x8a\x03\x5e\xee\x4b\x5d\xe4\xdb\x53\x49\xe8\xb4\x46\xe5\x8a\x8c\x17\x2a\x44\xb1\xd1\x26\x05\x45\x2e\xd6\x1b\xa2\x5c\xac\xf6\x1b\xad\x3e\x5e\x1e\x11\xe3\x7a\xb1\x5b\x6e\x36\xfa\x05\xa9\xc9\x77\x87\x4c\xbb\xc0\x34\x15\xbc\xfc\xf4\x8c\x70\xc9\xc1\x6c\xff\x67\x51\xf4\x19\xc1\x9f\x11\xf4\x39\xd1\x32\xf2\xf4\xf4\x8c\x3c\xf1\x6d\x9e\xe7\xf9\xdf\xbf\x9f\xe2\x13\xf8\xee\xdc\xe1\xdf\xef\xbf\xde\x63\x58\xc0\x89\x76\x11\x2f\xf7\x25\x0a\xe7\xeb\x4a\xbf\xd8\x2f\x13\xfc\xa8\xca\x2b\x4a\x49\x51\x06\xf8\xa0\xac\x8c\x46\x1d\x5a\x1a\x29\x52\xaf\x55\x13\x95\x71\x97\x1f\xd2\x8c\xd2\x24\x9f\x9e\x11\x0c\xdd\x1f\xcf\x08\x4b\xb1\x1c\x47\x90\x14\xf7\x47\x38\x2a\xb5\x12\xdd\x69\x90\xcd\x46\x45\x6a\x15\xea\x8d\xa2\xc0\x10\x38\x4f\x12\xf4\x98\x6a\x35\xc4\x6e\x47\x2e\x0d\x6b\x4c\x49\x90\x0b\xf5\xb6\x5c\x29\x36\xc9\x2e\x23\x8d\x86\x83\xfe\x41\x8b\xdc\x11\x45\xe2\x19\xc1\xae\x50\x24\x32\x29\x5e\x30\x9c\xd3\x0d\xb7\x07\x6c\xf0\xf2\x36\xda\x47\x0d\xf1\x78\x2b\x6d\xaf\x47\x9a\xd0\x39\xd6\xa0\x08\x1a\x42\x9a\xd5\x31\x15\x67\x54\x4a\x65\x39\x03\x27\x80\x41\x11\x18\xa6\x32\x14\xcd\x01\x9c\x34\x80\x81\x91\x28\x01\x74\x54\xa5\x70\x95\x26\x08\x15\x65\x54\xc8\x71\x1b\x55\xa1\x0f\x1e\x1b\x0c\x8a\xc1\x01\x0e\x09\xdc\x30\x70\x92\x05\x28\xa3\xa2\x90\x41\x0d\x1d\x33\x68\x9d\xc0\x58\x0d\x33\x80\xa6\xe3\xa8\x4a\x6b\x1a\xca\x6a\x04\xa1\x53\x0c\x43\xe1\x14\xc7\xd2\x2c\x86\x53\x00\xa3\x9f\xe2\xf1\x43\x37\x03\xf7\x3f\xf6\x10\x94\x9a\x45\xae\xf3\xeb\x6e\x4d\x60\x44\x57\xe4\xca\x38\xba\x7a\x15\x72\x01\x6a\x86\xc1\xb2\xb2\x7c\xc3\x14\xbd\x3b\x1c\x01\xa1\x0a\x8a\xe6\x46\x5e\x6a\x90\x32\x78\x9b\xe1\xed\x77\x91\xc7\xbc\x82\x91\xb1\x98\x30\xfd\x0f\x74\xe4\x53\x8f\xa7\x13\x5f\xbf\x60\xa8\x1c\xab\xa9\x38\x34\x34\x03\xc7\xa0\x0a\x21\xca\x90\x18\x4a\xa8\x38\xcb\x69\x3a\x64\x49\x95\xc3\x34\x94\xd4\x50\x02\x60\x14\x47\x12\x3a\xa6\x41\x92\xa6\x09\x8a\x43\x69\x5a\x27\x68\x03\x67\x37\x46\xf6\x19\xc6\x4e\x73\x2a\x8e\xe3\x34\x84\x38\x49\x90\x0c\xc9\xb0\x00\x63\x30\x8d\x24\x35\x96\x61\x58\x9d\x34\x08\x92\xa3\x0c\x15\x90\x1c\x00\xac\x4e\xd0\x28\xc1\x02\x02\x42\x9a\x21\x29\x55\x37\x08\x55\x7d\x8a\xe3\x1d\x46\x51\x1c\xc5\x70\x0c\xc1\x6d\x2d\xb6\x80\xb7\xc6\xaf\x58\x23\xa2\x3c\x54\xad\x32\x43\xd2\x5d\x37\x17\xfd\x55\x89\x18\xcc\xbc\x69\x6e\x51\xe4\x9b\x61\x01\xab\xe1\x75\x46\x60\xe8\x71\x44\x95\x39\xad\xac\xa3\x73\x3e\x18\xbf\x72\x6d\x7a\xc4\xae\x2b\x15\x8d\x8e\xc2\xa9\x91\x2f\x34\x73\xb2\x93\x47\x6b\x6a\x60\xf8\x6f\xad\x7e\xac\x61\xa5\x35\xa8\x0f\x97\x9b\x4f\x95\xfd\x3f\x49\x78\x0b\x0e\x7f\x2f\xf9\x56\x7b\x6b\x3b\x2d\xb4\xf5\xda\x25\x3a\x06\x33\x09\xd8\xd5\xa0\x22\x98\xb8\xc9\xae\x6a\x8b\x79\xb3\x99\x77\xf3\x66\x5e\x59\x9a\xad\x4e\xbe\x2c\x30\x73\xc8\xcd\x02\xab\x1a\x91\xd3\x46\xb9\x43\x7a\x4a\x59\xea\x55\x74\x12\x6b\x35\xaa\x0a\x33\xab\xce\x3d\x14\xe7\x49\x2f\x47\xb9\x1d\x95\x78\x8b\x92\xf6\x33\x2c\x5a\xac\x64\x59\xc5\xce\xa2\x45\xb4\xfa\x07\x6d\xef\xcf\x1c\x37\x5a\x34\xa1\x63\x14\x8b\x1b\x34\x45\x11\x00\x45\x71\x8e\x26\x39\x42\x57\x01\xad\xaa\x84\x4e\xd2\x84\x86\x42\x95\xd1\x48\x8c\xd1\x81\x81\x6a\x0c\xce\x10\x1c\x66\x68\x06\x4b\xe0\x06\x34\x54\x94\x82\x1b\x6b\xfc\x0c\xaf\xe0\x50\x1d\xd5\x09\x43\xa5\x39\x4a\x65\x20\x4a\xa8\x94\x86\xeb\x90\x61\x31\xc8\x00\x96\x25\x38\x0d\x63\x55\x5c\x27\x35\x06\x23\x0c\x15\x87\x38\x63\xe0\xac\xce\x01\x8e\xc3\x59\x1a\xe5\x68\xe2\x29\x9e\x1e\x77\x16\x4d\xee\x62\x70\x81\x7a\x95\xe5\xc5\xdb\xba\xec\x33\xa6\x2e\xf0\x4c\xad\xfa\x06\x27\xf2\x54\x13\xea\x3c\x5d\x1c\xb7\xb9\x72\xb3\xe3\x34\xc6\x82\x83\xe2\xac\x67\xf8\xdd\x05\xae\x05\x1c\xdd\x65\xfa\x66\x99\x9b\x94\x0a\x0a\xbe\xc4\xc3\x6a\x44\xe7\x89\xc6\x8c\xe3\x5e\xbb\xc3\xc9\xba\xb2\xe6\x57\x3e\x1b\x6b\x78\x63\xd1\x4a\x4a\xe3\xb2\x5c\x6b\xa9\x75\xef\xb5\x9c\xeb\x74\x72\xbd\xae\x20\xd6\x4a\x42\x3e\x8c\x8c\x32\xee\xc8\x18\xae\x69\x85\xb2\x8f\x55\x5d\x9c\x59\xb7\x0a\x6d\xb4\xd1\x62\xc0\x20\xcc\xf1\x8c\x52\x20\x5c\x13\x42\xcf\xa4\x96\xa3\x20\xec\x95\xa5\x7c\x10\x55\xf3\xb5\x86\x33\x9b\x7a\xa3\xea\x28\xb6\xd8\x7a\x86\xc5\x4a\x41\xd6\xa8\xff\xff\x6e\xb1\x17\x32\x90\x8c\xfb\x41\x0f\xe4\x33\xe7\x37\x13\x1e\x01\xbb\xb4\xdb\xfd\x18\xe6\xe9\x86\xf5\x03\x68\x17\xb6\x9b\x1f\x40\xbc\xb0\x31\xfc\xd1\x6c\x30\xb5\x39\x7c\x48\xa9\xf9\x92\xc8\x37\xeb\x4a\x45\x29\x52\x7d\x92\xe9\xca\x42\x81\xaa\x0b\xe5\x46\xbb\x26\x2b\xe4\xa0\xaa\x34\x79\x9c\x91\xbb\x3c\x51\x28\x0b\x0a\xdf\x25\x84\x62\xbb\xd7\x25\xc8\x61\x31\x99\xd1\xb6\x79\xd7\x72\xd9\x1c\xeb\xc5\x35\x37\x7b\x63\xed\x49\x11\x33\x7b\xa1\x39\xd3\x73\x83\x9e\xbe\x6c\x18\x4a\xa5\xb4\x2a\x8b\x9a\x14\x4e\xe4\x82\x16\x1e\xac\x2f\x9e\x00\x0a\xf1\xc7\x8d\x9b\x49\x16\x33\x35\xb0\xa5\x4e\x74\xbd\xc2\xca\x69\x61\xe2\xec\xf5\xad\x62\x4e\xde\xe6\x34\xde\xc9\xb3\x15\x86\x8c\xd4\x7c\x7b\x16\xad\x72\x8b\x3a\x97\xe4\x3c\x1a\xd7\x5f\xa9\xf1\xf5\xe6\xfe\x1f\x21\x06\x5d\xee\xff\x16\x79\x9e\x2b\xa4\xbc\x58\xe8\xe8\xed\x61\x53\x19\x89\x72\x57\x5d\xd2\xc5\x7c\x05\xac\xa1\x8d\x36\x49\x7d\x60\x4b\x75\xd9\x19\x98\x7a\xe7\x55\x22\xc3\xf6\xbc\x34\xaa\xc4\x70\x56\x11\x14\x6b\xd4\x50\xe8\x47\x75\x08\x46\x58\xd3\x68\x77\xb8\x49\x13\x5d\x93\x4c\xa8\xae\x67\xf3\x65\x65\x81\x86\x2a\x3a\x1b\x09\x06\xbe\xe8\x98\xdc\x88\x11\xd7\x34\xaf\x4e\xdc\xf1\x92\x8b\xaa\x20\xc0\x4c\x52\x5e\x82\x3e\x45\x35\x0b\xf5\xa1\x36\x6e\x2f\xc7\xa1\x19\x89\x9b\x05\xc6\xc9\x6c\xf1\xc9\x43\x43\x3c\x34\x34\xf5\xe3\xa1\x11\x85\x5c\x58\xcb\x8f\xd7\x6f\xc4\x4c\x0e\xbb\xbc\x81\x4b\xa3\xaa\xa1\x8a\x00\x75\x18\x3f\xaf\xe1\x2e\x81\x37\xaa\xa0\x5c\x79\xad\x88\xa5\xc5\x72\x3f\x34\xda\x49\xb4\xf9\xb0\xea\x6d\xbe\xc5\x79\xdc\x2b\x3b\x9f\xb2\x43\x52\x6a\x79\xec\x30\x2f\x95\x17\x40\x1a\xf2\x05\x49\x52\xa2\x96\xd8\x37\x8b\x84\xa0\xe6\x8a\xe2\x62\xbc\x6c\x16\x6d\xce\xe2\x75\x30\xcf\xf1\x35\xce\xa2\xbb\x85\xa1\x43\x0f\x0b\x58\x99\x2f\x73\xdd\xb7\x06\x56\xf6\x18\xd1\x8c\xac\x0e\xbf\x4c\x54\x7f\xd9\xcf\xb2\xee\x3e\xdc\xe1\x67\xbb\x3b\x10\xfb\xc1\x24\x29\x9d\xc4\x68\x82\x63\x68\x94\xc0\x75\x9c\x36\x50\xc8\x52\x86\xc6\xd2\x2a\xce\x00\x4a\x47\x21\xc4\x74\x8a\xa6\x30\x54\xc3\x21\x4d\xd1\x28\x43\x61\xac\x46\x42\x5c\x27\x71\x80\x71\x2c\x9e\x1e\xd4\xd8\xa0\xa5\xf8\xa3\x28\xf2\x94\x8d\x2a\x32\xee\xb6\xd6\x43\x49\x19\x0a\x4d\xbc\x60\x13\xd4\xa0\x41\xf0\x18\xa7\x99\xaa\xa4\x35\x96\x5d\x5c\x0a\xaa\x6b\xf4\xbd\x98\x7f\xe1\x6e\xc3\x87\x3b\x7f\xb8\xe3\xb0\xef\xfc\xee\x27\x3e\xc9\xf3\x83\xc8\xd9\xb1\x49\x48\x30\xf4\xcc\x27\x32\x90\x5c\x18\x2e\x3d\x7f\x3a\x03\x41\x30\x9b\xf8\x20\x80\x19\x48\x3d\x18\x84\x48\x57\x2c\x22\x8d\x44\x18\xf9\x85\x74\xe1\x2c\x84\x8e\x0a\x7d\x04\x47\x31\xea\x96\x86\x0c\xcf\xd7\x60\xa0\xcd\x3c\xd7\x85\xab\xd0\x06\x91\xab\x4d\x4e\x1b\x8a\x9f\xcf\xbb\x05\x2c\xc9\x05\xb7\xfb\x5f\x41\x76\xff\xff\x6f\xbc\x5d\xf6\x35\xb4\x1c\xf8\xf5\x27\x82\x26\xbb\x67\x5f\xb7\x3f\x78\xfa\xfa\x13\x49\xce\xc7\x5f\x4e\x40\xf0\xf5\x67\xf2\x74\x60\xfc\xe5\xbf\xb7\xc2\x06\x84\xb7\x09\x3a\x60\x15\xae\x02\xeb\xed\x46\x71\x1f\x06\xd0\x5f\xbc\x27\xfc\xe5\xdf\x37\xa9\x02\x04\x61\xfc\x58\x8b\xbe\xbd\xbd\x9c\xa1\x8a\x87\x73\xe4\x1b\x78\x6c\xa3\x2d\xf0\xb5\x89\xb5\xd8\x9e\xbc\x30\x24\x87\x31\xc0\xb6\x0a\x89\xd5\xe1\x7f\xfd\x89\x7c\x5d\x60\xd8\x3f\xd8\x3f\xe8\xd7\xed\x09\x2d\xf2\x7d\xe8\x86\x72\xdc\xb5\xaf\x3f\x11\xe2\xf8\x7b\x21\x7e\xf2\x68\xa3\xb7\xff\xbd\x57\xe4\x41\xa5\x7b\xc9\x0d\x30\x05\x39\x95\xd6\x0c\x8e\xd0\x08\x9d\x61\x08\x12\x65\x0c\x54\xd5\x09\x86\xa0\x20\xab\xa3\x38\x00\x04\x50\x49\x48\x43\x1a\x90\x1a\x8d\x19\x28\x86\xd3\x28\xca\x42\x52\x63\x34\x83\x51\x8d\x1d\xa3\x3d\xee\xc6\x8a\x8f\x06\x70\x7f\x26\xee\xfb\xc6\xe4\x8e\x4e\xfd\xfb\xe4\xfa\xc0\x05\xb3\x0d\x2f\x68\x10\x18\xc0\x51\x40\x70\x2c\x84\x0c\xa1\x41\x1c\xc7\x19\x0a\x02\x16\x63\x18\x86\xa5\x55\xa0\x51\x24\x4d\xd1\x06\x41\xe8\x9a\x46\x1a\x84\x01\x35\x1a\xd5\x29\x4a\xd7\x0d\x6c\xb3\x12\xff\xfa\x25\xa3\x85\x0b\x3a\x78\x74\x8b\xe9\xe3\x3a\xc0\x9e\xcf\xcf\x79\x51\x38\x8b\xc2\xcf\xed\xfb\x35\x0d\x3f\xdc\xeb\xff\xd1\x1a\xbe\xcd\xca\xfe\xea\xe0\xaf\x0e\xfe\xea\xe0\xaf\x0e\xfe\xea\xe0\xaf\x0e\xfe\xea\xe0\xaf\x0e\xfe\xa0\x0e\xe2\x4f\xff\xe7\xf6\xc5\x4b\xa0\xcd\xe2\xe7\xfb\xb3\x8e\xa7\xdd\x0a\xdd\x4c\xf6\x51\xea\xa2\xa3\x74\xb4\x05\xd0\xf2\xd5\x51\x47\x1f\x49\xcc\xa8\xa6\x18\x76\x9f\xd0\x44\x05\x5b\x0b\x41\x67\x49\x08\xf2\xa8\xbb\x74\xe5\xc3\x16\x95\x18\xff\x8b\x2a\xfd\xe2\xab\x8d\xf3\x6b\xd4\x61\x9b\x13\x63\x5d\x0a\xdc\x99\x2e\x46\xe5\xc1\xb8\x23\x16\x28\x7b\x54\xee\x8f\x56\x4d\xb9\x5f\x9b\x38\x87\x6d\x9a\xea\xe4\xc1\x6d\x9a\x7b\x76\x14\x04\x9e\x1b\xe6\x2a\xa4\x3e\x9c\x8b\x8c\x3e\x76\x5f\x67\x39\xb7\x97\x6f\xac\xfb\x36\x5a\x57\xc2\xca\x70\x92\xaf\xcb\xc5\x6a\x24\x2e\xa6\x18\x56\x1c\xfa\xb3\xe1\x78\x00\x57\x6a\xde\x2f\xf2\xc0\x16\xab\x76\xce\x0b\x6b\x1e\x98\x47\x53\x5c\x9c\x46\xd8\xc0\xee\x9a\x62\x34\xe3\x59\x59\x30\x77\x7c\x0a\xa3\x07\xef\x12\x08\xf7\x6c\x83\xb5\x5b\x83\x85\xd5\x2c\x0f\xe6\x66\x8e\x18\x8e\x49\xda\x98\xa1\xf9\x37\xcd\xae\xea\x62\x91\xe9\x16\x3d\xe3\xad\xb0\xea\xaa\x26\x43\x35\xf4\xce\x60\x4e\x0f\x9c\x81\x12\x0c\xf3\xf4\xaa\x5d\x9a\xb5\xd7\x63\x63\x2e\x77\xe7\xa5\xb9\x3f\x6b\x98\x94\x1c\x0e\xc6\x7d\x8f\x67\xe6\xed\x56\x61\x39\x8a\xe9\x50\x85\x3a\x21\xab\x1c\x21\xb7\x5e\xf1\xa8\xef\xbd\x16\x73\xd3\xd9\x94\x30\xbc\x0e\xf4\x4b\x35\x43\x15\xcd\xaa\x61\x59\x23\x47\xb0\x6d\xd9\xb2\x1b\x43\xa3\x5a\xf7\x83\xbe\x57\x03\x05\x11\x36\x9b\x8a\x1d\x96\xac\x5a\x7e\x69\x0e\x0a\x18\x17\xf5\xad\x05\x63\xb1\xb0\x5a\x78\xd8\xde\xf6\xfa\xe6\x97\x8f\xde\x95\x89\x8f\xfe\xc7\xec\xb7\x5d\x6d\x8b\x79\xd0\x1a\xe5\x6b\xb3\x56\x31\x12\x44\xba\x55\x5c\xac\x04\x06\x9f\x14\x4d\x7e\x22\x14\x99\xd7\x25\x56\x11\xf4\xe5\x30\x3f\x69\x33\xb8\x26\x4e\xc6\xc6\xc8\x2c\x0f\xe7\x0b\xb3\xb0\x18\x45\x53\xd3\x9e\x45\xb6\x19\x76\x96\x42\xbe\x1f\xbc\xe9\x1d\xba\xb9\x24\x65\x6f\xda\x8e\xb7\x31\x05\xa7\x1e\x44\xf9\x56\x05\x2e\x22\x01\x95\xc4\xc0\x73\x1b\xb4\x14\x75\x96\xd2\x52\xf4\x06\xb6\x88\x6a\x54\x69\x84\x4d\x4b\x6a\x4f\x5d\x1f\x76\x90\xf9\x1a\xfd\x0a\x2d\xe2\xd5\xf1\x2a\x6c\xaf\x64\x8b\x79\x68\x6a\x04\xd3\x52\xc2\x72\xad\xf6\x36\x1c\xb0\xcb\x81\x35\x16\x40\x21\xa2\x64\x2a\x6e\x64\x7c\xd8\xd1\x16\x4e\xb7\x3d\x0f\x1f\x47\xf1\xdf\x83\x41\x23\x71\x34\xbe\x80\x45\x82\x5e\xf6\x7a\x91\x59\x5f\xb4\x43\x91\x11\x26\x15\x99\x68\x40\x4e\x1f\xb4\x8c\x52\x25\x57\xb5\xa8\xea\xa2\xdf\xcc\x8d\xf9\x90\x21\xf2\xfb\xe3\x80\x57\xda\xb7\xdf\x16\xb8\xa9\x53\x1b\xe2\x73\x62\xc1\xb4\x8d\x35\xdb\xaa\xc3\xa9\xa4\x62\xbd\x5e\x85\xb2\x56\xf3\x69\x05\x15\x3c\x53\xf1\x9b\x21\x63\x36\x31\x1a\x6f\xab\xd3\x09\xae\x77\x7b\x7d\x03\x8a\xde\x42\x43\x5b\x3c\x30\x26\xa2\xb2\x0a\x27\x03\xde\x0e\xe4\xe8\xd5\x16\x9c\xf5\xab\xb0\xe5\xfb\x07\x77\x1c\x2f\x3c\x49\xfc\xd1\x1d\xc7\xd4\xd3\xc4\x9f\xf1\xa4\x10\xf6\x8c\x3c\xf2\x30\xd4\x53\xbf\x2b\x3e\x3d\x23\x1c\x8e\x13\x04\x83\xa3\x04\xcd\x52\x24\xc3\x50\x2c\xca\xc4\x4f\xaa\x60\x27\x8f\x15\x5d\xd1\xce\xa5\x87\x50\x3f\xac\x9f\xf4\x83\xa8\x87\x3d\x59\x95\xe0\x58\xa8\x92\x00\xb2\x1c\x43\xd1\x04\x4e\xd1\x24\xa1\x01\x1d\xc7\x34\x8e\x84\x18\xa1\x1a\x1a\xca\x90\x2a\x81\x13\x10\xb2\x04\xc4\x48\x4c\x35\x18\x14\x03\x94\xce\xa1\xa4\x81\xed\x1e\x69\x38\x9a\xf1\xea\x27\x16\x2f\x58\x79\x01\x95\xd1\x6a\x69\x1d\x4e\x96\x0d\xcc\x1e\xa1\x60\x3d\xf3\x30\xae\x51\x5e\x2d\xe4\xc2\xba\x49\x85\x82\xa4\x15\x06\x8b\x65\x91\x5b\x12\x66\xe8\x37\xdd\xf1\x69\x24\xc9\x3a\x2e\x3e\x1a\x13\x5b\x68\xe1\x91\xf6\x47\xf9\xdc\xd9\x8c\x78\x5b\xfb\xe7\xf7\x74\xb2\xf5\x6e\x70\x8c\x06\x0c\x03\xa8\xac\x86\xd1\x28\x4e\x00\x82\x61\x59\x12\xa3\x29\x4d\x45\x55\xc2\x30\x30\x00\x70\x1d\x18\x24\x8a\xa2\x06\x34\x48\x4e\xc7\x31\x68\x68\x2c\xc9\xe8\xba\x6a\xa8\x10\x24\x7a\xc7\xcf\xf5\xfe\x5f\xea\xf7\x67\xe9\x9d\x25\x0f\xd7\x67\x3e\x1c\xf2\xa0\xde\x55\x9d\x64\x69\x5d\xd5\x75\x14\xd7\x49\x1a\x65\x31\x86\x66\x30\x8d\x04\x14\x60\x20\xa7\xd3\x90\xa5\x29\x0d\xe0\x9c\xa6\x92\x18\xa4\x71\x9d\x01\xc0\x60\x50\x80\x1b\x10\x52\x2a\x41\xeb\x70\xfb\xc0\xc3\x55\xbd\x17\x22\x8f\xf0\x42\x92\x9a\x17\x5a\xd2\x6a\xd6\xce\x13\x5e\xb9\x91\x7b\xc3\x98\xce\xda\x0a\x30\xdb\xa8\x17\x47\x4e\x7b\x68\xfa\x51\x37\xd7\x8b\xe5\xab\xfd\x42\x6e\xdb\x29\xf3\x92\x6e\xdf\xd5\xbb\xf8\x58\xfb\x4d\xed\xbe\xf6\xaf\xde\x48\xcb\x7e\x34\xfc\xe3\x81\xeb\x4f\x47\xad\x92\xcc\x96\xdb\x8b\xf6\x54\xad\xe1\x65\x9e\x18\x0e\x5e\x3b\x7e\xcd\x79\x55\x50\xd4\x28\xb1\x81\x5c\x61\x1c\x54\xea\x2c\xab\xc3\x3c\xaf\x10\xfc\x7e\x9e\x8f\x8f\x2b\xf3\x7c\x72\x84\xaa\xa9\x74\x68\x89\xf1\x44\x19\x95\xdb\xb9\xe5\xa8\x5b\xe0\xde\x94\x85\x32\xe8\x11\x2b\xab\x65\x8d\xa2\xae\x8a\x89\x0b\xa7\x2d\xc3\x38\x8f\x2a\x0c\xf8\x45\xfa\x29\x3e\x21\xf1\x8e\x78\x90\x47\xaf\x6d\xad\xd5\xc3\x4b\xd4\x64\xee\x0a\x8e\x59\x2a\x41\x93\xab\xb2\x36\xa9\x61\x92\xdb\xb7\x57\x53\x5b\xb2\xcb\x5c\x30\x1f\xfb\x28\xc7\x60\x45\xba\x29\x0f\x0d\x98\x77\xc8\xe9\xac\x18\x56\x72\x41\x05\xb5\xb0\xb9\x6c\x85\x14\x8f\x56\xd7\x43\x57\x9d\x8c\xe4\x21\xe5\x6d\xe6\xa8\x27\xfc\xcd\x69\x86\x35\xba\xaa\x0f\xeb\xf6\x58\x5c\x87\x15\xcd\x6e\x4a\x4c\x9e\xd7\xe5\xfa\x2b\xe3\xb5\x26\x6d\x95\x5b\x96\x6c\xbc\xdd\x5b\x1d\x1e\x7e\xb9\xa2\x83\x83\x65\x1c\xdd\xa9\x4c\xc9\x26\x4f\xd7\xf0\xff\xbd\x68\xc1\x7f\x42\xb4\x2a\xf6\x86\x42\xf0\x40\xfb\xfc\x49\xfb\x1f\xc8\x03\x63\xfd\x3d\x12\x35\xb2\xa2\xe5\x9f\x9e\xa2\xee\x77\xb2\xc2\x09\xfb\x33\x83\xf3\xe7\x0d\x5a\x86\x4d\x60\xbe\xae\xea\xa0\xdf\xe2\x68\xe1\xcd\x08\x38\x88\x6a\x9e\xdf\x18\x2b\x6f\xc2\xb0\x3a\x2d\x7a\x35\x66\xba\x98\xc6\x9a\xbb\xe2\x64\x82\x53\x9b\x75\xcd\x85\xbf\xac\x35\x71\x54\x29\x34\x8d\x91\xa1\x04\x25\x49\xea\x87\xcb\x11\x00\x92\x31\xef\x46\xf4\xda\xa9\x3a\xb6\xe8\x80\x5c\x45\xa1\x2b\x4c\xc5\x34\xd5\xfe\xb8\xee\x69\x6d\x7d\xcc\x91\x95\x3a\x6f\xd4\xf4\x36\xdf\x98\x2b\x6a\xa5\xc9\xac\x83\x25\x84\xf5\xc2\xc6\x11\x72\xca\x7a\x91\xf3\x5f\x85\x51\xa1\xf9\x0a\x2b\xed\xa1\x22\x17\xde\xf2\xab\xb9\x85\x2f\xda\xbc\x98\xe3\xaa\xe8\x84\x61\x27\x65\x42\xcd\xe5\xbc\x3d\xb1\xff\xbe\x93\x3d\x6a\xe4\x0f\x3a\xd9\x9c\xc9\xf7\x44\xed\x33\x9d\xec\x3f\x38\x35\xdf\xe4\x64\x9f\x9c\x8f\xfc\x5d\xb1\x6e\x56\xac\xb1\x53\x2c\xfa\x93\x70\xa1\xf3\x61\xc7\x34\x95\xf1\x6a\x55\x1b\xba\xb4\xae\x7a\x63\xcd\x9b\xad\xd1\xb2\x23\x2b\xf3\x85\x56\x93\x73\x94\xda\x08\x0f\xf6\x95\xed\x70\xa3\xe3\x41\x3d\x72\xb8\x58\x77\x49\xee\xb5\x3c\x48\xdd\x11\x90\x5e\xdd\xc3\x58\x5c\x38\x2e\xe4\xe3\x47\x0e\xff\x29\xed\x5f\x08\x36\xb7\xb4\x5f\xe7\x3f\x37\x17\xbd\x6b\x0d\xf2\xd9\xed\x9f\xeb\xe3\x7a\xc0\x11\x0f\x32\x1f\x6d\xbf\x38\xe8\xa3\x5b\x70\x79\x48\x16\x51\x38\x69\xd2\xfc\x9a\x2b\xa0\xad\xa0\x24\x99\x0b\x0d\x63\x30\xac\xcf\xb1\xa3\x57\xd2\x91\xa7\x0e\xd7\x66\xa8\x69\x81\x58\xa4\x86\xe2\xe0\x70\xcb\x53\xfd\x5d\xcd\xd5\xaf\xfc\xec\xf0\xa3\x09\xfb\xc9\x4f\x0f\x77\xb1\x2e\x9d\x71\x27\xbf\x40\x38\xf8\x52\x46\xb0\xbc\x8c\xb2\x4f\x29\x92\xdf\x2d\x9c\xa1\x5c\x2c\x95\x76\x5e\x41\x72\x5f\x22\x6e\xf7\xf3\xc4\x77\xba\x99\x2e\x65\x19\x17\xb0\x4c\x21\xc6\xb7\x10\x78\x51\xcc\x28\xea\xb4\x6f\x10\x69\x75\x2a\x75\xbe\x33\x42\x6a\xd2\x08\xf9\xb6\xff\xbd\xfb\xf3\xbe\x98\xda\xc5\xd2\x66\x27\x45\x35\x3f\x8b\x78\x70\x85\x75\x70\x8d\x72\x56\xa9\xa9\x43\x1d\xd1\x87\xe9\xa9\xc0\xcd\x62\xb6\x6b\xe0\x98\x54\x52\xdd\xe2\x7a\x1d\xaa\xab\x05\x54\x1f\xa6\x7b\x04\x9e\x45\xfc\x4a\xeb\x48\xbf\x51\x69\xf7\x25\xe4\xf0\x93\xd7\x0f\xf5\xe4\x73\xf4\xfd\xc1\x0e\x9c\x8f\xc1\xa1\x34\xd7\x85\xb2\x52\x47\x65\x77\x1f\xe6\x9b\x80\x65\x11\x4d\x35\x73\xcc\x70\x5b\xec\x28\xbb\xc8\x51\xba\xc6\xf0\xc3\xe4\x62\xac\x2c\x6e\x87\x46\x8e\xa9\x59\xb3\xe7\xb8\xf4\xd1\xd5\xa2\x3e\x19\xb5\x95\x1f\x67\x9a\x82\xcc\x24\x7c\xda\x64\xd6\xa0\x5f\xa8\xfc\x73\x54\x61\xfa\x33\x98\x06\x91\x7a\x81\xe3\xae\x99\x63\x76\x71\xd1\xa0\x2b\x65\x80\xce\xca\x6a\x3f\x4c\xf2\x00\x98\x45\xf4\xa4\xb9\x9b\x62\x58\xea\x21\xf2\xd3\xe2\xe2\x0f\xb3\x3d\x00\x66\xb1\x3d\x69\xee\x98\xed\xae\x98\xce\x95\x62\x35\x67\x45\xd6\x1f\xe7\xbb\x07\xcc\xe4\x7b\xdc\xdc\x31\xdf\x7d\xbd\x9b\x2b\x75\x6c\xce\xaa\xcd\x3f\x4c\xf8\x00\x98\x45\xf8\xa4\xb9\x8b\xa9\x41\x52\xc7\xe6\xf9\x50\xa4\xe6\x6a\xa1\x92\x8c\x6a\xfc\x8f\xf7\x23\x05\x99\xd9\x93\xd3\x26\xb3\xa2\x44\x00\xe7\xcf\xbb\xca\x1c\x97\x8b\x88\x9c\xbe\xa5\xe0\x13\xb8\x5f\x25\xfe\x10\xeb\x93\x14\x35\xeb\xdd\x0d\x0f\xf3\x3f\x06\xcd\xea\x44\x46\xb3\x17\x7b\x92\x2e\xf0\x71\x29\xd5\xdc\xbf\xd7\x62\xcb\x3d\x7e\x0b\xc6\x6d\xa5\x47\x92\x17\x66\x9c\xe0\x20\xcd\xc6\x21\x8b\xed\x77\x2b\x8d\x12\xa2\x86\x3e\x84\xc8\xae\xce\xd0\x77\x64\x58\x96\x3a\x12\x92\xae\x3b\x74\x28\x26\x71\x9e\x68\x1e\xbf\xaa\xe3\x5e\x96\xc7\x30\x1b\x92\xdb\x3c\xe5\x88\x62\xba\xf8\xe4\x73\xba\xd4\xe4\x73\x52\x02\xf2\x8c\xdd\xe1\x7d\x23\xf7\x12\xdb\x23\x6c\x38\x1d\x1c\xe3\x88\xd6\xe5\x54\xf1\xe8\xcd\x28\x8f\x50\xd8\x81\x24\x2c\x52\x01\xe6\x46\x22\x47\x2f\x73\xb9\x97\x48\x1a\x64\x43\xe4\x38\x11\xbe\x91\xc9\xd1\x0b\x68\xee\x65\x92\x06\xd9\x30\x49\xfd\x54\xef\x76\x1a\x47\x2f\xcd\x79\x80\x49\x1a\x67\x4b\x66\x97\x25\x1c\x93\x49\x17\x98\xbb\x16\xbe\x1e\x63\x74\x0a\xb4\xa1\x74\x12\x1b\xdf\xd5\xd1\xa5\x77\x45\x21\x9a\xe7\xcc\x6c\x18\xc2\xb8\xd9\xff\x17\x00\x00\xff\xff\x05\x91\xe3\x65\x58\x6a\x00\x00") - -func asset_stat_trustlines_1CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_1CoreSql, - "asset_stat_trustlines_1-core.sql", - ) -} - -func asset_stat_trustlines_1CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_1CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_1-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0x1a, 0xe2, 0xd0, 0x43, 0xb2, 0xba, 0x66, 0x56, 0xad, 0xec, 0xc, 0x15, 0x96, 0x2a, 0xa2, 0x14, 0xcd, 0x99, 0xc7, 0xd9, 0x61, 0xfb, 0xea, 0x83, 0x4f, 0x34, 0xfb, 0xe6, 0x90, 0x40, 0x97}} - return a, nil -} - -var _asset_stat_trustlines_1HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x79\x6f\xe2\xc8\xf3\xf7\xff\xf3\x2a\xac\xd1\x4a\x99\x51\x32\x13\xdf\x47\xe6\x37\x2b\x19\x30\x47\x00\x73\x27\x90\xd5\xca\xf2\xd1\x36\x4e\xc0\x26\xb6\x21\x21\xab\xef\x7b\x7f\xe4\x0b\x6c\xe3\x8b\x63\x66\xf7\x41\xa3\x51\xb0\xab\xab\x3e\x55\x5d\xdd\xd5\xd5\xdd\x74\x7f\xfb\xf6\xe9\xdb\x37\xa8\x6f\xda\x8e\x66\x81\xd1\xa0\x03\x29\xa2\x23\x4a\xa2\x0d\x20\x65\xbd\x5c\x7d\xfa\xf6\xed\x93\xfb\xbe\xb6\x5e\xae\x80\x02\xa9\x96\xb9\xdc\x13\x6c\x80\x65\xeb\xa6\x01\x31\xdf\xc9\xef\x48\x84\x4a\xda\x42\x2b\x4d\x70\x8b\x27\x48\x3e\x8d\xb8\x31\x64\x3b\xa2\x03\x96\xc0\x70\x04\x47\x5f\x02\x73\xed\x40\x3f\x21\xf8\x87\xf7\x6a\x61\xca\x2f\x87\x4f\xe5\x85\xee\x52\x03\x43\x36\x15\xdd\xd0\xa0\x9f\xd0\xd5\x64\x5c\xa7\xaf\x7e\x84\xec\x0c\x45\xb4\x14\x41\x36\x0d\xd5\xb4\x96\xba\xa1\x09\xb6\x63\xe9\x86\x66\x43\x3f\x21\xd3\x08\x78\xcc\x81\xfc\x22\xa8\x6b\x43\x76\x74\xd3\x10\x24\x53\xd1\x81\xfb\x5e\x15\x17\x36\x88\x89\x59\xea\x86\xb0\x04\xb6\x2d\x6a\x1e\xc1\x9b\x68\x19\xba\xa1\xfd\x08\xb0\x03\xd1\x92\xe7\xc2\x4a\x74\xe6\xd0\x4f\x68\xb5\x96\x16\xba\x7c\xe3\x2a\x2b\x8b\x8e\xb8\x30\x5d\x32\xb6\x33\xe6\x86\xd0\x98\xad\x74\x38\xa8\x55\x87\xb8\x69\x6b\x34\x1e\x41\x3d\xbe\x33\x0b\xe8\xbf\xcf\x75\xdb\x31\xad\xad\xe0\x58\xa2\x02\x6c\xa8\x36\xec\xf5\xa1\x6a\x8f\x1f\x8d\x87\x6c\x8b\x1f\x47\x0a\xc5\x09\x05\xd9\x5c\x1b\x0e\xb0\x04\xd1\xb6\x81\x23\xe8\x8a\xa0\xbe\x80\xed\x8f\xdf\x21\x50\xf6\xfe\xfa\x1d\x22\x5d\xbf\xfa\x7d\x0a\xfa\xd2\x8e\xd7\xce\x07\xe8\x3a\x72\x9e\xb0\x08\xd5\x9e\xb9\x47\xde\xe2\x6b\xdc\x34\x42\x19\xb0\xf5\x50\x09\x40\x55\x81\xec\xd8\x82\xb4\x15\x4c\x4b\x01\x96\x20\x99\xe6\x4b\x7e\x41\xdd\x50\xc0\xbb\x10\x51\xce\xb0\x45\xcf\xd1\x6d\xc1\x34\x04\x5d\x39\xa6\xb4\xb9\x02\x96\xb8\x2b\xeb\x6c\x57\xe0\x8c\xd2\x7b\x24\x67\xa1\x38\xae\xec\x02\x28\x1a\xb0\xbc\x82\x36\x78\x5d\x03\x43\x3e\x4a\x85\x48\xf1\x95\x05\x36\xba\xb9\xb6\x83\x67\xc2\x5c\xb4\xe7\x27\xb2\x3a\x9f\x83\xbe\x5c\x99\x96\xdb\x1c\x83\x3e\xf5\x54\x36\xa7\xda\x52\x5e\x98\x36\x50\x04\xd1\x39\xa6\x7c\xe8\xcc\x27\xb8\x52\xd0\x2e\x4f\x00\x1d\x2d\x29\x2a\x8a\x05\x6c\x3b\xbf\xf8\xdc\xb1\x14\x2f\xee\x08\x0b\xd3\x7c\x59\xaf\x4a\x50\xaf\x8a\x20\xf9\x54\xa2\x6e\x1d\xc9\x38\xec\x74\x4b\x17\x70\xfb\x09\x55\x05\x56\x39\xd2\x90\xfd\x09\x45\x02\xb3\x96\x2b\xe4\x75\xad\x47\x08\x89\x76\xc5\x45\x25\x56\x6e\x81\xb9\x53\x58\x03\x76\xac\x03\x92\xb6\x85\x6e\x34\xdf\xb5\xf4\x32\xc4\xa6\x8f\xc3\x2c\x24\xd4\x6d\x47\x70\xde\x85\x55\x31\x4b\x97\xd2\x5c\x95\xa5\x04\x65\xc9\xc2\x50\x92\x4f\x2c\x85\xcd\xbd\x90\xac\xb8\x17\x93\xb6\xe5\x2a\xd3\x8f\x91\xae\xb5\x6d\x7b\x5d\x24\x79\x47\x2c\x9b\x0a\x38\x72\x5c\xb0\x73\x83\x95\x68\x39\xba\xac\xaf\x44\x23\x37\x78\x17\x15\x15\x56\x47\x8e\x4d\x76\x11\xed\x58\x04\xe9\x05\x8f\x96\xef\x19\xaf\x8c\x3c\x9f\xf0\x97\xf3\xf7\x2b\xd3\xad\xc9\xe0\x4f\x37\x3e\x84\x43\x3f\xcf\x19\x84\x92\x08\x34\xd3\x5a\x09\x4b\x5d\x0b\x06\x0c\x39\x10\x12\x94\xa5\x75\x3c\x7e\xbc\x97\xc7\xb9\xac\x73\xfa\xa5\xab\xbd\xce\xa4\xcb\x43\xba\xe2\x4b\xae\x71\x75\x76\xd2\x19\x97\xe4\x9d\xe1\x74\x17\xe0\x1c\x54\x77\x3e\x27\xef\x5b\x79\xf5\xc3\x28\x3d\xe2\x06\x13\x8e\xaf\x9e\x60\x33\x77\x9c\x6d\x83\xd7\xa3\x25\xc7\x98\x94\x2e\xad\x80\x92\xb4\xfb\xd1\x6c\x69\x0d\x33\x5a\xfd\x31\xfa\xa5\xb3\x28\x57\x36\x18\xf7\x95\x23\x0e\x06\x79\xa5\x75\x0b\x7a\x80\x63\x74\xf1\x8b\x94\xa4\x0d\x86\x7f\xe5\xf1\x84\xe3\xc5\x32\x88\x12\x7d\x48\x3e\x71\xa4\x4b\x08\x08\xd9\x46\x63\xc8\x35\xd8\x71\x0a\xf1\x52\x77\x33\x0e\x5d\x06\x5f\x8c\xf5\x12\x58\xba\xfc\xd7\xdf\x5f\x4b\x94\x12\xdf\x4f\x28\xb5\x10\x6d\xe7\x8b\x68\x6c\xc1\xc2\x9b\x8a\x29\x51\x42\xd5\xad\xd4\x22\xf5\x09\x5f\x1d\xb7\x7a\x7c\x8e\x3e\x82\xa8\x69\x7b\x74\x37\xd0\x01\xd0\x1c\x1e\xa1\x76\x67\xf0\x70\x75\xf5\x8a\xef\xc1\xdf\x40\xc7\x28\xe2\xa9\x5e\x82\x03\x37\x1d\x73\xfc\x28\xc1\x62\xb1\xd2\xec\xd7\x45\xe8\x8b\xd5\x26\xd7\x65\x0f\x24\xfc\xf8\xe4\xcf\xc2\xf1\xe2\x12\xdc\x85\xcf\xa0\xf1\x76\x05\xee\x82\x22\x3f\xa0\x91\x3c\x07\x4b\xf1\x0e\xfa\xf6\x03\xea\xbd\x19\xc0\xba\x83\xbe\x79\x93\x73\xd5\x21\xe7\xd6\x57\xc0\x39\xe4\xf7\x29\xc6\x31\xfe\x32\x60\x5c\xed\x75\xbb\x1c\x3f\xce\xe1\xec\x13\x40\x3d\x3e\xce\x00\x6a\x8d\xa0\xab\x70\xda\x2d\x7c\x66\x7b\x4c\xae\x92\x92\x43\xf5\x03\x99\x3b\x0b\x15\xea\x13\xb3\x25\xdf\x1b\x27\xec\x09\x3d\xb6\xc6\xcd\x1d\xac\xe8\xfc\x5b\x4c\xfc\x9e\x4b\x02\xc8\x31\xca\x1f\x30\xf1\x0c\xd0\xef\xdc\xae\xb4\xd1\xa0\x03\xad\x2c\x53\x06\xca\xda\x12\x17\xd0\x42\x34\xb4\xb5\xa8\x01\xcf\x0c\x25\xe7\x0b\xa3\x70\x8b\x1d\x2d\x80\x1f\xfa\xea\x1e\x7f\x58\xb7\x69\xb6\xdc\x79\x76\x21\x7f\x68\xc8\x8d\x27\x43\x7e\x14\x79\xf6\x09\x82\x20\xa8\xc3\xf2\x8d\x09\xdb\xe0\x20\x4f\xfb\x6e\x77\xe2\xf7\x77\xa3\xf1\xb0\x55\x1d\x7b\x14\xec\x08\xfa\x43\xf8\x03\x1a\x71\x1d\xae\x3a\x86\xfe\x40\xdc\x6f\xc9\xda\x28\x6c\x88\xe7\x69\x57\xc4\xfe\x62\xca\xa1\x69\xca\x95\xe9\xa9\xce\xd3\xaf\x84\x84\x9d\x8a\xbb\x47\x27\x69\xf8\xe5\x13\x04\x55\xd9\x11\x07\x3d\x36\x39\x1e\xfa\x03\xf9\x0b\xf9\xfb\xf6\x0f\xe4\x2f\xf4\xef\x3f\xff\x40\xbd\xbf\xd1\xbf\xd0\xbf\xa1\xb1\xff\x12\xe2\x3a\x23\xce\x35\x0a\xc7\xd7\xbe\xa6\x5a\xa6\x44\x1c\x38\xd3\x32\xc5\x12\x7e\xb5\x65\xfe\xef\x14\xcb\x1c\xc6\xd4\xc0\x0e\xbb\x38\x5c\xce\x10\xfb\xb0\x7d\xc0\xd1\x43\x0c\x41\x23\xd7\x56\xd0\xcf\x7d\x0f\x70\xe3\x3f\x1e\xcf\xfa\x1c\xf4\x33\xda\x22\xbe\xa6\xb5\xda\x8b\x62\x4c\x32\x4c\x40\x0c\x9b\x71\x79\x84\xa9\x43\xa0\x73\x51\xa6\x31\x4d\x20\x8d\x35\xc8\x38\xdc\xbd\x97\x1d\xa2\x4d\x1b\xe6\x9d\x8d\x36\x85\x69\x12\x6d\xb4\x91\xe4\xa2\x75\x23\x97\x02\x54\x71\xbd\x70\x04\x47\x94\x16\xc0\x5e\x89\x32\x80\x7e\x42\x57\x57\x3f\xe2\x6f\xdf\x74\x67\x2e\x98\xba\x12\x59\x4a\x8b\xe9\x1a\x1d\xff\x06\x2a\x7a\x0d\xac\x9c\x7a\x7e\x5b\x8c\x26\xdf\xbe\x46\xba\x02\x49\xba\xa6\x1b\x8e\x37\x30\xe0\x27\x9d\x8e\xaf\x8e\xb8\x74\x87\xf1\x90\x3c\x17\x2d\x51\x76\x80\x05\x6d\x44\x6b\xab\x1b\x5a\x82\xcc\x58\x2f\x77\x43\x7e\x48\x37\x1c\xa0\x01\x2b\x41\xa2\x2e\x44\xcd\x86\xec\xa5\xb8\x58\x1c\x8a\x71\xcc\xe5\xe2\x50\xc8\x17\x94\x20\xbe\xee\x28\x0f\xab\x3d\x99\x37\x9c\x6a\x8e\xe4\x6c\xc7\xce\x24\x0e\x78\x3f\x30\xc8\x6a\xb5\xd0\xbd\x39\x7b\xc8\xd1\x97\xc0\x76\xc4\xe5\x0a\x72\xeb\xcc\xfb\x0a\x7d\x98\x06\x38\x04\x9a\x95\x15\x85\xe3\xd1\x20\x9d\x2a\x87\x79\x97\x7c\x65\x70\x0d\xdc\x90\x1d\x8e\xfd\x11\x1d\xe2\x3d\x68\xf1\xd5\x21\xe7\x0d\xbf\x2a\xb3\xe0\x11\xdf\x83\xba\x2d\xfe\x81\xed\x4c\xb8\xdd\x77\x76\xba\xff\x5e\x65\xab\x4d\x0e\x42\x8a\x94\x39\xd9\xec\x49\x46\x07\xae\x18\x4c\x7a\x40\x06\x78\x77\x36\xe2\xe2\xcb\x55\x86\xc6\x57\x77\x77\x16\xd0\xe4\x85\x68\xdb\x5f\x93\xd5\xe5\xaf\x55\xa4\xf8\x16\x89\x7f\xcd\xa9\x28\x3f\x37\x3e\x5b\x33\x7f\x46\x67\xa7\x57\x7a\xcb\xd8\xcf\xd5\xa5\xc3\x4c\x25\x97\x4d\x25\x8d\x1c\x41\xd3\xc9\xfd\xe9\xbf\x94\x02\x04\x99\xd7\xc2\xd2\xa7\x17\x2e\xe4\xb6\x51\x9e\xbf\xcd\x69\xf3\x14\x81\x7a\x8f\x3c\x57\x83\x2a\xb3\x02\x8d\xfc\x19\xba\x7c\x85\x76\xbc\x12\xaf\xbf\xeb\x4a\x16\xb6\x70\xce\xe7\x5c\xaf\x0b\xf8\x04\x6e\x97\x68\x33\x42\x56\x4f\x7f\x38\xc5\x95\x45\xf9\xd9\x5b\xf8\xf8\x9c\xe1\xcd\x9e\x1f\xa7\xbf\x52\x80\x23\xea\x0b\x1b\x7a\xb6\x4d\x43\xca\x76\xb6\x70\xa2\xec\x5c\x3b\x04\x7c\x02\x3b\x84\xeb\xd6\x19\xd8\x22\x8b\xc9\xa5\x5a\x61\xda\x3a\x76\x7a\xc1\xc0\x2c\x91\x99\x51\xaf\x22\x76\x38\xc2\x5e\x0e\x4e\x48\xd8\x57\x44\x39\xfa\xdd\x62\x72\x22\x30\x99\x6b\x67\x1f\x9b\x92\x65\x2c\x20\x3a\x85\x85\x7c\xda\xf5\x4a\x29\x4d\xbb\x73\x9d\xe0\x6b\x62\x9d\xfd\x40\x17\xe4\x60\x3c\xe0\x88\x0b\x41\x36\x75\xc3\x4e\xf7\x41\x15\x00\x61\x65\x9a\x8b\xf4\xb7\xde\xca\xa7\x0a\xb2\xea\xda\x7b\x6d\x01\x1b\x58\x9b\x2c\x12\x77\x1c\xea\xbc\x0b\xde\x30\x49\xff\xc8\xa2\x5a\x59\xa6\x63\xca\xe6\x22\x53\xaf\x64\x1d\x85\xce\x02\x44\x05\x58\xde\xf0\xc2\x7f\x6e\xaf\x65\x19\xd8\xb6\xba\x5e\x08\x99\x8e\x12\x28\x2e\xea\x0b\xa0\x64\x53\x65\x37\xab\x8c\xb9\xeb\x73\x5b\x59\xc6\x7a\x48\x41\xcc\x2b\xdf\xdb\x14\xf7\x5f\xc7\xaa\x7c\xd9\x30\x96\x2b\xe3\x77\x85\xb5\xa3\x14\x3d\x33\xcc\xe5\xca\x3a\x0c\x7b\xe9\xe4\x39\x61\x30\xb2\xb2\x73\x31\xdf\x2c\x4a\x73\xe2\xbb\xaa\x32\x52\x21\x77\xe4\x2f\xfb\xaa\x78\x11\xf0\xcc\x00\x18\xb4\x7c\x73\x6d\xc9\xbb\x6d\x1a\x19\xa1\x27\xec\x4e\xae\xae\xee\xee\xb2\x53\xb1\xec\x76\x10\x2c\xac\x9d\x6b\xce\x60\x2f\xe0\x97\x8b\x8e\x17\x82\x2e\xf1\x94\xe8\xe5\xed\x85\xc9\x14\x9b\xd8\x89\x98\x47\x14\x6c\x8e\xcc\x23\xf1\xf3\xe0\x54\x82\xc3\x3d\x9d\x05\x74\xb9\xe2\x76\x54\x39\x12\x3d\x48\xba\x2d\xd8\x60\xb1\x00\x16\x24\x99\xe6\x02\x88\x46\x18\x93\x74\x19\x08\x46\x2c\xfe\xfa\xcf\xe2\x31\x79\xbf\x9b\x48\x48\x44\xeb\xd8\x7e\xa6\xe4\xcb\xc8\x32\x7d\xea\xce\x4f\x0f\xb5\xe0\xed\x0d\x86\xaa\x4d\xae\xda\x86\xbe\x7c\x89\x5a\xf0\x4f\x08\xfe\xfa\xb5\x88\x55\x5a\xf1\xd0\x68\xff\x77\x60\xc7\x12\xfc\x62\x36\x4d\xb0\x4f\x18\xdc\x03\x98\xdb\x94\xd2\x57\xb8\x2f\xd0\xb8\xd2\xf7\x2c\x94\x8c\xa4\x65\xba\xb0\x73\x62\x69\xd1\xfe\x80\xcb\x44\xd3\x02\x29\xbf\x2b\x9e\x1e\xa9\xec\x99\x11\xb5\x40\xda\x61\x4c\xcd\x2a\x90\x13\x55\x63\x7b\x42\x2e\xe8\xab\xa1\x7f\x46\x21\x95\x4e\xa2\x82\xbe\xbf\x20\x35\x2b\x1b\x78\xf3\x63\x68\x2a\xed\x5e\x74\x6a\x7b\x71\xb3\x80\xec\x34\x22\x2b\x41\xfb\x57\x52\x2c\xe7\x5d\x00\xc6\x06\x2c\xcc\x15\x48\x9b\xb6\x74\xde\xdd\x84\x67\xbd\x70\x32\x5e\x2e\x81\x23\x66\xbc\x72\x53\xad\xac\xd7\xb6\xae\x19\xa2\xb3\xb6\x40\xda\x0c\x1b\x43\x7e\xfd\xeb\xef\xfd\xd8\xe5\x9f\xff\xa5\x8d\x5e\xfe\xfa\x3b\x69\x73\xb0\x34\x33\x26\xc3\xf6\xbc\x0c\xd3\x00\xb9\x63\xa1\x3d\xaf\x43\x36\x81\x66\xfa\x12\x08\x92\xb9\x36\x14\x6f\xc6\x9a\xb6\x44\x43\x03\xc9\x6c\x2c\x1e\x5a\x5d\x4b\xb8\xdc\x34\xa0\x14\xa7\x5b\xc1\xdc\x9f\xae\x84\xad\x2d\xdc\xc2\x55\xa6\x8b\xf0\x9b\x9b\xb7\x5f\xae\x60\x77\xd8\x88\x1b\xe7\xcc\x93\x46\x67\xa4\xa2\xb3\xa4\xc7\xe5\x11\x97\x53\xa2\xe4\xe6\xb9\x5c\xa5\x72\xf3\x8f\x32\x4a\x66\x46\xda\x8b\xa9\x59\x7a\xff\x61\xae\xa2\x05\x61\x21\x5d\xd5\x9a\xe8\x88\x90\x6a\x5a\x05\xab\x45\x50\x8d\x1d\xb3\x05\xea\xb5\xf8\x11\x37\x1c\x43\x2d\x7e\xdc\x8b\xad\x18\x79\x51\x74\x04\x7d\x41\x6e\xa0\x2b\xf8\xea\x06\x42\x6e\x20\xf8\x06\xba\xba\xca\x46\x91\xb7\x50\x73\x2c\x92\xe4\x62\x4d\x88\xe6\x0a\x11\x74\x43\x77\x74\x71\x21\xf8\x1b\x67\xbe\xdb\xaf\x8b\xab\x1b\xe8\x0a\x85\x11\xe6\x1b\x4c\x7e\x83\x31\x08\xa1\xef\x50\xfa\x0e\xa7\xbe\xc3\x18\x8a\x33\xe4\x35\x8c\xba\xa0\x4b\x71\x47\x05\xff\x07\x11\xb1\x8a\x90\xb6\x82\x63\xea\x4a\xbe\x24\x86\x24\xa8\x63\x24\x61\xc2\xda\x06\xbb\xc0\x24\xe8\xc6\xc1\x8f\x30\x72\xe5\xe1\x38\x8c\xd3\xc7\xc8\xc3\x05\x51\x51\x84\xe4\x54\x56\xae\x0c\x02\x27\x30\xf4\x18\x19\x84\xe0\x87\xc1\x70\x40\xee\x2d\x81\xe6\x8a\x20\x31\x18\x3d\x4a\x0d\x32\x14\x11\x74\x7a\x25\x44\xd0\x38\x42\x1c\x23\x82\x12\x96\xa6\xa2\xab\xdb\xf2\x5a\xd0\x08\x89\x1e\x25\x82\x8e\x69\x11\xec\x7c\x2e\x21\x87\xc2\x49\xec\x38\x39\x6e\xa5\x8b\x9a\x66\x01\x4d\x74\x4c\x2b\xdf\xa7\x18\x18\x81\x99\x63\xd8\x33\x1e\x7b\x7f\x9a\x53\x78\x57\xac\x7c\xee\x28\x85\x1c\x55\xd5\x08\xec\xb1\x0f\x6a\xc1\x4b\x6e\xf3\x05\x10\x0c\x75\x94\x75\x10\x24\x2a\x60\x97\x2d\xb9\x1d\x40\xbe\x20\x86\x64\x8e\xd3\x04\x8d\x55\x74\x90\x9f\xfa\xbf\xb5\xcd\x93\x84\xc0\x14\x81\x1f\x55\x23\x08\xe6\xab\xb3\xcb\xea\x73\x6b\x1c\x41\x50\x8a\x3c\x4e\x13\x5c\x50\xf5\xf7\xf0\x77\x07\xe6\x72\x21\xa8\x3a\x58\xe4\x76\x8d\x08\x42\x20\xc8\x51\x9d\x30\x42\x84\xcb\x2d\xe1\x34\xf8\x7b\x81\x1a\x24\x75\x5c\x37\x8f\x90\x82\x6e\x68\xc0\x76\x84\xc3\x89\xf6\x02\x51\x14\x43\x1f\x57\x23\x54\x2c\xc2\x7b\x2b\x1a\x62\x7e\x30\x41\x50\x18\xc6\xf0\x40\x48\x46\xac\xcd\x5d\x9e\x3f\x36\xd8\x1e\x2c\xd1\x47\x63\x7f\xa3\x3a\x6d\x37\xc8\x21\x8f\xf7\xf8\x16\xd7\xaf\x76\xf9\x7a\x85\xc2\x50\x16\xc7\xc8\x27\xa2\xcf\xd7\x46\xc3\x4e\xe3\xb1\x4d\x35\x2a\x9d\x6a\x77\xd0\x69\xd5\x7b\xf8\x88\xe2\x66\x8f\x0f\x93\xa4\x85\x32\x85\xa0\x9e\x10\x14\x1b\xd4\xd1\xe6\x84\x23\x50\xb6\x3b\x9d\xd4\x27\x4d\x8c\x9d\xdd\xb3\xd3\x69\x63\x3a\x7d\x40\x1f\x9a\xd3\xd9\x6c\x48\x72\xb3\x29\x37\xee\xb7\x6b\xd3\xa7\x11\xfb\x48\x52\xd3\x1e\x5e\x5a\x08\xe6\x0a\xa9\x0c\xfb\xb3\x66\xab\x83\x56\x5b\x58\x9d\x1f\xe0\x95\x69\xa7\xde\xe5\x6b\x9d\xfa\xfd\x84\xef\x4f\xd0\xe6\x0c\x7b\xea\xd6\x47\xcd\x1e\x3f\xa9\x72\x3d\x76\xf4\x48\x0d\xaa\x54\x6f\x8a\x36\xaf\x4e\xdd\xe9\xe1\x0e\xfc\x0a\xaa\x21\xd8\x1d\xb7\xdf\xd8\xfa\xdd\x06\xf9\xbb\x20\x6e\x20\xec\x06\x72\xac\x35\x28\xe1\x1c\x87\xfb\x1b\x4e\x76\x0d\x3f\x2f\x89\x3a\x86\x6c\x01\x45\x77\x04\x71\xb1\x9a\x8b\xc6\x7a\x89\xbb\xee\x3c\x19\xd5\xae\xce\xac\xce\x53\x56\xf4\x2f\x62\xe7\x58\x16\xe5\x8d\x77\xcb\x59\x39\x6d\x41\xff\x54\x33\x87\x8b\xfa\x11\x3b\x23\x28\x4d\xe3\x0c\x4c\x30\x34\xe1\x81\x42\xdd\x51\xf8\x3f\x9f\x17\xfa\x52\x77\x3e\xdf\x41\x9f\x19\x14\xc5\x30\x0a\x85\x31\x92\x26\xbe\xe3\x14\x45\xd0\x30\xf5\xf9\x06\xfa\xbc\xdf\x40\xe2\x52\x4d\x46\xb5\xfd\x43\x37\xef\x76\x1f\x26\x6b\x70\x4f\xe1\x6f\x24\x71\x69\x4e\xad\xca\xcf\xff\xcb\x6a\x9b\x49\x1d\xd1\x1b\x88\x26\x68\x86\xc1\x68\x92\x66\x76\x79\xc6\x3f\x9f\x6d\xc7\x1d\x84\x1b\x9a\x20\x89\x0b\xd1\x90\x3d\xc4\x08\x0c\xc3\xdf\x61\xff\x53\x5e\x02\x16\x97\x80\x7a\x4d\xe8\xea\x9f\xcf\x7e\x20\x3e\xe0\x7b\x60\x27\x43\x74\xf4\x0d\x38\x59\x23\xec\x06\x42\x7c\x95\xde\x80\xae\xcd\x5d\x81\xc8\x0d\xf4\xd9\x77\x0a\xe1\x05\x6c\x7f\x8f\x9d\x91\x00\x15\x8e\x52\x81\x2b\xfd\x2a\x3b\x07\x12\x7e\xb9\x9d\x13\x1a\x95\xb4\xf3\x69\xe1\xcc\x47\x55\xd0\x15\xa4\xed\x69\x39\xb5\x2b\x08\xf7\xb5\x44\x23\x18\xa6\x20\x04\x8d\xaa\x24\x41\x60\x22\x0c\xa3\x0c\x89\x33\x98\x22\x89\xa4\x24\x61\x0a\x4e\x62\x32\x0c\x24\x4a\xc6\x11\x4a\x11\x55\x58\xa6\x50\x0a\x63\x10\x55\x56\x69\x0c\x55\x81\x2a\xc1\x04\x70\xfb\x66\x86\x96\x25\x14\xa8\xb2\x8a\x22\x40\x02\x00\xa6\x70\x04\xc6\x24\x94\x66\x64\x05\xd0\xb8\xc4\x20\x32\x8c\xcb\x30\x26\x22\x04\x83\x63\x0a\x22\x03\x9c\x24\x31\x82\x81\x49\x52\xc1\x48\x15\xa5\xfd\xae\x11\x49\x8c\x5d\xc8\x3b\x8c\xb8\xc3\xe1\xe4\x90\xc6\x7f\x8c\x7e\xc7\x31\x94\xa2\x88\xc2\xb7\x41\x5f\x87\xd0\x34\x7d\x03\x21\xa4\x5b\x9f\x07\x9f\x1b\x08\x73\xff\x43\x82\xff\xc2\x87\xc8\xee\x0f\x17\x1a\xcb\xb2\x6c\x95\x78\xee\x74\x36\x1f\xdb\xa6\x45\x69\x4a\x85\xa5\xda\xf7\x1f\x60\xde\x79\x91\x2b\x5d\x96\xac\x3f\x0d\x98\x66\x6f\xb8\xe4\x9f\x2a\x4b\x18\xa5\x4d\xd5\x1a\x6d\x50\xd9\x66\xc8\x11\x35\xd1\x9a\xcc\xbc\x51\x9d\xa2\x6f\xa8\x73\xbf\x26\x6f\x31\x7e\xc5\x30\xcf\xa3\xc7\xf9\xb6\xb5\x65\xdf\x2d\xda\x65\xcd\x4e\xfb\x0f\xdd\x29\xbb\xff\x74\x3a\xed\xbe\xd4\x35\x9f\x9b\xd7\xc3\xe1\xf5\x78\x54\xa9\xb5\x1b\x95\x5b\x67\xad\x36\xd1\x65\x07\x41\x65\xb9\xda\xb4\x90\x7b\x03\xa5\xb6\xfd\xea\x00\xe6\xfb\x94\xf8\xe0\x5c\xb3\xd4\xb4\x8a\x19\x1a\x00\xa6\x46\xbc\xcd\x6c\x67\xdc\xe4\x6e\xed\xf5\xfd\x6d\x9b\x5f\xae\x5e\xcc\xd9\xfd\xec\xcd\xe5\xdc\xe5\xf1\x8e\xf8\xb1\x42\x07\x11\x69\x9c\xcd\xa6\x7c\x9e\xd8\x29\x82\x0f\x58\xb6\x06\xdf\xa7\xbd\xfe\x4f\x7f\x82\xf9\xa5\x8c\x76\x9f\x6c\x0a\xe8\x65\xdc\xf8\x8a\xc4\x14\x86\x56\x09\x8c\x04\x80\xa4\x15\x44\x42\x29\x89\x90\x68\x46\x45\x31\x51\x25\x30\x04\x91\x28\x82\x64\x44\x14\x57\x45\x15\xc1\x61\x4c\x54\x60\x89\x40\x25\x12\xc3\x24\x98\x92\x00\xc3\x5c\x79\x7d\x1c\x9a\xe6\xd5\x18\x93\xe9\xec\x38\x8d\xd2\xc5\x6f\xfd\x00\x82\x13\x0c\x9a\xd3\x12\xd0\x92\x2d\x01\xed\x3f\x3d\x23\xfc\x9a\x30\x61\xe9\x9e\x7a\xc4\x8d\x6d\x6f\x33\x79\x6f\x60\x0f\x2b\xf3\xe5\x7a\x53\x67\x7b\x4e\x15\x69\xa3\x5d\xaa\x42\x91\x4f\x6b\xa2\xc9\xc8\x4d\x05\x7e\x65\xed\xa7\x67\x66\x40\xce\xe8\x6d\xab\x25\x93\x6b\xe7\x45\xbd\xad\xf6\xae\x3b\xcb\x5b\xb8\x2d\xd9\xaa\xf5\xd1\x9f\x78\x35\xe7\xb6\x84\x47\xcf\x53\x5b\xbb\xff\x58\xcf\x59\xed\xfd\xf7\x37\xb6\x3f\x78\xf1\x6b\xba\x0f\xf7\x9f\x47\xd8\x50\xa5\xe6\x36\xfd\xfe\xd0\xaa\x68\xa8\x46\xbf\xb7\x37\xaf\xbd\xde\xad\x71\xab\xdd\x4e\xdf\xb4\xfe\xf0\xb6\x59\xa1\x5e\x01\xb3\xb2\xf5\xfb\x35\xfe\xc2\x37\x87\xb8\x39\x6d\x72\xe3\x96\x82\x23\x7d\xfe\x7e\x4a\xad\xee\x5f\x4d\x18\x65\x71\xf3\x9a\x30\x86\x12\xf6\xb1\xf6\xe5\xa7\xb4\x94\x5a\x2b\xcd\xdb\xfe\x3f\x6f\x29\x68\xf9\x96\x82\x5c\xc6\xcb\xbd\xb5\x16\x77\xb8\xe0\x86\x57\x84\xa1\xe0\x6f\x30\xf2\x0d\x46\x20\x18\xbe\xf3\xfe\x65\x7a\x33\x89\xc0\x04\x5e\xf8\x16\x47\x19\x9c\x21\x29\x94\x21\x73\x7c\x3d\xdd\xd3\x7d\x48\xff\x76\xa5\x64\x7f\x2a\xd3\xb6\x8e\x6f\x6f\xb7\xa3\x76\x85\xaa\x19\x35\xa6\x89\xc2\xef\xcf\x95\x6b\x1b\xd6\x1c\xfb\xad\xf5\xf6\x81\x4c\x95\xd1\xe3\x4c\xac\xdc\x8b\x75\xcd\xa5\xe7\x52\x9c\x38\xfd\x13\x3a\x31\xcb\x56\x5e\x7e\x83\x22\x17\xfd\x5c\xf9\xce\x54\x3c\xa0\x2a\xb1\x9b\xf1\xd4\xf1\x55\xc6\x22\x55\x66\xe6\x95\xd1\xe2\x0a\xd8\x24\x53\x81\xd3\xb8\x24\x13\x98\xd3\xb8\xe0\x89\xe1\xf2\x69\x5c\x88\x44\x1a\x71\x99\x6d\x99\x17\x49\xe1\xf3\xd7\x0c\x6f\x20\xa2\x6c\x4a\x9f\xb1\x39\xf1\x6c\x57\x8b\xb8\x57\xcc\xb7\x76\x5f\x70\x6f\x1c\x44\x96\xcb\xf0\x1d\x6b\x6d\x3b\x00\x9c\x95\x3d\x86\x6c\x4c\xeb\xac\xe4\xe8\x3f\x31\xdf\xf0\x0b\x26\x2b\x53\x6a\x2e\xda\x10\x77\x7f\xd3\x91\x7c\x5a\x5d\x1b\x4a\xa0\xcb\x89\x13\x8e\x9e\x5d\xfc\x69\xbf\x73\x2b\xb7\x44\x72\x7f\xe6\xcc\xe8\x31\x66\x0b\xfa\x8c\xdd\xdf\xf8\xaf\x35\xdb\xe9\xce\xfc\xeb\xcd\x56\xd0\x03\xa5\xec\xe5\x2d\xd3\xfb\x14\x73\x2d\xde\xd6\x78\x6a\x2f\x97\xb9\x1d\x22\x35\xa4\xe2\xd9\x21\xb5\x90\x11\x1a\x6f\x79\x59\xe1\xb0\x90\x0f\x16\xe7\x93\x15\x10\x0b\xf9\xe0\x71\x97\x3e\x99\x4f\xb2\x69\x5c\x6a\x97\xe6\x45\x82\x6b\xd1\x3e\x95\x23\xc2\x6b\xe6\x2e\xc5\x0b\xb8\x5e\x64\xe9\x4d\x52\x70\x9a\x54\x24\x45\x81\x51\x05\x27\x61\x1a\xa1\x48\x0a\x91\x71\x91\x10\x29\xc0\x28\x24\xa0\x49\x42\x16\x51\x46\x96\x70\x04\x90\xa8\x42\x89\xa2\x4a\xc1\x22\xaa\x02\x40\x48\x18\xa9\x00\x7f\xa9\xe5\xac\x35\xb0\x48\x1e\x8f\x85\xf9\x4b\xf6\x24\x18\x43\x62\x39\x53\x64\xfe\xdb\x58\x0b\xf2\x13\x9f\x36\xf9\x0c\x74\xec\x79\x69\xb6\xe8\x71\x63\x51\xbb\x05\x9a\x8c\x51\xfd\xa9\xd3\x6c\xb7\x3f\x1e\x1f\xe8\xb7\x07\xfd\xa9\x22\x56\xd7\x44\x87\xe8\xb2\x5e\xe2\xc0\x86\x89\x79\x25\x31\x2e\x8f\x7c\x9f\x79\xdf\x1f\x1e\x78\xce\xff\x5e\x45\xd6\x15\xa5\x69\x8e\xd7\x5a\x77\x33\x70\x6a\x54\x65\xde\xea\x60\x3c\x60\x94\x87\xbe\xda\x68\x5d\xdf\xeb\xc4\xfd\x66\xd2\xbb\x7e\x62\x1d\x0a\xbb\xdd\x7d\xf6\xfc\x1a\x3b\xf9\x83\x0a\xf3\xb2\x6c\x3f\xa2\xaf\xd8\x86\x1a\xa8\x5b\xba\xdf\x05\x2f\x9c\x84\x8c\xc7\x2d\x42\x7f\x7f\x7d\x69\xc1\x15\x53\x9b\x5a\x3d\x87\xd2\x7a\x08\x89\x0e\xa4\x97\x39\xaa\x8c\xc6\x13\x15\xd4\xcc\x8d\x0c\xf7\x59\x51\x9d\xd7\xa6\xef\xce\xfc\x81\x5d\xd8\x9d\xf5\xf3\xa2\xb2\xdc\x3e\x57\xd8\xd9\xcf\xab\x68\x22\xd8\x88\x24\x50\xfb\x3f\x1b\x11\x5d\xf7\xf4\x83\x9d\x3d\x6a\xde\xf7\xb7\x3d\x91\xf5\xca\x93\x1d\xd0\x13\xb5\xe7\xf7\xae\x38\xe9\x33\x64\xe5\x43\xb5\x19\x00\xcb\xa6\xc5\x3f\x4d\x3f\x2a\x8f\xf7\x2f\x75\xb3\x4d\xbd\x6c\x5e\xbc\x42\xd5\x07\x76\xf3\x6c\xec\xed\x9b\xf1\xe1\xb2\x5e\x54\x2e\x2c\x3f\x59\xbf\x47\xc8\xef\xee\xed\xe1\x7d\xaa\x6b\x13\x33\x1d\x9c\x78\xad\xf6\xb9\xf7\xd5\xe0\x16\x33\x9b\xfc\xf5\x07\x42\x0d\xb7\xba\x8d\x2c\xd4\x6e\x7d\xb6\x1c\x3c\x6a\xd6\x7a\x74\x3d\xf6\xe8\xef\x27\xd5\xeb\x9e\xec\xfd\xa9\xe5\xc8\xcc\xcc\x73\xb9\x5f\x21\xff\xd0\x1e\xf9\x79\x76\x6d\x4f\x73\xac\xfc\xfa\xc3\x04\x0e\x98\x77\x1e\xf1\x3a\x0c\xe6\x3d\x92\xdd\x32\x55\xb8\x6f\x37\x38\x6d\x23\x23\x14\x82\x4c\x18\x7a\xf6\x8c\x2f\x3b\x2f\x4b\x66\x40\x11\x2f\x55\x6c\x13\xa9\x8a\x7d\x23\x7a\x4b\xda\xef\xe7\xde\x77\x3d\xdd\xbc\xba\xaa\x9e\x67\xab\x00\xab\x96\x63\x8d\xdf\x56\x57\xc7\xc8\xf7\x6d\xf1\x4f\x13\x1d\xcd\x56\x92\x68\x81\x5b\xa7\x72\xdb\x79\xa3\xdf\xc9\xc1\x70\xf3\xc0\x77\x9f\x97\x9d\xc6\xeb\xe0\x79\xd0\xd0\x2b\xc0\x26\xb1\x35\x4b\x4d\xad\xa7\xca\x7a\xd4\x7c\x42\xee\xf9\x21\x83\xf7\x74\xe6\x63\x40\x57\x56\xd7\x1c\xaf\x36\xd0\xfa\xa4\xfa\xf8\xb6\x26\x7b\x93\x86\xd4\xee\x72\x15\xed\xe7\x4f\x6f\x9c\xe7\xed\x43\x0e\x67\xc1\xfc\xff\xdd\x40\xe7\x75\xe8\xc5\xb1\x3e\x12\x91\x14\x09\x63\x68\x20\xe1\x22\xa0\x19\x8a\x20\x31\x94\x20\x71\x4c\x16\x15\x14\x91\x19\x1c\x20\x98\xa4\xca\x30\x85\x4b\x18\x8a\x01\x40\x63\x00\xc1\x11\x49\xa5\x60\x44\x24\x14\x06\xc6\x55\x44\xf2\x27\xff\x90\x73\x86\x9e\xfe\xea\x4d\x6e\x20\xc2\x69\x1c\xcd\x9e\xb4\x0b\xdf\x46\x47\x4e\xbe\x2f\x36\x3a\x74\x73\xb0\x19\xbc\x48\x6d\xb4\xc9\x62\x8f\x0f\xcf\x43\xab\xbd\x7c\x9e\xc2\xb0\xda\xa0\xed\x4e\x8b\x5a\xc2\xdc\xf0\xed\xfe\xf1\x96\x9d\x62\xec\x2e\x0e\x79\x9f\x9c\x38\xe4\x7f\x1c\x49\x9b\x0e\x49\x8e\x32\x6b\x1d\xb8\x33\xb8\x7e\x9b\x8d\xaa\xcc\xc7\x74\x33\x7d\x18\x63\xef\x7a\x5f\x9f\xad\x47\x12\x52\xdb\x2c\x07\x1d\xe0\xad\xcf\xb8\xfd\x60\x74\x52\xac\xf2\xb0\x79\xab\x33\x6f\x9e\xab\xce\x9e\x07\x72\x7f\x8c\x36\x88\xf9\xab\x51\x59\x6a\x8d\x06\xd0\x98\x7b\x7a\x81\xcb\x08\x67\x4c\x16\xef\x2f\x0b\x6e\xd1\x64\xec\xd7\x27\x0b\x66\x28\xa4\x4e\xf6\x3a\x8f\x2a\xb8\x5d\xe2\x2f\xab\xba\xd3\xba\xb6\x5b\xb0\x8e\xbc\x76\x74\x87\x60\xe1\xfb\xed\xa3\x21\xcd\x67\x9d\x47\xc2\xac\x95\x88\x3d\x31\xa7\x8d\xc7\x9e\x88\xce\xfb\xbe\x37\xd2\x9e\x2b\xfa\x6d\x05\xee\xc0\xf7\x8d\xad\x33\x7f\xe3\x91\xc5\x0c\x16\xb7\x2b\x13\x61\xf8\xe6\xfb\xa6\x53\xdd\xf6\x08\xa7\xc2\xc9\x55\x5f\x47\x4c\x73\xac\x9e\x31\xbb\xa5\xf1\x7d\xf9\x8c\x58\x94\xdf\x9e\xcf\x90\x5f\x1f\x3f\x56\xec\x33\xe4\xb3\x09\xf9\x47\x8c\x3d\x3c\xfb\x9d\xd3\x9f\xa5\xf6\xad\x95\xd3\x6d\xd1\x33\x9e\x72\xd5\x2c\xb2\xc5\xb9\x75\xe1\xfa\xc2\xb5\x9c\xe0\x77\x94\x2d\xfe\x69\xb4\xe0\x66\x0d\x66\xe6\xeb\x99\xb8\x7a\x7b\x32\x2b\x73\xc3\xec\x8f\xd4\x7b\xd0\xe4\x87\xf7\xc8\xbd\xfc\x74\x3f\xbc\x1f\xde\x4a\xed\xa5\xc8\xf4\x01\x33\x04\xcf\x3a\x62\x60\x1b\x62\x7d\xdf\x1e\x4a\xa3\xbe\x55\xe5\x5b\x8e\xa8\xe3\x16\x18\xf0\x55\x79\xb1\x42\xf1\xc7\x2a\xb2\x16\xd9\xb7\x4b\xf7\xad\x2a\x43\xc9\xa2\xaa\x8a\x12\x2d\x23\x24\x8c\x62\x22\x46\xd1\x34\x8e\x90\x84\x2c\xc1\x12\xa6\xaa\x88\x28\xa2\x8a\xa8\xe2\x30\x0c\xab\x40\xc5\x19\x05\x45\x80\x2a\xd3\x38\xa5\x28\x92\x2a\x01\x71\xbf\x98\x77\x46\xdf\x8a\x16\xf7\xad\x24\x9c\xbd\x0e\x1e\xbe\x8d\x66\x81\xe7\xf6\xad\xd5\x44\xa5\x1e\xf4\xad\x27\x8c\x31\x33\xfa\xd6\xca\xb2\xbd\x1a\x69\x1b\xeb\xad\xdd\x43\xe1\x69\xb5\xa7\xce\xd4\xa9\xdd\xe0\xb8\x89\xf3\x36\x13\x45\x4e\x7d\x1d\xad\xc9\xed\xf2\x7e\xb9\xa8\x2d\xc5\xeb\xd6\x94\x6c\x51\x2d\x4d\x93\x26\x4f\x5d\x53\x1e\x28\x4f\x0c\xde\xea\xb2\x6a\x5b\x19\xb0\xfc\xeb\x54\x6a\xf5\xa8\xad\xfd\x06\x40\xb7\xfa\xdf\xea\x5b\xcf\xed\xdb\xce\x6c\xcf\xaf\xd4\xed\xb8\x26\x5f\xb2\x6f\xfd\x8d\x63\xc5\xa2\x71\xeb\xef\xec\xdb\xd8\x0b\xf5\xad\xa7\xc6\xd9\xa0\x6f\x7d\xd2\x5f\x27\x66\x87\xa4\xab\xcf\x8e\x53\x7f\x7b\x36\xd0\x26\x42\x55\xe6\x95\x7a\x47\x6e\x34\x96\xf3\x26\xf9\x62\xad\xed\x95\xfe\xb4\x1a\x10\xcb\x8d\x5e\xbf\xd6\x7b\xdb\x56\xab\x81\x34\xc6\xed\x26\xd7\x7c\x54\x41\xb5\xc6\x36\xb7\xc6\x84\xad\x89\x0b\x74\x5b\x5b\xd3\x56\xb7\x69\x3c\xb3\x25\xc7\xad\x99\x27\xce\x1d\x1e\xc8\xbe\x3b\xfc\x35\xfc\xed\xf5\xb1\xbf\x99\x8a\x70\xf4\x0f\x87\xac\xd5\xa2\xbf\xe4\x4e\x0a\x84\xfa\xc3\x56\x97\x1d\xce\xa0\x36\x37\x83\xbe\xe8\x4a\xd1\xa1\x70\xe9\x07\xd4\x9f\x8d\x3a\xc1\x35\x0d\x79\x9a\xe0\x42\xf4\x89\x5d\xb5\xa7\x1d\xf0\x7f\xb6\x76\x71\xb1\x69\xca\x9d\x04\x0c\x9a\xf0\xad\xc1\x84\x83\xbe\xec\xc9\x6f\x22\xa7\x9f\xdd\xc4\xce\x2a\x3b\xd2\x34\x97\xa9\xd6\xa3\x15\x3f\xaa\x52\x33\xd6\x4f\x0b\x16\x29\x2f\xab\x59\xba\x90\x3c\x4d\x73\x60\x95\xd6\x3c\x73\x82\xbb\x70\x0e\xf9\xb2\xda\x67\x89\xc9\xd3\x3f\x17\x5a\xa1\x05\xe2\x17\xac\x04\x8a\x78\x97\xb1\x94\xfb\xe1\xbd\x7f\x6f\x4b\x8c\x0b\xd4\xe3\x93\x8d\x61\x32\x6a\xf1\x0d\x48\x72\x2c\x00\xa2\xad\x2b\x1b\x4d\x70\x37\xcc\xd9\x78\x82\x73\x05\x4b\x21\xca\x68\xd7\x91\x7b\x6d\x4e\x85\xb3\x67\x11\x45\x12\xcb\x06\xe2\x78\x7c\xe2\x9b\x83\x63\x00\xd2\xc0\x79\x37\xf3\x9c\x81\xcc\x3b\x0d\xa1\x14\xac\xe4\x19\x0a\x69\x68\x82\xeb\x84\xce\xc0\xe3\x73\x28\x87\x28\x71\x40\xc3\xcd\xe1\x59\x0c\xa9\x4d\x3e\x7a\x3f\xd2\xf1\x48\x83\x28\xe1\x03\x4e\xb0\x8b\xc2\x0e\x37\x7d\xc7\x10\xa7\x1d\x4b\x74\x13\x1e\x41\x94\x05\x76\xff\xc3\xef\x33\x61\xea\x4a\x69\x80\xfb\x33\x58\x6e\x52\xcf\x52\x2a\x00\x1d\x5e\x69\x75\x09\xdc\x01\xaf\x28\xf4\x8c\x50\x75\x92\x26\xe9\x0a\x84\xb7\x77\x5d\x42\x81\x80\x57\x86\x4f\x9f\xa8\x42\xfc\x40\x9d\x43\x25\x22\x77\x95\x9d\xda\x1a\x23\x3c\x4e\x35\x7e\xbe\xa1\x13\x97\xaf\x9d\x6b\xeb\x38\xbb\x28\xe4\x70\x7b\x69\x0c\x63\x3a\xa2\xc3\x0b\xe4\xce\x87\x75\xc0\xb3\x5c\xf7\x96\x06\x30\x72\x15\xde\xc9\xd5\xba\xe7\x71\xba\x4b\x16\xb9\x5f\xda\x25\x7f\xa7\x03\x3e\x64\x96\x40\xae\x80\x04\xce\xc4\xf1\x6a\xf9\x00\xfd\x5b\x0b\x2f\x02\xcf\x63\x55\x0a\x5c\xf8\x4b\xe7\x4c\x68\xc9\x5b\x18\xcf\xc5\x97\xe0\x57\x04\xf2\xf0\xdc\xb8\x42\xa4\x97\xb1\x63\x8c\x5b\x59\x94\x85\xd6\xbc\x0c\xb6\x52\x98\xf2\xb1\x24\xae\xfb\x3c\x0b\x51\x9c\x57\xe9\x1a\x0d\x4f\xa6\x4b\xc5\x77\x70\x83\xe9\x59\x08\x93\xdc\xca\xb5\xdb\x00\xe0\xcd\xc1\x61\x7a\x37\x07\x07\x32\x66\x28\x71\x81\x7e\x3b\xe0\x53\x84\xf8\xc8\xd1\x51\xf2\xe2\xd9\xb3\xac\x7b\x84\x61\x0b\xed\x56\x7c\xa3\xee\x99\x06\x2d\x14\x10\xcb\xd3\xc2\x1f\xc2\xc7\x33\x23\x9f\xf0\x08\xec\xe7\xfb\x41\x1e\xef\x62\xc4\x29\xad\x2c\xff\xbe\xe4\x53\xfd\x21\x97\x6b\xe1\xb0\xdf\x25\x2a\x00\x9a\x7a\x31\xf4\x65\xd0\xa6\xb1\x2e\x1c\xbe\x95\xf5\xe4\xf8\x4d\xd8\x17\x75\x86\x18\xeb\x53\xc6\x9b\xe5\xaf\xfe\xbe\xb8\xa1\x0f\x0e\x3d\x2f\x84\x9f\x28\x50\x5e\x99\xe8\x4d\xe8\xbf\xca\xfe\xd1\x73\xee\x8b\x34\x89\xd0\x96\x57\x22\xf5\x66\xf8\x5f\xa5\x4d\xea\xf1\xfd\x45\x6a\xa5\x15\x2a\xaf\xdf\xee\xe2\xfc\x5f\xa5\xd3\xee\x2c\xcb\x22\x3d\x32\x67\xbb\xe2\xac\xf7\x7b\xf5\x7f\x45\xd3\x4e\x72\x4f\x4d\x80\x8f\x6d\xe0\x71\xa6\xf1\x14\xea\x42\x2d\x3c\x4f\x44\x19\x1d\x0a\xf2\xba\x5c\x61\x97\x0b\x5f\x87\x8c\x4b\x61\x2f\x0e\x62\xd1\x64\xfb\x57\xb8\xcd\x21\xff\x93\x53\x7d\xff\x3c\xac\x30\x90\x87\x33\x8c\x82\x64\x9a\x2f\x27\x5b\x39\x87\x67\xe1\x10\xe1\xcb\x97\xf0\x7c\xf8\x6f\x7f\xfe\x09\x5d\xd9\xe6\x42\x89\xac\xa6\x5d\xdd\xdd\x39\xe0\xdd\xf9\xfa\xf5\x06\xca\x26\x94\x4d\xa5\x1c\xa1\x3f\x17\x9f\x4d\x2a\x99\x6b\x6d\xee\x94\x12\x1f\x23\xcd\x07\x10\x23\x4d\x40\xf8\x0a\x3d\x36\xb9\x21\xe7\x3b\x19\xf4\x13\xc2\xb0\xd2\x0b\xd1\xba\x22\xa8\x91\x65\xa2\x7a\xfb\xf7\x2c\x47\x07\x62\xa1\x7a\x6f\xc8\xb5\x1a\xfc\x6e\x09\x08\x1a\x72\x75\x6e\xc8\xf1\x55\x2e\x79\x43\xbb\xf7\xb6\xc7\x43\x93\x7e\xcd\x75\x99\x21\xe7\x5f\x8a\xe8\x3e\xaa\x71\x1d\x6e\xcc\x41\x55\x76\x54\x65\x6b\x5c\xfe\x41\xfe\xe9\x27\xaf\xef\x66\x11\x2e\x67\x8c\xb8\x9c\x82\x45\xb2\x2c\x24\x71\xfb\x24\xa7\x8d\x52\x8d\x15\x0c\xf4\x0b\x56\x14\x33\x2d\x11\xa4\xb2\xff\xba\x1d\xa2\x38\xd2\xac\x10\xce\x12\xe4\x3b\xcc\x71\x16\x38\x9c\x54\xfa\x17\xcd\x90\x01\x26\x6e\x8b\x94\x69\xb0\xcb\x3a\x45\x72\x8a\xe3\xbf\x60\x90\x6c\xd7\x38\x98\x43\x2a\xeb\x1d\x7d\xd3\x76\x34\x0b\x8c\x06\x1d\x48\x11\x1d\xd1\x75\x31\x48\x59\x2f\x57\x90\x6c\x2e\x57\x0b\xe0\x00\x4f\x87\xff\x17\x00\x00\xff\xff\xa7\x8a\xce\x8c\x9c\x8e\x00\x00") - -func asset_stat_trustlines_1HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_1HorizonSql, - "asset_stat_trustlines_1-horizon.sql", - ) -} - -func asset_stat_trustlines_1HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_1HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_1-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1c, 0xc8, 0x89, 0x76, 0x6f, 0xc3, 0xe9, 0x72, 0xcd, 0x1a, 0x85, 0x5f, 0x76, 0xc8, 0x79, 0xc2, 0xed, 0xdd, 0xeb, 0xcb, 0xe2, 0x5d, 0xec, 0xf4, 0x1b, 0xf0, 0xf5, 0x5d, 0xd5, 0x2a, 0xf4, 0x54}} - return a, nil -} - -var _asset_stat_trustlines_2CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x59\x93\xe2\xb8\xf6\xe7\x7b\x7d\x0a\x47\xbd\x64\x75\x90\xdd\x78\x5f\xaa\xa6\x6f\x84\x31\x06\xcc\xbe\x6f\x13\x13\x15\x92\x2d\x1b\x83\x37\xbc\xb0\xfd\xe3\x7e\xf7\x09\xcc\x66\x48\x43\x92\x90\x75\xfb\x4e\x4c\xf9\xa1\xbb\x12\x1f\x9f\xf3\xd3\x4f\x47\x47\x3a\x92\x2d\xfd\xf9\xe7\x97\x3f\xff\xc4\x9a\x6e\x10\x1a\x3e\xea\xb4\xaa\x98\x06\x42\x00\x41\x80\x30\x2d\xb2\xbd\x2f\x7f\xfe\xf9\x65\x7b\x3f\x1f\xd9\x1e\xd2\x30\xdd\x77\xed\x93\xc0\x02\xf9\x81\xe9\x3a\x98\xf0\x17\xfb\x17\x91\x90\x82\x6b\xcc\x33\x7e\x6e\x1f\xbf\x10\xf9\xd2\x91\xbb\x58\x10\x82\x10\xd9\xc8\x09\x7f\x86\xa6\x8d\xdc\x28\xc4\xfe\xc6\xf0\x1f\xf1\x2d\xcb\x55\x67\x6f\x7f\x35\x35\x0b\xfd\x34\x9d\x9f\xa1\x0f\x9c\x00\xa8\xa1\xe9\x3a\x3f\x03\x14\x6c\xf5\xbe\x15\x56\x2d\x73\xab\x1a\x39\xaa\xab\x99\x8e\x81\xfd\x8d\xbd\xf4\xba\x05\xfe\xe5\xc7\xc1\xb6\xa3\x01\x5f\xfb\xa9\xba\x8e\xee\xfa\xb6\xe9\x18\x3f\x83\xd0\x37\x1d\x23\xc0\xfe\xc6\x5c\x67\xaf\x63\x82\xd4\xd9\x4f\x3d\x72\x76\xb6\xa0\xab\x99\x68\x7b\x5f\x07\x56\x80\xce\xcc\xd8\xa6\xf3\xd3\x46\x41\x00\x8c\x58\x60\x09\x7c\xc7\x74\x8c\x9d\x88\xef\x2e\x7f\x06\x48\x8d\x7c\x33\x5c\x6f\x95\xeb\xfa\x8f\x3d\x01\x08\xf8\xea\xe4\xa7\x07\xc2\x09\xf6\x37\xe6\x45\xd0\x32\xd5\xd7\x2d\x63\x2a\x08\x81\xe5\x1a\x3f\xbe\x7c\xc9\xb7\x1b\x4d\x4c\xa9\xe7\xe5\x21\xa6\x14\x30\x79\xa8\x74\xba\x9d\xbd\xe4\x5f\x91\x67\xf8\x40\x43\x13\x33\x08\xe1\x3a\x40\xf3\x1f\x37\xa5\x03\xd5\x9b\x47\xae\x1f\xd9\xc1\x7d\xc2\xc8\x59\xdc\x23\x69\x21\xcd\x40\xfe\x3d\x92\x5b\x9c\x3a\x42\x77\x4a\xde\x21\x06\x51\x10\xba\xba\x8e\x7c\xd3\xd1\xd0\xea\xb6\x2c\x50\x55\x37\x72\x42\x08\x2c\xe0\xa8\x28\xf8\xf1\x45\xac\x76\xe5\x36\xd6\x15\x73\x55\x39\x21\xdd\xa8\x57\x47\x29\xf4\xba\xfe\x1a\x8b\xb5\x4b\x8d\x7a\xa7\xdb\x16\x95\x7a\x37\xf1\xd0\xb9\xe0\x4f\x6f\x86\xd6\xf7\xe8\x0f\x57\xef\xab\x3e\xca\x7c\x40\xab\x8e\xee\xc0\x9c\x14\xbb\x5f\xb7\x1f\x05\xa1\x65\x3a\x28\xb8\xa5\xf9\x28\x74\xb7\xde\x2d\x0a\x14\x47\x83\x1b\x7a\x4f\x42\xf7\xeb\x3d\xba\xfc\x2d\xbd\x47\xa1\xbb\xf5\xee\xe4\x4d\x47\x77\x6f\xe8\x3d\x09\xdd\xad\xd7\x8b\x60\x10\xc1\x1b\x3a\x77\x02\x1f\xd1\x67\x99\xc1\x64\x1e\xa1\xe8\x16\xb3\x49\xb1\xfb\x75\x23\xe4\xdf\xa2\x35\xbe\x7f\xb7\xb6\xb8\x19\xdf\x52\xb7\x13\xb8\x5b\xdf\x2e\x2a\x4d\x10\xd0\x6e\xab\x3d\x93\xfb\xc5\xda\xf7\x91\x12\xcd\x7f\xde\x69\x06\x02\xe7\x86\x72\x08\x9c\xbb\x01\xef\xa3\xdf\x2d\xac\x07\x91\x8f\xea\xdc\x8e\x01\xde\x57\xbb\x95\xda\x6b\x8e\x65\x2f\x15\xa7\x86\xdc\xdb\xb2\xc7\xd0\xf8\x9e\xd8\x29\xd0\xbd\x23\x79\x0c\x5c\xb7\xe5\x4e\x81\xe8\x1d\xb9\x63\x60\x79\x57\xee\x2e\x7c\xa7\x80\x72\x5b\x6e\x17\x24\xde\x95\x39\x36\xf9\x77\x24\xb7\xed\xf8\xb6\xc8\xae\x6d\xde\x96\x39\x6b\x0a\xb7\x45\x21\x70\x6e\x0b\x1c\x5c\xf5\x2e\xa9\xad\xe7\xed\x05\xe5\x61\x57\xae\x77\x94\x46\x3d\x29\x6c\x79\x46\x30\xb7\xf6\x12\x1d\xa9\x24\xd7\xc4\x37\xba\x7e\x7c\xd9\x8d\x8d\xeb\xc0\x46\xdf\x0f\xbf\x61\xdd\xb5\x87\xbe\xef\x1f\xf9\x81\x75\xd4\x09\xb2\xc1\x77\xec\xcf\x1f\x58\x63\xe9\x20\xff\x3b\xf6\x67\x3c\x64\x96\xda\xb2\xd8\x95\x0f\x9a\x0f\xfa\xbe\x9c\x69\x3c\xbf\xb9\x57\x2c\x35\x6a\x35\xb9\xde\xbd\xa1\x79\x27\x80\x35\xea\xe7\x0a\x30\xa5\x83\xbd\x1c\xc6\xb7\x87\xdf\x82\x58\xc9\xcb\xa5\xe5\x43\xf1\xf7\x36\x8f\x0c\xbd\x5b\x9e\x33\x2e\xeb\x8d\xee\x05\x9f\xd8\x40\xe9\x96\x8e\xb0\x92\x03\xda\x33\xf3\x27\x2d\x17\x40\x3e\x52\xf8\x37\x4a\x62\x02\x9a\xd5\xac\x67\x6c\xb3\x18\xcf\x77\x55\xa4\x45\x3e\xb0\x30\x0b\x38\x46\x04\x0c\x14\xd3\x70\xe7\x00\x7c\x2b\xa6\x21\x1d\x44\x56\xf8\x33\x04\xd0\x42\x81\x07\x54\xb4\xcd\x26\x5e\x2e\xee\x2e\xcd\x70\xf2\xd3\x35\xb5\x44\x82\x70\x56\xd8\xa4\x43\xee\x8b\x19\xbb\xee\xa9\x90\x07\x07\x48\x23\x7c\xe7\xe5\xc9\xa0\xfb\xed\x0b\x86\x61\x87\x5f\x4c\x0d\x53\x27\xc0\x07\x6a\x88\x7c\x6c\x01\xfc\xb5\xe9\x18\xdf\x18\xf6\x8f\xb8\x6e\xea\xbd\x6a\xf5\x35\x96\xde\x3e\xe8\x00\x1b\xa5\x08\xf3\x7c\x9a\xf0\x02\x58\x51\x9a\x34\x41\x90\x97\xe2\x16\x08\x42\xdb\xd5\x4c\xdd\x44\x1a\x66\x3a\x21\x32\x90\x7f\x14\xf9\xf2\xc7\x65\xdd\x1f\x5b\xf1\x93\x5c\x04\x0f\x11\xb1\x4f\x04\x30\x68\x1a\xa6\x13\x5e\xdc\x0c\xd0\xdc\x89\xec\xf4\x7b\x4e\x64\x07\x11\x44\x4e\xe8\x6f\x53\xc1\xcb\x62\xee\x64\x4c\x47\xb7\xc0\x36\x63\xd4\x50\x10\xa6\xc3\xd9\x09\x4e\x5c\x1b\x69\xae\x0d\x4c\x27\x45\x8a\xa6\x2f\x41\x87\x13\x1f\x05\x13\xd7\xd2\x02\x2c\x44\xab\x4b\x64\xba\x05\x8c\x6b\x88\x6e\xd6\xcd\x9e\x91\x68\x6b\xd5\x32\x01\x34\x2d\x33\xdc\x16\x6e\x57\xfe\x03\x25\x96\x75\xeb\xb6\x69\x38\xdb\xb1\xd0\x16\xd6\xee\x97\xc4\x68\xe0\x38\xb4\xd8\x93\xfe\x33\x4e\xab\x31\xa9\x24\x4b\x15\xec\xdb\xb7\x43\x55\xfc\xeb\x6f\x0c\xff\xe3\x8f\x1b\x4f\x5f\x02\xbc\xd4\xf3\xa6\x00\xef\x69\x3c\xab\xcb\x0b\x6d\xe7\xf5\xfc\x9e\xa6\xb7\xf4\x5c\xa8\x4b\xe1\x6f\xa7\xf3\x6d\xc3\xd8\xf6\x7f\x8f\xb6\x89\xed\x90\x71\xd7\x1c\x1c\x57\x43\xc9\xb6\x70\xd6\x06\xde\x1a\x3d\xef\x9f\x1f\x35\x7f\x3e\x30\xde\x01\xd9\xff\x06\x82\x49\x02\x0c\xfb\xc6\xb7\x3d\x1f\x2d\xde\x15\x82\x91\x3a\x43\xa1\x65\x06\xe1\xbb\xa2\xc7\xd1\xf6\xc1\xdd\x77\x3f\xab\x96\x1b\xa0\xd0\xb4\xaf\xb4\xfc\x38\xb0\xa6\xb4\xad\x44\x9d\x9f\x0f\xea\x8f\xfa\x2e\xea\xfb\x64\xe7\x8a\xeb\x5c\xcb\x0d\xce\xd5\x9c\x4a\x71\xcd\x5b\xf6\x83\xaf\x47\x6b\x6c\x9f\x78\x7d\x3b\x36\x72\xe4\xdf\x19\x41\x77\x33\x2f\xda\xb5\x08\x1a\xbb\x3b\x08\x02\x14\xa6\xf1\xb9\x6b\xab\x57\x6f\x03\x7b\xdb\xac\xd2\x55\x7b\xbe\xa9\x22\xe7\x4a\x10\x8b\x6f\x5e\x8b\x70\xf1\x4d\x4c\x73\x23\x68\xa1\xad\xbf\xa9\x66\x3c\x23\xf9\xa9\x51\x34\x51\xc3\xfb\x94\x75\x57\x96\x8b\x7a\xdd\x17\xf0\x8a\x6f\xec\x9f\xdc\x33\x7c\xf1\xe8\x81\xf7\x6b\x0e\xb1\x1b\xb0\x3f\xea\x0f\xbb\xb4\x7e\xe7\x0e\xa6\x97\xd6\xf1\x33\x6f\x5a\xae\xeb\x87\x47\x36\xf2\x72\x41\xec\x55\xbb\x18\x7e\xd9\x6d\xa2\x55\x08\xc2\x10\xd9\x5e\x88\x6d\x9b\x45\x10\x02\xdb\xc3\xb6\x43\x26\x37\xda\xfd\x82\x6d\x5c\x07\xbd\xed\x6c\x75\x60\x5a\x91\x9f\xe8\x6a\xaf\x59\x08\xd7\x1e\x7a\xbf\x52\x76\xd3\x12\x09\xbd\x6f\xc3\xfe\xd1\xe2\x95\xda\xd9\xcf\x6c\xb8\xfe\x65\xa5\x7e\x8b\x99\xf8\x17\x86\xff\x81\x89\xf5\x3c\xb6\xfb\xf3\x7f\xfd\x8d\xb1\x0c\x43\x31\x7f\xa4\xd6\x55\x32\x0d\x7b\xb8\xca\x92\xb3\x3c\xc9\x98\x7b\x85\x8d\xdd\x44\xdb\xb6\xd5\xa5\x02\xda\xe6\x8e\x4f\x40\x09\x22\xb8\x07\xe1\xa3\xe0\xac\x03\xa2\x52\x47\x8c\x3e\x02\xc7\xb6\xf4\x16\x4f\x22\xe7\x7d\x14\x53\x62\xb2\xee\x8e\x9e\x71\x07\x6c\x1e\xa0\x5b\x3d\xcc\x5b\x9c\x89\x1c\xfe\x51\x9c\x27\x15\xf7\xe3\x7c\xd3\xc9\x5d\xdc\x47\xce\x02\x59\xae\x87\xde\xe9\xd2\x4e\xa6\x9f\xe8\x88\x12\xd3\x1d\x4f\x50\x70\x98\xaf\xfd\x76\x4f\x3d\x9c\xbc\xe8\x3d\x22\xe6\x57\x3a\x9a\x73\x12\x0e\xf3\xc0\x67\x1a\x2f\x89\x38\xb3\x76\x95\x8c\xd3\x1c\xd1\xc3\x64\x9c\x26\xc5\xbf\x9d\xda\xed\x79\xf2\x96\xd2\xa6\x6e\xb5\xee\xc4\x0c\xd7\xa3\xa8\x12\x4b\x00\x8f\xa4\x5d\x71\x8f\x7f\x23\x52\x9b\x41\x10\x21\xff\x7e\x55\xaa\xab\xa5\x66\xa7\x6f\x68\x09\x2d\xd3\x36\xaf\x8c\x28\x6e\xe6\x82\xff\x64\x56\x95\xf0\xce\xc4\xaa\xca\x43\x59\x54\xf2\xf9\xcf\xca\xa3\x12\x3a\x1f\xcf\x7f\x6e\x69\xdd\x55\xda\x85\xa6\x7d\x4d\xfe\x2b\xbd\xe1\x9d\x4d\xf7\x3e\xec\xe4\xc9\x35\xb4\x9d\x9b\x87\xab\xb3\x50\x7c\x47\xbe\x71\xe9\x80\xab\x78\x95\xf2\xea\x5d\x75\x02\x1c\x03\xa5\x26\xf6\x49\x72\x92\xcb\x76\x8f\xc7\xea\xd3\xdc\xf9\xe3\x14\xfd\x87\xf9\x81\xae\xb6\x4e\x23\x27\x5c\xf9\x28\x88\xac\xd4\xe8\x1e\xae\x6c\xf4\x6e\x3e\x77\x5a\x62\x7d\x9c\xcf\x8b\x75\x8b\x47\x49\xbd\x58\x71\xfe\x76\x17\x71\xfb\x87\x6e\xb1\xb7\x17\x49\x23\xe2\x3e\xb7\xbb\x58\xe1\x7e\x84\xa8\xfc\x36\xb3\xd6\x5d\xff\x9d\xc9\x50\x2c\x2f\x76\xc5\x77\x38\xbb\xad\x32\xf8\xb0\x3e\xa5\xde\x91\xdb\x5d\x4c\xa9\x77\x1b\xa7\x49\xc5\xbe\x58\xed\xc9\x1d\xec\xdb\x4b\x31\xd7\x6e\x8e\x4a\x4a\x95\x94\x14\xaa\x50\x6f\xd1\xb9\x61\xb5\x50\xab\xe7\xab\x85\x72\xaf\xde\xec\x91\xa5\x11\x35\xae\x15\x3a\xa5\x46\xbd\x27\xc9\x0d\xb1\x33\xe0\x5a\x12\xd7\x18\x92\xa5\x97\x57\x4c\xd8\x5d\xdc\xfe\xff\x3c\x8e\xbf\x62\xe4\x2b\x86\xbf\xee\x58\xc6\x5e\x5e\x5e\xb1\x17\xb1\x25\x8a\xa2\xf8\xf7\xdf\x2f\xf1\x0d\xf2\x70\xef\xf4\xdf\x3f\x7e\xbc\x87\x50\x22\xa9\x56\x81\x2c\xf5\x64\x86\x14\x6b\xc3\x5e\xa1\x57\xa2\xc4\x51\x59\x1c\x0e\x8b\xc3\x61\x9f\xec\x97\x86\xa3\x51\x9b\x95\x47\x43\xb9\xdb\xac\xe4\x87\xe3\x8e\x38\x60\xb9\x61\x83\x7e\x79\xc5\x08\xfc\x78\xbd\x62\x3c\xc3\x0b\x02\x45\x33\xc2\x2f\xc1\x38\xac\x14\xd9\x76\x9d\x6e\xd4\x15\xb9\x29\xd5\xea\x85\x1c\x47\x91\x22\x4d\xb1\x63\xa6\x59\xcf\x77\xda\xd5\xe2\xa0\xc2\x15\x73\x55\xa9\xd6\xaa\x2a\x85\x06\xdd\xe1\xe4\xd1\xa0\xdf\x3b\xb1\xc8\x9f\x41\xa4\x5f\x31\xe2\x06\x44\x3a\x15\xe2\x15\xc7\xb9\x9c\x70\x7b\xc2\x07\xaf\x4f\xa3\x7d\xd4\x11\xcf\xa7\xd2\x8e\x3c\xb2\x94\x26\xf0\x3a\x43\xb1\x08\xb1\xbc\x46\x40\x92\x83\x0c\xe4\x05\x9d\xa4\x80\xce\x50\x04\x01\x39\x86\x15\x00\x49\xeb\x40\x27\x68\x9c\x02\x1a\x0e\x19\x12\xb2\x14\x05\x71\x0e\x22\x41\xd8\x52\x85\x3f\x79\x6d\x75\x30\x1c\x09\x48\x44\x91\xba\x4e\xd2\x3c\xc0\x39\x88\x23\x0e\xd7\x35\x42\x67\x35\x8a\xe0\x55\x42\x07\xaa\x46\xe2\x90\x55\x55\x9c\x57\x29\x4a\x63\x38\x8e\x21\x19\x81\x67\x79\x82\x64\x00\xc1\xbe\xc4\xf5\x87\x6f\x2b\xee\xbf\xf6\xca\x0d\x2b\x26\xbd\xce\xae\x3b\x95\x1c\x97\x77\xf2\x42\x89\xc4\x57\xd3\x5c\x26\xc0\x8d\x30\x58\x2a\xcb\x0d\x31\xd4\x3a\x83\x11\xc8\x95\x41\xc1\xd8\xca\xcb\x75\xba\x0a\x36\x1e\xd9\x7a\x57\xf3\x58\x1c\x12\x74\x2c\x96\x9b\xfd\x07\x0a\xf2\xa9\xd7\xcb\x45\x5b\xbf\xe2\xa8\x14\x8b\x0b\x88\x61\x04\x15\x09\x14\xc5\x40\x8a\x43\x04\x47\x43\x9a\x56\x19\x9e\x84\x1c\x49\x68\x94\x4e\x10\x9a\x4a\x23\x48\x0b\x1a\xc2\x91\x0e\x59\x8e\xd4\x39\x16\xd2\x04\x14\x10\x52\xb7\x4e\xf6\x19\xce\xce\x0a\x90\x24\x49\x16\x21\x92\xa6\x68\x8e\xe6\x78\x40\x70\x84\x4a\xd3\x2a\xcf\x71\xbc\x46\xeb\x14\x2d\x30\x3a\x04\xb4\x00\x00\xaf\x51\x2c\x4e\xf1\x80\x42\x88\xe5\x68\x06\x6a\x3a\x05\xe1\x4b\x1c\xef\x08\x86\x11\x18\x4e\xe0\x19\x6a\xef\xb1\x12\xd9\x1c\x4f\x89\x7a\xc4\xb8\x38\x2c\x73\x03\xda\x59\x37\x16\xbd\x55\x91\xea\x7b\xee\x2c\xb3\x28\x88\x8d\x50\x22\x2a\x64\x8d\xcb\x71\xec\x38\x62\x4a\x82\x5a\xd2\xf0\xb9\x18\x8c\xa7\x42\x8b\x1d\xf1\x6b\x45\x51\xd9\x28\x9c\xe9\x59\xa9\x91\xa9\xda\x59\xbc\x02\x03\xdd\xdf\x34\x7b\x31\xc3\xc3\x66\xbf\xb6\x89\xbd\x43\x39\xfe\x67\x17\xde\x82\xd3\xdf\x4b\xb1\xd9\xda\xfb\x4e\x13\x6f\x4e\x3b\x54\x5b\xe7\x26\x01\xbf\xea\x2b\x39\x83\x34\xf8\x55\x65\x31\x6f\x34\xb2\x4e\xd6\xc8\x0e\x97\x46\xb3\x9d\x2d\xe5\xb8\x39\x12\xbc\xc0\x2c\x47\xf4\xac\x5e\x6a\xd3\xee\xb0\x24\x77\x15\x8d\x26\x9a\xf5\xf2\x90\xf3\xca\x73\x17\x27\x45\xda\xcd\x30\x4e\x1b\x52\x9b\x68\x19\x9b\x4a\xf1\xe8\xbc\x92\xe6\x15\x07\x8f\xce\xe3\xe5\x5f\xe8\x7b\xbf\xe6\xba\xd3\xa3\x09\x92\x63\x35\x8a\x56\x01\xc5\x92\x02\x23\x30\xbc\x4e\x33\x3a\x4b\x68\x88\x61\x19\x01\x22\x1a\x11\x00\x6a\x9a\xa0\xb1\x2c\xcd\x30\x40\x53\x09\x0a\x09\x48\xc5\x69\x1e\xa9\xac\x4e\x6a\xdb\x90\xf7\x29\xad\x42\xc0\x35\x5c\xa3\x74\xc8\x0a\x0c\xe4\x10\x4e\x41\x46\x25\x35\xc4\xf1\x04\xe2\x00\xcf\x53\x82\x4a\xf0\x90\xd4\x68\x95\x23\x28\x1d\x92\x88\xe4\x74\x92\xd7\x04\x20\x08\x24\xcf\xe2\x02\x4b\xbd\xbc\x62\x54\xc2\xa3\xe9\x83\x47\x6f\x46\x65\xa6\xef\x34\x66\x9b\xc1\x46\x9f\x68\xd5\x76\x6d\x20\x85\xeb\x52\x97\x6f\x53\x32\x8b\x3b\x28\xbf\x08\x9d\x2a\x05\xf0\x22\xc3\x05\xd2\x80\xdd\x0c\x96\x4b\xb7\x22\x74\x33\x65\xbb\x9d\x65\xdc\x76\x57\x9e\x54\xcb\xdc\xd2\x2a\x19\x2c\x90\x86\x24\x5f\xf3\x2a\xe1\xb0\xbc\xda\xb9\x68\xec\xd1\xc6\x89\xf1\x6a\xb5\xd2\x84\x35\x77\x5a\xca\xb4\xdb\x99\x6e\x27\x97\xaf\x14\x73\xd9\x30\xd2\x4b\xa4\x5d\x25\x48\x55\x95\x4a\x3e\x51\x76\x48\x6e\xdd\x94\x5a\x78\xbd\xc9\x81\x7e\x98\x11\xb9\xa1\x44\x39\x06\x42\xae\xc1\x2c\x47\x41\xd8\x2d\xc9\xd9\x20\x2a\x67\x2b\x75\xdb\x9b\xb9\xa3\xf2\x28\xf6\xd8\x5a\x8a\xc7\xca\x41\x5a\xad\xff\x7f\xe0\xb1\x80\xc2\x75\x04\x09\x82\x66\x74\x8d\xa2\x18\x1a\x68\x0c\xd0\x55\x4e\x63\x20\xa1\x0b\xb4\x86\x33\x90\xd5\x54\x1d\x20\x15\xe2\x3c\x81\x6b\x1c\xa1\x23\x40\xe8\x08\x91\x1a\x0b\x59\x9c\x21\xb7\xde\xf6\x19\x5e\x0f\x74\x4a\x67\x09\x5a\xe3\x69\x92\x81\x3c\x41\x13\xaa\x4e\xe2\xaa\x0a\x10\x4d\xa8\x04\x2d\x10\x24\xc5\xd0\x02\x14\x58\x5d\xc7\x29\x46\x80\x10\x92\x04\x0f\x59\x9e\x22\x35\x5e\x23\x50\x8c\x83\x4e\x78\x2c\x73\xf0\xd8\x55\x99\xc4\xf1\xf5\x74\xe4\x0d\xfa\x53\x7c\x48\x96\x50\xdf\xb2\x33\xdd\xc9\x5c\x20\xb5\xf1\xac\x0f\xa8\x5c\xd3\xe3\xc4\x4e\x63\xb5\xa8\x0e\xe6\xfc\x84\xcf\x43\x6b\x91\x59\xae\x11\x3d\xd1\xda\x41\xb4\x16\xf0\x11\x65\x4a\x4d\xa0\x7b\xdc\x8a\x04\xa3\x0a\x1a\x36\xe7\x0e\xb7\x90\x63\x86\x63\x8f\x5d\x9e\x18\xa7\x28\xd9\xae\x94\x97\xd4\x00\x58\x99\x46\x6f\x08\x06\xcc\xc8\x2e\x37\xc2\x80\x89\x0c\x44\xcc\xec\x75\x9b\xd5\x72\xab\x55\x25\x30\x2c\x72\xd1\x24\x0b\xf5\x89\x34\xa0\x0b\xb9\xcd\x3a\x5f\xf3\x67\xa5\x5c\xa7\xad\x10\x1d\x68\x2d\xf8\xfc\x00\x46\xeb\x62\x15\xe4\xab\x23\x1c\xf5\xe2\x16\xd1\x4a\xf1\xd8\x62\xea\x10\xe2\xff\x75\x8f\xbd\x32\x66\x4e\x59\xc1\x7c\x62\x04\xfe\x76\xf9\xeb\x19\x65\xd7\xd6\x67\x9e\xd3\x79\xb9\xc4\xf2\x84\xb6\x2b\x0b\x24\x4f\x68\xbc\xb2\x94\xf1\xd1\xfc\x25\xb1\x9c\x91\x48\x02\x2b\xbd\x5a\x7f\x50\x95\x2a\x65\x76\xd0\xae\xb4\xfa\x6c\x57\x91\x2b\xad\xa2\xdc\xe3\x06\xe5\x72\xa9\xd8\x19\x30\x6c\x57\xac\x57\xea\x8a\x54\x1b\xe5\xe4\x61\xb5\xd3\x1a\xd4\x3a\x8d\xd1\x6e\x0c\xb6\xcb\x14\xca\xfd\x62\x3f\x08\x3a\xb3\x4c\x58\xe8\x55\x32\xb6\x61\xba\xc5\x72\x57\x98\x79\x0d\xd0\x8f\x32\x76\x6e\x6e\xbb\xf2\x46\xec\x0c\x87\x95\x82\x7d\xf2\xbe\x78\xc8\x22\xc5\xff\xdc\xb6\x2c\xd9\xe4\x66\x3a\xb1\xd4\xa8\x8e\x2b\xad\xec\x26\x91\xf7\xa6\x1b\xc5\x98\x6c\xe6\x2c\xd9\xce\xf2\x0a\x47\x47\x30\xdb\xf2\xa2\x55\x66\x51\x13\x76\xa3\x74\x55\xe8\x6d\xea\xf1\xf3\xc6\xf1\x3f\xb9\x58\xe9\xf2\xf8\x77\x5e\x14\x05\x29\xd1\x70\x73\x46\xa3\x2f\xcd\xe9\x52\xa3\xdb\x5d\xb4\x6d\x5f\x90\x04\xd4\xaa\x67\x73\xab\xac\x46\xb9\xc5\x5c\xa5\x47\xd5\xc7\xd3\xa8\xcb\xcd\xb3\x9d\xea\x4e\x9d\x5a\xe1\xc7\x78\x4e\xf2\x26\x99\x51\x89\x6a\xb9\xab\xe1\xb4\xaa\x33\x21\xa1\x71\x62\x91\xcf\x2c\x86\x4d\xc1\xcc\x76\xb3\x33\x8f\x25\x60\x6e\xa0\x16\x8b\x0b\x96\x0a\x43\x63\x36\x9e\xf6\xda\xca\xbc\x39\xcb\x71\x15\x48\xe1\xb5\xd6\xbc\x6f\xb2\x23\x5a\xd9\x0c\x0d\xd7\xa7\xb2\xb9\x6d\x4a\x7c\xd1\x5b\x7c\x72\xd5\x50\x4f\x55\x4d\xed\xbc\x6a\xf2\x62\x19\xfa\x75\x98\x97\x0c\x9f\x68\xd2\xf6\xb8\x94\xb5\x27\x85\x5a\x47\x0e\x9c\x85\xd4\x43\x79\xcf\x2d\xeb\x70\xb9\x9e\xcd\x09\xd5\x29\x9e\xaa\xa6\x71\x11\x6d\x3e\x4c\xfd\x70\x33\x9a\xcd\x44\x76\x46\x73\x65\x69\x85\xe7\x5b\xcb\x32\x49\x58\xfc\x92\xeb\xe6\x59\x77\x35\xd4\x41\x49\x94\x6a\x01\x5c\x6f\x46\xa6\x1b\x2a\xf3\xa5\x5b\xc8\x6a\x33\x9d\x35\xc8\x2c\x72\x5a\xed\x4d\x6f\xb1\x28\x74\xec\x5e\x6b\x9e\xb7\x97\x0d\x6a\x44\x91\xb4\x20\x0d\x6b\xd2\xf2\x97\x53\x4f\x3f\x45\x7d\xeb\x82\x7a\xc9\x5f\x97\x96\xf5\x68\x90\xe5\xf2\x65\xce\x2c\x10\xc5\x35\x57\xa5\xda\x53\xa4\x28\x82\x97\x71\x16\xa5\xb1\x67\x78\x8c\x9a\x99\xeb\x11\x7f\xa2\xbe\xf9\x2c\xf5\x8a\x67\xcf\x6a\x33\xa1\x4a\x84\x45\xa4\xe0\x79\x35\x2b\x0f\xca\x02\x11\x84\x03\xdf\xa6\x04\xd6\x2b\x8d\x16\xda\x4a\xe3\xa1\x58\xee\xf1\x95\x2a\xaf\x15\x15\x7a\x89\x0b\xa1\xa7\x76\x5c\x66\x38\x71\x8c\x46\x69\xd4\xe8\x95\x1a\x7d\xd7\x1c\x59\xa3\x7c\xb8\xae\x47\x6c\x43\x10\xf7\x5e\x7f\x3d\xc4\xa5\x2d\x55\x3e\x10\xe2\x0e\xcb\x95\xc7\xca\xe4\x71\xc4\xd0\x24\x80\x3c\xa1\x22\x5a\xa3\xa0\x46\x08\x00\xea\x34\xa9\x33\x88\xc6\x35\x5d\x25\x54\x4e\xe7\x38\x0e\xe0\x2c\x4e\x03\x86\xe2\x28\x46\xe0\x11\xa2\x75\xb8\x95\xe2\x21\x9e\xac\xd4\x98\xe4\xdd\x70\xc4\xea\x8d\x07\xeb\x55\xa5\xcb\xe2\xfd\x96\xcf\x02\xa9\x62\x8c\xac\x26\xd9\x99\x31\xde\x80\x63\x47\xc5\x39\x30\xba\xb5\x5c\x59\x53\xdd\xc1\xe8\xbd\xee\xf6\xca\xd2\xe4\x87\x0b\x7f\x5a\x9e\x3c\x16\x7e\xef\xda\xc0\x57\x27\xe6\x62\x7f\x33\x79\x6d\xc7\x82\xff\x13\xcf\x2d\x7f\xdd\x7f\x0e\xf8\xf5\x3b\x46\xec\x66\x9b\xbf\x06\xc8\x5f\x20\xff\xeb\x77\xec\xeb\x82\x20\xfe\x22\xfe\xc2\xbf\xee\x6f\xa8\x91\xef\x23\x27\xac\xc6\x63\xdc\xaf\xdf\x31\xfa\xfc\xf7\x5c\xfc\x4e\x58\xf0\xf5\x3b\xf6\xbf\xbf\x1c\x0c\xfd\xcf\x97\xa4\xd9\x58\x72\xab\x58\x87\x04\xcd\x43\x80\x00\x54\x79\x86\xe4\x01\x4e\x11\xac\x00\x34\x80\x54\x95\x47\x02\x20\x58\x84\x08\x8a\x61\x75\x56\x63\x48\xc0\xd0\xb8\xc0\xe0\x02\x4e\x12\x0c\x50\xa1\xce\xe8\xb8\xba\x47\x74\xd4\xeb\xa0\x55\xf8\xf5\xfb\x85\xb5\x5d\x61\xb6\x65\xff\xfa\x1d\xc3\xcf\x6e\xfd\xfb\xe2\xf9\xc0\x01\xde\x16\x17\x83\x04\xc8\xaa\xba\x40\xa9\x94\xc6\x71\x14\x8d\x73\x3a\x0e\xb5\xad\x73\x20\x5e\xc3\x49\x00\x28\x00\x69\xc4\x22\x16\xd0\x2a\x4b\xe8\x38\x41\xb2\x38\xce\x23\x5a\xe5\x54\x9d\x83\x3a\xfe\xf5\x4b\x8a\x85\x2b\x1c\x20\x9d\x22\x00\x89\x03\x6a\xeb\x77\x1c\xa5\x22\x92\x24\x39\x06\x01\x9e\xe0\x38\x8e\x67\x21\x50\x19\x9a\x65\x58\x9d\xa2\x34\x55\xa5\x75\x4a\x47\x2a\x8b\x6b\x0c\xa3\x69\x3a\xc1\x52\x9a\xf0\x71\x0e\x88\xd7\xb7\xf7\xdc\x28\xf4\xa2\xf0\x73\xcb\x7e\x8b\xe1\x67\xa7\x3c\x3f\xc2\xf0\xd3\xb6\x7e\x91\x97\xfd\xe6\xe0\x37\x07\xbf\x39\xf8\xcd\xc1\x6f\x0e\x7e\x73\xf0\x9b\x83\xdf\x1c\xfc\x42\x0e\xe2\x7f\xfd\x9f\x2f\xff\x7e\x93\xfe\xa6\x24\x0d\x16\x08\xc2\x40\xf5\xe2\x2f\x2f\xd2\xae\x97\x43\x3a\x14\x4f\xb2\x48\xfd\xb6\x05\xab\xb2\xd7\xf4\xdb\x7d\x69\xe1\xb9\xca\x3c\x67\xf6\xb2\xe3\x4a\xd7\xb6\xe0\xc2\x33\x80\x37\xcf\xd5\x96\xb2\x45\xac\x27\xe3\xd3\x7a\xc3\x2e\x87\xa2\xf3\x56\x6b\x1e\xe5\x36\x33\x9c\xc3\xc7\xf3\x6c\x6b\x31\x9c\xe5\xf5\xa5\xaa\x53\x1a\x9b\x33\x3a\x56\x7d\x33\x18\x71\xb3\x0c\xbb\xc0\xcd\xe5\x31\xfd\x2a\x9b\x4f\xe6\xc4\x8f\xa4\x6f\x39\x71\xe6\x80\xf6\x3c\x57\xcd\x95\xd7\xe5\xa6\x56\x9b\x4d\x73\xc0\xcb\x0a\xd9\x71\x57\x9a\x2f\x6d\x4d\x34\xaa\x00\x20\xdb\x2f\x8e\x0d\x26\x9f\x63\x5b\x83\x8d\xb6\x11\x35\xbb\x1b\xba\x93\xe5\x28\x30\x99\xf6\xa0\x54\x67\xe5\xcc\x26\xbb\x1e\x96\x8a\xb6\xcc\xe8\xaa\x53\x2e\x87\xd3\x53\x3a\x29\x8d\x9e\x9c\x0d\xcf\x3d\x32\xe7\xd0\x2a\x97\xc9\x19\x30\x3a\xcb\x8e\x6a\x76\xa9\x6e\x59\x59\x0e\xe6\x7a\x56\x27\x7b\xcb\x79\x50\x76\x5a\x8a\x44\xda\x8e\x37\x5f\xd9\xa3\x46\x6b\x89\x66\x85\x80\x52\x97\xa5\xf1\x8c\x03\x8a\x5a\xac\x2a\x51\xaf\x3f\xd9\xa0\x49\x33\xc8\xf2\xd6\x6a\xe5\x4d\x1a\x43\xaa\xbc\xee\xc0\xd1\x52\x8e\xe1\xcc\xb3\x26\x5e\x88\x00\xdf\x52\x4d\xd8\x29\x49\xdd\x2e\xbb\xea\x67\x9d\x29\x25\x0e\x14\x4a\x56\xea\x80\x0d\x6a\x25\x6a\x63\xcb\xbd\xa9\x20\x12\x78\xd3\x13\x75\x8b\xae\xac\x2b\x4a\x7f\xa0\xad\x82\x2c\x45\xd5\x59\x7a\xca\xf6\x4d\x40\x90\x84\xaa\x0f\x88\x4c\xd9\x97\xd9\x5c\xeb\x49\x7f\x33\x8e\xff\x5c\x3e\xbb\xfa\x10\x5f\xa3\x8f\xf9\x6f\x4b\xaa\x8c\xbd\x7c\xb9\xd9\x11\x60\xdb\x31\xeb\x22\xd5\x5c\x15\x4c\x5d\x83\xd5\xfe\x9c\x09\xb3\x68\xde\x26\xab\x94\x3a\xd4\x8b\x4b\xa9\xdf\x94\xcc\x6c\xa9\x6d\x36\x6a\xf5\x26\x04\x43\x79\xde\xe8\xd3\x63\x3a\x3f\x21\xf3\x56\x6e\x63\x01\xc5\x2e\x0f\x44\x4e\x9d\xc2\x68\xba\xd8\x4d\x6f\xe6\x64\x07\x76\xbb\x95\xba\x69\x8d\x07\xcd\xb6\x3e\xd2\x98\xc1\x00\x32\x8d\xa2\x4f\x8d\x09\xbb\xdd\xf7\x55\x39\xe3\x04\x39\x85\x2b\xf2\xe1\xe8\xe4\x2f\x15\x76\x8a\x4c\x6a\x6a\xbb\x0a\xdf\x2d\x5a\xf9\x2c\x32\x54\x8a\x6b\x0e\xc3\x52\xa5\xb2\x19\xf4\xf9\x65\xdf\x1c\xe7\x80\x14\x31\x55\x26\x9e\x13\x1c\xc7\x0f\x25\x66\x6e\xc5\x0b\xff\xdb\x91\x12\xff\xdd\xef\xd7\x77\xc4\x89\x12\x11\xe5\xb4\x92\xdb\x8d\x8c\xda\xa2\x15\xe6\xb9\xdc\x44\xa9\x52\x75\x24\x68\xfd\xa6\x5e\x54\x32\x65\x93\x29\x2f\x7a\x8d\xcc\x58\x0c\x39\x2a\x7b\xbc\x4e\xfa\x8a\x47\xfb\xad\x82\xc7\xfb\x41\x9e\x16\x23\xc2\x45\xe3\x59\xae\x4b\xb4\x4b\x4a\xb9\xbd\x5e\x0d\xc0\x1a\x44\x94\xce\xf4\xa6\x48\xc4\x97\x74\x06\xaf\x6e\xa6\x55\x79\x6d\x0a\x4e\xb1\x16\xf0\xc8\x12\x4b\xb4\x95\x9f\x4c\xf2\xe5\x95\x54\xe6\x4b\x93\x15\x2c\x66\x86\xdd\xac\x6a\xb7\x82\x88\x68\x25\xf0\x3f\x39\xbd\xf3\x5e\x5c\x3d\x6c\xce\xb4\xfb\xf2\x3b\x3d\xae\x12\xf8\x3d\x9a\x1c\x14\x2e\x5d\x7f\xe6\x81\x20\xf0\x26\x3e\x08\x50\x8a\xa6\x2e\x0a\x42\xac\x93\x2f\x60\xf5\x9d\x30\xf6\x03\xeb\x20\x2f\x44\x36\x44\x3e\x46\xe2\x04\x73\x8f\x21\xdd\xf5\x55\x14\xa8\x9e\xeb\x6c\xfb\x34\x0b\x44\x8e\x3a\xb9\x34\x14\x7f\x59\x7d\x57\xbf\x12\xcf\x17\xed\xdf\x5c\x0c\xd2\xcb\xbf\x9f\x8c\x0a\x4d\x3b\xee\x26\x5f\x2f\xe7\xa6\x4e\x7d\xea\xd7\x09\x08\xbe\x7e\xdf\x7d\xd7\xfd\x25\xd1\x8b\x7e\xd5\x11\xba\x4f\xd0\x06\xab\x70\x15\x98\x9b\x3b\xc5\x7d\x14\x4f\x88\xbd\x23\x7c\x7f\x17\x1b\x7f\x90\xa8\xed\x3f\x0c\x4a\xa1\xe2\xe9\xb5\xe2\xeb\x33\x8e\x57\x3e\x3b\xf8\xe8\x8c\x63\xe2\xd3\x83\xcf\x78\xad\x90\x78\xc5\x9e\x79\x73\xf2\xa5\xd7\xc9\xbf\xbc\x62\x02\x49\x52\x14\x47\xe2\x14\xcb\x33\x34\xc7\x31\x3c\xce\xc5\xaf\xb5\x11\x17\xef\x20\xde\x60\xe7\xda\x1b\xeb\x1f\xe6\x27\xf9\xd6\xfa\x29\x0c\x40\x4a\xe0\x11\xa4\x01\xe2\x05\x8e\x61\x29\x92\x61\x69\x4a\x05\x1a\x49\xa8\x02\x8d\x08\x0a\xea\x2a\xce\xd1\x90\x22\x29\x84\x78\x0a\x11\x34\x01\x75\x0e\x27\x00\xa3\x09\x38\xad\x13\x87\xf7\x9f\xce\x06\x61\xb5\x8b\x20\x9c\x33\xb3\x39\xbc\x8a\x97\x8b\xeb\x70\xb2\xac\x13\xd6\x08\x07\x6b\xcf\x25\x84\x7a\x69\xb5\xa8\x4a\xeb\x06\x13\xe6\x64\x55\xea\x2f\x96\x05\x61\x49\x19\xa1\xdf\x70\xc6\xe2\x1d\xd7\xd5\xf7\xe8\xe4\x8b\x4e\xe1\xe3\xf6\x47\xd9\x8c\x7a\xa1\xef\x4e\xfb\x6f\xd7\x74\xd2\x79\xd7\x05\x4e\x05\xba\x0e\x20\xaf\x12\x2c\x4e\x52\x80\xe2\x78\x9e\x26\x58\x46\x85\x38\xa4\x74\x9d\x00\x80\xd4\x80\x4e\xe3\x38\xae\x23\x9d\x16\x34\x92\x40\xba\xca\xd3\x9c\xa6\x41\x1d\x22\xb0\xe3\x9d\x7c\xcb\xfb\x3f\x54\xee\xcf\xe2\x9d\xa7\x4f\xcf\xa7\xbe\x49\xf6\x24\xef\x50\xa3\x79\x56\x83\x9a\x86\x93\x1a\xcd\xe2\x3c\xc1\xb1\x1c\xa1\xd2\x80\x01\x1c\x12\x34\x16\xf1\x2c\xa3\x02\x52\x50\x21\x4d\x20\x96\xd4\x38\x00\x74\x0e\x07\xa4\x8e\x10\x03\x29\x56\x43\xfb\xb7\xa3\x6e\xf2\x2e\x45\x2e\xe5\x86\x34\x33\x97\x9a\xf2\xca\x6b\x65\x29\xb7\x54\xcf\x6c\x08\xae\xbd\x36\x03\xc2\xd2\x6b\x85\x91\xdd\x1a\x18\x7e\xd4\xc9\x74\x63\xf9\x72\x4f\xca\xec\x0b\x65\x5c\xe3\xf6\x5d\xde\xf3\xcf\xd9\x6f\xa8\x8f\xd9\xbf\x97\x77\x9a\xe6\x59\x52\xe0\x11\x4e\xeb\x3a\x24\x74\x8a\x25\x71\x95\x21\x09\x9d\x27\x80\x06\x19\x12\xe7\x74\x46\x23\x48\x95\x24\x20\xce\x03\x9c\x63\x19\x5e\xd0\x48\x88\x28\x8d\xd7\x00\x62\x68\x6a\xff\x8e\xcf\x5b\xde\x3f\xb1\xdc\x31\x8f\xb9\x0f\xf2\x2e\x3f\x67\xbf\x46\x3f\x66\xff\xe6\x02\x66\xfa\xf7\x3b\x1f\xef\x30\x7e\x75\x6f\x51\xac\xf2\xa5\xd6\xa2\x35\x83\x15\xb2\x24\x52\x83\xfe\xb4\xed\x57\xec\xe9\x10\xc7\xf5\x22\x1f\x54\x15\xce\xc6\xe5\xf6\xb2\x3c\xc8\x8a\x43\x4a\x3c\x0e\xf9\xc5\x34\x96\xde\xb0\x16\x42\x63\xd8\x66\x65\xce\xcd\x57\xf1\x6a\x2b\xb3\x1c\x75\x24\x61\x33\x5c\x0c\xfb\x5d\x6a\x65\x36\xcd\x51\xd4\x81\x44\x7e\x61\xb7\xaa\x88\x8f\xab\xae\x2f\x2e\x92\xaf\x5a\xe7\x76\x51\x29\xae\x94\xd1\xb4\xa5\x36\xbb\x64\x91\x99\xcc\x9d\x9c\x6d\x14\x8b\xc8\x10\xca\xbc\x45\xab\x84\xec\xf4\xac\xd5\xcc\x92\xad\x92\x10\xcc\xc7\x3e\x2e\x70\x44\x81\x6d\x54\x07\x3a\xca\xda\xf4\xcc\x2b\x84\x4a\x26\x50\x70\x93\x98\x57\xcd\x90\x11\xf1\xf2\x7a\xe0\xc0\xc9\xa8\x3a\x60\xdc\xed\xd8\xe0\x85\xdc\xd8\x8d\xb0\xc2\x96\xb5\x41\xcd\x1a\xe7\xd7\xa1\xa2\x5a\x0d\x99\xcb\x8a\x5a\xb5\x36\xe5\xdc\xe6\xa4\x05\x85\x65\xd1\x22\x5b\xdd\xd5\xe9\x0d\xc5\x1b\x1c\x9c\x3c\xe3\x6c\x85\x38\x21\xbb\x7b\x05\x52\xfc\xe7\xa2\xb4\xf8\x09\xbd\x44\xa1\x3b\xc8\x05\x4f\xd8\x17\x2f\xec\x7f\x20\x25\x8c\xf9\x7b\x26\x5a\xa7\x45\xcb\x5f\x3d\x34\x78\xbc\x91\xdd\xc8\xab\x77\x97\x3f\xaf\xb3\x55\xd4\x00\xc6\x74\x55\x03\xbd\xa6\xc0\xe6\x36\x7a\x20\x20\x5c\x75\xfd\xfa\x78\xb8\xc9\x0d\xca\xb3\x82\x5b\xe1\x66\x8b\x59\xcc\xdc\x8d\x46\x96\xb3\x2b\x5e\xc7\x58\xf8\xcb\x4a\x83\xc4\x87\x52\x43\x1f\xe9\xc3\xa0\x28\xcb\xbd\x70\x39\x02\x40\xd6\xe7\x9d\x88\x5d\xdb\x65\xdb\xca\xdb\x20\xa3\x0c\x59\x85\x53\x0c\x03\xf6\xc6\x35\x57\x6d\x69\x63\x81\x56\x6a\xa2\x5e\xd1\x5a\x62\x7d\x3e\x84\x4a\x83\x5b\x07\x4b\x84\x6a\xd2\xb6\x21\x64\x86\xeb\x45\xc6\x9f\xe6\x46\x52\x63\x8a\x94\xd6\x60\x58\x95\x36\xd9\xd5\xdc\x24\x17\x2d\x31\x9f\x11\xca\xf8\x84\xe3\x27\x25\x0a\x66\x32\xee\x11\xd8\x3f\xdf\xc8\x9e\x75\xf2\x27\x1b\xd9\x9c\xcb\x76\xf3\xea\x67\x36\xb2\xff\xe0\x90\xe8\xae\x46\xf6\xc9\xe3\xc0\xc7\x27\xaf\x6e\xf4\x64\xbf\x70\xf2\x2a\x27\xcc\xec\xca\x80\x9c\x53\x0b\xae\xa5\xaf\xf9\x66\x0d\xcd\x64\x48\x74\xbb\x0a\x63\xae\xe6\x33\x05\xcf\xb9\xc6\xd0\x6f\x84\x9c\xd1\x20\x58\xb2\x05\x67\x13\x52\xeb\x74\x7b\x3a\xca\xbb\x0b\x15\x6f\x8a\x40\x9f\xe4\x87\xab\x70\xd2\x17\xad\xa0\x1a\x4d\xad\x9c\xbd\x9e\xe6\xc4\x51\xdc\x28\x16\xbd\x49\xb8\xd0\xc4\xb0\x6d\x18\xc3\xf1\x6a\x55\x19\x38\xac\x06\xdd\xb1\xea\x7a\x6b\xbc\x64\x57\x87\xf3\x85\x5a\xa9\x66\x18\x58\x0f\x4f\xfe\x95\xde\xe0\x46\xe7\x95\x7a\xd6\xe0\x62\xee\x76\x63\xbf\xc4\x44\xe8\x03\x01\x69\xea\x9c\xea\xe2\xca\x75\x25\x0f\x3a\x6b\xf0\x9f\x62\xff\x4a\xb0\xb9\xc7\xfe\x2f\x19\x0b\xbf\xbd\xfe\x63\x39\xc8\x47\xc7\xe2\xe2\xc9\x7e\xeb\x11\xfb\x85\x7e\x0f\xdf\x2b\xaf\x0e\xe8\x02\x8e\x26\x0d\x56\x5c\x0b\x12\xde\x0c\x8a\xb2\xb1\x50\x09\x8e\x20\x7a\x02\x3f\x9a\xd2\x76\x75\x66\x0b\x2d\x8e\x99\x49\xd4\x22\x51\x15\xa7\x06\xb7\xbc\xe4\xef\xae\x80\xf4\xc9\x09\xd2\xef\xd9\xf4\x88\x68\x89\x71\xd0\x68\x2b\x23\x6f\x6a\x74\xb3\x81\x5e\x37\xf3\x05\x45\x37\x00\x49\x28\x25\x41\x93\x03\x05\x4a\x95\x1c\x39\x28\xe3\x3e\x2d\x4c\x01\xd3\xab\x1d\x91\x3d\x13\x90\x92\x5e\xfb\x48\x40\x68\x9c\xea\x22\xb1\x12\x90\xbc\x6e\x07\x84\x4f\xb4\x2f\x3d\x62\xff\x4d\x72\xfe\x5f\xd7\x20\xc5\xf3\xe4\xfd\xbf\x0e\xdf\xcd\xe4\xfe\xc6\x66\x12\x1f\xcd\xf0\x2f\x36\x94\x38\xc4\xa2\x64\x8a\xbe\xfb\xae\xf4\xe4\xeb\x29\xc1\xec\xba\x96\x63\x0e\xb2\xfb\x1a\xf5\x8d\x96\xab\x1b\xe0\xbe\xdd\x17\xfc\xb8\xf1\xef\x61\xd3\x89\x77\x8a\x99\xdc\xa0\x3c\xde\x96\x3c\xa1\x31\x5e\x1b\x11\xf3\xf9\x94\xad\x3a\x8f\x06\xb1\x66\x5b\xa9\x89\xed\x11\x56\x91\x47\xd8\xb7\xe3\x2e\x46\xaf\xc7\x2d\x72\xaf\x6e\x58\x7b\xb1\x55\xfa\x67\x01\x0f\x6e\xa0\x0e\x6e\x41\x4e\xdb\x40\xf4\xb4\x3b\xfc\xd3\xf0\x20\x70\xd2\x90\x1d\x0c\x9c\x83\xda\xed\x59\x76\x7b\x77\xd1\x9b\xdb\xe2\x3f\x0d\xf7\x4c\x79\x1a\xf0\x1b\xd6\xb1\x5e\x5d\x69\xf5\x64\xec\xb4\x91\xc9\x87\x4a\xf2\x39\x7c\x7f\xb0\x00\x6f\xeb\xe0\xb4\xe1\xea\x95\xcd\x42\xcf\x0e\x53\x78\x1a\xef\x4e\x59\x1a\xd0\x84\x99\x73\x84\xfb\x2d\x2c\xd3\xb7\xae\x4c\x9e\x1c\xf1\x34\xb8\x58\x57\x1a\xb6\x93\x91\x73\x68\xa6\xf7\x1a\x6f\x68\x79\x73\xab\xc6\x94\x13\x33\x9e\x47\x9a\x50\x99\x0a\xf8\xd2\x64\x5a\xa5\x5f\xd9\xcf\xf1\xec\xdc\x90\xcf\x40\x1a\x44\xf0\x0a\xc6\x83\x99\x73\x74\xf1\x56\x90\x37\x36\x77\x7c\x73\x58\xca\xd3\x20\x4f\x0a\xd3\x80\x5e\x98\xbb\x2b\x86\x25\xbe\xf6\xb9\x3c\x32\xe6\x69\xb4\x27\x85\x69\x68\x2f\xcc\x9d\xa3\x3d\x6c\x91\x78\x63\x0b\xc2\x37\x47\xe7\x3c\x8f\xf7\xa8\x30\x15\xef\xb9\xb9\x73\xbc\xc7\x5d\x0c\x6f\xec\x4e\xf8\xe6\x0c\xa1\xa7\x01\x9f\x14\xa6\x01\xbe\x30\x77\x75\x68\xb0\xdb\x9d\xf0\xf5\xb4\xf5\xe0\xcd\xed\xe7\x52\xce\x58\x7a\xbe\x1c\x09\x95\xa9\x25\xb9\x34\x99\x16\x25\x02\x34\x7f\x3d\xec\xb7\x76\x7d\x6b\xb8\xcb\xb3\xa7\x3e\x01\xfb\x4d\xe0\x4f\xa1\xbe\x18\xa2\xa6\x9d\xc8\xf5\x34\xfe\x73\xa5\x69\x85\x48\x31\x7b\xb5\x24\xc9\x6d\xdb\xae\x0d\x35\x8f\xa7\x95\xed\xb1\xc7\x67\x9b\xdd\xb7\xa1\xdc\xee\x18\xb4\x0b\x3d\x58\xa3\x7e\x1a\xc5\xf6\x3a\x4a\xbd\x88\xc1\xd0\x47\x08\x3b\xec\x1e\xf9\x07\x36\x28\xc9\x6d\x19\x4b\xee\x26\x79\xda\x22\xec\xed\x40\xf3\xfc\x00\xb6\x47\x51\x9e\xab\xd9\x82\xdc\x8f\x53\xce\x20\x26\xb7\x14\x7f\x4d\x6e\x20\xfe\xba\xdb\xd8\xfb\x0d\xba\xd3\x29\x72\x8f\x02\x3b\x6a\xd8\x62\x3a\x35\x8c\x33\x58\xd7\x87\x8a\x67\xe7\xdd\x3d\x03\xe1\xa0\x64\x87\x22\x11\x60\xee\x04\x72\x76\x44\xdf\xa3\x40\x92\x4a\xb6\x40\xce\x07\xc2\x77\x22\x39\x3b\x56\xf0\x51\x24\x49\x25\x5b\x24\x89\x6f\xaa\xef\x87\x71\x76\x14\xe2\x13\x48\x92\x7a\xf6\x60\x0e\xa3\x84\x73\x30\xc9\x6d\x83\x6f\x85\xaf\xe7\x10\x5d\x2a\xda\x42\xba\x88\x8d\xef\x72\x74\xed\x04\x50\x4c\x75\x6d\xcf\x42\x21\x8a\xcd\xfe\xdf\x00\x00\x00\xff\xff\xcd\xc6\x70\x88\x2e\x74\x00\x00") - -func asset_stat_trustlines_2CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_2CoreSql, - "asset_stat_trustlines_2-core.sql", - ) -} - -func asset_stat_trustlines_2CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_2CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_2-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x50, 0xa9, 0xf5, 0xe1, 0x9a, 0x6c, 0x6e, 0xa, 0x7a, 0xf2, 0xba, 0xb5, 0x44, 0xd6, 0x17, 0x66, 0xa9, 0x72, 0x53, 0x6e, 0x9e, 0xd2, 0x3e, 0x93, 0x10, 0xc3, 0xfd, 0x8, 0xd0, 0x41, 0xe6, 0x84}} - return a, nil -} - -var _asset_stat_trustlines_2HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x67\x8f\xdb\x48\xd3\xe0\xf7\xfd\x15\x84\xb1\xc0\xd8\x98\xb1\x87\x39\x78\x5f\x3f\x00\x25\x51\x39\x87\x91\x34\x8b\x05\xc1\xd0\x94\x38\xa2\x48\x0d\x49\xa5\x59\x3c\xff\xfd\xc0\x24\x51\x14\x93\x82\xbd\x7b\x77\xaf\x60\x18\x23\xb2\xba\x52\x57\x75\x55\x57\xb7\xba\xbf\x7e\xfd\xed\xeb\x57\xa8\x6b\x58\xf6\xcc\x04\x83\x5e\x13\x92\x05\x5b\x10\x05\x0b\x40\xf2\x7a\xb9\xfa\xed\xeb\xd7\xdf\x9c\xf7\xa5\xf5\x72\x05\x64\x48\x31\x8d\xe5\x11\x60\x03\x4c\x4b\x35\x74\x88\xf9\x46\x7e\x43\x42\x50\xe2\x1e\x5a\xcd\x78\xa7\x79\x04\xe4\xb7\x01\x37\x84\x2c\x5b\xb0\xc1\x12\xe8\x36\x6f\xab\x4b\x60\xac\x6d\xe8\x07\x04\xff\xe1\xbe\xd2\x0c\x69\x71\xfe\x54\xd2\x54\x07\x1a\xe8\x92\x21\xab\xfa\x0c\xfa\x01\x3d\x8c\x86\x65\xfa\xe1\x8f\x00\x9d\x2e\x0b\xa6\xcc\x4b\x86\xae\x18\xe6\x52\xd5\x67\xbc\x65\x9b\xaa\x3e\xb3\xa0\x1f\x90\xa1\xfb\x38\xe6\x40\x5a\xf0\xca\x5a\x97\x6c\xd5\xd0\x79\xd1\x90\x55\xe0\xbc\x57\x04\xcd\x02\x27\x64\x96\xaa\xce\x2f\x81\x65\x09\x33\x17\x60\x2b\x98\xba\xaa\xcf\xfe\xf0\x79\x07\x82\x29\xcd\xf9\x95\x60\xcf\xa1\x1f\xd0\x6a\x2d\x6a\xaa\xf4\xe4\x08\x2b\x09\xb6\xa0\x19\x0e\x18\xdb\x1c\x72\x7d\x68\xc8\x16\x9a\x1c\x54\x2b\x43\xdc\xa4\x36\x18\x0e\xa0\x4e\xbb\x39\xf5\xe1\xbf\xcd\x55\xcb\x36\xcc\x3d\x6f\x9b\x82\x0c\x2c\xa8\xd4\xef\x74\xa1\x62\xa7\x3d\x18\xf6\xd9\x5a\x7b\x18\x6a\x74\x0a\xc8\x4b\xc6\x5a\xb7\x81\xc9\x0b\x96\x05\x6c\x5e\x95\x79\x65\x01\xf6\x7f\xfc\x0a\x82\x92\xfb\xd7\xaf\x20\xe9\xd8\xd5\xaf\x13\xd0\xa3\x76\xb9\x74\x1e\x83\x8e\x21\xa7\x11\x0b\x41\x1d\x91\xbb\xe0\xb5\x76\x89\x9b\x84\x20\x7d\xb4\x2e\x57\x3c\x50\x14\x20\xd9\x16\x2f\xee\x79\xc3\x94\x81\xc9\x8b\x86\xb1\x48\x6f\xa8\xea\x32\xd8\xf1\x21\xe1\x74\x4b\x70\x0d\xdd\xe2\x0d\x9d\x57\xe5\x4b\x5a\x1b\x2b\x60\x0a\x87\xb6\xf6\x7e\x05\x6e\x68\x7d\xe4\xe4\x26\x2e\x2e\x6b\xab\x01\x79\x06\x4c\xb7\xa1\x05\xde\xd7\x40\x97\x2e\x12\x21\xd4\x7c\x65\x82\x8d\x6a\xac\x2d\xff\x19\x3f\x17\xac\xf9\x95\xa8\x6e\xc7\xa0\x2e\x57\x86\xe9\xb8\xa3\x3f\xa6\x5e\x8b\xe6\x5a\x5d\x4a\x9a\x61\x01\x99\x17\xec\x4b\xda\x07\xc6\x7c\x85\x29\xf9\x7e\x79\x05\xd3\xe1\x96\x82\x2c\x9b\xc0\xb2\xd2\x9b\xcf\x6d\x53\x76\xe3\x0e\xaf\x19\xc6\x62\xbd\xca\x01\xbd\xca\x62\xc9\x83\x12\x54\xf3\x42\xc4\xc1\xa0\x9b\xbb\x81\x33\x4e\x28\x0a\x30\xf3\x81\x06\xe8\xaf\x68\xe2\xab\x35\x5f\x23\x77\x68\xbd\x80\x48\x78\x28\xce\x6a\xb1\x72\x1a\xcc\xed\xcc\x1e\xb0\x4e\x06\x20\x71\x9f\x69\x46\xf3\x83\xa7\xe7\x01\x36\x3c\x3e\x8c\x4c\x40\xd5\xb2\x79\x7b\xc7\xaf\xb2\x51\x3a\x90\xc6\x2a\x2f\x24\xc8\x0b\x16\x84\x92\x74\x60\x31\x70\xf7\x4c\xb0\xec\x51\x4c\xdc\xe7\xeb\x4c\x2f\x46\x3a\xda\xb6\xac\x75\x16\xe5\x03\xb0\x64\xc8\xe0\xc2\xbc\xe0\x60\x06\x2b\xc1\xb4\x55\x49\x5d\x09\x7a\x6a\xf0\xce\x6a\xca\xaf\x2e\xcc\x4d\x0e\x11\xed\x52\x0e\xe2\x1b\x5e\x4c\xdf\x55\x5e\x1e\x7a\x1e\xe0\x4f\xc7\xef\x75\xa6\xd3\x93\xfe\x9f\x4e\x7c\x08\x52\x3f\xd7\x18\xf8\x9c\x1c\xcc\x0c\x73\xc5\x2f\xd5\x99\x9f\x30\xa4\xb0\x10\x81\xcc\x2d\xe3\xe5\xf9\x5e\x1a\xe6\xbc\xc6\xe9\xb5\x2e\x76\x9a\xa3\x56\x1b\x52\x65\x8f\x72\x89\x2b\xb3\xa3\xe6\x30\x27\xee\x04\xa3\xbb\x03\x66\xbf\xbb\xd3\x31\xb9\xdf\xf2\x8b\x1f\x44\xe9\x01\xd7\x1b\x71\xed\xe2\x15\x3a\x73\xf2\x6c\x0b\xbc\x5f\x4c\xf9\x04\x49\xee\xd6\x32\xc8\x09\x7b\xcc\x66\x73\x4b\x98\xe0\xf5\x97\xc8\x17\x8f\x22\x5f\x5b\x3f\xef\xcb\x07\xec\x27\x79\xb9\x65\xf3\x47\x80\x4b\x64\xf1\x9a\xe4\x84\xf5\xd3\xbf\xfc\xfc\x04\xf9\x62\x1e\x8e\x22\x63\x48\x3a\x70\x68\x48\xf0\x01\xd9\x4a\xa5\xcf\x55\xd8\x61\x0c\xf0\x52\x75\x66\x1c\xaa\x04\x3e\xeb\xeb\x25\x30\x55\xe9\xcf\xbf\xbe\xe4\x68\x25\xec\xae\x68\xa5\x09\x96\xfd\x59\xd0\xf7\x40\x73\x4b\x31\x39\x5a\x28\xaa\x19\xdb\xa4\x3c\x6a\x17\x87\xb5\x4e\x3b\x45\x1e\x5e\x98\xcd\x8e\xdc\x3d\x41\x67\x8c\xa6\xe0\x08\xa4\xbb\x01\x87\x23\xab\xdb\xfc\xc8\xfc\x13\x74\x89\x20\xae\xe8\x39\x30\x70\x93\x21\xd7\x1e\x44\x50\x68\xab\x99\xf5\xae\x05\xb6\x58\xac\x72\x2d\xf6\x8c\xc2\x1f\xbf\x79\x55\xb8\xb6\xb0\x04\xdf\x83\x67\xd0\x70\xbf\x02\xdf\xfd\x26\x7f\x40\x03\x69\x0e\x96\xc2\x77\xe8\xeb\x1f\x50\x67\xab\x03\xf3\x3b\xf4\xd5\x2d\xce\x15\xfb\x9c\xd3\x5f\x3e\xe6\x00\xdf\x6f\x27\x18\x4f\x5f\xfa\x88\x8b\x9d\x56\x8b\x6b\x0f\x53\x30\x7b\x00\x50\xa7\x7d\x8a\x00\xaa\x0d\xa0\x87\xa0\xec\x16\x3c\xb3\x5c\x24\x0f\x51\xca\x81\xf8\x3e\xcd\x83\x86\x32\xe5\x39\xd1\x65\xbb\x33\x8c\xe8\x13\x1a\xd7\x86\xd5\x03\x5b\xe1\xfa\xdb\x09\xf9\x23\x96\x08\x23\x97\x08\x7f\x86\xc4\x55\x40\xb7\xf9\xbc\x9a\x0d\x7a\x4d\x68\x65\x1a\x12\x90\xd7\xa6\xa0\x41\x9a\xa0\xcf\xd6\xc2\x0c\xb8\x6a\xc8\x59\x2f\x0c\xb3\x9b\x6d\x68\x3e\xfb\x81\xad\x1e\xf9\x0f\xfa\x36\x4e\x97\x07\xcb\xce\xc4\x0f\xf5\xb9\xe1\xa8\xdf\x1e\x84\x9e\xfd\x06\x41\x10\xd4\x64\xdb\x95\x11\x5b\xe1\x20\x57\xfa\x56\x6b\xe4\x8d\x77\x83\x61\xbf\x56\x1c\xba\x10\xec\x00\xfa\x9d\xff\x1d\x1a\x70\x4d\xae\x38\x84\x7e\x47\x9c\x6f\xd1\xde\xc8\x74\xc4\xdb\xa4\xcb\x42\x7f\x37\xe1\xd0\x38\xe1\xf2\x8c\x54\xb7\xc9\x97\x83\xc2\x41\xc4\xc3\xa3\xab\x24\xfc\xfc\x1b\x04\x15\xd9\x01\x07\x8d\xab\x5c\x1b\xfa\x1d\xf9\x13\xf9\xeb\xf9\x77\xe4\x4f\xf4\xaf\xff\xfc\x8e\xba\x7f\xa3\x7f\xa2\x7f\x41\x43\xef\x25\xc4\x35\x07\x9c\xa3\x14\xae\x5d\xfa\x12\xab\x99\x1c\x71\xe0\x46\xcd\x64\x53\xf8\xd9\x9a\xf9\x9f\x6b\x34\x73\x1e\x53\x7d\x3d\x1c\xe2\x70\x3e\x45\x1c\xc3\xf6\x19\x46\x97\x63\x08\x1a\x38\xba\x82\x7e\x1c\x47\x80\x27\xef\xf1\x70\xda\xe5\xa0\x1f\x61\x8f\xf8\x12\xe7\xb5\x77\xe5\x31\x8a\x30\xc2\x62\xe0\xc6\xf9\x39\x8c\x4d\x81\x6e\xe5\x32\x0e\x69\x84\xd3\x13\x87\x3c\x65\xf7\x68\x65\xe7\xdc\xc6\xa5\x79\x37\x73\x1b\x83\x34\xca\x6d\xd8\x49\x52\xb9\x75\x22\x97\x0c\x14\x61\xad\xd9\xbc\x2d\x88\x1a\xb0\x56\x82\x04\xa0\x1f\xd0\xc3\xc3\x1f\xa7\x6f\xb7\xaa\x3d\xe7\x0d\x55\x0e\x2d\xa5\x9d\xc8\x1a\xce\x7f\x7d\x11\x5d\x07\xcb\x27\x9e\xe7\x8b\xe1\xc9\xb7\x27\x91\x2a\x43\xa2\x3a\x53\x75\xdb\x4d\x0c\xda\xa3\x66\xd3\x13\x47\x58\x3a\x69\x3c\x24\xcd\x05\x53\x90\x6c\x60\x42\x1b\xc1\xdc\xab\xfa\x2c\x02\xa6\xaf\x97\x87\x94\x1f\x52\x75\x1b\xcc\x80\x19\x01\x51\x34\x61\x66\x41\xd6\x52\xd0\xb4\x73\x32\xb6\xb1\xd4\xce\x89\x7c\x46\x09\xe2\xcb\x01\xf2\xbc\xdb\xa3\xf3\x86\x6b\xd5\x11\xad\x76\x1c\x54\x62\x83\xdd\x99\x42\x56\x2b\x4d\x75\x6b\xf6\x90\xad\x2e\x81\x65\x0b\xcb\x15\xe4\xf4\x99\xfb\x15\xfa\x30\x74\x70\xce\x68\xd2\xac\x28\xc8\x47\xfd\xe9\x54\x3e\x9e\x0f\x93\xaf\x04\xac\xbe\x19\xb2\xfd\xa1\x97\xd1\x21\xee\x83\x5a\xbb\xd8\xe7\xdc\xf4\xab\x30\xf5\x1f\xb5\x3b\x50\xab\xd6\x7e\x61\x9b\x23\xee\xf0\x9d\x9d\x1c\xbf\x17\xd9\x62\x95\x83\x90\x2c\x61\xae\x56\x7b\x14\xd1\x99\x29\xfa\x45\x0f\x48\x07\x3b\x7b\x23\x68\x9f\x1f\x12\x24\x7e\xf8\xfe\xdd\x04\x33\x49\x13\x2c\xeb\x4b\xb4\xbb\xbc\xb5\x8a\x18\xdb\x22\xf1\x2f\x29\x1d\xe5\xcd\x8d\x6f\x96\xcc\xab\xe8\x1c\xe4\x8a\xf7\x8c\x63\xad\x2e\x9e\xcd\x58\x70\xc9\x90\xe3\xc0\x11\x34\x1e\xdc\x2b\xff\xc5\x34\x20\xc8\x34\x0f\x8b\x2f\x2f\xdc\xc9\x6c\xc3\x38\x7f\x99\xd1\xa6\x09\x02\x75\xc6\x6d\xae\x04\x15\xa6\x19\x12\x79\x15\xba\x74\x81\x0e\xb8\x22\xaf\xbf\xa9\x72\x12\x6f\x41\xcd\xe7\x56\xab\xf3\xf1\xf8\x66\x17\xf1\x19\x3e\x69\xa4\x3f\x2f\x71\x25\x41\x7e\x72\x17\x3e\x3e\x25\x58\xb3\x6b\xc7\xf1\xaf\x64\x60\x0b\xaa\x66\x41\x6f\x96\xa1\x8b\xc9\xc6\x16\x14\xca\x6e\xd5\x83\x8f\xc7\xd7\x43\xb0\x6e\x9d\xc0\x5b\x68\x31\x39\x97\x17\xc6\xad\x63\xc7\x37\xf4\xd5\x12\xaa\x8c\xba\x1d\x71\xe0\x23\x18\xe5\xe0\x08\x85\x63\x47\xe4\x83\x3f\x2c\x26\x47\x02\x93\xb1\xb6\x8f\xb1\x29\xda\xc6\x04\x82\x9d\xd9\xc8\x83\x5d\xaf\xe4\xdc\xb0\x07\xd3\xf1\xbf\x46\xd6\xd9\xcf\x64\x41\xce\xf2\x01\x5b\xd0\x78\xc9\x50\x75\x2b\xde\x06\x15\x00\xf8\x95\x61\x68\xf1\x6f\xdd\x95\x4f\x05\x24\xf5\xb5\xfb\xda\x04\x16\x30\x37\x49\x20\x4e\x1e\x6a\xef\x78\x37\x4d\x52\x3f\x92\xa0\x56\xa6\x61\x1b\x92\xa1\x25\xca\x15\xed\xa3\xc0\x58\x80\x20\x03\xd3\x4d\x2f\xbc\xe7\xd6\x5a\x92\x80\x65\x29\x6b\x8d\x4f\x34\x14\x5f\x70\x41\xd5\x80\x9c\x0c\x95\xec\x56\x09\xb5\xeb\x5b\xbd\x2c\x61\x3d\x24\x23\xe6\xe5\x1f\x6d\xb2\xc7\xaf\x4b\x45\xbe\x6f\x18\x4b\xa5\xf1\xab\xc2\xda\x45\x82\xde\x18\xe6\x52\x69\x9d\x87\xbd\x78\xf0\x94\x30\x18\x5a\xd9\xb9\x9b\x6d\x66\x4d\x73\x4e\x77\x55\x25\x4c\x85\x9c\xcc\x5f\xf2\x44\x71\x23\xe0\x8d\x01\xd0\xf7\x7c\x63\x6d\x4a\x87\x6d\x1a\x09\xa1\x27\x18\x4e\x1e\x1e\xbe\x7f\x4f\x9e\x8a\x25\xfb\x81\xbf\xb0\x76\xab\x3a\xfd\xbd\x80\x9f\xef\x9a\x2f\xf8\x43\xe2\x35\xd1\xcb\xdd\x0b\x93\x48\x36\xb2\x13\x31\x0d\xc8\xdf\x1c\x99\x06\xe2\xcd\x83\x63\x01\xce\xf7\x74\x66\xc0\xa5\x92\x3b\x40\xa5\x50\x74\x59\x52\x2d\xde\x02\x9a\x06\x4c\x48\x34\x0c\x0d\x08\x7a\x10\x93\x54\x09\xf0\xfa\x49\xfc\xf5\x9e\x9d\xc6\xe4\xe3\x6e\x22\x3e\x12\xad\x4f\xf6\x33\x45\x5f\x86\x96\xe9\x63\x77\x7e\xba\x5c\xf3\xee\xde\x60\xa8\x58\xe5\x8a\x0d\xe8\xf3\xe7\xb0\x06\xff\x03\xc1\x5f\xbe\x64\xa1\x8a\x6b\x1e\x28\xed\x7f\xce\xf4\x98\x03\xdf\x89\x4e\x23\xe8\x23\x0a\x77\x19\x4c\x75\xa5\xf8\x15\xee\x3b\x38\x57\xfc\x9e\x85\x9c\x91\x34\xcf\x10\x76\x4b\x2c\xcd\xda\x1f\x70\x9f\x68\x9a\x41\xe5\x57\xc5\xd3\x0b\x85\xbd\x31\xa2\x66\x50\x3b\x8f\xa9\x49\x0d\x52\xa2\xea\xc9\x9e\x90\x3b\xda\x6a\x60\x9f\x61\x96\x72\x4f\xa2\xfc\xb1\x3f\x63\x6a\x96\x37\xf0\xa6\xc7\xd0\x58\xd8\x23\xe9\x58\x7f\x71\x66\x01\xc9\xd3\x88\xa4\x09\xda\x3f\x32\xc5\xb2\x77\x3c\xd0\x37\x40\x33\x56\x20\xae\x6c\x69\xef\x9c\x09\xcf\x5a\xb3\x13\x5e\x2e\x81\x2d\x24\xbc\x72\xa6\x5a\x49\xaf\x2d\x75\xa6\x0b\xf6\xda\x04\x71\x15\x36\x86\xfc\xf2\xe7\x5f\xc7\xdc\xe5\xef\xff\xc6\x65\x2f\x7f\xfe\x15\xd5\x39\x58\x1a\x09\xc5\xb0\x23\x2e\xdd\xd0\x41\x6a\x2e\x74\xc4\x75\x8e\xc6\x97\x4c\x5d\x02\x5e\x34\xd6\xba\xec\x56\xac\x69\x53\xd0\x67\x20\x3a\x1b\x3b\x0d\xad\x8e\x26\x1c\x6c\x33\x20\x67\x4f\xb7\xfc\xda\x9f\x2a\x07\xde\x16\x6c\xe1\xca\x33\x44\x78\xee\xe6\xee\x97\xcb\xd8\x1d\x36\xe0\x86\x29\x75\xd2\x70\x45\x2a\x5c\x25\xbd\x6c\x1e\x71\x3f\x21\x72\x6e\x9e\x4b\x15\x2a\x75\xfe\x91\x47\xc8\xc4\x48\x7b\x37\x31\x73\xef\x3f\x4c\x15\x34\x23\x2c\xc4\x8b\x5a\x12\x6c\x01\x52\x0c\x33\x63\xb5\x08\x2a\xb1\x43\x36\x43\xbc\x5a\x7b\xc0\xf5\x87\x50\xad\x3d\xec\x9c\xac\x18\xb9\x51\x74\x00\x7d\x46\x9e\xa0\x07\xf8\xe1\x09\x42\x9e\x20\xf8\x09\x7a\x78\x48\xe6\x22\x6d\xa1\xe6\x52\x4e\xa2\x8b\x35\x01\x37\x0f\x08\xaf\xea\xaa\xad\x0a\x1a\xef\x6d\x9c\xf9\x66\xbd\x6b\x0f\x4f\xd0\x03\x0a\x23\xcc\x57\x98\xfc\x0a\x63\x10\x42\x7f\x47\xe9\xef\x38\xf5\x0d\xc6\x50\x9c\x21\x1f\x61\xd4\x61\x3a\x17\x76\x94\xf7\x7e\x10\x71\xd2\x11\xe2\x9e\xb7\x0d\x55\x4e\xa7\xc4\x90\x04\x75\x09\x25\x8c\x5f\x5b\xe0\x10\x98\x78\x55\x3f\xfb\x11\x46\x2a\x3d\x1c\x87\x71\xfa\x12\x7a\x38\x2f\xc8\x32\x1f\x2d\x65\xa5\xd2\x20\x70\x02\x43\x2f\xa1\x41\xf0\x5e\x18\x0c\x12\x72\x77\x09\x34\x95\x04\x89\xc1\xe8\x45\x62\x90\x01\x09\x7f\xd0\xcb\x41\x82\xc6\x11\xe2\x12\x12\x14\xbf\x34\x64\x55\xd9\xe7\x97\x82\x46\x48\xf4\x22\x12\xf4\x89\x14\xfe\xce\xe7\x1c\x74\x28\x9c\xc4\x2e\xa3\xe3\x74\xba\x30\x9b\x99\x60\x26\xd8\x86\x99\x6e\x53\x0c\x8c\xc0\xcc\x25\xe8\x19\x17\xbd\x57\xe6\xe4\x77\xb2\x99\x8e\x1d\xa5\x90\x8b\xba\x1a\x81\x5d\xf4\x7e\x2f\xb8\x93\xdb\x74\x02\x04\x43\x5d\xa4\x1d\x04\x09\x13\x38\xcc\x96\x9c\x01\x20\x9d\x10\x43\x32\x97\x49\x82\x9e\x74\xb4\x3f\x3f\xf5\x7e\x6b\x9b\x46\x09\x81\x29\x02\xbf\xa8\x47\x10\xcc\x13\xe7\x30\xab\x4f\xed\x71\x04\x41\x29\xf2\x32\x49\x70\x5e\x51\x77\xc1\xef\x0e\x8c\xa5\xc6\x2b\x2a\xd0\x52\x87\x46\x04\x21\x10\xe4\xa2\x41\x18\x21\x82\xe5\x96\xa0\x0c\xbe\xcb\x10\x83\xa4\x2e\x1b\xe6\x11\x92\x57\xf5\x19\xb0\x6c\xfe\xbc\xd0\x9e\x41\x8a\x62\xe8\xcb\x7a\x84\x3a\x89\xf0\xee\x8a\x86\x90\x1e\x4c\x10\x14\x86\x31\xdc\x27\x92\x10\x6b\x53\x97\xe7\x2f\x0d\xb6\x67\x4b\xf4\xe1\xd8\x5f\x29\x4e\x1a\x15\xb2\xdf\xc6\x3b\xed\x1a\xd7\x2d\xb6\xda\xe5\x02\x85\xa1\x2c\x8e\x91\xaf\x44\xb7\x5d\x1a\xf4\x9b\x95\x71\x83\xaa\x14\x9a\xc5\x56\xaf\x59\x2b\x77\xf0\x01\xc5\x4d\xc7\x2f\xa3\xa8\x86\x12\x89\xa0\x0e\x91\x42\xbf\x3b\xad\xd6\x9a\x68\xb1\x86\x95\xdb\x3d\xbc\x30\x69\x96\x5b\xed\x52\xb3\x5c\x1f\xb5\xbb\x23\xb4\x3a\xc5\x5e\x5b\xe5\x41\xb5\xd3\x1e\x15\xb9\x0e\x3b\x18\x53\xbd\x22\xd5\x99\xa0\xd5\xdc\x44\x30\x57\x12\x14\xeb\x95\xd1\xea\x88\x23\x50\xb6\x35\x19\x95\x47\x55\x8c\x9d\xd6\xd9\xc9\xa4\x32\x99\xbc\xa0\x2f\xd5\xc9\x74\xda\x27\xb9\xe9\x84\x1b\x76\x1b\xa5\xc9\xeb\x80\x1d\x93\xd4\xa4\x83\x3f\x5c\xbb\xd3\xc3\x49\xfc\x32\xba\xc1\xdf\x1d\x77\xdc\xd8\xfa\xcd\x02\xe9\xbb\x20\x9e\x20\xec\x09\xb2\xcd\x35\xc8\x61\x1c\xe7\xfb\x1b\xae\x36\x0d\x6f\x5e\x12\x36\x0c\xc9\x04\xb2\x6a\xf3\x82\xb6\x9a\x0b\xfa\x7a\x89\x3b\xe6\x3c\x1a\x94\x1e\x7e\x8e\xa6\x53\x57\xf4\xef\xa2\xe7\x93\x59\x94\x9b\xef\xe6\xd3\x72\xdc\x82\xfe\xb5\x6a\x0e\x16\xf5\x43\x7a\x46\x28\x67\xcc\xa1\x30\x94\x46\x5c\xa6\x50\xc7\x5f\xfe\xfe\xa4\xa9\x4b\xd5\xfe\xf4\x1d\xfa\xc4\xa0\x28\x86\x51\x28\x8c\x91\x34\xf1\x0d\xa7\x28\x82\x86\xa9\x4f\x4f\xd0\xa7\xe3\x06\x12\x07\x6a\x34\x28\x1d\x1f\x3a\xf3\x6e\xe7\x61\xb4\x07\x8f\x10\xde\x46\x12\x07\xe6\xda\xae\xfc\xf4\xdf\x24\xdf\x8c\x93\x11\xa5\x69\x9c\x81\x09\x86\x26\x3c\x19\xe1\xff\xc7\x64\xc4\x9e\x20\x9a\xa0\x19\x06\xa3\x49\x9a\x39\xcc\xa5\xfe\xfe\x64\xd9\xce\x44\x43\x9f\xf1\xa2\xa0\x09\xba\xe4\x72\x8c\xc0\x30\xfc\x0d\xf6\x3e\xf9\x29\xa0\xa7\x14\x50\x77\x98\x78\xf8\xfb\x93\x97\x6c\x9c\xe1\x3d\xd3\x93\x2e\xd8\xea\x06\x5c\x2d\x11\xf6\x04\x21\x9e\x48\x5b\xa0\xce\xe6\x0e\x41\xe4\x09\xfa\xe4\x19\x3e\xbf\x00\xfb\x5f\x66\x4b\x2e\x57\x38\x4a\xf9\xa6\xf4\xb3\xf4\xec\x53\xf8\xe9\x7a\x8e\x48\x94\x53\xcf\xd7\x85\x6c\x8f\xab\x8c\xe1\x2e\x6e\xdf\xce\xb5\xc3\x5d\xb0\x77\x27\x10\x16\x7f\x82\x1e\x04\x0c\x56\x80\x88\x20\x38\xa1\xc8\x18\x46\xe0\x82\x4c\x08\x8a\x44\xc9\x84\x88\x28\x0c\x2e\xc3\x84\x48\xca\x92\x22\x00\x49\x84\x69\x04\x96\x29\x44\x01\x02\xa2\x00\x80\xca\xa4\x48\xc2\x04\xea\xc4\x1f\x27\xaf\x95\x31\x5c\x12\x30\x12\x65\x08\x86\xa0\x15\x9c\x50\x48\x44\x06\x04\x49\x30\x22\xc0\x01\x22\x88\xb2\xcc\xc8\x24\x89\x13\x84\x20\x4b\x08\x06\x18\x20\xc1\x38\x0d\x24\x52\x41\x65\xd2\x1b\xfe\x91\x48\x7e\x46\x7e\xc7\xa8\xef\x18\x11\x4d\xdb\xbc\xc7\xe4\x37\x8c\x41\x11\x82\xc9\x7c\xeb\x8d\xe7\x24\x83\xd0\xf8\x13\x84\x90\x4e\x7f\x9e\x7d\x9e\x20\xdc\xf9\x0f\xf1\xff\x0b\x1e\x22\x87\x3f\x1c\xd6\x58\x96\x65\x8b\xbb\x3a\x0a\xc3\xfb\xb7\xe9\x6a\xfc\xf2\x06\x4f\xd0\x2a\x78\xd1\x96\x8f\xc3\xf9\x3b\x83\xca\xaf\x8b\x17\x01\x2b\x74\x57\x14\x3b\xe8\xec\x36\xcd\xf1\x3b\x3d\xa7\x4b\xa2\xb6\x79\xdc\xee\x01\x3e\x97\xfb\xd6\x7a\xcf\xc0\x53\x4c\x2d\x76\x05\x65\x45\xed\x50\x61\xda\x00\x93\xee\xbb\x4e\x6d\x38\x07\x35\x3b\xe9\xbe\xb4\x3e\xb6\xec\xe1\x83\x61\xdc\xb2\x51\xdf\x62\x63\x41\x7b\xec\x8c\x26\xc2\x98\x98\x2e\xeb\x1d\xdb\x22\xd6\x33\x80\x2c\x96\xfb\x3e\x29\x17\x76\xbb\x86\x35\xd3\xd0\x4d\x17\x2d\xb7\xe7\xc5\x31\x5e\x2e\x7c\xec\x4b\x2d\x73\x51\x2d\x0c\xfa\x35\x64\x20\x6a\x1b\xba\x34\x16\xd7\xfb\x4a\x53\x28\x35\xa7\x30\x18\xcd\x1c\xcc\xbd\x36\xde\x14\x3e\x56\x68\xef\x48\x8c\xad\x84\xbf\x1c\x3e\xaf\xec\x04\xc1\x7b\x2c\x5b\x82\xeb\x71\xaf\xff\xd5\x1f\xbf\x86\x96\xe0\xf7\x51\x57\xc0\xee\x63\xc6\x0f\x18\x09\x33\x80\x20\x18\x09\x30\x18\x46\x88\x18\x05\x10\x0a\x17\x71\x5c\x22\x68\x54\xa4\x50\x44\xc6\x14\x04\x91\x25\x1c\x88\x38\x23\x03\x18\x28\x22\x49\xa1\x0a\x45\x8a\x38\x22\x32\x00\x48\x69\xae\x80\x27\x19\x3b\x8e\xc0\x04\x46\xa7\xbe\x75\x5d\xc1\x0b\xfb\x08\x4d\xd3\x29\xae\x80\xe5\x74\x85\x8f\x69\x9d\x78\xd1\x3b\x8b\x8f\xf1\x87\x32\x97\x9b\xfd\xd6\xb8\x68\xef\xab\x43\xba\x8f\x71\x24\xac\x83\xd2\xc6\xd6\x9b\x98\x00\x57\x08\xca\x2a\x8e\xc9\x8f\xf1\x76\x6b\x34\x98\xe1\x63\x7d\xd9\x7f\x26\x8c\xfe\x90\x9b\x37\xeb\xd4\x56\xab\xce\x48\xa1\x38\x41\xe9\xd6\xaa\x61\x4f\xea\xbb\x85\xdb\x75\xae\x2b\xcc\x8e\x5d\xd9\x6c\x36\xba\x62\xcb\x78\xab\x3e\xf6\xfb\x8f\xc3\x41\xa1\xd4\xa8\x14\x9e\xed\xb5\x52\x45\x97\x4d\x04\x95\xa4\x62\xd5\x44\xea\x3a\x4a\xed\xbb\xc5\x1e\xdc\xee\x52\xc2\x8b\xfd\xc8\x52\x93\x22\xa6\xcf\x00\x30\x66\xc4\x76\x6a\xd9\xc3\x2a\xf7\x6c\xad\xeb\xcf\x8d\xf6\x72\xb5\x30\xa6\xf5\xa9\xeb\x6a\xad\x18\x57\xe0\xac\x38\x73\xfa\xff\xc7\x15\xd0\xfb\x98\xf1\x03\x89\xc9\x0c\xad\x10\x18\x09\x00\x49\xcb\x88\x88\x52\x22\x21\xd2\x8c\x82\x62\x82\x42\x60\x08\x22\x52\x04\xc9\x08\x28\xae\x08\x0a\x82\xc3\x98\x20\xc3\x22\x81\x8a\x24\x86\x89\x30\x25\x02\xc6\xb1\x58\xd4\xfd\x17\x63\xd5\x58\xa2\xb1\xa3\x08\x8c\x24\xbb\x42\xf0\xd6\xcb\xa5\x70\x82\x41\x53\x3c\x01\xcd\xe9\x09\x68\xf7\xf5\x0d\x69\xaf\x09\x03\x16\xeb\xd4\x18\xd7\xf7\x9d\xcd\x68\x57\xc1\x5e\x56\xc6\xe2\x71\x53\x66\x3b\x76\x11\x69\xa0\x2d\xaa\x40\x91\xaf\x6b\xa2\xca\x48\x55\x19\x7e\x67\xad\xd7\x37\xa6\x47\x4e\xe9\x7d\xad\x26\x91\x6b\x7b\xa1\x3c\x17\x3b\x8f\xcd\xe5\x33\xdc\x10\x2d\xc5\xfc\xe8\x8e\xdc\x9e\x73\x3d\xc1\x35\xce\xda\xe1\x3f\xd6\xfd\x6e\x1d\xbf\x6f\xd9\x6e\xcf\x73\x1c\xb6\x0b\x77\xdf\x06\x58\x5f\xa1\xe6\x16\xbd\x7b\xa9\x15\x66\xe8\x8c\xde\x35\x36\xef\x9d\xce\xb3\xfe\x3c\x7b\x9e\x6c\x67\xdd\xfe\x73\xb5\x40\xbd\x03\x66\x65\xa9\xf5\x35\xbe\x68\x57\xfb\xb8\x31\xa9\x72\xc3\x9a\x8c\x23\xdd\x76\x7d\x42\xad\xea\xef\x06\x8c\xb2\xb8\xf1\x48\xe8\x7d\x11\xfb\x58\xbb\x9e\x52\x8b\xf1\x94\x52\x2d\xce\xda\xfe\x2f\xf7\x14\x34\xbf\xa7\x20\xf7\xb1\x72\x77\x69\xd5\xc9\x9c\x9d\x4c\x13\x61\x28\xf8\x2b\x8c\x7c\x85\x11\x08\x86\xbf\xbb\xff\x12\xad\x19\x23\x50\x2a\x39\x28\x04\x6f\x71\x94\xc1\x19\x92\x42\x19\x32\xc5\xd6\xe3\x2d\xdd\x63\xe9\x9f\xee\x94\xe4\x4f\x61\xd2\x50\xf1\xfd\xf3\x7e\xd0\x28\x50\x25\xbd\xc4\x54\x51\x78\xf7\x56\x78\xb4\xe0\x99\x6d\x6d\x6b\xdb\x0f\x64\x22\x0f\xc6\x53\xa1\x50\x17\xca\x6e\x38\xe1\x62\x8c\x38\xfe\x13\x18\x31\xcb\x16\x16\xbf\x40\x90\xbb\x7e\x1e\x3c\x63\xca\x9e\x5b\xe4\xd8\xbc\x7c\xed\x54\x23\x61\x4d\x3a\xb1\xd0\x92\xe0\x71\x19\x68\xd0\x68\x2d\xe3\x3a\x34\x91\xc9\x35\x7a\x1d\x16\x3c\x32\x45\xbf\x0e\x0b\x11\x99\xf0\x5e\x87\x85\x8c\x4c\xcc\xef\xb3\x99\xfb\x2e\x85\xbf\xf4\x9d\x06\x4f\x10\x99\xb7\x10\x98\xb0\xa5\xf9\x66\x8b\x0d\x59\xe9\x89\x89\x1e\xbe\xc0\x6e\x3a\x45\xe6\xab\x99\xd9\xe6\xda\xb2\x01\xb8\xa9\x1e\x13\xa0\x31\xcc\x9b\xca\x0d\xff\x8a\x0a\xde\x4f\x58\xe2\x88\xeb\xb9\x93\x51\xe1\xf0\x05\xff\xdf\x9e\xfb\xb7\xf7\x5c\x78\x08\x3d\xfc\x4d\x87\x6a\x8b\xca\x5a\x97\x7d\x59\xae\x5c\xc5\x72\xf5\xe2\x2d\xf3\xdc\xda\xb9\x39\x0a\x9d\x3f\x61\xb9\x2d\x49\x6d\xfe\x68\x7f\xf8\x1b\xff\xb9\x6a\xbb\xde\x98\x7f\xbe\xda\x32\x62\x47\xcc\x6f\x37\xf2\xc4\x8d\x6c\xac\xd9\xdb\xd8\xaf\x8d\x4f\x89\xdb\xdf\x62\x73\x2a\x38\x39\x19\xca\x44\x84\x46\x87\xcc\x6b\x11\x61\xa7\x2e\x9c\x94\xcb\x64\xe2\xc1\x4f\xf1\x24\x65\x56\x99\x78\x22\xbe\x71\x35\x3f\x64\xc4\xc7\xee\xb5\xbd\xff\x2e\xf9\x55\xd6\x06\xc7\x0b\x32\xac\xc4\xed\xed\x77\xb0\xe1\xf0\x5e\x39\x9c\x26\x51\x86\x06\x30\xae\x28\x22\xa2\x60\x24\x0a\x4b\x04\x8a\x28\x34\x22\xc8\x22\x81\xc2\x94\x42\xc8\x08\x2a\xa1\x88\x08\xd3\x02\x4c\x91\x04\xcd\xc8\xa8\x08\x30\x99\x96\x05\x40\xe0\x98\x33\xc7\xf5\x6a\xa6\x57\xc7\xa7\x50\x45\x08\x0f\x66\xc2\xc9\x2b\x0b\x38\x9a\x38\xeb\x3e\xbc\x3d\x71\x45\x6f\x0a\xdd\x20\xdf\x80\x8a\xbd\x2d\x8d\x1a\x3d\xac\x68\xa5\x67\x30\x93\x30\xaa\x3b\xb1\xab\x8d\xc6\xc7\xf8\x85\xde\xbe\xa8\xaf\x05\xa1\xb8\x26\x9a\x44\x8b\x75\xa7\xa0\x6c\x50\xe2\x29\x46\x66\x78\x85\xe3\x9f\x53\xf7\xfb\xcb\x4b\xdb\x5b\x45\x60\x8b\xc8\xba\x20\x57\x8d\xe1\x7a\xd6\xda\xf4\xec\x12\x55\x98\xd7\x9a\x58\x1b\x30\xf2\x4b\x57\xa9\xd4\x1e\xeb\x2a\x51\xdf\x8c\x3a\x8f\xaf\xac\x4d\x61\xcf\x87\xcf\x11\x5f\xe5\x40\xbf\x57\x5e\xd1\xa6\x55\xc2\xd9\x35\x62\x80\xd7\x45\x61\x88\xf4\xab\xb5\x7a\x7f\xbf\x1b\x0b\x7b\x61\x8d\x29\xc4\xe8\x0d\xb0\xf0\x16\x7f\x84\x9b\x1f\x6f\x4d\x6e\xaf\x32\x7a\xa5\x65\xd1\x40\x63\xab\xb8\x56\x9a\xcf\x4b\xf5\x5d\xb1\x4e\x57\xe7\x3b\xb1\xf2\x38\x19\x3e\x4b\xcb\x9e\xb5\x46\x7a\xec\x8f\x87\x70\x49\x21\xbc\xee\x70\xfc\xb3\x12\x92\xf5\x08\x7f\xac\x83\x95\x22\x4a\x60\xcd\xf7\x36\xd9\x04\x1d\x61\xf6\xb6\x6b\x09\xa3\x2e\x43\x16\x3e\x14\x8b\x01\xb0\x64\x98\xed\xd7\xc9\x47\x61\x5c\x5f\x94\x8d\x06\xb5\xd8\x2c\xdc\x62\x56\xf1\x85\xdd\xbc\x75\x8e\xfa\x2d\x44\xe8\xfb\x1f\x2e\x69\x86\x5d\xb8\x33\xfd\xe2\x35\xf4\x59\xb7\xa4\xd1\x3a\xe8\xc3\x6b\x5f\x5c\x1b\x98\x61\xe3\xc4\x7b\xb1\xcb\xed\x56\xbd\x67\xcc\xa8\xb6\x1f\x3f\x10\xaa\xbf\x57\x2d\x44\x53\x5a\xe5\xe9\xb2\x37\x9e\x99\xeb\xc1\xe3\xd0\x6d\x54\x7e\x19\xc1\x3e\xe1\xe6\x18\x2f\xc3\x60\xde\x21\xd9\x3d\x53\x84\xbb\x56\x85\x9b\x6d\x24\x84\x42\x90\x11\x43\x4f\xdf\xf0\x65\x73\xb1\x64\x7a\x14\xb1\x28\x62\x9b\x10\x2b\x47\x23\xda\xc6\xf1\xcc\x1d\x1f\xfe\xeb\xf8\xfb\x71\xb4\xad\xa8\x2e\xd9\x6b\x78\xad\x8f\x8a\x8f\x1d\xe9\x88\x8f\x8b\x9a\x09\x1b\xdf\xcf\x31\xba\xba\x9a\x7e\x0b\xbf\x8e\xbe\xa7\x8b\xbf\xc7\xfa\x7e\xbd\xed\xce\x8a\xd4\x78\x4e\x2c\x7b\xe5\xee\x0b\x27\xcd\xb4\x6a\xb3\xfc\x6a\xd6\xdf\x29\xf9\x59\x1b\xb4\xf1\xd2\xb0\xf4\x46\xf5\x36\x9d\x96\x35\x6c\x34\x51\x69\xba\xff\xd8\x91\x23\x56\x51\x47\x9d\x0a\xd7\xd2\xb9\x9a\xbe\x05\xd5\xb2\x25\x12\x72\x97\xd9\xbf\x16\xf7\xd4\x8b\x83\xdc\x4d\xe8\xdc\x1f\x98\x04\xf5\x4e\xef\x7f\x27\x10\xb9\x03\x6e\x76\x2c\x0e\x45\x0c\x51\xc6\x69\x52\x16\x65\x19\x46\x65\x9c\x84\x69\x84\x22\x29\x44\xc2\x05\x42\xa0\x00\x23\x93\x80\x26\x09\x49\x40\x19\x49\xc4\x11\x40\xa2\x32\x25\x08\x0a\x05\x0b\xa8\x02\x00\x21\x62\xa4\x0c\xbc\x5d\x5d\xf7\x8a\x18\x58\x46\xc4\xc0\x11\x98\x42\x13\xd7\xb1\xdd\xb7\xe4\x43\x24\xe7\xba\x35\x62\x44\x7b\xfd\xd7\x44\x8c\x02\xb3\x58\x36\xc6\xe8\x3b\xb6\xa1\x7a\xca\x9e\xee\xb6\xc0\x82\x13\x91\xe1\xb0\x46\xa8\xbb\xf7\x45\x0d\x2e\x18\xb3\x89\xd9\xb1\xa9\x59\x07\x21\xd1\x9e\xb8\x98\xa3\xf2\x60\x38\x52\x40\xc9\xd8\x48\x70\x97\x15\x94\x79\x69\xb2\xb3\xe7\x2f\xac\x66\x35\xd7\x6f\x5a\x61\xb9\x7f\x2b\xb0\xd3\xbb\x45\x0c\x36\xb4\xbc\x7e\xcd\x88\xad\x1f\xf5\x9b\xf0\xc9\x18\xb1\xef\x47\xff\xdc\xab\x73\xd3\xff\x29\xa3\xdc\xf9\x27\x7d\x94\xfb\x07\x47\x59\x96\xfd\xf7\x46\xcc\xd8\x88\x54\xbc\x4d\x57\x3e\xaf\xb3\x14\x6d\xfc\xb2\xbe\xba\x84\xbe\x1f\x91\xaa\xe8\x60\xba\x12\x05\x13\x3c\xdb\x85\xe7\xe6\x96\xde\x91\xbd\xfe\xe6\xa5\xdd\x7a\x5b\x36\x2b\xef\xbd\xb7\x5e\x45\x2d\x00\x8b\xc4\xd6\x2c\x35\x31\x5f\x0b\xeb\x41\xf5\x15\xa9\xb7\xfb\x0c\xde\x51\x99\x8f\x1e\x5d\x58\x3d\x72\x6d\xa5\x82\x96\x47\xc5\xf1\x76\x4d\x76\x46\x15\xb1\xd1\xe2\x0a\xb3\x7b\x47\x24\x59\xc4\x18\x1a\x88\xb8\x00\x68\x86\x22\x48\x0c\x25\x48\x1c\x93\x04\x19\x45\x24\x06\x07\x08\x26\x2a\x12\x4c\xe1\x22\x86\x62\x00\xd0\x18\x40\x70\x44\x54\x28\x18\x11\x08\x99\x81\x71\x05\x11\xbd\x85\x47\xe4\x96\xaa\x87\xb7\x73\x24\x35\x10\xa1\x08\x82\x27\x2f\x18\x06\x6f\xc3\x73\x6d\xcf\x16\x2b\x4d\xba\xda\xdb\xf4\x16\x62\x03\xad\xb2\xd8\xf8\xe5\xad\x6f\x36\x96\x6f\x13\x18\x56\x2a\xb4\xd5\xac\x51\x4b\x98\xeb\x6f\xeb\xe3\x67\x76\x82\xb1\x87\x38\xe4\x7e\x52\xe2\x90\xf7\xb1\xc5\xd9\xa4\x4f\x72\x94\x51\x6a\xc2\xcd\xde\xe3\x76\x3a\x28\x32\x1f\x93\xcd\xe4\x65\x88\xed\xd4\xae\x3a\x5d\x0f\x44\xa4\xb4\x59\xf6\x9a\x80\x66\xfd\x71\x30\xbc\x20\x57\x78\xd9\x6c\xcb\xcc\xd6\x35\xd5\xe9\x5b\x4f\xea\x0e\xd1\x0a\x31\x7f\xd7\x0b\xcb\x59\xa5\x02\x66\x4c\x9d\xd6\x70\x09\xe1\xf4\x91\xb6\x5b\x68\x9c\x56\x65\xac\xf7\x57\x13\x66\x28\xa4\x4c\x76\x9a\x63\x05\x3c\x2f\xf1\xc5\xaa\x6c\xd7\x1e\xad\x1a\xac\x22\xef\x4d\xd5\x26\x58\xb8\xbe\x1f\xeb\xe2\x7c\xda\x1c\x13\x46\x29\x47\xec\x39\x31\xda\xd3\xd8\x13\x92\xf9\x38\xf6\x86\xfc\xb9\xa0\x3e\x17\xe0\x26\x5c\xaf\xec\xed\xf9\xb6\x8d\x68\x53\x58\xd8\xaf\x0c\x84\x69\x57\x77\x9b\x66\x71\xdf\x21\xec\x02\x27\x15\x3d\x19\xb1\x99\x6d\x76\xf4\xe9\x33\x8d\x1f\xdb\x27\xc4\xa2\x74\x7f\xbe\x81\x7e\x79\x38\x2e\x58\x37\xd0\x67\x23\xf4\x2f\xc8\x3d\x5c\xfd\xdd\x32\x9e\xc5\x8e\xad\x85\xeb\x75\xd1\xd1\x5f\x53\xc5\xcc\xd2\xc5\xad\x7d\xe1\xd8\xc2\xa3\x14\xc1\x77\x91\x2e\xfe\xae\xd4\xe0\x6a\x09\x66\xe6\xeb\xa9\xb0\xda\xbe\x1a\x85\xb9\x6e\x74\x07\x4a\x1d\x54\xdb\xfd\x3a\x52\x97\x5e\xeb\xfd\x7a\xff\x59\x6c\x2c\x05\xa6\x0b\x98\x3e\x78\x53\x11\x1d\xdb\x10\xeb\x7a\xa3\x2f\x0e\xba\x66\xb1\x5d\xb3\x05\x15\x37\x41\xaf\x5d\x94\xb4\x15\x8a\x8f\x8b\xc8\x5a\x60\xb7\xf7\x1e\x5b\x15\x86\x92\x04\x45\x11\x44\x5a\x42\x48\x18\xc5\x04\x8c\xa2\x69\x1c\x21\x09\x49\x84\x45\x4c\x51\x10\x41\x40\x65\x41\xc1\x61\x18\x56\x80\x82\x33\x32\x8a\x00\x45\xa2\x71\x4a\x96\x45\x45\x04\xc2\x71\x23\xd1\x0d\x63\x2b\x9a\x3d\xb6\x62\x08\x95\x32\xb6\x7a\x6f\xc3\x75\xc3\x5b\xc7\xd6\x94\xaa\x90\xf7\xb9\x22\xc7\x4c\x18\x5b\x0b\xcb\xc6\x6a\x30\xdb\x98\xdb\x46\x07\x85\x27\xc5\x8e\x32\x55\x26\x56\x85\xe3\x46\xf6\x76\x2a\x08\x9c\xf2\x3e\x58\x93\xfb\x65\x7d\xa9\x95\x96\xc2\x63\x6d\x42\xd6\xa8\xda\x6c\x26\x8e\x5e\x5b\x86\xd4\x93\x5f\x19\xbc\xd6\x62\x95\x86\xdc\x63\xdb\xef\x13\xb1\xd6\xa1\xf6\xd6\x16\x80\x56\xf1\xdf\x35\xb6\xde\x3a\xb6\xdd\xe8\xcf\xef\xd4\xf3\xb0\x24\xdd\x73\x6c\xfd\x85\xb9\x62\x56\xde\xfa\x2b\xc7\x36\xf6\x4e\x63\xeb\xb5\x71\xd6\x1f\x5b\x5f\xd5\xf7\x91\xd1\x24\xe9\xe2\x9b\x6d\x97\xb7\x6f\x3a\x5a\x45\xa8\xc2\xbc\x50\x6e\x4a\x95\xca\x72\x5e\x25\x17\xe6\xda\x5a\xa9\xaf\xab\x1e\xb1\xdc\xa8\xe5\x47\xb5\xb3\xaf\xd5\x2a\x48\x65\xd8\xa8\x72\xd5\xb1\x02\x8a\x25\xb6\xba\xd7\x47\x6c\x49\xd0\xd0\x7d\x69\x4d\x9b\xad\xaa\xfe\xc6\xe6\xcc\x5b\x13\x0f\xb7\x3e\xbf\xfb\xe9\x70\xcf\x44\x70\xcc\xd3\xa5\xc7\x33\x84\x30\x7a\xe7\xd0\x97\x4a\xe1\x43\xa3\xa2\x04\xa1\x6e\xbf\xd6\x62\xfb\x53\xa8\xc1\x4d\xa1\xcf\xaa\x9c\x75\xfe\x74\xfc\x5d\x58\x37\x73\x1d\xc1\x1a\xc7\x79\x1c\xe1\x4c\xee\x23\x3f\xe0\xbb\xee\x2e\xb1\x9b\xa5\x3b\x25\x1b\x27\xdc\x55\x8c\x41\xa3\x76\xad\x37\xe2\xa0\xcf\x47\xf0\xa7\xd0\x41\xcb\x4f\x27\xc7\x22\x5f\xa8\x9a\xfb\x74\xeb\xc5\x82\x5f\xd4\xa9\x09\x9b\xae\x32\x76\x36\xdd\x57\xb2\x78\x22\x69\x92\xa6\xb0\x95\x5b\xf2\xc4\x25\xd1\xcc\x55\xc7\xfb\x4a\x9f\x44\x26\x4d\xfe\x54\xd6\x32\x35\x70\x7a\x97\xa3\x2f\x88\x7b\xef\x63\xbe\x33\xbe\xbc\x2b\x22\x4f\xb0\x40\x9d\x76\xd4\x19\x46\x83\x5a\xbb\x02\x89\xb6\x09\x40\xd8\xbb\x92\xb9\xf1\xaf\xa1\xbc\x99\x1f\xff\x08\xf3\x5c\x1c\x25\xf8\x75\xe8\x0a\xcd\x6b\xd9\x39\xa2\x08\x73\x72\x32\x1b\x38\xe5\xc7\x03\x7e\x3a\x3b\x71\x2c\x8e\x39\xf7\x12\xd0\x1b\x38\x73\x0f\x5e\xcb\xc5\x56\xf4\xb8\xb6\x38\x6e\xfc\x9b\x4b\x6f\xe0\xc7\xc3\x90\x8f\xa3\xc8\x59\x70\x4f\xe7\xc7\xbe\xc5\xba\x7c\xf8\x2a\xd6\xcb\x39\xf5\xa3\x84\xc7\x70\x04\x5d\x98\xed\xe0\xb7\x97\x27\x1c\xc7\x9d\x80\xfa\x14\x9c\x76\x9a\xc4\xec\xf1\x8c\xa9\x1b\xd9\x54\xe5\xdc\x0c\x1e\x8f\x7b\x7c\x8a\x3d\xb6\x35\x83\xe9\xe0\xf6\xdc\x7b\xf0\xed\xe3\x0a\xb3\x9e\x10\xaa\xae\x92\x24\x5e\x80\xe0\xa2\xe0\x7b\x08\xe0\xe3\x4a\xb0\xe9\x2b\x45\x38\x3d\xbb\xf3\x5c\x88\xd0\xb5\xc8\xd7\x7a\x63\x08\xc7\xb5\xca\x4f\x57\x74\xe4\x9e\xe7\x5b\x75\x7d\x8a\x2e\xcc\x72\xf0\xd3\x96\x13\x1e\xe3\x39\x3a\xbf\xab\xfa\x76\xb6\xce\x70\xe6\x1b\xde\xe2\x18\x0c\xdd\xba\x7d\x75\xb7\x1e\x71\x5c\x6f\x92\x59\xe6\x17\x77\x9f\xf8\xf5\x0c\x9f\x23\x8b\x70\x2e\x83\x08\x9f\x91\x93\x9c\xd3\x19\xf4\x2e\x48\xbf\x0b\x7b\x2e\xaa\x5c\xcc\x05\x87\x2a\x25\xb2\x16\xbd\xf0\xfd\x56\xfe\x22\xf8\xb2\x98\x3c\x3f\xa2\x3a\x93\xd3\xfb\xe8\xf1\x04\x5b\x5e\x2e\x33\xb5\x79\x1f\xde\x72\xf1\x94\xce\x4b\xc0\xb1\x66\x18\x8b\xf5\xea\x36\x8e\x4e\x71\xe5\xee\xd1\xe0\x10\xec\x58\xfe\x56\x82\x6a\xf2\xee\x49\xa7\xf7\xe0\x30\x8a\x2d\x9f\xdf\xfa\x0c\x3e\x9d\x9d\xdb\xfd\x74\x76\xf6\x7b\x82\x10\x77\x18\xb7\x7d\x3c\x59\x1c\x5f\x98\x1d\x39\x58\xef\xa6\xdd\x0b\x14\x9b\xa9\x37\xef\xac\xca\xb3\x83\xa2\x0c\x9d\xf7\x2f\xc4\xba\x55\xa1\x99\x04\x4e\xe6\x69\xc1\x99\x5b\xa7\x33\x23\x0f\xf0\x02\xde\x6f\xb7\x83\x34\xdc\xd9\x1c\xc7\x78\xd9\x29\x42\x3f\x0b\x77\xf0\xd9\xfb\xd5\xf5\x73\xf0\x54\xac\x99\x69\xbf\x03\x94\xc1\xa8\x9f\x43\x39\x28\x0f\x46\x74\x27\x6e\xe3\x50\x67\xa6\x6f\x79\x2d\x39\x84\xfc\xde\xc6\x70\x82\xfa\x9a\x7c\x33\x19\x5d\xe4\xf6\xa3\xfb\x2b\xfa\xec\x7e\xa5\x4c\xf6\x23\x0d\xf2\x0b\x13\xba\xee\xea\xa7\xe9\x3f\x7c\xa5\x56\x96\x24\x21\xd8\xfc\x42\xc4\x5d\xde\xf5\xd3\xa4\x89\xbd\x29\x2c\x4b\xac\xb8\x46\xf9\xe5\x0b\x8a\x28\x3f\x4d\xa6\xc3\xb1\xf9\x59\x72\x24\x56\xbb\x4e\x51\x1f\x7f\x26\xf6\x33\x5c\x3b\x8a\x3d\x76\x02\x7c\xa9\x83\x9f\x22\x3d\x9d\x42\xdd\xc9\xc3\xd3\x48\xe4\x91\x21\x63\x5e\x97\x4a\xec\x7e\xe1\xeb\x1c\x71\x2e\xde\xb3\x83\x58\x78\xb2\xfd\x33\xcc\xe6\x1c\xff\xd5\x53\x7d\xef\xe8\xdd\x20\x90\x07\x15\x46\x5e\x34\x8c\xc5\xd5\x5a\x4e\xc1\x99\x99\x22\x7c\xfe\x1c\x5c\x45\xf5\xf5\x3f\xff\x81\x1e\x2c\x43\x93\x43\xab\x69\x0f\xdf\xbf\xdb\x60\x67\x7f\xf9\xf2\x04\x25\x03\x4a\x86\x9c\x0f\xd0\xab\xc5\x27\x83\x8a\xc6\x7a\x36\xb7\x73\x91\x3f\x01\x4d\x67\xe0\x04\x34\xc2\xc2\x17\x68\x5c\xe5\xfa\x9c\x67\x64\xd0\x0f\x08\xc3\x72\x2f\x44\xab\x32\xaf\x84\x96\x89\xca\x8d\x5f\xb3\x1c\xed\x93\x85\xca\x9d\x3e\x57\xab\xb4\x0f\x4b\x40\x50\x9f\x2b\x73\x7d\xae\x5d\xe4\x06\x91\x55\x11\xf7\x6d\xa7\x0d\x8d\xba\x25\xc7\x64\xfa\x9c\x77\xff\xba\xf3\xa8\xc4\x35\xb9\x21\x07\x15\xd9\x41\x91\x2d\x71\xe9\x77\x86\x45\xbe\xf2\x91\x52\xcc\xfd\x94\x71\x4a\x27\x63\x91\x2c\x89\x93\x53\xfd\x44\xcb\x46\xb1\xca\xf2\x13\xfd\x8c\x15\xc5\x44\x4d\xf8\x53\xd9\x7f\x5c\x0f\x61\x3e\xe2\xb4\x10\x54\x09\xd2\x0d\xe6\x32\x0d\x9c\x17\x95\xfe\x41\x35\x24\x30\x73\xaa\x8b\x98\x32\xd8\x7d\x8d\x22\x5a\xe2\xf8\x37\x28\x24\xd9\x34\xce\x6a\x48\x79\xad\xa3\x6b\x58\xf6\xcc\x04\x83\x5e\x13\x92\x05\x5b\x70\x4c\x0c\x92\xd7\xcb\x15\x24\x19\xcb\x95\x06\x6c\xe0\xca\xf0\x7f\x02\x00\x00\xff\xff\x44\x05\x5e\xc4\x07\x9b\x00\x00") - -func asset_stat_trustlines_2HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_2HorizonSql, - "asset_stat_trustlines_2-horizon.sql", - ) -} - -func asset_stat_trustlines_2HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_2HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_2-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0x8d, 0x40, 0xca, 0xbe, 0xa3, 0x89, 0x15, 0x2, 0x2c, 0x76, 0xb0, 0x49, 0x86, 0x75, 0x73, 0xe, 0x1f, 0x27, 0x61, 0x20, 0xbe, 0x7d, 0x79, 0xdc, 0xa3, 0x28, 0x7d, 0x69, 0xd8, 0x4f, 0x4f}} - return a, nil -} - -var _asset_stat_trustlines_3CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xa2\xcc\xf2\xef\xfb\xf9\x14\xc4\xbc\xe9\x79\xc2\x9e\x47\xa0\x58\x67\xee\x9c\x08\x54\xdc\xc5\x7d\xbd\x71\xa3\xa3\x80\x02\x51\x36\x59\xdc\x6e\x9c\xef\xfe\x0f\x71\x43\x45\xdb\xd6\x9e\xe7\x9c\x7f\xc4\xf0\x62\xa6\x1b\x92\x5f\xfd\x2a\x2b\x33\xab\x2a\xa1\x93\xef\xdf\xbf\x7c\xff\x8e\x35\x1c\x3f\xd0\x3d\xd4\x6e\x56\x31\x15\x06\x50\x86\x3e\xc2\xd4\xd0\x72\xbf\x7c\xff\xfe\x65\x73\x3d\x17\x5a\x2e\x52\x31\xcd\x73\xac\xa3\xc0\x1c\x79\xbe\xe1\xd8\x18\xff\x37\xf3\x37\x11\x93\x92\x57\x98\xab\xbf\x6d\x6e\x3f\x13\xf9\xd2\x16\x3b\x98\x1f\xc0\x00\x59\xc8\x0e\xde\x02\xc3\x42\x4e\x18\x60\xbf\x30\xfc\x67\x74\xc9\x74\x94\xe9\xe5\x59\x43\x35\xd1\x9b\x61\xbf\x05\x1e\xb4\x7d\xa8\x04\x86\x63\xbf\xf9\xc8\xdf\xe0\x5e\x0a\x2b\xa6\xb1\x81\x46\xb6\xe2\xa8\x86\xad\x63\xbf\xb0\x97\x6e\x27\xcf\xbd\xfc\xdc\xb7\x6d\xab\xd0\x53\xdf\x14\xc7\xd6\x1c\xcf\x32\x6c\xfd\xcd\x0f\x3c\xc3\xd6\x7d\xec\x17\xe6\xd8\x3b\x8c\x31\x52\xa6\x6f\x5a\x68\x6f\xdb\x92\x1d\xd5\x40\x9b\xeb\x1a\x34\x7d\x74\xd2\x8c\x65\xd8\x6f\x16\xf2\x7d\xa8\x47\x02\x0b\xe8\xd9\x86\xad\x6f\x45\x3c\x67\xf1\xe6\x23\x25\xf4\x8c\x60\xb5\x01\xd7\xb4\x9f\x3b\x05\x20\xe8\x29\xe3\x37\x17\x06\x63\xec\x17\xe6\x86\xb2\x69\x28\xaf\x1b\x8d\x29\x30\x80\xa6\xa3\xff\xfc\xf2\x25\xd7\xaa\x37\xb0\x92\x94\x13\x07\x58\x29\x8f\x89\x83\x52\xbb\xd3\xde\x49\xfe\x1d\xba\xba\x07\x55\x34\x36\xfc\x40\x5e\xf9\x68\xf6\xf3\xa6\xb4\xaf\xb8\xb3\xd0\xf1\x42\xcb\xbf\x4f\x18\xd9\xf3\x7b\x24\x4d\xa4\xea\xc8\xbb\x47\x72\xc3\x53\x43\xe8\x4e\xc9\x3b\xc4\x64\xe4\x07\x8e\xa6\x21\xcf\xb0\x55\xb4\xbc\x2d\x0b\x15\xc5\x09\xed\x40\x86\x26\xb4\x15\xe4\xff\xfc\x22\x54\x3b\x62\x0b\xeb\x08\x99\xaa\x18\x93\xae\x4b\xd5\x61\x82\x7a\x1d\x6f\x85\x45\xe8\xd9\xba\xd4\xee\xb4\x84\x92\xd4\x89\xdd\x74\x2a\xf8\xe6\x4e\xd1\xea\x1e\xfc\x60\xf9\x3e\xf4\x41\xe6\x03\xa8\x1a\xba\x83\x73\x5c\xec\x7e\x6c\x2f\xf4\x03\xd3\xb0\x91\x7f\x0b\xf9\x20\x74\x37\xee\x86\x05\x8a\xa2\xc1\x0d\xdc\xa3\xd0\xfd\xb8\x07\x93\xbf\x85\x7b\x10\xba\x1b\x77\x2b\x6f\xd8\x9a\x73\x03\xf7\x28\x74\x37\xae\x1b\xca\x7e\x28\xdf\xc0\xdc\x0a\x7c\x04\xcf\x34\xfc\xf1\x2c\x44\xe1\x2d\xcd\xc6\xc5\xee\xc7\x46\xc8\xbb\xa5\xd6\xe8\xfa\xdd\x68\x91\x1b\xdf\x82\xdb\x0a\xdc\x8d\xb7\x8d\x4a\x63\x04\xd5\xdb\xb0\x27\x72\xbf\x19\x7d\x17\x29\xd1\xec\xed\xce\x66\x64\x68\xdf\x00\x97\xa1\x7d\x37\xe1\x5d\xf4\xbb\xc5\x75\x2f\xf2\x51\xcc\xcd\x1a\xe0\x7d\xd8\x8d\xd4\x0e\x39\x92\x3d\x07\x4e\x0c\xb9\xb7\x65\x0f\xa1\xf1\x3d\xb1\x63\xa0\x7b\x47\xf2\x10\xb8\x6e\xcb\x1d\x03\xd1\x3b\x72\x87\xc0\xf2\xae\xdc\x5d\xfc\x8e\x01\xe5\xb6\xdc\x36\x48\xbc\x2b\x73\x70\xf9\x77\x24\x37\x7e\x7c\x5b\x64\xeb\x9b\xb7\x65\x4e\x5c\xe1\xb6\xa8\x0c\xed\xdb\x02\x7b\x53\xbd\x4b\x6a\x63\x79\x3b\x41\x71\xd0\x11\xa5\x76\xa9\x2e\xc5\x85\x4d\x57\xf7\x67\xe6\x4e\xa2\x9d\x2d\x8a\x35\xe1\x02\xeb\xe7\x97\xed\xda\x58\x82\x16\xfa\xb1\x3f\x87\x75\x56\x2e\xfa\xb1\xbb\xe5\x27\xd6\x56\xc6\xc8\x82\x3f\xb0\xef\x3f\xb1\xfa\xc2\x46\xde\x0f\xec\x7b\xb4\x64\xce\xb6\x44\xa1\x23\xee\x91\xf7\x78\x5f\x4e\x10\x4f\x2f\xee\x80\xb3\xf5\x5a\x4d\x94\x3a\x37\x90\xb7\x02\x58\x5d\x3a\x05\xc0\x4a\x6d\xec\x65\xbf\xbe\xdd\x9f\xf3\x23\x90\x97\xf3\x96\xf7\xdd\xdf\xb5\x79\xd0\xd0\xbb\xfd\x39\xd1\xa5\x54\xef\x9c\xe9\x13\xeb\x97\x3a\xc5\x03\xad\xf8\x82\xf6\xa4\xf9\x23\xca\x19\x91\x8f\x74\xfe\x02\x24\x52\x40\xa3\x9a\x76\xf5\xcd\x2e\xc6\xf5\x1c\x05\xa9\xa1\x07\x4d\xcc\x84\xb6\x1e\x42\x1d\x45\x6a\xb8\x73\x01\xbe\x11\x53\x91\x06\x43\x33\x78\x0b\xa0\x6c\x22\xdf\x85\x0a\xda\xec\x26\x5e\xce\xae\x2e\x8c\x60\xfc\xe6\x18\x6a\x6c\x83\x70\xd2\xd9\xb8\x41\xee\xba\x19\x99\xee\xb1\x93\x7b\x03\x48\x52\xf8\xd6\xca\xe3\x41\xf7\xdb\x17\x0c\xc3\xf6\x67\x0c\x15\x53\xc6\xd0\x83\x4a\x80\x3c\x6c\x0e\xbd\x95\x61\xeb\xdf\x68\xe6\xaf\x68\x6c\xa4\x6e\xb5\xfa\x1a\x49\x6f\x6e\xb4\xa1\x85\x12\x84\x39\x2e\x49\x78\x0e\xcd\x30\x49\x9a\x20\xc8\x73\x71\x13\xfa\x81\xe5\xa8\x86\x66\x20\x15\x33\xec\x00\xe9\xc8\x3b\x88\x7c\xf9\xeb\x7c\xec\x0f\x5e\xfc\xa4\x2e\xfc\x87\x14\xb1\xdb\x08\x60\xb2\xa1\x1b\x76\x70\x76\xd1\x47\x33\x3b\xb4\x92\xaf\xd9\xa1\xe5\x87\x32\xb2\x03\x6f\xb3\x15\x3c\xef\xe6\x56\xc6\xb0\x35\x13\x6e\x76\x8c\x2a\xf2\x83\x64\x3a\x5b\xc1\xb1\x63\x21\xd5\xb1\xa0\x61\x27\x48\x51\xd4\x39\xe9\x60\xec\x21\x7f\xec\x98\xaa\x8f\x05\x68\x79\xce\x4c\x33\xa1\x7e\x8d\xd1\xcd\xb1\xd9\x69\x24\xdc\xb4\x6a\x1a\x50\x36\x4c\x23\xd8\x74\x6e\xdb\xff\xbd\x4a\x4c\xf3\xd6\x65\x43\xb7\x37\x6b\xa1\x0d\xad\xed\x99\xd8\x6a\xe0\xb0\xb4\xd8\x29\xfd\x2d\xda\x56\x63\xd9\xa2\x98\xad\x60\xdf\xbe\xed\x87\xe2\x5f\xbf\x30\xfc\xaf\xbf\x6e\xdc\x7d\x4e\xf0\x1c\xe7\xa2\x03\xef\x21\x9e\x8c\xe5\x19\xda\xe9\x38\xbf\x87\x74\xa9\x9e\x33\xb8\x04\xfd\x6d\x31\x2f\x1d\x63\x33\xff\x3d\xea\x13\x9b\x25\xe3\xd6\x1d\x6c\x47\x45\x71\x5f\x38\xf1\x81\xcb\x46\x4f\xe7\xe7\x47\x9b\x3f\x5d\x18\x6f\x89\xec\xce\x41\x7f\x1c\x23\xc3\x5c\xd8\xb6\xeb\xa1\xf9\xbb\x42\x72\xa8\x4c\x51\x60\x1a\x7e\xf0\xae\xe8\x61\xb5\xbd\x37\xf7\xed\x69\xc5\x74\x7c\x14\x18\xd6\x15\xcf\x8f\x02\x6b\x82\x6f\xc5\xc6\xfc\x74\x51\x7f\xc0\x3b\x1b\xef\x63\x3b\x57\x4c\xe7\xda\xde\xe0\x14\xe6\xd8\x8b\x6b\xd6\xb2\x5b\x7c\x3d\x3a\x62\xbb\x8d\xd7\xb7\x83\x93\x23\xef\xce\x08\xba\xcd\xbc\xa8\xd7\x22\x68\x64\xee\xd0\xf7\x51\x90\xa4\xcf\xad\xaf\x5e\xbd\x0c\xad\x8d\x5b\x25\x43\xbb\x9e\xa1\x20\xfb\x4a\x10\x8b\x2e\x5e\x8b\x70\xd1\x45\x4c\x75\x42\xd9\x44\x1b\x7b\x53\x8c\x28\x23\xf9\xa9\x51\x34\x36\xc2\xbb\x2d\xeb\xb6\x2f\x67\xe3\xba\xeb\xe0\x15\xdb\xd8\xdd\xb9\xd3\xf0\xd9\xad\x7b\xbd\x5f\x33\x88\xed\x82\xfd\x51\x7b\xd8\x6e\xeb\xb7\xe6\x60\xb8\x49\x13\x3f\x7d\xe1\xb9\x8e\x17\x1c\xb4\x91\x13\xf3\x42\xb7\xda\xc1\xf0\xf3\x69\x13\x2d\x03\x18\x04\xc8\x72\x03\x6c\xe3\x16\x7e\x00\x2d\x17\xdb\x2c\x99\x9c\x70\x7b\x06\x5b\x3b\x36\xba\x9c\x6c\x35\x68\x98\xa1\x17\x9b\x6a\xaf\xb5\x10\xac\x5c\xf4\xfe\xa0\x6c\xd3\x12\x31\xdc\xcb\xb0\x7f\x68\xf1\xca\xe8\xec\x32\x1b\x8e\x77\x3e\xa8\xdf\x22\x4d\xfc\x0b\xc3\xff\xc2\x04\x29\x87\x6d\x7f\xfd\x3f\xbf\x30\x86\xa6\x01\xfd\x57\xe2\x58\xc5\xb7\x61\x0f\x0f\x59\x3c\xcb\x13\x8f\xb9\x57\xb4\xb1\x4d\xb4\x6d\xbc\x2e\x91\xd0\x66\xef\xf8\x04\x15\x3f\x94\x77\x24\x3c\xe4\x9f\x4c\x40\x20\x71\xc5\xe8\x21\x78\xf0\xa5\x4b\x3e\xb1\x3d\xef\xa3\x9c\x62\xc9\xba\x3b\x66\xc6\x2d\xb1\x99\x8f\x6e\xcd\x30\x97\x3c\x63\x7b\xf8\x47\x79\x1e\x21\xee\xe7\x79\x31\xc9\x9d\x5d\x47\xf6\x1c\x99\x8e\x8b\xde\x99\xd2\x8e\x4d\x3f\x31\x11\xc5\xd2\x1d\x4f\xa8\x60\x9f\xaf\xfd\x76\xcf\x38\x1c\xad\xe8\x3d\x45\xcc\xae\x4c\x34\xa7\x4a\xd8\xe7\x81\x4f\x10\xcf\x15\x71\xd2\xda\x55\x65\x1c\x73\x44\x0f\x2b\xe3\x98\x14\xff\x76\xf4\xdb\xd3\xcd\x5b\x82\x4f\xdd\xf2\xee\x58\x86\xeb\x51\x56\xb1\x47\x00\x8f\x6c\xbb\xa2\x19\xff\x46\xa4\x36\x7c\x3f\x44\xde\xfd\x50\x8a\xa3\x26\xee\x4e\x2f\xd4\x12\x98\x86\x65\x5c\x59\x51\xdc\xdc\x0b\xfe\x27\x77\x55\x31\xeb\x8c\x3d\x55\x79\x68\x17\x15\xbf\xff\xb3\xf6\x51\x31\xcc\xc7\xf7\x3f\xb7\x50\xb7\x83\x76\x86\xb4\x1b\xc9\x7f\x25\x3b\xde\x49\xba\xf7\x61\x23\x8f\x3f\x43\xdb\x9a\x79\xb0\x3c\x09\xc5\x77\xec\x37\xce\x0d\x70\x19\x3d\xa5\xbc\x7a\x55\x19\x43\x5b\x47\x89\x1b\xfb\xb8\x72\xe2\x8f\xed\x1e\x8f\xd5\xc7\xdc\xf9\xe3\x2a\xfa\x87\xf5\x23\x3b\xea\x2a\x49\x39\xc1\xd2\x43\x7e\x68\x26\x46\xf7\x60\x69\xa1\x77\xf7\x73\xc7\x47\xac\x8f\xeb\xf3\xec\xb9\xc5\xa3\x4a\x3d\x7b\xe2\xfc\xed\x2e\xc5\xed\x6e\xba\xa5\xbd\x9d\x48\x92\x22\xee\x33\xbb\xb3\x27\xdc\x8f\x28\x2a\xb7\xd9\x59\x6b\x8e\xf7\x4e\x32\x14\xcb\x09\x1d\xe1\x1d\x9d\xdd\x86\xf4\x3f\x8c\x57\x92\xda\x62\xab\x83\x95\xa4\x4e\xfd\x98\x54\xec\x09\xd5\xae\xd8\xc6\xbe\xbd\x14\x32\xad\xc6\xb0\x58\xaa\x92\xd9\x12\xc8\x4b\x4d\x2a\x33\xa8\xe6\x6b\x52\xae\x9a\x2f\x77\xa5\x46\x97\x2c\x0e\xc1\xa8\x96\x6f\x17\xeb\x52\x37\x2b\xd6\x85\x76\x9f\x6d\x66\xd9\xfa\x80\x2c\xbe\xbc\x62\xfc\xf6\x60\x77\xff\x73\x38\xfe\x8a\x91\xaf\x18\xfe\xba\xd5\x32\xf6\xf2\xf2\x8a\xbd\x08\x4d\x41\x10\x84\x5f\xbf\x5e\xa2\x0b\xe4\xfe\xda\xf1\xdf\xbf\x7e\xbe\xc7\x30\x4b\x82\x66\x9e\x2c\x76\x45\x9a\x14\x6a\x83\x6e\xbe\x5b\x04\xc2\xb0\x2c\x0c\x06\x85\xc1\xa0\x47\xf6\x8a\x83\xe1\xb0\xc5\x88\xc3\x81\xd8\x69\x54\x72\x83\x51\x5b\xe8\x33\xec\xa0\x4e\xbd\xbc\x62\x04\x7e\x38\x5e\x31\x8e\xe6\x78\x1e\x50\x34\xff\x5b\x38\x0e\x2a\x05\xa6\x25\x51\x75\xa9\x24\x36\xb2\x35\x29\x9f\x61\x01\x29\x50\x80\x19\xd1\x0d\x29\xd7\x6e\x55\x0b\xfd\x0a\x5b\xc8\x54\xb3\xb5\x66\xb5\x94\xaf\x53\x6d\x56\x1c\xf6\x7b\xdd\xa3\x16\xb9\x13\x8a\x54\x8c\x46\x02\x45\x90\x48\xf1\x8a\xe1\x9c\x27\xdc\x9e\xb0\xc1\xeb\x69\xb4\x8f\x1a\xe2\x69\x2a\xed\xa0\x47\x06\xa8\x3c\xa7\xd1\x80\x41\x88\xe1\x54\x42\x26\x59\x99\x96\x39\x5e\x23\x01\xd4\x68\x40\x10\x32\x4b\x33\x3c\x24\x29\x0d\x6a\x04\x85\x03\xa8\xe2\x32\x4d\xca\x0c\x00\x32\xce\xca\x88\xe7\x37\xaa\xc2\x9f\x3c\x36\x18\x34\x4b\x42\x12\x01\x52\xd3\x48\x8a\x83\x38\x2b\xe3\x88\xc5\x35\x95\xd0\x18\x15\x10\x9c\x42\x68\x50\x51\x49\x5c\x66\x14\x05\xe7\x14\x00\x54\x9a\x65\x69\x92\xe6\x39\x86\x23\x48\x1a\x12\xcc\xc6\xf6\xa2\x91\x7a\x11\xfe\x6b\x8f\xcc\xa0\x62\x50\xab\xf4\xaa\x5d\xc9\xb0\x39\x3b\xc7\x17\x49\x7c\x39\xc9\xa4\x7c\x5c\x0f\xfc\x45\x69\xb1\x26\x06\x6a\xbb\x3f\x84\x99\x32\xcc\xeb\x1b\x79\x51\xa2\xaa\x70\xed\x92\xcd\x77\x91\x47\xc2\x80\xa0\x22\xb1\xcc\xf4\x1f\xe8\xc8\xa7\x1e\x2f\x67\xbe\x7e\xc5\x50\x59\x0a\x90\x48\x83\x1c\x03\x70\x02\xd1\x34\x84\x1a\xce\xb2\x24\xcb\x72\x1a\xcf\x33\x0c\xce\x42\x8a\xa7\x68\x12\x67\x20\x80\x1a\x64\xc8\x8d\x3d\x33\x48\x06\x84\x0a\x38\x95\xe2\x00\xbb\x31\xb2\xcf\x30\x76\x86\x97\x49\x72\x03\x4f\x52\x80\x62\x29\x96\x83\x04\x4b\x28\x14\xa5\x70\x2c\xcb\xa9\x94\x06\x28\x9e\xd6\x64\x48\xf1\x10\x72\x2a\x60\x70\xc0\x41\x80\x10\xc3\x52\xb4\xac\x6a\x40\x96\x5f\xa2\x40\x43\xd0\x34\x4f\xb3\x3c\x07\x98\x9d\xc5\x66\xc9\xc6\x68\x42\x48\x21\xed\xe0\x72\x99\xed\x53\xf6\xaa\x3e\xef\x2e\x0b\xa0\xe7\x3a\xd3\xd4\x3c\x2f\xd4\x83\x2c\x51\x21\x6b\x6c\x86\x65\x46\x21\x5d\xe4\x95\xa2\x8a\xcf\x04\x7f\x34\xe1\x9b\xcc\x90\x5b\x95\x4a\x0a\x13\x06\x53\x2d\x9d\xad\xa7\xaa\x56\x1a\xaf\xc8\xbe\xe6\xad\x1b\xdd\x48\xc3\x83\x46\xaf\x36\x8f\x7e\x2a\x1d\xfe\xd9\x86\x37\xff\xf8\xfb\x42\x68\x34\x77\xb6\xd3\xc0\x1b\x93\x36\x68\x69\xec\xd8\xe7\x96\xbd\x52\x46\x27\x75\x6e\x59\x99\xcf\xea\xf5\xb4\x9d\xd6\xd3\x83\x85\xde\x68\xa5\x8b\x19\x76\x86\x78\xd7\x37\xca\x21\x35\x95\x8a\x2d\xca\x19\x14\xc5\x4e\x49\xa5\x88\x86\x54\x1e\xb0\x6e\x79\xe6\xe0\xa4\x40\x39\x29\xda\x6e\xc9\x60\x1d\x2e\xa2\xa6\x12\x2c\x3a\x57\x4a\xb2\x8a\xbd\x45\xe7\xf0\xf2\xef\x33\xbd\xdf\x74\xdc\x69\xd1\x38\x0f\x18\x9c\xc4\x55\x48\x20\x85\x67\x20\x05\x71\x85\xe1\x11\xc7\xd3\x90\xc7\x39\x5c\x53\x59\x8a\x65\x58\x9c\x61\x29\x82\xd5\x10\xad\xc9\x84\x8c\x2b\x2a\x52\x34\x82\xd7\x14\x02\xca\xdc\xc6\x1a\x3f\xc3\x2b\x80\x46\x13\xa4\xaa\xaa\x84\x46\x03\xa8\xe0\x34\xe4\x08\x08\x55\x16\xd1\x32\x87\x64\x8d\x50\x71\x8d\xe0\x34\xa0\xd0\x0a\xcd\x03\x9c\x62\x21\x62\x71\x85\x84\x2a\x41\x69\x1c\xc4\x09\x9e\x7c\x89\xa6\xc7\x83\x45\xb3\x7b\x8b\x06\xcd\x15\xcb\x8c\x27\x02\xea\x41\x6f\xa1\xae\x54\x2a\x35\x1a\xe9\x68\x6a\xe6\x4b\x05\x87\x49\x59\xe5\x90\xb6\x98\x75\xb1\x33\xe9\xea\x40\x1d\xcc\x72\xae\x39\x47\x96\x99\x6d\xd6\x48\xd1\x51\x57\xd4\x28\x33\x2a\x14\x55\x62\xea\x4d\x64\x3f\x18\xce\x86\x63\x35\xdd\x92\x57\x44\xcc\xa2\x63\x46\x34\x1b\xa5\xf4\x4a\xa7\xea\x04\xe3\x21\xef\xb3\x56\x57\xe4\x17\x8d\x42\x7b\x9d\x25\x17\x73\x1d\xf6\x33\xb9\x55\xbe\x9e\x52\xc1\xc2\xce\x4d\x4a\xe9\x6e\x1b\xa8\x45\xa2\xee\x67\xa0\x0e\xbd\x01\x2d\x4f\x3c\x4e\xcd\x2d\x27\xeb\xa5\xd2\xef\x64\x8a\x9e\x9d\xcb\x7a\xad\x0e\xe5\x64\xa6\x51\x0c\xae\x25\x58\x6c\x21\x31\x20\xff\x6f\xb7\xd8\x2b\x2b\x90\x84\xe7\x41\x4f\xac\x67\x2e\x1f\x26\x3c\x03\x76\x2d\xdb\xfd\x1c\xe6\x79\xc2\xfa\x09\xb4\x2b\xe9\xe6\x27\x10\xaf\x24\x86\x3f\xba\x1a\x8c\x25\x87\x63\x1b\x93\x32\x55\x2a\x48\x74\xb7\x26\x55\x07\x2c\x55\xa6\x0a\xd5\x4c\x86\xa2\xf2\xf9\x7e\xa1\x36\xe8\x56\x87\xe5\x4a\x97\x96\x84\xfc\x28\x3b\xaa\x30\x8d\xa2\xd4\xaa\x17\x87\x59\x40\xb5\x07\xdb\x19\x6d\xbb\xee\xca\x37\xc4\x82\x4c\x4e\x0a\xde\x3c\x6d\xa0\x42\x5f\x6c\xd4\xf3\xd5\xe1\xba\x8a\x0f\xc6\x95\x99\x0a\x85\xb0\x35\xea\xd1\x34\xb9\x54\x34\x21\x38\x5a\x5f\x34\x01\x64\xa3\x1f\x37\x9e\x25\x1a\xec\x54\x23\x16\x2a\x68\x3b\xd9\xa5\xd5\x20\x72\xee\x64\x5d\xd2\xc7\xeb\x19\x43\xb6\xd2\x5c\x89\xa5\x42\x39\xdd\x74\xc3\x65\x6a\x5e\xe3\xb7\x6b\x1e\x85\xef\xae\xb8\xe8\x7e\xfd\xf0\x4f\x26\x02\x5d\x1c\x7e\xcf\x09\x02\x9f\x8d\x39\x6e\x26\xa3\xa4\x6b\x82\xd8\x2d\xe4\xf3\xed\x49\x59\xa5\x46\x74\xbf\x39\x4b\xa1\x62\x8a\x55\xdb\xb3\xac\x47\x74\xba\xcd\x8a\x99\x05\xba\xa4\x35\xbb\x11\x9c\xe4\x2e\x86\x43\xbd\xbd\xea\xae\x3d\xc3\xa8\xd0\x6e\xbd\x43\x69\xd3\x89\xe9\x16\x81\xae\xce\x24\xcb\x15\x87\x35\x97\xc8\xcc\xd1\x74\xc6\xc3\xbc\x91\xcf\x15\x8b\x45\x10\x96\x72\xd6\x8c\xa3\x15\x9f\xcf\xdb\x52\xd6\x90\xb3\x43\xc3\xcb\x07\x25\x0f\x6f\x03\xad\x34\x4d\x6b\x42\xf3\xd7\xaf\xf3\xd9\xe2\x93\x87\x06\x3c\x35\x34\xb5\xd3\xa1\xc9\x65\x08\xe4\xd4\xad\x3e\xcf\xc0\x6e\x59\x58\x0f\xdb\x63\x50\x1d\x4f\xf3\xd3\xa1\x0a\xfa\xed\x50\x0a\x57\x84\xe1\x1a\x79\xc0\xe7\xe7\xd5\xde\x71\x68\xf8\xb3\x68\xf3\x61\xd5\xf3\xa3\x54\xd8\x5d\x7b\x6e\xbe\x87\x6a\xb4\xac\x2e\xea\xed\x50\x6e\x9a\x06\xca\x1a\x83\x7e\x06\x5a\x05\xbb\x45\x39\x8c\x3c\xeb\x71\x42\x5f\x08\x2b\x69\xc7\x45\x35\x2a\xd7\x5c\xac\xf9\x4e\xad\xcf\x37\xfb\x30\x3b\xd7\xd4\x4a\xdd\x04\x4b\x1f\xd2\x62\x2e\xef\xb1\xa5\x4c\x29\xbb\x53\xfd\x75\x3f\x4b\x7a\xfa\xf0\x80\x9f\xed\x9f\x40\x1c\xe7\x7d\x5a\xd1\x14\x05\xc7\x29\x1a\x67\x08\x8a\xa6\x20\x20\x69\x15\x11\x3c\xa2\x19\x8a\x84\x1a\x8f\x08\x0d\x21\x55\xa5\x20\xc4\xa1\xac\xd2\x80\x26\x70\x12\xd2\xb8\xcc\x72\xb8\xca\xaa\x38\x1d\x1f\xd4\x48\xc9\x62\xf4\x63\x97\x6b\x8e\xe6\xb0\x06\xc3\x74\xaa\x4c\x8d\x86\x4d\x8e\xea\x06\x93\xda\xbc\x85\xc4\x99\x4b\x38\x59\x3a\x6f\x0e\x6c\x5b\xce\x2f\xb9\x2c\xfe\x5e\xcc\xbf\xf2\xb4\xe1\xc3\x9d\x3f\x3e\x71\x38\x74\x7e\xff\x27\x3e\xdb\xf7\x07\xb1\x8b\x63\xb3\x20\x21\xf0\x0b\x9f\x48\x40\xb2\x51\xb0\x70\xbc\xa9\x0b\x7d\xdf\x1d\x7b\xd0\x47\x09\x48\x1d\xe4\x07\x58\x3b\x97\xc7\xa4\xad\x30\xf6\x13\x6b\x23\x37\x40\x96\x8c\x3c\x8c\xc4\x09\xfa\x9e\x86\x34\xc7\x53\x90\xaf\xb8\x8e\x6d\xa3\x65\x60\xc2\xd0\x56\xc6\xe7\x0d\x45\xef\xe7\xdd\x03\xb6\x5d\x0b\xee\xf2\x5f\x7e\x72\xff\xff\x7f\x94\x2e\xfb\x1a\x18\x16\xfa\xfa\x03\xc3\xb7\xd9\xb3\xaf\xbb\x3f\x78\xfa\xfa\x03\xdb\x5e\x8f\x4e\x8e\xa1\xff\xf5\xc7\xf6\xed\xc0\xe8\xe4\xbf\x77\xc2\x1a\x42\xf7\x09\x5a\x70\x19\x2c\x7d\x63\x7d\xa7\xb8\x87\x7c\xe4\xcd\xdf\x13\xfe\xf2\xef\xbb\x54\x01\xfd\x20\x7a\xad\x45\xdd\x3d\x5e\x4e\x50\xc5\xd3\x6b\xe4\x3b\x78\xec\xa2\x2d\xf4\x94\xb1\x31\xdf\x5d\xbc\x32\x24\xc7\x31\x20\x76\x0a\x89\xd4\xe1\x7d\xfd\x81\x7d\x9d\x13\xc4\xdf\xc4\xdf\xf8\xd7\xdd\x05\x25\xf4\x3c\x64\x07\xd5\xa8\x6b\x5f\x7f\x60\xe0\xf4\x7c\x26\x7a\xf3\x68\xa3\xb7\xff\x7b\x50\xe4\x51\xa5\x07\xc9\x0d\xb0\x0a\x18\x9a\xd1\x18\x8a\xc4\x09\x8e\x81\xac\xcc\xb3\x0a\x03\x64\x96\xd3\x68\x85\xc2\x59\x8d\xa0\x59\x46\xe5\x79\x05\x6d\xf6\xb0\x38\x0f\x00\xaf\xd1\x08\xca\x34\x50\x49\x5e\x26\x00\xce\xed\x18\x1d\x70\x37\x56\x7c\x32\x80\x87\x2b\x51\xdf\x37\x26\x77\x72\xe9\xdf\x67\xf7\xfb\x36\x74\x37\xbc\x90\x06\x08\x48\xe2\x10\xf0\x1c\x42\x2c\x50\x10\x49\x92\x2c\x8d\x20\x47\xb0\x2c\xcb\x31\x32\x54\x68\x6a\xc3\x1c\x00\x55\x51\x28\x0d\x68\x48\x61\x70\x95\xa6\x55\x55\x23\x36\x3b\xf1\xaf\x5f\x12\x5a\xb8\xa2\x83\x67\x53\x4c\x1f\xd7\x01\xf1\x7a\x79\xcd\x09\x03\x37\x0c\x3e\xb7\xef\xb7\x34\xfc\x74\xaf\xff\xab\x35\x7c\x9f\x95\xfd\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\x46\x1d\x44\x3f\xfd\xbf\xfb\x37\x2f\xbe\xe2\x46\xef\xf7\x27\x1d\x2f\xfb\x1d\xfa\x36\x19\xd5\x59\x66\x2c\xde\x59\xce\xd8\x34\x65\x8f\xcd\x71\x6e\x3d\x6e\x93\xb5\x15\x9f\xa7\xda\x33\xbb\xaf\x57\xa7\xfd\x1e\x42\xaa\x3f\x28\x2e\xaa\xc7\x14\x55\x2e\xfa\x77\x31\x68\xac\x85\x4c\x3e\x33\x6e\x75\x9d\xd5\x00\x15\x50\x6f\x5a\x99\xdb\xe3\x74\x08\xba\x33\x7d\xc6\x77\x09\x31\xeb\x36\x03\x2a\x37\xc0\xf3\x87\x8c\x40\x79\xfc\x64\x9a\xe6\x91\x8c\x42\x46\xf0\xd6\x52\x8e\xa6\xab\x5d\xb5\x58\x70\x98\xc9\x44\x31\x26\x34\x9b\x66\xac\xa5\x57\xf7\x61\xc1\xe3\xab\x2b\x6a\x9d\x32\x7a\xa4\x55\x4a\x77\xe9\x76\xbe\x6e\x77\x28\x6e\x34\x12\x27\x0d\xd7\x68\xfb\xd3\x1c\x4b\xd0\x3d\x2a\x35\x2f\xe1\x81\x0c\xe5\x54\x86\x9c\xcf\x34\x81\xf3\x8f\x7c\xb2\xc3\x27\x9f\x12\x64\x1e\x49\x83\x35\x2b\xdc\xba\x99\x42\x6d\xa2\xd8\x5a\xce\xea\x0e\x05\x4a\x4e\x0a\xa5\x53\xae\x0f\xd7\x5e\x61\x3c\x4b\xb7\xb9\xb0\x96\x76\x4c\xd5\x35\x1a\x44\xbd\x3b\xee\xb8\x78\xaa\x51\xe8\xb7\x4a\x6b\x66\x38\xf5\xca\x42\x8a\x47\x3d\xd4\xf0\x56\x52\xb5\x4f\x5a\x69\x5d\xf5\x18\x7b\xd1\xa8\xee\xe8\x94\xec\xf6\x78\x4c\xdb\x13\x50\x22\x17\x13\xcf\x5e\x52\x84\x02\x33\xa0\x4d\xe4\x94\xb9\xa3\x21\x42\x60\x3b\xae\x96\xc6\x3b\xa2\xd3\xf5\xb2\xd9\x19\x31\xc4\xe5\x7c\x37\x3f\x67\xc5\x99\x23\x15\x2a\x2b\x3a\xdb\x19\x30\x43\xc1\x0e\xf4\x1e\xe8\x48\x92\x54\x58\x52\xfd\x51\x2a\xd7\x7c\xd2\xde\xf4\xc3\xf8\x2f\x9e\x7d\x2a\xb3\xb5\xc7\x8f\xd9\x6f\xb3\xd1\xd7\x3c\xb3\xc6\x30\xad\xde\x60\x52\xef\x03\x25\x37\xf5\x2c\xbc\x3c\xb4\x75\xc7\x24\xf4\xbe\x3b\x76\x71\x54\xa9\x5b\x8c\xa9\x09\x79\xbd\x6a\xcc\x99\xca\x60\x52\x17\xf0\x5a\x2d\xdd\x5d\xe7\xe7\xdd\xbc\xa5\x7b\x00\xb4\x27\xae\xca\xc9\x85\xb0\x25\x2c\x61\x6a\x25\xb4\x85\xe8\xc1\x66\x46\xcd\x55\xe7\xb3\x42\x2d\x43\xf7\x66\xf3\x0c\x28\x83\x09\x6d\x5a\x19\xa6\xdd\xed\xea\x70\xe2\x31\x43\x8b\xb5\x64\xaf\xa6\xd6\xa5\x76\x4e\x39\xa6\x3d\x2b\xcc\x04\x19\x60\x62\x39\x25\xae\x53\x30\x73\x69\xa4\x2b\x80\x6d\x0c\x82\x62\xa5\xb2\xee\xf7\xb8\x45\xcf\x18\x65\x60\x36\xa4\xab\x74\x94\x2b\x1d\x9d\x67\xb4\x85\x33\xfb\x8b\x8e\x61\xf4\x7b\xaf\x27\x89\xb5\x48\xdf\x59\x22\xcc\xa8\x45\xa7\x13\xea\xb5\x79\x33\xc8\xb1\x99\x71\xa9\x0a\x24\xc4\xab\xbd\x86\x56\x28\xa5\xca\x06\x5d\x9e\x77\xeb\xa9\x91\x10\xb0\x20\x7d\x38\x8e\x78\x85\x43\xfb\xcd\x7c\x29\x5c\x35\x1d\x5a\x6e\x56\x3b\xa2\xd3\x20\xbb\x45\xc9\x4b\x17\x56\x93\x5c\xad\xe8\xcc\xaa\xfc\x12\x8c\xe6\xbe\xb6\x48\x4b\x6b\x46\x61\xdc\x61\x60\xf7\x35\x39\xdd\x59\x8d\x17\xd3\x8e\x12\xc8\x01\x4a\x8b\x79\x7c\xbd\xb6\xd0\xbc\x63\x74\xd6\x20\x5b\x2f\x80\x79\x59\xef\x2f\x9c\xa8\x15\x6f\x26\x31\x55\x54\x87\xfa\x64\x59\x83\xdd\x06\xcf\x64\xd6\x9a\xcf\x23\x5c\x71\x3c\x69\x34\x58\x67\xfa\xe5\x69\xde\xa9\xb0\xd3\xf9\x74\x71\x7c\x13\xe1\x68\x4f\xc2\x79\x7c\x89\x94\x10\x5d\xcf\xf7\xba\x78\x73\x19\x9d\xa8\xf6\xa9\x3c\x8e\xc6\x75\x46\x58\xf1\x59\xbc\xe1\x17\x44\x7d\xae\x10\x2c\x41\x74\x79\x6e\x38\xa1\xac\xea\xd4\xe2\x9b\x2c\x3d\xcd\x82\xb9\x76\xd0\x04\x77\x84\x86\x87\xf6\x05\xd3\x5e\x42\x7a\x44\xfb\x21\x85\xd6\x82\x48\xd4\x9b\x75\xa5\xa2\x67\xf5\xb0\xce\x23\xc2\x75\x66\xd2\x24\x2d\x5b\x75\x09\x94\x90\x3c\x92\x2c\x34\xa6\xb8\x19\x13\xce\xcb\x04\x3e\xe4\xeb\x62\x9b\x9e\xf8\xa3\xb1\x68\x57\x46\x04\x6c\x97\x18\x47\x4a\x29\xb5\x94\xdd\xc4\x33\xc7\xfe\x64\x0e\xf1\xf6\xe3\xfe\x76\x2b\xf5\x7c\xe5\xad\xea\x8f\x66\x5f\x63\x6f\x56\x7f\xc6\x5b\x53\xc4\x2b\xf6\xcc\x8b\x61\x2f\xdd\x76\x8e\x78\x79\xc5\x78\x92\x04\x80\x25\x71\xc0\x70\x34\xc5\xb2\x34\x87\xb3\xd1\x6b\x3b\xc4\xd9\x3b\x56\x67\x53\xf0\x7f\x5f\x67\xc8\x8f\x75\xe6\xda\x58\x5f\x7b\xbd\xf8\xc3\xa3\x1d\x7f\xc5\xf8\x98\x6d\x97\x01\xcf\x21\x99\x82\x88\xe3\x59\x9a\x01\x24\xcd\x50\x40\x81\x2a\x49\x28\x3c\x85\x08\x20\x6b\x0a\xce\x52\x32\x20\x01\x42\x1c\x40\x04\x45\xc8\x1a\x8b\x13\x90\x56\x79\x9c\xd2\x88\xfd\xcb\x2a\x27\x6b\x99\xda\x59\x2c\xcb\x18\xe9\x0c\x5e\xc5\xcb\x85\x55\x30\x5e\x48\x84\x39\xc4\xe1\xca\x75\x08\x5e\x2a\x2e\xe7\xd5\xec\xaa\x4e\x07\x19\x51\xc9\xf6\xe6\x8b\x3c\xbf\x00\x7a\xe0\xd5\xed\x91\x70\xc7\x71\xf5\xa5\xa7\xc8\xf7\xb2\xcf\xb4\x3f\x4c\xa7\x94\xa4\x58\xf4\x7e\xfb\x97\x4f\xeb\x92\xf5\xae\xf1\xac\x02\x35\x0d\xca\x9c\x42\x30\x38\x09\x20\x60\x39\x8e\x22\x18\x5a\x91\x71\x19\x68\x1a\x01\x21\xa9\x42\x8d\xc2\x71\x5c\x43\x1a\xc5\xab\x24\x81\x34\x85\xa3\x58\x55\x95\x35\x19\xc1\xad\xde\xc9\x4b\xbd\xff\x87\xfa\xfd\x59\x7a\xe7\xa8\xe3\xfd\x89\xaf\xfd\x3c\xa9\x77\x85\xd0\x64\x8a\x84\x80\x53\x34\x02\x27\x29\x02\x12\x2c\x89\x68\x96\x85\x2c\xc1\x32\x38\x4f\x12\x1a\xcd\xb3\x0c\x85\x34\x8e\xa2\x14\x8e\x43\x2c\x0e\x39\x08\x39\x48\xd1\x8a\xc2\xd3\x32\xd8\xbd\xca\x72\x53\xef\xd9\xd0\x01\x4e\x40\xd1\xb3\x6c\x43\x5c\xba\xcd\x34\x70\x8a\x52\x6a\x4d\xb0\xad\x95\xe1\x13\xa6\x56\xcb\x0f\xad\x66\x5f\xf7\xc2\x76\xaa\x13\xc9\x97\xbb\xd9\xd4\xae\x53\xfa\x35\xdd\xbe\xab\xf7\xdc\x73\xed\xd7\x95\xc7\xda\xbf\x57\xef\x80\x05\xb2\xcc\x03\x92\xe7\x01\xaf\xa9\x32\xab\x52\x14\xc5\x21\x96\x94\x71\x02\x52\x38\x03\x10\xa0\x71\x19\xa7\x20\xa3\xe0\x1a\x4e\x01\x4a\x56\x28\x40\x11\x80\xa2\x70\x95\xa7\x65\x05\xdf\xea\x3d\xc1\xde\xff\x43\xfd\xfe\x2c\xbd\xd7\xa8\x67\xf4\x7e\x75\xce\xf8\x9c\x09\xe3\x77\xcf\x16\x85\x2a\x57\x6c\xce\x9b\x53\xb9\x42\x16\x05\xd0\xef\x4d\x5a\x5e\xc5\x9a\x0c\x70\x5c\x2b\x70\x7e\xb5\xc4\x5a\xb8\xd8\x5a\x94\xfb\x69\x61\x00\x84\xc3\xca\x39\x3a\x32\x67\xea\x38\xff\x5d\x08\x64\x7d\xd0\x62\x44\xd6\xc9\x55\xf1\x6a\x33\xb5\x18\xb6\xb3\xfc\x7a\x30\x1f\xf4\x3a\x60\x69\x34\x8c\x61\xd8\x96\x89\xdc\xdc\x6a\x56\x51\xb4\x32\xcc\xf6\x84\x79\xfc\xbd\xd8\xcc\x36\x2a\x45\x83\x3c\x9c\x34\x95\x46\x87\x2c\xd0\xe3\x99\x9d\xb1\xf4\x42\x01\xe9\x7c\x99\x33\x29\x85\x10\xed\xae\xb9\x9c\x9a\xa2\x59\xe4\xfd\xd9\xc8\xc3\x79\x96\xc8\x33\xf5\x6a\x5f\x43\x69\x8b\x9a\xba\xf9\xa0\x94\xf2\x4b\xb8\x41\xcc\xaa\x46\x40\x0b\x78\x79\xd5\xb7\xe5\xf1\xb0\xda\xa7\x9d\xdc\x66\x8d\x40\xae\xad\x7a\x50\x61\xca\x6a\xbf\x66\x8e\x72\xab\xa0\xa4\x98\x75\x91\x4d\x0b\x6a\xb5\x36\x61\x9d\xc6\xb8\x29\xf3\x8b\x82\x49\x36\x3b\x4b\xff\x40\xec\x86\x0e\x8e\x96\x71\xf2\xec\x3f\x26\x1b\xbd\xeb\xf2\x19\xb3\xc4\xa3\x51\x5a\xf8\x84\x59\x22\xdf\xe9\x67\xfc\x27\xda\x17\xce\xda\xff\xc0\xce\x2a\xd2\xdf\x33\xd1\x3a\x29\x5a\xfe\xee\xa5\xc1\xe3\x4e\x76\x63\x7b\xba\x3d\x3e\xb6\xdd\xbb\xe5\x64\x19\xab\xe2\xb6\xf5\xb9\xb7\xa8\xd4\x49\x7c\x90\xad\x6b\x43\x6d\xe0\x17\x44\xb1\x1b\x2c\x86\x10\x8a\xda\xac\x1d\x32\x2b\xab\x6c\x99\x39\x0b\xa6\x4a\x03\xa6\xc4\x96\x74\x5d\xee\x8e\x6a\x8e\xd2\x54\x47\x3c\x55\xaa\x09\x5a\x45\x6d\x0a\xd2\x6c\x20\x97\xea\xec\xca\x5f\x20\x54\xcb\x6e\x1c\x21\x35\x58\xcd\x53\xde\x24\x33\xcc\xd6\x27\xa8\xd4\xec\x0f\xaa\xd9\x75\x7a\x39\x33\xc8\x79\x53\xc8\xa5\xf8\x32\x3e\x66\xb9\x71\x11\xc8\xa9\x94\x73\x20\xf6\x9f\x77\xb2\x67\x8d\xfc\x49\x27\x9b\xb1\xe9\x4e\x4e\xf9\x4c\x27\xfb\x07\x97\x44\x77\x39\xd9\x27\xaf\x03\x1f\xcf\x01\xdd\x98\xc9\x62\x39\xa0\xa8\xa3\x9f\x98\x03\x2a\x8f\xb8\x7e\xd8\x47\x72\x35\x2c\xfa\x8b\x8c\xd4\x99\xe6\xec\xac\x23\x38\xd5\xc9\x7c\x10\x40\x58\x99\x0c\xd3\x24\x3d\x99\xa8\xab\xa2\x45\x76\x46\xb6\x83\x1a\x95\xd0\xf3\x56\xaa\x5a\x68\x74\xc6\x62\x38\x64\x0b\xc3\x56\x79\x65\xa9\xfd\xa9\x51\x9f\xe5\x34\x3b\xd7\x70\x71\x49\x18\x46\x4e\xb1\xd0\x82\xac\x43\xad\x97\xc2\xb4\x30\x56\xc2\x1e\x70\x97\xaa\x3e\x1d\xf3\x23\x75\xca\x52\xad\x9a\x51\x57\x2a\xc6\xcc\x98\x0e\x6a\xa6\x5c\x3b\x30\x4b\x76\xb8\xe1\xe9\xa0\x9e\x38\x5c\xa4\xbb\x5d\xfe\xfb\x28\xf5\x40\x40\x9a\xd4\x8f\x63\x71\xe5\xb8\xb2\x0f\x3a\x71\xf8\x4f\x69\xff\x4a\xb0\xb9\xa7\xfd\xcf\x58\x0b\xc7\xd7\xa2\x0f\xed\xfd\x3e\xbb\xfd\x4b\x7d\xdc\x0e\x38\xb9\xa3\xcc\x47\xdb\x7f\x2c\xbf\x18\x1b\x8a\xa3\xc3\x2d\xce\xf5\x77\x57\x40\xfa\xe4\x0d\xd2\x9f\xa4\xb4\xde\x5f\x38\x51\xd0\x90\xd6\x21\x5d\x73\xa7\x74\x5a\xd6\xba\xad\x12\xbd\xf2\x33\xae\x30\x4c\x49\x4d\x5f\x74\xfd\xdc\xa2\x89\xcf\x45\x29\x23\x89\xb9\x51\x3f\x96\x23\xfe\x2f\x09\x48\xb1\x04\x72\xfc\xf8\xc7\x02\x52\xf6\xf1\xf6\x3f\x3b\x20\x5d\x09\x90\xff\x58\x40\x4a\xf4\x8d\xdf\x1d\x90\x56\xd1\x8f\xbf\x29\x20\x5d\x49\x1e\xdc\xa8\x2c\xf0\xd1\x0c\xc2\x59\x75\x81\x7d\xac\x8b\xa7\x00\xb6\x7f\x64\x78\xf4\xa5\x84\x60\x79\x1d\xe5\x10\xed\xb6\x7f\x9a\x78\x81\x72\xb5\x1a\xea\x65\x91\xe8\x43\x15\xd8\x7d\x05\x82\x77\xba\x19\xaf\x56\x1d\xd5\xa8\x8e\x21\x46\x6f\x09\x08\xb9\x5c\x42\xdd\xc6\x43\x83\x58\xa3\x55\xaa\x09\xad\x21\x56\x11\x87\xd8\xb7\x43\x49\x9b\xd7\x43\xbd\xd4\xab\xd5\x4b\xcf\xea\x66\x7f\x16\x71\xff\x06\x6b\xff\x16\xe5\xa4\x6a\x92\xc7\x52\xe1\x4f\xd3\x93\xa1\x9d\xc4\x6c\xdf\xc0\x29\xa9\x6d\x01\xab\xdb\xa5\x26\x6f\xd6\x48\x7f\x9a\xee\x09\x78\x12\xf1\x1b\xad\x63\x5d\xa9\xd4\xec\x8a\xd8\xb1\xaa\xc5\x87\x7a\xf2\x39\xfa\xfe\x60\x07\x2e\xc7\xe0\x58\x7d\xf3\x4a\xe5\xc8\x93\xca\xfa\x4f\xf3\xdd\x82\x25\x11\x8d\x35\x73\xca\x70\x57\xcf\x30\xb9\x8e\x61\xfc\x33\x02\x4f\x93\x8b\xb0\x92\xb8\x1d\x1b\x39\xa5\x66\xb8\xaf\x51\x75\xc3\x9b\x75\xfb\x12\x3e\x9f\xf0\x3c\xd3\x18\x64\x22\xe1\xf3\x26\x93\x06\xfd\x4a\x71\xbf\x93\x8f\x48\x7c\x06\x53\x3f\x94\xaf\x70\xdc\x37\x73\xca\x2e\xaa\x0b\x78\xa3\xd2\xdf\xc5\x97\x33\x9e\x26\x79\x04\x4c\x22\x7a\xd6\xdc\x5d\x31\x2c\xf6\x77\x62\xe7\xdf\x0f\x79\x9a\xed\x11\x30\x89\xed\x59\x73\xa7\x6c\xf7\xf5\xf2\x6e\xd4\xa3\xbb\xf8\x8e\xca\xf3\x7c\x0f\x80\x89\x7c\x4f\x9b\x3b\xe5\x7b\x28\x69\x77\xa3\x54\xdd\xc5\x07\x65\x9e\x26\x7c\x04\x4c\x22\x7c\xd6\xdc\xd5\xa5\xc1\xb6\x54\xdd\xeb\xb1\x0e\xdd\xcd\x5a\x64\x09\x1f\xdc\x79\xbe\x1f\x31\xc8\xc4\x9e\x9c\x37\x99\x14\x25\x7c\x34\x7b\xdd\x17\xdf\xba\x5e\x27\xec\xfc\x43\x44\x9f\xc0\xfd\x26\xf1\xa7\x58\x9f\x2d\x51\x93\x3e\xcf\xf4\x34\xff\x53\xd0\xa4\x4e\x24\x34\x7b\xb5\x27\xf1\x1a\x5e\xd7\x96\x9a\x87\x4f\x57\xed\xb8\x47\x1f\xba\xba\xaf\xba\xd8\xf6\x9b\x58\x67\x38\x58\x5d\x3a\xae\x62\xbb\xed\x92\x54\xc0\xe4\xc0\x43\x08\xdb\x97\x12\xfc\x0b\xeb\x17\xc5\x96\x88\xc5\x4b\x0b\x1e\xeb\x45\x5d\x2e\x34\x4f\xbf\xc6\xf5\x28\xcb\x53\x98\x0d\xc9\xdd\x3a\xe5\x84\x62\xbc\xbe\xf4\x6b\xbc\x9a\xf4\xeb\xb6\xca\xf3\x05\xbb\xe3\x27\xc5\x1e\x25\x76\x40\xd8\x70\x3a\x3a\xc6\x09\xad\xeb\x4b\xc5\x93\x8f\x9f\x3d\x43\x61\x0f\xb2\x65\x11\x0b\x30\x77\x12\x39\xf9\x5e\xdb\xa3\x44\xe2\x20\x1b\x22\xa7\x0b\xe1\x3b\x99\x9c\x7c\x63\xee\x51\x26\x71\x90\x0d\x93\xd8\x5f\xe3\xdf\x4f\xe3\xe4\xbb\x78\x4f\x30\x89\xe3\xec\xc8\xec\x57\x09\xa7\x64\xe2\x35\x64\x6f\x85\xaf\xe7\x18\x9d\x03\x6d\x28\x9d\xc5\xc6\x77\x75\x74\xed\x73\x90\x98\xe2\x58\xae\x89\x02\x14\x35\xfb\x3f\x01\x00\x00\xff\xff\x65\x98\xb8\xaf\x3b\x72\x00\x00") - -func asset_stat_trustlines_3CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_3CoreSql, - "asset_stat_trustlines_3-core.sql", - ) -} - -func asset_stat_trustlines_3CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_3CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_3-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x79, 0xef, 0x37, 0xc2, 0x5a, 0x89, 0xc3, 0x5d, 0x2d, 0xe5, 0x45, 0x1a, 0x16, 0x8f, 0xa5, 0x61, 0xa8, 0xd6, 0xd3, 0x91, 0x6a, 0x5b, 0x6f, 0x72, 0x65, 0x72, 0x55, 0x61, 0x1b, 0x58, 0x1c}} - return a, nil -} - -var _asset_stat_trustlines_3HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\xe9\x6e\xe2\x48\xb4\xf0\xff\x7e\x0a\xab\x35\x52\xba\x95\x74\xc7\xfb\x92\xbe\x3d\x92\x01\xb3\x24\xec\x4b\x02\x8c\x46\x56\xd9\x2e\x1b\x27\x60\x13\xdb\x40\xc8\xe8\xbe\xfb\x27\x2f\x80\x31\xde\x58\x92\x19\x7d\x17\xb5\x5a\x60\x9f\x3a\x5b\x9d\xaa\xb3\x54\xa5\xea\xc7\x8f\x2f\x3f\x7e\x20\x6d\xd3\x76\x34\x0b\xf6\x3a\x75\x44\x01\x0e\x90\x80\x0d\x11\x65\x31\x9b\x7f\xf9\xf1\xe3\x8b\xfb\xbe\xb4\x98\xcd\xa1\x82\xa8\x96\x39\xdb\x01\x2c\xa1\x65\xeb\xa6\x81\x70\x3f\xe9\x9f\x58\x08\x4a\x5a\x23\x73\x4d\x74\x9b\x47\x40\xbe\xf4\x84\x3e\x62\x3b\xc0\x81\x33\x68\x38\xa2\xa3\xcf\xa0\xb9\x70\x90\xdf\x08\xfa\xcb\x7b\x35\x35\xe5\x97\xc3\xa7\xf2\x54\x77\xa1\xa1\x21\x9b\x8a\x6e\x68\xc8\x6f\xe4\x6a\xd0\x2f\xb3\x57\xbf\x36\xe8\x0c\x05\x58\x8a\x28\x9b\x86\x6a\x5a\x33\xdd\xd0\x44\xdb\xb1\x74\x43\xb3\x91\xdf\x88\x69\x04\x38\x26\x50\x7e\x11\xd5\x85\x21\x3b\xba\x69\x88\x92\xa9\xe8\xd0\x7d\xaf\x82\xa9\x0d\xf7\xc8\xcc\x74\x43\x9c\x41\xdb\x06\x9a\x07\xb0\x02\x96\xa1\x1b\xda\xaf\x80\x77\x08\x2c\x79\x22\xce\x81\x33\x41\x7e\x23\xf3\x85\x34\xd5\xe5\x1b\x57\x58\x19\x38\x60\x6a\xba\x60\x7c\xbd\x2f\x74\x91\x3e\x5f\xa8\x0b\x48\xad\x8c\x08\xc3\x5a\xaf\xdf\x43\x5a\xcd\xfa\x28\x80\xff\x39\xd1\x6d\xc7\xb4\xd6\xa2\x63\x01\x05\xda\x48\xa9\xdb\x6a\x23\xc5\x56\xb3\xd7\xef\xf2\xb5\x66\x3f\xd4\x68\x1f\x50\x94\xcd\x85\xe1\x40\x4b\x04\xb6\x0d\x1d\x51\x57\x44\xf5\x05\xae\x7f\x7d\x06\x41\xd9\xfb\xf6\x19\x24\x5d\xbb\xfa\x3c\x01\x7d\x6a\xc7\x4b\xe7\x33\xe8\x1a\x72\x1a\xb1\x10\xd4\x0e\xb9\x07\x5e\x6b\x96\x84\x61\x08\x32\x40\xeb\x71\x25\x42\x55\x85\xb2\x63\x8b\xd2\x5a\x34\x2d\x05\x5a\xa2\x64\x9a\x2f\xe9\x0d\x75\x43\x81\x6f\x62\x48\x38\xc3\x06\x9e\xa1\xdb\xa2\x69\x88\xba\x72\x4c\x6b\x73\x0e\x2d\xb0\x6d\xeb\xac\xe7\xf0\x8c\xd6\x3b\x4e\xce\xe2\xe2\xb8\xb6\x53\xa8\x68\xd0\xf2\x1a\xda\xf0\x75\x01\x0d\xf9\x28\x11\x42\xcd\xe7\x16\x5c\xea\xe6\xc2\x0e\x9e\x89\x13\x60\x4f\x4e\x44\x75\x3e\x06\x7d\x36\x37\x2d\x77\x38\x06\x73\xea\xa9\x68\x4e\xd5\xa5\x3c\x35\x6d\xa8\x88\xc0\x39\xa6\xfd\xc6\x98\x4f\x30\xa5\x60\x5c\x9e\xc0\x74\xb8\x25\x50\x14\x0b\xda\x76\x7a\xf3\x89\x63\x29\x9e\xdf\x11\xa7\xa6\xf9\xb2\x98\xe7\x80\x9e\x67\xb1\xe4\x43\x01\xdd\x3a\x12\xf1\x66\xd2\xcd\xdd\xc0\x9d\x27\x54\x15\x5a\xf9\x40\x37\xe8\x4f\x68\x12\xa8\x35\x5f\x23\x6f\x6a\x3d\x82\x48\x78\x2a\xce\x6a\x31\x77\x1b\x4c\x9c\xcc\x1e\xb0\xf7\x26\x20\x69\x9d\x69\x46\x93\xed\x48\xcf\x03\x6c\xfa\x7c\x98\x99\x80\xba\xed\x88\xce\x9b\x38\xcf\x46\xe9\x42\x9a\xf3\xbc\x90\x30\x2f\xd8\xc6\x95\xa4\x03\x4b\x9b\xe1\x9e\x09\x96\x3d\x8b\x49\xeb\x7c\x9d\xe9\xfb\x48\x57\xdb\xb6\xbd\xc8\xa2\xbc\x05\x96\x4d\x05\x1e\x19\x17\x6c\xcd\x60\x0e\x2c\x47\x97\xf5\x39\x30\x52\x9d\x77\x56\x53\x71\x7e\x64\x6c\xb2\xf5\x68\xc7\x72\x10\xdf\xf0\x68\xfa\x9e\xf2\xf2\xd0\xf3\x01\x3f\x1c\xbf\xdf\x99\x6e\x4f\x06\x5f\x5d\xff\xb0\x09\xfd\x3c\x63\x10\x73\x72\xa0\x99\xd6\x5c\x9c\xe9\x5a\x10\x30\xa4\xb0\x10\x81\xcc\x2d\xe3\xf1\xf1\x5e\x1a\xe6\xbc\xc6\xe9\xb7\x2e\xb6\xea\x83\x46\x13\xd1\x15\x9f\x72\x49\x28\xf3\x83\x7a\x3f\x27\xee\x04\xa3\xbb\x00\xe6\xa0\xbb\xd3\x31\x79\xbf\xf2\x8b\xbf\xf1\xd2\x3d\xa1\x33\x10\x9a\xc5\x13\x74\xe6\xc6\xd9\x36\x7c\x3d\x9a\xf2\x1e\x92\xdc\xad\x15\x98\x13\x76\x17\xcd\xe6\x96\x30\x61\xd4\x1f\x23\x5f\x3c\x8a\x7c\x6d\x83\xb8\x2f\x1f\x70\x10\xe4\xe5\x96\x2d\x98\x01\x8e\x91\xc5\x6f\x92\x13\x36\x08\xff\xf2\xf3\xb3\x89\x17\xf3\x70\x14\x99\x43\xd2\x81\x43\x53\x42\x00\xc8\x57\x2a\x5d\xa1\xc2\xf7\x63\x80\x67\xba\x9b\x71\xe8\x32\xfc\x66\x2c\x66\xd0\xd2\xe5\xbf\xfe\xfe\x9e\xa3\x15\x78\x3b\xa1\xd5\x14\xd8\xce\x37\x60\xac\xe1\xd4\x2b\xc5\xe4\x68\xa1\xea\x56\x6c\x93\xf2\xa0\x59\xec\xd7\x5a\xcd\x14\x79\x44\xa0\x69\x3b\xee\x6e\x90\x03\x46\x53\x70\x6c\xa4\x3b\x03\x87\x2b\xab\xd7\x7c\xc7\xfc\x0d\x72\x8c\x20\x9e\xe8\x39\x30\x08\xc3\xbe\xd0\xec\x45\x50\x4c\xe7\x9a\xfd\x3a\xdd\xd8\x62\xb1\x2a\x34\xf8\x03\x0a\xbf\xbe\xf8\x55\xb8\x26\x98\xc1\xbb\xcd\x33\xa4\xbf\x9e\xc3\xbb\xa0\xc9\x2f\xa4\x27\x4f\xe0\x0c\xdc\x21\x3f\x7e\x21\xad\x95\x01\xad\x3b\xe4\x87\x57\x9c\x2b\x76\x05\xb7\xbf\x02\xcc\x1b\x7c\x5f\xf6\x30\xee\xbf\x0c\x10\x17\x5b\x8d\x86\xd0\xec\xa7\x60\xf6\x01\x90\x56\x73\x1f\x01\x52\xeb\x21\x57\x9b\xb2\xdb\xe6\x99\xed\x21\xb9\x8a\x52\xde\x88\x1f\xd0\xdc\x6a\x28\x53\x9e\x3d\x5d\x36\x5b\xfd\x88\x3e\x91\xa7\x5a\xbf\xba\x65\x2b\x5c\x7f\xdb\x23\xbf\xc3\x12\x61\xe4\x18\xe1\x0f\x90\x78\x0a\x68\xd7\x6f\xe7\x5a\xaf\x53\x47\xe6\x96\x29\x43\x65\x61\x81\x29\x32\x05\x86\xb6\x00\x1a\xf4\xd4\x90\xb3\x5e\x18\x66\x37\xdb\xd0\x02\xf6\x37\xb6\xba\xe3\x7f\xd3\xb7\x71\xba\xdc\x5a\x76\x26\x7e\xa4\x2b\xf4\x07\xdd\x66\x2f\xf4\xec\x0b\x82\x20\x48\x9d\x6f\x56\x06\x7c\x45\x40\x3c\xe9\x1b\x8d\x81\x3f\xdf\xf5\xfa\xdd\x5a\xb1\xef\x41\xf0\x3d\xe4\x0f\xf1\x0f\xa4\x27\xd4\x85\x62\x1f\xf9\x03\x73\x7f\x45\x7b\x23\x73\x20\x9e\x27\x5d\x16\xfa\x8b\x09\x87\xc7\x09\x97\x67\xa6\x3a\x4f\xbe\x1c\x14\xb6\x22\x6e\x1f\x9d\x24\xe1\xb7\x2f\x08\x52\xe4\x7b\x02\xf2\x54\x15\x9a\xc8\x1f\xd8\x5f\xd8\xdf\xb7\x7f\x60\x7f\xe1\x7f\xff\xf9\x07\xee\x7d\xc7\xff\xc2\xff\x46\xfa\xfe\x4b\x44\xa8\xf7\x04\x57\x29\x42\xb3\xf4\x3d\x56\x33\x39\xfc\xc0\x99\x9a\xc9\xa6\xf0\xd1\x9a\xf9\x9f\x53\x34\x73\xe8\x53\x03\x3d\x6c\xfd\x70\x3e\x45\xec\xdc\xf6\x01\x46\x8f\x63\x04\xe9\xb9\xba\x42\x7e\xef\x66\x80\x1b\xff\x71\x7f\xd4\x16\x90\xdf\xe1\x11\xf1\x3d\x6e\xd4\x5e\x94\xc7\x28\xc2\x08\x8b\x9b\x61\x9c\x9f\xc3\xd8\x10\xe8\x5c\x2e\xe3\x90\x46\x38\xdd\x1b\x90\xfb\xec\xee\xac\xec\x90\xdb\xb8\x30\xef\x6c\x6e\x63\x90\x46\xb9\x0d\x0f\x92\x54\x6e\x5d\xcf\xa5\x40\x15\x2c\xa6\x8e\xe8\x00\x69\x0a\xed\x39\x90\x21\xf2\x1b\xb9\xba\xfa\xb5\xff\x76\xa5\x3b\x13\xd1\xd4\x95\xd0\x52\xda\x9e\xac\xe1\xf8\x37\x10\xd1\x1b\x60\xf9\xc4\xf3\xc7\x62\x38\xf9\xf6\x25\xd2\x15\x44\xd2\x35\xdd\x70\xbc\xc0\xa0\x39\xa8\xd7\x7d\x71\xc0\xcc\x0d\xe3\x11\x79\x02\x2c\x20\x3b\xd0\x42\x96\xc0\x5a\xeb\x86\x16\x01\x33\x16\xb3\x6d\xc8\x8f\xe8\x86\x03\x35\x68\x45\x40\xd4\x29\xd0\x6c\xc4\x9e\x81\xe9\xf4\x90\x8c\x63\xce\xa6\x87\x44\xbe\xe1\x14\xf5\x7d\x0b\x79\xd8\xed\xd1\xbc\xe1\x54\x75\x44\xab\x1d\x5b\x95\x38\xf0\xed\x40\x21\xf3\xf9\x54\xf7\x6a\xf6\x88\xa3\xcf\xa0\xed\x80\xd9\x1c\x71\xfb\xcc\xfb\x89\xbc\x9b\x06\x3c\x64\x34\x29\x2b\xda\xc4\xa3\x41\x3a\x95\x8f\xe7\x6d\xf2\x95\x80\x35\x30\x43\xbe\xdb\xf7\x23\x3a\xcc\x7b\x50\x6b\x16\xbb\x82\x17\x7e\x15\x46\xc1\xa3\x66\x0b\x69\xd4\x9a\x8f\x7c\x7d\x20\x6c\x7f\xf3\xc3\xdd\xef\x22\x5f\xac\x0a\x08\x96\x25\xcc\xc9\x6a\x8f\x22\x3a\x30\xc5\xa0\xe8\x81\x18\xf0\xcd\x59\x82\xe9\xb7\xab\x04\x89\xaf\xee\xee\x2c\xa8\xc9\x53\x60\xdb\xdf\xa3\xdd\xe5\xaf\x55\xc4\xd8\x16\x4d\x7e\x4f\xe9\x28\x3f\x37\x3e\x5b\x32\xbf\xa2\xb3\x95\x2b\x7e\x64\xec\x6a\x75\xf1\x6c\xc6\x82\xcb\xa6\x12\x07\x8e\xe1\xf1\xe0\x7e\xf9\x2f\xa6\x01\x45\xa7\x8d\xb0\xf8\xf2\xc2\x85\xcc\x36\x8c\xf3\xd3\x8c\x36\x4d\x10\xa4\xf5\xd4\x14\x4a\x48\x61\x94\x21\x91\x5f\xa1\x4b\x17\x68\x8b\x2b\xf2\xfa\xa7\xae\x24\xf1\xb6\xa9\xf9\x9c\x6b\x75\x01\x9e\xc0\xec\x22\x63\x46\x4c\x9a\xe9\x0f\x4b\x5c\x49\x90\x5f\xbd\x85\x8f\xaf\x09\xd6\xec\xd9\x71\xfc\x2b\x05\x3a\x40\x9f\xda\xc8\xb3\x6d\x1a\x52\xb2\xb1\x6d\x0a\x65\xe7\xea\x21\xc0\x13\xe8\x61\xb3\x6e\x9d\xc0\x5b\x68\x31\x39\xd7\x28\x8c\x5b\xc7\x8e\x6f\x18\xa8\x25\x54\x19\xf5\x3a\x62\xcb\xc7\x66\x96\x43\x23\x14\x76\x1d\x91\x0f\x7e\xbb\x98\x1c\x71\x4c\xe6\xc2\xd9\xf9\xa6\x68\x1b\x0b\x02\x27\xb3\x91\x0f\xbb\x98\x2b\xb9\x61\xb7\xa6\x13\xfc\x8c\xac\xb3\x1f\xc8\x82\x1d\xc4\x03\x0e\x98\x8a\xb2\xa9\x1b\x76\xbc\x0d\xaa\x10\x8a\x73\xd3\x9c\xc6\xbf\xf5\x56\x3e\x55\x98\xd4\xd7\xde\x6b\x0b\xda\xd0\x5a\x26\x81\xb8\x71\xa8\xf3\x26\x7a\x61\x92\xfe\x9e\x04\x35\xb7\x4c\xc7\x94\xcd\x69\xa2\x5c\xd1\x3e\xda\x18\x0b\x04\x0a\xb4\xbc\xf0\xc2\x7f\x6e\x2f\x64\x19\xda\xb6\xba\x98\x8a\x89\x86\x12\x08\x0e\xf4\x29\x54\x92\xa1\x92\x87\x55\x42\xed\xfa\xdc\x51\x96\xb0\x1e\x92\xe1\xf3\xf2\xcf\x36\xd9\xf3\xd7\xb1\x22\x5f\xd6\x8d\xa5\xd2\xf8\x2c\xb7\x76\x94\xa0\x67\xba\xb9\x54\x5a\x87\x6e\x2f\x1e\x3c\xc5\x0d\x86\x56\x76\x2e\x66\x9b\x59\x69\xce\xfe\xae\xaa\x84\x54\xc8\x8d\xfc\x65\x5f\x14\xcf\x03\x9e\xe9\x00\x83\x91\x6f\x2e\x2c\x79\xbb\x4d\x23\xc1\xf5\x6c\xa6\x93\xab\xab\xbb\xbb\xe4\x54\x2c\x79\x1c\x04\x0b\x6b\xe7\xaa\x33\xd8\x0b\xf8\xed\xa2\xf1\x42\x30\x25\x9e\xe2\xbd\xbc\xbd\x30\x89\x64\x23\x3b\x11\xd3\x80\x82\xcd\x91\x69\x20\x7e\x1e\x1c\x0b\x70\xb8\xa7\x33\x03\x2e\x95\xdc\x16\x2a\x85\xa2\xc7\x92\x6e\x8b\x36\x9c\x4e\xa1\x85\x48\xa6\x39\x85\xc0\xd8\xf8\x24\x5d\x86\xa2\xb1\xe7\x7f\xfd\x67\xfb\x3e\x79\xb7\x9b\x48\x8c\x78\xeb\xbd\xfd\x4c\xd1\x97\xa1\x65\xfa\xd8\x9d\x9f\x1e\xd7\xa2\xb7\x37\x18\x29\x56\x85\xe2\x03\xf2\xed\x5b\x58\x83\x7f\x22\xe8\xf7\xef\x59\xa8\xe2\x9a\x6f\x94\xf6\x3f\x07\x7a\xcc\x81\x6f\x4f\xa7\x11\xf4\x11\x85\x7b\x0c\xa6\x0e\xa5\xf8\x15\xee\x0b\x0c\xae\xf8\x3d\x0b\x39\x3d\x69\x9e\x29\xec\x1c\x5f\x9a\xb5\x3f\xe0\x32\xde\x34\x83\xca\x67\xf9\xd3\x23\x85\x3d\xd3\xa3\x66\x50\x3b\xf4\xa9\x49\x0d\x52\xbc\xea\xde\x9e\x90\x0b\xda\xea\xc6\x3e\xc3\x2c\xe5\x4e\xa2\x82\xb9\x3f\x23\x35\xcb\xeb\x78\xd3\x7d\x68\x2c\xec\x8e\x74\xec\x78\x71\xb3\x80\xe4\x34\x22\x29\x41\xfb\x57\x52\x2c\xe7\x4d\x84\xc6\x12\x4e\xcd\x39\x8c\x2b\x5b\x3a\x6f\x6e\xc2\xb3\x98\x3a\x09\x2f\x67\xd0\x01\x09\xaf\xdc\x54\x2b\xe9\xb5\xad\x6b\x06\x70\x16\x16\x8c\xab\xb0\x71\xf4\xf7\xbf\xfe\xde\xc5\x2e\xff\xfc\x6f\x5c\xf4\xf2\xd7\xdf\x51\x9d\xc3\x99\x99\x50\x0c\xdb\xe1\x32\x4c\x03\xa6\xc6\x42\x3b\x5c\x87\x68\x02\xc9\xf4\x19\x14\x25\x73\x61\x28\x5e\xc5\x9a\xb5\x80\xa1\xc1\x68\x36\xb6\xef\x5a\x5d\x4d\xb8\xd8\x34\xa8\x64\xa7\x5b\x41\xed\x4f\x57\x36\xa3\x6d\xb3\x85\x2b\xcf\x14\xe1\x0f\x37\x6f\xbf\x5c\xc6\xee\xb0\x9e\xd0\x4f\xa9\x93\x86\x2b\x52\xe1\x2a\xe9\x71\x79\xc4\xe5\x84\xc8\xb9\x79\x2e\x55\xa8\xd4\xfc\x23\x8f\x90\x89\x9e\xf6\x62\x62\xe6\xde\x7f\x98\x2a\x68\x86\x5b\x88\x17\xb5\x04\x1c\x80\xa8\xa6\x95\xb1\x5a\x84\x94\xf8\x3e\x9f\x21\x5e\xad\xd9\x13\xba\x7d\xa4\xd6\xec\xb7\xf6\x56\x8c\x3c\x2f\xda\x43\xbe\x61\x37\xc8\x15\x7a\x75\x83\x60\x37\x08\x7a\x83\x5c\x5d\x7d\xff\x95\xd9\x04\x3f\x6c\x92\xc0\x78\xda\xda\xce\xb1\xcc\x47\xd7\x77\x36\xdc\x5c\x61\xa2\x6e\xe8\x8e\x0e\xa6\xa2\xbf\xd7\xe6\xa7\xfd\x3a\xbd\xba\x41\xae\x70\x14\xe3\x7e\xa0\xf4\x0f\x94\x40\x30\xf6\x0e\x67\xef\x48\xe6\x27\x4a\xe0\x24\x47\x5f\xa3\x78\x54\xce\x44\xec\xb8\xe8\xff\x0d\xc5\x5e\xdf\x49\x6b\xd1\x31\x75\x25\x9d\x12\x47\x53\xcc\x31\x94\x08\x71\x61\xc3\xad\x2f\x13\x75\xe3\xe0\xef\x36\x52\xe9\x91\x24\x4a\xb2\xc7\xd0\x23\x45\xa0\x28\x62\xb4\xfa\x95\x4a\x83\x22\x29\x02\x3f\x86\x06\x25\xfa\x9e\x73\x13\xc3\x7b\xab\xa6\xa9\x24\x68\x02\xc5\x8f\x12\x83\xde\x90\x08\xe6\xc9\x1c\x24\x58\x12\xa3\x8e\x21\xc1\x88\x33\x53\xd1\xd5\x75\x7e\x29\x58\x8c\xc6\x8f\x22\xc1\xee\x49\x11\x6c\x96\xce\x41\x87\x21\x69\xe2\x38\x3a\x6e\xa7\x03\x4d\xb3\xa0\x06\x1c\xd3\x4a\xb7\x29\x0e\xc5\x50\xee\x18\xf4\x9c\x87\xde\xaf\x8c\x8a\x6f\x8a\x95\x8e\x1d\x67\xb0\xa3\xba\x1a\x43\x3d\xf4\x41\x2f\x78\xf9\x70\x3a\x01\x8a\x63\x8e\xd2\x0e\x86\x85\x09\x6c\x13\x2c\x77\x02\x48\x27\xc4\xd1\xdc\x71\x92\xe0\x7b\x1d\x1d\xa4\xb4\xfe\x9f\xe7\xa6\x51\xc2\x50\x86\x22\x8f\xea\x11\x8c\xf0\xc5\xd9\x16\x02\x52\x7b\x1c\xc3\x70\x86\x3e\x4e\x12\x52\x54\xf5\xb7\xcd\x9f\x2a\x98\xb3\xa9\xa8\xea\x70\x9a\x3a\x35\x62\x18\x85\x61\x47\x4d\xc2\x18\xb5\x59\xa1\xd9\x54\xce\xdf\x32\xc4\xa0\x99\xe3\xa6\x79\x8c\x16\x75\x43\x83\xb6\x23\x1e\xd6\xe6\x33\x48\x31\x1c\x7b\x5c\x8f\x30\x7b\x41\x81\xb7\x08\x02\xd2\x9d\x09\x86\xa3\x28\x41\x06\x44\x12\x7c\x6d\xea\x8a\xfe\xb1\xce\xf6\x60\x55\x3f\x1c\x2e\x54\x8a\xc3\x87\x0a\xdd\x6d\x92\xad\x66\x4d\x68\x17\x1b\xcd\x72\x81\x21\x70\x9e\x24\xe8\x31\xd5\x6e\x96\x7a\xdd\x7a\xe5\xe9\x81\xa9\x14\xea\xc5\x46\xa7\x5e\x2b\xb7\xc8\x1e\x23\x8c\x9e\x1e\x07\x51\x0d\x25\x12\xc1\x3d\x22\x38\xd1\x29\xe3\xd5\x81\x40\xe1\x7c\x63\x38\x28\x0f\xaa\x04\x3f\xba\xe7\x87\xc3\xca\x70\xf8\x88\x3f\x56\x87\xa3\x51\x97\x16\x46\x43\xa1\xdf\x7e\x28\x0d\xc7\x3d\xfe\x89\x66\x86\x2d\x32\x37\x11\xc2\x25\x52\xe8\xb6\x47\xd5\x5a\x1d\x2f\xd6\x88\x72\xb3\x43\x16\x86\xf5\x72\xa3\x59\xaa\x97\xef\x07\xcd\xf6\x00\xaf\x8e\x88\x71\xa3\xdc\xab\xb6\x9a\x83\xa2\xd0\xe2\x7b\x4f\x4c\xa7\xc8\xb4\x86\x78\xf5\xea\xd4\xcd\x21\x6e\xac\x98\xd1\x0d\xc1\x86\xba\xdd\x5e\xd8\x9f\x36\x4c\xdf\x38\x71\x83\x10\x37\x88\x63\x2d\x60\x0e\xe3\x38\xdc\x12\x71\xb2\x69\xf8\xa9\x4c\xd8\x30\x64\x0b\x2a\xba\x23\x82\xe9\x7c\x02\x8c\xc5\x8c\x74\xcd\x79\xd0\x2b\x61\x57\x1f\xd1\x9f\xfb\xe4\xf1\x64\xf2\xf8\xb9\xe4\x4f\xd9\x84\x70\x91\x7e\xde\x4b\xfc\x6e\x10\x3c\x6f\x2f\xc7\xed\x41\x38\xb5\x9b\x37\xfb\x10\x42\xfd\x8c\xe1\x2c\x4b\x72\x28\xc5\xb1\x94\x97\x04\xe0\x6e\x16\xf0\xcf\xd7\xa9\x3e\xd3\x9d\xaf\x77\xc8\x57\x0e\xc7\x09\x82\xc1\x51\x82\x66\xa9\x9f\x24\xc3\x50\x2c\xca\x7c\xbd\x41\xbe\xee\xf6\xbc\xb8\x50\xae\x61\xec\x9e\x3a\xeb\xb9\xf7\x34\xda\x87\x3b\x08\x7f\xf3\x8b\x0b\x73\x6a\x5f\x7e\xfd\xdf\x24\x63\x4a\x14\x12\x43\x51\x16\x3b\x4f\x48\xfc\xbf\x2a\x24\x7e\x83\xb0\x14\xcb\x71\x04\x4b\xb3\xdc\x36\x9b\xfb\xe7\xab\xed\xb8\xa9\x8e\xa1\x89\x12\x98\x02\x43\xf6\x38\xc6\x50\x14\xfd\x89\xfa\x9f\xfc\x14\x88\x7d\x0a\xb8\x37\x51\x5d\xfd\xf3\xd5\x0f\x77\x0e\xf0\x1e\xe8\xc9\x00\x8e\xbe\x84\x27\x4b\x44\xdc\x20\x98\x2f\xd2\x0a\xea\xda\xc4\x25\x88\xdd\x20\x5f\x7d\xd3\x17\x5f\xe0\xfa\xd3\x8c\xc9\xe3\x8a\xc4\x99\x60\xc0\x7c\x94\x9e\x03\x0a\x1f\xae\xe7\x88\x44\x39\xf5\x7c\x5a\xd0\xe0\x73\x95\x31\xe1\xc5\x6d\x36\x3a\x75\xc2\xdb\x6c\x38\x0a\xc7\x09\x28\x47\xd0\x28\x8e\x2a\x00\x83\x32\x47\x03\x12\xa0\x32\xcd\x41\x96\xa3\x00\x87\xb2\xa8\xaa\x30\x24\x43\x33\x28\xcd\x90\x18\xa3\x42\x4a\x95\x30\x09\x95\x15\x28\xab\x18\xa7\xca\x18\x90\x58\xd7\x03\x31\x24\x81\x43\x15\xb0\x34\x81\x62\x90\xa2\x00\x50\x51\x86\xc1\x19\x86\x55\x39\x8e\xa6\x51\x06\x90\x1c\x49\xe1\x28\x0d\x08\xa0\x02\x1a\xa7\x21\xa4\x69\x28\x11\x98\x42\xb0\x0a\xc9\x12\x8c\xef\x00\xf0\x48\x84\x48\xdf\x11\xcc\x1d\xc6\x44\x03\x47\xff\x31\xf7\x13\xc3\x29\x8c\x61\x33\xdf\x06\x33\x3a\xc6\xb2\xec\x0d\x82\xd1\x6e\x7f\x1e\x7c\x6e\x10\xd2\xfd\x0f\x0b\xfe\xdb\x3c\xc4\xb6\x5f\xdc\x08\x80\xe7\x79\xbe\x48\x74\xd6\x0c\x3d\x79\xe6\xe1\x23\xb0\x56\xca\x5a\x21\xaf\xc7\x63\x0d\xbe\x4c\xcb\xb5\x8a\x49\x5f\xcf\xee\x17\xd4\x8c\x7e\xaf\xf6\x9f\x07\x1a\xa1\x0c\x5f\x4b\xf3\xe9\x12\xce\xa6\xc5\x4e\x03\x17\x4c\x65\x4d\x8e\x0b\xe3\x4a\x55\xc1\x5e\xac\x67\xc9\x76\x46\xaf\xa3\x89\x72\xdb\x95\xd6\xd8\xc0\x45\xcd\x0f\xdb\x8f\x8d\x65\x87\xdf\x7e\x5e\xc7\xd7\xda\x43\xbf\x6e\x3a\x93\x11\x67\x33\xb3\x81\xc0\xad\xda\x95\xde\x7b\x11\x5f\x2d\x35\xf0\x54\x28\xad\xcb\xad\x6b\x85\x58\x19\xa5\xe7\xda\xed\xa0\x47\x28\x55\xac\x65\x17\x80\x06\xac\x21\x25\x3d\x5b\xac\x52\x7a\x7b\x7e\x7f\x93\x9f\xfa\x85\xaa\x65\x94\x8a\x56\xb7\x4f\x9a\x85\x17\xcd\xc5\xdc\x68\x92\x75\xf0\x3e\xc7\x43\xc4\xf8\x4a\xf8\xc7\xf6\x33\xe6\x87\x18\xd9\xe1\xf9\x12\x7a\x1f\xf7\xfa\x3f\xfd\xf1\x8d\x0a\x4d\x18\xf7\xd1\xa1\x80\x5f\xc6\x8c\xaf\x68\x42\xe1\x58\x95\x22\xdc\x97\xac\x82\x49\x38\x23\x51\x12\xcb\xa9\x38\x01\x54\x8a\xc0\x30\x89\xa1\x68\x0e\xe0\xa4\x0a\x54\x8c\x44\x09\xa0\xa0\x12\x85\x4b\x34\x41\x48\x28\x23\x41\x8e\x4b\x1b\x0a\x74\xa2\xb1\x93\x38\xc3\x61\xa9\x6f\xdd\x48\xd1\x77\x20\x24\xc5\xe1\x29\x23\x01\xcf\x39\x12\xf0\xf6\xf8\x19\x6b\x2e\x28\x13\x95\xee\x99\x27\xd2\x58\xb7\x96\x83\xb7\x0a\xf1\x38\x37\x5f\xae\x97\x65\xbe\xe5\x14\xb1\x07\xbc\xc1\x14\x18\x7a\xbc\xa0\xaa\x9c\x5c\x55\xd0\x57\xde\x1e\x3f\x73\x1d\x7a\xc4\xae\x6b\x35\x99\x5e\x38\x2f\xea\x6d\xb1\x75\x5d\x9f\xdd\xa2\x0f\x92\xad\x5a\xef\xed\xd0\x48\xf0\xbe\xd5\xb6\xff\xf1\x9e\x7d\xda\xbb\xdf\x2b\xbe\xdd\x79\xf1\x7b\xba\x8d\xb6\x9f\x7b\x44\x57\x65\x26\x36\xfb\xf6\x58\x2b\x68\xb8\xc6\xbe\x3d\x2c\x5f\x5b\xad\x5b\xe3\x56\xbb\x1d\xae\xb4\x76\xf7\xb6\x5a\x60\x5e\x21\x37\xb7\xf5\xfb\x05\xf9\xd2\xac\x76\x49\x73\x58\x15\xfa\x35\x85\xc4\xda\xcd\xfb\x21\x33\xbf\x7f\x35\x51\x9c\x27\xcd\x6b\xca\xe8\x4a\xc4\xfb\x62\xe5\x91\x8a\x19\x29\xa5\x5a\x9c\xb5\xfd\xdf\x19\x29\xd8\x65\xac\xdc\x5b\x04\x73\xc3\x05\xd7\xbd\x62\x1c\x83\xfe\x40\xb1\x1f\x28\x86\xa0\xe8\x9d\xf7\x2f\xd1\x9a\x29\x8a\x61\x92\x47\xc2\xe6\x2d\x89\x73\x24\x47\x33\x38\x47\xa7\xd8\x7a\xbc\xa5\xfb\x2c\xfd\xdb\x9d\x92\xfc\x29\x0c\x1f\x74\x72\x7d\xbb\xee\x3d\x14\x98\x92\x51\xe2\xaa\x38\xfa\xf6\x5c\xb8\xb6\x51\xcd\xb1\x57\xb5\xd5\x3b\x36\x54\x7a\x4f\x23\x50\xb8\x07\x65\x6f\xba\x17\x62\x8c\x38\xfe\xb3\x31\x62\x9e\x2f\xbc\x7c\x82\x20\x17\xfd\x5c\xf9\xc6\x94\x1d\x50\xe5\xd8\x66\x7a\x6a\x7c\x95\xb0\x7a\x98\x98\x5f\x26\x8c\xb8\x0c\x34\x78\x34\x83\x3b\x0d\x4d\x24\x83\x21\x4e\xc3\x42\x46\xf2\xa0\xd3\xb0\x50\x91\xa8\xfb\x34\x2c\x74\x24\x1b\xb9\xcc\xb6\xdb\x8b\xd4\x3b\xd2\xd7\x84\x6f\x10\x3a\x6f\xfd\x23\x61\xf3\xe9\xd9\x16\x1b\xb2\xd2\x3d\x13\xdd\xfe\x20\xbd\xf4\x8e\xce\x57\x29\x70\xac\x85\xed\x40\x78\x56\x12\xba\x41\x63\x5a\x67\xe5\x58\xff\x8d\xe2\xcc\x07\x94\x96\x13\xbb\x6e\x33\x2d\x6c\x7f\xa0\xff\x1f\x75\xdd\xe7\x97\x9c\x3e\xa7\xeb\xc2\x93\xe8\xf6\x3b\x1b\x2a\xa9\xa8\x0b\x43\x09\x64\x39\xb1\xb2\xef\xe9\xc5\xaf\xaf\x9f\xdb\xbb\x39\xea\x3b\x67\x2e\x41\x1c\xa3\xb6\x60\xbe\xdf\x7e\x27\x3f\x56\x6d\xa7\x5b\xf3\xc7\xab\x2d\xc3\x7b\xc4\xec\xb3\xcf\xe3\x39\xb2\xb1\x66\x6f\x39\x3e\xd5\x43\x25\x6e\x55\x8a\x8d\xaa\xc8\xe4\x70\x28\x13\x11\x1e\x9d\x33\x4f\x45\x44\xec\x0f\xe1\xa4\x68\x26\x13\x0f\xb9\x8f\x27\x29\xb6\xca\xc4\x13\x19\x1b\x27\xf3\x43\x47\xc6\xd8\xa5\xb6\x62\x5f\x24\xc2\xca\xda\x8c\x76\x44\x8c\x95\xb8\x15\xf9\x02\x36\x1c\x5a\x2c\x97\x31\x55\x22\x71\x40\xb0\xb2\x8a\xa1\x38\x89\x01\x8c\xc1\x21\xc5\x30\x80\xc1\x18\x1a\xe5\x70\x4c\xa5\x38\x86\x26\xa1\xca\x92\xa4\xcc\xb2\x90\x41\x01\x0b\x00\x0b\x48\x4a\x96\x39\x4a\x22\xfc\xc5\xd1\xb3\x56\xad\x43\x35\x21\x62\x93\x0b\x27\x17\x54\x49\x9a\x4a\x29\xb7\xfa\x6f\xf7\x86\xa2\x9f\x44\x3f\xd0\xcf\x50\x27\x9e\x67\x66\x8d\xed\x57\xa6\xa5\x5b\xa8\xc9\x04\xd3\x1e\x3a\xd5\x87\x87\xf7\xa7\x47\x76\xf5\xa8\x8f\x0b\xa0\xb8\xa0\xea\x54\x83\xf7\x92\x50\x7e\x53\xe4\x29\x44\x72\xbc\xd0\xef\x91\xf7\xfb\xf1\xb1\x29\x34\xbc\x84\xb5\x88\x2d\x0a\x4a\xd5\xec\x2f\xb4\xc6\xb2\xe3\x94\x98\xc2\xa4\x56\x27\x9a\x90\x53\x1e\xdb\x6a\xa5\x76\x7d\xaf\x53\xf7\xcb\x41\xeb\x7a\xcc\x3b\x0c\x71\xbb\xfd\xec\xf0\x55\xb6\xf4\x3b\xf7\x63\xf6\x69\xf1\x04\xa5\xfa\xa2\x6a\xaf\x0a\xcd\xfe\x4b\xc9\x28\x9a\xbc\x59\x7f\x5e\x0e\x1d\x00\x1e\x9e\x47\xb7\x38\xf5\xfc\xac\xac\xab\x33\xbc\x3f\x36\x4c\xd8\x7e\x58\x58\xd6\x5a\x51\x2a\xed\xfe\x44\x58\x8c\x98\xca\xa8\x7b\xbf\x9e\x29\x4f\x2f\x7a\xeb\xb5\xa4\x1a\xa5\xf6\x1c\x6d\xf2\xa3\xdf\x57\xe1\xa2\x42\xb8\xdc\xba\xfb\x5a\x09\xc9\xba\x83\xef\x6c\xf5\x51\xf2\x7e\xaf\x76\x40\xd6\x6b\x93\xae\xc3\x16\xd0\x9e\xdf\x1a\x60\xd0\xe6\xe8\xc2\xbb\x6a\x73\x10\x95\x4d\xab\x39\x1e\xbe\x17\x9e\xee\x5f\xca\xe6\x03\xf3\xb2\x7c\xf1\x1a\x15\x1f\xf9\xe5\x73\x6b\xa7\xdf\x84\x8f\x90\xf4\xa2\x70\x61\xfa\xd1\xfe\x3d\x82\x7e\x63\xa7\x0f\xef\x53\x5c\x98\x84\xe9\x90\xd4\x6b\xb1\x2d\xbc\xcd\x3b\xb7\x84\x59\x6d\x5e\xbf\x63\x4c\x77\xad\xdb\xd8\x54\x6d\x94\x47\xb3\xce\x93\x66\x2d\x7a\xd7\x7d\x0f\xfe\x7e\x50\xbc\x6e\x90\xde\x57\x2d\x85\x66\x62\xcd\x44\xf8\x08\xfa\x87\xfa\x48\xaf\xd9\x94\x76\x30\xc7\xd2\x2f\x3f\x0e\xd0\xce\x9b\xf7\xb5\xfe\x44\x96\x51\x38\x69\xd1\xfc\x9a\x2b\xa2\x6d\xbb\x22\x68\x4b\x19\x63\x30\x6c\xc0\xb1\xa3\x67\x72\x56\x7f\x99\x71\x1d\x86\x7a\x29\x12\xcb\x50\x57\xec\x06\xd1\x2a\xaa\xbf\xdf\x3b\xdb\xf5\xd7\x1b\x3c\x06\xcf\xd3\x55\xa0\x08\x2d\x45\x1b\x1f\xda\x57\x2d\xf9\x34\xfa\xbe\x2e\xfe\x99\x1a\x6f\x80\x1a\x53\xf6\x82\x84\xef\xbc\x80\xb5\x3a\x2d\xf9\x41\x2b\x6a\x8b\x16\x07\xb1\xb9\xf9\xda\x7c\xbe\x95\x66\xad\x26\x51\x83\xd2\xb8\x39\x83\x13\x92\x7d\xa5\x17\xcb\x7b\x0c\x1d\x71\x2d\xa1\x47\x3d\xdb\xe3\x89\x60\x3c\x8c\x31\xd0\xab\xd1\x66\xf3\x5a\x6e\x5c\x1b\x1d\xb4\xa0\xfd\xfe\xed\x05\x8c\xde\x1f\x1b\x6c\x2a\xaa\xfe\xff\xae\xa3\xf3\x26\xf4\x6c\x5f\x1f\xde\xa6\xcb\x10\x92\xc4\x11\x38\xc7\x11\x9c\xaa\x48\x8c\x42\x92\x24\x0b\x19\x5c\x42\x31\x40\xa2\x34\x01\x09\x0a\x95\x50\x12\xd0\x32\xaa\xa2\x24\x41\x4a\x32\x49\x90\x18\x41\x92\xa8\xc2\x51\x92\x8c\xfa\x1e\x09\xbf\x90\x47\x22\xb3\x3d\x12\x4b\xa4\x79\x24\x96\xa0\xaf\x22\x31\xdd\xb9\x1e\xa9\x18\xe9\xde\x78\x8f\xe4\x59\xc9\x05\x3d\x52\xb9\xb6\x58\x77\x4c\x4a\xea\xd4\xfb\x82\xd9\xc6\x07\xd5\xa6\x75\x5b\x59\x3f\x97\x1a\x55\xf3\xb5\xce\xbd\x11\xe3\xa5\xad\xae\x6e\x9b\xef\xb4\x4c\xcf\x47\x8e\xf1\xa4\x4a\xb7\xfd\xf5\x64\xf5\xd2\x97\x1d\xc9\x81\xb7\x42\x19\x7d\x7f\x9f\xc1\x65\x5f\xef\xbf\x13\xc5\x56\x85\x58\xde\x6b\x4f\x2b\xf3\xbf\xe8\x91\x0a\xf1\x23\xe9\xd3\x3c\x52\xf1\x74\xfa\x97\xf6\x48\x09\x1e\xf2\xd3\x3c\x52\xac\xbd\x7f\xb4\x47\x5a\x7b\x5f\x3f\xc7\x23\xfd\x4b\x1e\x81\xff\x80\xbe\x3a\x86\x7e\xe0\x91\x06\x3a\x73\x5f\x7c\x9e\x3a\xbc\xd3\xe8\x69\xb7\xe3\x8e\x8c\x2f\x59\xe9\xa1\xd1\x58\x41\xdd\x5c\x12\x55\x65\x76\xfd\x76\x5b\x62\x89\xf6\xfc\xfd\x75\xaa\xe3\xca\x98\x5b\x72\xed\x87\x6a\xb1\xdb\x5c\x63\x0b\x8c\x61\x3b\xc3\x7e\xbb\x35\xa6\xb9\xd6\x7d\xbb\x2d\xd7\x48\x09\xb2\xb3\x82\x54\xbc\xb8\x47\x52\x24\x82\x63\xa1\x44\x02\xc8\x72\x0c\x45\x13\x38\x45\x93\x84\x0c\x14\x1c\x93\x39\x12\x62\x84\xa4\xca\x28\x43\x4a\x04\x4e\x40\xc8\x12\x10\x23\x31\x49\x65\x50\x0c\x50\x0a\x87\x92\x2a\x26\xf9\x4b\x9b\xd8\x39\x55\x15\xaf\x79\xba\x23\x22\x09\x14\x23\x93\x97\xdf\x09\x14\xa3\xae\xf6\x73\x79\xdf\x16\x2b\x75\xb6\xda\x59\x76\x5e\xa4\x07\xbc\xca\x13\x4f\x8f\xcf\x5d\xeb\x61\xf6\x3c\x44\x51\xb5\xc2\xda\xf5\x1a\x33\x43\x85\xee\xea\xfe\xe9\x96\x1f\x12\xfc\xd6\x0f\x79\x9f\x94\xcc\xc8\xff\x38\x92\x36\xec\xd2\x02\x63\x96\xea\x68\xbd\x73\xbd\x1a\xf5\x8a\xdc\xfb\x70\x39\x7c\xec\x13\x6f\x7a\x5b\x1f\x2d\x7a\x12\x56\x5a\xce\x3a\x75\xc8\xf2\xc1\x3c\x18\x5e\xf2\x2b\x3c\x2e\x57\x65\x6e\xe5\x99\xea\xe8\xb9\x23\xb7\xfb\x78\x85\x9a\xbc\x1a\x85\x99\x56\xa9\x40\x8d\xbb\x67\xa7\xa4\x8c\x09\xc6\x60\xfa\xf6\x32\x15\xa6\x55\xce\x7e\x1d\x5b\x28\xc7\x60\x65\xba\x55\x7f\x52\xe1\xed\x8c\x7c\x99\x97\x9d\xda\xb5\x5d\x43\x75\xec\xb5\xae\x3b\x14\x8f\xde\xaf\x9f\x0c\x69\x32\xaa\x3f\x51\x66\x29\x87\xef\xd9\x33\xda\x7d\xdf\x13\x92\x79\x37\xf7\x86\xe6\xaa\x82\x7e\x5b\x40\xeb\xe8\x7d\x65\xed\x4c\x56\x4d\x6c\x3a\x42\xc1\x7a\x6e\x62\x5c\xb3\xfa\xb6\xac\x17\xd7\x2d\xca\x29\x08\x72\xd1\x97\x91\xd0\x1c\xab\x65\x8c\x6e\x59\x72\xd7\x3e\x21\x3b\x4a\x1f\xcf\x67\xd0\x2f\xf7\x9f\x0a\xf6\x19\xf4\xf9\x08\xfd\x23\x62\x0f\x4f\x7f\xe7\x44\xd8\xb1\x73\x6b\xe1\x74\x5d\xb4\x8c\x71\xaa\x98\x59\xba\x38\xb7\x2f\x5c\x5b\xb8\x96\x23\xf8\x8e\xd2\xc5\x3f\x95\x1a\x5a\x2d\xa1\xdc\x64\x31\x02\xf3\xd5\xd8\x2c\x4c\x0c\xb3\xdd\x53\xef\x61\xb5\xd9\xbd\xc7\xee\xe5\xf1\x7d\xf7\xbe\x7b\x2b\x3d\xcc\x00\xd7\x86\x5c\x17\x3e\xeb\x98\x41\x2c\xa9\xc5\xfd\x43\x57\xea\xb5\xad\x62\xb3\xe6\x00\x9d\xb4\x60\xa7\x59\x94\xa7\x73\x9c\x7c\x2a\x62\x0b\xc0\xaf\x2e\x3d\xb7\xaa\x1c\x23\x03\x55\x05\x12\x2b\x63\x34\x8a\x13\x80\x60\x58\x96\xc4\x68\x4a\x96\x50\x89\x50\x55\x0c\x00\x5c\x01\x2a\x89\xa2\xa8\x0a\x55\x92\x53\x70\x0c\xaa\x32\x4b\x32\x8a\x22\xa9\x12\x04\xbb\xad\x4a\x67\xcc\xad\x78\xf6\xdc\x4a\xd0\x29\x1b\x9f\x08\x82\x66\xae\xf6\xeb\x92\xe7\xce\xad\x29\x31\xbe\xff\x39\x21\xc6\x4c\x98\x5b\x0b\xb3\x87\x79\x4f\x5b\x5a\xab\x87\x16\x8e\x0e\x8b\x2d\x75\xa4\x0e\xed\x8a\x20\x0c\x9c\xd5\x08\x00\x41\x7d\xed\x2d\xe8\xf5\xec\x7e\x36\x2d\xcd\xc0\x75\x6d\x48\xd7\x98\x9a\xa6\x49\x83\x71\xc3\x94\x3b\xca\x98\x23\x6b\x0d\x5e\x7d\x50\x3a\x7c\xf3\x75\x28\xd5\x5a\xcc\xda\x5e\x41\xd8\x28\xfe\xb7\xe6\xd6\x73\xe7\xb6\x33\xc7\xf3\x2b\x73\xdb\x2f\xc9\x97\x9c\x5b\x3f\xb1\x7a\x91\x55\x49\xf9\xcc\xb9\x8d\xbf\xd0\xdc\x7a\xaa\x9f\x0d\xe6\xd6\xb1\xfe\x3a\x30\xeb\x34\x5b\x7c\x76\x9c\xf2\xea\xd9\xc0\xab\x18\x53\x98\x14\xca\x75\xb9\x52\x99\x4d\xaa\xf4\x8b\xb5\xb0\xe7\xfa\x78\xde\xa1\x66\x4b\xbd\x7c\xad\xb7\xd6\xb5\x5a\x05\xab\xf4\x1f\xaa\x42\xf5\x49\x85\xc5\x12\x5f\x5d\x1b\x03\xbe\x04\xa6\xf8\xba\xb4\x60\xad\x46\xd5\x78\xe6\x73\xc6\xad\x89\x07\x1d\x1f\xde\x03\xb4\xbd\x73\x60\x73\xe4\xcf\xb1\x7f\xaa\x1f\xc2\xe8\x9f\x49\x5e\x2a\x85\x0f\x10\x8a\x12\x44\xda\xdd\x5a\x83\xef\x8e\x90\x07\x61\x84\x7c\xd3\x95\xac\xb3\x88\xe3\xef\x45\x3a\x9b\xeb\x08\xd6\x38\xce\xe3\x08\x67\x72\x1f\xf9\xd3\xa8\xd3\xee\x95\x3a\x5b\xba\x7d\xb2\x71\xc2\x9d\xc4\x18\x32\x68\xd6\x3a\x03\x01\xf9\xb6\x03\xbf\x09\x1d\xba\x7b\xb3\x77\x44\xee\x91\xaa\xb9\x4c\xb7\x1e\x2d\xf8\x51\x9d\x9a\xb0\xad\x2b\x63\xef\xd4\x65\x25\x8b\x27\x92\x26\x69\x0a\x5b\xb9\x25\x4f\x5c\x72\xcd\x5c\xd5\xbc\xac\xf4\x49\x64\xd2\xe4\x4f\x65\x2d\x53\x03\xfb\xf7\xfa\x05\x82\x78\x77\x00\xe6\x3b\xef\xc9\xbf\x2e\x70\x0f\x0b\xd2\x6a\x46\x07\xc3\xa0\x57\x6b\x56\x10\xc9\xb1\x20\x0c\x8f\xae\x64\x6e\x82\x2b\x09\xcf\xe6\x27\x38\xce\x3a\x17\x47\x09\xe3\x3a\x74\x9d\xe2\xa9\xec\xec\x50\x84\x39\xd9\xcb\x06\xf6\xf9\xf1\x81\x6f\x0e\x4e\x9f\x8a\x63\xce\xbb\x10\xf2\x0c\xce\xbc\x43\xb8\x72\xb1\x15\x3d\xba\x2b\x8e\x9b\xe0\x16\xcb\x33\xf8\xf1\x31\xe4\xe3\x28\x72\x2e\xd8\xcd\xe1\x11\x60\xb1\x43\x3e\x7c\x2d\xe7\xf1\x9c\x06\x5e\xc2\x67\x38\x82\x2e\xcc\xf6\xe6\x4f\xda\xf6\x38\x8e\x3b\x0d\xf3\x66\x73\xf2\x65\x12\xb3\xbb\xf3\x86\xce\x64\x53\x57\x72\x33\xb8\x3b\xfa\xef\x26\xf6\x08\xcf\x0c\xa6\x37\x37\xa9\x5e\x82\xef\x00\x57\x98\xf5\x04\x57\x75\x92\x24\xf1\x02\x6c\x2e\x8d\xbd\x84\x00\x01\xae\x04\x9b\x3e\x51\x84\xfd\x73\x1c\x0f\x85\x08\x5d\x91\x7b\xea\x68\x0c\xe1\x38\x55\xf9\xe9\x8a\x8e\xdc\xf9\x7b\xae\xae\xf7\xd1\x85\x59\xde\xfc\xf1\xcc\x1e\x8f\xf1\x1c\x1d\xde\x5b\x7c\x3e\x5b\x07\x38\xf3\x4d\x6f\x71\x0c\x86\x6e\x60\x3e\xb9\x5b\x77\x38\x4e\x37\xc9\x2c\xf3\x8b\xbb\x5b\xfa\x74\x86\x0f\x91\x45\x38\x57\x60\x84\xcf\xc8\xa9\xbe\xe9\x0c\xfa\x97\x65\x5f\x84\x3d\x0f\x55\x2e\xe6\x36\xa7\xe5\x24\xb2\x16\xbd\xfc\xfb\x5c\xfe\x22\xf8\xb2\x98\x3c\x3c\xae\x38\x93\xd3\xcb\xe8\x71\x0f\x5b\x5e\x2e\x33\xb5\x79\x19\xde\x72\xf1\x94\xce\x4b\xe4\x96\xf9\xb3\x38\xda\xc7\x95\xbb\x47\x37\x07\x22\xc7\xf2\x77\x70\x71\xfe\x59\x1c\x46\xb1\xe5\x1b\xb7\x01\x83\x37\x07\x67\x38\xdf\x1c\x9c\x03\x9e\x20\xc4\x05\xe6\xed\x00\x4f\x16\xc7\x47\x46\x47\x2e\xd6\x8b\x69\xf7\x08\xc5\x66\xea\xcd\x3f\x84\xf0\xe0\x04\x20\xd3\x10\x83\xcb\x91\xce\x55\x68\x26\x81\xbd\x3c\x6d\x73\x98\xd2\x7e\x66\xe4\x03\x1e\xc1\xfb\xf9\x76\x90\x86\x3b\x9b\xe3\x98\x51\xb6\x8f\x30\x88\xc2\x5d\x7c\xce\x7a\x7e\x7a\x0e\x9e\x8a\x35\x33\xec\x77\x81\x32\x18\x0d\x62\x28\x17\xe5\xd6\x88\x2e\xc4\x6d\x1c\xea\xcc\xf0\x2d\xaf\x25\x87\x90\x5f\xda\x18\xf6\x50\x9f\x12\x6f\x26\xa3\x8b\xdc\x84\x73\x79\x45\x1f\xdc\xb5\x93\xc9\x7e\xa4\x41\x7e\x61\x42\x57\x1f\x7d\x98\xfe\xc3\xd7\x2b\x65\x49\x12\x82\xcd\x2f\x44\xdc\x45\x4e\x1f\x26\x4d\xec\xad\x51\x59\x62\xc5\x35\xca\x2f\xdf\xa6\x88\xf2\x61\x32\x6d\x8f\x50\xcf\x92\x23\xb1\xda\xb5\x8f\x7a\xf7\x67\x68\x1f\x31\xb4\xa3\xd8\x63\x13\xe0\x63\x07\xf8\x3e\xd2\xfd\x14\xea\x42\x23\x3c\x8d\x44\x1e\x19\x32\xf2\xba\x54\x62\x97\x73\x5f\x87\x88\x73\xf1\x9e\xed\xc4\xc2\xc9\xf6\x47\x98\xcd\x21\xfe\x93\x53\x7d\xff\x4c\xd5\x8d\x23\xdf\x54\x18\x45\xc9\x34\x5f\x4e\xd6\x72\x0a\xce\xcc\x10\xe1\xdb\xb7\xcd\xb5\x44\x3f\xfe\xfc\x13\xb9\xb2\xcd\xa9\x12\x5a\x4d\xbb\xba\xbb\x73\xe0\x9b\xf3\xfd\xfb\x0d\x92\x0c\x28\x9b\x4a\x3e\x40\xbf\x16\x9f\x0c\x2a\x99\x0b\x6d\xe2\xe4\x22\xbf\x07\x9a\xce\xc0\x1e\x68\x84\x85\xef\xc8\x53\x55\xe8\x0a\xbe\x91\x21\xbf\x11\x82\xc8\xbd\x10\xad\x2b\xa2\x1a\x5a\x26\x2a\x3f\x7c\xce\x72\x74\x40\x16\x29\xb7\xba\x42\xad\xd2\xdc\x2e\x01\x21\x5d\xa1\x2c\x74\x85\x66\x51\xe8\x45\x56\x45\xbc\xb7\xad\x26\x32\x68\x97\x5c\x93\xe9\x0a\xfe\x5d\xdc\xee\xa3\x92\x50\x17\xfa\x02\x52\xe4\x7b\x45\xbe\x24\xa4\xdf\x1f\x15\xf9\x29\x46\x4a\x31\x97\x53\xc6\x3e\x9d\x8c\x45\xb2\x24\x4e\xf6\xf5\x13\x2d\x1b\xc5\x2a\x2b\x08\xf4\x33\x56\x14\x13\x35\x11\xa4\xb2\xff\xba\x1e\xc2\x7c\xc4\x69\x61\x53\x25\x48\x37\x98\xe3\x34\x70\x58\x54\xfa\x17\xd5\x90\xc0\xcc\xbe\x2e\x62\xca\x60\x97\x35\x8a\x68\x89\xe3\xbf\xa0\x90\x64\xd3\x38\xa8\x21\xe5\xb5\x8e\xb6\x69\x3b\x9a\x05\x7b\x9d\x3a\xa2\x00\x07\xb8\x26\x86\x28\x8b\xd9\x1c\x91\xcd\xd9\x7c\x0a\x1d\xe8\xc9\xf0\xff\x02\x00\x00\xff\xff\x0d\x61\x70\x13\x13\x99\x00\x00") - -func asset_stat_trustlines_3HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_3HorizonSql, - "asset_stat_trustlines_3-horizon.sql", - ) -} - -func asset_stat_trustlines_3HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_3HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_3-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7f, 0x9f, 0x5f, 0x49, 0x4a, 0xc2, 0xe1, 0xa9, 0xdf, 0x24, 0x4f, 0xc, 0xf6, 0xc, 0x3, 0xe5, 0x1e, 0x90, 0xfd, 0xdf, 0x37, 0x98, 0xd5, 0x75, 0x56, 0x63, 0x47, 0x24, 0x3, 0xc5, 0x99, 0x42}} - return a, nil -} - -var _asset_stat_trustlines_4CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xa2\xcc\xf2\xef\xfb\xf9\x14\xc4\xbc\xe9\x99\xb0\xe7\x91\x7d\x99\xb9\x73\x22\x40\x71\x45\x71\xdf\x6e\xdc\xe8\x28\xa0\x40\x14\x01\x59\xdc\x6e\x9c\xef\xfe\x0f\xc1\x05\x15\x6d\x5b\xfb\x39\xcf\xf9\x47\x0c\x2f\x66\xba\x25\xfd\xe5\xaf\xb2\x32\xb3\xaa\x92\xea\xe2\xc7\x8f\x2f\x3f\x7e\x20\x0d\xc7\x0f\x0c\x0f\xb6\x9b\x12\xa2\x81\x00\x28\xc0\x87\x88\x16\xce\xdc\x2f\x3f\x7e\x7c\xd9\xde\xcf\x87\x33\x17\x6a\x88\xee\x39\xb3\xa3\xc0\x02\x7a\xbe\xe9\xd8\x08\xf7\x17\xfd\x17\x96\x90\x52\xd6\x88\x6b\xbc\x6d\xbf\x7e\x26\xf2\xa5\x2d\x76\x10\x3f\x00\x01\x9c\x41\x3b\x78\x0b\xcc\x19\x74\xc2\x00\xf9\x8d\xa0\xbf\xa2\x5b\x96\xa3\x4e\x2f\x3f\x35\x35\x0b\xbe\x99\xf6\x5b\xe0\x01\xdb\x07\x6a\x60\x3a\xf6\x9b\x0f\xfd\x2d\xee\xa5\xb0\x6a\x99\x5b\x68\x68\xab\x8e\x66\xda\x06\xf2\x1b\x79\xe9\x76\x0a\xec\xcb\xaf\xbd\x6e\x5b\x03\x9e\xf6\xa6\x3a\xb6\xee\x78\x33\xd3\x36\xde\xfc\xc0\x33\x6d\xc3\x47\x7e\x23\x8e\xbd\xc3\x18\x43\x75\xfa\xa6\x87\x76\xac\x4b\x71\x34\x13\x6e\xef\xeb\xc0\xf2\xe1\x89\x9a\x99\x69\xbf\xcd\xa0\xef\x03\x23\x12\x58\x02\xcf\x36\x6d\x23\x16\xf1\x9c\xe5\x9b\x0f\xd5\xd0\x33\x83\xf5\x16\x5c\xd7\x7f\xed\x0c\x00\x81\xa7\x8e\xdf\x5c\x10\x8c\x91\xdf\x88\x1b\x2a\x96\xa9\xbe\x6e\x2d\xa6\x82\x00\x58\x8e\xf1\xeb\xcb\x97\x7c\x4b\x6e\x20\xe5\x7a\x5e\x1c\x20\xe5\x02\x22\x0e\xca\xed\x4e\x7b\x27\xf9\x57\xe8\x1a\x1e\xd0\xe0\xd8\xf4\x03\x65\xed\xc3\xf9\xaf\x9b\xd2\xbe\xea\xce\x43\xc7\x0b\x67\xfe\x7d\xc2\xd0\x5e\xdc\x23\x69\x41\xcd\x80\xde\x3d\x92\x5b\x9e\x3a\x84\x77\x4a\xde\x21\xa6\x40\x3f\x70\x74\x1d\x7a\xa6\xad\xc1\xd5\x6d\x59\xa0\xaa\x4e\x68\x07\x0a\xb0\x80\xad\x42\xff\xd7\x17\x5e\xea\x88\x2d\xa4\xc3\x0b\x92\x98\x90\x96\xeb\xd2\x30\xc5\xbc\x8e\xb7\x46\x22\xf4\x9c\x5c\x6f\x77\x5a\x7c\xb9\xde\x49\x7c\xe9\x54\xf0\xcd\x9d\xc2\xf5\x3d\xf8\xc1\xea\x7d\xe8\x83\xcc\x07\x50\x75\x78\x07\xe7\xa4\xd8\xfd\xd8\x5e\xe8\x07\x96\x69\x43\xff\x16\xf2\x41\xe8\x6e\xdc\x2d\x0b\x18\x65\x83\x1b\xb8\x47\xa1\xfb\x71\x0f\x2e\x7f\x0b\xf7\x20\x74\x37\x6e\x2c\x6f\xda\xba\x73\x03\xf7\x28\x74\x37\xae\x1b\x2a\x7e\xa8\xdc\xc0\x8c\x05\x3e\x82\x67\x99\xfe\x78\x1e\xc2\xf0\x96\x65\x93\x62\xf7\x63\x43\xe8\xdd\x32\x6b\x74\xff\x6e\xb4\x28\x8c\x6f\xc1\xc5\x02\x77\xe3\xc5\x59\x69\x0c\x81\x76\x1b\xf6\x44\xee\x6f\x46\xdf\x65\x4a\x38\x7f\xbb\x53\x8d\x02\xec\x1b\xe0\x0a\xb0\xef\x26\xbc\xcb\x7e\xb7\xb8\xee\x45\x3e\x8a\xb9\x9d\x03\xbc\x0f\xbb\x95\xda\x21\x47\xb2\xe7\xc0\xa9\x29\xf7\xb6\xec\x21\x35\xbe\x27\x76\x4c\x74\xef\x48\x1e\x12\xd7\x6d\xb9\x63\x22\x7a\x47\xee\x90\x58\xde\x95\xbb\x8b\xdf\x31\xa1\xdc\x96\x8b\x93\xc4\xbb\x32\x87\x90\x7f\x47\x72\x1b\xc7\xb7\x45\xe2\xd8\xbc\x2d\x73\x12\x0a\xb7\x45\x15\x60\xdf\x16\xd8\xbb\xea\x5d\x52\x5b\xcf\xdb\x09\x8a\x83\x8e\x58\x6f\x97\xe5\x7a\x52\xd8\x72\x0d\x7f\x6e\xed\x24\xda\xb9\x92\x58\xe3\x2f\xb0\x7e\x7d\x89\xe7\xc6\x75\x30\x83\x3f\xf7\x9f\x21\x9d\xb5\x0b\x7f\xee\xbe\xf2\x0b\x69\xab\x63\x38\x03\x3f\x91\x1f\xbf\x10\x79\x69\x43\xef\x27\xf2\x23\x9a\x32\xe7\x5a\x22\xdf\x11\xf7\xc8\x7b\xbc\x2f\x27\x88\xa7\x37\x77\xc0\x39\xb9\x56\x13\xeb\x9d\x1b\xc8\xb1\x00\x22\xd7\x4f\x01\x90\x72\x1b\x79\xd9\xcf\x6f\xf7\x9f\xf9\x11\xc8\xcb\xb9\xe6\x7d\xf3\x77\x3a\x0f\x16\x7a\xb7\x3d\x27\xb6\xac\xcb\x9d\x33\x7b\x22\xfd\x72\xa7\x74\xa0\x95\x9c\xd0\x9e\xa8\x3f\xa2\x9c\x11\xf9\x48\xe3\x2f\x40\x22\x03\x34\xa4\xac\x6b\x6c\x57\x31\xae\xe7\xa8\x50\x0b\x3d\x60\x21\x16\xb0\x8d\x10\x18\x30\x32\xc3\x9d\x13\xf0\xad\x98\x06\x75\x10\x5a\xc1\x5b\x00\x14\x0b\xfa\x2e\x50\xe1\x76\x35\xf1\x72\x76\x77\x69\x06\xe3\x37\xc7\xd4\x12\x0b\x84\x93\xc6\x26\x1d\x72\xd7\xcc\xc8\x75\x8f\x8d\xdc\x3b\x40\x9a\xc1\x63\x2f\x4f\x26\xdd\x6f\x5f\x10\x04\xd9\x7f\x62\x6a\x88\x3a\x06\x1e\x50\x03\xe8\x21\x0b\xe0\xad\x4d\xdb\xf8\x46\xd1\xdf\xa3\xbe\xa9\x77\x25\xe9\x35\x92\xde\x7e\xd1\x06\x33\x98\x22\xcc\xb2\x69\xc2\x0b\x60\x85\x69\xd2\x18\x86\x9f\x8b\x5b\xc0\x0f\x66\x8e\x66\xea\x26\xd4\x10\xd3\x0e\xa0\x01\xbd\x83\xc8\x97\xef\xe7\x7d\x7f\x88\xe2\x27\x6d\xe1\x3f\x64\x88\xdd\x42\x00\x51\x4c\xc3\xb4\x83\xb3\x9b\x3e\x9c\xdb\xe1\x2c\xfd\x9e\x1d\xce\xfc\x50\x81\x76\xe0\x6d\x97\x82\xe7\xcd\x8c\x65\x4c\x5b\xb7\xc0\x76\xc5\xa8\x41\x3f\x48\xa7\x13\x0b\x8e\x9d\x19\xd4\x9c\x19\x30\xed\x14\x29\x92\x3c\x27\x1d\x8c\x3d\xe8\x8f\x1d\x4b\xf3\x91\x00\xae\xce\x99\xe9\x16\x30\xae\x31\xba\xd9\x37\x3b\x8b\x84\x5b\xad\x96\x09\x14\xd3\x32\x83\x6d\xe3\xe2\xf6\xef\x4d\x62\x59\xb7\x6e\x9b\x86\xbd\x9d\x0b\x6d\x69\xc5\x9f\x24\x66\x03\x87\xa9\xc5\xce\xe8\x6f\xd1\xb2\x1a\xc9\x95\xc4\x5c\x15\xf9\xf6\x6d\xdf\x15\xff\xfa\x8d\xa0\xdf\xbf\xdf\xf8\xf6\x39\xc1\x73\x9c\x8b\x06\xbc\x87\x78\xd2\x97\x67\x68\xa7\xfd\xfc\x1e\xd2\xa5\x79\xce\xe0\x52\xec\x17\x63\x5e\x06\xc6\x76\xfc\x7b\x34\x26\xb6\x53\xc6\x38\x1c\x6c\x47\x83\xc9\x58\x38\x89\x81\x4b\xa5\xa7\xe3\xf3\xa3\xea\x4f\x27\xc6\x31\x91\xdd\x67\xc0\x1f\x27\xc8\xd0\x17\xbe\xed\x7a\x70\xf1\xae\x90\x12\xaa\x53\x18\x58\xa6\x1f\xbc\x2b\x7a\x98\x6d\xef\xdd\x3d\xfe\x58\xb5\x1c\x1f\x06\xe6\xec\x4a\xe4\x47\x89\x35\x25\xb6\x12\x7d\x7e\x3a\xa9\x3f\xe0\x9d\xf5\xf7\x51\xcf\x15\xd7\xb9\xb6\x36\x38\x85\x39\xb6\xe2\x9a\xb7\xec\x26\x5f\x8f\xf6\xd8\x6e\xe1\xf5\xed\x10\xe4\xd0\xbb\x33\x83\xc6\x95\x17\xed\x5a\x06\x8d\xdc\x1d\xf8\x3e\x0c\xd2\xec\x19\xc7\xea\xd5\xdb\x60\xb6\x0d\xab\x74\x68\xd7\x33\x55\x68\x5f\x49\x62\xd1\xcd\x6b\x19\x2e\xba\x89\x68\x4e\xa8\x58\x70\xeb\x6f\xaa\x19\x55\x24\x3f\x35\x8b\x26\x7a\x78\xb7\x64\x8d\xdb\x72\xd6\xaf\xbb\x06\x5e\xf1\x8d\xdd\x37\x77\x16\x3e\xfb\xea\xde\xee\xd7\x1c\x22\x9e\xb0\x3f\xea\x0f\xf1\xb2\x3e\x76\x07\xd3\x4d\x1b\xf8\xa9\x8b\xc8\x75\xbc\xe0\x60\x8d\xbc\x58\xe0\xbb\x52\x07\x41\xcf\x87\x4d\xb8\x0a\x40\x10\xc0\x99\x1b\x20\xdb\xb0\xf0\x03\x30\x73\x91\xed\x94\xc9\x09\xe3\x4f\x90\x8d\x63\xc3\xcb\xc1\x56\x07\xa6\x15\x7a\x89\xa1\xf6\x9a\x86\x60\xed\xc2\xf7\x3b\x25\x2e\x4b\x24\x70\x2f\xd3\xfe\x41\xe3\x95\xde\xd9\x55\x36\x1c\xef\xbc\x53\xbf\x45\x96\xf8\x17\x82\x7e\x47\xf8\x7a\x1e\x89\x7f\xfd\x3f\xbf\x11\x9a\xa2\x08\xea\x7b\x6a\x5f\x25\x97\x61\x0f\x77\x59\xb2\xca\x93\xcc\xb9\x57\xac\x11\x17\xda\xb6\x51\x97\x4a\x68\xbb\x76\x7c\x82\x8a\x1f\x2a\x3b\x12\x1e\xf4\x4f\x06\x20\x22\x75\xc6\xe8\x41\x70\x88\xa5\x4b\x3e\x89\x35\xef\xa3\x9c\x12\xc5\xba\x3b\x46\xc6\x98\xd8\xdc\x87\xb7\x46\x98\x4b\x9e\x89\x35\xfc\xa3\x3c\x8f\x10\xf7\xf3\xbc\x18\xe4\xce\xee\x43\x7b\x01\x2d\xc7\x85\xef\x0c\x69\x47\xd5\x4f\x0c\x44\x89\x72\xc7\x13\x26\xd8\xd7\x6b\xbf\xdd\xd3\x0f\x47\x2f\x7a\xcf\x10\xf3\x2b\x03\xcd\xa9\x11\xf6\x75\xe0\x13\xc4\x73\x43\x9c\x68\xbb\x6a\x8c\x63\x8d\xe8\x61\x63\x1c\x8b\xe2\xdf\x8e\x71\x7b\xba\x78\x4b\x89\xa9\x5b\xd1\x9d\xa8\x70\x3d\xca\x2a\xf1\x08\xe0\x91\x65\x57\x34\xe2\xdf\xc8\xd4\xa6\xef\x87\xd0\xbb\x1f\x4a\x75\xb4\xd4\xd5\xe9\x85\x59\x02\xcb\x9c\x99\x57\x66\x14\x37\xd7\x82\xff\xe4\xaa\x2a\xe1\x9d\x89\xa7\x2a\x0f\xad\xa2\x92\xdf\xff\xac\x75\x54\x02\xf3\xf1\xf5\xcf\x2d\xd4\xb8\xd3\xce\x90\x76\x3d\xf9\xaf\xf4\xc0\x3b\x29\xf7\x3e\xec\xe4\xc9\x67\x68\xb1\x9b\x07\xab\x93\x54\x7c\xc7\x7a\xe3\xdc\x01\x57\xd1\x53\xca\xab\x77\xd5\x31\xb0\x0d\x98\xba\xb0\x4f\x1a\x27\xf9\xd8\xee\xf1\x5c\x7d\xac\x9d\x3f\x6e\xa2\xff\xb0\x7d\x14\x47\x5b\xa7\x19\x27\x58\x79\xd0\x0f\xad\xd4\xec\x1e\xac\x66\xf0\xdd\xf5\xdc\xf1\x11\xeb\xe3\xf6\x3c\x7b\x6e\xf1\xa8\x51\xcf\x9e\x38\x7f\xbb\xcb\x70\xbb\x2f\xdd\xb2\xde\x4e\x24\xcd\x10\xf7\xb9\xdd\xd9\x13\xee\x47\x0c\x95\xdf\xae\xac\x75\xc7\x7b\xa7\x18\x8a\xe4\xf9\x0e\xff\x8e\xcd\x6e\x43\xfa\x1f\xc6\x2b\xd7\xdb\x62\xab\x83\x94\xeb\x1d\xf9\x58\x54\xec\xf1\x52\x57\x6c\x23\xdf\x5e\x8a\x42\xab\x31\x2c\x95\x25\x3c\x57\x26\x0a\xf5\x26\x29\x0c\xa4\x42\xad\x9e\x97\x0a\x95\x6e\xbd\xd1\xc5\x4b\x43\x62\x54\x2b\xb4\x4b\x72\xbd\x9b\x13\x65\xbe\xdd\x67\x9a\x39\x46\x1e\xe0\xa5\x97\x57\x84\x8b\x2f\x66\xf7\x3f\x8b\xa2\xaf\x08\xfe\x8a\xa0\xaf\xb1\x95\x91\x97\x97\x57\xe4\x85\x6f\xf2\x3c\xcf\xff\xfe\xfd\x12\xdd\xc0\xf7\xf7\x8e\xff\x7e\xff\xf5\x1e\xc3\x1c\x4e\x34\x0b\x78\xa9\x2b\x52\x38\x5f\x1b\x74\x0b\xdd\x12\xc1\x0f\x2b\xfc\x60\x50\x1c\x0c\x7a\x78\xaf\x34\x18\x0e\x5b\xb4\x38\x1c\x88\x9d\x46\x35\x3f\x18\xb5\xf9\x3e\xcd\x0c\x64\xf2\xc8\x90\xdb\x32\x63\x29\x96\xe3\x08\x92\xe2\x88\x57\x04\xbb\x41\x91\x78\x88\xe2\xa0\x5a\xa4\x5b\x75\x52\xae\x97\xc5\x46\xae\x56\x2f\x08\x0c\x81\xf3\x24\x41\x8f\xa8\x46\x3d\xdf\x6e\x49\xc5\x7e\x95\x29\x0a\x52\xae\xd6\x94\xca\x05\x99\x6c\x33\xe2\xb0\xdf\xeb\x7e\x2a\xc5\x2b\x7e\x73\x5e\x6f\x7b\xc2\x05\xaf\x57\xd1\x3e\xea\x87\xa7\x95\xb4\x83\x1d\x69\x42\xe3\x58\x9d\x22\x68\x08\x69\x56\xc3\x14\x9c\x51\x28\x85\xe5\x74\x9c\x00\x3a\x45\x60\x98\xc2\x50\x34\x07\x70\x52\x07\x3a\x46\xa2\x04\xd0\x50\x85\xc2\x15\x9a\x20\x14\x94\x51\x20\xc7\x6d\x4d\x85\x3e\x79\x6d\x31\x28\x06\x07\x38\x24\x70\x5d\xc7\x49\x16\xa0\x8c\x82\x42\x06\xd5\x35\x4c\xa7\x35\x02\x63\x55\x4c\x07\xaa\x86\xa3\x0a\xad\xaa\x28\xab\x12\x84\x46\x31\x0c\x85\x53\x1c\x4b\xb3\x18\x4e\x01\x8c\x7e\x89\xfa\x0f\xdd\x76\xdc\x7f\xed\x25\x0c\xaa\x26\xb9\xce\xae\xdb\x55\x81\xc9\xdb\x79\xae\x84\xa3\xab\x89\x90\xf1\x51\x23\xf0\x97\xe5\xe5\x06\x1b\x68\xed\xfe\x10\x08\x15\x50\x30\xb6\xf2\x62\x9d\x94\xc0\xc6\xc5\x9b\xef\x22\x8f\xf8\x01\x46\x46\x62\xc2\xf4\x3f\xd0\x90\x4f\xbd\x5e\xce\x62\xfd\x8a\xa3\xb2\x3a\x86\x93\x04\xa5\x68\x18\xc0\x09\x9c\xa1\x71\x1c\xa7\x39\x0a\x52\x0a\x4d\xa1\x18\x07\x74\x12\x83\xa8\x42\x62\x28\xc1\x51\x34\x49\x02\x95\xa0\x51\xa0\x10\xa4\xae\x53\x1a\x83\x03\x4d\xdb\x3a\xd9\x67\x38\x3b\xcd\x29\x5b\xd5\x10\xe2\x24\x41\x32\x24\xc3\x02\x8c\xc1\x54\x92\x54\x59\x86\x61\x35\x52\x27\x48\x8e\xd2\x15\x40\x72\x00\xb0\x1a\x41\xa3\x04\x0b\x08\x08\x69\x86\xa4\x14\x4d\x27\x14\xe5\x25\x4a\xc9\x18\x45\x71\x14\xc3\x31\x1c\xbe\xf3\xd8\x1c\xde\x18\x4d\xb0\x7a\x48\x39\xa8\x52\x61\xfa\xa4\xbd\x96\x17\xdd\x55\x91\xe8\xb9\xce\x34\xb3\x28\xf0\x72\x90\xc3\xaa\x78\x8d\x11\x18\x7a\x14\x52\x25\x4e\x2d\x69\xe8\x9c\xf7\x47\x13\xae\x49\x0f\xd9\x75\xb9\xac\xd2\x61\x30\xd5\xb3\x39\x39\x23\xcd\xb2\x68\x55\xf1\x75\x6f\xd3\xe8\x46\x16\x1e\x34\x7a\xb5\xd8\x2d\xca\x87\x7f\xe2\xf4\xe6\x1f\x7f\x5f\xf2\x8d\xe6\xce\x77\x1a\x68\x63\xd2\x26\x5a\x3a\x33\xf6\xd9\x55\xaf\x2c\x18\xb8\xc1\xae\xaa\x8b\xb9\x2c\x67\xed\xac\x91\x1d\x2c\x8d\x46\x2b\x5b\x12\x98\x39\xe4\x5c\xdf\xac\x84\xe4\xb4\x5e\x6a\x91\xce\xa0\x24\x76\xca\x1a\x89\x35\xea\x95\x01\xe3\x56\xe6\x0e\x8a\xf3\xa4\x93\xa1\xec\x96\x42\x6c\xc2\x65\xa4\x2a\xc5\xa3\xf3\xe5\x34\xaf\xd8\x7b\x74\x1e\xad\xfc\x7d\xae\xf7\x37\x5d\xf7\x7a\x34\x80\x8a\xa6\x40\x45\x55\x70\x5c\xe5\x20\x4b\xa1\x00\x6a\xa4\xae\x62\x0c\x0a\x48\x5a\x47\x49\x55\x53\x80\xc6\x50\x0c\x81\x92\xba\xce\xa2\x8a\x06\x20\x47\x93\x8c\x86\x72\x10\xa7\x21\xbe\xf5\xc6\xcf\x88\x0a\x4d\xc3\x31\x0c\xd7\x14\x8a\xc2\x39\x9d\x04\xba\x86\x01\x48\x2a\x14\x05\x14\x0d\x72\x28\xae\x12\x9c\xca\x52\x38\xcb\x71\x0c\xab\x40\x96\xa6\x19\x4d\x67\x38\x52\xe3\x70\x9d\xa4\x21\xae\xa9\x2f\xd1\xf0\x78\xf0\x68\x62\xef\xd1\x24\xdb\x6e\x62\x8b\x96\x33\xa9\xe0\x65\x13\xf4\x28\x65\xd4\x2c\x02\x4e\x20\xa5\x66\x53\xee\x8d\x44\x2f\x3f\xac\xfa\x68\x16\xc3\xd6\x9e\xa6\x32\x2e\xa6\xe1\xa6\xd3\xce\x3a\xc5\x6a\x48\xce\xab\x93\xb0\x83\xa9\x68\x61\x31\x9d\x07\xeb\x15\x3d\xd4\xfa\x98\xa4\x94\x6b\xc3\x6a\x43\x8d\x2c\x1c\x79\x74\xc2\x89\x48\xae\x80\x61\x8a\xdb\x9d\x4c\x99\x7e\xaf\x54\x1f\xb9\x9b\x7a\x3b\xcc\x8f\xc4\x0c\x5d\xc1\x9b\xad\xdc\x46\x09\x7d\xaf\x6a\x8d\xa6\x53\x3a\xab\x95\x5b\x92\xd2\x6b\xdb\xa8\xc7\x15\xc3\x36\xd6\xf7\x08\x97\xf7\x65\x75\xdc\x36\x47\x50\xa2\x8b\x23\x8e\xa3\x3a\x23\x09\x55\x4c\x22\x42\xae\xa5\x78\x6c\x31\x35\x21\xff\x6f\xf7\xd8\x2b\x33\x90\x94\xc7\x41\x4f\xcc\x67\x2e\x9f\x25\x3c\x03\x76\xad\xd8\xfd\x1c\xe6\x79\xbd\xfa\x09\xb4\x2b\xd5\xe6\x27\x10\xaf\xd4\x85\x3f\x3a\x1b\x4c\xd4\x86\x13\x53\xea\xaa\x28\xb6\x85\x46\xbe\xd7\xea\xf1\x43\x79\xc4\x93\x7c\x93\x61\x78\x41\xa4\xe5\x72\xbb\x57\xa2\x7a\x12\x5f\x6f\xcb\x52\xb5\x92\xef\xf3\x83\x62\x8e\x14\xf2\x4d\xa2\x43\x14\xa4\x78\x44\x8b\xe7\x5d\x95\x56\xae\x9d\x63\xb5\x21\x26\x8c\xf1\xa6\x2a\xe4\xb3\x4b\xa1\x42\xad\x2b\xbd\x06\x3e\x5f\xd6\xa7\x14\x98\x4e\xfc\x1c\x35\x56\x73\x72\x91\x3a\x7a\x5f\x34\x00\xe4\xa2\x1f\xb7\x91\x25\x9a\xcc\x54\xc7\x96\x1a\xd1\x76\x72\xab\x59\x03\xcb\xbb\x93\x4d\xd9\x18\x6f\xe6\x34\xde\xca\xb2\x65\x86\x0c\x95\x6c\xd3\x0d\x57\x99\x45\x8d\x8b\xe7\x3c\x2a\xd7\x5d\xc7\x31\x69\x1c\xfe\x11\x22\xd0\xe5\xe1\xf7\x3c\xcf\x73\xb9\x44\xe0\x0a\x96\xd7\xce\x5a\x42\x1d\x13\x97\xd3\x65\xa9\xb3\xac\xd5\x3a\xd3\xa0\x00\xcb\x53\x7d\xd1\xb0\x18\xc7\xb4\x43\x9b\xaa\x0f\x36\xcb\x21\x25\xaa\x11\x9c\xb8\x21\x70\xcb\x5d\x2e\x5b\x33\x7f\x91\x9d\xb1\xb6\xc2\x76\x87\x85\x51\x8f\xe9\x56\x87\x39\x75\x92\x2d\x37\x64\x4e\xd5\x67\xc3\x75\xa0\x79\xa3\x71\x63\xc4\x69\x8b\x8a\x41\xa9\x92\xa4\x10\xb3\xb0\x2d\xe0\x43\xbb\xde\xaf\x95\x47\x39\x29\x2f\x92\x78\xbd\x57\x2e\xcd\xa6\xe5\x22\xdf\xfc\xfd\xfb\x7c\xb4\xf8\xe4\xae\x21\x9e\xea\x9a\xda\x69\xd7\xe4\x85\x4d\x68\xf7\x08\x50\x1d\x4b\x19\x63\x38\x67\x4c\x67\x2e\x53\x8d\xde\xa6\xd9\xcf\xb4\xe7\x84\x54\x72\xc7\x98\xd2\x0d\x7c\x63\x65\x38\xdc\xf2\xd0\x35\xad\xb3\x6c\xf3\x61\xd3\x97\x50\x1c\x6d\xbb\x9b\x35\xdb\x18\x73\x22\x4e\x79\x4c\x8f\x80\x18\x57\x24\x9d\xc2\x40\x6e\xe3\x0a\x91\x1d\x82\x3e\x9c\x6d\x5c\xb3\xd6\xf7\x71\xdd\x6b\x72\x61\x69\x49\x56\xbc\x29\x2e\xce\x56\x8b\x9c\x0d\x98\xb1\x11\x10\xd8\x20\x97\xe1\x17\xe6\x9c\x2c\x8b\x23\x85\xa1\x85\x9d\xe9\xaf\xc7\x59\xda\xc3\x87\x07\xe2\x6c\xff\x00\xe2\xd0\x99\x1c\xad\x90\x8a\xce\x91\x18\xc1\x50\x18\x81\x72\x04\x8a\x69\x84\x8a\xaa\x04\x46\x70\xb8\x86\x51\x10\xc7\x49\x06\xea\x04\xa4\x20\x64\x59\xc0\x28\x80\x81\xa4\x46\xe9\x84\x8a\xb1\x90\x24\x99\x64\xa7\x46\x0e\x2d\x46\x3f\x5a\x62\xa5\x2c\xad\xb0\x49\xb7\x58\x1a\x09\x4b\xb1\x91\xe5\x45\xdb\x2e\x5b\xdd\x2c\xf0\x78\xbc\x63\xcd\xdb\xf2\x52\x9a\x15\x96\x65\x52\x99\xbe\x97\xf3\xaf\x3c\x6c\xf8\x70\xe3\x8f\x0f\x1c\x0e\x8d\xdf\xff\x85\x4f\xbc\x7d\x10\xb9\xb8\xb6\x13\x12\x0c\xbd\x88\x89\x14\x24\x1b\x06\x4b\xc7\x9b\xba\xc0\xf7\xdd\xb1\x07\x7c\x98\x82\xd4\x81\x7e\x80\xb4\xf3\x05\xa4\x1e\x0b\x23\xbf\x90\x36\x74\x03\x38\x53\xa0\x87\xe0\x28\x46\xdd\xa3\x48\x77\x3c\x15\xfa\xaa\xeb\xd8\x36\x5c\x05\x16\x08\x6d\x75\x7c\xae\x28\xda\x9e\x77\x0f\x58\x3c\x17\xdc\x95\xbf\xfc\xf4\xf6\xff\xff\xa8\x5a\xf6\x35\x30\x67\xf0\xeb\x4f\x04\x8d\x8b\x67\x5f\x77\x7f\xef\xf4\xf5\x27\x12\xdf\x8f\x3e\x1c\x03\xff\xeb\xcf\x78\x73\x60\xf4\xe1\xbf\x77\xc2\x3a\x84\xf7\x09\xce\xc0\x2a\x58\xf9\xe6\xe6\x4e\x71\x0f\xfa\xd0\x5b\xbc\x27\xfc\xe5\xdf\x77\x99\x02\xf8\x41\xb4\xab\x45\xdb\x3d\x5d\x4e\x31\xc5\xd3\x73\xe4\x3b\x78\xec\xb2\x2d\xf0\xd4\xb1\xb9\xd8\xdd\xbc\xd2\x25\xc7\x3e\xc0\x76\x06\x89\xcc\xe1\x7d\xfd\x89\x7c\x5d\x60\xd8\x5f\xd8\x5f\xe8\xd7\xdd\x0d\x35\xf4\x3c\x68\x07\x52\xd4\xb4\xaf\x3f\x11\xe2\xf4\x73\x21\xda\x78\xb4\xb5\xdb\xff\x3d\x18\xf2\x68\xd2\x83\xe4\x16\x98\xd5\x09\x02\xc5\x14\x52\x87\x34\xc6\xd0\x1c\xc1\x71\x3a\xa5\xab\x9c\xb2\x5d\x68\x12\x1a\x4d\x12\x38\x50\x15\x0c\x55\x31\xa8\xa9\x0a\xcd\x61\x3a\x49\x11\x38\xae\xa2\xac\x46\x63\x18\x45\xaa\x3b\x46\x07\xdc\xad\x17\x9f\x74\xe0\xe1\x4e\xd4\xf6\xad\xcb\x9d\xdc\xfa\xf7\xd9\xf7\x7d\x1b\xb8\x5b\x5e\x50\x27\x30\x80\xa3\x80\xe0\x58\x08\x19\x42\x85\x38\x8e\x33\x14\x04\x2c\xc6\x30\x0c\x4b\x2b\x40\xa5\x48\x9a\xa2\x75\x82\xd0\x54\x95\xd4\x09\x1d\xaa\x34\xaa\x51\x94\xa6\xe9\xd8\x76\x25\xfe\xf5\x4b\x8a\x86\x2b\x36\x78\xb6\xc4\xf4\x71\x1b\x60\xaf\x97\xf7\x9c\x30\x70\xc3\xe0\x73\xdb\x7e\xcb\xc2\x4f\xb7\xfa\xbf\xda\xc2\xf7\x79\xd9\x1f\x1b\xfc\xb1\xc1\x1f\x1b\xfc\xb1\xc1\x1f\x1b\xfc\xb1\xc1\x1f\x1b\xfc\xb1\xc1\xdf\x68\x83\xe8\xa7\xff\x77\xff\xe2\xc5\x57\xdd\x68\x7b\x7f\xda\xf5\xb2\x5f\xa1\x47\xc5\xa7\x5c\xb7\x39\x35\x16\xa5\x7e\xbd\x39\xd4\xa6\x25\xbe\x99\x65\xf9\x36\x54\xcd\x5e\x87\x9b\xfb\xf9\x91\xdc\x77\xcb\x0c\x1f\x0e\x07\xfc\x64\x1c\x1e\x4b\x54\xf9\xe8\x5f\x0a\xa0\x0b\xaa\xd9\xd1\x5a\xb5\x4a\x4d\x40\xd9\x7c\x5e\xa4\xa4\xd6\xc0\xac\x94\x98\x0d\x05\xe9\xb2\xcb\xb8\x99\x4e\x8f\x65\x8b\x72\xab\x74\xa8\x08\x54\xc6\x4f\x96\x69\x1e\xa9\x28\x08\x7c\x69\x92\x73\xe9\x7e\x99\x24\x8b\xfd\xf6\x52\x1e\xe3\x93\x62\x97\x25\x33\x24\x55\x13\xe6\x45\x34\x37\x35\x46\x41\xbf\x98\x65\x25\xd8\xe8\xb8\x9b\x42\x8d\xf4\x9b\x76\x5d\xd1\x72\xba\x6c\x63\x65\x2f\xd3\xf0\x44\x49\x03\x5a\x7f\x38\x5f\xd7\x72\x7a\x79\x69\x2b\x0b\x6a\x82\x2d\xe2\x0a\xde\x96\x4f\x6e\xf8\xe4\x53\x02\xe1\x91\x32\x58\x53\x20\x97\x73\x68\x99\xb2\x2c\x58\x53\x3f\xef\x68\xce\xca\x6a\xc8\x8d\x50\xee\xf0\x60\x1c\xf0\x6e\xb9\xa8\xf4\xc6\x8b\x6c\x8e\x98\xa0\xb4\xba\xea\xc8\x92\x58\xd9\xf4\x89\xa6\xbd\x71\xb9\x76\x35\x3b\xa1\x57\x39\xa2\x6f\xf7\x66\x55\x7f\xc2\xdb\xeb\x5a\x05\x67\x32\x43\x4e\x59\xfa\x11\x9d\xec\x18\xae\x99\x05\xaa\x11\x99\x82\xb6\xa1\x07\xb9\x25\x17\x7a\xbe\xd5\xf6\xcd\x89\xeb\xd7\xeb\x93\x42\x61\x25\x93\x15\xa3\xd8\x08\x43\x9e\xc8\x77\xb2\x23\x9c\x0c\x9a\xfe\x72\xe9\x06\xd9\xd6\x0a\xe6\x5d\xa5\xe6\x61\x2b\xb5\x94\xf5\xb4\xfc\xcc\x86\x98\x2c\xdb\xec\x82\x14\x96\x4f\xfa\x9b\x71\xe8\xff\xe5\xb3\x4f\x65\xa2\x6b\xf4\x31\xff\x6d\x0a\x5c\x3d\x10\xe7\x2a\xbb\xc8\x93\x7a\xab\x1e\x82\x0c\xa6\x11\x81\xde\x0a\xab\x42\x6f\x33\x0d\x66\x5c\x16\x2f\x5a\xb6\xeb\xd3\xc3\x49\xc1\xab\xdb\x34\xda\x50\xc6\xac\x9c\x03\x54\x7d\x5c\xf1\x95\xa5\x8b\x87\xe4\x50\xd2\xb8\xde\x72\x61\x48\xe4\x3c\xcc\x09\xc5\x7e\x26\x63\x44\xcf\x41\x85\xc9\xaa\x92\xef\x73\x45\xb3\x66\x0f\xcd\x8a\x3b\xb0\x02\x8b\x1f\x79\x68\xc9\x08\x04\x9e\xea\x4d\xdb\x7e\xdd\x98\x6f\x3a\xd9\xc1\xa0\x1a\xa0\xc7\xb2\xa7\xd4\x27\x0b\x28\x1c\xcb\x34\xbf\xe6\x72\x68\xc3\x2f\x8a\xc6\x42\xc5\x18\x0c\xeb\x72\xec\x70\x42\xce\xa4\xe9\x8c\x6b\x32\xd4\x34\x47\x2c\xa2\xe6\x1e\x2b\xda\xc2\x79\xd9\xf3\xf8\xe3\x30\xfa\xbd\xd7\xab\xc7\x81\xc6\xe7\x42\x87\x70\x02\x92\x9a\xe7\x1a\xe2\xca\x6d\x66\x09\xa7\x54\xcf\x6c\x30\xa6\xb5\x36\x7d\xcc\xd2\x6b\x85\xe1\xac\xd9\x37\xbc\xb0\x9d\xe9\x94\xb2\x87\xeb\x88\x57\x3a\xe8\x6f\x56\xfd\x41\xae\xd3\x04\xfe\xd4\xc5\x8c\xc0\x2e\xeb\x4b\xbe\xc3\x66\xaa\xd5\x21\x9e\x19\x4b\x59\x65\xc1\x74\x6b\x05\xa9\x92\x2d\x6d\xb8\xd0\x37\x6c\x4d\xa7\x06\x63\x31\x4b\x53\x62\xa1\xc2\x11\x74\xc8\x71\xea\x38\x90\x41\x2d\x37\xcc\x97\x0a\x83\x8d\xcf\x17\xb2\x59\x5c\x72\x8c\xa8\x0c\xcc\x7b\xf3\x3a\x2d\x41\x19\x18\x93\x55\x0d\x74\x1b\x1c\x2d\x6c\x74\x9f\x83\xa8\xea\x78\xf5\xd1\x60\x23\xf4\x2b\xd3\x82\x53\x65\xa6\x8b\xe9\xf2\xb8\x13\xe1\xe8\x4f\xfc\x79\x7e\x89\x8c\x10\xdd\x2f\xf4\xba\xe8\xce\x71\x3e\x60\x6f\xfd\x60\x09\xf6\x08\x0d\x0e\xfa\xf9\x12\xde\x1e\xba\x0a\xf0\x60\x36\x10\xb2\xd2\x92\x5d\xd1\xcd\xd6\xa2\x57\xaf\x4d\x66\x52\x71\xde\x9c\x34\x8b\xa6\x00\x7d\x9a\x08\x79\x66\xe0\x8d\x84\xb0\x5d\x1a\x61\x95\x7a\x8b\x23\x65\x93\xdb\x34\x59\xc1\xcd\x88\x75\xbd\x88\x17\xba\xb9\xfe\x32\xa4\xe5\x6e\x51\xa9\xd6\x44\xe1\xd8\x1e\xe1\x90\x6f\x3f\x1e\x6f\xb7\x4a\xcf\x57\x36\x55\x7f\xb4\xfa\x9a\xd8\x58\xfd\x19\x1b\xbb\xb0\x57\xe4\x99\x4d\x57\x2f\xdd\x76\xfe\xe5\x15\xe1\x70\x9c\x20\x18\x1c\x25\x68\x96\x22\x19\x86\x62\x51\x26\xda\xb5\x83\x9d\x6d\xb1\x3a\x1b\x81\xd3\xdb\xf2\x30\x99\xb8\x2d\x0f\x9b\xe2\xe3\x6d\xb9\xd6\xd3\xd7\xf6\x16\x7f\xb8\xaf\x93\xfb\x8b\x8f\xb5\x76\x85\xe0\x58\xa8\x90\x00\xb2\x1c\x43\xd1\x04\x4e\xd1\x24\xa1\x02\x0d\xc7\x54\x8e\x84\x18\xa1\xe8\x2a\xca\x90\x0a\x81\x13\x10\xb2\x04\xc4\x48\x4c\xd1\x19\x14\x03\x94\xc6\xa1\xa4\x8e\xed\xb7\xaa\x9c\xcc\x64\x6a\x67\x99\x4c\x30\xb3\x02\x2a\xa1\x95\xe2\x3a\x18\x2f\xeb\x98\x35\x44\xc1\xda\x75\x30\xae\x5e\x5a\x2d\xa4\xdc\x5a\xa6\x02\x41\x54\x73\xbd\xc5\xb2\xc0\x2d\x09\x23\xf0\x64\x7b\xc4\xdf\x71\x5d\xdd\xf2\x14\x45\x5e\xee\x19\xfd\xc3\x6c\x46\x4d\xcb\x44\xef\xeb\xbf\x7c\x56\x97\x6e\x77\x9d\x63\x54\xa0\xeb\x40\x61\x55\x8c\x46\x71\x02\x10\x0c\xcb\x92\x18\x4d\xa9\x0a\xaa\x10\xba\x8e\x01\x80\x6b\x40\x27\x51\x14\xd5\xa1\x4e\x72\x1a\x8e\x41\x5d\x65\x49\x46\xd3\x14\x5d\x81\x20\xb6\x3b\x7e\x69\xf7\x7f\xa8\xdd\x9f\x65\x77\x96\x3c\x7e\x3f\x75\xd3\xcf\x93\x76\xc7\x21\x4b\x69\x1c\x20\x70\x94\x44\x39\xa8\xd2\x28\xc6\xa0\x0c\xad\xa3\xba\x42\x90\x2c\xca\x69\xaa\xc6\xe0\x04\x8e\xe2\x1a\x05\x74\x92\x63\x81\x8e\x92\x04\x85\xea\x00\x70\x80\x81\x04\x8d\xed\x36\xb2\xdc\xb4\x7b\x0e\x0b\x05\xad\xe4\x74\x42\xa3\xb6\x68\x06\x79\x46\x18\x97\x25\xa2\x0e\x39\xad\xd7\xd0\x8b\xe5\x4c\xc5\xa4\x2a\x8b\xae\x9c\x19\xf1\x01\x13\xcd\xc4\x2a\xdd\x5c\x66\xd7\x28\xe3\x9a\x6d\xdf\xb5\x7b\xfe\x39\xfd\xb2\xfa\x98\xfe\x7b\xed\xae\x68\x24\x4b\x6b\x8a\xa6\xa1\xb8\x46\xd2\x28\x8b\x31\x34\x83\xa9\x24\xa0\x00\x03\x39\x8d\x86\x2c\x4d\xa9\x00\xe7\x54\x85\xc4\x20\x8d\x6b\x0c\x00\x3a\x83\x02\x5c\x87\x90\x52\x08\x5a\x83\xb1\xdd\x6f\xfb\xfb\x07\x66\x48\xfc\xdf\x62\xf7\x07\xf4\x3f\x67\xf7\xab\x63\xc6\xe7\x0c\x18\x7f\xf7\x68\x51\x94\xd8\x52\x73\xd1\x9c\x2a\x55\xbc\xc4\x13\xfd\xde\xa4\xe5\x55\x67\x93\x01\x8a\xea\x45\xd6\x97\xca\xcc\x0c\x15\x5b\xcb\x4a\x3f\xcb\x0f\xa2\x8d\x56\x89\x51\xe1\xc6\xbc\x39\xbe\x02\xc5\x18\xb4\x68\x91\x71\xf2\x12\x2a\x35\x33\xcb\x61\x3b\xc7\x6d\x06\x8b\x41\xaf\x43\xac\xcc\x86\x39\x0c\xdb\x0a\x96\x5f\xcc\x9a\x12\x8c\xe6\x85\xb9\x1e\xbf\x48\xee\x8a\x15\xe2\xac\x14\x75\xf2\x70\xd2\x54\x1b\x1d\xbc\x48\x8d\xe7\xb6\x30\x33\x8a\x45\x68\x70\x15\xd6\x22\x55\x4c\xb4\xbb\xd6\x6a\x6a\x89\x56\x89\xf3\xe7\x23\x0f\xe5\x18\xac\x40\xcb\x52\x5f\x87\xd9\x19\x39\x75\x0b\x41\x39\xe3\x97\x51\x13\x9b\x4b\x66\x40\xf1\x68\x65\xdd\xb7\x95\xf1\x50\xea\x53\xce\x76\x6e\xf0\x82\x6f\x66\x72\x50\xa5\x2b\x5a\xbf\x66\x8d\xf2\xeb\xa0\xac\x5a\xb2\xc8\x64\x79\x4d\xaa\x4d\x18\xa7\x31\x6e\x2a\xdc\xb2\x68\xe1\xcd\xce\xca\x3f\x10\xbb\x61\x83\xa3\x67\x9c\x3c\xf9\x4f\xc8\x46\xd1\xfe\x19\xa3\xc4\xa3\x59\x9a\xff\x84\x51\xa2\xd0\xe9\x0b\xfe\x13\xfa\x79\xfe\x9f\xcb\xd6\x69\xd9\xf2\xef\x9e\x1a\x3c\x1e\x64\xb9\x33\xf6\x17\x0e\xf7\xb1\xc5\xde\xad\x20\x13\x66\x55\xb7\x6d\x2c\xbc\x65\x55\xc6\xd1\x41\x4e\xd6\x87\xfa\xc0\x2f\x8a\x62\x37\x58\x0e\x01\x10\xf5\x79\x3b\xa4\xd7\xb3\xca\xcc\xca\xcf\x40\xa6\x3c\xa0\xcb\x4c\xd9\x30\x94\xee\xa8\xe6\xa8\x4d\x6d\xc4\x91\xe5\x1a\xaf\x57\xb5\x26\x5f\x9f\x0f\x94\xb2\xcc\xac\xfd\x25\x84\xb5\xdc\x36\x10\x32\x83\xf5\x22\xe3\x4d\x84\x61\x4e\x9e\xc0\x72\xb3\x3f\x90\x72\x9b\xec\x6a\x6e\xe2\x8b\x26\x9f\xcf\x70\x15\x74\xcc\xb0\xe3\x12\xa1\x64\x32\xce\x81\xd8\x3f\x1f\x64\xcf\x3a\xf9\x93\x41\x36\x67\xb2\x9d\xbc\xfa\x99\x41\xf6\x1f\x1c\x9a\xef\x0a\xb2\x4f\x9e\x07\xfe\xa9\x00\x49\x8e\x51\x8b\x82\x42\x72\x06\x23\x67\x2d\xf0\xb6\x3f\x14\xd4\x92\xb2\xcc\x6c\xda\xbc\xad\x62\xeb\x9a\x21\xf5\x3c\x74\x56\x65\xc5\x7a\x33\x33\x9f\xd9\x24\x7e\x5c\x5f\xa4\x07\xdc\xf0\xb4\x53\x4f\x02\x2e\xb2\x5d\x3c\xf7\x5a\x1e\xa5\x1e\x18\xf5\x27\xf6\xb1\x2f\xae\x5c\x57\xd6\x41\x27\x01\xff\x29\xfa\xaf\x24\x9b\x7b\xf4\xd7\xf8\xcf\x5d\x03\x3c\xb4\xf6\xfb\x6c\xfd\x97\xf6\xb8\x9d\x70\xf2\x47\x99\x8f\xea\x4f\x54\x17\xab\xf4\x04\x9a\xc4\x64\xe6\x94\xd9\x4e\xd1\xca\x67\xa1\xa1\x12\x4c\x63\x10\x94\xaa\xd5\x4d\xbf\xc7\x2e\x7b\xe6\x48\x00\xb9\x90\x92\xa8\x5a\xa2\x2b\x8e\x01\xb7\x3c\xb7\xdf\x5d\x09\xe9\x93\x17\x48\x1f\x6c\xc4\x83\x09\xe9\x7e\x23\x13\x69\x09\xa9\x78\xd0\xdf\x14\xb8\xe9\xac\xda\xc7\xe7\xc4\x82\x69\xea\x6b\xb6\x51\x83\x53\x51\xc1\x3a\x9d\x32\x65\xae\xe6\xd3\x32\x2a\x38\xc6\xc0\x93\x03\xc6\x90\x31\x1a\x6f\x2a\xd3\x31\xae\xb5\x3b\x5d\x1d\xe6\x9d\x85\x8a\x36\x78\xa0\x8f\xf3\x83\x55\x30\xee\xf1\x96\x2f\x85\x13\x4b\x98\xad\x27\x02\x3f\x8c\x92\xc6\xa2\x3b\x0e\x16\x1a\x1f\xb4\x0c\x63\x30\x5a\xad\xaa\x7d\x9b\xd6\x14\x67\xa4\x3a\xee\x1a\x2d\xcd\xa4\xc1\x7c\xa1\x56\xa5\x0c\xa5\xd4\x83\xe3\x80\xf7\x59\x09\xe9\x81\x19\xd2\xa7\x26\xa4\x27\xf5\x7f\x66\x42\x7a\x72\x71\xfc\x74\x42\xfa\x0c\xfd\xcf\x24\xa4\x0f\xea\x7f\xec\x71\x47\xa2\x2b\xde\x4d\x48\x57\x8a\x07\x37\x8e\x15\xf8\x68\x05\xe1\xec\x68\x81\x7d\xae\x4b\x96\x00\xe2\x3f\x31\x3c\xc6\x52\x4a\xb2\xbc\x8e\x72\xc8\x76\xf1\x1f\x26\x5e\xa0\x5c\x3d\x0a\xf5\xf2\x84\xe8\xc3\x11\xb0\xfb\xe3\x07\xde\x69\x66\xf2\xa8\xea\xe8\x80\xea\x04\x62\xb4\x47\x80\xcf\xe7\x53\x0e\x6d\x3c\x28\x44\x1a\xad\x72\x8d\x6f\x0d\x91\xaa\x38\x44\xbe\x1d\xce\xb3\x79\x3d\x1c\x96\x7a\xf5\xe8\xd2\xb3\x43\xb3\x3f\x8b\xb8\x7f\x83\xb5\x7f\x8b\x72\xda\x51\x92\xc7\x73\xc2\x9f\xa6\xa7\x00\x3b\x8d\xd9\x5e\xc1\x29\xa9\xf8\xf4\xaa\xdb\xe7\x4c\xde\x3c\x20\xfd\x69\xba\x27\xe0\x69\xc4\x6f\x68\x47\xba\xf5\x72\xb3\x2b\x22\xc7\x23\x2d\x3e\xd4\x92\xcf\xb1\xf7\x07\x1b\x70\xd9\x07\xc7\xa3\x37\xaf\x1c\x1b\x79\x72\xac\xfe\xd3\x7c\x63\xb0\x34\xa2\x09\x35\xa7\x0c\x77\x87\x19\xa6\x1f\x62\x98\x7c\x87\xc0\xd3\xe4\x22\xac\x34\x6e\x47\x25\xa7\xd4\x4c\xf7\x35\x3a\xda\xf0\xe6\xa1\x7d\x29\xef\x4e\x78\x9e\x69\x02\x32\x95\xf0\xb9\xca\xb4\x4e\xbf\x72\xb2\xdf\xc9\x1b\x24\x3e\x83\xa9\x1f\x2a\x57\x38\xee\xd5\x9c\xb2\x8b\x0e\x05\xbc\x71\xcc\xdf\xc5\x6b\x33\x9e\x26\x79\x04\x4c\x23\x7a\xa6\xee\xae\x1c\x96\xf8\x2b\xb1\xf3\x97\x87\x3c\xcd\xf6\x08\x98\xc6\xf6\x4c\xdd\x29\xdb\xfd\x61\x79\x37\x0e\xa3\xbb\x78\x89\xca\xf3\x7c\x0f\x80\xa9\x7c\x4f\xd5\x9d\xf2\x3d\x9c\x67\x77\xe3\x9c\xba\x8b\xb7\xc9\x3c\x4d\xf8\x08\x98\x46\xf8\x4c\xdd\xd5\xa9\x41\x7c\x4e\xdd\xeb\xf1\x10\xba\x9b\x07\x91\xa5\xbc\x6d\xe7\xf9\x76\x24\x20\x53\x5b\x72\xae\x32\x2d\x4b\xf8\x70\xfe\xba\x3f\x79\xeb\xfa\x21\x61\xe7\x6f\x21\xfa\x04\xee\x37\x89\x3f\xc5\xfa\x6c\x8a\x9a\xf6\x6e\xa6\xa7\xf9\x9f\x82\xa6\x35\x22\x45\xed\xd5\x96\x24\x0f\xf0\xba\x36\xd5\x3c\xbc\xb7\x6a\xc7\x3d\x7a\xcb\xd5\x7d\x47\x8b\xc5\x2f\xc4\x3a\xc3\x41\xe4\xfa\x71\x16\xdb\x6d\x97\xeb\x45\x44\x09\x3c\x08\x91\xfd\x39\x82\xdf\x91\x7e\x49\x6c\x89\x48\xf2\x5c\x41\xec\xb0\x0b\xf7\x72\xa2\x79\xfa\x2a\xae\x47\x59\x9e\xc2\x6c\x49\xee\xe6\x29\x27\x14\x93\x87\x4b\xbf\x26\x8f\x92\x7e\x8d\x8f\x78\xbe\x60\x77\x7c\x9f\xd8\xa3\xc4\x0e\x08\x5b\x4e\xc7\xc0\x38\xa1\x75\x7d\xaa\x78\xf2\xe6\xb3\x67\x28\xec\x41\x62\x16\x89\x04\x73\x27\x91\x93\x97\xb5\x3d\x4a\x24\x09\xb2\x25\x72\x3a\x11\xbe\x93\xc9\xc9\x0b\xe6\x1e\x65\x92\x04\xd9\x32\x49\xfc\x2d\xfe\xfd\x34\x4e\x5e\x8a\xf7\x04\x93\x24\xce\x8e\xcc\x7e\x96\x70\x4a\x26\x79\x80\xec\xad\xf4\xf5\x1c\xa3\x73\xa0\x2d\xa5\xb3\xdc\xf8\xae\x8d\xae\xbd\x0b\x12\x51\x9d\x99\x6b\xc1\x00\x46\x6a\xff\x27\x00\x00\xff\xff\x4d\xe0\xe9\x72\x38\x72\x00\x00") - -func asset_stat_trustlines_4CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_4CoreSql, - "asset_stat_trustlines_4-core.sql", - ) -} - -func asset_stat_trustlines_4CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_4CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_4-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x99, 0x90, 0x4b, 0xfd, 0x36, 0xe8, 0x6c, 0x54, 0x63, 0x38, 0xf9, 0x80, 0x13, 0xa4, 0x89, 0x94, 0xb3, 0xbf, 0x36, 0x4, 0xbd, 0x3c, 0x64, 0x7c, 0x90, 0x57, 0xf1, 0x39, 0x1c, 0xcd, 0x89, 0xbb}} - return a, nil -} - -var _asset_stat_trustlines_4HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\xf9\x6e\xe2\xc8\xf6\xf0\xff\xf3\x14\x56\x6b\xa4\x74\x2b\xe9\xc6\xfb\x92\xfe\xf5\x95\x0c\x98\x25\xec\x5b\x02\x19\x8d\xac\xb2\x5d\x06\x07\xb0\x89\x6d\x48\xc8\xe8\xbe\xfb\x27\xbc\x80\x6d\xbc\xb1\xa4\xe7\x4a\x1f\x6a\xb5\x82\x7d\xea\x6c\x75\xaa\xce\x52\x45\xd5\xf7\xef\x7f\x7c\xff\x8e\x74\x0d\xcb\x9e\x9a\x70\xd0\x6b\x22\x0a\xb0\x81\x04\x2c\x88\x28\xeb\xe5\xea\x8f\xef\xdf\xff\xd8\xbd\x2f\xaf\x97\x2b\xa8\x20\xaa\x69\x2c\x0f\x00\x1b\x68\x5a\x9a\xa1\x23\xdc\x0f\xfa\x07\x16\x80\x92\xb6\xc8\x6a\x2a\xee\x9a\x47\x40\xfe\x18\x08\x43\xc4\xb2\x81\x0d\x97\x50\xb7\x45\x5b\x5b\x42\x63\x6d\x23\xbf\x10\xf4\xa7\xf3\x6a\x61\xc8\xf3\xe3\xa7\xf2\x42\xdb\x41\x43\x5d\x36\x14\x4d\x9f\x22\xbf\x90\x9b\xd1\xb0\xc2\xde\xfc\xf4\xd1\xe9\x0a\x30\x15\x51\x36\x74\xd5\x30\x97\x9a\x3e\x15\x2d\xdb\xd4\xf4\xa9\x85\xfc\x42\x0c\xdd\xc3\x31\x83\xf2\x5c\x54\xd7\xba\x6c\x6b\x86\x2e\x4a\x86\xa2\xc1\xdd\x7b\x15\x2c\x2c\x18\x22\xb3\xd4\x74\x71\x09\x2d\x0b\x4c\x1d\x80\x37\x60\xea\x9a\x3e\xfd\xe9\xf1\x0e\x81\x29\xcf\xc4\x15\xb0\x67\xc8\x2f\x64\xb5\x96\x16\x9a\x7c\xb7\x13\x56\x06\x36\x58\x18\x3b\x30\xbe\x39\x14\xfa\xc8\x90\x2f\x36\x05\xa4\x5e\x41\x84\x71\x7d\x30\x1c\x20\x9d\x76\x73\xe2\xc1\xff\x98\x69\x96\x6d\x98\x5b\xd1\x36\x81\x02\x2d\xa4\xdc\xef\x74\x91\x52\xa7\x3d\x18\xf6\xf9\x7a\x7b\x18\x68\x14\x06\x14\x65\x63\xad\xdb\xd0\x14\x81\x65\x41\x5b\xd4\x14\x51\x9d\xc3\xed\xcf\xdf\x41\x50\x76\xfe\xfa\x1d\x24\x77\x76\xf5\xfb\x04\x74\xa9\x9d\x2e\x9d\xcb\xe0\xce\x90\xd3\x88\x05\xa0\x0e\xc8\x1d\xf0\x7a\xbb\x2c\x8c\x03\x90\x1e\x5a\x87\x2b\x11\xaa\x2a\x94\x6d\x4b\x94\xb6\xa2\x61\x2a\xd0\x14\x25\xc3\x98\xa7\x37\xd4\x74\x05\xbe\x8b\x01\xe1\x74\x0b\x38\x86\x6e\x89\x86\x2e\x6a\xca\x29\xad\x8d\x15\x34\xc1\xbe\xad\xbd\x5d\xc1\x0b\x5a\x1f\x38\xb9\x88\x8b\xd3\xda\x2e\xa0\x32\x85\xa6\xd3\xd0\x82\xaf\x6b\xa8\xcb\x27\x89\x10\x68\xbe\x32\xe1\x46\x33\xd6\x96\xf7\x4c\x9c\x01\x6b\x76\x26\xaa\xcb\x31\x68\xcb\x95\x61\xee\x86\xa3\x37\xa7\x9e\x8b\xe6\x5c\x5d\xca\x0b\xc3\x82\x8a\x08\xec\x53\xda\xfb\xc6\x7c\x86\x29\x79\xe3\xf2\x0c\xa6\x83\x2d\x81\xa2\x98\xd0\xb2\xd2\x9b\xcf\x6c\x53\x71\xfc\x8e\xb8\x30\x8c\xf9\x7a\x95\x03\x7a\x95\xc5\x92\x0b\x05\x34\xf3\x44\xc4\xfe\xa4\x9b\xbb\xc1\x6e\x9e\x50\x55\x68\xe6\x03\xf5\xd1\x9f\xd1\xc4\x53\x6b\xbe\x46\xce\xd4\x7a\x02\x91\xe0\x54\x9c\xd5\x62\xb5\x6b\x30\xb3\x33\x7b\xc0\x0a\x4d\x40\xd2\x36\xd3\x8c\x66\xfb\x91\x9e\x07\xd8\x70\xf9\x30\x32\x01\x35\xcb\x16\xed\x77\x71\x95\x8d\x72\x07\x69\xac\xf2\x42\xc2\xbc\x60\xbe\x2b\x49\x07\x96\xfc\xe1\x9e\x09\x96\x3d\x8b\x49\xdb\x7c\x9d\xe9\xfa\xc8\x9d\xb6\x2d\x6b\x9d\x45\x79\x0f\x2c\x1b\x0a\x3c\x31\x2e\xd8\x9b\xc1\x0a\x98\xb6\x26\x6b\x2b\xa0\xa7\x3a\xef\xac\xa6\xe2\xea\xc4\xd8\x64\xef\xd1\x4e\xe5\x20\xbe\xe1\xc9\xf4\x1d\xe5\xe5\xa1\xe7\x02\x7e\x3a\x7e\xb7\x33\x77\x3d\xe9\xfd\xb9\xf3\x0f\x7e\xe8\xe7\x18\x83\x98\x93\x83\xa9\x61\xae\xc4\xa5\x36\xf5\x02\x86\x14\x16\x22\x90\xb9\x65\x3c\x3d\xde\x4b\xc3\x9c\xd7\x38\xdd\xd6\xa5\x4e\x73\xd4\x6a\x23\x9a\xe2\x52\x2e\x0b\x15\x7e\xd4\x1c\xe6\xc4\x9d\x60\x74\x57\xc0\xec\x75\x77\x3a\x26\xe7\x5b\x7e\xf1\x7d\x2f\x3d\x10\x7a\x23\xa1\x5d\x3a\x43\x67\xbb\x38\xdb\x82\xaf\x27\x53\x0e\x21\xc9\xdd\x5a\x81\x39\x61\x0f\xd1\x6c\x6e\x09\x13\x46\xfd\x29\xf2\xc5\xa3\xc8\xd7\xd6\x8b\xfb\xf2\x01\x7b\x41\x5e\x6e\xd9\xbc\x19\xe0\x14\x59\xdc\x26\x39\x61\xbd\xf0\x2f\x3f\x3f\x7e\xbc\x98\x87\xa3\xc8\x1c\x92\x0e\x1c\x98\x12\x3c\x40\xbe\x5a\xed\x0b\x55\x7e\x18\x03\xbc\xd4\x76\x19\x87\x26\xc3\xaf\xfa\x7a\x09\x4d\x4d\xfe\xeb\xef\x6f\x39\x5a\x81\xf7\x33\x5a\x2d\x80\x65\x7f\x05\xfa\x16\x2e\x9c\x52\x4c\x8e\x16\xaa\x66\xc6\x36\xa9\x8c\xda\xa5\x61\xbd\xd3\x4e\x91\x47\x04\xd3\xe9\x81\xbb\x3b\xe4\x88\xd1\x14\x1c\xbe\x74\x17\xe0\xd8\xc9\xea\x34\x3f\x30\x7f\x87\x9c\x22\x88\x23\x7a\x0e\x0c\xc2\x78\x28\xb4\x07\x11\x14\x8b\xd5\xd4\x7a\x5d\xf8\xb6\x58\xaa\x09\x2d\xfe\x88\xc2\xcf\x3f\xdc\x2a\x5c\x1b\x2c\xe1\xbd\xff\x0c\x19\x6e\x57\xf0\xde\x6b\xf2\x13\x19\xc8\x33\xb8\x04\xf7\xc8\xf7\x9f\x48\xe7\x4d\x87\xe6\x3d\xf2\xdd\x29\xce\x95\xfa\xc2\xae\xbf\x3c\xcc\x3e\xbe\x3f\x42\x18\xc3\x2f\x3d\xc4\xa5\x4e\xab\x25\xb4\x87\x29\x98\x5d\x00\xa4\xd3\x0e\x23\x40\xea\x03\xe4\xc6\x2f\xbb\xf9\xcf\x2c\x07\xc9\x4d\x94\xb2\x2f\xbe\x47\x73\xaf\xa1\x4c\x79\x42\xba\x6c\x77\x86\x11\x7d\x22\x4f\xf5\x61\x6d\xcf\x56\xb0\xfe\x16\x22\x7f\xc0\x12\x61\xe4\x14\xe1\x8f\x90\x38\x0a\xe8\x36\x0b\xab\xe9\xa0\xd7\x44\x56\xa6\x21\x43\x65\x6d\x82\x05\xb2\x00\xfa\x74\x0d\xa6\xd0\x51\x43\xce\x7a\x61\x90\xdd\x6c\x43\xf3\xd8\xf7\x6d\xf5\xc0\xbf\xdf\xb7\x71\xba\xdc\x5b\x76\x26\x7e\xa4\x2f\x0c\x47\xfd\xf6\x20\xf0\xec\x0f\x04\x41\x90\x26\xdf\xae\x8e\xf8\xaa\x80\x38\xd2\xb7\x5a\x23\x77\xbe\x1b\x0c\xfb\xf5\xd2\xd0\x81\xe0\x07\xc8\x9f\xe2\x9f\xc8\x40\x68\x0a\xa5\x21\xf2\x27\xb6\xfb\x16\xed\x8d\xcc\x81\x78\x99\x74\x59\xe8\xaf\x26\x1c\x1e\x27\x5c\x9e\x99\xea\x32\xf9\x72\x50\xd8\x8b\xb8\x7f\x74\x96\x84\x5f\xff\x40\x90\x12\x3f\x10\x90\xa7\x9a\xd0\x46\xfe\xc4\xfe\xc2\xfe\x2e\xfc\x89\xfd\x85\xff\xfd\x9f\x3f\x71\xe7\x6f\xfc\x2f\xfc\x6f\x64\xe8\xbe\x44\x84\xe6\x40\xd8\x29\x45\x68\x97\xbf\xc5\x6a\x26\x87\x1f\xb8\x50\x33\xd9\x14\x3e\x5b\x33\xff\x77\x8e\x66\x8e\x7d\xaa\xa7\x87\xbd\x1f\xce\xa7\x88\x83\xdb\x3e\xc2\xe8\x70\x8c\x20\x83\x9d\xae\x90\x5f\x87\x19\xe0\xce\x7d\x3c\x9c\x74\x05\xe4\x57\x70\x44\x7c\x8b\x1b\xb5\x57\xe5\x31\x8a\x30\xc2\xa2\x3f\x8c\xf3\x73\x18\x1b\x02\x5d\xca\x65\x1c\xd2\x08\xa7\xa1\x01\x19\x66\xf7\x60\x65\xc7\xdc\xc6\x85\x79\x17\x73\x1b\x83\x34\xca\x6d\x70\x90\xa4\x72\xbb\xf3\x5c\x0a\x54\xc1\x7a\x61\x8b\x36\x90\x16\xd0\x5a\x01\x19\x22\xbf\x90\x9b\x9b\x9f\xe1\xb7\x6f\x9a\x3d\x13\x0d\x4d\x09\x2c\xa5\x85\x64\x0d\xc6\xbf\x9e\x88\xce\x00\xcb\x27\x9e\x3b\x16\x83\xc9\xb7\x2b\x91\xa6\x20\x92\x36\xd5\x74\xdb\x09\x0c\xda\xa3\x66\xd3\x15\x07\x2c\x77\x61\x3c\x22\xcf\x80\x09\x64\x1b\x9a\xc8\x06\x98\x5b\x4d\x9f\x46\xc0\xf4\xf5\x72\x1f\xf2\x23\x9a\x6e\xc3\x29\x34\x23\x20\xea\x02\x4c\x2d\xc4\x5a\x82\xc5\xe2\x98\x8c\x6d\x2c\x17\xc7\x44\xbe\xe2\x14\xf5\x6d\x0f\x79\xdc\xed\xd1\xbc\xe1\x5c\x75\x44\xab\x1d\x7b\x95\xd8\xf0\xfd\x48\x21\xab\xd5\x42\x73\x6a\xf6\x88\xad\x2d\xa1\x65\x83\xe5\x0a\xd9\xf5\x99\xf3\x15\xf9\x30\x74\x78\xcc\x68\x52\x56\xe4\xc7\xa3\x5e\x3a\x95\x8f\xe7\x7d\xf2\x95\x80\xd5\x33\x43\xbe\x3f\x74\x23\x3a\xcc\x79\x50\x6f\x97\xfa\x82\x13\x7e\x15\x27\xde\xa3\x76\x07\x69\xd5\xdb\x8f\x7c\x73\x24\xec\xbf\xf3\xe3\xc3\xf7\x12\x5f\xaa\x09\x08\x96\x25\xcc\xd9\x6a\x8f\x22\x3a\x32\x45\xaf\xe8\x81\xe8\xf0\xdd\xde\x80\xc5\xd7\x9b\x04\x89\x6f\xee\xef\x4d\x38\x95\x17\xc0\xb2\xbe\x45\xbb\xcb\x5d\xab\x88\xb1\x2d\x9a\xfc\x96\xd2\x51\x6e\x6e\x7c\xb1\x64\x6e\x45\x67\x2f\x57\xfc\xc8\x38\xd4\xea\xe2\xd9\x8c\x05\x97\x0d\x25\x0e\x1c\xc3\xe3\xc1\xdd\xf2\x5f\x4c\x03\x8a\x4e\x1b\x61\xf1\xe5\x85\x2b\x99\x6d\x10\xe7\x6f\x33\xda\x34\x41\x90\xce\x53\x5b\x28\x23\xc5\x49\x86\x44\x6e\x85\x2e\x5d\xa0\x3d\xae\xc8\xeb\x1f\x9a\x92\xc4\x9b\x5f\xf3\xb9\xd4\xea\x3c\x3c\x9e\xd9\x45\xc6\x8c\x98\x34\xd3\x1f\x97\xb8\x92\x20\xbf\x38\x0b\x1f\x5f\x12\xac\xd9\xb1\xe3\xf8\x57\x0a\xb4\x81\xb6\xb0\x90\x17\xcb\xd0\xa5\x64\x63\xf3\x0b\x65\x97\xea\xc1\xc3\xe3\xe9\xc1\x5f\xb7\x4e\xe0\x2d\xb0\x98\x9c\x6b\x14\xc6\xad\x63\xc7\x37\xf4\xd4\x12\xa8\x8c\x3a\x1d\xb1\xe7\xc3\x9f\xe5\xd0\x08\x85\x43\x47\xe4\x83\xdf\x2f\x26\x47\x1c\x93\xb1\xb6\x0f\xbe\x29\xda\xc6\x84\xc0\xce\x6c\xe4\xc2\xae\x57\x4a\x6e\xd8\xbd\xe9\x78\x5f\x23\xeb\xec\x47\xb2\x60\x47\xf1\x80\x0d\x16\xa2\x6c\x68\xba\x15\x6f\x83\x2a\x84\xe2\xca\x30\x16\xf1\x6f\x9d\x95\x4f\x15\x26\xf5\xb5\xf3\xda\x84\x16\x34\x37\x49\x20\xbb\x38\xd4\x7e\x17\x9d\x30\x49\xfb\x48\x82\x5a\x99\x86\x6d\xc8\xc6\x22\x51\xae\x68\x1f\xf9\xc6\x02\x81\x02\x4d\x27\xbc\x70\x9f\x5b\x6b\x59\x86\x96\xa5\xae\x17\x62\xa2\xa1\x78\x82\x03\x6d\x01\x95\x64\xa8\xe4\x61\x95\x50\xbb\xbe\x74\x94\x25\xac\x87\x64\xf8\xbc\xfc\xb3\x4d\xf6\xfc\x75\xaa\xc8\xd7\x75\x63\xa9\x34\x7e\x97\x5b\x3b\x49\xd0\x0b\xdd\x5c\x2a\xad\x63\xb7\x17\x0f\x9e\xe2\x06\x03\x2b\x3b\x57\xb3\xcd\xac\x34\x27\xbc\xab\x2a\x21\x15\xda\x45\xfe\xb2\x2b\x8a\xe3\x01\x2f\x74\x80\xde\xc8\x37\xd6\xa6\xbc\xdf\xa6\x91\xe0\x7a\xfc\xe9\xe4\xe6\xe6\xfe\x3e\x39\x15\x4b\x1e\x07\xde\xc2\xda\xa5\xea\xf4\xf6\x02\x7e\xbd\x6a\xbc\xe0\x4d\x89\xe7\x78\x2f\x67\x2f\x4c\x22\xd9\xc8\x4e\xc4\x34\x20\x6f\x73\x64\x1a\x88\x9b\x07\xc7\x02\x1c\xef\xe9\xcc\x80\x4b\x25\xb7\x87\x4a\xa1\xe8\xb0\xa4\x59\xa2\x05\x17\x0b\x68\x22\x92\x61\x2c\x20\xd0\x7d\x9f\xa4\xc9\x50\xd4\x43\xfe\xd7\x7d\x16\xf6\xc9\x87\xdd\x44\x62\xc4\x5b\x87\xf6\x33\x45\x5f\x06\x96\xe9\x63\x77\x7e\x3a\x5c\x8b\xce\xde\x60\xa4\x54\x13\x4a\x0d\xe4\xeb\xd7\xa0\x06\xff\x83\xa0\xdf\xbe\x65\xa1\x8a\x6b\xee\x2b\xed\xff\x8e\xf4\x98\x03\x5f\x48\xa7\x11\xf4\x11\x85\x3b\x0c\xa6\x0e\xa5\xf8\x15\xee\x2b\x0c\xae\xf8\x3d\x0b\x39\x3d\x69\x9e\x29\xec\x12\x5f\x9a\xb5\x3f\xe0\x3a\xde\x34\x83\xca\xef\xf2\xa7\x27\x0a\x7b\xa1\x47\xcd\xa0\x76\xec\x53\x93\x1a\xa4\x78\xd5\xd0\x9e\x90\x2b\xda\xaa\x6f\x9f\x41\x96\x72\x27\x51\xde\xdc\x9f\x91\x9a\xe5\x75\xbc\xe9\x3e\x34\x16\xf6\x40\x3a\x76\xbc\xec\xb2\x80\xe4\x34\x22\x29\x41\xfb\x57\x52\x2c\xfb\x5d\x84\xfa\x06\x2e\x8c\x15\x8c\x2b\x5b\xda\xef\xbb\x84\x67\xbd\xb0\x13\x5e\x2e\xa1\x0d\x12\x5e\xed\x52\xad\xa4\xd7\x96\x36\xd5\x81\xbd\x36\x61\x5c\x85\x8d\xa3\xbf\xfd\xf5\xf7\x21\x76\xf9\xe7\xbf\x71\xd1\xcb\x5f\x7f\x47\x75\x0e\x97\x46\x42\x31\xec\x80\x4b\x37\x74\x98\x1a\x0b\x1d\x70\x1d\xa3\xf1\x24\xd3\x96\x50\x94\x8c\xb5\xae\x38\x15\x6b\xd6\x04\xfa\x14\x46\xb3\xb1\xb0\x6b\xdd\x69\x62\x87\x6d\x0a\x95\xec\x74\xcb\xab\xfd\x69\x8a\x3f\xda\xfc\x2d\x5c\x79\xa6\x08\x77\xb8\x39\xfb\xe5\x32\x76\x87\x0d\x84\x61\x4a\x9d\x34\x58\x91\x0a\x56\x49\x4f\xcb\x23\xae\x27\x44\xce\xcd\x73\xa9\x42\xa5\xe6\x1f\x79\x84\x4c\xf4\xb4\x57\x13\x33\xf7\xfe\xc3\x54\x41\x33\xdc\x42\xbc\xa8\x65\x60\x03\x44\x35\xcc\x8c\xd5\x22\xa4\xcc\x0f\xf9\x0c\xf1\xea\xed\x81\xd0\x1f\x22\xf5\xf6\xb0\x13\x5a\x31\x72\xbc\xe8\x00\xf9\x8a\xdd\x21\x37\xe8\xcd\x1d\x82\xdd\x21\xe8\x1d\x72\x73\xf3\xed\x67\x66\x13\xfc\xb8\x49\x02\xe3\x69\x6b\x3b\xa7\x32\x1f\x5d\xdf\xf1\xb9\xb9\xc1\x44\x4d\xd7\x6c\x0d\x2c\x44\x77\xaf\xcd\x0f\xeb\x75\x71\x73\x87\xdc\xe0\x28\xc6\x7d\x47\xe9\xef\x28\x81\x60\xec\x3d\xce\xde\x93\xcc\x0f\x94\xc0\x49\x8e\xbe\x45\xf1\xa8\x9c\x89\xd8\x71\xd1\xfd\x0d\x45\xa8\xef\xa4\xad\x68\x1b\x9a\x92\x4e\x89\xa3\x29\xe6\x14\x4a\x84\xb8\xb6\xe0\xde\x97\x89\x9a\x7e\xf4\xbb\x8d\x54\x7a\x24\x89\x92\xec\x29\xf4\x48\x11\x28\x8a\x18\xad\x7e\xa5\xd2\xa0\x48\x8a\xc0\x4f\xa1\x41\x89\xae\xe7\xf4\x63\x78\x67\xd5\x34\x95\x04\x4d\xa0\xf8\x49\x62\xd0\x3e\x09\x6f\x9e\xcc\x41\x82\x25\x31\xea\x14\x12\x8c\xb8\x34\x14\x4d\xdd\xe6\x97\x82\xc5\x68\xfc\x24\x12\x6c\x48\x0a\x6f\xb3\x74\x0e\x3a\x0c\x49\x13\xa7\xd1\xd9\x75\x3a\x98\x4e\x4d\x38\x05\xb6\x61\xa6\xdb\x14\x87\x62\x28\x77\x0a\x7a\xce\x41\xef\x56\x46\xc5\x77\xc5\x4c\xc7\x8e\x33\xd8\x49\x5d\x8d\xa1\x0e\x7a\xaf\x17\x9c\x7c\x38\x9d\x00\xc5\x31\x27\x69\x07\xc3\x82\x04\xf6\x09\xd6\x6e\x02\x48\x27\xc4\xd1\xdc\x69\x92\xe0\xa1\x8e\xf6\x52\x5a\xf7\xe7\xb9\x69\x94\x30\x94\xa1\xc8\x93\x7a\x04\x23\x5c\x71\xf6\x85\x80\xd4\x1e\xc7\x30\x9c\xa1\x4f\x93\x84\x14\x55\xed\xdd\xff\xa9\x82\xb1\x5c\x88\xaa\x06\x17\xa9\x53\x23\x86\x51\x18\x76\xd2\x24\x8c\x51\xfe\x0a\x8d\x5f\x39\x7f\xcf\x10\x83\x66\x4e\x9b\xe6\x31\x5a\xd4\xf4\x29\xb4\x6c\xf1\xb8\x36\x9f\x41\x8a\xe1\xd8\xd3\x7a\x84\x09\x05\x05\xce\x22\x08\x48\x77\x26\x18\x8e\xa2\x04\xe9\x11\x49\xf0\xb5\xa9\x2b\xfa\xa7\x3a\xdb\xa3\x55\xfd\x60\xb8\x50\x2d\x8d\x1b\x55\xba\xdf\x26\x3b\xed\xba\xd0\x2d\xb5\xda\x95\x22\x43\xe0\x3c\x49\xd0\xcf\x54\xb7\x5d\x1e\xf4\x9b\xd5\xa7\x06\x53\x2d\x36\x4b\xad\x5e\xb3\x5e\xe9\x90\x03\x46\x98\x3c\x3d\x8e\xa2\x1a\x4a\x24\x82\x3b\x44\x70\xa2\x57\xc1\x6b\x23\x81\xc2\xf9\xd6\x78\x54\x19\xd5\x08\x7e\xf2\xc0\x8f\xc7\xd5\xf1\xf8\x11\x7f\xac\x8d\x27\x93\x3e\x2d\x4c\xc6\xc2\xb0\xdb\x28\x8f\x9f\x07\xfc\x13\xcd\x8c\x3b\x64\x6e\x22\xc4\x8e\x48\xb1\xdf\x9d\xd4\xea\x4d\xbc\x54\x27\x2a\xed\x1e\x59\x1c\x37\x2b\xad\x76\xb9\x59\x79\x18\xb5\xbb\x23\xbc\x36\x21\x9e\x5b\x95\x41\xad\xd3\x1e\x95\x84\x0e\x3f\x78\x62\x7a\x25\xa6\x33\xc6\x6b\x37\xe7\x6e\x0e\xd9\xc5\x8a\x19\xdd\xe0\x6d\xa8\x3b\xec\x85\xfd\x61\xc1\xf4\x8d\x13\x77\x08\x71\x87\xd8\xe6\x1a\xe6\x30\x8e\xe3\x2d\x11\x67\x9b\x86\x9b\xca\x04\x0d\x43\x36\xa1\xa2\xd9\x22\x58\xac\x66\x40\x5f\x2f\xc9\x9d\x39\x8f\x06\xe5\x9b\xcf\xb0\x99\x30\x75\x3c\x8b\xfa\xf9\xc6\x74\xce\x16\x84\xab\xf4\x72\x28\xed\xbb\x43\xf0\xbc\x7d\x1c\xb7\x03\xe1\xdc\x4e\xf6\x77\x21\x04\xf4\x8c\xe1\x2c\x4b\x72\x28\xc5\xb1\x94\x93\x02\xe0\xbb\x1c\xe0\x9f\x2f\x0b\x6d\xa9\xd9\x5f\xee\x91\x2f\x1c\x8e\x13\x04\x83\xa3\x04\xcd\x52\x3f\x48\x86\xa1\x58\x94\xf9\x72\x87\x7c\x39\xec\x78\xd9\x41\x8d\x06\xe5\xc3\x43\x7b\xbb\x72\x1e\x46\x7b\xf0\x00\xe1\xee\x7c\xd9\xc1\x9c\x6b\x48\x5f\xfe\x9b\x64\x4a\x51\x19\x31\x5f\x46\x0c\x45\x59\xec\xdf\x91\xf1\x3c\x73\xcd\x2f\x23\x7e\x87\xb0\x14\xcb\x71\x04\x4b\xb3\xdc\x3e\x93\xfb\xe7\x8b\x65\xef\xd2\x1c\x7d\x2a\x4a\x60\x01\x74\xd9\xe1\x18\x43\x51\xf4\x07\xea\x7e\xf2\x53\x20\xc2\x14\x70\x67\x92\xba\xf9\xe7\x8b\x1b\xea\x1c\xe1\x3d\xd2\x93\x0e\x6c\x6d\x03\xcf\x96\x88\xb8\x43\x30\x57\xa4\x37\xa8\x4d\x67\x3b\x82\xd8\x1d\xf2\xc5\x35\x7c\x71\x0e\xb7\xbf\x47\xcf\x98\xc7\x15\x89\x33\xde\x70\xf9\x2c\x3d\x7b\x14\x3e\x5d\xcf\x11\x89\x72\xea\xf9\x92\x31\x9b\x31\xdd\xc5\x6d\x34\x3a\x77\xba\xf3\x37\x1b\x05\x63\x04\x16\x40\x49\x91\xa0\x24\x4b\x38\x2e\x73\x90\xa5\x50\x00\x15\x52\x95\x31\x06\x05\x24\xad\xa2\xa4\xac\x48\x40\x61\x28\x86\x40\x49\x55\x65\x51\x49\x01\x90\xa3\x49\x46\x41\x39\x88\xd3\x10\xdf\xf9\x1f\x56\xc5\x70\x92\xa0\x24\x05\x03\x38\x81\x33\x34\x8e\xe3\x34\x47\x41\x4a\xa2\x29\x14\xe3\x80\x4a\x62\x10\x95\x48\x0c\x25\x38\x8a\x26\x49\x20\x13\x34\x0a\x24\x82\x54\x55\x4a\x61\x70\xa0\x28\xee\xf4\x8f\x47\xa2\x43\xfa\x9e\xa0\xef\x09\x22\x1a\x34\xba\x8f\xa9\x1f\x0c\x4e\xe0\x04\x9d\xf9\xd6\x9b\xcf\x31\x96\x65\xef\x10\x8c\xde\xf5\xe7\xd1\xe7\x0e\x21\x77\xff\x61\xde\x7f\xfe\x43\x6c\xff\xc7\xce\xfb\xf3\x3c\xcf\x97\x48\x76\xd0\xc3\x36\x7d\xe3\xe5\x01\xaf\x6b\xe0\x91\x92\x9e\x7b\x55\xc0\x15\xc9\x66\xaf\xd7\x79\x7c\x16\xcc\xf2\xa4\x61\xa1\x05\x0c\xdb\x9a\x8a\xcc\xac\x30\x05\xd7\x8c\x41\xc1\xa8\x36\xd6\xe4\x6b\xe3\x65\x3d\xc4\x64\xb4\xb2\x99\xbf\xda\xdb\x77\x7a\xa2\x3c\x61\x4d\xa9\xde\x9a\x34\xba\xf2\x0e\x35\x3f\xee\x3e\xb6\xe6\x3d\x7e\xff\x21\xb9\x0a\x86\x49\xab\xd1\xcb\x9c\x79\x7a\xac\xb5\x9f\x57\x1f\xed\xc1\xba\xfc\x2c\xdc\xd2\x0f\x78\xaf\x5f\xfa\x90\xd6\x96\xd9\x58\x3c\xcf\xe7\x74\x41\xa9\xf7\x9b\xd2\xe3\x40\x47\x4d\xae\xba\x1e\x60\x4f\x26\xb1\xe2\xad\x8e\x3c\x1b\x68\xcf\xb0\x49\x57\x9f\x39\x8e\x1a\x3e\x37\x51\x49\x23\x1c\xcc\xad\x36\xd9\x04\x1f\x2b\x3c\x40\x8c\xaf\x06\xbf\xec\x3f\xcf\xfc\x18\x23\x7b\x3c\x5f\x46\x1f\xe2\x5e\xff\x4f\x7f\x5c\xa3\x42\x13\xc6\x7d\x74\x28\xe0\xd7\x31\xe3\x1b\x9a\x50\x38\x56\xa5\x08\x1a\x42\x9a\x55\x30\x09\x67\x24\x4a\x62\x39\x15\x27\x80\x4a\x11\x18\x26\x31\x14\xcd\x01\x9c\x54\x81\x8a\x91\x28\x01\x14\x54\xa2\x70\x89\x26\x08\x09\x65\x24\xc8\x71\x69\x43\x01\x4f\x34\x76\x12\xc7\x71\x2e\xf3\xad\xeb\x40\x48\x8a\xc3\x53\x46\x02\x9e\x73\x24\xe0\xdd\xe7\x17\xac\xbd\xa6\x0c\x54\x7a\x60\x9e\x48\x7d\xdb\xd9\x8c\xde\xab\xc4\xe3\xca\x98\xdf\x6e\x2a\x7c\xc7\x2e\x61\x0d\xbc\xc5\x14\x19\xfa\x79\x4d\xd5\x38\xb9\xa6\xa0\xaf\xbc\xf5\xfc\xc2\xf5\xe8\x09\xbb\xad\xd7\x65\x7a\x6d\xcf\xd5\x42\xa9\x73\xdb\x5c\x16\xd0\x86\x64\xa9\xe6\x47\x77\xe4\xf4\x9c\x33\x12\x9c\xbf\xea\xfb\xff\x78\xc7\x3e\xad\xc3\xf7\x37\xbe\xdb\x73\x81\xf8\x2e\xda\x7d\x19\x10\x7d\x95\x99\x59\xec\xfb\x63\xbd\x38\xc5\xa7\xec\x7b\x63\xf3\xda\xe9\x14\xf4\xc2\xb4\x30\x7e\x9b\x76\xfb\x85\x5a\x91\x79\x85\xdc\xca\xd2\x1e\xd6\xe4\xbc\x5d\xeb\x93\xc6\xb8\x26\x0c\xeb\x0a\x89\x75\xdb\x0f\x63\x66\xf5\xf0\x6a\xa0\x38\x4f\x1a\xb7\x94\xde\x97\x88\x8f\xf5\x9b\x43\x2a\x66\xa4\x94\xeb\x71\xd6\xf6\xff\xcf\x48\xc1\xae\x63\xe5\xce\x02\xd8\x2e\x5c\xd8\xb9\x57\x8c\x63\xd0\xef\x28\xf6\x1d\xc5\x10\x14\xbd\x77\xfe\x25\x5a\x33\x45\x60\x1c\x99\xf9\x96\xc4\x39\x92\xa3\x19\x9c\xa3\x53\x6c\x3d\xde\xd2\x5d\x96\xfe\xed\x4e\x49\xfe\x14\xc7\x0d\x8d\xdc\x16\xb6\x83\x46\x91\x29\xeb\x65\xae\x86\xa3\xef\x2f\xc5\x5b\x0b\x9d\xda\xd6\x5b\xfd\xed\x03\x1b\x2b\x83\xa7\x09\x28\x3e\x80\xca\x74\x07\x2f\xc4\x18\x71\xfc\xc7\x37\x62\x9e\x2f\xce\x7f\x83\x20\x57\xfd\xdc\xb8\xc6\x94\x1d\x50\xe5\xd8\x62\x7a\x6e\x7c\x95\xb0\x72\x78\x94\x79\x79\xd9\x25\x9e\x30\xe2\x32\xd0\xe0\xd1\x04\xee\x3c\x34\x91\x0c\x86\x38\x0f\x0b\x19\xc9\x83\xce\xc3\x42\x45\xa2\xee\xf3\xb0\xd0\x91\x6c\xe4\x3a\x5b\x6e\xaf\x52\xed\x48\x5f\x0f\xbe\x43\xe8\xbc\xd5\x8f\x84\x8d\xa7\x17\x5b\x6c\xc0\x4a\x43\x05\x90\xfd\x17\xd2\x49\xef\xe8\x7c\x85\x02\xdb\x5c\x5b\x36\x84\x17\x25\x47\x3e\x1a\xe3\xb2\x9a\xc1\xff\x44\x69\xe6\x13\x0a\xbe\x89\x3d\xe7\xcf\x0a\xfb\x2f\xe8\xd9\x3d\x77\xbe\xca\x43\x3d\x77\xbe\x01\xfc\xfb\x05\xa7\x4f\xa8\xed\xc6\xf4\x5c\x70\x0a\xdd\xff\xcd\x06\x0a\x2a\xea\x5a\x57\x3c\x59\xce\xac\xe9\x3b\x7a\x71\x2b\xeb\x97\x76\x6e\x8e\xea\xce\x85\x8b\x0f\xa7\xa8\xcd\x9b\xed\xf7\x7f\x93\x9f\xab\xb6\xf3\x8d\xf9\xf3\xd5\x96\xe1\x3b\x62\x76\xd8\xe7\xf1\x1b\xd9\x58\xb3\x37\x1b\x9f\xeb\x9f\x12\x37\x29\xc5\xc6\x54\x64\x72\x00\x92\x89\x08\x8f\x4e\x99\xe7\x22\x22\xc2\x43\x38\x29\x96\xc9\xc4\x43\x86\xf1\x9c\x2d\x58\x64\x6c\x9c\xcd\x0f\x1d\x19\x63\xd7\xda\x84\x7d\x95\xf8\x2a\x6b\x1b\xda\x09\x11\x56\xe2\x26\xe4\x2b\xd8\x70\x70\xe3\x15\x64\x29\x85\x03\x04\x8e\x92\x28\x07\x65\x1a\xc5\x18\x94\xa1\x55\x54\x95\x08\x92\x45\x39\x45\x56\x18\x9c\xc0\x51\x5c\xa1\x80\x4a\x72\x2c\x50\x51\x92\xa0\x50\x15\x00\x0e\x30\x90\xa0\x31\x77\x59\x14\xbb\x24\xb2\x08\x54\x84\x08\x3f\x13\x4e\x2e\xa7\x92\x24\x9b\x52\x6c\x75\xdf\x86\x86\xa2\x9b\x42\x37\x9f\xc8\x0a\x0a\x67\x1d\x9a\xdf\x72\x25\xb4\x6b\x55\x85\xe9\x46\xc6\x18\x0c\x1b\x71\xec\xe4\x85\x5c\x36\xe7\x4b\xae\xc7\x50\xf3\x12\xb1\xe1\x9d\x14\x94\xf7\x4b\x3c\xc5\x48\x86\x17\xf8\x3e\x71\xbe\x3f\x3e\xb6\x05\xf7\x7b\x69\x6d\x10\x86\x4d\x52\xaf\xa5\xae\xf0\xbe\xea\x15\x08\xa3\xd6\xbe\xfd\xc0\x98\xfe\x56\xb3\xb0\x85\xda\xaa\x4c\x96\xbd\xa7\xa9\xb9\x1e\xdc\x0e\x6b\x85\xfd\xe7\x80\xaf\xb6\xa7\xdf\x6b\x58\xe3\xd2\xb0\x07\xac\xf9\x0a\x9b\xda\x7a\x5d\x7d\xe3\x87\xec\x6d\xa3\x31\xc1\x6f\x67\xcd\x82\xb4\x61\x46\xad\x4a\xf3\xa1\x50\xfb\xe0\xd6\xd6\x54\x57\x54\x6a\x3c\x13\x0a\x34\x25\x54\x1e\x38\x82\x5e\x73\x9c\x3c\xb3\x3b\xa0\x55\x9a\x94\x6b\x95\xf1\x87\xc5\x57\x0a\x05\xbc\x69\x4c\x5b\xbf\x6e\x82\x25\x85\x60\xb1\xf5\xf0\x67\x35\x20\xeb\x01\xbe\xb7\xd7\x47\xd9\xf9\xfe\x76\x00\xb2\xa5\xe9\xb8\x4f\x0b\x8c\x51\x6e\xa2\xcd\xde\xed\xdb\x64\x50\xe2\x3e\xc6\x9b\xf1\xe3\x90\x78\xd7\xba\xda\x64\x3d\x90\xb0\xf2\x66\xd9\x6b\x42\xd6\x51\xd2\x23\xbf\x79\xd1\x0f\xfa\x4d\xf8\x08\x49\x2f\x8a\x57\xa6\x1f\xed\xdf\x13\xe8\xb7\x0e\xfa\x70\x3e\x25\x6c\x5d\x54\x6a\xc6\x70\x3d\x6d\x6d\x7a\x76\x99\x29\xce\xea\x4d\xa2\x0d\x39\xe5\xb1\xab\x56\xeb\xb7\x0f\x1a\xf5\xb0\x19\x75\x6e\x9f\x79\x9b\x71\xda\x3f\x8c\x4a\xb7\x1d\xb7\xec\x3e\x4d\xa1\x99\x58\x31\x11\x3e\x83\xfe\xb1\x3e\xd2\x2b\x36\xe5\x03\xcc\xa9\xf4\x2b\x8f\x23\xd4\x43\xde\xa0\x5f\xa0\x46\xbc\x2c\x8d\x3a\x3b\xac\x2e\xca\x05\x38\x95\x09\xa6\x3b\xb6\x6b\x8d\xc6\xc7\xd3\x23\xfb\xf6\xa8\x3d\x17\x41\x69\x4d\x35\xa9\x56\xa0\x2b\x0e\x83\xe8\x2d\xaa\xbf\x5f\x07\xdb\x75\x64\x73\x9a\x95\x2e\xd3\x95\xc7\xeb\x34\x45\x1b\xbf\xad\xaf\x4e\xa1\xef\xea\xe2\x9f\xd7\x77\xf9\xa1\x5d\x7c\xdd\x0e\xf4\xa7\x12\x2e\xcf\x0a\x7c\xb1\xfb\x41\x1a\xab\x17\x89\x16\x36\xdc\xba\x60\xf7\xde\x46\x96\xce\xaa\x5d\x9c\xde\x96\x14\xac\xb0\x80\xc2\xb0\x60\xce\x7b\x23\x9d\x50\x5f\x19\x02\xdb\x56\x51\xca\x78\x7b\x98\xb6\xe4\x47\xb5\xf3\xc6\x8f\x0b\x85\xc9\x5a\xe3\xdf\x7e\xfd\x72\x02\x46\xe7\x67\x06\x7e\x3d\xd5\xfd\x7f\xe7\xe8\x9c\x09\x3d\xdb\xd7\x07\x3c\x92\xa4\x90\x2c\xad\x48\x8a\x82\xe2\x0a\x49\xa3\x2c\xc6\xd0\x0c\x26\x93\x80\x02\x0c\xe4\x14\x1a\xb2\x34\x25\x03\x9c\x93\x25\x12\x83\x34\xae\x30\x00\xa8\x0c\x0a\x70\x15\x42\x4a\x22\x68\x05\xba\x1e\x09\xbf\x24\x63\x3a\xcd\x23\xd1\x5c\xda\xe2\xa0\xfb\x36\x14\xd3\xb9\x56\x79\xa2\xc5\x9f\xe9\x91\xf2\x5b\x19\x11\xe7\x91\xaa\x7b\xfa\xbd\x22\x37\x5f\x36\x9e\xf0\x57\x62\xc3\xf4\xd4\x2d\xdb\x6d\xc1\xb9\x20\x61\xc3\x61\x9d\xd2\xde\x5f\xe7\x75\xb4\x68\x4c\xc7\x66\xc7\x66\xa6\x1d\x8c\xc6\x7b\xd2\x7c\x86\x2b\x83\xe1\x48\x85\x65\x63\x23\xa3\x5d\x1e\xa8\xb3\xf2\xf8\xdd\x9e\x3d\xf2\x0b\xab\xb9\x7e\x59\x14\x97\xdb\x97\x22\x3f\xf9\x14\x8f\x64\xbe\xb6\xe9\x26\xec\x80\xe9\xcb\x7b\x0b\x8c\xba\x1c\x5d\xfc\x50\x2d\x0e\xa2\xb2\x61\xb6\x9f\xc7\x1f\xc5\xa7\x87\x79\xc5\x68\x30\xf3\xcd\xdc\x69\x74\x75\x8f\x74\x21\xfd\x6b\x7a\xa4\xfc\x11\x89\x03\x7f\x75\x8f\x74\x0d\xfa\x97\x78\xa4\x13\xe9\x07\x3c\xd2\x89\x11\xa3\xd7\x15\x97\x78\xa4\x33\x74\x75\x55\x8f\x74\x61\x5f\x9d\x42\xdf\xf3\x48\x35\x7c\x30\x59\x49\xc0\x84\x05\xbb\x58\x68\xbe\xb1\xef\x74\xaf\xbf\x79\x6c\xb7\x5e\x96\xcd\xea\x6b\xef\xa5\x57\xd5\x8a\xd0\xa2\x89\x35\xcf\x8c\xcd\xe7\xe2\x7a\x50\x7b\xc6\x1e\xda\x7d\x8e\xec\x68\xdc\x47\x8f\x2d\xae\x6e\x85\xb6\x5a\xc5\x2b\xa3\xd2\xd3\xdb\x9a\xee\x8c\xaa\x52\xa3\x25\x14\xa7\xd7\xf6\x48\x8a\x44\x70\x2c\x94\x48\x00\x59\x8e\xa1\x68\x02\xa7\x68\x92\x90\x81\x82\x63\x32\x47\x42\x8c\x90\x54\x19\x65\x48\x89\xc0\x09\x08\x59\x02\x62\x24\x26\xa9\x0c\x8a\x01\x4a\xe1\x50\x52\xc5\x24\x77\x61\x13\xbb\xa4\xaa\xe2\x34\x4f\x77\x44\x64\xda\x36\x94\xdd\x4b\xec\x26\x9c\xca\xbb\xa6\x58\x6d\xb2\xb5\xde\xa6\x37\x97\x1a\x78\x8d\x27\x9e\x1e\x5f\xfa\x66\x63\xf9\x32\x46\x51\xb5\xca\x5a\xcd\x3a\xb3\x44\x85\xfe\xdb\xc3\x53\x81\x1f\x3b\xbb\x36\x9e\x0f\x7d\x98\xe2\x86\xdc\xcf\x19\x81\x79\x70\xbd\xaf\xf8\xb8\x79\xab\x70\x6f\x8e\xa5\x4e\x5e\x7a\x72\x77\x88\x57\xa9\xd9\xab\x5e\x5c\x4e\xab\x55\x38\xe5\x1e\xd8\x05\x29\x63\x82\x3e\x5a\xbc\xcf\x17\xc2\xa2\xc6\x59\xaf\xcf\x26\xca\x31\x58\x85\xee\x34\x9f\x54\x58\x58\x92\xf3\x55\xc5\xae\xdf\x5a\x75\x54\xc3\x5e\x9b\x9a\x4d\xf1\xe8\xc3\xf6\x49\x97\x66\x93\xe6\x13\x65\x94\x73\xb8\x9e\x90\xcd\x86\x5d\x4f\x40\xe6\xc3\xd4\x1b\x18\xce\x45\xad\x50\x44\x9b\xe8\x43\x75\x6b\xcf\xde\xda\xd8\x62\x82\x82\xed\xca\xc0\xb8\x76\xed\x7d\xd3\x2c\x6d\x3b\x94\x5d\x14\xe4\x92\x2b\x23\x31\xb5\xcd\x8e\x3e\x29\xb0\xe4\xa1\x7d\x82\x2b\x4a\x1f\xce\x17\xd0\xaf\x0c\x9f\x8a\xd6\x05\xf4\x79\xfe\xdf\x0b\xb0\x63\xa7\xd6\xe2\xf9\xba\xe8\xe8\xcf\xa9\x62\x66\xe9\xe2\xd2\xbe\xd8\xd9\xc2\xad\x1c\xc1\x77\x92\x2e\xfe\xa9\xd6\xd1\x5a\x19\xe5\x66\xeb\x09\x58\xbd\x3d\x1b\xc5\x99\x6e\x74\x07\xea\x03\xac\xb5\xfb\x0f\xd8\x83\xfc\xfc\xd0\x7f\xe8\x17\xa4\xc6\x12\x70\x5d\xc8\xf5\xe1\x8b\x86\xe9\xc4\x86\x5a\x3f\x34\xfa\xd2\xa0\x6b\x96\xda\x75\x1b\x68\xa4\x09\x7b\xed\x92\xbc\x58\xe1\xe4\x53\x09\x5b\x83\xeb\x07\xfb\x2a\xc7\xc8\x40\x55\x81\xc4\xca\x18\x8d\xe2\x04\x20\x18\x96\x25\x31\x9a\x92\x25\x54\x22\x54\x15\x03\x00\x57\x80\x4a\xa2\x28\xaa\x42\x95\xe4\x14\x1c\x83\xaa\xcc\x92\x8c\xa2\x48\xaa\x04\xc1\x61\x9f\xd2\x05\x53\x2b\x9e\x3d\xb5\x52\x04\x93\x32\xb7\xba\x6f\x83\x65\xc9\x4b\xe7\xd6\x52\xa4\x53\x8f\xe6\xd6\x33\x42\xcc\x84\xb9\xb5\xb8\x6c\xac\x06\xd3\x8d\xf9\xd6\xe8\xe0\xe8\xb8\xd4\x51\x27\xea\xd8\xaa\x0a\xc2\xc8\x7e\x9b\x00\x20\xa8\xaf\x83\x35\xbd\x5d\x3e\x2c\x17\xe5\x25\xb8\xad\x8f\xe9\x3a\x53\x9f\x4e\xa5\xd1\x73\xcb\x90\x7b\xca\x33\x47\xd6\x5b\xbc\xda\x50\x7a\x7c\xfb\x75\x2c\xd5\x3b\xcc\xd6\x7a\x83\xb0\x55\xfa\xdf\x9a\x5b\x2f\x9d\xdb\x2e\x1c\xcf\xaf\x4c\x61\x58\x96\xaf\x39\xb7\xfe\xc6\x50\x31\x2b\x6c\xfd\x9d\x73\x1b\x7f\xa5\xb9\xf5\x5c\x3f\xeb\xcd\xad\xcf\xda\xeb\xc8\x68\xd2\x6c\xe9\xc5\xb6\x2b\x6f\x2f\x3a\x5e\xc3\x98\xe2\xac\x58\x69\xca\xd5\xea\x72\x56\xa3\xe7\xe6\xda\x5a\x69\xcf\xab\x1e\xb5\xdc\x68\x95\x5b\xad\xb3\xad\xd7\xab\x58\x75\xd8\xa8\x09\xb5\x27\x15\x96\xca\x7c\x6d\xab\x8f\xf8\x32\x58\xe0\xdb\xf2\x9a\x35\x5b\x35\xfd\x85\xcf\x19\xb6\x26\x9e\x70\x7c\x7c\x01\xd0\xfe\xb2\x01\xff\xac\x9f\x53\x7f\xa3\x1f\xc0\xe8\x1e\x46\x5e\x2e\x07\x4f\x0e\x8a\x12\x44\xba\xfd\x7a\x8b\xef\x4f\x90\x86\x30\x41\xbe\x6a\x4a\xd6\x21\xc4\xf1\x17\x22\x5d\xcc\x75\x04\x6b\x1c\xe7\x71\x84\x33\xb9\x8f\xfc\x28\xea\xbc\x0b\xa5\x2e\x96\x2e\x4c\x36\x4e\xb8\xb3\x18\x43\x46\xed\x7a\x6f\x24\x20\x5f\x0f\xe0\x77\x81\xd3\x76\xef\x42\x67\xe3\x9e\xa8\x9a\xeb\x74\xeb\xc9\x82\x9f\xd4\xa9\x09\x7b\xba\x32\x36\x4e\x5d\x57\xb2\x78\x22\x69\x92\xa6\xb0\x95\x5b\xf2\xc4\x15\xd7\xcc\x45\xcd\xeb\x4a\x9f\x44\x26\x4d\xfe\x54\xd6\x32\x35\x10\xbe\xd0\xcf\x13\xc4\xb9\xfc\x2f\xdf\x41\x4f\xee\x3d\x81\x21\x2c\x48\xa7\x1d\x1d\x0c\xa3\x41\xbd\x5d\x45\x24\xdb\x84\x30\x38\xba\x92\xb9\xf1\xee\x22\xbc\x98\x1f\xef\x1c\xeb\x5c\x1c\x25\x8c\xeb\xc0\x3d\x8a\xe7\xb2\x73\x40\x11\xe4\x24\x94\x0d\x84\xf9\x71\x81\xef\x8e\x8e\x9d\x8a\x63\xce\xb9\x09\xf2\x02\xce\x9c\xd3\xb7\x72\xb1\x15\x3d\xb3\x2b\x8e\x1b\xef\xfa\xca\x0b\xf8\x71\x31\xe4\xe3\x28\x72\x20\xd8\xdd\xf1\xd9\x5f\xb1\x43\x3e\x78\x1f\xe7\xe9\x9c\x7a\x5e\xc2\x65\x38\x82\x2e\xc8\xb6\xff\x7b\xb6\x10\xc7\x71\xc7\x60\xde\xf9\x47\x5e\x26\x31\x7b\x38\x68\xe8\x42\x36\x35\x25\x37\x83\x87\x33\xff\xee\x62\xcf\xee\xcc\x60\xda\xbf\x42\xf5\x1a\x7c\x7b\xb8\x82\xac\x27\xb8\xaa\xb3\x24\x89\x17\xc0\xbf\x2d\xf6\x1a\x02\x78\xb8\x12\x6c\xfa\x4c\x11\xc2\x07\x38\x1e\x0b\x11\xb8\x1b\xf7\xdc\xd1\x18\xc0\x71\xae\xf2\xd3\x15\x1d\xb9\xec\xf7\x52\x5d\x87\xd1\x05\x59\xf6\x7f\x39\x13\xe2\x31\x9e\xa3\xe3\x0b\x8b\x2f\x67\xeb\x08\x67\xbe\xe9\x2d\x8e\xc1\xc0\xd5\xcb\x67\x77\xeb\x01\xc7\xf9\x26\x99\x65\x7e\x71\x97\x4a\x9f\xcf\xf0\x31\xb2\x08\xe7\x0a\x8c\xf0\x19\x39\xce\x37\x9d\x41\xf7\x96\xec\xab\xb0\xe7\xa0\xca\xc5\x9c\x7f\x4c\x4e\x22\x6b\xd1\x5b\xbf\x2f\xe5\x2f\x82\x2f\x8b\xc9\xe3\x73\x8a\x33\x39\xbd\x8e\x1e\x43\xd8\xf2\x72\x99\xa9\xcd\xeb\xf0\x96\x8b\xa7\x74\x5e\x22\xd7\xcb\x5f\xc4\x51\x18\x57\xee\x1e\xf5\x4f\x42\x8e\xe5\xef\xe8\xc6\xfc\x8b\x38\x8c\x62\xcb\x37\x6e\x3d\x06\xef\x8e\x0e\x6f\xbe\x3b\x3a\x00\x3c\x41\x88\x2b\xcc\xdb\x1e\x9e\x2c\x8e\x4f\x8c\x8e\x76\x58\xaf\xa6\xdd\x13\x14\x9b\xa9\x37\xf7\xf4\xc1\xa3\xa3\x7f\x0c\x5d\xf4\x6e\x45\xba\x54\xa1\x99\x04\x42\x79\x9a\x7f\x8a\x52\x38\x33\x72\x01\x4f\xe0\xfd\x72\x3b\x48\xc3\x9d\xcd\x71\xcc\x28\x0b\x23\xf4\xa2\xf0\x1d\x3e\x7b\xbb\x3a\x3f\x07\x4f\xc5\x9a\x19\xf6\xef\x80\x32\x18\xf5\x62\xa8\x1d\xca\xbd\x11\x5d\x89\xdb\x38\xd4\x99\xe1\x5b\x5e\x4b\x0e\x20\xbf\xb6\x31\x84\x50\x9f\x13\x6f\x26\xa3\x8b\x5c\x81\x73\x7d\x45\x1f\x5d\xb2\x93\xc9\x7e\xa4\x41\x7e\x61\x02\x77\x1e\x7d\x9a\xfe\x83\xf7\x2a\x65\x49\x12\x80\xcd\x2f\x44\xdc\x0d\x4e\x9f\x26\x4d\xec\x75\x51\x59\x62\xc5\x35\xca\x2f\x9f\x5f\x44\xf9\x34\x99\xf6\x67\xa7\x67\xc9\x91\x58\xed\x0a\xa3\x3e\xfc\x0a\xed\x33\x86\x76\x14\x7b\x6c\x02\x7c\xea\x00\x0f\x23\x0d\xa7\x50\x57\x1a\xe1\x69\x24\xf2\xc8\x90\x91\xd7\xa5\x12\xbb\x9e\xfb\x3a\x46\x9c\x8b\xf7\x6c\x27\x16\x4c\xb6\x3f\xc3\x6c\x8e\xf1\x9f\x9d\xea\xbb\x87\xa9\xfa\x8e\xdc\xaf\x30\x8a\x92\x61\xcc\xcf\xd6\x72\x0a\xce\xcc\x10\xe1\xeb\x57\xff\x3e\xa2\xef\xff\xf9\x0f\x72\x63\x19\x0b\x25\xb0\x9a\x76\x73\x7f\x6f\xc3\x77\xfb\xdb\xb7\x3b\x24\x19\x50\x36\x94\x7c\x80\x6e\x2d\x3e\x19\x54\x32\xd6\xd3\x99\x9d\x8b\x7c\x08\x34\x9d\x81\x10\x68\x84\x85\x6f\xc8\x53\x4d\xe8\x0b\xae\x91\x21\xbf\x10\x82\xc8\xbd\x10\xad\x29\xa2\x1a\x58\x26\xaa\x34\x7e\xcf\x72\xb4\x47\x16\xa9\x74\xfa\x42\xbd\xda\xde\x2f\x01\x21\x7d\xa1\x22\xf4\x85\x76\x49\x18\x44\x56\x45\x9c\xb7\x9d\x36\x32\xea\x96\x77\x26\xd3\x17\xdc\x4b\xb8\x77\x8f\xca\x42\x53\x18\x0a\x48\x89\x1f\x94\xf8\xb2\x90\x7e\x71\x54\xe4\xab\x18\x29\xc5\x5c\x4f\x19\x61\x3a\x19\x8b\x64\x49\x9c\x84\xf5\x13\x2d\x1b\xc5\x2a\xcb\x0b\xf4\x33\x56\x14\x13\x35\xe1\xa5\xb2\xff\xba\x1e\x82\x7c\xc4\x69\xc1\xaf\x12\xa4\x1b\xcc\x69\x1a\x38\x2e\x2a\xfd\x8b\x6a\x48\x60\x26\xac\x8b\x98\x32\xd8\x75\x8d\x22\x5a\xe2\xf8\x5f\x50\x48\xb2\x69\x1c\xd5\x90\xf2\x5a\x47\xd7\xb0\xec\xa9\x09\x07\xbd\x26\xa2\x00\x1b\xec\x4c\x0c\x51\xd6\xcb\x15\x22\x1b\xcb\xd5\x02\xda\xd0\x91\xe1\xff\x05\x00\x00\xff\xff\xd5\x4a\x60\xf6\x0c\x99\x00\x00") - -func asset_stat_trustlines_4HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_4HorizonSql, - "asset_stat_trustlines_4-horizon.sql", - ) -} - -func asset_stat_trustlines_4HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_4HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_4-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x45, 0x56, 0x5c, 0xa3, 0x94, 0x24, 0x8, 0xe1, 0x88, 0xb2, 0x7d, 0xee, 0x23, 0x58, 0xc2, 0xb9, 0xa, 0x93, 0xbb, 0x6f, 0x29, 0x7d, 0xb9, 0x17, 0x3e, 0x6a, 0x66, 0x74, 0x6c, 0xbd, 0xa8, 0x52}} - return a, nil -} - -var _asset_stat_trustlines_5CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xd9\x92\xe2\x48\xb3\xe6\x7d\x3d\x85\xac\x6e\xb2\xda\xc8\x6e\xb4\x2f\x55\x53\xbf\x99\x00\x01\x02\xb1\xef\x8c\x8d\x95\x45\x48\x21\x21\x52\x1b\x5a\xd8\x8e\x9d\x77\x1f\x43\x6c\x02\x04\x49\x42\x56\xf7\x8c\x9d\xd6\x45\x77\x25\x72\x3e\xff\xc2\xc3\xc3\xc3\x23\x42\xb8\xfe\xfc\xf3\xcb\x9f\x7f\x62\x4d\x37\x08\x0d\x1f\x75\x5a\x0a\xa6\x81\x10\x40\x10\x20\x4c\x8b\x6c\xef\xcb\x9f\x7f\x7e\xd9\xdc\x2f\x44\xb6\x87\x34\x4c\xf7\x5d\xfb\x28\x30\x47\x7e\x60\xba\x0e\x26\xfc\xc5\xfe\x45\x24\xa4\xe0\x0a\xf3\x8c\x5f\x9b\xaf\x9f\x89\x7c\xe9\x48\x5d\x2c\x08\x41\x88\x6c\xe4\x84\xbf\x42\xd3\x46\x6e\x14\x62\x3f\x31\xfc\x47\x7c\xcb\x72\xd5\xb7\xcb\x4f\x4d\xcd\x42\xbf\x4c\xe7\x57\xe8\x03\x27\x00\x6a\x68\xba\xce\xaf\x00\x05\x1b\xdc\x4b\x61\xd5\x32\x37\xd0\xc8\x51\x5d\xcd\x74\x0c\xec\x27\xf6\xd2\xeb\x16\xf9\x97\x1f\x7b\xdd\x8e\x06\x7c\xed\x97\xea\x3a\xba\xeb\xdb\xa6\x63\xfc\x0a\x42\xdf\x74\x8c\x00\xfb\x89\xb9\xce\x0e\x63\x82\xd4\xb7\x5f\x7a\xe4\x6c\x75\x41\x57\x33\xd1\xe6\xbe\x0e\xac\x00\x9d\xa8\xb1\x4d\xe7\x97\x8d\x82\x00\x18\xb1\xc0\x02\xf8\x8e\xe9\x18\x5b\x11\xdf\x5d\xfc\x0a\x90\x1a\xf9\x66\xb8\xda\x80\xeb\xfa\x8f\x9d\x01\x10\xf0\xd5\xc9\x2f\x0f\x84\x13\xec\x27\xe6\x45\xd0\x32\xd5\xd7\x8d\xc5\x54\x10\x02\xcb\x35\x7e\x7c\xf9\x52\x68\x37\x9a\x98\x5c\x2f\x48\x43\x4c\x2e\x62\xd2\x50\xee\x74\x3b\x3b\xc9\xbf\x22\xcf\xf0\x81\x86\x26\x66\x10\xc2\x55\x80\x66\x3f\x6e\x4a\x07\xaa\x37\x8b\x5c\x3f\xb2\x83\xfb\x84\x91\x33\xbf\x47\xd2\x42\x9a\x81\xfc\x7b\x24\x37\x3c\x75\x84\xee\x94\xbc\x43\x0c\xa2\x20\x74\x75\x1d\xf9\xa6\xa3\xa1\xe5\x6d\x59\xa0\xaa\x6e\xe4\x84\x10\x58\xc0\x51\x51\xf0\xe3\x8b\xa8\x74\xa5\x36\xd6\x15\x73\x8a\x94\x90\x6e\xd4\x95\x51\x8a\x79\x5d\x7f\x85\xc5\xe8\xf9\x46\xbd\xd3\x6d\x8b\x72\xbd\x9b\xf8\xd2\xa9\xe0\x2f\xef\x0d\xad\xee\xc1\x0f\x97\xef\x43\x1f\x64\x3e\x80\xaa\xa3\x3b\x38\x27\xc5\xee\xc7\xf6\xa3\x20\xb4\x4c\x07\x05\xb7\x90\x0f\x42\x77\xe3\x6e\x58\xa0\x38\x1a\xdc\xc0\x3d\x0a\xdd\x8f\x7b\x70\xf9\x5b\xb8\x07\xa1\xbb\x71\xb7\xf2\xa6\xa3\xbb\x37\x70\x8f\x42\x77\xe3\x7a\x11\x0c\x22\x78\x03\x73\x2b\xf0\x11\x3c\xcb\x0c\x26\xb3\x08\x45\xb7\x2c\x9b\x14\xbb\x1f\x1b\x21\xff\x96\x59\xe3\xfb\x77\xa3\xc5\xc3\xf8\x16\xdc\x56\xe0\x6e\xbc\x6d\x54\x9a\x20\xa0\xdd\x86\x3d\x91\xfb\xcd\xe8\xbb\x48\x89\x66\xbf\xee\x54\x03\x81\x73\x03\x1c\x02\xe7\x6e\xc2\xbb\xe8\x77\x8b\xeb\x5e\xe4\xa3\x98\x9b\x1c\xe0\x7d\xd8\x8d\xd4\x0e\x39\x96\x3d\x07\x4e\x0d\xb9\xb7\x65\x0f\xa1\xf1\x3d\xb1\x63\xa0\x7b\x47\xf2\x10\xb8\x6e\xcb\x1d\x03\xd1\x3b\x72\x87\xc0\xf2\xae\xdc\x5d\xfc\x8e\x01\xe5\xb6\xdc\x36\x48\xbc\x2b\x73\x18\xf2\xef\x48\x6e\xc6\xf1\x6d\x91\xed\xd8\xbc\x2d\x73\x32\x14\x6e\x8b\x42\xe0\xdc\x16\xd8\xbb\xea\x5d\x52\x1b\xcf\xdb\x09\x4a\xc3\xae\x54\xef\xc8\x8d\x7a\x52\xd8\xf2\x8c\x60\x66\xed\x24\x3a\xf9\xb2\x54\x13\x2f\xb0\x7e\x7c\xd9\xe6\xc6\x75\x60\xa3\xef\xfb\xcf\xb0\xee\xca\x43\xdf\x77\x5f\xf9\x81\x75\xd4\x09\xb2\xc1\x77\xec\xcf\x1f\x58\x63\xe1\x20\xff\x3b\xf6\x67\x9c\x32\xe7\xdb\x92\xd8\x95\xf6\xc8\x7b\xbc\x2f\x27\x88\xa7\x37\x77\xc0\xf9\x46\xad\x26\xd5\xbb\x37\x90\xb7\x02\x58\xa3\x7e\x0a\x80\xc9\x1d\xec\x65\x9f\xdf\xee\x3f\x0b\x62\x90\x97\x73\xcd\xfb\xe6\xef\x74\x1e\x2c\xf4\x6e\x7b\x4e\x6c\x59\x6f\x74\xcf\xec\x89\x0d\xe4\x6e\xf9\x40\x2b\x99\xd0\x9e\xa8\x3f\xa2\x9c\x11\xf9\x48\xe3\x2f\x40\x62\x03\x34\x95\xac\x67\x6c\x56\x31\x9e\xef\xaa\x48\x8b\x7c\x60\x61\x16\x70\x8c\x08\x18\x28\x36\xc3\x9d\x09\xf8\x46\x4c\x43\x3a\x88\xac\xf0\x57\x08\xa0\x85\x02\x0f\xa8\x68\xb3\x9a\x78\x39\xbb\xbb\x30\xc3\xc9\x2f\xd7\xd4\x12\x0b\x84\x93\xc6\x26\x1d\x72\xd7\xcc\xd8\x75\x8f\x8d\xdc\x3b\x40\x9a\xc1\xb7\x5e\x9e\x0c\xba\xdf\xbe\x60\x18\xb6\xff\xc4\xd4\x30\x75\x02\x7c\xa0\x86\xc8\xc7\xe6\xc0\x5f\x99\x8e\xf1\x8d\x61\xff\x88\xfb\xa6\xde\x53\x94\xd7\x58\x7a\xf3\x45\x07\xd8\x28\x45\x98\xe7\xd3\x84\xe7\xc0\x8a\xd2\xa4\x09\x82\x3c\x17\xb7\x40\x10\xda\xae\x66\xea\x26\xd2\x30\xd3\x09\x91\x81\xfc\x83\xc8\x97\x3f\xce\xfb\xfe\x30\x8a\x9f\xb4\x45\xf0\x90\x21\x76\x0b\x01\x0c\x9a\x86\xe9\x84\x67\x37\x03\x34\x73\x22\x3b\xfd\x9e\x13\xd9\x41\x04\x91\x13\xfa\x9b\xa5\xe0\x79\x33\xb7\x32\xa6\xa3\x5b\x60\xb3\x62\xd4\x50\x10\xa6\xd3\xd9\x0a\x4e\x5c\x1b\x69\xae\x0d\x4c\x27\x45\x8a\xa6\xcf\x49\x87\x13\x1f\x05\x13\xd7\xd2\x02\x2c\x44\xcb\x73\x66\xba\x05\x8c\x6b\x8c\x6e\xf6\xcd\xce\x22\xd1\x46\xab\x65\x02\x68\x5a\x66\xb8\x69\xdc\xb6\xfd\x7b\x93\x58\xd6\xad\xdb\xa6\xe1\x6c\x72\xa1\x0d\xad\xed\x27\x89\x6c\xe0\x90\x5a\xec\x8c\xfe\x2b\x5e\x56\x63\xf9\xb2\x94\xaf\x62\xdf\xbe\xed\xbb\xe2\x3f\x3f\x31\xfc\x8f\x3f\x6e\x7c\xfb\x9c\xe0\x39\xce\x45\x03\xde\x43\x3c\xe9\xcb\x33\xb4\xd3\x7e\x7e\x0f\xe9\xd2\x3c\x67\x70\x29\xf6\xdb\x62\x5e\x0e\x8c\xcd\xfc\xf7\xe8\x98\xd8\xa4\x8c\xdb\xe1\xe0\xb8\x1a\x4a\x8e\x85\x93\x31\x70\xa9\xf4\x74\x7e\x7e\x54\xfd\x69\x62\xbc\x25\xb2\xfb\x0c\x04\x93\x04\x19\xf6\xc2\xb7\x3d\x1f\xcd\xdf\x15\x82\x91\xfa\x86\x42\xcb\x0c\xc2\x77\x45\x0f\xd9\xf6\xde\xdd\xb7\x1f\xab\x96\x1b\xa0\xd0\xb4\xaf\x8c\xfc\x38\xb0\xa6\x8c\xad\x44\x9f\x9f\x26\xf5\x07\xbc\xb3\xfe\x3e\xea\xb9\xe2\x3a\xd7\xd6\x06\xa7\x30\xc7\x56\x5c\xf3\x96\x5d\xf2\xf5\x68\x8f\xed\x16\x5e\xdf\x0e\x83\x1c\xf9\x77\x46\xd0\xed\xce\x8b\x76\x2d\x82\xc6\xee\x0e\x82\x00\x85\x69\xf6\xdc\x8e\xd5\xab\xb7\x81\xbd\x19\x56\xe9\xd0\x9e\x6f\xaa\xc8\xb9\x12\xc4\xe2\x9b\xd7\x22\x5c\x7c\x13\xd3\xdc\x08\x5a\x68\xe3\x6f\xaa\x19\xef\x48\x7e\x6a\x14\x4d\xf4\xf0\x6e\xc9\xba\x6d\xcb\x59\xbf\xee\x1a\x78\xc5\x37\x76\xdf\xdc\x59\xf8\xec\xab\x7b\xbb\x5f\x73\x88\x6d\xc2\xfe\xa8\x3f\x6c\x97\xf5\x5b\x77\x30\xbd\xb4\x89\x9f\xb9\x18\xb9\xae\x1f\x1e\xac\x51\x90\x8a\x62\x4f\xe9\x62\xf8\xf9\xb4\x89\x96\x21\x08\x43\x64\x7b\x21\xb6\x19\x16\x41\x08\x6c\x0f\xdb\xa4\x4c\x6e\xb4\xfd\x04\x5b\xbb\x0e\xba\x9c\x6c\x75\x60\x5a\x91\x9f\x98\x6a\xaf\x69\x08\x57\x1e\x7a\xbf\x53\xb6\xdb\x12\x09\xdc\xcb\xb0\x7f\xd0\x78\xa5\x77\x76\x3b\x1b\xae\x7f\xde\xa9\xdf\x62\x4b\xfc\x07\xc3\xff\xc0\xc4\x7a\x01\xdb\xfe\xf9\xbf\x7e\x62\x2c\xc3\x50\xcc\x1f\xa9\x7d\x95\x5c\x86\x3d\xdc\x65\xc9\x5d\x9e\x64\xcc\xbd\x62\x8d\xed\x46\xdb\x66\xd4\xa5\x12\xda\xac\x1d\x9f\xa0\x12\x44\x70\x47\xc2\x47\xc1\xc9\x04\x44\xa5\x66\x8c\x3e\x02\x87\xb1\x74\xc9\x27\xb1\xe6\x7d\x94\x53\x62\xb3\xee\x8e\x99\x71\x4b\x6c\x16\xa0\x5b\x33\xcc\x25\xcf\xc4\x1a\xfe\x51\x9e\x47\x88\xfb\x79\x5e\x4c\x72\x67\xf7\x91\x33\x47\x96\xeb\xa1\x77\xa6\xb4\xa3\xea\x27\x26\xa2\xc4\x76\xc7\x13\x26\xd8\xef\xd7\x7e\xbb\xa7\x1f\x8e\x5e\xf4\x9e\x21\x66\x57\x26\x9a\x53\x23\xec\xf7\x81\x4f\x10\xcf\x0d\x71\xa2\xed\xaa\x31\x8e\x7b\x44\x0f\x1b\xe3\xb8\x29\xfe\xed\x38\x6e\x4f\x17\x6f\x29\x63\xea\xd6\xe8\x4e\xec\x70\x3d\xca\x2a\x71\x04\xf0\xc8\xb2\x2b\x9e\xf1\x6f\x44\x6a\x33\x08\x22\xe4\xdf\x0f\xa5\xba\x5a\xea\xea\xf4\xc2\x2c\xa1\x65\xda\xe6\x95\x8c\xe2\xe6\x5a\xf0\x9f\x5c\x55\x25\xbc\x33\x71\xaa\xf2\xd0\x2a\x2a\xf9\xfd\xcf\x5a\x47\x25\x30\x1f\x5f\xff\xdc\x42\xdd\x76\xda\x19\xd2\xae\x27\xff\x93\x3e\xf0\x4e\xb6\x7b\x1f\x76\xf2\xe4\x19\xda\xd6\xcd\xc3\xe5\x49\x28\xbe\x63\xbd\x71\xee\x80\xcb\xf8\x94\xf2\xea\x5d\x75\x02\x1c\x03\xa5\x2e\xec\x93\xc6\x49\x1e\xdb\x3d\x1e\xab\x8f\x7b\xe7\x8f\x9b\xe8\x6f\xb6\x0f\x74\xb5\x55\x9a\x71\xc2\xa5\x8f\x82\xc8\x4a\x8d\xee\xe1\xd2\x46\xef\xae\xe7\x8e\x47\xac\x8f\xdb\xf3\xec\xdc\xe2\x51\xa3\x9e\x9d\x38\x7f\xbb\xcb\x70\xbb\x2f\xdd\xb2\xde\x4e\x24\xcd\x10\xf7\xb9\xdd\xd9\x09\xf7\x23\x86\x2a\x6c\x56\xd6\xba\xeb\xbf\xb3\x19\x8a\x15\xc4\xae\xf8\x8e\xcd\x6e\x43\x06\x1f\xc6\x93\xeb\x1d\xa9\xdd\xc5\xe4\x7a\xb7\x71\xdc\x54\xec\x8b\x4a\x4f\xea\x60\xdf\x5e\x4a\xb9\x76\x73\x54\x96\x15\x32\x2f\x53\xc5\x7a\x8b\xce\x0d\x95\x62\xad\x5e\x50\x8a\x95\x5e\xbd\xd9\x23\xcb\x23\x6a\x5c\x2b\x76\xca\x8d\x7a\x2f\x2f\x35\xc4\xce\x80\x6b\xe5\xb9\xc6\x90\x2c\xbf\xbc\x62\xc2\xf6\xe2\x76\xff\xe7\x71\xfc\x15\x23\x5f\x31\xfc\x75\x6b\x65\xec\xe5\xe5\x15\x7b\x11\x5b\xa2\x28\x8a\x3f\x7f\xbe\xc4\x37\xc8\xfd\xbd\xe3\x7f\xff\xf8\xf1\x1e\xc3\xfc\xb0\x5a\x62\xdb\x75\xba\x51\x97\xa5\x66\xbe\x56\x2f\xe6\x38\x8a\x14\x69\x8a\x1d\x33\xcd\x7a\xa1\xd3\x56\x4a\x83\x2a\x57\xca\x29\xf9\x5a\x4b\x91\x8b\x0d\xba\xc3\x49\xa3\x41\xbf\xb7\x61\xc8\x1f\x99\xf1\x0c\x2f\x08\x14\xcd\x08\xf4\x2b\x46\xdc\xa0\x48\x3f\x44\x91\xa4\x5a\x45\xb2\xdc\x93\x18\x52\xac\x0d\x7b\xc5\x5e\x99\x12\x47\x15\x71\x38\x2c\x0d\x87\x7d\xb2\x5f\x1e\x8e\x46\x6d\x56\x1a\x0d\xa5\x6e\xb3\x5a\x18\x8e\x3b\xe2\x80\xe5\x86\x0d\xfa\xe5\x15\x23\x70\x02\xdf\x5d\x09\x8e\xef\x98\x31\x9d\xe3\x15\xc7\x39\xdf\x70\x7b\xc2\x07\xaf\x6f\xa3\x7d\xd4\x11\x4f\xb7\xd2\x0e\x86\x64\x29\x4d\xe0\x75\x86\x62\x11\x62\x79\x8d\x80\x24\x07\x19\xc8\x0b\x3a\x49\x01\x9d\xa1\x08\x02\x72\x0c\x2b\x00\x92\xd6\x81\x4e\xd0\x38\x05\x34\x1c\x32\x24\x64\x29\x0a\xe2\x1c\x44\x82\xb0\x31\x15\xfe\xe4\xb5\xc1\x60\x38\x12\x90\x88\x22\x75\x9d\xa4\x79\x80\x73\x10\x47\x1c\xae\x6b\x84\xce\x6a\x14\xc1\xab\x84\x0e\x54\x8d\xc4\x21\xab\xaa\x38\xaf\x52\x94\xc6\x70\x1c\x43\x32\x02\xcf\xf2\x04\xc9\x00\x82\x7d\x89\x7d\x0c\xdf\x74\xdc\xff\xb3\x57\x6e\x58\x35\xe9\x55\x76\xd5\xa9\xe6\xb8\x82\x53\x10\xca\x24\xbe\x9c\xe6\x32\x01\x6e\x84\xc1\x42\x5e\xac\x89\xa1\xd6\x19\x8c\x40\xae\x02\x8a\xc6\x46\x5e\xaa\xd3\x0a\x58\x7b\x64\xeb\x5d\xe4\xb1\x38\x24\xe8\x58\x2c\xf7\xf6\x37\x34\xe4\x53\xaf\x97\xb3\xc1\x7e\xc5\x51\x29\x9d\xa2\x81\xca\x03\xc4\x09\x90\x17\x54\x9d\xe3\xa1\xae\xe1\x2c\x09\x18\x16\xd2\x04\x8d\x34\x0d\x0a\x2a\xcd\x30\x1b\x77\x20\x29\x86\x10\x70\x9e\x46\x02\xce\xe3\x2c\x2e\x40\x16\x6d\x1c\xe4\x53\x9c\x9d\x15\x20\x49\x92\x2c\x42\x24\x4d\xd1\x1c\xcd\xf1\x80\xe0\x08\x95\xa6\x55\x9e\xe3\x78\x8d\xd6\x29\x5a\x60\x74\x08\x68\x01\x00\x5e\xa3\x58\x9c\xe2\x01\x85\x10\xcb\xd1\x0c\xd4\x74\x0a\xc2\x97\x38\x26\x13\x0c\x23\x30\x9c\xc0\xf1\xf4\xce\x63\xf3\x64\x73\x3c\x25\xea\x11\xe3\xe2\xb0\xc2\x0d\x68\x67\xd5\x98\xf7\x96\x25\xaa\xef\xb9\x6f\x99\x79\x51\x6c\x84\x79\xa2\x4a\xd6\xb8\x1c\xc7\x8e\x23\xa6\x2c\xa8\x65\x0d\x9f\x89\xc1\x78\x2a\xb4\xd8\x11\xbf\x92\x65\x95\x8d\xc2\x37\x3d\x9b\x6f\x64\x14\x3b\x8b\x57\x61\xa0\xfb\xeb\x66\x2f\xb6\xf0\xb0\xd9\xaf\x99\xf1\xbf\xe4\xc3\x7f\xb6\xe1\x2d\x38\xfe\xbd\x10\x9b\xad\x9d\xef\x34\xf1\xe6\xb4\x43\xb5\x75\x6e\x12\xf0\xcb\xbe\x9c\x33\x48\x83\x5f\x56\xe7\xb3\x46\x23\xeb\x64\x8d\xec\x70\x61\x34\xdb\xd9\x72\x8e\x9b\x21\xc1\x0b\xcc\x4a\x44\xbf\xd5\xcb\x6d\xda\x1d\x96\xa5\xae\xac\xd1\x44\xb3\x5e\x19\x72\x5e\x65\xe6\xe2\xa4\x48\xbb\x19\xc6\x69\x43\x6a\x1d\x2d\x62\x55\x29\x1e\x5d\x90\xd3\xbc\x62\xef\xd1\x05\xbc\xf2\xfb\x5c\xef\x37\x5d\x77\x7a\x34\xcd\x0b\xb4\x4e\xea\x2c\x42\xb4\x4e\x71\xc4\x66\x56\xe2\x58\x96\xc3\x79\x28\x30\x24\x45\xd1\x90\x54\x05\xc4\xa8\x9a\x00\x34\x5d\xe0\x58\x16\x41\xc0\x52\x0c\xd0\x00\xcf\x22\x9c\x53\xf9\x8d\x37\x7e\xc6\xa8\x10\x70\x0d\xd7\x28\x1d\xb2\x02\x03\x39\x84\x53\x90\x51\x49\x0d\x71\x3c\x81\x38\xc0\xf3\x94\xa0\x12\x3c\x24\x35\x5a\xe5\x08\x4a\x87\x24\x22\x39\x9d\xe4\x35\x01\x08\x02\xc9\xb3\xb8\xc0\x52\x2f\xaf\x18\x95\xf0\x68\x66\xef\xd1\x6b\x1e\xf7\x65\xdf\xb1\x69\xa7\x89\x94\x6c\x6b\x34\xeb\xfb\xad\x1e\xa7\x45\x6a\xbb\x2f\x59\xee\xb4\x37\xce\x4b\x6c\xcb\x28\xe5\x21\xb4\x99\xd9\x5a\x5a\x8f\x6c\xb6\x13\x04\xb6\x9a\xb7\xb5\x80\xb0\x7a\x4d\xd0\x9b\x95\x9a\x0e\x5b\x74\xbc\xf6\xda\xe5\x1b\x65\xd0\x50\xbd\xe9\xd6\x73\x62\x8f\x4e\x38\x91\xa2\x54\x9b\xb0\xe6\x4e\xcb\x99\x76\x3b\xd3\xed\xe4\x0a\xd5\x52\x2e\x1b\x46\x7a\x99\xb4\x15\x82\x54\xd5\x7c\xd9\x27\x2a\x0e\xc9\xad\x9a\xf9\x16\x5e\x6f\x72\xa0\x1f\x66\x44\x6e\x98\xa7\x1c\x03\x21\xd7\x60\x16\xa3\x20\xec\x96\xa5\x6c\x10\x55\xb2\xd5\xba\xed\xbd\xb9\xa3\xca\x28\xf6\xd8\x5a\x8a\xc7\x4a\x41\x5a\xaf\xff\x0f\xf0\x58\x9d\x54\x55\x82\xd5\x21\x07\x21\x47\x03\x81\xa0\x08\x9e\xe6\x04\x06\xa9\x0c\xe2\x49\x48\x41\x48\x11\x24\x04\x14\x05\x79\x9e\xc7\x19\x48\x90\x9c\xca\xea\x00\xe2\x84\xae\x41\x95\xa7\x99\x8d\xb7\x7d\x86\xd7\x0b\x04\x49\xb0\x14\x43\x43\x8d\x17\x04\x5a\xd5\x05\x8a\xa7\x54\x8d\x60\x19\x9c\x22\x18\x44\xe9\x3c\xc4\x19\xa4\xea\x2a\xe4\x49\x86\xa5\x11\x45\x6b\x90\x44\x94\x40\xea\x38\xce\x6b\x02\xb7\x89\xc1\x74\xc2\x63\xd9\xbd\xc7\xe2\x66\x8f\x9f\xc3\xa8\xbb\x56\xdb\xa2\xa8\xd9\xaa\x1c\xf5\xe5\x75\x67\xb5\x42\xc3\xba\x1d\x66\x86\xe3\x28\xb2\xeb\x80\x74\xa1\xa1\xcb\x76\xbf\xf7\x26\x0c\xf4\x01\x8d\x0f\x0a\x73\xbb\x57\xa6\x65\x66\xd5\xf0\xda\xb5\x6a\xcd\x31\x06\xb2\xc3\x79\x0c\x55\x31\x57\x4a\xbf\x42\xd3\xb1\x85\x63\x8f\x35\x8e\x16\x67\x45\x8f\x1a\xae\xf0\x59\xbd\xce\x53\xf4\xa8\x99\xed\xc9\x59\xc7\x07\x6a\x63\xe6\x04\xfe\xb8\xcb\x47\x24\xcf\xdb\x8a\x38\x57\x89\xdc\xaa\x2d\x0f\xea\xbd\xf9\xc8\xee\xad\x99\x46\x61\xdd\x1e\xb7\x6a\x7d\x3a\x6b\x2e\x86\x41\x56\x31\xac\x71\xa3\x5e\x0f\xa2\x46\x87\x17\xa7\x63\x14\x7b\x6c\x2b\xc5\x63\x4b\xa9\x29\xc4\xff\xef\x1e\x7b\x25\x67\x4e\x39\xc1\x7c\x22\x03\xbf\x3c\xfe\x7a\x06\xec\xda\xf9\xcc\x73\x98\xe7\x47\x2c\x4f\xa0\x5d\x39\x20\x79\x02\xf1\xca\x51\xc6\x47\xd7\x2f\x89\xe3\x8c\xc4\x52\x7a\xb4\x19\x71\x4d\xb6\xd9\x15\x47\x4d\xba\x38\x1e\xd2\xb5\xf1\x80\x6e\x2a\xd5\x12\x39\x92\xe9\x11\xd3\x61\x7a\xed\xc6\x90\xea\x76\xfa\x5c\x2e\x5f\xec\x0d\x0a\xf5\xd2\x68\xd8\x6a\x6d\x73\xb0\xed\x4a\xa1\x2c\x0d\xaa\xa3\xec\x9a\x31\x16\xd9\x89\x4a\xd1\xeb\x7a\xd4\x1c\xb8\x64\x20\x33\xd3\x20\xc2\x4d\x36\xc3\xac\x7c\x5e\x36\xf1\xa0\xee\x25\xa2\x7e\x9c\xb2\xe4\xe3\x7f\x6e\x46\x96\x64\x72\x6f\x3a\xb1\xd0\xa8\x8e\x9b\x5f\xda\x4d\xa2\xe0\x4d\xd7\xb2\x31\x59\xcf\x58\xb2\x9d\xe5\x65\x8e\x8e\x60\xb6\xe5\x45\xcb\xcc\xbc\x26\x6c\xb3\x74\x55\xe8\xad\xb6\x79\x8f\x71\xf8\x4f\x2e\x06\x5d\x1c\xfe\x2e\x88\xa2\x90\x4f\x0c\xdc\x5c\xa3\xc2\x69\x4a\x1e\x97\x89\xe1\x4c\x0a\x21\x3b\xed\x79\xd9\xc1\xd0\x9c\x75\x06\x4d\x38\xcd\x74\x65\xa6\xdd\x2c\x70\xd2\x3c\x2a\xd8\x6f\xa3\x18\x6e\x24\x80\x51\x69\xfd\x26\xaf\x34\xc1\x28\xfa\x6a\x59\xb2\x56\x85\x5e\x4f\x2c\x80\xd2\xc8\x14\x70\x7e\x35\x2d\xab\x4a\x36\x57\x57\xea\x2b\x57\x92\xaa\x85\x11\x25\x74\x2a\xd3\xd5\xb8\xd3\xf3\xbc\xd2\xac\x55\xab\x96\x47\x42\xde\xf5\x0a\x14\x3f\x6b\xcc\x56\x02\x0f\x1a\x6b\x87\xc9\x2d\x7e\xfe\x3c\x9f\x2d\x3e\xb9\x6b\xa8\xa7\xba\xa6\x76\xda\x35\x85\x82\xed\xd7\xba\x75\x13\x7a\xd5\xd5\x6a\xbc\xa8\x8e\xc9\xf5\xa0\xdf\x12\xbc\x8e\x3b\xca\xe8\xee\x00\x59\xe5\xc6\x74\x41\x6b\x2e\xb3\xb2\xeb\xe2\xa1\x6b\xce\xe3\xe1\x87\x4d\xdf\x64\x67\x14\x95\xd3\x43\x6d\x86\xd7\xc6\x0a\xb9\x5a\x70\x0e\xeb\x17\x96\x85\xa0\x26\x8f\x99\x86\x53\xb7\x0b\x8e\x92\x8b\x48\xaa\x30\xf6\x4b\x46\x60\xae\xe8\x6c\x99\x57\x57\xcd\x56\x2b\x18\xc8\xd5\xd1\xbc\x9d\xe5\x2d\x5a\x6c\x95\x94\x16\x67\x05\xe4\x9c\x9c\xa3\xa8\x34\xcf\x89\xbf\xdd\xf4\xf4\x53\xa6\x6f\x9d\x99\x3e\x3f\xee\x77\xba\xc4\x58\x80\xd3\xf6\xa8\x91\x19\xb7\x74\x63\xea\xc8\xac\x25\x2d\xdc\x15\xca\x8d\x4c\x3d\x72\x1c\xd5\x56\xe4\xb0\xe7\x4c\x8d\x83\xe9\xab\xcf\x9a\xde\xf7\x33\xbd\x1c\x43\x0c\xb9\x51\xa4\xb3\xa4\x59\x69\x75\xa4\xfe\x7a\x31\x1d\xca\xd9\xca\x3a\xf0\xc9\x1c\x3d\xc8\x72\x5c\x38\x97\xb2\xb6\x5f\xe5\xe5\x79\xcf\x61\x33\x3d\xba\x49\x93\xe4\xb2\x4f\x6b\x79\x2e\x53\x25\x7a\x68\xac\xaf\x49\x0f\xb4\x60\x69\x32\xe3\x24\xbf\x51\x28\xec\x4c\x7f\x3d\xc4\xa5\x1d\x55\x3e\x10\xe2\xf6\xc7\x95\xc7\x65\x2f\x2f\x20\x4d\x23\x55\x52\xc3\x79\x8d\xe1\x00\x4f\x43\x06\x22\x40\x31\xa4\xa0\x6b\x2c\x83\x48\x20\x90\x0c\xaf\xb3\x88\xd2\x05\x8a\xa4\x04\x9a\xd6\x71\x1d\x12\xa4\x0e\x79\x4a\x00\x34\x9b\xec\xd4\xb8\x7f\xa4\xf8\x9f\x6a\x7b\xe4\x4d\xb3\x4d\xbb\x50\xc8\x14\xd7\xfa\xb4\x46\xd2\x02\x98\x82\xc5\xd4\x6e\xac\xb8\x8e\xe2\x73\x4e\x75\xbe\x30\x95\xce\x82\xb4\x17\xef\x4d\xb7\x57\x8e\x26\x3f\xdc\xf8\xe3\xf1\xe4\xa1\xf1\x3b\xd7\x06\xbe\x3a\x31\xe7\xbb\x9b\xc9\x6b\x93\x0b\xfe\x57\xbc\xb7\xfc\x75\xf7\x73\xc0\xaf\xdf\x31\x62\xbb\xdb\xfc\x35\x40\xfe\x1c\xf9\x5f\xbf\x63\x5f\xe7\x04\xf1\x17\xf1\x17\xfe\x75\x77\x43\x8d\x7c\x1f\x39\xa1\x12\xe7\xb8\x5f\xbf\x63\xf4\xe9\xe7\xb9\xf8\x99\xb0\xe0\xeb\x77\xec\x7f\x7f\xd9\x2b\xfa\xaf\x2f\x49\xb5\xb1\xe4\x06\x98\x67\x68\x9d\x85\x88\xd5\x69\x96\x64\x59\x5d\xd0\x48\x1d\x21\x06\x87\x80\xa6\x01\x03\x05\x81\xd3\x01\x0b\x04\x8e\x42\x1c\xc5\x69\x1a\x21\xf0\x0c\x50\x21\x25\x30\x84\x20\xd0\x02\xae\xee\x19\x1d\x70\x1d\xb4\x0c\xbf\x7e\x3f\xd3\xb6\x6d\xcc\xa6\xed\x5f\xbf\x63\xf8\xc9\xad\xff\x3e\xfb\x7e\xe0\x00\x6f\xc3\x8b\x41\x02\x64\x37\x69\xb1\x4a\x69\x1c\x47\xd1\x38\xa7\xe3\x50\xa3\x38\x8a\x41\xbc\x86\x93\x00\x50\x00\xd2\x88\x45\x2c\xa0\x55\x96\xd0\x71\x82\x64\x71\x9c\x47\xb4\xca\xa9\x3a\x07\x75\xfc\xeb\x97\x14\x0d\x57\x6c\x80\x74\x8a\x00\x24\x0e\x28\x81\x47\x88\xa3\x54\x44\x92\x24\xc7\x20\xc0\x13\x1c\xc7\xf1\x2c\x04\x2a\x43\xb3\x0c\xab\x53\x94\xa6\xaa\xb4\x4e\xe9\x48\x65\x71\x8d\x61\x34\x4d\x27\x58\x4a\x13\x3e\x6e\x03\xe2\xf5\xf2\x9e\x1b\x85\x5e\x14\x7e\x6e\xdb\x6f\x59\xf8\xd9\x2d\xcf\x8f\x58\xf8\x69\x5d\xbf\xc9\xcb\xfe\xb5\xc1\xbf\x36\xf8\xd7\x06\xff\xda\xe0\x5f\x1b\xfc\x6b\x83\x7f\x6d\xf0\xaf\x0d\x7e\xa3\x0d\xe2\x7f\xfd\x9f\x2f\xff\x7d\xb1\xfc\x4d\x59\x34\x58\x20\x08\x03\xd5\x8b\x7f\x79\x91\x76\xbd\xec\x97\x43\xdb\x35\xe7\xb2\x68\xda\x4d\x3e\x33\xaa\x35\xe9\x61\x3d\x53\x5b\xc3\x29\x31\xab\xfb\xf9\xc6\x88\x53\x42\x39\x9a\x47\xea\x2c\x9b\x97\x43\xa5\x00\xe0\x71\x4d\xba\x5d\x43\xad\x4d\x44\x75\x16\x61\xbe\xde\x67\x27\xca\x20\xe3\x12\x55\x9d\xb0\xe8\xd9\x9b\x35\x25\xe9\xec\xdb\xaa\xd1\xeb\x2e\x32\x4b\x85\x33\x18\xaf\x74\x58\x7e\x55\xcc\x27\xd7\xc4\x8f\x2c\xdf\x72\xa2\xd2\x78\xf3\xf2\x95\xa6\x53\x51\xc6\xb4\x31\x8f\x26\x11\xa3\xe6\x0a\x04\xd9\xac\x92\xf3\x5e\x6d\xc9\x07\xa1\x97\xa9\x1a\x8c\xd4\x35\x6c\x58\xd4\x97\xb5\xde\xc0\x2b\x4c\xab\x7d\x2d\xcb\xf6\xa3\x76\x68\xae\xa6\xb2\xe6\xe0\xb3\x3c\x3d\x10\x2b\xad\x88\xeb\x75\xca\x86\x91\x5b\xe7\x8d\x3d\x9f\xfc\xe8\xc9\xdd\xf0\xdc\x23\x7b\x0e\xad\xfc\xda\xab\xb6\xcc\x2e\xb3\xea\x90\x48\x56\x38\x17\x46\x43\xb1\x25\x68\xd3\x55\xe8\x13\x85\x9a\xae\x28\x40\x37\xdd\x46\x5b\xa2\x2b\xf6\x72\xc8\x77\x8b\xc5\x59\x8b\x5e\x59\x43\x3d\x63\xc1\x37\x38\x0a\xdc\x55\x79\x2c\x54\x8d\xa8\x68\xe4\x7b\x4a\x44\x48\x13\x5a\x16\xd5\x85\x1b\xd3\xa1\x57\x1d\xa3\x55\x0e\x26\xe3\xac\xe5\xcd\xa7\xcb\x46\xc7\x88\xe4\x2a\x3e\x5f\x2d\x2b\xa5\x01\xee\x58\x52\x19\x67\x2c\xca\x1c\x4e\xed\x96\xeb\xe5\xba\x62\x9b\xee\xa9\x73\x58\xa7\x2b\x9e\xbe\x34\xea\x51\x33\xb7\x1e\xd7\xb3\x30\xeb\xe5\xba\x81\xd7\xf2\x9b\x93\x31\xbb\xac\xda\xdb\x9d\xbd\x27\xfc\xed\x60\x6f\x71\xf1\xec\xe9\x43\x7c\x75\x3f\xe6\xbf\xad\x2a\x9b\xb5\x44\xa4\xf5\x33\xa4\xe2\x64\x42\xd7\xec\x49\x93\xa2\xca\xcb\xc4\xaa\xb9\x52\xb9\xaa\x60\xa0\xe2\x3c\x93\xe1\xe0\xb2\xc9\xcc\x56\xf3\xbc\x42\x54\x32\x73\xab\x51\xc8\xd4\xc3\xa0\x8f\xca\xad\x28\x6b\x86\xfd\xb2\x3d\xe4\x85\xd9\xe0\xad\xb4\x74\x41\xb4\xac\xae\x8d\xc5\xd6\x28\x9d\x4a\x77\x25\x44\x4c\xb3\xbe\x94\xc4\x1c\x39\x5e\x98\x4c\x6f\x5a\x57\x94\x0a\xa3\x92\x80\x62\x34\x9b\x65\x47\x84\x0f\x26\x51\x8e\x3f\xee\x94\x8a\x55\x76\x8a\x4c\x6a\x6a\xbb\x32\xdf\x2d\x59\x85\x2c\x32\x54\x8a\x6b\x0e\xc3\x72\xb5\xba\x1e\xf4\xf9\x45\xdf\x1c\xe7\x40\x3e\x62\x14\x26\xde\x13\x1c\xc7\x5f\x4a\xec\xdc\x8a\x67\xfe\x97\x30\x75\x08\x8d\x61\x9b\x95\x38\xb7\xa0\xe0\x4a\x2b\xb3\x18\x75\xf2\xc2\x7a\x38\x1f\xf6\xbb\xd4\xd2\x6c\x9a\xa3\xa8\x03\x89\xc2\xdc\x6e\x29\x88\x4f\xc0\xec\x9f\xc1\xd8\x5d\x80\x7b\x9b\xbf\x6d\xc7\x5f\x81\x6f\x94\x5b\x8d\x0e\xaa\x1b\x55\x33\x3f\xa4\xc2\x6e\x67\x1e\x0d\x27\x2b\x32\xeb\x49\x7c\xb1\x0b\xfd\xb7\xf2\x18\x2f\xea\xfd\xdc\x48\x9c\xbe\x81\x2c\x59\x90\x5b\xd1\xbc\xbf\x10\xf8\x60\xd2\x00\xa1\xb1\xcc\xf5\x54\x51\x94\xd8\x39\x81\x83\x30\x97\x89\x24\xbd\x27\xb7\xf3\x09\x7f\xc8\x1d\xb7\x77\x3e\xec\x5f\x97\x5b\x8a\x29\x31\x75\x5f\x98\x69\xfb\xab\xef\xf4\x98\x4a\xe0\xf7\x20\x39\x28\x5c\xb8\xfe\x9b\x07\x82\xc0\x9b\xf8\x20\x40\x29\x48\x5d\x14\x84\x58\xa7\x50\xc4\xea\x5b\x61\xec\x07\xd6\x41\x5e\x88\x6c\x88\x7c\x8c\xc4\x09\xe6\x1e\x45\xba\xeb\xab\x28\x50\x3d\xd7\xd9\xcc\x67\x16\x88\x1c\x75\x72\xae\x28\xfe\x55\xf5\x5d\x73\x4a\xbc\x57\xb4\x7b\x6a\x31\x48\x6f\xff\x6e\x23\x2a\x34\xed\x78\x8a\x7c\x3d\xdf\x97\x3a\xce\xa7\x5f\x27\x20\xf8\xfa\x7d\xfb\x9b\xee\x2f\x89\x19\xf4\xab\x8e\xd0\x7d\x82\x36\x58\x86\xcb\xc0\x5c\xdf\x29\xee\xa3\x78\x33\xec\x1d\xe1\xfb\xa7\xd7\xf8\xc7\x88\xda\xee\x47\x41\x29\xa6\x78\xfa\x9c\xf8\xfa\x6e\xe3\x95\x9f\x1c\x7c\x74\xb7\x31\xf1\xb3\x83\xcf\x78\xec\x91\x78\xc5\x9e\x79\x24\xf1\xa5\xd7\x29\xbc\xbc\x62\x02\x49\x52\x14\x47\xe2\x14\xcb\x33\x34\xc7\x31\x3c\xce\xc5\x8f\xb4\x11\xf1\x99\xc8\x3d\x4f\x1e\x5e\x7d\x5a\xfd\xc3\xf6\x49\x3e\xb1\x7e\x0c\x03\x90\x12\x78\x04\x69\x80\x78\x81\x63\x58\x8a\x64\x58\x9a\x52\x81\x46\x12\xaa\x40\x23\x82\x82\xba\x8a\x73\x34\xa4\x48\x0a\x21\x9e\x42\x04\x4d\x40\x9d\xc3\x09\xc0\x68\x02\x4e\xeb\xc4\xfe\xd9\xa7\x93\x04\xac\x76\x16\x80\x73\x66\x36\x87\x2b\x78\xa5\xb4\x0a\x27\x8b\x3a\x61\x8d\x70\xb0\xf2\x5c\x42\xa8\x97\x97\x73\x25\xbf\x6a\x30\x61\x4e\x52\xf3\xfd\xf9\xa2\x28\x2c\x28\x23\xf4\x1b\xce\x58\xbc\xe3\xba\xfa\x0c\x9d\x74\x36\x21\x7c\x5c\xff\x28\x9b\x51\xcf\x27\x90\xfb\xf4\x5f\x9e\xe7\xa4\xdb\x5d\x17\x38\x15\xe8\x3a\x80\xbc\x4a\xb0\x38\x49\x01\x8a\xe3\x79\x9a\x60\x19\x15\xe2\x90\xd2\x75\x02\x00\x52\x03\x3a\x8d\xe3\xb8\x8e\x74\x5a\xd0\x48\x02\xe9\x2a\x4f\x73\x9a\x06\x75\x88\xc0\xd6\xee\xe4\xa5\xdd\xff\xa1\x76\x7f\x96\xdd\x79\xfa\xf8\xfd\xd4\xa7\xc8\x9e\xb4\x3b\xd4\x68\x9e\xd5\xa0\xa6\xe1\xa4\x46\xb3\x38\x4f\x70\x2c\x47\xa8\x34\x60\x00\x87\x04\x8d\x45\x3c\xcb\xa8\x80\x14\x54\x48\x13\x88\x25\x35\x0e\x00\x9d\xc3\x41\x7c\x08\x00\x29\x56\x43\xbb\x27\xa3\x6e\xda\x3d\x1f\xb9\x94\x1b\xd2\xcc\x2c\xdf\x94\x96\x5e\x2b\x4b\xb9\xe5\x7a\x66\x4d\x70\xed\x95\x19\x10\x96\x5e\x2b\x8e\xec\xd6\xc0\xf0\xa3\x4e\xa6\x1b\xcb\x57\x7a\xf9\xcc\xae\x51\xe7\x09\xdd\xfd\x76\x2f\x3c\xa7\xbf\xa1\x3e\xa6\xff\x5e\xbb\x33\x08\x02\x9a\x10\x18\x4d\xe5\x29\x92\x25\x18\x5e\x65\x34\x9e\x53\x59\x9a\x00\xa4\x4e\x70\x80\x02\x24\xc7\xea\x3c\xcf\x0b\x2a\x01\x34\xc4\xd3\x90\x51\x59\x1c\xd2\x2c\xc9\xf2\x34\x54\xf1\xdd\xf3\x3d\x97\x76\xff\xc4\x76\x27\x12\xaf\xfb\xed\x2e\x3d\xa7\xbf\x46\x3f\xa6\xff\xe6\xe1\x65\xfa\x6f\x77\x3e\x3e\x61\xfc\xee\xd9\xa2\xa4\xf0\xe5\xd6\xbc\xf5\x06\xab\x64\x59\xa4\x06\xfd\x69\xdb\xaf\xda\xd3\x21\x8e\xeb\x25\x3e\x50\x64\xce\xc6\xa5\xf6\xa2\x32\xc8\x8a\x43\x4a\x3c\xa4\xfb\x62\x9a\x95\x2e\xac\xf6\xc1\x74\x3f\xdf\x17\xe7\xc9\xc7\xac\x73\xdb\xa8\x14\x77\xca\x68\xda\x52\x9b\x5d\xb2\xc4\x4c\x66\x4e\xce\x36\x4a\x25\x64\x08\x15\xde\xa2\x55\x42\x72\x7a\xd6\xf2\xcd\x92\xac\xb2\x10\xcc\xc6\x3e\x2e\x70\x44\x91\x6d\x28\x03\x1d\x65\x6d\xfa\xcd\x2b\x86\x72\x26\x90\x71\x93\x98\x29\x66\xc8\x88\x78\x65\x35\x70\xe0\x64\xa4\x0c\x18\x77\x93\x1b\xbc\x90\x6b\xbb\x11\x56\xd9\x8a\x36\xa8\x59\xe3\xc2\x2a\x94\x55\xab\x21\x71\x59\x51\x53\x6a\x53\xce\x6d\x4e\x5a\x50\x58\x94\x2c\xb2\xd5\x5d\x1e\x4f\xe4\x6f\xd8\xe0\xe8\x19\x27\xa7\xc3\x09\xd9\xed\xe3\x8f\xe2\x3f\x17\xa5\xc5\x4f\x98\x25\x8a\xdd\x41\x2e\x78\x42\xbf\x78\xa6\x3f\x4f\x44\x39\xad\xec\x76\x23\xa3\x36\x6f\x85\x05\x2e\x37\x91\x15\xaa\x8e\x04\xad\xdf\xd4\x4b\x72\xa6\x62\x32\x95\x79\xaf\x91\x19\x8b\x21\x17\xdb\xef\x99\x68\x9d\x16\x2d\x7f\x77\x6a\xf0\xf8\x20\xbb\xb1\xa6\xde\x5e\xfe\xac\xce\x2a\xa8\x01\x8c\xe9\xb2\x06\x7a\x4d\x81\xcd\xad\xf5\x40\x40\xb8\xea\xfa\xf5\xf1\x70\x9d\x1b\x54\xde\x8a\x6e\x75\xbf\x66\xbe\x35\xc8\x72\x76\xd5\xeb\x18\x73\x7f\x51\x6d\x90\xf8\x30\xdf\xd0\x47\xfa\x30\x28\x49\x52\x2f\x5c\x8c\x00\x90\xf4\x59\x27\x62\x57\x76\xc5\xb6\x0a\x36\xc8\xc8\x43\x56\xe6\x64\xc3\x80\xbd\x71\xcd\x55\x5b\xda\x58\xa0\xe5\x9a\xa8\x57\xb5\x96\x58\x9f\x0d\xa1\xdc\xe0\x56\xc1\x02\xa1\x5a\x7e\x33\x10\x32\xc3\xd5\x3c\xe3\x4f\x73\xa3\x7c\x63\x8a\xe4\xd6\x60\xa8\xe4\xd7\xd9\xe5\xcc\x24\xe7\x2d\xb1\x90\x11\x2a\xf8\x84\xe3\x27\x65\x0a\x66\x32\xee\x81\xd8\x3f\x3f\xc8\x9e\x75\xf2\x27\x07\xd9\x8c\xcb\x76\x0b\xea\x67\x0e\xb2\xbf\x31\x25\xba\x6b\x90\x7d\x72\x1e\xf8\xf8\xc6\xd5\x8d\x99\x6c\x14\xff\xdd\xef\xd7\x77\x39\xc6\x07\x22\x15\x95\x3d\x5c\x47\xbc\xd2\x41\x7f\x2b\x27\xbc\xd9\xd5\x01\x39\xa3\xe6\x5c\x4b\x5f\xf1\xcd\x1a\x7a\x93\x20\xd1\xed\xca\x8c\xb9\x9c\xbd\xc9\x78\xce\x35\x86\x7e\x23\xe4\x8c\x06\xc1\x92\x2d\xf8\x36\x21\xb5\x4e\xb7\xa7\xa3\x82\x3b\x57\xf1\xa6\x08\xf4\x49\x61\xb8\x0c\x27\x7d\xd1\x0a\x94\x68\x6a\xe5\xec\xd5\x34\x27\x8e\xe2\x41\x31\xef\x4d\xc2\xb9\x26\x86\x6d\xc3\x18\x8e\x97\xcb\xea\xc0\x61\x35\xe8\x8e\x55\xd7\x5b\xe1\x65\x5b\x19\xce\xe6\x6a\x55\xc9\x30\xb0\x1e\x1e\xfd\x2b\x7d\xc0\x8d\x4e\x3b\xf5\x64\xc0\xc5\xb6\xdb\xe6\x7e\x8b\xa3\xd4\x03\x01\x69\xea\x1c\xfb\xe2\xca\x75\x65\x1d\x74\x32\xe0\x3f\x45\xff\x95\x60\x73\x8f\xfe\xdf\x92\x0b\x5f\x5e\x7f\xdb\x1a\xe4\xa3\xb9\xb8\x78\xd4\xdf\x7a\x44\x7f\xb1\xdf\xc3\x77\xe0\xca\x80\x2e\xe2\x68\xd2\x60\xc5\x95\x90\xc7\x9b\x41\x49\x32\xe6\x2a\xc1\x11\x44\x4f\xe0\x47\x53\xda\x56\xde\x6c\xa1\xc5\x31\x6f\x79\x6a\x9e\xe8\x8a\xe3\x80\x5b\x9c\xdb\xef\xae\x80\xf4\xc9\x0b\xa4\xff\xf1\x3b\xe9\xdb\x80\x31\xf4\xbd\x9c\xa5\xad\x0a\x95\xc9\xa0\x36\x1c\xe9\xa5\x16\x50\x96\x68\xea\x3a\x90\x36\x2b\x0b\x40\xb9\x1d\x62\x69\x84\xa5\x8a\xdb\x49\x50\x4d\x0f\x46\x67\x1d\x7a\x25\x18\x25\x3d\xf6\x91\x60\xd0\x38\xf6\x43\xe2\x04\x20\x79\xdd\x0e\x06\x9f\xa8\x3f\xff\xb8\xfe\x8b\x0d\x91\xbf\x31\xc5\x16\xd3\x16\xe6\x1f\xd5\x0f\x44\xb5\xf7\x84\xfe\xda\xb9\xfe\x27\x37\x06\xae\x4c\x0e\xbf\x6f\x63\xa2\x51\x34\xe4\x07\xf5\xdf\xdc\x98\xb8\x51\x04\xe3\xa3\xbb\x13\x67\x85\x30\xf6\x71\x34\xb9\xbd\xb0\xfd\x3d\xec\x71\xac\xa6\x04\xe2\xeb\x28\x87\xf5\xd3\xf6\x57\xb4\x17\x28\x57\x0b\xf7\x5e\xd6\x33\x3f\x14\x2c\xde\x17\xcb\x78\xa7\x99\xc9\xc2\xea\x71\x39\xf5\x04\x62\x7c\xae\x23\x16\x0a\x29\x25\x46\x0f\x0a\xb1\x66\x5b\xae\x89\xed\x11\x56\x95\x46\xd8\xb7\x43\xf5\xa5\xd7\x43\x69\xdf\xab\x85\x76\xcf\x4a\xbc\x7f\x16\xf1\xe0\x06\xeb\xe0\x16\xe5\xb4\xc2\xa7\xc7\xaa\xf6\x4f\xd3\x83\xc0\x49\x63\xb6\x57\x70\x4a\x6a\x5b\x6b\xed\x76\x55\xd4\x9b\xe5\xfc\x9f\xa6\x7b\x02\x9e\x46\xfc\x86\x76\xac\x57\x97\x5b\x3d\x09\x3b\x16\x60\xf9\x50\x4b\x3e\xc7\xde\x1f\x6c\xc0\x65\x1f\x1c\x0b\xc5\x5e\x29\x72\x7a\xf2\x12\x88\xa7\xf9\x6e\xc1\xd2\x88\x26\xd4\x9c\x32\xdc\x95\xde\x4c\x2f\xb9\x99\x7c\xe3\xc5\xd3\xe4\x62\xac\x34\x6e\x47\x25\xa7\xd4\x4c\xef\x35\x2e\xc4\x79\xb3\xc4\x64\xca\x9b\x3e\x9e\x67\x9a\x80\x4c\x25\x7c\xae\x32\xad\xd3\xaf\xd4\xa1\x3c\x79\xdf\xc9\x67\x30\x0d\x22\x78\x85\xe3\x5e\xcd\x29\xbb\xb8\x84\xe5\x8d\xa2\x94\x17\x2f\x79\x79\x9a\xe4\x11\x30\x8d\xe8\x99\xba\xbb\x62\x58\xe2\x57\x4a\xe7\xaf\xba\x79\x9a\xed\x11\x30\x8d\xed\x99\xba\x53\xb6\xfb\xd2\x8e\x37\x4a\x27\x5e\xbc\xf2\xe7\x79\xbe\x07\xc0\x54\xbe\xa7\xea\x4e\xf9\x1e\xaa\x2f\xde\xa8\xaa\x78\xf1\xee\xa3\xa7\x09\x1f\x01\xd3\x08\x9f\xa9\xbb\x9a\x1a\x6c\xab\x2a\xbe\x1e\x4b\x26\xde\x2c\x9b\x97\xf2\x6e\xa8\xe7\xdb\x91\x80\x4c\x6d\xc9\xb9\xca\xb4\x28\x11\xa0\xd9\xeb\xbe\x4e\xdc\xf5\x92\x76\xe7\xef\xcc\xfa\x04\xee\x37\x89\x3f\xc5\xfa\x2c\x45\x4d\x7b\x93\xd8\xd3\xfc\x4f\x41\xd3\x1a\x91\xa2\xf6\x6a\x4b\x92\xe5\xe6\xae\xa5\x9a\x87\xb7\xac\xed\xb8\xc7\xef\x64\xbb\xaf\x10\xde\xf6\xf5\x6d\x67\x38\x58\xa3\x7e\xcc\x62\x7b\x1d\xb9\x5e\xc2\x60\xe8\x23\x84\xed\xab\x5e\xfe\x81\x0d\xca\x52\x5b\xc2\x92\x55\x30\x0f\x55\xc3\xf0\xcb\x44\xf3\xf4\xc5\x71\x8f\xb2\x3c\x85\xd9\x90\xdc\xe5\x29\x27\x14\x93\xa5\xd0\x5f\x93\x85\xcf\x5f\xb7\x05\xc9\x2f\xd8\x1d\xdf\x7e\xf7\x28\xb1\x03\xc2\x86\xd3\x71\x60\x9c\xd0\xba\x9e\x2a\x9e\xbc\xa7\xef\x19\x0a\x7b\x90\x2d\x8b\x44\x80\xb9\x93\xc8\xc9\xab\x05\x1f\x25\x92\x04\xd9\x10\x39\x4d\x84\xef\x64\x72\xf2\x3a\xc4\x47\x99\x24\x41\x36\x4c\x12\xbf\x05\xbf\x9f\xc6\xc9\x2b\x1c\x9f\x60\x92\xc4\xd9\x91\xd9\x67\x09\xa7\x64\x92\xe5\x8e\x6f\x85\xaf\xe7\x18\x9d\x03\x6d\x28\x9d\xc5\xc6\x77\x6d\x74\xed\xcd\xa5\x98\xea\xda\x9e\x85\x42\x14\xab\xfd\xbf\x01\x00\x00\xff\xff\x0c\x68\x1a\x36\xe6\x74\x00\x00") - -func asset_stat_trustlines_5CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_5CoreSql, - "asset_stat_trustlines_5-core.sql", - ) -} - -func asset_stat_trustlines_5CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_5CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_5-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe6, 0xc8, 0xbd, 0xe2, 0xaf, 0x2b, 0x28, 0xf7, 0x7e, 0xb, 0xc5, 0x83, 0x49, 0x5c, 0x39, 0x79, 0x1f, 0xfb, 0x87, 0x13, 0x10, 0xe8, 0xe1, 0x5, 0xad, 0xe5, 0x1d, 0xd3, 0xce, 0x8c, 0xf, 0x3e}} - return a, nil -} - -var _asset_stat_trustlines_5HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x79\x6f\xe2\x48\xf3\xf0\xff\xf3\x29\xac\xd1\x4a\x99\x51\x32\x13\xdf\x47\xe6\x99\x95\x0c\x98\x23\x01\x73\x27\x90\xd5\xca\x6a\xdb\x6d\xe2\x04\x6c\xe2\x83\x84\xac\x9e\xef\xfe\xca\x17\x18\xe3\x8b\x63\x66\x9f\x57\x3f\x6b\x34\x0a\xb8\xba\xae\xae\xea\xaa\xae\x6e\xba\xbf\x7d\xfb\xf4\xed\x1b\xd2\x33\x6d\x67\x66\xc1\x61\xbf\x8d\xa8\xc0\x01\x32\xb0\x21\xa2\xba\x8b\xe5\xa7\x6f\xdf\x3e\x79\xef\x6b\xee\x62\x09\x55\x44\xb3\xcc\xc5\x16\x60\x05\x2d\x5b\x37\x0d\x84\xfb\x4e\x7f\xc7\x62\x50\xf2\x1a\x59\xce\x24\xaf\x79\x02\xe4\xd3\x50\x18\x21\xb6\x03\x1c\xb8\x80\x86\x23\x39\xfa\x02\x9a\xae\x83\xfc\x44\xd0\x1f\xfe\xab\xb9\xa9\xbc\xec\x7f\xab\xcc\x75\x0f\x1a\x1a\x8a\xa9\xea\xc6\x0c\xf9\x89\x5c\x8c\x47\x75\xf6\xe2\x47\x84\xce\x50\x81\xa5\x4a\x8a\x69\x68\xa6\xb5\xd0\x8d\x99\x64\x3b\x96\x6e\xcc\x6c\xe4\x27\x62\x1a\x21\x8e\x27\xa8\xbc\x48\x9a\x6b\x28\x8e\x6e\x1a\x92\x6c\xaa\x3a\xf4\xde\x6b\x60\x6e\xc3\x1d\x32\x0b\xdd\x90\x16\xd0\xb6\xc1\xcc\x07\x78\x03\x96\xa1\x1b\xb3\x1f\x21\xef\x10\x58\xca\x93\xb4\x04\xce\x13\xf2\x13\x59\xba\xf2\x5c\x57\xae\x3c\x61\x15\xe0\x80\xb9\xe9\x81\xf1\xed\x91\x30\x40\x46\x7c\xa5\x2d\x20\xad\x3a\x22\x4c\x5a\xc3\xd1\x10\xe9\x8a\xed\x69\x08\xff\xfd\x49\xb7\x1d\xd3\x5a\x4b\x8e\x05\x54\x68\x23\xb5\x41\xb7\x87\x54\xbb\xe2\x70\x34\xe0\x5b\xe2\x28\xd6\x68\x17\x50\x52\x4c\xd7\x70\xa0\x25\x01\xdb\x86\x8e\xa4\xab\x92\xf6\x02\xd7\x3f\x7e\x07\x41\xc5\xff\xeb\x77\x90\xf4\xec\xea\xf7\x09\x18\x50\x3b\x5c\xba\x80\x41\xcf\x90\xf3\x88\xc5\xa0\xb6\xc8\x7d\xf0\x96\x58\x13\x26\x31\xc8\x10\xad\xcf\x95\x04\x35\x0d\x2a\x8e\x2d\xc9\x6b\xc9\xb4\x54\x68\x49\xb2\x69\xbe\xe4\x37\xd4\x0d\x15\xbe\x4b\x31\xe1\x0c\x1b\xf8\x86\x6e\x4b\xa6\x21\xe9\xea\x21\xad\xcd\x25\xb4\xc0\xa6\xad\xb3\x5e\xc2\x13\x5a\x6f\x39\x39\x89\x8b\xc3\xda\xce\xa1\x3a\x83\x96\xdf\xd0\x86\xaf\x2e\x34\x94\x83\x44\x88\x35\x5f\x5a\x70\xa5\x9b\xae\x1d\x7e\x27\x3d\x01\xfb\xe9\x48\x54\xa7\x63\xd0\x17\x4b\xd3\xf2\xdc\x31\x1c\x53\x8f\x45\x73\xac\x2e\x95\xb9\x69\x43\x55\x02\xce\x21\xed\x23\x63\x3e\xc2\x94\x42\xbf\x3c\x82\xe9\x78\x4b\xa0\xaa\x16\xb4\xed\xfc\xe6\x4f\x8e\xa5\xfa\x71\x47\x9a\x9b\xe6\x8b\xbb\x2c\x01\xbd\x2c\x62\x29\x80\x02\xba\x75\x20\xe2\x68\xd0\x2d\xdd\xc0\x1b\x27\x34\x0d\x5a\xe5\x40\x23\xf4\x47\x34\x09\xd5\x5a\xae\x91\x3f\xb4\x1e\x40\x24\x3e\x14\x17\xb5\x58\x7a\x0d\x9e\x9c\xc2\x1e\xb0\x77\x06\x20\x79\x5d\x68\x46\x4f\x1b\x4f\x2f\x03\x6c\x06\x7c\x98\x85\x80\xba\xed\x48\xce\xbb\xb4\x2c\x46\xe9\x41\x9a\xcb\xb2\x90\xb0\x2c\x58\x14\x4a\xf2\x81\xe5\xc8\xdd\x0b\xc1\x8a\x47\x31\x79\x5d\xae\x33\x83\x18\xe9\x69\xdb\xb6\xdd\x22\xca\x1b\x60\xc5\x54\xe1\x81\x79\xc1\xc6\x0c\x96\xc0\x72\x74\x45\x5f\x02\x23\x37\x78\x17\x35\x95\x96\x07\xe6\x26\x9b\x88\x76\x28\x07\xe9\x0d\x0f\xa6\xef\x2b\xaf\x0c\xbd\x00\xf0\x97\xe3\x0f\x3a\xd3\xeb\xc9\xf0\x4f\x2f\x3e\x44\xa9\x9f\x6f\x0c\x52\x49\x0e\x66\xa6\xb5\x94\x16\xfa\x2c\x4c\x18\x72\x58\x48\x40\x96\x96\xf1\xf0\x7c\x2f\x0f\x73\x59\xe3\x0c\x5a\x57\xbb\xed\x71\x47\x44\x74\x35\xa0\x5c\x13\xea\xfc\xb8\x3d\x2a\x89\x3b\xc3\xe8\xce\x80\x39\xec\xee\x7c\x4c\xfe\xa7\xf2\xe2\x47\x51\x7a\x28\xf4\xc7\x82\x58\x3d\x42\x67\x5e\x9e\x6d\xc3\xd7\x83\x29\xef\x20\x29\xdd\x5a\x85\x25\x61\xb7\xd9\x6c\x69\x09\x33\xbc\xfe\x10\xf9\xd2\x51\x94\x6b\x1b\xe6\x7d\xe5\x80\xc3\x24\xaf\xb4\x6c\xe1\x08\x70\x88\x2c\x41\x93\x92\xb0\x61\xfa\x57\x9e\x9f\x28\x5f\x2c\xc3\x51\x62\x0c\xc9\x07\x8e\x0d\x09\x21\x20\xdf\x68\x0c\x84\x06\x3f\x4a\x01\x5e\xe8\xde\x8c\x43\x57\xe0\x17\xc3\x5d\x40\x4b\x57\xfe\xfa\xfb\x6b\x89\x56\xe0\xfd\x88\x56\x73\x60\x3b\x5f\x80\xb1\x86\x73\xbf\x14\x53\xa2\x85\xa6\x5b\xa9\x4d\xea\x63\xb1\x3a\x6a\x75\xc5\x1c\x79\x24\x30\x9b\x6d\xb9\xbb\x42\xf6\x18\xcd\xc1\x11\x49\x77\x02\x0e\x4f\x56\xbf\xf9\x96\xf9\x2b\xe4\x10\x41\x7c\xd1\x4b\x60\x10\x26\x23\x41\x1c\x26\x50\xcc\x97\x33\xfb\x75\x1e\xd9\x62\xb5\x29\x74\xf8\x3d\x0a\x3f\x3e\x05\x55\x38\x11\x2c\xe0\x4d\xf4\x1d\x32\x5a\x2f\xe1\x4d\xd8\xe4\x07\x32\x54\x9e\xe0\x02\xdc\x20\xdf\x7e\x20\xdd\x37\x03\x5a\x37\xc8\x37\xbf\x38\x57\x1d\x08\x5e\x7f\x85\x98\x23\x7c\x9f\x76\x30\xee\xbe\x0c\x11\x57\xbb\x9d\x8e\x20\x8e\x72\x30\x07\x00\x48\x57\xdc\x45\x80\xb4\x86\xc8\x45\x54\x76\x8b\xbe\xb3\x7d\x24\x17\x49\xca\x91\xf8\x21\xcd\x8d\x86\x0a\xe5\xd9\xd1\xa5\xd8\x1d\x25\xf4\x89\x3c\xb4\x46\xcd\x0d\x5b\xf1\xfa\xdb\x0e\xf9\x2d\x96\x04\x23\x87\x08\xbf\x87\xc4\x57\x40\xaf\x7d\xbd\x9c\x0d\xfb\x6d\x64\x69\x99\x0a\x54\x5d\x0b\xcc\x91\x39\x30\x66\x2e\x98\x41\x5f\x0d\x25\xeb\x85\x71\x76\x8b\x0d\x2d\x64\x3f\xb2\xd5\x2d\xff\x51\xdf\xa6\xe9\x72\x63\xd9\x85\xf8\x91\x81\x30\x1a\x0f\xc4\x61\xec\xbb\x4f\x08\x82\x20\x6d\x5e\x6c\x8c\xf9\x86\x80\xf8\xd2\x77\x3a\xe3\x60\xbc\x1b\x8e\x06\xad\xea\xc8\x87\xe0\x87\xc8\x1f\xd2\x1f\xc8\x50\x68\x0b\xd5\x11\xf2\x07\xe6\x7d\x4a\xf6\x46\xa1\x23\x9e\x26\x5d\x11\xfa\xb3\x09\x87\xa7\x09\x57\x66\xa4\x3a\x4d\xbe\x12\x14\x36\x22\x6e\xbe\x3a\x4a\xc2\x2f\x9f\x10\xa4\xca\x0f\x05\xe4\xa1\x29\x88\xc8\x1f\xd8\x5f\xd8\xdf\xd7\x7f\x60\x7f\xe1\x7f\xff\xf9\x07\xee\xff\x8d\xff\x85\xff\x8d\x8c\x82\x97\x88\xd0\x1e\x0a\x9e\x52\x04\xb1\xf6\x35\x55\x33\x25\xe2\xc0\x89\x9a\x29\xa6\xf0\xab\x35\xf3\x9f\x63\x34\xb3\x1f\x53\x43\x3d\x6c\xe2\x70\x39\x45\x6c\xc3\xf6\x1e\x46\x9f\x63\x04\x19\x7a\xba\x42\x7e\x6e\x47\x80\xab\xe0\xeb\xd1\xb4\x27\x20\x3f\xe3\x1e\xf1\x35\xcd\x6b\xcf\xca\x63\x12\x61\x82\xc5\xc8\x8d\xcb\x73\x98\x9a\x02\x9d\xca\x65\x1a\xd2\x04\xa7\x3b\x0e\xb9\xcb\xee\xd6\xca\xf6\xb9\x4d\x4b\xf3\x4e\xe6\x36\x05\x69\x92\xdb\xb8\x93\xe4\x72\xeb\x45\x2e\x15\x6a\xc0\x9d\x3b\x92\x03\xe4\x39\xb4\x97\x40\x81\xc8\x4f\xe4\xe2\xe2\xc7\xee\xdb\x37\xdd\x79\x92\x4c\x5d\x8d\x2d\xa5\xed\xc8\x1a\xcf\x7f\x43\x11\x7d\x07\x2b\x27\x5e\xe0\x8b\xf1\xc9\x77\x20\x91\xae\x22\xb2\x3e\xd3\x0d\xc7\x4f\x0c\xc4\x71\xbb\x1d\x88\x03\x16\x5e\x1a\x8f\x28\x4f\xc0\x02\x8a\x03\x2d\x64\x05\xac\xb5\x6e\xcc\x12\x60\x86\xbb\xd8\xa4\xfc\x88\x6e\x38\x70\x06\xad\x04\x88\x36\x07\x33\x1b\xb1\x17\x60\x3e\xdf\x27\xe3\x98\x8b\xf9\x3e\x91\x2f\x38\x45\x7d\xdd\x40\xee\x77\x7b\x72\xde\x70\xac\x3a\x92\xd5\x8e\x8d\x4a\x1c\xf8\xbe\xa7\x90\xe5\x72\xae\xfb\x35\x7b\xc4\xd1\x17\xd0\x76\xc0\x62\x89\x78\x7d\xe6\x7f\x44\x3e\x4c\x03\xee\x33\x9a\x35\x2b\x8a\xf2\xd1\x70\x3a\x55\x8e\xe7\xcd\xe4\x2b\x03\x6b\x68\x86\xfc\x60\x14\x64\x74\x98\xff\x45\x4b\xac\x0e\x04\x3f\xfd\xaa\x4c\xc3\xaf\xc4\x2e\xd2\x69\x89\xf7\x7c\x7b\x2c\x6c\x3e\xf3\x93\xed\xe7\x2a\x5f\x6d\x0a\x08\x56\x24\xcc\xd1\x6a\x4f\x22\xda\x33\xc5\xb0\xe8\x81\x18\xf0\xdd\x59\x81\xf9\x97\x8b\x0c\x89\x2f\x6e\x6e\x2c\x38\x53\xe6\xc0\xb6\xbf\x26\xbb\x2b\x58\xab\x48\xb1\x2d\x9a\xfc\x9a\xd3\x51\xc1\xdc\xf8\x64\xc9\x82\x8a\xce\x46\xae\x74\xcf\xd8\xd6\xea\xd2\xd9\x4c\x05\x57\x4c\x35\x0d\x1c\xc3\xd3\xc1\x83\xf2\x5f\x4a\x03\x8a\xce\xf3\xb0\xf4\xf2\xc2\x99\xcc\x36\x8e\xf3\xb7\x19\x6d\x9e\x20\x48\xf7\x41\x14\x6a\x48\x65\x5a\x20\x51\x50\xa1\xcb\x17\x68\x83\x2b\xf1\xfa\xbb\xae\x66\xf1\x16\xd5\x7c\x4e\xb5\xba\x10\x4f\x68\x76\x09\x9f\x91\xb2\x46\xfa\xfd\x12\x57\x16\xe4\x67\x7f\xe1\xe3\x73\x86\x35\xfb\x76\x9c\xfe\x4a\x85\x0e\xd0\xe7\x36\xf2\x6c\x9b\x86\x9c\x6d\x6c\x51\xa1\xec\x54\x3d\x84\x78\x42\x3d\x44\xeb\xd6\x19\xbc\xc5\x16\x93\x4b\x79\x61\xda\x3a\x76\x7a\xc3\x50\x2d\xb1\xca\xa8\xdf\x11\x1b\x3e\xa2\x51\x0e\x4d\x50\xd8\x76\x44\x39\xf8\xcd\x62\x72\x22\x30\x99\xae\xb3\x8d\x4d\xc9\x36\x16\x04\x4e\x61\xa3\x00\xd6\x5d\xaa\xa5\x61\x37\xa6\x13\x7e\x4c\xac\xb3\xef\xc9\x82\xed\xe5\x03\x0e\x98\x4b\x8a\xa9\x1b\x76\xba\x0d\x6a\x10\x4a\x4b\xd3\x9c\xa7\xbf\xf5\x57\x3e\x35\x98\xd5\xd7\xfe\x6b\x0b\xda\xd0\x5a\x65\x81\x78\x79\xa8\xf3\x2e\xf9\x69\x92\xfe\x91\x05\xb5\xb4\x4c\xc7\x54\xcc\x79\xa6\x5c\xc9\x3e\x8a\x8c\x05\x02\x15\x5a\x7e\x7a\x11\x7c\x6f\xbb\x8a\x02\x6d\x5b\x73\xe7\x52\xa6\xa1\x84\x82\x03\x7d\x0e\xd5\x6c\xa8\x6c\xb7\xca\xa8\x5d\x9f\xea\x65\x19\xeb\x21\x05\x31\xaf\xfc\x68\x53\x3c\x7e\x1d\x2a\xf2\x79\xc3\x58\x2e\x8d\xdf\x15\xd6\x0e\x12\xf4\xc4\x30\x97\x4b\x6b\x3f\xec\xa5\x83\xe7\x84\xc1\xd8\xca\xce\xd9\x6c\xb3\x68\x9a\xb3\xbb\xab\x2a\x63\x2a\xe4\x65\xfe\x4a\x20\x8a\x1f\x01\x4f\x0c\x80\xa1\xe7\x9b\xae\xa5\x6c\xb6\x69\x64\x84\x9e\x68\x38\xb9\xb8\xb8\xb9\xc9\x9e\x8a\x65\xfb\x41\xb8\xb0\x76\xaa\x3a\xc3\xbd\x80\x5f\xce\x9a\x2f\x84\x43\xe2\x31\xd1\xcb\xdf\x0b\x93\x49\x36\xb1\x13\x31\x0f\x28\xdc\x1c\x99\x07\x12\xcc\x83\x53\x01\xf6\xf7\x74\x16\xc0\xe5\x92\xdb\x40\xe5\x50\xf4\x59\xd2\x6d\xc9\x86\xf3\x39\xb4\x10\xd9\x34\xe7\x10\x18\x51\x4c\xd2\x15\x28\x19\x3b\xf1\x37\xf8\x6e\x37\x26\x6f\x77\x13\x49\x89\x68\xbd\xb3\x9f\x29\xf9\x32\xb6\x4c\x9f\xba\xf3\xd3\xe7\x5a\xf2\xf7\x06\x23\xd5\xa6\x50\xbd\x43\xbe\x7c\x89\x6b\xf0\x4f\x04\xfd\xfa\xb5\x08\x55\x5a\xf3\x48\x69\xff\xd9\xd3\x63\x09\x7c\x3b\x3a\x4d\xa0\x4f\x28\xdc\x67\x30\xd7\x95\xd2\x57\xb8\xcf\xe0\x5c\xe9\x7b\x16\x4a\x46\xd2\x32\x43\xd8\x29\xb1\xb4\x68\x7f\xc0\x79\xa2\x69\x01\x95\xdf\x15\x4f\x0f\x14\xf6\xc4\x88\x5a\x40\x6d\x3f\xa6\x66\x35\xc8\x89\xaa\x3b\x7b\x42\xce\x68\xab\x91\x7d\xc6\x59\x2a\x3d\x89\x0a\xc7\xfe\x82\xa9\x59\xd9\xc0\x9b\x1f\x43\x53\x61\xb7\xa4\x53\xfd\xc5\x9b\x05\x64\x4f\x23\xb2\x26\x68\xff\xca\x14\xcb\x79\x97\xa0\xb1\x82\x73\x73\x09\xd3\xca\x96\xce\xbb\x37\xe1\x71\xe7\x4e\xc6\xcb\x05\x74\x40\xc6\x2b\x6f\xaa\x95\xf5\xda\xd6\x67\x06\x70\x5c\x0b\xa6\x55\xd8\x38\xfa\xeb\x5f\x7f\x6f\x73\x97\x7f\xfe\x9b\x96\xbd\xfc\xf5\x77\x52\xe7\x70\x61\x66\x14\xc3\xb6\xb8\x0c\xd3\x80\xb9\xb9\xd0\x16\xd7\x3e\x9a\x50\x32\x7d\x01\x25\xd9\x74\x0d\xd5\xaf\x58\xb3\x16\x30\x66\x30\x39\x1b\xdb\x0d\xad\x9e\x26\x3c\x6c\x33\xa8\x16\x4f\xb7\xc2\xda\x9f\xae\x46\xde\x16\x6d\xe1\x2a\x33\x44\x04\xee\xe6\xef\x97\x2b\xd8\x1d\x36\x14\x46\x39\x75\xd2\x78\x45\x2a\x5e\x25\x3d\x6c\x1e\x71\x3e\x21\x4a\x6e\x9e\xcb\x15\x2a\x77\xfe\x51\x46\xc8\xcc\x48\x7b\x36\x31\x4b\xef\x3f\xcc\x15\xb4\x20\x2c\xa4\x8b\x5a\x03\x0e\x40\x34\xd3\x2a\x58\x2d\x42\x6a\xfc\x88\x2f\x10\xaf\x25\x0e\x85\xc1\x08\x69\x89\xa3\xee\xce\x8a\x91\x1f\x45\x87\xc8\x17\xec\x0a\xb9\x40\x2f\xae\x10\xec\x0a\x41\xaf\x90\x8b\x8b\x6c\x2e\xf2\x16\x6a\x0e\xe5\x24\xb9\x58\x13\x71\x73\x81\x49\xba\xa1\x3b\x3a\x98\x4b\xc1\xc6\x99\xef\xf6\xeb\xfc\xe2\x0a\xb9\xc0\x51\x8c\xfb\x86\xd2\xdf\x50\x02\xc1\xd8\x1b\x9c\xbd\x21\x99\xef\x28\x81\x93\x1c\x7d\x89\xe2\x1e\xd3\xa5\xb0\xe3\x52\xf0\x83\x88\x9d\x8e\x90\xd7\x92\x63\xea\x6a\x3e\x25\x8e\xa6\x98\x43\x28\x11\x92\x6b\xc3\x4d\x60\x92\x74\x63\xef\x47\x18\xb9\xf4\x48\x12\x25\xd9\x43\xe8\x91\x12\x50\x55\x29\x59\xca\xca\xa5\x41\x91\x14\x81\x1f\x42\x83\x92\x82\x30\x18\x25\xe4\xfe\x12\x68\x2e\x09\x9a\x40\xf1\x83\xc4\xa0\x23\x12\xe1\xa0\x57\x82\x04\x4b\x62\xd4\x21\x24\x18\x69\x61\xaa\xba\xb6\x2e\x2f\x05\x8b\xd1\xf8\x41\x24\xd8\x1d\x29\xc2\x9d\xcf\x25\xe8\x30\x24\x4d\x1c\x46\xc7\xeb\x74\x30\x9b\x59\x70\x06\x1c\xd3\xca\xb7\x29\x0e\xc5\x50\xee\x10\xf4\x9c\x8f\x3e\x28\x73\x4a\xef\xaa\x95\x8f\x1d\x67\xb0\x83\xba\x1a\x43\x7d\xf4\x61\x2f\xf8\x93\xdb\x7c\x02\x14\xc7\x1c\xa4\x1d\x0c\x8b\x13\xd8\xcc\x96\xbc\x01\x20\x9f\x10\x47\x73\x87\x49\x82\xef\x74\x74\x38\x3f\x0d\x7e\x6b\x9b\x47\x09\x43\x19\x8a\x3c\xa8\x47\x30\x22\x10\x67\x33\xab\xcf\xed\x71\x0c\xc3\x19\xfa\x30\x49\x48\x49\xd3\xdf\xa3\xdf\x1d\x98\x8b\xb9\xa4\xe9\x70\x9e\x3b\x34\x62\x18\x85\x61\x07\x0d\xc2\x18\x15\x2d\xb7\x44\x65\xf0\xf7\x02\x31\x68\xe6\xb0\x61\x1e\xa3\x25\xdd\x98\x41\xdb\x91\xf6\x0b\xed\x05\xa4\x18\x8e\x3d\xac\x47\x98\x9d\x08\xef\xaf\x68\x80\xfc\x60\x82\xe1\x28\x4a\x90\x21\x91\x8c\x58\x9b\xbb\x3c\x7f\x68\xb0\xdd\x5b\xa2\x8f\xc7\xfe\x46\x15\x27\xfa\x75\xbc\x39\x16\x28\x9c\xef\x4c\xc6\xf5\x71\x93\xe0\xa7\xb7\xfc\x64\xd2\x98\x4c\xee\xf1\xfb\xe6\x64\x3a\x1d\xd0\xc2\x74\x22\x8c\x7a\x77\xb5\xc9\xe3\x90\x7f\xa0\x99\x49\x97\x4c\x6a\x28\x93\x08\xee\x13\x99\xdc\x35\xe8\x81\x48\x76\xc5\x96\xd0\xab\x76\xc4\x7a\x85\x21\x70\x9e\x24\xe8\x47\xaa\x27\xd6\x86\x83\x76\xe3\xe1\x8e\x69\x54\xda\xd5\x4e\xbf\xdd\xaa\x77\xc9\x21\x23\x4c\x1f\xee\xc7\xa5\x89\x10\x1e\x91\xca\xa0\x37\x6d\xb6\xda\x78\xb5\x45\xd4\xc5\x3e\x59\x99\xb4\xeb\x1d\xb1\xd6\xae\xdf\x8e\xc5\xde\x18\x6f\x4e\x89\xc7\x4e\x7d\xd8\xec\x8a\xe3\xaa\xd0\xe5\x87\x0f\x4c\xbf\xca\x74\x27\x78\xf3\xe2\xd8\x9d\x1e\x5e\xe2\x57\xd0\x0d\xe1\xee\xb8\xed\xc6\xd6\xef\x36\xcc\xdf\x05\x71\x85\x10\x57\x88\x63\xb9\xb0\x84\x71\xec\xef\x6f\x38\xda\x34\x82\x79\x49\xdc\x30\x14\x0b\xaa\xba\x23\x81\xf9\xf2\x09\x18\xee\x82\xf4\xcc\x79\x3c\xac\x5d\x9c\x68\x33\xc7\xac\xe8\x9f\x45\xcf\x3b\xb3\x28\x3f\xdf\x2d\xa7\xe5\xb4\x05\xfd\x63\xd5\x1c\x2d\xea\xc7\xf4\x8c\x31\xde\x98\xc3\x10\x38\x8b\xf9\x4c\x79\xee\xf2\xcf\xe7\x20\x86\x7c\xbe\x41\x3e\x63\xe8\x77\x34\x78\x3e\x5f\x21\x9f\xb7\xbb\x4c\xbc\x77\x06\x70\xf4\x15\xfc\xfc\xdf\x2c\x37\x49\x92\xc3\x13\xe4\x70\xdf\xd8\x7e\x29\x39\x9c\x65\x49\x0e\xa5\x38\x96\x0a\xa4\x43\x7d\x7a\x73\x7d\xa1\xfb\xe4\x38\x1c\x27\x08\x06\x47\x09\x9a\xa5\xbe\x93\x0c\x43\xb1\x28\xb3\x25\xac\x98\xaa\x4f\x78\x3c\xac\xed\x73\x93\xb4\xcf\x2d\x44\xb0\x4d\xc6\x83\x39\xd6\x50\xcb\xcb\x88\x5d\x21\x2c\xc5\x72\x1c\xc1\xd2\x2c\xb7\x99\x45\xfd\xf3\xd9\x76\xbc\x29\x86\x31\x93\x64\x30\x07\x86\x02\x03\xdd\xa2\x5b\xed\x96\xa6\x40\xec\x52\x48\xed\x33\xf4\x8c\xbd\x96\x90\x88\xb8\x42\xb0\x40\xa4\x37\xa8\xcf\x9e\x3c\x82\xd8\x15\xf2\x39\x30\x79\xe9\x05\xae\x7f\x8f\x9e\xf1\x90\x2b\x12\x67\x42\x53\xfa\x55\x7a\x0e\x29\xfc\x72\x3d\x27\x24\x2a\xa9\xe7\xe3\xe2\x68\xc0\x55\xc1\x40\x97\xb6\x63\xe7\xd8\x81\x2e\xda\xb5\x13\x09\x4b\x5e\x21\x17\x1a\xae\x28\x18\xad\xc9\x8c\x2c\x33\x24\xe0\x30\x02\x63\x49\x86\xa3\xa0\x42\x41\x16\x97\x09\x59\x26\x30\x5c\x06\x04\x21\xb3\x2c\x8b\x52\x32\x86\x33\x0a\xad\x01\x19\xc5\x34\x55\x56\x58\x92\xf2\x22\x0f\xc9\x72\xa4\x86\x6b\x34\x84\xa4\x46\x30\x98\xd7\x23\x0c\x4d\x33\x28\x2b\x73\x14\x4e\x10\xa4\x8c\x2b\x1c\xa4\x14\x95\x03\xaa\xc6\x31\x34\x0d\x65\x40\x13\x14\x50\x01\x4b\x43\x94\x51\xd8\x60\xe0\xc7\x12\x99\x19\x7d\x43\xd0\x37\x38\x9d\x4c\xd8\x82\xaf\x99\xef\x38\x4a\x62\x04\x53\xf8\x36\x18\x5a\x69\x0e\x63\xc9\x2b\x04\xa3\xbd\xfe\xdc\x7b\xae\x10\xd2\xfb\x0f\x0b\xff\x8b\xbe\xc4\x36\x7f\x78\xac\xf1\x3c\xcf\x57\x51\x7d\xcc\xae\x64\x77\xf4\xa1\x0c\x78\x5e\x5d\x28\x2d\xf7\xbe\xf5\x31\x5c\xaf\xe1\x44\x5c\x38\x97\x93\x47\xd7\x5d\x88\x00\x37\xe5\x99\xd6\x5a\xdc\x8f\x5f\xb8\x07\xed\x81\x44\x1f\x6a\xab\xc5\xb8\x49\xb6\xa8\x75\x77\x39\xe8\xdc\x75\x8c\xd9\x43\xcb\x60\x96\x14\x71\xab\xaf\xdb\xf7\xb7\x24\xe9\xa1\xe6\x27\xbd\xfb\x8e\x3e\xe3\x37\x0f\xcd\x2f\x89\xc9\x1a\x7d\x15\x45\x96\x20\xa7\xbd\xeb\x71\xeb\xda\xb0\x80\xd2\x7d\x35\x6c\xeb\x71\xc4\xba\x38\xcb\x2e\xda\xfc\x4a\xc1\x2a\xeb\x41\xeb\x41\x1c\xaf\xa6\x8b\xf1\x07\xd5\xad\x7d\x0c\x1e\xfb\x9d\x7b\xf2\x5a\x7f\x9b\xd8\xd7\xed\xd9\xfc\xb1\x2b\x8a\xb6\xdb\x1d\xb2\xfc\xf3\x23\x7c\xf3\x30\xf7\x45\xb2\x0d\x3e\x96\x78\x7f\x4b\x8c\x6f\xc4\x3f\x6c\x9e\x47\x7e\x82\x91\x7d\x9e\xaf\xa1\xb7\x69\xaf\xff\xa7\x9f\xb0\x7a\x96\xe1\xf7\x49\x57\x20\xce\x63\xc6\x17\x84\x46\x90\x40\x61\x01\x64\x38\x99\xe5\x14\x8d\x61\x65\x4d\x45\x69\x1c\x50\xb4\x4c\x62\x24\x54\x55\x99\x53\x48\x8a\xc2\x70\x0a\xe0\x04\x85\x71\x28\x4b\x42\x0e\x65\x51\x1a\xe5\x64\x1a\xd2\x79\xae\x40\x65\x1a\x3b\xce\x70\x58\xb6\xa3\x44\x6f\xc3\xb0\x8f\xb1\x2c\x9b\xe3\x0a\x44\x49\x57\xf8\x60\x51\xab\x65\x19\x0b\xd2\xe8\xc1\xf6\x75\x7f\xfa\x7a\x6f\xf5\xc7\x8c\xea\x2a\x83\x7b\x61\x6e\x3e\x8f\x1f\xab\x02\xdd\x9f\x35\xaa\xb2\xbc\xa0\x5e\x3f\x84\x8f\xe9\x82\x1e\xda\xf6\x42\xa9\x2e\x54\x1b\x9b\x8f\x7b\x60\xfc\xda\xe8\x19\x74\xdd\x58\x0e\x3e\x4c\xb6\xdb\x04\x5d\x65\xf9\x1c\x58\xa1\xef\x0a\x31\x83\x6c\xb7\xef\x7a\x72\xc7\x7c\x6e\x5e\x0e\x06\x97\xa3\x61\xa5\x76\xd7\xa8\x5c\x3b\xae\xd6\xc4\x17\x6d\x0c\x57\x94\x6a\xd3\xc2\x6e\x0d\x9c\x59\xf7\xaa\x7d\x54\xec\x31\xe0\xde\xb9\xe4\x99\x49\x95\x30\x66\x10\x9a\x33\xea\x6d\x6a\x3b\xa3\xa6\x70\x6d\xbb\xb7\xd7\x77\xe2\x62\xf9\x62\x4e\x6f\xa7\xbe\x2b\x74\x52\x5c\x41\xb0\xd3\xcc\xe9\xff\x8e\x2b\xe0\xe7\x31\xe3\x0b\x9a\x50\x39\x56\xa3\x08\x1a\x42\x9a\x55\x31\x19\x67\x64\x4a\x66\x39\x0d\x27\x80\x46\x11\x18\x26\x33\x14\xcd\x01\x9c\xd4\x80\x86\x91\x28\x01\x54\x54\xa6\x70\x99\x26\x08\x19\x65\x64\xc8\x71\x17\x7e\xb8\xc7\x53\xad\x9a\xcc\x34\x76\x12\x63\x68\xae\xf0\x6d\x90\x4b\x91\x14\x87\xe7\x78\x02\x5e\xd2\x13\xf0\xde\xe3\x33\x26\xba\x94\x89\xca\xb7\xcc\x03\x69\xac\xbb\xab\xf1\x7b\x83\xb8\x5f\x9a\x2f\x97\xab\x3a\xdf\x75\xaa\xd8\x1d\xde\x61\x2a\x0c\xfd\xe8\x52\x4d\x4e\x69\xaa\xe8\x2b\x6f\x3f\x3e\x73\x7d\x7a\xca\xae\x5b\x2d\x85\x76\x9d\x17\xed\xba\xda\xbd\x6c\x2f\xae\xd1\x3b\xd9\xd6\xac\x8f\xde\xd8\xef\x39\xdf\x13\xfc\xbf\x5a\x9b\xff\x78\xdf\x58\xed\xed\xe7\x37\xbe\xd7\x7f\x09\x7a\xba\x87\xf6\x9e\x87\xc4\x40\x63\x9e\x6c\xf6\xfd\xbe\x55\x99\xe1\x33\xf6\xfd\x6e\xf5\xda\xed\x5e\x1b\xd7\xb3\xeb\xc9\xdb\xac\x37\xb8\x6e\x56\x98\x57\xc8\x2d\x6d\xfd\xd6\x25\x5f\xc4\xe6\x80\x34\x27\x4d\x61\xd4\x52\x49\xac\x27\xde\x4e\x98\xe5\xed\xab\x89\xe2\x3c\x69\x5e\x52\xc6\x40\x26\x3e\x5c\xdf\x53\x5a\x29\x9e\x52\x6b\xa5\x59\xdb\xff\xe7\x9e\x82\x97\xf7\x14\xec\x3c\x56\xee\x2f\xaa\x7a\x99\xb3\x97\x69\x62\x1c\x83\x7e\x43\xb1\x6f\x28\x86\xa0\xe8\x8d\xff\x2f\xd3\x9a\x29\x12\xcf\x4e\x80\xc2\x97\x24\xce\x91\x1c\xcd\xe0\x1c\x9d\x63\xe9\xe9\x76\x1e\x30\xf4\x6f\x77\x49\xf6\x53\x99\xdc\xe9\xe4\xfa\x7a\x3d\xbc\xab\x30\x35\xa3\xc6\x35\x71\xf4\xfd\xb9\x72\x69\xa3\x33\xc7\x7e\x6b\xbd\x7d\x60\x13\x75\xf8\x30\x05\x95\x5b\x50\xf7\xf3\x2a\x21\xc5\x84\xd3\x9f\xc8\x84\x79\xbe\xf2\xf2\x1b\x04\x39\xeb\x73\x11\x98\x52\xf1\xcc\xa2\xc4\xa6\xe5\x63\x27\x1a\x19\x6b\xd1\x59\x05\x16\x3c\xc3\xdf\x0a\xd0\x24\x0b\x27\xd8\x71\x68\x88\x44\x41\xe4\x48\x6e\xc8\xc4\x0c\xfd\x38\x2c\x54\xa2\x72\x71\x1c\x16\x3a\x31\x8b\x3d\x0e\x0b\x93\x98\x7b\x9f\x67\x2f\xf8\x59\xea\x86\xf9\x1b\x15\xae\x10\xa6\x6c\x1d\x31\x63\x47\xf4\xc9\x86\x1f\x33\xf6\x1d\x13\xdd\x7c\x40\x37\x89\xfe\x3f\x9f\x1d\xf3\xa4\x72\xcd\x15\xf2\x59\xb3\xcc\xc5\x49\xa5\x88\x2b\xe4\xd0\x72\xe3\x2f\x58\x40\x48\xd3\xde\x4e\xa9\x72\xf3\x81\xf4\x55\x47\x97\x2b\x5b\x3a\x96\x6b\x3b\x10\x9e\xaa\x63\x1f\x8d\x69\x9d\xac\xe6\x7f\xbd\x88\xfa\x7b\x7a\x2e\x3e\x8c\x6d\xfe\x66\x63\x45\x42\xcd\x35\xd4\x50\x96\x23\xd7\x88\x7c\xbd\x04\x2b\x35\xa7\x76\x6e\x89\x8a\xe5\x89\x8b\x59\x87\xa8\x2d\x1c\x71\x37\x7f\x93\xbf\x56\x6d\xc7\x1b\xf3\xaf\x57\x5b\xc1\xf8\x9d\xf2\xf3\x8b\x32\x63\x77\x31\xd6\xe2\x9d\xe8\xc7\xc6\x88\xcc\x1d\x6c\xa9\xe9\x11\x9a\x9d\x04\x14\x22\xc2\x13\x88\xb2\x32\x9b\x42\x44\x44\x62\xec\x3d\x1a\x11\xb9\x3b\x16\x64\x25\x26\x85\x78\xa8\xc4\x98\x72\x2c\x1e\x7a\xd7\xc9\x8e\xe6\x87\xd9\xc5\x93\x9d\x2a\x1d\xba\xfb\xfd\x1c\xc9\x52\xd1\x66\xc7\x03\xd2\xa5\xcc\xad\xee\x67\x70\x86\xf8\x9e\x36\x28\x03\x12\xe3\x28\x55\x61\x09\x9c\xc6\x28\x56\xa1\x54\x96\x51\x68\x12\x03\xb8\x86\x31\x80\x00\x38\x43\x6b\x2c\xcb\x72\x0a\x06\x54\xc8\x92\x32\xa5\xd0\xa8\x4c\xd2\x38\xcd\x92\xb2\xe2\xcd\x98\x83\x21\xf3\xf8\x40\x17\xab\x11\x91\xd1\xec\x38\x7b\xad\x81\xa0\xf2\xd6\x29\x82\xb7\x3b\xae\x18\x4c\xab\xef\xe8\x67\xa8\x13\xcf\x0b\xb3\xc5\x8e\x1a\xf3\xda\x35\x9c\x29\x04\xd3\x9b\x38\xcd\xbb\xbb\x8f\x87\x7b\xf6\xed\x5e\x7f\xac\x80\xaa\x4b\xb5\xa9\x0e\xef\x4f\x4b\xf9\xa8\xe8\x53\x4d\xcc\xfa\x2a\xdb\x3f\x05\xff\x7f\x47\x9e\x4d\x06\xb4\xc0\x98\xb5\x36\xda\xee\x5f\xbe\x4d\x87\x55\xee\x63\xb2\x9a\xdc\x8f\x88\x77\xbd\xa7\x4f\xdd\xa1\x8c\xd5\x56\x8b\x7e\x1b\xb2\x31\x34\xd1\xb4\x37\x7c\x00\xf3\xb2\x7a\x79\xf3\xd1\xd7\xd8\x6e\xb3\xdf\x1d\x42\x71\x76\xa7\x57\x27\x84\x33\x1a\xae\xdc\xc9\xd3\x1a\xbf\x5e\x0a\x6c\x7d\x24\x5b\x2f\xcd\x47\xb4\xae\xdd\x57\xa6\xfc\xf3\x0b\xb8\xc6\x6b\xad\xbe\xbb\xba\x7f\xe3\x58\xfb\xa9\x0b\x9c\xd9\x7b\x65\xac\xf0\xbc\x40\xaf\x30\x14\x38\x95\x4b\x57\xd0\xc6\xad\x41\x95\x9f\xfd\xfc\x79\x11\x2f\x31\xc4\x57\x21\xfa\x69\xb2\xf1\x5b\xf8\xfe\x46\x17\xb5\x24\x90\xf5\x2a\xd2\x6d\xd8\x05\xb3\xe7\xf7\x0e\x18\xf7\x38\xba\xf2\xa1\xd9\x1c\x44\x15\xd3\x12\x1f\x27\x1f\x95\x87\xdb\x97\xba\x79\x17\xc9\xc6\x57\xef\xf9\xd5\x73\x77\xab\xdb\x4a\x82\xfe\x8e\x5e\x53\x9e\xca\x99\xe9\x57\x8f\xa7\xdf\xe1\x77\x6d\xa3\x8a\xb9\x15\xb5\x69\x8e\xdc\x59\x67\xd5\x77\x6a\x4c\xe5\xa9\xd5\x26\x44\xc8\xa9\xf7\x3d\xad\xd1\xba\xbc\xd5\xa9\xdb\xd5\xb8\x7b\xf9\xc8\x3b\x8c\xcf\xca\xed\xb8\x7a\x19\x12\x9e\x65\x91\x4b\xe3\x6d\x87\x47\xe1\x04\xfa\x80\x57\xc6\x27\xd0\xef\x24\xe9\xbb\x26\x61\x3a\x24\xf5\x5a\xed\x09\xef\xcb\xfe\x35\x61\x36\xc5\xcb\x0f\x8c\x19\xac\x75\x1b\x9b\x6b\x9d\xfa\x74\xd1\x7f\x98\x59\xee\xf0\x72\xc4\x47\xf2\x77\xc8\x2d\xfd\x98\x3d\x1c\x27\xff\xa1\xf4\xbb\xf5\x59\xeb\x48\xfa\x31\x5f\x9a\x6d\x74\x51\x3b\x4d\x17\x5d\x65\x8b\x4f\xf8\xdd\xba\x48\xf4\xc5\x21\xf4\x03\x5d\xfc\xf3\xab\x06\x2d\x3f\xab\xf5\x7f\x28\x13\x55\x6f\x83\xff\xbd\x20\xea\x07\x8b\xe2\x3c\x22\x16\xed\x64\x95\x64\x69\x55\x56\x55\x14\x57\x49\x1a\x65\x31\x86\x66\x30\x85\x04\x14\x60\x20\xa7\xd2\x90\xa5\x29\x05\xe0\x9c\x22\x93\x18\xa4\x71\x95\x01\x40\x63\x50\x80\x6b\x10\x52\x32\x41\xab\x30\xd8\x9d\x76\xae\x68\x47\x14\x45\x3b\x9c\x45\xd9\x9c\xa5\xc8\xf0\xed\x4e\xbe\x78\x6a\xb4\x4b\xf6\x7a\xec\xf3\xd4\xff\x7c\x7f\x2f\x86\x96\x76\xc0\x88\x43\x5c\x6f\x9e\x2d\xbe\xc6\x86\x7e\xbf\xc2\xbd\x2c\xee\x1e\xf0\x57\x62\xc5\xf4\xb5\x35\xdb\xeb\xc0\x17\x41\xc6\x46\xa3\x16\xa5\xbf\xbf\xbe\xb4\xd0\x8a\x39\x9b\x58\x5d\x87\x99\x75\x31\x1a\xef\xcb\x2f\x4f\xb8\x3a\x1c\x8d\x35\x58\x33\x57\x0a\xda\xe3\x81\xf6\x54\x9b\xbc\x3b\x4f\xf7\xfc\xdc\x6e\xbb\xcf\xf3\xca\x62\xfd\x5c\xe1\xa7\x65\x22\x5e\x23\x6e\xca\x59\x11\x8f\x7f\xdb\x02\x1d\x13\x71\x8c\xad\x7e\x33\x9e\xfc\x88\x73\x46\xfa\xfb\x5e\x5d\x9a\xfe\x2f\x19\xe5\xf6\x9f\xfc\x51\xee\x5f\x1c\x65\xf9\x2d\xfd\xfe\x31\xf4\xeb\xf7\x63\x34\x44\xde\x7e\x20\xeb\x28\x7c\xea\xd2\xfc\x9a\xab\xa2\x3d\xbb\x21\xcc\x56\x0a\xc6\x60\xd8\x98\x63\xa7\xcf\xe4\xa2\xfd\xb2\xe0\xfa\x0c\xf5\x52\x25\x56\xb1\xae\xd8\x3a\xd1\x5b\x52\x7f\xa9\x11\xa9\x7a\x9a\xae\x4e\xce\x4e\xce\xd8\x57\x87\xd0\x0f\x23\x52\x13\x1f\x4e\x97\x32\xb0\xe0\xb5\x53\xb9\x6e\xbf\xb1\xef\x74\x7f\xb0\xba\x17\x3b\xcf\x8b\x76\xe3\xb5\xff\xdc\x6f\xe8\x15\x68\xd3\x84\xcb\x33\x13\xeb\xb1\xe2\x0e\x9b\x8f\xd8\xad\x38\xe0\xc8\xae\xce\x7d\xf4\xd9\xca\xf2\x52\x10\xb5\x06\x5e\x1f\x57\x1f\xde\x5c\xba\x3b\x6e\xc8\x77\x1d\xa1\x72\xf6\x88\xa4\xca\x04\xc7\x42\x99\x04\x90\xe5\x18\x8a\x26\x70\x8a\x26\x09\x05\xa8\x38\xa6\x70\x24\xc4\x08\x59\x53\x50\x86\x94\x09\x9c\x80\x90\x25\x20\x46\x62\xb2\xc6\xa0\x18\xa0\x54\x0e\x25\x35\x4c\x0e\x96\x51\xb1\x53\x4a\x3f\x41\x79\x3c\x37\x10\x91\x38\x4a\xe4\x6c\x04\x08\xdf\xc6\xeb\x04\x81\x2d\x36\xda\x6c\xb3\xbf\xea\xbf\xc8\x77\x78\x93\x27\x1e\xee\x9f\x07\xd6\xdd\xe2\x79\x82\xa2\x5a\x83\xb5\xdb\x2d\x66\x81\x0a\x83\xb7\xdb\x87\x6b\x7e\x42\xf0\x9b\x38\xe4\x3f\x39\x71\x28\x78\x0e\x9c\x75\x79\xe3\x60\x7c\x81\xb1\x72\xbf\x7a\xab\x73\x6f\xbe\xa9\x4e\x9f\xfb\x4a\x6f\x84\x37\xa8\xa7\x57\xa3\xb2\x98\x35\x1a\x70\xc6\xdd\xb2\x73\x52\xc1\x04\x63\x3c\x7f\x7f\x99\x0b\xf3\x26\x67\xbf\x3e\x5a\x28\xc7\x60\x75\xba\xdb\x7e\xd0\xe0\xf5\x82\x7c\x59\xd6\x9d\xd6\xa5\xdd\x42\x75\xec\xb5\xad\x3b\x14\x8f\xde\xae\x1f\x0c\xf9\x69\xda\x7e\xa0\xcc\x5a\x89\xd8\xb3\x63\xb4\xbb\xb1\x27\x26\xf3\x76\xec\x8d\xf9\x73\x45\xbf\xae\xa0\x6d\xf4\xb6\xb1\x76\x9e\xde\x44\x6c\x3e\x45\xc1\x7a\x69\x62\x9c\xd8\x7c\x5f\xb5\xab\xeb\x2e\xe5\x54\x04\xa5\x1a\xc8\x48\xcc\x1c\xab\x6b\x4c\xaf\x59\x72\xdb\x3e\x23\x16\xe5\xfb\xf3\x09\xf4\xeb\xa3\x87\x8a\x7d\x02\x7d\x9e\xff\xf7\x66\x5b\xa9\x63\x6b\xe5\x78\x5d\x74\x8d\xc7\x5c\x31\x8b\x74\x71\x6a\x5f\x78\xb6\x70\xa9\x24\xf0\x1d\xa4\x8b\x7f\x1a\x2d\xb4\x59\x43\xb9\x27\x77\x0a\x96\x6f\x8f\x66\xe5\xc9\x30\x7b\x43\xed\x16\x36\xc5\xc1\x2d\x76\xab\x3c\xde\x0e\x6e\x07\xd7\xf2\xdd\x02\x70\x3d\xc8\x0d\xe0\xb3\x8e\x19\xc4\x8a\x72\x6f\xef\x06\xf2\xb0\x67\x55\xc5\x96\x03\x74\xd2\x82\x7d\xb1\xaa\xcc\x97\x38\xf9\x50\xc5\x5c\xc0\xbf\x9d\x7b\x6c\xd5\x38\x46\x01\x9a\x06\x64\x56\xc1\x68\x14\x27\x00\xc1\xb0\x2c\x89\xd1\x94\x22\xa3\x32\xa1\x69\x18\x00\xb8\x0a\x34\x12\x45\x51\x0d\x6a\x24\xa7\xe2\x18\xd4\x14\x96\x64\x54\x55\xd6\x64\x08\xb6\xdb\xa2\x4e\x18\x5b\xf1\xe2\xb1\x15\x67\xb2\xf7\x96\x44\x6f\xe3\x35\xcf\x53\xc7\xd6\x9c\x8a\x56\xf0\x1c\x91\x63\x66\x8c\xad\x95\xc5\xdd\x72\x38\x5b\x59\x6f\x77\x5d\x1c\x9d\x54\xbb\xda\x54\x9b\xd8\x0d\x41\x18\x3b\x6f\x53\x00\x04\xed\x75\xe8\xd2\xeb\xc5\xed\x62\x5e\x5b\x80\xcb\xd6\x84\x6e\x31\xad\xd9\x4c\x1e\x3f\x76\x4c\xa5\xaf\x3e\x72\x64\xab\xc3\x6b\x77\x6a\x9f\x17\x5f\x27\x72\xab\xcb\xac\xed\x37\x08\x3b\xd5\xff\xad\xb1\xf5\xd4\xb1\xed\x44\x7f\x7e\x65\xae\x47\x35\xe5\x9c\x63\xeb\x6f\xcc\x15\x8b\xf2\xd6\xdf\x39\xb6\xf1\x67\x1a\x5b\x8f\x8d\xb3\xe1\xd8\xfa\xa8\xbf\x8e\xcd\x36\xcd\x56\x9f\x1d\xa7\xfe\xf6\x6c\xe0\x4d\x8c\xa9\x3c\x55\xea\x6d\xa5\xd1\x58\x3c\x35\xe9\x17\xcb\xb5\x97\xfa\xe3\xb2\x4f\x2d\x56\x7a\xfd\x52\xef\xae\x5b\xad\x06\xd6\x18\xdd\x35\x85\xe6\x83\x06\xab\x35\xbe\xb9\x36\xc6\x7c\x0d\xcc\xf1\x75\xcd\x65\xad\x4e\xd3\x78\x2e\x5b\x49\xc9\x3c\xa4\x7b\xff\x0e\xab\xcd\x7d\x19\xd1\x71\x55\x87\x1e\x33\x11\xc3\x18\x9c\xa7\x5f\xab\xc5\x0f\xbf\x4a\x12\x44\x7a\x83\x56\x87\x1f\x4c\x91\x3b\x61\x8a\x7c\xd1\xd5\xa2\x73\xb4\xd3\xef\xf4\x3a\x99\xeb\x04\xd6\x34\xce\xd3\x08\x17\x72\x9f\xf8\x21\x62\xe2\x57\x7b\x25\xef\x44\x3b\x59\xba\x5d\xb2\x69\xc2\x1d\xc5\x18\x32\x16\x5b\xfd\xb1\x80\x7c\xd9\x82\x5f\xc5\x0e\x8c\xbe\xda\x39\xde\xf9\x40\xd5\x9c\xa7\x5b\x0f\x16\xfc\xa0\x4e\xcd\xd8\xfd\x55\xb0\xc5\xea\xbc\x92\xa5\x13\xc9\x93\x34\x87\xad\xd2\x92\x67\x2e\xe7\x16\xae\x98\x9e\x57\xfa\x2c\x32\x79\xf2\xe7\xb2\x56\xa8\x81\xdd\x3b\x29\x43\x41\xfc\xfb\x2b\xcb\x9d\x55\x16\x5c\x75\xb9\x83\x05\xe9\x8a\x49\x67\x18\x0f\x5b\x62\x03\x91\x1d\x0b\xc2\xb8\x77\x65\x73\x13\x5e\xa7\x79\x32\x3f\xe1\x51\xec\xa5\x38\xca\xf0\xeb\xd8\x55\xa0\xc7\xb2\xb3\x45\x11\xe7\x64\x67\x36\xb0\xcb\x4f\x00\x7c\xb5\x77\x72\x5a\x1a\x73\xfe\x65\xa6\x27\x70\xe6\x1f\x20\x57\x8a\xad\xe4\xb1\x73\x69\xdc\x84\x37\xb0\x9e\xc0\x4f\x80\xa1\x1c\x47\x89\x33\xed\xae\xf6\x8f\xaf\x4b\x75\xf9\xf8\x95\xb2\x87\x73\x1a\x46\x89\x80\xe1\x04\xba\x38\xdb\xd1\x2f\x49\x77\x38\x4e\x3b\xc9\xf5\x2a\x3a\xb5\x35\x8b\xd9\xed\x59\x59\x27\xb2\xa9\xab\xa5\x19\xdc\x1e\x5b\x79\x95\x7a\xfc\x6c\x01\xd3\xd1\x2d\xc0\xe7\xe0\x3b\xc4\x15\x67\x3d\x23\x54\x1d\x25\x49\xba\x00\xd1\x85\xc7\xe7\x10\x20\xc4\x95\x61\xd3\x47\x8a\xb0\x7b\x06\xe9\xbe\x10\xb1\xeb\x9d\x8f\xf5\xc6\x18\x8e\x63\x95\x9f\xaf\xe8\xc4\x7d\xd5\xa7\xea\x7a\x17\x5d\x9c\xe5\xe8\x87\x3a\x3b\x3c\xa6\x73\xb4\x7f\xe7\xf6\xe9\x6c\xed\xe1\x2c\x37\xbc\xa5\x31\x18\xbb\x3d\xfc\xe8\x6e\xdd\xe2\x38\xde\x24\x8b\xcc\x2f\xed\x5e\xf4\xe3\x19\xde\x47\x96\xe0\x5c\x85\x09\x3e\x13\x27\x52\xe7\x33\x18\x5c\xf4\x7e\x16\xf6\x7c\x54\xa5\x98\x8b\x0e\x87\xca\x64\x2d\x79\x71\xfd\xa9\xfc\x25\xf0\x15\x31\xb9\x7f\xd4\x76\x21\xa7\xe7\xd1\xe3\x0e\xb6\xb2\x5c\x16\x6a\xf3\x3c\xbc\x95\xe2\x29\x9f\x97\x88\xe3\xb9\x69\xbe\xb8\xcb\xd3\x38\xda\xc5\x55\xba\x47\xa3\xc3\xbc\x53\xf9\x5b\x02\xdd\x92\xfc\x13\x5b\xcf\xc1\x61\x12\x5b\x39\xbf\x0d\x19\xbc\xda\x3b\x7f\xfc\x6a\xef\x0c\xfb\x0c\x21\xce\x30\x6e\x87\x78\x8a\x38\x3e\x30\x3b\xf2\xb0\x9e\x4d\xbb\x07\x28\xb6\x50\x6f\xc1\x99\x9b\x7b\x07\x5e\x99\x86\x14\x5e\xec\x75\xaa\x42\x0b\x09\xec\xcc\xd3\xa2\xb3\xc3\x76\x67\x46\x01\xe0\x01\xbc\x9f\x6e\x07\x79\xb8\x8b\x39\x4e\xf1\xb2\x5d\x84\x61\x16\xee\xe1\x73\xd6\xcb\xe3\xe7\xe0\xb9\x58\x0b\xd3\x7e\x0f\xa8\x80\xd1\x30\x87\xf2\x50\x6e\x8c\xe8\x4c\xdc\xa6\xa1\x2e\x4c\xdf\xca\x5a\x72\x0c\xf9\xb9\x8d\x61\x07\xf5\x31\xf9\x66\x36\xba\xc4\x2d\x4e\xe7\x57\xf4\xde\x3d\x51\x85\xec\x27\x1a\x94\x17\x26\x76\x6d\xd7\x2f\xd3\x7f\xfc\x6a\xb0\x22\x49\x62\xb0\xe5\x85\x48\xbb\x84\xec\x97\x49\x93\x7a\xe3\x59\x91\x58\x69\x8d\xca\xcb\x17\x15\x51\x7e\x99\x4c\x9b\xe3\xff\x8b\xe4\xc8\xac\x76\xed\xa2\xde\xfe\x56\xee\x57\xb8\x76\x12\x7b\xea\x04\xf8\x50\x07\xdf\x45\xba\x3b\x85\x3a\x93\x87\xe7\x91\x28\x23\x43\xc1\xbc\x2e\x97\xd8\xf9\xc2\xd7\x3e\xe2\x52\xbc\x17\x07\xb1\xf8\x64\xfb\x57\x98\xcd\x3e\xfe\xa3\xa7\xfa\xc1\x11\xc2\x51\x20\x8f\x2a\x8c\x92\x6c\x9a\x2f\x47\x6b\x39\x07\x67\x61\x8a\xf0\xe5\x4b\x74\xa5\xd6\xb7\x3f\xff\x44\x2e\x6c\x73\xae\xc6\x56\xd3\x2e\x6e\x6e\x1c\xf8\xee\x7c\xfd\x7a\x85\x64\x03\x2a\xa6\x5a\x0e\x30\xa8\xc5\x67\x83\xca\xa6\x3b\x7b\x72\x4a\x91\xdf\x01\xcd\x67\x60\x07\x34\xc1\xc2\x57\xe4\xa1\x29\x0c\x84\xc0\xc8\x90\x9f\x08\x41\x94\x5e\x88\xd6\x55\x49\x8b\x2d\x13\xd5\xef\x7e\xcf\x72\x74\x48\x16\xa9\x77\x07\x42\xab\x21\x6e\x96\x80\x90\x81\x50\x17\x06\x82\x58\x15\x86\x89\x55\x11\xff\x6d\x57\x44\xc6\xbd\x9a\x67\x32\x03\x21\xb8\x47\xde\xfb\xaa\x26\xb4\x85\x91\x80\x54\xf9\x61\x95\xaf\x09\xf9\x77\x9f\x25\x3e\x4a\x89\x52\xcc\xf9\x94\xb1\x4b\xa7\x60\x91\x2c\x8b\x93\x5d\xfd\x24\xcb\x46\xa9\xca\x0a\x13\xfd\x82\x15\xc5\x4c\x4d\x84\x53\xd9\x7f\x5d\x0f\x71\x3e\xd2\xb4\x10\x55\x09\xf2\x0d\xe6\x30\x0d\xec\x17\x95\xfe\x45\x35\x64\x30\xb3\xab\x8b\x94\x32\xd8\x79\x8d\x22\x59\xe2\xf8\x5f\x50\x48\xb6\x69\xec\xd5\x90\xca\x5a\x47\xcf\xb4\x9d\x99\x05\x87\xfd\x36\xa2\x02\x07\x78\x26\x86\xa8\xee\x62\x89\x28\xe6\x62\x39\x87\x0e\xf4\x65\xf8\x7f\x01\x00\x00\xff\xff\x25\x6d\xb9\xbc\xcf\x9b\x00\x00") - -func asset_stat_trustlines_5HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_5HorizonSql, - "asset_stat_trustlines_5-horizon.sql", - ) -} - -func asset_stat_trustlines_5HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_5HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_5-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4c, 0x6, 0x91, 0x34, 0x61, 0xba, 0x8f, 0xef, 0xd6, 0x7, 0x77, 0x94, 0xd5, 0xd6, 0x97, 0x60, 0xa5, 0x4f, 0x1b, 0xf4, 0x64, 0x79, 0x33, 0xcb, 0xf9, 0xc4, 0x6f, 0xe1, 0xdf, 0xcd, 0x78, 0xd4}} - return a, nil -} - -var _asset_stat_trustlines_6CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xe2\xb8\xd3\xe7\xfb\xfe\x14\x8e\x7e\x53\x3d\x41\xcd\xe0\xfb\xe8\xde\xfe\x47\x18\x30\x60\x30\xe6\x3e\x37\x36\x3a\x64\x59\x36\x06\x1f\xe0\x83\xeb\x89\xe7\xbb\x6f\x60\x2e\x43\x19\x8a\x82\x9a\x99\x67\x63\xdb\x2f\x66\xaa\x71\xfa\x97\x3f\xa5\x52\x29\xa5\x64\x4b\x7f\xfe\xf9\xe5\xcf\x3f\xb1\x86\x17\x84\xa6\x8f\xda\x4d\x05\xd3\x41\x08\x34\x10\x20\x4c\x8f\x9c\xd9\x97\x3f\xff\xfc\xb2\xbd\x5f\x88\x9c\x19\xd2\x31\xc3\xf7\x9c\x93\xc0\x02\xf9\x81\xe5\xb9\x98\xf0\x17\xfb\x17\x91\x90\xd2\xd6\xd8\xcc\xfc\xb5\x7d\xfc\x42\xe4\x4b\x5b\xea\x60\x41\x08\x42\xe4\x20\x37\xfc\x15\x5a\x0e\xf2\xa2\x10\xfb\x89\xe1\x3f\xe2\x5b\xb6\x07\xa7\x6f\x7f\xb5\x74\x1b\xfd\xb2\xdc\x5f\xa1\x0f\xdc\x00\xc0\xd0\xf2\xdc\x5f\x01\x0a\xb6\xb8\x6f\x85\xa1\x6d\x6d\xa1\x91\x0b\x3d\xdd\x72\x4d\xec\x27\xf6\xd2\xed\x14\xf9\x97\x1f\x07\xdd\xae\x0e\x7c\xfd\x17\xf4\x5c\xc3\xf3\x1d\xcb\x35\x7f\x05\xa1\x6f\xb9\x66\x80\xfd\xc4\x3c\x77\x8f\x31\x46\x70\xfa\xcb\x88\xdc\x9d\x2e\xcd\xd3\x2d\xb4\xbd\x6f\x00\x3b\x40\x67\x6a\x1c\xcb\xfd\xe5\xa0\x20\x00\x66\x2c\xb0\x04\xbe\x6b\xb9\xe6\x4e\xc4\xf7\x96\xbf\x02\x04\x23\xdf\x0a\xd7\x5b\x70\xc3\xf8\xb1\x37\x00\x02\x3e\x1c\xff\x9a\x81\x70\x8c\xfd\xc4\x66\x91\x66\x5b\xf0\x75\x6b\x31\x08\x42\x60\x7b\xe6\x8f\x2f\x5f\x0a\xad\x7a\x03\x93\xd5\x82\x34\xc0\xe4\x22\x26\x0d\xe4\x76\xa7\xbd\x97\xfc\x2b\x9a\x99\x3e\xd0\xd1\xd8\x0a\x42\x6d\x1d\xa0\xf9\x8f\x9b\xd2\x01\x9c\xcd\x23\xcf\x8f\x9c\xe0\x3e\x61\xe4\x2e\xee\x91\xb4\x91\x6e\x22\xff\x1e\xc9\x2d\x4f\x03\xa1\x3b\x25\xef\x10\xd3\x50\x10\x7a\x86\x81\x7c\xcb\xd5\xd1\xea\xb6\x2c\x80\xd0\x8b\xdc\x50\x03\x36\x70\x21\x0a\x7e\x7c\x11\x95\x8e\xd4\xc2\x3a\x62\x4e\x91\x12\xd2\x75\x55\x19\xa6\x98\xd7\xf3\xd7\x58\x8c\x9e\xaf\xab\xed\x4e\x4b\x94\xd5\x4e\xe2\xa1\x73\xc1\x5f\xb3\x29\x5a\xdf\x83\x1f\xae\xde\x87\x3e\xca\x7c\x00\xd5\x40\x77\x70\x4e\x8a\xdd\x8f\xed\x47\x41\x68\x5b\x2e\x0a\x6e\x21\x1f\x85\xee\xc6\xdd\xb2\x40\x71\x34\xb8\x81\x7b\x12\xba\x1f\xf7\xe8\xf2\xb7\x70\x8f\x42\x77\xe3\xee\xe4\x2d\xd7\xf0\x6e\xe0\x9e\x84\xee\xc6\x9d\x45\x5a\x10\x69\x37\x30\x77\x02\x1f\xc1\xb3\xad\x60\x3c\x8f\x50\x74\xcb\xb2\x49\xb1\xfb\xb1\x11\xf2\x6f\x99\x35\xbe\x7f\x37\x5a\xdc\x8c\x6f\xc1\xed\x04\xee\xc6\xdb\x45\xa5\x31\x02\xfa\x6d\xd8\x33\xb9\xbf\x19\x7d\x1f\x29\xd1\xfc\xd7\x9d\x6a\x34\xe0\xde\x00\xd7\x80\x7b\x37\xe1\x7d\xf4\xbb\xc5\xf5\x20\xf2\x51\xcc\xed\x18\xe0\x7d\xd8\xad\xd4\x1e\x39\x96\xbd\x04\x4e\x0d\xb9\xb7\x65\x8f\xa1\xf1\x3d\xb1\x53\xa0\x7b\x47\xf2\x18\xb8\x6e\xcb\x9d\x02\xd1\x3b\x72\xc7\xc0\xf2\xae\xdc\x5d\xfc\x4e\x01\xe5\xb6\xdc\x2e\x48\xbc\x2b\x73\x6c\xf2\xef\x48\x6e\xdb\xf1\x6d\x91\x5d\xdb\xbc\x2d\x73\xd6\x14\x6e\x8b\x6a\xc0\xbd\x2d\x70\x70\xd5\xbb\xa4\xb6\x9e\xb7\x17\x94\x06\x1d\x49\x6d\xcb\x75\x35\x29\x6c\xcf\xcc\x60\x6e\xef\x25\xda\xf9\xb2\x54\x13\xdf\x60\xfd\xf8\xb2\x1b\x1b\xab\xc0\x41\xdf\x0f\xbf\x61\x9d\xf5\x0c\x7d\xdf\x3f\xf2\x03\x6b\xc3\x31\x72\xc0\x77\xec\xcf\x1f\x58\x7d\xe9\x22\xff\x3b\xf6\x67\x3c\x64\xce\xb7\x24\xb1\x23\x1d\x90\x0f\x78\x5f\xce\x10\xcf\x6f\xee\x81\xf3\xf5\x5a\x4d\x52\x3b\x37\x90\x77\x02\x58\x5d\x3d\x07\xc0\xe4\x36\xf6\x72\x18\xdf\x1e\x7e\x0b\x62\x90\x97\x4b\xcd\x87\xe2\xef\x75\x1e\x2d\xf4\x6e\x79\xce\x6c\xa9\xd6\x3b\x17\xf6\xc4\xfa\x72\xa7\x7c\xa4\x95\x1c\xd0\x9e\xa9\x3f\xa1\x5c\x10\xf9\x48\xe1\xdf\x80\xc4\x06\x68\x28\xd9\x99\xb9\xcd\x62\x66\xbe\x07\x91\x1e\xf9\xc0\xc6\x6c\xe0\x9a\x11\x30\x51\x6c\x86\x3b\x07\xe0\x5b\x31\x1d\x19\x20\xb2\xc3\x5f\x21\xd0\x6c\x14\xcc\x00\x44\xdb\x6c\xe2\xe5\xe2\xee\xd2\x0a\xc7\xbf\x3c\x4b\x4f\x24\x08\x67\x85\x4d\x3a\xe4\xbe\x98\xb1\xeb\x9e\x0a\x79\x70\x80\x34\x83\xef\xbc\x3c\x19\x74\xbf\x7d\xc1\x30\xec\xf0\x8b\xa5\x63\x70\x0c\x7c\x00\x43\xe4\x63\x0b\xe0\xaf\x2d\xd7\xfc\xc6\xb0\x7f\xc4\x75\xa3\x76\x15\xe5\x35\x96\xde\x3e\xe8\x02\x07\xa5\x08\xf3\x7c\x9a\xf0\x02\xd8\x51\x9a\x34\x41\x90\x97\xe2\x36\x08\x42\xc7\xd3\x2d\xc3\x42\x3a\x66\xb9\x21\x32\x91\x7f\x14\xf9\xf2\xc7\x65\xdd\x1f\x5b\xf1\x93\xb6\x08\x1e\x32\xc4\x3e\x11\xc0\x34\xcb\xb4\xdc\xf0\xe2\x66\x80\xe6\x6e\xe4\xa4\xdf\x73\x23\x27\x88\x34\xe4\x86\xfe\x36\x15\xbc\x2c\xe6\x4e\xc6\x72\x0d\x1b\x6c\x33\x46\x1d\x05\x61\x3a\x9d\x9d\xe0\xd8\x73\x90\xee\x39\xc0\x72\x53\xa4\x68\xfa\x92\x74\x38\xf6\x51\x30\xf6\x6c\x3d\xc0\x42\xb4\xba\x64\x66\xd8\xc0\xbc\xc6\xe8\x66\xdd\xec\x2d\x12\x6d\xb5\xda\x16\xd0\x2c\xdb\x0a\xb7\x85\xdb\x95\xff\x60\x12\xdb\xbe\x75\xdb\x32\xdd\xed\x58\x68\x4b\x6b\xf7\x4b\x62\x34\x70\x1c\x5a\xec\x8d\xfe\x2b\x4e\xab\xb1\x7c\x59\xca\x57\xb1\x6f\xdf\x0e\x55\xf1\x9f\x9f\x18\xfe\xc7\x1f\x37\x9e\xbe\x24\x78\x89\xf3\xa6\x00\xef\x21\x9e\xd5\xe5\x05\xda\x79\x3d\xbf\x87\xf4\xd6\x3c\x17\x70\x29\xf6\xdb\x61\xbe\x6d\x18\xdb\xfe\xef\xd1\x36\xb1\x1d\x32\xee\x9a\x83\xeb\xe9\x28\xd9\x16\xce\xda\xc0\x5b\xa5\xe7\xfd\xf3\xa3\xea\xcf\x07\xc6\x3b\x22\xfb\xdf\x40\x30\x4e\x90\x61\xdf\xf8\xf6\xcc\x47\x8b\x77\x85\xb4\x08\x4e\x51\x68\x5b\x41\xf8\xae\xe8\x71\xb4\x7d\x70\xf7\xdd\xcf\xd0\xf6\x02\x14\x5a\xce\x95\x96\x1f\x07\xd6\x94\xb6\x95\xa8\xf3\xf3\x41\xfd\x11\xef\xa2\xbe\x4f\x7a\xae\xb8\xce\xb5\xdc\xe0\x1c\xe6\x54\x8a\x6b\xde\xb2\x1f\x7c\x3d\x5a\x63\xfb\xc4\xeb\xdb\xb1\x91\x23\xff\xce\x08\xba\x9b\x79\xd1\xaf\x45\xd0\xd8\xdd\x41\x10\xa0\x30\xcd\x9e\xbb\xb6\x7a\xf5\x36\x70\xb6\xcd\x2a\x1d\x7a\xe6\x5b\x10\xb9\x57\x82\x58\x7c\xf3\x5a\x84\x8b\x6f\x62\xba\x17\x69\x36\xda\xfa\x1b\xb4\xe2\x19\xc9\x4f\x8d\xa2\x89\x1a\xde\xa7\xac\xbb\xb2\x5c\xd4\xeb\xbe\x80\x57\x7c\x63\xff\xe4\xde\xc2\x17\x8f\x1e\xec\x7e\xcd\x21\x76\x03\xf6\x47\xfd\x61\x97\xd6\xef\xdc\xc1\x9a\xa5\x75\xfc\xcc\x9b\x96\xeb\xf9\xe1\xd1\x1a\x05\xa9\x28\x76\x95\x0e\x86\x5f\x76\x9b\x68\x15\x82\x30\x44\xce\x2c\xc4\xb6\xcd\x22\x08\x81\x33\xc3\xb6\x43\x26\x2f\xda\xfd\x82\x6d\x3c\x17\xbd\xed\x6c\x0d\x60\xd9\x91\x9f\xe8\x6a\xaf\x69\x08\xd7\x33\xf4\x7e\xa5\xec\xa6\x25\x12\xb8\x6f\xc3\xfe\x51\xe3\x95\xda\xd9\xcf\x6c\x78\xfe\x65\xa5\x7e\x8b\x2d\xf1\x1f\x0c\xff\x03\x13\xd5\x02\xb6\xfb\xe7\xff\xfa\x89\xb1\x0c\x43\x31\x7f\xa4\xd6\x55\x32\x0d\x7b\xb8\xca\x92\xb3\x3c\xc9\x98\x7b\xc5\x1a\xbb\x89\xb6\x6d\xab\x4b\x25\xb4\xcd\x1d\x9f\xa0\x12\x44\xda\x9e\x84\x8f\x82\xb3\x0e\x88\x4a\x1d\x31\xfa\x08\x1c\xdb\xd2\x5b\x3e\x89\x9c\xf7\x51\x4e\x89\xc9\xba\x3b\x7a\xc6\x1d\xb1\x79\x80\x6e\xf5\x30\x6f\x79\x26\x72\xf8\x47\x79\x9e\x20\xee\xe7\xf9\xa6\x93\xbb\xb8\x8f\xdc\x05\xb2\xbd\x19\x7a\xa7\x4b\x3b\xa9\x7e\xa2\x23\x4a\x4c\x77\x3c\x61\x82\xc3\x7c\xed\xb7\x7b\xea\xe1\xe4\x45\xef\x19\x62\x7e\xa5\xa3\x39\x37\xc2\x61\x1e\xf8\x0c\xf1\xd2\x10\x67\xda\xae\x1a\xe3\x34\x47\xf4\xb0\x31\x4e\x93\xe2\xdf\x4e\xed\xf6\x3c\x79\x4b\x69\x53\xb7\x5a\x77\x62\x86\xeb\x51\x56\x89\x25\x80\x47\xd2\xae\xb8\xc7\xbf\x11\xa9\xad\x20\x88\x90\x7f\x3f\x14\xf4\xf4\xd4\xec\xf4\x8d\x59\x42\xdb\x72\xac\x2b\x23\x8a\x9b\xb9\xe0\xbf\x99\x55\x25\xbc\x33\xb1\xaa\xf2\x50\x16\x95\x7c\xfe\xb3\xf2\xa8\x04\xe6\xe3\xf9\xcf\x2d\xd4\x5d\xa5\x5d\x20\xed\x6b\xf2\x3f\xe9\x0d\xef\x6c\xba\xf7\x61\x27\x4f\xae\xa1\xed\xdc\x3c\x5c\x9d\x85\xe2\x3b\xf2\x8d\x4b\x07\x5c\xc5\xab\x94\x57\xef\xc2\x31\x70\x4d\x94\x9a\xd8\x27\x8d\x93\x5c\xb6\x7b\x3c\x56\x9f\xe6\xce\x1f\x37\xd1\x3f\x6c\x1f\xcd\xd3\xd7\x69\xc6\x09\x57\x3e\x0a\x22\x3b\x35\xba\x87\x2b\x07\xbd\x9b\xcf\x9d\x96\x58\x1f\xb7\xe7\xc5\xba\xc5\xa3\x46\xbd\x58\x71\xfe\x76\x97\xe1\xf6\x0f\xdd\xb2\xde\x5e\x24\xcd\x10\xf7\xb9\xdd\xc5\x0a\xf7\x23\x86\x2a\x6c\x33\x6b\xc3\xf3\xdf\x99\x0c\xc5\x0a\x62\x47\x7c\xc7\x66\xb7\x21\x83\x0f\xe3\xc9\x6a\x5b\x6a\x75\x30\x59\xed\xd4\x4f\x93\x8a\x3d\x51\xe9\x4a\x6d\xec\xdb\x4b\x29\xd7\x6a\x0c\xcb\xb2\x42\xe6\x65\xaa\xa8\x36\xe9\xdc\x40\x29\xd6\xd4\x82\x52\xac\x74\xd5\x46\x97\x2c\x0f\xa9\x51\xad\xd8\x2e\xd7\xd5\x6e\x5e\xaa\x8b\xed\x3e\xd7\xcc\x73\xf5\x01\x59\x7e\x79\xc5\x84\xdd\xc5\xed\xff\xcf\xe3\xf8\x2b\x46\xbe\x62\xf8\xeb\xce\xca\xd8\xcb\xcb\x2b\xf6\x22\x36\x45\x51\x14\x7f\xfe\x7c\x89\x6f\x90\x87\x7b\xa7\xff\xfe\xf1\xe3\x3d\x86\xf9\x41\xb5\xc4\xb6\x54\xba\xae\xca\x52\x23\x5f\x53\x8b\x39\x8e\x22\x45\x9a\x62\x47\x4c\x43\x2d\xb4\x5b\x4a\xa9\x5f\xe5\x4a\x39\x25\x5f\x6b\x2a\x72\xb1\x4e\xb7\x39\x69\xd8\xef\x75\x4f\x0c\x85\x2d\x33\x9e\xe1\x05\x81\xa2\x19\x81\x7a\xc5\x88\x1b\x14\xa9\x87\x28\x92\x54\xb3\x48\x96\xbb\x12\x43\x8a\xb5\x41\xb7\xd8\x2d\x53\xe2\xb0\x22\x0e\x06\xa5\xc1\xa0\x47\xf6\xca\x83\xe1\xb0\xc5\x4a\xc3\x81\xd4\x69\x54\x0b\x83\x51\x5b\xec\xb3\xdc\xa0\x4e\xdf\xa0\x78\xcb\x8a\x74\x2a\xc5\x2b\x7e\x73\x39\xdf\xf6\x84\x0b\x5e\x9f\x45\xfb\xa8\x1f\x9e\xcf\xa4\x1d\xed\xc8\x52\xba\xc0\x1b\x0c\xc5\x22\xc4\xf2\x3a\xa1\x91\x9c\xc6\x68\xbc\x60\x90\x14\x30\x18\x8a\x20\x34\x8e\x61\x05\x40\xd2\x06\x30\x08\x1a\xa7\x80\x8e\x6b\x0c\xa9\xb1\x14\xa5\xe1\x9c\x86\x04\x61\x6b\x2a\xfc\xc9\x6b\x8b\xc1\x70\x24\x20\x11\x45\x1a\x06\x49\xf3\x00\xe7\x34\x1c\x71\xb8\xa1\x13\x06\xab\x53\x04\x0f\x09\x03\x40\x9d\xc4\x35\x16\x42\x9c\x87\x14\xa5\x33\x1c\xc7\x90\x8c\xc0\xb3\x3c\x41\x32\x80\x60\x5f\x62\x17\xc3\xb7\x15\xf7\x3f\xf6\xca\x0d\xaa\x16\xbd\xce\xae\xdb\xd5\x1c\x57\x70\x0b\x42\x99\xc4\x57\x93\x5c\x26\xc0\xcd\x30\x58\xca\xcb\x0d\x31\xd0\xdb\xfd\x21\xc8\x55\x40\xd1\xdc\xca\x4b\x2a\xad\x80\xcd\x8c\x6c\xbe\x8b\x3c\x12\x07\x04\x1d\x8b\xe5\xa6\xff\x40\x41\x3e\xf5\x7a\xb9\x68\xeb\x57\x1c\x95\x00\x0c\x05\x58\x12\x09\x1c\xa1\x0b\xbc\x4e\xe9\x2c\x8f\x10\x27\xe8\x34\x4d\x18\x00\x20\x16\xea\x24\x4b\xe1\x1a\xe0\x38\x1d\xc7\x09\x9d\x66\x10\x47\xb3\x3a\xc9\x33\x90\x16\x28\xc8\xf3\x5b\x27\xfb\x0c\x67\x67\x05\x8d\x24\x49\x16\x21\x92\xa6\x68\x8e\xe6\x78\x40\x70\x04\xa4\x69\xc8\x73\x1c\xaf\xd3\x06\x45\x0b\x8c\xa1\x01\x5a\x00\x80\xd7\x29\x16\xa7\x78\x40\x21\xc4\x72\x34\xa3\xe9\x06\xa5\x69\x2f\x71\x48\x26\x18\x46\x60\x38\x81\xe7\x0e\x1e\x9b\x27\x1b\xa3\x09\xa1\x46\x8c\x87\x6b\x15\xae\x4f\xbb\xeb\xfa\xa2\xbb\x2a\x51\xbd\x99\x37\xcd\x2c\x8a\x62\x3d\xcc\x13\x55\xb2\xc6\xe5\x38\x76\x14\x31\x65\x01\x96\x75\x7c\x2e\x06\xa3\x89\xd0\x64\x87\xfc\x5a\x96\x21\x1b\x85\x53\x23\x9b\xaf\x67\x14\x27\x8b\x57\xb5\xc0\xf0\x37\x8d\x6e\x6c\xe1\x41\xa3\x57\xa3\x62\x8f\x92\x8f\xff\xd9\x85\xb7\xe0\xf4\xef\xa5\xd8\x68\xee\x7d\xa7\x81\x37\x26\x6d\xaa\x65\x70\xe3\x80\x5f\xf5\xe4\x9c\x49\x9a\xfc\xaa\xba\x98\xd7\xeb\x59\x37\x6b\x66\x07\x4b\xb3\xd1\xca\x96\x73\xdc\x1c\x09\xb3\xc0\xaa\x44\xf4\x54\x2d\xb7\x68\x6f\x50\x96\x3a\xb2\x4e\x13\x0d\xb5\x32\xe0\x66\x95\xb9\x87\x93\x22\xed\x65\x18\xb7\xa5\x51\x9b\x68\x19\xab\x4a\xf1\xe8\x82\x9c\xe6\x15\x07\x8f\x2e\xe0\x95\xbf\xd1\xf7\xfe\x9e\xeb\x4e\x8f\xc6\xd1\x36\xac\xd1\x34\x2d\x00\x08\x18\x96\x34\x48\x03\x00\x9e\x86\x1a\x47\x93\x9a\x86\x34\x0a\xe2\xcc\x36\xf2\x11\x9a\xc6\x93\x34\x20\x19\x52\x43\x24\xc1\x19\x3a\xa7\x91\x38\xa4\xc0\xd6\x1b\x3f\xa3\x55\x08\xb8\x8e\xeb\x94\xa1\xb1\x02\xa3\x71\x08\xa7\x34\x06\x92\x3a\xe2\x78\x02\x71\x80\xe7\x29\x01\x12\xbc\x46\xea\x34\xe4\x08\xca\xd0\x48\x44\x72\x06\xc9\xeb\x02\x10\x04\x92\x67\x71\x81\xa5\x5e\xe2\x1e\xfc\xe8\xd1\xc4\xc1\xa3\x57\xb3\xce\xcc\x62\x07\xe5\xd1\xa4\x43\x78\x9c\xeb\x76\x9b\xc6\x3c\xd2\xd4\xca\x24\xcf\xea\x82\x98\x23\x8a\x0c\xae\xb5\xc7\xb0\xdd\x59\xcb\xa3\xb6\x30\xd5\x97\x23\x4f\x62\x5c\x72\x89\x8c\xb5\x6b\xd4\xa6\xe3\xd9\xa8\x22\x8f\x34\x4e\xb1\xb2\x9e\x32\x58\x0f\x83\x46\x2f\xef\xf4\x13\x1e\xbd\x3c\x59\x5c\x51\xaa\x0d\xad\xe6\x4d\xca\x99\x56\x2b\xd3\x69\xe7\x0a\xd5\x52\x2e\x1b\x46\x46\x99\x74\x14\x82\x84\x30\x5f\xf6\x89\x8a\x4b\x72\xeb\x46\xbe\x89\xab\x0d\x0e\xf4\xc2\x8c\xc8\x0d\xf2\x94\x6b\x22\xe4\x99\xcc\x72\x18\x84\x9d\xb2\x94\x0d\xa2\x4a\xb6\xaa\x3a\xb3\xa9\x37\xac\x0c\x63\xfc\x5a\x8a\xc7\x4a\x41\x5a\xad\xff\x7f\xe0\xb1\x3a\xc5\xb1\x2c\x0b\x75\x7e\xeb\x26\x82\x80\x1b\x06\xc1\xe8\x02\xa7\x1b\x1a\xc7\xf3\x34\xa9\xd3\x8c\xce\x23\x44\x68\x04\x4b\x73\x88\xd2\x28\x88\x68\x9a\xd4\x48\x5a\xa3\x79\xa4\xf1\x02\x17\x0f\x16\x3e\xc1\xeb\x21\xc7\xe1\x24\xb9\x55\x4e\x00\x1d\xf0\xc8\x20\x19\x8e\xe7\x05\x4d\x30\x48\x24\x40\xc8\xea\x0c\x41\x71\x02\x4e\x19\x9a\x2e\x10\x38\x0e\x0c\x9a\x20\x58\x9c\x34\x10\x87\x0c\xa0\x91\xfa\x4b\x3c\xa0\x3b\x7a\x2c\x79\xf0\xd8\x25\x97\xcb\x4c\x5b\x15\xbf\xda\xb3\xf8\xc5\xdc\xeb\x28\x7a\x3e\xca\x04\x7c\x6e\xb8\x34\x4a\x9c\x39\xf5\xec\x6a\x46\x1e\x64\x07\x81\xb9\x64\x1d\xa5\x59\xd2\xca\xa5\xa9\x3f\xf6\x4a\x51\x77\x30\xb0\x01\xad\x39\x5a\xa7\xd3\x69\xe4\xb9\xf6\x1c\x66\x68\xd1\xb7\x96\xc5\x05\x6e\x4f\xe8\xd8\xc2\x5b\x8f\xa5\x13\x16\x2f\x70\x8b\x0a\x59\x1a\x0c\x5d\xc1\xab\x67\x0d\x8f\x69\xfa\x4e\xb9\xea\x76\x7a\xf2\x3c\x07\xfc\x05\x97\x73\xf2\x61\xa0\xd5\x43\xcd\x60\x3b\x65\x98\x57\x56\x83\x96\x0f\x26\x8b\xca\xc0\xaa\x44\x86\x32\xdb\x94\x88\x96\xca\x88\xd9\xc5\x48\x12\x7d\x5c\xea\x8b\x0b\x26\x93\xf1\x95\xd8\x49\x9b\x29\x1e\x5b\x4a\x1d\x42\xfc\xbf\xee\xb1\x57\xc6\xcc\x29\x0b\x98\x4f\x8c\xc0\xdf\xae\x7e\x3d\x03\x76\x6d\x79\xe6\x39\xcc\xcb\x15\x96\x27\xd0\xae\xac\x8f\x3c\x81\x78\x65\x25\xe3\xa3\xf9\x4b\x62\x35\x23\x91\x04\xca\xe5\x52\xbb\xdc\xe1\x06\x72\xa5\x97\x93\x6a\x6a\x67\x48\x53\x32\x29\xf5\x72\x0c\x57\x6c\x14\x7a\xf2\xa8\x5f\xad\x97\x1b\xe5\x41\x57\x2d\x8a\x85\x46\x2f\xaf\x14\x9a\x85\x3c\x49\xee\xc6\x60\xbb\x4c\xa1\x92\xdb\xb4\x1b\x0d\x01\xaf\xcc\xa5\x49\x69\xb3\xda\x00\x55\x9a\x97\x17\xeb\x45\xb9\x57\xd2\xaa\x50\x67\x38\x1c\x74\x45\x8a\x90\x02\x98\x3b\x79\x5f\x3c\x64\xc9\xc7\x7f\x6e\x5b\x96\x64\x71\x53\x83\x58\xea\x54\xdb\xcb\xaf\x9c\x06\x51\x98\x4d\x36\xb2\x39\xde\xcc\x59\xb2\x95\xe5\x65\x8e\x8e\xb4\x6c\x73\x16\xad\x32\x8b\x9a\xb0\x1b\xa5\x43\xa1\xbb\x41\xf1\xf3\xe6\xf1\x3f\x31\x7e\x7e\x79\xfc\x77\x41\x14\x85\x7c\xa2\xe1\xe6\x9c\x2e\x3b\x02\x4c\x0d\xce\xc9\x6c\xc5\x83\x75\xa5\x50\x9d\xaf\x66\x50\x6c\x4e\xa8\x6c\xa1\xc8\x82\xe9\x64\xb2\x71\xdc\x95\x02\x49\xa9\x1b\xc3\x75\x42\x35\xd2\x57\xc4\x3c\x47\x48\x28\x57\x11\x84\x8c\xb0\x76\x8a\xcd\xfa\xba\x30\xc1\x7b\x8d\x6c\xce\x9f\x50\x5d\x87\xb1\x3b\xb4\x5b\x87\xf3\xf5\xbc\xa6\x48\x62\x30\x81\x85\x42\x14\x36\xa6\x39\xde\xc6\x65\x21\xe7\x59\x80\x75\x86\x0d\x38\xad\x14\x57\x8b\xe9\x94\x5b\x2d\x0a\xcd\x9f\x3f\x2f\x7b\x8b\x4f\xae\x1a\xea\xa9\xaa\xa9\x9d\x57\x4d\x21\x67\x2b\x64\x8b\xca\x39\x66\xc7\x31\xb4\x1c\x93\xad\xea\xfc\xba\x5d\xb2\xa7\xd3\xb1\xbd\x08\x22\x25\x63\x86\x46\xc5\x5a\x0a\xdd\xea\x68\x74\xaa\x1a\xe3\x22\xda\x7c\xd8\xf4\x59\x6e\xb5\x60\xe1\xca\xe4\x32\x60\xd2\xca\xca\x85\x3e\x33\x9e\x2b\xfd\x9a\x34\xad\x9b\xfd\xf5\x5c\x98\xb3\xcb\x1a\x50\x72\x96\x9e\x5d\x4d\x9d\xb9\xbc\xe8\x06\x2e\xd7\xee\x84\x6a\x9e\xc0\x87\x6b\x67\x2c\xe4\x75\xab\xb5\xea\x84\xf6\x68\x08\xf9\x49\xc9\x2c\x74\x08\xba\x5f\xcc\xfd\xfd\xa6\xa7\x9f\x32\x7d\xf3\xc2\xf4\xf9\x61\x28\x8e\x02\x08\xda\x51\xc9\x04\x4c\x4b\x47\x3d\x7f\x1c\x8d\x42\x55\xad\xf1\x4a\x58\x9d\x6d\x38\x33\x1f\x29\x62\x3f\xdb\xee\x37\xcc\xa3\xe9\xcd\x67\x4d\xdf\x32\xe4\x65\x91\x71\x00\x49\x90\xbd\xae\x0a\xb2\x19\x5e\x88\xf8\xa6\xb3\x5c\xac\xe4\x70\x30\x06\x6b\xb3\xbe\x59\xb7\x98\x7a\x7d\x3c\x85\xac\x3a\xec\x95\x33\xd6\x22\xdb\xe9\xcf\x0a\x94\x3a\x63\x82\xcd\x68\x6d\x55\xd9\x4d\xdf\x28\x81\x92\x5e\x14\xb4\x21\x33\xd0\x84\x8c\x91\x17\x77\xa6\xbf\x1e\xe2\xd2\x56\x2a\x1f\x08\x71\x87\xd5\xca\x63\x65\x0a\x02\x8d\x04\x81\xd5\x04\x8a\x80\x40\x63\x0d\x28\x00\x02\x52\xbc\x86\x43\x00\x34\x02\x30\x10\x27\x70\xde\xe0\x0c\x48\x11\x1c\x60\x01\xcd\x23\x0a\x22\x56\x30\x08\x52\x87\x3a\x4f\x33\xc9\x4a\x8d\xeb\x47\x8a\xff\x9c\x96\x55\x99\xcf\x52\x4d\xc7\x6b\xd7\xb4\x46\x59\xf5\xf0\xb6\x87\xb2\x55\x5e\xef\x8e\x82\xd9\x8a\x72\x17\xad\x59\xb3\x60\x74\xdb\xab\xa5\xf4\x5e\x77\x7b\x65\x65\xf2\xc3\x85\x3f\xad\x4e\x1e\x0b\xbf\x77\x6d\xe0\xc3\xb1\xb5\xd8\xdf\x4c\x5e\xdb\xb1\xe0\x7f\xc5\x53\xcb\x5f\xf7\x5f\x03\x7e\xfd\x8e\x11\xbb\xc9\xe6\xaf\x01\xf2\x17\xc8\xff\xfa\x1d\xfb\xba\x20\x88\xbf\x88\xbf\xf0\xaf\xfb\x1b\x30\xf2\x7d\xe4\x86\x4a\x3c\xc6\xfd\xfa\x1d\xa3\xcf\x7f\xcf\xc5\xaf\x84\x05\x5f\xbf\x63\xff\xfb\xcb\x41\xd1\x7f\x7d\x49\xaa\x8d\x25\xb7\xc0\x24\x0e\x21\x40\x1c\xd2\x04\x0a\x52\x38\x6d\x30\x0c\xaf\x6b\x84\x26\x70\x0c\xad\x0b\xa4\x8e\x08\x96\x65\x71\x8a\x25\x00\xc9\xd1\x3a\xe0\x0d\x4e\x33\x28\x96\xa3\x59\x9a\x65\x79\x81\x40\xc2\x9e\xd1\x11\xd7\x45\xab\xf0\xeb\xf7\x0b\x6d\xbb\xc2\x6c\xcb\xfe\xf5\x3b\x86\x9f\xdd\xfa\xef\x8b\xe7\x03\x17\xcc\xb6\xbc\x18\x24\x68\x2c\x34\xb6\xac\x74\x8e\xa3\x68\x9c\x33\x70\x4d\xa7\x38\x8a\x41\xbc\x8e\x93\x00\x50\x40\xa3\x11\x8b\x58\x40\x43\x96\x30\x70\x82\x64\x71\x9c\x47\x34\xe4\xe0\x96\x23\xfe\xf5\x4b\x8a\x86\x2b\x36\x40\x06\x45\x00\x12\x07\x94\xb0\xcd\x3c\x29\x88\x48\x92\xe4\x18\x04\x78\x82\xe3\x38\x9e\xd5\x00\x64\x68\x96\x61\x0d\x8a\xd2\x21\xa4\x0d\xca\x40\x90\xc5\x75\x86\xd1\x75\x83\x60\x29\xfd\x01\x1b\x10\xaf\x6f\xef\x79\x51\x38\x8b\xc2\xcf\x2d\xfb\x2d\x0b\x3f\x3b\xe5\xf9\x11\x0b\x3f\xad\xeb\x6f\xf2\xb2\xdf\x36\xf8\x6d\x83\xdf\x36\xf8\x6d\x83\xdf\x36\xf8\x6d\x83\xdf\x36\xf8\x6d\x83\xbf\xd1\x06\xf1\x5f\xff\xe7\xcb\x7f\xbf\x49\x7f\x53\x92\x06\x1b\x04\x61\x00\x67\xf1\x87\x17\x69\xd7\xcb\x21\x1d\x8a\x33\xcd\x7c\x13\xe2\x93\x4d\x56\xcf\x83\xb1\xbc\x0a\x78\x48\x4e\x5a\xd5\x31\xc7\xfb\x2b\xa2\xe5\xac\xdd\x32\x42\x42\xc9\x16\x55\xa1\xa5\x94\xc5\xd3\x54\xcc\x2e\x27\x62\xec\xba\xd3\x8f\x3a\xe5\x6a\xb8\x58\x83\x72\xc1\x5a\xae\xe7\x01\x18\x88\x92\x2c\x64\x97\x2b\xe4\xcc\x64\x9a\x67\x66\x7c\x9b\x52\xc7\xc5\x63\xfa\x55\xb1\x9e\xcc\x89\x1f\x49\xdf\x72\x62\x1e\xd5\x3a\x6d\xbd\x54\x1d\xe3\xd1\xdc\x51\x87\x03\x89\x0a\xa2\xf9\xd8\x09\xc5\x6e\xdd\x6b\x8f\xf5\x0c\x19\xc8\x93\x76\x2b\x5b\x64\xe4\xfc\x54\x5e\x65\xc7\x0e\x61\x88\x14\x0e\xc9\xcc\xc2\x12\x6b\x76\x47\x6f\xe5\x86\x2d\x7f\xd9\xa8\x74\x66\x4a\x6e\xe5\xe4\x69\x5a\x59\xac\x4e\x7c\xf2\xc3\x27\x67\xc3\x73\x8f\xcc\x39\x34\x45\x77\x22\xe1\x6e\xcb\xf2\x74\x65\x3e\x9b\xf4\x8b\x2b\x95\x53\xe6\xde\xc8\x6f\x16\x0b\x73\xc9\x1b\x18\xa1\x9f\x97\xf1\xa9\xb1\x42\x6d\x71\x96\xaf\x19\xf4\x28\x1c\x2c\x55\xa1\xac\x2e\x7c\xda\x2c\x54\xba\x54\xb7\xd9\x97\x00\x5f\x58\x77\xd9\xf6\x12\x8e\xcc\xa8\x9e\xe7\xf8\xdd\x14\x90\x18\x70\x62\x6f\x4d\xce\xdb\x91\xea\xfa\x4e\xbf\x37\xe9\xe1\xe3\x01\xdd\x68\xdb\x3c\x6b\xb5\xf9\xb9\x60\x65\x0d\x7f\x11\xf5\x49\xdc\xee\x97\x9c\x59\x16\x18\x4c\xdb\x46\xd3\xfe\xc8\xd6\xac\x72\xbe\x41\xd2\xd3\xea\x32\x20\x2b\xd3\xb6\xee\xd5\x36\xb0\xb9\x31\xea\x82\xad\xdb\x4f\xfb\x9b\x79\xfc\x73\xf9\xec\xea\x43\x7c\x8d\x3e\xe6\xbf\x4d\x69\xb0\xae\xe5\xd0\xc8\x09\x43\xdd\xee\x15\xfa\x8b\xec\xa2\xa1\x2d\xa4\x4a\xa0\xf0\x6d\xa5\x47\xf7\x03\xaf\x10\xf0\x53\xd4\x99\x78\xa3\x72\x7d\xd2\x2f\xb6\xb2\x9e\x9f\xc5\x89\x79\x53\xd8\x00\xa4\xd5\x48\xe8\x59\x51\x40\xb8\x2b\x67\xec\xb6\x8c\x3e\x59\xef\x91\x59\xc3\x5d\xee\x9c\xbc\x10\x94\xd9\x96\xe4\x04\xb3\xbe\xb2\xce\xcc\xc7\xb5\x10\xaf\x72\xec\x66\x59\x9c\xe4\x78\x2d\xca\xb7\xad\xae\x4f\x8f\x0d\x01\xad\x0b\x05\xef\xe4\x2f\x4a\x9f\x2e\xe2\x68\x5c\x67\xc5\xb5\x90\xc7\x1b\x41\x49\x32\x17\x90\xe0\x08\xa2\x2b\xf0\xc3\x09\xed\x28\x53\x47\x68\x72\xcc\x34\x4f\x2d\xe2\xe2\xc6\x0f\xc9\xa7\xe7\x2f\xfd\x2f\x61\x6a\x7f\xae\xb2\x0a\xaa\x03\x73\xb2\xaa\x81\x6e\x43\x60\x73\x1b\x23\x10\x10\x0e\x3d\x5f\x1d\x0d\x36\xb9\x7e\x65\x5a\xf4\xaa\xdc\x74\x31\x8d\xa7\x6b\x73\xbd\x9e\xba\x7b\x50\xcc\x13\x51\x4e\x2f\x7b\x9d\xc8\xac\x2d\x9a\x61\x81\xcb\x8d\x65\x85\x52\x91\xa0\xf7\x1a\x46\x49\xce\x54\x2c\xa6\xb2\xe8\xd6\x33\x23\x31\xe4\x76\xeb\x97\x7c\x6f\x6d\x79\x27\xfd\xe5\x23\xdf\xa6\x04\x51\x45\x1b\x46\x33\xb7\x6f\x77\x91\xdf\x65\x71\xd3\x98\x15\x4d\x5e\x9d\x92\x80\x12\xd9\x66\xad\x6d\xf4\xcc\xa6\xa7\x16\x47\x75\x65\xa2\x72\x1b\x48\x2f\xb9\x49\x6e\xb5\xb4\x8a\x72\xd7\x62\x67\xeb\x41\x45\x55\x9b\x33\x85\xac\x37\x57\x1d\xb7\x47\x9b\x81\x60\x17\x7c\xb3\x79\x2a\xef\x93\xd3\x41\xef\xc5\xe1\xc3\x5e\x4e\xbb\x0f\xc5\xd3\xe3\x30\x81\xdf\x83\xe4\xa2\x70\xe9\xf9\xd3\x19\x08\x82\xd9\xd8\x07\x01\x4a\x41\xea\xa0\x20\xc4\xda\x85\x22\xa6\xee\x84\xb1\x1f\x58\x1b\xcd\x42\xe4\x68\xc8\xc7\x48\x9c\x60\xee\x51\x64\x78\x3e\x44\x01\x9c\x79\xee\xb6\x0f\xb4\x41\xe4\xc2\xf1\xa5\xa2\xf8\x43\xec\xbb\xfa\xa1\x78\x7e\x69\xff\xa2\x63\x90\x5e\xfe\xfd\xe4\x55\x68\x39\x71\xb7\xfa\x7a\x39\x97\x75\xea\x83\xbf\x8e\x41\xf0\xf5\xfb\xee\x33\xf0\x2f\x89\x5e\xf7\xab\x81\xd0\x7d\x82\x0e\x58\x85\xab\xc0\xda\xdc\x29\xee\xa3\x78\x02\xed\x1d\xe1\xfb\xbb\xe4\xf8\xfb\x45\x7d\xff\x1d\x51\x8a\x29\x9e\x5e\x5b\xbe\x3e\x43\x79\xe5\x2b\x85\x8f\xce\x50\x26\xbe\x54\xf8\x8c\x37\x25\x89\x57\xec\x99\xb7\x18\x5f\xba\xed\xc2\xcb\x2b\x26\x90\x24\x45\x71\x24\x4e\xb1\x3c\x43\x73\x1c\xc3\xe3\xdc\x2b\x46\xe0\x04\x49\xd1\x0c\x8e\xe3\xb1\x1a\xfa\xbe\xd7\x16\xaf\xbe\xe9\xfe\x61\x43\x25\xdf\x76\x3f\xc5\x03\x8d\x12\x78\xa4\xd1\x00\xf1\x02\xc7\xb0\x14\xc9\xb0\x34\x05\x81\x4e\x12\x50\xa0\x11\x41\x69\x06\xc4\x39\x5a\xa3\x48\x0a\x21\x9e\x42\x04\x4d\x68\x06\x87\x13\x80\xd1\x05\x9c\x36\x88\xc3\x8b\x53\x67\xa3\xb7\xda\x45\xf4\xce\x59\xd9\x1c\xae\xe0\x95\xd2\x3a\x1c\x2f\x55\xc2\x1e\xe2\x60\x3d\xf3\x08\x41\x2d\xaf\x16\x4a\x7e\x5d\x67\xc2\x9c\x04\xf3\xbd\xc5\xb2\x28\x2c\x29\x33\xf4\xeb\xee\xe8\xb2\x57\x4c\xbb\xae\xbe\x80\x17\x47\xc3\xfc\x33\xfa\x87\xd9\x0c\xbc\xec\x7d\xee\xd3\xff\x76\x31\x28\xdd\xee\x86\xc0\x41\x60\x18\x40\xe3\x21\xc1\xe2\x24\x05\xa8\x6d\x83\x22\x58\x06\x6a\xb8\x46\x19\x06\x01\x00\xa9\x03\x83\xc6\x71\xdc\x40\x06\x2d\xe8\x24\x81\x0c\xc8\xd3\x9c\xae\x6b\x86\x86\xc0\xce\xee\xe4\x5b\xbb\xff\x4b\xe5\xfe\x2c\xbb\xf3\x89\x01\x51\xea\x2b\x68\x4f\xda\x5d\xd3\x69\x9e\xd5\x35\x5d\xc7\x49\x9d\x66\x71\x9e\xe0\x58\x8e\x80\x34\x60\x00\x87\x04\x9d\x45\x3c\xcb\x40\x40\x0a\x50\xa3\x09\xc4\x92\x3a\x07\x80\xc1\xe1\x80\x34\x10\x62\x34\x8a\xd5\xd1\xfe\xb5\xaa\x9b\x76\xcf\x47\x1e\xe5\x85\x34\x33\xcf\x37\xa4\xd5\xac\x99\xa5\xbc\xb2\x9a\xd9\x10\x5c\x6b\x6d\x05\x84\x6d\xd4\x8a\x43\xa7\xd9\x37\xfd\xa8\x9d\xe9\xc4\xf2\x95\x6e\x3e\xb3\x2f\xd4\xe5\x3a\xdb\xfd\x76\x2f\x3c\xa7\xbf\x0e\x1f\xd3\x7f\xaf\xdd\x19\x92\xa6\x20\x2b\x50\xb4\x81\x1b\x1a\x83\x13\xdb\xa0\xc8\xb3\x02\x00\x94\x66\x18\x0c\xa5\xeb\x90\xe2\x05\x68\xf0\x04\xcf\x12\xd0\x00\x88\x25\x70\x08\x49\x92\x01\x00\x11\x3c\x84\x70\xff\x72\xd0\x6d\xbb\x7f\x70\x94\xf7\x29\x76\x97\x9e\xd3\xff\x9c\xdd\xaf\xf6\x19\x9f\xd3\x61\xfc\xdd\xbd\x45\x49\xe1\xcb\xcd\x45\x73\xaa\x55\xc9\xb2\x48\xf5\x7b\x93\x96\x5f\x75\x26\x03\x1c\x37\x4a\x7c\xa0\xc8\x9c\x83\x4b\xad\x65\xa5\x9f\x15\x07\x94\x78\xcc\x15\xe2\xeb\x46\xae\xb0\xbb\x42\xcd\x1c\xb4\x58\x89\xf3\x0a\x0a\xae\x34\x33\xcb\x61\x3b\x2f\x6c\x06\x8b\x41\xaf\x43\xad\xac\x86\x35\x8c\xda\x1a\x51\x58\x38\x4d\x05\xf1\x71\xd5\xf5\xc4\x45\xf2\x1d\xed\xdc\x2e\x2a\xc5\xf5\x3b\x9c\x34\x61\xa3\x43\x96\x98\xf1\xdc\xcd\x39\x66\xa9\x84\x4c\xa1\xc2\xdb\x34\x24\x24\xb7\x6b\xaf\xa6\xb6\x64\x97\x85\x60\x3e\xf2\x71\x81\x23\x8a\x6c\x5d\xe9\x1b\x28\xeb\xd0\xd3\x59\x31\x94\x33\x81\x8c\x5b\xc4\x5c\xb1\x42\x46\xc4\x2b\xeb\xbe\xab\x8d\x87\x4a\x9f\xf1\xb6\x83\x84\x17\x72\xe3\xd4\xc3\x2a\x5b\xd1\xfb\x35\x7b\x54\x58\x87\x32\xb4\xeb\x12\x97\x15\x75\xa5\x36\xe1\xbc\xc6\xb8\xa9\x09\xcb\x92\x4d\x36\x3b\xab\xd3\xab\x8d\x37\x6c\x70\xf2\x8c\xb3\xa5\xe5\x84\xec\xee\xdd\x49\xf1\xdf\x8b\xd2\xe2\x27\xf4\x12\xc5\x4e\x3f\x17\x3c\xa1\x5f\x14\xff\xbd\xa8\x91\x16\x2d\xff\xee\xa1\xc1\xe3\x8d\x2c\x7f\xc1\xfe\x8d\xc3\x7d\x30\x21\xbf\xd1\xc8\x72\x4e\x75\xd6\x36\x17\xfe\xb2\x5a\x27\xf1\x41\xbe\x6e\x0c\x8d\x41\x50\x92\xa4\x6e\xb8\x1c\x02\x20\x19\xf3\x76\xc4\xae\x9d\x8a\x63\x17\x1c\x90\x91\x07\xac\xcc\xc9\xa6\xa9\x75\x47\x35\x0f\x36\xf5\x91\x40\xcb\x35\xd1\xa8\xea\x4d\x51\x9d\x0f\x34\xb9\xce\xad\x83\x25\x42\xb5\xfc\xb6\x21\x64\x06\xeb\x45\xc6\x9f\xe4\x86\xf9\xfa\x04\xc9\xcd\xfe\x40\xc9\x6f\xb2\xab\xb9\x45\x2e\x9a\x62\x21\x23\x54\xf0\x31\xc7\x8f\xcb\x94\x96\xc9\x9c\xf2\xfd\x7f\xbf\x91\x3d\xeb\xe4\x4f\x36\xb2\x39\x97\xed\x14\xe0\x67\x36\xb2\x7f\x70\x48\x74\x57\x23\xfb\xe4\x71\x60\x95\x9d\x20\x8b\x9a\x38\x9e\xcc\x77\x4a\x76\x21\x8b\x4c\x48\x71\x8d\x41\x58\xae\x56\x37\xfd\x1e\xbf\xec\x59\xa3\x1c\xc8\x47\x8c\xc2\xc4\x9e\x71\xdf\xac\xd7\x50\x7c\x78\x16\x8b\xca\x1e\xaf\x13\x5e\xe9\xa8\xbf\x99\x13\xa6\x4e\xb5\x4f\xce\xa9\x05\xd7\x34\xd6\x7c\xa3\x86\xa6\x92\x46\x74\x3a\x32\x63\xad\xe6\x53\x19\xcf\x79\xe6\xc0\xaf\x87\x9c\x59\x27\x58\xb2\xa9\x4d\xc7\xa4\xde\xee\x74\x0d\x54\xf0\x16\x10\x6f\x88\xc0\x18\x17\x06\xab\x70\xdc\x13\xed\x40\x89\x26\x76\xce\x59\x4f\x72\xe2\x30\x6e\x14\x8b\xee\x38\x5c\xe8\x62\xd8\x32\xcd\xc1\x68\xb5\xaa\xf6\x5d\x56\xd7\xbc\x11\xf4\x66\x6b\xbc\xec\x28\x83\xf9\x02\x56\x95\x0c\xa3\xa9\xe1\xc9\xbf\xd2\x1b\xdc\xf0\xbc\x52\xcf\x1a\x5c\x6c\xbb\xdd\x98\x37\xf1\xc5\xc1\x03\x01\x69\xe2\x9e\xea\xe2\xca\x75\x25\x0f\x3a\x6b\xf0\x9f\xa2\xff\x4a\xb0\xb9\x47\x7f\x4d\xfc\xdc\x1c\xe0\xa1\xdc\xef\xb3\xf5\xbf\xb5\xc7\xed\x80\x53\x38\xc9\x7c\x54\x7f\xb1\xd7\xc5\xf7\xe0\x1f\x9c\xc1\xde\x57\xc5\xa9\xc1\x2d\x2f\xed\x77\x57\x40\xfa\xe4\x04\xe9\xf7\x34\xfc\x23\xd3\xf0\x71\x90\xe9\x4e\x1b\xa5\x29\xce\x37\xc2\x66\x91\xea\xcb\x00\x78\x5c\x96\x68\xe8\x4b\xda\x6d\x98\xc3\x21\xcc\x44\xc3\xe6\x26\x5f\x01\xfe\x78\x52\x3b\xb5\xfc\xf4\x00\x76\xe1\x04\x57\x02\x58\xd2\xe0\x0f\xa4\x2d\x4f\x07\xb0\x4f\xd4\xff\x58\x00\x3b\x25\xf3\xff\x43\x1b\xb0\x78\x9e\xec\xff\xd3\xfc\x0a\xab\x41\xb5\x3a\x7e\x37\xc0\x5c\x99\x0c\xb8\xb1\x69\xc5\x47\x67\x04\x2e\x36\xae\x38\xc4\xae\x64\x4a\xbf\xfb\x80\xf5\xe4\xeb\x29\xc1\xef\x3a\xca\x31\x67\xd9\x7d\xf6\xfa\x06\xe5\xea\x46\xbb\x6f\xf7\x1f\x3f\x6e\x30\x7c\xd8\xdc\xe2\x9d\x62\x26\x37\x42\x8f\xb7\x3f\x4f\x20\xc6\x8b\x2a\x62\xa1\x90\xb2\x25\xe8\x51\x21\xd6\x68\xc9\x35\xb1\x35\xc4\xaa\xd2\x10\xfb\x76\xdc\x2d\xe9\xf5\xb8\x15\xef\xd5\x8d\x71\x2f\xb6\x64\xff\x2c\xe2\xc1\x0d\xd6\xc1\x2d\xca\x69\x1b\x95\x9e\x76\xa1\x7f\x9a\x9e\x06\xdc\x34\x66\x07\x05\xe7\xa4\x76\x7b\xa3\xdd\xde\xc5\xf4\xe6\xf6\xfb\x4f\xd3\x3d\x03\x4f\x23\x7e\x43\x3b\xd6\x55\xe5\x66\x57\xc2\x4e\x1b\xa6\x7c\xa8\x24\x9f\x63\xef\x0f\x16\xe0\x6d\x1d\x9c\x36\x76\xbd\xb2\x29\xe9\xd9\xa1\x0d\x4f\xf3\xdd\x81\xa5\x11\x4d\xa8\x39\x67\xb8\xdf\x2a\x33\x7d\x8b\xcc\xe4\x09\x15\x4f\x93\x8b\xb1\xd2\xb8\x9d\x94\x9c\x53\xb3\x66\xaf\xf1\xc6\x99\x37\xb7\x84\x4c\x39\x99\xe3\x79\xa6\x09\xc8\x54\xc2\x97\x2a\xd3\x2a\xfd\xca\xbe\x91\x67\xe7\x93\x7c\x06\xd3\x20\xd2\xae\x70\x3c\xa8\x39\x67\x17\x6f\x39\x79\x63\x13\xc9\x37\x87\xb2\x3c\x4d\xf2\x04\x98\x46\xf4\x42\xdd\x5d\x31\x2c\xf1\x59\xd1\xe5\xd1\x34\x4f\xb3\x3d\x01\xa6\xb1\xbd\x50\x77\xce\xf6\xb0\x15\xe3\x8d\xad\x0e\xdf\x1c\xd1\xf3\x3c\xdf\x23\x60\x2a\xdf\x73\x75\xe7\x7c\x8f\xbb\x25\xde\xd8\x05\xf1\xcd\x59\x45\x4f\x13\x3e\x01\xa6\x11\xbe\x50\x77\x75\x68\xb0\xdb\x05\xf1\xf5\xb4\xc5\xe1\xcd\x6d\xee\x52\xce\x72\x7a\xbe\x1c\x09\xc8\xd4\x92\x5c\xaa\x4c\x8b\x12\x01\x9a\xbf\x1e\xf6\x75\xbb\xbe\x05\xdd\xe5\x19\x57\x9f\xc0\xfd\x26\xf1\xa7\x58\x5f\x0c\x51\xd3\x4e\xfe\x7a\x9a\xff\x39\x68\x5a\x21\x52\xd4\x5e\x2d\x49\x72\x7b\xb8\x6b\x43\xcd\xe3\xa9\x68\x7b\xee\xf1\x19\x6a\xf7\x6d\x5c\xb7\x3b\x6e\xed\x02\x07\xab\xab\xa7\x51\x6c\xb7\x2d\xab\x25\x4c\x0b\x7d\x84\xb0\xc3\x2e\x95\x7f\x60\xfd\xb2\xd4\x92\xb0\xe4\xae\x95\xc4\xf1\x4d\xe2\xb7\x03\xcd\xf3\x83\xde\x1e\x65\x79\x0e\xb3\x25\xb9\x1f\xa7\x9c\x51\x4c\x6e\x5d\xfe\x9a\xdc\xa8\xfc\x75\xb7\x81\xf8\x1b\x76\xa7\xd3\xea\x1e\x25\x76\x44\xd8\x72\x3a\x35\x8c\x33\x5a\xd7\x87\x8a\x67\xe7\xea\x3d\x43\xe1\x00\xb2\x63\x91\x08\x30\x77\x12\x39\x3b\x0a\xf0\x51\x22\x49\x90\x2d\x91\xf3\x81\xf0\x9d\x4c\xce\x8e\x2f\x7c\x94\x49\x12\x64\xcb\x24\xf1\xf1\xf6\xfd\x34\xce\x8e\x5c\x7c\x82\x49\x12\x67\x4f\xe6\x30\x4a\x38\x27\x93\xdc\x9e\xf8\x56\xf8\x7a\x8e\xd1\x25\xd0\x96\xd2\x45\x6c\x7c\xd7\x46\xd7\x4e\x1a\xc5\xa0\xe7\xcc\x6c\x14\xa2\x58\xed\xff\x0d\x00\x00\xff\xff\x8c\x3b\x91\x52\x96\x74\x00\x00") - -func asset_stat_trustlines_6CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_6CoreSql, - "asset_stat_trustlines_6-core.sql", - ) -} - -func asset_stat_trustlines_6CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_6CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_6-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa5, 0x34, 0x96, 0x3c, 0xb9, 0xf5, 0xae, 0xdc, 0xff, 0xb3, 0x8a, 0x77, 0xbd, 0x9f, 0x33, 0xec, 0x29, 0xf, 0x92, 0x72, 0x16, 0x33, 0xf9, 0xd0, 0xd9, 0x97, 0xf, 0xcc, 0x12, 0x52, 0xf9, 0xca}} - return a, nil -} - -var _asset_stat_trustlines_6HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x79\x6f\xe2\xc8\xd3\xf0\xff\xfb\x29\xac\xd1\x4a\x99\x51\x32\x13\xdf\xc7\xec\x33\x3f\xc9\x80\xb9\x31\x77\x02\x59\xad\xac\xb6\xdd\x06\x07\xb0\x89\x6d\x20\x64\xf5\x7c\xf7\x57\x3e\x00\x63\x7c\x71\xcc\xec\xfe\xde\x07\x8d\x46\xc1\xae\xae\xab\xab\xba\xaa\xab\x9b\xee\xaf\x5f\x7f\xfb\xfa\x15\xe9\x98\xb6\x33\xb1\x60\xbf\xdb\x44\x54\xe0\x00\x19\xd8\x10\x51\x57\x8b\xe5\x6f\x5f\xbf\xfe\xe6\xbe\x2f\xad\x16\x4b\xa8\x22\x9a\x65\x2e\x0e\x00\x6b\x68\xd9\xba\x69\x20\xdc\x37\xfa\x1b\x16\x82\x92\xb7\xc8\x72\x22\xb9\xcd\x23\x20\xbf\xf5\x85\x01\x62\x3b\xc0\x81\x0b\x68\x38\x92\xa3\x2f\xa0\xb9\x72\x90\x1f\x08\xfa\x87\xf7\x6a\x6e\x2a\xb3\xd3\xa7\xca\x5c\x77\xa1\xa1\xa1\x98\xaa\x6e\x4c\x90\x1f\xc8\xdd\x70\x50\x66\xef\xfe\xd8\xa1\x33\x54\x60\xa9\x92\x62\x1a\x9a\x69\x2d\x74\x63\x22\xd9\x8e\xa5\x1b\x13\x1b\xf9\x81\x98\x46\x80\x63\x0a\x95\x99\xa4\xad\x0c\xc5\xd1\x4d\x43\x92\x4d\x55\x87\xee\x7b\x0d\xcc\x6d\x78\x44\x66\xa1\x1b\xd2\x02\xda\x36\x98\x78\x00\x1b\x60\x19\xba\x31\xf9\x23\xe0\x1d\x02\x4b\x99\x4a\x4b\xe0\x4c\x91\x1f\xc8\x72\x25\xcf\x75\xe5\xc1\x15\x56\x01\x0e\x98\x9b\x2e\x18\xdf\x1c\x08\x3d\x64\xc0\x17\x9a\x02\x52\x2b\x23\xc2\xa8\xd6\x1f\xf4\x91\xb6\xd8\x1c\x07\xf0\xdf\xa6\xba\xed\x98\xd6\x56\x72\x2c\xa0\x42\x1b\x29\xf5\xda\x1d\xa4\xd8\x16\xfb\x83\x1e\x5f\x13\x07\xa1\x46\xc7\x80\x92\x62\xae\x0c\x07\x5a\x12\xb0\x6d\xe8\x48\xba\x2a\x69\x33\xb8\xfd\xe3\x57\x10\x54\xbc\xbf\x7e\x05\x49\xd7\xae\x7e\x9d\x80\x3e\xb5\xf3\xa5\xf3\x19\x74\x0d\x39\x8d\x58\x08\xea\x80\xdc\x03\xaf\x89\x25\x61\x14\x82\x0c\xd0\x7a\x5c\x49\x50\xd3\xa0\xe2\xd8\x92\xbc\x95\x4c\x4b\x85\x96\x24\x9b\xe6\x2c\xbd\xa1\x6e\xa8\xf0\x5d\x0a\x09\x67\xd8\xc0\x33\x74\x5b\x32\x0d\x49\x57\xcf\x69\x6d\x2e\xa1\x05\xf6\x6d\x9d\xed\x12\x5e\xd1\xfa\xc0\xc9\x55\x5c\x9c\xd7\x76\x0e\xd5\x09\xb4\xbc\x86\x36\x7c\x5b\x41\x43\x39\x4b\x84\x50\xf3\xa5\x05\xd7\xba\xb9\xb2\x83\x67\xd2\x14\xd8\xd3\x0b\x51\x5d\x8f\x41\x5f\x2c\x4d\xcb\x75\xc7\x60\x4c\xbd\x14\xcd\xa5\xba\x54\xe6\xa6\x0d\x55\x09\x38\xe7\xb4\xdf\x19\xf3\x05\xa6\x14\xf8\xe5\x05\x4c\x87\x5b\x02\x55\xb5\xa0\x6d\xa7\x37\x9f\x3a\x96\xea\xc5\x1d\x69\x6e\x9a\xb3\xd5\x32\x07\xf4\x32\x8b\x25\x1f\x0a\xe8\xd6\x99\x88\x77\x83\x6e\xee\x06\xee\x38\xa1\x69\xd0\xca\x07\xba\x43\x7f\x41\x93\x40\xad\xf9\x1a\x79\x43\xeb\x19\x44\xc2\x43\x71\x56\x8b\xa5\xdb\x60\xea\x64\xf6\x80\x7d\x34\x00\xc9\xdb\x4c\x33\x9a\xee\x3d\x3d\x0f\xb0\xe9\xf3\x61\x66\x02\xea\xb6\x23\x39\xef\xd2\x32\x1b\xa5\x0b\x69\x2e\xf3\x42\xc2\xbc\x60\xbb\x50\x92\x0e\x2c\xef\xdc\x3d\x13\x2c\x7b\x14\x93\xb7\xf9\x3a\xd3\x8f\x91\xae\xb6\x6d\x7b\x95\x45\x79\x0f\xac\x98\x2a\x3c\x33\x2f\xd8\x9b\xc1\x12\x58\x8e\xae\xe8\x4b\x60\xa4\x06\xef\xac\xa6\xd2\xf2\xcc\xdc\x64\x1f\xd1\xce\xe5\x20\xbe\xe1\xd9\xf4\x3d\xe5\xe5\xa1\xe7\x03\xfe\x74\xfc\x7e\x67\xba\x3d\x19\xfc\xe9\xc6\x87\x5d\xea\xe7\x19\x83\x94\x93\x83\x89\x69\x2d\xa5\x85\x3e\x09\x12\x86\x14\x16\x22\x90\xb9\x65\x3c\x3f\xdf\x4b\xc3\x9c\xd7\x38\xfd\xd6\xc5\x76\x73\xd8\x12\x11\x5d\xf5\x29\x97\x84\x32\x3f\x6c\x0e\x72\xe2\x4e\x30\xba\x1b\x60\x0e\xba\x3b\x1d\x93\xf7\x2d\xbf\xf8\xbb\x28\xdd\x17\xba\x43\x41\x2c\x5e\xa0\x33\x37\xcf\xb6\xe1\xdb\xd9\x94\x8f\x90\xe4\x6e\xad\xc2\x9c\xb0\x87\x6c\x36\xb7\x84\x09\x5e\x7f\x8e\x7c\xf1\x28\xf2\xb5\x0d\xf2\xbe\x7c\xc0\x41\x92\x97\x5b\xb6\x60\x04\x38\x47\x16\xbf\x49\x4e\xd8\x20\xfd\xcb\xcf\xcf\x2e\x5f\xcc\xc3\x51\x64\x0c\x49\x07\x0e\x0d\x09\x01\x20\x5f\xa9\xf4\x84\x0a\x3f\x88\x01\x5e\xe8\xee\x8c\x43\x57\xe0\x67\x63\xb5\x80\x96\xae\xfc\xf9\xd7\x97\x1c\xad\xc0\xfb\x05\xad\xe6\xc0\x76\x3e\x03\x63\x0b\xe7\x5e\x29\x26\x47\x0b\x4d\xb7\x62\x9b\x94\x87\x62\x71\x50\x6b\x8b\x29\xf2\x48\x60\x32\x39\x70\xf7\x80\x9c\x30\x9a\x82\x63\x27\xdd\x15\x38\x5c\x59\xbd\xe6\x07\xe6\x1f\x90\x73\x04\xf1\x44\xcf\x81\x41\x18\x0d\x04\xb1\x1f\x41\x31\x5f\x4e\xec\xb7\xf9\xce\x16\x8b\x55\xa1\xc5\x9f\x50\xf8\xe3\x37\xbf\x0a\x27\x82\x05\xfc\xbe\x7b\x86\x0c\xb6\x4b\xf8\x3d\x68\xf2\x07\xd2\x57\xa6\x70\x01\xbe\x23\x5f\xff\x40\xda\x1b\x03\x5a\xdf\x91\xaf\x5e\x71\xae\xd8\x13\xdc\xfe\x0a\x30\xef\xf0\xfd\x76\x84\xf1\xf8\x65\x80\xb8\xd8\x6e\xb5\x04\x71\x90\x82\xd9\x07\x40\xda\xe2\x31\x02\xa4\xd6\x47\xee\x76\x65\xb7\xdd\x33\xdb\x43\x72\x17\xa5\xbc\x13\x3f\xa0\xb9\xd7\x50\xa6\x3c\x47\xba\x14\xdb\x83\x88\x3e\x91\xe7\xda\xa0\xba\x67\x2b\x5c\x7f\x3b\x22\x7f\xc0\x12\x61\xe4\x1c\xe1\x4f\x90\x78\x0a\xe8\x34\x1f\x97\x93\x7e\xb7\x89\x2c\x2d\x53\x81\xea\xca\x02\x73\x64\x0e\x8c\xc9\x0a\x4c\xa0\xa7\x86\x9c\xf5\xc2\x30\xbb\xd9\x86\x16\xb0\xbf\xb3\xd5\x03\xff\xbb\xbe\x8d\xd3\xe5\xde\xb2\x33\xf1\x23\x3d\x61\x30\xec\x89\xfd\xd0\xb3\xdf\x10\x04\x41\x9a\xbc\x58\x19\xf2\x15\x01\xf1\xa4\x6f\xb5\x86\xfe\x78\xd7\x1f\xf4\x6a\xc5\x81\x07\xc1\xf7\x91\xdf\xa5\xdf\x91\xbe\xd0\x14\x8a\x03\xe4\x77\xcc\xfd\x16\xed\x8d\x4c\x47\xbc\x4e\xba\x2c\xf4\x37\x13\x0e\x8f\x13\x2e\xcf\x48\x75\x9d\x7c\x39\x28\xec\x45\xdc\x3f\xba\x48\xc2\xcf\xbf\x21\x48\x91\xef\x0b\xc8\x73\x55\x10\x91\xdf\xb1\x3f\xb1\xbf\x1e\x7f\xc7\xfe\xc4\xff\xfa\xcf\xef\xb8\xf7\x37\xfe\x27\xfe\x17\x32\xf0\x5f\x22\x42\xb3\x2f\xb8\x4a\x11\xc4\xd2\x97\x58\xcd\xe4\x88\x03\x57\x6a\x26\x9b\xc2\xcf\xd6\xcc\xff\x5c\xa2\x99\xd3\x98\x1a\xe8\x61\x1f\x87\xf3\x29\xe2\x10\xb6\x4f\x30\x7a\x1c\x23\x48\xdf\xd5\x15\xf2\xe3\x30\x02\x3c\xf8\x8f\x07\xe3\x8e\x80\xfc\x08\x7b\xc4\x97\x38\xaf\xbd\x29\x8f\x51\x84\x11\x16\x77\x6e\x9c\x9f\xc3\xd8\x14\xe8\x5a\x2e\xe3\x90\x46\x38\x3d\x72\xc8\x63\x76\x0f\x56\x76\xca\x6d\x5c\x9a\x77\x35\xb7\x31\x48\xa3\xdc\x86\x9d\x24\x95\x5b\x37\x72\xa9\x50\x03\xab\xb9\x23\x39\x40\x9e\x43\x7b\x09\x14\x88\xfc\x40\xee\xee\xfe\x38\x7e\xbb\xd1\x9d\xa9\x64\xea\x6a\x68\x29\xed\x48\xd6\x70\xfe\x1b\x88\xe8\x39\x58\x3e\xf1\x7c\x5f\x0c\x4f\xbe\x7d\x89\x74\x15\x91\xf5\x89\x6e\x38\x5e\x62\x20\x0e\x9b\x4d\x5f\x1c\xb0\x70\xd3\x78\x44\x99\x02\x0b\x28\x0e\xb4\x90\x35\xb0\xb6\xba\x31\x89\x80\x19\xab\xc5\x3e\xe5\x47\x74\xc3\x81\x13\x68\x45\x40\xb4\x39\x98\xd8\x88\xbd\x00\xf3\xf9\x29\x19\xc7\x5c\xcc\x4f\x89\x7c\xc6\x29\xea\xcb\x1e\xf2\xb4\xdb\xa3\xf3\x86\x4b\xd5\x11\xad\x76\xec\x55\xe2\xc0\xf7\x13\x85\x2c\x97\x73\xdd\xab\xd9\x23\x8e\xbe\x80\xb6\x03\x16\x4b\xc4\xed\x33\xef\x2b\xf2\x61\x1a\xf0\x94\xd1\xa4\x59\xd1\x2e\x1f\x0d\xa6\x53\xf9\x78\xde\x4f\xbe\x12\xb0\x06\x66\xc8\xf7\x06\x7e\x46\x87\x79\x0f\x6a\x62\xb1\x27\x78\xe9\x57\x61\x1c\x3c\x12\xdb\x48\xab\x26\x3e\xf1\xcd\xa1\xb0\xff\xce\x8f\x0e\xdf\x8b\x7c\xb1\x2a\x20\x58\x96\x30\x17\xab\x3d\x8a\xe8\xc4\x14\x83\xa2\x07\x62\xc0\x77\x67\x0d\xe6\x9f\xef\x12\x24\xbe\xfb\xfe\xdd\x82\x13\x65\x0e\x6c\xfb\x4b\xb4\xbb\xfc\xb5\x8a\x18\xdb\xa2\xc9\x2f\x29\x1d\xe5\xcf\x8d\xaf\x96\xcc\xaf\xe8\xec\xe5\x8a\xf7\x8c\x43\xad\x2e\x9e\xcd\x58\x70\xc5\x54\xe3\xc0\x31\x3c\x1e\xdc\x2f\xff\xc5\x34\xa0\xe8\x34\x0f\x8b\x2f\x2f\xdc\xc8\x6c\xc3\x38\x7f\x99\xd1\xa6\x09\x82\xb4\x9f\x45\xa1\x84\x14\xc6\x19\x12\xf9\x15\xba\x74\x81\xf6\xb8\x22\xaf\xbf\xe9\x6a\x12\x6f\xbb\x9a\xcf\xb5\x56\x17\xe0\x09\xcc\x2e\xe2\x33\x52\xd2\x48\x7f\x5a\xe2\x4a\x82\xfc\xe4\x2d\x7c\x7c\x4a\xb0\x66\xcf\x8e\xe3\x5f\xa9\xd0\x01\xfa\xdc\x46\x5e\x6d\xd3\x90\x93\x8d\x6d\x57\x28\xbb\x56\x0f\x01\x9e\x40\x0f\xbb\x75\xeb\x04\xde\x42\x8b\xc9\xb9\xbc\x30\x6e\x1d\x3b\xbe\x61\xa0\x96\x50\x65\xd4\xeb\x88\x3d\x1f\xbb\x51\x0e\x8d\x50\x38\x74\x44\x3e\xf8\xfd\x62\x72\x24\x30\x99\x2b\xe7\x10\x9b\xa2\x6d\x2c\x08\x9c\xcc\x46\x3e\xec\x6a\xa9\xe6\x86\xdd\x9b\x4e\xf0\x35\xb2\xce\x7e\x22\x0b\x76\x92\x0f\x38\x60\x2e\x29\xa6\x6e\xd8\xf1\x36\xa8\x41\x28\x2d\x4d\x73\x1e\xff\xd6\x5b\xf9\xd4\x60\x52\x5f\x7b\xaf\x2d\x68\x43\x6b\x9d\x04\xe2\xe6\xa1\xce\xbb\xe4\xa5\x49\xfa\x47\x12\xd4\xd2\x32\x1d\x53\x31\xe7\x89\x72\x45\xfb\x68\x67\x2c\x10\xa8\xd0\xf2\xd2\x0b\xff\xb9\xbd\x52\x14\x68\xdb\xda\x6a\x2e\x25\x1a\x4a\x20\x38\xd0\xe7\x50\x4d\x86\x4a\x76\xab\x84\xda\xf5\xb5\x5e\x96\xb0\x1e\x92\x11\xf3\xf2\x8f\x36\xd9\xe3\xd7\xb9\x22\xdf\x36\x8c\xa5\xd2\xf8\x55\x61\xed\x2c\x41\xaf\x0c\x73\xa9\xb4\x4e\xc3\x5e\x3c\x78\x4a\x18\x0c\xad\xec\xdc\xcc\x36\xb3\xa6\x39\xc7\xbb\xaa\x12\xa6\x42\x6e\xe6\xaf\xf8\xa2\x78\x11\xf0\xca\x00\x18\x78\xbe\xb9\xb2\x94\xfd\x36\x8d\x84\xd0\xb3\x1b\x4e\xee\xee\xbe\x7f\x4f\x9e\x8a\x25\xfb\x41\xb0\xb0\x76\xad\x3a\x83\xbd\x80\x9f\x6f\x9a\x2f\x04\x43\xe2\x25\xd1\xcb\xdb\x0b\x93\x48\x36\xb2\x13\x31\x0d\x28\xd8\x1c\x99\x06\xe2\xcf\x83\x63\x01\x4e\xf7\x74\x66\xc0\xa5\x92\xdb\x43\xa5\x50\xf4\x58\xd2\x6d\xc9\x86\xf3\x39\xb4\x10\xd9\x34\xe7\x10\x18\xbb\x98\xa4\x2b\x50\x32\x8e\xe2\xaf\xff\xec\x38\x26\x1f\x76\x13\x49\x91\x68\x7d\xb4\x9f\x29\xfa\x32\xb4\x4c\x1f\xbb\xf3\xd3\xe3\x5a\xf2\xf6\x06\x23\xc5\xaa\x50\x6c\x20\x9f\x3f\x87\x35\xf8\x1f\x04\xfd\xf2\x25\x0b\x55\x5c\xf3\x9d\xd2\xfe\xe7\x44\x8f\x39\xf0\x1d\xe9\x34\x82\x3e\xa2\x70\x8f\xc1\x54\x57\x8a\x5f\xe1\xbe\x81\x73\xc5\xef\x59\xc8\x19\x49\xf3\x0c\x61\xd7\xc4\xd2\xac\xfd\x01\xb7\x89\xa6\x19\x54\x7e\x55\x3c\x3d\x53\xd8\x2b\x23\x6a\x06\xb5\xd3\x98\x9a\xd4\x20\x25\xaa\x1e\xed\x09\xb9\xa1\xad\xee\xec\x33\xcc\x52\xee\x49\x54\x30\xf6\x67\x4c\xcd\xf2\x06\xde\xf4\x18\x1a\x0b\x7b\x20\x1d\xeb\x2f\xee\x2c\x20\x79\x1a\x91\x34\x41\xfb\x47\xa6\x58\xce\xbb\x04\x8d\x35\x9c\x9b\x4b\x18\x57\xb6\x74\xde\xdd\x09\xcf\x6a\xee\x24\xbc\x5c\x40\x07\x24\xbc\x72\xa7\x5a\x49\xaf\x6d\x7d\x62\x00\x67\x65\xc1\xb8\x0a\x1b\x47\x7f\xf9\xf3\xaf\x43\xee\xf2\xf7\xff\xc6\x65\x2f\x7f\xfe\x15\xd5\x39\x5c\x98\x09\xc5\xb0\x03\x2e\xc3\x34\x60\x6a\x2e\x74\xc0\x75\x8a\x26\x90\x4c\x5f\x40\x49\x36\x57\x86\xea\x55\xac\x59\x0b\x18\x13\x18\x9d\x8d\x1d\x87\x56\x57\x13\x2e\xb6\x09\x54\xb3\xa7\x5b\x41\xed\x4f\x57\x77\xde\xb6\xdb\xc2\x95\x67\x88\xf0\xdd\xcd\xdb\x2f\x97\xb1\x3b\xac\x2f\x0c\x52\xea\xa4\xe1\x8a\x54\xb8\x4a\x7a\xde\x3c\xe2\x76\x42\xe4\xdc\x3c\x97\x2a\x54\xea\xfc\x23\x8f\x90\x89\x91\xf6\x66\x62\xe6\xde\x7f\x98\x2a\x68\x46\x58\x88\x17\xb5\x04\x1c\x80\x68\xa6\x95\xb1\x5a\x84\x94\xf8\x01\x9f\x21\x5e\x4d\xec\x0b\xbd\x01\x52\x13\x07\xed\xa3\x15\x23\x2f\x8a\xf6\x91\xcf\xd8\x03\x72\x87\xa1\x18\x4e\x90\x14\x8a\xa2\x77\x0f\x08\xf6\x80\xa0\x0f\xc8\xdd\x5d\x32\x3b\x69\x2b\x36\xe7\xb2\x14\x5d\xb5\xd9\xb1\x75\x87\x49\xba\xa1\x3b\x3a\x98\x4b\xfe\x0e\x9a\x6f\xf6\xdb\xfc\xee\x01\xb9\xc3\x51\x8c\xfb\x8a\xd2\x5f\x51\x02\xc1\xd8\xef\x38\xfb\x9d\x64\xbe\xa1\x04\x4e\x72\xf4\x3d\x8a\xbb\x4c\xe7\xc2\x8e\x4b\xfe\x2f\x23\x8e\x7a\x44\xde\x4a\x8e\xa9\xab\xe9\x94\x38\x9a\x62\xce\xa1\x44\x48\x2b\x1b\xee\x23\x94\xa4\x1b\x27\xbf\xc6\x48\xa5\x47\x92\x28\xc9\x9e\x43\x8f\x94\x80\xaa\x4a\xd1\x9a\x56\x2a\x0d\x8a\xa4\x08\xfc\x1c\x1a\x94\xe4\xc7\xc3\x5d\x66\xee\xad\x85\xa6\x92\xa0\x09\x14\x3f\x4b\x0c\x7a\x47\x22\x18\xfd\x72\x90\x60\x49\x8c\x3a\x87\x04\x23\x2d\x4c\x55\xd7\xb6\xf9\xa5\x60\x31\x1a\x3f\x8b\x04\x7b\x24\x45\xb0\x05\x3a\x07\x1d\x86\xa4\x89\xf3\xe8\xb8\x9d\x0e\x26\x13\x0b\x4e\x80\x63\x5a\xe9\x36\xc5\xa1\x18\xca\x9d\x83\x9e\xf3\xd0\xfb\xf5\x4e\xe9\x5d\xb5\xd2\xb1\xe3\x0c\x76\x56\x57\x63\xa8\x87\x3e\xe8\x05\x6f\x96\x9b\x4e\x80\xe2\x98\xb3\xb4\x83\x61\x61\x02\xfb\x69\x93\x3b\x00\xa4\x13\xe2\x68\xee\x3c\x49\xf0\xa3\x8e\x0e\x26\xaa\xfe\x8f\x6e\xd3\x28\x61\x28\x43\x91\x67\xf5\x08\x46\xf8\xe2\xec\xa7\xf7\xa9\x3d\x8e\x61\x38\x43\x9f\x27\x09\x29\x69\xfa\xfb\xee\x07\x08\xe6\x62\x2e\x69\x3a\x9c\xa7\x0e\x8d\x18\x46\x61\xd8\x59\x83\x30\x46\xed\xd6\x5d\x76\xf5\xf0\xf7\x0c\x31\x68\xe6\xbc\x61\x1e\xa3\x25\xdd\x98\x40\xdb\x91\x4e\x2b\xee\x19\xa4\x18\x8e\x3d\xaf\x47\x98\xa3\x50\xef\x2d\x6d\x80\xf4\x60\x82\xe1\x28\x4a\x90\x01\x91\x84\x58\x9b\xba\x4e\x7f\x6e\xb0\x3d\x59\xab\x0f\x27\x01\x95\xe2\xa8\x51\xa1\x7b\x22\xd9\x16\x6b\x42\xa7\xd8\x12\xcb\x05\x86\xc0\x79\x92\xa0\x5f\xa8\x8e\x58\xea\xf7\x9a\x95\xe7\x06\x53\x29\x34\x8b\xad\x6e\xb3\x56\x6e\x93\x7d\x46\x18\x3f\x3f\x0d\xa3\x1a\x4a\x24\x82\x7b\x44\x70\xa2\x5b\xc6\xab\x43\x81\xc2\xf9\xd6\x68\x58\x1e\x56\x09\x7e\x5c\xe7\x47\xa3\xca\x68\xf4\x84\x3f\x55\x47\xe3\x71\x8f\x16\xc6\x23\x61\xd0\x69\x94\x46\x2f\x7d\xfe\x99\x66\x46\x6d\x32\x37\x11\xc2\x25\x52\xe8\x75\xc6\xd5\x5a\x13\x2f\xd6\x88\xb2\xd8\x25\x0b\xa3\x66\xb9\x25\x96\x9a\xe5\xfa\x50\xec\x0c\xf1\xea\x98\x78\x69\x95\xfb\xd5\xb6\x38\x2c\x0a\x6d\xbe\xff\xcc\x74\x8b\x4c\x7b\x84\x57\xef\x2e\xdd\xf2\xe1\x66\x80\x19\xdd\x10\x6c\x93\x3b\xec\x70\xfd\x66\xc3\xf4\xed\x10\x0f\x08\xf1\x80\x38\xd6\x0a\xe6\x30\x8e\xd3\x8d\x0e\x17\x9b\x86\x3f\x41\x09\x1b\x86\x62\x41\x55\x77\x24\x30\x5f\x4e\x81\xb1\x5a\x90\xae\x39\x0f\xfb\xa5\xbb\x2b\xbb\xf3\x92\xa5\xfd\x9b\xe8\xf9\x68\x3a\xe5\xe5\xbb\xf9\xb4\x1c\xb7\xb2\x7f\xa9\x9a\x77\xab\xfb\x21\x3d\x63\x8c\x3b\xe6\x30\x04\xce\x62\x1e\x53\xae\xbb\xfc\xfd\xc9\x8f\x21\x9f\xbe\x23\x9f\x30\x14\xfb\x16\x64\xe9\x9f\x1e\x90\x4f\x87\x0d\x24\xee\xcb\x61\xbf\x74\x78\xe8\xce\xbb\xdd\x87\xd1\x8e\x3b\x40\xf8\x1b\x49\x5c\x98\x4b\x7b\xf0\xd3\xff\x26\xb9\x64\x54\x34\x3c\x22\x1a\xee\x19\xf6\xff\x17\xa2\xb9\x1d\x85\xb3\x2c\xc9\xa1\x14\xc7\x52\x7e\xaf\xa1\x9e\x6c\x73\x7d\xa1\x7b\xa2\x71\x38\x4e\x10\x0c\x8e\x12\x34\x4b\x7d\x23\x19\x86\x62\x51\xe6\xbf\x4a\x46\xfc\x01\x61\x29\x96\xe3\x08\x96\x66\xb9\xfd\xec\xf0\xef\x4f\xb6\xe3\x4e\x9d\x8c\x89\x24\x83\x39\x30\x14\xe8\xf7\x23\x8a\x7e\x43\xfd\x4f\x7e\x0a\xc4\x31\x85\x58\xfb\x08\xe1\x3d\xd1\x93\x01\x1c\x7d\x0d\x2f\x96\x88\x78\x40\x30\x5f\xa4\x0d\xd4\x27\x53\x97\x20\xf6\x80\x7c\xf2\x5d\x59\x9a\xc1\xed\x2f\xb3\x25\x8f\x2b\x12\x67\x02\x53\xfa\x59\x7a\x0e\x28\xfc\x74\x3d\x47\x24\xca\xa9\xe7\xcb\x92\x10\x9f\xab\x8c\x01\x3c\x6e\x4b\xd2\xa5\x03\xf8\x6e\x5b\xd2\x4e\x58\xf2\x01\xb9\x53\x09\x86\xa6\x69\x45\x65\x19\x88\x12\x1c\x87\x6a\x1a\x46\xa9\x1c\xa3\x6a\x32\xc3\xb2\x24\xae\x92\x94\xca\x42\x88\xc9\x18\x4d\x32\x90\x90\x09\x05\x92\x24\x2e\xe3\xa4\x4c\xb2\x50\x66\x39\xc6\x8d\xa8\x28\x54\x30\x0d\x90\x24\xc9\x01\x05\x50\x34\xae\xe1\x1a\x00\x2c\xa9\xc8\x0c\x89\xcb\x32\x94\x09\x05\xa5\x58\x05\xd3\x30\x59\x66\x71\x12\xe0\x14\x2e\x43\x1c\x63\x34\x95\x91\x71\x54\x21\x80\x1f\xd0\xb0\x48\xc6\x49\x7f\x27\x98\xef\x14\x1e\x4d\x44\xfd\xc7\xe4\x37\x1c\x47\x51\x96\xc8\x7c\xeb\x0f\xe3\x34\x87\xb1\xe4\x03\x82\xd1\x6e\x7f\x9e\x7c\x1e\x10\xd2\xfd\x0f\x0b\xfe\xdb\x3d\xc4\xf6\x7f\xb8\xac\xf1\x3c\xcf\x17\x37\x4c\xe1\x7e\xd6\xab\x5b\x8d\x27\x9d\x5d\xbf\x99\x83\xa6\x5a\x5c\xdd\xdb\x6c\x61\xbc\xd1\x2a\xcc\x64\x66\xce\x1b\xf7\xb5\xd1\xe3\xc8\x9e\x6c\xe8\x45\xb3\x5b\x91\xab\x95\x99\x35\x35\x2b\xab\xe1\x68\x34\x07\xa4\xbc\x90\x07\x83\x41\xa7\xc8\xf4\xdf\x94\x7b\x92\xb7\xf4\x4d\x79\x8d\xce\x5f\x49\x17\x35\x3f\xea\x3c\xb5\xfc\xbf\xfc\x4f\x89\x59\xd7\xf1\xca\x68\x6c\x70\x66\xfb\x51\x33\xa9\xae\xb5\xa8\x36\x8c\xc1\x53\xed\xad\x00\xac\x35\x53\x58\x14\x1d\x5b\x6e\x3b\xb2\x46\x0f\xaa\x4a\xb1\xf9\x3e\xea\x59\xe0\x75\x5d\x1f\xe9\xf5\x95\xd6\x5c\x7e\x54\xb0\x9e\x48\xf1\x8f\xeb\x17\x81\xb7\x50\xe1\x99\x5f\x53\xf7\xf7\x56\xb3\xeb\x62\xee\x8a\x64\x13\x7c\x2c\xf1\x6e\x88\x5a\x25\xfc\x65\xff\x79\xe1\x47\x18\xd9\xe5\xf9\x12\x5a\x8f\x7b\xfd\xaf\xfe\x04\x55\xc1\x04\xbf\x8f\xba\x02\x71\x1b\x33\xbe\xc3\x00\x45\x00\x1a\x87\x1c\x83\xa9\x1c\xab\x12\x2a\xcd\x42\xc8\x70\x2a\x49\x62\x1a\x00\x90\x56\x54\x9c\x26\x50\x19\x30\x8c\x8a\xa2\x98\x4a\x52\x90\x21\x69\x15\x67\x29\x85\xe4\x08\x85\x65\xd3\x5c\x01\x4b\x34\x76\x0a\x23\x89\x64\x47\xd9\xbd\x0d\xc2\x3e\xc6\xb2\x6c\x8a\x2b\x10\x39\x5d\xe1\x7d\x39\x58\xea\xf4\xa8\xfa\xf2\x3a\xc0\x4c\xc6\x30\x86\x5d\xed\x6d\x25\x8b\xf5\xd7\x22\xad\x72\x7c\x01\x2b\x53\xa8\xdc\x9f\x2a\xfd\xc1\xb6\xf6\xd2\xe7\x66\xea\xe6\xc5\x14\x28\x03\xdf\x40\x6d\x6b\x68\xad\xd9\x74\xf9\x52\xaf\xbd\xc8\x4c\x53\x7f\x34\x9b\xa3\xed\xd8\xee\x3c\x15\x17\xcf\x43\xaf\xeb\x5c\x57\x20\x36\x87\xae\x6c\x36\x1b\x1d\xb9\x65\xbe\x56\xef\x7b\xbd\xfb\x41\xbf\x50\x6a\x54\x0a\x8f\xce\x4a\xab\xe2\x8b\x26\x86\x2b\x4a\xb1\x6a\x61\x75\x03\x67\xb6\x9d\x62\x17\x15\x3b\x0c\x78\x72\xee\x79\x66\x54\x24\x8c\x09\x84\xe6\x84\xda\x8c\x6d\x67\x50\x15\x1e\xed\x55\xfd\xb1\x21\x2e\x96\x33\x73\x5c\x1f\x7b\xf8\x5b\x31\xae\x20\xd8\x71\xe6\xf4\x7f\xc7\x15\xf0\xdb\x98\xf1\x1d\x4d\xa8\x1c\xab\x51\x04\x0d\x21\xcd\xaa\x98\x8c\x33\x32\x25\xb3\x9c\x86\x13\x40\xa3\x08\x0c\x93\x19\x8a\xe6\x00\x4e\x6a\x40\xc3\x48\x94\x00\x2a\x2a\x53\xb8\x4c\x13\x84\x8c\x32\x32\xe4\xb8\x3b\x2f\xdc\xe3\xb1\x56\x8d\x26\x1a\x3b\x8d\xb1\x04\x97\xf9\xd6\xcf\xa5\x48\x8a\xc3\x53\x3c\x01\xcf\xe9\x09\x78\xe7\xe5\x15\x13\x57\x94\x89\xca\x75\xe6\x99\x34\xb6\xed\xf5\xf0\xbd\x42\x3c\x2d\xcd\xd9\xfd\xba\xcc\xb7\x9d\x22\xd6\xc0\x5b\x4c\x81\xa1\x5f\x56\x54\x95\x53\xaa\x2a\xfa\xc6\xdb\x2f\xaf\x5c\x97\x1e\xb3\xdb\x5a\x4d\xa1\x57\xce\x4c\x7b\x2c\xb6\xef\x9b\x8b\x47\xb4\x21\xdb\x9a\xf5\xd1\x09\x79\xc2\xc4\xfd\xab\xb6\xff\x8f\xf7\x8c\xd5\x3e\x7c\xdf\xf0\x9d\xee\xcc\xef\xe9\x0e\xda\x79\xed\x13\x3d\x8d\x99\xda\xec\xfb\x53\xad\x30\xc1\x27\xec\x7b\x63\xfd\xd6\x6e\x3f\x1a\x8f\x93\xc7\xd1\x66\xd2\xe9\x3d\x56\x0b\xcc\x1b\xe4\x96\xb6\x5e\x5f\x91\x33\xb1\xda\x23\xcd\x51\x55\x18\xd4\x54\x12\xeb\x88\xf5\x11\xb3\xac\xbf\x99\x28\xce\x93\xe6\x3d\x65\xf4\x64\xe2\x63\xe5\x79\x4a\x2d\xc6\x53\x4a\xb5\x38\x6b\xfb\x2f\xf7\x14\x3c\xbf\xa7\x60\xb7\xb1\x72\x6f\xd5\xd8\xcd\x9c\xdd\x4c\x13\xe3\x18\xf4\x2b\x8a\x7d\x45\x31\x04\x45\xbf\x7b\xff\x12\xad\x99\xa1\x30\x3c\x79\xd8\xdf\xbd\x25\x71\x8e\xe4\x68\x06\xe7\xe8\x14\x5b\x8f\xb7\x74\x9f\xa5\x7f\xba\x53\x92\x3f\x85\x51\x43\x27\xb7\x8f\xdb\x7e\xa3\xc0\x94\x8c\x12\x57\xc5\xd1\xf7\xd7\xc2\xbd\x8d\x4e\x1c\x7b\x53\xdb\x7c\x60\x23\xb5\xff\x3c\x06\x85\x3a\x28\x7b\x4e\x24\xc4\x18\x71\xfc\x67\x67\xc4\x3c\x5f\x98\xfd\x02\x41\x6e\xfa\xb9\xf3\x8d\x29\x7b\x6e\x91\x63\x5f\xf6\xa5\x53\x8d\x84\xe5\xf6\xa4\xd2\x11\x9e\xe0\x71\x19\x68\xa2\x65\x1a\xec\x32\x34\x44\xb4\x24\x72\x19\x1a\x32\x32\x47\xbf\x0c\x0b\x15\xa9\x2c\x5c\x86\x85\x8e\xcc\x63\x2f\xc3\xc2\x44\xe6\xf7\xb7\xd9\xee\x7e\x93\x8a\x68\xfa\x5e\x8c\x07\x84\xc9\x5b\x21\x4d\xd8\xf4\x7d\xb5\xe1\x87\x8c\xfd\xc8\x44\xf7\x5f\xd0\x7d\xaa\xff\xf7\x27\xc7\xbc\xaa\x90\xf0\x80\x7c\xd2\x2c\x73\x71\x55\xd1\xe7\x01\xf9\x37\x17\x37\x7f\xc2\x32\x4c\x5c\x4f\x1d\x8d\x02\xfb\x2f\xa4\xd7\x4d\x74\xbe\x22\xa9\x63\xad\x6c\x07\xc2\x6b\xfb\xc2\x43\x63\x5a\xd7\x9a\xc5\xbf\xa4\xe7\x6e\xbb\x4a\x17\xd3\x73\xe1\x21\x73\xff\x37\x1b\x2a\x49\x6a\x2b\x43\x0d\x64\xb9\x70\xa5\xcd\xd3\x8b\xbf\xde\x75\x6d\xe7\xe6\xa8\x8f\x5e\xb9\x24\x78\x8e\xda\x82\xd1\x7d\xff\x37\xf9\x73\xd5\x76\xb9\x31\xff\x7c\xb5\x65\xc4\x8a\x98\x5f\xb3\xe4\x89\x13\xd9\x58\xb3\x37\xf6\x5f\x1a\x8f\x12\x37\x04\xc6\xa6\x62\x68\x72\xc2\x91\x89\x08\x8f\x06\xb7\x4b\x11\x11\xd1\xb1\xf7\x52\x44\xe4\xf1\x58\x90\x94\x04\x65\xe2\xa1\x8e\xf1\x5c\xac\x21\xfa\xd8\xc9\x2e\xe6\x87\x89\x38\xeb\xad\x7e\x39\x71\x93\xc4\x2c\x6b\xef\xe8\x19\xa9\x59\xe2\x2f\x07\x6e\xe0\x0c\xe1\x9d\x81\x38\x49\x28\x34\x47\x90\x1a\xaa\xc9\x14\x8a\xb9\xb1\x9c\xa5\x39\x00\x08\x59\xd3\x28\x42\x55\x15\x82\xe5\x14\x8d\xc5\x58\x1a\x53\x34\x00\x69\x0c\x55\x14\x1c\xa7\x00\x80\x18\xab\x28\x8a\x3b\xc7\xf6\x13\xb9\x8b\x53\x94\x50\x45\x8a\xd8\xcd\xc4\x93\x57\x36\x70\x3a\x6d\x55\xc4\x7f\x7b\xe4\x8a\xfe\x14\xbe\xf9\x4c\x96\x51\x38\x6d\xd3\xfc\x96\x2b\xa2\x1d\xbb\x22\x4c\xd6\x0a\xc6\x60\xd8\x90\x63\xc7\xaf\xe4\xa2\x39\x5b\x70\x5d\x86\x9a\x15\x89\x35\xef\x4d\x81\xf9\x5d\x89\xa9\x10\x99\x61\x86\xbe\x0b\xde\xff\xd6\x9b\x48\x37\x61\x1b\x4c\x5e\xdf\x5b\x60\xd8\xe1\xe8\xc2\x87\x66\x73\x10\x55\x4c\x4b\x7c\x19\x7d\x14\x9e\xeb\xb3\xb2\xd9\x60\x66\xeb\x99\x57\x4c\x2a\x3c\x3d\x89\x7e\x43\xbe\x88\xad\x0a\x6a\xd5\x1c\xac\x26\xad\x75\xd7\x29\x31\x85\x69\xad\x49\x88\x90\x53\x9f\x3a\x5a\xa5\x76\x5f\xd7\xa9\xfa\x7a\xd8\xbe\x7f\xe1\x1d\xc6\xaf\x08\xb3\x4f\x5b\xdd\x3c\xd0\xaf\xee\xf9\xed\x0a\x0a\xac\xcb\xe3\xd5\xd2\x78\x9e\x0f\xa1\x35\xa4\xd1\x89\xb6\x2c\x4f\x58\x71\x86\x03\x82\xa7\xbb\xad\xbe\xf6\x34\xe9\x9a\x62\xf9\xa5\xdd\x7c\x15\x99\x0f\x85\xdc\x30\xaf\x85\xf7\x8d\x5e\xae\x0d\x75\x7a\xb9\x1d\xd5\x45\xb1\xbb\x6c\xe2\xed\xee\xfb\xc0\x78\x22\x27\x36\x37\x2f\x59\x93\xee\x8f\xbb\x70\x09\x24\xbc\x4e\xd2\x8d\xd3\x07\x7f\x80\xef\xee\xf5\x57\x8a\x02\x39\xf2\x64\xd4\xa3\x05\xc6\x2c\x35\xd1\x66\xf7\x7e\x33\xee\x17\xb9\x8f\xd1\x7a\xf4\x34\x20\xde\xf5\x8e\x3e\x5e\xf5\x65\xac\xb4\x5e\x74\x9b\x90\xf5\x94\xf4\xc4\xaf\x5f\x8d\x43\x7f\x24\x7c\x84\xa4\x17\x85\x1b\xd3\x8f\xda\x43\x2e\xfa\xbc\x57\x82\x69\xed\xf5\xe1\xeb\xa7\xb8\x32\x09\xd3\x21\xa9\xb7\x62\x47\x78\x5f\x76\x1f\x09\xb3\x2a\xde\x7f\x60\x4c\x6f\xab\xdb\xd8\x5c\x6b\x95\xc7\x8b\xee\xf3\xc4\x5a\xf5\xef\x07\x5e\xa3\xf2\xd3\x10\x0d\x14\x7f\xa6\x3d\x07\xac\x3c\xee\x3f\x9b\x38\x9e\x85\xc3\xc3\x5f\xcd\x5f\xe9\x7d\xd4\x68\x4c\x53\xf8\xfb\x71\xb0\xad\x83\x2e\x8b\x87\xf7\xe7\xfa\x52\x7d\x58\xbc\x0f\x78\x9d\x24\x75\xdd\x91\x9d\x27\xeb\xea\x62\xfa\x6d\xe5\x32\xfa\xbe\x2e\xfe\xee\xbd\x93\x73\x47\xa7\x17\x2a\x78\xea\xd1\xce\xc0\xea\x17\xee\x67\xcf\xa5\x0d\x3e\x78\xb1\x94\xd2\x92\x7f\xaf\x73\xcf\x85\xe2\x04\x7d\x9a\x91\xab\x16\xb1\x16\x3f\x5e\x4b\xab\x56\xb5\x5a\xac\x0d\xa7\xfd\xe6\x9b\x51\x57\x66\x28\x56\x9c\xad\xc7\x54\xa9\xdc\x56\x47\x7a\xf1\x03\x1f\xb6\x57\x05\xfe\xc7\x0f\x2f\x93\xf4\x7e\xeb\xb3\xab\xcf\xfa\xff\xbb\x81\xcb\x1b\xa0\xb3\x63\x77\x28\xc2\xc8\x2a\xc9\xd2\xaa\xac\xaa\x28\xae\x92\x34\xca\x62\x0c\xcd\x60\x0a\x09\x28\xc0\x40\x4e\xa5\x21\x4b\x53\x0a\xc0\x39\x45\x26\x31\x48\xe3\x2a\x03\x80\xc6\xa0\x00\xd7\x20\xa4\x64\x82\x56\xa1\xbf\xaf\xee\xaa\x0d\x8f\xe7\x44\x18\x0a\xa3\xa9\xe4\x95\xf5\xdd\xdb\xa3\x1c\xcd\xb7\xca\x06\xfd\x0a\x75\xe2\x75\x61\xd6\xd8\x41\x65\x5e\x7a\x84\x13\x85\x60\x3a\x23\xa7\xda\x68\x7c\x3c\x3f\xb1\x9b\x27\xfd\xa5\x00\x8a\x2b\xaa\x49\x79\xa6\x9b\x2f\xc2\x8c\xf9\x8b\x23\x06\x71\x70\xa6\x03\xbe\xca\x9e\x7e\xb7\xc0\xcd\x16\x8d\x67\xfc\x8d\x58\x33\x5d\x6d\xcb\x76\x5a\x70\x26\xc8\xd8\x60\x50\xa3\xf4\xf7\xb7\x59\x0d\x2d\x98\x93\x91\xd5\x76\x98\x49\x1b\xa3\xf1\xae\x3c\x9b\xe2\x6a\x7f\x30\xd4\x60\xc9\x5c\x2b\x68\x87\x07\xda\xb4\x34\x7a\x77\xa6\x4f\xfc\xdc\x6e\xae\x5e\xe7\x85\xc5\xf6\xb5\xc0\x8f\xf3\x44\x8c\x4a\xd8\x94\x93\x22\x06\x1f\x5a\x03\x3d\x33\xc2\xde\x24\x62\xdc\x90\xfe\x65\x11\xc3\x5f\xa3\x3d\xe8\xc3\xfb\x9c\x3b\x22\x47\x47\x99\x04\x9a\xe9\xa3\xdc\xad\xe9\x9f\xea\x23\x7d\x4d\xe2\x5f\x1a\x31\x33\x23\xd2\x05\xba\xba\x3a\x22\xdd\xb0\xaf\xce\xa1\x1f\x44\xa4\x2a\xde\x1f\x2f\x65\x60\xc1\x47\xa7\xf0\xd8\xdc\xb0\xef\x74\xb7\xb7\x7e\x12\x5b\xaf\x8b\x66\xe5\xad\xfb\xda\xad\xe8\x05\x68\xd3\xc4\x8a\x67\x46\xd6\x4b\x61\xd5\xaf\xbe\x60\x75\xb1\xc7\x91\x6d\x9d\xfb\xe8\xb2\x85\xe5\xbd\x20\x6a\x15\xbc\x3c\x2c\x3e\x6f\x56\x74\x7b\x58\x91\x1b\x2d\xa1\x30\xb9\x75\x44\x52\x65\x82\x63\xa1\x4c\x02\xc8\x72\x0c\x45\x13\x38\x45\x93\x84\x02\x54\x1c\x53\x38\x12\x62\x84\xac\x29\x28\x43\xca\x04\x4e\x40\xc8\x12\x10\x23\x31\x59\x63\x50\x0c\x50\x2a\x87\x92\x1a\x26\xfb\x0b\xa5\xd8\x35\xe5\x16\xbf\xfc\x9d\x1a\x88\x68\x8c\x23\x93\x03\x91\xfb\xf6\x30\x75\xf2\xe7\xe6\xbe\x2d\x56\x9a\x6c\xb5\xbb\xee\xce\xe4\x06\x5e\xe5\x89\xe7\xa7\xd7\x9e\xd5\x58\xbc\x8e\x50\x54\xab\xb0\x76\xb3\xc6\x2c\x50\xa1\xb7\xa9\x3f\x3f\xf2\x23\x82\xdf\xc7\x21\xef\x93\x12\x87\xfc\xcf\x05\x99\x73\x78\x01\xb1\xf0\xb4\xde\x94\xb9\x8d\x67\xaa\xe3\xd7\xae\xd2\x19\xe0\x15\x6a\xfa\x66\x14\x16\x93\x4a\x05\x4e\xb8\x3a\x3b\x27\x15\x4c\x30\x86\xf3\xf7\xd9\x5c\x98\x57\x39\xfb\xed\xc5\x42\x39\x06\x2b\xd3\xed\xe6\xb3\x06\x1f\x17\xe4\x6c\x59\x76\x6a\xf7\x76\x0d\xd5\xb1\xb7\xa6\xee\x50\x3c\x5a\xdf\x3e\x1b\xf2\x74\xdc\x7c\xa6\xcc\x52\x8e\xd8\x73\x64\xb4\xc7\xb1\x27\x24\xf3\x61\xec\x0d\xf9\x73\x41\x7f\x2c\xa0\x4d\xb4\x5e\xd9\x3a\xd3\x8d\x88\xcd\xc7\x28\xd8\x2e\x4d\x8c\x13\xab\xef\xeb\x66\x71\xdb\xa6\x9c\x82\xa0\x14\x7d\x19\x89\x89\x63\xb5\x8d\xf1\x23\x1b\xda\xd5\x96\x10\x8b\xd2\xfd\xf9\x0a\xfa\xe5\xc1\x73\xc1\xbe\x82\x3e\xcf\xff\x73\x19\x76\xec\xd8\x5a\xb8\x5c\x17\x6d\xe3\x25\x55\xcc\x2c\x5d\x5c\xdb\x17\xae\x2d\xdc\x2b\x11\x7c\x67\xe9\xe2\xef\x4a\x0d\xad\x96\x50\x6e\xba\x1a\x83\xe5\xe6\xc5\x2c\x4c\x0d\xb3\xd3\xd7\xea\xb0\x2a\xf6\xea\x58\x5d\x79\xa9\xf7\xea\xbd\x47\xb9\xb1\x00\x5c\x07\x72\x3d\xf8\xaa\x63\x06\xb1\xa6\x56\xf5\x46\x4f\xee\x77\xac\xa2\x58\x73\x80\x4e\x5a\xb0\x2b\x16\x95\xf9\x12\x27\x9f\x8b\xd8\x0a\xf0\x9b\x5b\x8f\xad\x1a\xc7\x28\x40\xd3\x80\xcc\x2a\x18\x8d\xe2\x04\x20\x18\x96\x25\x31\x9a\x52\x64\x54\x26\x34\x0d\x03\x00\x57\x81\x46\xa2\x28\xaa\x41\x8d\xe4\x54\x1c\x83\x9a\xc2\x92\x8c\xaa\xca\x9a\x0c\xc1\x61\xe3\xd3\x15\x63\x2b\x9e\x39\xb6\xe2\x18\x4e\x25\x8f\xad\xc1\xdb\x70\x9d\xf1\xda\xb1\xb5\x18\xe9\xd4\x93\xb1\xf5\x82\x1c\x33\x61\x6c\x2d\x2c\x1a\xcb\xfe\x64\x6d\x6d\x1a\x6d\x1c\x1d\x15\xdb\xda\x58\x1b\xd9\x15\x41\x18\x3a\x9b\x31\x00\x82\xf6\xd6\x5f\xd1\xdb\x45\x7d\x31\x2f\x2d\xc0\x7d\x6d\x44\xd7\x98\xda\x64\x22\x0f\x5f\x5a\xa6\xd2\x55\x5f\x38\xb2\xd6\xe2\xb5\x86\xda\xe5\xc5\xb7\x91\x5c\x6b\x33\x5b\x7b\x03\x61\xab\xf8\xef\x1a\x5b\xaf\x1d\xdb\xae\xf4\xe7\x37\xe6\x71\x50\x52\x6e\x39\xb6\xfe\xc2\x5c\x31\x2b\x6f\xfd\x95\x63\x1b\x7f\xa3\xb1\xf5\xd2\x38\x1b\x8c\xad\x2f\xfa\xdb\xd0\x6c\xd2\x6c\xf1\xd5\x71\xca\x9b\x57\x03\xaf\x62\x4c\x61\x5a\x28\x37\x95\x4a\x65\x31\xad\xd2\x33\x6b\x65\x2f\xf5\x97\x65\x97\x5a\xac\xf5\xf2\xbd\xde\xde\xd6\x6a\x15\xac\x32\x68\x54\x85\xea\xb3\x06\x8b\x25\xbe\xba\x35\x86\x7c\x09\xcc\xf1\x6d\x69\xc5\x5a\xad\xaa\xf1\xca\xe7\xcc\x5b\x13\xcf\x19\x3f\xbd\x86\x6b\x7f\xe5\xc7\xee\xc4\xad\x73\x4f\xca\x08\x61\xf4\xaf\x04\x28\x95\xc2\xe7\x77\x45\x09\x22\x9d\x5e\xad\xc5\xf7\xc6\x48\x43\x18\x23\x9f\x75\x35\xeb\x28\xf0\xf8\x6b\xc9\xae\xe6\x3a\x82\x35\x8e\xf3\x38\xc2\x99\xdc\x47\x7e\x42\x19\xf9\xbd\x61\xce\x6b\xdd\xae\x96\xee\x98\x6c\x9c\x70\x17\x31\x86\x0c\xc5\x5a\x77\x28\x20\x9f\x0f\xe0\x0f\xa1\x33\xaf\x1f\x8e\x4e\xa8\x3e\x53\x35\xb7\xe9\xd6\xb3\x05\x3f\xab\x53\x13\x76\x77\x65\x6c\xa1\xba\xad\x64\xf1\x44\xd2\x24\x4d\x61\x2b\xb7\xe4\x89\x4b\xa8\x99\xab\x94\xb7\x95\x3e\x89\x4c\x9a\xfc\xa9\xac\x65\x6a\xe0\xf8\x5a\xcd\x40\x10\xef\x0a\xce\x7c\xc7\xad\xf9\xb7\x75\x1e\x61\x41\xda\x62\xd4\x19\x86\xfd\x9a\x58\x41\x64\xc7\x82\x30\xec\x5d\xc9\xdc\x04\x37\x82\x5e\xcd\x4f\x70\x9a\x7c\x2e\x8e\x12\xfc\x3a\x74\x9b\xe9\xa5\xec\x1c\x50\x84\x39\x39\x9a\x0d\x1c\xf3\xe3\x03\x3f\x9c\x1c\xfe\x16\xc7\x9c\x77\x1f\xeb\x15\x9c\x79\x67\xe0\xe5\x62\x2b\x7a\x72\x5e\x1c\x37\xc1\x25\xb2\x57\xf0\xe3\x63\xc8\xc7\x51\xe4\x58\xbe\x87\xd3\x13\xf8\x62\x5d\x3e\x7c\x2b\xee\xf9\x9c\x06\x51\xc2\x67\x38\x82\x2e\xcc\xf6\xee\xb7\xa2\x47\x1c\xc7\x1d\x46\xfb\xb0\x3b\x78\x36\x89\xd9\xc3\x71\x5f\x57\xb2\xa9\xab\xb9\x19\x3c\x9c\xbc\xf9\x10\x7b\x82\x6e\x06\xd3\xbb\x8b\x8c\x6f\xc1\x77\x80\x2b\xcc\x7a\x42\xa8\xba\x48\x92\x78\x01\x76\x77\x36\xdf\x42\x80\x00\x57\x82\x4d\x5f\x28\xc2\xf1\x31\xaa\xa7\x42\x84\x6e\xa8\xbe\xd4\x1b\x43\x38\x2e\x55\x7e\xba\xa2\x23\x57\x6e\x5f\xab\xeb\x63\x74\x61\x96\x77\x3f\xc5\x39\xe2\x31\x9e\xa3\xd3\x6b\xc3\xaf\x67\xeb\x04\x67\xbe\xe1\x2d\x8e\xc1\xd0\x05\xe8\x17\x77\xeb\x01\xc7\xe5\x26\x99\x65\x7e\x71\x57\xbb\x5f\xce\xf0\x29\xb2\x08\xe7\x2a\x8c\xf0\x19\x39\x54\x3b\x9d\x41\xff\xae\xfa\x9b\xb0\xe7\xa1\xca\xc5\xdc\xee\x58\xab\x44\xd6\xa2\x77\xef\x5f\xcb\x5f\x04\x5f\x16\x93\xa7\xa7\x85\x67\x72\x7a\x1b\x3d\x1e\x61\xcb\xcb\x65\xa6\x36\x6f\xc3\x5b\x2e\x9e\xd2\x79\xd9\x71\x3c\x37\xcd\xd9\x6a\x79\x1d\x47\xc7\xb8\x72\xf7\xe8\xee\x3c\xf2\x58\xfe\x96\x40\xb7\x24\xef\xd0\xd9\x5b\x70\x18\xc5\x96\xcf\x6f\x03\x06\x1f\x4e\x8e\x50\x7f\x38\x39\x86\x3f\x41\x88\x1b\x8c\xdb\x01\x9e\x2c\x8e\xcf\xcc\x8e\x5c\xac\x37\xd3\xee\x19\x8a\xcd\xd4\x9b\x7f\x5a\xe8\xc9\x51\x5d\xa6\x21\x05\x77\x93\x5d\xab\xd0\x4c\x02\x47\xf3\xb4\xdd\xa9\x67\xc7\x33\x23\x1f\xf0\x0c\xde\xaf\xb7\x83\x34\xdc\xd9\x1c\xc7\x78\xd9\x31\xc2\x20\x0b\x77\xf1\x39\xdb\xe5\xe5\x73\xf0\x54\xac\x99\x69\xbf\x0b\x94\xc1\x68\x90\x43\xb9\x28\xf7\x46\x74\x23\x6e\xe3\x50\x67\xa6\x6f\x79\x2d\x39\x84\xfc\xd6\xc6\x70\x84\xfa\x92\x7c\x33\x19\x5d\xe4\x22\xaa\xdb\x2b\xfa\xe4\xaa\xab\x4c\xf6\x23\x0d\xf2\x0b\x13\xba\x79\xec\xa7\xe9\x3f\x7c\xbb\x59\x96\x24\x21\xd8\xfc\x42\xc4\xdd\xa3\xf6\xd3\xa4\x89\xbd\xb4\x2d\x4b\xac\xb8\x46\xf9\xe5\xdb\x15\x51\x7e\x9a\x4c\xfb\x1b\x0c\xb2\xe4\x48\xac\x76\x1d\xa3\x3e\xfc\x3e\xed\x67\xb8\x76\x14\x7b\xec\x04\xf8\x5c\x07\x3f\x46\x7a\x3c\x85\xba\x91\x87\xa7\x91\xc8\x23\x43\xc6\xbc\x2e\x95\xd8\xed\xc2\xd7\x29\xe2\x5c\xbc\x67\x07\xb1\xf0\x64\xfb\x67\x98\xcd\x29\xfe\x8b\xa7\xfa\xfe\xe1\xc7\xbb\x40\xbe\xab\x30\x4a\xb2\x69\xce\x2e\xd6\x72\x0a\xce\xcc\x14\xe1\xf3\xe7\xdd\xad\x60\x5f\xff\xf3\x1f\xe4\xce\x36\xe7\x6a\x68\x35\xed\xee\xfb\x77\x07\xbe\x3b\x5f\xbe\x3c\x20\xc9\x80\x8a\xa9\xe6\x03\xf4\x6b\xf1\xc9\xa0\xb2\xb9\x9a\x4c\x9d\x5c\xe4\x8f\x40\xd3\x19\x38\x02\x8d\xb0\xf0\x05\x79\xae\x0a\x3d\xc1\x37\x32\xe4\x07\x42\x10\xb9\x17\xa2\x75\x55\xd2\x42\xcb\x44\xe5\xc6\xaf\x59\x8e\x0e\xc8\x22\xe5\x76\x4f\xa8\x55\xc4\xfd\x12\x10\xd2\x13\xca\x42\x4f\x10\x8b\x42\x3f\xb2\x2a\xe2\xbd\x6d\x8b\xc8\xb0\x53\x72\x4d\xa6\x27\xf8\x57\xe1\xbb\x8f\x4a\x42\x53\x18\x08\x48\x91\xef\x17\xf9\x92\x90\x7e\x7d\x5b\xe4\xab\x14\x29\xc5\xdc\x4e\x19\xc7\x74\x32\x16\xc9\x92\x38\x39\xd6\x4f\xb4\x6c\x14\xab\xac\x20\xd1\xcf\x58\x51\x4c\xd4\x44\x30\x95\xfd\xc7\xf5\x10\xe6\x23\x4e\x0b\xbb\x2a\x41\xba\xc1\x9c\xa7\x81\xd3\xa2\xd2\x3f\xa8\x86\x04\x66\x8e\x75\x11\x53\x06\xbb\xad\x51\x44\x4b\x1c\xff\x06\x85\x24\x9b\xc6\x49\x0d\x29\xaf\x75\x74\x4c\xdb\x99\x58\xb0\xdf\x6d\x22\x2a\x70\x80\x6b\x62\x88\xba\x5a\x2c\x11\xc5\x5c\x2c\xe7\xd0\x81\x9e\x0c\xff\x2f\x00\x00\xff\xff\xb4\x1f\xa2\xf7\x92\x9c\x00\x00") - -func asset_stat_trustlines_6HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_6HorizonSql, - "asset_stat_trustlines_6-horizon.sql", - ) -} - -func asset_stat_trustlines_6HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_6HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_6-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4, 0x4c, 0x50, 0x7, 0xc6, 0x90, 0x59, 0x72, 0xba, 0x3c, 0xf, 0x5c, 0xd3, 0x4a, 0xc6, 0xc, 0x2a, 0x67, 0xad, 0x60, 0x8c, 0xe7, 0x41, 0x41, 0x93, 0xde, 0x5a, 0x0, 0x42, 0xa3, 0x1d, 0x38}} - return a, nil -} - -var _asset_stat_trustlines_7CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xd9\x92\xe2\xc8\xd2\xe6\x7d\x3d\x85\xac\x6f\xb2\xda\xa8\x3e\x28\xb4\x85\xd4\x35\x75\xcc\xc4\xbe\x0b\xb1\x0a\xc6\xc6\xca\x42\xa1\x90\x10\x68\x01\x2d\x6c\x63\xe7\xdd\xc7\x10\x24\x5b\x02\x49\x42\x56\xf7\x19\xfb\x9b\x8b\xea\x6c\xe4\x72\xff\xe2\x0b\x77\x8f\x4d\xc2\xff\xf8\xe3\xcb\x1f\x7f\x50\x4d\x3f\x8c\xac\x80\xb4\xd5\x1a\x65\xa0\x08\xe9\x28\x24\x94\x11\xbb\xd3\x2f\x7f\xfc\xf1\x65\x73\x3d\x17\xbb\x53\x62\x50\x66\xe0\xbb\x07\x81\x39\x09\x42\xdb\xf7\x28\xe9\x5f\xc2\xbf\xc0\x91\x94\xbe\xa2\xa6\xd6\xcf\xcd\xed\x67\x22\x5f\xda\xf9\x0e\x15\x46\x28\x22\x2e\xf1\xa2\x9f\x91\xed\x12\x3f\x8e\xa8\x1f\x14\xfd\x3d\xb9\xe4\xf8\x78\xf2\xf6\x5b\xdb\x70\xc8\x4f\xdb\xfb\x19\x05\xc8\x0b\x11\x8e\x6c\xdf\xfb\x19\x92\x70\xa3\xf7\xad\x30\x76\xec\x8d\x6a\xe2\x61\xdf\xb0\x3d\x8b\xfa\x41\xbd\x74\x3b\x05\xf1\xe5\xfb\xab\x6d\xcf\x40\x81\xf1\x13\xfb\x9e\xe9\x07\xae\xed\x59\x3f\xc3\x28\xb0\x3d\x2b\xa4\x7e\x50\xbe\xb7\xd3\x31\x22\x78\xf2\xd3\x8c\xbd\xad\x2d\xdd\x37\x6c\xb2\xb9\x6e\x22\x27\x24\x27\x66\x5c\xdb\xfb\xe9\x92\x30\x44\x56\x22\xb0\x40\x81\x67\x7b\xd6\x56\x24\xf0\x17\x3f\x43\x82\xe3\xc0\x8e\x56\x1b\xe5\xa6\xf9\x7d\x47\x00\x41\x01\x1e\xfd\x9c\xa2\x68\x44\xfd\xa0\xa6\xb1\xee\xd8\xf8\xdb\x86\x31\x8c\x22\xe4\xf8\xd6\xf7\x2f\x5f\x72\x2d\xa5\x49\x95\x1b\xb9\xbc\x46\x95\x0b\x54\x5e\x2b\xb7\x3b\xed\x9d\xe4\xbf\xe2\xa9\x15\x20\x83\x8c\xec\x30\xd2\x57\x21\x99\x7d\xbf\x29\x1d\xe2\xe9\x2c\xf6\x83\xd8\x0d\xef\x13\x26\xde\xfc\x1e\x49\x87\x18\x16\x09\xee\x91\xdc\xe0\x34\x09\xb9\x53\xf2\x0e\x31\x9d\x84\x91\x6f\x9a\x24\xb0\x3d\x83\x2c\x6f\xcb\x22\x8c\xfd\xd8\x8b\x74\xe4\x20\x0f\x93\xf0\xfb\x17\xb9\xd6\xc9\xb7\xa8\x8e\x9c\xa9\xe5\x8f\xa4\x95\x46\x6d\x70\x81\x5e\x3f\x58\x51\x89\xf6\xac\xd2\x68\x77\x5a\x72\xb9\xd1\x39\xba\xe9\x54\xf0\xe7\x74\x42\x56\xf7\xe8\x8f\x96\xef\xab\xde\xcb\x7c\x40\xab\x49\xee\xc0\x7c\x2c\x76\xbf\xee\x20\x0e\x23\xc7\xf6\x48\x78\x4b\xf3\x5e\xe8\x6e\xbd\x1b\x14\x24\xc9\x06\x37\xf4\x1e\x84\xee\xd7\xbb\x77\xf9\x5b\x7a\xf7\x42\x77\xeb\xdd\xca\xdb\x9e\xe9\xdf\xd0\x7b\x10\xba\x5b\xef\x34\xd6\xc3\x58\xbf\xa1\x73\x2b\xf0\x11\x7d\x8e\x1d\x8e\x66\x31\x89\x6f\x31\x7b\x2c\x76\xbf\x6e\x42\x82\x5b\xb4\x26\xd7\xef\xd6\x96\x84\xf1\x2d\x75\x5b\x81\xbb\xf5\x6d\xb3\xd2\x88\x20\xe3\xb6\xda\x13\xb9\x5f\xac\x7d\x97\x29\xc9\xec\xe7\x9d\x66\x74\xe4\xdd\x50\xae\x23\xef\x6e\xc0\xbb\xec\x77\x0b\xeb\xab\xc8\x47\x75\x6e\xe6\x00\xef\xab\xdd\x48\xed\x34\x27\xb2\xe7\x8a\x2f\xa6\xdc\xdb\xb2\xfb\xd4\xf8\x9e\xd8\x21\xd1\xbd\x23\xb9\x4f\x5c\xb7\xe5\x0e\x89\xe8\x1d\xb9\x7d\x62\x79\x57\xee\x2e\x7c\x87\x84\x72\x5b\x6e\x9b\x24\xde\x95\xd9\x87\xfc\x3b\x92\x9b\x38\xbe\x2d\xb2\x8d\xcd\xdb\x32\x27\xa1\x70\x5b\x54\x47\xde\x6d\x81\x57\x57\xbd\x4b\x6a\xe3\x79\x3b\xc1\xbc\xd6\xc9\x37\xda\x65\xa5\x71\x2c\xec\x4c\xad\x70\xe6\xec\x24\xda\xd9\x52\xbe\x2e\xbf\xd1\xf5\xfd\xcb\x76\x6e\xdc\x40\x2e\xf9\xf3\xf5\x3b\xaa\xb3\x9a\x92\x3f\x77\xb7\x7c\xa7\xda\x78\x44\x5c\xf4\x27\xf5\xc7\x77\x4a\x59\x78\x24\xf8\x93\xfa\x23\x99\x32\x67\x5b\x79\xb9\x93\x7f\xd5\xfc\xaa\xef\xcb\x89\xc6\xd3\x8b\x3b\xc5\x59\xa5\x5e\xcf\x37\x3a\x37\x34\x6f\x05\x28\xa5\x71\xaa\x80\x2a\xb7\xa9\x97\xd7\xf9\xed\xeb\x77\x61\xa2\xe4\xe5\xdc\xf2\x6b\xf3\x77\x36\xf7\x0c\xbd\xdb\x9e\x13\x2e\x1b\x4a\xe7\x8c\x4f\xaa\x5f\xee\x94\xf6\xb0\x8e\x27\xb4\x27\xe6\x0f\x5a\xce\x80\x7c\xa4\xf1\x6f\x94\x24\x04\x34\x6b\xe9\xa9\xb5\x59\xc5\x4c\x03\x1f\x13\x23\x0e\x90\x43\x39\xc8\xb3\x62\x64\x91\x84\x86\x3b\x27\xe0\x1b\x31\x83\x98\x28\x76\xa2\x9f\x11\xd2\x1d\x12\x4e\x11\x26\x9b\xd5\xc4\xcb\xd9\xd5\x85\x1d\x8d\x7e\xfa\xb6\x71\xb4\x40\x38\x69\xec\xb1\x43\xee\x9a\x99\xb8\xee\xa1\x91\xaf\x0e\x70\x89\xf0\xad\x97\x1f\x27\xdd\xaf\x5f\x28\x8a\x7a\xfd\xc6\x36\x28\x3c\x42\x01\xc2\x11\x09\xa8\x39\x0a\x56\xb6\x67\x7d\xe5\x85\xdf\x93\xbe\x69\x74\x6b\xb5\x6f\x89\xf4\xe6\x46\x0f\xb9\xe4\x82\xb0\x28\x5e\x12\x9e\x23\x27\xbe\x24\x0d\x00\x73\x2e\xee\xa0\x30\x72\x7d\xc3\x36\x6d\x62\x50\xb6\x17\x11\x8b\x04\x7b\x91\x2f\xbf\x9f\xf7\xfd\x3e\x8a\x9f\xe4\x22\x7c\x88\x88\xdd\x42\x80\xd2\x6d\xcb\xf6\xa2\xb3\x8b\x21\x99\x79\xb1\x7b\xf9\x9a\x17\xbb\x61\xac\x13\x2f\x0a\x36\x4b\xc1\xf3\x66\x6e\x65\x6c\xcf\x74\xd0\x66\xc5\x68\x90\x30\xba\x0c\x67\x2b\x38\xf2\x5d\x62\xf8\x2e\xb2\xbd\x0b\x52\x1c\x77\x0e\x3a\x1a\x05\x24\x1c\xf9\x8e\x11\x52\x11\x59\x9e\x23\x33\x1d\x64\x5d\x43\x74\xb3\x6f\x76\x8c\xc4\x1b\xab\x8e\x8d\x74\xdb\xb1\xa3\x4d\xe3\xb6\xed\x7f\xa5\xc4\x71\x6e\x5d\xb6\x2d\x6f\x33\x17\xda\xc0\xda\x7e\x73\x34\x1b\xd8\x4f\x2d\x76\xa4\xff\x4c\x96\xd5\x54\xb6\x94\xcf\x56\xa9\xaf\x5f\x5f\xbb\xe2\xdf\x3f\x28\xfa\xf7\xdf\x6f\xdc\x7d\x0e\xf0\x5c\xcf\x9b\x06\xbc\xa7\xf1\xa4\x2f\xcf\xb4\x9d\xf6\xf3\x7b\x9a\xde\xd2\x73\xa6\xee\x02\x7f\x5b\x9d\x6f\x03\x63\x33\xfe\x3d\x1a\x13\x9b\x29\xe3\x36\x1c\x3c\xdf\x20\xc7\xb1\x70\x12\x03\x6f\x8d\x9e\x8e\xcf\x8f\x9a\x3f\x9d\x18\x6f\x81\xec\xbe\x43\xe1\xe8\x08\x8c\xf0\xc6\xb7\xa7\x01\x99\xbf\x2b\xa4\xc7\x78\x42\x22\xc7\x0e\xa3\x77\x45\xf7\xb3\xed\x57\x77\xdf\x7e\x8d\x1d\x3f\x24\x91\xed\x5e\x89\xfc\x24\xb1\x5e\x88\xad\xa3\x3e\x3f\x9d\xd4\xef\xf5\x9d\xf5\xf7\xc1\xce\x15\xd7\xb9\xb6\x36\x38\x55\x73\x68\xc5\x35\x6f\xd9\x4d\xbe\x1e\xed\xb1\xdd\xc2\xeb\xeb\x3e\xc8\x49\x70\x67\x06\xdd\xee\xbc\x18\xd7\x32\x68\xe2\xee\x28\x0c\x49\x74\x89\xcf\x6d\xac\x5e\xbd\x8c\xdc\x4d\x58\x5d\x56\x3d\x0d\x6c\x4c\xbc\x2b\x49\x2c\xb9\x78\x2d\xc3\x25\x17\x29\xc3\x8f\x75\x87\x6c\xfc\x0d\xdb\xc9\x8e\xe4\xa7\x66\xd1\xa3\x1e\xde\x2d\x59\xb7\x6d\x39\xeb\xd7\x5d\x03\xaf\xf8\xc6\xee\xce\x1d\xc3\x67\xb7\xbe\xf2\x7e\xcd\x21\xb6\x13\xf6\x47\xfd\x61\xbb\xac\xdf\xba\x83\x3d\xbd\x34\xf0\xf3\x6f\x22\xd7\x0f\xa2\x3d\x1b\xb9\x7c\x41\xee\xd6\x3a\x14\x7d\x3e\x6c\x92\x65\x84\xa2\x88\xb8\xd3\x88\xda\x84\x45\x18\x21\x77\x4a\x6d\xa6\x4c\x7e\xbc\xfd\x86\x5a\xfb\x1e\x79\x3b\xd8\x9a\xc8\x76\xe2\xe0\x68\xa8\xbd\x66\x21\x5a\x4d\xc9\xfb\x9d\xb2\xdd\x96\x38\xd2\xfb\x36\xed\xef\x2d\x5e\xe9\x9d\xdd\xce\x86\x1f\x9c\x77\xea\xd7\x84\x89\x7f\x53\xf4\xef\x94\xdc\xc8\x51\xdb\xff\xfd\x5f\x3f\x28\x81\xe7\x59\xfe\xf7\x8b\x7d\x75\xbc\x0c\x7b\xb8\xcb\x8e\x77\x79\x8e\x73\xee\x15\x36\xb6\x1b\x6d\x9b\xa8\xbb\x08\x68\xb3\x76\x7c\x02\x4a\x18\xeb\x3b\x10\x01\x09\x4f\x06\x20\xf6\xe2\x8c\x31\x20\x68\x1f\x4b\x6f\xf1\x1c\xad\x79\x1f\xc5\x74\xb4\x59\x77\xc7\xc8\xb8\x05\x36\x0b\xc9\xad\x11\xe6\x2d\xce\xa3\x35\xfc\xa3\x38\x0f\x2a\xee\xc7\xf9\x66\x90\x3b\xbb\x4e\xbc\x39\x71\xfc\x29\x79\x67\x48\x3b\x98\x7e\x62\x20\x3a\xda\xee\x78\x82\x82\xd7\xfd\xda\xaf\xf7\xf4\xc3\xc1\x8b\xde\x23\x62\x76\x65\xa0\x39\x25\xe1\x75\x1f\xf8\x44\xe3\x39\x11\x27\xd6\xae\x92\x71\xd8\x23\x7a\x98\x8c\xc3\xa6\xf8\xd7\x43\xdc\x9e\x2e\xde\x2e\xc4\xd4\xad\xe8\x3e\xda\xe1\x7a\x14\xd5\xd1\x11\xc0\x23\xcb\xae\x64\xc4\xbf\x91\xa9\xed\x30\x8c\x49\x70\xbf\x2a\xec\x1b\x17\x57\xa7\x6f\x68\x89\x1c\xdb\xb5\xaf\xcc\x28\x6e\xae\x05\xff\xce\x55\xd5\x91\x77\x1e\x9d\xaa\x3c\xb4\x8a\x3a\xbe\xff\xb3\xd6\x51\x47\x3a\x1f\x5f\xff\xdc\xd2\xba\xed\xb4\x33\x4d\xbb\x9e\xfc\xf7\xe5\xc0\x3b\xd9\xee\x7d\xd8\xc9\x8f\xcf\xd0\xb6\x6e\x1e\x2d\x4f\x52\xf1\x1d\xeb\x8d\x73\x07\x5c\x26\xa7\x94\x57\xaf\xe2\x11\xf2\x2c\x72\x71\x61\x7f\x4c\xce\xf1\xb1\xdd\xe3\xb9\xfa\xb0\x77\xfe\x38\x45\x7f\x31\x3f\xba\x6f\xac\x2e\x91\x13\x2d\x03\x12\xc6\xce\xc5\xec\x1e\x2d\x5d\xf2\xee\x7a\xee\x70\xc4\xfa\x38\x9f\x67\xe7\x16\x8f\x92\x7a\x76\xe2\xfc\xf5\x2e\xe2\x76\x37\xdd\x62\x6f\x27\x72\x89\x88\xfb\xdc\xee\xec\x84\xfb\x11\xa2\x72\x9b\x95\xb5\xe9\x07\xef\x6c\x86\x52\x39\xb9\x23\xbf\xc3\xd9\x6d\x95\xe1\x87\xf5\x95\x1b\xed\x7c\xab\x43\x95\x1b\x1d\xe5\xb0\xa9\xd8\x93\x6b\xdd\x7c\x9b\xfa\xfa\x52\xcc\xb4\x9a\x83\x52\xb9\xc6\x64\xcb\x6c\xa1\xa1\x72\x19\xad\x56\xa8\x37\x72\xb5\x42\xa5\xdb\x68\x76\x99\xd2\x80\x1d\xd6\x0b\xed\x92\xd2\xe8\x66\xf3\x8a\xdc\xee\x43\x35\x0b\x15\x8d\x29\xbd\x7c\xa3\xa4\xed\x47\xd8\xfd\x17\xd2\xf4\x37\x8a\xfd\x46\xd1\xdf\xb6\x2c\x53\x2f\x2f\xdf\xa8\x17\x59\x95\x65\x59\xfe\xf1\xe3\x25\xb9\xc0\xbc\x5e\x3b\xfc\xfb\xfb\xf7\xf7\x10\xca\x7c\x3f\xd3\x1c\xc8\xfc\x80\xeb\xcb\xf9\x92\xd6\x6f\x31\xdd\xaa\xc2\x74\x15\x2e\xd3\x2d\x96\xba\x2a\xe4\xf2\xdd\x66\x55\x69\x30\x6a\xa9\xc7\xf5\x5b\x25\xa5\xdc\x6a\x54\xab\x25\xe6\x80\x50\xda\x20\x13\x79\x51\x92\x58\x8e\x97\xd8\x6f\x14\xb8\x01\x91\x7d\x04\x62\x96\x61\xd5\x02\x53\xea\xe6\x79\x46\xae\x6b\xdd\x42\xb7\xc4\xca\x83\x8a\xac\x69\x45\x4d\xeb\x31\xbd\x92\x36\x18\xb4\x84\xfc\x40\xcb\x77\x9a\xd5\x9c\x36\x6c\xcb\x7d\x01\x6a\x0a\x77\x03\xe2\x2d\x16\xb9\x87\x20\x6a\xd5\xa2\xd0\x6a\x70\x4a\xa3\x9c\x6f\x66\xeb\x8d\x42\x06\xb2\x8c\xcc\xb1\xc2\x90\x6f\x36\x72\xed\x56\xad\xd8\xaf\xc2\x62\xa6\x96\xad\xab\xb5\x72\x41\xe1\xda\x30\x3f\xe8\xf7\xba\x07\x88\xe2\x09\x44\xee\x36\x8b\xfc\x45\x88\x57\x5c\xfb\x7c\x4b\xf0\x89\x28\xb9\xbe\xd1\xf7\xd1\x50\x39\xdd\xec\xdb\xf3\x28\xb0\x86\x24\x9a\x3c\x2b\x10\x22\x88\x06\xd0\x19\xa8\xf3\xba\x28\x99\x0c\x8b\x4c\x9e\x05\x40\x87\xbc\x20\x21\x86\x33\x91\x09\x38\x9a\x45\x06\xad\xf3\x8c\x2e\xb0\xac\x4e\x43\x9d\x48\xd2\x86\x2a\xfa\xc9\xcf\x46\x07\x0f\x19\xc4\x10\x96\x31\x4d\x86\x13\x11\x0d\x75\x9a\x40\xda\x34\x80\x29\x18\x2c\x10\x31\x30\x11\x36\x18\x5a\x17\x30\xa6\x45\xcc\xb2\x06\x0f\x21\xcf\xf0\x92\x28\x88\x80\xe1\x11\x10\x5e\x92\xfe\xa3\x37\x1d\xf7\x5f\xfb\xc9\x68\x55\x9b\x5b\xa5\x57\xed\x6a\x06\xe6\xbc\x9c\x54\x62\xe8\xe5\x38\x93\x0a\x69\x2b\x0a\x17\xe5\xc5\x1a\x68\x46\xbb\x3f\x40\x99\x0a\x2a\x58\x1b\xf9\x7c\x83\xab\xa1\xf5\x94\x51\xdf\xd5\x3c\x94\x35\xc0\x25\x62\x99\xc9\x5f\xd0\x90\x4f\xfd\xbc\x9c\xc5\xfa\x15\x47\x35\x59\x86\xa5\x69\x40\x74\xcc\xe8\x22\xd4\x0d\x9e\x08\x06\x6f\x8a\x50\x30\x30\xcd\xe9\x1c\x06\x1c\xe4\x19\x83\x87\xac\x64\x18\x82\xa1\x03\x5d\xe4\x75\x16\x60\x53\x97\x04\x00\x81\xa8\x6f\x9c\xec\x33\x9c\x9d\x18\xac\x04\x75\x46\x90\x00\x60\x78\x8c\x25\x28\x21\x1e\xea\x82\xc0\x21\x20\xb0\x98\x00\x8e\x70\x06\x43\x0c\x93\x87\xbc\x84\x68\x51\x02\x90\x40\x5e\x47\xa2\x64\x60\x88\x4d\xc2\xbe\x24\xa3\x06\xe0\x79\x89\x87\x92\x08\xa4\x9d\xc7\x66\x99\xe6\x70\x0c\x1a\x31\xef\xd3\x7a\x05\xf6\x39\x6f\xa5\xcc\xbb\xcb\x22\xdb\x9b\xfa\x93\xd4\xbc\x20\x2b\x51\x16\x54\x99\x3a\xcc\x40\x61\x28\x15\x17\x9a\x30\x13\xab\xeb\xa5\xd6\xcd\x4d\xd8\x94\x69\x0c\xc3\x51\xb8\xce\xf6\x35\xa6\xad\xc7\xb2\x57\x69\xd4\xed\xb6\x1f\x3b\xd9\xd5\xd6\x19\xb4\x66\xaf\x3e\x5b\x6c\xfe\x2a\xef\xff\xd9\xa6\xb7\xf0\xf0\xff\x0b\xb9\xa9\xee\x7c\x27\xbb\x9a\xa4\x49\xbf\x28\x0f\xf2\xca\xc8\x41\x52\x7b\x39\x2c\x8d\x27\xcb\x62\x59\x15\xc0\xb4\x6c\x8f\xdd\x66\x41\x1a\xf5\xa6\x40\x9d\xf3\x41\xa4\x68\xa1\x3b\x69\x55\xf0\x4a\x73\x1d\xc2\x0c\xab\x85\xf1\x7a\xd4\x99\xd0\x31\x0b\x8c\xa1\x5f\x9e\x68\x3c\x88\x7d\x0f\x9b\x4d\x6e\x6b\xff\x82\x47\xe7\xc3\x4b\x5e\xf1\xea\xd1\x39\xba\xf2\x0b\x7d\xef\xd7\x7c\xee\xf4\x68\xde\xe0\x59\x49\xe0\x04\x20\x42\x89\x40\x4e\x22\x9b\x31\x49\x82\x06\x2d\x88\x04\x41\xdd\xe4\x24\x4c\x03\x5a\xe4\x90\xce\xd1\x50\x37\x00\x36\x00\x64\x24\x1a\x48\x9c\x41\x78\xcc\x6e\x46\xdb\x4f\x89\x0a\x93\x31\x20\x26\x2c\x44\x86\xc1\x98\x2c\xc7\x8a\x82\x49\x00\x22\x3a\x0b\x79\x43\x30\x4d\xce\x90\x38\x01\x9b\xb4\x04\x4d\x96\xc1\x02\xa1\x05\x41\x37\x0c\x42\x24\x91\x60\x1d\xe9\xcc\x66\x62\xc2\x1e\x3c\x9a\x79\xcd\xc1\xd9\x74\x7d\x2c\x67\x04\xb1\xca\x11\x49\x73\x81\x39\x62\x58\xb9\x4d\x2f\xba\x46\x1b\x68\x8a\x01\xa2\x50\x1f\xe9\x75\x9c\xe2\x07\x5a\xb1\xb6\x8c\xab\x33\x65\x20\x74\xd5\xfc\x60\x3c\x06\x43\x71\xd0\x41\x2b\x81\x49\xb5\x23\x7d\x32\x04\x9d\x69\xac\x5a\xa8\x3c\xb4\xe7\x2b\x8d\xe3\x12\x86\x37\x1e\x1d\x1c\x31\x9e\x1d\xc2\x4a\x96\xcb\x97\xbc\x01\x5d\xd4\x5a\x8d\xfc\x02\xdb\xbe\x33\x80\x53\xa0\x78\x24\xd5\xe1\x23\x27\x53\x0d\x9c\xac\xb1\x40\x74\x6e\x05\x44\x8e\x0d\x8c\xda\x5a\xe5\xf4\x54\x31\x0e\x59\xad\x9f\xa6\x99\xae\xde\xcc\x6a\xe2\x6a\x19\x67\xdc\xb9\x01\xa7\xe3\x30\x0e\xca\x49\x0e\xae\x5f\xf0\xd8\x12\x7d\xa9\xd7\xff\x07\x78\xac\xc0\x20\x22\xf1\x8c\x28\x02\x9e\x25\x98\xe5\x08\x94\x38\xa2\xd3\x88\x25\x98\xd1\x25\x28\x8a\x06\x20\x22\x83\x38\x91\x10\x5a\x60\x24\x93\x03\xac\xc4\x02\x06\xb1\x50\x67\x79\x89\x49\x3c\xf6\x33\xbc\x9e\x98\x1c\x12\x01\x2d\x60\xd3\x84\x34\xab\x8b\xa6\x80\x05\x22\xb2\x88\xa3\x0d\x91\x43\x06\xc1\x2c\xe2\x59\xc6\x80\x02\x66\x39\x53\x12\x36\xd6\x4d\xc4\x8a\x06\x27\x01\x89\x15\xf9\x8d\x0e\xee\xc8\x63\xc1\xab\xc7\x02\xd0\x71\x26\x83\x01\x21\x46\x45\x18\x5a\x15\x53\x45\xca\x14\x4a\x95\x45\x26\x9b\x9f\xd1\x19\x48\x63\x5a\xab\xaa\xc5\x2e\xeb\x2c\xe8\xb1\xac\x8c\x85\xce\x92\x16\x79\x8d\x4d\x0f\x85\x0a\x74\x07\xa5\x15\x6e\x8b\x16\x8c\x79\xc0\xe5\xca\xa0\x92\x66\x83\xa9\x98\x6b\x94\x0e\x39\x38\x38\x72\xa2\x1c\x9c\x57\x98\xa2\x36\xf0\x24\x5f\x49\x9b\x3e\xaf\x06\x6e\xa9\xea\x75\x7a\xe5\x59\x06\x05\x73\x98\x71\xb3\x51\xa8\x2b\x91\x6e\x0a\x9d\x79\xdb\xcf\x17\xd7\x69\x9c\x8b\x9b\x7a\x51\xc8\x4d\x65\x26\x1f\x90\x85\xd0\x5d\x01\x66\x41\xa7\xfa\x64\xad\x09\x4a\xa3\xdd\x9a\x70\xbd\x44\xb3\x7a\xc1\x63\x2b\x83\x4b\xbd\xfe\x3f\xc0\x63\x91\x04\x05\x49\x62\x59\x43\x30\x09\x2f\xd1\xc9\x78\x2f\xb2\x86\x09\x00\x06\x90\x27\x2c\x40\x10\x43\x0c\x24\x83\xa3\x19\x4e\x14\x18\x9d\xc1\x10\xb3\x92\xc8\xf1\xa6\xc0\x20\x06\x25\xb3\x86\x4f\xf0\x7a\x83\xe7\x69\x8c\x69\x82\x31\x03\x39\x46\x37\x20\x47\x13\x91\x18\x92\xc4\x03\x46\x67\x45\x96\x66\x80\xc0\x23\xcc\x63\x80\x31\xc7\xd0\x22\x16\x74\x8e\xb0\x2c\xe0\x19\x86\xa3\x11\x67\xbe\x24\x4b\x90\xbd\xc7\x32\xfb\x59\x43\x35\x76\xda\x76\xa6\x9b\x5a\xd0\x3c\xdf\x09\xb2\x63\x98\x8d\x35\xbb\x51\xf2\xab\x93\x71\x9c\xb1\x3d\x3a\xcf\xd7\xdb\x3e\x1b\x82\xc9\x44\xd2\xe3\xd5\x74\xd2\x26\x72\x8e\x4c\xd3\xd3\x4e\xdf\x99\x66\xa4\xbc\x90\x9f\xc5\x13\x7e\xe9\x4e\xe3\x79\x61\x55\x58\xcc\x8c\x61\x6d\x20\x6d\x07\xe4\xc4\x63\xad\x03\xe3\x71\x3d\x53\xc7\x4b\x0b\x58\x9d\x89\xd3\x6b\x88\x31\xe3\x0e\xd2\x4a\x53\x75\xab\xd9\x7a\xd8\x6f\xb2\x8a\x1c\x14\x17\x42\xad\xbb\xea\x38\x5e\xaf\x5b\x5f\x28\xeb\xac\x91\x9d\x6b\xaa\x32\x8e\xdc\x5e\x3e\x50\x72\xf2\x68\x88\x96\xb8\x54\x57\xad\x71\x31\x52\xea\xcb\xae\xad\x56\x3b\xc9\xac\xa0\x7b\xc1\x63\xab\xe2\xa5\x5e\xff\xff\xdd\x63\xaf\xac\xf2\x2e\x3c\x15\xf0\xc4\x9a\xf1\xed\x91\xf2\x33\xca\xae\x9d\x79\x3e\xa7\xf3\xfc\xd8\xf2\x09\x6d\x57\x0e\x1d\x9f\xd0\x78\xe5\x78\xf0\xa3\x2b\xee\xa3\x23\xc2\xa3\xcd\x1f\x61\xc8\x34\x7b\x7c\xb3\xd9\x2e\xf4\xb5\x01\x33\xac\xb2\xea\xb0\x99\xe9\xd6\xf3\x05\x08\x2b\x5d\x2e\xcf\x34\x38\x86\x69\x15\x19\xb6\xc3\x96\x6a\xb5\x61\x26\xc7\xe5\xb4\x66\xae\xb1\x5d\x35\x6c\xd7\xb6\x39\xc6\x68\x06\x00\xf2\x85\xc8\x2c\x86\x33\x36\x57\x5b\xd0\x03\x75\x9e\x9e\x4e\x17\xae\x2b\x82\x59\x25\xd2\xbd\x50\x00\x7c\xb6\x69\xc1\x83\xf7\x25\x93\xfc\x6c\xf2\xe7\x26\xcc\xf2\x63\x5a\xcf\x98\xb3\x60\x11\x34\x0b\x86\xaa\x74\x4c\x5e\x02\xee\xaa\xb8\xae\x57\x86\xe6\xb0\x12\x73\x59\x3c\xa1\x57\x95\xaa\x2d\x74\x6b\xd5\xed\xba\x12\x4b\xdd\xd5\x76\xca\x65\xed\xff\xc9\x24\x4a\x17\xfb\xff\xcf\xc9\xb2\x94\x3d\x8a\xe2\x4c\x35\x6f\xaf\x83\xa9\x30\x18\x0d\xca\x61\x08\xd1\xd2\x2b\x82\x79\x21\x4e\xf7\x0c\x1f\x08\x8c\xcd\x94\x61\xbf\xcd\xaa\x08\x55\x8d\x49\x37\x51\x27\xd9\xa1\x0d\x32\x3d\x20\x04\xa8\x2d\x93\x5e\xbf\xb8\x24\xc6\xd4\x98\x17\xfa\x43\x05\xd1\xcd\x7e\x5a\x31\x59\x3c\x10\x5d\xdc\x24\x2b\x8d\x96\xa3\x1c\x58\xf8\x93\xa1\x0e\x30\x97\x8e\xd8\x94\xc7\x73\x8d\x4e\xcd\x65\xd6\x95\x29\x0d\x22\x2b\x1a\x09\x82\x8e\x53\xa6\xac\xfe\xf8\x71\x3e\x5a\x7c\x72\xd7\xb0\x4f\x75\x4d\xfd\xb4\x6b\x72\xb9\x22\x37\xf3\xf9\xf1\xb4\x25\xb7\x6c\xa5\xd9\xf3\x96\xa3\x46\x50\x0b\x74\xbe\x0a\xe2\x96\xd7\x53\x5c\x3e\x9b\xf1\x47\x6e\x35\x5d\x31\xc7\xd6\xbe\x6b\xce\x17\x51\x1f\xa6\x3e\x65\xa6\xf5\xf6\x8c\x0d\x5a\xb5\x16\xd6\x1b\xa5\xe6\xa4\x3d\xeb\x8d\x67\x6a\x4f\x6a\x10\x81\x1d\xb5\x0a\x53\xba\xcf\x85\x83\x62\x4f\xe8\x96\x21\x1e\xc7\x7e\x2a\x1b\x46\xb6\x35\x19\x0d\x06\x2d\x63\xd4\xaa\x0a\xa5\x4a\xa3\x6d\xe9\x2c\xd2\x32\x36\xb4\xc6\x9a\x45\x1c\xbf\x9b\x93\x7f\x39\xf5\xdc\x53\xd4\xab\x67\xd4\x67\xeb\xb2\xd0\x9c\x36\x4b\x9d\xb5\x63\x9a\x92\xe7\x7b\xf1\xd0\x32\x2b\xcb\xda\x2a\x17\x43\x4f\xb3\xea\xe3\xae\x97\x26\xb1\xb7\xa8\xd3\xe4\x10\x15\xd1\xb3\xd4\x33\x9e\x67\xf7\xea\x9a\x32\xb4\xe7\xfc\x44\xb2\x9d\x91\x27\xa6\x17\x76\x4b\x31\xd2\x51\x3d\x2b\x32\xb8\x55\x2f\x98\x4d\x69\xe6\x71\x38\x64\x38\x2d\x37\x99\x76\x74\xaf\xd7\x37\xd4\x7c\xce\x65\xfb\xee\x5a\x5f\xac\xfc\xd8\x81\xf9\x52\xb0\xf4\xda\xc3\x62\x14\xaf\x1d\x77\x96\xb3\x7e\x39\xf5\xfc\x53\xd4\x77\xcf\xbd\x1e\xc4\xb0\xea\xb6\x2a\x9c\xdc\x10\xbc\x94\xd3\x40\xfd\x49\x89\xee\xf8\xed\x99\xd0\xf1\x8a\xc8\x15\x44\xad\xac\x65\xa7\x60\x12\x8d\x99\xc5\x9e\xfa\xf8\x59\xea\xe7\xb9\x75\x29\xe7\x75\xf4\x81\x0e\x6c\x7a\x36\x12\xc2\x88\xab\x49\x66\xbb\x39\x77\x15\xc3\x9d\x38\xeb\xaa\x53\x73\xfa\x15\x6f\x3a\x1c\x72\x0b\x37\x95\xab\xa5\x34\x37\x74\x5a\x4a\x10\xc9\xbd\x36\x52\x33\x59\x54\xcb\xcc\x24\x49\x4e\x61\xa7\x92\xab\xe5\xd9\x6e\xda\x1d\xb4\xb3\xbb\x84\x73\x7d\x74\xb9\xf4\xe4\xc5\x03\xa3\xcb\xeb\xd3\x17\xfb\xce\x64\x44\x4e\xd4\x59\x44\x24\x22\x89\x22\x2f\x32\x0c\xd6\x59\x5d\xd0\x81\x84\x05\x43\x30\x81\x40\x4c\x83\x87\x82\x68\x40\x64\x20\xc6\x10\x45\x62\x08\x9c\x0e\x39\x80\x04\x11\x41\x81\xe3\x8f\x3b\x35\xf1\xef\x7c\xf2\x67\x73\x48\xa7\xe6\xda\x7c\xd2\x07\x22\x5a\x05\xb8\x3e\xcf\xb5\x46\xd9\x74\xca\xf5\xb2\x48\x5f\xf7\x7d\x17\xc4\x64\x1d\x68\x93\x72\x2a\x17\xbe\x37\xd3\xb9\xf2\xa4\xc5\x87\x1b\x7f\x78\xda\x62\xdf\x78\x07\x85\x51\xf2\x1c\xa7\xb1\x7b\x9e\xea\xec\xb3\x99\x86\x3f\xbd\x1c\x38\x8f\xa8\x0b\x38\x5e\x5f\xb3\xde\xbe\xc3\x71\x8e\x62\x8b\x03\xd0\xf7\x68\xf2\x48\xb4\xf0\x83\xc9\x14\x85\xe1\x74\x14\xa0\x90\x5c\xd0\xd4\x21\x61\x44\xb5\x73\x05\xaa\xb1\x15\xa6\xbe\x53\x6d\x32\x8d\x88\xab\x93\x80\x62\x68\xc0\xdf\x63\xc8\xf4\x03\x4c\x42\x3c\xf5\x3d\x8f\x2c\x23\x07\xc5\x1e\x1e\x9d\x1b\x4a\xde\x91\xb8\x47\xd9\x96\xfd\xdd\x19\x64\x78\xb9\xfd\xff\x37\x39\xb2\xfc\x2d\xb2\x5d\xf2\xdb\x9f\x14\xbd\x3d\xc1\xfc\x6d\xf7\xd2\xf9\x6f\x7f\x52\xdb\xeb\xc9\x97\x23\x14\xfe\xf6\xe7\xf6\x0d\x8d\xe4\xcb\xff\xec\x84\x4d\x42\xee\x13\x74\xd1\x32\x5a\x86\xf6\xfa\x4e\xf1\x80\x84\x24\x98\xbf\x27\xfc\xe5\x3f\xf7\x50\xb1\xcb\xb6\x28\xc0\x23\x7b\xbe\xbb\x78\x85\x8a\x43\xdb\xc1\x0e\x48\x02\x23\xf8\xed\x4f\xea\xb7\x39\x00\xff\x02\xff\xa2\x7f\xdb\x5d\xc0\x71\x10\x10\x2f\xaa\x25\x3c\xff\xf6\x27\xc5\x9f\x7e\x9f\x49\x9e\xba\xde\xe0\xfd\xdf\xfb\x06\x1c\x9a\xb2\x97\xdc\x28\xa6\x69\xd1\x94\x10\x34\x0c\x5a\x14\x39\x9a\x17\x38\x62\x12\x1e\xd1\x04\x98\x9b\x15\x2a\xc6\x2c\xcf\x4a\x18\x40\x8e\xd7\x4d\xc6\x64\x79\x03\xeb\x2c\x8f\x4d\x68\x08\x66\xb2\x5f\x23\xec\x10\xed\xf5\x6e\xbc\xe7\x84\xb8\xfd\x95\xa4\xed\x9b\xae\x3e\xb9\xf4\x9f\xb3\xfb\x43\x0f\x4d\x37\xb8\x18\x24\xb1\x3a\x23\x88\x58\x14\x0d\x44\x00\xc7\x72\x22\x24\x80\x13\x08\x83\x69\x13\xf3\x0c\xcb\x21\x5e\x12\x0c\x91\xc7\x90\xa7\x75\x0e\x12\x04\x10\x86\xba\x60\xd2\x3a\x63\x62\x91\xf9\xed\xcb\x05\x0b\x57\x38\x20\x26\x0b\x10\x43\x23\x56\x12\x09\x81\x2c\x26\x0c\xc3\x40\x9e\x20\x11\x40\x08\x45\x41\x47\x98\xe7\x04\x5e\x30\x59\xd6\xc0\x98\x33\x59\x93\x60\x81\x36\x78\xde\x30\x4c\x20\xb0\x86\xf4\x71\x0e\xc0\xb7\xb7\xd7\xfc\x38\x9a\xc6\xd1\xe7\xb6\xfd\x16\xc3\xcf\x1e\xd9\x7d\x84\xe1\xa7\x6d\xfd\x22\x2f\xfb\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x85\x1c\x24\x7f\xfd\x9f\xfb\x16\x0d\x9b\x75\x6c\x88\xa7\xc9\xbb\x8d\x97\x3e\x2f\xaf\x2b\xf4\xed\xd9\x8c\xe4\x75\x04\x89\xa4\x5a\xba\xb6\x0c\xaa\xd1\x62\x25\x36\x8a\xf9\x5a\x5a\x40\xb8\x32\x9d\x37\x90\xad\xf7\x79\xa8\x44\x44\x1d\x73\xca\x62\xbf\x4d\x52\x48\xfe\x5d\x8d\xca\xa1\x20\x10\xb7\xdc\xcf\xd6\x6a\x0a\x13\x0e\x97\x91\xbe\xd4\xe7\x40\x43\x0d\x12\xf9\x91\xad\x80\x49\x44\x17\x5d\xdb\x1b\x16\xf6\x3b\x02\x95\xf1\x93\xdb\x34\x8f\xec\x28\x64\x64\x3b\xd3\x9c\x2f\x95\x52\xd9\xd6\x86\xed\xb1\x10\xae\x9d\xbe\x92\xcb\x0c\xcb\x11\xcf\xe5\x0b\x62\xb7\x93\x0f\xc6\x83\x75\x5f\xc3\xd3\x54\xda\xe9\xc5\x0e\x2c\x2f\xdd\x00\x59\x23\x55\xab\x2c\xba\x81\x33\x36\xd7\x65\x87\x76\xbb\xfc\xb2\x10\x88\x29\x7e\x44\x84\xe9\x32\xa3\x8a\xb9\xc5\x2b\x9e\xec\xe0\xc9\xb3\xb1\xcc\x23\xdb\x60\x6a\xd9\xea\x40\xb1\x33\x5a\x95\x1d\xa6\xeb\xa7\x82\x3a\xdf\x1b\x5b\x8b\x7e\xbb\x46\x48\x26\x63\x16\xf2\xcb\x2a\xc7\xd4\x81\xc3\x56\xcd\x39\xdf\xd3\xa7\x64\x55\x1f\xce\x18\xbf\xdc\x2d\xac\x70\xa1\xca\x0f\x58\x71\x55\x31\x2a\x8e\x82\x5b\x28\xdd\x8c\x07\x5a\x3c\xc3\x6a\xb7\x29\x8b\x09\x9c\xa0\xd8\xee\x34\x85\x55\xa4\xb6\xdc\xa1\x99\xaf\x04\xf2\x58\x88\x9a\xa4\x65\xa6\x06\xc5\x7a\x30\x5c\x8e\x7b\xc8\x50\x96\x8d\xfc\x0c\x4b\x46\x40\xc6\xa0\x8a\x94\x72\xb1\x5f\xe2\xf2\xcd\xd0\xaa\xe6\xec\x3c\x3b\x53\x2c\x12\xaf\x94\x3a\x19\xc3\x95\x11\xac\x9c\x61\xdd\xe8\x3c\xed\x6f\xd6\xbe\xff\x17\xcf\x9e\x45\x26\x9f\xf6\xc7\xfc\x57\xad\x2d\xc4\xe5\x82\xa7\x19\xa6\x28\x0d\xa2\xaa\x4f\x82\x1a\xc9\xa6\x35\x7a\x0c\xf9\xb1\x37\x9c\x56\xf0\x6a\xda\xe6\x7b\xf6\x50\xe8\xf7\x49\xbd\x32\xb7\x56\x69\x87\x0f\x2a\xdd\xce\x0c\xaa\x85\xae\x3b\x91\x55\xd7\x5e\xa0\xb9\xa9\x36\xbd\x4a\x5b\x5d\x2d\x1b\xa0\xc9\xbb\x79\x2b\x39\xdd\xcf\x0c\x66\x42\xaf\x5a\x2e\x74\x60\xae\xe3\x39\x4a\x58\x6d\x86\x55\x9e\x94\x69\x62\xcd\xda\x0a\x57\xac\x9a\x6a\x67\xb2\xac\x8e\xc9\xba\xdf\x56\x0f\xfe\x52\x15\xc6\xc4\x66\xc7\xae\x5f\x16\x3b\x45\x27\x97\x26\x16\x66\x61\x53\x8b\x4a\xd5\xea\xba\xdf\x13\x17\x3d\x7b\x98\x41\xd9\x98\xaf\xf1\xc9\x09\xc1\x30\xb9\xe9\xe8\x1c\x47\x3e\xf3\xbf\xa3\xf8\x52\x98\x6c\x5a\x56\x38\x7e\x90\xc9\xb1\x51\xa9\x57\x50\x40\x8b\x95\xe9\x3a\x99\x34\xc5\x4a\x4b\xf0\x1a\x40\x96\x48\xdf\x36\x56\xe5\x28\xd9\x86\xcd\xf4\x7a\x8d\xed\x8d\x72\x16\xc4\x19\xa3\xe4\x77\x62\xab\x3e\x57\xa3\x1c\xcc\x8c\xca\x35\xb6\x41\x24\xa3\xd7\x34\x8b\xe5\x54\xc5\xe6\x2b\xf3\xae\x92\x1a\xca\x11\xdc\xf6\x6f\x31\x5b\xed\x1f\x7a\x5a\x2e\xee\xf1\xaa\x8a\x11\x97\x46\x62\x2c\x78\x1c\xca\x77\x0a\xa5\xb4\x2c\x64\xec\x82\x63\xe6\x9b\xb3\x5c\xb8\xc6\xc3\x1e\xf6\xb3\xe5\xd6\x5c\x1e\xb0\xec\xb8\x92\x02\x48\x5d\x0e\xc4\xf2\xaa\xab\x4e\x0b\xb4\xaf\xe9\xb8\xda\x23\xd6\xba\x37\x6c\x28\x22\x50\xba\xf9\x46\x5a\x2a\xf3\x85\x74\xce\x2a\x1f\xda\xfb\x6b\x76\x28\xaf\xbc\x75\xf5\xd1\x1d\xca\xa3\x37\xaf\x3e\xe3\xc9\x6f\xf0\x8d\x7a\xe6\xa9\xec\x97\x6e\x3b\xf7\xf2\x8d\x92\x18\x86\x65\x21\x43\xb3\x82\xc8\x73\x10\xf2\x22\x0d\xbf\x51\x80\x06\x0c\xbb\x19\xaf\x12\x2b\xfc\x8d\xa7\xb0\x2f\xb6\xe9\xf1\xe7\xb0\x7f\x61\x9b\x24\x00\x00\xe0\xaf\xb5\xe9\x5a\xcf\x5f\x7b\x19\xe9\xc3\x7d\x7f\xfc\x42\xd2\x61\x5f\x58\x67\x25\x91\xe8\x1c\x22\xa2\x04\x79\x81\x65\x78\x81\x63\x31\x32\x18\x80\x25\x8e\x00\x56\x37\x31\x0d\x39\x9d\x65\x58\x42\x44\x96\x00\x0e\xe8\x26\xa4\x01\xe2\x0d\x89\xe6\x4c\xa0\xef\x1e\x1c\x3d\x19\xfd\xeb\x67\xd1\x9f\xb1\xd3\x19\xba\x46\x57\x8a\xab\x68\xb4\x68\x00\x67\x40\xa3\xd5\xd4\x07\x52\xa3\xb4\x9c\xd7\xb2\x2b\x85\x8f\x32\x79\x9c\xed\xcd\x17\x05\x69\xc1\x5a\x51\xa0\x78\x43\xf9\x8e\xcf\xd5\x07\x90\xf3\x67\xd9\xe8\xe3\xf6\x07\xe9\x14\x3e\xcf\x5e\xf7\xd9\x7f\x7b\xbe\x75\x99\x77\x53\x82\x18\x99\x26\xd2\x45\x0c\x04\x9a\x61\x11\x0b\x45\x91\x03\x02\x8f\x75\x5a\x67\x4d\x13\x20\xc4\x18\xc8\xe4\x68\x9a\x36\x89\xc9\x49\x06\x03\x88\x89\x45\x0e\x1a\x86\x6e\xea\x04\x6d\x79\x67\xde\xf2\xfe\x37\xb5\xfb\xb3\x78\x17\xb9\xc3\xfd\xe5\x5f\xc0\x3b\x64\x78\xc8\x0b\x3a\x30\x75\xc3\x14\x59\x9d\x16\x01\x03\x4d\x56\xe4\x89\x49\x0c\x93\x96\x68\x09\x63\x71\xfb\x44\x3f\x81\xc0\x04\x98\x16\x25\x68\x00\x9e\x63\x20\xd6\x79\x64\x18\x5b\xde\xd9\x4f\xe7\xfd\xd1\x76\x7f\x16\xef\xb0\x7b\xb8\xbf\xfe\x0b\x78\xa7\x69\xa4\x4b\xd8\xc4\x84\xd1\x39\xcc\x01\x0e\x18\xa2\xae\x0b\x50\x10\x0d\x83\x96\x38\xdd\xd0\x75\x80\x21\x47\x0b\x10\xd0\x86\xae\xb3\x3a\xa2\x89\x29\x89\x22\xa4\x4d\x81\x45\x2c\xc7\xed\x1e\xe7\xbd\xc9\xbb\x0c\x07\x35\x51\x86\x63\xc7\xca\x37\x09\x6d\x74\xbb\xb0\x57\xc2\x39\x75\x29\xa8\xe9\x85\x53\x9a\x61\xb6\x9b\x03\x3c\xaa\xb0\x65\x1b\x24\x6d\xa9\x74\xb3\xa9\x5d\xa3\xce\x67\x71\xf7\xf3\x9e\x7b\xce\xbe\x82\x1f\xb3\x7f\x2f\xef\xba\xc1\x89\x82\xa1\x1b\x06\xcd\x18\x9c\x40\x8b\x00\x0a\x10\x60\x0e\xf1\x08\x12\xc9\x10\x88\x28\xf0\x18\x31\x12\xd6\x39\x40\x04\xc6\x80\x08\x99\x90\x46\x8c\x49\x08\xaf\xb3\x82\x41\xb6\xbc\xdf\xce\x33\xd9\xd8\x67\xfd\x88\xe3\x67\xd9\x66\x7e\x39\x55\xd3\xac\x5f\x6a\xa4\xd6\x00\xb6\x56\x76\x08\x1c\xb3\x5e\x18\xb8\x6a\xdf\x0a\xe2\x76\xaa\x23\xff\x0a\xde\x1f\xb1\xff\xab\x79\xe7\x19\x8e\xc5\x82\xc4\x72\x26\x6d\xea\x3c\x0d\x36\x73\x00\x51\x90\x10\x62\x75\xd3\xe4\x59\xc3\xc0\xac\x28\x61\x53\x04\xa2\x00\xb0\x89\x88\x00\x68\x8c\x19\x86\x47\x88\x00\x11\x63\xbc\x7b\x18\xf8\x36\xef\x1f\x9c\x15\x7f\x0a\xef\xf9\xe7\xec\xff\x6a\xde\x0d\x51\x80\x22\xcf\x08\xb4\x68\x48\x08\x99\x0c\x20\xc0\x84\x3a\xc2\xba\x24\x12\xc8\x9b\x06\x8f\x75\x56\xd2\x09\xa0\x0d\x48\x63\x09\xeb\x18\x8b\x34\x2b\x01\x03\xb2\x90\xd9\x74\xd0\xee\x91\xd6\xb7\xbc\x7f\xa2\xbf\x25\x14\x66\x3e\xc8\x7b\xe1\x39\xfb\x75\xee\x31\xfb\x37\x1f\x1a\xb9\xfc\x0a\xf8\xc7\x27\xa6\xbf\x7a\x56\x5a\xac\x89\x25\x75\xae\x4e\xf4\x2a\x53\x92\xd9\x7e\x6f\xdc\x0a\xaa\xee\x58\xa3\x69\xb3\x28\x86\xb5\x32\x74\xe9\x7c\x6b\x51\xe9\xa7\x65\x8d\x95\xf7\x6b\x5a\xf9\x12\x4b\x6f\x58\x8b\x74\x4b\x6b\x09\x79\xe8\xe7\x6a\x74\x4d\x4d\x2d\x06\xed\xac\xb4\xd6\xe6\x5a\xaf\xc3\x2e\xed\xa6\x3d\x88\xdb\x3a\xc8\xcd\x5d\xb5\x46\x92\x47\x87\xb3\x3d\x79\x7e\xfc\x2e\x5c\x66\x3b\x0a\x27\x9d\x32\x18\xab\xb8\xd9\x61\x8a\xfc\x68\xe6\x65\x5c\xab\x58\x24\x96\x54\x11\x1d\x0e\x83\xbc\xd7\x75\x96\x13\x27\xef\x94\xa4\x70\x36\x0c\x68\x09\x82\x82\xa0\xd4\xfa\x26\x49\xbb\xdc\x64\x5a\x88\xca\xa9\xb0\x4c\xdb\x60\x56\xb3\x23\x5e\xa6\x2b\xab\xbe\xa7\x8f\x06\xb5\x3e\xef\x6f\xd6\x22\x2f\xcc\xda\x55\xa2\xaa\x50\x31\xfa\x75\x67\x98\x5b\x45\x65\xec\x28\x79\x98\x96\x8d\x5a\x7d\x0c\xfd\xe6\x48\xd5\xa5\x45\xd1\x61\xd4\xce\xf2\xf0\xbc\xde\x0d\x0e\x0e\x9e\x71\xf2\x54\xce\x91\x6c\x12\xed\x9f\x31\x2b\x7a\x74\x56\x22\x7f\xc2\xac\xa8\xd0\xe9\x67\x82\x27\xec\xcb\xf2\xdf\x97\xad\x2f\x65\xcb\x5f\xbd\x04\x79\x3c\xc8\x6e\x6c\x1c\x6d\x3f\xc1\xac\x21\xd4\x88\x82\xac\xf1\xb2\x8e\xba\x4d\x49\xc8\xac\xcd\x50\x22\x34\xf6\x83\xc6\x50\x5b\x67\xfa\x95\x49\xc1\xaf\xc2\xc9\x7c\x92\x30\x77\x23\xc8\x32\x6e\x75\xda\xb6\xe6\xc1\xa2\xaa\x30\xb4\x96\x55\xcc\x81\xa9\x85\xc5\x7c\xbe\x1b\x2d\x06\x08\xe5\xcd\x59\x3b\x16\x56\x6e\xc5\x75\x72\x2e\x4a\x95\x35\xa1\x0c\xcb\x96\xa5\x77\x87\x75\x1f\xab\xc6\x50\xe2\xca\x75\xd9\xac\x1a\xaa\xdc\x98\x69\x7a\x59\x81\xab\x70\x41\x48\x3d\xbb\x09\x84\x94\xb6\x9a\xa7\x82\x71\x66\x90\x55\xc6\xa4\xac\xf6\xb5\x5a\x76\x9d\x5e\xce\x6c\x66\xae\xca\xb9\x94\x54\xa1\x47\x50\x1c\x95\x58\x3d\x95\xf2\xf7\xc0\xfe\xfe\x20\x7b\xd6\xc9\x9f\x0c\xb2\x19\x4c\x77\x72\xfa\x67\x06\xd9\x5f\x38\x15\xbd\x2b\xc8\x3e\x79\xbd\xf9\x78\x90\xe5\xce\xd0\xbf\x71\xb8\x0f\xee\xce\xde\x0a\xb2\x31\x67\x65\xd4\x74\x46\xd6\xad\x99\x09\x67\x8a\x1f\xa1\xc8\x1a\x76\x4b\xe3\x9c\x13\x2a\x51\xae\x61\x4c\x21\x72\x86\x2d\x3e\x5d\x98\x48\x66\x71\x9c\x72\x96\xf9\x95\x25\x0f\xfb\xeb\x01\x4c\xd7\x06\x60\xc8\xb6\x0b\x02\xa6\x67\x21\x80\x4c\x6d\x24\x4f\x26\xf3\x9e\x38\xa5\xeb\x9b\x40\xc0\x8e\xd1\x0f\xcd\xb9\x69\xc1\x6c\xa6\x92\x56\x0a\x30\xc5\x2e\x26\x95\x75\xb9\x5c\xd3\xeb\xfc\x52\xc4\xd9\x8a\xd9\xea\x65\xcd\x5a\x3f\x3a\xbc\x0c\xf9\xb7\x07\xd9\xd3\x4e\xfe\x6c\x90\xad\x02\xb5\x50\xfb\xc4\x20\xfb\x2b\xd7\xd9\x77\x05\xd9\x27\x6f\x2e\xe4\x22\x6b\xbe\xc8\xc5\x4a\x5f\x56\x25\xd8\x02\xad\x4e\xd4\x35\x16\x8d\x5c\x69\x9a\x4b\x67\xbb\x64\xba\x36\xd4\xa6\xe6\xf8\x1e\xb6\x6b\xc9\xbb\x8d\x47\x47\x20\x37\xa6\x8b\xc9\xbb\x8e\x8f\x1d\x69\xb0\xe9\xfd\xe7\xa0\x2f\xbf\xb7\xaf\xd6\x7a\x7a\xb9\x9c\x02\x35\x62\xaf\x97\x96\x87\x73\x65\x4e\xa8\x96\x56\x99\x88\xe6\x53\x25\x89\xf1\x40\xaa\xc5\x32\x62\x45\x5a\x37\x1c\xc6\xb4\x2a\x7d\xc6\x33\x3d\xb6\x50\xf6\x6b\xbd\x90\x99\xf5\x40\x2a\xdb\x9d\x06\x80\x01\x88\xc9\x40\xb9\x2e\x94\xaa\x01\xe7\x65\x6a\x72\x79\x1b\x14\xd5\x18\xa7\x95\x2a\xbd\xcc\xa8\x86\x0d\x87\xcc\xd8\xc8\x76\xe7\x7a\x88\x0d\x79\xb8\xcc\xe9\x21\xf4\x95\xd4\x60\xb4\x90\xc6\x3e\x7d\xe8\xbd\xcb\x01\x37\x38\xed\xd4\x93\x80\x4b\xb8\xdb\x26\xa8\xa3\x43\x9b\x07\x12\xd2\xd8\x3b\xf4\xc5\x95\xcf\x95\x4d\xcd\x93\x80\xff\x14\xfb\x57\x92\xcd\x3d\xf6\xcf\x17\x9c\xcf\x6e\x2c\x3d\xb4\x91\xfb\xd9\xf6\x3f\xb0\xe0\x95\x0f\xf6\xd5\x47\xec\x17\x7a\xdd\x57\x7f\xac\xf5\xb9\x02\x4d\x46\x8a\x20\xaf\xa4\x2c\xdd\x0c\x8b\x79\x6b\x8e\x01\x04\xa0\x2b\x89\x83\x31\xe7\xd6\x26\xae\xa4\x42\x7e\x92\x65\xe7\x47\x5d\x71\x08\xb8\xc5\x39\x7f\x77\x25\xa4\x4f\xde\x75\x7b\xfc\x4c\xf6\x2f\x4c\x48\x47\x67\xac\x19\x69\xe2\x56\xfb\xcc\x8c\x9d\x43\xd5\x5c\x89\xcd\x3a\x99\xe4\x75\xd0\xe9\x94\x79\x7b\x39\x9b\x94\xe9\x8c\x6f\x69\x81\x12\x41\x4b\x01\x02\xa3\xea\x93\x11\x63\xb4\x3b\x5d\x93\xe4\xfc\x39\xa6\x9b\x32\x32\x47\x39\x6d\x19\x8d\x7a\xb2\x13\xd6\xe2\xb1\x93\x71\x57\xe3\x8c\x3c\x48\x92\xc6\xbc\x3b\x8a\xe6\x86\x1c\xb5\x2c\x4b\x1b\x2e\x97\xd5\xbe\x27\x18\xba\x3f\xc4\xfe\x74\x45\x97\xdc\x9a\x36\x9b\xe3\x6a\x2d\xc5\xeb\x8d\xe8\xb0\xa1\xfe\x59\x09\xe9\x81\x65\xc8\xa7\x26\xa4\x27\xed\x7f\x62\x42\xfa\x94\x1d\xb0\xb7\x9f\xbf\x6c\xc7\xf7\xd9\x84\xf4\x51\xfb\x7f\x7b\x42\xfa\xe4\xed\xe8\x0f\x36\xe2\xbe\x84\xb4\x6d\xd4\x07\x9d\xfc\x99\x87\x44\xc4\xde\xca\x3e\x2c\xc6\xe5\xd2\x1e\xaf\x9a\xc7\xa4\xa2\x0f\xe2\xa9\xd7\x77\xba\x24\xe8\x0a\xb4\x65\x4e\x0b\x96\xd8\x98\x30\x88\x95\x05\xb5\xde\x36\x7b\x96\xea\x37\x0a\x43\xa5\x36\x6e\xc0\x35\xe6\x16\x70\x9c\x59\x2e\xec\x42\xb9\x6b\x0b\xd3\x95\x56\x69\x34\xd4\x69\x8d\x51\xd4\x65\xc7\xeb\x71\x56\x28\x39\xb9\xc0\x52\x93\x24\xd3\x9d\x34\x8b\x13\x5a\x6c\x46\x6a\x81\xed\x97\x11\xf2\x61\x1a\x34\x8d\x05\xe7\x35\xad\xc1\x00\xa7\xe2\x81\xba\xce\x56\x50\x30\x1a\xd7\x0f\x91\x7f\x39\x81\x9d\x39\xc1\x95\x04\x76\x4c\xf8\x03\x9b\x95\x4f\x27\xb0\x4f\xb4\xff\x58\x02\x3b\xdf\xc2\xff\xaf\x0b\x60\xf9\xf4\x68\xe5\xaf\xc6\x97\x5b\x6a\xd5\xea\xe8\xd9\x04\xf3\xc9\xe7\x2e\xff\x3c\x85\xf6\xc8\x53\x68\x49\x12\x60\x8a\xa4\x50\xb1\xc6\xc3\xd9\xbc\x4c\x4a\x6c\x1c\xc6\x03\x1e\xa4\x7b\xab\xb5\x9b\xca\x37\x70\xdd\xab\xad\xcb\x32\x5f\xd2\x1a\x2b\xbb\x78\xd8\xbe\x79\x2a\xc1\x1c\x8d\x9a\x8f\xcc\x50\x94\x43\xdf\x1d\x3d\x41\xf7\x26\x38\x2e\x7d\x32\x9f\x6c\x3f\xfb\x90\xfd\xe4\xcf\xf3\x04\xf3\xdf\xb4\x64\x91\x4f\xcf\x10\xff\x72\x7c\x83\xf2\x54\x7f\x0f\x5f\x5d\xfe\xef\x4d\x80\x97\xf8\xfb\x2b\xf1\x0d\x15\x6b\xfe\x7e\x82\xbe\x72\x46\x7b\xe3\x67\xa5\x3f\x7a\x50\x7b\xf6\xd3\xd2\xaf\xb9\xff\xf8\xa4\x75\xfb\xfb\x8d\x87\x5c\x71\x61\xf0\xb8\xae\x65\xbf\xde\xdd\xfe\xea\xe3\x1b\x2d\x57\x4b\xe1\xbd\xad\x10\xba\x2f\x01\xf8\xfa\xf3\xd3\xef\x34\xf3\xb8\x54\x69\x52\xa0\xf4\x48\x63\xf2\x9a\x84\x9c\xcb\x5d\x28\xda\xb5\x37\x48\x35\x5b\xe5\xba\xdc\x1a\x50\xd5\xfc\x80\xfa\xba\xaf\x67\xf0\x6d\x5f\x2c\xef\x6a\xe9\xba\xb3\xa2\xa9\x9f\x05\x3c\xbc\x81\x3a\xbc\x05\xf9\x52\x29\xb1\x43\x9d\xd8\xa7\xe1\xe9\xc8\xbb\x84\xec\xd5\xc0\x29\xa8\x6d\xf5\x92\xdb\x75\xc6\x6e\x16\xc8\x7d\x1a\xee\x89\xf2\x4b\xc0\x6f\x58\xa7\xba\x8d\xb2\xda\xcd\x53\x87\x9f\x34\xff\x50\x4b\x3e\x87\xef\x0f\x36\xe0\x6d\x1f\x1c\x4a\xaf\x5d\x29\x1b\x76\x52\x56\xf9\x69\xbc\x5b\x65\x97\x80\x1e\x99\x39\x45\xb8\x2b\x66\x75\xb9\x88\xd5\x71\x0d\xe9\xa7\xc1\x25\xba\x2e\x61\x3b\x18\x39\x85\x66\x4f\xbf\x25\xa5\xad\x6e\x16\x6d\xba\x50\x3b\xfb\x79\xa4\x47\x2a\x2f\x02\x3e\x37\x79\xa9\xd3\xaf\x54\x76\x3a\xa9\x20\xfe\x19\x48\xc3\x58\xbf\x82\xf1\xd5\xcc\x29\xba\xa4\x28\xd4\x8d\x32\x4f\x6f\xca\xa6\x3f\x0d\xf2\xa0\xf0\x12\xd0\x33\x73\x77\xe5\xb0\xa3\x1f\xca\x39\x2f\x1e\xff\x34\xda\x83\xc2\x4b\x68\xcf\xcc\x9d\xa2\x7d\x2d\x96\x74\xa3\x18\xd1\x9b\x22\xfa\xcf\xe3\xdd\x2b\xbc\x88\xf7\xd4\xdc\x29\xde\x7d\x3d\xa3\x1b\x75\x8a\x8e\xab\xc1\x7c\x0e\xe0\x83\xc2\x4b\x80\xcf\xcc\x5d\x9d\x1a\x6c\xeb\x14\x7d\x3b\x14\x21\xba\x59\x88\xe6\xb4\x6c\xcb\x27\xb5\xe3\x48\xe5\xc5\x96\x9c\x9b\xbc\x94\x25\x42\x32\xfb\xf6\x5a\x79\xe5\x7a\x91\x98\xa3\x12\x29\x9f\x85\xfd\x26\xf0\xa7\x50\x9f\x4d\x51\xcf\x2a\x97\x7c\x0e\xfe\x53\xa5\x97\x1a\x71\xc1\xec\xd5\x96\x1c\x17\x70\xb9\x36\xd5\xdc\x55\x77\xda\xbf\x41\x56\x6e\xe4\xf2\xda\x7d\xa5\x65\x12\xd1\x73\x3d\x94\xd2\x38\xcc\x62\xbb\xed\x72\xa3\x48\xe9\x51\x40\x08\xf5\x5a\x47\xea\x77\xaa\x5f\xca\xb7\xf2\xd4\x71\x5d\x29\xb0\x7f\x11\xf9\xed\x44\x93\x84\xd1\x76\x2c\xdf\xb4\xe2\x61\x94\xa7\x6a\x36\x20\x77\xf3\x94\x13\x88\xc7\xc5\x45\xbf\x1d\x97\x12\xfd\xb6\x2d\xf1\xf9\x06\xdd\xa6\x1b\xf4\x55\x48\x66\x0f\x03\xdb\x6b\xd8\x60\x3a\x04\xc6\x09\xac\xeb\x53\xc5\x8d\xb8\x49\xc8\xf3\x10\x5e\x95\x6c\x51\x1c\x25\x98\x3b\x81\xec\xae\x3c\x07\xe4\x58\xc9\x06\xc8\xe9\x44\xf8\x4e\x24\x21\x9e\x12\x6f\xfe\x24\x92\x63\x25\x1b\x24\x47\x3f\x47\x78\x3f\x8c\xdd\x80\xfa\x34\x92\x63\x3d\x3b\x30\xaf\xb3\x84\x53\x30\xc7\x05\x04\x6f\xa5\xaf\xe7\x10\x9d\x2b\xda\x40\x3a\xcb\x8d\xef\x72\xd4\xf4\xc3\xc8\x0a\x48\x5b\xad\x51\xaf\xbf\x41\x47\x19\xb1\x3b\xa5\xb0\xef\x4e\x1d\x12\x91\xc4\xec\xff\x0b\x00\x00\xff\xff\x29\xf5\x9c\x4a\x38\x8c\x00\x00") - -func asset_stat_trustlines_7CoreSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_7CoreSql, - "asset_stat_trustlines_7-core.sql", - ) -} - -func asset_stat_trustlines_7CoreSql() (*asset, error) { - bytes, err := asset_stat_trustlines_7CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_7-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0x2a, 0x37, 0x68, 0x92, 0x30, 0x7e, 0x37, 0x45, 0x9, 0x4e, 0x9d, 0x3, 0xbb, 0x92, 0x8e, 0xc8, 0xd4, 0xca, 0xfc, 0x6f, 0xbf, 0x63, 0x2c, 0x62, 0x67, 0xb4, 0x6b, 0x47, 0x70, 0xab, 0x7f}} - return a, nil -} - -var _asset_stat_trustlines_7HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x79\x8f\x9b\xc8\xb6\xf8\xff\xf3\x29\x50\x74\xa5\x4e\xd4\x9d\x34\xc5\x4e\xe6\xe5\x4a\xd8\xc6\xbb\x71\x7b\x5f\x46\x23\x8b\xa5\xb0\xb1\x31\xd0\x80\xb7\xbe\x7a\xdf\xfd\x27\x83\x57\xcc\xe6\x25\x99\xdc\xf7\xb3\xa2\xc8\x86\x53\x67\xab\xb3\xd4\x39\x55\x34\x5f\xbf\xfe\xf1\xf5\x2b\xf2\x66\x3a\xee\xd8\x86\xad\x46\x15\x51\x44\x57\x94\x44\x07\x22\xca\x62\x6e\xfd\xf1\xf5\xeb\x1f\xdb\xfb\xb9\xc5\xdc\x82\x0a\xa2\xda\xe6\xfc\x08\xb0\x84\xb6\xa3\x99\x06\xc2\x7e\xa3\xbe\x81\x13\x28\x69\x83\x58\xe3\xd1\x76\x78\x00\xe4\x8f\x16\xdf\x46\x1c\x57\x74\xe1\x1c\x1a\xee\xc8\xd5\xe6\xd0\x5c\xb8\xc8\x0f\x04\xfd\xd3\xbb\xa5\x9b\xf2\xec\xf2\xaa\xac\x6b\x5b\x68\x68\xc8\xa6\xa2\x19\x63\xe4\x07\xf2\xd4\x69\xe7\x99\xa7\x3f\xf7\xe8\x0c\x45\xb4\x95\x91\x6c\x1a\xaa\x69\xcf\x35\x63\x3c\x72\x5c\x5b\x33\xc6\x0e\xf2\x03\x31\x8d\x1d\x8e\x09\x94\x67\x23\x75\x61\xc8\xae\x66\x1a\x23\xc9\x54\x34\xb8\xbd\xaf\x8a\xba\x03\xcf\xc8\xcc\x35\x63\x34\x87\x8e\x23\x8e\x3d\x80\x95\x68\x1b\x9a\x31\xfe\x73\xc7\x3b\x14\x6d\x79\x32\xb2\x44\x77\x82\xfc\x40\xac\x85\xa4\x6b\xf2\xcb\x56\x58\x59\x74\x45\xdd\xdc\x82\x71\xd5\x36\xdf\x44\xda\x5c\xa6\xca\x23\xa5\x3c\xc2\xf7\x4b\xad\x76\x0b\xa9\x0b\xd5\xc1\x0e\xfe\xdb\x44\x73\x5c\xd3\xde\x8c\x5c\x5b\x54\xa0\x83\xe4\x9a\xf5\x37\x24\x5b\x17\x5a\xed\x26\x57\x12\xda\x27\x83\xce\x01\x47\xb2\xb9\x30\x5c\x68\x8f\x44\xc7\x81\xee\x48\x53\x46\xea\x0c\x6e\xfe\xfc\x15\x04\x65\xef\xdb\xaf\x20\xb9\xb5\xab\x5f\x27\xa0\x4f\xed\x7a\xe9\x7c\x06\xb7\x86\x1c\x47\xec\x04\xea\x88\xdc\x03\x2f\x09\x39\xbe\x7f\x02\xb9\x43\xeb\x71\x35\x82\xaa\x0a\x65\xd7\x19\x49\x9b\x91\x69\x2b\xd0\x1e\x49\xa6\x39\x8b\x1f\xa8\x19\x0a\x5c\x8f\x4e\x84\x33\x1c\xd1\x33\x74\x67\x64\x1a\x23\x4d\xb9\x66\xb4\x69\x41\x5b\x3c\x8c\x75\x37\x16\xbc\x63\xf4\x91\x93\xbb\xb8\xb8\x6e\xac\x0e\x95\x31\xb4\xbd\x81\x0e\x7c\x5f\x40\x43\xbe\x4a\x84\x93\xe1\x96\x0d\x97\x9a\xb9\x70\x76\xd7\x46\x13\xd1\x99\xdc\x88\xea\x7e\x0c\xda\xdc\x32\xed\xad\x3b\xee\x62\xea\xad\x68\x6e\xd5\xa5\xac\x9b\x0e\x54\x46\xa2\x7b\xcd\xf8\xbd\x31\xdf\x60\x4a\x3b\xbf\xbc\x81\xe9\xd3\x91\xa2\xa2\xd8\xd0\x71\xe2\x87\x4f\x5c\x5b\xf1\xf2\xce\x48\x37\xcd\xd9\xc2\x4a\x01\x6d\x25\xb1\xe4\x43\x89\x9a\x7d\x25\xe2\x7d\xd0\x4d\x3d\x60\x1b\x27\x54\x15\xda\xe9\x40\xf7\xe8\x6f\x18\xb2\x53\x6b\xba\x41\x5e\x68\xbd\x82\xc8\x69\x28\x4e\x1a\x61\x6d\x07\x4c\xdc\xc4\x19\x70\xce\x02\x90\xb4\x49\x34\xa3\xc9\xc1\xd3\xd3\x00\x9b\x3e\x1f\x66\x22\xa0\xe6\xb8\x23\x77\x3d\xb2\x92\x51\x6e\x21\x4d\x2b\x2d\x24\x4c\x0b\xb6\x4f\x25\xf1\xc0\xd2\xde\xdd\x13\xc1\x92\xa3\x98\xb4\x49\x37\x99\x7e\x8e\xdc\x6a\xdb\x71\x16\x49\x94\x0f\xc0\xb2\xa9\xc0\x2b\xd7\x05\x07\x33\xb0\x44\xdb\xd5\x64\xcd\x12\x8d\xd8\xe4\x9d\x34\x74\x64\x5d\xb9\x36\x39\x64\xb4\x6b\x39\x08\x1f\x78\x35\x7d\x4f\x79\x69\xe8\xf9\x80\x3f\x1d\xbf\x3f\x99\xdb\x99\xdc\x7d\xdd\xe6\x87\xfd\xd2\xcf\x33\x86\x51\x4a\x0e\xc6\xa6\x6d\x8d\xe6\xda\x78\xb7\x60\x88\x61\x21\x00\x99\x5a\xc6\xeb\xd7\x7b\x71\x98\xd3\x1a\xa7\x3f\x3a\x5b\xaf\x76\x6a\x02\xa2\x29\x3e\xe5\x1c\x9f\xe7\x3a\xd5\x76\x4a\xdc\x11\x46\xf7\x00\xcc\xbb\xe9\x8e\xc7\xe4\xfd\x4a\x2f\xfe\x3e\x4b\xb7\xf8\x46\x87\x17\xb2\x37\xe8\x6c\xbb\xce\x76\xe0\xfb\xd5\x94\xcf\x90\xa4\x1e\xad\xc0\x94\xb0\xc7\xd5\x6c\x6a\x09\x23\xbc\xfe\x1a\xf9\xc2\x51\xa4\x1b\xbb\x5b\xf7\xa5\x03\xde\x2d\xf2\x52\xcb\xb6\x8b\x00\xd7\xc8\xe2\x0f\x49\x09\xbb\x5b\xfe\xa5\xe7\x67\xbf\x5e\x4c\xc3\x51\x20\x86\xc4\x03\x9f\x84\x84\x1d\x20\x57\x28\x34\xf9\x02\xd7\x0e\x01\x9e\x6b\xdb\x8a\x43\x93\xe1\x67\x63\x31\x87\xb6\x26\xff\xf5\xf7\x97\x14\xa3\xc4\xf5\x0d\xa3\x74\xd1\x71\x3f\x8b\xc6\x06\xea\x5e\x2b\x26\xc5\x08\x55\xb3\x43\x87\xe4\x3b\x42\xb6\x5d\xaa\x0b\x31\xf2\x8c\xc4\xf1\xf8\xc8\xdd\x0b\x72\xc1\x68\x0c\x8e\xbd\x74\x77\xe0\xd8\xca\xea\x0d\x3f\x32\xff\x82\x5c\x23\x88\x27\x7a\x0a\x0c\x7c\xbf\xcd\x0b\xad\x00\x0a\xdd\x1a\x3b\xef\xfa\xde\x16\xb3\x45\xbe\xc6\x5d\x50\xf8\xf3\x0f\xbf\x0b\x27\x88\x73\xf8\x7d\x7f\x0d\x69\x6f\x2c\xf8\x7d\x37\xe4\x4f\xa4\x25\x4f\xe0\x5c\xfc\x8e\x7c\xfd\x13\xa9\xaf\x0c\x68\x7f\x47\xbe\x7a\xcd\xb9\x6c\x93\xdf\xce\xd7\x0e\xf3\x1e\xdf\x1f\x67\x18\xcf\x6f\xee\x10\x67\xeb\xb5\x1a\x2f\xb4\x63\x30\xfb\x00\x48\x5d\x38\x47\x80\x94\x5a\xc8\xd3\xbe\xed\xb6\xbf\xe6\x78\x48\x9e\x82\x94\xf7\xe2\xef\x68\x1e\x34\x94\x28\xcf\x99\x2e\x85\x7a\x3b\xa0\x4f\xa4\x57\x6a\x17\x0f\x6c\x9d\xf6\xdf\xce\xc8\x1f\xb1\x04\x18\xb9\x46\xf8\x0b\x24\x9e\x02\xde\xaa\xaf\xd6\xb8\xd5\xa8\x22\x96\x6d\xca\x50\x59\xd8\xa2\x8e\xe8\xa2\x31\x5e\x88\x63\xe8\xa9\x21\x65\xbf\xf0\x94\xdd\x64\x43\xdb\xb1\xbf\xb7\xd5\x23\xff\xfb\xb9\x0d\xd3\xe5\xc1\xb2\x13\xf1\x23\x4d\xbe\xdd\x69\x0a\xad\x93\x6b\x7f\x20\x08\x82\x54\x39\xa1\xd0\xe1\x0a\x3c\xe2\x49\x5f\xab\x75\xfc\x78\xd7\x6a\x37\x4b\xd9\xb6\x07\xc1\xb5\x90\x7f\x8d\xfe\x85\xb4\xf8\x2a\x9f\x6d\x23\xff\x02\xdb\x5f\xc1\xd9\x48\x74\xc4\xfb\xa4\x4b\x42\xff\x30\xe1\xb0\x30\xe1\xd2\x44\xaa\xfb\xe4\x4b\x41\xe1\x20\xe2\xe1\xd2\x4d\x12\x7e\xfe\x03\x41\xb2\x5c\x8b\x47\x7a\x45\x5e\x40\xfe\x05\xfe\x02\x7f\xbf\xfe\x0b\xfc\x85\xfd\xfd\xef\x7f\x61\xde\x77\xec\x2f\xec\x6f\xa4\xed\xdf\x44\xf8\x6a\x8b\xdf\x2a\x85\x17\x72\x5f\x42\x35\x93\x22\x0f\xdc\xa9\x99\x64\x0a\x3f\x5b\x33\xff\x73\x8b\x66\x2e\x73\xea\x4e\x0f\x87\x3c\x9c\x4e\x11\xc7\xb4\x7d\x81\xd1\xe3\x18\x41\x5a\x5b\x5d\x21\x3f\x8e\x11\xe0\xc5\xbf\xdc\x1e\xbc\xf1\xc8\x8f\x53\x8f\xf8\x12\xe6\xb5\x0f\xe5\x31\x88\x30\xc0\xe2\xde\x8d\xd3\x73\x18\xba\x04\xba\x97\xcb\x30\xa4\x01\x4e\xcf\x1c\xf2\x9c\xdd\xa3\x95\x5d\x72\x1b\xb6\xcc\xbb\x9b\xdb\x10\xa4\x41\x6e\x4f\x9d\x24\x96\xdb\x6d\xe6\x52\xa0\x2a\x2e\x74\x77\xe4\x8a\x92\x0e\x1d\x4b\x94\x21\xf2\x03\x79\x7a\xfa\xf3\xfc\xee\x4a\x73\x27\x23\x53\x53\x4e\xb6\xd2\xce\x64\x3d\x5d\xff\xee\x44\xf4\x1c\x2c\x9d\x78\xbe\x2f\x9e\x16\xdf\xbe\x44\x9a\x82\x48\xda\x58\x33\x5c\x6f\x61\x20\x74\xaa\x55\x5f\x1c\x71\xbe\x5d\xc6\x23\xf2\x44\xb4\x45\xd9\x85\x36\xb2\x14\xed\x8d\x66\x8c\x03\x60\xc6\x62\x7e\x58\xf2\x23\x9a\xe1\xc2\x31\xb4\x03\x20\xaa\x2e\x8e\x1d\xc4\x99\x8b\xba\x7e\x49\xc6\x35\xe7\xfa\x25\x91\xcf\x18\x49\x7e\x39\x40\x5e\x4e\x7b\xb0\x6e\xb8\x55\x1d\xc1\x6e\xc7\x41\x25\x2e\x5c\x5f\x28\xc4\xb2\x74\xcd\xeb\xd9\x23\xae\x36\x87\x8e\x2b\xce\x2d\x64\x3b\x67\xde\x4f\xe4\xc3\x34\xe0\x25\xa3\x51\x55\xd1\x7e\x3d\xba\x2b\xa7\xd2\xf1\x7c\x28\xbe\x22\xb0\xee\xcc\x90\x6b\xb6\xfd\x15\x1d\xf0\x2e\x94\x84\x6c\x93\xf7\x96\x5f\x99\xc1\xee\x92\x50\x47\x6a\x25\xa1\xcb\x55\x3b\xfc\xe1\x37\xd7\x3f\xfe\xce\x72\xd9\x22\x8f\x80\x24\x61\x6e\x56\x7b\x10\xd1\x85\x29\xee\x9a\x1e\x88\x01\xd7\xee\x52\xd4\x3f\x3f\x45\x48\xfc\xf4\xfd\xbb\x0d\xc7\xb2\x2e\x3a\xce\x97\xe0\x74\xf9\x7b\x15\x21\xb6\x45\x11\x5f\x62\x26\xca\xaf\x8d\xef\x96\xcc\xef\xe8\x1c\xe4\x0a\xf7\x8c\x63\xaf\x2e\x9c\xcd\x50\x70\xd9\x54\xc2\xc0\x01\x16\x0e\xee\xb7\xff\x42\x06\x90\x54\x9c\x87\x85\xb7\x17\x1e\x64\xb6\xa7\x38\x7f\x99\xd1\xc6\x09\x82\xd4\x7b\x02\x9f\x43\x32\x83\x04\x89\xfc\x0e\x5d\xbc\x40\x07\x5c\x81\xdb\xdf\x34\x25\x8a\xb7\x7d\xcf\xe7\x5e\xab\xdb\xe1\xd9\x99\x5d\xc0\x67\x46\x51\x91\xfe\xb2\xc5\x15\x05\xf9\xc9\xdb\xf8\xf8\x14\x61\xcd\x9e\x1d\x87\xdf\x52\xa0\x2b\x6a\xba\x83\x4c\x1d\xd3\x90\xa2\x8d\x6d\xdf\x28\xbb\x57\x0f\x3b\x3c\x3b\x3d\xec\xf7\xad\x23\x78\x3b\xd9\x4c\x4e\xe5\x85\x61\xfb\xd8\xe1\x03\x77\x6a\x39\xe9\x8c\x7a\x13\x71\xe0\x63\x1f\xe5\xd0\x00\x85\xe3\x44\xa4\x83\x3f\x6c\x26\x07\x12\x93\xb9\x70\x8f\xb9\x29\x38\xc6\x86\xa2\x9b\x38\xc8\x87\x5d\x58\x4a\x6a\xd8\x83\xe9\xec\x7e\x06\xf6\xd9\x2f\x64\x01\x17\xeb\x01\x57\xd4\x47\xb2\xa9\x19\x4e\xb8\x0d\xaa\x10\x8e\x2c\xd3\xd4\xc3\xef\x7a\x3b\x9f\x2a\x8c\x9a\x6b\xef\xb6\x0d\x1d\x68\x2f\xa3\x40\xb6\xeb\x50\x77\x3d\xf2\x96\x49\xda\x47\x14\x94\x65\x9b\xae\x29\x9b\x7a\xa4\x5c\xc1\x39\xda\x1b\x0b\x14\x15\x68\x7b\xcb\x0b\xff\xba\xb3\x90\x65\xe8\x38\xea\x42\x1f\x45\x1a\xca\x4e\x70\x51\xd3\xa1\x12\x0d\x15\xed\x56\x11\xbd\xeb\x7b\xbd\x2c\x62\x3f\x24\x21\xe7\xa5\x8f\x36\xc9\xf1\xeb\x5a\x91\x1f\x9b\xc6\x62\x69\xfc\xaa\xb4\x76\x95\xa0\x77\xa6\xb9\x58\x5a\x97\x69\x2f\x1c\x3c\x26\x0d\x9e\xec\xec\x3c\xcc\x36\x93\xca\x9c\xf3\x53\x55\x11\xa5\xd0\x76\xe5\x2f\xfb\xa2\x78\x19\xf0\xce\x04\xb8\xf3\x7c\x73\x61\xcb\x87\x63\x1a\x11\xa9\x67\x1f\x4e\x9e\x9e\xbe\x7f\x8f\x2e\xc5\xa2\xfd\x60\xb7\xb1\x76\xaf\x3a\x77\x67\x01\x3f\x3f\x74\xbd\xb0\x0b\x89\xb7\x64\x2f\xef\x2c\x4c\x24\xd9\xc0\x49\xc4\x38\xa0\xdd\xe1\xc8\x38\x10\xbf\x0e\x0e\x05\xb8\x3c\xd3\x99\x00\x17\x4b\xee\x00\x15\x43\xd1\x63\x49\x73\x46\x0e\xd4\x75\x68\x23\x92\x69\xea\x50\x34\xf6\x39\x49\x93\xe1\xc8\x38\xcb\xbf\xfe\xb5\xf3\x9c\x7c\x3c\x4d\x34\x0a\x64\xeb\xb3\xf3\x4c\xc1\x9b\x27\xdb\xf4\xa1\x27\x3f\x3d\xae\x47\xde\xd9\x60\x24\x5b\xe4\xb3\x15\xe4\xf3\xe7\x53\x0d\xfe\x1b\x41\xbf\x7c\x49\x42\x15\x36\x7c\xaf\xb4\xff\xb9\xd0\x63\x0a\x7c\x67\x3a\x0d\xa0\x0f\x28\xdc\x63\x30\xd6\x95\xc2\x77\xb8\x1f\xe0\x5c\xe1\x67\x16\x52\x66\xd2\x34\x21\xec\x9e\x5c\x9a\x74\x3e\xe0\x31\xd9\x34\x81\xca\xaf\xca\xa7\x57\x0a\x7b\x67\x46\x4d\xa0\x76\x99\x53\xa3\x06\xc4\x64\xd5\xb3\x33\x21\x0f\xb4\xd5\xbd\x7d\x9e\xb2\x94\xba\x88\xda\xc5\xfe\x84\xd2\x2c\x6d\xe2\x8d\xcf\xa1\xa1\xb0\x47\xd2\xa1\xfe\xb2\xad\x02\xa2\xcb\x88\xa8\x02\xed\x1f\x29\xb1\xdc\xf5\x08\x1a\x4b\xa8\x9b\x16\x0c\x6b\x5b\xba\xeb\x6d\xc1\xb3\xd0\xdd\x88\x9b\x73\xe8\x8a\x11\xb7\xb6\xa5\x56\xd4\x6d\x47\x1b\x1b\xa2\xbb\xb0\x61\x58\x87\x8d\xa5\xbe\xfc\xf5\xf7\x71\xed\xf2\x9f\xff\x0d\x5b\xbd\xfc\xf5\x77\x50\xe7\x70\x6e\x46\x34\xc3\x8e\xb8\x0c\xd3\x80\xb1\x6b\xa1\x23\xae\x4b\x34\x3b\xc9\xb4\x39\x1c\x49\xe6\xc2\x50\xbc\x8e\x35\x63\x8b\xc6\x18\x06\xab\xb1\xf3\xd4\xba\xd5\xc4\x16\xdb\x18\x2a\xc9\xe5\xd6\xae\xf7\xa7\x29\x7b\x6f\xdb\x1f\xe1\x4a\x13\x22\x7c\x77\xf3\xce\xcb\x25\x9c\x0e\x6b\xf1\xed\x98\x3e\xe9\x69\x47\xea\xb4\x4b\x7a\x5d\x1d\xf1\x38\x21\x52\x1e\x9e\x8b\x15\x2a\xb6\xfe\x48\x23\x64\x64\xa6\x7d\x98\x98\xa9\xcf\x1f\xc6\x0a\x9a\x90\x16\xc2\x45\xcd\x89\xae\x88\xa8\xa6\x9d\xb0\x5b\x84\xe4\xb8\x36\x97\x20\x5e\x49\x68\xf1\xcd\x36\x52\x12\xda\xf5\xb3\x1d\x23\x2f\x8b\xb6\x90\xcf\xe0\x05\x79\x02\x28\xc0\x70\x82\x44\x51\xf4\xe9\x05\xc1\x5e\x10\xf4\x05\x79\x7a\x8a\x66\x27\x6e\xc7\xe6\x5a\x96\x82\xbb\x36\x7b\xb6\x9e\xc0\x48\x33\x34\x57\x13\xf5\x91\x7f\x82\xe6\x9b\xf3\xae\x3f\xbd\x20\x4f\x18\x0a\xd8\xaf\x28\xf5\x15\xc5\x11\xc0\x7c\xc7\x98\xef\x04\xfd\x0d\xc5\x31\x82\xa5\x9e\x51\x6c\xcb\x74\x2a\xec\xd8\xc8\x7f\x32\xe2\x6c\x46\xa4\xcd\xc8\x35\x35\x25\x9e\x12\x4b\x91\xf4\x35\x94\xf0\xd1\xc2\x81\x87\x0c\x35\xd2\x8c\x8b\xa7\x31\x62\xe9\x11\x04\x4a\x30\xd7\xd0\x23\x46\xa2\xa2\x8c\x82\x3d\xad\x58\x1a\x24\x41\xe2\xd8\x35\x34\xc8\x91\x9f\x0f\xf7\x2b\x73\x6f\x2f\x34\x96\x04\x85\xa3\xd8\x55\x62\x50\x7b\x12\xbb\xe8\x97\x82\x04\x43\x00\xf2\x1a\x12\xf4\x68\x6e\x2a\x9a\xba\x49\x2f\x05\x03\x28\xec\x2a\x12\xcc\x99\x14\xbb\x23\xd0\x29\xe8\xd0\x04\x85\x5f\x47\x67\x3b\xe9\xe2\x78\x6c\xc3\xb1\xe8\x9a\x76\xbc\x4d\xb1\x28\x40\xd9\x6b\xd0\xb3\x1e\x7a\xbf\xdf\x39\x5a\x2b\x76\x3c\x76\x8c\x06\x57\x4d\x35\x40\x3d\xf4\xbb\x59\xf0\xaa\xdc\x78\x02\x24\x4b\x5f\xa5\x1d\x00\x4e\x09\x1c\xca\xa6\x6d\x00\x88\x27\xc4\x52\xec\x75\x92\x60\x67\x13\xbd\x2b\x54\xfd\x87\x6e\xe3\x28\x01\x94\x26\x89\xab\x66\x04\xe0\xbe\x38\x87\xf2\x3e\x76\xc6\x01\xc0\x68\xea\x3a\x49\x88\x91\xaa\xad\xf7\x0f\x20\x98\x73\x7d\xa4\x6a\x50\x8f\x0d\x8d\x00\x90\x00\x5c\x15\x84\x01\xb9\xdf\x77\xd9\xf7\xc3\xd7\x09\x62\x50\xf4\x75\x61\x1e\x50\x23\xcd\x18\x43\xc7\x1d\x5d\x76\xdc\x13\x48\xd1\x2c\x73\xdd\x8c\xd0\x67\xa9\xde\xdb\xda\x10\xe3\x93\x09\xc0\x50\x14\x27\x76\x44\x22\x72\x6d\xec\x3e\xfd\xb5\xc9\xf6\x62\xaf\xfe\x74\x11\x50\xc8\xf6\x2b\x05\xaa\x29\x10\x75\xa1\xc4\xbf\x65\x6b\x42\x3e\x43\xe3\x18\x47\xe0\xd4\x90\x7c\x13\x72\xad\x66\xb5\xd0\xab\xd0\x85\x4c\x35\x5b\x6b\x54\x4b\xf9\x3a\xd1\xa2\xf9\x41\xaf\xdb\x09\x6a\x28\x92\x08\xb6\x25\xc2\x91\xbd\xcc\xdb\x80\x23\x07\x44\x8f\xe3\x8b\xfd\x5e\x13\xeb\x54\xea\x58\xa7\x4e\x64\x3a\x85\x62\xa7\x41\x13\x7c\xe7\xad\x52\x17\xb0\x46\xb1\x4b\xf4\x9a\xc5\x7a\xa9\x29\x54\x2a\xc5\x8b\x69\x88\x24\x82\x7b\x92\x60\x78\x23\x8f\x15\x3b\x3c\x89\x71\xb5\x7e\x27\xdf\x29\xe2\xdc\xa0\xcc\xf5\xfb\x85\x7e\xbf\x8b\x75\x8b\xfd\xc1\xa0\x49\xf1\x83\x3e\xdf\x7e\xab\xe4\xfa\xc3\x16\xd7\xa3\xe8\x7e\x9d\x48\x4d\x84\xd8\x12\xc9\x34\xdf\x06\xc5\x52\x15\xcb\x96\xf0\xbc\xd0\x20\x32\xfd\x6a\xbe\x26\xe4\xaa\xf9\x72\x47\x78\xeb\x60\xc5\x01\x3e\xac\xe5\x5b\xc5\xba\xd0\xc9\xf2\x75\xae\xd5\xa3\x1b\x59\xba\xde\xc7\x8a\x4f\xb7\x9e\x2b\xd9\x2e\x33\x13\xe6\x7a\x77\x16\xef\x78\x8c\xf6\x9b\x03\xe3\xcf\x5c\xbc\x20\xc4\x0b\xe2\xda\x0b\x98\xc2\x02\x2f\x4f\x53\xdc\x6c\x7f\x7e\x15\x74\x6a\x7d\xb2\x0d\x15\xcd\x1d\x89\xba\x35\x11\x8d\xc5\x9c\xd8\xfa\x4c\xa7\x95\x7b\xba\x73\x3a\x6f\x39\x3f\xf0\x10\x3d\x9f\xd5\x6c\x2f\x08\x48\xab\xe5\xb0\xe3\x03\xb7\xaa\x79\x7f\x84\xe0\xc4\x01\x31\x40\xd0\x04\x43\xa0\x24\x4d\x7b\x4c\x6d\x7d\xf2\x3f\x9f\xfc\x44\xf5\xe9\x3b\xf2\x09\xa0\xdf\x00\x86\xa3\x28\x8a\x7e\x7a\x41\x3e\x1d\x0f\xa9\x6c\xef\x75\x5a\xb9\xe3\xc5\x6d\x6d\xbf\xbd\x18\x9c\xb7\x23\x84\x7f\x58\x65\x0b\x73\xeb\x04\x7e\xfa\xdf\x28\x8f\x0c\x4a\x06\x02\x92\x61\x2f\x08\xfe\x7f\x46\x32\x40\x6f\x93\x11\x8d\x63\x0c\x88\x98\x33\xf0\x6d\x57\xbe\xfd\x57\x89\x86\x07\x44\x0b\x9d\xb4\xff\x4e\xd1\xb0\x17\x04\x60\x0c\x43\xb0\x28\xc9\x32\xa4\x3f\x6b\xa8\x27\x9b\xae\xcd\x35\x4f\x34\x16\xc3\x70\x9c\xc6\x50\x9c\x62\xc8\x6f\x04\x4d\x93\x0c\x4a\xff\x57\xc9\x08\xf6\x32\x02\x14\xdd\x5b\xe6\xff\x35\x19\xf1\x17\x84\x21\x19\x96\xc5\x19\x8a\x61\x3d\x11\x7d\x09\x1d\x57\xb4\x5d\xcd\x18\x8f\x24\x51\x17\x0d\x19\xfa\xb6\x8a\xa2\xdf\x50\xff\x93\x9e\x02\x71\x4e\x21\xd4\x07\x4e\xf0\x5e\xe8\xc9\x10\x5d\x6d\x09\x6f\x96\x68\xeb\x83\xbe\x48\x2b\xa8\x8d\x27\x5b\x82\xe0\x05\xf9\xe4\xa7\x98\xd1\x0c\x6e\x7e\x99\x2d\x79\x5c\x11\x18\xbd\x73\x97\x9f\xa5\xe7\x1d\x85\x9f\xae\xe7\x80\x44\x29\xf5\x7c\xdb\x0a\xfc\xaa\xb8\xe4\x73\x45\x31\x3b\x97\xfd\x69\x7a\xf6\x29\xfc\x74\x3d\x07\x24\x4a\xa7\xe7\x1b\x8b\x10\x9f\xab\x84\x05\x5c\xd8\xb9\xc7\x5b\x17\x70\xfb\xb3\x8f\x7b\x61\xc9\x17\xe4\x49\x64\x69\x8a\x65\x71\x5c\xa1\x54\x48\xb2\x28\x2d\x91\x12\xc3\xe0\x8a\x0a\x80\x0c\x68\x12\xe2\x40\xa4\x65\x5a\x06\xac\x42\xa0\x18\xc1\x50\x98\x84\xc9\xb4\x8c\xb3\x0c\x41\xaa\x14\x26\x62\xe2\x76\x45\x4d\x61\x22\x64\x49\x8c\x61\x00\x89\x43\x19\x27\x20\xcd\x12\x50\x42\x45\x1c\xca\x98\xc4\xd2\x0c\xa3\x00\xc8\x60\x22\xc1\x40\x88\x52\x18\xab\x12\x00\x67\x71\x80\x89\x38\x2d\xe1\x24\x8b\x11\xfe\x82\x16\x04\xca\x5a\xea\x3b\x4e\x7f\x47\xb1\x60\xb5\xbb\xbb\xfc\x0d\xe0\x38\x8e\xe1\x89\x77\xfd\x75\x1c\x4e\x11\x0c\xfa\x82\x00\x6a\x3b\x9f\x17\x9f\x17\x84\xde\xfe\x07\x76\xff\xed\x2f\x82\xc3\x97\x2d\x6b\x1c\xc7\x71\x59\xac\xb2\xd0\x5b\x5a\xa6\xf3\xbc\x42\x49\xb2\x6d\x67\xa7\x74\x76\xd1\xd7\x84\xa2\x59\x99\x4d\x17\x19\xcd\x40\x79\xb2\xd6\x32\x71\x07\xcc\x66\xac\xb4\xd8\x58\xb3\x16\xe4\x72\xd0\x7a\xb5\xda\x3d\xdd\xca\xb0\x3c\xc5\xbf\x2f\x66\xe4\x7a\x6e\x2d\x96\xf9\x4d\x7e\xf5\xae\x0c\xab\x03\xd6\xd9\xa2\xe6\xfa\x6f\xdd\x9a\x3d\xe6\x0e\x9f\x45\x2d\x53\x93\xd7\x63\x30\x6e\xcf\xf4\xae\xc0\x2c\xb0\xf9\xe0\xb5\xfe\xd6\x98\x57\xb2\x35\xa7\xf7\x86\xd7\x39\xbb\xb0\xa2\xaa\x9d\x4d\x5b\x37\xba\x9d\xda\xaa\xfe\x91\x55\xb2\xcb\x7e\xa3\x3e\x75\xe7\x5d\xde\xae\xe7\xb8\xc9\x50\x5c\xcb\xc5\x5a\x63\x3c\x2d\xb8\xf5\xda\xba\xa3\x35\x2a\xed\xd5\x16\x73\x47\x20\xaa\xe2\x87\x85\x35\x8e\xc4\xb8\x0a\xc3\x85\x7c\x86\x5c\x1f\x10\x0d\x8e\xcb\xa1\xe5\xb0\xdb\xbf\xf5\xc7\x37\x2a\x34\xc2\xef\x83\xae\x40\x3c\xc6\x8c\x9f\x48\x85\xc4\x59\x8a\xa0\x00\x43\xb3\x90\x26\x58\xc8\xb2\x0c\xca\xd2\x0a\x4a\x31\x50\xa4\x25\x95\x60\x65\x14\xa0\x0c\x21\x4a\x04\x4a\x4b\x0a\x90\x15\x40\x63\x2c\x0a\x58\x42\x81\xa4\x8c\xc7\xba\x02\x88\x34\x76\x12\x10\x38\x99\x78\xd7\x5f\x1d\x53\x2c\x60\x88\x18\x57\xa0\x52\xba\x02\x00\x6d\x7d\x36\x18\x40\xa8\x94\xa9\xe1\xb8\xac\x36\xc4\xba\x45\xb3\xe5\x55\x26\xcb\xbf\xa3\x19\x1a\x95\xd1\x7e\xa5\x51\xe8\xe0\xfa\x0a\x9d\x72\xf5\x29\xd5\x5e\xa3\x0c\xd9\xc7\x5f\x87\x54\x99\x9e\x0f\x8a\x1b\xb9\xc5\x8c\xe9\x05\x09\x88\x5c\x09\x94\x5f\x71\xdb\x62\x72\x42\x71\xe6\x4d\x9d\xe7\x0a\x27\xd6\x99\xa3\x97\x65\xac\xd0\x1f\x18\xac\x59\x7f\x55\x4d\xb2\x61\xcf\x8b\x15\xa3\xdd\x2d\xbd\x67\x44\x7b\x49\x67\xe6\x59\xd7\x91\xea\xae\xa4\x52\xed\x65\xcb\xe4\x0b\x1f\xaf\x72\x6e\xf1\x26\x15\xa8\x9c\xc5\x61\xbc\x0d\x57\x54\x67\x03\xb0\x15\xfa\xdc\x83\x1f\x7d\xaa\x2e\xb4\x9a\x33\xa2\xeb\x61\x6e\x84\xb8\x42\x79\x10\x66\x4e\xff\xff\xb8\x02\xfe\x18\x33\x7e\x52\xf1\x6d\x7d\x0c\xa0\x24\x63\x12\x43\x4b\x0a\x09\x29\x85\x54\x19\x9a\x52\x64\x94\x90\x08\x19\x10\x34\x89\x29\x24\x8d\xb3\x8a\x42\x29\x12\x90\x18\x52\xc2\x81\xac\x4a\x2c\x05\x68\xc0\x48\xfe\xde\x21\x16\x6a\xd5\x68\xa4\xb1\x53\x18\xcb\x32\xb1\x77\xd9\xa7\x43\x35\x05\x18\x86\x89\x71\x05\x32\xa5\x2b\xbc\xd6\xa6\x5c\x86\x62\x2a\x04\x64\xfb\x73\xa0\x4e\x30\x9c\x6b\xa1\xab\x8e\xd2\x02\xfd\xba\x02\x5c\x47\x9a\x48\x35\xf9\x99\x1c\xf4\x0b\xd5\xf5\xa2\xf2\x5e\x1f\x50\x9d\x06\x3f\x98\x4e\xc1\x90\x19\xb4\xc5\x0d\x85\x3d\xb7\x5c\x69\x36\x04\x6d\x6b\xd1\x18\x8b\xa5\xa1\xb6\xdc\xf4\x09\xc2\x9b\x3a\xcf\x15\x4e\xa6\x32\x3b\xa4\xcb\x59\x82\x2f\x1a\x03\xb4\xd0\x6f\x0a\xfc\x4a\xd6\x4c\x7d\x40\x5b\xa0\x6e\xc0\xe7\x36\xe9\xea\x99\x8a\xad\x67\x95\x95\x88\xe6\x36\x80\x21\x70\x5b\xa9\x7e\x34\x08\xe9\xb9\xb0\x70\xf0\x7e\xef\x15\xc5\x3a\xd2\x5b\xb6\xcf\x6c\xd6\x8b\xcc\x7c\xa9\xd0\xd6\xd4\x59\xd8\x25\x2f\xeb\xd4\x42\x5c\xa1\x88\x86\x99\xd3\x7f\xb9\x2b\x60\xe9\x5d\x01\x7b\x8c\x19\x3f\x51\xb8\xc2\x32\x2a\x89\x53\x10\x52\x8c\x02\x24\xcc\x5b\x66\xb1\x2a\x86\x8b\x2a\x89\x03\x20\xd1\x24\xc5\x8a\x18\xa1\x8a\x2a\x20\x50\x5c\x54\x50\x89\xc4\x24\x0a\xc7\x25\x94\x96\xa0\x67\xb1\xb8\xbf\xf2\x0d\x58\x35\xf5\x9d\x64\x23\x8d\x9d\xc6\x29\x34\xf9\xae\x5f\xbe\x11\x24\x8b\xc5\x78\x02\x9e\x76\x7d\xf4\x36\x9c\x02\x61\x41\x9a\xa8\x54\xa6\x7b\x84\xb1\xa9\x2f\x3b\xeb\x02\xde\xb5\xcc\xd9\xf3\x32\xcf\xd5\xdd\x2c\xa8\x60\x35\x3a\x43\x53\x43\xb6\xb0\xea\x53\xef\x4c\xe5\x63\xdd\xef\xe4\x66\xf8\xb3\xaa\x0c\x9d\x89\xf3\x91\xed\xf5\xb1\x96\xb4\xe0\x8c\xb2\x50\xd3\x5a\xe6\x42\xcf\x6e\x8e\x49\xe1\xdd\x5b\xbf\x94\x0e\xff\x71\x9e\xb1\x3a\xc7\xdf\x2b\xee\xad\xe1\x83\x73\xd9\xcd\xec\x15\xf6\x0a\xdc\x80\xaf\x4f\x74\x91\x6d\xad\x87\xc5\xe9\x6c\x5d\x28\x35\x28\x60\x95\xb4\xe9\xfc\x2d\xcf\x4e\xba\x16\x68\x2c\x49\xdb\xad\xf7\x9d\xf9\xac\x59\x96\x37\xfd\xb9\x0e\xb1\x61\x25\x3f\xfd\x98\xb4\x67\xe8\x02\x07\xca\xd0\x2c\xcd\xfa\x24\x58\x98\x86\xac\xbe\x11\x3e\xfd\x10\x4f\xe1\x9d\x30\x6b\xfb\x2f\xf7\x14\x3c\xbd\xa7\x80\xc7\x58\xb9\x77\x4a\x6b\x5b\x44\x6e\x8b\x2e\xc0\xd2\xe8\x57\x14\x7c\x45\x01\x82\xa2\xdf\xbd\x7f\x91\xd6\xcc\xd0\x14\x11\x5d\x2a\xec\xef\x12\x18\x4b\xb0\x14\x8d\xb1\x54\x8c\xad\x87\x5b\xba\xcf\xd2\x3f\x3d\x29\xd1\x9f\x4c\xbf\xa2\x11\x9b\xd7\x4d\xab\x92\xa1\x73\x46\x8e\x2d\x62\xe8\x7a\x9a\x79\x76\xd0\xb1\xeb\xac\x4a\xab\x0f\xd0\x57\x5a\xbd\x81\x98\x29\x8b\x79\x2f\xdc\xf3\x21\x46\x1c\xfe\xd9\x1b\x31\xc7\x65\x66\xbf\x40\x90\x87\x7e\x9e\x7c\x63\x4a\x2e\xb3\x53\x3c\x07\x75\x6b\xd5\x1d\x71\xbc\x2d\x6a\xaf\x01\x44\x78\x5c\x02\x9a\xe0\x66\x0c\x76\x1b\x9a\x60\x13\x1d\xbf\x0d\x0d\x11\xdc\x66\xb8\x0d\x0d\x19\xe8\x7b\xdf\x28\x14\x15\x6c\x2d\xdf\x86\x86\x3e\xef\x75\x12\xb7\x61\x61\x02\x1d\xd3\xdb\xb0\xb0\xe7\xfd\xc0\x1b\x79\x01\x68\xa0\x51\x7a\x23\x1a\x70\xde\x35\xbb\x95\x9b\x40\xf3\x0d\x7b\xcc\x23\x7c\x0f\xd9\x80\x8d\x3f\x5f\xba\xb5\xaf\xb4\x3b\xb2\x11\x4f\xb2\xdd\x1d\x5d\x4e\x42\xc1\x59\x1c\x38\xfc\xa0\x0e\xad\x85\xff\x7c\x72\xcd\xbb\x1a\x97\x2f\xc8\x27\xd5\x36\xe7\x77\x35\x99\x5f\x90\xdf\x78\x37\xf5\x27\x9c\x5f\x09\x99\xa8\xf3\x10\x79\xf8\x81\x5e\x4e\xd4\x1d\x4a\x3e\x4e\xd4\x8d\xda\x08\x4c\xd4\x6f\xb6\x83\xfa\x13\xce\xe7\x84\xcd\xd4\xd9\xee\xeb\xe1\x07\xe1\x4d\x13\x95\x6e\x97\xd2\xb5\x17\x8e\x0b\xe1\xbd\x73\xe1\xa1\x31\xed\x7b\xfd\xf7\xf7\x98\xb9\x07\x1f\xdf\x8a\x9c\xb9\x7d\xe2\x3f\xfc\x40\xff\xe1\x99\xbb\x27\x6a\xfe\x16\x33\xf7\xf3\xa3\xe3\xe9\x2a\xe9\xf0\x9d\x39\xd9\x65\x54\x17\x86\xb2\x93\xe5\xc6\xc3\x73\x9e\x5e\xfc\x23\x6c\xf7\x4e\x6e\x8a\x2d\xcf\x3b\x4f\xf9\x5d\xa3\xb6\xdd\x7a\xee\xf0\x9d\xf8\xb9\x6a\xbb\xdd\x98\x7f\x33\xb5\xf9\x0b\xcf\xc3\x77\xf4\xa7\xaa\xed\x8e\xe8\xfd\xf3\xd5\x96\xb0\x8a\x0d\xf9\xe3\x01\x69\x56\xb0\xc9\x58\x93\x9f\xa3\xbe\x75\xa5\x1c\xf9\xfc\x55\x68\x25\x4e\x45\x57\x43\x89\x88\xb0\x00\xa2\xa8\xb2\x35\x11\x11\x1e\x58\x16\x46\x15\x8b\x89\x88\x88\xe0\xfa\xf2\x56\x44\xc1\xe5\xcf\xcd\xa2\x51\xc1\x6c\x7c\x2b\x22\xfa\x3c\x3b\x44\xd5\x9e\x89\x78\x98\x73\x3c\x37\xab\x9a\x3d\x0f\xbb\x37\xf3\x73\x56\x9b\x13\x77\x28\x08\x04\x22\xda\xed\x1c\x61\xe7\x88\xa2\xeb\xf3\x6b\x9f\x94\x7f\x44\x85\x9e\xf4\x60\xe4\x35\x35\x7a\xe4\x73\xf1\x0f\x88\x3d\x27\xcf\x78\x28\x0c\x45\x33\x24\x46\xa1\x8c\xc2\x8a\xa2\x8a\x01\x08\x54\x5a\x12\x65\x89\x65\x20\x4d\xaa\x0a\x29\x4b\x38\x2b\x41\x80\x2a\x34\x2a\xb3\xb2\x24\xcb\x0c\x8a\xb3\x40\xa1\x71\x1a\x63\x18\x8a\x7d\x7a\x41\xfc\xd3\x6d\xb7\x2f\xc7\x4e\xf6\x7f\x88\x7d\xdf\x3b\xfa\x48\x0d\x49\xc6\x1d\xb8\xf1\xef\x9e\x45\x3e\xbf\x61\x5e\xa1\xa6\x50\xc3\xa7\x73\xb3\xc4\xb4\x0b\x7a\xee\x15\x8e\x65\x9c\x7e\xeb\xbb\xc5\x4a\xe5\xa3\xd7\x65\x56\x5d\x6d\x98\x11\xb3\x0b\xb2\x4a\xd6\x38\xaf\xe1\xcc\xed\x37\x74\xb2\x81\x7e\x6e\xe6\xf8\x95\xf7\xfe\xaf\x63\xd9\x57\xae\x4e\x90\x83\x4c\x0e\x77\x8b\xdd\x7c\x1d\x34\x71\x0e\xad\xc1\xd9\x1b\x53\x6e\x52\x86\x00\x38\x16\xf6\x34\x65\x53\x72\x3b\xde\xf8\x6e\x57\xf0\x07\x72\x59\xb0\xc8\x28\x45\xb3\xbd\x18\xd7\x96\x0d\x37\x47\x67\x26\xa5\x2a\x2e\x40\x56\xe9\xbe\xa9\x85\xd2\x73\x59\x23\xcb\xcb\x4e\xfd\x79\xc8\xb9\xb4\xb7\xeb\xc3\x15\xb2\x95\xde\xea\x48\xbf\x70\xe0\xb7\x51\x57\x16\xc5\x09\xb3\xa0\x0c\x42\xe4\xdb\xf9\xe2\x2b\x47\x65\xb4\xbc\xae\xf2\x6f\xef\x39\xe7\x43\x1e\x76\x65\x33\x5b\x6a\x2e\xb9\x01\x8e\x4f\xcb\xcf\x40\x6c\xac\x07\x4c\x69\xd3\x69\x58\x79\xd4\xec\x4b\x72\xa5\x0b\xc7\x1f\xdd\xa1\x50\x67\x40\xbd\xc3\x0b\xaf\x6c\x89\xcc\xbf\xe6\xc6\xa5\x1f\x4f\xa7\x1b\x0e\x85\x93\x46\x7d\x23\x4c\x1f\xdc\x11\xbe\x71\xd0\x5f\xce\x03\x3a\x19\x6a\xbf\x0b\x54\x15\xd6\xc5\xf1\x74\x5d\x13\x3b\x6f\x2c\x95\xf9\x50\x1d\x16\xa2\xb2\x69\x0b\xc3\xfe\x47\xa6\x57\x9e\xe5\xcd\x0a\x3d\x5b\xce\x3c\x51\xb3\x5d\x6e\x39\xad\x1f\xe7\x23\x13\xa0\x7f\x36\x17\x21\x9f\xcc\x83\xe9\x67\x6f\xa2\xef\x7d\xad\x1d\xf4\xb1\x1b\x4f\x0f\xaa\x0c\x47\x4f\xf5\x31\xff\x06\x51\xa5\xd3\xa1\xbb\x45\x39\xd7\x58\x53\x8d\xd7\x95\x5e\x7c\x97\xf1\x4e\x0e\x90\x62\x19\x2f\x69\xc0\x83\xcf\x77\x3b\xe8\x8e\x70\xb5\x47\xe4\x51\x38\xa9\x53\xdc\x86\xcd\xa2\x6f\x4e\x81\x1f\x2f\x65\x40\x03\xd0\x61\x99\xc1\x94\x98\x57\x67\x73\xb6\x41\x93\xb3\x2c\xbe\x3c\x61\xe5\xf5\xf0\x59\x85\xf1\xec\xfd\xce\xff\x33\xfc\x0d\x4a\x96\x94\xc4\x5f\xed\x78\xd1\x23\x93\x5d\x98\xb8\xe9\x12\xe4\x7b\xf6\x8d\x5f\x5b\x8d\x57\xdc\x2c\x0a\xcf\x1f\x80\x6e\x6e\x34\x07\xe8\x6a\x2d\x3f\x98\x37\x7a\x63\x7b\xd1\x7a\x6e\x73\x77\xf2\x97\x5b\xf7\x2b\x95\xc9\x95\xfa\xfb\x95\xfc\x0d\xeb\xe3\x65\x1c\x7f\x3f\x8e\xbe\x39\x0e\xd8\x22\x77\x0b\xaf\xe5\x4e\xf6\xb9\x2e\x1f\xf1\xf1\x5c\x20\x16\x70\x27\x76\x14\xf2\x39\xd1\xd5\xcd\xf4\x6b\xc4\x6d\xf4\x7d\x5d\xfc\x87\xc4\x08\x58\xdc\xd0\xef\xea\xc4\x6c\xd6\x3a\x2a\x93\x33\x0b\xa5\x5e\x97\x69\x3c\x9b\xf5\x0f\x61\xad\x77\x37\xe3\xd2\xa4\xc0\x64\xa6\x2a\xac\x19\x74\xd7\xca\xe5\xa7\xab\x69\xb9\x99\x9d\xf5\x5b\x13\xc5\x5d\x59\x5d\x2a\x27\x74\x67\x28\xfd\xd1\x21\x1b\x0d\xfc\x15\x9d\xce\xfa\x4c\x9d\x1b\xff\xf8\xe1\x15\x3e\xde\x5f\x02\xd9\xef\x26\xfb\xff\x6f\x13\xbf\x97\xe0\x92\x57\x3f\xa7\x4f\xa6\x63\x04\x2e\x53\x2c\x4e\xa8\xa8\x2a\x91\x28\xa0\x69\x72\x9b\x78\x45\x11\x97\x54\x95\xc4\x15\x45\xc6\x19\x56\x56\x19\xc0\x50\x40\x56\x45\x48\x01\x54\x96\x31\x8c\x14\x45\x08\x18\x59\x96\xfd\x07\xe2\xc0\x3d\x4d\xca\x93\x0c\x8d\x27\x65\x68\x12\xc4\x1c\x07\xd9\xdd\x3c\xab\x03\x9e\x6e\xb1\xf7\x93\xfc\x1c\x9c\xf3\x8b\xfc\x7c\x65\xbc\xbf\x27\x3f\x33\xdd\x8d\x66\x1e\xe9\x17\x0f\xfc\x36\x78\x19\x96\xa5\xc1\xc2\x32\x7a\x7a\x07\xda\x1d\x0a\x1d\xab\x56\x7e\xcc\x08\x33\x4c\xc4\x39\xaa\x51\x6b\xa9\xdd\x71\xc3\x14\xf2\xc3\x7a\x75\x2a\xd0\x1f\x32\xb1\xa2\xa7\x99\xf5\x4a\xcb\x97\x3a\x1a\x65\x6d\xfa\x65\x41\x68\x58\x55\xac\xde\x58\xb7\x8d\x2e\x31\x76\x58\x3d\x67\x8f\x1b\x8f\xcb\xcf\x27\x40\xae\x34\xee\x37\x29\x9e\x36\x73\x55\xb4\xda\x78\x5e\x0d\x5a\x59\xf6\xa3\xbf\xec\x77\xdb\xf8\x5a\x7b\xd3\x06\x8b\x96\x04\x72\xcb\x79\xa3\x0a\xbd\x03\xbb\x5e\x7e\x34\x8e\xf3\x11\xf1\x49\x93\x1f\x1f\x42\xff\x32\x06\xa4\xa0\x7f\x11\x13\x7f\x75\xfc\xf6\x59\x49\x93\x5f\x7e\xd3\xfc\x17\x9a\x5f\x4e\xd6\xce\xd7\xfa\xd2\x36\xbe\xef\x78\x1d\x47\x4d\x5d\x62\x7e\xe1\xef\xa3\x7f\x9a\xdf\xae\xa1\xbf\xcb\x2f\xcd\x35\xa1\xbb\x1a\x35\x57\xc4\x6e\x93\x72\xdb\x76\x2b\xf3\x3c\xeb\xe5\x56\x58\x7b\x68\xcb\x39\x8b\x5b\x97\xd9\x5e\x26\x3b\x46\xbb\x33\x62\x51\xc3\x97\xc2\xc7\x34\xb7\xa8\x15\x8b\xd9\x52\x67\xd2\xaa\xbe\x1b\x65\x79\x86\x82\xec\x6c\x39\x20\x73\xf9\xba\xd2\xd7\xb2\x1f\x58\xa7\xbe\xc8\x70\x8f\xce\x2f\x28\x2a\x4a\xac\xac\xca\x10\x93\x08\x99\x00\x04\x50\x18\x49\xa2\x68\x8a\x51\x14\x94\x25\x24\x45\x92\x80\x4c\x13\x28\x45\x03\x54\x91\x24\x5c\x12\x51\xa8\xb2\x0c\x43\xa3\x2a\x85\x8b\x38\x41\xf8\x87\xb4\xc0\x3d\x5b\x29\xd7\xe4\x17\x0a\x07\x64\xf4\x29\xab\xfd\xdd\xb3\x06\x91\x6f\x95\x39\x77\xbc\x5c\xe5\x16\xf5\x1e\xd7\x60\xe9\x26\x68\xb6\xdd\x8e\xb2\x12\x72\x45\x2b\xf7\x9a\xed\x40\xeb\x43\x69\xbc\xf5\x75\xd3\x90\xb5\xaa\x77\x2e\x3b\x5d\x86\xf1\xce\x69\xdf\x96\x31\xf0\xa3\x33\x9d\x58\xed\x81\x7e\xa3\xda\x95\x4a\xa5\x67\x50\x85\xda\xc7\x7a\x6c\xc8\xb9\x12\x41\x55\x8a\x9b\x8c\x8b\x92\xcf\x45\x16\x33\xc0\x73\x13\xc7\x98\x32\xfb\x21\xe8\x98\x3a\x2e\xf7\x30\x43\x35\xf0\x7c\xc9\xac\x76\x1d\xec\xbd\x0b\x9e\xb3\x1d\xcb\x06\x18\x10\xb1\x0c\xcd\xd5\xa8\x62\xc5\x26\x8c\x4c\x95\x4b\x55\xd1\x15\x4e\x4d\x39\x2a\x63\x70\x27\x75\xe8\x95\x15\xf0\x43\x32\xc6\x03\xe9\xdf\x96\x31\x3c\xfa\xc1\x55\xf4\xb5\x15\x53\xe8\x2a\xfa\xf2\x13\x1f\xe5\x1e\x4d\xff\x8a\x55\x3c\xc7\xfd\xbe\x15\x6d\x52\x46\xba\x45\x57\x77\x67\xa4\x07\xce\xd5\x35\xf4\x77\x19\xc9\xed\x3a\xe3\x29\xdd\x71\xa9\xea\x5b\x21\xab\xac\x6a\xd3\xa9\x69\xaa\xa5\x02\xde\x36\x08\x15\x17\xd5\x3e\x59\x54\xa5\x95\x81\xd7\xb0\xfe\xf0\x99\xd3\x25\x51\x79\x56\xe5\x8e\x36\x76\x7b\x1f\xa2\xd5\xef\x13\xe5\xd6\x7c\xd9\x97\xba\xf6\xa0\xe8\x70\x1f\xa6\xfc\xbe\xd4\x64\xde\x79\x7c\xc5\x23\x29\x04\x43\x29\x92\xa2\xa0\x98\x42\x50\x28\x03\x68\x8a\x06\x32\x21\x92\x22\x0d\x59\x85\x82\x0c\x45\xca\x22\xc6\xca\x12\x01\x20\x85\x29\xb4\x28\xaa\x34\x2a\x62\x2a\x84\xa4\x84\x53\x0a\xf4\x33\x12\xf6\xa0\x9e\x64\x8a\x8c\x84\xc7\x66\x24\xfc\x24\x23\xed\x76\x1a\xee\xed\x49\xfe\xc2\x8c\x74\xd2\x63\xcc\xb0\xb3\x79\xa5\x87\xbd\xe3\x4b\xba\xa1\x6e\x98\xb7\x1a\x9c\xf1\x12\x68\xb7\x4b\xa4\xb6\x7e\x9f\x95\xd0\x8c\x39\xee\xdb\x75\x97\x1e\xd7\x01\x85\x35\xa4\xd9\x04\x53\x5a\xed\x8e\x0a\x73\xe6\x52\x46\xdf\x38\x51\x9d\xe4\xfa\x6b\x77\xd2\xe5\x74\xa7\xba\x98\xea\x99\xf9\x66\x9a\xe1\x06\x3f\x25\x23\xdd\xd2\xe3\x7b\x64\x46\xba\x93\xfe\x03\x33\xd2\x43\xfa\x3a\x97\x9f\xd4\x51\xee\x57\xf7\x95\x38\xee\xf7\xad\xe1\x12\x6b\xa4\x1b\x74\xf5\xc8\x8c\x74\xef\x5c\x5d\x43\x7f\x97\x91\x8a\x58\x6b\x60\x49\xa2\x0d\x5f\xdd\xcc\x6b\x75\xc5\xac\xa9\x46\x73\xd9\x15\x6a\xd3\x79\xb5\xf0\xde\x98\x36\x0a\x5a\x06\x3a\x14\xbe\xe0\xe8\xbe\x3d\xcc\x2c\x5a\xc5\x21\x28\x0b\x4d\x96\xa8\x6b\xec\x47\x83\xc9\x58\xcf\xbc\xa0\x16\xb0\x7c\x27\xdb\x5b\x2d\xa8\x7a\xa7\x20\x55\x6a\x7c\xe6\xe1\x19\x49\x91\x70\x96\x81\x12\x21\x42\x86\xa5\x49\x0a\xc7\x48\x8a\xc0\x65\x51\xc1\x80\xcc\x12\x10\xe0\x92\x2a\xa3\x34\x21\xe1\x18\x0e\x21\x83\x43\x40\x00\x49\xa5\x51\x20\x92\x0a\x8b\x12\x2a\xd8\x3d\x47\x08\xee\x39\x0f\xe1\x1f\xc8\x8c\x4d\x44\x34\x4e\x93\x44\xcc\xc3\x56\xfe\xdd\xd3\x1d\x66\xdf\x16\x0b\x55\xa6\xd8\x58\x36\x66\x52\x05\x2b\x72\x78\xaf\x3b\x6d\xda\x95\xf9\xb4\x8f\xa2\x6a\x81\x71\xaa\x25\x7a\x8e\xf2\xcd\x55\xb9\xf7\xca\xf5\x71\xee\x90\x87\xbc\x4f\x4c\x1e\xf2\x3f\x37\xf4\x72\x4e\x1f\xf0\xc8\x74\x97\xab\x3c\xbb\xf2\x4c\x75\x30\x6d\xc8\x6f\x6d\xac\x40\x4e\xde\x8d\xcc\x7c\x5c\x28\xc0\x31\x5b\x66\x74\x42\x06\xbc\xd1\xd1\xd7\x33\x9d\xd7\x8b\xac\xf3\x3e\xb4\x51\x96\x06\x79\xaa\x5e\xed\xa9\xf0\x75\x4e\xcc\xac\xbc\x5b\x7a\x76\x4a\xa8\x06\xde\xab\x9a\x4b\x72\x68\x79\xd3\x33\xa4\xc9\xa0\xda\x23\xcd\x5c\x8a\xdc\x73\x66\xb4\xe7\xb9\xe7\x44\xe6\x63\xec\x3d\xf1\xe7\x8c\xf6\x9a\x41\xab\x68\xb9\xb0\x71\x27\x2b\x01\xe8\x03\x54\xdc\x58\x26\x60\x85\xe2\x7a\x59\xcd\x6e\xea\xa4\x9b\xe1\xe5\xac\x2f\x23\x3e\x76\xed\xba\x31\x78\xa5\x3b\xc7\xf1\xb5\x50\x26\x12\xfc\xf9\x0e\xfa\xf9\x76\x2f\x63\xdf\x41\x9f\xe3\xfe\xb9\x9e\x4f\x68\x6c\xcd\xdc\xae\x8b\xba\x31\x8c\x15\x33\x49\x17\xf7\xce\xc5\xd6\x16\x9e\xe5\x00\xbe\xab\x74\xf1\x9f\x42\x09\x2d\xe6\x50\x76\xb2\x18\x88\xd6\x6a\x68\x66\x26\x86\xf9\xd6\x52\xcb\xb0\x28\x34\xcb\xa0\x2c\x0f\xcb\xcd\x72\xf3\x55\xaa\xcc\x45\xf6\x0d\xb2\x4d\x38\xd5\x80\x81\x2f\xc9\x45\xb9\xd2\x94\x5a\x6f\x76\x56\x28\xb9\xa2\x46\xd8\xb0\x21\x64\x65\xdd\xc2\x88\x5e\x16\x2c\x44\x6e\xf5\xe8\xd8\xaa\xb2\xb4\x2c\xaa\xaa\x28\x31\x32\xa0\x50\x0c\x17\x71\x9a\x61\x08\x40\x91\xb2\x84\x4a\xb8\xaa\x02\x51\xc4\x14\x51\x25\x50\x14\x55\xa1\x4a\xb0\x0a\x06\xa0\x2a\x33\x04\xad\x28\x92\x2a\x41\xf1\xf8\x8c\xf6\x1d\xb1\x15\x4b\x8e\xad\x2c\x1e\xfd\x4c\xf7\xfe\xee\xe9\x61\x99\x7b\x63\x6b\xcc\xb9\x03\xff\x73\xc3\x1a\x33\x22\xb6\x66\xe6\x15\xab\x35\x5e\xda\xab\x4a\x1d\x43\xfb\xd9\xba\x3a\x50\xfb\x4e\x81\xe7\x3b\xee\x6a\x20\x8a\xbc\xfa\xde\x5a\x50\x9b\x79\x79\xae\xe7\xe6\xe2\x73\xa9\x4f\x95\xe8\xd2\x78\x2c\x75\x86\x35\x53\x6e\x28\x43\x96\x28\xd5\x38\xb5\xa2\x34\x38\xe1\xbd\x2f\x95\xea\xf4\xc6\x59\x41\x58\xcb\xfe\x5e\xb1\xf5\xde\xd8\x76\xa7\x3f\xbf\xd3\xaf\xed\x9c\xf4\xc8\xd8\xfa\x0b\xd7\x8a\x49\xeb\xd6\x5f\x19\xdb\xb8\x07\xc5\x56\x86\x38\x8e\x8f\xa8\xf9\xe2\x62\xeb\x50\x7b\xef\x98\x55\x8a\xc9\x4e\x5d\x37\xbf\x9a\x1a\x58\x11\xd0\x99\x49\x26\x5f\x95\x0b\x85\xf9\xa4\x48\xcd\xec\x85\x63\x69\x43\xab\x41\xce\x97\x5a\xfe\x59\xab\x6f\x4a\xa5\x02\x28\xb4\x2b\x45\xbe\xd8\x53\x61\x36\xc7\x15\x37\x46\x87\xcb\x89\x3a\xb6\xc9\x2d\x18\xbb\x56\x34\xa6\x8f\xef\xa4\xd0\x18\x49\x93\x94\x04\x54\x49\x51\x19\x5c\x42\x19\x80\xd1\x2a\xce\x90\x50\x85\x8a\x8a\xb2\x28\x2b\xcb\x0c\x86\x4a\x94\x2c\x43\x1a\xa8\x40\x46\x19\x96\x56\x00\x49\x60\xb4\x2c\x91\xa2\xa2\x3c\x1d\xfe\xdc\xd5\x1d\xb1\x35\xb1\x81\x42\x13\x28\x49\x45\xc7\x56\x02\x25\xe9\xa7\xf3\x63\x7f\xf7\xc6\xd6\x5c\x60\x52\x2f\x62\xeb\x0d\x1d\xe5\xa8\xd8\x3a\x25\xc6\x99\xc6\x6b\x86\x93\xc6\xef\x2a\xfd\x5e\x37\x5d\xd1\x1d\x0f\x3b\xc5\x69\x4e\x77\xea\x6e\x4e\x50\x2c\x5a\xd4\x87\x4d\xf2\x35\x3f\x63\xd5\xc2\xf4\x59\x5f\xf3\x9b\x31\x37\xec\x7d\x0c\xe8\xd7\xea\x00\x0c\xf1\x56\x9e\x92\xd1\x77\x07\xd0\x58\x75\xc2\xcd\x66\xcb\x2e\x63\xa1\xb5\xdf\x2a\xb6\xde\x1d\xdb\xee\x8d\xad\x1b\xbb\x91\xaf\x3e\x30\xb6\xfe\xca\xce\xf0\xcf\x88\xad\xb7\xc6\x36\xee\x41\xb1\xf5\xd6\x1a\x66\x17\x5b\x07\xcf\x25\xae\xf3\xb6\x6a\x14\x88\x8a\xf1\x4c\x4d\xdf\xab\x3d\x7b\x50\xe8\x66\x88\x15\x29\xe5\xec\xc6\x47\x5f\x84\x98\xd5\xeb\x40\x75\x3d\x7c\xeb\xaf\xcd\x57\x4b\x6e\xd6\x4c\xae\xd0\x75\xb0\xfa\xeb\x06\x13\x7a\x0a\x3a\x81\x86\x50\xb1\x05\xc8\x6a\x44\xa3\x5c\xae\x02\xb5\xa2\xe4\x52\xee\x9b\x46\xbe\xd3\xfe\xf4\xfb\xc8\x9a\xc1\xcd\xfe\x50\xee\xf1\xed\x6e\xd7\xbe\x95\xe5\x04\xa3\xf7\x1a\x1f\x2e\x97\x3b\x7d\x57\x5c\x90\x20\xf2\xd6\x2c\xd5\xb8\xe6\x00\xa9\xf0\x03\xe4\xb3\xa6\x24\xbd\x76\x3e\xf8\xfb\x41\x5c\x07\xb0\x86\x71\x1e\x46\x38\x91\xfb\xc0\x5f\xd2\x0e\xfc\xd9\xe9\xe3\x13\x67\xa3\xe3\x73\x66\xa3\xd3\x07\xca\x46\x0f\x91\xee\x9c\x6c\x98\x70\x37\x31\x86\x74\x84\x52\xa3\xc3\x23\x9f\x8f\xe0\x2f\x27\xef\x57\x7f\x39\x7b\x1b\xfa\x95\xaa\x79\xcc\xb4\x5e\x2d\xf8\x55\x93\x1a\xf1\xd8\x7d\xc2\xa3\xed\x8f\x95\x2c\x9c\x48\x9c\xa4\x31\x6c\xa5\x96\x3c\xf2\x91\x86\xc4\x87\x06\x1e\x2b\x7d\x14\x99\x38\xf9\x63\x59\x4b\xd4\x80\x6f\xd2\xd2\xc6\xb3\xf6\xbd\x20\x25\x21\xc7\xf7\xd3\xbd\xda\xcf\x03\x3d\xc7\x82\xd4\x85\xa0\x33\x74\x5a\x25\xa1\x80\x48\xae\x0d\xe1\xa9\x77\x45\x73\xe3\xfb\xd8\xfd\xfc\xf8\x78\xd2\x71\x14\xe1\xd7\xd2\xe1\xed\x05\x37\xb3\x73\x44\x71\xca\xc9\x59\x35\x70\xce\x8f\x0f\xfc\x72\xf1\xa2\xc1\x30\xe6\x26\xa2\x33\xb9\x87\x33\xef\x7d\x8b\xa9\xd8\x0a\xbe\xa5\x31\x8c\x1b\xff\xef\x3d\xdd\xc3\x8f\x8f\x21\x1d\x47\x81\x57\x40\xbe\x5c\xbe\xed\x31\xd4\xe5\x47\x70\x6b\x1b\xde\xfd\x1b\x38\xdd\x65\x09\x9f\xe1\x00\xba\x53\xb6\xf7\x7f\x32\xf8\x8c\xe3\xcb\xa8\xa5\x29\x2f\xfb\x97\x1c\x47\x31\x7b\x7c\xb5\xdc\x9d\x6c\x6a\x4a\x6a\x06\x8f\x6f\x79\x7d\x09\x7d\x5b\x73\x02\xd3\xa6\x35\xb2\x1e\xc5\xf7\x0e\xd7\x29\xeb\x11\xa9\xea\x26\x49\xc2\x05\x70\xd7\x8f\x13\x60\x87\x2b\xc2\xa6\x6f\x14\xe1\xfc\x95\xbd\x97\x42\x98\xd6\xd6\x2a\x27\xe6\x4d\x32\xec\x98\x3f\xe2\xb8\x55\xf9\xf1\x8a\x76\xf6\x2f\x62\xda\x86\xea\xfb\x75\x7d\x8e\xee\x94\xe5\xfd\x9f\xa1\x3b\xe3\x31\x9c\xa3\x53\xbd\x3e\x8a\xad\x0b\x9c\xe9\xc2\x5b\x18\x83\xae\x3f\x25\xee\x3d\xd3\x7a\xc4\x71\xbb\x49\x26\x99\x9f\x6b\x2b\x5b\x22\xa7\xef\x51\xbf\x83\xe1\x4b\x64\x01\xce\x15\x18\xe0\x33\xf0\x02\xf7\x78\x06\xbd\xb7\x99\x3d\x86\x3d\x0f\x55\x2a\xe6\xf6\xaf\x50\x8b\x64\x2d\xf0\x6a\xf8\xbb\xf9\x0b\xe0\x4b\x62\xf2\xf2\xcd\xf4\x89\x9c\x3e\x46\x8f\x67\xd8\xd2\x72\x99\xa8\xcd\xc7\xf0\x96\x8a\xa7\x78\x5e\xf6\x1c\xeb\xa6\x39\x5b\x58\xf7\x71\x74\x8e\x2b\xf5\x8c\xee\xdf\x7d\x1f\xca\x9f\x25\x6a\xf6\xc8\x7b\xc1\xf1\x23\x38\x0c\x62\x4b\xe7\xb7\x3b\x06\x5f\x2e\x5e\xd7\xff\xb2\x7f\xed\xb7\xac\x9b\x8e\xf7\xb2\xeb\x08\x21\x1e\x10\xb7\x77\x78\x92\x38\xbe\x72\x75\xb4\xc5\xfa\x30\xed\x5e\xa1\xd8\x44\xbd\xf9\x6f\xa6\x9d\x04\xdf\xd8\x66\x1a\x23\x51\x51\x6c\xe8\x38\xf7\x2a\x34\x91\xc0\x59\x9d\xb6\x7f\xf9\xdd\x79\x65\xe4\x03\x5e\xc1\xfb\xfd\x76\x10\x87\x3b\x99\xe3\x10\x2f\x3b\x47\xb8\x5b\x85\x6f\xf1\xb9\x1b\xeb\xf6\x1a\x3c\x16\x6b\xe2\xb2\x7f\x0b\x94\xc0\xe8\x6e\x0d\xb5\x45\x79\x30\xa2\x07\x71\x1b\x86\x3a\x71\xf9\x96\xd6\x92\x4f\x90\x3f\xda\x18\xce\x50\xdf\xb2\xde\x8c\x46\x37\xb7\x4c\x7b\x1b\xf8\x76\x2f\x52\x7e\xbc\xa2\x83\x14\x92\xd9\x0f\x0c\x48\x2f\xcc\x2e\xf4\xdc\xd8\xa9\x48\xa7\xff\x13\x1a\x89\x92\x9c\xc0\xa6\x17\xc2\xb2\xe1\x52\x33\x17\xce\x2f\x91\x26\x8c\x58\xa2\x58\x61\x83\xd2\xcb\xb7\x6f\xa2\xfc\x34\x99\xf6\x04\x12\xe5\x88\xec\x76\x9d\xa3\x3e\xfe\x71\xae\x9f\xe1\xda\x41\xec\xa1\x05\xf0\xb5\x0e\x7e\x8e\xf4\xbc\x84\x7a\x90\x87\xc7\x91\x48\x23\x43\x42\x5d\x17\x4b\xec\x71\xe9\xeb\x12\x71\x2a\xde\x93\x93\xd8\x69\xb1\xfd\x33\xcc\xe6\x12\xff\xcd\xa5\xbe\xff\xa2\xed\x7d\x22\xdf\x77\x18\x47\x92\x69\xce\x6e\xd6\x72\x0c\xce\xc4\x25\xc2\xe7\xcf\x0a\x74\x45\x4d\x77\x90\xaf\xff\xfe\x37\xf2\xe4\x98\xba\x72\xb2\x9b\xf6\xf4\xfd\xbb\x0b\xd7\xee\x97\x2f\x2f\x48\x34\xa0\x6c\x2a\xe9\x00\xfd\x5e\x7c\x34\xa8\x64\x2e\xc6\x13\x37\x15\xf9\x33\xd0\x78\x06\xce\x40\x03\x2c\x7c\x41\x7a\x45\xbe\xc9\xfb\x46\x86\xfc\x40\x70\x3c\xf5\x46\xb4\xa6\x8c\xd4\x93\x6d\xa2\x7c\xe5\xd7\x6c\x47\xef\xc8\x22\xf9\x7a\x93\x2f\x15\x84\xc3\x16\x10\xd2\xe4\xf3\x7c\x93\x17\xb2\x7c\x2b\xb0\x2b\xe2\xdd\xad\x0b\x48\xe7\x2d\xb7\x35\x99\x26\xdf\x6a\x37\x4b\xd9\xf6\xf6\x52\x8e\xaf\xf2\x6d\x1e\xc9\x72\xad\x2c\x97\xe3\x63\xf6\xd1\xb6\x75\xc7\xf9\xcf\x51\xa0\x15\xf3\x38\x65\x9c\xd3\x49\xd8\x24\x8b\xe2\xe4\x5c\x3f\xc1\xb6\x51\xa8\xb2\x76\x0b\xfd\x84\x1d\xc5\x48\x4d\xec\x4a\xd9\x7f\x5c\x0f\xa7\x7c\x84\x69\x61\xdf\x25\x88\x37\x98\xeb\x34\x70\xd9\x54\xfa\x07\xd5\x10\xc1\xcc\xb9\x2e\x42\xda\x60\x8f\x35\x8a\x60\x8b\xe3\x77\x50\x48\xb4\x69\x5c\xf4\x90\xd2\x5a\xc7\x9b\xe9\xb8\x63\x1b\xb6\x1a\x55\x44\x11\x5d\x71\x6b\x62\x88\xb2\x98\x5b\x88\x6c\xce\x2d\x1d\xba\xd0\x93\xe1\xff\x05\x00\x00\xff\xff\x0a\x5b\x56\x5a\xfe\xbe\x00\x00") - -func asset_stat_trustlines_7HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _asset_stat_trustlines_7HorizonSql, - "asset_stat_trustlines_7-horizon.sql", - ) -} - -func asset_stat_trustlines_7HorizonSql() (*asset, error) { - bytes, err := asset_stat_trustlines_7HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "asset_stat_trustlines_7-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdb, 0xd4, 0x77, 0xbe, 0xee, 0xcc, 0x3c, 0xca, 0xea, 0xc4, 0xfa, 0xd4, 0x6b, 0xb3, 0x22, 0xf0, 0xab, 0x1e, 0x6a, 0xd8, 0x3f, 0x9f, 0x6b, 0x21, 0xf8, 0xd8, 0x55, 0xf2, 0xdf, 0x89, 0xa1, 0x4d}} - return a, nil -} - var _baseCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xa2\x4a\xf7\xe7\xfb\xfe\x14\x44\xbf\xa9\xbe\x61\xf5\x95\x7d\xe9\x9e\x7e\x22\x50\x70\x17\xf7\x75\x62\xa2\x22\x81\x04\x51\x16\x65\x11\x75\xe2\xf9\xee\x13\x82\x0b\x2a\x2e\x55\x56\xdf\xfb\x8f\x98\xf6\x45\x75\x0b\x87\x5f\x9e\xfc\xe5\x39\x27\x37\x3c\xf9\xfd\xfb\x97\xef\xdf\x91\xa6\xe3\xf9\xba\x0b\x3b\xad\x1a\xa2\x02\x1f\xc8\xc0\x83\x88\x1a\x58\xf3\x2f\xdf\xbf\x7f\xd9\xde\x17\x02\x6b\x0e\x55\x44\x73\x1d\xeb\x28\xb0\x84\xae\x67\x38\x36\xc2\xfd\x4d\xff\x8d\x25\xa4\xe4\x35\x32\xd7\xdf\xb6\x8f\x9f\x89\x7c\xe9\x88\x5d\xc4\xf3\x81\x0f\x2d\x68\xfb\x6f\xbe\x61\x41\x27\xf0\x91\x5f\x08\xfa\x33\xba\x65\x3a\xca\xec\xf2\xaa\xa1\x9a\xf0\xcd\xb0\xdf\x7c\x17\xd8\x1e\x50\x7c\xc3\xb1\xdf\x3c\xe8\x6d\x71\x2f\x85\x15\xd3\xd8\x42\x43\x5b\x71\x54\xc3\xd6\x91\x5f\xc8\x4b\xaf\x5b\x60\x5f\x7e\xee\xcb\xb6\x55\xe0\xaa\x6f\x8a\x63\x6b\x8e\x6b\x19\xb6\xfe\xe6\xf9\xae\x61\xeb\x1e\xf2\x0b\x71\xec\x1d\xc6\x04\x2a\xb3\x37\x2d\xb0\xe3\xb2\x64\x47\x35\xe0\xf6\xbe\x06\x4c\x0f\x9e\x14\x63\x19\xf6\x9b\x05\x3d\x0f\xe8\x91\x40\x08\x5c\xdb\xb0\xf5\x58\xc4\x75\xc2\x37\x0f\x2a\x81\x6b\xf8\xeb\x2d\xb8\xa6\xfd\xdc\x11\x00\x81\xab\x4c\xde\xe6\xc0\x9f\x20\xbf\x90\x79\x20\x9b\x86\xf2\xba\x65\x4c\x01\x3e\x30\x1d\xfd\xe7\x97\x2f\x42\xbb\xd1\x44\xca\x92\x20\x0e\x91\x72\x01\x11\x87\xe5\x4e\xb7\xb3\x93\xfc\x3b\x98\xeb\x2e\x50\xe1\xc4\xf0\x7c\x79\xed\xc1\xc5\xcf\x9b\xd2\x9e\x32\x5f\x04\x8e\x1b\x58\xde\x63\xc2\xd0\x5e\x3e\x22\x69\x42\x55\x87\xee\x23\x92\x5b\x3d\x35\x08\x1f\x94\x7c\x40\x4c\x86\x9e\xef\x68\x1a\x74\x0d\x5b\x85\xab\xdb\xb2\x40\x51\x9c\xc0\xf6\x65\x60\x02\x5b\x81\xde\xcf\x2f\x7c\xad\x2b\xb6\x91\x2e\x9f\xab\x89\x09\xe9\x86\x54\x1b\xa5\xd0\xeb\xb8\x6b\x24\x42\xcf\x37\xa4\x4e\xb7\xcd\x97\xa5\x6e\xe2\xa1\x53\xc1\xb7\xf9\x0c\xae\x1f\xc1\xf7\x57\xf7\xa1\x0f\x32\xef\x40\xd5\xe0\x03\x3a\x27\xc5\x1e\xc7\x76\x03\xcf\x37\x0d\x1b\x7a\xb7\x90\x0f\x42\x0f\xe3\x6e\xb5\x80\x51\x34\xb8\x81\x7b\x14\x7a\x1c\xf7\x60\xf2\xb7\x70\x0f\x42\x0f\xe3\xc6\xf2\x86\xad\x39\x37\x70\x8f\x42\x0f\xe3\xce\x03\xd9\x0b\xe4\x1b\x98\xb1\xc0\x7b\xf0\x4c\xc3\x9b\x2c\x02\x18\xdc\x62\x36\x29\xf6\x38\x36\x84\xee\x2d\x5a\xa3\xfb\x0f\xa3\x45\x6e\x7c\x0b\x2e\x16\x78\x18\x2f\x8e\x4a\x13\x08\xd4\xdb\xb0\x27\x72\xbf\x19\x7d\x17\x29\xe1\xe2\xed\xc1\x62\x64\x60\xdf\x00\x97\x81\xfd\xb0\xc2\xbb\xe8\x77\x4b\xd7\xbd\xc8\x7b\x31\xb7\x63\x80\xfb\xb0\x5b\xa9\x1d\x72\x24\x7b\x0e\x9c\x1a\x72\x6f\xcb\x1e\x42\xe3\x3d\xb1\x63\xa0\xbb\x23\x79\x08\x5c\xb7\xe5\x8e\x81\xe8\x8e\xdc\x21\xb0\xdc\x95\x7b\x48\xbf\x63\x40\xb9\x2d\x17\x07\x89\xbb\x32\x07\x97\xbf\x23\xb9\xf5\xe3\xdb\x22\xb1\x6f\xde\x96\x39\x71\x85\xdb\xa2\x32\xb0\x6f\x0b\xec\x4d\xf5\x21\xa9\xad\xe5\xed\x04\xc5\x61\x57\x94\x3a\xe5\x86\x94\x14\x36\xe7\xba\xb7\x30\x77\x12\x9d\x7c\x49\xac\xf3\x17\x58\x3f\xbf\xc4\x63\x63\x09\x58\xf0\xc7\xfe\x1a\xd2\x5d\xcf\xe1\x8f\xdd\x23\x3f\x91\x8e\x32\x81\x16\xf8\x81\x7c\xff\x89\x34\x42\x1b\xba\x3f\x90\xef\xd1\x90\x39\xdf\x16\xf9\xae\xb8\x47\xde\xe3\x7d\x39\x41\x3c\xbd\xb9\x03\xce\x37\xea\x75\x51\xea\xde\x40\x8e\x05\x90\x86\x74\x0a\x80\x94\x3b\xc8\xcb\x7e\x7c\xbb\xbf\xe6\x45\x20\x2f\xe7\x25\xef\xab\xbf\x2b\xf3\xc0\xd0\xdd\xfa\x9c\x70\x29\x35\xba\x67\x7c\x22\x83\x72\xb7\x74\x50\x2b\x39\xa0\x3d\x29\xfe\x88\x72\xa6\xc8\x7b\x2a\x7f\x01\x12\x11\xd0\xac\x65\xe7\xfa\x76\x16\x33\x77\x1d\x05\xaa\x81\x0b\x4c\xc4\x04\xb6\x1e\x00\x1d\x46\x34\x3c\x38\x00\xdf\x8a\xa9\x50\x03\x81\xe9\xbf\xf9\x40\x36\xa1\x37\x07\x0a\xdc\xce\x26\x5e\xce\xee\x86\x86\x3f\x79\x73\x0c\x35\x31\x41\x38\xa9\x6c\xd2\x20\x77\xd5\x8c\x4c\xf7\x58\xc9\xbd\x01\xa4\x11\x1e\x5b\x79\x32\xe8\x7e\xfb\x82\x20\xc8\xfe\x8a\xa1\x22\xca\x04\xb8\x40\xf1\xa1\x8b\x2c\x81\xbb\x36\x6c\xfd\x1b\x45\xff\x15\xb5\x8d\xd4\xab\xd5\x5e\x23\xe9\xed\x83\x36\xb0\x60\x8a\x30\xcb\xa6\x09\x2f\x81\x19\xa4\x49\x63\x18\x7e\x2e\x6e\x02\xcf\xb7\x1c\xd5\xd0\x0c\xa8\x22\x86\xed\x43\x1d\xba\x07\x91\x2f\x7f\x9d\xb7\xfd\xc1\x8b\x9f\xe4\xc2\xfb\x10\x11\xbb\x89\x00\x22\x1b\xba\x61\xfb\xe7\x37\x83\xed\x53\xa6\x01\x64\xc3\x34\xfc\xed\x94\x2f\x16\x8b\xef\x7a\xd0\x34\x6f\xde\x5e\xd8\x81\x95\x0e\x6c\x07\x96\x17\xc8\xd0\xf6\xdd\xed\x53\xe7\x1c\xc5\x32\x86\xad\x99\x60\x3b\xdd\x54\xa1\xe7\xa7\xd7\x25\x16\x9c\x38\x16\x54\x1d\x0b\x18\x76\x8a\x14\x49\x9e\xd7\xd8\x9f\xb8\xd0\x9b\x38\xa6\xea\x21\x3e\x5c\x9d\x6b\xa6\x99\x40\xbf\xa6\x91\x67\xe8\xf6\x76\xa0\xb3\x7d\xec\x81\xa6\x8e\x45\x12\xa3\x81\xc3\xd0\x62\x47\xfa\x5b\x34\xad\x46\xf2\x25\x31\x5f\x45\xbe\x7d\xdb\x37\xc5\x7f\x7e\x21\xe8\x5f\x7f\xdd\x78\xfa\xbc\x55\xce\x71\x2e\x5a\xed\x1e\xe2\x49\x73\x9c\xa1\x9d\x36\xd5\x3d\xa4\x4b\x9b\x38\x83\x4b\x31\x9a\x18\xf3\xd2\x31\xb6\xfd\xdf\x47\x7d\x62\x3b\x64\x8c\xdd\xc1\x76\x54\x98\xf4\x85\x13\x1f\xb8\x2c\xf4\xb4\x7f\xfe\x68\xf1\xa7\x03\xe3\x58\x91\xdd\x35\xe0\x4d\x12\xca\xd0\x17\xe6\x39\x77\xe1\xf2\xae\x90\x1c\x28\x33\xe8\x9b\x86\xe7\xdf\x15\x3d\x8c\xb6\xf7\xf6\x19\x5f\x56\x4c\xc7\x83\xbe\x61\x5d\xf1\xfc\x28\xb0\xa6\xb8\x47\xa2\xcd\x4f\x07\xf5\x07\xbc\xb3\xf6\x3e\x96\x73\xc5\x74\xae\xcd\x0d\x4e\x61\x8e\xb5\xb8\x66\x2d\xbb\xc1\xd7\x47\x5b\x6c\x37\xf1\xfa\x76\x88\x6c\xd0\x7d\x30\x82\xc6\x2b\x2f\x6a\x3a\x8f\x3b\x73\x07\x9e\x07\xfd\x34\x3e\x63\x5f\xbd\x7a\x1b\x58\x5b\xb7\x4a\x87\x9e\xbb\x86\x02\xed\x2b\x51\x27\xba\x79\x2d\x24\x45\x37\x11\xd5\x09\x64\x13\x6e\xed\x4d\x31\xa2\x15\xc9\xc7\x03\xe1\xfb\xc2\xde\x6e\xca\x1a\xd7\xe5\xac\x5d\x77\x15\xbc\x62\x1b\xbb\x27\x77\x0c\x9f\x3d\xba\xe7\xfd\x9a\x41\xc4\x03\xf6\x8f\xda\x43\x3c\xad\x8f\xcd\xc1\x98\xa7\x75\xfc\xd4\x85\xe7\x3a\xae\x7f\x60\x43\x10\x0b\x7c\xaf\xd6\x45\xd0\xf3\x9e\x0f\xae\x7c\xe0\xfb\xd0\x9a\xfb\xc8\xd6\x2d\x3c\x1f\x58\x73\x64\x3b\x64\x72\x82\xf8\x0a\xb2\x71\x6c\x78\xd9\x5f\x6a\xc0\x30\x03\x37\xd1\x5b\x5e\x2b\xc1\x5f\xcf\xe1\xfd\x46\x89\x97\x25\x12\xb8\x97\x61\xff\x50\xe2\x95\xd6\xd9\xad\x6c\x38\xee\x79\xa3\x7e\x8b\x98\xf8\x0f\x82\xfe\x85\xf0\x92\x80\xc4\x5f\xff\xd7\x2f\x84\xa6\x28\x82\xfa\x2b\xb5\xad\x92\xd3\xb0\x0f\x37\x59\x72\x95\x27\x19\x73\xaf\x75\xe7\xd1\x42\xdb\xd6\xeb\x52\x15\xda\xce\x1d\x9f\x50\xc5\x0b\xe4\x9d\x12\x2e\xf4\x4e\x3a\x20\x22\x75\xc4\xe8\x42\x70\xf0\xa5\x4b\x7d\x12\x73\xde\x8f\xea\x94\x58\xac\x7b\xa0\x67\x8c\x15\x5b\x78\xf0\x56\x0f\x73\xa9\x67\x62\x0e\xff\x51\x3d\x8f\x10\x8f\xeb\x79\xd1\xc9\x9d\xdd\x87\xf6\x12\x9a\xce\x1c\xde\xe9\xd2\x8e\x45\x3f\xd1\x11\x25\x96\x3b\x9e\xa0\x60\xbf\x5e\xfb\xed\x91\x76\x38\x5a\xd1\x3d\x22\x16\x57\x3a\x9a\x53\x12\xf6\xeb\xc0\x27\x88\xe7\x44\x9c\x94\x76\x95\x8c\xe3\x1a\xd1\x87\xc9\x38\x2e\x8a\x7f\x3b\xfa\xed\xe9\xe4\x2d\xc5\xa7\x6e\x79\x77\x62\x85\xeb\xa3\x5a\x25\xb6\x00\x3e\x32\xed\x8a\x7a\xfc\x1b\x91\xda\xf0\xbc\x00\xba\x8f\x43\x29\x8e\x9a\x3a\x3b\xbd\xa0\xc5\x37\x0d\xcb\xb8\x32\xa2\xf8\x7d\x73\xc1\xcf\x1b\x4c\x24\x76\x55\x3e\x34\x8b\x4a\x3e\xff\x59\xf3\xa8\x04\xe6\xc7\xe7\x3f\xb7\x50\xe3\x46\x3b\x43\xda\xb5\xe4\x7f\xd2\x1d\xef\x64\xb9\xf7\xc3\x46\x9e\xdc\x43\x8b\xcd\xdc\x5f\x9d\x84\xe2\x07\xe6\x1b\xe7\x06\xb8\x8a\x76\x29\xaf\xde\x55\x26\xc0\xd6\x61\xea\xdc\x3c\x49\x4e\x72\xdb\xee\xe3\xb1\xfa\xb8\x76\xfe\x71\x8a\xfe\x61\x7e\x64\x47\x5d\xa7\x91\xe3\xaf\x5c\xe8\x05\x66\x6a\x74\xf7\x57\x16\xbc\x3b\x9f\x3b\x6e\xb1\x7e\x9c\xcf\xb3\x7d\x8b\x8f\x92\x7a\xb6\xe3\xfc\xed\x21\xe2\x76\x0f\xdd\x62\x6f\x27\x92\x46\xc4\x63\x66\x77\xb6\xc3\xfd\x11\xa2\x84\xed\xcc\x5a\x73\xdc\x3b\x8b\xa1\x88\xc0\x77\xf9\x3b\x9c\xdd\x86\xf4\xde\x8d\x57\x96\x3a\x62\xbb\x8b\x94\xa5\x6e\xe3\xb8\xa8\xd8\xe7\x6b\x3d\xb1\x83\x7c\x7b\x29\xe6\xda\xcd\x51\xa9\x5c\xc3\xf3\x65\xa2\x20\xb5\xc8\xdc\xb0\x56\xa8\x4b\x42\xad\x50\xe9\x49\xcd\x1e\x5e\x1a\x11\xe3\x7a\xa1\x53\x6a\x48\xbd\xbc\xd8\xe0\x3b\x03\xa6\x95\x67\x1a\x43\xbc\xf4\xf2\x8a\x70\xbb\x0f\x1d\xff\xc3\xa0\xe8\x6b\xcc\xef\xee\x2f\xf1\x8a\x1c\xae\xbc\xbc\xbc\x22\x2f\x7c\x8b\xe7\x79\xfe\xd7\xaf\x97\xc4\x0d\xfc\xaf\x9f\xf7\x34\xe4\xa9\x41\xae\x39\xe2\xa9\x11\x39\xe0\xc5\xd2\x70\xd0\xc6\x7b\xd5\x06\xde\x6b\x90\xb9\x5e\xb1\xd4\x6b\x31\xa4\xd8\x6b\x56\x1b\x12\xde\x2a\xf5\xc9\x41\xbb\xd4\x28\xb7\xa5\x6a\xb5\x84\xbf\xbc\x22\x18\xba\xff\x9c\x6a\xc6\x52\x2c\xc7\x11\x24\xc5\xe1\x9f\xa4\x62\x7e\x58\x2d\xd2\x6d\x89\x6c\x48\x65\xb1\x99\xaf\x4b\x85\x1c\x43\xe0\x3c\x49\xd0\x63\xaa\x29\x09\x9d\x76\xad\x38\xa8\x32\xc5\x5c\x2d\x5f\x6f\xd5\xca\x85\x06\xd9\x61\xc4\xd1\xa0\xdf\xdb\x92\x48\x46\xe4\x5d\xd5\xf0\x21\x12\x89\xfb\x1a\xe6\x86\xc5\x56\x65\xd0\xaf\x0d\x1a\xa3\x52\xa1\xd6\xef\x56\x07\x7d\xaa\x50\x2c\xf1\x44\x4d\x1a\x8d\xf0\x4a\xab\x5a\x67\x1a\x7c\x85\xef\x89\xad\x42\x8f\xae\x35\xf3\x1d\xb1\xd0\x1f\x36\xa4\x88\x44\xea\x13\x48\x24\xae\x3b\xcb\xf9\x8a\xe0\x13\x4e\x72\x7d\x9d\xef\xbd\x9e\x72\xba\xd6\x77\xe0\x91\x26\x54\x8e\xd5\x28\x82\x86\x90\x66\x55\x4c\xc6\x19\x99\x92\x59\x4e\xc3\x09\xa0\x51\x04\x86\xc9\x0c\x45\x73\x00\x27\x35\xa0\x61\x24\x4a\x00\x15\x95\x29\x5c\xa6\x09\x42\x46\x19\x19\x72\xdc\x96\x1e\xf4\xc9\xcf\x16\x83\x62\x70\x80\x43\x02\xd7\x34\x9c\x64\x01\xca\xc8\x28\x64\x50\x4d\xc5\x34\x5a\x25\x30\x56\xc1\x34\xa0\xa8\x38\x2a\xd3\x8a\x82\xb2\x0a\x41\xa8\x14\xc3\x50\x38\xc5\xb1\x34\x8b\xe1\x14\xc0\xe8\x6d\xbb\x46\xad\xf3\xc2\xff\x8f\xfd\xe4\x86\x55\x83\x5c\x67\xd7\x9d\x6a\x8e\x11\x6c\x81\x2b\xe1\xe8\x6a\x9a\xcb\x78\xa8\xee\x7b\x61\x39\xdc\x60\x43\xb5\x33\x18\x81\x5c\x05\x14\xf4\xad\xbc\x28\x91\x35\xb0\x99\xe3\xad\xbb\xc8\x63\x7e\x88\x91\x91\x58\x6e\xf6\x0f\x54\xe4\x53\x3f\x2f\x67\xbe\x7e\xc5\x50\x39\x99\x51\x58\x59\x03\x18\xe0\x94\xc8\x30\x59\x9c\x46\x51\x46\xe3\x50\x6d\x6b\xa3\x40\x41\x49\x02\xaa\x18\x89\xe3\x80\x50\x70\x0e\x47\x59\x56\xc1\x09\x0c\xd0\x38\x4a\x43\x9a\x8e\x8c\xec\x33\x8c\x9d\x85\x32\x4d\xa8\x18\x05\x38\xc8\x2a\x38\x49\xd2\x9c\xa6\xa0\x04\x8b\xcb\x28\x4e\x33\xac\x2c\x73\x10\x30\x1c\x90\x65\x4d\x45\x49\x96\xc6\x34\x85\xe6\x08\x45\x61\x49\x14\xd2\x10\x32\x18\x7c\x79\x45\xf0\x57\x04\xa3\x18\x9c\xc2\x19\x8e\xa5\xf6\x16\x5b\x6c\x8e\xa7\x98\x14\x50\x0e\x2a\x57\x98\x01\x69\xaf\x1b\xcb\xde\xaa\x48\xf4\xe7\xce\x2c\xb3\x2c\xf0\x0d\x3f\x8f\x55\xf1\x3a\x93\x63\xe8\xb1\x69\x89\x6a\x63\xde\xcf\xd7\xa9\x52\xcd\xe5\x0a\xd2\x94\xa2\x16\x80\x0e\xf1\x52\xb5\xee\x2f\xba\xcd\x42\x6d\x59\x64\xd7\xcd\x5e\x16\xf0\x4e\x04\x3d\x94\x5d\x4d\x49\x18\x51\xbb\xc7\xf7\x57\x15\x0b\x33\x85\x7a\x18\x2e\x82\x69\x55\x59\xb7\x36\x1e\xc7\x14\xb2\xbc\xd8\x35\xf2\x7a\xab\xe9\x86\x34\x11\x2e\x40\xb3\xd8\xf0\xa7\x68\x7f\x01\xa7\xf9\x76\xd1\x66\x79\xb2\x1a\x56\x6c\x83\xb1\x17\x10\x04\x59\x54\x9c\x4c\xb2\xc5\x19\xbb\x16\x05\x8b\xb1\x4b\x91\xc5\x96\x53\x2c\x56\xf4\xd2\x5a\xfd\xff\x03\x8b\xa5\x28\xc0\x61\x32\x45\xd3\xac\x42\x42\xc0\x51\xb2\xc2\x69\xa8\x86\x92\x24\x90\x35\x5c\x21\x50\x85\x60\x69\xa0\xaa\x2c\xc3\x10\x28\x94\x21\x45\x93\xb2\x4a\x51\x2a\xca\x01\x5a\xd5\x18\x4c\xdb\x5a\xdb\x67\x58\xbd\xa6\x31\x9a\x42\xa0\x24\x0d\x59\x1c\xc7\xb7\x85\xa1\x38\x4a\xa2\x8a\x4c\x41\xa0\x72\x40\xa5\x58\x1a\xa3\x64\x4c\x61\x64\x6e\x8b\x07\x21\x46\x69\x0a\x8e\x92\xaa\x42\x29\x2a\xc3\x82\x97\x68\xe4\x73\xb0\x58\x7a\x67\xb1\x42\xc5\x67\x8d\xac\x03\xec\x42\xbd\x1d\xe4\x47\xbc\x46\x09\x8c\x3a\x70\xf9\x56\x06\xed\x95\x17\xcd\xfc\x4c\x37\xea\xe5\xd5\xdc\xc8\x05\x63\xbd\xd3\xc4\x40\xdd\x69\x8e\xe6\xc4\x22\xdf\xc9\x6b\x63\x2c\x37\x1d\x0c\x56\xf6\xda\xf3\x35\x77\xed\xb6\x6c\x89\xd2\x20\x3b\x1a\x8f\xb1\x95\x12\x31\x1c\x59\x6c\x6c\x51\x87\x3f\x71\x27\x1c\x1e\xbf\x87\x7c\xb3\xb5\xb3\x9d\x42\xbd\x5a\x59\x02\xba\x65\x35\x4c\xa1\xe6\xc3\xe9\x48\x9e\xcc\x47\x65\xa6\xd3\xab\x36\x34\x58\x91\xcb\xea\x6c\x31\xe5\xc2\x06\xc6\xfb\x6e\x56\x63\xeb\xa2\xec\x94\x0d\x25\x24\xf3\x39\x7e\x8d\xd1\xbe\xe5\x0f\x8a\x05\xb9\x54\x0a\x40\x28\x32\x93\x21\x5b\x16\x89\xc2\x66\x68\x44\xe5\xd7\x53\x2c\xba\x98\x1a\x90\xf7\x16\x2d\xa0\x95\xdf\x68\x7b\xbf\xe7\xf3\x72\x7d\x30\x93\xb2\x61\xf5\xc4\x78\xe6\x72\xb7\xe3\x19\xb0\x6b\xcb\xf1\xcf\x61\x9e\xaf\xa8\x3f\x81\x76\x65\x3d\xfc\x09\xc4\x2b\x2b\xd7\xef\x1d\x0d\x26\x56\xaf\x8f\x43\x6a\x81\xaa\x32\xbd\xd1\xb0\x38\xac\xf7\x85\xf6\xb0\x59\x1c\xf2\x85\x02\x9d\x23\x9b\xcd\xdc\x90\x92\x46\xcd\x42\x9d\xea\x48\xd5\x4e\x43\x64\x6a\xad\xd2\xb8\x36\xac\xe3\x2d\x61\x58\x95\x0a\x71\x8f\x16\xf7\x62\xcd\xc5\x12\x5d\x29\x18\xde\x2f\x15\x99\xcd\x90\xef\x2d\x75\x16\xb2\x52\xc6\x0f\x59\xb7\xb1\x06\x8b\xae\xa1\x0d\xf9\x4c\x9f\x18\x2f\x78\xe6\x68\x7d\x91\x3b\xe7\xa3\xff\x6e\x3d\x4b\xc8\x0f\x46\x6d\x94\x36\x7b\xe5\xcd\x4c\x09\x96\x68\x0f\x6f\xda\xd6\xdc\x75\x85\x91\xe2\xac\xf1\x79\x9d\xed\x05\xac\xbc\x29\x73\x5d\xce\xc9\x47\x3e\x9a\x53\x03\x9f\x5b\x9d\x99\x74\x8e\x13\xb3\x16\xef\x68\x33\xa8\xac\x0a\x5a\xa6\x44\x0d\xab\x7c\x69\x5d\x03\x5e\x58\x58\x54\xc3\x96\xb1\x69\xe5\x57\x65\x9d\xea\x51\x93\xca\xb6\xfc\x1c\x3f\xa0\xab\xd3\x01\x58\xae\xaa\xa5\xa6\x54\x19\xaf\x86\x21\x3e\x1e\xe3\x64\x1d\x2a\x43\x33\x5b\x9b\x12\xa6\xe5\xce\xbb\x18\xcc\x12\x2c\x74\x98\xc0\x05\x6b\xab\xad\x4a\x33\x57\x6b\x16\xfb\x7d\xb5\x31\x53\x5a\xc5\xc6\xc6\xe9\xb9\x7c\x2b\xdb\x0a\x8a\x40\x25\xa8\xfa\x70\xb5\xe6\x5b\xbf\x7e\x9d\xf7\x16\x9f\x4c\x3d\xf1\x14\xf5\xf5\x53\xea\xc5\x49\x39\xdb\x77\xd6\x3a\x67\xd8\xd0\xa9\x94\x2b\x9c\xdd\x2b\x4a\x63\xb9\xa8\x55\xd7\x58\x66\x59\xf5\xf3\x0a\x61\x72\xcc\x6a\x62\xda\xc3\x42\x78\xa0\x7e\x1d\x3d\xaf\x1f\xfe\xe4\xb6\x7f\x84\xe3\x45\x81\xe7\xb9\x7c\xeb\x89\xa6\xc9\xbb\x10\x76\xd0\x49\xbb\xac\x85\xf3\x16\xcf\x1b\xb5\x20\xcb\x78\x59\xd7\x35\x3b\xe6\x70\xd9\xb1\xdb\x50\xf2\x9a\xc3\x9a\x4e\x48\xc2\x94\x5f\xcb\xb9\x51\xce\xac\x08\x2e\x59\x9f\x4a\x72\xc1\xeb\x37\x58\x7b\x3e\x37\x98\x25\x35\x9b\x64\x89\x19\xdd\xe9\x68\xf2\x18\xaa\x76\x8e\x8f\x9b\xe6\xba\x9f\xa5\x6d\x8f\x7c\xc0\xcf\xf6\x5b\x24\x87\xc6\xd6\x48\x52\x83\x34\x8a\xb3\x0c\x24\x19\x4e\x51\x48\x8a\xd1\x20\xa6\x71\x94\x02\x50\x74\xdb\xdd\xd3\x40\x51\x50\x0a\xb0\x40\xc1\x50\x56\x26\x48\x14\x57\x48\x96\x25\x38\x8a\xe0\x58\x92\xc3\x93\x8d\x1e\xb1\x2a\x46\xff\xcd\x2c\xb2\xdd\xc2\x66\x38\xee\x29\xf2\x52\x52\x72\x9d\x8c\xb0\x62\x42\x82\x26\x84\xb5\xc7\x54\x16\xf3\x46\x85\x53\x04\x6a\xa8\x5a\x8e\xe0\xdd\x8b\xf9\x57\xb6\x43\xde\x5d\xf9\xe3\x96\xc8\xa1\xf2\xfb\xdf\x20\xc5\x2f\x38\x22\x17\x9f\xed\x80\x05\x43\x2f\x7c\x26\x05\xc9\x86\x7e\xe8\xb8\xb3\x39\xf0\xbc\xf9\xc4\x05\x1e\x4c\x41\xea\x42\xcf\x47\x3a\x42\x01\x91\x62\x61\xe4\x27\xd2\x81\x73\x1f\x5a\x32\x74\x11\x1c\xc5\xa8\x47\x0a\xd2\x1c\x57\x81\x9e\x32\x77\x6c\x1b\xae\x7c\x13\x04\xb6\x32\x39\x2f\x28\x7a\x81\xf0\x11\x30\x13\x78\xbe\xa7\xcc\xb7\x34\xe0\x97\xb5\x8f\xc1\x12\x9e\x43\xbb\x5c\x7d\x28\xa9\x66\x7b\x15\xb0\x58\x58\xa8\x91\xcd\xd2\x52\xd0\x5c\xa5\x59\xdd\x78\xd6\x62\x46\xda\x58\xd8\x34\x55\x1c\xe8\x8d\xf0\xe0\x5e\xb1\x3b\x67\xdb\x4d\x4a\xaf\x96\xa8\x92\x5d\x6f\x0f\xb3\x93\x4c\x7f\xad\xe7\x58\x03\x77\xeb\x39\x60\x78\x62\xd9\x43\x79\xaf\x53\x6e\xf4\x1b\xa3\x4e\xe7\xb3\x23\x6f\x14\x58\x2a\xe3\x49\xa9\xbb\xe8\xb7\xa6\x8d\xf6\x9a\xce\xb6\xbb\xa3\x0c\x04\x56\xe0\x49\x93\xf5\xb4\x06\x66\x9b\x55\x87\x59\x2d\xeb\x53\xac\x89\xeb\xd5\xe8\xa9\x02\x4e\x13\x84\x78\x8a\x24\x0a\x26\x08\xed\x75\x8d\x5b\x84\xc5\x41\xcd\x2a\xe8\x3d\x38\xdf\x84\x7e\x8f\x19\x4e\x1a\x82\x0f\x47\x0d\x6f\xda\x05\x6e\x48\x07\xd0\x91\x43\x39\x63\x0b\xd4\x62\x30\xc5\x36\xac\x67\xe8\x9e\x5b\x0c\x81\x56\xaa\x6c\xea\xdc\x62\xee\x66\x2a\xa3\x46\x36\xa7\xda\x6d\xb1\x43\x91\x8d\x3f\x3d\x55\x5a\x4f\x15\x35\xc2\x14\x1f\x71\x5d\x39\x00\x52\x71\x0d\xb1\xa0\xc2\x4e\x5d\xac\xde\xf6\x31\x00\x2a\x4d\x77\xd5\x12\xdc\x96\xdf\xf1\xa7\x8d\x10\x66\xac\xd6\xa1\xfb\xe0\x47\xcb\x50\xcd\x73\xf9\xb6\xe7\x8e\x14\x41\x1d\x0f\xa4\xa2\xb7\x00\x92\xd6\x6d\xb3\xf2\x3a\xf4\xa6\x81\xdc\x6a\x97\x78\x53\x66\x73\x9a\x72\x36\xdf\x3b\x6b\xef\x8b\xef\xf9\xc0\x21\x1c\x9f\xa4\x16\xf9\xa6\xb8\x9a\xb7\xb2\x84\x53\x92\x32\x1b\x8c\x69\xaf\x0d\x0f\x33\xb5\x7a\x61\x64\xb5\x06\xba\x1b\x74\x32\xdd\xf8\x01\xc6\xf2\x9c\xc4\xf3\x85\x41\x96\x1f\x12\x51\x73\x95\x9b\x8d\x45\xa6\xcd\x17\xf2\x3a\xca\x5b\x15\x96\x2b\x28\x0d\x3d\x28\x66\x88\xca\xaa\x09\x7b\x3d\xb6\x22\xd8\x83\x7c\x1b\x0f\x7b\xaa\x23\x62\xb2\xd0\x35\x6b\xdc\xa0\x20\xb7\x61\xbe\xb3\x6c\x95\x45\xb6\xab\x63\x4e\x7f\x38\x5a\x8c\xd7\x1b\xd5\xe6\x03\x50\x59\x4e\xa4\xa2\x17\x7a\x4f\xd6\xbf\x7e\xa7\xfe\xb9\x00\xe4\xe5\xfe\x70\x8c\x0b\xe6\x70\x00\xdc\x3e\xdd\x5b\x85\xf2\x80\x28\x4a\x15\x7d\x6e\x13\x7c\x27\x3f\x29\x17\xe6\x94\xbc\xea\x94\x07\xfa\x9d\xfa\xd7\x2d\x7a\x38\x40\xbd\x91\x37\x9c\x0c\x4b\x79\xa2\x8d\xd6\x2b\xbd\x76\x76\x81\x2d\xad\xe1\x64\x59\x5e\x7b\x80\xaf\xda\x74\xbf\x3f\x5b\xcb\x85\x35\x61\x1b\x65\x2c\x0b\xe4\x22\xde\x2c\x39\x2b\xc2\x9c\xd9\x7a\x57\x6f\xf4\xd7\xab\xec\xd4\x69\xe5\x45\x71\x5c\x69\x65\xd6\xda\x8a\xd3\x9f\x6d\xff\xf2\x9d\xfa\xf3\xcc\xa8\xc6\xf2\xcc\xd4\xd4\xc5\x26\x44\xd5\x5e\x8f\xe9\x97\x14\xa1\xb5\xa2\x5b\xd9\xd0\x2c\x2d\x14\xa2\x27\x60\x14\xa8\x10\x65\x03\x6b\xdd\xa9\x7f\xae\xdc\xb6\x2a\xa6\x4f\x0e\xf9\xea\xda\x73\x8a\x8a\x63\xd0\x9b\x6c\xd7\x1c\xa0\xb3\x7a\x31\xc8\x1b\x6b\x5a\xf4\x05\xae\x3b\x57\x3b\x4d\x83\xc8\xc9\xd5\xe2\xc6\xef\x60\x35\xbd\xbc\x62\x44\x72\xe3\x58\xf3\x55\xc6\x99\xb9\xc3\x36\xe8\x15\x3b\xdd\xbc\x66\x08\x21\x3b\xc9\xd4\xf5\x11\xbf\x8f\x77\xcf\xf6\xc4\x77\xfb\x8d\x68\x8d\x61\xb7\xb1\xe3\xa5\xf7\x1b\xff\x37\xda\x07\xfa\xea\x1b\x16\xfc\xfa\x23\xb9\xc4\x14\x5f\xdf\xfd\xa4\xf7\xeb\x0f\x24\x16\x8c\x2e\x4e\x80\xf7\xf5\x47\xfc\xfe\x7b\x74\xf1\xbf\x3b\x61\x0d\xc2\xc7\x04\x2d\xb0\xf2\x57\x9e\xb1\x79\x50\xdc\x85\x1e\x74\x97\xf7\x84\xbf\xfc\xf7\xd1\xbe\x34\x7a\x71\x53\xdd\xbd\x40\x95\xc2\xc9\xd3\x8b\x30\x0f\xe8\xb1\x1b\xce\x03\x57\x99\x18\xcb\xdd\xcd\x2b\x6d\x73\x6c\x03\x6c\x47\x48\x44\x87\xfb\xf5\x07\xf2\x75\x89\xe1\x7f\xa3\x7f\xa3\xae\x82\x7f\xdd\xdd\x53\x02\xd7\x85\xb6\x5f\x8b\x6a\xf7\xf5\x07\x42\x9c\x5e\xcf\x45\xaf\xd7\x6e\xa9\xfb\xdf\x07\x2e\x8f\xac\x1e\x24\xb7\xd8\x1a\xad\x02\xa0\x41\x9a\xa4\x19\x95\xc1\x01\x40\x31\x19\x02\xc8\x00\x94\x24\x58\x8a\xe5\x30\x0d\x6a\x32\x8b\x69\x0a\xa5\xb0\x2a\x86\x01\xc0\xa0\x34\x80\x90\x45\x59\x02\x57\x58\x5c\xc5\x76\x1a\x1d\x70\xb7\x23\xa1\x93\x36\x3c\xdc\x89\xaa\xff\xf5\x07\x82\x9e\xdc\xfa\xef\xd9\xf3\x9e\x0d\xe6\x5b\xbd\xa0\x46\x60\x00\x47\x01\xc1\xb1\x10\x32\x84\x02\x71\x1c\x67\x28\x08\x58\x8c\x61\x18\x96\x96\x81\x42\x91\x34\x45\x6b\x04\xa1\x2a\x0a\xa9\x11\x1a\x54\x68\x74\xdb\x40\xaa\x86\xd1\x84\xca\x7d\xfd\x92\x52\xc2\x15\x0e\x9e\xdd\xa6\x78\x3f\x07\xd8\xeb\xe5\x3d\x27\xf0\xe7\x81\xff\xb9\x75\xbf\xc5\xf0\xd3\xb5\xfe\x1f\xcd\xf0\x63\x56\xf6\x87\x83\x3f\x1c\xfc\xe1\xe0\x0f\x07\x7f\x38\xf8\xc3\xc1\x1f\x0e\xfe\x70\xf0\x1b\x39\x88\xfe\xf7\x7f\x1e\x9f\xbf\xec\xd6\x02\x89\xf3\x1a\x20\x9f\xb3\x16\x18\xaf\xc2\x7f\x64\x2d\xf0\x1f\xda\x0a\xd8\xfe\xe9\x88\x53\x6e\x30\xad\x0a\x78\x55\xa5\xf5\x99\x6e\xe3\x6a\x6b\x84\x99\xde\x98\x75\x6b\x43\x9a\x5d\xa0\x95\x0d\x1c\x12\xcb\x62\x71\xa0\x2a\xc3\x78\x5a\x8f\xd3\x04\x71\x5c\x8b\xcb\x1f\xd7\x0e\x12\xfb\x19\xf5\xd3\x9d\x58\x31\x5f\x26\x16\x06\xd3\x41\xbb\x12\x05\xa6\x15\x62\x55\x17\xca\x99\xfe\x3a\x2b\x14\x3a\xe3\xa5\x3a\xb7\xca\xfa\x62\x28\xe5\xb2\xba\x5e\x2d\x48\x2d\x6a\xc4\xb0\xc5\xc1\xcc\xc6\x4c\xd3\xf7\x4b\x34\x23\xf0\x9d\x5e\xbd\xab\x60\x9b\xb0\x47\x74\x32\xaa\xd2\x6e\x0f\x2c\x9d\xf0\x4b\x6c\x5c\xb5\x3f\x5b\x2f\xef\xdc\x7a\xd9\x7e\x8a\xb2\x56\x5e\xd2\xc5\xf9\xaa\x2b\xca\xba\xc5\x97\x32\xad\x0c\xd1\x5f\x84\x62\xd3\x2f\xe4\xab\xd3\x70\x5e\x2e\x4f\xf3\x75\x30\xd2\x65\x6b\x94\x58\x1b\x72\x17\x12\x5d\x83\x0d\xa0\x4f\x57\x75\xd0\x6b\x72\x74\x6e\xa3\x79\x1c\x44\x15\xc7\x95\xc6\xc3\x4d\x6e\x50\x99\x15\x9c\x2a\x33\x5b\xce\xc2\xe3\x5a\x93\x9e\xb6\xb6\x94\xf8\x1e\xbf\x87\xf2\xde\xb5\xb6\xf8\xb3\x74\xc3\xc4\xd7\xdc\x61\x2d\x52\x14\xd0\x0c\x83\x5b\xcd\x6a\x7b\x55\xa8\xb9\x9d\x81\x43\x06\x0e\x11\xf6\xb4\xa6\x3c\x9d\xf0\xd9\x95\x3f\xd7\x31\x4a\xaa\x9b\x33\x63\xb0\x54\x2b\xbe\x58\x1b\x42\xa7\xb3\xc4\xc9\xac\x4e\x89\x0d\xa1\x5c\x2e\x65\x72\x6b\x5a\x18\x8d\x16\x5e\x7d\x4d\xba\xed\x4a\x53\xe5\x29\x67\xde\x2a\x9d\xad\x35\xe5\x3e\x66\x7f\x37\xb7\xbe\xae\xfc\xec\xe4\x89\x4d\xeb\xab\x6f\xf9\xbf\x77\x47\xe9\xe4\x4d\xff\x43\x1c\xc5\x09\x86\x84\x1c\x47\x90\x9c\xcc\x41\x8d\x51\x65\xc0\x01\x4a\x95\x09\x82\xe0\x64\x86\xd5\x54\xc0\x6a\x04\xc9\x30\x8c\x8c\x01\x8d\x20\x64\x40\xd2\x2c\x50\x29\x05\x55\x35\x8e\xa4\x55\x52\xdd\xbd\x92\x75\x12\x6d\xeb\x47\x76\xe3\x86\x35\xb2\x39\xb4\x86\x56\x8a\x6b\x7f\x12\x4a\x98\x39\x42\xc1\x7a\xee\x60\x9c\x54\x5a\x2d\x6b\xf9\x75\x83\xf2\x73\xa2\x92\xef\x2f\xc3\x02\x17\x12\xba\xef\x36\xec\x31\xff\xc0\xe7\xea\xab\x7d\x51\xeb\xe6\x9f\x29\x7f\x94\xcd\x28\xa9\xd6\x7e\xb7\xfc\xcb\x3d\xeb\x74\xde\x31\x9a\x04\x14\x4a\x93\x50\x06\x34\xa9\xe1\x8a\x2a\x03\x55\x66\x29\x5a\xd6\x08\x92\x64\x49\x96\xd2\x14\x1a\xa7\x71\x92\x01\x2a\x20\xa0\x4a\x70\x8a\xaa\x6a\xa8\x46\x73\x28\x8e\x11\x84\x4c\xc7\xbc\xe3\x97\xbc\xff\x4b\xf5\xfe\x2c\xde\x59\xf2\xf8\xfc\xf9\x0a\xf7\x67\xf0\x8e\xcb\x38\x64\x71\x55\x06\xb2\x8c\xe2\xa4\x8c\x33\x00\x55\x08\x8c\x44\x15\xc0\x60\x2a\x0b\x14\x4e\x56\x18\x8c\x25\x30\x8d\xd3\x28\x40\xc8\x2a\xcd\x41\x05\x10\x2a\xcb\x6a\x32\x0a\x15\x4a\x89\x79\x27\x3e\x9d\xf7\x8f\xd6\xfb\xb3\x78\x67\x7a\xc7\xe7\xcf\x77\x56\x3e\x83\x77\x05\xca\x32\xcb\x50\x00\x45\x35\x8d\x86\x18\xc1\x12\x00\x6a\xa8\xa6\xe2\x14\x06\x18\x5a\xc3\x71\x05\xd3\x38\x20\xe3\x00\x57\x35\x4d\x91\x51\x86\x61\x29\x8a\x21\x68\xa0\x42\x9c\xa6\xb8\xfd\x8b\x74\x37\x79\x7f\x62\xc7\x4b\xbf\xc6\xed\x5d\xde\x85\xe7\xca\xb7\x94\x63\xf9\xef\x8f\x33\x57\xfb\x8c\xcf\xe9\x30\x7e\x77\x6f\x51\xac\xb1\xa5\xd6\xb2\x35\x93\xab\x78\x89\x27\x06\xfd\x69\xdb\xad\x5a\xd3\x21\x8a\x6a\x45\xd6\xab\x95\x19\x0b\x15\xdb\x61\xe5\xb0\x0f\x95\xe8\x15\x72\x67\x74\x9c\x7f\x7f\xe7\x58\x87\xe7\x1b\x94\x5b\x4d\xe2\xc5\xde\x11\x8d\x7d\x85\xcd\x62\x39\x6b\xe5\x5a\x8e\xc4\x57\x0c\xad\xd9\x1e\x0a\x4e\x6d\xb2\xf4\xd7\x4a\x97\x30\x0b\xcd\x7c\x8b\xc2\xf4\x99\xea\x15\x4a\x20\x27\x0d\x42\x94\xea\x64\xfb\x93\x01\x3a\xd4\x67\x2e\x9a\xcf\x35\x45\x52\x02\x85\x3e\x5e\xb5\x14\x8f\x18\x87\x35\xcb\x90\xc9\x6e\xdb\xad\xd7\xb6\xf3\x93\x32\xd1\x9d\xcf\x50\x8b\x62\x08\x9c\xb6\x4c\x7c\x53\xa7\x7c\x32\x0b\xa6\x9b\x36\x01\x57\xee\xa6\x41\xb7\x1d\xb7\x1f\x4a\x99\x9e\xdc\x43\x0f\x8a\xdd\xe0\xe0\x68\x19\x27\x6f\xb8\x24\x64\xa3\xaa\x7e\x46\xb4\xfa\x68\xb4\xe0\x3f\x21\x5a\x49\xee\xba\xdb\x7d\xa2\x7c\x9e\xff\xf7\xa2\x46\x5a\xb4\xfc\xdd\x43\x83\x8f\x3b\x59\xfe\x4c\xfb\x0b\x83\x6b\xe0\xf9\x2c\xdf\x20\xa9\x51\x4e\x20\xfc\x52\xbf\xd0\xc0\xda\x04\x8f\xd6\xe1\xac\xc9\x56\xda\xb4\x2d\x61\x3c\x07\x07\x86\xba\x2e\xfb\x71\x7b\x5d\x77\x32\xbe\x23\x8e\x8d\xb1\x0c\x0b\x61\xde\x73\xab\x39\xbb\x5a\x0e\xbc\x2c\x4a\xf5\xfd\x8a\x90\x73\x75\xc7\x0b\x26\xb5\x56\xb6\x47\x0f\x7b\x53\xd2\x0f\x07\xeb\x89\xc7\xf4\xfc\x0e\x99\xaf\xc3\x55\xa3\x4e\x57\x16\x8a\xb6\xa8\x54\x31\x74\x60\xe6\x66\xb3\xd0\x26\x75\xb6\x59\xd6\xa6\xe5\xe2\xd6\x11\x0a\xb3\x79\x6b\xdc\x08\xac\xee\x7a\x23\xbb\xf2\x64\xb0\xdc\xb4\xcb\x9d\x42\xb6\x58\x31\xda\x34\x3e\x65\xba\xb6\x44\x84\xdc\x9c\x9f\xd4\x99\xd1\x41\xb1\x7f\xdf\xc9\x9e\x35\xf2\x67\x9d\xac\x1e\xd6\x2c\xf7\x13\x9d\xec\x89\x97\x11\x7e\x8f\x93\x7d\xf2\x38\xf0\xe3\x4e\x26\x9c\x69\x7f\x61\x70\xb2\xa5\x5b\x58\x1f\x57\x75\xaa\x8f\x59\x0b\x0c\x9a\x75\xa5\x88\xf9\xab\x69\x67\x54\x1d\x73\xa1\xa8\x3b\x9d\x1c\x80\x03\xb6\x67\x14\x62\xc2\xae\x3b\x99\x50\x09\x4c\xcc\xaf\x15\x6b\x05\xb2\xbf\x0a\x7d\x54\x15\xf2\x7d\x51\xa3\x7d\x99\x32\x49\x79\x5d\x77\x8b\x7a\x7e\x9e\x31\xfb\xe3\xba\xb5\x52\x7c\x8a\x34\x24\x0d\xb7\x56\xfe\x74\x45\xd7\x55\x6a\x5c\x21\x45\x52\x30\x15\x4f\x23\x69\x91\x9f\xe4\x8a\x9d\x5e\xd3\xb3\x59\x6d\x24\x6c\x1d\xa1\xba\xa6\xf3\x38\x1d\x84\x95\x5a\x85\x16\x84\x02\xbf\xb6\x4b\x23\xb7\xb2\x2c\x15\x85\x12\xc5\x81\x06\x07\xe0\x7a\x8a\x97\x33\x21\x53\x38\x2e\xaf\xfd\xfb\x4e\xf6\xac\x91\x3f\xeb\x64\x35\x74\x46\x0b\x9f\xe8\x64\x4f\xbc\xf1\xf4\x7b\x9c\xec\x93\x07\xfd\x55\x7a\x0a\x0d\x62\x6a\x39\x65\xb6\x5b\x34\x85\x2c\xd4\x15\x82\x69\x0e\xfd\x52\xb5\xba\x19\xf4\xd9\xb0\x6f\x8c\x73\x20\x1f\x50\x35\x2a\x62\x32\x36\xb0\x68\x32\x75\x63\xb8\x18\x0f\xba\xdf\xeb\x64\xf1\xa7\x46\xb3\xc9\xb9\x1a\x38\x2c\x9d\xf1\x5c\x33\xe0\xe6\xd3\xf5\x4c\x69\x77\x68\xd4\x5c\x34\x6a\x0b\x89\x2d\x94\x36\x38\x49\xb6\x9a\xac\x0c\x46\x12\xec\x76\x2b\xe3\xb2\xe9\x12\x1d\xb9\x9d\xc7\x88\x85\xe8\x72\x41\x93\x6c\xb4\x05\x7d\x9d\xcf\x65\x75\x25\xd0\xf1\x62\xd5\x15\xea\x41\x15\xed\x74\x89\x56\x03\x54\x7b\xb9\x30\x76\x88\x8d\x1b\x94\x06\xba\x90\x95\x27\x0d\xc1\x5d\x0a\x5c\xa5\x3d\xc7\x59\x23\xd4\x2c\xb7\x6a\x10\xd9\x75\xa8\x92\xfd\xa1\xb4\x20\x8c\xf1\xf8\xa8\x6b\xba\xb3\x89\xa7\x0d\x7a\xc5\xd9\xe2\x07\x2e\x9c\xed\x1f\x34\x36\x3e\x65\xb2\xf5\xee\xf2\x33\xa6\xbc\x78\xa2\xfc\x3a\xff\xef\x4d\xf6\xd2\xea\xff\xee\xf2\x49\x9b\x9b\xfd\x8e\xc9\xe6\x8d\x84\x10\xef\x9d\x71\x9e\x25\x85\xd8\xc7\x91\x64\x0c\x88\x7f\xc8\x76\xb4\xd5\x94\x40\x74\x1d\xe5\x30\x26\x8e\x7f\xfe\x76\x81\x72\x35\x89\xed\x65\x6e\xef\x43\xf2\xde\x7d\xe2\x88\x3b\xd5\x4c\x26\x19\x8f\x52\x8b\x27\x10\xa3\x7d\x2f\x5e\x10\x52\xd2\x6d\x1e\x0a\x44\x9a\xed\x72\x9d\x6f\x8f\x90\xaa\x38\x42\xbe\x1d\x32\x11\xbd\x1e\xd2\xdc\x5e\x4d\x3a\x7b\x96\xee\xfc\xb3\x14\xf7\x6e\x68\xed\xdd\x52\x39\x2d\x09\xe8\x31\xc3\xfb\xd3\xea\xc9\xc0\x4e\xd3\x6c\x5f\xc0\xa9\x52\x71\xde\xb1\xdb\x19\x42\x6f\xa6\xb6\x7f\x5a\xdd\x13\xf0\x34\xc5\x6f\x94\x8e\xf4\xa4\x72\xab\x27\x22\xc7\x64\x24\xef\xaa\xc9\xe7\xf0\xfd\xce\x0a\x5c\xb6\xc1\x31\x69\xea\x95\x84\x9f\x27\x07\x22\x3c\xad\x6f\x0c\x96\xa6\x68\xa2\x98\x53\x0d\x77\x69\x28\xd3\xd3\x4f\x26\x4f\x7f\x78\x5a\xb9\x08\x2b\x4d\xb7\x63\x21\xa7\xaa\x19\xf3\xd7\x28\x29\xe5\xcd\x74\x8b\x29\xa7\x5e\x3c\xaf\x69\x02\x32\x55\xe1\xf3\x22\xd3\x1a\xfd\x4a\x4e\xc6\x93\xb3\x3f\x3e\x43\x53\x2f\x90\xaf\xe8\xb8\x2f\xe6\x54\xbb\x28\x9d\xe3\x8d\x04\x8d\x17\x07\x9e\x3c\xad\xe4\x11\x30\x4d\xd1\xb3\xe2\x1e\x8a\x61\x89\x5f\xcf\x9d\x1f\xfb\xf2\xb4\xb6\x47\xc0\x34\x6d\xcf\x8a\x3b\xd5\x76\x9f\xe6\xf0\x46\x1a\xc1\x8b\xe3\x6f\x9e\xd7\xf7\x00\x98\xaa\xef\x69\x71\xa7\xfa\x1e\x32\x11\xde\xc8\x30\x78\x71\x0e\xd0\xd3\x0a\x1f\x01\xd3\x14\x3e\x2b\xee\xea\xd0\x20\xce\x30\xf8\x7a\x4c\x1f\x78\x33\x85\x5c\xca\x39\x49\xcf\xd7\x23\x01\x99\x5a\x93\xf3\x22\xd3\xa2\x84\x07\x17\xaf\xfb\x9c\x69\xd7\xd3\xbb\x9d\x9f\x1f\xf5\x09\xba\xdf\x54\xfc\x29\xad\xcf\x86\xa8\x69\xa7\x6a\x3d\xad\xff\x29\x68\x5a\x25\x52\x8a\xbd\x5a\x93\x64\xea\xb5\x6b\x43\xcd\xc3\x89\x63\x3b\xdd\xa3\xf3\xc9\x1e\x4b\x0a\x17\x1f\x65\x76\x86\x83\x34\xa4\xe3\x28\xb6\xd7\x29\x4b\x45\x44\xf6\x5d\x08\x91\x7d\x06\xc8\xbf\x90\x41\x49\x6c\x8b\x48\x32\x23\xe4\x31\xcd\xd7\xe5\x40\xf3\xf4\x10\xb5\x8f\x6a\x79\x0a\xb3\x55\x72\x37\x4e\x39\x51\x31\x99\x16\xfc\x35\x99\x04\xfc\x35\x4e\xce\x7d\xa1\xdd\xf1\x24\xb8\x8f\x2a\x76\x40\xd8\xea\x74\x74\x8c\x13\xb5\xae\x0f\x15\x4f\xce\xac\x7b\x46\x85\x3d\x48\xac\x45\x22\xc0\x3c\xa8\xc8\xc9\x31\x7b\x1f\x55\x24\x09\xb2\x55\xe4\x74\x20\xfc\xa0\x26\x27\x47\x03\x7e\x54\x93\x24\xc8\x56\x93\x44\x0e\x83\xc7\xd5\x38\x39\xce\xf0\x09\x4d\x92\x38\x3b\x65\xf6\xa3\x84\x53\x65\x92\xa9\x7f\x6f\x85\xaf\xe7\x34\x3a\x07\xda\xaa\x74\x16\x1b\xef\x72\x74\xed\x14\x4f\x44\x71\xac\xb9\x09\x7d\x18\x15\xfb\xff\x02\x00\x00\xff\xff\x83\x97\x70\x56\xf2\x73\x00\x00") func baseCoreSqlBytes() ([]byte, error) { @@ -610,86 +172,6 @@ func baseHorizonSql() (*asset, error) { return a, nil } -var _change_trustCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\xb3\xa2\xc8\xd2\xee\xf7\xfe\x15\x44\x7f\xe9\x9e\xb0\x67\x04\xaa\xb8\x75\x9f\xde\x11\xa8\x78\xc5\xfb\xdd\x13\x27\x3a\x0a\xaa\x0a\x51\x01\x05\xbc\xbe\xf1\xfe\xf7\x13\xa2\x4b\xd1\xa5\x2e\x97\xae\xde\xb3\x23\xf6\xf0\x61\xcd\xb4\xa4\x4f\x66\x3d\x95\x99\x55\x59\x60\xd5\x9f\x7f\x7e\xfa\xf3\x4f\xa6\xe6\x05\xa1\xe5\x93\x66\x5d\x67\x30\x0a\x91\x81\x02\xc2\xe0\xb9\x33\xfd\xf4\xe7\x9f\x9f\xb6\xf7\x33\x73\x67\x4a\x30\x43\x7d\xcf\x39\x0a\x2c\x88\x1f\xd8\x9e\xcb\x28\x7f\x89\x7f\x71\x31\x29\x63\xcd\x4c\xad\x5f\xdb\xaf\x9f\x89\x7c\x6a\x6a\x2d\x26\x08\x51\x48\x1c\xe2\x86\xbf\x42\xdb\x21\xde\x3c\x64\x7e\x32\xec\x8f\xe8\xd6\xc4\x33\xc7\xaf\x3f\xb5\xf1\x84\xfc\xb2\xdd\x5f\xa1\x8f\xdc\x00\x99\xa1\xed\xb9\xbf\x02\x12\x6c\x71\x5f\x0b\x9b\x13\x7b\x0b\x4d\x5c\xd3\xc3\xb6\x6b\x31\x3f\x99\x2f\xed\x56\x56\xfe\xf2\xe3\x45\xb7\x8b\x91\x8f\x7f\x99\x9e\x4b\x3d\xdf\xb1\x5d\xeb\x57\x10\xfa\xb6\x6b\x05\xcc\x4f\xc6\x73\xf7\x18\x43\x62\x8e\x7f\xd1\xb9\xbb\xd3\x65\x78\xd8\x26\xdb\xfb\x14\x4d\x02\x72\xa2\xc6\xb1\xdd\x5f\x0e\x09\x02\x64\x45\x02\x4b\xe4\xbb\xb6\x6b\xed\x44\x7c\x6f\xf9\x2b\x20\xe6\xdc\xb7\xc3\xf5\x16\x9c\xd2\x1f\x7b\x02\x08\xf2\xcd\xe1\xaf\x29\x0a\x87\xcc\x4f\x66\x3a\x37\x26\xb6\xf9\x6d\xcb\x98\x89\x42\x34\xf1\xac\x1f\x9f\x3e\x65\x1a\xd5\x1a\x53\xa8\x64\xb4\x1e\x53\xc8\x32\x5a\xaf\xd0\x6c\x35\xf7\x92\x7f\xcd\xa7\x96\x8f\x30\x19\xda\x41\x68\xac\x03\x32\xfb\x71\x53\x3a\x30\xa7\xb3\xb9\xe7\xcf\x9d\xe0\x3e\x61\xe2\x2e\xee\x91\x9c\x10\x6c\x11\xff\x1e\xc9\xad\x9d\x94\x90\x3b\x25\xef\x10\x33\x48\x10\x7a\x94\x12\xdf\x76\x31\x59\xdd\x96\x45\xa6\xe9\xcd\xdd\xd0\x40\x13\xe4\x9a\x24\xf8\xf1\x49\xd5\x5b\x5a\x83\x69\xa9\x29\x5d\x8b\x49\x57\x2b\x7a\xff\x02\xbd\x9e\xbf\x66\x22\xf4\x74\xb5\xd2\x6c\x35\xd4\x42\xa5\x15\xfb\xd2\xa9\xe0\xaf\xe9\x98\xac\xef\xc1\x0f\x57\x6f\x43\x1f\x64\xde\x81\x4a\xc9\x1d\x36\xc7\xc5\xee\xc7\xf6\xe7\x41\x38\xb1\x5d\x12\xdc\x42\x3e\x08\xdd\x8d\xbb\xb5\x82\x44\xd9\xe0\x06\xee\x51\xe8\x7e\xdc\x83\xcb\xdf\xc2\x3d\x08\xdd\x8d\xbb\x93\xb7\x5d\xea\xdd\xc0\x3d\x0a\xdd\x8d\x3b\x9d\x1b\xc1\xdc\xb8\x81\xb9\x13\x78\x0f\xde\xc4\x0e\x86\xb3\x39\x99\xdf\x62\x36\x2e\x76\x3f\x36\x21\xfe\x2d\x5a\xa3\xfb\x77\xa3\x45\x61\x7c\x0b\x6e\x27\x70\x37\xde\x2e\x2b\x0d\x09\xc2\xb7\x61\x4f\xe4\x7e\x33\xfa\x3e\x53\x92\xd9\xaf\x3b\xd5\x18\xc8\xbd\x01\x6e\x20\xf7\x6e\x83\xf7\xd9\xef\x96\xad\x2f\x22\xef\xc5\xdc\xce\x01\xde\x86\xdd\x4a\xed\x91\x23\xd9\x73\xe0\x8b\x29\xf7\xb6\xec\x21\x35\xbe\x25\x76\x4c\x74\x6f\x48\x1e\x12\xd7\x6d\xb9\x63\x22\x7a\x43\xee\x90\x58\xde\x94\xbb\xcb\xbe\x63\x42\xb9\x2d\xb7\x4b\x12\x6f\xca\x1c\x42\xfe\x0d\xc9\x6d\x1c\xdf\x16\xd9\xc5\xe6\x6d\x99\x93\x50\xb8\x2d\x6a\x20\xf7\xb6\xc0\x8b\xab\xde\x25\xb5\xf5\xbc\xbd\xa0\xd6\x6b\x69\x95\x66\xa1\x5a\x89\x0b\x4f\xa6\x56\x30\x9b\xec\x25\x9a\xe9\xbc\x56\x56\x5f\x61\xfd\xf8\xb4\x9b\x1b\x57\x90\x43\xbe\xbf\x7c\xc6\xb4\xd6\x53\xf2\x7d\xff\x95\x1f\x4c\xd3\x1c\x12\x07\x7d\x67\xfe\xfc\xc1\x54\x97\x2e\xf1\xbf\x33\x7f\x46\x53\xe6\x74\x43\x53\x5b\xda\x0b\xf2\x0b\xde\xa7\x13\xc4\xd3\x9b\x7b\xe0\x74\xb5\x5c\xd6\x2a\xad\x1b\xc8\x3b\x01\xa6\x5a\x39\x05\x60\x0a\x4d\xe6\xcb\xcb\xfc\xf6\xe5\xb3\x20\x02\xf9\x72\xae\xf9\xa5\xf9\x7b\x9d\x07\x86\xde\x6c\xcf\x09\x97\x95\x6a\xeb\x8c\x4f\xa6\x5b\x68\xe5\x0f\x66\xc5\x27\xb4\x27\xea\x8f\x28\x67\x86\xbc\xa7\xf1\xaf\x40\x22\x02\x6a\x7a\x72\x6a\x6d\xab\x98\xa9\xef\x99\x04\xcf\x7d\x34\x61\x26\xc8\xb5\xe6\xc8\x22\x11\x0d\x77\x4e\xc0\xb7\x62\x98\x50\x34\x9f\x84\xbf\x42\x64\x4c\x48\x30\x45\x26\xd9\x56\x13\x5f\xce\xee\x2e\xed\x70\xf8\xcb\xb3\x71\xac\x40\x38\x69\x6c\xdc\x21\xf7\xcd\x8c\x5c\xf7\xd8\xc8\x17\x07\xb8\x44\xf8\xce\xcb\xe3\x49\xf7\xeb\x27\x86\x61\x5e\x3e\xb1\x31\x63\x0e\x91\x8f\xcc\x90\xf8\xcc\x02\xf9\x6b\xdb\xb5\xbe\x0a\xe2\x1f\x51\xdf\x54\xda\xba\xfe\x2d\x92\xde\x7e\xd1\x45\x0e\xb9\x20\x2c\xcb\x97\x84\x17\x68\x32\xbf\x24\xcd\x71\xfc\xb9\xf8\x04\x05\xa1\xe3\x61\x9b\xda\x04\x33\xb6\x1b\x12\x8b\xf8\x07\x91\x4f\x7f\x9c\xf7\xfd\x21\x8a\x9f\xe4\x22\x78\x88\x88\x7d\x21\xc0\x18\xb6\x65\xbb\xe1\xd9\xcd\x80\xcc\xdc\xb9\x73\xf9\x9e\x3b\x77\x82\xb9\x41\xdc\xd0\xdf\x96\x82\xe7\xcd\xdc\xc9\xd8\x2e\x9d\xa0\x6d\xc5\x88\x49\x10\x5e\x36\x67\x27\x38\xf4\x1c\x82\x3d\x07\xd9\xee\x05\x29\x08\xcf\x8d\x0e\x87\x3e\x09\x86\xde\x04\x07\x4c\x48\x56\xe7\x96\xd1\x09\xb2\xae\x59\x74\xb3\x6f\xf6\x8c\xcc\xb7\x5a\x27\x36\x32\xec\x89\x1d\x6e\x1b\xb7\x6b\xff\x0b\x25\x93\xc9\xad\xdb\xb6\xe5\x6e\xe7\x42\x5b\xb3\x76\x9f\xc4\x66\x03\x87\xa9\xc5\x9e\xf4\x5f\x51\x59\xcd\xa4\xf3\x5a\xba\xc4\x7c\xfd\xfa\xd2\x15\xff\xfa\xc9\xb0\x7f\xfc\x71\xe3\xdb\xe7\x06\x9e\xe3\xbc\x6a\xc0\x5b\x88\x27\x7d\x79\x86\x76\xda\xcf\x6f\x21\xbd\xa6\xe7\x0c\xee\x02\x7f\x3b\xcc\xd7\x81\xb1\x1d\xff\x1e\x8d\x89\xed\x94\x71\x17\x0e\xae\x87\x49\x3c\x16\x4e\x62\xe0\xb5\xd2\xd3\xf1\xf9\x51\xf5\xa7\x13\xe3\x9d\x21\xfb\xcf\x50\x30\x8c\x19\x23\xbe\xf2\xed\xa9\x4f\x16\x6f\x0a\x19\x73\x73\x4c\xc2\x89\x1d\x84\x6f\x8a\x1e\x66\xdb\x2f\xee\xbe\xfb\xd8\x9c\x78\x01\x09\x6d\xe7\x4a\xe4\x47\x89\xf5\x42\x6c\xc5\xfa\xfc\x74\x52\x7f\xc0\x3b\xeb\xef\xa3\x9e\x2b\xae\x73\xad\x36\x38\x85\x39\xb6\xe2\x9a\xb7\xec\x27\x5f\x8f\xf6\xd8\xbe\xf0\xfa\x7a\x08\x72\xe2\xdf\x99\x41\x77\x2b\x2f\xf8\x5a\x06\x8d\xdc\x1d\x05\x01\x09\x2f\xf1\xb9\x8b\xd5\xab\xb7\x91\xb3\x0d\xab\xcb\xd0\x53\xdf\x36\x89\x7b\x25\x89\x45\x37\xaf\x65\xb8\xe8\x26\x83\xbd\xb9\x31\x21\x5b\x7f\x33\xed\x68\x45\xf2\x43\xb3\x68\xac\x87\xf7\x25\xeb\xae\x2d\x67\xfd\xba\x6f\xe0\x15\xdf\xd8\x7f\x73\xcf\xf0\xd9\x57\x5f\x78\xbf\xe6\x10\xbb\x09\xfb\xa3\xfe\xb0\x2b\xeb\x77\xee\x60\x4f\x2f\x0d\xfc\xc2\xab\xc8\xf5\xfc\xf0\xc0\x46\x46\xcb\xaa\x6d\xbd\xc5\xb0\xe7\xc3\x26\x59\x85\x28\x0c\x89\x33\x0d\x99\x6d\x58\x04\x21\x72\xa6\xcc\x76\xca\xe4\xcd\x77\x9f\x30\x1b\xcf\x25\xaf\x07\x5b\x8a\xec\xc9\xdc\x8f\x0d\xb5\xd7\x34\x84\xeb\x29\x79\xbb\x53\x76\xcb\x12\x31\xdc\xd7\x69\xff\xa0\xf1\x4a\xef\xec\x57\x36\x3c\xff\xbc\x53\xbf\x46\x4c\xfc\x8b\x61\xff\x60\xd4\x4a\x86\xd9\xfd\xf3\xff\xfc\x64\x44\x41\x00\xc2\x1f\x17\xfb\x2a\x5e\x86\x3d\xdc\x65\xf1\x55\x9e\x78\xce\xbd\xc2\xc6\x6e\xa1\x6d\x1b\x75\x17\x0d\xda\xd6\x8e\x4f\x98\x12\xcc\x8d\xbd\x11\x3e\x09\x4e\x06\x20\x70\x71\xc6\xe8\x13\x74\x88\xa5\xd7\xf6\xc4\x6a\xde\x47\x6d\x8a\x2d\xd6\xdd\x31\x32\xee\x0c\x9b\x05\xe4\xd6\x08\xf3\xda\xce\x58\x0d\xff\xa8\x9d\x47\x88\xfb\xed\x7c\x35\xc8\x9d\xdd\x27\xee\x82\x4c\xbc\x29\x79\x63\x48\x3b\xaa\x7e\x62\x20\x8a\x2d\x77\x3c\x41\xc1\xcb\x7a\xed\xd7\x7b\xfa\xe1\xe8\x45\x6f\x11\x31\xbb\x32\xd0\x9c\x92\xf0\xb2\x0e\x7c\x82\x78\x4e\xc4\x89\xb6\xab\x64\x1c\xd7\x88\x1e\x26\xe3\xb8\x28\xfe\xf5\x18\xb7\xa7\xc5\xdb\x85\x98\xba\x15\xdd\xb1\x15\xae\x47\xad\x8a\x3d\x02\x78\xa4\xec\x8a\x46\xfc\x1b\x99\xda\x0e\x82\x39\xf1\xef\x87\x32\x3d\x7c\xb1\x3a\x7d\x45\x4b\x38\xb1\x1d\xfb\xca\x8c\xe2\x66\x2d\xf8\x77\x56\x55\x31\xef\x8c\x3d\x55\x79\xa8\x8a\x8a\x7f\xff\xa3\xea\xa8\x18\xe6\xe3\xf5\xcf\x2d\xd4\x5d\xa7\x9d\x21\xed\x7b\xf2\x5f\x97\x03\xef\x64\xb9\xf7\x61\x27\x8f\x3f\x43\xdb\xb9\x79\xb8\x3a\x49\xc5\x77\xd4\x1b\xe7\x0e\xb8\x8a\x9e\x52\x5e\xbd\x6b\x0e\x91\x6b\x91\x8b\x85\x7d\x9c\x9c\xf8\x63\xbb\xc7\x73\xf5\x71\xed\xfc\x71\x8a\xfe\xcd\xfc\x18\x1e\x5e\x5f\x22\x27\x5c\xf9\x24\x98\x4f\x2e\x66\xf7\x70\xe5\x90\x37\xeb\xb9\xe3\x23\xd6\xc7\xf9\x3c\x7b\x6e\xf1\x28\xa9\x67\x4f\x9c\xbf\xde\x45\xdc\xfe\x4b\xb7\xd8\xdb\x8b\x5c\x22\xe2\x3e\xb7\x3b\x7b\xc2\xfd\x08\x51\x99\x6d\x65\x4d\x3d\xff\x8d\xc5\x50\x26\xa3\xb6\xd4\x37\x38\xbb\x0d\x19\xbc\x1b\xaf\x50\x69\x6a\x8d\x16\x53\xa8\xb4\xaa\xc7\x45\xc5\x8e\xaa\xb7\xb5\x26\xf3\xf5\x4b\x2e\xd5\xa8\xf5\xf3\x05\x9d\x4f\x17\x40\xb6\x52\x87\xa9\x9e\x9e\x2d\x57\x32\x7a\xb6\xd8\xae\xd4\xda\x7c\xbe\x0f\x06\xe5\x6c\x33\x5f\xad\xb4\xd3\x5a\x55\x6d\x76\xa5\x7a\x5a\xaa\xf6\xf8\xfc\x97\x6f\x8c\xb2\xbb\xa4\xfd\x7f\x65\x96\xfd\xc6\xf0\xdf\x18\xf6\xdb\x8e\x65\xe6\xcb\x97\x6f\xcc\x17\xb5\xae\xaa\xaa\xfa\xf3\xe7\x97\xe8\x06\xff\x72\xef\xf8\xf7\x8f\x1f\x6f\x59\x98\xe6\x41\x3d\xcb\xe7\xdb\x9a\xc0\xab\xe5\x5e\x3b\xdb\xce\x03\xb5\x5f\x54\x7b\xbd\x5c\xaf\xd7\xe1\x3b\xf9\x5e\xbf\xdf\x10\xb5\x7e\x4f\x6b\xd5\x4a\x99\xde\xa0\xa9\x76\x45\xa9\x57\x85\x5f\xbe\x31\x1c\x7b\xb8\xbe\x31\xb2\x20\x2b\x0a\x80\x82\xf2\x5b\x6c\xec\x95\x72\x62\xa3\x02\xab\x95\x82\x56\x4b\x97\x2b\xd9\x94\x04\x78\x15\x02\x71\x20\xd4\x2a\x99\x66\x43\xcf\x75\x4b\x52\x2e\xa5\xa7\xcb\x75\xbd\x90\xad\xc2\xa6\xa4\xf5\xbb\x9d\x76\x8c\xc5\x13\x13\x85\xdb\x26\x0a\x17\x4d\xbc\xe2\x38\xe7\x0b\x6e\x4f\xf8\xe0\xf5\x65\xb4\xf7\x3a\xe2\xe9\x52\xda\x81\x47\x11\x60\x45\xa6\x02\x10\x09\x11\x65\xcc\x19\xbc\x64\x08\x86\xac\x50\x1e\x20\x2a\x00\x8e\x33\x24\x41\x54\x10\x0f\x29\xa2\x1c\x64\x01\xc2\xac\x21\xf0\x86\x08\x80\xc1\x4a\x06\x51\x94\x2d\x55\xec\x93\xd7\x16\x43\x90\x78\xc4\x13\xc0\x53\xca\x43\x19\xb1\x92\xc1\x12\x89\xa5\x98\xa3\x22\x06\x9c\x6c\x72\x14\x99\x98\x67\x0d\xd1\x34\x59\xd9\x04\x00\x0b\x92\x24\xf0\x82\x22\x8b\x32\xc7\x0b\x88\x13\xb7\xbe\x17\xf5\xd4\x17\xf5\x3f\xf6\x4a\xf5\x4a\x36\x5c\x27\xd7\xcd\x52\x4a\xca\xb8\x19\x25\xcf\xb3\xab\x51\x2a\x11\xb0\x56\x18\x2c\x0b\xcb\x0d\xd7\xc3\xcd\x6e\x1f\xa5\x8a\x28\x6b\x6d\xe5\xb5\x0a\xd4\xd1\x66\xca\xd7\xdf\x44\x1e\xa8\x3d\x0e\x46\x62\xa9\xf1\xbf\xa1\x21\x1f\x7a\x7d\x39\x8b\xf5\x2b\x8e\xca\xc9\xa2\x01\x0c\x43\x64\x45\x84\xa1\xcc\xcb\x10\x99\x32\x11\x09\xa7\xf0\x94\x12\x53\x20\x98\xe3\x0c\x96\x72\x1c\xc0\x1c\x04\xb2\x2c\x4b\x82\xc2\xb1\x12\x67\x72\x86\x28\x48\x82\xc1\x6f\x9d\xec\x23\x9c\x5d\x54\x0c\x9e\xe7\x45\x42\x78\x08\xa0\x04\x25\x19\x71\x12\x67\x42\x68\xca\x92\x24\x63\x48\x01\x54\x04\x6a\x20\xa8\x20\x24\x63\x20\xb2\x40\x46\x80\x10\x51\x82\x82\x81\x29\x30\x8c\x2f\x51\xbe\xe3\x04\x41\x11\x24\x45\x62\xf9\xbd\xc7\xa6\xf9\xda\x60\xc4\x55\xe6\x82\xc7\x1a\x45\xa9\x0b\xdd\x75\x75\xd1\x5e\xe5\x40\x67\xea\x8d\x13\x8b\xac\x5a\x0d\xd3\x5c\x89\x2f\x4b\x29\x49\x1c\xcc\x85\xbc\x62\xe6\x31\x3b\x53\x83\xc1\x48\xa9\x8b\x7d\x79\x5d\x28\x98\xe2\x3c\x1c\xd3\x64\xba\x9a\xd0\x9d\x24\x5b\x32\x02\xea\x6f\x6a\xed\x88\xe1\x5e\xad\x53\xae\x44\x1e\x55\x38\xfc\xd9\xa5\xb7\xe0\xf8\xef\xa5\x5a\xab\xef\x7d\xa7\xc6\xd6\x46\x4d\xd0\xa0\xd2\x30\x90\x57\x9d\x42\xca\xe2\x2d\x79\x55\x5a\xcc\xaa\xd5\xa4\x9b\xb4\x92\xbd\xa5\x55\x6b\x24\xf3\x29\x69\x46\x94\x69\x60\x17\xe7\x70\x5c\xc9\x37\xa0\xd7\xcb\x6b\xad\x02\x86\x5c\xad\x52\xec\x49\xd3\xe2\xcc\x63\x79\x15\x7a\x09\xc1\x6d\x18\x60\x33\x5f\x46\xaa\x2e\x78\x74\xa6\x70\xc9\x2b\x5e\x3c\x3a\xc3\x16\x7f\xa3\xef\xfd\x9e\xeb\x4e\x8f\x56\x08\x25\x8a\xc2\x12\x81\x13\x08\x51\x10\x35\x15\x2c\x49\x26\xa7\x40\xce\xc0\x92\x6c\x88\x2c\x00\x3c\x85\xd4\xe0\x89\x24\x11\x99\x17\xa8\x44\x15\x28\x40\xc0\x9a\x12\x22\xb2\x19\x79\xe3\x47\x44\x85\xc2\x62\x16\x03\x6a\x88\x8a\x60\x48\x84\x05\x86\x60\xf2\x98\x48\x32\x47\x24\x24\xcb\x40\x31\x39\xd9\xe0\x31\x34\x25\x0e\x6c\x8d\xe1\x25\xca\xcb\x58\x41\x8a\xc2\xcb\x22\xab\x88\xe0\xcb\x37\x06\xc4\x3c\x1a\xbc\x78\xf4\x6a\xe8\x57\xa5\x7e\xce\x6f\x5b\x5e\x33\x18\x39\x70\xa0\x27\xa5\xac\xd4\xc8\x2d\xe5\x46\xad\x51\x87\x76\xbe\xdb\x48\xad\x96\xc6\xa0\xd7\x5d\x0f\xb0\xbe\xc2\xa9\x4e\xd3\xae\xb9\x81\xaf\x8a\x8e\x66\xa6\x79\xd8\x11\xd6\xe5\x64\xb5\xc6\x25\x95\xee\x64\x36\xe9\xe4\x6d\xb2\x69\x34\x76\x0c\x47\x1e\xbd\x3c\x32\xae\xeb\xa5\x9a\x51\xf6\x46\xf9\x44\xa3\x91\x68\x35\x53\x99\x52\x2e\x95\x0c\xe7\x34\xcf\x3b\x3a\xc7\x9b\x66\x3a\xef\x73\x45\x97\x97\xd6\xb5\x74\x9d\xad\xd4\x24\xd4\x09\x13\xaa\xd4\x4b\x03\xd7\x22\xc4\xb3\x84\x65\x3f\x08\x5b\x79\x2d\x19\xcc\x8b\xc9\x52\xc5\x99\x8e\xbd\x7e\xb1\x1f\xe1\x97\x2f\x78\xac\x16\x5c\xea\xf5\xff\x02\x8f\x35\x44\x22\x0b\x14\xcb\x32\x6f\x98\x00\x43\x2c\x49\x0a\x0f\xa0\xc9\x51\x4e\x34\xa1\xc2\xca\x3c\x21\xbc\x24\xf1\x9c\x88\x38\xaa\x50\x19\x73\xc4\x14\x24\x4e\xe4\x24\x01\x00\x49\x80\x46\xe4\x6d\x1f\xe0\xf5\x54\x42\x22\xcf\x63\x19\x11\x96\x9a\x2c\x00\xa6\x24\x40\x81\xb2\x0a\x2f\x0b\x0a\x82\x1c\x67\x18\xd4\xe0\x91\xac\x40\xcc\x62\x96\x50\x4e\x26\x90\x40\x13\x8a\x88\xca\xb2\x02\xc8\xd6\xeb\x61\xcc\x63\xe1\x8b\xc7\x0a\x52\xc2\xa9\x0b\x8d\xde\xdc\x59\xac\x31\x96\x73\xed\x9c\x42\xf4\x7e\xa6\xbc\x68\x49\xba\x4b\xbd\x22\xa5\x42\xa3\x5d\x2e\x93\xf9\xa8\xa8\x26\xfb\x69\x12\x3a\xb5\xda\x06\xe0\x59\xb9\xdd\x0a\xd7\xb2\xd8\x92\xd1\xa2\x98\xce\x2f\x1a\xad\x7c\x46\x1b\xa4\xd4\xa6\xd3\xaf\xd4\x4a\x30\x62\x78\xeb\xb1\xd5\x18\xe3\x7a\x8e\x6b\x0f\xdc\xf4\x26\x8d\x9c\xbe\xce\xe2\xea\x82\x5d\x77\x9c\x95\x12\x14\x0b\xbd\x7a\x95\x9f\x24\x72\xbe\x92\x6a\xb9\xb5\x60\x58\x73\xc1\xd4\xd6\xfb\xbe\x95\x54\xcb\x32\x6e\xf7\x96\x63\xaf\x8b\xea\x8d\x79\x32\x98\xd9\x6d\xb6\x92\x59\xe4\xaa\xad\xf1\x2a\xe7\x43\xbb\x05\xa3\x1c\x5f\xbf\xe0\xb1\xb9\x8b\x53\x88\xff\x02\x8f\x15\xa0\xc0\x4b\xb2\x64\xb0\x12\x11\x28\x6b\x98\x00\x08\x8a\x00\x39\x56\x12\x4d\x83\xe5\x65\x9e\x97\x45\x02\x88\x2c\x42\x09\x0b\x98\xb0\x0a\xc5\x92\xcc\x72\x02\xc7\xf1\x22\x34\x04\xb8\x2d\x69\x3e\xc4\xeb\x65\x00\x08\x4b\x79\x53\x80\x80\x97\x59\x99\x43\x04\x60\xd9\x94\x58\x59\x86\x22\x07\x09\x12\x44\x53\x92\x4c\xc0\x22\x85\x63\x15\x80\x44\x2c\xb3\x3c\x34\x4d\x8a\x78\x08\xa1\xcc\x73\x5f\xa2\x12\xe4\xe0\xb1\xc2\x8b\xc7\x4a\x86\xd7\x53\xec\xf4\x22\xc3\x55\xb0\x50\x60\x97\x34\x1b\x34\xeb\xd6\x1c\xba\xe6\x10\x0d\x13\x74\xd4\x90\xb2\x66\x37\xcb\x95\x41\x47\xef\x89\xda\x34\xd3\x25\x99\x29\xb6\xaa\xb4\x5f\x2c\x8c\x69\x86\xef\x87\x96\x04\x93\x46\x16\xf8\x5a\x86\x4c\x2b\x99\x40\x9f\x5a\x79\xd2\x8f\x18\x8e\x3c\x36\xe6\x37\xe1\x2c\x23\x0d\x16\xb9\xcd\x58\x70\x16\x49\x35\x1c\x48\x2a\x0d\x52\xe3\x89\x9d\x2b\x77\xda\x61\x48\xda\x8b\xb9\x9e\xf0\x3b\x8b\x7e\x3a\x29\x66\x6a\x96\x1c\x74\x32\x25\xd5\x42\x50\x19\xe5\xd3\x85\xc6\xb0\x35\xeb\x04\x58\x2e\x97\xc6\xf5\xb1\x68\xf4\xd5\xf1\xa6\xe6\x8d\x1b\x85\x42\x84\xdf\xbe\xe0\xb1\x79\xf6\x52\xaf\xff\x17\x78\x2c\xe0\x05\x01\x03\xc3\x94\x29\x85\x80\x00\x51\x36\xa2\x81\xd9\x64\x05\x56\x91\xe0\x36\x3f\x2a\x12\x81\x86\x81\xa8\x28\xb2\x06\x34\x4d\x40\x05\x19\xb0\xa2\x80\x05\x41\x34\xe5\xc8\xdb\x3e\xc2\xeb\x59\x51\x86\x06\x4f\x15\x0c\x0c\x91\x17\x58\xc9\x34\x30\x52\x14\x51\x50\x04\x16\x23\x5e\x14\x89\x00\xa0\xc0\x0a\x3c\x2f\x00\x04\x0d\x89\x93\x39\x91\x87\x32\xde\x4a\xc8\x92\x02\xe8\x97\x6f\x8c\x18\xf3\x58\xf1\xc5\x63\xb9\x46\x93\xe4\x83\xbc\x40\xd3\x72\x99\x9b\xb4\xb5\xbc\xa1\xab\x5e\xc1\x33\x46\x62\xae\xa1\xf4\x48\x9a\x72\x50\xed\x68\xcd\x81\xde\xd1\x90\xd8\x9a\xb2\x12\xdf\x65\xb5\xf1\xbc\x2f\x26\x79\x6c\x26\x3c\x53\x41\xbd\x8e\x06\xda\x61\x62\x99\x1c\x29\x5a\xa1\xda\x9a\x35\x47\xbd\x58\x8e\xb5\x8e\x8c\x83\x8d\x32\x74\xd4\xe6\x54\x57\x42\xb5\xb3\x1a\x87\xab\x0c\xe8\x35\xab\x53\x60\x87\xab\xe6\x42\x73\xca\xa2\xda\x1e\x2f\x53\x4d\xa8\x35\xc6\xb9\xa1\xae\x0b\xac\xd4\x9f\xa4\xe4\x05\x72\xba\xdd\x4e\x06\x15\x1d\xa1\xd5\xa8\xb7\xed\xb6\xd8\x04\xb9\x54\x7f\x3c\x1a\x0c\x06\x43\xa1\x16\xcd\x0a\xfa\xff\x35\x1e\x7b\x65\x5d\xe2\xc2\x5b\x22\x4f\xac\x72\xbc\x7e\xc5\xe0\x19\xb0\x6b\xcf\xc0\x9f\xc3\x3c\x7f\x8c\xfd\x04\xda\x95\x87\xd0\x4f\x20\x5e\x79\x5c\xfc\xde\x35\xa2\xd8\x23\xe3\xe3\x42\x9b\x5a\x6e\x94\xea\xf9\x66\x53\xcf\xe8\xd9\x9e\xa4\xf7\x9b\xb9\x46\xba\x91\x29\xb4\xd4\x54\x35\x97\x2f\xd7\x6a\x9d\x4e\x59\xaa\x14\x0a\x20\x5f\x18\xb4\xc5\x46\xaf\x01\x1a\x15\xbd\x07\x4b\xbb\x3a\x77\xb7\x1a\x93\x1a\x77\xea\xb5\x52\x73\xe5\xeb\x54\x94\x9b\x15\xad\xdd\xf0\x1c\x55\x1f\xe5\xfb\x8a\x82\x82\x04\x97\xae\xb8\x0d\xc7\xf5\xc0\x68\xae\x77\x8e\xde\x17\x95\x85\xe9\xe8\x7f\xb7\x61\xa6\xd9\xd2\x98\x72\x4b\x0c\x9a\x5e\x7a\xe5\xd4\xb8\xcc\x74\xb4\x29\x58\xc3\xcd\x4c\xe4\x1b\x49\xb9\x20\xc1\xb9\x91\xac\x4f\xe7\xab\xc4\xa2\xac\xec\x56\x42\x4c\xa5\xbd\xe4\xa3\xef\x5b\x87\x3f\xa9\x08\x74\x79\xf8\x77\x46\x55\x95\x74\x2c\x8a\x53\x70\x3a\xcc\x2b\x8b\x5c\x69\xcc\x16\xad\xc0\x1f\x2f\xfb\xaa\x2b\x42\x58\xa9\x17\x56\x52\x37\x57\x17\x4b\xbc\x0e\x45\x5d\xd1\x06\x4d\xbe\x1f\xc1\x81\xe1\x18\x25\xc7\xd0\xe7\x38\x3a\xed\x02\x25\xe7\x9b\xa6\xd3\x6e\xfb\xbc\x5e\xe4\x07\xc4\x10\x5a\xaa\x35\x17\xc4\x6e\x67\x55\x13\xfb\x33\x69\x96\xac\x8c\xac\x19\x49\x25\x07\x56\xc3\x17\xec\xc9\x8c\x15\xb5\x7a\x27\x69\x07\x9d\x74\xbe\xbe\x94\xe6\x7e\x69\x94\x93\x7a\x33\x75\xf9\xf3\xe7\xf9\x68\xf1\xc1\x5d\x03\x9e\xea\x9a\xf2\x69\xd7\x64\x52\x13\x76\x91\x65\xb3\x9d\x52\x21\x41\xd6\x41\x66\xd6\x6f\x2c\x75\x63\xd8\x73\x0b\x1b\x19\x26\x7b\x49\x0e\x75\x67\x9d\x36\x29\x4a\x95\xac\xa6\x1e\xba\x06\x9c\x65\x9b\x77\x53\x9f\xae\xc9\x6e\xad\x9a\x30\x16\xed\xfa\xa2\x30\x50\x38\xca\x05\xdd\x4c\xe8\x5b\x2b\x8f\x1d\xb9\xd9\x6c\x39\x94\x96\x95\x56\x38\x08\x12\xad\xa4\x3e\x04\xd9\x12\x1a\x37\x9d\x99\xe6\x17\x5b\x2b\xa9\x97\x14\x7c\x97\x2e\xc7\x3d\xa8\x24\xe6\x23\x03\x07\x83\xb1\x86\x97\x13\xd9\x53\xeb\xbf\x9d\x7a\xf8\x14\xf5\xf5\x33\xea\xd5\x8c\x62\x15\x45\xbe\x2f\x27\x6b\x98\xf7\x56\x8d\x2a\xd0\x37\xd3\xda\x6a\x26\x8f\x0b\x44\xc9\x96\xcd\x72\x63\xac\xa5\x4a\x03\x8b\x95\x7d\xeb\x40\x3d\x7c\x96\xfa\x6a\x4d\x4a\x4c\x7a\x75\xd4\x93\x0b\x62\xaa\x3e\x99\x66\x4a\xb2\x61\xb9\xba\x58\x4e\xb2\xa0\x3c\x6b\x67\x52\xf5\x5e\x41\xa5\xc5\xd9\x50\x84\x78\xbe\x5e\x2a\x6e\x6e\xd1\x87\x29\x3d\xc7\x62\x43\x58\x8f\x93\xde\xb4\x01\x66\x48\xb4\x73\xf9\x6a\x77\xdc\x97\x94\x5a\xce\xca\xb9\x69\xeb\xb7\x53\x2f\x3c\x45\x7d\xfb\xdc\xeb\xa9\xd7\x1c\x57\x06\xb0\x3a\xe1\x55\x41\xb1\xc6\x76\x43\xae\x0d\x6c\x3e\xb3\x18\x29\x41\x8f\x04\xf5\x8a\x38\x66\xab\xcb\xb9\xa3\x62\xe1\x48\xbd\xf0\x2c\xf5\x41\x29\x59\x5c\xb0\xb8\xb0\x69\x2b\xcb\xc2\xc2\x5d\x76\x27\x95\x1a\x2b\x6a\x53\x90\x29\x23\x27\x5d\xaa\xf7\xa6\xf5\xc9\xb4\xd1\x97\xb8\x15\x48\x8d\x55\x6e\x3a\xef\xf4\x9b\x2d\xdd\x80\x89\x2a\x5e\x6e\x66\xf9\xa9\x97\xa8\x29\xee\xd0\x15\x58\xa1\x88\x46\x58\x69\xf4\xc6\x8b\x4e\xe6\xf7\x27\x1c\xf1\x29\xea\xfb\xe7\xd4\xfb\xd3\xaa\xdb\x5a\x0c\x8c\x7a\xb3\x29\x8c\xfc\xe4\x80\xdb\x88\xc3\x0d\x37\xc5\xed\x16\x6e\x02\x29\x93\xa8\xb1\x75\x4b\xa8\x4e\x4b\x15\x7a\xa4\x5e\x7c\x3a\xe1\xe0\x60\xde\x1b\xcd\x66\x8d\xe5\x14\x19\x4b\x02\x95\x6e\x39\x93\xc6\xdd\x0e\xeb\x07\xfa\xd2\x13\xbb\x9b\x49\xa7\x60\x90\xf1\x24\x6b\xd3\xb1\xa4\x34\x16\x1b\x93\x33\x69\xaa\x26\x07\xb8\xd8\x97\x3b\x09\x79\x8e\xa7\x20\x6f\xd5\x07\x22\x26\xa9\x45\xb2\x6c\x0a\x2b\x4d\xcb\xa8\x3b\xea\xaf\x0f\xec\x97\x5e\x82\x7a\x60\x60\x7f\x79\x11\xea\xd0\x99\x84\x57\x64\x28\x51\x91\x72\x32\x52\x00\xe4\x45\xd6\xe0\x0d\x05\xb0\x22\xcb\x2a\x14\x11\x20\x03\x81\xe5\x01\x47\xb0\xc8\x29\x2c\x91\x11\x96\x0d\x02\x10\x4f\x31\xc7\x29\xd0\x10\xc5\x78\xa7\x46\x59\x69\x97\xdb\x73\x8d\x8e\x2a\x4f\xf5\x5c\x10\x26\xfd\x55\x81\x6d\x34\x72\x76\x5f\x9d\x97\xf1\x08\x70\xb3\x8d\xd4\x2e\xf0\x38\x87\xc8\x88\x54\x61\xb8\x5b\x9c\xbe\xd5\xf8\xcb\x2f\x3d\xbd\xbb\xf1\xc7\x17\x9f\x0e\x8d\x9f\xa0\x20\x8c\x5e\xa9\xc6\xfb\x57\x1b\xcf\xae\x6d\x05\xf4\x74\x25\x76\x1e\x51\x17\xec\xd8\x87\x18\xf2\xcd\xa1\xbd\xd8\xdf\x3c\xb7\xe3\x7f\xa2\xa7\xe7\x9f\xf7\x1b\x1e\x7c\xfe\xce\x70\xbb\xe7\xe9\x9f\x03\xe2\x2f\x88\xff\xf9\x3b\xf3\x79\xc1\x71\x7f\x71\x7f\xb1\x9f\xf7\x37\xcc\xb9\xef\x13\x37\xd4\xa3\xa6\x7d\xfe\xce\x88\xa7\x9f\xa7\xa2\xb7\xde\x83\xcf\xdf\x99\xff\xfb\xe9\x45\xd1\xff\x7c\x8a\xab\x8d\x24\xb7\xc0\xac\x20\x9a\x78\xeb\x0f\xbc\x2c\x1a\x3c\x26\x1c\xa5\x80\x57\x0c\x9e\x87\xbc\xa0\x18\xb2\x20\x53\x05\x12\x93\xc3\xa6\xa9\x00\xca\x12\x56\xe0\x78\x83\xa7\xa2\xcc\x29\x00\xca\x8a\xc0\xed\x2d\x3a\xe0\xba\x64\x15\x7e\xfe\x7e\xa6\x6d\xd7\x98\x6d\xdb\x3f\x7f\x67\xd8\x93\x5b\xff\x7b\xf6\xfd\xc0\x45\xd3\xad\x5d\x12\x06\xa2\x81\x4d\xc5\x00\xa6\x60\x42\x05\x53\x5e\x30\x00\x56\x38\x05\x03\xd6\x10\x21\xc6\xa2\x04\x00\x0f\x78\x62\x2a\x00\x01\x60\xca\x1c\x52\x30\x92\x80\xa4\x20\x13\x98\x2c\xff\xf9\xd3\x05\x0d\x57\x38\x10\x88\x62\x88\x26\x55\x80\x09\xb0\x24\x01\xc8\x4a\x94\x35\x30\x90\x80\x40\x64\xcc\xf2\x08\x01\x64\x40\x22\x12\x11\x41\x53\xe4\x28\xcb\xf1\x22\xcb\xca\x04\x9a\x92\x49\x25\x83\xb2\xef\xe7\x80\xfb\xf6\xfa\x9e\x37\x0f\xa7\xf3\xf0\x63\xdb\x7e\x8b\xe1\x67\x1f\xea\xbe\x87\xe1\xa7\x75\xfd\x26\x2f\xfb\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x87\x83\x7f\x38\xf8\x8d\x1c\x44\xff\xf7\xff\x3e\xfd\xef\x3d\x45\xc3\xcb\x36\x69\xbb\x3d\x18\xce\xdb\xb0\x2b\x1a\x38\xf6\x1e\x24\x97\x84\x4b\xcf\x1f\x4f\x51\x10\x4c\x87\x3e\x0a\xc8\x05\xa4\x16\x09\x42\xa6\x99\xc9\x32\x95\x9d\x30\xf3\x83\x69\x92\x69\x48\x1c\x83\xf8\x0c\xcf\x72\xc2\x3d\x8a\xa8\xe7\x9b\x24\x30\xa7\x9e\xbb\xe5\x7e\x82\xe6\xae\x39\x3c\x57\x14\xed\x71\x70\x0f\xd8\xae\x64\xdb\xbf\x43\x1c\x5c\x6e\xff\xbe\x68\x0a\x6d\x27\xea\xce\x6f\xe7\x35\xd4\xb1\xef\x3f\x0f\xd1\xb6\x14\x8a\xb4\x7f\x8a\xf5\xf6\x67\x4a\xc8\x7d\x82\x0e\x5a\x85\xab\xc0\xde\xdc\x29\xee\x93\xa8\x70\x7b\x43\xf8\x3e\x57\xd8\xd6\xb1\x81\x39\x8d\x7e\x66\x7c\xe9\xfa\xf2\x52\xa1\xef\x1e\x8b\x0d\xb2\xed\xcc\x7a\x1c\xa0\x35\x48\x2c\xb4\x51\x23\xab\xa1\xa2\x95\x86\x2b\xbe\x46\xbb\x7e\x2d\xac\x8f\x06\xec\x60\x2a\x56\xa0\x64\x73\xc7\x35\xf1\x5c\xf4\x37\x51\xea\x37\x92\xc6\xca\x9e\x56\xd2\x7d\xbd\x24\x94\x73\x6a\x31\x31\xaf\x66\xda\xe9\x32\xe1\x86\xe3\xaa\x1d\xda\x89\xaa\x9d\x6c\xe4\xda\xa1\x73\x58\x11\x28\x0e\x9f\x5c\xa6\x79\x64\x45\x21\xa5\x4a\x9a\x36\x6c\x6a\xa8\x01\x5c\x5d\xcc\x79\xc9\x2c\x50\xcb\x24\x5d\x5c\x97\x97\x2d\x6d\xda\x91\xe7\xb9\x69\x52\x2b\x65\x7a\x29\x59\x55\x94\x32\xa9\xb0\xec\xa4\xe2\xac\xd2\xe5\x85\x39\x21\xb6\xb8\x36\xd3\x28\x95\x6f\x4c\x8b\xcd\x85\xd5\xcc\x2b\x6e\x5f\xaa\xaf\x96\x18\x71\xa9\x83\x3d\xe9\xfe\x93\x8f\x25\x53\x8f\x2c\x83\xd5\xab\xab\x54\xa1\x3d\xcc\x8d\xb1\xb0\x4e\x0c\x67\xb5\x15\x5e\x66\xf2\x96\x6d\x8e\xca\xda\xaa\xd4\xa1\xfa\x70\x46\x57\x69\x8b\x5b\x52\xb5\x46\x5b\xf9\x11\xae\x14\x5b\x83\xa0\x3e\xd2\x41\xb1\xe7\xcd\x03\x57\x75\xac\x06\x8b\x9a\x6d\x1f\x6a\xc3\xe4\x80\xaf\xb2\x65\x33\xdf\x0d\xeb\xf5\xc8\x9c\x11\x87\x4c\xb3\x30\xe1\xbb\x1d\x99\x1f\x78\xfd\x42\xb5\xe7\xe4\xad\xa1\x49\x24\xb0\x9c\x39\x21\x0f\x55\x5a\xed\x04\x72\x61\x54\x5d\x74\x93\xd5\x65\x3e\x9d\x83\x9b\x0d\x54\x73\x24\xc5\xf5\x1d\xa5\xb0\x4c\x39\xc3\x52\x6d\xdd\x2f\xf9\x8e\x96\x4f\x36\x13\x1d\xd4\x6e\x00\x77\xb7\x56\xf7\x84\xbf\x59\x87\xfe\x5f\x3e\xfb\x18\x38\xba\xc8\xfb\xfc\xb7\xae\xba\x86\x3e\x81\xe2\x6c\x6c\x96\xba\x8e\x9c\x9f\xd7\x3a\x23\x75\xe9\x76\x26\xb8\x24\xa5\xe5\x52\x75\x12\x08\x9d\x66\x0e\x4c\x8b\x8d\xbe\x2b\x54\x93\x6d\x43\x06\x95\x5e\x7e\xd9\x4a\xea\xf9\x66\xb7\x96\xa5\x0b\xdd\x45\x78\x05\xb5\x1c\x71\x7b\x96\x91\xdc\xe4\xab\x66\x23\xa5\x46\xcf\x9d\x52\x9d\x6c\x11\x92\x25\x9d\xc8\xfa\x72\xd3\xed\xd4\xeb\x38\x08\xd2\x96\x3d\x9c\xd7\xbc\x41\x9e\xc3\xb0\x98\xec\x59\xa9\x76\xa3\x38\x0e\xdb\xb1\x07\x53\xc7\x15\xb6\x87\xfc\x47\xbd\xbd\xcc\x78\xe5\x87\x7c\x4f\x3c\x91\xbc\xfa\xbb\xa9\xf7\xae\xde\x9d\xfc\x76\xea\x38\x04\x1a\x40\x91\x89\x01\x11\x91\x15\x49\x10\x01\x2f\x88\x10\x98\x08\xf3\x9c\xa9\x40\xc2\x01\x83\x9a\xac\x04\x0d\xc0\x03\x42\x64\x40\x38\xc8\x19\x54\x62\x39\x24\x60\x85\x85\x94\x7b\x79\x0b\xf7\x24\x3b\x96\x8f\xec\xee\x28\xb6\x93\x29\x56\x67\x8b\xb9\x75\x38\x5c\x56\xb8\x49\x9f\x45\xeb\xa9\xc7\x29\x95\xfc\x6a\xa1\xa7\xd7\x55\x21\x4c\x69\x66\xba\xb3\x58\x66\x95\x25\xb0\x42\xbf\xea\x0e\xd4\x3b\xae\xab\x6f\x73\x47\xbd\x9b\x7e\x46\x7f\x3f\x99\x30\xcf\xf0\xee\xd4\xff\x7a\xfd\xff\x32\xef\x54\x91\x4c\x44\x29\x32\x64\x93\x13\x59\x1e\x20\x20\xc9\x32\xe4\x44\xc1\x34\x58\x03\x50\xca\x21\xc4\x63\x44\x21\xcb\xb2\x94\x50\xa8\x60\x9e\x23\xd4\x94\xa1\x84\xb1\x41\x0d\x82\x76\xbc\xf3\xaf\x79\xff\x9b\xda\xfd\x51\xbc\xcb\xb1\x47\x6a\x17\xdf\x67\x7e\x92\x77\x03\x43\x59\xc4\x06\xc6\x2c\x8f\xa1\xc8\xca\x9c\x24\x4a\x9c\x09\x91\x80\x24\xa2\x60\x91\xc8\xa2\x60\x22\x5e\x31\x0d\xc8\x11\x91\xc7\x12\x42\x54\x62\x11\x4f\x09\x11\x0c\x20\x62\xb2\x7f\x47\xf7\x26\xef\xe9\xb9\x07\xbc\x10\x0a\xb3\x74\x4d\x5b\x4d\xeb\x49\xe0\xe5\x2b\x89\x0d\x27\x35\xd6\x76\xc0\x4d\x68\x39\xdb\x77\xea\x5d\xcb\x9f\x37\x13\xad\x48\xbe\xd8\x4e\x27\xf6\x8d\x3a\xcf\xb6\xf7\xf3\x9e\x79\x4e\x7f\xd5\x7c\x4c\xff\xbd\xbc\xcb\x82\x44\xb1\x4c\x29\x4f\x31\x05\x98\x87\x48\x94\x64\xce\x54\x84\x6d\x1e\xe1\x11\xe1\x58\x16\x9b\xbc\xc4\x09\x32\x07\x29\x2f\x10\x89\x97\x79\x83\x27\x82\x28\x41\x49\x31\x45\x01\xed\xdf\x34\x7d\xcd\xfb\x07\xb6\x3b\x36\x2a\xdc\xcf\xbb\xf6\x9c\xfe\x32\x7c\x4c\xff\xbd\xbc\x03\x8e\xf2\x1c\x8b\x45\x48\x4d\x82\xa1\x80\x00\x24\x48\x04\x2c\x55\x20\x84\x00\x60\x22\x50\x00\x14\x03\x40\x99\x35\x25\x0c\x28\xa5\x0a\x4f\x79\x03\x40\x5e\xa4\x86\x29\x28\x70\xff\xbe\xe4\x6b\xde\x3f\xb0\xdd\x85\x47\x78\xcf\x3e\xa7\x5f\x6f\x3f\xa6\xff\xf6\xe8\x7f\xf1\xd7\xbb\xef\x1f\xa8\x7f\xf7\x28\x9d\xd3\xe5\x7c\x7d\x51\x1f\x1b\x25\x3e\xaf\x82\x6e\x67\xd4\xf0\x4b\xce\xa8\xc7\xb2\x34\x27\x07\x7a\x41\x72\x58\xad\xb1\x2c\x76\x93\x6a\x2f\x7a\xb7\x24\x36\x1a\x9f\xb3\xf4\x8a\xb5\xd0\xb0\x7a\x0d\x51\x93\xbc\x8c\xce\xea\xf5\xc4\xb2\xdf\x4c\x2b\x9b\xde\xa2\xd7\x69\x81\x95\x5d\xb3\xfb\xf3\xa6\xc1\x65\x16\x4e\x5d\x27\x72\xd4\x75\x1d\x75\x11\xff\xa1\x55\x6a\x37\x1a\x44\x9d\xdc\x1f\xd5\xcd\x5a\x8b\xcf\x09\xc3\x99\x9b\x72\xac\x5c\x8e\x58\x4a\x51\x9e\x40\x93\xd3\xdc\xf6\x64\x35\x9e\x68\x93\xbc\x12\xcc\x06\x3e\xab\x48\x5c\x56\xac\xea\x5d\x4a\x92\x0e\x1c\x4f\xb3\x61\x21\x11\x14\x58\x9b\x9b\xe9\x76\x28\xa8\x6c\x71\xdd\x75\x8d\x61\x5f\xef\x0a\x5e\x66\x5b\xc7\xf1\x1b\xa7\x1a\x96\xc4\x22\xee\x96\x27\x83\xcc\x3a\x2c\x98\x93\xaa\x26\x25\x55\xac\x97\x47\x92\x57\x1b\xd6\x0d\x65\x99\x9b\xf0\xf5\xd6\xea\xf8\xfb\x84\x1b\x1c\x1c\x3d\xe3\xe4\x29\x6e\x4c\x76\xf7\x03\x08\xf5\xef\x1b\x1d\xd5\x0f\x18\x9d\xb3\xad\x6e\x2a\x78\x42\xbf\x7a\xa6\x3f\xcd\xcd\x53\x38\xef\xb5\xe6\x56\x79\x51\x0f\x33\x52\x6a\x58\xd0\x41\x85\x28\xb8\x53\xa3\xb9\x42\xa2\x68\x0b\xc5\x45\xbb\x9a\x18\xa8\xa1\x14\xf1\xf7\xcc\x28\x79\x29\x5b\xfe\xee\x29\xd9\xe3\x41\x96\x3e\xb3\xfe\x95\xc3\xf9\xb3\x8a\xa8\x93\x2a\xb2\x46\xab\x32\x6a\xd7\x14\x31\xb5\xa1\x81\x42\x58\xd3\xf3\x2b\x83\xde\x26\xd5\x2d\x8e\xb3\x5e\x49\x1a\x2f\xc6\x11\x73\x37\x82\x2c\xe5\x94\xa6\x4d\x6b\xe1\x2f\x4b\x55\x9e\xed\xa5\xab\xb4\x4f\x7b\x41\x4e\xd3\xda\xe1\xb2\x8f\x90\x46\x67\xcd\xb9\xb8\x76\x8a\xce\x24\xe3\xa0\x44\xa1\x27\x16\xa4\x82\x65\x19\xed\x41\xd9\x33\xeb\x78\xa0\xc0\x42\x59\xa5\x25\x5c\x57\x2b\xb3\x9e\x51\xa8\x4a\xeb\x60\x49\x48\x39\xbd\x0d\x84\x44\x6f\xbd\x48\xf8\xa3\x54\x3f\x5d\x1d\x91\x42\xbd\xdb\xd3\xd3\x9b\xe4\x6a\x66\xf3\x8b\xba\x9a\x49\x28\x45\x76\x28\xc9\xc3\x3c\x30\x12\x09\xef\x60\xd8\xdf\x1f\x64\xcf\x3a\xf9\x93\x41\x36\x93\x92\xad\x8c\xf9\x91\x41\xf6\x6f\x9c\x8a\xde\x15\x64\x1f\x3c\xff\x2e\x89\x23\x62\x83\x91\xe3\x15\xe4\x56\x6e\x92\x49\x12\xcb\x04\x52\xad\x17\xe6\x4b\xa5\x4d\xb7\x23\x2f\x3b\xf6\x20\x85\xd2\x73\x41\x17\x22\xcf\x18\x1c\x49\xbd\x31\x92\x45\x2f\x49\xa5\x3a\x9d\xca\x7e\x8e\xf3\x8e\x4c\x05\x92\x87\xeb\x88\x97\x3b\xe8\xaf\xa7\x94\xb1\x53\xea\xf2\x33\xb0\x90\xea\x74\x2d\xd7\xca\x64\xac\x19\x5c\xab\x55\x10\xec\xd5\x6c\x5c\x60\x53\x9e\xd5\xf3\xab\xa1\x64\x55\x39\x91\xaf\x1b\xe3\x21\x8f\x9b\xad\x36\x25\x19\x6f\x61\xb2\x35\x15\xd1\x61\xa6\xb7\x0a\x87\x1d\x75\x12\xe8\xf3\xd1\x24\xe5\xac\x47\x29\xb5\x1f\x05\xc5\xa2\x3d\x0c\x17\x58\x0d\x1b\x96\xd5\x1b\xac\x56\xa5\xae\x2b\x62\xc3\x1b\x98\xde\x74\xcd\xe6\x1d\xbd\x37\x5b\x98\x25\x3d\x21\x18\x95\xf0\xe8\x5f\x97\x03\xae\x7f\xda\xa9\x27\x01\x17\x71\xb7\x9b\x73\xc7\x7e\x36\xf8\x40\x42\x1a\xb9\xc7\xbe\xb8\x72\x5d\xa9\x3f\x4f\x02\xfe\x43\xf4\x5f\x49\x36\xf7\xe8\xff\x2d\x35\xc8\xeb\xeb\xdf\x56\xfb\xbd\xb7\x06\x52\x8f\xfa\xeb\x8f\xe8\xcf\x76\xda\xec\x1e\x5c\xef\xc2\x2c\x4b\x86\x55\x51\x5d\x2b\x69\xb6\x16\xe4\x34\x6b\x61\x72\x12\xc7\xb5\x15\xb9\x3f\x82\x8e\x3e\x76\x94\xba\x24\x8c\xd3\x60\x11\xeb\x8a\x63\xc0\x2d\xcf\xf9\xbb\x2b\x21\x7d\x70\x61\xfa\x78\x42\xba\x31\xea\x3f\x91\x90\x22\x52\x26\x75\xfd\xe4\x75\xd9\x58\x42\xca\xf6\x2a\xfd\x3a\xe7\x56\x64\xcd\x69\x8c\x17\x65\x13\xf3\x94\x74\x2d\x53\xf5\x0b\xab\x06\x9d\x98\x43\x69\x33\x9f\x9a\xad\x6c\x7a\xbc\x91\xfd\x54\x31\xbb\xf4\x0c\x0b\x6e\x12\xc3\x00\xb6\x1d\x17\xb4\xf4\xae\x2e\x54\x26\x3e\xd7\xa4\x4a\xba\x26\x17\x4d\x2b\xd7\x0b\x32\x4d\xab\x1e\x25\x8d\x61\x2f\xd9\x4f\xae\x93\xb4\xd6\x6c\x3a\x24\xb5\xee\xf4\x06\xea\x0c\xd6\x33\x66\x71\xd5\x4d\xb5\xd6\x3d\xb7\x94\x0e\xe6\x1d\xb7\x21\xac\x26\x6f\xcd\x00\xee\x4b\x48\x71\xaf\x7d\x24\x21\x54\x8f\x7d\x91\x3a\xe2\xc7\xaf\xdb\x09\xe1\x03\xf5\xa7\x1f\xd1\xff\x6a\x51\xe4\x3f\x2e\x20\xd5\xd3\x45\x93\xbf\xc5\xbe\xe8\x8a\x4d\x73\xde\x9d\x30\x3e\x78\x45\xe5\xf1\x84\x91\xb9\xe8\x04\xd1\xf5\x6c\xc2\x38\xbf\x62\x09\x23\xb7\x0c\x66\xe5\xc2\x66\xe9\x37\x0a\x05\xdc\xcf\xf5\x9a\x1b\x6b\xed\x88\x99\xb6\x51\xce\xfb\x6d\x9f\x24\x8a\x1d\xae\xd0\x0d\x2a\xbe\x5d\xf0\x1c\xdc\x07\x9b\xdc\x9c\x0e\xc2\x74\xba\x23\x28\x6a\xa6\xa8\xac\x39\x51\xa8\x75\xb4\x6c\x27\xe8\x41\x41\x22\x70\xc4\x96\x93\x8d\xee\x92\x8d\x82\xba\x4c\x0b\x75\x6e\x9c\xac\x72\x59\x8f\x15\x9d\x72\x6d\xa2\xd5\x37\x60\x22\x6f\x9c\x4d\x53\x5d\x29\xb5\x64\xa2\x29\xfb\x95\xb4\x21\xad\x06\xc7\xc8\x78\x2a\x61\xc4\x02\xec\x81\x80\xb5\xb9\x63\x5f\x3c\x14\xb0\x1f\xa8\x3f\xf3\x90\xfe\xe8\x7f\x63\xab\x79\xff\x71\x01\xa9\x9e\x26\xe4\x77\xc6\x8a\xda\xe9\xb4\xf6\xfb\x5c\xbc\x77\x5d\xea\xa3\xfd\xe3\xb1\xfe\xf9\x68\xfd\xaf\xae\x8b\xfa\x6f\xad\x70\xde\xd8\x4f\xef\xbd\xcb\x9c\x67\x7b\xea\xbd\xe4\xd7\xf8\x3a\xe5\x6e\x6b\x9d\x63\xfc\x5e\x48\xd0\xd7\x51\x0e\x0b\x31\xbb\x0d\x79\x5e\xa1\x5c\x3d\x03\xe4\xf5\xd1\x48\x87\xb3\x4f\x5e\xf6\xdd\x7b\xa3\x99\xf1\x33\x9a\xa2\x93\x99\x62\x88\xd1\x4b\x29\x6a\x26\x73\xe1\xb4\x82\x83\x42\xa6\xd6\x28\x94\xd5\x46\x9f\x29\x69\x7d\xe6\xeb\x61\x23\xd7\x6f\x87\x53\x42\xae\x9e\xd9\x71\x76\x5a\xd4\x47\x19\x1e\xdc\xb0\x3a\xb8\x65\xf2\xa5\x33\x14\x8e\x07\x64\x3d\x6d\x9e\x81\xdc\x4b\x96\xbd\x28\x38\x35\x6a\xb7\x6d\xf3\xed\x03\x16\x6e\x9e\x0c\xf6\xb4\xb9\x27\xe0\x97\x0c\xbf\xa1\x9d\x69\x57\x0a\xf5\xb6\xc6\x1c\xf7\x72\x7c\x57\x4b\x3e\x86\xef\x77\x36\xe0\x75\x1f\x1c\xcf\x9c\xb8\x72\x5e\xc2\xc9\x79\x72\x4f\xdb\xbb\x03\xbb\x64\x68\x4c\xcd\xa9\x85\xfb\x5d\xfc\x2f\xef\xde\x1f\x3f\x3c\xef\x69\xe3\x22\xac\x4b\xb6\x1d\x95\x9c\x9a\x66\x4f\xbf\x45\x7b\xfa\xdf\xdc\xad\xfe\xc2\xa1\x81\xcf\x5b\x1a\x83\xbc\x68\xf0\xb9\xca\x4b\x9d\x7e\x65\x4b\xfb\x93\xa3\x13\x3f\xc2\xd2\x60\x6e\x5c\xb1\xf1\x45\xcd\xa9\x75\xd1\x6e\xf8\x37\xf6\xb7\x7f\x75\x5e\xe4\xd3\x46\x1e\x01\x2f\x19\x7a\xa6\xee\xae\x1c\x16\xfb\x59\xe2\xf9\xa9\x99\x4f\x5b\x7b\x04\xbc\x64\xed\x99\xba\x53\x6b\x5f\x76\x89\xbf\xb1\x0b\xfb\xab\xd3\x43\x9f\xb7\xf7\x00\x78\xd1\xde\x53\x75\xa7\xf6\x1e\x36\x72\xbf\xb1\x41\xfb\xab\x63\x54\x9f\x36\xf8\x08\x78\xc9\xe0\x33\x75\x57\xa7\x06\xbb\x0d\xda\xbf\x1d\x77\x5f\xbf\xb9\x03\xf7\x85\x63\x66\x9f\x6f\x47\x0c\xf2\x62\x4b\xce\x55\x5e\xca\x12\x01\x99\x7d\x7b\xd9\x72\xfa\xfa\xee\xd8\xe7\xc7\xef\x7e\x80\xed\x37\x0d\x7f\xca\xea\xb3\x29\xea\xa5\x43\x89\x9f\xb6\xff\x14\xf4\x52\x23\x2e\xa8\xbd\xda\x92\xf8\xce\xd5\xd7\xa6\x9a\x87\x03\x9b\xf7\xb6\x47\xc7\x3b\xdf\xb7\xa7\xf6\xee\x24\xe8\x33\x1c\xa6\x5a\x39\xce\x62\xdb\xcd\x42\x25\xc7\x18\xa1\x4f\x08\xf3\xb2\x81\xfe\x1f\x4c\x37\xaf\x35\x34\x26\xbe\xa1\xfe\x71\x97\xe4\xd7\x13\xcd\xd3\x33\xa8\x1f\xb5\xf2\x14\x66\x6b\xe4\x7e\x9e\x72\x62\x62\xfc\x54\xa5\x6f\xf1\x33\x94\xbe\xed\xce\x36\x7a\x65\xdd\xf1\x20\xed\x47\x0d\x3b\x20\x6c\x6d\x3a\x06\xc6\x89\x59\xd7\xa7\x8a\x27\x47\x7e\x3f\x63\xc2\x0b\xc8\xce\x8a\x58\x82\xb9\xd3\x90\x93\x53\xca\x1f\x35\x24\x0e\xb2\x35\xe4\x74\x22\x7c\xa7\x25\x27\x27\xab\x3f\x6a\x49\x1c\x64\x6b\x49\x6c\xf3\x87\xfb\xcd\x38\x39\x0d\xfe\x09\x4b\xe2\x38\x7b\x63\x5e\x66\x09\xa7\xc6\xc4\x4f\x4e\xb9\x95\xbe\x9e\xb3\xe8\x1c\x68\x6b\xd2\x59\x6e\x7c\x93\xa3\x9a\x17\x84\x96\x4f\x9a\x75\x9d\x79\xf9\xf1\x0e\x83\xe7\xce\x94\x31\x3d\x67\x3a\x21\x21\x89\xd4\xfe\xff\x00\x00\x00\xff\xff\x39\x45\x2a\xc6\x31\x81\x00\x00") - -func change_trustCoreSqlBytes() ([]byte, error) { - return bindataRead( - _change_trustCoreSql, - "change_trust-core.sql", - ) -} - -func change_trustCoreSql() (*asset, error) { - bytes, err := change_trustCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "change_trust-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb8, 0xd6, 0xff, 0xe6, 0xf4, 0x97, 0x9d, 0x9b, 0x9a, 0xdd, 0x6e, 0x91, 0xe8, 0xcd, 0xd9, 0x21, 0xb, 0xf9, 0x76, 0x49, 0xb5, 0x6d, 0xb5, 0xf0, 0xed, 0xf6, 0x3d, 0x1b, 0x86, 0xe3, 0x10, 0xc0}} - return a, nil -} - -var _change_trustHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x69\x8f\xe2\xc8\x92\xdf\xe7\x57\x58\xad\x91\xaa\x5b\x55\xdd\x38\x7d\xbb\x67\xfb\x49\x06\xcc\x55\xdc\x37\x8c\x46\xc8\x47\x1a\x5c\x80\x4d\xd9\xe6\xaa\xa7\xfd\xef\x2b\x1f\x80\x31\xbe\x38\xba\x67\x9e\xde\x5a\x33\xad\xc2\x8e\x8c\x2b\x23\x32\x22\x23\xd3\xce\xaf\x5f\x7f\xfb\xfa\x15\x69\xea\xa6\x35\x35\x60\xa7\x55\x45\x64\xc1\x12\x44\xc1\x84\x88\xbc\x5e\xae\x7e\xfb\xfa\xf5\x37\xfb\x79\x7e\xbd\x5c\x41\x19\x51\x0c\x7d\x79\x02\xd8\x40\xc3\x54\x75\x0d\x61\xbf\x51\xdf\x80\x0f\x4a\xdc\x23\xab\xe9\xc4\x6e\x1e\x00\xf9\xad\xc3\x77\x11\xd3\x12\x2c\xb8\x84\x9a\x35\xb1\xd4\x25\xd4\xd7\x16\xf2\x03\x41\xff\x70\x1e\x2d\x74\x69\x7e\x79\x57\x5a\xa8\x36\x34\xd4\x24\x5d\x56\xb5\x29\xf2\x03\x79\xea\x75\x0b\xcc\xd3\x1f\x07\x74\x9a\x2c\x18\xf2\x44\xd2\x35\x45\x37\x96\xaa\x36\x9d\x98\x96\xa1\x6a\x53\x13\xf9\x81\xe8\x9a\x87\x63\x06\xa5\xf9\x44\x59\x6b\x92\xa5\xea\xda\x44\xd4\x65\x15\xda\xcf\x15\x61\x61\xc2\x33\x32\x4b\x55\x9b\x2c\xa1\x69\x0a\x53\x07\x60\x2b\x18\x9a\xaa\x4d\xff\xf0\x78\x87\x82\x21\xcd\x26\x2b\xc1\x9a\x21\x3f\x90\xd5\x5a\x5c\xa8\xd2\x8b\x2d\xac\x24\x58\xc2\x42\xb7\xc1\xb8\x6a\x97\x6f\x23\x5d\x2e\x5b\xe5\x91\x72\x01\xe1\x87\xe5\x4e\xb7\x83\x34\xea\xd5\x91\x07\xff\x6d\xa6\x9a\x96\x6e\xec\x27\x96\x21\xc8\xd0\x44\xf2\xed\x46\x13\xc9\x35\xea\x9d\x6e\x9b\x2b\xd7\xbb\xbe\x46\xe7\x80\x13\x49\x5f\x6b\x16\x34\x26\x82\x69\x42\x6b\xa2\xca\x13\x65\x0e\xf7\x7f\xfc\x0a\x82\x92\xf3\xd7\xaf\x20\x69\xdb\xd5\xaf\x13\xd0\xa5\x76\xbd\x74\x2e\x83\xb6\x21\xc7\x11\xf3\x41\x9d\x90\x3b\xe0\xe5\x7a\x9e\x1f\xfa\x20\x3d\xb4\x0e\x57\x13\xa8\x28\x50\xb2\xcc\x89\xb8\x9f\xe8\x86\x0c\x8d\x89\xa8\xeb\xf3\xf8\x86\xaa\x26\xc3\xdd\xc4\x27\x9c\x66\x0a\x8e\xa1\x9b\x13\x5d\x9b\xa8\xf2\x35\xad\xf5\x15\x34\x84\x63\x5b\x6b\xbf\x82\x77\xb4\x3e\x71\x72\x17\x17\xd7\xb5\x5d\x40\x79\x0a\x0d\xa7\xa1\x09\xdf\xd7\x50\x93\xae\x12\xc1\xd7\x7c\x65\xc0\x8d\xaa\xaf\x4d\xef\xde\x64\x26\x98\xb3\x1b\x51\xdd\x8f\x41\x5d\xae\x74\xc3\x76\x47\x6f\x4c\xbd\x15\xcd\xad\xba\x94\x16\xba\x09\xe5\x89\x60\x5d\xd3\xfe\x60\xcc\x37\x98\x92\xe7\x97\x37\x30\xed\x6f\x29\xc8\xb2\x01\x4d\x33\xbe\xf9\xcc\x32\x64\x27\xee\x4c\x16\xba\x3e\x5f\xaf\x52\x40\xaf\x92\x58\x72\xa1\x04\xd5\xb8\x12\xf1\x61\xd0\x4d\xdd\xc0\x1e\x27\x14\x05\x1a\xe9\x40\x0f\xe8\x6f\x68\xe2\xa9\x35\x5d\x23\x67\x68\xbd\x82\x88\x7f\x28\x4e\x6a\xb1\xb2\x1b\xcc\xac\xc4\x1e\x30\xcf\x06\x20\x71\x9f\x68\x46\xb3\xa3\xa7\xa7\x01\xd6\x5d\x3e\xf4\x44\x40\xd5\xb4\x26\xd6\x6e\xb2\x4a\x46\x69\x43\xea\xab\xb4\x90\x30\x2d\xd8\x21\x94\xc4\x03\x8b\x07\x77\x4f\x04\x4b\x1e\xc5\xc4\x7d\xba\xce\x74\x63\xa4\xad\x6d\xd3\x5c\x27\x51\x3e\x02\x4b\xba\x0c\xaf\xcc\x0b\x8e\x66\xb0\x12\x0c\x4b\x95\xd4\x95\xa0\xc5\x06\xef\xa4\xa6\x93\xd5\x95\xb9\xc9\x31\xa2\x5d\xcb\x41\x78\xc3\xab\xe9\x3b\xca\x4b\x43\xcf\x05\xfc\xe9\xf8\xdd\xce\xb4\x7b\xd2\xfb\xd3\x8e\x0f\x87\xd4\xcf\x31\x86\x49\x4a\x0e\xa6\xba\xb1\x9a\x2c\xd5\xa9\x97\x30\xc4\xb0\x10\x80\x4c\x2d\xe3\xf5\xf9\x5e\x1c\xe6\xb4\xc6\xe9\xb6\xce\x35\xaa\xbd\x5a\x1d\x51\x65\x97\x72\x9e\x2f\x70\xbd\x6a\x37\x25\xee\x08\xa3\x7b\x00\x66\xaf\xbb\xe3\x31\x39\xbf\xd2\x8b\x7f\x88\xd2\x1d\xbe\xd5\xe3\xeb\xb9\x1b\x74\x66\xe7\xd9\x26\x7c\xbf\x9a\xf2\x19\x92\xd4\xad\x65\x98\x12\xf6\x94\xcd\xa6\x96\x30\xc2\xeb\xaf\x91\x2f\x1c\x45\xba\xb6\x5e\xde\x97\x0e\xd8\x4b\xf2\x52\xcb\xe6\x8d\x00\xd7\xc8\xe2\x36\x49\x09\xeb\xa5\x7f\xe9\xf9\x39\xe4\x8b\x69\x38\x0a\x8c\x21\xf1\xc0\xbe\x21\xc1\x03\xe4\x8a\xc5\x36\x5f\xe4\xba\x21\xc0\x4b\xd5\x9e\x71\xa8\x12\xfc\xac\xad\x97\xd0\x50\xa5\x3f\xff\xfa\x92\xa2\x95\xb0\xbb\xa1\xd5\x42\x30\xad\xcf\x82\xb6\x87\x0b\xa7\x14\x93\xa2\x85\xa2\x1a\xa1\x4d\x0a\xbd\x7a\xae\x5b\x6e\xd4\x63\xe4\x99\x08\xd3\xe9\x89\xbb\x17\xe4\x82\xd1\x18\x1c\x07\xe9\xee\xc0\x61\xcb\xea\x34\x3f\x31\xff\x82\x5c\x23\x88\x23\x7a\x0a\x0c\xfc\xb0\xcb\xd7\x3b\x01\x14\x8b\xd5\xd4\x7c\x5f\x1c\x6c\x31\x57\xe2\x6b\xdc\x05\x85\x3f\x7e\x73\xab\x70\x75\x61\x09\xbf\x1f\xee\x21\xdd\xfd\x0a\x7e\xf7\x9a\xfc\x81\x74\xa4\x19\x5c\x0a\xdf\x91\xaf\x7f\x20\x8d\xad\x06\x8d\xef\xc8\x57\xa7\x38\x97\x6b\xf3\x76\x7f\x79\x98\x0f\xf8\x7e\x3b\xc3\x78\xfe\xd0\x43\x9c\x6b\xd4\x6a\x7c\xbd\x1b\x83\xd9\x05\x40\x1a\xf5\x73\x04\x48\xb9\x83\x3c\x1d\xca\x6e\x87\x7b\xa6\x83\xe4\x29\x48\xf9\x20\xbe\x47\xf3\xa8\xa1\x44\x79\xce\x74\x59\x6f\x74\x03\xfa\x44\x06\xe5\x6e\xe9\xc8\x96\xbf\xfe\x76\x46\xfe\x84\x25\xc0\xc8\x35\xc2\x5f\x20\x71\x14\xd0\xac\x66\x56\xd3\x4e\xab\x8a\xac\x0c\x5d\x82\xf2\xda\x10\x16\xc8\x42\xd0\xa6\x6b\x61\x0a\x1d\x35\xa4\xac\x17\xfa\xd9\x4d\x36\x34\x8f\xfd\x83\xad\x9e\xf8\x3f\xf4\x6d\x98\x2e\x8f\x96\x9d\x88\x1f\x69\xf3\xdd\x5e\xbb\xde\xf1\xdd\xfb\x0d\x41\x10\xa4\xca\xd5\x8b\x3d\xae\xc8\x23\x8e\xf4\xb5\x5a\xcf\x1d\xef\x3a\xdd\x76\x39\xd7\x75\x20\xb8\x0e\xf2\xfb\xe4\x77\xa4\xc3\x57\xf9\x5c\x17\xf9\x1d\xd8\xbf\x82\xbd\x91\xe8\x88\xf7\x49\x97\x84\xfe\x61\xc2\x61\x61\xc2\xa5\x19\xa9\xee\x93\x2f\x05\x85\xa3\x88\xc7\x5b\x37\x49\xf8\xf9\x37\x04\xc9\x71\x1d\x1e\x19\x94\xf8\x3a\xf2\x3b\xf8\x13\xfc\x95\xf9\x1d\xfc\x89\xfd\xf5\xaf\xdf\x31\xe7\x6f\xec\x4f\xec\x2f\xa4\xeb\x3e\x44\xf8\x6a\x87\xb7\x95\xc2\xd7\xf3\x5f\x42\x35\x93\x22\x0e\xdc\xa9\x99\x64\x0a\x3f\x5b\x33\xff\x73\x8b\x66\x2e\x63\xaa\xa7\x87\x63\x1c\x4e\xa7\x88\x53\xd8\xbe\xc0\xe8\x70\x8c\x20\x1d\x5b\x57\xc8\x8f\xd3\x08\xf0\xe2\xde\xee\x8e\x9a\x3c\xf2\xc3\xef\x11\x5f\xc2\xbc\xf6\xa1\x3c\x06\x11\x06\x58\x3c\xb8\x71\x7a\x0e\x43\x53\xa0\x7b\xb9\x0c\x43\x1a\xe0\xf4\xcc\x21\xcf\xd9\x3d\x59\xd9\x25\xb7\x61\x69\xde\xdd\xdc\x86\x20\x0d\x72\xeb\x77\x92\x58\x6e\xed\xc8\x25\x43\x45\x58\x2f\xac\x89\x25\x88\x0b\x68\xae\x04\x09\x22\x3f\x90\xa7\xa7\x3f\xce\x9f\x6e\x55\x6b\x36\xd1\x55\xd9\xb7\x94\x76\x26\xab\x3f\xff\xf5\x44\x74\x1c\x2c\x9d\x78\xae\x2f\xfa\x27\xdf\xae\x44\xaa\x8c\x88\xea\x54\xd5\x2c\x27\x31\xa8\xf7\xaa\x55\x57\x1c\x61\x69\xa7\xf1\x88\x34\x13\x0c\x41\xb2\xa0\x81\x6c\x04\x63\xaf\x6a\xd3\x00\x98\xb6\x5e\x1e\x53\x7e\x44\xd5\x2c\x38\x85\x46\x00\x44\x59\x08\x53\x13\x31\x97\xc2\x62\x71\x49\xc6\xd2\x97\x8b\x4b\x22\x9f\x31\x92\xfc\x72\x84\xbc\xec\xf6\xe0\xbc\xe1\x56\x75\x04\xab\x1d\x47\x95\x58\x70\x77\xa1\x90\xd5\x6a\xa1\x3a\x35\x7b\xc4\x52\x97\xd0\xb4\x84\xe5\x0a\xb1\xfb\xcc\xf9\x89\x7c\xe8\x1a\xbc\x64\x34\x6a\x56\x74\xc8\x47\xbd\xe9\x54\x3a\x9e\x8f\x93\xaf\x08\xac\x9e\x19\x72\xed\xae\x9b\xd1\x01\xe7\x46\xb9\x9e\x6b\xf3\x4e\xfa\x95\x1d\x79\xb7\xea\x0d\xa4\x56\xae\xf7\xb9\x6a\x8f\x3f\xfe\xe6\x86\xa7\xdf\x39\x2e\x57\xe2\x11\x90\x24\xcc\xcd\x6a\x0f\x22\xba\x30\x45\xaf\xe8\x81\x68\x70\x67\x6d\x84\xc5\xe7\xa7\x08\x89\x9f\xbe\x7f\x37\xe0\x54\x5a\x08\xa6\xf9\x25\xd8\x5d\xee\x5a\x45\x88\x6d\x51\xc4\x97\x98\x8e\x72\xe7\xc6\x77\x4b\xe6\x56\x74\x8e\x72\x85\x7b\xc6\xa9\x56\x17\xce\x66\x28\xb8\xa4\xcb\x61\xe0\x00\x0b\x07\x77\xcb\x7f\x21\x0d\x48\x2a\xce\xc3\xc2\xcb\x0b\x0f\x32\x5b\x3f\xce\x5f\x66\xb4\x71\x82\x20\x8d\x41\x9d\xcf\x23\xd9\x51\x82\x44\x6e\x85\x2e\x5e\xa0\x23\xae\xc0\xe3\x6f\xaa\x1c\xc5\xdb\xa1\xe6\x73\xaf\xd5\x79\x78\x3c\xb3\x0b\xf8\xcc\x24\x6a\xa4\xbf\x2c\x71\x45\x41\x7e\x72\x16\x3e\x3e\x45\x58\xb3\x63\xc7\xe1\x8f\x64\x68\x09\xea\xc2\x44\xde\x4c\x5d\x13\xa3\x8d\xed\x50\x28\xbb\x57\x0f\x1e\x1e\x4f\x0f\x87\x75\xeb\x08\xde\x7c\x8b\xc9\xa9\xbc\x30\x6c\x1d\x3b\xbc\xa1\xa7\x16\x5f\x65\xd4\xe9\x88\x23\x1f\x87\x51\x0e\x0d\x50\x38\x75\x44\x3a\xf8\xe3\x62\x72\x20\x30\xe9\x6b\xeb\x14\x9b\x82\x6d\x0c\x28\x58\x89\x8d\x5c\xd8\xf5\x4a\x4e\x0d\x7b\x34\x1d\xef\x67\x60\x9d\xfd\x42\x16\x70\x91\x0f\x58\xc2\x62\x22\xe9\xaa\x66\x86\xdb\xa0\x02\xe1\x64\xa5\xeb\x8b\xf0\xa7\xce\xca\xa7\x02\xa3\xfa\xda\x79\x6c\x40\x13\x1a\x9b\x28\x10\x3b\x0f\xb5\x76\x13\x27\x4d\x52\x3f\xa2\xa0\x56\x86\x6e\xe9\x92\xbe\x88\x94\x2b\xd8\x47\x07\x63\x81\x82\x0c\x0d\x27\xbd\x70\xef\x9b\x6b\x49\x82\xa6\xa9\xac\x17\x93\x48\x43\xf1\x04\x17\xd4\x05\x94\xa3\xa1\xa2\xdd\x2a\xa2\x76\x7d\xaf\x97\x45\xac\x87\x24\xc4\xbc\xf4\xa3\x4d\xf2\xf8\x75\xad\xc8\x8f\x0d\x63\xb1\x34\x7e\x55\x58\xbb\x4a\xd0\x3b\xc3\x5c\x2c\xad\xcb\xb0\x17\x0e\x1e\x13\x06\x7d\x2b\x3b\x0f\xb3\xcd\xa4\x69\xce\xf9\xae\xaa\x88\xa9\x90\x9d\xf9\x4b\xae\x28\x4e\x04\xbc\x33\x00\x7a\x9e\xaf\xaf\x0d\xe9\xb8\x4d\x23\x22\xf4\x1c\x86\x93\xa7\xa7\xef\xdf\xa3\xa7\x62\xd1\x7e\xe0\x2d\xac\xdd\xab\x4e\x6f\x2f\xe0\xe7\x87\xe6\x0b\xde\x90\x78\x4b\xf4\x72\xf6\xc2\x44\x92\x0d\xec\x44\x8c\x03\xf2\x36\x47\xc6\x81\xb8\xf3\xe0\x50\x80\xcb\x3d\x9d\x09\x70\xb1\xe4\x8e\x50\x31\x14\x1d\x96\x54\x73\x62\xc2\xc5\x02\x1a\x88\xa8\xeb\x0b\x28\x68\x87\x98\xa4\x4a\x70\xa2\x9d\xc5\x5f\xf7\xde\x79\x4c\x3e\xed\x26\x9a\x04\xa2\xf5\xd9\x7e\xa6\xe0\x43\xdf\x32\x7d\xe8\xce\x4f\x87\xeb\x89\xb3\x37\x18\xc9\x95\xf8\xdc\x2b\xf2\xf9\xb3\x5f\x83\xff\x42\xd0\x2f\x5f\x92\x50\x85\x35\x3f\x28\xed\x7f\x2e\xf4\x98\x02\xdf\x99\x4e\x03\xe8\x03\x0a\x77\x18\x8c\x75\xa5\xf0\x15\xee\x07\x38\x57\xf8\x9e\x85\x94\x91\x34\xcd\x10\x76\x4f\x2c\x4d\xda\x1f\xf0\x98\x68\x9a\x40\xe5\x57\xc5\xd3\x2b\x85\xbd\x33\xa2\x26\x50\xbb\x8c\xa9\x51\x0d\x62\xa2\xea\xd9\x9e\x90\x07\xda\xea\xc1\x3e\xfd\x2c\xa5\x9e\x44\x79\x63\x7f\xc2\xd4\x2c\x6d\xe0\x8d\x8f\xa1\xa1\xb0\x27\xd2\xa1\xfe\x62\xcf\x02\xa2\xa7\x11\x51\x13\xb4\xbf\x65\x8a\x65\xed\x26\x50\xdb\xc0\x85\xbe\x82\x61\x65\x4b\x6b\x67\x4f\x78\xd6\x0b\x2b\xe2\xe1\x12\x5a\x42\xc4\x23\x7b\xaa\x15\xf5\xd8\x54\xa7\x9a\x60\xad\x0d\x18\x56\x61\x63\xa9\x2f\x7f\xfe\x75\xca\x5d\xfe\xfd\xbf\x61\xd9\xcb\x9f\x7f\x05\x75\x0e\x97\x7a\x44\x31\xec\x84\x4b\xd3\x35\x18\x9b\x0b\x9d\x70\x5d\xa2\xf1\x24\x53\x97\x70\x22\xea\x6b\x4d\x76\x2a\xd6\x8c\x21\x68\x53\x18\x9c\x8d\x9d\x87\x56\x5b\x13\x36\xb6\x29\x94\x93\xa7\x5b\x5e\xed\x4f\x95\x0f\xde\x76\xd8\xc2\x95\x66\x88\x70\xdd\xcd\xd9\x2f\x97\xb0\x3b\xac\xc3\x77\x63\xea\xa4\xfe\x8a\x94\xbf\x4a\x7a\xdd\x3c\xe2\x71\x42\xa4\xdc\x3c\x17\x2b\x54\xec\xfc\x23\x8d\x90\x91\x91\xf6\x61\x62\xa6\xde\x7f\x18\x2b\x68\x42\x58\x08\x17\x35\x2f\x58\x02\xa2\xe8\x46\xc2\x6a\x11\x92\xe7\xba\x5c\x82\x78\x11\x28\xe3\x56\x5d\xd2\xa0\x2d\xd7\x3b\x7c\xbb\x8b\x94\xeb\xdd\xc6\xc5\xca\x8b\x13\xa0\x3b\xc8\xe7\x27\x30\x51\x35\xd5\x52\x85\xc5\xc4\xdd\x05\xf3\xcd\x7c\x5f\x3c\xbd\x20\x4f\x18\x0a\xd8\xaf\x28\xf5\x15\xc5\x11\xc0\x7c\xc7\x98\xef\x04\xfd\x0d\xc5\x31\x82\xa5\x9e\x51\xec\xe9\xcb\x1f\xe9\xb0\x63\x13\xf7\xed\x86\x33\xad\x8a\xfb\x89\xa5\xab\x72\x3c\x25\x96\x22\xe9\x6b\x28\xe1\x93\xb5\x09\x8f\x51\x66\xa2\x6a\x17\x6f\x54\xc4\xd2\x23\x08\x94\x60\xae\xa1\x47\x4c\x04\x59\x9e\x04\xeb\x52\xb1\x34\x48\x82\xc4\xb1\x6b\x68\x90\x13\x37\xa6\x1d\xb2\x6b\x67\x3d\x33\x96\x04\x85\xa3\xd8\x55\x62\x50\x07\x12\xde\x08\x96\x82\x04\x43\x00\xf2\x1a\x12\xf4\x64\xa9\xcb\xaa\xb2\x4f\x2f\x05\x03\x28\xec\x2a\x12\xcc\x99\x14\xde\x36\xe6\x14\x74\x68\x82\xc2\xaf\xa3\x63\x77\xba\x30\x9d\x1a\x70\x2a\x58\xba\x11\x6f\x53\x2c\x0a\x50\xf6\x1a\xf4\xac\x83\xde\xad\x59\x4e\x76\xb2\x11\x8f\x1d\xa3\xc1\x55\x5d\x0d\x50\x07\xbd\xd7\x0b\xce\x4c\x35\x9e\x00\xc9\xd2\x57\x69\x07\x00\x3f\x81\xe3\xd4\xc7\x1e\x00\xe2\x09\xb1\x14\x7b\x9d\x24\xd8\x59\x47\x7b\x93\x4d\xf7\xc5\xd9\x38\x4a\x00\xa5\x49\xe2\xaa\x1e\x01\xb8\x2b\xce\x71\x8a\x1e\xdb\xe3\x00\x60\x34\x75\x9d\x24\xc4\x44\x51\x77\x87\x97\x08\xf4\xe5\x62\xa2\xa8\x70\x11\x3b\x34\x02\x40\x02\x70\xd5\x20\x0c\xc8\xc3\xda\xc9\xa1\xa6\xbd\x4b\x10\x83\xa2\xaf\x1b\xe6\x01\x35\x51\xb5\x29\x34\xad\xc9\x65\xd5\x3c\x81\x14\xcd\x32\xd7\xf5\x08\x7d\x16\xae\x9d\xe5\x09\x21\x3e\x98\x00\x0c\x45\x71\xc2\x23\x12\x11\x6b\x63\xd7\xda\xaf\x0d\xb6\x17\xeb\xed\x07\xee\xc1\x0b\xf2\x54\xcc\x0d\x5f\x8b\x54\xbb\x4e\x34\xea\x65\xbe\x99\xab\xd5\x0b\x59\x1a\xc7\x38\x02\xa7\xc6\x64\xb3\x9e\xef\xb4\xab\xc5\xc1\x2b\x5d\xcc\x56\x73\xb5\x56\xb5\x5c\x68\x10\x1d\x9a\x1f\x0d\xfa\xbd\xa0\x86\x22\x89\x60\x0e\x11\x0c\x6f\x15\xb0\x52\x8f\x27\x31\xae\x36\xec\x15\x7a\x25\x9c\x1b\x55\xb8\xe1\xb0\x38\x1c\xf6\xb1\x7e\x69\x38\x1a\xb5\x29\x7e\x34\xe4\xbb\xcd\xd7\xfc\x70\xdc\xe1\x06\x14\x3d\x6c\x10\xa9\x89\xe0\x36\x91\x6c\xbb\x39\x2a\x95\xab\x58\xae\x8c\x17\xea\x2d\x22\x3b\xac\x16\x6a\xf5\x7c\xb5\x50\xe9\xd5\x9b\x3d\xac\x34\xc2\xc7\xb5\x42\xa7\xd4\xa8\xf7\x72\x7c\x83\xeb\x0c\xe8\x56\x8e\x6e\x0c\xb1\xd2\xd3\xad\xdb\x36\xec\x2c\x2e\xa1\x1b\xbc\xad\x6e\xa7\x5d\xaa\xdf\x4c\x18\xbf\xa5\xe1\x05\xc1\x5f\x10\xcb\x58\xc3\x14\xc6\x71\xb9\x59\xe1\x9a\xf4\xee\x9a\x05\xf2\x87\x48\x7a\x36\x29\x79\x41\xc0\x8b\xbb\xcf\x29\x59\xd0\xb0\x05\xf2\x5b\x9d\xe0\xb0\x48\xee\xf3\x01\x0c\x10\x34\xc1\x10\x28\x49\xd3\x0e\x57\x98\xed\x17\xff\xfe\xb4\x50\x97\xaa\xf5\xe9\x3b\xf2\x09\xfd\x86\xba\xd7\xa7\x17\xe4\xd3\x69\x17\x86\xfd\xa8\xd7\xc9\x9f\x6e\xda\x93\x57\xfb\xa6\x64\x40\x59\xb5\x26\xc2\x62\x35\x13\xb4\xf5\x92\x38\x41\xb8\xbb\x31\x6c\x98\x5b\x3d\xe2\xd3\xff\x46\xf9\x44\x88\x60\x80\xb6\xc7\x33\x1a\xc7\x18\xe0\x0a\x86\x9d\x0b\x46\xa0\xe8\x7f\xae\x6c\x18\xc3\x10\x2c\x4a\xb2\x0c\xe9\xca\x86\x9e\xcb\xc6\x62\x18\x8e\xd3\x18\x8a\x53\x0c\xf9\x8d\xa0\x69\x92\x41\xe9\xff\x28\x19\xb1\x17\x84\x21\x19\x96\xc5\x19\x8a\x61\x1d\x11\x5d\x09\x4d\xcb\x9e\xbc\x68\xd3\x89\x28\x2c\x04\x4d\x72\x38\x06\xfe\x8e\x4c\x4d\x01\x3f\xa7\x80\x39\x43\xcf\xd3\xbf\x3f\xb9\x09\xcc\x05\xde\x0b\x3d\x69\x82\xa5\x6e\xe0\xcd\x12\xe1\x2f\x08\x70\x45\xda\x42\x75\x3a\xb3\x09\x82\x17\xe4\x93\xeb\xc9\x93\x39\xdc\xff\x32\x5b\x72\xb8\x22\x30\xda\x33\xa5\x9f\xa5\x67\x8f\xc2\x4f\xd7\x73\x40\xa2\x94\x7a\xbe\x2d\x0d\x70\xb9\x4a\x18\xbf\xc3\x36\xf6\xdc\x3a\x7e\x1f\x36\xf7\x1c\x84\xa5\x5e\x90\x27\x1c\x23\x49\x19\x17\x25\x46\x51\x08\x1c\xe2\x14\x23\x8a\x14\x4b\x8a\x12\x4a\xa2\x2c\x4d\x88\x14\x8a\xb3\x34\x24\x44\x51\x50\x28\x0a\x15\x09\x49\xc2\x15\x92\xc1\x51\x8a\x94\x49\x92\x92\x18\xd1\xce\xd4\x48\x82\xc4\x68\x86\x16\x51\x1a\x92\x0a\x2a\x4a\x38\x4e\xb2\x24\x01\x50\x9a\x92\x44\x14\x63\x30\x8c\xa1\x20\x0e\x19\x8a\xa0\x65\x52\x86\x28\xab\xc8\x34\x83\xda\xb9\x2f\x46\x11\x22\x49\x10\x4f\x8e\xdd\xa0\x81\x9c\x8f\xfa\x8e\x93\xdf\x51\x2a\x98\x0a\xba\xb7\xc9\x6f\x34\xc6\xe0\x80\x48\x7c\x8a\x91\x34\xc5\x32\x28\x4e\xd3\xd4\x0b\x02\xec\xff\xd1\x8b\xeb\x05\x21\xed\x7f\x80\xf7\xcf\xe1\x26\x38\xfe\x61\x07\x35\x8e\xe3\xb8\x1c\x68\x77\x60\xc9\x2c\x91\x4a\x8e\xa9\x81\x45\x8f\x2f\x89\x55\x4e\x2f\xeb\xe2\x1b\x55\x6c\xb3\x43\x98\x53\x00\xc1\xf5\xf9\xce\xb8\xda\xe7\x05\xaa\xbb\x42\x69\x6c\x80\xf2\xf3\xf5\x88\xca\x60\xb2\xf4\xac\x4b\xac\x30\xec\xf3\x78\xcf\x7a\xde\x66\xde\x58\xbe\xdc\xe8\xbe\x77\xde\x86\x84\x8d\x9a\x1b\x36\xfb\xb5\xc6\x94\x3b\x5e\xf8\x07\x3b\x5b\x72\x9d\x55\x95\xb5\xb8\xfe\x6e\x6e\xed\xf2\xf8\xb0\xd3\x58\xe1\xaa\xb5\xeb\x6c\xf8\x65\x8d\xe2\x7a\xf3\x6d\xb6\x43\xf0\xed\x79\x71\x56\xad\x92\x28\x3d\x5a\x64\x99\x8d\xb0\x1c\x0c\xfa\x79\xa1\xb2\x24\xbb\xed\x56\x4f\xed\x51\x1d\xbc\x98\x1d\xcd\xdf\xc6\xe3\xf1\x8c\x6c\x6e\x6d\xcc\xa3\x3a\x51\x15\x3e\x56\x58\xeb\x44\x8c\x2b\xa1\x5c\xc8\x35\xe6\x86\x80\x68\x71\x5c\x1e\xad\x84\x3d\xfe\x47\x5f\x9e\x51\x45\xf8\x7d\xd0\x15\xc8\xc7\x98\xf1\x93\x48\x41\x86\x54\x64\x86\xc1\x44\x09\x97\x09\x99\xa6\x59\x0c\x27\x24\xa0\x00\x4a\x22\x58\x94\xc1\x20\xc4\x68\x1a\x03\x94\x00\x14\x56\x61\x64\x00\x25\x92\x06\x14\xa0\x49\x1c\xa7\x49\x42\x74\x73\x3b\x10\x6e\xd5\x91\xc6\x8e\xd3\x18\x01\x12\x9f\xba\xb9\x1a\x4e\x11\x0c\xfa\x00\x57\xa0\x45\x7d\xc8\xaa\xb9\x4d\x1e\xd4\x65\xb2\x8c\x6e\x95\x82\xd9\x69\x4d\xd7\x84\x26\xcd\x84\xd9\xb3\xf2\xd6\xa6\x0b\xd2\xa0\x00\x6a\x78\xbf\x3a\xa4\xf8\x55\x7e\x00\xf3\x2b\x79\xda\x50\x46\x95\xf2\x5c\xc9\x63\x23\x6b\x4a\x13\x19\xb1\x80\x1b\x7c\x1e\xae\xea\x79\xb3\xba\x9a\x96\xe0\xc8\xe9\x3a\xc7\x15\x7c\xd6\x69\xbd\xe7\xe9\xf1\xa6\xf8\x31\x27\x97\x9b\x0c\x67\x8d\x69\x4e\x31\xb3\xf3\x85\x5a\xac\xf5\x7b\x96\x05\x7b\x9b\x75\xf5\xd9\xe8\x6f\x46\xb9\x0c\x95\x6f\x4e\x19\xb3\x9f\x7f\xe5\xa6\x02\xc1\xbe\x95\x72\xe5\xf6\xac\xfb\xde\x37\x65\xa6\xf6\x3a\x6f\xcd\x29\x71\xc4\xcd\x3f\x9a\xfa\xbc\x5d\x2e\x3b\xf8\x7b\xff\x2d\xae\x00\xd2\xbb\x02\xf1\x18\x33\x7e\x62\xa1\x02\x59\x16\x85\x24\x20\x21\x64\x05\x45\x62\x65\x9a\x96\x00\x4b\x00\x51\xa6\x19\x3b\xb2\xe0\x98\x42\x28\x22\x06\x69\x1a\x32\x18\xa9\xd0\x0a\x4b\x90\x04\x8e\x4a\xb4\x00\x19\x89\x8d\x73\x85\xe8\x71\x9f\x4c\x78\xe4\xe6\xf5\x14\x0b\x18\x22\xc6\x09\x88\x94\x4e\x40\xd2\xcf\xcb\x16\xd9\x1e\xae\x97\x9b\xbd\x2c\x33\xc5\x5e\x91\x85\xd5\x51\xbe\xb6\xe9\xd2\x55\x4d\xd1\x2b\x8a\x42\xb6\x7b\xb5\x1a\x5c\xbf\x55\xb8\xcc\x28\x07\xad\x65\xb3\xf9\x81\xcb\xef\xb5\x5e\xd7\xda\x33\x54\x97\x11\x36\x95\x5c\x69\xd3\xee\x96\xf2\xfc\x38\xcb\x75\x96\xa3\x7a\xf3\xd5\x17\x0f\x7c\x9d\x58\x2d\x82\xde\x58\xcb\x7d\xe4\x84\xe5\xa8\x8a\xca\x8d\x0d\xba\xef\x2f\x77\xac\x59\x29\x0f\x5b\x0d\x6c\xf1\x5c\x34\xd8\x6c\x57\x6b\x9a\xb3\xa6\x86\xaf\xd4\xea\xc8\x98\x66\xb8\x1a\x23\xf7\x86\xdb\xb9\x3e\x10\x5a\xed\x75\xc6\x7c\x57\x7b\x68\x3d\xbf\x29\x36\xba\xf3\x5d\xd1\x20\xd4\x2e\xe1\xc4\x9b\x56\x88\x13\x14\x5b\x61\x86\xf4\xdf\xe3\x04\xf8\x63\x0c\xf8\x09\x30\x94\x88\x8b\x22\x85\x52\x82\x4c\x30\x18\x43\x08\x12\x03\x29\x08\x58\xcc\x4e\x3c\x49\x28\x03\x20\xa2\x0a\x00\xb8\x0c\x08\x9c\x61\x18\x9a\x64\x01\x4a\x03\x09\x88\x14\x49\x93\x22\x16\xe7\x04\x78\xa4\xa5\x53\x38\x81\x45\xc7\x83\xc3\x53\x6f\x1a\x08\x18\x86\x89\x71\x05\x3c\xa5\x2b\xec\x66\x46\x83\x1e\x15\x8d\xde\x54\xef\x98\x6f\x4b\x62\x5c\xcd\xd0\x05\xba\x5d\xdc\x32\xed\x66\xbb\x45\xa8\xa5\x41\x3b\xbb\xdb\x8a\xe3\xe1\x60\x3f\x96\xab\x3b\x39\xdb\xef\xa8\x4d\xcd\x34\x38\x6a\xc9\x4b\x39\x8c\xe8\x93\xfb\x5a\xa6\xd1\x04\x19\x76\xb0\x78\x5f\xf4\x4b\x2a\xfc\x68\xb7\xdd\xae\xb3\x5d\xa1\xbe\x3d\x75\x65\xb5\xfa\xda\x14\x6b\xfa\x5b\xe9\xb9\xdd\x7e\xee\x76\xb2\xf9\xd7\x62\x36\x63\xad\x95\x12\xb6\xac\x02\x4c\x92\x72\x25\x03\x54\x34\x8c\xde\x37\x73\x2d\xb4\xde\xa4\x85\xbe\xf5\xcc\xd1\xc3\x1c\xae\x4d\x21\xd4\xa7\xe4\x76\x64\x5a\xdd\x12\x9f\x31\xd7\x95\xcc\x6b\x7d\xb9\x9a\xeb\xa3\xca\xc8\xc1\x5f\x0b\x71\x05\xde\x0c\x33\xa7\xff\x1e\x57\xc0\x1e\x63\xc6\x4f\x14\x2e\xb3\x8c\x42\xe2\x14\x84\x14\x23\x03\x11\xa3\x45\x52\x64\x58\x05\xc3\x05\x85\xc4\x01\x10\x69\x92\x62\x05\x8c\x50\x04\x05\x10\x28\x2e\xc8\xa8\x48\x62\x22\x85\xe3\x22\x4a\x8b\x90\xb5\xdd\x09\x73\xfe\x0b\xb1\x6a\x2c\xd2\xd8\x69\x12\x05\xd1\x8e\x72\x78\xea\xce\xad\x09\x92\xc5\x62\x3c\x01\x4b\xe9\x09\x58\x73\xfc\x06\xea\x6b\x52\x47\xc5\x0a\x3d\x20\xb4\x7d\x63\xd3\xdb\x15\xf1\xfe\x4a\x9f\x3f\x6f\x0a\x5c\xc3\xca\x81\x57\xac\x46\x67\x69\x6a\xbc\x26\x4b\xac\x54\x92\xd1\x77\xce\x1c\xbf\xb1\x2d\x6a\xc4\xec\xcb\x65\x89\x5a\x5b\x73\x25\x93\x6b\x3c\x57\x97\x19\xf4\x55\x34\x15\xe3\xa3\xd9\x73\x7a\xce\xf1\x04\x67\xd0\x2e\x1f\xff\xe1\x1c\x63\x35\x4f\xbf\xb7\x5c\xb3\x35\x77\x7b\xba\x89\x36\xdf\x3a\x78\x5b\xa1\x67\x26\xb3\xeb\x97\xb3\x53\x6c\xca\xec\x5e\x37\xef\x8d\x46\x46\xcb\x4c\x33\xc3\xed\xb4\xd9\xce\x94\xb2\xf4\x3b\x64\x57\xa6\x5a\x59\x13\xf3\x7a\xa9\x4d\xe8\xc3\x12\xdf\x2d\xcb\x04\x68\xd6\x2b\x43\x7a\x55\x79\xd7\x51\x8c\x23\xf4\x67\x52\x6b\x8b\xf8\xc7\xda\xf1\x94\x72\x88\xa7\xe4\xcb\x61\xd6\xf6\x1f\xee\x29\x58\x7a\x4f\x01\x8f\xb1\x72\x67\x2f\xce\x61\x46\x0c\x58\x1a\xfd\x8a\x82\xaf\x28\x40\x50\xf4\xbb\xf3\x5f\xa4\x35\x33\x0c\x46\xd2\x89\x4f\x09\x8c\x25\x58\x8a\xc6\xd8\xb8\x09\x71\xb8\xa5\xbb\x2c\xfd\xdd\x9d\x12\x7d\x65\x87\xaf\x2a\xb1\xcf\xec\x3b\xaf\x59\x3a\xaf\xe5\xd9\x12\x86\xee\xde\xb2\xcf\x26\x3a\xb5\xcc\x6d\x79\xfb\x01\x86\x72\x67\x30\x12\xb2\x15\xa1\xe0\x38\x11\x1f\x62\xc4\xe1\xd7\xc1\x88\x39\x2e\x3b\xff\x05\x82\x3c\xf4\x3a\xcd\x84\x13\x6a\x4d\x29\xde\x76\xb9\xb5\xf4\x14\xb1\x89\x29\x72\x25\x21\xc2\xe3\x12\xd0\x60\xc1\xba\xfd\x6d\x68\xf0\x60\x89\xfc\x36\x34\x44\xa0\x66\x7b\x1b\x16\x32\x50\x69\xbe\x0d\x0b\x15\xa8\x6b\xde\x86\x85\x0e\xd4\x7b\x1f\xf3\x12\xd1\x43\x56\xc8\xe2\x77\xb8\xbd\x20\x74\xda\x95\xc1\x88\x57\x69\xee\x36\x7c\x9f\x95\xfa\x2d\xfd\xf4\x83\x72\xb2\x32\x2a\x66\xfd\xcc\x32\xd6\xa6\x05\xe1\x5d\xb5\xfd\x03\x1a\xdd\xb8\xab\x74\xfd\x8f\x58\x0d\xfa\x09\x4b\xf0\x21\xdd\x75\x3e\xa2\x1c\x7f\xa0\x61\xdd\x15\x5c\x15\xfc\xff\x1e\xfb\x5b\x7a\xec\x6c\xf0\x3e\xfe\x20\xc2\x7a\x2c\x6a\xad\xf3\xff\x7b\xee\xef\xe8\x39\x7f\xa4\x3b\xfe\xcd\xf8\x56\x16\x95\xb5\x26\x7b\xb2\xdc\xb8\x65\xc5\xd1\x8b\xbb\x71\xe4\xde\xce\x4d\xb1\xcc\x79\xe7\xde\x9a\x6b\xd4\xe6\x05\xe5\xe3\xdf\xc4\xcf\x55\xdb\xed\xc6\xfc\xf3\xd5\x96\x10\xe2\x43\x5e\xed\xbc\x63\x6f\xf7\x55\x6f\xb9\xdd\x9a\x46\x44\xee\x8e\x0f\xcd\xa0\xa9\xe8\x9c\x35\x11\x11\x16\x0c\x72\xb7\x22\xc2\x83\x63\xef\xad\x88\x88\xf3\xb1\x20\x2a\x77\x4d\xc4\x43\x9e\xe3\x89\xca\xa4\x13\xf1\x50\xe7\x4e\x76\x33\x3f\x74\xc0\x59\x1f\xf5\x1a\xe1\x43\xf2\xe9\xa4\x17\x29\xae\xc8\xa8\x23\x5f\xa3\x7b\x80\x33\xf8\x5f\x1b\x00\x0a\x06\x50\x99\x22\x14\x09\xca\x04\x29\xe0\x04\x14\x28\x1c\x55\x58\x82\x20\x70\x5c\x86\xa4\x82\xe3\xac\x88\x13\x0c\x2a\xd1\x32\xae\x28\x0a\x8b\x29\x98\x88\x13\x18\xa5\x88\x12\xc9\x12\x4f\x2f\x88\xbb\x87\xe5\xf6\x40\xe7\x2b\x24\x92\x87\x02\x4a\xf4\xaa\x2c\xc1\x44\x17\x6b\x0e\x4f\xcf\x7c\xda\xad\xbc\xbc\x52\x6f\x50\xc5\xdf\x96\x7a\x99\xe9\x16\x17\xf9\x0c\x9c\x4a\x38\xdd\x1c\x5a\xa5\xd7\xd7\x8f\x41\x9f\xd9\xf6\xd5\x71\x56\xc8\xad\xc9\x2a\x59\xe3\x9c\xca\x05\x77\xa8\x0c\xe6\x03\x85\x81\xec\xe9\x4f\x67\xe1\x35\xdb\xef\xd7\x79\xf7\x77\x0e\xac\xb3\x72\x49\xef\xae\xa7\xb5\x4d\xcb\xca\xd3\xd9\x59\xb9\x8a\xd7\x21\x2b\xf7\x9b\x4a\xb1\xfc\x5c\x51\xc9\xca\xa6\xd7\x78\x1e\x73\x16\xbd\x0d\xab\x39\x14\x8f\xf4\x5b\xc5\xad\xf9\x5e\x2b\x7f\x6c\x8d\x76\xb9\x2c\x8f\x8a\xc3\xce\xc7\x74\xbf\xa4\xf2\x3d\xb1\x56\x32\x7a\x06\x7c\xae\xf4\x41\x79\x60\xd6\x0d\xb5\xac\x2f\xe5\x11\xfe\x51\x5c\x2b\x63\x2b\x97\xeb\x93\x2c\x97\xaf\xb0\x7b\x40\x91\xcd\x3e\x5f\xe8\x9b\x43\x82\xa4\x21\xf1\x86\xd6\x32\xed\xc1\x16\xfd\xf1\xe4\xaf\x44\xf9\x97\xab\x4e\x7f\x16\x7d\x0c\x9d\xe0\x5b\xe7\xfa\xc8\xfa\x9a\x1a\xef\x75\xaa\x0a\x1b\xc2\xf4\x6d\x57\x13\x7a\x4d\x96\xca\x7e\x28\x26\x0b\x51\x49\x37\xea\xe3\xe1\x47\x76\x50\x99\x17\xf4\x57\x7a\xbe\x99\x3b\x42\xe7\xfa\xdc\x46\x05\x27\xfd\xe6\x02\xf4\xbd\x8b\x8f\x2a\xcc\x64\x1f\x4c\x3f\x7f\x13\x7d\xe7\xcf\xda\x09\xd0\x69\x9f\x5b\xeb\xb8\x6e\x11\xe4\x7b\xae\xc9\xef\x56\xad\x0c\xae\x97\xea\xcf\x1f\x80\x6e\xef\x55\x13\x2c\x94\x5a\x61\xb4\x6c\x0d\xa6\xc6\xba\xf3\xdc\x75\x1a\x15\xfa\x3d\xd4\x23\x5c\x1d\x10\x05\x14\xce\x1a\x14\xb7\x67\x73\x68\xd3\x2c\xf2\xd3\x8d\x04\x68\x00\x7a\x2c\x33\x7a\x23\x96\xd5\xf9\x92\x6d\xd1\xe4\x3c\x87\x6f\x02\xfc\x54\x7a\xb9\xe7\x56\x38\xcf\xe5\x13\xab\x57\xda\x3f\xd7\xef\x77\xbd\x75\x24\xce\x12\xa7\xc3\x36\xc5\xd3\x7a\xbe\x8a\x56\x5b\xcf\xdb\x51\x27\xc7\x7e\x0c\x37\xc3\x7e\x17\xdf\xa9\x4d\x75\xb4\xee\x88\x20\xbf\x59\xb6\xaa\x90\xe1\x7e\x82\x7d\xdc\xd6\x3f\x8f\xa6\x7f\x71\x85\xd2\x3f\xf9\x8b\x53\x29\xad\x05\x00\xaf\xb5\x0f\xbb\x6b\x6b\xc4\x09\x9f\xaf\x3f\xfd\x57\x64\x21\xd6\x21\x5d\xb8\x8f\x7e\xb5\x77\x1b\xfd\x1f\x8e\x2e\xfe\x2d\xe6\xf6\xfa\xf6\xad\x99\xb3\xf8\xe9\x0c\x4c\xc7\x72\xb5\x91\x7f\x15\xf5\x7a\xdb\xdc\x42\xab\x63\xd1\xc4\x62\xd8\x9b\x09\x5b\x6c\x5d\x56\xd5\x31\x78\x53\x6a\x02\xc9\x2e\xd1\x72\x65\xa8\xa1\x5c\x4d\xc3\xab\x43\x63\xce\xf6\x5a\xfd\xc1\x4e\x79\xd3\x2c\x5a\x6d\xb6\x3e\xd8\x82\x98\x6f\xfd\xf8\xe1\x64\xbb\xce\xcb\xb9\x87\xd2\xbf\xfb\xaf\x1d\x5c\x9d\x20\x92\x9c\x5f\xf8\xdf\x6b\x22\x69\x45\x66\x14\x05\x53\x64\x05\x97\x31\x42\xa0\x68\x06\x48\x2c\x49\xca\x2c\x8a\x09\x10\xa0\xa8\x2c\x61\x34\x20\x19\x40\x28\x18\x09\x69\x8c\xc1\x44\x0c\x92\x14\x4d\xd0\xac\x44\x91\xc2\xd3\x0b\x42\x3c\x2e\x0a\x12\x49\x51\x90\x24\x00\x19\xbd\x52\x7d\x78\x7a\x96\x90\xde\x1b\x05\x73\x81\xee\x7d\x60\x14\x5c\xb4\xaa\xa4\x1f\xb5\x2f\x0a\x16\x86\xf5\x51\x0b\x68\x75\x86\x5f\xb6\xe7\x9b\x9a\x24\x63\x0a\x1c\x4c\x25\xce\x28\xef\xda\xca\x42\x9a\xd1\x1f\xeb\x95\xd4\x2d\xe4\xe6\x1f\x8c\x91\xad\x14\xb6\xba\x38\x25\x3e\x9e\x67\x26\xd1\x5b\x6a\x78\xb7\x3a\xa8\x92\xf5\x85\x01\x3a\x0a\x9b\x6b\x32\x15\x69\x5a\x1c\x9a\xf9\xce\xb4\xf5\xb8\x28\xe8\x03\xba\x61\x94\x79\x6b\x70\x01\xaf\xba\x29\x0a\x3d\x84\xfe\x4d\x51\xd8\x37\xca\xf9\x46\xe9\x5f\x1d\x05\xb3\x99\xe3\xb5\x0d\xe3\x99\xe7\xfe\xb9\x51\xfa\x47\x58\xc4\xf0\x45\x9c\x5b\x46\xec\x86\x74\xc2\xc7\x73\x37\x44\x8c\x07\x46\xac\x6b\xe8\x7b\x11\xa3\x2f\x81\x59\x7e\x20\xe1\xdb\xce\xb8\xd8\x61\x76\x3b\x7c\xcc\x92\x42\x76\x9b\x33\xdf\x0a\x85\xe7\xfe\xbe\xb4\x69\x50\x8b\x5d\xad\xf7\xda\x6d\xee\x4d\x7e\x3e\xcc\xcd\xd6\xf9\xb7\x26\x55\xfc\x98\x75\x04\x45\xae\x59\xa3\xcd\x1c\x1b\x6c\xfa\x95\x0c\x5a\xce\x6c\x17\x7b\x6e\x0c\xb7\xf5\xd7\x2c\xf7\xe8\x88\x21\xca\x04\x43\xc9\xa2\x2c\xa3\x98\x4c\x50\x28\x03\x68\x8a\x06\x12\x21\x90\x02\x0d\x59\x99\x82\x0c\x45\x4a\x02\xc6\x4a\x22\x01\x20\x85\xc9\xb4\x20\x28\x34\x2a\x60\x0a\x84\xa4\x88\x53\x32\x74\x5f\xbb\x7a\x54\xc4\xc0\x93\x22\x06\x85\x53\xb1\x3b\x9f\xdc\xa7\x67\x95\x87\x7b\x23\x46\xb0\xd7\x1f\x13\x31\xf0\x93\xb3\x9f\xf0\xf9\x22\x46\x96\x9d\x2f\x5f\x07\xd8\x3b\xbe\xa1\x5b\xca\x9e\x69\xd6\xe0\x9c\x17\x41\xb7\x5b\x26\xd5\xdd\xfb\xbc\x8c\x66\xf5\xe9\xd0\x68\x58\xf4\xb4\x01\x28\xac\x25\xce\x67\x98\xdc\xe9\xf6\x14\x98\xd7\x37\x12\xda\xe4\x04\x65\x96\x1f\xee\xac\x59\x9f\x5b\x98\xd5\xf5\xdb\x22\xbb\xdc\xbf\x65\xb9\xd1\xc3\x22\x06\xe7\x9b\xf7\xdd\x32\x62\x6b\x27\xfd\x46\x5c\x09\x23\xf6\xe3\xe8\x5f\x7a\x75\x6a\xfa\x3f\x65\x94\xbb\xbc\xe2\x47\xb9\xbf\x71\x94\xe5\xb8\x7f\x6e\xc4\x0c\x8d\x48\xb9\xfb\x74\xe5\xf1\x3a\x8d\xd1\xc6\x2f\xeb\xab\x6b\xe8\x7b\x11\xa9\x84\x75\x46\x2b\x51\x30\x60\xc6\xca\x66\xaa\x5b\x66\x47\xb5\xda\x9b\x7e\xbd\xf6\xb6\xac\x16\xdf\x5b\x6f\xad\xa2\x9a\x85\x26\x85\xaf\x39\x7a\x68\x8c\xb3\xeb\x4e\x69\x0c\x2a\xf5\x36\x4b\x34\x54\xf6\xa3\xc5\x64\x57\xcf\x7c\x5d\x29\x62\x85\x5e\x6e\xb0\x5d\x53\x8d\x5e\x51\x7c\xad\xf1\xd9\xe9\xa3\x23\x92\x2c\xe2\x2c\x03\x45\x42\x80\x0c\x4b\x93\x14\x8e\x91\x14\x81\x4b\x82\x8c\x01\x89\x25\x20\xc0\x45\x45\x42\x69\x42\xc4\x31\x1c\x42\x06\x87\x80\x00\xa2\x42\xa3\x40\xb0\xe7\x38\x84\x02\x44\x77\xd7\x16\xb8\x67\x11\xc1\xdd\x76\x1b\x1b\x88\x68\x12\x10\x71\xfb\x0e\x01\x71\xda\x59\xe8\x56\x9c\x5d\x5b\x2c\x56\x99\x52\x6b\xd3\x9a\x8b\xaf\x58\x89\xc3\x07\xfd\xb7\xb6\xf1\xba\x7c\x1b\xa2\xa8\x52\x64\xcc\x6a\x99\x5e\xa2\x7c\x7b\x5b\x19\x64\xb8\x21\xce\x1d\xe3\x90\x73\xc5\xc4\x21\xf7\xba\xb2\xbe\x61\x8f\x83\xfe\xdd\x4c\xd9\xfe\x66\x5b\x60\xb7\x8e\xa9\x8e\xde\x5a\x52\xb3\x8b\x15\xc9\xd9\xbb\x96\x5d\x4e\x8b\x45\x38\x65\x2b\xcc\x82\x90\x00\xaf\xf5\x16\xbb\xf9\x82\x5f\x94\x58\xf3\x7d\x6c\xa0\x2c\x0d\x0a\x54\xa3\x3a\x50\x60\x66\x49\xcc\x57\x05\xab\xfc\x6c\x96\x51\x15\xbc\x57\x55\x8b\xe4\xd0\xca\x7e\xa0\x89\xb3\x51\x75\x40\xea\xf9\x14\xb1\xe7\xcc\x68\xcf\x63\x8f\x4f\xe6\xd3\xd8\xeb\xf3\xe7\xac\x9a\xc9\xa2\x55\xb4\x52\xdc\x5b\xb3\x6d\x1d\x2c\x46\xa8\xb0\x5f\xe9\x80\xad\x97\x76\x9b\x6a\x6e\xdf\x20\xad\x2c\x2f\xe5\x5c\x19\xf1\xa9\x65\x34\xb4\x51\x86\x21\x4e\xed\x23\x62\x51\xbc\x3f\xdf\x41\xbf\xd0\x1d\x64\xcd\x3b\xe8\x73\x01\xfa\xd7\xce\x56\xef\x19\xcf\x42\xc7\xd6\xec\xed\xba\x68\x68\xe3\x58\x31\x93\x74\x71\x6f\x5f\xd8\xb6\xf0\x2c\x05\xf0\x5d\xa5\x8b\x7f\x17\xcb\x68\x29\x8f\xb2\xb3\xf5\x48\x58\x6d\xc7\x7a\x76\xa6\xe9\xcd\x8e\x52\x81\xa5\x7a\xbb\x02\x2a\xd2\xb8\xd2\xae\xb4\x33\xe2\xeb\x52\x60\x9b\x90\x6d\xc3\x37\x15\x68\xf8\x86\x5c\x57\x5e\xdb\x62\xa7\x69\xe4\xea\x65\x4b\x50\x09\x03\xb6\xea\x39\x69\xb1\xc2\x88\x41\x0e\xac\x05\x6e\xfb\xe8\xb1\x55\x61\x69\x49\x50\x14\x41\x64\x24\x40\xa1\x18\x2e\xe0\x34\xc3\x10\x80\x22\x25\x11\x15\x71\x45\x01\x82\x80\xc9\x82\x42\xa0\x28\xaa\x40\x85\x60\x65\x0c\x40\x45\x62\x08\x5a\x96\x45\x45\x84\xc2\x69\x17\xf6\x1d\x63\x2b\x96\x3c\xb6\xe2\x78\x74\x59\xe8\xf0\xd4\xbf\x7a\x76\xef\xd8\x1a\x53\x15\x72\xaf\x1b\x72\xcc\x88\xb1\x35\xbb\x7c\x5d\x75\xa6\x1b\x63\xfb\xda\xc0\xd0\x61\xae\xa1\x8c\x94\xa1\x59\xe4\xf9\x9e\xb5\x1d\x09\x02\xaf\xbc\x77\xd6\xd4\x7e\x59\x59\x2e\xf2\x4b\xe1\xb9\x3c\xa4\xca\x74\x79\x3a\x15\x7b\xe3\x9a\x2e\xb5\xe4\x31\x4b\x94\x6b\x9c\xf2\x2a\xb7\xb8\xfa\xfb\x50\x2c\x37\xe8\xbd\xb9\x85\xb0\x96\xfb\x67\x8d\xad\xf7\x8e\x6d\x77\xfa\xf3\x3b\x9d\xe9\xe6\xa5\x47\x8e\xad\xbf\x30\x57\x4c\xca\x5b\x7f\xe5\xd8\xc6\x3d\x68\x6c\xbd\x35\xce\x7a\x63\xeb\x58\x7d\xef\xe9\x55\x8a\xc9\xbd\x59\x56\x61\xfb\xa6\x61\x25\x40\x67\x67\xd9\x42\x55\x2a\x16\x97\xb3\x12\x35\x37\xd6\xe6\x4a\x1d\xaf\x5a\xe4\x72\xa3\x16\x9e\xd5\xc6\xbe\x5c\x2e\x82\x62\xf7\xb5\xc4\x97\x06\x0a\xcc\xe5\xb9\xd2\x5e\xeb\x71\x79\x61\x81\xed\xf3\x6b\xc6\xa8\x95\xb4\x37\x2e\x65\xde\x1a\x79\x94\xd4\xe5\x49\xcb\xc7\x53\x1d\x0f\x1f\x55\xbe\xf6\x63\x88\x3e\x8c\xee\xa9\x6f\xf9\xbc\xff\x13\xcd\x41\x82\x48\xb3\x5d\xae\x71\xed\x11\xf2\xca\x8f\x90\xcf\xaa\x9c\x74\xda\x53\xf8\xc9\xd3\x77\x73\x1d\xc0\x1a\xc6\x79\x18\xe1\x44\xee\x03\x9f\xf1\x0c\x7c\x0c\x27\xe5\xc9\xdd\x77\x4b\x77\x4e\x36\x4c\xb8\x9b\x18\x43\x7a\xf5\x72\xab\xc7\x23\x9f\x4f\xe0\x2f\xbe\x63\x8d\x5e\xce\x0e\x21\xba\x52\x35\x8f\xe9\xd6\xab\x05\xbf\xaa\x53\x23\xb6\x9a\x27\xec\xe7\x7e\xac\x64\xe1\x44\xe2\x24\x8d\x61\x2b\xb5\xe4\x91\x1b\x83\x12\xf7\xde\x3c\x56\xfa\x28\x32\x71\xf2\xc7\xb2\x96\xa8\x01\xd7\xa4\xc5\xbd\x63\xed\x07\x41\xca\xf5\x3c\x3f\x4c\xf7\x45\x6d\x07\xf4\x1c\x0b\xd2\xa8\x07\x9d\xa1\xd7\x29\xd7\x8b\x88\x68\x19\x10\xfa\xbd\x2b\x9a\x1b\xd7\xc7\xee\xe7\xc7\x3b\x30\x2c\x15\x47\x11\x7e\x2d\x1e\xbf\x6a\x76\x33\x3b\x27\x14\x7e\x4e\xce\x66\x03\xe7\xfc\xb8\xc0\x2f\x17\xdf\xf7\x0e\x63\x6e\x26\x98\xb3\x7b\x38\x73\x3e\x73\x9e\x8a\xad\xe0\xc7\xd1\xc3\xb8\x71\x5f\xc0\xbb\x87\x1f\x17\x43\x3a\x8e\x02\x5f\x5e\x7f\xb9\xfc\xc8\x7a\xa8\xcb\x4f\xa0\x6d\x1b\xce\xf3\x1b\x38\xf5\xa2\x84\xcb\x70\x00\x9d\x9f\xed\xc3\x87\x8c\xce\x38\x0e\x3b\x6f\xe4\xe5\x70\xb6\x48\x14\xb3\xa7\x2f\x3a\xdf\xc9\xa6\x2a\xa7\x66\xf0\x74\xb8\xc2\x4b\xe8\x21\x29\x09\x4c\xeb\xab\xc9\xea\x51\x7c\x7b\xb8\xfc\xac\x47\x84\xaa\x9b\x24\x09\x17\xc0\xda\x3d\x4e\x00\x0f\x57\x84\x4d\xdf\x28\xc2\xf9\x49\x19\x97\x42\xe8\x2b\xdb\x2a\x67\xfa\x4d\x32\x78\xcc\x9f\x70\xdc\xaa\xfc\x78\x45\x1f\xcf\x9d\xb3\x87\xea\xfb\x75\x7d\x8e\xce\xcf\xf2\xe1\xbd\xe0\x33\x1e\xc3\x39\xf2\xeb\xf5\x51\x6c\x5d\xe0\x4c\x37\xbc\x85\x31\x68\xb9\x5d\x62\xdd\xd3\xad\x27\x1c\xb7\x9b\x64\x92\xf9\x59\x86\x6c\x13\xf1\x1f\x5f\x74\x07\xc3\x97\xc8\x02\x9c\xcb\x30\xc0\x67\xe0\xdc\xa4\x78\x06\x9d\x0f\x10\x3f\x86\x3d\x07\x55\x2a\xe6\x0e\x5f\x3d\x8e\x64\x2d\x70\x22\xd3\xdd\xfc\x05\xf0\x25\x31\x79\x79\x20\x54\x22\xa7\x8f\xd1\xe3\x19\xb6\xb4\x5c\x26\x6a\xf3\x31\xbc\xa5\xe2\x29\x9e\x97\x03\xc7\x0b\x5d\x9f\xaf\x57\xf7\x71\x74\x8e\x2b\x75\x8f\x1e\x8e\x9c\x0a\xe5\x6f\x25\xa8\xc6\xc4\x39\x57\xe4\x11\x1c\x06\xb1\xa5\xf3\x5b\x8f\xc1\x97\x8b\x53\xb2\x5e\x2e\x4e\x5a\x8b\x10\xe2\x01\xe3\xb6\x87\x27\x89\xe3\x2b\xb3\x23\x1b\xeb\xc3\xb4\x7b\x85\x62\x13\xf5\xe6\x1e\x26\x71\xf1\x25\x67\x5d\x9b\x78\xc7\x4f\xdf\xab\xd0\x44\x02\x67\xf3\xb4\xc3\x47\xb1\xcf\x67\x46\x2e\xe0\x15\xbc\xdf\x6f\x07\x71\xb8\x93\x39\x0e\xf1\xb2\x73\x84\x5e\x16\x6e\xe3\xb3\xf6\xab\xdb\xe7\xe0\xb1\x58\x13\xd3\x7e\x1b\x28\x81\x51\x2f\x87\xb2\x51\x1e\x8d\xe8\x41\xdc\x86\xa1\x4e\x4c\xdf\xd2\x5a\xb2\x0f\xf9\xa3\x8d\xe1\x0c\xf5\x2d\xf9\x66\x34\xba\xc0\x59\xc3\x8f\x57\xf4\xc5\x69\xc6\x89\xec\x07\x1a\xa4\x17\xc6\x77\xb8\xf4\x4f\xd3\xbf\xff\x00\xeb\x24\x49\x7c\xb0\xe9\x85\x08\x3b\x2a\xfb\xa7\x49\x13\x7a\x2e\x77\x92\x58\x61\x8d\xd2\xcb\x77\x28\xa2\xfc\x34\x99\x8e\x87\xd4\x25\xc9\x11\x59\xed\x3a\x47\x7d\x7a\xeb\xfa\x67\xb8\x76\x10\x7b\xe8\x04\xf8\x5a\x07\x3f\x47\x7a\x3e\x85\x7a\x90\x87\xc7\x91\x48\x23\x43\xc2\xbc\x2e\x96\xd8\xe3\xc2\xd7\x25\xe2\x54\xbc\x27\x07\x31\xff\x64\xfb\x67\x98\xcd\x25\xfe\x9b\xa7\xfa\xee\xd9\x38\x87\x40\x7e\xa8\x30\x4e\x44\x5d\x9f\xdf\xac\xe5\x18\x9c\x89\x29\xc2\xe7\xcf\x87\x83\x9f\xbf\xfe\xeb\x5f\xc8\x93\xa9\x2f\x64\xdf\x6a\xda\xd3\xf7\xef\x16\xdc\x59\x5f\xbe\xbc\x20\xd1\x80\x92\x2e\xa7\x03\x74\x6b\xf1\xd1\xa0\xa2\xbe\x9e\xce\xac\x54\xe4\xcf\x40\xe3\x19\x38\x03\x0d\xb0\xf0\x05\x19\x94\xf8\x36\xef\x1a\x19\xf2\x03\xc1\xf1\xd4\x0b\xd1\xaa\x3c\x51\x7c\xcb\x44\x85\xd7\x5f\xb3\x1c\xed\x91\x45\x0a\x8d\x36\x5f\x2e\xd6\x8f\x4b\x40\x48\x9b\x2f\xf0\x6d\xbe\x9e\xe3\x3b\x81\x55\x11\xe7\x69\xa3\x8e\xf4\x9a\x79\xdb\x64\xda\x7c\xa7\xdb\x2e\xe7\xba\xf6\xad\x3c\x5f\xe5\xbb\x3c\x92\xe3\x3a\x39\x2e\xcf\xc7\x9f\xd0\x1d\xf8\x39\x09\x94\x62\x1e\xa7\x8c\x73\x3a\x09\x8b\x64\x51\x9c\x9c\xeb\x27\x58\x36\x0a\x55\x96\x97\xe8\x27\xac\x28\x46\x6a\xc2\x9b\xca\xfe\xed\x7a\xf0\xf3\x11\xa6\x85\x43\x95\x20\xde\x60\xae\xd3\xc0\x65\x51\xe9\x6f\x54\x43\x04\x33\xe7\xba\x08\x29\x83\x3d\xd6\x28\x82\x25\x8e\x7f\x82\x42\xa2\x4d\xe3\xa2\x86\x94\xd6\x3a\x9a\xba\x69\x4d\x0d\xd8\x69\x55\x11\x59\xb0\x04\xdb\xc4\x10\x79\xbd\x5c\x21\x92\xbe\x5c\x2d\xa0\x05\x1d\x19\xfe\x2f\x00\x00\xff\xff\xf2\x7e\xf3\x6c\x75\xaa\x00\x00") - -func change_trustHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _change_trustHorizonSql, - "change_trust-horizon.sql", - ) -} - -func change_trustHorizonSql() (*asset, error) { - bytes, err := change_trustHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "change_trust-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1d, 0x96, 0x8b, 0x86, 0xc7, 0x6e, 0xe1, 0x1d, 0x3f, 0xad, 0x87, 0x13, 0x5b, 0x2a, 0x75, 0xf6, 0x76, 0xcb, 0x1a, 0xf5, 0x10, 0x16, 0x27, 0xe8, 0x4f, 0xad, 0x45, 0xff, 0x8f, 0x83, 0x76, 0x7}} - return a, nil -} - -var _core_database_schema_version_8CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x59\x5b\x73\xa2\xc0\x12\x7e\xf7\x57\xf4\x9b\x49\x95\x49\x25\x9a\xcb\xee\x5a\x39\x55\x44\x31\xba\xab\x68\x00\x4f\xe2\xbe\x58\x03\xb4\x3a\xb5\x30\x18\x66\xc8\xae\xff\xfe\x14\x57\x01\x15\xd8\xec\xee\xf1\x21\x56\x98\x8f\xaf\x2f\xd3\xdd\xd3\x3d\x5e\x5c\x80\xbe\xa1\x1c\x56\xd4\x46\xa0\x1c\x98\x2b\x60\x8d\x0c\x3d\x22\xd0\x02\x63\x07\x5a\xaf\x77\x09\x23\xd1\xe4\xe0\xf3\xe8\x89\x40\x2e\x38\x88\x0d\x11\x60\x6e\xd0\xfc\x01\x3d\xd7\x43\xe8\x3f\x02\x37\x37\xe8\x90\xc6\xc5\x05\xbc\xa3\xc7\xa9\xcb\xc0\x74\x9d\x2d\x11\xd4\xa0\x36\x15\xbb\x4b\x90\x6c\x1b\x7c\xc6\xd0\x44\xce\x89\xb7\x03\x41\x0c\x1b\x39\x10\x0f\xc1\x43\xc7\x7d\x47\xeb\xb2\xd1\xb8\xb8\x08\x18\x66\x2e\x17\x6b\x0f\xb5\xe7\x31\x58\x44\x10\x83\x70\x04\xcb\x77\xb6\xc1\x72\xb0\xde\xf7\x9d\x2d\x5a\xb0\xf2\x5c\x67\x0f\x48\xc4\x7e\xbe\xbc\xbb\xbc\xce\xa0\x8c\x1d\x6c\xd7\xcb\xe0\xf5\x02\xa4\xa1\xc9\x3a\x70\x41\x04\x3a\xc8\xc4\x52\x50\x07\x5d\x5f\xc0\x03\x5c\x75\xc3\x25\xdb\x35\x7f\x1c\x3e\xa5\x96\x8d\x4b\xca\x96\xc2\x23\x8c\x13\x53\x50\x97\x2d\x39\xf2\x80\xf7\x10\x6c\xda\x34\xa0\x46\x66\xba\x16\x65\x6b\x78\x80\xe6\x5c\x1f\x7c\x6a\x76\x13\xd9\xcc\x22\x9e\xb5\x34\x5d\xb6\x72\x3d\x87\xb2\xf5\x92\x0b\x8f\xb2\x35\x87\x07\x70\x59\xcc\x11\xb8\x79\xb9\xf2\x59\x24\xcb\x70\x2d\x8a\xc1\xfa\x8a\xd8\x1c\x73\x62\x1c\xca\x96\x4e\xe0\xdd\x75\x08\xf8\x49\x3c\x46\xd9\x3a\x82\x78\xee\xcf\x25\x47\xd3\xf7\xa8\xd8\x05\xe4\xab\x55\x37\x76\x00\x12\xcf\xdc\x2c\xb7\x44\x6c\xe0\x01\xb6\xbe\x61\x53\xb3\x15\x78\xcc\x24\x82\xd8\xee\xba\xdb\x68\xf4\xd5\xe9\x0c\x46\x4a\x5f\x7e\x85\xd1\x00\xe4\xd7\x91\xa6\x6b\x31\xf2\xd2\xdf\xae\x3d\x62\xe1\x86\x72\x61\xec\x38\xbe\x75\x4b\xd1\x9c\xae\x19\x7a\x9c\x98\xa6\xeb\x33\x51\x81\x45\xdb\xa6\x6c\x4d\x39\xf7\xd1\xa3\xcc\xc2\x5f\x15\x78\x73\xfb\xe6\xbb\x9e\xef\xf0\x3a\x8a\x98\x5b\x64\xef\x75\x90\x5b\x8f\x9a\x58\x43\xbc\x8d\xd6\x1a\xbd\x3a\x8c\x81\xaf\x56\x88\x35\x91\x35\x60\x86\xbf\xfb\x1d\x47\xc5\xde\x37\x88\x4d\x98\x89\xbc\xdb\x90\xc6\xba\xac\x82\x2e\x3d\x8e\xe5\x0c\x7a\xaa\x8c\x17\x47\x76\xd9\xf5\x76\x10\xb2\xf7\xa6\x8a\xa6\xab\xd2\x48\xd1\x33\x2f\xe5\x81\xcb\xed\x0f\xdc\xd5\xe1\x17\xbf\xaa\xa9\x53\xcc\x6f\xb0\xae\xb0\x86\xce\x59\x58\x7d\x6e\xcf\xe7\xc2\xa6\x0c\x79\x19\x73\x0a\xaa\xcd\x1b\x68\x81\x61\x51\x2a\xe1\xdd\x83\xea\xf3\x46\x99\x57\x46\x1a\x21\xea\x33\xa6\xf9\x56\x46\x9a\x82\x6a\xf3\x6e\x7d\x83\xfb\x46\x09\x67\x04\xf8\x1d\x3e\x9b\xf2\xcd\x9b\x8f\x7e\x99\x4f\xb3\xb0\xfa\xdc\x58\xee\xd3\x70\xbd\x36\x9b\xbb\x5a\x95\xd3\x45\x80\xda\x7c\x51\x49\xda\x20\xb1\xca\x69\x73\xb8\x7f\xcc\x1e\x97\x49\x7c\x5b\xd6\x14\x63\x10\x56\x42\x6e\x10\x56\x5b\xe1\xb8\xee\x95\xe9\x9a\x40\x7e\x97\x33\x68\x42\xaa\x69\x03\x54\xcc\x1c\x62\x8b\xc4\x47\x8b\x6d\x39\x36\x2d\x8a\x55\xb0\x7d\x89\xab\x40\xa6\x25\xab\x1c\xb7\x2f\x41\x15\xb8\xa8\xaa\x54\x80\xd2\x2a\x51\x89\xab\x65\x44\x54\x21\x2a\x31\x69\xbe\x57\x20\xb1\xd2\x80\x28\x31\xcb\x31\xb9\x3c\x28\x87\x1a\x84\x95\x03\x92\x38\xad\x85\x0a\xc2\x2e\x06\xca\xaf\xba\xac\x68\xa3\xa9\x92\x05\xdb\xdb\x35\x7f\xb3\x63\x84\xd6\x1b\xca\x13\xe9\x80\xab\x1b\x77\xe6\x0a\x71\xf0\x4b\xf2\x0c\xf4\xdd\x16\xbf\xc4\xaf\x74\x41\x0b\x27\x80\x2f\x70\xd1\x85\xe9\x4f\x86\xde\x17\xb8\x08\x1b\xf6\x9e\x2a\x4b\xba\x9c\x30\x27\x7c\x39\xc2\x4c\x34\xc5\xa4\xa1\x49\x7b\xce\x44\xe2\x31\xe2\xc8\xfa\xcc\xc1\x79\xd6\x00\x80\xa8\xb3\x67\xc4\x41\x30\x37\xc4\x23\xa6\x40\xef\xac\xd3\x3e\x07\x65\xaa\x83\x32\x1f\x8f\x5b\x7b\x14\x08\xfc\x25\x1a\xe7\x27\x95\x3a\x38\x70\x63\x25\xf7\xc9\x5e\xa1\x69\xb6\x90\x84\xe5\x63\x4f\x18\x6a\x21\xf5\xfb\xd9\xca\x51\x10\x07\x33\x75\x34\x91\xd4\x05\x7c\x93\x17\x70\x96\xda\x15\xe8\x3b\x52\x34\x59\xd5\x61\xa4\xe8\xd3\xac\xbe\xff\x95\xc6\x73\x59\x83\xb3\x66\x32\x1d\x45\xd3\x19\x1c\x7c\x9a\x2d\x68\x7e\x6a\x16\x2d\x4f\xc3\xeb\xa3\x9b\x91\x96\xda\x68\x2b\xe2\x7f\xa9\xb5\xdf\x0a\x78\x27\x5e\xd0\xb5\x9e\xdd\xde\x15\xb7\x24\x6e\x4c\xc1\xa0\x6b\xca\x44\x71\xbf\xf0\x8d\xf9\xce\xf1\x35\xe6\x3b\xdc\x37\x90\x09\x2f\x98\x90\x28\x13\xb8\x46\xaf\x80\xa1\x6c\x65\x93\x60\x90\xb2\x90\x8b\xe3\xea\x44\xc0\x8d\xeb\xa0\xe5\x3a\x84\xb2\x23\xa8\xc3\x38\x12\x1b\x0f\xf9\xc6\xb5\x2d\x1e\x06\x53\x61\x75\x65\x93\xf5\x29\x8d\x6c\xc2\x85\xe3\x5a\x74\x45\xd1\x3a\x01\x89\x1a\x7c\x9b\x92\x70\x96\x0e\x8c\x8b\xec\x4f\x5c\x12\x0e\x4a\xa7\x96\x33\x71\x95\x1e\x6f\xb1\x8b\x97\xf1\x08\x3f\x94\x7b\xdf\xe0\xec\x2c\x71\xfc\x7f\x1e\xe0\xea\xfc\xbc\xe4\xed\xa2\x3a\x45\x9e\x03\x75\xab\x18\x73\x3b\x57\x60\xcb\xef\x6a\x15\xd3\xa1\x33\x0a\x74\x47\xbc\x15\x71\x1e\xe4\x7f\x1a\xc4\xf9\xae\xe0\x8f\x73\x3f\xa1\x3b\x96\xf9\x39\x51\xf9\xbc\x4f\x93\xe8\x84\x9e\xe9\x3c\x17\x2b\x18\x4e\x7f\xf5\x92\x36\x1a\x14\x0b\x3c\x30\x55\xf6\x2e\x98\x6b\x23\xe5\x09\x0c\xe1\x21\x42\x12\x27\xe7\xf0\x32\x94\x55\x19\xb2\x71\x73\x7d\x95\x7c\x8a\xd5\x29\xa5\x4a\x6b\xd3\xd3\xa3\x3a\x5b\x0c\x47\xe3\x76\x6f\xd4\x19\x28\xcf\x37\x8f\xaf\xe3\xc1\x44\xe9\x8f\x07\x5f\xe7\xca\x6c\xde\x1e\x2e\x3a\xdf\x27\x03\x6d\x38\x55\xe6\x3d\x79\x2a\x69\x2f\xf7\xcf\xbd\xfb\xe9\x6b\x7b\xd8\x6c\xc1\xe7\xe8\x73\x1f\x7f\x7f\xba\xba\x6a\x41\xbb\x05\x57\xad\x28\x69\xa0\xc9\x05\xda\x36\xf1\x2e\x5d\x6f\x1d\x94\x38\xe9\x59\x92\x24\xe9\xe1\xa1\x19\x62\xda\x09\x2c\xf8\x7b\xc2\x9b\xe1\xa1\xf9\x87\xe5\x2f\xec\x0a\x3f\x52\x01\x83\x17\xf3\x27\x57\x0a\xbe\xbb\x39\x06\x7e\x27\xb6\x7f\x0c\x7d\x7d\x7d\x50\xa8\x4a\xcb\x4d\x98\x03\xa7\xdc\x71\xd8\xc6\xfe\xad\x54\x08\x18\x4b\xb2\x21\x15\x78\x22\x21\x5a\xa9\xc3\x42\xf5\x8f\x44\x5d\xa8\xfe\xdf\x08\xbc\x26\x21\x24\xf8\x32\x5e\x06\x7e\xb3\x05\xd7\x57\xc5\xf0\xc9\x77\x79\x1f\x0d\xa0\xfc\x6c\x15\x85\x50\xfc\x8c\xf0\x4d\xa6\xa1\x39\x0c\x87\xad\x87\xef\x95\x20\xc3\x37\x7f\xa0\xb0\x29\x17\x95\xd0\x74\x60\x4b\x82\x25\x7a\x6c\xda\x2e\x47\x41\x9d\x13\xc7\x74\xe8\xf0\x23\x07\x61\x66\x73\xf3\x73\x61\xca\x57\x28\xd7\x7b\x39\x27\x2a\xff\xa9\xf1\x32\x4f\xb3\xb7\xe2\x44\xb1\x8f\x3b\xf8\x8f\x6e\x58\x3c\xba\x9f\xa5\x07\x32\x7a\x35\x73\x3d\x7c\x93\x5a\xa7\xba\x9d\xf0\xb0\x22\x9c\xa3\x10\xbb\x2d\x9e\xe8\x0f\xb2\x30\xd3\xb5\x8e\x56\x82\xf6\x79\x0e\x1b\xdd\x16\x96\x35\x40\xd1\x29\x5e\x25\x3a\x83\xaa\x92\x9c\xbd\xa6\x2c\x13\x4c\x9c\x20\x65\x8f\x3b\x24\xbc\x8d\x65\x27\x74\x09\x17\x4f\xf5\x50\xe1\x22\x58\xae\x6f\xd8\x18\x24\x89\x49\xc3\x9f\x02\xfe\x6a\x9f\x96\x09\xcb\xf8\xaa\x26\xb2\xa5\x10\x8c\xb1\x81\x27\x02\x3a\x7e\x33\x8e\x8b\xc2\xab\x49\xb4\x64\xa2\xf8\xa0\xa8\x46\x04\xc7\xea\x69\xe6\xfe\x28\x5f\x4a\x63\xda\xe2\x99\x1d\x47\xf5\xbe\x70\x4a\xaf\x93\xc1\x4d\x47\x7f\xfa\x3e\x7c\xe9\x3c\x2b\x1d\x55\x9e\xce\xa5\xf6\xfc\x76\xf6\x72\xfb\xa8\x4b\xea\xeb\xd3\xd3\xe2\x6b\xe7\xeb\x68\x30\x7c\xe9\x2c\xf4\xbb\x67\xf5\x9b\x3a\xee\xf4\x66\xb3\x79\x50\x29\x33\xa7\x73\xf4\xf7\xba\x05\xcd\xb9\xd6\x0f\xaa\xe9\x1f\xf0\xb6\xd3\x86\x23\x64\x0c\x9a\x80\xcb\xdb\x50\xd6\xf5\xe7\x4a\x73\x1e\xdb\xcf\xa3\x85\xde\x1e\x49\xf3\xc1\x44\x7d\xfd\x36\xd6\xc6\xe3\x99\x2a\xf7\x7a\x77\xd3\xde\xf4\xe9\xeb\x44\xea\x6b\x33\x5d\xfd\x76\xaf\x3f\x29\x7a\x5b\x1b\xa8\xed\xc5\xd3\x4b\x5f\x52\x03\x95\x6f\xf2\xfa\x7f\x9c\xa8\xe8\x94\x9c\x35\xd7\x89\xdf\xda\x37\xe7\xdd\x7f\x65\xca\xed\x3f\x32\xa5\xbd\x37\xa5\x9d\xee\xcd\xbf\x35\xe5\xae\x34\xc8\x3e\xce\xdb\xf9\xff\xef\xca\xfd\x3f\x32\xe5\x66\x6f\x4a\x27\xe4\xec\xec\x4d\xc9\xdf\x7e\xc4\x17\x77\x1f\xbe\x8f\x89\x7f\x70\xf8\x48\xff\x1b\xb1\x07\x55\xaa\x0e\xfa\x27\xd2\xf5\x46\x1c\xef\x65\x8f\x58\x94\xff\xa1\xe3\xcf\x6f\x72\x22\xb6\xa3\xd7\x38\x19\x41\x27\x5b\xd7\xd4\xd6\x83\xd6\xbb\xf0\x63\xe9\x47\xc7\xba\x3c\x4d\x30\xd5\x25\x8e\xc8\x0d\x75\xb9\xf1\x32\x77\xad\x14\xa3\xff\x4a\xfb\xfc\x24\x0d\x64\x59\xbb\x99\xf4\xe5\xdb\xef\xf7\xcf\x77\x5f\x1f\x1f\xdb\x8f\x8b\xc9\x58\xbb\x5f\xbc\xc8\x43\x7d\xa6\xa8\xf7\xa3\x9e\xa4\x7c\x97\xee\x75\x69\x3a\x9e\x68\xaa\x3c\x96\x6f\x86\x37\x5a\x3b\xa8\xf4\xe7\xdd\xc6\xff\x02\x00\x00\xff\xff\xc6\x9a\x38\x5b\xb1\x20\x00\x00") - -func core_database_schema_version_8CoreSqlBytes() ([]byte, error) { - return bindataRead( - _core_database_schema_version_8CoreSql, - "core_database_schema_version_8-core.sql", - ) -} - -func core_database_schema_version_8CoreSql() (*asset, error) { - bytes, err := core_database_schema_version_8CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "core_database_schema_version_8-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3c, 0xb2, 0xbe, 0x2b, 0xc5, 0xda, 0x4d, 0x87, 0x29, 0x0, 0xd6, 0xce, 0x75, 0x0, 0xf1, 0x66, 0x82, 0x9d, 0xe0, 0x3, 0x16, 0x1d, 0x3e, 0xf5, 0xbd, 0x2e, 0x23, 0x5a, 0x0, 0xf, 0x97, 0x45}} - return a, nil -} - -var _core_database_schema_version_9CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x59\xed\x53\xa3\xbe\x16\xfe\xde\xbf\x22\xdf\xaa\xb3\xea\xd5\xd6\x97\x75\x3b\xde\x19\x6c\x29\xad\xad\xb4\x02\x7d\xd1\x2f\x9d\x00\x29\xcd\x4f\x08\x48\x82\xae\xfb\xd7\xdf\x09\x6f\x05\x4a\x29\xee\x6f\xf7\x3a\x3b\xab\x93\x3c\x79\x72\xce\x49\xf2\xe4\x9c\x70\x7a\x0a\xb4\x0d\xa6\x60\x8d\x6d\x04\x30\x05\xc4\x65\xc0\x42\x04\xf9\x90\x21\x13\xe8\x9f\x40\xed\x76\xcf\xc0\x90\x35\x29\x08\x68\xd4\xc2\x10\x65\x14\xb0\x0d\x64\xc0\xd8\x20\xe3\x15\x74\x5d\x1f\x81\xde\x3d\xa0\xc6\x06\x39\xb0\x71\x7a\x0a\xde\x91\x4f\xb1\x4b\x80\xe1\x3a\x1e\x64\x58\xc7\x36\x66\x9f\x67\x40\xb0\x6d\x10\x10\x82\x0c\x44\x29\xf4\x3f\x01\x83\xba\x8d\x28\x80\x3e\x02\x3e\x72\xdc\x77\x64\x9e\x35\x1a\x8d\xd3\x53\x4e\x31\x75\x29\xb3\x7c\xa4\x3e\x8d\x81\x09\x19\xd4\x21\x45\xc0\x0c\x1c\x8f\x77\xf3\xfe\x5e\xe0\x78\xc8\x04\x6b\xdf\x75\xb6\x80\x64\xde\xdb\xb3\xeb\xb3\x8b\x0c\x4a\xff\x04\x9e\xb5\xe2\xc3\x0b\x90\x86\x2a\x6a\x80\x32\xc8\x90\x83\x08\x5b\x31\xec\x20\x37\x60\xe0\x0e\x9c\x77\xc2\x2e\xdb\x35\x5e\x77\x5b\x0d\x1b\x73\x34\x22\x86\x6b\x62\x62\x81\x3b\xd0\x9c\x69\xfd\xef\xcd\x4e\x42\x47\x4c\xe8\x9b\x2b\xc3\x25\x6b\xd7\x77\x30\xb1\x56\x94\xf9\x98\x58\x14\xdc\x01\x97\xc4\x1c\x3c\x74\xab\x75\x40\x0c\x86\x5d\xb2\xd2\x5d\x13\x23\xde\xbf\x86\x36\x45\xb9\x69\x1c\x4c\x56\x0e\x8f\x98\x15\x02\x3e\xa0\x4f\x30\xb1\x3a\xb1\xed\x08\xfa\xc6\x66\xe5\x41\xb6\x01\x77\xc0\x0b\x74\x1b\x1b\x27\xdc\x59\x03\x32\x68\xbb\x1c\xd6\x53\x26\x53\x30\x94\x7b\xe2\x12\x0c\xfb\x40\x5c\x0e\x55\x4d\x8d\x91\x67\x81\x67\xf9\xd0\x44\x1b\x4c\x99\xfe\x49\xd1\x5b\xa7\x12\x4d\x91\x6d\x63\x62\x61\x4a\x03\xe4\x63\x62\xa2\x9f\x07\xf0\x86\xf7\x16\xb8\x7e\xe0\xd0\x3a\xe4\x86\x87\xc8\x7b\x1d\xa4\xe7\x63\x03\xd5\x98\xde\x46\xa6\x85\xfc\x3a\x8c\xdc\xff\x35\x42\x35\x91\x35\x60\x7a\xf0\xf9\x95\x40\x41\xc3\x70\x03\xc2\x74\x68\x43\x62\x20\xda\x69\x08\x63\x4d\x54\x80\x26\xdc\x8f\xc5\x0c\x7a\x22\x8f\x9f\x4b\x56\xce\xf5\x3f\x41\xc8\xde\x9d\xc8\xaa\xa6\x08\x43\x59\xcb\x0c\xca\x03\x57\xde\x2b\xfa\xac\xc3\xcf\x7e\x1e\xa6\x4e\x31\x5f\x60\x5d\xa3\x1a\x36\x67\x61\xf5\xb9\xfd\x80\x32\x1b\x13\x44\xab\x98\x53\x50\x6d\x5e\x6e\x05\x0a\x35\xa2\x82\x77\x0b\xaa\xcf\x9b\x9e\x8e\x2a\xde\x14\x54\x9b\xd7\x0b\x74\x1a\xe8\x15\x9c\x11\xe0\x2b\x7c\x36\xa6\x9b\xb7\x00\x05\x55\x11\xc8\xc2\xea\x73\x23\xe4\x57\xb9\x1f\xf6\xd7\x66\x73\xd7\xeb\x6a\xba\x08\x50\x9b\x2f\x12\x90\x0d\x82\x66\x35\x6d\x0e\xf7\x97\xd9\x63\x51\x43\x6f\xab\x9a\xd3\xe8\x90\x54\x90\xeb\x90\xd4\x36\x38\x56\xa9\x2a\x5b\x13\xc8\x57\x39\xf9\x0d\x7e\x98\x96\xa3\x62\xe6\x10\x5b\x24\x2e\x95\xc6\x6a\x6c\x2a\x61\x87\x60\x5b\x41\x3a\x80\x4c\x05\xa6\x1a\xb7\x15\x8c\x03\xb8\x54\x00\x0e\xe2\x6a\xd9\x17\x1d\xfe\x83\x98\xf4\x28\x1f\x40\xf2\xf3\x59\x0d\x89\xce\x5c\x35\x26\xb7\xc5\xab\xa1\x3a\x24\xd5\x80\x64\x0b\xd6\x42\xf1\x1d\x15\x03\xc5\xa5\x26\xca\xea\x70\x22\x67\xc1\xb6\x67\xd1\x37\x3b\x46\xa8\xdd\x81\xf8\x28\xec\x70\x75\xe2\x8c\x55\x86\x0e\xfa\x91\xb4\x01\xed\xd3\x43\x3f\xe2\x21\x1d\xa0\x86\xa9\xf1\x0f\x70\xda\x01\x93\x0f\x82\xfc\x1f\xe0\x34\x4c\x64\xbb\x8a\x28\x68\x62\xc2\x9c\xf0\x35\x72\x8c\xf9\xce\x98\xb8\x3b\x79\x7c\x14\x65\xad\x82\x39\x02\x80\x89\x9c\x27\x00\x43\x15\x34\x93\x14\x35\x69\x8b\x32\xf7\x66\x71\xe6\xc4\xfd\x78\xce\x34\x42\x07\xfd\xc9\xc5\x52\x9e\x68\x85\x78\x82\xc5\x50\x1b\xa4\x66\x65\x73\xd5\xdc\xf4\x5b\x96\x82\x21\x5f\x71\x7e\x87\x24\x0c\xc0\x74\xfc\x1f\xcf\xe2\xb5\x85\xe7\xbb\x06\x32\x03\x1f\xda\xc0\x86\xc4\x0a\xa0\x85\xc2\x30\xd4\xcc\xad\x39\xcc\x44\x6b\x18\xd8\x6c\x15\x55\x33\x1e\x34\x10\x2f\x08\x9a\x85\xde\x0f\xcc\x36\x2b\x17\x9b\x99\x1c\x3f\xe7\x6c\x76\x43\xc6\x6e\x86\x5b\x77\xeb\x64\xb2\x01\xca\x02\x1e\xed\xf2\xac\x98\x1e\x35\x00\x00\x49\x0b\x36\x81\xb1\x81\x3e\x34\x18\xf2\xc1\x3b\xf4\x79\x72\x7a\x74\x75\x7d\x1c\xae\x8d\x3c\x1b\x8f\x4f\x42\x34\x1f\x48\xa0\x83\x4a\xc0\xdf\xbf\x97\x81\xdf\xa1\x1d\x94\xa1\x2f\x2e\x5a\x45\xb8\x0d\x29\x73\x5c\x13\xaf\x31\x32\x01\x26\x0c\x59\xc8\x4f\x21\x8d\xe3\x4e\xa3\x31\x94\x55\x51\xd1\xc0\x50\xd6\x26\x39\x4f\xe6\xc2\x78\x26\xaa\xe0\xa8\x29\xf5\x5e\x26\xf7\x53\x6d\x2e\x8a\xdd\xd9\x73\xbf\x3b\x50\x9f\xae\xe4\xae\x38\x9b\x0b\xf3\xcb\x87\x91\xf2\x32\xbc\x1e\x4d\xae\x06\xfd\xc9\xe3\xcd\x40\x7a\xd2\x5a\x2d\xb1\xbd\x1c\x4a\xca\x40\x9e\x35\x4f\x40\x13\x3a\x7d\xc6\x7f\xeb\x8b\x7e\xd0\x3c\x01\x17\xe7\xc7\xe5\xf1\xa7\xff\x36\xf8\xf4\xb7\x22\x1f\x67\xfe\x40\xc7\x16\x26\xac\xd0\x49\xd1\x1b\x09\x9c\xf2\x3e\x12\x38\x34\xd0\x11\x61\x3e\x2f\x1f\x8b\x71\x8d\x30\x98\xac\x6d\xc8\xab\x4c\x13\x51\x56\x6e\x4e\x04\xdc\xb8\x0e\x32\x5d\x07\x62\x52\x82\xba\xbc\x2c\x1a\xcd\x36\x3e\xa2\x1b\xd7\x36\x29\x60\xe8\x67\xd1\xb2\xb5\x0d\xad\x7d\x16\x55\x6e\x86\x38\x22\x61\x05\x65\x63\x18\x3e\x1e\x70\xe7\x22\xff\x93\x90\x84\x95\xe8\xde\x6e\x6c\x11\x9e\x54\x71\xb3\xa2\x96\x4c\x5a\x91\xe6\x28\x71\xd0\x57\xf1\x2b\xc6\x40\xec\x8e\xc0\xd1\x51\xb2\x14\xff\xbd\x03\xe7\xc7\xc7\x15\xa3\x8b\x06\x16\x79\x76\x1c\x38\xc4\x98\x5b\xcb\x02\x5b\x7e\x9d\x0f\x31\xed\x86\xa7\x40\x57\x12\xbf\x88\x73\xdf\x49\xa4\x7f\xe4\x18\xde\x46\x3f\x37\xf1\xef\xef\xe7\xe7\x27\xa0\x75\x02\xce\x4f\xa2\x85\x07\x4d\x5d\xba\xc5\x46\x5b\xf9\x1c\x3b\xf2\x3b\x3f\xae\xc2\x93\x20\x08\xc2\xdd\x5d\x33\x04\xb5\x12\x5c\x8c\xe6\x7d\x11\xa2\xfb\x4d\xfa\x30\x1f\x1f\x7e\x42\x51\x27\x8b\xf3\x5f\xe7\xca\xf4\xfa\x9f\x87\x77\xcd\xfa\x46\xbf\x3b\xff\xcc\x3f\x6e\xbe\x7d\x4c\xbd\x07\x51\x7f\x11\x1e\xcc\x10\xef\xde\x35\x8f\x3b\xe1\xe1\x9f\x8d\xc7\xc9\x76\xf9\x71\xd0\xf1\x9b\xc1\x44\x7a\x56\xc4\xae\xd4\x1f\xf5\x95\x96\x24\x4d\x16\x62\xbf\xd5\xd7\xda\xbd\xb9\xd2\x96\x66\x97\xa3\x9b\xfb\xb9\x22\x49\xd3\xc5\x5c\x5d\x0a\xf3\x91\xa4\x3e\x8f\xb4\xe5\x64\xf0\xc7\x1d\xe7\xff\x17\xf5\x2b\x9f\x42\xfd\xae\x88\xe5\x6b\x92\x48\xc9\xe2\x36\x48\x37\x5b\x55\x38\xba\xde\x51\x03\xcf\x47\xef\x07\x41\x7a\x60\xbc\x22\x66\x63\xca\x0e\x42\xd3\x42\x27\x11\x88\xa8\xd9\xb0\x5d\x8a\x18\x76\xf6\x68\x65\x78\x63\x94\xa8\x51\xe6\x94\xe4\xeb\xa9\x94\xaf\x70\x42\xb6\xf3\xec\x39\x6c\xfb\xca\xb2\x3c\xcd\xd6\x8b\xcc\xf9\xca\xae\x5b\x9c\x1e\xff\xee\x82\xc5\x25\xef\x51\xaa\x8a\xc8\xaf\x79\xe5\x84\x23\xb1\xb9\xef\xca\x09\xf5\x01\x52\x8a\x58\x59\x38\x23\x71\xdb\xdb\x0d\x1d\x7e\x74\xca\xa9\xc3\xd7\x3b\xb2\x47\xf5\xc3\xce\x7d\x57\x42\xd8\x09\x4c\x37\xd0\x6d\xc4\xb7\x9b\x81\xc3\x97\xdc\x3f\x7a\xed\x64\x16\x38\x7e\x2c\x88\x7c\x29\x2c\x6b\xec\xe0\x9e\xad\x11\x8f\x8c\x23\x5c\x18\x9a\xc4\x3d\xb3\x1f\xb2\x65\x72\x58\x1c\x47\x04\x21\xad\xd0\xeb\x95\x50\xf3\x22\x18\x4c\x95\xe1\xa3\xa0\x3c\x83\x91\xf8\x0c\x12\xda\xa2\x7c\xc7\xfb\x63\xab\x61\xc2\xf2\xb1\x7f\xd9\xd6\xa4\x97\xc1\xa2\xfd\x24\xb7\x15\x71\x32\x13\x5a\xb3\xab\xe9\xe2\xea\x5e\x13\x94\xa5\x24\x3d\x3f\xb4\x1f\x86\xfd\xc1\xa2\xfd\xac\x5d\x3f\x29\x23\x65\xdc\xee\x4e\xa7\x5c\xbc\x2f\x12\xc5\x8d\x64\x29\xfa\x7b\x3e\xd7\x94\xa8\x51\x18\xd3\xf1\x2f\xe3\xd7\xcb\x54\x37\xa4\x1b\xac\x5c\x08\xd0\xbb\xb8\x0d\x36\x4e\x57\xfe\x25\x7d\x10\x38\xeb\x4f\x75\xf4\xf0\x6d\xd3\x9f\xcd\x6f\x44\x3e\xbe\x75\x9e\xfc\x84\xd4\x5c\x0d\xcf\xae\x42\xb5\xbb\xb8\x3d\xe8\xc5\x7d\xeb\x69\xf8\xac\xb5\x86\xc2\xac\xff\xa8\x2c\x47\x63\x75\x3c\x9e\x2a\x62\xb7\x7b\x3d\xe9\x4e\xa4\x87\x47\xa1\xa7\x4e\x35\x65\x74\xa3\x49\xb2\xd6\x52\xfb\x4a\xeb\x59\x5a\xf4\x04\xa5\xd7\x3c\x01\x97\x25\x96\x9b\x4f\x0a\x46\xaf\x82\x3b\x7f\xd5\xdf\x96\x0f\xb0\xfd\x73\x38\x5c\x92\xae\xf1\x32\x16\x7a\xaf\xdf\x8c\xf9\xda\x79\xa1\xb7\xea\x78\xb0\xe8\x2d\xc4\xad\xe7\x51\x14\x2e\x72\x4e\x44\xff\xb8\x60\x5f\x1e\x77\xfe\x96\x07\x57\x7f\xd6\x83\xd6\xd6\x83\x56\xba\x12\x7f\xd7\x83\xeb\x03\x3b\xe9\x8b\xde\xb4\xff\xff\x6b\x70\xf3\x67\x3d\xb8\xdc\x7a\xd0\x0e\xcd\x6f\x6f\x3d\xc8\x5f\x17\x99\x67\xa3\xdf\xbd\x32\x32\xef\xd9\xf1\xb5\xc1\xff\xce\xd7\x7d\x47\xed\x9d\x02\x2e\x1a\xc1\xc5\x7e\x27\x47\xcc\x30\xa6\xc1\x4d\xbe\xc9\x45\x4f\x0b\x60\xe7\x87\x47\xed\xb6\x59\xaa\x7e\xb9\x9b\xb5\x4c\x04\x2b\x5e\x44\xc1\x4c\x1e\x3e\xcd\x44\xb0\xbd\x78\x77\x42\x98\xcf\x71\x4a\xde\x6e\xd3\x57\x86\x64\xc2\x03\xd1\xfd\xb7\x0e\xec\x8a\xf9\x36\xe5\x0a\xad\xdf\x99\x60\x1b\xf0\x32\xf6\xc2\xb7\x88\x3c\x75\xba\xd8\x3b\x71\x29\x7e\x84\x8a\xc3\x10\x7e\xb2\xaa\xb7\xbf\xa2\xaf\x5b\x05\x1e\x30\x91\xb7\xb9\xf4\x4c\x1d\xca\x12\xd0\x99\x8f\x10\x48\x2a\xad\x63\xb0\x18\x88\x8a\x08\xb2\x95\x57\x2a\xab\x61\x9d\x5e\xb6\x7e\xf1\x67\xbd\xdf\x35\x32\x4b\xc2\x2d\xcc\x6f\x8a\x9c\x99\x65\x3b\x69\xdf\xd7\xe9\xf0\x8b\xb7\x8d\x18\x0a\x67\xfc\x5f\x00\x00\x00\xff\xff\xf6\xd4\xef\xc8\x5d\x1f\x00\x00") - -func core_database_schema_version_9CoreSqlBytes() ([]byte, error) { - return bindataRead( - _core_database_schema_version_9CoreSql, - "core_database_schema_version_9-core.sql", - ) -} - -func core_database_schema_version_9CoreSql() (*asset, error) { - bytes, err := core_database_schema_version_9CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "core_database_schema_version_9-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcf, 0x88, 0x53, 0x36, 0x7b, 0x3, 0x68, 0x94, 0x19, 0xd7, 0x1e, 0x21, 0x32, 0x8b, 0x39, 0xb0, 0xcc, 0x38, 0x99, 0x5, 0x8b, 0x91, 0x78, 0x8, 0x7c, 0x74, 0x85, 0xdd, 0x4f, 0x60, 0x5c, 0xaa}} - return a, nil -} - var _failed_transactionsCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\xaf\xe2\xc6\xd7\xe7\xfb\xfe\x14\x28\x6f\x3a\x11\x9d\x50\x5e\xcb\x4e\x4f\x1e\xc9\x80\xd9\x31\x98\x1d\x46\xa3\x56\xb9\x5c\x05\x06\x6f\xd8\x66\x1d\x3d\xdf\x7d\x84\xe1\xb2\x5d\xe0\x72\x81\x4e\xfe\x9a\x27\x96\x72\x43\xe3\xe3\x73\x7e\xf5\xab\x73\x4e\xad\xa6\x7e\xff\xfd\xcb\xef\xbf\x27\xea\x5e\x18\x0d\x03\xd2\xd4\x2b\x09\x13\x45\xc8\x40\x21\x49\x98\x33\xc7\xff\xf2\xfb\xef\x5f\x36\xf7\xb3\x33\xc7\x27\x66\x82\x06\x9e\x73\x10\x98\x93\x20\xb4\x3c\x37\x21\xff\x21\xfe\xc1\x1c\x49\x19\xab\x84\x3f\xfc\xb1\x79\xfc\x4c\xe4\x4b\x53\x6d\x25\xc2\x08\x45\xc4\x21\x6e\xf4\x23\xb2\x1c\xe2\xcd\xa2\xc4\x5f\x09\xf0\x3d\xbe\x65\x7b\x78\xf2\xfe\x5b\xcb\xb4\xc9\x0f\xcb\xfd\x11\x05\xc8\x0d\x11\x8e\x2c\xcf\xfd\x11\x92\x70\xa3\xf7\xbd\x30\xb6\xad\x8d\x6a\xe2\x62\xcf\xb4\xdc\x61\xe2\xaf\xc4\xd7\x76\x2b\x27\x7d\xfd\xfe\x66\xdb\x35\x51\x60\xfe\xc0\x9e\x4b\xbd\xc0\xb1\xdc\xe1\x8f\x30\x0a\x2c\x77\x18\x26\xfe\x4a\x78\xee\x4e\xc7\x88\xe0\xc9\x0f\x3a\x73\xb7\xb6\x0c\xcf\xb4\xc8\xe6\x3e\x45\x76\x48\x4e\xcc\x38\x96\xfb\xc3\x21\x61\x88\x86\xb1\xc0\x02\x05\xae\xe5\x0e\xb7\x22\x81\xb7\xf8\x11\x12\x3c\x0b\xac\x68\xb5\x51\x4e\xe9\xf7\x1d\x01\x04\x05\x78\xf4\xc3\x47\xd1\x28\xf1\x57\xc2\x9f\x19\xb6\x85\xbf\x6d\x18\xc3\x28\x42\xb6\x37\xfc\xfe\xe5\x4b\xb6\x51\xab\x27\x8a\x5a\x56\xed\x25\x8a\xb9\x84\xda\x2b\x36\x5b\xcd\x9d\xe4\x1f\x33\x7f\x18\x20\x93\x8c\xac\x30\x32\x56\x21\x99\x7e\xbf\x29\x1d\x62\x7f\x3a\xf3\x82\x99\x13\xde\x27\x4c\xdc\xf9\x3d\x92\x36\x31\x87\x24\xb8\x47\x72\x83\x93\x12\x72\xa7\xe4\x1d\x62\x06\x09\x23\x8f\x52\x12\x58\xae\x49\x96\xb7\x65\x11\xc6\xde\xcc\x8d\x0c\x64\x23\x17\x93\xf0\xfb\x17\xa5\xd2\x52\x1b\x89\x96\x92\xae\xa8\x47\xd2\x35\xad\xd2\xbf\x40\xaf\x17\xac\x12\xb1\xf6\x4c\x4d\x6b\xb6\x1a\x4a\x51\x6b\x1d\x3d\x74\x2a\xf8\xc3\x9f\x90\xd5\x3d\xfa\xa3\xe5\xc7\xaa\xf7\x32\x9f\xd0\x4a\xc9\x1d\x98\x8f\xc5\xee\xd7\x1d\xcc\xc2\xc8\xb6\x5c\x12\xde\xd2\xbc\x17\xba\x5b\xef\x06\x05\x89\xb3\xc1\x0d\xbd\x07\xa1\xfb\xf5\xee\x5d\xfe\x96\xde\xbd\xd0\xdd\x7a\xb7\xf2\x96\x4b\xbd\x1b\x7a\x0f\x42\x77\xeb\xf5\x67\x46\x38\x33\x6e\xe8\xdc\x0a\x7c\x46\x9f\x6d\x85\xa3\xe9\x8c\xcc\x6e\x31\x7b\x2c\x76\xbf\x6e\x42\x82\x5b\xb4\xc6\xf7\xef\xd6\x16\x87\xf1\x2d\x75\x5b\x81\xbb\xf5\x6d\xb3\xd2\x88\x20\xf3\xb6\xda\x13\xb9\x9f\xac\x7d\x97\x29\xc9\xf4\xc7\x9d\x66\x0c\xe4\xde\x50\x6e\x20\xf7\x6e\xc0\xbb\xec\x77\x0b\xeb\x9b\xc8\x67\x75\x6e\xfa\x00\x1f\xab\xdd\x48\xed\x34\xc7\xb2\xe7\x8a\x2f\xa6\xdc\xdb\xb2\xfb\xd4\xf8\x91\xd8\x21\xd1\x7d\x20\xb9\x4f\x5c\xb7\xe5\x0e\x89\xe8\x03\xb9\x7d\x62\xf9\x50\xee\x2e\x7c\x87\x84\x72\x5b\x6e\x9b\x24\x3e\x94\xd9\x87\xfc\x07\x92\x9b\x38\xbe\x2d\xb2\x8d\xcd\xdb\x32\x27\xa1\x70\x5b\xd4\x40\xee\x6d\x81\x37\x57\xbd\x4b\x6a\xe3\x79\x3b\x41\xb5\xd7\x52\xb5\x66\xb1\xa6\x1d\x0b\xdb\xfe\x30\x9c\xda\x3b\x89\x66\xa6\xa0\x56\x95\x77\xba\xbe\x7f\xd9\xf6\x8d\x35\xe4\x90\x3f\xdf\xbe\x4b\xb4\x56\x3e\xf9\x73\xf7\xc8\xf7\x44\x13\x8f\x88\x83\xfe\x4c\xfc\xfe\x3d\x51\x5b\xb8\x24\xf8\x33\xf1\x7b\xdc\x65\xce\x34\x54\xa5\xa5\xbe\x69\x7e\xd3\xf7\xe5\x44\xe3\xe9\xcd\x9d\xe2\x4c\xad\x5a\x55\xb5\xd6\x0d\xcd\x5b\x81\x44\x4d\x3b\x55\x90\x28\x36\x13\x5f\xdf\xfa\xb7\x6f\xdf\x85\xb1\x92\xaf\xe7\x96\xdf\x8a\xbf\xb3\xb9\x67\xe8\xc3\xf2\x9c\x70\xa9\xd5\x5a\x67\x7c\x26\xba\xc5\x56\x61\x0f\xeb\xb8\x43\x7b\x62\xfe\xa0\xe5\x0c\xc8\x67\x0a\xff\x4e\x49\x4c\x40\xbd\x92\xf2\x87\x9b\x51\x8c\x1f\x78\x98\x98\xb3\x00\xd9\x09\x1b\xb9\xc3\x19\x1a\x92\x98\x86\x3b\x3b\xe0\x1b\x31\x93\x50\x34\xb3\xa3\x1f\x11\x32\x6c\x12\xfa\x08\x93\xcd\x68\xe2\xeb\xd9\xdd\x85\x15\x8d\x7e\x78\x96\x79\x34\x40\x38\x29\xec\xb1\x43\xee\x8a\x19\xbb\xee\xa1\x90\x6f\x0e\x70\x89\xf0\xad\x97\x1f\x27\xdd\x5f\xbf\x24\x12\x89\xb7\x6f\x2c\x33\x81\x47\x28\x40\x38\x22\x41\x62\x8e\x82\x95\xe5\x0e\x7f\x15\xc4\xdf\xe2\xba\xd1\xda\x95\xca\xb7\x58\x7a\xf3\xa0\x8b\x1c\x72\x41\x58\x92\x2e\x09\xcf\x91\x3d\xbb\x24\xcd\x30\xec\xb9\xb8\x8d\xc2\xc8\xf1\x4c\x8b\x5a\xc4\x4c\x58\x6e\x44\x86\x24\xd8\x8b\x7c\xf9\xed\xbc\xee\xf7\x51\xfc\x24\x17\xe1\x43\x44\xec\x06\x02\x09\xc3\x1a\x5a\x6e\x74\x76\x33\x24\x53\x77\xe6\x5c\xbe\xe7\xce\x9c\x70\x66\x10\x37\x0a\x36\x43\xc1\xf3\x62\x6e\x65\x2c\x97\xda\x68\x33\x62\x34\x49\x18\x5d\x86\xb3\x15\x1c\x79\x0e\x31\x3d\x07\x59\xee\x05\x29\x9e\x3f\x07\x1d\x8d\x02\x12\x8e\x3c\xdb\x0c\x13\x11\x59\x9e\x23\xa3\x36\x1a\x5e\x43\x74\xb3\x6e\x76\x8c\xcc\x36\x56\x6d\x0b\x19\x96\x6d\x45\x9b\xc2\x6d\xcb\xff\x46\x89\x6d\xdf\xba\x6d\x0d\xdd\x4d\x5f\x68\x03\x6b\xfb\xcd\x51\x6f\x60\xdf\xb5\xd8\x91\xfe\x23\x1e\x56\x27\x32\x05\x35\x53\x4e\xfc\xfa\xeb\x5b\x55\xfc\xd7\x5f\x09\xf0\xdb\x6f\x37\x9e\x3e\x07\x78\xae\xe7\x5d\x01\x3e\xd2\x78\x52\x97\x67\xda\x4e\xeb\xf9\x23\x4d\xef\xe9\x39\x53\x77\x81\xbf\xad\xce\xf7\x81\xb1\x69\xff\x1e\x8d\x89\x4d\x97\x71\x1b\x0e\xae\x67\x92\xe3\x58\x38\x89\x81\xf7\x46\x4f\xdb\xe7\x47\xcd\x9f\x76\x8c\xb7\x40\x76\xdf\xa1\x70\x74\x04\x46\x7c\xe7\xdb\x7e\x40\xe6\x1f\x0a\x19\x33\x3c\x21\x91\x6d\x85\xd1\x87\xa2\xfb\xde\xf6\x9b\xbb\x6f\xbf\xc6\xb6\x17\x92\xc8\x72\xae\x44\x7e\x9c\x58\x2f\xc4\xd6\x51\x9d\x9f\x76\xea\xf7\xfa\xce\xea\xfb\x60\xe7\x8a\xeb\x5c\x1b\x1b\x9c\xaa\x39\x94\xe2\x9a\xb7\xec\x3a\x5f\x8f\xd6\xd8\x6e\xe0\xf5\xeb\x3e\xc8\x49\x70\x67\x06\xdd\xce\xbc\x98\xd7\x32\x68\xec\xee\x28\x0c\x49\x74\x89\xcf\x6d\xac\x5e\xbd\x8d\x9c\x4d\x58\x5d\x56\xed\x07\x16\x26\xee\x95\x24\x16\xdf\xbc\x96\xe1\xe2\x9b\x09\xd3\x9b\x19\x36\xd9\xf8\x1b\xb6\xe2\x19\xc9\x97\x66\xd1\xa3\x1a\xde\x0d\x59\xb7\x65\x39\xab\xd7\x5d\x01\xaf\xf8\xc6\xee\xc9\x1d\xc3\x67\x8f\xbe\xf1\x7e\xcd\x21\xb6\x1d\xf6\x47\xfd\x61\x3b\xac\xdf\xba\x83\xe5\x5f\x6a\xf8\x85\x77\x91\xeb\x05\xd1\x9e\x8d\xac\x9a\x53\xda\x95\x56\x02\x9c\x37\x9b\x64\x19\xa1\x28\x22\x8e\x1f\x25\x36\x61\x11\x46\xc8\xf1\x13\x9b\x2e\x93\x37\xdb\x7e\x93\x58\x7b\x2e\x79\xdf\xd8\x52\x64\xd9\xb3\xe0\xa8\xa9\xbd\x66\x21\x5a\xf9\xe4\xe3\x4a\xd9\x4e\x4b\x1c\xe9\x7d\x9f\xf6\xf7\x16\xaf\xd4\xce\x6e\x66\xc3\x0b\xce\x2b\xf5\xd7\x98\x89\xff\x4a\x80\xdf\x12\x8a\x96\x4d\x6c\xff\xf9\xbf\xfe\x4a\x88\x82\xc0\x09\xbf\x5d\xac\xab\xe3\x61\xd8\xc3\x55\x76\x3c\xcb\x73\x9c\x73\xaf\xb0\xb1\x9d\x68\xdb\x44\xdd\x45\x40\x9b\xb1\xe3\x13\x50\xc2\x99\xb1\x03\x11\x90\xf0\xa4\x01\xe2\x2e\xf6\x18\x03\x82\xf6\xb1\xf4\x1e\xcf\xd1\x98\xf7\x51\x4c\x47\x93\x75\x77\xb4\x8c\x5b\x60\xd3\x90\xdc\x6a\x61\xde\xe3\x3c\x1a\xc3\x3f\x8a\xf3\xa0\xe2\x7e\x9c\xef\x1a\xb9\xb3\xfb\xc4\x9d\x13\xdb\xf3\xc9\x07\x4d\xda\xc1\xf4\x13\x0d\xd1\xd1\x74\xc7\x13\x14\xbc\xcd\xd7\xfe\x7a\x4f\x3d\x1c\xbc\xe8\x23\x22\xa6\x57\x1a\x9a\x53\x12\xde\xe6\x81\x4f\x34\x9e\x13\x71\x62\xed\x2a\x19\x87\x39\xa2\x87\xc9\x38\x4c\x8a\xff\x7a\x88\xdb\xd3\xc1\xdb\x85\x98\xba\x15\xdd\x47\x33\x5c\x8f\xa2\x3a\x5a\x02\x78\x64\xd8\x15\xb7\xf8\x37\x32\xb5\x15\x86\x33\x12\xdc\xaf\x0a\x7b\xe6\xc5\xd1\xe9\x3b\x5a\x22\xdb\x72\xac\x2b\x3d\x8a\x9b\x63\xc1\x7f\x72\x54\x75\xe4\x9d\x47\xab\x2a\x0f\x8d\xa2\x8e\x9f\x7f\xd5\x38\xea\x48\xe7\xe3\xe3\x9f\x5b\x5a\xb7\x95\x76\xa6\x69\x57\x93\xff\x75\x39\xf0\x4e\xa6\x7b\x1f\x76\xf2\xe3\x35\xb4\xad\x9b\x47\xcb\x93\x54\x7c\xc7\x78\xe3\xdc\x01\x97\xf1\x2a\xe5\xd5\xbb\x78\x84\xdc\x21\xb9\x38\xb0\x3f\x26\xe7\x78\xd9\xee\xf1\x5c\x7d\x98\x3b\x7f\x9c\xa2\xbf\x99\x1f\xc3\x33\x57\x97\xc8\x89\x96\x01\x09\x67\xf6\xc5\xec\x1e\x2d\x1d\xf2\xe1\x78\xee\xb0\xc4\xfa\x38\x9f\x67\xeb\x16\x8f\x92\x7a\xb6\xe2\xfc\xeb\x5d\xc4\xed\x1e\xba\xc5\xde\x4e\xe4\x12\x11\xf7\xb9\xdd\xd9\x0a\xf7\x23\x44\x65\x37\x23\x6b\xea\x05\x1f\x4c\x86\x26\xb2\x4a\x4b\xf9\x80\xb3\xdb\x2a\xc3\x4f\xeb\x2b\x6a\x4d\xb5\xd1\x4a\x14\xb5\x56\xed\x30\xa9\xd8\x51\x2a\x6d\xb5\x99\xf8\xf5\x6b\x3e\xdd\xa8\xf7\x0b\xc5\x0a\x9b\x29\x72\x39\x4d\xe7\xd3\xbd\x4a\xae\xaa\x65\x2b\xb9\x52\x5b\xab\xb7\xd9\x42\x9f\x1b\x54\x73\xcd\x42\x4d\x6b\x67\xd4\x9a\xd2\xec\x42\x3d\x03\x6b\x3d\xb6\xf0\xf5\x5b\x42\xde\x5e\xe2\xee\xff\x10\x80\x6f\x09\xee\x5b\x02\x7c\xdb\xb2\x9c\xf8\xfa\xf5\x5b\xe2\xab\xa2\x2b\x8a\xa2\xfc\xf5\xd7\xd7\xf8\x06\xfb\x76\xef\xf0\xf7\xb7\xef\x1f\x21\x54\x84\x6e\xba\xde\x57\x84\x3e\xdf\x55\xd4\x42\xaf\xdb\x60\xdb\xe5\x1a\xdb\xae\xf1\xe9\x76\xbe\xd0\xd6\x21\xaf\xb6\xeb\xe5\x9a\xc6\xea\x85\x0e\xdf\x6d\x14\x6a\xc5\x86\x56\x2e\x17\xd8\x03\x42\x79\x83\x4c\x12\x24\x59\xe6\x78\x41\xe6\xbe\x25\x98\x1b\x10\xb9\x47\x20\x66\x7a\xe5\xbc\xd8\xd0\xf8\x9a\x56\x54\xeb\x99\xaa\x96\x4b\x43\x8e\x55\x78\x4e\x1c\x08\x75\x2d\xdb\x6c\x54\xf2\xdd\x32\xcc\xa7\x2b\x99\xaa\x5e\x29\xe6\x6a\x7c\x13\xaa\xfd\x6e\xa7\x7d\x80\x08\x4f\x20\x0a\xb7\x21\xf2\xdb\xbf\xe0\xed\xba\x17\x65\xba\x97\xd7\x4b\xdd\x4e\xa5\x5b\xeb\x17\x72\x95\x4e\xab\xdc\xed\x08\xb9\x7c\x41\xe1\x2a\x5a\xbf\xcf\x96\xf4\x72\x15\xd6\x94\x92\xd2\x56\xf5\x5c\x5b\xac\xd4\x33\x4d\x35\xd7\xe9\xd5\xb4\x03\x4a\xe9\x04\x25\x7f\x1b\xa5\x70\x91\xc8\x2b\xde\x7d\x3e\x2b\xf8\x44\xa0\x5c\x9f\xeb\xfb\x6c\xb4\x9c\xce\xf7\xed\x79\x14\x39\x53\x96\xa8\xc0\x89\x84\x88\x92\xc9\x18\x2c\x34\x04\x43\x92\x29\xcb\x21\x2a\x70\x0c\x63\x40\x41\x94\x11\xcb\x53\x44\x19\x1e\x70\xc8\x04\x86\xc0\x1a\x22\xc7\x19\x00\x1a\x44\x96\x37\x54\x81\x27\xaf\x8d\x0e\x01\xb2\x88\x25\x1c\x4b\x29\xcb\x4b\x08\x40\x03\x10\x08\xa8\xc9\x50\xd1\xe4\x18\x09\x33\x14\x61\x93\x05\x86\x88\x31\x90\x30\xc7\x99\x02\x84\x02\x2b\xc8\x92\x28\x31\xac\x80\x18\xf1\x6b\x5c\x7f\x60\x53\x71\xff\xb1\x57\xba\x57\xb6\xf8\x55\x6a\xd5\x2c\xa7\x61\xd6\xcd\xca\x05\x16\x2c\xc7\xe9\x64\x08\x86\x51\xb8\x28\x2e\xd6\x4c\xcf\x6c\x76\xfb\x28\x5d\x42\xb9\xe1\x46\x5e\xd5\xf8\x0a\x5a\xfb\xac\xfe\xa1\xe6\x81\xd2\x63\xf8\x58\x2c\x3d\xf9\x1b\x0a\xf2\xd2\xeb\xeb\x59\xac\x5f\x71\x54\x28\x00\x51\xc2\x08\xb3\x94\x21\x22\x02\x06\x8b\x11\x45\xac\x29\x98\x86\x81\x31\x16\x30\x23\x8b\x90\x81\x54\xa4\x94\x4a\x50\x96\x31\xe6\x90\x21\x22\x51\x16\x36\x8e\x2a\x33\x68\xe3\x64\xaf\x70\x76\x04\x45\x01\x11\xc4\x08\xbc\xc1\x9a\x3c\xe0\x79\xc6\x44\x86\x41\xa1\xc1\xb0\x10\xc9\xc0\xe4\x80\x84\xe9\xc6\x41\x0d\x2a\x08\x98\x50\x81\x60\x56\x66\x28\x23\x98\x02\x00\x02\x47\xbe\xc6\x0d\x07\x23\x08\xb2\x00\x65\x11\x8a\x3b\x8f\xcd\xb0\xf5\xc1\x98\xd1\x66\x82\x07\x8c\x12\xec\xf2\xee\xaa\x36\x6f\x2f\xf3\x5c\xc7\xf7\x26\xc9\x79\x4e\xa9\x45\x19\xa6\xcc\x56\x61\x1a\x8a\x83\x54\x55\x28\x36\x33\xd3\x06\x97\xf4\xd7\xb9\x6e\x59\xaf\xad\xd5\xa1\x35\xb4\x23\xbe\xd4\x54\x48\x16\xf6\x03\x2f\x54\x51\x25\x25\x14\x2b\x6a\xcc\x70\xaf\xde\xa9\x16\xe2\x4f\xc5\xfd\x9f\x6d\x7a\x0b\x0f\xff\x5e\x28\x75\x7d\xe7\x3b\xa0\xa3\x4b\x33\xc7\xaf\xd6\x92\x8d\x52\x2a\xb3\x2e\x82\xce\xa0\x44\x92\x02\x19\x2d\x52\x13\xbe\xc5\x9b\xa3\x45\x5d\x5f\x2c\xd4\x0e\x84\x8e\x3b\x40\xe2\xa8\x53\xa9\xb4\xd3\x6a\x01\xcd\x52\x64\x59\x12\x27\x5a\xb5\xb8\x5e\xd7\x3b\x73\xa6\x57\x93\xc9\xc2\x2f\x2c\x7b\x1d\x25\x57\x8f\x3d\xba\x78\xc1\xa3\xd5\xf0\x92\x57\xbc\x79\x74\x16\x94\x7e\x9e\xeb\xfd\xa4\xeb\x4e\x8f\x46\x2c\x2f\xb3\xa6\x2c\x43\x84\x19\x8e\xa3\x32\x60\x38\x42\x31\x2b\x48\xd4\x10\x0c\x2c\x70\x06\xa1\x40\x96\x0c\x2a\xcb\x92\x89\x05\x09\x1b\x02\xa0\x58\xa4\x92\x64\x40\x8a\xa4\x6d\xda\x7c\x45\x54\x10\xce\x10\x64\xc4\x0a\xac\x40\xb1\x80\x20\x26\xa2\x01\xa8\xc9\x99\x14\x0a\x0c\x8f\x59\x01\x63\x0c\x79\xc2\x49\x48\x20\x00\x4a\x26\xc0\x8c\x29\x70\x10\x21\x06\x70\x54\x94\x44\xe6\x6b\xdc\xcf\xd8\x7b\x34\x7c\xf3\x68\xae\x9d\x1f\x97\x17\xf3\x82\xe3\x55\x2a\xe5\xa4\xc5\x98\x33\x69\x9d\x5b\x0c\x06\x4b\xca\xa6\x52\x23\xc1\xad\xd6\x02\xe4\xd8\x46\x1a\x4e\x90\xb1\x9e\x03\x3d\x5f\x9f\xe4\x7b\x4d\xcc\xe2\x61\x3a\x93\xf5\x3d\xcb\x52\xf3\x0d\x9e\xb2\x4e\x00\xfc\xb4\x9c\x47\xb0\x3f\x4c\xf6\x8c\xad\xb3\xc6\x1e\x7d\xe4\x44\xcd\x46\xa5\xdd\x2e\x84\xe9\x54\x6a\x5d\x08\xc7\x05\xc5\x63\x06\x4a\x3b\x3d\xf1\xa4\x25\xdf\x6c\xf4\xb4\x15\xa2\xd1\x60\xda\x71\x73\x42\xb5\x30\x8e\x06\x9e\x5d\xa2\x4b\x44\x6b\x68\x91\x6a\x71\x5c\xbb\xbd\xb0\xd7\x55\xb3\x56\x2b\xf7\x86\x44\xcb\xa6\x99\x16\x99\xaa\x59\xd9\xeb\xc7\xfa\xab\x17\x3c\xb6\x00\x2e\xd5\xfa\xff\x00\x8f\x35\x28\x23\x4b\x22\x66\x0d\x83\x9a\x06\x8b\x25\x11\xf2\x26\xc7\x1b\x32\x21\x0c\x07\xa0\x41\x29\x8f\x01\x66\x90\x61\x00\x81\x25\x32\x85\x88\x22\x60\x42\x11\x13\xcc\xb1\x86\x40\xa5\x38\x7f\xbe\xc0\xeb\x0d\xcc\x42\xd1\x94\x05\x83\x41\x26\x35\x0d\x99\x35\x44\xd3\xa4\x12\xa0\x26\xcf\x4a\x1c\xcb\xf1\x54\xa6\x54\x92\x18\x5e\xc4\x82\x88\x4c\x8a\x25\x59\x10\x45\xc9\x94\x18\x53\x86\x32\x63\x7e\x8d\xbb\x9d\x7b\x8f\x95\xde\x3c\x56\x2c\x95\x2a\x03\x5b\x5c\xb4\xea\x82\xd2\x82\x52\xa9\x9f\x64\xe6\xb9\x5a\x52\x2a\x59\x29\xa7\xcf\xe5\xc6\x95\x76\x7d\x39\xb7\x2a\x54\x1c\x2a\x6d\xbb\x32\x0b\x18\xab\x97\x2f\x38\xfd\xb6\xd0\x74\x1a\x05\x93\xe6\x74\x79\x55\xcb\x4e\x65\x3b\x57\x5d\xe5\xa6\x3c\x10\x4b\xa1\x01\x7b\x8b\x98\xe1\xd8\x63\x87\x07\xc6\x53\xc1\xb4\x35\x2e\x56\xba\xad\xb9\xa9\x26\x59\x60\x44\x6b\x13\x21\x99\x53\xeb\x51\x7b\x92\xe3\xbb\xcd\x9a\x54\x2e\x36\x94\x95\x5c\x2c\x66\xa4\x12\xcb\x76\x42\xc4\xc9\xb3\x66\x14\x71\x7c\x56\xd6\xbd\xea\xb8\x25\xa4\xf8\x61\xdb\xc8\xa1\x28\x55\xb4\xbb\x48\x1b\x9a\xb6\xb0\x8d\x08\xfd\x82\xc7\x56\x87\x67\x15\x9e\x56\xfe\x67\x78\xac\x28\x62\xc9\xe0\x38\x41\x36\x11\x24\xd4\x34\x45\x86\x0a\x94\x35\x38\x08\x44\x56\x66\x44\x56\xe0\xb1\xc8\x33\x92\xc8\x71\xd8\x64\x19\x96\xe1\x39\xc8\x03\x0c\xb1\x09\x0c\x02\x24\x41\x88\xbd\xed\x05\x5e\x2f\x73\x82\xc1\x02\x51\xde\x74\x5a\x39\x89\x31\xb0\xc8\xca\x86\x60\x42\x1e\xb2\x06\x90\x45\xca\x11\x0c\x04\x2c\x32\x22\x16\x4c\x96\xe5\xb1\xcc\xb2\x22\x90\x4c\x93\x40\x76\xa3\x7c\xd3\xbd\x15\x8e\x3c\x56\x7e\xf3\x58\x28\x0d\x46\x61\x19\xa6\x8c\x4a\x71\x00\x00\x98\x11\xbe\x95\x86\x29\xb0\xa8\xe6\x83\x30\x57\xf1\x65\x31\x39\x64\xd8\x75\x58\x0d\x7a\xfc\xd4\x5b\x6a\xc1\x72\xcc\xb8\x39\x29\xd9\x2e\x16\xc5\xae\x36\xc9\xae\xed\x71\xa3\x41\x02\xae\x33\x6b\x4c\xd6\xcd\xd2\x40\xd1\x75\x1e\xb6\xb6\x9e\x13\x7b\xec\xe2\xc0\x38\x31\x2b\x39\x47\xce\x0c\x7b\x1d\x28\x2b\xb3\x81\x26\xa3\x61\x4e\x5b\x06\x83\xac\x3e\xec\x70\x06\xb5\xf3\xca\xb4\x0e\x93\xcb\x22\x1d\x64\x5a\xdd\x55\xda\x37\x9b\x6d\x3e\x2f\xf5\xfd\xc8\x34\x0b\xe5\x85\x3d\xaf\x87\x69\xdc\xef\x2e\xcd\xe2\x64\xd5\x2c\x0d\xc7\xa6\xb0\x5a\x54\xb7\xfd\xdc\xf6\x05\x8f\xad\xa9\x67\x15\xfe\xff\x85\xc7\x5e\x19\xe5\x5d\xd8\x18\xf0\xd9\xe1\xdd\x6e\x73\xc0\x2b\x46\xf1\xcc\x7e\x10\x15\x8f\x7e\xb7\x9f\x3b\x9d\x56\x63\x57\x90\x60\xaa\x89\x15\x52\x43\xc3\xf1\xb2\x8a\xda\x75\x59\x4c\xaf\x69\x28\x13\x80\xbd\x40\x1b\xf4\xd6\xe9\x6e\x69\x92\xf3\xca\x70\x32\x9f\x2c\x36\xcf\x1f\x0f\xed\x99\xb8\xf3\x0b\xfe\x10\xb6\x83\xfe\xeb\x8c\xbc\x5f\x19\x7f\x62\x10\x7d\x75\xe9\xf6\x39\x9d\xe7\xab\xaf\x4f\x68\xbb\xb2\x76\xfa\x84\xc6\x2b\xab\x9c\x9f\x75\xab\xa3\x95\xce\xa3\xa9\x17\x41\x6d\x69\x39\x5e\x2f\x0a\x83\x76\xbe\x5f\xe4\x4a\x9d\xe2\xa0\xd1\xd5\x5b\x69\x1d\x56\xb8\x7a\xa5\xa7\xd5\xdb\x5a\xb1\xad\x66\xb8\x06\x6c\x70\x19\xb1\xc3\x73\xe9\x6a\x27\xaf\x6e\x47\x3e\x5b\x77\x2a\xf8\xa5\xa8\xb2\xca\xd4\x04\xcf\xc8\x68\xfe\x74\x5c\x35\x74\x27\x5f\x60\x20\x99\xc1\x1e\x40\xd6\x28\x6d\x8c\x93\xb5\x25\x09\xd6\xfd\xee\x21\x82\xe2\xbe\x5f\x26\xfe\xb8\x49\x15\xea\x58\x5a\x4f\x46\xc5\xb2\x5f\xa0\xa2\x5b\xed\xf4\x7d\x05\x56\x9b\x99\x72\xa6\xcb\x0d\xed\x62\x9a\xaf\x47\xd6\xcc\x5a\x34\xbc\x79\x6a\x32\x0c\xb7\x63\x63\x2c\xb7\x17\x38\x7e\x7e\xb8\xff\x13\xe7\x95\xcc\x62\xff\xef\xac\xa2\xc8\x99\xa3\x4c\x94\x9e\x8c\x32\x0a\x1e\xa0\x42\x05\x4c\xcd\xfc\x6a\x51\xef\xa5\x3d\xcd\xea\x27\x27\x6e\x65\xe2\x42\x7d\xbe\xe8\xae\x67\x91\xb6\xc8\x8a\xca\x4c\x8a\xd5\xa1\xbe\xc7\x19\xda\x98\xef\x24\xf5\xe4\xa2\xb6\x48\xae\x69\xcd\x77\xd7\xe5\x66\x43\xa8\x66\x2a\xb6\xeb\x8c\x10\x9f\x83\x35\xbe\x6d\x0c\x72\xd3\x55\xad\x01\xb2\xb9\x09\xad\x18\x23\xbe\x35\x57\xd3\x70\x2c\x05\x83\xe1\xb4\x51\x33\x04\x8a\x18\x41\xee\x94\x4b\xba\x53\x5f\x57\xd2\xfa\x5f\x7f\x9d\xb7\x78\x2f\xae\x1a\xee\xa9\xaa\xa9\x9e\x56\x4d\x36\x3d\xaf\xa5\x1a\x4a\x3f\xa9\x0f\xcc\xd2\x7a\xb0\x52\xd4\x62\xcd\xb1\xca\x45\x7d\x50\x18\xa5\x10\x9a\x37\x27\x05\x30\x08\x22\x2b\x2b\x98\xe1\x70\x5f\x35\xe6\x59\xc6\xfc\x34\xf5\x26\xce\xb7\x9d\xb2\xca\xe7\x3a\xe9\x75\xbf\xdf\xb3\x96\x23\x71\x69\xd2\x96\x56\xd5\xcb\x8e\x50\xf6\xe7\x48\x01\xc3\x96\xc2\xcd\xa1\x38\x69\x00\x39\x1c\x64\x8d\xf4\x90\x5f\x66\xe6\x05\xec\x4d\xc6\x9c\x4b\x9b\x61\x4d\xee\xa5\x04\xbb\x0e\x8a\x85\xa6\x44\xcb\xcd\x60\x1a\x64\x94\x9f\x4e\x3d\xff\x14\xf5\xfa\x39\xf5\xcd\xf6\x4c\x9c\x77\x4b\xb8\x4f\x06\xa3\x96\x5d\x1e\xa8\x26\x23\x75\xb2\x5c\x91\xaf\x05\x6c\xbb\xbd\x2e\x76\x83\x71\xcb\x73\x96\xf3\x88\x2a\x7b\xea\xc9\xb3\xd4\x57\xb5\x21\x6a\x35\x96\xa0\x30\x9d\xb6\xaa\xa3\x46\x7a\x81\xf3\xc9\xe6\x5a\x29\x30\xfa\x8c\x9b\xbb\x2e\xdf\xf0\xba\x20\xdf\x50\x03\xe8\x80\x61\x89\x2b\x0e\x06\xc0\xb2\x7c\x67\xae\x96\xe7\x5d\xba\x4a\x3a\xa0\x2f\x97\xb8\x99\xa5\xf7\x33\xe9\x62\x60\x4f\x97\xa1\x9d\xcf\x88\x7f\x83\xd7\x0b\x4f\x51\xdf\x3e\xa3\x3e\x33\x1d\xab\xec\x3c\x5f\xef\xe2\xde\x5a\xd0\x87\x63\xbf\xcf\xea\xf5\x5a\x57\xcb\xe5\xc4\xb9\xd9\x15\xf2\x2d\xad\x68\x4f\xd2\xe9\xec\x38\xd2\x0e\xd4\xd3\x67\xa9\x6f\xd6\xea\x73\x69\xb9\xca\x4d\x32\x76\xbf\xde\xcf\x17\x16\x50\x6f\xaf\xd4\x46\x52\x5d\x8b\xfd\x51\x5f\x61\x0b\x90\x9b\xf2\xf6\x5c\xf5\x6a\x56\xbb\x9f\x69\xe9\xba\xdc\xed\x4d\x09\x16\x46\xa9\x39\x98\xa8\xd9\x9a\x94\x1d\xf9\x51\xd1\x99\x2a\x2d\x32\xb3\x38\x5a\x6e\xf6\xc6\x83\xf4\x70\x4b\xfd\xf5\xd6\xe5\xd2\x06\x92\x07\x5a\x97\xb7\x4d\x24\xfb\xca\x94\x59\x06\x48\x00\x32\xb2\x28\x41\x96\xf2\x48\x36\x19\x83\xc5\x80\x0a\x98\x41\xc0\x94\x64\x89\x22\x5e\xc6\x86\xcc\x42\x62\x02\x83\x02\xc1\xe0\x0c\x64\x72\x10\x00\x8a\x00\x4b\xe8\x71\xa5\xc6\xa1\xb1\xed\x48\x92\x89\x03\xe6\xc5\x22\x74\x46\x61\x91\x75\xa6\xd5\x65\x94\xe9\xf7\x69\x2f\x12\x61\x44\x1b\xd3\xb2\x9a\x9b\xd5\x79\x98\x13\xe7\xda\xa8\xff\x51\x6f\xed\xca\x86\x91\x4f\x17\xfe\xb0\x69\x64\x5f\x78\x1b\x85\x51\xbc\x1d\xd5\xdc\x6d\x0b\x3b\xbb\xe2\x49\xcc\x67\x87\x34\xe7\x11\x75\x01\xc7\xdb\xdb\xe2\xdb\x57\x51\xce\x51\x6c\x71\x30\xe0\x1e\x4d\x2e\x89\x16\x5e\x30\xf1\x51\x18\xfa\xa3\x00\x85\xe4\x82\xa6\x16\x09\xa3\x44\x33\x9b\x4b\x68\x5b\xe1\xc4\xf7\x44\x93\xf8\x11\x71\x0c\x12\x24\x58\xc0\xdc\x05\x99\x7a\x01\x26\x21\xf6\x3d\xd7\x25\xcb\xc8\x46\x33\x17\x8f\xce\x0d\xc5\xaf\x7a\xdc\xa3\x6c\xcb\xfe\x6e\x29\x35\xbc\x5c\xfe\xff\x1b\xaf\xbc\xfe\x12\x59\x0e\xf9\xe5\xcf\x04\xd8\x2e\xc4\xfe\xb2\x7b\x77\xfe\x97\x3f\x13\xdb\xfb\xf1\x97\x23\x14\xfe\xf2\xe7\xf6\x45\x93\xf8\xcb\xff\xde\x09\x53\x42\xee\x13\x74\xd0\x32\x5a\x86\xd6\xfa\x4e\xf1\x80\x84\x24\x98\x7f\x24\xfc\xe5\xbf\xef\xa1\x62\x97\x6d\x51\x80\x47\xd6\x7c\x77\xf3\x0a\x15\x87\xb2\x33\x3b\x20\x31\x8c\xe0\x97\x3f\x13\xbf\xcc\x19\xe6\x0f\xe6\x0f\xf0\xcb\xee\x06\x9e\x05\x01\x71\xa3\x4a\xcc\xf3\x2f\x7f\x26\x84\xd3\xef\xd3\xf1\xe6\xf1\x0d\xde\xff\xbd\x2f\xc0\xa1\x28\x7b\xc9\x8d\x62\x09\x00\x89\xe1\x0c\x1e\x72\x84\x65\x28\x4b\x78\x1e\x03\x8e\x23\x48\x00\x3c\xc3\x10\x00\x65\x0e\x53\x91\x33\x44\x2c\x52\x11\x9a\x18\x8a\x3c\xc3\x62\x86\x60\xc0\x72\x22\xcb\x1a\xcc\x0e\xd1\x5e\xef\xc6\x7b\x4e\x88\xdb\xdf\x89\xcb\xbe\xa9\xea\x93\x5b\xff\x7d\xf6\x7c\xe8\x22\x7f\x83\x8b\x03\x2c\xa4\xc8\xe0\x28\xe2\xa1\xcc\x4a\x22\x92\x25\x40\xa0\x89\x10\x05\x12\x6f\xc8\x88\x81\x3c\x6b\xb2\x84\xa1\x02\x6f\x00\xc6\x14\x31\x10\x91\x2c\x12\x53\xc4\x04\x43\x1e\x82\x5f\xbe\x5c\xb0\x70\x85\x03\x42\x39\x06\xb1\x00\x71\xb2\x44\x08\xe4\x30\x61\x59\x16\x0a\x04\x49\x0c\x84\x50\x12\x0d\x84\x05\x5e\x14\x44\xca\x71\x26\xc6\x3c\xe5\x28\xc1\x22\x30\x05\xc1\x34\x29\x23\x72\xa6\xfc\x79\x0e\x98\x6f\xef\xef\x79\xb3\xc8\x9f\x45\xaf\x2d\xfb\x2d\x86\x9f\x5d\x76\xfc\x0c\xc3\x4f\xdb\xfa\x49\x5e\xf6\x2f\x07\xff\x72\xf0\x2f\x07\xff\x72\xf0\x2f\x07\xff\x72\xf0\x2f\x07\xff\x72\xf0\x13\x39\x88\x3f\xfd\x9f\xfb\x06\x0d\x9b\x71\x6c\x88\xfd\xf8\x15\xcd\x4b\xd7\x7e\x59\x61\x3b\xf9\x27\x36\x8d\xa6\x34\x1c\xcf\x50\x7e\x31\x46\xc8\x5b\xe7\x41\x69\x34\x92\x09\x17\xcc\x18\x39\xef\x79\x7a\x97\x4f\x8d\xc3\xde\x54\x62\x73\x87\x75\xcc\x5c\xfc\x57\x28\xea\xc3\x42\xbe\x3b\x5a\xc9\x65\xb7\x11\x86\x59\x66\x81\xb2\x7d\xa7\xee\x97\x56\x42\x29\x09\x2a\x52\x2e\x84\x41\x0b\x2b\xc9\x61\x65\xbe\x9f\x11\x28\x59\x4f\x4e\xd3\x3c\x32\xa3\x90\x56\xd2\xd5\x12\x9f\xb2\xf3\x60\xd9\x81\x4d\xaa\xfb\x13\x41\xae\x82\x10\x5a\xf9\x85\x88\xc6\x7e\x4b\x0b\xa5\xa6\x50\x70\xca\x0b\xa8\xea\x29\x59\xf1\x0a\x0b\x5a\xeb\xf7\x41\x11\x33\x2a\x0e\x16\x8b\x8a\x25\x8c\x94\x81\xe6\x37\x91\x5c\x6f\x55\x67\x49\xcf\x5a\xf1\x9d\x51\x26\xbd\x9f\xe1\xc8\xf4\x9f\x5c\xdf\x4b\x3f\x32\x0d\xa6\x2b\xad\x0c\xa9\x0b\x8d\xa8\xda\x21\xc0\x05\xe5\x41\x8d\xb6\xb4\x4a\x8d\x1f\x85\x35\xc7\x13\xdb\x6b\xa3\xae\xce\x1a\x82\x15\xd6\x96\x6a\x3d\xa5\x97\xd3\x52\x61\xed\xe4\xb5\x4c\x41\x6b\x14\xca\x52\x35\xc3\xcf\xfa\x7a\xbe\x85\xda\xce\xbc\x05\xd6\x95\xf9\xb4\x18\xce\x72\x7d\x7d\xd8\x8e\xe1\x34\x5c\x4f\x1f\xe4\x2a\x90\x0c\x99\xbc\xa4\x8b\x58\x37\xbc\xee\x14\x4a\xd6\x54\x2d\x0c\xf3\xe9\x69\x7a\x95\x37\xa6\xc9\x26\x56\x5b\x60\x6a\x8f\xed\x30\x2a\xb5\xab\x26\x50\xfc\xc9\xc8\x5f\x14\xa4\x7e\xc1\x50\x42\x66\x31\xac\x54\xb4\x0e\x8b\xc7\x3e\xa8\x31\xfd\x3c\xbb\xc8\x2e\x9e\xf4\xb7\xe1\xbe\xfe\x17\xcf\xae\xa7\xc6\xd7\xe0\x73\xfe\xab\xab\xe3\x31\x4c\x55\xf1\x68\xa0\xf8\xdd\x2c\x9b\x1e\x49\x35\x90\xab\x8e\x54\x3a\xaa\x26\x9d\x62\x57\xd1\x46\x49\x59\x9c\x95\x8c\x65\x39\xeb\xd9\x79\x65\x02\xd4\x7a\xc7\x16\x5d\xb7\xd6\xa7\x50\x2e\xa5\x95\xf5\x5c\xe1\x91\xd1\x2c\x4d\x87\x2a\x17\x78\x11\xb7\x9a\xd8\x3c\xab\xc7\x33\x5e\xe9\xf9\xd2\xc9\x2f\x82\xb9\x1c\x86\x23\xb7\xd5\x6a\x0a\x70\x54\x2d\xcc\x53\x2d\x65\x81\x66\x8b\xf6\xcc\xe5\x02\x31\xdb\x33\x6a\x8b\x55\x44\x0f\xeb\x26\x4a\x5e\xf0\x4a\x51\xc7\x74\xfb\xb5\x8e\x39\x98\x46\x3d\xbf\x55\x48\x47\x06\xee\x03\x27\xe3\x50\x9c\x2e\x96\xd5\x61\xd7\xb5\xe7\xb9\xe2\x08\xc5\xc5\x8d\x1f\x3a\x5a\xc7\x51\xce\xfc\xef\x28\xbe\x6a\x6c\x26\xa5\xd4\x78\xa1\x9f\xce\x72\x51\xa1\x93\xab\x31\x0d\x4e\x01\x55\x32\xa9\x4b\xa5\x86\xe8\x6a\x8c\x22\x93\xae\x65\xae\x8a\x51\x3c\x0d\x9b\xee\x74\xb4\xdd\x9a\x71\x66\xe6\x71\x5e\xc4\x0b\xd3\x4c\x5d\x5d\xfa\x7a\x8a\xf3\x0a\x5a\x72\xcd\xc0\xc6\xca\x0a\x19\x9b\x56\x73\x7d\x47\xef\x0e\x83\x59\x33\xd9\xda\x9a\xe6\xb4\xc1\xf1\xda\x73\x6e\x8f\x57\x2f\xe3\x7c\x53\xae\x85\x1d\xb7\x53\xc8\x74\x8a\x05\xc0\x67\xe4\x41\x79\xbd\x2e\xf7\xd3\x0d\x33\xe3\xac\x92\xa5\x85\xb3\xb6\x4d\xa8\x63\xa5\x52\x5b\x0e\xda\x58\x19\x4e\x66\x79\xea\x35\xcd\x79\xcf\x2f\x70\x92\xa3\xcd\x83\xa9\x6e\xa1\x6a\xd8\xd4\x9c\x56\xa9\xdb\x6f\xac\x0b\xf3\xa1\x77\x28\xef\xcf\x99\xa1\xbc\xf2\xf2\xd8\x67\x67\x28\x8f\x5e\x20\x7b\xc5\x06\x76\xe6\x5b\xe2\x99\x65\xe9\xaf\xed\x66\xf6\xeb\xb7\x84\xcc\xb2\x1c\x07\x59\xc0\x89\x92\xc0\x43\x28\x48\x00\x7e\x4b\x30\xfb\x06\x2b\x36\xc3\xdf\xd8\xf0\x7e\xb1\x50\x8f\x6f\x26\xff\xe7\x0a\x75\xad\xee\xaf\xbd\x55\xf5\xe9\xda\x3f\x7e\xb3\xea\xb0\x05\x8c\x45\x2c\x0b\x31\x27\x63\x91\x47\x3c\x4f\x31\x44\x86\xc9\x63\x59\x94\x18\x99\x17\x44\x0a\x38\x59\x96\x81\x68\x32\x2c\xe6\xa1\x68\x42\x60\xf0\x80\x8d\x37\xce\xc8\xa2\x29\x22\x6e\xb7\xfd\xf5\xa4\xfd\xaf\x9e\xc5\x7f\xda\x4a\xa5\x41\x05\x94\xf2\xab\x68\xb4\xd0\x18\xbb\x0f\xd0\xca\xf7\x18\x59\x2b\x2c\xe7\x95\xcc\xaa\x26\x44\x69\x15\x67\x3a\xf3\x45\x4e\x5e\x70\xc3\x28\xa8\xb9\x03\xe5\x8e\xeb\xea\x36\x6a\xf5\x2c\x1f\x7d\xde\x7e\x3f\x95\xc4\xe7\xf9\xeb\x3e\xfb\xef\x57\xb8\x2e\xf3\xce\x9b\x1c\x4f\x78\x1e\x30\x82\xc0\x51\x91\x47\xa2\x8c\x91\xc8\x49\x2c\x2f\xc8\x12\xe5\x4d\x99\x02\xc4\xca\x06\xa0\x84\xc3\x84\x93\x30\x4f\x78\x13\x02\x1e\x98\x88\x52\x86\xa5\x94\x6e\x79\x67\xdf\xf3\xfe\x0f\x95\xfb\x55\xbc\x4b\xfc\xe1\xf9\xe2\x4f\xe0\x1d\xb2\x02\x14\x44\x83\xa1\x86\x49\x25\xce\x00\x12\xc3\x42\xca\x49\x02\xa1\xc4\xa4\x40\x06\x32\xc6\xd2\xf6\xbd\x04\x02\x19\xca\x60\x20\xc9\xd0\x64\x04\x9e\x85\xd8\x10\x90\x69\x6e\x79\xe7\x5e\xce\xfb\xa3\xe5\x7e\x15\xef\xb0\x7d\x78\xbe\xfa\x13\x78\x17\x18\x06\x31\x94\x15\x08\x43\x05\x82\x58\x13\x03\x03\x30\x32\xcb\x31\x94\x40\x99\x85\x1c\xc5\x98\x85\x3c\x64\x31\xcb\x89\x58\x90\x25\x40\xb1\x6c\x62\xd3\x14\x4d\x99\x11\x08\x0b\x76\x9b\x92\x6f\xf2\xae\xc0\x7e\x45\x52\xe0\xd8\x1e\xaa\x75\x02\xcc\x76\x1b\x76\x0a\x38\xab\x2f\x45\x3d\xb5\xb0\x0b\x53\xcc\xb5\xb3\x8c\x80\x4a\x5c\xd1\x62\xe2\xb2\x94\xda\x99\xe4\xae\x50\xe7\xfb\x29\xef\xe7\x3d\xfb\x9c\xfd\x1a\x7e\xcc\xfe\xbd\xbc\x23\xd6\x44\x06\xe5\x89\x6c\x32\x22\xcf\x42\x96\x15\x01\xcb\x42\x96\x30\x50\x42\x1c\xc4\x32\xe4\xb0\xcc\x40\x68\xc8\x02\x34\x91\x24\x32\x32\x8b\x64\xd9\xe0\x88\x4c\x39\x24\x23\xc4\x6f\x79\xff\x20\xcf\xcc\x50\xc6\xe8\xf4\x06\x6c\xd6\xee\x75\x51\xd0\x11\xdb\xcb\x85\xd1\xe5\xf2\x5a\x69\xe8\xbb\x9c\xd2\xcc\x8c\x8a\x39\x5f\x30\x96\xcd\x62\x77\xf8\x33\x78\x7f\xc4\xfe\xcf\xe6\x5d\x10\x09\xc7\x32\x22\xe0\x05\x53\x80\xb2\x41\x10\x0f\x28\x6b\x72\x02\x02\x32\x0f\x44\x93\x70\x48\x92\x79\x82\x0d\xc1\x20\x10\x98\x86\x89\x04\x82\x65\x0c\x78\x16\x22\x60\x0a\x88\xd9\x6d\x69\xbe\xc9\xfb\x67\xfb\xc5\x2f\xe1\x5d\x7d\xce\xfe\xcf\xe6\x9d\xc1\xbc\xc0\x8b\x1c\x60\x45\x88\x90\x04\x45\x48\xb0\x84\x25\xc2\x01\x5e\x00\x98\x20\xd1\x40\xa2\x08\x18\x5e\x20\x32\x96\x59\x1e\x19\x06\x14\x4c\x88\x44\x51\x94\x0d\x11\xb3\x12\xda\xf2\x7e\xc1\xdf\xff\xa1\x72\xbf\x8a\xf7\x2a\xff\x73\x79\x97\x89\x41\x88\x49\x0c\x2c\xb0\x26\xe2\x18\xc9\x14\x0d\x93\x13\x78\x91\xe7\x39\x99\x93\x21\x30\x4d\x28\x00\xd1\x30\x24\x83\x22\x49\xa4\x22\x87\x25\x19\x0b\x22\x94\x30\x80\x58\xe0\xe5\x2d\xef\x17\xda\xd5\x7f\xa8\xdc\xaf\xe2\xbd\xd2\xfe\xb9\xbc\x23\xc4\x88\x12\x65\x58\x86\xe5\x0d\x88\x19\x59\xc4\x00\x99\x88\x10\x88\x21\x87\x44\xde\xe4\x20\x95\x65\x9e\x95\x30\xc2\x86\x20\x23\x99\xa1\x94\x93\x64\x91\x15\x25\x5e\x20\x10\xef\xb6\xd7\x5c\xc8\x33\x2f\xcc\xaf\x31\x85\xe9\x4f\xf2\x9e\x7b\xce\xfe\x71\xbd\x7f\xc6\xfe\xcd\x6d\x52\x97\x7f\xbb\xe1\xf3\x03\xb1\x9f\x3d\x0a\xcb\x57\xa4\x82\x3e\xd7\x27\x46\x99\x2d\x28\x5c\xb7\x33\x6e\x04\x65\x67\xdc\x03\x80\xe6\xa5\xb0\x52\x84\x0e\x50\x1b\x8b\x52\x37\xa5\xf4\x38\x65\x3f\x8b\xa3\x5c\x62\xe9\x1d\x6b\x9f\xd8\x2c\xbe\x11\xcf\x74\x94\xf9\xf1\x1b\xac\xe9\x6d\xaf\x73\x53\x29\xd9\x88\x2b\x2f\x1c\x54\x9f\xd5\xcd\x5c\xb3\xbd\x34\x95\x1c\x31\xc4\x9a\x4e\xa2\x95\x5e\x2e\x76\xd1\xda\x36\x9a\xd5\xea\xc8\x29\x94\xb5\x4a\x96\x0f\xa7\x23\x75\xda\x1e\x60\xbd\x0e\xec\x64\x2f\x55\xf3\x93\x5e\xd8\x75\x34\x31\x99\x6b\xf7\x8d\x70\x0d\x05\x9d\x1d\xe7\xf9\x79\xb5\xba\x19\x83\x87\xd3\xa2\xbb\x10\x96\x13\x5f\x4d\x15\xa6\x72\xab\x84\xd2\x76\xce\x58\xd4\x06\x93\x3c\x68\x2e\x0b\x46\x2f\x03\x94\x20\x65\x94\xbb\xcc\xf4\xd0\xd3\xbd\xc1\xc1\xc1\x33\x4e\xf6\xa1\x1d\xc9\xc6\x45\x7d\xc5\x28\xe0\xd1\x5e\xb8\xf2\x82\x51\x40\xae\xd5\x4d\x07\x4f\xd8\x57\x94\x7f\xae\x77\x72\x29\x5b\xfe\xec\x21\xf7\xe3\x41\x76\x63\xaa\x74\x7b\x19\xce\xd0\x61\x3a\xac\x39\x14\x3a\x8c\x33\x65\x88\x5d\xc5\x79\x26\x5a\x8e\x9b\xfd\xf2\x40\x5e\xa8\x43\xaf\x99\x46\xa4\x2b\xb5\xad\x5c\x3c\xf5\x78\x23\xc8\x32\x66\x36\xca\xb3\x4b\x67\xa8\xa7\xaa\x4a\x34\x9d\x52\x3a\x4c\x57\x93\x6d\x3a\xe8\x14\xd6\xb2\x97\x5d\x46\xeb\x9c\x66\x0a\xd2\x24\xe5\xb0\x86\x5d\xcf\xbb\x45\xc3\x98\x11\xe4\x44\xbe\x3e\xcf\xc8\x7c\xd0\x18\xa1\x45\xaa\x10\xa6\x55\x8a\x90\x3c\x1d\x0f\x16\xb0\xef\x77\x26\xf9\x78\x93\x5f\xab\x35\xd1\xd3\x9d\x96\x3c\xf1\xfd\x95\x53\xcb\x34\x06\x63\xc0\xd2\x8c\xe5\x2c\x52\xe3\xf5\x78\xac\x0a\x1a\x56\xb3\x28\xb5\xac\xa4\xa4\x3d\xb0\x7f\x3e\xc8\x9e\x75\xf2\x27\x83\x6c\x0a\x53\xad\xac\xf1\xc2\x20\xfb\x3b\x87\x5e\x77\x05\xd9\x8b\xe7\x57\x1e\x0f\xb2\xec\x19\xfa\x77\x0e\xf7\xc9\xf5\x88\x1b\x41\x96\x1e\xf3\xc3\xb4\x9e\x4a\x2b\xc6\x70\x4a\xe1\xb4\xe6\x45\x28\x1a\x0e\xda\x85\x71\xd6\x0e\x6b\x51\x56\x33\x7d\x88\xec\x41\x43\x48\xe5\x26\x32\xcd\x8f\x93\xf6\x52\x5d\x0d\x95\x41\x77\xdd\x87\xa9\x4a\x9f\x19\x70\xcd\x9c\x88\xc1\x34\x64\x20\x5b\x19\x29\x93\xc9\xbc\x23\xf9\x20\x6e\xc9\xb0\x6d\x76\x43\x3a\xa7\x43\x98\x49\x97\x52\xb5\x1c\x4c\x72\x8b\x49\x69\x5d\x2c\x56\x8c\xaa\xb0\x94\x70\xa6\x44\x1b\x9d\x0c\xad\x74\xa3\xc3\x2b\xcc\xff\x78\x90\x3d\xed\xe4\xcf\x06\xd9\x2a\xd0\x73\x95\x17\x06\xd9\xdf\x39\xaf\x74\x57\x90\xbd\x78\x32\x2d\x1b\x0d\xe7\x8b\xec\xac\xd6\x55\x74\x19\x36\x98\x46\x2b\x6a\x9b\x0b\x2d\x5b\xf0\xb3\xa9\x4c\x9b\xf8\x6b\x53\xaf\xf7\x6c\xcf\xc5\x56\xa5\xa3\x9c\x2e\xfa\xdd\xe8\x2e\x6e\x17\x21\x1f\x5a\xc4\x2b\xa4\xf6\xd7\x41\x9f\xba\xb7\xaf\x17\x54\xc6\x4f\x0a\x51\xba\x3e\x95\xfc\xb6\x97\x57\x7a\xd3\x9a\xdc\x84\x68\x21\xd4\x64\xc3\x95\x60\x63\x55\x5f\x80\x1e\x63\x96\x81\x09\x47\xcd\x86\x08\x67\xf9\xd4\x64\xa4\xac\x32\x9c\x27\xb7\x82\x7a\x4b\x5c\xcb\xe6\x60\x32\x72\x7a\x29\x4d\x99\x48\xee\xd2\x91\x47\x76\x5f\x57\xe3\xa0\x68\x37\x3c\x5a\x22\x05\x46\xb4\x38\x25\x4c\x4f\xc6\x85\x24\x69\xe2\xd4\x3a\x63\x16\x2a\x19\x2d\xec\xf6\xb3\x92\x8b\xb9\x2e\xdb\xe8\x59\x07\x64\x97\x03\xae\x7f\x5a\xa9\x27\x01\x17\x73\xb7\x4d\x50\x47\x0b\xc8\x0f\x24\xa4\xb1\x7b\xa8\x8b\x2b\xd7\x95\x49\xfc\x93\x80\x7f\x89\xfd\x2b\xc9\xe6\x1e\xfb\xe7\x03\xce\x67\x27\x52\x1f\x5a\xb8\x78\xb5\xfd\x4f\x0c\x78\x95\x83\x7d\xfd\x11\xfb\xb9\x4e\x1b\xec\x94\x97\xc5\x31\xb1\xb8\xb1\xe3\x15\xa5\x56\xde\xce\xa6\xc8\x10\x73\xb0\xde\x8b\x0a\xe5\xf2\xba\xdb\x91\x16\x1d\x6b\x90\x46\x99\x99\x50\x11\x8e\xb2\x62\xfa\x10\x70\x8b\x73\xfe\xee\x4a\x48\x2f\x9e\x65\x7e\x7c\x17\xc2\xdf\x98\x90\x8e\x76\x15\x14\xac\x8a\xaf\x6a\x5d\xc8\x8d\x71\x8b\x69\x9a\x13\x9a\x22\x68\x39\x6e\x56\xf2\x2d\x3d\x33\x2c\xba\x04\x44\x1c\x8f\x8a\x64\x65\x8e\x7c\xbb\x13\x75\xe5\x65\x56\x17\x47\x4a\x8b\x93\xf2\xf2\xc4\x0a\xca\xe5\x46\x71\xe5\x95\x67\x13\xaf\xad\x69\x23\x65\x61\x76\x57\xa9\xfa\x58\xc7\x71\xd2\xf0\xa2\x69\xaa\xe5\x83\xae\xee\x16\x1d\xc5\xc2\xb3\x1c\xef\x71\xab\x5e\xbd\x94\xe3\x66\x1d\x8a\x46\xa3\xc9\xd4\x31\xea\xbe\x24\x3a\xd3\x83\x77\xbd\x2a\x21\x3d\x30\x0c\x79\x69\x42\x7a\xd2\xfe\x0b\x13\xd2\x4b\x66\xc0\xde\x5f\x7f\xdb\x0a\xc7\xb3\x09\xe9\xb3\xf6\xff\xf1\x84\xf4\xe2\xe5\x97\x4f\x16\xe2\xbe\x84\xb4\x2d\xd4\x27\x9d\xfc\x89\x6d\x51\x0a\x74\x42\xef\x08\x4a\x7e\x8f\x57\x57\xdd\x72\xd6\xc8\xf6\xe7\xe5\x49\x69\xdc\x2f\x03\x14\xcc\x47\x39\xdb\x4d\xe6\xcb\x20\x09\x95\x95\x38\x04\x28\xc9\x8c\xc6\x8d\x06\xb1\x55\x85\xf0\x0b\x67\x4c\xa6\x1a\x6e\x0c\x59\x87\xcf\xb8\x30\xe2\x95\x71\x69\xad\x84\x59\xbd\x08\xac\x1e\x1a\xe5\x0d\xaf\x54\x2f\x6a\x4a\xfc\x6b\x11\x5f\x3b\xb3\xea\xa8\xaf\xf6\x3a\xc4\x10\x27\xd9\x15\x60\xbc\x92\x9e\xe7\xc6\xd3\x52\x2b\x8c\x0c\x61\xc1\xca\x3e\x59\xe1\x74\x86\x0c\x19\x74\xa8\xe4\xcb\x09\xec\xcc\x09\xae\x24\xb0\x63\xc2\x1f\x98\xac\xb4\x98\x43\xdd\x5d\xb9\x6e\x27\x90\x17\xda\x7f\x2c\x81\x9d\x4f\xe1\xff\xc7\x05\xb0\x72\xba\xb4\xf2\x77\xe3\xcb\xce\xd0\x6a\xf8\x74\x82\x79\xf1\x3a\xe3\xe3\x09\xe6\x3f\x68\xdf\xe5\x8d\x04\x93\xf5\x8b\x13\x79\xca\x81\x68\x4d\xf5\x89\xaf\xcf\x32\x8b\x1c\xb4\x50\x9d\x33\x34\x31\xdb\xc8\x4c\x92\x8b\x36\xd7\x91\x44\x18\x4d\x27\x15\xbd\xc3\x15\x4d\x5e\x60\xbb\x61\xb9\xdd\xf7\xeb\x7a\xa0\x49\x64\x2c\xd2\x09\x98\x2d\x09\x71\xd2\x5a\xb8\x66\x34\xa1\x53\x0d\xe5\x61\x3f\x4e\x02\x05\xb5\x93\xaf\x66\x06\xe2\xb4\x30\x48\xae\xaa\xe3\x71\x3a\x97\xad\xf9\x81\xef\x28\xed\x9e\xbf\x6a\x36\x83\x88\x61\xc4\x81\xe3\xb0\x0b\xef\x80\xed\x3f\x24\xc1\x3c\x14\xe0\x2f\xb4\x7f\xee\x3b\x77\xd9\xbf\x9c\x60\xfe\x93\x86\x2c\xca\x85\x04\xf3\x37\xe2\x7b\x4d\x82\x79\xf1\x82\xfa\xe3\x09\xe6\xc6\x44\xea\x51\x7d\x3c\xf6\x7b\x52\xdb\x9a\xd9\x67\x8d\xf3\x89\xbf\xa3\x0b\xbd\xc9\xa7\x95\x79\x38\x13\x68\x72\x0e\x3b\x41\x29\x5b\x28\xcf\x58\xa9\xbb\x50\xd9\xf5\x22\xab\x0b\x76\xb5\xeb\x66\x60\xce\x1b\x36\xed\x56\x4a\x1b\x2f\x87\x85\x65\x16\x4e\x26\x83\x42\xb5\xcb\xda\x93\x71\x7f\x99\x92\x9b\xbc\x10\x16\x4b\xf9\x4c\x8d\x9f\x8f\xc5\xe4\xb0\x38\x5f\x16\x82\x85\x68\xa7\x77\x01\xef\x06\x30\x12\xa5\x76\xe4\x2d\xc7\xdd\x79\xab\x93\x6f\x64\x27\x02\xd6\x18\x26\x1d\xcc\x2a\x49\xcf\x60\xeb\x45\x37\x37\xe0\x17\x85\x65\xfb\x30\x17\x7c\x39\x99\x5c\x9e\x74\xfc\x2c\x37\x47\x0e\xac\x3c\x97\x9c\x63\xaf\x3c\xd2\xf7\xae\x87\xf3\x77\x24\xbc\x87\x12\xce\x0b\xed\x9f\xfb\xf2\x5d\xf6\x8f\x86\x84\x2f\xdc\x0c\xf2\xd0\xa4\xf8\xab\xed\x7f\x34\x24\x7c\x77\xff\xac\x85\x3f\x7f\x70\x5b\xbf\x0f\x25\xf4\xa3\xa2\xfd\xc4\x5c\x72\xcf\x5c\xd6\x6b\x77\xd4\xfc\xfb\x46\xcd\x23\x6f\xd4\xc4\xc9\x68\x3a\x42\x75\x75\x54\xaa\xd0\xb4\x1d\x66\xa2\x60\x46\x0b\x35\xa7\xd5\xa2\x82\x9d\x19\x97\x57\x8c\xe3\x17\x52\xb5\x52\xdf\x19\xe5\x04\xe9\x68\x89\xb9\xbe\x69\x72\xa5\x33\xbe\xe2\x09\xbc\xe4\xf6\xf3\x8d\x9e\xdd\x51\x11\x1f\x99\x7b\xaa\x1d\xea\xee\xe8\x6d\xa0\xe3\xeb\x83\x44\xf7\x3a\xfb\x99\x4f\xda\xbf\xf5\xf6\xd1\x8d\x13\x56\x3e\xbb\xf5\xe9\xec\x94\x95\xb7\x98\x3b\xde\xbb\xb4\xfd\x1d\xf3\x43\x1d\x5d\xe8\x2d\x5d\xd7\xb2\x1f\x4f\x6d\x7f\xfd\xfc\x9d\x96\xab\xa7\x42\xbf\x3f\x2c\x7f\x7f\x1a\xf6\xdb\x49\x2c\x1f\x14\xf3\xf8\xd4\xfe\xf8\xac\xfe\x23\x8d\xf1\xab\xb6\x4a\x36\x7b\xe1\xfc\xda\xbd\xc1\x44\xbd\x51\xac\x2a\x8d\x7e\xa2\xac\xf6\x13\xbf\xee\x8f\xf6\xfa\xb6\x3f\x37\xfa\xea\x29\xce\x87\xa3\x70\x5f\x0a\x3c\xbc\x81\x3a\xbc\x05\xf9\xd2\xa9\xba\x9b\xff\x5e\x04\xcf\x40\xee\x25\x64\x6f\x06\x4e\x41\x6d\x0f\xf2\xbb\x7d\xe4\xee\xd5\xf3\x60\x5f\x02\xf7\x44\xf9\x25\xe0\x37\xac\x27\xda\x5a\x51\x6f\xab\x89\xc3\xe9\x3e\x9f\x2a\xc9\x6b\xf8\xfe\x64\x01\xde\xd7\xc1\xe1\x14\xe2\x2b\x27\xe8\xbe\x1d\xba\xfa\x1a\xbc\x5b\x65\x97\x80\x1e\x99\x39\x45\xb8\x3b\xd7\xf5\xf2\x79\xae\x6f\x87\x8e\xbe\x04\x5c\xac\xeb\x12\xb6\x83\x91\x53\x68\x96\xff\x2d\x3e\xe5\xf5\xe6\xf9\xa5\x27\xff\x78\x15\xd2\x23\x95\x17\x01\x9f\x9b\xbc\x54\xe9\x57\x0e\x39\xdd\xfd\xef\x75\x48\xc3\x99\x71\x05\xe3\x9b\x99\x53\x74\xf1\xf9\xa8\x37\x4e\x3c\x3d\xfa\xf8\x22\x90\x07\x85\x97\x80\x9e\x99\xbb\x2b\x87\x1d\xfd\xd8\xe2\xd1\xf9\x99\xaf\x41\x7b\x50\x78\x09\xed\x99\xb9\x53\xb4\x6f\xe7\x86\xde\x38\x97\xf3\xe8\xe3\xab\xf0\xee\x15\x5e\xc4\x7b\x6a\xee\x14\xef\xfe\x68\xcf\x1b\x47\x76\x1e\x1f\x8c\xf8\x1a\xc0\x07\x85\x97\x00\x9f\x99\xbb\xda\x35\xd8\x1e\xd9\xf9\xed\x70\x1e\xe7\xcd\x33\x19\x4f\x4f\x30\x7c\x51\x39\x8e\x54\x5e\x2c\xc9\xb9\xc9\x4b\x59\x22\x24\xd3\x6f\x6f\x87\x10\x5e\x3f\x2f\xf1\xe8\xb4\xc0\x57\x61\xbf\x09\xfc\x29\xd4\x67\x5d\xd4\xb3\x43\xfc\x5e\x83\xff\x54\xe9\xa5\x42\x5c\x30\x7b\xb5\x24\xc7\x67\x19\x5e\xeb\x6a\xee\x0e\x3a\xdd\xff\x0a\x41\x51\xcb\xaa\xbd\xfb\x4e\x59\x8c\x45\xcf\xf5\x24\x6a\xda\xa1\x17\xdb\x6e\x16\xb5\x7c\xc2\x88\x02\x42\x12\x6f\x47\xaa\xfe\x96\xe8\x16\xd4\x86\x9a\x38\x3e\x62\xf5\xf0\x1a\xfd\xfb\x8e\x26\x09\xa3\x6d\x5b\xbe\x29\xc5\xc3\x28\x4f\xd5\x6c\x40\xee\xfa\x29\x27\x10\x8f\xcf\xd9\xff\x76\x7c\xaa\xfe\xb7\xed\x69\xf7\xef\xd0\x6d\xaa\xc1\x58\x85\x64\xfa\x30\xb0\xbd\x86\x0d\xa6\x43\x60\x9c\xc0\xba\xde\x55\xdc\x88\x53\x42\x9e\x87\xf0\xa6\x64\x8b\xe2\x28\xc1\xdc\x09\x64\x77\xe7\x39\x20\xc7\x4a\x36\x40\x4e\x3b\xc2\x77\x22\x09\xb1\x4f\xdc\xf9\x93\x48\x8e\x95\x6c\x90\x1c\xfd\xa4\xf5\xfd\x30\x76\x0d\xea\xd3\x48\x8e\xf5\xec\xc0\xbc\xf5\x12\x4e\xc1\x1c\x9f\xa5\x7d\x2b\x7d\x3d\x87\xe8\x5c\xd1\x06\xd2\x59\x6e\xfc\x90\xa3\xba\x17\x46\xc3\x80\x34\xf5\x4a\xe2\xed\x77\x8c\x13\xe6\xcc\xf1\x13\xd8\x73\x7c\x9b\x44\x24\x36\xfb\xff\x02\x00\x00\xff\xff\xe7\x00\x3f\xf5\x43\x97\x00\x00") func failed_transactionsCoreSqlBytes() ([]byte, error) { @@ -770,46 +252,6 @@ func ingest_asset_statsHorizonSql() (*asset, error) { return a, nil } -var _kahuna2CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x57\x93\xe2\xca\xb2\xee\xfb\xfc\x0a\xc5\xbc\xf4\xac\xa0\xd7\x42\xde\xcc\xdc\xd9\x11\xc2\x5b\x09\x27\xdc\x8d\x1b\x13\x55\xaa\x12\x08\x84\x24\x64\x70\x27\xce\x7f\xbf\x81\x84\x11\x34\xd0\x34\xf4\xec\x73\x56\xec\xa5\x87\x99\x06\xa5\xbe\xfc\x2a\x33\x2b\xcb\x52\xfa\xf3\xcf\x2f\x7f\xfe\x49\x34\x1c\x3f\x18\x79\xb8\xdd\xac\x11\x08\x04\x00\x02\x1f\x13\x28\x9c\xb9\x5f\xfe\xfc\xf3\xcb\xf6\x7e\x2e\x9c\xb9\x18\x11\x86\xe7\xcc\x8e\x02\x0b\xec\xf9\xa6\x63\x13\xd2\x5f\xfc\x5f\x54\x42\x0a\xae\x09\x77\xf4\x6b\xfb\xf8\x99\xc8\x97\x76\xbe\x43\xf8\x01\x08\xf0\x0c\xdb\xc1\xaf\xc0\x9c\x61\x27\x0c\x88\x9f\x04\xf9\x23\xba\x65\x39\xfa\xf4\xed\xb7\x26\xb2\xf0\x2f\xd3\xfe\x15\x78\xc0\xf6\x81\x1e\x98\x8e\xfd\xcb\xc7\xfe\x16\xf7\xad\xb0\x6e\x99\x5b\x68\x6c\xeb\x0e\x32\xed\x11\xf1\x93\x78\xd1\x3a\x05\xf1\xe5\xc7\x5e\xb7\x8d\x80\x87\x7e\xe9\x8e\x6d\x38\xde\xcc\xb4\x47\xbf\xfc\xc0\x33\xed\x91\x4f\xfc\x24\x1c\x7b\x87\x31\xc6\xfa\xf4\x97\x11\xda\xb1\x2e\xe8\x20\x13\x6f\xef\x1b\xc0\xf2\xf1\x89\x9a\x99\x69\xff\x9a\x61\xdf\x07\xa3\x48\x60\x09\x3c\xdb\xb4\x47\xb1\x88\xe7\x2c\x7f\xf9\x58\x0f\x3d\x33\x58\x6f\xc1\x0d\xe3\xc7\xce\x00\x18\x78\xfa\xf8\x97\x0b\x82\x31\xf1\x93\x70\x43\x68\x99\xfa\xeb\xd6\x62\x3a\x08\x80\xe5\x8c\x7e\x7c\xf9\x92\x6b\xa9\x0d\xa2\xac\xe4\xf2\x7d\xa2\x5c\x20\xf2\xfd\x72\xbb\xd3\xde\x49\xfe\x15\xba\x23\x0f\x20\x3c\x36\xfd\x00\xae\x7d\x3c\xff\x71\x53\xda\xd7\xdd\x79\xe8\x78\xe1\xcc\xbf\x4f\x18\xdb\x8b\x7b\x24\x2d\x8c\x46\xd8\xbb\x47\x72\xcb\xd3\xc0\xf8\x4e\xc9\x3b\xc4\x20\xf6\x03\xc7\x30\xb0\x67\xda\x08\xaf\x6e\xcb\x02\x5d\x77\x42\x3b\x80\xc0\x02\xb6\x8e\xfd\x1f\x5f\xe4\x5a\x27\xdf\x22\x3a\x72\xa6\x96\x4f\x48\xab\x4a\x6d\x70\xc1\xbc\x8e\xb7\x26\x22\xf4\xac\xaa\xb4\x3b\x2d\xb9\xac\x74\x12\x0f\x9d\x0a\xfe\x72\xa7\x78\x7d\x0f\x7e\xb0\x7a\x1f\xfa\x20\xf3\x01\x54\x03\xdf\xc1\x39\x29\x76\x3f\xb6\x17\xfa\x81\x65\xda\xd8\xbf\x85\x7c\x10\xba\x1b\x77\xcb\x02\x47\xd9\xe0\x06\xee\x51\xe8\x7e\xdc\x43\xc8\xdf\xc2\x3d\x08\xdd\x8d\x1b\xcb\x9b\xb6\xe1\xdc\xc0\x3d\x0a\xdd\x8d\xeb\x86\xd0\x0f\xe1\x0d\xcc\x58\xe0\x23\x78\x96\xe9\x8f\xe7\x21\x0e\x6f\x59\x36\x29\x76\x3f\x36\xc6\xde\x2d\xb3\x46\xf7\xef\x46\x8b\xaa\xf1\x2d\xb8\x58\xe0\x6e\xbc\x38\x2b\x8d\x31\x40\xb7\x61\x4f\xe4\x7e\x33\xfa\x2e\x53\xe2\xf9\xaf\x3b\xd5\x40\x60\xdf\x00\x87\xc0\xbe\x9b\xf0\x2e\xfb\xdd\xe2\xba\x17\xf9\x28\xe6\xb6\x0f\xf0\x3e\xec\x56\x6a\x87\x1c\xc9\x9e\x03\x5f\x4c\xb9\xb7\x65\x0f\xa9\xf1\x3d\xb1\x63\xa2\x7b\x47\xf2\x90\xb8\x6e\xcb\x1d\x13\xd1\x3b\x72\x87\xc4\xf2\xae\xdc\x5d\xfc\x8e\x09\xe5\xb6\x5c\x9c\x24\xde\x95\x39\x54\xf9\x77\x24\xb7\xf5\xf8\xb6\x48\x5c\x37\x6f\xcb\x9c\x54\x85\xdb\xa2\x10\xd8\xb7\x05\xf6\xa1\x7a\x97\xd4\x36\xf2\x76\x82\xf9\x7e\x27\xaf\xb4\xcb\xaa\x92\x14\xb6\xdc\x91\x3f\xb7\x76\x12\xed\x6c\x29\x5f\x97\xdf\x60\xfd\xf8\x12\xf7\x8d\x15\x30\xc3\xdf\xf7\xdf\x11\x9d\xb5\x8b\xbf\xef\x1e\xf9\x41\xb4\xf5\x31\x9e\x81\xef\xc4\x9f\x3f\x08\x75\x69\x63\xef\x3b\xf1\x67\xd4\x65\xce\xb6\xf2\x72\x27\xbf\x47\xde\xe3\x7d\x39\x41\x3c\xbd\xb9\x03\xce\xaa\xf5\x7a\x5e\xe9\xdc\x40\x8e\x05\x08\x55\x39\x05\x20\xca\x6d\xe2\x65\xdf\xbf\xdd\x7f\xe7\x47\x20\x2f\xe7\x9a\xf7\xc5\xdf\xe9\x3c\x58\xe8\xdd\xf2\x9c\xd8\x52\x51\x3b\x67\xf6\x24\x7a\xe5\x4e\xe9\x40\x2b\xd9\xa1\x3d\x51\x7f\x44\x39\x23\xf2\x91\xc2\xbf\x01\x89\x0c\xd0\xa8\xa5\xdd\xd1\x76\x14\xe3\x7a\x8e\x8e\x51\xe8\x01\x8b\xb0\x80\x3d\x0a\xc1\x08\x47\x66\xb8\xb3\x03\xbe\x15\x43\xd8\x00\xa1\x15\xfc\x0a\x00\xb4\xb0\xef\x02\x1d\x6f\x47\x13\x2f\x67\x77\x97\x66\x30\xfe\xe5\x98\x28\x31\x40\x38\x29\x6c\x32\x20\x77\xc5\x8c\x42\xf7\x58\xc8\x7d\x00\x5c\x32\x78\x1c\xe5\xc9\xa4\xfb\xed\x0b\x41\x10\xfb\x6f\x4c\x44\xe8\x63\xe0\x01\x3d\xc0\x1e\xb1\x00\xde\xda\xb4\x47\xdf\x38\xfe\x8f\xc8\x37\x8a\x56\xab\xbd\x46\xd2\xdb\x07\x6d\x30\xc3\x17\x84\x45\xf1\x92\xf0\x02\x58\xe1\x25\x69\x8a\xa2\xcf\xc5\x2d\xe0\x07\x33\x07\x99\x86\x89\x11\x61\xda\x01\x1e\x61\xef\x20\xf2\xe5\x8f\x73\xdf\x1f\x6a\xf1\x93\xb6\xf0\x1f\x32\xc4\x6e\x20\x40\x40\x73\x64\xda\xc1\xd9\x4d\x1f\xcf\xed\x70\x76\xf9\x9e\x1d\xce\xfc\x10\x62\x3b\xf0\xb6\x43\xc1\xf3\x62\xc6\x32\xa6\x6d\x58\x60\x3b\x62\x44\xd8\x0f\x2e\xd3\x89\x05\xc7\xce\x0c\x23\x67\x06\x4c\xfb\x82\x14\xcb\x9e\x93\x0e\xc6\x1e\xf6\xc7\x8e\x85\x7c\x22\xc0\xab\x73\x66\x86\x05\x46\xd7\x18\xdd\xf4\xcd\xce\x22\xe1\x56\xab\x65\x02\x68\x5a\x66\xb0\x2d\x5c\x5c\xfe\xbd\x49\x2c\xeb\xd6\x6d\x73\x64\x6f\xfb\x42\x5b\x5a\xf1\x37\x89\xde\xc0\xa1\x6b\xb1\x33\xfa\xaf\x68\x58\x4d\x64\x4b\xf9\x6c\x95\xf8\xf6\x6d\xef\x8a\x7f\xfd\x24\xc8\x3f\xfe\xb8\xf1\xf4\x39\xc1\x73\x9c\x37\x05\x78\x0f\xf1\xc4\x97\x67\x68\xa7\x7e\x7e\x0f\xe9\xad\x79\xce\xe0\x2e\xd8\x2f\xc6\x7c\x5b\x31\xb6\xed\xdf\xa3\x75\x62\xdb\x65\x8c\xab\x83\xed\x20\x9c\xac\x0b\x27\x75\xe0\xad\xd2\xd3\xf6\xf9\x51\xf5\xa7\x1d\xe3\x98\xc8\xee\x3b\xe0\x8f\x13\x64\xf8\x37\xb1\xed\x7a\x78\xf1\xae\x10\x0c\xf5\x29\x0e\x2c\xd3\x0f\xde\x15\x3d\xf4\xb6\xf7\xe1\x1e\x7f\xad\x5b\x8e\x8f\x03\x73\x76\xa5\xe6\x47\x89\xf5\x42\xdd\x4a\xf8\xfc\xb4\x53\x7f\xc0\x3b\xf3\xf7\x51\xcf\x95\xd0\xb9\x36\x36\x38\x85\x39\x96\xe2\x5a\xb4\xec\x3a\x5f\x8f\x7a\x6c\x37\xf0\xfa\x76\xa8\xe4\xd8\xbb\x33\x83\xc6\x33\x2f\xe8\x5a\x06\x8d\xc2\x1d\xf8\x3e\x0e\x2e\xd9\x33\xae\xab\x57\x6f\x83\xd9\xb6\x5a\x5d\x86\x76\x3d\x53\xc7\xf6\x95\x24\x16\xdd\xbc\x96\xe1\xa2\x9b\x04\x72\x42\x68\xe1\x6d\xbc\xe9\x66\x34\x23\xf9\xa9\x59\x34\xe1\xe1\xdd\x90\x35\x2e\xcb\x99\x5f\x77\x05\xbc\x12\x1b\xbb\x27\x77\x16\x3e\x7b\x74\x6f\xf7\x6b\x01\x11\x77\xd8\x1f\x8d\x87\x78\x58\x1f\x87\x83\xe9\x5e\x6a\xf8\xb9\x37\x35\xd7\xf1\x82\x83\x35\x72\xf9\x82\xac\xd5\x3a\x04\x79\xde\x6c\xe2\x55\x00\x82\x00\xcf\xdc\x80\xd8\x56\x0b\x3f\x00\x33\x97\xd8\x76\x99\x9c\x30\xfe\x86\xd8\x38\x36\x7e\xdb\xd8\x1a\xc0\xb4\x42\x2f\xd1\xd4\x5e\xd3\x10\xac\x5d\xfc\xbe\x53\xe2\x69\x89\x04\xee\xdb\xb4\x7f\xd0\x78\xc5\x3b\xbb\x99\x0d\xc7\x3b\x77\xea\xb7\xc8\x12\xff\x22\xc8\x3f\x08\x59\xc9\x11\xf1\xc7\xff\xf3\x93\xe0\x39\x8e\xe1\xfe\xb8\xe8\xab\xe4\x30\xec\x61\x97\x25\x67\x79\x92\x39\xf7\x8a\x35\xe2\x89\xb6\x6d\xad\xbb\x48\x68\x3b\x76\x7c\x82\x8a\x1f\xc2\x1d\x09\x0f\xfb\x27\x0d\x10\x73\xb1\xc7\xe8\x61\x70\xa8\x4b\x6f\xf9\x24\xc6\xbc\x8f\x72\x4a\x4c\xd6\xdd\xd1\x32\xc6\xc4\xe6\x3e\xbe\xd5\xc2\xbc\xe5\x99\x18\xc3\x3f\xca\xf3\x08\x71\x3f\xcf\x37\x8d\xdc\xd9\x7d\x6c\x2f\xb0\xe5\xb8\xf8\x9d\x26\xed\xa8\xfa\x89\x86\x28\x31\xdd\xf1\x84\x09\xf6\xf3\xb5\xdf\xee\xf1\xc3\x31\x8a\xde\x33\xc4\xfc\x4a\x43\x73\x6a\x84\xfd\x3c\xf0\x09\xe2\xb9\x21\x4e\xb4\x5d\x35\xc6\x71\x8e\xe8\x61\x63\x1c\x27\xc5\xbf\x1d\xeb\xed\xe9\xe0\xed\x42\x9d\xba\x55\xbb\x13\x33\x5c\x8f\xb2\x4a\x2c\x01\x3c\x32\xec\x8a\x5a\xfc\x1b\x99\xda\xf4\xfd\x10\x7b\xf7\x43\xe9\x0e\xba\x38\x3a\x7d\x63\x96\xc0\x32\x67\xe6\x95\x1e\xc5\xcd\xb1\xe0\xff\xe4\xa8\x2a\x11\x9d\x89\x55\x95\x87\x46\x51\xc9\xe7\x3f\x6b\x1c\x95\xc0\x7c\x7c\xfc\x73\x0b\x35\x76\xda\x19\xd2\xce\x93\xff\xba\x5c\xf1\x4e\xa6\x7b\x1f\x0e\xf2\xe4\x1a\x5a\x1c\xe6\xc1\xea\x24\x15\xdf\x31\xde\x38\x0f\xc0\x55\xb4\x4a\x79\xf5\xae\x3e\x06\xf6\x08\x5f\x1c\xd8\x27\x8d\x93\x5c\xb6\x7b\x3c\x57\x1f\xe7\xce\x1f\x37\xd1\xbf\xd9\x3e\xd0\x41\xeb\x4b\xc6\x09\x56\x1e\xf6\x43\xeb\x62\x76\x0f\x56\x33\xfc\xee\x78\xee\xb8\xc4\xfa\xb8\x3d\xcf\xd6\x2d\x1e\x35\xea\xd9\x8a\xf3\xb7\xbb\x0c\xb7\x7b\xe8\x96\xf5\x76\x22\x97\x0c\x71\x5f\xd8\x9d\xad\x70\x3f\x62\xa8\xdc\x76\x64\x6d\x38\xde\x3b\x93\xa1\x44\x4e\xee\xc8\xef\xd8\xac\xac\xb4\xf3\xad\x0e\x51\x56\x3a\xea\xc9\x84\x68\x57\xae\x69\xf9\x36\xf1\xed\xa5\x98\xe3\x95\x4e\xab\xd2\xe3\x86\xbc\x92\xed\x95\x58\xad\xdd\xab\x2b\xf9\x41\x41\x10\x5a\x5a\x8b\xae\x77\x54\x5e\x69\xb0\xd5\x7c\xae\x5b\x91\x3b\x9d\xac\xd6\xcf\xb5\x54\x66\x50\x2e\xb4\x5f\x5e\x89\x97\x61\x51\x0a\x87\xcd\x9f\x3f\xb7\x7f\xa3\x52\x85\xda\xfd\xcd\xbd\x5b\x14\xff\x33\xca\xe1\x27\x0a\x91\x69\x35\x06\xa5\x72\x8d\xce\x96\x99\x82\xd2\x64\x33\xfd\x5a\xa1\xae\xe4\x6a\x85\x8a\xa6\x34\x34\xba\x34\x60\x86\xf5\x42\xbb\xa4\x2a\x5a\x36\xaf\xca\xed\x9e\xd0\xcc\x0a\x6a\x9f\x2e\xbd\xbc\x12\x52\x7c\x89\xbb\xff\x25\x92\x7c\x25\xa8\x57\x82\x7c\x8d\xbd\x4b\xbc\x6c\x0b\x27\x37\x65\x59\x96\xa3\xc2\x91\xaf\x04\xb3\xbf\x77\xfc\xf7\x8f\x1f\xef\x31\x7c\xdc\xcc\x7b\x86\x11\x33\x5a\x14\x59\x89\xa4\x44\x89\x7c\x25\xe8\x1b\x1c\xb9\x53\x8e\x2f\xdb\x7b\xb1\x44\x55\x1c\x04\x6d\x36\x37\x64\x69\xda\xb4\x33\xb0\x40\x29\xf6\xaa\xb0\x29\x6d\x06\x85\x5a\xa9\x22\x17\x6d\x98\x6d\xc8\x29\x6a\x0e\x51\xbe\xbc\xdc\xca\xe7\x7f\xbe\x5c\xf7\xe7\xf9\xfc\xdb\x3d\xae\xbc\x02\x75\x7d\x56\xed\xa3\xf1\x71\x3a\xb3\x76\x70\x01\xcf\x20\x49\x34\x38\x86\xc7\x98\x17\x11\x05\x69\x01\x72\x50\x94\x0c\x9a\x01\x06\xc7\x50\x14\x14\x38\x5e\x02\x34\x6b\x00\x83\x62\x49\x06\x20\x12\x72\x34\xe4\x19\x06\x92\x02\xc4\x92\xb4\x35\x32\xf9\xe4\xb5\xc5\xe0\x04\x1a\xd0\x98\xa1\x0d\x83\x66\x45\x40\x0a\x90\xc4\x02\x69\x20\xca\xe0\x11\x43\x89\x3a\x65\x00\x1d\xd1\x24\xe4\x75\x9d\x14\x75\x86\x41\x9c\x20\x70\x34\x27\x89\xbc\x48\xd1\x1c\xa0\xf8\x97\x7d\x80\xc6\x4e\xfd\x5f\x79\x65\xfa\x55\x93\x5d\xa7\xd7\xed\x6a\x46\xc8\xd9\x39\xa9\x44\x93\xab\x49\x26\xe5\x93\xa3\xc0\x5f\x96\x97\x1b\xaa\x8f\xda\xbd\x01\xc8\x54\x40\x61\xb4\x95\xcf\x2b\x6c\x0d\x6c\x5c\xba\xf9\x2e\xf2\x50\xee\x53\x6c\x24\x96\x99\xfe\x1b\x0a\xf2\xa9\xd7\xcb\x59\x9a\xb8\x12\xa8\x0c\x67\x30\x90\x17\x18\x89\x05\x0c\x83\x01\x90\x44\xc1\x60\xf1\x36\x0e\x45\x80\x11\x0b\xb0\x80\x59\x1a\x40\x1a\x61\x4a\xc7\x9c\x0e\x75\x11\x09\x06\x64\x75\x84\x91\xce\x42\x56\xd8\x06\xd9\x67\x04\x3b\x36\x0c\x11\x42\x1e\x19\x06\x2d\x30\x8c\x61\x50\x06\x63\x18\x80\xa3\x58\xca\x60\xb6\x2c\x38\x81\xc2\x98\x41\xa2\x0e\x30\x8f\x20\xa2\x68\x09\x02\x9d\xa3\x28\x03\x90\xd0\x40\x3c\xfb\x12\xa5\x28\x8a\xe3\x24\x4e\x90\x78\x6e\x1f\xb1\x59\xba\x31\x9c\x50\x4a\xc8\x39\x24\xac\x08\x3d\xd6\x5e\xab\x0b\x6d\x55\x64\xba\xae\x33\x4d\x2d\x0a\xb2\x1a\x64\xa9\x2a\x5d\x17\x32\x02\x3f\x0c\x87\xad\x92\x27\x69\xa8\x5f\x85\x9d\xaa\xa9\x5b\x86\x3a\x59\x0b\xf4\x60\x58\xa8\x68\xd3\x4a\xa3\xab\x57\x3b\xdc\x38\x58\x38\xde\x8c\x8a\x23\xa7\xdf\xe8\xd6\xe5\x28\xa2\xca\x87\x7f\xe2\xb4\xe7\x1f\x3f\x2f\xe5\x46\x73\x17\x3b\xcc\x46\x1a\xcf\xe4\xb6\x5b\x93\x02\xb9\xbb\x9a\x06\xab\x1c\xd3\x6f\xab\x2e\x63\x06\xab\xf6\x22\x3f\xab\xf3\xb2\x36\x5d\x66\xda\x6c\xbe\x65\x2f\x52\xb5\x20\x48\xaf\xf5\x4d\x7a\x25\xa6\x53\x56\x21\x23\x92\x9e\xdd\x5d\x09\x13\xba\xee\xcd\x68\x29\xef\x86\xbe\xd6\x4a\x8d\x16\xd2\x30\x42\x2e\x7f\x38\xa2\x73\x64\xe5\xb7\x44\xdd\xef\xbc\xee\x8c\x68\x8a\x82\x0c\x89\x18\x83\x27\x05\x52\x60\x00\x8f\x44\x92\x15\x44\x46\x22\x25\x52\x60\x78\x48\xea\x86\xc4\x00\x2c\xf1\x98\x62\x49\x92\x15\x24\x91\x12\x78\x4a\x60\x25\x81\x84\x50\x84\xb4\xb1\x8d\xc6\x4f\xa9\x15\xc8\x10\x48\x5d\x62\x58\xa4\xeb\x90\x07\xa4\xc1\x32\x06\xc5\x19\x12\x47\x73\x0c\xcd\x03\x24\xe9\x88\x14\x78\x96\xc7\x3c\xcf\x62\x56\x22\x0d\x03\x4a\x86\x40\x02\x03\x23\x88\x0d\x91\x7e\x89\x1a\xff\x43\x44\x53\xfb\x88\xde\xf4\x37\x81\xad\x6a\xce\x86\x9f\xcf\x4a\x92\x5a\x17\xb2\x55\x41\xf3\x6c\x2e\x3b\x5f\x33\xe3\x8d\xb5\x16\x27\xfd\x14\xb9\xc1\x4c\x3e\x28\xc1\xe9\x64\x2a\x07\x54\x87\x5b\xcd\xe5\xfa\x62\x08\xd7\xc0\x84\x9d\x41\x8b\xf5\xcd\x0c\xaf\x0d\x9b\xbc\x29\x85\xb9\x91\xab\x9b\x43\x3d\x6a\x7d\xe3\x88\x5e\x1e\x2d\x6e\x6d\x2a\xd4\xa2\xdc\x2e\xf5\x37\x79\x4b\x36\x48\xae\x36\x56\x84\xb9\x39\xef\xcd\xab\x8b\x49\x69\xdc\x31\x27\x30\x9d\x19\x15\xf9\x82\x1f\x56\x02\x69\xb9\xee\x74\xf4\x35\xed\x34\x9a\xe9\x82\x61\xb5\xb5\x35\x08\x6c\x25\x43\xb7\xc2\xe1\x94\xab\xe4\xd2\xa1\xa1\x57\xd3\xc1\x62\x31\x8a\x6a\x4c\xfd\x42\xc4\x5e\xce\xb1\xff\x01\x11\xcb\x4b\xb4\x4e\xd1\x18\x48\x50\xa2\x28\x4a\xe0\x48\x81\x93\x28\x52\xd7\x29\x28\x21\xce\xe0\x0d\x86\xe6\x0d\x2c\xd0\x0c\xd0\x01\x10\x0d\x81\x91\x30\x23\x90\x18\xeb\x0c\x2f\x21\x11\xb1\xdb\x46\xfa\x53\xa2\x9e\x16\x21\xcf\x00\xc4\xe9\x88\x96\xa0\x08\x01\x49\x33\x82\xa1\x23\x0a\xb1\x50\x27\x59\xcc\x89\xbc\x28\xd1\x90\xd5\x59\x8a\x65\x11\xc5\x93\x0c\x45\x72\x34\x29\x51\x3c\x2d\x0a\xb4\x0e\xb6\x1d\x0e\x36\x11\xb1\xf4\x3e\x62\x57\xc5\x4d\xae\x23\x8d\xf4\x92\x3a\xa3\xe5\x16\xab\x36\xa7\x25\xc5\xcb\x35\xa6\x3c\xdf\x63\x35\x39\x8f\x07\x05\xba\x40\x5a\xcb\x90\xf5\x17\x4e\xab\xdd\x33\xa6\x9b\xfe\x6a\x53\xf3\x16\xb3\xa6\xd5\x81\x2d\x40\xb3\xed\x66\x36\x35\xb6\x27\x65\x24\x14\x36\xb4\x5a\xb7\x56\xf9\xd6\x38\xb6\xf0\x36\x62\x33\x09\x8b\xbb\x6a\xb6\xe2\x4c\xb5\xc6\x9a\x5a\xca\xe9\x3e\x74\xa7\xe1\x2c\x5b\xf5\x24\x65\xc1\x64\xc4\x94\xd1\x2a\x06\x2c\xa2\xd6\xa3\x86\x57\xcd\x2c\x9d\x60\xe2\x75\x37\xed\x19\x1b\x8e\xca\x4c\x5a\x29\x69\x0b\xb9\x63\x8d\x9d\xa9\xd7\xc9\x17\xf2\x64\x4f\x5e\x65\xda\xd9\xd6\xc0\xd1\x7d\x27\x42\x6e\x5e\x88\xd8\x5c\xf9\x92\xd7\xff\x03\x22\x56\x22\x31\x27\xe9\x0c\xcd\x8b\x22\x80\x1c\xa2\x48\x6c\x20\x0c\x48\x1a\xf1\x1c\x32\x10\x83\x20\x05\x81\x48\x1a\x24\x42\x06\xcd\xf2\x14\xcd\x73\x98\x42\x80\xa3\x68\x8a\xe3\x10\x8a\xba\x95\x9f\x12\xf5\x1c\x4f\x23\x8e\x61\x59\x03\xf2\x82\xc1\xb0\x14\x4f\xb3\x12\x0b\x68\x4a\x17\x38\x8a\x02\x3c\x2f\xd1\x80\x85\x24\x27\x09\x12\x4b\xf1\x24\xa0\x44\x0e\x33\x50\x42\x14\xcf\xd3\x9c\xc8\xe9\xdb\x1c\xcb\x25\x22\x96\x39\xf4\x1a\xa6\x7e\x3e\x9c\xc3\x69\xab\x40\x65\xa8\x69\x73\x93\x09\x51\x9f\x16\xd7\x30\xa5\x4f\xbc\xea\xbc\xa1\x73\x2c\x93\x0b\x97\xb4\x3d\xa0\x8a\x41\xda\xe9\x16\xa6\xad\x30\x2f\x96\x53\xad\x9a\x5b\x53\xa9\x1c\xb5\x9a\x67\xed\x00\x6f\x36\xa3\xd4\x74\xd1\x10\x01\xa8\xf1\xfa\x40\x07\xc7\x5e\x43\x26\x11\x44\xf6\x26\xe0\xb5\x4a\x9f\x83\x6b\x3e\xb3\xd4\xb1\x5f\x5b\xf8\x95\x4e\xbd\xd2\xb0\xd3\x83\xb4\x9f\x06\x99\x92\x95\x57\x83\x59\x87\x9b\x2d\x51\xaf\xd6\x55\xf2\x29\xda\xd8\x34\x7b\x95\x4a\xdb\x2c\x95\xb4\x96\x3b\x9b\xce\xdb\xcb\x5e\xdf\xca\x0c\xaa\xc5\x02\x2b\xd8\xad\xa1\xd9\x2b\x2c\xa3\x1c\xab\x5d\x88\xd8\xbc\x7f\xc9\xeb\x7f\xf7\x88\xbd\x32\xca\xbb\xb0\x04\xff\xc4\x98\xf1\xed\xfa\xed\x33\x60\xd7\x16\x18\x9f\xc3\x3c\x5f\x23\x7c\x02\xed\xca\x0a\xdf\x13\x88\x57\xd6\xe2\x3e\x3a\xe2\x4e\xac\xc7\x1d\x67\x3c\xe4\x7e\xbb\x4d\xb7\x59\xae\xdd\xea\x77\xb5\xba\x46\x0f\x06\x6a\xb5\xa4\x09\xb9\x61\x4f\x2d\x37\xb3\x1c\x53\xe8\x77\x6b\x45\x41\xe1\x4a\xed\x36\xcd\x97\x7b\x72\x6d\xa0\x66\x4b\xe5\x6a\x3c\x6a\x88\xc7\xb6\x59\xd1\x05\xd6\xc6\x77\x18\xaf\x65\x29\x83\x25\xd7\xe2\x8d\xd2\x6c\x33\x6d\x16\x98\x21\xa4\x7a\x50\xc0\xb6\x55\xeb\x4f\x7b\xf2\x22\x37\x3e\x46\x5f\xd4\x00\x64\xa3\x3f\xb7\xd5\x2c\x6f\x72\x56\x1e\x2f\xa8\x16\xa5\xbb\x41\x7d\x5e\x59\x77\x45\xbe\x51\x5b\x0c\xc7\x53\xcd\x6a\x37\xa7\x52\x77\xe9\x36\x66\x45\x3a\x65\x86\xb0\x1b\x3d\x94\xd1\x25\x6d\x19\x3f\x3f\x3a\xfc\x13\x35\x68\xd9\xe5\xe1\x73\x4e\x96\xa5\x6c\xa2\x16\x67\x72\x94\xdd\x15\x45\x09\xb6\x4b\xd3\xb5\x24\xcf\x73\x9b\x4d\x37\xd5\xd1\x9b\xd9\x41\x6e\x9c\xcd\x98\x3e\xad\xa9\x78\x53\x08\xd5\x39\x67\x94\x23\xb8\x0c\x32\x0a\xe5\xf5\x7c\xdc\x16\x68\x9d\x75\x94\xa9\xbe\xd9\x54\x07\x1b\xb5\xb1\xc8\xca\x48\xec\x4d\xc3\xb2\x55\x0b\xa7\xe9\xae\x20\x0a\x4a\xbf\xc4\x0e\xdb\xf3\x92\x9b\x57\xd2\xc2\xc2\x0c\x30\x9a\x6d\xec\xba\x9d\x6d\x77\xdb\xe6\xb0\x82\x06\x54\x69\xc5\x87\x1c\xec\x4e\x6c\xb9\xf9\xf3\xe7\x79\x6b\xf1\xc9\xae\x61\x9e\x72\x4d\xfd\xd4\x35\xb9\x4c\xd8\x56\x9b\x59\xa6\xdb\xb0\x8b\x8e\xbc\x96\xac\x45\x65\x5e\x09\x94\x71\xc9\x5c\x97\x4b\x6e\xcb\xca\xcd\x6b\x34\xab\x66\xad\x75\xc5\xda\x1c\x5d\x93\x3b\xcb\x36\x1f\x36\xbd\xcc\xf3\xc3\x62\x71\xd8\x66\x01\x5e\x15\xb1\xe4\x15\xd9\xf6\x66\xd0\xd8\x74\xa5\x75\x1e\xe5\x17\x61\xa7\x51\xa1\x1d\x37\xab\x7a\xba\xbc\xe2\x0b\x2b\x23\x9d\x11\xd4\x85\x6f\x2f\xf8\x4a\x7e\x3d\xd1\x0d\x2f\xdb\x42\x74\xad\xdd\x75\x43\xb6\x32\x99\x68\xc3\xf4\xb0\x81\x53\xcd\xec\xf2\xb7\x9b\x9e\x7d\xca\xf4\xcd\x33\xd3\x67\xc7\x85\xca\x30\xd5\x51\x8c\x52\x3d\x0c\x53\xc3\x6c\x57\x09\x0a\x1e\x1c\x57\xe4\x1a\x5f\xc4\xf5\x31\xe3\xf7\x1b\x03\x76\xdd\xcf\xb7\x8a\xf9\xa3\xe9\xf3\xcf\x9a\x5e\xe8\xb8\x45\x54\x76\xc2\xa0\x28\x56\x52\x13\x5d\xa9\x3a\x1a\xd5\xc5\xe5\x79\x3a\x0d\xf2\x55\xa5\x63\x36\x18\x0a\xf2\xdd\x4e\x56\x30\x54\xb6\xcf\xaa\xeb\x32\x6c\x66\x66\xb5\x4d\x53\x75\x8a\x8b\x72\x07\x3a\x26\xc5\x36\xc7\x8e\xcd\x37\x10\x5a\x3b\xba\xad\xf7\x99\xf6\x3a\x3b\xfa\xed\xa6\xe7\x9e\x32\xbd\x76\x6e\x7a\x26\x35\xd6\x7a\xad\x22\xdb\x59\x4e\xb8\x7c\x38\xf5\x05\xad\xd1\x2f\x3a\x55\x4c\x09\x0d\x35\xc7\xb7\xc5\xf4\xca\x75\x16\xee\x6a\xbc\x72\x8f\xa6\x2f\x3c\x6b\xfa\x89\x5a\x53\x20\x66\x95\x4c\xe8\x8d\x16\xf3\x32\xb4\x3a\x9b\x0d\x26\x6d\xc1\x64\x26\xf2\xb0\x95\x1b\xe6\x3a\x8b\x4d\x2f\x65\xf0\xab\x21\x28\x51\x0b\x76\xba\xca\x50\xed\xf4\xd2\x91\xa5\xd1\x5c\x11\xca\x7e\x83\x62\x5b\xa5\x0a\xcb\xd8\x5a\x97\x5f\x5a\xd3\x75\x5b\x48\x71\xad\xdc\x2e\xea\xaf\xb7\x2e\x97\xb6\x39\x3c\xd0\xba\xec\xb7\x3a\x1c\x9c\x49\x1a\xdc\xb6\x4b\xca\xe8\x06\x07\x59\x51\x90\x18\xda\x60\x49\x20\x32\xba\xc1\x70\x02\x66\x91\xce\x92\x34\x4f\x32\x22\x4b\x93\x3c\x0d\x19\x9e\x23\xb1\x00\x19\x8a\xc7\x0c\x00\x98\x33\xe8\xa4\x53\xa3\xaa\x11\x87\x76\x6d\x6d\xcd\xfb\xea\x7a\x82\x83\xa2\x46\x4d\x72\x56\xc9\x15\x31\x54\x5b\x72\x1f\x59\x8b\xee\x70\x11\xf0\x58\x0b\x70\x6b\x90\x15\xd5\xfc\x7b\x3d\x9d\x2b\xdb\x1a\x3e\x5c\xf8\xe3\xd6\x86\x43\xe1\x2d\xe0\x07\xd1\xa6\x49\xb4\xdb\xbc\x74\x76\x6d\xbb\xe1\x4f\x0f\x07\xce\x6b\xd4\x05\x1e\xbb\x2a\x06\x3c\x7d\x6c\x2e\x76\x37\xcf\x79\xfc\x57\xb4\x3e\xf6\x75\xf7\x93\xe6\xaf\xdf\x09\x2a\x5e\x31\xfb\xea\x63\x6f\x81\xbd\xaf\xdf\x89\xaf\x0b\x8a\xfa\x8b\xfa\x8b\xfc\xba\xbb\xa1\x87\x9e\x87\xed\xa0\x16\x15\xed\xeb\x77\x82\x3b\xfd\x3e\x13\xed\x6b\xf5\xbf\x7e\x27\xfe\xef\x97\xbd\xa2\xff\xfa\x92\x54\x1b\x49\x6e\x81\x21\xa4\x05\x9d\xc4\x2c\x0f\x0d\x64\xb0\x06\x8f\x75\x86\x21\x29\xc8\x92\x3c\x29\x91\x24\x0f\x75\x4e\x67\x18\x83\x93\x04\x81\xd7\x69\x5e\x14\x90\x40\x92\x8c\xc1\x30\x0c\xc3\x0b\x8c\x8e\xd1\x8e\xd1\x01\xd7\xc6\xab\xe0\xeb\xf7\x33\x6d\x71\x61\xb6\x65\xff\xfa\x9d\x20\x4f\x6e\xfd\xf7\xd9\xf3\xbe\x0d\xdc\x2d\x2f\x04\x45\x83\xd6\x05\xc4\x4b\x06\x6b\x48\x0c\x85\x45\x4c\x51\x48\x10\x31\x16\x24\x11\xf3\x3a\x8d\x78\x16\xf2\x34\x66\x69\x9d\xe7\xd8\xed\xf0\x4b\x44\x3a\xc2\x92\x20\x0a\x58\x04\x2c\xf3\xf5\xcb\x05\x0d\x57\x6c\x80\x0d\x86\x02\x34\x09\x18\x69\x0b\xcf\xe8\x98\xa6\x69\x81\xc3\x40\xa4\x04\x41\x10\x79\x08\x74\x8e\xe5\x39\xde\x60\x18\xa4\xeb\xac\xc1\x18\x58\xe7\x49\xb4\x8d\x01\x83\xe2\x19\x24\x7d\xdc\x06\xd4\xeb\xdb\x7b\x4e\x18\xb8\x61\xf0\xb9\x65\xbf\x65\xe1\x67\xd7\x69\x3e\x62\xe1\xa7\x75\xfd\xa6\x28\xfb\xc7\x06\xff\xd8\xe0\x1f\x1b\xfc\x63\x83\x7f\x6c\xf0\x8f\x0d\xfe\xb1\xc1\x3f\x36\xf8\x8d\x36\x88\xfe\xfa\x7f\x5f\xfe\xfb\x9e\x41\xc3\xfe\x20\xa4\xf8\x57\xd6\xe7\x65\x88\x07\x0d\x14\x79\x0f\x92\x8d\x83\xa5\xe3\x4d\x5d\xe0\xfb\xee\xd8\x03\x3e\xbe\x80\xd4\xc1\x7e\x40\xb4\x73\x05\x42\x89\x85\x89\x1f\x44\x1b\xbb\x01\x9e\x41\xec\x11\x34\x49\x71\xf7\x28\x32\x1c\x4f\xc7\xbe\xee\x3a\xf6\xd6\xf6\x16\x08\x6d\x7d\x7c\xae\x28\xfa\x15\xf3\x3d\x60\xf1\x90\x6d\xb7\x4b\xd0\xbf\x5c\xfe\xdd\xa0\x29\x30\x67\x91\x3b\x5f\xcf\xc7\x50\x47\xdf\x7f\x1d\x83\xed\x50\x28\xd2\xfe\x25\xe1\xed\xaf\x06\xc6\xf7\x09\xce\xc0\x2a\x58\xf9\xe6\xe6\x4e\x71\x0f\x47\x03\xb7\x77\x84\xef\x0b\x85\xed\x38\xd6\xd7\xdd\x68\x43\xe2\xa5\xeb\x65\x3f\x42\x8f\xa6\x5c\xe5\x45\xb5\xe7\xea\x42\x55\xe1\xc9\x61\xa7\x57\x57\x35\x6c\xaf\x38\x9f\xcb\x67\x10\xdd\x93\xba\xb3\x14\xe3\x72\x6d\x8a\x2b\x8c\x6a\x4b\xf6\x38\x31\x1b\x4f\x9b\x2c\xa5\x21\x65\x34\x1a\x3d\x72\xcc\xd5\x17\xcd\xea\x48\x14\x29\x63\xca\xe4\xe5\x99\xcc\x36\x47\x03\x4f\xb1\x72\xb6\xbf\x82\x93\x79\xd8\x5f\x1f\x66\x04\x2a\xe6\x93\xd3\x34\x8f\xcc\x28\x64\xe4\x6a\xc1\x53\x2b\x2a\x85\xd0\xa2\x56\x4b\x35\xfc\xc6\x84\x4e\xb1\x68\xa3\xba\x32\x1c\x78\x61\x9f\xaa\x87\x60\xcc\x05\x4b\xb1\x54\xb1\x4c\x7d\xd9\xb7\x94\xe6\x4c\x0a\xf3\xdd\xc9\x82\xcc\x82\xd2\x72\x5a\x36\xfa\x75\x56\xed\xd9\xed\x1c\x35\xe7\x82\x8e\x54\x4f\x1b\x43\x49\x3c\xf2\xc9\x0e\x9e\x5c\x1b\xcb\x3c\x32\x0d\xd6\xcc\x8e\xc1\xc6\xec\x04\xfd\x3e\x5c\xaf\xd3\x13\x21\xc7\x4a\x8b\xb0\xa4\x6f\xe6\xcd\x22\x5d\x15\x2c\xa9\x53\x9b\x39\x18\xea\x8d\xcc\x7a\x38\xb0\xeb\x05\xae\xa3\x55\x16\x70\x5c\x18\x08\x92\x3c\x1b\x8b\x95\x6c\x89\xda\xa8\x39\xcb\x25\x47\x12\x08\xa1\x96\xee\x34\x18\xda\x30\x76\x74\x26\x6a\x8d\xb2\x82\x56\x65\x99\x1f\xd9\xd2\x6a\x29\x7b\xbd\xcd\x10\xbb\x74\xbd\xab\xb3\x61\xa5\xe8\x51\x43\x43\x70\x7a\x4b\x96\xaa\x77\x1b\xed\x65\xaa\xbb\x60\x74\xb1\xa1\x75\x02\x4d\xa3\x9d\x05\x1b\x42\x8a\xa6\xd3\x95\x36\x33\x28\xe6\xd6\xa3\xde\x64\x96\x2f\x35\x3b\xfe\xec\xe9\x78\x1b\x1d\xfc\xbf\x7c\x76\x2d\x32\x8e\xc7\x8f\xc5\x6f\xb3\xbc\x31\x37\x3d\x26\xcc\x35\xe1\x9c\xad\xf1\x66\x91\xd3\x44\x91\x09\x2a\x29\x36\x60\x97\x45\xad\x49\x37\x49\x41\xa4\x16\x76\xca\xef\xf5\xc6\x12\x4c\x55\xea\x4d\xa4\x2d\xc4\xaa\xdc\x18\x54\x27\x78\x5d\xcb\x49\x38\xdf\x5a\x63\x85\xa3\x0a\xd8\xaf\x0c\xeb\xd3\x30\x1d\x6a\xcd\x28\x8c\x32\xa0\xbd\x6c\xf3\x6e\xd8\xca\xf7\xb5\x52\xaf\x95\xab\x17\x39\xca\x80\x9b\xca\x82\x5b\xab\xfe\xdc\x91\x36\xf6\x44\x57\x85\x1c\x40\x13\x6d\x70\x8c\x97\xc6\x66\xb8\xea\xc0\xd0\x50\x0a\x83\x74\xb5\xed\xaf\xdc\x7a\x21\x9d\x52\xca\xfc\x50\x61\x66\x0b\xd6\x19\xf1\x6e\x46\x1d\xcc\xfb\xa5\x02\x1d\x29\x89\x77\x50\x25\x16\x0b\xe4\xb3\xf8\x8b\xae\x68\x0f\x40\x3e\xde\x83\x7c\xb0\x77\x3e\xde\x87\x7c\x94\x3f\x6c\x64\xcd\x66\xb9\x4e\x1b\x73\x53\x92\x4c\x65\xab\x5a\xa8\x05\x06\x30\xc0\x82\x5f\x95\x3b\x0b\x96\x71\x3b\x23\x95\x6f\x9a\x0d\xec\xb3\x61\x5a\xe1\x8f\x78\x99\xe3\x0c\xe1\x87\xe3\xe1\xd6\xd4\xe8\x95\x9f\x17\x3d\xb1\x94\x77\xf5\xd7\x1c\x1f\x9d\x71\x3c\xf9\x45\xc7\x21\x57\x73\xac\xce\x4a\x1c\xc3\x20\x89\x11\x80\x44\xf2\x3a\x89\x79\xcc\x91\x14\x43\xd3\x10\xf2\x24\x69\x18\x98\x61\x68\x68\x88\xa2\xa8\x43\x56\x60\x21\x62\x69\x9e\x42\x2c\x6d\x70\x2c\xcd\x0a\xe4\x6e\xeb\xd4\x49\x46\xaf\x9f\x79\x34\x63\xa6\x33\x64\x8d\xac\x14\xd7\xc1\x78\xa9\x50\xd6\x80\x04\x6b\xd7\xa1\x24\xa5\xb4\x5a\xd4\xb2\x6b\x95\x0b\x32\x79\x3d\xdb\x5d\x2c\x0b\xd2\x92\x19\x05\x9e\x6a\x0f\xe5\x3b\xae\xab\x5b\xf0\x22\x0f\xe7\x9e\xd1\x3f\x48\xa7\xf4\xc7\xf4\xbf\x5d\xb3\xb8\x62\x77\x09\x61\x96\xe5\x48\xa8\xeb\x94\xc8\x90\x90\x47\x40\x64\x0c\xc8\x8a\x14\x00\x50\x64\x18\x04\x49\x16\x01\x64\x50\x58\x14\x11\xc7\x8b\x80\x24\x69\x81\x45\x2c\xc9\x88\x88\x63\x28\xbc\xdb\x00\xf4\xd6\xee\x89\x72\xe7\x44\x5a\xd7\x68\xc1\xde\xb4\x7a\x8d\xf5\xd4\xab\x83\x4e\xc6\x48\x4f\xda\xea\xac\x83\x38\x2f\x55\x2d\xab\xf3\x66\x67\x56\xb5\x56\x2b\xb4\x88\xe4\x2b\x5a\x36\xb5\x2b\xd4\xf2\x61\xbb\xe7\x9f\xd3\xaf\xea\x8f\xe9\xbf\xd7\xee\x90\x14\x05\x09\x20\x24\x19\x8c\xc4\x09\xba\x24\x48\x3c\xa2\x10\x65\x40\x9a\x11\x68\x12\x41\x8c\x28\x0e\x91\x82\x20\x31\xba\xc0\xd2\x82\xc0\xb0\x1c\x67\xd0\x42\x54\x31\x24\x40\x73\xbb\x6d\x2c\x6f\xed\xfe\x89\xe5\x4e\x64\xa8\x8b\xe5\x8e\xee\x67\x17\xc5\x9a\x16\xca\x34\x56\x02\xc7\x5d\xf6\x56\xa8\x33\x14\x5b\xfa\x4a\xa4\x33\xed\xd5\xba\x99\x71\xe9\xe5\x64\xd9\x08\xc0\x8c\x69\x65\xcf\xeb\xa3\x7c\xf8\x9c\x6c\x91\xd2\x8a\x5d\x50\x42\x4e\x24\xbb\x13\xd1\xad\x6e\x8a\xd3\x65\x3f\xcd\x92\x13\x77\xca\x60\x90\x36\xcd\xdc\x7c\x9a\xe7\x4c\x57\xd7\xfb\x30\x22\x99\xed\xca\x8b\x89\x2a\xcb\xa7\xf5\xfd\x8d\x6f\xf2\x27\xfa\x64\x6f\x65\x52\xb5\x91\x62\x4f\x20\xa8\xea\x05\xbf\xaf\xd1\x46\xbe\x5f\x37\x94\x91\xe6\xeb\x53\x19\x20\xbf\x2c\xe6\x84\x9e\x1b\x90\xcd\xc9\x39\xde\xad\xac\x7b\xf1\xb7\x5c\x1f\x4f\x90\xbf\x3b\x3b\x16\x6b\x62\xa9\xb9\x68\x4e\x61\x95\x2e\xc9\x4c\xaf\x3b\x69\x79\xd5\xd9\xa4\x4f\x92\x46\x51\xf4\x6b\x65\x61\x46\xe6\x5b\xcb\x4a\x2f\x2d\xf7\x19\xf9\xd0\x5e\xca\x57\xbd\x97\xbc\x1e\xf0\x5e\x72\x0f\x68\x26\xce\x7e\x5b\x87\xe5\x4c\x32\x25\x89\x69\x2b\x68\xd3\x8d\xa1\xba\x52\xb2\x8a\x33\x42\x59\x52\x0f\xa6\x6a\xcf\x53\xec\x66\x8a\xc1\xdd\x90\x6e\x94\x99\x54\x4d\x41\x5d\xdf\x1f\xa8\xde\x92\x1d\x2d\x17\xc3\x82\x56\xf3\xeb\x6e\x9b\xe2\xf9\xb5\xe0\x75\x8d\xb5\xcd\xcb\x65\x57\x18\xcd\xbb\x9c\x5b\xcf\x6d\xfb\xfc\xdd\x7a\xbb\x5b\x97\xa6\xcc\xbc\x09\x65\x2e\xd4\x32\x75\x33\xa4\xe5\x46\x7a\x52\xf7\x52\xe5\x49\xad\x45\x2e\xb4\xca\x98\xca\x4a\x5a\xa5\x74\x24\x76\xc3\x06\xbb\x2b\xfe\x9d\xd2\x31\x5a\xa2\x7d\x22\x71\x16\x4c\x64\x91\xc1\x62\x89\xb2\x52\xb6\xe5\x7b\x03\x3d\x87\x86\x3d\xa5\xe8\xcf\x81\x62\x74\x5a\x22\x5c\x2f\xfd\x49\x08\x9b\xad\x92\x6c\x41\x31\x63\xe8\xbb\xbd\x5c\x8d\xb4\x7d\x59\x61\xe2\x3a\x5f\x38\x3f\xe3\xfa\x79\xfa\xaf\x94\xfd\x1e\xfd\xe7\xad\xc2\xb3\xad\xe1\x15\x9d\xbf\xad\x35\x2e\x74\x7a\x99\xf0\x09\xfd\xb2\xfc\x3f\xd7\x2a\x5e\x6a\x95\x7e\x77\x57\xe0\xf1\x4e\xf9\x8d\x24\xa3\x5d\x2a\xe8\x95\xa0\xbc\x64\x98\x0f\xff\x3a\xed\xf8\xfc\x70\x9f\xb4\x32\x32\xee\x86\xa9\xb0\xd1\x11\xab\xea\xd8\xa9\x3a\x4a\xc5\x44\xd9\xde\xbc\xeb\x0b\x54\x4f\x2e\xcf\x9b\xb6\x4f\x0f\xe7\xec\xac\xce\xd4\x32\x56\x58\xef\xe6\x4a\x78\x92\x6e\x57\xc6\xda\xca\xac\x5a\x7e\xbb\xc5\xd5\x2b\xcb\xa6\xc6\x04\x5e\x13\x36\x7c\x55\x5e\x42\x8e\xcf\x98\x36\x8c\x76\xf8\xbc\x12\x2f\x3d\xc4\xe5\xb5\xda\x26\x33\x5a\x06\xc1\x3c\x97\x22\x47\x60\xce\xd6\x25\x3f\x4f\x07\x22\x36\x95\xae\xe3\xc8\x15\x92\x92\x55\x45\x5b\xb1\x47\x6a\xef\xd9\xea\x46\x72\x4a\x1a\xef\x91\xa6\xd7\x3e\xfa\xed\xca\x75\x3b\x39\x7c\xa2\xfe\xc7\x92\xd3\xef\xeb\x3a\xbd\xbd\xfe\x6d\x5d\xd6\xdf\xde\x75\xbb\x27\xa1\x7c\x72\x1f\xf7\x6f\x37\xca\x8f\x2b\x9d\x5f\xc6\x80\x19\x8a\x5c\x57\xb4\x38\xd8\x22\x0d\x7f\xa2\x8f\xe8\x14\xd9\x25\x4b\xb8\xb3\x22\x2b\x8c\x52\xe8\xaf\xf5\xe2\x52\x9d\x99\xc7\x0a\x7b\xb9\x42\x3b\x49\xfb\x5f\xaf\xd0\x7f\xa3\xbe\xf4\xf1\x73\x22\x59\x7d\xd0\xcf\xb2\xd5\xac\xb1\x9b\xd1\xa1\xfc\x89\xd9\xb1\xcb\x3e\x7f\xb6\x21\x38\xda\x20\xd1\xbb\xfb\x5b\xf2\x4f\xcc\x26\x3f\x92\x70\xea\xec\xb1\xfc\x89\x5d\xd1\x6f\x7c\x2b\x7f\xd6\x58\x31\x36\x44\x84\x19\x37\x38\x1f\x8c\xef\x44\x3d\x6f\x91\xba\xdd\xb5\x12\xb0\xb7\x66\xd3\x6e\x9c\x29\xf1\xd1\xc1\xdd\xd9\xb9\x12\xfb\x5c\x49\x27\xf2\x5c\xfc\x7b\xd2\x63\xfd\xbe\xd0\x7b\xbb\x8e\x72\xd8\xdb\x1e\xff\x0a\xf5\x0d\xca\xd5\x73\x70\xdf\x1e\x0f\x7e\x38\xff\x77\x7f\xf6\xc4\x3b\xc5\x4c\x9e\x53\x1e\x9d\x4e\x9e\x40\x8c\x96\x6d\xe4\x5c\xee\xc2\x89\x9d\x07\x85\x44\xa3\x55\xae\xcb\xad\x01\x51\xcd\x0f\x88\x6f\x87\xc3\x8c\x5e\x0f\x27\xe5\x5e\x3d\xb7\xf6\xec\xc4\xf4\xcf\x22\xee\xdf\x60\xed\xdf\xa2\x7c\xe9\x1c\xd1\xe3\x21\xf1\x4f\xd3\x83\xc0\xbe\xc4\x6c\xaf\xe0\x94\x54\x7c\x74\xd9\xed\x43\x46\x6f\x9e\x8e\xff\x34\xdd\x13\xf0\x4b\xc4\x6f\x68\x27\x34\xa5\xdc\xd4\xf2\xc4\xf1\x3c\x93\x0f\x95\xe4\x73\xec\xfd\xc1\x02\xbc\xf5\xc1\xf1\xdc\xd5\x2b\x67\x86\x9e\xbc\x53\xe1\x69\xbe\x31\xd8\x25\xa2\x09\x35\xa7\x0c\x77\x27\x59\x5e\x3e\xc1\x32\xf9\x02\x89\xa7\xc9\x45\x58\x97\xb8\x1d\x95\x9c\x52\x33\xdd\xd7\xe8\x5c\xcb\x9b\x27\x36\x5e\x78\x71\xc6\xf3\x4c\x13\x90\x17\x09\x9f\xab\xbc\xe4\xf4\x2b\xc7\x3a\x9e\xbc\x3e\xe4\x33\x98\xfa\x21\xbc\xc2\x71\xaf\xe6\x94\x5d\x74\x22\xe4\x8d\x33\x1e\xdf\xbc\x33\xe5\x69\x92\x47\xc0\x4b\x44\xcf\xd4\xdd\x95\xc3\x12\x1b\xf7\xcf\xdf\x1c\xf3\x34\xdb\x23\xe0\x25\xb6\x67\xea\x4e\xd9\xee\x4f\x4a\xbc\x71\x12\xe1\x9b\x37\xe8\x3c\xcf\xf7\x00\x78\x91\xef\xa9\xba\x53\xbe\x87\xc3\x0c\x6f\x1c\x52\xf8\xe6\x55\x42\x4f\x13\x3e\x02\x5e\x22\x7c\xa6\xee\x6a\xd7\x20\x3e\xa4\xf0\xf5\x78\x02\xe1\xcd\x53\xe8\x2e\xbc\x6a\xe9\xf9\x72\x24\x20\x2f\x96\xe4\x5c\xe5\xa5\x2c\xe1\xe3\xf9\xeb\xfe\xd8\xb5\xeb\x27\xc4\x9d\xbf\x82\xea\x13\xb8\xdf\x24\xfe\x14\xeb\xb3\x2e\xea\xa5\x17\x73\x3d\xcd\xff\x14\xf4\x52\x21\x2e\xa8\xbd\x5a\x92\xe4\xe9\x6d\xd7\xba\x9a\x87\x97\x96\xed\xb8\x47\xaf\x38\xbb\xef\x5c\xb9\xf8\x6d\x68\x67\x38\x84\xaa\x1c\x7b\xb1\x5a\xbb\xac\x14\x09\x18\x78\x18\x13\xfb\x43\x24\xff\x20\x7a\xa5\x7c\x2b\x4f\x24\x0f\x95\xa4\x0e\x7b\xe4\xde\x76\x34\x4f\xdf\xc3\xf6\x28\xcb\x53\x98\x2d\xc9\x5d\x3f\xe5\x84\x62\xf2\x64\xf1\xd7\xe4\x39\xe2\xaf\xf1\xf9\xde\x6f\xd8\x1d\x5f\x26\xf7\x28\xb1\x03\xc2\x96\xd3\xb1\x62\x9c\xd0\xba\xde\x55\x3c\x79\xed\xdd\x33\x14\xf6\x20\x31\x8b\x44\x82\xb9\x93\xc8\xc9\x9b\xfa\x1e\x25\x92\x04\xd9\x12\x39\xed\x08\xdf\xc9\xe4\xe4\xed\x82\x8f\x32\x49\x82\x6c\x99\x24\x7e\x1e\x79\x3f\x8d\x93\x37\x22\x3e\xc1\x24\x89\xb3\x23\xb3\xef\x25\x9c\x92\x49\x9e\x1e\x7c\x2b\x7d\x3d\xc7\xe8\x1c\x68\x4b\xe9\x2c\x37\xbe\x6b\xa3\x6b\x2f\x02\x25\x74\x67\xe6\x5a\x38\xc0\x91\xda\xff\x1f\x00\x00\xff\xff\x68\x77\x99\xb3\x35\x74\x00\x00") - -func kahuna2CoreSqlBytes() ([]byte, error) { - return bindataRead( - _kahuna2CoreSql, - "kahuna-2-core.sql", - ) -} - -func kahuna2CoreSql() (*asset, error) { - bytes, err := kahuna2CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "kahuna-2-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xdf, 0x34, 0xe8, 0xf4, 0xc8, 0x5c, 0xaf, 0xf1, 0xe4, 0xce, 0xe8, 0x8a, 0x3d, 0x82, 0x85, 0x81, 0x51, 0xef, 0x37, 0x5a, 0x94, 0xb7, 0xc2, 0xc5, 0xbe, 0xcd, 0x70, 0x48, 0x87, 0x52, 0xa5}} - return a, nil -} - -var _kahuna2HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x3d\x79\x6f\xda\xca\xb7\xff\xf7\x53\x58\xd5\x95\xd2\x2a\x69\xe3\x7d\x49\x5f\xaf\x64\xc0\x04\x02\x98\x3d\x2c\x57\x57\x96\x97\x31\x71\x30\x36\xb1\xcd\x7a\xf5\xbe\xfb\x93\x17\xc0\x18\x6f\x2c\xed\xfd\xfd\xf4\xac\xaa\x8a\x3d\x67\xce\x36\xe7\xcc\x99\x39\x33\xcc\x7c\xfb\xf6\xe9\xdb\x37\xa8\x65\xda\xce\xc4\x02\xdd\x76\x1d\x52\x44\x47\x94\x44\x1b\x40\xca\x62\x36\xff\xf4\xed\xdb\x27\xb7\xbc\xb4\x98\xcd\x81\x02\xa9\x96\x39\x3b\x00\x2c\x81\x65\x6b\xa6\x01\x31\xdf\xc9\xef\x48\x08\x4a\xda\x40\xf3\x89\xe0\x56\x8f\x80\x7c\xea\x72\x3d\xc8\x76\x44\x07\xcc\x80\xe1\x08\x8e\x36\x03\xe6\xc2\x81\x7e\x42\xf0\x0f\xaf\x48\x37\xe5\xe9\xe9\x57\x59\xd7\x5c\x68\x60\xc8\xa6\xa2\x19\x13\xe8\x27\x74\xd7\xef\x95\xe9\xbb\x1f\x3b\x74\x86\x22\x5a\x8a\x20\x9b\x86\x6a\x5a\x33\xcd\x98\x08\xb6\x63\x69\xc6\xc4\x86\x7e\x42\xa6\x11\xe0\x78\x03\xf2\x54\x50\x17\x86\xec\x68\xa6\x21\x48\xa6\xa2\x01\xb7\x5c\x15\x75\x1b\x1c\x91\x99\x69\x86\x30\x03\xb6\x2d\x4e\x3c\x80\x95\x68\x19\x9a\x31\xf9\x11\xf0\x0e\x44\x4b\x7e\x13\xe6\xa2\xf3\x06\xfd\x84\xe6\x0b\x49\xd7\xe4\x07\x57\x58\x59\x74\x44\xdd\x74\xc1\xd8\x7a\x8f\xeb\x40\x3d\xb6\x50\xe7\xa0\x6a\x19\xe2\x86\xd5\x6e\xaf\x0b\x35\xf9\xfa\x28\x80\xff\xfe\xa6\xd9\x8e\x69\x6d\x04\xc7\x12\x15\x60\x43\xa5\x4e\xb3\x05\x15\x9b\x7c\xb7\xd7\x61\xab\x7c\x2f\x54\xe9\x18\x50\x90\xcd\x85\xe1\x00\x4b\x10\x6d\x1b\x38\x82\xa6\x08\xea\x14\x6c\x7e\xfc\x0e\x82\xb2\xf7\xd7\xef\x20\xe9\xda\xd5\xef\x13\xd0\xa7\x76\xbe\x74\x3e\x83\xae\x21\xa7\x11\x0b\x41\x1d\x90\x7b\xe0\x55\xbe\xc4\x0d\x43\x90\x01\x5a\x8f\x2b\x01\xa8\x2a\x90\x1d\x5b\x90\x36\x82\x69\x29\xc0\x12\x24\xd3\x9c\xa6\x57\xd4\x0c\x05\xac\x85\x90\x70\x86\x2d\x7a\x86\x6e\x0b\xa6\x21\x68\xca\x39\xb5\xcd\x39\xb0\xc4\x7d\x5d\x67\x33\x07\x57\xd4\x3e\x70\x72\x15\x17\xe7\xd5\xd5\x81\x32\x01\x96\x57\xd1\x06\x1f\x0b\x60\xc8\x67\x89\x10\xaa\x3e\xb7\xc0\x52\x33\x17\x76\xf0\x4d\x78\x13\xed\xb7\x0b\x51\x5d\x8f\x41\x9b\xcd\x4d\xcb\x75\xc7\xa0\x4f\xbd\x14\xcd\xa5\xba\x94\x75\xd3\x06\x8a\x20\x3a\xe7\xd4\xdf\x19\xf3\x05\xa6\x14\xf8\xe5\x05\x4c\x87\x6b\x8a\x8a\x62\x01\xdb\x4e\xaf\xfe\xe6\x58\x8a\x17\x77\x04\xdd\x34\xa7\x8b\x79\x0e\xe8\x79\x16\x4b\x3e\x94\xa8\x59\x67\x22\xde\x75\xba\xb9\x2b\xb8\xfd\x84\xaa\x02\x2b\x1f\xe8\x0e\xfd\x05\x55\x02\xb5\xe6\xab\xe4\x75\xad\x67\x10\x09\x77\xc5\x59\x35\xe6\x6e\x85\x37\x27\xb3\x05\xec\xa3\x0e\x48\xda\x64\x9a\xd1\xdb\xde\xd3\xf3\x00\x9b\x3e\x1f\x66\x26\xa0\x66\x3b\x82\xb3\x16\xe6\xd9\x28\x5d\x48\x73\x9e\x17\x12\xe4\x05\xdb\x85\x92\x74\x60\x69\xe7\xee\x99\x60\xd9\xbd\x98\xb4\xc9\xd7\x98\x7e\x8c\x74\xb5\x6d\xdb\x8b\x2c\xca\x7b\x60\xd9\x54\xc0\x99\xe3\x82\xbd\x19\xcc\x45\xcb\xd1\x64\x6d\x2e\x1a\xa9\xc1\x3b\xab\xaa\x30\x3f\x73\x6c\xb2\x8f\x68\xe7\x72\x10\x5f\xf1\x6c\xfa\x9e\xf2\xf2\xd0\xf3\x01\x7f\x39\x7e\xbf\x31\xdd\x96\x0c\xfe\x74\xe3\xc3\x6e\xe8\xe7\x19\x83\x90\x93\x83\x89\x69\xcd\x85\x99\x36\x09\x06\x0c\x29\x2c\x44\x20\x73\xcb\x78\xfe\x78\x2f\x0d\x73\x5e\xe3\xf4\x6b\x17\x9b\xf5\x7e\x83\x87\x34\xc5\xa7\x5c\xe2\xca\x6c\xbf\xde\xcb\x89\x3b\xc1\xe8\x6e\x80\x39\x68\xee\x74\x4c\xde\x5b\x7e\xf1\x77\x51\xba\xcb\xb5\xfb\x1c\x5f\xbc\x40\x67\xee\x38\xdb\x06\x1f\x67\x53\x3e\x42\x92\xbb\xb6\x02\x72\xc2\x1e\x46\xb3\xb9\x25\x4c\xf0\xfa\x73\xe4\x8b\x47\x91\xaf\x6e\x30\xee\xcb\x07\x1c\x0c\xf2\x72\xcb\x16\xf4\x00\xe7\xc8\xe2\x57\xc9\x09\x1b\x0c\xff\xf2\xf3\xb3\x1b\x2f\xe6\xe1\x28\xd2\x87\xa4\x03\x87\xba\x84\x00\x90\x7d\x7e\xee\x70\xcf\x6c\x2f\x06\x78\xa6\xb9\x33\x0e\x4d\x06\x5f\x8c\xc5\x0c\x58\x9a\xfc\xd7\xdf\x5f\x73\xd4\x12\xd7\x17\xd4\xd2\x45\xdb\xf9\x22\x1a\x1b\xa0\x7b\xa9\x98\x1c\x35\x54\xcd\x8a\xad\x52\xee\xf3\xc5\x5e\xb5\xc9\xa7\xc8\x23\x88\x93\xc9\x81\xbb\x07\xe8\x84\xd1\x14\x1c\x3b\xe9\xae\xc0\xe1\xca\xea\x55\x3f\x30\xff\x00\x9d\x23\x88\x27\x7a\x0e\x0c\xdc\xb0\xc7\xf1\xdd\x08\x0a\x7d\x3e\xb1\x3f\xf4\x9d\x2d\x16\x2b\x5c\x83\x3d\xa1\xf0\xe3\x93\x9f\x85\xe3\xc5\x19\x78\xda\x7d\x83\x7a\x9b\x39\x78\x0a\xaa\xfc\x80\xba\xf2\x1b\x98\x89\x4f\xd0\xb7\x1f\x50\x73\x65\x00\xeb\x09\xfa\xe6\x25\xe7\x8a\x1d\xce\x6d\xaf\x00\xf3\x0e\xdf\xa7\x23\x8c\xc7\x85\x01\xe2\x62\xb3\xd1\xe0\xf8\x5e\x0a\x66\x1f\x00\x6a\xf2\xc7\x08\xa0\x6a\x17\xba\xdb\xa5\xdd\x76\xdf\x6c\x0f\xc9\x5d\x94\xf2\x4e\xfc\x80\xe6\x5e\x43\x99\xf2\x1c\xe9\x92\x6f\xf6\x22\xfa\x84\x06\xd5\x5e\x65\xcf\x56\x38\xff\x76\x44\xfe\x80\x25\xc2\xc8\x39\xc2\x9f\x20\xf1\x14\xd0\xaa\x3f\xce\x27\xdd\x76\x1d\x9a\x5b\xa6\x0c\x94\x85\x25\xea\x90\x2e\x1a\x93\x85\x38\x01\x9e\x1a\x72\xe6\x0b\xc3\xec\x66\x1b\x5a\xc0\xfe\xce\x56\x0f\xfc\xef\xda\x36\x4e\x97\x7b\xcb\xce\xc4\x0f\x75\xb8\x5e\xbf\xc3\x77\x43\xdf\x3e\x41\x10\x04\xd5\x59\xfe\xb9\xcf\x3e\x73\x90\x27\x7d\xa3\xd1\xf7\xfb\xbb\x6e\xaf\x53\x2d\xf6\x3c\x08\xb6\x0b\xfd\x21\xfc\x01\x75\xb9\x3a\x57\xec\x41\x7f\x20\xee\x5b\xb4\x35\x32\x1d\xf1\x3a\xe9\xb2\xd0\xdf\x4c\x38\x34\x4e\xb8\x3c\x3d\xd5\x75\xf2\xe5\xa0\xb0\x17\x71\xff\xe9\x22\x09\xbf\x7c\x82\xa0\x22\xdb\xe5\xa0\x41\x85\xe3\xa1\x3f\x90\xbf\x90\xbf\x1f\xff\x40\xfe\x42\xff\xfe\xf3\x0f\xd4\xfb\x1b\xfd\x0b\xfd\x1b\xea\xf9\x85\x10\x57\xef\x72\xae\x52\x38\xbe\xf4\x35\x56\x33\x39\xe2\xc0\x95\x9a\xc9\xa6\xf0\xab\x35\xf3\x3f\x97\x68\xe6\x34\xa6\x06\x7a\xd8\xc7\xe1\x7c\x8a\x38\x84\xed\x13\x8c\x1e\xc7\x10\xd4\x75\x75\x05\xfd\x3c\xf4\x00\x0f\xfe\xe7\xde\xa8\xc5\x41\x3f\xc3\x1e\xf1\x35\xce\x6b\x6f\xca\x63\x14\x61\x84\xc5\x9d\x1b\xe7\xe7\x30\x76\x08\x74\x2d\x97\x71\x48\x23\x9c\x1e\x39\xe4\x31\xbb\x07\x2b\x3b\xe5\x36\x6e\x98\x77\x35\xb7\x31\x48\xa3\xdc\x86\x9d\x24\x95\x5b\x37\x72\x29\x40\x15\x17\xba\x23\x38\xa2\xa4\x03\x7b\x2e\xca\x00\xfa\x09\xdd\xdd\xfd\x38\x2e\x5d\x69\xce\x9b\x60\x6a\x4a\x68\x29\xed\x48\xd6\xf0\xf8\x37\x10\xd1\x73\xb0\x7c\xe2\xf9\xbe\x18\x9e\x7c\xfb\x12\x69\x0a\x24\x69\x13\xcd\x70\xbc\x81\x01\xdf\xaf\xd7\x7d\x71\xc4\x99\x3b\x8c\x87\xe4\x37\xd1\x12\x65\x07\x58\xd0\x52\xb4\x36\x9a\x31\x89\x80\x19\x8b\xd9\x7e\xc8\x0f\x69\x86\x03\x26\xc0\x8a\x80\xa8\xba\x38\xb1\x21\x7b\x26\xea\xfa\x29\x19\xc7\x9c\xe9\xa7\x44\xbe\xa0\x04\xf1\x75\x0f\x79\xda\xec\xd1\x79\xc3\xa5\xea\x88\x66\x3b\xf6\x2a\x71\xc0\xfa\x44\x21\xf3\xb9\xae\x79\x39\x7b\xc8\xd1\x66\xc0\x76\xc4\xd9\x1c\x72\xdb\xcc\x7b\x85\xb6\xa6\x01\x4e\x19\x4d\x9a\x15\xed\xc6\xa3\xc1\x74\x2a\x1f\xcf\xfb\xc9\x57\x02\xd6\xc0\x0c\xd9\x4e\xcf\x1f\xd1\x21\xde\x87\x2a\x5f\xec\x70\xde\xf0\xab\x30\x0a\x3e\xf1\x4d\xa8\x51\xe5\x5f\xd9\x7a\x9f\xdb\xbf\xb3\xc3\xc3\x7b\x91\x2d\x56\x38\x08\xc9\x12\xe6\x62\xb5\x47\x11\x9d\x98\x62\x90\xf4\x80\x0c\xb0\x76\x96\xa2\xfe\xe5\x2e\x41\xe2\xbb\xa7\x27\x0b\x4c\x64\x5d\xb4\xed\xaf\xd1\xe6\xf2\xd7\x2a\x62\x6c\x8b\xc4\xbf\xa6\x34\x94\x3f\x37\xbe\x5a\x32\x3f\xa3\xb3\x97\x2b\xde\x33\x0e\xb9\xba\x78\x36\x63\xc1\x65\x53\x89\x03\x47\xd0\x78\x70\x3f\xfd\x17\x53\x81\x20\xd3\x3c\x2c\x3e\xbd\x70\x23\xb3\x0d\xe3\xfc\x6d\x46\x9b\x26\x08\xd4\x1c\xf0\x5c\x09\x2a\x8c\x32\x24\xf2\x33\x74\xe9\x02\xed\x71\x45\x8a\xbf\x6b\x4a\x12\x6f\xbb\x9c\xcf\xb5\x56\x17\xe0\x09\xcc\x2e\xe2\x33\x42\x52\x4f\x7f\x9a\xe2\x4a\x82\xfc\xec\x2d\x7c\x7c\x4e\xb0\x66\xcf\x8e\xe3\x8b\x14\xe0\x88\x9a\x6e\x43\xef\xb6\x69\x48\xc9\xc6\xb6\x4b\x94\x5d\xab\x87\x00\x4f\xa0\x87\xdd\xba\x75\x02\x6f\xa1\xc5\xe4\x5c\x5e\x18\xb7\x8e\x1d\x5f\x31\x50\x4b\x28\x33\xea\x35\xc4\x9e\x8f\x5d\x2f\x07\x47\x28\x1c\x1a\x22\x1f\xfc\x7e\x31\x39\x12\x98\xcc\x85\x73\x88\x4d\xd1\x3a\x16\x10\x9d\xcc\x4a\x3e\xec\x62\xae\xe4\x86\xdd\x9b\x4e\xf0\x1a\x59\x67\x3f\x91\x05\x39\x19\x0f\x38\xa2\x2e\xc8\xa6\x66\xd8\xf1\x36\xa8\x02\x20\xcc\x4d\x53\x8f\x2f\xf5\x56\x3e\x55\x90\xd4\xd6\x5e\xb1\x05\x6c\x60\x2d\x93\x40\xdc\x71\xa8\xb3\x16\xbc\x61\x92\xb6\x4d\x82\x9a\x5b\xa6\x63\xca\xa6\x9e\x28\x57\xb4\x8d\x76\xc6\x02\x44\x05\x58\xde\xf0\xc2\xff\x6e\x2f\x64\x19\xd8\xb6\xba\xd0\x85\x44\x43\x09\x04\x17\x35\x1d\x28\xc9\x50\xc9\x6e\x95\x90\xbb\xbe\xd6\xcb\x12\xd6\x43\x32\x62\x5e\xfe\xde\x26\xbb\xff\x3a\x57\xe4\xdb\x86\xb1\x54\x1a\xbf\x2b\xac\x9d\x25\xe8\x95\x61\x2e\x95\xd6\x69\xd8\x8b\x07\x4f\x09\x83\xa1\x95\x9d\x9b\xd9\x66\xd6\x34\xe7\x78\x57\x55\xc2\x54\xc8\x1d\xf9\xcb\xbe\x28\x5e\x04\xbc\x32\x00\x06\x9e\x6f\x2e\x2c\x79\xbf\x4d\x23\x21\xf4\xec\xba\x93\xbb\xbb\xa7\xa7\xe4\xa9\x58\xb2\x1f\x04\x0b\x6b\xd7\xaa\x33\xd8\x0b\xf8\xe5\xa6\xe3\x85\xa0\x4b\xbc\x24\x7a\x79\x7b\x61\x12\xc9\x46\x76\x22\xa6\x01\x05\x9b\x23\xd3\x40\xfc\x79\x70\x2c\xc0\xe9\x9e\xce\x0c\xb8\x54\x72\x7b\xa8\x14\x8a\x1e\x4b\x9a\x2d\xd8\x40\xd7\x81\x05\x49\xa6\xa9\x03\xd1\xd8\xc5\x24\x4d\x06\x82\x71\x14\x7f\xfd\x6f\xc7\x31\xf9\xb0\x9b\x48\x88\x44\xeb\xa3\xfd\x4c\xd1\xc2\xd0\x32\x7d\xec\xce\x4f\x8f\x6b\xc1\xdb\x1b\x0c\x15\x2b\x5c\xb1\x06\x7d\xf9\x12\xd6\xe0\x9f\x10\xfc\xf5\x6b\x16\xaa\xb8\xea\x3b\xa5\xfd\xcf\x89\x1e\x73\xe0\x3b\xd2\x69\x04\x7d\x44\xe1\x1e\x83\xa9\xae\x14\xbf\xc2\x7d\x03\xe7\x8a\xdf\xb3\x90\x33\x92\xe6\xe9\xc2\xae\x89\xa5\x59\xfb\x03\x6e\x13\x4d\x33\xa8\xfc\xae\x78\x7a\xa6\xb0\x57\x46\xd4\x0c\x6a\xa7\x31\x35\xa9\x42\x4a\x54\x3d\xda\x13\x72\x43\x5b\xdd\xd9\x67\x98\xa5\xdc\x93\xa8\xa0\xef\xcf\x98\x9a\xe5\x0d\xbc\xe9\x31\x34\x16\xf6\x40\x3a\xd6\x5f\xdc\x59\x40\xf2\x34\x22\x69\x82\xf6\xaf\x4c\xb1\x9c\xb5\x00\x8c\x25\xd0\xcd\x39\x88\x4b\x5b\x3a\x6b\x77\xc2\xb3\xd0\x9d\x84\xc2\x19\x70\xc4\x84\x22\x77\xaa\x95\x54\x6c\x6b\x13\x43\x74\x16\x16\x88\xcb\xb0\x31\xe4\xd7\xbf\xfe\x3e\x8c\x5d\xfe\xf9\xdf\xb8\xd1\xcb\x5f\x7f\x47\x75\x0e\x66\x66\x42\x32\xec\x80\xcb\x30\x0d\x90\x3a\x16\x3a\xe0\x3a\x45\x13\x48\xa6\xcd\x80\x20\x99\x0b\x43\xf1\x32\xd6\xb4\x25\x1a\x13\x10\x9d\x8d\x1d\x87\x56\x57\x13\x2e\xb6\x09\x50\xb2\xa7\x5b\x41\xee\x4f\x53\x76\xde\xb6\xdb\xc2\x95\xa7\x8b\xf0\xdd\xcd\xdb\x2f\x97\xb1\x3b\xac\xcb\xf5\x52\xf2\xa4\xe1\x8c\x54\x38\x4b\x7a\xde\x3c\xe2\x76\x42\xe4\xdc\x3c\x97\x2a\x54\xea\xfc\x23\x8f\x90\x89\x91\xf6\x66\x62\xe6\xde\x7f\x98\x2a\x68\x46\x58\x88\x17\xb5\x24\x3a\x22\xa4\x9a\x56\xc6\x6a\x11\x54\x62\x7b\x6c\x86\x78\x09\x28\xd3\x56\x5d\xf2\xa0\xad\xf2\x5d\xae\xd3\x83\xaa\x7c\xaf\x79\xb2\xf2\xe2\x05\xe8\x2e\xf4\xe5\x0e\x11\x34\x43\x73\x34\x51\x17\xfc\x5d\x30\xdf\xed\x0f\xfd\xee\x01\xba\x43\x61\x84\xf9\x06\x93\xdf\x60\x0c\x42\xe8\x27\x94\x7e\xc2\xa9\xef\x30\x86\xe2\x0c\x79\x0f\xa3\x77\x5f\x7f\xe4\xc3\x8e\x0a\xfe\xaf\x1b\x8e\xb4\x2a\x6d\x04\xc7\xd4\x94\x74\x4a\x0c\x49\x50\xe7\x50\xc2\x84\x85\x0d\xf6\x51\x46\xd0\x8c\x93\x5f\x54\xa4\xd2\xc3\x71\x18\xa7\xcf\xa1\x87\x0b\xa2\xa2\x08\xd1\xbc\x54\x2a\x0d\x02\x27\x30\xf4\x1c\x1a\x84\xe0\xc7\xb4\xdd\xe8\xda\x5b\xcf\x4c\x25\x41\x62\x30\x7a\x96\x18\xe4\x8e\x44\xd0\x83\xe5\x20\x41\xe3\x08\x71\x0e\x09\x4a\x98\x99\x8a\xa6\x6e\xf2\x4b\x41\x23\x24\x7a\x16\x09\xfa\x48\x8a\x60\x1b\x73\x0e\x3a\x14\x4e\x62\xe7\xd1\x71\x1b\x5d\x9c\x4c\x2c\x30\x11\x1d\xd3\x4a\xb7\x29\x06\x46\x60\xe6\x1c\xf4\x8c\x87\xde\xcf\x59\x0a\x6b\xc5\x4a\xc7\x8e\x52\xc8\x59\x4d\x8d\xc0\x1e\xfa\xa0\x15\xbc\x99\x6a\x3a\x01\x82\xa1\xce\xd2\x0e\x82\x84\x09\xec\xa7\x3e\x6e\x07\x90\x4e\x88\x21\x99\xf3\x24\x41\x8f\x1a\x3a\x98\x6c\xfa\x3f\x9c\x4d\xa3\x84\xc0\x14\x81\x9f\xd5\x22\x08\xe6\x8b\xb3\x9f\xa2\xa7\xb6\x38\x82\xa0\x14\x79\x9e\x24\xb8\xa0\x6a\xeb\xdd\x8f\x08\xcc\x99\x2e\xa8\x1a\xd0\x53\xbb\x46\x04\x21\x10\xe4\xac\x4e\x18\x21\x76\x6b\x27\xbb\x9c\xf6\x3a\x43\x0c\x92\x3a\xaf\x9b\x47\x48\x41\x33\x26\xc0\x76\x84\xd3\xac\x79\x06\x29\x8a\xa1\xcf\x6b\x11\xea\x28\x5c\x7b\xcb\x13\x62\x7a\x30\x41\x50\x18\xc6\xf0\x80\x48\x42\xac\x4d\x5d\x6b\x3f\x37\xd8\x9e\xac\xb7\xef\xb8\x47\x1e\xa0\xbb\xe7\x12\xc9\xf7\x3a\x2f\x03\x62\x4c\xf2\xc5\x41\x05\xef\x77\x07\x0d\x9e\x1b\x95\x29\xaa\xd3\xef\xa0\x8d\x5e\x93\xe4\x5b\x78\x8d\x2b\xbd\xbe\xb0\xbd\x5e\xb1\x3f\x2c\x75\x9a\xd8\xa8\x5a\xee\x46\x35\x94\x48\x04\x75\x89\x14\x3a\xad\x51\xa5\x5a\x47\x8b\x55\xac\xcc\xb7\xf1\xc2\xb0\x5e\x6e\xf0\xa5\x7a\xf9\xa5\xcf\xb7\xfa\x68\x65\x84\x8d\x1b\xe5\x6e\xa5\xc9\xf7\x8b\x5c\x93\xed\x0e\xa8\x76\x91\x6a\x0e\xd1\xca\xdd\xa5\x3b\x2a\xdc\x01\x56\x86\x86\x82\x5d\x68\x87\x0d\xa4\xdf\x6d\x90\xbe\xdb\xe0\x01\x42\x1f\x20\xc7\x5a\x80\x1c\xed\x76\xba\x8f\xe0\x9c\x91\xd7\x39\x6b\xd7\x37\x91\xf4\x68\xbe\xf0\x00\x21\x0f\xfe\x16\xa4\x6c\x41\xe3\xd6\xae\x2f\xb5\xcf\xdd\xfa\x75\xc8\x3c\x51\x04\xa7\x70\x1a\x87\x09\x8a\xf2\xb8\xc2\xe1\x07\xe8\xee\x9f\xcf\x86\x38\x03\x9f\x9f\xa0\xcf\x8a\x69\x80\xcf\x0f\xd0\xe7\xa5\xa8\x2f\xfc\x0f\x95\x17\x64\xdc\xfe\xf9\xf3\xf3\xff\x26\xd9\x67\x0c\x11\x84\x72\xdd\x9e\xc2\x50\x1a\xf1\x88\x20\xa8\x47\x64\x05\xb4\xc9\x9b\xf3\xf9\xc9\xfd\xf4\xd9\x17\x42\x98\x82\x8d\x4b\xe6\x52\xa7\xb9\x9c\x2d\xf4\x01\x42\xe0\x2c\xb6\x86\x45\xf2\xb9\xfc\x5a\x1e\x15\x06\xad\x12\x3f\xe8\xbc\x8c\xca\x83\x32\xda\x6b\x50\xc5\xf2\xb8\x43\xf2\xed\x72\xb9\x33\xe6\xd8\xe7\xde\x60\x54\x25\x59\x8a\xe7\x5f\x06\x44\xb1\xf8\x5c\x6c\xf2\xe7\xb1\x85\xd2\x34\xce\xc0\x04\x43\x13\x9e\xb6\x7c\xae\x6c\xc7\x1d\x52\x1b\x13\x41\x12\x75\xd1\x90\xbd\xc6\x40\x60\x18\xfe\x0e\xfb\x4f\x7e\x12\x68\x84\x04\xfa\x00\x61\x1e\x09\x3f\xae\x9e\x20\x7e\x80\x3e\x1f\x36\xd2\xb8\xa5\x86\xe8\x68\x4b\x70\xb9\x4c\x58\x1e\x55\x5f\x67\x01\x19\x4e\x15\xb7\x11\xe2\x52\xa7\xda\x6d\x86\xd8\x49\x4b\x3c\x40\x77\x0c\x0c\x08\x46\xc6\x50\x92\xa6\x45\x89\x50\x10\x18\xa8\x0a\x10\x61\x54\x21\x09\x45\x55\x30\x45\x42\x24\x91\x86\x55\x58\x51\x54\x14\x27\x11\x94\x24\x00\xa2\x88\x04\x82\x22\x04\xa1\x28\x08\xe9\x46\x36\x92\x41\x65\x04\x05\x22\x23\x31\x08\x82\x50\x04\x4c\x11\x0c\x02\xcb\x32\x22\x31\x0a\xa1\x92\x2a\x86\x92\x2a\xa0\x50\x4c\x94\x45\x91\x56\x29\x8c\x01\x18\x05\x03\x20\x63\x24\xa3\xd0\x0a\x4e\xfa\xbd\x0c\x12\x89\x91\xe4\x13\x86\x3f\x21\x58\x34\x74\x06\x9f\xbf\xe3\x04\x0c\x93\x64\x66\xa9\xdf\x6b\x60\x24\x4e\xc3\x0f\x10\x42\xba\xed\x79\xf2\x3c\x40\x98\xfb\x1f\x12\xfc\xb7\xfb\x88\xec\xff\x70\x59\x63\x59\x96\x2d\xa2\x53\x9b\x5b\x7c\x48\xd3\x4e\x19\x29\x20\xd3\xf6\xb6\xb0\x50\x86\x28\xbd\x91\xee\xe5\x77\xab\xf6\xd1\x92\x09\x1c\x2b\x2d\x56\xa8\x31\x42\x9e\x9d\x47\xf3\xb5\x3c\xed\x2c\x38\xba\x7a\xdf\xa9\xcf\xeb\x4d\xa4\x84\xac\x3f\x8a\x86\x03\xb6\xdb\xc9\xfd\x74\xd9\xa2\x45\xb1\x4e\xca\x23\x59\x6c\xbb\xa8\xd9\x61\xeb\xb5\x51\xf0\xff\xf4\x1e\x63\xeb\x90\xfd\x97\x21\x21\x6d\xc8\xc2\x4a\x06\x76\x7d\x69\xbf\xf4\x1a\x2f\x2d\xe3\x71\xf4\x68\x3f\x8a\x85\x8a\xce\x35\x9d\x59\x8f\x98\xad\x94\x41\xfd\x95\xe7\xee\x51\x75\xdb\x1e\xbc\xbc\x74\xb5\x4a\xa5\xdf\x99\xcf\xa6\x1f\xdd\xd5\x60\xa8\x17\x46\xb5\xe7\x32\x4e\x19\x9d\xb1\x36\x28\xaf\x26\x2e\xe6\x3e\x8f\xd7\xc5\xed\x1c\x0d\x11\x63\x39\x9b\x8d\x79\xc6\xec\x10\xc1\xdb\x2c\x5b\x82\x5f\xe2\x8a\xff\xa3\x1f\xdf\xa8\xe0\x04\xc7\x8f\xba\x02\x7e\x1b\x33\xbe\x43\x10\x09\x83\x15\x4c\x25\x61\x0a\xa6\x30\x91\x54\x68\x18\xa7\x68\x8c\x81\x19\x98\xc2\x48\x09\x96\x55\x06\x13\x01\x43\x02\x04\x87\x61\x9c\x62\x68\x84\x22\x11\x0a\x67\x28\x58\x92\x68\x09\x55\xd3\x5c\x01\x4d\x34\x76\x92\x22\xd0\x64\x57\x70\x4b\xa9\xbb\x5d\x10\x21\x19\x84\xc6\x53\x5c\x01\xcd\xe9\x0a\xeb\xe7\x6d\xa9\xc7\x4c\xe4\x4a\x73\x86\xb2\x1d\xbc\xd9\x9e\x56\x78\xab\xd4\x9a\x92\xe4\x00\xef\xb3\x1c\x18\x95\xd1\x32\xac\xaf\x16\xb8\xbd\x34\x3b\xdd\x81\x3a\xdd\x0e\xd7\xdb\xba\xb5\x9c\xb5\xf5\x9e\xd4\x11\x51\xbc\xdb\x2e\xde\xbf\x19\xef\x55\x85\x2a\x6f\xd1\x66\x43\x5f\x73\x9d\x37\xbf\xe9\x3c\x57\x08\x35\xe5\xbc\x59\x7c\x31\xa7\xfd\xd6\x06\x59\xb1\x8f\x43\x69\x3e\x5d\xcc\x8a\x35\x8b\xe1\x97\x58\x81\xbe\x57\x3b\xcf\x0e\xae\x20\x9b\x49\xcb\xaa\x15\x56\xa6\xf3\x6e\xbd\x6e\xbb\x33\x7c\x31\xa9\x62\x8f\x7c\xa5\xbf\x64\x7b\xfa\x9b\x39\xb5\x7a\x5c\x99\x83\x07\xec\xba\xd0\x2d\x76\x46\xa6\x6c\x9b\x1e\xe6\x76\x8c\x2b\x94\xaa\x71\xe6\xf4\xff\xc7\x15\xb0\xdb\x98\xf1\x1d\x46\xa8\x98\x44\x52\x18\x83\x8b\x18\x06\x44\x91\xa1\x29\x15\x07\x18\x26\xc1\xb4\x08\x14\x5c\x04\x14\xc0\x51\x51\x42\x15\x80\xc8\x80\x90\x25\x99\x56\x28\x55\xc2\x65\x05\x28\x32\x2e\xe1\x54\x9a\x2b\x20\x89\xc6\x4e\xd1\x24\x9d\x5d\x1a\x04\x79\x84\xa6\xe9\x14\x57\x40\x72\xba\xc2\x76\xb8\x75\x8c\x66\xdf\xdc\x92\x1f\xb3\x0a\xd3\x6c\x50\xc5\x1a\xd5\xb7\x0c\xa2\xf8\xb1\xc1\xde\xb6\xfa\x86\x7e\x1f\xde\xc3\x5b\x80\x71\x4e\x45\x9a\xbe\x4f\x59\x07\xe9\x11\xeb\x0f\xb6\xb1\x1c\x4b\x1b\x51\x93\x7a\xa3\x0e\x6e\x6b\x05\xb2\x3f\x6e\x93\x1a\xb3\x28\x4d\xe6\xb2\x36\x96\x57\x5e\xd3\xb9\xae\xc0\xae\x0e\x4d\xa9\x6f\x5f\x90\x65\xb5\x5b\x19\x6e\x39\x9d\x55\x61\xa2\xfe\xc6\x53\x1f\xda\xc7\xe0\xa3\xb6\x7c\xaf\xbc\xf5\xb4\x77\xe9\xb1\x30\x79\x26\xcb\xf6\xe2\xc5\x61\x56\x9b\x5e\x4f\xde\xa0\x66\xab\xfd\x58\x56\xf5\x6e\x7f\x23\x3a\x06\x5f\x40\x3b\x8b\xf1\x94\x78\x29\x3d\x2e\x54\xb9\xf6\xe8\x2c\x97\x13\x2f\x2a\x34\x62\x5c\xa1\x30\x8d\x33\xa7\xff\x3f\xae\x80\xde\xc6\x8c\xef\x48\x4c\x61\x68\x95\xc0\x48\x00\x48\x5a\x41\x24\x94\x92\x08\x89\x66\x54\x14\x13\x55\x02\x43\x10\x89\x22\x48\x46\x44\x71\x55\x54\x11\x1c\xc6\x44\x05\x96\x08\x54\x22\x5d\x22\x94\x04\x18\xe6\xce\x1b\x5a\xc3\xb1\x56\x0d\x27\x1a\x3b\x03\x63\x24\x91\x59\x4a\x13\x34\xc3\x60\x38\xc1\xa0\x29\x9e\x90\x73\x74\xd4\x1a\xbf\x23\xfc\x82\x30\x61\xe9\x85\x1a\xe0\xc6\xa6\xb9\xec\xaf\x9f\xb1\xd7\xb9\x39\xbd\x5f\x96\xd9\xa6\x53\x44\x6a\x68\x83\x2a\x50\xe4\x78\x31\xee\x54\x2c\xa6\xaf\x0c\x6b\x52\xaf\xa6\xc9\xba\xda\x7c\xdf\x50\xe8\x68\x5c\x7e\xe9\x4f\x5f\x5a\xaf\x72\xad\x47\xbc\x39\x4b\xd3\x9a\x21\x87\xd1\x11\xeb\xd9\x69\x75\xff\x1f\xeb\x15\xd9\x87\xf7\x15\xdb\x6a\x07\x16\x8b\x6d\x99\xb7\x19\xdb\x9d\xd7\x19\x87\x7d\x5d\x4f\x9d\x75\x09\x1b\x76\x9b\x73\x4c\x73\xd6\xdd\x25\x37\x6b\x90\x6c\x7f\xba\x2a\x74\x71\xae\x63\x2c\xef\xeb\x8e\xf3\xb8\x91\xb7\x8f\x6b\xfa\xf1\x5e\x2f\x17\x68\xd8\x32\x5e\xd7\xd4\x3b\xda\xb0\x66\x28\xc3\xcd\x17\x76\xbf\x73\x3f\x59\x32\x63\x0f\x73\x35\xc6\x4f\xe2\x9f\xff\x72\x3f\x81\xf3\xfb\x09\x72\x1b\x1b\xf7\x16\x6d\x77\x96\x8e\x30\x14\xfc\x0d\x46\xbe\xc1\x08\x04\xc3\x4f\xde\xbf\x64\x5b\xa6\x51\x8c\x4e\x2d\x75\xd1\xe3\x28\x83\x33\x24\x85\x32\xe4\xd9\x96\xee\xb3\xf4\x6f\x37\x4a\xf2\x53\x18\xd6\x34\x7c\xf3\xb8\xe9\xd6\x0a\x54\xc9\x28\x31\x15\x14\x5e\xbf\x17\xee\x6d\x78\xe2\xd8\xab\xea\x6a\x8b\x0c\x95\xee\x60\x24\x16\x5e\xc4\xb2\xe7\x44\xdc\xd9\x46\x9c\x14\x0c\xfe\x93\x9f\x83\x11\x67\x4c\xb2\x73\x6c\x8b\xbe\x74\xce\x9d\xb0\xda\x9d\x98\xd7\x4a\xf0\xb8\x0c\x34\x68\x34\x73\x75\x19\x1a\x2c\x9a\x6f\xb9\x0c\x0d\x1e\xcd\x0c\xdd\x66\x73\xf6\x4d\xd2\x9b\xe9\x3b\x07\x1e\x20\x3c\x6f\x5a\x37\x61\x8b\xf2\xd5\x76\x12\x6a\xd4\xb0\x61\x1c\x5e\x48\x7f\x5c\x9c\x3f\xfb\xf9\x0b\x32\xfb\x31\xdc\x1e\xdb\xdf\xfe\x05\xf6\xb8\x25\xfc\xc4\xa0\x36\x31\xfc\xf3\xa7\xae\xca\x50\x3e\x40\x3b\x4c\x87\xa4\xdc\x6f\x93\xf2\xc8\xae\xf7\x2f\x78\x28\xfd\xa9\x2e\x0c\x05\x58\x5e\x62\xf0\xc2\xa5\x0e\x2f\x8f\xe9\x2f\x38\x5c\x95\x5f\x74\x15\x95\x9d\x8b\xbd\xd1\x9a\x4c\x82\x9b\xc4\x6c\x3b\xbf\x62\xdf\xc9\x59\x3b\x70\x2f\x75\xc5\xc4\x9d\x3b\xb1\x9d\x36\x99\xdc\xdb\x66\x22\x42\xa3\x9e\x72\x29\x22\x2c\x62\x8c\x49\x1d\x77\x26\x22\x3c\x6a\xd5\xb7\xda\x0b\x7c\x93\xce\x3b\x6b\x37\xd4\x19\xdd\x77\xe2\x5e\xd8\x1b\x58\x4d\x68\x4d\x58\x82\x69\x8a\x11\x15\x85\x51\x31\x86\xa0\x64\x86\x62\x48\x05\x51\x10\x55\x42\x31\x0a\x85\x15\x09\x28\x08\xa1\xc0\x14\xc5\x60\x32\x85\xa3\x14\x85\xe1\x04\xa1\xa2\x14\x4c\xca\x30\x60\x44\xd4\x9d\xa0\xf9\x4b\x2b\x97\x77\x6e\xa1\x6c\x07\xb3\x1f\xdd\x26\xa7\xcd\x31\x34\x39\xcf\xe8\x96\x62\x77\x11\xeb\xf7\x87\xc5\xad\xed\x78\xdd\x93\x16\x2a\x5f\x1e\x3d\xd6\xba\xf6\x7a\xde\x28\x3f\xde\xf3\x55\x72\xcc\x63\xb3\x25\x6e\x4e\xc8\x79\xa1\x39\xfa\x18\x56\xca\x28\xcd\x7a\xc3\x4a\xf7\x69\xb8\xff\x15\x23\xa3\xb6\x50\xe6\xcf\x4b\xd2\x71\xe3\x67\x66\x31\xf6\x86\xa0\x9c\xf7\x9f\x1f\xda\x0e\xf0\x1f\x92\xc2\x55\x57\x2e\xa6\x22\xd1\xeb\x02\x62\x0a\xc3\xf7\xc5\x5a\x7f\xd1\x77\x54\x51\x15\x97\xe4\xba\xda\x5b\xe2\xd8\xbc\x37\x69\x92\x6d\xad\x05\x6c\x7c\xf1\xc8\x93\xed\x9f\x3f\xef\xc2\x43\xfa\xe7\xd0\x50\xf8\xf0\x67\x2d\xc4\xd7\x01\xde\x2b\xf7\xa6\x9c\x25\x8f\x81\x50\xd5\x47\xde\x28\xf3\x0b\x82\x86\x5f\xdf\xe9\x79\x6d\xfb\x3c\x5d\x0d\x1f\x71\xf8\x7d\x3e\xc5\x80\xf8\xa8\x69\xa5\x8f\x29\x47\x68\x73\x59\x1e\x4a\x5e\x52\xa7\xf8\xca\x2e\xdf\x9b\x07\x5d\x14\x22\xf4\x83\x87\x3b\xd6\x8d\xb5\xd6\x90\xfa\x84\x37\xde\x25\xb1\x26\x97\xed\x61\x1f\x55\xb9\x61\x43\xe5\x27\x7d\x5b\x9e\xb2\xa2\x62\x57\xe9\x12\x35\x98\x3b\x70\xfb\x3d\x16\x9f\xf7\xde\x3f\xbc\x9f\xd9\x76\xac\xde\xae\xe3\xdb\xc9\x5e\x7e\x7f\x5e\xce\x45\x99\x2e\x1c\xd3\xab\xd1\x23\xa7\x8b\x97\xc6\x38\x8a\x6a\x46\x41\x2a\x23\xbc\xb1\x2e\x6f\x2b\xdb\x51\xb9\x5e\x79\x61\x9f\x0d\xa9\xd8\x62\xef\x91\x7d\x5b\x9e\xe0\xe3\x0e\xf4\x56\xff\xb5\xfc\x97\x0f\xef\x25\x1a\x95\xfb\x28\x65\x6c\x3b\x83\xd6\x66\x6a\x35\xc4\x5e\x41\x7d\x7c\xef\x36\x67\x3d\x85\xb0\xee\x6b\xd5\xe6\x47\xbb\x37\xab\xe9\xeb\xb5\xb2\xf4\xe0\x5f\xfa\xc5\xfb\x06\x7e\x90\xdf\xb3\xbf\xa8\xef\x84\xda\xda\xa3\x57\x5c\x3e\xd7\xfb\x0b\x16\x05\xbc\x63\xce\x57\x83\xb5\xd2\x1b\xd3\x1d\x79\x4d\xa3\x85\xee\x7a\xd3\x2e\xcc\xd1\xd5\xfb\xaa\xe5\x88\x33\xac\x53\x6c\x1c\xcb\x1c\x56\x84\x87\xd3\x2b\x3f\xd7\xbe\x43\xbe\xdb\x81\x65\xe3\x55\x0f\xa1\x3d\xf8\xd3\x64\x8f\x9f\xbb\x4e\x3f\x4d\xf9\xa0\x1f\x2e\x5e\x9e\xdb\xea\xa7\xc0\xfe\x97\xf9\xbf\xab\xf3\x7f\x16\x7d\xd8\x58\x8c\x79\xbe\x35\xd1\xf4\xba\x5e\x1f\xa2\x06\x6a\xdd\xdb\x5d\x8e\xba\xe7\xc9\x3e\x5e\x5a\x4c\xab\xef\x98\xd5\xac\x2f\xb7\x60\xfa\xd3\x1b\x1f\x7a\x5b\xed\x77\xf9\x19\xff\x7f\x37\xca\x7a\xc1\x24\x7b\xa4\x11\xde\x36\xca\x28\x00\xc7\x09\x58\x92\x65\x84\xc6\x60\x89\x54\x44\x1a\x53\x25\x9c\x46\x44\x51\xa2\x31\x4c\x91\x60\x5c\x11\x15\x15\x01\x34\xad\x10\x24\x2d\xc2\x30\x4a\xe1\x0a\x0e\x63\xb4\x42\x60\x08\xf0\x23\xfc\xad\xc2\x21\xcd\x64\x85\x43\x92\x22\xa9\xb4\x65\x37\xbf\xf4\x68\x0c\x77\x6d\x38\x8c\x35\x31\xff\xe9\xc7\x98\x71\xbc\xcb\x9e\x3c\xd7\x76\x61\xe3\x9d\xc9\x16\x58\xf0\xba\xb8\x5f\xb4\x7a\x74\xad\xf9\x66\xd6\x4c\xfe\x45\x53\x8a\x83\x8f\x57\x9b\x42\x06\x6c\xf5\xa3\x6d\xd8\xe8\xf8\x03\x9f\x35\xb0\x7a\x41\x5f\x34\x5e\x4b\x15\xf0\xfe\xd8\x7d\x79\xeb\xaf\xb5\x9a\x6e\x77\x3b\x44\xe3\x65\xd5\xee\x63\x8e\xd5\x96\x5a\x76\x93\x5d\x49\x04\x59\xd0\x0c\xa9\xb8\xca\x15\x8e\x43\xdd\x67\x4a\x38\x0e\x01\x5d\xe2\x8e\xc6\xa1\x2d\x12\x9e\x93\x50\xb1\x7b\x0a\x37\xa6\x9f\xd0\xb6\xe9\xf4\x7f\x61\x77\x7a\xfa\x24\x26\x10\xb9\x5f\x41\xff\x57\x76\xe7\x71\xe1\xa8\x74\x1d\xff\x01\x73\xab\x24\x1d\xfd\x4e\xfd\x9d\x43\xdf\xf7\xc5\x7f\x7e\x95\xa3\xdf\x38\xa4\xe0\x32\xce\x10\x18\xa6\x30\x18\x25\x32\xde\xc4\x89\x04\x04\x8c\x60\x28\x2a\x49\x24\x0c\xab\x2a\xc0\x30\x54\x52\x69\x9a\x96\x25\x9c\xc2\x25\x05\x47\x49\x44\xc1\x51\x95\xc0\x51\x9c\x82\xef\xfc\x5d\x5e\xd7\x64\x41\x82\x84\x5c\x5a\x20\xa1\x68\x1a\x4f\x5b\x96\xf6\x4b\x8f\xa6\xde\xbe\x31\x3e\xd7\xe9\x4a\x7b\xd9\x9e\x4a\x35\xb4\xc2\x62\x83\xd7\xf7\x8e\x55\x9b\xbd\x0f\x61\x58\x7d\xa6\xed\x7a\x95\x9a\xc1\x5c\x67\xf5\x32\x78\x64\x87\x18\xbb\x0f\x24\xde\x93\x12\x48\xfc\xe7\x82\xce\x29\xbc\x04\x50\x78\x5d\xae\xca\x8c\x5b\xc4\x95\x34\xf8\x9e\xa1\x1f\x75\xa7\x8b\xb6\xc6\xcd\x35\x5f\xe4\xcd\x89\x52\x84\x65\x67\xda\x1c\x58\xbc\xd1\xbe\xc7\xc0\xeb\x02\x6d\x55\xb1\xfb\x3a\xaf\xbc\xda\xf6\xa8\x69\xad\xf0\xc9\x6a\x39\x2e\xf7\xeb\x76\x63\xde\x45\x48\x72\x43\x59\xaf\xea\xc6\x20\xd9\xea\x9c\x9a\x7c\xbc\x12\xf3\x46\x29\x47\x40\x38\xb2\xda\xa4\x80\x10\x76\x80\xd1\x72\xa5\x14\x99\x62\xc7\xb6\x46\x72\x49\x19\x0f\xf8\x67\xfb\x43\xe4\xd5\x5e\x87\x96\x36\x2b\xfb\x7d\x21\xb5\x3b\x15\x56\x97\xe8\x82\x2a\x07\x4b\x24\xad\x47\x23\xd9\x7d\x82\x27\xa3\x43\xbe\x1d\xfd\xcb\x02\x82\x47\x3f\xda\xa1\x15\xb4\xc7\x02\x5c\x87\x5f\x9e\x37\xce\xdb\x8a\x47\xf4\x11\x2c\x6e\xe6\x26\xc2\xf0\x95\xf5\xb2\x5e\xdc\x34\x09\xa7\xc0\xc9\x45\xbf\x8d\xb1\x89\x63\x35\x8d\xd1\xe3\xbd\x9c\x49\x33\xbd\x43\xbb\x82\x7e\xb9\x37\x28\x2c\xae\xa0\xcf\xb2\xff\x5e\x87\xfe\x33\x2e\xb8\x14\x2e\xd7\x45\xd3\x18\xa7\x8a\x99\xa5\x8b\x6b\xdb\x22\x6a\x0b\xe7\xeb\xe2\x1f\xdc\x69\x2d\xd5\x16\x21\xf5\x9d\x77\xb4\x67\xf7\xda\xef\x62\xb5\xd2\x76\x2a\xf5\x71\x49\xff\xd8\x8e\xe1\x96\x83\xe9\x92\xf3\xbe\xe1\x1f\xb5\xed\xf0\x55\xaa\x3f\x97\x3e\xe8\x66\xb5\x51\x47\x3b\xaf\x45\xaa\x54\xeb\x3b\x60\x61\x2f\x48\x64\x48\xcf\xef\x27\xc5\x1a\xc0\x6b\x3a\x10\x7b\x6c\xce\xe0\x92\x78\x98\xe6\xe9\x5d\x13\xfb\x73\xad\x77\xc7\x4a\x9c\xfb\x73\xd0\x10\x46\xff\xdc\xdb\x52\x29\x7c\x48\x45\x94\x20\xd4\xea\x54\x1b\x6c\x67\x04\xd5\xb8\x11\xf4\x45\x53\xb2\xce\xbb\x8c\xbf\x7b\xe3\x6a\xae\x23\x58\xe3\x38\x8f\x23\x9c\xc9\x7d\xe4\x87\xcc\x97\xdd\x5d\x72\xb5\x74\xc7\x64\xe3\x84\xbb\x88\x31\xa8\xcf\x57\xdb\x7d\x0e\xfa\x72\x00\x7f\x08\x1d\xec\xf8\x70\x74\x0c\xe3\x99\xaa\xb9\x4d\xb3\x9e\x2d\xf8\x59\x8d\x9a\xb0\x2a\x9c\xb1\xf2\x7a\x5b\xc9\xe2\x89\xa4\x49\x9a\xc2\x56\x6e\xc9\x13\x97\x55\x32\x17\x2e\x6e\x2b\x7d\x12\x99\x34\xf9\x53\x59\xcb\xd4\xc0\xf1\xdd\x51\x81\x20\xde\x3d\x53\xf9\xce\x14\xf1\xaf\xa4\x3a\xc2\x02\x35\xf9\xa8\x33\xf4\xbb\x55\xfe\x19\x92\x1c\x0b\x80\xb0\x77\x25\x73\x13\x5c\x7b\x75\x35\x3f\xc1\x91\xa9\xb9\x38\x4a\xf0\xeb\xd0\x95\x5d\x97\xb2\x73\x40\x11\xe6\xe4\x68\x3a\x74\xcc\x8f\x0f\xfc\x70\x72\xc2\x49\x1c\x73\xde\xa5\x63\x57\x70\xe6\x1d\xf4\x92\x8b\xad\xe8\xf1\x30\x71\xdc\x04\x37\xa5\x5d\xc1\x8f\x8f\x21\x1f\x47\x91\xb3\x67\x1e\x4e\x8f\x99\x89\x75\xf9\xf0\xd5\x6f\xe7\x73\x1a\x44\x09\x9f\xe1\x08\xba\x30\xdb\xbb\xdf\x26\x1d\x71\x1c\x77\xe2\xda\xc3\xee\x74\xb5\x24\x66\x0f\x67\x5a\x5c\xc9\xa6\xa6\xe4\x66\xf0\x70\xbc\xd4\x43\xec\x31\x71\x19\x4c\xef\x6e\xeb\xbb\x05\xdf\x01\xae\x30\xeb\x09\xa1\xea\x22\x49\xe2\x05\xd8\x5d\x4c\x78\x0b\x01\x02\x5c\x09\x36\x7d\xa1\x08\xc7\x67\x85\x9d\x0a\x11\xba\x86\xf1\x52\x6f\x0c\xe1\xb8\x54\xf9\xe9\x8a\x8e\xdc\x2b\x79\xad\xae\x8f\xd1\x85\x59\xde\x6d\x78\x3d\xe2\x31\x9e\xa3\xd3\xbb\x31\xaf\x67\xeb\x04\x67\xbe\xee\x2d\x8e\xc1\xd0\x2d\x9f\x17\x37\xeb\x01\xc7\xe5\x26\x99\x65\x7e\x71\xf7\x97\x5e\xce\xf0\x29\xb2\x08\xe7\x0a\x88\xf0\x19\x39\x39\x32\x9d\x41\xff\x42\xd6\x9b\xb0\xe7\xa1\xca\xc5\xdc\xee\xdc\x87\x44\xd6\xa2\x17\xcc\x5e\xcb\x5f\x04\x5f\x16\x93\xa7\x47\x62\x66\x72\x7a\x1b\x3d\x1e\x61\xcb\xcb\x65\xa6\x36\x6f\xc3\x5b\x2e\x9e\xd2\x79\x89\xdc\x64\x7c\x15\x47\xc7\xb8\x72\xb7\xe8\xee\xd0\xcd\x58\xfe\x4e\x2e\x67\xbe\x8a\xc3\x28\xb6\x7c\x7e\x1b\x30\xf8\x70\x72\x4e\xe8\xc3\xc9\x59\xb3\x09\x42\xdc\xa0\xdf\x0e\xf0\x64\x71\x7c\xe6\xe8\x28\x7a\xa7\xf6\x55\xda\x3d\x43\xb1\x99\x7a\xcb\xbe\x2c\xfc\x4a\x85\x66\x12\x38\x9a\xa7\xed\xce\x1e\x39\x9e\x19\xf9\x80\x67\xf0\x7e\xbd\x1d\xa4\xe1\xce\xe6\x38\xc6\xcb\xd2\xaf\x82\xbf\xd4\x1e\x52\xb1\x66\x0e\xfb\x5d\xa0\x0c\x46\x63\xef\xbc\xbf\x0d\xb7\x71\xa8\x33\x87\x6f\x79\x2d\xf9\xf8\x92\xff\x9b\x1a\xc3\x11\xea\x4b\xc6\x9b\xc9\xe8\x22\xb7\x2d\xdc\x5e\xd1\x27\xf7\x39\x64\xb2\x1f\xa9\x90\x5f\x98\xd0\xf5\x1a\xbf\x4c\xff\xe1\x2b\x3c\xb2\x24\x09\xc1\xe6\x17\x22\xee\xb2\x90\x5f\x26\x4d\xec\xcd\x24\x59\x62\xc5\x55\xca\x2f\xdf\x2e\x89\xf2\xcb\x64\xda\x1f\xd3\x9b\x25\x47\x62\xb6\xeb\x18\xf5\xe1\xd7\x1d\xbf\xc2\xb5\xa3\xd8\x63\x27\xc0\xe7\x3a\xf8\x31\xd2\xe3\x29\xd4\x8d\x3c\x3c\x8d\x44\x1e\x19\x32\xe6\x75\xa9\xc4\x6e\x17\xbe\x4e\x11\xe7\xe2\x3d\x3b\x88\x85\x27\xdb\xbf\xc2\x6c\x4e\xf1\x5f\x3c\xd5\xf7\x4f\x07\xdc\x05\xf2\x5d\x86\x51\x90\x4c\x73\x7a\xb1\x96\x53\x70\x66\x0e\x11\xbe\x7c\xd9\x5d\x7d\xf1\xed\xcf\x3f\xa1\x3b\xdb\xd4\x95\xd0\x6a\xda\xdd\xd3\x93\x03\xd6\xce\xd7\xaf\x0f\x50\x32\xa0\x6c\x2a\xf9\x00\xfd\x5c\x7c\x32\xa8\x64\x2e\x26\x6f\x4e\x2e\xf2\x47\xa0\xe9\x0c\x1c\x81\x46\x58\xf8\x0a\x0d\x2a\x5c\x87\xf3\x8d\x0c\xfa\x09\x61\x58\xee\x85\x68\x4d\x11\xd4\xd0\x32\x51\xb9\xf6\x7b\x96\xa3\x03\xb2\x50\xb9\xd9\xe1\xaa\xcf\xfc\x7e\x09\x08\xea\x70\x65\xae\xc3\xf1\x45\xae\x1b\x59\x15\xf1\x4a\x9b\x3c\xd4\x6f\x95\x5c\x93\xe9\x70\xfe\x7d\xaf\xee\xa7\x12\x57\xe7\x7a\x1c\x54\x64\xbb\x45\xb6\xc4\xa5\xdf\x51\x12\x7f\xa9\xc4\x3e\x8b\x70\x3b\x65\x1c\xd3\xc9\x58\x24\x4b\xe2\xe4\x58\x3f\xd1\xb4\x51\xac\xb2\x82\x81\x7e\xc6\x8a\x62\xa2\x26\x82\xa9\xec\xbf\xae\x87\x30\x1f\x71\x5a\xd8\x65\x09\xd2\x0d\xe6\x3c\x0d\x9c\x26\x95\xfe\x45\x35\x24\x30\x73\xac\x8b\x98\x34\xd8\x6d\x8d\x22\x9a\xe2\xf8\x4f\x50\x48\xb2\x69\x9c\xe4\x90\xf2\x5a\x47\xcb\xb4\x9d\x89\x05\xba\xed\x3a\xa4\x88\x8e\xe8\x9a\x18\xa4\x2c\x66\x73\x48\x36\x67\x73\x1d\x38\xc0\x93\xe1\xff\x02\x00\x00\xff\xff\x45\x3a\x63\xad\x77\x93\x00\x00") - -func kahuna2HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _kahuna2HorizonSql, - "kahuna-2-horizon.sql", - ) -} - -func kahuna2HorizonSql() (*asset, error) { - bytes, err := kahuna2HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "kahuna-2-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3, 0xfa, 0x9c, 0xf2, 0x8c, 0x24, 0x1b, 0xa9, 0xc2, 0x61, 0xd9, 0x3, 0xc8, 0x9b, 0xbd, 0x4d, 0x8b, 0xbb, 0xc1, 0xea, 0x79, 0xa9, 0x2a, 0xf2, 0xbe, 0x8f, 0xe5, 0xd9, 0x20, 0xe0, 0x50, 0x35}} - return a, nil -} - var _kahunaCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\xbd\x57\x93\xdb\xc8\x92\x80\xfb\x3e\xbf\xa2\xdf\x74\x4e\x70\xce\xb2\xbc\xd9\x73\x67\x23\x40\x12\xf4\x00\x3d\x09\xf0\x65\xa2\x2c\xbd\xf7\xfc\xf5\x37\xc8\x96\xba\xa9\x9e\x96\x39\x1a\xed\xde\x1b\xa1\x8e\x09\x4d\x8b\x48\x26\xb2\xb2\xbe\xca\xca\xaa\x2c\x40\xff\xfa\xd7\x6f\xff\xfa\xd7\x53\x73\xb5\xdb\x8f\xb6\xae\xd3\xaa\x3f\x59\xb5\x57\x5a\xed\xdc\x93\x3d\x2c\xd6\xbf\xfd\xeb\x5f\xbf\xdd\xae\x17\x0e\x8b\xb5\xb3\x4f\x7e\xbb\x5a\xbc\x0a\x1c\xdd\x76\x37\x59\x2d\x9f\xe4\x7f\xb1\xff\x82\x0f\x52\xfa\xf2\xb4\x1e\xfd\x79\xfb\xfa\x1b\x91\xdf\x3a\x61\xf7\x69\xb7\x57\x7b\xb7\x70\xcb\xfd\x9f\xfb\xc9\xc2\xad\x0e\xfb\xa7\x3f\x9e\xc0\xbf\xef\x97\xe6\x2b\x33\xfb\xeb\xa7\x13\x3b\x77\x7f\x4e\x96\x7f\xee\xb7\x6a\xb9\x53\x66\x3f\x59\x2d\xff\xdc\xb9\xdd\x4d\xef\x5f\x85\xcd\x7c\x72\x53\xed\x96\x66\x65\x27\xcb\xd1\xd3\x1f\x4f\x1f\x7a\xdd\xa2\xf8\xf0\xef\x4f\xf7\x5e\x5a\xb5\xb5\x7f\x9a\xd5\xd2\xaf\xb6\x8b\xc9\x72\xf4\xe7\x6e\xbf\x9d\x2c\x47\xbb\xa7\x3f\x9e\x56\xcb\x8f\x3a\xc6\xce\xcc\xfe\xf4\x87\xe5\xf3\xbd\xf4\xca\x4e\xdc\xed\xba\x57\xf3\x9d\xfb\xec\x36\x8b\xc9\xf2\xcf\x85\xdb\xed\xd4\xe8\x2e\x70\x52\xdb\xe5\x64\x39\x7a\x16\xd9\xae\x4e\x7f\xee\x9c\x39\x6c\x27\xfb\xcb\x4d\xb9\xf7\xff\xfe\xe8\x00\xa7\xb6\x66\xfc\xe7\x5a\xed\xc7\x4f\x7f\x3c\xad\x0f\x7a\x3e\x31\xbf\xdf\x3c\x66\xd4\x5e\xcd\x57\xa3\x7f\xff\xf6\x5b\xa1\xdd\x68\x3e\x55\xe2\x42\x98\x3c\x55\x8a\x4f\x61\x52\xe9\x74\x3b\x1f\x25\xff\xeb\xb0\x1e\x6d\x95\x75\xe3\xc9\x6e\xaf\x2f\x3b\xb7\xf9\xf7\x57\xa5\x77\x66\xbd\x39\xac\xb6\x87\xc5\xee\xfb\x84\xdd\xf2\xf8\x3d\x92\x73\x67\x47\x6e\xfb\x3d\x92\x37\x3b\xbd\x73\xdf\x29\xf9\x1d\x62\xda\xed\xf6\x2b\xef\xdd\x76\xb2\xb4\xee\xfc\x75\x59\x65\xcc\xea\xb0\xdc\x6b\x35\x57\x4b\xe3\x76\xff\xfe\x2d\xa8\x77\xc3\xf6\x53\x37\xc8\xd5\xc3\x07\xe9\x46\x5c\x4f\xdf\x71\xef\x6a\x7b\x79\xba\x6b\xcf\x37\xe2\x4e\xb7\x1d\x54\xe2\xee\xc3\x97\x3e\x17\xfc\x73\x3d\x73\x97\xef\xd1\xbf\x3f\x7f\x5b\xf5\x8b\xcc\x7f\xa0\xd5\xbb\xef\xb0\xf9\x51\xec\xfb\x75\x6f\x0f\xbb\xfd\x7c\xb2\x74\xbb\xaf\x69\x7e\x11\xfa\x6e\xbd\x37\x2b\xdc\x3d\x1a\x7c\x45\xef\xab\xd0\xf7\xeb\x7d\x41\xfe\x6b\x7a\x5f\x84\xbe\x5b\xef\xb3\xfc\x64\xe9\x57\x5f\xd1\xfb\x2a\xf4\xdd\x7a\xd7\x07\xbd\x3b\xe8\xaf\xe8\x7c\x16\xf8\x4f\xf4\xcd\x27\xbb\xf1\xe6\xe0\x0e\x5f\xf3\xec\xa3\xd8\xf7\xeb\x76\x6e\xfb\x35\xb7\xde\xaf\x7f\xb7\xb6\xfb\x30\xfe\x9a\xba\x67\x81\xef\xd6\xf7\x1c\x95\xc6\x4e\xd9\xaf\xab\xfd\x4c\xee\x7f\x59\xfb\xc7\x48\xe9\x36\x7f\x7e\xe7\x6d\xb4\x5a\x7e\x45\xb9\x56\xcb\xef\x36\xf8\x63\xf4\xfb\x9a\xad\x9f\x44\xfe\x53\x9d\xb7\x1c\xe0\xdb\x6a\x6f\x52\x1f\x35\xdf\x65\xdf\x2a\x7e\x37\xe4\x7e\x5d\xf6\x25\x34\x7e\x4b\xec\x35\xd0\x7d\x43\xf2\x25\x70\x7d\x5d\xee\x35\x10\x7d\x43\xee\x25\xb0\x7c\x53\xee\xbb\xec\x7b\x0d\x28\x5f\x97\x7b\x0e\x12\xdf\x94\x79\x19\xf2\xdf\x90\xbc\x8d\xe3\xaf\x8b\x3c\x8f\xcd\xaf\xcb\x7c\x36\x14\xbe\x2e\xaa\xd5\xf2\xeb\x02\x9f\x50\xfd\x2e\xa9\x1b\x79\x1f\x05\xc3\xa4\x1b\xc6\x9d\x4a\x23\x7e\x14\x9e\xaf\x47\xbb\xcd\xfc\xa3\x44\x27\x5f\x0e\xa3\xe0\x2f\xba\xfe\xfd\xdb\x73\x6e\x1c\xab\x85\xfb\xef\x4f\x9f\x3d\x75\x2f\x6b\xf7\xdf\x1f\xbf\xf2\xef\xa7\x8e\x19\xbb\x85\xfa\xef\xa7\x7f\xfd\xfb\xa9\x71\x5a\xba\xed\x7f\x3f\xfd\xeb\x9e\x32\xe7\xdb\x61\xd0\x0d\x3f\x69\xfe\xa4\xef\xb7\xcf\x34\x7e\x7e\xf1\xa3\xe2\x7c\x23\x8a\xc2\xb8\xfb\x15\xcd\xcf\x02\x4f\x8d\xf8\x73\x05\x4f\x95\xce\xd3\x87\x4f\xf9\xed\xa7\xcf\x76\x77\x25\x1f\xde\xde\xf9\x53\xf3\x3f\xde\xf3\xc5\x43\xdf\x6c\xcf\x67\xbe\x8c\x1b\xdd\x37\xfe\x7c\x1a\x54\xba\xe5\x17\xb3\x1e\x13\xda\xcf\x6e\xff\xaa\xe5\x8d\x21\xff\x49\xe3\xff\xa2\xe4\xee\x80\x66\x3d\xbb\x1e\xdd\x56\x31\xeb\xed\xca\x38\x7b\xd8\xaa\xf9\xd3\x5c\x2d\x47\x07\x35\x72\x77\x37\x7c\x67\x02\x7e\x13\xb3\xce\xab\xc3\x7c\xff\xe7\x5e\xe9\xb9\xdb\xad\x95\x71\xb7\xd5\xc4\x87\x37\x57\x4f\x93\xfd\xf8\xcf\xd5\xc4\x3e\x2c\x10\x3e\x6b\xec\x23\x90\x1f\x9b\x79\x47\xf7\xb5\x91\x9f\x00\x78\xcf\xe1\xcf\x94\x3f\x06\xdd\x7f\xfc\xf6\xf4\xf4\xf4\xe9\x93\x89\x7d\x32\x63\xb5\x55\x66\xef\xb6\x4f\x47\xb5\xbd\x4c\x96\xa3\x7f\x50\xf6\xcf\x7b\xdf\xc4\xbd\x7a\xfd\xf7\xbb\xf4\xed\x8b\x4b\xb5\x70\xef\x08\x0b\xf1\x9e\xf0\x51\xcd\x0f\xef\x49\x43\x88\xde\x8a\xcf\xd5\x6e\xbf\x58\xd9\x89\x9f\x38\xfb\x34\x59\xee\xdd\xc8\x6d\x5f\x44\x7e\xfb\xe7\xdb\xbe\x7f\x19\xc5\x7f\xd3\x17\xbb\x1f\x72\xc4\xc7\x85\xc0\x93\x9e\x8c\x26\xcb\xfd\x9b\x8b\x3b\xb7\x59\x1e\x16\xef\x5f\x5b\x1e\x16\xbb\x83\x76\xcb\xfd\xf6\xb6\x14\x7c\xdb\xcc\x67\x99\xc9\xd2\xcf\xd5\x6d\xc5\x68\xdd\x6e\xff\xbe\x39\xcf\x82\xe3\xd5\xc2\xd9\xd5\x42\x4d\x96\xef\x48\x11\xf2\xd6\xe8\xfd\x78\xeb\x76\xe3\xd5\xdc\xee\x9e\xf6\xee\xfc\xd6\x32\x3f\x57\xa3\x2f\x59\xf4\xd5\xbe\xf9\xe8\x91\xc3\xed\xae\xf3\x89\xd2\x93\xf9\x64\x7f\x6b\xdc\x73\xfb\x3f\xb9\x64\x3e\xff\xda\xe5\xc9\x68\x79\xcb\x85\x6e\x66\x3d\x7f\xf2\x90\x0d\xbc\xa4\x16\x1f\x9d\xfe\xe7\x7d\x59\xfd\x94\x2f\x87\xf9\xda\xd3\x3f\xfe\xf1\xa9\x2b\xfe\xe7\x8f\x27\xf0\xcf\x7f\x7e\xe5\xdb\x6f\x0d\x7c\xab\xe7\x2f\x0d\xf8\x96\xc6\xcf\xfa\xf2\x8d\xb6\xcf\xfb\xf9\x5b\x9a\xfe\xea\x9e\x37\xea\xde\xf1\xdf\xb3\xce\xbf\x0e\x8c\xdb\xfc\xf7\xa3\x63\xe2\x96\x32\x3e\x0f\x87\xe5\xca\xba\xc7\xb1\xf0\xd9\x18\xf8\xeb\x4d\x3f\x9f\x9f\x7f\xf4\xf6\x9f\x27\xc6\xcf\x86\x7c\xfc\x4c\xed\xc6\x0f\xc6\xb0\xbf\xb0\xbd\xde\xba\xe3\x37\x85\xf4\xc1\xcc\xdc\x7e\x3e\xd9\xed\xbf\x29\xfa\x92\x6d\x7f\xc2\xfd\xf9\x63\x33\x5f\xed\xdc\x7e\xb2\xf8\xc2\xc8\xbf\x07\xd6\x77\xc6\xd6\x43\x9f\x7f\x9e\xd4\xbf\xe8\x7b\xd3\xdf\xaf\xf7\xf9\x02\x3a\x5f\x5a\x1b\x7c\xae\xe6\xb5\x15\x5f\xa2\xe5\x63\xf2\xf5\xa3\x3d\xf6\x71\xe1\xf5\x8f\x97\x41\xee\xb6\xdf\x19\x41\x9f\x77\x5e\xec\x97\x22\xe8\x1d\x77\xb5\xdb\xb9\xfd\x7b\xfe\x7c\x1e\xab\x5f\xbc\xac\x16\xb7\x61\xf5\xbe\xea\xf5\x76\x62\xdc\xf2\x0b\x41\xec\x7e\xf1\x4b\x11\xee\x7e\xf1\xc9\xae\x0e\x7a\xee\x6e\xbc\x99\xc9\x7d\x47\xf2\xa7\x46\xd1\x87\x1e\xfe\xb8\x64\x7d\x6e\xcb\x9b\x7e\xfd\xd8\xc0\x2f\xb0\xf1\xf1\x9b\x1f\x3d\xfc\xe6\xab\x9f\xfc\xfe\x25\x20\x9e\x13\xf6\x1f\xe5\xe1\x79\x59\xff\x8c\xc3\x64\xfd\xde\xc4\x4f\xff\x32\x72\x57\xdb\xfd\x8b\x37\x0a\x61\x31\xe8\xd5\xbb\x4f\xe0\xed\xb4\xe9\xce\x7b\xb5\xdf\xbb\xc5\x7a\xff\x74\x1b\x16\xbb\xbd\x5a\xac\x9f\x6e\x29\xd3\xea\xf0\xfc\xc9\xd3\x75\xb5\x74\x7f\x9d\x6c\xbd\x9a\xcc\x0f\xdb\x87\xa9\xf6\x4b\x77\xd8\x5f\xd6\xee\xdb\x9d\xf2\xbc\x2d\xf1\xa0\xf7\xaf\x61\xff\xe5\x8e\x5f\xe8\x9d\x8f\x3b\x1b\xab\xed\xdb\x4e\xfd\xc7\xdd\x13\xff\xf3\x04\xfe\xf9\x14\xc4\x85\xa7\xe7\xbf\xfe\x3f\x7f\x3c\x31\x4a\x31\xfd\xe7\xbb\x7d\xf5\xb8\x0c\xfb\xe1\x2e\x7b\xdc\xe5\x79\x8c\xb9\x5f\xf0\xc6\xf3\x46\xdb\x6d\xd4\xbd\x6b\xd0\x6d\xed\xf8\x37\x4c\xd9\x1d\xf4\x47\x23\xb6\x6e\xf7\xd9\x04\x84\xdf\xcd\x18\xb7\x4e\xbd\x8c\xa5\xbf\xda\xf3\xb0\xe6\xfd\x51\x9b\x1e\x36\xeb\xbe\x63\x66\x7c\x36\x6c\xb3\x73\x5f\x9b\x61\xfe\x6a\xe7\xc3\x1a\xfe\x47\xed\x7c\x55\xf1\xfd\x76\xfe\x65\x92\x7b\x73\xdd\x2d\x8f\x6e\xbe\x5a\xbb\x6f\x4c\x69\xaf\xb7\xfe\x1b\x13\xd1\xc3\x76\xc7\xdf\x70\xc1\xa7\xfd\xda\x7f\x7c\x4f\x3f\xbc\x52\xf4\x2d\x47\x6c\xbe\x30\xd1\x7c\xee\x84\x4f\xfb\xc0\x9f\x69\x7c\xeb\x88\xcf\xee\xf6\x45\x67\xbc\xee\x11\xfd\xb0\x33\x5e\x37\xc5\xff\xf1\x3a\x6e\x3f\x5f\xbc\xbd\x33\xa6\xbe\x36\xba\x1f\x76\xb8\x7e\xd4\xaa\x87\x12\xc0\x8f\x2c\xbb\xee\x33\xfe\x57\x22\xf5\x64\xb7\x3b\xb8\xed\xf7\xab\x32\x2b\xfb\xee\xea\xf4\x2f\x6e\xd9\xcf\x27\x8b\xc9\x17\x32\x8a\xaf\xae\x05\xff\xbf\x5c\x55\x3d\xd0\xf9\x50\x55\xf9\xa1\x55\xd4\xe3\xf7\x7f\xd6\x3a\xea\x41\xe7\x8f\xaf\x7f\xbe\xa6\xf5\xb9\xd3\xde\x68\xfa\xd8\x93\xff\xf3\xfe\xc0\xfb\x6c\xbb\xf7\x87\x21\x7f\xac\xa1\x3d\x63\xbe\x3f\x7f\x16\x8a\xbf\x63\xbd\xf1\x16\xc0\xf3\xbd\x4a\xf9\xc5\xab\x66\xac\x96\x23\xf7\xee\xc2\xfe\xd1\x39\x8f\x65\xbb\x1f\x8f\xd5\xaf\x7b\xe7\x3f\xee\xa2\xff\x63\xff\xe8\x95\xbd\xbc\xe7\x9c\xfd\x79\xeb\x76\x87\xf9\xbb\xd1\x7d\x7f\x5e\xb8\x6f\xae\xe7\x5e\x4b\xac\x3f\xee\xcf\x37\x75\x8b\x1f\x75\xea\x9b\x8a\xf3\x3f\xbe\xcb\x71\x1f\xbf\xf4\x35\xef\x7d\x14\x79\xcf\x11\xdf\x87\xdd\x9b\x0a\xf7\x8f\x38\xaa\x70\x5b\x59\xfb\xd5\xf6\x1b\x9b\xa1\x4f\x85\xa0\x1b\x7c\xc3\x67\x95\xb8\x13\xb6\xbb\x4f\x95\xb8\xdb\xf8\x6c\x43\xb4\x1f\xd4\x7b\x61\xe7\xe9\x1f\x1f\x4a\x41\xda\xc9\x47\xb5\x56\xca\xc2\xb4\x9e\x34\x9a\xdd\x2e\xab\x36\x9b\x8d\xa4\x10\xf5\xe3\xdc\xa0\xd2\x6d\x76\x3b\xc3\x4a\x7f\x30\x20\xf5\x41\xd0\xee\xe7\x1a\xdd\x32\x6d\x77\xeb\x41\xe1\xc3\xef\x4f\x1f\xf4\xa2\xb8\x1f\x76\x82\x3f\x6e\xbf\xab\xa4\x7d\xad\x94\xec\xd1\xe6\x73\x57\x53\x2a\x4e\x87\x49\x34\xfe\xf0\xfb\x13\x91\xff\xfc\xf7\xff\x81\x11\xdd\xf0\x6e\x44\x54\x08\x4e\x51\xf0\xc7\xed\x77\x8a\xbe\xe9\xd0\xdd\xcf\xf0\xe6\xee\xb1\x15\x49\x05\xe3\x5e\xbe\xde\xea\xe6\x6b\x11\x8a\xa3\x76\xae\xc3\x93\x34\xd7\xa6\x98\xd6\xeb\x61\x3f\x28\xd7\x69\x9a\x8b\x49\xb1\x9b\xcf\x91\xf2\xb0\xdc\xe5\xc3\x80\xe6\xfb\xb5\x0f\xbf\x3f\x41\xf0\xf2\xf3\xfb\x13\x44\x42\x10\x09\xa0\x10\xe2\xf7\x27\xf0\xfb\x33\x66\x4f\x1f\x6e\x0d\x0c\x5a\x41\x10\x3c\x37\x10\xfc\xfe\x84\x3f\x5d\x7b\xfd\xf3\x7d\x6f\x3f\x1a\x59\x48\x8a\x41\xa9\x9a\xef\xe4\x2b\x24\x5f\x43\x69\xb9\xc6\xd2\x76\x3d\x60\xdd\x5a\x98\x14\xdb\x09\xcf\x45\xa5\x7e\xd4\x6a\xe4\xa2\x7a\x25\xec\x55\xdb\x55\x9a\xb6\xe2\x7a\x54\xc9\x7d\xf8\xfd\x49\x3e\xff\xb0\xbb\x8d\x1c\x72\x29\x98\x84\x37\x1b\xe1\xe7\x36\x8e\x2a\xf9\x60\xf4\xc9\x46\xf6\xb9\x8d\x1f\x6e\xf6\x3f\xb7\xa2\x80\xba\x14\x46\x13\xe4\xa7\x8b\x7c\x4a\x86\x99\x36\xad\x36\x62\x58\x9f\x1f\x36\xd7\xed\x72\xbd\xe8\x9e\x7b\xd5\xa4\xbb\xce\x06\xb8\xd8\x3e\xdd\xe4\xc3\x3f\x3e\x7c\xbb\x75\x01\x61\xfd\x76\x2d\x97\xaf\x57\x50\xc2\x0a\x49\x3d\xe1\x41\x25\xec\xb7\x8b\xf5\x32\xee\x05\x3c\xc9\x85\x38\x2e\xc5\x4d\xd6\xe0\xa4\xdc\xa2\xf5\xa4\x1c\x95\xba\x7d\x54\x7d\x6e\x1d\x7d\x69\x1d\x06\x80\x11\xce\x21\xe0\xec\xeb\x3d\x20\x7e\xa4\x07\x82\x12\x45\xdd\x01\x6b\x05\x39\xd6\x2d\xc5\x51\xa3\x5b\xc7\x28\x25\x11\xee\xb5\x5a\xf5\x38\x8e\xcb\xcd\xb0\x9c\x06\x95\xb4\xdd\x64\x9d\x62\x91\x0d\x83\x7e\xbb\x48\x87\xad\xf4\x66\x23\xbf\xf7\x80\xb8\xdb\x28\x18\x25\x1c\x50\xc6\xe8\xd7\x6d\x84\xe0\x87\x30\xc9\xf7\xbb\xb9\x52\x27\x0c\x7b\xbc\x56\x4f\x7a\x51\x39\xea\x24\xb9\xa0\x9e\x54\x51\x97\x54\x50\xad\xd1\x4c\x06\xa8\x43\xbb\xed\x7a\xad\xd0\xae\x04\x49\x81\xf6\x0a\xe5\x20\x6d\xdc\x8c\x24\xcf\x9c\xdc\x8c\x24\x1c\x11\xc2\x08\x40\x94\x7f\xc3\x48\xf4\x23\x46\xe6\x73\xbc\xd8\x4c\x4b\xf5\x3a\x6b\x57\x31\x2f\xd7\xda\x41\x3a\xa0\xdd\x60\x10\x15\x73\xa5\x52\xb1\x14\x91\x4a\xc4\xc2\x76\x2e\x3f\x4c\x2a\x28\x37\x24\x8d\x46\x23\x41\xbd\xe0\xe6\x49\xfa\x3a\xdc\x28\xa4\x58\x32\xc0\x29\x45\xff\x1b\x36\x06\xf1\xb0\xd4\xac\xa5\x74\xd0\x29\x0f\x4a\x34\x6d\x0c\xa3\xb8\x44\x51\x29\x5f\xa3\x9d\x7c\x95\xa4\xa5\xde\x20\xaa\x56\xfb\xa5\x61\xa7\x86\x8a\x4d\x92\xab\xa0\x6a\xa5\x1a\xa3\xfc\x73\x50\x78\xf5\x24\xa5\x02\x13\xca\x89\x20\xf2\x2f\x03\xee\x73\x2b\xc9\x0f\x79\xb2\x9c\x27\x05\x94\xef\x10\x9a\xaf\xb6\xe3\x98\xb4\x82\x72\x17\xd5\x8b\xc3\xa0\x5a\xe9\xd1\x66\xc0\xcb\x14\xd7\x70\xbf\xd1\x64\x83\xb0\xca\x92\x41\x39\xee\xc4\xc3\x5a\xab\x74\xeb\x6e\xf1\xca\xe4\x8b\x91\x14\x7c\xc3\x95\xf4\x87\x5c\x99\x0f\xda\x28\x08\xd3\xb0\x56\xe9\x86\xa8\x5e\xab\xd0\x76\x94\x14\x69\x54\xe9\x0f\x59\x8b\x27\x95\x7a\xbb\x51\x2a\x74\x11\x6a\xf0\x6a\x42\x0a\x9d\x41\xb1\xc3\x8b\x85\x42\xf3\x35\x74\xdd\x3d\xc9\x04\x87\x92\x70\xc6\x31\xff\x86\x27\xf9\x0f\x0d\x9c\xf6\x00\x73\x1a\x05\x69\x9b\xb0\x46\xa1\x54\x44\x83\x52\x10\xb7\xf2\xa8\xdd\x1e\xd6\x79\x03\x11\x56\x48\xcb\xe5\x7c\x69\xd0\xed\xa3\x76\xc8\x2b\xe5\x10\xb5\x7a\xad\xfa\x6d\x2a\x7b\x76\xa4\xe4\x9f\x1b\xf9\x8d\xee\x46\x3f\x34\xba\x83\x24\x2a\x12\xdc\x2d\x0d\xcb\x03\xdc\x8a\x71\x3b\x6c\xf4\x02\xd4\xa3\xcd\x01\xcd\x75\x83\x76\x52\x2a\xa5\x55\x5c\xad\x14\xcb\x03\x9c\x76\x59\xab\x5d\x6b\xd7\x71\xbe\xd9\xec\xdd\xa1\xfc\x51\x2b\xef\xff\x7b\x1d\x76\xdf\x67\x68\x0e\xb5\x2a\x69\x17\x55\x82\x5e\x31\x6a\x27\xb5\x7a\xa7\x5e\x6f\xb6\xc3\x7c\x9e\x35\xf2\x8d\x52\x35\x0a\x0a\x9d\x66\xb7\x5d\xe3\xdd\x52\xdc\x45\x9d\x62\x1b\xa5\xa5\x41\x21\x68\x17\xee\x86\xc2\xd7\x3e\x97\x00\x4a\x82\x21\x46\xf0\x1b\x7d\x8e\xc8\xc3\x64\xfc\xc2\xf0\x77\xd8\xd9\xa8\xf1\x5c\xa3\xd7\x69\x0c\x9a\xe5\x5c\x10\xe7\xd2\x88\x45\x95\x76\x3a\xac\x56\x0a\x95\x66\x2f\xad\x36\x93\x72\xb7\x1c\x14\x8a\x9c\xf6\xc2\x7e\xa5\x9f\x0e\xca\xe5\x46\xdc\xca\xbf\x89\xe9\xaf\x66\xfe\x75\x56\xfd\x8b\x99\xff\x91\x79\xac\x14\xe3\x7a\xb5\x37\x60\xd5\xb4\xcd\xc3\x42\xa3\x4a\x78\x3f\x57\xe6\x05\x42\x23\x52\x1d\x94\x93\x52\x8d\xd5\xcb\xd5\x76\x10\x56\x68\x35\xd7\x89\x51\x21\xd7\x4a\x79\xeb\x75\xe4\xdc\xcd\x83\x80\x63\x4e\xa0\x40\x04\xa0\xdf\x9f\xd0\xd7\xec\x63\x9f\x77\xf6\x7f\xde\xf1\xf9\x4a\xb1\xd8\x6e\xd5\xca\x51\x99\x55\x0b\x3c\x5f\xa3\x8d\x0a\x49\xfa\xf9\x34\x1f\xc5\xed\xb8\xc8\x9a\x69\xc0\xab\xdd\x7c\x1b\x17\x9b\xe5\x66\x75\xd8\xea\xa6\x69\x31\x47\xc3\xce\x8b\xc5\xe2\xd9\x62\x48\x25\x23\x10\x72\x00\x9e\x3d\xf6\xa1\x94\x6b\x37\xd3\x72\xa5\x8e\xf2\x15\x5c\x8c\x5b\x24\x97\xd4\x8b\x51\x5c\xa8\x17\xab\xbd\xb8\xd9\x43\xe5\x14\x0f\xa3\x62\xa7\xdc\x88\x7b\xf9\xb0\x11\x74\x06\xbc\x95\xe7\x8d\x04\x95\x6f\x6d\x1c\x26\xe3\xb1\x4e\x72\xbb\x61\x87\x4e\x35\x02\x7f\x3c\x67\x3b\xc1\x43\xb6\x83\x7f\x6c\x1a\xab\xd6\xaa\x49\xb3\x96\x2b\x56\xca\x8d\x06\x26\x94\x0e\x92\x41\x89\xe6\x0b\xb9\x61\xd2\x8a\xd3\x62\xbb\x5d\xaa\xe4\xd3\xa8\xd9\x6b\x61\x9a\x6f\xb6\xc8\xa0\xdf\xc1\xb5\x61\xbd\xf4\x36\x25\x23\x90\x63\x2c\x11\xe0\xfc\x1b\x13\x19\xfe\xa1\xc0\x96\xef\x0f\x68\x3d\xdf\x1e\x16\x9b\xbc\x19\xc6\x49\x37\x28\x35\xfa\x95\x56\x12\x14\x0a\x71\x2f\x49\x86\xd5\x7c\x5c\x2b\x92\x7e\x2b\x87\x2a\x35\x3e\x40\xf5\x66\x75\x50\xe4\xb8\x57\x7a\xcb\x10\xc3\x08\x08\x4e\x39\xba\xcd\x11\x5f\x63\x88\xfc\x58\xde\x42\x3a\x51\x23\xc4\xfd\x66\xa7\xc8\x87\x6d\x9c\xef\x86\x2d\xdc\xa4\xbd\xb8\x9b\x8b\xc2\x6a\x21\x40\xa5\x7a\xd2\x2d\xb7\x79\x14\x05\xed\x20\xae\xd5\xaa\x85\x21\x6f\x37\x4b\xc5\xb7\xbe\x7c\xb5\xf2\x6b\xbe\xc4\xbf\x3f\x91\x1f\xea\xf1\x42\x9b\xe2\x41\x10\x56\x6a\x8d\x1e\x1e\xd6\x62\x4c\xf2\x9d\x72\x30\x28\xf3\x72\x9f\xd5\x18\xce\xe7\xaa\xed\x5e\x77\xd0\x2b\xe4\x8a\x9d\x28\xe5\xed\x76\xab\x86\x3b\xcd\x5a\xe3\x46\xf7\x6d\x24\x61\x01\x09\xb9\x0f\x29\x88\xe1\x2d\xf2\x4a\x8c\x38\xa6\x48\x60\x04\x3f\x52\xfe\xe3\x37\x78\xaf\x27\x7e\x88\x97\x1f\x5f\xd3\x7d\xec\x09\xf2\x1c\x39\x18\xa4\x82\x60\x80\x6e\x89\xcd\xd7\x78\xa1\x3f\x96\x9e\xe5\xab\xcd\x90\xa4\xbd\x36\x42\xfd\x26\xc9\x47\x28\x57\x28\x16\x82\x72\x8a\x0b\xf5\xb0\x88\xcb\x3c\x0e\xe3\x5a\xaf\x45\x71\xa1\x4b\xbb\x61\x05\x95\x82\x72\x97\xc6\x24\x79\xbb\x66\x43\x88\x33\x8c\x11\x63\xec\x5b\x8b\x36\xfa\x43\xf9\x59\x10\x17\x87\x85\x76\x2e\x1f\x77\x7b\x49\xa5\x51\xc8\x57\xc3\x34\x0a\xf2\xcd\x28\xdf\x19\x86\xfd\x90\x0c\x86\xa5\x21\xce\x0f\x0b\x43\xdc\x44\x9d\xa4\x46\x6a\x65\x4e\x2b\x35\x96\xbe\x49\x7d\x10\x66\x08\x61\x04\x20\x12\xf0\x1b\x56\xb2\x1f\xb1\xf2\xc7\x63\xab\x00\x00\x52\x84\x19\x07\x40\x52\x8c\x91\x44\xcf\x93\xc8\xdf\x0d\xd9\xef\xb4\xec\xc7\x82\x5f\x6b\xd8\xc4\x95\x1e\x4f\x7a\x2c\xac\x32\x5c\x1d\x26\xb5\x7c\xab\x91\x76\x51\x3b\x4e\x62\x5c\xce\xd1\x7c\x5c\x0e\xe3\xb8\x17\xf6\xca\x9d\x28\x20\xfd\x5e\xb5\x5a\xed\x84\xf1\x9b\xb0\x82\x5f\x91\xc1\x5f\xf7\x3f\x83\xef\x5a\xf9\x85\x0d\x8d\xb7\xc7\x60\xbe\x67\x2f\xe3\x0b\xaa\xbe\x7c\xb8\xe5\x3f\xdd\x20\xf9\xfc\x80\xcb\x8b\x2b\x19\xb6\x52\x78\x8a\x99\x73\x4c\x58\xa8\x11\xd7\x54\x0b\xe9\x11\x56\x9e\x62\x08\x35\xa7\x4c\x2a\x44\xbc\xf2\x90\x00\xac\x2c\xd0\x14\x69\x86\xb1\x06\x5c\x3b\x29\x6f\xbe\x02\x7f\xf3\xe7\xa6\x83\x72\xa4\x90\xc3\xc8\x7b\x44\x84\x02\x5c\x03\xc7\x81\xb7\xd0\x33\x8b\xa1\x30\xd0\x2b\x63\x11\xd0\xcc\x18\x20\x0c\xc6\x96\x72\x4e\x11\x95\x82\x09\x88\xa8\x82\xec\xc3\x3d\x43\x03\x9f\xb6\x34\xfe\x7f\xf9\x93\x4b\x6a\x13\x72\xc9\x5e\x3a\xb5\x1c\x2f\x2c\x0b\xb2\x8c\xc0\x79\x9a\xcb\xec\xc0\x68\xbf\x3b\x55\x4e\x57\x98\xd8\xce\x20\x55\xb9\xaa\x2a\x8e\x6e\xf2\x61\x4c\xea\xea\xba\x46\xad\x6f\x6a\x1e\x06\x09\x24\x77\xb1\xdc\xec\xff\xa0\x21\x3f\xf5\xe7\xed\x36\xd2\x17\x40\xf5\x56\xa2\x1b\xa1\xcc\x72\x0a\xa0\x66\x4e\x73\x49\x99\x66\x9c\x32\x8d\x84\x77\x04\x1b\x47\x15\x03\x10\x68\xce\x1c\xe7\xcc\x4a\xe8\x19\x70\xd4\x39\xcb\x35\x52\x37\xc8\x7e\x06\xec\xce\x7b\xa1\x35\xb3\xde\x23\x8e\xb1\xf7\xd0\x63\xef\x15\x85\x04\x7a\x4c\x94\xe3\x94\x43\xe7\xb0\x15\x46\x39\x66\xb5\x85\x48\x6a\x65\x28\x84\x5e\x01\xed\x2d\x23\x1f\xee\xd3\x26\xa4\x54\x52\x2e\x39\x12\x1f\x89\xcd\xa3\xe6\x70\x0a\xe3\x03\x5d\x01\x5d\xe5\x03\xb2\xbc\x34\x8e\xbd\x73\x09\xf7\xd7\xab\x59\xe6\x58\x0c\x1a\xfb\x3c\xac\xa1\x88\xe7\x38\x1b\x1e\x86\xed\xf2\x56\xf6\x6c\x52\xd3\xdd\xda\xc4\xcc\x7d\x63\x7a\xe1\x28\x1d\x16\xab\xbd\x59\xb5\xd9\x37\xb5\x2e\x1d\xef\x8f\xab\xed\x02\x3e\x93\x93\x34\xfb\x51\xef\xfe\x5b\xe5\xe5\x8f\xe7\xf8\xb6\x7b\xfd\xfb\x29\x68\xb6\x3e\xb2\x83\xaf\x72\xbc\x08\x3a\xeb\xba\xdc\x07\xfd\xf3\x6c\x7f\x2e\xe0\xa4\xd3\x58\xe3\xc9\xfe\xdc\x39\x86\x8b\x88\x05\xbd\xd9\x29\xd7\x21\x61\x7b\x79\xcc\xd4\xf7\xfb\xec\xc5\x5c\xb3\x67\x91\xcd\xcc\x8b\x39\x01\xb6\xcb\xfe\x99\x4f\x51\xb4\x5d\x20\x19\xae\x0f\xbb\x5e\x3b\x33\x3a\xca\xe1\xf3\xfd\xff\x63\xa2\x0b\xa0\xfa\xbf\x01\xdd\xff\xea\xcf\x77\x12\x8d\x09\xf4\x5e\x1a\x22\x85\x96\x80\x33\x2f\x3c\x82\xca\x29\x2e\x14\xc6\xda\x00\xc3\xb0\x54\x9a\x1a\x2f\x05\x53\x56\x1b\x64\x85\x05\xc4\x4a\xa4\xa9\x92\x96\x59\x7f\xa3\xf1\x67\x8c\x0a\x28\x01\x50\xc0\x4b\x8a\x29\xe1\x10\x73\xe4\x91\xd0\x0e\x7b\x2d\xb0\xc2\x18\x0b\x65\x04\xe0\x04\x7b\x0f\x34\xe7\x10\x78\x05\x81\xd0\x00\x69\x8c\x85\x67\xc0\x8b\xe7\xcc\xfb\x85\x68\xf9\x89\xe8\x2c\xea\xa8\xb8\xb8\xb7\xad\x12\x62\x78\x3e\xd8\x2f\xfb\xdb\x5a\x93\x16\xae\xf3\xf5\x28\xac\xdb\x83\x45\xa8\x2d\x47\xd4\xf1\x64\xb7\x29\x0c\x4b\xad\x5c\x08\xd3\xdd\x6a\x5f\xd9\xb6\x93\xd9\x89\x9f\x59\xd6\xd4\x9a\x16\x5d\x1b\xf9\xdc\xe1\xca\xcb\xa8\x3d\x6f\xaf\x3a\xa5\x34\xbc\x7b\xf8\x4e\xf4\x03\x44\xb4\xb9\x3c\x86\xc7\xa8\x11\x8a\xd9\xa5\xb0\xc3\x25\x7d\x80\xe3\xd5\x41\x98\xc5\xea\x74\x82\x15\x7e\xde\xa4\xa5\x86\xde\x83\xe1\x0a\xac\x86\x41\xad\x40\x7b\xb0\x7d\x8e\x2f\x62\x75\x9c\x66\x48\x63\x1a\x91\x6d\x25\x07\x9a\xd9\x3c\x36\xad\xcc\x38\x5f\x0f\xb6\x11\x91\xa3\xcc\x5d\x73\xf4\x0e\xb1\xef\xc7\xd8\x5f\x80\x58\x83\x18\x80\x12\x42\xe4\xb8\x85\x0a\x03\xae\xb9\x66\x4a\x10\xac\x2c\x65\xde\x72\xac\x29\xf4\xda\x1a\xe4\x18\xa6\xde\x71\x0d\xbc\x31\x42\x2b\x47\x98\x93\x04\xf2\x1b\x6d\x3f\x85\x7a\x07\xa9\x77\x02\x73\x07\xa4\x17\x90\x02\x62\x18\xba\xc1\xc7\x35\x76\x86\x40\xa5\x11\x60\xdc\x2b\xa7\x0d\xc1\x86\x30\x0c\x94\xd2\xd8\x62\x65\x3c\xc4\x9e\xde\x62\x30\x79\x25\x16\x7f\xca\x1a\xf2\xd7\x96\xcf\x98\x4e\x7a\x68\xd9\xe3\xf4\x52\x3a\xac\xc9\xea\x7a\x0c\xce\xd3\xc5\x36\x69\x2e\x4a\x5b\x7d\xda\x4f\x5b\xdd\x61\x0d\x6e\xac\xf6\x9d\x4c\xe2\x3c\x29\x26\x49\xa5\x8b\x66\x06\x26\xc6\x5f\x97\x0d\x18\xa4\x4d\x59\x8d\x0f\x85\x7c\x05\x56\x8b\x49\x79\xbd\xec\xc9\xca\x3d\xc6\x3e\x13\x3b\x7a\xf5\x78\x45\x14\x5d\x39\xbc\x56\x41\x96\x14\x1b\x22\x1b\x97\xb2\x04\x9f\xba\xe1\xf2\x02\xf3\x83\xec\xd1\x94\xd1\xd4\x6c\x5b\xb3\xab\xd6\x66\x9a\x29\x7a\x56\xf0\xa3\x25\x29\xb6\xba\xa5\x6a\x32\xc7\xbb\xcc\x39\xb7\xb9\xe4\x96\x99\xc3\x31\x6c\x86\xe9\x69\xb3\x6d\x76\xb7\xcd\x30\xdb\xbf\x6b\x6e\xbd\x43\x6c\xa1\xf2\x5e\xaf\xff\x02\xc4\x7a\xea\xa5\x81\xde\x70\x00\x28\x87\x56\x51\xeb\x81\x65\x0e\x38\xe3\xac\xd2\x5c\x78\x27\xa0\x63\x9e\x31\x40\x89\x23\x98\x22\x2f\xb9\xc2\x1e\x18\x8f\x2d\xf5\xf8\x4e\xec\xcf\xa0\x5e\x72\x67\x15\x03\xcc\x62\x6c\x2d\x97\x82\x1a\x0c\xa5\xd2\xd6\x0b\xec\xb4\x61\x90\x72\xe4\x21\x22\x1c\x4b\x4a\x30\x60\xc2\x41\x62\x34\x95\xce\x3a\xe4\x15\x45\x37\x62\xe9\x03\xb1\xf0\x13\xb1\xa2\x3a\x2a\xb5\xc3\x83\x6f\xaf\x4e\x0e\xef\x37\xe3\xc2\xb6\xaf\xa5\xe1\x3d\x7f\x34\xf5\x45\xec\x29\x2f\x88\x4b\x7d\x3b\xd3\xeb\x56\x72\xb9\xca\x49\x8a\xb6\xe5\xf1\xe9\xd0\x3b\x36\x8a\x87\x7a\xc8\x16\xb9\x63\xb7\x41\xd8\xb8\x92\x49\xce\x35\x54\xa5\x06\xee\x0f\xf5\xdd\xe4\x39\x57\xb8\x13\x7b\x7a\xf5\xf8\x8c\x1d\x1b\xd9\x5a\xfb\x7c\x1a\x82\xcb\xb2\x1a\x45\xdb\x5a\x6f\xdd\xe8\x78\x3a\x18\x6b\x3b\x8b\x67\xa0\x5e\x69\x64\xaf\xc3\x73\x2e\xb3\x71\x09\x57\x69\x09\x5c\x71\xb2\x28\x9e\xce\x8b\x2d\x26\xcd\xed\x79\xdc\xbf\x88\x4e\xfb\x3a\xef\x45\xa5\xe9\xb8\x5b\x1f\x38\x3c\xc9\xcc\x9f\xb9\xeb\xbd\x43\x6c\x19\xbc\xd7\xeb\xbf\x00\xb1\x8e\x32\x2d\xb1\x44\x1e\x48\x22\x91\x27\x40\x10\x2e\xa4\x62\x9e\x3b\xa7\x30\xe2\xc4\x32\x29\xa1\x91\x50\x58\x49\xc1\x6d\x21\x2b\x9d\x14\xd4\x6b\xc7\x0c\xb0\xe0\x9e\xa3\xfe\x0c\xea\x39\xa0\xd6\x48\xe7\xa0\x25\x96\x39\x8a\x24\x54\x8a\x58\xa2\xa9\x46\xd8\x1b\x29\xb1\xa7\x46\x0a\x6d\x01\x44\x5c\x08\xa0\x85\xe1\x9e\x09\x86\x0c\x42\x4c\x59\x62\x3e\xdc\x8b\xcd\x2f\xc4\xa2\x97\xac\x20\xa1\x27\x7f\x3e\xe5\x92\xb2\x4a\x7c\x61\x40\x1a\xd7\xfd\x06\x4f\x33\x23\xa7\x51\x5a\xec\xce\xe2\x4e\x26\x59\x65\x0b\xcd\x66\x5f\xe0\xf8\x22\xf9\x2c\x0b\x8a\x28\x18\x94\x51\xb3\xc9\xa6\xb9\xf3\xca\x56\x92\x68\x34\x5d\xb4\xeb\xd5\xd3\xb8\xb0\x6f\x88\x7d\x6b\x38\xf2\xe2\x35\xc6\xf6\x1f\x3c\x1e\x8b\x16\x0a\xf6\xf9\xfc\xce\xcd\x49\xb9\xb2\xab\x91\x83\xdd\x24\x97\x7a\x6b\x63\xb6\xaa\x34\x35\x41\xb9\xdf\xe9\xc5\x02\xd2\xd1\xb6\x78\x4a\xcc\xf2\x50\xee\xc1\x43\x6f\x5d\xda\x74\x7b\x7b\x5d\xc9\x5e\x86\x4d\x78\x49\x8f\xad\x70\x39\x09\x0e\x91\x47\xe3\xc9\x69\xa2\xf6\xdd\xbb\xe6\xf4\x1d\x62\xab\xe9\x7b\xbd\xfe\x0b\x10\x0b\x8c\x56\xd4\x32\x22\x98\x06\x02\x18\x04\x24\x21\x56\x38\x04\xb8\xb0\x0a\x50\x41\x89\xd3\xc4\x32\xa1\x81\x21\x44\x71\xc5\x81\x07\xcc\x7a\xad\x91\x30\x40\x3c\x13\xfb\x33\xa8\x97\xc2\x7a\xed\x91\xc6\x0e\x69\x08\xbc\xf1\x54\x42\x64\xef\x73\x3e\x40\x92\x68\x83\x0d\xf2\x8c\x22\x82\xa0\xf5\x4c\x38\x2d\xb8\x10\x8a\x51\x26\xa9\xc4\xc6\xb2\x0f\xbf\x3f\xf1\x07\x62\xf1\x27\x62\x33\xfd\xed\x8c\xd6\x4f\xf3\x6a\x1d\xe4\x43\x57\x5d\x1f\xfd\x61\x75\xb1\xb1\x1a\x96\xab\xa5\x78\xde\x9a\x8f\xf2\x6e\x51\xcc\x64\x74\x00\xaa\xdb\x1e\xca\x2d\x89\xea\x4e\xd3\xa8\xbe\x2e\x78\xef\x2b\x59\xc7\xca\x05\x5c\xea\xb4\xf3\x61\x75\x45\x82\x6d\xba\x9f\x48\xd2\x18\x6c\x9e\x61\xb9\x13\xfb\x00\xd1\x8c\x96\x1b\xad\x35\xee\xe6\x2b\x97\x46\x6f\x2a\xfa\x8b\xb8\xb4\x1d\xef\x50\x3e\x53\x49\xa6\x92\xa0\xf5\x12\x6f\x9a\xfd\x4a\x90\x24\x67\x96\x62\x2e\xb6\xcd\xc9\xae\x95\x6d\x0e\xda\x75\x75\x3d\x47\xf9\x79\xfd\x24\xea\xa8\x37\xab\x58\xb9\x62\xc4\x55\xd6\x73\xd5\x9f\x09\x78\xcf\x3a\xcc\x3b\xc4\xd6\xc4\x7b\xbd\xfe\x0b\x10\xcb\x94\xb7\x10\x63\xe5\x39\xf6\x5e\x5b\xee\x2c\x65\x06\x31\x6a\x99\xc5\x9a\x3b\xcc\x89\x06\x16\x72\x40\xa1\xb1\xd0\x78\xe1\xa4\xb3\x9a\x33\xed\xbc\xb1\x9a\x70\x7d\xdf\xf4\xfa\x09\xd4\x63\x22\x38\xc6\x12\x58\x64\x21\x06\x0a\x5a\x0b\x19\x12\x0c\x78\x29\x81\x71\x42\x1b\x48\xa1\xd1\x48\x6a\x04\x9c\x31\x50\x4a\xed\xbd\x25\x42\x18\x40\x14\x16\xe0\x16\xa7\xc5\x03\xb1\xe4\x13\xb1\xa7\x0b\x4b\x06\x9d\xd2\xae\x52\xc8\xe7\x7b\xdd\x94\x8c\x5c\xbc\x2a\x8e\x7b\x0c\xc0\xd5\x2e\x6a\xd7\xdc\xb2\x70\xd2\xfe\x70\x99\x06\xa3\xea\x30\x3b\xea\x97\xc7\x24\x2c\xad\xda\xc9\xf4\x9c\x9b\x57\x93\x91\xd5\x6c\x45\xa9\xa3\xf5\x66\x4e\x64\xb7\x95\x7d\x92\x99\xe4\xa2\xc5\xe8\x79\x42\xbe\x13\xfb\x90\xc7\x52\x3f\x06\x85\xf6\x30\xd3\xf0\x2e\x20\x93\x32\x2e\x75\x23\x5d\x62\x66\x53\x2d\x85\x67\xb0\xc9\x53\x8e\x20\x2b\xeb\xee\xa9\xd5\xec\x81\xf1\xb5\xd1\x02\xfb\xf0\xb4\xb2\x60\x50\x2b\x15\xe8\x2c\x62\xf5\x53\xbf\x5c\xaf\xe9\x4a\xe3\x9a\x5b\xe8\xac\xec\x54\x4e\xe1\x8a\xe4\xee\x59\xc7\xe8\x1d\x62\xdb\xd1\x7b\xbd\xfe\x2b\x10\x2b\x3d\xe2\x8e\x23\x2d\xb9\xe7\x46\x73\xed\xed\xed\x17\x0b\x00\x44\x9a\x6b\x05\x04\xb0\xd8\x3a\x03\x05\x64\x42\x08\x22\x18\x62\x1a\x3a\xa8\x95\x45\xd4\x29\x7a\xdf\xfd\xfa\x09\xd4\x1b\x06\x30\xb8\x65\x17\x9a\x40\x4a\x29\x20\xc2\x60\xce\x25\x03\x58\x48\xed\x3c\x10\xdc\x33\x63\x89\x86\x8c\x2b\x8b\x15\x03\xc6\x02\xec\x88\xf7\xcc\x0b\x05\x88\xfa\xf0\xfb\x93\x7c\x20\x96\xbe\xec\x7e\x6d\x65\x78\xdd\xe2\x66\xf6\x98\xf0\xbe\xce\x0f\xad\xee\xee\x33\x31\xd8\xc5\xc5\x53\xcf\x00\x93\x69\x2c\xf7\x7b\x74\x3c\x5e\x75\x9b\x57\xa0\x6a\xf4\x32\xe5\xfd\xf5\x08\xd3\xcb\xaa\x31\xc8\xc4\xbd\x64\xb5\x9b\x86\x27\xd6\x1e\x16\xc7\xa7\x7d\x03\x36\xa3\x65\xd0\x0e\xf6\x87\xe7\x65\xfa\x9d\xd8\x87\x3c\x56\x27\xad\xfa\xe0\x30\x42\x95\x21\x2a\x91\xf6\xf2\xd4\xdb\xe6\xbb\xc7\xca\xa9\xc1\xba\xd1\xfa\x80\x60\xa6\x83\x7a\xc9\x78\x53\xaf\x0d\xba\xe5\x52\x70\x4a\xe8\x05\x14\xfb\xbd\x70\x5a\xb0\x34\x2d\x4c\x34\x3f\x8d\xb3\x3a\xee\x9c\x87\x0c\xb0\x34\x02\x05\xda\x94\xc7\xc9\xa8\x73\x1f\x11\xb3\x77\x88\xed\x9c\xde\xeb\xf5\x5f\x81\x58\xa4\x2c\xd1\x58\x29\x6d\x90\x92\xd8\x01\x49\x20\x14\x92\x09\xc7\x20\x24\x16\x3a\x48\x95\x87\xd6\x6b\x4e\xb1\xa7\x9a\xdf\x50\x02\x50\x3b\xea\x35\x76\x52\xdf\xe3\xe3\xcf\xa0\x1e\x1a\xcb\xa8\x21\xd6\x2a\xaa\x88\xf0\x10\x71\x05\xa0\x14\x4e\x59\x6d\x00\x53\x46\xb1\x5b\x8e\x0b\x3d\x94\x42\x53\x6a\x95\x21\x12\x61\xa2\x28\x82\x42\x5b\xcf\xd1\x87\xe7\x23\x7b\x2f\xc8\xb2\x17\x64\x97\x17\xbf\xac\x51\x8f\x2f\xf8\x28\x3d\xbe\xb6\x82\xce\x9e\xaf\x2a\x85\x2e\xde\x95\x72\xaa\x32\xae\xa4\x8b\x9d\x2b\x31\x30\x67\xf3\xb5\xec\x51\xd6\xee\xac\x4c\x9b\x0c\xd7\x49\x32\xdc\x65\x47\x73\xb3\x2c\xf5\xcb\x61\xa7\x5f\x2c\xf6\x58\x7d\x52\x93\xfe\xe4\xea\xf5\xf4\x15\xd9\xc1\x83\xcb\x65\x66\x3a\xdd\x0d\x6a\xec\xc8\x46\xa0\x91\x46\xc5\x73\x77\x05\x33\xe9\x6a\x34\x41\x97\x42\x67\x9a\x8c\xab\x82\xc5\x30\x38\x57\x1b\xc7\xd0\xc0\xf9\x39\x46\xf3\x75\x45\x74\xdc\xa8\x94\xb2\xfd\x31\x50\xbb\xf5\x81\xd8\xf2\x79\x51\xef\xdb\x6d\x38\x9b\x76\xe6\x95\xf4\xe8\xcd\x1d\xd9\xd5\x3b\xc8\xf6\xc9\x7b\xdd\xfe\x0b\x20\x4b\x1d\x75\x42\x62\x0d\xbc\x04\x5c\x28\xce\x19\xc0\x9e\x01\x26\x24\x01\xd4\x22\x62\x11\x41\x84\x5b\xe0\xa0\xd4\x00\x78\x01\xa9\x45\x10\x69\xe7\xb5\x80\x92\x51\x76\x47\xf6\x27\x60\xaf\xac\x65\xcc\x01\x04\xac\x62\x56\x43\x4a\x81\x06\x86\x2a\xe2\x29\x25\x42\x1b\xe4\x20\x03\xda\x3b\xc5\x9d\x62\xca\x69\x2c\x91\x76\xc2\x1b\xc7\xbc\x94\x8a\xd8\x1b\xf6\x10\x3e\x20\xcb\x5f\x90\xad\xed\x3b\xd7\xcd\xf6\xb4\x99\x65\xf2\xbd\x30\x9d\xaf\xe8\xb8\x18\x97\xc7\x83\x63\xd9\xef\x61\x13\xee\x4f\x9d\x28\xd0\xd4\xef\x32\x0b\xca\x79\x54\xa4\x1a\x56\xdc\x04\x5f\xcb\x45\x19\x06\x8b\x5d\xbd\x2b\xc8\x9c\xa7\x3a\xe8\x75\xca\x59\x5e\xcc\x9e\x2e\x8b\xf6\x46\x8a\xd7\x1a\xc3\xe0\x81\xa2\x75\xe5\xbc\x56\xdd\x66\x10\x57\x3b\x38\xf1\xfb\x52\x52\xec\xa4\xdb\xb0\x0a\xa2\xb1\x8f\x59\x29\x86\x0d\x47\x33\x69\xd8\x64\x40\x66\xf6\x70\x41\xf2\x05\xa5\x75\xb1\x9f\x3f\x9d\x55\x17\xf6\x2b\xc7\x3c\x19\xe4\xb3\x6c\xc9\x16\xdb\x6d\xa3\x73\x5c\x65\x1b\x9a\x2e\x66\xcf\xe5\x8c\xdd\x3b\xc8\x26\xe6\xbd\x6e\xff\x05\x90\x05\x58\x5a\x89\x01\x36\x08\x18\xa9\xa8\x00\x02\x79\x48\x3d\x11\x9c\x3a\x41\x0c\xf4\xc0\x38\x62\x0d\x02\x4e\x21\xcc\x05\x63\x86\x4a\x4b\x25\x37\x06\x13\xa9\xa0\xbd\x97\x5e\x7f\x02\xf6\x06\x13\x8f\x29\x53\x4c\x68\x2f\xed\x2d\xb0\x3a\x6b\x19\x06\x12\x29\x29\x9d\xb5\x12\x78\x2e\x09\xf0\xd6\x43\x45\x84\x42\x56\x62\x4e\x39\x05\xd0\x0a\x05\x81\xb8\x23\xfb\x50\x16\xc3\x2f\x65\x31\x48\xdd\xa4\xbb\x6b\xce\xca\x93\xa5\x1d\x35\x51\x6e\x35\x0f\x92\x4e\xb7\xd3\x9a\xf9\x16\x19\xee\x82\x4c\x2e\xe9\x84\x5b\xce\x47\xc3\xe1\xa0\xd8\x29\x5f\xcc\x24\x68\xba\xca\x02\x04\xca\x8d\x37\x99\x64\xdb\xd6\x3e\xe7\x51\x3a\xd8\xa3\xd5\xe2\xea\x5b\xcb\xa8\xb3\x8c\xd4\xfa\x99\x96\x3b\xb2\x0f\xa9\xac\x21\x4d\xbc\xca\xe4\xaa\x93\xea\x31\x49\x2a\x7e\x9a\x75\xfd\x56\xb3\x08\xdb\xed\xca\x76\x19\xa2\xa5\x4f\x80\x22\x55\x3e\x28\x5e\x3a\xdb\x42\xf7\xda\xdf\xa8\x7a\xc6\x9e\x4a\xdb\x3d\x9c\xe6\x3b\x9b\x21\xb7\xb3\xa6\xeb\x15\xa4\x50\x9d\x5a\x7d\x18\x43\xdb\x2a\xa7\xab\xd6\xf8\x4e\xe9\xe9\x1d\x64\x87\xef\x76\xfb\xaf\x80\xac\x81\x44\x11\x46\x3d\xbb\x9f\x98\x02\x58\x51\xc6\xbc\x33\x90\x7a\x64\xb4\xb1\x0a\x71\xa5\x0d\x26\x4e\x1a\xa1\x29\xd4\x42\x48\x4a\x14\xf2\x52\x63\xe0\x99\x86\xf7\xc5\xd7\x4f\xc0\x1e\x59\x2f\x18\x15\xc6\x53\xa2\x09\xe1\x4c\x4b\x28\xa4\x62\x08\x4b\x4a\x38\x43\x42\x4b\x6c\x3d\xc6\x8e\x32\x24\x91\x41\x58\x23\xc9\xd4\x2d\x6f\x90\x46\x48\xe8\xef\x27\x0e\x1e\xea\x5e\xf8\xa5\xee\x75\x6a\xd8\xd9\xa9\x99\x2f\x54\xd7\x69\x3e\x2f\xfa\xb2\x62\xdd\x38\x2a\x9f\xae\x33\x9c\x2f\x6c\x2a\x78\xbc\x38\x0f\xe1\xd0\x47\x71\x75\x65\x8b\xfe\x68\xaf\xfb\xf3\x36\x2d\x37\xe5\xf9\x6a\x37\x3a\x2b\xd7\xa6\xb6\x1a\x57\x92\x49\x77\xb9\x1f\x5c\x33\x9d\x73\x13\xad\x2e\x34\x87\x5f\x77\xb8\x06\x0f\x19\x65\x71\x36\xe8\xc5\x97\x62\xe6\xc4\x78\x9b\x2e\x33\xe5\x51\x21\x76\x7a\x4e\x77\xcb\x3e\x4a\xe7\xb9\xdd\x15\x9f\xeb\xdd\x4d\x2e\x6a\xed\x5a\xe1\x3e\x53\x1a\x44\xb2\xb7\x0f\xed\x76\x96\x2e\x16\x15\xda\x2f\xa7\xab\x43\x17\x5f\x9b\xf3\x74\x5d\xcf\x37\x2e\xf3\xcd\x74\x83\xcc\xa4\x2d\xef\x43\x02\xbc\x83\xac\xf9\x55\xab\x08\x8a\x11\xe5\xa1\x01\xc2\x6b\x6a\x91\x50\xda\x58\xe8\x8d\xb4\xca\x09\x63\x34\xd4\xde\x48\xad\x9d\x81\x9a\x6b\xc2\xb9\x83\xc4\x1b\x85\x8c\x56\xd6\x28\x22\x01\x37\xcf\xfb\x05\x7f\x1f\x7b\x6b\xad\xd6\x0a\x38\xe7\x1d\xa5\x8c\x08\x02\xb5\x51\xde\x70\x6b\xb0\xa0\x0c\x28\x8f\x88\xb5\x92\x33\x29\x29\x61\x1e\x23\x68\xb9\x11\x86\x11\x4c\x15\xa0\x0a\xdd\x92\x0b\xf8\x50\xf8\x22\x2f\x85\xaf\xd3\xa9\xb7\x2e\x25\x28\x08\xc2\x53\x63\x3e\x3c\xf2\x5c\x72\xb9\x08\x34\x71\xdb\x13\x60\x66\x02\x4b\x64\xd2\xef\x4c\x32\x3a\x6a\xaa\xf3\x91\x9a\x7d\x6a\x4d\xd4\x09\x17\x02\xef\x3a\xc7\xd5\x6c\x8d\x51\x1e\x76\xb2\x41\x65\xa4\xb5\xd9\x0f\x07\x6a\x70\xec\x9d\x63\x14\x3c\xaf\xd5\x6f\xc8\x26\x0f\x2e\x9f\x0b\x17\xe9\x63\xbd\xba\x6f\xe4\x56\xdd\xfc\x71\xb5\x9d\x87\xb5\x73\x83\x8d\xd6\xcb\x5d\xde\xed\xa6\xcb\x0c\xcc\xc3\x6c\xb9\x04\x8e\x70\x6b\x11\x5f\x35\x78\xa6\x3f\xe8\x84\x25\xb1\x15\xde\x34\x8a\x69\x4d\xcc\xf0\xd0\xae\xe7\x3d\x7d\xad\x58\x5f\x39\xcf\x62\x95\x53\xb5\x3b\xa5\xe4\x1d\x64\xfd\xbb\x27\x0d\x7e\x01\x64\x85\x42\x12\x61\x24\x25\xb2\x4c\x6a\xcd\xa0\x27\x94\x1b\xce\x84\xe2\x84\x6a\xe6\x35\xb2\x02\x5a\x65\xb5\xb0\x8c\x0b\xe0\x89\x64\x40\x4b\xe7\xb0\x40\x46\xaa\x7b\x0e\xf9\x53\xb0\x17\x1c\x48\x28\x21\x15\x8a\x03\x6a\x14\x75\x02\x03\x47\xb5\x60\x9e\x01\xa3\x38\x40\x9c\x31\x6b\xb9\x75\xcc\x5b\xeb\xa8\xa5\x9a\x08\x88\x2d\xa5\x00\x0b\x0f\x94\xfb\xf0\xfc\x74\xca\x0b\xb2\x2f\x95\x2f\x36\xac\x09\x93\x6f\xee\x6d\xad\x76\x8c\xcb\x62\xa9\x58\x74\x39\x1f\xc5\x82\xf3\xdc\x9e\xb7\x31\xe9\x65\x6b\xf5\xfa\xd6\xac\xab\x39\x61\xd1\xc8\x2a\xa9\x92\x69\xfb\x0c\x16\x2a\x73\x28\xd1\xca\xb2\xd0\x0c\xc3\x81\xc6\xdc\x4f\x87\x97\xb8\x75\x69\x9e\x9a\x93\x56\x78\x7c\x3d\x5d\x90\x3c\x80\xd3\xdb\x4d\x7b\xf3\x41\xf5\x9a\x5c\x93\x42\x29\x3c\xf0\x61\x22\xe2\x88\x94\xf0\x38\x89\xaa\xa3\xee\x66\x01\x57\x64\x73\x0c\x23\xaf\x59\xa9\x9c\x6f\xcf\xfa\x93\x65\xce\xac\xdd\xe8\x44\xf5\xf8\x98\x46\xeb\x53\x15\x69\xeb\x9d\x96\x78\x0e\x75\x27\xd7\xec\xf7\x0a\xd3\xd3\xf6\x1e\x65\xc5\x3b\xc8\x8e\x7e\xd5\xca\x17\xf3\x44\x73\x23\x29\x57\x04\x29\x8c\xac\x15\x18\x58\x82\x11\x44\x96\x6a\xad\x6e\x1e\x44\x08\x52\x2c\x1c\x01\x10\x28\x82\x30\xa1\x14\x63\x60\xad\x06\x52\xa3\xfb\xfe\xd4\xcf\xc0\xde\x51\x24\x85\xa7\x40\x60\x09\x04\x40\x18\x72\x0a\xa9\xd5\x1a\x7b\x6a\x0d\x65\x1c\x42\x6d\x8d\x64\x40\x72\xef\x81\x23\x9e\x28\x0b\x2c\x46\x82\x6a\x89\xb5\x21\xfe\x86\xec\x43\xe9\x8b\xbc\x94\xbe\xc8\x6a\x5d\xb9\x2c\x3a\x70\x7d\x40\x65\xd0\x17\x76\xb5\x06\x03\x94\xb9\xa0\x1c\xda\x1f\xe2\x21\x29\x80\xf9\xe8\xe0\x08\xa9\x57\xb7\xfd\x14\x8e\x82\xde\x20\x57\x3a\xb5\x5a\xcd\x68\x93\xb2\x66\x53\x14\x8b\x97\xf5\x7a\x56\x5e\xed\x6a\x6d\xd2\x2d\xc0\xd3\x2e\xb5\xd9\x6c\x25\xf3\x9a\xcb\x26\x0f\xb9\x6c\x5a\x5b\x1d\x78\x6e\xd6\xdc\xb7\xf6\x8b\x02\x69\x50\x92\xed\x76\x57\xbd\x51\x2e\xe8\xf7\xf2\x8b\xfc\x3c\xdb\xc8\xc8\xee\x68\x83\xc6\x71\xf9\x3a\xaf\xa5\xb2\x35\xa2\xf9\xa0\x72\xb6\xed\x44\xef\xb2\x89\xe9\x2f\x43\x8d\xab\x69\xd5\x67\x0b\x33\x59\x03\x71\xb4\x1a\xd0\x86\xe8\xde\x12\x8f\x5c\xf0\x0e\xb2\xf3\xd1\x7b\xdd\xfe\x0b\x20\x2b\x94\xf7\x00\x20\x46\xbd\x96\x82\x40\x24\x01\xb2\x5e\x5a\x6a\xf0\x6d\xb5\x44\x14\x80\xca\x6a\xcb\x25\x22\x12\x38\x4f\x85\xc0\x8c\x70\x61\xb5\xb4\xc2\x61\xf8\x71\xc7\xe0\x27\x60\x6f\xbd\x30\x1e\x59\x05\x21\x84\x02\x23\xa7\x19\x40\xce\x59\x46\x05\xa5\xd0\x39\x4e\x2c\x26\x96\x38\x8b\xa5\x27\x0e\x58\x8e\x39\x31\x4e\x63\x6a\x1d\xd0\x00\x59\xfe\xe1\xf9\xf1\xba\x17\x64\x5f\x6a\x5f\x48\xd6\x7d\xb5\xcf\x5a\x9b\x68\x8f\x0a\x85\x5e\x34\xae\xf7\x0f\x2c\xbb\x9d\x4d\x8a\xdd\xe9\x2c\x68\xad\xf3\x71\xb1\x77\x2d\xd8\x5d\x75\xb7\xbd\x98\x06\xae\x66\xcb\x6b\x64\xc2\xe3\x96\x60\x5c\x6a\xba\x0d\x4e\xf6\xd5\x72\xb3\x2f\x32\xd7\xc4\x9e\xeb\xed\x76\xef\x0c\x59\x6b\xfc\x10\x65\x1f\x72\xd9\x4d\x79\xd0\x28\xb6\xed\xa0\x70\x72\x35\x32\xac\x84\xb9\xb4\x9b\x36\x66\xd7\xd3\x04\x6d\xc4\xa4\xb2\xca\xc9\x73\xf1\x1a\x34\x36\xcd\x4e\xd6\xfb\x69\xb3\xae\xc2\x76\xa9\x50\xdf\xa6\x79\xbe\x1f\xa6\xfd\x36\x5f\x76\xbb\xdd\x1e\xef\x2e\x01\x89\x0d\xee\x36\x76\x10\x8f\x76\x79\x78\x47\xf6\xbd\x73\xb4\xab\xd5\x7b\xdd\xfe\x0b\x20\xeb\x98\xa7\xc4\x29\x6a\x8d\x57\x12\x31\x4f\x1d\x61\xd6\x02\xca\x98\x04\x5e\x03\x0c\xad\xc1\x12\x71\xc8\xad\x01\x5e\x2b\x03\x34\xf2\x04\x42\x27\x88\x64\x14\x41\xf0\x1c\x65\x7f\x02\xf6\x86\x3b\x23\x38\xb5\x18\x29\xea\x94\xd5\x52\x08\x6e\x14\x85\xca\x20\xa1\x80\x67\xc0\x2a\x61\xbd\x05\x80\x33\x61\x94\x43\x4a\x6b\xa6\x09\xa0\xde\x69\x22\xd8\x0d\x7b\xf8\x50\xfc\x22\x2f\xc5\x2f\xb2\xcd\x06\xf9\xa1\x3f\xa4\xad\xce\x2c\x8f\x29\x34\x51\xa3\xd4\x5b\xe5\xb6\x1a\xd2\x6a\xb5\x70\x1c\x54\xe2\x99\x8b\x0f\x76\x3a\x2d\x0e\xd6\xbc\x3c\xc9\xcc\x0a\xb9\xb0\x6e\x7a\xe9\xbc\x91\xed\xbb\xea\xfa\x58\x67\x47\xba\xaa\xb4\x46\x53\x9f\x2b\xcb\x3d\xea\xef\xd2\x1e\x38\xbe\x96\x6b\x1f\xab\xfc\x71\xed\x7c\x09\xa2\xd5\x25\xca\x8e\x96\x54\x8e\x73\xe9\xb5\x7e\xd6\x3d\x24\x06\x7a\x72\xc6\xad\xf2\x85\xef\x80\x60\xc7\x75\x27\x25\x76\xe7\x77\x63\x08\x2e\x6b\xb7\xd5\x8b\x8a\xaf\xf5\xd4\x69\xb5\x6a\xa6\xf1\x26\xce\xb6\x72\x68\x5a\x23\x9b\x03\xda\x07\x49\x66\x5f\x51\x77\x64\xdf\x3b\x28\xbb\xef\xbd\xe9\xf1\x7c\xf0\x6b\x20\x6b\x1c\x34\x96\x2b\xa5\x81\x43\x48\x41\x27\xa0\x11\x52\x5b\xc8\xa1\x05\xda\x2a\x6a\x85\x75\x06\x09\x81\x08\x24\x18\x20\xea\x99\x07\x16\x52\x05\x2d\x57\xc6\x40\x71\x9f\xd4\x7f\x02\xf6\x4e\x22\x42\x35\x31\x52\x70\xa9\xa4\xbe\x3f\x1e\x63\x98\x20\x88\x78\xa7\x8c\xf5\x1e\x02\x05\x2c\x16\x50\x08\x88\x00\x03\x80\x38\x6d\xb8\xe0\x9e\x43\xc2\x11\xbb\x2f\xbf\x1e\xaa\x5f\xe4\xa5\xfa\x95\xd1\xb0\xbb\x49\x4c\x66\x5d\x3d\x26\x33\x6d\x73\x03\xd5\xca\x9c\x22\x7b\xa2\xd5\xb3\x37\x05\xbe\x0d\x76\xc7\x56\x9b\x85\xf3\x79\xa5\xa5\x52\xd9\xa9\xec\xce\x19\xb4\xb8\xce\xf5\x2c\xe3\x65\x27\x5c\x1d\xdd\x72\x5d\x5f\x65\xeb\xd5\x4b\xaf\x39\x66\x41\x66\x94\xe9\x17\xc5\xfa\x79\x17\xff\x8e\xec\x03\x45\xe9\x35\xcf\x88\x5f\x0c\xa6\xc3\xc6\x7e\x13\x92\xea\x74\x57\xdb\x9c\xdc\xd6\x2e\xaf\x31\xbb\x9c\x96\xd5\xce\xd1\xee\x0a\x83\x62\xd3\x1c\xf0\xba\x5a\xdc\x47\x8b\xf2\x62\xbd\x43\x26\x38\xaf\x5a\xb3\xec\xe6\xea\x45\x6b\x15\x37\x72\x93\x5c\xa5\x14\x84\x4c\xb8\xb2\x3c\xb7\x2f\xea\xa6\x3f\xf7\xde\x49\xd9\xc3\xdb\x52\xc2\xaf\x82\xac\x03\x46\x0a\x05\x98\xc3\xd6\x10\x0e\x05\x56\x44\x00\xec\x25\xb9\x57\xaf\x94\x77\x98\x5b\xa1\x25\xb1\x06\x13\xeb\x08\x92\xca\x5a\x02\xbc\xe2\x06\x4a\xc3\x9e\x91\xfd\x19\xd8\x6b\x0f\x14\x34\x0a\x71\xa6\xb8\x33\x5c\x7b\xa6\xb9\x33\x54\x48\x8f\x0c\x90\x04\x23\xed\x20\x72\x04\x73\x43\x98\x91\x4a\x09\x44\xb4\xc4\x40\x4b\xc8\x08\x24\xd4\x7d\x78\x7e\x58\xfc\x05\xd9\x97\xea\x97\x20\x06\xb2\xcd\x89\x4c\x56\x6e\x64\x26\x1a\x24\xe5\xd6\x51\x25\x29\xde\xd5\x2a\xd5\x5c\xeb\x54\xf5\xfa\x04\xfa\x2b\xeb\x76\xa7\x34\xe3\x57\xa7\x5d\xdd\xd4\xae\xbc\x0a\x6d\x88\xe9\xa8\xb6\x4c\xdb\x91\x42\xd7\x00\x9b\x8d\x3f\xac\xe2\x5e\x04\xbd\x9b\x0c\x9b\x87\xe7\xf3\x28\x77\x64\x1f\x32\xca\x73\x76\x7c\x56\xe1\x00\x25\x71\x35\x87\x27\x05\x8f\xb0\x4b\x7d\xc9\x9c\x4c\x4b\x30\xb4\xee\xec\x79\xa3\xca\x8a\x45\x08\x44\x45\x65\xf3\xe3\xcb\xc4\x6e\xfc\xce\x65\x15\xe6\xc5\x89\xaf\x07\xf3\x42\x2d\x13\x1e\x5a\xf8\x5c\xba\xa8\x4d\xbe\x43\xa3\xfa\x6c\xd0\xea\xdd\x73\xe5\xdc\x7b\x47\x65\x4f\x6f\x4b\x09\xbf\x0a\xb2\xd0\x71\x8c\x18\xd3\xd2\x40\xcb\x9c\x15\xd4\x59\x04\x10\x07\x1a\x1a\x69\x08\x10\x90\x10\x6a\xa9\x47\x00\x42\x21\xb5\xd3\x9a\x72\x04\x8d\xd4\x88\x32\xea\x39\x79\x3e\xc6\xf5\x13\xb0\x97\x80\x42\xcb\x84\xc2\xd6\x03\xc8\x19\x82\x46\x79\x89\xf1\x2d\xc9\x10\xc4\x4b\xcc\xa0\x16\x9c\x73\x62\x84\x37\xb7\x78\x8d\x80\xa6\xde\x62\x87\x95\x20\xce\xea\x5b\x62\x80\x1e\xaa\x5f\xe4\xa5\xfa\x95\x29\x54\x27\x23\x3d\xc5\xa1\x49\x1b\xb3\x51\x21\xd3\xf3\x71\x50\xcb\x4e\x7d\x7a\xe8\xe1\x42\xd7\xb5\xd6\x5b\xdb\x6a\xae\x45\xc9\xa4\x69\x71\xc5\x33\xa5\xb9\xda\xa1\xe9\x64\xbd\x2a\xcd\x95\x3c\x6e\xeb\xf5\x1a\x58\xad\x82\x49\x54\xa1\xa5\x96\x6b\xcc\xea\xfd\xec\x61\x2a\x3f\x6e\x89\xde\x91\x7d\xc8\x65\x71\x3d\x58\xc6\xd3\xce\x69\x51\x5f\x11\x4e\x56\xd3\x55\x79\x74\xd9\xf9\x59\xb2\x70\x2e\x57\x49\xec\x68\xa0\x2f\x8d\xea\x49\x2f\x77\xe7\x4c\xab\x67\x55\xad\xe9\x83\x24\x1d\x5f\x8e\xb3\x6b\xad\x55\x0b\x33\xdd\x54\x8f\xb1\x8d\xa6\xc2\x24\x60\xb4\xf7\x20\xd3\x58\x75\xf7\x87\x7b\x62\xf0\xde\x59\xd9\xeb\xdb\xe7\x11\x7e\x15\x64\xb5\xb0\x02\x2a\x49\x8c\x91\xca\x40\x6b\x2c\x91\x9c\x3a\xaa\x95\x03\x4c\x00\xc5\x09\xf3\x04\x2a\x2d\x11\xb6\x4e\x6a\x26\x18\x05\x04\x21\x80\xa5\x17\xd6\x13\xfe\xfc\xf4\xcb\x4f\xc0\x9e\x13\x26\x3c\xa4\x56\x4b\x8a\x90\x41\xdc\x49\xeb\x8d\xb7\x08\x58\x20\x24\x51\xda\x71\x83\x89\xc3\x1e\x62\x63\x09\xc4\x48\x4a\x25\x31\xb1\xc2\x58\xe4\xb8\xc3\x77\x64\x1f\xaa\x5f\xe4\xa5\xfa\x75\xa6\xd7\xea\xe2\x60\xca\x03\x9e\x26\xfb\x4a\xde\xd4\xcb\xd5\x73\x30\xea\xb5\x6d\x72\x09\xda\x13\xcd\x78\xff\x52\xae\xee\xe6\x43\x6f\xab\xa4\x70\xbd\x1e\xfb\xbe\x39\x75\xf4\x98\x67\x66\x34\xce\x17\xfd\x76\x78\x8a\xca\x51\x58\x88\x8a\x70\x3d\x3e\xad\xb3\xb3\xca\xf4\x90\xe5\xaf\x51\xf6\xb1\x06\x05\x82\x68\x72\xe9\x92\xfc\xa5\x50\xaf\x1f\xd5\xa5\x03\x82\x45\x53\xf2\xb1\x5b\xca\x29\xdc\xce\x2a\xbb\x55\xea\x62\x30\x69\x6d\xa7\x87\x35\x50\xcd\xa2\x3d\xf4\x2b\xbb\x6a\x66\xe9\xaf\xb2\x12\xe7\xab\x9d\x2d\x15\x71\xa3\x79\x6e\xc6\xad\x6e\x6d\xb8\xe9\x76\xd3\x6b\x87\x66\x1a\x77\x64\xdf\x3b\x2c\x0b\xdf\x96\x12\x7e\x15\x64\x2d\x90\x06\x71\x4a\x9d\xc2\x10\x02\xc9\x19\xb7\x4c\xdd\xfe\xe3\x90\x52\xe3\x3d\xd4\x0c\x03\x67\x35\xc3\x4c\x28\xa2\x91\x00\x5a\x33\x61\x1d\x22\x06\x39\xad\xc9\x7d\x52\xff\x09\xd8\x23\x43\x81\x53\x04\x31\xef\x34\x70\xcc\x1a\xc5\x8c\x31\x5e\x13\xef\xb9\x83\x1e\x59\x60\xa0\x63\xc6\x43\xc1\xa4\x31\x00\x7b\xaf\x21\x06\x10\x73\x08\x14\xe3\xf7\x07\xc7\xd0\x43\xf5\x8b\xbc\x54\xbf\xf8\x34\x2d\xad\xbb\xd1\x62\x57\x36\xb0\x6a\xdd\x80\x91\xd2\xa8\x66\x4b\x32\xb7\xa1\x15\xc9\xb4\x2a\xf5\xc2\xca\xa8\xe1\xa7\xbe\xcd\x1a\xcd\x11\x0d\x56\x93\x62\x6f\xb4\xc7\xa5\x12\x18\x34\xaa\x5b\x92\xc7\x55\xd5\x2a\x2f\x78\xd4\xcc\xb5\x26\x3b\x9b\x27\xe3\xd9\xf5\xdc\x79\x40\xf6\x81\x22\x77\x60\xc3\xfa\x35\x93\x71\x8d\xcb\x00\x67\xcb\xcd\x94\x41\x76\xcc\xac\x8a\x28\xe1\x94\x0d\xf2\x5d\x51\x92\x38\x58\xdb\xf2\xc4\xaf\x76\xbd\xc6\x3a\xaf\x33\xbb\x86\x36\xeb\xdd\xb5\xb9\x6f\xca\x4c\xf9\x02\xa2\xf2\xe2\x7a\x1e\xaf\xaf\x41\x33\xbb\xeb\x06\x5d\xd3\x5a\x2f\x6b\xf7\xc4\xe0\xbd\xd3\xb2\x68\xf7\xa6\xc7\x0b\xc1\x2f\x82\x2c\x87\x1a\x22\xa4\xbd\x86\xc0\x41\x28\x31\x95\x5c\x19\x4f\x38\x93\x5e\x4a\xcd\x21\x73\x5c\x3a\x6e\xa1\x53\xc6\x78\x84\xa8\xb2\x9e\x7a\xcb\xa8\xd1\xce\xb9\xe7\xa7\x09\x7e\x06\xf6\x9c\x23\xe9\x39\x75\x42\x29\xc4\x94\xd1\x48\x50\x2f\xb1\x73\x8e\x19\xc8\x28\x80\x16\x69\x66\xb5\x76\xd6\x69\xe4\xb4\xb0\x08\x22\xef\x99\xe3\x0a\x78\x0c\xe5\xbd\x60\x8b\x1e\xaa\x5f\xf4\xa5\xfa\x25\xf3\xa6\x0a\x93\x4d\xd4\xce\x27\x43\xa9\xf6\x6a\x6f\xfa\x49\x53\xe8\xf4\xc4\x75\x8a\x26\xb3\xdd\x2a\xcf\x55\x4c\x66\xa7\xc3\x01\xe0\x71\xc4\x0c\xeb\x5c\x4e\x41\xbb\xb3\x6c\x6a\x6c\xf6\x45\xe6\x57\x7d\xab\x47\x97\xf3\x78\x9d\x6d\x93\xec\x2e\x33\x08\x33\x7b\x47\x9f\x5d\x7c\x47\xf6\x21\x97\x85\xd7\x49\x59\x4d\x0f\xba\xb0\x9d\xc2\xca\x81\x86\x2d\x91\x0e\x73\x88\xe4\xaf\x0b\x24\x83\x6a\xd3\xaa\xea\x72\x97\xe0\x4c\x90\xf1\x7d\x5c\xf3\xd6\x4d\x36\xd5\xcd\xe5\x32\xf6\xb3\x0c\x5f\x9c\x06\xbd\x1c\xd8\x6a\x7d\xdc\xb3\x0b\x23\x60\x5c\xcf\xea\xe5\xaa\x19\x0d\xef\x05\xdb\xdc\x7b\xc7\x65\xc9\xdb\xea\xd7\x7d\xe7\xed\x17\x40\xd6\x53\x62\x00\x90\xdc\x12\x02\xbd\xe7\xcc\x10\xc1\x2d\x71\x5a\x43\xe1\xa9\xa3\x9e\x22\x43\x15\x85\x46\x49\x26\x00\xd0\x5e\x6a\x01\x05\xba\x61\x01\x14\xe6\xfc\x9e\x87\xfe\x0c\xec\x6f\x4b\x2d\x01\x31\x61\x54\x52\x83\x10\xd7\x56\x18\x0d\x95\xf7\x8a\x22\x4d\xa1\x25\x06\x4b\xec\xa4\x52\x98\x18\xa5\x19\x92\x8e\x51\x8a\x04\x14\xd6\x6a\x62\x98\xbf\x21\xfb\x50\xfd\xa2\x2f\xd5\x2f\x69\x74\x38\x39\xf2\xb0\x11\x0e\xe3\xa1\xdb\xc9\xb2\xf2\x0b\x6d\x06\x94\x52\x59\xde\x5c\x9b\x95\xf9\xd6\x27\x72\x68\x8e\x07\x82\xf3\xd4\x4e\xd3\x93\xcb\xcf\xfc\x41\xbb\x74\x72\xd9\x06\xc7\xf3\xbc\xb9\x38\xf4\xca\xa3\xb3\x9e\x65\xd6\xb3\x84\x50\x30\xd7\x93\x5e\xee\x35\x97\x1d\x3e\xe4\xb2\x91\x1c\xd5\xfb\x85\xe3\xf4\x14\x1d\xfa\xc3\xcc\x72\xda\x9e\x1e\x8f\xd1\x79\x3e\x5e\xd9\xf6\x28\xdb\xaf\xae\x0f\x6a\x3d\xc9\x6b\x70\x91\x9d\xc2\x6e\x50\x09\xc1\x70\x98\xe4\xab\x1c\x45\x3b\x95\x65\xbd\x6d\xcf\x76\x0b\xb3\xcc\x62\x13\x47\x1b\x54\x73\xc3\x7e\x2d\x37\xb5\xfb\x48\xdf\x13\x83\xf7\xce\xcb\xd2\xb7\xd5\xaf\x5f\x05\x59\x89\xa8\x23\xc2\x3b\x61\x30\x94\x0e\x61\x2d\x28\x80\xc4\x5a\xcf\x1c\x66\x52\x58\xad\x9c\x86\x54\x5b\x41\x1c\x70\x84\x60\xca\x20\xf1\x18\x22\x6a\x05\xe1\x4e\x3d\x3f\x17\xfb\x13\xb0\x17\x50\x72\x2a\xa5\x14\x10\x58\x45\x00\x03\x58\x51\x60\x90\xf5\x08\x63\x21\x31\xa5\x86\x12\x45\x04\x36\xd2\x59\x2e\x29\x22\x46\x71\x8f\x14\x54\xc2\x19\xc9\xec\x3d\x97\x7d\xa8\x7e\xd1\xd7\x07\xbf\xfa\x51\x50\xf5\xbd\x96\x97\xe8\x5c\xf1\x3d\xc6\x4b\xcd\x64\x2e\x3b\x67\xd5\x33\x9b\xc1\x28\x38\xd2\x43\x6e\xb4\xee\xd3\xfc\xd4\x92\x86\xce\x6d\x8c\xdb\x89\x6b\x32\x0c\xa6\xbe\x5e\x52\xed\x4c\x64\xc1\xa8\x7c\x6a\xf6\x49\x3d\x13\x1f\x6c\x73\xd4\x69\x55\xed\x2e\xa4\xaf\x89\x81\x7a\x70\x79\xa9\x5b\x33\x53\x4b\xf7\x3b\x33\x2f\xe2\x66\x66\xbd\x2f\x4c\x22\xdb\x1b\xac\x05\xde\x1f\xd2\x62\xe6\x3a\x0f\x0a\xeb\x4c\x92\x19\xed\x33\x2e\x37\x87\x8b\xe1\xa8\x85\x66\xb9\x51\x63\x5e\xc8\xe3\x4b\x44\x66\x30\x29\x76\x66\x23\xb1\xdc\xbb\x7e\x35\x5a\x67\x6b\xe3\x4d\xe3\x32\x40\x77\x64\xdf\x3b\x2f\x2b\xde\x3e\x46\x53\x0a\x7e\x11\x64\x01\xd2\xc0\x53\x07\x9d\xa3\x80\x69\xe9\xa5\x65\x42\x38\xc2\x08\xe3\x58\x5b\x85\xbc\x52\x80\x32\xc1\x99\xb1\xde\x01\x65\x10\x05\xce\x53\x23\xad\x07\x4a\xa8\x7b\x19\xe0\x67\x60\x0f\x31\x86\xc4\x53\xe8\x98\x64\x86\x12\x00\xbd\x93\x82\x10\xc5\xa1\x10\x4c\x48\x43\x1c\x91\x04\x42\xc8\x29\x44\x04\x32\x0f\xb9\x72\x96\x72\x02\xbd\x05\xc4\xde\x5f\x60\x80\x1e\xaa\x5f\xf4\xa5\xfa\x45\xab\xae\xd3\x64\x51\x34\x24\xd3\x43\x31\xe8\x61\xaf\xa7\x2a\x45\x8c\x9d\x07\x72\xdc\x28\xcc\x5a\x30\xed\x89\x73\xd5\x8e\xcb\xec\xd8\xba\xd8\x6a\x25\x09\x83\x1d\x3c\x34\x0a\xac\x32\xeb\x45\x3b\x51\x9a\x2f\x2f\xcd\x42\xf7\xdc\xde\xac\xda\xb5\x01\xc9\x9e\x46\xc3\xa1\x8a\x9f\x43\xeb\x1d\xd9\xc7\x27\xbf\xd6\x2e\xb1\x71\xe2\x17\x63\x18\x2e\x7b\xd3\x7c\x5a\x89\x9c\xb6\xd7\xbe\x68\xce\x47\x79\xc7\xaa\xcc\x55\x37\x22\xd2\xa4\x93\xa4\xdd\xa8\x27\xdb\x74\xad\x8b\xad\x5c\x76\x3d\x0e\xd7\xe7\x49\x69\x62\xba\xb3\x79\x2e\x4c\x7a\x9d\xd6\x40\x24\xdb\x7d\x1f\x94\x65\x2e\xbe\xbf\xc1\x20\xf7\xde\x79\xd9\xcc\xdb\x82\xed\xaf\x82\xac\xb9\x2d\xe7\x6f\xab\x74\xef\x08\x72\xc8\x42\xa0\x91\x54\x98\x03\xad\x9d\x56\x14\x62\x47\x94\x73\x04\x49\x24\x90\xd5\x8e\x10\x41\x90\xc0\xd4\x42\x4d\x08\x66\x0c\x3f\x6f\x50\xfd\x7d\xec\xa9\xd6\x8c\x6a\x84\xa8\x00\x98\x43\x25\x08\xe3\x9c\x02\x88\x34\x43\xc8\x68\x29\x20\x31\x0e\x2a\xa7\x8d\x32\x8e\xdc\xe2\xaf\xe3\xd4\x31\x66\x00\x51\x96\x39\x4a\x6f\xc8\x3e\x54\xbf\xe8\x4b\xf5\x8b\x06\xdb\x02\x24\x8e\xb6\x14\xcd\x58\x55\xa1\xa5\xf6\xb2\x21\x57\xc7\xcd\xa8\xbf\xb2\x3b\x9c\xc9\xef\xaa\x2d\x0e\x2f\x56\xd4\x26\x8b\x65\x5c\x38\xd5\xd3\xb2\xe3\xa3\x4a\x39\x8d\x2e\xe7\x74\x32\x68\xd6\x59\x60\xd7\x8d\x45\xa3\x94\x6f\x57\xe2\x45\xd3\x84\xc7\x45\x6e\x49\x9f\x6b\xa5\x77\x64\x1f\xc0\xb1\xad\x6c\x97\x5c\xaa\x71\x6d\x29\xc7\x93\xea\xaa\x7b\x38\x17\x76\xb1\xb6\x72\xa2\xdb\x03\x8f\xc6\x71\xb9\x3a\xde\x4d\x36\xb9\xda\xa0\x00\xf5\x7e\xbe\x9b\x0c\x82\xf8\xbc\x09\x87\xb8\x97\xab\xa1\xca\xee\x90\x16\x23\xa2\x98\xd8\x36\xda\xad\xd3\xc1\xba\xe1\x2e\x57\x83\x87\xfb\xc3\x90\xb9\x77\xce\xcb\xe6\xaa\x6f\xf7\x65\x7f\x15\x64\x25\x66\x06\x3a\xe8\x81\xf6\x50\x79\xc9\xb0\x00\x4e\x03\xe9\xa8\x74\x14\x41\x4b\x1d\xb6\xd6\x62\x0e\x2c\x82\xde\x13\x6f\xa1\x02\x52\x69\x88\xb0\x22\xc6\x6b\x75\x5f\xed\xff\x0c\xec\x11\xba\xe5\xab\x86\x10\xa9\x6f\x4b\x2e\xca\x04\xd4\x4e\x69\xe0\xad\xd0\x8e\x39\xcf\xa0\xe2\x0c\x0b\x0e\x31\x84\x50\x7b\xae\xa1\x02\x98\x2a\xe9\xb1\x57\x90\xe0\x9b\x0e\xf4\x50\xfd\xa2\x2f\xd5\x2f\x51\x0c\x07\xfd\xca\x91\xe6\xc9\x3e\xac\xd7\x54\x7c\x3a\x64\x0e\xf3\x30\xd3\x39\xd0\xfc\x6c\x55\xd7\x34\x1c\xe7\x47\x10\xe8\x76\x61\x38\x8d\xca\x85\xdd\xa2\xba\xea\xae\x2f\x3e\xda\x82\x25\x1f\xb6\xa7\xb0\xb9\xef\xa7\x66\x72\xea\xd0\x22\xa2\x59\xa7\xfb\xb4\xb6\x68\x96\x2f\xaf\xb9\xac\x7a\x7c\xf6\x4b\xe5\x0b\xa4\xad\x7d\xb8\xe9\x6c\x2b\x99\xcd\xba\x72\xb9\x5e\x7b\xbd\x8c\x4e\xd3\xa8\xba\x6b\x9f\xf0\xba\x6c\x16\xe5\x53\x6b\x7b\x54\xc1\xa4\xdc\xbb\x86\x1d\xcd\x17\xe7\xc1\x48\xb3\x6d\x41\x4e\x32\xfa\x98\x2a\x3b\x1d\x9f\xa3\x76\x29\xeb\xce\xab\xc2\x60\x2d\xb2\xab\x5e\x74\x4f\x0c\xde\x39\x2f\x9b\xab\xbf\xed\xf1\x5f\x05\x59\x4e\x81\x77\xd6\x0b\x01\x25\xc4\x8e\x02\x41\x10\xb7\xdc\x30\x0f\x15\x86\x1e\x60\x64\xfc\x8d\x9a\x1b\x77\x4a\x23\x6f\x14\x36\x44\x20\x4e\xb0\x91\xc8\x41\x76\x3f\x38\xf8\x33\xb0\x97\xd0\x38\xa5\x28\xe3\xee\xa6\xc5\x39\xce\xbd\xf4\x58\x73\x0e\x85\x91\x0c\x52\xcc\x98\x80\x50\x52\xcf\x8d\x84\x18\x53\x81\x01\x03\x06\x41\x6e\xa4\x54\x80\xde\x90\xc5\x0f\xd5\x2f\xfa\x52\xfd\xa2\xf1\xae\x3c\x16\x75\xa1\x32\x83\x46\xc0\x4e\xcb\xf9\x72\x5e\xb1\xc9\x14\xdb\xf8\x04\xc6\x59\x90\x6d\xaf\xaa\x9b\x73\x85\x75\x9b\x87\xcd\xec\xda\x48\xae\x74\xe1\x51\x7d\x94\x2e\xd5\x2a\xd8\x27\xe7\x78\x58\x9f\x65\x7a\xbe\x2b\xd2\xb6\x44\x2d\x2d\x87\x3c\x6d\xea\x3a\x7e\x3d\x2f\xab\x1f\x5c\x0e\xa7\x49\x5d\xad\x6a\xd9\x4a\x63\x53\x8b\xfb\xb3\x89\x46\x26\xae\x6f\xa7\xf3\xb0\x5b\x4e\xd6\xc3\xb9\xa9\x92\x5c\x31\x6d\x08\x1d\xe1\x45\xfb\xba\x59\x0f\xfc\xe8\x78\xe6\x4b\x4f\x05\xb7\xe7\x69\x35\xed\xc7\x8b\x51\x7b\xee\x7d\x35\xbc\x0e\x0a\xb9\xd1\x69\xec\xab\x8b\xd1\xfd\xb5\x1e\xb9\x77\xce\xcb\xe6\xa2\xb7\xa5\x84\x5f\x05\x59\xef\x20\xc6\x8c\x19\x62\x28\xbe\xcd\xb2\x8c\x3a\x43\xa8\xa3\xd6\x72\x4a\x80\xc5\x18\x29\x61\xb0\x20\x94\x79\x0e\x15\x61\x5a\x18\x28\xb9\x12\x9e\x41\x06\x89\xbe\x47\xc8\x9f\x81\x3d\x30\x48\x32\x04\xac\xb6\xc4\x38\x02\x1c\x82\xc0\x4a\x8f\x31\x00\x1a\x53\xc9\x3c\xf4\x06\x22\x04\x21\x43\x54\x11\x0e\x94\x91\x84\x79\xcc\x09\x43\x8e\x30\x6f\x6e\x3a\xf0\x43\xf5\x8b\xbe\x54\xbf\x70\xaf\xc9\xfd\x24\x37\xeb\xd2\xd6\x38\xef\x93\xf3\xb1\x34\x2d\x9f\xa2\x5d\x56\x4e\x60\x98\xd9\x5c\xb2\xb5\x66\x38\x5a\xb6\xc4\xec\x50\xdc\x99\xca\xa6\xbf\x98\x5e\x8e\x9b\xca\x5c\x17\xed\x62\x91\xdf\x99\x6e\xf9\x74\x28\xc2\xb3\xcf\x42\x24\x6a\x8b\xd5\x3a\x57\x8f\x5a\x83\x78\xf3\x9a\xcb\xea\x07\x8a\x44\x69\x31\x44\x8b\x71\x69\xd0\xcc\x9b\x41\x60\xe1\xba\x27\x3b\xb9\x6a\xe2\xdd\x74\x5f\xe0\xc5\x46\xb8\xaa\x17\xd8\xaa\xb8\xeb\x36\x8e\x24\xaa\x0d\x2a\xf1\xb1\x77\x9d\x15\x26\x61\xbc\xbc\x46\xc1\x0e\xce\x8f\x65\x11\x4e\xc2\x41\x55\xb5\x4f\xdb\x6a\xfb\x18\x83\xf4\xd0\x3e\x5e\x6f\x8a\x73\xef\x9c\x97\xcd\x35\xde\x96\x12\x7e\x15\x64\x01\x75\x9c\x1b\x2d\xd9\x2d\x68\x69\xa8\x29\xc1\x9c\x50\x2f\x84\x77\x98\x39\x8c\x08\xd3\x84\x6a\xc4\x94\x74\x8e\x4a\xee\xa1\x24\xde\x7a\x85\x31\x92\x90\x2a\xc3\x3e\xbe\x49\xeb\x6f\x63\x6f\xac\x92\x82\x59\xc9\x15\xa6\x8a\x69\x0f\x08\x17\x0e\x50\x4a\x01\xb6\x1a\x03\xc1\x99\xb3\x52\x0b\xc3\x9d\x22\xd4\x73\x04\xa4\x33\x48\x30\xe4\xa0\x90\x0a\xe8\x5b\xa4\xc6\x0f\xd5\x2f\xfa\x52\xfd\xca\x92\x6e\xbc\x38\x47\x3d\x91\xab\x0d\xdd\xb9\x48\x2d\x84\xad\x38\xba\x6c\xa2\x46\xd8\x3f\x1a\xd5\xde\x4e\x73\x73\x36\x45\xc5\x71\xe7\xaa\xed\xf9\xac\x7d\xb1\xd0\xcf\xec\x26\x2c\x28\xb5\x8f\x75\xba\xcb\xac\xfa\x66\x97\x8a\xe1\x69\x56\xa4\xb3\xba\x0c\x73\x97\xf5\x84\xcf\x5e\x77\x0c\xf4\x43\x2e\x8b\xae\x05\xca\x2d\x5a\xf5\x4e\xa8\xce\x16\x87\xed\x7e\x91\x5d\x39\x54\x98\xb2\xe2\xe1\x9a\x4b\x96\xfd\x05\x9f\xf3\xf2\xaa\xb0\x8b\x7a\xd7\x78\x93\xea\xa1\x9b\x0e\x16\xc7\x53\x9b\x90\x62\xbf\xd5\xd4\x51\xc5\x1e\x90\x9e\x96\xd9\x2c\xc1\x95\x2a\xcf\x8f\x27\x24\x5d\x8c\x0e\xa3\x7b\x5d\xeb\x1d\x64\xdb\x6f\xf7\x65\x7f\x15\x64\x29\xe2\xd8\x22\xc4\x3c\x56\x56\x12\x62\x35\x17\x8e\x13\x60\x91\xf3\x90\x63\x26\x08\xbd\xd1\x05\xa4\xf0\xc2\x20\x64\x90\x82\x8a\x40\x24\xb0\xb0\xc8\x23\xce\xef\xa7\xb0\x7e\x06\xf6\x37\x28\x31\xa5\x06\x5a\x6d\x2d\x45\x0c\x12\x00\x34\x73\xd2\x58\xec\xb0\x60\x52\x30\x42\xa4\x17\xdc\x09\x46\x1c\x22\x1c\x40\x83\x88\x43\x96\x1b\xef\x19\x72\xfa\x86\xec\x43\xf5\x8b\xbe\x3e\xfb\x95\x2c\x7d\x7d\x3e\x4a\xa3\x9d\xee\x17\x6c\x31\x53\xc9\x4e\xf5\xb4\x5a\xda\x17\x77\x8b\x8d\xa3\x43\x7f\x9e\x37\x31\x8b\x2e\xb3\xfe\xb6\x74\x70\x51\xe9\x54\xeb\x5d\xf0\xd5\xe6\xab\xa1\x36\xcb\xfa\xf2\xbc\x1a\x86\x3d\xdc\xa7\x52\xa5\x5b\x9e\xd9\x68\x1f\x4d\x40\xe1\xb4\x7c\xe6\xf4\x8e\xec\x43\x2e\x5b\xb6\x4d\xb1\xcf\xe5\xf6\x6b\x77\xa9\x0b\x29\xf7\xf5\xe6\x32\xb6\x6a\xd3\x5b\x95\xdb\x83\x45\xb9\x36\xad\x89\xc5\x4a\x6f\x09\x44\xa7\xb0\x62\xa7\x7d\x53\xd6\xb8\x5f\x1d\xb7\x82\xfd\x61\x19\x37\xa7\xe3\xf5\x78\xd6\xf1\xe3\xcc\x78\x46\x66\x26\x77\x9a\x91\xbd\x6f\xca\x09\xbb\xe9\xcf\xbf\x73\x5e\x36\xd7\x79\xbb\x2f\xfb\xab\x20\xeb\x80\x04\x54\x5b\x06\x99\xe4\x02\x52\xc7\xad\x15\x40\x31\xcf\x95\x15\x4e\x60\xc0\xb9\xa2\x18\x10\xa5\x01\x13\x50\x20\xea\xa8\x12\x08\x68\xaf\x8d\x81\xc8\xea\xe7\x27\x6c\x7f\x02\xf6\x9c\x30\xa6\x0c\x35\x1c\x23\x23\xad\x01\x4a\x28\xa0\x25\x45\xd4\x32\x23\xa0\x94\x10\x30\x22\x0c\xe3\xd6\x53\x42\x80\xa6\xda\x12\x22\x8c\xf0\x0a\x1a\x8e\xd0\xfd\x7d\x5c\xf8\xa1\xfa\xc5\x5e\xaa\x5f\xb0\x7a\x05\x13\x7d\xdd\x0e\xdb\xf1\x9e\x50\x50\xe8\xf0\xb3\x41\xe3\x62\x29\x59\x55\xa7\xe4\x34\x39\x6d\x4a\xb3\x70\xd5\x88\xeb\x17\x7b\xba\xec\xe3\x6a\xf5\x50\x23\x87\xf6\x3a\xb7\x89\x43\x56\x08\xb2\xfb\x53\x7e\xbf\xbb\x44\xa7\x24\x9b\x8b\xa7\xdd\x1a\x9a\xc2\x00\x99\xfa\xfa\x75\xf9\xf5\xb8\x6c\xcf\xea\x30\xd3\x74\xad\xb6\x36\xd1\xb1\x53\xf1\xad\x8b\x4a\x3a\x83\x24\x1c\x5d\x73\x5c\xe9\xd3\xd6\xc5\xfd\x96\x4b\xd3\xca\xf8\x34\x19\x82\xe1\xe6\x6c\xcc\xe5\x62\x4f\xb5\xc9\xe8\xd0\xaf\x5a\x5d\x29\x0d\xc3\x52\x27\x1a\x4a\xd9\x6b\xd5\x07\xb2\x5d\xb9\x34\x57\xc6\x4c\xee\x2f\xe4\xca\xbf\x73\x5e\x36\xd7\x7b\xfb\x42\xae\x5f\x05\x59\x0f\x24\x60\x94\x7a\x60\xa9\x71\x8e\x0a\x8c\x10\xb7\x00\x08\x61\x34\x57\x1e\x69\x2e\x80\x67\xde\x4a\xe8\x04\x66\x8a\x40\xc8\x95\xd6\x10\x5a\xc2\xa5\xa6\xc6\xc1\xe7\x93\x5c\x7f\x1f\x7b\x0c\x09\xc4\x9a\x08\x4c\xb8\xa3\x84\x2b\xa0\xa8\xc5\x9a\x58\x45\x18\x13\xc6\x38\xee\x8c\xd3\x5e\x58\x41\x08\x55\x1c\x02\x75\xcb\x7c\x21\xc4\xc6\x2b\x22\x9d\x73\x37\x64\x1f\xaa\x5f\xec\xa5\xfa\x95\xc9\xb7\x06\x32\x1d\xcc\x49\xd1\x79\x3b\xaa\x69\xbc\x4d\x59\x21\x87\xd7\xdd\x5c\x6d\x57\x1a\xa5\x55\x37\x58\x55\xea\x19\x71\xea\x20\xd9\xdd\x0e\x7a\x96\x35\x78\x44\x3a\xc0\x3b\xd1\x0b\x8d\x1d\xcf\xcd\x22\x35\x17\x0b\x32\x2b\x3d\x52\xb6\x35\x4d\x87\x41\xb6\x57\x7b\x3d\x2f\x6b\x1e\x9f\xfd\xc2\xf3\x41\x53\xfa\x6e\xa7\xba\x68\x2f\x63\xde\x5c\xc7\x39\x35\x54\xe9\x75\x52\x1a\xcb\x64\x86\x2a\x68\x7e\x09\x46\x69\xcf\xc6\xbb\xd3\xb9\xd5\xdd\x57\xe2\x32\xed\xb9\xd1\xda\x36\x00\x9a\x0d\x57\xd7\x86\xdf\xb1\xec\x34\x6d\x17\xd7\xe7\xfc\x3a\x1d\x85\xdd\x2b\xeb\x38\x7e\x4f\x0c\xde\x39\x2f\x9b\xeb\xff\xaa\xa5\x04\x2f\x19\xf5\xd4\x71\xe6\x90\xf5\x5c\xde\x0f\xb4\x70\x44\xa8\xc0\x50\x4b\xaa\x05\x73\xc6\x48\x0e\xa1\xe7\x9a\x7b\x0d\x09\xb1\x5e\x6a\xa3\x0c\x36\x42\x71\xf5\xfc\x1e\xe3\x9f\x81\x3d\xe2\x86\x7a\x08\x99\x70\x94\x19\xcc\x85\xe0\xd4\x02\xcb\xb9\x40\x48\x62\xe7\x6f\xec\x3b\xe8\x0d\x46\x94\x13\xa3\x18\x36\xc0\x78\xe5\xfd\x2d\xd5\x75\x80\x7a\x72\x43\xf6\xa1\xfa\xc5\x5e\xab\x5f\xf9\xd6\xb0\x2f\xe2\xa4\x41\xd3\x68\xe2\x5b\xf9\xca\x05\x6f\x2f\x7b\x52\x40\xd9\x61\x79\x15\x6f\x5a\x6d\xb7\xdd\xb5\x61\x79\x01\xaf\xe3\x3d\x01\x66\x7d\x64\x2a\x1f\x2f\x86\x89\x99\x4f\x41\x69\x0d\x47\x22\xdb\xea\xea\xcc\x36\xdc\x5d\x79\x83\xb5\xda\xee\x18\xae\xf9\xfa\xf5\x6d\x31\xe6\x21\x97\x2d\x9c\xf9\x01\x77\xf7\x42\x82\x42\x21\x1f\xa4\xa8\xd9\x5b\xe1\x79\x6d\xd2\xc3\x11\x5e\x5e\xe6\x66\xbb\x59\x1c\xa3\x79\xb1\xde\xc9\xf8\x70\x79\xf6\xe1\x60\x3a\xd7\x05\x57\xb1\xb6\x90\xb8\x7c\xad\xcb\xe5\x74\x45\xfc\xe9\xd2\x07\x97\x45\x33\xb8\xb2\x2c\x0c\x24\x29\xca\x7b\x23\xde\x39\x2f\x9b\x4b\x7e\xd5\x52\x82\xc7\x52\x32\xe8\xb8\x75\x14\x03\x80\xad\x54\x82\x0b\xc4\x39\x26\x18\x48\x68\x18\x70\xf0\xf6\x15\xaf\x6f\xa9\x27\x40\xda\x01\x81\x31\x31\xca\x31\x2e\xb8\x76\xcf\x05\xdb\x9f\x80\xbd\x10\x0c\x09\x4e\x35\xa6\x00\x4a\x0c\x05\xd0\x40\x13\xcf\x0d\xa4\x90\x19\xe3\x1c\x01\xd0\x48\x8e\x99\xc4\x46\x59\x65\x08\x36\x16\x01\xa4\x00\x40\xc2\x49\x78\xc7\x1e\x3f\x54\xbf\xd8\x4b\xf5\x2b\x3b\x9f\x4b\x67\x0f\x75\xef\x7a\x73\x48\x2f\xed\x34\xd2\x73\x3d\x3e\x5c\xab\xa6\x2d\xb9\xe7\xc5\x10\xd3\x63\xed\x24\x26\xcb\xd5\x66\xea\x12\xbf\xa3\x6d\x95\xcf\xae\x3b\x3a\x6a\x81\xde\x2c\x1e\x35\xca\x1b\x56\x2b\xae\x8b\x8b\x0d\xcd\x9e\x9b\xe3\xb1\xca\x6e\x2a\xdb\xc9\x03\xb2\x0f\xb9\x6c\xb3\xd1\xd6\x87\x63\x39\x8e\x8b\x7e\xd7\xe9\x2c\xac\xdd\x2c\x7a\x4d\x51\x9c\x89\xc9\x40\x56\x35\xbc\xb4\xea\xd9\x43\x78\x49\x4b\x06\x1d\x2a\xe9\xca\xea\xb8\x55\xea\x96\x82\x5d\xbd\x8b\x4f\xfd\xe2\xee\x7a\x68\xe5\x2e\x49\xbc\x6e\xd6\xd0\xae\x25\xc0\xa8\x36\x0a\x56\xac\x7d\x3f\xfc\x92\x7f\xe7\xbc\x6c\x6e\x18\xbe\xe9\xf1\x5f\x05\x59\x2d\xee\xef\xb0\x80\x46\x63\x43\x98\x30\x84\x7b\x08\x00\x63\x48\x19\x8d\x31\x77\x90\x09\xc1\xe0\x2d\xc3\x74\x08\x42\x6b\xad\xc2\x00\x41\x01\xa4\x70\x02\x30\xe3\xee\xc8\xfe\x04\xec\x0d\x61\x0e\x29\x4e\x8c\xd0\xda\x32\xc2\x0d\xe3\x5a\x2b\xc9\x81\xc7\x4c\x2b\x81\xa9\x75\xc8\x79\xca\x21\x63\xc8\x18\xe8\x30\x11\x0c\x59\x45\x10\x42\x82\x71\x79\x4f\x0c\x1e\xaa\x5f\xec\xa5\xfa\x95\x6d\x0c\x53\xe7\x5d\xef\x14\xc8\xc5\xca\xe5\xed\xb5\x75\x9a\x99\xb4\x51\xde\xe0\xe3\x61\x1a\x8d\x6a\x99\x7c\x21\x8e\xb6\x0b\x57\x3e\x1e\x8f\xb6\x11\x25\x66\xd8\x3a\x22\x9f\x8f\x5a\xcb\x7e\xd4\xf3\xb5\x5c\x95\x27\x9d\xe2\x40\x8f\x72\xd9\x53\x88\x73\x3b\xee\xb6\x82\x1f\x9e\x5d\x7c\x43\xd6\x3e\xb8\x3c\xce\x66\x6c\x7e\x97\x74\xfa\x66\xb2\xae\xd6\x13\xea\x3b\xfd\x79\xd6\xee\x0b\x62\x5d\x74\x99\xc9\x70\xe9\x97\xf1\x10\x8d\xf8\x31\x99\x66\x43\x3d\x59\x83\x4b\xfd\x38\x68\x8b\x21\x3f\xac\x4d\x33\xde\x6e\x0a\x89\xab\x1f\xfb\xe7\xe1\xe4\x9a\x23\x60\x3c\x41\xb3\xca\x64\xbc\xbc\xaf\xf4\xf2\xef\x9c\x97\xcd\x99\xb7\x2f\x3e\xfc\x65\x90\x35\x58\x51\x25\x29\x16\x44\x78\x87\x8c\x26\xcc\x59\x4e\x6f\x99\xa3\x63\x5a\x01\x69\x04\x65\x96\x70\xcb\xbc\x53\x00\x51\x84\xb0\xa0\xc2\x0a\x6b\xb8\x52\x56\xd2\xe7\xf3\xb2\x7f\x1f\x7b\x43\x2c\xc5\xc2\x6b\xc2\x14\xf0\xd4\x7b\x42\xb0\xf2\x82\x5b\xe4\x30\x22\x18\x52\xac\x01\x95\x4c\x59\x0c\x89\xe5\x9e\x33\x6c\x38\xa4\xc6\x5b\x85\x30\x10\xf2\xfe\x60\x39\x7e\xa8\x7e\xb1\x97\xea\x17\x1f\xad\xd5\xaa\x5c\x6f\x86\x2a\x6a\x67\xc3\x60\x38\xd9\xd6\x23\x4c\x06\x93\x52\xf1\x5a\x6f\x54\xda\xd8\xae\x4e\x95\x34\x9f\xb2\x40\x37\xca\x93\x63\xfd\x7c\x69\x8a\x4a\x86\xcd\x48\x75\x9d\x23\x01\x6e\x9e\x1b\xb5\x5d\x3b\x1c\xf6\xa2\xe5\x35\xcd\xad\x82\xe5\x48\x0c\x0f\x61\xfc\xec\xe2\x3b\xb2\x0f\x14\x75\x5c\x39\xb7\x3d\x14\x46\x71\xb3\xaa\xe5\xcc\x9b\x6a\x3f\xba\xe4\x47\x6c\xe1\x34\x98\xad\x8e\xd4\x0e\x64\x63\x26\xc2\xd0\xad\x91\x0e\x61\x77\xca\xdb\x9b\x02\xcc\x82\x16\xcb\x94\xc1\x21\x9a\x45\xfd\xc6\x69\x30\xd8\x76\x8b\xb1\xc7\xa9\x30\xfd\xab\x5c\x4d\xf3\xd5\xfb\x3b\xb9\xf2\xef\x9c\x97\xcd\xd9\xb7\x6f\x3e\xfc\x55\x90\x55\xcc\x53\x6d\x38\xb1\x4a\x12\x26\x39\x90\x44\x1a\x23\x14\x15\x9a\x7b\x03\x8c\xa2\xe8\xb6\xd0\xe1\xfe\xb6\xca\xa7\xde\x18\x4f\x19\x57\x4c\x59\xe4\x31\x84\x4a\xde\x57\xfb\x3f\x03\x7b\x4e\x28\xe6\x1a\x49\x4c\x01\xd0\x46\x6a\x49\x20\x65\x8a\x5a\x61\xa8\x66\xce\x02\x85\x0d\xd6\x00\x10\x20\x0d\xd7\x0a\x7a\x0c\x20\x64\x48\x18\x41\x85\x26\x42\xdc\xec\x20\x0f\xd5\x2f\xf6\x52\xfd\xe2\x27\x36\x58\xf7\x48\xa7\x49\x76\xfb\x12\x4f\x92\x1d\xcb\x28\x96\x37\xe3\x01\x2c\xc3\x23\x1b\x55\x3b\x15\x32\x88\xa7\xc6\x6d\x50\x3f\x3b\x59\x56\x5c\xa9\x5a\xdc\xf6\x61\xbb\xdf\xcb\x9c\xd7\xdb\xca\xb0\x5d\x16\xb5\xbe\xaa\x70\x32\xcf\x76\x83\x7d\x26\xbb\xad\xba\x72\x95\xbe\xbe\x5e\xd6\x3e\x64\x94\x83\xea\x7c\x25\xf9\xd6\xb7\xa6\xd3\x4a\x7c\x08\xc2\x99\xcb\x37\x34\x6e\x9f\xe6\x2c\x4e\x7b\x33\x49\x13\xc5\x70\x6c\x40\x2f\x7f\x84\xa0\x87\x77\xeb\xb8\x95\x17\x0b\xda\xea\xab\x39\x8a\x06\x88\xb7\x56\xa2\x71\xca\x05\xcb\xf2\x61\x2c\x4e\xe1\xa0\x16\x8d\xd3\x7d\xe5\xae\x3e\xff\xce\x79\xd9\xdc\xe8\xed\xe3\x8a\xbf\x0a\xb2\x08\x69\xc0\x34\x01\x92\x10\x76\x7f\x7b\x16\xe2\x42\x79\x60\x1c\xa4\xca\x4a\xc9\x28\x57\xc0\x7b\x04\x25\x53\x54\x7b\x67\x9d\xa5\xcc\x32\x69\x31\xe3\x5c\x1a\x69\x9f\xdf\x16\xf3\xf7\xb1\xc7\xc4\x59\x0c\x9d\x51\x80\x68\x00\x9d\xf7\x06\x1b\x42\x81\x30\xd2\x61\x22\x99\xc4\x58\x22\x4d\x21\xd4\x0a\x20\x2e\xb1\xc7\xc8\x3b\xec\xbd\xf7\x0e\xdf\x5f\x3a\x77\x43\xf6\xa1\xfa\xc5\x5e\xaa\x5f\x4c\xc3\x63\xb9\xab\xe6\xa5\xf9\x69\x5e\xbd\x56\xd6\xe9\x3e\x7b\x8a\xd6\x9d\xcd\xa0\x9a\x5d\xa9\xb6\xbf\x36\xfb\xcb\xf5\x06\x1c\xa3\xf6\xa6\x55\x8b\x2f\xa9\x6e\x9c\xea\xbc\xad\x27\x6a\x5a\xa9\x2c\xe5\x69\x05\x93\xca\xe6\xbc\x3d\xd7\x92\x71\xc7\x74\xaa\xc3\xc3\x6e\x3c\x5a\xc2\xde\x6b\x29\xe1\x31\xd6\xe1\xbd\x3b\x97\x07\x33\x97\xcc\x77\x63\x71\x99\x53\x54\xbd\x86\x30\xe2\xeb\xac\x38\x5c\x67\x98\x15\xec\x5c\x1f\x4f\x76\x33\x38\xc1\x14\xf0\x6e\x79\xb7\x0a\x77\x39\x9e\x3d\x89\x76\x6b\x5a\x25\x60\xbe\x8e\x68\x0d\x86\x7a\x95\x77\x5d\x71\xc9\x4e\xb3\xd9\xec\x14\x07\xf7\x63\x37\xf9\x77\xce\xcb\xfe\xf5\x9f\xa2\xf9\x55\x90\x55\x92\x19\xed\xa5\xc7\x06\x59\x6c\x28\xd3\x16\x12\x4d\x00\x05\x88\x30\x45\x1d\x96\x8e\x4a\x04\x14\x02\xd0\x49\xcb\x98\x21\x40\x1b\xaa\x14\xbb\x65\xab\xde\xd1\x8f\x47\x5a\xfe\x3e\xf6\xd8\x51\xae\x3c\x52\xd2\x20\x26\x28\x24\xc4\x70\x81\x34\x15\x48\x50\xa9\xac\x85\xc0\x70\x0f\x04\x63\x86\x61\x2d\x34\x03\x94\xdf\xec\x12\x37\x5b\x8c\x93\xf7\x72\x04\x79\xa8\x7e\xb1\x97\xea\xd7\xa5\x76\x52\x20\xdf\x6b\xef\xca\xa7\xd3\x72\x72\x2c\x34\x8a\x0a\x0d\x87\xc9\xaa\x29\xc6\xf3\xcd\x20\xcb\x1d\x1c\xc0\x35\x40\x96\x5e\x6c\x05\x5e\xcb\x6a\x9f\xe9\x96\x3b\x93\x92\x28\x4e\xaa\xe9\x38\x41\x95\xe9\xc6\xb8\x53\x74\xd9\xac\xb9\xab\xd4\xdb\xfb\xfa\x79\xbe\x09\xfa\xaf\x51\xd6\x3d\xb8\x9c\x2c\x5a\xe7\x43\xe5\x52\x9a\x45\xcb\x5e\xbc\xde\x9e\x57\xf0\xc0\x34\x8e\x1b\xb5\x51\x27\x9b\xdf\xb4\xdb\x60\x26\x57\x51\xab\x59\x1f\xec\x44\xa6\xcf\xc4\x66\x99\x57\xc5\x62\x78\x26\x35\x38\x5a\x0d\x14\x6e\x17\xca\xa2\x32\xdc\xa5\x7c\x82\x72\xc9\xa0\x93\x8f\x06\x9b\xeb\xfa\x7c\x47\xf6\x9d\xf3\xb2\xb9\xf9\xaf\x7a\xc6\x80\x10\x70\x5b\x2d\x41\x4b\x29\x60\x14\x68\xa6\x80\x62\x18\x40\xcc\x9c\x00\xc6\x22\x2a\x15\xc6\xd8\x28\x4a\x11\xc0\x56\x43\x4a\x84\xc5\x90\x7a\x28\x9d\x27\x8a\xde\xcf\x07\xfc\x0c\xec\x35\xe0\x98\x21\xa2\x25\x13\x08\x63\xc5\x2c\x43\x50\x01\x0b\xb4\x86\x9e\x60\xa1\x80\x75\xc0\xdf\x92\x60\x46\x80\xc4\x12\x41\x25\x1d\x57\xd6\x09\xa7\x2d\x70\xe0\xa6\x83\x3c\x54\xbf\xd8\x4b\xf5\x8b\xcd\x77\x47\x2a\x44\xbd\x7b\x1e\x1c\xdb\x1d\x90\x6b\x55\x4b\x6b\xd7\x70\x83\x4e\x7e\x12\xb8\xe5\x40\x87\x79\x31\xd8\xa8\xf2\xe8\x48\xbb\xc3\xb8\x73\x19\x27\x05\x5f\x0b\x2f\x3d\x36\x9d\x81\x85\x58\x9e\x83\x90\x35\xf3\x55\x55\x3a\x07\xab\xc6\x69\x73\x34\x41\x27\xda\xf5\x3a\xaf\xfb\xb2\xee\x81\x22\x59\x47\xa7\x4d\x4e\x2d\xc4\xf9\xcc\xc2\x68\xde\x82\x2e\xdb\xe6\xd5\xe6\x78\xb6\xab\x6e\x8a\xab\x61\x61\x51\x2b\x9a\x62\xee\xe4\xf1\x39\x7f\x32\xa8\x5a\x9f\xaf\x2a\xd7\xf5\x3e\x1d\xaf\xe2\x3c\x2f\x83\x46\xad\xe0\x0a\x72\x75\x1a\x06\x33\x5a\x51\xcb\xe5\xd6\x4d\xb7\xa0\x11\xdc\xab\x5f\xef\x9c\x97\xcd\x2d\x7f\xd5\x33\x06\xd4\x39\x0f\x01\xbb\xc5\x41\x6d\x35\x81\x18\xfd\xbf\xec\xbd\x5b\x93\xa3\x48\xb6\x2e\xf8\xde\xbf\x22\xad\x5e\xf6\x83\x7a\x6f\x81\xbb\x83\x43\x6f\xdb\x0f\xdc\x41\x02\x21\x10\x02\xc1\xd8\x3c\x70\x71\x2e\x02\x09\x89\x8b\x40\x3a\x76\xfe\xfb\x58\x44\x56\x67\x44\x47\x66\x77\x57\xb5\xaa\x62\x66\x4e\xb5\x2c\x2c\x8d\x48\x29\x1c\xf9\xe7\x1f\x8b\xf5\xad\xe5\xac\x45\x13\x84\x41\x4c\xa7\x34\xca\x49\x96\x32\x0c\xcc\x68\xc8\x40\x9e\xa1\xd9\x8c\xc4\x28\xcf\x32\x48\xf3\x19\x95\xc6\x38\x03\xf1\xeb\xd6\xea\xdf\x84\xf6\x98\x24\x59\x4e\x33\x34\x20\x80\x20\x3e\x8b\x01\x95\xa6\x4c\x9a\xa1\x8c\x8d\xb9\x8c\x8f\x31\x26\x59\x0e\x21\x9d\x32\x30\xe1\x48\xc2\xb1\x80\x02\x0c\x8f\xf2\x24\xe1\x93\x0c\xc4\xf1\x8b\xa5\x46\xef\xb2\x5f\xf8\x5b\xf6\x8b\x72\x56\x57\x5d\xf7\xf7\xda\xde\x8c\x8b\xcb\x51\xf0\x92\x56\xde\xac\xa2\xf6\xb1\x5d\xfb\x3b\x81\xef\xfd\xdd\xc6\xf2\xb9\x08\x53\x97\xb4\x6b\xa7\x7d\xb6\x76\x1f\xc2\x32\x72\xeb\x8c\xb4\x9c\x36\x82\xab\x8f\xbc\x72\x4f\xb3\x19\x7f\xe1\x36\x18\xe9\xf1\x79\x64\xf6\xfd\x5b\xb1\x4e\xf2\xde\x97\x0d\x52\xfa\x12\x96\x7e\xe0\xb6\xca\x2a\x66\xb5\x54\x37\xfa\xf8\x48\xdf\xfb\xd9\x40\x92\xb3\x10\xd3\xd5\xb5\xd2\x02\x38\x1d\x4f\xab\xc5\x2d\x57\x5d\xb3\x62\x56\xa0\x92\xad\xc3\xc6\x0b\xae\x9b\xd3\x39\x1f\xb8\x87\xae\xda\x88\x45\x61\xb1\x8a\x3c\x3c\x26\xd4\xb5\x7b\x95\x5f\x3f\xda\x2f\xdb\x7e\x7c\x5c\xf1\x8f\x42\x59\x96\xe7\x10\x45\x38\x3a\x27\x98\x30\x1c\x8a\xe3\x8c\xca\x01\xc8\xf2\x98\xe3\x09\xc1\x2c\x4e\x33\xc8\x00\x84\x78\xcc\xb0\x90\x20\x4c\xc7\x39\x17\xe7\x2c\x4e\x18\x98\x73\x19\xc2\xf4\xd7\x92\xc8\xcf\xd3\x1e\x66\x19\x4f\x73\x19\x26\x08\xb2\xe9\xeb\x83\x60\x88\x87\x54\x9a\xa7\x08\xd1\x69\xc6\x72\x31\xc7\xa6\x10\x71\x20\xa5\x99\x24\x61\xe3\x84\x22\x4c\x4a\x73\x69\x02\x32\x26\x47\xe8\x95\xf6\xe8\x5d\xf6\x0b\x7f\xcb\x7e\xd1\xf8\xa6\x68\xa4\x58\xf0\x83\x68\x95\x8c\xbe\x2e\xa7\xfd\x72\x98\xfd\xad\xbb\xf1\x1a\x37\x21\x97\x2d\xf4\xb4\x4c\x5e\xe7\xbb\x0e\xd5\x9a\xa4\xeb\x67\x81\x5d\xdb\x59\xbb\x4d\x77\xb7\x0b\xeb\xce\x65\x0d\xca\xbd\xdb\x68\x2a\xed\x6f\x41\xbb\xf3\x37\x62\x2d\x1b\xfc\x5b\x19\x39\xf2\xce\x97\x05\xfd\x22\xcc\x20\xab\xed\xc5\x93\xda\x49\x67\xee\x3c\x3f\x5c\xa8\x61\x8d\x15\x9b\x60\x92\x8f\x81\x71\xdb\x8d\xce\xac\x59\x86\x14\xf2\xc0\x3d\x1e\x18\x39\xb1\xe7\xb0\x5c\x59\xd6\x52\x71\x52\xba\xbd\x6a\x13\x55\xf4\x6a\x32\x5c\x7b\xfb\x20\x1e\x4d\xd3\xe7\x95\xd7\x62\xa0\xd2\x8f\xf6\xcb\x5e\xff\xa8\xdb\x62\x30\xc5\x66\x3c\xe2\x62\x96\x89\xa9\x97\xf5\x4e\x21\x04\x2c\xa2\x59\x8e\xf0\x34\xcc\x51\x82\x78\x8a\x82\x88\x47\x20\xc7\x7c\x4c\x62\x9e\xcd\x59\x9a\x8d\x29\x48\x78\x0e\xf0\x38\x85\x5f\x7b\x25\x3c\x4f\x7b\x92\xa5\x54\xc6\xd3\x31\x9b\x65\x08\x92\x84\xa5\x58\x86\x10\x88\x69\x92\x31\x29\x4a\x28\xc0\x66\x54\xce\x52\x0c\x47\x12\x9e\x66\xf2\x18\xe4\x3c\x06\x39\x4c\x52\x16\x53\x14\x43\xbf\xf6\x5b\x40\xef\xb2\x5f\xf8\x5b\xf6\x0b\x9c\x14\xb9\xd5\x17\x79\x53\xae\x3b\x87\xab\x20\x5b\x11\x06\xe4\x9b\xcd\xce\x5d\x65\xc1\xb6\x4e\xe3\xc5\x9a\x3f\x0f\xde\x62\xe3\xce\x42\xe1\x19\x5b\x53\xb3\xef\xe7\xd1\x29\xec\xc3\xe3\x74\x70\xa2\xce\xbc\x6b\x9e\xa0\x19\x72\x60\xeb\x2b\xd7\x59\x5d\xf7\x79\x22\xbc\x6b\x53\x97\xbf\x83\xbc\xac\xc3\xc2\x0b\x7d\x35\xaf\x36\xf3\x7d\x8a\xd4\xfb\x7a\x7f\x64\xbb\x3d\x71\x11\xd8\xb9\x8f\xcd\xc3\x3e\xc7\x7d\xe1\x2f\x83\x51\xbe\x0d\xd3\xa6\x8e\x93\xcc\x59\x0c\x45\x44\x10\xd4\x87\x83\xd2\x4b\x89\xc3\x17\x81\x3d\xba\x07\xd6\x64\xd2\x9b\xcd\x45\x93\xe8\x5e\x5e\xad\xec\x8f\xf6\xcb\x0e\x7f\xd4\x3d\x06\x09\xe2\x49\x4c\x91\x84\xce\x09\x0b\xf8\x3c\x05\x29\x9f\xe5\x20\xe5\x31\x9b\xa4\x3c\x8f\xe9\x9c\x64\x6c\x9e\x71\x19\x60\x30\x49\x09\x86\x1c\x41\x4c\x0a\x73\x8e\x67\x71\x46\x33\xec\xd7\xb2\x19\xbf\x01\xed\xe3\x1c\xd2\x98\x63\x41\x86\x53\x0e\xbd\xb8\xbb\x2c\x4c\x08\x01\x84\xa3\x28\x1e\xd2\x20\x66\x13\x8a\xca\xd3\xd7\x62\x74\x39\x93\x26\x5c\x4a\xa7\x19\xc1\x3c\x47\x11\x8a\xe2\x72\xf4\xea\x18\xbc\xcb\x7e\xe1\x6f\xd9\x2f\x28\x0e\x8d\x71\x69\x5a\xd1\x8f\xa6\xc7\xaa\x56\x5b\xd6\xdd\x52\xc3\x4a\x90\x77\x7b\x13\x9e\xc6\x6b\xc0\x97\x71\xb1\xbd\x14\x97\x5c\xa6\x15\x9f\xa5\xb7\x4c\xab\x68\xf4\xf1\x72\x43\x46\xbc\xd4\xf7\x85\x26\x5d\xd6\x93\xe7\xa0\xe8\xd2\xe8\xe5\x80\x5b\x7c\x11\x30\xfd\xb6\x93\xeb\x7d\x61\x62\xce\xb6\xb0\xb4\x39\x36\xed\x1c\x5c\xa7\x26\x8e\xcf\x27\x31\xee\xdc\xc7\x29\x56\x84\xe3\x8e\x76\x3d\x0f\xcb\x96\xb8\x2f\x97\xb6\x5e\xdd\xac\x43\x59\xd1\x5c\xa9\xcd\x42\x88\x71\xc5\x0a\x92\xa7\x5c\xe3\x49\xe6\x6e\x87\xfa\x76\x30\x8f\xe2\x83\x90\x50\x2e\xa4\xad\xf7\x4a\x59\x6e\x83\x02\xe7\x12\x6c\x8e\xeb\x9f\x4f\x25\x52\x36\xfc\xb9\x4d\xe8\xb7\xd3\xff\x51\x28\x8b\xe8\x84\xa1\x39\x92\x40\x06\x43\x9a\x05\x59\x12\x43\x1e\x71\x7c\xc6\x10\xcc\xa7\x74\x4a\x21\x42\xd8\x94\xcd\x28\x2e\xa5\x79\x48\xd3\x09\x93\xe4\x38\xe3\x13\x2e\xe7\xe3\x98\xc6\xaf\xfd\xe1\x7e\x13\xda\x83\x04\x11\x0a\xd3\x09\x21\x38\xcb\x10\x93\x22\x3a\x41\x6c\x9c\xe7\x00\x24\x71\xce\x61\x9a\x89\x19\x8a\xe7\x01\x93\x93\x84\x83\x14\xa0\x73\x92\x60\x9a\x05\x14\xa2\x31\xe0\x59\xf8\xea\x18\xbc\xcb\x7e\xe1\x6f\xd9\x2f\xbc\x23\xad\xdd\xe7\x4c\x75\xe6\xcc\x15\xbc\xdf\x0f\x31\x77\x3a\xe8\x0b\xfa\x06\x36\xab\x03\xb6\x53\xc4\xa8\xd3\xb2\x0a\x72\xd7\xbf\xb0\xb1\x1c\x40\x73\x9b\x04\xce\xb9\x76\xae\xc2\x7d\x13\x45\xab\x46\x0e\x62\x5f\x30\x79\xed\xe4\xaf\x1b\xcb\x4f\xf4\x36\x16\xbc\xfb\xdb\x16\xef\xfc\x9d\x2f\xeb\x6c\x0a\x94\x76\x48\x6e\xf1\x75\x3c\x40\xd8\xa2\x2e\x89\x0f\x31\x5e\x88\x72\xa6\xa7\xdc\x36\xf1\x94\x83\x98\x8e\x8e\xe2\x6d\xb9\xce\x2b\xd2\x04\x9f\xe1\xfe\xa0\x68\x54\x7c\xe3\xaa\xf1\x56\xce\x41\x23\x45\xab\x9c\x45\x96\xa4\x2f\x86\x39\x2c\x9c\xc3\x3a\xd8\x0a\xaf\x45\x35\x7e\x40\x59\xf4\xb5\x9a\xc2\x1f\x8f\xb2\x54\x96\x72\x2c\x4d\x91\x94\x45\x3c\xc1\x34\x97\x21\x86\xe2\x60\xc2\xf2\x34\xc5\xd0\x0c\x4c\x18\x96\xe3\x13\x92\xb2\x18\x01\x1c\x63\x40\x31\x5c\xc2\x43\x06\x13\x92\x50\x71\x4a\xe2\x57\xe9\xf4\x5b\xd0\x1e\x62\x96\x20\x02\x99\x14\x64\x71\x0e\x20\xcc\x33\xc2\x70\x80\xe6\x53\x8a\xa2\x19\x3e\xcd\xf3\xd7\xbe\x77\x2f\x1a\x0d\xa3\x98\xe3\x12\x04\x31\x61\xf3\x38\xe3\x11\x61\xb8\xec\x95\xf6\xe8\x5d\xf6\x0b\x7f\xcb\x7e\x51\x1a\xad\xd9\x3d\x9d\xce\xe1\x30\x1e\x1b\xe3\xec\x33\xcc\x94\x8a\x36\xd3\x27\xce\x51\xac\x67\x8d\xbe\x41\x90\x1c\x99\x6b\x99\x07\xc4\x77\xd5\x85\x5a\x05\xb4\xd3\xa4\x0b\x38\xd2\x27\x31\x8d\x38\xb4\x37\xdd\xac\x85\x8b\xd4\x6b\x11\x13\xba\x2b\xd9\x5e\x6c\xdf\x45\x0c\xf2\x77\xbe\x6c\xbf\xb3\x4d\x71\xa1\x96\x78\x6b\xd0\x62\x76\x12\x16\xe7\x66\x66\xe4\x8c\x1c\x76\x42\x14\x62\xfb\x7c\xd7\xd3\xf1\x4e\x2c\xe5\xb4\x12\x60\x52\x23\x7a\x1a\xba\xbb\xb5\x84\x4d\x51\x9e\x05\xc1\x3f\x6f\x97\x95\x88\x58\x9e\xa7\xae\xc6\x20\xe7\xa7\xc5\xd0\xd8\xc1\xe6\xf5\x09\x5e\x59\xf9\x01\x65\xf9\xe6\xf5\xe8\x8f\x47\xd9\x84\x4e\x71\x86\xe9\x98\x24\x31\x87\xa9\x84\x66\x41\x42\x01\x90\x42\x3a\xce\x48\x02\x58\x96\x46\x84\x85\x14\xa6\x78\xc0\xb1\x08\xc7\x74\xc2\xa7\x6c\x92\x32\x74\x9c\xc4\x1c\xcc\xa8\xd7\x98\xea\x6f\x41\x7b\x90\xc4\x59\x1c\x63\x02\x69\x1e\x53\x39\xe0\x5e\x2c\x33\xcf\x64\x10\xa4\x14\x8e\x53\x92\xe4\x79\x9a\xbf\x56\x97\x4b\x01\x60\x08\x4b\xd1\xe9\x8b\xd7\xc1\x65\x84\x49\x49\x9e\xbf\x7e\x0f\xe6\x5d\xf6\x0b\x7f\xcb\x7e\x4d\xd0\x08\x1d\xac\xed\x48\x1a\xd2\xaa\x24\x0f\x17\x45\x55\xbd\x21\xa8\x12\xac\x65\x12\x39\x1b\x6a\xc5\x6c\x0e\xb8\x93\x7a\xb6\xaf\xa8\xc4\xeb\xc5\x64\x97\xc9\xb6\xda\x96\x8b\x3b\x93\x73\x69\x03\x87\xc5\xc9\x8c\xf2\x47\x57\xea\xda\x92\x4d\x66\xb1\x71\x69\xeb\xcd\xca\xbe\xdf\x4e\x45\xc0\xc3\xda\x07\x3e\x68\xf3\x79\xde\xad\xf6\x19\x55\x16\xca\x25\x58\x64\xf5\xc2\x62\x28\xb8\xdf\x94\xfd\xf5\x60\xae\x4d\xca\xb3\x8a\xae\x8b\x2f\x0b\x2b\x4a\xb7\xeb\x2d\x0e\x9a\xcc\xea\x45\xf6\xd1\x2d\x39\x1e\x18\xe9\x54\x1d\x4e\x42\xca\xba\xf6\x86\x49\xf1\x52\x7e\xa5\xac\xf1\x03\xca\x2e\xbf\x72\xf2\x1f\x50\x76\xcd\x82\x6b\x7e\xd4\x0e\xf2\xfd\xb8\xa0\x2f\x07\xcf\x14\x48\xcf\x2e\x97\xdb\xac\xd2\x2d\xa3\x61\x0a\xdd\xae\xbd\x23\x39\xd8\xcb\xe9\x87\x35\xec\x3f\xfd\xf5\x8b\xeb\x18\x30\x10\x41\x86\xca\x61\x4e\x62\x2a\x66\x63\x86\xe1\xb3\x17\x8b\xc6\xf2\x0c\x01\x1c\x20\x1c\xcf\xf1\x14\xcf\x20\xc4\x01\xf8\xba\x07\x9b\xa2\xa8\x1c\xb3\x71\x12\x67\x29\xc5\xbd\xee\x0f\xf8\x2d\x68\xcf\xd1\x79\xcc\xe3\x98\x40\x94\x27\x34\xc7\x33\x39\xe6\x38\x88\x73\x8a\xa1\xb2\x9c\xa4\x88\x20\x9a\x27\x59\x96\x67\x09\x83\xf3\x84\xc5\x80\xa5\x40\x8a\x62\x06\x63\x82\x51\xcc\xbe\xee\xe4\x62\xde\x65\xbf\xf0\xb7\xec\x17\xd6\x75\x7a\xee\xba\xab\x2e\xcd\x61\x27\x54\xd3\xdc\x91\xfe\x14\xee\x99\xa3\x38\xd5\x6d\xa4\xb7\xc9\x59\xbb\xa9\x5a\x77\x95\xa9\xcd\x00\x6e\x2b\x4f\xef\xd7\x77\x4b\xcf\x7c\x49\x5f\x16\x3d\x95\xc2\xfd\x92\x38\xeb\x6b\x1c\xb8\x44\x59\xa0\xe3\x1d\x14\xc3\x62\xac\xdf\x51\xf6\x9d\x2f\xab\xf1\xe6\x8d\xb4\xdc\xda\xb6\xc4\x7e\xf4\x0e\xf3\x1c\x77\x71\x1e\x3a\x0f\x7d\xdd\x5c\xa7\xf2\x10\x0c\xa9\x7b\xbc\x9c\x3c\x3b\x5d\xd8\xe2\xe2\x42\xc6\xcd\xb6\x0f\x9b\x9c\x18\x9b\xa5\xe8\xc0\xc5\x6c\x3b\x11\xce\x96\x89\xbf\x1c\xce\xab\xc2\x54\x2e\x87\xfc\xbc\x3b\xbd\xee\xe4\x92\xad\xef\x29\xbb\x15\x86\xd7\xa3\x3f\x1e\x65\x93\x0c\x27\x08\xf0\x59\x92\x71\x39\x47\xf2\x8c\x4e\x18\x96\x64\x98\x02\x49\x4e\x73\x2f\xfa\x1e\x42\x9a\x21\x20\xa7\x10\x00\x59\xc2\x30\x3c\xcf\x20\x2e\x45\x14\x4a\x09\x61\x29\x96\xfd\xb9\xd0\xe6\xd3\xb4\xcf\xf8\x94\x90\x18\x51\x0c\x01\x69\x96\x53\x0c\xe6\x63\xfa\xc5\x7d\x48\x31\x22\x84\x64\x2c\x41\x38\xc3\x30\x21\x3c\x4f\xb3\x28\x61\x29\x8e\xc9\xd8\x2c\xe6\x68\x9a\x8a\x53\x40\x5e\xbb\xe0\x32\xef\xb2\x5f\xf8\x5b\xf6\x8b\x11\x3d\x87\x96\x1f\xcb\xab\x74\xba\xf8\x67\x62\xe8\xb1\x8f\x5a\xb3\x3d\xad\x24\xdf\x35\x0c\x76\x4e\x53\x41\x86\x71\xd7\xa5\x92\xfd\x20\xaa\x12\x83\x23\x3b\x68\x1a\x57\x24\xd6\x92\xb6\x5c\x2e\x16\xc4\x70\xb9\x9d\x47\x9b\x8f\x1e\xa0\xe7\x4f\xb3\x76\x36\xfd\xf6\xad\x55\x5d\xf1\xbe\x8e\x81\xda\x53\xe3\x2d\xab\x47\x40\x68\x14\x99\xd1\x26\x5c\x56\xe7\x5a\xa6\x8c\x42\xe3\x4f\x0b\xbe\xa4\x38\x2d\xa9\xcf\x51\xcf\x2b\x8f\xe8\x31\x5e\x84\x43\xf5\xc8\xc5\xc3\xa9\xe4\xf9\xb3\xee\x8d\x38\x60\x74\xfa\x71\xbb\xd4\xc1\x0e\x48\x2a\x3d\x5c\x45\x65\x3d\x8d\xd2\x2b\x65\x9d\x1f\x50\x56\x72\x5f\x8f\xfe\x78\x94\x45\x1c\x8b\x98\x38\xe3\x10\xa4\x08\xc3\x33\x80\x61\x60\xfa\x72\x4b\x66\xf9\x98\xc1\x34\x9d\xc4\x29\x0f\x11\x4b\xbf\xd6\xdd\xa4\x20\x95\xb0\x54\x42\xb1\x20\x47\x1c\x03\x13\x36\xa1\xbf\x56\x3e\xfc\x0d\x68\x0f\x63\x08\xb3\x34\x21\x31\xce\x63\x36\x83\x0c\x4f\x12\x48\x61\x36\x8e\x01\x89\xf9\x38\xa1\xe8\x94\x49\x13\x1e\xe7\x39\x46\x29\x8f\x31\xa1\x98\x8c\xe5\x53\x26\x4f\x01\x95\xa4\x34\xc6\x2f\x94\x7d\x97\xfd\xc2\x6f\x95\x0f\x69\xec\x5c\x00\x7f\x44\x98\xd7\xe8\x64\x48\xa5\xdb\x5c\x2c\xdc\x87\xe5\xa3\x9b\x28\x99\x89\x1f\x35\xfb\xa3\x22\x5a\xf8\x24\x9e\xe4\x9b\x5b\x41\x34\x32\x6e\xa1\x08\x72\x95\x5c\x52\x1b\xa5\x8c\x2d\x26\xa6\xc1\xe8\x6a\x30\xd3\xc3\x83\xb6\xc5\x69\xc6\x86\xf5\x56\x78\xbe\x78\xe7\xcb\x86\x1c\x15\xf7\x73\xab\xfb\x46\x86\xa9\xb9\xe6\x19\xb3\xec\xdd\x4d\x5d\xc1\x71\x17\x96\xc5\xaa\xbb\x59\x97\x07\xeb\x10\xc8\x4c\x0e\x6b\xf1\xf7\xc5\x65\x79\x19\x36\x11\xfb\x10\xc1\xb5\x62\x2f\xd7\x49\x57\xef\x4c\xbe\xcc\xac\x06\x22\x95\xbe\xcc\xf9\x54\xdc\xbe\xee\xd7\x92\xf7\x3f\xa0\xac\x4c\xbf\x1e\xfd\xf1\x28\x9b\x70\x3c\x95\xe6\x19\x86\x80\xa5\x38\x18\x67\xaf\xe6\x8d\xa1\x59\x96\x07\x34\xc8\x19\x1a\x60\x98\x52\x1c\x45\x40\xc2\xe2\x18\xb2\x2c\x22\x09\x4e\x93\x34\xe1\x73\x1a\x63\x1a\xbd\x6e\x69\xf9\x4d\x68\xcf\x43\x3e\x03\x29\x26\x54\xc2\x10\x92\x02\x0c\x71\x46\x11\x3e\xe1\x78\x18\xa3\x9c\xa2\x69\x3a\x25\x14\xc7\xf1\x29\x17\x43\xc4\x42\x0a\x24\x29\xfd\xf2\x2b\x83\x31\x0f\xb9\x94\x79\xa1\xec\xbb\xec\x17\xf7\x96\xfd\x2a\xeb\x60\x28\x65\xb9\x69\x76\xbe\xf7\x08\x9a\xe0\xd4\xa4\xee\xd8\xd7\x54\x98\xe8\xab\x49\x96\x80\x34\x85\xb7\x9d\x6a\x83\x7e\x9f\x09\x8f\xcb\x29\x42\xfe\xa9\x5a\x09\x9a\x51\x9e\x69\x89\x93\x58\xe6\x2e\xd4\xa7\x41\x4c\xa5\x5a\x3d\xe8\xf2\x54\x7b\xdb\x36\x7c\xe7\x18\x94\xef\x20\xcf\x0f\x7e\xbe\xdd\xf1\x47\xf1\x5a\x7a\xf9\x03\x99\xd5\x2d\x0c\xb7\x7c\x32\x9c\xc7\xc5\x75\xca\x97\xd7\x8b\x1f\x9a\x58\x2f\x12\xc1\x02\x8c\x9d\x99\x3a\x32\x0f\xe3\x74\xde\xf0\xf2\x65\x5c\xd9\x35\x27\x2a\x29\x32\xaa\xb4\x3a\xba\x47\xa1\x9b\xc2\x2a\xf5\x61\x8d\xe6\x57\x2b\x1b\xfe\x80\xb2\xda\xeb\x03\x0b\x7f\x40\xca\xf2\x39\x61\x39\x0e\xd3\x28\x89\x11\x0b\x92\xe4\x45\x06\x25\x0c\x00\x31\xe0\x72\x04\x19\x16\x73\x69\x0a\xe3\x0c\x72\x30\x4b\x51\x9c\x67\x3c\x1d\x73\x29\x4d\x13\xc8\xc4\x30\xc3\xf0\xe7\xfd\xb2\xcf\xd3\x3e\xe1\x61\xce\x66\x3c\xcf\xf3\x28\x8f\x29\x2e\xcd\xa9\x94\xe3\x08\x4d\xd1\x2c\x47\xf3\x14\xc3\xa6\x19\xcf\x62\x94\xd2\x34\x87\x93\x94\x23\x88\x4d\x72\x16\x73\x31\x8c\x11\xfd\xe2\x47\x24\x2f\x94\x7d\x97\xfd\xe2\xbe\x65\xbf\x70\xe5\x3c\xf8\xf4\x1e\x1a\xf6\xe0\x33\xad\xaf\x9e\xea\xd2\xa4\x95\xf3\x56\x28\xec\x35\x20\xc7\xa8\x66\xe1\x9d\x1b\x73\x15\xaa\x82\xa6\x10\x4d\xe1\x45\x38\x34\xb8\xe5\xa5\x7c\x3d\x6c\x7d\x0b\xc9\x24\x48\xf6\xf9\x52\x6c\x21\x9f\xca\xba\xd7\x29\x46\x7c\x4e\xdf\xac\x6c\xf9\xce\x97\xd5\xed\x91\x12\xdd\x05\x60\x3c\xf9\x9e\x86\x38\x4b\x37\xbb\xbb\x9f\xd6\xf4\xf9\x1e\x89\x52\x2d\x88\x6a\x74\x98\x8e\x75\x95\x32\x60\xc7\x6c\x01\x88\x4e\xfb\x45\x71\xdc\xca\xc6\xb1\x14\x82\x22\x12\x83\x47\x14\x51\x93\x5b\xe2\xbb\xed\x76\xfc\xb9\x3a\x5e\x44\x38\xbd\x76\x6f\x94\xd3\x1f\x50\xd6\xf8\x7a\xb5\xfc\xf1\x28\x8b\x10\x8f\x60\x1c\xa7\x2c\x95\x63\x88\x39\x00\xd2\x24\xe1\x48\x46\xf1\x59\x9c\xc1\x38\xcd\x73\x96\xca\x79\x8e\xa6\xb3\x84\x4f\x53\x86\x25\x39\x01\x79\xc6\x52\x1c\x20\x19\xa6\xf3\xe4\x95\x6e\xbf\x05\xed\x41\x8c\x20\xf7\x62\x7d\x79\x42\x67\x3c\xcd\xb2\x79\x82\x12\x8e\x8d\x69\x9e\x25\x2c\x4b\x67\x31\x45\xa7\x14\xc5\xc6\x2c\x8d\xf9\x24\x67\x32\x0a\xf1\x31\x66\x98\x9c\x00\x92\x22\x4c\xe2\x17\xca\xbe\xcb\x7e\x71\xdf\xb2\x5f\xcc\xf2\x54\xe9\xaa\x79\xd1\xd6\x78\xcd\x02\xda\xb8\xae\xb7\x0e\x1d\xa1\x87\xdc\x79\x05\x3f\xaf\x97\x91\xd6\x4e\x2e\xa2\x5b\x3e\xa5\x85\xbc\x1b\x15\xda\xd8\xa4\x9b\x45\xec\xde\x6a\xa1\xb1\xb6\x29\x00\x99\x57\x14\x45\x95\xb3\x53\xd3\x5a\x83\x83\xf0\x71\x75\x75\xdf\x9e\xb0\x2d\xdf\xf9\xb2\x63\x76\x33\xd6\x49\xa6\x3a\x36\x9b\x9e\xaf\x62\x93\x0b\x0e\x75\x9d\xaa\x1b\xe7\x2d\x93\x76\x5a\x06\x5b\xcf\x10\x36\xed\x52\x71\x5d\xe5\xea\x20\x69\x8a\x89\x1e\xa9\xa7\x05\x35\x6a\x6d\x94\x9c\xc2\xac\x15\x27\x21\x3e\xa9\xcc\x8d\xa6\x94\xd3\xd9\xcf\xd1\x38\xeb\xec\xcb\xf8\x72\xf1\x03\xca\xae\xd5\xd7\xa3\x3f\x20\x65\x5f\x6c\x5b\x1c\x73\x39\x95\x82\x98\x4a\x12\xcc\x02\x40\x43\x40\x43\x1a\x24\x14\x42\x3c\x06\x14\xa1\x10\x4e\xd2\x14\xe1\x98\xcb\x10\x26\x90\xe3\x18\x16\xd0\x90\x67\x33\x02\xc1\xd7\x6d\x31\xcf\xd3\x1e\xc0\x9c\x65\x72\x9a\xca\xb3\x04\x26\x4c\x4e\xb3\x31\x43\xe8\x9c\x86\x09\x83\x08\x0d\x78\x48\xf3\x09\x05\x32\x00\x58\xc2\xd0\x54\xc2\xa5\x71\x9c\x30\x98\x50\x31\xc8\x62\x84\x70\xfe\x1a\xe4\x7a\x97\xfd\xe2\xbe\x65\xbf\xa8\xdd\xde\xbe\xce\x05\xff\x20\x92\x69\x8e\x36\xb5\x02\x83\xdd\x2f\x81\xcc\x14\x2e\x60\x1e\x6a\x72\x43\x37\xba\x28\x46\x7a\x5e\x4c\xbb\x48\x19\x89\xef\x5c\xfc\x2e\x3b\xa0\x76\xb1\xb6\x46\x96\x89\x58\xe1\xba\x55\x9c\x02\x96\x72\x61\x69\x07\xff\x11\x64\x79\x81\xde\x59\xd9\x77\xbe\x2c\x8d\x7a\xd5\x70\xc7\x63\x30\x15\xfc\xfa\x12\xc0\x39\xdd\x7a\xa2\xa0\x91\x51\x64\xa5\xfe\xbc\xb3\xbc\xcb\x96\xdb\x1d\x77\x7d\xc6\xb7\x47\xbe\xe1\x9c\x65\x62\xd3\x5c\x70\x21\xfa\x6c\xd3\x5e\xb9\xf6\xb4\x44\x18\x8c\x13\xe3\x4a\xe8\x7e\x1d\x0e\x68\x6d\xc6\xae\xbe\x7c\x75\x0c\xea\x1f\x50\xd6\xbc\xbc\x1e\xfd\xf1\x28\x4b\x91\x17\x93\x06\x32\x96\x4e\x12\x9c\x00\x2e\x8f\x73\x06\x33\x09\x1f\x43\x86\x62\x30\x9b\xa7\x88\xca\x69\x96\x40\x0e\xd0\x18\x43\x9a\xe2\x59\x04\x79\x94\x24\x00\x64\x84\x65\xb8\xd7\x36\x73\xbf\x05\xed\xf3\x94\xa7\x33\x86\xa7\xe1\xd7\x6a\x30\x38\x4e\x00\x82\x3c\xc4\x88\xe7\x30\x7e\x6d\x7d\x07\x40\x0e\x28\x9a\xc7\x84\xc9\xa8\x38\x01\x7c\x92\x11\x36\x46\x79\x86\x19\x8a\x7e\x8d\xed\x32\xef\xb2\x5f\xdc\xb7\xec\x17\xc5\x0f\xa7\xeb\x71\x9a\xae\x12\xce\x2a\xc3\x33\x3c\xa5\x13\x95\xe6\x2e\x17\x2e\x7e\x28\xa4\xa5\x75\x84\xca\xc0\xf0\x9a\x01\xdd\x99\x26\x8e\xc9\x1c\x55\x50\x24\xed\x2a\x11\xc3\xb5\xa2\xfb\x6e\x7c\x70\xc4\x47\xf4\x38\xc8\xc7\xae\x7a\x9c\xc4\x28\xd6\x00\x17\xbc\x55\x3e\xac\xde\x41\xae\x59\xb9\x23\xaa\xcb\xf0\x1a\x92\x4c\xd9\x6f\xce\xce\x58\x35\x8f\xb1\x7e\x98\xab\x2d\xf1\x3b\x97\x37\xd8\x2b\x4c\xe2\x8d\xc6\xc1\x33\x57\x67\x81\xbb\xbd\xba\x79\xc6\xf6\xb5\xed\x65\xab\x12\x16\x13\x2d\x99\x77\x21\xca\x1b\x6a\xdd\x5f\x6e\x24\xae\x97\x87\xbd\xd8\xbd\x0c\x2c\xb7\x3f\xa0\xec\xe6\xeb\xe3\x3c\x7f\x3c\xca\x72\x0c\xc1\x80\x65\x51\x9a\xd1\x1c\x64\x00\x60\x01\xc7\xb2\x39\xc5\x40\x86\x41\x14\x0d\x59\x90\xc4\x5c\x4a\x62\x36\x06\x39\xc2\x04\x60\x9a\x45\x98\x8e\x13\x8e\xca\x70\xcc\x01\xea\x75\x17\xd6\x6f\x41\x7b\x92\xd1\x59\xce\xe5\x3c\x93\xa7\x14\x97\x30\x2c\x87\x78\x82\x30\xcb\x01\x3e\xa7\x28\x2a\xe6\x68\x08\x00\x4d\x50\x9c\x41\xcc\xc1\x84\x8f\x49\x46\x48\x8c\x78\xc0\x26\x74\xfa\x72\xde\x17\xca\xbe\xcb\x7e\x71\xdf\xb2\x5f\x13\xeb\x46\x15\x5d\x8e\xb0\x6f\x17\x37\x9f\x1e\xe3\x8d\xe3\x83\xa5\x22\xcf\xc9\xb1\x28\xb3\x87\xb2\x8a\xe4\xc6\xec\x2b\x78\x0a\xcc\x85\x21\x9d\xa1\x68\x3a\x07\xb7\xc7\x79\x83\xfa\x2a\x50\x25\xd0\x64\x32\x59\x60\x3a\xcb\xa3\x85\x3d\xb0\xbb\xc7\xe8\xae\x93\x9f\xfb\x1a\xbe\x52\xf6\x9d\x2f\xdb\x6c\xac\x49\x94\xf7\xca\x75\xa8\x14\xef\xb4\x5f\xc4\x63\x53\x5b\x9d\x3c\xfa\x83\x98\xe7\x26\xd7\xfb\xe4\x7a\xa2\xe6\xd3\xe2\xae\x3e\x06\x3d\x3f\x32\x07\x4e\x32\xfd\x76\x47\x5c\x50\x5c\x38\x41\x6a\x95\xbb\x41\x76\xc3\x06\xd9\x4c\x37\xe0\xeb\x6e\x17\xcf\x73\xf9\xda\x91\x46\xee\x7f\x40\x59\x7b\x7e\x3d\xfa\xe3\x51\x36\x4f\x39\x04\x33\x40\x23\x98\x62\x36\xc9\x00\x4f\x12\x98\xd0\x79\x9e\x65\x29\xcc\x10\x97\xb1\x54\x8a\x63\x3a\x4b\xf3\x98\x86\x71\xf6\x5a\x29\x2e\x8b\x29\x88\x29\x1e\xe4\x34\xc8\xbe\x76\x57\xfc\x0d\x68\x9f\xa5\x1c\x93\xbc\x30\x9a\xd0\x98\xc7\x30\x27\x69\x9e\xe4\x71\xf6\x5a\x40\x31\x21\x88\x65\x41\xca\x70\x88\x4d\x00\xe1\x20\x97\xc4\xd4\x0b\x5d\x11\xcb\x67\x80\x65\x69\x16\x65\x2f\x56\x96\x7d\x97\xfd\xe2\xbe\x65\xbf\xd0\xe1\xbc\x3a\x79\x1b\x4d\xde\x57\x61\x1b\xdd\x44\xcf\xdf\x0b\x5e\xd8\x5d\x2d\xf6\xd4\xde\xdc\xc5\x6a\x8e\x74\xad\x2b\x36\xa4\x35\x0c\x86\xcb\xfd\x5b\xd3\x79\x65\x6a\xf6\x6e\x19\x2d\xad\xa0\xb4\xac\x7c\xb9\x0f\x3b\x60\x3f\x6a\xb7\xf6\xd6\x6a\x18\xc9\x9a\xc3\x90\xb7\x88\x41\xf5\xce\x97\x8d\x44\x70\xc0\x4d\x2a\x25\x18\x83\x66\x8b\x9d\x66\x30\xa6\x1c\x0b\xf9\x42\xd9\x55\xfd\xba\x6f\xd5\xcb\x9e\x4e\xc5\xe8\xb6\x4b\x71\x5a\x26\x2a\xdc\x96\xe4\xb0\x5d\x3c\xf0\x62\xe8\x57\x4c\xc2\x68\x61\x1f\x28\xf1\x9d\x95\x2b\x56\xaa\xeb\x3a\xce\x56\x27\xb5\x86\x2f\x03\xcb\xd3\x0f\x28\xeb\xfc\xd3\x6d\x31\xff\x87\x52\x16\xa3\x94\xcd\xf2\x0c\x72\x29\x9b\xa4\x28\xa1\xa9\x8c\x64\x59\xf2\xe2\x6c\x66\x4c\x4c\x23\x18\x73\x34\x66\x19\x1a\x40\xc2\x92\x84\x85\x00\x65\x39\xc9\xa9\x2c\xcd\x50\xcc\x30\xf9\xd7\xc6\xf4\xbf\x05\xed\x73\x2e\x26\x39\x4c\x31\x05\xe9\x2c\x8b\x5f\x0c\x30\xcb\x11\x98\x40\x2a\xcf\x30\x1b\xa7\x19\xc5\x53\x88\xe3\x18\x9a\xa1\x08\xcc\x18\x26\xce\xb2\x24\x49\x33\x4c\x12\x44\x40\x0a\x71\xfe\x42\xd9\x77\xd9\x2f\xee\x5b\xf6\x6b\x79\x57\xb6\x3b\x55\x9e\xc1\x6d\x77\xee\xec\x79\xc9\x43\x99\x36\xe8\x62\x66\xf5\x74\x51\xda\x43\x25\xd6\x59\x2b\xa7\x2b\x73\x36\x9d\xe9\x9c\xb4\x72\x74\xb7\x8b\xf4\x9e\x27\xa8\x26\xcc\x64\xc0\x5d\xdb\xfb\x11\x1b\x3a\xe3\x6c\x9c\x37\x60\xcf\x66\x62\x86\xf8\xf2\xcd\x97\xad\xde\xf9\xb2\x6d\xaf\x94\x37\xd7\x93\x6e\x71\x66\x2c\x57\x7c\xb7\xe0\x6a\x71\xd1\x84\x02\x6b\x5f\x4a\xef\xa8\xeb\x4b\xa6\x05\x8b\xaa\x6e\x0c\xb4\x45\xdd\x6d\xab\x0b\x33\x8c\xfb\x8a\x6e\x11\xb6\xb6\x34\xe8\x36\x92\xb3\x33\xf6\xbe\x7c\xa4\xfd\x2e\x1b\x39\x7a\x31\xd8\xa6\xfc\xba\x87\x41\xa6\x7e\x40\x59\xf7\x9f\x6e\x8b\xf9\xff\x23\x65\xff\xf4\xa7\xff\xfc\xcf\x3f\xfd\xe7\x7f\x7e\x91\xe3\x21\xfe\x92\xb7\xdd\x97\x4d\x7c\x22\x7f\xf9\xd2\xe6\x39\xe9\xfa\xff\xfe\xe2\xdd\x2f\xe4\x2f\x5f\x3c\x41\x34\x95\x2f\xb2\xe0\x09\xff\xfd\x65\x97\x96\xe4\x14\xff\xe5\xcb\x65\x4c\x9a\x2a\xfd\xef\x2f\xf6\x74\x26\xdd\x5f\xbe\xbc\x0c\xf2\xa7\xbf\xb9\x00\xbe\x0e\xf1\xc6\x7c\x4d\x38\x58\x2a\x82\x9e\x16\xe9\x01\x74\x36\xd0\x55\xec\xbd\x00\xf6\xcc\x36\x60\x44\x4f\x70\x0f\x9a\x16\xae\xe0\xca\x50\xf5\x00\x86\x1e\xeb\xb8\x6b\xd7\x84\xd2\x76\xbb\xff\x8f\x3f\x7f\xf9\x6b\x38\x4a\x10\xfe\xe7\x7f\xfe\xe3\xaf\xc7\xbe\xef\xb9\x3f\x4f\xc4\xec\xcd\x47\xfa\x88\xb6\x49\xaa\xe1\xca\xa5\x85\xf8\x42\xf3\x63\x79\x92\x36\x0f\x6d\x3a\xc7\x7b\x75\x9b\x90\xd5\xa2\x54\xf7\x3e\x56\xfe\xe7\xb5\xc7\xe2\x5f\x5f\xaf\x43\x83\x3f\x7f\xa1\xfe\x8b\xf9\xf3\x97\x97\xdf\xf8\x0f\x57\xf1\x77\x93\x10\x81\x63\x84\x1e\x30\x84\xbd\x6a\xb9\x87\xb5\xb9\x33\xcd\xad\xab\x48\x12\x6b\x4b\xb6\xb6\xb2\x04\x79\xb7\xf5\xdc\x35\xf6\xb4\x8d\x07\x76\xaa\x0b\x42\x2d\x90\x05\x57\xfe\x8f\x3f\x7f\x41\x3f\xf8\xe2\x99\xe3\x56\xa4\x16\x5a\xbf\x4e\xae\x87\x55\x0c\x67\xc3\x38\x9c\xa5\x34\x32\x05\xb9\x5e\xa4\x7e\x7e\x8a\x7a\x7e\x67\xea\x81\x1c\x28\x6f\x13\xff\x0a\x02\xfd\x37\x73\xf8\xfa\x43\xfd\xf9\x0b\x40\xff\x74\x06\xac\xb6\x81\xe6\x6a\x1f\xb0\xab\xd0\xc5\x8a\x6c\xaf\x10\xf6\x45\x1d\xcb\x88\xb1\xd0\x2a\xd0\x0f\xda\x9a\x35\xf5\x95\x2b\x28\x06\xb3\x12\x77\x1b\x20\x8b\x4e\x88\x9d\x17\xb7\xea\x07\x33\xc8\xb5\x64\x88\xe3\x80\x3b\x2b\x79\xad\x31\xdb\x2d\x2d\xe5\x68\x91\x45\xf3\xe6\x08\xad\xee\xfe\xb8\x54\x42\x65\x5f\xe4\xd5\x58\x96\xc5\xc7\x19\x7c\x58\x86\x6f\x3f\x80\xfd\xfd\xa6\xc0\xfe\x13\x26\xfd\xca\xe9\xfc\xc3\x29\xfc\x9d\x4b\xeb\x42\xfe\x95\x2b\xeb\xef\x0d\xf6\xf2\xd9\xbe\xbc\x8e\x64\x24\xbf\xe1\x98\xfd\x98\xfc\x56\xa3\x5d\xc7\xb6\x1b\x4f\xd5\x39\x6f\x7f\xab\x11\xfb\xf4\x52\x56\xfd\xd0\x76\xf7\xa7\xec\xd3\xdb\x30\xef\x6d\x14\xdc\x01\xdb\x91\xdd\x83\x2d\xad\x3c\x55\x11\x91\xbc\x59\x23\xcf\xc4\x20\xd2\x0d\x85\x8d\x0e\x9e\x11\xe1\xad\x1d\xb1\xc0\x40\xb2\x6a\xdb\x2b\x73\xb7\x17\xa4\xcd\xcb\xe5\xfd\xd7\xf8\xa3\x20\xa7\x83\x5d\xd8\x1b\x28\x79\xd6\x45\xe0\x34\xfa\xb0\xea\x96\xdd\x8a\x52\xf8\x13\x47\x45\x0b\x1e\xe4\xb1\x3b\x45\x07\x7b\x37\xfa\xef\x4c\xf1\x6b\x7c\xf1\xb5\x2b\xdf\xeb\x0d\x46\xa9\x98\x46\x21\x37\xda\xa5\xd3\xcb\x60\x5d\x57\x77\x9f\x63\xb7\xe6\x2d\x2a\xeb\x7d\xb3\x73\x6a\xde\x9f\x2e\xdb\x93\x06\x16\xd5\x98\x7c\x1d\x45\x4c\xf9\xfd\xfc\xf5\xd6\x54\x7c\xfb\x47\x7c\x1d\x74\xfa\xf6\xbb\x2c\x08\xbc\xf4\x7e\x3f\xfd\x64\x4e\xd7\x5d\x10\x15\x03\x75\x2e\xcc\x81\x7a\xd4\x27\x5b\xb8\x9c\x03\xb2\xd0\x76\x0b\x37\x71\x0f\xd6\x45\x26\x4d\xb0\xd9\x9e\x4e\x5f\x87\xb3\x0d\xc1\x71\xed\xf5\xa9\x78\x08\xc2\x49\x80\x62\xdd\x7b\x75\x8b\x36\xc5\x5e\x5f\x17\x27\x18\xec\xea\x88\xb5\x4e\xc6\x3a\xee\x74\x3e\x32\x4f\xe0\x70\x1b\x1f\x7b\x21\xe0\x76\x53\xf4\xa0\xe4\x59\x23\xcc\x5c\x87\x73\x57\x2c\x26\x12\x71\xab\x41\x84\x7a\x91\xee\x44\xe7\x7f\xfe\xe7\xa3\xef\xf4\x1b\x2f\x0d\x7c\x6a\x69\xac\xbf\x5d\x1a\x59\xd8\xd4\x91\xa0\x78\x7e\x75\xaf\xa8\x6a\x50\x89\x27\xdf\xf4\x8e\x9f\x5a\x1e\x26\x16\x32\x34\xbc\xed\xf3\x48\xf3\xb5\xd2\x88\xbe\xee\xd4\x79\x5d\x1a\xf7\xc3\xad\xf7\x57\x43\xef\x78\x46\x66\x79\x87\x95\x4a\xb9\xd6\x2d\x00\xb7\x81\x8c\x93\x54\xd8\x84\xaa\x74\x67\x80\xa7\x7a\x4d\x33\x32\x7f\xe9\x9d\x1e\xcb\xba\x42\x2c\xcf\xd8\x35\x77\x63\xd7\xdb\xbe\x95\xac\x8e\x0b\x91\x54\x8e\xc5\xcf\x4e\x4d\x98\xea\xa1\xa5\x00\xdf\xc2\xb4\x88\x25\xe1\x77\x87\x1e\x3d\x05\xbd\xf3\x01\x7a\xd1\x64\x32\x66\x59\xf8\x59\x5a\x6e\x63\xf7\xe1\x67\xf3\xd2\x4e\xf1\x5e\x2c\x96\x54\x0d\x90\x65\x1c\xf7\xb5\x9f\x92\x53\xe6\x51\x5f\xdd\xc4\x57\xe8\x77\xcf\x42\x6f\x2f\xdb\xfd\xcc\xf5\xee\xa5\x59\x8b\xea\x26\x1e\xce\xd1\x18\xdc\xb4\x30\x5d\xe7\x52\x72\xf4\x24\x9a\xb4\x67\x97\xeb\xd5\xe1\x96\xee\x83\xed\xb0\x5f\xb7\x3b\x92\x43\xa6\xb6\xee\x87\x8c\x1c\xb6\xb7\xf4\xda\xf9\xa9\xb6\xb3\xd7\xdd\xf2\xb4\xae\xa9\x23\x5f\xf4\x86\x29\xfc\xfe\xd0\x33\x4f\x41\xbf\xff\x00\xbd\x6c\x6e\xc1\xea\x18\xf7\x44\x97\x98\x1d\x87\x02\xd4\x7b\xd7\x50\xe3\x2d\x7c\xbc\x2a\x47\x26\x57\xba\xf0\xdc\x3c\x02\x80\xc6\xfb\xea\x8d\xf5\xde\xb3\xd0\x0b\x61\x82\xe0\xf1\x54\xd2\x86\x6c\x5c\xe5\x51\x07\x55\xee\xd5\x72\x71\x5b\x54\x9d\xe2\x94\x5d\x72\x2e\x85\x93\x9a\x36\xf7\xd6\x24\xca\xfe\x21\x7a\xe6\xba\x6e\x79\x4e\x3d\x9a\xaa\x4b\x8c\xa3\x83\x3b\x8f\xde\x97\x47\xaa\xbe\xc0\xe5\x6e\x19\xf9\x4e\x03\x74\x4f\x2c\x7e\x77\xe8\xd9\xa7\xa0\x0f\x3f\x1a\x1c\x68\xc2\xd1\x5b\x3a\x87\x50\x0c\xf3\x90\x5b\x5e\x2d\x5d\x2b\xa9\x32\xbd\x4b\x76\xa4\xf4\x67\x49\xb1\x29\x7c\xa7\xc5\x93\xb8\xbc\xbf\xb1\x7e\xff\x2c\xf4\xfb\xe8\xe0\xaf\xcf\xb9\x04\x57\x03\x35\x0f\xdb\x2c\xaa\x74\xa3\x3e\xef\x4a\xf6\x8a\x8e\xcb\xca\x92\x95\x2a\xc2\xd1\x43\xdc\xdd\xc5\xa5\x76\xe4\xd2\x89\xca\x16\x47\x25\xa2\x02\xdf\x5f\xed\x21\xbb\xcf\x97\xe2\x3c\x89\x2d\xd7\x1c\xea\x3b\xfd\xb0\x1e\x01\xea\xf9\x59\x98\x7e\x77\xe8\xf1\x53\xd0\xa7\x1f\xa0\x97\x06\x2f\xd4\xf2\xf2\x62\x6f\x8a\x69\xac\x37\x3c\xcf\x1d\x79\xdc\xa6\xdb\x34\x5a\x29\x86\x73\x3a\x16\xd2\x50\x01\x13\x16\x4c\x7c\x29\xbe\x41\xef\x3f\x0b\xbd\x6e\x91\x31\x3e\x26\xd1\x99\x2b\xaf\xc2\xb0\x97\xbb\x46\xb2\x68\x8d\x91\x6f\x7d\xa2\x4e\x8e\x5d\xc9\xe9\xf2\x44\xda\x9d\xd3\x8b\xf2\x00\x7b\x85\xad\x5b\x7b\xbd\xb7\xcc\x50\xba\xb0\xec\x9a\xce\x48\xcf\xcf\x17\x77\xd9\x9f\x8f\x28\xbb\x1c\xdc\xd6\x9f\xda\x49\xfe\x04\x5b\xcf\x3d\x05\x7d\xf1\xd1\xd6\x9f\x17\xe2\x9e\xe8\x85\x13\x97\x2a\xd9\x2a\xda\xbe\x21\x22\x7d\xbb\x1e\xcf\x0d\xae\x7b\x4e\x7f\x2c\xfa\x8a\xce\x59\x43\xb9\xc7\xf2\x9b\xc1\x09\x9e\x85\x5e\xcc\x89\x91\xf1\x13\x2e\xc5\xe2\xbe\x91\xcc\x52\x4a\xa4\xdb\x3a\x4a\xc8\x76\x99\xb4\x78\xad\x4f\xb9\x7a\xd2\x04\x98\x0b\x3d\x58\x98\xe7\xe1\x9e\xdb\x99\xd0\x9f\x8a\xe9\x86\x70\x34\xdb\x1b\xb4\x53\x89\x18\x75\xc1\x46\xae\x4f\xeb\x4b\xbf\x36\xb6\x53\x4a\x73\x9f\x60\x70\xf8\xa7\xa0\xaf\x3f\x1a\x9c\xa3\xdf\x32\x1e\x22\xd0\x5e\xfa\xc7\x75\xc1\x24\x88\x76\x49\x75\xb7\x3c\xf9\xa2\xd6\x81\x2e\x51\x78\xcf\xdd\x53\x51\x91\x00\xfb\x06\xfd\xe1\x59\xe8\xcd\x43\xc1\x66\xdd\xe0\x55\xf4\x32\xdc\x82\xb5\x36\x82\x48\x89\x15\x46\x9f\x91\xb5\x5c\x72\xb4\x74\x3c\x62\x75\xf9\x58\x5c\xb9\xa3\x38\x81\x6d\xc8\x70\x21\x3c\x31\x7e\x4f\x39\x62\x1d\x4c\x8c\x6a\x77\x9d\xe0\x2f\xb5\x30\x97\xfb\xf1\xb4\xc1\x82\xa5\xb4\x61\xff\x09\xb7\x59\x9a\x7a\x0a\xfb\xf6\xa3\xc5\x39\xd3\xde\xf9\xa2\xae\xcb\x59\x2f\x4f\x4d\x96\x9d\x1e\x0b\xc9\xbf\xa7\xd1\x3e\x75\x57\xfb\xbd\xef\xb5\xa3\xd1\xd1\x4b\x11\xf5\x43\xf5\x86\xfd\xc7\xc7\x62\x7f\x35\xf6\x78\xb3\x24\xcc\x71\x85\xc4\x9a\xb3\xa8\x3b\xbb\x3e\x08\x94\xc1\x75\x52\x5f\x39\xad\x78\xf4\xb9\x6d\x71\x5f\x76\xa8\x74\xae\x77\x46\xc4\xf9\xd2\xbe\x62\x6a\x0d\xdc\x73\x80\x2f\x32\x6f\x5f\x12\x4d\xb3\x7d\xb4\x0c\x0f\xad\xe1\xaa\xc5\x39\xb9\xf3\x45\x56\x08\xaa\xf4\xfb\x1b\x7b\x9a\x7e\x0a\xfb\xfe\x03\xf6\xf2\xad\x9f\x0e\xcd\x6d\x5f\xb2\x66\x6e\xa5\x07\xca\x91\xe2\x69\xd8\x3e\xaa\xc3\x50\xf6\xa2\x6b\xe4\xcb\xfe\xb0\x94\xd7\x91\xd6\xc1\xaf\x09\x97\x57\xec\xa3\x67\xb1\x1f\xbc\x23\x06\x7e\x79\x64\x94\xf4\x7a\x37\xf5\xe3\xe5\x6a\x91\xb3\xe5\xc2\x43\x63\x5c\xc6\x34\x70\xfd\xbd\xa3\xc6\x70\xa3\x57\xa3\xe4\x07\x47\x6b\x49\xc9\x42\x01\x06\x65\x9d\x1e\x6f\x5e\xe6\x1f\x57\xab\x87\xdb\xbb\x10\x77\x1e\x27\x87\x8c\x61\xa2\x73\xc3\x29\xc2\xef\x2f\xaa\xe8\xe7\x04\xef\xf4\xd1\xe6\xf8\x46\xbe\xba\x1b\x02\x8f\xaa\xc4\x11\x2f\xac\xd6\x31\x64\x50\x07\x4e\x5d\x46\x65\x0c\xe3\x2a\xd9\xf0\x52\x3a\xaf\xd3\xf9\xda\xbc\x39\x39\xf1\xb3\xd8\xb3\x94\x08\xb4\x43\xe7\x98\x93\xad\xec\x47\x66\x93\x9f\xf9\x9a\xe4\xe3\x6d\x45\x6e\xe9\x1e\x38\xe2\x32\x94\xc5\x1e\xaf\x57\x65\xb5\xae\x49\x56\xeb\x8f\x20\xba\xea\x83\x9a\xce\xf5\x48\xdf\x33\x83\x3e\x46\x8a\x26\xec\x55\x3d\x21\x30\x65\xf8\x6c\xb0\xb4\xd9\xfb\x84\x3b\x2d\xfd\x9c\xa2\xa5\xbe\xc3\x7e\xc1\x43\x1b\x6a\x43\x91\x2e\xa1\xbe\x01\x97\xdb\x12\x34\xd3\xb5\x52\x4a\xb2\xb2\x09\x9d\x6c\x19\x53\x59\xc6\x47\xb3\xd6\xc9\x1b\xf6\xc9\xb3\xd8\xd7\xe9\x65\x1d\x5c\x0a\x8a\x78\xbc\x96\x85\x3a\x11\x93\x03\x3f\x5b\x48\x96\x56\x6b\x2b\x3a\x68\x87\x30\xbf\xab\x71\x95\x09\xf1\xa1\x38\xfb\x9e\xb9\x53\x72\x7c\x60\x89\x1d\x9d\xbc\xc3\x75\x1f\x30\xd5\x8d\x72\xd7\x0f\x66\xda\x68\xcb\x84\x17\x27\x46\x60\xea\x2e\xf9\x0c\x7b\xff\x9c\xa4\x45\x1f\xed\xfd\xb2\xb9\xd3\x25\x3d\xcd\xc6\x2e\x79\x90\x79\xbd\xa8\x76\xe7\x3c\x34\x7d\x93\x13\x2a\x71\x18\xee\x74\x13\x5d\x62\xde\x53\x60\x28\xbc\x61\xff\xb1\x39\xe3\xaf\xd7\x55\xfb\xeb\x0d\x8f\x1a\x7a\xd0\xc0\x01\xbb\x8c\xb1\x8d\x0a\xa8\x08\x4d\x6a\xd6\xec\xf1\xe9\xd0\x94\x8f\x8d\x9a\x52\x20\x1c\xc9\x45\x58\x5f\x99\x74\xb5\xd8\xb1\x7b\x41\x00\x40\xd8\x1e\x20\xab\x98\x5b\x0f\x86\x2b\x47\xd7\x53\xc6\x3d\xc5\x63\x77\x3e\xb6\x76\xf3\x19\xf6\xfe\x39\x4d\xcb\x7d\xc0\x5e\x84\xb1\x48\x77\xf4\x85\x6c\x74\x7d\x17\x75\x2c\x4a\xea\x2a\xb5\x38\xc7\x8d\x6e\xf9\xb0\xd8\x9c\x0d\x5a\x36\x96\xc2\x62\x25\xec\xb8\xb7\x7b\x6d\xf6\x2c\xf6\xd7\x5d\x7d\x71\xbb\x29\x50\x84\x11\x6d\xb6\xd3\x66\x2b\x07\x27\xd4\x33\x57\xda\xce\x17\x34\x64\x1b\x31\x84\x4b\xc5\x84\x2a\x50\x1a\x3a\xf0\x24\x51\x99\xd5\x29\x4c\xcc\x5e\x63\x2e\xd6\x45\xe1\x43\x26\xd1\x46\x97\x8e\xbd\x8d\xd6\x01\xd9\x15\xfa\x6b\x1a\x53\xd2\xef\xef\x62\xd2\x4f\x89\xda\xd7\x50\xe4\xdf\x60\x7f\x0c\x04\xd1\x0d\x95\x44\x14\x05\xee\x7e\x39\xb6\xdc\x72\xda\x1f\xd6\xa7\x93\x43\xaa\xe9\xa2\x97\xd6\xf6\x20\xcd\x25\x5c\x72\x47\xe6\x8d\xf7\xe4\x59\xec\x65\xfa\xc6\xf5\x69\xab\x2c\x1b\xc1\xa6\x1e\x96\xe4\x34\x6c\x2a\x2d\xab\xa6\x0f\xb7\x83\x40\x15\x8c\xc1\xca\x1b\x76\xb9\xaf\x29\xc8\x3a\x1d\xc3\x07\x83\x76\x4e\xe0\x0d\x9c\x76\x93\x94\xf7\x3a\x4f\xa9\x0b\x3e\xb7\x69\x93\x91\x4b\xe4\x5a\xcd\x66\x03\xae\x1c\xff\x19\xf6\xfe\x29\x55\x2b\x2a\x1f\xb0\x97\x57\x13\x4e\xcf\x1c\x39\x47\xd3\x6e\x71\x3b\xe6\x69\xc8\xb3\x5d\x46\xa8\x3a\xe5\x0f\x0f\xbc\xc9\xa0\x32\xa8\xaa\xa7\x1f\x2e\x92\xf2\xc6\xfb\xfc\x59\xec\x8d\x51\xdc\x1f\x8f\xa1\x2f\x4e\x84\xee\xce\x87\x29\xb2\xd7\x8a\xa4\x2b\xf4\xf1\x26\x47\x85\xb1\x4a\x6f\x37\x44\x27\x9c\x07\x5d\x10\x16\x2a\xd5\x2b\xcb\xf5\xe5\x0e\x35\xca\xa5\x55\xb4\xa6\x6c\xbe\xd4\x13\x63\x43\x0a\x96\xd9\xe1\x74\xd4\xee\x5e\x9c\xa4\x4c\xf7\x19\xf6\xfe\x29\x59\x2b\x1a\x1f\xed\xfd\xb9\x27\x26\xeb\x58\x8a\x33\xcc\x6e\xb5\xc7\xbc\x8f\x4e\x27\xee\x76\x5d\x9e\x8a\x52\x92\x36\x9c\x92\x03\x18\x05\x73\xe9\xed\xf8\xb7\x88\xc2\xc7\xa6\x0f\xbf\x3e\x84\xf9\x58\xd7\xb3\x28\xcf\xba\x41\x82\xb6\xae\xcd\xbe\xdb\x5e\xae\xf7\x7d\x23\x4e\xf5\x6d\x87\xb1\x39\xea\x97\xab\xd6\x2d\x9a\xeb\x3a\x6f\xcc\x43\xb3\x77\x54\x3f\xbf\x2e\xe0\x41\x5b\x58\xd0\xd4\x75\xf9\x54\x36\x6e\x70\x5e\x0f\x73\xd3\x71\xb2\x7e\x83\x27\x2f\x5a\x7f\x86\xbd\x7f\x4a\xd7\x8a\x1f\x23\xf7\xe2\xe5\x48\x1b\xd5\x43\xc7\x71\x62\xfb\xa3\xc7\x2c\x69\x63\x57\xf1\x2c\xa9\xc7\x23\xd7\x9f\x57\xce\x42\x6f\x65\x56\x66\xf6\x87\xfb\xf9\x0d\xfb\xf2\x59\xec\xb5\xf0\xe0\xae\x56\xa6\xed\xa8\x86\xd2\x45\x62\x39\xd7\x94\x58\x3a\xd1\x5a\xf7\x0d\xd7\xa5\xec\x95\xaa\x42\x46\xd9\xec\xe7\xc5\x72\x58\x1e\x82\x6b\x06\x16\xc5\xb6\x3f\x3f\xc4\x0d\xdf\xeb\x2e\xef\xd9\x57\xe9\xd6\x66\x42\x67\x8f\x8a\x0f\xdc\x9b\xe6\x4d\x69\x18\x88\xbf\x3f\xef\xc1\x53\xba\x56\xfc\x18\xba\x97\x99\xc5\x51\x9a\x86\xa9\xdb\xf6\x67\x9f\xf2\xf2\x93\x70\xcd\x4a\x65\xee\x12\x4b\xce\xee\x97\x05\x5b\xd0\xce\xc3\xe7\xd9\x55\xbd\xc0\x6f\xf6\xbe\x7a\x16\xfb\xb2\x5d\x87\xe3\x46\xf5\x6f\xa7\x47\x8d\x65\x09\x12\x5e\x74\x06\x0b\xf2\x97\xf3\xb1\xf7\xd3\x72\xe6\x50\xe1\xcd\xe1\x75\x0c\xf8\x24\x57\x24\xd0\x9c\x0c\xc4\x95\x6b\xa5\x33\xdc\x80\x3a\xf1\xe7\x20\x55\xfd\xc1\x02\x2e\xa6\xa0\x93\x14\xe4\x54\x2f\xa5\x78\x96\x7f\x7f\xde\x83\xa7\x74\xad\xf8\x31\x76\x2f\x04\xc7\x1b\x8a\xfd\xeb\x23\xb6\xd7\xa7\x22\xf6\x3b\xb0\xe8\xfb\xbe\xdb\x55\x85\x64\x4c\xc7\x3a\x12\x11\xeb\x0c\x87\x05\xbb\xa5\xa7\x37\xde\x1f\x9f\xc5\x7e\x18\x01\x48\x48\x36\xf7\xe6\x9c\xe6\xdc\x64\x58\xed\x59\xdb\x33\xea\xed\xbe\x0a\x1c\xc8\x04\x14\xcc\xfc\xc2\x47\x7a\x76\x6f\x0a\x46\xb9\x2a\xcc\xa8\x1e\xbc\x6a\x1b\x58\x9a\x6f\x0b\x61\x65\x9d\xd4\x4b\x3a\xeb\x89\xb6\x37\x86\x0e\x19\x14\x75\x63\x96\xf3\xf9\x13\x6c\x0e\x78\x4a\xd7\x8a\x1f\x83\xf7\x72\xb1\xdd\xda\xbc\xcf\x2d\x36\xf8\xc4\x99\x97\xbb\xa4\x18\xfe\x62\x38\x0b\x53\x3a\x39\xd6\x74\x08\x4e\xba\x74\x5e\x38\x95\x8d\x97\xb7\x37\xde\x7f\x2c\xd9\xfb\xab\xb1\x0f\xc5\xf0\x71\x41\x48\xc9\x3a\x60\xe8\xb7\xf6\xc6\x06\x07\x7d\xb2\x5a\x4e\xd2\xe6\x20\x65\x6b\xe2\x38\x67\x70\x94\xa6\x98\xf4\x20\x9b\xc0\xc4\x29\x39\x77\x07\x0f\x52\x24\x61\xf9\xb8\x2b\x4b\xd7\x7d\x6c\xdb\x20\xb2\x9a\x83\x1e\x1a\x8b\x41\x66\x07\xb8\x59\x7f\x42\xa2\x16\x3c\xa5\x6b\xc5\x8f\xd1\x7b\x01\x2d\xe4\x5a\xaa\x0c\x7f\x27\xc1\x34\x4c\xdc\x10\x9d\x6e\x85\x99\x36\x17\x81\x24\xfd\xc4\xa9\xd2\x7a\xa6\xcc\x4a\xf3\xb6\xaa\xf9\x86\x7d\xf3\x2c\xf6\xd2\x39\x5d\x0b\x8f\x36\x6d\x99\xad\x9d\x04\x01\x3e\xb9\x05\x60\xc9\x2d\x46\xdc\x42\x55\x01\x2a\x8c\x7d\x2c\xaf\x36\x50\x3d\x26\xdb\x4d\xb9\x31\x70\x56\x88\xad\x5d\xed\x79\xfa\x56\x49\xd7\xa3\x59\x08\xad\x30\xdf\xd6\xae\x27\xa5\x54\x69\xbb\xdb\x21\x13\x3a\x49\xfe\x04\xec\x9f\xd2\xb5\xe2\xc7\xf0\xbd\x4c\x94\xc7\xe5\x71\x31\x4d\x41\x54\xd7\x29\x7f\xcb\xee\xd4\xe1\xb2\x28\x7d\x7a\x94\x4d\x4d\x3b\xf3\xfa\x71\xf1\x60\x42\x8f\xa5\x71\x2d\x7c\xc3\xfe\xf4\x2c\xf6\x33\xe9\xf6\x9b\x48\xbb\x45\x61\x31\x10\x56\x8d\x37\x0f\x01\xc3\x1b\xbe\xa0\x68\xb7\x68\xf3\x92\x58\xc7\x55\xab\xdc\xd2\xa4\x43\x86\x45\xef\xb9\x23\xc7\x6d\xc5\x53\xd6\xdc\x95\x1d\x80\xfd\xb4\xcd\x5c\x20\x6b\x8d\x98\x9f\xb6\x0f\x4d\x68\x25\xd7\xe8\x71\xac\x7d\x06\xef\x9f\xd2\xb5\xe2\x77\xf1\x7b\xb3\x01\x9b\xa3\x88\xd6\xee\x82\x19\x98\xca\x5c\xf7\xd2\x52\xdb\x2f\x62\xc6\x21\xb2\x3a\x7a\xec\xc9\xcd\x8f\xe7\x9d\x3f\xae\x1c\xe5\xcd\xde\x9f\x9f\xc5\xbe\xc4\x07\x15\xe2\xc3\x3d\x38\xa4\xb4\xb9\x7b\x98\x33\x5c\x78\x50\x03\x9d\xbf\xdd\xc3\xb9\x92\x17\x14\xdc\x1c\x8f\x22\xb8\xcf\xd3\x7a\x5b\xf8\x7a\x58\x8b\x66\x58\x3f\xa2\x4a\x74\x68\x93\xac\xf0\xb5\xbc\xe9\x69\xb6\x7c\xb0\x42\x2a\x2c\x10\x4c\x46\xb8\x4a\xb4\x4f\xf0\xef\xc1\x73\xba\xf6\x63\xfc\x5e\x60\x7a\xed\x32\xb3\x8f\xc7\x26\xab\xa5\x0d\xd7\x47\x17\x1d\xcd\x70\x27\xe4\x02\x7f\x28\x6e\x08\x30\xd4\x42\x5c\x09\x0d\x98\xbc\xf3\x9b\xcd\x69\x9f\xb6\x39\xdc\xf9\xa2\x5b\xdd\x5e\xdc\x1f\xeb\x42\x61\xb1\xe8\xe4\x11\x5f\x14\xab\x74\x68\x78\xe3\x02\x61\x70\x01\x8d\x21\xed\x47\x3d\xbd\x48\xa9\x2f\x8d\x76\x1f\xd9\xf6\x3a\x1a\x0f\xd2\x8a\xcb\xcc\xdc\x7f\x34\xee\x06\x5d\xc1\xd5\x5d\x96\x7d\xe3\x44\xd9\x22\x13\xa9\xcf\xb8\xd7\x3e\xa7\x6b\x3f\xc6\xef\x45\x79\x45\xd5\x65\xea\x48\x8f\x00\xa1\x6d\x5b\xb9\xce\xfd\x31\xc5\x41\x6e\x70\x9b\xad\xaa\x5d\x4b\xe5\x92\x1c\x97\x92\xd8\x34\x2d\x7c\xb3\x39\x97\x67\xb1\xa7\x67\x58\x56\x5e\x14\x06\x32\xdf\x24\x7a\xb4\x73\x39\x81\x6a\x18\xad\xa6\x4f\x46\x5c\x81\xc0\x99\x0e\xec\x62\x45\x49\x72\xb3\xa3\xc8\xad\xcd\x99\x29\x76\x8b\x82\x07\xba\x72\x0b\x06\xb9\x32\x78\x0c\x21\x58\xf8\xd0\x2f\x05\xf3\x18\x9e\x86\xf2\xfc\x38\xe3\xcf\xf0\x31\x9f\xd3\xb5\x1f\xe3\xf7\x52\x4a\x6d\x85\xa1\xc8\xf0\x28\x14\x59\xf1\x30\xd5\x6a\x15\x72\xb7\x56\x04\x35\x1b\xa2\x70\xa5\x14\x20\xe4\xa7\xdd\x22\xd4\xf2\xd3\x9b\xcd\xb9\x3e\x6d\x73\xfc\x1a\x42\x51\x33\x19\xf1\xd1\x5f\xe2\xf1\xf4\xd0\x15\x87\x5f\x62\xe1\xc2\x47\xf7\x6d\x92\xad\x29\x61\x49\xb4\x58\xec\x57\x1b\x24\x66\xc6\xa8\xef\xb6\x97\xa3\xb8\xf0\x9b\xdb\x6a\x7d\x5e\x1b\x85\x66\xde\xe9\xfb\x51\x46\xd6\x92\xbe\x5d\xb7\xfb\x85\x21\x09\x42\xf2\x19\xd8\x3f\xa7\x6b\xbf\x8b\xdf\x4f\xa9\x7d\x0f\x4f\xa5\x7d\x5e\x71\xf7\xdb\x2e\x1f\x1a\x6d\xbb\x5f\xd0\x7e\x79\x37\x45\xb3\x3e\x24\x67\x9e\x19\x0e\xf5\x35\xe4\x72\xe3\x0d\xfb\xee\x59\xec\x95\xd9\x6d\x55\x75\xc5\x67\xc2\x31\x99\x41\xb2\x69\x6f\xcd\x22\x5c\x57\xe6\x81\xd6\x7c\x85\x7d\x64\x52\x62\xe9\xbd\xd9\xf3\x69\x61\x15\x35\x59\x54\xbb\xfd\xe2\x9c\x83\xd9\x4d\xb6\xd2\xad\xca\x76\x97\xd3\x7d\x11\x71\x33\xb7\xb9\xe5\x78\x53\xc9\xee\x0a\x1f\x0f\xdd\x27\xa4\xca\xe1\x73\xba\xf6\xbb\xf8\xbd\x67\x31\xf9\xf6\x14\x2d\xc3\x51\xac\xb2\x6b\x21\xd1\xb9\x42\xd7\xa3\xc7\xb8\xfc\x76\x2e\x75\x18\x89\x37\xfa\x3c\x14\x7c\x7f\x4b\xdf\xec\xfd\xc7\x62\xf1\xbf\xde\xe6\x3c\x96\xfb\x41\x8d\xea\xdb\x39\xd2\x79\x03\x2e\x44\x27\xb1\xb7\xa4\x64\xa2\x20\xb8\x3c\xf8\xb1\xe8\x5b\x25\xa5\xad\x8d\x01\xea\x76\x97\x96\xbc\x7a\x48\x9b\xad\x72\x3b\x9a\x02\xde\x25\x7a\x05\x32\x52\x0a\xd2\x15\x3e\xc8\xbc\x95\xee\x64\xd0\x08\x72\x61\xfb\x09\x31\x64\xf8\x9c\xae\xfd\x2e\x7e\x3f\x55\x97\x20\xde\xae\x17\x6d\xe5\xf7\x3e\x88\xc3\xf5\x3c\x5b\xb9\x84\x0e\x07\x75\xb9\x3c\x24\xd3\x35\xae\x6a\xa5\x9f\xc5\x10\x74\x6f\xf6\x7e\x78\x16\xfb\x22\x11\xe4\x33\x2d\xcb\x75\x6c\x67\xfd\xca\x3d\x2c\xe8\x71\xb1\xc9\xeb\xb0\xb6\xed\x1d\x70\x6f\x6a\x7e\x70\xc5\xeb\x2c\xd4\x8e\x91\x93\xa3\xb2\x8c\x1a\xcf\x78\xd4\x91\xb9\x96\xfc\x72\xa3\xf1\xfb\xbd\x7f\xd7\xc7\xcd\xf1\xe8\x02\x86\x33\x39\x8d\xae\x96\x43\x78\xf8\x04\x9b\x03\x9f\xd2\xb5\x92\xf0\x11\xfb\x01\xea\xea\xc0\xed\x37\x07\xf6\x6e\xb6\x42\xa4\x71\xb7\xd3\x83\x2d\xfd\xfb\x7c\x9c\xcf\x92\x73\x38\x39\x37\xca\xd1\xd7\x27\x73\xf4\xde\x78\x3f\x3e\x8b\xfd\x89\xd0\x51\x90\x30\x51\xd5\x6f\xec\x56\xe4\xef\x0e\xb9\x52\xeb\x18\x2c\x8e\x82\xe5\x45\x03\xd1\xaa\xc0\x64\xa4\xad\x02\xed\xe5\x66\x46\xd6\xea\xc2\x5e\x51\xb4\x6c\x57\xe7\x53\x98\x4f\xfb\xf4\x74\xb6\x80\x63\x86\x95\x4f\x79\x65\x7e\x2a\xf8\x95\xea\x96\xf6\x43\xfe\x04\xde\x3f\xa5\x6b\xa5\x8f\xf1\x7b\x89\x41\x53\x22\x5c\x3c\x33\xdf\x50\x46\xed\x0e\xf7\x74\xcc\xb5\xb2\x76\xbd\xec\x70\xa6\x2f\xd5\xed\xc6\x5e\x06\xee\x6e\x3a\x5b\x89\xbc\xf1\xfe\xf6\x2c\xf6\xbe\xbf\xb1\x11\x4e\xfc\xe0\x72\xdb\x88\x6c\x6f\xc2\xa8\x6a\xc7\x24\xe1\x7a\x79\x3e\x0c\xe6\xea\x54\x3b\x19\xa4\x88\xa6\x9d\xcc\x1d\x3a\x3f\xc4\xdb\xf5\xa8\x92\x84\xd4\xd3\x36\x3d\x06\x51\xc2\xf5\x67\xa8\x57\xd7\xac\x5d\xed\x46\x74\x76\x79\x84\x73\x13\x12\xf1\x13\x78\xff\x94\xae\x95\x3e\xc6\xef\xe5\x35\x45\xd5\x27\xd4\x55\x8c\x56\x6b\x2d\xe5\xb5\x96\xbc\x80\xc2\x1a\x3c\x8c\x87\x98\x73\x0a\xd8\x58\x5d\xbc\xdd\xcb\xd1\x34\xd6\x6f\xf7\xda\x8f\xbd\x19\x7f\x35\xf6\x9d\xc3\x3e\x62\xcc\x8d\xc3\xf1\x7a\x5b\x91\x32\xdb\x9e\xf4\x44\x4c\x5a\x77\xb7\x92\xd4\x95\x75\x38\xa7\x73\x3b\x29\x5d\xea\x34\x8a\xa6\x2c\x1e\x9c\x44\x94\x3b\x59\xea\x73\xbb\x49\x6b\x23\xc9\xc3\x15\xaf\x76\x68\xb8\x56\xf4\xc5\x94\x1e\x7b\x67\x37\x6f\x93\x87\xf8\x09\xda\x0a\x3e\xa5\x6b\xa5\xef\xe2\xf7\xf6\x10\xb9\xb0\xc5\xfd\xa3\x34\x5d\x1e\xcf\x8e\x3b\x03\xcd\xbf\x47\xe5\x63\x05\x3d\xb6\x1c\xc5\x0b\x2d\x6d\xca\x5a\xe6\x9d\xee\x0d\xfb\xf9\x59\xec\x95\xb8\x7a\x44\x61\xcb\xdb\x8a\xde\x94\x98\x5e\xb0\xeb\xf9\xbc\xee\xb9\x1b\x59\x87\x4b\x3a\x09\x96\xfe\x7a\x99\x8e\xf4\xd2\x53\x71\x73\x3e\x14\x99\xe5\x69\xcc\x8e\x1b\x4b\x76\x3f\x90\xf2\xb4\x60\x0f\x22\x74\xdb\x00\x26\xe6\x64\xe4\x76\xb7\x60\x2d\xc4\x03\x51\xfe\x04\xec\x9f\xd2\xb5\xd2\xc7\xf8\xbd\x04\x8f\xee\xfd\xb4\xbc\xb4\x06\x88\x9a\xec\x1e\x6c\x9d\xf8\x1c\xc8\x0f\x5e\xdc\xdc\xd8\x7e\xf7\xd8\xf6\xf8\x22\xaa\x2c\xb7\x3b\x8f\xa7\xb7\x9c\xe1\xfd\x59\xec\xb3\xe3\x9a\x4c\xa7\xdd\x58\x6b\x52\x83\xad\xce\x9a\xf9\xa6\x12\x44\xb3\xd9\x8f\x94\xb8\xd4\xe9\x00\x8f\xe7\x19\x1a\x37\x1f\x50\xbb\x51\x14\x8d\x8e\xcb\xd9\x93\x69\x08\xf3\x6e\x56\xf4\xa2\xf2\x38\x79\x57\xdf\x35\xa7\x21\xf3\x51\xcf\xd4\xb8\xb6\xf5\x44\x69\x3f\x21\x77\x02\x9f\xd2\xb5\xd2\xc7\xf8\xbd\xb4\x61\xb2\xc5\xa3\x51\x5b\x73\xd1\xac\xfa\x59\x76\x77\x0e\x10\x10\xe9\xda\x36\xa8\x83\xb8\x3b\x2f\x95\x85\xa6\x76\x8b\xb6\x1a\xd7\x6f\xd8\x3f\x9e\xc5\x3e\xed\xa3\x4d\x73\xbc\x78\x27\x5b\x58\x05\xbc\x47\xef\x16\xbb\x10\xc9\x09\xdf\x86\xb5\xbd\xc3\xfe\x41\x89\xc0\x51\x5a\x2e\x7a\x3f\xc6\xd5\x78\xb2\x50\xb4\x7d\xd8\xcc\x72\xd1\x5e\xd2\x2d\x57\xce\x05\xb3\x65\x8a\xfe\x7e\xda\xa3\x0e\xad\xd5\x8a\x8e\x47\xa2\x9f\x84\xcf\xb8\xd7\x3e\xa5\x6b\xa5\x8f\xf1\x7b\x89\xa7\xd0\x9c\xcd\x8d\xb4\x8c\x38\x63\x96\xb2\xfd\xec\x72\xad\x72\x1e\x32\xc3\x8f\x46\x41\x5f\x0a\x5e\xaa\x3d\x06\xf6\xf6\x18\xbf\xd6\x41\x7f\xc5\xfe\xe3\xe3\xbd\xbf\x1a\xfb\x9d\xb9\x38\x1f\xf9\xc5\x99\x1f\x77\xb2\x7f\xbd\xd9\x5b\xb0\xab\xa7\xfd\xc5\xb8\xcc\xdd\x70\x99\x77\x54\xdd\xa4\x07\x0e\x85\xa7\xdd\xe6\x11\xc0\xdd\x63\xf7\x20\x38\xd2\x47\x76\x92\xe9\x73\xbe\x90\xe8\x9d\x79\xb4\xf5\xd5\x54\x94\xe9\xb6\x01\x9b\xe5\xdd\x3d\x9e\x1f\xc6\x67\x60\xff\x94\xae\x95\xbe\x8b\xdf\x93\x35\x77\xd3\x8d\xe5\x74\xc4\x57\xaf\x38\xd5\x7a\x21\xa7\x4b\x05\x5d\x67\xc5\x6d\x9c\x7b\xbe\x29\xb4\x42\x22\xf2\x7c\x42\x0e\xf5\x86\x3d\xfd\x2c\xf6\x09\x1f\x96\xbb\xfd\x8d\x3d\x38\xda\x81\xb3\x12\x84\x17\x45\xb4\x3b\x2c\xf7\x9d\xe6\x74\x96\x14\x4e\x1e\x57\x2b\xab\x79\x50\x9d\x76\xa9\x88\x37\x41\x71\x40\xb0\x4b\xe4\xdd\x66\x7d\xbd\xcf\xb0\x57\x87\x78\x8d\x15\xf6\x5a\xa7\x14\x23\xd6\xab\x6b\xf0\xd8\xb1\xb5\xf3\x09\xba\x16\x3d\xa5\x6b\xa5\xef\xe2\xf7\x8b\x75\x5a\xa2\xb0\x0e\x86\x83\xaf\xfa\x1e\xd6\x4e\x7d\xd9\x28\xf9\x74\xf1\xdb\xe3\xad\x3a\xf0\x96\x04\xf1\xa2\x6f\x50\x7a\x3e\xbf\xd9\x1c\xf0\x2c\xf6\xb6\x27\x5f\x30\x31\xba\x75\x46\x4f\x87\xbb\xe7\x8a\x49\xc6\x66\xfb\x83\x31\x52\x66\x79\xc4\x41\x7a\xef\x03\x52\x34\x66\x08\xb0\x7c\x3c\x4f\xf9\xa6\x1b\x7c\x7f\x93\x76\x59\x3b\xeb\x98\x8e\xa2\xc3\x78\xf4\x96\x1b\x0f\x86\x67\x47\xf7\x5a\xfd\xe1\xdd\xc2\x3a\xfb\x84\xdc\x09\x7a\x4a\xd7\x4a\xdf\xc5\xef\x5b\xb8\x2a\x7b\x2c\xdc\x06\x75\x5c\x5d\xad\xa2\xca\xa1\x74\xf4\xd3\xaa\xd3\x6e\xca\x85\xa8\xab\xd9\x68\x4e\xec\x5d\x93\x72\xff\x9d\xb6\x82\xcf\x62\xcf\x79\x19\xee\xd6\xda\x42\xe2\x8a\x65\xb9\x60\x2f\xb7\xb5\x15\xaf\x57\x77\x33\xa4\x38\xd8\xfb\xcb\xe1\x2e\x9e\x15\x9a\x3a\x67\xe1\xbd\x6a\xfc\x26\x4b\x92\xb1\x3a\xb9\x33\x6d\x66\x89\xa8\x59\xdc\xbd\x5b\x3e\xca\x35\xc7\x9e\x1c\x69\x7b\x5b\xd6\x42\x71\x52\x27\xea\x33\x62\xc8\xe8\x39\x5d\xfb\x5d\xfc\xfe\x78\xb0\xb2\x2b\x64\xac\x6c\x6d\x24\x53\x60\x34\x95\x9a\x87\x95\x7d\x99\xb1\xf0\x58\x5f\xcf\x03\x2a\x06\x8d\xba\x69\x41\x2b\x1e\xde\x78\xff\xb1\x91\xf5\xaf\xc6\x3e\xb0\x9d\xa3\x65\x80\x92\x70\x66\x22\x6c\xab\x38\x69\x8d\x36\xf4\xb6\x8b\xcc\xd9\x2d\x2d\x39\xe7\x46\x07\x0a\xd0\xb2\xec\x88\xda\x3b\xc5\x18\x30\xe2\xdd\xe6\x02\xac\x77\xc0\xe4\xf4\xe4\x61\x2e\x1b\x34\xe0\x0a\x33\xea\x4d\x2c\x17\x27\x02\xb6\x64\x33\xb8\x9f\xe0\xdf\xa3\xe7\x74\xed\x77\xf1\xfb\x9a\x36\xd7\x6a\xba\xe1\x5a\x6f\xe5\x5d\x6d\x6f\x97\xdc\x73\x45\xf0\x5a\xce\x68\xda\x44\x91\x0a\x2c\x5d\xf9\x49\x34\xee\xb3\x6b\xbe\xf9\xf7\xcc\xb3\xd8\x87\x3b\x0c\xd6\xfa\xe1\x9e\x42\xf1\x76\x5f\x87\x14\x6b\x55\x21\xee\x84\xed\xe0\x33\x7b\x10\x55\x8f\xae\xd9\xac\x6d\xb9\xe2\x23\xfd\x8c\x16\xbd\xd2\x36\x5e\x43\xf8\x51\x54\x58\x77\x6b\xf7\x02\xb2\xcd\x9d\xe9\xad\x67\x9d\xae\xd6\x3b\x5d\xb1\x39\x2e\x2b\x8e\xf3\x27\xdc\x6b\xd1\x73\xba\xf6\xbb\xf8\xfd\x78\x14\x5d\xea\xa2\x5b\x32\xdf\x68\x2e\xcd\x1e\xa7\x18\xc7\x97\x43\x69\xab\xde\xe1\x02\xc1\x79\x82\xb7\x22\xbb\x12\xdc\xec\xde\x3d\x64\xc8\x3e\x8d\xfd\x70\xc4\xa5\xc0\x6d\xc6\xa8\xda\xf8\x6d\x73\x89\xcf\x15\xe9\xa5\x7a\x65\x77\x83\xad\x4d\x56\xc6\xa8\x66\x30\xcb\xe4\x8c\x96\xa0\x28\x2e\x07\x2b\xbf\x97\xcb\x29\xb3\xbb\xe0\x5c\x22\x12\x33\xd7\x6c\x2d\xcc\x0f\x3f\xa2\x8e\x76\xc2\xf4\x81\xe3\x2e\x57\x6d\xf3\x09\xfe\x3d\x7a\x4e\xd7\x7e\x8c\xdf\x4b\x4e\x68\xa4\x24\x95\xdb\x96\x01\x05\x3f\xaf\x17\xe7\x8b\xae\x69\x5e\xac\xba\xda\x3e\x3c\xf8\xfb\x65\x5c\xae\xf6\x94\xe6\x58\x47\xfa\x0d\x7b\xfc\x34\xf6\xbc\x3b\x7a\xb7\xfc\x24\x8c\x42\x7e\x86\x10\x33\x96\xe1\x70\x5d\x59\x16\x0f\x8f\x86\xa3\x20\x03\x69\xcf\xae\x73\xdf\xc4\x8b\x61\xa7\xc3\x39\xb9\x59\xa7\xe5\x20\x95\xe3\xbc\x08\xaf\xf1\x28\x5c\x64\x27\x62\xbd\xc7\x6d\xb9\x5a\xcf\xcb\x68\x4d\x67\xc8\x7b\xf8\x9f\x81\xfd\x73\xba\xf6\x63\xfc\x5e\x90\x44\xab\xe0\xfa\x10\xaf\x09\x23\x09\x4c\x6e\x47\x99\x78\xea\x6f\x46\x64\x09\x61\xb1\x09\x51\xda\xa8\xc2\xe9\xe2\xf2\xbd\xf4\xee\xb9\x66\xee\x59\xec\x77\x61\x5e\xc6\xfd\xe2\x61\xed\xe1\x76\xba\x2a\xae\xb5\xa1\xab\x31\x94\xb6\x99\xde\x83\xf3\xe2\xb8\x29\xf3\x68\xbb\xab\x4e\xfb\x69\xf3\xa0\xf4\xf5\x18\xb3\x59\x97\x49\xbd\x1c\xf4\xd7\xc7\x5a\x3d\x9f\x47\x3a\x81\xb7\x76\xd3\x14\xf7\xe0\x60\x75\xde\x39\x19\xf8\x9d\xf0\x19\x7e\xce\x73\xba\xf6\x63\xfc\x5e\xde\xbb\x87\x6e\xbf\x3c\x15\x4e\x12\xd8\xa7\x65\x51\x76\x5c\xb6\x13\xc2\x75\xdd\x89\x1b\xb9\x3c\x9d\xf6\x44\x83\xe3\x71\xac\xe5\xdb\xd7\xe7\x3a\x5f\xb1\xe7\x9f\xc5\xbe\x8b\x22\xa8\x9d\xd2\x26\x84\x0b\xfe\x28\xae\xd6\xa6\x2b\x79\xe2\x44\xd1\x9b\xb9\x62\xe2\x83\x3e\x1d\x44\x89\x96\x16\xcb\xb1\x39\xec\xf9\xa1\x59\x83\xb0\x1b\x35\x7f\x38\x45\xf0\x41\x35\x69\x5d\x43\xad\xc0\xb6\x52\xa6\x5d\x91\x5e\x2d\x63\x71\xba\x99\x66\x74\xfa\x84\x3d\x22\xe8\x29\x5d\x2b\x0b\x1f\xb1\xbf\xb4\x9b\x24\xed\xf9\x21\x92\x88\x2b\xb5\xb2\x41\x37\xf5\x69\xbf\x89\x2e\x7b\xe1\x46\xc5\xd1\xfe\xba\x9f\xfd\x9e\x94\xad\xb8\x35\xdf\xb0\x5f\x3c\x8b\xfd\x76\xd8\x49\x72\x0e\x56\xdd\xb8\x5a\xb6\xe6\x98\x9f\xc6\xbd\x34\x9d\xca\x97\xaf\x7b\xe3\xad\xdc\x43\xa5\xe0\x1f\xaf\xe7\x4d\x0d\x45\xbe\x2b\x1e\xf5\x5d\x36\x46\x1b\x27\xb7\x39\x2a\x65\x97\x9b\xc4\xb9\x35\x13\xcb\x2f\xae\xa7\x36\xd9\x2a\x77\x59\x98\xb8\xd3\xf9\x33\xfc\x9c\xa7\x74\xad\xfc\x31\x7e\x2f\x32\xbe\x72\x40\xc1\x2a\xf1\x25\xff\x81\x09\x0e\x42\x75\x3e\x3f\x4a\x67\x50\xc1\x31\x67\x66\xfb\x78\x6c\x4a\xa5\xb6\x30\xe2\xdf\xf9\x39\xcb\x67\xb1\x9f\xe8\xd2\x5f\xfa\x1e\x5f\x57\x21\x4b\x6b\xfe\xd6\x14\xb6\x17\xc7\x39\x6f\x63\x52\xdc\xb2\x25\x23\xa9\xc5\x86\xeb\x6b\x2f\x6f\x53\xb3\xab\xea\x91\x4a\x2c\xc7\x3a\x2e\x0c\x41\x1d\xee\x3d\xbd\xa8\x93\x44\xaa\x9b\x1d\x00\x42\x1b\x56\xac\x1a\x48\x17\xf2\xb8\x7d\xc6\xb3\x0f\xcc\x53\xba\x56\xfe\x6e\xff\xbd\xe9\x0e\xf6\xa4\x0e\x2b\xca\x42\x41\xa5\x63\xb3\x59\xce\xf7\x03\x81\x6c\x38\x34\x4b\x7b\x54\xd2\x64\x79\xb9\x29\x9a\xaf\xef\x1f\xdf\x78\xff\x31\x8c\xf9\xeb\xb1\x87\x8b\xc7\x6d\xa6\xa9\x40\xaf\xf6\xad\x7d\x67\x2e\x96\x7b\x40\xc1\x3c\x8a\x40\x6b\xb2\x65\xe4\xa0\x9d\x35\xa7\x5b\x68\x15\x9c\xd1\x9d\x0c\x35\xd6\x8f\xf3\x42\xbb\xdf\x47\xcf\x2b\xaf\x57\x8b\x50\x96\x93\x9c\x6f\xa7\x98\xf2\xaf\x77\xd7\xdf\x93\x80\x9b\xef\x07\xed\x13\x72\x86\xcc\x53\xba\x56\xfe\x18\xbf\x97\x60\xcc\x35\x16\x99\x3a\x63\xca\xe8\xbd\x91\x2f\xa4\x87\xfb\xc8\x3c\x9e\x11\xae\x97\x4b\xa4\x22\x0f\x57\x5b\x33\x96\x20\xcb\x7a\x6f\xd8\x8b\x4f\xdb\x7b\xab\x3a\x51\x71\x80\x7c\x46\x40\xd7\xe8\x38\x5d\xc2\x61\xe1\x97\x57\xf1\x68\xd8\xe2\x2c\x2d\x0d\x8d\x83\xa7\xd5\xb5\x10\xa5\xb5\xab\x5e\xcb\xc8\x1f\x2a\xb3\xde\xae\xca\xe6\x7e\xe0\x46\x09\x4c\x07\x67\x77\xa3\x93\xc5\xdc\x8c\xf7\xe5\x48\xee\xa6\x73\x29\x02\xea\x13\x0a\x59\x30\x4f\xe9\x5a\xf9\xbb\xfd\xf7\x1b\xb4\x77\xbb\x78\x7b\xa5\xc2\xe4\x2e\xf6\x8f\xe5\x7e\xd6\xe7\x56\x50\x8f\xdc\x52\x43\x98\x3e\x6f\xe3\x07\x48\x94\x38\x1d\x82\xf2\x0d\x7b\xe9\x59\xec\x9b\xa3\x0d\x86\xd4\xb6\xe6\xe8\x4e\x79\x73\xce\x63\x3f\xe0\x1a\xaf\x2d\xc8\x29\xe1\x91\x42\x4d\x06\x6b\x3d\x82\xf1\x91\x19\xcb\xdd\x68\xab\x67\x0f\x76\x0b\x19\x1c\x98\xf5\x61\xe8\xae\x52\x24\xdb\x57\x80\x29\x1e\x04\x2a\xb8\xf4\x05\x5f\xed\x26\x55\x8b\x17\x9f\x10\x53\x60\x9e\xd2\xb5\xf2\x77\xfb\xef\x6d\x5e\x33\xf3\x0a\x37\x9a\xe0\x08\xf6\x6a\x6c\x26\x5c\x3e\x6a\xa4\xf6\xfd\xb1\x4e\xfd\x44\x0f\xe0\x76\x8f\x74\x59\xef\x8b\xf9\x9b\xbd\xbf\xcb\xcf\x62\x6f\x6b\x4a\xa7\xad\xbb\x87\x1f\xe9\x3b\xc4\x2f\xcf\x90\x36\xc1\xa2\xda\xcb\xf9\x8e\x33\xc4\x49\x9a\xb7\x38\x21\x25\x75\x30\xf8\x8d\x73\xea\x5c\xde\x5c\x65\x69\xe9\x5d\x59\x9a\x33\x64\x76\x38\xca\x8b\x6b\x0f\x5d\x7e\x5a\x4f\xf5\xb6\x6f\xa3\x65\xe9\x77\x51\xb7\xff\x0c\x9b\xf3\x94\xae\x95\x3f\xc6\xef\x45\x4a\xb6\x4f\xd1\xb9\x0c\x62\xa3\x16\xc2\x4a\xcb\xf7\xe6\x64\x76\x67\x43\xda\xc5\x94\x3a\xad\x1d\x3f\x4d\xb7\x92\x6b\x2d\xca\xea\x9d\xcd\x51\x9e\xb6\xf7\x4e\x19\x67\xf4\x3d\x48\x38\xe9\x70\x19\x8b\xd3\x92\x09\xa5\xd2\x87\xf6\xb8\x72\xc4\x20\x55\xf0\x2d\xe4\xd8\xf0\xaa\x53\x25\x2a\x96\xdd\x3d\xe5\xf9\xf0\x18\xde\xc3\x31\x5e\x34\xd0\xd9\x93\xa3\x8a\xb1\x74\xa7\xfb\xc7\x43\x1a\x0c\x66\x33\x15\x64\x9b\x87\x37\xe1\xf7\x8f\x29\x30\x4f\xe9\x5a\xf9\xbb\xf8\x7d\xe8\xa2\xd0\xa3\x74\x02\x0e\xe3\x91\x5a\x71\x57\x8a\xdf\x3f\x8a\x0d\x13\x0d\xee\x92\xd3\x8e\x39\x3d\x59\x99\xdd\x3b\xe5\x35\x7b\xc7\x7b\xf5\x59\xec\xc9\x29\x3d\xd5\xc8\x90\x72\xb4\xc1\xd3\x78\xb6\x3a\x2a\xa6\xa3\xa9\xb9\xd4\xb1\xbe\x5e\x2f\x1a\x62\xd5\x6a\xd0\x68\x0d\x1a\xa2\x24\xb7\x79\xf3\x34\x8e\x68\x1b\xad\x36\x38\x4c\xd5\x2e\xaf\x82\x7b\x52\xf2\xc7\x89\x18\x29\xb0\x44\x21\x30\x59\xcd\x3c\x34\xf2\x27\xe4\x6b\x99\xa7\x74\xad\xfc\x31\x7e\x2f\x88\x8b\x11\x79\xfb\x82\x9e\x20\x73\xd1\x16\x8e\xb4\x9f\xf8\x47\x12\xd1\xb6\x24\x49\xab\x65\x27\x05\xc5\x9d\x96\x8f\xa3\x75\xba\xbc\xed\x01\xbf\x6b\x4f\xf3\x7e\xab\x17\x91\x22\x1e\xab\xbb\x78\xbf\xab\x20\xd4\xf8\x80\xe0\xa3\x55\x03\x2f\xce\x58\xa5\x9f\x56\xfa\xc2\x47\x8b\xfd\xcb\xd9\x16\xd5\x82\x30\x21\x20\xf1\x1d\xed\x35\xc3\xd2\xb7\xf4\x19\x8f\x4c\xe1\xa8\xdc\x10\x9d\x30\xc6\x53\xb2\xe5\x03\x5d\x9d\xe1\x67\x60\xff\x94\xae\x95\x3f\xc6\xef\xc5\x55\xbd\x63\x18\x5f\x6a\x82\x81\xce\xab\x23\x6a\xef\xb8\x6b\xce\xad\xd4\x72\xae\x24\x13\xc5\x16\xa6\x28\x3b\x6c\x22\x7a\x21\x97\x6f\xd8\xeb\xcf\x62\x0f\xf2\x93\x18\xec\xd4\xbb\xc0\x4e\xd4\x83\xbd\xf1\xf6\xde\xc2\xe7\x68\x58\xae\xfd\xe5\xfe\xb2\xdf\xf2\x07\x5a\xb3\xd2\x76\xa9\x53\x48\x16\x63\xd1\x9f\xe9\xad\xfe\x98\xdb\x86\xde\xdd\x76\x75\xd7\xcd\xed\x55\x3a\x4f\xf5\x39\x5a\x93\x7e\x5d\x19\xdc\x32\xde\x17\xc9\xa7\xf0\xfe\x39\x5d\xfb\x31\x7e\x2f\x9f\xfc\xcb\x05\xab\x27\x33\x55\xd9\xa2\xe9\xd5\xa2\x75\x32\x5f\xbd\x64\x82\xbe\x39\x6f\x52\xdb\x1e\x4d\x3b\x54\x9b\x36\x49\xe6\xf8\x0d\x7b\xe3\x59\xec\x83\x88\x3c\x56\x5b\x4a\x67\x10\xa7\x7b\x13\xba\x5c\xa3\xa0\x68\xc3\x4d\xba\xbd\xe0\x66\x28\xd7\x0d\x2f\x1f\x46\xad\xde\xf4\xf5\xb0\xe1\xa7\xe3\xf1\x21\x05\x78\xc9\xb3\x9a\x59\x45\x85\x5c\x2e\x23\xfa\xd8\x06\xc2\x1d\x31\xae\x32\x25\x7c\xce\xf9\x52\x76\x17\xf5\xcf\xd0\x56\xcf\xe9\xda\xef\xea\xe7\xa0\x62\x9d\xa7\xca\x20\x66\xda\x63\x58\x1c\xaa\xfb\x2a\xdc\x9b\xb1\x4f\x6d\x30\xbe\xf9\x34\x7f\x46\x2c\xbc\x98\x36\xa3\x5c\xc6\xaf\x0f\x34\xbf\x62\xff\xb1\x35\xf7\xaf\xf7\x31\x69\x61\x7c\x68\x6b\x75\xb3\x65\x60\xac\xea\x16\x4c\x1e\xfe\xc4\xc4\xab\x50\x0e\x23\xf6\x18\x00\xb9\x8b\x08\x93\xba\x7e\x8b\x90\x79\xd9\x34\xc3\xda\xda\x86\x81\x5b\xee\xba\x90\xb9\x43\x3e\x62\x52\x78\x58\x9f\x96\x6b\xe1\x50\x8b\xd4\x42\x14\x06\x2b\x12\xb8\x4f\xd8\x0b\xcb\x3e\xa7\x6b\x3f\xc6\xef\xe5\xf3\xcc\x07\x8b\x60\xb0\xd5\x69\x9c\x35\xf5\xcc\xcd\xb1\x32\xcd\x4b\xde\xad\x6e\x21\xb6\x5d\xcd\xb5\x5a\xbf\xac\xad\x48\x6e\xf0\x1b\xf6\xeb\x67\xb1\xd7\xf8\x80\x9e\x36\x78\x07\xfc\x71\x14\x64\x78\x8b\x8c\xd8\xb9\x6c\x4c\x5d\xb8\xe5\xe5\xd9\x56\x0b\xc5\x17\x0c\x13\x44\x41\x34\x3d\x68\x94\xaf\xea\xcd\x92\xe1\xf7\x88\x90\xf1\xd4\x44\x87\xce\x8a\xee\x64\xeb\x9c\x4b\x69\x7d\x5c\x75\x11\x9a\x6b\x2f\x52\x23\xed\x13\xfc\x7b\xf6\x39\x5d\xfb\x31\x7e\x2f\x4b\xd9\x58\x6c\xce\x06\x2b\x3e\x56\xfc\xad\x72\xf1\x59\x38\x66\xeb\x6a\xf6\xcf\x97\x52\xc2\x4a\x95\xc2\xc8\xbb\x50\x2a\x3c\x02\xf5\xcd\xe6\x98\xcf\x62\xcf\x2d\x9d\xae\xac\x47\xde\x32\xf9\x24\x71\xe4\x6c\x2f\xb0\x0d\x93\x57\x35\x43\xd5\xd6\xf6\x14\x7b\xfa\x2e\x58\x40\x17\xdc\xfc\x86\xc4\x87\xa1\xa3\x5b\xf9\x1a\x3e\xc8\x23\x4d\xe5\xb1\x5a\x27\x3d\x26\xaa\xa2\xb6\x18\xd4\x73\x7d\x6a\xca\x5a\xaf\xb4\xbd\x46\xff\x35\x96\xf6\xf7\x2b\x2f\x7f\x2d\xe7\xfc\x5c\x65\xf8\xb7\x61\xde\x56\x33\xa5\x92\x14\xc4\x88\x67\x59\x96\x4a\x30\xe2\x09\x05\x48\x96\x41\xc8\x03\x16\x72\x54\xcc\x62\x86\x27\x39\xc7\xa2\x84\x20\x26\x41\x0c\x86\x80\xa7\x32\xc2\x33\x2c\x44\x39\x1f\xb3\xd4\xdf\xac\xea\xab\xf8\xfd\xea\xc4\x6f\xee\x14\x2b\x20\x98\xae\xac\x7b\x2d\x4f\x89\x9f\x9e\x6e\x8b\xfe\xec\x78\x20\x79\xb8\x67\x0c\x23\xfe\xa2\x8b\x4d\xca\xac\x99\x9f\x0b\x66\xfe\xa3\xd9\x0f\x6d\x47\xfa\x21\x1e\x7e\x7d\xa5\xed\xbf\x99\xfd\xb7\x61\xde\x66\xdf\xc4\xfd\x90\x36\x6d\x4f\xb2\xaf\x6d\x23\xbe\x7c\x78\xfd\xc7\x9f\xbf\x3c\xdf\x39\xe2\xe3\x35\xf5\x83\xef\xf1\xf3\x45\x16\x77\x69\x59\xdd\x7e\x7e\xf3\xe3\xf7\xf8\x5f\x7f\x7a\x39\xfa\xe9\x46\xba\xbe\x6a\xcf\x3f\xfd\xe5\x0b\xfd\xe7\xaf\xff\xd3\x93\xee\x46\xba\x9f\xfe\xf2\xe5\xa7\x1b\x4d\xff\x17\xfd\x5f\xd4\x4f\x3f\xbf\x91\x8e\x5d\x47\xce\x83\xf9\x3a\xb5\x9f\xfe\xf2\xb2\x50\x7f\xf3\x86\x38\xa6\x35\x19\xfa\x9f\xfe\xf2\xe5\xff\xfa\xd3\x5f\xcf\xf4\xbf\xfe\xf4\xfe\xbc\xaf\x9f\x7c\x19\x39\xcd\x78\x18\x33\x34\x0b\x98\x9c\xf0\x04\x91\x1c\x63\x2e\x61\x59\xcc\x27\x08\x52\x14\x80\x88\xe5\x19\x9e\x87\x09\xcc\x29\xc4\xa7\x29\xcf\xe3\x84\xc6\x84\xe1\x48\x86\x39\x1a\x41\xfa\xe7\xaf\xf4\x6d\xdc\x33\x99\x87\x9f\xfe\xf2\xe1\x6c\x5f\x67\xf3\x32\xf9\x9f\xfe\xf2\x85\xfa\x9b\xb7\xfe\xf7\x87\xbf\xef\xcf\xf1\xe5\xe5\x7b\xc5\x84\xa7\x38\x94\xa4\x90\x25\x20\x67\x53\x96\xa6\x18\xcc\xa6\x84\x24\x71\xce\x65\x80\xcb\x73\x2e\xe7\xa8\x94\xcf\x52\xcc\x12\x1e\xb3\x88\x67\x71\x9e\xb0\x88\xb0\x39\x97\x11\x3e\xa1\x7f\xfa\xd3\x0f\xce\xf0\x77\x30\xc8\x59\x84\x69\x96\xc2\x39\xcc\x32\x3e\x67\x20\x0b\x21\x97\x42\x2a\x27\x98\x70\x09\x4c\x39\x80\x93\x84\x66\xf8\x2c\x66\x38\x1a\xa3\x17\xac\xb8\x98\x4d\x49\xc2\x03\x2e\x49\x52\x82\x7f\x3d\x06\xf4\x9f\xbf\x7f\xaf\x1d\x87\xcb\xf8\xf2\x77\x3f\xe1\x38\x4d\x21\x4e\x30\xa0\x41\xc2\xc7\x71\xcc\x27\x14\x0f\x09\xe1\xe3\x14\x64\x2c\x61\x09\x66\x00\x9d\x91\x1c\xe6\x98\xf0\x3c\x9d\x13\x08\xa8\x84\xa2\x01\x4a\x00\xa0\x08\x42\xc9\x4f\xbf\x08\x61\x9e\x43\x79\x0c\x32\x3a\x8d\x59\x96\x63\xf2\x8c\x70\x71\x9a\xbf\x30\x3b\x7f\x19\x85\xe7\x09\x46\x39\xc5\x60\xc2\x60\x8e\xc2\x39\x49\x38\x16\xc0\x98\x4b\x33\x86\x80\x18\x51\x31\xf7\x6b\x10\xc6\x84\xa2\x33\x0e\x72\x14\x97\xa4\x2c\x1f\xa7\x49\x4c\xa5\x6c\x06\x21\x9d\xc5\x5c\x9e\x20\x9c\xa7\x39\xcf\xa7\x09\x66\x72\x86\x8b\x53\x80\x69\x92\x24\x0c\x9f\xa5\x28\x26\x0c\xc5\xc4\xe9\x6f\x8d\x70\x9a\xe5\x59\x12\xb3\x79\x8e\x49\xfc\x72\x39\xe3\x34\x47\x79\x9a\xf0\x31\xe6\x99\x9c\xc7\x49\x92\x91\x38\xa5\x72\xc2\xb1\x1c\xc1\x09\x0f\x33\x9e\xe5\x38\x82\x18\x9e\x01\x49\x4c\x91\xf4\x97\x21\x0c\x93\x1c\x24\x98\x50\x39\x4d\x65\x2c\x4d\x00\x83\xb9\x94\xcf\xd8\x3c\xe7\x21\xa6\x32\xcc\x52\x2f\xe7\xa1\x50\x4e\x21\x8e\xc3\x19\xc0\x7c\xc2\x80\x98\xe5\x68\x86\xe3\x59\x8e\xa5\xa8\x5f\x83\x30\xf5\xe4\xeb\xb7\x46\xf8\xb7\x9b\xfb\x3f\x42\xf8\xe9\x59\xff\x7f\x1a\xe1\x5f\x66\x29\xff\x8d\xc1\xbf\x31\xf8\x37\x06\xff\xc6\xe0\xdf\x18\xfc\x1b\x83\xdf\x09\x83\xd7\xa3\xff\xfb\x4f\xff\xfb\x97\x28\x9e\x2c\x1e\xe2\x24\xee\x49\xff\x2a\xdf\x3e\xce\xe1\xab\xe2\xa1\xa9\x5f\x32\xd2\x99\x0c\x53\xdb\xd5\x97\xb8\xef\x2f\x65\x17\xf7\xe4\x07\x23\x79\xa4\x1f\xbe\xec\x64\xf5\xcb\xe6\xeb\x87\xbf\xfc\xf7\x97\x1d\xb9\x0c\xe4\x94\x90\xee\x0b\xa0\x68\xe6\x97\x9c\x28\x6f\xbb\x94\xf4\xe9\xa5\x3d\xbf\x60\xdf\xc4\xe3\x39\x2d\x3f\x9e\x28\x8f\x9b\x9e\xfc\x92\xc1\xbe\xea\xcd\xf1\x52\x74\x71\x46\xfa\x1f\xcf\xff\x67\xc5\x37\x54\xa7\xd7\xe5\xfc\xf3\x47\x01\xf8\xb6\xf6\x3f\x95\xf1\x8b\x8c\x7b\x3d\xfb\x9f\xde\xad\xf6\x4f\x39\x21\xbf\xec\x83\xa7\x78\x1e\xe6\xbe\x7a\xfc\xc2\x8f\x77\xe4\x55\x75\xfe\x93\x0f\xff\x32\x2a\xbc\x88\xf0\x3e\xbd\xbc\x30\xe2\x7b\x1c\x7e\x86\xe2\x35\x46\xf0\x35\x7a\x09\x4d\xaf\x95\x8f\xd9\x54\x3f\xd6\xce\x56\x1c\xfc\x7b\xbc\x64\xef\x99\xb8\x8d\x6e\x1b\x2d\xbf\x65\x67\x50\xa7\x9a\xff\xa8\xbb\xe6\x5d\xc7\xa5\xaf\x9b\xd7\x38\x89\x5b\xd7\xcd\x29\x34\xb3\x15\x92\x70\x66\x31\xab\x63\xb1\x8e\xe8\xf3\xad\xac\x6f\x75\x40\xf9\x8f\xb5\x03\x2f\xfe\xd1\x63\xbe\x36\x95\x78\x0d\x67\xac\x8e\x4f\x06\x99\xfe\x95\x70\x88\x28\x78\x63\x63\xf8\xd5\xc0\x46\x3d\x44\x8e\xb9\xaf\x61\x34\x1c\x12\x2b\x67\xc4\x15\xa0\x66\x3f\x3f\xdc\x82\x73\xe6\xfb\xbd\xfd\x50\x06\x4f\x2f\xe7\xe2\x1e\x67\xdc\x51\x5c\x64\xb0\xf1\xcd\xab\x53\x07\xd9\xe3\x8e\x8f\x66\x99\xe8\xfd\x9e\x49\x99\x85\x17\x6f\xbc\x52\xfa\x16\x9e\x91\xc2\x27\x5b\x40\x8a\xff\x4a\x10\xcf\x51\xf0\x65\xa7\x86\x1d\x39\x25\x9b\x85\x22\xd1\xab\x0d\x48\x7c\xf0\xd0\x17\xce\x2e\x1b\x2c\xff\x40\x63\xfa\x02\x7d\x3f\x91\xfb\xd9\xdc\xcf\x28\x0d\xad\xd3\x39\x37\xa6\xfc\x9c\x31\xfe\x8e\xad\x57\xea\x39\xe5\x46\x74\x47\xc1\x8c\x55\xfb\x60\xe7\x35\x38\xee\x91\x53\x7f\xfd\x3a\x2d\x7f\xb1\x76\xda\x5c\x03\x99\xc3\xa4\xd8\x13\x6e\x3d\x6e\xce\x36\xa7\x6d\x07\xf3\xac\x5f\x19\x2e\xb6\x87\xd2\x29\xb6\x89\xe2\xc8\xf2\x14\x73\xd1\x56\x64\x4b\x6d\x77\x54\xc2\xab\x56\xa2\x6b\x98\x2f\xfb\xda\xa4\xd7\x1e\x95\xfa\x55\x11\xa5\xba\xb8\x4a\x1f\x5f\x0b\x3f\x3f\xc1\xb7\xe2\xdb\xfa\x4f\xcf\xb6\xdc\x7c\x7d\xa5\xbf\x8e\xbf\xce\x76\x4b\xad\x51\x64\xde\x3c\x69\x19\x00\x4a\x80\xbe\x60\x5f\xc8\x01\x5d\xec\x6c\x25\xcb\xcc\xa9\x9e\xa9\xe6\x36\x50\x59\x47\x47\x87\x53\x83\x63\x3e\x16\xd8\x93\x05\x7b\xa8\x0b\xb8\xad\x4e\xd8\x86\xa5\x2b\xc6\x36\x7f\xb1\xa2\xd5\x25\x8c\x44\x54\x36\xe2\xf0\x75\x92\xe2\xd2\x70\x78\x63\xbf\xd5\x63\x7e\x4d\x7a\xac\x2f\x61\xba\xdd\x1f\x03\x59\x6f\xb3\x07\xab\xb0\xc0\xd0\x5c\x50\x6c\xa6\xfa\xa6\x0c\xef\xf8\xb2\xd6\x0e\xd8\xf5\x78\x96\x18\x67\x40\x31\x63\xbb\xd7\xc3\xf3\xd5\x4c\x06\x90\x6e\xdd\x8d\xed\x76\xb1\xd2\x12\x4f\x48\x3b\x77\xfd\x7a\x15\xbc\x56\xf8\x57\x0e\x51\x64\x16\xdf\x6d\xca\x78\x3b\xec\x5f\x7e\x55\x41\xb0\x43\xc2\x3b\x7e\xea\x6b\x6a\xf7\x5a\x51\x4e\x91\x52\x83\x25\x33\x25\x5f\xd9\x50\x28\xd9\x78\x4d\xa3\xa3\x3e\x8f\xc2\xad\xbc\xad\x35\xb0\xd8\x8c\x8f\xa4\x15\xd6\x5d\x1e\x4a\xb1\x44\x47\x3b\x07\x63\x31\xd4\x97\x8c\x55\x94\xdb\x03\x8f\x57\x36\x1f\x1c\x7c\x1a\x93\x72\xb3\xc6\x19\x35\x9e\x66\xb1\x88\x57\xc7\x9f\xf7\x21\xbf\x85\x3b\xff\xa5\xeb\xe1\x9f\x04\x7d\x87\x6e\xec\x87\xa6\x3a\x93\xe7\x82\xbe\x6f\xc3\xbc\x0f\xe1\x6f\x22\x6d\xbb\x0e\x99\x60\xa7\x07\x1a\x13\xda\x91\xb5\xd1\x18\xa0\x49\x6b\x66\x27\xad\x50\xa8\xed\x03\x6b\xb5\xf2\xb5\x68\xb7\x06\xea\x16\x89\x06\x58\x19\xab\x0d\x90\x7e\x6e\x09\xaa\x49\xba\x84\x64\x20\xed\x10\x23\xad\xdc\xcd\x06\x39\x82\xee\x01\x53\x8d\x84\x95\xb1\x67\xb6\x02\xd6\x19\xb8\x86\xbe\xbd\x65\x03\x65\xc5\x1e\x02\x7d\xb3\xdb\x44\x6b\x47\x7b\x31\xe4\xfb\xdd\x6b\xdf\x14\x00\x20\xc4\x80\x82\x2c\xc7\x20\x8c\x19\x8e\xc2\xdf\x75\xd6\x64\xfe\xfc\x65\xb3\x37\xcd\xaf\xff\x7e\xb8\x8d\xfc\x70\x52\xb2\x1b\x40\xcc\x58\x42\xe8\x22\xd6\x96\x35\x15\x04\x9a\xb0\x71\x24\xe0\xba\x91\x89\x6d\x80\x58\x39\xd4\x75\x49\x0b\x3c\x1f\xb8\x0a\x36\x74\x05\x38\x7b\xc7\x94\xff\x3a\xa9\x7f\xbd\x4d\xea\x3f\x9a\xd4\xcf\x93\xe1\x7f\xed\x64\x04\x49\x70\x81\xa0\x84\xca\xda\xf0\x14\x60\xae\x0d\xc6\xb5\x0e\x2a\x63\x19\x7e\xc4\x3a\xf8\x60\x98\xae\xad\xc9\x1e\x00\x36\x5e\x1d\x90\xbc\x0b\xd4\x1d\x56\x65\x79\xfb\x1b\x4c\x46\xd9\xbb\x7f\x6f\x32\x90\xfa\x9b\x25\x02\xd4\xaf\x9d\x95\x68\xaf\xb1\x68\xef\x77\x76\xb0\xd5\x45\x61\x23\x86\x16\x6b\x19\x6e\x18\xad\x0c\xd9\xd8\xee\xc3\xd5\xf6\xa0\x7b\xba\x20\xab\x98\xd9\x2b\xbe\xe1\x87\x81\xae\xdb\x1b\xe7\x1b\xef\xfe\xf5\x26\xb0\xff\x68\x89\xc0\xdf\x4e\x0a\xbd\x2e\x1a\xf5\x4b\xa6\x23\xf9\x01\x63\x4a\x6e\xa4\x6e\xf1\x56\xd9\x1c\x3c\x41\xb3\x7d\xc3\x39\x08\xb2\xbc\xd9\x1f\x0e\xd1\x4a\xda\xac\x55\xe4\x3b\x22\x30\xd6\x38\x00\xe6\x76\x15\xa8\x18\xee\xb5\xbf\x4e\x47\x46\x3b\xcb\x56\xa0\xbf\xdd\xa9\x38\x72\xa1\xe4\x29\x0e\xdc\x32\xfb\x8d\x27\x5a\xca\x4a\x16\x80\x66\x1e\x3c\xdd\xc5\x96\x25\xb8\xc2\x66\xbd\x5e\xc9\x11\x76\xb7\x9a\xfa\x8b\x18\x87\xe8\x5f\xbb\x36\xff\xef\x4d\xe6\x1f\x30\x8e\x7a\xfd\x41\xe0\xc3\x64\xfe\x9e\xc9\x9c\x73\x42\x7e\x8b\x1e\xa5\xef\x07\x7a\x83\x08\xb1\x0c\xce\x71\x9c\x80\x3c\xe3\x40\x4c\x00\x05\x73\x0a\x65\x80\xe2\x09\x1b\x67\x24\xa5\x08\x9b\xa4\x28\xa7\x78\x0e\x26\x28\x4f\x61\x1e\xb3\x98\xe7\x00\x45\x32\x84\x09\xe0\x33\xfc\xb5\x25\x26\xfd\x37\xee\xac\xf5\xe1\x76\x26\x56\x4b\x91\x32\xa9\x95\x76\x1f\xca\x69\x43\x37\x21\x15\xdf\x2f\x2d\xcd\x6f\xf4\xf9\x66\x4a\x77\x9b\x19\x44\x25\x95\xfc\xdb\xa4\xf2\x13\x2c\x86\xce\x3e\x7f\x6c\x84\xf3\xc3\x97\xf3\xf7\xde\x78\xbd\x7d\xc9\xcf\x9c\x3f\x5c\x2e\x3e\xf6\xc5\xf8\x85\xe7\xff\x3e\xdf\xfc\x63\xdc\x59\x96\x80\xff\x87\xbc\xf7\x68\x72\x2b\xd7\xb2\x85\xe7\xfd\x2b\x6a\x56\x03\xde\x0e\xc2\x9b\x7e\xf1\x06\x87\xde\x7b\x3f\x83\xa5\xf7\x9e\xbf\xfe\x8b\x24\x53\x4a\x16\x45\xa5\xe8\x52\xaa\x7e\xdf\x89\x7b\x23\x2a\x45\xf2\x2c\x60\x61\x63\x61\x63\x6f\x18\xee\x35\x12\x82\x03\xa3\x29\xa2\xcc\x29\x89\x38\x23\xda\x68\x84\x90\xb2\x5a\x2b\x45\xbd\x33\xc8\x0a\xa9\x18\x52\x52\x29\x61\xa4\x11\x0e\x39\x27\x9d\x3c\xdd\x87\x79\x85\xf7\x27\xea\x9d\xa8\x35\x23\x6b\x73\xc1\xe3\xbd\xbc\xc7\x9f\xc3\x5f\x92\xc7\xf0\x6f\xe5\xdd\x49\x0b\xd5\x9b\xe6\x2b\xa7\x30\xe3\x04\x43\x82\x3c\x72\xd6\x41\xc0\x2c\x36\x1a\x73\x83\x2d\x77\x42\x50\x20\x1c\xf6\x08\x6a\x22\x19\xe6\x40\x53\xc1\xb0\xa0\xe2\x74\x19\xe6\x15\xde\xcf\x0a\x1b\x5b\xd7\x23\xc3\xfe\x30\x93\x8a\x64\x61\x97\x6d\xda\xfd\x65\x6a\x36\xcf\x98\xa5\x0e\x47\xb7\xb0\x59\x36\x89\x3e\x88\x4f\xc7\x59\x47\xba\xf0\x58\x97\x4c\x3d\x1a\x7a\xf7\x41\x7f\x46\xed\xaf\x79\x4f\x3c\x87\x5f\x34\x8f\xe1\xdf\xca\xbb\x94\x54\x4b\xc4\xa4\x97\x5e\x1a\x62\xa0\x53\xc6\x71\x4a\x01\x84\x42\x70\xc6\x2c\x73\x42\x39\x02\x0c\x25\x10\x43\x04\x04\x84\x8a\x02\x82\x39\x13\xd8\x68\x4e\xcc\x89\x77\xf4\x23\xef\x7f\xa8\xde\xaf\xe2\x3d\x4f\xbe\x96\x77\xcf\x85\x35\x4a\x22\x46\x28\xa5\x5c\x6a\xa2\x08\x06\x40\x7a\xef\x30\x55\x00\x21\xa9\x98\x55\x44\x3b\x8b\x91\xc5\x46\x4a\x69\xb9\x02\x4c\x59\xc4\x18\xa0\x0a\xd1\x13\xef\xf8\xe5\xbc\x3f\x5a\xef\x57\xf1\x9e\xab\x7f\x2d\xef\x4a\x02\x41\x1d\xc4\x5e\x3b\xe9\x05\x71\x80\x3b\x8c\x80\x02\x96\x10\x4a\x31\xb3\x0e\x2a\x6f\x90\xf1\x56\x18\xee\x08\x14\x8c\x09\x2e\x00\x77\xd6\x22\x4d\x84\xe4\xa7\x9b\x5f\xaf\xe8\xcc\x0b\xeb\x7d\x39\x4e\x7f\xab\x77\x3a\x7a\x36\xcd\x0f\xe4\x30\x64\x6b\xe9\xd5\x84\xd0\xee\xb8\x98\xf4\x43\x57\xad\x0d\x6c\x95\xea\xf9\x92\x51\xd6\x19\x8a\x46\xb4\x01\x98\xdf\x16\x76\xf5\xab\x5d\xe9\xf8\x77\xe4\xec\xd6\x11\x3e\x0a\x3a\xe9\x59\xb4\xb2\xad\xae\xda\xc5\x05\x4a\x2f\x22\x4c\xf5\x5b\xb9\x64\x78\xbb\x2c\x34\x86\xa9\x48\x7b\x15\xc9\x66\xfa\x93\x75\xba\x70\xda\xfb\xd0\x08\x36\x7d\xf3\xd1\x20\xb1\xeb\x6d\x13\x8f\x06\xdd\xf4\x07\x7e\xa9\x53\x9a\xd4\xf7\xb9\x4e\xa8\xd8\xce\x0c\x7a\x13\x9a\x1a\x0e\x09\xae\xaf\x9b\x6c\x51\x5c\xbb\x71\xa7\x94\x28\x8f\x6c\x71\x22\x62\xa6\x91\xba\x7c\xdf\x6d\xed\x0b\xbc\x96\x06\x39\x04\x24\x61\x08\x21\x8d\xb0\x83\x16\x5a\xc6\x80\x75\xd2\x72\x42\x39\x33\x04\x1a\x6f\xa5\x86\x52\x7a\x69\x29\xa3\x0a\x40\x6c\xa0\xf3\x42\x1a\x75\xba\x5e\xf6\xf3\x71\xe4\xce\xf1\x73\xce\xc3\xb5\x98\x39\x1b\x3f\x2f\x97\xa2\x7e\x6b\xdf\xeb\xff\xfc\x0e\x9d\x7a\x0e\x5f\xd7\x1f\xc3\xbf\xb5\x5f\x59\xcb\x89\x73\x0e\x71\x45\xa5\x20\x58\x23\xa1\x00\x55\x16\x08\xa5\x3d\xa3\x4e\x29\x84\xa1\xe6\xd6\x69\x47\x2c\xa0\x94\x02\x03\x14\x57\x04\x11\x63\x14\x95\x48\x9e\xee\x96\xbd\xc2\xfb\xf9\x9a\x69\xca\x96\x8d\x48\x7c\x95\x5c\x84\x52\xd6\x86\xbb\xe5\xea\xb2\xba\x28\xad\xbb\x25\x1c\xad\xe9\x5a\xc1\x53\x1c\x4a\xf5\xa0\x3d\x2c\x0b\xc5\xe3\xef\xcf\xc6\xef\xcb\xf0\xd6\xed\xbc\xa7\x9f\xc3\x7f\x1f\xc7\xee\xc6\xbf\x95\x77\x44\x29\x74\x9c\x29\x6c\x1c\x11\x02\x6a\xae\x0d\xc7\xde\x7a\x2b\xa4\x65\x1c\x58\x0a\xa1\x53\xdc\x12\x47\x19\xa4\x0c\x51\xa4\x29\xe4\x9c\x03\x84\x11\x40\xd6\xf1\x13\xef\x57\xc6\xef\x3f\x54\xef\x57\xf1\xfe\x3e\x8e\x7d\x19\xef\x58\x63\xe6\x8c\xd7\xc6\xbc\xcd\x09\x80\xf1\xde\x03\xa1\x9c\x60\x6f\xaa\xc2\x88\x83\x48\x0a\xe2\x81\x20\x5a\x03\xac\x9d\xd4\x1a\x11\xc9\x20\xb4\x5e\x20\x8c\x90\x3e\xf1\x7e\x65\xfc\xfe\x43\xf5\x7e\x15\xef\xef\xe3\xd8\x97\xf1\xee\x20\x11\x82\x1a\xcd\x98\xf2\xd4\x73\x4f\x9d\x94\x50\x03\x48\x9c\x33\x84\x53\xc3\xa0\x31\x02\x43\x24\x91\xf1\x94\x22\x66\xac\x05\xc6\x2a\x48\x28\x06\x40\xe0\x77\x7b\x27\x2f\xe7\xfd\xd1\x7a\xbf\x8a\xf7\xcc\xf6\x6b\x79\x67\xcc\x20\x61\x80\x31\x96\x2a\xe4\x08\x07\x88\x29\x65\x94\x57\xc8\x19\x8b\x0d\x05\xd0\x3b\x6a\x1d\x26\xd2\x79\xcc\x99\x01\x5e\x28\xaf\x85\xc4\x86\x6b\x4d\xa9\x3d\x5d\x60\x7d\x45\xdf\xcf\xea\x7d\xef\xb8\xb6\x5f\x4d\xe7\x87\xb3\x71\x2d\xff\x08\xef\x99\xe7\xf0\xcf\xcf\x7d\xbd\x07\xff\xe6\x79\x82\xd5\x4c\x32\xc5\x25\xd7\x9c\x49\xc8\x99\xd1\xca\x59\xac\x28\x70\x44\x31\x25\x18\x87\x10\x4a\x86\xa0\x67\x54\x61\x2f\x29\x51\x58\x1b\x0f\x01\x30\xdc\x79\x60\xde\x6f\xaf\xbe\x42\xfc\xf9\xa6\x8c\x02\xae\x73\xd7\x0d\x4a\xb3\xb1\xda\x01\xc8\xe1\x60\x50\x00\xbd\x88\x6e\xae\x8a\xa2\x27\x82\x4a\x3f\x17\xae\x66\x5b\xa8\xdc\xe8\xb7\x2e\x06\xd6\xe8\x4f\xc9\xfd\x25\xf1\xd9\xe7\xf0\x4f\x42\x77\x3f\xfe\xcd\x06\xcf\x19\x80\x0a\x19\x85\x20\xd2\x82\x00\x89\x14\x7f\x33\x74\x04\x21\x47\x9a\x71\x4f\xb4\xc4\x96\x23\xcd\x11\x53\x80\x19\x4a\x80\x84\xdc\x22\xa5\x05\x36\x50\xc1\xf7\xab\xab\xaf\x10\x7f\x56\xf1\x7b\x2d\x6e\x36\xea\x4e\x67\xdb\x5f\x32\xfc\x39\xf1\xb9\xe7\xf0\xa7\xf9\xc7\xf0\x6f\x25\x1e\x38\x88\x04\x23\x5c\x23\x2d\x31\x17\x4c\x33\xcd\x99\x83\x02\x59\x63\x15\x80\x1c\x73\xca\x01\x63\x5e\x18\xe5\x01\x45\xd8\x42\xad\xb0\x26\xdc\x5b\xe6\x39\x02\xf6\xfd\xde\xea\x2b\xc4\x9f\x55\x3c\x96\x68\xb6\x6b\xd5\x74\x75\x02\x73\x9b\x4a\x0f\x55\xd7\xf1\x28\x9f\xc1\x52\xbf\x90\x35\x21\xb9\xaa\xf2\x62\x16\xc6\xfa\xdd\xc4\x4e\x4e\xf3\x47\xba\xcf\x2c\xfe\x71\x89\xcf\x3f\x87\x7f\x72\xa9\xee\xc7\xbf\x95\x78\x63\x85\x12\x4e\x3a\x4d\xb1\xb7\x88\x09\x0b\x91\x24\x0e\x21\x21\x25\x35\x88\x7b\x82\x90\x95\x80\x0b\x6c\x08\xa0\xc4\x11\xa2\x34\x00\x48\x78\x03\xad\x42\x10\xa8\xf7\x4b\xab\x3f\x27\xfe\x5e\x8b\xeb\x56\xec\xbc\x7d\x46\x5c\xfd\x11\xe2\x0b\xcf\xe1\x37\xa7\x8f\xe1\xdf\x4a\xbc\xf6\xda\x52\x27\x09\xe5\x96\x43\xae\x8d\x17\x84\x23\x09\x15\x33\x88\x68\x6e\xac\xb0\x9a\x78\xcf\x05\x71\xc6\x12\x2a\x91\x76\x18\x58\x20\x20\x61\x06\x18\xc4\xc8\x3b\xf1\x57\x9c\xf8\x3f\x54\xf1\x57\x11\xdf\x88\x7f\x2d\xf1\x18\x08\x01\xac\x25\xc8\x0a\x47\x00\x52\x18\x58\xa1\x30\x45\x5c\x53\x66\xa0\xc3\xd8\x41\xe1\x04\x37\x84\x39\x88\x31\x72\x8a\x1a\x6f\x20\x47\xd0\x5b\xc1\x8d\xd7\xef\x57\x85\x5f\xb1\xf8\xb3\x8a\x47\x8b\xb9\xae\x8c\x8e\x0e\xd3\xe1\x4e\xe1\x61\x90\x9a\xcc\x3a\xa6\x5b\xed\x4f\x5a\xdd\x90\x5f\x43\x3d\xa7\xe1\x45\xbc\xc6\xe4\x60\x35\x3c\x1d\xef\xf9\x21\x35\xb1\xc7\x07\xd7\xe2\x73\xf8\x27\xa9\xb9\x1f\xff\xe6\x68\x81\xb6\x92\x11\x6f\xbc\xd5\x18\x33\x85\x81\x47\xd0\x20\x02\xbc\xf7\x56\x79\x8e\x2d\x37\x9c\x0a\x01\x9c\x85\x5a\x4a\xfc\xe6\xd7\x23\x2f\x88\xc3\x8e\x4a\x44\x39\x78\x27\xfe\x73\x8b\x0f\xf4\xf0\x00\xdb\x5c\x55\x78\x92\xf7\x50\xb3\x50\xc0\x95\x5e\x96\xa7\xab\xae\x5d\xa8\x1e\xe2\xb3\xb9\xce\x8f\x54\x36\xdc\xad\xab\x6a\xef\x4b\x88\x7f\x04\xff\xab\x89\x87\x04\x19\x29\x84\x86\x9e\xf1\xb7\x09\x2a\x27\x0a\x52\x01\xad\x93\x46\x39\xe3\x89\x94\x8e\x01\x0f\x1d\x70\xce\x1e\x37\xea\x41\xa5\x90\xa1\x54\x22\x2c\x38\x3b\x86\xfb\xe1\xf5\x3c\xcb\x33\x16\x57\x4c\x74\xb3\x67\x15\x7f\x28\xbf\x55\x7a\x0e\x3f\x4d\x1e\xc3\xbf\x39\xee\x4c\x95\x74\xd8\x28\x86\x9d\x34\x06\x52\x8a\xa9\x34\x92\x63\xcc\xb5\xd1\x90\x10\x76\x0c\x84\x31\x8d\x30\x50\xc4\x02\xc3\x3d\xe2\x54\x20\x46\x88\x85\x4c\x00\xf9\x7e\x3b\xfb\xe7\x52\x73\xaf\xc6\x16\x66\xad\x15\x3c\xab\xed\x4f\x72\xab\x9f\x13\x5f\x7e\x0e\xff\xd0\x7d\x0c\xff\x66\x3f\x5e\x01\xca\xa0\x90\x9a\x50\xce\x80\x61\x80\x3b\x8c\xa1\x91\xc0\x50\x25\x34\x31\x96\x23\x20\x19\xb4\x5e\x68\x23\x8c\x33\xde\x12\xa5\xb0\x10\x9a\x72\xae\x98\xd1\xef\xc4\x5f\x91\x9a\x3f\x54\xf1\x57\x11\x7f\x7e\xc2\xe5\x57\x10\x0f\x85\xf6\xcc\x18\x87\x80\xf1\x5a\x03\x2f\x01\x97\x86\x68\xc1\x05\xe6\x50\x48\x22\x2d\xc4\xda\x42\x64\x21\xc7\x8a\x01\xcc\xb0\x45\x5a\x38\xac\x00\x77\xde\x29\xfb\x4e\xfc\x95\x10\xd9\x1f\xaa\xf8\xab\x88\xdf\xb6\xbf\x96\x78\x63\x9d\x27\xd4\xda\x37\xab\xa6\x6f\x83\x27\xa6\xc7\x18\xb0\xe5\xce\x33\x02\x89\xf7\x44\x62\x0e\x15\xc6\x94\x23\xec\x04\xb1\xca\x2b\xe3\x14\x74\x10\x33\x46\x8f\x7e\xfc\xf5\x1c\xc8\x59\xb1\x62\x03\xed\x43\xcb\x48\xbf\x54\x2a\x26\xdb\xeb\x45\x32\x40\xc1\xaa\x32\x18\x79\xac\x28\x71\xb1\x49\x5c\x01\xc6\xfa\x35\x16\x1b\xc2\xe8\x45\xc8\xe0\x27\xea\x7a\x0b\xf1\x95\xe7\xf0\x4f\x83\xeb\xfd\xf8\x37\x7b\x35\xd0\x53\x89\x9d\xa6\x0e\x12\x2f\x39\x40\x5c\x1b\x2e\x05\x82\x5e\x11\xc6\x90\x30\x10\x70\x80\x89\xd7\x4a\x2a\xaa\x8c\xf3\x4c\x49\xab\xb8\x74\x80\x42\xe7\x38\x7e\x27\xfe\x73\xa9\x09\xe2\xd1\x62\x37\xbe\xad\x54\x33\x43\xb0\xaa\x16\x77\x1d\xb3\x69\xa6\x17\x13\x50\xc2\xe5\x75\x6e\x10\x9b\x2c\x6a\x9b\xd9\x66\x6b\x16\x89\x91\xf8\x12\xe2\x1f\xc1\xff\x6a\xe2\x25\x40\x5a\x02\x73\x0c\xac\x4b\xc7\x34\xc6\xd4\x71\x4a\x30\x16\x52\x71\x42\x98\x16\xcc\x61\x80\xa5\xd3\x9e\x4a\x67\x18\xb3\xde\x6b\x0a\x9c\x72\x06\x58\x23\xe8\x1b\xf1\xd7\xb3\x4f\xe7\xc5\x5a\x6f\x37\x85\x43\x61\x28\x57\x5b\xbd\xce\xa4\xea\x91\xf9\xa4\x85\x58\xb2\x9d\xc6\x79\x1d\xb5\xb3\x72\x5d\xae\xc8\x84\xc5\x1b\x95\xd6\xb2\xfc\x32\xe2\xab\xcf\xe1\x7f\x35\xf1\x46\x71\xca\x2c\xa4\x50\x1a\xf7\x66\xc9\x5e\x70\x84\x00\x41\x1a\x22\xe3\x14\xd7\x0a\x00\x62\xf0\x9b\xb3\x0f\x95\xd5\x0c\x69\x2a\xbd\x10\x4a\x30\xee\x05\x73\x1a\xbf\x13\x7f\xc5\xe2\xff\x50\xc5\x5f\x45\xfc\x29\x3a\xf9\x75\xc4\x63\xae\x35\x97\x9e\x49\x2a\x0d\x70\xc2\x49\x8d\x2d\x86\x9e\x19\x89\x81\xb0\xc2\x02\x41\xac\x34\x8c\x13\x64\xbc\xa2\xcc\x28\x20\x89\xf1\x8a\x39\xe5\xa4\x24\xe8\x1b\xf1\x57\x06\xd7\x3f\x54\xf1\x57\x11\x7f\xca\xc3\x7c\x1d\xf1\x50\x0a\x41\x88\x11\x9a\x70\x64\x95\x32\x86\x6a\x0e\x39\x93\x54\x11\xa3\x20\x53\x86\x4b\xa9\x20\xf6\x1a\x19\x4f\x20\x45\x16\x4a\x87\x20\xe4\xca\x41\x43\x99\x39\x12\x7f\x3d\x11\xf2\xc2\xc1\xed\x6c\x9f\xc0\xed\xc4\xd7\x9e\xc3\x3f\x6f\xf8\x7b\xf0\x6f\x4e\x84\x00\x61\x0d\xf4\xce\x40\x0a\x3c\xe2\x8c\x32\x24\x18\x33\x8e\x78\x8a\x38\xf2\x8c\x0a\xe3\x81\xb6\xd2\x5b\x61\xa0\x95\x4c\x21\x64\xa0\x64\xda\x21\x07\x35\x3a\x7a\x35\xe8\x7a\x22\xe4\x85\x15\x4f\x3f\x42\x7c\xfd\x39\xfc\x73\x8b\xbf\x07\xff\xe6\x15\x06\x8a\x49\xc1\x15\x93\x18\x38\xa5\xb9\xc3\xda\x19\x65\xbc\xd4\x9c\xb9\xe3\xa2\x34\x01\x10\x63\xc2\x40\x0f\x9d\x06\x5e\x20\x4f\x19\x87\x00\x12\x4d\x34\xc3\xec\x48\xfc\xf5\x44\xc8\xe3\x7e\xf4\x6c\xb7\x2a\x1e\x82\x33\x3f\xfa\xf2\x76\xf5\x9b\x88\x6f\x3c\x85\xbf\x0f\x81\xc7\xf0\x6f\xf6\x6a\x18\x81\x54\x19\x68\x91\xe7\x92\x21\xa8\x11\xd3\x90\x32\xe1\x25\xc3\xde\x0a\x6b\x99\xa1\xc0\x20\xf0\x66\xe9\x9c\x20\x61\x9c\xd7\xde\x49\xeb\x9c\x60\x9c\x0a\xf1\x4e\xfc\x95\xc1\xf5\x0f\x55\xfc\x55\xc4\xcb\xf2\xd7\x12\xaf\x1d\xa0\x8e\xbc\x79\x2d\xcc\x52\xc1\x84\x74\x50\x33\xaf\x1c\x80\xd8\x51\xa5\x38\xd7\xd6\x51\xe6\x98\x32\x16\x59\x2d\xb5\x64\x82\x03\x47\x1d\x27\x4c\x11\xa5\xf9\x1b\xf1\xd7\x33\x50\xe7\x15\x37\x0b\xd2\xaa\x0f\xd9\xe1\xd0\x0b\x40\x31\xe9\xda\xfd\x62\x7e\x56\x2e\xc4\x58\xbb\x1a\xa2\x74\x12\xe4\x37\x21\x90\x69\x24\x4c\xb3\x68\x2f\x32\x50\x89\xc7\xa3\x93\xcd\xe7\xf0\x4f\x63\xcc\xfd\xf8\x37\x4f\xa0\x84\x46\x14\x08\x88\x30\xa3\x4c\x43\xeb\xa1\x73\x90\x1b\xc4\x19\x17\x48\x6a\x83\x90\xd2\x04\x4a\x2a\x95\x45\xd4\x31\x63\x0c\x45\xc0\x09\x22\x29\x64\x5e\x1f\x73\xae\xe8\x7a\x06\xea\x85\x15\x7f\x68\x70\x6d\x3d\x87\x7f\x1a\x63\xee\xc7\xbf\x39\xe7\x0a\x31\x61\xd6\x41\xa3\x30\x30\x0e\x60\x48\xa4\x95\x9e\x12\x49\xa8\xa4\x6f\x43\xa9\x97\x46\x3b\x8b\xad\x80\x5e\x40\xc3\x90\xd6\x54\x1a\x2f\x8c\xb5\x42\x0b\xf9\xe6\xd5\xa0\xeb\x89\x90\x73\x8b\x87\x91\x64\x86\x95\xa3\xbd\x66\x65\x3d\x33\xa3\x85\x8f\x77\x7b\xce\x64\x76\xc3\x65\x50\xac\xd1\x5d\x23\xd4\x19\x1f\x60\x7a\x69\xdb\x85\xf6\xc5\x04\xea\x09\x8b\x6f\x3f\x87\xff\xd5\x16\x4f\x01\xa3\xc6\x72\x23\xb9\xf1\x9a\x79\xed\xb9\x55\x82\x48\xac\xdd\x71\x27\x8f\x45\x86\x3b\xaf\xb1\x06\x40\x73\xae\x88\x91\x88\x49\xe4\x2c\x11\xdc\x6b\xc1\x14\x79\x23\xfe\x7a\x3c\xfe\x09\x8d\xf5\x89\x34\xb2\x67\xd5\xfa\x49\xc6\xf9\x73\xe2\x3b\xcf\xe1\xeb\xe5\x63\xf8\x37\xc7\xe3\x39\x73\x00\x31\xe0\x99\x16\xd8\x30\xa7\x24\xf6\x94\x50\x0b\xb9\x75\x1c\x41\x03\xb8\xb4\x06\x43\x27\xa0\x73\xd4\x59\x43\xa0\x87\x54\x3a\x43\xbd\x26\x82\x90\xa3\xc5\x5f\x8f\xc7\x9f\x57\x5c\x74\xd6\x70\x36\xd3\x7b\x53\x09\x95\xf5\x50\x84\xeb\x99\xf0\x80\xc2\x49\x1c\x95\xcc\x7e\x93\x2b\x8e\xd3\xd1\x34\x1b\xe6\xc7\x2c\x79\x3a\x95\xf9\xc3\xe2\x93\x8f\x5b\xbc\x7a\x0e\xff\x64\xf1\xf7\xe3\xdf\xec\xd5\x20\xc5\x28\x31\x9c\x49\xc6\x94\x61\x50\x19\x23\xad\x07\x9a\x53\x2f\xa1\xd1\xd6\x61\x4d\x29\x34\xd2\x49\xce\x18\xc7\x40\x20\xae\x3c\x41\x16\x3a\x44\xb8\x31\xdf\x88\xbf\xe2\xd5\xfc\xa1\x8a\xbf\x8a\xf8\x93\xc6\x7f\x1d\xf1\x1c\x00\xaf\x08\xd1\x9a\x00\xc7\x94\x45\x86\x0a\x21\x18\x65\xc6\x22\xc7\xb5\xb0\x82\x59\x87\x2d\xa6\x94\x6b\x46\xb1\x72\x4c\x70\x42\x18\x83\x9c\x5a\x46\x24\x3a\x7a\x35\xd7\xc3\xc2\x4f\x74\xf5\xc6\x2e\x41\x72\x67\x5d\xfd\xf2\x56\xdd\x9b\x88\xd7\xcf\xe1\x67\xd3\x8f\xe1\xdf\x3c\x73\x75\x98\x03\xee\xb5\xa5\xe6\x4d\x39\x24\x35\x54\x0a\x8f\xa1\x35\x1c\x4a\xc3\x20\x82\xc2\x12\xe3\x14\x71\xc2\x5a\xab\xac\x66\x1c\x63\x4f\x04\x63\x40\x48\x08\xc0\x1b\xf1\xd7\xa3\x93\x67\x15\x8f\x96\xeb\xcb\x76\xb6\xb8\x0d\x0f\x07\xa1\x4c\xab\x95\xa6\x6e\xba\x8c\xb6\x51\xae\x1a\xf2\xdd\x14\x38\x24\x52\x9d\xd6\xc4\x4d\xf2\x19\xb2\x3d\x4d\x37\xcf\xa4\xe6\xf1\x05\x4d\xe6\x39\xfc\xf7\x1e\xf7\x75\x6b\xb4\x09\x75\x9e\x7b\x41\xdf\xf4\x1d\x49\xee\xb0\x97\x92\x78\xe7\x3c\xe2\x52\x33\x2c\x20\x62\x48\x30\x01\xf5\x31\x07\x05\x3d\x83\x14\x0a\xaa\x08\x66\xc2\x11\x81\xde\x89\xbf\x22\x35\x7f\xa8\xe2\xaf\x22\xfe\x5d\x6a\xbe\x6e\x53\x82\x82\x84\x63\x6a\xb9\x06\x14\x02\x89\xa9\x24\x84\xa8\x37\x67\x91\x3b\xee\x9d\x44\x46\x0a\x27\x91\xa4\x16\x69\xc5\xa0\x06\xd4\x21\x6a\xa1\xe7\xce\x41\xe0\x2d\x7e\x27\xfe\x4a\x74\xf2\x0f\x55\xfc\x55\xc4\x9f\x62\x35\x5f\x47\x3c\xf1\x92\x4a\x81\x00\x53\x1a\x72\xe3\x11\xd7\xd4\x60\xa7\xa5\x93\x80\x59\x86\x9d\x76\x0e\x31\xc4\x18\x25\x10\x22\xa7\xb4\xb5\x48\x1b\xc7\xb5\x87\xc8\x18\xe3\xbf\x59\xfc\x95\xe5\xf1\x7f\xa8\xe2\xaf\x22\xfe\xb4\x3c\xfe\xeb\x88\x17\x14\x69\x85\xa8\x03\x8e\x28\x05\x89\x54\x08\x59\x03\x25\xd6\x46\x33\x42\x95\x93\x4e\x2b\x84\x1d\xf7\x9c\x60\xf4\x36\x1a\x60\x2d\x21\x20\x9c\x38\xa9\x99\xa2\xfa\x9d\x78\xfa\x72\xe2\x1f\xad\xf8\xab\x88\x4f\xe7\xbf\x98\x78\x63\x0c\x30\x48\x18\xec\xa4\x54\x0c\x1b\x43\xa5\x56\x96\x5b\x67\xb0\xa7\x86\x32\xa7\xb1\x24\xc8\x50\x22\x9c\xb1\x04\x68\x83\xa5\xa1\x40\x5a\xa6\x81\x80\x96\xbc\x13\xcf\x5e\x4e\xfc\xa3\x15\x7f\x15\xf1\xc9\xe9\x17\x13\x8f\x11\x80\x00\x12\x21\x00\xe0\xd8\x0b\xe7\x3d\xf3\x08\x2a\xc7\x99\xa3\xd0\x20\x43\xbc\xf2\x14\x63\x47\x29\x38\x6e\x11\x41\x08\x50\x4d\x84\x02\x12\x49\x76\x5c\x2d\xfc\x46\x3c\x7f\x39\xf1\x8f\x56\xfc\x55\xc4\x27\xe2\x5f\x4b\x3c\x93\x9e\x11\xe5\x80\x17\x40\x6a\x20\xa4\x64\x06\x7a\x2c\x89\x73\x5c\x52\x00\xa0\x22\xc0\x39\xc7\xe4\xd1\x91\xa4\x4a\x33\xac\xbd\x85\x12\x23\x8b\x95\xf2\xfa\xa8\xf1\xd7\x33\x50\x2f\xac\xf8\xd9\x96\xe3\x63\x65\xef\xf1\xcb\xbf\x97\x27\xd7\x69\xf5\x7a\xba\x15\x59\x76\xaa\x74\xa0\x11\x78\x2b\xeb\x3f\xb6\x40\xfb\x0c\xee\xec\x61\xbb\x5b\xdb\xcf\x07\xfb\x72\x2a\x3e\x68\x37\x0d\x2e\xcc\x7a\x21\x0c\x8a\x40\x9b\xdd\xb2\x57\x2e\x65\x7a\x9d\x58\xfc\x74\x81\xf8\xd5\x2d\xd0\xa9\xb3\xc6\x18\x26\x72\xc9\xe8\x60\x59\xa2\xe9\x70\xbf\x01\xf7\xc5\xd6\x3c\x17\x8c\x0b\x7d\xb0\x99\x90\x88\xcc\xef\x2a\xa8\x41\xf1\xec\x10\x75\xf9\xd3\x66\xef\x68\x23\xd8\x74\x4f\xfb\xed\x8e\x53\x98\xb3\x2d\xcb\xa7\xf2\xb5\x37\x5b\x1b\x95\xd1\xca\x72\xd1\x36\x31\xdb\x69\x16\x92\xcb\xb9\x2a\xf8\x5a\x45\xe8\xfd\x76\x39\x58\xeb\x72\x25\x15\x8c\xb4\x88\xf8\xd3\xea\xc7\xe3\x4b\x51\x83\xb4\x9b\x70\xab\x93\xf5\x75\x1b\xc9\xd5\x31\xa9\x73\xbe\x85\x3a\xb5\xb7\xc8\xac\x9a\xe9\xb8\x98\x4f\xc5\x30\xb2\x4b\xa3\xc4\xa4\x70\x50\x6d\xbf\x92\xb1\x55\x12\xe7\x75\xba\x1e\xdb\xb7\x9b\xe5\x5d\xb1\x7c\x69\x6c\x37\x26\xf5\xb1\xb1\x84\x2b\x0c\xa1\x03\x88\x12\xc2\x3c\x47\x86\x02\x82\x98\xa6\x9a\x12\x42\x1c\x45\x0c\x12\x0c\xbd\xa1\x9c\x01\x27\x1c\xe5\x84\x71\x23\xb8\xb1\x44\x7a\xf3\xf7\x7f\xfe\xc2\xd7\x33\x6d\xf6\x39\x03\x3b\x5d\x80\x75\x32\xb0\xee\xff\x1e\x03\xeb\x3e\x67\x60\xfe\xc3\xc0\xd2\xff\x6f\x18\x18\x92\xd2\x1a\xc6\x30\xb4\x54\x50\x45\xa9\x72\x98\x01\xe4\x19\x03\xce\x50\x4d\x15\x00\x42\x58\x44\x14\x24\x1a\x13\x62\x38\x72\xc6\x18\xa4\x18\xb2\x52\x09\x89\xc5\x9b\x81\x5d\xcf\x28\xba\xe7\x0c\x2c\x22\x3e\x0c\x6c\xf8\xbf\xc7\xc0\xb6\xcf\x19\x58\xf2\xc3\xc0\x32\xff\x6f\x18\x98\xd6\xd2\x9e\x26\x39\xd0\x2b\x47\x01\x7c\x9b\x80\x02\x60\x8d\x04\xd0\x70\x60\x09\x27\x42\x2a\xc6\x21\xc3\x16\x29\x4c\xbc\xd4\xd8\x61\xa4\x24\x82\x8a\x02\x7b\x54\xb0\xeb\x09\x3c\xff\x9c\x81\x9d\xd2\x11\x27\x03\x9b\xfe\x1b\x0d\xec\x87\x9b\x19\x83\x8b\xad\xc9\x0f\x18\x98\x5f\x7d\x18\x58\xf6\xdf\x68\x60\x91\xbb\x0d\x8c\x69\x2c\x8c\xb5\xd4\x40\x6e\x3d\x02\x10\x5b\xaa\xa8\x43\x10\x1a\xa2\x31\x42\x50\x68\xa6\x9d\x84\x00\x51\x0c\x99\x86\x4a\x69\x24\xb4\x81\x08\x43\xc6\x20\xb5\xf4\xdd\xc0\xae\x44\x96\xba\x4f\x19\x98\x3c\xa5\xe6\xff\xff\x66\x60\xf5\xff\xf7\x0c\xcc\x72\xe1\x21\xf7\xca\x2b\x84\x21\xb7\x4c\x79\xc6\xa5\x83\x8e\x12\x04\x3c\xa6\x10\x01\xee\x3d\x83\xc6\x7a\x8f\xa0\x61\x00\x38\x25\xbc\xa0\x90\x52\x8d\xdd\x31\x13\x8e\xaf\x67\xc2\x9f\x08\x96\xe7\x6d\x94\xb2\xb3\xb6\x22\xc1\xd5\xe7\xf3\xd9\x55\xef\x39\x7c\x32\x7c\x0c\xff\xe6\xbc\x20\xa0\x56\x29\x87\x30\xd0\xd0\x73\x82\x09\x27\x4e\x60\xa5\x99\x25\xe2\xad\xb3\x43\x8f\x3d\xe7\x8c\x41\xc5\xad\x80\xd4\x73\x86\x80\x71\x0e\x29\x29\x80\x24\x02\xbc\x11\x7f\x3d\x13\x7e\x56\xf1\x68\x75\x56\xc0\xf3\x68\x23\x82\x8b\xf8\xb0\xd1\xad\xa5\x9e\xf6\x7a\x07\x17\x33\x89\x41\x7c\x1f\x69\xb7\x43\xc3\x82\x8c\x87\x52\xb9\xc6\x68\x75\x91\x09\x4f\x3f\x9e\x9e\xea\x3f\x87\x7f\x8a\x59\xdf\x8f\x7f\x73\xe8\xd2\x21\x42\x90\x77\xc8\x09\x6b\x85\x61\x82\x51\x0e\x8c\xf4\x14\x73\x65\x34\xf2\x6f\xa3\x38\x56\x52\x08\xec\x85\x85\x52\x6a\xe6\x09\x07\xd0\x69\x24\xa4\xc6\xea\x48\xfc\xf5\x4c\xf8\x0b\x2b\xfe\xd0\xda\x8f\xc1\x73\xf8\xa7\x98\xf5\xfd\xf8\x37\x13\x4f\x8c\x66\x46\x38\x4b\xac\x76\x86\x12\xa4\x3c\x54\xca\x22\x0c\x00\xb4\x56\x5a\xc6\x85\xf1\x50\x1a\x61\x08\x83\x8a\x51\xec\x38\x43\x8a\x23\x8a\x9d\x75\xf6\x98\x25\xc1\xd7\x33\xe1\x2f\xac\xf8\x43\x0b\x2b\x87\xcf\xe1\x9f\x62\xd6\xf7\xe3\xdf\xbc\xf6\x03\x61\x21\x94\x14\x8e\x38\xcc\x0c\xe4\x9c\x48\x25\x09\xe6\x04\x71\x60\x0c\xa3\xda\x6a\x8e\x38\x34\x9a\x42\xc4\xb9\x07\x92\x2a\xa5\x84\x87\x46\x49\x8b\x11\x3a\x7a\xa9\xd7\x13\xb2\x2f\xac\xf8\xcf\xce\xa2\xfb\x94\xf8\xd1\x73\xf8\xa7\x98\xf5\xfd\xf8\x37\x6b\xbc\x77\x5a\x00\x01\x28\x42\x4e\x2b\x0e\x8d\xc2\x48\x20\x44\xb5\x36\x9e\x63\x08\x90\x74\xd6\x78\x85\x28\x31\x02\x71\x43\xa8\x76\x54\x00\xad\x9c\xa4\x86\x23\x7c\x1c\x5c\xaf\x27\x64\x9f\x18\xdc\x62\xe9\x30\x9f\x9e\x35\x9c\xb8\xce\xef\xe7\xc4\x8f\x9f\xc3\x9f\x04\x8f\xe1\xdf\x9c\x17\xc4\x94\x58\x2f\x00\x82\x10\x12\x28\x94\x94\xd2\x61\x68\x90\x64\xc4\x42\xa6\x85\xf3\x4e\x38\x22\x91\xe6\x96\x13\xeb\x28\x91\x58\x0a\x44\xa1\x04\x0e\x02\x02\xfd\x3b\xf1\x57\xdc\xe6\x3f\x54\xf1\x57\x11\x3f\x32\x5f\x4b\x3c\x84\x1c\x50\x2f\x89\xb1\x8c\x5a\xae\x19\xc7\x0a\x22\xa2\x04\x35\x0e\x33\x61\x04\xf0\x82\x50\xe1\xbd\x72\xd6\x7b\x0e\x25\x06\xc4\x0a\x2f\x88\xa4\x98\x6a\xe2\x8e\x83\xeb\xf5\x98\xf1\x59\xc5\x63\x34\x33\xe8\xeb\x79\xa8\xe2\xe9\x60\x59\xdf\x97\x51\x78\x95\x3c\x44\xb7\xfd\x4a\x17\x74\x2c\x9d\x0c\xe4\x20\xa8\x04\xb0\x3a\x1c\x1c\x42\xc7\xef\x7f\x78\x35\x99\xee\xcf\xc8\xfd\x25\xf1\x93\xe7\xf0\x4f\x83\xfb\xfd\xf8\x37\x07\xeb\xbd\x22\x8c\x6b\x8a\x3d\xc5\x82\x59\xce\x95\xc5\xd4\x20\x0a\x90\xb3\xc8\x58\x6c\xad\xd0\x84\x01\x45\xb5\x43\x48\x33\x8d\x04\x14\x5a\x40\x6d\x2c\x76\x16\x59\xf5\xf7\x7f\xfe\x22\xd7\x63\xa9\x67\xc4\x47\x17\x7a\xbe\xab\xec\x1b\x61\x3c\xd4\xae\x1d\x2b\xce\xfb\x89\x6d\x2c\x89\x46\x9c\x56\x33\xf3\xbe\x58\x04\xc5\x61\x36\xac\xab\x78\xb6\x6c\x6d\x5f\x46\xfc\xf4\x39\xfc\xaf\x26\x1e\x68\xa3\x19\x57\x0a\xb3\x63\x04\xdb\x22\x42\xbc\x33\xde\x63\x05\x0c\x96\xdc\x0b\xe8\xb1\x92\x1a\x62\x82\x04\x13\x42\x32\xea\x38\x67\x96\x10\x6e\x80\x86\xee\x1b\xf1\x57\xa4\xe6\x0f\x55\xfc\x55\xc4\x9f\xbc\xaa\x2f\xb4\x78\x8b\x1c\x06\xde\x52\xfe\x26\xe4\x1e\x39\xa4\x21\x46\x0e\x6a\x23\xa1\xa2\x44\x28\xcc\x24\x14\x52\x3b\xed\x39\x77\x1a\x69\x6c\x05\x92\x10\x41\x25\x2d\x32\xf4\x4d\x6a\xc8\xf5\xe0\xee\x0b\xbb\xfa\xe5\xfe\xb0\xfc\x2d\xc4\xcf\x9e\xc3\x3f\x27\xfe\x1e\xfc\x9b\xbd\x1a\x81\x91\xf7\x8c\x03\x41\x8d\x96\x4e\x33\x0f\x0d\xd1\x9c\x00\xcf\x1c\xc0\x58\x2b\xa9\x29\x10\xca\x73\x44\xbd\xf6\x08\x60\xc2\x24\x47\x52\x31\xa2\xa0\x94\xde\xbf\x13\x7f\xc5\xe2\xff\x50\xc5\x5f\x45\xfc\xc9\x9d\xfd\x3a\xe2\x2d\xe3\xc6\x6b\xc4\xa1\x12\x42\x3a\x2e\x28\xf1\xde\x32\xa8\x81\x70\xca\x58\xc7\x99\xa5\xcc\x71\x2a\x08\x63\xde\x60\xae\x84\x73\x06\x59\xac\x08\x70\x5e\x68\x48\xfe\x3e\x5d\x3a\x71\xc5\xe2\x5f\x58\xf1\xcb\xb3\x09\x6f\x22\x7e\xfe\x1c\xfe\xc9\x8f\xbf\x1f\xff\xe6\xa5\xc4\x84\x6a\x06\x39\xb4\x8e\x13\xae\x34\x46\x58\x63\x63\x15\x45\x48\x02\x89\xb1\xf5\x58\x3a\x6b\x39\x60\xd0\x33\x87\x18\xe0\x0c\x31\x86\x9d\x37\x14\x6a\x63\xf4\x51\x6a\xae\x07\xc9\x1e\x77\xe7\xa6\xdb\x2e\x0d\x27\x3e\xdc\xb9\xc8\x43\x87\xd9\x2c\x9e\xc3\x8f\x91\xc7\xf0\x6f\x3e\x84\x15\x70\x8e\x2d\xe0\x4a\x2b\x84\x2d\x84\x8e\x29\xc0\x34\x40\x90\x09\x84\x24\xd1\x0e\x7a\xe9\x11\x40\x0a\x49\xc4\x04\xe2\x00\x21\x8a\x25\x63\xc8\x38\x64\xf8\x31\x43\x4c\xae\x07\xc9\xce\x2a\x1e\x2d\x86\xe8\x7c\x50\x17\x9b\x46\x8d\x64\xa6\x99\xf0\x26\xcc\x17\xe4\x10\x4e\x54\x4d\xd5\x56\x2a\xa0\x98\xde\xce\x51\x7c\xd3\x5f\x97\x7a\xfc\xc2\xab\xc9\x3e\xbe\xf6\x63\xf9\x1c\xfe\x69\x8c\xb9\x1f\xff\xe6\x90\x81\x26\xc8\x70\x0e\x08\xf2\x80\x68\xcf\x21\x63\x54\x2a\x40\x1d\x37\x0a\x7b\xc2\x01\x56\x1e\x60\xa1\xb8\x55\x9c\x6a\x08\xb4\xa0\x58\x70\xc0\x8d\xf4\x1e\x72\x74\xd4\xf8\xeb\x41\xb2\xb3\x8a\x3f\x62\x71\xd1\x8f\x4d\xac\x91\x87\x8e\x37\x5f\x3d\x87\x7f\x7e\x1f\xdb\x57\x1c\x6f\xce\x11\xe0\xd6\x51\xcd\x29\x22\xd8\x01\x0d\x18\x32\x58\x60\xec\xa9\xe0\x00\x33\xcd\x9d\xf4\x8c\x10\x8a\xb5\x23\xd2\x7b\x0a\x3c\xf6\xd8\x5b\xc3\x29\x64\xce\x30\xfd\x46\xfc\xf5\x20\xd9\x59\xc5\x63\x03\x6c\xbb\xf1\xf2\x0c\x16\x68\x1d\xfb\x48\xb5\x18\xdd\x85\x27\x0b\xda\x5a\xf5\xa3\xe3\x42\x06\x4d\xf3\x99\x4e\x7e\x17\xca\xb7\xb3\x38\xb3\xcd\x25\xfb\x9b\x28\xff\x96\x4d\xc9\x3d\x1e\x16\x5e\x3f\x83\x1f\x7f\xbf\x8f\xe7\x7e\xfc\x9b\x07\x57\x44\x3c\x11\x4c\x5b\x8e\x90\xb7\x50\x70\xaa\x05\xc1\x02\x4b\x27\x04\xd0\xd6\x39\x85\x11\x71\x88\x5a\xcd\x01\x53\x88\x29\x4f\x1d\xb1\x4a\x09\x43\x01\x87\xee\x1b\xf1\x57\xbc\x9a\x07\x2d\x6e\xa9\xb2\x74\x35\x02\xff\xb0\xb8\x87\x0e\x1e\x5e\x3f\x85\x1f\x0a\xe7\x1f\xc3\xbf\x59\xe3\x95\xc4\xce\x5b\x61\x90\x27\x8e\x50\x03\x30\x14\x86\x49\x67\x24\x15\x0c\x61\x05\x1c\xc1\x9c\x78\x02\x2c\x65\xd2\x39\x03\x11\xb1\x04\x1b\xa1\x28\xb1\x0c\x51\xf6\x46\xfc\xf5\xe8\xe4\x0b\x2b\x5e\xbe\xa8\xec\xbd\x29\xce\x9b\x1a\x6a\xf3\x5c\x79\xe5\xf4\xf7\x94\xf7\xe6\x86\xd5\x82\x0a\x66\x8e\x67\x49\x13\xe3\x91\x13\x8c\x68\x44\x11\x94\x44\x28\xc9\x91\xd5\x14\x71\x62\x1d\x22\x8c\x63\xc6\x24\x61\xd8\x01\xc3\x05\x22\xc6\x39\x70\x6a\xd8\xeb\xd1\xcf\x87\x89\x5a\x8d\xc2\xbb\x50\x2f\xfc\xe1\xaa\x44\xea\xbf\xa3\x61\xb7\xcf\x95\x57\x76\x7f\x4f\x79\x6f\x76\x87\xbd\xf7\x0c\x4a\xc8\x38\x64\x5e\x23\x4a\x01\x20\xd8\x2b\x23\x99\x50\x86\x19\x88\x05\x40\xca\x53\xc8\x99\x82\xc0\x1b\x24\x21\x10\xde\x78\x43\x08\x75\x9e\x42\xfc\xd6\xb0\xd7\x83\x7c\xe7\x45\xdc\xa5\x6b\x89\xf2\x8e\x8c\x13\xd8\x84\x4c\x38\xe3\x24\xdc\x2d\xe7\xa0\x30\xac\xf9\x62\xb3\xde\x58\xe9\x3e\x0f\x06\xf5\xdc\x6c\xc2\x93\x17\xa9\xcb\x9f\x88\xd4\x2d\x0d\xb5\x7b\x0e\xff\xe4\x95\xdd\x8f\x7f\x73\x8f\x22\x0c\x48\x28\x00\xa7\xd0\x71\x0e\x10\x61\x4c\x09\x41\xa8\xa0\xdc\x7a\x82\x1d\xb1\x90\x12\x67\x04\xd1\x4c\x2b\xfb\xe6\x05\x53\xc0\xbd\x83\xc8\x43\xab\xbc\x94\xef\xc4\x5f\x19\xa3\xfe\x50\xc5\x5f\x45\xfc\x69\xe6\xff\x75\xc4\x13\x41\x20\x35\x16\x78\xab\xa4\x36\x52\x39\x0d\x3d\xd0\x04\x4a\xed\x35\x92\x92\x7b\xae\x90\x52\x50\x43\xe7\x91\xa3\x50\x01\x06\x90\x61\x10\x02\xe2\x0d\xc2\xc6\xbc\x13\x7f\x65\x9f\xd1\x1f\xaa\xf8\xab\x88\x3f\xcd\xfc\xbf\x8e\x78\x06\x99\x61\x40\x02\xc2\x9d\x17\x5e\x1a\x25\x81\x50\x84\xbf\xfd\x4f\x11\xad\x01\x14\x84\x48\x43\x99\xa4\x44\x2a\x8b\x8c\x62\x80\x4a\xa0\x94\xe6\x04\x31\xee\x8e\xb7\xf5\x5d\x0f\x6b\xbf\xb0\xe2\x97\xd7\x2e\xde\x44\xfc\xfe\x39\xfc\xcc\xf6\x31\xfc\x9b\x13\x39\x96\x0b\x8c\x0d\xf1\x4a\x69\x20\x1c\x43\x0c\x48\x65\x3c\xe6\x90\x58\xa8\x95\x76\x88\x33\x04\x15\xd2\x18\x09\x67\x3d\xe6\x84\x51\x27\xa5\x52\x1e\x0b\x69\xd4\x9b\x3b\x4c\xaf\x47\x57\x5f\x58\xf1\xe3\x3f\x46\xef\x24\xfe\xf0\x1c\xfe\x69\xbb\xcd\xfd\xf8\x37\x9f\x74\x27\x14\x12\x6f\xa3\xaa\x25\x5c\x10\x8f\xb9\xe2\x0a\x70\xe1\xa0\x77\xce\x03\xa7\x31\x30\x8a\x11\x27\x25\xe1\x98\x30\x44\x95\x21\x4e\x01\xc6\x8d\x61\x08\x92\xe3\x19\xed\xf4\x7a\x90\xef\x85\x15\xaf\x3f\x42\x3c\x78\x0e\xff\xb4\xdd\xe6\x7e\xfc\x9b\x27\x80\x9e\x7a\xe0\x84\xc6\x9a\x62\x6c\xad\x34\x56\x01\xef\x39\x25\x40\x3b\x8f\x9d\x74\x50\x62\x26\x01\x03\x5e\x28\xa2\x01\x81\x44\x03\x87\x0d\xd4\x04\x43\xaa\xe1\xf1\x82\xca\xeb\x41\xbe\x27\xdc\x3f\x64\xf9\x60\x75\xe6\xfe\xb5\x2f\x2a\xfb\x25\xee\x2a\x7c\xae\xbc\x0b\xf1\x7b\xca\x7b\xfb\x96\x49\xad\x2d\xd2\x94\x0a\xca\x30\x85\x42\x61\xe1\xa4\xe6\x44\x6a\x4b\xb4\x30\xce\x32\xa0\xa5\xd7\x5a\x73\xc5\x34\x12\xd8\x41\xaa\x9c\x14\x94\x08\x0c\x90\x32\xc7\x1e\x75\x3d\x88\xf8\x04\x51\xab\x0c\x19\xe9\x33\xa2\xcc\xef\x68\x58\xf4\x5c\x79\xdb\xe0\xf7\x94\xf7\xf6\x20\xa5\xd6\xce\x7a\x4d\x91\xf3\x16\x5a\x6a\x25\xc7\x0e\x21\x4a\x00\x20\x44\x21\xae\x05\x84\x94\x73\x84\x21\x41\x12\x3b\xac\x95\xd0\xd0\x6b\x88\x1c\xc3\x46\x21\xf7\xd6\xb0\xd7\x83\x94\x2f\x24\xaa\xfb\x3b\x1a\x16\x3f\x57\xde\x56\xf9\xf7\x94\xf7\xf6\x6d\xfd\x02\x50\x0e\x91\x61\x16\x02\x2f\x1d\x7f\x73\xf5\x8c\xf1\x94\x28\x27\x91\x42\x9a\x68\xe8\xa8\x60\x84\x42\xef\x04\xc4\x58\x21\x82\xb1\x80\xcc\x33\x4d\x19\x3f\x4a\xf1\xf5\x20\xe8\x19\x51\x81\x6a\xa5\x49\x2f\x8e\x6c\x6e\x6a\xf2\xd5\x6a\xbb\x1d\xd4\x50\x74\x34\x1c\x55\xcd\x6a\x88\x6c\x7f\x5f\x2a\x62\x36\xb2\xad\x44\x2a\x7c\xea\xe6\x1f\x13\xcc\xc2\xe3\x61\x7f\xf2\x1c\xfe\x69\x9e\x75\x3f\xfe\xed\x57\x22\x51\x6d\x31\x46\x48\x42\x87\x81\x14\x8e\x48\x21\x98\xf5\xc8\x58\x2d\x35\xc5\x4c\x2a\xea\xa5\x03\x4a\x4a\x8e\x3d\xb0\xd2\x41\x25\x89\x90\x86\x51\x01\xb5\x42\x6f\xc4\x5f\x8f\xc5\x3d\x61\xa1\x03\x08\x27\x67\x9b\x27\x23\xc3\x8b\xca\x7e\x49\x8f\xa2\xcf\x95\x37\xb1\xfc\x3d\xe5\xbd\x79\x0c\x44\xd2\x52\xec\x91\x35\xce\x69\x07\x81\xf2\x02\x00\x4e\x19\xd1\x40\x39\x6f\x9d\x80\x52\x4b\xca\x31\x51\x96\x60\x68\xbd\x20\x88\x03\x46\xa1\xe3\xce\x0a\x25\xc1\x5b\xc3\x5e\x8f\xc5\x9d\x11\x15\xed\x8d\x42\xa0\x1e\x76\x93\x7e\x46\xae\x8a\x7a\x9e\x88\xa0\x0c\xeb\x23\x6e\x27\x31\x50\xab\x0d\x15\xea\x65\x53\xc3\x6d\x2a\x0b\xaa\xa7\x75\x9b\x1f\x3d\xaa\xf8\x78\x5a\x81\x3d\x87\x7f\xea\x51\xf7\xe3\xdf\x9c\xcf\x21\x9a\x21\x4b\x11\x86\xd0\x1d\x33\x67\x98\x4a\xcf\x09\x97\x80\x4a\x8a\x09\xf6\x92\x33\xe5\x15\xf1\x16\x03\x66\x94\x72\xde\x39\xea\xbc\xd5\x5a\x43\x40\x8e\x8b\x25\xe8\xf5\x58\xd9\x4b\x2a\x5e\xb1\xa3\xe1\xfa\x31\xe2\xf9\x73\xf8\xa7\xc8\xc5\xfd\xf8\xb7\xcf\xa3\x20\x46\x5a\x52\x03\xc0\xdb\x68\xef\x2d\x02\x1a\x31\x8b\xb8\x07\xcc\xbc\xb9\x00\x42\x30\x20\x2d\xb2\xd2\x62\x8e\x88\x16\x04\x08\x04\x9d\x60\x50\x70\xa0\xc5\x9b\x73\xc0\xae\x47\x0e\x5e\x58\xf1\x87\x72\xf6\xe2\x39\xfc\x53\xe4\xe2\x7e\xfc\x9b\x0f\x35\x35\x10\x6a\x6a\x08\xb4\x8e\x4b\x88\x99\xf4\x56\x50\xaf\xa0\x31\x1e\x40\x83\xa9\x41\xe0\x6d\xaa\x25\x85\xf7\xc8\x73\x6a\x01\x72\xca\x32\xa8\xbd\xa5\x08\x38\x04\xdf\x88\xbf\x1e\x39\x78\x61\xc5\x1f\x4a\x1d\xcb\xe7\xf0\x4f\x91\x8b\xfb\xf1\x4f\xc4\xff\xd7\x7f\xfd\xf7\x7f\xff\xd7\x7f\xff\xf7\x5f\x31\xb5\x52\x7f\xf9\xe9\xe2\xaf\x82\x1a\xbb\xff\xf9\x6b\xb5\x7b\x6f\x80\xff\xf3\x57\x6d\x3f\x73\xff\xf3\x57\x2d\x88\xe4\xe2\x7f\xc5\x82\x5a\xf0\x7f\xfe\xaa\x9a\x9e\x1b\xab\xff\xf9\x6b\xb6\xd6\xa3\xbe\xf9\x3f\x7f\x15\xb7\x13\xb7\xf8\x9f\xbf\xde\xde\xf3\x5f\x17\x2d\xf9\x63\xc8\x93\x51\xee\xb9\xd2\xc8\x5b\x81\x94\x43\x00\x7b\x40\x2c\x02\xd2\x31\x65\x9d\x01\x8e\x69\x43\x3c\x90\x02\x6b\xe2\x0d\xf6\x8a\x71\x29\x10\x38\x9e\x26\x89\xa4\xe5\x7f\x1f\xc3\x9d\xdf\x5b\x31\x99\x13\xa9\xf2\xa6\x3c\xd4\x59\x94\x0a\x70\xb3\x31\xa8\x2c\xb2\xe3\x41\x0b\x00\x9f\x14\xcb\x5c\x9a\x8f\x41\xbc\xb2\xcd\x34\xc3\x41\xeb\xe8\x29\x9c\x9f\xf4\xf6\x4f\x66\xde\x87\xd3\x04\xc9\x81\xcd\x27\xcc\x45\x59\x81\x4f\x33\x26\xd3\xaf\x1f\x6a\xcd\x4a\x2c\x27\x45\x64\x80\x7d\x63\x91\xa9\x47\xa0\xdc\x26\x36\xd1\x43\x3c\xd5\x13\x93\x49\x38\x7d\xba\x4f\x6a\x54\xce\xd1\xf3\xdf\x37\xbe\x6d\xd4\x8b\x04\x22\xba\x1f\x1c\xe2\xad\x56\xa3\x96\xdf\x4e\x3a\xb5\x40\xa7\x7c\xc6\xcd\x51\x2a\x9a\x38\x04\xcd\x61\x5d\x0a\xbb\x44\x9d\x56\x62\x3e\x68\x55\x48\xbc\x5f\x00\xed\x58\x35\xd0\xe1\x59\x66\xdb\x32\xa0\x36\xc8\xab\x70\xb8\xda\x6f\x09\x5c\xdf\xd4\x13\xd5\x79\x4e\x89\x5e\xb1\x95\x8e\x96\xff\xef\xff\xfd\xfb\x3f\x7f\xfd\x5d\x19\x79\x3c\xdf\x87\xdb\xd9\x75\x3a\x26\xe2\xa0\x3b\x19\x2f\xdc\xb6\xa8\x44\x6d\x3b\x8e\xad\x4a\xdb\xf0\x6c\x32\x8e\xc6\x56\x95\x50\xd6\x7e\x4c\xb8\x7e\xe0\xe6\x9a\xc5\x7c\xe3\xfd\x63\x53\xc9\x29\x40\x78\xe6\x51\xdc\xb1\x61\xb1\x40\x72\xea\x30\x43\xa5\xf0\xe4\x3a\xe0\xd9\xf3\xd3\x13\xf1\x23\x2f\xc6\xff\x49\xdd\x6f\xc1\xbf\x0c\x98\xde\xb9\x10\x64\x51\x9c\xb4\xdf\xd7\x23\x7c\x8a\xf9\xb9\x9a\x3c\x81\x9f\xa8\x35\x23\xeb\x27\xf0\x83\x0b\xfc\x60\x3d\x70\x2c\xda\x8a\xb6\x47\x79\x00\x87\xe5\x7d\xd8\x07\x6d\x89\xa1\xda\x37\x02\xeb\x4d\x44\x6f\x97\xbb\x08\xf1\x19\x1a\xde\xc7\x2e\xae\x7a\xf9\xd9\x91\xa9\x3f\xc7\xbf\x36\x8c\x5c\xb9\x04\xda\x21\xee\x35\x12\x82\x03\xa3\x29\xa2\xcc\x29\x89\x38\x23\xda\x68\x84\x90\xb2\x5a\x2b\x45\xbd\x33\xc8\x0a\xa9\x18\x52\x52\x29\x61\xa4\x11\x0e\x39\x27\xdd\x31\xd1\xf5\x12\xf1\xb9\x8c\x31\xfe\x60\x74\x7c\x14\x74\xd2\xb3\x68\x65\x5b\x5d\xb5\x8b\x0b\x94\x5e\x44\x98\xea\xb7\x72\xc9\xf0\x76\x59\x68\x0c\x53\x91\xf6\x2a\x92\xcd\xf4\x27\xeb\x74\xe1\x14\xb3\x6c\x04\x9b\xe1\xf9\xfb\xbe\xbb\xf9\xf1\x68\x50\x9f\x15\x43\xbd\x5d\xbf\xab\xc2\xed\x6e\x65\xd9\xc0\x8b\xc4\x2c\x92\xd9\xdb\x6e\x71\x3f\x01\xb5\x52\x7a\x9c\x89\xaa\x72\x34\xdf\x1f\x0e\xfb\xc9\xd0\xb2\xd0\x5a\x94\x23\xcb\x76\x6b\x90\x59\x8c\x8a\xfd\xe4\x20\xb9\xac\xe3\xc5\x90\xac\x37\xc9\x91\xa0\xc1\xa2\xdf\x8e\xc9\x52\xa1\x9d\x7a\x13\x82\xce\x3a\x13\x5e\x4e\x7b\xdb\x3d\xcc\x34\xd9\x2c\x83\xaa\x62\xd9\xcf\xae\xd6\x6c\xe6\x79\x14\x65\x66\xfd\xb9\x9a\xe7\x27\x69\xb2\x66\xee\xa3\x68\xcf\x88\xcc\xf9\x0f\xee\xec\xe4\xbb\x3a\xec\xea\xe2\x2f\xb1\x3f\xef\xe4\x2f\xc4\xff\x31\xc6\x7c\x03\xfe\x99\xc8\x9c\x7d\xf1\x91\x4e\xbe\x3c\x8b\x17\x3c\xe4\xb2\x3c\x8e\x3f\xe7\xe1\x5a\xcc\x3c\x81\x1f\x5c\xe0\xc7\xd6\xf5\xc8\xb0\x3f\xcc\xa4\x22\x59\xd8\x65\x9b\x76\x7f\x99\x9a\xcd\x33\x66\xa9\xc3\xd1\x2d\x6c\x96\x4d\xa2\x0f\xe2\xd3\x71\xd6\x91\x2e\xbc\x48\xe8\xff\xc4\x08\x3e\xc1\xbf\x49\x64\x9c\xb4\x50\x61\x00\x80\x72\x0a\x33\x4e\x30\x24\xc8\x23\x67\x1d\x04\xcc\x62\xa3\x31\x37\xd8\x72\x27\x04\x05\xc2\x61\x8f\xa0\x26\x92\x61\x0e\x34\x15\x0c\x0b\x7a\xcc\x2d\x9e\x89\x4c\x91\x96\x93\xd5\x6c\x79\x68\xe2\x8b\x66\x6c\x2e\xfb\xd9\xad\x1b\x4f\x47\xfb\xdd\x46\xe4\x62\x8d\x4e\x64\xdb\xcc\x95\xab\xfd\xf6\x8c\xf7\x63\xc7\x13\xb3\x3b\x1f\xa5\xbf\x7a\xd8\xca\xe9\xb9\x5c\xee\x71\xf9\xf9\x4f\xf6\xe9\x5e\x7b\xaa\xdf\x44\x28\x12\x54\x0f\x20\x58\x75\x5c\xe1\xd0\xaa\xb6\x86\x83\xd2\x30\x9b\xf1\xc5\xb8\x50\xf5\x5a\xb0\x2e\x55\xd8\x6c\x97\xcf\xeb\x04\xc6\x7c\xbb\x8b\xe3\xed\xa1\x58\x8b\xa9\x86\x89\x95\x51\x81\x96\x70\x5c\xe6\xb3\x26\xe4\xb5\x4e\xf4\x3a\x32\x1b\x02\x3c\x94\x01\xdb\x7c\x72\xb4\xaa\x44\xde\x05\x81\xd9\xe4\x20\x08\x16\xf3\xc2\xa4\xbc\x2b\x6f\x72\x2b\x52\xd6\xb5\xfd\xc1\xc7\x60\xa8\x9f\x88\x16\x4b\xfb\x24\x18\x0d\x4c\xae\x99\x2c\x26\x3e\x22\x8d\xd7\xc5\xa6\xfe\xcf\x06\xfd\x99\xd8\x9c\x19\xc0\x03\x62\xdc\x87\x17\xe4\xfe\xf8\xfc\x42\x6c\x5e\x87\xff\x98\x47\xf3\x31\x3f\x3a\x3b\xf2\xe2\x91\xce\x76\x9a\x1f\x45\x3e\xc3\xfc\x5c\x6c\xfe\x10\xfe\x4d\x9d\x5d\x4a\xaa\x25\x62\xd2\x4b\x2f\x0d\x31\xd0\x29\xe3\x38\xa5\x00\x42\x21\x38\x63\x96\x39\xa1\x1c\x01\x86\x12\x88\x21\x02\x02\x42\x45\x01\xc1\x9c\x09\x6c\x34\x3f\xde\x47\x4b\xcf\x56\xce\x3c\xde\xd9\x3f\xf1\x28\x7e\xd5\xd9\x3f\x79\x8e\xdf\x8f\xa1\x1a\x85\xf9\x3e\xf2\x83\x71\xb4\x4d\x3a\xa1\x0a\xcd\x14\x0b\x30\x37\x5a\xcf\x0f\x8b\xc9\x6c\x5c\xdb\xd5\x33\xad\xda\x2c\x1c\xe0\x44\x65\x7b\x41\xf2\x99\x38\xc4\x66\xc3\x7c\xde\xf0\xe1\x70\xd8\x1e\xc4\xa6\xa5\xad\xaf\x8f\x8a\x71\xb9\xca\xb5\x37\xcd\x54\x3a\x3c\x0e\x45\x22\x2e\xdc\x8d\x66\x0b\xd0\x34\x36\xf1\x04\xac\x47\x1a\x2e\x1a\x5d\x27\x23\xb5\xc1\x7a\xb1\x27\xb5\xf9\x74\x37\x1b\x65\x47\xa4\xd0\x49\x65\xaa\x35\x1a\x2e\x2e\x16\xa4\x15\x7d\xef\xc0\xe3\xc6\xba\xaa\xfc\x84\xee\xf2\xa9\xf9\x61\xd2\x28\xc7\xdb\x3d\xa4\x9b\x2c\x4b\x83\x5d\x3d\xbe\x4b\xa7\xe3\xaa\x1e\x2f\xa0\xae\x58\x81\x0f\xbf\xf2\x5f\x22\x0e\x8f\x79\x22\xaf\xc3\x7f\xcc\x13\xf9\x12\x71\x78\xc8\x13\x79\x35\xfe\x27\x5b\xf5\x4f\x9c\xc8\x61\xc8\xd6\xd2\xab\x09\xa1\xdd\x71\x31\xe9\x87\xae\x5a\x1b\xd8\x2a\xd5\xf3\x25\xa3\xac\x33\x14\x8d\x68\x03\x30\xbf\x2d\xec\xea\xe6\xf2\x7d\xb7\x08\x8a\xe7\xc2\x1a\x25\x11\x23\x94\x52\x2e\x35\x51\x04\x03\x20\xbd\x77\x98\x2a\x80\x90\x54\xcc\x2a\xa2\x9d\xc5\xc8\x62\x23\xa5\x3c\x5e\x61\xa5\x2c\x62\x0c\x50\x85\xe8\x49\x50\xf0\xf3\x82\x72\xb9\xf0\xe7\x5e\x41\x39\x33\x94\x23\x71\xd1\x8f\xef\x5f\x6d\xe8\xc8\xf7\x86\x89\xc7\xba\xa3\x4a\x65\x3f\x5e\xe5\x06\xdb\x50\x7a\x3c\x4e\x6e\x6b\xfd\x48\x2d\x1b\xe7\x2d\x1e\x42\xd1\xfd\x76\x94\xda\x8a\xb9\xb3\xa1\x15\x45\xa0\xaa\x83\x6e\xd7\xcc\xf5\x74\x4f\xb3\xad\x8c\x8a\x97\x28\x0c\x6f\x2b\xd5\xfc\x6e\xd5\xa9\x77\x63\xc5\x84\x57\xb1\x89\x8c\x79\x40\xe2\xc1\x5b\x67\x96\x04\x67\x87\xe3\x4a\xa3\x41\x57\xd9\xf2\x36\xea\xc3\x83\x66\x37\x3d\x9b\xad\x66\x39\x5e\xcb\xd5\xf6\x9d\x49\x6b\x9a\x5c\x54\x3b\xdd\x66\xff\xa3\x8e\xff\x12\xa1\x88\x5e\xf0\xfd\xfe\xc4\xff\x59\xb6\x52\xa7\x34\xa9\xef\x73\x9d\x50\xb1\x9d\x19\xf4\x26\x34\x35\x1c\x12\x5c\x5f\x37\xd9\xa2\xb8\x76\xe3\x4e\x29\x51\x1e\xd9\xe2\x44\xc4\x4c\x23\x75\xf5\x7d\xe5\x8b\xba\xdd\x69\x3f\xc1\xa8\x9c\x23\xa7\x83\x30\x4e\x05\xbb\x1c\x10\x2e\x79\x7c\x76\x80\xf9\xe0\x20\xfa\x81\xf7\xbf\xb2\xfc\x2f\x14\xb2\x9f\x9d\x39\x92\xfe\xc7\xc1\x67\x5f\x2c\x64\x4a\x02\x41\x1d\xc4\x5e\x3b\xe9\x05\x71\x80\x3b\x8c\x80\x02\x96\x10\x4a\x31\xb3\x0e\x2a\x6f\x90\xf1\x56\x18\xee\x08\x14\x8c\x09\x2e\x00\x77\xd6\x22\x4d\x84\xe4\x7f\x1f\x0f\xb5\x7e\xc1\x34\xe8\x92\xed\x7b\xa7\x41\x3f\x19\x21\x2f\x9e\xfe\x87\xa7\x43\x4a\x95\xc0\x01\x37\x09\x03\xda\x49\xa1\x91\x8b\xba\x5a\x71\xb9\xd3\x35\x60\xea\x6b\xbc\xed\xd6\xfb\xcd\xba\x59\xc7\x86\x64\xaf\x44\x32\xdc\x4d\x4b\xd0\x1b\x35\xd8\xec\x50\x6c\xef\x83\x08\xeb\xac\xa8\x2f\xf0\x59\x65\x51\xaa\xe4\xc2\xab\xda\x68\x32\xe8\xd6\x83\x81\x8a\x6c\xbe\x35\x44\x24\x48\x8c\x6d\xb2\xc2\x32\x9d\xf5\x30\x9b\xa9\x47\x71\x63\x81\xda\xf1\x4c\x18\x91\x24\x5e\xb9\xe5\xbc\xb6\x21\xa6\x41\xeb\x26\x98\x1e\x2a\xbd\x2a\x0a\x6d\x41\xa9\xdd\x68\xcc\x1d\x2f\xd7\xc6\xc5\x7c\xa1\x9a\x6c\x85\xa3\x38\xb7\x2b\xc1\x55\x75\x33\x6b\xd9\x7a\xb8\xd8\x6b\x2f\x8b\xb1\xed\x49\xc4\xe6\xe5\x9e\x8b\x87\x37\xb3\x50\x9c\xa4\xc8\x3e\xda\x85\xf1\x46\x4d\xbb\xe4\x66\xbb\x0c\xb7\x77\xa1\x72\xbb\x33\x75\x81\x5f\x81\x45\x35\xf3\xab\xc0\xf1\x8d\x02\x79\xb6\x2e\xe4\x11\x81\x34\x1f\x2f\x8d\x5d\xb4\xe3\xb7\x36\x8c\xfe\xe3\xe4\xbb\x97\x08\xe4\xd9\xf2\xb3\x47\x04\x66\xf2\x61\x5c\x3f\x99\x96\x44\x82\x6e\xfa\x4c\xf0\x5f\x2d\x90\xff\x2b\xcb\x9f\xfc\xf8\xfb\x11\x81\x3c\xa5\xc9\xce\x8f\x93\xbc\x2c\xf4\xb1\xcc\xbf\x4f\x20\x81\xd7\xd2\x20\x87\x80\x24\x0c\x21\xa4\x11\x76\xd0\x42\xcb\x18\xb0\x4e\x5a\x4e\x28\x67\x86\x40\xe3\xad\xd4\x50\x4a\x2f\x2d\x65\x54\x01\x88\x0d\x74\x5e\x48\xa3\xfe\x3e\x1e\x3e\xff\x82\x60\xf4\x27\x9e\xde\xbb\x8d\xb8\x45\xa2\x5c\xc9\x55\xe6\xe1\x1e\x6e\x79\x12\x8f\x2f\xe2\xf3\x03\x9f\xc6\xe4\x76\x88\xc0\xa1\x15\xb2\xe1\x1e\xb1\x2d\xc3\x63\xb5\xe3\x5a\xda\x4f\x82\xd1\x31\xb1\x4a\x27\xf6\xd3\xae\x2c\xba\xe8\xbc\xaf\x22\x05\xbf\x4b\xd8\x60\x34\x71\x85\x76\xcd\x0f\xa6\x85\x7a\x3e\xdb\x67\x89\x4c\xb4\x4d\x23\x73\x37\x9e\xc4\x22\xbb\xe4\x74\x87\x07\xd9\x6a\x78\xb7\x23\x87\xd9\x2e\xa8\x4d\xe3\x89\x19\x6e\xa3\x7c\xa8\x50\xc9\xa4\xeb\xa4\x1b\x4e\x81\xcc\x9b\xb8\xc4\xf8\x24\x4a\xba\xa3\x64\xba\xbf\x1c\x10\x9b\x6a\xb6\x0b\xcc\xda\x84\x5d\x96\x4d\xb8\xb3\xec\x4c\x28\x6c\x36\xbb\x71\x91\xda\xf4\xcd\xc7\x76\xb6\xa7\x82\xd1\x8f\x67\x9c\xd6\x61\xb0\x45\x67\x6b\x3c\x1f\x9a\x82\xbd\x10\xff\xc7\x25\xfe\x37\xe0\x9f\x05\xa3\x53\x67\x1f\x3d\x10\x0c\xd6\x67\x23\xc5\x43\x1b\x51\x9f\xc0\xdf\x2f\xca\x89\xdc\x13\xf8\xc1\x05\x7e\x40\xd9\xb2\x11\x89\xaf\x92\x8b\x50\xca\xda\x70\xb7\x5c\x5d\x56\x17\xa5\x75\xb7\x84\xa3\x35\x5d\x2b\x78\x8a\x43\xa9\x1e\xb4\x87\x65\xa1\x78\x91\xf1\x8a\x7c\x4d\xc6\xcb\x5a\x4e\x9c\x73\x88\x2b\x2a\x05\xc1\x1a\x09\x05\xa8\xb2\x40\x28\xed\x19\x75\x4a\x21\x0c\x35\xb7\x4e\x3b\x62\x01\xa5\x14\x18\xa0\xb8\x22\x88\x18\xa3\xa8\x44\xf2\xef\xff\xfc\x75\xbe\x3e\x2b\x36\x99\xef\xea\xf1\x2a\x50\x1b\x62\x21\x0e\x45\x22\xd9\x5d\x76\x19\x62\x41\xd8\x64\x0a\xab\x3c\x0c\x4f\x3c\x71\xa9\x06\x2e\x6e\xc1\x71\x19\xd1\xa9\x83\x5d\xaa\xe3\xc7\xf4\xcf\x5d\xaa\xfd\x33\x0b\xd9\x32\xfd\xe6\x99\x33\x11\xf9\x4e\x72\x3c\x32\x18\xd2\x78\x62\xde\x10\xc9\x7e\x4e\xee\xea\x0c\x15\xeb\xd1\xac\xab\x9a\xd6\x2e\x99\xaf\xe5\xe7\x99\x69\x8c\x2f\xf6\xfd\xa4\xa7\x83\x5c\xa9\x93\xa9\x54\x67\x3d\xdd\x8c\xe2\xce\xde\xa4\xe2\xa1\x59\x6c\xbd\x0e\xb3\x78\xb6\x3a\x37\x85\xfa\xa2\x4f\x83\xd6\xa1\x3c\xce\x87\x92\xed\xc8\x9b\x30\xe0\x56\x6d\x4d\x26\xb3\x4e\x2f\xb6\x9c\x4e\x13\x8b\x72\x7f\x21\x47\x6c\x9e\xde\xad\x24\x0b\xd5\xca\x8d\x46\x2c\x98\xb1\xf2\xf0\x90\x6d\x56\x7f\x95\x01\x8b\xff\xb3\x61\x7f\x22\x3a\xe7\x4a\xf1\x80\x28\xbf\x7b\x4b\xe6\x13\x4b\xfb\xbc\xd3\xbf\x10\xff\x89\x0c\xdc\xb3\xa2\xf3\x6c\xa7\x3f\x96\x31\xfd\x0c\x3e\x2a\x8e\x9e\xc0\xcf\x5f\xe0\x3f\x22\x3a\xef\xde\xd0\xf5\xe9\xed\x9d\xf5\xbf\x1b\xbf\x66\xc0\xe6\x41\xfc\x9b\x44\x0f\x51\x0a\x1d\x67\x0a\x1b\x47\x84\x80\x9a\x6b\xc3\xb1\xb7\xde\x0a\x69\x19\x07\x96\x42\xe8\x14\xb7\xc4\x51\x06\x29\x43\x14\x69\x0a\x39\xe7\x00\x61\x04\x90\x75\xfc\x24\x7a\xe8\x79\xd1\x8b\x5e\x90\x96\x50\xc9\xc6\x52\x27\xbf\x2f\x38\xfb\x41\x00\xee\x3c\xec\xfb\xfd\x89\xb6\x47\xe7\xd7\x88\x7f\xef\x74\x91\xa0\x8a\x42\x79\x55\x0a\xb8\x0c\x06\x31\x10\xe1\xf3\xc1\x08\xcc\xe3\x07\x50\x60\xd1\x61\x6c\x3c\xad\x92\x61\x77\xd2\x1a\x74\xbc\xde\x58\x23\xd3\xc3\x79\x61\x0c\xaa\xa1\x4d\x36\x52\xe8\x36\x04\x98\x55\x7d\x7f\xd7\x86\x84\xe7\x42\x83\x4d\x35\xdc\x55\x93\xe9\x66\xae\x73\xfd\xe0\x7d\x8d\x51\xa6\x91\x9a\xa8\xc1\x61\xd8\x8f\xac\xf8\xee\x10\xf6\x28\x03\x27\xb1\x46\xdc\xcd\x64\x6d\xd4\x6e\xb4\x47\x59\x98\xc0\x26\x9a\xef\xe6\xdc\xaf\xa6\x8a\x5f\x2f\x7e\x75\x5c\xc8\x89\x8f\x76\x79\x48\x7c\x5e\x88\xff\x98\xc7\x77\xfc\xcf\xcb\xce\xff\xbb\xc5\xe7\x69\xf1\x5b\x9a\x56\xf8\x4f\x8a\xdf\x85\xf8\x3c\x94\x74\x78\x06\xbf\x8a\x16\x8d\x07\xf1\x6f\x12\x3f\xac\x31\x73\xc6\x6b\x63\x90\xb2\x1a\x18\xef\x3d\x10\xca\x09\xf6\x36\x89\x64\xc4\x41\x24\x05\xf1\x40\x10\xad\x01\xd6\x4e\x6a\x8d\x88\x64\x10\x5a\x2f\x10\x46\x48\x9f\xc4\x0f\x3f\x2f\x7e\x67\xd3\x8a\x7c\x24\x28\xc7\x6f\xfc\x7f\xf0\x1b\x3c\xc2\x58\x54\xf6\xf2\xab\x7c\xbb\xc3\x7a\x7a\x07\xfb\x81\x6d\x4d\xba\x15\x13\x6d\x97\xc7\x5e\xb8\x35\x39\x98\x88\xac\xe6\x52\x48\x4a\xb1\x6a\xb4\x8d\x62\xe5\x76\xbf\x4b\x63\xcb\xee\x1e\x4d\xa3\xf9\x18\xcc\xf0\x61\x2f\x9d\x93\x83\x43\xb8\xd1\x1c\x98\x52\x6f\x53\x6b\x6c\xa2\x22\xf7\x26\x5c\xc5\x83\x5e\x86\xc4\x76\x8e\xb6\x87\xb0\x48\x2f\xa6\xed\xce\x04\xd5\x7a\xd9\x76\x6d\xdb\xcb\x2d\x63\x9b\xd9\x7a\x5f\x6d\xc6\x6d\x28\x9a\xef\x7f\xec\xe4\xf8\x63\xa2\xb8\x9a\xc3\x33\x8f\xec\x21\x51\x7a\x21\xfe\x43\xd3\xd0\x17\x89\xe2\x93\xa2\xf4\xb4\x28\xae\xa2\xbd\xce\x9f\x14\xc5\x0b\x51\x7a\xb6\xfe\xf7\xe3\x97\xdf\x0f\xa1\xbb\x1f\xff\xb6\x35\x59\x90\x08\x41\x8d\x66\x4c\x79\xea\xb9\xa7\x4e\x4a\xa8\x01\x24\xce\x19\xc2\xa9\x61\xd0\x18\x81\x21\x92\xc8\x78\x4a\x11\x33\xd6\x02\x63\x15\x24\x14\x03\x20\xf0\xbb\x47\x48\x9e\x17\xc5\x73\x65\x8b\x9e\x02\x8e\xb7\xfc\xff\xf2\xa7\xc1\x57\x4c\x93\x8b\x7e\x2e\x4b\x65\x11\x4f\x9a\xd9\xa0\xd2\x8c\xab\x79\x72\xb7\xe9\x45\x06\xd5\xc6\x7a\xc8\xb2\x34\x40\x8b\x55\x2f\xd7\x4e\x4d\xc6\x41\x6b\x5c\x86\x99\x41\x26\x86\xe3\xd6\x0e\xfa\xf1\x2a\xd6\xa5\x4e\x3d\x41\x9d\x4f\x96\x37\x95\xc1\x34\x9e\xed\xf6\x23\xc8\xd6\xb1\x47\xdb\xc4\x9b\x70\x91\x7a\x3f\xb1\x47\x6a\xd3\xc2\xd2\x8d\x2b\xcb\x48\x6d\xbd\x4b\xb5\x92\xa9\x7c\x77\x97\xad\x1e\x60\x7d\x7c\xb0\xb1\xc2\xb4\x5e\xdf\x46\x63\xff\x02\x4f\x71\x98\x76\x67\x9e\xda\x43\xa2\xf4\x42\xfc\x9f\x00\xfd\x16\x51\x7c\x52\x94\x9e\x17\xc5\xe9\xfc\xf0\x47\x45\xf1\x9f\xa2\xf4\x13\xa0\xaf\x13\xc5\xca\xbc\xdd\x7b\x10\xff\xc6\xd5\xf0\x06\x09\x03\x8c\xb1\x54\x21\x47\x38\x40\x4c\x29\xa3\xbc\x42\xc7\xfb\x6e\x29\x80\xde\x51\xeb\x30\x91\xce\x63\xce\x0c\xf0\x42\x79\x2d\x24\x36\x5c\x6b\x4a\xed\xdf\xff\xf9\x4b\xbe\x24\x01\xf1\x49\x86\xf6\xf4\xc4\x2c\x2c\xe2\x69\x10\x63\x9d\xf1\xd2\x16\x9c\x6c\x93\x83\x4d\x97\x9b\x70\x51\xdb\xa4\x7d\x10\x6f\xf7\xc3\xa0\x3f\x92\xc3\x44\x7b\x74\x5c\x58\xfc\x49\x02\x22\xa8\xc4\x58\xbe\xd1\xec\xc6\x83\xea\x7a\xe9\x7b\x0b\x96\xb1\x09\x99\xc5\x95\xbe\x43\xad\x68\x25\x93\x1d\x85\x0b\xd3\xec\x3e\x63\x16\x16\x0e\x93\x4b\xbc\xef\xce\x66\x94\xee\xd6\x02\xb4\x47\x89\x6d\xb7\xd0\x88\x2f\x3a\x61\x13\x0f\x52\xed\xe2\x1c\xb0\xe8\xb6\xe0\x27\x71\xb4\x8c\x1e\x57\xc3\x2f\xb3\xf9\x58\x1e\xaa\xdc\xd0\x44\xd5\x7c\xbf\x99\xae\x0f\xb5\x5d\x39\x15\x6a\xb9\x42\x86\x1f\xec\x32\x46\x16\xbc\x5f\xdb\xf1\x55\xe3\x63\x17\xff\x33\x09\x88\xe8\x59\xc3\xdf\x99\x00\x58\x2e\x54\x76\x79\x16\x40\x78\x4c\xe4\x5e\x87\xff\x90\xc8\x9d\x25\x20\x32\x67\x1f\x3d\x20\x32\xbb\xb3\xe1\xf1\xa1\x4e\xfe\x04\xfe\xac\x33\x5a\xf6\x9e\xc0\x0f\x2e\xf0\x83\x02\xae\x73\xd7\x0d\x4a\xb3\xb1\xda\x01\xc8\xe1\x60\x50\x00\xbd\x88\x6e\xae\x8a\xa2\x27\x82\x4a\x3f\x17\xae\x66\x5b\xa8\xdc\xe8\xb7\x2e\x12\x10\xd1\x97\xec\x55\xfe\x71\x3d\x9b\xd5\x4c\x32\xc5\x25\xd7\x9c\x1d\xcf\x6c\xd4\xca\x59\xac\x28\x70\x44\x31\x25\x18\x87\x10\x4a\x86\xa0\x67\x54\x61\x2f\x29\x51\x58\x1b\x0f\x01\x30\xdc\x79\x60\xfe\xfe\xcf\x5f\xf0\x7c\xbf\x6c\x80\x6d\x6d\xc5\x82\x20\x34\xee\x2c\x52\xb5\xd6\xa6\x59\xcc\xe3\x6a\x3c\xb1\x52\x80\xef\x53\xdb\x48\x32\xbd\x91\xe9\x99\xef\x44\x9a\x99\xe3\x5d\xaa\xa7\x53\xa1\xce\xee\x42\xfd\x78\x2e\x83\x73\x0f\x06\xdf\x5a\x90\x94\x2f\x99\x7a\xcc\x35\x8b\xf8\xd6\xd9\xfd\x3b\x41\xe4\x7b\x2b\xc5\x83\xdd\x7e\x44\xbb\x9b\x68\x34\x16\xe5\x23\x30\x9b\x4b\x1d\x8e\xac\x2c\x36\xc5\x7a\xdd\xb4\x65\x65\x03\x82\xdc\xae\x31\x58\x8f\x48\xbc\x51\xcd\xc1\xc6\xbe\xbb\x80\x80\x27\x07\xb1\x29\x84\xa1\xf6\x72\x6b\xc7\xa3\xe8\xba\xe9\x79\x36\xbd\xaa\x03\xd3\x1b\x4d\xbb\xb3\xc9\x92\x1c\xe7\xab\x61\xad\x9a\x33\xea\xb0\xaa\xd8\xe5\x7a\x0d\x58\xbd\x58\x1d\xcf\x93\xa6\x92\x6c\xa6\x7d\x47\x95\x68\x23\x5b\x14\xa2\x1c\x4b\xf1\xed\x47\x41\xf7\x9f\x70\x78\xfd\xef\x4f\x54\xec\xcc\x17\x7d\x40\xe5\x07\xc5\x8f\xf6\xfd\xc9\xf3\x0b\x15\x7b\x1d\xfe\xbd\x41\xc5\x68\xf0\x4f\x57\xed\x0f\xaa\xc8\xb1\x8c\xd9\x27\xf0\xfd\x20\x3b\x7a\x02\x3f\x7f\x81\xff\x88\x8a\x9d\xf6\xbf\x47\xaf\x2e\xf9\xba\xb7\xfe\x77\xe3\x17\x13\xdd\xf4\x13\xf8\x1f\xeb\x97\xce\xed\xf1\xce\x51\x75\xde\x22\xfb\xd9\xb3\xa3\xea\x33\xf8\x9d\x76\x36\xfb\x04\xfe\xd3\x7a\x50\xeb\xb5\xa3\x4f\xf4\xc7\xa7\xf5\xa0\x1a\x0d\x7a\x0f\xe2\xdf\xe4\xae\x73\x06\xa0\x42\x46\x21\x88\xb4\x20\x40\x22\xc5\xdf\xdc\x74\x04\x21\x47\x9a\x71\x4f\xb4\xc4\x96\x23\xcd\x11\x53\x80\x19\x4a\x80\x84\xdc\x22\xa5\x05\x36\xf0\x78\xa5\x2a\x84\x2f\xf1\xd7\xaf\xde\x81\x7b\xfe\xec\x1a\xe3\x38\xe8\xc7\x67\xb2\xca\x41\xdb\x0e\x17\xbd\x60\xcd\x6c\x8d\x0c\xaa\x93\xd2\x46\xd7\xd7\x87\xfe\xaa\x4c\xa6\x11\xe3\x55\xec\xd8\xf3\x3f\xf1\xd7\x23\xa9\xdc\x70\xca\xc2\x35\xbd\x01\x9b\x30\x8d\x36\x53\xc3\xfe\xae\x35\xd1\xfb\x69\x9d\xcd\xcb\x6c\xef\xb6\x9d\xe4\xbc\x94\x4a\x54\x0f\x85\x5d\xde\xaf\xad\x60\xae\x9d\x1c\x16\xc0\x80\x8c\x97\xf9\x68\xcb\xe7\x82\xe9\x9a\xf7\xb3\xc5\xc6\x04\xe4\x9b\xfb\xc3\x68\xb6\x69\x57\x02\x70\xcc\xdd\x77\x50\xa0\x72\xd9\x74\x75\x1d\x8f\x56\x67\xb2\x94\x48\x57\xcc\xa2\x13\xae\xd2\x52\x2b\x8b\x33\xf3\xc8\xb2\x11\x0c\x5b\x60\xbe\x8e\x6d\xd5\x47\x8b\x3d\xe5\xaf\x3f\xbe\x60\xe7\xd8\xb3\x62\xbf\x30\xa1\x5f\x5a\xf6\xeb\xf0\x2f\xdb\xff\x26\xfc\x33\x7f\x3d\x77\xf6\xd1\xbd\x23\xcd\xa8\x3b\x9d\x9e\x45\x02\xea\xd7\x11\x3f\x57\xfa\x27\xf0\xbb\x15\x3b\x6f\x3f\x81\x1f\x5c\xe0\xc7\x12\xcd\x76\xad\x9a\xae\x4e\x60\x6e\x53\xe9\xa1\x37\x6b\xe4\x33\x58\xea\x17\xb2\x26\x24\x57\x55\x5e\xcc\xc2\x58\xbf\x9b\xd8\xc9\x69\xfe\xe2\x92\x90\xe8\xd7\x2c\x18\x02\x0e\x22\xc1\x08\xd7\x48\x4b\xcc\x05\xd3\x4c\x73\xe6\xa0\x40\xd6\x58\x05\x20\xc7\x9c\x72\xc0\x98\x17\x46\x79\x40\x11\xb6\x50\x2b\xac\x09\xf7\x96\x79\x8e\x80\x7d\x53\x99\xf3\x73\x42\xf3\x8d\x4e\xaf\x90\xee\x65\x7d\x7d\x2d\x93\xa9\x4e\x96\x94\x73\xeb\x49\x3d\x94\x06\xb3\x03\x47\x30\xb7\x24\x8b\x7a\x31\x1b\xb4\x52\xa8\x7b\x3c\x47\xf4\xd4\xc3\x8e\xb9\x91\x4f\xb6\xaf\x9e\x9e\x6e\x38\x1b\x8e\x8c\x16\x32\x51\x0c\x4f\x1a\xf1\x64\xce\x8e\xa3\x87\x68\x2f\xdf\x9e\x8d\x4d\xf9\xb0\x4b\xf7\x12\x63\x56\x88\x1c\x76\x87\x49\xeb\x34\xe3\x4e\x19\x38\x3a\x7f\xdf\x77\x56\xe3\x91\x6d\x5b\xa6\xca\x41\x05\x55\xf3\x25\x87\x33\xa5\xcd\x38\x12\x59\x45\x86\x68\xe0\xa7\x5d\x90\x4c\xc4\x13\xed\x61\xae\x90\x38\x94\x0b\xf3\x4d\x7b\xc4\xfb\x9d\xfe\x6a\x5c\xa4\x89\xf2\x78\x98\x1d\x6d\xc2\x85\x22\xed\x18\xd5\x8c\xcc\x5b\x26\xd5\x2b\x96\x67\x43\xb0\x44\xad\x6a\xa4\x7c\x0c\x7d\xc6\x7a\xd9\x64\x85\x67\x69\x81\x28\xb4\x42\xa4\x9d\x33\xa8\x9b\x38\xd8\x56\x64\x1c\xca\x2f\xb6\xf5\x01\xd0\x53\x5e\x09\xc3\x8d\xe9\xbe\x26\x2a\x70\x3e\x95\x7f\x40\x85\x07\x93\x0f\xfe\x7f\xf2\x7c\xde\xcb\x5f\x88\xff\xec\x41\x1c\x67\xbd\xf4\x91\x5e\x76\x3a\xc8\x2a\xfa\xf8\x0a\x99\x27\xf0\xd3\xa8\x34\x61\x4f\xe0\x07\x17\xf8\xd1\x98\x58\x88\x64\x73\x03\xea\x3c\x64\xeb\xe5\xf6\x0a\xb5\x73\xf9\x6c\x7c\xd7\x1f\x77\x76\xb1\x52\xbc\x1f\x6f\xea\x29\x48\x95\x52\x45\xeb\x4f\xef\xb4\x87\xe6\x49\xd9\x7e\x12\x1a\xfa\x04\xff\x26\x95\x31\x56\x28\xe1\xa4\xd3\x14\x7b\x8b\x98\xb0\x10\x49\xe2\x10\x12\x52\x52\x83\xb8\x27\x08\x59\x09\xb8\xc0\x86\x00\x4a\x1c\x21\x4a\x03\x80\x84\x37\xd0\x2a\x04\x81\x7a\x53\x99\xd7\x1c\x03\x94\xbc\x28\xfe\x0f\x56\x37\xe8\x93\x52\x79\x66\x58\x26\xdf\x5c\xd1\x20\x42\x59\xb3\x95\x8e\x4f\x67\x90\x94\x26\x7c\xd5\x64\x6b\xcf\x76\xf1\xd0\xa6\xcd\x3b\xa7\xe3\x13\x3f\x8b\x3d\xd6\x57\xb6\xdd\xdc\x2f\x18\xd9\x6f\xc2\x8b\x6c\x69\x01\xc2\x9b\x06\xd9\xb4\xf7\xd3\x89\x5f\x36\x77\xb3\x5d\x6a\xd9\x6f\xe7\x52\xd9\x0c\xd6\x63\x36\x0c\xed\x67\xfd\x20\xb2\x37\x62\x05\xb2\x21\xae\x0f\xbb\x6a\xae\x34\x18\x0f\xb2\xd9\x02\x2d\x2d\xb6\x3c\xb0\x6e\x32\x8a\xf2\xfc\xd1\x97\x39\xb4\xe7\xc5\xc9\xa2\x1e\x06\xe3\x41\x25\x5b\x27\xfd\x7e\xa7\x15\xf5\x20\xbd\x1a\xa6\xba\xa2\x9c\xa8\x0d\xab\x8b\x20\x3a\x10\x29\x95\x2e\xbf\x66\xf1\x73\xec\xf1\xd8\xdf\x34\xde\x52\xa3\xca\xc7\xcf\x1f\xf2\x25\x5e\x88\x7f\xd9\xfe\x37\xe1\x9f\xa9\x4c\xe1\xec\xa3\x07\x7c\x89\xc6\x19\x50\xfb\x3a\xe2\xe7\x2a\xf3\x04\x7e\x53\xaa\x65\xe2\x09\xfc\xe0\x02\x3f\x5a\xcc\x75\x65\x74\x74\x98\x0e\x77\x0a\x0f\x83\xd4\x64\xd6\x31\xdd\x6a\x7f\xd2\xea\x86\xfc\x1a\xea\x39\x0d\x2f\xe2\x35\x26\x07\xab\xe1\xe9\xd4\xce\x0f\x5f\x26\xf6\x35\xb1\x47\xed\xb5\xa5\x4e\x12\xca\x2d\x87\x5c\x1b\x2f\x08\x47\x12\x2a\x66\x10\xd1\xdc\x58\x61\x35\xf1\x9e\x0b\xe2\x8c\x25\x54\x22\xed\x30\xb0\x40\x40\xc2\x0c\x30\xe8\x78\xe6\xf9\x9b\xca\xa0\xe7\x55\x26\x75\x51\xfc\x1f\x7a\x5c\x92\xe6\x65\xb3\x88\x86\x6e\xb7\x26\x76\x34\xa8\x59\xd0\xae\xae\xf7\xf1\xc9\x38\x56\x5f\xee\xb2\x6a\x7c\xc8\x34\xfb\x1b\x92\x48\x0e\xa7\xa7\xcd\xa0\x9f\x6c\xb1\x68\xc3\x5a\x3f\x3f\x08\xcd\x07\x22\x74\x68\x6b\xd4\xd0\x0c\xf4\x42\xf3\xe6\xae\xb3\x4a\xf8\x6a\x72\xab\xc1\x70\x93\x5d\xad\xaa\x89\x20\x55\xee\x25\x8b\x83\xb4\xb5\xfd\x46\x79\x3a\xdb\xc9\x5c\xac\x52\x64\xf5\x6e\x69\x9c\xcb\xed\x12\x9b\xf2\x2c\x7d\x70\xc9\x89\xea\xf6\xf0\xa6\x1c\x7b\x53\x82\x0d\x87\x6e\x94\xf0\xad\x04\x3f\x90\xca\x7e\xa8\x74\xb4\x8a\x0f\x6d\x04\xc2\xb8\x57\x3c\xd4\x9b\xd5\xcd\x20\x56\xee\xd6\x75\xb0\x1d\x7f\x34\xd9\x1f\x52\x99\xd1\xa6\xb9\x88\x3c\xdb\xcb\x5f\x88\x7f\xd9\xfe\x37\xe1\xbf\x46\x65\x2e\x7b\xf9\x4f\x56\x7f\x7f\x99\xca\x14\x66\xad\x15\x7c\x02\x3f\xb8\xc0\x0f\xf4\xf0\x00\xdb\x5c\x55\x78\x92\xf7\x50\xb3\x50\xc0\x95\x5e\x96\xa7\xab\xae\x5d\xa8\x1e\xe2\xb3\xb9\xce\x8f\x54\x36\xdc\xad\xab\xea\x29\x98\xfe\xe5\x2a\x83\x81\x10\xc0\x5a\x82\xac\x70\x04\x20\x85\x81\x15\x0a\x53\xc4\x35\x65\x06\x3a\x8c\x1d\x14\x4e\x70\x43\x98\x83\x18\x23\xa7\xa8\xf1\x06\x72\x04\xbd\x15\xdc\x78\xfd\xa6\x32\xe7\xa7\x8a\xa5\xc9\x3a\x06\xb2\xad\x62\xbf\x96\x58\xb8\x72\xe0\xdc\x68\xb4\x8f\x64\xb3\xd6\xc5\x68\x88\x37\xd6\x8b\x49\x68\x59\x29\x2d\x50\x11\xd5\x8e\x54\x9e\x7a\xd8\x71\xf6\xf0\xc9\x8c\xe9\xd4\x00\x77\xaa\xcc\xfb\x73\x91\xe1\xf0\xdf\x7c\x9d\x48\xd0\x77\x9d\x6a\x75\x5d\xec\xcc\x47\xdb\xd5\x7e\x30\x19\x50\x1b\xae\x82\x64\xbd\x9a\xec\x97\x37\x7b\xd0\x9f\x95\x72\xfb\xc9\x6c\x44\xea\x9b\xa2\x98\x1b\x1e\x8d\x1d\xf0\x66\x99\xab\x14\x47\x05\xd4\xa5\x60\xde\xea\x2f\xf6\xb6\x5a\xb4\x6a\x4a\x59\x6f\x53\xe9\x2d\xe2\xbe\xb2\x4c\x7e\x3b\xd3\x23\x9f\xee\x16\x60\x14\x15\xcb\xd1\xe9\x16\x65\x0b\x55\x07\x75\x84\x1c\x48\x9b\xa5\x76\x49\x52\xcb\xaf\x67\x26\x1c\x31\xbd\x70\xdb\x97\x5e\xb3\x92\x2e\x76\x16\xf9\x7b\xc0\xe7\x7b\x9f\xb9\x80\x4f\x4c\xec\x17\x6a\xf3\x3a\xfc\x67\xf7\x56\x9c\x1d\x54\xf6\x48\x6f\x3b\xcd\x9c\xee\xef\x6d\xdf\xcb\xf8\x0c\xbe\x0a\x4c\xf5\x09\xfc\xcb\xfa\x3f\xe2\xd3\x9c\xd7\xff\xa1\x99\xe3\x33\xf8\xc5\x44\x37\xfb\x20\xfe\x6d\x1b\xca\xb4\x95\x8c\x78\xe3\xad\xc6\x98\x29\x0c\x3c\x82\x06\x11\xe0\xbd\xb7\xca\x73\x6c\xb9\xe1\x54\x08\xe0\x2c\xd4\x52\x62\x4e\x0d\x43\x5e\x10\x87\x1d\x95\x88\x72\xf0\xae\x76\xdf\x7d\xaa\xc8\xba\x56\x6a\x0c\x56\xb3\xd4\x52\xaf\x53\x9d\x36\xc0\x36\x19\x5f\x2c\x7b\x19\xda\x85\xb9\x7c\x75\x3c\x5b\xee\x1b\xd3\x45\x28\x52\x99\x65\x8f\x55\xb9\x4d\xed\x8e\x9e\x6c\xa4\xd1\x28\xc4\xef\x66\x31\x15\xfe\xfe\x7c\xbc\x2f\xf9\x1d\xbf\x9c\x8c\x05\x8d\x30\x2d\xce\x50\x6c\x9c\xa8\x97\x04\xb1\xe3\x7d\x8d\x26\xc3\xdd\xdd\x04\x36\x0f\x5d\x9b\x5f\x0c\xab\xd5\x3a\xdf\xfa\xd9\x1a\xcb\xbd\x99\x63\x56\xed\x86\xba\x4b\xb4\x9f\x55\x06\x5b\xda\xdb\xed\x5c\xbe\x3e\x08\x27\x1b\xf1\x6c\x7f\x66\x62\xc9\x89\x75\x7d\x2c\x82\xed\x51\x95\x90\x1c\x0d\xc3\x25\x74\x28\xcc\xf3\xa5\xb4\xc9\x04\xe1\x30\xda\x18\xe9\x53\xcd\x74\x6c\x95\xa4\x43\xdc\x4a\xe6\x48\x6d\x40\x3b\x99\xd6\x47\xc9\xae\x2b\x5e\xfb\x9f\xad\x7a\x83\xe2\xdd\xeb\x7f\x36\xbb\xa9\xf8\x2b\x15\xef\x49\xfc\x67\x63\x45\x2f\x54\x9c\x67\x7b\xfc\x4b\xf0\x3f\x39\xc5\xe8\xea\x53\x3c\xfb\xce\x9d\xf8\x89\x46\x1d\xbc\xbf\xfc\x4e\xcf\xe5\xbd\x29\x3e\x3a\xdc\x0f\xb1\xae\x9b\x14\x09\x12\x64\xa4\x10\x1a\x7a\xc6\xa5\x20\x9e\x13\x05\xa9\x80\xd6\x49\xa3\x9c\xf1\x44\x4a\xc7\x80\x87\x0e\x38\x67\x89\x64\x8c\x41\xa5\x90\xa1\x54\x22\x2c\x38\x3b\x1e\xc1\x06\xe9\x4b\xfc\xaf\x4f\xce\x60\x7b\xc8\xff\x7a\x4c\xc1\x4e\x3f\x48\x48\x77\xce\x64\xea\x7b\x79\xcb\x99\x48\x7d\x47\x57\x4d\x3f\x08\xb6\xad\x9d\xd2\xb2\x4e\x53\xc5\x41\x67\x13\xa9\x6c\xf0\x5a\xd2\x41\x4b\xef\x0f\xeb\xb9\xeb\x84\x87\x83\xe5\x3e\xbf\xac\x83\x41\x31\xdc\x05\xb8\xe2\xe1\xa1\xeb\xcc\x0a\xf6\x06\xa4\x17\x6b\x27\x0b\x62\xdc\x24\xd3\xf8\x74\x05\x96\xd5\x5a\xa7\x7b\x52\xb0\x44\x74\xdf\xee\xef\xe4\x64\x1c\x97\x60\xda\xe8\x5a\x66\x16\x4b\x99\x99\x8c\x63\x3b\x52\xe4\xf5\xd1\xb8\xad\xa6\xcb\x46\x27\x4d\xec\xf0\x57\xe7\xb0\xdd\xe8\xb3\x9d\xe5\x40\xee\xf5\x99\x3e\xb2\xc5\x8f\x2b\xc8\x0b\xf1\x9f\x3d\x87\xed\x5f\xda\x83\xbf\xff\x5d\xfa\x33\xe5\x7b\x9b\xbb\x3c\xad\x30\x8a\x2a\xe9\xb0\x51\x0c\x3b\x69\x0c\xa4\x14\x53\x69\x24\xc7\x98\x6b\xa3\x21\x21\xec\xb8\x5b\x9e\x69\x84\x81\x22\x16\x18\xee\x11\xa7\x02\x31\x42\x2c\x64\x02\xc8\x37\x85\x61\x2f\x89\x56\x5f\xee\x16\xfb\xc1\x6a\x09\xc2\xe1\x45\xd0\x1e\x1c\x0e\xbd\x71\x6e\xbe\xeb\x16\xba\xb9\x7a\x9b\xb6\x24\x5a\xbb\x54\x97\xee\x92\xab\xe2\x7a\x3a\x0c\x75\x69\xa1\xfc\xab\xa3\x3a\x22\xbd\x44\x2c\xac\xdb\xaa\xd6\xe9\x64\x70\x23\x23\x77\x99\x79\x6b\xda\xa4\xce\xe5\xb2\x20\x70\x09\x15\xd4\x22\x29\x89\x4c\xc5\xef\x40\xb3\x5e\x4b\xcc\x67\x6c\xd1\xda\x11\xee\xf3\x91\xfa\x6e\xd8\x6c\xcf\x85\x0e\x52\x79\xdf\x8e\x56\x69\xab\x55\xaa\x74\x05\x5b\x06\xc9\x7a\xf6\xad\x27\xcf\xd4\x64\xb0\x1f\x97\x66\x87\x48\xa3\xd6\x34\xa3\x43\x81\xef\x77\x95\x64\x2d\x3f\x6b\x2e\x07\xd1\x21\xc8\xfb\xbd\x6d\x67\x86\xb5\x8a\x0a\x5e\x73\x6e\xf4\x79\x7b\xdf\x19\xc7\x19\xa8\x06\x37\x67\xc1\xa3\x87\xe2\x38\x2f\xc4\xff\xc9\x6e\xc1\x9b\xfd\x9c\x33\x2f\xe0\x91\x38\xce\xf6\xcc\xb1\xec\x5e\x47\xfc\xdc\xcf\x79\x02\x3f\xde\xa8\x6f\xba\x4f\xe0\x5f\x7e\x1a\x1b\x68\x1f\x5a\x46\xfa\xa5\x52\x31\xd9\x5e\x2f\x92\x01\x0a\x56\x95\xc1\xc8\x63\x45\x89\x8b\x4d\xe2\x0a\x30\xd6\xaf\xb1\xd8\x10\x46\x2f\x56\xca\xfe\x94\xed\x9f\xe2\xdf\xb6\x1c\x5f\x01\xca\xa0\x90\x9a\x50\xce\x80\x61\x80\x3b\x8c\xa1\x91\xc0\x50\x25\x34\x31\x96\x23\x20\x19\xb4\x5e\x68\x23\x8c\x33\xde\x12\xa5\xb0\x10\x9a\x72\xae\x98\xd1\xef\x2a\xf3\x82\x68\x75\xe6\xa2\xf8\x3f\xf4\xb8\x48\x30\x98\x46\xf2\xf1\x7a\xbf\x53\xc8\xd5\x07\xcb\x66\x2b\x07\xfb\x59\x2a\x63\x12\xe4\xfa\x64\x4b\x19\xe0\x4c\x8b\x54\x76\xd7\xf1\x47\x83\xfd\x2c\x27\xb6\x8b\x52\x33\xe2\xab\xe1\xa0\x9c\x06\xc6\x27\x3a\xb5\x7e\x3a\x11\x5b\x4f\x41\x75\xbb\x6f\x4f\x0a\xf3\x5a\x3d\x85\x7a\xbb\x58\x64\x35\xe6\xbd\xf0\xa6\x3e\x8c\x24\xb1\xe9\x6e\x93\xad\xaa\xe0\x93\xfe\xa4\x31\xec\x8d\x37\x36\x3d\xab\x35\xbd\x4b\xbb\x64\x7f\xcb\x87\x5d\xe7\xeb\xc7\xa3\x1e\x55\xb7\xd1\xeb\xeb\x4a\xab\x9d\x6f\xa7\xc8\x21\x95\x89\x25\xe6\xb9\x5a\xc1\x74\x47\x3d\x4c\x36\xe9\xc3\x32\x5c\x9f\x0f\xfa\xb9\x06\x9e\x2d\x7f\x15\x3f\xba\x68\xc9\xd7\xab\x4c\x2f\xd1\xc8\x91\x67\x7b\xf9\x0b\xf1\x2f\xdb\xff\x26\xfc\xd7\xa8\xcc\x65\x2f\xff\xc9\xca\xde\xaf\x52\x99\x19\x8f\x54\x76\xe5\x27\xf0\x7f\xf8\x34\x1e\x2d\x76\xe3\xdb\x4a\x35\x33\x04\xab\x6a\x71\xd7\x31\x9b\x66\x7a\x31\x01\x25\x5c\x5e\xe7\x06\xb1\xc9\xa2\xb6\x99\x6d\xb6\x66\x91\x18\x89\xdf\xa3\x32\x50\x68\xcf\x8c\x71\x08\x18\xaf\x35\xf0\x12\x70\x69\x88\x16\x5c\x60\x0e\x85\x24\xd2\x42\xac\x2d\x44\x16\x72\xac\x18\xc0\x0c\x5b\xa4\x85\xc3\x0a\x70\xe7\x9d\xb2\xef\x2a\x83\x9f\x57\x99\xec\x45\xf1\x7f\xe8\x71\xb9\x65\xee\x60\x0e\x9d\x92\x36\x49\xde\xaf\xc0\x40\xcd\xa0\x5c\xf7\xc6\xd1\xc2\x21\xb9\x9d\xa8\x7a\xa2\xa4\x5d\x26\xd4\x4b\xd4\x1b\xfc\x74\xbe\xdd\x27\x77\x60\x84\x2b\x8d\xd5\x94\xed\x57\xc1\x3c\x35\xb3\xac\x93\x68\x0e\xb6\xad\xf2\xbe\x35\x9d\x65\x8b\x95\x83\x28\x57\x37\x07\x60\x45\x65\x5a\x5a\x14\xe3\x91\x6e\x21\xbe\x0e\x06\x22\x34\xd4\xfb\x5e\x95\x97\xfb\xae\x38\xdf\xea\x7e\x66\x51\x05\x41\x5d\xb4\x9b\x2a\x52\x2e\x93\x83\x09\x6d\x8f\xeb\xe7\x93\x39\xb9\x3c\xf4\x63\xa5\xf5\x36\x54\x76\xa6\x4a\x5c\xcc\xb4\x47\x19\x50\xdb\x54\x72\x15\xc3\xda\xb1\xb6\xcc\x12\xc2\x22\xa1\xf0\xfc\x35\xeb\x7b\x9e\xe8\xe5\x6e\x5b\x37\xf5\x67\x7b\xf9\x0b\xf1\x2f\xdb\xff\x26\xfc\x97\xa8\xcc\x0f\xbd\x7c\x7a\x1d\xf1\xcb\x54\x66\xb7\x2a\x1e\x82\x27\xf0\x7f\xf8\x74\xbd\xdd\x14\x0e\x85\xa1\x5c\x6d\xf5\x3a\x93\xaa\x47\xe6\x93\x16\x62\xc9\x76\x1a\xe7\x75\xd4\xce\xca\x75\xb9\x22\x13\x16\x6f\x54\x5a\xcb\xe3\xaf\xbe\x5c\x65\x8c\x75\x9e\x50\x6b\xdf\xfc\x15\x2a\x31\xa7\x98\x1e\x8f\xdc\xb1\xdc\x79\x46\x20\xf1\x9e\x48\xcc\xa1\xc2\x98\x72\x84\x9d\x20\x56\x79\x65\x9c\x82\x0e\x62\xc6\xe8\x71\x7d\xcf\xf9\xe1\x86\xc5\xc2\x2a\xcc\xb6\xc9\xb4\x10\xa4\xd3\x67\xcb\x76\xac\x1d\x85\xc9\x62\x23\x6c\x17\x93\x1e\x29\x9a\xca\xa2\xb6\x98\x67\x4a\xd3\x62\xad\x7e\xb4\xaa\x63\x0f\x3b\xd9\xcb\x1d\x51\xe2\x3b\x58\x6c\x5d\x8b\x12\xa7\xbe\xe3\x97\xd3\x83\xdc\xdc\xb4\x5b\x71\x11\x0f\x96\x29\x16\xdb\xa1\xde\xb6\x34\xe8\xc7\x7d\x2a\xd9\x21\x83\x65\xbe\xd0\xe9\x18\x5e\xda\x4f\x0a\xfd\x4c\x5f\x0e\x13\xad\x81\xdf\x6c\x72\xb1\x51\xb3\x7f\x48\x06\x0b\x14\x91\xf9\x44\x6c\xe1\x63\x95\xd8\x66\x30\x89\xec\xb2\xd9\x5e\xa6\xef\xe3\xa6\x9c\x3f\xaa\xc2\xc1\xc9\x04\xee\xb4\x6d\xb3\x66\x6b\x75\x37\x93\x30\x24\x87\x89\x92\xcc\x14\x76\xd3\x43\x63\x5f\x9a\xd6\x54\x68\xc9\x7a\xa4\xd6\x19\xfd\x6a\xad\xcf\x6d\x51\xe2\xf8\x99\x15\x3c\x30\xbb\x3c\xe5\xa5\x3e\xbd\x6d\xe0\x17\x8a\xf3\x3a\xfc\x67\xa3\xc4\x67\x09\xfd\x47\x66\x0f\xc5\xb3\x1d\xdd\x0f\x45\x89\x5f\x8d\x7f\x6f\x94\xb8\xf2\xf1\x9d\x7b\xf1\xcf\x62\x38\x51\x1e\x15\x38\x8f\x6a\x08\x47\xd6\x64\x68\xcb\xc9\xb9\xf5\x7a\xda\xe9\x0e\xcc\x6e\x99\x41\xa3\x48\x0d\xe1\xbe\x9f\x56\x1a\x09\xb7\x3b\x6b\x8a\x67\x63\x38\x16\x7a\x2a\xb1\xd3\xd4\x41\xe2\x25\x07\x88\x6b\xc3\xa5\x40\xd0\x2b\xc2\x18\x12\x06\x02\x0e\x30\xf1\x5a\x49\x45\x95\x71\x9e\x29\x69\x15\x97\x0e\x50\xe8\x1c\xc7\xef\x8a\xf4\x7d\x76\x15\x94\xd3\x2c\xa8\x45\x12\xe9\x71\xad\x0a\xd3\x3c\x31\xda\xcb\x76\x7f\xed\xcb\x61\x1b\x25\xeb\x7c\xd1\xad\x8a\xa1\x71\x38\xb2\x5f\x36\x5b\xc7\xed\x72\xf7\x28\x52\xa5\xd1\xa8\xbe\xff\xc3\x93\x8a\x94\xf8\x8e\x5f\x4e\xf3\x9e\xde\x76\x0c\x0c\x65\x9b\xbe\xe7\x1a\x93\x76\x30\xa7\xb5\x56\xa2\x25\xd5\xc4\xa4\x32\xe3\xcc\x1c\x6c\x1b\xc0\xc8\x62\x21\xed\x93\xac\x2e\x56\x8b\x5e\xba\xe1\x1a\xd3\x7e\x3c\x86\x5c\x3d\x91\x18\xf7\x76\x21\x1d\x59\x25\x64\xad\x54\xdd\xf4\x7d\x22\x3c\xf6\xb1\x51\x79\x78\x54\x0d\xe0\x9b\x35\x06\x49\x3d\xd4\x0a\x26\x9b\xd4\x38\x9a\x62\x95\x71\x36\x1f\x4f\x05\x20\xc4\xc6\xa3\x45\x51\xce\x27\xca\xb9\x48\x85\x4f\x3e\x96\xa4\xbe\x4a\x91\x1e\x98\x89\xbe\x54\x91\x9e\xc4\x7f\xa1\x22\x3d\x32\xd3\x78\xa5\x22\xbd\x04\xff\x09\x45\xba\x17\x3f\x91\x68\x34\xde\x27\xda\x7f\x46\x91\x24\x40\x5a\x02\x73\x3c\x74\x4b\x3a\xa6\x31\xa6\x8e\x53\x82\xb1\x90\x8a\x13\xc2\xb4\x60\x0e\x03\x2c\x9d\xf6\x54\x3a\xc3\x98\xf5\x5e\x53\xe0\x94\x33\xc0\x1a\x41\xdf\x14\xe9\xfc\x6c\xd6\x3b\x6b\x71\x9b\x22\x9d\x6a\x75\xe7\xb8\xfb\x98\x4f\x75\x6a\x45\x3e\x5e\x9e\x7b\xc3\xf1\xef\xe5\x2d\x47\x65\x0b\xa5\x71\xe7\x00\x77\x38\x28\xe7\xe7\x39\xd2\x8a\x1e\x5c\xa9\x36\xda\x4e\xa6\xc3\x0d\x8a\x94\x27\xcd\xe4\xb8\x06\x00\x9f\xa6\xa8\xec\xaa\x3e\x76\x85\x35\x0f\x37\x1b\xd3\xd4\xaa\x29\x7a\xcb\x6e\x6a\xb0\x84\xe3\x4e\x96\x03\x99\x38\x1c\x2a\x09\x64\x74\x0c\xad\xca\xf1\xa3\xca\x0c\xa3\xeb\xf2\x76\x90\x5e\x4c\xc6\xcb\x43\x6b\xd2\x88\x15\x33\x33\x50\x59\xf4\xd6\xf9\xd8\x64\x21\x3b\x3c\xa9\x7d\x08\xc6\xe6\x3c\xc0\xe9\x5f\x5d\x0b\x72\x5b\xde\x2a\x7e\x16\xbc\x7c\x60\x96\x7b\xba\x16\xe4\x19\x05\x7b\x1d\xfe\x63\x0a\xf6\x91\xb7\xfa\x97\xfa\x14\xdf\xff\xae\xfe\x91\xf2\xc5\xd6\x6a\xdf\x7d\x5a\x61\xb4\x03\xd4\x11\x6d\x25\x63\x96\x0a\x26\xa4\x83\x9a\x79\xe5\x00\xc4\x8e\x2a\xc5\xb9\xb6\x8e\x32\xc7\x94\xb1\xc8\x6a\xa9\x25\x13\x1c\x38\xea\x38\x61\x8a\x28\xcd\xff\xfe\xcf\x5f\xe8\x7c\x2f\x57\x62\xbf\xe9\xd9\x6a\x6d\x51\x2a\xc6\x63\x65\xd2\xa1\xfd\x34\xd9\x8f\x02\x50\x9a\xf5\x72\x7c\x32\x36\xc1\x3e\xcc\xcb\xa3\x7a\x63\xd7\xa6\x1f\xb1\x9e\x48\xfd\x9a\x95\x7c\x32\x0b\x8b\xc0\x48\x32\xc3\xca\xd1\x5e\xb3\xb2\x9e\x99\xd1\xc2\xc7\xbb\x3d\x67\x32\xbb\xe1\x32\x28\xd6\xe8\xae\x11\xea\x8c\x0f\x30\xbd\xb4\xed\x42\xfb\xaa\xcf\x13\xff\x8e\x5f\x8e\xe5\xa3\x4d\x1f\x05\x2e\x59\xc8\xac\xdb\xe9\x16\x5e\xd2\xa0\x5e\xc8\xb9\xc5\x64\x66\x52\xb5\x89\x28\xb2\x7d\x77\x1e\x2e\x6c\x71\x95\x6e\x26\xfb\x70\x93\xa0\x22\x4d\x92\x24\xab\x2f\xfb\xbd\x46\x1d\xee\x2c\xd5\x15\xd2\x1f\xa3\x50\xe3\x50\x1e\x95\xdb\xe5\x9e\x03\x83\xde\xb6\x7b\xec\xd5\x9b\x6e\x6b\xb8\xe9\x74\x56\xcd\x64\xdf\x25\x51\x68\x1d\xd4\xa8\x9a\xe1\x8d\x6b\xac\xd5\x12\xac\xd6\x7a\x34\x35\xc5\xd6\xa4\x32\xaf\x2e\x7e\x75\xa4\xd5\x6d\x3e\xcf\xd9\xad\x86\x41\x2b\x1b\x4a\xc0\x4c\x71\x29\x48\xb9\x10\xeb\x4d\xc6\xe9\xc1\x20\x5b\x8f\x95\x43\xe3\xf8\x66\xed\x3a\xdb\x58\x2e\xbc\x8a\x36\x2a\xad\xc4\x60\x72\xda\x42\xf4\xe1\x73\xfc\x64\xb7\x62\x70\x69\x5d\x3f\xb6\xd5\x0b\xf1\x9f\xf5\x79\x9a\x67\x1f\x99\x05\x69\xd5\x87\xec\x70\xe8\x05\xa0\x98\x74\xed\x7e\x31\x3f\x2b\x17\x62\xac\x5d\x0d\x51\x3a\x09\xf2\x9b\x10\xc8\x34\x12\xa6\x59\xb4\x17\xfb\xba\x12\x8f\xaf\xd5\x79\x35\xfe\xbd\x3e\x4f\xf3\xe3\x3b\xf7\xe2\x9f\x29\x52\xaa\x1e\x6f\x4f\x66\x41\x36\xd1\x49\xb2\xd1\xbe\xb9\x12\xd5\x68\x82\x6e\x27\xc9\xea\x36\xa0\xa5\x49\xa2\x45\xc7\xba\x54\xef\xef\x60\x17\x9e\x9d\x49\xf2\xb4\x22\x19\xc5\x29\xb3\x90\x42\x69\xdc\xdb\xec\xca\x0b\x8e\x10\x20\x48\x43\x64\x9c\xe2\x5a\x01\x40\x0c\x7e\x53\x2c\xa8\xac\x66\x48\x53\xe9\x85\x50\x82\x71\x2f\x98\xd3\xf8\xdd\xe7\x41\xcf\xfb\x3c\x9f\xac\xd5\x39\xdb\x38\xd7\x68\xd4\xbe\xb9\xb8\x77\x8e\x93\x67\x8e\x4c\xfc\x1a\xde\xe9\xa9\x7c\xfb\x7e\x24\xc8\xad\x55\x9f\x96\x77\xc6\x25\xf4\x2a\xe8\x47\xe9\x64\x38\x59\x15\x1a\x93\x4d\xb5\xe4\x9a\x95\x50\x34\x94\xe8\xce\x46\xa5\xc0\x56\xba\x95\x6a\xa8\x54\x8a\x57\x67\xf5\x7e\x35\xba\x5f\xf7\xb7\xeb\xde\x78\xb3\x8e\x6d\xf9\x70\xbb\x9b\x84\x02\x16\x07\x79\x62\x14\x5c\xa2\xf9\x21\x1f\x74\x4f\x8a\xb2\x9f\x34\x56\x89\xca\xa4\x88\x26\x13\x62\xfa\x91\xe8\xb2\x7a\x98\x3b\x16\xc4\xb7\x1c\x35\x93\xab\x55\x7f\xd5\x09\xa5\xe7\x49\x4f\xf4\xe2\x57\x33\xb4\xeb\x87\xb0\xdd\xcb\xcd\x87\x05\x9f\xde\xff\xb8\xbf\x78\x1c\x28\xcf\xde\xf7\x43\xea\xec\x77\xf8\x60\x0f\x29\xda\x0b\xf1\x9f\xbd\x4d\xba\x7a\xf6\xd9\x03\x91\xe4\xd3\x59\xfa\x27\xb4\x87\x8e\x53\x7e\x35\xfe\xaf\x14\xf5\x87\xcf\x2f\x26\x1d\x67\xdf\x3c\xcd\xda\x8f\xff\xfd\x90\x8f\x79\xd6\x06\x5f\xa8\x25\xb7\xec\x52\xe1\x5a\x73\xe9\x99\xa4\xd2\x00\x27\x9c\xd4\xd8\x62\xe8\x99\x91\x18\x08\x2b\x2c\x10\xc4\x4a\xc3\x38\x41\xc6\x2b\xca\x8c\x02\x92\x18\xaf\x98\x53\x4e\x4a\x82\xbe\x29\x2f\x7e\x5e\x79\x3f\xb9\x6e\xe8\x74\x71\xdd\x43\xf1\xaf\xb3\x16\x5e\xae\x22\xee\x8c\xad\xeb\xbd\xf3\x4c\x79\x17\x87\x99\x4c\xec\x76\xf3\x51\x68\x3f\xdd\x2f\xbb\xa3\xd8\xa0\x35\x96\xa1\xc5\x32\xe3\x0a\x2d\x94\x5c\x56\x15\xaf\x15\xf7\x38\x38\xa4\x8a\x6b\xd2\xa6\x1d\x91\x8e\xee\x28\x2a\x0b\x41\xbb\xe5\x64\xb9\x99\x5f\xc5\x4b\x60\xcb\xf6\x3d\x81\x2d\x0b\x4d\xd9\x70\x10\x0d\x37\xd7\xdf\x94\xb7\xc0\x57\x54\xce\x9a\x26\x36\x65\xba\x54\x4b\xa1\x7d\x2d\x5a\x18\x94\x7b\x85\x49\xd2\x46\x0f\xac\xb1\x9c\x66\x6a\xa5\xd9\x7a\x31\x1b\x45\x7f\xa3\xf2\xbe\x24\xfe\x11\xdd\x83\xc4\xfb\x35\xee\xd7\x7d\xa9\xdf\xa1\xbc\xbf\xba\x14\x33\xb8\xfa\x79\x91\x2e\x7e\x4c\x3e\xbe\x5a\x89\x7e\x76\x09\xe3\x3f\xfe\xba\x4d\x89\xca\xdf\xdf\xf7\x6a\xfe\x7e\x76\x67\xde\x67\x65\xfe\x9d\xfc\xfd\x38\xb2\x5d\xe3\x2f\x97\x2b\xb7\xba\x9f\xf0\x17\xbc\x42\xc9\x4f\x23\xcb\x57\x6b\xd3\x2d\x2b\x38\xa4\x10\x84\x18\xa1\x09\x47\x56\x29\x63\xa8\xe6\x90\x33\x49\xd5\x9b\xdf\xc7\x94\xe1\x52\x2a\x88\xbd\x46\xc6\x13\x48\x91\x85\xd2\x21\x08\xb9\x72\xd0\x50\x66\x8e\x4a\x2e\x5f\x92\x5b\xfd\xc4\x87\x3e\xb1\xf5\x9a\x38\xe0\x7d\x99\x96\xa0\xde\x68\xd4\xdf\xad\xe1\x5e\x75\xfc\x7e\xec\xc5\x0f\x6a\x76\x96\xdb\xcd\x2f\xe5\xa6\xd0\xa1\x50\x4c\xdb\xf5\xfc\x0c\x8b\x9a\x1a\x4e\x37\xcd\x70\x38\x16\xab\xe9\x65\x58\x4e\x4b\x03\x58\x09\xfa\x3b\x1a\x1f\x45\xc3\x96\x77\x75\x53\xa9\x42\x21\xb3\xcb\x96\x2b\xdc\xe5\x0b\x45\xb6\x88\x84\x26\xab\xe4\xdc\x39\xd2\x5c\x2f\x6a\x99\x6e\x40\x86\x68\xbb\x3c\xaa\x65\xb2\xdd\x8b\xef\x73\x95\x3d\x9a\x1f\x12\xab\x9d\x9d\x35\x87\xfb\x9e\x5a\xba\xce\xb4\x16\xda\x1f\x40\xa2\x0a\x3a\xa4\x97\x60\xc4\x34\x96\xbf\x1a\x2d\xce\xfc\xb0\xee\xc3\xd6\x7a\xf6\xbe\x08\x2e\x74\xde\x3f\x78\xc2\x8f\x39\x13\x8e\x47\xca\x13\x7d\x5d\xfb\x06\x97\x7f\xff\xbe\xec\xc1\xd9\x31\x44\x3f\x1d\x21\xcf\xf6\x15\x3c\x92\xf3\x2e\x06\x17\x73\x93\x5f\x29\x7c\xf0\xcf\x36\x7f\x21\xfe\x6d\x23\xf4\x05\x7e\xf4\x6a\x7c\xf8\xdf\x94\xe1\xf9\xfe\x77\xed\x8f\x94\xef\x68\x43\xbf\x2a\xdf\xd9\xdc\xee\x5f\x17\xbf\xbe\xc6\xdf\xbf\x2d\xfe\x7f\xc6\xdf\xe3\x1a\xfa\xb4\x66\x9d\x7e\xf4\xdd\xc3\xf9\x49\x7f\xbe\xe0\xf3\x4f\x97\xf7\x23\x2c\xf3\x49\x79\x5f\x1d\x7b\x78\xa1\xc7\xf8\xf6\x9b\xc8\xf9\x01\x5a\x77\xda\xd7\xc7\x35\xf2\x27\xf4\xeb\x57\x3d\x5d\x78\x7f\x97\x63\xe4\xd9\x98\xfb\xf1\x9c\xcd\x00\x4e\xef\xfb\x17\xc7\xde\x82\x7f\x8e\x27\x7f\xba\xbc\x67\x7c\xfe\x2c\x56\x78\xc3\x79\xe6\x40\x58\x03\xbd\x33\x90\x02\x8f\x38\xa3\x0c\x09\xc6\x8c\x23\x9e\x22\x8e\x3c\xa3\xc2\x78\xa0\xad\xf4\x56\x18\x68\x25\x53\x08\x19\x28\x99\x76\xc8\x41\xfd\xff\x91\xf7\x67\x4d\x8a\x33\xc9\xba\x28\x7c\xbf\x7e\x45\xdd\xf5\xfe\x8c\x77\x1b\x8a\x51\x8a\xb5\xed\x3b\x66\x02\x84\x98\x41\xcc\xe2\x66\x5b\x8c\x4c\x62\x9e\xf9\xf5\xc7\x12\xb2\x12\x15\x95\x23\x90\xd5\xd5\x67\x85\x75\xd7\x8b\x52\x10\xee\x31\xf8\x13\x1e\x1e\xee\x1e\xf0\xe4\xd9\x08\xad\x87\x68\xdf\xef\xd8\x51\x62\x2d\x8b\x0d\xd2\x17\x7d\x55\xee\xd9\xeb\xbc\x26\x54\xa9\x17\xe4\xf6\x52\x09\x7b\xb4\xd7\xab\x54\xb1\xb8\xcc\x22\x8c\x66\xd3\xc3\x41\x8e\xe6\x70\x3d\x0c\x4a\xbd\xa1\x9f\x83\x5e\x33\x4a\x30\xb3\xa9\x2e\x66\xeb\xad\x0e\xe1\x32\xdf\xdf\xae\xd9\xb4\x9f\x08\x0a\x90\x67\x6a\x28\x51\x9b\x66\x56\xa1\xc7\x59\xaf\xc5\xdd\x44\x6f\xaa\xe1\x34\xef\xf7\xbd\x27\x6d\xca\xc9\xa3\x54\x72\x95\x0d\x9c\x69\xaf\x53\xf4\x45\xb5\x09\x0a\x07\x16\x8d\x6a\x69\x36\x65\xa3\x14\xec\xcc\x86\xbb\x1e\x4f\x94\x06\xab\x0f\xbd\x23\xf3\xd7\xb3\xef\xdf\x82\xa6\xd7\x5b\xed\xd8\xf3\x9f\xd3\x36\x62\x73\xe8\xcd\xf3\xc9\x18\x8f\x37\x68\x8c\x5f\xb7\xe9\x5c\x8d\xd9\x03\xe9\x7f\xce\x26\x72\x45\xff\xcc\xf4\x69\xc5\xf8\x8b\x35\xc2\xd3\x73\xeb\xdf\xc2\xdf\x69\xc5\xfd\x94\xc6\xf5\x1f\xa4\xc1\x3c\xc4\xa6\xf4\x68\xf9\xb9\x69\xfe\xde\x43\xdf\xcf\x79\xe1\x1d\xf4\x7f\xdb\xf1\x3e\xc4\xa6\xf9\x5b\x78\xe8\xab\x36\xcd\xcb\x3a\x75\x95\x1c\x38\xf6\x9b\xb8\xc5\xe0\x8b\xf3\xb1\x58\x9b\x3f\x5f\x61\x75\x8f\x4d\xf8\xda\x6a\xf1\x99\x1b\x90\x39\x65\x8e\xcd\x29\x43\x96\xe6\xc2\xd6\x48\x68\xc9\xa5\x61\xc2\xa6\x5a\xd9\xdc\xa2\x8e\x05\x29\x75\x24\x30\x40\x0b\xcb\x38\xd0\x10\x6a\x03\x0b\x60\x81\x05\x45\xf4\xa4\xa5\x3c\x26\x57\x7c\xe9\xaa\x31\xbf\xb5\xee\x06\x6f\x92\xb7\x32\x1f\x9a\x79\x4b\xaf\x04\x1e\x07\xc9\xba\x49\xed\x41\x6b\xbf\xa8\x54\xd7\x3d\x98\xc0\x75\xdc\xb0\xba\xfb\x63\xbf\x5f\xab\x83\x34\x0a\x0f\x83\x9e\xbb\x4c\x16\x9d\xe2\xa1\x97\xee\x63\x3d\xca\x34\xb3\xd3\xc1\x86\x2d\xdc\x01\xf6\x4b\xbd\xd2\x58\xa4\x96\xdc\x9f\xca\x26\xcb\xc8\xf0\x94\xc5\xb9\x38\x99\xe4\xe6\xf3\x72\x75\x81\xb0\x6d\x17\x8f\x64\x0d\xed\xee\xcc\xef\xa7\x7b\xb3\x9d\xc9\x2d\x33\xb8\x04\x7a\x7b\xb7\xb5\x2e\x85\xf0\x31\xf9\x55\xb3\xb1\x19\xf1\xc5\x28\x2b\x29\x9a\xab\x6d\x6c\xba\xdc\x14\x65\xf5\x40\xfa\xd7\xe3\xff\x29\xfa\xb1\xb3\xe9\x76\xec\xd5\xd7\xa3\xac\x0e\x2c\x6e\x7b\x7f\x9d\xe2\xfb\x67\xd3\x77\xd0\x9f\xf5\x4a\xd6\xfa\x0e\xfa\xee\x35\xfd\x1b\xbc\x8d\xce\x95\x67\xdf\xa3\x71\x7b\x94\x17\xa3\x18\x10\x2e\x81\x82\xc6\x66\x14\x02\x01\xa9\x00\x84\x3a\x86\x51\x64\x94\xa3\x14\x95\xc4\x92\xd0\x7a\xda\x03\xd9\x18\x3a\x52\x1b\x61\x34\x53\x5a\x3b\xd4\x26\x8e\xf3\x8c\x32\x0f\x88\x58\xbf\x3e\x1c\xfd\x1d\x43\x83\xfa\x50\x8f\xdd\x59\x7b\x2c\x16\xdd\x02\x47\xfb\x7c\xbe\x3b\x4d\xcb\x5e\xc9\xcd\x8c\x13\xb2\x6d\x26\xbd\x15\x6b\x94\x72\x9d\x4c\xe7\xa3\x58\xd2\x8c\x2a\xf8\x6a\xab\x7a\xb0\x81\x83\x59\x57\x55\x13\x55\xb5\x76\x7a\x75\xa5\xdb\x1b\x7b\x92\xda\x2e\xec\xec\xba\xc6\x66\xe3\xc5\x92\x39\x73\x3f\x93\x1c\x35\xdc\x25\x1f\x47\xc1\x96\xd7\x27\xe9\x43\xd9\x2d\xe5\xcb\x19\x38\xf6\x9d\x3a\x2c\x8e\x06\xc5\xed\xc1\x9e\xe5\x4b\x34\x7f\xca\xe2\x1c\x8d\xb3\x7c\xa7\x4a\x28\x1a\xfa\x07\xbe\x6f\xcf\x12\x9d\x1a\x1b\x29\x91\xcd\xa4\xd3\xc3\x52\x2e\x98\x1d\xb7\xdb\xc4\x54\x53\x5f\x85\x97\xc5\xed\xdf\x84\x32\xdc\x6f\xb0\xd2\xbd\x52\xfe\x40\xfa\x6f\xdc\x0d\xf9\x27\x50\xe6\x5a\xca\xdf\xb8\x96\xe1\xdb\x50\xc6\x64\xf3\x50\xdd\x41\xdf\xbd\xa6\xff\x79\xff\xdb\xab\x58\xd2\x6f\x42\x19\xe5\x08\x48\x2c\x07\x40\x44\x09\x15\x40\x19\xa0\x35\xb0\x25\xb4\xa9\xed\x40\x26\x24\x84\x5c\x60\xc0\x08\xe3\x0a\x12\x4d\xa5\x94\x04\x5a\xda\xc1\x8c\x00\x6a\xc4\xe9\xde\x1b\x88\x1e\xe2\xc5\xfc\x65\x9f\xc1\x2f\xa2\x8e\x9b\x4e\x6c\x9f\x69\xbc\xe7\xb9\xf2\x53\x17\x4a\xb9\xcd\x3a\x76\xf6\xe1\xb0\x28\x36\x8e\x5b\x9d\x75\xb3\xbb\xad\xdc\xe6\x4b\x3d\x2b\x39\x0f\xc6\xc6\xdf\xec\x76\xee\x2c\xdf\xab\x68\xb3\xb4\x0f\x2a\xbf\x8b\xe4\xa6\x84\x71\xb7\x56\xb6\xe7\x85\x24\x1d\x65\x1a\x62\x91\xda\xa8\x66\xa5\xa3\x3c\x58\xa8\x8f\x36\x0b\x3b\x97\xb7\xf3\x3f\x11\x03\x96\x0a\x41\xbf\x51\x89\xf8\x1e\xed\xed\x81\x49\xab\x69\x7f\xbe\x4d\x17\x97\x41\xaf\xc3\xad\x88\xac\x8e\xd9\x7c\x75\x50\x68\x75\x12\xf4\x22\x65\x5f\xf1\x5c\xf9\xa2\xde\x77\x2e\x97\xc9\x7d\x9b\xc7\xf8\x79\x16\x96\xa8\xf3\xbc\x8b\xfd\xa2\xe7\x4a\x76\x77\x33\xff\xb1\x73\xb1\x98\x17\xf4\x57\x77\x69\x8f\xa3\x7f\x93\x95\x25\x75\xf1\x44\x89\xe5\xa0\xbc\x45\x2f\x39\xdf\xd6\x96\xbd\xf4\xef\x17\xbc\xa0\xbd\xef\xa0\xff\xb9\x73\x83\x58\xb9\xc8\xea\x75\x4f\xc5\x6e\xd3\xff\x22\xd6\x9c\xcb\x1f\xc4\x92\x53\x1a\xe7\xf0\xf2\xfe\xab\xfc\xde\xc1\xdf\xa9\x5c\x67\x5b\xbd\x1e\xf3\xe0\xa5\x3f\xff\x22\xfe\xae\xfb\xf7\xb7\xf2\xa9\x7b\x96\x00\xc2\x54\x69\x20\x39\xb2\xa4\xb6\x10\xc0\x4c\x31\x43\x30\xc3\x84\x11\xca\x21\x34\x4c\x0a\xad\x90\x72\x80\x71\x80\xa4\x50\x08\xc2\xa4\x71\xa4\x52\x8e\x70\x18\x7a\x5a\xd5\xe2\x59\xc3\xbf\xe8\xcf\xff\xb9\xd8\x9c\xb3\xbd\xe2\x0e\xa4\x3d\xcf\x3f\xed\x8f\x3e\x9c\x89\xe2\x67\xcf\xa7\x5c\xab\x94\xa0\x2c\x03\x06\xfb\xf9\x61\xed\x8e\xbb\x54\x6e\x6b\xc3\xd4\xa6\xea\x58\x8b\xc8\x69\x04\xc5\x1e\x20\xb5\x6a\x7b\xbf\x67\xbb\x30\xa2\x93\xde\xb2\x94\xa0\xad\x8e\xcf\x45\x32\x41\xa7\x7d\x58\x4e\x70\xc8\x3c\xbb\x5a\x49\x74\x57\x98\x86\xac\x5c\x59\x34\x07\x0c\xb8\xc1\xb3\x1e\xdc\xac\xaf\xb1\x9c\xed\x8e\xfd\x72\x6b\xda\x63\xad\x28\x1b\x75\x66\xc3\x84\xdc\xae\x6b\x61\x0e\xe7\xfc\xa2\xdd\x91\x89\x32\x0a\x37\x85\x2f\xf8\x63\xde\x14\x8b\x71\x2a\xf1\x33\x9c\xcb\xaa\xf4\x10\xa9\xbf\xed\xf7\x97\x46\xde\x1b\x2b\x12\xcb\x40\xfa\xc5\x55\xd6\xbf\x9d\xff\x87\xc4\x3a\x3d\x90\xfe\x4d\x91\x01\xe9\xeb\x55\xf6\xb4\xdd\xbb\x77\x7e\xdd\x33\x9e\xdb\xe5\xee\x2b\xb6\xf0\xdb\x57\xbd\x98\x96\x75\xee\xa3\x2f\x6a\x39\x77\x63\x95\x79\xc1\x7b\xe7\xba\xbd\x17\xf9\x7c\x7b\x4c\xc3\xcb\xf7\xff\x64\x6c\xd6\xd3\xf8\xbc\x7a\xb6\xf2\x6e\x8c\xf0\x4b\xd9\xbd\xac\xb2\xee\x4d\xe3\x17\x05\x25\x7c\x3c\x4d\x90\xf3\x3e\x32\xe6\x9d\x10\x2b\xaf\x7a\x3b\xc4\xca\x6b\xfd\xfb\x9b\x3c\x7e\x55\xeb\x7d\xb9\x93\xf5\x2b\x5a\xef\xfb\x7b\xe5\x78\x39\x8f\xf7\x59\x3e\x6f\x99\x6f\x67\xc2\xf7\x6a\x29\x97\x1b\x3a\x3e\xf2\xb6\x89\x05\x9b\xde\xb2\xcf\xbf\x3b\x76\xf2\x1e\xfa\x86\xd1\xce\x57\x63\x27\x53\x57\xfd\xf3\x5b\xf9\x84\xa6\x46\x2c\x4a\xa4\xb2\x25\xb3\xa5\x11\xd4\x08\x63\x2b\xee\x60\x86\x84\xd6\x0a\xdb\x5a\x41\x69\x6b\x23\x90\xb0\x2c\x61\xdb\x1c\x4b\x06\x29\x83\x5a\x61\xc7\x36\xc2\xa1\x1c\x3f\x69\x6a\xe4\x21\x67\x29\x95\x2b\xe6\x7f\x6b\xbd\xf1\xc5\x9a\xf3\x8e\x33\xf5\xcc\xd8\x27\xb5\x1a\x48\x1b\x9c\x50\xbd\x7d\x65\x84\xca\xcb\xc3\x71\x3e\x74\x87\xd5\x79\xa6\xb0\x19\x0c\x4e\x53\xf6\xbd\xec\xbf\xeb\xc1\xae\x89\x0a\xe9\x3e\xc9\xf7\xc6\xc5\x7a\xa5\x88\xe6\xb9\x14\x4f\x6a\xdf\x39\x2e\x1c\xd7\xb0\x7e\xb6\xd6\x89\xc2\xad\xa7\xea\x33\x3a\x3a\xba\x24\xc3\x4c\x58\x95\x99\x79\x31\x83\x94\xe7\x6e\x6a\xa5\x4a\xc5\xcd\x8d\xd8\xba\x22\x7a\xad\x82\x8b\x96\xbb\x7d\x85\xe1\x93\x95\xb3\xe5\x77\x2b\xa6\x60\x6a\xeb\xed\x16\xc1\x59\xa3\xb9\xdd\x80\x9c\xdd\xd8\x27\x12\xc7\x95\xbb\x46\xf3\xf2\x78\x32\xde\x80\xbc\xb1\x07\x8b\xcb\x90\xdd\x63\xe5\xf4\x6f\xb7\x32\x76\xf7\x8d\xca\xc4\xbe\xfc\xfc\x26\x2b\xe3\x03\xe9\x5f\x8f\xff\xa7\xe8\xc7\xac\x9c\xf1\x6e\xbc\xc1\xca\x28\x62\x07\x18\x6f\xdc\xfa\xf0\xbe\xf4\xdf\x41\xbf\xbd\xcf\xe2\xd2\x1d\xf4\xdd\x6b\xfa\x4e\x6f\x03\xe6\x73\x71\x90\xf5\x44\x20\xc6\x4e\xb2\x55\x48\x8e\x08\x98\x7a\xb0\x26\x0f\xdb\x52\x75\x92\x4f\xe7\xe9\xb8\x3c\xa1\xfe\x79\xf5\xb9\x58\x39\xfd\xef\xb1\x72\x72\x9b\x6a\x0b\x52\xcb\x50\xe1\x20\x49\x35\x67\xc8\x10\x4c\x14\xb0\x95\xb6\x21\x90\x96\xcd\x94\x44\x40\x3b\x40\x6b\xa2\x95\xc4\xc0\x00\xc2\xb4\x24\x46\x60\x07\xe3\xd3\x7e\x30\x9e\x63\x3c\xb7\x9f\xd8\x9d\x49\xb4\x2d\xec\x73\x24\xb5\x69\x1e\x59\x30\x4d\xd4\xa6\x1d\xd9\x0c\xd9\xb1\xe8\xac\x68\xd8\xcf\x8f\x16\xc1\x41\xcc\xc2\xf0\xa5\x6b\x52\xaf\xde\x5b\x9e\xba\x6a\x5e\x5c\xc7\xfa\x62\x2f\x9e\xcb\x55\x94\x45\x3c\x7b\xca\x0b\x3f\x41\x6a\x71\x4c\x87\x99\x4d\x29\x9c\x26\x47\xdd\x81\xf1\xda\x7b\xcf\x1f\xf6\xcb\xe9\x82\x3f\xab\xa6\xd2\x45\x06\xa3\x96\x40\xad\x09\x20\xb5\xfe\xae\x51\xa0\x68\x5d\x89\x12\xd9\x79\xce\x49\x1c\x88\x4c\x4c\xd2\xab\xe4\xf2\x28\xb7\xea\x30\x63\x9b\xae\x9a\x29\x85\x4b\xdd\xce\x30\x38\xe7\x6e\x98\x43\x9c\x0e\x6b\x1c\xd7\x7c\x3a\xaf\x81\xba\xca\x32\x72\xc8\xb9\x5a\xed\xf6\x34\x65\x47\xb6\x0c\x4c\xb6\x67\x67\x13\xd6\xc0\xbb\x2d\x26\xef\x8b\x28\x7c\xae\xf4\xd4\xb5\x71\x1d\xf0\x6b\xe3\xf7\x5c\xcb\x95\x87\xe3\x6f\x6b\xe4\xdb\x28\xd9\xbf\x99\xff\x98\x65\xf1\x8d\x6c\xb9\x97\xb1\x7e\xad\xa4\x1e\x4c\xff\xde\xfc\x12\x3c\xf6\xea\x06\x94\x38\x5b\x16\xfd\xdb\x75\xa4\x47\xd3\xff\x9c\x8e\xf4\xaa\xff\xcb\x75\x4f\x9d\xfd\x7d\xce\xdf\xbf\x65\x7e\x9e\xf7\xc4\xdf\x82\x1f\xb1\x36\x7d\xe6\xe4\x1a\x72\x4a\xb0\xb4\x29\xa3\x94\x4b\x0a\xb8\x94\x4c\x19\x4b\xd8\xc4\x30\x20\x85\xd2\x48\x10\x02\x24\xd3\xcc\xa6\xd4\x46\x96\x03\x6d\x6e\x30\x54\x40\x43\x6c\x4b\xf9\x13\x6d\xe1\xfd\x68\xfb\xce\x99\x52\xac\x49\xb1\x1d\xc2\x57\xd1\xe5\x73\x68\x2b\x3c\xd6\xb4\x67\xa9\xe2\xac\x62\x25\x1b\xc8\x6d\xdb\xfe\xac\x51\xd7\x89\x7d\xd3\x66\x8d\xa8\x53\x49\x87\xde\xba\x04\xea\x35\x6f\x5f\x72\xb2\xa5\xc1\x8e\x78\x99\x55\xb7\x34\x73\xb7\xf9\x94\x48\x6d\x73\xf9\x25\xab\x14\x65\x6d\xdd\xc9\x1c\x06\x32\x17\xe5\x37\xbc\x57\xcc\xf7\x9d\x73\x6e\xad\x45\xaf\xb5\x87\xd1\x64\xe9\xfb\xab\x83\x72\x4a\xca\x8c\xe5\x56\x57\x41\x4b\x4e\xe7\x6a\x22\x77\xfd\xe9\xd2\x2a\xd5\xf1\xd8\x94\xff\x20\xda\xc6\x3e\xde\x3e\x1b\xff\x0a\xb4\xfd\xdc\x39\xd2\xb5\xff\xfb\xab\xe5\xd1\xe8\xf3\x85\x5c\x0c\x1f\xa1\xcf\xc5\x22\xf6\xe8\xfe\xfb\x82\x45\xe0\xdf\xd2\x7f\x9f\x3b\x97\x8a\xf5\xdf\xb5\xb7\xe0\xe5\x9b\xf7\xa2\x77\xec\xe3\xa3\xf1\xe8\x6b\xe8\x6d\x5b\x96\xe1\x18\x0b\x81\x2d\x4d\xb9\x82\x92\x38\x8e\x43\x09\x95\x0a\x6a\x5b\x38\xca\xa1\x4a\x23\x85\x08\xb1\x05\x25\x88\x6b\xea\xd8\x18\x53\x0a\x6c\xa2\x28\x66\xf0\x94\xd7\xcc\x7e\xc8\x8e\xbc\x7a\xdd\xc7\xd7\x9d\x3e\xce\x96\xfc\xf4\x68\x55\x23\xf9\xe4\xb0\x0d\x0e\xd5\xee\xa2\xe4\x4e\x2a\x43\x6b\x3b\xc5\x29\x56\xde\xd7\x61\x9b\xa0\xf9\x31\xad\xcb\x67\x07\xdc\xf7\x76\xe4\x0b\xe4\xd7\x32\x6d\x5d\xaf\x99\xdd\x62\xdd\xc1\xc4\xef\x55\x86\x2d\x15\xb0\x11\xf5\x58\x65\x75\x4c\x46\xe5\xb0\x23\x3b\x99\x8e\x9f\xee\xb9\x99\xc6\xca\x1b\x7a\xb3\x2e\x5f\x82\x5c\x27\x5b\xa4\x6a\x39\x5f\xaf\x7c\x2f\x62\x35\x9a\x67\xc6\x4e\x43\x3f\x55\x14\x38\x0c\xca\x4f\x08\x25\xdd\xc4\xb8\x61\x07\x55\xbe\x2e\x65\x87\xf9\x5e\xe7\xd8\x20\xf6\x28\x14\xba\xd6\x6c\x77\xd7\x51\x75\xc3\x73\x75\x3f\xec\x76\x3b\x8d\xc6\x47\xb9\xcc\xe2\xe5\x9d\x1d\x79\xec\x14\xfb\x8b\x3b\xe2\xb6\xac\xeb\xf4\xf0\xf2\xf3\x9b\x76\xc4\x0f\xa4\x7f\x3d\xfe\x9f\xa2\x1f\xd3\x35\x45\xec\xd5\x0d\x3b\xe2\x62\xcc\x60\x8a\x5f\xa7\xf8\xbe\xae\x79\x07\xfd\xb2\x4a\x13\x7a\x07\x7d\xf7\x8a\x7e\x3a\x68\xad\xc2\x62\x75\x97\x1c\x8f\x12\x85\x6e\x37\x4f\xf4\x6c\x95\x0e\x61\xa9\x91\x30\xfd\x9c\x75\xcc\xe6\x7a\xdd\xa9\x9e\x96\x0b\x78\x77\x86\x8f\xd8\x8e\xfc\x0d\x97\xa7\xb7\xe9\x7f\x6a\x47\x6e\x34\xb2\x2d\xdb\x08\x45\xe4\xd3\x06\x9b\x11\x49\x98\x63\x10\x50\xd2\x06\x4c\x52\x00\x81\xa3\xb0\xd4\x1c\x6b\x47\x29\xc5\x95\xa0\x36\x42\x06\x3b\x94\x5a\x0e\x03\x96\xf5\x84\x32\xf1\xfc\xac\x85\x54\x63\xdf\x9f\xd9\x99\x44\xa3\x86\x23\x25\x47\x11\x1d\xee\x0a\xa3\x70\x5d\x22\x09\xd7\x34\xcb\x2d\x15\x69\x45\xe5\x6e\x3a\x3a\xef\x05\xcf\x3a\xe2\xc9\xe4\xf1\xce\x8e\x3c\x76\xca\xf4\x45\x14\x8b\xc7\xd4\xbd\x3b\x46\xbf\x97\xd4\xcb\x28\x78\x6e\xd2\xcf\xf7\x3d\xb6\x0a\x6b\xfe\x4e\xa4\x87\x79\x55\x52\x83\x99\xb7\x81\x24\x7d\x48\x59\x3d\x57\x4e\x46\xc1\x6c\x1a\xe4\xd7\x1b\xda\xf0\xac\x3e\x6f\xa4\xda\xcd\x64\xa4\x11\x21\x6e\x52\xed\x40\xa5\xc6\x67\xdd\x90\xd5\x92\x1b\x6b\xb6\x61\x19\x7b\x40\xda\x02\x18\x79\xba\x25\x2c\x39\x92\xb9\x04\xeb\xe6\xeb\x99\x48\x76\x42\x67\x8f\x72\xbe\x0c\x1b\x7e\xa5\x59\x9d\x57\x47\x0a\xae\xd7\xd3\x72\xb2\xe1\x87\xf9\x71\x6c\x84\x5f\x47\xa5\xd6\xaf\x23\xff\x06\x2a\xc5\xaf\xf6\xba\x01\xb5\x07\xf5\xcb\x78\xbd\x51\xde\x47\x85\x07\xd2\xbf\x37\x27\x6b\xec\x28\xe8\x16\xa9\x3c\xdf\x36\xef\xbf\x1a\xe1\xf3\x5c\xde\x47\xa5\xef\xa1\x7f\xd6\xe1\xbe\x80\x72\x1f\xf1\xfb\xb9\xdb\xe1\x31\xd1\xc6\x36\x0e\x91\x54\x73\xc8\x6c\x8d\x0c\x63\xd8\x68\x6d\xa0\xcd\x04\x45\x0e\x80\x14\x3a\xd4\x01\xe2\x74\xe3\x0e\x30\x14\x10\xe0\x10\x8e\x11\x75\x34\x76\xe0\x33\x8a\xc0\xfb\x51\xe4\x9d\x9d\x66\xeb\xb5\x96\xbe\x73\x96\xf4\x6a\x89\xa1\x42\x26\xdc\x2f\xd0\x71\xce\xb3\xf9\x34\x2c\xc8\x4d\xa1\x25\x96\x01\x2a\x67\xbb\xc7\xc5\x76\x93\x20\xbe\xdd\x6d\x0d\x71\x65\x9a\x8b\x8c\x28\x6d\xd6\x53\x9b\x1e\xa2\x40\x8e\x36\xbb\x52\x5f\xb4\x7c\x18\x2d\x64\x60\x22\x9b\xa8\x59\xad\xd5\x3b\x6c\x96\xc5\x75\xb6\x06\x96\xe3\x72\xf5\x94\x4f\x2b\x6b\xa3\x44\x76\xbf\x99\xcd\xcd\x28\xd1\x6b\x26\xec\x83\x16\x21\xf6\x26\x45\xbf\x2f\xac\x6e\x75\xc0\x06\xad\xb0\x33\xae\xcc\x48\xfe\xb2\x34\xfd\x25\xa8\x10\xdf\x79\x9f\xfe\xfd\x82\xee\xe1\x5e\xff\xf6\xb5\xfe\x7f\x30\xbf\xe9\x3f\xc1\xef\xf7\xa0\xce\x75\xec\xee\x23\xa5\xde\xfd\x06\x94\xba\x97\x5f\xef\x1d\x7e\x3f\x85\x52\x90\x03\x6c\x23\xa2\x6c\x61\x11\x60\x31\x44\x18\xc6\x98\x4b\xa5\x1c\x5b\xdb\x46\x33\x28\x99\xa3\x19\x64\x44\x41\xc1\x29\x10\x16\xd1\x90\x28\x60\x6c\xad\x81\x65\x14\x7a\x46\x29\x74\x3f\x4a\xbd\x13\xd5\xfe\x0e\x4a\xbd\x71\x19\xe4\x2b\x25\xae\xbb\x14\x37\x01\xd0\xfb\xf2\xc6\x19\x28\xe3\xa8\x6a\x4d\xb7\x4a\x5d\x98\xf1\xed\x4c\x6f\x4f\x3a\x9d\x7c\x2b\x9b\xeb\x16\xca\x1d\xdf\x67\xc5\x49\x7b\x19\xcc\x7a\x99\x35\x6c\x50\x9e\x04\x9b\xd0\x6b\x17\xa6\xdb\x6d\x98\xf4\x66\x85\x32\xa9\xcf\xdb\xa3\x01\xec\xa5\x57\xc8\x6a\x87\xa7\x08\xe9\xe2\xa0\x7e\xec\x76\x57\x59\xaf\x50\xe9\xd5\xbd\x65\x05\xe6\x48\x92\x36\x0e\x21\x6d\x44\xaa\x48\x43\x91\xd2\x05\x95\x43\xf6\x20\xc3\x3e\xb2\x79\xfd\x71\x94\xba\x57\xea\x53\xf1\xdf\xbe\xd6\xff\x0f\xe6\x37\xf3\x27\xf8\xfd\x1e\x94\xfa\xcd\x83\xf0\x81\x52\xef\x7e\x03\x4a\xdd\xcb\x6f\xf9\x1d\x7e\x3f\x85\x52\xd8\x30\xc2\x1c\x68\x51\x2e\x80\x2d\x0d\xb4\x05\x91\x48\x0b\xa6\x99\x45\x15\x45\x5a\x68\x0d\x29\xa4\x94\x60\x00\xa0\xe6\x42\x29\x28\xa4\xb6\x85\x01\x50\x4a\x69\x7e\xea\x52\xf8\x7e\x94\xba\x9e\x2e\x9f\x43\xa9\xcb\xa8\xbc\xe5\x39\xfc\x6b\x69\xfe\x9c\xf5\x29\xd7\x55\xb4\x7c\xcc\x65\x46\x2d\x55\x5f\xe7\x66\xc7\x63\x66\x9a\x41\xa3\x82\x9b\xd8\xd4\x33\x69\xbe\x44\xb5\x60\xbd\xc9\x25\x31\x9a\x4f\xeb\xd5\xe3\x18\xe4\xc6\xb3\x6d\xa1\x16\x80\xf0\x70\x94\xf3\xaa\x48\x56\xf4\xa6\x95\x2c\x15\x2b\xc7\x95\x2e\x59\xb5\x42\x85\xaf\xda\x5d\x10\xfd\xf4\x89\x6d\x92\x4e\x98\xf7\x17\x7b\x53\x2b\xd8\xdd\x0c\x25\x34\x10\x9d\xda\xd2\x1e\x86\x93\x5e\xcb\x6b\xd0\x25\x6a\x6c\xab\x3a\xe9\xad\x8e\xb5\xbf\x4e\xa7\xba\x57\xfa\x33\xf1\xdf\xbe\x52\x1e\x8d\x56\xde\x9f\xe0\xf7\x7b\xd0\x2a\x26\xb6\x0f\x97\x7e\xf7\x1b\xd0\xea\x41\xfc\xbe\xaa\x59\x7c\x0a\xad\x1c\x02\x05\x87\x44\x5b\x1a\x73\x0e\x30\xe3\x10\x2a\x09\x18\x12\x52\x50\x4c\xb8\x66\x5a\x70\x88\xb4\x6d\x6c\x8c\xa0\x6d\xd9\x06\x09\x06\x2c\x6c\x63\xcd\x04\xe5\x44\x3c\xa3\x15\xb9\x1f\xad\xb2\xaf\xce\x92\x53\xf9\x08\xad\xae\x9f\x63\xe8\x75\x91\xea\xeb\x12\xd7\xb1\xa6\xd9\xa3\xa4\xe3\xc5\x4e\x1f\xf2\x25\xdc\x3c\xe6\x33\x62\x99\x70\xfc\x56\xd5\xf7\x57\xa0\x43\x46\xb2\x4b\x86\x8d\xca\x0e\x67\xf4\x6c\x7a\x0c\xdc\x7a\xa4\x47\x61\x81\x55\xaa\xd3\x64\x77\xbc\x94\xb3\x34\xcb\x6d\x95\x33\x90\x24\xaa\xec\x13\x60\xc0\x18\xf0\xf7\x85\x56\xe1\x09\x59\x06\x8d\xcd\xb0\xdb\x27\xc5\x59\x6b\x32\x2c\x49\xbf\xb9\x2d\xf5\xb2\xcb\x39\xa5\xf9\x84\x41\xc1\x41\xe6\x1c\x7b\x1c\xd4\x2d\x2a\x78\xf4\xd1\xfd\xce\x7f\x1c\xb5\x1e\x84\x02\x6f\x7a\x23\x3f\x1a\xb5\xb2\x7f\x82\xdf\xef\x41\xad\xeb\xf9\xfd\x48\x14\x70\xbf\x01\xb5\x1e\xc6\x6f\xfa\x77\x9e\x3f\xe7\x87\xe6\x20\x68\x0c\xb5\x2d\x87\x48\xc1\xb4\xa0\x06\x48\x2c\x6c\x6c\x19\xaa\x2d\x84\x04\x67\x82\x58\x0e\x37\x36\x24\x46\x18\x68\x21\x4c\x99\x0d\x19\xa7\x98\x03\xc6\x8c\xf9\xd7\x3f\x3f\x70\x3c\xa6\xbf\x36\x9e\x54\x0b\x9b\x25\xc9\x26\x27\xd5\x7d\xb3\x90\x11\x09\x4b\x94\x4b\xe9\x82\x9f\xa9\x47\x68\xa2\x6b\xb0\x9c\xf2\x32\xed\x62\xa3\x56\x3b\x1d\x20\x9c\x24\x34\x1d\xba\xef\xef\x04\xcf\x1d\xbe\x80\x74\xd5\x92\x91\x61\xc4\x47\x13\xf7\xb8\x98\x0d\xa4\xbb\x5f\xcf\x75\xa2\x35\xe4\xb3\x6d\x71\x97\x99\xa7\xb7\xd0\x5a\x53\x91\x3d\xfb\xf2\x5f\xf2\x99\xc5\x04\xb0\x35\xcf\x3b\xc9\xfe\xa9\x7a\x10\x68\x67\xda\xdf\xb9\x95\x23\x36\xa5\x45\x98\x1e\xec\xea\xa3\x3a\xd9\x4f\xfb\x54\xe6\x17\x2d\xd2\x49\xad\x47\xe3\x5e\x3f\x8b\x37\xfd\xf6\x60\xe8\x14\xe8\xb8\x39\x77\xd3\xdb\xe9\xb6\xbb\x9a\xa1\x7c\xfb\x30\xa1\x75\xa3\x68\x41\x05\x1d\x27\x90\xa5\x71\xb6\xd9\x05\x65\x3f\xfd\x9c\x07\x7e\x91\x29\x25\x7b\xbb\x81\xdc\xe8\xf5\x36\xe7\xad\xad\x0c\xc4\x99\x2a\x9d\x80\x74\x91\x1d\xba\xb6\xd3\xaf\xf8\xd1\x61\x32\x69\x0c\x26\xc6\x79\x61\xed\x75\xb4\x92\xbf\x8e\xe8\x1b\x68\x55\x8c\x2d\x7f\x89\x46\x88\x27\x74\x3b\xee\x26\x42\x3b\x5b\x1e\x57\xb6\x76\x7d\xb5\x5b\xe5\xc7\x61\xc5\xef\xea\x1e\x4e\x86\x3b\x2f\xa8\xbc\xf4\x43\x2c\x9f\xce\x79\x1c\xae\x75\xd5\x4f\xe9\x20\x0f\xa4\x7f\x3d\x0f\xbe\xaa\x03\xcd\x2e\xfd\x93\x5e\x8a\xc5\xbe\x7e\x68\x27\xd1\x58\xe8\x30\x53\x5d\x0c\xb3\xbb\x8c\x0f\x23\x9b\x34\x0a\x8b\xa1\xb3\x74\xab\xe3\x62\x52\x34\xd0\x7c\xd5\x3d\xc7\x64\x5c\xf2\x5d\x7d\x71\x1e\x3f\xb3\x72\x15\x93\x71\x5d\x4e\x6d\x98\xff\x3d\xfc\xc5\xfb\xf4\x73\x3a\x8e\x94\xd2\x92\xd0\x91\x48\x33\xc6\x29\x92\x92\x30\xc1\x95\xad\xb4\x44\x86\x48\x42\xb5\x40\x0c\x43\x49\xb0\xa3\xa5\xc2\x96\x90\x88\x49\x62\x31\x45\x85\xe5\x00\x85\x9f\x75\x1c\x7a\xbf\x8e\xe3\xbf\x3a\x0b\x4e\xe5\x53\x3a\xce\xab\xb3\x28\x0d\xdb\x38\xec\x80\x9d\xf0\x5b\x9b\x10\xb2\xf5\x6f\xdf\x8a\xed\xd0\xc6\xf9\x0c\x4d\x8f\x53\xb9\x1a\xd3\xb3\x6d\x29\xe8\x8e\xcb\x41\xc1\x0e\xc6\x1e\xad\x74\xa2\x89\x2a\xfa\x93\xd2\x9e\x0f\xf3\x20\xe4\xed\x62\x8f\x17\x0b\xfb\x23\xa9\x39\x64\x9f\xa0\xbb\xe3\x3c\xdc\xef\xc5\x8a\xa6\x14\x8c\xf0\x62\xdf\x1e\x35\xec\x00\xd1\xcc\xae\x3e\x5c\xa4\x9e\x25\x7c\x54\xde\x95\x8b\xe5\xda\x7c\x32\xa9\x95\x3b\x62\xd9\x45\xab\x1a\xd8\x77\xe8\x31\x4a\xef\x5b\xa3\x15\x70\xb7\x99\x69\x36\xad\xf8\xae\xaf\x3e\xf2\x99\xff\xe3\xba\xce\xe3\x74\x87\xfe\xdb\xf9\x45\x1f\xc8\xaf\xff\x27\xf8\xfd\x1e\x5d\x27\xe6\x9f\xf3\x70\xdd\xc1\xfd\x06\x5d\xe7\x21\xfc\x96\x7a\xdd\xc1\x40\x74\x53\xab\x5e\x83\x8c\x04\xb4\xee\xd1\x7d\x1c\x04\x2d\x60\x01\xec\x38\x96\x65\x23\xe3\x68\x63\xa8\x81\x80\x6b\x9b\x6a\x02\x24\x94\xd8\x70\x43\x10\xd2\x84\x58\x5a\x2a\x24\x21\xb4\x88\xc0\x0e\xb7\x18\x64\xd4\xe2\xcf\x68\x66\xdf\x8f\x66\xb9\x57\x67\xcd\xa9\xdc\x84\x66\xf1\x5e\x76\xa6\x6a\x5a\x6a\x0f\x53\xb5\xe2\xa2\x56\x70\x65\xa3\x32\xe8\x1d\x25\x9c\xe4\x6c\x13\xd8\xf5\xf5\xd1\x3f\x64\x5d\x67\x92\x1d\x97\x9b\xe3\xcb\xa8\x9f\x4b\x0c\xed\xd6\xe1\x3a\x5a\x2d\xca\x75\x1d\xcc\x40\x6b\xd6\x82\x7e\x38\x12\x68\x40\xe0\xce\x2b\x6e\xa7\xb3\x4d\xba\x51\xa5\xa5\xa0\x0a\xf6\x93\xa4\xbb\x1c\xac\x83\x6a\x72\xd5\x25\x0b\x44\x1a\x6b\x27\x35\xe2\x61\xc7\x1b\x66\xa7\xf3\x44\x23\x18\xc1\x6c\x2f\xed\xb0\xea\x6a\x97\x8e\x94\xbb\x3b\x23\x52\xff\xe0\x06\xd9\x7c\xdf\x95\xc9\xd1\x96\x6d\xf3\x9c\x40\x52\xdf\xad\x9a\x94\x35\x6b\x51\xab\x7a\x6c\xee\x86\x29\xd1\x28\xa6\x1b\x51\xff\xa3\x6c\x6b\x7f\x1c\xed\x1e\x82\x1e\xbf\xaf\x3a\x7f\x0c\xfd\x72\xff\x0e\xfe\xbf\x07\x0d\x63\x55\x7d\x3b\xba\xb8\xdf\x80\x8e\xb1\xd3\x89\x6f\xe1\xff\x3c\xbe\xa6\x80\x7a\x07\x10\xf6\x9b\x87\xc5\xe8\x10\xe4\xbc\x51\xd8\x91\xa8\x32\x1f\x24\x90\x55\xb5\x84\xdc\xaf\x06\x41\xad\x30\xe8\x65\x3c\x12\x1b\xaf\x73\xf9\x0c\xa2\x52\x66\x28\xe6\xda\x32\x8e\xc5\x84\xe5\x30\x46\x25\x30\x88\x61\xad\x6d\x46\x2c\x0b\x70\x6c\x69\xad\x29\x3b\x79\x4f\x11\x2e\x28\x12\x46\x01\x86\xa0\x42\x9c\x1b\x71\xb2\xd8\xb3\x87\xf8\x50\x5d\x4f\xbf\x6f\xb7\xd8\x0f\x29\x5b\x64\x72\x32\x6a\x37\x98\xeb\xf8\x2e\x5f\x1c\xc6\x74\x96\xdf\x0f\xcb\x69\x58\xec\x76\xbd\xa9\xce\x0e\x47\x66\x9f\x23\xed\x43\xc9\xcf\x07\xbd\x8a\xbb\xaf\x56\x65\xba\x36\xcf\xf3\xa8\x45\x6b\x60\x1e\xd6\xbb\xa8\x88\xab\x51\x31\xd7\xc3\x83\xbc\xda\x17\x8e\x19\x9a\x7a\xb6\xd8\x73\xd3\x2b\xe2\x5a\xbf\xb0\xca\x4f\x3a\x3b\x53\x6d\xd9\xd3\x28\x70\x79\x50\xb5\x27\x93\xf5\x7a\xda\x59\x86\x76\xb2\x3e\x3e\x58\x74\x69\x3f\xc8\x62\x1f\xdb\xcd\xdd\x80\x30\x7d\xec\x5e\x21\x4c\x2c\x3a\xe6\xc1\x08\xf3\xec\x0f\x7d\x50\x50\xae\x3b\x79\xcf\x59\xcc\x9c\x71\x6a\x9f\x87\xd9\x69\xe5\xc8\x43\xb3\x66\x99\xb5\x8f\xca\x22\xdf\xca\x1c\xc2\x4e\xb0\xaf\x06\x57\xe3\x7e\x99\x07\xa9\x58\x8c\xe1\x17\xe7\xdd\x29\x22\xfe\xec\x1b\x2a\x2e\x93\x27\xe6\xef\xfc\x55\x5f\xbd\x93\x44\xaf\x23\xed\x67\xd7\xd2\xdf\x47\xa5\x49\x65\x2b\x82\xa7\x6a\xf3\x31\x5b\xec\x1d\x2b\xfb\xe5\x39\xfd\x42\xef\x7f\x66\xfb\xd5\xe5\xf9\x16\x04\xcf\x9c\xb0\xf5\x8c\xe0\x7d\xf7\xff\x03\x08\x2e\x91\x54\xd8\xe6\x08\x00\x6d\x41\x82\x31\x35\x36\x94\xc4\xc2\x90\x0a\x22\x08\xc6\x58\x13\x48\x01\x46\xc0\x48\x62\x53\x4b\x3b\x9a\xd8\x98\xda\xd2\xb1\xa5\xc2\xcc\xc8\x7f\xfd\xf3\x03\x59\x0f\x41\xf0\xc2\xd5\x70\xfd\x75\x3a\xb1\xdd\x2b\x17\x17\x8e\xb5\x91\x41\x63\x9d\x20\x64\x91\xa0\xed\x60\xe9\xa3\xdc\x72\x4b\x8f\xb9\x75\xb5\xb4\x1b\x1b\x77\xbf\x5f\xf5\x54\x58\xcb\x6f\xc6\xf6\xbe\xb7\xea\x8b\xc3\xa0\x9a\x6e\x77\x47\x03\x5d\x0d\xd8\xa1\xef\x76\xc0\x76\x7d\x10\xaa\xeb\x63\xe0\xee\x1b\xd9\xfa\xfa\xe7\x3d\x92\x3b\x07\xe4\x66\xfb\x5c\xbf\xd0\xaa\x6f\xe5\xaa\xe5\x15\x96\x1d\x50\xf7\x48\x23\x6c\x95\xcd\xbe\x1b\x56\x47\x91\xf2\x4d\xde\x54\x1a\xe6\x62\x68\xba\x0b\xf1\x63\x3a\xce\x2d\x88\x6f\xdc\xab\x95\xf7\x3f\x02\xf1\x63\xa6\xb1\x5b\x10\x2f\x77\xea\xfb\x33\xe2\x5d\x47\x84\xfd\xbd\x88\x17\x43\xfc\xff\x91\xed\xd7\x97\xe7\x5b\x10\x3f\x75\x32\xd8\x9f\x11\xff\x3a\x22\xef\x3f\x12\xf1\x21\x63\x4a\x52\x8a\x80\x22\x0e\xe1\x84\x70\x8d\xa8\x05\x0d\xa5\x96\x96\x44\x10\x6e\x59\x8e\xa3\x20\xe6\x00\x0b\x84\xb1\xb4\xa1\x96\x52\x42\x4e\xa1\x62\xdc\x61\xc8\x79\x42\x7c\xf0\x10\xc4\xbf\xce\x5d\xfe\x6f\x44\xfc\x18\xbd\x18\xe2\x5b\xbb\xe5\x50\x2f\xa7\x8d\x65\x82\xd4\x60\x90\xd6\xb3\x29\xd8\x8c\xc8\x64\x59\x2d\x55\x9a\xd5\x65\x2d\xac\xd5\x86\x64\x39\x94\xa5\x4d\x3f\x39\x5d\x6a\xaf\x35\x58\xf5\x1b\xc9\x31\x8a\x5c\x56\xf0\xe7\x6d\xa1\x12\x6b\x2e\xcb\x5e\x71\xd2\x2d\x4e\xb2\xfb\x5c\xda\x2b\x8f\x3a\xb5\xd4\x33\xe2\x17\x7b\xc8\x0f\xf7\x20\xec\x44\x9d\x4d\xa5\x5f\x82\x61\x75\x2f\x3a\xfd\x74\xde\x1a\xcf\x5a\x2b\xab\x99\x2b\xad\x8e\xe9\xf9\x10\xf2\x61\xf3\xa3\x6c\xd0\x9f\x44\xfc\xd8\x09\xc5\x2d\x88\xef\xbb\x57\x2b\xf5\x7f\x04\xe2\x5f\x4e\xdb\x6e\x42\xbc\x73\x20\xf1\x19\xf1\x2e\x12\xfa\xb7\x23\x5e\x0c\xf1\xff\x47\xb6\xdf\x5c\x9e\x6f\x41\xfc\xb3\xe1\xfa\x8c\xf8\x33\xf7\x2f\x44\xfc\xb8\xbf\xcf\x67\x10\x1f\x28\xdb\x41\x48\x62\xc3\xb9\xb0\x1c\x4d\x21\xb5\x18\x97\x06\xd9\x00\x2b\x20\xb8\xd0\xd0\xa6\x10\x70\x28\x10\x74\xb4\x32\xc8\xc6\x94\x68\xc6\x38\x37\xc8\x61\x92\x8b\x7f\xfd\xf3\x83\xc4\x11\x3f\xe3\x0d\xca\xed\x4c\x6e\x18\x76\xd5\x91\x1c\x9d\xc8\x46\x5d\xff\xb0\x0c\x60\xbd\xe2\x90\x5e\xbd\x03\x36\xa5\x55\xba\x12\x6c\x26\x66\x75\x02\xac\xde\x8b\xcc\xbf\xe7\xa9\x74\xea\xe9\xac\x98\x64\xd7\xbd\xa6\xf7\xcb\xfb\x54\xc6\x3b\x94\x8f\x31\xf1\x6e\xd0\x5e\x62\x3f\x3e\xbd\xce\x77\xf0\x61\x99\x55\x63\x4a\x4d\x3f\x93\x19\x2e\xed\x30\xeb\x36\x3d\x05\xa3\xa8\xba\x11\xc7\x7d\x72\xc8\x0b\xb2\x0c\x77\xe3\x2c\x9a\x6d\x16\x85\xa0\x92\x70\x8f\xc3\x03\x5c\xb6\xd7\x45\xe2\xce\x0e\xf3\xc1\x6c\x3c\xdc\xad\xc2\xee\x36\xd7\xa0\xad\x2c\x2b\x0f\xd4\xb4\xe5\x66\x9e\xad\x30\xb9\x6e\xff\xb8\xaf\x2d\x96\xe9\x6a\x38\x49\xf3\xe3\x51\xb6\x2c\xb1\x48\x14\x60\x9e\x17\x8f\xc5\x2a\x3a\x2a\xbf\x3b\x9f\x2c\x1c\x3c\x2d\x7e\xe4\x81\x14\xbf\x2b\xed\x6d\x84\x2e\xc7\x10\xba\xdc\xf0\xf6\xad\xb2\x2e\x0c\x14\xaa\x4d\x6b\x87\xee\x56\x49\x51\x5c\x67\x7a\x1e\x3a\x46\x51\x56\x74\xf0\x66\x97\x07\xe9\x9f\xfd\x70\x3e\x53\xcf\x5c\xfa\xf9\xdc\x81\x1f\xdd\x91\x73\xc5\xeb\x03\xe9\x67\x6f\xa1\x1f\xb3\x13\x9f\xef\x50\x3a\xf3\xb3\xcf\x37\xb3\xc1\x1e\x4f\xb2\x48\x26\x64\xb2\xa0\x19\xd8\xaf\x16\x56\x65\xdc\x34\xd5\x4e\xab\xbd\x16\x43\xdb\x1d\xb5\x4a\xf3\xa9\x7d\x8e\xaa\x6f\x6f\xc2\x0e\x88\xca\x2f\xd3\x25\xd8\x97\x47\xe5\xeb\x74\x52\xb1\xf6\x96\x6f\x69\xef\xf5\x3c\xf5\xca\xcd\xfc\x31\x1e\xac\xfc\x09\xa9\x14\x82\xa9\xb3\x2f\x33\x30\x5c\x13\x0b\x10\x86\xb1\x65\x29\xc9\x2c\x20\x6d\x4b\x61\x1b\x3b\x8c\x53\x1b\x50\xa4\x20\x47\xd8\x30\x81\x34\x82\x9c\x41\xc0\x89\xa5\x4e\x3b\x6f\xf8\x10\x3d\xec\x9d\x3b\x7c\xae\xf5\xb0\x37\x6e\x38\x7a\xbf\xc4\xfd\x05\xb3\x87\x75\x6b\x3f\xda\x57\xb0\x98\x16\xca\x4b\xaf\x30\x6e\xcc\x97\x53\xaf\xc1\x86\xfe\xbc\xba\x77\x57\x95\x6a\x36\x5c\x36\x6b\xc9\xfd\xda\x6f\x8f\x93\xb5\x1e\x9c\x35\x07\xad\x4e\x22\x39\x28\xd5\xf3\xe3\xc4\x20\x0c\xbd\x7e\x16\x02\xdf\x10\xa7\x92\xe4\xa2\x50\xcc\xce\x17\xd1\x2a\xff\x24\x51\x1b\x02\x26\xed\x94\x67\x96\x91\xdb\x8e\x3c\xb7\x72\x08\x72\xb9\x4c\x4b\xe5\x27\x13\xd9\xa9\x35\x66\x56\x42\xd4\x46\xc5\x79\x9e\xb7\x2a\x8f\xd9\x41\xc7\x0d\xce\x37\xe8\x53\xa6\xe5\x5e\xe9\xc1\x7f\x99\x3e\x95\x7a\x4d\x9f\x8a\x5b\xc9\x6f\xd0\x27\xd0\xc9\xed\xe7\x59\x9f\xb8\xce\x62\xfa\x57\xe8\x13\xd7\xa9\x35\xae\xf4\xa9\xff\x99\xed\x8f\xe1\xf8\x0d\xfa\x14\x3b\xdf\xd1\x74\xd6\xa7\x62\x91\x92\xb7\x47\xee\xfd\xbb\xf5\x29\x2a\x90\x23\x95\x22\x12\xd8\xca\x40\x0b\x20\x45\x38\xd1\x10\x00\x89\x05\x82\x10\x38\x82\x0a\xcd\x80\x05\x09\x02\x54\x00\xce\x05\x74\x84\x04\x10\x01\x4a\x01\x51\xe4\x19\xb9\x1f\x10\xf3\xfb\xce\xbd\x48\x7f\x7a\x07\x1d\x2b\xb1\x1d\x74\x55\x58\x0b\xbf\x33\x1d\x83\xce\xb2\xd1\xea\x36\xe8\x30\xc8\xce\x24\xcf\x57\xc3\x64\x2a\x33\xe9\xfb\xe0\xd8\x9c\x44\xb5\x43\xdf\x12\xb3\xc6\x50\xa1\x51\x33\x55\x44\x47\xd6\x72\x12\xf9\x9a\xef\x56\xbd\x52\xa5\xd4\x1f\x07\xb9\x75\xdf\x0f\xb3\xfd\xac\x5f\x1e\xce\xc0\x3e\x4c\xbc\x9c\x92\x1d\x47\x15\x20\xb3\xcc\xe9\x7b\xac\x13\xe1\x41\xce\x5b\x1d\xf2\xe1\x7a\x49\xeb\x6e\x54\xee\xac\xf8\xe2\x30\x74\xbc\x51\x76\x92\x55\x97\xbe\xf8\x4b\x10\xbf\x74\xa9\xff\xf6\xd8\xdb\xff\x34\xc4\x8f\xa9\xa6\xb7\x21\xde\xa9\xfc\xe7\x22\xfe\x7f\x50\xfb\x1f\x88\xf8\xbb\x5f\xe7\xd3\xc3\x11\x3f\x5e\x3e\xe5\x05\x46\x95\xed\x18\x60\x1b\x6e\x38\x44\xc0\x56\x94\x1b\x6a\x33\x0d\x34\xc1\xd0\x32\x88\x00\x68\xd9\xc6\x50\x20\x95\x31\x10\x48\x6a\x59\x9a\x3b\xc6\x21\x80\x10\x81\xf4\xe9\xbe\x29\x84\x1e\x92\x5d\xaa\x76\xc5\xfe\xef\xd9\xa5\x16\x4d\x45\xfb\x51\xa0\x8e\x6b\xc7\x86\xc0\xf6\x69\x3e\x94\xa8\x8f\x52\xe1\xbe\xdc\xef\xf8\xb5\x79\xc6\xd4\x6b\x83\x03\xe8\x89\x73\xf6\xf3\xb7\xb3\x4b\xa5\x13\x93\x7e\x31\x7f\xec\x2d\x4c\x14\xe4\x8b\xf9\x45\x67\xca\x4a\x4b\x39\xdc\x1c\xbc\xbd\xdd\xad\x99\xae\xdf\x1a\x6c\x0f\x01\x5a\xe5\x83\xd4\xd4\x57\xd5\xce\x60\x5c\x5d\x13\xbb\xd5\x4a\xda\xa4\xb4\x6e\x1d\xf0\x52\xcb\x66\x62\xb4\x0c\xa1\xcc\x15\x7b\x23\x84\xe6\x9b\x8d\x76\x4e\x77\x67\x8a\xee\x68\x6f\x68\x62\x58\xee\x82\x05\x9b\x4e\x07\xa4\x95\xaf\x55\xea\xf9\x5c\x12\xe6\x2a\xc9\x43\xce\x77\xab\x8b\xda\xa0\xde\x16\xb5\xc5\x65\xf7\x77\x4f\x76\xa9\x7c\x0c\xa5\xbe\x98\xdd\xa9\x99\x0b\x36\x3a\x76\xcc\x78\x53\x76\xa7\x07\xd2\xbf\x1e\xff\x4f\xd1\x8f\x65\x97\x8a\xdd\xc6\x71\x4b\x76\x27\x1c\x9b\x2b\xce\xeb\x14\xdf\x8f\xe6\xbb\x83\x7e\x26\x9f\xb4\x67\x77\xd0\x77\xaf\xe8\xa7\x1b\xf3\x0a\x5a\xa4\xdb\x29\x54\x45\xc7\xad\xe8\xae\xc4\x6c\x30\x38\xea\x8c\xcc\x8e\xbc\x43\x2a\x0c\x13\xe3\x0a\xf3\x12\xb9\x52\x3b\x3a\xdf\xe5\x77\xc9\x2e\x95\x7f\x8f\xc6\xed\xb1\xcc\xdc\x22\x8a\x73\x0d\x91\x25\x80\xb1\x31\xc2\x36\xd6\x0e\xe2\x82\x2a\xec\x3c\xa9\x8d\xc0\x20\x63\xdb\x94\x02\x6e\x2b\x07\x10\x63\x53\x68\x49\xad\x21\x67\x8e\xc5\xb0\x63\x3d\xa1\x4c\xfc\xfe\x9f\x42\x71\x8c\xf4\xac\xd0\xca\x49\xdb\x54\xd9\x5a\xef\x37\x43\x3f\x57\xc1\x95\x5d\xa7\xdc\xcc\x67\x07\x23\x1a\x20\xab\x89\xe5\xba\xd3\x39\xad\x38\xe7\x38\x9b\x57\xf3\xc3\xc6\x9e\xcf\x37\x43\xc5\x32\x64\x7e\x7e\x14\xd1\xd5\xcd\x49\xa7\xe2\xbd\xd0\x0f\x52\x61\x6b\xda\x46\x79\x50\x45\xc4\x73\x0f\xfc\x60\x4d\x56\xa3\x3e\x2a\x1f\x7b\x86\x4f\xd3\xeb\x2d\x8f\x8a\xbe\x9f\x60\x78\xae\x69\x7d\xdf\xf7\x92\xe3\xf4\x18\x8e\x9b\x4d\x96\xeb\xf6\xbb\x23\xb1\xe4\x8b\x64\x32\x48\x5a\xdb\x82\xe5\xce\xd2\x6e\xb7\xa1\x9b\xc0\x69\x8d\xfa\xe3\x13\x2a\xcc\xb2\x70\x81\x47\xe9\x3d\xb3\x2a\xb9\xe6\xac\xba\x14\xad\x7e\x17\xed\x9d\xa4\x82\x21\x37\x61\xd6\xa8\x61\xa6\x8a\x17\x13\x37\x8a\x29\x6c\xaf\x23\x4e\xf8\xeb\xa8\xbe\x85\x38\xf1\xb3\xf2\xaf\x23\xf2\xf9\xbe\x98\xf4\x9b\x52\xfd\x31\xe2\x3c\x8e\xfe\xbd\xb9\x93\x63\xa9\xf1\x6e\x91\xb8\xf3\xfd\x12\xf9\xe0\x1d\x9a\xef\x23\xce\xa3\xe9\x7f\x94\xbd\xf4\xba\x0c\x2f\xdf\xf9\x2a\xfd\x58\xee\xef\x9b\xf4\xbe\xbb\x63\x79\xb0\x86\x18\x43\xa3\xa1\x76\x94\x72\x24\x75\x28\xb1\x2d\xc9\x0c\x41\x36\x97\x02\x1a\x62\x01\x82\x38\x73\x1c\x64\x1c\x05\x18\x13\xd4\x60\xdb\x02\x5a\x40\x87\x09\xc4\x4f\x88\x44\x1e\x82\x48\xef\x64\xaa\xba\x03\x91\xce\xda\xe2\xe5\xc6\xf7\xf3\xac\xb9\x20\x52\x65\xd3\x5f\x24\x52\xc8\x9a\x2b\x71\xdc\xb6\xdb\xfe\x91\xd5\xab\x28\x91\x29\xeb\xba\xea\x2c\x64\xb2\xbb\x52\xb0\x12\xaa\x3e\xad\xa4\x36\xb6\x5e\x6d\xab\xaa\xd9\x09\xd0\x74\x3b\x4b\x79\x85\x83\xf6\x8f\x8e\xe7\xb1\x63\x3d\x18\x36\x86\x8b\xd9\x72\x97\x8b\x26\x09\xd7\x37\xbb\xfc\x39\xc3\xc2\xb0\x9e\x4e\x0e\x69\x05\x96\xb9\xdf\xde\x1d\x4c\x0b\x2d\x4b\x25\xe0\xb6\xab\xf3\x61\x26\x51\xf1\x7b\xeb\x6d\x7d\x97\x5b\x16\x0b\x2b\x7a\xe1\xec\x2e\x44\x8a\x9f\xe5\xde\x80\x08\x55\xf7\x0a\x11\x7e\x9b\xf5\x1f\x20\xd2\xe3\xe8\xdf\x74\x4f\x65\xec\xa4\xe0\x2f\x95\xc8\x97\xe7\xd1\xbf\x8f\xbf\x73\xa9\x92\x65\xf1\xf7\x3e\xfd\x1c\x62\x60\x29\xa8\x74\xb4\xc2\x4a\x68\x49\x30\xe4\x06\x70\xae\x20\xb2\x2c\xa0\x14\x53\xd4\x76\xa4\x01\x4c\x3a\x12\x53\xc0\x29\x41\xda\xa6\x90\xdb\x90\x20\xad\xb4\x3a\xe5\xb6\x43\xf4\x21\x88\xf1\x4e\xac\xf0\x37\x22\x46\x35\xa1\x9b\xf9\x5a\xb7\xd5\x1b\x27\x7c\x77\x61\x57\x69\xce\x51\x20\xd9\x69\x12\xb1\x99\x59\x7c\x3e\x2a\x0d\xfc\xfe\x3a\xa5\x1b\x87\x08\xd9\xad\xb6\x5d\x4a\xcf\x7b\x26\x3d\xa5\x99\xb0\x2d\xed\x28\xa8\xb6\x2b\x9d\x41\x4a\xda\xc5\x8c\x6b\x57\xb4\x83\xdc\x3a\x06\xe3\xd0\x3d\xeb\x30\xf5\xf2\x7a\x35\x5a\x37\x85\x9d\x0d\x16\x0e\x5f\x36\xca\x6e\x4e\x4d\x3b\xba\xec\xf4\x0e\xe5\xfa\x60\x1e\xd5\xa6\xe1\x42\x46\xb5\xb5\x1d\x7e\xe4\xe1\xfd\x39\xc4\x88\x3b\x57\xde\x20\xb1\xcf\xf1\xba\xb7\x4b\xec\x03\xe9\x67\x6e\xa1\x1f\x43\x8c\xbf\x54\x22\x5f\x9e\xc7\x7f\x27\x7f\x9f\x42\x0c\x02\x91\xe3\x70\xe6\x68\xac\x11\x95\xc0\xb6\x31\xe3\x0c\x23\x1b\x43\xdb\x92\x92\x12\xa1\x84\x0d\x6d\x20\x05\x01\xd0\xb6\x8d\xc5\x08\xe7\xdc\x31\x40\x72\xa6\x10\x84\xa7\x33\x4d\xfb\x21\x88\xf1\x4e\x06\xa7\xbb\x11\xe3\x7a\xd4\x2e\x88\x51\x26\x8d\xf4\xac\x03\x2c\xaf\x30\x2b\xa6\x52\xbb\x5d\x79\x63\xb5\x77\x09\x93\x10\x81\xe5\x8f\x02\x96\xad\xd2\x1d\x8a\x58\x90\xcc\xe6\xe5\x7a\xe2\xd8\x10\x3b\x6b\x36\xea\x36\x45\x64\xd5\x15\xae\xf4\x7d\x39\x9b\x58\x87\x99\xbf\xef\xcb\xc2\xd0\xab\xef\x7a\x7e\xaa\xdc\x0d\xe4\x49\xaa\x5b\xa3\x61\x71\x52\x6d\x8e\x44\x4a\x59\x93\x79\x80\x82\x69\xa6\xdc\x13\x10\x15\xf6\x07\xe0\x4d\xcd\x2e\xe2\x8b\x99\x23\x17\xaa\x3c\xfc\xe8\x7c\xf3\x93\x88\x11\x8f\x09\xb9\x41\x62\xa5\x7b\x9f\xc4\x3e\x90\xbe\x77\x0b\xfd\x73\x87\x9d\x10\xe3\x2f\x95\x48\xf7\xd7\x3b\x18\xbe\x28\x2b\xf1\x1c\xff\xb7\x9c\x37\xff\xbb\xc7\xe7\xe1\xf4\x7f\x2b\xaf\xfe\xf9\x53\xb6\x1f\xa3\x85\x63\x39\x16\x81\x50\x0b\x6e\x03\xc9\x11\x74\x20\x24\x42\x48\x63\x23\x60\x41\xa6\x95\x34\x1c\x12\x2c\x1d\x68\x4b\x4c\x84\x26\x8e\x25\xb8\x66\x44\xda\x10\x9d\x2c\xcc\xce\x43\x2c\xcc\xd7\x7d\xfa\xdb\x7e\xf7\x8b\x39\x56\xde\xb1\x30\x67\xa6\xc7\x6d\xa5\xef\x85\x29\xb0\x41\x29\xbf\x99\xcb\x66\xa2\x7c\x67\x3a\xb6\xfc\xea\xc2\x4e\x95\xe7\x46\x1e\xf4\xae\x50\x5f\x15\x8a\x2c\x6a\xe2\x5c\xb3\xec\xed\xca\x01\x1c\x35\x0a\x87\x65\x67\x92\xb2\xf7\x2a\xb5\xcf\x15\x79\xa5\xdc\x0d\xb8\x9b\xdf\xd3\x74\x63\x50\xea\xce\x83\xdc\x13\x3a\x2d\x13\x1b\xb7\x9f\xcd\x6f\x36\xd3\x5c\xb1\x3c\xcb\x47\x1b\x87\x1d\xbd\xf4\x74\x7d\xa4\x85\xd6\x21\x6d\xbc\x4e\xa2\xe3\x6e\x36\x91\x94\xa3\xc7\x58\x98\x0b\x31\x7b\xcb\x17\x2d\xbc\xc1\xa1\x96\x20\xb1\xab\xeb\x6f\xb2\xf0\x3e\x90\xfe\x1b\xd6\x8c\x4f\xdb\x7b\x26\xb1\x57\x37\x58\x78\x23\x79\x55\xf3\xef\xe5\x7d\x7b\xcf\xed\xf4\x67\xc4\x72\x58\xfb\x0e\xfa\xee\x15\xfd\xaf\xe6\x6e\xb9\x58\x98\x0b\xef\x65\xaf\xbd\xdd\xc2\x0c\x11\xc1\xca\x38\x16\x04\x00\x60\xe0\x70\xc6\x98\x46\x40\x42\x46\xb1\x02\x54\x38\xda\x68\x47\x63\x06\x85\xad\x6c\xac\x34\xc1\x0c\x31\x07\x12\xc0\x2c\x0d\x2c\x0c\xcc\x33\xca\xc0\xfb\x51\xa6\x7e\xc5\xfe\x6f\x7d\x7d\x43\x86\xa0\xb7\x50\x26\x43\x3b\x5b\x37\x2c\x81\xdd\x30\x5a\x29\xfb\x18\x66\x0a\x6b\x6b\x98\xad\x26\xa3\xf9\x3c\xa0\x7e\xa1\x30\x4d\xba\x4e\xab\x10\xb1\x51\x73\x54\xae\x54\x47\x9b\xa0\x96\x5a\xbb\xb6\x69\xec\xeb\xa4\xd8\xb4\x52\xbd\x92\x58\x07\x07\x67\x91\x8d\x0e\x2b\x2b\x4f\x4d\x53\x27\xe5\xee\x94\x79\x3c\x0f\x9a\xa6\x9f\xf6\xea\x41\xb8\xe8\x4d\x47\xb9\x74\x34\xb6\x3a\x9b\x6a\x72\x46\x0a\x45\x04\x2c\x14\x35\x9a\x93\x74\xab\x97\x19\xa4\x52\x1f\x65\x70\xba\x1a\xc9\xc7\xa3\x4c\x55\xd5\x6a\xed\x7b\xa5\xfc\x81\xf4\xaf\xc7\xff\x53\xf4\x1f\x82\x32\xbf\x49\xf9\x4d\x56\xe5\x3b\xe8\xef\xfa\x24\x99\xbd\x83\xbe\x7b\x45\x3f\x43\x0a\xa3\xa1\x58\x24\xea\x86\x8c\x56\xad\x43\x00\x93\x6b\xff\x98\xde\x0d\xeb\x7d\xab\xa7\xc8\x74\xc4\x46\x6e\xdd\x05\x8d\xf1\xe8\x98\x38\x7d\xff\xdb\x51\x06\x00\xdb\x22\x86\x61\xa9\x28\x51\xb6\xa0\x36\xe2\x00\x62\xee\x10\xa9\x11\x75\xa4\x63\x19\x07\x13\xc7\x18\xae\x95\x31\x36\x60\xc8\xc2\xca\x31\x0e\x66\x04\x11\x81\xf5\xc9\x6a\x1c\x8f\xf0\xbf\x3d\x5f\xdc\x47\xb7\xa4\x5c\xb7\x34\x36\xcb\x3e\x55\x52\x2f\xbd\xea\xa5\x0f\xa3\x0c\x07\x3a\x31\x5a\x77\x37\xe3\xe6\x32\x17\x6d\xaa\xf6\xde\x2a\xef\xed\xce\x08\x4f\xea\xb3\x32\x6e\x90\x96\x9b\x9d\xd4\xdb\x09\xb8\x6c\xcf\xf6\xa3\xf2\x6e\x91\x2d\x0c\xd6\xe1\xd4\x73\x5b\x6d\xc0\x12\x69\x72\x90\x73\x32\xaa\x96\x4a\xf3\xce\x7e\x99\xd6\xf5\x62\x21\x68\xf9\x4f\x48\xe0\x75\x53\x26\x2a\x83\x08\xd8\xbd\xe3\xac\xd1\x98\x75\xab\x95\xd9\xc1\x4d\x78\x9d\x5a\x62\x83\x92\xb2\x57\xf6\x60\x6d\x50\x68\x81\x75\xec\x6c\xfa\x1e\x9f\xa5\x42\xac\xfd\x37\xa0\xf0\xf3\xd9\x51\xf8\x4e\xb7\x7d\x80\x32\x8f\xa3\x7f\xef\xad\x27\xd3\xcb\xab\x5b\xa4\xec\x7c\x76\x54\xe8\xbf\x43\xf3\x7d\x94\xf9\x46\xfa\x77\x67\xde\xa6\x86\x63\x6a\x0b\x82\x0c\x41\x0e\x55\xb6\xcd\x15\x22\x12\x12\x0b\x6a\x05\xa5\x42\x4a\x39\x02\x53\x8b\x13\xa1\x21\x14\x54\x40\x07\x38\xc2\x01\x42\x2a\xa4\x15\x54\xfc\x5f\xff\xfc\xc0\xf1\x28\xf0\xe2\x7a\xb3\xcc\xe6\x0a\xdd\xa4\xae\xaf\x49\xbf\x4c\x17\xf9\xae\x5b\x16\xbc\xbb\x8d\xf2\x93\x45\xe9\xb0\x72\x69\xb0\x64\xeb\x92\x9e\xec\x4f\xb1\x3a\x9f\x93\xf2\x6b\xbb\xcd\x17\x7a\x31\xf7\xda\x69\x75\xf6\x85\x7e\x50\xac\x38\x25\xb3\x76\xb9\xd1\x33\xd7\x9f\x6c\xe7\x2b\x6f\x36\x5e\x4c\xb0\x3d\x72\x37\x8b\x1d\xee\x83\x56\x67\x34\x29\x59\x23\x1a\xd4\x26\x60\xb4\x9f\xf1\xe8\x98\xd9\x65\x1a\xa8\x93\xa8\xc0\x5c\x35\xa7\x46\x8d\x42\xe4\x05\xbc\xb9\xf7\x53\x26\x28\xe6\x06\x4b\x3a\xad\xac\x9e\xef\x87\x14\xb4\x3e\x5d\x37\x59\x73\xb0\x56\xd4\x02\xbb\xc8\xdd\x58\x2b\x8b\xc1\x52\xbd\x3f\x17\x78\xb8\x5e\x16\x53\x43\xec\x3b\x56\xc2\x5a\x7f\x94\xed\xe8\x73\x76\x9b\x78\x50\xe5\x0d\xbb\xbb\xe7\xb3\x99\xdb\x25\xfe\x81\xf4\xef\x3d\xad\x8e\x99\xf5\x6f\xd1\xde\xcf\x77\x35\xde\x21\xf1\x8f\xa6\xff\xd5\xd3\xea\x7b\x32\x63\x5e\xec\x56\x0f\xcf\x8c\xf9\x29\x44\xb2\x84\x14\xd4\xe6\x1c\xd1\x53\x52\x0a\x05\x31\x36\x5a\x1a\x83\xb8\x25\x11\xb3\x8d\x03\x0c\xe2\x4c\x00\x84\xa1\x43\x1d\x87\x51\xa2\x6d\x9b\x2a\x8c\x6d\x69\x09\xa0\x7f\x22\x12\xbc\x1f\x91\x3e\x3c\xad\xbe\xe4\x9d\x7d\x20\x22\x95\x6b\xed\x7e\x68\x12\x3b\x8b\x29\x3d\xcf\x34\xf6\x65\x59\x98\x8e\xda\xbd\x9c\x0b\xb3\xd1\x38\x35\x19\xd4\x26\x43\xab\x42\x69\x76\x33\x70\x8f\x4d\x3d\xee\xc8\x74\xb5\xac\xd2\x79\x4b\xb6\x64\x62\x5f\x18\x1c\x76\xa5\x6e\xa3\x3c\x2c\xba\x74\x57\xa3\x45\x86\x2b\xf5\x28\x1b\x05\xde\x09\x35\xd2\xce\x7a\xba\x18\xf5\x5a\xf5\xad\x35\x6e\x26\x8e\xc9\x6a\x7f\x47\x0c\xce\x1d\x17\xc2\xb3\x8a\xfe\xb0\xd0\xd3\x0a\x02\xcf\xb8\x2b\xfd\xd7\x21\xd2\x4d\xa7\xd5\x0f\xa4\x7f\xdb\x69\xf5\xb7\x20\xd2\xa7\x6e\xdf\xbd\xe6\xf1\xd1\xf4\x3f\xba\xbd\xf6\xba\xfc\xa5\xb9\x7a\x3f\xe9\x37\x0c\x35\xb2\x8c\x22\x36\x66\x50\x18\xa8\xa1\x00\x08\x6a\x20\x24\x03\x9c\x60\x87\x23\xca\x80\xc3\x84\x16\xc6\xb6\xb5\x80\x02\x29\x07\x32\x00\x01\x67\x0a\x4a\x62\x3d\x67\xce\x7e\xc0\x4e\xe8\x1d\x44\xba\x2d\x73\xf6\x45\xa7\x8a\xcd\xe4\x58\xe6\x6c\x5a\x85\x46\x83\x7e\x90\xda\xcd\xaa\x96\x29\x57\x2a\x5e\xab\x98\xb3\x02\xd5\xee\xb6\x47\x5e\x47\x54\x48\xbb\x44\x40\x66\x52\x6f\x69\x15\x96\xcb\xdd\xb5\xe8\x92\x42\xb1\xdd\x38\x46\x1c\x8e\xf3\xfe\xb6\xd3\x8f\x56\x40\x75\x37\xdd\x5c\x2f\x4c\xe6\xab\x11\x2f\x5a\x60\xf9\x33\x8a\x43\x34\xf0\x2e\xd9\x56\x85\x62\xb2\x34\x5c\x35\x4b\x83\x6d\xc1\x8f\x1a\xc5\xca\xdc\x2f\x6c\x97\x0c\xd1\xc3\x8a\xf5\xe7\xde\x60\xa1\x4a\xb1\x28\x9d\xbf\x24\x73\xf6\xb5\xf4\xfd\xe9\xcc\xd9\x37\x65\xee\x7e\x50\xe6\xec\x6f\xd4\x0f\xdc\x47\x64\xce\x7e\x30\x7f\x5f\x3e\x09\x57\xd4\x96\x46\x40\x1b\x70\xc7\x61\xda\x76\x08\x36\x46\x51\x20\x2c\x47\x73\xa9\xb4\x4d\x15\xa1\xda\x26\x0e\xa6\xd4\x48\x64\x73\x47\x6b\x09\x15\xe2\xd8\xd2\xc6\x11\x00\x3f\xa1\x05\x7c\x08\x5a\xbc\x73\x12\x7e\x6f\x9e\xfd\x58\x89\xa1\x85\x57\x2b\xca\x60\xe2\x36\xfd\xb9\xde\x2e\xd7\x91\x2b\x7b\xd3\x4a\x3e\xe9\x8f\x4c\xa9\x14\x78\x73\xc6\xab\x19\xdf\xaf\x67\xdb\x09\x98\xc6\xad\xaa\xa3\x5a\x89\x96\x5b\x6e\x8e\xd3\x8d\x6e\x50\xca\x24\xf6\x35\x5e\x0f\xf6\xc7\x1d\x43\x0d\xe9\xcd\xc6\xd4\x3f\x86\xe9\xf5\xda\xfe\x99\x35\x05\x4c\x8f\x76\x61\xbf\xc8\x4f\xa7\x83\x56\x92\x85\x22\x5d\x5d\x56\x08\x04\x1d\x02\x06\xbe\x70\x2a\x74\xb4\xd9\xad\xab\xe3\xcc\x76\xb8\xbf\x88\xd9\x5d\x68\x11\xb3\xaa\xdd\x22\xad\xf2\x32\x0e\x37\xe5\xb9\x7f\x20\xfd\x6b\x42\x5f\x45\x8b\xbf\x34\x8f\xfd\xcb\xf3\xe2\xef\xe1\x2f\x5e\x3e\x85\x16\x0c\x13\x41\x81\x0d\x94\xb6\xb1\xcd\x05\x82\x48\x20\xa9\x38\x81\x90\x59\x0c\x21\x65\x10\xd3\x4a\xd9\x16\x05\x86\x6a\x48\x2d\x9b\x42\x4a\x91\x36\x92\x00\x21\xa5\x38\xe9\x16\x8f\x89\x49\xba\x96\xec\xdf\x34\xcc\xd1\x76\xc3\x67\xa0\x56\x02\xad\x44\x9a\xa7\x8d\x9d\x4c\xd0\x44\x39\xb9\x6f\x4d\xbd\x69\xab\xa5\x32\xc3\x72\x71\x3d\x28\xe1\xe5\x08\xeb\x8f\x4e\x8c\x53\x59\xd1\x80\x92\x2c\x97\x61\xc5\x5f\x45\x95\xf6\x2a\x6a\xe6\x72\xce\xc8\xd9\x5b\xfd\xbe\xde\x01\x9d\xcb\x55\x5b\xcd\x0a\x1f\x95\x6b\x07\xc7\x0f\xa7\x04\xd6\x1b\xbb\xfa\x54\xee\x76\xdb\x2d\xd0\x23\xcf\xb8\x89\x7e\x72\xd2\xec\x96\xe7\xdd\x65\xaa\xea\x60\x3b\x8d\x69\x71\x76\xba\x9f\x31\xca\xae\x07\x52\x11\x4b\x2f\xcb\xa3\x95\x03\xa3\xfc\x3c\xdd\xac\x99\xaa\x46\xdd\xd4\x80\x6d\x0a\x7d\x35\xec\x8d\x6c\xa7\x25\x8e\xb1\xcc\x07\xf7\x9c\xe5\x14\x6f\xbf\x71\xbe\x9c\xaf\x9a\x5d\xe2\xf2\xf3\x9b\xce\x52\x1e\x48\xff\x77\x64\xff\x04\xfd\xd8\x0e\x67\x19\x7b\x75\xc3\x59\x4a\xe6\x22\x55\xa9\x37\xee\x13\x7a\x7f\x87\x73\x07\xfd\x69\x19\xb9\xc7\x3b\xe8\xbb\x57\xf4\xd3\xd5\x04\x59\x8c\x5a\xce\xb6\xdd\xc4\x85\x59\x21\xb9\x4d\xda\x4b\x7c\x4c\x66\x1b\xb2\xa1\xea\x75\xab\x9a\xdf\x2d\xa0\xb7\x1d\x6e\x6a\x03\xfb\xea\xc4\xb8\xf8\x3d\x37\xde\x6b\xcb\xb6\x91\xb2\x6c\x2e\x38\x44\x0a\x00\x4d\xb9\x45\x85\x05\x01\x75\x20\x64\x58\x68\x60\x98\x81\x16\xe4\x90\x41\xea\x40\xdb\x82\x90\x20\x46\x29\x94\x1a\x4a\xfb\x94\xeb\x13\xc7\x63\x92\xf2\xb6\x3d\x59\x54\x9a\x07\xd6\xae\xf5\x27\xfd\x69\x22\x99\xdc\x6c\x47\x35\xa7\x5d\xd8\x17\x40\x36\x17\xe0\x51\x7a\x19\x36\x12\x45\x9c\xc8\x6d\xdd\x17\x9d\xe4\xa3\x1b\xef\xcf\x0b\xde\x4d\x77\x11\x87\x3f\x51\x27\xe5\xa2\x51\xc1\xde\xa5\x96\xf5\xf9\x6a\x29\xa7\x8b\x54\xd0\x19\x1d\x8e\xbb\x6d\xfb\x08\xb7\xa4\x55\x20\xd4\xa7\x56\x7e\xd0\x5f\xf1\x4e\x90\x6d\x98\x84\x3d\x9b\x60\x0a\x8b\xcd\x99\x4c\xe4\x0a\xd0\xe6\xa5\x76\x35\x70\x90\xf2\x07\x60\xb8\x9d\x27\xda\xf9\x4d\xdd\x2b\x2c\x92\x8d\xd4\x73\xfe\x7a\x9c\x93\x2c\x45\x37\xc3\x5a\x3d\x37\x99\xf9\xab\x74\x76\x96\x9f\x37\x12\x39\xe2\xf4\x8b\xc3\xf1\xa4\x3f\x75\x87\x2d\xd2\x1b\x1e\x87\xfb\xe4\x47\x9e\x78\xb1\xc5\x3d\x0a\x4a\x98\x9c\xbf\xff\x16\xca\xc4\xd3\xb4\xdc\x80\xc2\xcf\x67\x29\xb7\xdf\x60\xff\x40\xfa\x37\x59\x76\x63\x1e\x79\xff\x46\x29\x3f\xf1\xb8\xba\x9d\xfe\x13\xca\xa5\x5b\xb7\xd3\x2f\x5f\xd1\xbf\x05\x65\xce\x67\x49\xc5\x9b\x6e\xf0\x8f\xf1\xfb\x05\xf9\xff\x8c\xef\xb0\xc0\x50\xda\xb6\x85\xa1\xb1\xb0\x30\x36\xa0\x94\x30\x6e\x11\x6d\x4b\x8e\x0c\xb6\x2d\xc4\x8d\x85\x1c\x6e\x2b\x6e\x13\x01\x2c\xe1\x10\xe4\xd8\x96\x2d\x99\x31\xc0\x86\xa7\x9b\xc9\xc8\x43\x74\xa0\xe6\x55\x93\x7f\x9b\xad\x98\xa1\x30\xe5\x15\x55\x53\xb7\x2b\x68\xd7\x1a\xf5\x57\x86\xd0\x44\xdb\x0e\xfb\xf3\x51\x43\x2d\x32\xe9\x4e\xb3\x6c\x46\x7e\x7a\x7d\x90\xe9\xfd\x6c\xb9\xdb\xec\x7f\xe9\xce\x78\x5c\xb6\x9f\x8e\xea\xba\x26\x5d\x6f\x1f\x24\x3b\xc5\xe5\x6c\x86\x92\x48\x19\x39\xa8\x25\x0f\x79\xa7\x59\xcf\x2c\x97\xa3\x75\x52\x0e\x7a\x0e\x6a\x95\x86\x4d\x49\x70\x44\x76\xf2\x08\xdc\xb1\x28\x71\x9a\x76\xf9\x5c\x35\xfc\x79\xab\xd3\x1d\x93\xf1\xaa\xb9\xc8\x74\x4b\x53\x7c\x46\x90\x8e\x55\xca\x49\xaf\xb4\x6b\x24\x65\xa7\xd7\x9b\x65\x89\x33\x4b\xd6\x77\xd5\xad\x8b\xe7\x6c\x0e\x56\xc1\x26\x5b\xcd\xa5\x9c\x69\x32\x7b\x78\x8c\x3f\x4b\xe9\xf6\xb8\xe8\x93\x0e\x12\x4b\x65\x72\x93\x0e\xf2\x40\xfa\xd7\xe3\xff\x29\xfa\x31\x1d\x28\x76\x8f\xd4\x2d\xe8\x10\xf3\x59\x48\x5d\x27\x78\x79\x2e\xef\xa3\xd3\x8d\xf4\x57\xbc\x48\xd6\x91\x75\x17\x7d\xf7\x8a\x7e\x66\x84\x54\xdf\x0b\xe6\xa0\x42\x5a\xc8\xa4\x1a\xd5\xf4\x3e\x39\x5d\x92\xee\x7a\x98\x9e\x54\x0a\x70\x56\x2e\xf4\xca\xfb\x44\x39\x2c\xa2\xc2\xae\xe4\x0f\xb7\x69\xfb\xa7\x99\xaf\xf4\x3d\x71\xd9\x36\xb4\x6c\xa5\x89\xb0\x09\xc4\x48\x5b\xc2\xa2\x50\x22\x07\x21\x43\x1c\xdb\x42\x54\xd8\x9a\x19\x8a\x31\x41\x42\x63\x66\x0c\xb1\x0c\x32\xc8\x28\x69\x13\x40\xb5\xa4\xe2\x09\x65\xe2\x31\x4d\xd5\x9a\x82\x6e\x3d\x3d\x6d\xa1\xa8\xa9\x9c\x6c\x1e\x97\x72\x09\xbd\x8d\x34\xcc\x17\x43\x6b\xca\xfb\xbb\x68\x7c\xcc\xe1\x7d\x7f\x29\x4f\xcb\xdf\x59\x07\x3a\xa5\xa3\xfb\xc8\x9f\x25\x75\x4b\xfd\x5f\xce\xf5\x13\xa3\x7f\x1e\x85\xd3\x24\xaa\x8e\xfd\x6a\xad\x59\x4d\x65\x1a\x81\x3d\xed\xc0\xde\x34\x21\xa2\x15\xac\x65\x5a\x5a\x8c\x61\x72\x8c\x92\xfd\x45\xae\x18\x38\x3a\xac\x66\x57\x19\x3a\x4d\x69\x6f\x7b\x28\x67\x1c\xe2\x6c\x67\x24\xc5\xc5\x28\xd8\xa5\xd8\x70\x3a\x72\x53\xf9\xb2\xa3\x57\x99\x81\x2d\xbc\x71\xfa\x09\x39\x64\xdf\xe8\x0e\x6a\x8d\x6b\xfd\x95\x5f\xca\xf4\x8f\x2c\x94\x19\x8e\xa8\xe9\x79\x2d\x9b\x14\x92\x20\x73\x74\x92\x28\xd7\xea\xd8\xfe\x63\x6e\x75\x2d\xc5\x54\xac\xaf\xa3\x76\x2d\x39\xbd\x8c\xd7\x1b\xe5\x03\x54\x7a\x1c\xfd\x7b\xfd\x5f\x36\x97\x57\x5f\x97\x4a\x2f\x99\x38\xe9\x0c\xa5\xdb\x63\xb7\xbf\x87\x7e\xf0\xd5\xfa\x3e\xe2\xf7\x73\xd6\x5d\x88\x0d\x76\xa8\x50\x36\x84\x46\x01\xc7\x26\xc2\xc1\xc8\x41\x4c\x3b\x8e\x25\x94\xd6\x1c\x41\xac\x21\x51\xc2\xb6\x28\x87\x94\x1b\xa2\xb1\xe2\xdc\x91\xc4\xb2\x81\xfe\x89\x22\x0f\xf0\xbd\xbd\x4e\xdf\xf3\x3a\x8a\x7c\x35\xf6\xe4\x0e\x14\x89\xd9\x77\xc2\xbc\xd5\x2c\x07\xed\x4e\x6d\x3b\x4d\xc3\x62\x4d\x64\xe6\x03\x56\x3e\x1c\x49\xab\xbc\x49\xd5\xf3\xe1\x1a\x86\x81\x5a\x47\xb5\x30\x8d\x5b\x39\x3e\x09\xa7\xb9\x55\xb9\x3f\x98\xe7\xcb\x86\x37\xec\x72\x47\xe5\x36\x7e\xe8\x80\x44\x36\x35\x3b\x56\x57\x8d\x44\x32\xe7\xcf\x06\x41\xe6\x49\xd2\xad\x31\xcb\x73\x26\x87\xc9\xfa\x00\x6c\xbc\x6a\x66\x3a\xeb\x97\xd0\x66\x76\x68\x0e\xbb\x42\xfa\xb3\xc9\x12\x90\xca\x62\xb6\x0f\xa4\x7e\x3c\x8a\x7c\x41\xb7\x28\xf9\xc3\x8d\xe8\xa9\xda\xf6\x78\xf9\xf9\x4d\xba\xc5\x03\xe9\x5f\xcf\x97\x4f\xd1\x7f\x1d\x45\x6e\xd0\x2d\x12\xc9\x8b\x42\xf1\x5b\xba\xb1\xe7\xf2\x69\x14\x79\x20\xfd\xdb\x33\x53\xdd\x83\x22\xd2\xe1\xd0\x31\x02\x12\x85\x6d\x07\x1b\x64\x73\x9b\x5b\xb6\xa3\x81\xd1\xda\x58\x5a\x20\x4b\x72\x8a\x35\x63\xd8\x46\x98\x42\xc2\x25\xd6\xdc\xa2\xb6\x94\x14\x02\x4c\xf1\xbf\xfe\xf9\x41\xe0\x43\xf2\x32\xbf\x73\xbb\xea\x7b\x79\x99\xdd\x5d\x39\x7e\xaa\x11\xcb\xcb\x8c\xbc\x7d\xa1\x92\xb3\xd9\xce\x6f\xd4\xc3\x9e\x5e\xd6\x6a\xe0\x58\x0e\x23\x3d\x2f\xaf\x36\x83\x59\x21\x4b\xb6\xb9\x29\xec\xa7\x57\xb9\x49\x66\xde\x31\xfd\xaa\xd3\x2e\xa6\x51\xaa\x9e\x9f\x54\x13\x53\xcd\x56\xf3\x56\x37\x6a\xe7\xca\x23\x6f\x33\xa8\xe6\x66\xb5\x41\x04\x06\xcb\xf2\xcf\xbb\x96\x0f\xc5\x62\x6d\x15\x81\xdc\xa0\x56\xa1\xba\xaf\xab\xb9\x84\xbd\xa3\xc7\x4c\xb1\x57\x9d\xb4\xa4\x15\x46\x4b\x8f\xf6\x7b\xce\x7e\x98\xf5\x3f\x3a\x03\xfa\x5c\x5e\xe6\x78\x5e\xdf\x1b\xf2\x22\x0f\x16\xee\x7d\x79\x91\x1f\x48\xdf\xbf\x85\x7e\x4c\xfa\xcf\x40\xf2\xcd\x79\x99\xcf\xed\x7d\x50\x5e\xe6\xa7\x39\x1a\x23\xf0\x19\x2b\x29\x67\x48\x1b\xe5\x48\x68\xb0\xc6\x44\x5a\x08\x38\x92\x32\x2d\x19\x71\x28\x44\xdc\xd2\x18\xd9\xd8\x60\x4b\x11\xca\xb4\x96\x00\x62\x85\x91\x74\x38\xc1\x8a\x42\x42\x9f\xd6\x76\xfb\x21\x76\x88\xf6\xab\xa3\x71\x2a\xb1\x23\x95\xf6\x4f\x2b\x68\xca\x4d\xb5\x72\x9b\x6e\x98\x28\x37\xfb\x9d\xe4\x2e\xb3\x25\x89\x4a\xa6\x3d\x60\x66\x87\x27\x7a\x75\xdc\xeb\x6e\x95\x39\x39\x2f\x30\xfd\x6e\x5b\xa7\x7b\xb6\xae\x8a\x74\x1e\xce\x96\x0d\xbf\x55\x71\x93\x8d\x22\xcd\xb5\x59\x72\xd3\x6c\x37\xf6\xf9\x20\xe8\xe4\x57\x33\x10\xcc\xf6\xb9\x9f\x7e\x1a\x74\x5e\xdb\xc2\x72\xc9\x22\xd9\x5d\xc6\x2f\x73\x7d\x68\x0f\x86\xd5\x3e\xc9\xa8\x5a\x50\x69\xcf\xed\x95\x37\x06\x99\x43\xb1\x5d\x09\xa3\x8b\x57\xd8\xeb\x52\x17\xe3\xfd\x7c\x85\xd6\x97\x70\x77\xb8\x6a\x94\x0b\xa3\xd4\xd9\xec\xfb\xb5\xdd\xd1\x70\xd5\xa8\xb0\x3d\x3e\xeb\x04\x6f\xae\xf5\xb7\x9d\xa5\xbc\xac\xb5\xfc\xf2\xf3\xd8\x5a\x7b\x7b\x96\xcf\x0f\x75\x83\xc7\xf1\xdb\xfe\x13\xfc\xc6\xac\xb8\xdb\xd8\xab\x1b\xd6\x72\x76\x81\xef\xd4\x75\x04\xc8\x23\xd7\xf2\x97\x36\xdd\xcc\xef\x3a\x4a\xee\x13\x83\xa4\xf7\xe7\xf8\xfd\xc6\x1d\xdf\xc3\x77\x5c\xaf\xf5\xef\xd7\xf8\x5d\xf2\x9c\x1e\xcb\xb3\x05\xe4\x2f\xd9\x21\x6a\xe1\x10\x87\x4a\x06\x6c\x2a\xb1\x34\x50\x3b\x14\x0b\x48\x20\x60\xd8\xe1\xcc\x86\x4a\x10\x68\x63\xa5\x21\xa6\x36\xa2\x94\x61\x8a\xb4\x25\x6d\x07\x62\xa9\xb5\x75\x5e\x45\x1e\x13\x03\xde\xb9\x62\xff\xb7\x1d\xdd\x0d\x3a\xc5\x5b\x59\x46\xdd\x72\x75\x4a\x7d\x3c\xda\xac\xfa\x73\xd3\x98\xe5\x76\xd3\x75\x2e\x18\x87\xf9\xcc\x3e\x9f\x6c\x4f\x0f\xb9\xe4\x22\x3f\x4c\x08\x55\xee\x1c\x87\xa0\x49\x3b\xd1\x6e\x5a\x4d\x1c\xf2\xcd\xfe\x04\x26\x26\x55\xde\x91\xf4\xd8\xde\xec\x87\xa5\x51\x2e\x8a\x8e\x29\x1d\x24\xf7\xc5\x6d\x50\x39\xad\x3e\xb8\xe3\x1f\xea\x6a\xd5\xac\x95\x66\xbd\x52\xa1\xe1\xb7\x86\x73\xb9\x5e\x37\x54\x05\x8f\x7b\xc7\xde\xbc\x3e\xc2\x65\x9d\x6e\x56\x71\xf6\xa3\xd5\xe7\x6a\x24\xdf\xba\x8b\x23\xf6\xad\x2f\xa1\xea\xb2\x67\x1c\x33\x33\x31\xcf\xe8\x3f\x82\xaa\x0f\xe4\xb7\xf3\x27\xf8\x8d\x59\xcb\x63\xf2\x76\x0b\xaa\xb2\x8b\x36\x9b\xba\xf7\xc6\xf9\xf8\x6f\x5f\x2b\xde\x9d\xfc\x42\x65\x8f\xd6\x7f\x90\x5f\xf7\x8a\xdf\xaf\xea\xec\x17\x8f\x84\x37\xce\x01\xde\xa1\xff\x39\xbf\x27\x63\x0c\x05\x0c\x50\x1b\xd0\xa7\x8d\x30\xb1\x2c\x8c\x0c\x97\x8c\x3a\x5c\x52\x09\x90\x63\x41\x6e\x08\xb0\x29\x07\x96\x91\x90\x01\xcb\x31\xd2\x48\x8c\x89\x36\x04\xa0\x27\x94\x64\x0f\xd9\x01\xbf\x63\x8d\xbf\xed\x66\xa2\x7d\x71\x98\x0b\xc3\x4a\xa9\x30\xec\xa0\x25\x49\x8c\xd3\x85\x89\xb3\x91\x7c\xd6\xb6\x53\x72\xe9\x4d\x83\x6e\x56\xa0\x15\xa8\x1f\xea\x87\x96\x70\xc7\x99\x88\xa7\xb7\x5e\xa2\x5e\xdc\x95\x7b\xb3\x4a\xcb\x88\x71\xd0\xf2\x97\xb3\xcd\xa1\x5d\x3c\x80\xde\xbc\xa5\xa5\x4c\x1d\x16\x99\xe7\x1d\xf0\x34\xc9\x06\xe3\x8e\xec\x24\x0e\xed\x20\x95\x49\xac\xa2\xd9\xd2\xdf\x35\xfb\xe9\x25\xc8\xc2\x59\x90\x4c\x8f\x83\x91\x93\xf4\xea\x9a\xd5\x2f\xe3\x76\xd7\xcd\x44\xb1\x26\xde\x72\x33\x10\x70\x5f\xf1\x7f\xfc\xa5\x7c\x80\x6e\x8f\xa3\x7f\x6f\x4c\xd9\x3e\xf6\xee\x06\x69\x2a\xb5\x5e\x6a\xba\xcd\x8a\xfe\x68\xfa\x5f\x8d\x29\xfb\xce\x9b\x99\x3e\xa5\x57\x61\x6a\x31\xe0\x58\x36\x01\xda\xb6\x2d\x88\x29\xe5\x8e\x83\x89\x43\x6c\x65\x30\xd2\x58\x01\x82\xb5\x74\xb0\xa0\x82\x2b\x0a\xa5\x26\x96\x6d\x34\x80\x06\x28\x6e\x18\x7b\x46\x0c\x78\x3f\x62\xbc\x13\x85\x11\x47\x8c\xfc\x2f\xef\x53\x99\x16\xac\x1c\x63\x06\x98\x18\x62\x8c\xf6\xfd\x69\xb3\x9e\x4a\x73\x6b\x0a\xb4\xe9\xcd\xe4\x7e\xee\x8d\xba\x3a\xdf\x0c\xc8\xca\x0b\x9b\x6d\xc5\xcc\x6c\xb7\x59\xcf\xe0\xb8\xb6\x23\x3a\xbb\xeb\xb7\xa7\x47\x5a\x5d\x16\x0b\xbb\x74\x7d\x4d\x4a\xce\x21\x9a\x74\x86\x6e\xb3\xdb\xce\xa3\xde\xc1\x0c\xd1\xa1\x59\x5c\xa4\x9e\xa5\x9a\xf8\xe9\x7a\x3f\xd7\xd2\x6a\x57\xf0\xf9\x6c\x90\x1d\x74\x91\x55\x1b\x5b\xed\xe6\x6a\x50\xe2\x14\x0c\x8f\x51\x2a\x89\x1b\x8e\x5a\x92\x8b\x6a\xf7\x97\x20\xc6\x4d\x31\x5f\x0f\xa4\x7f\x6f\xcc\xd7\x03\x25\xf6\xa6\x98\xaf\x47\xd3\xff\x6a\xcc\xd7\xfd\x88\xf1\x22\x2e\x01\xa8\x8c\x64\xcc\xef\xfa\x53\x88\x81\x1d\x0c\x88\x54\x96\x51\x9c\x09\xc9\xb8\x16\xc0\x58\x02\x03\x26\x8c\x80\x8c\xd9\xc6\xe6\x90\x73\x20\x80\x36\x50\x13\xc0\x2d\x6a\x41\x49\x01\xb0\xb0\x91\x10\x49\xf9\x8c\x18\xe8\x7e\xc4\x78\x27\x8b\x69\x0c\x31\x1a\xbf\xbe\xcf\xc0\xc8\x92\x87\xd4\x54\xa0\xa0\x2f\x51\x6a\x10\xc2\xf6\xf1\x97\x9c\xf5\x31\x04\xa9\x4c\xc2\xfe\x70\x1a\x0e\xba\x09\xda\x76\x57\x11\x28\x6c\x26\x66\x3f\x4e\x11\xfb\x00\x4b\xb9\x25\xef\x64\x5a\xe3\x7a\xa2\x98\xd9\x77\x3a\x4e\x44\xe6\xa6\xd9\x1e\x96\xf6\x7b\xbb\xe0\x90\xe2\xb2\xda\xb6\x16\x95\x74\x88\xeb\x86\xaf\xfa\x8b\x7d\xd6\xca\xa6\x91\xb7\x0c\xa5\x4e\x3f\xdb\xff\x1a\x5e\x56\x5a\x35\x38\xdf\x16\x96\xcb\xdc\x6e\x9d\x9a\x24\x57\xf3\x28\xa9\x87\x8b\xc1\x4a\x3b\x9b\x16\x4f\xf5\x4b\xbe\x17\x34\x9d\xbc\xf3\x91\xd7\xe3\x1f\x47\x90\xf3\x8c\xfd\xea\x6d\x88\x8f\xa3\x9f\xb9\x85\xfe\xf7\x20\x48\xd9\xfd\x9a\x04\x3f\x1a\x41\xca\xee\xab\x9a\xe0\x37\x23\xc8\xc5\x67\x91\xcd\x55\xae\xdc\xef\x41\x66\xe5\x73\x95\x5d\xd8\xa9\x44\xf2\xf0\xcb\x38\x7c\x2a\x12\x14\x50\x49\x2d\x66\x61\x5b\x1b\xc7\x30\xc9\x99\xe5\x70\x6c\x3f\xfd\x8f\x63\x21\x2c\xe0\x60\xcc\x24\xa1\x8c\x60\xc6\x15\x94\x9c\x5a\x84\x59\x9c\x0b\x1b\x43\x6a\x6b\xe7\x5f\xff\xfc\x20\xd6\x43\x76\x2d\xef\xc4\x76\xbd\xaa\x83\xc4\x47\xf6\xa5\xbe\xc0\x0d\xeb\xbd\x4a\x6d\x50\x48\x37\x77\xa3\x42\xdf\x2d\x30\xa1\x3d\xd4\xab\x26\x73\x68\x1c\x16\x06\xe1\xa4\x0d\xe6\xe9\xc9\xc1\x96\x4e\x6f\x09\x57\x45\x55\xac\x4e\x78\x69\x8a\xcd\xc4\x25\x0b\x5e\x4a\x44\x41\xb9\xb8\xab\x36\x06\xeb\xd1\x6e\xdc\x73\x0a\xb9\x7d\xad\xa5\x1c\xff\x39\xcf\x71\xd8\xd9\xf7\xc7\x9e\xd9\x8e\xc8\x61\x9e\x2e\xd6\x69\x9d\xce\x4b\xab\xd4\xc0\x9b\x66\x79\xbb\xc1\xad\xd5\xbc\xdf\x09\x16\x4b\x95\xee\x25\x3e\xba\xe5\xfa\x93\xa8\x11\x93\xb2\x5b\xa4\xf6\x92\xdf\xf2\xf9\xdf\xdf\x3c\xf1\x3f\x40\x8d\xc7\xd1\xf7\x6e\xa1\x1f\xb3\xae\x7f\xe7\xba\xeb\xba\xf1\x3b\xb2\xee\xae\xff\xc4\xef\x21\x56\xf7\x0d\x28\x53\x88\xdd\xe6\x1a\xb8\x5f\x43\x19\xef\x3b\xe8\x7f\x12\x65\x3f\x65\x27\x11\x12\x00\x41\x24\x06\x4a\xdb\x0c\x20\xca\x8c\x72\x88\xe1\x40\x4a\x63\x01\x89\x88\x84\x96\x32\xc4\x30\xc7\x18\x68\x6c\xa2\x2c\xa8\xb9\xa2\x40\x18\x45\xa0\xa5\x21\xf8\xd7\x3f\x3f\x68\x3c\xf6\xbc\xe8\x77\xed\x7a\x93\x51\x9d\x9f\x42\x8b\x6c\x66\xad\x5c\x38\x5d\x94\xc4\x1a\xca\x5a\xbd\x52\xad\x2f\xb9\x37\xd3\x4d\x57\x2e\xeb\xc5\x13\x76\x9f\x24\xd2\xeb\xf6\x7a\xa5\xfe\x3b\x3a\xcc\xea\xe9\x31\x0b\x3b\x0d\x1c\xf7\x20\xcd\x15\xad\x46\x74\xfa\x7d\x5a\xe6\xa9\xde\x5b\x99\x05\x0d\xdd\x01\xe5\x45\x80\x47\xb9\xfd\xc6\xdd\x0e\xb6\x45\x1f\x26\x2a\x9b\xa3\x98\xb9\xc5\xa5\x09\xd3\x3c\x0d\x7a\x8d\xc0\xb6\x53\x61\x2e\x49\xca\xfd\x41\xad\xcb\xec\x42\x95\x75\xba\x6d\x60\xeb\x41\xa5\x68\x2b\x6b\x33\xd9\xa7\xfa\xbc\x30\x72\x4e\xe7\x78\xdb\x94\x0f\xf6\x29\x34\x1d\x37\xb9\x81\xd9\xc4\xe0\x58\x73\x65\x45\xe6\x2b\xcc\x4c\x6a\xce\x56\x29\x77\xb3\xec\xf8\x49\xd0\xc8\x0c\x3f\xca\x10\xba\xfa\x75\x64\xde\x40\x99\x5a\x6c\x24\x67\x3d\xb3\xce\xd6\xd0\x1c\x0f\x8d\x68\x4e\xe8\x20\x50\x43\x3d\x5b\x6f\x50\x6f\xc7\x3c\x8b\xf8\xeb\x59\x63\x40\xca\xa9\xc3\xda\x9b\x9f\x67\xc5\x8b\x94\x9f\xfb\xf3\xf7\x59\x72\x2a\xef\x4b\xf9\x03\xe9\xbf\x61\x95\xf9\x40\x37\xf9\xa4\x97\x9c\x21\xc6\xd2\x8e\x40\x82\x20\xa4\x14\x93\x8a\x5b\xc6\xd8\x04\x5b\x42\x1b\xa4\x99\x06\x0c\x51\x66\x51\xcb\x38\x1c\x0b\x0b\x03\x2c\x2c\x8d\x24\x10\x18\x01\x22\xc0\x93\xe6\x4d\x1e\x13\xd5\xd8\x7d\xbd\x15\xb1\x3f\x14\x74\x73\x52\xac\x83\xc5\x32\x91\xee\xcd\xf2\x87\x91\x6b\xfc\xfd\x32\xdf\xed\x25\xd7\x79\xd0\xce\x2b\x58\x35\xbd\x71\x7d\xb6\xcb\x9c\x43\x47\xde\xcb\x50\x79\xc8\xed\x06\x1d\xe6\x77\x83\x76\xd7\x07\x8b\xa1\x10\x7a\xd1\x18\xed\xc3\xe3\x60\x4b\xf2\x69\xcb\x29\xc2\x6d\x63\xbc\x3f\x86\xcd\x5d\xe1\x30\xde\x06\x4e\x64\x25\x34\x2e\xe3\x01\xec\x6f\x66\x45\x87\xad\x9c\x5c\xcb\xe4\x17\xf9\xea\x31\x33\x99\xf9\xab\x4a\x93\x97\x64\x78\xce\x1d\x87\x80\x53\x1d\x1e\xd7\xcd\x9a\x9a\x56\x66\x35\x06\x82\x92\x7d\xa4\xda\x6f\xf2\x20\xac\x0d\xc7\x2b\x2f\x5b\xca\x8c\x76\x22\xd8\x77\xf6\x1f\x69\xe0\xf1\xf2\x8e\xdf\xcb\x6d\x1e\xf5\x25\x7f\xd9\x53\x53\x8d\x69\x2c\xb1\xcd\x1f\x39\x53\x78\x20\xbf\xdd\x3f\xc1\x6f\x4c\xc3\x07\xb1\x57\x37\x9c\x29\x2c\x2f\x21\x1c\xa9\x18\xfd\xef\x3b\x03\xb9\x83\xdf\x75\x01\x47\xe2\x0f\xf2\xeb\x5e\xf1\xeb\x7a\x11\xa9\x86\xf3\x5c\x67\xb1\xc5\x85\x49\x7f\x54\x2c\xa7\x1c\xe1\xaf\x06\x6a\x9a\xb0\x46\xed\xd6\x00\x85\x84\x4d\xea\xfe\xc8\xad\xd5\x4e\xfa\xc9\xe5\x0c\xa4\xf2\x3d\x11\x09\x0e\x11\x42\x41\x41\x88\x43\x28\x22\xc0\xe1\xc8\xd1\x4c\xd8\x98\x09\x85\x85\x23\xb5\xa2\x96\x60\x46\x08\x61\x73\x2a\xa0\x83\x34\x20\x5c\x33\x87\x60\x07\x59\x90\xcb\x93\x17\x20\xbe\x1d\x25\x63\x6a\xcf\x75\xd2\xb7\xd8\xda\x74\x9e\xc9\x5f\x44\xc9\xe7\xd2\x05\xf8\xdc\x3b\xcf\x08\xd4\xe8\x8e\xc9\x70\xac\xf8\x22\xd9\x9f\xf0\x74\x79\xb6\xcb\xed\x57\xfc\x90\x85\xc6\x6e\x54\xda\x8d\x9c\x1a\x4d\x61\xcf\xe3\x65\xd7\x49\x5c\x7a\xf6\xb6\x59\x91\x32\xdd\x41\xbc\x3d\x31\x94\xae\xd7\x3b\xbb\xf2\x52\x95\x96\x83\x69\x94\xc8\xe6\x6b\x09\x1b\xac\x9b\xb9\x14\x59\x46\xc7\xf4\xaa\xd6\x3e\xf8\xd3\x3a\x5a\xc9\x6d\x3e\xc3\x2a\x93\x7c\x09\x95\x7a\xde\x8c\x31\xb8\x69\x6e\x33\x79\x16\x94\x0e\x2b\x22\xd2\xf0\x50\x97\xa8\x13\xd6\xad\x6d\x76\xd8\xab\xaf\xb0\x95\x7f\x99\x35\x5e\xa6\x2b\xba\x9d\xb6\x3a\x4e\x2a\xb4\xd2\x49\x8d\xc2\x16\xa9\x6e\x53\x08\x75\x9a\x2d\xce\xe1\x2e\xd3\xeb\xa2\xfa\x24\xdb\xec\x05\x41\x32\x61\x17\xb6\x35\x25\xa2\xf2\xba\x92\xde\xcf\x9c\x7c\x35\xd4\xb5\xa0\xcf\xac\x3a\x1f\xb5\xd9\x32\x95\x18\x3b\xb5\x44\xc3\x9b\xd7\x72\xe9\xd6\x29\x1b\xfa\x40\x6c\x1b\xeb\xf6\xa0\x53\xa9\x0f\x47\xa3\xf9\xda\x9a\xb0\x06\x3e\xae\xc3\xd2\xd4\xde\xa0\xf9\xb2\x98\xc1\xed\xe5\x7c\xd0\xea\xef\x8a\xab\xcb\x94\x3c\xbc\x33\xa6\xaf\x3f\xbf\xb3\x2a\xdc\xea\x8b\xbc\xec\x89\x86\x2e\x74\x62\xde\x8c\x7f\x04\x65\x1f\xc8\x6f\xf8\xcd\xfc\xa6\xdd\x5f\x77\x70\xff\x26\xd4\x7a\xe1\x11\xde\x41\x9f\xbb\xb2\x75\x07\xfd\xf2\x15\xfd\x5b\x56\x99\xf0\x72\xb6\x94\xea\x5f\xd1\xfc\x96\x55\xf1\x1e\x7e\x33\x76\xae\xf5\x07\xf9\xbd\xec\x90\xef\x91\x8f\x20\xb1\x07\x7f\x50\x3e\xfe\xd3\xe4\xf9\xb7\xfe\xfd\xea\x2e\xa3\xd3\xcf\x9d\x3d\xc6\x33\x6f\x84\x6d\x7c\xb1\xbf\x6e\xde\xe5\x7c\x9d\xfe\xa7\x6e\x8b\x12\x42\x68\x65\x04\x81\xda\x28\xa0\x88\x62\x36\xd2\x10\x12\x6c\x59\x18\x73\x68\x0b\x07\x00\x62\xdb\x10\x01\x0c\x19\xd2\x48\x70\x47\x00\x23\x00\xd4\x14\x49\x0e\xf5\x93\xe6\xf3\x98\x88\xef\xde\x6b\x3d\x17\x2f\x7e\x74\xa8\xe6\xeb\x95\x69\x83\xe6\x32\xde\x78\xe2\xbb\x1e\xeb\xcf\x7b\x85\xd6\xb4\xd4\xab\x4c\xc3\xd5\xe8\xb8\x4e\xcc\xbb\xed\x7d\x3d\xc9\x02\xf7\x83\xac\x37\xe9\x72\x79\xd4\x65\xfb\x2a\xea\x16\xe7\x01\xdd\x34\x92\x2d\x90\x5a\xa8\x63\x7d\xd0\x48\x85\x01\x22\xc3\xed\xa4\xb7\xaf\xa5\xfa\x66\x11\xac\x9a\x99\x09\x07\xa9\x63\x75\xb5\x48\x8a\x49\xae\x80\x6b\x09\x33\x0e\x0b\xf5\x42\x4b\xf5\x7a\xfc\xd8\x2d\x94\xe1\x10\x4f\xb2\xf6\xf4\xac\x19\x74\xec\xed\x3a\x01\x4a\x5b\x4b\x75\x7b\x32\x91\x8f\x02\xb7\x5e\x2c\xd8\xfd\x7a\x1b\xe5\xf7\xc1\xbc\x36\xda\xcc\x56\x66\xd5\x20\xa3\xc3\x10\xbf\xd6\xf0\xaf\xef\x0f\x6f\xf5\x3c\x3e\x4b\x62\x3b\x76\xf4\xff\x67\x90\xe3\x71\xfc\xf6\xfe\x04\xbf\xb1\xfd\x61\xfc\xd6\xc9\x1b\x56\xc2\x6e\x2c\x9e\x2f\x36\x2d\xbf\x6f\x25\xbc\x83\xdf\x11\x00\xd3\xdc\x1f\xe4\xd7\xbd\xe2\xd7\xe5\xdd\x3c\x1e\x78\x50\x95\x66\xb2\xdc\x68\x84\xa1\xdb\x84\xe9\x68\x1c\x35\xe4\x7a\x0c\xd5\xf0\x50\xab\x22\x1a\xa9\x6e\x36\x97\x3c\xab\x67\x31\x4d\xeb\x7b\xb2\xf6\x40\xee\x58\xc4\x06\x50\x52\x05\x2c\xc3\xb4\x8d\x85\xb0\xa4\x34\x04\x73\xcd\x20\x87\x02\x0b\xa0\x89\x43\x31\x01\x46\x3b\x00\x21\x0e\x31\x42\x0e\xa0\x86\x0a\x42\xed\x93\x15\x2d\x1e\xb1\x9e\x9a\xcb\xd1\xd0\x6b\xf6\xac\xcd\x60\xb7\x2f\x14\x06\xfd\x54\x2d\x2c\x76\x1a\xed\xc2\x01\x36\x7b\xb0\x94\x77\x6c\xb3\x68\x03\xd9\x32\xc9\x8b\xed\x37\x73\x9a\xb5\xef\xf8\xc8\x9d\x67\xf2\x17\x51\xf2\xb9\xbc\xec\x0f\xcf\xe5\xe5\x7d\xca\x2d\xd2\xb9\xec\x86\xe5\xa3\xeb\x4d\x72\x96\x93\xee\x81\x52\x67\xb2\x5d\x57\x32\x45\xbe\x19\xec\x13\xd5\xfc\x64\x5d\x4b\x96\xc6\x78\xd0\x6e\x96\x0b\xf5\x76\xaa\xaa\x45\x7b\x45\x3a\x5e\x6d\xc4\x86\x8d\x65\xdf\x6f\x5a\xde\x6a\xb7\xc9\xa4\x7b\x70\x48\x5c\xef\xb8\xeb\xfb\x33\xc3\xdc\x67\x1f\xba\xe2\x2c\xd5\xf5\x56\xa2\x9e\x21\xc4\xda\xec\x8e\xb5\x76\x91\x36\x66\xcb\xc6\x9e\x84\xbd\x6c\x2e\xd1\x6f\x56\x87\xc1\xb1\xdf\x61\xcb\xf6\xf4\x23\x6b\xda\xe7\xf6\x4d\xb1\x0b\x1d\x6e\x59\x4d\xce\xd9\x73\x32\xf2\x9d\x29\xf6\x3e\x9a\x3c\x90\xfe\x6d\x3e\x74\x9f\xcc\xfb\xad\x89\x50\x08\x41\xc8\x80\x46\x16\x73\x34\x66\x8e\x43\x95\x81\x52\x09\x26\x08\xa2\x8c\x13\xc3\xb4\xc5\x19\xb3\x91\xb1\x14\xd3\x80\x33\xec\x30\x49\x89\x03\x04\x87\x4f\xb3\xfd\x31\xd1\x57\xfc\xf5\x56\x5c\xca\x0d\x96\xf7\xb7\x6c\xc6\xb9\x16\x23\x1e\xdb\xed\xfb\x5e\x33\xe3\x34\x17\xfb\xd6\x72\xdc\x4f\x5b\x49\xbb\x9b\x3b\x54\x32\xeb\x15\x0d\xc8\x60\x53\xcf\x99\x4c\xfd\x50\x97\xb3\x9c\xda\xda\xbc\x3c\x4f\xae\x6a\xdb\x34\xaa\xd7\xc6\xdd\x51\xb5\x3c\xea\x8b\x62\xa1\xd5\xb5\x1b\x7d\x6f\xdf\xd2\x61\x8a\x18\x27\xfb\x34\x13\x33\xd1\xb6\x59\x1e\x8e\x75\xb9\x30\x1a\x4f\xf2\xc2\x94\x2a\x1b\xd1\x82\x93\x28\xa1\xd3\xf3\xe8\xe8\x54\xa6\x83\x45\x6b\x28\x7b\xa1\x4f\x3f\xba\x67\x36\x5e\xde\x99\xe5\xb7\xdb\x60\x43\xa6\x7a\x7b\xe1\xbe\xc6\xc6\xf7\xad\xb1\x0f\xe4\x97\xff\x09\x7e\x63\x3a\x01\x89\xbd\xba\x61\x8d\xcd\x5e\x8e\xba\x52\xb1\xb3\xf5\xef\xd3\x09\xee\xe0\x97\x0f\x0e\x33\xf0\x07\xf9\x75\xaf\xf8\x4d\x0f\xa2\x84\xd5\x4a\xea\xe9\xb0\xc0\xd6\x55\xb1\xc8\xa6\x60\x81\x0e\xa1\xad\xa6\x19\xab\xd9\x1c\x73\x38\x28\xe6\xc6\xbb\x97\x93\xce\x98\x4e\x50\xfd\x26\x9b\x31\x64\x8a\x20\x03\x95\xd4\x5a\x68\x60\x71\xe3\x58\x96\x4d\x28\x16\x16\xd7\x46\x69\x07\x30\xc1\x88\x8d\x30\x57\x18\x01\x65\x1c\x0c\x6d\x8b\x12\xa0\x6d\xad\x1c\xce\xac\x27\x94\x74\xee\x3c\x0f\xce\x9c\xc0\xec\x1d\x9d\x20\x76\x1e\x1c\x7b\x7f\x39\x0f\xce\x2c\xac\x42\x7b\x50\xac\xe4\x17\x8c\xf7\xad\x55\x3d\x51\x4f\xca\x2d\x52\x6c\xed\x6d\x78\xe8\x4d\x60\x8a\x1f\xf3\xc7\x7c\xa9\xae\xfc\x11\xe3\x11\x6f\x97\x7b\xa9\xc1\x7e\x56\x40\xbd\xfc\xbc\x86\x96\x4b\x9e\x2e\x1c\x0f\xb3\x62\xaf\x9a\x98\x93\x5c\xaa\xfd\xd4\x0b\x30\x71\x3e\x29\xeb\xcf\x41\xd3\x59\x1f\x37\xdb\x41\x7a\xdb\x77\x55\xa7\xb1\x5b\x6e\xd1\xcc\x17\x51\xb7\x52\x04\x99\x9c\x19\xa4\xa5\xdf\xd2\x66\x3d\x9c\x5f\x18\xbb\xe7\x3c\xb8\x1a\xdb\x63\xdf\xb0\x2a\x3c\xaf\xad\xe3\x77\xa6\xca\x07\x28\xf6\x38\xfa\xf7\x66\x99\xa1\x97\x57\xb7\x48\xcd\x39\x33\x5d\xf5\x3a\x86\x2f\x5e\xde\x47\x99\x87\xd0\xaf\xab\x68\xbc\x79\x8b\xcc\xed\x52\x6b\x63\x41\xa1\x22\x10\x01\xa0\x4f\x29\xed\x10\x61\xc6\xc6\x36\xb3\x08\x23\x08\x23\xc3\x6c\xca\x0d\xc7\x46\x21\x8b\x4a\xce\xb5\xd1\x9a\x68\xa3\x84\x10\xc0\xc2\xc6\x3c\x49\x2d\x7b\x88\x17\xc7\x07\x52\x7b\x2e\x71\x89\xb8\x48\xad\x5b\x5d\x6e\x7b\x8d\xec\xb4\x89\x0a\xdb\x49\x13\xd4\x48\x54\x48\x46\xfd\xfe\xbc\xa7\xf1\x74\x9f\x23\x9d\x6d\x81\x15\x93\x8d\x52\x35\x83\xd9\xce\x2c\x16\x0e\x5e\x6d\xa6\x72\xd6\xcb\x4f\x51\xde\x35\x56\xcd\xdb\x97\x77\x48\xaf\x37\x24\x3b\xcc\xb4\x77\x48\xa2\x51\x18\x0e\xdc\xd2\x93\x64\xa9\x52\xb8\x6e\x8d\x3c\x3d\x4b\xd6\x8f\x1d\xa3\x72\xe3\x6c\xd4\x0c\x92\x11\x5c\xd2\x26\x2b\xfb\x87\x85\x9d\x20\x3a\x29\x36\xfb\x54\xed\xa3\x8c\x75\x9f\x94\xda\xd8\x5a\x70\x8b\xd4\x54\x2f\xfd\xf9\xc6\x54\xf9\x40\x6a\x1f\x47\xff\x3b\x35\x72\xe9\x00\x04\x05\x23\xd2\xb2\x28\x92\xdc\x28\x68\x09\x48\x15\xb4\x8d\x45\x25\x80\x9a\x3a\x0e\xb5\x98\x82\x8a\x29\x64\x43\x2c\x1c\x6c\x39\x10\x68\x87\x02\xc7\xb6\x84\xa3\xff\xf5\xcf\x0f\x6a\x3d\x64\xd6\xbe\x13\x71\x11\x5b\x6b\x62\xb6\x83\x98\xef\x11\xce\xd9\xcd\xcc\x74\x5d\x6d\x75\x33\xe5\x3e\x2e\x9b\x59\xba\x16\x89\x52\x3d\xe8\xe5\xec\xf6\xae\x32\x6f\xe5\xca\xdb\xf5\xb4\xde\x59\x74\xf2\xc3\x30\xb9\x98\x86\xe1\xc6\x12\xdb\x7e\xd8\x6a\xaf\x67\xd9\x6a\x55\x2f\xbc\xa8\x5e\x2c\x85\x8b\x75\xb5\x83\xb2\x47\x36\x2c\x46\x56\x27\x28\x9c\xb2\x91\xa4\xca\xcb\x48\xba\x7e\xad\x98\x6c\xa4\x0f\xa2\x61\x76\x22\x55\x9a\x0c\xfd\xb4\x2a\xf5\x2c\x54\x28\x0d\xdc\xfe\x80\xfa\x7e\x2e\x8d\x3f\xb2\xba\x7d\xd2\xf7\xc8\xbd\x6b\xd6\x9c\xfd\x92\xef\x98\x35\x0f\xa4\x7f\x93\xef\xd3\xcf\x59\xfb\x5f\xff\xf5\xbf\xff\xf7\x7f\xfd\xef\xff\xfd\x23\xc3\xd7\xfc\x87\x99\x2d\x7f\x54\xf8\x44\xff\xf7\x8f\xcd\xbc\xbf\xe4\x4a\x3f\xcf\xe2\xff\xf3\xa3\x79\x98\xeb\xff\xfe\xd1\x74\x53\x25\xef\x47\xc6\x6d\xba\xff\xe7\x47\x43\x0e\xf4\x84\xff\xf7\x8f\xf9\x46\x44\x43\xf9\x7f\x7e\x54\x77\x53\xbd\xfc\xef\x1f\x4f\x95\xfd\xd7\x2f\xb2\xf0\x6b\x55\x2f\x02\x11\xcf\xb8\x73\x6a\xd6\xea\x32\x56\xaf\x48\xd4\xdb\xb5\xbc\xc4\x20\xed\xdc\x5a\x30\x76\x7f\xab\xe5\x67\x0b\xcf\x0d\xe3\x52\xce\x36\xd3\xb5\x7a\x6a\x6e\xec\xf3\xff\x9d\x8f\xf5\x4b\x33\xd3\xd5\x4a\xa3\x59\x77\xf3\x95\xe6\x07\xcd\x74\x4b\x4d\xaf\xfe\xdc\x2b\xd5\x4a\x29\x8c\xd7\xf8\x5f\x3f\x7e\xfc\xf8\xe1\x66\x32\xb1\xda\x7e\x23\xf8\xa3\x56\xcf\x97\xdd\x7a\xf8\xa3\xe8\x85\x3f\xfe\xd7\xf3\xdb\xa1\xfa\xe7\xc7\xd3\x37\xa6\x7c\xa2\xdf\x62\x7f\xf5\xf2\xe1\xb1\x8c\xaf\xde\xe1\x7a\xf5\x1e\xcb\xbf\x31\x2a\xf8\xf4\xe9\xff\x0f\x62\x4f\xf0\xe9\x6b\x9c\xfd\x24\xf0\x2b\x53\xd3\x99\xd2\xaf\x70\x14\x69\xd5\xd7\xcb\x81\xe6\x4a\x2f\x57\xbf\x3e\xfd\xdf\xf3\xd3\x4a\x2f\xfe\xef\x43\xd8\xfd\xa5\xf2\xd7\x18\x7f\x87\xfa\x8f\x56\x25\x1f\xb4\xbc\x1f\xff\xeb\xe5\xaf\x5f\x6a\xc9\x63\xfa\xfb\x8b\x0d\xf8\x7d\x0c\x9e\xdf\xf3\xd5\xe0\x37\xee\x67\xc6\x3c\xb1\x7d\xfe\xcf\x83\xf8\x3d\x57\xf6\x1a\xa3\x31\x32\xbf\x72\x78\x7a\xf1\xca\x34\x99\xeb\x27\xee\x4e\xff\x3e\x88\xb9\x53\x5d\xaf\xf1\x76\x21\xf2\x2b\x6b\xc3\xf9\x3f\x3f\xe6\xb3\xe5\xfa\x77\xde\x9e\xe8\xad\x06\x8b\x8d\xde\xe8\x5f\x1e\x1e\xc5\x69\xac\xca\x57\x19\xbe\x26\xf9\xda\xa0\xbf\xc6\xf5\x6a\x23\x9e\xff\xf3\x38\x4e\x57\x1b\xf1\x06\x8f\x3f\xc9\xfc\xca\xdd\x52\xaf\x5e\x19\xee\xc5\x66\xb6\xdc\x4c\x86\x53\x33\x8b\x7d\x7c\x10\x93\x97\x0a\x5f\x63\xf4\x8a\xdc\xa7\x30\x6c\x25\xe7\xe7\x9f\xad\x62\x1f\x1f\xc4\xed\xa5\xc2\xd7\xb8\xbd\x22\xf7\x2b\xb7\x8b\x95\x5e\xbf\x2a\xeb\x4f\x8b\xb5\x5e\xad\xf9\x5a\xc7\x3e\x3e\x8a\xdf\x97\x0a\x5f\xe5\xf7\x57\x72\xbf\xf2\x7b\xfa\xfb\xab\xeb\xeb\x7a\xb9\x59\xad\xa3\xe1\x54\xaf\x62\x1f\x1f\xc4\xf0\xa5\xc2\xd7\x18\xbe\x22\xf7\xa6\x6a\x30\x5c\xad\x36\x7a\xf9\xcf\x0f\xbe\x5a\xe9\xb5\x9c\xa9\x57\xda\xb0\x37\xfa\x45\x51\x8a\x3f\x3c\xaa\x1d\xb1\x2a\x5f\x6d\xc9\x35\xc9\xd7\x50\x62\xa5\x17\xff\xfc\x58\xef\x87\x53\xa5\xf7\xaf\xb4\xe0\xc2\xfe\xa3\x79\x7f\x97\xf1\xbb\xb8\xbe\x52\x51\x7f\x7d\x7c\x10\xff\xbf\x56\xfa\x5a\x23\x5e\x21\xfb\x66\x4b\x9e\xbf\xfb\x7a\x73\x9e\xe7\x9c\xe0\x11\x9f\x4a\xbd\xfa\xc9\x7b\xbe\x92\xf1\xba\x1f\xb0\x9d\xae\x7b\x6e\xd3\x3b\x7f\xf5\xba\x9e\x1f\xd5\xca\x45\x8b\x6d\x35\xf2\x15\xff\x87\x58\x2f\xb5\xfe\xf1\xbf\x9e\xbf\xf1\xff\xfb\xd1\xc9\x79\x75\xef\xe5\xf9\xc7\xff\xf3\xff\xff\x01\xac\x9f\xe5\x77\x45\x53\xaf\xd6\xe7\xb5\xfc\xa9\x15\x37\x73\xf9\x6b\x35\x4f\x4c\x3e\xeb\x29\xbf\xb0\xb8\xd2\x51\x34\x9c\xf6\x4f\xb2\xf7\xcf\x0f\xb1\x39\x5c\x1e\xe6\xcb\xa1\xfc\x5d\x16\x9f\x86\x41\x1c\x56\x7a\x71\x33\x63\x2f\x35\x3c\xf1\x74\x11\x8c\x5f\xd8\x7a\x5b\x55\x7c\xfa\xba\xd1\xfa\x7e\x16\x7e\x56\x72\xe6\x22\x06\x30\x9f\x64\xe4\xf9\xcd\x7d\x8c\xc4\x2b\x79\x62\xe4\x57\x45\xf8\x93\x9c\xac\xe4\x5c\x4f\xb7\x77\x72\x12\xaf\xe4\x89\x93\x95\x9c\x7f\xb1\x43\x2e\x0b\xea\xdd\x9c\xc4\xeb\x79\x66\xe6\xa7\x96\xf0\x2b\x33\x7c\xb5\x7e\x9b\xa1\x18\x70\xdc\xc7\xd1\x75\x45\x4f\x2c\x5d\x61\xe3\x87\x7d\x54\x9b\xad\xd6\xfd\xa5\x6e\x04\xa5\xd3\x5e\x58\xf0\x95\xfe\xa1\x36\x93\xf9\x0f\x39\x9b\xcc\x23\xbd\xd6\x27\xb2\xff\x6f\x00\x00\x00\xff\xff\x7f\x3e\xae\xf4\xbf\x8c\x03\x00") func kahunaCoreSqlBytes() ([]byte, error) { @@ -850,46 +292,6 @@ func kahunaHorizonSql() (*asset, error) { return a, nil } -var _non_native_paymentCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xd9\x92\xe2\xc8\xd2\xe6\x7d\x3d\x85\xac\x6f\xb2\xda\xa8\x3e\x68\x0f\xa9\x6b\xea\x98\x89\x5d\x2c\x62\x5f\xc7\xc6\xca\x22\x14\x11\x42\xa0\x05\x24\xb1\x8e\x9d\x77\x1f\x43\x90\x6c\x09\x24\x09\x59\xdd\x67\xec\x6f\x5d\x54\x67\x23\xc7\xfd\x8b\x2f\xdc\x5d\xb1\x09\xff\xe3\x8f\x2f\x7f\xfc\xc1\xd4\xfc\x30\xb2\x02\xd2\xac\x97\x19\x0c\x23\x88\x60\x48\x18\x3c\x73\x27\x5f\xfe\xf8\xe3\xcb\xe6\x7e\x66\xe6\x4e\x08\x66\x68\xe0\xbb\x07\x81\x39\x09\x42\xdb\xf7\x18\xf5\x5f\xf2\xbf\xb8\x23\x29\xb4\x62\x26\xd6\xcf\xcd\xd7\xcf\x44\xbe\x34\xb3\x2d\x26\x8c\x60\x44\x5c\xe2\x45\x3f\x23\xdb\x25\xfe\x2c\x62\x7e\x30\xec\xf7\xf8\x96\xe3\x9b\xe3\xb7\x9f\xda\xd8\x21\x3f\x6d\xef\x67\x14\x40\x2f\x84\x66\x64\xfb\xde\xcf\x90\x84\x1b\xbd\x6f\x85\x4d\xc7\xde\xa8\x26\x9e\xe9\x63\xdb\xb3\x98\x1f\xcc\x4b\xbb\x95\x53\x5e\xbe\xbf\xda\xf6\x30\x0c\xf0\x4f\xd3\xf7\xa8\x1f\xb8\xb6\x67\xfd\x0c\xa3\xc0\xf6\xac\x90\xf9\xc1\xf8\xde\x4e\xc7\x90\x98\xe3\x9f\x74\xe6\x6d\x6d\x21\x1f\xdb\x64\x73\x9f\x42\x27\x24\x27\x66\x5c\xdb\xfb\xe9\x92\x30\x84\x56\x2c\xb0\x80\x81\x67\x7b\xd6\x56\x24\xf0\x17\x3f\x43\x62\xce\x02\x3b\x5a\x6d\x94\x53\xfa\x7d\x47\x00\x81\x81\x39\xfc\x39\x81\xd1\x90\xf9\xc1\x4c\x66\xc8\xb1\xcd\x6f\x1b\xc6\x4c\x18\x41\xc7\xb7\xbe\x7f\xf9\x92\x69\x54\x6b\x8c\x6e\x64\xb2\x3d\x46\xcf\x31\xd9\x9e\xde\x6c\x35\x77\x92\xff\x9a\x4d\xac\x00\x62\x32\xb4\xc3\x08\xad\x42\x32\xfd\x7e\x53\x3a\x34\x27\xd3\x99\x1f\xcc\xdc\xf0\x3e\x61\xe2\xcd\xef\x91\x74\x08\xb6\x48\x70\x8f\xe4\x06\x27\x25\xe4\x4e\xc9\x3b\xc4\x10\x09\x23\x9f\x52\x12\xd8\x1e\x26\xcb\xdb\xb2\xd0\x34\xfd\x99\x17\x21\xe8\x40\xcf\x24\xe1\xf7\x2f\x5a\xb9\x95\x6d\x30\x2d\x2d\x55\xce\x1e\x49\x57\x8d\x72\xff\x02\xbd\x7e\xb0\x62\x62\xed\xe9\xaa\xd1\x6c\x35\x34\xdd\x68\x1d\x7d\xe9\x54\xf0\xe7\x64\x4c\x56\xf7\xe8\x8f\x96\xef\xab\xde\xcb\x7c\x40\x2b\x25\x77\x60\x3e\x16\xbb\x5f\x77\x30\x0b\x23\xc7\xf6\x48\x78\x4b\xf3\x5e\xe8\x6e\xbd\x1b\x14\x24\xce\x06\x37\xf4\x1e\x84\xee\xd7\xbb\x77\xf9\x5b\x7a\xf7\x42\x77\xeb\xdd\xca\xdb\x1e\xf5\x6f\xe8\x3d\x08\xdd\xad\x77\x32\x43\xe1\x0c\xdd\xd0\xb9\x15\xf8\x88\x3e\xc7\x0e\x87\xd3\x19\x99\xdd\x62\xf6\x58\xec\x7e\xdd\x84\x04\xb7\x68\x8d\xef\xdf\xad\x2d\x0e\xe3\x5b\xea\xb6\x02\x77\xeb\xdb\x66\xa5\x21\x81\xf8\xb6\xda\x13\xb9\x5f\xac\x7d\x97\x29\xc9\xf4\xe7\x9d\x66\x10\xf4\x6e\x28\x47\xd0\xbb\x1b\xf0\x2e\xfb\xdd\xc2\xfa\x2a\xf2\x51\x9d\x9b\x31\xc0\xfb\x6a\x37\x52\x3b\xcd\xb1\xec\xb9\xe2\x8b\x29\xf7\xb6\xec\x3e\x35\xbe\x27\x76\x48\x74\xef\x48\xee\x13\xd7\x6d\xb9\x43\x22\x7a\x47\x6e\x9f\x58\xde\x95\xbb\x0b\xdf\x21\xa1\xdc\x96\xdb\x26\x89\x77\x65\xf6\x21\xff\x8e\xe4\x26\x8e\x6f\x8b\x6c\x63\xf3\xb6\xcc\x49\x28\xdc\x16\x45\xd0\xbb\x2d\xf0\xea\xaa\x77\x49\x6d\x3c\x6f\x27\x98\xed\xb5\xb2\x46\x53\xaf\x1a\xc7\xc2\xce\xc4\x0a\xa7\xce\x4e\xa2\x99\x2e\x64\x2b\xda\x1b\x5d\xdf\xbf\x6c\xc7\xc6\x06\x74\xc9\x9f\xaf\x9f\x31\xad\xd5\x84\xfc\xb9\xfb\xca\x77\xa6\x69\x0e\x89\x0b\xff\x64\xfe\xf8\xce\x54\x17\x1e\x09\xfe\x64\xfe\x88\x87\xcc\xe9\x46\x56\x6b\x65\x5f\x35\xbf\xea\xfb\x72\xa2\xf1\xf4\xe6\x4e\x71\xba\x5a\xa9\x64\x8d\xd6\x0d\xcd\x5b\x01\xa6\x6a\x9c\x2a\x60\xf4\x26\xf3\xf2\x3a\xbe\x7d\xfd\x2c\x8c\x95\xbc\x9c\x5b\x7e\x6d\xfe\xce\xe6\x9e\xa1\x77\xdb\x73\xc2\xa5\x51\x6d\x9d\xf1\xc9\x74\xf5\x56\x61\x0f\xeb\x78\x40\x7b\x62\xfe\xa0\xe5\x0c\xc8\x47\x1a\xff\x46\x49\x4c\x40\xad\x9c\x9c\x58\x9b\x59\xcc\x24\xf0\x4d\x82\x67\x01\x74\x18\x07\x7a\xd6\x0c\x5a\x24\xa6\xe1\xce\x01\xf8\x46\x0c\x13\x0a\x67\x4e\xf4\x33\x82\xc8\x21\xe1\x04\x9a\x64\x33\x9b\x78\x39\xbb\xbb\xb0\xa3\xe1\x4f\xdf\xc6\x47\x13\x84\x93\xc6\x1e\x3b\xe4\xae\x99\xb1\xeb\x1e\x1a\xf9\xea\x00\x97\x08\xdf\x7a\xf9\x71\xd2\xfd\xfa\x85\x61\x98\xd7\x4f\x6c\xcc\x98\x43\x18\x40\x33\x22\x01\x33\x87\xc1\xca\xf6\xac\xaf\x92\xfc\x7b\xdc\x37\x46\xbb\x5c\xfe\x16\x4b\x6f\xbe\xe8\x41\x97\x5c\x10\x56\x94\x4b\xc2\x73\xe8\xcc\x2e\x49\x73\x1c\x7f\x2e\xee\xc0\x30\x72\x7d\x6c\x53\x9b\x60\xc6\xf6\x22\x62\x91\x60\x2f\xf2\xe5\xf7\xf3\xbe\xdf\x47\xf1\x93\x5c\x84\x0f\x11\xb1\x9b\x08\x30\xc8\xb6\x6c\x2f\x3a\xbb\x19\x92\xa9\x37\x73\x2f\xdf\xf3\x66\x6e\x38\x43\xc4\x8b\x82\xcd\x54\xf0\xbc\x99\x5b\x19\xdb\xa3\x0e\xdc\xcc\x18\x31\x09\xa3\xcb\x70\xb6\x82\x43\xdf\x25\xd8\x77\xa1\xed\x5d\x90\x12\xc5\x73\xd0\xd1\x30\x20\xe1\xd0\x77\x70\xc8\x44\x64\x79\x8e\x8c\x3a\xd0\xba\x86\xe8\x66\xdf\xec\x18\x99\x6d\xac\x3a\x36\x44\xb6\x63\x47\x9b\xc6\x6d\xdb\xff\x4a\x89\xe3\xdc\xba\x6d\x5b\xde\x66\x2c\xb4\x81\xb5\xfd\xe4\x68\x34\xb0\x1f\x5a\xec\x48\xff\x19\x4f\xab\x99\x74\x21\x9b\x2e\x31\x5f\xbf\xbe\x76\xc5\xbf\x7f\x30\xec\xef\xbf\xdf\xf8\xf6\x39\xc0\x73\x3d\x6f\x1a\xf0\x9e\xc6\x93\xbe\x3c\xd3\x76\xda\xcf\xef\x69\x7a\x4b\xcf\x99\xba\x0b\xfc\x6d\x75\xbe\x0d\x8c\xcd\xf3\xef\xd1\x98\xd8\x0c\x19\xb7\xe1\xe0\xf9\x98\x1c\xc7\xc2\x49\x0c\xbc\x35\x7a\xfa\x7c\x7e\xd4\xfc\xe9\xc0\x78\x0b\x64\xf7\x19\x0c\x87\x47\x60\xe4\x37\xbe\x3d\x09\xc8\xfc\x5d\x21\x34\x33\xc7\x24\x72\xec\x30\x7a\x57\x74\x3f\xda\x7e\x75\xf7\xed\xc7\xa6\xe3\x87\x24\xb2\xdd\x2b\x91\x1f\x27\xd6\x0b\xb1\x75\xd4\xe7\xa7\x83\xfa\xbd\xbe\xb3\xfe\x3e\xd8\xb9\xe2\x3a\xd7\xe6\x06\xa7\x6a\x0e\xad\xb8\xe6\x2d\xbb\xc1\xd7\xa3\x3d\xb6\x9b\x78\x7d\xdd\x07\x39\x09\xee\xcc\xa0\xdb\x95\x17\x7c\x2d\x83\xc6\xee\x0e\xc3\x90\x44\x97\xf8\xdc\xc6\xea\xd5\xdb\xd0\xdd\x84\xd5\x65\xd5\x93\xc0\x36\x89\x77\x25\x89\xc5\x37\xaf\x65\xb8\xf8\x26\x83\xfd\x19\x72\xc8\xc6\xdf\x4c\x3b\x5e\x91\xfc\xd4\x2c\x7a\xd4\xc3\xbb\x29\xeb\xb6\x2d\x67\xfd\xba\x6b\xe0\x15\xdf\xd8\x7d\x73\xc7\xf0\xd9\x57\x5f\x79\xbf\xe6\x10\xdb\x01\xfb\xa3\xfe\xb0\x9d\xd6\x6f\xdd\xc1\x9e\x5c\x7a\xf0\x4b\x6f\x22\xd7\x0f\xa2\x3d\x1b\x99\x6c\x4e\x6b\x97\x5b\x0c\x7b\xfe\xd8\x24\xcb\x08\x46\x11\x71\x27\x11\xb3\x09\x8b\x30\x82\xee\x84\xd9\x0c\x99\xfc\xd9\xf6\x13\x66\xed\x7b\xe4\xed\xc3\x96\x42\xdb\x99\x05\x47\x8f\xda\x6b\x16\xa2\xd5\x84\xbc\xdf\x29\xdb\x65\x89\x23\xbd\x6f\xd3\xfe\xde\xe2\x95\xde\xd9\xad\x6c\xf8\xc1\x79\xa7\x7e\x8d\x99\xf8\x37\xc3\xfe\xce\x68\x46\x86\xd9\xfe\xef\xff\xfa\xc1\xc8\x92\x24\x48\xbf\x5f\xec\xab\xe3\x69\xd8\xc3\x5d\x76\xbc\xca\x73\x9c\x73\xaf\xb0\xb1\x5d\x68\xdb\x44\xdd\x45\x40\x9b\xb9\xe3\x13\x50\xc2\x19\xda\x81\x08\x48\x78\xf2\x00\x12\x2e\x8e\x18\x03\x02\xf7\xb1\xf4\x16\xcf\xd1\x9c\xf7\x51\x4c\x47\x8b\x75\x77\x3c\x19\xb7\xc0\xa6\x21\xb9\xf5\x84\x79\x8b\xf3\x68\x0e\xff\x28\xce\x83\x8a\xfb\x71\xbe\x79\xc8\x9d\xdd\x27\xde\x9c\x38\xfe\x84\xbc\xf3\x48\x3b\x98\x7e\xe2\x41\x74\xb4\xdc\xf1\x04\x05\xaf\xeb\xb5\x5f\xef\xe9\x87\x83\x17\xbd\x47\xc4\xf4\xca\x83\xe6\x94\x84\xd7\x75\xe0\x13\x8d\xe7\x44\x9c\x58\xbb\x4a\xc6\x61\x8d\xe8\x61\x32\x0e\x8b\xe2\x5f\x0f\x71\x7b\x3a\x79\xbb\x10\x53\xb7\xa2\xfb\x68\x85\xeb\x51\x54\x47\x5b\x00\x8f\x4c\xbb\xe2\x27\xfe\x8d\x4c\x6d\x87\xe1\x8c\x04\xf7\xab\x32\x7d\x7c\x71\x76\xfa\x86\x96\xc8\xb1\x5d\xfb\xca\x88\xe2\xe6\x5c\xf0\xef\x9c\x55\x1d\x79\xe7\xd1\xae\xca\x43\xb3\xa8\xe3\xef\x7f\xd6\x3c\xea\x48\xe7\xe3\xf3\x9f\x5b\x5a\xb7\x9d\x76\xa6\x69\xd7\x93\xff\xbe\x1c\x78\x27\xcb\xbd\x0f\x3b\xf9\xf1\x1e\xda\xd6\xcd\xa3\xe5\x49\x2a\xbe\x63\xbe\x71\xee\x80\xcb\x78\x97\xf2\xea\x5d\x73\x08\x3d\x8b\x5c\x9c\xd8\x1f\x93\x73\xbc\x6d\xf7\x78\xae\x3e\xac\x9d\x3f\x4e\xd1\x5f\xcc\x0f\xf2\xf1\xea\x12\x39\xd1\x32\x20\xe1\xcc\xb9\x98\xdd\xa3\xa5\x4b\xde\x9d\xcf\x1d\xb6\x58\x1f\xe7\xf3\x6c\xdf\xe2\x51\x52\xcf\x76\x9c\xbf\xde\x45\xdc\xee\x4b\xb7\xd8\xdb\x89\x5c\x22\xe2\x3e\xb7\x3b\xdb\xe1\x7e\x84\xa8\xcc\x66\x66\x4d\xfd\xe0\x9d\xc5\x50\x26\xa3\xb5\xb4\x77\x38\xbb\xad\x32\xfc\xb0\x3e\xdd\x68\x66\x1b\x2d\x46\x37\x5a\xd5\xc3\xa2\x62\x47\x2b\xb7\xb3\x4d\xe6\xeb\x4b\x3e\xd5\xa8\xf5\x0b\x7a\x99\x4f\xeb\x42\xce\xa8\x8b\xa9\x5e\x39\x57\x31\x32\xe5\x5c\xb1\x6d\xd4\xda\x7c\xa1\x2f\x0c\x2a\xb9\x66\xa1\x6a\xb4\xd3\xd9\xaa\xd6\xec\x82\x7a\x1a\x54\x7b\x7c\xe1\xe5\x1b\xa3\xee\x2e\x79\xfb\x1f\xc0\xb2\xdf\x18\xe1\x1b\xc3\x7e\xdb\xb2\xcc\xbc\xbc\x7c\x63\x5e\xb4\xba\xa6\x69\xda\x8f\x1f\x2f\xf1\x0d\xfe\xf5\xde\xe1\xdf\xdf\xbf\xbf\x8b\xb0\x97\xaf\x17\xbb\x9d\x72\xb7\xda\x2f\xe4\xca\x9d\x56\xa9\xdb\x91\x72\xf9\x82\x26\x94\x8d\x7e\x9f\x2f\xd6\x4b\x15\x50\xd5\x8a\x5a\x3b\x5b\xcf\xb5\xe5\x72\x2d\xdd\xcc\xe6\x3a\xbd\xaa\x71\x40\xb8\x01\xa6\x48\x8a\xaa\x0a\xa2\xa4\x0a\xdf\x18\xee\x06\x42\xe1\x11\x84\x69\x5e\xa8\xe7\xf8\x42\x3b\x2b\xf1\x5a\xa5\xd7\xce\xb5\x0b\x82\xd6\x2f\x6a\xbd\x5e\xbe\xd7\xeb\xf0\x9d\x42\xaf\xdf\x6f\xc8\xd9\x7e\x2f\xdb\xaa\x95\x32\xbd\x41\x53\xeb\xca\xa0\x57\x15\xaf\x23\xbc\xc5\xa1\xf8\x10\xc2\x5e\x29\x2f\x37\x0c\xb1\x6a\xe8\xd9\x5a\xba\x62\xe4\x52\x40\xe0\x35\x51\x90\x07\x52\xcd\xc8\x34\x1b\xe5\x7c\xb7\x04\xf2\xa9\x72\xba\x52\x2f\xeb\xb9\xaa\xd8\x04\xd9\x7e\xb7\xd3\xde\x23\x54\x4e\x10\x8a\xb7\x39\x94\x2e\x22\xbc\xe2\xd7\xe7\xeb\x81\x4f\x84\xc8\xf5\x55\xbe\x8f\xc6\xc9\xe9\x4a\xdf\x9e\x46\x59\xc0\xaa\x42\x25\x41\x26\x44\x56\x30\x87\x78\x80\x24\xa4\xa8\x94\x17\x20\x95\x04\x8e\x43\x40\x92\x55\xc8\x8b\x14\x52\x4e\x64\x05\x88\x59\x24\xf1\x48\x16\x04\xc4\x02\x44\x54\x75\x43\x15\xfb\xe4\xb5\xd1\x21\x01\x1e\xf2\x44\xe0\x29\xe5\x45\x05\xb2\x00\xb1\x04\xb0\x14\x73\x54\xc6\x02\xa7\x98\x1c\x85\x26\xe6\x59\x24\x9b\x26\xab\x98\x82\x80\x25\x00\x24\x5e\x52\x15\x59\xe1\x78\x09\x72\xf2\x4b\xdc\x7f\xec\xa6\xe3\xfe\x6b\xaf\x54\xaf\x64\x8b\xab\xe4\xaa\x59\x4a\x81\x8c\x97\x51\x0b\x3c\xbb\x1c\xa5\x12\x21\x6b\x45\xe1\x42\x5f\xac\xb9\x1e\x6e\x76\xfb\x30\x55\x84\x39\x6b\x23\x9f\x35\xc4\x32\x5c\x4f\xf8\xfa\xbb\x9a\x07\x5a\x8f\x13\x63\xb1\xd4\xf8\x2f\x68\xc8\xa7\x5e\x2f\x67\xa1\x7e\xc5\x51\x15\xa0\x00\x13\x00\x45\x34\x25\x55\xa5\x22\x07\x15\xcc\x03\xb4\xf1\x48\x41\x94\x01\x52\xa8\xcc\x0a\x82\x2a\x21\xd5\x54\x00\x06\x2a\x66\x05\x59\x51\x44\x5e\xa4\x1c\x56\x11\xdd\x3a\xd9\x67\x38\x3b\xe1\x58\xc8\xf1\x90\x08\x0a\x36\x15\x42\x78\xa4\x20\x5e\x90\x45\x02\x45\x85\x53\x14\x15\x22\x81\x02\x82\x09\xe4\x28\x02\x44\xe5\x04\x8c\xa0\x08\x39\x51\xe4\x88\x8c\x08\x2b\xa3\x97\xf8\x91\xc1\x49\x92\x2a\x01\x55\x51\xc1\xce\x63\xd3\x7c\x6d\x30\xe2\x8c\x99\xe4\xb3\xa8\x08\xba\xa2\xb7\xaa\xce\xdb\xcb\xbc\xd0\x99\xf8\xe3\xc4\x3c\xa7\x55\xa3\x34\x57\xe2\x2b\x20\x05\xe4\x41\x4d\x40\xd9\x16\x97\xaa\x77\xab\x60\xce\x4b\x4e\xc9\x6a\x24\x67\x72\x64\x8c\x07\xad\xe4\xb2\x2d\x4d\xeb\x86\xc0\xfa\xc3\x5a\x46\x4e\xfb\x5b\x86\x7b\xb5\x4e\x25\x11\x7b\x87\xbe\xff\x67\x9b\xde\xc2\xc3\xff\x2f\xb4\x5a\x7d\xe7\x3b\x2d\xb7\xc9\x95\x5d\xd2\x32\xa1\x25\x4f\x6c\x85\xd3\x87\xb0\x9a\x4f\x54\xfa\x4b\x28\x88\x16\x5c\x8c\xbc\xb0\x91\x12\x82\x79\xd3\xca\xae\x87\xe9\x61\x69\x56\x35\x56\x55\x31\xb0\x57\xc6\x58\x1e\x5b\x7d\x1b\x86\x49\x1a\xc9\xc3\x84\x20\x37\x6a\x68\x52\xca\x65\x0b\xee\xdc\x82\x8b\xd8\xd4\x05\x8f\xce\x86\x97\xbc\xe2\xd5\xa3\x33\x6c\xf1\xd7\xb9\xde\x2f\xba\xee\xf4\x68\xa2\x00\x4c\x30\x06\x22\xe2\x10\x87\x54\xca\x51\x9e\x00\x93\x83\xb2\x04\x54\x93\x53\x45\x96\x05\x44\x16\x01\xcf\xb3\x90\xa7\xc0\x04\x90\xe7\x81\xa2\xb0\x94\x72\x00\x70\xa6\x18\x7b\xe3\x67\x44\x05\x64\x37\x89\x54\x90\x4d\x09\x40\x8e\x25\x2a\x27\xb3\x58\x56\x38\x19\xb1\x26\xa0\x22\x67\x12\x55\x54\x11\xe5\x11\xd9\x00\xc1\x32\x80\xa2\x68\x2a\xb2\xc9\x23\x49\x24\x88\x25\xd2\x4b\x3c\xc4\xd8\x7b\xb4\xf2\xea\xd1\x22\x29\x2c\x85\x61\xa5\x3b\x50\x53\x53\xa3\x08\x34\x99\x65\x07\x60\xc4\x6b\x6b\x07\x79\x3a\xed\x79\x75\xc3\x1f\xa6\x5b\x4b\x1e\x29\xda\x52\xea\x96\xe4\x79\xde\x92\x17\x02\xa1\xfa\x84\x37\x53\x33\x98\x29\xeb\x66\x4d\x67\xd7\xd3\x9c\xb9\x16\xe8\xba\x28\xe8\x55\xbc\x2e\x6c\x5d\x3a\xf6\x68\xeb\xc0\xb8\xc1\x09\x30\x21\xe4\x43\x73\xee\x26\xd3\xdc\x68\x50\x68\xd5\x0a\x86\x58\xa8\x2d\xa4\x02\xdf\xc5\xd9\x35\x3f\xce\x8f\xdb\xf6\x12\x24\x72\x2b\xab\x38\xb0\xf8\x65\xcf\xaf\xcb\x8d\xbe\x01\x53\x70\xb1\x4c\xd6\x4d\xb9\xed\x26\x4b\x09\xbd\x54\xee\x92\x71\x4b\x47\xe9\xa8\x2d\x2f\xa4\xd8\x49\x2b\x17\x3c\xb6\xc0\x5e\xea\xf5\xff\x01\x1e\x8b\x89\x04\x64\x19\x11\x49\x94\xb0\x4a\x4d\x55\x31\x15\x84\x59\xd9\x94\x59\x01\x11\x45\x95\x21\x15\x29\x25\xac\x24\xf3\x44\xa6\x22\x36\x15\x88\x08\xcb\x21\xac\xaa\x18\x48\x9c\xc2\xc7\xf9\xf3\x13\xbc\xde\x84\x18\xb2\x80\x62\x28\x42\x20\x2b\x10\xcb\x80\x50\xa0\x62\x11\xab\x14\x23\x24\xca\x0a\x0f\x20\x02\xd4\x94\xa0\x8c\x64\x0a\x38\xaa\xb2\x9c\xca\xab\x04\x49\x94\x10\x89\x27\x2f\xf1\x90\x73\xef\xb1\xea\xab\xc7\x26\x86\x2a\xc0\xb8\x9c\x5f\xce\x68\x61\x25\x29\x79\xb7\x23\x2d\x06\x75\x8d\xba\x8d\x95\x5e\x2a\x0b\x4b\x59\xf7\x6c\x2d\xb9\xc4\xcb\x65\xd1\xee\xb2\x59\x6b\x54\xaf\xb5\xd3\x5a\xc2\x4c\x67\xd6\xb5\xb2\xc8\xd1\x52\xb1\x68\x67\xc7\x3d\x3f\xd3\x2c\x0c\xbc\x42\xb3\x30\xeb\xb1\x8e\x23\xc6\x0c\xc7\x1e\xbb\x38\x30\xae\xa8\xb0\x36\xb0\x2d\xcd\x4a\xe8\x95\xa5\x64\x56\x70\xbe\xb4\x5c\xf4\x7c\x94\x1d\xe6\x3a\x03\xcd\x2e\x54\x51\x83\xf6\x45\xba\xb2\xd7\x85\x12\x6f\x51\x75\x52\xc2\x7e\xd0\xa5\x73\x82\x5b\x83\x24\x8a\xf2\x96\x37\x15\x92\xb9\x49\x80\x84\x82\xa4\x0d\x4a\x24\xa2\xc0\x29\xc7\x11\x51\xbf\xe0\xb1\xc5\xfe\xa5\x5e\xff\x9f\xe0\xb1\x50\x41\x08\x29\x80\xc7\x80\xa5\xbc\x6c\x12\x4e\xc6\x12\xc7\x8a\x0a\x8f\x79\x2a\x73\x1c\x10\x81\x24\xf1\x0a\x2f\x40\x29\x76\x58\x0e\x42\x55\xa4\x50\x61\x55\x4c\x45\xa8\x28\x1b\x6f\xfb\x0c\xaf\x17\x04\x59\xe6\x58\x2c\x73\x2a\x12\x59\xa0\xf2\x98\x97\x80\xcc\x2a\x40\x12\x65\x4e\x81\x02\xa0\x32\x15\x15\x56\x92\x55\xac\xa8\x2a\x45\x84\x10\x11\x4b\x26\x94\x30\xcb\x49\xa6\xc2\x6d\xf2\xb4\xb4\xf7\xd8\x78\x6e\xb5\xf5\x58\x55\xea\x0d\x02\xa9\xdd\x1b\x24\x8b\x23\x7d\x5e\x47\x79\x0d\xc8\x45\x38\x6f\x25\xc5\x5c\x7f\x86\x58\x41\x9f\x26\x34\xc4\x0f\x38\x2e\x9f\x56\xca\x19\xdd\xb7\x7a\x9d\x5c\x37\xdd\xe6\x52\xed\x1c\xe2\xd6\x73\x15\x19\x45\x5e\xe1\x2d\x1a\xea\xb9\x95\x9f\x13\xd8\xf9\x70\x25\xd4\xb7\x03\x82\x8d\xc7\x26\x8f\x18\xf7\x26\x05\x43\x0e\xd8\x6e\x4a\x29\xf5\x10\xcc\x67\x50\x53\x80\x35\x9c\xcb\x55\x8a\x83\xc4\x2a\x58\xa1\x6c\x6e\x32\x18\x99\x99\xba\x96\x64\xd7\x83\x61\xa6\x9b\x47\xf5\xc2\x38\x2a\xf6\xfa\x3a\x6e\xf7\xfb\xbe\xa0\xce\x9b\x5a\x67\xc2\x17\x3d\x00\x66\xad\xce\xca\x61\x53\x3d\x3d\x1b\x6b\x6e\x5f\xf0\xd8\x92\x72\xa9\xd7\xff\x7f\xf7\xd8\x2b\xb3\xbc\x0b\x47\x02\x9e\x98\x33\xbe\xdd\x4f\x7e\x46\xd9\xb5\x0d\xcf\xe7\x74\x9e\xef\x59\x3e\xa1\xed\xca\x8e\xe3\x13\x1a\xaf\xec\x0d\x7e\x74\xc6\x7d\xb4\x3f\x78\x58\xb5\xc8\x34\x5b\xfd\x4a\x49\xaf\xa6\x35\xc9\x68\xd6\xab\x3d\xa9\x37\x68\xb5\x73\x69\xad\xd9\x68\x89\x7a\x43\x2a\xf5\x6b\x8d\x56\xa5\xcd\x57\xf9\x6a\xa3\x5e\x95\xf4\x56\xb7\x5b\x2c\x0d\xfa\xfc\x76\xd6\xb0\x9d\xdb\x56\xdb\x4a\xa5\x3d\x5c\x58\x18\x95\x32\x81\x3a\x77\x71\xda\x4e\x95\x2a\x09\x7d\xc4\x75\x0b\x4b\x77\xe5\x7a\x10\xe7\x33\x33\xdf\x83\xab\xce\xc1\xfb\xe2\x98\x4e\xc7\x7f\x6e\xc2\x2c\x6b\x25\x71\xd8\xa8\xb5\x73\xa9\x3e\x98\x25\x91\xdb\x9e\xa6\x0a\x09\x30\x65\xf9\x86\x53\x4b\xe6\x5a\xee\x44\x13\x68\xd3\xce\x2a\x35\xbf\xb4\x1d\x66\xa5\x4c\xb5\xbd\x96\xe2\x3f\xad\xfd\x3f\xa9\x58\xe9\x62\xff\xff\x19\x4d\x53\xd3\x47\x51\x9c\x6a\xcd\xb5\x9a\x1c\x4c\x27\x6e\x2a\x98\xe5\x87\xfd\x1e\x28\xb5\xca\xa1\xc4\xa3\x28\x4a\xc9\x64\x0e\x32\xd9\xf2\x60\x28\xd7\x1d\x79\x5c\xd9\xaa\xeb\xa2\xbc\xdf\xed\x8b\xb3\x69\xb1\xdb\x4b\x18\xb4\x8b\xd4\xa4\xaf\xf7\x44\x37\x50\x8a\xbd\xce\x92\x5f\x0c\x57\x52\x50\x86\x2b\x7d\xdc\x84\x8b\x75\x22\x52\x74\x9a\x4c\xe4\x7a\x72\x71\xea\x58\xa3\x54\x79\xd4\x6e\xb2\x79\xb7\xb0\x9e\xe9\x74\x51\x75\xd0\x8a\xeb\x88\xde\xb0\x97\x59\xfc\xf8\x71\xfe\xb4\xf8\xe4\xae\x11\x9e\xea\x9a\xca\x69\xd7\x64\x32\x05\xa7\x1f\x4c\x15\x98\x09\x32\x58\x52\x6c\x6f\xb0\xc8\x4b\x7e\x25\x1c\x2e\x94\x51\xab\xea\x77\xd6\x35\x9c\xac\x78\xa6\x25\x09\x15\x62\xed\xbb\x46\x3e\xcb\x36\x1f\xa6\x5e\xc8\xf7\xa7\xe2\xa8\xdb\x1f\xf6\xd2\x9d\x7e\xd6\x50\x6a\x83\x26\xa6\xa3\x51\x2b\x6d\x64\x93\x9d\xd0\x6f\x8b\x2d\x2a\x00\x7f\x45\x7c\x75\xe2\x35\x1a\x4d\x7e\x3a\x98\xe3\x52\xa1\xdb\x6a\xb1\xc4\xcf\xb5\x35\xe4\xe6\x39\x17\xba\x1e\x97\x26\x23\xa1\x42\x7a\x4b\x6d\xcc\x15\x33\xf5\x5f\x4e\xbd\xf8\x14\xf5\xf5\x33\xea\xd3\x45\x54\x6f\xa6\x0d\x4d\xad\xeb\x19\x69\xa1\xd7\x2a\xca\x7c\xd4\x51\xfc\xb1\xab\x37\x1b\xc4\x32\x74\xec\x9a\x58\x27\x12\x6d\x76\x7b\x07\xea\xc1\xb3\xd4\x17\x85\xa2\x86\xfa\x79\xaf\x58\x48\x35\x14\xbb\xbd\x04\xeb\x69\x3a\x9b\xc3\xb9\x96\xe2\xf2\x7a\xdb\x67\x7b\x0d\xb5\x5a\x4b\xd7\x12\xb6\x6d\x3a\xc3\x99\x96\x4e\x94\x14\xbd\x26\xf6\x3a\x7c\x5b\xf1\x86\xcd\xe5\xb4\x2d\xa2\x6e\x2f\x09\x6b\x7d\x6e\x96\x5b\xce\x5a\xe5\x6a\x54\x6c\xa6\xb5\x5f\x4e\xbd\xf4\x14\xf5\xed\x73\xaf\x5f\x84\x15\xdb\x4e\xe1\x76\xa7\x5f\x6c\xb5\x73\xf5\xce\xbc\x57\x4d\x72\x21\xeb\xa1\x35\x4c\x25\x16\x56\xaf\x64\xf5\x68\x33\x51\x28\x63\xed\x40\xfd\xf9\x20\xe1\xc3\xd4\x9b\x2a\xd5\x8b\x53\x6d\x68\x68\x2c\x1a\x09\xbc\x8d\x74\xe0\xe3\xc9\xa0\xd5\x99\x56\xf4\x29\xee\xf0\x7c\x86\x5d\x20\x25\x3d\x9f\x56\x0a\x54\xed\xae\x47\x0d\xd4\x1a\x34\x8d\x25\xc0\x05\xdd\xe7\xf2\x6d\x94\x9f\xfb\xbe\x95\xae\x3a\xad\x71\x36\x27\x4a\x5d\xb6\x99\x63\x83\x8c\xb5\xa5\xfe\xfa\xd3\xe5\xd2\xb1\x8b\x07\x9e\x2e\xaf\x47\x2f\xf6\x9d\x29\x12\xca\xb2\x94\x40\x04\xa1\xaa\x2a\x1c\x24\x84\x83\x9c\xcc\x01\x62\x42\xd1\x44\x48\x50\xb1\x8a\x90\x8c\x59\x00\x01\xa4\xc4\x14\x38\x16\xc9\x32\x47\x54\x56\x05\x50\x65\x4d\xf6\xb8\x53\xe3\xd0\xd8\x8e\xcf\xa4\xd6\x62\xd9\x2c\xa4\x53\x5c\xe8\x57\xe7\x7c\x62\xc0\x96\xf4\xac\xbf\x16\xed\x5a\xa7\x4f\xf3\xa8\x04\xf1\x84\xed\x57\x65\x1b\x07\xc5\xf6\x7b\x23\x9d\x2b\xc7\x2c\x3e\xdc\xf8\xc3\x51\x8b\x7d\xe3\x1d\x18\x46\xf1\x21\x4e\xbc\x3b\x4c\x75\x76\xc5\x43\xf9\x67\xa7\x03\xe7\x11\x75\x01\xc7\xeb\x3b\xd6\xdb\x17\x38\xce\x51\x6c\x71\x70\xec\x3d\x9a\x3c\x12\x2d\xfc\x60\x3c\x81\x61\x38\x19\x06\x30\x24\x17\x34\xb5\x48\x18\x31\xcd\x4c\x8e\x31\xb6\xc2\xcc\x77\xa6\x49\x26\x11\x71\x11\x09\x18\x9e\xe5\xa4\x7b\x0c\x51\x3f\x30\x49\x68\x4e\x7c\xcf\x23\xcb\xc8\x81\x33\xcf\x1c\x9e\x1b\x8a\x5f\x90\xb8\x47\xd9\x96\xfd\xdd\x06\x64\x78\xb9\xfd\xff\x37\xde\xaf\xfc\x2d\xb2\x5d\xf2\xdb\x9f\x0c\xbb\xdd\xbe\xfc\x6d\xf7\xc6\xf9\x6f\x7f\x32\xdb\xfb\xf1\x87\x43\x18\xfe\xf6\xe7\xf6\xf5\x8c\xf8\xc3\xff\xec\x84\x29\x21\xf7\x09\xba\x70\x19\x2d\x43\x7b\x7d\xa7\x78\x40\x42\x12\xcc\xdf\x13\xfe\xf2\x9f\x7b\xa8\xd8\x65\x5b\x18\x98\x43\x7b\xbe\xbb\x79\x85\x8a\x43\xdb\xb9\x1d\x90\x18\x46\xf0\xdb\x9f\xcc\x6f\x73\x8e\xfb\x17\xf7\x2f\xf6\xb7\xdd\x0d\x73\x16\x04\xc4\x8b\xca\x31\xcf\xbf\xfd\xc9\x48\xa7\x9f\xa7\xe2\x23\xd7\x1b\xbc\xff\x7b\xdf\x80\x43\x53\xf6\x92\x1b\xc5\x98\x88\x1c\x54\x59\x11\x0b\xa2\xa9\xca\x44\xc4\x9c\x28\x4b\x58\x90\x4c\x45\xe5\x90\x89\x30\xe5\x11\xe5\x08\x54\x65\xd5\x54\x44\x51\x91\x15\x28\x98\x04\x8a\xbc\x8c\x28\x16\x39\x16\xef\x10\xed\xf5\x6e\xbc\xe7\x84\xb8\xfd\x9d\xb8\xed\x9b\xae\x3e\xb9\xf5\x9f\xb3\xef\x87\x1e\x9c\x6c\x70\x99\x94\x88\x9c\x22\x00\xc8\xc9\x00\x49\x02\x8b\x25\x99\x28\x3c\x06\xb2\x0a\x4c\x22\x6d\xe6\xc7\x82\x24\x0a\x2a\x32\x79\x41\x64\xa9\x04\x81\xa2\x10\x5e\x94\x78\x22\x20\xc2\x29\x0a\xf7\xdb\x97\x0b\x16\xae\x70\x40\xa8\xc0\x41\x9e\x85\x82\xaa\x10\x02\x04\x93\xf0\x3c\x0f\x24\x02\x15\x0e\x00\xa0\xc8\x08\x9a\x92\x28\x4b\x32\x15\x04\x6c\x9a\x22\x15\x28\x31\x65\x16\x4b\x12\xc6\x94\x93\x05\xac\x7e\x9c\x03\xee\xdb\xdb\x7b\xfe\x2c\x9a\xcc\xa2\xcf\x6d\xfb\x2d\x86\x9f\xdd\xb2\xfb\x08\xc3\x4f\xdb\xfa\x45\x5e\xf6\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\x0b\x39\x88\xff\xfa\x3f\xf7\x4d\x1a\x36\xf3\xd8\xd0\x9c\xc4\x2f\x36\x5e\xba\x5e\x5e\x67\xe8\xdb\x25\x57\xa7\x96\xc9\xe9\xa6\x5e\xe8\xae\x2c\x39\x89\x24\xaf\xee\x5b\xcd\x51\xcd\xd6\xd5\xce\x50\x19\x84\x93\x09\xef\x35\x2c\x30\x2d\xf2\xa1\x73\x58\x98\xcd\xc5\xff\xb2\x60\x91\x49\x4c\xe5\xe9\xc0\x82\x60\xe8\x77\x73\x89\xd5\x78\x05\xaa\xd8\x05\xa8\x4e\xbc\x20\xb1\x58\xa6\xf9\x3e\x19\x17\xc9\x24\x73\x58\x2c\x2b\x8e\x9e\x5c\xa6\x79\x64\x45\x21\xa5\x69\xea\x38\x94\xf3\x15\x56\x8a\xd6\xbd\x34\xd1\xeb\x15\xa9\xcf\x16\xc5\x46\xb5\x13\xc8\x1d\x47\xcc\x06\xa4\x37\x49\x4f\xa4\x5a\x77\x22\xba\x91\x26\x2d\xf3\xc0\x5f\x11\x5d\x6c\xb0\x4b\xbf\x6f\x45\x2b\x2e\x0b\xc7\xa8\x64\x67\x1a\xb0\xbf\x48\xb7\x26\xfd\x4a\xa6\xab\x2c\x7b\x19\xeb\x15\x4f\xba\xff\xe4\xde\x58\xea\x91\x65\xb0\xba\x56\x1b\x94\xab\xc3\x91\x51\x45\x26\xb7\xf0\xec\x6c\xa6\xda\x35\xd2\x24\xdb\x72\x60\xc2\x19\x90\x54\x49\x70\xe4\xfa\x94\xb4\xb8\x29\x29\x06\xf5\xaa\xd9\x98\xc9\x15\xcf\xae\x66\x71\x05\xe6\xf5\xb2\x19\x35\xf2\x93\xfc\xca\xb7\xd8\xae\x5b\xd1\xc6\x72\x37\xa3\x71\xf3\x4a\x67\x21\xc6\x70\xa4\x45\xa1\x3b\x72\xa7\x6e\x98\x6a\xa5\xa2\xa6\x0d\x48\x99\xeb\x36\x71\x98\x2c\x75\xc6\x62\x26\x61\x2a\x4e\xb3\x68\x35\xed\x4e\xad\x6c\x3b\x73\x41\x6a\x26\x45\xa3\x5c\x5f\x15\x82\xfa\xa4\x1c\x94\x1b\x65\x38\xa5\x1a\xbb\x84\xa4\xdc\x18\xe6\x40\x3d\xed\xa1\x00\xea\x98\x4b\xd5\x9f\xf4\xb7\x3d\xdf\xda\xe2\xd9\xbd\xc8\xed\x0a\xe2\xc7\xfc\xb7\x5e\xa8\xf5\x56\x69\x68\xe9\xad\xba\x91\x17\x55\xd5\x77\x57\x55\xb9\x00\xbb\x6d\x0e\x8e\xd2\x25\xaf\x83\x23\x4b\xad\xe4\x93\x5a\x20\x8f\x52\x42\xb2\x13\x8a\x6c\x97\xe5\xdb\x23\x93\x08\x8d\x55\xc9\x68\x38\xf9\x65\x20\x97\x74\x6d\x34\x69\x4b\xa9\x14\xa9\x76\xa2\xec\x10\x97\x62\xbe\xb5\x94\xe0\x60\x77\xee\x34\xb0\xa7\xb8\x15\x5b\x4d\x85\xfd\xcc\xdc\x77\xa6\x6a\x2d\x69\x75\x6c\x69\xde\x32\xed\x40\x4c\xcd\x07\x5e\xaf\xdd\xd7\x0f\xfe\x52\x92\x47\xc4\x16\x46\xae\xaf\x2b\xad\xbc\x93\x49\x12\xcb\x14\x40\xad\x17\x15\x4a\xa5\x75\xb7\xa3\x2c\x3a\xf6\x20\x05\xd3\x33\xa9\x2c\xc5\x8b\x95\x83\xf8\x4b\x47\xfb\x38\xe7\xfe\x77\x14\x5f\xc8\xb5\x5c\xae\xc3\x63\x4b\xea\x70\xee\x94\x23\x4e\xc5\xcc\x73\xd1\x72\xd4\xec\x97\x06\xea\x22\x6b\xf9\xcd\x14\x24\x5d\xa5\x6d\xe7\xe2\xf3\x34\xa9\x4e\xc7\xd8\x7e\x51\x4b\x73\xb3\x14\x2e\xf8\xad\x99\x55\x99\xd7\xa3\x0c\x48\x0d\xf5\xb2\x60\x10\x15\x77\x6a\x34\xaf\x27\x8a\xb6\x54\x9c\xb7\xab\x89\x81\x16\x81\xed\x69\x06\xbc\xee\xb6\x8f\xa0\xe4\xf7\x78\xeb\x39\x54\x65\xa3\x08\x27\xe7\xf9\x7c\x18\x48\xca\xb8\x30\x29\x85\xa9\x71\x95\x6b\xc0\xf2\x44\x5b\x66\xab\xa3\x64\x4f\xca\xa8\x42\xb6\x44\x7b\xd2\x72\x59\x98\xcc\xf2\x76\x5b\xad\x39\xc5\xea\x8a\x4b\x42\xa7\x60\xa8\x63\xb3\xba\x8c\x4a\x06\x9e\xcf\xc1\x3a\x3d\xcc\x37\x6a\x8d\x64\x5d\x39\xb4\xf7\xd7\xac\x50\x5e\x79\xe5\xea\xa3\x2b\x94\x47\xaf\x5d\x7d\xc6\xb1\x6f\xee\x1b\xf3\xcc\x99\xec\x97\x76\x33\xf3\xf2\x8d\x51\x79\x5e\x10\x00\xcf\x0a\xb2\x22\x89\x00\x48\x0a\x0b\xbe\x31\xd2\xeb\xf3\x2a\xb6\x22\xdd\x38\x84\x7d\xb1\x4d\x8f\x1f\xc3\xfe\xdb\xda\x74\xad\xe7\xaf\xbd\x89\xf4\xe1\xbe\x3f\x7e\x1b\x69\xcf\x14\x2f\x00\x91\xa8\xaa\x20\xaa\x48\x25\x14\x60\x04\x55\x28\x61\x24\x08\x82\x8a\x80\x42\x31\x54\xa8\x20\x02\x00\x10\x07\xa9\x20\x20\x28\xca\x0a\xc4\x92\xc9\x62\xaa\x8a\x32\x16\xf1\xee\xe0\xe8\xc9\xd3\xbf\x72\x16\xfd\x29\x3b\x99\x62\xcb\x6c\x31\xbf\x8a\x86\x0b\x83\x73\xfa\x2c\x5c\x4d\x7c\x4e\x35\x0a\xcb\x79\x39\xbd\xaa\x4a\x51\x2a\x6b\xa6\x3b\xf3\x45\x4e\x5d\x08\x56\x14\x54\xbd\xc1\x79\x56\xbd\x74\x5d\x3d\x80\x9c\x3d\xcb\x46\x1f\xb7\xdf\x4f\x26\xcc\xf3\xec\x75\x9f\xfd\xb7\xfb\x5b\x97\x79\xa7\x12\xab\x50\x5e\x94\x79\xde\x44\xbc\x2c\x29\x48\x41\xa2\x6c\x2a\x22\xc5\x9c\x89\x59\xca\x09\x48\x56\x58\x95\x45\x10\x12\x45\x42\x22\x47\x14\x24\x03\x93\x72\x32\xc1\x54\x02\x8a\xb9\xe5\x9d\x7f\xcb\xfb\xdf\xd4\xee\xcf\xe2\x5d\x11\x0f\xdf\xd7\x7f\x01\xef\x3c\xe2\x89\xc2\x63\x04\x11\x62\x79\x11\xf1\x00\xb2\xa6\xc0\x89\xac\x09\x01\x87\x15\x68\xaa\xc8\x04\x9c\x22\x70\x54\xa5\x12\x14\x10\x96\x55\x62\x42\x01\x2b\x0a\x45\x2c\x31\xa5\x1d\xef\xc2\xa7\xf3\xfe\x68\xbb\x3f\x8b\x77\x70\xf4\xb8\xac\xfc\x02\xde\x15\x8e\xe3\x54\xde\x14\x14\x59\x14\x30\x05\x82\xc9\x72\x12\x94\x20\x87\x01\x40\x0a\xcb\x63\x4a\x59\x09\x8b\x54\x62\xa9\x29\x63\x8e\x55\x38\x19\x42\x20\x99\x2c\x94\x39\x56\xa5\x2a\xdc\x1d\xe7\xbd\xcd\xfb\x0c\xa6\x51\xa7\x37\xe0\x33\x4e\xaf\x0b\x83\x8e\xdc\x5e\x2e\x50\x57\xc8\x1b\x45\x6b\xe2\x09\x5a\x33\x3d\xd4\x73\x13\x09\x2d\x9b\x7a\x77\x7b\x7c\x04\xb8\xe1\xee\x30\xba\x75\x8d\xdb\x77\x79\xcf\x3c\x67\xdf\x35\x1f\xb3\x7f\x2f\xef\x08\x8b\x8a\x8c\x11\xc6\x2c\x8f\x45\x99\x55\x38\x20\x03\xce\x14\xa1\x04\x01\x51\xb1\x4c\x14\x59\x32\x21\xaf\x9a\x9b\x14\x23\xf3\x18\x40\x48\x01\x0b\x79\x4a\x88\x84\x04\x19\x93\x2d\xef\xb7\xf3\x4c\x7a\xe6\x0b\x7e\x24\x4a\xd3\x74\x2d\xbb\x9c\xd4\x93\x82\x5f\x30\x12\x6b\x0e\x34\x56\x76\xc8\x39\xb4\x92\xeb\xbb\xf5\xae\x15\xcc\x9a\x89\x96\xf6\x2b\x78\x7f\xc4\xfe\xaf\xe6\x1d\x00\x41\xa6\x2c\x52\x64\x15\x13\x96\x02\x11\x4a\x04\x03\xaa\x60\x59\xe2\x55\x55\x54\x79\x41\x21\x88\xa5\xac\xc8\x73\x54\xa0\x26\x8f\x90\x29\x0a\x0a\xab\x88\x94\xe7\x4c\x85\x95\xa4\xdd\x61\xe0\xdb\xbc\x7f\x74\x54\xfc\x19\xbc\x67\x9f\xb3\xff\xab\x79\x17\x90\x8c\x4d\x89\x8a\x32\xc1\x0a\x27\xb2\x92\x2a\x99\x94\x8a\x48\x40\x8a\x89\xa0\x8c\x00\x35\x59\x64\xb2\x0a\xcb\x51\xcc\xf3\x3c\x11\x4d\xc0\x01\xa4\x8a\x2a\x20\x44\x32\x09\x7e\x3d\xd2\xfa\x96\xf7\x4f\xf4\xb7\x98\xc2\xd4\x07\x79\xcf\x3d\x67\x7f\x2c\x3e\x66\xff\xe6\xa1\x91\xcb\xef\x7f\x7f\x7c\x60\xfa\xab\x47\xa5\xf9\xb2\x52\xa8\xcf\xeb\x63\x54\xe2\x0b\x9a\xd0\xed\x8c\x1a\x41\xc9\x1d\xf5\x58\x96\xe6\x95\xb0\xac\x03\x97\xcd\x36\x16\xc5\x6e\x52\xeb\x09\xda\x7e\x4e\xab\x5d\x62\xe9\x0d\x6b\xc1\xd4\x90\xcb\xa4\x0a\xad\xd1\xb2\x02\xdb\x35\x55\x4e\xad\x69\xa8\x12\xd6\xf4\x03\x63\xd0\x5b\xa7\xba\xc5\x71\xce\x2f\x81\xf1\x7c\xbc\x0d\x81\xaa\x14\x94\x8e\xf5\x6d\x9f\xc2\x9b\x4e\x49\x67\xd6\xd3\xf9\xb8\x9e\xaa\xfb\x86\x56\xb4\x69\xad\xd1\xcb\xf8\xe5\xe1\x3c\x5a\x99\x2d\xc1\xc9\xd5\xd2\x75\x89\xb3\xc6\x38\xcc\x15\x60\xca\xe8\x2e\x58\xa9\x99\xec\x0c\xbb\x6c\xcf\x1a\x07\x6c\x3a\x55\xcb\x8a\x06\xcc\x75\xf8\x92\x6b\x86\xc2\x60\x51\x76\x6d\x24\xb6\x1a\x41\xa5\xbc\x99\x92\xe8\x42\x6b\x32\x66\x5d\x09\x08\xbc\xec\x3a\xfc\xba\x22\x45\x62\x12\x8e\xd6\x0d\x81\x2c\x83\x75\x55\x6e\xf8\x41\x67\x61\x24\xda\xa8\x7d\x78\x85\xe4\x06\x07\x07\xcf\x38\x39\x95\x73\x24\x1b\x37\xf5\x33\x46\x45\x8f\x8e\x4a\xb4\x4f\x18\x15\x19\xc1\xaa\xd5\x7a\xc2\xbe\xa6\xfd\x7d\x4f\xc9\x4b\xd9\xf2\x57\x4f\x41\x1e\x0f\xb2\x1b\x0b\x47\xdb\x2b\x42\x56\xaf\x21\x67\x81\x9f\x29\xb3\xe5\x7a\x62\xd1\x6f\xa6\xd5\x75\x6f\xde\xeb\xb4\x84\xa5\x5d\xb3\xfb\xb3\x26\xe2\x32\x73\xb7\x5e\x26\xdb\x35\xdd\xeb\x41\xa6\x05\x53\xc0\xc3\xc5\x48\xd1\x59\x54\xe6\x87\xe9\xa2\x9a\xa9\xfa\x1c\x6d\x2f\x96\x93\x45\xdb\x2b\xa9\x0d\xc9\x98\x37\x92\x64\xd1\x33\x7d\x3a\xaf\x26\xb8\x49\xc3\x28\x16\x49\xcb\x28\x54\xf2\x0e\xc2\x4e\xae\x44\xa6\xe3\x85\x2b\xd0\x71\xad\xa6\x72\x73\xab\xdc\xed\x89\xc0\xdf\x4c\xf8\x5f\xd4\xfa\x68\xd5\xb0\xcb\xe5\xa2\x63\x8b\x51\x7e\x95\x4d\x36\xd6\x75\xa5\x15\xf9\xe9\xfa\x6c\x2a\xe7\xa2\x94\x5c\x1e\x28\x4a\x17\xd0\x8e\x78\x78\xdf\xe6\xef\x0f\xb2\x67\x9d\xfc\xd9\x20\xab\x2c\xca\x6e\xf0\x99\x41\xf6\x17\x0e\x89\xee\x0a\xb2\x4f\x9e\x6f\x3e\x1e\x64\x99\x33\xf4\x6f\x1c\xee\x83\xab\xb3\x37\x82\x2c\x53\x9c\x39\x5c\x54\xce\x97\x73\x62\x67\xb9\x88\x58\x9c\x49\x77\xb2\x54\x8e\x90\xe4\x88\x68\x55\x09\xf2\x56\x7a\x92\x70\x3a\x83\x8a\xbb\x34\x23\x49\xb4\x0d\xca\xbb\xcb\x68\xb4\x94\x2b\x58\x1a\x14\xc5\xac\x98\x71\xcc\x90\x8a\x72\x56\x1b\xa6\xf2\xcd\x76\x2d\xf4\x14\xda\x8f\x83\xac\xb4\x92\xd3\xbc\x3c\x5b\x14\xcb\x45\x39\x93\xc9\x69\x2b\xaf\xd0\x0f\x8a\xf3\x42\x3e\x53\x90\x54\x58\x55\x21\x59\x8d\x78\x3d\xb1\x00\xb9\xff\xa6\x20\x7b\xd6\xc9\x9f\x0d\xb2\x32\x3b\x96\x33\x9f\x18\x64\x7f\xe5\x3c\xfb\xae\x20\xfb\xe4\xc5\x85\xbc\xe4\x17\xa3\x0e\xf6\xfa\xd5\x0e\x1e\x4c\xa3\xde\xa4\x55\x48\x45\xc8\xec\xb3\x6e\xda\xa5\x66\x4a\x2f\x65\xad\xae\xe7\xcc\x73\xfa\x10\x6a\xa7\x5b\x20\x37\x86\x8b\xf1\xbb\x8e\x8f\x6d\x69\x08\xc9\xfd\x75\xd0\x97\xdb\xdb\xaf\xd7\x1c\x0b\xe4\xcb\xc3\xa2\xc5\x2e\xc1\x68\xa2\x2d\xb8\xec\x42\x2e\xf0\xbd\x9c\xbc\x6a\xe8\x2e\x2d\xea\x8b\x1c\x5d\xb2\xaa\x31\xb3\x25\x14\x55\x8b\x5a\x8e\x2c\x72\x9a\x41\xab\x50\x4b\x29\xb9\xfa\xc0\x91\x26\x82\x26\x59\xc2\x58\xce\x14\x32\xb6\x45\xdb\x46\x3b\xc3\xc9\x96\x19\x07\x85\xd5\xc8\x37\x17\xe2\x20\x23\x08\x35\x2d\x07\xbb\x43\x4e\x98\x69\x65\xaa\xe4\xb8\x5a\xbb\xb6\x8c\xb2\x7a\x6e\x3a\xe1\x16\xa5\x7e\xdd\x93\xfc\x3d\xb2\xcb\x01\xd7\x3f\xed\xd4\x93\x80\x8b\xb9\xdb\x26\xa8\xa3\x97\x51\x1f\x48\x48\x45\xef\xd0\x17\x57\xae\x2b\x8b\x9a\x27\x01\xff\x29\xf6\xaf\x24\x9b\x7b\xec\x9f\x4f\x38\x9f\x5d\x58\x7a\x68\x21\xf7\xb3\xed\x7f\x60\xc2\xab\x1d\xec\xd7\x1f\xb1\x9f\xeb\xb4\xd9\x9d\xf2\x72\x57\xcc\xb1\x64\x58\x95\xb5\x95\x9a\x66\x6b\x61\x3e\x6b\xcd\x4d\x0e\x70\x5c\x5b\x55\xfa\x23\xd1\x2d\x8f\x5d\xb5\x0e\xa4\x71\x5a\x98\x1f\xb5\xf7\x10\x70\x8b\x73\xfe\xee\x4a\x48\x9f\xbc\xea\xf6\xf8\x9e\xec\x5f\x98\x90\x8e\xf6\x58\x53\xea\xd8\x2d\x75\xf9\xa9\x30\x07\x75\xba\x52\x6a\x15\x32\xce\x22\xae\xd5\xd2\x25\x7b\x39\x1d\xeb\x6c\xca\xb7\x7a\x41\x35\x02\x56\x95\x93\xf9\x3a\x1a\x0f\x79\xdc\x6c\xb5\x29\xc9\xf8\x73\x93\xad\x69\x90\x0e\x33\xbd\x65\x34\xec\x68\x4e\x58\x9e\x8d\x9c\x94\xbb\x1a\xa5\xb4\x7e\x9c\x34\xe6\xed\x61\x34\xc7\x5a\xd4\xb0\xac\xde\x60\xb9\x2c\x75\x3d\x19\x23\x7f\x60\xfa\x93\x15\x5b\x70\xcb\xbd\xe9\xdc\x2c\x95\x13\x12\x32\xa2\xc3\x82\xfa\x67\x25\xa4\x07\xe6\xfa\x9f\x9a\x90\x9e\xb4\xff\x89\x09\xe9\x53\x56\xc0\xde\x5e\x7f\xd9\x8a\xef\xb3\x09\xe9\xa3\xf6\xff\xf6\x84\xf4\xc9\xcb\xd1\x1f\x6c\xc4\x7d\x09\x69\xdb\xa8\x0f\x3a\xf9\x33\x87\x44\x0e\xc3\xd2\xf8\x2a\xec\xf1\xd6\x33\xa3\x54\x53\x9b\x39\x25\x53\x8d\x1a\xd3\xbc\x95\xa8\x8e\x3b\xa8\x54\x5b\x8b\xbe\xd3\xa8\xf7\xdb\x64\xbe\x4a\xd3\x39\x5b\xd6\x9c\x29\xea\xe5\xe5\x55\x0d\x4d\x1a\x6c\xaa\x21\xfb\xc0\x0d\x6c\xb7\xe1\x2a\x55\xb1\xe3\x37\x52\x79\x5d\x6b\xd5\x53\x22\x6f\x54\xbb\x66\x6e\x8d\xeb\x8b\x38\xc9\xe0\x35\x5a\xcc\xf2\x1e\xc9\x08\x4d\x07\xf4\x12\xc6\xa0\xe9\xb6\xc7\xa3\x51\x90\x59\xd4\x87\x4a\x72\x11\xcc\xb3\x55\x6d\x58\xd3\x4d\x2b\x77\x18\xb1\x5f\x4e\x60\x67\x4e\x70\x25\x81\x1d\x13\xfe\xc0\x3a\xca\xd3\x09\xec\x13\xed\x3f\x96\xc0\xce\x97\xf0\xff\xeb\x02\x58\x3b\xdd\x5a\xf9\xab\xf1\x65\x66\x70\x65\x3d\x9d\x60\x3e\x79\xdf\xe5\x9f\x53\x68\x8f\x9c\x42\x8b\x93\x40\x95\x17\x72\x6a\x1e\xf4\x73\x5a\xb7\xb3\x4e\x36\xd7\xb3\xca\xcc\x8d\x92\x8b\xf2\x42\xd7\x28\x6b\x97\xc7\xcb\x25\x91\x9a\x3d\xe0\xac\xa3\x03\xb2\xa7\x12\xcc\xd1\x53\xf3\x91\x11\x4a\xf5\xd0\x77\x47\x27\xe8\xde\x04\xc7\xa5\x2b\xf5\xc9\xf6\xd3\x0f\xd9\x8f\xff\x3c\x4f\x30\xff\x4d\x53\x16\xed\x74\x0f\xf1\xaf\xc6\x97\x12\x8c\x41\xfd\x3d\x7c\x15\xed\xbf\x37\x01\x5e\xe2\xef\x2f\xc4\xf7\x2e\x7f\x37\xf7\x68\x6f\xfc\xa6\xf4\x47\x37\x6a\xcf\x7e\x57\xfa\x35\xf7\x1f\xef\xb4\x6e\x7f\xbf\xf1\x90\x2b\x2e\x3c\x3c\xae\x6b\xd9\xcf\x77\xb7\xbf\xfa\xf8\x46\xcb\xd5\x3a\x78\x6f\xcb\x83\xee\xeb\xff\xbd\xfe\xf6\xf4\x3b\xcd\x3c\xae\x53\x1a\x57\x27\x3d\xd2\x18\xbf\x26\xa1\x65\x32\x17\x2a\x76\xed\x0d\x32\xb5\x86\x5e\xd1\x1a\x7d\xa6\x94\xed\x33\x5f\xf7\xc5\x0c\xbe\xed\x2b\xe5\x5d\xad\x5b\x77\x56\x31\xf5\xb3\x80\x87\x37\x50\x87\xb7\x20\x5f\xaa\x23\x76\x28\x12\xfb\x34\x3c\x04\xbd\x4b\xc8\x5e\x0d\x9c\x82\xda\x96\x2e\xb9\x5d\x64\xec\x66\x75\xdc\xa7\xe1\x9e\x28\xbf\x04\xfc\x86\x75\xa6\x6d\xe8\xf5\x76\x96\x39\xfc\x9e\xf9\x87\x5a\xf2\x39\x7c\x7f\xb0\x01\x6f\xfb\xe0\x50\x77\xed\x4a\xcd\xb0\x93\x9a\xca\x4f\xe3\xdd\x2a\xbb\x04\xf4\xc8\xcc\x29\xc2\x5d\x25\xab\xcb\x15\xac\x8e\x0b\x48\x3f\x0d\x2e\xd6\x75\x09\xdb\xc1\xc8\x29\x34\x7b\xf2\x2d\xae\x6b\x75\xb3\x62\xd3\x85\xc2\xd9\xcf\x23\x3d\x52\x79\x11\xf0\xb9\xc9\x4b\x9d\x7e\xa5\xac\xd3\x49\xf9\xf0\xcf\x40\x1a\xce\xd0\x15\x8c\xaf\x66\x4e\xd1\xc5\x15\xa1\x6e\xd4\x78\x7a\x53\x33\xfd\x69\x90\x07\x85\x97\x80\x9e\x99\xbb\x2b\x87\x1d\xfd\x50\xce\x79\xe5\xf8\xa7\xd1\x1e\x14\x5e\x42\x7b\x66\xee\x14\xed\x6b\xa5\xa4\x1b\x95\x88\xde\x54\xd0\x7f\x1e\xef\x5e\xe1\x45\xbc\xa7\xe6\x4e\xf1\xee\x8b\x19\xdd\x28\x52\x74\x5c\x0a\xe6\x73\x00\x1f\x14\x5e\x02\x7c\x66\xee\xea\xd0\x60\x5b\xa4\xe8\xdb\xa1\x02\xd1\xcd\x2a\x34\xa7\x35\x5b\x3e\xa9\x1d\x47\x2a\x2f\xb6\xe4\xdc\xe4\xa5\x2c\x11\x92\xe9\xb7\xd7\xb2\x2b\xd7\x2b\xc4\x1c\xd5\x47\xf9\x2c\xec\x37\x81\x3f\x85\xfa\x6c\x88\x7a\x56\xb6\xe4\x73\xf0\x9f\x2a\xbd\xd4\x88\x0b\x66\xaf\xb6\xe4\xb8\x7a\xcb\xb5\xa1\xe6\xae\xb4\xd3\xfe\x0d\x32\xdd\xc8\x64\x7b\xf7\xd5\x95\x89\x45\xcf\xf5\x30\x55\xe3\x30\x8a\x6d\x37\x75\x23\xcf\xa0\x28\x20\x84\x79\x2d\x22\xf5\x3b\xd3\x2d\x64\x1b\x59\xe6\xb8\xa8\x14\xb7\x7f\x11\xf9\xed\x40\x93\x84\xd1\xf6\x59\xbe\x69\xc5\xc3\x28\x4f\xd5\x6c\x40\xee\xc6\x29\x27\x10\x8f\x2b\x8b\x7e\x3b\xae\x23\xfa\x6d\x5b\xdf\xf3\x0d\xba\x4d\x37\xa0\x55\x48\xa6\x0f\x03\xdb\x6b\xd8\x60\x3a\x04\xc6\x09\xac\xeb\x43\xc5\x8d\x38\x25\xe4\x79\x08\xaf\x4a\xb6\x28\x8e\x12\xcc\x9d\x40\x76\x77\x9e\x03\x72\xac\x64\x03\xe4\x74\x20\x7c\x27\x92\xd0\x9c\x10\x6f\xfe\x24\x92\x63\x25\x1b\x24\x47\x3f\x47\x78\x3f\x8c\xdd\x03\xf5\x69\x24\xc7\x7a\x76\x60\x5e\x47\x09\xa7\x60\x8e\xab\x07\xde\x4a\x5f\xcf\x21\x3a\x57\xb4\x81\x74\x96\x1b\xdf\xe5\xa8\xe6\x87\x91\x15\x90\x66\xbd\xcc\xbc\xfe\x06\x1d\x83\x67\xee\x84\x31\x7d\x77\xe2\x90\x88\xc4\x66\xff\x5f\x00\x00\x00\xff\xff\xc9\x39\xb9\xbc\x35\x8c\x00\x00") - -func non_native_paymentCoreSqlBytes() ([]byte, error) { - return bindataRead( - _non_native_paymentCoreSql, - "non_native_payment-core.sql", - ) -} - -func non_native_paymentCoreSql() (*asset, error) { - bytes, err := non_native_paymentCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "non_native_payment-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x51, 0x1a, 0xcf, 0x20, 0xe9, 0xa1, 0x9d, 0x8d, 0x64, 0xc3, 0x55, 0xad, 0x2d, 0xe8, 0x9f, 0xc3, 0x5e, 0x2d, 0xf1, 0x5a, 0x7e, 0xbe, 0xb1, 0x28, 0xd6, 0xe3, 0x62, 0x88, 0x78, 0x14, 0x39, 0xf4}} - return a, nil -} - -var _non_native_paymentHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x67\x8f\xa3\x48\xb7\xf0\xf7\xfd\x15\x68\xb4\x52\xcf\xa8\x7b\xb6\xc9\x61\xf6\xce\x23\x61\x1b\x67\xe3\x1c\x57\x2b\xab\x80\x02\xd3\xc6\xc6\x0d\x38\xf5\xa3\xfb\xdf\x5f\x01\x8e\x98\xe4\x30\xb3\xb3\xf7\xb5\x46\xa3\x36\x9c\x3a\xa9\x4e\xa8\x73\xaa\x30\x5f\xbf\xfe\xf6\xf5\x2b\xd2\x30\x6d\x47\xb3\x60\xbb\x59\x45\x14\xe0\x00\x09\xd8\x10\x51\x96\xb3\xc5\x6f\x5f\xbf\xfe\xe6\xde\xcf\x2d\x67\x0b\xa8\x20\xaa\x65\xce\x8e\x00\x2b\x68\xd9\xba\x39\x47\xb8\x3f\xe8\x3f\xb0\x13\x28\x69\x8b\x2c\xb4\xb1\x3b\x3c\x00\xf2\x5b\x5b\xe8\x20\xb6\x03\x1c\x38\x83\x73\x67\xec\xe8\x33\x68\x2e\x1d\xe4\x3b\x82\xfe\xe9\xdd\x32\x4c\x79\x7a\x79\x55\x36\x74\x17\x1a\xce\x65\x53\xd1\xe7\x1a\xf2\x1d\x79\xea\x76\xf2\xec\xd3\x9f\x7b\x74\x73\x05\x58\xca\x58\x36\xe7\xaa\x69\xcd\xf4\xb9\x36\xb6\x1d\x4b\x9f\x6b\x36\xf2\x1d\x31\xe7\x3b\x1c\x13\x28\x4f\xc7\xea\x72\x2e\x3b\xba\x39\x1f\x4b\xa6\xa2\x43\xf7\xbe\x0a\x0c\x1b\x9e\x91\x99\xe9\xf3\xf1\x0c\xda\x36\xd0\x3c\x80\x35\xb0\xe6\xfa\x5c\xfb\x73\xc7\x3b\x04\x96\x3c\x19\x2f\x80\x33\x41\xbe\x23\x8b\xa5\x64\xe8\xf2\x8b\x2b\xac\x0c\x1c\x60\x98\x2e\x18\x5f\xed\x08\x2d\xa4\xc3\x67\xaa\x02\x52\xca\x23\xc2\xa0\xd4\xee\xb4\x91\xba\x58\x1d\xee\xe0\xff\x98\xe8\xb6\x63\x5a\xdb\xb1\x63\x01\x05\xda\x48\xae\x55\x6f\x20\xd9\xba\xd8\xee\xb4\xf8\x92\xd8\x39\x19\x74\x0e\x38\x96\xcd\xe5\xdc\x81\xd6\x18\xd8\x36\x74\xc6\xba\x32\x56\xa7\x70\xfb\xe7\xcf\x20\x28\x7b\x7f\xfd\x0c\x92\xae\x5d\xfd\x3c\x01\x7d\x6a\xd7\x4b\xe7\x33\xe8\x1a\x72\x1c\xb1\x13\xa8\x23\x72\x0f\xbc\x24\xe6\x84\xc1\x09\xe4\x0e\xad\xc7\xd5\x18\xaa\x2a\x94\x1d\x7b\x2c\x6d\xc7\xa6\xa5\x40\x6b\x2c\x99\xe6\x34\x7e\xa0\x3e\x57\xe0\x66\x7c\x22\xdc\xdc\x06\x9e\xa1\xdb\x63\x73\x3e\xd6\x95\x6b\x46\x9b\x0b\x68\x81\xc3\x58\x67\xbb\x80\x77\x8c\x3e\x72\x72\x17\x17\xd7\x8d\x35\xa0\xa2\x41\xcb\x1b\x68\xc3\xf7\x25\x9c\xcb\x57\x89\x70\x32\x7c\x61\xc1\x95\x6e\x2e\xed\xdd\xb5\xf1\x04\xd8\x93\x1b\x51\xdd\x8f\x41\x9f\x2d\x4c\xcb\x75\xc7\x5d\x4c\xbd\x15\xcd\xad\xba\x94\x0d\xd3\x86\xca\x18\x38\xd7\x8c\xdf\x1b\xf3\x0d\xa6\xb4\xf3\xcb\x1b\x98\x3e\x1d\x09\x14\xc5\x82\xb6\x1d\x3f\x7c\xe2\x58\x8a\x97\x77\xc6\x86\x69\x4e\x97\x8b\x14\xd0\x8b\x24\x96\x7c\x28\xa0\x5b\x57\x22\xde\x07\xdd\xd4\x03\xdc\x38\xa1\xaa\xd0\x4a\x07\xba\x47\x7f\xc3\x90\x9d\x5a\xd3\x0d\xf2\x42\xeb\x15\x44\x4e\x43\x71\xd2\x88\x85\x3b\x60\xe2\x24\xce\x80\x7d\x16\x80\xa4\x6d\xa2\x19\x4d\x0e\x9e\x9e\x06\xd8\xf4\xf9\x30\x13\x01\x75\xdb\x19\x3b\x9b\xf1\x22\x19\xa5\x0b\x69\x2e\xd2\x42\xc2\xb4\x60\xfb\x54\x12\x0f\x2c\xed\xdd\x3d\x11\x2c\x39\x8a\x49\xdb\x74\x93\xe9\xe7\x48\x57\xdb\xb6\xbd\x4c\xa2\x7c\x00\x96\x4d\x05\x5e\xb9\x2e\x38\x98\xc1\x02\x58\x8e\x2e\xeb\x0b\x30\x8f\x4d\xde\x49\x43\xc7\x8b\x2b\xd7\x26\x87\x8c\x76\x2d\x07\xe1\x03\xaf\xa6\xef\x29\x2f\x0d\x3d\x1f\xf0\x87\xe3\xf7\x27\xd3\x9d\xc9\xdd\x9f\x6e\x7e\xd8\x2f\xfd\x3c\x63\x18\xa7\xe4\x40\x33\xad\xc5\x78\xa6\x6b\xbb\x05\x43\x0c\x0b\x01\xc8\xd4\x32\x5e\xbf\xde\x8b\xc3\x9c\xd6\x38\xfd\xd1\xd9\x7a\xb5\x5b\x13\x11\x5d\xf1\x29\xe7\x84\x3c\xdf\xad\x76\x52\xe2\x8e\x30\xba\x07\x60\xde\x4d\x77\x3c\x26\xef\x5b\x7a\xf1\xf7\x59\xba\x2d\x34\xbb\x82\x98\xbd\x41\x67\xee\x3a\xdb\x86\xef\x57\x53\x3e\x43\x92\x7a\xb4\x02\x53\xc2\x1e\x57\xb3\xa9\x25\x8c\xf0\xfa\x6b\xe4\x0b\x47\x91\x6e\xec\x6e\xdd\x97\x0e\x78\xb7\xc8\x4b\x2d\xdb\x2e\x02\x5c\x23\x8b\x3f\x24\x25\xec\x6e\xf9\x97\x9e\x9f\xfd\x7a\x31\x0d\x47\x81\x18\x12\x0f\x7c\x12\x12\x76\x80\x7c\xa1\xd0\x12\x0a\x7c\x27\x04\x78\xa6\xbb\x15\x87\x2e\xc3\xcf\xf3\xe5\x0c\x5a\xba\xfc\xd7\xdf\x5f\x52\x8c\x02\x9b\x1b\x46\x19\xc0\x76\x3e\x83\xf9\x16\x1a\x5e\x2b\x26\xc5\x08\x55\xb7\x42\x87\xe4\xbb\x62\xb6\x53\xaa\x8b\x31\xf2\x8c\x81\xa6\x1d\xb9\x7b\x41\x2e\x18\x8d\xc1\xb1\x97\xee\x0e\x1c\xae\xac\xde\xf0\x23\xf3\x2f\xc8\x35\x82\x78\xa2\xa7\xc0\x20\x0c\x3a\x82\xd8\x0e\xa0\x30\x16\x9a\xfd\x6e\xec\x6d\x31\x5b\x14\x6a\xfc\x05\x85\x3f\x7f\xf3\xbb\x70\x22\x98\xc1\x6f\xfb\x6b\x48\x67\xbb\x80\xdf\x76\x43\xfe\x44\xda\xf2\x04\xce\xc0\x37\xe4\xeb\x9f\x48\x7d\x3d\x87\xd6\x37\xe4\xab\xd7\x9c\xcb\xb6\x04\x77\xbe\x76\x98\xf7\xf8\x7e\x3b\xc3\x78\x7e\x73\x87\x38\x5b\xaf\xd5\x04\xb1\x13\x83\xd9\x07\x40\xea\xe2\x39\x02\xa4\xd4\x46\x9e\xf6\x6d\xb7\xfd\x35\xdb\x43\xf2\x14\xa4\xbc\x17\x7f\x47\xf3\xa0\xa1\x44\x79\xce\x74\x29\xd6\x3b\x01\x7d\x22\xfd\x52\xa7\x78\x60\xeb\xb4\xff\x76\x46\xfe\x88\x25\xc0\xc8\x35\xc2\x5f\x20\xf1\x14\xd0\xa8\xbe\x2e\xb4\x76\xb3\x8a\x2c\x2c\x53\x86\xca\xd2\x02\x06\x62\x80\xb9\xb6\x04\x1a\xf4\xd4\x90\xb2\x5f\x78\xca\x6e\xb2\xa1\xed\xd8\xdf\xdb\xea\x91\xff\xfd\xdc\x86\xe9\xf2\x60\xd9\x89\xf8\x91\x96\xd0\xe9\xb6\xc4\xf6\xc9\xb5\xdf\x10\x04\x41\xaa\xbc\x58\xe8\xf2\x05\x01\xf1\xa4\xaf\xd5\xba\x7e\xbc\x6b\x77\x5a\xa5\x6c\xc7\x83\xe0\xdb\xc8\xef\xe3\xdf\x91\xb6\x50\x15\xb2\x1d\xe4\x77\xcc\xfd\x16\x9c\x8d\x44\x47\xbc\x4f\xba\x24\xf4\x0f\x13\x0e\x0f\x13\x2e\x4d\xa4\xba\x4f\xbe\x14\x14\x0e\x22\x1e\x2e\xdd\x24\xe1\xe7\xdf\x10\x24\xcb\xb7\x05\xa4\x5f\x14\x44\xe4\x77\xec\x2f\xec\xef\xd7\xdf\xb1\xbf\xf0\xbf\xff\xf3\x3b\xee\xfd\x8d\xff\x85\xff\x8d\x74\xfc\x9b\x88\x50\x6d\x0b\xae\x52\x04\x31\xf7\x25\x54\x33\x29\xf2\xc0\x9d\x9a\x49\xa6\xf0\xa3\x35\xf3\x3f\xb7\x68\xe6\x32\xa7\xee\xf4\x70\xc8\xc3\xe9\x14\x71\x4c\xdb\x17\x18\x3d\x8e\x11\xa4\xed\xea\x0a\xf9\x7e\x8c\x00\x2f\xfe\xe5\xce\xb0\x21\x20\xdf\x4f\x3d\xe2\x4b\x98\xd7\x3e\x94\xc7\x20\xc2\x00\x8b\x7b\x37\x4e\xcf\x61\xe8\x12\xe8\x5e\x2e\xc3\x90\x06\x38\x3d\x73\xc8\x73\x76\x8f\x56\x76\xc9\x6d\xd8\x32\xef\x6e\x6e\x43\x90\x06\xb9\x3d\x75\x92\x58\x6e\xdd\xcc\xa5\x40\x15\x2c\x0d\x67\xec\x00\xc9\x80\xf6\x02\xc8\x10\xf9\x8e\x3c\x3d\xfd\x79\x7e\x77\xad\x3b\x93\xb1\xa9\x2b\x27\x5b\x69\x67\xb2\x9e\xae\x7f\x77\x22\x7a\x0e\x96\x4e\x3c\xdf\x17\x4f\x8b\x6f\x5f\x22\x5d\x41\x24\x5d\xd3\xe7\x8e\xb7\x30\x10\xbb\xd5\xaa\x2f\x0e\x98\xb9\xcb\x78\x44\x9e\x00\x0b\xc8\x0e\xb4\x90\x15\xb0\xb6\xfa\x5c\x0b\x80\xcd\x97\xb3\xc3\x92\x1f\xd1\xe7\x0e\xd4\xa0\x15\x00\x51\x0d\xa0\xd9\x88\x3d\x03\x86\x71\x49\xc6\x31\x67\xc6\x25\x91\xcf\x38\x45\x7d\x39\x40\x5e\x4e\x7b\xb0\x6e\xb8\x55\x1d\xc1\x6e\xc7\x41\x25\x0e\xdc\x5c\x28\x64\xb1\x30\x74\xaf\x67\x8f\x38\xfa\x0c\xda\x0e\x98\x2d\x10\x77\xce\xbc\xaf\xc8\x87\x39\x87\x97\x8c\x46\x55\x45\xfb\xf5\xe8\xae\x9c\x4a\xc7\xf3\xa1\xf8\x8a\xc0\xba\x33\x43\xbe\xd5\xf1\x57\x74\x98\x77\xa1\x24\x66\x5b\x82\xb7\xfc\xca\x0c\x77\x97\xc4\x3a\x52\x2b\x89\x3d\xbe\xda\x15\x0e\xdf\xf9\xc1\xf1\x7b\x96\xcf\x16\x05\x04\x4b\x12\xe6\x66\xb5\x07\x11\x5d\x98\xe2\xae\xe9\x81\xcc\xe1\xc6\x59\x01\xe3\xf3\x53\x84\xc4\x4f\xdf\xbe\x59\x50\x93\x0d\x60\xdb\x5f\x82\xd3\xe5\xef\x55\x84\xd8\x16\x4d\x7e\x89\x99\x28\xbf\x36\xbe\x5b\x32\xbf\xa3\x73\x90\x2b\xdc\x33\x8e\xbd\xba\x70\x36\x43\xc1\x65\x53\x09\x03\xc7\xf0\x70\x70\xbf\xfd\x17\x32\x80\xa2\xe3\x3c\x2c\xbc\xbd\xf0\x20\xb3\x3d\xc5\xf9\xd3\x8c\x36\x4e\x10\xa4\xde\x17\x85\x1c\x92\x19\x26\x48\xe4\x77\xe8\xe2\x05\x3a\xe0\x0a\xdc\xfe\x43\x57\xa2\x78\xdb\xf7\x7c\xee\xb5\xba\x1d\x9e\x9d\xd9\x05\x7c\x66\x1c\x15\xe9\x2f\x5b\x5c\x51\x90\x9f\xbc\x8d\x8f\x4f\x11\xd6\xec\xd9\x71\xf8\x2d\x05\x3a\x40\x37\x6c\xe4\xcd\x36\xe7\x52\xb4\xb1\xed\x1b\x65\xf7\xea\x61\x87\x67\xa7\x87\xfd\xbe\x75\x04\x6f\x27\x9b\xc9\xa9\xbc\x30\x6c\x1f\x3b\x7c\xe0\x4e\x2d\x27\x9d\x51\x6f\x22\x0e\x7c\xec\xa3\x1c\x1a\xa0\x70\x9c\x88\x74\xf0\x87\xcd\xe4\x40\x62\x32\x97\xce\x31\x37\x05\xc7\x58\x10\x38\x89\x83\x7c\xd8\xe5\x42\x49\x0d\x7b\x30\x9d\xdd\xd7\xc0\x3e\xfb\x85\x2c\xd8\xc5\x7a\xc0\x01\xc6\x58\x36\xf5\xb9\x1d\x6e\x83\x2a\x84\xe3\x85\x69\x1a\xe1\x77\xbd\x9d\x4f\x15\x46\xcd\xb5\x77\xdb\x82\x36\xb4\x56\x51\x20\xee\x3a\xd4\xd9\x8c\xbd\x65\x92\xfe\x11\x05\xb5\xb0\x4c\xc7\x94\x4d\x23\x52\xae\xe0\x1c\xed\x8d\x05\x02\x05\x5a\xde\xf2\xc2\xbf\x6e\x2f\x65\x19\xda\xb6\xba\x34\xc6\x91\x86\xb2\x13\x1c\xe8\x06\x54\xa2\xa1\xa2\xdd\x2a\xa2\x77\x7d\xaf\x97\x45\xec\x87\x24\xe4\xbc\xf4\xd1\x26\x39\x7e\x5d\x2b\xf2\x63\xd3\x58\x2c\x8d\x9f\x95\xd6\xae\x12\xf4\xce\x34\x17\x4b\xeb\x32\xed\x85\x83\xc7\xa4\xc1\x93\x9d\x9d\x87\xd9\x66\x52\x99\x73\x7e\xaa\x2a\xa2\x14\x72\x57\xfe\xb2\x2f\x8a\x97\x01\xef\x4c\x80\x3b\xcf\x37\x97\x96\x7c\x38\xa6\x11\x91\x7a\xf6\xe1\xe4\xe9\xe9\xdb\xb7\xe8\x52\x2c\xda\x0f\x76\x1b\x6b\xf7\xaa\x73\x77\x16\xf0\xf3\x43\xd7\x0b\xbb\x90\x78\x4b\xf6\xf2\xce\xc2\x44\x92\x0d\x9c\x44\x8c\x03\xda\x1d\x8e\x8c\x03\xf1\xeb\xe0\x50\x80\xcb\x33\x9d\x09\x70\xb1\xe4\x0e\x50\x31\x14\x3d\x96\x74\x7b\x6c\x43\xc3\x80\x16\x22\x99\xa6\x01\xc1\x7c\x9f\x93\x74\x19\x8e\xe7\x67\xf9\xd7\xbf\x76\x9e\x93\x8f\xa7\x89\xc6\x81\x6c\x7d\x76\x9e\x29\x78\xf3\x64\x9b\x3e\xf4\xe4\xa7\xc7\xf5\xd8\x3b\x1b\x8c\x64\x8b\x42\xb6\x82\x7c\xfe\x7c\xaa\xc1\xff\x20\xe8\x97\x2f\x49\xa8\xc2\x86\xef\x95\xf6\x3f\x17\x7a\x4c\x81\xef\x4c\xa7\x01\xf4\x01\x85\x7b\x0c\xc6\xba\x52\xf8\x0e\xf7\x03\x9c\x2b\xfc\xcc\x42\xca\x4c\x9a\x26\x84\xdd\x93\x4b\x93\xce\x07\x3c\x26\x9b\x26\x50\xf9\x59\xf9\xf4\x4a\x61\xef\xcc\xa8\x09\xd4\x2e\x73\x6a\xd4\x80\x98\xac\x7a\x76\x26\xe4\x81\xb6\xba\xb7\xcf\x53\x96\x52\x17\x51\xbb\xd8\x9f\x50\x9a\xa5\x4d\xbc\xf1\x39\x34\x14\xf6\x48\x3a\xd4\x5f\xdc\x2a\x20\xba\x8c\x88\x2a\xd0\xfe\x91\x12\xcb\xd9\x8c\xe1\x7c\x05\x0d\x73\x01\xc3\xda\x96\xce\xc6\x2d\x78\x96\x86\x13\x71\x73\x06\x1d\x10\x71\xcb\x2d\xb5\xa2\x6e\xdb\xba\x36\x07\xce\xd2\x82\x61\x1d\x36\x8e\xfe\xf2\xd7\xdf\xc7\xb5\xcb\x7f\xff\x37\x6c\xf5\xf2\xd7\xdf\x41\x9d\xc3\x99\x19\xd1\x0c\x3b\xe2\x9a\x9b\x73\x18\xbb\x16\x3a\xe2\xba\x44\xb3\x93\x4c\x9f\xc1\xb1\x64\x2e\xe7\x8a\xd7\xb1\x66\x2d\x30\xd7\x60\xb0\x1a\x3b\x4f\xad\xae\x26\x5c\x6c\x1a\x54\x92\xcb\xad\x5d\xef\x4f\x57\xf6\xde\xb6\x3f\xc2\x95\x26\x44\xf8\xee\xe6\x9d\x97\x4b\x38\x1d\xd6\x16\x3a\x31\x7d\xd2\xd3\x8e\xd4\x69\x97\xf4\xba\x3a\xe2\x71\x42\xa4\x3c\x3c\x17\x2b\x54\x6c\xfd\x91\x46\xc8\xc8\x4c\xfb\x30\x31\x53\x9f\x3f\x8c\x15\x34\x21\x2d\x84\x8b\x9a\x03\x0e\x40\x54\xd3\x4a\xd8\x2d\x42\x72\x7c\x87\x4f\x10\xaf\x24\xb6\x85\x56\x07\x29\x89\x9d\xfa\xd9\x8e\x91\x97\x45\xdb\xc8\x67\xec\x05\x79\xc2\xd0\xfd\xe7\xe9\x05\xc1\x5f\x10\xf4\x05\x79\x7a\x8a\x66\x27\x6e\xc7\xe6\x5a\x96\x82\xbb\x36\x7b\xb6\x9e\xb0\xb1\x3e\xd7\x1d\x1d\x18\x63\xff\x04\xcd\x1f\xf6\xbb\xf1\xf4\x82\x3c\xe1\x28\xc6\x7d\x45\xe9\xaf\x28\x81\x60\xec\x37\x9c\xfd\x46\x32\x7f\xa0\x04\x4e\x72\xf4\x33\x8a\xbb\x4c\xa7\xc2\x8e\x8f\xfd\x27\x23\xce\x66\x44\xda\x8e\x1d\x53\x57\xe2\x29\x71\x34\xc5\x5c\x43\x89\x18\x2f\x6d\x78\xc8\x50\x63\x7d\x7e\xf1\x34\x46\x2c\x3d\x92\x44\x49\xf6\x1a\x7a\xe4\x18\x28\xca\x38\xd8\xd3\x8a\xa5\x41\x91\x14\x81\x5f\x43\x83\x1a\xfb\xf9\x70\xbf\x32\xf7\xf6\x42\x63\x49\xd0\x04\x8a\x5f\x25\x06\xbd\x27\xb1\x8b\x7e\x29\x48\xb0\x24\x46\x5d\x43\x82\x19\xcf\x4c\x45\x57\xb7\xe9\xa5\x60\x31\x1a\xbf\x8a\x04\x7b\x26\xc5\xee\x08\x74\x0a\x3a\x0c\x49\x13\xd7\xd1\x71\x27\x1d\x68\x9a\x05\x35\xe0\x98\x56\xbc\x4d\x71\x28\x86\x72\xd7\xa0\xe7\x3c\xf4\x7e\xbf\x73\xbc\x51\xac\x78\xec\x38\x83\x5d\x35\xd5\x18\xea\xa1\xdf\xcd\x82\x57\xe5\xc6\x13\xa0\x38\xe6\x2a\xed\x60\xd8\x29\x81\x43\xd9\xe4\x06\x80\x78\x42\x1c\xcd\x5d\x27\x09\x7e\x36\xd1\xbb\x42\xd5\x7f\xe8\x36\x8e\x12\x86\x32\x14\x79\xd5\x8c\x60\x84\x2f\xce\xa1\xbc\x8f\x9d\x71\x0c\xc3\x19\xfa\x3a\x49\xc8\xb1\xaa\x6f\xf6\x0f\x20\x98\x33\x63\xac\xea\xd0\x88\x0d\x8d\x18\x46\x61\xd8\x55\x41\x18\xa3\xf6\xfb\x2e\xfb\x7e\xf8\x26\x41\x0c\x9a\xb9\x2e\xcc\x63\xf4\x58\x9f\x6b\xd0\x76\xc6\x97\x1d\xf7\x04\x52\x0c\xc7\x5e\x37\x23\xcc\x59\xaa\xf7\xb6\x36\x40\x7c\x32\xc1\x70\x14\x25\xc8\x1d\x91\x88\x5c\x1b\xbb\x4f\x7f\x6d\xb2\xbd\xd8\xab\x3f\x5d\x04\x14\x32\x83\x42\xb3\xdc\xef\x55\xfb\xf5\x61\x31\x5f\xed\x75\x2a\xfd\x1e\x95\x2f\x14\x79\xa2\x2a\x0e\x87\x78\xb9\x59\xa9\x31\x75\xbe\xcc\x77\x85\x66\xbe\x4b\x57\x1b\xd9\xb6\x90\xef\x0d\xea\x62\x50\x43\x91\x44\x70\x97\x48\x76\x50\x29\xd0\x2d\x91\xac\x8b\x25\xa1\x91\xad\x89\xf9\x0c\x43\xe0\x3c\x49\xd0\x23\xaa\x21\xe6\xda\xad\x6a\xa1\x5f\x61\x0a\x99\x6a\xb6\xd6\xac\x96\xf2\x75\xb2\xcd\x08\xc3\x7e\xaf\x9b\x9a\x08\xe1\x11\xc1\x89\x66\x1e\x2f\x76\x05\x0a\xe7\x6b\x83\x6e\xbe\x5b\x24\xf8\x61\x99\x1f\x0c\x0a\x83\x41\x0f\xef\x15\x07\xc3\x61\x8b\x16\x86\x03\xa1\xd3\xa8\xe4\x06\xa3\x36\xdf\xa7\x99\x41\x9d\x4c\x4d\x84\xf4\xd4\xd5\x6a\x0c\x8b\xa5\x2a\x9e\x2d\x11\x79\xb1\x49\x66\x06\xd5\x7c\x4d\xcc\x55\xf3\xe5\xae\xd8\xe8\xe2\xc5\x21\x31\xaa\xe5\xdb\xc5\xba\xd8\xcd\x0a\x75\xbe\xdd\x67\x9a\x59\xa6\x3e\xc0\x8b\x4f\xb7\x9e\x2b\x71\x97\x99\x09\x73\xbd\x3b\x8b\x77\x3c\x46\xfb\x87\x0d\xe3\xcf\x5c\xbc\x20\xe4\x0b\xe2\x58\x4b\x98\xc2\x02\x2f\x4f\x53\xdc\x6c\x7f\x7e\x15\x74\x6a\x7d\xb2\x05\x15\xdd\x19\x03\x63\x31\x01\xf3\xe5\x8c\x74\x7d\xa6\xdb\xce\x3d\xdd\x39\x9d\xb7\x9c\x1f\x78\x88\x9e\xcf\x6a\xb6\x17\x04\x4b\xab\xe5\xb0\xe3\x03\xb7\xaa\x79\x7f\x84\xe0\x44\xcf\x38\x46\x32\x24\x4b\xa2\x14\xc3\x78\x4c\xb9\x3e\xf9\xdf\x4f\x7e\xa2\xfa\xf4\x0d\xf9\x44\xa1\x7f\xec\x2a\x81\x4f\x2f\xc8\xa7\xe3\x21\x15\xf7\x5e\xb7\x9d\x3b\x5e\x74\x6b\x7b\xf7\x62\x70\xde\x8e\x10\xfe\x61\x15\x17\xe6\xd6\x09\xfc\xf4\xbf\x51\x1e\x19\x94\x0c\x0f\x48\x86\xbf\x20\xc4\xff\x19\xc9\x30\xc6\x4d\x46\x0c\x81\xb3\x58\xe8\x9c\x61\xe8\xbf\x53\x34\x22\x20\x5a\xc8\xa4\xfd\x5b\x45\x73\x27\x0a\x67\x59\x92\x43\x29\x8e\xa5\xfc\x59\x43\x3d\xd9\x0c\x7d\xa6\x7b\xa2\x71\x38\x4e\x10\x0c\x8e\x12\x34\x4b\xfd\x41\x32\x0c\xc5\xa2\xcc\xbf\x4a\x46\x7c\x2f\x23\x86\xa2\x7b\xcb\xfc\x3f\x28\x23\x4b\xb1\x1c\x47\xb0\x34\xcb\x79\x22\xfa\x12\xda\x0e\xb0\x1c\x7d\xae\x8d\x25\x60\x80\xb9\x0c\x83\xb6\x9a\x9a\x00\x79\x4e\x20\xad\x0b\xec\xb5\x34\x07\x8e\xbe\x82\x37\xcb\xe3\x7a\xa0\x2f\xd0\x1a\xea\xda\xc4\xa5\x87\xbd\x20\x9f\xfc\x04\x33\x9e\xc2\xad\xaf\xe5\xdb\x96\x6c\x57\x05\x02\x8f\x2b\x12\x67\x76\xce\xf2\x83\xb4\xbc\x23\xf0\xa3\xb5\x1c\x90\x27\xa5\x96\x7f\x42\x4c\xf2\xb9\xa2\xd9\x9d\xbb\xfe\x28\x2d\xfb\x04\x7e\xb4\x96\x03\xf2\xa4\xd3\xf2\x8d\x35\x8e\xcf\x55\xc2\xd2\x2d\xec\xc4\xe3\xad\x4b\xb7\xfd\xa9\xc7\xbd\xb0\xd4\x0b\xf2\xa4\x00\x56\x92\x24\x96\xc1\x15\x06\x55\x71\x5a\x86\x18\xad\x50\x18\x4a\xb2\xb8\x82\xab\x34\x86\x31\x24\x43\x51\x38\x8b\x13\x80\x52\x49\x45\x66\x31\x00\x38\x52\x05\x2c\xca\x29\x2a\x09\x58\xd6\x5d\x4b\x2b\x90\x62\x68\x5a\x82\x14\x49\x29\x9c\x2a\x73\xac\xcc\x4a\x0a\x4a\xcb\x34\x4a\x48\x90\xe5\x68\xa0\x92\xaa\x0a\x51\x8a\xc6\x21\xed\x21\x01\x12\x44\x31\x49\xe1\x38\x85\xa1\x30\x16\xf7\x97\xb2\x58\xa0\xa0\xa5\xbf\x11\xec\x37\x1c\x0d\xd6\xb9\xbb\xcb\x7f\xd0\x04\x45\x33\x58\xe2\x5d\x7f\x05\x47\xd0\x24\x8b\xbe\x20\x18\xed\xce\xe7\xc5\xe7\x05\x61\xdc\xff\xb0\xdd\x7f\xfb\x8b\xd8\xe1\x0f\x97\x35\x9e\xe7\xf9\x2c\x47\x0d\x46\x16\xd5\x1d\x8c\x5e\xcb\x6f\xa5\x55\x53\x2a\xf0\x0c\x5d\x06\xab\xce\x2b\x99\x1f\x2e\x25\x94\x28\xbd\x3f\xf3\x12\x3e\xc2\xb0\x42\x96\xad\xe6\x4a\xa6\x36\xe8\xe5\xfb\xd9\x2e\x96\xe9\xe6\x25\xec\x63\xc5\x49\x62\x19\x67\x71\x4d\xb5\x4b\xf9\xad\x99\x27\xd0\xd5\x64\x4b\x34\x4b\x2e\x6a\x7e\xd0\xe8\xd5\x5e\xf9\xe3\x67\xbe\x28\x8a\xb4\x85\xf6\x33\x6c\x65\x20\x81\x42\x4e\x6a\x13\xa0\xa1\xe4\xf3\xb5\xf2\xe8\x79\x6b\x6d\x25\x21\xbf\x18\xbd\xc9\xb9\x26\xff\x8a\x7e\x8c\x26\xb9\x7e\x41\x6a\x16\xa7\x4e\x79\x30\x2c\x29\xdd\xe1\xd0\x24\xb8\x55\x9b\xef\x2d\xf0\xf2\x9c\x61\x96\x9d\xde\xd6\x40\x33\x83\x92\xe0\x61\xee\x8a\x64\x15\x7c\x2c\xf0\xe6\x09\xb5\x0a\xcb\x87\x7c\x46\xfc\x00\x23\x9b\x3c\x9f\x43\xcb\x61\xb7\x7f\xe9\x8f\x6f\x54\x68\x84\xdf\x07\x5d\x81\x7c\x8c\x19\x3f\x41\x96\x51\xa0\xa2\x30\xa4\x84\x49\x98\xc4\xa9\x98\x8a\x43\x46\xc6\x00\x4d\x31\x9c\x8c\x71\x24\x8a\x32\x90\x26\x19\x1c\x47\x01\xae\x32\x32\x03\x70\x9c\x61\x59\x54\x55\x31\x86\xc1\x64\x92\x8b\x71\x05\x8c\x8b\x34\x76\x9a\xe0\xa8\x68\x57\xd8\xdf\xf5\xd7\xc5\x34\x87\xb1\x64\x8c\x2b\xd0\x29\x5d\xe1\x79\xc2\x31\x8a\x52\x2d\x6c\x96\x6a\x71\x4b\xb1\x85\x59\x8f\x5a\x8f\x9a\xbc\x3a\x6b\x6d\x4b\x95\x2a\xb1\xa1\x4b\x73\x9d\x7f\xdd\x28\x9b\x4d\x59\xef\xa3\x82\xf6\xd6\x6c\x74\xb3\xfc\xb3\x9c\xcd\x7d\x34\xaa\x24\xa6\x56\xca\x65\x5d\x98\x0e\xcc\x5c\xbb\x38\x9a\x17\xdb\xc5\xe5\x00\x35\x0c\xd2\x9b\x3a\xd7\x15\x9e\xd7\xc7\xa9\x64\x39\xd0\x18\xe9\x1a\xaf\x3d\x97\x6a\x1b\x4a\xae\x29\x85\xca\x66\x3d\x30\x25\x61\x92\xef\x8d\x78\xbd\x58\x97\x5a\xea\x90\x54\xb7\xfa\x47\xb1\x82\x6b\x2a\xb7\xa8\x28\xa6\xd5\x57\x57\x50\xe9\x8c\x5e\x25\xa7\xa0\xcd\xdf\x89\xd7\xfc\xc2\x92\x88\x22\xc5\x8f\x2a\xd0\x51\x19\xa3\xaa\xb9\x98\x9b\x21\xae\x50\x1e\x86\x99\xd3\xff\x3f\xae\x40\x3c\xc6\x8c\x9f\x58\x86\x65\x64\x86\x61\x49\x99\xe2\x38\x95\xc4\x00\xab\xe0\x8c\x84\x12\x40\x21\x48\x9a\x91\x58\x95\x46\x09\x82\xa3\x24\x4e\x66\x19\x85\xe1\x14\x77\x41\xcf\x92\x38\xa9\x62\x0a\x27\xa9\xfb\x5d\x43\x3c\xd4\x15\xd8\x48\x63\x67\x18\x9c\x21\x63\xef\x52\x4f\x87\x3a\x0a\x63\x59\x36\xc6\x15\xa8\x94\xae\x40\xc2\xe2\x86\x98\xd4\xfa\x23\x2e\xf3\x2e\x96\x19\x9e\x46\xd1\x11\xf3\x86\xf3\x1f\x86\x34\x2f\xa9\x83\x79\x53\x34\x27\xd9\xce\x06\x97\x58\x7e\x43\xf5\x2b\xf4\xaa\xa0\xd1\x6b\x02\xaa\xa5\x05\x2e\x67\x96\x20\x57\x2d\xc9\x8d\x12\xfa\xf1\x9e\x97\x3f\x08\xf5\xa3\x4c\x94\xea\xca\x47\xd1\xf4\xa6\xce\x73\x05\xed\x38\x95\x22\x46\x80\x67\xa2\x60\xcb\xab\xd9\x6b\x16\x7b\x1b\x15\x3b\x8d\xa2\x48\x16\x1b\x6b\xaa\x88\xf7\x15\xe1\x03\x9f\x16\xa6\x5d\x7d\xc3\x3c\xe7\xb7\x5a\x79\xa4\xe1\x9b\x81\xd9\xa4\x5b\x43\x11\x64\xc0\x7a\xf3\xda\x94\xe9\xee\xec\xb5\xf2\x5c\xaa\x54\xfb\x70\xda\x29\x49\x59\xa7\x4b\xaf\x29\xcf\xfa\x6b\x21\xae\x50\x44\xc3\xcc\xe9\x5f\xee\x0a\x78\x7a\x57\xc0\x1f\x63\xc6\x4f\x34\xa1\x70\xac\x4a\x11\x34\x84\x34\xab\x60\x12\xce\x48\x94\xc4\x72\x2a\x4e\x00\x95\x22\x30\x4c\x62\x28\x9a\x03\x38\xa9\x02\x15\x23\x5d\xd4\xa8\x44\xe1\x12\x4d\x10\x12\xca\x48\x90\x73\xdd\x89\xf0\x17\xbe\x97\xae\xc0\x44\x1a\x3b\xcb\xb1\x6c\xf2\x5d\xbf\x74\x23\x29\x0e\x8f\xf1\x04\x22\xa5\x27\xe0\x8d\xd1\x1b\x26\x2e\x29\x13\x95\xca\x4c\x9f\x9c\x6f\xeb\xab\xee\xa6\x40\xf4\x16\xe6\xf4\x79\x95\xe7\xeb\x4e\x16\xab\xe0\x35\x26\xc3\xd0\xa3\x06\x21\x09\x1d\x2c\xd3\xec\xd7\x99\x15\x4e\x19\x15\xad\xf5\xba\xa4\x1d\x71\x3a\xea\xbc\x6e\xba\xd4\x7b\x53\x24\x50\x73\xd2\xc8\xd1\x59\xdf\x11\x7c\x4f\xf0\x8c\xb3\x74\xf8\x8f\xf7\xbe\xdb\xc7\xef\x6b\xbe\xd1\x9c\xfa\xf0\x9d\x59\x1b\xab\xce\x60\x47\x06\x1a\xbd\xd0\x59\xac\x34\x01\xf5\xc2\x73\x6d\xb8\x01\x04\xa9\x81\xf5\xdb\xdc\x6e\x65\x08\x6b\xd5\xd6\x84\x8f\x49\x76\x52\x59\xd6\xc5\x6d\x9d\xb4\xf4\xad\x38\xa5\xa7\xda\x50\x07\xf6\xab\xea\xd0\x93\x67\x82\x6e\x35\xa4\x45\x25\x2f\x14\x67\x2b\x0d\x78\x49\xa9\x14\xe2\x29\x82\x1d\x66\x6d\xff\x72\x4f\x21\xd2\x7b\x0a\xf6\x18\x2b\xf7\xce\x67\xb9\x25\xa4\x5b\x74\x61\x1c\x83\x7e\x45\xb1\xaf\x28\x86\xa0\xe8\x37\xef\x5f\x94\x35\x33\x28\x41\x45\xaf\x80\x0e\x77\x49\x9c\x23\x39\x9a\xc1\x39\x3a\xc6\xd6\xc3\x2d\xdd\x67\xe9\x9f\x9e\x94\xe8\x4f\x66\x50\xd1\xc9\xed\xeb\xb6\x5d\xc9\x30\xb9\x79\x8e\x2b\xe2\xe8\xe6\x2d\xf3\x6c\xa3\x9a\x63\xaf\x4b\xeb\x0f\x6c\xa0\xb4\xfb\x43\x90\x29\x83\xbc\x97\x4e\x84\x10\x23\x0e\xff\xec\x8d\x98\xe7\x33\xd3\x9f\x20\xc8\x43\x3f\x4f\xbe\x31\x25\x97\xd9\x29\x9e\x80\xba\xb5\xea\x8e\x38\xd8\x16\xb5\x7f\x82\x47\x78\x5c\x02\x9a\xe0\x66\x05\x76\x1b\x9a\x8b\xf6\xf9\x6d\x68\xc8\x00\x1a\xe2\x36\x34\x54\xb0\xe3\x7d\x1b\x1a\x3a\xd0\x54\xbe\x51\x28\xe6\xbc\xcf\x49\xde\x86\x85\x0d\x34\x67\x6f\xc3\xc2\x05\xba\x81\xb7\x61\xc1\xd0\x73\x34\x37\x8a\x84\x05\xba\x66\xb7\xa2\xc1\x03\xcd\xc4\xc7\x3c\xbc\xf7\x90\xad\xd7\xf8\x93\xa5\xae\x7d\xa5\xdd\x8b\x8d\x78\x86\xed\xee\xe8\x72\x12\x0a\xce\xc2\xc9\xe1\x0b\x7d\x68\x2d\xfc\xf7\x93\x63\xde\xd5\xb8\x7c\x41\x3e\xa9\x96\x39\xbb\xab\x91\xff\x82\xfc\xc2\xfb\xa8\x3f\xe0\x50\x49\xc8\x44\x9d\xef\xc1\x1e\xbe\xa0\x97\x13\x75\x87\x92\x8f\x13\x75\xa3\x36\xce\x26\xea\x97\xdb\x3b\xfd\x01\x27\x73\xc2\x66\xea\x2c\x0b\x1d\xbe\x90\xde\x34\xd1\xe9\xf6\x27\x1d\x6b\x69\x3b\x10\xde\x3b\x17\x1e\x1a\xd3\xba\xd7\x7f\x7f\x8d\x99\x7b\xf0\xe9\xb0\xc8\x99\xdb\xef\x26\x1f\xbe\xa0\xff\xf0\xcc\xdd\x13\x35\x7f\x89\x99\xfb\xf1\xd1\xf1\x74\x95\x74\xf8\x9b\x3d\xd9\x63\x54\x97\x73\x65\x27\xcb\x8d\xc7\xe6\x3c\xbd\xf8\x87\xd7\xee\x9d\x95\xe4\x0d\xcf\x3b\x8f\xf7\x5d\xa3\xb5\xdd\x72\xee\xf0\x37\xf9\x63\xb5\x76\xbb\x4b\xfc\x5a\x5a\xf3\x97\x9d\x87\xbf\xd1\x1f\xaa\xb5\x3b\x62\xf7\x0f\xd7\x5a\xc2\x12\x36\xe4\x37\x03\xd2\x2c\x5f\x93\xb1\x26\x3f\x3e\x7d\xeb\x32\x39\xf2\xb1\xab\xd0\x32\x9c\x8e\xae\xcb\x12\x11\xe1\xc1\x35\xf7\xad\x88\x88\xc0\x9a\x30\xaa\xc6\x4b\x44\x44\x06\x10\xdd\x2c\xda\xc5\xda\xe7\x56\x44\x74\x20\x15\xdf\xcc\x11\x73\x9e\x1a\xa2\x0a\xcf\x44\x3c\xec\x39\x9e\x9b\xf9\xe1\xce\x83\xee\xcd\xfc\x9c\x15\xe6\xe4\x1d\x73\x8f\x05\x02\xda\xed\x1c\xe1\x81\xc8\xf8\xa8\x5f\x03\x78\x48\x79\x9e\xf4\x3c\xe4\x35\x05\x7a\xe4\xe3\xf0\x0f\x88\x3d\xa7\x8f\xf0\x49\xb4\x22\x53\x2a\x49\x43\x85\xc5\x48\x94\xe2\x28\x59\x55\x49\x89\x90\x58\x59\x02\xb4\xc4\xa8\x32\x2a\xc9\x28\x8b\x62\xaa\x82\xe3\x38\x24\x65\x06\x63\x24\x8e\xe4\x18\x08\x29\x19\x2a\xe8\xd3\x0b\xe2\x1f\x6b\xbb\x7d\x2d\x76\xb2\xf9\x43\xee\x9b\xde\xd1\xe7\x69\x58\x32\x7a\xd7\x75\x7f\xf7\x2c\xf2\xf9\xdd\xf2\x0a\xfd\x06\x75\xe2\x6d\x66\x96\xd8\x4e\xc1\xc8\xbd\x42\x4d\x26\x98\xc6\xc0\x29\x56\x2a\x1f\xfd\x1e\xbb\xee\xe9\xa3\x0c\xc8\x2e\xa9\x2a\x55\xe3\xbd\x6e\x33\xbf\xdf\xcd\xc9\x06\x9a\xb9\x99\xe3\x9f\xfe\x41\x16\x69\xa6\xcd\xb0\x1e\xae\x68\x54\x0f\x9b\xbd\x63\xd0\xa8\xc9\x05\xcc\xd9\xbc\xb5\x87\x95\x11\xb7\x16\x34\xb3\x9d\x01\xb0\xcf\x76\xf5\xbc\xb7\x87\x94\xe9\xf5\x44\x7f\x20\x9f\xc5\x96\x19\xa5\x68\x76\x96\x5a\x6d\xd5\x74\x72\x4c\x66\x52\xaa\x12\x22\xe4\x94\x5e\x43\x2d\x94\x9e\xcb\x3a\x55\x5e\x75\xeb\xcf\x23\xde\x61\xfc\x73\x08\xca\x47\xbf\x7b\xc2\x4a\xe1\xc0\x6f\x33\x2f\xd5\x51\xc7\x51\x5e\x57\x85\x82\x6d\x51\xec\xb4\xb8\xa8\xd8\x99\x69\x1d\x6b\x81\xea\x82\xdf\x08\xf5\xb7\xd7\x01\x95\xe3\x08\xa1\xa2\x0e\xa8\xcd\xa6\xb8\x58\x16\xf4\x2e\xd7\x30\xca\xf5\x2d\xf6\x0a\x8c\xa2\xc8\x4d\xe5\xfa\xc6\xa9\x88\xca\x6a\xc5\x7c\x64\x27\x85\x56\xa3\xf5\xda\x64\xbf\x3f\x9d\xee\x36\x14\x4e\xba\xf4\xcd\x30\x7d\xf0\x47\xf8\xe3\x16\x59\xce\x03\x3a\x19\x6a\xbd\x8b\x74\x15\xd6\x81\xf6\xb6\xa9\x81\x6e\x83\xa3\x33\x1f\xaa\xcd\x41\x54\x36\x2d\x71\x34\xf8\xc8\xf4\xcb\xd3\xbc\x59\x61\xa6\xab\xa9\x2f\x74\x9d\xb2\xca\xf5\xe3\x7c\x64\x02\xf4\xcf\xe6\x22\xe4\x93\x79\x30\xfd\xec\x4d\xf4\xbd\x3f\x6b\x07\x7d\xf8\xe3\x33\x4b\x90\x95\x7a\x83\x11\x9e\x33\x06\x7d\x60\xf5\xe8\xee\x66\x2d\xf5\x89\x82\x58\xd6\x16\x73\x82\x6f\x67\x27\xa5\xfc\x82\x92\x36\xed\x52\xdf\xdb\x2d\xc9\xf7\xba\xe8\x8e\x70\xb5\x4f\xe6\x51\x38\xa9\xd3\xfc\x96\xcb\xa2\x0d\xbb\x20\x68\x2b\x19\x63\x30\xac\xcb\xb1\xc3\x37\x72\x56\x9d\xce\xb8\x26\x43\x4d\xb3\xc4\xea\x84\x95\xd7\xc3\x67\x1d\xc6\xb3\xf7\x3d\xff\x8f\xf0\x97\x21\xc4\x51\x33\x89\xbf\xda\xf1\xa2\x47\x26\xbb\x34\x09\xd3\x21\xa9\xf7\x6c\x43\xd8\x2c\x9a\xaf\x84\x59\x14\x9f\x3f\x30\xa6\xb5\xd5\x6d\xcc\x50\x6b\xf9\xe1\xac\xd9\xd7\xac\x65\xfb\xb9\xc3\xdf\xc9\x5f\x6e\x09\xb6\xda\xb5\xfa\xfb\x89\xfc\x25\xea\xef\xfb\xd1\x37\xb5\x80\x2d\xf2\xb7\xf0\xca\x33\x33\x7b\x26\x1f\xf1\x09\x7c\x20\x16\xf0\x47\x3d\x84\x7d\x4e\x74\x75\x33\xfd\x29\x79\x1b\x7d\x5f\x17\xff\xed\xd9\x4c\x1b\xc7\x88\x67\x76\x08\xb6\xab\xf9\xb6\x09\xa7\xef\xeb\x42\x93\xe9\xe5\xcd\xe5\x34\x27\x34\xe9\x06\xa7\x4e\x1b\x84\xdc\x5c\x70\xea\xbc\x28\xc0\x19\x09\xca\x1d\xf4\xb9\x3b\x65\xaa\x03\xee\xbd\x2b\x13\x78\x6b\xcd\x14\x50\x13\xc3\x9f\x5f\x57\xb5\x8a\x30\x12\xb8\x22\x97\x5b\x7f\xff\xee\x15\x3e\xde\x0f\x80\xec\xb7\x92\xfd\xff\xdd\xc4\xef\x25\xb8\xe4\xd5\xcf\xe9\xa3\xdc\x0c\x41\xab\xa8\xc4\xd2\x9c\x02\x51\x95\x21\x01\x05\x15\x46\x65\x15\x9a\xc2\x39\x8e\xe4\x70\x82\x85\x12\xaa\xa2\x24\x8e\xa9\x84\x2a\xe3\x92\x24\x93\x04\x8b\xb2\xa4\x8a\x63\x32\x8b\x52\x94\xff\x1c\x1c\x76\x4f\x87\xf2\x24\x43\x13\x49\x19\x9a\x26\xb1\xb8\x43\x80\x24\x46\xe1\x4f\x81\x4a\xe0\xe9\x16\x8b\x3f\xc9\xd0\xc1\x59\xbf\xc8\xd0\x57\x46\xfc\x7b\x32\x34\x33\xb3\xcd\x13\x56\x8a\x07\x7e\x9b\xb9\xb7\x4c\x9b\x5f\x1a\x15\x99\x73\x5a\xef\x05\xed\xb9\x3e\xed\x49\x95\xc6\x07\x69\x1a\xad\xe6\xb0\x0b\x57\xdb\xac\xba\x42\xab\xbc\xf1\x2e\x0d\x0a\xf4\xb6\x21\x2d\x5a\x68\xa6\x45\x9b\xcc\xcc\xd2\x67\xad\x19\x5b\x27\x7b\x66\x2b\x53\x28\xf1\x9d\x66\x86\xc4\xc5\x7a\x5f\xce\x7f\x28\xcd\xf5\xe3\x32\xf4\x09\x90\x23\x69\x83\x16\x2d\x30\x66\xae\x8a\x56\x9b\xcf\xeb\x61\x3b\xcb\x7d\x0c\x56\x83\x5e\x87\xd8\xe8\x0d\x7d\xb8\x6c\x4b\x58\x6e\x35\x6b\x56\xa1\x7f\x5e\xd7\xcd\x90\xf3\xe3\x7c\x44\x7c\xd2\x64\xc8\x87\xd0\xbf\x8c\x02\x29\xe8\x5f\x44\xc5\x9f\x1d\xc1\x7d\x56\xd2\x64\x98\x5f\x34\x03\x86\x66\x98\x93\xd5\xf3\x1d\xbe\xa4\x45\x4d\x5d\x62\x86\x11\xee\xa3\x7f\x9a\xe1\xae\xa1\xbf\xcb\x30\xf5\x5a\xbe\x94\xa5\xbb\x8b\x0f\x1c\x2b\x98\x20\x47\xd2\xad\x9e\x6d\xbe\x36\x74\xbd\x97\xcf\x4c\x5a\xf4\x6b\xa9\xfc\xfc\xda\xb4\xb3\xfd\x85\x23\x4b\x56\x89\x5b\x1a\xc5\x66\xbe\xf8\xfe\xb6\x04\xcb\xca\xa8\x20\xad\x99\x49\x7f\x22\x08\x43\x2d\x23\xf2\xc5\xb7\x21\x4a\x8d\xd6\x03\x11\xcb\xf1\x8f\xce\x30\x2c\x86\x61\x1c\x2e\x13\x2c\x4d\x12\x8a\xca\x10\x32\x8a\x51\x80\x02\x98\xc2\x30\x12\x8b\xe2\x8a\xaa\xa2\x94\x42\xaa\x14\xaa\xca\xb4\x82\xa1\x2c\x46\x03\xc0\x50\x32\x0a\x68\x0c\xe5\x54\x0e\xf8\x67\xb4\xee\x7a\xce\xfe\x9a\x0c\xc3\x30\x24\x1b\x9d\x61\xdc\xbb\xf8\x53\xa0\x45\xe4\x5b\x65\x81\x32\xcb\x4e\x4f\x99\x0f\xeb\x3d\x65\xf4\xee\x0c\x16\x9d\x62\xc6\x91\xe4\x21\x3a\xcb\xce\x54\x39\x53\xaa\x08\x5a\x7f\x6e\xac\xf2\xa5\x09\xe0\x53\x67\x18\xef\x98\xf6\x6d\x19\x83\x38\x3a\xd3\x11\x5f\xfe\x40\xbf\xd9\x30\x34\xa6\x50\x9d\x94\x35\x74\xc3\xbc\x2d\xf8\x35\x26\xac\xe9\x22\x3e\xc8\xd3\xdb\x56\x69\xa6\x96\x4b\xeb\xbc\xba\x41\x39\x71\xa9\x53\x92\x53\x2f\xf3\x79\xb8\xce\xf3\xa2\x5a\x07\x7c\x86\xcd\x37\x47\x06\xb5\x20\x78\x4a\x23\xa6\x74\xae\x98\xd3\x35\xb5\x2b\x76\x73\x18\xad\xc9\x69\x32\x46\xe1\xd4\x94\xa3\x32\x06\x7f\x72\x36\xfe\xca\x1a\xf8\x21\x19\xe3\x81\xf4\x6f\xcb\x18\x1e\xfd\xe0\x3a\xfa\xda\x9a\x29\x74\x1d\x7d\xf9\x89\x8f\x72\x8f\xa6\x7f\xc5\x3a\x9e\xe7\x7f\xdd\x9a\x36\x29\x23\xdd\xa2\xab\xbb\x33\xd2\x03\xe7\xea\x1a\xfa\xbb\x8c\xf4\xdc\xcf\xd9\xc3\xa5\x30\xcb\x75\x8a\xcb\xfa\x34\x97\xeb\x76\x72\xa6\x3a\x92\x07\x56\x59\xd0\x47\xec\xf4\x8d\xef\xbd\x16\x3b\x28\x4e\x57\x8d\x25\x4a\x4e\xf9\x1e\xc3\x77\x79\x8c\xa5\x4c\xbe\xb8\xee\x65\x66\x83\xd9\x5c\xce\xcd\x72\xb0\x63\xd6\xe4\x7a\x25\xc3\x35\xb1\x66\x63\xf0\x9e\x79\x78\xcd\x23\x29\x24\x4b\x2b\x92\xa2\xa0\xb8\x42\xd2\x28\x8b\x31\x34\x83\xc9\x24\xa0\x00\x03\x39\x85\x86\x2c\x4d\xc9\x00\xe7\x64\x89\xc4\x20\x8d\x2b\x0c\x00\x2a\x83\x02\x5c\x85\x90\x92\x08\x5a\x81\x7e\x46\xba\xeb\x47\x59\xae\xcb\x48\x0c\x15\xf7\xb4\x87\x7f\xf7\x6c\xaf\xe1\xde\xae\xe4\x4f\xcc\x48\x27\x5d\xc6\x0c\x37\x9d\x55\xfa\xf8\x3b\xb1\x62\x9a\xea\x96\x6d\xd4\xe0\x54\x90\xb0\x4e\xa7\x44\xe9\x9b\xf7\x69\x09\xcd\x98\xda\xc0\xaa\x3b\x8c\x56\xc7\x68\xbc\x29\x4d\x27\xb8\xd2\xee\x74\x55\x98\x33\x57\x32\xda\xe0\x81\x3a\xc9\x0d\x36\xce\xa4\xc7\x1b\x76\x75\xf9\x66\x64\x66\xdb\xb7\x0c\x3f\xfc\x21\x19\xe9\x96\x2e\xdf\x23\x33\xd2\x9d\xf4\x1f\x98\x91\x1e\xd2\xd9\xb9\xfc\xa4\x8e\x72\x3f\xbb\xb3\xc4\xf3\xbf\x6e\x0d\x97\x58\x23\xdd\xa0\xab\x47\x66\xa4\x7b\xe7\xea\x1a\xfa\xbb\x8c\x54\xc4\xdb\xc3\x85\x04\x2c\xf8\xea\x64\x5e\xab\x6b\x76\x43\x37\x5b\xab\x9e\x58\x7b\x9b\x55\x0b\xef\xcd\xb7\x66\x41\xcf\x40\x9b\x26\x96\x3c\x33\xb0\x46\x99\x65\xbb\x38\xc2\xca\x62\x8b\x23\xeb\x3a\xf7\xd1\x64\x33\x8b\x67\x41\x54\x0b\x78\xbe\x9b\xed\xaf\x97\x74\xbd\x5b\x90\x2a\x35\x21\xa3\x3d\x3a\x23\xe1\x04\x43\x42\x37\x1d\x70\x12\x07\x55\x46\x91\x00\x07\x28\x45\x22\x08\x82\x93\x18\x56\x55\x00\xab\x12\x24\xc3\x30\x12\x06\x54\x82\x90\x00\x49\xb3\x40\xa1\x64\x54\x51\x39\x92\x56\x48\xc5\x7f\xe2\x0b\xbb\xe7\x44\x84\x7f\x1e\x33\x36\x11\x71\x28\x4a\x44\x97\x46\xfb\xbb\xa7\x7b\xcc\xbb\xca\xa8\xca\x16\x9b\xab\xe6\x54\xaa\xe0\x45\x9e\xe8\xf7\xde\x5a\x56\x65\xf6\x36\x40\x51\xb5\xc0\xda\xd5\x12\x33\x43\x85\xd6\xba\xdc\x7f\xe5\x07\x04\x7f\xc8\x43\xde\x27\x26\x0f\xf9\x9f\x1b\xe2\x60\xe5\x14\x5f\x6f\xb5\xce\x73\xee\x2d\x21\x9b\xfb\x78\x5f\x4d\x9b\x99\xa6\x29\xf2\x65\x5d\x6d\xb4\x06\x39\xb3\x3a\x59\x39\x5b\xb9\x43\x18\xf9\x46\xb6\x49\x61\xda\x54\xb1\xf3\x45\x90\x11\xfb\x6b\x94\x6a\xbf\xf6\x26\x7d\x74\xa0\x4d\x2d\x34\x9b\x69\x08\xa4\x08\xf2\x3d\xbc\x32\x93\x6d\x62\xb4\xae\xce\x74\x89\xec\xb4\xac\x5a\x35\x45\xee\x39\x33\xda\xf3\xdc\x73\x22\xf3\x31\xf6\x9e\xae\x30\xf5\xd7\x0c\x5a\x45\xcb\x85\xad\x33\x59\x8b\x98\x31\x44\xc1\x76\x61\x62\x9c\x58\xdc\xac\xaa\xd9\x6d\x9d\x72\x32\x82\x9c\xf5\x65\x24\x34\xc7\xaa\xcf\x87\xaf\xcc\xc9\x16\x5f\x2d\x94\x89\x04\x7f\xbe\x83\xbe\x68\x6d\x3b\x9d\x3b\xe8\xf3\xfc\x3f\x17\xcf\x42\x63\x6b\xe6\x76\x5d\xd4\xe7\xa3\x58\x31\x93\x74\x71\xef\x5c\xb8\xb6\xf0\x2c\x07\xf0\x5d\xa5\x8b\xff\x6a\x2c\x6d\x51\x02\xdf\xad\xe4\x9a\xd9\xe1\xfc\x03\xed\xad\xe9\x2c\x29\x31\xf2\x5c\xe0\xa8\x56\x67\x3d\xad\x2b\xc3\x72\x51\xca\xb4\x70\xad\xd3\xb3\xc5\x7a\x77\x85\x0d\x7b\x4e\x9e\x2c\x57\x38\x5e\xeb\x6c\xea\xb9\xfe\xa4\xa7\xe8\x8b\x79\x55\xc4\xe5\x2c\x65\xce\x9e\x05\x14\x7c\x64\x1f\xbe\xda\x57\x29\x94\x55\x71\x92\xc6\x71\x59\xc2\x69\x8a\x95\x58\x89\xa4\x65\x96\x54\x15\x4c\x56\x50\x15\x23\x24\x9a\x45\x39\x54\x02\x00\xb2\x94\xbb\xe4\x67\x25\x9a\x91\x55\x8c\x86\x8a\x4a\x31\xac\x7c\x7c\x44\xfb\x8e\xd8\x8a\x27\xc7\x56\x1c\x8d\x7e\x8e\x75\x7f\xf7\xf4\xb8\xcc\xbd\xb1\x35\xe6\xe4\x81\xff\xb9\xa1\x4f\x1e\x11\x5b\x79\xeb\x9d\xc1\xc1\xfa\x8d\x2d\xa1\x52\x15\x9f\x64\xcb\x5c\xae\x6e\x62\x6a\x77\xbd\x59\xac\xbb\xf3\x0a\xd7\xa2\xc4\x55\xeb\x15\xae\x07\xb2\xa9\xae\xea\xcf\xd8\xa2\x25\x96\xcb\xb0\x23\x16\x6b\x05\x43\x52\x8c\x7c\x05\xbe\x4f\xd7\x33\x42\x9d\x36\x1a\x1c\xb6\xd2\xaa\xfd\x01\xc9\x98\xb9\x5f\x2b\xb6\xde\x1b\xdb\xee\xf5\xe7\xda\xba\x3a\xb3\x1e\x19\x5b\x7f\x62\x3f\x3d\xb1\x93\xf2\x13\x63\x1b\xff\xa0\xd8\xca\x92\xc7\xf1\x11\x35\x5f\x5c\x6c\xad\xd0\x4b\x6e\x66\x97\x5e\xb3\x62\x61\xcb\x99\x4d\x5d\x6d\x7e\xbc\x8b\x03\xac\x56\x03\x72\xbe\xbc\x5d\x75\x61\x47\x42\x55\xc2\xce\x13\x95\x22\xf3\xb1\x72\x40\xb7\xd3\x6e\x0f\xa6\x1f\xad\x8f\xcc\xa2\x4f\x8c\x5a\xed\xf9\xfb\xa2\x56\x76\x08\x2a\xf7\xf1\xaa\x48\x64\x16\x33\x9e\xeb\x34\xff\xf0\xd8\x8a\x4b\x38\x64\x71\x45\x02\x92\x84\xe2\xa4\x84\x33\x00\x95\x09\x8c\x44\x65\xc0\x60\x0a\x0b\x64\x4e\x92\x19\x8c\x25\x30\x95\x53\x29\x40\x48\x0a\xcd\x41\x19\x10\x0a\xcb\xaa\x12\x0a\x65\x6a\x17\x5b\x89\xfb\x62\x6b\x62\x03\x85\x43\x09\x3c\x2e\xb6\x12\x38\xfb\x74\x7e\xf0\xef\xde\xd8\x9a\x0b\x4c\xea\x45\x6c\xbd\xa1\xa3\x1c\x11\x5b\x73\xe5\xa5\x81\x39\xd5\x42\x35\x4f\xf6\x36\x6b\x07\x55\x72\xd9\x9e\xa0\xd2\x8e\x44\x19\xa4\xb4\xad\x59\x05\x2d\xbb\x78\x36\x7a\xa3\xda\x6c\x23\x3b\x14\xa9\x8b\x2a\x3e\xdb\x38\x6f\x1b\xba\xa6\x50\xa3\x32\x29\x90\x39\x43\xb6\x55\x92\x16\xf8\x49\xa6\xd0\xee\x36\xec\x39\xab\x0e\x7f\xb1\xd8\x7a\x6f\x6c\xbb\xd7\x9f\xab\xe8\x94\xce\x3d\x30\xb6\xfe\xcc\xce\xf0\x8f\x88\xad\xb7\xc6\x36\xfe\x41\xb1\xf5\xd6\x1a\x66\x17\x5b\xb7\xd2\x42\x91\xda\x1b\x7d\x03\xf3\xb2\x5c\x55\x8a\xcd\xb5\xd1\x2a\x3e\x5b\xfd\xe7\x11\x2c\xb0\x6f\x95\x8d\xc9\xbf\xab\x8b\x5e\xbf\x53\xb6\x07\x55\x08\x4b\x6f\x03\x6e\x61\x4b\x43\x16\xbe\x15\x61\xbf\x0d\x33\x75\x9e\x1a\x54\x8b\xcf\xf5\x09\x5f\x6a\xb6\xa6\x46\x8e\x29\xbf\x16\xf1\xb4\xb1\x35\xf2\x65\xf6\xa7\x7f\x8f\x17\x53\xb8\xdd\x1f\xcb\x3d\xbe\xd6\xed\xda\xd7\xb1\x9c\x60\xf4\xde\xdf\xc3\xe7\x72\xa7\x2f\x89\x0b\x12\x44\x1a\xad\x52\x8d\x6f\x0d\x91\x8a\x30\x44\x3e\xeb\x4a\xd2\xfb\xe6\x83\xdf\x1f\xc4\x75\x00\x6b\x18\xe7\x61\x84\x13\xb9\x0f\xfc\x84\x76\xe0\xf7\xa6\x8f\x0f\x9c\x8d\x8f\x8f\x99\x8d\x4f\x9f\x27\x1b\x3f\x44\xba\x73\xb2\x61\xc2\xdd\xc4\x18\xd2\x15\x4b\xcd\xae\x80\x7c\x3e\x82\xbf\x9c\xbc\x58\xfd\xe5\xec\x35\xe8\x57\xaa\xe6\x31\xd3\x7a\xb5\xe0\x57\x4d\x6a\xc4\x53\xf7\x09\x4f\xb6\x3f\x56\xb2\x70\x22\x71\x92\xc6\xb0\x95\x5a\xf2\xc8\x87\x1a\x12\x1f\x1b\x78\xac\xf4\x51\x64\xe2\xe4\x8f\x65\x2d\x51\x03\xbe\x49\x4b\x5b\xcf\xda\xf7\x82\x94\xc4\x9c\x30\x48\xf7\x4e\x3f\x0f\xf4\x1c\x0b\x52\x17\x83\xce\xd0\x6d\x97\xc4\x02\x22\x39\x16\x84\xa7\xde\x15\xcd\x8d\xef\x63\xf7\xf3\xe3\xe3\x49\xc7\x51\x84\x5f\x4b\x87\xd7\x16\xdc\xcc\xce\x11\xc5\x29\x27\x67\xd5\xc0\x39\x3f\x3e\xf0\xcb\xc5\x1b\x06\xc3\x98\x9b\x00\x7b\x72\x0f\x67\xde\x8b\x16\x53\xb1\x15\x7c\x3d\x63\x18\x37\xfe\xcf\x3d\xdd\xc3\x8f\x8f\x21\x1d\x47\x81\x77\x3f\xbe\x5c\xbe\xe6\x31\xd4\xe5\xc7\xd0\xb5\x0d\xef\xfe\x0d\x9c\xee\xb2\x84\xcf\x70\x00\xdd\x29\xdb\xfb\x5f\x0c\x3e\xe3\xf8\x32\x6a\xe9\xca\xcb\xfe\xed\xc6\x51\xcc\x1e\xdf\x29\x77\x27\x9b\xba\x92\x9a\xc1\xe3\xeb\x5d\x5f\x42\x5f\xd3\x9c\xc0\xb4\xb9\x18\x2f\x1e\xc5\xf7\x0e\xd7\x29\xeb\x11\xa9\xea\x26\x49\xc2\x05\x70\x36\x8f\x13\x60\x87\x2b\xc2\xa6\x6f\x14\xe1\xfc\x5d\xbd\x97\x42\x98\x0b\xd7\x2a\x27\xe6\x4d\x32\xec\x98\x3f\xe2\xb8\x55\xf9\xf1\x8a\xb6\xf7\x6f\x60\x72\x43\xf5\xfd\xba\x3e\x47\x77\xca\xf2\xfe\x57\xe8\xce\x78\x0c\xe7\xe8\x54\xaf\x8f\x62\xeb\x02\x67\xba\xf0\x16\xc6\xa0\xe3\x4f\x89\x73\xcf\xb4\x1e\x71\xdc\x6e\x92\x49\xe6\xe7\x58\x8a\x4b\xe4\xf4\x05\xea\x77\x30\x7c\x89\x2c\xc0\xb9\x02\x03\x7c\x06\xde\xdc\x1e\xcf\xa0\xf7\x1a\xb3\xc7\xb0\xe7\xa1\x4a\xc5\xdc\xfe\xdd\x69\x91\xac\x05\xde\x09\x7f\x37\x7f\x01\x7c\x49\x4c\x5e\xbe\x92\x3e\x91\xd3\xc7\xe8\xf1\x0c\x5b\x5a\x2e\x13\xb5\xf9\x18\xde\x52\xf1\x14\xcf\xcb\x9e\x63\xc3\x34\xa7\xcb\xc5\x7d\x1c\x9d\xe3\x4a\x3d\xa3\xfb\x97\xde\x87\xf2\xb7\x00\xba\x35\xf6\xde\x6c\xfc\x08\x0e\x83\xd8\xd2\xf9\xed\x8e\xc1\x97\x8b\xf7\xf4\xbf\xec\xdf\xf7\x2d\x1b\xa6\xed\xbd\xe5\x3a\x42\x88\x07\xc4\xed\x1d\x9e\x24\x8e\xaf\x5c\x1d\xb9\x58\x1f\xa6\xdd\x2b\x14\x9b\xa8\x37\xff\x95\xb4\x93\xe0\xab\xda\xcc\xf9\x18\x28\x8a\x05\x6d\xfb\x5e\x85\x26\x12\x38\xab\xd3\xf6\x6f\xbd\x3b\xaf\x8c\x7c\xc0\x2b\x78\xbf\xdf\x0e\xe2\x70\x27\x73\x1c\xe2\x65\xe7\x08\x77\xab\x70\x17\x9f\xb3\x5d\xdc\x5e\x83\xc7\x62\x4d\x5c\xf6\xbb\x40\x09\x8c\xee\xd6\x50\x2e\xca\x83\x11\x3d\x88\xdb\x30\xd4\x89\xcb\xb7\xb4\x96\x7c\x82\xfc\xd1\xc6\x70\x86\xfa\x96\xf5\x66\x34\xba\xd9\xc2\xb4\xdc\xc0\xb7\x7b\x83\xf2\xe3\x15\x1d\xa4\x90\xcc\x7e\x60\x40\x7a\x61\x76\xa1\xe7\xc6\x4e\x45\x3a\xfd\x9f\xd0\x48\x94\xe4\x04\x36\xbd\x10\x0b\x0b\xae\x74\x73\x69\xff\x14\x69\xc2\x88\x25\x8a\x15\x36\x28\xbd\x7c\xfb\x26\xca\x0f\x93\x69\x4f\x20\x51\x8e\xc8\x6e\xd7\x39\xea\xe3\xaf\x73\xfd\x08\xd7\x0e\x62\x0f\x2d\x80\xaf\x75\xf0\x73\xa4\xe7\x25\xd4\x83\x3c\x3c\x8e\x44\x1a\x19\x12\xea\xba\x58\x62\x8f\x4b\x5f\x97\x88\x53\xf1\x9e\x9c\xc4\x4e\x8b\xed\x1f\x61\x36\x97\xf8\x6f\x2e\xf5\xfd\x37\x6c\xef\x13\xf9\xbe\xc3\x38\x96\x4c\x73\x7a\xb3\x96\x63\x70\x26\x2e\x11\x3e\x7f\x56\xa0\x03\x74\xc3\x46\xbe\xfe\xe7\x3f\xc8\x93\x6d\x1a\xca\xc9\x6e\xda\xd3\xb7\x6f\x0e\xdc\x38\x5f\xbe\xbc\x20\xd1\x80\xb2\xa9\xa4\x03\xf4\x7b\xf1\xd1\xa0\x92\xb9\xd4\x26\x4e\x2a\xf2\x67\xa0\xf1\x0c\x9c\x81\x06\x58\xf8\x82\xf4\x8b\x42\x4b\xf0\x8d\x0c\xf9\x8e\x10\x44\xea\x8d\x68\x5d\x19\xab\x27\xdb\x44\xf9\xca\xcf\xd9\x8e\xde\x91\x45\xf2\xf5\x96\x50\x2a\x88\x87\x2d\x20\xa4\x25\xe4\x85\x96\x20\x66\x85\x76\x60\x57\xc4\xbb\x5b\x17\x91\x6e\x23\xe7\x9a\x4c\x4b\x68\x77\x5a\xa5\x6c\xc7\xbd\x94\x13\xaa\x42\x47\x40\xb2\x7c\x3b\xcb\xe7\x84\x98\x7d\x34\xb7\xee\x38\xff\x3a\x0e\xb4\x62\x1e\xa7\x8c\x73\x3a\x09\x9b\x64\x51\x9c\x9c\xeb\x27\xd8\x36\x0a\x55\xd6\x6e\xa1\x9f\xb0\xa3\x18\xa9\x89\x5d\x29\xfb\x8f\xeb\xe1\x94\x8f\x30\x2d\xec\xbb\x04\xf1\x06\x73\x9d\x06\x2e\x9b\x4a\xff\xa0\x1a\x22\x98\x39\xd7\x45\x48\x1b\xec\xb1\x46\x11\x6c\x71\xfc\x0a\x0a\x89\x36\x8d\x8b\x1e\x52\x5a\xeb\x68\x98\xb6\xa3\x59\xb0\xdd\xac\x22\x0a\x70\x80\x6b\x62\x88\xb2\x9c\x2d\x10\xd9\x9c\x2d\x0c\xe8\x40\x4f\x86\xff\x17\x00\x00\xff\xff\xa7\xbe\xf9\xa3\xf7\xbe\x00\x00") - -func non_native_paymentHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _non_native_paymentHorizonSql, - "non_native_payment-horizon.sql", - ) -} - -func non_native_paymentHorizonSql() (*asset, error) { - bytes, err := non_native_paymentHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "non_native_payment-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8, 0x16, 0x54, 0x57, 0x6c, 0x93, 0xcd, 0x35, 0xf6, 0x64, 0xf4, 0xf4, 0x2, 0xe5, 0xf0, 0x9b, 0x2, 0x63, 0xd1, 0xde, 0x6b, 0xf9, 0xb0, 0x57, 0x28, 0xd, 0xea, 0x95, 0x74, 0x8a, 0x1e, 0x79}} - return a, nil -} - var _offer_idsCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x67\xb3\xea\x48\xd2\x3f\xf8\xbe\x3f\x05\xd1\x6f\x6e\x4f\x70\x67\x28\x55\xc9\x76\x6f\x3f\x11\xc2\x0a\x10\x12\xde\x6d\x6c\xdc\x28\x27\x10\x46\x02\x19\xdc\xc6\xf3\xdd\x37\x30\xe7\xc0\xe1\xc0\x31\xc0\x35\xff\x9d\x56\xcc\xdc\x3e\xa0\x54\x66\xd6\xaf\x32\xb3\x32\xcb\x88\x7f\xff\xfb\xb7\x7f\xff\x3b\x51\xf5\xc3\x68\x10\xf0\x46\xcd\x4c\x30\x1c\x61\x82\x43\x9e\x60\xf1\x74\xf6\xdb\xbf\xff\xfd\xdb\xf6\x7e\x36\x9e\xce\x38\x4b\x38\x81\x3f\x3d\x12\x2c\x78\x10\xba\xbe\x97\xd0\xfe\x23\xff\x47\x38\xa1\x22\xeb\xc4\x6c\xf0\x6d\xfb\xf8\x19\xc9\x6f\x8d\x5c\x33\x11\x46\x38\xe2\x53\xee\x45\xdf\x22\x77\xca\xfd\x38\x4a\xfc\x9d\x00\x7f\xed\x6e\x4d\x7c\x3a\x7e\xfd\xad\xcb\x26\xfc\x9b\xeb\x7d\x8b\x02\xec\x85\x98\x46\xae\xef\x7d\x0b\x79\xb8\xe5\xfb\x9a\x98\x4e\xdc\x2d\x6b\xee\x51\x9f\xb9\xde\x20\xf1\x77\xe2\x4b\xab\x99\x57\xbf\xfc\xf5\x24\xdb\x63\x38\x60\xdf\xa8\xef\x39\x7e\x30\x75\xbd\xc1\xb7\x30\x0a\x5c\x6f\x10\x26\xfe\x4e\xf8\xde\x81\xc7\x90\xd3\xf1\x37\x27\xf6\xf6\xb2\x88\xcf\x5c\xbe\xbd\xef\xe0\x49\xc8\x5f\x88\x99\xba\xde\xb7\x29\x0f\x43\x3c\xd8\x11\x2c\x71\xe0\xb9\xde\x60\x4f\x12\xf8\xcb\x6f\x21\xa7\x71\xe0\x46\xeb\x2d\x73\xc7\xf9\xeb\x00\x00\xc7\x01\x1d\x7e\x9b\xe1\x68\x98\xf8\x3b\x31\x8b\xc9\xc4\xa5\x5f\xb7\x88\x51\x1c\xe1\x89\x3f\xf8\xeb\xb7\xdf\xb2\x75\xbb\x9a\x28\x5a\xd9\x5c\x37\x51\xcc\x27\x72\xdd\x62\xa3\xd9\x38\x50\xfe\x27\x9e\x0d\x02\xcc\xf8\xd0\x0d\x23\xb2\x0e\xf9\xfc\xaf\x37\xa9\x43\x3a\x9b\xc7\x7e\x10\x4f\xc3\x8f\x11\x73\x6f\xf1\x11\xca\x09\x67\x03\x1e\x7c\x84\x72\xab\xa7\xc3\xf9\x07\x29\x3f\x40\x46\x78\x18\xf9\x8e\xc3\x03\xd7\x63\x7c\xf5\x36\x2d\xa6\xd4\x8f\xbd\x88\xe0\x09\xf6\x28\x0f\xff\xfa\x4d\x37\x9b\xb9\x7a\xa2\xa9\xa7\xcd\xdc\x09\xb5\x6d\x99\xbd\x0b\xf0\xfa\xc1\x3a\xb1\xe3\x9e\xb1\xad\x46\xb3\xae\x17\xad\xe6\xc9\x43\x2f\x09\xbf\xcd\xc6\x7c\xfd\x11\xfe\xd1\xea\x7d\xd6\xcf\x34\x9f\xe0\xea\xf0\x0f\xe8\x7c\x4a\xf6\x71\xde\x41\x1c\x46\x13\xd7\xe3\xe1\x5b\x9c\x9f\x89\x3e\xcc\x77\xab\x05\xdf\x45\x83\x37\xf8\x1e\x89\x3e\xce\xf7\xd9\xe4\xdf\xe2\xfb\x4c\xf4\x61\xbe\x7b\x7a\xd7\x73\xfc\x37\xf8\x1e\x89\x3e\xcc\x77\x16\x93\x30\x26\x6f\xf0\xdc\x13\x7c\x86\xdf\xc4\x0d\x87\xf3\x98\xc7\x6f\x21\x7b\x4a\xf6\x71\xde\x9c\x07\x6f\xc1\xba\xbb\xff\x61\x6e\x3b\x37\x7e\x8b\xdd\x9e\xe0\xc3\xfc\xf6\x51\x69\xc8\x31\x7b\x9b\xed\x0b\xba\xef\xcc\xfd\x10\x29\xf9\xfc\xdb\x07\xc5\x10\xec\xbd\xc1\x9c\x60\xef\xc3\x0a\x1f\xa2\xdf\x5b\xba\x3e\x91\x7c\x96\xe7\x36\x07\x78\x9f\xed\x96\xea\xc0\x79\x47\x7b\xce\xf8\x62\xc8\x7d\x9b\xf6\x39\x34\xbe\x47\x76\x0c\x74\xef\x50\x3e\x07\xae\xb7\xe9\x8e\x81\xe8\x1d\xba\xe7\xc0\xf2\x2e\xdd\x87\xf4\x3b\x06\x94\xb7\xe9\xf6\x41\xe2\x5d\x9a\x67\x97\x7f\x87\x72\xeb\xc7\x6f\x93\xec\x7d\xf3\x6d\x9a\x17\xae\xf0\x36\x29\xc1\xde\xdb\x04\x4f\xa6\xfa\x21\xaa\xad\xe5\x1d\x08\x73\xdd\x66\xce\x6a\x14\x6d\xeb\x94\x78\x32\x1b\x84\xf3\xc9\x81\xa2\x91\x31\x72\x15\xfd\x15\xaf\xbf\x7e\xdb\xe7\xc6\x16\x9e\xf2\x3f\x9f\xbe\x4b\x34\xd7\x33\xfe\xe7\xe1\x91\xbf\x12\x0d\x3a\xe4\x53\xfc\x67\xe2\xdf\x7f\x25\xec\xa5\xc7\x83\x3f\x13\xff\xde\xa5\xcc\x99\x7a\x4e\x6f\xe6\x9e\x38\x3f\xf1\xfb\xed\x05\xc7\x97\x37\x0f\x8c\x33\x76\xa5\x92\xb3\x9a\x6f\x70\xde\x13\x24\x6c\xeb\x25\x83\x44\xb1\x91\xf8\xf2\x94\xdf\x3e\x7d\x17\xee\x98\x7c\x39\x97\xfc\xd4\xfc\x83\xcc\x67\x84\xde\x6d\xcf\x0b\x2c\x2d\xbb\x79\x86\x67\xa2\x53\x6c\x1a\xcf\x6a\x9d\x26\xb4\x2f\xc4\x1f\xb9\x9c\x29\xf2\x99\xc6\xbf\x62\xb2\x03\xa0\x6a\xa6\x66\x83\x6d\x15\x33\x0b\x7c\xca\x59\x1c\xe0\x49\x62\x82\xbd\x41\x8c\x07\x7c\x07\xc3\x07\x13\xf0\x2d\x19\xe3\x0e\x8e\x27\xd1\xb7\x08\x93\x09\x0f\x67\x98\xf2\x6d\x35\xf1\xe5\xec\xee\xd2\x8d\x86\xdf\x7c\x97\x9d\x14\x08\x2f\x1a\x7b\x6a\x90\x87\x66\xee\x4c\xf7\xd8\xc8\x27\x03\xb8\x04\xf8\xde\xca\x4f\x83\xee\x1f\xbf\x25\x12\x89\xa7\x6f\x5c\x96\xa0\x43\x1c\x60\x1a\xf1\x20\xb1\xc0\xc1\xda\xf5\x06\x7f\x48\xf2\xbf\x76\x7d\x63\xb5\x4c\xf3\xeb\x8e\x7a\xfb\xa0\x87\xa7\xfc\x02\xb1\xaa\x5e\x22\x5e\xe0\x49\x7c\x89\x5a\x10\xe0\x39\xf9\x04\x87\xd1\xd4\x67\xae\xe3\x72\x96\x70\xbd\x88\x0f\x78\xf0\x4c\xf2\xdb\xbf\xce\xfb\xfe\xd9\x8b\xef\xc4\x22\xbc\x09\x88\x43\x21\x90\x20\xee\xc0\xf5\xa2\xb3\x9b\x21\x9f\x7b\xf1\xf4\xf2\x3d\x2f\x9e\x86\x31\xe1\x5e\x14\x6c\x4b\xc1\xf3\x66\xee\x69\x5c\xcf\x99\xe0\x6d\xc5\xc8\x78\x18\x5d\x56\x67\x4f\x38\xf4\xa7\x9c\xf9\x53\xec\x7a\x17\xa8\x44\xf1\x5c\xe9\x68\x18\xf0\x70\xe8\x4f\x58\x98\x88\xf8\xea\x5c\x33\x67\x82\x07\xd7\x34\x7a\xb3\x6f\x0e\x88\xc4\x5b\xa9\x13\x17\x13\x77\xe2\x46\xdb\xc6\xed\xdb\xff\x04\xc9\x64\xf2\xd6\x6d\x77\xe0\x6d\x73\xa1\xad\x5a\xfb\x6f\x4e\xb2\x81\xe7\xd4\xe2\x00\xfa\xb7\x5d\x59\x9d\xc8\x18\xb9\x4c\x39\xf1\xc7\x1f\x4f\x5d\xf1\x3f\x7f\x27\xc0\xbf\xfe\xf5\xc6\xd3\xe7\x0a\x9e\xf3\x79\xd5\x80\xf7\x38\xbe\xe8\xcb\x33\x6e\x2f\xfb\xf9\x3d\x4e\xaf\xe1\x39\x63\x77\x01\xbf\x3d\xcf\xd7\x8e\xb1\x1d\xff\x6e\xf5\x89\x6d\xca\xb8\x77\x07\xcf\x67\xfc\xd4\x17\x5e\xf8\xc0\x6b\xa1\x2f\xc7\xe7\x5b\xc5\xbf\x4c\x8c\xf7\x8a\x1c\xbe\xc3\xe1\xf0\x44\x19\xf9\x95\x6d\xcf\x02\xbe\x78\x97\x88\xc4\x74\xcc\xa3\x89\x1b\x46\xef\x92\x3e\x67\xdb\x4f\xe6\xbe\xff\x9a\x4e\xfc\x90\x47\xee\xf4\x8a\xe7\xef\x02\xeb\x05\xdf\x3a\xe9\xf3\x97\x49\xfd\x33\xbf\xb3\xfe\x3e\xca\xb9\x62\x3a\xd7\x6a\x83\x97\x6c\x8e\xad\xb8\x66\x2d\x87\xe4\xeb\xd6\x1e\x3b\x14\x5e\x7f\x3c\x3b\x39\x0f\x3e\x18\x41\xf7\x33\x2f\xec\x5a\x04\xdd\x99\x3b\x0e\x43\x1e\x5d\xc2\x73\xef\xab\x57\x6f\xe3\xe9\xd6\xad\x2e\xb3\x9e\x05\x2e\xe5\xde\x95\x20\xb6\xbb\x79\x2d\xc2\xed\x6e\x26\x98\x1f\x93\x09\xdf\xda\x1b\x75\x77\x33\x92\x0f\x8d\xa2\x27\x3d\x7c\x28\x59\xf7\x6d\x39\xeb\xd7\x43\x03\xaf\xd8\xc6\xe1\xc9\x03\xc2\x67\x8f\x3e\xe1\x7e\xcd\x20\xf6\x09\xfb\xad\xf6\xb0\x2f\xeb\xf7\xe6\xe0\xce\x2e\x0d\xfc\xd2\x2b\xcf\xf5\x83\xe8\x19\x8d\x6c\x2e\xaf\xb7\xcc\x66\x02\x9c\x0f\x9b\x7c\x15\xe1\x28\xe2\xd3\x59\x94\xd8\xba\x45\x18\xe1\xe9\x2c\xb1\x4d\x99\xfc\x78\xff\x4d\x62\xe3\x7b\xfc\xf5\x60\xeb\x60\x77\x12\x07\x27\x43\xed\x35\x09\xd1\x7a\xc6\xdf\xef\x94\xfd\xb4\xc4\x09\xdf\xd7\x61\xff\x59\xe2\x95\xde\x39\xcc\x6c\xf8\xc1\x79\xa7\xfe\xb1\x43\xe2\x7f\x12\xe0\x5f\x09\xdd\xca\x26\xf6\x1f\xff\xaf\xbf\x13\xb2\x24\x21\xe9\x5f\x17\xfb\xea\xb4\x0c\xbb\xb9\xcb\x4e\x67\x79\x4e\x63\xee\x15\x34\xf6\x13\x6d\x5b\xaf\xbb\xa8\xd0\xb6\x76\xbc\x43\x95\x30\x26\x07\x25\x02\x1e\xbe\x18\x80\xd0\xc5\x8c\x31\xe0\xf8\xd9\x97\x5e\xeb\x73\x52\xf3\xde\xaa\xd3\xc9\x64\xdd\x07\x46\xc6\xbd\x62\xf3\x90\xbf\x35\xc2\xbc\xd6\xf3\xa4\x86\xbf\x55\xcf\x23\x8b\x8f\xeb\xf9\x6a\x90\x3b\xbb\xcf\xbd\x05\x9f\xf8\x33\xfe\xce\x90\x76\x14\x7d\xc7\x40\x74\x32\xdd\x71\x07\x04\x4f\xf3\xb5\x7f\x7c\xa4\x1f\x8e\x56\xf4\x1e\x10\xf3\x2b\x03\xcd\x4b\x10\x9e\xe6\x81\x5f\x70\x3c\x07\xe2\x85\xb4\xab\x60\x1c\xe7\x88\x6e\x06\xe3\x38\x29\xfe\xc7\xd1\x6f\x5f\x16\x6f\x17\x7c\xea\x2d\xef\x3e\x99\xe1\xba\x55\xab\x93\x25\x80\x5b\xca\xae\xdd\x88\xff\x46\xa4\x76\xc3\x30\xe6\xc1\xc7\x59\x51\x9f\x5d\xac\x4e\x5f\xc1\x12\x4d\xdc\xa9\x7b\x25\xa3\x78\xb3\x16\xfc\x99\x55\xd5\x89\x75\x9e\xac\xaa\xdc\x54\x45\x9d\x3e\xff\xa8\x3a\xea\x84\xe7\xed\xf5\xcf\x5b\x5c\xf7\x9d\x76\xc6\xe9\xd0\x93\xff\x73\xd9\xf1\x5e\x4c\xf7\xde\x6c\xe4\xa7\x6b\x68\x7b\x33\x8f\x56\x2f\x42\xf1\x07\xea\x8d\x73\x03\x5c\xed\x56\x29\xaf\xde\xa5\x43\xec\x0d\xf8\xc5\xc2\xfe\x14\x9c\xd3\x65\xbb\xdb\x63\xf5\x71\xee\xfc\x76\x88\x7e\x30\x3e\xc4\x67\xeb\x4b\xe0\x44\xab\x80\x87\xf1\xe4\x62\x74\x8f\x56\x53\xfe\x6e\x3d\x77\x5c\x62\xbd\x1d\xcf\xb3\x75\x8b\x5b\x41\x3d\x5b\x71\xfe\xe3\x43\xc0\x1d\x1e\x7a\x0b\xbd\x03\xc9\x25\x20\x3e\x66\x76\x67\x2b\xdc\xb7\x00\x95\xdd\x56\xd6\x8e\x1f\xbc\x33\x19\x9a\xc8\xea\x4d\xfd\x1d\xcc\xde\x66\x19\x7e\x9a\x5f\xd1\x6a\xe4\xea\xcd\x44\xd1\x6a\xda\xc7\x49\xc5\xb6\x6e\xb6\x72\x8d\xc4\x1f\x5f\x0a\xe9\x7a\xb5\x67\x14\x4d\x98\x29\xa2\xbc\x55\x13\xd3\x5d\x33\x5f\xb1\xb2\x66\xbe\xd4\xb2\xaa\x2d\x68\xf4\x50\xbf\x92\x6f\x18\xb6\xd5\xca\xe4\x6c\xbd\xd1\x51\x6a\x19\xc5\xee\x42\xe3\xcb\xd7\x84\x76\xb8\xa4\xfd\x7f\x64\x00\xbe\x26\xc4\xaf\x09\xf0\x75\x8f\x72\xe2\xcb\x97\xaf\x89\x2f\x7a\x4d\xd7\x75\xfd\xef\xbf\xbf\xec\x6e\xc0\xa7\x7b\xc7\x7f\xff\xf5\xd7\x7b\x1a\x66\x6a\xd5\x5e\xc1\x10\xcb\x92\xd2\x4d\x67\x73\x56\xb9\xdc\x95\xa4\x72\xb6\xd9\xb1\x9b\x65\xa9\x93\xed\xd4\x6b\xb6\x01\x4d\x23\x97\xed\xa2\x5c\xb9\x5d\xac\xd5\xcd\x4a\xae\x51\x48\x17\x8e\x1a\x6e\x15\x53\x25\x55\xd3\x90\x28\x69\xe8\x6d\x0d\xc5\x9b\x34\x84\xa8\x96\x87\x46\x2b\x27\x41\xbd\xd2\x6d\xe5\x5b\x06\xd2\x7b\x25\xbd\xdb\x2d\x74\xbb\x6d\xd8\x36\xba\xbd\x5e\x5d\xce\xf5\xba\xb9\x66\xb5\x9c\xed\xf6\x1b\x7a\x47\x56\xba\xb6\xf8\x23\x35\xec\x96\x0b\x72\xdd\x12\x6d\xab\x98\xab\x66\x2a\x56\x3e\xad\x20\xa8\x8b\x48\xee\x4b\x55\x2b\xdb\xa8\x9b\x85\x4e\x59\x29\xa4\xcd\x4c\xa5\x66\x16\xf3\xb6\xd8\x50\x72\xbd\x4e\xbb\xf5\xac\xa1\xfc\x42\x43\xf9\x6b\x02\xbd\xa1\xa1\x76\x8b\x86\xba\xd4\x49\x57\x7b\xba\xd4\x13\x3b\x7a\xce\xe8\x76\xea\xb0\x55\xb6\x61\xcb\x16\xd3\xad\x82\xd1\xaa\x29\x62\xae\x55\x2d\xdb\x16\xac\x19\x6d\xb1\x53\x37\xec\x62\xdd\x2a\x97\x0d\xf8\xac\xa1\xf4\x42\x43\xe5\xc4\xd6\x3e\xac\xe1\x15\xcf\x3b\x9f\xb1\xbc\xc3\x89\xaf\xcf\x43\x7e\xd6\x93\x5f\xce\x45\x3e\xc3\x28\x23\xa6\xa9\x8e\x84\x64\xce\x65\x95\x09\x04\x2a\x44\x22\xaa\xe6\x40\x84\x1d\x09\x09\x02\x51\x24\x59\xc3\x50\x74\xb0\x23\x88\x00\x61\x06\x88\x04\x89\x8c\x10\x01\x0a\xe1\x9a\xb6\x85\x0a\xdc\x79\x6d\x79\x48\x0a\xc4\x90\x23\xe8\x38\x50\x54\x31\x50\x08\xe0\x0a\x70\x98\xe0\xc8\x0c\x09\x2a\x15\x1c\x4c\x19\x04\x44\xa6\x14\xa8\x14\x21\x26\x29\x8a\x04\x25\x4d\x95\x55\x01\x4a\x58\x90\xbf\x7c\x4d\x08\xbb\x9e\xfa\xa2\xff\xb2\x57\xba\x5b\x76\xc5\x75\x6a\xdd\x28\xa7\x95\xac\x97\xd5\x0c\x08\x56\xa3\x74\x32\x04\x83\x28\x5c\x16\x97\x1b\xa1\xcb\x1a\x9d\x1e\x4e\x97\x70\x7e\xb0\xa5\xcf\x59\xa2\x89\x37\x33\x58\x7b\x97\x73\x5f\xef\x0a\xe2\x8e\x2c\x3d\xfe\x01\x0d\x79\xe8\xf5\xe5\xcc\xd5\xaf\x18\xaa\x44\x64\x19\x89\x94\x6a\x5c\x13\x34\xcd\x61\xc8\x21\x04\x3b\x40\x96\x24\x2a\x89\x14\x4b\x5c\x21\xaa\x00\x99\x24\x43\x2e\x23\x4e\x31\x70\x08\x24\x1a\x56\x35\x22\xa8\x80\x8a\xce\xd6\xc8\x1e\x61\xec\x98\x43\x45\xd0\x98\xc8\xb9\x44\x09\xa7\x8c\x53\x49\x23\x98\x4a\x8e\xc0\x00\x83\x4c\xa1\x58\x85\x44\x23\x4c\x12\x81\x4a\x28\xa2\x14\x69\x0e\x17\x64\x59\x06\x12\xd2\xb8\xba\x35\x54\xf8\x35\x21\x48\x92\x26\x29\x9a\x22\x08\x07\x8b\xcd\xc0\x6a\x7f\x24\x58\xb1\xe4\x03\x52\x52\x3a\xa2\xb7\xb6\x17\xad\x55\x01\xb5\x67\xfe\x38\xb9\xc8\xeb\x76\x94\x11\xca\xb0\xa2\xa4\x15\xb9\x3f\x54\x61\x6d\x10\xc6\x7a\x63\xda\x00\xab\x41\x7e\x26\x38\x23\xb7\x09\x97\xd6\x60\xd1\xee\xd4\x33\x93\x46\x47\x8a\x2b\x55\x24\x8a\x8d\x8a\xbf\x43\xb8\x5b\x6d\x57\xaa\xcb\xed\x5f\xc5\xe7\x7f\xf6\xe1\x2d\x3c\x7e\x5e\xea\xd5\xda\xc1\x76\x86\x4a\x60\x18\x88\x0f\xe7\x8b\x56\xd8\xc9\x55\x1d\x7d\xb2\x68\x87\x33\x5d\x87\xa9\x7e\x1d\x94\x46\x55\x3d\x5f\x64\x06\xa9\xc1\xb0\xe1\xc6\xa5\x95\xd7\x52\x26\xeb\xe4\x86\xaf\xfa\x71\xd8\x5d\x01\xcb\xec\xae\xfd\xb2\xb4\x68\xd7\x8a\x8b\xec\x26\xeb\x25\xf3\xd3\x5e\xde\xe6\xc3\x9d\x45\x17\x2f\x58\x74\xe1\xa2\x79\x3f\x59\x74\x16\x94\xbe\xa3\xed\x7d\x9f\xeb\x83\x16\x8d\xb1\x82\x10\x91\xb9\xa0\x31\x8d\x09\xcc\x01\x2a\x26\x2a\xa6\x02\x21\x0a\xa0\x5c\x13\x05\xcc\x88\x46\x91\xa0\x29\x82\xcc\x08\xe1\x0c\x10\x15\x61\xd1\xd1\x14\x41\xc1\x22\x54\x76\x61\xf3\x01\x5e\xa1\x32\x51\x24\xaa\xa6\x00\x45\x93\x55\x45\xa1\x18\x00\x59\xc2\x84\x51\x85\xca\xaa\x26\x01\x11\x09\x2a\x82\x54\x52\x80\xc6\x54\xea\x50\x0d\x73\x4d\x93\x14\x24\x6b\x92\xa8\x4a\x3b\x1e\xe8\xc4\xa2\xe1\x93\x45\x0b\xd1\xd4\xaa\xac\xf9\xb8\xef\x69\x55\x25\x5e\xa4\x27\xdd\x7c\xb3\xdc\xf5\xe2\xb4\xd9\xee\xc5\xbd\xe4\x7a\x90\x5c\xc7\xd8\x25\x05\x7d\x55\xcd\x49\xba\x1d\x25\x21\x42\x4d\xa3\x1a\x35\x2d\xd2\xf2\x46\x8d\x65\x75\x31\xf5\xe5\x01\xda\xac\xf3\x34\x5f\xf5\xa9\xda\x36\xab\x85\xc2\x1e\xe1\xad\x45\x9f\x9a\x4d\x63\xb8\x99\x17\x35\x6c\xf6\x92\x4a\x79\x26\xf5\x97\x48\xee\x71\x05\x20\xb7\xbf\xf2\x0c\x5d\xcc\x2e\x85\xa9\x54\xce\x8b\x75\xa3\x3c\xb5\xad\xba\xe9\x76\xd3\x12\x36\x9c\xb2\x5e\xe8\x04\xc8\x58\xf9\x93\x5a\x6d\x35\x58\xaf\xba\x19\x36\xaa\xae\xb1\xdc\x6f\x6f\x70\xbb\x91\x6f\xee\x3c\xa6\x72\xc1\x62\x2b\x83\x4b\xbd\xfe\x5f\x60\xb1\x0a\x25\x0c\x52\x49\xc6\x32\x41\x22\x72\x30\x00\x8e\xaa\x70\x28\x42\x59\x64\x5c\x92\x1c\x07\x28\xdb\x21\x1c\x11\x41\xd4\x80\x2a\x32\x4d\xe3\x92\x2c\x71\x07\x50\x26\x3a\x00\xe2\x5d\xfc\x7c\x80\xd5\x6f\x19\x33\x40\x01\x95\x90\xc2\x14\xcd\xc1\x1c\xcb\x8e\xa8\xaa\xa2\xc8\x04\x45\xc3\x92\xaa\x61\x88\x1d\x4d\xe0\x10\x6a\x48\xd4\x14\x07\x39\x22\x46\x8c\x60\x00\xa0\xa0\x21\xf2\x65\x97\x14\x3f\x5b\x2c\x7a\xb2\x58\x79\xb6\xb1\xa1\xd8\x87\xcc\x70\x32\xe5\xb8\xbc\x24\xd1\x72\x33\xab\x61\x28\x2d\x57\x93\x15\x21\x8b\x28\x23\xda\xe3\x64\x37\x2f\xd7\xbc\xd1\x78\xd8\x8d\x9b\xe3\x6c\x27\x9a\x88\xa6\x45\x52\x3d\xab\xd6\x1c\xcd\x4a\xb9\x62\x21\x9b\xd4\xc2\xe1\x28\xdc\xa0\xd2\x26\x9c\x2f\xc4\x54\x6f\x87\xf0\xce\x62\x4f\x8c\xc8\x92\xd2\x52\x47\x2b\x87\x2b\xdf\xee\xda\xb3\x90\x5a\x16\xcb\xba\x1e\x8e\xad\x55\x26\x55\x5d\xc2\xf1\x58\xc9\x66\x5b\x3e\x68\x74\xed\x6e\xdf\x8b\xb2\xfa\xaa\xe9\x74\x3d\x59\x9e\x6a\xc5\x61\x0e\x74\xa7\x13\x17\x97\x17\x63\x5e\x9c\x59\x25\x67\xa3\x95\xab\xc4\xd7\x8b\x7d\x7b\x67\xb1\xb5\x0b\x16\x5b\xf5\x2f\xf5\xfa\x7f\x81\xc5\x12\xca\x31\x90\x14\x2e\x50\x06\x05\x81\x41\xea\x10\x85\x23\x87\x68\x9a\xe4\x30\x51\xa2\x4c\xc6\xa2\x08\xa1\xe0\x20\x15\x53\x0a\x24\x08\x89\x28\x11\x95\xaa\x02\xd3\x64\x09\x6e\x2b\xae\x87\x58\x3d\x42\x48\x71\xb0\x4a\x55\x59\x52\xa1\x20\x51\x8d\x40\x41\xa5\xa2\x8a\x08\xc6\xb2\x23\x48\x0c\x30\x2a\x2a\x40\x46\x5c\xd0\x10\x86\x1a\xe0\x92\x23\x8a\x64\x6b\xf0\x08\x21\x71\xab\x87\x74\x62\xb1\xe2\x93\xc5\xa2\xb5\x66\xe6\xf1\x34\x04\x55\x59\xaf\x0e\x93\xa5\x4c\xdf\x92\xda\xa9\xa5\x33\x32\x37\x61\x6b\x5c\x6c\xf6\xbd\x49\x9f\xab\x15\xa1\xaa\xcf\x8b\xa9\x52\xde\xdb\xb8\xe3\xda\x72\xa2\x77\xd2\x70\x96\xd1\xb4\x1e\x4e\xb5\x49\x0d\x96\x1a\x93\x6e\x30\x5b\x59\x5a\x8e\x69\x66\x2a\xc8\x56\x76\x08\xef\x2c\xf6\x24\xd2\x49\x51\x1e\x8f\x53\xce\x50\xa9\xe4\x6c\x37\x1a\x8e\x26\x6b\x96\x0b\xd2\x2d\x90\xaa\x00\x77\x82\xb9\x13\x0b\x2d\x02\x32\x4b\x81\x92\xda\xc6\x4a\xcd\x2b\xc3\xc9\x60\xd8\x2d\x85\xc3\x51\x6e\xa0\xcc\xa7\x6a\x1b\x58\x2b\x23\x3d\x12\xfb\xb6\x3b\xb6\xbb\xa0\x21\xd7\xbc\xca\xa6\xbe\xe3\xdc\xba\x60\xb1\xf5\xca\x59\x87\xa7\xf5\xff\x0e\x8b\xa5\x08\x6b\x94\x21\x28\x3b\x32\xc0\x9a\x28\x42\x85\x51\xcc\x38\x91\x35\x8d\x21\x47\xe6\x94\x21\x0d\x49\x88\x52\x0d\x41\x4c\xa9\xc2\xa0\x22\x4a\xc2\xd6\x4c\xa0\x4c\x1c\xaa\x6e\xad\xed\x11\x56\x0f\x00\xd0\x98\xa3\x6a\x32\xa4\x88\x40\x49\x14\x11\x24\x2a\x10\x09\xe5\x90\x60\x55\x05\x90\x51\x41\xe2\x92\x46\x20\x56\x10\x86\x44\x75\xa0\x44\x35\x99\xef\xb3\x0d\x67\x9b\xe7\xca\x27\x16\x2b\x3d\x59\xac\xb2\x99\xa7\xbb\x22\x05\x43\xa3\xb1\x51\x9c\x51\x52\x9a\x38\x42\x7e\xd3\x99\xe5\x8a\x43\x55\x0c\x2a\xe9\x46\x19\x74\xc4\x75\x1a\x76\x5a\xe3\xd1\xb4\x32\x8f\x92\x30\xb7\x58\xa4\x73\x7d\x6c\x16\xe4\x88\x4c\x3b\xc1\xc4\xc6\xe9\x82\x35\x9b\x37\xb4\x7a\xd2\x69\x2b\x59\x21\x23\x90\xdc\x0e\xe1\x9d\xc5\x2e\x8f\x88\xc7\xb5\xa0\x5a\x0b\xe0\x7c\x62\xb5\x67\x99\xe2\x7c\x58\xc3\xbc\x56\x09\xb3\x5a\xa9\xd3\xb1\xf0\xaa\xd8\xb0\x8b\xcb\x4a\xb8\x5a\xb8\x93\x62\x4b\xcf\xb0\x64\xa9\x17\xda\xeb\x76\xae\x12\x0c\x72\x0b\xbb\x2c\xbb\xba\x49\xf3\xbc\x43\xca\x9e\xed\xc6\xd5\x12\x9d\xc4\xb9\xa8\xed\x6a\x3b\x8f\xe8\x5d\xb0\xd8\xc6\xf2\xac\xc3\x33\xfa\x7f\x87\xc5\x02\x86\x1c\x24\x22\x02\x1d\xcd\x01\x14\x73\xc2\x20\xd7\x88\x84\x99\x04\x11\x62\x48\x15\x19\xe3\x8e\x24\x2b\x1c\x08\x0e\xa3\x4c\xe5\x8a\x46\x10\x96\x1d\x20\x00\x2e\x88\x94\x6d\xad\xed\x11\x56\xaf\x00\x48\x55\x11\x02\x11\xa8\x82\x44\x44\x07\x51\x2a\x08\x22\xc6\x84\x40\x2e\x39\x58\x64\x9a\xcc\xb0\xa3\xc8\x48\xd0\x00\x11\x00\x15\x38\x95\x1c\x82\x91\x2c\x48\x80\x88\x0c\x7c\xf9\x9a\x50\x4e\x2c\x56\x7e\xb2\x58\xd5\x9e\x6d\x9a\xa5\x45\xaf\x3c\xc9\x95\xb4\x75\x24\xc3\x29\xab\x42\xc5\xb2\x9b\x2d\x75\xdd\x2c\x87\x2b\xad\x04\x5a\x0d\xba\x29\x05\xa9\x62\x9c\x5e\xfb\x35\x7b\x3e\x6d\xea\x95\x56\x73\x25\x0f\xd6\x60\x34\xf4\x0b\x05\x21\xef\x9a\x1e\x8a\x8b\xb5\x6c\x2e\x96\x60\x33\x14\x90\x23\xee\x10\xde\x5a\x6c\xfd\x04\x71\x15\x08\x42\x51\xa5\x4b\xee\xb6\x5b\x66\x7d\xac\x0c\x92\x45\xc4\x3b\x95\xd4\x38\xd9\x4a\x86\x0b\xd3\x5c\x94\x4c\xb5\xab\xe5\xac\xb4\x30\x5b\x9a\xc5\xda\xa0\x56\xcc\x93\xe6\x66\x93\xce\x97\xe7\x8a\x39\x49\x8e\x61\x07\x2e\xd8\xa8\x50\x0b\x6b\x4b\xbe\x72\xe2\x51\xaf\x9d\x01\x60\xc7\x99\x5e\xb0\xd8\x56\xeb\xac\xc3\xb3\xfa\x7f\x87\xc5\x12\xbe\xcd\x18\x11\x54\x00\x64\x5c\x02\xdb\xff\x09\x2a\x54\x29\x15\x1d\xd9\x81\x0e\x96\x04\x45\x51\x24\x80\x25\xe8\x38\x44\x71\x34\x15\x70\xc0\x39\xa1\x8a\x26\x70\x59\x63\xbb\x11\xfd\x11\x56\x2f\x3b\x70\xfb\x04\x21\x8e\x2a\x50\x51\x53\x34\x99\x42\x80\x30\x96\x24\x42\x11\x42\x80\xcb\xb2\x80\x30\x94\xa8\xc2\xa8\x28\x41\x04\xa0\x26\x10\xc6\x39\x47\x80\x69\x0a\x12\xbe\x7c\x4d\xa8\x27\x16\xab\x3c\x59\xec\x12\xa4\xac\x6c\xb8\xf0\x96\xeb\x78\xd1\x90\x49\x27\x6a\x8d\xaa\xcd\xa1\x85\x16\x6d\x4f\x4c\xa7\x28\xb4\x39\xb1\xa7\x6a\x3a\x3b\x6c\x5a\xf9\x24\x17\x52\x42\x79\xd5\xda\xd8\x8a\xe8\x19\x05\x34\x9e\x8f\x0b\xb3\xc6\x34\xcf\xf0\xb0\x5f\xf2\x86\x34\x97\x19\xcc\x8b\x62\x27\x9e\xa8\x3b\x84\x77\x16\x7b\x6a\x44\x76\xa5\xb0\xe6\x2b\x3b\xe6\x8b\xb1\x58\x2b\xf6\x32\xe5\x14\x87\x4d\xb3\xd6\xe5\x34\x97\x6a\xa6\xe3\x58\x60\x8b\x42\xcd\x9d\x34\x43\x6b\x51\x16\x02\xb2\x10\x8d\xdc\x44\x22\x19\x5d\x9e\xb5\x17\xd9\xca\x52\x9a\xe6\xe4\x12\x75\x68\xbd\x51\xc9\x8c\x09\x8a\xc5\x25\xec\xee\x4b\xbb\xc1\x05\x8b\x6d\x8b\x67\x1d\xfe\xdf\x62\xb1\xa2\x2a\x53\x02\x1d\x8e\x11\x16\x65\x55\x13\x18\x02\x02\x96\x19\x13\x18\x90\x1d\xa0\x31\x44\x1d\x2e\x0b\xa2\xc8\x1c\xa0\x49\xaa\xa0\xaa\x2a\x06\x8e\x24\x40\x4d\xe3\x14\x8b\x74\x37\x73\xf5\x08\xab\x27\x80\x2b\x10\x31\x51\x73\x90\xca\x38\x45\x90\x23\x8e\x1d\x95\x0a\x9c\x38\x4c\x82\xa2\x48\x08\x62\x92\x88\x1c\x01\x62\xc0\x55\x28\x88\x2a\x42\x0e\x15\x14\xa2\x48\xa2\xa4\x6d\x79\x68\x27\x16\xab\x3e\x67\x05\x72\x3c\x1b\x95\x96\x26\x6f\xd9\x2d\xbb\x90\x19\x55\x9a\x50\x5d\xcc\xea\x0c\xb5\xca\xad\x45\x12\x25\x7b\xd9\x81\x12\xac\x24\x63\xea\xe1\xb1\xb6\xc9\xa8\x85\x6a\x49\xee\x6f\x0a\x55\x29\x59\x6d\xf9\x29\xc9\x33\xf0\xa4\xb4\xae\x66\xcb\xc2\xca\x2f\x28\xfe\x4c\x09\x36\x6a\xb6\x78\x12\x63\x4f\xf3\xd8\x58\x31\xec\xb4\x4a\xbb\xa0\xe3\xcd\xdd\x95\xb7\xd8\xd8\x93\x1e\xca\xa2\x1e\xf2\xab\x80\xf5\x36\x9b\x8e\xb6\xee\x78\x6d\x32\x05\x78\x29\xad\xab\x2d\x6f\x33\xe2\xcb\xb5\x98\x0c\xc4\x25\x5f\x68\xad\x71\x43\xa9\xb6\x6b\xa9\xdc\x3c\xeb\x17\x5b\x83\x4d\x2a\xcd\x51\x3b\x3f\xdd\xf1\x1f\x5f\xb0\xd8\x2e\x3d\xeb\xf0\x5d\xaa\xf2\x7f\xba\xc5\x5e\x59\xad\xb8\xb0\xf9\xf6\xb3\xcb\x14\x87\x0d\xb8\x8f\x58\x88\x7a\x2a\x92\xf4\x76\xbb\xf9\x34\xc8\x46\x64\xd0\xad\xcb\x39\xc5\xcf\x9a\xc0\xac\x25\x97\xbd\x46\x46\xdb\x74\x17\xdd\x76\x13\xad\xdc\xaa\xdb\x8b\x1b\x44\xc8\x2e\xa6\x35\x93\xab\x7f\x7f\x79\x7a\xbe\xd5\x6e\xb7\x0e\x06\xe4\x57\x97\xbd\x54\x9e\xa5\x68\x71\x6d\xb5\xe6\x29\x3e\x37\xec\xcd\x6c\xae\xf4\x98\xbf\xa4\x4e\x63\x33\x36\x9c\x7e\xbe\x5d\xcf\x94\x61\x6e\xbc\x7d\x5e\x38\xac\x70\xec\x94\x91\xbe\x26\xc0\x7f\xd4\xb3\xb5\x0f\x71\xbf\x00\xaa\x5d\x07\xf5\xf5\x06\xd6\x3b\xd6\x93\xae\xee\xb0\xbc\x8f\xe7\xf9\x26\xc9\x3b\xb8\x5d\xd9\xe2\x78\x07\xc7\x2b\x9b\x11\x3f\x6b\x99\x27\x1b\x12\x4f\x16\x21\x9b\xed\x42\xb3\xa0\xf4\x72\x85\x8a\x91\x86\x7a\xde\xec\x36\x8d\x7e\xbf\x99\x6f\xa4\xb3\x92\x24\x76\xbb\x69\x68\x74\x94\xba\x6c\x40\x31\x8b\x8c\x66\xad\xd3\x2c\x98\xdd\x5a\x59\xd9\x2f\x02\xec\xad\x2b\xc3\x9a\x4d\x2b\x95\xce\x56\x6c\xa3\x96\x09\x16\x95\x24\xdd\x98\xc5\x62\x52\x93\xb8\xc8\x8c\x28\x59\x1d\xc9\x62\xb5\x2f\x2d\xa3\xca\x5a\x39\x3a\xe1\x6e\xce\x7e\x57\x60\xec\x26\xf2\x73\xae\xb1\xe9\x67\x32\x6b\x31\x5d\xee\x9b\xcd\x82\xde\xf1\xda\x49\xbb\x54\x25\x3a\xcc\x68\xed\x7e\xae\xdc\x2e\x91\xa9\xb8\x4c\x39\xa3\x61\x71\xbd\xb3\xe4\x34\xd5\x5a\xcb\xd4\xee\xf9\xc1\xf3\x3f\xbb\x12\x3b\xb3\x7c\xfe\x9c\xd5\x75\x2d\x73\x12\xcc\xd2\x6b\x3c\xf5\x63\x27\x02\x76\xb3\x4a\x79\x58\x9a\x92\xf5\x7a\x90\xcc\x85\xb5\xa8\x3a\x8d\x33\xc9\x92\x11\x12\xd6\xcb\xb3\xde\xd4\xc9\xb7\x76\xec\x56\x0d\xd7\xf3\x7b\x6b\xa5\x14\xce\x19\xae\x32\x2c\xf5\xe5\x28\xad\x47\xcb\x9e\x96\xec\x94\xcb\x83\x88\xf0\x1c\x98\x16\x7b\x8a\xd0\x80\x45\x2b\x9b\xab\x69\x08\x17\x69\xd3\x5a\x13\x09\x65\x4c\x7b\x02\x17\xb6\x36\x4b\x8b\x71\x39\x08\xe4\x71\x77\xd0\x40\x7a\xaa\xd2\x4c\xd7\xfe\xfe\xfb\x7c\xd0\x7c\x70\xd7\xa0\xbb\xba\xa6\xf2\xb2\x6b\xb2\x7a\x73\xac\xcb\x48\x21\x0e\xab\xd0\xa4\x50\x11\xa2\x06\xb7\x4c\x3d\x99\xc4\xa3\x79\xd6\xa9\x16\xdb\xcb\x56\x72\xb8\x59\xb5\x42\xb5\xb7\x9f\x29\xdc\x76\xcd\xea\x3c\xe8\x7e\x1a\x7a\xea\x3a\x45\x6a\xcd\x06\x2c\xb3\xc8\xe4\xf3\x5d\xda\x69\x8d\xa2\x8e\x63\x35\xea\x6c\xdd\xc9\xb3\x56\xd0\x73\xe5\xa9\x3e\xe2\x36\x9b\xa4\xa4\x61\x91\xcd\x88\xa0\xcf\x4b\xf6\x12\xae\x26\xf5\x51\x2e\xdf\xd9\xa4\xac\x51\xa5\x9b\x09\x6d\xc5\x13\x79\xdb\xf6\x2a\x39\x90\xf6\xb3\xdf\x1f\x7a\xf1\x2e\xe8\x6b\x67\xd0\x67\xec\x46\x9e\x4b\x76\xcd\xc2\xb0\x3b\x08\x85\x85\x36\x10\xd2\xb6\x3d\x1e\xd7\x06\xbd\xaa\x02\xd7\x05\x7b\x53\xa5\x9e\xbd\x9e\xa7\x46\xda\xb3\x57\xac\xd2\xf7\x42\xcf\x5b\x41\xb0\x2c\x2e\xaa\xb5\x3c\x52\xe7\x2d\x50\x22\x99\x25\xb2\xe0\x20\x19\x5a\x1b\x54\x1c\x94\xca\x26\x37\x26\xf2\x62\x1d\x74\x60\xa1\x5b\x5f\x95\x78\xaf\x86\x8a\x49\x6d\x51\xb5\x0c\xa3\x5a\xce\x0f\xcc\xe9\xb0\x29\x1a\x85\x46\xad\xdc\x4e\x76\xc6\xfd\x74\x0d\x9a\x4c\x4f\xeb\xdf\x1d\x7a\xe9\x2e\xe8\x5b\xe7\x56\x3f\x52\xc7\x1d\xc7\x2e\xd7\xb3\x99\x56\xba\x67\xe0\xb1\x89\x84\x61\xa0\xb5\xa3\x6c\x6f\x52\x6e\xf3\xd8\xcb\x21\x50\x47\x60\x91\x0c\x2b\xcb\x67\xe8\x33\xf7\x42\x0f\x27\x83\x75\x1f\x1a\x25\xb7\x9e\x1d\xe1\xd8\xcb\xf7\x67\xd6\x68\x94\x6e\xad\x2b\xed\x94\x82\xa5\xb1\xcb\xa7\x15\xd1\x14\xd2\x7d\x58\x16\x14\x63\x3c\x5e\xa8\xf5\xb8\x10\xe5\x2c\x17\xc9\x3e\xe3\xee\xba\x83\x17\x3d\x23\x53\x2f\xa7\xf2\xd9\xf6\xca\xaa\x86\xa2\x3c\x34\x3a\xe9\xc1\x77\x87\x5e\xbe\x0b\xfa\xde\x2b\xab\xef\xad\xe7\x48\xe9\x35\x92\x6a\xae\x3e\xf1\x43\x32\x17\xe2\x3e\x8e\x5b\x92\x9f\xeb\xc1\xe9\xcc\x14\x0c\x49\xeb\x86\xd5\x96\xd9\x0e\x6b\xcf\xd0\x67\xef\x85\x7e\xcc\x4b\x29\x6a\x8f\xea\xad\x1c\xe8\x57\x58\x57\xed\x17\x37\xd8\x4e\xa6\xd7\xad\xa5\xe4\x38\x42\xce\x2c\x0d\xfb\x2e\xa6\xc6\x08\x66\x9b\xf9\x8e\xb5\x89\xeb\x72\x6f\x60\x2e\xb2\xc5\x78\x11\x55\x9c\x31\x25\xdd\xd0\x48\xc5\x6e\x0f\x7a\x4d\x16\x29\x9b\x01\x5f\x8d\x3a\xbd\xec\xf2\xbb\x43\xaf\xdc\x05\x3d\x3d\x87\x5e\x34\xca\x43\x5d\x9e\xf7\x2b\xfa\xaa\x5e\x35\xe6\x59\xb3\x61\x17\x06\x3d\xd2\xea\x14\x63\x87\x8b\x43\xbd\xd2\x50\xbc\xbe\xbd\xe9\xb2\xd4\x31\xe0\xe4\xee\x85\xbe\x60\xa9\xe1\x6c\xd2\x6e\x8b\xf3\xe5\x64\xde\xb5\x95\xae\x18\x0b\x65\xa3\x8d\x9c\x6e\xa7\xae\xf7\xac\xba\xed\xe4\x66\xc2\x7a\x25\x2b\x41\x53\x0b\x82\x81\x1b\x6b\x2d\x27\x68\x56\x36\x0d\x67\xa8\x75\x32\x93\xfe\xa0\x59\x1a\x19\xa3\xa2\x63\x0c\xad\xce\x6c\x08\x17\xe6\x86\xac\x33\xdf\xdf\xea\xd5\xbb\xa0\x1f\x9c\x07\x9c\xae\xa4\x74\x53\xad\x20\xdf\xac\x28\x0b\x97\x52\xc2\x1b\xf3\x1a\x9e\x94\x7b\x6d\x61\x9e\x1f\x4f\x79\x7e\x59\x2b\x67\xfc\xd1\x10\xcb\xdd\x63\xc0\xc9\xdf\x0b\xfd\x0a\x95\x3a\x8b\xf6\x8a\x94\x5a\x45\x3a\xcb\x17\xa6\x5e\x4f\x4d\x57\xac\xa6\xcb\xf2\x8d\x6e\x3d\x4c\x05\x9d\x62\x6c\xca\xcb\x38\xde\x88\xc0\x53\x6a\x75\xd5\x1a\x56\x5a\x95\xb2\xca\xbc\xe4\xac\xb4\x8c\x55\x96\x2a\x4e\x9b\x69\xaf\x3f\xf2\x35\xd1\xe7\xa4\xba\xb6\xe5\x34\xcc\x7c\xff\x58\xaf\xdd\x05\xfd\xf8\xdc\xea\x9b\xa8\x62\x2e\x7b\xaa\x37\xf3\x2a\xbd\x94\x27\x6a\x8d\x51\x6a\x4a\xd9\xbc\xe5\x15\xd5\x4a\xd0\x2d\x0c\x48\xec\x7a\xf1\xa2\xba\xac\x8c\x8e\x56\x5f\xb8\x17\xfa\x70\x3c\x58\xb6\x71\x7f\x23\xcd\x79\x6b\x25\x9b\xfd\x85\x26\x37\x73\xb9\x6c\x6d\xca\xa6\x76\x75\x45\x19\x35\xa7\xd9\x70\x6e\xd0\xe4\x20\x94\xc0\xa8\x97\x9f\x00\xb7\x0b\x9b\x38\x6b\x6d\x8a\x8b\x40\xdc\x88\xa9\xae\xa6\x94\xb0\x2f\x0b\xed\x95\x57\x6d\xf6\x46\xe9\xa5\x97\x7d\x1a\x66\xaf\x57\x12\x97\xce\xf4\xdc\x50\x49\x3c\x9d\xeb\x39\x2e\xfb\x68\x58\xc3\x2a\xd1\x1c\xa2\x88\x48\x43\x88\x51\x05\x53\x28\xcb\xb2\x03\x29\x06\x8e\x2a\x12\x01\x10\xd1\xd1\x30\x07\x84\x43\x51\x21\x02\x51\x24\x55\x90\x98\x0c\x65\x85\x4a\xd2\x69\xa7\xee\xa2\xfa\x3e\xaa\x94\x04\xab\x82\xd4\x5c\x65\x29\x32\xbd\x1c\xab\x1b\x69\x53\x09\x07\x23\x05\x4d\x94\x21\xe0\x48\x4c\x56\x83\x81\xe6\x79\x19\xb0\x31\x77\x5b\x81\xde\x2a\xee\xaf\x9c\xe1\xf9\x74\xe3\x8f\xe7\x78\x9e\x1b\x3f\xc1\x61\x14\xd2\xd9\xee\xb4\xf1\xa5\xeb\xb9\x12\xdf\x57\xe1\x5e\x0b\x6c\x9c\x65\x6d\x93\x1d\x02\x7d\xae\x6c\xaa\x5e\x65\xbd\xce\x54\x17\xbc\x1b\x1b\x75\xc5\x19\x89\xc9\x38\x0b\x39\x35\x9b\x95\xf8\xb8\x24\xb3\x9f\x67\x51\xa7\xb3\xb9\xe9\x29\x2c\x3b\xde\x20\x23\xc8\xf4\xa7\x6a\xe8\x57\x87\x66\xce\x6c\x4a\xc1\x60\xe1\xd6\x95\x02\xea\xa4\xbb\x9d\x92\xb7\x6a\x3f\x23\x59\x72\xef\x34\xef\x5b\x7a\x22\xad\xa7\x67\x75\x55\x60\xe3\xcd\xb8\xd2\xed\x6c\x6a\xab\x3c\x58\x06\x6d\xd2\xe5\x69\x69\x83\x2b\x95\x55\xd8\x14\xed\x6c\x7b\xec\x1a\x65\xe8\x35\x16\x0b\x8b\x68\x05\xd5\x4f\xe2\x7a\xaa\x93\x1c\x2c\x60\x4a\x9d\xce\x69\xbc\x91\x5d\xb3\xd3\x9e\xa9\x46\xa0\xcd\x8a\x0a\xc5\xcd\xd1\x1e\xbf\xad\x3e\x99\xde\x9d\xd3\x68\xe9\x5b\xc2\x47\x4d\xc7\x2d\xc7\xea\xf6\x2b\x52\x36\x2f\x84\xa0\x52\x67\x95\xb2\xd0\x11\xd0\x80\x53\x38\xca\x56\x48\x2e\x99\x1d\x08\xfd\xe2\x70\x1d\xcd\x40\xa0\x6c\x3a\xa9\xfa\xa2\x5c\x9d\x8e\x1d\x61\xe1\x9b\xda\x22\x55\x9a\x7b\x66\x98\xf4\x5d\x61\x82\x9d\xb4\x9c\xc2\x0d\x1b\x15\xc6\xe2\xb2\xb8\x53\x27\x97\x9c\x19\xe3\x8a\x9a\xe9\x8c\xa3\x1a\x4e\x85\xed\xae\xed\xa6\xe1\xa8\x18\xb2\x61\x4a\x88\xb9\x94\x8d\x65\xbd\x50\xc2\x52\xb3\xec\xb9\xeb\x9e\xe3\x6b\xd3\xec\xa2\x38\x5d\x08\x79\xbb\x5e\xc8\x1b\x69\x3b\x36\xf4\x9e\xeb\xa6\x61\xb6\xef\x08\x93\x9c\xd0\x4f\xcd\x5a\xf3\x45\x7a\x79\xa7\xbd\x3d\xe3\xad\x2f\xef\x9d\xb6\xdc\x5d\xf4\x73\xf6\x5b\x33\x4b\xc5\x4a\xbe\x33\xa5\x49\xec\x4d\x2a\xdc\x85\x24\xc5\xc7\xab\xb4\x0e\x4a\x5e\x7f\x34\x52\xbb\x46\x37\x23\x0d\x94\xf2\x10\x55\x7d\xd3\x66\x45\x98\xee\xb3\xe2\x44\x1b\xc3\xc1\x86\xae\x4d\x39\x59\x49\x56\x85\x14\x5f\x77\xe6\x76\xd4\xa6\xfd\x0d\x80\xc5\x25\x2d\x2d\x97\xfb\xa4\x71\x31\x97\xa7\x15\x4f\x8f\xa4\x9a\x54\x13\x7b\xe5\xca\xaa\x4a\xd6\xc9\x49\x1e\xb1\xda\xac\x91\x52\x1c\x69\x60\x67\xe3\x85\x31\xe6\x98\xf9\x47\x7b\x29\xcb\x23\xee\xa2\xd1\xd4\x2f\xaa\xcd\xc2\x24\x9b\xe2\x03\x8a\x94\x6a\x37\x32\xca\xe5\x4d\xa7\xad\x2e\xdb\x6e\x3f\x8d\x33\xb1\x64\x4a\xbb\x2a\xba\xbf\x7b\xa8\x78\x74\x22\xfd\xcc\xfe\x76\xd7\x8e\x34\xdd\x6e\x5b\x07\x9a\x8c\x10\xa7\x99\xe1\x37\xe3\x41\x65\x51\x8b\xb2\x4a\x7a\x58\x34\x91\xc5\x35\xd6\xae\x3a\x85\x62\xb2\xe4\x4a\xa5\x45\xcb\x4e\xf6\xf5\x48\xd9\xf5\x57\x3e\xdf\x6e\xef\xf7\x40\xea\xe5\xac\x5a\xa8\xae\xba\x0e\xca\x54\x46\xed\xf2\x02\xcd\x87\x9b\x50\xc6\x31\x34\x70\xc5\x30\x40\x28\xa5\x11\xac\xb7\x5b\x35\x37\x1a\xee\xfb\x37\xef\xeb\xab\xde\xd1\xc9\xd3\x17\xb7\x32\x16\x9e\xdb\x53\xb3\x70\x3c\x2c\x4c\xc7\x5a\x03\xf5\x94\xb1\x2c\xf5\x58\xbd\x0c\xeb\xba\x31\x32\x96\x3d\x37\x5a\x8c\x79\x5c\x49\x22\xaf\x9a\xa9\xa2\x61\x61\xd0\x1a\x6f\xb4\x4e\x01\x8b\xd5\x9e\x2a\x66\x78\x65\x30\x1d\x4f\x04\xc9\xa5\xe3\xe4\xa4\x97\x0f\xba\x0e\x11\x4d\x3f\x3b\x1f\xc6\xcd\xda\x09\xbe\x77\x46\xfe\xf7\xe2\xf4\xd3\x0b\x4e\xf7\x6f\x4f\xba\x1c\xa7\x05\xf0\x11\x4e\x1e\x8f\x96\x7e\x30\x9e\xe1\x30\x9c\x0d\x03\x1c\xf2\x0b\x9c\x9a\x3c\x8c\x12\x8d\x6c\x3e\x61\xed\x89\x13\x7f\x25\x1a\x7c\x16\xf1\x29\xe1\x41\x02\x02\x41\xfa\x88\x20\xc7\x0f\x28\x0f\xe9\xcc\xf7\x3c\xbe\x8a\x26\x38\xf6\xe8\xf0\x5c\xd0\xee\xed\x44\x1f\x61\xb6\x5f\x9c\x39\x9c\xfe\x09\x2f\xb7\xff\xff\xdd\x1d\x16\xfa\x3d\x72\xa7\xfc\xf7\x3f\x13\x60\x7f\x76\xe8\xf7\xc3\xeb\x5e\x7f\xff\x33\xb1\xbf\xbf\xfb\x72\x88\xc3\xdf\xff\xdc\xbf\x1b\x69\xf7\xe5\xff\x1e\x88\x1d\xce\x3f\x46\x38\xc5\xab\x68\x15\xba\x9b\x0f\x92\x07\x3c\xe4\xc1\xe2\x3d\xe2\xdf\xfe\xf7\x43\x50\xe0\x30\xda\xbd\xd4\x83\x1d\x0e\xd7\x5f\x80\xe2\xee\x45\xab\x0f\xe8\x71\xc8\x8a\x71\x40\x87\xee\xe2\x70\xf3\x4a\x97\x1c\xfb\x40\x38\x00\xb2\x83\x23\xf8\xfd\xcf\xc4\xef\x0b\x41\xf8\x8f\xf0\x1f\xf0\xfb\xe1\x06\x8d\x83\x80\x7b\x91\xb9\x6b\xda\xef\x7f\x26\xb4\x97\xdf\xa7\x77\xef\x5d\xd9\xe2\xf6\x7f\x3f\x03\x79\x84\xf4\x99\x72\xcb\x58\x55\x54\x26\x73\x47\x72\x38\x47\x50\x11\x19\x47\x8c\x41\xa6\x2a\xaa\xac\x70\x51\xc2\xb2\x24\x30\x24\x49\x58\x53\x1c\xc7\x71\xa8\xa6\x22\x26\x02\xa2\x61\x55\x94\x15\x8e\xb8\x40\x0f\x1a\x3d\xf3\xdd\x5a\xf1\x8b\x0e\x7c\xbe\xb3\x6b\xfb\xd6\xe4\x5e\xdc\xfa\xdf\xb3\xe7\x43\x0f\xcf\xb6\x7a\x21\x59\xe0\x1c\x49\x9a\x48\x15\x20\x53\x09\x70\xc2\x30\x93\x44\xc6\x28\x54\x18\xc7\x12\x53\x98\xec\x40\x20\x62\x0e\x15\x2c\xa8\x44\x81\x0e\x00\x8c\x69\x12\xe5\x2a\x60\x1a\xfe\xfd\xb7\x0b\x12\xae\x60\xe0\x08\x50\x25\x58\x92\xa8\xa4\x30\xc8\x28\x46\x40\xd6\x00\xe2\x1a\x95\x31\x94\x35\xa4\x42\x07\x10\xa6\xc8\x8e\x8c\xa8\xca\x45\x4d\x13\x14\x05\x70\x8c\xb7\x72\x15\x00\x31\xfa\x3c\x06\xc2\xd7\xd7\xf7\xfc\x38\x9a\xc5\xdb\xe7\x7e\xc7\xdc\x51\x35\xa8\x12\x89\x88\x10\x51\xe8\x10\x05\x0b\x40\x26\x08\x6c\xf5\xa4\x8a\xc6\x45\x51\x61\xaa\xa6\x08\x40\x86\xaa\x84\x20\x84\x9a\x04\x24\xc2\x88\xc8\x24\x81\x52\xf4\xfb\x87\x10\x06\x98\x38\x40\x84\x1a\x17\x20\x52\x01\x62\x1a\xe0\x14\x68\x18\x71\x24\xaa\x84\x43\x8c\x65\x51\x16\x31\x97\x45\xae\x31\x55\x84\xaa\x20\x09\x50\x95\x88\x88\xb0\x22\x00\x45\x63\x9f\x41\xf8\xde\x13\x38\x8f\x46\xf8\x71\x6d\x7f\x13\xe1\x7b\x5b\xfd\x4b\x23\xfc\x31\x3f\xfe\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\xef\x86\xc1\xee\xaf\xff\x67\x5f\x1a\x5d\x99\x1f\xbd\xf2\x36\xa1\xcf\xce\x8f\x9e\xbc\x51\xe8\x11\x9b\xa0\x84\xaf\x89\x7b\x5e\x88\xf0\x25\xd7\xaa\x7f\xf9\x9a\xd0\x20\x44\x48\x81\x00\xc9\xaa\x24\x2a\x8a\xa4\x02\xe5\x6b\x02\x2a\x4f\x40\xed\xc4\x68\x5f\x13\xea\xd3\x47\x70\x56\xb9\x5d\x6c\xd4\xed\x07\xf8\xf7\x8d\xba\xf9\x1d\x0a\x5f\x5a\x8d\xec\xd5\x46\x3d\xbd\xa4\x42\x7b\x6a\xd4\x8f\x6a\xce\xf7\xe9\x23\x74\xde\x47\x1f\x6d\xce\xbd\x26\xf7\x7d\x7a\xe7\xa9\x35\xc2\x49\x73\x9e\x36\xd9\xbd\xe1\x9a\xd7\xde\x82\xf4\x69\xe7\x3c\x7d\x13\xd2\x33\x56\x10\x29\x22\xd7\x34\x24\x6a\x44\xe3\x8e\xc2\x08\xd6\xb0\xc4\x08\x42\x48\x23\x8a\xea\x30\xac\x3a\x48\x54\x14\x85\x08\xd8\x41\x88\x60\x51\x56\x31\x93\x28\x60\x8e\x26\xca\x4c\x64\x87\x23\xe1\x2f\x16\x39\x2a\x67\x93\x9c\x69\x37\x95\x06\x26\x28\x15\xd6\xd1\x70\x69\x09\x93\x1e\xc0\xeb\x99\x2f\x68\x96\xb1\x5a\x98\x99\xb5\x2d\x45\xe9\x1c\xcd\xb4\x17\xcb\xbc\xb6\x44\x83\x28\xb0\xbd\xfe\xa5\xb9\xc8\xf3\xeb\xea\xab\x05\x76\x93\x88\x99\x7b\xe4\xf7\x52\x49\x7a\xc6\xef\x83\xf2\x5f\x2f\x7f\x5e\xc6\x5d\x90\x45\x2c\x01\x59\xe4\x04\xcb\xa2\x03\x29\x23\x98\x11\x55\x92\x89\x83\x44\x51\x15\x55\xc9\xa1\x32\x94\xa1\xa8\x60\x86\x11\x67\x48\xa3\x8c\x39\xc0\x91\x35\x00\x05\x84\xc8\xe1\x28\x3e\x7c\x8d\xfb\x4f\x6a\xf7\xa3\x70\x57\x4f\x76\xc9\x17\xbf\x03\xee\x90\x21\x59\xa2\x88\x8a\x9a\x83\x14\x59\x52\x00\x73\xb6\xa8\x53\x2c\x43\x09\x20\x4d\x96\x1d\xc0\xa1\xac\x61\xe8\x48\x02\x65\x44\x56\x29\x87\x9c\x0b\x1a\x56\x1c\x15\x8a\x12\xde\xe3\x8e\x1e\x8e\xfb\xad\xed\x7e\x14\xee\xca\xc9\x79\x9a\xf3\xe3\x8b\x8f\xc0\x1d\x00\xc4\x35\x41\x00\x02\x13\x34\x8c\x09\x11\xa1\x26\x6a\x82\x26\x21\x15\xc8\xaa\x2a\x33\x45\x51\x28\x94\x01\x44\x88\xca\xa2\xa2\x3a\x02\xd5\xa0\x8a\x15\x8d\x53\x91\x43\x45\x44\x7b\xdc\xc5\x87\xe3\x7e\x6b\xbb\x1f\x85\xbb\xb4\x7c\x57\xd0\x5d\xb8\x13\x26\xaa\x32\x23\x8c\x01\xc8\x44\x19\xa8\x82\x22\x2b\x02\x15\xb1\x84\x15\xae\x31\x99\xab\xb2\x44\x31\xd4\x28\x11\x05\x2e\x43\xa6\x60\xec\x28\x00\x43\x87\x73\x89\x20\x99\xf1\xc3\x0b\x12\xde\xc4\x3d\x13\xfb\xc8\x8f\x44\x69\x9e\xa9\xe6\x56\xb3\x5a\x0a\xf9\x86\x95\xdc\x08\x4a\x7d\xed\x86\xc2\xc4\xa9\xe4\x7b\xd3\x5a\x67\x10\xc4\x8d\x64\x73\xff\x80\x32\x0d\x0f\x87\xba\x2f\xbe\x8d\xe0\x43\xb8\x67\xef\x93\x3f\xa5\xb7\xc9\xff\xb8\xbd\x63\xa2\x51\x87\x72\x48\x44\x2a\x0a\xa2\xc0\x54\x42\x64\x45\x56\x19\x03\x9a\x48\x18\x21\x02\x55\x44\x20\x2b\x02\x60\x84\x20\x82\x01\x77\x34\x55\x55\x80\x23\x23\xbc\x3f\x34\x8d\xde\x8b\xef\xba\xd2\x33\x55\x5d\x19\x4d\x06\xb9\x2a\x07\xac\xd5\x52\xda\x06\xcd\xd6\x56\x72\x2d\xb5\x9c\x18\x73\x8a\x5a\x59\x41\xc2\x25\x54\x74\x85\xda\xf7\xc0\xfd\x16\xf9\xdf\x1b\x77\xaa\x60\x82\x54\x11\x39\x00\x03\x2a\x3a\x5c\xd1\x18\xa7\x1c\x38\x8e\x40\x54\xa4\x09\x8e\x82\x35\x86\x44\x2a\x2a\x94\x30\x85\x23\x09\x20\xd1\x51\x08\x54\x1d\x19\x30\x87\xee\xde\xe7\x84\x2e\xc6\xf7\x9f\x64\x6f\x97\x70\xbf\x45\xfe\x58\xfc\xbe\xb8\x4b\xdc\xd1\x28\x90\x09\x91\xa1\xc4\x20\xc3\x10\xaa\x82\x20\xa8\x84\x39\x82\xc8\x54\xa0\x2a\xb2\x8a\x24\xc4\x39\x74\x28\x56\x44\x49\xa1\x2a\x97\x80\xec\x10\x4e\x34\xc1\xd9\xef\x01\x42\x17\xe3\xfb\x4f\xb2\xb7\x4b\xb8\xdf\x22\xff\x7b\xe3\x0e\x55\xa4\x60\x81\x20\xc6\x1d\x48\x21\x63\x0e\xa3\x8c\x4b\x44\x14\x89\x03\x54\xa6\x60\x41\xc0\x1a\x82\x2a\x53\xb7\x99\x8e\xa0\x38\x18\x12\x22\xcb\x4c\xa4\x2a\x82\x32\xa0\x87\x7d\xeb\xef\xc4\xf7\x4f\x6e\x4a\x78\x48\x9c\xc9\xdd\x27\xff\x7b\xc7\x19\x2e\x3a\x9c\x10\x19\x63\x22\x39\x2a\x62\x8e\x48\x05\x8d\x88\x8e\xe0\xc8\x44\x95\x55\xc5\x11\x04\x55\x95\x05\x59\xe3\x9a\x26\x73\x41\x26\x18\x2b\x12\xc6\x14\x32\x15\x03\x8d\xca\xea\x1e\xf7\xb7\xe3\x7b\x66\x90\x4a\x8f\xd4\x36\xd2\x96\xa3\xa2\xd0\x08\x34\xd9\xa7\x8a\x3d\x0d\xa2\x21\x1c\xa5\x57\x9a\x69\xd7\x98\x36\x6e\xb7\x73\xc5\xa0\xd7\x78\x5c\x7c\xcf\xdd\x27\xff\x7b\xe3\x8e\x24\x99\x73\x2a\x38\x40\x44\x90\x10\x42\x30\xd0\x18\xa3\x54\xd0\x90\xc2\xa1\x0a\x25\x84\x45\x46\x55\xae\xa9\x8e\xa3\x28\x4c\xe2\x1a\xe3\x5c\x10\x01\xe1\x12\xd0\x10\x56\xc0\xe1\x65\x24\x0f\x8f\x33\xa7\x7e\x5e\x3c\xeb\xc7\x0f\xe1\x9e\xbf\x4f\xfe\xa8\x75\x9b\xfc\x8f\xd7\x4d\x80\x41\x59\x64\x1a\x87\x1c\x21\x59\xa4\x50\x73\xb0\x23\x63\x99\x53\x55\x90\xb0\x8a\x55\x2e\x63\x51\xe6\x10\x01\x4d\x66\x58\x10\x05\xc1\x81\xda\xf6\x13\x53\x54\x45\x80\x87\x57\x6a\xbc\xc6\xfd\x81\xed\x7e\xd5\x8f\x1f\xc1\xbd\x70\x9f\xfc\xe1\xf2\x36\xf9\x1f\xc5\x5d\xc4\x00\x53\x41\xe6\x9a\xa8\x2a\x02\x10\x34\x4d\x96\x34\x02\xb8\x2a\x20\x81\x70\x20\x33\x47\xd2\x44\x91\x4b\x8a\x0a\x64\x0a\x18\x51\x20\x54\x25\x8d\x8b\x5c\xc5\x98\x09\x7c\x97\x47\x2a\x17\x71\x7f\x60\xbb\x4f\x76\x6e\x7d\x1c\x77\xe3\x3e\xf9\x83\xca\x6d\xf2\x3f\x3c\x3f\xe3\x60\x4d\xc6\x84\x73\x02\x38\x24\xca\xf6\xa3\xa8\x30\xd5\x51\x00\x40\x14\x4b\x0c\x71\x4d\x52\x90\x28\x4b\x90\x22\x95\x20\xa8\x62\x2e\x43\xac\x52\x81\x6c\x07\x63\x05\x1d\x5e\x6f\xf0\xf0\x3c\xf2\xee\x38\x53\xbc\x4f\xfe\xf7\x8e\x33\xd2\xb6\xdc\xe7\x88\x29\x54\x15\x1d\x46\x14\x8d\xc9\x0a\xd0\x34\x08\xa9\x04\xf1\x76\x10\x85\x0e\x93\x80\x0a\x18\x65\x22\x42\xd8\xd1\x80\x40\x99\xa0\xa8\x32\xc0\x9a\xa4\x10\x78\x38\xa4\xff\x1a\xf7\x07\xb6\xfb\x55\x1d\xf6\x11\xdc\x4b\xf7\xc9\x7f\x15\x67\x3e\x85\xfb\xd5\xb9\xe5\xc7\x4c\x2c\x7f\xef\x59\xe5\x82\xa9\x1a\xb5\x45\x6d\x4c\xca\xd0\xd0\x51\xa7\x3d\xaa\x07\xe5\xe9\xa8\x0b\x80\x53\x50\x43\xb3\xa8\x4c\x41\xae\xbe\x2c\x75\x52\x7a\x17\xe9\xcf\x5b\x6f\x77\xd7\xab\x03\x91\xe7\xf8\x04\x73\x4b\x36\xb9\x8d\x07\xa3\x55\x05\xb7\xaa\x9a\x9c\xde\x38\xa1\xc6\x01\xf5\x03\xab\xdf\xdd\xa4\x3b\xa5\x71\xde\x2f\x2b\xe3\xc5\x78\xdf\x01\xb6\x14\x94\x4f\xf9\xed\x67\x73\xb6\x9d\x9c\xc9\x6e\xe6\x8b\x71\x2d\x5d\xf3\x2d\xbd\xe4\x3a\xd5\x7a\x37\xeb\x9b\xc3\x45\xb4\xa6\x4d\x34\xc9\x57\x33\x35\x49\x18\x8c\x59\x98\x37\x70\xda\xea\x2c\x81\xd4\x48\xb5\x87\x1d\xd0\x1d\x8c\x03\x90\x49\x57\x73\xa2\x85\xf3\x6d\x58\x9e\xd2\x10\xf5\x97\xe6\xd4\x25\x62\xb3\x1e\x54\xcc\x2f\x5f\x13\x5f\x8a\xa8\x39\x1b\x83\xa9\xa4\x20\x28\x4f\x27\x70\x53\x91\x22\x31\x85\x47\x9b\x3a\xe2\xab\x60\x63\xcb\x75\x3f\x68\x2f\xad\x64\x8b\xb4\xc0\xb3\x62\x6f\x60\x70\xb4\x8c\x17\x87\x2e\x4e\x68\x97\x97\xac\xec\x47\xce\x6e\xe9\x0f\x98\x5d\xb3\x82\x75\xb3\x7e\x87\x7c\x5d\xff\x79\xb3\x5c\x97\xa2\xe5\xf7\x5e\x42\xb8\xdd\xc9\x5e\x1d\x7d\x3d\x6f\x8e\x0d\x33\x29\xdd\x16\xa5\x5e\x3a\x8b\x22\xa3\x9d\xb7\x85\x3a\xd2\x41\x85\x8f\xab\x6a\xa9\x2e\x7b\x96\xa0\x6b\xbc\xe3\xb2\x75\x31\xda\x47\xd9\xeb\x4e\xa6\x37\x72\x7d\xb7\x4f\x78\x7e\x99\x09\x83\x72\xda\x2b\x17\xe3\x30\x05\xa4\x76\x54\xca\xa6\x83\x81\x1f\xc6\x43\xb3\x96\x6a\xc9\xdd\xd6\x48\x8c\x96\x9d\xf5\x30\x54\x5a\x51\x43\xcc\x54\xf8\xca\xae\xc8\xa5\x39\x75\xe6\xa5\xb2\x00\x3a\x93\xf4\x78\xbc\xf4\xc4\x81\x5a\x2d\x3a\xa3\xe2\x6e\x21\x32\x3f\x9e\xd5\xfa\x76\x3c\x6d\xae\x37\x24\x20\xc3\xce\x62\x53\x2f\x36\xf2\xa9\x42\xc9\xad\xcb\x70\xa4\x34\x3d\x0b\x2d\xb5\x99\x3e\xac\x28\xbd\x67\xc5\x7e\xbe\x93\xdd\x6b\xe4\xf7\x3a\x59\x65\x69\x4e\x67\x0f\x74\xb2\x1f\x39\xa5\xf9\x21\x27\x7b\xf0\x7a\xd1\xed\x4e\xf6\xea\x90\xf3\x79\x73\x3e\xf1\x7a\x98\x1d\xfd\x75\x27\x4b\xa7\x4a\xe9\xc1\xa2\x58\x51\x84\x81\x99\x2e\x0e\x41\xd3\xb6\x34\x92\x9c\x24\xf5\x59\x7f\x23\x64\xca\xd9\x9a\xdb\xca\x37\xda\x20\xa4\xf5\x41\x9c\x16\xb0\xb7\xae\x2c\x2b\x75\x39\x94\x1a\x2e\xce\x2c\xa3\xac\xb7\x0a\xab\x1e\x16\x60\x9d\xb5\x6a\xe5\x89\x01\x31\xaf\xe8\x6b\xd5\xd8\x3a\x82\xd9\xec\xd3\x6a\xce\xdb\xb0\x09\xb5\x92\x79\xac\xce\xdc\x56\x76\x32\x55\xed\xd2\xcc\x5f\xb4\x28\x84\x23\xdb\x8c\x0b\xd8\x11\x4b\xf9\xe3\x4b\x5f\x7f\xbe\x93\xdd\x6b\xe4\xf7\x3a\x99\x09\xc6\x72\xfa\x91\x23\xd9\x0f\x9c\xcf\xfb\x90\x93\x3d\x78\x71\xf0\x76\x27\x7b\xe3\xa4\xd6\xfe\xfa\xc4\x3b\x94\x76\xf4\xd7\x9d\x2c\x5b\xb4\x63\xb6\x89\x47\x8e\x9f\x64\x8d\x62\xa9\xdb\x25\x40\x6e\x8c\xcc\xb4\x69\x76\xc3\xfc\xca\x6b\x7b\x75\xc1\x28\xf1\x91\x33\x87\xd6\x20\xdf\x8a\xcc\xb8\x0b\xcb\x41\xdb\x6a\xf4\xd7\xf5\x74\x21\xd9\x59\x38\xcc\xef\x2e\x33\x55\x3a\x53\xa5\x61\xb6\x4e\x32\xd3\x11\xa9\xf6\x2a\x3b\x47\xc8\xca\xf5\x5c\x1a\xf4\xe7\x41\x94\x99\x94\x0a\x6d\x5b\xc7\x45\xd2\x65\x6a\x69\x50\xdc\xac\xc6\xbc\x6a\x94\xca\x65\xce\x57\x76\x09\x1c\x17\x3c\x7f\xbe\x93\xdd\x6b\xe4\xf7\x3a\x59\x59\x4c\x5a\xfd\x47\x3a\xd9\x0f\x9c\xbc\xfd\x90\x93\x3d\x78\x25\xf8\xf6\xe3\x90\x6f\xd4\x64\xbb\xd4\xea\xb6\xe3\x90\x28\xf5\x7c\x1d\xf9\x9d\x1c\x5f\x4c\x6b\xe3\x69\xb9\x03\xe7\x68\xa1\xd4\x9c\xb5\x5a\xad\xf0\x71\x8e\x08\xcd\x66\x51\x72\x57\xf3\x71\x11\xa4\xfd\x41\x37\xb0\x23\x65\x60\x0b\x32\xac\x91\xf1\x10\xb2\x46\xb3\xe5\xf0\xac\xbf\xa0\xa0\xaa\x63\x67\x98\xed\xae\xa2\x61\x5b\x9f\x84\x66\x3c\x9a\xa4\xa7\xeb\x51\x5a\xef\xed\x9c\x62\xd1\x1a\x46\x0b\xa6\x47\xf5\xc1\xa0\xdb\x5f\xad\xca\x1d\x4f\x66\xc4\xef\x53\x7f\xb6\x06\xc6\xd4\xec\xce\x17\xb4\x6c\x26\x25\x62\x45\xc7\x4d\x1e\x97\x1d\xae\xf7\xb2\x53\x5f\x38\xdc\x0e\xbb\x7d\x16\x70\x62\xa6\x37\xd4\xaf\x25\xfb\xd8\x17\x57\xae\x2b\x3b\x7f\x5e\x38\xfc\x43\xe4\x5f\x09\x36\x1f\x91\xff\xe8\xd9\xb4\x9b\x76\x3b\x3d\x5a\xfe\x6b\x3c\xde\x0e\x38\xd9\x23\xcd\x67\xe5\xe7\xdb\x2d\x70\x60\x6e\x76\xc4\x3c\xe0\x43\x5b\xd6\xd7\x5a\x06\x54\xc3\x42\x6e\xb0\xa0\x82\x22\x08\x2d\x4d\xed\x8d\xc4\xa9\x39\x9e\x6a\x35\x45\x1a\x67\xd0\xe2\xa4\x2b\x8e\x0e\xb7\x3c\xc7\xef\x83\xa3\xfe\x43\xb7\x48\x64\xa3\xc1\x62\x99\x8d\xed\x8e\x5e\xd3\x94\xba\x50\x6f\x46\x2d\xb6\xb4\xb2\xc6\x2c\x9b\xca\xb4\xf8\x6c\xc3\x6a\xd5\xee\xc4\xf7\xa8\x6b\xee\xce\x97\xff\x9c\x80\x94\x7b\x96\x5f\x33\xdb\xa4\x58\x4c\x0a\x26\x77\x37\xab\x81\x47\xb3\x45\x51\x2e\x1b\xeb\x74\x04\xa4\xa4\xa1\x41\x4f\x48\xd6\x11\x54\x4b\xda\xc6\x9a\x40\x67\x50\xea\x40\xcf\xf1\x50\xbe\xe8\x9b\xed\x10\xce\xdb\x42\x32\xd3\x9a\x05\x02\x14\x30\x4c\x2b\x7a\x45\x36\xca\x81\xe8\xa5\x4d\xbd\xb8\x0f\x1a\xe5\x98\xa6\xec\x32\x58\xa5\x6b\xcc\x55\xfa\x70\xc4\x32\xad\x05\x09\x29\xd3\xfb\xab\x2c\x09\x15\xdf\x4e\xf6\x86\x4b\x6d\xe4\x83\xa3\x75\x3d\x2a\x20\xdd\x50\xeb\x3f\x34\x20\xdd\x29\xff\x81\x01\xe9\xde\x65\xc4\x7b\x03\xd2\x43\xe4\xdf\x11\x90\x3e\x2b\xff\xa7\x07\xa4\x07\xef\x1d\xba\x3d\x43\x7a\x63\x42\x6d\x1f\x90\xea\xed\x76\x63\xff\xf9\x13\x69\x66\xf7\x9d\x0c\xc9\x4e\x79\x64\xe2\xab\x65\x7d\xdc\xb0\x1d\x95\xd6\x6c\xdb\xd5\xb3\xdd\xf5\x60\x95\x2c\x82\x3e\xeb\xf8\x15\xb1\x3d\x10\x73\xe5\xaa\xae\x97\xba\x79\x2f\xa2\xd1\x28\x53\x5c\xd7\x44\x1a\xb6\x5b\xeb\x25\xee\x20\x58\x4a\x8d\x79\xad\xd3\x23\x6b\x09\xa6\x47\xae\x35\x6c\xa6\xe4\x9a\xbf\x0b\x1a\x2b\x39\x14\x6b\xa9\xcc\x60\x55\x95\x24\x14\x8a\x55\x95\x0c\x24\x03\xcd\x99\x55\xa9\xab\x8b\xae\x28\xe8\x40\x53\xca\xd5\x9e\x75\xa2\xd8\xaf\x92\x21\x9d\xbc\x9c\xe2\xf4\xfa\x61\x19\x52\xe6\x76\xf9\xdf\x65\xbd\xf1\x13\x01\xe1\xd1\x19\xd2\x67\xd7\x3b\x75\xfd\xce\x0c\xe9\xf6\x97\xab\xec\xbb\xe2\xde\x80\xf4\xe0\x4d\x75\xb7\x67\x48\x3f\x30\x20\x9d\x64\x48\x76\x01\x16\xca\xb6\xe6\xca\x80\x56\x84\x5a\x19\xb6\x2c\x61\xd0\x0d\x8c\x5c\x6f\xc4\x0b\x66\xbd\x9b\x6f\x4a\xa1\x97\x99\xdb\x52\xde\xab\xe6\x9a\x12\x6d\x87\x08\x58\x4a\xb1\x59\xed\xcb\x86\x21\xd7\x68\x1f\x16\x59\x46\xa0\xb2\xbc\x34\x07\x5c\x2c\xac\xeb\xea\x62\xb6\x5c\x82\x5d\xd0\xe8\x2e\x3c\x1d\x2b\xbd\x09\x88\x7c\x77\x50\x2f\x98\x68\xd5\xec\x65\x0c\x9c\x6d\x25\xc5\xc5\xda\xab\x77\xd7\x76\xab\x90\x4c\xc6\xf5\x54\xfe\xb8\x3f\xfc\x17\xc9\x90\xee\x0e\x48\x77\xca\x7f\x60\x40\x7a\xc8\x46\xab\x3b\x02\xd2\x8f\xde\xe8\xa5\xeb\x77\x66\x48\x3f\x3b\x20\x3d\x78\xb7\xe9\x27\xd3\xbc\x8f\x95\x6c\xfb\x46\x7d\x72\xd4\xbd\xe3\x15\x5c\xb9\x79\xda\x39\x2d\x5d\x8c\x67\x7d\x6b\x05\xbf\x56\x75\xb3\xc0\xc8\xa5\x5d\xd0\x52\xa9\x61\xc9\xde\xa4\x8f\xfc\x71\xce\x61\xd3\x48\x99\xce\xc7\x35\xa3\x18\xc1\x28\xae\x9b\xb8\xdf\x17\xdc\x4a\x6d\xd9\x12\x51\x45\x5d\x24\xbd\xa8\x54\x0b\x75\x91\x42\x9e\xee\x46\x5a\xa1\x37\x4b\x41\x2d\x6f\x8e\x3c\x82\x85\xda\x72\x17\x64\xca\x59\x3e\x0c\x35\x65\xbd\x8c\x90\xb6\xe1\x1d\xd0\x48\x65\x2c\x3e\x2c\xcc\x2a\x3e\x34\xb2\x4e\x3e\xe5\x07\xd1\x54\xa8\x0c\xd6\xbd\xca\xf1\x40\xd7\xe5\x00\x76\x66\x04\x57\x02\xd8\x29\xe0\x37\xac\x34\x95\xbc\x63\xdf\x5d\xb9\xde\x0e\x20\x0f\x94\x7f\x5b\x89\x77\xbe\x83\xeb\x97\x9b\x73\xd1\x5f\xee\xe0\xfd\xd1\xfa\x35\xfc\xbc\x3a\xb8\x3b\xc0\x3c\x78\x5b\xf5\x27\xa3\xe4\x67\x02\xcc\x27\x47\xd1\xdb\x32\xa4\xfd\xce\xc6\xb3\x00\x93\x7b\xd6\xb7\x96\x1b\x0c\x3b\x69\x33\x3b\x9a\x5a\xe6\x86\x56\xf3\xb2\xaf\xb2\x79\xcb\xa8\x84\x45\xd0\x19\x46\x51\x27\x97\xd2\xd3\x8d\x32\x36\x2c\x9a\x04\xf9\x79\x98\x4f\xc6\xae\x94\xe4\xe3\xb5\x98\xab\xaf\x63\x4d\xeb\xd5\xe5\x74\xce\xc8\x8b\xd6\x64\xb0\x36\xbd\xc6\x1c\x6d\x68\x36\xd0\x0e\x25\x9b\x54\x95\x15\x3c\x8f\x9c\x81\xa6\x55\x0a\xa4\xb9\xd2\x82\xa1\xef\xac\x0a\xc5\x5e\xc7\x9b\x4d\xe2\x7c\x30\xf7\x3a\xf3\x65\xe4\x0e\xbc\xc2\x71\xb9\xe2\x51\x01\xe6\x86\x55\xb6\x87\x06\x98\x3b\xe5\x3f\x30\xc0\xfc\x4a\x19\x82\x7e\x21\xc0\xfc\x40\xfd\x1e\x13\x60\x1e\x7c\x7e\xe0\xf6\x92\xea\x8d\xfd\x1c\xfb\xf3\xf3\xb7\x07\x8c\x3b\xa2\x78\x36\xc6\xfb\x1f\x59\xb9\x56\x66\xe8\x2f\x4b\xb4\x9c\xac\x8f\xd7\xd9\x64\x17\x55\x7d\x2a\xe7\x47\xf2\x04\x4f\x7a\x8b\xa9\xd1\x62\xc4\x42\x6a\x1c\x7b\x72\xa6\x2b\x55\x68\x8a\x96\xbc\x7c\x0d\xcf\xa3\x7e\xda\xf6\xf5\x65\xd6\x8b\x9a\x13\xa1\xb0\x49\x39\x4a\xc0\xeb\xb3\x2e\x2d\xf5\x1a\xac\x96\x9c\xe5\x68\xcb\x4b\xc1\xaa\x9e\xdb\x05\x09\xab\xa3\x84\xc6\xb2\xb6\x8e\x95\x78\xe0\xb1\x4d\x7a\x8c\x44\xbf\xd4\x9c\x59\x6b\x7b\x5a\xd5\x90\xc0\x3d\x2e\xb6\x32\xc9\x56\xc9\xf6\x8e\x9a\x5d\x0e\x40\x97\xcf\xf5\x7e\xb6\x0c\x3a\xe2\x71\x87\x11\xdf\xf6\x73\x4e\x7b\x7d\x9f\xb7\x12\x5c\x9e\x98\xbd\x1a\x58\x6b\xb7\xb7\xd9\x96\x82\xa2\xa0\xeb\x2f\x4b\x9d\x57\xcb\xd3\xef\x04\xd6\xc7\xc9\xcf\xde\x24\xff\x58\x7a\x3e\xfa\xac\xc9\x4f\x3c\xe3\xf3\xd9\xb3\x2e\xfa\x51\xfe\xe0\x26\xf9\xcf\x78\xde\xf8\x93\x62\xfa\x7d\x55\xd6\xc9\xf6\x88\x2b\xc7\x3d\x5e\x26\x12\x3f\x27\x49\x73\x9e\x47\x27\x55\xbf\x96\x44\xa6\x6b\xbf\x98\x7e\xe7\x36\x73\x1c\x03\x4e\xae\xbb\x13\x93\x1f\x51\xf9\xe4\x7f\x31\xfd\xd2\xd7\xf1\xdc\x5f\x1f\xda\x80\xfa\xd0\x83\x77\xb7\x27\x2c\xef\xbe\xc5\xfc\xe7\x24\x2c\x9d\xb1\x5c\x4b\x67\xec\x51\xd7\x38\xdb\x6b\x77\x6a\x1c\xc7\x84\xc5\xf0\x1d\x8e\xc8\x80\x8d\xd2\x4c\x96\x45\x3d\x98\x07\x65\x73\x04\x53\x2e\x16\x89\x89\xa5\xde\xa4\x90\xaa\x98\x4a\x9c\x6f\xd7\xcb\x9d\x26\x99\x81\xc9\x8c\x94\x33\x18\x90\x7c\x5d\xd2\x73\x5e\xc6\xc8\xa6\xf2\xeb\xd2\xa0\x3c\x44\x4d\xd7\xb2\x67\x65\x64\xe4\xeb\xe3\x4e\x6d\xff\x7b\x8b\x66\x0d\x4c\x9b\x7d\x31\xae\xc0\x66\xc6\x93\xb5\x39\x09\x07\xed\x79\x79\x34\x9d\x15\xc4\x51\xa6\x03\x87\xb5\xba\x3a\x2b\x2e\xbd\xee\x70\x75\xac\x52\xbe\x7b\xc2\xb2\x33\xbc\x9f\x93\xb0\x58\xb8\x39\xd3\x73\x45\xd9\xa2\xf4\x18\xbc\x4f\x8d\xff\x5a\xc2\x32\xb8\xbd\xcd\xdb\x84\x61\x3f\xe1\x75\x79\xee\xfd\x60\x0f\x97\xcd\xe4\x29\x40\x3f\x4e\x7e\xee\x26\xf9\xc7\x84\xe5\xd1\x87\x34\x7f\xe2\xe1\xd8\xcf\x1e\x12\xd5\x8f\xf2\x6f\x4f\x58\xf6\x09\xda\xcf\x49\x58\x84\x99\x3d\xd6\x6b\x23\x5f\x58\x6d\xae\x0e\x00\x27\x09\xfa\x6d\x09\xc1\x1d\xfa\xed\xae\x37\x12\x82\x8b\x3e\x7b\xbc\x4e\xec\xe3\x57\x1b\x70\x0d\x2a\x8c\xf7\xed\xb9\x7c\xed\xe8\x5b\x47\xfa\x4f\x8e\x89\xf7\xd8\x53\x79\xd0\x5d\xeb\xc6\xd9\xba\xe7\x65\xd7\xb8\x84\xff\x49\x7c\xfa\x85\x13\x48\x23\x97\x0a\x5f\xc4\xbc\x0f\xcd\xcc\x3c\xf8\xa4\xfb\xed\x89\xce\xab\x1f\x56\x3b\xfe\xf9\x13\x13\x9d\x4c\x72\x71\x28\x37\xf3\xfa\xd5\x39\xc6\x93\x44\xa7\x90\x59\x98\x75\x7b\x69\x44\x85\x82\x3c\x85\xd5\x12\x28\x16\x37\x28\x5f\x37\x0a\xad\x95\xd6\x59\x0f\xe6\x56\xd7\xb0\x6a\x55\x0b\xf4\x66\xe3\x94\xdf\xb4\x26\x51\x49\x8f\xab\x9e\x04\xf3\xfd\xa4\xad\x38\xc5\xe9\x82\x1a\x8e\x53\x31\xdb\x95\x4c\x3e\x6b\x65\x9b\x83\xbc\x17\x14\x6b\x95\x5d\xa2\xd3\x18\x04\x69\x32\x6b\x18\xb9\xf4\xb4\xd3\x21\x59\x3f\xb7\x5a\x0c\x88\xd3\x69\x35\x27\x5c\x27\x3a\x44\x45\xbf\xc3\x9b\xfe\x3c\x32\xc6\xef\x6d\x2f\x7c\x60\xa2\x73\xef\xcf\xe1\xdc\x91\xe8\x98\xb2\x7a\x10\xba\xd3\xe7\x95\x27\x5f\x4d\x74\xee\x5b\x94\x2f\xee\x47\xf3\x63\xa2\xf1\xda\x26\x3e\x92\x68\x3c\x44\xfe\x15\x9b\xfc\x70\xa2\xf3\xc0\xb7\x41\x5c\xee\x83\x1f\xf7\x36\x8a\x96\x7e\x21\x86\xbc\x97\xe8\x18\xc7\xe7\x6f\x4a\x74\xf6\x5d\xf1\x73\x12\x9d\x45\xb0\x3c\x4c\x19\xd7\xae\x36\xf4\x24\xb1\xff\xd5\x12\x9d\x34\xb2\xfa\xd5\xd4\xf5\xae\x39\xb1\x8f\x5f\x2d\xd1\x31\xcd\x5a\xd7\x79\x2f\xd1\xe9\xe9\xbf\x76\xa2\x93\x5e\x55\x95\x57\xe3\xc0\x49\x7c\xf8\x85\x13\x9d\x72\x36\x8e\x3f\x9f\xe8\x3c\xf8\xd5\x32\xb7\x6f\x33\x7e\x77\x09\xea\xe7\xfc\x2e\xdd\xc4\x37\xf7\xa0\x96\xf6\xdd\x77\xc9\xb2\x4f\xb6\x2d\x17\xc5\x8d\x6a\xb0\x55\xa6\x42\xb5\xde\x48\x29\x56\x7a\x22\x4a\x0e\xbc\xba\x29\x4d\x79\xab\xd2\x2c\xd8\x52\xc5\x9a\x1b\x61\x52\x70\xb0\xdf\xc9\x78\x99\x24\x28\x66\x50\x50\xef\x8e\x7a\x1d\xdf\x1d\x54\xbd\x5c\x3a\x3b\x6d\x5a\xab\x5a\xcf\xb1\x74\xcd\xac\xd5\x2c\x43\x6a\xb3\xe5\x7e\x93\x8d\x21\x4f\xe6\x8b\x38\xb4\xcb\xc8\x90\x27\x06\xac\x52\xbd\x5a\xee\x36\xe5\x36\x05\xfd\xc6\x52\x0c\xd7\x6e\xdc\x9b\x8f\xd2\x21\xa9\x76\xdf\x3b\x49\x79\x62\xe0\x3f\x6f\xfa\xfd\x64\x09\xe9\x21\x4b\x84\x3f\x67\x46\x2a\x1d\x34\xd8\xfe\xd1\x7b\x06\x05\xb6\xe9\xb4\x4e\xfb\xe3\xea\xbe\x84\xd3\x35\x9e\x1b\xb6\x72\xdf\xbd\x7c\xf6\x40\xf9\x37\x2d\x9f\x65\x8f\xcb\x4d\xf7\x0c\x82\xdf\x63\xdd\xff\xf5\xe9\x6c\x5b\x56\x5e\xb5\xa2\xf6\xdc\xe8\x1f\x3d\x08\xea\x40\x72\x37\x83\x8f\x0d\x82\xbb\xf1\xf2\xec\x3a\x99\x1d\xda\x63\xf7\xff\xb7\x25\x6b\x5d\x7f\xb1\x93\xf6\x8e\xf6\xdd\xbd\x31\xef\x47\xec\x9b\x29\xfe\x14\xfd\xf2\xfd\xa8\xea\xbf\xa7\xdf\xdd\xfe\xfd\xf3\x92\xdc\x7b\xfd\xfb\x0e\xfb\xee\x74\x06\x8b\xb7\x92\xdc\x4e\x67\x10\xa7\x5e\xcd\xfe\x3f\x5f\x27\x45\xd1\x1d\xf6\xff\x0b\xaf\xf0\x9c\xf5\x4f\xe6\xa6\xfe\xd1\x9f\xf1\xf9\x39\x13\x6f\xbb\x7c\xe3\xbd\x15\xc6\xef\x32\x89\xf1\x89\x49\x84\xf3\x57\x3b\xfe\xe8\x49\x94\x8a\xfe\xeb\x6e\x3c\xd6\x1f\x11\x7f\x6f\xd7\xcf\xca\xb0\xe5\xf2\xfe\xa3\x60\x8f\x7d\x2f\xe6\x3f\x3f\x66\xfe\x3d\x7e\xcc\x7c\x57\x44\xb4\xed\x52\xb2\xda\x5d\xe7\x52\x84\xb3\xfe\x72\xda\x30\xf3\xe5\xf9\x4c\x30\xb5\x56\x31\x4b\x85\xac\xbd\x18\xa7\x37\x75\x5e\xc8\xcc\xda\xca\x27\xb6\x01\xfc\xbc\x25\x50\xbd\x10\x95\xc0\xe0\x5e\x27\xd8\x4d\xb2\x1d\x92\xc2\x9f\x31\xbb\x7f\x5c\x3d\x79\xcc\x1e\xb4\xfd\xf3\x9f\x3d\xcf\xfa\x6c\x9f\x77\x0c\xba\x77\x0c\x82\xba\x3e\x2d\xe1\x13\x23\x6b\x9d\x3b\xc8\xf5\x22\xf8\xc4\x9f\x6e\x29\x42\x5f\x6d\xc9\xf8\x6c\x11\xfc\x38\xf9\xb9\x5b\xe4\xe7\x8e\x45\x46\xf1\xe4\xf9\xff\xd3\xb6\x24\x60\xe0\x35\xde\xdb\x92\x90\x79\x48\xfb\x96\xfa\xcb\xa4\xfc\x93\xe3\xcd\x3d\xf1\xaa\x3d\x05\xc9\xcb\x45\xf7\xc9\xb5\xfb\x3c\xfe\x29\xfa\xed\x26\x29\xde\x9a\x14\x30\xfc\xc6\x35\x63\x7c\x39\x29\xf5\xa3\x57\x52\xd2\x7d\x9c\x51\xdf\x5a\x49\xe9\xe3\x8c\xf2\xde\x4a\x4a\xe9\xa4\x3f\x7e\x5c\x91\xb9\x2b\x22\xb5\x0f\x4d\x22\x5d\xbc\x76\xf4\x54\xbf\xaf\x88\xf9\xd5\x77\x0f\x14\x1f\xd1\xbe\xbb\xed\xf3\x76\x7c\xb2\xcd\xa9\x69\x7f\x6c\xe5\xe6\xfc\x4c\xdd\x51\xdf\x7b\xec\xf3\xf6\xfc\xa4\x38\xee\x5a\x97\x8b\x84\x4f\xd8\xe7\x49\x40\xff\x6c\xff\x65\x63\xbc\xde\x33\xd9\x75\xdd\x95\x95\xdc\xeb\xba\x1c\xe3\xe9\x03\xe5\xbf\xea\xa0\xeb\xf2\xef\x1d\x6f\xee\x98\x04\x01\x25\x94\xbd\x1c\xcf\x2f\xe2\xf3\xc3\xf5\xdb\xad\x74\x9c\xbf\x6a\xe3\xca\x6e\xcc\xa7\xfc\xf0\xe4\x7a\x74\xfe\x77\x53\xfe\xf5\x70\xf9\x1f\xdf\x92\xab\x1f\xe5\x17\x6f\x92\xff\xdc\x88\x7b\xe2\xf7\x1d\xf9\x86\x5e\x72\x3b\xfb\x47\xf7\x41\xea\xbc\x6d\x6f\xfc\x3e\x44\x3c\x1b\x04\x98\x3d\xe4\xd7\x87\x5f\xb2\x7a\x9e\xd7\x38\xfd\x95\x87\x9d\x7a\xe1\xb1\x06\xb9\x30\x31\x72\x9d\xcb\xf3\x91\xef\xa5\x5e\xad\x8d\xf5\x57\x5c\x9e\x5a\xb8\x6f\x18\xa6\xd4\x8f\xbd\x88\x6d\x9b\x7b\xf2\xf7\xb7\xd9\x98\x3f\x37\x33\x63\x5b\x8d\x66\x5d\x2f\x5a\xcd\x77\x9a\xa9\x9b\xcd\x5c\xfd\x80\x8a\x6d\x99\xbd\x53\x8e\xbb\xdf\x5e\xd7\xb3\xd9\x13\x6e\xaf\x04\x26\xaa\xf5\x62\x45\xaf\xf7\x12\xe5\x5c\x2f\xf1\xc7\xe1\xae\xcb\xbe\x26\xb6\x14\x1e\x9e\xf2\x6b\xea\x87\xcf\x7f\x3c\x56\xf1\xf0\x0d\xad\xc3\xb7\x54\x7e\xa5\x28\xc1\xde\xf6\xff\x0f\x52\x8f\x60\xef\x92\x66\x4f\x02\x5e\x2a\xe5\xf9\x8c\x5f\xd0\x68\xc2\xd9\x80\x07\x43\x8e\x19\x0f\xc2\x97\x9f\xbe\xed\x3f\x85\x7c\xfe\xed\x21\xea\xbe\x60\x7e\x49\xf1\x37\xa4\x27\x5a\x56\xb1\xd6\xca\x25\xfe\x78\xfe\xf6\x53\x2d\x79\x0c\xde\x9f\x6c\xc0\xeb\x3e\x38\xdc\xc7\xe1\xf0\x95\xf6\xbe\xe3\x6c\xd5\xde\xff\xe7\x41\xfa\xee\x99\x5d\x52\xf4\x44\xcc\x4b\x0d\x77\x37\x2e\x98\xc9\x8c\x6f\xb5\xdb\xfd\xfb\x20\xe5\x76\xbc\x2e\xe9\x76\x14\xf2\x52\x35\x77\xf6\x35\x31\xf3\x83\xe8\xb5\x6e\x5b\x79\xe1\x70\x1e\xf3\x98\xbf\xf8\xf0\x28\x4d\x4f\x58\x5e\x54\xf8\x5c\xe4\xa5\x4e\xbf\xa4\x75\x18\x93\xc3\x7f\x1e\xa7\x69\x18\x93\x2b\x3a\x3e\x89\x79\xa9\x5d\xc0\xc3\x0b\xdd\x3d\x8f\xfd\x20\x9e\xba\x9e\xe3\x9f\xfc\xf9\x20\x25\x8f\x0c\x2f\x29\x7a\x26\xee\x43\x31\x2c\xa4\xb3\xfd\x63\xe1\xc9\x9f\x0f\xd2\xf6\xc8\xf0\x92\xb6\x67\xe2\x5e\x6a\x3b\x0f\x79\x74\xd1\xd7\xb7\x83\x35\x0f\x23\x1c\xf1\x93\x3f\x1f\xa5\xef\x33\xc3\x8b\xfa\xbe\x14\xf7\x52\xdf\xdd\xf7\x17\xc7\xd7\x28\x88\xc3\x68\xe2\x7a\x3c\x3c\xf9\xf3\x41\x0a\x1f\x19\x5e\x52\xf8\x4c\xdc\xd5\xd4\xc0\x0d\xc3\x98\x07\x5f\x13\x38\x0c\x79\x44\x7d\x76\xa1\x0d\xa7\x3f\xaf\x76\xfa\xe1\x51\xed\x38\x61\x79\xb1\x25\xe7\x22\x2f\x45\x89\x90\xcf\xbf\x26\xa2\x95\xeb\x31\xbe\xba\xd0\x82\xa3\xfa\x8f\xd6\xfd\x4d\xc5\xef\xd2\xfa\x2c\x45\x7d\xf9\xf1\x41\xfa\xbf\x64\x7a\xa9\x11\x17\xc4\x5e\x6d\xc9\x81\xf6\x72\x73\x0e\x36\x47\xf0\x04\x7b\x94\x87\x4f\xba\x17\xad\x6c\xae\xfb\x8e\xda\x99\x7a\x4e\x6f\xe6\xf6\xa4\xe7\x7c\x12\xb6\x75\xcc\x62\x5b\x8d\xa2\x55\x48\x90\x28\xe0\x3c\xf1\xc7\x81\xe2\x5f\x89\x8e\x91\xab\xe7\x9e\x3f\x27\xfe\xe7\xef\x84\x00\x9e\xae\xd7\x89\x26\x0f\xa3\xfd\x58\xbe\x6d\xc5\xcd\x5a\xbe\x64\xb3\x55\xf2\x90\xa7\xbc\x50\x31\xe4\x93\x89\xeb\x0d\x76\xbe\xf7\x35\x41\xe2\xf5\xf1\xc3\x2c\x70\xe9\x6b\x5f\xdc\x76\x03\x59\x87\x7c\x7e\xb3\x62\xcf\x1c\xb6\x3a\x1d\x1d\xe3\x85\x5a\xd7\x53\xc5\x2d\xb9\xc3\xf9\xfd\x2a\x3c\x31\xd9\x6b\x71\x12\x60\x3e\xa8\xc8\xe1\xce\x7d\x8a\x9c\x32\xd9\x2a\xf2\x32\x11\xfe\xa0\x26\x21\x9d\x71\x6f\x71\xa7\x26\xa7\x4c\xb6\x9a\x84\x74\xf6\x49\x40\x8e\x03\xea\xdd\x9a\x9c\xf2\x39\x28\xf3\x94\x25\xbc\x54\x06\x87\xd1\x75\x85\x4e\x02\xc7\x7d\x1a\x9d\x33\xda\xaa\x74\x16\x1b\xdf\xc5\xa8\xea\x87\xd1\x20\xe0\x8d\x9a\xb9\xab\x85\x09\x0e\x79\x82\xc5\xd3\x59\x82\xfa\xd3\xd9\x84\x47\x7c\x27\xf6\xff\x0b\x00\x00\xff\xff\x46\x54\xa4\x4c\xed\xf0\x00\x00") func offer_idsCoreSqlBytes() ([]byte, error) { @@ -1050,86 +452,6 @@ func operation_fee_stats_3HorizonSql() (*asset, error) { return a, nil } -var _order_booksCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x67\x73\xea\xc8\xf6\x37\xfa\x7e\x7f\x0a\x6a\xde\xec\x39\xc5\x9e\x83\x5a\xad\x56\x98\xb9\x73\xaa\x24\x10\x51\xe4\xcc\xad\x5b\xbb\x5a\x1d\x88\x92\x40\x81\xf4\xd4\xf3\xdd\x6f\x11\x6c\x30\xc6\x36\x06\xec\xed\xf3\xff\x4f\x4f\x8d\x37\xa0\x66\xf5\xea\xdf\x0a\xbd\x56\x27\xfe\xf8\xe3\xdb\x1f\x7f\xc4\x2a\x5e\x10\xf6\x7d\x56\xaf\x5a\x31\x8a\x43\x6c\xe3\x80\xc5\x68\xe4\x4c\xbf\xfd\xf1\xc7\xb7\xcd\xf3\x54\xe4\x4c\x19\x8d\x71\xdf\x73\x0e\x15\xe6\xcc\x0f\x86\x9e\x1b\xd3\xfe\x2d\xff\x1b\x1c\xd5\xb2\x57\xb1\x69\xff\xe7\xe6\xeb\x27\x55\xbe\xd5\xcd\x46\x2c\x08\x71\xc8\x1c\xe6\x86\x3f\xc3\xa1\xc3\xbc\x28\x8c\xfd\x1d\x13\xfe\xda\x3e\x9a\x78\x64\xfc\xfc\xd3\x21\x9d\xb0\x9f\x43\xf7\x67\xe8\x63\x37\xc0\x24\x1c\x7a\xee\xcf\x80\x05\x1b\xba\xcf\x2b\x93\xc9\x70\x43\x9a\xb9\xc4\xa3\x43\xb7\x1f\xfb\x3b\xf6\xbd\xd9\x48\xab\xdf\xff\x7a\x68\xdb\xa5\xd8\xa7\x3f\x89\xe7\x72\xcf\x77\x86\x6e\xff\x67\x10\xfa\x43\xb7\x1f\xc4\xfe\x8e\x79\xee\x9e\xc6\x80\x91\xf1\x4f\x1e\xb9\xbb\xb6\x6c\x8f\x0e\xd9\xe6\x39\xc7\x93\x80\x3d\x69\xc6\x19\xba\x3f\x1d\x16\x04\xb8\xbf\xad\xb0\xc0\xbe\x3b\x74\xfb\xbb\x2a\xbe\xb7\xf8\x19\x30\x12\xf9\xc3\x70\xb5\x21\xce\xf9\x5f\x7b\x00\x18\xf6\xc9\xe0\xe7\x14\x87\x83\xd8\xdf\xb1\x69\x64\x4f\x86\xe4\xc7\x06\x31\x82\x43\x3c\xf1\xfa\x7f\x7d\xfb\x96\xaa\x95\x2b\xb1\x5c\x29\x65\x76\x62\xb9\x74\xcc\xec\xe4\xea\x8d\xfa\xbe\xe6\xbf\xa3\x69\xdf\xc7\x94\x0d\x86\x41\x68\xaf\x02\x36\xfb\xeb\xd5\xda\x01\x99\xce\x22\xcf\x8f\x9c\xe0\xb2\xca\xcc\x9d\x5f\x52\x73\xc2\x68\x9f\xf9\x97\xd4\xdc\xf0\xc9\x19\xbb\xb0\xe6\x05\xd5\x6c\x16\x84\x1e\xe7\xcc\x1f\xba\x94\x2d\x5f\xaf\x8b\x09\xf1\x22\x37\xb4\xf1\x04\xbb\x84\x05\x7f\x7d\xd3\xad\x86\x59\x8b\x35\x74\xc3\x32\x8f\x6a\x97\x4b\x56\xf7\x0c\xbc\x9e\xbf\x8a\x6d\xa9\x27\xcb\xa5\x7a\xa3\xa6\xe7\x4a\x8d\xa3\x2f\x3d\xad\xf8\x73\x3a\x66\xab\x4b\xe8\x87\xcb\xb7\x49\x3f\xd6\x79\x07\x55\xce\x2e\xe0\xf9\xb8\xda\xe5\xb4\xfd\x28\x08\x27\x43\x97\x05\xaf\x51\x7e\xac\x74\x31\xdd\x0d\x17\x6c\xeb\x0d\x5e\xa1\x7b\xa8\x74\x39\xdd\x47\x95\x7f\x8d\xee\x63\xa5\x8b\xe9\xee\xea\x0f\x5d\xee\xbd\x42\xf7\x50\xe9\x62\xba\xd3\xc8\x0e\x22\xfb\x15\x9a\xbb\x0a\xef\xa1\x37\x19\x06\x83\x59\xc4\xa2\xd7\x90\x3d\xae\x76\x39\x6d\xc6\xfc\xd7\x60\xdd\x3e\xbf\x98\xda\xd6\x8c\x5f\x23\xb7\xab\x70\x31\xbd\x9d\x57\x1a\x30\x4c\x5f\x27\xfb\xa4\xde\x07\x53\xdf\x7b\x4a\x36\xfb\x79\x61\x33\x36\x76\x5f\x21\x6e\x63\xf7\x62\x86\xf7\xde\xef\x35\x5e\x1f\xaa\xbc\x97\xe6\x26\x06\x78\x9b\xec\xa6\xd6\x9e\xf2\xb6\xee\x29\xe1\xb3\x2e\xf7\xf5\xba\x8f\xae\xf1\xad\x6a\x07\x47\xf7\x46\xcd\x47\xc7\xf5\x7a\xbd\x83\x23\x7a\xa3\xde\xa3\x63\x79\xb3\xde\x45\xfc\x1d\x1c\xca\xeb\xf5\x76\x4e\xe2\xcd\x3a\x8f\x26\xff\x46\xcd\x8d\x1d\xbf\x5e\x65\x67\x9b\xaf\xd7\x79\x62\x0a\xaf\x57\xb5\xb1\xfb\x7a\x85\x07\x55\xbd\xa8\xd6\x46\xf3\xf6\x15\xcd\x4e\xc3\x2c\xd5\x73\xe5\xd2\x71\xe5\xc9\xb4\x1f\xcc\x26\xfb\x1a\xf5\x64\xd6\x2c\xea\xcf\x68\xfd\xf5\x6d\x17\x1b\x97\xb0\xc3\xfe\x7c\xf8\x2c\xd6\x58\x4d\xd9\x9f\xfb\xaf\xfc\x15\xab\x93\x01\x73\xf0\x9f\xb1\x3f\xfe\x8a\x95\x17\x2e\xf3\xff\x8c\xfd\xb1\x0d\x99\x93\x35\x53\x6f\x98\x0f\x94\x1f\xe8\x7d\x7b\x42\xf1\xe9\xc3\x3d\xe1\x64\xb9\x58\x34\x4b\x8d\x57\x28\xef\x2a\xc4\xca\xa5\xa7\x04\x62\xb9\x7a\xec\xfb\x43\x7c\xfb\xf0\x59\xb0\x25\xf2\xfd\xb4\xe5\x87\xee\xef\xdb\x7c\x44\xe8\xcd\xfe\x3c\xc1\xb2\x54\x6e\x9c\xe0\x19\x6b\xe7\x1a\xd9\x47\xb6\x8e\x03\xda\x27\xcd\x1f\xa8\x9c\x30\xf2\x9e\xce\x3f\x23\xb2\x05\xa0\x62\x25\xa6\xfd\x4d\x16\x33\xf5\x3d\xc2\x68\xe4\xe3\x49\x6c\x82\xdd\x7e\x84\xfb\x6c\x0b\xc3\x85\x01\xf8\xa6\x1a\x65\x1c\x47\x93\xf0\x67\x88\xed\x09\x0b\xa6\x98\xb0\x4d\x36\xf1\xfd\xe4\xe9\x62\x18\x0e\x7e\x7a\x43\x7a\x94\x20\x3c\xe9\xec\xb1\x42\xee\xbb\xb9\x55\xdd\x43\x27\x1f\x14\xe0\x1c\xe0\x3b\x2d\x3f\x76\xba\xbf\x7f\x8b\xc5\x62\x0f\x9f\x0c\x69\x8c\x0c\xb0\x8f\x49\xc8\xfc\xd8\x1c\xfb\xab\xa1\xdb\xff\x1d\xc9\xff\xda\xca\xa6\xd4\xb4\xac\x1f\xdb\xda\x9b\x2f\xba\xd8\x61\x67\x2a\xab\xea\xb9\xca\x73\x3c\x89\xce\xd5\x06\x40\x3c\xad\x3e\xc1\x41\xe8\x78\x74\xc8\x87\x8c\xc6\x86\x6e\xc8\xfa\xcc\x7f\xac\xf2\xed\x5f\xa7\xb2\x7f\xb4\xe2\x1b\xb1\x08\xae\x02\x62\x9f\x08\xc4\xec\x61\x7f\xe8\x86\x27\x0f\x03\x36\x73\x23\xe7\xfc\x33\x37\x72\x82\xc8\x66\x6e\xe8\x6f\x52\xc1\xd3\x6e\xee\xea\x0c\x5d\x3e\xc1\x9b\x8c\x91\xb2\x20\x3c\xcf\xce\xae\xe2\xc0\x73\x18\xf5\x1c\x3c\x74\xcf\xd4\x92\xa4\x53\xa6\xc3\x81\xcf\x82\x81\x37\xa1\x41\x2c\x64\xcb\x53\xce\xf8\x04\xf7\x5f\xe2\xe8\x55\xd9\xec\x11\x89\x36\xad\x4e\x86\xd8\x1e\x4e\x86\xe1\xa6\x73\xbb\xfe\x3f\x40\x32\x99\xbc\xf6\x78\xd8\x77\x37\xb1\xd0\x86\xad\xdd\x27\x47\xd1\xc0\x63\x68\xb1\x07\xfd\xe7\x36\xad\x8e\x25\xb3\x66\xb2\x10\xfb\xfd\xf7\x07\x51\xfc\xe7\xef\x98\xf0\xaf\x7f\xbd\xf2\xed\x53\x06\x4f\xe9\x3c\xeb\xc0\x5b\x14\x9f\xc8\xf2\x84\xda\x53\x39\xbf\x45\xe9\x39\x3c\x27\xe4\xce\xe0\xb7\xa3\xf9\xdc\x30\x36\xe3\xdf\xb5\x36\xb1\x09\x19\x77\xe6\xe0\x7a\x94\x1d\xdb\xc2\x13\x1b\x78\xde\xe8\xd3\xf1\xf9\xda\xe6\x9f\x06\xc6\x3b\x46\xf6\x9f\xe1\x60\x70\xc4\x8c\xfc\x4c\xb7\xa7\x3e\x9b\xbf\x59\xc9\x8e\xc8\x98\x85\x93\x61\x10\xbe\x59\xf5\x31\xda\x7e\x50\xf7\xdd\xc7\x64\xe2\x05\x2c\x1c\x3a\x2f\x58\xfe\xd6\xb1\x9e\xb1\xad\x23\x99\x3f\x0d\xea\x1f\xe9\x9d\xc8\xfb\xd0\xce\x0b\xaa\xf3\x52\x6e\xf0\x94\xcc\xa1\x17\x2f\x69\xcb\x3e\xf8\xba\x56\x62\xfb\xc4\xeb\xf7\x47\x23\x67\xfe\x85\x1e\x74\x37\xf3\x42\x5f\xf2\xa0\x5b\x75\xc7\x41\xc0\xc2\x73\x78\xee\x6c\xf5\xc5\xc7\xd8\xd9\x98\xd5\x79\xd2\x53\x7f\x48\x98\xfb\x82\x13\xdb\x3e\x7c\xc9\xc3\x6d\x1f\xc6\xa8\x17\xd9\x13\xb6\xd1\x37\x32\xdc\xce\x48\xde\xd5\x8b\x1e\x49\x78\x9f\xb2\xee\xfa\x72\x22\xd7\x7d\x07\x5f\xd0\x8d\xfd\x37\xf7\x08\x9f\x7c\xf5\x01\xf7\x97\x14\x62\x17\xb0\x5f\xab\x0f\xbb\xb4\x7e\xa7\x0e\xc3\xe9\xb9\x81\x1f\x3d\xb3\x5c\xcf\x0f\x1f\xd1\x48\x99\x69\xbd\x69\x35\x62\xc2\xe9\xb0\xc9\x96\x21\x0e\x43\xe6\x4c\xc3\xd8\xc6\x2c\x82\x10\x3b\xd3\xd8\x26\x64\xf2\xa2\xdd\x27\xb1\xb5\xe7\xb2\xe7\x83\x2d\xc7\xc3\x49\xe4\x1f\x0d\xb5\x2f\xb5\x10\xae\xa6\xec\x6d\xa1\xec\xa6\x25\x8e\xe8\x3e\x77\xfb\x8f\x2d\xbe\x20\x9d\xfd\xcc\x86\xe7\x9f\x0a\xf5\xf7\x2d\x12\xff\x89\x09\xff\x8a\xe9\xa5\x54\x6c\xf7\xf6\xff\xf9\x3b\x26\x23\x04\xd1\xbf\xce\xca\xea\x38\x0d\xbb\x5a\x64\xc7\xb3\x3c\xc7\x3e\xf7\x05\x34\x76\x13\x6d\x1b\xab\x3b\xcb\xd0\x26\x77\xbc\x81\x95\x20\xb2\xf7\x4c\xf8\x2c\x78\x32\x00\xc1\xb3\x11\xa3\xcf\xf0\xa3\x2d\x3d\xe7\xe7\x28\xe7\xbd\x96\xa7\xa3\xc9\xba\x0b\x46\xc6\x1d\x63\xb3\x80\xbd\x36\xc2\x3c\xe7\xf3\x28\x87\xbf\x96\xcf\x03\x89\xcb\xf9\x7c\x36\xc8\x9d\x3c\x67\xee\x9c\x4d\xbc\x29\x7b\x63\x48\x3b\x34\x7d\xc3\x40\x74\x34\xdd\x71\x03\x04\x0f\xf3\xb5\xbf\x5f\x22\x87\x83\x16\xbd\x05\xc4\xec\x85\x81\xe6\x29\x08\x0f\xf3\xc0\x4f\x28\x9e\x02\xf1\xa4\xb5\x17\xc1\x38\xcc\x11\x5d\x0d\xc6\x61\x52\xfc\xf7\x83\xdd\x3e\x4d\xde\xce\xd8\xd4\x6b\xd6\x7d\x34\xc3\x75\x2d\x57\x47\x4b\x00\xd7\xa4\x5d\xdb\x11\xff\x15\x4f\x3d\x0c\x82\x88\xf9\x97\x93\x22\x1e\x3d\x9b\x9d\x3e\x83\x25\x9c\x0c\x9d\xe1\x0b\x11\xc5\xab\xb9\xe0\xaf\xcc\xaa\x8e\xb4\xf3\x68\x55\xe5\xaa\x2c\xea\xf8\xfb\xf7\xca\xa3\x8e\x68\x5e\x9f\xff\xbc\x46\x75\x27\xb4\x13\x4a\x7b\x49\xfe\xe7\xbc\xe1\x3d\x99\xee\xbd\x5a\xc9\x8f\xd7\xd0\x76\x6a\x1e\x2e\x9f\xb8\xe2\x0b\xf2\x8d\x53\x05\x5c\x6e\x57\x29\x5f\x7c\x4a\x06\xd8\xed\xb3\xb3\x89\xfd\x31\x38\xc7\xcb\x76\xd7\xfb\xea\xc3\xdc\xf9\xf5\x10\x7d\x32\x3e\xb6\x47\x57\xe7\xc0\x09\x97\x3e\x0b\xa2\xc9\x59\xef\x1e\x2e\x1d\xf6\x66\x3e\x77\x58\x62\xbd\x1e\xcf\x93\x75\x8b\x6b\x41\x3d\x59\x71\xfe\xfd\x22\xe0\xf6\x5f\x7a\x0d\xbd\x7d\x95\x73\x40\x5c\xa6\x76\x27\x2b\xdc\xd7\x00\x95\xda\x64\xd6\xdc\xf3\xdf\x98\x0c\x8d\xa5\xf4\x86\xfe\x06\x66\xaf\x93\x0c\xde\x4d\x2f\x57\xaa\x9b\xb5\x46\x2c\x57\x6a\x94\x0f\x93\x8a\x2d\xdd\x6a\x9a\xf5\xd8\xef\xdf\x33\x46\xad\xd2\xcd\xe6\x2c\x31\x99\x83\xe9\x52\x55\x32\x3a\x56\xba\x58\x4a\x59\xe9\x7c\xb3\x54\x69\x8a\xd9\x2e\xec\x15\xd3\xf5\x6c\xb9\xd4\x4c\x9a\x65\xbd\xde\x56\xaa\x49\xa5\xdc\x11\xb3\xdf\x7f\xc4\xb4\x6d\x51\x54\x6d\xff\x42\x10\x7e\xc4\xe0\x8f\x98\xf0\x63\x87\x72\xec\xfb\xf7\x1f\xb1\xef\x7a\x55\xd7\x75\xfd\xef\xbf\xbf\x6f\x1f\x88\x0f\xcf\x0e\x7f\xff\xf5\xd7\x5b\x1c\x26\x45\x58\x4d\x8b\xd9\xa6\x89\x44\xbd\xd8\x69\xa6\x9b\x59\xa8\x77\xf3\x7a\xa7\x93\xe9\x74\x5a\x62\x2b\xdb\xe9\x76\x6b\xb2\xd9\xed\x98\x8d\x4a\x21\xd5\xe9\xd5\xf5\xb6\xac\x74\xca\xd2\x23\x87\x9a\xbc\xe1\x4c\x45\xaa\xa6\x41\x09\x69\xf2\xeb\x2c\x4a\xd7\xb0\x68\x74\x32\xd5\x7c\xbb\x65\xb5\xcb\xdd\x6c\xda\x6a\x35\x0a\xed\x16\x4a\x67\xb2\x3a\xb4\x4a\xdd\xae\x98\xaf\x16\x8a\x4a\x59\xcf\xeb\x4d\xb3\x9a\x6e\xca\x56\x25\x59\x37\xd3\xad\x4e\xb9\x74\x60\x51\x13\x8f\x78\xdc\xf1\xfb\x0a\x8f\xf2\x8f\x18\x12\x01\x12\xf6\xe5\xb1\x43\x17\x60\xd9\x29\x64\xe4\x5a\x49\x2a\x97\x72\x66\x25\x59\x2c\xa5\x0d\x05\x8a\xba\x04\xe5\x1e\xaa\x94\x52\xf5\x9a\x95\x69\x17\x94\x8c\x61\x25\x8b\x55\x2b\x97\x2e\x4b\x75\xc5\xec\xb6\x5b\xcd\x1b\x18\xdd\xfc\x15\x84\x03\xab\x7b\x3e\x5f\xd0\xf2\xd3\xd9\xc1\x1b\x0c\xe6\xe5\x39\xbf\xf7\x5a\xcd\xd3\x79\xbf\x47\x30\x65\x48\x35\x95\x23\x28\x33\x26\xab\x14\xd8\xa2\x62\x23\x5b\xd5\xb8\x08\x31\x47\x10\x00\x5b\x41\xb2\x86\x45\x89\x63\x0e\x24\x01\x62\x2a\xd8\x48\xb4\x65\x08\x6d\x41\xb1\x99\xa6\x6d\xe0\x12\x6e\x2c\x1b\x1a\x48\x11\xb1\xc8\xa0\xc8\xb9\x28\xa9\x58\x50\x6c\x81\x29\x02\xa7\x80\xcb\x14\x02\x95\x00\x8e\x09\x15\x05\x5b\x26\x44\x50\x09\x84\x14\x29\x0a\x12\x91\xa6\xca\x2a\x10\x11\x06\xf2\xf7\x1f\x31\xb0\x95\xd3\x77\xfd\xcb\x16\xa3\x53\x18\x4a\xab\xc4\xaa\x5e\x30\x94\x94\x9b\xd2\xb2\xa2\xb0\x1c\x19\xf1\x40\xe8\x87\xc1\x22\xb7\x58\x83\x0e\xad\xb7\xbb\xd8\xc8\xe3\x74\x7f\x53\xdf\x2c\x49\x16\x5e\x4f\xc5\xea\x9b\x94\x7b\x7a\x07\x48\xdb\x6a\xc6\xf8\x13\x3a\x72\xd7\xf2\xfd\xc4\xe0\x5f\x50\x54\x0a\x39\x04\x5c\x22\x1a\x21\x1a\x43\x18\x32\x88\x01\x46\x08\x31\x26\x01\xa0\x10\x45\x85\xa2\x0d\xa0\x4a\x01\x55\x38\x96\x31\x92\x81\x20\x60\x19\x53\x4d\xd6\x00\x55\x31\xdf\x28\xd9\x3d\x94\x9d\x2b\x08\x71\x09\x8a\x08\x40\x19\x60\x89\x08\x80\x02\x2e\xd9\x5c\x13\x6d\xce\x04\x99\x0a\x94\x8b\x0a\xc2\x02\x91\x35\x8c\xa8\x00\x65\xa8\x22\x4d\x00\x00\xa9\x98\x50\x49\x80\xdf\xb7\x03\x08\x40\x48\x43\x8a\x26\x6b\x70\xaf\xb1\x49\xb1\xd2\x1b\x81\x52\x84\x3c\xc1\xce\x2b\x6d\xc9\x5d\x95\xe7\xcd\x65\x06\xb6\xa6\xde\x38\x3e\x4f\xeb\xe5\x30\x09\x0a\x62\x51\x31\x14\xb9\x97\xac\xab\xcd\x1a\x59\x99\x52\xbf\xd6\x0d\x7a\x3a\xb5\x15\x26\x45\xd9\x85\x8d\x75\xc4\x07\xe9\x9c\x49\x74\x90\xac\xd7\x44\xd8\x43\xde\x16\xe1\x4e\xa5\x55\xb4\xb6\xda\x91\x7b\xfc\xb3\x73\x71\xc1\xe1\xfd\x42\xaf\x54\xf7\xba\xb3\x1e\x82\x65\xdf\x35\x61\x45\xe7\xb6\x98\xb4\x9b\x32\x5d\x0c\xb3\x16\x9c\x26\x5c\xbb\xb8\x50\xda\xd3\x4e\x7e\xda\x2e\x44\x92\x5e\x8f\x46\xb0\xc5\xab\xab\x66\xa3\x8b\x1b\x7a\xb6\xa6\x59\xf1\xfa\x3c\x6e\x84\x29\x9e\x07\x5e\x11\xe3\x4e\xb5\x34\x1a\xf4\xf4\x5a\xbb\xb0\x6e\xea\x8b\x6d\x53\x67\x34\xda\x0c\xce\x69\xc5\x83\x46\xa7\x84\xfc\x07\xea\xde\xc7\x94\x0b\x35\x9a\x31\xc4\x6c\x89\x60\xa8\x21\xc8\x01\x14\x65\x85\x02\x24\x88\x50\xdc\x28\x2f\x14\xa8\x8a\x38\x10\x24\x19\x0b\x1a\x92\x14\x44\x44\xc2\xa8\xb6\xf3\x8a\x82\xad\x10\xb8\xd5\xe8\x7b\x58\x05\x95\x15\x85\x01\x99\xaa\x32\x15\xa9\x2d\x88\x88\xaa\x48\x96\x89\xa0\x30\x19\x2a\x36\xa2\x32\x53\x20\x67\xb6\x22\x09\x58\xe5\x70\xc3\x04\x84\x2a\xc6\x8a\x0d\x38\xb7\xb9\x28\x7e\xdf\x46\x4c\x8f\x1a\x2d\x3d\x68\xb4\x56\x59\x67\x85\x15\x59\xb1\xf6\x48\x92\x33\x93\x16\x43\x46\x5a\x65\xa9\xc2\xb2\x5c\xca\x76\xe2\xce\xb4\x6d\xea\xd3\x99\xd8\x1e\xd3\xe1\xbc\xb4\xaa\x52\xdf\x9e\x04\x58\xd0\xea\x53\x41\x09\xe7\x3d\x46\xab\x0b\xbd\x2f\x4f\x5b\x6d\x1e\x85\x9a\xa0\x58\xed\x66\xb2\x97\x4c\x2b\xc5\x2d\xc2\x5b\x8d\xee\x1f\x10\xef\xaf\x71\x7e\x2d\x75\x66\x00\x67\xd4\x60\xba\x02\x9e\xe9\x28\x33\x7d\x12\x71\x95\x57\x59\xe8\x40\x28\x14\xb9\xda\x73\x86\x34\x9e\x6a\xd3\x78\x3a\x1c\x84\x96\xad\x4f\xc4\x74\x2f\x30\xe2\x5d\x18\x52\xdb\xad\xc4\x43\x21\xe9\xa9\x71\xb1\x5a\x94\x66\x6e\xc0\xe3\x89\xdc\x96\x7e\xf1\x8c\xc6\x16\xd4\x73\x52\xff\x5f\xa0\xb1\x92\xaa\x71\x02\x25\x49\x05\x32\x55\x20\x20\x22\x95\x34\xa2\x8a\x02\xe7\x04\x23\x81\x40\x5b\xe4\xaa\x4d\x08\x97\x64\x01\x50\x24\xd9\x2a\x62\xb2\x22\x30\xa0\xca\xb2\x80\x54\x68\x6f\xb4\xed\x1e\x5a\x0f\x24\x81\xda\xb2\x48\x55\x0d\x69\xaa\x46\xa9\x6a\x63\x81\x6b\x4c\xc1\x1c\x70\xce\x14\x45\x63\x9a\x44\x05\x41\xc2\x14\xdb\x80\xa9\x80\x61\x8e\x34\x5b\x52\x30\xdf\xa8\x2e\xda\x44\xd5\xd2\x91\xc6\xa2\x07\x8d\x8d\x23\x16\x16\x3d\xd4\x4c\x98\xab\x9e\x96\xae\xe6\x56\xd3\xb6\xb9\x10\xd3\x6a\xb5\x36\x4b\xb6\x6a\x60\x11\x28\xbd\xcd\xb8\x9d\x84\x8b\x44\xc7\xcf\x4f\xe7\x43\x5f\x2e\xa2\x19\xe1\x84\xd4\x16\x1c\x8b\x28\xa5\x8a\xce\x58\x2b\xcc\x5a\x51\x7c\xc4\xa7\xa2\xb7\x6a\xa9\x9e\x21\x6d\x11\xde\x6a\xec\xe2\x80\xb8\x39\x2f\xa2\xb0\xa1\x4e\x04\xda\x30\x7b\x55\x2b\xa8\x64\x3c\xc7\xc8\x90\x46\x7e\x9c\xe9\xb5\x48\x63\x51\xb3\x52\x40\x18\x4a\x66\xc7\x56\x9b\x29\xbb\x1b\x0e\x5b\x4e\x1e\x76\xa3\x7e\x9c\xb1\x79\x36\x81\xa0\x3b\x6d\x54\x8d\x82\xe8\x67\xbd\xec\x4c\xeb\x85\x59\x7f\x51\x94\x5a\x5b\xca\xd5\x33\x1a\x5b\x2b\x9e\x93\xfa\xff\x02\x8d\xdd\x38\x43\x6c\x73\x11\x73\x89\x40\xa6\x28\x9c\xc8\x48\x96\x99\x28\x32\x59\x92\x15\x88\x21\xe6\x1a\x64\xb6\xc2\xa1\x2a\xab\xc4\x56\x00\x15\x25\x04\x14\x5b\xd6\x28\xe5\x50\x04\x1b\x6d\xbb\x87\xd6\x73\xdb\x66\x10\x6f\x6a\x0a\x58\x66\x0a\x11\x6c\x5b\x43\x04\xd8\xa2\x24\x12\x20\x69\x0c\x72\xa2\x60\x49\xc1\xb6\x28\x8b\x9a\x6d\xcb\x02\xe1\x40\x94\x20\x52\x01\x54\x35\x91\x6f\x68\xa0\x23\x8d\x95\x1f\x34\x56\x18\xf2\x85\x50\x37\xec\x4e\x91\x58\x4d\x37\x97\xab\x24\x0a\xcd\x62\x79\x15\xb7\xd6\x95\x5a\x3f\xdb\xaa\x4b\x1d\x87\x94\x33\x99\x6e\xba\xaf\x48\x53\xa3\x34\xaa\x46\xb4\x57\x65\xcd\xb0\x1c\x67\x5c\x48\x4e\xec\x5e\x5b\x72\xb2\x8d\xa0\x93\x0a\x07\x23\x1d\x38\x62\xa2\x5b\x2c\xb4\xba\x5b\x84\x37\x1a\x7b\xac\x36\xb9\x62\x4b\xa8\xae\xab\x35\xda\x74\x5c\x20\x2c\xda\x06\x98\xf5\xc2\xf8\x64\x22\x1b\x59\xa1\x31\x4a\x74\x4a\x7e\xd3\x92\x16\xd3\x99\x9f\x99\x2b\xf3\xd1\x6c\x15\xd7\xa7\x11\xd7\x23\xd4\x31\x82\xb1\x65\xd4\x59\x45\x65\x63\xe6\xe7\x87\x8e\xd2\x2d\xaa\xf5\x2a\xe8\x37\x86\xf5\xf8\xd6\x22\x9a\x67\x34\x16\x9f\xc6\xb1\x19\xfd\x7f\x87\xc6\x12\x09\xcb\x58\x91\x14\x28\x2a\x50\xc5\x90\x08\x58\xe3\x48\x83\x8c\x31\xaa\x61\xa8\x41\x89\x32\xaa\x49\x88\x23\x28\x69\xb2\x20\x42\x05\x73\x4d\xa1\x40\xc2\x40\x23\x22\x55\xf0\xd6\x3f\xde\x41\xeb\x19\xb1\x55\xc2\x90\xad\x4a\x9a\x8a\xa8\x46\x55\x51\x01\x00\x69\xb2\x28\x2a\x8c\x30\xc6\x45\xa8\x48\x9a\xcc\x55\x01\x50\x0a\x91\xbd\xf1\xac\x36\xa1\x2a\x85\x94\x48\x44\xc5\x9b\xa8\x40\x3e\xd2\x58\xe5\x41\x63\x97\xd3\xd6\x2c\x51\x98\x37\x52\x08\x26\x32\x2d\x47\x1a\xa2\x71\x6f\xed\xc9\xf1\x86\x0c\x55\x09\x17\xc3\xa5\x30\x6e\x76\xc2\x29\xe4\xc5\x41\x8f\x2f\x42\xbe\xea\xc1\x92\xa7\x22\xd4\xc8\xa4\xb2\x51\xca\x94\xa5\x5a\x36\xd7\x5a\x89\xa9\x96\xdb\x03\x56\x3b\x2a\x14\x9a\xa3\xb2\x42\xb6\x08\x6f\x35\xf6\x48\x89\xca\x02\xf4\xc7\xf5\x7a\x26\x97\x8b\x37\x1c\xaa\x0b\xbe\xda\x50\x68\xbd\x94\x6c\x63\xa7\x3b\x5e\x95\x27\xa9\x9e\x02\xfb\xd3\xc8\x5f\x35\x13\x41\x54\x44\xf6\x20\x3f\xa0\x6e\x37\xbf\x4c\xf7\xba\x43\x1e\x28\xf3\x1c\xac\xb7\xe3\x7a\x96\x96\x6c\x35\x55\x56\xc5\x52\x85\x34\x72\xde\x36\x2a\xe8\x9e\xd1\xd8\xd1\x69\x54\xb0\x35\x9e\xff\x76\x8d\x7d\x61\x5e\xe2\xcc\x96\x96\xf7\x4e\x48\xec\xb7\xb5\xdc\x63\x5a\x07\x3c\xa6\xfd\xdb\x39\x9b\xdd\xeb\x56\xab\x51\xdb\x77\x24\xb4\xfb\x9d\x9a\x6c\x2a\x5e\xca\x12\xac\x6a\x7c\xd1\xad\x27\xb5\x75\x67\xde\x69\x35\xe0\x72\x58\x19\x76\xa3\xba\x0d\x52\x73\xa7\x6a\x31\x75\xf3\x7d\x70\x34\xd3\x03\x36\x6f\x7f\xc4\x84\x7f\x83\xd3\x59\x8b\xdd\xb4\x10\x3a\xb1\xea\x67\xbd\xba\x7e\x56\x4d\xbe\xbd\x27\xc7\xa8\x80\xe3\x09\x2c\xb4\xeb\x1a\x12\x2e\xeb\xc4\xf5\xa2\x41\xf7\x15\x0d\x12\x9e\xca\x06\x6d\x44\x23\x9e\x48\x06\x80\x8f\x16\x8d\xf8\x41\xa2\xd9\x38\xcc\x9d\xce\xa1\x8f\x16\x0c\xbc\xaf\x60\xb4\xa7\x72\xd1\xb6\x26\x73\x52\x84\x0b\x3b\x75\xbd\x5c\xa4\x8f\x32\x99\x1f\x31\x71\xd7\x31\xf1\xc3\x2d\x06\x3c\x4e\x62\x36\xf3\xcd\xea\xe2\x86\x4e\x7c\x8a\x34\xe5\x8f\x43\x42\xfd\xf5\x40\xbc\x67\x28\x78\x13\x89\x1b\x16\x58\xee\xa5\xd7\xd7\x23\xf9\xb2\x2d\x7c\x60\xbf\xc1\xdd\x1c\xed\x3d\x3a\xfe\x6c\xdc\xfc\xc0\x9e\x2b\x5f\xa8\xe3\xa7\xa3\xd2\x07\x9a\x3c\x00\xbf\xde\xe6\xdf\x13\x63\xc8\x2f\x87\xc8\xcf\x37\xf9\xde\xb0\x0e\xf8\xe2\x2e\xd4\xdb\x68\x9e\x6e\x24\xbd\x81\xda\x0b\xdb\x40\x6f\xa0\xf8\xc2\x86\xcd\xf7\xe6\x19\x47\x9b\x36\x8f\x34\xb4\xdb\xb6\x4a\xd9\x52\xc6\xca\x48\x65\x98\x4c\xb5\x2a\x8d\xbc\x99\xd6\x33\xa5\xac\x51\xef\xb5\x1b\x35\x98\x91\x3a\xad\xbc\x9c\x6e\x75\x0b\x85\x56\xd5\x4a\x89\x69\x2b\xd9\xab\xa7\xdb\xc7\xa1\x9f\x95\x9e\x84\x65\x61\xb5\x26\x34\xa8\xca\x73\x67\x3c\xa8\x66\x30\x29\x06\xa2\x9b\xed\x45\x9d\x99\xbb\xc4\x52\x73\x16\xa4\x47\x42\xab\x7b\xb4\xc0\xb1\x5d\x6b\x49\x6e\x5f\x6e\x72\x47\xb3\x9f\xb7\x96\xb5\xf4\x3a\xd7\x18\x1a\xe9\xe1\x72\x6c\x80\x79\xa8\x0c\x25\x6e\x84\x5e\x6a\x12\x37\x9b\xfd\xda\x22\xd5\xcc\xe7\xb3\x36\x75\x9d\x6d\xe2\x69\x10\xad\xb9\x08\xb7\xdf\xef\x3f\xfe\x31\xb6\x44\x17\x8f\xef\x53\xba\xae\x25\x8f\x52\x53\x43\x77\x8b\xc2\x12\x0e\x5b\x64\x49\xea\x6b\xb9\x8e\x23\xb9\xe6\x89\x7a\x7a\xe9\xe1\x45\x76\x36\x9a\x9b\xb6\x4e\x98\x33\xf7\x26\x46\xbb\xbf\xad\x5e\x36\x66\xb6\x30\x59\x56\x3a\xeb\xba\xde\xc6\xb3\x4a\x3e\xbd\x14\x6b\x8e\x1b\xf4\x41\x46\x95\x8a\xea\x32\x45\xf1\x30\x3f\x87\x85\xb8\x92\x43\x54\xcf\xad\xe4\x34\x74\x56\x09\x3f\x6c\xa5\xed\x2a\x2e\x47\x8b\x19\xea\x56\x3b\xcd\x6a\x33\x18\x8f\x13\x6c\x68\xf8\xa6\xef\xf9\x46\xf5\xef\xbf\x4f\xa7\x40\xee\x2c\x1a\x78\x93\x68\x8a\x4f\x45\x93\xd2\x61\xde\x10\xc3\xa8\xbd\xf4\x1b\xa0\xe0\x36\x22\x51\x9b\x20\x90\xd2\x93\xa9\xd9\xa4\xd5\x8b\xcb\x10\x36\x82\xb0\x57\xcd\x8f\x73\x9d\x60\xf1\x28\x9a\x48\x7f\x5a\xde\x0d\xbd\xd3\xed\x96\xa8\xe9\x0d\x32\x93\x92\x3f\x73\xbd\x49\x25\x5f\xe6\xcd\xb0\x04\x78\x90\x5a\xca\x79\xd1\xad\xc0\x64\x93\x46\xed\x46\xb6\xa1\x77\xd5\x1c\x8a\x07\x62\xbc\xed\x11\xbd\x92\x1a\x44\x34\xc4\x96\x17\xcf\x27\x7b\xb4\x16\xad\x06\x91\x53\x4f\x50\x38\x1e\xcc\x33\xbd\x64\xff\xc3\xa1\x97\x6e\x82\xbe\x7a\x02\xbd\xc1\x02\xc7\x89\x17\xe6\xde\xda\x99\x2e\xb5\xe5\x32\x6b\x68\xbe\x3d\xae\xac\x31\x6e\x08\xb3\x69\x5b\x91\x4b\x71\x17\x8f\xf2\x9d\x55\x3f\x7b\xb0\x8a\xf9\xad\xd0\x0f\xb3\x41\xd8\x34\xd3\xab\x76\xc2\x11\x05\xd2\x4b\x0f\x07\x41\xa1\x33\x93\xc7\x5e\xb7\x97\x62\xd6\xa0\x37\x43\xeb\xb6\xd7\xc9\x0f\x9d\x16\x33\x8c\xfc\x20\x31\x85\xdd\x4c\x75\x95\xac\x74\x60\x30\x5f\xba\x48\x9b\xf7\xf3\xcd\xa9\xe5\x54\xcd\x50\xe9\x94\x2d\x89\x7a\xcd\x62\x3b\xa5\x7f\x38\xf4\xe8\x26\xe8\x9b\x27\xd0\xa7\x86\x63\x53\x2c\x25\x11\x98\x18\xa8\x2e\x28\x08\x25\xaa\x85\x56\x38\xb1\x87\x5d\x5a\x5e\x92\xb2\x98\x29\xa6\xda\xb6\xad\xf5\x17\xd3\xd6\x01\xfa\xc5\xad\xd0\x43\x77\x3e\xf7\x67\x5a\x22\x57\xf7\xca\x0b\x39\x1c\x5a\x5c\x64\xd5\x78\x90\x76\x2c\x2c\x94\x5a\x51\x65\xce\xa4\x84\xd5\x86\x02\xcb\x67\x79\x96\x4c\x51\xa7\x25\xd7\xe7\x9d\x38\x4e\x0c\x14\xb3\xef\x55\x74\x47\x4f\xba\xa6\x4a\xcd\xac\xb9\x2a\xf8\x60\xaa\xb9\x25\x9d\xea\x1f\x0f\xbd\x7c\x13\xf4\xdd\x53\xad\x9f\x24\x92\x20\x91\x77\x89\x38\x5a\xbb\x93\x62\xb7\xc8\xa4\x62\xc3\x1f\x98\x64\xd0\xb1\xba\xa5\x36\x75\x9b\x21\x96\xbc\x69\xbd\xa8\x84\x07\x87\xb3\xbc\x15\xfa\xbe\xa5\x35\x47\xeb\x8a\x37\x59\xb4\xba\x75\xbf\xe0\xb7\xd6\x4a\x62\x9a\x50\xfb\x66\x6d\xdd\x59\x0c\xf2\x23\x2d\x59\x04\x62\x9e\x55\x93\xb3\x7a\x96\x24\x84\x56\x65\xb4\xcc\x2c\x87\x8a\xdc\xa0\xb5\xbe\x57\xf0\x9a\x46\xb4\x2e\x99\xb2\xba\x8a\x26\xf1\xec\x2a\x6f\x85\x25\x82\x53\xc6\xde\xe1\xbc\x3c\xb0\x9f\x3b\x86\x70\xc5\xc0\xfe\x70\x14\xe1\x51\x98\x82\xa8\x40\x28\x11\x45\x51\x35\xa4\x40\xa0\x00\x91\x70\x2c\x69\xd8\xb6\xb1\x24\xab\x54\x15\x80\x02\x30\xc0\x44\x50\x30\x86\x36\x91\x64\x22\x28\x80\x69\x98\x63\x11\x09\x48\x56\x8f\x85\xba\xf5\x4a\xe6\xf6\x65\xd0\x6e\x0b\x4a\xc3\x2a\x2d\xc5\x65\x6a\x16\xc7\xf5\xb4\xde\x9b\x2e\x56\x6b\x4c\xa8\x83\xd8\x8c\xa7\xfd\x41\x7d\xb6\x68\x57\x6a\xad\xe1\xce\x14\x5e\xeb\xfc\xf9\x63\x07\xef\xee\xfc\xe1\xe8\xc1\x63\xe7\x27\x38\x08\xb7\x87\x1a\xe9\xfe\x70\xd1\x49\xd9\xc4\xc6\x37\x2f\x2f\x9c\x5a\xd4\x19\x3e\xf6\x26\x86\x7d\x32\x18\xce\xf7\x0f\x4f\xf9\xf8\x3f\xdb\xfd\xab\xbf\xed\xaf\x1c\xfb\xed\xcf\x18\xd8\xed\x68\xfd\x2d\x60\xfe\x9c\xf9\xbf\xfd\x19\xfb\x6d\x0e\xc0\xbf\xc1\xbf\x85\xdf\xf6\x0f\x48\xe4\xfb\xcc\x0d\xad\x6d\xd7\x7e\xfb\x33\x26\x3f\xfd\xdc\xd8\x9e\x3b\x0d\x7e\xfb\x33\xf6\xff\x7e\x7b\x68\xe8\xff\x7c\x3b\x6e\x76\x5b\x73\x43\x98\x01\x8c\x54\x0a\x05\x48\x24\x45\x12\xa9\xc0\xa8\x24\x4a\x22\xc2\x00\x09\x10\x4a\x22\x66\x22\x91\x05\x8a\x37\xff\x09\x40\x63\x8c\xda\x44\xe6\x2a\x10\x34\xa6\xaa\x22\x82\xf6\x9e\xa3\x47\xba\x2e\x5b\x86\xbf\xfd\x79\xd2\xda\xae\x33\x9b\xbe\xff\xf6\x67\x4c\x78\xf2\xe8\xff\x9e\x7c\x3f\x70\xf1\x74\xc3\x17\x55\x55\xa2\x22\x51\xa5\x48\x86\x44\xc4\x00\x33\xdb\xe6\xdc\x16\x6d\x4a\xa1\xa6\x71\x6a\xdb\x0a\x95\x20\x94\xb1\xc0\x24\xac\xda\x4c\x14\x91\x62\x8b\x02\xe7\x98\x21\x2e\x10\xfc\xdb\xb7\x33\x2d\xbc\x80\x81\x4a\x64\x85\x41\x9b\x69\x40\x83\xb2\x60\xab\x00\x6b\x14\x10\x0d\x6a\x10\x49\x8c\x42\x8c\x11\x20\x50\xc6\xaa\x62\xab\x4c\x96\xa9\x2c\x00\x26\x21\x49\x80\x32\x94\x30\xe7\x80\xbc\x1f\x03\xf0\xe3\xf9\x33\x2f\x0a\xa7\x51\x78\xdf\xbe\xbf\x86\xf0\xe9\xc4\xcd\x7b\xcb\x7b\x10\xbe\xb9\xad\x0f\xd2\xb2\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\x0f\xc4\x60\xfb\xea\xff\xfb\xf6\x7f\x2f\x49\x1a\x1e\x2e\x2a\xde\xdd\x82\x76\xda\x87\x5d\xd2\x00\x84\x4b\x28\xb9\x2c\x5c\x78\xfe\x78\x8a\x83\x60\x3a\xf0\x71\xc0\xce\x50\x6a\xb0\x20\x8c\xd5\x53\xe9\x58\x69\x57\x39\xf6\x57\xac\xce\xa6\x21\x73\x6c\xe6\xc7\x44\x01\xa0\x4b\x1a\xe2\x9e\x4f\x58\x40\xa6\x9e\xbb\xc1\x7e\x82\x23\x97\x0c\x4e\x1b\xda\xde\x32\x76\x09\xb1\x5d\xca\xb6\x3f\xc5\x17\x9c\xef\xff\x3e\x69\x0a\x87\xce\x56\x9c\x3f\x4e\x73\xa8\x83\xec\x7f\x1b\xe0\x4d\x2a\xb4\x6d\xfd\xdb\x91\xb4\x7f\xe3\x8c\x5d\x56\xd1\xc1\xcb\x70\x19\x0c\xd7\x17\x56\xf7\xd9\x36\x71\x7b\xa3\xf2\x65\xaa\xb0\xc9\x63\x03\x32\xdd\x5e\xf4\x73\xae\x3c\xae\xf1\x6c\x67\xa0\x92\xcb\x9e\xdd\x08\x8b\x01\xcc\xda\x66\xd9\x47\xd3\x5c\xd3\x70\xdc\x94\x55\x9a\x2e\x45\x7b\x22\x4f\xd5\x76\x94\x2e\xf8\x46\x57\x4b\xb7\xad\xc3\x34\xc9\x76\x37\xa1\xbe\xc8\xaf\x4b\x45\x2a\x4d\x3a\xc5\x8e\x19\xc4\xc7\x8e\x1f\x8d\x71\xa9\x6f\x10\x9c\x09\x0c\xd9\x53\x96\x99\x45\x36\x3b\xf5\xe5\x7c\xb5\xe5\x3d\xce\x08\xe4\x07\x37\x4e\xd3\x5c\x33\xa3\x60\xe8\xab\xec\x50\xcd\x75\xca\xd3\x42\x2f\xd4\x1c\x38\x76\xa8\x66\x95\x5a\x44\x9b\xb4\x82\x45\xa9\x93\x12\xf4\x62\x5c\x2e\x76\x9d\xa4\xe3\x45\x24\x63\xb1\xa0\xef\x4c\x7b\x6a\x09\xd6\xba\x11\x28\xd6\x96\xf3\x7e\x3f\x9f\x08\xb3\x26\x1b\xba\x45\x77\x54\xee\xa9\xa9\xb4\x3f\x1f\x16\x93\x8f\x33\x1c\xc9\xee\x8d\x7b\xed\x8c\x6b\xa6\xc1\xaa\xc5\x81\x34\x4f\xa6\xd7\xb3\xba\x63\xf3\x5e\x88\xf2\x2e\xaf\xaf\x5b\x9d\x4a\xaf\x65\x17\x53\xad\x85\xa6\xa7\x2a\xd1\x28\x93\xef\x4f\x67\x96\x6b\x0c\xa1\x9f\xcb\xcf\xda\x3c\x45\x85\xb6\x15\x36\x4c\x62\x4b\xb9\x24\x57\x6a\xcb\xac\x37\x5d\xe7\xa5\xb5\xc3\xf5\x25\x56\xa4\x91\x3e\xde\xb2\x33\x5a\x39\x4e\xb3\x9c\xf2\x13\x25\xec\x75\x73\xcd\x70\xe8\x87\xe3\x72\xbd\xeb\xad\xc4\x9c\x52\x5e\xad\x67\x2d\xab\x9e\xb1\xc5\xd4\x6c\x51\x6f\x16\x1b\xcd\x5c\x2f\x35\x6d\xf6\xd1\xa8\x1c\x39\x7d\x5f\x6f\xa2\x60\x5e\xf3\x82\x9a\xc0\x1c\x98\x2f\x18\xf9\xb9\xab\x8f\x83\x51\x71\x9c\xbc\x55\xdf\xfa\x8f\xf2\x5f\xdc\xba\xb7\x71\xa7\x8f\xef\xd3\xdf\x6a\x2e\x99\x68\xe5\xd4\xb5\x9c\x27\xe9\xb6\x39\x5b\xcd\x00\x89\x27\x64\x9e\xc8\x19\x26\x01\x6a\xae\xde\x4d\x54\x47\x25\x3a\xec\x8c\xf5\xd9\x78\x00\x2b\x5a\xba\x21\xa9\xb5\xa0\x1b\xc5\xc7\xb0\xd9\x2d\x24\x67\x69\xdd\x0e\xd6\xb5\xf2\xbc\xe8\x4f\xf9\x40\x1d\xd6\x95\x46\x27\xd3\x5f\x6c\xa7\x31\x8d\xcc\xa4\xed\xab\x33\xad\x58\x71\xb9\xda\x6b\xdb\x43\xcb\xa9\xb9\xe5\x91\x8f\x2a\x3e\x5f\x0f\xbc\x15\xcc\xd6\x6b\x35\x26\xba\x54\x5d\x99\x07\x3c\x32\xc8\xcb\x87\x2d\xea\x76\xcb\x2d\xda\x9b\x85\x9d\x69\x23\x6b\x84\x36\xe9\x0a\x4e\xd2\xe1\xc4\xc8\x15\xcc\x7e\xdb\x9d\xcc\xd3\xb9\x01\xd6\xb7\x7b\x29\xf5\xa7\x67\x98\xf4\x13\xfd\xdb\x96\xed\x3a\x8e\xd1\x6a\x95\x76\x86\xa6\x27\x41\x64\xd0\xac\xd7\x88\xfa\xc5\x79\x35\x4c\x29\xc6\x20\x67\xc1\x12\xd3\x68\xab\xc2\x33\xb9\x78\x7e\x88\xf2\xf3\x66\x39\xde\xd3\x43\x65\x6b\xaf\xe9\x64\xcb\xdc\xef\x7b\xb6\xda\x52\x5a\x60\x83\xb2\xac\xaf\xb4\xa4\x50\x09\x32\x66\x7f\x4e\x80\x02\x40\x53\x53\xbb\x23\xc9\xb1\xc6\x8e\x56\x55\xd0\x38\x09\x77\x8b\x0f\x93\xaa\x85\x76\xdf\x5c\x1d\x66\x10\x4f\x4b\xfa\xb1\x3f\xd5\xb2\x59\x19\x97\x13\xe1\xac\x21\x8d\xab\xc6\xba\x34\x69\x94\xd9\xba\x17\x0e\x57\x76\x64\x8e\x35\xa7\xe8\x2c\x33\x23\x6b\xe2\x64\x23\xd6\x56\xab\x61\xb3\x2e\xe5\x41\x19\xb6\x07\x2b\xa9\x54\x18\xa8\xf3\x85\xe3\xb9\x85\x2a\x88\x8a\xd3\x64\x31\xb1\xee\xd6\xd6\x91\x33\xaa\x9b\x91\xbe\xdb\x38\xed\xcf\x4a\xb2\xc5\xca\xb8\x3f\x5a\x16\x71\xb3\xa2\xc9\xc6\x9a\x07\x1a\x13\x88\xe7\x97\x7a\x9d\xb5\xd1\xce\x8f\xd3\x5e\x41\x19\xcf\xc7\x8b\xc3\xa9\xc1\xc3\x92\xa2\x7e\xea\xaf\xb6\xe5\x56\x7c\xae\x5b\x93\xdf\xb6\x34\x4d\x85\xc2\x11\x3f\xe9\x73\xc8\xea\xf8\xb1\x3f\xba\xeb\xe1\x55\xd7\x4f\xcb\x65\x73\x50\xe8\xce\xa4\x60\x20\x74\xa6\xa2\x65\x56\xf4\x64\x6e\xe3\x10\x6c\xd3\x75\x69\x57\xee\x37\x53\x19\x54\x13\xc7\xc9\xf8\x9c\xa7\x3b\xe3\x61\x26\x11\x67\x95\xa5\x98\x9a\x64\x84\x6c\x69\xbe\x98\xf6\x0b\x7d\x34\x28\xe7\x83\x96\x59\x5c\x05\x59\x63\xb7\x4e\x15\x79\xd0\x0b\x25\x34\x4b\x56\xcc\xe5\xb4\x9a\x80\x5e\xb6\x14\x5f\x03\xa5\xb6\x1a\x06\x60\xc2\x8b\xe9\xae\x53\x6d\xf7\xfd\xa8\x1e\x6f\x6c\x75\xfc\xb0\xb8\x65\x9c\x42\x7b\xd0\x8f\xd4\xf6\xef\x75\x7b\x1e\x6e\xd4\x77\x5d\x71\x02\xef\x88\x1f\xef\x1c\xb2\xc6\x63\x7f\xcc\x94\x67\x14\x11\x86\xab\x62\x20\x96\xd6\x13\x7b\xe2\x36\x1b\x93\x5c\x5c\x53\x87\x8b\xba\xb5\x31\xe3\x76\xaf\x35\x1a\x39\x8d\x5c\x99\xcd\xd3\x5d\x39\x64\x8e\x9f\x0d\xc6\x92\x05\xd2\xba\x0d\xa6\xfd\x66\xca\x83\xf5\xd5\x42\xc9\x94\x15\x50\x12\xc6\xdc\xac\xe6\x72\xfd\x91\xbe\xdb\x1c\x5d\x90\x47\x6c\x08\x47\x8e\x97\x53\x1b\x99\x49\x2a\xc1\xfa\x04\x2a\x95\x4e\x98\x2d\x14\xd6\xed\x96\xba\x68\x0d\x7b\x06\x4e\x46\xc8\x42\xfb\xbd\xd5\xfa\x83\x2b\xc8\x9e\xf2\x7b\x78\xb9\xf3\x07\xd5\x49\x2d\x75\x1d\x3e\xe9\x56\x53\xa8\x5e\xa7\xef\x83\xc1\x32\xd3\x3f\xf0\x93\x3c\xeb\x0f\x32\x8f\xfd\xa9\xa6\x82\xac\xb5\x4e\x25\x94\x59\x22\x34\x70\x3a\x8c\xcf\x2d\x35\x98\xbb\xd2\x0a\xce\x80\x9e\x5e\x16\x73\xdd\xa8\xa1\x96\x8a\x6b\x3b\x58\xb4\x82\x64\x93\x58\x39\x50\x9d\x8c\x97\x46\xb5\x1d\x1a\x4a\x7d\xe4\xa5\xaa\xc5\x90\xca\x34\x6f\xe2\xb2\x18\x4d\x9d\x4a\x47\xab\xc0\xca\x5e\xc9\x6c\xa7\xef\x80\x96\x48\xfb\xa8\x05\x9c\x19\x60\x93\x22\xc9\x80\x70\x39\xaa\x77\x0b\x3d\x6d\x61\xf6\xbd\xba\x81\x59\x5b\x6d\x0e\xd3\xde\x89\x3f\xe8\x9e\xf0\xfb\xcc\x1f\x5c\x8f\xcf\xf5\xfa\xae\x1b\xbc\x33\xd8\x7d\x53\x3d\x91\xf7\x51\x39\xf4\x47\x9f\xa4\x27\x96\x2c\x00\xa3\x39\x4f\x4e\x16\x61\x32\x2d\x16\x27\x82\x1a\x65\x8b\x2b\xc1\xaf\x26\x96\xfd\x08\x97\x2a\xfd\x8c\x8a\xcb\x7d\x3b\x4c\xb8\xda\x5a\x84\xf2\x32\x1d\xf7\xc7\x2e\x25\xf6\x28\x68\x24\x39\xb2\x8a\x32\x5d\x83\x56\x67\x90\x4a\xaa\x41\x28\xca\x2b\x6b\xaf\x4f\x46\x84\x93\x76\xab\xd3\x13\x53\x93\x4e\x1b\xfb\x2d\xb9\xb9\x5c\xd8\x6d\x98\x29\xe5\xfb\x53\x17\xea\xf5\xe4\x20\x97\x9e\x22\x7b\x59\xcf\x6d\x57\xdc\x8e\xfd\xc1\xe9\xba\xe9\xa9\x3f\xb8\xde\x5f\xde\xa0\xef\x07\x7f\x90\x3e\x95\xf7\xa1\x18\x8f\xfd\x31\x53\x0d\x31\x27\xa8\xe3\x78\x02\x39\x19\x27\x1c\xe7\x33\x4b\xb2\x40\x61\x6e\x25\xd7\x17\x52\xdd\x6e\x57\x2b\xb3\x55\xa3\xde\x64\xc2\x18\x2a\xfd\x4e\x3a\xd9\x82\xe5\xd6\x7c\x52\x4c\xfb\x15\x35\x59\xd2\xbc\xc0\x8a\x72\xee\xa4\x84\xda\xd1\xac\x5e\xcf\x17\x93\x15\x2d\x8b\x23\xb7\x59\x3c\xe0\x61\xea\xd7\xc6\x97\x0f\x2b\xc0\x2f\xac\xc4\xbd\x70\xd5\xd6\x7b\x57\xe2\x8e\xae\xdb\xba\xcb\x96\xc7\x1f\xb1\x5b\x6e\x0b\xf9\xde\xac\xa7\xbe\xff\x88\x69\xa2\x08\xa1\x22\x0a\x50\x56\x91\xa4\x28\x48\x15\x94\xe7\x1b\xdb\x76\xdb\x56\x45\xf1\x71\x6f\xdb\x49\x6e\x76\xb6\x67\xb7\x9d\xd2\xf8\xbc\x9e\x1d\x75\xeb\x47\xec\x8b\xf7\xcc\x68\x24\x5f\xea\x99\x7c\x56\x66\x47\x9f\x5e\xd2\xb3\x5f\xa7\x8d\xef\xeb\xd9\xc9\x7d\x30\xaf\x98\xee\x4b\x57\x88\xbd\xdb\x78\x8f\xaf\x11\x3b\xcc\x45\xd9\x50\x53\x99\x2d\x61\xa6\x6a\x0a\x92\xa1\x88\x64\x09\x12\x4c\x45\x40\x34\x89\x01\x68\x73\x22\x28\x92\x0d\x45\xc8\x98\x0a\x19\x90\x80\xcd\x15\x01\x60\x44\x35\x41\xe2\xc0\xde\xdf\xf1\xf0\x64\x9a\xa2\x78\x32\x4c\x19\xc3\x84\x21\x58\x42\x3e\xb3\x0a\x07\x8b\x12\x98\x74\x05\xbc\x9a\x7a\x40\x2b\x65\x97\x73\x2b\xb9\x2a\xa3\xd0\x30\x49\xb2\x35\x5f\xa4\xb5\x05\xec\x87\x7e\xd9\xed\x9d\x1d\xe3\x5e\x1c\x42\x4e\x8a\xf9\x38\xec\x5c\xdb\x7e\x37\x11\x27\x27\xf4\x2e\x6c\xff\xf9\x46\x9c\xf3\xb8\x8b\x18\x53\x6e\x0b\x1a\xe4\xa2\x0a\x14\x9b\x4a\x48\xc2\x9a\x02\xb1\x2d\x49\x80\x48\x18\x52\x85\x68\x92\x4a\x08\xc4\xa2\xa2\x70\x62\x0b\x82\x6c\x33\xae\x20\x51\xb5\xb9\x26\x69\x7b\xdc\xc5\xe7\xb8\xff\xa2\x7e\xdf\x0b\x77\x55\x3a\x7c\xff\x34\xf3\xbd\x07\xee\x50\x01\x48\xb6\x19\xb4\x35\x02\x14\x01\x0b\x00\x51\xdb\x96\x21\x67\x8a\x2d\xaa\xa2\x0d\xa0\xa0\x51\x49\x51\x64\x51\xe6\xaa\x44\x88\x4c\x34\x9b\x60\x0a\x6c\x2e\xda\x36\xd4\x44\x65\x87\x3b\xbc\x3b\xee\xd7\xf6\xfb\x5e\xb8\x2b\xcd\xc3\xf7\xcf\x9e\xa0\xbf\x11\x77\x9b\x4a\xaa\x4c\x6d\x4a\x05\x91\x4a\xb2\xa0\x02\x45\x56\x36\x8a\x8e\xb0\xc2\x34\x2a\x33\x55\x46\x04\x8b\x1a\xb1\x25\xc0\x64\x91\x2a\x18\x73\x45\xc0\x22\x67\x0c\xd9\x50\xa6\x6c\x7f\xf3\xc6\xab\xb8\xbf\x33\x5d\x35\x68\x8e\x46\xfb\x3c\xf5\x34\x5d\xbd\x1c\xf7\xd4\x6d\xed\x33\x72\x5d\xfb\x97\xe2\xae\x02\x00\x34\x91\x40\x55\x96\x20\xe5\x0a\x24\x02\x40\x18\x61\x40\x15\xc5\x56\x05\x91\x72\x2e\x20\x2a\x71\x24\x70\x22\x53\x20\xa8\x40\xc6\x58\x41\x44\xc0\x32\x10\x34\xae\xe1\x1d\xee\x6f\xf8\x99\xf7\xa5\x05\x77\xc7\xfd\x9a\xf6\x3f\x1a\x77\x28\x29\xb2\x4d\x64\x49\x43\x32\x94\x54\x95\xf0\xed\x65\x33\xa2\xa2\x09\x18\x6b\x44\x92\x64\x49\x03\xaa\x2a\x42\xd1\x06\x48\xa0\xa2\x2a\x4b\x14\x40\xce\x34\x8e\x09\x43\x92\x20\xef\x70\x3f\xe3\x67\x7e\x91\xbe\x9d\xc3\xfd\x9a\xf6\x89\xf4\xb1\xb8\x2b\x94\xab\x48\x21\x22\x24\x0a\xe5\xcc\xd6\x14\x89\x2a\x04\x6a\x48\x56\x14\x24\xab\x08\xab\x8c\x72\xac\x4a\x9a\x6c\xdb\x8a\x0a\x38\x85\x92\x4c\x54\x26\x0a\x22\xe2\x98\x6a\x36\xdf\xe1\x2e\xbd\x8a\xfb\x67\xea\xdb\x39\xdc\xaf\x69\xff\xa3\x71\x67\x58\x93\x90\x04\x65\x0c\x6d\x19\x09\x8c\x63\x55\x15\x64\xc8\x14\xa8\x20\xa0\x12\x0e\x34\x51\xa5\x1a\x96\x20\x05\xd8\xc6\x90\x11\x59\x95\x94\x4d\x00\x29\x0b\x36\x54\x20\x64\xfb\x7b\x6a\x5e\xf7\xef\xef\x4c\xef\xf3\xcd\x64\x7c\xdf\xa9\xeb\x71\x37\x6f\x6b\xbf\xfc\xc1\x7e\x46\x02\x32\x96\x21\x81\x1c\x48\x1a\x40\x50\x91\x35\x95\x50\x5b\xe6\x9a\x0a\x04\x4d\x61\x54\x65\x92\x44\xb0\xa8\x50\x91\x6a\x9b\x18\x92\x0a\x36\x96\x55\x15\x8a\xcc\xe6\x1a\x45\x68\x87\xfb\x19\xff\xfe\x8b\xfa\x7d\x2f\xdc\x8b\x1f\xed\x67\x20\x55\x91\x26\x4b\x0a\xd7\xb8\x28\x71\x19\x2b\x92\xcd\x89\x06\x65\xca\x81\xa6\x89\x48\xe6\xb2\x42\x55\x24\x12\x49\x11\x89\x28\x13\x6c\x33\xac\x42\x9b\x11\x51\xb4\x55\x28\xd2\x1d\xee\x67\xfc\xfb\x2f\xea\xf7\xbd\x70\xb7\x9a\x1f\x8b\x3b\x22\x4c\x83\x22\x40\x80\x41\xaa\x29\x22\x93\x18\x47\x22\xb0\x05\x2c\x13\x19\x72\xa0\x40\x8c\xa8\x02\x09\x14\x25\xa0\xa8\x50\xd1\x08\x20\x2a\x45\xa2\x0d\x34\x05\x40\x46\xd4\x1d\xee\x67\xfc\xfb\x2f\xea\xf7\xbd\x70\xcf\x2f\x3e\x16\x77\x2e\x89\x04\x73\xc1\x66\x12\xc6\xaa\xac\x70\x8e\x55\x28\x72\x95\x6b\x22\xb2\x15\x44\xb8\xaa\xd9\x48\x06\x08\x89\xaa\x00\x64\x66\x2b\x0c\x4b\x0a\x16\x55\x44\x45\x0d\x68\x58\x26\xfb\x5b\x9d\xee\x1e\xcf\x1c\x8f\x6b\x47\x27\x0e\x2f\xc7\x3d\x7d\x5b\xfb\x76\xf3\xba\xf6\x2f\xc5\x5d\xe6\xc4\x26\xdc\x26\x94\x09\x98\xca\x4c\xa4\x58\x52\x80\x28\x43\x28\x49\x00\x6a\xaa\x44\x15\x08\x15\xca\x39\xd6\x08\x82\x0a\xb7\x05\x24\x6b\x5c\x95\x54\x1b\x52\x91\xcb\x5c\xdc\xe1\x7e\xc6\xbf\xdf\x31\x9e\xb8\x15\xf7\x6b\xda\xff\x68\xdc\x29\xa1\x00\x01\x4e\x31\x14\x25\x51\x03\x22\x15\x39\x53\x00\x13\x80\x0a\xb8\x2a\xa8\x82\xcc\x05\x15\x60\x19\x10\x2e\x29\x92\xac\x2a\xd0\x16\x19\x01\xc8\xb6\x81\x8d\x19\xd4\xd0\x0e\xf7\x33\xfe\xfd\x17\xe9\xdb\x39\xdc\xaf\x69\xbf\xb7\xf8\x58\xdc\x99\x06\x54\x44\x00\xa1\x00\xaa\x04\x11\x80\x64\x11\x21\x08\x08\xb7\x91\xa8\x10\x24\xd8\x9a\xad\x4a\x1c\x53\x8c\x01\x96\x10\x51\x24\x8d\x2b\x98\x6f\x06\x62\xca\x88\x84\x84\x1d\xee\x67\xfc\xfb\x2f\xd2\xb7\x73\xb8\x5f\xd3\xfe\x47\xe3\xce\x35\xa8\x4a\xc0\x56\x65\xc9\x26\x12\x61\x90\x52\x42\x44\x26\x62\x5b\x82\x8a\x6a\x73\x2a\x49\x90\x11\x2a\x33\xc6\x54\x64\x6b\x88\xca\x50\xa2\x18\x11\x41\xb0\x05\x42\x65\x59\xd9\xe1\x8e\xee\xae\xef\xd7\xf6\xfb\x1c\xee\xd7\xb4\xdf\x2d\x7e\x2c\xee\x84\x02\x91\xa9\x1a\xb5\x35\x26\x48\x48\x02\x0c\x2a\x44\xd1\x64\x66\x63\xcc\x00\x50\x29\x94\x39\xdc\x44\xea\x84\x42\x4a\x99\x84\x99\xb0\xd1\x76\x5b\x91\x55\xbe\x71\x48\x7c\x87\xbb\x7c\x77\x7d\xbf\x27\xee\xd7\xb4\xff\xd1\xb8\xab\x22\xb3\x6d\x9b\x22\x41\xb4\x99\xa8\x21\x55\x10\x55\x55\xe1\x5c\x40\x1c\x11\xa2\xaa\x2a\x91\x20\x52\x30\x24\x32\x51\x01\x97\x6d\x40\x6d\x4a\x19\x60\x90\xdb\x50\x53\x35\x1b\xec\xef\xfc\xbb\x3b\xee\xc7\xfd\x6e\xea\x67\xb7\xff\x3c\xed\xf7\x76\x9d\x85\xb5\xe7\x75\x7e\xba\xc4\xfe\xec\x3b\x47\xdb\x1b\xde\xb9\x1d\x2d\x2d\x0c\x44\x84\xfb\x8f\x72\xd8\x6d\x0f\x6a\x9e\xb6\x72\xb2\x35\x61\xa3\x07\x06\xc2\x5a\x3e\xf1\x02\x57\x97\xe6\x5a\x02\x60\x1c\x0b\xb6\x20\x8a\x32\xd3\x64\x40\x21\xa0\x5c\x91\xb8\x24\xaa\xa2\xa6\x8a\xb6\x24\x48\xaa\x2d\xda\x9a\x2a\x69\x0c\x43\xae\x30\x41\xc4\x12\x50\x11\x00\x54\xd9\xc4\x45\x3b\x59\x9d\x89\x81\xee\xe8\x1b\x2e\x97\xd5\x51\x29\xc5\x4d\x7a\xba\xe7\xe4\xb9\xac\xde\xb9\x55\xe8\x7a\x59\x1d\x17\x28\xd5\x40\xff\x0a\x59\x61\x09\x20\x1b\x68\x22\x87\x0a\x14\x30\x64\x1c\x40\x4d\x80\x88\xc3\xdd\x21\x4c\x20\x60\x89\x61\x59\xe3\x1c\x01\x09\x71\x88\x15\x59\x06\x88\x00\xac\x8a\x92\x20\x50\xa2\xed\x64\x75\x26\x6e\xca\x1c\xb1\x7e\x85\x5d\xb5\xbd\x6b\x64\xf5\x29\x76\xd5\xac\x5e\x21\xab\x7b\xd8\x15\xa2\x36\xe5\x14\x62\x5b\x03\x5c\xc2\x48\xc4\x00\xd8\x58\x13\x89\x2c\x40\x28\xd9\x04\x0b\x54\xc2\x98\x6a\x08\x70\x06\x29\x40\x9a\x0d\x15\x88\x39\xb6\x31\x90\xa1\xc8\xf0\xde\x07\x9e\x89\xb5\x8e\x64\x75\x8d\x5d\x5d\x27\xab\xa3\xf2\x71\x76\x75\x95\xac\x8e\xcb\xb5\x76\x45\x39\xe1\x02\xd0\x98\x4a\x14\x20\x6a\x82\x20\xa9\x94\x50\x81\x49\x1c\x0b\x00\xcb\x54\x11\x15\x15\xaa\xb2\x0d\x99\x8c\x15\x0d\xda\x12\x41\x90\x52\x45\x41\x80\x50\x51\xd5\xd8\xde\xae\xce\xc4\x67\x37\xca\xaa\x65\x7e\x59\x59\x95\xf5\x5f\x24\x2b\x49\x85\xa2\xa6\x72\x49\xc0\x8a\xc6\x25\x99\xcb\xaa\x44\x24\x40\x45\x91\x4a\x54\x13\x44\x0e\x28\xe4\xcc\x46\x10\xdb\x0c\x21\x04\x28\xc4\x54\xd6\x28\x51\xa1\x28\x09\xaa\x80\xf6\xe3\xd5\x99\x98\xee\x46\x1f\x78\x9d\xac\x3e\xc5\x07\x5e\x25\xab\xb7\x7d\xe0\x8b\x7b\x6a\xee\xb3\xa1\xe6\xa3\x77\xd3\x64\x2c\x35\x5b\x9d\x57\xc7\x76\x41\xcc\xea\xb0\xdd\x1a\xd5\xfc\x82\x33\xea\x08\x02\xcf\xa8\x81\x95\x53\x1c\xc1\xac\x2d\xf2\xed\x84\xde\x81\xfa\xe3\x26\xe1\x73\x68\x3d\xdf\x34\xfa\xce\x4d\x96\xc9\x96\x3e\x3f\xbe\xa6\xdc\xd8\xed\x1e\xd8\x0a\xa2\x3b\xaa\x92\x4a\x43\xcc\xa0\xc1\xcc\x35\x9c\x7e\x26\xc3\xfa\x5a\x5e\x9d\x48\x04\x98\x6e\x73\xb2\x1c\x4f\xcc\x49\x56\x0b\x66\x3d\x5f\xd0\x14\x90\x96\xcb\x56\x9b\xb3\x84\x23\x8d\xa7\xe9\x30\x17\x0f\x72\xc2\x10\xcc\xac\x61\x88\x74\x21\xbf\x6a\xbb\xf6\xa0\x6b\xb5\x91\x97\xfa\xfe\x23\xf6\x5d\x5c\x3b\xe5\xb0\x20\xe7\x69\xbb\x38\xe9\xa5\x56\x61\x8e\x4c\xca\xa6\x92\xd0\xa9\x55\x1c\x29\x5e\x65\x50\xb5\xb5\x45\x66\x22\x56\x1b\xcb\xc3\x55\x33\xaf\x60\xf0\xa0\x18\x87\x8b\xf3\x4e\x0f\xf5\x6c\xb5\xfc\x1e\xbb\x39\xae\xdd\x4d\xa1\xdf\x61\x37\x47\xba\xd1\x36\xfc\x1b\xda\xd7\xf5\x5f\xb7\xea\x76\x2e\x7b\xfb\xe8\xad\x53\xd7\x1b\xd9\x69\x4a\xfa\x4c\xe1\xde\x77\x32\x45\xef\xd4\xb3\xf6\xf1\x91\x84\x23\x23\x4b\x66\xb1\x36\xa8\x2c\xbb\x71\xb4\x90\x12\xc9\x3e\xe8\xb7\x45\x83\xe6\x73\x4d\x21\xe9\x24\xfb\xee\x68\xd4\xa9\xae\x97\x20\x35\x62\xf9\x75\x43\x9a\x0e\x3a\x29\xab\x3c\x64\x51\x2f\xef\x35\x3a\xf2\x68\x3e\xa0\xeb\x22\x1e\x70\x36\xad\x4c\xa6\x55\x33\xb7\x54\xc5\x36\xea\xa8\xd3\x5c\x66\x63\x08\x85\x19\x54\x92\x0d\xd5\x4b\x2b\x20\x5d\x9f\x12\x39\x34\xb3\xa6\xa7\xf1\x7c\xbd\xb8\x90\xf3\x30\x61\xe9\x99\xf9\x9c\xd6\x87\x89\x49\xfe\x2b\x19\xd9\xad\x4a\x7e\xa3\x91\x4d\xbd\x82\xd4\xb0\xee\x69\x64\x9f\xb8\x75\xe9\x22\x23\xbb\xf3\x3e\xb9\xeb\x8d\x2c\x75\xc2\xfd\x33\x85\x7b\xdf\x71\x8f\xd7\x8c\x2c\x95\x9f\x73\x29\xb7\xc8\x21\xbf\xda\x80\xfa\x54\x48\xf4\xea\xe9\x59\xbc\xb6\x68\x81\xbc\xcc\xf4\x5e\x0b\x41\x1a\xa7\x52\xdc\xc0\x93\xf8\x1c\xae\xe9\x20\x17\xa9\x62\x2e\xc1\x72\x7e\x79\x90\xca\x56\xbb\x7e\x18\x55\x7a\xe9\x45\x8e\x98\x12\x8f\x52\x23\xa3\xdf\xca\xf5\x23\xb3\xbc\x31\x84\xd2\xb2\xe5\x4b\x8a\x6b\x90\x82\xde\x12\x95\x6e\x02\x29\x85\x64\xd0\x48\xd2\x1a\xec\x3a\x71\x73\x9d\x59\xd9\xab\x30\x93\x28\x28\xe5\xfa\x61\xfb\xe5\x2f\x37\xb2\x9b\x95\xfc\x46\x23\xf3\xac\x24\x1e\xdf\x73\x24\xfb\xcc\x7d\x6a\x17\x19\xd9\x9d\x37\x45\x5e\x7f\xa6\xec\x95\x70\x71\x77\xe6\xf5\xaa\x33\x77\x30\xf1\x58\x0e\xf4\x8e\xce\x80\x19\xda\xd8\x29\xb4\xc5\x19\x9c\x2b\x55\xbe\x52\x2b\x45\x36\x36\x6d\xd0\x68\xe4\xd0\x70\x39\x1b\xe7\x04\xc3\xeb\x77\xfc\x72\xa8\xf4\xcb\x40\x16\xab\xf6\x78\x20\xd2\x7a\xa3\xc9\x59\xca\x9b\x13\xa1\xa2\x63\x3e\x48\x75\x96\xe1\xa0\xa5\x4f\x02\x2b\x1a\x4d\x0c\x67\x35\x32\xf4\xee\xd6\x28\xe6\xcd\x41\x38\xa7\x7a\x58\xeb\xf7\x3b\xbd\xe5\xb2\xd0\x76\x65\x6a\x7b\x3d\xe2\x4d\x57\x42\xd6\xb1\x3a\xb3\x39\x29\x58\x71\x64\x97\xc2\xc3\xbe\xdb\xf3\x06\xd7\x7d\x2a\xd4\x27\x06\xb7\xc5\x6e\xe7\xa0\x8e\x12\xa4\x2b\x46\x7d\xb7\x7c\x90\xc5\x0b\xe5\x85\xcd\xd8\x4f\x0c\xfe\x2e\xed\xbf\xe0\x6c\x2e\x69\xff\xde\x0b\xfa\x57\x6d\x40\xbf\x77\xfb\xcf\xf1\x78\xdd\xe1\xa4\x0e\x75\xde\xd9\xfe\x2d\xe7\x0b\x77\xa2\x38\x18\xdc\xe2\x14\xbf\x8b\x1c\xd2\x9d\x77\x0b\x5f\x7f\xe8\xfd\x13\x1d\xd2\xd1\x21\xf5\xca\xa4\xaf\x64\xac\x41\xbe\x2f\x2c\x95\xd1\x54\x5f\x00\x73\x21\x67\xc5\x4e\x5a\x5e\xd5\x72\x0e\xcf\xe7\x16\x69\xbe\x14\xb4\x52\x34\x44\x76\x58\xce\xeb\x69\xb6\x48\xeb\x25\x5e\xc6\xba\xa1\xa6\xab\xbd\x09\x9a\x42\x1d\xf5\xe1\x58\x4e\x65\x53\xc3\x3e\x6f\x96\x9a\x29\x20\xf7\xc9\xd6\x69\xf4\x6b\x99\xfa\x42\xea\xa5\x20\xac\xe8\x69\xdc\x1e\x00\x18\xe9\x16\x57\xd3\xa0\xd2\xac\x2c\x43\x33\x97\x9e\x4d\xc1\xa2\xd0\xad\xba\xe8\x10\x9c\xdc\xcb\x21\x5d\x11\x21\xdd\xd5\x21\xdd\xd8\xfe\x1d\x1d\xd2\xad\x3b\x5d\x6e\x75\x48\x77\x69\xff\x06\x87\xf4\xce\xf6\x7f\xbd\x43\xba\xf3\x36\xfa\xeb\x23\xa4\x57\x72\xfd\x9d\x43\xba\xea\x14\xf2\x5b\x11\x92\x59\x30\xe6\x71\x75\x6d\x01\x36\x5d\x2c\x93\xf1\x20\x3f\x30\xbb\x15\xc7\x1e\x59\x5a\xa7\x4e\x3a\x21\x09\xbd\x62\x8e\xb2\x10\xd1\x41\x7f\xac\x74\xf3\xad\xfc\x5a\x77\x6b\xf5\x7e\xb7\x31\xe7\x2b\x2f\x97\x2f\xe4\x69\xd5\xe9\xc8\x72\x34\x10\xbd\xb8\x9f\xd1\x0a\x72\x3e\xe7\xf4\x77\x11\x52\x29\x8b\xd5\x5e\xbe\x35\xaa\xe7\xd6\x8b\x3c\xed\xbb\xe3\xc2\x8c\xd4\x32\xf5\xda\x30\x59\xf4\xd3\x55\xc1\xeb\x95\xcc\x84\xcc\xfd\x72\xeb\xc8\xe1\x7c\x91\x08\xc9\x38\xd0\x3f\x2e\x9f\x16\x21\x25\xaf\x6f\xff\x43\xb6\x3c\xbe\xc3\x21\xdc\x3b\x42\x7a\xef\xd6\x10\x5d\xbf\x31\x42\xba\xfe\x46\x96\x9d\x28\x6e\x75\x48\x77\x3e\x5f\x72\x7d\x84\xf4\x89\x0e\xe9\x28\x42\x32\xb2\x89\xa2\x25\xc7\x6b\xeb\xf6\x2c\x4a\x57\x06\x6a\xdf\x4a\x8b\xb5\xa8\xb7\xee\x86\xa3\xd1\xb4\xc2\xb2\xf3\x84\x47\xb5\xa2\x22\x2d\x27\x4d\x41\xeb\x60\x09\x23\x06\x4a\x83\x62\x58\xac\xd7\x72\x9e\x95\x0b\xfb\xc0\xc4\xa9\xb6\xa9\xad\xe7\x61\x96\x4f\x5a\xed\x9c\x8e\xeb\x8b\xea\xd6\x69\x70\x3e\xe8\x2c\x46\x4b\x2d\xe1\x4f\x04\xa0\x96\x5b\x3d\xd8\xf2\xda\x9e\xc2\x67\xe6\xc4\x0f\xa5\xac\x56\xca\xac\xca\xb9\x64\x47\x16\xed\xc3\xaf\x4f\x7e\x91\x08\xe9\x66\x87\x74\x63\xfb\x77\x74\x48\x77\xd9\x0b\x7c\x83\x43\xfa\xec\xbd\xc8\xba\x7e\x63\x84\xf4\xab\x1d\xd2\x9d\x0f\x5e\xbd\xb3\x13\x97\xa5\x6c\xbb\x4e\xbd\x73\xd4\xbd\xe1\x9e\xa7\x68\x5c\x86\xc7\x12\xcf\x3e\xf2\x5b\xcd\x26\x7a\xe3\x75\x2d\xc1\x92\x42\x5a\x59\x56\xb4\xb5\x3e\x65\xd9\x79\x31\xab\xb8\x33\x16\xae\x71\x9d\x76\x07\x6a\x3b\xbb\xf2\x17\x8b\xb9\x6d\xba\x4b\x29\x65\xcb\xfd\xb5\xd0\xf7\xdd\x5a\xde\xc8\xd7\x65\xb9\xdc\xb3\x33\x4e\x72\xac\xac\xd6\x59\x47\x4d\x8d\xf3\x8a\x9d\x97\xaa\x7a\x73\xeb\x64\xe4\x69\xad\x59\x9a\x95\xc5\x66\x39\xee\xf5\x33\x15\xb7\x04\x32\x45\xb5\x57\x28\x39\xe3\x4a\x6d\x26\x57\x02\x6c\x12\x53\x6d\x27\xd7\x64\xfd\xd6\x9c\xd3\x89\x12\xbc\xe0\xc0\x8e\x01\xbf\x62\x39\x77\x48\x0e\xb2\x7b\xa1\xbc\xee\x40\xee\xd8\xfe\x75\x29\xde\xe9\x61\x86\x2f\x37\xe7\xa2\x3f\x3d\xdc\xf3\xc9\xfc\x25\xe5\xaa\x42\x6f\x77\x30\x77\x3e\x61\x78\xbd\x83\x79\x25\xe2\xd9\x75\xea\x9d\xa3\xe8\xc7\x38\x98\x74\x3a\x63\x65\xd2\xe9\x8e\x6d\xa6\x6a\x74\x2c\xb2\xf4\xaa\xaa\x37\x4a\xd3\x6c\x34\x2b\x27\x82\xb4\x3f\x9d\x05\x4b\xa7\x54\x5a\x64\x70\xbc\x68\x0d\xed\x52\x35\x6f\xa5\x3a\x6d\xcc\x93\x52\x5b\x2d\x14\x0b\xd5\xc4\xc0\x14\x8a\x42\xc3\x5a\xf6\x58\x94\x28\xab\x61\xd7\x35\xa2\xc5\x42\xdf\x3a\x81\x6a\x7b\x3a\x5a\x24\xd2\xf9\x74\x83\x4e\x47\xa5\x70\xee\x18\xc9\x8e\xd2\x45\xe6\x6a\xc8\xeb\x62\xd5\xf0\x05\x6b\xea\xf5\x57\x72\xc2\x6d\x1d\x16\x4d\xbe\x88\x83\xb9\xca\xc0\xef\xd8\xfe\xf3\x88\xe0\x82\xf6\xcf\x3b\x98\xaf\x34\x87\xa2\x9f\x71\x30\x9f\xc7\xdf\x9d\x1c\xcc\x9d\x8f\xd2\x5e\xef\x60\x5e\x59\x6a\xbe\x2e\x82\xb9\xfe\x66\xba\xd3\xad\x87\x47\x0e\x26\x55\x1b\x0e\x8a\x3d\x73\xd8\xb3\xa7\x0d\x09\x25\x82\x6c\x30\x99\xe1\x82\xa7\xd9\xb5\xb5\xd5\x58\xce\x0b\xdd\x38\x55\x06\xcb\x65\x76\x35\x9f\x4c\x7b\xf5\x64\x51\xb5\xca\x3d\x99\xfb\x1d\x5b\x5f\xb0\x64\xe0\x39\xa5\x29\x93\x24\xad\x97\xca\x9a\xc3\x45\x43\xf4\xaa\x8d\xf6\xa8\xd3\xdf\xfd\x9a\x28\xd1\x06\xbd\x5e\x36\xce\xf3\x15\xec\xd6\x13\xab\x86\xcd\x33\xbd\x7c\x5b\x73\xc5\xb4\x65\x92\x20\x1f\xcc\xe2\xb3\xd4\x3c\xc8\xf9\xfd\x95\xf0\xc8\xd9\x17\x71\x30\x57\x19\xf8\x1d\xdb\x3f\xd5\x9d\x8b\xda\xbf\x53\x04\xf3\x81\x29\x88\x7e\x8f\x08\xe6\x6a\xfe\x52\x7c\x90\x6d\xdf\xee\x60\xee\x7c\x66\xfc\x7a\x07\x73\x8a\xec\xcd\x11\xcc\x87\x38\x98\xdc\x38\x1e\x06\xde\xd8\x58\x47\xa0\x1f\x4d\xb8\xdd\x1d\x99\x80\xa9\x3e\x18\x83\xe9\x70\x65\xf4\x24\x6a\xb8\x42\xa4\xcc\x5b\xfd\x9e\x9c\x88\xcf\x86\xe6\x64\xa9\x0c\x0a\xcc\x37\xac\x11\x28\x8c\xec\x5e\xa6\xda\xa1\x98\x6b\x42\x17\x77\xcd\x61\x5e\xb5\xed\x95\x60\x76\xfb\xde\xd6\x09\x74\xca\xe3\x55\xba\x26\x69\x93\x15\x2a\x6b\xf5\xcc\x62\x1a\x74\x13\xe9\xf5\x94\x12\xb5\x38\x4e\x4b\x25\xb4\x20\xa3\x56\x61\x39\x59\x56\x82\x03\x6f\x5f\xc4\xc1\x5c\x65\xe0\x77\x6c\xff\x85\x86\x3e\x25\x82\xf9\x64\x07\xf3\x79\xfc\xdd\xc9\xc1\xdc\xf9\x72\x84\xeb\x57\xa9\x5e\x89\x60\x8e\x36\x4f\x5d\x7f\xd7\xae\x5e\x46\x7e\xe1\x48\x68\x85\xb3\xaa\x77\x74\x37\x39\x5b\x95\xed\xcc\x60\xbc\x58\x7a\x6e\x27\xd1\xca\x25\x46\x84\x8f\xfc\x6c\x99\x0e\x8a\xa9\x9c\xd6\x54\x22\xa9\xb0\x6c\x8d\x74\xd8\xc9\xce\xc6\x6d\xc9\x2c\x2d\x3c\xbf\x8a\x9c\x5e\xaa\x36\x1a\x89\xaa\x88\x89\x9e\x51\x49\x91\xb7\x33\xf3\x2e\x4f\x93\x6a\xab\x45\x3b\xb2\xe8\x26\x17\x3b\x83\xd7\x92\xab\x79\x32\x5e\x9f\x0d\xdc\x84\xdc\x5f\xc5\x2b\xe3\x49\x08\xd6\x92\x03\xba\xad\xa6\xa7\xb7\x65\x28\x8f\xd9\x70\x40\x0b\x35\xc7\x39\xcc\xb4\x9e\x77\x26\xe7\x37\x96\xbd\x33\xda\xd3\x0f\x0a\xbc\xa3\xff\x81\xf7\x94\xbf\xec\xf0\xaa\x57\xf3\xdf\xa9\x67\x6d\x67\xa7\x40\x47\x11\xd5\xb3\x8d\x6f\x6f\x38\xbc\xfb\xb5\x9f\xba\xbe\xfd\x7b\x1f\xee\x3c\xdd\x48\xb9\x2f\x9f\x76\xf0\xfc\x74\x92\xfe\x6c\xfb\xcf\x52\xec\x83\xad\x9e\x96\xa3\x5f\x42\x7e\xa7\xaf\x39\xea\xdf\xae\x7c\xb4\x2f\x59\x3c\x76\xd4\xb8\x8a\xdf\x5b\x7f\x87\x21\x7b\xb2\x20\x76\x2a\xf3\xc3\x61\xa5\x2f\xc4\xdf\x4e\x3e\x87\x7b\xe3\x9f\x95\x4b\x06\xb5\x3b\xdf\x3c\x73\xfd\x4a\xe7\x5b\x83\xda\x2d\x8e\xf6\x04\xa8\xcb\x2e\xd8\x5f\x06\xfd\xc1\xda\x1c\xcc\xab\x4e\x2e\xd9\x22\x64\x54\xf7\x56\x5a\x55\xb4\x9a\xa3\x8e\x37\x91\xc5\xfc\xc4\xa0\x6a\x30\x70\x6a\x8b\x59\x59\xeb\xac\xd8\x64\x5a\xef\x22\x24\xd9\xd4\xc9\xce\xe4\xe5\x8c\xc8\xa3\x6e\xcf\x5b\x68\x08\x99\x92\x52\x69\xcf\x92\x26\x67\xad\xc1\xe0\x61\x50\xb3\xd5\x79\x65\x5e\x92\x0a\x20\xb2\x70\x6d\x99\x1f\x95\x4c\x13\x0d\x4a\x64\xcd\x79\x7c\xba\x6c\x70\xc5\x68\xbb\x52\xdd\xaa\xd4\xb5\xf9\x61\xe2\xfe\x3d\x83\xda\x3b\x33\x8c\x5d\xb9\xcb\x3c\x96\x9e\xd6\xd8\x4e\x4c\xa9\xb3\x51\xe0\x65\x83\xda\x15\x2b\xa5\x77\x1d\xd4\x6e\x6c\xff\x8e\x83\xda\xad\xb7\x4b\xdc\x3a\xa8\xdd\xa5\xfd\xcb\x06\xb5\xf4\xc4\xb3\x5e\x3b\x81\x7a\x3a\x48\xbc\xd3\xd7\x7c\xfa\x20\xf1\x25\xf8\x7b\xa6\x73\x8f\xf6\x79\x5a\x8c\x83\x3d\x7e\x6d\xff\xf1\xf6\xa0\x76\xe7\x6b\xbd\xae\xcf\xd4\x5e\x99\x0a\xba\x4b\xa6\x96\xcc\x64\xcd\x9d\xf2\xec\x9a\xca\x9f\x95\xec\x51\xa6\x36\xab\x2c\x65\x6d\x56\x4f\x01\xb5\x04\xbb\x05\xb4\xa6\xa5\xb5\xdb\xa3\xd3\x8e\x31\xb6\xbd\x41\xbe\x11\x25\x0b\x6e\x77\x22\xd0\x6a\x45\x37\x13\xd9\xf6\x52\x57\x79\x89\xb7\xfa\xfd\x56\x2f\xcc\xe0\xcc\x58\xed\x16\x49\x36\x21\xd1\xb9\xa1\xac\x59\x26\xad\xd5\xcd\xaa\x57\xaf\x1a\xfd\xdd\xa0\x06\x4b\xe9\x5a\x02\x17\xc7\x85\x9a\x55\x4f\xb8\xd9\x7e\xc6\x88\xeb\xfd\x8c\x9a\xcb\x38\xd9\x4a\x4d\xc0\xd9\xf2\x4a\x31\xda\x4a\x46\x96\xd0\x5b\x0b\x57\x77\xcc\xd4\x0e\x2f\x6f\x08\x20\x72\x5d\x52\x3b\xce\xd4\xc6\xa7\xac\x7d\x46\xa6\xf6\x6c\x3b\xd3\x91\xdc\x0f\xe5\xd4\x29\xa5\x22\xbc\x3a\x3f\x10\xdd\x31\x73\xa9\xea\x77\xcb\x5c\x4e\xae\x05\x38\x76\x4a\x5f\x58\xfe\xfa\x07\xc8\xdb\x3c\xe1\x7f\x5f\xbe\x8c\xbc\x9f\x8f\x22\xaf\xcb\xfb\xf4\x72\x01\xfd\xd0\xbf\xff\xba\xcc\x4a\x7f\x1a\xb4\xfd\x9a\x9d\x4f\xfc\x91\xf3\xa3\x84\x66\x17\x1f\x19\xe3\x42\xf0\x02\xdb\x97\x6d\x37\xbb\xef\xfd\x8c\xd7\x67\x85\x6f\x0d\xa0\x37\x67\x85\x8f\x4e\xc8\xa8\xea\x97\x64\x85\xfd\x9c\xb8\x1e\x36\x87\xf3\x4c\x58\xa6\xae\xb4\x1a\x80\x54\x21\x0c\xe4\xf1\x3a\x2b\x8d\x7b\xbe\x67\x9a\x59\xbd\x59\x08\xa6\x23\x23\x54\xf3\x3e\x5b\x04\x33\xbf\x0b\xe6\xe5\xb9\x9b\x40\x9e\x1d\x5f\x22\x33\xe3\x4c\xcd\x72\x1a\xa7\x8c\x84\x93\x2b\x15\x21\x2c\xeb\x75\x67\xf5\xb0\xb6\x21\xd7\x06\x24\x5b\x32\xa5\x25\x49\xb7\xf3\xad\x22\x89\x83\xbc\xda\xb4\x1c\xa9\x21\x8b\xb3\xcc\xb8\x93\xad\x73\x36\x9f\x8c\x39\x5b\x1e\x99\xf2\x47\x67\x85\xfb\xd0\xfc\xd6\xa8\xee\xad\x9f\x60\xfb\x8c\xac\xf0\x1d\x03\xa8\xd1\xc3\x49\xf5\x2c\x86\x47\xdf\xb9\x63\x96\xf4\x8e\x01\xf4\xad\x2c\xe9\x30\x80\xde\x1b\xbf\x77\x0c\x48\xbf\x04\xbf\x8b\x06\x24\xa3\x9a\x4e\x68\x6f\x66\x99\xff\x95\x59\xdc\xb3\x01\xe9\xb3\x77\xca\xbd\x3c\x20\x1d\x8b\x3e\x53\x9d\x9d\xc7\x7f\xa7\x0f\x5b\x79\xbe\x77\x6d\x50\x3f\x74\xfa\x86\xa9\xea\x6d\x39\x04\x50\xcd\xb3\xfc\x5f\xb8\x56\x78\xdf\x8b\x76\xaf\xcf\x40\x4f\x2f\xff\xba\x77\x06\xfa\xee\xdf\x31\x2e\xcb\x15\x35\x52\x06\x21\x43\x8e\x35\x28\xe6\x19\x34\x53\x76\x26\xed\x18\xd9\x42\x3f\x31\x2e\x09\x30\xc3\xe7\x0b\xec\x09\xe3\x2e\xce\xcc\x95\x45\xb6\xeb\x45\x85\xc4\x7a\xd0\x36\xac\x08\xea\xf1\xd0\x90\x06\x38\x89\xe7\x22\x4e\xd0\x32\xc8\x0f\x4b\x29\x79\xd9\x01\xe0\x61\x00\x8d\x37\x06\x46\x94\xa9\xab\x8d\x72\x85\xae\x93\xd2\x2c\x4c\x31\x2b\xd1\xac\xc6\xd7\x6d\x25\x1a\xd8\x13\xda\x15\xc4\xc9\x42\x0f\x8a\xc0\x79\xeb\x02\x8e\xfb\x65\xa0\xc6\x5d\xd6\x0a\x8f\xb6\xa2\x9e\xbf\x38\xed\x33\x32\xd0\x17\xce\xa5\xbe\x91\x91\x1c\x7e\x43\xfc\xf4\x3b\xf7\xbe\x98\xf5\x3e\x19\xc9\x9d\x33\xd0\x4f\x92\xbf\xfe\x01\xf2\x4e\x9f\x03\xed\x0b\xc9\xfb\x3e\x97\x50\x7e\xe1\x0c\xb4\xda\x4b\xfa\xcf\xf8\x3d\xe9\xdf\xd7\xcc\x40\x0b\x2d\x37\xf7\x52\x00\x78\xd1\x00\x7a\xe7\x1b\xd3\xaf\xcf\x40\xdf\x1a\x40\x6f\xcd\x40\x0f\x4e\x28\xf5\xca\x1e\xfa\xa3\x0c\x14\x75\x3c\x39\xd9\x92\x7c\x65\x98\xce\xf2\x15\xcb\x8a\x53\x50\x0b\x46\xcb\xf2\xca\xeb\x64\x66\x03\xcf\x81\xb6\x69\x0f\x92\x45\xd6\xa8\x96\x0a\x62\xbc\xd9\x4d\xae\xda\xae\x33\xe8\xd5\xe4\x55\x6d\xd8\xee\x33\xad\x58\xe7\x24\x3d\x18\xce\x81\x85\x39\x0e\xd3\xf1\x7a\x3b\x6e\xea\xfb\x29\xdc\x75\xcd\xf2\x5c\xdb\xed\xd7\x9a\xd9\x11\xcf\x4e\xa2\x68\x26\xd5\x46\x0d\x7b\x3d\x47\xb0\x54\xa1\xa8\x20\x15\xe2\xed\x50\x1c\x25\xd0\xf2\xad\xd3\x99\x77\xcc\x40\xef\xb2\xae\x70\xb8\xaf\xb0\x78\xfe\x8e\x87\xcf\xc8\x40\xdf\x31\x80\x36\x0d\x9e\x20\x67\x31\x3c\xfa\xce\xbd\x6f\xa1\xbf\x4f\x06\xf5\x71\x19\xe8\x3b\x06\xa4\x5f\x82\xdf\x7d\x6e\xda\xfd\xaf\xc8\x40\xcf\x4e\x31\xfe\x77\x64\xa0\xd3\x36\x19\x7d\x4c\x06\x9a\xb9\x11\xff\x5d\x39\x04\x50\xab\xb3\xfc\x5f\x78\xc9\xd3\x7d\x7f\xfa\xe2\xfa\x01\x34\x73\x4e\x49\x76\xe5\xd6\x01\xf4\x96\x2d\xcb\x1d\x20\xed\x80\xad\x9c\x07\x59\x7f\x7a\x25\x42\xbe\xd6\xab\xc7\xc3\x52\xb5\x65\x2d\xa6\xc4\xaa\x0e\xe8\x28\x4f\x2b\xd6\x60\x5d\x0c\x0b\x42\x45\xed\x5a\xce\xa8\x21\x19\xf3\xcc\xc8\xcb\x28\x1c\x25\x88\x16\xc6\x83\x1a\x9f\xa1\x3c\xec\x64\x24\xc5\x5c\xb8\xf1\xfa\xba\xec\x12\xad\xd5\x92\xaa\x8b\xb9\x65\xd1\x28\x18\x3e\x1c\xf8\xeb\x47\x91\x02\xaa\x85\x78\xa1\xd5\x4f\x0e\xb3\x89\x45\x07\xac\x73\xc3\x62\x15\xb0\xd1\x32\xe8\x73\xbc\x14\x35\x38\x90\x12\x01\x1a\xda\x07\x23\xfc\xf0\x41\x77\x87\xef\xf5\x83\x6e\x33\xdf\xac\xee\x8d\xec\xbd\x46\xf0\xd6\x46\xad\x17\x07\xea\xfe\xd5\x7d\xde\x0c\x34\xe3\xdd\x79\xed\xa3\x81\xe6\xad\xab\x16\x36\xcf\xb3\x13\x5f\x70\xdf\x9c\xea\xbc\xf1\x4a\xf7\xc6\xae\x67\xdb\xbf\x5d\xfd\xbe\x57\xba\x13\xfd\xe9\x40\xfd\xdf\xe6\xb8\x8f\xf0\xfd\x3a\x07\x23\x9f\xcd\x34\x38\x28\xff\x82\x24\xb6\xf2\xdc\x6d\xd0\x7a\xef\x40\xaf\x3f\xca\xef\x0b\xfb\xd0\x7b\xfc\xa4\xc1\x47\xea\xff\x1d\x7f\xd2\xa0\x7f\x42\xef\x88\x97\x43\xd9\x88\xe9\xd5\x9f\x34\xd0\x9f\x1e\x6b\xfa\x35\x47\xc6\xce\xda\xe3\x49\x9f\x8c\xfe\x17\xe3\xef\xcd\xa5\xa7\xcb\x0e\x2a\xdf\xf7\x77\xa8\xae\x9f\xba\x7f\x33\x70\xba\x1e\xc4\x1b\x06\xf6\xc3\xfa\xc8\x96\x9f\xe4\xd9\x3b\x93\x8f\x2e\xb7\x2b\xf7\xcd\xf5\xc4\xe7\xb9\xd5\xba\x0b\xcb\xad\xa8\x4d\x6b\xe5\xe6\x48\x81\x2b\xcb\xc8\x85\x2d\xe0\x4c\x7b\x93\x76\xb9\xdc\x2b\xf6\x91\xac\xb6\x46\x33\x20\xe3\x80\xad\x1a\xfd\x79\xb3\x69\xcc\xdb\x8e\x51\x2d\x8f\xa8\x65\xa5\x82\xae\x32\x6f\xc2\x7a\x4d\xad\xe9\xfd\x61\xb2\xa8\x8f\x77\x07\x99\x0d\x45\x4e\x2e\x72\x8e\xdc\xce\x36\xb2\x9c\x56\xaa\x5e\xa1\x5b\x10\x8c\x5c\xe0\x3b\xa6\x3b\xab\x40\x29\x39\x35\x06\xb5\x6c\x67\x46\x3e\x6f\xc3\xd9\xce\x93\xdf\xe0\x54\x3f\xf0\xa8\xc5\x25\x81\xd3\x15\x53\xc6\xd7\x05\x4e\x47\x65\x77\x3e\xef\xec\x77\x6e\xfc\xdd\xa2\xeb\x06\x8e\xa3\xf2\xca\xef\x16\x91\x8f\xc0\x2f\xf3\xc5\xf1\x3b\xf5\x49\x37\x4c\xb9\xdf\x70\xdc\xe7\xfa\xe4\x62\xc7\xcf\x45\x3b\xb9\xbb\x5f\x8c\xbf\x67\x93\x73\x87\xe3\x83\x27\xc5\x38\xdc\x91\xf6\x3f\xce\x87\x1d\xf4\xe7\x4b\x2e\xd9\x24\x27\xbd\x55\xe5\x2c\xcf\x7b\xd1\xe8\x27\x81\xd3\x17\x5a\xb2\xb1\xc7\xee\x4b\x6c\x5f\x14\x38\xdd\xf9\x47\x21\xaf\x9f\x71\xca\x9e\x03\x7d\x57\x7e\xe1\x8c\xd3\x9b\x1b\x4b\xf4\xa7\x33\x4e\xa5\x4a\x77\xd4\x58\x35\x94\x84\xd3\xc5\x58\xac\x8e\xed\xf4\x3a\xe5\x08\x23\x6b\x6a\xa5\x06\xf9\xb0\xa7\xc7\xfd\x7c\x29\x5f\x53\xea\x0d\x1e\x19\xa4\x99\xef\x10\xd4\x8e\x37\x17\xed\x20\xb1\xc8\x41\x71\xb8\x88\xa4\x21\x6b\xc2\x09\x96\xa7\xf9\xdc\x78\x91\x4b\x08\x74\x26\xd3\xea\x62\x1b\x38\x4d\x8d\xf6\x72\x3c\x2f\xad\x93\x23\x65\x59\xae\x96\x78\x25\xc3\x47\x41\x75\x5a\x9e\x4e\x13\x20\x9d\x56\x65\xea\xa4\x49\xc6\xcb\xeb\x29\x72\x58\x1e\xff\xe8\x19\xa7\xe4\x16\x8f\x5f\x33\xe3\xf4\xd6\x26\xd0\x4f\x98\x71\xca\x9c\xd2\xdb\x95\xaf\x30\xe3\x44\xf4\x4b\x07\xfe\x77\xcf\x38\xdd\x90\x41\x7e\xce\x8c\x53\x54\x7f\xbe\x88\xf4\xdf\x31\xe3\x04\x56\x82\xfc\x8c\xf5\x6d\xfd\x3b\xce\x78\x9c\xd2\x3b\xd2\x85\xa7\x78\xbd\x39\xe3\x71\x34\x30\xee\xca\x8d\xf6\x94\x3d\xf0\xf7\x4c\x76\x87\x72\x91\x3d\xed\x90\xda\xfe\xbd\x7e\x69\x68\x77\x32\xeb\xfa\xc0\xe3\x86\x64\xff\xcd\xcd\xd7\xfa\x3d\xec\xf1\xd7\xcc\xe8\xe8\xf7\xb0\xc7\x8f\xb8\x58\xe6\xcd\xa5\xf2\x4b\x6e\xb4\xba\xef\x2f\x37\x5f\x3f\x13\xf5\x66\x40\xf5\x4b\x66\xa2\x06\x83\x65\xe6\x78\x26\xea\x6c\x40\x75\x34\x13\x95\x0a\xb2\xd6\x3a\x95\x50\x66\x89\xd0\xc0\xe9\x30\x3e\xb7\xd4\x60\xee\x4a\x2b\x38\x03\x7a\x7a\x59\xcc\x75\xa3\x86\x5a\x2a\xae\xed\x60\xd1\x0a\x92\x4d\x62\xe5\x40\x75\x32\x5e\x1a\xd5\x76\x68\x28\xf5\x91\x97\xaa\x16\x43\x2a\xd3\xbc\x89\xcb\x62\x34\x75\x2a\x1d\xad\x02\x2b\xfa\xee\x56\xf3\x8e\x0d\xb5\xb2\x3f\xe6\xf5\x49\x61\x90\x91\xc7\x41\x37\x55\xb2\x56\x7d\x50\xf0\x7b\x4d\x2e\x69\xe9\x5e\x00\xcb\xf3\x99\x9c\x1e\x59\xb3\xeb\x96\xf0\xae\xca\xe2\x6e\xbd\xd5\xe9\x03\x8f\xa5\x7e\xc2\x4c\xd4\xe5\x01\xd5\x51\xf9\x9c\x99\x94\xcb\x03\xaa\xa3\xf2\xd6\x4c\x94\xae\xdf\x23\xf3\xff\xc2\x3a\xb3\x2d\x87\x80\xe3\xcb\x65\xfe\x2f\x2f\xf1\x1d\xe4\xf9\x35\x33\x7f\xab\x63\x35\xce\xcf\x24\xed\xca\x3d\x7e\x41\xfe\x23\xf5\xff\x8e\xbf\x20\xbf\xd0\x9f\xd8\xd3\x79\x5e\x4e\x03\xa8\x67\xbf\x20\xaf\x9f\x0b\xa8\x3e\xfb\x5a\xd9\x8b\x12\x9c\x97\x8f\x0b\x1f\x05\x54\x5f\xe2\x2a\xd0\x37\x37\xef\x5f\x72\x2f\x04\x27\x5c\x00\x1a\x53\x89\x02\x44\x4d\x10\x24\x95\x12\x2a\x30\x89\x63\x01\x60\x99\x2a\xa2\xa2\x42\x55\xb6\x21\x93\xb1\xa2\x41\x5b\x22\x08\x52\xaa\x28\x08\x10\x2a\xaa\x1a\xdb\xcf\x50\xdd\xe1\x54\xce\xe9\x75\xfc\x5f\x22\xa0\xda\x65\x97\x07\x7e\x9e\x2f\x43\xe8\x4f\x03\xaa\xbc\x9c\x09\x9c\xc2\x92\x8d\x06\xb9\xba\x53\x88\xac\x1c\x4d\xcb\x74\xb8\x4c\x2d\xf4\x61\x66\x96\x49\x66\x96\x79\x04\xdb\x65\x2f\xad\x2f\xa3\x26\x9d\xea\x73\x1f\x2e\x5b\x28\x37\x98\x27\xdc\x91\x4a\xfb\xa8\x16\x1a\x6b\x5b\x2d\x74\x93\x5e\xb9\xdb\x18\xda\xe9\x5a\xaa\xe8\x1b\x8b\xdd\xaf\x2c\x40\x55\x35\x5c\x6f\xb9\x2c\x54\x8d\x1c\x2c\xa5\xc6\xf1\x7e\xc6\x01\x2b\x96\x1a\xf8\x15\x67\x8a\xca\xc2\xb2\x01\x3b\xb4\xb6\xae\x0f\xd9\x75\x33\x54\x57\x0d\x8e\xb7\xce\x00\x7e\xe0\x29\xab\x4f\x08\xa8\x2e\xcf\xa8\x8f\xca\xe7\x04\x54\x7d\xfd\x4c\x92\xf2\x35\x02\xaa\x2f\xac\x33\xdb\xf2\x85\x03\xaa\xb3\x33\x58\x27\xf2\xfc\x9a\x01\x55\xd3\x2f\xd7\xa4\x57\x58\xbf\x77\x40\x75\x6f\xfd\xbf\x5f\x40\xf5\xc2\x4d\x6c\xff\x73\x03\xaa\x97\x4f\xbf\x7d\xf5\x80\xea\x99\x3e\x5c\xf2\xab\x31\x2a\x14\x35\x95\x4b\x02\x56\x34\x2e\xc9\x5c\x56\x25\x22\x01\x2a\x8a\x54\xa2\x9a\x20\x72\x40\x21\x67\x36\x82\xd8\x66\x08\x21\x40\x21\xa6\xb2\x46\x89\x0a\x45\x49\x50\x05\xb4\xdf\x2b\x75\x87\x53\x5a\x6f\x06\x54\xbf\x64\xc9\xef\xcd\x9d\xfc\xfa\xd3\x25\xbf\xb2\x59\x19\x97\x13\xe1\xac\x21\x8d\xab\xc6\xba\x34\x69\x94\xd9\xba\x17\x0e\x57\x76\x64\x8e\x35\xa7\xe8\x2c\x33\x23\x6b\xe2\x64\x23\xd6\x56\xab\x61\xb3\x2e\xe5\x41\x19\xb6\x07\x2b\xa9\x54\x18\xa8\xf3\x85\xe3\xb9\x85\x2a\x88\x8a\xd3\x64\x31\xb1\xee\xd6\xd6\x91\x33\xaa\x9b\xd1\x7e\xaf\x54\x3d\x55\xe8\x6a\xfa\x14\x69\x19\xcd\x6b\x98\xd9\xba\xd5\x14\xab\xd6\x52\x48\xc8\xa0\xec\xa3\x56\x93\x96\x43\x4c\x57\xa9\xbc\xde\x4f\x5f\xb7\x57\xea\x9a\x25\xbf\x9d\x35\xfe\x92\x25\xbf\x37\x4f\xdd\x7d\xc2\x92\xdf\x1d\x97\x28\xee\xbd\xe4\x77\xf9\x80\xf2\x8e\x25\x3f\x5d\x3f\x09\xa8\xfe\xa7\xe9\xcc\xb6\x9c\x06\x54\x5f\xf2\xf4\xd6\xd9\x19\x9f\x9b\x37\xf5\x7e\xc6\x92\xac\x51\x0f\x50\xf6\x59\x6c\x70\xef\x4d\xe6\xf7\xd6\xff\xfb\x2d\xb9\x5e\x1e\x50\x5d\xb8\xc9\xfc\x4b\x2e\xf9\x5d\x74\x7a\xf3\x4b\x2e\xf9\xbd\xa6\x0f\x9b\x80\xea\xdb\xb7\x3f\xfe\xf8\xf6\xc7\x1f\xb1\x14\x0e\x71\x8c\x7b\x7e\xac\x84\x1d\xf6\x67\x2c\x9a\xf6\x7d\x4c\xd9\x3e\xc0\xfa\x2b\xd6\x58\x4d\xd9\x9f\xb1\x86\x6e\x58\x66\x2c\xa5\x37\xf4\xbf\x62\x75\x32\x60\x0e\xfe\x33\x36\x8d\xec\xc9\x90\xfc\x15\x2b\x2f\x5c\xe6\xff\x19\xdb\x10\xfb\xf6\x24\x4c\x7b\x4a\xea\x31\x56\x13\x8f\x0e\xf3\x6d\x31\x0b\x0e\x27\x9e\xcf\xec\xef\x7a\x99\xca\xe3\xce\xf6\x85\x5e\xa9\x8e\xf5\x67\x54\x1e\x7a\xb8\xeb\x18\x26\xc4\x8b\xdc\x90\x6e\xba\x7b\xf4\xfa\xe7\x74\xcc\x1e\xbb\x99\x2c\x97\xea\x8d\x9a\x9e\x2b\x35\xde\xe8\xa6\x6e\x35\xcc\xda\x1e\x95\x72\xc9\xea\x1e\x53\xfc\x16\x8b\xc5\x62\x7a\x2a\x75\x44\xed\x59\x83\xb1\x4a\x2d\x57\xd4\x6b\xdd\x58\xc1\xec\xc6\x7e\xdf\x3f\x1d\xd2\x1f\xb1\x4d\x0d\x17\x3b\xec\x25\xf6\x83\xc7\x17\xf7\x65\x3c\x78\x85\xeb\xe0\x35\x96\x9f\x31\x6a\x63\x77\xf3\xff\x9d\xd8\xb3\xb1\x7b\x8e\xb3\x87\x06\x9e\x32\xe5\x7a\x94\x9d\xe1\x68\xc2\x68\x9f\xf9\x03\x86\x29\xf3\x83\xa7\xef\x7e\xee\xde\x05\x6c\xf6\xf3\x2e\xec\x3e\x21\x7e\x8e\xf1\x57\x5a\x8f\x35\x4b\xb9\x6a\xd3\x8c\xfd\xfe\xf8\xe9\xbb\x7a\x72\x1f\xbc\xdf\xd9\x81\xe7\x32\xd8\x3f\xc7\xc1\xe0\x19\xf7\x1e\xe7\x1b\xb6\x77\xff\xdc\x89\xdf\x1d\xb1\x73\x8c\x1e\x35\xf3\x94\xc3\xed\x83\x33\x6a\x32\x65\x1b\xee\xb6\x7f\xef\xc4\xdc\x96\xd6\x39\xde\x0e\x8d\x3c\x65\x6d\x38\xfd\x11\x9b\x7a\x7e\xf8\x9c\xb7\x4d\x7b\xc1\x60\x16\xb1\x88\x3d\x79\x73\x2f\x4e\x8f\x48\x9e\x65\xf8\xb4\xc9\x73\x42\x3f\xc7\x75\x10\xd9\xfb\x7f\xee\xc7\x69\x10\xd9\x2f\xf0\xf8\xd0\xcc\x53\xee\x7c\x16\x9c\x11\xf7\x2c\xf2\xfc\xc8\x19\xba\xdc\x3b\x7a\x79\x27\x26\x0f\x04\xcf\x31\x7a\xd2\xdc\x45\x3e\x2c\x20\xd3\xdd\xd7\x82\xa3\x97\x77\xe2\xf6\x40\xf0\x1c\xb7\x27\xcd\x3d\xe5\x76\x16\xb0\xf0\xac\xad\x6f\x06\x6b\x16\x84\x38\x64\x47\x2f\xef\xc5\xef\x23\xc1\xb3\xfc\x3e\x6d\xee\x29\xbf\xdb\xcf\xcf\x8e\xaf\xa1\x1f\x05\xe1\x64\xe8\xb2\xe0\xe8\xe5\x9d\x18\x3e\x10\x3c\xc7\xf0\x49\x73\x2f\x86\x06\xc3\x20\x88\x98\xff\x23\x86\x83\x80\x85\xc4\xa3\x67\xfa\xb0\xe4\xec\x31\x50\x3a\x7e\x73\xaf\x7e\x1c\x91\x3c\xdb\x93\xd3\x26\xcf\x79\x89\x80\xcd\x7e\xc4\xc2\xe5\xd0\xa5\x6c\x79\xa6\x07\x07\xf6\xef\xcd\xfb\xab\x8c\xdf\xc4\xf5\x49\x88\xfa\xf4\xed\x9d\xf8\x7f\x4a\xf4\x5c\x27\xce\x34\xfb\x62\x4f\xf6\x75\xcf\x77\x67\xaf\x73\x36\x9e\x60\x97\xb0\xe0\x81\xf7\x5c\x29\x65\x76\xde\x60\x3b\x59\x33\xf5\x86\xb9\xab\x7a\x4a\x27\x56\x2e\x1d\xa2\xd8\x66\x3d\x57\xca\xc4\xec\xd0\x67\x2c\xf6\xfb\xbe\xc6\xbf\x62\xed\xac\x59\x33\x1f\xdf\xc7\xfe\xf3\x77\x0c\x08\x0f\xe5\x79\xa0\xc9\x82\x70\x37\x96\x6f\x7a\x71\x35\x97\x4f\xc9\x6c\x98\xdc\xc7\x29\x4f\x58\x0c\xd8\x64\x32\x74\xfb\x5b\xdb\xfb\x11\xb3\xa3\xd5\xe1\xcd\xd4\x1f\x92\xe7\xb6\xb8\x11\x83\xbd\x0a\xd8\xec\x6a\xc6\x1e\x29\x6c\x78\x3a\x18\xc6\x13\xb6\x5e\x0e\x15\x37\xd5\x39\x63\xb7\xb3\xf0\x40\x64\xc7\xc5\x91\x83\xb9\x90\x91\xfd\x93\xdb\x18\x39\x26\xb2\x61\xe4\x69\x20\x7c\x21\x27\x01\x99\x32\x77\x7e\x23\x27\xc7\x44\x36\x9c\x04\x64\xfa\x4e\x40\x0e\x03\xea\xcd\x9c\x1c\xd3\xd9\x33\xf3\x10\x25\x3c\x65\x06\x07\xe1\xcb\x0c\x1d\x39\x8e\xdb\x38\x3a\x25\xb4\x61\xe9\xc4\x37\xbe\x89\x51\xc5\x0b\xc2\xbe\xcf\xea\x55\x6b\x9b\x0b\xdb\x38\x60\x31\x1a\x39\xd3\x18\xf1\x9c\xe9\x84\x85\x6c\xdb\xec\xff\x1f\x00\x00\xff\xff\x4c\x82\x1e\x54\xae\x2f\x01\x00") - -func order_booksCoreSqlBytes() ([]byte, error) { - return bindataRead( - _order_booksCoreSql, - "order_books-core.sql", - ) -} - -func order_booksCoreSql() (*asset, error) { - bytes, err := order_booksCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "order_books-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x17, 0x90, 0xc0, 0x10, 0x33, 0xd8, 0x44, 0xd2, 0x10, 0x21, 0x24, 0xc, 0xed, 0xb6, 0xd6, 0x31, 0x5d, 0xec, 0xa8, 0x80, 0x3e, 0xd2, 0xb4, 0x5, 0x4a, 0x4e, 0x30, 0x71, 0x35, 0xc6, 0xf9, 0xeb}} - return a, nil -} - -var _order_booksHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xe9\x8e\xeb\x36\xb2\xf0\xff\x3c\x85\x10\x0c\xd0\x09\x7c\x12\x8b\x22\xb5\x9d\x7c\xb9\x80\x6c\xcb\xfb\xbe\xdb\x83\x81\x41\x49\x94\x2d\x6f\x72\x4b\xf2\x3a\xb8\xef\xfe\xc1\x96\x57\x79\x97\xd5\x7d\x3a\xb9\x21\x66\x4e\x5a\x16\x59\x1b\x8b\xac\x62\xb1\x48\xfd\xf6\xdb\x4f\xbf\xfd\x46\x15\x4d\xdb\xe9\x5a\xa4\x52\xca\x52\x1a\x76\xb0\x82\x6d\x42\x69\xd3\xd1\xe4\xa7\xdf\x7e\xfb\x69\xfd\x3e\x36\x1d\x4d\x88\x46\xe9\x96\x39\x3a\x54\x98\x11\xcb\x36\xcc\x31\x25\xfe\xce\xfd\x0e\x8e\x6a\x29\x4b\x6a\xd2\xed\xac\x9b\x7b\xaa\xfc\x54\x91\xab\x94\xed\x60\x87\x8c\xc8\xd8\xe9\x38\xc6\x88\x98\x53\x87\xfa\x93\xa2\xff\xd8\xbc\x1a\x9a\xea\xe0\xfc\x57\x75\x68\xac\x6b\x93\xb1\x6a\x6a\xc6\xb8\x4b\xfd\x49\xbd\xd5\xaa\x71\xe1\xed\x8f\x1d\xb8\xb1\x86\x2d\xad\xa3\x9a\x63\xdd\xb4\x46\xc6\xb8\xdb\xb1\x1d\xcb\x18\x77\x6d\xea\x4f\xca\x1c\x6f\x61\xf4\x88\x3a\xe8\xe8\xd3\xb1\xea\x18\xe6\xb8\xa3\x98\x9a\x41\xd6\xef\x75\x3c\xb4\xc9\x09\x9a\x91\x31\xee\x8c\x88\x6d\xe3\xee\xa6\xc2\x1c\x5b\x63\x63\xdc\xfd\x63\x4b\x3b\xc1\x96\xda\xeb\x4c\xb0\xd3\xa3\xfe\xa4\x26\x53\x65\x68\xa8\xdf\xd6\xcc\xaa\xd8\xc1\x43\x73\x5d\x4d\xca\x56\xe5\x32\x55\x95\x22\x59\x99\x4a\xc5\x29\xb9\x99\xaa\x54\x2b\x54\x21\x9f\x6d\x6d\xeb\xff\xde\x33\x6c\xc7\xb4\x96\x1d\xc7\xc2\x1a\xb1\xa9\x58\xb9\x50\xa4\xa2\x85\x7c\xa5\x5a\x96\x52\xf9\xea\x51\xa3\xd3\x8a\x1d\xd5\x9c\x8e\x1d\x62\x75\xb0\x6d\x13\xa7\x63\x68\x1d\x7d\x40\x96\x7f\x7c\x06\x42\x75\xf3\xd7\x67\xa0\x5c\xeb\xd5\xe7\x31\xe8\x62\x7b\x9e\x3b\x97\xc0\xb5\x22\xdf\x42\x76\x54\xeb\x00\x7c\x53\x3d\x95\x8f\xc9\xcd\xa3\x9a\x5b\xb0\x1b\xaa\x3a\x44\xd7\x89\xea\xd8\x1d\x65\xd9\x31\x2d\x8d\x58\x1d\xc5\x34\x07\xb7\x1b\x1a\x63\x8d\x2c\x3a\x47\xcc\x8d\x6d\xbc\x51\x74\xbb\x63\x8e\x3b\x86\xf6\x4c\x6b\x73\x42\x2c\xbc\x6f\xeb\x2c\x27\xe4\x85\xd6\x07\x4a\x5e\xa2\xe2\xb9\xb6\x43\xa2\x75\x89\xb5\x69\x68\x93\xf7\x29\x19\xab\x4f\xb1\x70\xd4\x7c\x62\x91\x99\x61\x4e\xed\xed\x6f\x9d\x1e\xb6\x7b\x3e\x41\xbd\x0e\xc1\x18\x4d\x4c\x6b\x3d\x1c\xb7\x73\xaa\x5f\x30\x7e\x65\xa9\x0e\x4d\x9b\x68\x1d\xec\x3c\xd3\x7e\xa7\xcc\x3e\x54\x69\x3b\x2e\x7d\x10\x7d\xdc\x12\x6b\x9a\x45\x6c\xfb\x76\xf3\x9e\x63\x69\x1b\xbb\xd3\x19\x9a\xe6\x60\x3a\x79\xa0\xf6\xe4\x1e\x49\x6e\x2d\x6c\x58\x4f\x02\xde\x4d\xba\x0f\x37\x58\xcf\x13\xba\x4e\xac\xc7\xaa\xee\xc0\xfb\x68\xb2\x15\xeb\x63\x8d\x36\x53\xeb\x13\x48\x8e\xa7\xe2\x7b\x2d\x26\xeb\x06\x3d\xe7\x6e\x0f\xd8\x27\x13\x90\xb2\xbc\xab\x46\xbd\xfd\x48\x7f\xa4\xb2\xe9\xd2\x61\xde\xad\x68\xd8\x4e\xc7\x59\x74\x26\xf7\x41\xae\x6b\x9a\x93\x47\x6b\x92\x47\xab\xed\x4c\xc9\xed\xca\xca\x6e\xb8\xdf\xad\x76\x7f\x16\x53\x96\x8f\x75\xa6\x6b\x23\xd7\xd2\xb6\xed\xe9\x3d\xcc\xfb\xca\xaa\xa9\x91\x27\xfd\x82\xbd\x1a\x4c\xb0\xe5\x18\xaa\x31\xc1\xe3\x9b\xc6\xfb\x5e\xd3\xce\xe4\x49\xdf\x64\x6f\xd1\x9e\xa5\xe0\x72\xc3\xa7\xf1\x6f\x84\xf7\x08\x3e\xb7\xe2\x87\xc3\x77\x3b\x73\xdd\x93\xdb\x3f\xd7\xf6\x61\xe7\xfa\x6d\x94\xa1\xf3\x20\x05\x5d\xd3\x9a\x74\x46\x46\x77\xeb\x30\xdc\x20\xc1\x53\xf3\x61\x1e\x9f\xf7\xf7\x6e\x41\x7e\x54\x39\xdd\xd6\xd1\x42\xb6\x96\xcb\x53\x86\xe6\x62\x8e\xc9\x71\xa9\x96\xad\x3e\x08\xfb\x8a\xd2\x05\x00\x79\xdb\xdd\xb7\x21\x6d\x9e\x1e\x67\x7f\x67\xa5\x2b\x72\xa9\x26\xe7\xa3\x3e\x64\xb6\xf6\xb3\x6d\xf2\xfe\x34\xe6\x13\x20\x0f\xb7\xd6\xc8\x83\x75\x0f\xde\xec\xc3\x1c\x5e\x19\xf5\xcf\xf0\x77\x19\xc4\x63\x6d\xb7\x7e\xdf\x63\x95\xb7\x4e\xde\xc3\xbc\x6d\x67\x80\x67\x78\x71\x9b\x3c\x58\x77\xeb\xfe\x3d\x4e\xcf\xce\x5f\x7c\x84\x22\xcf\x1c\x72\xbb\xf2\xd1\x94\xb0\xad\x28\x25\x12\x65\x39\x21\x55\x2f\x54\x1e\x19\xeb\x15\x87\xa1\x92\x5f\xc6\xd3\x11\xb1\x0c\xf5\xdf\xff\xf9\xf5\x81\x56\x78\xe1\xa3\xd5\x10\xdb\xce\x2f\x78\xbc\x24\xc3\x4d\x28\xe6\x81\x16\xba\x61\x5d\x6c\x12\xaf\xe5\xa3\xd5\x54\x21\x7f\x83\x9f\x0e\xee\x76\x0f\xd4\x7d\xa3\xce\x08\xbd\x01\x63\xc7\xdd\x0b\x30\xd6\xbc\x6e\x9a\x1f\x88\xff\x46\x3d\xc3\xc8\x86\xf5\x07\x20\xc8\xcd\xaa\x9c\xaf\x78\x40\x0c\x27\x5d\xfb\x7d\xb8\xd3\xc5\x68\x52\xce\x49\x67\x18\xfe\xf8\xc9\x8d\xc2\xe5\xf1\x88\x7c\xdf\xfd\x46\x55\x97\x13\xf2\x7d\xdb\xe4\x0f\xaa\xa2\xf6\xc8\x08\x7f\xa7\x7e\xfb\x83\x2a\xcc\xc7\xc4\xfa\x4e\xfd\xb6\x09\xce\x45\xcb\xf2\xba\xbf\xb6\x90\x77\xf0\x7e\x3a\x81\x78\xfa\x72\x0b\x38\x5a\xc8\xe5\xe4\x7c\xf5\x06\x64\xb7\x02\x55\xc8\x9f\x02\xa0\x52\x15\xea\x6d\x17\x76\xdb\xfd\x66\x6f\x80\xbc\x79\x31\xef\xd8\xdf\xe2\xdc\x4b\xe8\x2e\x3f\x27\xb2\xcc\x17\xaa\x1e\x79\x52\x8d\x54\x35\xb9\x27\xeb\x38\xfe\x76\x82\xfe\x00\xc5\x43\xc8\x33\xcc\x9f\x01\xd9\x08\xa0\x98\x0d\x4f\xba\x95\x52\x96\x9a\x58\xa6\x4a\xb4\xa9\x85\x87\xd4\x10\x8f\xbb\x53\xdc\x25\x1b\x31\x3c\x18\x2f\x3c\x26\xf7\xbe\xa2\x6d\xc9\xdf\xe9\xea\x81\xfe\x5d\xdf\x5e\x92\xe5\x5e\xb3\xef\xc2\xa7\xca\x72\xb5\x56\xce\x57\x8e\x7e\xfb\x89\xa2\x28\x2a\x2b\xe5\x13\x35\x29\x21\x53\x1b\xee\x73\xb9\x9a\x3b\xdf\x55\xaa\xe5\x54\xb4\xba\xa9\x21\x55\xa8\x7f\x75\xfe\x45\x55\xe4\xac\x1c\xad\x52\xff\x02\xeb\x27\x6f\x6f\xdc\x1d\x88\xaf\x71\x77\x0f\x7c\x60\xcc\x31\x97\x98\x7b\x64\xa6\x7a\x8d\xbf\x07\x30\xec\x59\xdc\xff\xe4\x8b\xc3\x5f\x7e\xa2\xa8\xa8\x54\x91\xa9\x46\x52\xce\x53\xff\x02\xff\x06\xff\x09\xff\x0b\xfc\x9b\xf9\xcf\xff\xfc\x8b\xd9\xfc\xcd\xfc\x9b\xf9\x0f\x55\x75\x5f\x52\x72\xb6\x22\xaf\x85\x22\xe7\x63\xbf\x5e\x94\xcc\x03\x76\xe0\x45\xc9\xdc\xc7\xf0\xd1\x92\xf9\x7f\x7e\x24\x73\x6e\x53\xb7\x72\xd8\xdb\xe1\xc7\x04\x71\x30\xdb\x67\x10\x37\x14\x53\x54\x65\x2d\x2b\xea\xcf\xc3\x0c\xf0\xcd\xfd\xb9\xda\x2a\xca\xd4\x9f\xc7\x23\xe2\xd7\x4b\xa3\x36\x50\x1a\xbd\x00\x3d\x24\xee\x86\xf1\xe3\x14\x5e\x74\x81\x5e\xa5\xf2\x12\x50\x0f\xa5\x27\x03\xf2\x94\xdc\x83\x96\x9d\x53\x7b\xc9\xcd\x7b\x99\xda\x0b\x40\xbd\xd4\x1e\x0f\x92\x9b\xd4\xae\x2d\x97\x46\x74\x3c\x1d\x3a\x1d\x07\x2b\x43\x62\x4f\xb0\x4a\xa8\x3f\xa9\xb7\xb7\x3f\x4e\xdf\xce\x0d\xa7\xd7\x31\x0d\xed\x68\x2b\xed\x84\xd7\x63\xff\x77\xcb\xe2\x66\x80\x3d\xc6\x9e\x3b\x16\x8f\x17\xdf\x2e\x47\x86\x46\x29\x46\xd7\x18\x3b\x1b\xc7\x20\x5f\xcb\x66\x5d\x76\xf0\x68\xed\xc6\x53\x6a\x0f\x5b\x58\x75\x88\x45\xcd\xb0\xb5\x34\xc6\x5d\x4f\xb5\xf1\x74\xb4\x77\xf9\x29\x63\xec\x90\x2e\xb1\x3c\x55\xf4\x21\xee\xda\x94\x3d\xc2\xc3\xe1\x39\x1a\xc7\x1c\x0d\xcf\x91\xfc\xc2\xb0\xec\xaf\xfb\x9a\xe7\xdd\xee\x5d\x37\xf8\x15\x87\x37\xda\xb1\x17\x89\x43\x16\x67\x02\x99\x4c\x86\xc6\x26\x66\x4f\x39\xc6\x88\xd8\x0e\x1e\x4d\xa8\x75\x9f\x6d\x1e\xa9\x95\x39\x26\xe7\x84\x5e\x5b\x15\xed\xfc\xd1\xed\x72\xea\x31\x9a\xf7\x8b\xaf\x2b\x50\xb7\x6a\x28\x95\xab\xae\x47\x07\x36\x3f\xa4\xf2\xd1\xb2\xbc\x71\xbf\x22\xad\xed\x4f\xf9\x02\x95\x4b\xe5\xeb\x52\xb6\x26\xef\x9f\xa5\xe6\xe1\x39\x2a\x45\x93\x32\x05\xee\x31\xe3\x5b\xec\x5e\x40\x67\xaa\xb8\x0d\x7a\x50\x63\xb2\x70\x66\x78\xf8\xcb\xdb\x15\x8e\xdf\xbe\x7f\xb7\x48\x57\x1d\x62\xdb\xfe\xd5\xdb\x5d\xee\x5e\xc5\x05\xdd\xe2\xd0\xaf\x37\x3a\xca\x5d\x1b\xbf\xcc\x99\x1b\xd1\xd9\xf3\x75\x79\x64\x1c\x62\x75\x97\xc9\xbc\x58\x5d\x35\xb5\x4b\xd5\x01\x73\xb9\xba\x1b\xfe\xbb\xd0\x80\xe5\x6e\x8d\xb0\xcb\xe1\x85\x80\xd4\xf6\x18\xe6\xa7\x29\xed\x2d\x46\xa8\x42\x23\x2f\xc7\xa8\x48\xeb\x0e\x47\x6e\x84\xee\x36\x43\x7b\x58\x9e\xd7\xbf\x1b\xda\x35\xda\x76\x31\x9f\x57\xb5\x6e\x0b\x67\xab\x76\x9e\x31\xd3\xb9\x36\xd3\x9f\x87\xb8\xae\xd5\xfc\x79\xb3\xf1\xf1\xf3\x15\x6d\xde\xe8\xf1\xe5\x57\x1a\x71\xb0\x31\xb4\xa9\xbe\x6d\x8e\x95\xeb\xca\xb6\x0b\x94\xbd\x2a\x87\x2d\x9c\xad\x1c\x76\xfb\xd6\x57\x68\x3b\xda\x4c\x7e\x68\x14\x5e\xda\xc7\xbe\xdc\x70\x2b\x96\xa3\xc8\xe8\xa6\x23\xf6\x74\xec\x66\x39\xda\x83\xe1\xd0\x11\x8f\xd5\xdf\x6f\x26\x7b\x0c\x93\x39\x75\x0e\xb6\xc9\xdb\xc6\x22\xd8\xb9\xdb\xc8\xad\x3b\x9d\x68\x0f\xd7\xdd\xab\xce\xf6\xd1\xb3\xcf\x7e\xc6\x0b\x38\xf3\x07\x1c\x3c\xec\xa8\xa6\x31\xb6\x2f\xeb\xa0\x4e\x48\x67\x62\x9a\xc3\xcb\x6f\x37\x3b\x9f\x3a\xb9\xd6\xd7\x9b\xd7\x16\xb1\x89\x35\xbb\x56\x65\xed\x87\x3a\x8b\xce\xc6\x4d\x32\x56\xd7\x6a\x4d\x2c\xd3\x31\x55\x73\x78\x95\x2f\x6f\x1f\xed\x94\x85\x60\x8d\x58\x1b\xf7\xc2\xfd\xdd\x9e\xaa\x2a\xb1\x6d\x7d\x3a\xec\x5c\x55\x94\x2d\xe3\xd8\x18\x12\xed\x7a\xad\xeb\xc3\xea\x4a\xec\xfa\xd5\x51\x76\x65\x3f\xe4\x8e\xcd\x7b\x7c\xb6\xb9\x3f\x7f\x3d\xcb\x72\xb0\x66\xec\x26\x8e\xcf\x32\x6b\x4f\x31\xfa\xa2\x99\xbb\x89\xeb\xdc\xec\x5d\xae\x7e\xc3\x0c\x1e\xed\xec\x04\xa6\x9b\xf7\x96\x39\xa7\x59\x55\x57\x96\x42\x6b\xcf\x5f\x75\x59\xd9\x58\xc0\x17\x0d\xe0\x76\xe4\x9b\x53\x4b\xdd\xa7\x69\x5c\x31\x3d\xbb\xe9\xe4\xed\xed\xfb\xf7\xeb\x4b\xb1\xeb\xe3\x60\xbb\xb1\xf6\xaa\x38\xb7\xb9\x80\xbf\x04\xea\x2f\x6c\xa7\x44\x3f\xd6\x6b\x93\x0b\x73\x15\xad\x27\x13\xf1\x56\xa5\x6d\x72\xe4\xad\x2a\xee\x3a\xf8\x62\x85\xf3\x9c\xce\x3b\xf5\x6e\xa2\xdb\xd7\xba\x81\x71\x43\x92\x61\x77\x6c\x32\x1c\x12\x8b\x52\x4c\x73\x48\xf0\x78\x67\x93\x0c\x95\x74\xc6\x27\xf6\xd7\xfd\xed\xd4\x26\x1f\xb2\x89\x3a\x1e\x6b\x7d\x92\xcf\xe4\x7d\x79\xb4\x4d\x7f\x31\xf3\x73\x43\x75\x67\x93\x1b\x4c\x45\x93\x72\x34\x43\xfd\xf2\xcb\xb1\x04\xff\x87\xa2\x7f\xfd\xf5\x1e\xa8\x4b\xcd\x77\x42\xfb\x7f\x67\x72\x7c\x00\xde\x89\x4c\x3d\xe0\x3d\x02\xdf\x10\x78\x73\x28\x5d\xde\xe1\x0e\x60\x70\x5d\xce\x59\x78\xd0\x92\x3e\x32\x85\xbd\x62\x4b\xef\xe5\x07\x04\x63\x4d\xef\x60\xf9\x2c\x7b\xfa\x24\xb3\x2f\x5a\xd4\x3b\xd8\xce\x6d\xea\xb5\x06\x37\xac\xea\x49\x4e\x48\x80\xba\xba\xd3\xcf\x63\x92\x1e\x5e\x44\x6d\xe7\xfe\x3b\x4b\xb3\x47\x0d\xef\x6d\x1b\x7a\xb1\xee\x01\xf5\xc5\xf1\xb2\x5e\x05\x5c\x5f\x46\x5c\x5b\xa0\xfd\x90\x25\x96\xb3\xe8\x90\xf1\x8c\x0c\xcd\x09\xb9\x14\xb6\x74\x16\xeb\x05\xcf\x74\xe8\x5c\x79\x39\x22\x0e\xbe\xf2\x6a\xbd\xd4\xba\xf6\xda\x36\xba\x63\xec\x4c\x2d\x72\x29\xc2\x26\x72\xbf\xfe\xfb\x3f\x07\xdf\xe5\xbf\xff\x7b\xc9\x7b\xf9\xf7\x7f\xbc\x32\x27\x23\xf3\x4a\x30\xec\x00\x6b\x6c\x8e\xc9\x4d\x5f\xe8\x00\xeb\x1c\xcc\x96\x33\x63\x44\x3a\x8a\x39\x1d\x6b\x9b\x88\xb5\x60\xe1\x71\x97\x78\x57\x63\xa7\xa6\x75\x2d\x89\x35\xb4\x2e\xd1\xee\x2f\xb7\xb6\xb1\x3f\x43\xdb\x8d\xb6\x5d\x0a\xd7\x23\x53\x84\x3b\xdc\x36\xf9\x72\x77\xb2\xc3\x2a\x72\xf5\x46\x9c\xf4\x38\x22\x75\x1c\x25\x7d\x6e\x1d\x11\x1c\x13\x0f\x26\xcf\xdd\x64\xea\xe6\xfa\xe3\x11\x26\xaf\x5a\xda\xc0\xd8\x7c\x38\xff\xf0\x26\xa3\x77\xcc\xc2\x65\x56\x63\xd8\xc1\x94\x6e\x5a\x77\x76\x8b\xa8\x98\x54\x95\xee\xb0\x97\xca\x57\xe4\x72\x95\x4a\xe5\xab\x85\x93\x1d\xa3\x8d\x15\xad\x50\xbf\x80\x6f\xd4\x1b\x60\xe8\x7d\x79\xfb\x46\x31\xdf\x28\xfa\x1b\xf5\xf6\xf6\xeb\x1f\x77\x5b\x33\xeb\xd6\xf4\xb5\xd6\x57\xd8\xb9\xb5\xe3\xf3\x2c\x4b\xde\x5d\x9f\x1d\x61\x6f\xa0\x63\x8c\x0d\xc7\xc0\xc3\x8e\x9b\x81\xf3\xbb\xfd\x3e\x7c\xfb\x46\xbd\x31\x34\x10\x7f\xa3\xb9\xdf\x68\x48\x01\xe1\x3b\x23\x7c\x47\xfc\xef\x34\x64\x90\xc8\x85\x68\xc6\xcb\xf2\x55\xe8\x4c\xc7\x3d\x59\x71\xd2\xa3\xca\xb2\xe3\x98\x86\x76\x1b\x93\xc8\xb1\xfc\x33\x98\x60\x67\x6a\x93\xbd\x85\xeb\x18\xe3\xb3\xd3\x1c\x37\xf1\x21\x44\x23\xe1\x19\x7c\xa8\x83\x35\xad\xe3\x8d\x89\xdd\xc4\xc1\x22\x16\x32\xcf\xe0\x60\x3b\xae\x3d\xdd\x79\xf6\x9b\xbd\xd4\x9b\x28\x38\x48\x33\x4f\xb1\xc1\xed\x50\x6c\x67\xcf\x07\x50\x08\x08\xb0\xcf\xa0\xe0\x3b\x23\x53\x33\xf4\xe5\xe3\x5c\x08\x80\x63\x9e\x42\x21\x9c\x70\xb1\x4d\xa1\x7e\x00\x0f\x8f\x38\xf8\x1c\x9e\x75\xa7\xe3\x6e\xd7\x22\x5d\xec\x98\xd6\x6d\x9d\x12\x69\x40\x8b\xcf\x80\x17\x37\xe0\xdd\x78\x69\x67\xa1\x59\xb7\xa1\x33\x3c\x78\xaa\xab\x01\xbd\x01\xbf\xed\x85\xcd\x2a\xf9\x36\x02\x56\xe4\x9f\x92\x0e\x00\xc7\x08\xf6\xcb\xae\xf5\x04\x70\x1b\x91\xc8\x89\xcf\x71\xc2\x9c\x74\xf4\x76\xa1\xeb\x1e\xda\xbd\x85\x09\xd0\x3c\x8b\x9e\xea\x11\x00\x5d\x76\xf6\xe1\x81\x9b\x3d\x0e\x00\xc3\x73\xcf\x71\x82\x3a\xba\xb1\xd8\x1d\x60\x30\x47\xc3\x8e\x6e\x90\xe1\xcd\xa9\x11\x00\x16\x80\xa7\x26\x61\xc0\xee\xf6\x6d\x76\xf1\xf4\xc5\x1d\x36\x38\xfe\xb9\x69\x1e\x70\x1d\x63\xdc\x25\xb6\xd3\x39\x8f\xd8\xdf\x41\xc5\x8b\xc2\x73\x3d\xc2\x9f\xb8\x0a\x9b\xad\x11\x7c\xdb\x98\xac\xcd\x36\x44\x5b\x24\x57\x6c\xed\xcd\x7d\xfe\x67\x8d\xed\xd9\x5e\xff\xb1\x13\x91\x88\x34\x13\xa5\x74\xa3\x9e\x6d\x14\x5a\xc9\x78\xb6\x5e\xcd\x34\xea\x6c\x3c\x91\x94\x60\x36\xdf\x6a\x31\xe9\x52\x26\xc7\x17\xa4\xb4\x54\x93\x4b\xf1\x1a\x97\x2d\x46\x2b\x72\xbc\xde\x2c\xe4\xbd\x12\xba\x8a\x64\xed\x6b\x24\xa2\xcd\x4c\x82\x2b\xe7\x51\x21\x9f\x92\x8b\xd1\x5c\x3e\x1e\xe1\x21\x23\x21\xc8\xb5\xd9\x62\x3e\x56\x29\x67\x13\x8d\x0c\x9f\x88\x64\xa3\xb9\x52\x36\x15\x2f\xa0\x0a\x2f\xb7\x1a\xf5\xda\xc3\x48\xe0\x06\x09\x03\x4b\x71\x26\x59\x93\x59\x46\xca\x35\x6b\xf1\x5a\x12\x4a\xad\xb4\xd4\x6c\x26\x9a\xcd\x3a\x53\x4f\x36\x5b\xad\x32\x27\xb7\x9a\x72\xb5\x98\x89\x35\xdb\x15\xa9\xc1\xf1\xcd\x02\x7a\x18\x09\xda\x88\xab\x5c\x6c\x25\x53\x59\x26\x9a\x82\xf1\x7c\x09\x45\x9a\xd9\x78\x2e\x1f\xcb\xc6\xd3\xb5\x7c\xb1\xc6\x24\x5b\xb0\x9d\x8b\x57\x92\x85\x7c\x2d\x2a\x17\xa4\x4a\x83\x2f\x45\xf9\x42\x93\x49\xbe\xf9\xcd\x4b\x59\xbb\xa9\x77\xfa\x7a\x9b\xcb\x77\x48\xc3\xfd\xdd\x26\xb7\x73\x36\xbe\x51\xe8\x1b\xe5\x58\x53\xf2\x80\x06\x9e\x67\x63\xf8\xd6\x3f\x77\x15\x75\xac\x7d\xaa\x45\x34\xc3\xe9\xe0\xe1\xa4\x87\xc7\xd3\x11\x5a\x8f\x99\x48\x35\xfa\xf6\x11\xdd\x79\x8a\x9d\xb9\x82\xbd\x56\x89\xbd\x8a\xdd\x4f\xf6\x43\x20\xbd\x7c\xb2\xe2\xdc\xb8\xf4\x8f\xf5\xf1\xa5\xe4\x07\xbf\x9d\xbc\x4b\x80\x38\x92\x33\xe0\xd7\xd3\x2a\x0f\x19\x01\x7c\xa3\xc0\x86\xae\xb7\xff\xfe\xec\x9a\xc9\x9f\xbf\x53\x3f\xb3\x34\x4d\xff\xbe\x5d\x89\xfc\xfc\x8d\xfa\xf9\x90\x64\xb3\x7e\x5b\xab\xc4\x0e\x3f\x3a\xcb\xc9\xe6\x47\x6f\xcf\x1d\x6a\xb8\xc9\x36\xeb\x3a\x7e\xbb\xf0\xe7\xff\xbd\xa6\x42\x5e\xde\xa0\x87\x37\xe6\x1b\x05\xff\x2e\xbc\x81\x3d\x6f\x3c\xe4\xf9\xbf\x6b\xbf\xb9\xbc\xfd\x9d\xfa\x6d\x3f\xde\x04\x80\x78\x78\xb1\xdf\xb8\x9b\xbc\x45\xaa\xd1\xaf\xca\x1b\xf4\xf0\x76\xa1\xdf\xfe\xb2\xbc\xed\xc7\x9b\xc0\xb2\x9c\xf8\x77\xed\x37\x97\xb7\xbf\x53\xbf\xad\xc7\x1b\x23\x08\x48\xa4\x59\x51\x60\xdd\x7e\xa3\x37\xcc\x0d\x8d\x91\xb1\xe1\x4d\x64\x18\x08\x79\x86\x86\x9c\xc0\xfe\x8e\x78\x9e\x15\x68\xfe\x2f\x35\xa7\x80\x1d\x8f\x80\xa6\x77\x36\xfc\xef\xc6\xe3\xbe\x1f\x01\x02\x3b\x7b\xe7\x8b\xc7\x2f\xac\xab\x87\x7e\x14\x98\x9d\x6d\xf8\xbb\xf1\x08\xbf\x51\x02\x2b\x88\x22\x14\x38\xc1\x9d\x46\x5d\x0e\x6d\x07\x5b\x8e\x31\xee\x76\x14\x3c\xc4\x63\x75\x43\x31\x38\x9e\x74\x1e\xc6\x80\x4e\x31\x5c\x98\xcc\xc0\xc5\xc9\x6c\x27\xa7\x31\x76\x8c\x19\xf1\xcd\xd1\xba\xdf\x5c\x96\xe6\xc4\xe8\xf6\xd6\x08\xc1\x37\xea\x67\xd7\x41\xef\x0c\xc8\xf2\xd3\xc6\xcb\x86\x2a\xc4\xf0\xdb\x69\xef\xb6\x9c\x5f\x10\xf4\x16\xc5\x15\x41\x07\x28\x69\x0f\x4f\x0f\x4a\xda\x5f\x68\xe3\xa9\x51\xeb\x52\xc5\x09\xdb\xc9\xf7\xe3\x24\xed\xa2\xf8\x78\x49\x7b\x78\x7a\x4c\xd2\x3e\x23\x55\x2e\x55\x77\x96\xc0\x97\xf2\xde\xfd\x2e\x81\x77\xb9\xef\x3b\x66\xb9\x6f\xd4\x9b\x8a\x30\x87\x79\xc4\x43\x86\x87\x02\x86\x2a\x8d\x45\x9d\x15\x21\x21\x44\x13\x31\x14\x21\xd2\x88\x26\x22\x56\x67\x21\x12\x39\x9a\x81\x3c\xd6\x45\x5e\x03\x08\x03\x51\x65\x34\x1e\xbf\x7d\xa3\xde\x00\x66\x59\xac\xe8\x0c\xd6\x91\x0a\x09\xcf\xeb\x2a\xc7\x72\x1c\x61\x18\xc2\x21\x8e\x87\x18\x62\x5d\x84\x44\xe1\xf5\xf5\x4c\xa1\x2a\x3c\xd0\x18\xc4\x02\x5e\xe1\x44\x4d\xd3\x21\x03\xde\xbe\x51\xdc\xe6\x7f\x27\x61\x49\xee\x3b\x44\xdf\x59\xde\x1b\xad\x74\x7f\xe6\x7e\x67\x39\x56\x10\xef\xbd\x64\x58\x9e\x13\x05\x1a\xf2\x3c\xf7\x8d\x02\xeb\xff\xd3\x67\xe5\x1b\xc5\xc0\xf5\xbf\x60\xfb\xcf\xee\x57\xb0\xff\x03\x7c\xa3\xde\x24\x49\x92\xa2\x8b\x49\xfd\x3d\x9c\x99\x55\x63\x2c\x0c\x27\xea\x23\x64\xb0\x83\xf6\xca\xe4\x42\x55\x0e\x0a\x08\xe7\x9c\x05\x3d\xa8\x35\x9d\x09\xd4\x73\xbd\xb6\x3e\x77\xf4\x65\x1b\xe6\x4d\x81\x65\xab\x89\x58\x72\x1a\x93\x39\x54\x4e\xa6\xea\x4b\x26\x56\x1f\xb7\x41\xb6\x31\xcd\x64\x6a\xfd\x02\xaf\xae\x41\x4b\xcd\x62\x3d\x97\x2b\x49\xfb\x52\xa0\xa1\x35\xa8\x54\x12\xa9\x54\xa8\x3a\xd2\x24\xda\x12\xaa\xbc\x56\xc9\x47\x1b\x78\xd4\x1a\x2c\x0b\xc3\x58\x9b\x87\xdd\xc9\xd4\x5a\xd6\xc2\xf6\x34\xc7\x2a\xbd\x74\x4f\x1b\xb7\xd2\x8b\x78\xbb\x65\xe8\x36\x3f\x4b\xc1\x4a\x23\x24\x25\xb5\xbc\x22\xc4\x0a\x02\x93\x2f\xaa\xd5\x94\xd9\x5d\x43\x6e\xe5\x51\x16\xaf\x26\xcc\x11\x32\xa9\x2f\x48\xa7\x25\xb7\xfe\xa7\x2d\x35\x01\x2a\x49\x52\x8c\x4e\x4b\x7f\xb5\xe2\xea\x14\x7d\x65\xd8\x7b\x47\x02\x1b\x8c\x16\xbf\x21\x41\xd4\x55\x88\x90\x00\x38\x8d\x87\x40\x65\x34\x24\xaa\x02\x43\xeb\xba\x8a\x59\x5a\x85\x0a\xa3\x0b\x8a\xaa\xea\x88\xa3\x81\xc6\x22\x45\x60\x09\xc7\xd3\x04\x08\x1c\x47\xb3\x02\x54\x6e\x8d\x04\xee\xaa\xb2\x0b\x2c\xa4\xe1\xdd\xb7\x0c\x40\x3c\x12\x20\x87\x04\xfa\xc6\x58\x00\xfc\x83\x63\x81\x36\xf4\x39\x5d\x89\x28\xcd\x9c\x9a\xad\x8d\x53\xa9\x62\x38\x53\xcb\x15\x96\xa1\xec\xaa\x58\xee\x26\xeb\x15\xd4\x1c\xa9\x85\x44\xa2\x15\xef\xf2\x68\x12\xc9\xf7\x4b\x53\xad\x5d\x22\x35\xa7\x10\x22\x3a\x1d\x1d\x2a\xed\x06\x1a\x25\xab\x76\x33\xe6\xf4\xfa\x12\x18\x31\xe1\x56\x2e\x53\x6f\x6d\xfa\x6e\x33\x16\x8e\xfa\x32\x95\xab\xd3\xa5\x55\xa9\xac\xd5\x46\x63\x40\xcf\x1b\x11\xf0\xde\x76\x42\xc3\x21\x17\x49\xd2\xd5\x7e\xb8\x99\xb7\x6a\x59\x34\x9f\xbc\x5b\x89\x19\x3f\xeb\xbf\x2f\x43\xd2\x64\xaa\x4b\x53\xb6\x19\xb1\x07\xd9\x48\x85\x14\x05\x32\x20\x56\xda\x18\xf1\xad\x9c\x50\x29\x81\x6e\xd5\xa8\x84\xe6\x6b\xc8\xb5\x0b\x63\x01\x0f\x3c\xaa\x94\x90\xfe\x4f\x8d\x05\x14\x8c\x1e\xbf\x11\xc2\x12\x05\xa9\x18\x8a\x2c\xd4\x01\x64\x38\x5e\x03\x2c\xcd\x40\x06\xb3\x1c\x80\xb4\x26\xb0\x3a\xa0\x11\x87\x69\x91\x45\x3c\xab\x32\x2a\xd1\x44\x9a\xf0\xb4\xae\xd1\x0a\xaf\x42\xdd\xdd\x0c\x40\x17\xd5\x9a\xbd\xa6\xed\x1c\x8d\x18\xee\xea\x48\xd9\xbf\x75\x57\xfd\x9c\x08\x04\x74\x6b\x2c\x80\x07\xc7\x42\x88\x25\x4e\xce\x64\x6b\x61\x79\xd9\x16\xe3\xa5\xd4\x72\xd2\x90\xe7\x4c\x5c\x28\x95\xdf\xa3\xf5\x32\x98\xdb\x7c\x3b\x36\x8e\x89\x51\x38\x0f\x37\xad\xf4\x64\x66\x58\x5c\x8e\x7d\x57\x75\x55\x2d\xcf\x75\xcc\xb0\x31\x81\x19\x0d\xc4\xcc\x7b\x7d\x1a\xea\xeb\x13\xc6\x5c\xd6\x05\x33\x82\x36\x7d\xb7\x1e\x0b\xd9\xf9\xa1\x2f\xe5\x59\x8e\x75\xaa\xc2\x90\xd6\xaa\x72\xbb\x94\xb5\x8b\x09\x73\x14\x49\xa8\xd5\xf4\x20\xd1\xae\xab\xd5\x79\x39\x1b\x03\xb4\x81\xe4\xa6\x22\xd4\x62\x4a\xcb\x31\xea\xa3\x34\x6c\x4d\xbb\x21\x42\x66\xc9\x30\x0b\xc7\x93\x6a\x29\x92\x61\xac\xa4\x99\x7c\x17\xdb\x4e\xd2\x9a\xe7\x50\x7d\x03\xb9\x74\x61\x2c\x94\x73\x97\xf4\xe9\x2f\x3e\x16\xd0\xe3\x63\x01\x06\xa3\xc7\x6f\x1a\xd4\x21\xd0\x91\x2a\xaa\xaa\x48\x58\x0c\x09\xc4\x6b\x73\xc3\x12\x82\x00\xe0\x55\x5e\x80\x8c\x02\xa0\xa0\x01\x8d\xd7\x31\xb7\x06\x4c\xd3\x98\xc3\x9a\xc8\x89\x40\x13\xf0\xcd\xb1\x80\xae\x6a\x3b\x23\x02\xd7\x2c\xdd\x7c\xbb\x8d\x12\x01\x41\x10\x6e\x8c\x85\x47\xcd\x82\x58\x5c\x25\xe9\xa5\xba\x24\x8d\x3e\xe2\x12\xc3\x3a\x61\x23\x71\x81\xc4\x32\x8b\x42\x3e\xd9\x0c\x8d\x26\x0d\x59\x9a\xbc\x33\x8d\x81\x66\xcc\xf2\xcb\x92\x66\x29\x43\x1b\xd3\x62\x65\x42\xf3\xce\xac\x4d\xb4\xd2\x5c\xea\x72\x93\x7a\x43\x9f\x3a\x22\xcd\x67\x1b\xb5\x68\x3b\x1a\xe7\x5d\x2d\xdc\x0c\x85\xee\xa1\x2b\xbb\x2b\x9c\x5e\xa1\xe6\x3b\xc0\x09\xc1\x9e\x2c\x81\x29\x8f\xf8\x77\x69\x38\xd5\x05\xbd\x44\x9c\x11\x84\x74\x4e\x17\xda\x23\x43\x0b\xc5\x1a\x5a\x28\xee\xf4\x9c\xac\x22\x0d\x99\x78\xdb\x8e\x84\x5a\xd0\xd1\x94\x71\x31\xe4\xd0\x51\x53\x08\x31\xa5\x1c\x7a\x1f\xdb\x7a\x28\x9c\xda\xc0\xcf\x5d\x18\x0a\x19\xaf\x8b\xb4\x29\xff\x77\x86\x02\x13\x8c\x1a\xbf\x71\x50\x13\x05\x9d\x85\x1c\x21\x9c\xa0\x01\x85\xe1\x15\x56\x11\x44\x9d\x81\x58\x67\x21\x00\x0a\xcf\x72\x22\x66\x90\x8e\x75\x80\x68\x88\x35\x5a\x61\x19\x85\x83\x50\xa1\x79\x85\x88\x6b\xaf\x1e\xba\xcb\xc0\x73\xad\xbe\xea\x04\x71\x2c\x4b\xb3\x57\x57\x0b\xfb\xb7\x6e\x38\x03\xb1\x22\x73\x63\x24\x3c\xba\x58\x60\x8a\xed\x3e\xc8\x4f\x59\x93\x56\xd2\x7c\x03\x8d\x97\x85\x59\x6d\x91\x80\xf5\x89\x39\x08\xcd\xe2\x52\xc1\x89\x82\x0c\x93\xe3\x23\x3c\xd7\x8e\x56\x84\x5a\x59\x5d\xca\xa8\x5b\x6e\xd9\x6d\x49\x53\x78\x82\xa6\xc9\xb9\x82\x25\x56\xef\xc5\x53\xb2\x2a\x81\x68\xa5\xcc\xc0\x36\x6b\x6e\x7a\x6e\x33\x12\x36\xca\x99\xda\xff\x23\x6d\x9e\xed\xc3\xf3\x5c\x2a\x96\xb6\xae\xcc\xca\x00\x8b\xee\x58\x86\x45\x49\x57\x98\xa8\x52\xe3\xb4\xb9\x91\xcc\xc2\x49\x78\xac\xe4\xe6\x7c\x63\xd2\x4c\x4f\x1a\x99\x29\x92\x2a\xd3\x3e\xac\xeb\xa5\x65\xad\xda\xc2\x55\x29\x59\x16\xb3\xa1\xca\x2c\x14\x71\x62\x7a\x1a\x98\x39\x8c\x9b\xa5\x7c\xbf\xd7\x96\xca\x8d\xcc\xaa\x26\x6d\x8c\x52\xea\xc2\x48\x91\xed\x4b\xda\xf6\x17\x1f\x29\xf0\xf1\x91\x02\x82\xd1\xf2\x4d\xc6\x3a\x45\xbb\x51\x15\x20\xf2\xf4\x6f\x34\xf8\x8d\x06\x14\x4d\x7f\xdf\xfc\xef\xaa\x36\x73\x1c\xcf\x5d\x77\x90\x76\x6f\x11\x23\x22\x91\xe3\x19\xf1\xd6\xca\xf8\xb2\xa6\xbb\x24\xfd\xe8\x4e\xb9\x5e\x22\xcd\x8c\x81\x96\xe1\x65\x25\x13\xe1\xd7\x7e\x57\x92\xa1\x17\xfd\x48\xc8\xa6\xbb\x8e\x3d\x4f\xcd\x57\xa0\xa9\x55\x1a\x2d\x1c\x49\xe3\xf8\x66\xba\x97\x2f\x28\xf1\xe5\xb2\x53\x62\x49\x8a\x78\x57\x09\x5f\xbe\xbc\xb9\xca\x74\x3f\xe4\xf4\xc0\x99\x70\xbf\x11\xa8\x2b\xa9\xfe\x47\x23\x67\x1b\xb1\xe1\x85\xcd\x3e\xc0\x95\x11\x77\x07\x0c\xb3\x03\x03\x80\xb8\xd9\xd6\xf3\x07\x06\xee\xc1\x70\x34\xc7\xfa\xa6\x06\xed\xc0\x30\x34\xe0\x80\x6f\x6a\xd8\x3d\x18\xc4\xb0\xbc\x6f\x30\xdc\x1e\x8c\x00\x59\xff\x22\xe6\x77\xf1\x04\x44\xb3\xbc\x7f\x6a\x84\x3d\x18\xc4\xbd\xd0\xe1\xe2\x1e\x8c\xc0\xbf\xd0\xe1\x80\xde\xc1\x61\x19\xe1\x85\x1e\x5f\xfb\x00\x5b\x38\x9c\xf8\x42\x97\x03\x66\x07\x87\x03\xf4\xba\xcf\xfd\xd2\xe3\xcd\x07\x82\x3e\xe1\x20\x6f\x5e\x91\x4f\x38\xac\x27\xcf\xc5\x2f\x3d\x9c\x37\x17\xc8\x27\x1c\xde\x93\xbf\xe1\x97\x1e\xc1\x9b\x07\xe2\x13\x8e\xe8\xc9\x4b\xf0\x49\x0f\x43\x7b\x73\x37\x7c\xc2\x01\x9e\x5c\x02\x9f\x7c\x31\x8c\x77\xbf\xde\x27\x1c\xe8\xd9\x13\xf7\x4b\x0f\xf2\xee\x3b\xfb\x84\xc3\x9e\xee\x84\x22\x9f\x60\x38\xcf\x86\xaa\x4f\x30\xfc\xe9\x6e\xa1\x5f\x6a\x04\xcf\x2e\xa7\x4f\x30\xe2\xe9\x8e\x9a\x4f\x6a\x20\xed\xd9\x6c\x0c\xe6\x7a\x97\x40\xd2\x5b\x6f\x9f\x3d\x5c\x2f\x18\x1f\xcd\x77\xbd\x72\xcb\xc9\xcb\xde\xd6\xb1\xaa\x1e\xb9\x57\x87\x07\x66\xb3\x7d\xeb\xee\xad\x6e\x4e\xbc\x6c\xb6\x56\xd9\x93\x7d\xd5\xa3\x2d\xd7\xe3\xdf\xdd\x6b\x24\xac\x9f\xbf\x53\xff\xfd\x59\xdb\xee\x8f\x8e\xd7\xff\x65\xff\xf7\x1b\xf5\xf3\xee\x3c\xc8\xcf\xdf\xd7\xce\xe7\xcf\xca\x74\x69\x8c\xbb\x9d\x8b\x49\x1b\x27\xef\x6e\xe5\x6e\xd8\x64\x38\x3c\x87\xb2\x4d\xe1\x39\x7d\x79\x0b\xcc\x09\xbe\x00\x32\x41\xce\x90\x07\x92\x5d\xf2\x01\x27\x21\xae\xaa\xc5\xce\x5d\xde\x3f\x08\x97\xd4\x82\xfe\x1d\x5c\xd6\x8a\xdb\x6a\x41\xef\xf4\xe2\x51\xb5\xd8\x76\xe8\x8b\x6a\xb1\x55\xae\xbf\xa3\x5a\x04\x7c\x76\xe5\xba\x5a\xb8\xcb\x9f\xc3\x03\xba\xa4\x16\x0c\x7d\x6d\xb6\x78\x68\xba\x60\xe8\x7f\xa6\x8b\xbf\xd8\x74\xb1\x5b\xcf\xee\x1f\xe8\x2b\xd3\x85\x5b\x4e\xd5\x42\xbc\xad\x16\xe2\x3f\xb3\xc5\x5f\x74\xb6\xd8\x85\x27\xf6\x0f\xdc\x65\xad\x60\x2e\x4d\x16\xde\xd3\x0d\x5e\xb5\x60\xff\x51\x8b\xbf\xaa\x5a\xb8\xe1\xa6\xc3\xc3\x45\x97\x93\xbd\x6e\x44\x1e\xb2\x22\xec\x3f\x56\xe4\x2f\x64\x45\x4e\x02\x88\xfb\x87\x2b\xf3\xc5\x5f\xc1\xe9\xf4\x64\x9d\x7e\x40\x7f\x7f\xda\xa0\x3d\x8e\xca\x1e\x1e\x7e\xc8\x3a\xf1\x5c\xaa\x01\x0d\xc6\xbf\xfa\xc8\xd9\x06\xbb\xf7\x0f\xd7\x96\x6b\x5f\xdf\xff\xfa\xbb\x0d\x9c\xed\xfe\xc1\xe1\xe1\xc7\x2c\x99\xfe\x19\x39\x57\xba\x67\xbb\x2d\xb3\x7f\xb8\xb2\x72\xf9\x2b\xf8\xa8\x7f\xb7\xa1\xb3\xdd\xea\x3a\x3c\x5c\xf4\x07\x3e\xde\x51\xfc\x67\xec\x78\xfb\xe7\xf4\xba\x84\xfd\x83\x3b\x76\xc0\xa6\x7f\x1c\xf3\xa5\xa3\x47\xdf\xa8\x9f\x75\xcb\x1c\xbd\xea\x11\x7f\xe5\xd3\xf2\x1f\x70\x81\xc8\xf5\xae\xda\xee\x8a\xee\x1f\xb8\xf3\xae\xf2\x7b\x76\xe9\x9f\xae\x0a\xb4\xab\x76\x97\x22\xec\x1f\x98\x2f\x3c\xaa\xbe\xde\x99\xf8\x4f\xed\xaa\xed\x5e\xfa\xfe\x41\xf8\xc2\xa3\xea\xff\x6c\x57\x9d\x5c\x7d\xb0\x7f\x70\xdd\x70\xee\xb1\xa3\xe5\x8e\x35\xb5\x1d\x42\x5e\xed\x8c\x0d\x18\xd3\x7a\x75\x08\x7f\x91\xf9\xf0\xc3\xbd\xc0\xd3\x04\x91\xfd\x03\xfd\x83\x7b\xee\x85\x11\xfd\x35\x7a\xee\x13\xfc\xc3\x93\x6b\x2a\xf6\x0f\xdc\xdf\x65\xcc\xfd\xb0\xd9\xf2\xb3\xc6\xdc\x36\x09\x6a\xff\xc0\xfc\x5d\xc6\xdc\x8f\xea\xb9\x8f\x1f\x73\xc7\xf9\x62\xfb\xbf\x85\xa3\xcb\x18\xf4\xe9\x58\xdb\xf2\xe2\xf3\x86\xc8\x8d\x5c\xdc\x7b\x1a\x5f\xde\xaa\xb8\x7f\xd7\xc9\x8b\x57\x59\x3e\x23\xb6\x6d\x62\xdb\xfe\x6f\xf4\xb1\x62\xf3\x3f\x0d\x3d\x72\xa1\xc6\x67\xca\xcd\x4d\xc1\xdb\xff\x4d\x7f\xa8\xdc\x5e\x98\x04\x3e\x41\x6e\x77\x12\xfa\x2e\x7c\x63\xeb\x91\x64\xbe\xfb\x50\xef\x7f\x6e\xc8\x6f\xd2\xe0\xd5\xcf\x14\x5c\x3c\xa4\xc1\x5c\x4f\x9a\xbd\x0b\x88\xf1\xa4\x9a\x5d\xcb\x30\xbd\x0b\x08\x7a\x93\x93\xfc\x02\x42\x9e\x6c\x16\xdf\x14\xb1\x9e\x04\x08\xdf\x80\x38\xef\x96\xb9\x5f\x40\xde\x2d\x56\xdf\x14\x09\xde\xfd\x40\xbf\x80\xbc\x5b\x57\xbe\x29\x3a\x3d\xb6\xf1\x4a\xff\x03\xef\xa6\x80\x7f\x9a\x18\x6f\x08\xdb\x37\x24\xe8\x09\xb6\x5e\x4b\x0b\xbf\x0f\x09\x79\x20\xf9\xe7\x8e\xf5\x44\x15\xfd\xd3\xc4\x79\xe3\x93\xbe\x21\xf1\x9e\xf0\x99\x7f\x9a\x04\x0f\x24\xff\x72\x3a\x8b\x13\xf9\x9e\x2b\x69\x0f\x24\xdf\xdc\x9d\x1e\xe6\x40\x2f\x70\x77\x7a\x9c\x83\x7e\x85\x3b\xe8\x59\x30\xfa\xa7\x09\x79\x17\x30\xbe\x21\xb1\xa7\x1e\xf5\xb5\x83\x0b\xf7\x01\x71\xa7\x80\xfc\xf7\x1c\x7f\xea\xac\xfa\xa7\x48\x38\x05\xe4\x5f\xda\xa2\xc7\x0d\xf4\x6d\xc1\xe9\x53\x40\x28\xa8\x2f\x0e\x06\x72\xc0\xe3\xde\x37\x97\x9e\x39\xe2\x71\xf5\x93\x7b\x01\xf8\x6b\xc7\x5f\x60\x61\x88\xa2\x28\x1a\x4b\x33\x0a\x61\x44\x56\xa0\x19\x41\xe0\x75\x9d\x66\x75\x56\x55\x05\x41\x50\x11\x64\x79\x0c\x55\x4e\x15\x80\xce\x29\x40\x53\x34\x8d\x00\x02\x75\x05\x8a\x82\xa8\x6c\xaf\x64\x7b\xe9\x3b\x0c\x47\xd7\x29\x08\xbb\x63\xe4\x57\xaf\x6b\xe3\x18\xfa\xea\x91\xf5\xfd\xdb\x13\xb7\xd3\x3d\x7f\x9e\x60\xcd\xb4\x53\xd7\xc6\xad\x42\x5d\x6b\xbf\x3b\xcd\x49\x35\x19\x71\x14\xb5\x45\x8f\xa2\x23\x5d\x8d\xa4\x32\x72\xb7\x31\x1e\xce\xe2\xa9\x1e\x96\x36\xe7\xb7\xa5\xdd\xfd\x08\x09\xcf\xf1\xe8\xc8\xe1\xcf\xcd\x75\x23\x91\x7a\x3d\x2f\xbb\xcf\x51\x30\x8d\x68\x49\xb3\x3a\xed\xe6\x66\x25\x27\xc6\x47\x7a\xa9\x2c\xcc\x13\x51\xab\x17\xf5\x44\x2a\x94\x36\xd8\xf4\xac\x56\x08\xb5\x25\x87\xdf\x5c\x8a\x10\x8f\xd6\xe5\xed\xc5\x39\xd9\x06\x8a\xd3\xa4\x57\xe0\xa4\xa5\x18\xa5\x8b\x76\x42\xee\xce\x54\xc0\x03\x50\x13\x85\x56\x1f\x8d\xb2\x83\x91\x58\xe2\xd9\x41\x14\xce\xdc\x06\xbb\xf3\xe5\x52\x71\xf3\xef\xc5\x23\xe9\xf1\x3d\x3f\xa5\x74\xb9\x5d\x09\x39\xf9\x52\x3d\x3b\x9f\xa8\xd9\x52\x4f\xeb\xa7\xb5\x62\xb6\xb7\xca\x39\x19\xba\x28\xb4\xb2\xa3\x7e\x15\x45\x66\x89\xbe\x99\xe0\x75\x36\xac\x8a\x4e\xc8\x2e\xeb\xef\x6c\x1a\x36\x13\x88\x97\xe7\xe3\x50\x65\x55\x18\xab\x62\xbd\x8e\x4a\xf3\x59\x36\xab\x4d\x6d\x63\x3e\x97\xfe\x7c\x3b\x3e\xdf\x9f\x38\x22\xe2\xf0\x67\xec\xe2\x21\xf3\x27\xfb\xc3\x2d\xea\x17\x96\xf7\x9f\x07\x59\x1c\x2e\xdc\xd8\xf0\x1e\x39\xba\x8a\x46\x19\x75\x47\xa0\xce\x68\x5d\xb6\x0e\x46\xef\x80\x0c\x73\x6a\x02\x38\x8b\x7e\xa5\x95\x69\x8b\x73\xb9\x6b\x56\x22\x98\x34\x84\x9a\x11\xdf\x5c\xe0\xd1\xac\x24\x95\x81\x7b\xbf\xd3\x06\x5e\x7c\x03\xef\x0c\xb7\x7c\xfa\xb8\x7e\x9f\x1c\x5a\xf4\xf8\xe2\x4d\x34\xc7\x6d\x8e\x74\x3b\x32\xc5\x51\xa5\xde\x6c\x33\xb1\x61\xb3\x81\xad\x3a\x57\x5b\xcc\x95\x06\x4c\xe4\xd3\xdd\xc9\x18\x4a\x95\x68\x2f\x15\x9f\xb0\xca\xa2\x92\x6a\xac\xf9\x89\x68\x29\x6d\x5a\x75\x39\x73\x6f\x0b\xdc\xd3\x77\x46\xcb\x11\x92\xf5\x3f\xa4\x31\xab\xe8\xf3\x1b\xa4\x6d\xda\xa8\x07\xf9\x95\x0e\x3c\x3e\x29\xbf\x17\x74\x65\x3a\x28\xc0\x92\xa4\x87\x77\x45\xd8\xd3\x7f\xd6\xf7\x93\x86\xda\x3f\xe3\xe7\x48\xbe\x25\x1f\xf2\x95\xe2\xf5\x1a\xbd\x45\xf4\xa4\xae\x46\xb9\x12\xaf\x49\x91\x3d\xe5\xe1\xf9\x9e\x9e\x88\x87\xc8\xe8\x88\x4d\x5f\xe9\x89\x4d\x7f\x46\x37\x7f\xfe\xed\xc6\xaa\xb4\x9b\xbb\xbf\xb0\xfe\xb7\x0e\xcf\x4f\xca\x3f\x4e\xf7\x18\xb6\x20\xed\xfb\x2f\xd2\xf5\xc0\x3b\xa2\xe5\x50\xd6\xdd\x14\x61\xb1\x98\x0e\xdf\xa0\x2c\x76\x68\xe8\x6f\x3c\x96\x86\xe5\xad\x3d\x78\x56\x1f\x20\x2a\x83\xee\xe5\xf1\xe8\xe1\xc9\xe5\xf7\x0b\xd1\xe7\x8e\xff\x36\x8e\x5e\x9b\x8f\x8f\x6c\x87\x7b\xad\x98\x74\xaa\x4b\x7e\x74\xb3\x95\x3b\xc0\xab\x49\x5f\x4a\x37\xf1\x86\x28\x57\x37\x4b\x7b\xfa\xce\x68\x39\x94\xbb\xba\xb9\x91\xdf\x7f\x87\xf1\x61\x96\xa3\x41\xa4\x36\x8b\x0e\xe7\x4e\x34\xce\xe4\x86\xb4\x30\x4d\xe6\x96\xb4\x55\x0a\x2f\xba\x53\x9c\x2f\x76\x13\x02\x2e\x74\x15\x27\x3c\x16\x57\x0c\xe4\x16\xf1\x90\x35\x18\x6b\xaa\xd2\xb7\xab\x51\x9d\xcd\xe6\x38\x6d\x05\xea\xcd\x5e\x2c\x2a\xd8\x0e\xc3\x2d\xb3\xb1\x75\xe7\x6c\x82\xbf\x9b\x8f\x06\xef\x2e\x5b\x72\xff\x5d\x3b\xf2\x1b\x87\xf5\xfe\x6a\xe6\xc8\xe3\xe6\x69\x40\x74\x4c\x2b\x34\xc3\x70\x44\xe4\x80\x06\x81\xa6\xf3\x48\x47\x8c\xc0\x88\x02\xa3\x20\x1a\x09\x0a\xa3\x88\x02\x12\x09\x86\x3a\x4f\x68\x06\x23\x20\xb0\x00\x68\x3c\x16\x55\xd6\xf5\xb8\x5f\xfa\x28\xd9\x73\x1e\x37\x2b\x5c\xbd\x39\x70\xff\xf6\x24\x3e\xeb\x6a\x72\x86\xeb\x13\x03\xf6\x47\x66\x4a\xa8\x26\x86\xb1\x30\xe9\xaa\x90\x2f\x36\x9d\x64\x26\xb3\x6a\xd4\x85\x79\xdd\x68\x47\x70\x74\xca\x66\xd9\xed\x1d\xc2\xd2\xc3\x1e\xb7\xff\x51\xea\xdf\xaa\x4a\xb1\x29\x5e\x76\x0f\xf4\x44\xbb\x97\x14\x31\xb1\xe7\xa7\x54\xe8\xca\xab\xa1\xa5\xa7\x96\xab\x16\x2c\xd4\xa7\x0d\xad\x5c\xa8\xf5\x79\xb8\xcc\x46\x52\x4e\x1d\x8c\x26\xed\x61\xa3\x50\x68\xe7\xba\x2c\x27\xd4\xfb\xef\x80\xc3\x36\x59\x56\xbb\xb3\x5a\x2d\x32\x6b\x8c\x22\xa5\x42\x5f\xcb\x66\x63\x76\x8b\x9f\xd5\x60\xa5\x2c\x94\xa5\xae\x11\xcd\x49\x03\xff\x1e\xf7\x93\xfd\xe1\x96\xee\x17\x96\xf7\x63\x1e\xb7\xf5\x9e\xe7\xb2\xa4\x80\xbb\xfd\x45\x0e\xd7\x8a\x22\x17\x59\xe9\xb6\x48\x68\xd5\xb4\xf2\xed\xe6\x2a\xd2\x48\x0f\xe2\x66\x86\x1f\xcc\x06\x1b\x82\xfd\x7b\xdc\x47\x25\xa6\xf7\x92\x8d\xb3\x0e\xf0\x7a\xdc\xd1\xa9\x09\x4d\x07\xb1\xef\xd1\xa2\xbc\x98\x94\xc2\xd0\x4c\xe6\x43\x2b\xc0\x97\x97\x86\x0d\x86\x7a\x2e\xde\x1a\x95\x1a\x5d\x6b\x5a\x09\x55\xa5\xd7\x3c\x8e\xa3\x92\x0f\xc9\xda\x99\x2b\x70\xe6\x71\x07\x27\xbf\xc4\x17\x97\x9f\x77\xae\xf1\x27\xbf\xf9\xbe\xa1\x5b\xff\xd9\xb1\x56\x4b\xd7\x4a\x5b\xab\xeb\x28\xdd\x66\x99\x93\x79\x33\x96\xa5\xb3\xa5\xd0\xbc\x55\x89\x8a\xab\xe6\xac\x59\xaf\xc2\x85\x51\x34\x5a\xd3\x8a\x02\x62\xb3\x51\x29\x4b\x84\x03\x3d\xc9\x83\xb3\x7f\x49\x9e\x47\x56\xfb\x0b\xd1\x27\x7b\xa5\xc8\x8f\x6c\xf3\x4c\xb4\xd2\x5e\x1f\xdd\xdb\x2a\x9f\xd4\xc7\x4d\x71\x97\x31\x2f\xac\x28\xea\xf5\x6a\x59\xf2\xc5\xbf\x54\x60\xad\x8c\xdb\x72\xc3\x6f\xe6\x22\x83\xee\x1d\xe3\xfe\xfb\xc7\x3f\x7d\xd9\x49\xcc\xa1\x6f\xf4\x4f\x74\xd8\x5e\x16\x2f\xd2\xbc\xed\x1a\xc9\xe3\x71\x3f\xd9\x3f\x1f\xb8\x42\xcf\x28\x83\xf1\x35\xb2\xef\x79\xdc\x7e\xe6\x16\x7f\x1e\xf7\x51\xb9\x31\x37\x1f\xfd\xfc\xa4\x6e\xf8\xf7\xb8\x8f\x8b\xbb\xba\x39\x16\xe0\xc6\xe3\xe6\xa4\x6a\xa1\xe1\x08\xfd\x6c\xbe\xaf\xb2\x0d\xb6\x0d\x64\xb6\x52\x9c\xe9\x29\x5b\x36\x40\xb3\x81\x87\xa3\x7a\x0b\xb1\x83\x65\x6c\x6c\x2d\x1a\x05\xab\x39\x79\x5f\xf0\xe9\x42\x54\x2c\x97\x12\x22\x6e\xc5\x25\x2e\x4f\xdb\x76\x61\xd1\x9f\x8a\x55\x2d\x9d\x5c\xc8\xd1\x68\x2a\x35\x8f\x96\x82\xf6\xb8\x31\x02\xac\x02\x44\x46\x87\x3c\xa4\x31\x24\x3a\x80\x22\x0d\x59\x1d\xaa\x1c\x4f\xa0\x02\x68\x8c\x08\xe6\x44\x5d\x67\x01\x62\x75\x88\x79\x8e\x03\xac\x0a\xb0\xc0\x20\x9a\xd6\x54\xd1\xf5\xb8\x61\x40\x31\x6e\xf1\xbe\xc7\x2d\x5c\xbd\x8c\x7b\xf7\xf2\x24\x8d\xe1\xd5\x08\x77\xf2\xba\x2e\xfc\xc0\x08\xf7\xc1\xff\xab\x1d\xc6\x81\xb7\x1c\x45\xb8\xf3\xc5\x56\xbf\xba\xac\xf2\xe1\x51\x0b\x63\xa6\x34\x50\xe2\xab\xd8\x88\xee\x67\x27\xd9\x58\x2f\xed\xb4\xa5\x90\x95\xce\xa7\xcb\x7c\xa5\xaa\x4f\x23\x6a\x2d\xdd\x54\xd9\x46\xa8\x36\x6f\xd8\xe1\x79\x0a\x32\xc6\x7c\x8a\x0c\x52\x83\x43\xcc\x4d\xd2\xa9\xc1\x3c\x15\xa6\xb5\x77\x4e\x2b\xcd\x3f\x39\xc2\x3d\xf8\xc2\xf2\xfe\x94\x08\x77\xc2\x0b\xcf\x2d\x5f\x21\xc2\xad\x4a\x8f\xfa\x8b\x4f\x47\xb8\x5f\x88\x58\x7d\x4e\x84\x7b\x5a\x51\x6f\xc9\xf7\x0b\x47\xb8\xc1\x92\xe6\xce\x48\xdf\xd4\x0f\x30\xc2\xea\x85\x77\xa4\x0b\xa7\xf2\xba\x1b\x61\x3d\xf2\xa7\xdc\xf2\xe2\x78\x4a\x1e\xe8\x3b\xeb\xbb\x43\x79\x68\x3c\xb9\x92\xda\xfc\xeb\x86\x05\x9e\xec\xef\x4d\x71\xef\x74\xf7\xef\xaf\xbe\x10\x8b\x38\xac\x2f\xe2\x97\x64\xe0\x96\x97\xc7\xe3\x8f\x89\x20\x4b\x41\x8c\x47\xdf\xb6\xc3\x5d\xaf\x5f\x1f\x8f\x91\x52\x3c\x2c\x5e\x99\x0f\x2f\xf8\xe1\x2f\xce\xd9\x0d\xf3\x00\xef\x8b\x45\xbe\x6b\x1b\x20\xc1\x47\xbe\x69\xd1\xc8\x17\xd3\xc5\x59\xa8\xdd\x9b\x58\xed\x68\xd9\x6e\xe6\x0a\x4a\x25\x37\x1d\xd8\x05\x79\x04\x06\x31\xce\x1e\xd0\xc3\xa4\x93\xce\x87\x50\x7c\x51\x1a\x6a\xab\xa1\xc2\x56\x23\x78\x15\x96\xfa\x3a\xce\x46\x79\x23\xcd\x56\x49\xdd\x7a\x1f\x0c\x8c\xaa\xd4\x0f\x97\x19\x6b\x02\x62\x81\x47\xbe\x59\x4d\xd1\x74\x0d\x62\x45\x04\x3a\xc2\x2c\x83\x01\x50\xb0\xc8\xa8\x1c\x0d\x21\x52\x54\x4c\x6b\x08\x63\x4d\x64\x81\x4e\xa0\x06\x58\x51\x81\x3c\xc4\x3a\x56\x30\xe0\x20\x43\xf0\x36\xd7\x04\x05\x14\xf9\xbe\xef\x87\xf3\x34\xc3\x5c\x77\xc4\xb7\x6f\x4f\xf2\x80\x5f\x8d\x7c\xdf\xf5\xc4\x7f\x48\x24\xb6\xd7\x5b\x24\x8e\x23\xb1\x17\x3d\xf1\xa3\xc8\x77\xcc\x4e\x66\x57\xb1\x30\xff\x1e\x76\x22\x38\xee\x84\x66\x59\xc1\x9e\x8d\xd1\x12\xbe\x03\x29\xbe\xc8\xa5\x5a\xd3\xaa\x90\xcf\xad\x14\x7b\x5e\xb7\xa3\x35\x35\x9b\x02\xa5\xe1\x60\x11\x29\x35\x9c\x08\x5f\xe9\x9b\xb1\x52\xce\xd1\x38\x2d\x2d\xe3\x02\x33\x9d\x8c\x8a\x4d\xb1\x08\x8b\x52\xe9\x93\x23\xdf\xaf\xce\xe6\x1f\x29\xef\x4f\x89\x7c\x3f\xee\x89\x1f\x95\xcf\x89\xdc\x3e\xee\x89\x1f\x95\x7b\x91\x6f\x49\x0a\x22\xd2\xf8\xa2\x25\x7d\xc1\x33\x8a\x26\x92\x32\x3e\x92\xf7\xe5\xaf\xe7\x1c\x3c\xd5\x2f\x17\x69\xbc\x9e\x8b\x72\xe8\xcf\xaf\x19\x69\xcc\x36\xb3\xd5\xcb\x91\x6b\xb7\x78\xbd\x9a\xaf\xa6\xff\x2f\x46\x17\xcf\x56\x42\x67\x6b\xc5\x67\xa3\x8b\xd2\x25\x4f\xfc\xd9\xfe\xfe\x38\x4f\xfc\x98\xca\x7d\xd4\xc4\xcb\xdf\x91\x27\xfe\x64\x7f\x7f\xa0\x27\x7e\x54\xa2\x75\x69\x76\xf2\x6d\xa2\xdb\x9e\xb8\x1f\x9d\xf5\xe7\x89\x1f\x95\x8f\xd3\x59\x5f\x9e\xf8\x71\xb9\x12\x11\x2f\xcc\xd5\x59\xae\x18\x9e\x5a\x21\x3a\x6e\x36\x20\x27\xcc\x96\xcb\x90\xde\xcf\x12\xab\x26\x35\xe5\x79\xcf\x60\x8b\x73\x7a\x95\x9f\xae\x22\x8d\x79\xba\x3c\xb7\xfb\xf5\x68\xa3\x2a\xc7\x23\x98\x4e\x3a\x99\x42\x37\x2f\x2d\x01\x9c\xd0\x83\xb2\xc9\x63\x6e\xd4\x12\x75\x3a\xac\x0a\x91\xc0\x3d\x71\x4d\x57\x75\x1a\x88\x44\x50\x79\xc0\x88\x34\x8d\x04\x4d\xd5\x68\x82\x74\x4c\x03\xcc\x69\x3c\xc3\x0b\x50\xe0\x14\x48\x38\xcc\x8b\x50\x41\x2a\x0b\x35\x8d\xe7\x59\xa0\x6a\x8c\x20\x92\x6d\x44\x9c\x0d\xc4\x13\xe7\x0e\x9f\xc9\xbb\xee\x6b\x33\xf0\x46\x0e\xca\xf6\xed\xc9\x41\xba\x57\x3d\xf1\xd4\x75\x6d\xf8\x71\x9e\xb8\x1b\xf7\x3a\xd0\x73\xbe\xaf\x2e\x9d\x7a\xe2\x69\x2e\x61\x8f\x32\x0b\xd2\xef\xa5\x2a\xa3\xcc\x34\x9b\xd2\xe2\x9c\x66\x2c\x62\x73\xc9\x48\xbc\x27\xa2\x89\x45\x9a\x85\x8d\x82\x19\x97\x16\xd3\x9a\x36\x91\x66\x16\x5c\xd4\xd9\x54\x6f\x16\x1e\xf7\x05\xad\xcb\x96\x9d\xc8\x4a\x11\x32\xad\xa8\x59\x68\x55\x0d\x25\x5e\x8e\xe5\xac\xc8\xbc\xf6\xc9\x9e\xb8\xfd\x85\xe5\xfd\x29\x9e\xf8\xe3\x31\xbc\xa3\xf2\x39\x9e\x78\x57\xba\xb0\x6a\xfd\x1a\x9e\xf8\xab\xfb\x21\xaf\x7a\xba\x07\x79\x9f\x5b\x3d\xe9\x6b\x7b\xe2\x17\x63\xe6\x9e\xfe\xfc\x9a\x9e\x78\xcd\x2a\x94\xd1\x0d\xd2\x83\xf6\xc4\x83\xd6\xff\xe0\x3c\xf1\xe8\x81\xc8\x1b\xb4\xfc\x8d\x3c\xf1\x61\x29\xcb\x9e\x09\xf5\x2f\xe1\x89\x9f\xe9\x43\xf0\x9e\x78\x5d\x3e\xc0\xfb\x62\x9e\xf8\xf1\xea\x31\x48\x4f\x7c\x6c\xe2\x65\xcb\x8a\x73\x05\xb9\x97\x69\xbd\x23\xbb\x47\x37\x27\x4c\x56\x2e\x4a\xd1\x14\x36\x5b\x29\x45\x1e\x8f\xb5\x16\xd7\xad\xc5\x12\x6c\x99\x19\x44\x43\x33\x3d\xde\x1c\x18\x89\x70\x88\x14\x17\x4c\x6c\x98\xa0\x93\xf9\xd9\x7c\xd2\xcd\x74\xd9\x5e\x21\x6d\xd7\xe5\xdc\xd2\x4e\x46\x02\xcf\x4d\x41\x02\x64\x44\x41\x47\x34\xe6\x45\x1d\x71\x3a\x27\x20\x15\x01\x8d\x61\x34\xa4\x89\x34\xa3\x03\x0d\xea\x44\x61\x21\x56\x08\xcb\xb2\x40\x83\x58\xe3\x44\x4d\x15\x20\x83\x68\x81\x66\xb7\xd9\xe0\x5c\x20\xb9\x29\x0f\x79\xe2\x08\x0a\x37\x3c\x71\xf7\xed\xc9\x4d\x14\xaf\x66\xa7\xdc\xf5\xc4\x7f\x48\xb6\xc4\x61\xb6\x59\x1e\x46\x82\xb7\x1c\x65\xa7\x14\xe4\xe2\xa0\x10\x76\xde\xab\x68\x50\x8a\xac\xf2\xc3\x6a\x81\xac\xda\x8e\xb1\x54\xa6\xf2\x40\x1c\xe5\x46\x8b\x44\x3f\x3b\x1c\x25\xa7\xa4\x21\x94\x9c\x5a\x05\xa5\x41\x01\x36\x7a\x4b\x94\xcf\xf4\x84\xd9\x7c\x64\x8e\x33\x25\x30\xcd\x4d\xa2\xb9\xf0\xaa\x55\x5e\x4d\x47\xfd\x8a\x3c\x7d\x25\x1b\xdc\x57\x76\xca\xab\xd6\xfb\x23\xe5\xfd\x29\xd9\x29\x01\xee\xa6\x07\x9d\x9d\xf2\xb8\x27\xf2\x44\x76\x8a\x24\x79\x3c\xf1\x27\xe5\xb7\x29\xae\x02\xbe\xb0\x1f\xe2\x3f\xfb\xf8\x10\xe3\x8a\xa5\xa4\x0b\x56\xcd\x2d\x5e\x4f\xfc\xd9\xb1\xf1\x71\x9e\xf8\x51\xb9\x18\x63\x7e\xf9\xbc\xdb\x67\x64\x0f\x45\x2a\x36\x9b\x3c\x73\x2a\x83\x3e\x7f\x19\xb4\xfe\x07\x97\x1d\xf4\xb8\x27\xfe\xe0\xf9\xcb\x2f\x99\x9d\x52\x8b\xe8\xe1\xf3\x1c\xb1\x53\xfe\xbe\x66\x76\xca\x2d\x7d\x08\x3e\x3b\xc5\x9f\x27\xfe\xe9\x67\x86\x83\xcc\x4e\x41\xa5\x50\x89\x0f\x31\x93\xa2\x51\x96\x92\x39\xa6\x9e\x63\xf9\xfc\x88\xc9\xa6\xa7\xa8\x52\x65\x5a\x4b\x45\xc6\xb9\x69\xa3\x45\x58\x56\x59\x44\x41\x39\xdb\x1d\xd7\x78\x0d\x27\xb3\x5d\xfa\x3d\xb9\x0c\x47\xb1\xa1\x4e\x62\x0d\xb4\x1c\xa4\x56\xe1\x7c\x2f\x59\xe0\x70\x3e\x55\x41\xc1\x67\x89\xeb\x88\x51\xb1\x4e\x2b\x04\x61\x2c\x70\xbc\xae\x63\x01\x32\xba\xa0\x8b\x0c\xab\xf0\xac\xaa\x0b\xa2\xc2\x72\x80\x65\x19\x81\x06\x1c\x51\x78\x82\x11\x8f\x19\x81\xd5\x18\x11\x88\x98\x53\xdf\x36\x01\x71\x10\x50\x76\x0a\x7b\xcf\x13\x17\x58\x96\x86\x57\x3d\xf1\xdd\xdb\x93\xab\xdc\x5e\x8d\x89\x7b\x3d\x49\xaf\x27\xee\x96\x8f\x3e\x2b\x83\x77\x71\x85\x88\x44\x96\x05\x25\xd1\x1b\xcc\x17\xe6\xb8\x19\xae\xa7\xc2\x7d\x55\xef\x5b\xc9\x82\xd6\xcb\xc5\x52\x62\x8d\x9f\xa2\xcc\xa2\xde\x97\x60\x33\xf9\x3e\x68\x20\x39\x3f\x37\xad\x12\x3b\x6a\xc7\xca\xfd\x3e\x23\x30\x58\x95\x12\x82\x9a\xd3\x1b\x89\x59\x4b\x8f\xab\xa5\x7a\x5d\x6b\x72\xcc\x38\x3a\xff\xf3\x93\xe3\xdb\xf2\xa7\xc8\xee\xaa\x77\x7c\xc4\x9e\x8f\x38\xf5\xc8\x15\xc4\x06\xde\x15\x43\x77\x31\xcf\x52\xba\x14\x53\x7f\x11\x7f\xcc\x3f\xfe\xa0\xcf\xff\xe4\x0e\xf2\x38\x2e\x17\x57\x89\xd2\x85\x38\x71\x20\xf8\xcf\x75\xf4\x76\x8c\xe7\x48\x87\xbc\xa5\x76\xe0\xe7\x0b\xeb\xf8\xa6\xbc\x7a\x16\xf3\x43\xbc\x79\x6f\x1f\x7c\xc9\xb3\x7e\x52\x44\x6f\xf6\x2e\xf7\xbf\x74\xe9\xbc\xdc\x91\x7e\xf9\xd1\x57\x15\x1d\xe0\x1d\xcd\x1f\x67\xb2\xba\x54\x82\x18\x2f\x4a\xcd\x1f\x7e\xd7\x3e\xfc\xf7\xa3\x8c\x4f\xb0\x5e\x0d\xa7\xab\x8a\xaa\x2b\xaa\x46\x68\xac\x71\x84\xd1\x30\xe2\x01\xc3\x41\x88\x10\x80\xa2\x80\x34\x1e\x42\x5e\xd3\x75\x2c\xaa\x2c\xe4\x75\x85\x66\x39\x51\x17\x90\xa0\x40\x8d\xd1\x39\x9d\x71\xbd\x1a\x26\xa0\xb3\x6f\x0f\x78\x35\x9c\x28\xde\xf0\x6a\xdc\xb7\x27\xf7\xca\xbe\x1a\x5f\xbc\xe7\xd5\xbc\xb0\x46\xde\x02\xdc\x8f\xaa\x8b\x77\xd6\xb8\x65\xbf\x46\x8b\x48\x0b\xbb\xdb\x5b\xc9\xbd\x59\x69\x94\x8a\xd6\x55\xb5\x5f\x31\x97\x62\x89\xc9\xd6\xfa\x4d\x73\xc8\x31\xe9\x61\x44\x13\xec\xde\xa8\x3c\x7f\x2f\x88\xcd\x25\x19\x4e\x2a\x2d\x96\x45\x8a\x36\x4a\xbe\x73\x8b\x77\x95\xeb\xb7\xda\xe6\x5c\x64\x59\x19\xf1\xc5\xc6\x7b\x54\xd6\x49\xbd\xd7\x7b\xc9\xab\xf1\x15\x2b\x4c\x7d\x8a\xec\x1e\xf1\x6a\x7c\xc4\xfc\x02\xf5\x6a\x5e\xc4\x1f\xa0\x57\xf3\xea\x3d\x42\xaf\x7a\x35\x81\xe0\x7f\xcc\xab\x89\x0f\xcd\xec\xad\xf5\xb2\xd7\x4b\xf8\x12\x31\x3f\x2f\x4f\xb5\x2f\x46\xdf\x99\xce\xc5\x45\x72\x59\x0f\x23\x87\xf1\xe8\x2b\x66\x2c\xbd\x78\x42\xd0\x4b\x5f\x6c\x7e\x91\xfe\x3b\x5e\x8d\x1f\x7d\x0d\xd2\xab\xf1\x83\xff\x45\xaf\xe6\xa3\x8c\x4f\xc0\xf9\x8b\xaa\x06\x58\xa0\x6b\x18\x32\x88\x11\x01\xa3\x31\x3a\xe1\x01\xa1\x81\x00\x74\x81\x16\x68\x4e\xa7\x05\x80\x39\xa0\xea\x88\x47\x9c\xc0\x43\x85\x21\x2a\x60\x15\x05\x28\x98\x40\x91\x75\xbd\x1a\x18\x50\xac\x86\xbb\xef\xd5\x08\xdc\xf5\x5d\xd3\xdd\xdb\x93\x4b\xee\x5f\x8d\xd5\x78\x55\x3d\xe8\x58\xcd\x63\xa7\x0d\x8e\x62\x35\xef\xc5\x05\x27\xbe\x57\x62\x40\xc8\xc3\x56\x86\x5d\x69\xf9\xd5\xb8\xad\x4d\x9a\x91\x81\x62\xf6\xd2\xd5\x69\x34\x33\x6e\x0d\x69\xad\x54\x94\xe4\x70\xb2\xb1\x90\x04\x3d\xaf\xd7\xbb\xdd\x7a\xdb\x49\xe0\xc4\x40\x68\xe5\xd4\x64\x18\x69\xb3\x08\xbf\x22\x89\xb8\x58\x91\x4b\x66\xa5\x14\xe9\x7e\x76\xac\xe6\x73\x64\xf7\x09\xb1\x1a\xf7\xcf\x27\x73\x0a\x6f\x64\xbb\x07\x18\xbb\x28\x49\x81\xc5\x2e\x3c\x51\xec\x63\xab\xe4\x27\xa7\xf0\x48\x5e\x2f\x78\xb6\xa9\x96\x5a\x36\x8f\xe8\x1b\x9c\x91\xfd\x01\xfd\x2d\x7b\xe8\xdf\x96\x2f\xd3\xdf\xe7\x6e\xc4\xed\xfe\x3e\x3b\xbd\x70\xe0\xef\x2f\x17\x5b\x91\x4e\xbd\xf6\xaf\x96\x53\x19\x89\x0c\x32\xf6\x15\xb2\x3f\xe2\x1e\x25\xbf\x1e\x8c\x14\x90\x6e\xb6\xe7\xfe\xf0\x6f\x3d\xa8\x8f\x32\x74\xc1\x7a\x50\x44\x04\x02\xab\x02\x55\x03\x50\x50\x59\x15\xb0\x1c\xc3\xb2\x10\xa8\xba\xc2\x32\xbc\xca\xd2\x8a\xa8\x08\x48\xc7\x1a\xc6\x00\x23\x56\xe5\x91\xa8\xf3\x58\x17\x39\xc4\x6b\x44\x45\x2c\xed\x7a\x50\x28\xa0\xb8\xd0\x7d\x0f\x8a\xa3\x21\x7f\xdd\x83\xda\xbe\x3d\xf9\xb8\xcf\xab\x71\xa1\x7b\x1e\xd4\xcb\xb1\x8d\xbd\xc5\x8a\x94\xa4\x47\xe2\x42\xdd\x14\xb3\x32\x6a\xc6\x2c\xe1\x14\xb4\x31\x5a\xf6\x40\x2c\xe3\xd8\xdc\x60\x95\x44\x83\xb6\x65\xca\x72\x52\xaa\x65\xec\x49\x3f\xe2\x08\x69\x8b\xcc\xed\x77\xab\x05\x66\x85\xd9\x38\xcc\x9a\x4a\x68\xc1\xca\x89\xd1\x44\x2e\xc4\x71\x2c\x12\x1e\xa5\xf2\x39\x08\x0b\x52\x65\xb4\x3c\x19\xc1\xd2\x67\xc4\x85\x4a\x9f\x22\xbb\x4f\x88\x0b\x3d\xe1\x41\x3d\x74\x73\x47\x80\x71\x92\x27\x3c\xa8\x7b\x71\x92\x83\x07\x15\xb4\xfc\x9e\xf0\x48\x7e\x88\xfc\x1e\xf2\x48\x6e\xdd\x6c\x72\xe0\xef\x2f\x19\xc7\x39\xf3\x48\xbe\x62\x6e\x99\x24\x27\x4a\xef\x97\xe5\xef\xea\x83\xff\x9b\x8a\xe4\x17\xe5\xef\x96\x67\x6e\x55\x0b\xec\xee\xf7\x20\x3d\x28\x3f\xf8\x5f\xf4\xa0\x3e\xca\xd0\x05\x9c\x2f\x24\x42\x01\x01\x45\xe0\x90\xa2\x22\x95\x40\x4d\x53\x55\x86\x30\x58\x41\x90\x17\x14\x5d\x43\x08\x12\x55\xe3\x08\x21\x02\xab\x88\xac\xc6\x41\xa4\x61\x56\xa5\x69\x85\x56\x35\x8e\xe3\x5d\x0f\x2a\x98\x33\xb4\xac\xc8\xdf\xf7\xa0\xc0\xad\x9d\xb5\xed\xdb\x93\x8f\x1a\xbe\x1a\x83\xf2\x66\xb6\x05\x1d\x83\x7a\xec\x9c\xdd\x51\x0c\xaa\xc0\x15\x85\x29\xdf\x73\x08\x3b\xca\xf6\x72\x69\x02\xe5\x98\x92\x88\x8f\x22\xc9\x4c\x37\x3c\xc8\xd3\x30\xa1\xcf\xe6\xd8\xa4\x07\x2d\x9c\x98\xf1\xf3\x64\xcb\x9c\x66\xc2\xab\x5e\x23\x92\x9d\x42\x29\xe4\x44\x50\x0f\x47\xf1\x8c\xc1\x61\xad\x00\xd2\x46\x3e\xc6\x2d\x9a\x00\xbc\xe4\x41\xf9\x8a\x41\xd5\x3e\x45\x76\x9f\x10\x83\xba\x78\x18\xea\x6e\x4c\xe2\xfa\x39\xaf\xa0\xef\xef\x0d\x26\x26\x11\x70\x0c\xea\x48\xfe\x2f\x5b\xd8\x4b\xf4\x1d\x95\xa0\xfb\x3b\x7e\x49\x68\x5f\xa8\xbf\x83\x39\x13\xf7\x85\x63\x50\xa5\x76\xd4\x3a\xa3\xd7\xc3\xdf\xd7\x8c\x41\x65\xea\xe3\x94\xdf\xaf\xe7\x7c\x66\x0c\x48\xfa\x00\xdd\xf4\xe1\x41\x7d\x94\xa1\x0b\xd6\x83\x52\x35\xc0\x10\x41\xd4\x14\x91\xd0\x88\x45\x80\x40\x5e\xe5\x45\x8e\x28\x18\x13\x00\x04\x0d\x72\x3a\x54\x74\x51\x53\x35\xa8\x69\x04\x61\x42\x63\x5d\xe4\x14\x9e\x13\x74\x9d\xf0\x40\x77\x3d\xa8\x60\xce\x3e\x3e\xe4\x41\x41\xfe\xfa\x2d\x24\xbb\xb7\x27\x1f\x73\x7e\x35\x06\x75\xcf\x83\x7a\x35\x8e\xf2\xd8\xf9\xa8\xa3\x18\x14\xdb\x34\xb9\x68\x1d\x59\xbc\x11\x4f\xea\x4b\x92\x64\x26\xa0\x6c\xf7\x17\x85\xa5\xd9\x4c\xbc\xf7\xcc\x11\x54\x64\xa5\x17\xcd\x91\x6a\x29\x9f\x61\x42\xb5\x56\x74\xd9\x18\x8f\x7a\xed\x32\xb7\x2c\x1b\x8d\x2e\x11\x73\x15\x5d\x8d\xf7\x8c\x19\xc8\x62\x1d\x3b\xf1\x50\xa5\x11\x92\xa5\x57\x76\xf1\x7c\xc5\xa0\x5a\x9f\x22\xbb\x4f\x88\x41\x3d\xe1\x41\x3d\x74\x3e\x27\xe8\x6f\x8e\x05\x13\x43\xf9\xb8\x18\xd4\x13\x1e\xc9\x0f\x91\x5f\x30\x67\x83\xfe\x12\x31\xa8\x8b\xbb\x4c\x7f\x8d\x18\xd4\xc5\xef\x7f\x6e\xca\xab\x31\xa8\xc4\x8b\xf2\x77\xcb\x33\x67\xa7\x03\x8b\x41\x05\xe9\x41\xbd\x3a\x96\x7c\x78\x50\x1f\x65\xe8\x02\xde\xc5\xc3\x22\x62\x11\xe4\x30\x54\x38\x96\x26\x3a\x16\x04\x9a\x83\x84\x87\x3c\x0b\x04\x55\x07\x22\x23\x68\x22\x46\x50\x03\x58\xc1\x90\xa8\x9c\x80\x78\x1a\xe9\x80\xa3\x15\xc8\x43\xb8\x26\x02\xed\xce\xac\x31\xb0\x14\x67\x92\x35\x99\x65\xa4\x5c\xb3\x16\xaf\x25\xa1\xd4\x4a\x4b\xcd\x66\xa2\xd9\xac\x33\xf5\x64\xb3\xd5\x2a\x73\x72\xab\x29\x57\x8b\x99\x58\xb3\x5d\x91\x1a\x1c\xdf\x2c\xa0\x63\x0f\x0a\xde\xf1\xa0\x38\x1a\x21\x74\xf5\xeb\xdd\xfb\xb7\x80\x07\xbc\x28\xf0\x90\x11\xf6\x31\xa8\x27\xb3\xff\x8e\x3c\xa8\x8b\x5f\x08\x3d\xd2\xb2\x4f\x5f\xe3\x1c\x4a\x72\x4f\x6f\x29\x19\x6e\x0f\x56\xe5\x30\x89\xd2\x71\x7e\x51\x14\x57\xd2\x84\x24\x67\xb9\x24\x3f\x7e\x27\xce\x0a\x57\xb4\x56\x4f\x68\x24\x97\xd6\x7c\x3e\x53\xe4\xf1\x02\xc5\x14\xae\xbb\xa2\xbb\xd6\xb8\x9c\x8e\xa4\x2b\x1c\x57\x68\x2b\x89\x51\x74\xc0\x2f\x57\xc9\x91\x10\x1b\xa4\x79\x25\x8d\x4a\xd2\x43\xf7\xb4\x1d\xcb\xe7\xfa\x0d\x0a\x47\x95\x7c\x9c\xc0\x37\xd4\x43\x7f\x5c\x29\x77\xb2\x99\x83\xc3\x7f\xd9\xc3\xbd\x83\xff\x2c\x3b\x74\x23\x9f\xa7\xef\x12\x7a\x31\x9b\xf5\xe2\x09\x66\x2f\x0f\xf2\x8f\xa0\xef\xc6\xf7\x38\xb6\xe5\xa2\x85\x39\x9a\x91\x9f\x1d\x4b\xe9\x5a\x34\xb4\xa5\xf5\x2c\x3f\xe9\xa8\xdc\xb6\x30\xf2\x6b\xf8\x0b\xaa\x3f\xfc\x5b\x0b\xa3\x8b\xa3\x6a\x3e\x29\xa2\x6c\xa9\x39\x93\xc3\x30\x17\x1d\x22\x22\xcc\xf5\x29\x99\x70\x30\x3f\x49\x03\x23\xb9\x68\xe9\x99\x59\x2c\x2a\xda\x15\x3d\xd9\xcd\xcf\xde\x63\xc5\x4a\x74\xaa\xc9\x03\x79\x98\xb5\x4c\x76\x68\xe3\x56\xa6\x3a\xcb\xe6\x88\x32\x2f\x94\xc6\x8e\x3d\xee\x49\x1f\x70\x3f\x11\xe0\x30\x07\x55\xa8\x03\x24\x02\x16\xf2\x9c\x28\xa8\x9a\xc2\xe9\xa2\x00\x68\x91\x27\x9a\x40\x10\x52\x31\xc3\x6b\x8c\x26\xd2\x34\xa7\x68\xb4\x82\x39\x41\x80\x0c\x59\xaf\xdc\x37\xf7\x13\xa1\xdd\xd7\x6a\x5f\xb7\x30\xe8\xbe\x85\xe1\xae\xdf\x4f\xb4\x79\x2b\x1e\x2c\x0c\x0f\x0f\xa7\xa2\xfd\x5b\x18\xaf\x5f\x71\x66\x61\x3e\xdb\x67\x3d\x94\x23\x0b\x13\x8f\x27\xb2\x89\x78\xbc\xa9\xc8\xb1\xb2\x36\x60\x48\x7c\x59\x92\xaa\xf9\x49\x72\xfa\x5e\x08\xdb\x71\x6b\xf2\x6e\x2f\x46\xf9\xfc\x3c\x81\x43\xb9\xac\xa1\xe4\x4b\xe9\x6c\xac\xd9\xc0\x7a\x14\x35\x84\x4c\x2e\x53\x0a\xf7\x64\x3a\x47\x57\xb3\x8b\x36\x99\x86\x0b\x82\xd3\x1a\x47\xa6\xf3\xb9\xf4\x15\x2d\x8c\xaf\x19\x3e\x40\xfc\xe7\x7e\xe6\x03\xf8\x2f\x5b\x98\xcf\xfb\xa2\xd2\x96\x94\x27\x2d\xcc\x97\xf8\xe2\xd3\xb6\x5c\xb4\x30\x3f\x68\x86\x97\x02\xb2\x30\x39\xe4\x0f\xff\xd6\xc2\xd4\x6a\x2d\xbb\x55\xab\x6b\x76\x29\x1f\x67\xaa\x6d\xd4\x4c\x4b\x91\x1c\x33\x20\x9c\xc9\x87\xe6\x8d\xe9\xe8\x7d\x95\x68\xd1\x50\x6a\x5b\x68\x3e\x4d\xdb\x40\x1a\xd8\x79\xad\x3d\x11\xb2\x3d\x65\x6e\xce\x27\xb1\x90\x5c\x2d\xad\xca\xb9\x59\x7c\xc8\xf1\x02\xbf\x04\x86\x9a\xe0\x3f\xe2\x7b\xe8\x50\x13\x58\x91\x43\xbc\x2e\xea\x0c\xd2\x39\xcc\x23\x45\x57\x45\xc8\x69\x3a\x10\x45\x86\xe5\x74\x8e\xd7\x04\x96\x51\x11\xcf\xa8\x0c\xa7\x62\x85\x60\x01\x2a\x44\x65\x18\x45\x80\x8c\xe6\x5a\x18\x18\x90\x85\xb9\x77\x42\x95\xa3\x11\x2f\x5c\xfd\x2a\xcc\xfe\xad\x6b\x61\x04\x80\x0e\x27\x54\xfd\x5b\x98\x1b\x27\x54\x7f\xcc\x7d\x9c\x87\x72\x64\x61\x62\x65\xa3\x97\x6b\xcb\x46\x5b\x99\x54\x11\x1b\xb6\x93\xf6\xf0\x1d\x67\x4c\x51\x29\xaf\xb2\xd5\xc5\x2c\xd3\x0a\x69\x7c\x6f\xb1\x48\x2e\x67\xc3\x49\xbb\x12\xcd\x09\xd9\x42\x9b\xd3\xad\xa6\x22\xcd\x49\xd4\x36\x47\xf9\x09\x41\x48\x6c\xc7\x92\xb2\x31\xaf\x32\x66\xa9\xda\xe8\x37\xbb\xc2\x57\xb4\x30\xbe\x66\xf8\x00\xf1\x5f\x8e\x84\x7f\xce\x1a\xc6\xff\x0d\x7e\x2e\x29\x1f\xbd\x86\xf9\x88\x5b\xa2\xb6\xe5\x23\x2c\x8c\xdf\x19\x5e\x0a\xc8\xc2\x64\x6b\xfe\xf0\x6f\x2d\x4c\x3e\x91\x91\x17\x83\x4a\x7a\x38\x1d\x16\xfb\xe3\xd0\x9c\x2c\x1b\x13\xf3\xbd\x0f\x9c\x64\xce\x29\x26\x84\x49\x9f\x85\xd3\x64\x52\xd6\x33\xa1\xc6\x70\x98\x4a\xad\xe6\x36\x3b\x9e\x84\x1c\xcd\x8e\x45\x50\x66\x69\xb4\x98\x21\xdf\xef\x83\x41\x4e\xad\x64\x23\x45\xdc\x8b\xe4\x71\x9e\xc4\x02\x3f\x2d\xc8\xaa\x44\x84\x0c\x60\x01\x81\x9a\xc8\x33\x04\x11\x9d\x65\x80\x42\x63\x4e\xe5\xa0\x0e\x78\x88\x59\x8d\x87\x2a\x64\x10\xe0\x05\xc8\x8b\x2a\x50\x05\x8d\x65\x14\x20\xf2\x00\x12\x55\x70\x2d\x0c\x0a\xc8\xc2\xdc\xcb\x75\xe7\xe8\xf5\x4a\xeb\x86\x85\x11\x19\xfe\x60\x61\x58\xf6\x70\x5a\xd0\xbf\x85\xb9\x91\xeb\xfe\x63\xee\x99\x3b\x94\x23\x0b\x93\x1a\x84\x1c\xdb\x1c\x44\x56\x53\xd0\x9d\x0e\x75\xa5\xd5\x97\x01\x11\x2c\x30\x00\x13\x63\x19\x69\x23\x2d\x32\xa6\xa7\xfc\xac\xde\x6d\x73\xe1\xd0\xbb\x21\x0f\x17\x7c\x2f\x43\xac\x48\xb6\x0f\x32\x7d\xa5\x9d\x28\x35\x35\xac\x8b\x74\x0b\xb7\x64\x23\x2d\x28\xca\x92\x96\x5b\x5d\xf3\x2b\x5a\x18\x5f\x33\x7c\x80\xf8\xaf\x20\xfa\x94\x35\xcc\x27\x5b\x98\x2f\x71\x0f\xe1\xb6\x7c\x84\x85\xf1\x3b\xc3\x4b\x01\x59\x98\xf4\xdc\x1f\xfe\xad\x85\x31\xaa\x1c\xb3\x34\x4a\xc9\x02\xdf\x88\x72\x75\xd1\x31\x72\xd5\x3a\xbf\x9c\x35\xaa\x8d\x51\x36\x15\x1f\xf7\xe8\x84\x5e\xe1\xa7\x62\x23\x32\xb6\xc2\xdc\x7b\xaa\xd2\x4c\x4e\xe5\x09\x67\xcb\xd3\x62\xed\x3d\xef\x0c\xda\x11\x0d\x4c\xc2\xb0\xdc\x9b\x74\x2b\xa9\xf1\xc2\x99\x65\x4b\x65\x23\x1a\xf8\x3e\x8c\xa2\x21\x81\xd3\x14\x4d\xa3\x19\x0d\x71\xb4\x00\x78\x8e\x07\x2a\xc2\x2c\xe6\x89\xa8\x71\x44\xe0\x58\x15\x33\xa2\xaa\x20\x40\x38\x46\xe3\x31\xd6\x79\x1a\x33\x3a\x21\xac\x02\x39\x6d\x4d\x04\x0c\xee\xee\xc0\xbb\xfb\x30\x8c\x08\x99\xeb\x51\xb2\xf5\xdb\x4d\x94\x8c\x11\x04\x24\xd2\xac\x28\xa0\xd7\x73\x81\x6f\xec\xc3\xbc\x90\x8d\x01\x3d\x3b\xcb\x9b\x72\xf4\xfd\x9b\x88\x38\x18\x65\x1a\xcc\x3b\x9c\xf1\x25\x7d\x29\x14\x73\x64\x20\x2b\xa0\x5a\x4d\xb1\xc6\xe2\x7d\x90\xa2\x23\x66\xb7\x69\x15\x1c\xbe\x5b\x00\x1c\x53\x52\x06\x3d\x46\xab\x54\x6b\x3a\x89\x99\x33\x95\x2e\x4a\x58\xef\xc5\x9a\x0b\xa7\x57\x97\x86\x76\x76\xda\x1f\x46\x46\xcb\x7e\x44\x6a\x3d\x62\x31\x8e\xbf\xce\x76\xd5\x62\x1c\x9f\x7e\xf1\x91\x5b\x39\x2e\x1c\xe4\x7b\xa5\xdc\x99\xb1\x83\xc3\xef\x6f\x5f\x65\x03\x2a\xe8\xbb\xc4\xae\xe0\xbc\x3d\xcb\x05\x8d\xff\x5c\x1e\x57\xf1\x4b\xd2\xd7\xdd\x57\xba\xbb\x6f\xe3\x43\x56\x5b\x53\xe0\xdf\x22\xbd\xd8\x57\xe4\xb5\x7d\x9b\x24\x53\x69\x4d\x14\x6c\x91\xb0\x13\x09\x67\xe7\xc2\x82\x2b\x95\x67\xf5\x7c\xae\x3f\xca\x26\xde\x4b\xfd\x52\xc2\x88\x10\x9b\x83\x53\x89\x6f\x5a\xed\xc8\xb4\x92\x6c\x83\x74\xbe\x2c\xa2\x82\x21\xae\x4a\x42\x64\x12\x92\xf3\x7a\x82\x89\xd7\xa2\x8d\xf9\x94\x2b\xd4\x12\x4a\x26\x27\x07\x7f\xbe\x57\x00\x00\x88\x8c\x0a\x05\x0e\x41\x4d\xe7\xa1\x4a\x03\x16\xb3\x18\x68\x3c\xaf\x08\x34\xa3\xe9\x3a\xcd\x6a\x48\x67\x69\x5d\xe5\x34\x40\x0b\x80\xc3\x98\x67\x55\x1a\x73\x80\x16\x75\x11\xbb\x16\x29\xa8\x7b\xdf\x1e\xb0\x48\x02\x77\x35\xb7\x72\xf3\x96\xdb\x5b\x24\x40\xd3\x87\xcc\x00\xff\xb9\x95\x9f\x68\x91\x8e\xbe\x03\x51\x1c\x76\xf9\x44\xb6\x97\xee\xd2\x0b\xbe\x3f\x91\xe6\x40\x9e\x73\x49\xa6\x19\xe7\x96\xe5\xd4\x48\x4f\xa7\xe6\x71\x7d\x41\x8b\xf9\xa9\xc1\x2a\x4e\x21\x2d\xc5\xc9\x3c\x2e\xe5\xf5\x02\x96\x22\x42\xbc\xd4\x1e\xb2\x13\x28\xb1\x5d\x38\xe0\x62\xc9\x98\xd1\xd5\x6b\xf9\x5a\x0c\x70\x5d\xf5\x43\x2c\x92\x8f\xdc\xba\x40\x2d\xd2\x8b\xf8\x03\xb4\x48\xaf\xde\x03\xf5\xaa\x45\x0a\x04\xff\x0b\x16\xe9\x2b\xed\x43\xdd\xb3\x48\x7e\x64\x15\xa4\x45\xf2\x83\xff\x45\x8b\x14\x6a\xc4\xec\xd6\x54\x1e\xc5\xaa\xc9\x69\x61\x10\x8b\xd5\xaa\x31\x53\x6f\xab\x4d\x2b\x2d\x1b\x6d\x61\xd0\x97\xea\xe1\x64\x95\x66\xb8\xec\x70\x4a\xa3\x81\x54\xe7\xa5\x9a\x04\x04\xd6\x94\x92\xf3\x7a\x64\xd4\x1c\x8d\xd5\xd8\x28\x46\xaa\x66\x4e\x2d\x64\x22\x62\x09\x94\x8a\xcd\xf7\x48\xe0\x51\x38\x88\x78\x4e\x51\x39\x24\xb2\x1c\x44\x82\xa0\xea\x34\xc3\x6a\x02\xc3\x8b\x34\xc6\xa2\x8a\x10\x87\x44\x20\x08\x0c\x64\x14\xc0\xd2\x1a\x23\x70\x48\x03\x50\x27\xa2\x8e\x55\xc2\x22\x9a\x73\x2d\x52\x50\x77\x76\xdd\xcd\x24\x80\xb4\x00\xae\xef\xf3\xac\xdf\xc2\x83\x45\x42\x20\x88\xfb\xd5\x6f\x64\x12\xb8\x16\xc9\x57\x54\xed\xde\x1a\x49\xce\x44\x66\x21\x61\x95\x05\x64\x32\x5f\x44\x43\x76\xba\x27\xb7\x8a\x23\xa5\x9f\x15\x9b\x15\xb5\xe9\xa8\x8e\x99\x4b\x69\xc4\x61\xb5\x5e\x77\xc0\xb7\xd2\xf5\xf4\x4a\x1a\x97\x2b\xdd\x56\x75\xa6\x2f\xcd\x54\x3a\x93\xd6\x4a\xa3\x26\xc7\x4d\x7b\x8c\x19\xb2\x12\x62\x86\x4b\xa7\x46\xdd\x2f\xb9\x46\xba\x9c\xbd\xfb\x79\x6b\xa4\xa8\x7f\xfc\x1f\x72\xdf\xf2\x13\x16\x21\xe8\x35\xd2\xb3\x19\xc1\x92\xf4\x75\xf7\xad\x2e\x5a\xa4\x1f\xb4\x46\x91\x3e\xa0\xaf\x9e\xc1\xbf\xb5\x48\x25\x33\x11\xe6\x57\xb9\x59\x9d\x1b\xc7\xe4\x2c\x37\x1f\xc9\xe5\x6e\xa8\x3d\xcd\xcd\x80\x96\x5e\x10\xb0\x64\xba\xf3\x1e\xe0\xe0\x90\x49\x44\xab\x4e\x77\x58\x1b\xe7\xa2\x5a\x3c\x13\xe9\x15\xc4\x70\xa6\xdb\x1d\x98\x43\x10\x6d\xeb\xd6\x3b\x97\xc4\x7d\xce\x56\x68\xcb\x1c\x18\x38\xf8\x35\x12\xaf\xe9\x02\xcb\xab\x0c\x54\x79\x4d\x27\x8a\xc8\x23\x8d\x57\xa1\xc8\x72\x3c\xcf\x72\x02\x8b\x05\xa2\xe9\x58\x40\x22\xa7\x28\xbc\x00\x74\x0d\x22\x4e\x15\x08\x43\x33\xac\x8e\x35\x51\xd1\x5d\x8b\x14\xd4\x1d\x48\xf7\x2d\x12\xa0\xd9\xab\x77\x20\xed\xdf\x6e\x2d\x92\xc0\x04\x71\x37\xf6\x27\x5a\xa4\xa3\x35\x52\x24\x19\xce\x65\xb9\x50\x79\xd5\x78\x9f\xc6\x8b\x3d\xa1\x9b\x8d\x33\xe5\x69\x7b\xd5\x72\xfa\xfd\x49\x91\x24\x67\x61\x53\x13\x73\x3c\x5a\x0c\x6b\xb4\xd8\xc4\x08\xb3\x04\xe4\x7b\x39\x27\x57\x29\xa7\xcc\x6c\xca\xe9\x02\x19\xc7\x1a\xb2\xb8\x9a\x39\x49\x7d\x58\x6f\xa4\x24\x5c\x99\x97\xbe\xe2\x1a\xe9\x65\x8b\xf4\x22\xfe\x00\x2d\x52\x20\x77\xe5\xbe\x60\x91\x3e\xfb\xae\x5e\x49\xfa\xba\xfb\x5c\xf7\x2c\xd2\x67\xae\x51\xa4\x0f\xe8\xab\x67\xf0\x6f\x2d\x92\xac\x0b\xf3\x99\xc5\x26\xf3\xf8\x1d\xd5\x42\xc9\xa5\x64\x37\xdb\x09\x76\x9c\x37\x98\x42\x61\x20\x22\x12\x0e\xf5\x20\xbd\x9a\xf5\x13\xf5\x6a\x15\x68\x56\xcf\x1a\xf2\x35\x46\x5e\xd2\x8b\xb4\x6c\x74\x6d\x83\x89\xd5\xca\x66\xbe\x55\x85\x85\x10\xad\x85\xea\xf5\x56\x37\x32\xc9\x46\x02\xcf\x85\xd3\x14\x28\x0a\x44\x41\x98\x08\x22\xcf\x72\x90\x61\x39\x04\x55\xac\x31\x40\x15\x11\x01\x50\xd1\x55\x9a\x47\x0a\x64\x20\x21\x02\x24\x00\x01\x45\xe7\x69\x80\x59\x4d\xa4\x91\x0e\x94\xb7\x4d\xc8\x6e\xb3\x8f\x14\x29\x17\x5b\xc9\x54\x96\x89\xa6\x60\x3c\x5f\x42\x91\x66\x36\x9e\xcb\xc7\xb2\xf1\x74\x2d\x5f\xac\x31\xc9\x16\x6c\xe7\xe2\x95\x64\x21\x5f\x8b\xca\x05\xa9\xd2\xe0\x4b\x51\xbe\xd0\x64\x92\x6f\x9b\xe6\xb7\x0d\x11\xcb\x32\x0c\xb8\x6a\x88\x76\x6f\x5d\xc3\x26\x70\xc2\x3e\x3f\x21\x91\x15\x92\xa5\x59\x69\xa0\x64\x98\xa4\x04\x1b\xf5\x7e\xd9\xca\x8c\xfa\x4d\x9a\xd6\x13\x82\x9d\x4d\xf1\x23\x5a\x2e\xcf\xd3\x8d\xb0\xd4\x84\xd2\xde\x0e\xb9\x0a\xe3\xe9\xd4\xb3\x79\xc2\xf7\x77\x21\xb7\xf0\xea\xb3\x79\x7c\x73\x06\x55\x96\x5a\xfd\x92\x5a\xac\x32\x09\xb6\xf7\x3e\x8e\x8c\xba\x89\x04\xe9\x8a\x69\x61\x88\x54\x20\x8f\x6b\xc3\xc5\x60\x28\x0f\x93\xa2\xfd\xde\xb6\x68\x91\x07\x71\xae\x90\x6d\xe8\x24\x3c\x42\x83\x49\xdc\x49\x85\xec\x14\x6d\x80\xf7\xac\xe1\xb0\x12\x9d\x5e\x36\xc6\x4a\xaf\x95\x6d\xb0\x66\xec\x01\xdb\x73\xa2\xb4\xa7\xb6\xe7\x88\xe7\xc3\xdc\x7b\x1c\xf3\x30\xc2\x11\x3a\x4b\xa7\x13\x4b\xa7\x37\xcf\x83\x61\x8b\xc6\xcb\x89\x09\xc4\x7c\x72\x31\xcb\x46\x97\x05\xd6\x89\xc8\x6a\xd4\xe5\x11\x76\x1d\xab\x30\x6e\x85\xf9\xa3\x2b\x3f\x72\x17\x89\xb8\x33\x9e\x5f\xc0\x1f\xaf\x36\x22\xd6\x0b\xf8\x25\xe9\xc7\x9d\x1e\xb9\x38\xb7\x46\xfc\xcb\xa2\x30\x6e\xdf\x64\xf3\x9e\x2c\x5e\xed\x8b\xb5\x2e\x84\x54\x0f\xbc\xa7\x64\xf1\xdf\x44\x8a\x4e\xc6\x68\xb1\x37\x6d\xe1\xc9\xbc\x6d\x46\x7a\x63\xb3\x58\xd1\xd3\x24\x99\x2f\xa7\x41\x5a\x6d\xa7\xcb\xe9\x72\x58\xc9\x8c\xb0\x58\x24\x62\x99\xf4\x0d\x30\x86\x33\x76\x9a\xce\x94\x95\x4a\xd1\x8a\xe6\x53\x0e\x36\x90\x45\x4a\xf9\xa8\x3a\x9c\x30\xa8\x11\x05\x53\x2c\x05\x1e\x7f\x62\x30\xd6\x74\x85\x16\xa1\xce\x08\x80\x57\x34\xc4\x22\x2c\xf2\x10\x2b\x08\x01\x15\x61\xa8\xf1\xaa\x88\x04\x55\x85\x98\xe1\x79\x5d\x55\x68\x9a\x53\x88\xce\xb3\x8c\xa0\xe8\x22\x12\xb7\x73\x2b\xf3\xda\xdc\xca\xdc\x9f\x5b\xe1\xd5\x5b\xba\x76\x2f\x37\x33\x2b\x62\xf8\xc3\xbe\xbc\xff\x99\xf5\x86\x87\xef\x16\x1f\x31\x8f\xe3\xcf\xd4\x1e\xcd\xac\xd1\x24\x16\x7b\xc5\x45\x2b\xc4\xce\x51\x38\xda\x05\xdd\x06\x13\xd1\xd2\xa9\x1a\x1d\x1d\x45\xbb\xe3\x7e\xbf\x59\x5a\x2d\x40\xac\x4f\xd2\xab\x2a\x9a\xf4\x9a\xb1\x6c\xc1\x20\xd3\x76\xda\xac\x36\xb9\xfe\xac\xa7\xad\x72\xb8\xa7\x93\x49\x71\x38\x29\xc9\xa9\x85\xc0\x34\xd8\xa6\x30\x49\x25\xbe\xd6\xcc\xfa\xea\xcc\xf6\xe2\x68\x9e\x98\x19\x54\xcd\x06\x39\xb3\x7e\xe2\xfe\xee\xdd\xc8\xfe\x27\xce\x6c\x52\x40\x33\xab\x80\x0e\xed\xaf\xec\x8a\xdd\x9a\x59\x7b\xcc\xac\x55\x15\x1a\xc5\xa9\x5a\x28\xce\xcd\x7c\x2b\xee\x74\x9b\x95\x4a\x3c\x2f\x4d\xba\x66\x1a\x21\x40\xe7\x04\xad\x84\xa0\xa1\xd2\xa1\x4c\xab\x3e\x5f\xae\xcc\xb1\x35\xaa\x60\x19\x84\x4c\x1e\x35\xd5\x55\xc2\x6c\xc2\xf7\x2a\x8b\x6b\x91\x68\x4e\xcf\x0f\xa7\xf5\x70\xa6\x12\x7c\x1c\x05\xf2\x80\xe5\x14\x02\x15\x51\x05\x3c\x8d\x69\xc0\x6a\x8a\xc2\x41\x9d\xf0\x0a\x23\x30\x0a\x80\xb4\xa8\x21\x9e\xe7\x18\x4e\x17\x90\xaa\x72\xaa\xa8\xa8\x58\x03\x8a\xce\x28\x0a\x74\xb3\x59\x99\x6d\x64\xdf\xff\xcc\x7a\x77\x8b\x99\x65\x59\xe6\xfa\x16\xf3\xee\xad\x3b\xb7\x72\xc2\xd1\x0e\xb3\xef\xb9\xf5\xc6\xb9\x0d\xb7\xf8\x58\xbd\x5f\x99\x5b\x63\xe9\x99\x8e\x52\xf3\x14\x6b\x95\xaa\x50\x9a\xd0\xe1\x76\x25\xfe\x1e\x2a\xcf\xeb\x20\xcd\x11\xa9\x5d\x67\xa1\x16\xd2\x50\x28\x82\x87\xa1\x19\x5c\x69\xbd\xd4\x54\x60\x52\x61\x92\xb2\x0a\xbd\x58\xb2\xd4\xb2\x9c\x69\xb1\x1d\x9f\xa7\x54\x19\xe9\xd3\x58\x3f\xd2\xad\xa7\xba\x53\xb9\xf0\xa5\xe6\xd6\x97\xe7\xb6\x17\xc7\xb3\x99\x8d\xe2\x41\x90\x5e\xeb\x67\xee\x54\x7e\xc4\xdc\xea\x77\x6e\x93\x02\x9a\x5b\xfd\xae\x60\xb6\x73\xeb\x52\x81\xa1\x68\x2e\x5a\xc0\xb4\x2c\xce\x33\x5a\x91\xa9\xf5\xf0\x6c\xa0\xc6\xb5\x0a\x19\x77\x13\x75\xa2\x41\x7d\x4c\x8a\xdd\xc6\x44\xb7\x44\x01\xb6\x2a\xd9\x59\xde\x28\x42\x23\xb3\x32\x4b\x0b\x3a\x91\xe1\x95\x3e\x53\x56\xa3\xc9\x48\x21\xc9\x77\xd1\xbc\x15\xaf\xa4\xb2\xbd\xd8\x83\x73\xeb\x4f\x3f\xfd\xf6\xdb\x4f\xbf\xfd\x46\xe5\xf1\x88\x7c\xa7\xb0\x6d\x13\xa7\x63\x3b\xd8\xb1\x8f\xff\xee\x4c\x06\x64\xf9\x07\x55\x5d\x4e\xc8\x77\x2a\x5a\xc8\x57\xaa\x65\x29\x95\xaf\xfe\x41\x55\xd4\x1e\x19\xe1\xef\xd4\x64\xaa\x0c\x0d\xf5\x0f\xaa\x30\x1f\x13\xeb\x3b\xb5\x86\xf8\xd3\x4f\x52\xb6\x2a\x97\xa9\xaa\x14\xc9\xca\x54\x21\x9f\x6d\x1d\x43\xfc\x89\xa2\x28\x4a\x8a\xc5\x8e\xa0\x9d\x21\xa4\x8a\xe5\x54\x4e\x2a\xb7\xa8\x8c\xdc\xa2\x7e\x31\xb4\x33\x6a\xbb\xa6\x35\xe9\x8c\x8c\xae\x85\x5d\x33\xe0\x79\x0e\x88\x6a\x0f\xd4\x4b\x94\x5f\x42\x7c\x97\xfa\x9d\x25\xdb\xb0\x6d\x7b\x1e\xdd\xff\x74\x54\x53\x23\xdb\x3f\x9d\xe5\x64\xf7\xa7\x61\xdb\x53\x62\x75\x02\xe1\xee\x14\xed\x25\xe6\x7c\x11\x46\xd5\xf2\xa9\x52\x4d\xa6\x7e\x39\x54\xff\x46\x1d\xea\xef\xfe\x76\x1b\x3c\x29\x9a\x60\xba\xf5\x69\xc6\x9f\xea\x54\x73\x42\x5c\x65\xe8\x4c\xb0\xe5\x18\xaa\x31\xc1\xe3\x23\x4e\x2e\xbf\x0e\x98\xb3\xcb\x48\x6e\x71\x7a\x83\xac\x87\x39\x3f\x72\xcc\x2e\xf3\x7e\xad\x42\xc0\xdc\x5f\x43\x73\x8b\xff\x9b\xa4\xdd\x95\x80\xab\xd2\xca\x72\xa3\xed\x3b\x46\x52\xf9\x98\xdc\xbc\xc3\x43\xb4\x2c\x4b\x55\xd9\xad\x7a\x0a\x85\x2a\xe4\xbd\x83\xa1\x56\x49\xe5\x13\x94\xe2\x58\x84\x1c\x8f\xae\xeb\xd4\xb8\x63\xec\x75\x7a\x5c\x38\x8f\x51\x74\x65\x5c\x2b\xcb\x0e\x56\x55\x73\x3a\x76\x7c\x93\x73\x00\x71\x4c\xc9\xc9\x6a\xe0\x94\x1e\xb7\xf2\x37\x6a\xfb\x47\xc7\x26\xef\x53\x32\x56\xcf\x05\xa6\x2c\x3b\x3d\x6c\xf7\x5e\xa1\x6c\xdd\xfe\x31\xb2\x8e\x35\x6d\xdd\xea\x12\x35\x43\xa2\x75\x5f\xe8\xb8\x3d\x84\xc7\x28\x72\xeb\xee\xc5\xf3\x8d\xc2\x93\xc9\xd0\x50\xdd\xe9\xc0\xb4\xb4\x2b\xd3\x74\x87\xac\x75\x63\xf3\xde\x07\xa5\x5b\x2b\xe1\x12\xec\x01\x77\x4c\x36\xd1\x75\xa2\x7a\x55\xed\x7c\xd6\x32\xb4\x6f\xd4\xcf\x9b\xc6\x3f\x5f\x23\xd6\xd0\x02\x22\xd3\xd0\x1e\x26\x70\xa7\x7a\x6b\xf2\x7c\x10\x6d\x4e\x3a\x93\xa0\xe8\xde\xc2\x3a\x26\xfd\x8a\xa9\xf2\xc5\xc9\x65\x06\x9c\x45\x70\x0c\x6c\x61\x5d\xd1\x69\x9f\x2c\x1c\x43\xb8\xc4\x84\x39\x59\x6b\x65\xcf\xf4\xc5\xc3\x96\xf8\x03\x0c\xbf\xc2\xbf\x2d\x68\x7b\x3b\xda\x37\x53\xf5\xeb\xb2\x3e\x05\x77\x4c\xb2\xfb\xbb\x87\xc6\xcb\x14\x1d\xcb\x35\x28\xb2\xce\x60\x3e\x36\xbd\x5d\x22\xd0\x71\xbb\xc4\x79\xa5\x5b\x0f\x30\xfc\xab\xe4\x3d\xf5\x73\x2c\x6d\x8d\x44\xc1\x36\x79\xd9\x7e\x5e\x02\xe6\xa1\x5c\x23\x1e\x3a\x8f\xeb\xde\x25\xd0\xd4\xf5\x17\x8c\xd6\x39\xa8\x87\x88\xdb\xd4\xbc\x45\xda\x86\x76\x62\x05\x26\x3e\x0f\xbc\x7b\x44\x7a\xaa\x3f\x42\x69\x30\x72\x3c\x81\xf6\x28\x95\x77\xa5\x19\x0c\x6d\x0f\xd1\x74\x9b\x96\x1d\xc5\x43\xd3\x1c\x4c\x27\xaf\x51\x74\x0a\xeb\xe1\x1e\x75\xfd\xdd\x2b\xf4\x4d\xb0\x61\x75\x1c\x63\x44\x02\xa1\xd0\x0b\xed\xb1\x71\xbb\x25\xf0\x1b\xe5\x25\xf9\x1b\xb5\x9d\xe2\xd5\xa1\x69\x13\xad\x83\x9d\x2b\x4c\x04\x30\x6f\x6f\xe1\xdc\xa3\xf8\x49\xef\x68\x0d\x35\x30\xe9\x3e\x21\xd8\xbb\x72\x33\xc6\x1a\x59\x74\x3c\x2e\x87\xdd\x31\xc7\x1d\xac\x69\x16\xb1\xed\x57\x05\x7a\x17\xc1\xc9\x3a\x6d\xfb\xda\xb3\x32\x72\x2b\x3e\x41\xfb\xeb\x7a\x70\x0b\xf6\x7d\x8a\x2f\x8c\xb2\x53\x80\x5b\x2f\x7c\x0d\xcf\x59\x4e\xfc\xaf\xc1\x6f\x42\xbd\xeb\xf6\xaf\x2b\xdd\x21\x74\xeb\x43\xad\x41\xee\x95\x28\x20\x6a\x2f\x81\xbe\xeb\xbe\x3d\xaa\xc9\x47\xc0\x83\x56\x86\x13\xd0\x7e\xfc\xcd\xeb\xe0\x46\x13\xd3\x5a\x4f\x7c\x33\x62\xd9\x86\x39\x0e\x5e\xd0\x5e\x0c\xf7\xc9\xf7\x34\x78\x9c\x99\xed\xd4\xe3\x33\x52\xf1\x98\xfc\x8f\x70\xdc\xe5\xe4\xa8\xee\xe3\x4c\x4c\x2c\x32\x33\xcc\xa9\xfd\x29\xdc\x5c\x42\x76\x97\xad\x4b\x8d\x1e\xe7\x6f\x17\x44\xf9\x30\x9e\x76\x08\xee\xf2\x71\x35\xda\x75\x0a\x7a\x6f\x6f\x3f\x64\x68\x7b\xa1\x5f\x5c\x00\x3f\x3b\xc0\x4f\x81\x9e\x2e\xa1\x02\x1a\xe1\xb7\x50\x3c\xc2\xc3\x9d\x75\xdd\x4d\x64\xc1\x99\xaf\x73\xc0\x0f\xd1\x7e\xdf\x88\x1d\x2f\xb6\x3f\x42\x6d\xce\xe1\xfb\x5e\xea\x6f\x9c\xb8\xbd\x21\xdf\x45\x18\x3b\x8a\x69\x0e\x7c\x4b\xf9\x06\xcc\xbb\x2e\xc2\x2f\xbf\x68\xc4\xc1\xc6\xd0\xa6\x7e\xfb\x9f\xff\xa1\xde\x6c\x73\xa8\x1d\xed\xa6\xbd\x7d\xff\xee\x90\x85\xf3\xeb\xaf\xdf\xa8\xeb\x15\x55\x53\x7b\xac\xa2\x1b\x8b\xbf\x5e\x55\x31\xa7\xdd\x9e\xf3\x10\xfa\x93\xaa\xb7\x09\x38\xa9\xea\x21\xe1\x57\xaa\x91\x94\xcb\xb2\xab\x64\xd4\x9f\x14\x84\x0f\x6f\x44\x1b\x5a\x47\x3f\xda\x26\x8a\x67\x3e\x67\x3b\x7a\x8b\x96\x8a\x17\xca\x72\x2a\x91\xdf\x6f\x01\x51\x65\x39\x2e\x97\xe5\x7c\x54\xae\x78\x76\x45\x36\x6f\x0b\x79\xaa\x56\x8c\xad\x55\xa6\x2c\x57\xaa\xe5\x54\xb4\xba\xfe\x29\x26\x67\xe5\xaa\x4c\x45\xa5\x4a\x54\x8a\xc9\x37\xf6\xd1\xd6\xeb\x8e\xd3\xc7\x8e\x27\x14\x13\x9c\x30\x4e\xf1\xdc\xd9\x24\xbb\x46\xc9\xa9\x7c\xbc\x61\xa3\x8b\xc2\xda\x3a\xfa\x77\x76\x14\xaf\x4a\x62\xbb\x94\xfd\xe1\x72\x38\xa6\xe3\x92\x14\x76\x51\x82\xdb\x0a\xf3\x9c\x04\xce\x83\x4a\x3f\x50\x0c\x57\x88\x39\x95\xc5\x85\x30\x58\xb0\x4a\xe1\x0d\x71\x7c\x05\x81\x5c\x57\x8d\xb3\x18\xd2\xa3\xda\x51\x34\x6d\xa7\x6b\x91\x4a\x29\x4b\x69\xd8\xc1\x6b\x15\xa3\xb4\xe9\x68\x42\xa9\xe6\x68\x32\x24\x0e\xd9\xf0\xf0\xff\x03\x00\x00\xff\xff\x73\xd2\x94\xcf\xbf\x83\x01\x00") - -func order_booksHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _order_booksHorizonSql, - "order_books-horizon.sql", - ) -} - -func order_booksHorizonSql() (*asset, error) { - bytes, err := order_booksHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "order_books-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9a, 0xcd, 0x52, 0x9, 0x66, 0xea, 0xff, 0x38, 0x1b, 0x9f, 0xca, 0x42, 0x9f, 0x65, 0x1a, 0x26, 0xdd, 0x54, 0xc7, 0xc6, 0x41, 0xbb, 0xf7, 0x22, 0xc8, 0x2c, 0xfc, 0x37, 0xc8, 0xb, 0x75, 0xdf}} - return a, nil -} - -var _order_books_310CoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x67\x73\x63\xb9\xd5\x36\x0a\x7f\x9f\x5f\xa1\xf2\x97\xb6\x4b\x63\x13\x39\x78\x5e\xdf\x55\x9b\x39\xe7\xfc\xd6\xa9\x29\x60\x03\x60\xce\x99\xa7\xee\xff\x7e\x4a\x24\x5b\x62\x53\x94\x5a\x4d\x6d\xf6\xf4\x39\x8f\x31\x65\x99\xcd\x0d\x02\x58\x17\xd6\x5a\x17\x16\xd2\xfe\xe7\x3f\x7f\xfb\xe7\x3f\x1f\x8a\x93\xc5\xb2\x33\xb7\x95\x52\xf6\xc1\xa8\xa5\xd2\x6a\x61\x1f\xcc\x6a\x34\xfd\xed\x9f\xff\xfc\xed\xe9\x79\x74\x35\x9a\x5a\xf3\xe0\xe6\x93\xd1\x4b\x86\xb5\x9d\x2f\x7a\x93\xf1\x83\xfc\x17\xfb\x17\x3c\xcb\xa5\x77\x0f\xd3\xce\x9f\x4f\x3f\xbf\xc8\xf2\x5b\x25\x56\x7d\x58\x2c\xd5\xd2\x8e\xec\x78\xf9\xe7\xb2\x37\xb2\x93\xd5\xf2\xe1\x3f\x0f\xe0\x8f\xc3\xa3\xe1\xc4\x1f\xbc\xfe\xb6\x67\x86\xf6\xcf\xde\xf8\xcf\xe5\x5c\x8d\x17\xca\x5f\xf6\x26\xe3\x3f\x17\x76\xf1\x54\xee\xeb\xcc\xfe\xb0\xf7\x54\xb4\x1d\xfb\x13\xd3\x1b\x77\x1e\xfe\xf3\xf0\xa5\x56\x8d\x8b\x2f\x7f\x7c\xad\x7b\x6c\xd4\xdc\xfc\xe9\x4f\xc6\x6e\x32\x1f\xf5\xc6\x9d\x3f\x17\xcb\x79\x6f\xdc\x59\x3c\xfc\xe7\x61\x32\x3e\x95\xd1\xb5\xfe\xe0\x4f\xb7\x1a\x1f\xeb\xd2\x13\xd3\xb3\x4f\xcf\x9d\x1a\x2e\xec\x37\xd5\x8c\x7a\xe3\x3f\x47\x76\xb1\x50\x9d\x43\x86\x8d\x9a\x8f\x7b\xe3\xce\x31\xcb\x7c\xb2\xf9\x73\x61\xfd\xd5\xbc\xb7\xdc\x3d\x15\xee\xdc\x1f\x27\x00\xac\x9a\xfb\xdd\x3f\xa7\x6a\xd9\x7d\xf8\xcf\xc3\x74\xa5\x87\x3d\xff\xf7\x27\xc4\x7c\xb5\x54\xc3\x49\xe7\x8f\xdf\x7e\x8b\x96\x0b\xc5\x87\x54\x3e\x1a\x6b\x3e\xa4\xe2\x0f\xb1\x66\xaa\x52\xad\x9c\x72\xfe\x6b\x35\xed\xcc\x95\xb1\xdd\xde\x62\xa9\x77\x0b\x3b\xfb\xe3\xdd\xdc\x0b\x7f\x3a\x5b\x4d\xe6\xab\xd1\xe2\x63\x99\xed\x78\xfd\x91\x9c\x43\x6b\x3a\x76\xfe\x91\x9c\x4f\xed\x74\xd6\x7e\x30\xe7\x07\xb2\x69\xbb\x58\x4e\x9c\xb3\xf3\xde\xd8\xd8\xed\xfb\x79\x95\xef\x4f\x56\xe3\xa5\x56\x43\x35\xf6\xed\xe2\x8f\xdf\xbc\x6c\x35\x56\x7e\xa8\x7a\xe1\x6c\xec\x2c\x77\x21\x9f\x6d\x5d\x81\x77\x32\xdf\x3d\x1c\x4a\x8f\x14\xf2\x95\x6a\xd9\x4b\xe5\xab\x67\x3f\xfa\x36\xe3\x9f\xd3\x81\xdd\x7d\xa4\xfc\xe5\xf6\xfb\x45\x3f\xe7\xf9\x81\x52\x9d\xfd\x40\x9b\xcf\xb3\x7d\xbc\xec\xf9\x6a\xb1\x1c\xf6\xc6\x76\xf1\x5e\xc9\xcf\x99\x3e\x5c\xee\x53\x2b\xec\xc1\x1b\xbc\x53\xee\x4b\xa6\x8f\x97\xfb\xac\xf2\xef\x95\xfb\x9c\xe9\xc3\xe5\x1e\xf3\xf7\xc6\x6e\xf2\x4e\xb9\x2f\x99\x3e\x5c\xee\x74\xa5\x17\x2b\xfd\x4e\x99\xc7\x0c\x3f\x52\xde\xb0\xb7\xe8\xce\x56\x76\xf5\x1e\xb2\xe7\xd9\x3e\x5e\xb6\xb5\xf3\xf7\x60\x3d\x3c\xff\x70\x69\x07\x33\x7e\xaf\xb8\x63\x86\x0f\x97\x77\xf4\x4a\x5d\xab\xcc\xfb\xc5\x7e\x93\xef\xce\xa5\x9f\x3c\xa5\x9d\xfd\xf9\xc1\x6a\xb4\x1a\xbf\x53\xb8\x56\xe3\x0f\x37\xf8\xe4\xfd\xde\x6b\xeb\xd7\x2c\x3f\x5a\xe6\xd3\x18\xe0\xfb\xc5\x3e\xe5\x3a\x95\x7c\xc8\x7b\x59\xf0\x55\x97\xfb\x7e\xde\x67\xd7\xf8\xbd\x6c\x2f\x8e\xee\x3b\x39\x9f\x1d\xd7\xfb\xf9\x5e\x1c\xd1\x77\xf2\x3d\x3b\x96\xef\xe6\xfb\x50\xfb\x5e\x1c\xca\xfb\xf9\x8e\x4e\xe2\xbb\x79\x9e\x4d\xfe\x3b\x39\x9f\xec\xf8\xfd\x2c\x47\xdb\x7c\x3f\xcf\x37\xa6\xf0\x7e\x56\xad\xc6\xef\x67\xf8\xaa\xaa\x1f\xca\xf5\xa4\x79\xa7\x8c\xb1\x66\x35\x96\xaf\xa4\x0a\xf9\xf3\xcc\xc3\x69\x67\x31\x1b\x9e\x72\x54\x22\xc9\x58\xce\x7b\x55\xd6\x1f\xbf\x1d\xc7\xc6\x79\x35\xb2\xff\xfe\xfa\xdd\x43\x75\x37\xb5\xff\x3e\xfd\xe4\x8f\x87\x8a\xdf\xb5\x23\xf5\xef\x87\x7f\xfe\xf1\x50\xd8\x8c\xed\xfc\xdf\x0f\xff\x3c\x0c\x99\x23\xe5\x98\x57\x8d\x7d\x2d\xf9\x6b\x79\xbf\x7d\x53\xe2\xb7\x0f\x4f\x05\x47\x0a\xb9\x5c\x2c\x5f\x7d\xa7\xe4\x63\x86\x87\x42\xfe\xdb\x02\x1e\x52\x95\x87\x2f\x5f\xc7\xb7\x5f\xbf\x5b\x1c\x0a\xf9\x72\x59\xf3\x57\xf1\x4f\x75\x3e\x23\xf4\x5d\x79\xbe\xc1\x32\x5f\xa8\x5e\xe0\xf9\xd0\x48\x55\x93\xcf\xcd\x3a\x1f\xd0\x7e\x53\xfd\x4b\x29\x17\x0d\xf9\x11\xe1\x5f\x15\x72\x00\xa0\x98\x0d\x4d\x3b\x4f\x51\xcc\x74\x3e\xf1\xad\x59\xcd\xd5\xf0\x61\xa8\xc6\x9d\x95\xea\xd8\x03\x0c\x1f\x1c\x80\x3f\x65\x33\xd6\xa9\xd5\x70\xf9\xe7\x52\xe9\xa1\x5d\x4c\x95\x6f\x9f\xa2\x89\x2f\x17\x4f\x37\xbd\x65\xf7\xcf\x49\xcf\x9c\x05\x08\xdf\x08\x7b\xae\x90\x27\x31\x0f\xaa\xfb\x22\xe4\x57\x05\xb8\x06\xf8\x51\xcb\xcf\x9d\xee\xdf\x7f\x7b\x78\x78\xf8\xfa\x4d\xcf\x3c\xf8\x5d\x35\x57\xfe\xd2\xce\x1f\xd6\x6a\xbe\xeb\x8d\x3b\x7f\xa7\xec\x1f\x87\xbe\xc9\xd7\xb2\xd9\xdf\x0f\xb9\x9f\x7e\x38\x56\x23\x7b\x25\xb3\x10\xd7\x32\xaf\xd5\x70\x75\x2d\x37\x84\xe8\x32\xfb\x50\x2d\x96\xa3\x89\xe9\xb9\x9e\x35\x0f\xbd\xf1\xd2\x76\xec\xfc\x39\xcb\x6f\xff\xb8\xec\xfb\x67\x2b\xfe\x24\x16\x8b\x9b\x80\x38\x05\x02\x0f\xba\xd7\xe9\x8d\x97\x17\x0f\x17\x76\x36\x5e\x8d\xae\x3f\x1b\xaf\x46\x8b\x95\xb6\xe3\xe5\xfc\x29\x14\xbc\x14\xf3\x98\xa7\x37\x76\x43\xf5\x14\x31\x1a\xbb\x58\x5e\x6f\xce\x31\x63\x77\x32\xb2\x66\x32\x52\xbd\xf1\x95\x5c\x84\x5c\x36\x7a\xd9\x9d\xdb\x45\x77\x32\x34\x8b\x87\xa5\xdd\x5e\xb6\xcc\x0d\x55\xe7\xad\x16\xbd\xdb\x37\x27\x44\x56\x4f\xb5\x0e\x7b\x4a\xf7\x86\xbd\xe5\x93\x70\x47\xf9\xbf\x42\x32\x1c\xbe\xf7\xb8\xd7\x19\x3f\x8d\x85\x9e\x9a\x75\xfc\xe6\x6c\x34\xf0\x3c\xb4\x38\x81\xfe\xe7\x21\xac\x7e\x88\x24\x63\x91\xcc\xc3\xdf\xff\xfe\xb5\x2b\xfe\xe7\x3f\x0f\xe0\x1f\xff\x78\xe7\xd7\x97\x0d\xbc\x2c\xe7\x95\x00\xdf\x2b\xf1\x9b\xbe\xbc\x28\xed\xdb\x7e\xfe\x5e\x49\xaf\xe1\xb9\x28\xee\x0a\x7e\xc7\x32\x5f\x1b\xc6\x13\xff\xdd\x6a\x13\x4f\x43\xc6\xa3\x39\x8c\x27\xc6\x9e\xdb\xc2\x37\x36\xf0\xba\xd2\x6f\xf9\xf9\xd6\xea\xbf\x1d\x18\x1f\x1b\x72\xfa\x4e\x2d\xba\x67\x8d\x61\xaf\x74\x7b\x3a\xb7\xeb\xef\x66\xd2\x2b\x7f\x60\x97\xc3\xde\x62\xf9\xdd\xac\xcf\xa3\xed\xaf\xea\x7e\xfc\xda\x1f\x4e\x16\x76\xd9\x1b\xbd\x61\xf9\x07\xc7\x7a\xc5\xb6\xce\xfa\xfc\xdb\x41\xfd\x73\x79\x17\xfd\xfd\x52\xcf\x1b\xaa\xf3\x56\x6c\xf0\x6d\x31\x2f\x52\xbc\xa5\x2d\xa7\xc1\xd7\xad\x3d\x76\x0a\xbc\xfe\xfe\x6c\xe4\x76\xfe\x41\x0f\x7a\x9c\x79\x31\x6f\x79\xd0\x83\xba\xab\xc5\xc2\x2e\xaf\xe1\x79\xb4\xd5\x37\x1f\xab\xd1\x93\x59\x5d\x2f\x7a\x3a\xef\xf9\x76\xfc\x86\x13\x3b\x3c\x7c\xcb\xc3\x1d\x1e\x3e\x98\xc9\x4a\x0f\xed\x93\xbe\xf9\xbd\xc3\x8c\x64\xa0\x5e\xf4\xac\x87\x4f\x21\xeb\x51\x96\x8b\x7e\x3d\x09\xf8\x86\x6e\x9c\x7e\x79\x42\xf8\xe2\xa7\x5f\x71\x7f\x4b\x21\x8e\x03\xf6\x5b\xf5\xe1\x18\xd6\x1f\xd5\xa1\x37\xbd\x46\xfc\xf4\x95\xe5\x4e\xe6\xcb\x67\x34\xa2\xb1\xb8\x57\xcb\x56\x1f\xc0\x25\x6d\xda\xed\x52\x2d\x97\x76\x34\x5d\x3e\x3c\x99\xc5\x62\xa9\x46\xd3\x87\xa7\x21\xd3\x64\x75\xfc\xe6\x61\x3f\x19\xdb\xd7\x64\xeb\x54\x6f\xb8\x9a\x9f\x51\xed\x5b\x35\x2c\x77\x53\xfb\xfd\x4e\x39\x4e\x4b\x9c\x95\xfb\xda\xed\x3f\xd7\xf8\x46\xef\x9c\x66\x36\x26\xf3\xcb\x4e\xfd\xfb\x01\x89\xff\x79\x00\xff\x78\xf0\xf2\xd1\x87\xe3\x3f\xff\x7f\xff\x79\x60\x94\x62\xfa\x8f\xab\x7d\x75\x1e\x86\xdd\xdc\x65\xe7\xb3\x3c\xe7\x3e\xf7\x0d\x34\x8e\x13\x6d\x4f\x56\x77\xb5\x41\x4f\xb1\xe3\x27\x9a\xb2\x58\xe9\x53\x23\xe6\x76\xf1\x0d\x01\xe1\xab\x23\xc6\xb9\x55\xcf\xb6\xf4\xba\x3d\x67\x31\xef\xad\x6d\x3a\x9b\xac\xfb\x00\x33\x1e\x1b\x36\x5b\xd8\xf7\x18\xe6\x75\x3b\xcf\x62\xf8\x5b\xdb\xf9\x52\xc4\xc7\xdb\xf9\x8a\xe4\x2e\x9e\xdb\xf1\xda\x0e\x27\x53\xfb\x1d\x4a\x7b\xa9\xfa\x13\x44\x74\x36\xdd\xf1\x09\x08\xbe\xce\xd7\xfe\xfd\x23\xfd\xf0\xa2\x45\xdf\x03\x62\xf6\x06\xd1\x7c\x0b\xc2\xd7\x79\xe0\x6f\x4a\xbc\x04\xe2\x9b\xda\xde\x04\xe3\x65\x8e\xe8\x66\x30\x5e\x26\xc5\xff\xfe\x62\xb7\xdf\x06\x6f\x57\x6c\xea\x3d\xeb\x3e\x9b\xe1\xba\xb5\x55\x67\x4b\x00\xb7\x84\x5d\x07\xc6\x7f\xc7\x53\xf7\x16\x8b\x95\x9d\x7f\xbc\x28\x7f\x62\xae\x46\xa7\xaf\x60\x59\x0e\x7b\xa3\xde\x1b\x23\x8a\x77\x63\xc1\xbf\x32\xaa\x3a\xd3\xce\xb3\x55\x95\x9b\xa2\xa8\xf3\xdf\x07\x15\x47\x9d\x95\x79\x7b\xfc\xf3\x5e\xa9\xc7\x4e\xbb\x28\xe9\xd4\x93\xff\x73\xdd\xf0\xbe\x99\xee\xbd\x59\xc9\xcf\xd7\xd0\x8e\x6a\xbe\xdc\x7e\xe3\x8a\x3f\x10\x6f\x5c\x2a\xe0\xf6\xb0\x4a\xf9\xe6\x53\xbf\xab\xc6\x1d\x7b\x35\xb0\x3f\x07\xe7\x7c\xd9\xee\x76\x5f\xfd\x32\x77\x7e\x3b\x44\x3f\x19\x1f\x3d\x31\xbb\x6b\xe0\x2c\xb7\x73\xbb\x58\x0d\xaf\x7a\xf7\xe5\x76\x64\xbf\x1b\xcf\xbd\x2c\xb1\xde\x8e\xe7\xc5\xba\xc5\xad\xa0\x5e\xac\x38\xff\xfd\x43\xc0\x9d\x7e\xf4\x1e\x7a\xa7\x2c\xd7\x80\xf8\x98\xda\x5d\xac\x70\xdf\x02\x54\xf4\x29\xb2\x76\x93\xf9\x77\x26\x43\x1f\xa2\x5e\xd5\xfb\x0e\x66\xef\x17\xb9\xf8\xe1\xf2\x52\xf9\x4a\xac\x5c\x7d\x48\xe5\xab\x85\x97\x49\xc5\xba\x97\xad\xc5\x2a\x0f\x7f\xff\x92\x08\x97\x8b\xad\x64\x2a\x8b\x22\x29\x1c\xcf\x97\x48\xb8\x99\x8d\xe7\xf2\xd1\x6c\x3c\x5d\xcb\x17\x6b\x28\xd9\xc2\xed\x5c\xbc\x92\x2c\xe4\x6b\x91\x58\xc1\xab\x34\x78\x29\xc2\x0b\x4d\x94\xfc\xf2\xfb\x83\x94\x52\x0a\x29\x91\x3c\x26\x0e\xc0\xef\x0f\xf8\xf7\x07\xf0\xfb\x11\xe5\x87\x2f\x5f\x7e\x7f\xf8\xe2\x95\x3c\xcf\xf3\xfe\xf3\x9f\x2f\x87\x07\xe8\xeb\xb3\x97\xbf\xff\xf8\xe3\xbb\x2d\x6c\x26\x4a\xe9\x46\x3d\xdb\x28\xb4\x92\xf1\x6c\xbd\x9a\x69\xd4\x69\x3c\x91\xf4\x70\x36\xdf\x6a\xa1\x74\x29\x93\xe3\x05\x2f\xed\xd5\x62\xa5\x78\x8d\x65\x8b\x91\x4a\x2c\x5e\x6f\x16\xf2\x5f\x7e\x7f\xa0\xa7\xa6\x89\xa7\xa6\x09\x2a\xa4\xc4\x84\x4a\x72\xd6\x8e\x2b\x6d\xc4\xb7\xb4\x31\x82\x70\x29\x8e\x92\xb5\x18\x45\x5e\xae\x59\x8b\xd7\x92\xd8\x6b\xa5\xbd\x66\x33\xd1\x6c\xd6\x51\x3d\xd9\x6c\xb5\xca\x2c\xd6\x6a\xc6\xaa\xc5\x4c\xb4\xd9\xae\x78\x0d\xc6\x9b\x05\x72\x42\x51\x4a\xc9\xbe\x69\x22\x7b\x1f\x46\x72\x53\x13\x9b\x99\x04\x2b\xe7\x49\x21\x9f\x8a\x15\x23\xb9\x7c\x3c\xcc\x31\xf2\x08\x66\x6d\x5a\xcc\x47\x2b\xe5\x6c\xa2\x91\xe1\x89\x70\x36\x92\x2b\x65\x53\xf1\x02\xa9\xf0\x58\xab\x51\xaf\xbd\x34\x51\x4a\x46\xcf\x5a\xc9\x10\xff\xfd\x01\xd3\x77\x9a\x49\x0f\x7f\x21\x13\x5f\xfb\x41\x8a\xe7\xc6\xbe\xa1\xe5\x97\xb3\x83\x9f\x30\x98\xb7\xe7\xfc\x7e\xd4\x6a\xbe\x9d\xf7\x7b\x46\x94\x61\x23\x85\xa3\x98\x59\xcb\x84\x81\x1a\x71\x4d\xb5\x90\x0e\x61\xe5\x28\x86\x50\x73\xca\xa4\x42\xc4\x29\x07\x09\xc0\xca\x00\x4d\x91\x66\x18\x6b\xc0\xb5\x95\xf2\x09\x30\xf0\xc9\xf4\x54\x06\xe5\x48\x21\x8b\x91\x73\x88\x08\x05\xb8\x06\x96\x03\x67\xa0\x63\x06\x43\xe1\x43\xa7\x7c\x83\x80\x66\xbe\x0f\x84\x8f\xb1\xa1\x9c\x53\x44\xa5\x60\x02\x22\xaa\x20\xfb\xf2\xfb\x03\x3c\xf4\xd4\x17\xef\x97\x4d\xe1\x66\xa6\x47\x76\xa1\x5d\x25\x13\xe6\xd1\x71\x54\x26\x11\xd8\xf6\xc3\x8f\x0b\xd0\x59\x2e\x36\xa9\xcd\x1e\x36\x4d\xa5\xd1\x52\xe1\xb4\x8a\x77\x9e\xf2\xc7\xf2\x24\xab\xf6\x53\x54\xfa\x6e\xc9\x6d\xaf\x09\xc9\x21\x5b\x78\xf0\x13\x04\x09\x34\x7d\xb9\xb0\xfa\x37\x14\xd5\x40\xdf\x17\x50\x41\xa0\x7d\xe4\x0c\x33\x06\x62\x45\x08\x21\x56\x52\x84\x1c\x66\x50\x03\xab\x91\xa0\x50\x3a\x68\x84\xc4\xbe\xd0\x5a\x73\x8a\x09\x63\xd6\xfa\xc0\x3e\x29\x59\x10\xca\x8e\x89\x4f\x15\x51\xc6\x1a\x22\x8c\xa2\xc4\x11\x2d\x10\xc5\xc2\x02\x26\x20\xc6\x56\x11\x9f\x11\xc9\x15\xb3\xcc\x42\x24\x99\x75\xee\xa9\xa9\xd2\x29\xc4\x99\x25\x4f\xca\x8e\x7e\x7f\x80\x94\x4a\xca\xa5\x80\x5f\x35\x36\x82\x8a\xed\x3e\xcc\xaf\xe8\x04\xe8\x34\x6f\x90\xf1\xae\xb0\xae\x6d\x13\xb8\x3e\x9d\x0c\x1e\xd7\x71\xaf\xb0\x8c\xc0\x0c\xca\xf1\x30\x67\xed\xbe\xc9\x6e\xbc\xe6\x22\x8b\x6c\xaa\x4b\x32\x8f\xb3\x35\xcf\x75\x4b\xbd\x24\x6f\xf0\x6c\x5b\xd5\x66\x32\x95\x79\x0c\x4d\x69\x54\x0b\x9d\x3b\x20\xdc\x2c\xd6\x73\x93\x83\x46\xa5\x9e\xff\x1c\x9d\xdc\xe2\xe5\xdf\x1b\xaf\x58\x3a\xe9\x0e\x6d\x6d\x12\xbc\xbb\xf7\x93\xfc\xb1\xda\x4a\x83\x5e\x82\x54\x06\x43\x6d\x16\x14\x23\xde\x99\xd1\x55\x31\x1b\xdb\xd6\x43\x78\x97\x08\x01\xb0\x55\x95\x25\xaf\xf5\x55\xbd\x58\x21\xe9\x6a\xbf\xa3\xc2\xb9\xc7\x69\xae\x9d\xb6\x23\xba\x8a\x4d\xf5\x3a\x54\x2e\x4c\x1f\x7b\x66\x75\xd4\xe1\xd4\x15\x8d\x8e\x2d\xae\x69\xc5\x57\x8d\x8e\x82\xf4\xfd\x54\xef\x4e\xe9\x83\x1a\x6d\x21\xb5\x90\x33\x85\x19\xc3\x50\x13\x1f\x02\xc6\xad\x26\x06\x3a\x5f\x09\x83\x10\x07\xcc\xc7\xc2\x1a\xa0\x04\xc1\x9c\x1b\x42\x35\x87\x50\x72\x20\x39\xe6\xc0\xd2\x27\x6d\x0c\xc2\x2a\x10\x87\x8c\x23\xf3\xd4\x0a\x22\x14\x16\xdc\x39\xe8\x53\xec\x3b\xe2\x80\x46\x0a\x58\x8e\xb9\x33\x4f\xd5\x3a\xa8\xa9\xe4\x4a\x41\x66\xb1\xf2\x25\xb4\x46\x33\xf3\xc4\xff\xf8\x4c\xa3\xe1\x57\x8d\x96\xc9\x5c\x47\xc5\xb2\x9b\x35\x5c\x82\xea\x34\x56\x2e\x0c\x2b\xd9\x7d\x4b\x47\xe7\x99\x78\xc2\x25\x5b\x03\xd1\xe3\x4b\x98\x4f\xe8\xd5\xa6\x30\xcf\xf3\x5e\xca\xdb\xf4\xfa\xa4\x32\x28\x7b\xc3\xa1\x7a\x6c\xa7\x5b\x05\x90\x2a\x35\xc6\x3e\x1f\xf8\x93\xf6\x18\x36\x74\xb9\x10\x4d\x37\x8f\xca\x7a\xd0\xe8\xcd\x0b\xe2\xdd\x79\x3d\x9e\x65\xe5\xbe\x97\x2b\x54\xcc\xe3\xb6\xad\xab\x8f\x85\x7c\xa7\xb9\x54\x75\x88\x63\xa8\x11\xad\x4f\x0b\x99\x08\x4a\xb5\x51\xb6\x35\x8e\x8f\xb3\x8d\xd6\xb6\x92\x29\x24\x43\xdb\x6d\x75\x0f\x44\x36\xd3\xa1\x7b\x27\xfd\xb4\xdb\x2e\xdb\x76\x16\x5f\x15\x16\x03\x8b\x10\x3c\x94\x9c\xbb\xa2\xb1\x19\x71\xad\xd7\xff\x4f\xd0\x58\x4a\xad\xb6\x94\x1b\xa4\x2c\x22\x8e\x69\x5f\x6a\x86\x99\xc3\x96\x31\x1f\x49\xe9\xb8\x90\x4a\x3a\x6e\x04\xa4\xd2\x11\x66\x24\x56\x58\x00\x0e\xad\xa6\x5c\x10\xf7\xa4\x6d\x41\x68\xbd\xcf\x9d\x20\xda\xfa\x80\x68\x80\xa1\xf4\x9d\x05\x0c\x4a\xad\x20\xe7\x1c\x18\xee\x23\x81\x28\x84\x88\x23\xdf\x58\x04\x2d\x21\x88\x33\xc0\x94\xe0\x0c\x3a\x1f\x6a\xf5\xe5\x30\xfa\x7c\xd6\x58\xf4\x55\x63\x1f\xe3\x36\x8e\x26\xa8\xb5\x5d\xe6\x62\x09\x37\xaf\x96\x43\x99\x7e\x25\xbd\xd1\xd1\xfe\x32\x32\x29\x61\x57\x6b\xe0\x58\xdb\x4f\xfb\x38\x3a\x6c\xc0\xce\x7e\xb3\x57\xc9\xe6\xb4\xa5\xca\xce\xcd\x6d\x6f\xb8\x0a\xc1\x01\xf5\x4a\xc9\x59\x22\x57\x47\xb5\x6a\x94\xd8\x4d\x4a\x4e\xd6\x47\xf7\xf6\xa4\xb1\xd3\x33\xc4\x65\x91\x13\x5f\x38\xb8\x75\x86\x6c\x9a\x28\xaa\x16\x7d\xac\x70\xbb\x39\xee\xcc\xba\x4e\xa5\xd1\xce\xe3\x36\x56\xc0\xd9\xe5\x22\x94\x7c\x8c\xad\x17\xe1\xac\xb7\x1d\x17\x49\x22\xa1\x27\x4d\xb3\x81\x22\x13\xa9\x95\xd3\xbb\xbd\x4d\xd9\x72\xc4\x74\xd4\xc4\x74\x43\xe1\xd5\xc1\xc7\x97\xae\x68\x6c\x39\x77\xad\xd7\xff\x0f\xd0\x58\x01\xac\xd0\x4e\x2a\x08\x7d\xac\xa0\xe4\x10\x6a\xa2\x94\xe0\x88\x23\x07\x95\xe1\xcc\xfa\x8e\x59\xae\x8c\x06\x90\x50\x27\xa1\x33\x14\x4a\x4e\x99\x8f\x09\x34\xe2\xe0\x1f\x83\xd0\x7a\x88\x31\x27\xd8\x29\xe8\x63\xdf\x51\x65\x30\xd6\x8e\x71\x07\x30\xe6\x02\x6b\x1f\x42\x2a\x38\x80\x0a\x3e\x0d\x78\x29\x90\x40\x29\x2e\x2c\xe2\xd8\x31\xae\x94\xf5\x9f\xda\x41\xcf\x34\x16\x3f\x6b\x6c\xdd\xae\x87\xae\x32\xef\x55\xd1\x3a\xbd\xec\xeb\x3d\x1d\x6d\xa6\x63\xdc\x53\x63\x8c\xc2\x0d\x57\x5e\x0e\x58\xc1\xf3\xed\xb2\xd9\x2d\x76\x86\xad\x66\x68\xb0\x5f\xeb\xc8\xc6\x76\x78\x6c\x07\x58\xad\xb2\x29\x31\x9f\xf9\xa9\xfe\x7c\xe2\xf2\x9d\x5d\x92\xac\x2a\x93\x66\x3a\xef\x1f\x10\x3e\x68\xec\x99\x12\xa5\x49\x28\x31\xa7\x94\xb4\xeb\xc9\xdc\xaa\x9f\x7f\x7c\xf4\x3c\xd3\x9d\xaf\x69\x24\x12\x2d\xcd\xab\xf9\xb8\xdd\x2d\xfb\xbd\xc1\xc8\x0e\xb6\xa0\x9a\x07\x45\x96\x8c\xee\xe1\xbc\x5a\x08\xb5\x43\xde\xde\x46\xd7\xe1\x78\xcb\x0f\x4f\x4c\x12\xd5\xd2\x91\x99\x2d\xa4\xf7\x72\x3c\x5b\xed\x0f\x1a\x5b\x7b\xad\xb1\xe1\xd8\xe6\xa2\xc3\xbb\xde\xff\x07\x34\xf6\x8d\x28\xef\xca\x06\x81\x1f\x0d\xef\x4e\x9b\x04\x82\x88\x94\xa1\x78\x8e\xa2\x0e\x41\xf0\xf1\x73\xbd\x5e\x2d\x9f\x24\x59\xea\x4e\xb3\xcc\x62\x7c\x12\xcd\x82\x6c\xe9\x71\xd3\xaa\x44\xe4\xbe\xb9\x6e\xd6\xab\x78\xdb\x2b\xf6\x5a\xab\x8a\x86\xd1\xf5\xa8\x94\xb5\xe2\xe9\xf7\x04\x3e\x47\x7a\xbf\x3f\x3c\x0d\x78\xc9\x53\xa4\xf6\x2f\x44\xb0\x04\x67\x7f\xb0\x38\xc6\xdb\x17\x86\x1d\xa0\x60\x18\x07\x2b\x18\xbe\x90\x0b\xff\xfe\x80\xff\x85\xbf\x4d\xe4\xee\x52\x05\xdc\x5b\x2f\x42\x81\x43\x48\x8d\x9f\xfa\xea\x42\x28\x0c\xe9\xbd\xa5\x82\xc1\x4a\x05\xc1\x85\x58\x4f\xfd\x05\xfe\x05\x2f\xa7\x22\xd8\xdd\x75\x30\x58\xb9\xc4\x85\x58\xe2\x20\x15\xba\x7b\xf7\xd0\x60\xc5\x60\x17\x62\xb0\x83\x18\xec\xdb\x44\xf9\xbd\xa5\x92\xc1\x4a\x85\x2e\xa4\x42\x4f\x52\xdd\xdf\x72\x50\xd0\xa6\x73\xe9\xbf\x21\x38\x38\x70\x20\x25\x38\xff\x1f\x24\x77\xb7\x1e\x18\xb0\xf9\xc8\x4b\xd1\x24\x3c\xba\x05\x29\x24\x78\xf9\x2b\xee\xee\xc4\x03\xee\x33\x79\xa1\x79\xf2\x20\xd5\x45\x02\x77\x57\x45\x14\xb0\x41\x11\x74\x26\x16\xfd\xfd\x01\x1d\x07\x12\x58\x00\x49\x5f\xfe\x0a\x74\x6f\xb9\x48\xb0\x62\xf1\x8b\xde\xe2\x87\xde\x22\x48\x50\xfe\xf2\x97\xc8\xbb\x1b\x57\xc0\x62\x89\x4b\xe3\x12\x47\xe3\x42\x98\x50\xc6\x25\x38\x7d\x10\xf8\xee\x9c\x1b\xb4\x47\xbc\x50\xc3\x03\x5b\x89\x8b\x21\xd2\xdd\xc9\x0a\xb2\x80\x39\xf8\xb2\xbb\xd8\xb1\xbb\x18\x96\x98\x10\xc4\x10\x92\x14\x08\x28\xc8\xdd\xbd\x46\xd0\x63\xbf\x57\xfc\x75\x10\x4c\x82\x6f\xff\x63\xf0\xee\x82\x05\x6c\x60\xf2\x42\x0f\xc9\x71\xd8\x04\x04\x93\x94\x51\x04\x39\x96\x10\x83\xbb\xf7\x17\xbc\xdb\x58\xfd\xd4\x5d\xa7\xd1\xfa\x7d\xfb\x86\x07\x6c\x4d\x17\x7d\x83\x4f\xc6\x04\x91\x04\x18\x21\x2a\x00\x23\x14\xde\x7f\x48\x0b\x03\xa6\x60\x0c\xce\x96\xc1\xbf\xf6\x94\x7c\x92\xef\xf0\x09\x1d\x02\x90\x67\x01\x01\xe5\x08\x23\x40\xef\xce\xc8\x08\x04\x3c\x74\xbf\x54\xc2\xe3\x50\x83\x70\x06\x25\x78\xf9\xcb\xee\x6e\x5c\x01\x3b\x79\x7a\x31\xd4\xa0\x87\x01\xd4\x45\x10\x0c\xef\xee\x09\x61\xc0\xdd\x05\x2f\xc4\x82\x5f\x77\x03\xdc\x53\x86\x80\x3d\x06\xbd\x54\x39\x7a\x74\x19\x92\x01\x2e\x08\x86\x98\x23\x4a\x24\x80\x77\x77\x19\x28\xe0\xe1\xd2\x85\x27\x84\x5f\xf7\xd4\xdc\x53\x84\x80\xe3\x44\x08\x2e\x84\xa0\xa7\x08\x58\x00\x2c\x11\xa4\x4c\x30\xc4\x09\x05\xf7\x1f\x1c\xc1\x80\x67\x5e\xf8\xa5\xd6\xf1\xa3\xd6\x11\x20\x08\x05\x1c\x10\x84\x28\xa6\x08\xde\x3f\x02\x0e\x58\x30\x71\x39\x38\x3a\x05\x1f\x50\xd2\xb3\x3f\xf0\xee\x51\x55\xc0\x5e\x82\x5c\x78\x3a\x72\x70\xe0\xf7\x37\xa8\x80\x67\x99\xe9\x65\x24\x7f\x1c\xba\x4a\x84\x01\x67\xcf\x7f\x7f\x82\xd6\x05\xcc\xaf\xfc\x72\xd8\x77\x94\x0b\x8b\x6f\x92\xbc\x7b\x7f\xe1\x80\x09\x16\x5f\x3a\xf1\x83\x5c\xf8\x27\xcc\x34\xe3\x80\xa3\x0b\x74\x29\xc9\x71\x60\x47\xbf\xfd\xef\x65\x4e\xe2\x8d\x25\xbb\xd7\x47\x38\x3f\xb1\xcb\xf3\xcd\x33\x86\x9f\x2b\xf3\xf2\x98\xe0\x27\x4a\x7b\xe3\x90\xdf\x27\x4a\x7c\xe3\x38\xde\x8f\xae\x7b\x9e\x1d\xc9\x3b\xdb\x6c\x5d\x0a\xe7\xd2\xad\x4a\x24\xc6\x4a\xb4\x9d\x4c\xd6\x23\xf5\x62\xa2\x91\xa9\xd0\x64\x23\x17\x4f\x72\x82\xa3\x24\x16\x8d\xb3\x5c\xb5\x15\xae\x86\x5b\xc9\x4a\x91\x67\x93\x85\x70\x2c\x75\x3e\x0f\x9b\xf0\x1a\xe9\x6d\xaa\x5c\x2c\xf1\x01\x65\xbd\x99\x80\xc3\x0a\xb3\xfb\xc8\x38\xb4\x6f\x3d\xc6\x12\xcd\x7d\x9a\x44\x73\x85\xe8\xce\xc9\x36\xf6\x9e\xd3\x61\x73\x52\xe4\xf0\xb1\xe4\x79\x5e\xac\x97\x07\x6b\x2f\x6c\x37\xeb\x36\xe9\x25\x3b\x73\x36\x0b\x2d\x76\xf1\x48\xca\x2d\xf5\x62\x39\x9c\x56\xe6\xa0\x33\xe7\x8f\xe3\x41\x7e\xbd\x5d\x1c\x96\xbb\xc3\xbe\xac\xed\x7a\x87\xdf\x77\x9e\xff\x84\x0f\x85\x6e\x9e\xff\x1d\xf5\x3c\x19\x39\x5f\x2a\xaf\x37\x06\x89\xc7\x6c\xb9\x9b\xad\x54\x6a\x23\x48\xf7\xe4\x11\x15\x63\x1e\x5e\x7a\x8b\x54\xa6\x15\x37\xf5\x02\x70\x6a\xd6\x9d\x26\x3a\xc5\xc9\xa1\xb8\x59\x89\xac\x69\xad\xdb\x6b\xe5\xc6\xa9\xe2\x20\xcb\x43\xd5\x39\x8f\xb7\x5b\x9a\x56\xc6\x20\x0d\x56\xd1\x7c\x27\x39\xdb\x0f\x63\xa9\xc4\xe8\x31\xdd\x54\x80\xd0\x5e\x6f\xdc\x76\x15\x9a\x70\xb1\xea\xc2\x4b\x98\x52\x3e\xd2\x9e\xc6\xab\xa9\x39\x4d\x17\x2a\xcd\x74\xa6\x53\xe8\xe4\x22\x4f\xc6\x79\xe1\x04\x02\xee\x1a\xfc\xa9\xae\xc9\x7d\xdb\x35\xd1\xc8\x02\xaf\x52\x9d\x68\x24\x53\xec\x66\xca\xb1\x48\xa3\x3e\xa7\x83\x61\x87\x97\xba\x61\x65\xf6\xab\xf2\xae\x3b\x72\xf5\xf6\x32\x46\x72\x43\xbf\xf3\xdc\x35\x7d\xef\xdb\xf4\xc3\xd0\xe7\x74\xc4\xb5\x85\x88\xe7\x30\x74\xf4\x31\x1d\x2e\x34\xb2\x62\x12\xc2\x60\xdb\xa4\x19\xb1\x66\x53\xd6\xf1\xeb\x54\x47\x6a\x2e\x6a\xf6\x05\x9c\x29\x28\xba\x93\x1b\x14\x2a\xb8\x24\x4e\xd2\xc1\x78\x91\x9a\x64\x6b\x6d\xbd\x41\xc3\xe8\xb6\x40\xe4\x44\x0d\x63\x83\xbd\xd7\xb9\x3b\xf4\xe4\x53\xd0\x97\x2e\xa0\x0f\xeb\x46\xb4\x18\xcd\x4f\x8c\x1d\x76\xa7\x71\xf9\xb8\x64\x99\x06\x0f\x35\xaa\x83\xb0\x67\x27\xad\x6d\xb3\x5d\xce\x15\xbb\xdc\xeb\xa3\xde\xe3\x8b\x55\x5c\x6e\x6b\xfe\x61\xe8\xe7\x7c\x59\xd0\x21\x38\x1e\xcc\x22\xe5\x16\xa5\xfb\x6e\x37\xb3\xc6\x95\xb6\xdc\xa6\xbb\xa1\xa4\x09\x19\x93\x2c\x00\x8f\x26\x2a\xe1\xfd\xb0\x10\x5e\xb4\x87\x7e\x11\xe4\x8a\x9b\x7a\xd6\xd4\x87\xcb\x96\x28\x2d\x66\x56\x0c\x27\x64\x13\x8f\xd8\x71\x2f\x9c\xda\xaf\x46\xf9\x9c\x88\x6e\xee\x0e\x3d\xfd\x14\xf4\xb5\x4b\xad\x8f\xd4\xbb\xee\xb1\x5a\x90\x8b\x6c\x98\x45\x17\xd5\x6c\x75\x5a\xce\x86\xa3\xd3\xfd\x74\xd3\x2b\xac\xba\x02\x45\x53\xae\x47\x33\x5d\x7f\x00\x5f\xa0\x1f\x7e\x5a\xeb\x23\x83\xa2\x5c\x4f\x1f\x13\x89\x70\x2f\xe1\x29\x59\x43\x6a\x3b\xcb\xed\x13\x4b\x99\xc3\xdb\x7d\x61\x54\xc9\xe6\x33\xe3\x47\xbe\x1b\xd2\x42\x6c\xc8\x80\x37\xa9\x4d\x46\x76\x12\x49\xe7\x1e\x07\x61\x13\x9e\x96\xb6\x36\x4d\xa2\xa1\xc7\xfe\x26\x6a\x49\x61\x93\x0b\x75\x50\x3e\x19\x29\x1d\xa1\x7f\x9b\x5d\xae\x9d\x74\xbe\x81\x5d\xbe\x9e\x76\x7e\xee\x4c\x4a\x99\x04\xcc\x09\x4d\x18\x44\x06\x11\x49\xa4\xa6\x96\x63\x8b\xad\x11\x0e\x02\x60\xac\x01\xc8\x47\x40\x31\x40\x39\xa5\x58\x13\x6e\x94\x52\x50\x11\x26\x80\x53\xe7\x9d\x7a\x30\x8d\xd8\xe1\x63\x2b\xdc\x1a\xc7\xba\x31\x19\x5d\x55\xc7\xb3\xcc\x7c\xdf\xa8\x67\xa7\x3c\x97\x71\xa1\x7c\x9f\x94\xda\x2e\x37\xee\xe4\x36\xa4\x98\x0e\xc1\xf1\x71\x7b\xd6\x7b\xc2\x5f\x3f\xd9\xfc\xc3\xc2\xbf\x9c\x6e\x7e\xd9\x85\x7f\xba\x4e\xf8\x78\x57\xd9\xc3\xab\x74\xd8\xeb\x06\x5e\xd9\xc4\x95\x92\xc6\x76\xb9\x99\xcc\x07\x53\xb5\x58\x4c\xbb\x73\xb5\xb0\x57\x4a\xaa\xda\xc5\xf2\xa1\x12\x8d\x3f\xe4\x8f\x99\x1f\xfe\x78\xa8\xd8\xe9\xd2\x8e\xb4\x9d\x3f\x20\x00\xe9\x47\x2a\x72\x93\xb9\x6f\x17\xfe\x74\x32\x1e\xdb\xed\x72\xa8\x56\x63\xbf\x7b\x59\xd1\xe1\x2e\xb0\x8f\x14\x76\xdc\x66\x78\x3a\x6b\xb7\xb8\x2e\xff\xff\x7d\x38\x9a\xf7\xb7\x65\x6f\x64\xff\xf6\xef\x07\x70\x3c\xa9\xf7\xb7\xd3\xe5\xca\x7f\xfb\xf7\xc3\xf1\xf9\xe1\xcb\xae\x5a\xfc\xed\xdf\xc7\x9b\xc8\x0e\x5f\xfe\xef\x29\xb3\xb3\xf6\x63\x19\x47\x6a\xbb\xdc\x2e\x7a\xfb\x0f\x66\x9f\xdb\x85\x9d\xaf\xbf\x97\xf9\xb7\xff\xfd\x10\x14\x6a\xb1\x3c\x5c\xa1\x63\x4e\x57\x59\x5c\x81\xe2\xd3\xdb\x2f\x3f\xd0\x8e\x93\xb7\x55\x73\xbf\xdb\x5b\x9f\x1e\xbe\xd1\x25\x2f\x7d\x00\x4f\x80\x1c\xe0\x98\xff\xed\xdf\x0f\x7f\x5b\x43\xf8\x2f\xf8\x2f\xf0\xb7\xd3\x03\x7f\x35\x9f\xdb\xf1\x32\x7b\x10\xed\x6f\xff\x7e\xa0\xdf\x7e\x1f\x3e\xdc\x72\xf4\x84\xdb\xff\xff\x19\xc8\x17\x48\x9f\x73\x3e\x15\x8c\x7d\x40\xad\x52\xd0\xf9\x46\x61\x84\x08\xd6\x8c\x41\xec\x38\xb3\x52\x02\xc9\x19\x76\xc0\xf8\x1a\xfa\x54\x39\xe8\x04\xf5\x9d\x76\x9a\x11\x8a\x18\x40\x9a\x58\x8b\x4e\x2d\x7a\x2e\xf7\x49\x8b\xbf\xe9\xc0\xe7\x27\x07\xd9\x9f\x54\xee\x9b\x47\xff\x7b\xf1\xfb\xc5\x58\x4d\x9f\xda\x05\x7d\x89\xb0\xaf\x7c\xaa\x80\xc4\x04\x62\xc6\x14\xa5\x4e\x19\x89\x05\x24\x12\x2b\x6c\x05\xe2\xce\xfa\x56\x4a\x0a\x30\xd3\x8a\x1b\xed\x33\xe2\x0b\xe3\x13\x23\x7d\xff\x6f\xbf\x5d\xa9\xe1\x0d\x0c\xac\xc3\x50\x21\xa0\xb0\x14\xd6\x72\xec\x5b\x84\x10\xa7\x56\x09\xc8\x39\x17\x4c\x2b\x9f\x12\x46\x99\xc3\xd8\xf8\x3e\x71\xd8\x59\x9f\x01\x43\xa9\x31\x0e\x32\x6c\xe4\x8f\x63\x00\x7f\x7f\xfd\x6c\xb2\x5a\x4e\x57\xcb\x60\x65\x7f\x0f\x61\xf0\xc9\xf4\x23\x08\x7f\xba\xae\x3b\x69\xd9\x7f\x31\xf8\x2f\x06\xff\xc5\xe0\xbf\x18\xfc\x17\x83\xff\x62\xf0\x5f\x0c\xfe\x8b\xc1\x1d\x31\x38\x7c\xfa\xbf\x3e\x1e\xbc\x2c\xfc\xe9\xe1\x2e\xd1\x6b\xe9\x79\xa1\xe1\x38\xf9\xd7\x89\xf7\xfc\x4a\xac\x0a\x0a\xb4\x60\x27\xb3\x75\xbe\x5d\x5b\x8d\x17\x9b\x69\x48\xa0\x62\x37\x3c\x14\x3b\xeb\xed\xa3\x1d\x31\x0e\x35\xcc\xcb\xb1\xa5\xf8\xe1\x2f\xac\x4f\xc3\xeb\x1e\x68\x55\xc0\x60\x98\x5e\x5a\xff\xb1\xb8\xec\x6f\xbd\x3c\x2f\x65\x23\x91\x51\xb8\x59\xaf\x2e\x93\x68\x36\x51\xe5\x49\x94\x3d\xcf\x08\xa4\x7b\x9f\x9c\xa6\xb9\x65\x46\x21\xec\x0d\xbc\x02\xa0\x83\x7d\xaf\x9a\xaa\x14\xfd\xa9\xb4\xa9\x5d\xb4\xb6\x9b\xa3\x46\xbb\x55\x49\xc4\x0a\xfd\xbc\x6b\xac\x56\x5b\xd6\x1c\xce\xe7\x8f\xa1\xb6\x2d\xd8\xb5\x23\xb1\x6e\xdf\x9a\x55\x09\xcf\xd2\x35\xe6\x3d\xf2\x74\xa7\x98\x1b\x95\x96\xbd\xb9\x1b\x3e\x4e\xe2\x72\xb7\x6a\x1f\xe7\xad\x9f\xda\x13\x69\x7d\xf2\x00\x5a\xf8\x96\x69\xb0\x52\xda\x8b\x2e\x0b\xed\x1c\x19\xec\x62\x7d\x9c\x71\xcd\x5e\xae\x03\x73\x33\x39\x1c\x35\x62\xdd\x6e\x74\xb2\x6f\xc2\xf9\x7c\x61\x87\x54\xb1\xd0\x1a\x35\xfb\xe3\x39\x7e\x0c\xa7\x5a\x78\xac\x07\x79\xd6\xab\x17\x3a\xc5\xd5\xae\x15\xdd\xa7\x07\xd9\xd6\x0c\x53\x37\x0b\x3b\x7f\x3e\x2a\x2d\x0e\xcd\x71\x5e\x23\x26\xbb\x5e\x36\x56\x0f\xb9\x68\x33\xdb\x9c\x49\x3f\xdd\x59\x4e\x26\xa1\x6a\x93\x94\x61\x31\x5e\x7f\x9c\xd3\x56\xa6\xb6\xcf\x45\x56\xf1\x56\xac\xd1\x28\x8e\xcb\x51\x31\xad\xa1\x44\xce\x8e\x6d\x34\xd9\x4a\x0e\x57\x09\xb0\x7a\xac\x85\x74\xbb\x36\xdf\x37\x4b\x93\x79\xa2\x70\x9c\xab\xfb\x84\xbe\x75\x9e\xfb\x7f\xf3\xd9\x03\x7f\x87\x54\xff\x31\xfd\x2d\x45\xbd\x69\x34\xa4\x99\xeb\x76\x3b\xad\x6e\x27\xb1\xae\xe7\x47\x0b\xd5\xcf\x6d\xe7\xae\x9a\x17\xfe\x7e\x3a\xe8\xed\x2b\xd3\xd0\x4a\x4c\x6d\xb5\x9b\xb6\x4b\x2f\x13\xcf\xa4\xc7\x33\xaf\x57\x2d\x4e\xbd\x66\x49\xd5\x72\xcd\x9e\xf5\x42\xa1\x89\xf0\xf0\x2a\xba\x88\x16\x49\xbe\x5f\xde\x1c\x26\x7f\xc3\xb4\xce\x1e\xeb\x32\xb3\x4a\x17\x95\x18\xa1\xfc\xba\x38\xd2\x91\x91\xb3\xe9\x99\x73\xad\x78\x5b\x26\x50\x75\x42\xc2\x5b\x06\x6d\xec\x70\x3e\xfb\x70\x60\xd0\xcb\xb0\xbe\xed\xe1\xfe\x68\x92\x12\xd5\xc4\x30\x1a\xb2\x1d\x1f\xf3\x62\x73\x99\xcc\x64\xf6\x8d\xba\xd8\xd4\x7b\xed\xb0\x8a\xac\x68\x96\x1e\x56\x08\xda\x87\x1f\x1d\xd6\x71\xb2\x97\xd3\x9e\x2f\x1f\x73\xe7\xf8\xdc\xb2\x10\x79\xe8\xa4\x59\xd8\xa5\xce\xec\x35\xe2\x5d\x4b\x8a\x0f\xd6\x83\xcd\xa1\x7a\x34\x1d\x8a\x49\xaf\xdc\x97\xfb\x5a\x2a\x3e\x95\x5e\x2b\xa7\x32\x05\x0d\x0a\x9e\xce\x2d\x72\xfd\x74\xbe\x56\x4b\xda\x8d\xc2\xe9\x4d\x25\x09\xea\xa8\xad\x26\x43\xde\x19\x24\xe9\x6e\x34\xc7\x91\xfc\xa6\x00\x2d\x6d\x0a\x97\xe8\x0d\xb3\xed\xd1\xe3\x96\x16\xf9\x64\x50\x6c\x44\x8f\x93\xf3\xab\x09\x9e\x2c\x09\x9d\x45\x8a\xb1\xed\xb4\x14\xc2\x93\x64\xfe\x71\x0f\x79\x79\xd7\x5b\xc0\xa1\xcb\xc5\x5b\xa3\x52\xa3\x33\x5f\x55\x1e\xab\x07\x1b\x7c\x99\xd1\x8f\x5e\xea\xcb\xcb\xbf\xa3\x2f\x5f\xc6\xeb\x35\x70\x7a\x90\x6d\x90\x38\xb0\xdd\x02\xf3\x76\x32\x02\x8a\x8b\x44\xac\xb3\xf6\x21\x87\xb0\x26\x45\xab\x4f\x46\xd9\xc1\x48\x96\x38\x1d\x44\xf0\xfa\x58\xca\x4a\xed\x3a\xc7\x9e\xbc\x28\xff\x2c\x25\x9e\xfb\xaf\x94\x9a\x46\xd3\xa5\x92\xe7\x15\x66\xa9\x55\xac\x55\xe8\xce\x0c\xcf\x0a\xb0\xdf\x8e\x13\xc3\x58\xce\x86\xb9\xaa\x9a\x18\xc9\xce\xe3\x6c\x1f\xa3\x09\xa8\x3d\xa5\xb7\x7b\x5d\x5c\xe4\x13\xdb\xb2\x2b\x55\x27\x59\xbf\x3b\x8a\x2c\xd7\x8f\x0b\x4c\xe3\x28\x1a\x2f\x7b\xae\xfe\x38\xea\x4c\x0e\xb5\xcc\x67\x79\x96\xb5\x05\xd5\xe9\x6f\x73\xaa\x56\x94\x2c\xbc\x77\x0b\x69\x81\x3f\x99\xe7\xdb\xcd\x7d\xb8\x91\x1e\xc4\x27\x99\xe7\xfe\x3a\xae\x58\x74\xbe\xd5\x9c\xb3\xfe\x3e\xa6\x17\xfb\x0d\xd7\xeb\xf9\xd3\x83\x08\x5c\x85\x4d\x72\x52\x5d\x75\x72\xeb\xd2\x32\xca\xc3\xdd\x54\x16\xe7\xad\x34\xf5\xa2\x4b\xa4\x1e\xd3\x3d\x9a\x5e\xd7\x0a\x8f\x6d\x6f\xc9\x0f\x55\x65\xf5\xa3\x3d\xb6\x31\xf2\x54\x5f\x3c\x76\x0d\xa4\xf0\x73\xff\xc5\xbc\x76\x3f\x1a\xee\x87\x4b\xdb\x49\x81\x27\x12\xf9\x50\xac\xb1\x6a\xf7\x22\xa1\xb9\xaa\x8f\xd2\xd5\x78\x9e\x6f\x3d\x1c\x5d\x0f\x87\x73\x21\xb2\xe9\xb1\x1c\x66\x3b\x60\x3e\x1b\xd2\x96\x37\x4a\x32\xbd\x71\xce\x36\xe2\xdb\xc6\x6e\x87\x07\x95\x5a\x24\x56\x1f\xf3\x62\x78\x38\x36\xb5\xfc\xb1\x97\x6e\xb6\xb7\xcb\x23\xea\x41\xdb\x5b\xa4\xee\xad\x07\x67\xf8\xbf\xea\x95\x43\x3a\xb3\x37\x30\x0c\x53\xce\x15\xab\xc7\xab\xa3\x59\x2f\x9c\x29\x35\x7b\xbb\x0e\x6b\x75\xfa\xd5\xa2\x5f\x13\x63\x99\x1b\x1a\x4d\x13\x26\x63\xdb\x22\x5a\x1e\x34\x12\x5c\xf2\x59\x0c\x57\xc7\xa1\x46\x96\xae\xe2\xad\x71\x8b\xcd\x86\x66\x91\x92\x35\x0c\xbd\xca\x72\x39\x0e\xe5\xba\xe2\xd0\x3f\x9f\xb0\xb7\x57\x4e\x22\x60\x7b\x8b\xb0\x12\x37\x67\xf8\x87\xbf\x67\x6f\x49\xdb\xdb\x64\x0b\x85\x66\x63\xd3\xf6\x3c\xd8\xaf\x17\x9a\xf3\x36\xcb\x24\x16\x8b\x30\x9b\x6d\x8c\xab\xe1\xc7\x7c\xca\x5f\xad\xe9\x64\xe8\xa5\xf7\xa5\x9c\x9d\x15\x8b\x7c\x3c\x8b\x35\x16\xe9\xd0\x12\x54\xfc\x81\x06\xf1\x25\xec\xcd\x1a\x55\xc4\x6c\x6e\x63\x8b\x3e\x4e\xa4\xbd\xe3\xfd\x1a\x37\xdb\x5b\x24\x75\xd1\xde\x80\xed\xcd\xcb\x66\x4b\xcd\xa3\x53\x3a\xe2\xd3\xba\x06\xd2\x99\xbd\x85\xa7\x99\x4e\x79\x2f\xe6\xf1\x59\xdf\x8c\x67\xe1\xca\xb6\x90\xac\x87\xc5\xaa\x50\x2f\xf6\xf7\xd3\xbc\x37\x8b\x20\x0e\x50\x62\x5a\xdc\x54\xf3\xe9\xa8\xca\xd5\xd2\xca\x0b\xb1\x2e\x18\x56\x4c\xae\x23\xe3\xd5\x75\x27\xc7\x22\x73\xaf\x12\xde\xf8\x31\x35\xea\xc9\xe9\x6c\xb7\xd7\x9d\xe2\xa1\x96\xdb\xed\x2d\x71\xd9\xde\x97\x8f\x81\xd8\x5b\xa9\x1a\xcf\x89\x33\xfc\x93\xd7\x40\x3a\xb7\x37\xd5\x6e\x56\x43\x7a\x10\xdd\xe3\xf8\xac\x9a\xee\x36\x33\x4b\xbf\x62\xd7\xb4\xb3\x9f\xc7\xc0\x26\x8b\x12\x95\xf1\x62\xef\xf8\x92\xcc\xc2\x55\x7f\xdc\xc0\x45\xd2\xb5\x49\xeb\xc5\x53\x83\x4a\x7f\xd9\xd9\x83\x11\x4f\x75\x12\x55\xd8\x99\xd4\x87\x7a\x69\x3c\x5a\x5c\xb6\xf3\xf9\xe3\xf8\xf3\x76\x7b\x8b\xdf\x99\xdf\xc2\x7b\xfb\x68\x3a\x5e\x5c\xda\x58\x3a\x36\x9e\xd0\xf1\x55\x90\xce\xec\x2d\x9c\x6a\x9b\x7a\xcb\xdf\x59\x43\xeb\xae\x45\xf7\xd9\xd8\x66\xed\x36\x8f\x8e\x2b\x99\x42\xc3\xce\x24\x36\xce\x47\x3a\xd3\x71\x6d\x36\x55\x23\x50\xa4\xde\x36\x95\x05\xa1\x09\x06\xbd\x0d\x1f\x14\x26\xd1\x62\xb9\x57\x1a\x8c\x59\xb8\x0e\x1e\x33\x0a\x0f\xf2\xe9\x59\x85\x6f\x3a\x47\xd3\xb9\x9d\xdf\xc8\x45\x7b\x83\xb6\xb7\x8d\xf6\x4b\x67\xf6\x16\x9e\x5c\x03\xe9\xdc\xde\x16\x2e\x35\xc3\x79\xaf\x5a\x4d\xb7\x85\x97\x0d\xb7\x43\xbc\x31\xec\x36\x7d\x41\xda\x1b\x6f\x9e\xa8\x21\x04\x16\xf3\x4e\x72\xb0\x6a\x3b\xd7\x6d\x86\x4b\x1d\x95\x6f\xd9\xc9\xa4\x97\x8d\xca\x49\x01\x6d\x27\xbd\x49\x6c\xd0\x9f\xb7\x97\x8f\xe5\x9e\x9b\xcc\x52\x5b\x95\x4e\xd8\xda\xd1\xf5\xde\x6e\x6f\x97\x4e\x22\x68\x7b\xf3\xcc\xbe\x51\x3b\xfe\xb2\xe6\x7d\x84\xdf\xd2\xe3\xf9\xb2\x99\xd8\xf5\x07\xb3\xa9\x97\xf6\xe2\x2e\xda\x02\xe9\x5d\xba\xdf\x74\x15\x19\xda\x36\xb3\xd9\xa4\x59\xe1\x66\x15\x81\xd4\x76\x9a\x8e\x84\x4b\x28\x03\x5c\xb7\x35\xae\xf7\x16\x60\x39\xd6\xca\x8f\xc8\xd0\xba\xea\x8f\xb2\xe3\xc6\x36\xd3\x81\x93\x44\xa4\x2c\x57\x8b\x63\xa5\xb7\xdb\xdb\x2b\x27\x11\xb0\xbd\xc5\x72\x85\x14\x38\x15\xf2\xf4\xe7\xfa\x35\x22\x67\xf6\x96\x6b\x61\xde\xc9\xc6\x79\x06\x08\x1d\x5a\x55\xeb\x8d\x34\x4f\xc8\x6c\x26\xd3\x59\x8d\x54\x5a\x0f\x42\x90\x25\x08\xe3\xb6\xd0\xec\x24\xfb\x8d\x6a\x2e\xe3\x1c\xa8\x9b\x49\x05\x8a\xc1\x34\x5e\x1d\xb6\xf3\xfd\x75\xde\x16\x71\x2b\x37\x1e\xcd\xec\xbe\xd8\x23\xf1\xc9\x68\xbf\x39\xaa\xc2\xed\xfc\x76\xd9\xde\xa0\xed\xed\x45\x93\x8e\xf6\x76\x15\xa4\xf3\xf1\xa4\xea\xc7\x23\x7b\x9b\xa5\x93\xa7\x10\x8c\x79\x89\x72\xa1\x15\x2d\xa3\x49\x79\x0a\x8a\xe3\x7e\x2d\x55\x2f\x77\xb6\xf5\x68\x7d\x92\xc9\x64\x47\x99\xce\x62\x3b\x09\xcd\xb2\xa3\x6e\x7a\x3c\xe6\xdd\x7d\xb9\x2e\xfb\xad\x8d\xf7\xa8\xc6\x71\x00\x52\xb4\x6f\x43\x9e\xeb\xfa\xc5\x7d\xea\x18\x7f\xdd\x6e\x6f\xd5\xcb\xf6\xbe\x7c\x0c\xc4\xde\xb2\x58\xb6\x1e\x8f\xbf\x3c\xf8\xa3\xfd\x55\x94\xce\xec\xad\x59\xeb\x6a\x5a\xaa\x7a\x85\xc7\x75\x9d\x0e\xaa\xb1\xd2\xac\x30\x95\xbb\x1e\x59\x44\xed\xbc\x5f\xa3\xeb\x54\x95\xd6\x93\x38\xd7\x2b\x24\xb0\x80\xfb\xd4\x74\x38\x52\x2e\xdd\xcf\xe6\x93\x15\x80\xec\x78\x30\x19\x17\x92\xcb\x64\x23\xb5\x9e\xed\xc7\xf5\x52\x3f\x39\x2b\x61\x21\x3f\x1b\xbf\x1d\xc7\xa3\x67\x29\x68\x7e\x5b\x6f\xfa\xf3\x73\xfc\x2f\xaf\xf5\x39\xa4\x33\x7b\x4b\xaf\x13\xfd\x8a\x71\xb1\x64\x75\xb9\x4e\xb7\x1c\x5b\x83\x5d\xad\x1e\xaa\x78\xb4\x36\x9b\x34\xfa\xbe\x68\xa5\x1b\xeb\x7d\x2b\x37\x56\xe5\xa1\x68\xb6\xbc\x44\xc2\x2b\x36\x40\x0f\x37\xd3\x69\x1a\x2b\xe6\xb6\x7e\x12\x8c\x1b\xe9\xe9\x64\x37\x9b\x6e\x44\x23\xbc\xac\xe7\xf3\x99\xdd\xe6\x38\xbf\x71\xb3\xbd\x79\x97\xf7\xbd\x05\x1d\xbf\xd5\x36\x61\xff\xc8\xa1\xc7\xf8\xed\xea\x8d\x88\x67\xf6\x16\x29\x76\x9a\xb3\x8c\x1f\xca\xd8\xe8\x94\x97\x7b\x60\x05\xa2\x20\x15\xab\x6e\x60\xa7\xc0\xc8\xa6\x9c\x68\x99\x24\x24\xa2\x82\x0d\xa8\xcf\x2b\x91\xf6\x5c\x84\xf6\x9d\x65\xa2\xdc\x26\xf9\x79\x77\xb8\x6e\x55\xe7\xde\xb4\xb6\xb2\xab\xfc\x6e\x1a\x87\x2d\x9b\xab\xd6\x3b\xd8\x4f\x1d\xfb\xfb\x76\x7b\x33\x97\xed\x7d\xf9\x18\x88\xbd\x15\x34\xde\x9f\x80\x39\x38\x27\x77\x0d\xa4\x73\x7b\xf3\xe3\xbd\x7e\x6f\x5a\x0f\x0d\xdb\xe5\x54\xb4\xd5\xf3\xf3\xd3\x64\x7c\x33\x56\x59\x92\x06\xf1\xd1\x66\xe0\xcf\x41\x42\xd6\xb7\x49\x32\x6c\x57\x5a\x9d\x6c\xbf\x53\x1a\xaf\x3b\xe3\x5e\x24\x5c\x9a\xaf\x57\xc8\xce\x76\xb3\x42\x3c\x19\x11\x49\x40\xaa\x3c\x2a\xfb\xcd\x85\x6d\xcd\xc9\x67\xe3\xb7\x57\xfa\x1f\xb0\xbd\xc5\x41\x17\xb1\x33\xfc\x5f\xd9\xf7\x21\x9d\xd9\x5b\xb4\x17\x2a\x84\x5c\x2b\xd9\xb6\xe1\x75\xdb\x5b\xe3\xe8\xe0\x71\x56\xcb\x2e\x17\x78\xf3\x58\x9e\xb4\xca\xb9\x52\x64\x5e\x99\x8e\x1e\x79\x31\x93\xa3\xd9\xdc\xac\x97\x88\xe4\x97\xcd\x59\xa7\x87\xd3\x7a\x11\xa1\x0d\xb9\xf0\x5a\xd3\x55\x75\x91\x91\xb9\xe5\x42\x88\x46\xf8\x91\xb3\x7e\xe7\xb3\xf6\x76\xb9\xd9\x33\x68\x7e\x1b\x96\xb2\xf4\x1c\xff\xab\x41\xee\x39\xbf\xd5\xec\xb4\x5d\x9a\x77\x56\xac\xd8\xc5\xbb\x6d\x25\x1d\x6d\x6e\x48\x72\xfa\x98\x29\xaf\x36\x32\x6c\x06\x1e\xe9\xca\xb1\x53\xbb\xc8\x7e\xae\x69\xb4\xb9\x68\xed\x5c\xb8\x37\xdb\xc7\x1a\xfd\x06\xca\xf6\x61\x72\xb9\xd9\x2c\xa7\xa0\xb0\xb3\x31\x5b\xa8\xd8\x12\xf5\xf6\xf9\x3d\x29\x1c\x6a\xb9\xdd\xde\xe2\x97\xed\x7d\xf9\x18\x88\xbd\x55\x26\x71\xd1\x39\xc3\xff\x32\xa8\x3e\xa6\x33\x7b\x93\xd9\x52\xad\x1b\x2e\x96\xe2\xed\xc2\x64\x5a\xe9\x86\xd6\xab\x5a\xbe\xe8\xd7\x46\x20\x9a\x4d\xc9\x4d\x94\xa8\x0d\x21\x32\xe2\xaf\x98\x17\xcd\xd9\xbe\x5a\x8a\x25\xca\xed\x56\xfb\xc6\x7a\x2b\xca\x9b\x52\xae\x68\xe4\xde\x34\x87\x9b\x48\x8c\x1a\xe1\x57\xf1\x6a\xba\x59\x15\xbd\x4f\xda\x5b\xec\xce\xf1\x5b\x2c\xe5\x56\xe1\xb3\xf9\xc9\xf2\xf7\xf8\x2d\x4b\x32\x9d\xd5\x40\x74\x53\xb5\x19\x29\xdb\xdd\x2a\x97\x8b\x4e\x92\x26\xeb\xcd\x69\xb7\x14\x4b\x25\xf7\xf9\x72\x2e\x34\xee\xe6\xe2\x23\xba\xde\x54\x77\xb5\xe1\x32\x3e\xab\x0e\x44\xbd\xd0\xc4\xdd\x48\x27\x3a\xab\xa0\x44\x77\xa7\x39\xdf\x84\x86\xa3\xca\x74\x55\xdd\x15\xc5\x68\x5c\xfa\xa4\xbd\xbd\x9a\xe4\x09\xda\xde\x46\xd9\xdd\xf0\x6c\x7e\x32\x72\xf5\x8e\xea\x73\x7e\x4b\x8d\xbd\xfa\xae\x9f\x8b\xc2\x68\xb7\x51\x7c\x04\x5e\x2c\x52\x19\xc5\x57\x82\x65\x27\x76\xef\xf4\x70\xe1\xe7\x12\xc3\x42\x76\x32\x16\x0b\x6c\xd2\x35\x5f\x6d\xbb\xd1\x76\xd5\x2b\x36\x96\x74\x17\xee\x75\x7b\xa8\xdb\x2a\x36\xd9\xac\x34\x05\xb5\x6d\x36\xcf\x48\x77\xd4\x05\x83\xcf\xce\x4f\x5e\x4e\xaa\x06\x6d\x6f\x35\x99\x58\xc4\xce\xf0\xbf\x1e\x9a\x9c\xd9\xdb\xaa\x36\x6e\x0f\x73\xdb\xbe\x58\xaa\x59\x6e\x12\x2a\xb6\x5c\x8a\xcc\xc3\x43\x02\x23\xd3\xe9\x22\xd4\x4c\x26\x86\xf9\xc9\x92\x3e\x56\x1b\xd5\x76\x4c\x7a\x80\xf5\xa6\xb1\x32\x2b\xf1\xe6\x4c\x6f\xbb\xf9\xfd\xc8\x2b\x8b\xbc\x2a\xe9\x0a\x8e\x2e\x40\xb9\xb4\x26\x64\x8e\x13\xd9\xcf\xf2\x5b\xf8\xce\xfc\x16\x75\xdd\x64\xe3\x0c\xff\xf0\xf7\xf8\x2d\x63\x5a\xd5\x4c\xb4\x98\xd9\xb7\xc6\x86\xb5\x37\xb5\x79\x88\x67\x26\x31\x3f\x12\xc9\xf5\x48\x3a\xd9\x69\xc0\x68\x38\x54\x1b\xc5\xb6\x93\x38\x84\xa3\x5a\xc7\xd4\x0a\x40\x3f\xda\x58\x2a\x8e\x76\xb6\xbe\xf7\xab\xac\x53\x6c\xa7\x72\xa1\x1d\xca\x54\x9a\x79\xe8\x2a\x3c\x5d\x9c\x76\x8e\x6d\xbf\xdd\xde\x2e\xc7\x77\x41\x8f\x27\x73\xcd\x61\xf6\xd8\xc6\x83\x69\x7f\xd7\xde\xbc\x55\xa2\xd9\xaf\x4f\x99\x58\x97\x69\x7b\x58\x94\x38\x89\x8a\x5e\x3d\x5e\x5f\xaf\xfc\x3c\x29\xec\x72\x92\x11\x31\x99\x0f\xbd\x54\x22\xdc\x1e\xe5\xe2\xad\x66\x34\x1c\x77\x45\x16\x2e\xa4\xcc\x76\x93\x11\x7a\xa8\xbb\x18\x5b\xba\x09\x57\xfb\x31\x56\x5e\x64\x8a\xf5\x9a\x3b\xdd\xd0\x79\xbb\xbd\x35\x2e\xdb\xfb\xf2\x31\x98\xf5\x37\xc2\x33\x95\xe3\x2f\x0f\xbe\xa9\x7e\x0d\xa4\x73\x7b\x6b\xf0\x55\x3f\x3c\xf1\x97\xf9\xb2\x53\x30\xc7\x1e\xab\x60\x59\xe9\xf6\x41\xe9\x71\x28\x77\x7a\x2a\x23\xac\x5f\x1a\xcd\x2b\xb1\x9a\x0d\x57\x36\xde\x6c\xe5\xd7\x60\xcb\xcb\x0d\x7d\xdc\xdc\xcf\x52\xe1\x1d\xa6\xb1\xc5\xaa\x9e\x07\x03\xd0\x8d\x0a\x18\x9a\xcf\x23\xf9\xc8\x32\xf5\x59\x7b\x4b\xdd\x7b\x7e\xb2\x2c\xf3\xcd\x53\x21\xde\xf3\x39\xb4\xcb\x74\x1e\xbf\xd5\xb6\x53\x5b\xa1\x16\x0e\xec\x2c\x13\x66\x85\xd8\x1e\x6c\x49\x9f\x47\x49\x23\x16\x4e\x46\x79\xb7\x69\xd3\x0d\xb1\xca\x53\x32\x19\x73\xaf\x33\xdd\xd1\x44\x53\xb0\x44\x23\x57\xed\xd0\x4e\x78\xcb\x43\xa0\x4e\xb3\x69\xaf\xfc\x88\x07\xed\x5c\x69\xd4\xf0\x6a\x75\x50\xf3\x3e\x69\x6f\x91\xcb\xa5\xa5\xa0\xf9\x2d\xb2\x03\xf1\xb3\xf8\xed\xd5\x52\xd6\xb1\xfc\x17\x7b\x8b\xb6\x9a\x91\x2e\x33\xfe\xb0\x46\x0b\x59\xd4\x4f\xb7\x5c\x0a\xac\x79\xd5\x5b\xc6\x51\xa6\x54\xf4\x92\xbd\x29\x00\x23\x55\x24\x34\x92\xdd\xce\x2b\xf9\x44\x24\xef\xe9\x50\x53\x54\xb6\x99\xf9\x7e\x3f\x9a\xaf\xda\x15\xe9\xc6\x4b\x3f\x93\x2f\xb5\x1c\x5b\x86\xd6\xa5\x24\x49\x7d\x7a\x7e\xb2\x70\xd9\xde\x97\x8f\x81\xd8\x5b\xb3\x1b\x4e\xec\x8e\xbf\x3c\x1c\x0b\xba\x3c\x56\x74\x4c\x67\xf6\xd6\xf7\x56\xb6\x3b\xb4\x30\x8d\xf6\x0b\x5c\x56\xd9\x3a\x8d\x47\x43\xd5\x45\x67\x53\x6f\x94\xaa\xc9\x79\x62\xb7\x97\xdb\x65\xd2\xf5\x27\xdd\xea\x54\xae\x3a\x83\x61\x2e\x36\x8c\xc3\x44\x5c\xf1\xfd\xb6\xd7\xaf\x4e\x3b\xdd\x48\x06\x7a\x60\xb7\xab\xaf\x52\x73\x27\x46\xa9\x52\x6f\xf5\xd9\xf9\xc9\xd8\x9d\xe7\x4b\xa2\xfd\x62\x2f\x75\x36\x9e\x2c\x7e\x6f\xfd\x2d\x9c\x8f\xda\x50\x3b\x5b\xca\xb4\x6b\x83\x09\xcb\xc2\x82\x89\xa4\xb3\x3e\x99\x0f\xd4\xae\x6a\x17\xed\x41\x3b\x6c\x31\x8f\xbb\x51\x6a\xb7\x6a\x15\xe3\xb0\x8f\x27\xc9\xfa\xbc\x1b\xca\xae\xac\xbf\x59\xa0\xa6\xe7\xe3\xa6\x2a\x7a\xa3\xc9\xbc\x1b\x9f\x55\xaa\x51\xb2\x4f\x34\x2a\xc7\x41\xf7\x27\xf8\xed\xce\xf1\x5b\xd8\x86\xe6\xc9\x63\x41\x07\x7e\x8b\x7e\xcf\xde\x3c\x35\x8f\x65\xe5\x2e\x8d\x31\x18\x4c\x4a\x89\xd0\xb4\xbf\x7a\x54\xe5\x6a\x83\xd3\x72\x94\x66\xbd\x62\xcc\xef\xe5\x96\x64\xa7\xd4\x0a\x0f\x2b\xa1\x76\x2e\xb3\x9f\x64\x70\x0f\xf5\x2a\xa1\x48\xa1\xa6\xb6\x8b\x44\xbf\xb1\xdd\x56\x77\x26\xa2\x23\xd4\xb2\xec\x76\x29\x40\xfb\x54\xe7\xed\xf6\xa6\x2e\xdb\xfb\xf2\x31\x10\x7b\xab\x2b\x16\x39\xad\x39\x1c\xe6\x4b\x56\xd7\x40\x3a\xb7\xb7\x6a\x4d\x34\x1b\x20\x99\xad\x67\xbc\x70\x4f\xe7\xfc\x3a\x48\xe2\xfa\xb6\x36\x48\x74\x43\xa6\xd4\xad\xf9\x39\x60\xe3\x91\x41\x7c\x5f\xef\xd8\xe6\xa8\x25\x3b\xb0\x1e\xca\x8d\x8b\x32\xba\xc8\x2f\xa0\xea\x4d\x57\xe9\xfa\xd0\x4b\x54\x40\x58\x88\xce\x56\x8f\x26\x25\xda\x65\xf3\xa3\x51\x7c\x62\xfd\xed\xce\xe3\x49\x6f\xf2\x38\x9a\x9f\xd9\xdb\xf7\xf9\xad\x9b\x0b\x8d\x53\x3d\x54\xef\xc6\x77\x69\x1d\x8e\xcf\x15\xca\x57\x52\xcb\x27\x12\x5b\x98\x71\xb9\xd3\x2d\x6e\xf5\x32\x3c\xa9\x2e\x66\x23\x51\x34\x1e\xe7\xc5\x69\x1e\x0d\xab\xd3\x41\x04\x6c\xfc\x61\xa1\x52\x9f\x6c\xb3\xd8\xf6\x67\x6e\x16\x37\x64\xbd\xda\xf5\xf7\xdc\x2f\x1d\xfb\xfb\x76\x7b\xbb\xf3\xfc\xa4\x37\x4e\xb6\x2b\x67\xe3\xc9\x70\xed\x1a\x48\xe7\xf1\x5b\xa5\x3c\x9a\x8f\xb6\xcd\xf0\x7e\x34\x5a\x4f\x60\xf7\x71\x56\x4f\xf7\xca\x61\xf6\xb8\xd6\x6b\x9b\x5e\xc5\x38\xa8\x86\x9b\x99\x12\x57\xed\x68\x9f\x95\xe7\x24\xb1\x8c\x14\x39\x0f\xcb\xdd\x8e\x0c\xea\x8b\xf6\x94\x54\x27\x08\xe7\xa3\xf1\x7c\x68\x69\xc2\x93\xf6\x68\x1c\x29\x54\x07\xd9\x97\xfe\x3f\xdb\xbf\xf1\xc3\xc7\x62\xdf\x3d\x36\xfa\xc6\xdb\x57\x7f\xf4\xe4\xe4\xd9\x1b\x58\x83\x78\x03\x1c\xfc\xfd\xe1\x33\x2f\x67\xfb\x12\xae\x46\x0e\xb7\x05\x22\x8c\x39\x02\x98\x09\x4a\x38\xa7\x02\xf0\xd7\xf7\x81\x91\x77\x5e\xc7\xf6\x8b\x49\x55\xab\x44\xef\x26\xd5\xe7\xee\x2d\xff\x55\xfb\xea\xaf\x93\xea\x07\xfa\x8a\xfe\xfe\x80\xd1\xcb\xcb\xfa\x7e\x7f\x00\xef\x98\xeb\x5b\x6f\x92\xfd\x61\x83\x3d\x7f\x9b\xec\xcb\x61\x67\x8d\xa5\xb0\x9a\x28\x2b\x24\xa7\x0c\x23\xca\x08\xf6\x95\x41\xd0\x97\xc4\x42\xac\x9d\x0f\x38\xd1\x18\x61\x6b\x05\xb6\x90\x40\xed\x38\x80\x8a\x1a\x09\x88\x83\xfa\xf4\xaa\xaf\x6f\xb6\x92\xe7\xbc\x6f\xa9\x3e\xdc\x0b\x85\x41\x16\xa4\x13\xbb\x65\x77\x93\x87\xc3\x16\x50\xbb\xe9\x04\xca\x7c\x72\xbb\xce\x46\x76\x05\xba\x0c\xc7\xfc\x48\x7d\xbd\x89\xcb\x0d\xee\x2c\xe7\x85\x71\xfb\x9a\xf3\xbd\x4c\x6f\xbe\x32\xee\x72\xab\xe9\x8f\xd7\xdf\x0a\x3d\xfa\x57\xa9\xe6\xbb\xf5\xbf\xbe\x2c\xe1\x3a\xee\xd4\x37\xdc\x42\x83\x21\x87\x14\x2b\x61\x38\x96\x3e\x70\xcc\x30\xc1\xa0\x85\xc6\x87\x4a\x53\x1f\x31\x62\xb1\x15\x86\xf8\x4a\x69\xa6\x94\xc5\xce\x97\x44\x62\xc4\xfc\x23\xee\xe8\x35\xee\x7f\x91\xdc\x41\xe1\x2e\xce\xf6\xd9\x5c\x9f\x8d\xff\x1c\xee\x8e\xfb\x5a\x60\x20\x31\x14\x98\x09\xc7\x24\xf1\x85\xc0\x40\x3b\x2e\xa4\x20\xd0\x72\x8b\x7c\xc2\x8c\x6f\x31\xb0\x0c\x48\x26\x8d\x10\xda\x00\xdf\x52\x21\x7c\x6d\xe5\x11\x77\x1c\x38\xee\xb7\xca\x1d\x14\xee\xfc\x6c\xbc\x73\x35\xd4\xf8\x24\xee\xda\x10\xc1\x8c\x36\x06\x20\x43\x18\x10\x90\x33\x0e\x7d\xa2\xa8\xe2\x56\x1a\x66\x05\xa3\xbe\x42\xd2\xd7\x04\x5a\x86\x0c\x57\xca\x71\xa0\x90\xb3\x96\x6a\xcc\x8c\x3d\xbd\x80\xed\x5d\xdc\x7f\x6c\x08\x1e\x29\x77\x0b\xfe\xec\xf4\xd3\xab\x53\xac\x1f\xc2\x3d\xfa\xa9\xfa\xa7\x27\x7b\xfb\xe1\xfa\x3f\x8a\xbb\x80\x10\x4a\xe4\x63\xc1\x08\x36\x8e\x63\x1f\x40\xaa\xa8\x82\x86\x73\x2d\x00\x32\xce\x01\x6a\x88\xa3\xc0\xf9\xcc\x40\x20\x20\x53\x8a\x53\x1f\x28\x06\x81\x74\x52\x1d\x71\xff\x8e\x9f\x59\xa9\x88\xae\x37\xdb\x28\x3a\x6c\x36\xd4\xbc\xce\x6a\xdb\x8d\x6e\xe0\x44\x3e\xdd\x99\x8e\xb1\x57\x89\x74\x53\xf1\x29\xd5\xdb\x4a\xaa\x71\xf8\x3d\x26\x65\xd8\x09\x10\xf7\x5b\xea\xb7\x77\xc6\x9d\x1b\x27\x28\xf7\x11\xf6\xb9\x71\x56\x4b\x4e\x0c\xf7\xb1\xa4\x8c\x73\xca\x04\x55\xc2\x1a\xa7\x04\x91\x4c\x6b\x2e\xa0\x33\x98\x30\x5f\x58\x04\xd0\xe1\x88\xbe\x76\x47\xdc\xaf\xf8\x99\xbf\x48\xee\xa0\x70\x3f\xed\x01\xb9\x1b\xee\x98\x70\xa6\x7d\x46\x24\x65\x98\x08\xe1\x3b\x80\xa8\x11\x88\x4b\xa0\x94\xf4\x09\x61\x44\x42\x21\x10\x46\x1a\x52\x60\x90\x60\xc4\x40\xec\xac\x74\xca\xb7\x94\x00\x76\xc4\x9d\xbc\x8b\xfb\xcf\xb4\xf3\x6b\xb8\xdf\x52\xbf\xb8\x33\xee\x56\x49\x42\x09\x66\x0a\x6b\x46\x81\x75\x4a\x08\xc0\xb0\xe5\x98\x53\x28\x7c\x07\x25\x12\x46\x2a\x82\x0d\x54\x5a\x61\xeb\x33\x41\xf8\xd3\x00\x92\x01\x8d\x39\xc6\xf6\xf4\xba\xc2\xf7\xfd\xfb\x0f\x86\xf4\xe9\x5a\xe4\xf1\x24\xd4\xed\xb8\xc7\x3e\x57\x7f\xe1\xce\x7e\x86\x40\xa6\x18\xf6\xb1\x83\x44\x42\x8a\x39\x93\xc2\x37\x9a\x39\x29\x20\x90\xdc\x1a\x61\x09\xf1\x15\xe2\x06\x19\x09\x00\xd3\x06\x68\xc5\x84\xc0\xc8\x6a\x27\x0d\xa5\x47\xdc\xaf\xf8\xf7\xbf\x48\xee\xa0\x70\xcf\xdd\x59\xdf\x7d\x24\x25\x11\x06\xfa\x4a\x70\xad\x0c\xb2\x4f\x01\x9d\x0f\x35\x80\xc2\x97\x92\xf9\x08\x39\x47\x0d\x65\x8e\x72\x8a\xb5\x8f\x85\x03\xce\x08\xe1\x13\x83\x7c\x6a\x24\x39\xe2\x7e\xc5\xbf\xff\x45\x72\x07\x85\x7b\xb6\x76\x5f\xdc\x29\x25\x56\x21\x24\x21\xb6\xda\x01\xe8\x7c\xa2\xb1\x22\x86\x01\x4d\xa5\xb2\x48\x38\xcc\xa5\x16\x00\x18\xaa\x99\x51\x04\x28\x26\x05\x57\x14\x5b\x6d\x04\x77\x80\x1f\x71\xbf\xe2\xdf\xff\x22\xb9\x83\xc2\x3d\xbd\xb9\x2f\xee\x3e\x11\x9a\x08\x29\x90\xf1\x0d\x74\x80\x4b\x23\x81\xb5\x18\x09\x69\x7c\xa4\x19\x62\x52\xfb\x16\x3c\xc5\x4a\x1c\x0a\x6c\x8c\x56\xc2\x62\xe3\x2b\x44\x35\xb4\x82\xe8\x2f\x5f\xef\x45\x0f\x98\x57\xcf\x79\xed\xec\x6a\xd2\x8f\xe3\x1e\xff\x5c\xfd\xbc\x76\x5b\xfd\x1f\xf6\xef\x98\x2b\x22\x20\x10\xc6\x40\x82\x11\xc7\xc6\x77\xd0\x47\x02\x49\x66\x18\x20\xc2\x00\x09\xa9\xcf\x00\x47\x4f\xb4\xab\xa9\xe3\x92\x68\x21\x29\x03\x8a\x00\x1f\xf8\x47\xdc\xaf\xf8\xf7\xbf\x48\xee\xa0\x70\xa7\x9b\xfb\xe2\x2e\x9d\xb4\x8a\x43\xa2\xa1\xc2\x92\x31\xa2\xa1\x65\xc6\x01\xa7\x9c\x81\x4a\x41\x6e\x8d\xe2\x50\x6b\x40\x39\xa4\xce\x42\xcc\x21\x22\xcc\x61\x04\x84\xc6\x0a\x6a\x78\xc4\xfd\x8a\x7f\xff\x8b\xe4\x0e\x0a\x77\x92\xbb\x2f\xee\x4e\x32\xa6\x34\x86\x00\x62\x6e\x94\x15\xcc\xe7\xd6\x72\xfb\xe4\x5a\x28\xc0\x58\x52\xcc\x7d\x2e\x9c\x78\xa2\x01\xa5\xac\xe2\xc2\x70\x67\x04\x26\x10\x13\xa3\xb8\x3c\xe2\x7e\xc5\xbf\xff\x45\x72\x07\x85\x3b\x9a\xdc\x17\x77\xcc\x80\x11\x12\x08\x01\xac\xd5\x06\x21\x62\x38\x05\x4c\x4b\x21\x20\xa6\xc8\x69\x9f\x69\xa6\xa1\x44\xd0\x09\xa2\x04\xb5\x52\x80\x27\x3a\xe5\x54\x53\xca\x80\x3e\xf9\x19\x1a\x38\xee\xb7\xca\x1d\x14\xee\x30\x76\x5f\xdc\xb5\x0f\x7d\x29\x84\xef\x23\x69\x24\x7b\x0a\x8d\x0c\xc0\xc8\x12\xe1\x04\x43\xbe\x51\xd0\x97\xd6\x30\x48\x35\xe0\xca\x17\x46\x53\x68\x1d\x96\xd2\x37\xd8\x29\x24\xc9\xc9\xcf\xb0\xc0\x71\xbf\x55\xee\xa0\x70\x3f\xbe\x35\xfb\x7e\xb8\x33\xa8\x31\x36\xbe\x35\x4c\x0b\x68\x8c\x05\x56\x30\xcd\xa0\x56\x44\x69\x1f\x09\xa0\x99\x8f\xa9\xcf\x2c\xd1\x4a\x00\x42\x35\x05\x02\x39\x4e\x94\x54\x48\x33\x60\xcd\x11\x77\x1e\x38\xee\xb7\xca\x1d\x14\xee\x5b\x71\x5f\xdc\x21\xc3\x4a\x69\xc6\x7d\xaa\x10\x51\x54\x5a\xa3\xa8\x25\x9a\x58\xea\x30\x92\x88\x38\x06\xb0\xef\x1c\x45\x4f\x5f\x3b\x8d\xa8\x55\x56\x0a\x4e\xb1\xf0\x11\x86\x87\xf9\x19\x7a\xf6\x3e\xe8\xc0\x70\xbf\x55\xee\xa0\x70\x3f\x9d\x97\xbc\x9f\xbe\x23\xee\x8c\x36\x94\x3a\xab\x1c\x82\x96\x59\xc9\x94\x31\x56\x6b\xe0\xa8\xf3\x39\xa6\x04\x38\x27\x29\xa0\x86\x1a\x60\x7c\xce\x7c\x69\x7d\x26\x1d\x31\xc8\x71\xe6\x8e\xb8\xcb\xc0\x71\xbf\x55\xee\xa0\x70\x5f\x81\xfb\xe2\x6e\x11\x45\x5a\x08\x82\x38\x64\x8e\x48\x67\x05\x22\xc6\x09\x5f\x52\x4b\xa1\xa2\x54\x13\x60\x34\xd4\x14\x02\xc8\xb5\x92\xdc\xf8\x54\x6a\x64\x24\x87\x96\xfa\x1a\x82\x53\xdc\x04\x02\x07\xfe\x56\xc1\x83\x02\x7e\x59\xba\x2f\xf0\x5a\x32\xa4\x11\x12\x5c\x62\x41\xa5\xc1\xc8\x58\x69\x98\xc2\x06\x5b\x2e\x90\xf2\xb5\x70\xc8\x00\x2d\x2d\x56\x90\x2b\x09\x29\x87\x8a\x00\x64\xb8\x6f\x08\x57\xe2\x74\x85\x39\xbc\x12\xb1\xfe\x45\x82\x07\x05\xfc\x7c\x71\x5f\xe0\x01\x26\xd8\x48\xe1\x9c\x60\xda\x11\x4d\x9d\xb4\x88\x18\x2d\x34\x16\x42\x3a\x8b\x89\x71\x5c\x41\xc6\x7c\x67\x2c\xb7\x12\x48\xa1\x04\xf6\x21\x74\xdc\x6a\xc9\x11\x3a\x01\x1f\x7c\xc8\x7a\xab\xe0\x41\x01\x3f\x4b\xdd\x17\x78\x2b\x10\x93\x90\x53\xe9\x4b\x9f\x72\xc9\x7c\xea\xfb\x12\x2a\xe8\x73\xe8\x10\xc6\x9a\xf9\x54\x61\xa1\x9c\x54\x86\x4a\xfe\x14\x58\x31\x4a\x01\x17\x02\x0a\x81\x85\xe5\x27\xe0\x83\x8f\x59\x6f\x15\x3c\x28\xe0\x27\x83\xfb\x02\x6f\x04\xf0\x05\x90\x8a\x00\x46\x19\x00\x86\x73\x40\x2d\x37\x1a\x10\x0b\x11\x03\xda\x61\x49\x05\x32\x92\x40\x42\x98\x92\xd4\x69\xe9\x5b\xc5\x18\x13\xc0\x3a\xe0\xe3\x13\xf0\xc1\x07\xad\xb7\x0a\x1e\x14\xf0\xa7\x9b\x5e\xee\x37\x59\x60\x80\xf6\x09\x21\x8e\x5a\x09\xac\x54\x0c\x2a\xaa\x14\x80\x50\x09\xcd\x10\xe6\xcc\x3a\x64\xb8\xc5\x80\x10\x28\x14\x14\xe2\x29\x64\xd2\x1a\x68\x49\x39\x01\x4e\x9c\x80\x0f\x3e\x6a\xbd\x55\xf0\xa0\x80\x1f\xfa\xf7\x05\x1e\x10\x0d\x15\x54\x40\x42\x2a\x35\xf4\xb9\xd6\x04\x3b\x03\x8d\x0f\x1c\x12\x48\x52\x61\x80\x02\xd0\xc7\x98\x1b\x8e\x14\xc0\x88\xf8\x00\x31\xa4\xa9\x30\x12\x33\x48\xbf\x3c\xbf\x60\x2d\x60\xe0\x6f\x15\x3c\x28\xe0\xfb\x37\x4e\x47\x7f\x78\xf9\xc3\x60\xfe\x44\xae\x1c\x01\xe3\xf4\x53\x00\x4b\x24\xc6\xd0\x11\x80\xb5\x53\xd8\x49\xeb\x20\x86\x08\x39\x65\x25\x25\x8a\x63\xcd\x35\x13\x42\x43\x01\x34\xa4\xf0\x14\x3e\xc1\xe0\xe3\xd6\x5b\x05\x0f\x0a\xf8\xde\x9d\xe7\xe1\x15\x36\x02\xf9\x44\xf9\x08\x73\xcb\xb9\xc3\x82\x3a\xec\x1b\x47\x15\xa6\xc2\x57\xda\x27\x1a\xf8\x10\x69\xee\xa8\xd0\x54\xfa\x50\x3e\xc5\x5b\x4a\x28\xce\x00\x04\xfe\x29\x7e\x82\xc1\x07\xae\xb7\x0a\x1e\x14\xf0\x9d\x3b\x4f\xc4\x5b\x20\x31\xe6\xd6\x1a\x07\x31\x63\x8c\x42\x89\xac\x20\x40\x23\xac\x1d\x62\x5a\x30\xe7\x0b\xaa\x25\xd6\x9a\x00\x68\xb0\x82\xbe\x25\xd6\x22\x05\x35\xe5\x12\xc1\xaf\xe4\x1a\x7c\xe4\x7a\xab\xe0\x41\x01\xef\xee\x3d\x13\x0f\x09\x30\xc6\x01\x9f\x53\xc7\x0f\x9f\x0c\x97\x58\x42\xcb\x34\x95\x12\x69\xe9\x53\xa6\xa5\x8f\xb0\x0f\x08\x00\x40\x68\x09\x84\xcf\x81\x22\x10\x5b\x0d\xf0\x69\x86\x0c\x05\x1f\xb9\xde\x2a\x78\x50\xc0\x9b\x3b\x4f\xc5\x53\x43\x18\xc5\x80\x72\x62\x7d\x47\x11\xa5\x10\x69\x0a\x05\x51\x8e\x49\x21\xa5\x91\x54\x09\xc4\xac\xcf\xf4\x61\xe3\x01\xd0\xc8\x60\xa2\xb1\x75\x0a\x53\x64\xf8\xc9\xd5\xa0\xe0\x23\xd7\x5b\x05\x0f\x0a\x78\xff\xee\x73\xf1\x48\x41\xe6\x2b\x81\x34\x37\x40\x1b\x09\xb0\x8f\x18\x11\x88\x63\xe6\xfb\x56\x4b\x47\xac\x53\x80\x73\xc0\xa1\xe5\x48\x10\xc9\x28\xd1\x58\xf9\xf6\x69\x6c\x8f\x4f\xe4\x8a\x82\x8f\x5c\x6f\x15\x3c\x28\xe0\xd5\x9d\x27\xe3\x15\xd0\x46\x1b\x0d\x95\xc2\x54\x73\x87\x94\xf5\x11\x80\x9a\x41\xe1\x7c\x45\x25\x01\xd4\x12\x1f\x73\xea\x84\xe3\x4c\x21\x62\x1d\xa2\x56\x08\xaa\x24\x73\x86\x7f\x9d\x8c\x47\xc1\x47\xae\xb7\x0a\x1e\x14\xf0\xad\x3b\xcf\xc6\x4b\x2d\x01\xa5\x84\x21\xe6\xcb\xa7\xf1\xa3\x64\x9a\x38\x06\x7d\x5f\x42\x60\xb0\xc0\x0a\x0b\x07\x11\xc2\xbe\x70\x94\x70\x61\x8d\xb1\xcc\x59\x06\x14\x77\xc8\x91\xaf\xb3\xf1\x28\xf8\xc8\xf5\x56\xc1\x83\x02\xbe\x79\xe7\xe9\x78\x60\x21\xb7\x82\x3b\xdf\x28\x8a\xe5\x53\x98\xc4\x7d\xed\xa0\x45\x8c\x0a\xe7\x1b\x47\xa0\xd5\x80\x09\x69\x25\x23\x92\x12\xaa\x35\x24\x8a\x4a\x06\x04\x46\x96\xea\x53\xe4\x8a\x82\x8f\x5c\x6f\x15\x3c\x28\xe0\xeb\x77\x9e\x8f\x77\x88\x73\x4b\x94\x76\xdc\x00\x83\x11\x73\x8a\x61\x6b\x19\x22\x90\x3a\xae\x20\xe4\x96\x60\x42\x31\xe0\x88\x71\x6e\xa0\x63\x56\x32\x28\x7c\x61\x90\xd6\x82\x22\xf2\xe5\xf9\x55\xee\x01\x03\x7f\xab\xe0\x41\x01\x5f\xbb\xf3\x7c\x3c\xb5\x98\x21\xa4\x1d\x33\x4a\x43\xc4\x19\xa4\x14\x40\xa2\x05\x16\xdc\x21\x06\x15\xd0\xda\x69\xeb\x10\xe1\xbe\x52\x80\x5a\xe9\x13\x6d\x85\x2f\x24\x30\xca\x48\xfa\x55\xe3\x83\x8f\x5c\x6f\x15\x3c\x28\xe0\x2b\x77\x9e\x8f\xd7\x00\xf8\x02\x2b\x2b\x1c\x36\xc0\x37\xc4\x41\xce\x00\x85\x1c\x0a\xa4\xb4\x71\x80\x10\x60\x7d\xc5\xac\xf3\x0d\xd2\xc0\x29\x21\xb1\x52\x4f\x31\x15\xa6\x96\x20\xff\xb4\x73\x0f\x05\x1f\xb9\xde\x2a\x78\x50\xc0\x97\xef\x3c\x1f\x8f\x1d\xc7\x50\x33\xe6\x43\x85\x0d\xf2\x89\xef\xa4\x81\x4f\x9e\x9c\x5b\x09\x81\xb6\x4a\x31\xf7\xe4\x7f\x14\xe7\xbe\xef\x3b\xc3\x90\xa3\x56\x69\xdf\x60\xeb\x3b\xdf\x3f\x4d\x92\xa1\xe0\x23\xd7\x5b\x05\x0f\x0a\xf8\xe2\x9d\xe7\xe3\x89\x44\xbe\xf0\x91\x00\x42\x3b\x46\xa4\x56\x18\x41\x07\x1c\xa7\xc6\x28\x08\xa9\x80\x10\x70\xed\x1c\x42\xd2\x3a\x42\x39\x26\x40\x29\x2d\x88\x24\x8e\x2a\x43\xe0\x69\x05\x0a\x07\x1f\xb9\xde\x2a\x78\x50\xc0\x9f\xae\xbf\xb9\x1b\xf0\x3e\xc0\xc6\x69\xab\x30\x65\x80\x69\x43\x19\x75\x98\x01\xa9\x30\x60\x4a\x21\xae\x04\x52\x0a\x12\x8d\x9d\x81\x04\x39\xa8\x20\xd6\x5c\xfa\x50\x70\xe8\x28\x51\xf8\xe4\x6a\x70\xf0\x91\xeb\xad\x82\x07\x05\x7c\xee\xce\xf3\xf1\x04\x59\xc2\x9d\x70\xc6\xd7\x1c\x0b\x5f\x10\x62\x21\xa5\xcc\x97\x4e\x19\x28\xac\x16\x42\x70\xc3\x05\x13\xd0\x3a\xfa\x34\xa2\x61\x42\x0a\xab\x99\x85\x3e\xb5\xc2\x7e\x05\x3e\xf8\xc8\xf5\x56\xc1\x83\x02\x3e\x73\xe7\xf9\x78\x6b\x25\x13\x8c\x1a\xe7\x2b\x2e\x7c\x82\x7d\x02\x38\xc1\x90\x3b\x6c\xb4\x6f\xb8\xaf\x24\x17\x8c\x60\x2d\x39\xd6\xbe\x54\xd4\xf8\xc4\x21\x2a\x84\x93\x02\xfa\xcc\x9c\xd6\x5c\x71\xf0\x91\xeb\xad\x82\x07\x05\x7c\xfa\x53\xf3\xf1\x6f\xde\x85\x10\xcc\x45\x08\xf7\xbe\x05\x21\x91\x15\xc9\xd2\xba\x34\xd0\x19\x94\xf4\x70\xa3\xde\x2f\xcf\x33\xa3\x7e\x13\x00\x97\x10\x8b\x6c\x8a\x8f\x40\xac\xbc\x49\x37\x42\x5e\xf3\x70\x61\xcb\xd9\x6d\x07\x97\xd7\xd0\xbf\xba\x96\xfe\xf6\x17\x02\x1d\xcb\x3b\x9e\xfa\x3e\x74\x72\xab\x5f\xf2\x8b\x55\x94\xa0\xdd\xd9\x38\x3c\xea\x24\x12\xb6\x23\xd3\x62\x48\x7c\x18\x1b\xd7\x86\xdb\xc1\x30\x36\x4c\xca\xc5\xac\x3d\x07\x92\xc3\x38\x2b\x64\x1b\xce\x86\x46\x64\x30\x8d\x2f\x53\x8f\x8b\x14\xe8\xc1\x59\xb6\xb7\xa4\x1e\x48\xef\x1a\x63\xdd\x6d\x65\x1b\x74\x12\xfd\xf2\xfb\xc3\x17\xb4\x1f\x15\x96\x19\x96\x36\x8d\xdc\xb0\x1d\xdd\x2d\x53\xfe\xb0\x10\xe3\x21\xcf\x64\x73\x7d\x3e\x29\x76\x4b\x5a\x6e\x12\x43\x54\xaa\x6e\x5f\x2e\x89\x7c\x07\x83\x17\xcd\xf8\x8a\x6f\xe9\x22\xef\x61\x26\x3e\x88\x53\xf8\xb7\x9e\x82\xf7\x02\x38\x85\x1f\xaf\x36\xc2\xf3\x4f\xd4\xef\x5d\xd4\xff\x33\x4f\x4b\x5e\x73\x97\xf7\xbe\xf2\xe2\x76\x23\xbb\x74\x45\xaf\x14\xee\xc7\x6e\xa9\x1a\xb4\xaa\xe3\xcc\x39\x64\x67\x46\x16\x49\x8e\xf8\x64\xc0\x17\x33\xe0\xd2\x31\x52\x6b\xd9\xf9\x7c\xbd\x37\xcb\x74\x67\x93\xd9\xe0\x5e\x32\x51\x42\x51\x82\x5b\xb6\xe1\xc5\x1e\x43\xe9\xbe\xde\x28\x34\xad\x0f\x87\x7a\x53\xd4\x34\x63\xf3\x93\x51\x31\xd4\x69\xaa\x95\xcc\x48\x0a\xf0\x00\xec\x7a\x29\x13\x4a\xe6\x22\x4f\x86\xd0\xcc\xbb\x2e\xd8\xfa\xf5\xc2\x04\xee\xc7\x9e\x5c\xaa\x44\xb2\x8b\xc3\x33\xb8\x19\x55\xfb\x2c\x5f\xcd\xcc\xd0\x6c\x55\x14\xc3\x74\x6e\xf4\x72\x3d\xd6\x5f\x6f\x64\x9f\x55\xf2\xcf\x19\xd9\xbc\x3d\x88\xd1\x66\xa0\x46\xf6\x13\xaf\x9c\xf8\x90\x91\x05\x7c\xbf\xc9\xed\x46\x16\xbd\x68\xfd\x2b\x85\xd3\xa3\xce\x08\xd6\x91\xe9\xd0\x3a\x1c\xcd\xa0\x1d\xe6\xfc\x04\x5c\x6e\xfb\x95\x56\xa6\x2d\x37\xb1\xce\xa4\x12\x56\xb6\x21\x6a\xbd\xf8\x61\xd9\x29\xff\x18\x33\xe7\xaf\x17\x3a\x67\xb2\x92\xa7\x22\x9d\x71\xd7\x4b\xae\x1b\xeb\xde\x6e\xe7\xf7\xd2\x49\x3c\x98\xca\xdd\xa4\x5a\x5a\x8e\x51\x25\xde\xd7\x91\x59\xb6\x56\x2b\x86\x33\x7b\xbf\xbc\x14\xdd\x55\xaa\x1a\x93\x76\xe9\xb6\xc3\x58\x78\xde\x20\xbd\x5e\x7a\x30\xef\xec\x4a\xb6\x10\x99\x85\x52\x09\x9d\xb0\xa8\xec\x79\x4f\x86\x20\xc5\x2a\x1a\xa9\x26\xa2\xaa\xa8\x6a\xbb\x54\x2e\x2b\xc9\x28\x96\x1c\x93\x45\x79\xb9\xef\x47\x47\x91\xc6\xb8\xd5\x93\xd1\x42\x23\xb5\x7b\x7c\x21\xd9\xbf\xda\xc8\x3e\xaf\xe4\x9f\x34\xb2\xd6\x22\x37\xee\x65\x03\x34\xb2\x9f\x79\xbf\xc8\x87\x8c\x2c\xe0\xcb\x6c\x6e\xbf\x5f\xf3\x9d\xe1\xe2\xc1\x56\x6e\xbb\x0f\x11\x87\x9e\xd3\x4b\x79\xe7\xf7\xb1\xca\xc1\x28\xd3\x40\x33\xbc\xe6\x25\xb7\x13\xc5\x9c\x1d\xc4\x34\xac\x56\x53\xb4\xb7\x9d\x0d\x52\x20\x3c\xe9\x34\xe7\x85\x25\xef\x14\x20\x43\x25\x3d\xe8\x22\x53\xa9\xd6\x9c\x8d\x4e\xd6\x3e\x28\x7a\xca\x75\xa3\xcd\xed\xb2\x5b\xf7\x86\x8b\xec\xaa\x3f\x0c\x8f\x76\xfd\xb0\xd7\x3a\x18\xc5\xba\xd6\x5d\xae\x8d\xb7\x2c\x77\x3a\xcd\xf6\x76\x9b\x69\x8c\x99\xd1\x93\xb6\x3f\x99\xee\x40\x72\x94\x6d\xce\xd6\x7e\x26\xfb\x48\x75\x7e\xf9\x72\x5f\xd2\x75\x83\x6b\x7d\xdb\xa9\xdf\x18\xdc\x01\xbb\xa3\x83\x3a\xbb\x0b\xf3\x06\xd6\x77\x85\x97\xbe\x78\x23\xbd\x71\x89\xd6\x95\x77\x05\x7d\xb2\xfe\x37\x9c\xcd\x47\xea\x0f\xfa\x20\xf6\x4d\x17\x87\x05\x5d\xff\x6b\x3c\xde\x77\x38\xd1\x97\x3c\x3f\x78\x97\xeb\x67\xee\x66\x3d\x76\xc5\x8b\xc1\x6d\x2e\xf1\xfb\x90\x43\x0a\xf8\x96\xa7\x04\x9d\xa4\x97\x75\x33\x6e\x15\xea\xa6\x3d\x5b\x36\xa7\xd5\x64\x78\xa9\xfd\x16\x18\x45\x46\xce\x0f\xa7\x32\xb1\x4e\x63\x3c\x5c\xc7\x53\xdd\xc3\x05\xbf\x7f\x8d\x43\x8a\x3f\xd7\x5f\x2a\x0e\x3b\x3c\x91\xed\xa6\x3b\x60\xcb\xfb\x53\x6f\x03\x63\x1b\x96\x44\xcd\x38\xdb\x95\x53\x23\x97\x4e\x6d\xe2\x6e\x0b\x64\x7e\xd5\xa3\x7a\x59\x48\x7b\x71\xbb\x89\x7b\x79\x57\x50\x5e\x58\xc4\x4b\xed\x21\x9d\x62\x8f\x76\xf0\x80\x45\x93\xd1\x5e\xc7\xd5\xf2\xb5\x28\x64\x1d\xff\xe0\x34\x3a\xe5\x44\x65\x43\xda\x51\x8c\x8b\x5e\x5c\x35\xba\x10\xaf\xbc\xac\x13\x71\x58\xac\x15\xb7\xcb\x58\x2a\x3e\x9b\xc2\x4d\xa6\x55\x1a\xd3\x97\x17\x36\x06\xe5\x90\x6e\x18\x21\x35\x83\x74\x48\x9f\xac\x3f\x40\x87\xf4\xd9\x9b\xa6\x3e\xeb\x90\x02\xa9\xff\x13\x0e\xe9\x47\xeb\xff\xcb\x1d\x52\xc0\xd7\x9f\xdd\xee\x90\xde\x89\xf5\x8f\x0e\xa9\x34\x2c\x9f\x3a\x3a\x40\x87\x14\x4e\x86\x72\x59\xf6\x58\xde\x37\x66\xab\x78\xb1\x2b\x3a\xd9\x38\x2a\xaf\xda\xfb\xd6\xb2\xdf\x9f\x16\x6d\x72\x1d\x9a\x18\x99\xe3\x64\x3b\xac\x01\xd9\x54\x44\x51\x0b\xf3\xdd\xdc\x32\x57\x29\xa7\x26\xd9\xd4\xb2\x03\x63\x2a\xda\x88\xc9\xfd\x7a\x99\x74\xc3\x7a\x23\xe5\xa9\xca\xa6\x74\x70\x1a\xce\x75\x9b\x9b\xfe\x56\x86\xe6\x43\x00\x45\xa1\xde\xc6\xf5\x49\x63\xc2\xdd\x2c\x36\x9c\x2f\x49\x52\xe6\x13\xbb\x42\x2a\xd2\x64\x48\xbf\xdc\x98\xfd\x8b\x38\xa4\xf0\x4b\xf9\xe7\xe9\xa7\x39\xa4\xc8\xed\xf5\x07\xed\x90\xde\x70\x90\x3f\xcd\x21\xfd\xe8\x92\x80\xe7\x7d\xd2\x21\x45\xea\xb1\x53\x18\xf8\xd7\x38\xa4\x80\xef\x05\xbc\x3d\x64\xfb\x89\x0e\xe9\x2c\x64\x8b\x65\xc2\xeb\x47\xb1\xcf\x42\x3b\xdd\x6c\x23\x8f\x8b\x74\x37\xd6\x2a\x8e\x74\x3f\x2b\x9b\x15\xbf\xb9\xf4\x97\x93\x5c\xca\xd8\x25\x35\xdd\xce\x80\xb7\xd2\xf5\xf4\xde\x1b\x97\x2b\x9d\x56\x75\xed\x76\x93\x54\x3a\x93\x36\xa5\x51\x93\xb1\x55\x17\x4d\x1e\xe7\x09\x99\x61\xe9\xd4\xa8\x73\x0c\xd9\xf2\x49\x25\xda\xe9\x7a\xbf\x92\xda\x6f\xd2\xa6\x33\x1e\x64\x66\x7e\x39\x51\x29\xf7\x22\xb9\x79\xbc\x04\x26\xed\x7c\x2c\xc4\xdc\xbc\x50\x3f\x73\x38\xbf\x48\xc8\xf6\x69\x87\xf4\xc9\xfa\x03\x74\x48\x81\xdc\x9d\xf5\x09\x87\xf4\xb3\xef\xee\xf2\xbc\x4f\x86\x6c\x7f\xb5\x43\x0a\xf8\xc2\xcc\x1f\x14\xe2\x63\x21\xdb\x51\xa8\x1f\x53\xf2\xcf\xbc\x83\x63\x35\x28\xe0\xf3\x1e\x4f\x3e\xb7\xb7\x94\x0c\xb5\x07\xfb\x72\xc8\x46\x40\x9c\x6f\x8b\x72\xef\x4d\x6d\x72\x9d\x4b\xf2\xf1\xcc\x2e\xf7\xaa\x62\x5a\x5d\xd1\x48\xee\xe6\x9b\xcd\x5a\xc7\xc6\x5b\x12\xd5\xac\xb3\x07\x9d\xf9\xb8\x9c\x0e\xa7\x2b\x8c\x15\xda\x3a\x31\x8a\x0c\xf8\x6e\x9f\x1c\x89\xe8\x20\xcd\x75\x9a\x94\xbc\xda\xc1\xc9\xb0\x69\xb9\x96\x9f\x15\x50\xad\xf0\x38\xe9\x24\x8a\xe3\x3c\x4c\xe4\x44\x3b\x93\x1f\x0d\x8a\xe5\x19\x2b\x2e\x54\xcc\x8f\x89\x46\x64\xef\xef\xbf\x37\xe7\x74\xa1\x04\x6f\x38\xb0\x73\xc0\x6f\x58\xce\xed\xf9\x2f\x7d\xf7\x46\x7a\xdf\x81\x04\x58\xff\x6d\x21\xde\xe5\xe5\x7f\xbf\xdc\x9c\x8b\xf7\xed\xa5\x8c\x3f\xb9\x7d\x11\x56\xe2\xe6\xf3\x0e\x26\xe0\x9b\x61\x6f\x77\x30\xef\x8c\x78\x8e\x42\xfd\xe0\xb0\xfe\x3e\x0e\x26\x1e\x4f\x64\x13\xf1\x78\x53\xc7\xa2\x65\x33\x40\x36\xbe\x2b\x79\xd5\xfc\x34\xb9\x9a\x15\x42\x8b\xf8\x7c\x3a\x5b\x6c\x47\xf9\xfc\x26\xa1\x1e\x73\xd9\x9e\xce\x97\xd2\xd9\x68\xb3\xa1\x5c\x84\x34\x44\x26\x97\x29\x85\xba\x31\x90\x03\xd5\xec\xb6\x6d\x57\xa1\x82\x58\xb6\xc6\xe1\xd5\x66\xe3\x1d\x9c\x40\xa9\x31\xed\x6f\x42\xf1\x74\xbc\x6a\xa6\xfd\xfc\x72\x3d\x0a\x47\x9a\xbc\x45\x63\xbb\x9e\xab\xa0\x52\x78\x0e\xb2\xd3\x49\x67\xc7\x42\xe3\xfa\xcb\xa2\xc9\x2f\xe2\x60\x6e\x32\xf0\x00\xeb\x7f\x3d\x22\xf8\x40\xfd\xd7\x1d\xcc\xaf\x34\x87\xe2\x5d\x71\x30\x3f\xaf\x7d\x01\x39\x98\x80\xaf\x40\xbe\xdd\xc1\xbc\xb3\xd4\x7c\xdb\x08\xe6\xa6\x10\xec\x7b\x0e\x26\x3b\x06\x79\x1b\x59\xa8\x11\x6d\xcd\x47\xcb\x45\x2e\x5d\xaa\x17\xb2\xbb\x42\xb5\x38\x8b\x6a\x5e\xc9\x55\x23\xed\xc4\xc4\x8d\x68\xa5\x5b\x63\xce\x1f\xe2\x62\xb1\x67\x53\xe3\x52\x7e\x39\x80\xf1\x51\xb9\x6e\x6b\x5b\xd3\x6a\xc2\xf9\xa2\x81\x32\x49\x98\x2c\xe9\x34\x23\x24\xb9\x01\x07\x27\xb0\x99\x0e\x53\xc0\x9f\x25\x57\xcb\x6c\x3f\xd3\xde\x68\xaf\xb5\x6b\xeb\x48\x36\xd4\xac\x6b\x68\xaa\xeb\x68\x7f\x13\x6a\xf5\x63\x60\xd1\x6c\xbf\xb4\xed\x17\x71\x30\x37\x19\x78\x80\xf5\x5f\xea\xce\x87\xea\x0f\x68\x04\x73\xc7\x10\xc4\x0b\x62\x04\x73\x73\xfb\x02\x72\x30\x01\xdf\xf5\x7d\xbb\x83\x79\xe7\xb5\xe8\xb7\x8d\x60\xee\xe2\x60\xe2\x98\x8c\x5a\xbb\x72\x56\xd7\xab\x04\x95\x96\xf1\x55\x8b\xd6\xf2\x60\x31\x97\x31\x7f\x15\xc3\xc3\xa5\x17\x92\x3b\x6f\xdb\xcb\x17\xd6\xab\x81\xae\x57\x0b\x6a\x2f\xd8\x2a\xd2\x9c\xc6\xda\xc3\x26\x8c\x8f\x63\xdb\x56\xb4\xbd\x29\xb4\xd3\x8d\x7a\xd3\x2d\xb4\x99\xac\x75\xbd\xb6\x39\xae\x82\xd5\x6b\xac\x97\x29\x17\xe7\x22\x1c\x8a\x2d\x58\xb5\x11\x81\xa3\x55\xa6\x98\xa7\x2b\x2f\x5a\x5f\x2e\xa7\xde\x74\xda\x65\xb5\xc7\x75\xcb\x6d\x5e\x5e\x1f\xf5\x8b\x38\x98\x9b\x0c\x3c\xc0\xfa\xdf\xa8\xe8\xa7\x8c\x60\x7e\xb2\x83\xf9\x79\xed\x0b\x6a\x04\x13\xec\xa5\xf6\xb7\x4f\x0a\xbf\x33\x82\x09\xe6\xbd\xd4\x95\xa4\x9e\x9c\x75\x5a\xe6\xaa\xea\x9d\xbd\x27\xb7\x90\x15\x5c\xca\x8e\x19\x92\x84\x1c\x44\x42\x7e\xa1\xca\xa6\xa5\x15\xda\xbb\x28\x4d\x74\xbb\xb1\xad\x97\x59\x66\x46\x9a\x2f\xc4\x64\x3f\x58\xec\x66\xa9\x56\x0a\x41\x3b\x8b\x64\xfd\xe1\x6a\x93\x1d\x6a\xb4\x09\xf7\x46\xb4\xb0\x99\x83\x1d\xda\xef\xb7\xad\x24\x5f\xcf\x0a\xe1\xcd\xd1\xe0\xb7\xa9\x65\x6a\x14\xc1\xf9\xe4\xc6\x9a\x41\x81\xec\x7a\x66\x33\x6f\x8d\x46\x82\xa4\x7a\xd2\x6f\x15\xcd\x6a\x42\xe4\xae\xd7\xd8\xb2\xd8\xf7\xb6\x87\x5f\xdf\x58\xf6\x83\xa3\x3d\xef\x45\x81\x8f\xe5\xdf\xfe\xce\x66\x93\x32\xab\xce\x59\x79\x93\xcb\xa6\xbd\xed\xf0\x4a\xb7\xb6\xff\x30\xa9\x5c\x39\xbe\xd8\xff\x6c\x44\xf5\x6a\xe3\xdb\x77\x1c\x5e\x70\xf5\x47\x6f\xaf\x3f\x88\x83\x2f\xe7\x07\x4f\x2e\x37\x52\x9e\xd2\x4f\x3b\xf8\x72\x39\x49\x7f\xb5\xfe\xcb\x10\xfb\xcc\x56\x2f\x53\xed\x45\x9e\x1f\xf4\x35\x67\xf2\x1d\xd3\xbd\x7d\xc9\xe6\x59\xd0\xf0\x4d\xed\xbd\xbd\x7d\xd9\x69\x74\x09\xbc\xe4\xc5\x82\xd8\x65\x9f\x97\x9e\xf1\xfc\x85\xda\x77\xdc\x78\x7b\x71\x64\xe7\x3c\x7d\x68\xde\x2f\xd8\x37\x86\xdc\x4e\x6a\xef\x8c\x9a\x03\x21\xb5\x9a\x4c\x2c\x62\x67\x8a\x98\xbe\x0a\xd9\x19\xa9\xad\x6a\xe3\xf6\x30\xb7\xed\x8b\xa5\x9a\xe5\x26\xa1\x62\xcb\xa5\xc8\x3c\x3c\x24\x30\x32\x9d\x2e\x42\xcd\x64\x62\x98\x9f\x2c\xe9\x63\xb5\x51\x6d\xc7\xa4\x07\x58\x6f\x1a\x2b\xb3\x12\x6f\xce\xf4\xb6\x9b\xdf\x8f\xbc\xb2\xc8\xab\x92\xae\xe0\xe8\x02\x94\x4b\x6b\x42\xe6\x38\x91\x8d\x74\x8e\xa4\x56\xc2\xd3\x54\x2c\x85\xcb\xa5\x9d\x2f\xf7\xdb\xcd\x24\xd3\x80\x9d\x4a\x3e\x52\x6e\x26\xc2\xbb\x76\x89\x41\x49\x2b\x64\xd8\x88\x0c\xa2\xde\xf7\x8e\x63\x04\x48\x6a\x2f\x4e\xf8\x13\xa4\x56\x05\x6a\x73\xb2\x9e\xc3\xff\xbd\xd2\xcd\x9f\x41\x6a\xaf\x56\x7e\xcf\xfa\xfd\x25\x5d\x18\x79\x1c\x74\x11\x7b\x85\x64\xd0\x4e\xbe\xe4\x05\xe6\xe4\x5f\x9c\x52\xd0\xf8\xc5\x7e\x71\xfc\x5e\x8f\x0e\xde\xc7\x6f\x51\x2c\x24\x17\xaf\x7e\x73\x48\x9f\x25\xc9\xb3\x85\xb5\x7b\xfb\xa6\x8d\xf7\xff\x46\x12\xf2\xbe\x1d\xb4\xfd\x35\x8b\xc4\xee\xb9\xe5\xc2\xfb\x76\x27\x47\x65\x12\x17\x6f\x1d\xfb\xf8\x50\x54\x18\xf0\xab\x9f\x6e\x27\xd0\xf8\x35\xd0\x8f\x29\x10\x02\x3d\x43\x2a\xe6\xbd\xb9\xa4\x7c\x46\xa0\x32\x5b\xaa\x75\xc3\xc5\x52\xbc\x5d\x98\x4c\x2b\xdd\xd0\x7a\x55\xcb\x17\xfd\xda\x08\x44\xb3\x29\xb9\x89\x12\xb5\x21\x44\x46\xfc\x15\xf3\xa2\x39\xdb\x57\x4b\xb1\x44\xb9\xdd\x6a\xdf\x58\x6f\x45\x79\x53\xca\x15\x8d\xdc\x9b\xe6\x70\x13\x89\x51\x23\xfc\x2a\x5e\x4d\x37\xab\xa2\x77\x22\xd0\x31\x65\xe3\x78\x36\xd1\x1f\x8e\x2a\x5b\xba\x14\xc5\xb9\x4c\xcc\xe2\x8f\x68\x9c\xe0\xe1\x66\xdc\x91\xaa\x5f\x29\xaf\x73\x9d\xde\x7e\xa2\x5f\x7c\xc5\xdd\x09\xf4\xe5\xe3\x27\x08\x34\xd3\x69\xee\x4e\xa5\x1c\x14\xf4\x95\x72\xfe\x0c\x02\x7d\x63\x07\xf2\xfb\x04\x90\x8d\xee\xbb\xfc\xfa\x6f\x02\x24\x80\xda\x95\x86\xdc\x48\x00\xf7\x23\xd0\xf8\x2f\x8e\xdf\xa5\xaf\xf8\x1e\x7e\x8f\xb8\x16\x7b\xe3\x5c\xde\x67\x09\xf4\x27\xfa\xa6\x5f\x97\x40\x63\xb3\xb0\x7b\x6f\x8b\xce\x2f\x4c\xa0\x5a\xa4\xd8\xab\x91\xe2\x29\x7d\xec\x0c\x72\xb0\xef\xf0\xbb\x9d\x40\x13\xd7\x40\x3f\xa6\x40\x94\xb4\x54\x8d\xe7\x4e\xbb\xec\x0f\x7d\x91\xbc\x8a\xd9\x19\x81\xaa\x76\xb3\x1a\xd2\x83\xe8\x1e\xc7\x67\xd5\x74\xb7\x99\x59\xfa\x15\xbb\xa6\x9d\xfd\x3c\x06\x36\x59\x94\xa8\x8c\x17\x7b\xc7\x97\x64\x16\xae\xfa\xe3\x06\x2e\x92\xae\x4d\x5a\x2f\x9e\x1a\x54\xfa\xcb\xce\x1e\x8c\x78\xaa\x93\xa8\xc2\xce\xa4\x3e\xd4\x4b\xe3\xd1\xe2\xb2\x9d\xcf\x47\x4e\xd3\xaa\x8f\x0d\x35\xcf\x95\x62\x18\xad\xba\x0b\xb7\x72\xab\x48\xaa\x16\x2d\xd4\xf3\xc2\x16\xbb\x35\x36\x9b\xcf\x6c\xde\xc9\x0e\x88\x01\x34\xfe\xde\x59\xe5\xe0\x08\xf4\xac\xd0\x4f\x10\x68\x38\x57\xdb\x9f\xca\x3c\x28\xa8\x7f\xd9\xb4\x9f\x41\xa0\xf1\xcb\xf2\xce\xfa\xfd\x25\x5d\x3c\x2f\x2e\x61\xf8\x75\x68\x18\x34\x01\xb4\xbc\xc0\x08\xe0\x7e\x04\x9a\xf8\xc5\xf1\xbb\xf4\x15\xdf\xc1\x2f\x5c\xcc\xb4\xcb\x6f\x38\xf8\xcf\x12\xe8\x59\xc5\xf7\xf6\x4d\xbf\x2e\x81\x26\x42\x91\xc2\x1b\x11\xfe\x4b\x7f\xfc\x9a\x04\x3a\x2c\x65\xe9\x5b\xcd\xfe\xd8\x61\x95\x60\x5f\xc6\x7a\x3b\x81\x5e\x2a\x4d\xd0\x04\x7a\x76\xa9\xc7\xb1\xd3\xaf\x62\x76\x46\xa0\x53\xd8\xcd\x4d\x72\x62\x9e\xef\x19\x3c\x1d\x87\x2b\xeb\xd0\x62\xd6\x29\x6f\x52\xa9\x5d\xb6\x33\xb0\x61\x5d\xcb\x25\x65\xa5\x55\x4d\x74\x9a\xcd\x46\xbb\x12\x86\x25\x5e\x5e\x53\x52\xea\x34\x75\x9a\x36\xf3\xdb\xe2\xcc\x93\x83\xce\x3e\x94\x6d\x4d\xd3\x3e\xae\xcb\xec\x62\xf0\x38\x0a\x9f\x36\x22\xe4\x3b\x28\x1d\x49\x45\x57\xeb\x4a\x3a\x6f\x4a\x8a\xf6\xc2\xf9\xca\xa3\x50\x68\xd1\x4e\xb9\x6e\xa6\x6b\x47\x9e\xdb\x18\xb8\xac\xb7\xb2\x3f\x6f\x0a\x37\x1c\xc4\xba\xe4\xf9\x85\x18\x87\xf2\x5a\x97\x4d\xfb\x19\x04\x7a\x24\x80\xef\xad\x0b\x5e\x10\x40\x75\x37\xaa\x55\x5e\x21\x19\x34\x01\xf8\x5e\x60\x04\x70\x3f\x02\x4d\xfe\xe2\xf8\xbd\x26\x98\xf7\xf1\x3b\x5b\x2c\xbf\x4c\x9f\x25\xd0\xb3\xbb\x67\xee\xed\x9b\x7e\x5d\x02\x3d\xbb\xcf\xed\x6a\xfa\x85\x09\xf4\x72\x93\xdb\x79\xfa\xd8\x05\x3d\xc1\xbe\x55\xfb\x76\x02\xbd\x74\x10\x41\x13\xe8\x51\x09\x3c\xef\x8a\x51\x9f\xa5\x33\x02\x35\x2c\xeb\x2d\x08\x35\x3a\x3c\xf0\xa2\x8d\x7c\x8d\xda\xe5\x78\x32\x51\xbb\x4d\x72\x36\x0f\x43\x59\x75\x04\x74\x77\x2c\x34\xea\xd5\xbc\x71\xde\xdb\xb2\x89\x08\xad\xec\xa4\xac\x36\xe3\x47\x5c\x4e\xef\xca\xeb\x52\x03\x37\x32\xd3\x76\x51\x4f\xc9\x3e\x4c\xe4\xde\x6f\x0d\xa2\xa7\x08\x74\x1d\xde\xb5\xfa\xb9\x8c\x19\xce\x27\x8f\x20\x9a\x1d\xf4\x49\x6b\x81\xba\x3b\x0b\xbb\x8d\x8d\x5d\xf4\x75\xcd\x0a\x3a\xce\x17\x59\xa6\xf6\xf3\xa6\x70\xc3\x41\xac\x81\x9e\x2b\xe4\x8b\x83\x3f\x4f\x3f\x83\x40\x8f\x04\xf0\x83\x6b\x78\xd7\x17\x1a\x83\x26\x80\x8e\x17\x18\x01\xdc\x8f\x40\x53\xbf\x38\x7e\x6f\x0c\x26\xde\xc4\x6f\xb2\xed\xfa\xaf\x14\xf1\x98\x3e\x4b\xa0\x67\x03\xc4\x7b\xfb\xa6\x5f\x97\x40\xcf\xda\x7f\x35\xfd\xc2\x04\x7a\x36\xe0\x7f\x95\x3e\x44\xa0\x0c\x6a\x8c\x8d\x6f\x0d\xd3\x02\x1a\x63\x81\x15\x4c\x33\xa8\x15\x51\xda\x47\x02\x68\xe6\x63\xea\x33\x4b\xb4\x12\x80\x50\x4d\x81\x40\x8e\x13\x25\x15\xd2\x0c\x7c\x7d\x23\x13\xff\x3c\x81\x5e\x2e\x9c\x07\x4d\xa0\x67\xa3\xa4\xb3\xed\xcc\x97\xe9\x8c\x40\xe3\xc9\x59\xa3\x96\x21\xd9\x55\x9f\x18\xb1\xa8\xf5\x4a\x50\x14\xc2\xcc\xf5\x06\x7a\x51\x2c\x35\xdb\x5e\x21\xe5\xda\x18\x2d\x3a\x0b\x86\x1e\x4b\x90\x27\x72\xe3\x4d\x6b\xb6\xd8\xc6\x27\x70\xd9\x23\xb2\xcc\xfd\x5c\x56\x99\xe8\x62\xdc\x4d\xf6\x07\xe3\x41\xa1\x94\xdb\xfb\x8f\xd1\xd3\x1a\x68\x4b\xe7\xe4\x7e\xa9\x48\xd2\x90\x42\x77\xde\xd2\xd3\xcc\x3a\xd2\xc9\xea\x68\x33\x41\xb3\x33\xaf\xac\x6b\xa9\x2c\xae\x4c\x27\xf3\x56\xe1\x45\x2f\xef\x4e\xa0\x41\xac\x81\x9e\x4f\x89\x94\xbc\x6b\x5b\x30\x7f\x06\x81\xbe\x71\xe0\xe8\x7d\x02\x50\xb9\x56\xf3\xb5\xe7\x0a\x9a\x00\x06\x5e\x60\x04\x70\x3f\x02\x4d\xff\xe2\xf8\xbd\xde\x64\xf3\x3e\x7e\xbb\xf8\x40\xbd\xb1\xc9\xe5\xb3\x04\x7a\xb6\x44\x71\x6f\xdf\xf4\xeb\x12\xe8\xe5\x95\xbd\x97\xe9\xd7\x25\xd0\xf3\x25\xa7\x57\xe9\x43\x04\x0a\x19\x56\x4a\x33\xee\x53\x85\x88\xa2\xd2\x1a\x45\x2d\xd1\xc4\x52\x87\x91\x44\xc4\x31\x80\x7d\xe7\x28\x7a\xfa\xda\x69\x44\xad\xb2\x52\x70\x8a\x85\x8f\x30\xfc\xfa\x66\x3d\xf1\x79\x02\xbd\xdc\x9e\x1d\x34\x81\x9e\xcd\xd3\x5f\xde\x09\x73\x96\xce\x08\x74\x24\x54\x3e\x0d\x45\xc9\x14\x90\x18\x76\x43\xb3\x50\x35\x5d\x6e\xca\x54\x74\x58\x99\x75\x55\x7e\xbf\xed\x0c\x55\x28\xdf\xd9\x99\x69\xa2\xb9\x35\x1d\xaf\xd5\xf2\xa4\xae\x64\x8d\x3f\x18\x0f\x4a\x62\x1f\xdf\xb8\x8a\x69\x8d\x46\xfd\xcc\x6c\x1c\xdd\xb6\x12\xb0\x06\xc0\x3c\xfb\xf5\x68\x49\xbc\x3f\x9b\xb7\x45\xa3\x57\x19\x8e\x97\x53\x5b\x01\xd4\xe5\xa6\xe9\x62\x2b\xba\x0f\xd5\x66\xcd\xc1\xe3\xae\x39\x63\x2d\x53\xed\x47\x72\xa5\xef\xdd\x45\x14\x1c\x81\x9e\x5f\x64\x7c\xbb\xc2\x9e\x2d\xca\x97\xae\xb6\xef\x67\x10\xe8\x91\x00\x7e\x70\x0d\xcf\xef\xb6\x13\xd3\x57\x48\x06\x4d\x00\x13\x2f\x30\x02\xb8\x1f\x81\x66\x7e\x71\xfc\x5e\x1f\xe5\x78\x1f\x3f\x1a\x1b\x4d\xdf\x98\xa7\xfb\x2c\x81\x9e\x45\x2f\xf7\xf6\x4d\xbf\x2e\x81\x9e\xad\xe1\x5e\x4d\xbf\x30\x81\x9e\x6d\x7a\x7c\x95\x3e\x16\x81\x22\xee\x8c\x36\x94\x3a\xab\x1c\x82\x96\x59\xc9\x94\x31\x56\x6b\xe0\xa8\xf3\x39\xa6\x04\x38\x27\x29\xa0\x86\x1a\x60\x7c\xce\x7c\x69\x7d\x26\x1d\x31\xc8\x71\x76\x7a\x0b\xb6\xfc\x3c\x81\x66\xaf\x81\x7e\x4c\x81\x10\xe8\xd9\x4e\xb1\xe3\xd6\xeb\xab\x98\x9d\x11\x28\x9a\x0e\xc5\xa4\x57\xee\xcb\x7d\x2d\x15\x9f\x4a\xaf\x95\x53\x99\x82\x06\x05\x4f\xe7\x16\xb9\x7e\x3a\x5f\xab\x25\xed\x46\xe1\xf4\xa6\x92\x04\x75\xd4\x56\x93\x21\xef\x0c\x92\x74\x37\x9a\xe3\x48\x7e\x53\x80\x96\x36\x85\x4b\xf4\x86\xd9\xf6\xe8\x71\x4b\x8b\x7c\x32\x28\x36\xa2\xa5\x53\x04\x3a\x0e\x69\x58\x0f\xcd\x44\x97\xae\x86\x33\x6c\x57\x1b\xe9\xb6\xfb\xba\x17\xa2\xb5\x38\x34\x51\xdf\x2c\xc6\x0b\xe5\xaa\x15\x89\xbe\x77\xbb\x68\x80\x04\x1a\xc8\x1a\xe8\xd9\x86\xc2\x17\x82\x3c\x4f\x3f\x83\x40\x8f\x04\xf0\x83\x6b\x78\xb6\x9c\x9e\xbd\x0e\xf3\x82\x26\x80\x85\x17\x18\x01\xdc\x8f\x40\xb3\xbf\x38\x7e\x97\xbe\xe2\x7b\xf8\xc9\xd5\x24\xf5\x46\x84\xf4\x59\x02\x3d\x1b\xd7\xdc\xdb\x37\xfd\xba\x04\xfa\xde\x59\x10\xef\xd7\x26\xd0\xb3\x63\x77\xaf\xd2\xc7\x2e\x98\x44\x14\x69\x21\x08\xe2\x90\x39\x22\x9d\x15\x88\x18\x27\x7c\x49\x2d\x85\x8a\x52\x4d\x80\xd1\x50\x53\x08\x20\xd7\x4a\x72\xe3\x53\xa9\x91\x91\x1c\x5a\xea\x6b\x08\x4e\x97\x1b\x80\xcf\x33\xe8\x25\x15\x04\xcd\xa0\x67\x87\x95\xde\x38\xe6\xe0\x7d\xcb\xa0\x60\x18\xa6\x9c\x2b\x56\x8f\x57\x47\xb3\x5e\x38\x53\x6a\xf6\x76\x1d\xd6\xea\xf4\xab\x45\xbf\x26\xc6\x32\x37\x34\x9a\x26\x4c\xc6\xb6\x45\xb4\x3c\x68\x24\xb8\xe4\xb3\x18\xae\x8e\x43\x8d\x2c\x5d\xc5\x5b\xe3\x16\x9b\x0d\xcd\x22\x25\x6b\x18\x7a\x95\xe5\x72\x1c\xca\x75\xc5\xd7\x83\xa0\x64\x98\x21\xdd\x88\xdf\x90\xe9\xd0\x24\x9d\x7f\xcc\x0d\x6d\x4d\xd5\x75\x29\xbf\xd0\xb5\x52\x9c\xcf\x9a\x38\x3e\xda\xa1\x66\x72\xb8\xdb\xbe\x34\xed\xee\x0c\x1a\xc8\x22\xe8\xd9\x74\xd4\xf5\x33\x7b\x3f\x83\x41\x8f\x0c\xf0\x83\x8b\x78\x4e\xcf\x22\xaf\xb7\x6f\x04\xcd\x00\x1b\x2f\x30\x06\xb8\x1f\x83\xe6\x7e\x71\xfc\xde\xd8\x92\xfc\x16\x7e\x11\x2f\x3a\xc1\x6f\x84\x48\x9f\x65\xd0\xb3\x65\xdf\x7b\xfb\xa6\x5f\x97\x41\xcf\x0e\xb2\x5e\x4d\xbf\x30\x83\xbe\xb3\xc1\xec\x83\xbb\x88\x24\x43\x1a\x21\xc1\x25\x16\x54\x1a\x8c\x8c\x95\x86\x29\x6c\xb0\xe5\x02\x29\x5f\x0b\x87\x0c\xd0\xd2\x62\x05\xb9\x92\x90\x72\xa8\x08\x40\x86\xfb\x86\x70\x25\xd4\x89\x41\x03\xb8\x1f\x28\x7f\x0d\xf5\x63\x0a\x84\x41\xbd\x02\x9d\x9f\xc6\xfe\x13\xef\x23\x0c\xda\x1b\xe4\x86\x4f\x99\xd8\xa4\x47\xca\x1d\x96\x98\xe2\xc5\x7a\x5f\x2d\x26\x7c\x55\x2b\x6d\x49\x72\x39\xcd\x83\x6a\x67\xb5\x68\xce\x73\xd5\x81\xae\x2f\xc2\xd3\x75\x32\xbf\x78\xdc\x00\x1d\x8f\xcb\x70\xa1\xb3\xdc\x25\x5a\x19\x14\x62\x7b\x37\x68\xb6\x72\xf5\x58\x58\x36\x99\xfa\xca\xa0\xab\x46\x66\x97\x49\x0e\x48\xc3\xe4\x96\xcc\xa8\x3e\x78\xb4\x91\x79\xb6\xbf\x03\xd9\x71\x7f\xd2\x9c\x95\xeb\xdb\xa9\x97\x6d\xee\x6b\x76\xf2\xbd\x57\xee\x04\xc8\xa0\x81\xac\x82\x7a\x7c\xb4\x38\xb6\x39\x72\xfd\xb5\x34\x3f\x83\x41\xdf\xb8\x94\xe6\x7d\x06\xe8\x78\x2c\x1f\xba\xfe\x9b\x00\x19\x00\x78\x81\x31\xc0\xfd\x18\x34\xff\x8b\xe3\x77\xe9\x2b\xbe\x8b\x5f\xa5\xd7\xbf\xbe\xb7\xf5\xd3\x0c\x7a\x76\x7e\xe3\xde\xbe\xe9\xd7\x65\xd0\x77\xee\x73\x7a\xe9\x8f\x5f\x93\x41\x47\x7e\x67\xf1\xa9\x55\x50\x80\x09\x36\x52\x38\x27\x98\x76\x44\x53\x27\x2d\x22\x46\x0b\x8d\x85\x90\xce\x62\x62\x1c\x57\x90\x31\xdf\x19\xcb\xad\x04\x52\x28\x81\x7d\x08\x1d\xb7\x5a\x72\x84\x4e\x0c\x1a\xc0\x65\x44\x85\x6b\xa8\x1f\x53\x30\x37\xec\x75\xc3\x89\xd3\x84\xf7\x53\x67\x87\x87\x57\x41\x3b\x63\xd0\xbe\xb7\xb2\xdd\xa1\x85\x69\xb4\x5f\xe0\xb2\xca\xd6\x69\x3c\x1a\xaa\x2e\x3a\x9b\xfa\xff\x43\xdd\x99\x35\xa7\xae\x63\xf1\xfe\xfd\x7c\x8a\x3c\xf6\x2d\x4e\x17\x92\x25\xd9\x72\x77\xdd\x5b\x65\x8c\x99\x27\x33\xc3\x4b\x97\x24\x4b\x60\x26\x03\x66\xfe\xf4\xb7\x12\xc8\x0e\x01\x32\x9d\xd8\xd9\x6c\x57\x9d\xb3\x21\x09\xd2\xd2\xb2\x58\x3f\x4b\x4b\xfa\xab\xe3\x36\x73\xcb\xec\xfe\x60\xee\x56\x39\x35\x0a\x86\xcd\xb9\xb9\x1e\x8c\x27\x65\x67\x92\x81\xd9\x0c\x33\x0e\x3b\x7f\xd4\x9c\x0f\x86\x76\x11\x5a\x60\xbf\x6f\xaf\xf3\x4b\x45\xa7\x79\xd7\x5f\x3f\xef\x64\xb1\x40\xad\x3f\x4a\x0e\x97\x66\xa9\x4b\xf0\x58\xc3\x21\xf6\x15\x06\x08\x05\x1d\x5e\x43\x33\xdd\x9d\x16\x07\xd4\x51\x6a\x39\xd9\xbf\xcc\x82\xc6\x4d\xd0\xf3\xc3\x8b\xfe\xf9\x56\x50\xe9\x38\xfc\x68\xf3\x13\x41\xb3\xbf\x65\x21\xee\x91\x00\x5f\x4c\xe3\x0d\x9c\x20\xd8\xdd\x9e\xb9\x8c\x90\x00\xd8\x8a\x8c\x00\xf1\x11\xb4\x7a\xe7\xfe\xbb\x8c\x15\x1f\xf9\xaf\x7b\x18\xcd\xf1\xd5\x67\x2c\x2b\x02\x82\x9e\x45\xdf\xb8\x63\xd3\xfd\x12\xb4\x3f\xcb\x97\xde\xd0\xaa\x78\xb9\x1f\xf7\x49\xd0\xcd\x76\xb4\x7c\xcb\xec\xcf\xcd\xe2\x52\x4d\x37\xa1\x41\x4c\x61\x0a\x62\x98\xba\x20\x42\x98\x90\x41\x61\x40\xa5\x21\xc4\x75\x41\x18\xa2\x4c\x99\xcc\x23\xa6\xa1\x0b\x43\xea\x84\x00\x83\x52\x48\x29\xa2\xd2\x38\x11\x34\x02\x35\xa2\xda\x2d\xaf\x1f\xaf\x48\x08\xda\x2e\x5b\xa7\xc3\xfa\x8e\xbd\x94\xdf\x74\xda\x39\x41\x71\x46\xf7\x67\xb5\xfd\x6c\xa0\x4b\xd0\x5b\x95\x56\x96\x69\xa7\x1c\x5a\xe9\xa5\xd7\xeb\xb2\x53\x9f\xe6\xea\xa6\xac\x39\x2b\xe4\x65\x18\x18\x4c\x59\xb2\x46\x71\xa9\x3e\xee\xc8\x34\xc3\x7d\xae\x39\xfa\xb6\xd8\x2e\xcd\x96\x23\xb1\xa8\x7b\x9d\xdc\xc8\x81\xbd\x0a\xb2\xad\xd3\x42\x22\xdd\x66\x75\xaf\xbf\x17\x6d\xc2\x33\x87\x42\x76\xb8\xdb\xd1\x51\x55\xdb\xb1\x6a\x31\xc1\x60\xdf\x0b\xd5\xb4\xed\xca\x7c\x36\x5f\xad\x7e\x24\x78\x1d\x21\x41\xa3\xc8\x83\xa6\x5a\xdb\xd4\xe9\x20\xc0\x27\x82\x66\xae\xf6\x58\xff\x04\x41\x8f\x04\xf8\x62\x1e\x6f\x42\xb1\x2e\xaf\x3c\x19\x35\x01\xa8\x15\x19\x01\xe2\x23\x68\xed\xce\xfd\x77\x19\x2b\x3e\xf2\x5f\x98\x1c\xa7\x62\x1a\x83\x9e\xed\xe0\x88\x3b\x36\xdd\x2f\x41\xdf\x93\xf4\xb1\xee\x9b\xa0\xef\xac\x31\xfb\x1c\x41\x3d\x0a\x04\x05\x26\xc3\x40\x27\x3a\x00\x9e\x61\x00\x22\x0d\x8f\x03\x2c\xa1\xa6\x03\xae\x90\x49\xa8\xe6\x99\x18\x62\xac\x33\x93\x28\x6e\x0a\xc9\x74\x5d\xa7\x40\x2a\x20\xd0\x89\xa0\x11\xc8\x11\x5d\x36\x23\x72\x3d\x3f\x2d\x39\x5b\x1c\x3f\xf9\xd4\x4b\xeb\x37\x9d\x76\x46\xd0\x6c\x6f\xbb\xed\x6d\x5b\x65\x96\x5e\xef\x86\x23\xb5\xcb\x2c\xa7\xbd\xc1\x46\xd7\x26\x7d\xbf\xb5\x6b\x4a\xea\x56\xb6\x06\xe9\xb3\x64\xcd\xde\xf7\x93\xfd\x06\xae\x14\xf5\xb9\xec\x58\x85\x61\x62\x4a\x73\x08\x4d\x86\xa2\x1d\x86\x2b\xe2\x4c\xac\x61\xa6\x9f\x38\x6c\xfb\x7d\xd4\x7e\x5e\x49\xa4\x59\x7b\x6b\x3a\x4e\x4d\x7a\x16\x44\x29\xa9\x78\xaa\xea\x4c\xed\x64\xb5\x3d\x58\x4d\x52\xf5\xec\xa2\x9d\x20\x87\x45\x7f\x3a\xa8\xd2\xf2\x4b\xdb\x63\x27\x68\x24\x82\xb8\x25\x9e\x90\x67\xb3\xb8\x99\xdf\x32\x8b\x7b\x24\xc0\x17\xf3\x78\xcb\x1a\xb1\xea\x71\x8f\xa1\x8e\x77\x2e\x1a\x02\xc4\x47\x50\xf7\xce\xfd\xf7\xc6\xaa\xaa\x37\xfd\x97\xd4\x46\xc1\x1b\x11\xfe\xbb\x04\x3d\x7b\xb0\x89\x3b\x36\xdd\x2f\x41\x6f\x2f\x22\xbb\xb8\x1f\x77\x49\x50\xdb\xee\xcd\x67\xdf\xca\x83\x2a\x0f\x70\x81\x31\x56\x44\x9a\x40\x9a\x4c\x87\x8c\x30\x06\x20\x64\x94\xeb\x1a\x32\x74\xa9\x34\xcf\x90\x08\x60\x0c\x29\x83\x94\x32\xcd\xc4\x9c\x03\x6e\x12\x03\x03\x45\x4f\x04\x8d\x40\x8f\xe8\xb2\xd7\x44\x2e\xe8\x37\x4c\xe0\x53\x14\x7a\xea\xa5\x1f\x0a\xfa\x6d\x06\x0b\x5b\x6f\xee\x9d\x61\x63\x39\xcc\x18\x45\xbc\xdd\x56\x07\x1e\x08\xed\xcd\x34\x63\xb9\x03\x55\x86\xce\x21\x21\x9d\x6d\x87\x4f\x93\xa9\x5a\xa1\xd1\x01\x9d\x79\xb5\xb9\x6b\x11\x25\x9d\xa2\x55\x9d\x97\x7a\x2c\x57\xd8\x6c\x36\xe9\x44\xa7\x5f\x9c\x92\x5a\x3e\xb9\x67\xde\xf3\x66\x96\xa4\xbb\x71\xea\xb5\xee\x3c\x3d\x9f\x0f\xe7\x2c\x48\x65\x83\x95\x5f\xd1\x8c\x3d\x4c\x94\x1d\xb7\x17\xf4\x7c\x7f\x52\x0a\x4b\x93\xae\x5b\x7b\xb9\xbb\xb1\x13\x34\x12\x45\x5c\x3b\x67\x0c\x8e\x8b\x5e\x9e\x08\xea\xfc\x16\x41\xbf\xdb\x6b\x98\x3e\x20\xc0\xc6\x0c\xf4\x6b\x6f\x46\x4d\x00\xe7\x46\xcd\xff\x90\x00\xf1\x11\xb4\x7e\xe7\xfe\xbb\x26\xcc\xbb\xfe\x4b\xbb\x3d\x7f\xa0\x5d\x7d\xc6\xb2\x22\x20\xe8\x59\x7a\x3a\xee\xd8\x74\xbf\x04\x1d\x4c\x8b\xfd\x37\x66\xc9\x5f\xee\xc7\x7d\x12\xb4\x14\x86\x93\xef\xe5\x41\x31\x87\x0c\x32\x60\x42\x62\x72\x28\x0c\xce\x31\x52\x1e\xf4\x04\x50\x1a\xd5\x4c\x42\x3d\xc0\x00\x14\x08\x19\x9e\xa1\x31\x80\x34\x2c\x80\xa6\x6b\x9c\x50\xcf\x44\x3a\x24\x27\x82\x46\x20\x48\x74\x29\x06\x16\x35\x41\xab\xe5\x44\xde\x3f\x7e\xf2\x69\x8c\x64\xde\x74\xda\x19\x41\x1d\x50\x31\xcc\xf1\xca\x9a\x4f\x1a\x8d\x51\xb0\x69\x11\x90\x1f\xaf\x0e\xfe\xba\xbe\x2c\x54\xf4\xdd\xb4\x3e\xce\x18\x2a\x6c\x27\x7a\xa3\x22\x19\xd0\x6e\xa7\x26\x07\x5e\x67\x9d\xa3\x6b\x42\x0e\xf6\xa1\x2f\x52\x07\xcf\x0b\xa8\xcd\xfc\xb5\xd3\x99\x17\xca\xb5\x51\xb9\xdf\xcf\xdb\xa7\x3c\x68\xaa\x94\x1d\x06\x85\x4c\x3f\x14\xd2\x70\x93\xc0\xdb\xd6\x8a\xf6\xa4\x07\x8a\x96\x28\x23\xb8\x0f\xd2\x85\xb2\x35\x2d\xc2\x51\xbf\x32\xfc\xe8\xe0\xe5\xe8\x08\x7a\x16\x1f\xbf\xd1\x63\xf1\x01\xfb\x67\x79\xd0\xf4\x95\x4e\xc9\x4f\x10\xf4\x48\x80\x2f\xe6\xf1\x40\x36\x1f\x54\x62\x1f\x43\xdd\x7c\x5a\xfc\x67\x04\x88\x8f\xa0\x8d\x3b\xf7\xdf\xb5\x70\xe0\xfb\xfe\x93\x93\xc1\x3c\x9e\xdd\x2c\xe7\x35\xc5\x1d\x9b\xee\x97\xa0\xbe\x51\x2a\x5c\x3d\x2a\x5f\xde\x8f\xfb\x24\xe8\x7b\xc7\xc9\x7c\xee\x2c\x60\x0f\x19\x9e\x49\x95\xa1\x01\x4f\x71\xe4\x09\x89\x4d\x84\xa0\xc2\x00\x71\xc5\x90\x32\xa5\x82\x08\x6a\x9a\x62\xd2\x24\x98\x19\x88\x1b\x5c\xa7\x94\x43\x0a\x38\x24\xf0\xa4\xa7\x00\x23\x50\x24\x6a\xde\xf2\xfa\xf1\x8a\x46\xd2\x0f\x99\xbd\xc4\xf1\x93\x4f\xbd\xf4\x70\xd3\x69\x67\x04\xed\xb6\x86\x9c\xb8\x4d\xab\x9a\xd8\xb4\xc9\xb8\xe9\xb8\x8b\xea\xdc\xdc\xfb\x38\x4c\xcb\xe5\xa8\x45\x36\xf9\x26\x69\xe7\x50\xd9\xaf\x66\x11\x85\x87\xfc\x7c\x32\x65\xaa\x30\x2a\x55\x72\x0d\xa0\xc9\xd9\x38\x98\x55\x73\xab\x5c\x27\xbf\x59\x1c\x66\x6d\x77\x94\x5b\xb8\x88\x9a\xcf\xb3\xb8\xdd\xa6\xea\x8f\x50\xbe\x92\x38\xa0\x6a\xa3\x59\x56\x6e\x7a\xa3\xd7\x88\xb1\x2b\x37\x4a\xba\xde\x6e\xcc\xaa\x68\x15\xf8\xbb\x41\x29\x53\xff\x39\x41\x05\x27\x92\xfd\xa0\x1b\x05\x47\x67\x79\xd0\xf4\x6f\x11\x54\x38\x12\xe0\x8b\x79\x3c\x34\xef\x15\x3b\x57\x9e\x8c\x9a\x00\x65\x2b\x32\x02\xc4\x47\xd0\xe6\x9d\xfb\xef\x32\x56\x7c\xe4\xbf\x85\x27\xed\x6b\xd3\x2c\x2b\x02\x82\x9e\xf9\x24\xee\xd8\x74\xbf\x04\x7d\x4f\x99\xdd\xba\x6f\x82\xca\xd6\xde\xff\x56\x1e\x94\x21\x8f\x6a\x02\x33\xa1\x21\x43\x1a\x86\x42\x94\x28\x24\x3c\x45\x18\x22\x54\x30\x2e\x30\x07\x02\x6a\xdc\x50\x84\x72\x62\x0a\x68\x1a\xca\xe3\x8c\x32\x43\x07\x10\x88\x93\xa0\x02\x8c\x40\x92\xe8\x72\x1e\x3d\x72\x4d\x3f\x9f\xce\xd9\xf1\x93\x4f\xbd\xf4\x5a\x3d\xc5\xba\xd8\xcd\x52\xd8\x66\x44\x70\xb0\x4c\x17\xb7\x47\xc9\x95\x95\xb2\xc6\xf3\x21\xdf\x54\x7d\x3d\x17\x22\x8d\xf0\x5c\x3a\x35\x6f\xfa\x7a\x21\x59\xaa\xa0\x46\x3b\x97\x0d\x7b\xae\xd6\xda\xa6\xe1\x52\x8a\x41\x2f\xe8\xad\x82\x4e\x1a\x26\x16\xe3\xa2\x97\x29\x37\x0e\x72\x9d\xef\x07\x5e\xe1\x99\xa0\x81\x39\x08\x1b\x61\x1e\x11\x44\x71\xf7\x70\x50\x9d\x51\xa7\xbc\xa0\x8d\xed\xb6\xb1\x4a\x76\x4a\x1d\x91\xed\x26\xf9\xa2\xe8\x0d\x9c\xf2\xcf\x29\x2a\x38\x91\xec\x07\x9d\x96\xf6\x93\xb3\x3c\xa8\xfd\x5b\x0e\x06\x3d\x12\xe0\x8b\x79\x3c\x7d\xd6\x1d\x4c\x62\x1f\x43\xb9\x56\x64\x04\x88\x8f\xa0\xad\x3b\xf7\xdf\x1b\xfa\x86\x6f\xfa\x0f\x58\x6c\x19\x4f\x1e\x34\x15\xc9\xc1\xa0\x9f\x8b\x4d\xf7\x4b\xd0\xd9\xa4\x1c\xfc\x99\x07\x83\xda\xb3\x00\x0e\xbe\x95\x07\x95\xc0\x44\xc8\x90\xd2\x53\x10\xe9\xba\x4e\xa0\xa9\x49\x8a\x01\xd7\x10\x57\x9a\xce\xa9\xae\x04\x25\xdc\x44\x9c\x63\x00\x3d\xc4\xa0\x90\x58\x4a\x8d\x41\x4e\x0c\x53\x83\xcf\x2b\x89\x22\xd0\x24\x6a\xdf\xf2\xfa\xf1\x8a\x84\xa0\xb9\x8a\x41\x34\xcb\xea\x42\xec\x8e\x1b\x72\x34\xbd\x3d\xeb\x70\x3e\x8b\x3b\x9c\xc0\xf6\xf0\x50\x20\x68\xd2\x36\x47\xb3\x72\xd8\xb4\xcd\x64\x9a\x24\x57\x4b\x30\x62\x1d\x7b\xd0\x10\xa0\x68\x4f\xbd\xc6\x62\xb2\xe0\x6e\x72\x9c\x76\x06\x9b\x66\x62\xa4\x1a\xa5\xf4\xda\xd5\x07\x65\x33\x5b\xb0\x1b\x2a\xc8\x74\x9b\x78\xbe\x94\x2e\x98\xce\x4b\x1b\xdb\x3e\x11\x14\x17\xca\xc8\x58\xd1\x66\x7f\xda\xea\x97\x02\xb7\x94\x37\xe8\x74\x9d\x4d\xe6\x3b\xa4\x6a\xb8\x29\xa0\xe7\xaa\xcd\x75\x71\xb8\xea\x8e\x87\x3f\xb7\x92\xc8\x89\x64\x3f\xa8\x40\x9b\x59\x37\x91\x52\xdd\xa1\x5d\x2f\xe8\xd5\xfe\x55\xe0\xfa\x09\x82\xbe\x71\x7c\xe4\xfb\x04\x30\xad\xec\xe2\x7a\xd3\x65\xd4\x04\x68\x59\x91\x11\x20\x3e\x82\xb6\xef\xdc\x7f\x97\xb1\xe2\x23\xff\x19\xd5\xce\x64\x92\xbc\x19\x28\xbf\x4b\xd0\xc8\x62\x13\x4c\x0e\x3e\x88\x4d\xf7\x4b\xd0\xb9\x5e\xe9\xfd\x99\x27\x83\xda\x5b\x8a\xe5\xe6\x0d\xb5\x8d\xcf\xad\x24\x82\x18\x78\x9e\x02\xc2\x20\xca\x78\x7a\xe5\x19\x26\x32\xa1\xd4\x39\x31\x4d\x8d\x9b\x82\xe8\xdc\x14\x1a\x12\x00\x03\x00\x28\x37\x01\x15\x06\x60\x18\x22\xc9\x01\x3a\xc9\xca\x6b\x11\x68\x12\x5d\x3e\x63\x47\xae\xea\x87\x8d\xe2\x69\xf6\xec\xe9\x39\xef\xfa\x5b\x68\xbd\x26\x68\xc7\x58\x8f\x52\x81\x58\x55\xea\x8a\xc1\xb2\x9e\x68\x82\x55\x63\x38\x02\x6e\x62\x62\xee\xf9\xdc\xb4\xf5\x91\x3b\x5d\x36\x9c\x96\x4c\x35\xb6\xd6\x62\x2d\x5a\xb0\x67\x95\x27\x02\x75\x0f\x8b\x7c\x6a\x8f\x88\x13\xae\xdb\x15\x30\x06\xc3\x34\x85\xc9\xe5\xd2\xae\xd8\xab\xfc\xb3\xa2\x02\x6d\xa5\x3d\x5a\xf6\x94\xa8\xa0\x2d\x24\xd5\x3a\x59\x76\xfa\x45\xb2\xeb\xac\x45\x9e\xa6\x2c\x2b\xbf\x76\x47\x39\x7b\xec\x24\xc2\xf4\xcf\xe9\xca\x9f\x85\xb9\x6f\xf4\xd8\xe6\x28\x9c\x9f\xe5\x41\x53\xbf\x65\x3f\xe8\x91\x00\x5f\xcc\xe3\x25\x0e\x93\x79\x5f\x5d\x2e\x88\x88\x9a\x00\x3d\x2b\x32\x02\xc4\x47\xd0\xce\x9d\xfb\xef\x8d\xf1\xf8\x5b\xfe\x73\xac\x5c\x7d\x83\xe2\x21\xe8\x59\xc5\x71\xc7\xa6\xfb\x25\x68\x58\xab\xe6\x96\xd7\x6a\x1a\xaf\xef\xc7\x7d\x12\x54\x77\x0d\x91\xfc\x0e\x41\x89\x87\x75\x82\x00\x31\xb0\x14\x8a\x68\x84\x40\x8d\x13\x48\x31\x53\xba\x49\x4d\xd3\x33\x09\xa3\x9a\x2e\x85\xce\x39\xf3\x34\x09\xb8\xe6\x21\xcc\x91\x54\x0c\x11\xcd\x33\x4e\xb3\xb8\x5a\x04\x9a\x44\xdd\x5b\x5e\x3f\x5e\xd1\xa8\xfa\x8d\x74\xb6\x3e\xeb\xa5\xd7\xca\x6a\xd6\x85\xb0\xbc\x73\x48\x08\xbf\xd4\xef\x38\xdd\xfc\x24\x74\x3a\xab\x65\x0f\xe6\x7d\xa8\x0e\x01\xdb\x69\x5e\xd6\x76\x92\x99\x35\xc8\x0e\xab\xfb\x05\xdf\x9a\x20\xbd\x09\x13\x63\xc4\xda\xd5\xa9\x5b\x6a\xa6\xf6\x2d\x52\xe8\x8c\x9c\x8d\xa7\x57\xe7\x89\xa0\x8d\xfc\x84\x51\xac\xd5\x56\xbb\xe7\xfd\xa0\xdd\x56\xbf\x99\xea\x36\x43\xb3\xd1\xae\x17\x61\xd6\x59\x6a\xd3\xc2\xac\xdf\x09\x0a\xeb\xdd\x72\xbd\x2a\x0d\xc2\x55\xa5\x54\xdb\x04\xb0\xd4\xfd\xb9\x59\xdc\x4c\x24\x79\xd0\x62\x6d\xbe\x38\xcb\x83\x5a\xbf\x65\x3f\xe8\x91\x00\x5f\xcb\xe3\xa5\xac\x14\xe0\x66\x32\x6e\x02\x08\x2b\x32\x02\xc4\x47\xd0\xee\x9d\xfb\xef\x32\x56\x7c\xe4\x3f\x7b\x59\x2e\xc6\x34\x06\x8d\xe4\x6c\xd0\xcf\xc5\xa6\xfb\x25\xe8\x23\xa6\x6a\x7f\x24\x41\xd3\xe9\x71\x82\xd7\xbe\x43\x50\x2e\x34\x06\x75\xc1\xa8\xc6\x0d\x0f\x70\xcf\x04\x48\x68\x3a\xa6\x9a\x81\x74\x21\x24\x37\x15\x96\x8a\x01\xc3\x00\x06\x94\x86\x46\xb1\xa9\x13\xcc\x11\x13\xd2\x33\x31\x44\xa7\x95\x44\x5a\x04\x9a\x44\x97\x2b\x25\x22\x57\xf5\xf3\x0e\x9d\x53\x77\x6f\x59\xd7\xdf\xb2\xd3\x75\x46\xd0\xc2\x6c\xb9\xea\x66\xf7\xa3\xf1\x62\x6e\x15\xac\x8c\x4a\xf7\x40\x61\x5f\x18\x75\x55\xc3\x4c\xee\xba\xa5\x52\xce\x5b\xa3\x6e\x53\x03\xf9\xdd\xbc\x60\xa7\x5c\xad\x08\xd4\xb0\x37\x6b\xfb\x21\x58\xcd\x38\x13\xb6\x99\xdc\x34\xc5\xb4\x34\xeb\xec\x8a\x03\x18\x64\xed\xba\xb9\x0e\x9f\x35\x89\x36\x76\xd0\xd9\x07\x45\x04\x4a\x9a\x5b\xb3\xfb\xf9\xc2\x81\x97\x75\x62\x56\x13\x03\x6f\x2b\xa4\x08\x1a\x9d\x76\xa9\x1a\x1a\x7d\xb7\xf9\x73\x2b\x89\x32\x91\xe4\x41\x53\xa8\xd2\x3f\x86\xb3\xd4\xed\x3d\x25\x3f\x41\xd0\x23\x01\xbe\x96\xc7\x4b\x59\x8b\x83\x3d\x8f\x7d\x0c\x35\xb0\x22\x23\x40\x7c\x04\xed\xdd\xb9\xff\xde\x58\x55\xf5\xa6\xff\xd2\xf9\xe4\x80\xc4\x43\xd0\x48\x0e\x07\xfd\x5c\x6c\xba\x5f\x82\x6e\x49\x6d\x7a\xf8\x33\x09\x5a\x26\xa9\xbe\xfa\x0e\x41\x19\xe0\x1e\xf7\x38\x64\x0c\x11\x6e\x28\x8d\x49\xa1\x01\xc8\x75\x48\x95\x60\xc4\xc4\x80\x48\x2c\x90\x41\x14\x55\x86\xce\x34\x2c\x95\x46\x24\xa5\x84\x99\xba\xf2\x8c\xe7\xc3\x41\xb5\x08\x34\x89\xfa\xb7\xbc\x7e\xbc\xa2\x51\xf5\xdb\xe8\x3b\x7a\xd6\x4b\x3f\x5c\x8b\x9b\x5d\xec\xec\xa4\xf0\x3d\xd3\x2c\x14\x9d\xd4\x46\xef\x19\x9b\xe9\xb8\x05\xd7\x89\x96\x9b\x68\x6c\xd3\xbb\x5c\x7e\x54\x92\xe5\xe9\x74\xb9\x22\xad\x8d\xd6\xb4\x43\xdd\x5e\xe1\x55\x30\xde\x6c\x47\x93\x6c\xc8\x53\x01\x0c\x45\x8b\xce\xdc\xe9\x76\xdd\x5d\xfb\x94\xab\x4a\xb6\x69\x9d\x08\x1a\x94\x34\x33\x64\x01\x5c\x25\x8b\xeb\xed\x20\xab\x65\x6b\xfb\xc9\xc4\xea\x8e\xb7\xa8\x8b\x4d\x2d\x18\x1b\xfb\x6e\x30\x64\x93\x0d\x4c\xfc\xe0\x2c\x6e\x24\xfb\x41\x65\x72\x99\x3b\x16\x94\x72\x7f\xdb\x5a\xdc\xa7\xb0\xf6\x86\xca\xf9\xcb\x75\x19\x75\xf7\x35\x5c\x8d\x9d\x00\x63\x2b\x32\x02\xc4\x47\xd0\xfe\x9d\xfb\xef\x32\x56\x7c\xe4\x3f\x86\xf5\x06\x8c\x87\xa0\x91\x9c\x0e\xfa\xb9\xd8\x74\xbf\x04\x3d\x54\xdd\x4e\xf7\xcf\x24\x68\xa7\xe2\x74\xbf\x95\x07\x35\xb9\x09\x08\xc1\xba\xa6\x0b\x93\x2b\x86\x4c\x9d\x63\xa5\x43\x21\x4c\x08\x3c\x44\x11\x43\x54\x41\x4d\x43\x82\x2a\x82\x0d\x2a\x3d\x4f\xea\x4a\xea\x80\x19\x4a\x53\xf8\xf9\x74\x50\x2d\x02\x4d\x22\x76\xcb\xeb\xc7\x2b\x1a\x55\x3f\xa6\xdb\xbd\xb3\x5e\xba\xbe\xe9\xb4\x33\x82\x36\x5b\xb4\xdb\x01\xb9\x52\xbb\x68\xa5\x7c\x5e\x16\x6d\x90\x43\xed\x5d\x6b\x9c\x1d\x26\x3d\x77\xd8\x12\x65\x20\x33\xf6\x38\x73\x68\x0f\x64\x77\xda\x33\x07\xb0\x9d\x2c\xcf\x6a\x66\x3a\xac\x84\x90\xf9\xf3\x75\xa1\x3d\xb1\xb2\x0d\x90\xa2\x74\xb0\xe3\xd3\xc0\x25\x43\x7d\x99\x3e\x11\x74\x4a\x52\xed\xba\xcf\x0b\x1b\xbd\xda\x59\xd5\x7a\x62\x5f\x4f\x37\x07\x7a\xb5\xe6\xf8\xb5\xbc\xd9\x92\x55\x24\x79\xa2\x57\x54\x7b\xd3\xfa\xb9\x31\xe8\x59\xc4\xfc\x06\x41\xdb\xcb\xa0\x70\x0c\x55\x4f\xdf\x18\xfb\x6a\xa3\xf5\x4f\x10\xf4\x48\x80\xaf\xe5\xf1\x52\xd9\x75\x75\xbc\x8a\x9d\x00\x81\x15\x19\x01\xe2\x23\x28\xbb\x73\xff\x5d\xc6\x8a\x8f\xfc\xb7\x6d\x82\x76\x25\x1e\x82\x46\x72\x3c\xe8\xe7\x62\xd3\xfd\x12\x14\x8e\xea\x19\xe3\xcf\x24\xa8\x1a\xe6\xda\xdf\xca\x83\x02\x09\x0d\x49\x0d\x25\x3c\x46\x90\x89\x0c\xcf\x30\x04\x57\x50\x6a\x3a\xa1\x4a\x78\x0a\x43\xc9\x81\x4e\x4d\x69\xea\xd8\x24\x98\x70\x0e\x31\x23\xa6\x0e\x28\xd2\x24\xe1\x27\x4d\x22\x2d\x02\x4d\xa2\x4b\x2d\xc8\xa8\x09\xda\xcc\x90\x06\x38\xeb\xa5\x1f\xee\x66\x29\x0d\x27\x18\x32\xb9\x29\x01\xd9\xe9\x37\x93\xde\xce\x1c\x6d\x33\xf5\x36\x37\x66\x69\x99\x0e\x47\x35\xb9\xae\x15\x8b\xc4\xb5\x53\x83\x4e\x7f\x94\xea\x64\xb6\xdb\x7a\xf7\x90\x18\x34\xfd\x9c\x10\xf6\x26\x4b\x3a\xd8\x33\xd1\x5a\x58\x2d\xbc\xab\x8e\xb9\x3d\x82\xed\x9c\xf9\xbc\x16\x37\x3d\x54\x81\xa2\xda\xa4\xda\x54\x5d\x55\xa2\xb2\x30\x19\x51\x04\x72\xcb\x54\x30\x9b\xf7\x0b\xed\xcc\x7a\xd7\x98\x4c\x06\x83\x3d\xe1\x3f\xa7\x49\x94\x8d\x22\x0f\x9a\x2a\x77\x27\xa5\xb3\x59\xdc\xdf\xb3\x9b\xe5\x48\x80\x2f\xe6\xf1\xca\x8e\x99\x69\xc6\x4e\x80\xd0\x8a\x8c\x00\xf1\x11\x94\xdf\xb9\xff\xae\x75\x63\xdf\xf5\x5f\x26\xdd\x5f\x05\xa9\x78\x08\x1a\xc9\xf9\xa0\x9f\x8b\x4d\xf7\x4b\x50\x84\xeb\x50\xfd\x99\x04\x0d\x60\xb1\xf5\xad\x3c\xa8\xd2\x0c\x43\x62\xc6\x95\xe1\x01\x0f\x69\xba\x62\x3a\x92\x52\xd7\x30\x24\xca\x60\x10\x1a\x12\x23\x4c\x10\x30\x34\xdd\x30\x3c\xa8\x74\x69\xea\x90\x0a\xea\x69\x9c\x53\xa2\xe1\x13\x41\x23\xd0\x24\xba\x5c\xc1\x1d\xb9\xaa\xdf\x16\x8f\xdc\xb3\x5e\x7a\x7b\xff\xd2\x19\x41\x77\x23\xb5\xb6\xc2\x6e\xb8\x6c\xee\x36\x09\x52\x69\xf7\x66\x21\x07\x61\xb0\xb0\xf5\x7e\x30\x59\x37\x93\xdd\x80\x8f\x96\x2b\x4c\xa4\x25\x2b\xfd\xf2\x76\x6e\x26\xeb\x6d\x6d\x58\xea\xee\x1b\xe3\x76\xb5\x3d\xd6\xaa\x14\xe2\xa4\x37\xd8\x4b\x36\x37\xca\x89\xd2\xa0\xe3\xf3\x5a\xea\x79\x2d\xee\x4c\x8d\x17\x49\xe5\x82\x3d\xd7\x7b\x09\xe2\xbb\x6d\x53\x77\xba\x24\x5d\x6f\xa6\xf6\x7d\x04\x14\x9f\xf7\x7a\xfb\x4a\xd1\x18\x36\x5e\x42\x43\xec\x04\x8d\x44\x17\x37\x9d\xf6\x4f\x27\x8f\x1c\x09\x7a\x35\x90\xf9\x09\x82\x1e\x09\xf0\xc5\x3c\x9e\xab\x71\x66\xc5\x4e\x80\xad\x15\x19\x01\xe2\x23\xa8\xb8\x73\xff\x5d\xef\xf6\x78\xdf\x7f\xad\xe2\xb4\x54\x8f\x87\xa0\x91\x9c\x0f\xfa\xb9\xd8\x74\xbf\x04\xd5\x2b\x8d\x49\xfa\xcf\x24\xe8\xbe\x50\x69\x7c\x2b\x0f\x4a\x24\xd2\x35\x8d\x2b\xdd\x63\x1c\x6a\x86\x0e\x09\x01\x10\x73\x8a\xa8\xa1\x34\x1d\x32\xc0\xb9\xe2\x52\x69\xd8\x10\x8c\x01\x22\x4d\x81\xb9\xa4\x82\x9a\xc0\x63\x9e\x49\x9e\xc7\xa0\x11\x68\x12\x79\xb7\xbc\x7e\xbc\xa2\x51\xf5\xe3\xe8\x10\x9e\xf5\x52\x75\xd3\x69\x67\x04\x15\x19\x7f\xe4\xcf\xdb\xc9\x49\xbf\x9e\x4f\xf7\x7c\x51\x99\xe7\x32\xdb\x19\x2b\xe1\x02\xc8\x4c\xb7\x63\xb1\x04\x59\xb3\xbd\xcb\xe1\x49\xbf\xd1\x1b\x94\x46\x03\x77\xb6\x19\xcc\x7c\x3b\xe5\x2e\x37\x6b\x4d\x2e\xf6\x8b\x6a\x26\x67\xd3\x1c\xc0\x4d\x23\x6d\x8e\xba\xa1\xec\x2d\xf1\xf3\x6e\x96\xee\xa8\xe7\x6f\x34\x6d\xe9\xcc\x7a\xed\x56\xaa\x81\xab\x39\x3a\xcd\x0e\xd6\xc9\xcd\xa6\x90\xdb\x2f\x52\x72\xe6\x6c\x82\x7d\x21\xcd\xb4\xf6\x0f\x8e\x41\x23\xd9\x0f\x4a\x36\xaa\x7a\x96\x07\x4d\x5d\x75\xce\x9f\x20\xe8\x53\x84\xbd\x16\x17\x7d\x9f\x00\x6d\x7b\xee\x83\xd8\x09\x00\xac\xc8\x08\x10\x1f\x41\xbd\x3b\xf7\xdf\x65\xac\xf8\xc8\x7f\xfe\xd4\x4b\x98\xf1\x10\x34\x92\xf3\x41\x3f\x17\x9b\xee\x97\xa0\xd4\x6f\xb6\x66\x7f\x26\x41\x0d\xcf\x75\xbf\x95\x07\xe5\x00\x08\x8a\x98\xa4\x0a\x79\x40\x78\x58\x41\x43\x07\x04\x1a\x90\x6a\x8c\x7b\x0a\x60\x0c\xa4\x60\xba\x54\xc2\xd3\x38\x50\x8c\x9a\x88\x31\x41\x09\x47\x44\x62\x4d\xf0\x13\x41\x23\xd0\x24\xba\x3c\x18\x29\x6a\x82\x96\xb3\xc8\xc9\x9f\xf5\xd2\xeb\x99\x34\xeb\x35\x41\x79\x6e\x5f\x5c\x1d\x5c\x07\xec\x3b\xca\xb2\xb7\x1d\x95\x80\xf3\x5e\x1b\xd5\xaa\x59\x61\x15\x77\x93\xca\x6a\x55\x2a\xe2\x14\x29\x4d\xbb\x08\xb7\xb7\xad\x7c\x76\xd4\xc9\x2d\x8a\x79\x7f\x9b\x64\xe9\x55\xc8\xf2\x8b\x54\x21\xaf\x6b\x5c\x8d\x7b\x33\xbd\xe8\x97\x3b\x7e\x7d\x36\xb1\x4e\x04\x0d\xad\x7d\x7a\x19\x50\x33\x5d\x69\xee\xbc\x41\xab\x9b\xb5\x17\x26\x75\xdc\xea\x7e\x6a\x50\xb0\x4c\xeb\x7e\x73\x11\x0e\x79\x45\xba\xe1\xcb\x37\x34\x6e\x82\x9e\x45\xcc\x6f\xf4\xd8\x2d\x17\xee\x59\x1e\x34\x75\x75\xf0\xee\x4f\x10\xf4\x48\x80\x2f\xe6\xf1\x7a\xf3\x99\xda\xc4\x4e\x00\x6c\x45\x46\x80\xf8\x08\x2a\xef\xdc\x7f\xd7\x87\xa8\xbd\xef\xbf\xf5\xaa\x9d\xce\xc4\x43\xd0\xb3\x81\x7a\xdc\xb1\xe9\x7e\x09\x9a\x40\x2d\xa7\xf4\x47\x12\xd4\x71\x76\xcd\xea\xb7\xf2\xa0\x48\x19\x08\x72\x5d\x17\x90\x21\x4f\x13\x58\x28\xd3\x83\x84\x73\x68\x48\x13\x02\x2e\x19\xd3\x95\xae\x98\xce\x0c\x43\x08\xa1\x3c\x5d\x53\x44\x32\x2e\x3c\x24\x85\x12\xe2\xa4\x2c\xaf\x45\xa0\x49\x74\xf9\xdc\x15\xb9\xaa\xdf\x4e\x6b\x8d\xcf\x7a\xe9\x87\x8a\x0a\xe3\x71\x7f\x41\xc2\xf6\x56\x90\xf9\x52\xaf\xf4\xd4\x62\xd2\xe8\x8d\x5d\xb9\x59\x6a\x06\xf2\xf9\xb0\x6a\x3a\xdb\xf6\x7e\x5c\xd5\xa6\x2e\x4e\x8c\x59\x22\xb5\x74\x47\x89\xc4\x56\x89\x70\x5d\xc8\xf0\x2c\x93\x8e\x5e\x59\x1d\xdc\x5d\x53\x19\x5d\x97\x65\xfb\xf3\xed\x68\x4c\xec\xd3\x7e\xd0\x1a\x2a\xf3\x7e\x98\x1d\x81\xb0\x59\x9b\xd5\x3b\x46\x26\x31\x76\x37\x8b\xf9\x86\xeb\x6c\xa6\xca\x07\xb3\xb7\xe9\x2e\x36\x95\x5a\x98\x2c\xff\x9c\xb2\x7c\x2e\x92\xfd\xa0\xb3\x5c\xbf\x71\x96\x07\xfd\x3d\x8a\x0a\x47\x02\x7c\x31\x8f\xc7\x97\x6d\x77\x17\x3b\x01\xa8\x15\x19\x01\xe2\x23\xa8\xba\x73\xff\x5d\x8f\xd1\xde\xf7\x1f\x56\xa5\xee\x3c\x1e\x82\x46\x72\x3e\xe8\xe7\x62\xd3\xdd\x12\x34\x95\x2a\xb7\x0e\x9b\x3f\x93\xa0\xd5\x4c\xa7\xf2\xad\x3c\x28\x36\x35\x41\x85\x46\x01\xe5\x4a\xc7\x26\x67\x48\x83\x0a\x28\x83\x78\x1e\x83\x90\x50\x08\x81\xc1\x95\xd2\x34\x53\x2a\x4c\x0c\x84\x01\x63\x9c\x62\x13\x2b\xc2\x3c\x0c\xb5\x23\x41\x51\x04\x9a\x44\x97\xfd\x3b\x72\x55\x3f\x01\x9f\x8f\x7e\x6f\x59\x37\x4f\x98\xb2\x2e\x76\xb3\x04\x3b\x37\x44\x7e\x82\x39\x7a\xd5\x92\x83\xd4\xb8\x39\xb5\x80\xb7\x70\x98\x97\x26\x18\xda\x99\x56\xaf\xdc\x76\x21\xb3\x7d\x9f\xf8\x41\xa9\xcc\x6a\xba\x4f\x82\x46\x9f\x24\xb0\x00\x6d\xd5\xd3\xca\x56\x6d\x3a\xdf\x79\x15\xbb\xda\x43\x9b\x6d\x0e\x77\xd3\x74\xff\x4c\xd0\x46\x63\x5f\x2e\x5a\x7e\xb2\x5f\x58\x8f\xf2\x2a\x8d\xba\x5e\x50\xef\xa4\x9c\xdc\x26\x99\x9f\x1b\xa0\x7d\x70\x8b\x0b\xdc\x68\x99\x0c\x9e\xe9\x6e\xc6\x4e\xd0\x48\xf6\x83\xbe\xec\x6c\x3b\x12\xf4\xca\xb4\x9f\x20\xe8\x91\x00\x5f\xcc\xe3\xc9\xdc\x1e\xea\x71\x13\xe0\x18\xab\xa3\x21\x40\x7c\x04\x1d\xdc\xb9\xff\xae\x59\xf8\xbe\xff\x92\xd4\xa2\x31\x11\x34\x92\xf3\x41\x3f\x17\x9b\xee\x97\xa0\xe9\x61\x7b\xd4\xfc\x33\x09\xda\xed\xf7\x4b\xdf\xca\x83\x0a\x80\x3c\xc5\x25\x43\x44\x07\x3a\xf7\x88\x4e\x14\xd2\x81\xc9\x10\xd0\x19\xd3\x0c\x46\x35\xc6\x20\xe6\x48\x79\x10\x6b\x0a\x32\x88\xb8\x61\x0a\x48\x0d\xa8\x08\x66\xe8\x34\x8b\x8b\x22\xd0\x24\x1a\xde\xf2\xfa\xf1\x8a\x84\xa0\x99\x1c\x80\xe2\xac\x97\x7e\xa8\x49\x34\x69\x66\x27\xa4\x34\x31\x3a\x75\x3d\x08\x72\x01\x6e\xd6\x9a\x39\xbf\x16\xd6\x86\x3d\xd7\x11\xb5\x75\xc6\xc3\x13\xbe\xc7\x68\xe6\xfb\x2a\xb4\xed\x59\x69\xdc\x57\x87\xa0\xdf\xdb\x55\xd3\x53\x2b\x97\xdb\x24\xeb\xdd\x71\x38\x4e\xe5\x0c\x59\x1f\xef\xec\x7e\x2f\x55\xef\xd6\xdd\x67\x45\x85\x6d\x1a\x19\xfa\xa8\x3d\x60\x66\x7b\x42\x35\x9b\x95\xb3\x0b\x5f\x06\xc5\x45\xa6\x54\x33\x33\x36\x65\x8e\x21\x45\x36\x97\x83\x8d\xd1\x0f\xce\xe2\x46\x92\x07\x6d\xa9\x66\xfb\x2c\x0f\xfa\x7b\x34\x89\x06\xbf\x5e\xbd\xba\xde\x27\x80\x4a\x5a\xb5\x62\xec\x04\x70\xac\xc8\x08\x10\x1f\x41\x87\x77\xee\xbf\xcb\x58\xf1\x81\xff\xb2\x99\x34\xdc\xc7\x34\x8b\x1b\xc9\xf9\xa0\x9f\x8b\x4d\xf7\x4b\xd0\x8c\xd6\x69\xa0\x3f\x93\xa0\x83\x95\x28\x7c\x2b\x0f\x8a\x35\x89\x0d\x45\x95\x27\xb8\x81\xa8\xa0\x18\x4b\x48\x88\x2e\x4c\xc5\x3c\x48\x25\xa7\x94\x1a\x9e\x41\x75\x0a\xa5\x22\xd2\xd4\xa1\x4e\x4d\x2a\xb9\x2e\xa1\x20\x92\xca\x67\x82\x46\xa0\x49\xe4\xdf\xf2\xfa\xf1\x8a\x46\xd5\x6f\x0f\x32\xf8\xac\x97\x5e\x6f\x18\xb7\x5e\x13\x94\x35\x02\x47\x24\x8b\x3b\x16\xa0\xbe\x3e\x68\x85\xcd\x21\x74\x55\x69\x34\x69\x62\xaa\x37\xdd\xe2\x60\xb5\x36\x2b\xc3\x45\x93\x3a\x87\x86\xab\x8d\x32\x76\x67\x50\x4b\x04\x5e\xa1\x35\x6b\xe6\x6b\xf5\x96\x81\xd3\xd5\xc1\x62\xeb\x0c\x44\x2e\x95\x9d\x07\x1b\xc6\xc2\x50\xc3\xe9\xd3\x18\xd4\x5d\xd7\x93\x23\x73\x8f\xaa\xe5\xa1\x83\xdb\xed\x70\xa6\x83\x9e\x8e\xfd\x1c\xc4\x2c\x65\x40\xbd\x93\x09\xa6\xd5\xd5\x3a\x97\xd1\xab\x3f\x47\xd0\xb3\x88\xf9\x8d\x1e\x5b\x2a\xb9\xdd\xb3\x3c\xe8\xb5\x78\xc0\x4f\x10\xf4\x48\x80\x2f\xe6\xf1\x86\xae\x29\x86\xb1\x13\xe0\xe6\xd3\xe2\x3f\x23\x40\x7c\x04\xf5\xef\xdc\x7f\x97\xb1\xe2\x23\xff\xe5\xb4\x39\x8a\x67\x25\x91\x7d\x56\x54\xdc\xb1\xe9\x7e\x09\x9a\x2f\x75\x6d\xfe\x67\x12\x74\x91\x52\xb9\x6f\xe5\x41\xa5\x34\x75\xaa\x13\x4f\x09\x66\x50\x81\x91\xc0\xc0\xc0\x08\x1a\x0a\x79\x5c\x78\x86\x60\xa6\x41\x75\x8c\xb8\x69\x20\x2e\x4c\x46\x3c\x81\x95\x46\x28\x55\x26\x85\x42\xf7\x8c\x13\x41\x23\xd0\x24\x1a\xdd\xf2\xfa\xf1\x8a\x46\xd5\x2f\x5c\xa5\x4e\xf9\xa7\xa7\xd5\x2d\xe9\x9b\x4e\x3b\x23\xa8\x96\xd9\x06\x72\xd6\x2d\xb4\xab\x4d\xdf\x0c\xf6\x9d\xdc\xbe\x52\x4a\x80\x6d\xa9\xee\xf9\xe3\xf4\x36\x85\x17\x5e\xa5\x30\x1d\x25\xaa\xae\x4f\x19\x18\xd5\x07\x23\x37\x9b\x84\x49\x27\x6c\x2c\x28\x25\x0b\x63\xda\xda\x74\x89\xd1\xb5\x47\xad\x6c\x2e\xb1\x54\x06\x48\x25\xec\xcc\xf3\x4a\x22\x63\xce\xb2\x5d\xb5\x9f\x8d\x9c\x9a\x93\x02\xe5\x2e\x35\x37\x15\x55\x9c\xe0\x7e\x7a\xdd\xad\xd2\xe9\x04\x39\x74\xe2\xd7\xa6\xa9\xdd\xea\x65\xd9\x66\xec\x04\x8d\x24\x0f\xfa\x12\x0c\x8e\xba\xb8\xbf\x45\x93\xe8\x48\x80\x2f\xe6\xf1\x86\xe6\xc2\x4b\xc6\x4e\x80\xb2\x15\x19\x01\xe2\x23\xe8\xe8\xce\xfd\x77\x19\x2b\x3e\xf2\x5f\x7e\xd4\x21\x3c\x1e\x82\x9e\xf9\x24\xee\xd8\x74\xbf\x04\x2d\x0e\xba\xbb\xe4\x9f\x49\xd0\x43\xdb\xcf\xbe\x9f\x07\xfd\xeb\xaf\x7f\xff\xfb\xaf\x7f\xff\xfb\x21\xcd\x56\xec\x41\x05\xcb\x87\x0a\x9b\xca\xff\x3c\xac\xe7\x83\x25\xf3\xe4\x89\xa8\xff\x7d\x68\xee\xe7\xf2\x3f\x0f\x4d\x2b\x55\x72\x1e\xd2\x56\xd3\xfa\xef\x43\x43\x0c\xe5\x94\xfd\xe7\x61\xbe\xe6\x13\x5f\xfc\xf7\xa1\xba\x9d\xc9\xe5\x7f\x1e\x1e\x0b\xfb\xeb\x15\x97\x5f\x17\xf5\x0b\xce\xda\xdf\x0f\xf0\x55\xac\x0c\x5f\x62\xe7\x0d\xba\xbf\x5d\xca\xaf\xf1\xed\xd6\xaa\xb9\x63\xeb\xaa\x94\xe7\x16\x1e\x1b\xc6\x84\x08\xd6\xb3\x95\xf7\xd8\xdc\xb3\xd7\xff\x9b\x8f\xe5\xaf\x66\xda\xd5\x4a\xa3\x59\xb7\xf2\x95\xe6\x07\xcd\xb4\x4a\x4d\xa7\x7e\xf2\x4a\xb5\x52\xea\x9d\x97\xf8\xd7\xc3\xc3\xc3\x83\x95\x4e\x9f\x95\x76\x55\xe1\x43\xad\x9e\x2f\x5b\xf5\xde\x43\xd1\xe9\x3d\xfc\xeb\xf4\x5b\xdf\xfb\xfb\xe1\xf1\x2f\x66\x6c\x2a\xdf\x32\x3f\xfc\xf5\x22\x5a\xc3\xc3\x77\xac\x0e\xdf\x33\xf9\xca\x50\xce\x66\x8f\xff\x45\x64\x1e\x67\xb3\x5b\x96\x3d\x57\xf0\xda\xa8\x59\xe0\xc9\x1b\x16\x4d\xa4\x37\x90\xcb\xa1\x64\x9e\x5c\x86\xaf\xdf\xfd\xef\xf8\x2e\x94\x8b\xff\x45\x62\xee\xab\xc2\x6f\x19\xfe\x4e\xed\x0f\xad\x4a\xde\x6d\x39\x0f\xff\xfa\xf5\xd3\x2f\xb5\x24\x1a\x7f\x7f\xb1\x01\xd7\xf7\xe0\xf4\x7b\x16\x0e\xaf\xac\x0f\x94\x7a\x34\xfb\xf8\x4f\x44\xf6\x1e\x0b\xbb\x65\xe8\x59\x35\xaf\x2d\x7c\xfa\xc5\x8d\x6e\x32\x97\x8f\xd6\x3d\xfd\x3f\x22\xe3\x9e\xca\xba\x65\xdb\x4b\x25\xaf\x4d\xf3\xe7\x7f\x3f\xcc\x83\xe5\xea\xda\xb6\xc7\xfa\xc2\xe1\x62\x2d\xd7\xf2\xd5\x9b\xa8\x2c\x3d\x2b\xf2\xa6\xc1\x97\x55\xde\xba\xe9\xb7\xac\x0e\xd7\xfc\xf4\x4f\x74\x96\x86\x6b\xfe\x86\x8d\xcf\xd5\xbc\xb6\x6e\x29\xc3\x1b\xb7\x7b\xb1\x0e\x96\xeb\xa9\x3f\x53\xc1\xd9\xcb\x88\x8c\x7c\x29\xf0\x96\xa1\x17\xd5\x7d\x2a\x86\x85\x62\x7e\xfc\x58\x78\xf6\x32\x22\x6b\x5f\x0a\xbc\x65\xed\x45\x75\xaf\xad\x5d\x84\x72\x75\xf3\xbb\xfe\x08\x6b\x19\xae\xd8\x4a\x9e\xbd\x8c\xca\xde\x5f\x05\xde\xb4\xf7\x75\x75\xaf\xed\x7d\xfa\xf9\x4d\xbe\xae\x96\xeb\x70\x35\xf1\x67\x32\x3c\x7b\x19\x91\xc1\x2f\x05\xde\x32\xf8\xa2\xba\x37\x1f\x0d\xfc\x30\x5c\xcb\xe5\xdf\x0f\x2c\x0c\xe5\x4a\x04\xde\x8d\x36\xec\x94\xfc\xf5\xa0\x74\xfe\x26\xaa\x76\x9c\x15\x79\xb3\x25\x97\x55\xde\x8a\x12\xa1\x5c\xfc\xfd\xb0\xda\xf9\x33\x4f\xee\x6e\xb4\xe0\xc5\xfc\xa8\x6d\x7f\xd7\xf0\x6f\x59\x7d\xf1\x88\xfa\xfa\x6d\x44\xf6\xbf\x2e\xf4\x56\x23\x6e\x54\xfb\x66\x4b\x4e\x7f\x7b\xbb\x39\xa7\x3e\xc7\xd9\x84\xcd\x84\x0c\x9f\x6d\xcf\x57\xd2\x4e\xf7\x03\xb3\xed\xba\x63\x35\x9d\xe3\x9f\x5e\x96\xf3\x50\xad\xbc\x3c\xc5\xb6\x1a\xf9\x4a\xf6\x81\xaf\x96\x52\x3e\xfc\xeb\xf4\x17\xff\xe7\xa1\x93\x73\xea\xce\xaf\xf7\x0f\xff\xef\xff\x3e\x40\xf0\x7c\x5d\x3f\x68\xca\x70\x75\x64\xf9\x63\x2b\xfe\xb1\x95\xaf\x8b\x79\x34\xf2\xf4\x9c\xf2\xca\xc4\x50\x4e\x26\xfe\x6c\xf0\xf4\xdd\xfb\xfb\x81\xaf\xf7\x2f\x6f\xe6\x4b\x5f\x5c\x7f\x17\x1f\x6f\x03\xdf\x87\x72\xf1\x8f\x0d\xfb\x55\xc2\xa3\x4d\x2f\x5f\x8c\x57\x66\xbd\xfd\xa8\xf8\xf8\xe7\x4a\xca\xef\x9b\xf0\x5c\xc8\xd1\x8a\xb3\x00\xf3\x49\x43\x4e\xbf\xf9\x9e\x21\xe7\x85\x3c\x1a\xf2\xfa\x41\xf8\x93\x96\x84\x62\x2e\x67\x9b\x6f\x5a\x72\x5e\xc8\xa3\x25\xa1\x98\x7f\xd1\x21\x2f\x40\xfd\xb6\x25\xe7\xe5\x9c\x8c\x79\x7e\x4a\x78\x6d\x0c\x0b\x57\x6f\x1b\x74\x16\x38\xbe\x67\xd1\x65\x41\x8f\x26\x5d\xc4\xc6\x0f\x7d\x54\x0b\xc2\xd5\x60\x29\x1b\x6e\xe9\x69\x2c\xcc\x59\x28\x1f\xbc\xf5\x74\xfe\x20\x82\xe9\x7c\x22\x57\xf2\xa9\xda\xff\x1f\x00\x00\xff\xff\xde\xab\xf0\xb5\x16\x04\x02\x00") - -func order_books_310CoreSqlBytes() ([]byte, error) { - return bindataRead( - _order_books_310CoreSql, - "order_books_310-core.sql", - ) -} - -func order_books_310CoreSql() (*asset, error) { - bytes, err := order_books_310CoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "order_books_310-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x28, 0x94, 0x48, 0x4f, 0x7f, 0xf6, 0x68, 0xb5, 0x84, 0xf3, 0x47, 0xa8, 0x1f, 0x37, 0x37, 0x69, 0x9, 0xa7, 0x84, 0x48, 0xe6, 0xa2, 0x5, 0xa1, 0xeb, 0xad, 0x22, 0xa1, 0x2f, 0xa2, 0x3e, 0x82}} - return a, nil -} - -var _order_books_310HorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x79\x6f\xeb\x3a\x92\x37\xfc\x7f\x7f\x0a\xe3\x62\x80\xd3\x8d\x9c\xdb\xe6\x2e\xf2\xf6\xd3\x0f\x20\xef\xfb\xbe\x0f\x06\x01\x25\x51\xde\x97\x78\xb7\x07\xcf\x77\x7f\x11\xdb\x89\x1d\xc5\x4b\x22\xcb\xbe\xbe\xfd\x1e\xde\x99\xd3\x91\x25\x55\x91\x55\x2c\xd6\x8f\x64\xa9\xf8\xfb\xef\x7f\xfb\xfd\x77\x5f\x6e\x38\x99\x36\xc7\xaa\x98\x4f\xf9\x2c\x39\x95\x86\x9c\x28\x9f\x35\xeb\x8f\xfe\xf6\xfb\xef\x7f\x7b\xbd\x1f\x9a\xf5\x47\xca\xf2\xd9\xe3\x61\x7f\xff\xc0\x5c\x8d\x27\xed\xe1\xc0\x27\xfe\xc9\xfe\x09\x0f\x9e\x32\x56\xbe\x51\xf3\xf9\xf5\x75\xc7\x23\x7f\x2b\x86\x4b\xbe\xc9\x54\x4e\x55\x5f\x0d\xa6\xcf\xd3\x76\x5f\x0d\x67\x53\xdf\xbf\x7d\xe0\x5f\x9b\x5b\xbd\xa1\xd9\xfd\xfc\xab\xd9\x6b\xbf\x3e\xad\x06\xe6\xd0\x6a\x0f\x9a\xbe\x7f\xfb\x7e\x94\x4b\x11\xfe\xe3\x5f\x6f\xe4\x06\x96\x1c\x5b\xcf\xe6\x70\x60\x0f\xc7\xfd\xf6\xa0\xf9\x3c\x99\x8e\xdb\x83\xe6\xc4\xf7\x6f\xdf\x70\xb0\xa3\xd1\x52\x66\xf7\xd9\x9e\x0d\xcc\x69\x7b\x38\x78\x36\x86\x56\x5b\xbd\xde\xb7\x65\x6f\xa2\x3e\xb0\xe9\xb7\x07\xcf\x7d\x35\x99\xc8\xe6\xe6\x81\x85\x1c\x0f\xda\x83\xe6\xbf\x76\x75\x57\x72\x6c\xb6\x9e\x47\x72\xda\xf2\xfd\xdb\x37\x9a\x19\xbd\xb6\xf9\xf3\xb5\xb1\xa6\x9c\xca\xde\xf0\xf5\x31\x3d\x55\x0a\x17\x7c\x25\x3d\x90\x0a\xfb\xe2\x11\x5f\xb8\x16\x2f\x96\x8a\xbe\x6c\x26\x55\xdf\x3d\xff\xcf\x56\x7b\x32\x1d\x8e\x57\xcf\xd3\xb1\xb4\xd4\xc4\x17\x2a\x64\x73\xbe\x60\x36\x53\x2c\x15\xf4\x78\xa6\x74\xf0\xd2\xc7\x07\x9f\xcd\xe1\x6c\x30\x55\xe3\x67\x39\x99\xa8\xe9\x73\xdb\x7a\xb6\xbb\x6a\xf5\xaf\x7b\x30\x34\x37\x7f\xdd\x83\xe5\x6b\xbf\xba\x5f\x03\xb7\xdc\xbe\xdf\xba\x6d\x05\x5f\x3b\xf2\x39\x66\x07\x4f\xed\x89\x6f\x1e\x8f\x67\x42\xe1\xda\xc1\x93\x3b\xb2\x9b\x5a\x3d\x2b\xdb\x56\xe6\x74\xf2\x6c\xac\x9e\x87\x63\x4b\x8d\x9f\x8d\xe1\xb0\x7b\xfe\xc5\xf6\xc0\x52\xcb\xe7\x83\xc6\x0d\x26\x72\xd3\xd1\x27\xcf\xc3\xc1\x73\xdb\xfa\xce\xdb\xc3\x91\x1a\xcb\xf7\x77\xa7\xab\x91\xba\xe2\xed\x7d\x4d\xae\xaa\xc5\xf7\xde\xed\x29\xab\xa9\xc6\x9b\x17\x27\xea\x65\xa6\x06\xe6\xb7\x9a\x70\xf0\xfa\x68\xac\xe6\xed\xe1\x6c\xb2\xfb\xed\xb9\x25\x27\x2d\x97\xa4\xae\xa7\xd0\xee\x8f\x86\xe3\x57\x73\xdc\x8d\xa9\x6e\xc9\xb8\x95\xa5\xd9\x1b\x4e\x94\xf5\x2c\xa7\xdf\x79\xff\xad\x33\xbb\xe8\x4a\x3b\xbb\x74\x51\xe9\xc3\x37\xa5\x65\x8d\xd5\x64\x72\xfe\xf5\xd6\x74\x6c\x6d\xfc\xce\x73\x6f\x38\xec\xce\x46\x5f\x78\x7a\x74\xa9\x4a\xdb\xa7\x64\x7b\xfc\x4d\xc2\x6f\x83\xee\x97\x5f\x78\x1d\x27\x6c\x5b\x8d\xbf\xf6\xe8\x1b\x79\x17\xaf\xec\xc4\xfa\xb5\x97\x36\x43\xeb\x37\x98\x1c\x0e\xc5\x97\xde\x18\xbd\xbe\xd0\x9a\x5e\xd4\xc0\xe4\xc3\x00\x64\xac\x2e\x76\xa3\xd6\xbb\xa5\x7f\xe5\xe1\xe1\xb6\x1e\xc3\x8b\x0f\xb6\x27\xd3\xe7\xe9\xf2\x79\x74\x99\xe4\xeb\x93\xc3\xd1\x57\x9f\x54\x5f\x7d\xec\xcd\x95\x9c\x7f\xd8\x78\x33\xf7\x8b\x8f\x5d\x1e\xc5\x8c\xd5\xd7\x94\xb9\xf5\x91\xaf\xd2\x9e\x4c\x66\x97\x38\xbf\x3f\x6c\x0e\x2d\xf5\x4d\x5c\xf0\xde\x0d\x46\x72\x3c\x6d\x9b\xed\x91\x1c\x9c\x75\xde\x97\x5e\x7d\x1e\x7d\x13\x9b\xbc\x7b\xb4\xef\xd6\xe0\xf8\x8b\xdf\xe6\xbf\x11\xde\x57\xf8\x6d\x1f\xbc\x39\xfd\xad\x32\x5f\x35\xb9\xfb\xf3\xd5\x3f\xbc\x41\xbf\x4d\x67\x78\xfe\x62\x0d\x9a\xc3\xf1\xe8\xb9\xdf\x6e\xee\x00\xc3\x99\x2a\x38\x9e\xfc\x72\x1b\xbf\x8f\xf7\xce\x51\xfe\x6a\xe7\xdc\xbe\x1d\xcc\xa6\xca\xe9\x8c\xaf\x6d\x6d\x39\x87\xc2\x11\xbd\x9c\x2a\x7d\x91\xf6\x89\x4e\xe7\x01\xe5\x9d\xba\xcf\x53\xda\x5c\x7d\xbd\xf9\x6f\x5e\xba\x18\xce\x97\xc3\x99\xa0\x0b\x99\xbd\xe2\xec\x89\x7a\xf9\x36\xe7\x0f\x44\xbe\xfc\xb6\xa5\xbe\xf8\xec\x1e\xcd\x7e\xb9\x85\x27\xac\xfe\x3b\xed\x3b\x4e\xe2\x6b\xef\xee\x70\xdf\xd7\x1e\xde\x81\xbc\x2f\xb7\x6d\x37\x02\x7c\xa7\x2d\xdb\x57\xbe\xf8\xec\x0e\xfe\x7d\xbd\x3e\x6f\x78\xf1\x2b\x35\x72\x8c\x21\xe7\x1f\x3e\x18\x12\x76\x0f\xea\xd1\x68\x21\x1c\xd5\x4b\x47\x1e\xee\xb7\x5f\x67\x1c\x6d\x53\xfd\x7d\x30\xeb\xab\x71\xdb\xfc\xef\xff\xf9\xc7\x17\xde\x92\x4b\x17\x6f\xf5\xe4\x64\xfa\x77\x39\x58\xa9\xde\x66\x29\xe6\x0b\x6f\xd8\xed\xf1\xd1\x57\x22\xe5\x4c\xb0\x14\xcf\x66\xce\xb4\xe7\x59\x36\x9b\xfb\xda\xfd\xf4\x7d\xaa\xe8\x19\x1a\x6f\xad\xbb\x82\xc6\x6b\x5b\x37\xaf\xef\x2b\xff\xd3\xf7\x9d\x86\x6c\x9a\xfe\x05\x0a\xe1\x5a\x29\x9c\x29\x3a\x48\xf4\x46\xcd\xc9\x4b\xef\xad\x2f\x06\x63\xe1\xb4\xfe\x89\xc3\xbf\xfe\xb6\x5d\x85\xcb\xc8\xbe\xfa\xe3\xed\x37\x5f\x69\x35\x52\x7f\xec\x5e\xf9\x97\xaf\x68\xb6\x54\x5f\xfe\xe1\xfb\xfd\x5f\xbe\xec\x62\xa0\xc6\x7f\xf8\x7e\xdf\x2c\xce\x05\x0b\xe1\x57\x7d\xed\x28\xbf\xd1\xfb\xdb\x07\x8a\x1f\x6f\xee\x08\x07\xb3\xe9\x74\x38\x53\x3a\x43\x79\xfb\x80\x2f\x9b\xf9\x48\xc0\x17\x2f\xfa\x7e\xbc\x2d\xbb\xbd\xfd\x36\xd9\x10\xf9\xe1\xe4\xfc\xd6\xfc\x1d\xcf\x77\x09\x5d\x6c\xcf\x07\x59\x66\xb2\x25\x87\x3c\x7d\xd5\x78\x29\xf6\x5e\xad\xc3\xf5\xb7\x0f\xec\xf7\x54\x1c\x15\xf9\x4e\xe3\x3f\x11\xd9\x08\x20\x97\xf2\x8f\x9a\xc5\x7c\xca\x37\x1a\x0f\x4d\x65\xcd\xc6\xb2\xe7\xeb\xc9\x41\x73\x26\x9b\x6a\x23\x86\x2f\xae\x17\x1e\x56\xf7\x72\x47\xdb\x55\xff\xad\xaf\xee\xeb\xff\xa6\xdb\x63\xb2\x7c\xef\xd9\x17\xe9\xfb\x0a\xe1\x52\xb9\x90\x29\x1e\xfc\xf6\x37\x9f\xcf\xe7\x4b\xe9\x99\x68\x59\x8f\x86\x7d\x9b\xd6\xa7\xd3\xe5\xed\x78\x57\x2c\x15\xe2\xc1\xd2\xe6\x09\xbd\xe8\xfb\xaf\xe7\xff\xf2\x15\xc3\xa9\x70\xb0\xe4\xfb\x2f\xf8\x7a\xe5\xd4\xc6\x45\x43\xbc\xae\x75\x97\xc8\x7b\xd6\x38\x74\xac\x71\x5f\x19\xa9\xae\x6b\xdf\x17\x38\xbc\x37\xf1\xfd\x27\x57\x2d\xfc\xfb\xdf\x7c\xbe\xa0\x5e\x0c\xfb\xaa\xb1\x70\xc6\xf7\x5f\xf0\xbf\xe1\xff\xf8\xff\x0b\xfe\x37\xfa\x9f\xff\xfb\x5f\x68\xf3\x37\xfa\x6f\xf4\x3f\xbe\xd2\xf6\xa6\x2f\x9c\x2a\x86\x5f\x85\x12\xce\x84\xfe\x71\x54\x32\x5f\xf0\x03\x57\x4a\xe6\x32\x87\x5b\x4b\xe6\xff\xb8\x91\xcc\x67\x9f\xba\x93\xc3\xbb\x1f\xfe\x9a\x20\xf6\x6e\xfb\x13\xc5\x4d\x8d\x7d\xbe\xe2\xab\xac\x7c\xff\xde\x8f\x00\x3f\xb7\x3f\x97\xea\xb9\xb0\xef\xdf\x87\x16\xf1\x8f\x63\x56\xeb\x69\x1d\x9d\x04\x1d\x55\x7c\x33\xe3\xaf\xd7\xf0\x28\x04\xba\xb6\x96\xc7\x88\x3a\x6a\xfa\xc1\x20\x3f\x56\x77\xdf\xcb\x3e\xd7\xf6\x18\xcc\xbb\xba\xb6\x47\x88\x3a\x6b\x7b\x68\x24\x67\x6b\xfb\xea\xb9\x2c\x65\xcb\x59\x6f\xfa\x3c\x95\x46\x4f\x4d\x46\xd2\x54\xbe\x7f\xfb\x7e\xfc\xf8\xd7\xc7\xbb\x8b\xf6\xb4\xf5\x3c\x6c\x5b\x07\x5b\x69\x1f\xda\x7a\x88\x7f\x77\x4d\xdc\x18\xd8\xd7\x9a\xb7\xb5\xc5\xc3\xc9\xf7\xb6\x45\x6d\xcb\x67\xb4\x9b\xed\xc1\x74\x03\x0c\x32\xe5\x54\x6a\xdb\x1c\xd9\x7f\x85\xf1\x3e\xb3\x25\xc7\xd2\x9c\xaa\xb1\x6f\x2e\xc7\xab\xf6\xa0\xe9\x78\x6c\x30\xeb\xbf\x43\x7e\x5f\x7b\x30\x55\x4d\x35\x76\x3c\x62\xf7\x64\x73\xe2\x9b\xf4\x65\xaf\xf7\x99\xcd\x74\xd8\xef\x7d\x66\xf2\x77\x44\xe9\x3f\xde\x9f\xfc\xac\x76\xe7\xbc\xc1\xad\x38\x9c\xab\x1d\xef\x22\x99\xaa\xe5\x27\x81\x8c\x46\xbd\xf6\x66\xcd\xde\x37\x6d\xf7\xd5\x64\x2a\xfb\x23\xdf\xab\xce\x36\x97\xbe\xf5\x70\xa0\x3e\x57\xf4\xd4\xac\xe8\x0d\x8f\xee\xa6\x53\x5f\xab\xf3\xfb\xe4\xeb\x04\xd5\x5d\x37\xd4\x0b\xa5\x2d\xa2\x83\x9b\x1f\xe2\x99\x60\x21\xbc\x81\x5f\x81\xfa\xee\xa7\x4c\xd6\x97\x8e\x67\x2a\x7a\xaa\x1c\x7e\xbf\xd6\x6b\xfb\xeb\xa0\x1e\x8c\x85\x7d\xf0\x52\x63\x5c\x8b\xdd\x49\xe8\x53\x57\xdc\x2d\x7a\xf8\x06\x6a\x39\x9d\xcb\xde\xdf\x7f\x9c\x68\xf1\x8f\x3f\xfe\x18\xab\xa6\xd9\x93\x93\xc9\x3f\x9c\xea\xda\xee\x55\x1c\xe9\x5b\x8c\xfc\xe3\x8c\xa2\xb6\x73\xe3\xab\x5b\xb6\x5d\xd1\x79\x6f\xd7\x71\xcb\xd8\xaf\xd5\x1d\xaf\xe6\xd1\xc7\xcd\xa1\x75\xec\x71\x88\x8e\x3f\xbe\x5d\xfe\x3b\xf2\x02\x65\xe7\x2c\xec\xf8\xf2\x82\x47\xdd\xf6\x90\xe6\xdd\x3a\xed\xb9\x86\xf8\xb2\xd5\x4c\x38\xe4\x0b\xd4\x2f\xb4\x68\xbb\x42\x77\xbe\x41\xef\xb4\x1c\xb7\xff\xd9\xb6\x4e\xd5\xed\x6d\xcd\xe7\xda\x5e\xb7\xa3\xb3\xeb\x76\x0e\x9b\x79\x3e\x35\xd2\x7f\x5e\xe2\x3a\xf5\xe4\x6f\x9b\x8d\x8f\xdf\x4e\xf4\xe6\x4d\x3f\x3e\x7e\xcb\x52\x53\xd9\xee\x4d\x7c\x9d\xc9\x70\x60\x9c\xee\x6c\x6f\x0b\x65\xd7\xca\x61\x47\x67\x27\x87\xb7\x7d\xeb\x13\x75\x3b\xd8\x4c\xfe\x92\x15\x1e\xdb\xc7\x3e\xfe\xe2\x4e\x2c\x07\x2b\xa3\x1b\x45\xbc\xd7\xe3\x6d\x94\x03\x0e\x0e\x7b\x45\x7c\xed\xf9\xf7\xcd\x64\x87\x63\x1a\xce\xa6\x7b\xdf\xe4\x7c\x67\xac\xe4\xf4\xe2\x4b\xdb\x67\x67\x23\xeb\xcb\xcf\xbe\x77\x9d\xdd\xa5\x63\x9f\xfd\x53\x5b\xe0\x27\x3c\x30\x95\xbd\x67\x73\xd8\x1e\x4c\x8e\xf7\x41\x5b\xa9\xe7\xd1\x70\xd8\x3b\x7e\x77\xb3\xf3\x69\xab\x53\xba\xde\xdc\x1e\xab\x89\x1a\xcf\x4f\x3d\xf2\x8a\x43\xa7\xcb\xe7\x0d\x4c\x6a\xaf\x4f\x3d\x35\x1a\x0f\xa7\x43\x73\xd8\x3b\xd9\x2e\xa7\x8e\xde\x3a\x8b\x92\x96\x1a\x6f\xe0\xc5\xf6\xf7\xc9\xcc\x34\xd5\x64\x62\xcf\x7a\xcf\x27\x3b\xca\xae\xe1\xb2\xdd\x53\xd6\xe9\xa7\x4e\x9b\xd5\x89\xb5\xeb\x6b\xad\xec\xc4\x7e\xc8\x05\x9f\xf7\xf5\xd1\xe6\xf2\xf8\xf5\xdd\x26\x7b\xeb\xc6\xce\xf2\xb8\x97\x5b\xfb\x56\x43\xaf\x74\x73\x67\x79\x7d\x76\x7b\xc7\x1f\x3f\xe3\x06\x0f\x76\x76\x3c\xeb\x9b\x97\xa6\x39\x1f\xa3\xaa\x4e\x4c\x85\x5e\x91\xbf\xb9\x6d\xca\xc6\x03\x5e\xe9\x00\x77\x96\x3f\x9c\x8d\xcd\xf7\x30\x8d\x13\xae\xe7\x6d\x38\xf9\xf1\xe3\x8f\x3f\x4e\x4f\xc5\x4e\xdb\xc1\x6e\x63\xed\x5a\x71\xee\x62\x01\xff\xee\x29\x5e\xd8\x0d\x89\x6e\xbc\xd7\x26\x16\xe6\x24\x5b\x47\x24\xe2\xb9\x87\x76\xc1\x91\xe7\x1e\xd9\xce\x83\x8f\x3e\xf0\x39\xa6\xf3\xc2\x73\x67\xd9\xbd\x3f\x75\x86\xe3\xa6\x4a\xed\xc9\xf3\x44\xf5\x7a\x6a\xec\x33\x86\xc3\x9e\x92\x83\x37\x9f\xd4\x36\xd5\xf3\xe0\x83\xff\xdd\xfe\xf6\xd1\x27\xef\xa3\x89\x9e\x1d\xde\xfa\x43\x3c\x93\xf3\xe6\xc1\x36\xfd\xd1\xc8\xcf\x4d\xad\x9f\x37\xb1\xc1\xbe\x60\x2c\x1c\x4c\xfa\xfe\xfe\xf7\x43\x09\xfe\x5f\x1f\xf8\xc7\x3f\x2e\x91\x3a\xf6\xfa\x9b\xd0\xfe\xcf\x27\x39\x7e\x81\xde\x07\x99\x3a\xc8\x3b\x04\xbe\xa9\xe0\x59\x53\x3a\xbe\xc3\xed\x81\x71\x1d\x8f\x59\xf8\xa2\x27\xfd\xca\x10\x76\x8d\x2f\xbd\x14\x1f\xe0\x8d\x37\xbd\xc0\xe5\x5e\xfe\xf4\x9b\x8d\xbd\xd2\xa3\x5e\xe0\xf6\xd9\xa7\x9e\x7a\xe1\x8c\x57\xfd\x10\x13\xe2\x61\x5f\x7d\xeb\x9f\x87\x55\xfa\xf2\x24\x6a\x37\xf6\x5f\x98\x9a\x7d\xd5\xf1\x9e\xf7\xa1\x47\x9f\xdd\xb3\x3e\x6a\x2f\xaf\xb3\x80\xd3\xd3\x88\x53\x13\xb4\x3f\x65\x8a\x35\x5d\x3e\xab\xc1\x5c\xf5\x86\x23\x75\x6c\xd9\x72\xba\x7c\x9d\xf0\xcc\x7a\xd3\x13\x37\xfb\x6a\x2a\x4f\xdc\x7a\x9d\x6a\x9d\xba\x3d\x69\x37\x07\x72\x3a\x1b\xab\x63\x2b\x6c\x82\xfd\xe3\xbf\xff\x67\x8f\x5d\xfe\xf7\xff\x1d\x43\x2f\xff\xfd\x3f\x4e\x99\xab\xfe\xf0\xc4\x62\xd8\x9e\xd6\x60\x38\x50\x67\xb1\xd0\x9e\xd6\x67\x32\xbb\x96\xb5\xfb\xea\xd9\x18\xce\x06\xd6\x66\xc5\x9a\x8f\xe5\xa0\xa9\x9c\xb3\xb1\x8f\xae\xf5\x55\x12\xaf\xd4\x9a\xca\xba\x3c\xdd\xda\xad\xfd\xb5\xad\x37\x6b\x7b\x0b\xe1\xfa\xca\x10\xb1\x35\xb7\x4d\xbc\xdc\x85\xe8\xb0\x62\xb8\x74\x66\x9d\xf4\x70\x45\xea\x70\x95\xf4\x7b\xf3\x08\xef\x1a\xf1\xc5\xe0\xb9\xb3\x8d\x3a\x3b\xff\xf8\x4a\x23\x4f\x7a\x5a\xcf\x9a\xf9\xe5\xf8\xc3\xb3\x0d\xbd\xe0\x16\x8e\x37\x35\x24\xa7\xd2\x67\x0f\xc7\x17\x76\x8b\x7c\x21\xbd\xa4\x5f\x68\x5e\x3c\x53\x0c\x17\x4a\xbe\x78\xa6\x94\xfd\xb0\x63\xb4\xf1\xa2\x45\xdf\xdf\xe1\x4f\xdf\x0f\x08\xf6\xe5\xc7\x4f\x1f\xfa\xe9\x03\x3f\x7d\x3f\x7e\xfc\xe3\x5f\x17\xdf\x46\x67\xdf\x3e\xd1\x9c\x73\x3b\x3e\xdf\x6d\x92\x73\xd7\xe7\xad\x62\x3f\xe0\x73\x7b\xd0\x9e\xb6\x65\xef\x79\x1b\x81\xf3\xcf\xc9\x4b\xef\xc7\x4f\xdf\x0f\x04\xa0\xf8\x1d\xb0\xdf\x01\xf6\x41\xfe\x07\xe2\x7f\x10\xed\x9f\x00\x23\x22\xd8\x13\x40\xce\x26\x9f\xa4\x8e\x9e\xb7\x5f\x56\x7c\xd0\xa8\xb1\x7a\x9e\x0e\xdb\xd6\x79\x4e\x82\x51\xed\x3b\x9c\xf0\xf3\x6c\xa2\xde\x3d\xdc\x73\x7b\xf0\xe9\x6b\x8e\xb3\xfc\x08\x01\x84\x7f\x87\x1f\x79\x96\x96\xf5\xec\x5c\x13\x3b\xcb\x83\x12\x8a\xd1\x77\x78\xd0\xe7\xad\x3f\x7d\x43\xf6\x9b\xbd\xd4\xb3\x2c\x18\x06\xe8\x5b\xcd\x60\x6f\x2c\x76\xa3\xe7\x17\x58\x70\x02\xe9\x77\x58\x68\xcf\xfd\xa1\xd5\xb6\x57\x5f\x6f\x05\x87\x0c\x7d\x8b\x05\xff\xd0\x8a\x5d\x08\xf5\x17\xf8\x68\x84\xe1\xef\xf1\x79\x55\xba\x6c\x36\xc7\xaa\x29\xa7\xc3\xf1\xf9\x3e\x25\x00\x04\xe2\x3b\xe4\xc5\x86\xfc\x76\xbd\xf4\x79\x69\x8d\xcf\x53\x47\x1a\xfc\x96\xaa\x21\xd8\x90\xdf\x69\x61\x33\x4b\x3e\xcf\x80\x0a\xed\x5b\xd2\x81\xf0\x90\xc1\xfb\xb4\xeb\x75\x00\x38\xcf\x48\x30\xf1\xbd\x96\xa0\x0f\x8a\xde\x4d\x74\xb7\x1f\xed\x9e\xe3\x04\x81\x46\xc9\xb7\x34\x02\xf1\xb6\x39\xef\xcb\x03\x67\x35\x0e\x21\xd2\xd8\xf7\x5a\x42\x9e\xed\xf6\xf2\xed\x03\x86\x61\xbf\xf7\x6c\xb7\x55\xef\xec\xd0\x08\x21\x85\xf0\x5b\x83\x30\xa4\x6f\xfb\x36\x6f\xeb\xe9\xcb\x0b\xcd\x60\xda\xf7\x86\x79\xc8\x9e\xdb\x83\xa6\x9a\x4c\x9f\x3f\xaf\xd8\x5f\x60\xa5\x09\xfe\x3d\x8d\x68\x1f\xa0\xc2\x66\x6b\x44\x9e\x77\x26\x10\x01\x80\xc9\x8e\xc9\x09\x5f\x7b\x76\x9f\xff\xbb\xce\xf6\xd3\x5e\xff\x21\x88\x88\x06\x6b\xc9\x28\x2b\x64\x48\x36\x13\x0f\xe7\x82\xe9\x4c\x24\xa0\x61\xa4\x13\xcc\x1a\x34\x97\x09\x15\x0b\xa9\x68\x35\xa9\x45\x03\xa9\x60\x3a\x9f\x8a\x47\xb2\xa4\xa8\x85\xeb\xd5\x4a\xd9\x29\xa1\x93\x4c\xd0\x86\x09\xc2\xf9\x08\x8a\x95\xc3\x14\xe9\xe9\x5a\x39\x52\x8e\x61\xbd\x9e\xd0\x6b\xb5\x68\xad\x56\x41\x95\x58\xad\x5e\x2f\xb0\x70\xbd\x16\x2e\xe5\x92\xa1\x5a\xa3\xa8\x57\x99\x56\xcb\x92\x2f\x33\xc1\xaf\x4c\x02\xb5\x68\x3e\x51\xad\xa4\xaa\xd9\x7a\x2c\x92\xaa\x94\x92\xd5\x0a\x8d\x44\x63\x3a\x4e\x65\xea\x75\x94\xc8\x27\xd3\x5a\x56\x4f\xe8\xe5\x70\x3e\x52\x66\xa9\x5c\xb0\x18\x8e\x54\x6a\xd9\xcc\x97\x99\x90\x0d\x93\x42\xae\x1e\x8b\xa7\x50\x30\x8e\x23\x99\x3c\x09\xd4\x52\x91\x74\x26\x94\x8a\x24\xca\x99\x5c\x19\xc5\xea\xb8\x91\x8e\x14\x63\xd9\x4c\x39\x18\xce\xea\xc5\xaa\x96\x0f\x6a\xd9\x1a\x8a\xfd\x70\x1b\x97\xf2\x0a\x53\x2f\xe8\x7a\x17\xcb\xb7\x0f\xc3\xfd\xe7\x44\x9d\x8f\xd9\xf8\xe9\x23\x3f\x7d\xd3\xf1\x4c\x7d\xa1\x07\x7e\x8e\xc6\x70\xdd\xff\xb6\xb3\xa8\xc3\xde\x67\x8e\x95\xd5\x9e\x3e\xcb\xde\xa8\x25\x07\xb3\x3e\x79\xb5\x99\x40\x29\xf8\xe3\x16\x7d\xe6\x23\x77\x74\x82\x7b\xb9\x18\xba\x96\xbb\x9b\xe8\x07\x4f\xb4\xfc\x61\xc6\xb9\x81\xf4\x5f\xd3\xf1\xb1\xe0\x07\xb7\x4a\x7e\x0b\x80\x38\xd0\x32\xd4\x5e\x87\x55\x0d\x23\xfe\x7a\xb1\xa9\xd7\x8f\xff\xfd\x6d\xeb\x26\x7f\xfb\xc3\xf7\x1b\x05\x00\xfc\x73\x37\x13\xf9\xed\xa7\xef\xb7\x7d\x90\xcd\xeb\xdd\x72\x31\xb4\xff\x71\xba\x1a\x6d\x7e\x74\x6a\x6e\xff\xc4\x36\xd8\xe6\xf5\x19\xb7\x2a\xfc\xed\xff\x9d\xea\x42\xce\xb6\x21\x47\xdb\xd0\x4f\x1f\xfe\x4f\x69\x1b\x7e\x6f\x9b\x86\x35\xed\x3f\x55\x6f\xdb\xb6\xfd\x27\xe9\xed\xdd\xde\x38\x24\x1a\x76\xa1\xb7\x40\x29\xf8\xa8\x6d\x43\x8e\xb6\x7d\x5b\x6f\x0f\xdc\xb6\x77\x7b\xe3\x94\x32\xf1\x9f\xaa\xb7\x6d\xdb\xfe\x93\xf4\xf6\x6a\x6f\x88\x73\x22\x00\x15\x9c\x6e\xf5\x06\x36\x8d\xeb\xb5\xfb\xed\x4d\xdb\x04\x42\x18\x6b\x08\x60\xc6\xe9\x3f\x89\xa6\x51\x0e\xb4\xbf\xd4\x98\x82\xdf\xda\x08\x01\x78\xf3\xe1\xff\xb9\x6d\x24\xf0\xcd\xdf\xb9\x6a\xe3\x5f\xa1\xaf\x42\x8e\xde\x7c\xc3\x7f\x5a\x1b\xd1\x4f\x1f\xa7\x5c\x08\xcc\x19\xdf\x0e\xa3\xdb\x16\x4e\xa6\x72\x3c\x6d\x0f\x9a\xcf\x86\xec\xc9\x81\xb9\xa9\x31\x3c\x1c\x74\xbe\xcc\x81\x7c\xe4\x70\x64\x30\x83\x47\x07\xb3\x37\x39\x0d\xe4\xb4\x3d\x57\xae\x5b\xf4\xaa\xb7\x6d\x93\x16\xaa\xdd\x6c\xbd\x32\x84\x3f\x7d\xbf\x6d\x01\xfa\x73\x57\xad\xee\xd6\x97\x36\xb5\x22\x48\xdb\x0d\x7b\xe7\xe5\x7c\x95\xa8\x77\x4c\x4e\x88\xda\x53\x69\x3b\xda\xf5\x45\x69\xbb\x5b\x43\xf9\xd6\xe8\xb4\xad\x15\xe3\xbb\x01\xf8\xb4\xb4\xd9\x75\xa2\xde\x72\x38\x22\x6a\xe6\xa9\x9c\x1d\x2d\xfa\x9a\x9c\x5d\xae\xf0\x6c\x6b\x75\x61\x12\x7c\x2c\xf2\xdd\xed\x24\xf8\x2d\xfa\xfd\xad\xb1\xf4\xa7\xef\x07\x07\x8a\x1b\xb6\x90\x10\x9a\x58\x42\xa1\x41\x68\x10\x29\xb9\x86\x34\x64\x43\x69\x69\x4c\x99\x36\x53\x9a\xb4\x0c\x00\x09\xb5\x05\xb4\x2d\x0a\x85\x46\x99\x89\x09\xb4\xb8\xfa\xf1\xd3\xf7\x43\x51\xaa\x0c\x45\x35\x0b\x49\x85\x88\xcd\x0c\x53\x18\x0c\x33\x1b\x2b\xc6\x4c\x24\x84\xad\x71\x21\x85\xad\x59\x1c\x52\x61\x13\x66\x09\x2c\x31\x07\x1a\x54\x06\xd5\x38\xb1\x7f\xfc\xf4\x61\xbc\xfd\xff\x0f\x4b\x93\xec\x0f\xcc\xfe\xa0\xd8\xb9\x62\xb9\xfb\xf9\x9f\x94\x70\x24\xf8\xc5\xbb\x08\x12\x8d\x70\xcc\x08\x07\x3f\x7d\x90\xbd\x6a\xf4\x53\xf9\xe9\x23\xe4\xf5\x5f\xb8\xfb\xe7\xed\x57\xf8\xfe\x07\xfc\xe9\xfb\xa1\xeb\xba\x1e\x7c\xaa\xa8\x79\xcf\x2e\x8e\xdb\x25\x34\x4f\x4c\x3b\xc6\x9a\xf6\x17\xa3\x01\x6e\xcb\x01\x46\x81\xaa\x5d\x98\x76\x59\x56\x37\xd5\xb4\xd6\xca\x35\x7b\xf5\x9a\xbf\xbb\x9e\x1b\xc1\x85\x6a\x6a\xe1\x15\x60\xe5\xe2\x22\xcf\x4c\x66\xc6\x3b\xe3\xa1\x9d\x69\xae\x62\x64\x56\x1c\xd6\x12\x19\xf3\x95\xb4\x5e\xcb\x55\xd2\xa3\xbc\xfe\x5e\x12\xc4\x1f\x1d\x53\x4a\x1a\x95\x58\x7a\xd6\xc9\x3c\x3d\xe9\xba\xd5\x1a\xcf\x69\x30\x18\xca\x8f\x4b\x99\x88\x5a\x4d\x3b\xed\x6e\x5f\x75\x97\xa0\x94\x01\x39\x16\x0b\xad\xe1\xb8\x94\xf5\x37\xfc\xfa\x5a\x85\xe6\x81\x48\xdd\x0c\x0c\xad\x18\x2a\x27\x82\x2f\x2a\x9b\x58\x8b\xc1\xcb\x6c\xdd\x7c\xa5\x5c\xce\x90\x94\x5c\x8f\xd0\x01\xb3\x40\x78\xa1\x7f\x2c\xad\xd7\x7f\x1a\x7a\x0d\x92\xbc\xae\x87\x40\x42\xff\xab\x95\x5d\xbf\x02\x27\x6c\xdf\x69\x0e\xc4\x9b\xae\xfc\x43\x41\xaa\xa0\xc6\x24\x66\x0c\x43\x83\x98\x10\x30\x4d\x19\xc4\x82\xb6\x29\xb9\x85\x90\x06\x98\x89\xb9\xb2\x80\xe4\x04\x6b\x9a\x45\xa8\xa1\x41\x28\x34\x20\x34\xac\x01\x45\xb7\xeb\xa0\xe4\x68\xbf\x46\x27\xbb\x3b\xd7\x18\x38\x6d\x2a\x6f\x77\xb7\x13\x1e\x26\x20\x27\x67\x8c\x01\xc2\xaf\x1a\x43\x44\x45\xd0\x10\xd5\x97\xd3\x74\x38\x6a\x8f\x4b\x05\x7f\xb2\x53\x4c\x2c\x8c\x50\x67\x1a\x1c\xe6\xb1\x5d\xae\xe2\x70\xc3\x4c\x98\x38\xd4\xab\xc2\xe6\x7a\xb1\x96\xb1\xda\xa8\x2e\x0b\xb6\x3d\x56\xed\xde\xcc\x0f\xbb\x54\xcf\xc7\x5e\xa2\xe9\x0a\x2a\x97\x42\x44\x2d\xe2\x62\x38\x9f\x6c\x94\xb7\x31\x86\x03\x65\x8a\x9c\x46\x4c\x6e\xc3\xa5\x6d\x91\x45\x0d\x85\xe4\xa4\x83\x25\x6e\xd4\x06\xcd\x97\x96\x2d\x13\x68\xa5\x6b\x2a\x9c\xc5\xa9\xe9\xc4\x1f\x7b\x0a\xcf\x27\x81\x94\xbe\x1c\xe4\x48\x34\x6a\x0c\x6b\xd6\x02\xf2\x64\xb0\x5c\x48\xac\xd6\x2a\xae\x0a\x41\xab\x29\x87\x56\xcb\x1f\x98\x6d\x8c\x21\xff\xd9\x18\xf4\x42\xfa\x58\x87\xfa\x8b\x1b\x03\xf9\xba\x2d\x60\x6f\xfa\xf1\x0f\x0b\x9a\x26\x87\x12\x02\xc3\x44\xb6\xc5\x2c\x0b\x62\x49\x08\x21\x4a\x50\x84\x6c\xcc\xa0\x01\x94\x81\x38\x85\xc2\x86\x16\x17\xd8\xe4\x86\x61\x68\x14\x13\xc6\x94\x32\x81\x3a\x67\x0b\xf0\x54\x6f\x67\x80\x22\x76\xd2\x52\xde\xef\xee\x26\xc8\x90\x73\x7e\xc6\x16\xb4\x2f\x9a\x82\x88\xa5\x9b\x32\x9c\x5a\xcc\xe1\x14\x94\x46\xe1\x42\xb6\x57\x4c\xad\xeb\x46\x68\x9c\x8c\x44\xed\x58\xbd\xcb\xdb\xda\x14\x66\xa2\xc6\x6c\x91\x1d\x67\xb4\x76\x5c\x5f\xb4\x3b\xa4\xd8\x2d\xe8\xbd\x9e\x7c\x6a\x24\xea\x59\x10\xcf\x57\x07\xa6\xd6\x35\x87\x8d\x01\xac\x1a\x85\x6c\x28\x51\x8b\x6f\x54\xf7\x6a\x0a\xc3\x83\xd1\xb9\x35\xae\x44\x52\xac\xd0\xd1\xd3\xd9\xa2\xf5\xb4\x6c\x18\xa5\xa7\x6c\xa6\x59\x9b\xca\x0a\xc4\x61\x54\x0d\x55\x46\xd9\x64\x10\xc5\x1b\x28\x55\x1f\x44\x06\xa9\x6a\x7d\x59\x4c\x66\x63\xfe\xe5\xb2\xb4\x06\x3c\x95\x6c\xd2\xb5\x2d\xcc\x84\xbd\x9c\x36\xd4\x4b\x64\x96\x9d\x74\x15\x42\x70\x43\x39\x7d\xc4\x14\x92\xfc\x58\x77\xfa\xff\x8f\x29\x20\x6f\xba\xf1\x0f\x86\x2d\xc1\x6d\x8a\x99\x52\x8c\x5b\xd0\x40\x9a\x41\x0d\x2e\x6c\x84\xa5\x4d\x31\x84\x86\x46\x99\x90\x88\xd8\xd2\x86\x04\x60\x69\x01\x83\x22\x83\x61\x6c\x00\xcd\x50\x42\xfc\xd8\xc0\xd1\xe3\x18\x09\x9c\xec\xec\x50\x50\x28\xce\xdd\x7d\xb5\x84\xed\x44\x8e\x50\x81\xce\x18\x02\xfe\xa2\x21\xa0\x5c\xa3\x03\x33\x33\x3a\x04\x46\x42\xab\x92\xc1\x2a\x3b\x2f\x2f\xa3\xb8\x32\x1a\x76\x9f\xe6\x11\x3d\x3b\x0d\xc2\x24\x4a\x6b\x01\x8d\x35\x3a\x56\x6a\xa1\xd7\x26\x29\xa4\xe2\x2d\x92\x7c\x7a\x99\x6b\xe9\x56\xbe\x1d\xd3\xaa\x5a\xaa\x21\xcb\x2f\x22\x9e\x7c\xf2\x8f\x68\xc8\xe0\xc6\x76\x38\xde\x18\xc2\x66\xcc\x8e\xbf\xff\xa3\x6f\xfa\xea\x64\x7f\xbd\xd0\x73\xf9\xee\x56\xd1\xb4\xbe\x88\x6a\xad\xb5\x19\xd3\x9e\x4a\xf5\x04\x68\x47\x49\xb1\xdb\x33\xac\x09\xc5\x48\x6b\xbe\xd0\x59\x2e\x15\x5e\x56\xfc\x78\x15\xf5\x03\xb0\x94\xc5\xa9\x56\xee\xc8\x4a\xae\x48\x12\xa5\x4e\x53\x06\xd2\x4f\xa3\x74\x23\xa1\xfa\x74\x16\x1e\x19\x73\x7f\x21\x3b\x7a\x6a\x5b\xb3\xad\x69\xc4\x8f\x18\x4a\x78\x72\xac\xb3\xfd\xc5\x0d\xe5\x1b\xf8\x09\x7a\xd3\xc9\x37\xb1\xba\xaf\x13\xc9\xd7\x89\xd7\xab\x3b\xf9\x1d\xc0\xdf\x01\xf4\x01\xf0\xc7\xe6\xff\x4e\x76\x66\x4c\x35\x41\x2f\xde\x25\x48\x10\xc1\x34\x24\xd8\x99\xbe\x7e\xbc\xa7\x6f\xab\xf4\x67\x2b\xe5\x74\x09\xd4\x92\x6d\xb2\xf2\xaf\x8a\xc9\x80\x16\x1a\x84\x44\x0c\x81\x65\x27\xf0\x34\x01\xcd\xe9\x64\x11\x5f\xac\x61\xcd\x2a\x56\xeb\x32\x90\x90\x91\x8d\x11\x85\x8f\x74\xe2\xe3\xe5\xad\x13\xeb\x7a\xa0\x7b\x87\x86\x78\x5a\x7e\x6c\x3b\xd3\xe5\xa9\xf6\x17\xbe\x86\x75\x3b\xf3\x3e\x11\xe4\x7c\x60\x39\xdb\x59\x2a\x01\x74\xb3\xca\x7b\xc2\xe2\x2e\x90\x41\xef\x64\x08\xdb\x2c\xa4\xba\x23\x83\xdf\xc9\x70\x6d\xb3\xe7\xe3\x8e\x0c\x79\x23\x43\x11\x67\xd4\x35\x19\xfa\x4e\x86\x09\x06\x5d\x93\x61\x6f\x64\x18\x04\xd4\xbd\x88\xb5\x77\x32\x14\x52\xf7\x22\xe6\xef\x64\x04\x22\xee\x45\x2c\xde\xc8\x68\x18\x13\xf7\x22\x86\xe0\x9d\x8e\x46\x88\x7b\x19\xc3\xf7\x7e\xcc\x21\xc5\xee\x85\x0c\xdf\x3b\x32\xa7\x0c\xbb\x97\x32\x7c\xef\xc9\x5c\x68\xc8\xbd\x98\xe1\x7b\x57\x16\x98\xa3\x2b\xe4\xfc\xde\x97\x85\x26\xd0\x15\x72\x7e\xeb\xcc\x02\x20\x00\xaf\x90\xb3\xf6\x4e\x87\x41\x78\x85\x9c\xdf\xba\xb3\x80\x00\x81\x2b\xe4\x2c\xde\xe9\x10\x0c\xdc\xcb\x19\x81\x77\x3a\x9c\x00\xf7\x72\x46\x6f\xfd\x59\x20\x44\xc4\x15\xe3\x32\x7a\xa7\xc3\xa8\x70\x2f\x67\xf4\xd6\x9f\x05\x06\xdb\x6d\x24\x97\x74\xc8\x3b\x1d\xb2\xdd\x26\x71\x49\x87\xbe\xd3\xe1\xdb\x0d\x00\x97\x74\xde\xfb\x33\x41\xe2\x1a\xff\xf7\xde\x9f\x89\x06\xae\x70\x80\xe8\xbd\x3f\x53\x08\xaf\xf0\x80\xe8\xbd\x3f\x53\x8a\xae\x70\x81\xf8\xbd\x3f\x53\x81\xaf\xf0\x81\xf8\xbd\x3f\x33\x4c\xae\x70\x82\xf8\xbd\x3f\x33\x8d\x5e\xe1\x05\xf1\x7b\x7f\xd6\x20\xbb\xc2\x0d\x62\xe2\x8c\x78\x73\x49\x87\x3a\xa3\x02\x5d\xd2\x61\xce\x48\x2e\x97\x74\x34\x07\x1d\xec\x92\x0e\x77\x46\x28\xb9\xa4\x23\x9c\x51\x5c\x2e\x91\x21\x70\x46\xde\xb8\xa4\x03\x1d\x74\x5c\xca\x87\x20\x67\xb4\x8c\x4b\x3a\xce\x88\x14\xb7\xf5\x21\x8e\xa8\x0f\xb7\x74\xa8\x33\xb2\xc2\x25\x1d\xf6\x71\xaf\x9f\xb8\x24\xa3\x39\x42\x14\x5c\x92\xe1\x1f\xf7\xc2\xdd\xd6\x46\x38\x42\x05\x5c\x4e\x4f\xc0\xc7\x1d\x63\x97\xb5\xa1\xd0\xb1\xf1\xec\x4d\x02\x23\x4f\x02\xb8\xcf\x7f\x5d\xfb\xd3\xf7\x5a\xf7\xaf\x45\x74\x9f\xc8\xe3\x73\xf5\xac\xfa\x10\xb2\x1d\x4c\xa3\xf7\x17\x6c\x13\x9c\xb0\x0d\x1d\xd8\x7c\xd3\xf5\xdb\x1f\xbe\xdf\xc0\x3f\xe1\x41\xd8\xc0\xc7\xd8\x8d\xc3\x88\x82\x6d\xaa\x94\xf1\x6f\x7f\xf8\xfe\xf7\x37\xeb\xb7\x3f\x36\x11\x01\xbf\x0d\x5e\xff\xf8\x7f\x3f\x7d\xbf\xbd\x7d\xf3\xf4\xdb\x1f\xbe\xd7\xdf\x8d\xd9\xaa\x3d\x68\x3e\x1f\x0d\x30\xfb\x70\xef\x5c\x7c\xd2\x44\xf5\x7a\x9f\x9f\xdc\xc5\x32\x38\x09\x79\x12\xc6\x74\x83\x4f\x6e\x4e\x6b\x67\xbb\x3a\xb1\xbf\x40\x27\xb4\xb3\x2d\x1f\xb5\x23\x2e\x28\x47\xfc\xd2\xcd\x55\xba\xd9\x2e\xf9\xec\x2f\xf8\x09\xdd\x20\xfa\xd9\x72\xf8\x05\xdd\xf0\x5f\xba\xb9\x46\x37\xbb\x75\xb4\xfd\x05\x39\xa1\x1b\x82\x38\xd5\x1c\x76\xa3\x5d\xd0\x8d\xf6\x4b\x37\x57\xe9\x66\xbb\x38\xb9\xbf\x00\x27\x74\xc3\x5e\x8b\xf6\x51\x37\xce\x10\x36\xa7\x6e\xd8\x2f\xdd\x5c\xa3\x9b\xdd\x8a\xef\xfe\xe2\x04\x1a\x40\xc7\xd0\x80\xf3\x0b\x00\xa7\x6e\xe8\x2f\xdd\x5c\xa5\x9b\xed\x32\xfa\xfe\xe2\x04\x16\xd8\xba\x1b\x87\x6e\xc8\x05\xdd\x90\x5f\xba\xb9\x4a\x37\xdb\xbd\x89\xfd\xc5\x09\x2c\x80\xb7\xe5\xa3\x6e\xf0\x05\xdd\xe0\x5f\xba\xb9\x46\x37\xbb\x0d\x9f\xfd\xc5\x09\x2c\x40\x8f\x8d\x69\xe8\x82\x6e\xd0\x2f\xdd\x5c\xa5\x9b\xed\x26\xda\xfe\xe2\x28\x16\x80\x1f\x82\xd6\x4f\x7e\xa4\xf1\x69\xf2\xf9\x4b\x37\xd7\xe8\x66\xb7\x31\xb9\xbf\x38\x8a\x05\x20\x38\xa9\x9c\x2f\xe9\x06\xfc\x52\x8e\x2b\xe5\x6c\x77\x7b\xf7\x17\x27\xc0\x00\x10\x02\x00\x21\x9c\xba\xb9\xa4\x1d\xf0\x4b\x3f\x57\xea\x67\xbb\x8b\xbe\xbf\x38\xb5\x38\x00\x04\x17\xc0\xb9\x70\x73\x41\x3d\xe2\x97\x76\xae\xd3\xce\x2e\x36\x61\x7f\x71\x6a\x79\x00\x61\x42\x19\x77\x2c\xdd\x5c\xd0\x0e\xff\xa5\x9d\x2b\xb5\xb3\x8d\xf8\xd8\x5f\x9c\x5a\x20\x20\x80\x13\xea\x5c\xbc\xb9\xa0\x1d\xed\x97\x76\xae\xd2\xce\x5b\x1c\xcd\xfe\xe2\xd4\x86\x01\xc3\x02\x13\xe2\x58\xbe\xb9\xa0\x1d\xf6\x4b\x3b\x57\x6a\x67\x1b\x9d\xb4\xbf\x38\xb5\x61\x20\x18\xd0\xb8\x43\x3b\xf4\x82\x76\xe8\x2f\xed\x5c\xa7\x9d\x5d\xcc\xd7\xfe\xe2\x04\x2a\x40\x04\x0b\x80\x1c\xda\x21\x17\xb4\x43\x7e\x69\xe7\x4a\xed\x6c\x23\xe9\xf6\x17\x27\x50\x01\x46\x88\x72\xc0\x1c\x8b\x38\x17\xb4\x83\xb7\x1b\xa8\xe8\x7d\x63\x67\xf7\xac\xf8\xa5\x2b\x57\xba\xda\x46\x2b\xee\x2f\x4e\x60\x04\xa2\x31\x28\x00\x75\x2c\xea\x5c\xd0\x15\xfa\x65\x49\xd7\x69\x67\x17\x03\xba\xbf\x38\x81\x11\x04\xd8\xfc\xe7\x98\x9d\x5e\x9a\x9c\xfe\xd2\xce\x95\xda\xd9\x46\xd6\xee\x2f\x8e\x62\x04\x7a\x7c\x5d\x07\x7d\x6d\x5d\x87\xfe\x52\x8d\x1b\xd5\xec\x82\x95\xf7\x17\x27\x00\x02\x10\x1c\x60\x81\x9c\xcb\x3a\x17\x94\x43\x7f\x69\xe7\x3a\xed\x6c\x43\xc0\xf7\x17\xa7\x96\x0d\x00\x67\x82\x3a\x76\xae\xc5\x05\xe5\x10\xf6\x4b\x39\x57\x29\x67\x1b\x57\xbf\xbf\x38\xb5\x6a\x80\xa0\xa0\xd0\x61\x3a\xfc\x92\x72\x7e\x59\xce\x55\xca\xd9\x7d\xac\xb0\xbf\x38\xb5\x68\xf0\xaa\x38\xee\x00\x04\xda\x05\xe5\xe0\x5f\x96\x73\x9d\x72\xb6\x5f\x80\xec\x2f\x4e\xad\x19\x30\x88\x04\x70\x6c\x5e\xb3\x4b\xca\xf9\x65\x39\x57\x29\x67\xf7\x59\xcd\xfe\xe2\xd4\x46\x82\x40\x18\x68\x0e\x9f\x43\x2f\x28\x07\xfd\xb2\x9c\xeb\x94\xb3\xfd\x56\x69\x7f\x71\x02\x10\x20\xcc\x81\xa0\x0e\x9f\x43\x2e\x29\xe7\x97\xe5\x5c\xa7\x9c\xed\x07\x60\xfb\x8b\x13\x80\x00\x6f\x03\x74\x1d\xcb\x39\x97\xe6\x39\xbf\x2c\xe7\x2a\xe5\xec\xbe\xaa\xdb\x5f\x9c\x00\x04\x84\xbe\xfe\xe7\x5c\xbf\xb9\xa4\x9c\x5f\x96\x73\x9d\x72\xb6\x9f\x2a\xee\x2f\x4e\x00\x02\x7e\x2c\x9a\x0d\x5e\x50\xce\x2f\xc3\xb9\x4a\x37\xbb\xcf\x3f\xf7\x17\x47\xf1\x00\x3e\x19\x69\xf8\xa5\x40\xc3\x5f\x0b\x6b\xdf\xd4\xcd\xc7\x4f\x61\xdf\x2f\xb6\x1e\x07\x6e\x74\x33\x1d\xfe\x76\x4d\xa2\xd9\x9f\xbe\xdf\xec\xf1\xb0\x7f\x95\x34\xce\x46\x6b\x1f\x55\xec\x65\x8d\x7a\xad\x2a\x6f\x8f\x8c\x39\xad\xaa\xdd\x99\x18\xef\x17\xec\xb3\xaa\xdc\xe6\xaa\xfd\xa5\x2a\x4f\x55\xf5\xf6\x01\xf5\xfb\x05\xfa\xcb\x5a\xd5\x9f\x91\x75\xfd\xae\xaa\xda\x9d\x7c\xf1\x7e\xc1\xff\xb2\x56\xf5\x1f\xac\xaa\x0f\x9f\xef\xbf\x5f\x6c\xa7\xae\xec\x6b\x87\x09\x4c\xc7\xb3\xc9\x54\xa9\x6b\x95\xb1\x21\x33\x1c\x5f\x6b\xc2\x0f\x32\x1e\xde\x1e\x65\x7c\x38\xc2\xe3\xfd\x02\xfc\xc9\x9a\xbb\xc2\xa2\x1f\x43\x73\x1e\x1f\x3b\x78\x5a\x73\xbb\x83\x49\xde\x2f\xd8\x7f\x8a\xe6\xfe\xac\xd1\xf2\x6e\x9a\xdb\x25\x05\x79\xbf\x40\xff\x29\xa3\xe5\x9f\xe6\xe7\x6e\x3e\x5a\x1e\xe6\x4f\x79\xff\x9b\x1f\x1c\xbd\x61\xcf\x06\xd6\xae\x2d\x2e\xcf\x04\xdd\xc8\x65\x7b\x32\xe7\xb5\xca\xfd\xc2\xe9\x36\x57\x1e\x5e\xfa\x1d\xb1\xed\x12\xbd\xbc\xff\x4d\x6e\x2b\x36\xf7\x9d\xf9\x6b\x87\xd5\xdc\x53\x72\xdb\xa4\x34\xef\x7f\x83\x9b\x4a\xee\x8a\x01\xfc\x0b\x07\xcf\x78\x74\x5a\xee\x89\x0c\x37\xdb\x63\xbd\xbf\x9d\xdd\xe6\x32\xd5\xf7\xb3\x9c\x3d\xcf\x4d\x7b\x8a\xf8\xf1\xec\xb4\xec\x74\xa6\xa4\x8b\x84\x90\x33\xe9\x8b\x5b\x42\xd8\x99\xa1\xc4\x2d\x21\xe2\x4c\xa7\xe1\x96\x10\x75\xe6\x7e\x70\x4b\x88\x39\x13\x15\xb8\x25\xa4\x39\xbf\xaa\x77\x4b\x88\x3b\x3f\x01\x77\x4b\x48\x38\xbf\x57\x76\x4b\xe8\x63\xbe\xda\x6b\xa4\xfd\x31\x63\xed\x35\xe2\xfe\x98\xb3\xf6\x1a\x79\x7f\xcc\x5a\x7b\x8d\xc0\x3f\xe6\xad\xbd\x4a\xe2\xd4\xf9\xe9\x92\x6b\x4a\xcc\xf9\x99\x8d\x6b\x4a\x9a\xf3\x93\x10\xd7\x94\xb8\xf3\xf3\x05\xd7\x94\x84\x33\xd4\xde\xf5\x58\x09\x9c\x81\xe0\xae\x29\x41\x67\xd0\xb2\x6b\x4a\xc8\x19\x60\xeb\x9a\x12\x76\xc6\x83\xba\xa6\x44\x9c\xb1\x8b\xae\x29\x51\x67\xa0\x9d\x6b\x4a\xcc\x19\x15\xe6\x9a\x92\xe6\x0c\x61\x72\x4d\x89\x3b\xe3\x6d\x5c\x53\x12\xce\xe0\x10\xd7\x6e\x1c\x38\x23\x19\x5c\x53\x82\xce\x6d\x77\xd7\x94\x90\x73\x8f\xd8\x35\x25\xec\xdc\xd1\x74\x4d\x89\x38\xf6\xdf\x4e\x65\xce\xbc\x4c\x89\x3a\x77\xf2\x5c\x53\x62\x8e\x8d\x26\xf7\x75\x72\x6e\x59\x9d\xca\x76\x7a\x99\x12\x77\xec\xa8\xb8\xaf\x93\x70\xee\xcd\xb8\x46\x98\xc0\xb1\x75\xe0\xba\x4e\x1f\xb3\xdd\xf2\x2b\xe4\xf4\x31\xdf\xed\x35\x16\xfc\x31\xe3\x2d\xb8\xa6\x4e\xc4\xb1\x86\xe8\x9e\x12\x75\xae\x69\xb9\xa6\xc4\x3e\x2e\xb2\x9c\xca\xed\x7a\x99\x90\xf6\x91\x90\xfb\x3e\xc0\x3f\xae\x5f\xb8\xaf\x91\x70\x2c\x84\xb8\x9e\xf8\x80\x8f\xeb\x02\xae\x6b\x44\x1d\x0b\x0c\xa7\x33\xe0\x9e\x22\x75\xcb\x1c\xb8\x17\x78\x7e\x2b\x0b\xee\x01\x2d\xcf\x67\xf0\x7b\x79\xfe\x30\x09\x37\x08\x17\x1c\x59\xa6\x05\x6d\xa0\x09\x4b\x00\xa5\x30\xe2\xc2\x32\x91\xc1\x10\x13\x86\xa9\x00\xe7\x86\xa5\x41\x8e\x2d\xcb\x90\x5c\x61\xcb\x94\x88\x1a\x50\x71\x62\xbc\xb6\x69\xbb\xcd\xe9\x7a\x5d\xf3\xe0\x64\x31\xfa\x76\xa2\xd2\xe9\xe3\x5a\xa9\x76\xe6\x2c\xd7\xcd\xcd\x0f\xcb\x10\xdb\x83\x98\x92\xac\xa3\xda\xb8\xd3\x1f\xc6\x79\x29\xda\x0b\xf9\x55\xd3\xc4\x5a\xae\x36\x8d\x25\x93\xeb\x6a\x85\x2f\x2a\xed\x46\x40\x06\x67\x34\x45\x37\x47\x88\x35\x36\x2f\x6d\x0e\x0a\x0b\x39\xce\x09\x0a\xec\xff\x3c\x38\xfc\xb1\x52\x29\x15\x76\x7f\x4e\x8d\x66\xad\xc0\xc2\xda\x30\x94\x02\xa9\xfc\xd3\xa2\x5e\x0c\x8a\x75\x6d\x5e\xab\x94\xf0\xb2\x9d\x6b\xd7\x67\x45\x03\x86\xe6\xfd\x7c\x4a\x6d\x4e\xcc\xab\x15\x63\xc6\x70\xfb\x66\x78\x53\xd3\xa3\xa7\x13\x49\xad\x3b\xef\x2e\x36\xec\xb3\x29\xae\x09\xd1\xb4\x7a\x24\x2a\xba\x41\xbf\x99\x2d\xb1\x51\x7e\x86\xd6\x76\x88\x46\x5b\xad\xf0\x52\x4f\x4e\x93\x7d\x43\x9b\xf0\xe1\xba\x3b\x59\xbd\xc4\xeb\x71\x04\xd5\x4b\x30\x65\xf6\x66\x8b\x54\xcf\x40\x8b\x40\xbb\x4f\xb3\x8b\x31\x58\xa1\xf5\x7a\x59\x8f\x69\xf3\x97\x6c\x60\xf1\xef\x7f\xff\x38\x3c\xb4\x2a\x7a\x70\xd8\xd3\xfe\x4f\xa7\x2c\x74\x37\xb2\x3d\x68\xeb\xcd\x65\xf7\xde\xa6\x4d\x1b\xf6\xfa\x0c\x1c\x34\x6f\xfc\x92\x61\x29\x95\x95\xcd\xce\x32\x2d\xcb\x39\xc1\x02\x6b\x7b\x22\x14\x30\x87\xe3\x4c\xa3\xb6\x0e\x54\x13\xdd\xc8\x30\xf9\x26\xff\x6e\xbd\x34\x48\x16\x2b\xfa\x3b\xbd\xe0\xe6\xcf\xa6\x93\x73\xf8\xa8\xa8\xde\xfa\x8f\x87\xfc\x43\xee\xf9\x6f\xd4\x11\xd9\xdf\x0a\xce\x86\x78\x38\x25\xf4\x25\x98\x0b\x2f\x47\x79\x3f\x1e\xc6\x32\x4f\x6b\xa8\x15\x56\xed\x09\xec\xd9\xe9\x48\xbd\x9f\xaf\x36\xc7\xb3\xe2\x53\xe9\xf5\xe9\x42\x2b\x6b\x8e\x12\xe5\x3d\xff\xf4\x5e\x1e\x87\xe5\xe4\xb9\x61\xe1\x5b\xf0\xff\xdc\x47\xf3\x9f\xdb\x7f\x50\x0e\xfa\x90\xb3\x94\xf7\xed\x79\xe0\x3e\xbe\x29\x8b\xf7\x86\x06\x5c\xd5\xd7\x7d\xfd\x52\xa3\xd0\x14\xe8\x31\xff\x7b\x39\x22\xf3\xdd\x75\xf9\xc1\xea\xb7\x91\x67\xb0\xa2\xcf\x4f\x1d\x56\xb7\x1f\x13\x8f\xf6\x2f\x37\xfd\x95\x93\x3d\xbd\x83\xf1\xe3\x93\xac\x8e\x15\x2f\xec\x45\x2b\xbb\xe3\xbf\xf5\x0f\xff\x7b\x2b\xe7\xb3\xd9\x70\x19\x0c\x07\xea\xfd\x64\xc7\xed\xbf\xaf\x50\x69\x03\x09\x2e\xe3\xc5\x03\x4c\x43\xb0\x26\x09\x87\x80\x5b\x16\x24\x18\x69\xd8\x32\x6d\x68\x22\x8e\x04\xb3\x18\x20\xdc\x02\x02\x52\x93\x01\x0d\x31\x0a\x94\x41\x6d\x4d\x10\x83\x0b\xca\x80\x24\xc0\x04\xe6\x16\xd3\x20\x8f\x30\x0d\xbb\x8c\x69\xf8\xb9\xd3\xeb\x37\x37\x3f\xec\x88\x5c\x8b\x69\x9c\xce\xc1\x6b\x4c\x53\x16\xd1\x49\xf8\xa0\xcf\x1e\x3f\xd2\xf4\x00\xd3\xcc\xca\x83\x46\x2f\xbd\xec\xf0\xa9\x7c\x49\x0f\xfd\xb9\xba\x1d\x27\xe3\x40\x8f\xc0\xe0\x68\x34\xf1\xd7\x62\xd1\x5e\x66\x38\xa5\x4f\xa5\x6a\xa9\x11\x16\x3a\x60\xed\x51\xb8\xc0\xf2\x5a\xed\xc5\x58\xb6\x32\xeb\xbe\x5e\xe0\x19\x99\x37\x8a\x38\x34\x01\x85\xfc\x9c\x90\x31\x8e\xa6\x82\xcd\x7b\x63\x9a\xf8\x5d\x64\x77\x07\x4c\xb3\x95\x89\xf3\xa0\x7f\x67\xb7\x71\x8c\x13\x11\xd0\x42\xec\x93\x20\xbd\xf6\xf1\x79\xdd\x33\x1f\xbf\xf7\x49\x5e\xcb\x2f\xfc\xe0\xf2\xfb\x0c\x0e\xcf\xcb\x6f\x92\xcb\xc6\x8e\x9e\x5a\x7c\x3d\x46\xba\x8f\xcd\x6c\xca\x42\xff\x2b\x62\x10\xfd\x23\x66\xdf\x36\xf3\x7b\xfd\x53\x0f\x54\x2a\x99\x9d\x7c\x82\x70\x16\xb0\x62\xc3\xd2\xac\x99\x9e\xe7\xa7\x21\x2d\xd0\x8a\xa7\x70\x46\x09\xab\x92\xb3\xa3\xf1\xa7\x44\x9b\x26\xe6\xe5\xec\x53\x43\x9f\x6a\x9b\x57\x67\xdd\x2c\xce\xeb\xf6\x7b\xcd\xf9\x5e\x7e\x9b\xfa\x14\x87\x11\xfe\x69\xf2\xb1\x2b\xff\x3e\x86\x9f\xfe\x24\xfc\xa2\x7b\x64\x4b\x74\xe1\x8e\xff\x0e\x3f\xdd\xca\xd1\x79\x8b\x9f\x84\x2d\x94\xd4\x20\x31\xa0\xc4\x82\x31\x62\x40\xc5\x2c\x1b\xd8\xd2\xb6\xa0\x94\x50\x53\x96\xd4\xa0\x61\x00\xaa\x41\x6a\x2b\x88\x35\x88\x08\xb3\x31\x02\xdc\xc0\x12\x1a\x70\x8b\x9f\xb0\x47\xf8\x49\xbb\x8c\x9f\x84\xc6\xce\x00\xa8\xed\xdd\x0f\xa1\x20\xd7\x22\xa8\x88\x43\xbd\x5e\x23\xa8\x03\xb3\x0a\xeb\x1f\x87\xc9\x83\x72\x80\xa0\x44\x2a\x5f\x6e\x05\x72\xf9\x48\x23\x3b\x1c\x15\x5b\xfe\xf9\xac\x9c\xc9\x99\xe5\x3e\x08\xa5\xe2\x62\x11\x22\x72\x41\x88\x08\x9a\x33\xa6\x87\xd2\xaa\x23\xa7\x7c\x8a\xd2\xab\xd9\xba\x3a\x5f\xf2\xc2\x22\x9f\xce\x59\x62\x6d\xd5\x7a\x8b\x60\x98\x5a\xdc\x2c\xe1\xd9\x68\x31\xcb\xe9\x77\x47\x50\xf7\x91\xdd\x1d\x10\xd4\x86\xb1\xd3\x8d\x5e\x42\x00\xa9\xd0\xba\xa5\x1d\x7f\xc7\x43\x04\x50\x3e\x52\x11\x97\x08\xe0\x76\x08\x2a\xf2\xe0\xf2\x73\xda\xff\x25\xf9\x3d\xe1\x72\x38\xfd\xe9\x1d\x5d\xf7\x00\x41\xdd\x71\xbc\x79\x5c\x04\x15\x7e\x09\xd8\xc7\xeb\x7c\xa0\x8f\xc7\x44\x50\x06\x8f\xb3\x4f\x53\x85\x5d\xb9\x05\x82\x72\x8b\x60\x74\x8f\x6c\x89\xa4\xdd\xf1\xdf\x21\xa8\x5b\x39\x3a\x6f\x11\x94\x2d\x18\x93\x06\x86\x00\x62\xcd\x92\x8a\x33\x53\x53\x4a\x53\x0a\x70\x4e\x01\xc6\x82\x62\xcd\xd4\xb8\xcd\x29\x51\x52\x4a\x25\x35\x6e\x69\xb6\xc5\x31\x81\x98\x58\x52\x13\x5b\x04\x45\x3c\x42\x50\xfc\x22\x82\x12\x10\x9e\xd9\x56\xdb\xdd\xfd\x10\x03\x7b\x2d\x82\x8a\x3a\xd4\xeb\x35\x82\xca\x97\x22\x69\x7e\xd0\x6b\x63\x47\x3b\xf4\x01\x82\x92\x8d\x5a\xc9\x6f\x74\x43\x6b\x1c\x79\x29\x25\x5a\xb5\xe4\xd4\x2c\xaa\x39\x6d\xae\xc7\x61\xb0\x48\xa1\x68\x71\x30\x59\xdb\xda\x94\xbc\x04\x4a\xe6\xa0\x8a\x73\xa4\xa5\x62\x4a\x8f\xc4\xbb\xc5\xce\xb4\xb9\x06\x7d\x2d\xde\x8c\x96\x60\x73\x58\xe9\x19\x53\x4b\xa7\xb9\x69\x23\x93\x09\xde\x7d\x5f\x2d\x7f\x17\xd9\xdd\x01\x41\x45\x9c\xf4\x0e\xea\x73\xb4\xb9\xaf\x25\x37\x85\x81\xcf\xc2\xf4\x1a\x01\xd4\x75\xcf\x10\xc0\xed\x10\x54\xf4\xc1\xe5\xe7\xb4\xff\x0b\xf2\x0b\xe4\x92\x8d\xc2\x09\x0f\x7f\x2d\x82\xba\x8f\xcd\x6c\xca\xe3\x22\xa8\xa8\x3f\x98\x3d\xb1\xc6\xb7\xd7\xc7\x63\x22\xa8\x5e\x3e\x45\x4f\x55\xfb\x16\x08\xca\x2d\x82\xd1\x3d\xb2\x25\x34\x74\xc7\x7f\x87\xa0\x6e\xe5\xe8\xbc\x45\x50\x98\x01\x8b\x0b\xc0\x39\x50\xca\xb0\x10\x22\x96\x46\x01\x33\x04\xe7\x10\x53\x64\x1b\x26\x33\x98\x01\x05\x82\x36\x27\x92\x53\x25\x38\xd0\x6c\xa0\x69\xd4\xa0\x94\x01\x63\xb7\x87\x47\x3d\x42\x50\xe2\x32\x82\x42\x8c\x9c\x41\x50\xdb\xbb\x1f\x3e\xfe\xb9\x16\x41\x39\x47\x18\xaf\x11\x54\xe6\x29\x6c\xd5\x0f\x7a\xed\xe7\x11\x5b\xff\x88\xa0\x46\xb0\x95\x1e\xa6\xf9\x38\xd3\xb6\xf0\x68\x10\x28\xce\xfd\x93\x97\x66\x61\x11\x8f\xaf\x52\xcd\xae\x0a\x18\xe5\x74\x4c\x14\xeb\xa5\x68\xb3\x56\xab\x36\x8a\x01\x98\xd7\x0a\x73\x4a\xf2\xcd\x9a\x91\xa0\xb5\xcc\x32\xf7\xa2\x8b\x6e\x73\xed\x4f\xd5\x47\x09\x13\x57\x44\x6a\xd2\x7d\xea\x07\xf4\x7b\x23\xa8\xf2\x5d\x64\x77\x07\x04\xb5\x45\x00\x97\x22\x83\x1c\x23\x45\x69\xd5\x2f\x17\x3f\x09\xd2\x6b\x04\x60\x1e\x95\x89\x2b\x04\x70\x3b\x04\x15\x7b\x70\xf9\x7d\x46\x18\xe7\xe5\x67\xc5\xad\xd9\x89\xad\x9a\x6b\x11\xd4\x7d\x6c\x66\x53\x1e\x17\x41\x25\xca\xc1\xa7\x93\x7e\xff\xb1\x11\xd4\xf6\xfe\xf1\x72\x0b\x04\xe5\x16\xc1\xe8\x1e\xd9\x12\x0c\xbb\xe3\xbf\x43\x50\xb7\x72\x74\xde\x22\x28\xc3\x84\xa6\xe0\xdc\x34\x91\xb0\x04\x33\x24\x56\x16\xc0\x48\x11\x6e\x73\x86\x4c\x4b\x42\x53\x28\x8b\x41\x6a\x00\x4d\x9a\xdc\x32\x28\x54\x36\x16\xc2\xb4\xb0\x2d\x91\x20\xbb\x5d\x3c\xe6\x09\x82\x62\x1b\xf0\x74\x01\x41\x11\x48\xcf\x20\xa8\xed\xdd\x0f\x5f\x3d\x5f\x8b\xa0\x9c\xde\xc4\x6b\x04\xb5\x1d\x31\x8e\xf6\xda\x83\x72\x80\xa0\x2c\x96\xd2\x27\x84\x5a\x46\xa0\xab\x87\xaa\x99\x32\x55\xd3\xc1\x70\x28\x57\x8b\xd8\xcb\x38\x00\x45\xc9\x26\xa0\xb5\x62\xfe\x7e\xbb\xac\x0f\x32\xfa\x92\x0d\xb9\x7f\xa6\x86\x05\xb9\x18\x3c\xe1\x42\x62\x55\x98\xe7\xab\xb8\x9a\x1c\x35\x72\xc6\x88\xac\x03\x44\xac\xcd\x7a\x37\x74\xf7\x35\xa8\xfa\x5d\x64\x77\x07\x04\xb5\x45\x00\xdf\x8c\xe3\x39\x1e\x6c\xe4\x35\x02\x68\xea\x9e\x21\x80\xdb\x21\xa8\xf8\x83\xcb\xef\x04\x9a\x3c\x29\xbf\xe1\xb2\x65\x96\x3f\xbd\xa3\xeb\x1e\x20\xa8\xfb\xd8\xcc\xa6\x3c\x2e\x82\x3a\xa8\xff\xd1\xf2\xc0\x08\x0a\x93\x02\xbc\x67\x1c\x94\x5b\x04\xa3\x7b\x64\x4b\xeb\xa6\x3b\xfe\x3b\x04\x75\x2b\x47\xe7\x2d\x82\x62\xd0\xc0\xd8\x32\x95\xc5\x0c\x0e\x2d\x4b\x01\xc5\x99\xc1\xa0\x21\x89\x34\x4c\xc4\x81\xc1\x4c\x4c\x4d\xa6\x88\x21\x39\x20\xd4\xa0\x80\x23\x5b\x23\x52\x48\x64\x30\xa0\xac\x2d\x82\xd2\x3c\x42\x50\xf0\x32\x82\xa2\xf8\x1c\x82\xda\xde\xfd\x90\xee\xe5\x5a\x04\xe5\x8c\xb4\xf4\x1a\x41\x1d\xcc\xa9\xc2\xfa\xc9\xcf\x9a\x0e\x10\x54\x24\xf6\x52\x2d\x27\x49\x6a\xd6\x21\x16\x9f\x94\xdb\x79\xc8\xb3\x01\x66\xb7\xbb\xc6\x24\x97\xaf\x35\xf4\x6c\xdc\x6e\x60\x34\x69\x4e\x18\x7a\xca\x43\x2d\x9a\x1e\x2c\xea\x2f\x93\x65\x64\x08\xa7\x6d\x22\x0a\x9a\x99\x4e\x49\x2b\x34\x19\xb4\x62\x9d\xee\xa0\x9b\xcd\xa7\xd7\xe6\x53\xe8\xee\x71\x50\xe6\x5d\x64\x77\x07\x04\x75\x62\x68\x38\x8f\x00\x64\xba\x5e\xfb\xec\xba\xbc\x46\x00\x5d\xdd\x33\x04\x70\x3b\x04\x95\x78\x70\xf9\x7d\x8e\xb4\x3e\x2f\xbf\x55\xa4\x2b\x4f\x44\x3a\x5f\x8b\xa0\xee\x63\x33\x9b\xf2\xb8\x08\xea\x60\x0d\xed\x68\x79\x5c\x04\x15\x08\xa4\xcb\xeb\x7b\xc6\x41\xb9\x45\x30\xba\x47\xb6\xb4\xe4\xee\xf8\xef\x10\xd4\xad\x1c\x9d\xb7\x08\x0a\x32\x2c\xa5\xc1\x34\x93\x4a\x44\x24\x15\xca\x92\x54\x11\x83\x28\x6a\x63\x24\x10\xb1\x19\xc0\xa6\x6d\x53\xf4\xfa\xb3\x6d\x20\xaa\xa4\x12\x5c\xa3\x98\x9b\x08\x43\xc0\xb6\x08\x8a\x7b\x84\xa0\xd0\x65\x04\xc5\xa8\x38\x83\xa0\xd8\x3e\x90\x7c\x97\xe6\xee\x5a\x00\xe5\xfc\x9c\xd7\x6b\x00\x75\xb0\xad\xbf\xe9\xb4\xc7\x41\xca\x01\x80\xea\x73\x99\x49\x40\x9e\xb7\xb2\x88\xf7\x5a\xfe\x17\x7f\x29\x51\xa8\x89\x78\xa8\x57\x7c\x69\xc9\xcc\x7a\xd9\xec\x49\x7f\xa6\xb9\xb2\x46\xd1\xda\xd2\x6a\xea\xf5\xba\x2e\x8c\x62\xca\x32\xbb\x83\x6e\x9e\xaf\x23\x0b\xbb\x68\xd5\xfb\xfd\x4e\xf2\x65\x10\x5a\xd6\xa3\xb0\x0c\xc0\x38\x75\xff\xf4\x02\xcd\xbb\xc8\xee\x0e\x00\x6a\x0b\x00\xbe\x19\xc6\x63\xb6\x1a\xd1\xd1\x27\x41\x7a\x0d\x00\x86\xba\x67\x00\xe0\x76\x00\x2a\xf9\xe0\xf2\xfb\xfc\x39\xff\x79\xf9\xd1\x70\x7f\x74\xc2\x2d\x5d\x0b\xa0\xee\x63\x33\x9b\xf2\xb8\x00\xea\x20\x8c\xeb\x68\x79\x60\x00\x95\x6c\xd6\x56\xa7\xaa\x7d\x0b\x00\xe5\x16\xc0\xe8\x1e\xd9\xd2\xa2\xee\x8e\xff\x0e\x40\xdd\xca\xd1\x79\xbc\x04\x85\x34\xdb\x32\x2c\x4a\x6d\x25\x6d\x04\x15\x53\x82\x49\xcb\x52\x86\x01\x6c\x6a\x9b\x1a\xa6\x04\xd8\xb6\xa0\x80\x5a\xd4\x02\x96\xa9\x31\x53\x28\x93\x09\x9b\x58\xc8\xd6\x98\xbd\x05\x50\xc2\x23\x00\x85\x2f\x03\x28\x4d\x3b\x17\x48\xbe\xbd\xfb\x21\xbf\xef\xb5\x08\x2a\xe5\x50\xaf\xd7\x08\xea\xe0\xd3\x92\xf0\xf1\x5e\xa6\x7f\x44\x50\x68\xd4\xe3\xc3\x76\xa1\x23\xd6\xe5\x78\x64\x24\xf4\x7a\x5a\x26\xb3\x06\xc8\xea\x46\x7a\x92\xee\x24\x32\xe5\x72\x4c\x2d\x24\x4e\x2c\x8a\x31\x50\x41\x0d\x39\xec\x69\xcd\x6e\x8c\xae\xfa\x63\x1c\xcc\x2c\xb2\x50\xd1\x1a\xb7\xa3\xed\x5e\xaa\xd1\x7f\x5a\xd2\x9c\x36\xec\xe6\xaa\xa1\xfc\xbd\x11\x54\xf7\x2e\xb2\xbb\x03\x82\xda\x22\x80\x6f\x86\xf1\xa8\x42\xe2\xe5\xf3\x3a\x8f\xd7\x08\x60\xa2\x7b\x86\x00\x6e\x87\xa0\x52\x0f\x2e\x3f\xa7\xfd\x5f\x92\x9f\x98\x0d\xe3\x27\x96\x48\xae\x45\x50\xf7\xb1\x99\x4d\x79\x5c\x04\x75\x2e\x23\x80\xfe\xd8\x08\xaa\x04\xe4\xe2\x9e\x61\x50\x6e\x11\x8c\xee\x91\x2d\xcd\x80\x3b\xfe\x3b\x04\x75\x2b\x47\xe7\x2d\x82\x52\x88\x22\x83\x73\x82\x34\xc8\x6c\x22\x6c\xc5\x11\xb1\x6c\x6e\x0a\xaa\x28\x94\x94\x1a\x04\x58\x06\x34\x28\x04\x50\x33\xa4\xd0\x2c\x93\x0a\x03\x59\x42\x83\x8a\x9a\x06\x04\xbb\x04\x97\xc0\x23\x08\x45\x2e\x43\x28\x2e\xce\x41\xa8\xed\xdd\x0f\x07\x1b\x5c\x0b\xa1\x9c\xdf\x25\x79\x0d\xa1\x0e\xf2\x9b\x9c\xf8\x30\x5e\xff\x08\xa1\x40\x2f\x40\x35\x4d\xb2\x4a\xa4\xd4\x7f\x69\x07\x92\xf9\x5a\x7b\xd5\x64\xf5\x66\xa7\x94\x33\xcb\x7c\x20\xd2\x3d\xcb\xa0\x51\x2b\xa9\x1a\x3c\x54\xe8\x56\xa3\x9a\xd0\x5e\xc2\xb8\x34\xf0\x57\x53\x74\x16\xa9\x0f\xea\xec\xa5\x67\x4d\xe2\xa2\x8c\xa1\x5e\x9c\x4e\x07\xfe\x74\x8b\xdf\x3f\x1f\xd4\xf0\x2e\xb2\xbb\x03\x84\xda\x42\x80\x6f\xc6\xf1\xd8\xc6\x4b\xf0\x73\x08\xaf\xd7\x10\x60\xa1\x7b\x06\x01\x6e\x07\xa1\xd2\x0f\x2e\xbf\x13\xdf\x25\x9e\x92\x5f\x50\x0f\x0d\xf1\x89\x45\x92\x6b\x21\xd4\x7d\x6c\x46\xd7\x1f\x1a\x42\x1d\xe4\xb3\x3a\x5a\x1e\x18\x42\x9d\xf9\xc8\xe0\x26\x10\xca\x2d\x84\xd1\x3d\xb2\xa5\x69\xde\x1d\xff\x1d\x84\xba\x95\xa3\xf3\x38\x92\x5c\x30\x64\x20\xc4\x35\x81\x39\x15\x16\x46\x96\x12\x16\x93\xd8\xc2\x4a\xe3\x48\x9a\x06\xb7\x91\x05\x0c\xa1\xb0\x84\x9a\x14\x90\x6a\x50\x12\x80\x2c\xcd\xb4\x88\x26\xb9\xdc\x41\x28\x6f\x92\x84\x33\x70\x31\x49\x38\x05\x00\x9d\x0e\x84\x7a\xbb\xfb\xe1\x44\xa7\x6b\x21\x54\xc6\xa1\x5f\xaf\x21\x94\x9e\xa5\xe3\xdd\x4a\xc1\x50\xff\x0a\x84\x6a\x77\xd3\xbd\xd7\x87\xd8\xb0\x4d\x0a\x4d\x16\x1d\xe1\xc9\x7c\x5d\xca\x45\x4d\x59\xce\x2f\x49\x6c\x3a\xca\x80\x52\x73\x36\xa9\x8d\xd3\xa5\xae\x51\x99\x04\x46\xf3\x58\x66\xf2\xb4\x00\x46\x24\x22\x02\xd9\xe6\x74\x15\xad\x27\x91\x9f\xad\xed\x6e\xad\x9e\xae\x84\x03\xa2\xc6\xe4\xfd\x21\xd4\xe4\x2e\xb2\xbb\x03\x84\x3a\x91\x9b\xfa\x3c\x04\x68\xea\x2c\xe3\x3f\xfe\x8e\x87\x10\x00\xe8\x9e\x41\x80\xdb\x41\xa8\xcc\x83\xcb\xcf\x69\xff\x17\xe5\x57\x6c\x77\x8e\x7f\xe0\x76\x35\x84\xba\x8f\xcd\x6c\xca\xe3\x42\xa8\x33\x69\xdd\xf7\xfa\x78\x4c\x08\xd5\x37\x9b\x93\x7b\x06\x42\xb9\x85\x30\xba\x47\xb6\x34\x9e\xb8\xe3\xbf\x83\x50\xb7\x72\x74\xde\x42\x28\x80\x09\xb6\x04\xb7\x6d\xce\x0c\x9b\x18\xd4\x16\x0a\x11\xcb\xe0\x06\xe6\x5c\xd8\x0a\x13\xcb\xd6\x24\x64\xcc\xb4\x2d\xa5\x29\x01\x04\x97\x1c\x9b\x10\xda\x9a\x32\x84\x86\xd0\x0e\x42\x79\x93\x93\x9c\x81\x8b\x39\xc9\x29\x80\xe4\x74\x3e\x83\xb7\xbb\x1f\x8e\xb2\xbc\x16\x42\x65\x1d\xfa\xf5\xfc\xa4\x95\x56\x20\xba\xdb\x20\x7f\x1d\x19\x02\xbd\xa3\x3d\xfa\x00\x42\x75\xf4\x99\x6a\xf5\x14\x4c\xa0\xf5\x04\x17\x64\xaa\x42\x23\x21\x7f\x69\xd2\x5c\x54\xaa\xf9\x52\x6c\x1c\x5d\xad\xc5\x72\x1a\xb3\x3b\xc3\x56\x69\x24\x66\xcd\x6e\x2f\x1d\xee\x45\x60\x34\x22\xb5\xf5\xb2\xdd\x29\x8d\x9a\xad\x60\x12\xea\x60\xb5\xaa\xcc\xe2\x63\x9b\xf7\xe3\xf9\xf6\xec\xfe\xf9\x0c\x16\x77\x91\xdd\x1d\x20\xd4\x16\x02\x7c\x33\x94\xa7\x19\x1e\x0e\x97\xc7\x37\xaf\x3c\x84\x00\x44\xf7\x0c\x02\xdc\x0e\x42\x65\x1f\x5c\x7e\x4e\xfb\xbf\x24\xbf\xda\xba\x33\x22\x9f\xde\xd1\x75\x0f\x20\xd4\x7d\x6c\x66\xcf\xea\x21\x21\x54\x63\x10\x4f\x9d\xc8\x59\xba\xd7\xc7\x63\x42\xa8\xf9\xa2\x33\x3e\x55\xed\x5b\x40\x28\xb7\x10\x46\xf7\xc8\x96\x5e\xe2\xee\xf8\xef\x20\xd4\xad\x1c\x9d\xc7\x1b\x79\x1c\x31\x01\x35\x2a\x4c\x61\x52\x4d\x30\x93\x9a\xa6\x80\x12\x9a\x1a\xb4\x11\xc6\x06\x33\xa9\xc4\x5c\xda\x42\x5a\x54\x68\xcc\xd4\x14\xa3\x14\x68\x9c\x43\xce\x31\x57\xda\x0e\x42\x79\x93\x96\x9c\x81\x8b\x69\xc9\x29\x38\x97\x12\xea\xed\xee\x87\x33\xbc\xaf\x85\x50\x39\x87\x7e\xbd\x86\x50\x95\xb4\x5e\xdb\x0d\xd3\x9b\x21\xcd\x38\xda\xa3\x0f\x21\x14\x89\xb0\xf6\x20\xb7\x1a\x34\x99\x02\xf5\x69\x6a\xaa\x8b\x60\x20\xcc\x33\xf5\xd0\x6c\x96\x0e\x17\xfa\xb1\x82\x50\xb9\xf0\x14\x5b\x11\x09\x9a\x7d\xe9\xcf\x71\x92\x2a\x74\xab\x2a\x24\x49\xc3\x40\x61\xb6\x48\x56\x52\x83\x71\xc7\x7c\x29\x58\xd5\x58\x27\x0c\xeb\x19\x1c\xd4\xef\x1e\x4d\x0e\xee\x22\xbb\x3b\x40\xa8\x2d\x04\xf8\x66\x2c\x4f\x8f\x13\xa6\x3e\x09\xd2\x6b\x08\xc0\x75\xcf\x20\xc0\xed\x20\x54\xee\xc1\xe5\xe7\xb4\xff\x4b\xf2\x9b\xf8\xbb\x81\x1b\xad\x42\xdd\xc7\x66\x36\xe5\x71\x21\xd4\xb9\xdc\xde\xfa\x63\x43\xa8\x33\x1f\x1a\xdc\x04\x42\xb9\x85\x30\xba\x47\xb6\x34\xec\xba\xe3\xff\x06\xa1\x6e\xe4\xe8\xbc\x85\x50\x16\x07\x26\x07\x42\x12\xc0\x28\x03\xc0\xd2\x34\x40\x95\x66\x19\x80\x28\x88\x18\x30\x6c\x2c\x28\x47\x96\x20\x90\x10\x26\x05\xb5\x0d\x61\x2a\xc9\x18\xe3\x40\xd9\xc0\xc4\x3b\x08\xe5\x4d\x5e\x72\x06\x2e\xe6\x25\xa7\x00\x73\x74\x06\x42\x6d\xef\x6e\x21\x94\xc0\x1c\x79\x10\x4e\xee\x54\xb2\xe7\x27\xbb\x20\xff\xe0\x65\xfb\xe6\x66\x48\x2b\x1c\xed\xd1\x07\x10\x2a\x5a\x5f\x2c\xea\x8b\x72\x5a\x86\x66\xcb\x56\xc7\x5e\x46\xc6\xfd\x7a\x73\xce\x50\xaf\xd1\x2e\x2f\x4b\x8a\xe7\x33\x0b\x8d\x36\xa4\x3f\x17\x5c\x35\xfc\x8d\x22\xc9\x24\xd9\x48\x55\xf5\x44\xeb\xa9\xcf\x63\x18\xf7\x5a\x66\x65\x32\x99\xd2\x70\x4f\x6f\x45\x1a\x4f\xeb\x45\xa3\x81\x2b\xf7\x0f\x27\x27\x77\x91\xdd\x1d\x20\xd4\x16\x02\x7c\x33\x96\x67\x9c\xa3\x7a\xe1\xd6\xab\x28\xdb\x9e\xea\x0d\x04\xb8\x1d\x84\xca\x3f\xb8\xfc\x4e\x84\xd6\x9f\x94\x9f\x1f\x75\x86\x27\x5c\xfc\xb5\x10\xea\x3e\x36\xb3\x29\x8f\x0b\xa1\x8e\x7f\x49\xe0\xd0\xc7\x43\x42\xa8\x60\xb0\x3e\x1a\xdc\x33\x16\xca\x2d\x84\xd1\x3d\xb2\xa5\x81\xee\x8e\xff\x0e\x42\xdd\xca\xd1\x79\x7c\xb2\x8b\x05\x0c\x93\x10\x62\x53\x25\x80\x12\x92\x41\x49\xa5\x04\x10\x4a\x6e\x30\x84\x35\xa6\x6c\x64\x69\x0a\x03\x42\x20\x97\x90\x73\x89\x04\x31\x0c\x60\x08\xaa\x11\x60\xf3\x1d\x84\xf2\x26\x31\x39\x03\x17\x13\x93\x53\x40\xc1\xe9\xd3\x85\xdf\xee\xee\x20\x94\x26\x90\x07\xe1\xe4\xce\x21\xc6\xf3\xa3\x5d\x5a\x4f\x64\xe7\xb2\x36\x43\xda\xc5\xa3\x5d\xe6\xcd\x97\x20\x2b\xad\xc2\xad\xe2\xb8\x15\xd1\x92\x64\xb1\xc8\x36\x2d\x30\x09\xce\xfb\x11\x3d\xdf\xb4\xd3\x30\xbc\x7e\x52\xe1\x45\xd5\xe8\xfb\x03\xb9\x44\xb1\x0a\xaa\xa3\x6c\x69\x59\xa6\xb6\x0a\x27\xf5\xec\x28\x55\x97\xb1\xc4\x7c\x3e\x0f\x3d\x55\x1b\xc9\x3e\xcd\xc5\xfd\x2b\x69\xdd\x3f\xa7\x01\xbf\x8b\xec\xee\x00\xa1\x0e\x06\xeb\xc3\x72\x1e\x02\xcc\xc5\x90\x7d\xde\x8d\xf0\x1a\x02\x84\x8f\x70\x76\x09\x01\x6e\x07\xa1\x0a\x0f\x2e\xbf\xcf\x10\xe3\xac\xfc\x42\xf9\x7a\xbb\x89\x3e\xbd\xa3\xeb\x1e\x40\xa8\xfb\xd8\xcc\xa6\x3c\x2e\x84\x6a\xf6\x93\x8d\x13\x1b\xa5\x7b\x7d\x3c\x26\x84\x4a\x4d\x26\xbd\x7b\xc6\x42\xb9\x85\x30\xba\x47\xb6\xd4\x33\xdd\xf1\xdf\x41\xa8\x5b\x39\x3a\x8f\x63\xa1\x88\x01\x25\x94\x40\x40\x2a\x0c\x68\x6a\x86\x41\xb0\x6d\x41\xcb\x04\x36\xe2\x48\x50\x6e\x01\x09\xa0\x89\xb1\x66\x69\x48\x02\x8c\x88\x09\x10\x43\x06\xe5\x96\xc0\x6c\x93\x06\xfc\x15\x42\x79\x94\x99\x1c\x5e\xcc\x4c\x4e\x01\x3b\xb7\x08\xc5\xde\xd7\xa0\x04\x40\x00\x7a\x10\x4c\xee\x3c\x40\xc2\x6b\x00\x95\x4d\x3f\xc5\xdb\xdb\x37\x37\x31\x92\xe2\x68\x7f\x3e\x00\x50\x61\x90\xd1\x44\x77\xaa\x8f\x7a\xc5\x62\x67\x38\x2f\x53\x10\xef\x4e\xd7\xed\x59\x61\x9c\xc8\xb0\x65\xbf\xd0\x8d\x68\xf6\xa4\xf2\x54\xef\x24\x69\x93\xd7\xaa\x39\xd5\xb4\xaa\xb3\x18\x9f\x51\xba\x0e\xae\x1b\x66\x60\x6d\x59\x43\x1e\x94\xed\x59\xb8\x3a\x4a\xa4\x73\x9d\x74\xa3\x11\x0f\xde\x3b\x12\xea\xd0\xed\xdc\x50\x76\x77\x00\x50\x5b\x00\xf0\xcd\x48\x1e\x10\x8d\x0f\x33\x37\x5f\x43\x39\x3a\x01\x70\x07\x00\x6e\x07\xa0\x8a\x0f\x2e\xbf\xcf\x07\xc8\x9c\x97\x9f\xea\x35\x47\xb7\x49\x69\x70\x27\x9b\xd9\x94\xc7\x05\x50\x6d\x2d\x95\x30\x8f\xcb\x77\x2f\xa5\xc7\x04\x50\xfb\x2f\x21\x3f\x97\x5b\x00\x28\xb7\x00\x46\xf7\xc8\x96\x3a\xc4\x1d\xff\x1d\x80\xba\x95\xa3\xf3\x16\x40\x51\x0b\x6b\x96\xe0\xb6\x86\x80\x65\x1b\xd8\x32\x15\x11\x18\x43\x9b\x00\x6c\xd8\x12\xdb\x42\xd9\x10\x43\x84\x6c\xa9\x04\x25\x52\xc3\x86\x66\x30\xce\x0d\xc8\x81\x01\x29\xdc\x65\xd5\x84\x1e\x25\x26\x87\x17\x13\x93\x53\xa0\x91\xd3\x29\x0d\xde\xee\xee\x20\x14\x83\xd0\x83\x60\xf2\x92\x43\xbf\x9e\x1f\xed\x82\x45\xfd\x69\xfb\xe6\x66\x48\x5b\x1f\xed\xd1\x07\x10\xaa\x56\x6e\x19\x34\x5f\xd2\xb3\x4f\xf3\x0a\xed\x96\xc2\xf9\x97\xec\x48\xac\xda\x64\x12\x52\xe3\x4e\x99\xce\xe3\x25\x5a\x89\xe1\x74\x3b\x1b\xc5\x1c\xae\xe3\xa3\x5e\x5f\xda\x89\x4e\x2a\x13\x2b\x02\xa4\x06\xdd\xe1\x20\x1b\x9b\xc6\xaa\xf1\xf9\xcb\x7a\x50\xc9\x77\x62\x2f\x79\xcc\xc5\xdd\xb7\xf1\x02\xe1\xbb\xc8\xee\x0e\x10\x6a\x0b\x01\xbe\x19\xc9\x83\x47\xf5\x64\xf5\x93\x20\xbd\x86\x00\x69\xdd\x33\x08\x70\x3b\x08\x55\x7a\x70\xf9\x39\xed\xff\x92\xfc\x5e\x2c\x15\xfc\x5c\x35\x5d\xf7\x00\x42\xdd\xc7\x66\x36\xe5\x71\x21\xd4\xb9\x33\x7a\xf5\xc7\x86\x50\xaa\xbc\x6a\xdf\x33\x12\xca\x2d\x84\xd1\x3d\xb2\xa5\x76\xd9\x1d\xff\x1d\x84\xba\x95\xa3\xf3\x16\x42\x49\x6c\x71\x64\x12\x69\x22\xac\x29\x4d\xb3\x31\xa7\x36\x36\x2d\x9b\x4a\x4c\xb9\x29\x0d\x93\x18\xc0\x84\xc8\xd0\x6c\xca\x0d\x2a\x4c\x28\x34\xdb\x32\x24\x97\x1a\x03\x10\x98\xbb\xbc\x9a\xd0\xa3\xcc\xe4\xf0\x62\x66\x72\x0a\xb8\xc6\xcf\x40\xa8\xed\xdd\x2d\x84\x82\x00\x01\x0f\x82\xc9\x9d\xbb\xee\x9e\x9f\xed\xd2\xe6\x23\xb9\x7d\x73\x33\xa4\x7d\xce\xb8\xac\x3b\x52\x1a\x24\x16\x11\x73\xb8\xd6\x45\x9e\x54\x3a\xfe\xa9\x1e\xd0\xbb\xa3\x96\x31\xcf\xb6\x59\x6c\x82\x11\x35\x62\xa1\xc0\xa8\xd4\x66\x09\x7f\x2a\x83\x8b\x95\x58\x74\x52\xcf\xa3\xf2\x22\x04\xc7\xca\x6c\xd6\x87\xf5\xe9\xb0\x1a\x82\x4f\x2f\xdd\xa4\x15\x49\x17\xd7\x6a\x16\x6f\x0c\xad\xc4\xfd\x21\x54\xfc\x2e\xb2\xbb\x03\x84\xda\x42\x80\x6f\x46\xf2\xb0\x41\xad\xd9\xbb\xf9\x2a\x4a\x5e\xf7\x0c\x02\xdc\x0e\x42\x95\x1f\x5c\x7e\x27\xce\xb9\x39\x29\x3f\xa0\xcb\xf1\x6d\x22\xa1\xee\x64\x33\x9b\xf2\xb8\x10\x6a\xd0\x4b\x0f\x4f\xae\xe5\x3c\x36\x84\x1a\x0c\x61\xf3\x9e\x91\x50\x6e\x21\x8c\xee\x91\x2d\x35\x17\xee\xf8\xbf\xa5\x34\xb8\x91\xa3\xf3\xf8\x7b\x3c\x20\x30\xd6\x94\xb2\x6c\x88\x19\x63\x14\x0a\xa4\x38\x01\x06\xc2\x86\x8d\x98\xc1\x99\x6d\x72\x6a\x08\x6c\x18\x04\x40\x0b\x4b\x68\x2a\xa2\x14\x92\xd0\xa0\x9a\x40\xf0\x2d\x98\xdc\xa3\xdc\xe4\xf0\x62\x6e\x72\x0a\x01\x65\xa7\x21\xd4\xee\xee\x0e\x42\x11\x0c\x3c\x08\x26\xaf\x38\xf4\xeb\x35\x84\x8a\x65\x34\x8a\x74\xbd\x06\x49\xbe\x5b\x54\x9d\xfe\xf1\x45\xea\xc3\x8d\xbc\x56\x0f\x56\x5a\xeb\x04\xc5\xbd\x8a\xe8\x0c\xd2\x93\x52\x50\xf8\x43\xd4\x3f\x1d\x83\x8e\xac\x06\x9b\x45\x13\x24\x83\x7d\xab\xf8\xd2\x7b\x31\xf2\xfe\x6e\x28\xdc\x9c\x97\x9e\x3a\x76\x31\x15\x9a\xe5\x59\x33\x2d\xa2\x89\x60\xd1\x1e\x46\x6a\x25\x32\x1a\xab\x3c\xe8\x8f\x52\xf3\x60\xf0\xee\x10\xca\x33\xd9\x41\x7f\xf3\xb4\xec\xee\x00\xa1\x36\xc3\xd4\x89\xa3\xda\x8e\xc9\x70\x53\x84\x1e\x7d\xf9\x9c\x7a\xc9\x6b\x08\x50\xd6\x3d\x83\x00\xb7\x83\x50\x95\x07\x97\x9f\xd3\xfe\x2f\xc9\x4f\xcb\x56\x7b\x3d\xff\x51\x4f\x79\x2d\x84\xba\x8f\xcd\x6c\xca\xe3\x42\xa8\x11\xcb\xd4\x3f\x1f\xf9\xe8\xd0\xc7\x63\x42\xa8\x05\x27\x6a\x7e\x22\xe9\xea\x2d\x20\x94\x5b\x08\xa3\x7b\x64\x4b\x76\xda\x1d\xff\xb7\x8d\xbc\x1b\x39\x3a\x8f\x83\xc9\x21\x01\x96\x65\x03\x53\xa3\xb6\xb6\xf9\xcb\xd2\x04\x16\x50\x31\x83\x0a\x81\x0c\x61\x52\x66\x08\x13\x61\x13\x10\x00\x00\x37\x04\xe0\xa6\x06\x24\x81\x58\x19\x00\xef\x0e\x18\x46\x1e\xe5\x26\x87\x17\x73\x93\x53\x08\xcf\x1c\xef\xf2\x76\x77\x07\xa1\x38\x01\x1e\x04\x93\x3b\x67\xe4\x9e\x1f\xef\x42\xb4\xe4\x6e\xb3\x65\x33\x2b\xfc\x3c\x64\xeb\x1f\x21\x54\x55\x9b\x75\x02\x43\x73\x9a\x29\xd8\x12\xa6\xd9\x53\x09\x4c\x8b\xad\x0e\xc8\x3f\xf5\xc4\xca\x18\x89\x20\xeb\xe4\xfb\xe3\x62\xb8\xac\x02\xc5\x85\xfe\x32\x33\xcb\xb0\xae\xa7\x7b\x26\xae\xad\x5f\xe2\x81\x15\xa6\xe1\xc9\xac\x92\x01\x5d\xd0\x0a\x71\xe8\x1f\x8f\x83\x99\xe0\x34\x7e\xf7\xc4\x9a\x87\x3e\xf8\x86\xb2\xbb\x03\x84\xda\x42\x80\x6f\xc6\xf2\x3c\xad\x7b\xa3\x86\xed\x8c\x89\xf5\x1a\x02\xd4\x8f\xca\xc4\x15\x04\xb8\x1d\x84\xaa\x3e\xb8\xfc\x4e\xac\xc8\x9d\x92\x5f\x58\x8f\x15\xe6\xf8\x36\x10\xea\x3e\x36\xb3\x29\x8f\x0b\xa1\x26\xb9\x6c\x6c\xfc\x39\xa9\xea\x47\x7d\x3c\x26\x84\x62\x79\xcd\xf4\xdf\x11\x42\xb9\x85\x30\xba\x47\xb6\x64\x0d\xdd\xf1\xdf\x41\xa8\x5b\x39\x3a\xaf\x63\xa1\x08\xa3\x18\x50\x8d\x28\xd3\xa6\x88\x52\x88\x0c\x0a\x39\x91\x36\x13\x5c\x08\x4b\x50\xc9\x11\x53\x26\x33\x0c\x69\x21\x05\x0c\x64\x61\x62\x60\x65\x4b\x4c\x91\xa5\xed\x36\xf2\x90\x47\xb9\xc9\xe1\xe5\xdc\xe4\x10\x89\x33\x59\xa1\x76\x77\xb7\x10\x0a\x21\x22\x3c\x08\x27\xaf\x39\xf4\xeb\xf9\xf1\x2e\x1d\x26\x67\xdb\x37\x37\x3d\xee\xf3\x71\x1c\xba\xe3\x8c\xe1\xf0\xfa\xc9\x6c\xa7\x1a\xd5\x70\x2d\xde\x9b\x84\xab\xd3\x71\x1d\xc6\xdb\xd0\x5e\x0f\xe5\x12\x59\xd1\x60\xd8\x1f\x99\x81\x68\x2b\xbb\x7a\x31\x16\x02\x84\xe6\x93\xa7\x2e\x96\x95\x6c\x3f\x9f\x2a\x05\x56\x65\x9a\xa8\x76\xc2\x73\x8b\x65\x47\x4f\xc3\x0a\x6e\x3f\x69\xc9\x5c\x6e\xba\xbc\x7b\x56\xa8\x40\xf9\x2e\xb2\xbb\x03\x84\xda\x42\x80\xef\xc5\xf2\x04\xf4\x00\x30\x84\xff\xd6\x10\xc0\xd4\x3d\x83\x00\xb7\x83\x50\xb5\x07\x97\x9f\xd3\xfe\x2f\xc9\x2f\x38\x4e\x27\x6f\xb4\x0a\x75\x1f\x9b\xd9\x94\xc7\x85\x50\xaf\x38\x25\xf7\x97\x84\x50\xa1\x50\xf7\xc9\xc8\xdd\x11\x42\xb9\x85\x30\xba\x47\xb6\x64\x86\xdd\xf1\x7f\x3b\x63\xf8\x46\x8e\xce\xe3\xe3\x5d\x4c\x24\x21\x33\x25\x47\x86\x66\x01\xc3\x12\x00\x9b\x88\x11\x8e\x34\xcc\x4c\x53\x19\xc2\x26\xca\x96\x40\xd3\x80\x06\x95\x86\x38\x11\x8c\x12\x03\x4b\x53\x59\x82\x40\xbc\x0b\x27\x47\x1e\xe5\x26\x87\x97\x73\x93\x43\x02\xcf\x20\xa8\xcd\xcd\x1d\x80\x62\x54\x78\x10\x4c\xee\x0c\xac\xf5\xfc\x70\x17\x6b\x5d\xdd\x8d\x8c\x65\xfd\xf3\x80\xbc\x2b\x07\x00\x2a\x31\x18\x4f\x6b\xd1\x55\xa7\xfb\x32\xd2\x13\x7a\xc4\x0e\xd5\x41\x62\x95\xe8\xd4\xec\xa2\xf0\x2f\x6b\xa9\x54\xcc\x9a\xe1\x5a\x09\x81\xf8\x72\x94\x08\x06\xf2\x28\x09\xec\x56\x7d\x50\x69\x4f\xc0\x74\x60\x48\x33\x28\xfc\xf3\x92\xd9\x4f\x0d\xaa\xcb\x64\x13\x0e\xa3\xc1\x82\x98\x4d\xee\x9e\x99\x3c\x50\xbf\x8b\xec\xee\x00\xa0\xb6\x00\xe0\x7b\x91\x3c\x01\xfd\x65\x1d\x1c\xdd\x7c\x0d\xa5\xa9\x7b\x06\x00\x6e\x07\xa0\xea\x0f\x2e\xbf\x13\x81\xf5\x27\xe5\x17\x8a\xfb\x9b\xf4\x36\x00\xea\x3e\x36\xb3\x29\x8f\x0b\xa0\x16\x34\xd7\x5f\xff\x35\x01\x54\x9a\x06\x1a\xf6\x1d\x01\x94\x5b\x00\xa3\x7b\x64\x4b\xb2\xe9\x8e\xff\x0e\x40\xdd\xca\xd1\x79\x1c\x4c\x0e\x0c\xcb\xb0\x0c\x28\x25\xa6\x86\x66\x23\xa9\x4c\x04\xa0\xc1\x20\xb7\x4d\x49\x05\x01\x54\x11\x13\x6b\xd4\xe6\xb6\xc6\x24\x22\xca\x46\x54\x71\x4e\xa5\x60\xb6\xa5\xa9\xb7\x6d\x3c\x8f\x32\x93\xc3\xcb\x99\xc9\x21\x3d\x93\x12\x6a\x7b\x73\x0b\xa0\x30\x60\xdc\x83\x50\xf2\x86\x43\xbb\x9e\x1f\xed\x32\x67\xcb\x9d\x51\x6d\x06\xac\x8b\x5f\xe3\x45\x5f\x96\x41\xbf\xd9\xb6\x84\x48\x24\xc3\x81\x39\xab\x6b\xf3\x7e\xb7\x0c\x67\x4f\xe5\xfc\x53\x71\x11\x5a\xc6\xe2\x9d\x94\x4a\xf7\xfb\xe3\x29\x2d\xcf\x51\x29\x38\x61\xc1\x29\x99\x0e\xbb\xf3\x45\xa7\x17\x9d\x18\x81\x21\x9c\x98\x65\x3e\xc8\xf7\x17\xb3\xda\xac\xcd\x0d\x3b\x13\x2d\xe9\x77\x07\x50\xe6\x5d\x64\x77\x07\x00\xb5\xf1\x6a\x27\x0e\xbb\x3d\x26\xc3\x0d\x7b\x7d\x95\x23\xd9\x9b\x03\x80\xae\xee\x19\x00\xb8\x1d\x80\x6a\x3c\xb8\xfc\x9c\xf6\x7f\x49\x7e\x92\xb0\x22\xbc\x0d\x80\xba\x8f\xcd\x6c\xca\xe3\x02\xa8\x75\x36\x5f\xad\xfd\x35\x01\x54\x35\x13\xae\xdd\x33\x0e\xca\x2d\x80\xd1\x3d\xb2\xa5\x3a\x77\xc7\xff\x2d\xa9\xe6\x8d\x1c\x9d\xb7\x00\x4a\x18\x02\x50\x4a\x18\x62\xa6\x30\x6c\x89\x05\x33\x88\xcd\xa0\x69\x0a\x08\x2c\xcc\xb1\xc4\xdc\x86\x08\x61\x93\xdb\x94\x68\x5c\x59\x96\x62\xb6\x62\x40\x6a\x36\xb2\x09\x78\x5b\x81\xf2\x28\x2f\x39\xbc\x9c\x97\x1c\x32\x7a\xe6\x80\xe1\xdd\xdd\x1d\x84\x22\x1a\xf7\x20\x94\x5c\x3a\xf4\xeb\xf9\xd1\x2e\x92\x05\x77\x6e\x6e\x33\x64\xcd\x8e\xf6\xe8\x03\x08\x55\x2a\xf3\x5a\x15\xc4\x52\x95\xa4\x1e\x68\x1b\x69\xb3\x02\x62\xb8\xb2\x2c\x77\xa3\x2d\xbf\x95\x6f\x95\xcd\x34\x50\x91\x60\x37\xb2\xae\x34\x55\xad\x5f\x17\x4d\x58\xf1\xa7\x07\x39\x11\x9a\x64\x26\x50\xb6\x47\xb3\x44\xa5\xa7\x47\x8b\x20\xc0\x79\x73\x69\xf4\x87\x79\xda\x62\xe3\xd0\xdd\x21\x54\xf3\x2e\xb2\xbb\x03\x84\x6a\x38\xc5\xb5\x2d\xe7\x21\x40\x74\x96\xed\x4e\x6f\x0e\x01\x86\xba\x67\x10\xe0\x76\x10\x4a\x3e\xb8\xfc\x9c\xf6\x7f\x49\x7e\x8b\x12\xa8\x64\x6e\x03\xa1\xee\x63\x33\x9b\xf2\xb8\x10\x0a\x76\x0a\x11\xed\xaf\x09\xa1\xec\x56\xac\x72\xcf\x38\x28\xb7\x10\x46\xf7\xc8\x96\x6a\x75\x77\xfc\x77\x10\xea\x56\x8e\xce\xe3\xa4\x9a\x0a\x6a\x8a\x6b\xb6\x69\x49\x8a\x05\xd6\x2c\x4d\x33\x0d\x1b\x2a\xc4\x28\xb7\x4d\xcb\x26\x50\x19\x80\x71\xa1\x04\x23\x82\x12\x6a\x18\x90\x48\x2a\x18\xe0\x18\x29\x6a\xec\xf2\x92\x23\x8f\xf2\x92\xc3\xcb\x79\xc9\xa1\xc6\xcf\x7d\x8d\xb7\xbd\xbb\x83\x50\x9c\x73\x0f\x42\xc9\x9d\xa7\x47\x79\x0d\xa1\x4a\x11\x5a\xdc\x1d\x7b\xb5\x19\xb2\x2e\x26\x34\x48\xb5\x7a\x04\x4a\x35\x4f\x01\x55\x6d\x94\xfc\xd6\x52\x74\x16\x91\x42\xc5\xd0\x06\x21\x15\x9a\x74\x72\x6a\x96\x4b\x26\x69\x3e\x18\x68\x56\x1b\x9d\x40\x35\xb2\x58\x14\x6a\xeb\xa7\x66\xa9\x1d\x33\xcd\xe0\x3c\x4a\xab\xc4\x12\x78\x66\xea\x65\xb2\xcc\x76\x8d\x60\x07\x56\x62\xe2\xfe\x5f\xe3\x75\xef\x22\xbb\x3b\x40\xa8\x2d\x04\xf8\x66\x1c\x4f\x3a\x2c\x22\xa5\x9b\x43\x80\x89\xee\x19\x04\xb8\x1d\x84\x32\x1e\x5c\x7e\x9f\x4f\x8f\x3b\x2b\xbf\x48\xa8\x31\x1d\x06\x6e\x03\xa1\xee\x63\x33\x9b\xf2\xb8\x10\x0a\x93\x02\xb4\xff\x9a\x10\x6a\x08\x93\xe5\x7b\xc6\x41\xb9\x85\x30\xba\x47\xb6\x54\x01\xee\xf8\xef\x20\xd4\xad\x1c\x9d\xc7\x5f\xe3\x21\x4d\x53\x44\x1a\xb6\x66\x01\x0b\x23\x66\x4b\x86\x95\x62\x88\x40\x6a\x6b\x12\x42\x4d\x11\x4c\x28\x06\x1a\x62\x9a\x66\x41\x9b\x29\xc1\x20\x37\xb9\x85\x0c\x83\x53\x44\x76\x10\xca\xa3\xbc\xe4\xe8\x72\x5e\x72\x28\xc0\xb9\x55\xa8\xed\xdd\x2d\x84\x22\x48\x68\x1e\x84\x92\x3b\x3f\xf8\xf5\xfc\x68\x97\x05\xe9\xec\x3a\xd2\x66\xc8\x3a\x9e\xef\xe4\x00\x42\x2d\x3b\xf6\x4c\x9f\xd4\x26\xe3\xd2\x72\xfe\x44\x33\x95\xfa\x60\x62\x80\xc9\xf0\x25\xc8\x1a\xc3\xde\xac\xe4\xaf\x0d\x8d\xce\x78\x4a\xa8\xd2\x55\xa6\x91\x5e\x8c\x84\xbf\x50\x41\xad\x54\x6d\x55\xec\x56\xb2\x95\x2e\xca\x72\x48\xfc\x56\x73\xa5\xe4\x48\x4b\x3f\xa5\x9a\xd5\xb6\x91\x0b\xdc\xfd\x6b\xbc\xe1\x5d\x64\x77\x07\x08\xb5\x85\x00\xdf\x8c\xe4\xc9\x23\x43\xea\x37\x87\x00\x0b\xdd\x33\x08\x70\x3b\x08\x65\x3e\xb8\xfc\x3e\x7f\xf0\x7f\x5e\x7e\xe5\x64\x3f\x55\xb8\x0d\x84\xba\x8f\xcd\x6c\xca\xe3\x42\x28\x96\x29\xf6\x42\x7f\x4d\x08\xb5\x4a\x64\x8a\xf7\x8c\x84\x72\x0b\x61\x74\x8f\x6c\xa9\x9c\x77\xc7\x7f\x07\xa1\x6e\xe5\xe8\x3c\xfe\x1a\x4f\x61\x86\x90\x61\x33\x4b\x1a\x10\x69\x0c\x52\x0a\x20\x31\x38\xe6\x9a\x8d\x18\x94\xc0\x30\x6c\x43\xd9\x88\x68\xa6\x94\x80\x2a\x61\x12\x43\x71\x93\x0b\x60\x49\x4b\xd0\xb7\x55\x28\x8f\x32\x93\xa3\xcb\x99\xc9\x11\x40\x67\x12\x1a\x20\x80\xf6\x69\x35\x89\x06\x34\x0f\x82\xc9\x2d\x87\x7e\x3d\x3f\xdc\xc5\xc0\xeb\xc9\xf6\xcd\xcd\x90\x65\x1f\xed\xd1\x07\x10\xca\x8c\xb4\x3b\xed\x51\xc5\xdf\x6b\x14\xe2\xa1\x7a\xdb\xcc\x8c\x62\x91\xc5\x40\xa6\x48\x02\x44\xfa\x8b\xae\x39\x06\x51\x51\x59\xc6\x48\xaf\x51\xac\x37\x53\x9d\x66\x7e\x30\x6f\x0e\xda\xc1\x40\x7e\x3c\x9f\x21\xf5\xb2\x7a\xc9\x46\x62\x41\x1e\x03\xa4\xa4\x85\x44\xa7\x36\x51\xf5\x31\xb9\x7f\x42\x83\xc9\x5d\x64\x77\x07\x08\xb5\x71\xb1\x9f\x8f\x18\x3b\x0f\x01\x2a\xc1\x51\x1b\xdc\x1c\x02\x00\xdd\x33\x08\x70\x3b\x08\x65\x3d\xb8\xfc\x9c\xf6\x7f\x49\x7e\xed\xbe\xf5\x24\x6e\x03\xa1\xee\x63\x33\x9b\xf2\xb8\x10\x8a\xb7\x4b\xe5\xc1\x5f\x13\x42\x69\x56\x3e\x7f\xcf\x58\x28\xb7\x10\x46\xf7\xc8\x96\x8a\x13\x77\xfc\x77\x10\xea\x56\x8e\xce\xe3\xaf\xf1\x00\x30\x39\x96\x8a\xdb\xd8\x02\xa6\x45\x6c\xa8\x31\x40\xa1\x06\x39\x92\x86\x65\x03\x42\x80\x32\x25\x53\xb6\x69\x21\x03\xd8\x92\x0b\x2c\xa5\xc9\xa9\x81\xa9\x22\xc8\x34\x76\x10\xca\xa3\xcc\xe4\xe8\x72\x66\x72\x04\xe9\x99\x84\x06\xbb\xbb\x5b\x08\x45\x21\x64\x1e\x84\x93\x2b\x87\x7e\xbd\x86\x50\xe9\x28\x0e\xef\xd2\xc4\x6d\x86\xac\xcf\x1b\x2f\xfa\x47\x08\x65\xc4\x56\xc9\xe9\x3a\x1f\x06\xab\xaa\xad\x07\x17\x55\xfb\x09\x8e\xea\x15\x9c\xcb\x46\x4d\x3d\xb9\xec\x65\xa6\xd3\x54\x92\x04\x68\xaa\x5f\xc3\xa4\xb2\x28\xc7\xa3\x9d\x6a\xec\x25\x19\x6f\x2f\xfc\x32\x34\x9d\xc8\xf8\x4b\x20\x11\x67\xc8\xb0\xbb\xf5\x01\x4b\xb6\xd3\xd5\x76\x61\xd0\xd3\xef\x0e\xa1\x16\x77\x91\xdd\x1d\x20\xd4\x16\x02\x7c\x33\x96\xa7\x3e\x1a\xd8\xf3\x9b\x43\x00\xa2\x7b\x06\x01\x6e\x07\xa1\xd4\x83\xcb\xcf\x69\xff\x97\xe4\x37\x9b\x56\x42\x91\xdb\x40\xa8\xfb\xd8\xcc\xa6\x3c\x2e\x84\x7a\xc2\xe5\x70\xea\x2f\x09\xa1\xc2\xe1\x65\x29\x7b\xcf\x58\x28\xb7\x10\x46\xf7\xc8\x96\x0a\x71\x77\xfc\x77\x10\xea\x56\x8e\xce\x5b\x08\x85\x6d\x0d\x43\x83\x31\x13\x4a\x6c\x21\x93\x98\xb6\xb0\x20\x35\x0c\xa8\x29\x01\x81\xa1\xa4\x64\x36\xb3\x25\x93\x9a\x66\x9a\xa6\x6d\x31\x64\x53\x25\x0d\xd3\xc2\xca\xb4\x4d\x73\x77\xc0\x30\xf2\x28\x33\x39\xba\x9c\x99\x1c\x9d\x5d\x84\x42\xfb\xa4\x9a\x94\x22\xe6\x41\x30\xb9\x73\x8e\xe6\xf9\xd1\x2e\x4b\x54\xde\x2d\xa5\x9f\xc8\x83\xac\x7f\x04\x50\xdd\x6e\xe3\x85\x4e\x2a\x0b\x93\x8e\xc6\x2c\x53\xb7\x5f\x7a\xc5\x7a\x37\xaf\xe6\x63\xa4\xe1\xb6\xd1\xca\x8a\xf0\xa2\xb2\xea\x66\x51\x3f\x4f\x9e\xba\xf2\x29\x30\xce\x77\x9e\x9e\x16\xb6\x39\x99\x25\x22\x46\x54\xaa\x30\xcb\x4c\xd7\xf9\x65\xc9\xd6\x6a\x79\x19\x6d\x8c\x16\x9d\x2e\x0d\xde\x3d\x23\x14\xb8\x8b\xec\xee\x00\xa0\xb6\x00\xe0\x9b\x91\x3c\xc6\xb8\x92\x5f\xde\x1c\x00\x70\xdd\x33\x00\x70\x3b\x00\x65\x3f\xb8\xfc\x3e\xaf\xd1\x9c\x97\x1f\xb1\x53\xb5\xd1\x6d\x00\xd4\x7d\x6c\x66\x53\x1e\x16\x40\x05\x02\xe9\xf2\x7a\xfe\xd7\x04\x50\xd9\x48\x35\x73\xcf\x48\x28\xb7\x00\x46\xf7\xc8\x96\x72\x5d\x77\xfc\x77\x00\xea\x56\x8e\xce\x5b\x00\x45\x04\x32\xb9\x89\x38\xe0\x86\xcd\x88\x30\x24\x46\xd0\x06\xb6\x46\x2d\x4b\x42\x48\x39\x84\x40\x33\x6c\x1b\x21\xa1\x6c\x42\x35\x4c\x80\x94\x06\x27\x82\xd8\x54\x5a\x04\xa2\x2d\x80\xc2\x1e\xe5\x25\x47\x97\xf3\x92\x23\x82\xcf\xad\x41\x6d\xef\xee\x20\x94\xc0\xcc\x83\x60\x72\xe7\x60\xe8\xf9\xd1\x2e\x26\xec\xed\xde\x2c\x9f\xee\xd4\x87\x29\x0d\x86\xcb\xfc\x04\xb7\x9f\x64\x98\x65\x75\xd5\x0c\x74\x4b\x7d\x1d\x58\x2f\x61\x69\x85\x28\x81\xc1\x48\xb9\x9e\xae\xe4\xa1\x0c\xb6\xdb\xb4\x3d\x4c\xa5\x65\x8e\xb5\xe9\xb0\xd8\xa0\x4f\xc4\x04\x15\xbb\x8e\xd2\x7a\xae\x3f\x5a\x5a\x99\x60\xb6\x8e\xe7\x8b\x18\xa9\x85\xf8\xea\xfe\x10\x8a\xdc\x45\x76\x77\x80\x50\x5b\x08\xf0\xcd\x48\x1e\x15\x5b\x41\x76\x6b\x08\xb0\x1d\xb0\xbc\x81\x00\xb7\x83\x50\xcd\x07\x97\xdf\x67\x30\x74\x5e\x7e\x7e\xae\xf3\x1b\x41\xa8\xfb\xd8\xcc\xa6\x3c\x2e\x84\x0a\xb5\x2a\x9d\xd2\x5f\x13\x42\xd5\x1a\x8d\xd4\x3d\x23\xa1\xdc\x42\x18\xdd\x23\x5b\xca\xea\xee\xf8\xbf\xa5\x34\xb8\x91\xa3\xf3\x16\x42\x99\x00\x5b\xb6\xa1\x24\xa6\x0c\x30\xc3\xa2\x8c\xda\x98\x01\x21\x31\x60\x52\x22\x4d\x72\x24\x25\x24\x06\xb6\x2d\x48\x90\x0d\x25\xc4\x86\x26\x4c\xc8\x35\x68\x53\x22\xf1\x6e\x1b\x0f\x7b\x94\x97\x1c\x5d\xce\x4b\x8e\xe8\xb9\xa4\x50\xbb\xbb\x5b\x08\xc5\x30\xa1\x1e\x04\x93\xb7\x1c\xfa\xf5\x1a\x42\x45\x62\x00\xee\xa2\x55\x36\x43\xd6\xc5\xbc\xe4\xbd\x52\xb4\x47\x53\x3d\xad\x5a\x60\xc3\x61\x6c\x48\x4a\xb9\x52\xac\x9d\x9b\xe4\x5a\xf5\x7c\xd8\xcc\xcd\x22\x16\xe9\x19\x2b\x82\x07\xed\xb6\x3d\x09\x06\x07\xa9\x6e\xc3\x5e\x0f\x1b\xf5\x65\x36\xd4\xd7\x63\xb1\xb9\xbf\x50\xeb\x4e\xba\x81\x98\xa6\x0a\xdd\x65\xb0\x51\x0f\x14\x6a\x85\xfc\xfd\xd3\x6a\xf2\xbb\xc8\xee\x0e\x10\x6a\x3f\x40\x7c\x28\xe7\x21\x80\xed\xd7\x73\xc9\x9b\x43\x80\xb0\xee\x19\x04\xb8\x1d\x84\x6a\x3d\xb8\xfc\x9c\xf6\x7f\x41\x7e\xd1\x48\x08\xae\x6e\xb4\x8d\x77\x1f\x9b\xd9\x94\xc7\x85\x50\x11\x54\x2d\xe2\xbf\x26\x84\x6a\x4e\xcd\xc4\x3d\x23\xa1\xdc\x42\x18\xdd\x23\x5b\x4a\x9b\xee\xf8\xef\x20\xd4\xad\x1c\x9d\xc7\xab\x50\x48\x11\xcd\xe6\xb6\x65\x1a\x1a\xe6\x26\x27\x44\x41\x4a\x99\x29\x6c\x69\x41\xae\x0c\xce\xb9\x66\x69\x9c\x71\xa8\x6c\xaa\x04\x83\x8c\x0b\xae\x0c\xa6\xa0\x49\x15\x57\x6f\x10\xca\xa3\xbc\xe4\xe8\x72\x5e\x72\xc4\xce\x6d\xe3\xb1\xfd\x36\x1e\xd3\x28\xf5\x20\x94\xbc\xed\xd0\xae\xe7\x07\xbb\xac\x40\x64\xe7\x09\x36\x03\xd6\xe7\x0c\x83\xfa\x47\x00\x25\x8b\xc3\xb0\xe9\x4f\x2e\xe5\x10\x37\x58\xb3\x3c\x29\xb5\x60\xde\x4e\x75\x7a\x25\xc2\x59\x29\x9f\x6c\x4e\x67\x22\xd3\x7a\x29\xf1\xf0\xba\x98\x47\x9d\x48\xb0\xda\xcc\x3d\x0d\xad\x44\x79\x50\x8a\xe7\x0a\x65\x8d\x84\xb2\xcd\x97\x45\xb8\x69\xc6\x02\xd1\xd1\x70\x2e\xe5\x64\x82\x48\xe8\xde\x6b\x50\x87\xa6\x74\x43\xd9\xdd\x01\x40\x6d\x01\xc0\x37\xe3\x78\x5a\x79\x61\xb6\x6e\x0e\x00\x8e\x4e\x00\xdc\x01\x80\xdb\x01\xa8\xf6\x83\xcb\xcf\x69\xff\x97\xe4\x17\x43\x23\x7c\x9b\x50\xf2\x3b\xd9\xcc\xa6\x3c\x2e\x80\x8a\xa7\x6a\x41\xe3\xaf\x09\xa0\x5e\x02\x76\xec\x9e\x71\x50\x6e\x01\x8c\xee\x91\x2d\x25\x89\x3b\xfe\x3b\x00\x75\x2b\x47\xe7\x2d\x80\x52\x4a\x30\xce\xa8\x65\x9b\x52\xe3\x26\xc1\x26\x01\x1a\xc1\x50\xb3\xb1\x65\x98\x96\x66\x4a\xa1\x71\x46\xb0\x21\x34\x6c\x98\x42\x52\xcb\x24\x36\xa2\x9c\xdb\x82\x43\x93\x59\xda\x0e\x40\x79\x94\x97\x1c\x5d\xce\x4b\x8e\x34\x2e\xce\x20\xa8\xed\xdd\x2d\x84\xd2\x20\x23\x1e\x84\x92\x77\x1c\xfa\xf5\xfc\x68\x97\xc9\x34\xb0\x8b\x56\xd9\x7c\xb0\x7c\x1c\xa6\x1c\x40\x28\x14\x59\x0c\xd5\xa0\x96\xa8\x64\x4b\x6d\x31\x5c\x55\x63\xab\x4c\xea\x09\x2c\x52\x05\xab\xdd\x0d\x2d\x02\xe4\xc5\xca\x24\xfa\x9d\xa7\x6c\xbe\xcd\x25\xe8\x14\x9a\x9d\x7c\xd4\x0f\xfd\xe1\x49\xf1\x85\x73\xfa\xa2\xf5\xcb\xf3\x1a\xd5\x6a\xc1\x4e\x39\x1a\x7b\x1a\xdb\x1a\x08\x3c\x05\x23\x77\x0f\x25\x0f\x86\xef\x22\xbb\x3b\x40\xa8\x2d\x04\xf8\x66\x24\x4f\x4b\xbc\x58\xfe\x9b\x43\x80\xb4\xee\x19\x04\xb8\x1d\x84\xea\x3c\xb8\xfc\x9c\xf6\x7f\x49\x7e\xf1\x4e\x95\x1a\xb7\x81\x50\xf7\xb1\x99\x4d\x79\x5c\x08\x95\x6c\xd6\x96\xfe\xbf\x26\x84\x5a\x57\xda\xd1\x7b\x46\x42\xb9\x85\x30\xba\xf7\xb6\xe4\x06\x42\xdd\xca\xd1\x79\x0c\xa1\xa4\x20\x94\x60\x26\xb1\xc1\x28\x50\xb6\xe4\x1c\x30\xac\x34\xac\x51\xc8\x4d\x1b\x0a\xc4\x2d\x21\x09\xb6\xa0\x34\x24\x56\x26\xe3\x44\x03\xc4\x86\x0c\x18\x58\xc3\xf8\xb5\x12\x64\x8b\x78\xa2\x41\x84\xf3\x11\x14\x2b\x87\x29\xd2\xd3\xb5\x72\xa4\x1c\xc3\x7a\x3d\xa1\xd7\x6a\xd1\x5a\xad\x82\x2a\xb1\x5a\xbd\x5e\x60\xe1\x7a\x2d\x5c\xca\x25\x43\xb5\x46\x51\xaf\x32\xad\x96\x25\x7b\x04\x45\xc5\xc5\x48\x72\xae\x69\xe4\xf4\x2e\xde\xdb\x5d\xa8\x41\x4d\x70\x0d\xa3\x7d\x56\xcd\x54\x95\x44\x80\x6a\x65\x99\xbe\x12\x41\x90\x9b\x44\xc3\xcd\xb9\x09\x35\x08\xcb\x82\xd7\x3b\xa4\x9f\xea\xf6\x45\x5e\xa3\xdd\x20\x9e\xeb\x1f\x11\x94\xf3\xf0\xa8\x80\xa3\x97\xdd\xdd\x42\xf7\x25\xf6\x5e\xdf\x7c\xcc\xdf\xe8\xae\x0b\x7e\x15\x04\x11\x6d\x99\x13\x6b\x7d\xa4\x62\xf3\x74\x4c\x1b\xbc\xa8\xe9\x5a\x16\xad\x7a\x8b\x57\x63\xab\xf1\x62\x31\x37\xc2\x83\x25\x09\x19\xac\xb9\x06\xcd\xf1\xa0\x90\x08\x24\x8a\x8c\x65\x1b\x46\xb4\x1f\xec\x6a\xab\x75\xac\xcf\x43\xdd\x84\x66\x24\x48\x5e\x2f\x7f\x05\x55\x1d\xca\xe7\xdf\x27\x11\xcb\xc1\x43\xdf\x9d\x34\x57\xf4\x79\xdb\xdc\xeb\xe3\x44\x09\x9f\xba\x11\xf0\x98\xff\xf1\xc3\xc4\x2e\xf0\x3f\x18\x15\x43\x7b\xf9\x7c\x6f\x54\xd2\xf5\x48\xa5\x0c\x76\x82\xff\x66\x7f\xde\x55\x65\xef\x96\x16\xc7\xea\x1c\xde\xff\x78\xe7\xfa\x05\x59\x5e\xb3\xce\xd6\xef\xa8\x87\x39\x18\x91\xbf\x6b\x4b\x89\x72\xf0\x69\x57\xd7\xa3\x68\x67\x57\xce\x7b\x98\xf0\x75\xfc\xb3\xa6\x3b\xfe\x3b\x0f\x63\x8b\x7e\x29\x13\x13\x24\x95\xaf\xcd\xc3\x7e\x9c\x0e\xf6\x88\xe2\x0b\x7b\xa6\x46\x0c\x67\x46\x09\xd8\x8e\x2d\xeb\x76\x72\x1e\x0a\x8a\x49\xd1\x8e\x35\x33\xf3\x97\x50\xae\x18\x9c\x59\xe1\x6e\xb8\x97\x1a\x0f\x69\x6f\x22\xeb\xc9\xd2\x3c\x95\x56\xc6\x22\x9b\x1f\x4c\x27\x83\x96\x1e\xf0\x3c\xeb\x20\x81\x4c\x32\x6c\x62\x1b\x12\x01\x29\xd6\x98\xe0\xa6\x65\xb0\xd7\x39\x38\x10\x9a\xb2\xb8\x22\xc4\x94\x48\xb3\x90\x25\x00\x60\x86\x05\x0c\xc9\x38\xc7\x48\x19\xb6\xb0\x36\x07\x4d\x90\x9f\x3e\xe4\x91\x87\xb9\x18\x6a\xcb\x35\x2e\xd0\x19\x0f\xb3\xbd\xbb\xf3\x30\x1a\xde\x27\x1d\x74\xef\x61\x9c\xb8\xe2\x93\x87\x31\xfa\xcd\x3e\xac\x20\xab\x49\x2b\xb0\xff\x02\x55\x2f\x6d\x46\xe1\x74\xd9\x29\xd6\x93\x0d\xb1\x08\x37\x87\xc5\x80\x54\x55\x5e\x6e\x47\x36\x98\xf8\x36\x1e\x26\x12\x89\xa6\xa2\x91\x48\xcd\x08\x87\x0a\x56\x17\xa9\xc8\x2a\xaf\x97\x32\xa3\xd8\xec\x25\xeb\x9f\x44\xc6\xa3\x97\xc9\xb2\x9f\xc9\x2c\xa2\xf2\x29\x9d\x6a\x1b\x99\x7c\x22\x15\xaa\x55\xa5\x1d\x24\x55\x9e\x4c\x27\xf3\xfe\x56\x18\xa4\x41\x29\xb5\x6c\xa8\x99\x3f\xcb\xa7\xf5\x41\x60\xb6\x58\xe8\x8f\xe8\x61\x5c\x8d\xf0\x1e\xf2\xff\x8c\x33\xbf\xc0\xff\xb8\x87\x09\xcc\x64\xd0\xa8\xd4\x1a\x28\xd4\xab\x55\xe5\xb8\xc2\xca\xcb\x85\x51\xc5\xd1\x4c\xa2\x39\x1a\x60\xbd\x18\x6c\xc5\x23\x23\x6a\x2c\x8b\xf1\xea\xe6\xfd\x7b\x7b\x98\xfb\xd5\xcf\xa5\x87\xf9\x93\x46\x78\xdd\x23\x0f\x93\x26\xee\xf8\xef\x3c\x4c\xb9\x5c\x9f\xd4\xcb\x15\x6b\x92\xcf\x44\x50\xa9\x41\x6a\x09\x3d\x90\x46\x5d\xc5\x86\xda\xd3\xa2\x3a\xeb\xbf\xac\xa3\x75\x80\xf5\xc6\x98\x2c\x66\x89\x09\xd4\xbb\x93\x8c\xd5\x18\xf1\x54\xcb\x58\x0c\x17\xa3\xd0\x53\xb8\x94\x5f\x17\xd2\xf3\x48\x8f\x69\x5c\x5b\xc1\xb6\x19\xd5\x42\xde\x9f\xae\x64\x22\x21\x08\xb7\xa0\x29\xb9\x66\x48\x0b\x29\x8c\x84\x30\xa1\x01\x20\x37\x85\x60\x26\x42\xb6\x4d\x2d\xca\x6c\xaa\x51\x6c\x98\x98\xdb\xc0\xb6\x38\x37\x89\x85\x4c\x6a\x09\xb2\xf5\x30\xd8\x23\x0f\x73\x31\x12\x91\x73\x80\x4e\x9f\xef\xfd\x7a\x77\xef\x61\x38\x24\xfb\x9c\x6c\xee\x3d\x8c\x73\x95\xe4\xea\x39\x4c\xbe\x57\x08\xb9\xeb\x95\x67\x3c\x4c\x6a\x00\x32\x2a\x38\x91\x7d\x5a\x1f\xf7\xa7\x93\x74\x22\x5f\xc9\xa6\x56\xd9\x52\xee\x25\x64\x68\xc5\x74\x29\xd8\x88\x0e\xed\x3e\x2d\xb6\xca\xcc\x36\x7b\x38\x97\x6b\xab\xf8\x20\x9f\x99\x76\x61\xa4\x5f\xa8\xa8\xf2\xd2\xaa\xd7\xe0\x78\x52\x45\xc9\x18\x8c\xe5\x8d\x04\x23\x24\xb6\x00\x8f\xe8\x61\x5c\x8d\xf0\x1e\xf2\x3f\xbe\x6a\x76\x9f\x39\x4c\xb0\x12\xde\x2d\x0a\x3e\xe6\x1c\xc6\x75\xfd\xfe\x1c\x0f\xe3\x76\x84\xd7\x3d\xf2\x30\xa9\xb2\x3b\xfe\x3b\x0f\x33\xb3\xf3\x90\x24\x97\x2f\x46\xaf\x3d\x93\x68\xb1\xe8\x05\xca\x64\x1e\xa7\xe9\xa7\x61\x66\x3e\x8d\x2f\xd3\x89\xae\x6c\x3d\x19\xbd\x64\xa4\x34\x12\xab\x9a\xc9\x9f\x12\xa4\x6d\xe9\x08\x95\xca\xd5\x46\xa4\x42\x4b\x11\xd8\xb2\xab\xb3\xa5\x51\x1f\xda\x65\x2b\x30\x19\x8c\x3b\x4d\x3b\xe4\xf9\x1c\x86\x52\xa2\x24\x42\x02\x62\x65\xd8\x00\xda\x26\x31\xb0\x24\x16\x03\x06\x15\x52\x21\x6e\x63\x4d\x18\x1c\x00\x8b\x1a\xcc\x92\x04\x48\x26\xb8\x26\x29\x56\x86\xc5\x35\x1b\x68\x5b\x0f\x43\x3c\xf2\x30\x17\x03\xb5\x38\x87\xec\xf4\x3e\xe3\xdb\xdd\x9d\x87\xa1\x74\x9f\xb2\xca\xbd\x87\x71\x9a\xe1\xd5\x73\x98\x9b\x78\x98\x08\x26\xfd\xfa\xaa\x90\x32\x2a\x25\x82\xf2\xd3\xc8\xac\x4e\xcb\x19\x30\x19\x8b\xb0\x39\x0b\xe3\xde\x54\xf7\x8b\x95\xbe\x6c\x67\xb2\xf3\x59\xd7\xa8\x94\xb2\x72\xcd\xd9\x2c\x58\x1b\x85\x1b\xbd\x1a\x8c\x0c\xc2\xcb\x7a\xa8\xb1\xc8\x36\x12\xd5\x4a\xcd\x9e\x18\xd6\x70\x6e\x54\xca\x0b\xf3\x11\x3d\x8c\xab\x11\xde\x43\xfe\x27\x18\xdd\x65\x0e\x73\x67\x0f\x73\xbf\xfa\xfd\x39\x1e\xc6\xed\x08\xaf\x7b\xe4\x61\x12\x0b\x77\xfc\x77\x1e\xa6\x66\xb7\x1b\x9d\x44\x78\x3a\xad\xe4\x3a\x8d\x20\xa8\xd2\x4e\x2f\x8f\x8b\xab\x39\x28\xac\x48\x49\x55\x41\xc8\x8f\xe3\xa1\x68\x1c\xb0\x27\x56\x98\x56\xd2\x74\x9c\x5b\xbf\x90\x84\xea\x16\xfa\x15\xbb\x5c\x35\x4b\x91\x66\x66\xa0\xd3\x6e\xaf\x51\xb1\x9e\x96\x53\xd4\x16\xd3\x4a\x29\xe0\x79\x28\x8b\x61\x11\xce\x2c\xc3\xb2\x00\xb2\x08\x03\x1c\x6a\x4c\x83\x26\x91\x54\x6a\x4a\x58\x4c\x71\x46\x4d\x89\x84\x69\x10\xa8\x18\xb2\x34\x29\x6d\x0d\x48\x64\x2b\x45\x0d\xcc\xac\xd7\x4a\xe0\xb7\x7d\x98\x6b\x23\x59\x2e\xef\xc3\x30\x40\xc9\x26\x73\xf4\xf9\xbb\x10\x71\x4e\x04\xa0\xc2\x8b\x03\x62\xcf\xec\xc3\x6c\x0e\x8f\x71\xb7\xea\x85\x1d\x3b\xb5\x9b\x12\x7d\xe7\x9f\x0f\x88\x6e\x3f\x59\x45\x2f\x78\xae\xe5\xed\x15\xcf\xa5\x55\x37\x6c\xc0\x52\x29\x4e\xdb\xcb\x97\x6e\x1c\x04\x86\xcd\xda\x38\x3b\xd5\x9a\x59\xc8\x50\xde\xe8\xb6\x90\x55\x2c\x95\x6d\x15\x1a\xce\x4d\x90\xd3\xa5\xdd\x0a\xd5\x96\xd3\x56\x45\xef\x4d\x52\xb3\x4e\x2f\xd0\x5f\x75\x02\x7a\xfd\x2b\x1e\xe3\x30\x38\xf0\xa4\xc7\xd0\x0f\x3e\x20\x76\x11\xc9\x60\x67\xf7\xf2\x3d\x51\x2e\x8c\xd8\xde\xf1\x77\xb7\xaf\xb2\xe1\x7f\xe0\x31\x36\xc5\xcd\x6e\x2f\x3f\xc0\xd1\x27\x78\x9e\x1f\xe5\xbc\xe6\xff\x59\x1e\x27\xf9\xeb\xfa\xe3\xee\x2b\x5d\xdc\xb7\xf9\xbe\xac\x5e\x76\xaf\xba\xf7\x48\x57\xea\xea\xe9\xba\x7d\x9b\x18\x2a\xd6\x47\x86\x1c\x2b\xff\x34\xe0\x4f\x2d\xf8\x92\xe5\x0b\xf3\x4a\x26\xdd\xe9\xa7\xa2\x2f\xf9\x4e\x3e\xda\x0e\xa8\x09\xc3\x33\x5d\xab\x8d\x1b\x81\x59\x31\xd6\x80\x89\x4c\x41\x90\x6c\x5b\xac\xf3\x3c\x30\x7a\x0a\x67\xec\x28\x8a\x94\x83\xd5\xc5\x8c\x65\xcb\x51\x23\x99\x0e\x7b\x7f\xd4\x01\x87\x10\x0a\x64\x62\xce\x08\xb6\x6c\x0d\x9b\x00\x52\x49\x25\xb4\x34\xcd\xe0\x00\x59\xb6\x0d\xa8\x45\x6c\x0a\x6c\x93\x59\x10\x70\xc8\xa4\xd4\xa8\x09\x24\x83\x40\xd8\x42\x6e\x3d\xd2\x66\xdf\x26\x50\x8b\xe6\x13\xd5\x4a\xaa\x9a\xad\xc7\x22\xa9\x4a\x29\x59\xad\xd0\x48\x34\xa6\xe3\x54\xa6\x5e\x47\x89\x7c\x32\xad\x65\xf5\x84\x5e\x0e\xe7\x23\x65\x96\xca\x05\x8b\xe1\x48\xa5\x96\xcd\x7c\xd3\x23\xb1\xd3\x69\x7a\xdf\xef\x6e\x3d\x12\x04\x60\x1f\x19\x10\xa5\xc3\xc4\xb4\x62\x0d\xea\xd9\x8a\xd5\x78\x99\xd6\x46\xa5\x58\x60\x6a\x98\x75\xd0\x0f\xf6\x6d\x33\x10\x4f\x86\x9b\xd5\x41\x6f\x1e\x89\xb7\x36\x69\x2b\xff\x1c\x8f\x14\x79\xe7\x9f\xcf\xf5\x9a\x5a\x34\xd5\x4a\x34\xc1\x52\xeb\x8c\xf4\x05\x0c\x2f\x58\x0c\xd5\x22\x6c\x55\x88\xf7\xed\x44\x7c\x11\xb1\x97\x40\x64\x66\x6d\x6a\x4c\xb3\x09\x3d\xa2\x16\x11\x3d\x63\x67\xa5\x1e\xe0\x91\x7c\xa3\x47\x47\x58\xa7\x4d\xdc\x65\xa1\x58\xa8\xdd\xb4\xcb\x99\x72\x08\xb2\xe6\x97\xe6\x30\xdf\xf6\x48\xdf\x9c\xf3\x65\x9e\xc2\x56\xcd\x4b\x8f\x74\x25\x7f\x0f\x3d\xd2\x77\xe7\x08\x98\x14\xa0\xe9\xa1\x47\xf2\x84\xff\x15\x1e\xe9\x91\xf6\xa1\x2e\x79\x24\x37\xb2\xda\xb9\x02\x4f\x3c\x92\x1b\xfe\xea\x3a\x8f\xf4\x54\x0d\x4d\xea\xb3\x70\x3f\x54\x8a\xcd\xb2\xdd\x50\xa8\x5c\x0a\x0d\xed\x86\x59\x1b\x27\xc2\xed\x06\xef\x76\xf4\x8a\x3f\x56\x02\x88\xa5\x7a\x33\x40\xba\x7a\x45\xd3\xcb\x3a\xe4\x74\xa8\xc7\x16\x95\x40\xbf\xd6\x1f\x98\xa1\x7e\x48\x95\x86\x69\x33\x9b\x0c\x88\x3c\xcc\xe7\x6a\x2f\xde\xcf\x91\x34\xcb\xe6\x54\x33\x11\x36\x35\xcb\x56\x86\xd0\x88\xa5\x99\x58\x50\xa6\x69\x94\x71\x2a\xb9\xb2\x6c\xc9\x89\x60\x86\xa1\x71\x68\x5b\x98\x30\x93\x2b\x04\x10\xb5\xa5\x25\x0c\x7b\xeb\x91\xb0\x47\x1e\xe9\x52\x24\x01\x03\x54\xe3\xe7\xe6\x48\xdb\xbb\x3b\x8f\x44\xe0\x3e\x92\xc0\xbd\x47\x3a\x13\x49\xb0\xf5\x48\xae\x56\xd5\x2e\x79\xa4\x40\xcc\x9f\x4e\xb1\xa7\xc2\xba\xfa\x32\x8b\xe4\x5a\xbc\x99\x8a\xa0\xc2\xac\xb1\xae\x4f\x3b\x9d\x51\x4e\xc5\xe6\xfe\xa1\x25\xd2\x1a\x59\xf6\xca\x40\xd4\x24\x91\x54\xc1\x4c\x2b\x3d\x4d\x17\x0b\xf1\x61\x2a\x3e\x6d\xc2\xb0\x0c\x55\xc3\x62\x3d\x9f\xc6\xec\x5e\xa5\x1a\xd7\x65\x71\x91\x7f\x44\x8f\x14\x38\x6e\x49\x77\xf3\x48\x41\xf7\xfc\xbd\xf6\x48\x27\x3c\xe4\xdd\x3c\xd2\x77\x23\x82\x75\xfd\x71\x57\x15\x8f\x7a\xa4\x3f\xc9\x23\xe8\x37\xd0\xd5\x77\xf8\xef\x3c\x52\xd8\xe6\x8b\xf9\x98\xc6\x32\xf2\x85\x94\x9f\x62\x2b\x7d\x52\x6b\x44\xe9\x20\xd3\x46\xd9\x6c\x57\x10\xe5\x7f\x6a\x61\xb0\x9e\x77\xa2\x95\x52\x09\x5a\xe3\xd6\xb8\xa7\x95\x51\x78\x05\x96\x89\x70\xbb\x39\x69\xa3\x50\xb9\x30\xcc\xd4\x4b\x38\xfb\x04\xac\xa7\x4a\xa5\xde\x0c\x8c\x52\xde\x7f\xc1\x8f\x89\xc6\x0c\x93\x11\x41\x19\x26\x9c\x9b\x36\x40\xd4\xe2\x48\x13\x40\x4a\x61\x12\xc2\x88\x80\x9c\x23\x8c\x0c\x48\x81\x85\x38\x23\x16\xc4\xb6\x12\xb6\x34\x15\x25\x80\x6d\x3d\x12\xf1\x68\xd5\xee\x0b\x1e\xe9\x74\x68\xdb\xdb\xcd\x9d\x3f\xe2\xc8\x8b\xb3\xe0\xee\xe8\x8f\x0e\xd6\xec\xc2\xc9\xc0\xfc\x89\xaf\x53\x50\x8d\x16\xcb\xe0\xd3\x24\xd1\x0a\xd7\x73\x7d\xa3\x93\x12\xb5\xa2\x59\x9b\x9a\xd3\x61\x3a\x6e\xa9\x29\xb5\x5a\xcd\xae\x56\x4f\x54\x12\x6b\x7d\x50\x28\x36\xeb\xa5\xb9\xbd\x1a\xc6\x13\xc9\x84\x95\xef\xd7\x18\x9b\xb5\xd0\xf0\x69\x1c\x15\x49\x96\x88\xf7\x9b\x0f\xb9\x66\x77\xb5\x3f\xba\x92\xbf\x87\xfe\xe8\xda\x35\xb3\x6b\xfd\x91\x27\xfc\xaf\xf0\x47\x8f\x14\x47\x71\xc9\x1f\xdd\x73\xcd\x4c\xbf\x81\xae\xbe\xc3\x7f\xe7\x8f\xf2\xc3\xa8\x5f\x5b\xa7\xe7\x15\x36\x08\x85\x53\x6c\xd1\x0f\x17\x9a\x4f\x8d\x59\x7a\x0e\xad\xc4\x52\xc1\x15\x6a\x2e\x5a\x90\xe1\x1e\x8a\x06\x4b\xd3\x66\xaf\x3c\x48\x07\xad\x48\x32\xd0\xca\x0a\x7f\xb2\xd9\xec\x0e\x7b\x30\xd8\xb0\xc7\x2f\x2c\x26\x3b\x6c\x62\x80\xf1\xb0\xdb\x96\xde\xaf\xd9\x59\x06\x16\x5c\x19\x44\x2a\x2e\x34\xca\x30\xa2\x8c\x60\x53\x5a\x08\x9a\x82\x28\x88\x0d\xdb\x04\x1a\x31\x30\xc2\x4a\x71\xac\x20\x81\x86\xad\x01\x28\xa9\x25\x00\xb1\xa1\xf1\x63\xb3\x60\xb7\xd9\x45\x0a\x14\x72\xf5\x58\x3c\x85\x82\x71\x1c\xc9\xe4\x49\xa0\x96\x8a\xa4\x33\xa1\x54\x24\x51\xce\xe4\xca\x28\x56\xc7\x8d\x74\xa4\x18\xcb\x66\xca\xc1\x70\x56\x2f\x56\xb5\x7c\x50\xcb\xd6\x50\xec\xc7\xe6\xf5\xf3\x6e\x08\x01\x4c\x4f\x06\xc0\xbd\xdf\xdd\xba\x35\xce\xf8\x7b\x74\x42\x34\xc5\x63\xf9\x79\xbe\x6b\x24\x51\x4c\xc7\xd5\x4a\xa7\x30\x4e\xf6\x3b\x35\x00\xec\x28\x9f\xa4\xe2\x5a\x1f\x84\x0b\x8b\x44\xd5\xaf\xd7\xb0\xfe\xee\x87\xb6\x9d\xdd\xa1\xd4\x4f\xe3\x84\x8b\xdd\xee\xc3\xa3\x94\x03\x95\xf9\x22\x22\x16\x9b\xae\x5a\xef\xe4\xcd\x5c\x09\x45\x69\xeb\x65\x10\xe8\x37\xa3\x51\xd5\x14\x09\xde\x23\x26\x0c\x0f\xca\xbd\x65\xb7\x17\xee\xc5\xc4\xe4\xa5\x31\x06\x42\x83\x11\x96\x4d\x55\x6d\xe5\xef\x93\xee\x28\x32\x8d\x3f\x4d\xe2\xa0\x0d\x5f\x52\xed\x29\xd5\x41\x62\x55\x1d\x18\xad\x7a\xaa\x4a\x87\xa1\x2f\xf8\x9e\x0f\x9d\xf6\xa3\xef\x39\x68\xf3\x7e\xec\x3d\x5c\xf1\x68\xfb\x03\x20\x05\x12\xd1\xd5\xb4\xb5\xc8\xc0\x5e\x1d\xc8\xd5\x68\x08\x45\x26\xb6\x9c\xa7\x82\xab\x2c\x9d\x06\xc2\x66\x70\xdb\x46\xdc\x9c\x8e\xb3\x83\xba\x5f\x2b\xef\xdf\x4f\x1f\xad\xc4\x05\x7b\xbe\x82\x7f\xa4\x54\x0d\x8c\xaf\xe0\xaf\xeb\x7f\xde\xb7\x23\x47\xc7\xd6\x80\x7b\x59\x64\x07\x8d\xb3\xcd\xbc\x24\x8b\x6b\x75\xf1\xda\x17\x9e\x4c\x07\xbd\x6f\xc9\xe2\x7f\xa3\x71\x10\x0b\x01\xd1\x9a\xd5\xe5\x68\xd1\x18\x06\x5a\x83\x61\xae\x68\x27\x54\x2c\x53\x48\xc0\x84\xd9\x48\x14\x12\x05\xbf\x91\xec\x4b\x91\x53\xa2\xa0\x3a\x6d\x38\xc0\x73\x3a\x4b\x24\x0b\x46\x31\x37\x0e\x66\xe2\x53\xd9\x26\x63\x95\xcf\x04\xcd\xde\x08\x91\x6a\x10\xce\xa4\xee\xf9\xea\x13\x35\x2d\x4d\x41\x0b\x43\x0d\x52\x2c\xb9\xa5\x61\x61\x02\x9b\x59\x8c\x33\xa8\xa0\x65\x42\x69\x50\x13\x31\xa2\xb0\xe2\x16\x31\xa5\x34\x98\x94\x0a\xdb\xa6\x20\x02\x23\x66\x6e\xc7\x56\x74\xdd\xd8\x7a\xe9\xb4\x42\x86\x00\x13\x27\x3f\x90\x7c\xbf\xbb\x19\x5b\x09\xd2\xf6\xfb\xf2\xee\xc7\xd6\x33\x18\x7f\x5b\x5c\x60\xcc\x43\xab\x3a\x18\x5b\x83\xb1\xbe\x36\xec\x6a\x93\x17\x60\x27\xc2\xa4\x5c\x57\xe3\xf1\x7c\x6d\x4d\x13\xcd\x45\x72\x81\xdb\xb1\x68\x1e\x85\x08\xae\xab\xaa\x1e\x7e\xf2\x27\x3a\xc6\x42\xa2\x51\xa5\xd7\x33\x16\x39\x83\x26\x55\x66\xd8\xcf\xf9\x9b\x35\x39\x13\x49\x41\x01\xee\x82\x55\x3b\x6e\xf9\x63\xe9\xe0\x63\x8d\xad\xd7\x8e\x6d\xd7\xd9\xf3\xb8\xd1\x0d\xd3\x9a\xa7\x63\xeb\x1d\xf7\x77\x2f\xae\xec\xdf\x71\x6c\xd3\x3d\x1a\x5b\xf9\x41\x9a\x88\x13\xbb\x62\xe7\xc6\xd6\x16\x9d\xb1\x44\x56\x4b\x4e\x63\xab\x42\x36\x12\x8d\xbd\x30\x8d\x63\xa3\x58\x4f\x07\x27\x19\xd2\x5a\x76\x33\xcd\xa7\x0c\x8a\xf5\x9a\x81\xdc\x7c\x55\x47\x3c\x3a\x7d\xa9\x34\x1a\x55\x1e\x42\x4f\xc5\x41\x47\x26\x3a\x7e\x12\x41\xe3\x79\x71\xae\xac\x0c\xcd\xa4\x87\xed\x98\xbd\x5c\x7b\xff\x15\xba\xad\x99\x06\xc7\x40\x60\xc8\x31\xe3\x36\x13\xc4\xe4\x1c\x03\xc3\xd6\xb8\xe0\x04\x2a\x4d\x21\x93\x30\xcb\x54\x18\x28\x06\x04\x13\x16\xe7\x86\x05\x4c\x45\x39\x37\x0d\x25\xb6\x23\x23\xbe\x6e\x6c\xbd\xb8\xc5\x8c\x00\x17\xec\xcc\xd8\xba\xbd\xbb\x1d\x5b\x19\x3f\xd8\x61\x76\x3d\xb6\x9e\xf9\x6e\x63\x5b\x5c\xac\x27\xd7\x0f\xe9\x1d\xe0\xd6\xbc\x2e\x83\xcd\x41\x4b\x8f\xcd\xab\xf3\xf6\x6a\x65\xb6\x13\x31\xdc\x1d\x89\xd5\xb0\x94\x9f\x0e\x50\x31\xd2\x31\x82\x2f\xa9\x72\x39\x17\x48\xae\xcd\xc2\x94\xb7\x66\xf1\x52\x58\xa8\xa9\xbd\xec\x85\x03\xe3\x2a\x69\xb7\x13\xdd\x71\x73\x95\x57\xd9\xe0\x8b\x3f\x1e\x35\xa2\x0a\x15\x0e\x32\xd8\xe8\x7f\xfe\xd8\x7a\xfd\xd8\x76\xe5\xd8\x5a\x9f\xa4\x07\xed\x94\x87\x63\xeb\x3d\x77\x2a\x6f\x31\xb6\xba\x1d\xdb\x74\x8f\xc6\x56\xb7\x73\x98\xb7\x35\x6a\x3d\xda\x1c\x26\x48\x3e\xa0\xc1\x31\x99\x4c\x06\xf1\x76\x41\xd0\xa4\x6d\xbe\x84\x41\xaa\x21\xba\xad\x3a\x5a\xbc\xb4\x61\x24\xb4\x28\x4e\x70\xd8\xb0\xe3\x46\x3b\xbc\xcc\xd5\xc6\x35\xde\x28\xe8\x12\xce\xe2\xc3\x76\x23\x49\xd2\xdd\x58\xa7\xf9\x32\x5f\x05\xfa\xcb\xc1\xb4\x9b\xff\xea\xd7\x71\x7f\xfb\xdb\xef\xbf\xff\xed\xf7\xdf\x7d\x19\xd9\x57\x7f\xf8\xe4\x64\xa2\xa6\xcf\x93\xa9\x9c\x4e\x0e\xff\x7e\x1e\x75\xd5\xea\x5f\xbe\xd2\x6a\xa4\xfe\xf0\x05\xb3\x99\x62\xa9\xa0\xc7\x33\xa5\x7f\xf9\x8a\x66\x4b\xf5\xe5\x1f\xbe\xd1\xcc\xe8\xb5\xcd\x7f\xf9\xb2\x8b\x81\x1a\xff\xe1\x7b\xa5\xf8\xb7\xbf\xe9\xa9\x52\xb8\xe0\x2b\xe9\x81\x54\xd8\x97\xcd\xa4\xea\x87\x14\xff\xe6\xf3\xf9\x7c\x7a\x28\x74\x40\xed\x13\x43\x5f\xae\x10\x4f\xeb\x85\xba\x2f\x19\xae\xfb\xfe\xde\xb6\x3e\xd5\xb6\x39\x1c\x8f\x9e\xfb\xed\xe6\x58\x6e\xdd\x80\xe3\xda\xa3\x5a\x3b\xa8\x1e\xab\xf9\x31\xc6\x17\x6b\xff\xe6\xc9\x36\xcd\x9e\x38\x2e\xb7\xff\xf3\x6c\x0e\x2d\xb5\xfb\x73\xba\x1a\xbd\xfd\xd9\x9e\x4c\x66\x6a\xfc\xec\x49\xeb\x3e\xb2\x3d\xd6\x38\x57\x15\xf3\x95\x33\xf1\x7c\x39\xec\xfb\xfb\xfe\xf1\x9f\xbe\xfd\xf3\x6f\x7f\x6f\x5f\xf8\xa6\x68\xbc\x51\xeb\xb7\x1b\xfe\x2d\xa5\x0e\x47\x6a\xdb\x19\x9e\x47\x72\x3c\x6d\x9b\xed\x91\x1c\x1c\xb4\xe4\xf8\x6d\x8f\x5b\x76\x9c\xc9\xb9\x96\x9e\xa9\xd6\x97\x5b\x7e\x00\xcc\x8e\xb7\xfd\xd4\x03\x1e\xb7\xfe\x14\x9b\x73\xed\x3f\x5b\xb5\x8b\x12\xd8\x76\x69\x63\xb5\xe9\xed\x6f\x0d\x89\x67\x42\xe1\xda\x85\x36\x04\x0b\x61\xbd\x14\xde\x3e\xfa\x91\x8a\x2f\x9b\x71\x1a\x43\xb9\x18\xcf\x44\x7d\xc6\x74\xac\xd4\xa1\x75\x9d\xae\xcd\xd6\xc6\xae\xaf\xcf\x96\xce\xd7\x6a\x74\xc2\xae\x8d\xd5\xb3\x34\xcd\xe1\x6c\x30\x75\x5d\x9d\x3d\x89\xc3\x9a\x7c\x98\x0d\x7c\xac\xcf\xf6\xe1\x9f\xbe\xdd\x1f\xcf\x13\xf5\x32\x53\x03\xf3\xb3\xc0\x8c\xd5\x73\x4b\x4e\x5a\xd7\xd4\xec\xf5\xfd\xaf\x55\xeb\xb0\xa7\xbd\xbe\x75\xac\x36\xff\x1f\x73\xe6\xd7\xd3\x36\x0f\x85\xf1\xaf\x62\x71\x03\x48\x7d\xaf\xb8\x43\x7a\x91\x50\x71\x37\x34\x54\x58\xda\x69\x97\x51\x5a\xbb\x25\x22\xad\xad\xc4\x45\xdd\xb7\x9f\x9c\x38\xc1\x76\xec\xd8\x75\x5c\xd8\x25\xf4\xe4\xf1\xef\x3c\x39\xf1\x9f\xe3\x02\xa3\xed\x88\x17\xd7\x29\xf8\x11\x35\xb1\x9d\x3d\x13\x90\x51\x5a\xe4\xeb\x66\x3a\x20\x25\xb2\x4c\xd3\x29\xe6\xb5\x51\xff\x1e\x40\x2a\x56\x89\x06\x58\x93\x93\xb1\xf1\x66\x83\xd7\x7a\xa9\xf5\x67\xad\x1c\x4d\xc0\x45\xfd\xf0\x85\x0d\x36\x47\x91\x30\x73\xe4\x0d\xd8\x96\x1e\xc7\x0b\x80\x26\x34\xa5\xb1\xb8\x85\x96\x8c\x6e\x59\xaa\x82\x32\x31\x27\xc0\x8e\xf1\x12\x10\x5a\x96\x9a\x0e\x4c\x41\x56\x30\x25\x41\x28\xaf\xca\x57\x12\x94\x83\x80\xff\xd0\x08\x35\x7f\xd8\xe8\x4a\x7c\xed\xf5\x54\x3d\xde\x6b\x55\x4e\x46\x6e\xfe\xaf\x31\x9a\x89\x64\x5f\x63\x61\xf5\x34\xfd\xa6\x37\x13\x20\x6b\x5e\x09\x1b\xf3\x5a\x3f\x34\xc2\x4b\xd2\x55\x7e\xac\x44\x7c\x90\x55\x56\xe1\xd1\xeb\xa7\x49\x4c\x23\x47\x58\xe3\x94\x63\x9d\x80\x64\xb3\x19\xb1\x68\xf5\xa5\xbc\xe0\xea\xc8\x21\xb4\x9a\x1d\x97\xd1\xec\xd3\xf4\x5c\x90\x5a\xb8\x0f\x69\x1c\x1f\x15\x35\x5f\x4a\xa7\x9b\x71\xd8\xbc\x98\x86\x59\x5a\xe2\x82\x90\xb7\x03\x1d\x47\xa4\x6a\x79\xbf\xd1\x66\xbf\x6b\xe1\xa3\x59\x5e\xa6\x2c\xdf\xe1\x28\x84\xba\x9a\xdf\x77\x2b\x00\x27\x40\x47\x9e\x00\x31\xc5\xaf\x0b\x52\x61\x94\x66\xcc\x92\x44\x84\x79\x5b\xe8\xb8\x88\x4f\xdc\x1d\x71\xd5\x68\xee\x9e\x60\xac\xd3\xb7\x7c\x8f\xf0\x31\xd5\xb6\x1c\x55\x4a\xf6\x69\x86\x50\x89\xab\x6a\xac\xa1\xce\x01\x94\x73\x9a\xf8\x59\x3b\x19\x35\x81\x27\xb0\x8f\xaf\x83\x21\x6d\x37\xb1\xe1\x2b\x53\x05\xc5\x2e\x9c\xeb\xb1\x3f\x34\xfc\x0c\x3e\xa8\xea\xdc\xf6\xf3\x20\x07\xa8\xd8\x43\x71\xc9\xae\x88\x22\xd1\x9a\xa4\x9d\xdb\x37\xdf\x4a\x96\xc4\x63\x17\x83\x22\x1d\xb2\xdf\xb4\xcb\xed\x28\x29\xf9\xc4\xf7\x8e\xcb\x2a\x27\xfb\xf8\x46\xeb\x23\xb8\xf1\xb5\x07\xfc\x93\x11\x53\x4f\x60\xa7\xc2\xcf\x7f\x69\x0c\x67\x26\x52\xac\x7f\x12\xb4\xc4\xef\x39\x39\x54\x9f\x92\x8d\x69\x30\x67\x5a\xa6\x87\xfc\xf3\x6b\x9b\x28\x67\xcb\xa9\x1d\xc0\x99\x87\xb5\xdb\xa5\x4a\x77\xeb\xed\x59\x3e\x6d\x5d\xdd\x78\x00\x3e\xf5\x03\x57\x45\xd5\x23\x54\xa4\x2f\x7c\x68\x08\x9f\x1c\x1c\xe7\xba\xc1\xc1\xe2\x2d\x5f\x7d\x61\x2f\x76\xf7\x22\x26\x1f\xb6\xcf\x51\x36\x7d\xfd\xe0\xa3\x7e\xbd\x89\xeb\x16\xf2\xb6\xc3\x98\xae\x08\x79\x0b\x76\x79\x40\xd3\xb9\x45\xb8\xba\x42\x98\x65\x79\x51\x81\xff\xee\xee\xc0\x65\x45\x0a\x24\xdd\xa6\x5d\xde\xde\x32\x7c\x64\xd7\xd7\x13\x60\x0f\x5c\x13\xe4\x17\xd8\xf4\xe2\xed\xa1\x2b\x72\xd8\xbe\x32\xaf\xe1\x95\xd0\x61\x00\x25\x54\x43\xb8\x06\xbf\xbf\xc3\x04\x36\x45\x06\xfe\x07\x37\x37\xde\x17\xd1\x39\x4a\x37\xd2\x35\xd1\xec\xc7\xe7\x5c\x47\x8b\x61\xc1\xec\x39\x81\x8f\xdf\xe6\xdd\x15\x10\x48\xe0\x0c\x26\x70\x3e\x85\x0b\xed\x56\xa4\xfe\xf5\x79\x0e\x7e\xbd\x3c\xf0\x92\x49\xe0\x62\x99\x3c\x4e\x97\xfc\x5f\x0f\xf0\x09\x2e\x21\x98\xde\x2f\xa6\xf7\x0f\x70\xe0\x1e\x8d\x9f\x3b\xd4\x3f\x53\xad\x15\x13\xcf\x0c\x75\x1c\xc7\x25\x99\x8d\x44\xf5\x47\x6f\x1b\x19\xcd\x12\x1b\x7d\xc7\x8d\xa2\xd5\x09\x71\x94\xfd\x72\x1f\x64\x0e\x93\x0b\x6d\x97\x60\xb8\x60\x4e\x73\xa0\xdf\x54\xfa\x42\x1b\x2c\x30\xaa\x17\x86\x36\x58\xdc\xa2\xd0\x5b\x1c\xff\x82\x21\xf6\xd2\xe8\xf5\x90\x7c\xab\xe3\x85\x54\x6c\x5b\xe2\xc5\xcf\x27\x80\x32\x96\xf1\x12\x03\xe8\xb0\xa3\x60\x4d\x76\xb4\xc0\x0c\xd7\x39\xfc\x0d\x00\x00\xff\xff\x9a\xa5\x9d\xd2\x25\x61\x02\x00") - -func order_books_310HorizonSqlBytes() ([]byte, error) { - return bindataRead( - _order_books_310HorizonSql, - "order_books_310-horizon.sql", - ) -} - -func order_books_310HorizonSql() (*asset, error) { - bytes, err := order_books_310HorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "order_books_310-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0x75, 0x19, 0xce, 0xa9, 0x7d, 0x80, 0x6b, 0xbf, 0x10, 0xcd, 0xf2, 0x8d, 0x80, 0x15, 0x25, 0xfc, 0xf3, 0xd3, 0x23, 0x30, 0x9, 0x62, 0x9c, 0x1e, 0x82, 0xfd, 0x92, 0x88, 0x3b, 0xec, 0x15}} - return a, nil -} - var _pathed_paymentCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x69\x8f\xe2\xc8\xb6\x36\xfa\xbd\x7e\x05\xea\x2f\xd5\x5b\xd4\xde\x84\x1d\x0e\x0f\xdd\xb7\x8f\x64\x6c\x03\x66\x36\x83\x19\xae\xae\x4a\xe1\x70\xd8\x18\xb0\x0d\x1e\x98\x5e\xbd\xff\xfd\x8a\x21\x13\x92\x24\xc9\x4c\xa0\xaa\xfa\x9c\xd3\x96\xba\x3a\xc1\xcb\x6b\x3d\xf1\xc4\x5a\x2b\x66\xf3\xef\x7f\x7f\xf9\xf7\xbf\x33\xcd\x30\x4e\xdc\x88\xb6\x8d\x6a\xc6\xc6\x09\xb6\x70\x4c\x33\x76\xea\xcf\xbe\xfc\xfb\xdf\x5f\xb6\xf7\xd5\xd4\x9f\x51\x3b\xe3\x44\xa1\x7f\x14\x58\xd0\x28\xf6\xc2\x20\x23\xfd\x87\xff\x0f\x73\x22\x65\xad\x33\x33\xf7\xfb\xf6\xf1\x33\x91\x2f\x6d\xad\x93\x89\x13\x9c\x50\x9f\x06\xc9\xf7\xc4\xf3\x69\x98\x26\x99\xbf\x32\xe0\xcf\xdd\xad\x69\x48\x26\xaf\xbf\xf5\xec\x29\xfd\xee\x05\xdf\x93\x08\x07\x31\x26\x89\x17\x06\xdf\x63\x1a\x6f\xf5\xbe\x16\x26\x53\x6f\xab\x9a\x06\x24\xb4\xbd\xc0\xcd\xfc\x95\xf9\xda\xed\x14\xc4\xaf\x7f\x3e\xd9\x0e\x6c\x1c\xd9\xdf\x49\x18\x38\x61\xe4\x7b\x81\xfb\x3d\x4e\x22\x2f\x70\xe3\xcc\x5f\x99\x30\x38\xe8\x18\x51\x32\xf9\xee\xa4\xc1\xde\x96\x15\xda\x1e\xdd\xde\x77\xf0\x34\xa6\x2f\xcc\xf8\x5e\xf0\xdd\xa7\x71\x8c\xdd\x9d\xc0\x12\x47\x81\x17\xb8\x7b\x91\x28\x5c\x7e\x8f\x29\x49\x23\x2f\x59\x6f\x95\x3b\xce\x9f\x07\x02\x28\x8e\xc8\xe8\xfb\x0c\x27\xa3\xcc\x5f\x99\x59\x6a\x4d\x3d\xf2\x6d\xcb\x18\xc1\x09\x9e\x86\xee\x9f\x5f\xbe\xa8\xad\x46\x33\xa3\xd7\x55\xad\x9f\xd1\x0b\x19\xad\xaf\xb7\x3b\xed\x83\xe4\x7f\xd2\x99\x1b\x61\x9b\x8e\xbc\x38\xb1\xd6\x31\x9d\xff\x79\x55\x3a\x26\xb3\x79\x1a\x46\xa9\x1f\x7f\x4c\x98\x06\x8b\x8f\x48\x4e\xa9\xed\xd2\xe8\x23\x92\x5b\x9c\x0e\xa5\x1f\x94\xfc\x80\x98\x45\xe3\x24\x74\x1c\x1a\x79\x81\x4d\x57\xd7\x65\x31\x21\x61\x1a\x24\x16\x9e\xe2\x80\xd0\xf8\xcf\x2f\x72\xb5\xa3\xb5\x32\x1d\x39\x5f\xd5\x4e\xa4\x1b\xf5\xea\xe0\x02\xbd\x61\xb4\xce\xec\xb4\x2b\x8d\x7a\xbb\xd3\x92\xf5\x7a\xe7\xe4\xa1\x97\x82\xdf\x67\x13\xba\xfe\x88\xfe\x64\xf5\xbe\xea\x67\x99\x4f\x68\x75\xe8\x07\x30\x9f\x8a\x7d\x5c\x77\x94\xc6\xc9\xd4\x0b\x68\x7c\x4d\xf3\xb3\xd0\x87\xf5\x6e\x51\xd0\x5d\x36\xb8\xa2\xf7\x28\xf4\x71\xbd\xcf\x2e\x7f\x4d\xef\xb3\xd0\x87\xf5\xee\xe5\xbd\xc0\x09\xaf\xe8\x3d\x0a\x7d\x58\xef\x2c\xb5\xe2\xd4\xba\xa2\x73\x2f\xf0\x19\x7d\x53\x2f\x1e\xcd\x53\x9a\x5e\x63\xf6\x54\xec\xe3\xba\x29\x8d\xae\xd1\xba\xbb\xff\x61\x6d\xbb\x30\xbe\xa6\x6e\x2f\xf0\x61\x7d\xfb\xac\x34\xa2\xd8\xbe\xae\xf6\x85\xdc\x0f\xd6\x7e\xc8\x94\x74\xfe\xfd\x83\x66\x2c\x1c\x5c\x51\x6e\xe1\xe0\xc3\x80\x0f\xd9\xef\x1a\xd6\x27\x91\xcf\xea\xdc\xf6\x01\xde\x57\xbb\x95\x3a\x68\xde\xc9\x9e\x2b\xbe\x98\x72\xaf\xcb\x3e\xa7\xc6\xf7\xc4\x8e\x89\xee\x1d\xc9\xe7\xc4\x75\x5d\xee\x98\x88\xde\x91\x7b\x4e\x2c\xef\xca\x7d\x08\xdf\x31\xa1\x5c\x97\xdb\x27\x89\x77\x65\x9e\x43\xfe\x1d\xc9\x6d\x1c\x5f\x17\xd9\xc7\xe6\x75\x99\x17\xa1\x70\x5d\xd4\xc2\xc1\x75\x81\x27\x57\xfd\x90\xd4\xd6\xf3\x0e\x82\x5a\xbf\xa3\xd5\xdb\x7a\xa3\x7e\x2a\x3c\x9d\xb9\xf1\x7c\x7a\x90\x68\x2b\x25\xad\x26\xbf\xd2\xf5\xe7\x97\x7d\xdf\xb8\x8e\x7d\xfa\xc7\xd3\x77\x99\xce\x7a\x46\xff\x38\x3c\xf2\x67\xa6\x4d\x46\xd4\xc7\x7f\x64\xfe\xfd\x67\xa6\xb1\x0c\x68\xf4\x47\xe6\xdf\xbb\x2e\xb3\xd2\xd2\xe4\x8e\xf6\xa4\xf9\x49\xdf\x97\x17\x1a\x5f\xde\x3c\x28\x56\x1a\xb5\x9a\x56\xef\x5c\xd1\xbc\x17\xc8\x34\xea\x2f\x15\x64\xf4\x76\xe6\xeb\x53\xff\xf6\xe9\xbb\x78\xa7\xe4\xeb\xb9\xe5\xa7\xe2\x1f\x6c\x3e\x33\xf4\x6e\x79\x5e\x70\x59\x6f\x74\xce\xf8\xcc\xf4\xf4\x4e\xe9\x19\xd6\x69\x87\xf6\x85\xf9\xa3\x96\x33\x20\x9f\x29\xfc\x2b\x25\x3b\x02\x9a\xd5\xdc\xcc\xdd\x8e\x62\x66\x51\x48\xa8\x9d\x46\x78\x9a\x99\xe2\xc0\x4d\xb1\x4b\x77\x34\x7c\xb0\x03\xbe\x15\xb3\xa9\x83\xd3\x69\xf2\x3d\xc1\xd6\x94\xc6\x33\x4c\xe8\x76\x34\xf1\xf5\xec\xee\xd2\x4b\x46\xdf\x43\xcf\x3e\x19\x20\xbc\x28\xec\xa9\x43\x1e\x8a\xb9\x73\xdd\x63\x21\x9f\x1c\xe0\x12\xe1\x7b\x2f\x3f\x4d\xba\xbf\x7f\xc9\x64\x32\x4f\xdf\x78\x76\x86\x8c\x70\x84\x49\x42\xa3\xcc\x02\x47\x6b\x2f\x70\x7f\x47\xfc\xbf\x76\x75\x53\xef\x56\xab\xdf\x76\xd2\xdb\x07\x03\xec\xd3\x0b\xc2\xa2\x78\x49\x78\x81\xa7\xe9\x25\x69\x86\x61\xcf\xc5\xa7\x38\x4e\xfc\xd0\xf6\x1c\x8f\xda\x19\x2f\x48\xa8\x4b\xa3\x67\x91\x2f\xff\x3a\xaf\xfb\xe7\x28\xbe\x93\x8b\xf8\x26\x22\x0e\x03\x81\x8c\xe5\xb9\x5e\x90\x9c\xdd\x8c\xe9\x3c\x48\xfd\xcb\xf7\x82\xd4\x8f\x53\x8b\x06\x49\xb4\x1d\x0a\x9e\x17\x73\x2f\xe3\x05\xce\x14\x6f\x47\x8c\x36\x8d\x93\xcb\x70\xf6\x82\xa3\xd0\xa7\x76\xe8\x63\x2f\xb8\x20\xc5\x71\xe7\xa0\x93\x51\x44\xe3\x51\x38\xb5\xe3\x4c\x42\x57\xe7\xc8\x9c\x29\x76\xdf\x42\x74\xb5\x6e\x0e\x8c\xa4\x5b\xab\x53\x0f\x5b\xde\xd4\x4b\xb6\x85\xdb\x97\xff\x89\x92\xe9\xf4\xda\x6d\xcf\x0d\xb6\x7d\xa1\x2d\xac\xfd\x37\x27\xbd\x81\xe7\xae\xc5\x81\xf4\xef\xbb\x61\x75\x46\x29\x69\x4a\x25\xf3\xfb\xef\x4f\x55\xf1\x5f\x7f\x65\xc0\xbf\xfe\x75\xe5\xe9\x73\x80\xe7\x7a\x5e\x15\xe0\x3d\x8d\x2f\xea\xf2\x4c\xdb\xcb\x7a\x7e\x4f\xd3\x6b\x7a\xce\xd4\x5d\xe0\x6f\xaf\xf3\x75\x60\x6c\xdb\xbf\x5b\x63\x62\xdb\x65\xdc\x87\x43\x10\xda\xf4\x34\x16\x5e\xc4\xc0\x6b\xa3\x2f\xdb\xe7\x5b\xcd\xbf\xec\x18\xef\x81\x1c\xbe\xc3\xf1\xe8\x04\x0c\xff\xca\xb7\x67\x11\x5d\xbc\x2b\x64\xa5\x64\x42\x93\xa9\x17\x27\xef\x8a\x3e\xf7\xb6\x9f\xdc\x7d\xff\x35\x99\x86\x31\x4d\x3c\xff\x8d\xc8\xdf\x25\xd6\x0b\xb1\x75\x52\xe7\x2f\x3b\xf5\xcf\xfa\xce\xea\xfb\x68\xe7\x0d\xd7\x79\x6b\x6c\xf0\x52\xcd\xb1\x14\x6f\x79\xcb\xa1\xf3\x75\x6b\x8d\x1d\x06\x5e\xbf\x3f\x07\x39\x8d\x3e\x98\x41\xf7\x33\x2f\xf6\x5b\x19\x74\xe7\xee\x38\x8e\x69\x72\x89\xcf\x7d\xac\xbe\x79\x1b\xfb\xdb\xb0\xba\xac\x7a\x16\x79\x84\x06\x6f\x24\xb1\xdd\xcd\xb7\x32\xdc\xee\x66\xc6\x0e\x53\x6b\x4a\xb7\xfe\x46\xbc\xdd\x8c\xe4\x43\xb3\xe8\x49\x0d\x1f\x86\xac\xfb\xb2\x9c\xd5\xeb\xa1\x80\x6f\xf8\xc6\xe1\xc9\x03\xc3\x67\x8f\x3e\xf1\xfe\x96\x43\xec\x3b\xec\xb7\xfa\xc3\x7e\x58\xbf\x77\x07\x6f\x76\xa9\xe1\x47\xaf\x22\x37\x8c\x92\x67\x36\x54\xad\x20\x77\xab\x9d\x0c\x38\x6f\x36\xe9\x2a\xc1\x49\x42\xfd\x59\x92\xd9\x86\x45\x9c\x60\x7f\x96\xd9\x76\x99\xc2\x74\xff\x4d\x66\x13\x06\xf4\x75\x63\xeb\x60\x6f\x9a\x46\x27\x4d\xed\x5b\x16\x92\xf5\x8c\xbe\x5f\x29\xfb\x69\x89\x13\xbd\xaf\xd3\xfe\xb3\xc5\x37\x6a\xe7\x30\xb3\x11\x46\xe7\x95\xfa\xfb\x8e\x89\xff\xca\x80\x7f\x65\xe4\xba\x9a\xd9\x7f\xfc\x7f\xfe\xca\xf0\x08\x41\xf4\xaf\x8b\x75\x75\x3a\x0c\xbb\xb9\xca\x4e\x67\x79\x4e\x73\xee\x1b\x6c\xec\x27\xda\xb6\x51\x77\x11\xd0\x76\xec\x78\x07\x94\x38\xb5\x0e\x20\x22\x1a\xbf\x68\x80\xe0\xc5\x1e\x63\x44\xf1\x73\x2c\xbd\xc6\x73\x32\xe6\xbd\x15\xd3\xc9\x64\xdd\x07\x5a\xc6\x3d\xb0\x79\x4c\xaf\xb5\x30\xaf\x71\x9e\x8c\xe1\x6f\xc5\x79\x54\xf1\x71\x9c\xaf\x1a\xb9\xb3\xfb\x34\x58\xd0\x69\x38\xa3\xef\x34\x69\x47\xd3\x77\x34\x44\x27\xd3\x1d\x77\x50\xf0\x34\x5f\xfb\xfb\x47\xea\xe1\xe8\x45\xef\x11\x31\x7f\xa3\xa1\x79\x49\xc2\xd3\x3c\xf0\x0b\x8d\xe7\x44\xbc\xb0\xf6\x26\x19\xc7\x39\xa2\x9b\xc9\x38\x4e\x8a\xff\x7e\x8c\xdb\x97\x83\xb7\x0b\x31\x75\x2d\xba\x4f\x66\xb8\x6e\x45\x75\xb2\x04\x70\xcb\xb0\x6b\xd7\xe2\x5f\xc9\xd4\x5e\x1c\xa7\x34\xfa\xb8\x2a\x12\xda\x17\x47\xa7\xaf\x68\x49\xa6\x9e\xef\xbd\xd1\xa3\xb8\x3a\x16\xfc\x95\xa3\xaa\x13\xef\x3c\x59\x55\xb9\x69\x14\x75\xfa\xfc\xa3\xc6\x51\x27\x3a\x6f\x1f\xff\x5c\xd3\xba\xaf\xb4\x33\x4d\x87\x9a\xfc\xaf\xcb\x81\xf7\x62\xba\xf7\x66\x27\x3f\x5d\x43\xdb\xbb\x79\xb2\x7a\x91\x8a\x3f\x30\xde\x38\x77\xc0\xd5\x6e\x95\xf2\xcd\xbb\x64\x84\x03\x97\x5e\x1c\xd8\x9f\x92\x73\xba\x6c\x77\x7b\xae\x3e\xce\x9d\xdf\x4e\xd1\x4f\xe6\xc7\x0a\xed\xf5\x25\x72\x92\x55\x44\xe3\x74\x7a\x31\xbb\x27\x2b\x9f\xbe\x3b\x9e\x3b\x2e\xb1\xde\xce\xe7\xd9\xba\xc5\xad\xa4\x9e\xad\x38\xff\xfe\x21\xe2\x0e\x0f\x5d\x63\xef\x20\x72\x89\x88\x8f\xb9\xdd\xd9\x0a\xf7\x2d\x44\xa9\xdb\x91\xb5\x13\x46\xef\x4c\x86\x66\x54\xb9\x23\xbf\xc3\xd9\x75\x95\xf1\xa7\xf5\xe9\xf5\xb6\xd6\xea\x64\xf4\x7a\xa7\x71\x9c\x54\x34\xe5\x6a\x57\x6b\x67\x7e\xff\x5a\xcc\xb7\x9a\x83\x92\x5e\x65\x15\x1d\x16\xea\x06\x97\xef\x57\x0b\xb5\xba\x5a\x2d\x94\xbb\xf5\x66\x97\x2d\x0d\xe0\xb0\x56\x68\x97\x1a\xf5\xae\xa2\x35\xe4\x76\x4f\x30\x14\xa1\xd1\x67\x4b\x5f\xbf\x65\xa4\xc3\xc5\xed\xff\x87\x00\xf8\x96\x41\xdf\x32\xe0\xdb\x9e\xe5\xcc\xd7\xaf\xdf\x32\x5f\x65\x43\x96\x65\xf9\xaf\xbf\xbe\xee\x6e\xb0\x4f\xf7\x8e\xff\xfe\xeb\xcf\xf7\x10\xca\xa8\x97\x6f\x0e\x64\x34\xe0\x7a\xb2\x56\xea\xf7\x5a\x6c\xb7\xd2\x60\xbb\x0d\x2e\xdf\x2d\x96\xba\x86\xc0\x69\xdd\x66\xa5\x51\x67\x8d\x92\xc9\xf5\x5a\xa5\x86\xde\xaa\x57\x2a\x25\xf6\x88\x70\x0b\x4c\x44\xa2\x24\x41\x0e\x49\xf0\x5b\x86\xb9\x82\x10\xde\x82\x50\x31\x9a\x83\x62\x89\xab\x20\xa1\x9f\x57\xb5\x7a\xa5\xd2\x47\xa8\xa2\x76\x7a\x8d\x4e\x05\xf5\xd4\x5e\xcb\x68\x94\xd8\x6a\x49\x53\xfb\x50\xab\x98\xba\xd1\xaa\xd6\xb4\x76\x31\x5f\x7c\x46\x28\xbe\x40\xc8\x5d\xe7\x90\xbb\x09\x21\x0b\x8d\x02\x5b\xea\x6a\x88\x95\x6b\xfd\x6e\xa1\x5b\x82\xf2\xa0\x2c\xf7\xfb\xc5\x7e\xdf\x64\xcd\x52\x7f\x30\x68\xf1\xda\xa0\xaf\x75\x9a\x15\xb5\x3f\x6c\xcb\x3d\x5e\xe8\x37\xb8\x9f\x88\x30\xdf\x2f\x1a\xe5\x9e\x59\xed\x35\x06\xa5\x42\xd5\xec\x54\x7a\x26\x2a\x14\x4b\x32\xac\xd6\x07\x03\xb6\x6c\x54\x6a\x42\x43\x2e\xcb\x5d\xcd\x28\x74\xf9\x6a\x53\x69\x6b\x05\xb3\xdf\xa8\x3f\x23\x14\x5e\x20\x44\x27\x35\x79\x01\x21\xba\x89\xc3\x7e\xa5\xc8\xb7\xea\x5c\xa3\xae\x6b\x4d\xa5\x56\x2f\xe4\x05\xc8\xca\x1c\xe4\x87\xa8\x59\x57\xdb\xad\x6a\xb1\x57\x11\x8a\xf9\xaa\x52\x33\xaa\x7a\xa1\xc1\xb5\x05\x6d\xd0\x33\xbb\x6f\x73\x78\xcd\x0f\xf9\x8b\x08\xdf\xc8\x0d\xe7\x73\xaa\x77\xa4\x99\xb7\x67\x4a\x3f\x9b\x6b\x5e\xce\x96\x3e\xd3\xc8\x43\x5b\x12\x1d\x04\x79\x4a\x79\xd1\x66\x2c\x56\xb0\x90\x25\x4a\x0e\x0b\xb1\x83\x20\xc3\x58\x02\xe2\x25\xcc\x72\x0e\x76\x18\x0e\x40\x6c\x03\x0b\xb1\x16\x0f\xa1\x05\x04\x8b\x4a\xd2\x96\x2a\x70\xe7\xb5\xd5\x81\x04\x16\xb3\x14\xb2\x8e\xc3\x72\x22\x06\x82\x05\xa8\x00\x1c\x9b\x71\x78\x1b\x32\x22\x61\x1c\x4c\x6c\x16\x58\x3c\x21\x40\x24\x10\xda\x48\x10\x10\x8b\x24\x91\x17\x19\x16\x61\x86\xff\xba\xab\x3f\xb0\xad\xb8\xbf\xed\x95\xef\x57\x3c\x6e\x9d\x5b\xb7\x2b\x79\x41\x0d\x54\xa9\xc4\x82\xd5\x38\x9f\x8d\x81\x9b\xc4\x4b\x7d\xb9\x61\xfa\x76\xbb\x37\xc0\xf9\x32\x2e\xb8\x5b\x79\xad\xce\x55\xf1\x66\xc6\x1a\xef\x6a\x1e\xca\x7d\x86\xdb\x89\xe5\x27\x3f\xa1\x20\x0f\xbd\xbe\x9e\x85\xfa\x1b\x8e\x0a\x1d\x09\x11\xe2\x10\xc6\xb6\x00\x10\xa1\xe8\x40\x1e\x01\xc2\xb0\x44\x60\x08\x10\x78\xc4\x10\x47\xe4\xa9\x44\xa1\x6d\x41\x82\x88\xe8\x88\x2c\x10\x91\xc8\x31\x94\xc3\x0c\x03\xb7\xed\xcf\x43\x9c\xdd\x22\x22\x82\x96\xc0\xf3\x2c\xe0\x78\x81\x23\x22\x47\x44\xcb\x82\x94\xc5\x10\x49\x0c\x94\xb0\x48\x20\x82\xc4\xe1\x30\xc7\xd9\x50\xb4\x11\x12\x18\x0e\x71\x3c\x61\x79\x24\x61\x04\xbf\xee\x9a\x5d\x06\x21\x09\x09\x92\xc0\xf3\x07\x8f\x55\xd8\xe6\x70\xcc\xd4\x53\x14\x02\xab\x2c\xf4\xb8\x60\xdd\x58\x74\x57\x45\x68\xce\xc2\x49\x76\x51\x90\x1b\x89\xc2\x54\xd8\x9a\x90\x17\xf8\xe1\x28\x70\x2c\x4d\x9d\x95\x9a\x03\x9b\x43\x81\x41\x3a\x42\x7f\xe2\xe8\xb5\x65\xbb\x2f\xb9\x05\x55\xca\x3a\x3d\x9c\x08\x0c\x6f\xe8\x3d\xb2\x63\xb8\xdf\x34\x6b\xf6\xce\xa3\xf4\xe7\x7f\xf6\xe9\x2d\x3e\x7e\x5e\xca\x4d\xe3\xe0\x3b\x86\xe4\x8b\xd5\x76\x51\xb4\x50\x0f\x58\xe9\x4a\x4b\xe6\x71\x62\x1a\x1b\x41\x37\x73\xa5\x48\xf5\x8b\x5a\x62\xcb\x9c\xaf\x68\x6a\x7f\x2d\x8e\x3a\x09\x3b\x70\x5b\x41\x47\xef\xe8\xe9\x86\x9b\xd7\x87\x1a\x9a\xd7\xea\x9d\x0d\x98\x69\x80\x63\x4c\xd2\x35\x8b\x4b\xbf\x87\xbb\xcb\x9d\xa9\x0b\x1e\x5d\x02\x97\xbc\xe2\xc9\xa3\x55\x50\xfe\x81\xbe\xf7\x63\xae\x0f\x7a\x34\x95\x24\x81\x08\x3c\x86\x9c\x20\x59\xa2\x44\x58\x87\x50\x11\x43\x2a\x30\x90\x73\x20\x74\x28\x45\x9c\x2d\xd8\x88\x81\x3c\x6f\x59\x92\xc3\x10\x09\x72\x44\x64\x21\x62\x6c\x8b\x05\x78\xeb\x8d\x8f\x88\x0a\x02\xb6\x29\xd6\xe6\x31\x22\x88\x5a\x12\xe2\x81\xc4\xf3\x84\xe5\x6c\x28\x38\x94\xe5\x2d\x56\x84\x94\xb5\x24\x96\xb5\xb0\x20\x31\x16\x20\xd4\xb6\x18\x86\xb2\x0e\x00\x8e\x23\xed\xd2\x37\x3c\xf1\x68\xe1\xc9\xa3\x37\x59\x73\xd3\x5c\xda\xb1\xec\x72\x22\xdb\xad\x69\x31\x21\x79\xb6\x4b\xb2\x45\x9e\x36\xad\x66\x61\xdd\x74\xdd\xd1\xc0\xa0\xed\x91\xb6\x1e\x42\x6d\x82\x86\x7a\x85\x71\xaa\x5a\xbb\x4f\xaa\x53\x2d\x07\xc0\x46\x8e\x01\xaf\x48\x74\x32\x63\xca\x56\x8e\xa5\x51\x7d\x4d\xd2\x9d\x1b\xed\x3d\x7a\x79\x64\xbc\xed\xf7\x06\x03\xa0\x75\x27\xf9\x5e\x8d\x73\x73\xd9\x49\xe0\x76\xbd\xf1\x52\x37\x85\x46\xa4\xa0\xe1\x24\x57\x2b\x0d\x8a\xe5\xb1\xa6\xc5\x50\x06\xab\x71\x6f\x46\xfa\xd1\xb4\xa7\xf4\x2c\xa5\xd3\x71\xb2\xe5\xa8\xa2\x72\xd1\xc4\x4b\x83\x89\xa5\x36\xd8\x55\xc9\x13\xe5\x1c\xda\x6b\xae\x5d\xf0\xd8\x86\x76\xa9\xd6\xff\x17\x78\x2c\x07\xa9\x85\x81\xc3\x52\x89\x93\x30\x11\x25\x07\x60\x56\x72\x20\xb6\x04\x16\x70\x18\x61\xd6\x61\xa1\xcd\x00\x8c\x25\x8c\x28\xa0\xa2\x85\xa1\x6d\xd9\x14\xf2\x98\x17\x25\x9e\xdb\xe5\xcf\x47\x78\x3d\x61\x39\x24\x70\xdb\x4c\x2b\x52\xc2\x11\x6a\x49\x3c\x63\x13\x8a\x19\x07\x39\x00\x70\x02\x96\x90\x8d\x24\x4c\x2c\x0b\x8b\x94\xa7\x8c\xc4\x63\x20\x4a\xc8\x61\x6d\x87\x25\xa2\xb8\xf5\x7a\xee\xc4\x63\xc5\x27\x8f\xcd\xfa\xfd\x15\x1b\x02\x6a\x79\xa4\x2a\xf2\x95\x66\xa0\x01\x71\x93\x4b\xcd\xba\x63\x6a\x2c\x16\x82\xd5\xba\xd3\xd1\x75\xa6\x64\xe9\x95\xd6\x4a\x5b\x27\x52\xdb\x9e\xa0\x65\x76\x2d\xb5\x48\x3d\x46\xc5\x54\x5f\xc1\x39\x6a\x2b\x26\x4b\xaa\xdd\x99\x10\x26\x5d\x50\xce\x76\x06\x3b\x86\xb7\x1e\x4b\x4f\x18\x1f\xd2\xa9\xde\x6c\xc3\xd8\x18\xc9\x4a\x5a\xd1\x27\x31\xe4\x78\x06\x89\x2d\x58\x96\x98\x49\x34\xcf\x96\xc5\x1c\xf5\x8b\x93\xd5\xa2\x1d\x29\xad\x7e\x3b\x5c\x72\x82\xb6\x89\xa6\x23\xd8\x08\x9d\xfe\x32\x5f\x9a\x9b\xcc\x30\xaa\xa6\x21\x4a\x8b\xbd\x50\x9f\x3a\x55\xa7\xaa\xbb\xbb\x1c\x6f\x5c\xf0\xd8\x6e\xf7\x52\xad\xff\x2f\xf0\x58\xc4\x4b\x82\x48\x6d\x24\xf1\x0c\xb5\x1d\x28\x8a\x2c\x43\x2c\x16\x48\x90\xb5\x6c\x87\x15\x1c\x8a\x00\x66\x19\x8e\x61\x19\x96\x03\xac\x8d\x2c\x07\x61\x16\x08\x58\x60\x6d\x44\x24\x1e\x6d\xbd\xed\x11\x5e\x4f\xa8\x2d\x3a\x22\x16\x28\xb5\x05\x0a\x18\x8e\x05\x80\xd9\x66\x63\x69\xeb\xd9\xac\xc0\x43\xc4\x42\xc8\x70\xc8\x16\x10\x4f\x2d\x1b\xb0\x90\xa5\x36\x81\x58\x60\x30\x2f\x31\xfc\xb6\x7b\x8b\x4e\x3c\x56\x7a\xf2\x58\xd0\x8c\xc2\x66\x75\xd6\xc6\xeb\xb2\x58\xa9\x38\x8d\x88\xb8\xed\x69\xb8\xd0\x25\xad\x32\xc7\x7d\x97\xaf\x86\xd2\x82\xd6\xe7\xb8\x3c\x2c\x77\xda\xf2\xb0\x86\x26\x65\xac\x8f\x61\xc1\x9f\xfb\x8a\x46\xbc\x9e\xd6\x69\x65\x8d\x5c\x23\x96\x04\x47\x37\x39\xb9\x81\xcd\x56\x79\xb1\x4f\x6f\x3b\x8f\x3d\x71\xa2\x9a\x37\x33\x5d\xd5\xaa\x36\xf2\xcb\x56\x38\x2d\xe5\xe3\x4e\x3b\xf6\x57\x85\xfa\x86\x76\xfa\x50\xb6\xe7\xc3\x76\x3f\x81\xd5\x62\xad\xe0\x8f\x1b\x6c\xd3\x0b\x84\xc4\x71\x0b\x8a\x9c\x5f\x37\x3d\xe2\x8e\xcb\x6c\xbd\x5d\x5b\xb5\x6c\xbb\xc7\x4b\xf2\xb8\x9a\x2c\x79\x82\x71\x6b\xb8\xf3\xd8\xee\x05\x8f\x35\xb9\xb3\x0a\xcf\xcb\xff\x3b\x3c\x56\x62\x79\xdb\x61\x19\x01\x61\x4e\xa0\x82\xc3\x11\x44\x59\x01\x42\x41\xe2\x89\x65\x71\x98\xf0\x96\x68\x21\x80\x28\x67\x63\x11\xf1\x12\x01\x36\xcf\x8a\x9c\xc4\x58\x92\xcd\x08\x0c\x72\x76\x83\xa9\x07\x78\x3d\x11\x11\x02\x92\xe5\x60\x01\x70\x16\x8b\x2d\x51\xb4\x1d\x01\x3b\x12\x85\x70\x9b\x87\x05\x5b\x14\x05\x46\x00\x1c\x03\x6d\xe8\x58\x90\x73\x18\x81\x17\x45\x49\xb4\xa8\x23\xf1\x58\xa0\x5f\x77\x83\xe6\x27\x8f\x15\x9e\x46\x66\x0a\x83\xfb\xe3\xa4\xd7\x2b\x25\x22\xe7\x8e\xd6\x6b\xa5\x53\x91\xc4\x20\x37\x55\xbc\x42\x5e\x6f\x1b\x0a\x63\x49\x58\x2f\xcd\xd6\x0c\x99\x4e\xa7\x9e\xcf\xcc\x59\x83\x81\xd6\x68\x64\x0a\xec\xa0\xec\x8a\x93\x38\x32\x84\x51\x43\x64\x67\xeb\xec\x60\xee\x4d\x55\x5d\x16\xa5\xb5\xb6\x73\xa3\xbd\xc7\xba\x47\xc6\xed\x70\x56\x9c\x0f\x73\x05\x77\x23\xae\x5c\x89\x71\x94\x65\x27\x5e\xac\x74\x3f\x96\xd2\x49\x4f\x80\x4a\x89\x2a\x49\x3e\xad\xfb\xf5\x5e\x55\x37\x0d\x3f\x37\x5b\xb6\xd7\x73\x6e\xec\xd0\x45\x30\x6e\x5a\x7a\x89\xd5\x49\x3f\x9f\x6f\x76\xb2\x9b\xce\xca\x0e\xbd\xc1\x62\x31\x9d\x3b\x3b\xfd\x83\x0b\x1e\xdb\x27\x67\x15\xfe\x3f\xc2\x63\xdf\x98\x97\xb8\xb0\x11\xe8\xb3\x13\x12\x87\xcd\x40\x8f\x98\x72\x62\x9e\x86\xfd\x5d\xd3\xec\x1e\x1c\x20\x6c\x2e\x07\xb9\x82\x9d\x23\xfa\xba\xde\x9d\xe7\xe8\xbc\xd4\xd8\xcc\xe6\xc2\xc0\x0e\x97\xc4\x69\x6f\x26\x25\x67\x58\x30\x5b\x4a\x85\xd5\x26\x7f\x7d\x7d\x7a\xde\x34\x3b\xad\x43\xe1\x13\xcb\xed\xb7\x78\x4d\x08\xd5\x2a\xa8\x1a\xd9\xe5\xa0\xad\x48\x9b\xfe\xa2\x6f\x76\xe0\xca\x6b\x7a\x83\xb4\x6d\x31\xea\xc2\x37\xaa\x54\xdc\x3e\xcf\x3c\x4d\x66\xec\xd0\x30\x4f\xb3\x11\xfc\xdb\x14\xbe\xde\x3a\x73\xc7\x3c\xd1\x9b\x7b\x3b\xee\xd3\x79\xbe\x3d\xe3\x0e\x6d\x6f\x6c\xae\xb8\x43\xe3\x1b\xdb\x20\x3e\xeb\x87\x27\x5b\x21\x4e\x26\x17\x3b\xad\xd6\xc0\x90\xfb\x85\x7c\xad\xd8\xab\x9b\x4d\xc5\x2c\x09\x72\x57\xcb\x23\x41\xe9\xb5\x58\xbd\x63\x36\xbb\x95\xee\x40\xab\x2b\xed\x2a\xdb\x10\x1a\x6c\xb5\xab\xd5\xf2\x0a\xbb\x1f\xdc\xef\x7d\xa9\x42\x06\x9c\xab\x20\x23\xae\x0f\x93\xbe\x37\x77\xb8\x8a\xa6\x42\x2e\x6a\x01\xcf\xee\x03\xb3\x93\x2f\x7a\x93\x45\x67\x91\x82\x74\x54\x3c\x86\xdc\x6e\x2c\xae\xec\xfe\xdc\xe6\x16\xcd\x2b\xda\x52\x6c\x34\x26\x44\x1a\xc1\xb1\x6f\xe7\x57\xcd\x84\xb6\x44\x77\x93\x2f\x3b\xac\xdc\x6d\x42\x24\x0d\xe7\x70\xd1\x9f\xc9\xa3\xe1\x6e\x38\x94\x27\x52\x77\xc5\xee\x9e\x77\x9f\xff\xd9\x25\x22\x65\xf9\xfc\x59\x95\x65\x49\x39\x49\x5d\x79\x69\xa0\xc0\xb6\xaa\xc8\xed\x42\x90\x1b\x25\x95\xa9\x14\x4c\x2c\x6e\x83\xe0\xa2\xaf\x74\x20\x27\x19\xad\x72\x4e\x2f\xf0\x53\x6d\x60\xd6\x76\xea\x42\x65\x19\x17\x04\xa5\x04\xb0\xed\x2b\xeb\x54\x60\xf8\xba\xb2\x6e\x56\x87\x8d\x76\x3d\xd0\x26\xd5\xe6\x90\x13\x7a\xfc\xcc\xcd\xad\xa7\x40\x6a\x75\xfb\x6c\x4e\x2e\x7b\xed\xca\x52\x8f\x96\x92\x38\xb2\x43\x14\xd5\xa6\x20\x98\x12\x5f\xd7\x72\x2b\x12\x17\xf9\x7e\x14\x6d\xf2\xee\x5f\x7f\x9d\x37\x91\x0f\xae\x1a\x78\x57\xd5\xd4\x5e\x56\x8d\x9a\x0f\x48\xbb\x33\x9d\xb8\x91\x29\xc6\xad\xb2\xbd\x4c\xbb\x9d\x5c\xa7\x53\x53\x36\x9d\xb0\xca\xf0\xed\xa0\x3b\x5d\xe4\x86\x7c\x0c\xcb\x6b\x41\x7e\xae\x1a\x78\x96\x62\x3f\x4d\x3d\x5c\x7a\x72\xa5\x4b\x7c\x87\x19\xdb\xac\x4f\xb9\xfc\x22\x5f\x2a\xb6\xcc\x4a\xd2\x9f\xa8\x4b\x73\x99\x88\x26\xcd\x85\x12\xd2\xf2\xeb\xd0\x4c\xad\x89\x07\x0a\xe3\x89\x3d\x34\x56\x31\x6f\x54\x8c\xf2\x50\x09\x47\x59\xab\x50\x57\x04\x7e\x4a\xdc\xa5\xd5\x69\xe6\x1c\x30\xf8\x09\xd4\x73\x77\x51\x6f\x9c\x53\x5f\xd2\x3a\x15\xc8\x94\xd9\x4e\xa0\x0a\x55\xa6\xb0\x64\x37\x13\xcc\x8d\x4b\x34\x9a\xea\xe5\xfe\x70\x99\xb4\x83\xd4\x63\x3a\x46\x80\xea\xee\x33\xf5\xaf\x3a\x94\x9f\xa5\xbe\x5a\x1c\x41\x52\x5e\x8b\xd2\x20\x9e\x69\x9d\x0d\x35\x2c\x54\x18\xb2\x86\x10\x6f\xe4\x76\xdf\xcf\xd5\x41\x98\x48\x92\xbb\x52\xb4\x51\xd3\x2f\xe4\xea\x82\xaf\x76\xd5\x61\x05\x56\x10\xcf\x08\x6d\xab\x69\xd8\x12\xb3\x28\xe1\xd8\x0a\x9d\x99\xdb\x04\xc6\x20\xdb\x5f\x38\x8a\xf1\xc3\xa9\x47\x77\x51\xdf\x3d\xa7\xbe\xae\xe7\x27\x1b\xdf\x98\x86\x5e\x93\xf4\xf0\x7c\xa0\xb7\xd6\xe5\x41\xab\x5e\x42\xaa\xc8\x6f\x60\x22\x8e\xfa\xae\x8c\x66\xa6\xe6\x8b\xc6\x33\xf5\xe8\x5e\xea\x37\x9a\x07\x07\xa0\x58\x89\xbc\x41\xce\xa1\xa3\x1e\x9a\xf7\xd5\xaa\x10\x0c\x72\x4a\x81\x2c\x7c\xd6\x80\x35\x69\x9c\x8c\xad\x16\x5d\x6b\xba\x3c\x92\xb0\x34\xe3\xe5\xcd\x22\x22\xf5\x4d\x35\x19\xf0\xee\x82\x31\x9b\x4a\x77\xac\x34\x88\x12\xe9\xee\xa6\x06\x40\xe0\xd4\x94\xe5\x0f\xa7\x9e\xbf\x8b\xfa\xc1\x19\xf5\x4a\xaf\x62\xf5\xa2\xa1\xda\xb7\xd3\x62\xa1\xbf\x18\xba\xbe\xba\x6e\xaf\x13\x35\xd5\x84\x0d\x0e\xaa\xc8\x9b\x57\xba\x35\x57\xdd\x40\xbd\x7d\x4c\x38\xfc\xbd\xd4\x87\x63\x3e\x59\x96\xe8\xaa\xd4\x9f\x45\x15\xa9\x50\xf6\xf2\x7a\x7d\x51\x97\xa0\xeb\xa1\x49\x58\x23\x4a\x67\xd4\x4d\xd6\x0c\x18\xd1\x5a\xa9\xa5\xa9\x6b\xd0\x71\xd4\x4e\xb3\xda\x5b\xc7\xbc\xb4\xa9\x7a\x41\x09\x72\xb8\x9b\x4a\x4d\x86\x96\xe7\xde\xaa\x8c\xeb\xa6\x0f\x03\xf9\x40\xfd\xdb\x0d\xfb\xa5\xcd\x7d\x37\x34\xec\x4f\x1b\xfc\x9e\x2b\xd3\x41\x22\xb0\x04\x4e\x84\x40\x04\x9c\x88\x24\xc7\x11\x79\x9b\xc5\xc8\xe1\x05\x89\xb1\x28\x84\x54\x10\x2c\x5b\x00\x12\xb4\x1d\xd1\x41\x80\xe3\x24\x87\x88\x8c\x80\x25\x8e\xe3\x99\xdd\xec\xfd\x73\xa5\xee\xfc\x7b\x3f\x56\x9e\xad\xc6\x9e\x5c\x9d\x2a\x4b\xc6\x67\x68\x65\x96\x73\x43\xa3\xe9\x78\x49\xa9\x5d\x66\x9c\x96\x59\xd3\x70\xa5\x2d\x35\xb2\x42\x9b\xd7\xf6\xb3\x41\xd7\x0a\x7f\x79\x33\xdf\xa7\x0b\x7f\xdc\xd0\xf7\x5c\xf8\x29\x8e\x93\xdd\x51\x01\xfb\xb0\x65\xf7\xec\xda\x76\x83\xef\x1e\x7e\x9e\x47\xd4\x05\x1c\x87\x10\xc3\x11\x19\x79\x8b\xc3\xcd\x73\x1c\xff\x67\xb7\x2b\xe4\xb7\xc3\x8b\x3c\x7e\xfb\x23\xc3\xec\xf7\x89\xfc\x16\xd3\x68\x41\xa3\xdf\xfe\xc8\xfc\xb6\x60\x98\xff\x30\xff\x01\xbf\x1d\x6e\x90\x34\x8a\x68\x90\x54\x77\x45\xfb\xed\x8f\x0c\xff\xf2\xfb\xfc\xee\x34\x47\xfc\xdb\x1f\x99\xff\xf7\xcb\x93\xa1\xff\xf3\xe5\xd4\xec\x4e\x72\xab\x98\x02\xc0\x31\xa2\xcd\x8b\x16\xa5\x82\x05\x58\x0b\x89\x22\x2b\x21\x89\x01\x12\x63\x43\xc1\x86\x36\x0f\x88\xe4\x08\x9c\x20\x51\x28\x58\x1c\x24\x1c\xc7\x63\x91\xf2\xa2\xe8\x38\x16\xc2\x07\x44\xcf\x7a\x03\xba\x4a\x7e\xfb\xe3\xcc\xda\xbe\x30\xdb\xb2\xff\xf6\x47\x06\xbc\xb8\xf5\x7f\xcf\x9e\x8f\x03\x3c\xdb\xe2\x02\x12\x8f\x6c\xe4\x08\x48\xe4\x90\xcd\x32\x84\x85\xbc\x03\x39\x22\xf1\x84\xe1\x21\x72\x10\xc7\x58\xd8\xa1\x44\xe0\x01\xa1\x22\xe4\x05\x1b\xb0\xbc\xe4\x48\x84\x48\x80\x22\x60\xd9\xbf\x7d\xb9\x60\xe1\x0d\x0e\x80\x04\x05\x48\x19\x44\x89\x60\x61\xcc\x31\x98\x75\x80\x88\x24\xc6\xc1\x2c\xcb\x8b\x8e\x48\x05\x91\x07\x82\x48\x78\x22\x02\x41\x94\xa0\x03\x19\x42\x29\x44\x02\x6f\x71\x9c\x44\xad\xcf\x73\xc0\x7c\x7b\x7d\x2f\x4c\x93\x59\x9a\x3c\xb6\xec\x57\x19\xbe\xf3\xfa\x14\xc3\xf7\xda\xfa\x51\x5e\xf6\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\x0f\x07\xff\x70\xf0\xe3\x38\xd8\xfd\xf5\xff\x7d\xf9\xbf\x1f\x19\x34\x3c\xbd\xfe\x6f\xff\x6e\x91\xf3\x32\xec\x07\x0d\x0c\xf8\x88\xa6\x80\x26\xcb\x30\x9a\xcc\x70\x1c\xcf\x46\x11\x8e\xe9\x05\x4d\x1d\x1a\x27\x99\xb6\x5a\xc8\xd4\xf7\xc2\x99\x3f\x33\x6d\x3a\x4b\xa8\x6f\xd1\x28\xc3\x02\x06\x7d\xc4\x90\x13\x46\x84\xc6\x64\x16\x06\x5b\xee\xa7\x38\x0d\xc8\xe8\xdc\xd0\xee\xdd\x1d\x1f\x51\xb6\x1f\xb2\x1d\xf6\xc6\xc7\x97\xcb\x7f\x18\x34\x25\x9e\xbf\xab\xce\x6f\xe7\x63\xa8\x63\xdd\xff\x36\xc2\xdb\xa1\xd0\xce\xfa\x97\x93\xda\xfe\xcd\xa1\xf4\x63\x82\x3e\x5e\x25\xab\xd8\xdb\x7c\x50\x3c\xa2\xbb\x81\xdb\x3b\xc2\x1f\x73\x85\xed\x38\x36\x26\xb3\xdd\xf1\xf9\x4b\xd7\xf3\x72\xce\x6e\xf2\x4f\x09\x8a\x0d\x5d\x4e\xbb\x55\xb5\x67\x99\xdc\x3c\xc8\x2a\x23\x59\xca\x56\x80\xad\x07\xa6\x54\xe8\x2e\x5b\xe1\xac\x0a\x04\x21\xa9\x86\xad\xe3\xda\xe1\x7e\x1a\x26\xd7\x93\x13\xe0\x2e\x5d\x6d\x34\xcc\x71\x56\x7b\xe6\x0c\x51\x31\x5b\xcb\xda\x02\xb3\x9c\x48\xd9\x66\x57\x6b\x3b\xeb\x3c\x9d\xb5\x8a\x85\xce\xf3\x8c\x40\xd9\xbb\x73\x9a\xe6\x96\x19\x85\xbc\xbc\x68\xcf\x3a\x4c\xa3\x53\x0b\x17\xd0\xe1\x4b\x8d\x3a\x1b\xd2\x41\xb0\x59\x94\x4c\xab\xd9\xe7\xb3\xf5\x0e\x58\x17\xdb\x6d\x35\x72\x56\x85\xe1\x3a\x5a\x7b\x6b\xa3\x32\xd2\x02\xc9\x9d\xf0\x33\xa4\xd7\x0a\x83\xb5\x2d\x54\x98\x12\xd3\x47\xf5\x06\xdf\x07\x79\xd3\xe9\x14\x1c\x5f\x7d\x9e\xe1\x50\x06\x77\xae\xc5\xe6\x6f\x99\x06\x33\xaa\x60\xde\x95\x3a\x93\x4d\xa5\x2a\xc1\xec\x68\x33\xb6\xe7\x25\xbf\x2c\x0a\x2b\xa6\xb7\x61\xb2\x8b\x71\x57\xaa\x8d\x26\x13\x97\x87\x62\xab\x47\xe6\x62\x18\x4f\x94\xb0\x55\xce\x0d\xca\x8d\x39\x6d\xab\xf9\x5e\x2d\xa0\xeb\xa4\x25\x99\xd9\x4e\x27\x9d\x4a\xb2\xd9\x07\xab\x3e\x72\xc1\x0e\xce\xb8\x32\x5e\xaf\xc7\xa3\x5a\xde\x34\x0d\x28\x3b\xab\x85\xb8\x42\x9d\x6c\xdb\xaf\x56\xec\xd9\xd2\xeb\xa2\x70\xe8\x4f\xe2\xb4\x40\x04\xc6\x30\x40\x54\x2a\xf9\x68\x38\x2e\x16\xd3\x4a\x33\x1b\x38\x53\xb1\xed\xa5\x0b\x58\x57\x3b\x72\xcd\xcc\xd7\x4b\x8c\x59\xb0\x2a\x72\xb9\xa1\xca\x77\xfa\x9b\xfb\x5c\xff\xcb\x7b\xd7\xbe\x77\x97\xf3\x39\xff\x35\x2a\x7a\x36\x22\x79\x18\xb7\x18\x1e\xaf\x17\xad\xf6\xc0\x6d\xab\xd6\xc6\xb1\x39\x3d\x1d\x56\xd4\x92\x3c\xe1\xcc\x2a\x49\x6c\xbd\x3f\xce\x83\x96\x2c\x26\x1a\x5c\x82\xcd\x9a\x89\xa3\xc6\x82\xac\xb9\xd9\x4a\xca\x16\xa7\xd5\x45\x47\xea\x7b\x38\x8c\xdb\xbd\xb1\x39\x4c\xd0\x72\xb7\x6e\x92\x37\x67\xb4\xc1\x0c\x07\x14\x6e\x3c\xa5\x54\xd5\xcb\xb5\x08\xae\x9d\x6c\xb7\xa2\x77\xb5\x51\x59\xae\x9a\x0b\x26\x74\x69\x50\x35\xd7\xbd\xee\x89\xbf\xf0\x63\xea\xc1\xb1\x1f\xea\x62\xa7\x38\x55\x73\xd4\x25\x50\x68\xf6\x93\x52\xa5\xb2\xe9\x99\xe2\xd2\xf4\x86\x79\xac\xa4\xa8\x8a\x76\x46\x86\xbb\x87\x4e\x96\xd0\xe4\x33\xff\x3b\xde\xcf\x9b\x66\xfd\xb0\x8b\x4f\x61\xd2\xbc\x5d\x0a\x3b\xa9\x5b\x5b\x18\x89\x2a\xe4\x47\x7a\x15\xd6\xa9\x64\x9b\x4d\xa7\xa8\x67\xcb\x1e\x2a\x2f\xba\x8d\xec\x50\x4e\x84\xfd\x8e\xc3\x82\x44\x0f\x8f\xaa\x89\xbb\x58\xaa\x69\xa3\x27\x1b\x92\xd0\x62\x5a\x9d\xa4\x6b\x2f\xeb\x6a\x69\xa6\xe6\x94\x2e\x9d\x6d\x6c\xa3\xd9\x9f\x86\x01\xf1\xaa\xe6\x4e\xfe\xb6\xe5\xe9\x7d\x01\x9c\xfe\x48\x3e\xbf\xb0\x30\x59\x4c\x96\xbb\xe2\xa9\x9c\x84\x5b\xdd\x74\xd3\xef\xd3\x7a\x29\x65\x0a\x8e\x3e\xc8\x5b\xb3\x69\x3e\x6c\x66\x2d\x26\xcf\xa5\xb5\x62\xc2\x76\x8b\xc3\x84\x1f\x37\x2b\x8b\xa5\xd9\x68\xf9\xb5\x8d\xd3\x57\x87\xb8\x94\x5f\xe8\x5e\x14\xeb\x22\xad\x3b\x59\xa9\xc0\x68\x3a\x28\x8c\xa4\x5a\x8e\x1d\xfb\xca\xd1\x1f\xf3\xcf\xf9\xed\xf3\xfe\x7d\x6d\xaa\xf7\x8d\x43\xc2\x9f\x9d\xed\x3c\x39\x28\xfc\x88\x83\x4a\xcc\xb7\xcc\x3d\xa7\x88\xbe\x6a\xdd\xd6\xd7\x6f\x19\x89\x65\x21\x14\x58\x00\x79\x11\x71\x82\x80\x44\x20\x7c\xcb\x30\x2f\x37\x0a\xf0\x57\xce\xbc\x5c\x2c\xd4\x7d\x9b\x24\xee\x38\x78\xf4\xb5\xdb\x56\xdf\x2a\x14\x3c\x2f\xd3\x49\x21\xc1\x47\x4a\x75\xfb\x59\x9e\x1f\x58\x2a\xe9\xd7\xd6\xd4\x8f\x71\xbf\xf3\x32\x81\x93\xef\xae\x84\xe9\x5b\x07\x9d\x3f\x1d\xa8\xa7\x87\x9d\x8f\x87\x90\x78\x9e\x47\x3c\xe6\x29\xb6\x29\x0b\x44\x96\x20\x41\x04\x48\x60\x58\x5e\xb0\x25\xca\x71\x08\x52\x4a\x91\x20\x32\x04\x4b\x18\x89\x18\x43\x46\xa2\x16\x70\xa8\x08\x39\x84\x1c\xfb\x70\xa6\xe2\x45\xb7\xaf\x76\x96\xf6\xf3\x5e\x2e\x0f\xaa\xa0\x5c\x5c\x27\xa3\x65\x9d\x99\x0e\x00\x5e\xcf\x42\x46\xaa\x97\x56\x8b\xaa\xb2\x6e\xa0\x24\xaf\x11\xc5\x5c\x2c\x0b\xd2\x12\xba\x49\xd4\x08\x86\xaf\xf2\xed\x85\xeb\xcd\xb3\x39\xda\x59\x33\xf4\x79\xfb\x83\x5c\x96\x9c\xe9\xfb\xa0\xfd\xd7\x0b\x9b\x97\x79\xb7\x18\x47\x64\x45\x28\x72\x04\xf1\x94\xb3\x00\xcb\x39\x1c\x2b\x20\x87\xe5\x78\x24\x02\x6c\x61\xcb\x71\x18\x4c\xa1\x25\x59\x98\x67\x2c\x00\x45\x49\x80\x48\xa0\x48\xa0\xd4\x22\x2c\xd8\xf3\xce\xbe\xe6\xfd\x17\x95\xfb\x51\xbc\x8b\x27\x7b\x05\xf4\x1f\xc0\x3b\x6b\xb1\x54\x64\x6d\x0b\x5b\x5b\xce\x2d\x56\xc0\x80\x40\x86\x03\x04\x0b\x8c\x2d\x62\x22\x59\x44\x60\x44\xc8\x38\x92\x83\x30\xb4\x6c\x5e\xa2\x04\x43\x5b\x14\x1d\x0b\x50\x82\xc8\x9e\x77\xf8\x70\xde\x6f\x2d\xf7\xa3\x78\x17\x4e\xb6\xa9\xd7\x7e\x00\xef\x94\x11\x2c\x4c\x11\x62\x6d\x0c\x18\x80\xb0\x0d\x59\x07\x58\x12\xc6\xb6\x63\x03\x87\x67\x21\x75\xa0\x40\x2d\x4e\xe4\x2d\x06\x58\x80\xe3\x08\x23\xb1\x50\x84\x3c\xa0\x1c\x42\xb6\xb0\xe7\x9d\x7b\x38\xef\xb7\x96\xfb\x51\xbc\xa3\xe5\xbb\x86\xee\xe2\x9d\x38\xb6\x28\x32\x3c\xb5\x91\x28\x10\x44\x6d\x51\xb4\x29\x06\xd4\x02\x40\x64\x44\x82\x1d\x28\x12\x20\x20\x40\x05\x81\x03\x14\x20\x9b\x42\xc2\x0a\x8c\xc0\x53\x09\x53\x2a\x52\xba\xe7\x1d\x3d\x9c\xf7\x5b\xcb\xfd\x28\xde\xb9\x93\xca\xbe\x78\x42\xe3\xde\xfc\x8e\x08\xb6\x09\x05\xc8\x21\x00\xdb\xc8\xe6\x1d\x0a\x80\x64\x89\x16\xb0\xa9\x45\x80\x0d\x6d\xc7\x86\x2c\xc5\x1c\x6b\x89\xd4\xc2\x90\x4a\x14\xf3\x22\x61\x05\x8e\xa7\x1c\x03\x9c\xc3\xc9\xae\xab\xbc\xcb\xc2\xa0\x2a\xca\xc2\x78\xea\x6a\x4d\x0a\xec\x6e\x57\x30\x4b\x44\x35\x56\xbc\x91\x5b\x4e\x4b\x73\x02\xbb\x2a\x83\x70\x19\xea\x1e\xb3\x2f\x8b\xe0\xc7\xa1\x7c\xd4\xf7\xc6\x75\x9d\x77\xf5\x3e\xfb\x3e\xb9\xcd\xfe\x87\x79\xb7\x39\x91\xb7\x2d\xdb\x06\xac\xcd\xf1\x40\x64\x04\x5e\x60\x08\x87\x11\x16\xa8\x64\xf3\x54\xe4\x11\xc1\xac\x44\x2c\x8e\xa1\x3c\x6b\x0b\x18\x3b\x02\xc0\xac\x43\x29\xb2\x20\x6f\xd3\x3d\xef\xd7\xdb\x55\x25\x0d\x61\x98\x70\x68\xae\x34\xb5\xd5\xcc\xc8\xc1\xb0\x54\xcf\x6e\x18\xa1\xb5\xf6\x62\x66\xea\xd4\x0a\x03\xdf\xe8\xb9\x51\xda\xce\x76\xe4\x1f\xc1\xfb\x2d\xf6\x7f\x34\xef\x22\xc3\x30\x12\x4b\xa0\xc8\x73\xd0\x76\x04\x48\x00\x83\x30\xc2\x8c\x2d\x08\x96\x08\x58\xdb\x71\x00\xb2\x39\x07\x01\x87\xf0\x36\x03\x44\x86\xc7\x58\x40\x04\x60\x9e\x01\x92\x23\xe1\x3d\xef\xef\xb4\xab\x29\x56\x2c\xb3\x3f\x64\xd5\x69\xbf\x87\x23\x93\xef\xae\x96\x56\x0f\x16\xeb\x65\x77\x16\x40\xb9\xad\x8c\xf4\xc2\x0c\x59\xab\xb6\xde\x73\x7f\x04\xef\xb7\xd8\xff\xd1\xbc\x43\x96\x72\x16\x66\x1c\x96\x11\x2d\x1e\x63\x96\x63\x81\xc5\x49\x02\x87\x78\xcc\x58\x40\x02\x12\xa0\x50\x84\x02\xe5\x79\x0b\x72\x12\x02\x10\xd8\x1c\xb5\x6d\x1e\xd8\xc0\x01\x48\x38\x9c\x20\xbd\xd0\xae\xfe\xa2\x72\x3f\x8a\xf7\x09\xf7\x63\x79\x07\x12\x01\x0c\x27\x60\x9e\x25\xdb\x7e\x3c\xcb\x50\x2a\x4a\x92\x0d\x08\x21\xb6\xc4\x12\x91\x41\x2c\xa2\x14\x0b\x0c\x8b\x80\xc0\x02\x96\x07\x90\x65\x2c\x88\x59\x4e\x92\x10\x15\xad\xc3\x39\xc8\xeb\x79\xc6\xcd\xe5\xc7\xa2\x09\xa5\xe5\x58\x67\xda\x91\xc4\x87\x44\x68\xf8\x51\x32\x62\xc7\xf9\x95\x54\x6d\x18\xb6\x34\x31\x4d\x4d\x8f\x06\xed\xc7\xe5\x77\xed\x3e\xfb\x3f\xda\xdf\x05\x01\xf2\x0e\xb0\x44\x5e\xb2\x29\x70\x04\x0e\x23\x6a\x0b\x8e\x68\xf3\x88\x95\x24\x6e\xdb\x65\xdc\x8e\x4e\x01\xc7\x32\x0e\x74\x08\x6b\x59\x84\x83\x22\x10\x39\x87\x65\x88\x08\x10\xda\xf3\xfe\x4e\x7e\xff\xec\xb4\xe4\xa3\x79\xbf\xc1\xfe\x8f\xe6\xdd\x11\x38\x62\x23\x4e\x04\xc0\x46\x50\x20\x80\xb7\x1d\x07\x22\x42\x38\x41\x84\x16\x15\x45\x86\xb0\x36\x2f\x00\xc2\x30\x88\xc1\x88\x27\x58\x70\x24\xc4\x08\x48\xb4\x89\xc0\x31\xc8\xde\xf3\x7e\x21\xbf\xff\xa2\x72\x3f\x8a\xf7\x1f\x9d\x67\x88\x04\x1d\x11\xf0\xbc\xe0\x40\xc1\xde\x75\x55\x24\x4a\x80\x4d\x25\xde\x71\x20\x14\x19\x9e\xe3\xf0\x36\x03\x61\x8e\x50\xcc\x10\x8b\x27\xd4\x62\x2c\x42\x09\xef\x6c\x9b\x5c\x71\xcf\xfb\x85\xfc\xfe\x8b\xe2\xfc\x22\xef\x37\xd8\xff\xd1\xbc\x5b\x88\x75\x18\xde\x71\x2c\x49\x24\x80\x13\x28\x84\x96\x44\x58\x4a\x20\x10\x45\x00\x21\x20\x36\x15\x18\x47\x44\x16\xe4\x38\x68\x63\xca\x12\x44\x2c\x91\x27\x82\xcd\xd9\x22\x87\x0e\xbb\xff\x2f\xe4\xf7\x07\xb6\x6b\x17\x97\x5b\xde\xe3\xbd\x70\x9f\xfd\x71\xf7\x36\xfb\x1f\xe5\x9d\xb1\x59\xcc\x59\x54\x60\x39\x01\xf0\x48\x74\x78\xd1\xb6\x10\xa0\xd4\x61\x25\x8a\x01\x76\xa0\x23\x89\x88\x50\x46\xb4\x10\x61\x19\xd1\x01\x90\xe3\x19\x9b\x03\x84\x13\x6c\xc2\x4a\x87\xad\xff\xd7\x79\xbf\xb7\xff\x7c\xb2\x2c\xf3\x71\xde\x8b\xf7\xd9\x3f\xad\xf7\xcf\xd8\xbf\xba\xdb\xff\xf2\xeb\x21\x3f\x3f\xb1\xfc\xa3\x67\x95\x8b\x55\xb1\x64\x2c\x8c\x89\x55\x61\x4b\x32\xec\x99\xe3\x56\x54\xf1\xc7\x7d\x00\x9c\xa2\x18\x57\x75\xc1\x07\x5a\x6b\x59\xee\xe5\xe4\xfe\xee\x90\xd7\xc9\xec\xf1\x39\x4b\xaf\x58\xfb\xc4\x59\xd3\x9d\x7c\x03\x45\x95\x53\x7d\xfb\x59\x85\x6d\xa5\xe4\x6d\xb5\x4f\x59\xd8\xe5\xa8\xa4\xb0\xed\xd5\x2c\x5f\x1d\xb6\x56\x4c\x54\xde\xb4\x0b\xd5\x32\x58\xa9\x2a\x48\x2b\xc5\x99\x3f\xb7\x9c\xa9\xda\xc9\xf6\xfb\xfa\x9c\xef\x7a\x6a\x7e\xe3\x17\x56\x49\xb6\xd8\xc8\xf6\xe7\x85\xd0\x68\xda\x51\xbf\x23\xcc\x98\xb0\x3a\xd4\x4b\xf3\x4e\xad\xf9\xf5\x5b\xe6\xeb\xd0\x1f\xf6\x66\x69\x44\x75\xbd\x5a\xa0\xb2\xb9\x2a\x07\x2c\x6d\x15\x9a\x29\xea\xbb\x64\x8e\x7b\x95\x70\x15\x44\x6a\xd6\x05\xa6\x73\x7c\x9f\xcf\x15\x0e\x8e\x9e\xf1\xe2\x38\xc5\x89\xec\xae\x75\x7b\xc4\x2c\xcf\xad\xb3\x2c\xf2\x03\x66\x79\xea\xd1\xba\x63\xdc\x61\x5f\x96\x7f\x5d\xaf\xf0\x52\xb6\xfc\xd1\x4b\x08\xb7\x07\xd9\x95\x15\xff\xfd\xf5\xd9\x15\xf7\x6b\x41\xe6\x04\x85\xf6\x66\x48\x47\x8c\xb0\x49\x44\x36\xac\xd9\x73\xca\x65\x73\xab\x20\xce\x4d\x4a\x79\xbb\xd8\x77\xa4\xbc\x9e\x6f\x0d\x1c\x73\x08\x55\xa3\x03\xf1\x72\x39\x0c\x50\x75\xee\xea\x45\xa9\x3c\x9f\x2e\x6a\x7e\x8b\xe9\x54\xf0\x8a\x84\x65\x43\x4d\xe7\x45\xa2\xb4\x49\x6d\x1b\x08\xb1\xe3\x86\x0d\x6d\xd5\x43\x55\x79\x22\x29\xb6\x53\x2e\xf6\xe4\x39\xbf\xc8\x15\xd3\x06\x4a\xfd\xe2\xb2\x51\x26\x8c\x33\x75\xd2\xc5\x49\x69\x7f\x7d\x90\xdd\xeb\xe4\xf7\x06\x59\x6d\x59\xf5\xc3\x47\x06\xd9\x4f\x1c\xf2\x7e\x28\xc8\x1e\xbc\x5e\x74\x7b\x90\xa9\x67\xe8\x5f\x39\x9c\xe5\xbb\x3e\x63\xb2\xb6\x8b\x4c\xc6\x9f\x33\x74\x5a\x23\x45\x26\x59\x8d\xdb\x83\xca\x50\x5a\x6a\x6e\xd8\xce\x63\xda\x13\xbb\x5e\x61\x4f\xd8\xdb\x41\xa6\x96\xd3\x29\x93\x54\x8b\xd5\x02\x67\xae\x96\x09\xb0\x55\xc5\xd4\x1c\x3e\xb1\xd0\x94\xb3\xd6\xb5\xa8\xe8\x2a\xb3\xec\xd4\x1c\xd6\xfc\x15\x49\x10\xe7\xd5\x1d\xd6\x5f\x25\xe3\x15\x5f\xb3\xd1\xb0\xcc\x69\x9c\x3a\x25\xb1\xc3\xf1\x9a\x3c\xca\x17\xdb\xdd\x66\x1c\x88\xce\x40\xdd\x06\x42\x65\xcd\x2b\x2c\x9f\x2e\xcb\xd5\x32\xaf\xaa\x05\x79\x1d\x94\x06\x51\x79\x51\x2a\xaa\x25\x24\xe1\x86\x84\xe9\x7a\xcc\xea\xd9\xa5\x50\x38\x2e\x0f\xfc\xfa\x20\xbb\xd7\xc9\xef\x0d\xb2\x2a\x98\xf0\xf2\x03\x83\xec\x67\xce\xa3\x7e\x28\xc8\x1e\xbc\x38\x78\x7b\x90\x9d\xaf\x78\xbf\x72\xb8\x06\xab\xe4\xe4\x06\x87\x06\x79\x15\x26\x25\xb3\xd0\x60\x5a\x50\x06\x35\x3a\x69\x8a\xe5\x16\x1f\xd4\x19\x59\xa2\x3d\xcf\x5e\xeb\xc9\xbe\x92\xae\x04\xd9\x60\xe0\xac\x1b\x91\xdf\x1c\x39\x13\x8f\x9f\x46\xcd\x6c\xa8\x38\x69\x50\xf6\x5b\x29\xeb\x3b\xab\x29\x07\x42\x34\xef\xb5\x84\x35\x33\xf0\x9b\xe2\x2c\x2c\x66\xf9\xfe\xdc\xe5\x98\x71\x45\xe9\xd5\x97\x66\xd8\x14\x18\x41\x31\xb5\x26\x15\x80\x0e\x12\xda\x5b\x74\xe8\x78\x52\xde\xbd\x34\xab\x9f\xa6\x66\x9b\x75\xb5\x42\xd4\xa9\x2e\x53\x1c\x39\xa0\x39\x18\x0b\x1b\x27\x6a\x17\x63\x23\xd6\x3a\xf9\xc9\xd8\x65\xd5\x89\x69\x1f\xd7\xfa\x7f\x7d\x90\xdd\xeb\xe4\xf7\x06\x59\x85\xcb\xd6\x07\x0f\x0c\xb2\x9f\xb9\x38\xf7\xa1\x20\x7b\xf0\x4a\xf0\xed\x41\x56\x38\x43\xff\xca\xe1\xa2\x79\x9d\xaf\xd2\x06\x76\xc7\xab\x1a\xee\x36\x25\x3e\xbf\x71\x62\x89\x02\x12\x46\xf5\x61\x7f\x93\xef\x95\x27\x85\xb0\xf2\xb4\x01\xf3\x6a\x90\xd5\x7d\x63\x64\x1b\x74\x5d\x23\xbd\x42\xaf\x29\xda\x66\x6b\xa2\x26\x85\x36\x97\x94\x74\x65\x5d\xb1\x71\x73\xd2\xe2\xb3\xb9\xaa\x90\x4d\x6a\x9b\x4a\x2f\xec\x8e\x2d\x55\xee\xc7\xa4\x35\xd0\xb3\x63\xbe\x60\xe7\xcc\x42\x17\xab\x1b\x7b\x10\xf7\x14\x39\x2e\x41\xd0\x4b\xc7\x7a\x75\x1b\x08\x1b\xc9\xcb\x5b\x49\xaf\xb4\xa2\xac\x0e\xe7\x6a\x24\xeb\xc5\x5a\xb4\x19\xcb\xb6\x81\xa0\xd1\xc8\xdb\x9c\x58\x5e\xd9\xa9\x9f\xf2\x8d\xe3\xc6\x8e\x5f\x1f\x64\xf7\x3a\xf9\xbd\x41\x56\x96\xfa\xee\xf2\x91\xdd\xc5\x9f\xb8\x12\xfb\xb1\x31\xd9\x63\x97\xfd\x3f\xb9\xcb\xf9\x64\x17\xf6\x95\x89\x8f\xdd\x7b\x10\xf2\x2d\xd3\x6c\x1f\x48\xfc\x78\x9f\xbb\x9f\x7b\xbe\x8e\xfa\xb4\x67\xfb\x86\x5c\x37\xda\x9b\xc5\x4c\xcb\x2b\x72\x7f\x11\x33\x4d\xd7\x2f\xe5\xba\x05\xcb\x91\x07\x09\x6c\xc8\xae\x3b\x68\x9a\x1d\x1b\xcc\xc6\x26\x29\x63\x13\x4e\x55\x2d\x37\x6e\x0c\x6b\x41\xb5\x30\xac\x4d\x0a\xda\xc8\xe5\xec\x69\x6a\x1a\x2b\xaa\x0e\xe5\x65\xa7\xd2\x6d\xe2\xc0\x8e\x97\xee\x2e\x28\x12\x12\x11\xae\x90\x93\x23\x93\x59\x70\xb2\xcf\xc5\x75\x5e\x54\x3b\x50\xaa\xa5\x33\x25\x6d\xa4\x63\x9e\xce\xc2\x65\xd0\x4a\x0d\x43\x7c\x46\x76\x39\xe0\x06\x2f\x2b\xf5\x45\xc0\xed\xb8\xdb\x77\xb5\x4f\x36\xa8\xdc\xd0\xea\x97\x83\x63\x5d\xbc\x71\xbd\xb1\xbd\xee\x45\xc0\x3f\xc4\xfe\x1b\xc9\xe6\x23\xf6\xcf\xa7\x4e\xef\xdd\xf2\x71\xd3\x96\xc2\x47\xdb\xff\xc4\xd4\xad\x7c\xb4\x6f\xdc\x62\xbf\x50\x30\xcd\x83\x0f\x54\x54\xb1\xd8\x5c\xf5\x1d\xa8\xd4\xc6\x66\x65\x01\xe7\xa3\x4d\xcc\xe3\x94\x2d\xe1\x5a\xa9\x04\x62\x94\x87\x6c\xcb\xec\x1a\x5e\x32\x3a\x79\x5d\x61\xfe\x18\x70\xcb\x73\xfe\x3e\x96\x90\x1e\xbb\x1f\xe6\xf6\x63\x21\xef\x26\xa4\x9b\x8e\x85\xc0\x4b\x09\xa9\xf8\x6c\xdf\xc8\x4b\x13\xbf\xd2\x63\xe7\x70\x21\x18\xce\x5a\x6c\xd6\xe8\x44\xb3\x98\x4e\x47\x47\xde\x6a\x3e\xd1\x41\x3e\x74\xfb\x51\x23\x11\xdc\x06\xc3\xb3\x86\x35\x19\xb1\x76\xbb\xd3\x75\xa8\x1a\x2e\x08\x68\xca\xd8\x19\xa9\xfd\x55\x32\x32\xe5\x69\x5c\x4d\xc7\xd3\xbc\xbf\x1e\xe7\xe5\xc1\x2e\x69\x2c\xba\xa3\x64\x61\xcb\x49\xcb\x75\xfb\xc3\xd5\xaa\xd2\x0b\x78\xdb\x0a\x87\x24\x9c\xad\x41\xc9\xaf\xf6\xe7\x0b\x52\xa9\x66\x91\x55\x4f\xde\xeb\x01\x7c\x3e\x21\xdd\xd0\x43\x7a\x68\x42\xba\xd3\xfe\x03\x13\xd2\x43\xd6\x72\x5e\x5f\x3f\x6d\x2f\xd6\xbd\x09\xe9\xb3\xf6\x0b\x66\x17\x1c\x94\x57\x7b\x5c\x01\xd0\x51\x83\x97\xd7\x92\x02\x9a\x71\x51\x73\x17\x84\x11\x18\xa6\x2b\x89\x83\x31\xe7\x57\x27\xbe\x64\x08\x68\xa2\xc0\xc5\x49\x55\xdc\x9b\x90\x1e\xbc\x51\xac\x88\xc2\x72\x62\xda\xc1\xa0\x61\xda\xc3\x79\xd2\x9f\x75\x4a\xf9\xc4\x22\x03\xe0\x2b\xbe\x43\xf2\x7a\x45\x73\x7b\xc1\x74\x51\xd0\x47\x58\xfe\x65\x09\xa9\xf0\x6c\xdf\x68\x4e\x5d\xa1\x58\x1d\x95\x5d\xb0\x12\xc6\x33\x79\xc9\x68\x4b\xbe\xc4\xf6\x0b\xfc\xba\xa5\xfb\x4e\x59\x5f\x16\x9c\x15\x90\xea\xa9\x87\xac\xa4\x51\x96\x0b\x74\x59\x90\xeb\x4e\x03\xcb\x79\xb1\x60\x0c\xa7\x68\x06\x65\xe4\xc2\x09\xaf\x96\x54\xcf\x75\xba\xf5\xae\xca\xf0\x2e\xd9\x25\x0d\xb7\x55\x6c\x2f\xb9\xa1\x0a\x61\x53\x2e\xe0\xde\x88\x81\xa9\x5c\x75\xc4\x02\xd3\xec\x36\x57\x89\xa6\x17\xe6\x33\x66\x59\x19\x18\x01\x0a\x9f\x91\x3d\x2a\x21\xdd\x30\xf9\x58\x6e\x1c\xeb\xe2\x8d\xeb\xe3\x09\xe9\x4e\xfb\x0f\x4c\x48\xf7\x2e\xea\xdf\x9b\x90\x1e\x62\xff\x8e\x84\xf4\x59\xfb\xbf\x3c\x21\x3d\x78\x07\xe5\xed\x09\xe9\xca\x32\xda\xa3\x87\x6c\x27\x09\xa9\x56\xf6\x17\xd9\xe9\xa8\x80\x8c\xe1\xd4\xb5\xf5\x79\xbe\xaf\xb6\xed\x91\x96\xb8\x11\xee\x44\xad\xf6\xd2\x8c\x90\x9d\xcb\x47\x75\x85\x15\xa9\x53\xaa\x85\xab\x41\x1d\x67\xd9\x54\x4a\xda\x9a\xbd\xea\x66\x47\xc5\x3e\x5f\x6e\xf5\x84\xa5\x5c\x80\x56\x63\x26\x8b\xd1\x6a\xb5\x92\xb5\x5d\xd2\xa8\xa5\x6d\xbe\xb4\x2e\x56\xf1\xbc\xac\x28\x60\x0a\xcc\x79\x71\x39\x29\xab\x63\x17\x22\x3f\x06\x53\xa3\x56\xef\x24\x8c\x0b\x9a\xf9\xfe\x11\xd9\xdf\x24\x21\x9d\x1c\xba\x3d\xbd\x7e\x5a\x42\x52\x6e\xb7\xff\x43\x76\x19\x7d\x76\xb7\xcb\x2f\xdc\xe5\x24\xcb\x77\x26\xa4\x5f\x3d\x64\x7b\xf0\xd6\xe2\x4f\x16\xe2\x63\x3d\xa4\x7d\xa1\x3e\xe9\xe4\xb7\x25\xb0\x7d\x45\x57\x79\xf1\xb4\xa7\xa0\x3d\xe3\x35\x14\x5c\x1a\xcd\x3c\xb3\x2e\x69\x1c\x14\xf4\x7e\x81\x94\x66\x8e\x19\x85\x2b\xa6\xdd\xc8\xd5\xcb\x89\xe2\xe7\xd9\x91\x8b\xdd\x9a\x51\x52\x5b\x6a\xd1\xa8\x95\xea\x70\x3e\x6e\x93\x4e\x63\x3e\xa7\x5a\x5c\xd7\xd2\x45\x25\x1b\x08\x3a\x67\x65\xa5\x42\x04\x5a\x30\x59\xfa\xc4\x8d\x77\x49\x46\x21\x72\x97\xfa\x55\xbd\xa2\xea\x94\x2f\x07\xc6\xa6\xc6\xb6\xd7\xf9\xee\x54\x98\x93\x76\xb7\xa4\x2b\x03\x55\xb7\x1a\x5e\x7b\xd8\x0f\xe3\x67\x64\x97\x13\xd8\x99\x13\xbc\x91\xc0\x4e\x09\xbf\x61\xcf\xc4\xdd\x3d\xaa\x07\xda\xbf\xad\x47\x75\xbe\x5d\xef\x6f\x17\xc0\xf2\xcb\xed\xab\x3f\x1d\xdf\x22\x5a\xba\x77\x27\x98\x07\xef\xa1\xff\x64\xb7\xed\x33\x09\xe6\x93\xf3\x0c\xf7\xbc\x5a\xe4\xb8\x32\xb0\xbb\x4a\xcf\x78\x0d\x75\x9c\x6f\xcb\xe9\xb4\x42\xa4\xa4\x35\x2f\xba\xd9\xc6\xc4\xb4\x2a\xcd\x0d\x17\x4e\x5b\xc6\xa0\x4b\x17\x6b\xc5\x59\x80\xaa\x3c\x9d\x5b\xfd\x22\xbf\x6e\x5a\xb3\x16\xc8\xb7\xf8\x50\xf0\x23\xcf\x6f\xf9\x62\x83\x33\xc3\x56\xbe\xa8\xcb\x1d\x23\xcf\xb1\xf5\x46\x8f\x14\x36\xb6\xb1\xdc\x25\x01\x7b\x63\x2d\xd3\x62\x40\x55\xd8\x9e\x0a\xfd\x6c\x7d\xd8\xf6\xbb\x93\xf1\x38\x52\x97\xc6\x48\xcc\x2d\xa3\x85\xd6\x90\x47\x4d\x9d\xb8\x85\xe3\x4a\xc9\xa3\x12\xcc\x0d\x3b\x1f\x1f\x9a\x60\xee\xb4\xff\xc0\x04\xf3\x77\x9a\x43\x91\x2f\x24\x98\x9f\x88\x4f\x4d\xf1\xfa\xfe\x04\xf3\xe0\xc3\x22\xb7\x27\x98\x2b\x43\xaa\xdb\x7a\x30\x77\x24\x98\xb3\x1e\xcc\x49\x82\x69\xe8\x95\xf6\x54\x35\x7c\xa9\x1b\xcd\xd9\x74\x1c\x2c\x56\xc3\x71\x71\xce\x6f\xca\x46\x40\x9a\x9d\x99\xb8\x98\x72\xb1\xa2\x70\x2d\xcc\xd5\xba\x01\x2e\x0d\x54\x3c\x69\xf5\x3b\x85\xd0\x98\xea\x05\x39\x42\x09\x08\xcb\x4b\x3b\xdf\x8e\xf9\x4e\x59\xac\x21\x93\x16\xdd\xbc\x65\xec\x57\xcd\x24\xb0\x31\xdb\xb2\x6a\xd6\xc5\x7c\x92\xdb\xf4\x6b\x2d\xae\x91\xf5\xf2\xcb\x64\xb8\x5c\xb6\xba\xd8\x8c\x67\xb9\x69\xcb\x1e\xc0\x92\x61\xbe\xb7\x75\xf8\xa7\x27\x98\x9b\x02\xfc\x81\xf6\x5f\x0f\x39\x3e\x60\xff\x41\x3d\x98\x9f\x9c\x60\x7e\x26\xbe\x87\xf4\x60\x1e\x7c\x2a\xea\xf6\x21\xd2\xbb\x09\xe6\x93\x4b\xb7\xf7\x0c\x91\xce\x7a\x30\x27\x43\xa4\x22\x37\x15\x26\x8a\x3c\x47\x78\xbe\x68\xb3\x76\xae\xd4\x49\x06\x44\xa8\xca\x58\x98\xb5\xbb\x9e\xd7\xe0\x2a\xeb\x4a\xd9\x9a\xfb\xb1\xea\x2e\xc8\xa4\xa8\xb0\xb6\x35\x22\x51\x28\x25\x64\xa1\x0c\x4b\xce\x72\xde\x31\xb3\xde\x64\x21\x96\x7c\x71\xe8\x60\x1e\x4e\x06\xcd\x89\xb1\x5f\x05\x5b\x77\xb2\xf2\x30\x10\x21\x84\x8a\x17\xc4\x2a\x9d\x2e\xc4\x8d\xdb\x6b\x55\xd6\x8a\x37\xd9\xcc\x4b\x55\xab\x11\x5b\x9b\xd8\xca\x89\x85\xe3\x86\x8b\xbf\xc9\x10\xe9\xee\x04\x73\xa7\xfd\x07\x26\x98\xbf\xd3\xb2\xb4\x7c\x21\xc1\xfc\x44\x7c\x8f\xe9\xc1\x3c\xf8\xf8\xdf\xed\x93\xc2\x57\xb6\x7d\xef\x5f\xb3\x75\x7b\xc2\xb8\x37\x8b\x9f\xe0\xb9\x38\x19\x77\x32\xc9\x5c\x98\xf6\x97\x38\xf4\x85\xf5\xb4\xdd\xb1\xd7\xb8\x21\xcc\xeb\x35\x81\x1b\x64\xcb\xdd\x89\xcc\x86\x20\x25\x42\x8f\x2d\x6c\xf2\xd3\x89\x49\xd9\x98\x6c\x82\x5a\x0d\x67\x5b\xe2\xc8\xec\x58\xd3\x06\x9a\x1a\x7c\xb6\x40\x3a\x35\x34\xd6\xa3\x9e\x31\x5f\xcd\x0b\x85\xa1\xd5\x98\xc8\xfb\x21\x54\xd2\x16\x7b\x39\xc1\xaf\xe5\x4b\xdc\x26\x25\xd5\xb8\xa6\xbb\x6a\xad\x06\x83\x12\xd7\xdb\xb4\x54\x36\xad\x16\xd6\x9c\x55\x62\xea\xa3\xc2\xb1\xf7\x75\x39\x01\x5d\x7e\xfd\xcf\x67\x27\x72\x8f\x7c\xdc\xe1\xc4\xb7\xfd\x18\xe2\xde\x0b\xb2\x4f\x27\x54\x2e\xaf\xe4\xbc\x99\x58\x8d\xdb\xcb\xdc\x40\x91\xce\xc8\xf2\xcb\xc4\xf6\x6a\x83\xdd\x3b\x89\xf5\x71\xf6\xd5\x9b\xec\x1f\x27\xcf\x1f\x78\x44\xf6\xd5\x2b\x7b\xf6\xd7\x4f\x3b\xa2\xfb\x6a\xff\xd6\x3b\xf6\x4f\x8e\x86\xff\xed\xe6\xb6\xce\xf8\xf9\xfb\xe0\x7b\x15\x63\xc7\x18\x3c\xb9\x96\x47\xd0\xbb\xcf\x9f\x6c\x13\xee\xce\x09\xa5\xb3\x85\xc0\x73\x1f\xd8\x7d\xee\xfe\xcd\xf0\x69\x6f\xf3\x79\x76\xe5\x8f\xf9\xec\x7f\x5e\xce\x7e\xbf\xc3\xf2\xe0\x73\xf3\xff\xbc\xfe\xf9\x17\xbf\xfe\x79\x3f\x02\x2a\xb5\x67\x55\xb4\x6e\x2d\x87\x03\x29\x64\x19\x35\x15\x67\xbc\x1b\x6d\xb2\x83\x7e\xa3\x58\xed\x2b\xc5\xa6\x0c\x06\xb6\x51\x6b\x49\xcb\xd9\x7b\x9d\x1b\xfd\xcc\xd1\x3f\xdd\xb0\x1c\xf5\x3d\x84\xcb\x7b\x3a\x9f\xfb\x9f\xf5\x96\x7f\xee\xe8\xfa\xe8\x7b\xd7\x46\xa7\x27\x9d\x8e\x5b\xf6\x48\xde\xbb\x03\xe1\x81\xf6\x6f\xda\x81\xa0\x9c\xbf\x5f\xe6\x6f\x37\xfa\x93\x5f\xbe\x8f\xe3\x67\xe3\xd3\x8a\xc6\x7c\xf9\x1e\xbe\x73\xfe\xfe\x4e\xf3\xff\x97\xf8\xfb\x99\xf8\x7a\x13\xde\xf8\x10\x7f\xfb\x4e\xe2\xfe\x37\x88\x7f\x45\xae\x7b\xcc\x52\x81\x71\xa9\x7c\x47\x7c\xf9\xe3\x0e\x99\xff\x76\x9d\x9e\x63\x5b\xf0\xc6\x96\x43\xf9\xa9\xd3\xfc\xdf\xb2\x53\x7a\x52\x3f\x3f\x7d\xa9\xa9\xc5\xe1\x9a\xec\x3c\x23\x17\xe5\xb3\xf6\xe4\xa4\x2d\xbb\x74\x9d\xc4\xcf\x7f\xb7\x41\xd6\x0e\xef\xe0\x76\x7f\xb9\xb7\x6f\x73\xc5\x5f\x4e\xae\x73\xfe\xaf\xbd\xa3\xe9\xf0\xb3\x53\x8f\x78\x51\xd3\x4b\x55\xcf\x63\x87\xd3\x37\x2d\xed\xf0\xc6\xc7\xfe\xcd\x85\xd9\xd2\xb7\xb5\x3c\xef\x08\x59\xca\x4d\x63\x22\xbf\xd2\xf2\x54\xc2\x7d\xc1\x30\x21\x61\x1a\x24\xbb\x9f\x92\x3a\xf9\xfb\xfb\x6c\x42\x9f\x8b\xa9\x34\xea\xed\x4e\x4b\xd6\xeb\x9d\x77\x8a\x29\x57\x3b\x5a\xeb\xc0\x4a\xa3\x5e\x1d\x9c\x6a\xdc\xfd\xbe\x95\xac\xaa\x27\xda\x5e\x19\xcc\x34\x5b\x7a\x4d\x6e\x0d\x32\x15\x6d\x90\xf9\xfd\x70\xd7\xb3\xbf\x65\xb6\x12\x01\xf6\xe9\x5b\xf0\xe3\xe7\x3f\x1e\x0b\x3c\xbe\x82\x3a\xbe\x06\xf9\x15\x50\x0b\x07\xdb\xff\x1e\x04\xcf\xc2\xc1\x25\x64\x4f\x06\x5e\x82\x0a\x42\x9b\x5e\x40\xb4\xff\x3d\xb5\x11\xc5\x36\x8d\xe2\x97\x9f\xbe\xef\x3f\xc5\x74\xfe\xfd\x21\x70\x5f\x28\xbf\x04\xfc\x8a\xf5\x4c\xb7\xae\x1b\x5d\x2d\xf3\xfb\xf3\xb7\x9f\x2a\xc9\x63\xf8\xfe\x64\x01\x5e\xd7\xc1\xe1\x3e\x8e\x47\xaf\xd0\x87\x8e\xb3\x85\xbd\xff\xdf\x83\xf0\xee\x95\x5d\x02\x7a\x62\xe6\x25\xc2\xdd\x8d\x0b\x6e\x32\xa3\x5b\x74\xbb\x7f\x1f\x04\x6e\xa7\xeb\x12\xb6\xa3\x91\x97\xd0\xbc\xd9\xb7\xcc\x2c\x8c\x92\xd7\xd8\xb6\xf6\xe2\xd1\x3c\xa5\x29\x7d\xf1\xe1\x51\x48\x4f\x54\x5e\x04\x7c\x6e\xf2\x52\xa5\x5f\x42\x1d\xa7\xd6\xe1\x7f\x8f\x43\x1a\xa7\xd6\x1b\x18\x9f\xcc\xbc\x44\x17\xd1\xf8\x42\x75\xcf\xd3\x30\x4a\x7d\x2f\x70\xc2\x93\x3f\x1f\x04\xf2\xa8\xf0\x12\xd0\x33\x73\x1f\xca\x61\x31\x99\xed\x1f\x8b\x4f\xfe\x7c\x10\xda\xa3\xc2\x4b\x68\xcf\xcc\xbd\x44\x3b\x8f\x69\x72\x31\xd6\x4f\x7e\xcc\xf1\xf8\xe7\xa3\xf0\x3e\x2b\xbc\x88\xf7\xa5\xb9\x97\x78\x77\xdf\x5f\x6c\x5f\x4f\x7e\xd8\xe9\xf8\xe7\x83\x00\x1f\x15\x5e\x02\x7c\x66\xee\xcd\xae\x81\x17\xc7\x29\x8d\xbe\x65\x70\x1c\xd3\x84\x84\xf6\x85\x32\x9c\xbe\xe2\xf4\xf4\xc3\xa3\xca\x71\xa2\xf2\x62\x49\xce\x4d\x5e\xca\x12\x31\x9d\x7f\xcb\x24\x2b\x2f\xb0\xe9\xea\x42\x09\x8e\xf0\x1f\x8d\xfd\x2a\xf0\xbb\x50\x9f\x75\x51\x5f\x7e\x7c\x10\xfe\x97\x4a\x2f\x15\xe2\x82\xd9\x37\x4b\x72\x90\xbd\x5c\x9c\x83\xcf\x59\x78\x8a\x03\x72\xfc\xb9\x3e\xbd\xae\x6a\xfd\x77\x60\x2b\x2d\x4d\xee\x68\x7b\xd1\x73\x3d\x99\x46\xfd\xd8\x8b\xed\xb6\xf5\x7a\x31\x63\x25\x11\xa5\x99\xdf\x0f\x12\xff\xca\xf4\x4a\x5a\x4b\x7b\xfe\x9c\xf9\xaf\xbf\x8e\xbf\x58\x06\x5e\x77\x34\x69\x9c\xec\xdb\xf2\x6d\x29\x6e\x46\xf9\x52\xcd\x16\xe4\xa1\x9f\xf2\x02\x62\x4c\xa7\x53\x2f\x70\x77\xb1\xf7\x2d\x63\xa5\xeb\xe3\x87\x59\xe4\x91\xd7\xb1\xb8\xad\x06\x6b\x1d\xd3\xf9\xcd\xc0\x9e\x35\x6c\x31\x1d\x03\xe3\x05\xac\xb7\xbb\x8a\x5b\x71\x87\xd2\xfb\x21\x3c\x29\xd9\xa3\x38\x49\x30\x1f\x04\x72\xb8\x73\x1f\x90\x53\x25\x5b\x20\x2f\x3b\xc2\x1f\x44\x12\x93\x19\x0d\x16\x77\x22\x39\x55\xb2\x45\x12\x93\xd9\x27\x09\x39\x36\xa8\x77\x23\x39\xd5\x73\x00\xf3\xd4\x4b\x78\x09\x06\xc7\xc9\xdb\x80\x4e\x12\xc7\x7d\x88\xce\x15\x6d\x21\x9d\xe5\xc6\x77\x39\x6a\x86\x71\xe2\x46\xb4\x6d\x54\x33\x4f\xbf\x03\x9e\xb1\x53\x7f\x96\x21\xa1\x3f\x9b\xd2\x84\xee\xcc\xfe\xff\x01\x00\x00\xff\xff\x73\x11\x8c\x9e\x54\xcc\x00\x00") func pathed_paymentCoreSqlBytes() ([]byte, error) { @@ -1210,126 +532,6 @@ func paths_strict_sendHorizonSql() (*asset, error) { return a, nil } -var _self_sendCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\x9b\xca\x92\xf6\x77\xff\x0a\xc2\x5f\xda\x0e\xb5\x4f\x03\xc5\x6a\xbf\xbe\x11\x5a\x5b\x2b\xda\xd7\x37\x26\x3a\x0a\x28\x24\x24\x36\xb1\x68\x9b\xb8\xff\x7d\x02\xd0\x02\x08\xa9\xd5\x52\x9f\x7b\xef\xc4\x98\x0f\x3e\x36\x95\x7a\xea\xa9\xac\xcc\xac\xaa\x04\xf2\xfc\xf8\xf1\xe5\xc7\x0f\xac\x65\x3a\xee\xd4\x46\xdd\x76\x1d\x93\xa1\x0b\x45\xe8\x20\x4c\xf6\x74\xeb\xcb\x8f\x1f\x5f\xfc\xf6\x82\xa7\x5b\x48\xc6\x14\xdb\xd4\x4f\x02\x2b\x64\x3b\xaa\x69\x60\xfc\x5f\xcc\x5f\x44\x44\x4a\xdc\x62\xd6\xf4\xcd\xff\x79\x42\xe4\x4b\xb7\xd8\xc3\x1c\x17\xba\x48\x47\x86\xfb\xe6\xaa\x3a\x32\x3d\x17\xfb\x8d\xe1\xbf\x82\x26\xcd\x94\x16\xe7\x77\x55\x59\x43\x6f\xaa\xf1\xe6\xda\xd0\x70\xa0\xe4\xaa\xa6\xf1\xe6\x20\xc7\xc7\x3d\x17\x96\x34\xd5\x87\x46\x86\x64\xca\xaa\x31\xc5\x7e\x63\x4f\xfd\x5e\x89\x7b\xfa\x75\xe8\xdb\x90\xa1\x2d\xbf\x49\xa6\xa1\x98\xb6\xae\x1a\xd3\x37\xc7\xb5\x55\x63\xea\x60\xbf\x31\xd3\xd8\x63\xcc\x90\xb4\x78\x53\x3c\x23\xec\x4b\x34\x65\x15\xf9\xed\x0a\xd4\x1c\x14\xeb\x46\x57\x8d\x37\x1d\x39\x0e\x9c\x06\x02\x6b\x68\x1b\xaa\x31\x0d\x45\x6c\x73\xfd\xe6\x20\xc9\xb3\x55\x77\xeb\x83\x2b\xca\xaf\xbd\x02\x10\xb4\xa5\xd9\x9b\x05\xdd\x19\xf6\x1b\xb3\x3c\x51\x53\xa5\x67\x5f\x63\x12\x74\xa1\x66\x4e\x7f\x7d\xf9\x52\xe8\x34\x5b\x58\x45\x28\x14\x47\x58\xa5\x84\x15\x47\x95\x6e\xaf\xbb\x97\xfc\xcb\xb3\xa6\x36\x94\xd1\x4c\x75\x5c\x71\xeb\xa0\xe5\xaf\xab\xd2\x8e\x64\x2d\x3d\xd3\xf6\x74\xe7\x36\x61\x64\xac\x6e\x91\xd4\x90\x3c\x45\xf6\x2d\x92\x3e\x4f\x05\xa1\x1b\x25\x6f\x10\x13\x91\xe3\x9a\x8a\x82\x6c\xd5\x90\xd1\xe6\xba\x2c\x94\x24\xd3\x33\x5c\x11\x6a\xd0\x90\x90\xf3\xeb\x4b\xb6\xde\x2b\x76\xb0\x5e\x36\x57\x2f\x46\xa4\x9b\x42\x7d\x9c\xa2\x5e\xd3\xde\x62\x01\x7a\xbe\x29\x74\x7b\x9d\x6c\x45\xe8\x45\x7e\x14\x17\x7c\xb3\x16\x68\x7b\x0b\xbe\xbb\x79\x1f\xfa\x28\xf3\x01\x54\x05\xdd\xc0\x39\x2a\x76\x3b\xb6\xed\x39\xae\xa6\x1a\xc8\xb9\x86\x7c\x14\xba\x19\xd7\x67\x81\x82\x68\x70\x05\xf7\x24\x74\x3b\xee\xd1\xe4\xaf\xe1\x1e\x85\x6e\xc6\x0d\xe5\x55\x43\x31\xaf\xe0\x9e\x84\x6e\xc6\xb5\x3c\xd1\xf1\xc4\x2b\x98\xa1\xc0\x47\xf0\x34\xd5\x99\x2d\x3d\xe4\x5d\xd3\x6c\x54\xec\x76\x6c\x84\xec\x6b\x6a\x0d\xda\x6f\x46\x0b\xdc\xf8\x1a\x5c\x28\x70\x33\x5e\x18\x95\x66\x08\xca\xd7\x61\x63\x72\x7f\x33\xfa\x3e\x52\xa2\xe5\xdb\x8d\xdd\x88\xd0\xb8\x02\x2e\x42\xe3\x66\xc2\xfb\xe8\x77\x8d\xeb\x41\xe4\xa3\x98\xfe\x1e\xe0\x7d\x58\x5f\x6a\x8f\x1c\xc8\x26\x81\x53\x43\xee\x75\xd9\x63\x68\x7c\x4f\xec\x14\xe8\xde\x91\x3c\x06\xae\xeb\x72\xa7\x40\xf4\x8e\xdc\x31\xb0\xbc\x2b\x77\x13\xbf\x53\x40\xb9\x2e\x17\x06\x89\x77\x65\x8e\x2e\xff\x8e\xa4\xef\xc7\xd7\x45\x42\xdf\xbc\x2e\x13\x73\x85\xeb\xa2\x22\x34\xae\x0b\x1c\x4c\xf5\x26\x29\xdf\xf2\xf6\x82\xc5\x51\xaf\x28\x74\x2b\x4d\x21\x2a\xac\x59\x53\x67\xa9\xed\x25\xba\xf9\x72\xb1\x91\x3d\xc3\xfa\xf5\x25\xdc\x1b\x0b\x50\x47\x3f\x0f\xf7\xb0\xde\xd6\x42\x3f\xf7\x3f\xf9\x85\x75\xa5\x19\xd2\xe1\x4f\xec\xc7\x2f\xac\xb9\x36\x90\xfd\x13\xfb\x11\x6c\x99\xf3\x9d\x62\xb6\x57\x3c\x20\x1f\xf0\xbe\xc4\x10\xe3\x8d\x7b\xe0\x7c\xb3\xd1\x28\x0a\xbd\x2b\xc8\xa1\x00\xd6\x14\xe2\x00\x58\xa5\x8b\x3d\x1d\xf6\xb7\x87\x7b\x4e\x00\xf2\x94\xec\xf9\x30\xfc\x7d\x9f\x47\x0d\xbd\x3b\x9e\x98\x2e\x85\x66\x2f\xa1\x4f\x6c\x58\xe9\x95\x8f\xb4\xa2\x1b\xda\x58\xf7\x27\x94\x04\x91\x8f\x0c\xfe\x0c\x24\x50\x40\xab\xfe\x62\x4d\xfd\x53\x8c\x65\x9b\x12\x92\x3d\x1b\x6a\x98\x06\x8d\xa9\x07\xa7\x28\x50\xc3\x8d\x1b\x70\x5f\x4c\x46\x0a\xf4\x34\xf7\xcd\x85\xa2\x86\x1c\x0b\x4a\xc8\x3f\x4d\x3c\x25\x5a\xd7\xaa\x3b\x7b\x33\x55\x39\x72\x40\x88\x0d\x36\x6a\x90\xfb\x61\x06\xa6\x7b\x1a\xe4\xc1\x00\xd2\x14\x1e\x5a\x79\x34\xe8\x7e\xfb\x82\x61\xd8\xe1\x8e\x2a\x63\xd2\x0c\xda\x50\x72\x91\x8d\xad\xa0\xbd\x55\x8d\xe9\x37\x9a\xf9\x1e\xcc\x8d\xd0\xaf\xd7\x9f\x03\x69\xff\x87\x06\xd4\x51\x8a\x30\xc7\xa5\x09\xaf\xa0\xe6\xa5\x49\x13\x04\x99\x14\xd7\xa0\xe3\xea\xa6\xac\x2a\x2a\x92\x31\xd5\x70\xd1\x14\xd9\x47\x91\x2f\xdf\x93\x73\x7f\xf4\xe2\x07\x75\xe1\xdc\xa5\x88\xfd\x41\x00\x13\xd5\xa9\x6a\xb8\x89\x46\x07\x2d\x0d\x4f\x4f\x6f\x33\x3c\xdd\xf1\x44\x64\xb8\xb6\x7f\x14\x4c\x0e\x33\x94\x51\x0d\x45\x83\xfe\x89\x51\x46\x8e\x9b\x4e\x27\x14\x9c\x99\x3a\x92\x4d\x1d\xaa\x46\x8a\x14\x45\x25\x49\xbb\x33\x1b\x39\x33\x53\x93\x1d\xcc\x45\x9b\x24\x33\x45\x83\xd3\x4b\x8c\xae\xce\xcd\x5e\x23\x9e\xdf\xab\xa6\x42\x51\xd5\x54\xd7\x1f\x5c\x38\xfe\x83\x4a\x34\xed\x5a\xb3\x3a\x35\xfc\xbd\x90\x4f\x2b\xbc\x13\xd9\x0d\x1c\xb7\x16\x7b\xa5\xbf\x05\xc7\x6a\x2c\x5f\x2e\xe6\x6b\xd8\xb7\x6f\x87\xa9\xf8\xc7\x6f\x0c\xff\xfe\xfd\xca\xaf\x93\x04\x93\x38\x67\x03\x78\x0f\x31\x36\x97\x09\xb4\xf8\x3c\xbf\x87\x74\xae\x9e\x04\x5c\x8a\xfe\x42\xcc\x73\xc7\xf0\xd7\xbf\x7b\x7d\xc2\xdf\x32\x86\xee\x60\x98\x32\x8a\xfa\x42\xcc\x07\xce\x3b\x8d\xaf\xcf\xf7\x76\x1f\xdf\x18\x87\x44\xf6\xf7\xa0\x33\x8b\x90\x61\xce\x6c\xdb\xb2\xd1\xea\x5d\x21\xd1\x93\x16\xc8\xd5\x54\xc7\x7d\x57\xf4\xb8\xdb\x3e\x98\x7b\x78\x5b\xd2\x4c\x07\xb9\xaa\x7e\xc1\xf3\x83\xc0\x9a\xe2\x5b\x91\x39\x8f\x6f\xea\x8f\x78\x89\xf9\x3e\xf5\x73\xc1\x74\x2e\x9d\x0d\xe2\x30\xa7\x51\x5c\xb2\x96\xfd\xe6\xeb\xde\x19\xdb\x1f\xbc\xbe\x1d\x9d\x1c\xd9\x37\x46\xd0\x30\xf3\x22\x5f\x8a\xa0\x81\xb9\x43\xc7\x41\x6e\x9a\x3e\x43\x5f\xbd\xd8\x0c\x75\xdf\xad\xd2\xa1\x2d\x5b\x95\x90\x71\x21\x88\x05\x8d\x97\x22\x5c\xd0\x88\xc9\xa6\x27\x6a\xc8\xb7\x37\x49\x0d\x32\x92\x9f\x1a\x45\x23\x33\xbc\x3f\xb2\x86\x63\x49\xcc\xeb\x7e\x80\x17\x6c\x63\xff\xcb\xbd\x86\x13\x3f\x3d\xe8\xfd\x92\x41\x84\x1b\xf6\x7b\xed\x21\x3c\xd6\x87\xe6\xa0\x5a\x69\x0b\x3f\x7d\xe6\xb9\xa6\xed\x1e\xb5\x51\x28\x96\xb2\xfd\x7a\x0f\xc3\x93\xcb\x26\xda\xb8\xd0\x75\x91\x6e\xb9\x98\xef\x16\x8e\x0b\x75\x0b\xf3\xb7\x4c\xa6\x17\xde\xc1\x76\xa6\x81\xce\x17\x5b\x05\xaa\x9a\x67\x47\x96\xda\x4b\x3d\xb8\x5b\x0b\xbd\x3f\x29\x61\x5a\x22\x82\x7b\x1e\xf6\x8f\x3d\x5e\x98\x9d\x7d\x66\xc3\xb4\x93\x93\xfa\x2d\xd0\xc4\x3f\x30\xfc\x3b\x96\x15\x0a\x58\xf8\xcf\xff\xf7\x1b\x63\x68\x1a\xd0\xdf\x53\xe7\x2a\x7a\x0c\xbb\x7b\xca\xa2\x59\x9e\x68\xcc\xbd\xa0\x8d\x30\xd1\xe6\x7b\x5d\x2a\x21\xff\xec\xf8\x00\x15\xc7\x13\xf7\x24\x6c\xe4\xc4\x16\x20\x90\xba\x63\xb4\x11\x3c\xfa\xd2\x39\x9f\xc8\x99\xf7\x5e\x4e\x91\x64\xdd\x0d\x2b\x63\x48\x6c\xe9\xa0\x6b\x2b\xcc\x39\xcf\xc8\x19\xfe\x5e\x9e\x27\x88\xdb\x79\x9e\x2d\x72\x89\x76\x64\xac\x90\x66\x5a\xe8\x9d\x25\xed\xd4\xf5\x03\x0b\x51\x24\xdd\xf1\x80\x0a\x0e\xf9\xda\x6f\xb7\xcc\xc3\xc9\x8a\xde\x53\xc4\xf2\xc2\x42\x13\x57\xc2\x21\x0f\x1c\x43\x4c\x2a\x22\xd6\xdb\x45\x65\x9c\x72\x44\x77\x2b\xe3\x94\x14\xff\x76\xf2\xdb\xf8\xe1\x2d\xc5\xa7\xae\x79\x77\x24\xc3\x75\x2f\xab\xc8\x23\x80\x7b\x8e\x5d\xc1\x8a\x7f\x25\x52\xab\x8e\xe3\x21\xfb\x76\x28\xc9\x94\x53\x4f\xa7\x67\x6a\x71\x35\x55\x57\x2f\xec\x28\xae\x9e\x05\xff\x9d\xa7\xaa\x88\x75\x46\x9e\xaa\xdc\x75\x8a\x8a\xfe\xfe\xb3\xce\x51\x11\xcc\xfb\xcf\x3f\xd7\x50\xc3\x49\x4b\x20\xed\x67\xf2\x1f\xe9\x8e\x17\x4b\xf7\xde\x6d\xe4\xd1\x67\x68\xa1\x99\xbb\x9b\x58\x28\xbe\xe1\xbc\x91\x34\xc0\x4d\xf0\x94\xf2\x62\xab\x34\x83\xc6\x14\xa5\x1e\xec\xa3\xca\x89\x3e\xb6\xbb\x3f\x56\x9f\x72\xe7\xf7\xab\xe8\x5f\xac\x1f\xd1\x94\xb7\x69\xca\x71\x37\x36\x72\x3c\x2d\x35\xba\xbb\x1b\x1d\xbd\x7b\x9e\x3b\x3d\x62\xbd\x5f\x9f\x89\xe7\x16\xf7\x2a\x35\xf1\xc4\xf9\xdb\x4d\x8a\xdb\xff\xe8\x9a\xf6\xf6\x22\x69\x8a\xb8\xcd\xec\x12\x4f\xb8\xef\x51\x54\xc1\x3f\x59\x2b\xa6\xfd\x4e\x32\x14\x2b\x64\x7b\xd9\x77\x74\x76\x1d\xd2\xf9\x30\x5e\x45\xe8\x16\x3b\x3d\xac\x22\xf4\x9a\xa7\xa4\xe2\x20\x5b\xef\x17\xbb\xd8\xb7\xa7\xd7\x5c\xa7\x35\x2e\x57\xea\x64\xbe\x02\x4a\x42\x9b\xca\x8d\xea\xa5\x86\x50\xa8\x97\xaa\x7d\xa1\xd5\x27\xcb\x63\x30\x69\x94\xba\xe5\xa6\xd0\xcf\x17\x9b\xd9\xee\x90\x6d\xe7\xd9\xe6\x88\x2c\x3f\x3d\x63\xfc\xfe\xe2\xf6\xff\xc5\xf1\x67\x8c\x78\xc6\xf0\xe7\x50\xcb\xd8\xd3\xd3\x33\xf6\x94\x6d\x67\xb3\xd9\xec\xef\xdf\x4f\x41\x03\x79\x68\x3b\xfd\xf9\xfd\xd7\x7b\x0c\xf3\xa3\xda\x2b\xd3\x11\xa8\xa6\x50\x29\xb6\xf2\x0d\xa1\x94\x63\x01\x99\xa5\x00\x33\xa1\x5b\x42\xa1\xdb\xa9\xbf\x0e\x6b\xec\x6b\xae\x9e\x6f\xb4\xeb\x95\x52\x93\xea\xb2\xc5\xf1\x70\xd0\x3f\x31\xf4\x89\x71\x34\xc7\xf3\x80\xa2\x79\x70\x9d\x21\x48\x65\x78\x61\x4e\x92\xb9\xac\x07\xa6\xf7\x72\x86\xea\xa3\x73\x1c\xcf\x52\x1d\xd5\xc8\x00\x99\xe7\x14\x1a\x30\x08\x31\x9c\x4c\x88\x24\x2b\xd2\x22\xc7\x2b\x24\x80\x0a\x0d\x08\x42\x64\x69\x86\x87\x24\xa5\x40\x85\xa0\x70\x00\x65\x5c\xa4\x49\x91\x01\x40\xc4\x59\x11\xf1\xbc\xaf\x2a\xfc\xc1\xcb\xc7\xa0\x59\x12\x92\x08\x90\x8a\x42\x52\x1c\xc4\x59\x11\x47\x2c\xae\xc8\x84\xc2\xc8\x80\xe0\x24\x42\x81\x92\x4c\xe2\x22\x23\x49\x38\x27\x01\x20\xd3\x2c\x4b\x93\x34\xcf\x31\x1c\x41\xd2\x90\x60\x9e\x0e\x46\xf6\x94\xfd\x8f\xbd\x72\xa3\x9a\x4a\x6d\x5f\xb6\xdd\x5a\x8e\x2d\x18\x05\xbe\x4c\xe2\x9b\x79\x2e\xe3\xe0\x53\xd7\x59\x57\xd6\x3b\x62\x24\x77\x87\x63\x98\xab\xc2\xd2\xd4\x97\x2f\x0a\x54\x1d\xee\x2c\xb2\xfd\x2e\xf2\x24\x3b\x22\xa8\x40\x2c\xb7\xf8\x17\x0c\xe4\x53\xaf\xa7\x84\xab\x5f\x30\x54\x16\xa7\x19\x5a\x12\x25\x59\xc4\x59\x08\x28\x96\x82\x8a\x88\x8b\x32\x8d\x4b\x12\xaf\xd0\x80\xa5\x78\xc8\x40\x11\xa7\x29\x51\x52\x14\xc0\x41\x24\x2a\x94\x48\x40\x06\x67\x18\x46\x42\xd0\x37\x90\x4f\x31\x76\x99\x16\x45\x1a\xd2\xbc\x84\x10\xc3\x2a\x14\x2b\x43\x9e\x17\x29\x20\x01\x19\x00\xc0\xd2\x84\x0c\x24\x0e\xb0\x04\xc7\x52\x24\x87\x68\x4e\xe2\x78\x1a\x2a\x38\xc1\x70\x32\x4e\xb2\x08\xf7\x79\x90\xcf\x18\x41\xd3\x3c\xcd\xf2\x2c\xcd\xed\x2d\x36\x4f\xb6\x26\x73\x42\xf0\x68\x13\x17\xab\xec\x90\x32\xb6\xcd\x55\x7f\xf3\x0a\x06\x96\xb9\xc8\xac\x4a\xd9\xa6\x9b\x27\x6a\x64\x83\xcd\xb1\xcc\xc4\x2c\xf7\xfb\xcb\x56\x93\xe8\x9a\xa3\x61\xae\x3d\x54\xdb\x06\x62\x32\xd9\xb2\xd4\xc0\xf3\x83\x9a\x3b\x15\x5e\x76\x45\x7d\x05\x0b\x45\x9c\x0a\x35\x3c\x6a\x0d\x1a\x62\x60\x51\x95\xe3\x1f\x61\x78\x73\x4e\xff\x5e\x67\x5b\xed\xbd\xed\x14\xdd\xe9\x56\x35\x8c\x8a\xe3\x0c\x69\x37\x87\x44\xf2\xc5\x15\x26\x39\x8b\xb0\xdd\xbc\x58\x59\xc9\x26\xe4\x17\xf9\x97\x02\xaf\x4f\xeb\xbb\x81\x47\x58\x93\x9d\x37\x79\xe9\xf0\xcb\x89\x5b\x58\xf3\x8d\x9d\xdc\xc1\xb9\x29\x78\x2d\xb7\x4d\x7a\xbc\xad\x0e\x57\xd9\xe1\xbc\x5d\xcd\xe4\xc2\xfe\x53\x2c\x3a\xdd\x62\x0f\x16\x5d\xc0\xab\x7f\x9f\xe9\xfd\x4d\xd7\x8d\x16\x0d\x00\xe2\x38\x5a\x66\x14\x8e\x43\x24\x41\x20\x11\xe7\x39\x59\x94\x70\x5a\xa6\x24\x05\x40\x9a\x91\x78\x52\xe1\x68\x06\x00\x05\x87\x34\x81\x58\x91\xe0\x64\x11\x00\x85\x96\x69\x0e\x01\xca\xb7\xc6\xcf\xf0\x0a\x8e\x25\x64\x9c\x21\x38\x24\x92\x8c\x4c\xf0\x34\xe2\x15\x46\xc2\x01\x20\x79\x82\x06\x32\x47\xe2\x12\x4e\xd2\x50\x92\x64\x89\x40\x90\x63\x24\x8a\xe2\x08\x12\x70\x04\x4e\x8b\x0a\x23\xb1\x3e\x06\x88\x58\x34\x7f\xb0\x68\x90\x1b\x8e\xea\x3b\x31\xc7\x08\xe5\xee\xca\xa9\x13\xed\x5d\x95\xef\xc9\x55\x6b\xe9\x94\xba\xdc\xcb\x4e\xf5\x56\xb8\x03\xc7\xaf\x13\x87\xd1\x19\xb6\xa5\xcc\xd7\x99\x62\x8d\x6a\x36\x46\x7d\x6e\xdd\xd0\x4c\x73\xd3\xf7\xe6\x8b\x8a\x55\x52\x95\xbc\x69\x6a\xb9\xdd\xa4\xb6\xf3\x18\xae\x18\x68\x38\xb0\xe8\xf5\x49\xe3\xe5\x75\x59\x70\xf4\xce\x38\x33\xc0\xe9\x0e\xd7\x96\x36\xbb\x3a\xb3\xe5\x5a\x53\x5a\xe4\x6a\xf4\xa8\x95\x77\x1d\xce\x54\x18\xd0\x2e\x15\x96\xe5\x72\x7b\x3c\x66\xb6\x62\x47\x43\x06\xb9\x2e\x34\xac\x52\x8f\xcc\x17\xb2\x55\xb8\x13\xd6\x68\xf9\xba\x29\x4e\xbb\xcd\x5c\x4e\xe4\x1d\x39\xb0\xd8\x46\x8a\xc5\x16\x2a\x69\xb3\xfe\xbf\xdd\x62\x2f\xec\x40\x52\x1e\xb5\x3c\xb0\x9f\x39\xcf\xd3\x3f\x02\x76\x29\x91\xfc\x18\x66\x32\x17\xfc\x00\xda\x85\x4c\xee\x03\x88\x17\x72\xae\x1f\xdd\x0d\x46\xf2\xae\xa7\x1d\x75\x96\x9d\xf4\x9a\xad\x5c\x17\x54\xea\x85\x8a\xc0\x8c\xf2\x25\x50\x9c\x74\xf3\x35\x50\xad\x0d\x26\xe5\x71\x65\xd4\x1d\x91\xbd\x6c\x93\xec\x76\xd9\xdc\x6b\x7b\x54\x63\x4b\xbd\x7a\xad\x4f\x86\x2b\x5a\xb8\xef\x2a\x64\x26\x1e\x7a\x1d\xe2\xf5\xd7\xd9\xca\x56\xeb\x8e\x3e\xc9\x0f\xdc\xda\x92\x6e\xcd\x4a\xf4\x88\x68\x14\xdc\xae\xc6\x55\xcd\xd1\x80\x73\x88\x93\xf5\x05\xee\x94\x0f\xfe\xea\xbb\x59\x51\x9d\xca\x9d\xae\xc9\xb1\x83\xda\x4c\x1e\x97\x72\xb0\x9a\x97\x59\x9b\xca\xca\xeb\x5d\xbb\xda\x5f\x92\x59\xf0\xd2\xe8\x42\xde\x6c\xf4\x7a\x81\x8b\x66\x73\x12\xdf\xdf\x78\xc1\x5f\xa7\xc7\x3f\x72\x01\xe8\xfa\xf8\xef\x42\x36\xcb\xe7\x23\x5e\x9c\x33\x36\xd2\x4e\xdd\x2d\x5c\x55\x28\x54\xeb\xc4\xd2\xae\x4f\xe7\xbd\x9d\x3d\x51\x1a\x46\xd3\xe1\x54\x75\xec\xbe\x36\xf3\x72\x7d\x2c\xa9\x35\x33\x80\x43\x68\x3e\x77\x3d\x43\xa3\xa0\x85\x76\x8d\xb9\xd3\x5b\x14\x87\x93\xd2\xae\x93\x29\x97\x72\x85\x8e\x51\xb0\x1d\x65\x94\x53\x96\xb5\x96\x30\x91\xe5\x8c\x93\x19\x40\x73\xb4\x18\x55\xf0\x4e\xd6\x6b\xb7\xf8\x75\xa9\x37\xd6\xb7\xea\xcc\xb4\x9a\xe5\x72\xbf\xdd\x72\x71\xb6\x2d\x31\x39\xff\x80\x91\x58\x2d\x3e\x79\x6a\xc0\x43\x53\xd3\x88\x4f\x4d\xa1\x60\x3b\x7c\xa6\x55\xa0\xda\xf6\x94\xda\xc8\xbd\x5d\x76\x3b\x54\xe7\xa5\x2e\xd3\x6c\xab\x8b\x61\x95\xab\xa9\x6a\xbf\x2c\x2c\xec\x26\x6b\xaf\xdb\xc7\xa9\x59\x25\xa2\xcd\x87\x55\xdf\x2d\x53\x45\xb9\xda\x2e\xeb\x7d\x6f\x5b\xa5\x96\x23\xdd\xe2\x65\xc9\xf3\xaa\x95\x4c\x33\xa3\x0e\x55\x7a\xc1\xb6\xeb\x1d\x95\x35\x6b\x6d\xd2\x66\x73\x23\x1a\xad\xcb\xa6\xf1\x3a\xd8\xce\x7b\x33\x55\x13\xd9\xca\x24\x53\xc6\x1b\x4b\x8b\xf7\x1c\xbb\x6c\xd5\x3b\x65\x45\xee\x6e\x0b\xeb\x50\xf5\x97\xfd\x2c\x2d\xb1\x7f\x87\x9f\x1d\x92\xfb\xc7\xc9\xe4\x15\x82\x05\x80\x13\x01\x4f\xca\x1c\x27\xe3\xfe\x32\x4f\x43\x28\x92\x08\xe7\x64\x20\x21\x91\xa1\x15\x40\xb2\x00\x4a\x0a\x49\x72\x3c\x27\x52\x0c\xe0\x48\x96\x12\x19\x42\xe2\x38\x08\xa3\x93\x1a\x28\x39\x5c\x13\x5b\xb4\x4e\x53\x13\xb1\xed\xc0\xd7\x8c\x57\xf1\xb6\x93\x45\x75\x88\x2f\xed\x45\xa6\x38\xd2\x94\xfe\xba\x49\xd4\x46\x6b\x7d\x26\x8f\xb6\xbb\xfe\x7b\x31\xff\x42\x22\xff\xc3\x83\x3f\x25\xf3\x8f\x83\x3f\x7c\x3d\x13\xbe\x9a\x87\x9d\x5d\xfe\x86\x84\xc0\xcf\x7c\x22\x05\xc9\x40\xee\xda\xb4\x17\x16\x74\x1c\x6b\x66\x43\x07\xa5\x20\xf5\x90\xe3\x62\xdd\x42\x09\x13\x42\x61\xec\x17\xd6\x45\x96\x8b\x74\x11\xd9\x18\x89\x13\xf4\x2d\x1d\x29\xa6\x2d\x21\x47\xb2\x4c\xc3\x40\x1b\x57\x83\x9e\x21\xcd\x92\x1d\x05\xaf\xbe\xdd\x02\x16\xee\x05\xf7\xa9\x25\x27\x7d\xfc\xff\x1d\x64\xa2\xbe\xba\xaa\x8e\xbe\xfe\xc4\xf0\x30\x31\xf5\x75\xff\x2d\xd1\xd7\x9f\x58\xd8\x1e\xdc\x9c\x41\xe7\xeb\xcf\xf0\xc5\xbb\xe0\xe6\x3f\xf7\xc2\x0a\x42\xb7\x09\xea\x70\xe3\x6e\x1c\x75\x77\xa3\xb8\x8d\x1c\x64\xaf\xde\x13\xfe\xf2\xcf\x9b\x54\x01\x1d\x37\x78\x63\x44\xde\x3f\xb9\x4d\x51\xc5\xc3\x7b\xe4\x1b\x78\xec\xa3\x2d\xb4\xa5\x99\xba\xda\x37\x5e\x98\x92\xd3\x1c\x10\x7b\x85\x04\xea\xb0\xbf\xfe\xc4\xbe\xae\x08\xe2\x2f\xe2\x2f\xfc\xeb\xbe\x41\xf2\x6c\x1b\x19\x6e\x3d\x18\xda\xd7\x9f\x18\x88\xdf\xcf\x05\x2f\xf5\xf8\x7a\xfb\xff\x47\x45\x9e\x54\x7a\x94\xf4\x81\x49\x8a\x60\x39\x8a\x10\x71\x56\x02\x24\x0b\x69\x9c\x53\x10\x47\xc9\x8a\x7f\xb8\x54\x28\x28\xe2\x0c\x90\x28\x56\x81\x40\x51\x10\xe2\x70\x9c\xa3\x09\x9c\xa3\x70\xce\xbf\x0d\x78\x91\xde\x33\x3a\xe2\xfa\x56\x1c\x9b\xc0\x63\x4b\x30\x76\xdf\xe4\x62\x4d\xff\x4c\xfc\xde\x31\xa0\xe5\xf3\x42\x0a\x20\x20\x89\x43\xc0\x73\x08\xb1\x40\x42\x24\x49\xb2\x34\x82\x1c\xc1\xb2\x2c\xc7\x88\x50\xa2\x29\x86\x66\x14\x00\x64\x49\xa2\x14\xa0\x20\x89\xc1\x65\x9a\x96\x65\x85\xf0\x4f\xe2\x5f\xbf\xa4\xf4\x70\x41\x07\x8f\xa6\x98\x3e\xae\x03\xe2\xf9\xbc\xcd\xf4\x5c\xcb\x73\x3f\x77\xec\xd7\x34\xfc\xf0\xa8\xff\xa3\x35\x7c\x9b\x95\xfd\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\xd1\xc1\x1f\x1d\xfc\x8d\x3a\x08\xfe\xf6\x5f\xb7\x1f\x5e\x1c\xc9\x0a\x5e\x9d\x4f\xbb\x9e\x0e\x27\xf4\x30\x45\xf5\xa2\x8b\xc6\x4c\x73\xf3\x1b\x53\x64\x28\x95\xad\xea\x6d\x4d\xec\x2e\xbd\x1e\xd5\x41\x03\xbe\x97\x65\xfb\x96\x92\x87\x25\x42\xa9\x0b\xa7\x14\x55\x21\xf8\x93\xe6\x46\x0d\xca\xa1\xeb\xe3\x79\x7b\xdb\xe5\xe1\x72\x4b\x55\x70\x8e\x21\x47\xbb\xea\xce\x6e\x55\x4c\xbd\xde\x99\x4f\x8d\x2e\x59\xae\xa8\xcb\x63\x46\xa0\x3a\x7f\x30\x4d\x73\x4f\x46\x21\x97\xdd\xf5\xe7\xaf\x55\xbb\xc9\x17\x07\x78\xdd\xc6\x97\x93\xfe\x4c\xee\x52\xee\xa8\xd5\x78\xad\x58\x5d\x34\x93\xac\x02\x35\xe4\x97\x0d\xa9\x4f\xeb\x8e\x6d\xf6\x6c\xa6\x33\x6d\x14\xe5\x52\x77\x55\x45\xbc\x02\xd5\xf5\x90\xcd\x3a\x0d\x50\xe8\x6f\xb6\x7a\x9d\x83\x82\x31\x29\xbd\x54\x4f\x19\x8e\xfc\xf8\xc1\xa7\x04\xb9\x7b\xd2\x60\xed\x06\x51\xd9\xa8\x70\xb7\xea\x94\xe4\x3c\xc3\xd7\xf4\x41\x65\xd4\xf7\xea\x83\xdd\x2e\xa7\xd6\xfa\x86\x39\xaa\xb5\x33\xa5\x15\x9c\x97\x4b\xcd\x89\x5d\x63\x8a\x4c\x66\x31\x2e\xe4\xca\x9d\xbe\xbd\x1d\xad\x46\xa4\xe9\x94\xbc\x75\xbd\x20\xac\x89\x86\x64\xa9\x2f\xaf\xf3\x09\xd9\x51\xb6\xed\x62\x40\x27\xaf\x28\x74\x41\x69\x73\x2b\xc1\x79\x15\xc4\x81\xb7\x54\xa4\x62\xb3\x5a\x74\x5d\x19\x5a\x40\xe4\x54\x79\x6a\x21\x46\xb1\x4a\xf3\x96\xe0\x74\xc4\xae\x4c\xac\xc9\xbe\x3e\xc8\xeb\x85\x65\x6f\x4d\xf5\xed\xaa\x4c\x95\x41\x77\x5b\x9e\x12\xd9\x26\x14\x04\x0a\xcd\xc7\x16\x08\x8d\xe6\x01\x7b\x9b\x1e\xe7\x7f\xfd\xe8\x53\x99\xe0\x9a\x7c\xcc\x7e\xdb\xc5\x59\x26\x57\xee\xf6\x73\xb4\x56\x77\x54\x54\xd3\xe8\xa5\x32\x1a\xd5\x6d\xb5\xdb\x9a\xaf\x4c\xcd\xf4\x26\x4d\x3c\x8f\x8f\x3d\x26\xbf\x10\x96\x99\xf5\x20\x33\x72\x72\x4c\x75\xa3\x49\x26\x4e\x8d\xad\x61\x66\xfb\xaa\xcc\xf8\x42\x6d\xa9\x88\x76\x6d\xc3\x74\xf1\x0e\x00\x7d\x67\xca\x85\x46\x5e\x9a\x48\x2b\xc1\x29\x9b\xb8\x5c\xcb\xac\x57\x83\x42\xc3\x20\x04\x5c\xd7\x97\xeb\x41\x7d\xf7\xd2\xac\x31\x2f\xdd\x8d\x35\x9d\xe8\xbb\xe5\xf8\x64\x2f\x35\x66\x8e\x54\x30\xd7\xcd\x0a\xd7\x7b\xd5\x0a\x2f\x68\x2a\x01\xb6\x35\x72\xcb\xb5\xda\x6e\x38\xe0\xd6\x03\x75\x92\x83\x79\x8f\xae\xd3\x41\xae\x74\x72\xca\x68\xe7\x92\x69\xcf\xa4\x7f\xd9\x4b\x81\xa9\xa3\x26\x9c\xce\x37\x0d\xd8\x6f\xf1\x4c\x6e\xa7\x38\x3c\xc2\x25\xd3\x16\x26\xa3\x5d\x6e\x58\x5d\x94\xcc\x1a\xbb\x58\x2d\xa2\x4a\xad\x33\x5c\xf4\xf9\x13\x3c\xb4\xe7\xb2\xce\xd0\xd6\x19\xc8\xbd\xb6\x1d\x75\x30\x2c\x21\xa0\x39\xeb\x62\x85\xe3\xf2\x4b\x9a\x51\xe7\xe4\xce\xd5\xca\xc6\xb2\xa2\x76\xd6\xc3\x99\x90\xeb\x10\xe3\xc6\xa8\xac\x09\x6b\xc9\xab\xe4\x47\xbb\x6a\x86\xec\x7a\x1b\xa6\xde\xb6\xe6\x56\x1d\x8a\xde\xba\xd0\x1f\xce\xca\xc3\xca\x24\xc2\x37\x77\xca\x38\x7e\xd8\xbe\xae\xa5\x5a\x2f\xbc\xa0\xfb\xc0\x43\x92\x8b\xef\x43\x7e\x34\x83\x19\x7b\x27\xf2\x18\xfb\x49\xc0\x52\x88\xe7\x01\xc5\x8b\x3c\x52\x58\x59\x84\x3c\xa4\x65\x11\x00\xc0\x8b\x2c\xa7\xc8\x90\x53\x00\xc5\xb2\xac\x48\x40\x05\x00\x11\x52\x0c\x07\x65\x5a\xc2\x65\x85\xa7\x18\x99\x92\xf7\xaf\x00\xc4\x56\x88\x46\xc2\x42\x72\xea\x4b\x0e\xaf\xe3\xd5\xd7\xad\x3b\x5b\x0b\x84\x36\xc6\xe1\xd6\x32\x09\x5e\x28\x6f\x56\xf5\xfc\xb6\x49\xbb\xb9\xa2\x94\x1f\xac\xd6\x25\x7e\x0d\xa6\xae\xdd\x34\x26\xd9\x1b\xae\x8b\xaf\x92\x04\x33\x9c\x7f\xa4\xff\xf1\x4b\x46\x4a\x5a\xf8\x6d\xfd\x9f\x3f\x03\x49\xd7\xbb\x42\xf3\x2c\x21\x23\x05\x28\x0a\xce\x49\x38\x1d\x64\x5d\x10\x2b\xb3\x84\xa8\x50\x80\xc5\x81\x28\xf2\x1c\x82\x84\xc2\xb2\x0c\x82\x2c\xc0\x39\x9a\x64\x68\x19\xd0\xb2\x22\x53\x24\x14\xf7\x0f\xaa\xcf\xf5\x1e\x19\x77\xde\x33\x81\xe9\x52\xf4\x32\xdf\x2a\x6e\xac\xf6\x0b\x30\xcb\x42\x66\x47\xb0\x9d\xad\xea\x10\x9a\xd2\x28\x8d\xf5\xf6\x70\x6a\x7b\xdd\x4c\x2f\xfc\x01\xab\x3b\x66\xf6\x84\x77\x97\xde\x0b\x8f\xf5\xaf\x4b\xf7\xf5\x7f\xf5\x01\x48\xfa\xdb\xb2\x1f\x77\xa0\xbf\xdb\x7b\x5e\xeb\x5c\xb9\xbd\x6a\x2f\xc4\x1a\x59\xce\x82\xe1\x60\xde\xb1\x6b\xfa\x7c\x84\xe3\xca\x2b\xe7\xd4\x2b\xac\x8e\x17\x3b\xeb\xea\xf0\x25\x3b\x02\xd9\x63\x7c\x0e\xae\x2b\xf1\x39\xbc\x3e\x1a\x9f\x9b\xb4\x5d\x8b\xe2\x85\xde\xe1\x4f\x72\xbe\xb0\x5b\xae\x16\xed\x5c\xdb\x14\xb2\x55\x55\x69\x75\x46\x05\xb3\x3e\x5b\xb9\x5b\xa9\x07\xb4\x52\x2b\xdf\xa6\x89\xe9\x42\x76\x4a\x65\x98\x13\x86\x6b\x9c\xee\xbe\x0c\x66\x43\x7c\x34\x5d\xd8\x78\x3e\xd7\x2a\x52\x02\x2c\x0d\xc8\x9a\x2e\x39\x60\xb2\xae\xeb\xaa\x48\xf5\x3a\x76\xa3\xee\xef\x31\x2b\xa0\x67\x2d\x70\x9d\x66\x01\xc9\xe8\x1a\xb9\x6b\xd0\x2e\xf5\x02\xe7\xbb\x0e\x40\x1b\x7b\xd7\x64\x3a\xa6\x3d\x58\x0b\x99\xbe\xd8\xc7\x8f\xc4\xae\xe8\xe0\x64\x19\xb1\x27\x4c\x11\xd9\x60\xa8\x49\xaf\xf9\x57\x46\x8b\xec\x27\x44\x2b\xc1\xde\xf6\x86\x0f\xf4\x9f\xcd\xfe\xfb\xa2\x46\x5a\xb4\xfc\xbb\x43\xe5\xff\xf9\x4d\x50\xe8\x10\xfc\x44\x92\xd9\xdd\xcb\x7a\x9e\x1d\x35\x2b\x2a\xcd\x4b\x22\x5f\x90\x0a\x1e\x3d\x5f\x96\x81\xec\x59\xbb\x7c\xa9\xaa\xe1\x04\xe0\xdb\x4b\xe7\x48\x2d\xdd\xd9\x8a\xf1\x09\x8d\x39\x5b\x30\xb0\x70\x49\x88\x0c\xf9\x8e\x60\x54\x35\x4e\xf3\x70\xe1\xba\x60\xf8\x31\x67\xff\x94\xfe\x2f\x04\x9a\x77\xfa\xbf\xbe\x44\x5d\xf9\x00\xe1\xa3\xeb\x54\xe2\x23\x84\x83\x1f\x45\x17\x9a\xf0\x85\xc9\xd3\x5c\xa5\x38\xe2\x65\x94\xe3\x0b\x32\xe1\x6b\x96\x67\x28\x17\x8b\xa6\x9c\xd7\x92\x3a\x16\x8b\x39\x7c\xa8\xf0\xce\x30\xa3\x45\xad\x82\x52\x56\x11\xc4\x20\xe3\x91\x2d\x14\x52\xca\x3b\x1c\x3b\xc4\x5a\x9d\x4a\x23\xdb\x19\x63\xb5\xe2\x18\xfb\x76\xfc\xf2\xed\xf9\x58\x56\xe5\x62\x91\x93\x44\x79\xad\xcf\x22\xee\x5c\x61\xed\x5c\xa3\x9c\x56\x74\xe2\x54\x51\xec\x61\x7a\x22\x34\xd2\x98\x1d\x3a\x88\x93\x0a\xbf\x73\xbd\x5e\x91\xe2\x6a\x29\xb5\x87\xe9\xc6\xc0\xd3\x88\x5f\xe9\x1d\xeb\x0b\x95\x76\xbf\x88\x9d\x3e\x7e\xf9\xd0\x48\x3e\x47\xdf\x1f\x1c\xc0\xf9\x1c\x9c\x8a\x74\x5c\x28\x30\x11\x2b\xc0\xf7\x30\xdf\x10\x2c\x8d\x68\xa4\x9b\x38\xc3\x7d\xd9\x83\xf4\x72\x07\xd1\x6a\x83\x0f\x93\x0b\xb0\xd2\xb8\x9d\x3a\x89\x53\x53\xad\xe7\xa0\x08\xc2\xd5\xcf\xfb\x53\xaa\x2c\x3e\xce\x34\x02\x99\x4a\x38\xd9\x65\xda\xa4\x5f\xa8\x01\x10\xab\x35\xf9\x19\x4c\x1d\x4f\xbc\xc0\xf1\xd0\x4d\x9c\x5d\x50\x3e\xe0\x4a\x41\x80\xb3\x02\x9b\x0f\x93\x3c\x01\xa6\x11\x4d\x74\x77\x53\x0c\x8b\xbc\xf3\x96\x2c\x33\xfa\x30\xdb\x13\x60\x1a\xdb\x44\x77\x71\xb6\x87\xcf\xea\xaf\x7c\xb6\x7e\x56\x6e\xf5\x71\xbe\x47\xc0\x54\xbe\xf1\xee\xe2\x7c\x8f\x5f\xbe\x5f\xf9\xa2\xfd\xac\xee\xec\xc3\x84\x4f\x80\x69\x84\x13\xdd\x5d\xdc\x1a\x84\x5f\xb4\x3f\x9f\x3e\x57\xbf\xfa\xc9\x72\x4a\x5d\xde\xc7\xc7\x11\x81\x4c\x1d\x49\xb2\xcb\xb4\x28\xe1\xa0\xe5\xf3\xe1\x1b\xdd\xcb\x9f\x13\x27\xeb\x15\x7f\x02\xf7\xab\xc4\x1f\x62\x9d\xd8\xa2\xa6\x55\x71\x7e\x98\x7f\x1c\x34\x6d\x10\x29\xdd\x5e\x1c\x49\xf4\x53\xdf\x4b\x5b\xcd\x63\x85\xeb\x3d\xf7\xa0\x1e\xf6\x6d\x1f\x21\x87\xa5\xb3\x13\x38\x58\x53\x38\xed\x62\xfb\xdd\x8a\xf0\x8a\x89\xae\x8d\x10\x76\xa8\x38\xf0\x1d\x1b\x96\x8b\x9d\x22\x16\xad\x40\x40\x1c\x9f\x29\x9e\x6f\x34\xe3\x45\xbb\xef\x65\x19\x87\xf1\x49\xee\xf7\x29\x31\x8a\xd1\x32\x54\xcf\xd1\xa2\x53\xcf\x61\x31\xa8\x33\x76\xa7\xca\xe3\xf7\x12\x3b\x22\xf8\x9c\x4e\x8e\x11\xa3\x75\x79\xab\x18\xab\x91\xfe\x08\x85\x03\x48\xc8\x22\x12\x60\x6e\x24\x12\x2b\xeb\x7e\x2f\x91\x28\x88\x4f\x24\xbe\x11\xbe\x91\x49\xac\x14\xfd\xbd\x4c\xa2\x20\x3e\x93\xc8\x97\x05\xb7\xd3\x88\x95\xcf\x7f\x80\x49\x14\x67\x4f\xe6\xb0\x4b\x88\x93\x89\x96\x9a\xb9\x16\xbe\x1e\x63\x94\x04\xf2\x29\x25\x62\xe3\xbb\x3a\xba\xf4\x7f\x8d\xc0\x24\x53\xb7\x34\xe4\xa2\xa0\xdb\xff\x09\x00\x00\xff\xff\x01\x0b\x77\xd1\x62\x62\x00\x00") - -func self_sendCoreSqlBytes() ([]byte, error) { - return bindataRead( - _self_sendCoreSql, - "self_send-core.sql", - ) -} - -func self_sendCoreSql() (*asset, error) { - bytes, err := self_sendCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "self_send-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x7b, 0x4c, 0x24, 0x3, 0x92, 0x60, 0xd9, 0xe, 0xd0, 0x74, 0x4c, 0xbd, 0x67, 0x8, 0x95, 0xf, 0xe7, 0x68, 0x62, 0x8e, 0x1d, 0xaf, 0x36, 0x99, 0x67, 0x72, 0x10, 0xfe, 0x47, 0xcd, 0xc3}} - return a, nil -} - -var _self_sendHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x5d\x79\x6f\xe2\x48\xd3\xff\x7f\x3e\x45\x6b\xb4\x52\x12\x0d\x99\xf8\xc0\xc6\xce\x3c\xb3\x92\x01\x13\x48\x88\x09\x57\x48\xb2\x5a\x59\x6d\xbb\x4d\x9c\x80\x4d\x6c\x13\x42\x56\xcf\x77\x7f\xe5\x0b\x6c\xe3\x13\x98\xd9\x47\x7a\xd1\x68\x14\x70\x75\xd5\xaf\xaa\xab\xbb\xaa\x0f\x77\x9f\x9f\x7f\x39\x3f\x07\x77\x86\x65\x4f\x4d\x34\xec\x77\x81\x02\x6d\x28\x41\x0b\x01\x65\x39\x5f\x7c\x39\x3f\xff\xe2\x3c\x6f\x2e\xe7\x0b\xa4\x00\xd5\x34\xe6\x5b\x82\x77\x64\x5a\x9a\xa1\x03\xf6\x3b\xfd\x1d\x0f\x51\x49\x6b\xb0\x98\x8a\x4e\xf1\x18\xc9\x97\x21\x3f\x02\x96\x0d\x6d\x34\x47\xba\x2d\xda\xda\x1c\x19\x4b\x1b\xfc\x04\xd8\x0f\xf7\xd1\xcc\x90\x5f\x77\x7f\x95\x67\x9a\x43\x8d\x74\xd9\x50\x34\x7d\x0a\x7e\x82\x93\xf1\xa8\xc5\x9c\xfc\x08\xd8\xe9\x0a\x34\x15\x51\x36\x74\xd5\x30\xe7\x9a\x3e\x15\x2d\xdb\xd4\xf4\xa9\x05\x7e\x02\x43\xf7\x79\x3c\x23\xf9\x55\x54\x97\xba\x6c\x6b\x86\x2e\x4a\x86\xa2\x21\xe7\xb9\x0a\x67\x16\x8a\x88\x99\x6b\xba\x38\x47\x96\x05\xa7\x2e\xc1\x0a\x9a\xba\xa6\x4f\x7f\xf8\xd8\x11\x34\xe5\x67\x71\x01\xed\x67\xf0\x13\x2c\x96\xd2\x4c\x93\x2b\x8e\xb2\x32\xb4\xe1\xcc\x70\xc8\xb8\xee\x88\x1f\x80\x11\x57\xef\xf2\xa0\xd3\x02\xfc\x43\x67\x38\x1a\x82\x9e\xd0\x7d\xf4\xe9\xbf\x3f\x6b\x96\x6d\x98\x6b\xd1\x36\xa1\x82\x2c\xd0\x1c\xf4\xee\x40\xa3\x27\x0c\x47\x03\xae\x23\x8c\x42\x85\xa2\x84\xa2\x6c\x2c\x75\x1b\x99\x22\xb4\x2c\x64\x8b\x9a\x22\xaa\xaf\x68\xfd\xe3\x77\x08\x94\xdd\xbf\x7e\x87\x48\xc7\xaf\x7e\x9f\x82\x9e\xb4\xf2\xda\x79\x00\x1d\x47\xce\x12\x16\xa2\xda\x32\x77\xc9\x3b\x42\x93\x7f\x08\x51\xfa\x6c\x5d\x54\x22\x52\x55\x24\xdb\x96\x28\xad\x45\xc3\x54\x90\x29\x4a\x86\xf1\x9a\x5d\x50\xd3\x15\xf4\x21\x86\x94\xd3\x2d\xe8\x3a\xba\x25\x1a\xba\xa8\x29\x65\x4a\x1b\x0b\x64\xc2\x4d\x59\x7b\xbd\x40\x07\x94\xde\x22\x39\x08\x45\xb9\xb2\x33\xa4\x4c\x91\xe9\x16\xb4\xd0\xdb\x12\xe9\x72\x29\x15\x42\xc5\x17\x26\x7a\xd7\x8c\xa5\xe5\xff\x26\x3e\x43\xeb\x79\x4f\x56\x87\x73\xd0\xe6\x0b\xc3\x74\x9a\xa3\xdf\xa7\xee\xcb\x66\x5f\x5b\xca\x33\xc3\x42\x8a\x08\xed\x32\xe5\x03\x67\xde\xc3\x95\xfc\x76\xb9\x07\xe8\x70\x49\xa8\x28\x26\xb2\xac\xec\xe2\xcf\xb6\xa9\xb8\x71\x47\x9c\x19\xc6\xeb\x72\x51\x80\x7a\x91\x07\xc9\xa3\x82\x9a\x59\x92\x71\xd0\xe9\x16\x2e\xe0\xf4\x13\xaa\x8a\xcc\x62\xa4\x01\xfb\x3d\x8a\xf8\x66\x2d\x56\xc8\xed\x5a\x4b\x08\x09\x77\xc5\x79\x25\x16\x4e\x81\x67\x3b\xb7\x06\xac\x48\x07\x24\xad\x73\xdd\xe8\x79\xd3\xd2\x8b\x10\x1b\x1e\x0e\x23\x97\x50\xb3\x6c\xd1\xfe\x10\x17\xf9\x2c\x1d\x4a\x63\x51\x94\x12\x15\x25\x0b\x42\x49\x36\xb1\x14\x34\xf7\x5c\xb2\xfc\x5e\x4c\x5a\x17\xab\x4c\x2f\x46\x3a\xd6\xb6\xac\x65\x9e\xe4\x0d\xb1\x6c\x28\xa8\x64\x5e\xb0\x71\x83\x05\x34\x6d\x4d\xd6\x16\x50\xcf\x0c\xde\x79\x45\xc5\x45\xc9\xdc\x64\x13\xd1\xca\x22\x48\x2e\x58\x5a\xbe\x6b\xbc\x22\xf2\x3c\xc2\x5f\xce\xdf\xab\x4c\xa7\x26\xfd\x3f\x9d\xf8\x10\xa4\x7e\xae\x33\x88\x05\x11\x4c\x0d\x73\x21\xce\xb5\xa9\x9f\x30\x64\x40\x88\x51\x16\xd6\xb1\x7c\xbe\x97\xc5\xb9\xa8\x73\x7a\xa5\x1b\xbd\xee\xf8\x56\x00\x9a\xe2\x49\x6e\xf2\x2d\x6e\xdc\x1d\x15\xe4\x9d\xe2\x74\x47\xe0\xec\x57\x77\x36\x27\xf7\x5b\x71\xf5\x83\x28\x3d\xe4\xfb\x63\x5e\x68\xec\x61\x33\x27\xcf\xb6\xd0\x5b\x69\xc9\x11\x26\x85\x4b\x2b\xa8\x20\xed\x36\x9b\x2d\xac\x61\x4a\xab\x2f\xa3\x5f\x32\x8b\x62\x65\xfd\xbc\xaf\x18\xb1\x9f\xe4\x15\xd6\xcd\xef\x01\xca\xe8\xe2\x15\x29\x48\xeb\xa7\x7f\xc5\xf1\x04\xf9\x62\x11\x44\xb1\x3e\x24\x9b\x38\xd4\x25\xf8\x84\xdc\xd5\xd5\x80\xbf\xe2\x46\x09\xc4\x73\xcd\x19\x71\x68\x32\x3a\xd5\x97\x73\x64\x6a\xf2\x5f\x7f\x9f\x15\x28\x05\x3f\xf6\x28\x35\x83\x96\x7d\x0a\xf5\x35\x9a\xb9\x53\x31\x05\x4a\xa8\x9a\x99\x58\xa4\x35\x16\x1a\xa3\x4e\x4f\xc8\xd0\x47\x84\xd3\xe9\x16\x5d\x05\xec\x00\xcd\xe0\x11\x68\x77\x00\x0f\x47\x57\xb7\xf8\x16\x7c\x05\x94\x51\xc4\x55\xbd\x00\x07\xfe\x61\xc4\x0b\xc3\x18\x8b\xd9\x62\x6a\xbd\xcd\x02\x5f\x6c\xb4\xf9\x5b\x6e\x47\xc2\x8f\x2f\xde\x2c\x9c\x00\xe7\xe8\x32\xf8\x0d\x8c\xd6\x0b\x74\xe9\x17\xf9\x01\x86\xf2\x33\x9a\xc3\x4b\x70\xfe\x03\xf4\x56\x3a\x32\x2f\xc1\xb9\x3b\x39\xd7\x18\xf0\x4e\x7d\xf9\x9c\x03\x7e\x5f\x22\x1c\xa3\x0f\x7d\xc6\x8d\xde\xed\x2d\x2f\x8c\x32\x38\x7b\x04\xa0\x27\x44\x19\x80\xce\x10\x9c\x04\xd3\x6e\xc1\x6f\x96\xcb\xe4\x24\x2e\x39\x50\xdf\x97\xb9\xb1\x50\xae\x3e\x11\x5b\x0a\xbd\x51\xcc\x9e\x60\xd2\x19\xb5\x37\xb0\xc2\xf3\x6f\x11\xf1\x5b\x2e\x31\x20\x65\x94\xdf\x61\xe2\x1a\xe0\xae\x7b\xb1\x98\x0e\xfb\x5d\xb0\x30\x0d\x19\x29\x4b\x13\xce\xc0\x0c\xea\xd3\x25\x9c\x22\xd7\x0c\x05\xe7\x0b\xc3\x70\xf3\x1d\xcd\x87\x1f\xf8\xea\x16\x7f\x50\xb7\x49\xb6\xdc\x78\x76\x2e\x7f\x30\xe0\x47\xe3\x81\x30\x0c\xfd\xf6\x05\x00\x00\xba\x9c\x70\x35\xe6\xae\x78\xe0\x6a\x7f\x7b\x3b\xf6\xfa\xbb\xe1\x68\xd0\x69\x8c\x5c\x0a\x6e\x08\xfe\x10\xff\x00\x43\xbe\xcb\x37\x46\xe0\x0f\xdc\xf9\x16\xaf\x8d\xdc\x86\x78\x98\x76\x79\xec\x8f\xa6\x1c\x91\xa4\x5c\x91\x9e\xea\x30\xfd\x0a\x48\xd8\xa8\xb8\xf9\x69\x2f\x0d\x4f\xbf\x00\xd0\xe0\x86\x3c\x98\xb4\x79\x01\xfc\x81\xff\x85\xff\x7d\xf1\x07\xfe\x17\xf1\xf7\x9f\x7f\x10\xee\xdf\xc4\x5f\xc4\xdf\x60\xe4\x3d\x04\x7c\x77\xc8\x3b\x46\xe1\x85\xe6\x59\xa2\x65\x0a\xc4\x81\x03\x2d\x93\x2f\xe1\x57\x5b\xe6\x3f\xfb\x58\x66\x37\xa6\xfa\x76\xd8\xc4\xe1\x62\x86\xd8\x86\xed\x1d\x8e\x2e\x62\x00\x86\x8e\xad\xc0\xcf\x6d\x0f\x50\xf1\x7e\x1e\x3d\xde\xf1\xe0\x67\xb8\x45\x9c\x25\xb5\xda\xa3\x62\x8c\x33\x8c\x41\x0c\x9a\x71\x71\x84\x89\x29\xd0\xa1\x28\x93\x98\xc6\x90\x46\x1a\x64\x14\xee\xd6\xcb\x76\xd1\x26\xa5\x79\x07\xa3\x4d\x60\x1a\x47\x1b\x6e\x24\x99\x68\x9d\xc8\xa5\x20\x15\x2e\x67\xb6\x68\x43\x69\x86\xac\x05\x94\x11\xf8\x09\x4e\x4e\x7e\x44\x9f\xae\x34\xfb\x59\x34\x34\x25\xb4\x94\x16\xd1\x35\x9c\xff\xfa\x2a\xba\x0d\xac\x98\x7a\x5e\x5b\x0c\x0f\xbe\x3d\x8d\x34\x05\x48\xda\x54\xd3\x6d\x37\x31\x10\xc6\xdd\xae\xa7\x0e\x9c\x3b\x69\x3c\x90\x9f\xa1\x09\x65\x1b\x99\xe0\x1d\x9a\x6b\x4d\x9f\xc6\xc8\xf4\xe5\x7c\x93\xf2\x03\x4d\xb7\xd1\x14\x99\x31\x12\x75\x06\xa7\x16\xb0\xe6\x70\x36\xdb\x15\x63\x1b\xf3\xd9\xae\x90\x53\x82\xa2\xce\x36\x94\xbb\xd5\x1e\x1f\x37\xec\x6b\x8e\xf8\x6c\xc7\xc6\x24\x36\xfa\xd8\x31\xc8\x62\x31\xd3\xdc\x39\x7b\x60\x6b\x73\x64\xd9\x70\xbe\x00\x4e\x9d\xb9\x5f\xc1\xa7\xa1\xa3\x5d\xa0\x69\xa3\xa2\x20\x1f\xf5\x87\x53\xc5\x30\x6f\x06\x5f\x29\x5c\x7d\x37\xe4\x06\x23\x2f\xa3\xc3\xdd\x1f\x3a\x42\x63\xc0\xbb\xe9\x57\xfd\xd1\xff\x49\xe8\x81\xdb\x8e\x70\xcf\x75\xc7\xfc\xe6\x3b\xf7\xb0\xfd\xde\xe0\x1a\x6d\x1e\xe0\x79\xca\xec\x6d\xf6\x38\xa3\x1d\x57\xf4\x27\x3d\x80\x8e\x3e\xec\x77\x38\x3b\x3d\x49\xd1\xf8\xe4\xf2\xd2\x44\x53\x79\x06\x2d\xeb\x2c\x5e\x5d\xde\x5a\x45\x82\x6f\xd1\xd5\xb3\x8c\x8a\xf2\xc6\xc6\x07\x6b\xe6\xcd\xe8\x6c\xf4\x4a\x6e\x19\xdb\xb9\xba\x64\x98\x89\xe4\xb2\xa1\x24\x91\xe3\x44\x32\xb9\x37\xfd\x97\x50\x80\xa2\xb3\x5a\x58\xf2\xf4\xc2\x91\xdc\x36\xcc\xf3\xb7\x39\x6d\x96\x22\xa0\x37\x11\xf8\x26\xa8\x3f\xe6\x68\xe4\xcd\xd0\x65\x2b\xb4\xe1\x15\x7b\xfc\x5d\x53\xd2\xb0\x05\x73\x3e\x87\x7a\x9d\xcf\xc7\x77\xbb\x58\x9b\x11\xd3\x7a\xfa\xdd\x29\xae\x34\xca\xaf\xee\xc2\xc7\xd7\x14\x6f\x76\xfd\x38\xf9\x91\x82\x6c\xa8\xcd\x2c\xf0\x62\x19\xba\x94\xee\x6c\xc1\x44\xd9\xa1\x76\xf0\xf9\xf8\x76\x08\xd6\xad\x53\xb0\x85\x16\x93\x0b\xb5\xc2\xa4\x75\xec\xe4\x82\xbe\x59\x42\x33\xa3\x6e\x45\x6c\x70\x04\xbd\x1c\x16\x93\xb0\xad\x88\x62\xf4\x9b\xc5\xe4\x58\x60\x32\x96\xf6\x36\x36\xc5\xcb\x98\x08\xda\xb9\x85\x3c\xda\xe5\x42\x29\x4c\xbb\x71\x1d\xff\x6b\x6c\x9d\x7d\x47\x17\x7c\x27\x1f\xb0\xe1\x4c\x94\x0d\x4d\xb7\x92\x7d\x50\x45\x48\x5c\x18\xc6\x2c\xf9\xa9\xbb\xf2\xa9\xa2\xb4\xba\x76\x1f\x9b\xc8\x42\xe6\x7b\x1a\x89\x93\x87\xda\x1f\xa2\x9b\x26\x69\x9f\x69\x54\x0b\xd3\xb0\x0d\xd9\x98\xa5\xea\x15\xaf\xa3\xc0\x59\x10\x54\x90\xe9\xa6\x17\xde\xef\xd6\x52\x96\x91\x65\xa9\xcb\x99\x98\xea\x28\xbe\xe2\x50\x9b\x21\x25\x9d\x2a\xbd\x59\xa5\xcc\x5d\x1f\xda\xca\x52\xd6\x43\x72\x62\x5e\xf1\xde\x26\xbf\xff\x2a\xab\xf2\x71\xc3\x58\xa6\x8c\xdf\x15\xd6\x4a\x29\x7a\x60\x98\xcb\x94\xb5\x1b\xf6\x92\xc9\x33\xc2\x60\x68\x65\xe7\x68\xbe\x99\x37\xcc\x89\xee\xaa\x4a\x19\x0a\x39\x99\xbf\xec\xa9\xe2\x46\xc0\x03\x03\xa0\xdf\xf2\x8d\xa5\x29\x6f\xb6\x69\xa4\x84\x9e\xa0\x3b\x39\x39\xb9\xbc\x4c\x1f\x8a\xa5\xb7\x03\x7f\x61\xed\x50\x73\xfa\x7b\x01\x4f\x8f\x9a\x2f\xf8\x5d\xe2\x3e\xd1\xcb\xdd\x0b\x93\x2a\x36\xb6\x13\x31\x8b\xc8\xdf\x1c\x99\x45\xe2\x8d\x83\x13\x09\x76\xf7\x74\xe6\xd0\x65\x8a\xdb\x50\x65\x48\x74\x21\x69\x96\x68\xa1\xd9\x0c\x99\x40\x32\x8c\x19\x82\x7a\x10\x93\x34\x19\x89\x7a\x24\xfe\x7a\xbf\x45\x63\xf2\x76\x37\x91\x18\x8b\xd6\x91\xfd\x4c\xf1\x87\xa1\x65\xfa\xc4\x9d\x9f\x2e\x6a\xd1\xdd\x1b\x0c\x1a\x6d\xbe\x71\x03\x4e\x4f\xc3\x16\xfc\x13\x60\x67\x67\x79\xac\x92\x8a\x07\x46\xfb\xcf\x8e\x1d\x0b\xf0\x8b\xd8\x34\xc6\x3e\x66\x70\x17\x60\x66\x53\x4a\x5e\xe1\x3e\x42\xe3\x4a\xde\xb3\x50\x30\x92\x16\xe9\xc2\x0e\x89\xa5\x79\xfb\x03\x8e\x13\x4d\x73\xa4\xfc\xae\x78\x5a\x52\xd9\x03\x23\x6a\x8e\xb4\xdd\x98\x9a\x56\x20\x23\xaa\x46\xf6\x84\x1c\xd1\x57\x03\xff\x0c\x43\x2a\x3c\x88\xf2\xfb\xfe\x9c\xa1\x59\xd1\xc0\x9b\x1d\x43\x13\x69\xb7\xa2\x13\xdb\x8b\x33\x0a\x48\x1f\x46\xa4\x0d\xd0\xfe\x95\x21\x96\xfd\x21\x22\xfd\x1d\xcd\x8c\x05\x4a\x9a\xb6\xb4\x3f\x9c\x01\xcf\x72\x66\xa7\x3c\x9c\x23\x1b\xa6\x3c\x72\x86\x5a\x69\x8f\x2d\x6d\xaa\x43\x7b\x69\xa2\xa4\x19\x36\x96\x3e\xfb\xeb\xef\x6d\xee\xf2\xcf\x7f\x93\xb2\x97\xbf\xfe\x8e\xdb\x1c\xcd\x8d\x94\xc9\xb0\x2d\x2f\xdd\xd0\x51\x66\x2e\xb4\xe5\xb5\xcb\xc6\xd7\x4c\x9b\x23\x51\x32\x96\xba\xe2\xce\x58\x33\x26\xd4\xa7\x28\x3e\x1a\x8b\x86\x56\xc7\x12\x0e\xb7\x29\x52\xf2\x87\x5b\xfe\xdc\x9f\xa6\x04\xad\x2d\xd8\xc2\x55\xa4\x8b\xf0\x9a\x9b\xbb\x5f\x2e\x67\x77\xd8\x90\x1f\x65\xcc\x93\x86\x67\xa4\xc2\xb3\xa4\xe5\xc6\x11\xc7\x53\xa2\xe0\xe6\xb9\x4c\xa5\x32\xc7\x1f\x45\x94\x4c\x8d\xb4\x47\x53\xb3\xf0\xfe\xc3\x4c\x45\x73\xc2\x42\xb2\xaa\x4d\x68\x43\xa0\x1a\x66\xce\x6a\x11\x68\x72\x23\x2e\x47\xbd\x14\x96\x59\xab\x2e\x45\xd8\x76\x84\x21\x3f\x18\x81\x8e\x30\xea\xed\xac\xbc\xb8\x01\x7a\x08\x4e\x4f\x70\x51\xd3\x35\x5b\x83\x33\xd1\xdb\x05\xf3\xdd\x7a\x9b\x9d\x54\xc0\x09\x81\xe1\xec\x39\x46\x9f\x63\x24\xc0\x99\x4b\x82\xb9\xac\xd6\xbe\x63\x24\x51\x65\xe9\x6f\x18\x71\x72\xf6\xa3\x18\x77\x42\xf4\xde\x6e\x88\x58\x55\x5a\x8b\xb6\xa1\x29\xd9\x92\x58\x9a\xaa\x95\x91\x44\x8a\x4b\x0b\x6d\xa2\x8c\xa8\xe9\x3b\x6f\x54\x64\xca\xab\x56\xb1\x2a\x53\x46\x5e\x55\x84\x8a\x22\xc6\xe7\xa5\x32\x65\x50\x55\x8a\x24\xca\xc8\xa0\x44\x2f\xa6\x05\xd9\xb5\xbb\x9e\x99\x29\x82\x26\x31\xa2\x94\x1a\x74\x20\xc2\xef\xc1\x0a\x88\x60\xaa\x38\x55\x46\x44\x4d\x9c\x1b\x8a\xa6\xae\x8b\x6b\xc1\xe0\x34\x51\x4a\x04\x13\xd1\xc2\xdf\xc6\x5c\x40\x4e\xad\x4a\x93\xe5\xe4\x38\x95\x0e\xa7\x53\x13\x4d\xa1\x6d\x98\xd9\x3e\xc5\x62\x38\xc6\x96\x61\xcf\xba\xec\xbd\x39\x4b\xf1\x43\x31\xb3\xb9\x13\x35\xbc\x54\x55\xe3\x98\xcb\xde\xaf\x05\x77\xa4\x9a\x2d\x80\x62\x6b\xa5\xac\x83\xe3\x61\x01\x9b\xa1\x8f\xd3\x01\x64\x0b\x62\x69\xb6\x9c\x26\x44\xa4\xa2\xfd\xc1\xa6\xf7\xe2\x6c\x96\x24\x1c\xab\x51\xd5\x52\x35\x82\x93\x9e\x3a\x9b\x21\x7a\x66\x8d\xe3\x38\x51\xa3\xcb\x69\x52\x15\x55\xed\x23\x78\x89\xc0\x98\xcf\x44\x55\x43\xb3\xcc\xae\x11\xc7\x29\x1c\x2f\xd5\x09\xe3\x54\xb0\x76\x12\xcc\x69\x7f\xe4\xa8\x41\xd7\xca\x75\xf3\x38\x2d\x6a\xfa\x14\x59\xb6\xb8\x3b\x6b\x9e\x23\xaa\xc6\x32\xe5\x6a\xa4\x16\x09\xd7\xee\xf2\x04\xcc\x0e\x26\x38\x81\x61\x64\xd5\x17\x92\x12\x6b\x33\xd7\xda\xcb\x06\xdb\x9d\xf5\xf6\x00\x3d\x5e\x01\x27\x57\x8d\x87\x9b\x2b\x7a\x20\x54\x7b\x42\x87\xbf\x6b\xdc\x0a\xad\x7a\x8d\x24\xb8\x2a\x49\x3f\x51\x77\x42\x73\x38\xe8\x5e\x4d\x6e\x6a\x57\xf5\x6e\xe3\xb6\xdf\xed\xb4\x7a\xd5\x61\x8d\x7f\x9c\xdc\x8f\xe3\x16\x4a\x15\x42\x38\x42\xea\x83\xbb\xc7\x76\xa7\x4b\x34\x3a\x64\x4b\xe8\x57\xeb\x0f\xdd\xd6\xad\xd0\xec\xb6\xae\xc7\xc2\xdd\x98\x68\x3f\x92\x4f\xb7\xad\x61\xbb\x27\x8c\x1b\x7c\x8f\x1b\x4e\x6a\xfd\x46\xad\xf7\x40\xb4\x4f\xf6\xdd\x51\xe1\x24\x58\x39\x16\xf2\x77\xa1\x6d\x37\x90\x7e\xb7\x50\xf6\x6e\x83\x0a\x20\x2a\xc0\x36\x97\xa8\x40\xbd\xed\xee\x23\x28\x93\x79\x95\x59\xbb\x3e\x8a\xa6\x91\xf1\x42\x05\xe0\x15\x6f\x0b\x52\xbe\xa2\x49\x6b\xd7\xfb\xfa\x67\xb0\x7e\x1d\x72\x4f\x9c\x60\x98\x2a\x8b\x51\x2c\x43\xb9\xa8\x1c\x67\xfa\xe7\xab\xd7\xc3\x7e\xbd\x04\x5f\xa9\xef\x98\xf7\xf9\x5a\x01\x5f\xb7\xfb\x29\x9c\x47\x3a\xb4\xb5\x77\xf4\xf5\xbf\x69\x8e\x9a\x27\x8d\xa8\x00\xf2\x97\x4a\x63\x28\x86\x65\x49\x86\x66\x58\x57\x35\xcc\x15\x66\xd9\x4e\x6a\xaa\x4f\x45\x09\xce\xa0\x2e\xbb\xbc\x71\x0c\xdb\x08\x2e\x2c\x80\x88\x0a\x48\xd0\x26\xcc\xf6\xd8\xfa\x90\x15\x80\x7b\x0a\xad\x90\x36\x7d\x76\xe4\xe1\x15\xf0\xd5\x73\x05\xf1\x15\xad\x1d\x19\xfb\x76\x3d\x1e\xaa\x1c\xc7\x4c\xda\x4c\xb0\xaf\x63\x06\x1b\x0a\x02\x65\x1d\x4b\x92\x24\x62\x18\x4a\xa1\x55\x86\x41\x04\x8e\x23\x09\x63\x19\x45\x92\x31\x4a\xa9\xca\x2a\x09\x29\x5a\x66\x09\x95\xa1\x68\x92\x54\x31\x48\xe1\xa8\x26\xe1\x8c\x22\x91\xa4\x4a\x29\x14\x83\xc8\xaa\x13\x1d\x6a\x18\x45\x53\xb2\x24\x2b\x12\x56\x83\x64\xb5\x56\x85\xaa\x84\x49\x0a\x85\xc9\x32\xab\x52\x64\xad\xca\x42\x1a\x4a\x18\x55\x95\x64\x55\x25\x19\x88\x24\xb5\x2a\xe1\x90\xc6\x68\x9a\x96\x11\xa4\xbd\x96\x8a\xc7\xe2\x0c\x7d\x49\x52\x97\x14\x1b\x0f\x3f\xf4\x25\x49\x5f\x62\xf8\x77\x8c\x61\x08\x92\xc8\x7d\xea\xb7\x05\x9c\x61\x98\x0a\xc0\x69\xa7\x3e\x77\x3e\x15\x40\x38\xff\xe1\xfe\x7f\xc1\x8f\xf8\xe6\x0f\x07\x1a\xc7\x71\x5c\x83\xac\x4f\x1e\xba\x9f\x52\x9d\x16\xda\xc3\x77\xab\x8b\xf7\x3f\xaf\xd9\x91\x72\xbd\x78\xb3\x5a\x43\xe6\xe2\x53\x5b\xbe\x63\x16\x7c\xbc\x7a\xb2\xe8\x39\x5d\xbb\x53\x5f\x56\xdf\xf8\x9b\x6a\xef\xf6\x61\xcc\xac\x6e\x67\x86\xf1\x31\x5e\xbe\xbc\x76\x16\x2d\x4d\x6d\x18\xc6\xac\xfe\xf9\x74\xf3\xb9\xa4\x19\xde\x61\xcd\x3d\xdc\xdd\xdf\x4a\x2b\x6e\xf3\x69\xaf\xda\x82\x35\x1f\x3c\x7e\xbb\xc7\xa8\x01\xd3\x97\x3f\x3e\xbb\xf4\x9a\xb9\x9b\x52\x12\x73\x43\x3d\xdc\x35\x6c\x8b\x31\x54\x9a\xec\xb7\x9a\x6f\xed\x76\xff\xf1\x91\x5e\x4b\x83\x19\xd2\x89\x55\xf3\x76\xd1\x1a\x11\x8d\x26\x77\x0d\x3f\x85\x15\x7a\xbb\xfa\xe0\xa7\xc3\x5e\xbd\x2e\xb1\x96\x32\x75\x38\xdf\x0a\xd5\x2e\xfc\x5c\x10\xfd\xad\x30\xae\xd9\xe1\x12\x3e\x4f\xdc\x03\x5e\xed\x73\x5c\x13\xbb\x4e\x7a\xfc\x3f\xfd\xf1\x9c\x0a\x4b\x69\xf7\xf1\xa6\x40\x1c\xc7\x8d\x4f\x68\x52\x61\x19\x95\x22\x69\x84\x68\x46\xc1\x25\xa2\x26\x51\x12\xc3\xaa\x04\x09\x55\x8a\xc4\x71\xa9\x46\xd1\x2c\x24\xaa\x2a\x54\xf1\x2a\x46\x42\x05\x93\x28\x42\xa2\x49\x52\xc2\x6a\x12\x62\xd9\xac\xa6\xc0\xa4\x39\x3b\x8e\xe3\x18\x91\xda\x50\x36\x4f\xbd\x8e\xad\x4a\xb1\x44\x46\x4b\xc0\x0b\xb6\x04\xe2\xee\xe9\x05\x17\x96\x94\x81\x49\xd7\xb5\x49\x55\x5f\xf7\xde\xc7\x1f\x57\xe4\xfd\xc2\x78\xfd\xf6\xde\xe2\x7a\x76\x03\xbf\x21\x6e\x6b\xf5\x1a\xfd\x64\xb4\xc7\xe3\xb7\xbb\x1e\x3e\x34\x1e\x26\xf5\xfe\x44\xeb\xeb\x88\xfe\xc6\xb5\xe5\x5b\xac\x71\x7f\x63\x4f\x85\x8b\x4f\x7e\xfe\x0e\x9b\x3c\x56\xf5\x6a\xce\x6d\x09\xae\xa7\x76\x36\xff\x71\xae\xb3\x5a\xdb\xef\x2b\xee\xae\xff\xea\xd1\xf3\xf6\x74\xad\xe9\x7a\xc7\xb2\x26\x94\x5d\x47\x12\x71\x61\x0b\x4f\xf5\x05\x6e\xda\x0d\xa9\xf3\xae\x18\x90\x7d\x6d\x5c\x34\xd9\xf9\xb4\xfb\x79\xbf\xc4\x17\x4f\x9f\xcb\xa7\x8b\x01\xfb\xf6\x64\x37\x57\xec\xed\xa7\x32\xc0\x98\x29\x79\xd5\xee\x1b\xd4\xe3\xfa\x7a\xf2\xce\x4d\x5e\xfa\xd7\xdf\xea\x9e\xfc\x84\x96\x52\x7f\x4d\xf2\xb6\xff\x3f\x2d\x05\x3f\x8e\x97\xbb\x93\xdc\x4e\xb2\xe0\x84\x57\x9c\xad\x61\xe7\x18\x7e\x8e\xe1\x00\xc3\x2e\xdd\x7f\xa9\xde\x4c\x10\x34\x59\xcb\x7d\x5a\x25\xd8\x2a\x4b\xd7\x08\x96\xce\xf0\xf5\x64\x4f\xf7\x20\xfd\xdb\x95\x92\xfe\xa9\x3f\xdc\x68\xd5\xf5\xc5\x7a\x78\x53\xaf\x35\xf5\x26\xdb\x26\xb0\x8f\x97\xfa\x37\x0b\x9b\xda\xd6\xaa\xb3\xfa\xc4\x1f\x94\xe1\xe4\x11\xd6\xaf\x61\xcb\x75\x62\x3e\xc1\x89\x93\x3f\x81\x13\xa7\x39\xf9\xff\xf2\xe7\xc4\x73\xa6\xfc\x84\xaa\xc0\x36\xb2\x7d\xf3\xab\x94\xd5\x81\xd4\x71\x40\x4a\x8b\xcb\x61\x13\xcf\x88\xf7\xe3\x42\xc6\x12\xf7\xe3\xec\x41\x3b\xca\x28\x2e\x7b\x81\xc4\x4d\xca\x8b\x8d\x5e\x53\x76\x62\x1d\x5c\xbd\xa1\x2a\x8d\xd4\xe7\xe6\x4b\x75\x13\xc5\xff\xf9\x6a\x1b\x07\x8d\x11\x2a\xe0\xab\x6a\x1a\xf3\x43\x79\x94\x1b\xfc\xfd\x82\xf9\x94\x04\xe3\x85\xfd\x6f\xf3\x37\x13\x1a\x44\xaa\x4b\x5d\x41\xa6\xab\xfa\x9e\x13\x2f\xae\x8e\xde\xf4\xc7\xa1\x16\xcc\x1f\xd1\x1e\x69\x82\x28\xc5\x99\x13\xf6\xc0\x1d\xb0\x08\x56\x6a\x3b\xd0\xbe\x0d\x26\x75\x19\x31\xb1\x47\xac\xa6\xf7\x88\xb9\x8c\x88\xa8\x07\xa5\xf5\x89\xb9\x7c\xc8\x98\x27\x1e\x6b\x37\xd1\x51\xfa\xc5\xbc\xf5\xd4\x12\x3d\x63\xea\x6e\x9a\x23\x54\x75\x68\x56\x59\xa5\xd8\x1a\xae\x20\x95\x54\x55\x8c\x91\x31\x4a\x46\x04\x41\xa0\x9a\x52\xc3\x25\xb5\x4a\xd6\x30\x52\x92\x58\x06\x41\x5c\xad\xd5\x68\x04\x6b\x24\xc6\x50\x04\x4d\x29\x24\xa5\xa8\x4a\x95\x80\x92\xa7\xd2\x41\xd3\xbb\xa1\x61\x0f\x19\xa4\x7b\xe9\x73\x06\x24\x93\x35\xa3\xe0\x3d\x8d\x78\xac\x97\x27\xde\xd0\x2f\x48\x23\x5f\xe6\x46\x87\x19\x5d\xcd\x9a\x17\x68\x2a\x93\xb5\xbb\x07\xbb\x7d\x73\xf3\x39\xb9\x67\x56\xf7\xda\x53\x1d\x36\x96\x54\x97\xba\xe5\xdc\x3c\x8b\x0b\xc6\x31\xf5\x58\x1a\x13\xfa\xee\x4d\x0b\x98\x6f\x02\xdd\x45\x3d\x38\x7d\xf9\xb8\x85\xe3\x3b\x96\xae\x7f\xaa\x16\x8b\x30\xd9\x30\x85\xa7\x87\xcf\xfa\xe4\xfa\xb5\x65\xdc\xd4\x5e\xdf\x5f\x43\x73\x07\x5c\x97\x66\xc2\x03\x7a\x18\x3c\xaf\x73\xd6\xc4\x9c\xd3\x90\xb9\xea\x5b\xda\xfd\xa4\x85\xc8\x99\xb5\xe2\x3b\x0c\xd3\x78\xa3\x68\xed\x85\xf8\xb4\x67\x6d\xfd\xad\xa3\x0d\x56\x93\x67\xa1\x3e\xc0\x1f\x6f\x1f\xda\x33\x61\x25\x2f\x3b\x8d\x87\xcf\xeb\x6f\xc4\x70\xf9\x41\x77\xfb\x8b\x97\x45\x17\x4a\xcb\x55\x73\x3c\x79\x6e\x4f\x3a\x4f\x1c\xf7\xf3\xe7\x49\x38\x67\xbe\x0a\xe5\x9a\xfd\x24\xdd\xb8\x2d\x7d\x7f\x63\x8b\xa6\xfb\x3d\xa4\x46\x59\xdd\x7b\x94\x79\xad\x6f\x6d\x9b\xf2\xe1\xd3\x1e\xd4\x8f\x2c\x3f\x5e\xb7\xc5\xe4\x87\x6d\xe9\x4d\xd7\x38\xff\x35\xb6\x64\x8d\xa5\x41\x1a\x76\x95\x7a\x6b\xdc\xf1\x1f\x8b\xfe\x05\x69\xb4\x85\x6f\x9f\x78\x6d\xb0\xd6\x2c\x7c\xa6\xde\xb6\x1e\xe7\xfd\xc9\xd4\x5c\x0e\xbf\x8d\xbc\x02\xb5\xb9\x65\x70\x5b\x7e\x29\x9f\xd4\xe1\x81\x8b\xb7\x79\x98\xfc\xb9\xbc\x9f\x7c\xcf\x16\xff\xfc\x2a\xa7\x75\x63\xb6\xbb\x17\x2b\x18\x90\x7a\xff\x3b\x9d\xa8\xdb\x59\xe4\xc7\x91\xf0\xae\x0c\xb2\x56\x45\x4e\x57\xc3\x4a\x2c\x52\x6b\x8a\x04\x59\x48\x29\x12\x49\x92\xac\x54\x63\x54\x05\x32\x2a\x59\xad\xd5\x6a\x12\x0e\x55\x92\x94\x60\x95\x66\xa0\x42\xc9\x98\xa2\xb2\x55\x5a\xa9\x2a\xde\xc2\x0c\x7e\x48\x1a\xe1\xe5\x9d\x59\x9d\x1c\x8e\xe3\x04\x49\x66\xcc\x15\x79\x4f\xc3\x51\xd0\xf3\xc5\xab\x2e\xd3\xee\xbf\xf7\x5f\xa5\x1b\xa2\xcd\x91\x93\xfb\x97\x81\x79\x33\x7f\x79\xc0\x30\xf5\x8a\xb1\xba\x9d\xda\x1c\xe3\x07\xab\xeb\xc9\x05\xf7\x40\x72\x9b\x3e\xce\xfd\x64\xf4\x71\xde\x67\x8f\x76\x76\x13\xe6\x77\xff\xbe\x6a\xb1\xce\x23\xbe\xd1\xfc\x7c\x7b\x7f\xed\xd7\xfb\x86\xc0\x5d\x6b\xea\xdd\xe0\xa1\x69\x74\x9f\xdf\xed\xb5\x3c\x22\x67\xad\xbb\x46\x9f\xc2\xa7\xaf\x8a\xd5\x6a\xc3\xba\x30\x59\x61\xd4\xf0\xe2\xfe\x79\x82\x3d\x4c\x5f\x4d\xac\x51\xbf\xe3\xab\x02\x6c\xdd\x13\x37\x73\xd9\x22\x9f\x56\xdd\xb9\x26\x55\x47\x03\xf3\xb6\x5b\xa0\x6f\x8b\x38\x6d\xb4\x6f\x0b\xe9\xec\xc2\x8f\xb7\xe7\xba\x76\x51\xc7\xba\xd8\xf5\xd5\xda\x7e\x5e\x09\xf8\xec\x11\x83\xeb\x85\x81\xb3\x42\xfb\xe3\xbd\xdb\x58\xf7\x28\xbb\xce\xcb\x0d\x4f\x47\x72\x6a\x9b\x3d\xfd\xf1\xe2\x9b\xbc\x2d\x9f\xd2\x9f\x64\xb7\xe7\x03\xe4\x0b\xe6\x7a\x34\x39\x40\x3e\xc7\xfd\x7b\xfd\x59\x62\xdf\x5a\xdf\xdf\x16\x3d\xfd\x29\x53\xcd\x3c\x5b\x1c\x5a\x17\x87\xf8\x82\xdf\xb7\x4e\x19\xda\xa4\x78\x6e\x7c\xd3\xec\x37\x1e\xf5\x4f\xec\x7e\x45\x37\xaa\x52\x4d\xd6\x79\x96\x1a\x8c\x56\xaf\x3d\xe5\xf1\xba\x2d\xd5\x07\xc4\x74\x74\x6f\x09\xbd\xf1\x3b\xfe\x78\x6f\xb7\xaa\xd7\x37\x2c\x37\x1d\x7d\xf4\x9a\x93\xe7\x7b\x45\x5b\xe8\x5d\x81\x90\x1b\x94\x31\xff\xc6\x63\xf0\xb3\xb1\x2a\xd6\xb7\xa6\x9e\x0c\xb1\x7b\x70\xe2\xe6\x90\xa6\xe0\x1d\x89\xb2\x7b\x1b\x43\x1c\xbd\x43\x5c\x9a\xcd\xf0\x1b\x17\x71\x81\xe0\x6e\xd0\xb9\xe5\x06\x8f\xe0\x86\x7f\x04\xa7\x9a\x92\x77\x78\x43\xf2\x41\x92\x07\xa3\x8e\x71\x4d\x42\x9e\x24\x38\x17\x7d\x6c\x57\xee\x7e\x07\x71\x1e\xac\x5d\x54\x6c\x92\x72\x7b\x01\x03\x63\xa1\xd3\x1f\xf3\xe0\x74\x4b\x5e\x09\x9d\x52\x50\x89\x9c\x29\x50\xd2\x34\xc7\xa9\xd6\xd2\x8a\x97\xaa\xd4\x94\xa9\xbf\x22\xa7\xc7\x1e\x4d\xb3\x64\x21\x59\x9a\x66\xc0\x2a\xac\x79\xea\x00\x3f\x77\x0c\x7d\x5c\xed\xd3\xc4\x64\xe9\x9f\x09\x2d\xd7\x02\xd1\x83\x90\x7d\x45\xdc\x43\x93\x8b\xbd\x20\xe3\x9d\xaf\x1c\xe1\x02\x7a\x42\xbc\x31\x8c\x87\x1d\xe1\x0a\x48\xb6\x89\x50\xb8\x75\xa5\xa3\xf1\xcf\x70\x3e\x18\x8f\x7f\xfe\x47\x21\x44\x29\xed\x3a\x74\xfe\xf4\xbe\x70\xb6\x2c\xc2\x48\x22\xa3\x81\x28\x1e\x8f\xb8\xb2\xf3\xba\x4e\x12\x38\xf7\x04\xed\x03\x90\xb9\x6f\x2d\x15\x82\x15\x7f\xd7\x29\x09\x8d\x7f\xec\xf7\x01\x78\x3c\x0e\xc5\x10\xc5\x5e\xa4\xaa\xec\xbe\x33\x95\xd8\xe4\xc3\xe7\x98\x97\x47\xea\x47\x09\x0f\x70\x8c\x5d\x18\x76\xb0\x47\x28\x82\x38\xe9\xf5\xe1\x4a\xf0\xaa\x70\x1a\xd8\xed\x0b\x1a\x07\xc2\xd4\x94\xc2\x00\xb7\xef\x4a\x56\x12\xdf\x79\xce\x01\x1d\x1c\x3d\x7f\x0c\xdc\x3e\xaf\x30\xf4\x94\x50\xb5\x97\x26\xc9\x0a\x04\xa7\xec\x1f\x43\x01\x9f\x57\x8a\x4f\xef\xa9\x42\xf4\xc5\xd7\x5d\x25\x42\x77\x0a\xec\xdb\x1a\x43\x3c\xf6\x35\x7e\xb6\xa1\x63\x97\x24\x1c\x6a\xeb\x28\xbb\x30\xe4\x60\x37\x42\x04\x63\x32\xa2\xdd\x8b\x1e\x0e\x87\xb5\xc3\xb3\x58\xf7\x96\x04\x30\x74\x65\xc5\xde\xd5\xba\xe5\xb1\xbf\x4b\xe6\xb9\x5f\xd2\x65\x1c\xfb\x03\xde\x65\x16\x43\xae\xa0\x18\xce\xd8\x31\x08\xd9\x00\xbd\xdb\x45\x8e\x02\xcf\x65\x55\x08\x5c\xf0\x12\x43\x2a\xb4\xf8\x6d\x29\x87\xe2\x8b\xf1\xcb\x03\xb9\x7b\xbe\x43\x2e\xd2\xe3\xd8\x31\xc2\xad\x28\xca\x5c\x6b\x1e\x07\x5b\x21\x4c\xd9\x58\x62\xd7\xf2\x1c\x84\x28\xca\xab\x70\x8d\x06\x27\x48\x24\xe2\xdb\xb9\x69\xe8\x20\x84\x71\x6e\xc5\xda\xad\x0f\xb0\xb2\x73\xe8\x45\x65\xe7\xe0\x94\x14\x25\x8e\xd0\x6f\xfb\x7c\xf2\x10\x97\xcc\x8e\xe2\x17\x44\x1d\x64\xdd\x12\x86\xcd\xb5\x5b\xfe\xcd\x57\x07\x1a\x34\x57\x40\x64\x9c\x16\xbc\x48\x13\x1d\x19\x79\x84\x25\xb0\x1f\xee\x07\x59\xbc\xf3\x11\x27\xb4\xb2\xec\x7b\xcd\xf6\xf5\x87\x4c\xae\xb9\x69\xbf\x43\x94\x03\x34\xf1\x02\xb7\xe3\xa0\x4d\x62\x9d\x9b\xbe\x15\xf5\xe4\xe8\x8d\x75\x47\x75\x86\x08\xeb\x7d\xf2\xcd\xe2\x57\xf4\x1d\xdd\xd0\x3b\x87\x13\xe6\xc2\x8f\x15\x28\xae\x4c\xf8\xc6\xc2\x5f\x65\xff\xf0\x79\x94\x79\x9a\x84\x68\x8b\x2b\x91\x78\x83\xe3\xaf\xd2\x26\xf1\x98\xcd\x3c\xb5\x92\x0a\x15\xd7\x6f\x73\xc1\xe5\xaf\xd2\x69\x73\xe6\x4c\x9e\x1e\xa9\xb3\x5d\x39\x17\x7b\x1e\x15\x78\x9c\x7b\xe2\x00\xb8\x6c\x03\xcf\xbc\xd3\xf4\x38\x2d\x3c\x4b\x44\x11\x1d\x72\xc6\x75\xb9\x37\xbc\xfe\x12\x2d\x62\x11\x2c\x15\x7b\x7e\x10\x4b\xb8\xd1\xf6\xa8\x6e\xb3\xcb\x7f\xef\xa1\x7e\xd6\x1d\xbe\xfb\x5a\x39\x83\x67\x6e\x8a\x70\x7a\x1a\x9c\xe3\x78\xfe\xe7\x9f\xe0\xc4\x32\x66\x4a\x68\x35\xed\xe4\xf2\xd2\x46\x1f\xf6\xd9\x59\x05\xa4\x13\xca\x86\x52\x8c\xd0\x9b\x8b\x4f\x27\x95\x8c\xe5\xf4\xd9\x2e\x24\x3e\x42\x9a\x0d\x20\x42\x1a\x83\x70\x06\x26\x6d\x7e\xc0\x7b\x4e\x06\x7e\x02\x92\x2c\xbc\x10\x1d\xdc\xd8\x1c\xdc\x4c\x72\xf3\x7b\x96\xa3\x7d\xb1\xa0\xd5\x1b\xf0\x9d\x2b\x61\xb3\x04\x04\x06\x7c\x8b\x1f\xf0\x42\x83\x8f\xdf\xa4\xe8\x3e\xed\x09\x60\x7c\xd7\x74\x5c\x66\xc0\x7b\x97\x97\x38\x3f\x35\xf9\x2e\x3f\xe2\x41\x83\x1b\x36\xb8\x26\x9f\x7d\xe0\x66\xf2\x09\x89\xb1\xbb\xb1\x8f\x61\x8c\xa8\x9c\x9c\x45\xb2\x34\x24\x51\xfb\xc4\xa7\x8d\x12\x8d\xe5\x27\xfa\x39\x2b\x8a\xa9\x96\x88\xdc\x49\xfe\x2f\xda\x21\x8c\x23\xc9\x0a\xc1\x2c\x41\xb6\xc3\x94\xb3\x40\xda\x45\xf0\xff\x8a\x19\x52\xc0\x44\x6d\x91\x30\x0d\x76\x5c\xa7\x48\xbe\x8c\xff\xdf\x35\x48\xba\x6b\xec\xcc\x21\x15\xf5\x8e\x3b\xc3\xb2\xa7\x26\x1a\xf6\xbb\x40\x81\x36\x74\x5c\x0c\x28\xcb\xf9\x02\xc8\xc6\x7c\x31\x43\x36\x72\x75\xf8\xbf\x00\x00\x00\xff\xff\x39\x58\xe3\x11\x44\x82\x00\x00") - -func self_sendHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _self_sendHorizonSql, - "self_send-horizon.sql", - ) -} - -func self_sendHorizonSql() (*asset, error) { - bytes, err := self_sendHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "self_send-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0xcb, 0x5a, 0xd2, 0xdf, 0x14, 0xa8, 0xc3, 0x58, 0xcc, 0x9, 0xe2, 0x38, 0xf2, 0xc6, 0xe7, 0x3f, 0xb2, 0xfb, 0xa0, 0x1a, 0x21, 0xb4, 0x13, 0x5e, 0xee, 0xb1, 0xbc, 0x8, 0xcc, 0xe2, 0xb1}} - return a, nil -} - -var _send_to_issuerCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x59\x93\xe2\xb8\xf6\xe7\x7b\x7d\x0a\x47\xbd\x64\x75\x90\x7d\x53\xb6\x2c\x2f\x5d\x53\x37\xc2\x60\xf6\x7d\x5f\x26\x26\x2a\x64\x49\x06\x03\xb6\xc1\x0b\xdb\xc4\xfd\xee\x13\x18\x92\x2d\x81\x24\x21\xab\xfb\x4e\xfc\xcb\x0f\xd9\x5d\xf8\xf8\x9c\x9f\x7e\x3a\xe7\x68\xb3\xa5\x3f\xff\xfc\xf2\xe7\x9f\x5c\xc5\xf5\x83\xbe\xc7\xea\xd5\x02\x47\x71\x80\x0d\xec\x33\x8e\x86\xf6\xe4\xcb\x9f\x7f\x7e\x59\xdf\xd7\x43\x7b\xc2\x28\x67\x7a\xae\xbd\x17\x98\x31\xcf\xb7\x5c\x87\x53\xff\x25\xfd\x8b\x3f\x90\x32\x96\xdc\xa4\xff\x73\xfd\xf8\x89\xc8\x97\x7a\xb2\xc1\xf9\x01\x0e\x98\xcd\x9c\xe0\x67\x60\xd9\xcc\x0d\x03\xee\x07\x07\xbe\x47\xb7\xc6\x2e\x19\xbd\xfd\xd5\xa2\x63\xf6\xd3\x72\x7e\x06\x1e\x76\x7c\x4c\x02\xcb\x75\x7e\xfa\xcc\x5f\xeb\x7d\x2b\x4c\xc6\xd6\x5a\x35\x73\x88\x4b\x2d\xa7\xcf\xfd\xe0\x9e\x9a\x8d\x94\xf2\xf4\xfd\xd5\xb6\x43\xb1\x47\x7f\x12\xd7\x31\x5d\xcf\xb6\x9c\xfe\x4f\x3f\xf0\x2c\xa7\xef\x73\x3f\x38\xd7\xd9\xea\x18\x30\x32\xfa\x69\x86\xce\xc6\x96\xe1\x52\x8b\xad\xef\x9b\x78\xec\xb3\x23\x33\xb6\xe5\xfc\xb4\x99\xef\xe3\x7e\x24\x30\xc7\x9e\x63\x39\xfd\x8d\x88\xe7\xce\x7f\xfa\x8c\x84\x9e\x15\x2c\xd7\xca\x4d\xf3\xfb\x96\x00\x86\x3d\x32\xf8\x39\xc1\xc1\x80\xfb\xc1\x4d\x42\x63\x6c\x91\xe7\x35\x63\x04\x07\x78\xec\xf6\xbf\x7f\xf9\xa2\xd7\xca\x15\x2e\x5b\xd2\x93\x1d\x2e\x9b\xe2\x92\x9d\x6c\xbd\x51\xdf\x4a\xfe\x2b\x9c\xf4\x3d\x4c\xd9\xc0\xf2\x03\x63\xe9\xb3\xe9\xf7\xab\xd2\x3e\x99\x4c\x43\xd7\x0b\x6d\xff\x36\x61\xe6\xcc\x6e\x91\x1c\x33\xda\x67\xde\x2d\x92\x6b\x9c\x26\x63\x37\x4a\xde\x20\x66\x30\x3f\x70\x4d\x93\x79\x96\x43\xd9\xe2\xba\x2c\x26\xc4\x0d\x9d\xc0\xc0\x63\xec\x10\xe6\x7f\xff\xa2\x15\x1a\xc9\x1a\xd7\xd0\xe2\x85\xe4\x81\x74\xb9\x54\xe8\x9e\xa1\xd7\xf5\x96\x5c\xa4\x3d\x51\x2e\xd5\x1b\x35\x2d\x5b\x6a\x1c\x3c\x74\x2c\xf8\x73\x32\x62\xcb\x5b\xf4\x07\x8b\xf7\x55\xef\x64\x3e\xa0\xd5\x64\x37\x60\x3e\x14\xbb\x5d\xb7\x17\xfa\xc1\xd8\x72\x98\x7f\x4d\xf3\x4e\xe8\x66\xbd\x6b\x14\x2c\xca\x06\x57\xf4\xee\x85\x6e\xd7\xbb\x73\xf9\x6b\x7a\x77\x42\x37\xeb\xdd\xc8\x5b\x8e\xe9\x5e\xd1\xbb\x17\xba\x59\xef\x24\x34\xfc\xd0\xb8\xa2\x73\x23\xf0\x11\x7d\x63\xcb\x1f\x4c\x43\x16\x5e\x63\xf6\x50\xec\x76\xdd\x8c\x79\xd7\x68\x8d\xee\xdf\xac\x2d\x0a\xe3\x6b\xea\x36\x02\x37\xeb\xdb\x64\xa5\x01\xc3\xf4\xba\xda\x23\xb9\x5f\xac\x7d\x9b\x29\xd9\xf4\xe7\x8d\x66\x0c\xec\x5c\x51\x6e\x60\xe7\x66\xc0\xdb\xec\x77\x0d\xeb\xab\xc8\x47\x75\xae\xfb\x00\xef\xab\x5d\x4b\x6d\x35\x47\xb2\xa7\x8a\xcf\xa6\xdc\xeb\xb2\xbb\xd4\xf8\x9e\xd8\x3e\xd1\xbd\x23\xb9\x4b\x5c\xd7\xe5\xf6\x89\xe8\x1d\xb9\x5d\x62\x79\x57\xee\x26\x7c\xfb\x84\x72\x5d\x6e\x93\x24\xde\x95\xd9\x85\xfc\x3b\x92\xeb\x38\xbe\x2e\xb2\x89\xcd\xeb\x32\x47\xa1\x70\x5d\xd4\xc0\xce\x75\x81\x57\x57\xbd\x49\x6a\xed\x79\x5b\xc1\x64\xa7\x91\x2c\xd5\xb3\xe5\xd2\xa1\xf0\x78\xd2\xf7\xa7\xe3\xad\x44\x3d\x91\x49\x16\xb5\x37\xba\xbe\x7f\xd9\xf4\x8d\x4b\xd8\x66\x7f\xbd\xfe\xc6\x35\x96\x13\xf6\xd7\xf6\x91\xef\x5c\x9d\x0c\x98\x8d\xff\xe2\xfe\xfc\xce\x95\xe7\x0e\xf3\xfe\xe2\xfe\x8c\xba\xcc\x89\x5a\x52\x6b\x24\x5f\x35\xbf\xea\xfb\x72\xa4\xf1\xf8\xe6\x56\x71\xa2\x5c\x2c\x26\x4b\x8d\x2b\x9a\x37\x02\x5c\xb9\x74\xac\x80\xcb\xd6\xb9\xa7\xd7\xfe\xed\xeb\x6f\x7e\xa4\xe4\xe9\xd4\xf2\x6b\xf1\xb7\x36\x77\x0c\xbd\x5b\x9e\x23\x2e\x4b\xe5\xc6\x09\x9f\x5c\x3b\xdb\xc8\xec\x60\x1d\x76\x68\x8f\xcc\xef\xb5\x9c\x00\xf9\x48\xe1\xdf\x28\x89\x08\xa8\x14\x5e\x26\xfd\xf5\x28\x66\xe2\xb9\x84\xd1\xd0\xc3\x63\x6e\x8c\x9d\x7e\x88\xfb\x2c\xa2\xe1\xc6\x0e\xf8\x5a\x8c\x32\x13\x87\xe3\xe0\x67\x80\x8d\x31\xf3\x27\x98\xb0\xf5\x68\xe2\xe9\xe4\xee\xdc\x0a\x06\x3f\x5d\x8b\x1e\x0c\x10\x8e\x0a\x7b\xe8\x90\xdb\x62\x46\xae\xbb\x2f\xe4\xab\x03\x9c\x23\x7c\xe3\xe5\x87\x49\xf7\xdb\x17\x8e\xe3\x5e\x7f\xb1\x28\x47\x06\xd8\xc3\x24\x60\x1e\x37\xc3\xde\xd2\x72\xfa\xdf\x90\xf4\x47\x54\x37\xa5\x66\xa1\xf0\x1c\x49\xaf\x1f\x74\xb0\xcd\xce\x08\x2b\xca\x39\xe1\x19\x1e\x87\xe7\xa4\x79\x5e\x38\x15\x1f\x63\x3f\xb0\x5d\x6a\x99\x16\xa3\x9c\xe5\x04\xac\xcf\xbc\x9d\xc8\x97\x3f\x4e\xeb\x7e\x17\xc5\x0f\x72\xe1\xdf\x45\xc4\x76\x20\xc0\x19\x56\xdf\x72\x82\x93\x9b\x3e\x9b\x3a\xa1\x7d\xfe\x9e\x13\xda\x7e\x68\x30\x27\xf0\xd6\x43\xc1\xd3\x62\x6e\x64\x2c\xc7\x1c\xe3\xf5\x88\x91\x32\x3f\x38\x0f\x67\x23\x38\x70\x6d\x46\x5d\x1b\x5b\xce\x19\x29\x51\x3c\x05\x1d\x0c\x3c\xe6\x0f\xdc\x31\xf5\xb9\x80\x2d\x4e\x91\x99\x63\xdc\xbf\x84\xe8\x6a\xdd\x6c\x19\x09\xd7\x56\xc7\x16\x36\xac\xb1\x15\xac\x0b\xb7\x29\xff\x2b\x25\xe3\xf1\xb5\xdb\x56\xdf\x59\xf7\x85\xd6\xb0\x36\xbf\x1c\xf4\x06\x76\x5d\x8b\x2d\xe9\x3f\xa3\x61\x35\x97\xc8\x24\x13\x79\xee\xdb\xb7\xd7\xaa\xf8\xf7\x0f\x0e\xfc\xf1\xc7\x95\xa7\x4f\x01\x9e\xea\x79\x53\x80\xf7\x34\x1e\xd5\xe5\x89\xb6\xe3\x7a\x7e\x4f\xd3\x5b\x7a\x4e\xd4\x9d\xe1\x6f\xa3\xf3\x6d\x60\xac\xdb\xbf\x7b\x63\x62\xdd\x65\xdc\x84\x83\xe3\x52\x76\x18\x0b\x47\x31\xf0\xd6\xe8\x71\xfb\x7c\xaf\xf9\xe3\x8e\xf1\x06\xc8\xf6\x37\xec\x0f\x0e\xc0\x48\x6f\x7c\x7b\xe2\xb1\xd9\xbb\x42\x46\x48\x46\x2c\x18\x5b\x7e\xf0\xae\xe8\xae\xb7\xfd\xea\xee\x9b\x9f\xc9\xd8\xf5\x59\x60\xd9\x17\x22\x3f\x4a\xac\x67\x62\xeb\xa0\xce\x8f\x3b\xf5\x3b\x7d\x27\xf5\xbd\xb7\x73\xc1\x75\x2e\x8d\x0d\x8e\xd5\xec\x4b\x71\xc9\x5b\xb6\x9d\xaf\x7b\x6b\x6c\x3b\xf0\xfa\xb6\x0b\x72\xe6\xdd\x98\x41\x37\x33\x2f\xf4\x52\x06\x8d\xdc\x1d\xfb\x3e\x0b\xce\xf1\xb9\x89\xd5\x8b\xb7\xb1\xbd\x0e\xab\xf3\xaa\x27\x9e\x45\x98\x73\x21\x89\x45\x37\x2f\x65\xb8\xe8\x26\x47\xdd\xd0\x18\xb3\xb5\xbf\x11\x2b\x9a\x91\xfc\xd4\x2c\x7a\x50\xc3\xdb\x21\xeb\xa6\x2c\x27\xf5\xba\x2d\xe0\x05\xdf\xd8\x3e\xb9\x65\xf8\xe4\xd1\x57\xde\x2f\x39\xc4\xa6\xc3\x7e\xaf\x3f\x6c\x86\xf5\x1b\x77\xb0\x26\xe7\x1a\x7e\xf4\x26\x72\x5d\x2f\xd8\xb1\xa1\x27\x53\x5a\xb3\xd0\xe0\xc0\x69\xb3\xc9\x16\x01\x0e\x02\x66\x4f\x02\x6e\x1d\x16\x7e\x80\xed\x09\xb7\xee\x32\xb9\xe1\xe6\x17\x6e\xe5\x3a\xec\x6d\x63\x6b\x62\x6b\x1c\x7a\x07\x4d\xed\x25\x0b\xc1\x72\xc2\xde\xaf\x94\xcd\xb4\xc4\x81\xde\xb7\x69\x7f\x67\xf1\x42\xed\x6c\x67\x36\x5c\xef\xb4\x52\xbf\x45\x4c\xfc\x9b\x03\x7f\x70\x5a\x49\xe7\x36\xff\xfc\x5f\x3f\x38\x09\x21\x88\xfe\x38\x5b\x57\x87\xc3\xb0\xbb\xab\xec\x70\x96\xe7\x30\xe7\x5e\x60\x63\x33\xd1\xb6\x8e\xba\xb3\x80\xd6\x63\xc7\x07\xa0\xf8\xa1\xb1\x05\xe1\x31\xff\xa8\x01\x82\x67\x7b\x8c\x1e\xc3\xbb\x58\x7a\x8b\xe7\x60\xcc\x7b\x2f\xa6\x83\xc9\xba\x1b\x5a\xc6\x0d\xb0\xa9\xcf\xae\xb5\x30\x6f\x71\x1e\x8c\xe1\xef\xc5\xb9\x57\x71\x3b\xce\x37\x8d\xdc\xc9\x7d\xe6\xcc\xd8\xd8\x9d\xb0\x77\x9a\xb4\xbd\xe9\x07\x1a\xa2\x83\xe9\x8e\x07\x28\x78\x9d\xaf\xfd\x76\x4b\x3d\xec\xbd\xe8\x3d\x22\xa6\x17\x1a\x9a\x63\x12\x5e\xe7\x81\x8f\x34\x9e\x12\x71\x64\xed\x22\x19\xfb\x39\xa2\xbb\xc9\xd8\x4f\x8a\x7f\xdb\xc7\xed\xf1\xe0\xed\x4c\x4c\x5d\x8b\xee\x83\x19\xae\x7b\x51\x1d\x2c\x01\xdc\x33\xec\x8a\x5a\xfc\x2b\x99\xda\xf2\xfd\x90\x79\xb7\xab\x22\x2e\x3d\x3b\x3a\x7d\x43\x4b\x30\xb6\x6c\xeb\x42\x8f\xe2\xea\x58\xf0\x9f\x1c\x55\x1d\x78\xe7\xc1\xaa\xca\x5d\xa3\xa8\xc3\xe7\x3f\x6b\x1c\x75\xa0\xf3\xfe\xf1\xcf\x35\xad\x9b\x4a\x3b\xd1\xb4\xad\xc9\x7f\x9f\x0f\xbc\xa3\xe9\xde\xbb\x9d\xfc\x70\x0d\x6d\xe3\xe6\xc1\xe2\x28\x15\xdf\x30\xde\x38\x75\xc0\x45\xb4\x4a\x79\xf1\x2e\x19\x60\xa7\xcf\xce\x0e\xec\x0f\xc9\x39\x5c\xb6\xbb\x3f\x57\xef\xe7\xce\xef\xa7\xe8\x6f\xe6\xc7\x70\xe9\xf2\x1c\x39\xc1\xc2\x63\x7e\x38\x3e\x9b\xdd\x83\x85\xcd\xde\x1d\xcf\xed\x97\x58\xef\xe7\xf3\x64\xdd\xe2\x5e\x52\x4f\x56\x9c\xbf\xdd\x44\xdc\xf6\xa1\x6b\xec\x6d\x45\xce\x11\x71\x9b\xdb\x9d\xac\x70\xdf\x43\x94\xbe\x1e\x59\x9b\xae\xf7\xce\x64\x28\xa7\x6b\x0d\xed\x1d\xce\xae\xab\xf4\x3f\xac\x2f\x5b\xaa\x27\x6b\x0d\x2e\x5b\x6a\x94\xf7\x93\x8a\x2d\xad\xd0\x4c\xd6\xb9\x6f\x4f\xe9\x78\xad\xd2\xcd\x64\x0b\x42\x22\x0b\x53\xa5\xaa\x18\xef\x14\x52\xc5\x92\x5e\x48\xe5\x9a\xa5\x4a\x53\xc8\x74\x61\xaf\x98\xaa\x67\xca\xa5\x66\x22\x59\xd6\xea\x6d\xb9\x9a\x90\xcb\x1d\x21\xf3\xf4\xcc\xa9\xdb\x4b\xde\xfc\x47\x01\xe0\x99\x13\x9e\x39\xf0\xbc\x61\x99\x7b\x7a\x7a\xe6\x9e\xb4\xaa\xa6\x69\xda\x8f\x1f\x4f\xd1\x0d\xe1\xf5\xde\xfe\xef\x1f\xdf\xdf\x43\x98\x10\x60\x35\x25\x64\x9a\x49\x24\x68\xc5\x4e\x33\xd5\xcc\x40\xad\x9b\xd3\x3a\x9d\x74\xa7\xd3\x12\x5a\x99\x4e\xb7\x5b\x93\x92\xdd\x4e\xb2\x51\xc9\xeb\x9d\x5e\x5d\x6b\x4b\x72\xa7\x2c\xee\x11\xae\x81\x29\x48\x51\x55\x28\x22\x15\x5e\x47\x28\xde\x85\xb0\x93\x4f\x4b\xb5\x92\x58\x2e\x65\x93\x95\x44\xb1\x94\x8a\xcb\x50\xd0\x44\x28\xf5\x50\xa5\xa4\xd7\x6b\x85\x74\x3b\x2f\xa7\xe3\x85\x44\xb1\x5a\xc8\xa6\xca\x62\x5d\x4e\x76\xdb\xad\xe6\x0e\xa1\x72\x84\x50\x7c\xe6\xf8\x2b\x08\xd1\x59\x84\x17\xbc\xe6\x74\xb6\xed\x01\x07\xbc\x3c\x87\xf6\x51\x2f\x3c\x9e\x47\xdb\xd1\x28\x41\xaa\x2a\x26\x82\x12\x63\x92\x42\x79\x43\x90\x0d\x64\x28\xaa\x29\x40\x6c\x22\xc8\xf3\x86\x8c\x24\x15\x0b\xa2\x89\x4d\x5e\x04\x10\x53\x60\x20\xc1\x90\x20\x34\x80\x6c\x30\x55\x5d\x53\x05\x1e\xbc\xd6\x3a\x90\x2c\x60\x81\x41\xc1\x34\x05\x51\xc1\x40\x36\x00\x93\x81\x49\x79\x53\xa2\x90\x57\x08\x6f\x62\x42\x05\x60\x48\x84\x00\x85\x40\x48\x91\x2c\x23\x01\xa9\x8a\xa4\xf0\x02\xc2\xbc\xf4\x14\xd5\x1f\x58\x57\xdc\x7f\xed\x15\xef\xe4\x2d\x71\xf9\xb2\xac\xe7\xe3\xb2\xee\xe8\x6a\x46\x00\x8b\x61\x3c\xe6\x83\x7e\xe0\xcf\xb3\xf3\x15\xdf\xa1\xf5\x76\x17\xc7\x73\x38\xd5\x5f\xcb\x27\x4b\x62\x01\xaf\x26\x42\xf5\x5d\xcd\x3d\xad\xc3\x8b\x91\x58\x7c\xf4\x37\x14\xe4\x53\xaf\xa7\x93\x50\xbf\xe0\xa8\x40\x02\x10\x98\x92\xa9\x40\x49\x81\x94\x98\xaa\x41\x0d\x09\x22\x49\x04\xd4\x64\xb2\x22\x0b\x02\x10\x44\x43\x02\x50\x95\x81\x44\x65\xd5\x60\x54\x26\x88\x29\x8a\x09\x4c\x59\xdd\x38\xd9\xa7\x38\xbb\x00\x15\x81\xf2\x88\x67\xa6\x82\x05\x9e\xa9\x82\xa1\x52\xca\x43\x89\x42\xc1\x80\x82\xac\x98\x3c\x12\x98\x44\x00\x05\x8a\xa8\xa8\x32\x84\x44\xe1\xb1\x2c\x28\x94\x32\x43\x8a\x70\x08\xcf\x1c\x8f\x90\x8a\x64\x55\x52\xd0\xd6\x63\x13\x42\xa5\x37\xe4\x4b\x21\x72\x81\x91\x93\xdb\xa2\xb3\x2c\xcf\x9a\x8b\x34\x6c\x4d\xdc\x51\x6c\x96\xd2\xca\x41\x82\xcf\x0b\x45\x39\x2e\x4b\xbd\x66\x8e\xa9\x65\x34\xd2\x56\xa5\x55\xf8\x22\x4d\x40\x2f\xe7\xf6\x14\x65\x00\x1a\x7a\x68\xc0\xb0\xeb\x8f\x7b\x39\x99\xd4\xfd\x5a\xbb\xbf\x61\xb8\x53\x69\x15\x73\x91\x77\x64\x77\x7f\x36\xe9\xcd\xdf\xff\x7b\xae\x55\xaa\xaf\xbe\xe3\x54\xb3\x79\x6b\x5e\x95\x97\xfc\xb2\x2f\xa9\xc9\x1a\xf0\x92\x31\x25\x08\xda\x8b\x21\xad\xab\x74\x32\xf0\xb2\xb2\x41\x1d\xa9\x5b\x17\x13\xe5\x04\x68\x65\x66\x96\x95\x99\xe4\x11\xac\x95\x82\xa2\x57\x74\x86\x8b\x66\x68\x68\x20\x5b\xcf\x91\xd5\x32\x3e\x59\x0e\xa9\x24\x6c\x14\x67\xcf\x78\xb4\x9e\x3d\xe7\x15\xaf\x1e\xad\x83\xdc\x2f\xf2\xbb\x5f\x77\xdd\xe8\xd1\x02\x0f\x79\x22\x4a\x14\x22\xc2\x44\x85\x10\x84\x20\x30\x31\xe6\x89\x40\x08\x46\x94\x61\x45\xe2\xb1\x49\x4d\x20\x43\x80\x24\x62\x00\x93\x97\x15\x64\x40\x03\x08\x04\x8b\x32\x8e\xbc\xf1\x13\xa2\x02\xf2\x92\x22\x18\x8a\xca\x63\x24\x23\x48\x55\x2c\x2a\xa2\x21\x18\x06\x4f\x65\x45\xc1\xc8\x90\xa9\x00\x45\x51\x15\x09\xc0\xcc\x80\x82\x21\x88\x22\x93\x24\x44\x4d\x20\x28\x48\x34\xe1\xd3\x33\x07\x0f\x3c\x5a\x7a\xf5\xe8\x79\x57\xd7\x85\x98\x8e\x75\x58\xb1\xd5\x60\xd8\x1a\xe9\x26\x12\x89\xa5\x8d\x82\x7e\xb9\x13\x0f\x98\x21\x77\x16\xcc\xaa\xe8\x70\xa4\x99\x79\xab\x3f\xf0\x46\x70\x5a\xcc\x36\x6a\xd9\x31\xce\xc5\xfc\xca\xb2\xd4\xc9\x25\x9a\x45\xa9\x57\xa7\x2b\x34\xb3\xba\x15\x39\xbd\x98\x17\x37\x9e\x13\x79\x74\x7f\xcf\x78\xa1\x90\xaf\x18\x45\x77\x98\x89\xd5\x6a\xb1\x46\x3d\xae\xe7\xd3\xf1\x97\x20\x34\x33\x82\x5d\xe0\x05\x42\x12\x19\x8f\xcf\x39\x82\xbc\xac\x68\x0b\x9c\x08\x73\xe9\x31\x6d\x08\xb8\x9e\xf4\x3d\x9f\xb2\xec\xc4\x30\xeb\xa5\xe4\xb8\x98\x08\xfd\xa5\x3f\x6a\xd8\x3d\xaa\x24\x06\x4d\x65\xbe\xd6\x5c\x3c\xe3\xb1\x49\xff\x5c\xad\xff\x0f\xf0\x58\x5e\x45\x48\x50\x19\xcf\x10\x61\x12\x22\x58\xe5\xa9\x4a\x0c\x11\x11\xc6\x4c\x1e\x10\x93\x28\x2a\xe0\x01\x84\x8a\x44\x20\x10\x45\x01\x2a\x0a\xe3\x11\x25\x84\x49\x92\x4a\x0d\xb4\xf6\xb6\xcf\xf0\x7a\xc8\x90\x89\x19\x84\x90\x62\xc6\x20\x01\x92\x2a\x32\x13\x2b\xd0\x30\x54\x03\xc8\xc4\x90\x18\x02\x84\xf2\x92\x24\x53\x6c\x88\x00\x60\x03\x48\x44\x42\x22\x35\x14\xb6\xf6\xe9\xa7\xa8\xcb\xb9\xf3\x58\xf9\xd5\x63\x97\xc9\xc5\x22\x0d\xf8\xd5\x68\x58\x6c\x35\x74\xc9\x25\x85\xe2\x84\x4a\x6e\x17\xbf\x98\xf1\x55\xbc\xbd\x9c\x2b\x9d\x81\x51\x9e\x17\xf2\x35\x09\x98\x2a\xd3\x2b\x18\x27\x5b\x09\x4f\xad\x96\x3a\xcd\x26\x23\xd0\x6b\xa4\x0c\x63\xe0\xc1\x82\xde\x68\xe5\xf9\x3e\x5a\x56\x8d\x99\xbc\x49\x6f\x91\xc7\xce\xf7\x8c\x97\x66\x6e\x15\x99\x60\x20\x76\xca\xa1\xb0\x5a\xd1\xd2\x24\x26\xe0\x6e\xca\x5a\xb5\x8b\x2f\x0d\x2b\xef\x27\x52\x5e\x7f\x1a\xcb\x78\x2d\x29\x1b\xeb\x48\xe2\xaa\x82\xe5\xe1\x3c\x3d\x2e\xc7\xdc\xb2\x6c\xcf\xcd\x82\x31\xd6\x4b\x29\xdb\xc4\x81\x96\xf0\xe2\x7e\xaf\x29\x88\x48\xb4\xa2\x88\xa8\x9e\xf1\xd8\xf4\xd9\x2e\xc4\xff\x00\x8f\x25\x82\x0c\x25\x99\x27\x2a\x0f\xa0\x09\x44\x40\x18\x8f\x64\x2c\x20\x48\xa1\x4a\x14\xc2\x63\x0c\x44\x26\x52\xc4\x24\x4c\x88\x84\x05\xc8\xf3\x0a\x83\x50\x12\xb1\x89\x44\x40\xd6\xe3\x99\x4f\xf1\x7a\x09\x42\x81\x11\x24\x29\x58\x15\x25\x55\x22\x6c\x9d\x54\x81\xa2\xaa\x82\x21\x52\x9e\x60\x6c\x20\xc6\x08\xe2\x25\x11\x29\xaa\x62\x42\x51\xc6\xaa\xa2\x20\x51\x92\x15\xc1\x90\x29\x79\x8a\x86\x20\x3b\x8f\x55\x5e\x3d\x76\x31\x6e\xe5\x59\x66\xbc\xb2\x3b\xf9\x11\x75\x0a\x35\x22\xcf\x92\xc5\x97\xec\x28\xae\xad\x06\x7e\x31\x59\x1d\x5a\xe5\x14\x5d\x95\x7b\x13\x81\x9f\x56\x31\xcf\xd7\x52\x66\xd2\xf7\x71\xd0\x68\x94\xb5\x8c\x9a\x61\x33\xad\x8e\x70\xa5\x35\xd6\xd2\x76\x3b\xd9\x13\x96\x93\x6a\x91\x80\x4d\x62\x5d\x7b\x6c\xfe\x80\xf1\xe9\xbc\xbe\xf0\x52\x86\xc2\x82\xa9\xd8\xaf\xd3\x45\xd9\x52\x53\x7c\x7e\x68\x14\x8b\x46\x7c\xa0\xe7\x68\xbe\xb3\xcc\xd7\xa6\xcb\x54\x23\x17\x0c\x8b\xe1\xa2\x6d\x4d\x6a\x13\xa3\x6c\xd6\x8b\x59\xbb\x1e\x94\x32\xf9\x29\x2f\xfb\xcd\x76\xad\x6b\x57\x4a\x99\x69\x77\xd0\xec\x89\x79\x08\x23\xcd\xcd\x33\x1e\x9b\x01\xe7\x6a\xfd\xff\x77\x8f\xbd\x30\xca\x3b\xb3\xe0\xfe\xc0\x98\xf1\xed\x6a\xed\x23\xca\x2e\x2d\x27\x3e\xa6\xf3\x74\x45\xf0\x01\x6d\x17\xd6\xf3\x1e\xd0\x78\x61\xe5\xed\xa3\x23\xee\x83\xd5\xb7\xfd\xac\x85\x16\x2f\xb7\x3a\x7a\x5a\x17\x0a\x7a\x2f\x2d\x0a\x99\x8a\xd4\xd1\x4a\xcd\x78\xb1\xda\xe9\x66\x2a\xa5\x6a\x0d\x49\x42\xbd\x21\x75\x2a\xe9\x9c\xde\x44\xf9\x74\x21\x9f\x10\xd3\x35\xb9\xb7\x19\x35\x6c\xc7\xb6\x85\x29\x4c\x77\xd9\x78\xb8\x34\xec\xe1\x4c\x25\x3a\x8e\xf7\x12\x31\x7d\x66\x24\x2a\x26\x1e\x57\x78\x68\xd7\xcb\x4e\x2b\xdd\x76\x3b\xfa\xde\xfb\xa2\x56\x28\x11\xfd\xef\x3a\xcc\x92\x83\xea\x58\x06\xb2\x5d\xd5\x8b\xb0\x2c\xbf\x4c\x9d\xda\xc8\x1e\x38\xab\x65\xa6\x56\x2c\xa3\x19\x43\xd6\xb2\x35\x72\x82\x45\x7e\x91\xc2\x9b\xe7\xe3\x44\x6d\xce\xc7\xd1\xff\xf6\x77\x7f\xe2\x91\xd2\xf9\xee\xdf\xba\xa6\xa9\x89\x83\x28\x8e\x0f\xb5\x96\xe6\xd4\x04\xaa\xf9\x56\x4a\x29\x1a\x29\x37\x59\x80\x8b\x31\x29\xf4\x99\xd4\xcf\xe5\x8d\xea\x00\x37\x83\xfc\x4b\x35\x61\x15\xfd\x48\x5d\x6c\x39\x2c\x66\x6d\x3c\x1d\x36\x4a\x72\xdf\x58\x24\xcd\x76\x37\xaf\x09\x7d\x51\x6b\xdb\x9e\xae\x57\x27\xb6\xd5\xaf\x9a\xb9\x56\x38\xcf\x67\xdc\x6a\x1b\x2f\x4b\x53\xbf\x98\x29\x16\xe6\x16\xc9\x4c\xdb\x6e\x22\x36\x9a\xc2\x52\x9b\x4f\x91\xa5\x43\x94\x60\x31\x72\x9a\x42\x00\xf4\xf9\x8f\x1f\xa7\xad\xc5\x27\x57\x0d\x7c\xa8\x6a\x8a\xc7\x55\xa3\xc7\x95\x69\x3e\x91\x0e\x1b\xcc\x9d\x0f\x4a\x49\xab\xe5\x3a\xd2\xfc\x25\xcb\x93\x51\xae\xba\x9a\x8c\x73\xb0\x62\xc7\x72\xfd\x17\xdf\xc8\x68\x8b\x7d\xd5\xd8\x27\xd9\xe6\xc3\xd4\xeb\xb2\x18\x6f\x25\x03\x5a\xf6\x97\x4b\x63\x1a\x4c\xd5\x12\xb5\x6a\xcb\x58\xc7\xa9\xcc\x96\x46\xae\x51\x1a\x96\x06\x99\x62\x02\xf4\x87\x46\xab\x3a\x9f\xe5\x60\xa1\xae\x55\x02\xb3\x9b\x99\xb7\x94\xec\x0b\x15\x5b\x66\x3e\xdd\x8a\xa7\x8b\x7e\xd5\xee\x98\x5a\xbd\xd1\x42\x19\xaa\x24\x7e\x3d\xf5\xe2\x43\xd4\x57\x4f\xa8\xd7\x6b\x2f\xbc\x58\x54\x27\x6e\xad\x99\x9f\xf1\x1a\x4f\x6b\x35\xb4\x62\x41\xb1\x15\x84\xe9\x19\xf1\x4b\xa5\xa6\xd7\xd6\x9d\x5c\x3c\x7c\xf1\xfb\x3b\xea\x9d\x47\xa9\x5f\x38\x63\x6c\xc5\x12\x7d\x29\xe4\xcd\xb1\xed\xd5\xad\x4a\x6c\xe9\x66\x63\xa9\x79\x3c\x65\x79\x45\x33\x80\xd5\x7e\x58\x5c\x25\xc7\x26\xee\xdb\x79\xa1\x5b\x9a\x78\x29\x3e\x13\x1f\xf5\xe6\x95\x7c\xb1\xe6\x26\x56\x5e\x19\x37\x63\x35\x1d\x01\x34\x36\x4c\x47\x7b\x49\x16\xe0\x34\xde\xff\xe5\xd4\xa3\x87\xa8\x6f\x9e\x50\x9f\x98\xc4\xbd\x4e\x2b\xd9\x52\xea\xcb\xc5\x94\x2f\x15\x45\xcd\x04\x54\x52\xe2\x85\xb1\xab\xb6\x9b\x1a\xee\x75\x6b\x8e\x91\x1f\x6b\x8b\x55\x7d\xef\xf5\xee\xa3\xd4\x57\x97\xd4\x4e\x1b\x6a\xbf\xde\x21\xd6\x6c\x8a\x86\x4e\xbe\x94\x94\x08\x5a\x86\x33\x00\xf4\x58\xa9\x36\xad\x2f\x33\xe5\xb4\x34\x2d\xf5\xc6\xb6\xd5\xa8\x14\xdd\x7e\x6a\x31\xea\x4e\x45\x29\xae\x36\xcc\x61\x6d\x96\x50\xfb\x45\x49\x49\xce\x13\xe6\xbc\x55\x21\x49\x0a\x3d\x3d\xa6\x57\x37\xd4\x5f\x6e\x5d\xce\xbd\xd4\x70\x47\xeb\xf2\xfa\x62\xc3\xae\x32\x15\x02\x90\x08\x54\xca\x53\x95\x02\x81\x28\x0a\x32\x01\x91\x08\xc2\x40\x14\x4c\x99\x48\x48\x06\x86\xc2\x33\x86\x81\x20\x62\x89\x02\x05\x61\x24\x50\xc1\x30\x45\x20\x28\x0a\x31\x0e\x2b\x35\x0a\x8d\xe4\x86\xd6\xd0\x23\xbd\x81\xd4\xae\xe4\x42\x5c\x7e\xe1\xe7\x25\x37\x35\x2a\x88\x65\xd5\xcf\xaa\xea\xb4\xf9\xd2\x61\xbd\xac\x44\x9b\x3d\x3c\x20\xc5\xf7\x7a\x3a\x17\x5e\x62\xf8\x70\xe1\xf7\x2f\x32\xec\x0a\xff\xfa\xe5\xf0\xe6\xb3\x04\xee\xcd\x15\x75\xe5\xc1\x9b\x98\x38\xa3\xc9\x61\xc1\xdc\xf5\x46\x13\xec\xfb\x93\x81\x87\x7d\x76\x46\x53\x83\xf9\x01\x57\xd7\x53\x5c\x69\x23\xcc\x7d\xe7\xea\x6c\x12\x30\xdb\x60\x1e\x27\x00\x1e\xdd\x62\xc8\x74\x3d\xc2\x7c\x32\x71\x1d\x87\x2d\x82\x31\x0e\x1d\x32\x38\x35\x14\xbd\xf6\x7f\x8b\xb2\xcd\x08\x68\xbb\xac\xe6\x9f\x2f\xff\xff\x8d\x56\xe1\xbe\x06\x96\xcd\xbe\xfe\xc5\x81\xcd\xa2\xdc\xd7\xed\x77\xd4\x5f\xff\xe2\x36\xf7\xa3\x1f\x07\xd8\xff\xfa\xd7\xe6\xa3\x83\xe8\xc7\xff\x6c\x85\x4d\xc6\x6e\x13\xb4\xf1\x22\x58\xf8\xd6\xea\x46\x71\x8f\xf9\xcc\x9b\xbd\x27\xfc\xe5\x3f\x37\x51\x81\xfd\x20\x7a\x5b\x96\x6e\xdf\x5a\x3b\x43\xc5\xc3\x23\xc3\x1b\x70\x6c\xb3\x2d\xf6\xc8\xc0\x9a\x6d\x6f\x5e\xa8\x92\x7d\x1d\xf0\x5b\x42\x22\x3a\xbc\xaf\x7f\x71\x5f\x67\x3c\xff\x2f\xfe\x5f\xe0\xeb\xf6\x06\x09\x3d\x8f\x39\x41\x21\x2a\xda\xd7\xbf\x38\x74\xfc\x7b\x3c\x7a\xa1\x79\xcd\xdb\xff\xde\x11\xb9\xa7\x74\x27\xb9\x56\xac\x98\xa6\xac\xf2\x82\x28\x02\x01\x63\x43\xc2\x58\x82\x44\xa0\xaa\x21\x1b\x14\x2b\xd0\x20\xc8\x00\xd0\x30\x45\x06\x25\x95\x61\x2c\x61\x44\x19\x04\x58\x35\x80\x20\x30\xd5\x60\xc2\x16\xd1\x4e\xef\xda\x8b\x8f\x2a\x70\x77\x27\x2a\xfb\xda\xe5\x8e\x6e\xfd\xe7\xe4\x79\xdf\xc1\x93\x35\x2e\x49\x82\x26\x00\x00\x62\x66\x40\x99\xa8\x86\xcc\x98\x60\x8a\x54\x60\x04\x43\x91\xf0\x22\xe4\x99\x88\x64\x42\x4d\x2c\x00\x11\x00\x13\x03\x1e\x48\x54\x61\x06\x12\x10\xe1\x55\xf2\xf5\xcb\x19\x0b\x17\x38\x60\x26\xe4\xb1\x00\x30\x54\x15\xc6\x64\x48\x98\x20\x08\x32\x62\x58\xe1\x65\x59\x56\x24\x03\x13\x24\x4a\x48\x32\x21\xa4\x84\x88\x26\x34\x19\x91\x00\x45\x88\x52\x93\x97\x20\x55\x3f\xce\x01\xff\xfc\xf6\x9e\x1b\x06\x93\x30\xf8\xdc\xb2\x5f\x63\xf8\xd1\x25\xbb\x8f\x30\xfc\xb0\xad\x5f\xe4\x65\xbf\x39\xf8\xcd\xc1\x6f\x0e\x7e\x73\xf0\x9b\x83\xdf\x1c\xfc\xe6\xe0\x37\x07\xbf\x90\x83\xe8\xff\xfe\xcf\xed\x83\x17\x9f\x4c\xa2\xcf\x06\xcf\x5d\x4f\xaf\x23\xf4\xcd\x32\x4d\x42\x0a\x16\x76\x66\xd2\x55\x6c\xe4\xca\x2f\x1d\x4d\xe8\xb7\xab\xb3\xbe\x2c\xcc\x87\x50\x98\x34\x54\x8a\x46\xc3\x09\x5f\x1b\x4f\x53\xf3\xfd\xea\x63\x2a\xfa\x2b\xce\x53\xd5\x1c\xa0\x4e\xb5\x90\x1d\x98\x7a\x7a\x81\xe3\x09\x55\xe9\x75\x12\x62\x26\x74\x13\x75\x1b\x64\xdb\xe3\x42\x7d\x06\x34\x77\x58\xd8\xcd\x08\xe4\xac\x07\xa7\x69\xee\x99\x51\x88\x6b\x2f\xb5\xf8\x62\x51\x75\x9b\xd9\x81\xc5\x96\x98\x37\x1d\x9c\xd1\x49\x73\x31\xc8\x4d\xa0\x39\xec\x6b\xed\x46\x63\xec\xf9\xb9\xac\x31\xd3\x85\xb4\xad\x25\x96\xbe\x8f\x6d\xb3\x67\xe4\x72\xe3\x56\x35\x36\xb7\x67\xc5\x40\x9e\x78\xfe\xb2\x98\x51\xf8\x92\xc9\xfa\xdd\x92\x2b\x75\xf6\x33\x1c\x89\xee\x83\x6b\x63\xf1\x7b\xa6\xc1\xaa\x15\x50\x25\xa4\x99\x4f\x25\xb2\x5d\xc7\xb7\x83\x0e\x12\x06\x73\x98\x2a\x76\xeb\x98\x42\x51\xd4\x52\x23\x80\xb0\x9c\xa8\xa7\xe5\xb9\x3a\x98\xf4\x35\xdf\x2b\xa4\x27\x8e\xd0\x5e\xd6\x7b\xad\x66\xc5\xcf\x79\xab\x02\x93\xb0\x5c\x1c\xc6\x5f\x4a\x8d\x0e\x74\xd3\x3a\x2e\x8f\xe7\xc9\x08\x8e\x31\x9b\xe8\x69\xc0\xbb\x1d\xde\x0c\x82\x7c\xa3\xa1\xa8\x2b\x33\x01\x95\x66\x77\x25\x38\x23\x29\x08\xcc\x15\x69\x0c\xe2\x49\xd1\xcd\x8e\x58\x4e\x2a\x34\x16\x42\x4c\xa9\x18\xa3\x82\x9c\x0e\xcc\xf4\xa4\x03\xac\x29\xea\xc1\xc4\xc4\x00\xb5\x1c\x8a\x49\xb1\x98\x9a\xc3\xb3\x87\xfd\xad\xbf\xab\xff\xf9\xa3\x6b\x91\xd1\xd5\xfd\x98\xff\x56\x93\x45\xa7\x37\xb0\x5f\xba\xc9\x31\xcc\x7a\x52\xd8\x45\xcb\x61\xad\xec\x94\x89\xe7\xa9\x25\xed\x65\xd8\xc4\x23\x7f\xb0\x1a\x84\xd3\x61\xbb\xd7\x73\x47\xab\x55\x3e\x1b\x27\xbd\x74\x3e\x2c\xf7\xcd\x26\x14\x81\x31\x9f\x75\xf5\xf2\x2c\x5e\xd4\x1c\x25\xd5\x80\xf1\x0c\x95\xe6\x2f\xfd\x68\x99\x32\x9e\x6e\x35\x27\x22\xeb\x94\x7b\x64\x5a\x13\x48\x90\x5a\x85\x4a\x75\xa5\x58\xd5\xa4\x5e\x4e\xcf\xe7\xb5\x44\x39\x2b\xb6\x60\x11\xd9\x8e\xd1\xdc\xfb\x4b\x5e\x1a\x32\x0b\x0e\x6d\x37\xab\x34\xd2\x63\xfd\x85\xf5\x09\x94\x2b\x9d\x20\x93\xcf\xaf\xda\x2d\x65\xde\xb2\x7a\x71\x9c\x08\x51\x01\x45\xd3\x6a\xbd\xe8\xa1\x83\x75\x9c\x37\xfe\xb7\x8f\xaf\xc0\xe8\x77\x6a\x52\x52\x76\xf5\x02\x28\x54\x63\xf3\x6e\x3d\xa1\xae\x3a\xb3\x4e\xab\x01\x17\x56\xc5\xea\x86\x75\x83\xd7\x67\x76\xb5\xc0\x94\xe8\xf9\x56\xab\xb4\x0d\xcc\x04\x1f\xc6\x69\xc6\x6d\x84\xfd\xe2\xac\x1a\xe8\x72\x7c\x90\x2d\xc0\x12\x53\x69\xab\x62\xa6\xb3\xb1\x9c\x85\x72\xb3\x66\x39\xd6\xd3\x02\x79\x5d\xbf\x71\x9a\xa5\xe1\xc1\x8b\x38\x5a\x7a\x87\xb7\x9a\x93\xcd\x82\x94\x2f\x06\x43\x5d\x62\xe3\x66\x5f\x2a\x27\x29\x70\x67\xb3\x81\x61\x3b\xbd\xd2\xaa\x28\x4c\x8b\x5a\x53\xd1\xdb\x4b\x79\x3a\x1c\x8f\x9c\x5a\xb2\x91\xe5\x89\xba\xc4\xad\x41\xdd\x2b\x8c\x43\x63\x69\xb9\x28\xb9\x68\x63\x51\x30\xe3\xc9\x62\xb1\x33\x2d\x6b\xbc\x55\xed\xee\xcb\xfb\x6b\x66\x28\x2f\x7c\xd0\xf4\xd1\x19\xca\x83\x8f\x9a\x3e\xe3\x95\x65\xfe\x99\x7b\xe4\x9d\xec\xa7\x66\x5d\x7f\x7a\xe6\x54\x41\x80\x50\x16\x00\x94\x14\x24\xca\x32\x52\x80\x1c\xbd\x0d\x7d\xd0\x68\x45\xa6\xd0\x6d\xef\x39\x5f\xfc\x30\xe6\xc3\x64\x1d\x7e\x1c\xb3\x7f\x35\x59\x92\x24\x24\x61\x89\x61\xca\x04\xa0\x08\x04\xc9\x0a\x40\x32\x2f\x48\x32\x55\x99\x28\x22\xc8\x18\x43\xb2\xc2\x13\xac\x62\xa4\x60\x0c\x79\x95\x19\xc0\x64\x0a\x14\x11\x32\xe9\xf6\x4d\xcb\xa3\xe6\xb2\x78\x12\x2e\x71\xeb\x25\x0e\x0a\x20\x97\x5e\x06\x83\x79\x89\x1f\x77\x01\x5e\x4e\x5c\x5e\x2d\x65\x16\xb3\x42\x62\x59\x46\x41\x3c\x49\x12\xad\xd9\x3c\xa5\xce\x61\x3f\xf0\xca\x4e\xef\x34\x0d\x9d\xbb\x2e\xbe\xb1\x9b\x3c\x09\xdf\x8f\xdb\xef\xbe\xc4\xc8\x69\xb8\xdf\x66\xff\xed\x82\xd0\x79\xde\x01\x63\x3c\x4f\xa9\x21\x2a\xbc\x8c\x25\x5e\x42\x26\x90\x04\x22\x28\x82\x0c\x0d\x13\x09\x3c\x55\x0d\x93\x51\x82\x45\x86\x21\x10\x4d\xd9\xa0\x8c\x0a\xc4\x50\x18\x15\x05\xc1\x90\xd9\x86\x77\xe1\x2d\xef\xff\x50\xb9\x3f\x8b\x77\x45\xdc\x3f\x7f\xf6\x9d\xd5\x07\x79\x37\xa8\xa8\x48\xd4\xa0\x14\x08\x54\x94\x80\xc2\xcb\x92\xcc\x13\x11\x23\x2c\x33\x95\x4a\x4c\x91\x10\xc1\x82\x4a\x0c\x91\x67\x92\x40\x65\x8c\x4d\x19\x60\xc1\x64\x0c\x19\x50\xa2\x6c\xfb\x1e\xe6\x55\xde\x13\xa1\x0b\xdd\x40\x44\xd3\x44\x25\xb9\x98\x54\x5f\xa0\x9b\x29\xc5\x56\xbc\x5c\x5b\x5a\x3e\x3f\x36\x8b\xa9\xae\x5d\x6d\xf7\xbd\xb0\x1e\x6b\x6c\x1e\x90\x6d\x7f\xdb\x7b\xeb\x5f\xe2\xf6\x5d\xde\xf5\xc7\xec\xdb\xe4\x3e\xfb\xb7\xf2\xbe\xce\x27\xd0\xa0\x08\x61\x49\x05\x82\x24\x88\x14\x40\x13\x2a\x2a\x32\x88\xca\x1b\xa6\xa2\x12\x03\x40\x59\x35\x64\x44\xa1\xca\x90\xa1\xca\x94\x40\x2a\x8a\x0a\x96\x18\x43\xd1\xaa\x99\xf8\x2e\xef\x1f\x6b\x56\x3f\x87\xf7\xe4\x63\xf6\x7f\x39\xef\x10\xc8\x3c\x05\x82\xaa\x40\x4c\x15\x43\x06\x32\x84\x86\xc2\x18\x12\x30\xaf\xca\x22\xc2\x50\x92\xa8\xcc\x13\xde\x94\x45\x84\x78\x55\x95\x65\xc8\x64\x49\x81\x94\x62\x0c\x20\xda\xbe\x13\xf7\x96\xf7\x4f\xf4\xb7\x88\xc2\xf8\x07\x79\x4f\x3d\x66\x7f\x24\xde\x67\xff\xea\xaa\xf3\xf9\xcf\x33\x3f\xde\x50\xff\xea\x56\x3a\x5d\x50\x32\xd5\x59\x75\x64\xe4\x85\x8c\x06\xdb\xad\x61\xcd\xcb\xdb\xc3\x0e\x00\x66\x5a\xf1\x0b\x59\xd9\x06\xc9\xda\x3c\xd7\x7e\xd1\x3a\xd1\xbb\x83\x07\xad\xf1\x29\x4b\x6f\x58\xfb\x60\xa7\x58\x2b\x23\xef\x70\xcc\x11\xdf\xb4\x06\xeb\x4a\x89\x53\xbd\xc3\x04\xd8\x14\x99\x9a\x10\xea\x8b\x49\xbc\xd0\xab\x2d\x78\x2f\xb7\xaa\xa7\x0a\x39\xb0\xd0\x75\x10\xe6\xd3\x13\x7b\x6a\x98\x63\xbd\x11\xeb\x74\xb2\x53\xa9\x69\xe9\xf1\x95\x9d\x5a\x04\xb1\x74\x39\xd6\x99\xa6\xdc\x6a\x85\x7a\x9d\x86\x3c\xe1\xdd\x42\x2f\x9b\x99\x36\x8a\x95\x75\x3f\xad\x67\xf7\xda\x93\xd0\x63\xd9\x6c\x21\xc5\xb4\xd6\x22\xe7\x08\xac\x96\xaa\x84\xa8\xd3\x27\x53\xdc\xce\xbb\x0b\xc7\xd3\x63\x7d\xd0\x32\xf7\xef\x47\x5e\xe1\x60\xef\x19\x47\xcb\xfa\x07\xb2\x9b\x97\xdc\xb5\x7f\xae\x75\xd4\x3e\xa1\x75\x2e\x79\xcb\x46\xf3\x01\xfb\x9a\xf6\xcf\x65\xeb\x73\xd9\xf2\x57\x77\xc9\xee\x0f\xb2\x2b\x23\xcf\xcd\xe5\x4d\x4b\x52\x81\x95\x71\x7f\xb8\x28\xe2\x66\x45\x95\xe2\x2b\xd3\x57\x19\x20\xae\x57\xea\x75\x56\xf1\x76\x6e\x94\x72\xf3\xf2\x68\x36\xda\x30\x77\x39\xc8\xb4\x5e\xa2\x5e\x4f\x19\xcd\x7c\xd6\xca\x36\x06\x71\x18\xcf\x66\x4c\x3e\x44\x7d\x30\xd3\xeb\xbd\x2a\x48\xe8\xa2\x19\xd7\x62\x93\xca\xb4\x59\x7d\x51\xe9\xbc\x5e\xae\x17\x62\xa5\x74\xb1\xd7\x9b\x8d\x05\x96\x6b\x03\x81\x95\x6b\xc9\x61\x59\xac\xb6\x6a\x22\xc9\x12\xbb\x66\xc7\x69\xb7\xb4\x0e\x04\x3d\x4c\x52\x01\xf4\x3b\x93\x41\xcf\x8c\x5b\x73\x37\xb7\x9a\xf1\x59\x6a\xbf\xc8\x64\x52\x76\xe7\x0d\x38\x63\xc0\x0f\xcb\x7c\x22\x0f\xf7\x3e\xf5\xcf\x07\xd9\xa3\x4e\xfe\x68\x90\x15\xe7\x05\xdb\xff\xcc\x20\xfb\x1b\xbb\xa2\x37\x05\xd9\x27\xf7\xbf\xef\x9f\xde\xb9\xd2\x92\x6d\xa6\x3f\xee\x9a\xae\x81\x2f\xbb\x6b\xaf\xef\x60\xba\x26\xae\x8e\xec\x7c\x5b\x98\xc2\x99\x5c\x35\x97\x4a\xa5\xc8\x46\x49\x83\x6f\x34\xb2\xc8\x5a\x4c\x47\x59\x10\x77\xfb\x1d\xaf\x1c\xc8\xfd\x32\x2f\x09\x55\x63\x34\x10\x68\xbd\xd1\x34\x99\xee\xce\x08\xa8\x68\xd8\x1c\xe8\x9d\x45\x30\x68\x69\x63\xbf\x10\x0e\xc7\x71\x7b\x39\x8c\x6b\xdd\x28\x28\x66\xcd\x41\x30\xa3\x5a\x50\xeb\xf7\x3b\xbd\xc5\x22\xdf\x76\x24\x6a\xb8\x3d\xe2\x4e\x96\x20\x63\x17\x3a\xd3\x19\xc9\x17\x62\xc8\x28\x05\xef\x05\x5c\xf7\xb8\x52\x8f\x02\x2e\xe2\x6e\xd3\xf7\x3b\xf8\xd0\xe6\x8e\x84\x94\x73\xf6\x75\x71\xe1\xba\x30\xfe\x3c\x0a\xf8\x4f\xb1\x7f\x21\xd9\xdc\x62\xff\x97\xf4\x85\xdf\x5e\x7f\xdb\xd8\xef\xa3\x7d\x71\x6d\x6f\xbf\x7a\x8f\xfd\x54\xab\x09\xb6\xca\x0b\x6d\x31\x05\xd8\xa0\x2c\x69\x4b\x35\x01\x2a\x7e\x3a\xd9\x9f\x11\x5e\xe6\xf9\xa6\xaa\x74\x87\xa2\x5d\x18\xd9\x6a\x55\x46\xa3\x04\x9c\x1d\x54\xc5\x3e\xe0\xe6\xa7\xfc\xdd\x94\x90\x3e\x79\x60\xfa\xc1\x42\xdc\x96\x90\x36\x85\xfa\xa0\x93\xdf\x3d\xdf\xdc\x9e\x15\xab\xec\xe8\x0b\xf7\xcc\x0e\x6f\xb5\x38\x5b\x0d\xdb\xa4\xc9\x94\x04\x9d\x77\x5e\xc8\x18\x4d\x16\x42\x63\xd4\x0d\x24\x59\xa8\x75\xca\xa9\x59\xae\xdc\xc8\x23\x33\x2f\xd5\x87\xf1\x49\x25\x93\x1e\xa2\x64\x36\xb5\x48\xd4\x3a\xb4\xa0\xa5\x96\x42\x9e\x77\xea\xa3\x4c\xdd\xc9\x8e\xd4\x92\x30\x9d\xcf\xab\xf9\x79\x9e\xf7\xe7\xf3\x28\xc9\xe4\x1c\x20\xf3\xad\xc9\x44\xb3\x73\x25\xed\xa5\x9c\x6b\x2b\x23\x23\x96\x5b\xce\x4b\x28\xe0\x01\x42\xc6\x58\x9d\xab\xb5\xec\x24\x44\x64\xff\x69\xe8\xf9\x04\x76\xe2\x04\x17\x12\xd8\x21\xe1\x77\x0c\x5b\x1e\x4e\x60\x9f\x68\xff\xbe\x04\x76\x3a\x98\xff\xaf\x0b\x60\xed\x78\x92\xe5\x6f\xc5\x17\xc7\xca\x22\x2e\x55\x3f\x21\xc1\x7c\xee\x0c\xcc\xef\x05\xad\x7b\x16\xb4\xa2\x24\x90\x9d\x13\xaa\x4d\xfa\x92\x50\x20\x99\xa2\x3c\x0c\x9b\xd3\x74\xa7\x86\x4b\x36\xbf\x98\x9b\x34\xd5\xec\x8d\x61\xc5\xc1\x3a\xc4\xae\xde\xdc\x21\x7b\x28\xc1\x1c\xb4\x9a\xf7\xf4\x50\xca\xfb\xba\x3b\x58\x8c\x7b\x13\x1c\xe7\xae\xf8\x27\xdb\x4f\xdc\x63\xff\x20\xc1\xfc\x97\x06\xb0\x76\x3c\x9b\xf8\x37\xe3\x13\x94\xbe\xde\xbe\x21\xc1\x5c\x98\x6d\xbc\xb2\x79\xd9\x47\xa7\x1c\x4f\x36\x30\x7b\xcd\x5d\x87\x73\x86\x9b\xad\x4c\xf6\xbe\x7e\x26\xf9\x5d\xd6\xb2\x9b\x14\xd9\x6c\x80\xf2\x46\xcb\xc5\x03\x17\xde\x9e\x43\xb3\x3b\x68\xe2\x75\x93\xb3\x77\x8a\x79\x78\x20\x4e\x74\x0c\xce\x81\xc6\xe8\x8d\x21\x4d\xd7\xcf\x6c\x0d\xbf\x33\xc8\x55\x6a\xd9\xa2\x56\xeb\x72\xf9\x64\x97\xfb\xb6\xdb\x35\xf3\x79\x77\x24\xc3\xc5\x03\x12\x4e\x8e\xe6\xf9\x2c\xe0\xfe\x15\xd4\xfe\x35\xc8\xe7\x36\xac\xdf\x9f\x46\xf4\x30\x3c\x03\x3b\xe7\x90\xbd\x1a\x38\x06\xb5\xd9\x23\xf7\xfa\x6e\xf6\x57\x8f\x61\x7a\x18\xee\x91\xf2\x73\xc0\xaf\x58\xe7\x9a\xa5\x6c\xb5\x99\xe4\xf6\x1b\xe7\x7d\xa8\x24\x9f\xc3\xf7\x07\x0b\xf0\xb6\x0e\xf6\x1b\xfc\x5f\xd8\x9c\xfe\xe8\xf0\xae\x87\xf1\x6e\x94\x9d\x03\x7a\x60\xe6\x18\xe1\x76\xcb\xf4\xf3\x5b\xa5\x1f\x9e\x54\xf6\x30\xb8\x48\xd7\x39\x6c\x7b\x23\xc7\xd0\xac\xc9\x73\xb4\x81\xfa\xd5\xad\xc1\xcf\x9c\xd0\xf6\x38\xd2\x03\x95\x67\x01\x9f\x9a\x3c\x57\xe9\x17\xf6\x0f\x3f\x3a\xa7\xee\x33\x90\xfa\xa1\x71\x01\xe3\xab\x99\x63\x74\xd1\xd6\xe3\x57\x36\x13\x7f\x73\x38\xdf\xc3\x20\xf7\x0a\xcf\x01\x3d\x31\x77\x53\x0e\x3b\xf8\x66\xf4\xf4\x88\xc2\x87\xd1\xee\x15\x9e\x43\x7b\x62\xee\x18\xed\xeb\x96\xdc\x57\xb6\xbc\x7e\x73\x54\xe3\xe3\x78\x77\x0a\xcf\xe2\x3d\x36\x77\x8c\x77\xb7\x6b\xf6\x95\xdd\xb0\xdf\x9c\x59\xf9\x30\xe0\xbd\xc2\x73\x80\x4f\xcc\x5d\xec\x1a\x6c\x76\xc3\x7e\xde\x6f\x75\x7d\x75\xbb\xe3\x33\x67\x7a\x3e\x5e\x8e\x03\x95\x67\x4b\x72\x6a\xf2\x5c\x96\xf0\xd9\xf4\xf9\x75\x7f\xdf\xcb\x5b\x11\x9f\x9e\x75\xfa\x09\xd8\xaf\x02\x7f\x08\xf5\x49\x17\xf5\xdc\x09\xb0\x0f\xe3\x3f\x56\x7a\xae\x10\x67\xcc\x5e\x2c\xc9\xe1\x36\xc1\x97\xba\x9a\xbb\xd3\x71\xb7\xd8\xa3\xb3\x74\x6f\xdb\xc0\x78\x73\xec\xee\x89\x1e\xae\x5c\xda\xf7\x62\x9b\xf5\x6c\x29\xcd\x19\x81\xc7\x18\xf7\xba\x5b\xf9\x1f\x5c\x3b\x93\xac\x25\xb9\xc3\xdd\xcb\xf9\xdd\xeb\x8d\x6f\x3b\x9a\xc7\x07\xfe\xde\x8b\xf2\x58\xcd\x1a\xe4\xb6\x9f\x72\x04\xf1\xf0\x08\x9b\xe7\xc3\x03\x6b\x9e\x37\x07\xc9\xbc\x41\xb7\x3f\xb5\xf8\x5e\x60\x3b\x0d\x6b\x4c\xfb\xc0\x38\x82\x75\xb9\xab\x78\x74\xbe\xf2\x23\x10\x5e\x95\x6c\x50\x1c\x24\x98\x1b\x81\x1c\x1d\x09\x7d\x2f\x90\x43\x25\x6b\x20\xc7\x1d\xe1\x1b\x91\x1c\x1d\x63\x7d\x2f\x92\x43\x25\x6b\x24\x07\x3b\x73\xdc\x0e\xe3\xe8\xe8\xed\x07\x90\x1c\xea\xd9\x82\x79\xed\x25\x1c\x83\x39\x3c\xa6\xe2\x5a\xfa\x7a\x0c\xd1\xa9\xa2\x35\xa4\x93\xdc\xf8\x2e\x47\x97\x4e\x9c\xe7\x88\x6b\x4f\xc6\x2c\x60\x91\xd9\xff\x17\x00\x00\xff\xff\xf9\x46\x3d\x7b\x9e\x7e\x00\x00") - -func send_to_issuerCoreSqlBytes() ([]byte, error) { - return bindataRead( - _send_to_issuerCoreSql, - "send_to_issuer-core.sql", - ) -} - -func send_to_issuerCoreSql() (*asset, error) { - bytes, err := send_to_issuerCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "send_to_issuer-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbe, 0xaf, 0xb3, 0x2c, 0xce, 0x7d, 0x4e, 0x8d, 0x65, 0xcf, 0x7c, 0xb8, 0xd4, 0xf1, 0xfe, 0xaf, 0xe3, 0x5b, 0x7b, 0xde, 0x1e, 0x2f, 0x45, 0xd7, 0x36, 0x89, 0x88, 0xf7, 0xeb, 0xee, 0x13, 0x1b}} - return a, nil -} - -var _send_to_issuerHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x79\x8f\xda\xc8\xd3\xf0\xff\xfb\x29\xac\x68\xa5\x49\x34\x93\x8c\xef\x23\xfb\xe4\x27\x19\x30\xc7\x00\xe6\x30\x0c\x0c\xab\x15\x6a\xdb\x6d\x30\x97\x19\xdb\x5c\xb3\x7a\xbe\xfb\x2b\x1f\x80\x31\xbe\x38\x92\xdd\xdf\xfb\x58\x51\x34\xd8\xd5\x75\x75\x55\x57\x75\x75\xdb\xfd\xf5\xeb\x6f\x5f\xbf\x22\x4d\xc3\xb2\x47\x26\x94\x5a\x35\x44\x05\x36\x90\x81\x05\x11\x75\x35\x5f\xfe\xf6\xf5\xeb\x6f\xce\xf3\xc2\x6a\xbe\x84\x2a\xa2\x99\xc6\xfc\x08\xb0\x86\xa6\xa5\x1b\x0b\x84\xfb\x46\x7f\xc3\x02\x50\xf2\x0e\x59\x8e\x86\x4e\xf3\x10\xc8\x6f\x92\xd0\x41\x2c\x1b\xd8\x70\x0e\x17\xf6\xd0\xd6\xe7\xd0\x58\xd9\xc8\x0f\x04\xfd\xc3\x7d\x34\x33\x94\xe9\xf9\x5d\x65\xa6\x3b\xd0\x70\xa1\x18\xaa\xbe\x18\x21\x3f\x90\x87\x6e\xa7\xc8\x3e\xfc\xb1\x47\xb7\x50\x81\xa9\x0e\x15\x63\xa1\x19\xe6\x5c\x5f\x8c\x86\x96\x6d\xea\x8b\x91\x85\xfc\x40\x8c\x85\x8f\x63\x0c\x95\xe9\x50\x5b\x2d\x14\x5b\x37\x16\x43\xd9\x50\x75\xe8\x3c\xd7\xc0\xcc\x82\x27\x64\xe6\xfa\x62\x38\x87\x96\x05\x46\x2e\xc0\x06\x98\x0b\x7d\x31\xfa\xc3\xe7\x1d\x02\x53\x19\x0f\x97\xc0\x1e\x23\x3f\x90\xe5\x4a\x9e\xe9\xca\x93\x23\xac\x02\x6c\x30\x33\x1c\x30\xbe\xd6\x11\xda\x48\x87\xcf\xd5\x04\xa4\x52\x44\x84\x7e\x45\xea\x48\x48\x43\xac\xbd\xf9\xf0\xdf\xc6\xba\x65\x1b\xe6\x6e\x68\x9b\x40\x85\x16\x52\x68\x37\x9a\x48\xbe\x21\x4a\x9d\x36\x5f\x11\x3b\x81\x46\xa7\x80\x43\xc5\x58\x2d\x6c\x68\x0e\x81\x65\x41\x7b\xa8\xab\x43\x6d\x0a\x77\x7f\xfc\x0a\x82\x8a\xfb\xd7\xaf\x20\xe9\xd8\xd5\xaf\x13\xd0\xa3\x76\xb9\x74\x1e\x83\x8e\x21\x27\x11\x0b\x40\x1d\x91\xbb\xe0\x15\xb1\x20\xf4\x03\x90\x3e\x5a\x97\xab\x21\xd4\x34\xa8\xd8\xd6\x50\xde\x0d\x0d\x53\x85\xe6\x50\x36\x8c\x69\x72\x43\x7d\xa1\xc2\xed\x30\x20\xdc\xc2\x02\xae\xa1\x5b\x43\x63\x31\xd4\xd5\x4b\x5a\x1b\x4b\x68\x82\x43\x5b\x7b\xb7\x84\x37\xb4\x3e\x72\x72\x13\x17\x97\xb5\x9d\x41\x75\x04\x4d\xb7\xa1\x05\xdf\x57\x70\xa1\x5c\x24\x42\xa0\xf9\xd2\x84\x6b\xdd\x58\x59\xfe\xbd\xe1\x18\x58\xe3\x2b\x51\xdd\x8e\x41\x9f\x2f\x0d\xd3\x71\x47\x7f\x4c\xbd\x16\xcd\xb5\xba\x54\x66\x86\x05\xd5\x21\xb0\x2f\x69\xbf\x37\xe6\x2b\x4c\xc9\xf7\xcb\x2b\x98\x0e\xb6\x04\xaa\x6a\x42\xcb\x4a\x6e\x3e\xb6\x4d\xd5\x8d\x3b\xc3\x99\x61\x4c\x57\xcb\x0c\xd0\xcb\x34\x96\x3c\x28\xa0\x9b\x17\x22\xde\x0f\xba\x99\x1b\x38\xe3\x84\xa6\x41\x33\x1b\xe8\x1e\xfd\x15\x4d\x7c\xb5\x66\x6b\xe4\x0e\xad\x17\x10\x09\x0e\xc5\x69\x2d\x96\x4e\x83\xb1\x9d\xda\x03\xd6\xc9\x00\x24\xef\x52\xcd\x68\x7c\xf0\xf4\x2c\xc0\x86\xc7\x87\x91\x0a\xa8\x5b\xf6\xd0\xde\x0e\x97\xe9\x28\x1d\x48\x63\x99\x15\x12\x66\x05\xdb\x87\x92\x64\x60\x79\xef\xee\xa9\x60\xe9\xa3\x98\xbc\xcb\xd6\x99\x5e\x8c\x74\xb4\x6d\x59\xab\x34\xca\x07\x60\xc5\x50\xe1\x85\x79\xc1\xc1\x0c\x96\xc0\xb4\x75\x45\x5f\x82\x45\x62\xf0\x4e\x6b\x3a\x5c\x5e\x98\x9b\x1c\x22\xda\xa5\x1c\x44\x37\xbc\x98\xbe\xab\xbc\x2c\xf4\x3c\xc0\x9f\x8e\xdf\xeb\x4c\xa7\x27\xfd\x3f\x9d\xf8\xb0\x4f\xfd\x5c\x63\x18\x66\xe4\x60\x64\x98\xcb\xe1\x5c\x1f\xf9\x09\x43\x02\x0b\x21\xc8\xcc\x32\x5e\x9e\xef\x25\x61\xce\x6a\x9c\x5e\xeb\x7c\xa3\xd6\xad\x8b\x88\xae\x7a\x94\x0b\x42\x91\xef\xd6\x3a\x19\x71\xc7\x18\xdd\x1d\x30\xfb\xdd\x9d\x8c\xc9\xfd\x95\x5d\xfc\x7d\x94\x96\x84\x56\x57\x10\xf3\x57\xe8\xcc\xc9\xb3\x2d\xf8\x7e\x31\xe5\x13\x24\x99\x5b\xab\x30\x23\xec\x31\x9b\xcd\x2c\x61\x8c\xd7\x5f\x22\x5f\x34\x8a\x6c\x6d\xfd\xbc\x2f\x1b\xb0\x9f\xe4\x65\x96\xcd\x1f\x01\x2e\x91\xc5\x6b\x92\x11\xd6\x4f\xff\xb2\xf3\xb3\xcf\x17\xb3\x70\x14\x1a\x43\x92\x81\x03\x43\x82\x0f\xc8\x97\x4a\x6d\xa1\xc4\x77\x22\x80\xe7\xba\x33\xe3\xd0\x15\xf8\x79\xb1\x9a\x43\x53\x57\xfe\xfc\xeb\x4b\x86\x56\x60\x7b\x45\xab\x19\xb0\xec\xcf\x60\xb1\x83\x33\xb7\x14\x93\xa1\x85\xa6\x9b\x91\x4d\x8a\x5d\x31\xdf\xa9\x34\xc4\x04\x79\x86\x60\x34\x3a\x72\xf7\x84\x9c\x31\x9a\x80\x63\x2f\xdd\x0d\x38\x1c\x59\xdd\xe6\x47\xe6\x9f\x90\x4b\x04\x71\x45\xcf\x80\x41\xe8\x77\x04\x51\x0a\xa1\x98\x2d\x47\xd6\xfb\x6c\x6f\x8b\xf9\xb2\x50\xe7\xcf\x28\xfc\xf1\x9b\x57\x85\x13\xc1\x1c\x7e\xdf\xdf\x43\x3a\xbb\x25\xfc\xee\x37\xf9\x03\x91\x94\x31\x9c\x83\xef\xc8\xd7\x3f\x90\xc6\x66\x01\xcd\xef\xc8\x57\xb7\x38\x97\x6f\x0b\x4e\x7f\xf9\x98\xf7\xf8\x7e\x3b\xc1\x78\xfa\xd0\x47\x9c\x6f\xd4\xeb\x82\xd8\x49\xc0\xec\x01\x20\x0d\xf1\x14\x01\x52\x91\x90\x87\x7d\xd9\x6d\x7f\xcf\x72\x91\x3c\x84\x29\xef\xc5\xf7\x69\x1e\x34\x94\x2a\xcf\x89\x2e\xc5\x46\x27\xa4\x4f\xa4\x57\xe9\x94\x0f\x6c\x05\xeb\x6f\x27\xe4\x8f\x58\x42\x8c\x5c\x22\xfc\x19\x12\x57\x01\xcd\xda\xf3\x72\x24\xb5\x6a\xc8\xd2\x34\x14\xa8\xae\x4c\x30\x43\x66\x60\x31\x5a\x81\x11\x74\xd5\x90\xb1\x5e\x18\x64\x37\xdd\xd0\x7c\xf6\xf7\xb6\x7a\xe4\x7f\xdf\xb7\x51\xba\x3c\x58\x76\x2a\x7e\xa4\x2d\x74\xba\x6d\x51\x0a\xdc\xfb\x0d\x41\x10\xa4\xc6\x8b\xa5\x2e\x5f\x12\x10\x57\xfa\x7a\xbd\xeb\x8d\x77\x52\xa7\x5d\xc9\x77\x5c\x08\x5e\x42\x7e\x1f\xfe\x8e\x48\x42\x4d\xc8\x77\x90\xdf\x31\xe7\x57\xb8\x37\x52\x1d\xf1\x36\xe9\xd2\xd0\xdf\x4d\x38\x3c\x4a\xb8\x2c\x23\xd5\x6d\xf2\x65\xa0\x70\x10\xf1\x70\xeb\x2a\x09\x3f\xff\x86\x20\x79\x5e\x12\x90\x5e\x59\x10\x91\xdf\xb1\x3f\xb1\xbf\x9e\x7f\xc7\xfe\xc4\xff\xfa\xcf\xef\xb8\xfb\x37\xfe\x27\xfe\x17\xd2\xf1\x1e\x22\x42\x4d\x12\x1c\xa5\x08\x62\xe1\x4b\xa4\x66\x32\xc4\x81\x1b\x35\x93\x4e\xe1\x67\x6b\xe6\x7f\xae\xd1\xcc\x79\x4c\xf5\xf5\x70\x88\xc3\xd9\x14\x71\x0c\xdb\x67\x18\x5d\x8e\x11\x44\x72\x74\x85\xfc\x38\x8e\x00\x4f\xde\xed\xce\x5b\x53\x40\x7e\x04\x3d\xe2\x4b\x94\xd7\xde\x95\xc7\x30\xc2\x10\x8b\x7b\x37\xce\xce\x61\x64\x0a\x74\x2b\x97\x51\x48\x43\x9c\x9e\x38\xe4\x29\xbb\x47\x2b\x3b\xe7\x36\x2a\xcd\xbb\x99\xdb\x08\xa4\x61\x6e\x83\x4e\x92\xc8\xad\x13\xb9\x54\xa8\x81\xd5\xcc\x1e\xda\x40\x9e\x41\x6b\x09\x14\x88\xfc\x40\x1e\x1e\xfe\x38\x7d\xba\xd1\xed\xf1\xd0\xd0\xd5\xc0\x52\xda\x89\xac\xc1\xfc\xd7\x17\xd1\x75\xb0\x6c\xe2\x79\xbe\x18\x9c\x7c\x7b\x12\xe9\x2a\x22\xeb\x23\x7d\x61\xbb\x89\x81\xd8\xad\xd5\x3c\x71\xc0\xdc\x49\xe3\x11\x65\x0c\x4c\xa0\xd8\xd0\x44\xd6\xc0\xdc\xe9\x8b\x51\x08\x6c\xb1\x9a\x1f\x52\x7e\x44\x5f\xd8\x70\x04\xcd\x10\x88\x36\x03\x23\x0b\xb1\xe6\x60\x36\x3b\x27\x63\x1b\xf3\xd9\x39\x91\xcf\x38\x45\x7d\x39\x40\x9e\x77\x7b\x78\xde\x70\xad\x3a\xc2\xd5\x8e\x83\x4a\x6c\xb8\x3d\x53\xc8\x72\x39\xd3\xdd\x9a\x3d\x62\xeb\x73\x68\xd9\x60\xbe\x44\x9c\x3e\x73\x7f\x22\x1f\xc6\x02\x9e\x33\x1a\x37\x2b\xda\xe7\xa3\xfe\x74\x2a\x1b\xcf\x87\xc9\x57\x0c\x56\xdf\x0c\xf9\x76\xc7\xcb\xe8\x30\xf7\x46\x45\xcc\xb7\x05\x37\xfd\xca\xbd\xf9\xb7\xc4\x06\x52\xaf\x88\xaf\x7c\xad\x2b\x1c\x7e\xf3\xfd\xe3\xef\x3c\x9f\x2f\x0b\x08\x96\x26\xcc\xd5\x6a\x0f\x23\x3a\x33\x45\xbf\xe8\x81\x2c\xe0\xd6\x5e\x83\xd9\xe7\x87\x18\x89\x1f\xbe\x7f\x37\xe1\x48\x99\x01\xcb\xfa\x12\xee\x2e\x6f\xad\x22\xc2\xb6\x68\xf2\x4b\x42\x47\x79\x73\xe3\x9b\x25\xf3\x2a\x3a\x07\xb9\xa2\x3d\xe3\x58\xab\x8b\x66\x33\x12\x5c\x31\xd4\x28\x70\x0c\x8f\x06\xf7\xca\x7f\x11\x0d\x28\x3a\xc9\xc3\xa2\xcb\x0b\x77\x32\xdb\x20\xce\x5f\x66\xb4\x49\x82\x20\x8d\x9e\x28\x14\x90\xdc\x5b\x8a\x44\x5e\x85\x2e\x59\xa0\x03\xae\xd0\xe3\x6f\xba\x1a\xc7\xdb\xbe\xe6\x73\xab\xd5\xf9\x78\x7c\xb3\x0b\xf9\xcc\x30\x6e\xa4\x3f\x2f\x71\xc5\x41\x7e\x72\x17\x3e\x3e\xc5\x58\xb3\x6b\xc7\xd1\x8f\x54\x68\x03\x7d\x66\x21\x13\xcb\x58\xc8\xf1\xc6\xb6\x2f\x94\xdd\xaa\x07\x1f\x8f\xaf\x87\xfd\xba\x75\x0c\x6f\x81\xc5\xe4\x4c\x5e\x18\xb5\x8e\x1d\xdd\xd0\x57\x4b\xa0\x32\xea\x76\xc4\x81\x8f\xfd\x28\x87\x86\x28\x1c\x3b\x22\x1b\xfc\x61\x31\x39\x14\x98\x8c\x95\x7d\x8c\x4d\xe1\x36\x26\x04\x76\x6a\x23\x0f\x76\xb5\x54\x33\xc3\x1e\x4c\xc7\xff\x19\x5a\x67\x3f\x93\x05\x3b\xcb\x07\x6c\x30\x1b\x2a\x86\xbe\xb0\xa2\x6d\x50\x83\x70\xb8\x34\x8c\x59\xf4\x53\x77\xe5\x53\x83\x71\x7d\xed\x3e\x36\xa1\x05\xcd\x75\x1c\x88\x93\x87\xda\xdb\xa1\x9b\x26\xe9\x1f\x71\x50\x4b\xd3\xb0\x0d\xc5\x98\xc5\xca\x15\xee\xa3\xbd\xb1\x40\xa0\x42\xd3\x4d\x2f\xbc\xfb\xd6\x4a\x51\xa0\x65\x69\xab\xd9\x30\xd6\x50\x7c\xc1\x81\x3e\x83\x6a\x3c\x54\xbc\x5b\xc5\xd4\xae\x6f\xf5\xb2\x98\xf5\x90\x94\x98\x97\x7d\xb4\x49\x1f\xbf\x2e\x15\xf9\xbe\x61\x2c\x91\xc6\xaf\x0a\x6b\x17\x09\x7a\x63\x98\x4b\xa4\x75\x1e\xf6\xa2\xc1\x13\xc2\x60\x60\x65\xe7\x6e\xb6\x99\x36\xcd\x39\xdd\x55\x15\x33\x15\x72\x32\x7f\xc5\x13\xc5\x8d\x80\x37\x06\x40\xdf\xf3\x8d\x95\xa9\x1c\xb6\x69\xc4\x84\x9e\xfd\x70\xf2\xf0\xf0\xfd\x7b\xfc\x54\x2c\xde\x0f\xfc\x85\xb5\x5b\xd5\xe9\xef\x05\xfc\x7c\xd7\x7c\xc1\x1f\x12\xaf\x89\x5e\xee\x5e\x98\x58\xb2\xa1\x9d\x88\x49\x40\xfe\xe6\xc8\x24\x10\x6f\x1e\x1c\x09\x70\xbe\xa7\x33\x05\x2e\x91\xdc\x01\x2a\x81\xa2\xcb\x92\x6e\x0d\x2d\x38\x9b\x41\x13\x91\x0d\x63\x06\xc1\x62\x1f\x93\x74\x05\x0e\x17\x27\xf1\xd7\xbb\x77\x1a\x93\x8f\xbb\x89\x86\xa1\x68\x7d\xb2\x9f\x29\xfc\x30\xb0\x4c\x1f\xb9\xf3\xd3\xe5\x7a\xe8\xee\x0d\x46\xf2\x65\x21\x5f\x45\x3e\x7f\x0e\x6a\xf0\x3f\x08\xfa\xe5\x4b\x1a\xaa\xa8\xe6\x7b\xa5\xfd\xcf\x99\x1e\x33\xe0\x3b\xd1\x69\x08\x7d\x48\xe1\x2e\x83\x89\xae\x14\xbd\xc2\x7d\x07\xe7\x8a\xde\xb3\x90\x31\x92\x66\x19\xc2\x6e\x89\xa5\x69\xfb\x03\xee\x13\x4d\x53\xa8\xfc\xaa\x78\x7a\xa1\xb0\x37\x46\xd4\x14\x6a\xe7\x31\x35\xae\x41\x42\x54\x3d\xd9\x13\x72\x47\x5b\xdd\xdb\x67\x90\xa5\xcc\x93\x28\x7f\xec\x4f\x99\x9a\x65\x0d\xbc\xc9\x31\x34\x12\xf6\x48\x3a\xd2\x5f\x9c\x59\x40\xfc\x34\x22\x6e\x82\xf6\x8f\x4c\xb1\xec\xed\x10\x2e\xd6\x70\x66\x2c\x61\x54\xd9\xd2\xde\x3a\x13\x9e\xd5\xcc\x8e\x79\x38\x87\x36\x88\x79\xe4\x4c\xb5\xe2\x1e\x5b\xfa\x68\x01\xec\x95\x09\xa3\x2a\x6c\x1c\xfd\xe5\xcf\xbf\x8e\xb9\xcb\xdf\xff\x1b\x95\xbd\xfc\xf9\x57\x58\xe7\x70\x6e\xc4\x14\xc3\x8e\xb8\x16\xc6\x02\x26\xe6\x42\x47\x5c\xe7\x68\x7c\xc9\xf4\x39\x1c\xca\xc6\x6a\xa1\xba\x15\x6b\xd6\x04\x8b\x11\x0c\xcf\xc6\x4e\x43\xab\xa3\x09\x07\xdb\x08\xaa\xe9\xd3\x2d\xbf\xf6\xa7\xab\x7b\x6f\xdb\x6f\xe1\xca\x32\x44\x78\xee\xe6\xee\x97\x4b\xd9\x1d\x26\x09\x9d\x84\x3a\x69\xb0\x22\x15\xac\x92\x5e\x36\x8f\xb8\x9f\x10\x19\x37\xcf\x25\x0a\x95\x38\xff\xc8\x22\x64\x6c\xa4\xbd\x9b\x98\x99\xf7\x1f\x26\x0a\x9a\x12\x16\xa2\x45\x2d\x00\x1b\x20\x9a\x61\xa6\xac\x16\x21\x05\xbe\xc3\xa7\x88\x57\x11\x25\xa1\xdd\x41\x2a\x62\xa7\x71\xb2\x62\xe4\x46\x51\x09\xf9\x8c\x3d\x21\x0f\x1c\xc7\xa1\xc7\xeb\xe1\x09\xc1\x9e\x10\xf4\x09\x79\x78\x88\x67\x29\x69\xd5\xe6\x52\xb6\xc2\x2b\x37\x7b\xd6\x1e\xb0\xa1\xbe\xd0\x6d\x1d\xcc\x86\xde\x2e\x9a\x6f\xd6\xfb\xec\xe1\x09\x79\xc0\x51\x8c\xfb\x8a\xd2\x5f\x51\x02\xc1\xd8\xef\x38\xfb\x9d\x64\xbe\xa1\x04\x4e\x72\xf4\x23\x8a\x3b\x4c\x67\xc2\x8e\x0f\xbd\xb7\x23\x4e\x7a\x45\xde\x0d\x6d\x43\x57\x93\x29\x71\x34\xc5\x5c\x42\x89\x18\xae\x2c\x78\x88\x52\x43\x7d\x71\xf6\x46\x46\x22\x3d\x92\x44\x49\xf6\x12\x7a\xe4\x10\xa8\xea\x30\x5c\xd7\x4a\xa4\x41\x91\x14\x81\x5f\x42\x83\x1a\x7a\x31\x71\x9f\x9d\xbb\xeb\xa1\x89\x24\x68\x02\xc5\x2f\x12\x83\xde\x93\xf0\x47\xc0\x0c\x24\x58\x12\xa3\x2e\x21\xc1\x0c\xe7\x86\xaa\x6b\xbb\xec\x52\xb0\x18\x8d\x5f\x44\x82\x3d\x91\xc2\xdf\x06\x9d\x81\x0e\x43\xd2\xc4\x65\x74\x9c\x4e\x07\xa3\x91\x09\x47\xc0\x36\xcc\x64\x9b\xe2\x50\x0c\xe5\x2e\x41\xcf\xb9\xe8\xbd\x9a\xe7\x70\xab\x9a\xc9\xd8\x71\x06\xbb\xa8\xab\x31\xd4\x45\xef\xf7\x82\x3b\xd3\x4d\x26\x40\x71\xcc\x45\xda\xc1\xb0\x20\x81\xc3\xd4\xc9\x19\x00\x92\x09\x71\x34\x77\x99\x24\xf8\x49\x47\xfb\x93\x55\xef\xc5\xdb\x24\x4a\x18\xca\x50\xe4\x45\x3d\x82\x11\x9e\x38\x87\x29\x7e\x62\x8f\x63\x18\xce\xd0\x97\x49\x42\x0e\x35\x7d\xbb\x7f\x09\xc1\x98\xcf\x86\x9a\x0e\x67\x89\x43\x23\x86\x51\x18\x76\xd1\x20\x8c\x51\xfb\xb5\x97\x7d\x4d\x7c\x9b\x22\x06\xcd\x5c\x36\xcc\x63\xf4\x50\x5f\x8c\xa0\x65\x0f\xcf\xab\xee\x29\xa4\x18\x8e\xbd\xac\x47\x98\x93\x70\xef\x2e\x6f\x80\xe4\x60\x82\xe1\x28\x4a\x90\x3e\x91\x98\x58\x9b\xb8\x56\x7f\x69\xb0\x3d\x5b\xaf\x0f\x26\x02\xa5\x3c\x4e\xb4\x8a\x78\xb9\x2b\x50\x38\x5f\xef\x77\x8b\xdd\x32\xc1\xbf\xbd\xf0\xfd\x7e\xa9\xdf\x7f\xc5\x5f\xcb\xfd\xb7\xb7\x36\x2d\xbc\xf5\x85\x4e\xb3\x5a\xe8\x0f\x24\xbe\x47\x33\xfd\x06\x19\xd6\x50\x2c\x11\xdc\x25\xd2\xaf\x96\xe8\xb6\x48\x36\xc4\x8a\xd0\xcc\xd7\xc5\x62\x8e\x21\x70\x9e\x24\xe8\x01\xd5\x14\x0b\x52\xbb\x56\xea\x55\x99\x52\xae\x96\xaf\xb7\x6a\x95\x62\x83\x94\x18\xe1\xad\xf7\xda\xcd\x4c\x84\x70\x88\xe4\xda\xcd\xb7\x72\xa5\x86\xe7\x2b\x44\x51\x6c\x91\xb9\x7e\xad\x58\x17\x0b\xb5\xe2\x4b\x57\x6c\x76\xf1\xf2\x1b\x31\xa8\x17\xa5\x72\x43\xec\xe6\x85\x06\x2f\xf5\x98\x56\x9e\x69\xf4\xf1\xf2\xc3\xb5\xdb\x3e\x9c\x2c\x30\xa5\x1b\xfc\xad\x72\xc7\x5d\xae\xdf\x2c\x98\xbc\x25\xe2\x09\x21\x9e\x10\xdb\x5c\xc1\x0c\xc6\x71\xbe\xd9\xe1\x6a\xd3\xf0\x26\x29\x41\xc3\x50\x4c\xa8\xea\xf6\x10\xcc\x96\x63\xb0\x58\xcd\x49\xc7\x9c\xbb\x52\xe1\xe1\x46\x9b\xb9\x66\x79\xff\x2e\x7a\x3e\x99\x52\xb9\xf9\x6e\x36\x2d\x47\xad\xee\x5f\xab\xe6\xfd\x0a\x7f\x40\xcf\x38\x46\x32\x24\x4b\xa2\x14\xc3\xb8\x4c\x39\xee\xf2\xf7\x27\x2f\x86\x7c\xfa\x8e\x7c\xc2\x9c\xfc\xfc\x9b\x9f\xa7\x7f\x7a\x42\x3e\x1d\xb7\x91\x38\x8f\xbb\x52\xe1\x78\xd3\x99\x7d\x3b\x37\xc3\x5d\x77\x84\xf0\xb6\x93\x38\x30\xd7\xf6\xe1\xa7\xff\x8d\x73\xca\xb0\x70\x78\x48\x38\xdc\x35\xed\xff\x7f\x84\xc3\x18\x27\x5a\x30\x04\xce\x62\xf1\x3d\xf7\xdf\x2a\x1f\x16\x92\x2f\xae\xf3\xfe\x5b\xe5\x73\xfa\x0f\x67\x59\x92\x43\x29\x8e\xa5\xbc\xfe\x43\x5d\x01\x67\xfa\x5c\x77\xe5\xe3\x70\x9c\x20\x18\x1c\x25\x68\x96\xfa\x46\x32\x0c\xc5\xa2\xcc\x7f\x95\x8c\xd8\x13\xc2\x52\x2c\xc7\x11\x2c\xcd\x72\x87\x19\xfe\xdf\x9f\x2c\xdb\x99\xfe\x2e\x46\x43\x19\xcc\xc0\x42\x81\x7e\x67\x1e\xfa\x31\x33\x01\xe2\x94\x40\xb4\x8d\x9c\x9b\xc7\x5e\x4b\x0b\x60\xeb\x6b\x78\xb5\x3c\xc4\x13\x82\x79\x02\x6d\xa0\x3e\x1a\x3b\xf4\xb0\x27\xe4\x93\x37\x18\x0f\xa7\x70\xf7\xcb\x2c\xc9\xe5\x8a\xc4\x19\xdf\x90\x7e\x92\x96\x7d\x02\x3f\x5b\xcb\x21\x79\x32\x6a\xf9\xba\xfc\xce\xe3\x2a\x25\x00\x47\x6d\x2b\xbb\x36\x00\xef\xb7\x96\xed\x85\xa5\x9c\x44\x07\x67\x08\x9a\xc1\x14\x0e\x43\x09\x0d\x25\x51\x05\x62\x14\x03\x70\x8a\x50\x09\x4e\x61\x15\x0c\x00\x94\x84\xa4\x4a\x41\x1a\x28\x0a\x0d\x70\x02\xc3\x58\x48\x10\x34\x09\x34\x8a\x44\x15\x37\x31\xc2\x38\x8a\xc2\x39\x88\x41\x4a\x81\x34\xa5\x00\x0e\x53\x39\x45\x26\x29\x05\x42\x0d\x43\x15\x4d\x61\x9d\xd9\x37\x41\xb0\xb4\x42\xa0\x24\x89\x13\x2c\x0b\x31\x4a\x55\x14\x48\xd3\x9c\x2a\x53\x5e\x42\x82\x85\x66\x0c\xf4\x77\x82\xfc\x4e\xb2\xe1\x89\x84\x7f\xfb\x1b\x4a\x90\x24\xcd\xa5\x3e\xf5\x82\x30\x41\x93\x2c\xfa\x84\x60\xb4\xd3\x9f\x67\xd7\x13\x42\x39\xff\x61\xfe\x7f\xfb\x9b\xd8\xe1\x0f\x87\x35\x9e\xe7\xf9\xfc\x76\xf6\x5a\x85\xe5\xd9\xc7\xbc\x5f\x9d\xaa\x8b\x5a\x5b\x61\xd6\x42\xfd\xb9\x32\xcd\xf1\x1f\x63\xab\x2e\xb4\x26\x7a\xa3\xa8\x7e\x34\x06\x4b\x1c\x7b\x6f\x01\x0c\x6b\x17\x35\xc1\xb2\x80\xdd\xe9\x34\xf8\x32\x57\x86\x6b\x5e\xa2\x40\xf3\x75\xc6\x97\xe6\x3d\x61\x80\xef\x96\xad\xba\x82\x8e\x1c\xd4\x7c\xbf\xf9\x5a\xaf\xf2\xc7\xeb\x7d\x23\x6d\xcd\xa2\xcc\x42\xfb\x9d\x1c\x49\xea\xb6\xa1\x73\x45\xac\x3a\x91\xeb\x75\x39\x37\x2e\xbc\xa8\xd5\xfe\xae\xda\x7e\xdf\x15\x3b\x2f\xf6\xa4\xbe\xda\xf6\xf4\x65\x7b\x29\x37\x34\xa9\x5e\x99\x4b\xb6\x58\xae\xbe\x63\x8c\xd5\xed\xb5\xdf\xe6\x4d\xb1\xfc\xfe\x36\xee\x0e\xc8\x2a\x41\xb8\x98\xbb\x22\x59\x03\x1f\x4b\xbc\x15\xa0\x56\x46\xf9\x88\x6b\xc0\xf7\x31\xb2\xc5\xf3\x05\xf4\x25\xea\xf1\xbf\xfa\xf2\xab\xba\x31\x7e\x1f\x76\x05\xf2\x3e\x66\xfc\x80\x63\x04\xa6\x90\xb4\x4a\x50\x0a\x24\x59\x45\xa1\x28\x02\xd5\x00\xc0\x14\x5c\x51\x00\xa5\x42\xc0\xd2\x18\xd0\x54\x0d\x65\x08\x94\xa2\x15\x19\xd5\x30\x86\xa5\x64\x42\x46\x71\x05\x90\x0c\x48\x72\x05\x26\xd6\xd8\x29\x16\xc7\xe2\x5d\x61\xff\xd4\x4b\x69\x68\x0e\x63\xc9\x04\x57\x20\x33\xba\xc2\x4e\xd8\x6e\x4b\x28\xf6\x31\x9d\xd4\x5f\x3b\x05\xda\x50\x6a\xf5\xa5\x4a\x1b\x6f\xe0\x59\xcb\x7d\xe4\x7a\xbb\x0d\xdb\x1f\xcb\x8d\x4d\xad\xda\xa6\x51\x8d\x83\x85\x26\x00\xc2\x6b\xde\xe4\x5a\x62\xbf\xdb\x85\x0a\x61\x76\x8a\xb2\x3c\x36\x89\x5a\xa1\xf3\x5a\xc5\x46\xd4\xae\x25\xaf\x99\x8a\xdb\x75\x8e\x2b\xbc\x6c\x8e\x5d\x29\xae\x8d\x16\xa5\xa1\x63\xb2\xdf\x58\xe1\x1f\x1f\xaa\xb8\x7c\xc4\xc1\x5b\x51\xff\xe8\xd5\x9f\x3b\x7a\xd5\xca\x17\xcd\xd1\xfb\x63\xd9\x7c\xa5\x2b\x8f\x7d\x9a\xfc\x68\x02\x66\xb2\x29\xcd\x1a\x8f\x46\x83\x99\x6f\xb4\x9a\x3c\x2b\x88\xc5\xb9\x06\x6c\x3e\x6f\xe6\xac\x41\x17\x27\x29\x52\x77\xbd\xae\x15\xe1\x0a\xa5\x56\x94\x39\xfd\xdf\x71\x05\xe2\x3e\x66\xfc\x80\xd2\x28\x81\x6a\xb4\xc6\x12\x34\x4b\xa8\x8a\xc6\xc9\xaa\x4c\x13\x14\x4d\xa2\xaa\x06\x19\x96\xc1\x71\x14\x27\x65\x1a\x25\x38\x06\xa5\x55\x86\x93\xa1\xca\x28\x14\x64\x59\x0d\xd5\x18\x6e\xbf\x2c\x13\xed\x0a\x74\xac\xb1\x33\x18\x89\xa6\x3f\xf5\xb3\x5f\x8c\x65\xd9\x04\x57\x20\x32\xba\xc2\xe6\xad\x50\xc0\x1f\x0b\xa0\x40\x34\xe7\x9c\x3d\x79\x9d\x16\x34\x8a\x54\x74\x7e\x6a\x8f\x1a\xfd\x9c\x0d\x65\xa6\xbf\x85\x7a\xb3\x40\x4c\x79\xad\xaa\x8f\xc6\xe6\x94\x78\xaf\x57\x3a\xed\xca\x0c\xbc\x3c\x5a\xcd\x9d\xd8\x7f\xc9\x77\xeb\xf4\x40\x52\x3f\xa8\xb5\xfe\xd6\x64\x4a\xdb\x4d\xdd\xb3\x42\xd7\x15\x46\xc7\xae\xac\xd5\xaa\x4d\xb9\x6e\x4c\xca\x8f\xed\xf6\x63\x47\xca\x15\xaa\xa5\xdc\xb3\xbd\xd2\xca\xf8\xbc\x86\xe1\x8a\x92\x2f\x9b\xd8\xcb\x02\x67\x76\x4d\x7e\x0b\xf2\xab\x97\xd2\x4c\xed\xe0\x40\x12\x2c\xd3\x52\x61\x65\x29\x6b\x92\x28\xcc\xea\xf9\x95\xb5\xb3\xa6\x9d\xf9\x40\x65\xf3\xe3\x2e\xeb\xba\x5a\x3d\xc2\x15\x04\x2b\xca\x9c\xfe\xef\xb8\x02\x7e\x1f\x33\x7e\xa0\x09\x95\x63\x35\x8a\xa0\x21\xa4\x59\x15\x93\x71\x46\xa6\x64\x96\xd3\x70\x02\x68\x14\x81\x61\x32\x43\xd1\x1c\xc0\x49\x0d\x68\x18\x89\x12\x40\x45\x65\x0a\x97\x69\x82\x90\x51\x46\x86\x9c\x9b\xc7\x78\x53\xec\x73\xab\xa6\x62\x8d\x9d\x25\x09\x06\x4f\x7c\x4a\x3c\xec\x27\x15\x24\xc5\xe1\x09\x9e\x80\x67\xf4\x04\xbc\x39\x98\x60\xe2\x8a\x32\x50\xf9\x85\xe9\x91\x8b\x5d\x63\xdd\xdd\x96\x88\xd7\xa5\x31\x7d\x5c\x17\xf9\x86\x9d\xc7\xaa\x78\x9d\xc9\x31\xf4\xa0\xfb\x02\xb9\x06\x35\xe5\x3f\xc4\x8f\xd5\x33\xbd\x44\x07\x2f\xc6\x80\x65\xc7\x68\xa7\xb0\x92\x89\xd5\x9b\x35\x1b\xbc\x30\x8a\x64\xb5\x7b\xbe\xf5\xbb\x9e\xe0\x1a\x67\xe5\xf0\x1f\xef\xfe\xb6\x8e\xbf\x37\x7c\xb3\x35\xf5\xbb\x7a\xd1\xaa\x54\xf5\x4d\x8b\xd9\x61\xbb\x11\xcd\x09\x6d\xd4\x14\x1e\x59\xdb\xee\x6d\x27\xaa\xc4\xa9\xcb\xb1\x59\x61\x64\x75\x41\xbf\x49\x64\xbe\x91\x47\x5f\xcb\x6b\x5d\x2f\x2f\xab\x14\xd1\x16\xed\xba\x59\x5f\x4c\xb6\xdd\x95\xcc\xa3\x15\xe9\x45\xf9\xd8\xe5\x96\xbb\x89\x4a\xe3\x1e\xe2\x4a\x84\xa7\x14\x2a\x51\xd6\xf6\x5f\xee\x29\x78\x76\x4f\xc1\xee\x63\xe5\xee\x26\x18\x67\x0a\x89\xba\xf9\x18\x83\x7e\x45\xb1\xaf\x28\x86\xa0\xe8\x77\xf7\x5f\xac\x35\x73\x0c\xc3\xc5\x4f\x15\xf6\x4f\x49\x9c\x23\x39\x9a\xc1\x39\x3a\xc1\xd6\xa3\x2d\xdd\x63\xe9\x9f\xee\x94\xf8\x2b\xd7\xaf\xea\xe4\xee\x79\x27\x55\x73\x4c\x61\x51\xe0\xca\x38\xba\x9d\xe4\x1e\x2d\x74\x64\x5b\x9b\xca\xe6\x03\xeb\xab\x52\xef\x0d\xe4\x5e\x40\xd1\x75\x28\x21\xc2\x88\xa3\xaf\xbd\x11\xf3\x7c\x6e\xfa\x0b\x04\xb9\xeb\xf5\xe0\x19\x53\xfa\x34\x3b\xc3\x6b\x26\xd7\xce\xba\x63\x76\x0f\xc5\x56\xc1\x63\x3c\x2e\x05\xcd\x59\xbd\xf9\x3a\x34\x44\xb8\xb2\x7b\x1d\x1a\x32\x5c\x40\xbd\x0e\x0d\x15\xaa\x53\x5e\x89\x86\x0e\x95\x02\xaf\xc3\xc2\x84\x0a\x70\xd7\x61\x61\x43\xf5\xac\xeb\xb0\x70\xa1\x32\xd5\x7d\xde\x25\xba\xcb\x52\x53\xf2\x46\xb7\x27\x84\xcb\xba\xf4\x14\xf3\x46\xcd\xcd\x6e\x18\xf0\x99\x13\x87\x39\xfc\xa0\x0f\x13\x8f\xbf\x3f\xd9\xc6\x4d\x75\xd4\x27\xe4\x93\x66\x1a\xf3\x9b\xaa\x84\x4f\xc8\xbf\x7b\xcd\xe8\x27\xac\x70\x47\xf4\xd5\xe9\xa8\x74\xf8\x81\x46\xf4\xd5\xf5\x7a\x3e\xf6\xd5\xf5\xfd\xfd\x6f\x5f\x22\xfa\x09\xbb\x1e\xa2\xba\xeb\x64\x79\xe9\xf0\x83\x74\xfb\x8a\xce\xb6\xd4\x64\x9b\x2b\xcb\x86\xf0\xd6\x0e\x71\xd1\x18\xe6\xcd\x3e\xf8\xef\xe8\xb9\x9f\xee\x68\xc1\x18\x77\xf8\x9b\x0d\x2c\xed\x68\xab\x85\xea\xcb\x72\xe5\x9e\x13\x57\x2f\xde\xce\x8f\x5b\x3b\x37\x7d\x9d\xe9\xc6\xbd\x31\x97\x68\xcd\x8f\xc6\x87\xbf\xc9\x9f\xab\xb5\xeb\x6d\xf9\xa7\x6b\x2d\x25\xb4\x47\xbc\xd9\x99\x25\xac\xa7\x63\x4d\x7f\xc9\xed\xda\xf4\x21\x76\x73\x7c\x64\x1e\x4f\xc7\x67\x76\xa9\x88\xf0\x70\x2e\x72\x2d\x22\x22\x1c\x28\xaf\x45\x44\x86\x10\x5d\x2d\x5a\x38\x16\x5c\x8d\x88\x3e\x1d\x9b\xe2\x72\xf1\x54\x3c\x4c\x68\x8c\xbb\x16\x0f\x7b\xea\xf5\x57\xf3\xc3\x9d\xe2\xc1\xef\xf5\x5e\xe3\x5d\x32\xfb\xb4\x37\x3b\x2e\xc8\xed\x63\xdf\xeb\xbb\x83\x7b\x06\xdf\x78\x20\x50\x06\x53\x51\x9c\x63\x09\xa0\xb2\x32\x83\x32\x04\x21\xb3\x10\x52\x38\xc0\x38\x86\xa4\x00\x41\xd3\x2a\x83\x29\x98\xc6\x90\x14\x85\x71\x1c\xc3\x10\x90\xa1\x59\x42\x55\x01\x40\x09\xea\xe1\x09\xf1\x36\x35\x5c\x1f\x78\x03\x05\x56\x72\x5f\x58\x8a\x5f\xb3\xa6\xe3\xd7\xf8\xfc\x87\x27\x43\x83\x57\x8f\xaa\xd2\x13\xa8\x13\x93\xb9\x51\x61\x3b\xa5\x59\xe1\x19\x8e\x14\x82\x69\xf6\xed\x72\xb5\xfa\xd1\x7b\x65\x37\xaf\xfa\x20\x07\xf2\x2b\xaa\x46\xd5\x79\xb7\x9e\xc3\xef\xeb\xa5\xf9\x50\xb9\x24\x77\xfc\x53\x70\xff\xb7\xe5\x51\xbf\x4d\x0b\x8c\x51\xa8\xa1\xb5\xd6\xe3\xe6\x4d\xca\x73\x1f\xfd\x75\xff\xb5\x43\x6c\xf5\xa6\xfe\xb6\x92\x64\xac\xb0\x9e\xb7\x6a\x90\x75\xdb\xbf\xbe\x8a\x5e\x43\x3e\x8f\xad\x72\x6a\xd9\xe8\xac\x46\xf5\x75\xcb\x2e\x30\xb9\x71\xa5\x46\x88\x90\x53\x5f\x9b\x5a\xa9\xf2\xf8\xa2\x53\x2f\xeb\x6e\xe3\x71\xc0\xdb\xcc\xc6\x69\xa9\x56\xd4\x55\x60\x9d\x83\x2f\x1d\xf8\x6d\xbd\x30\x5a\x8d\xae\xd6\xed\x49\x81\x86\xb3\xee\x88\x6e\x08\x2a\x6a\xac\xd7\x63\x79\xbe\x18\x88\x1f\x75\xfc\xbd\xce\x77\xd9\x42\x6f\xc7\xbc\x4f\x66\xd3\x45\x5b\xe8\x54\x30\x85\xdb\x81\xd7\xb1\x64\xd6\x66\x2b\x79\xa7\x1b\x94\xb0\xed\x01\x12\xd7\x72\x42\xbd\xde\x7f\x6f\xf0\x98\xde\x7a\xfb\xf1\x10\xac\xe7\x05\x17\xfd\x5a\x51\xfa\xe0\x8f\xf0\xc7\x22\x74\xc1\x05\x0a\x34\x35\xdf\x45\xba\x06\x1b\x60\x34\xd9\xd6\x41\xb7\xc9\xd1\xb9\x0f\xcd\xe2\x20\xaa\x18\xa6\x38\xe8\x7f\xe4\x7a\x2f\xd3\xa2\x51\x65\xa6\xeb\xa9\xb7\xbc\xd9\xa0\xcc\x97\xc6\xb1\x3f\x72\x21\xfa\x27\x7d\x11\x71\xe5\xee\x4c\x3f\x7f\x0d\x7d\xde\xed\xb6\xfa\x11\xd0\x6d\x9f\x5f\x19\x84\x61\x93\xd4\x7b\xbe\x29\x6c\x97\xad\x67\xc2\x28\x8b\x8f\x1f\x18\xd3\xde\xe9\x16\x36\xd3\xea\xc5\xb7\x79\xab\x37\x32\x57\xd2\x63\xc7\x6d\x54\x7c\xed\xa2\x3e\xe1\x5a\x8f\x2c\xa2\x70\xdc\xa0\xf9\x1d\x97\x47\x9b\x56\x49\x18\xad\x15\x8c\xc1\xb0\x2e\xc7\xbe\x4d\xc8\x79\x6d\x3a\xe7\x5a\x0c\x35\xcd\x13\x6b\x9e\xcf\x01\x76\x9b\xa3\x5b\x7c\xee\xf9\x70\x6d\xa2\x78\x76\x7f\x17\xff\x09\xfe\x70\x76\x54\xe8\x25\xf2\xf7\xe3\x68\x5b\x47\x5d\x16\x8e\xcf\x2f\xe5\x95\x67\xe6\xd6\x5c\x39\xe2\x13\xf8\x90\x2d\xf3\xd1\xfd\x1c\xa1\xab\xab\xe9\x4f\xc9\xeb\xe8\x7b\xba\xf8\x7b\x61\xb3\x6b\xc3\xd8\xe1\xf5\xe6\x92\x7e\x95\x0a\x06\xd9\x26\x24\xfd\xf1\xb1\xb8\x02\xea\x94\xa8\x7f\x00\x63\x93\xeb\x6c\x44\xb9\xb6\x7a\x6f\xf4\x24\x55\x68\xd7\x27\xaf\x1f\xc4\xcb\xb2\x57\xac\x5a\xab\x1e\xb5\xae\x56\x27\xd3\x4e\x71\x60\x4e\x06\xac\xd0\xda\x6c\xa1\x41\x16\x7a\x2f\xb9\xd1\x8f\x1f\x6e\x66\xeb\xbe\x87\xbb\x5f\x6c\xf0\xfe\x77\xc2\x96\x3b\x3c\xa7\x47\xee\x60\x7c\xa1\x19\x95\x90\x55\x8a\x02\x34\x87\xe2\x34\x4e\xaa\x28\xa1\x11\x2c\x47\xc9\x0a\x87\xc9\x1a\xcb\x29\x32\x4a\x30\x9c\xcc\x50\x2a\xc1\x41\x4a\xe6\x18\x55\x21\x54\x92\x64\x01\x0d\x21\xa5\xc8\x0f\x4f\x08\xb9\x8f\x2f\x57\x4e\xc9\x03\xf1\x85\x48\x8b\x2f\x14\x4b\x30\x49\x9b\x48\xbc\xa7\x27\xa9\xde\xc3\xe5\x16\x7f\x12\x61\xc2\xbd\x7e\x16\x61\x2e\x1c\xb1\xae\x8e\x30\xbd\x75\xbd\x05\x4f\xd6\x2f\xca\x07\x7e\x5b\xf5\xf5\xc7\xa4\xa7\x74\x21\x9b\x57\x37\xfd\x67\x65\x46\x2d\xb7\x78\x67\xfa\x66\xd3\x0c\xde\xee\x37\x8a\xeb\x97\x46\xa7\x4a\x69\x55\x5a\x9a\xe4\x96\xcd\x72\x69\x42\x09\x95\xe2\x36\xdf\xee\xab\x35\xbe\xb8\xc3\xab\xd8\x42\x9a\x96\xa5\x45\x65\xca\x89\xf8\xfb\x66\xd3\xaa\x6e\xaa\x98\xb5\xd9\xdc\x2f\xc2\x04\x80\x2e\x8c\xc8\xee\x08\xbf\x38\xf6\x47\xcc\x95\x12\x61\xee\x47\xff\x7c\x14\xc8\x40\xff\x6c\x54\xfc\xa5\x23\xf8\x81\x95\x2c\x11\xe6\x5f\x1a\x01\x23\x23\x4c\x20\xfb\xbb\x30\x5b\x73\x47\x78\x83\x3f\xe2\x8b\xb9\x92\x23\x8c\x70\x1b\xfd\x60\x84\xbb\x84\xbe\x1f\x61\x76\xcf\x0d\x71\xb0\x6d\x33\x9b\x17\x22\xa7\x71\xbb\xfe\x7c\x51\x1e\x34\xda\x3a\x61\xae\x07\x45\x85\xec\xb1\x53\xaa\x6e\xce\x58\x73\x59\xad\x97\xa6\xac\x02\x9a\xd3\xd6\xa8\x2f\xbc\x14\x55\xd4\xe2\xfb\xb5\x37\xb3\xa7\x56\x5b\x6a\x55\xd1\x3b\x28\x01\xcc\x42\x8e\x37\x79\xb3\xf7\x51\xe0\xef\x1d\x61\x64\x95\x64\x69\x55\x56\x55\x14\x57\x49\x1a\x65\x31\x86\x66\x30\x85\x04\x14\x60\x20\xa7\xd2\x90\xa5\x29\x05\xe0\x9c\x22\x93\x18\xa4\x71\x95\x01\x40\x63\x50\x80\x6b\x10\x52\x32\x41\xab\xd0\x7b\xa3\xea\x5e\x33\x98\xd4\x08\xc3\x60\x54\x7c\x80\xf1\x1f\x9e\x54\x00\x6e\x9d\xc1\x24\xc4\x97\x37\xfe\xea\x78\x41\x1c\x5d\xe9\x88\x2f\x30\x23\xc9\x71\xd3\x79\xb5\x87\xbf\x13\x6b\xa6\xa5\xed\xd8\x66\x1d\x4e\x05\x19\xeb\x74\x2a\x94\xbe\x7d\x9f\x56\xd0\x9c\x31\xea\x9b\x0d\x9b\x19\x35\x30\x1a\x6f\xc9\xd3\x31\xae\x4a\x9d\xae\x06\x0b\xc6\x5a\x41\x9b\x3c\xd0\xc6\x85\xfe\xd6\x1e\xbf\xf2\x33\xab\xb6\x9a\xcc\x72\xf3\xdd\x24\xc7\x67\x9a\x91\x94\x82\x86\x1c\x17\x2f\xf8\xc0\xde\xc9\x6b\x66\x04\xb7\xc6\x8b\x3b\xd2\xbf\x2e\x5e\x78\x1b\xda\xf8\x9f\x90\x45\x9f\x5f\xc9\x63\xdc\x3f\x98\xc5\xf3\xfc\xbf\x37\x5e\xa6\xc6\xa3\x2b\x74\x75\x73\x3c\xba\x63\x5f\x5d\x42\xdf\x8f\x47\x65\x5c\x7a\x5b\xca\xc0\x84\xcf\x76\xee\xb9\xb6\x61\xb7\x74\xab\xbd\x7e\x15\xeb\x93\x79\xad\xf4\xde\x9a\xb4\x4a\x7a\x0e\x5a\x34\xb1\xe2\x99\xbe\x39\xc8\xad\xa4\xf2\x00\x7b\x11\xdb\x1c\xd9\xd0\xb9\x8f\x16\x9b\x5b\x3e\x0a\xa2\x56\xc2\x8b\xdd\x7c\x6f\xb3\xa2\x1b\xdd\x92\x5c\xad\x0b\xf7\x9f\xf1\xd0\x34\x4d\x53\x34\xa0\x21\x50\x21\x8e\xb2\xb8\x42\x31\x2c\x4a\x31\x98\x33\x13\xe2\x20\x49\x52\x04\x84\x90\x62\x58\x4c\x01\x1c\xa0\x58\x00\x08\x8c\x83\x32\xaa\x41\x96\x20\x29\x4a\x53\xbd\x5d\x65\xd8\x2d\xcb\x0b\xde\x8a\x6f\x62\x18\x62\x49\x9a\x4d\xda\xf9\xe8\x3d\x0d\x56\x7e\x3d\x5b\x2c\xd5\xd8\x72\x6b\xdd\x9a\xca\x55\xbc\xcc\x13\xbd\xd7\x49\xdb\xac\xce\x27\x7d\x14\xd5\x4a\xac\x55\xab\x30\x73\x54\x68\x6f\x5e\x7a\xcf\x7c\xdf\x7d\x93\x62\x70\xec\xc4\x84\x38\xe4\x5d\x57\xe4\xcd\xc1\xb7\x41\x72\xaf\xeb\x4d\x91\x73\xfc\x48\xc8\xa9\x85\x3e\xc4\x89\x2e\x09\xb9\x3c\x2e\x6d\x97\xb9\xda\xa0\xbd\xc5\xcc\x97\x0f\xa9\x58\x7b\x41\xb7\x85\x02\xba\xaa\x96\x96\xf3\x77\x59\x9b\x15\x3a\x8f\xfd\x7e\xe5\x9d\xee\xea\x85\xdc\xc7\xbc\xb8\xb5\x1f\x4b\x8d\xc7\xfe\x7b\xd1\x68\x35\x55\xb3\xdf\x61\x96\x98\x51\x1b\x54\xca\xef\x9d\x7a\x33\x43\xec\x39\x31\xda\xd3\xd8\x13\x90\xf9\x38\xf6\x06\xfc\x39\xa7\x3f\xe7\xd0\x1a\xfa\x52\xda\xd9\xe3\x8d\x88\xcd\xde\x50\xb0\x5b\x1a\x18\x27\x96\xb7\xeb\x5a\x7e\xd7\xa0\xec\x9c\xa0\xe4\x3d\x19\x89\x91\x6d\x36\x16\x6f\xcf\x2c\x79\x6c\x1f\x13\x8b\x92\xfd\xf9\x06\xfa\xa2\xb9\xeb\x74\x6f\xa0\xcf\xf3\xff\x5c\x7e\x1d\x39\xb6\xe6\xae\xd7\x45\x63\x31\x48\x14\x33\x4d\x17\xb7\xf6\x85\x63\x0b\x8f\x4a\x08\xdf\x45\xba\xf8\xbb\xdf\xc2\x08\xdb\xc6\x1a\xe5\x75\xcb\x9e\x5a\xa0\x25\xe1\x5d\x45\x05\x3b\x05\x1d\x4b\x3b\xb5\xde\xda\x70\x35\x7d\xfc\x3e\x78\x9f\x13\x54\x0b\x7d\x9e\x61\xbb\xea\x6a\x56\x19\x6d\x14\x6a\xac\xc8\xda\x78\xb2\x9e\xd1\x63\x20\x14\x08\x80\xa1\x8f\xb4\x0a\xf2\xb8\x94\xa3\xa7\x1f\x85\xcd\xbd\xc7\x56\x14\x42\x0c\x53\x55\x99\x64\x31\x06\xd0\x18\x4d\x69\x28\x8d\x2b\x38\x8b\x33\x84\xac\x51\x38\xa6\x72\xb2\x06\x55\x05\x90\x10\x10\x28\xa9\x31\xb2\x0a\x55\x5c\x91\x59\xa8\x92\x38\x2e\x33\xf0\xb8\x4b\xfc\x86\xb1\x15\x4f\x1d\x5b\x29\x14\x4d\x18\x5b\x29\x14\x3d\xec\x2a\xf7\x57\xb1\x6e\x1d\x5b\x13\x56\x29\xbc\xeb\x8a\x1c\x33\x66\x6c\xe5\x07\x79\x49\x2a\xca\xdd\x6a\x45\xaf\x74\xc6\x39\x22\x57\x29\x6b\xd8\x8a\x1a\xa1\xeb\x82\x34\x68\xa1\xf9\x02\xa9\xe5\xf8\xc7\x65\xf3\xbd\xdb\x7a\xe6\xd4\x8d\xd4\x90\x6a\x8f\x62\xa9\x3e\x18\xac\x67\x38\x7c\xe9\xa1\x38\x6c\xb4\x85\x49\x83\x6c\xbd\xb6\x49\xa5\xa2\xcc\xdb\xf3\x9c\xfa\x26\xfe\xbb\xc6\xd6\x5b\xc7\xb6\x5b\xfd\xb9\xbe\xa9\xcd\xad\x7b\x8e\xad\xbf\x30\x57\x4c\xcb\x5b\x7f\xe5\xd8\xc6\xdf\x69\x6c\xbd\x36\xce\xfa\x63\x6b\xa9\x35\x9d\x8e\x7b\x58\x5e\xaf\xe8\x02\xd9\x52\x37\x52\x8e\xe0\xe4\xd5\x9b\x58\xdb\xa0\xf3\xae\xc8\x8f\x1e\xcb\x9b\x56\xf3\xbd\x43\xcf\x84\xe6\x73\x5f\x11\x26\x53\xfd\x79\xd2\x9e\x94\x7a\x32\xa5\x2e\xf4\x57\x5b\x5c\x4c\xa6\xed\xca\xc7\x4a\x28\x76\x61\x39\x5f\x7e\x99\x0e\x46\xfd\x5e\xa1\x95\x6d\x6c\x8d\x3d\x63\xea\xfc\x08\xe6\xc3\x71\x8f\xfb\xaf\x2d\x5f\xfa\x95\xc4\x00\x46\xef\x38\xb8\x42\x21\xf8\xed\xe6\x30\x41\xa4\xd9\xae\xd4\xf9\xf6\x1b\x52\x15\xde\x90\xcf\xba\x9a\x76\x0c\x54\xf4\x91\xd4\x37\x73\x1d\xc2\x1a\xc5\x79\x14\xe1\x54\xee\x43\x9f\xce\x09\x7d\x67\x26\xe3\x91\xde\x37\x4b\x77\x4a\x36\x4a\xb8\xab\x18\x43\xba\x62\xa5\xd5\x15\x90\xcf\x47\xf0\xa7\xc0\x79\x47\x4f\x27\xa7\x13\x5d\xa8\x9a\xfb\x74\xeb\xc5\x82\x5f\xd4\xa9\x31\x9b\xcf\x53\x76\x78\xdf\x57\xb2\x68\x22\x49\x92\x26\xb0\x95\x59\xf2\xd8\x0d\x3a\xa9\x7b\x60\xee\x2b\x7d\x1c\x99\x24\xf9\x13\x59\x4b\xd5\x80\x67\xd2\xf2\xce\xb5\xf6\xbd\x20\x15\xb1\x20\xf4\xb3\x7d\x6a\xdb\x05\x3d\xc5\x82\x34\xc4\xb0\x33\x74\xa5\x8a\x58\x42\x64\xdb\x84\x30\xe8\x5d\xf1\xdc\x78\x3e\x76\x3b\x3f\xfe\x49\x62\x99\x38\x8a\xf1\x6b\xf9\xf0\xb9\xb2\xab\xd9\x39\xa2\x08\x72\x72\x32\x1b\x38\xe5\xc7\x03\x7e\x3a\xfb\xf0\x77\x14\x73\x63\x60\x8d\x6f\xe1\xcc\xfd\xfe\x79\x26\xb6\xc2\x5f\x4d\x8f\xe2\xc6\x7b\x41\xf0\x16\x7e\x3c\x0c\xd9\x38\x0a\x7d\x92\xfd\xe9\xfc\xeb\xeb\x91\x2e\x3f\x84\x8e\x6d\xb8\xcf\xaf\xe0\xd4\x8f\x12\x1e\xc3\x21\x74\x41\xb6\xf7\xdf\x98\x39\xe1\x38\xea\x20\x92\xa7\xfd\xa1\x23\x71\xcc\x1e\x3f\xf5\x7c\x23\x9b\xba\x9a\x99\xc1\xe3\xa9\x0b\x4f\x91\xa7\xa7\xa4\x30\x6d\x2c\x87\xcb\x7b\xf1\xed\xe3\x0a\xb2\x1e\x13\xaa\xae\x92\x24\x5a\x00\x7b\x7b\x3f\x01\x7c\x5c\x31\x36\x7d\xa5\x08\xa7\x47\x68\x9c\x0b\x61\x2c\x1d\xab\x1c\x1b\x57\xc9\xe0\x33\x7f\xc4\x71\xad\xf2\x93\x15\x7d\x38\x90\xce\x19\xaa\x6f\xd7\xf5\x29\xba\x20\xcb\xfb\xf7\x96\x4f\x78\x8c\xe6\x28\xa8\xd7\x7b\xb1\x75\x86\x33\xdb\xf0\x16\xc5\xa0\xed\x75\x89\x7d\x4b\xb7\x1e\x71\x5c\x6f\x92\x69\xe6\x67\x9b\xaa\x43\x24\x78\xae\xd1\x0d\x0c\x9f\x23\x0b\x71\xae\xc2\x10\x9f\xa1\x03\x95\x92\x19\x74\xbf\x2c\x7c\x1f\xf6\x5c\x54\x99\x98\xdb\x7f\xce\x38\x96\xb5\xd0\x51\x4d\x37\xf3\x17\xc2\x97\xc6\xe4\xf9\x49\x51\xa9\x9c\xde\x47\x8f\x27\xd8\xb2\x72\x99\xaa\xcd\xfb\xf0\x96\x89\xa7\x64\x5e\xf6\x1c\xcf\x0c\x63\xba\x5a\xde\xc6\xd1\x29\xae\xcc\x3d\xba\x3f\x8b\x2a\x92\xbf\x25\xd0\xcd\xa1\x7b\xe0\xc8\x3d\x38\x0c\x63\xcb\xe6\xb7\x3e\x83\x4f\x67\xc7\x67\x3d\x9d\x1d\xc1\x16\x23\xc4\x1d\xc6\x6d\x1f\x4f\x1a\xc7\x17\x66\x47\x0e\xd6\xbb\x69\xf7\x02\xc5\xa6\xea\xcd\x3b\x25\xe2\xec\x13\xcd\xc6\x62\xe8\x9f\x4b\x7d\xab\x42\x53\x09\x9c\xcc\xd3\xf6\x5f\xbb\x3e\x9d\x19\x79\x80\x17\xf0\x7e\xbb\x1d\x24\xe1\x4e\xe7\x38\xc2\xcb\x4e\x11\xfa\x59\xb8\x83\xcf\xde\x2d\xaf\x9f\x83\x27\x62\x4d\x4d\xfb\x1d\xa0\x14\x46\xfd\x1c\xca\x41\x79\x30\xa2\x3b\x71\x1b\x85\x3a\x35\x7d\xcb\x6a\xc9\x01\xe4\xf7\x36\x86\x13\xd4\xd7\xe4\x9b\xf1\xe8\x42\x87\x10\xdf\x5f\xd1\x67\xc7\x1c\xa7\xb2\x1f\x6a\x90\x5d\x98\xc0\xa9\xd3\x3f\x4d\xff\xc1\x93\xad\xd3\x24\x09\xc0\x66\x17\x22\xea\x0c\xed\x9f\x26\x4d\xe4\x81\xdd\x69\x62\x45\x35\xca\x2e\xdf\xbe\x88\xf2\xd3\x64\x3a\x9c\x5e\x97\x26\x47\x6c\xb5\xeb\x14\xf5\xf1\x75\xec\x9f\xe1\xda\x61\xec\x91\x13\xe0\x4b\x1d\xfc\x14\xe9\xe9\x14\xea\x4e\x1e\x9e\x44\x22\x8b\x0c\x29\xf3\xba\x44\x62\xf7\x0b\x5f\xe7\x88\x33\xf1\x9e\x1e\xc4\x82\x93\xed\x9f\x61\x36\xe7\xf8\xaf\x9e\xea\x7b\x87\xde\xec\x03\xf9\xbe\xc2\x38\x94\x0d\x63\x7a\xb5\x96\x13\x70\xa6\xa6\x08\x9f\x3f\xef\x4f\x84\xfe\xfa\x9f\xff\x20\x0f\x96\x31\x53\x03\xab\x69\x0f\xdf\xbf\xdb\x70\x6b\x7f\xf9\xf2\x84\xc4\x03\x2a\x86\x9a\x0d\xd0\xab\xc5\xc7\x83\xca\xc6\x6a\x34\xb6\x33\x91\x3f\x01\x4d\x66\xe0\x04\x34\xc4\xc2\x17\xa4\x57\x16\xda\x82\x67\x64\xc8\x0f\x84\x38\xff\xf8\x52\xdc\x42\xb4\xae\x0e\xb5\xc0\x32\x51\xb1\xfa\x6b\x96\xa3\x7d\xb2\x48\xb1\xd1\x16\x2a\x25\xf1\xb0\x04\x84\xb4\x85\xa2\xd0\x16\xc4\xbc\x20\x85\x56\x45\xdc\xa7\x0d\x11\xe9\x36\x0b\x8e\xc9\xb4\x05\xa9\xd3\xae\xe4\x3b\xce\xad\x82\x50\x13\x3a\x02\x92\xe7\xa5\x3c\x5f\x10\x92\x8f\xee\x0e\xfd\x1c\x86\x4a\x31\xf7\x53\xc6\x29\x9d\x94\x45\xb2\x38\x4e\x4e\xf5\x13\x2e\x1b\x45\x2a\xcb\x4f\xf4\x53\x56\x14\x63\x35\xe1\x4f\x65\xff\x71\x3d\x04\xf9\x88\xd2\xc2\xbe\x4a\x90\x6c\x30\x97\x69\xe0\xbc\xa8\xf4\x0f\xaa\x21\x86\x99\x53\x5d\x44\x94\xc1\xee\x6b\x14\xe1\x12\xc7\xbf\x41\x21\xf1\xa6\x71\x56\x43\xca\x6a\x1d\x4d\xc3\xb2\x47\x26\x94\x5a\x35\x44\x05\x36\x70\x4c\x0c\x51\x57\xf3\x25\xa2\x18\xf3\xe5\x0c\xda\xd0\x95\xe1\xff\x05\x00\x00\xff\xff\xc9\x3b\x71\x13\x8e\xaa\x00\x00") - -func send_to_issuerHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _send_to_issuerHorizonSql, - "send_to_issuer-horizon.sql", - ) -} - -func send_to_issuerHorizonSql() (*asset, error) { - bytes, err := send_to_issuerHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "send_to_issuer-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6f, 0xa7, 0x64, 0x8, 0x60, 0xa3, 0x5a, 0x14, 0x35, 0xbe, 0x64, 0x93, 0xa1, 0x42, 0x4f, 0x1b, 0xf9, 0x41, 0xb2, 0x24, 0x56, 0x46, 0xa6, 0x5c, 0x5e, 0x45, 0xb0, 0xaa, 0x85, 0xb3, 0x3b, 0x2b}} - return a, nil -} - -var _set_optionsCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x93\xe2\xb8\xd6\xe6\xf7\xfe\x15\x44\x7f\xa9\xee\xa0\xfa\x22\x59\x96\x6c\x75\x4f\xdf\x08\x03\x66\xdf\x77\x98\x98\xa8\x90\x25\x19\x0c\x5e\xc0\x36\xeb\xc4\xfd\xef\x13\x2c\x99\x90\x24\x99\x95\x95\x64\xd5\xed\x77\xba\x1d\x51\x59\x60\x1d\x1f\x1d\x3d\xe7\xd1\xd1\x6a\xf1\xdb\x6f\x3f\xfd\xf6\x5b\xa2\x11\x44\xf1\x38\x94\xed\x66\x25\x21\x58\xcc\x2c\x16\xc9\x84\x58\x7a\xf3\x9f\x7e\xfb\xed\xa7\x7d\x7a\x76\xe9\xcd\xa5\x48\xd8\x61\xe0\x9d\x05\x56\x32\x8c\x9c\xc0\x4f\xd0\x7f\x91\x7f\xc1\x0b\x29\x6b\x9b\x98\x8f\xbf\xec\x1f\xbf\x12\xf9\xa9\x6d\x76\x12\x51\xcc\x62\xe9\x49\x3f\xfe\x12\x3b\x9e\x0c\x96\x71\xe2\xcf\x04\xf8\xe3\x90\xe4\x06\x7c\xf6\xfc\xae\x23\x5c\xf9\xc5\xf1\xbf\xc4\x21\xf3\x23\xc6\x63\x27\xf0\xbf\x44\x32\xda\xeb\x7d\x2e\xcc\x5d\x67\xaf\x5a\xfa\x3c\x10\x8e\x3f\x4e\xfc\x99\xf8\xd4\xed\xe4\xf4\x4f\x7f\x3c\xe4\xed\x0b\x16\x8a\x2f\x3c\xf0\xed\x20\xf4\x1c\x7f\xfc\x25\x8a\x43\xc7\x1f\x47\x89\x3f\x13\x81\x7f\xd2\x31\x91\x7c\xf6\xc5\x5e\xfa\xc7\xbc\xac\x40\x38\x72\x9f\x6e\x33\x37\x92\x4f\xb2\xf1\x1c\xff\x8b\x27\xa3\x88\x8d\x0f\x02\x6b\x16\xfa\x8e\x3f\x3e\x8a\x84\xc1\xfa\x4b\x24\xf9\x32\x74\xe2\xed\x5e\xb9\x6d\xff\x71\x02\x40\xb2\x90\x4f\xbe\xcc\x59\x3c\x49\xfc\x99\x98\x2f\x2d\xd7\xe1\x9f\xf7\x88\x71\x16\x33\x37\x18\xff\xf1\xd3\x4f\xd9\x56\xbd\x91\x28\xd6\xb2\xe6\x20\x51\xcc\x25\xcc\x41\xb1\xdd\x69\x9f\x24\xff\xb5\x9c\x8f\x43\x26\xe4\xc4\x89\x62\x6b\x1b\xc9\xc5\x1f\xaf\x4a\x47\x7c\xbe\x58\x06\xe1\xd2\x8b\xde\x26\x2c\xfd\xd5\x5b\x24\x5d\x29\xc6\x32\x7c\x8b\xe4\xde\x4e\x5b\xca\x37\x4a\xbe\x41\xcc\x92\x51\x1c\xd8\xb6\x0c\x1d\x5f\xc8\xcd\xeb\xb2\x8c\xf3\x60\xe9\xc7\x16\x73\x99\xcf\x65\xf4\xc7\x4f\x46\xa5\x63\xb6\x12\x1d\x23\x5d\x31\x2f\xa4\xeb\xb5\xca\xf0\x06\xbc\x41\xb8\x4d\x1c\xb4\x67\xea\xb5\x76\xa7\x65\x14\x6b\x9d\x8b\x87\x9e\x0a\x7e\x99\xcf\xe4\xf6\x2d\xfa\xe3\xcd\xd7\x55\x3f\xca\x7c\x83\x56\x5b\xbe\xc1\xe6\x4b\xb1\xb7\xeb\x0e\x97\x51\xec\x3a\xbe\x8c\x5e\xd3\xfc\x28\xf4\x66\xbd\x7b\x2b\xe4\x21\x1a\xbc\xa2\xf7\x2c\xf4\x76\xbd\x8f\x94\x7f\x4d\xef\xa3\xd0\x9b\xf5\x1e\xe5\x1d\xdf\x0e\x5e\xd1\x7b\x16\x7a\xb3\xde\xf9\xd2\x8a\x96\xd6\x2b\x3a\x8f\x02\xdf\xa2\xcf\x75\xa2\xc9\x62\x29\x97\xaf\x21\x7b\x29\xf6\x76\xdd\x52\x86\xaf\xc1\x7a\x48\x7f\xb3\xb6\x43\x35\x7e\x4d\xdd\x51\xe0\xcd\xfa\x8e\x51\x69\x22\x99\x78\x5d\xed\x13\xb9\xef\xac\xfd\x14\x29\xe5\xe2\xcb\x1b\xb3\xb1\x98\xff\x8a\x72\x8b\xf9\x6f\x36\xf8\x14\xfd\x5e\xb3\xf5\x41\xe4\x5b\x75\xee\xfb\x00\x5f\x57\xbb\x97\x3a\x69\x3e\xc8\x5e\x2b\xbe\x19\x72\x5f\x97\x7d\x0c\x8d\x5f\x13\x3b\x07\xba\xaf\x48\x3e\x06\xae\xd7\xe5\xce\x81\xe8\x2b\x72\x8f\x81\xe5\xab\x72\x6f\xb2\xef\x1c\x50\x5e\x97\x3b\x06\x89\xaf\xca\x3c\x56\xf9\xaf\x48\xee\xeb\xf1\xeb\x22\xc7\xba\xf9\xba\xcc\x93\xaa\xf0\xba\xa8\xc5\xfc\xd7\x05\x1e\xa8\xfa\x26\xa9\x3d\xf3\x4e\x82\xe6\xa0\x63\xd6\xda\xc5\x7a\xed\x52\xd8\x9d\x8f\xa3\x85\x7b\x92\x68\x67\x0a\x66\xd5\x78\xa6\xeb\x8f\x9f\x8e\x7d\xe3\x1a\xf3\xe4\xef\x0f\xf7\x12\x9d\xed\x5c\xfe\x7e\x7a\xe4\x8f\x44\x9b\x4f\xa4\xc7\x7e\x4f\xfc\xf6\x47\xa2\xbe\xf6\x65\xf8\x7b\xe2\xb7\x43\x97\x39\xd3\x32\x8d\x8e\xf9\xa0\xf9\x41\xdf\x4f\x4f\x34\x3e\x4d\x3c\x29\xce\xd4\xab\x55\xb3\xd6\x79\x45\xf3\x51\x20\x51\xaf\x3d\x55\x90\x28\xb6\x13\x9f\x1e\xfa\xb7\x0f\xf7\xa2\x83\x92\x4f\xd7\x39\x3f\x14\xff\x94\xe7\x23\x42\x5f\x2d\xcf\x13\x2c\x6b\xf5\xce\x15\x9e\x89\x7e\xb1\x53\x78\x34\xeb\xb2\x43\xfb\x24\xfb\xb3\x96\x2b\x43\xbe\xa5\xf0\xcf\x94\x1c\x00\x68\x54\x52\xf3\xf1\x7e\x14\x33\x0f\x03\x2e\xc5\x32\x64\x6e\xc2\x65\xfe\x78\xc9\xc6\xf2\x00\xc3\x1b\x3b\xe0\x7b\x31\x21\x6d\xb6\x74\xe3\x2f\x31\xb3\x5c\x19\xcd\x19\x97\xfb\xd1\xc4\xa7\xab\xd4\xb5\x13\x4f\xbe\x04\x8e\xb8\x18\x20\x3c\x29\xec\x25\x21\x4f\xc5\x3c\x50\xf7\x5c\xc8\x07\x02\xdc\x02\xfc\xc8\xf2\xcb\xa0\xfb\xcb\x4f\x89\x44\xe2\xe1\x8e\x23\x12\x7c\xc2\x42\xc6\x63\x19\x26\x56\x2c\xdc\x3a\xfe\xf8\x17\x4c\x7e\x3d\xf8\xa6\xd6\xad\x54\x3e\x1f\xa4\xf7\x0f\xfa\xcc\x93\x37\x84\x75\xfd\x96\xf0\x8a\xb9\xcb\x5b\xd2\x10\x2a\xd7\xe2\x2e\x8b\x62\x2f\x10\x8e\xed\x48\x91\x70\xfc\x58\x8e\x65\xf8\x28\xf2\xd3\xaf\xd7\xbe\x7f\xac\xc5\x77\x62\x11\xbd\x0b\x88\xd3\x40\x20\x61\x39\x63\xc7\x8f\xaf\x12\x23\xb9\xf0\x97\xde\xed\x34\x7f\xe9\x45\x4b\x4b\xfa\x71\xb8\x1f\x0a\x5e\x17\xf3\x28\xe3\xf8\xb6\xcb\xf6\x23\x46\x21\xa3\xf8\xb6\x39\x47\xc1\x49\xe0\x49\x11\x78\xcc\xf1\x6f\x48\xa9\xea\xb5\xd1\xf1\x24\x94\xd1\x24\x70\x45\x94\x88\xe5\xe6\xda\x32\xdb\x65\xe3\x97\x2c\x7a\xd5\x37\x27\x44\x96\xfb\x5c\x5d\x87\x59\x8e\xeb\xc4\xfb\xc2\x1d\xcb\xff\x00\x89\xeb\xbe\x96\xec\x8c\xfd\x7d\x5f\x68\x6f\xd6\xf1\xce\x45\x6f\xe0\xb1\x6b\x71\x02\xfd\xcb\x61\x58\x9d\xc8\x14\xcc\x4c\x39\xf1\xcb\x2f\x0f\xae\xf8\xf7\x9f\x09\xf0\xeb\xaf\xaf\x3c\x7d\x6d\xe0\xb5\x9e\x67\x05\xf8\x9a\xc6\x27\xbe\xbc\xd2\xf6\xd4\xcf\x5f\xd3\xf4\x1c\x9e\x2b\x75\x37\xf0\x3b\xea\x7c\x5e\x31\xf6\xed\xdf\x7b\xeb\xc4\xbe\xcb\x78\xac\x0e\x7e\x20\xe4\x65\x5d\x78\x52\x07\x9e\x67\xfa\xb4\x7d\x7e\x6f\xf6\x4f\x3b\xc6\x47\x43\x4e\xf7\x58\x34\xb9\x30\x86\x3c\xe3\xf6\x3c\x94\xab\xaf\x0a\x59\x4b\x3e\x93\xb1\xeb\x44\xf1\x57\x45\x1f\x7b\xdb\x0f\x74\x3f\xde\xe6\x6e\x10\xc9\xd8\xf1\x5e\xa8\xf9\x87\xc0\x7a\xa3\x6e\x5d\xf8\xfc\x69\xa7\xfe\x51\xdf\x95\xbf\xcf\xf9\xbc\x40\x9d\x97\xc6\x06\x4f\xd5\x9c\x4b\xf1\x12\x5b\x4e\x9d\xaf\xf7\x7a\xec\x34\xf0\xfa\xe5\xb1\x92\xcb\xf0\x8d\x11\xf4\x38\xf3\x22\x5e\x8a\xa0\x07\xba\xb3\x28\x92\xf1\x2d\x3c\x8f\x75\xf5\xc5\x64\xe6\xed\xab\xd5\x6d\xd5\xf3\xd0\xe1\xd2\x7f\x21\x88\x1d\x12\x5f\x8a\x70\x87\xc4\x84\x08\x96\x96\x2b\xf7\x7c\xe3\xce\x61\x46\xf2\x43\xa3\xe8\x85\x87\x4f\x43\xd6\x63\x59\xae\xfc\x7a\x2a\xe0\x0b\xdc\x38\x3d\x79\x42\xf8\xea\xd1\x07\xdc\x5f\x22\xc4\xb1\xc3\xfe\x5e\x3e\x1c\x87\xf5\x47\x3a\x38\xf3\x5b\x0d\x3f\x7e\x56\x73\x83\x30\x7e\x44\x23\x6b\xe6\x8c\x6e\xa5\x93\x00\xd7\xcd\xa6\xdc\xc4\x2c\x8e\xa5\x37\x8f\x13\xfb\x6a\x11\xc5\xcc\x9b\x27\xf6\x5d\xa6\x60\x79\xbc\x93\xd8\x05\xbe\x7c\xde\xd8\xda\xcc\x71\x97\xe1\x45\x53\xfb\x52\x0e\xf1\x76\x2e\xbf\xee\x94\xe3\xb4\xc4\x85\xde\xe7\x61\xff\x31\xc7\x17\xbc\x73\x9a\xd9\x08\xc2\x6b\xa7\xfe\x72\x40\xe2\xdf\x09\xf0\x6b\xc2\xa8\x65\x13\xc7\xaf\xff\xeb\xcf\x04\xc1\x18\xe1\x5f\x6f\xfa\xea\x72\x18\xf6\x6e\x97\x5d\xce\xf2\x5c\xc6\xdc\x17\xd0\x38\x4e\xb4\xed\x6b\xdd\x4d\x83\xf6\x63\xc7\x3b\x4c\x89\x96\xd6\xc9\x88\x50\x46\x4f\x1a\x20\x74\xb3\xc7\x18\x4a\xf6\x58\x97\x9e\xdb\x73\x31\xe6\x7d\xaf\x4d\x17\x93\x75\x6f\x68\x19\x8f\x86\x2d\x22\xf9\x5a\x0b\xf3\xdc\xce\x8b\x31\xfc\x7b\xed\x3c\xab\x78\xbb\x9d\xcf\x1a\xb9\xab\x74\xe9\xaf\xa4\x1b\xcc\xe5\x57\x9a\xb4\x73\xd6\x77\x34\x44\x17\xd3\x1d\x77\x40\xf0\x30\x5f\xfb\xcb\x5b\xfc\x70\x66\xd1\xd7\x80\x58\xbc\xd0\xd0\x3c\x05\xe1\x61\x1e\xf8\x89\xc6\x6b\x20\x9e\xe4\xf6\x22\x18\xe7\x39\xa2\x77\x83\x71\x9e\x14\xff\xe5\x5c\x6f\x9f\x0e\xde\x6e\xd4\xa9\xd7\x6a\xf7\xc5\x0c\xd7\x7b\xad\xba\x58\x02\x78\xcf\xb0\xeb\xd0\xe2\xbf\x12\xa9\x9d\x28\x5a\xca\xf0\xed\xaa\x78\x20\x6e\x8e\x4e\x9f\xc1\x12\xbb\x8e\xe7\xbc\xd0\xa3\x78\x75\x2c\xf8\xdf\x1c\x55\x5d\xb0\xf3\x62\x55\xe5\x5d\xa3\xa8\xcb\xe7\x3f\x6a\x1c\x75\xa1\xf3\xfd\xe3\x9f\xd7\xb4\x1e\x9d\x76\xa5\xe9\xe4\xc9\x7f\xdf\xae\x78\x4f\xa6\x7b\xdf\x4d\xf2\xcb\x35\xb4\x23\xcd\xe3\xcd\x93\x50\xfc\x86\xf1\xc6\x35\x01\x37\x87\x55\xca\x17\x53\xf9\x84\xf9\x63\x79\x73\x60\x7f\x09\xce\xe5\xb2\xdd\xfb\x63\xf5\x79\xee\xfc\xfd\x10\xfd\x60\x7c\xac\x40\x6c\x6f\x81\x13\x6f\x42\x19\x2d\xdd\x9b\xd1\x3d\xde\x78\xf2\xab\xe3\xb9\xf3\x12\xeb\xfb\xf1\xbc\x5a\xb7\x78\x2f\xa8\x57\x2b\xce\xbf\xbc\x09\xb8\xd3\x43\xaf\xa1\x77\x12\xb9\x05\xc4\xdb\x68\x77\xb5\xc2\xfd\x1e\xa0\xb2\xfb\x91\xb5\x1d\x84\x5f\x99\x0c\x4d\x64\x8d\x8e\xf1\x15\xcc\x5e\x57\x19\x7d\xb3\xbe\x62\xad\x6d\xb6\x3a\x89\x62\xad\x53\x3f\x4f\x2a\xf6\x8c\x4a\xd7\x6c\x27\x7e\xf9\x94\x4f\xb7\x1a\xc3\x42\xb1\xa2\x64\x8a\x28\x57\x6b\xaa\xe9\x41\x25\x57\xad\x65\x2b\xb9\x52\xb7\xd6\xe8\x2a\x85\x21\x1a\x55\x73\xed\x42\xbd\xd6\xcd\x98\x75\xa3\xdd\xd7\x9a\x19\xad\x3e\x50\x0a\x9f\x3e\x27\xe8\xf1\xd2\x4e\xff\xeb\x00\x7c\x4e\x28\x9f\x13\xe0\xf3\x11\xe5\xc4\xa7\x4f\x9f\x13\x9f\x8c\xa6\x61\x18\xc6\x9f\x7f\x7e\x3a\x24\x28\x0f\x69\xe7\xbf\xbf\xfe\xf1\x35\x0b\x0d\xdc\x4f\x37\x86\x06\x1e\xaa\x7d\xc3\x2c\x0c\xfa\x2d\xa5\x5b\xae\x2b\xdd\xba\x9a\xee\xe6\x0b\xdd\xa6\xa6\x9a\xdd\x46\xb9\x5e\x53\x9a\x85\x9e\xda\x6f\x15\xea\xc5\x56\xad\x5c\x2e\x28\x9f\x3e\x27\x20\x78\xbc\x3e\x27\x74\xac\x53\x8a\x54\x4c\xbf\x87\x8d\x99\x41\x39\x4f\x5a\x35\xb5\x5e\x2b\x9a\x8d\x4c\xb5\x96\x4b\x6b\x48\x31\x54\x44\x46\xb8\x51\xcb\xb6\x5b\x95\x7c\xbf\xac\xe5\xd3\x95\x4c\xb5\x59\x29\xe6\xea\x6a\x5b\x33\x87\xfd\x5e\xf7\x8c\x22\xbc\x30\x91\x00\x78\xb0\xe4\x9e\xa2\x7f\xb2\xfc\x5e\x64\x15\x6a\x40\xf6\x37\x6e\xc5\xab\xad\xac\xe6\xa1\x80\x9f\x8c\xb1\x91\x31\xc6\x0f\x85\x85\xf0\x66\x69\x5f\xe0\xe0\xf5\xdc\xdd\x1d\x74\x7e\x79\x46\xee\x5b\x39\xfd\x74\x56\xee\xd1\x25\x04\x09\xaa\xdb\x18\x11\x29\x89\x2e\xa0\xa5\x68\x16\xb6\x74\x6a\x2b\x88\xd9\x18\x41\x68\x69\x98\x50\xa6\xa8\x36\xb3\xa1\x0a\x10\x13\xc0\xc2\x8a\x45\x10\xb2\x80\x66\x49\x4a\xf7\x58\x81\x3b\xaf\xbd\x0e\xac\x29\x4c\x91\x48\xb1\x6d\x45\xd5\x19\xd0\x2c\x20\x35\x60\x0b\x68\x13\x81\xa0\xce\xa1\xcd\xb8\x50\x80\x45\x38\x07\x3a\x47\x48\x60\x4d\xc3\x0a\xa6\x3a\xd1\xa1\x82\x19\x24\x7b\x1a\x1f\xd9\x60\xfc\x65\xaf\xf4\xa0\xec\xa8\xdb\xd4\xb6\x5d\x4e\x6b\x59\x3f\x4b\x0b\x0a\xd8\x4c\xd3\xc9\x08\x8c\xe3\x68\x5d\x5c\xef\xe0\x40\xb4\xfb\x43\x96\x2e\xb1\xdc\x78\x2f\x6f\xd6\xd4\x0a\xdb\xcd\x95\xe6\x57\x35\x8f\x8c\x01\x54\x0f\x62\xe9\xd9\x0f\x28\xc8\x87\x5e\x9f\xae\xc2\xc6\x0b\x44\x85\x4c\x83\x54\x05\xb6\xd4\x99\xd4\x55\x89\x6d\x42\x88\x65\xd9\x10\x08\x0b\x48\xac\x13\x4e\x30\xa5\xaa\xa4\x14\x41\x48\x6c\x1b\x53\xa9\x42\x45\x57\x75\x8a\x98\x54\x84\x38\x54\xf6\x8f\x20\xbb\x2a\x04\x45\xc8\x22\x0a\xc7\x00\x09\x55\x6a\x90\xd9\x16\x56\xb0\x8d\x30\xd6\x10\x27\x16\x50\x15\x5d\xe8\x36\x92\x3a\xd3\x74\xae\xab\x14\xe9\x80\x62\x86\x05\xd1\x34\xdd\xb2\x3f\x1d\x42\x27\xc4\x98\x62\x8d\x12\x4c\x4f\x8c\xcd\x28\x8d\xd1\x14\xd6\x96\x38\x00\x56\x49\xeb\xab\xfe\xb6\xbe\xea\x6e\xf2\xa8\x37\x0f\x66\xc9\x55\xce\xa8\xc7\x19\x58\x56\xaa\x5a\x5a\x23\xa3\xae\xcc\xf5\x27\x28\x59\x19\xa2\x61\xa7\x30\x9b\x58\x24\x4e\x0e\x9c\x59\x47\xd5\x8d\x72\xaf\x1b\x4e\x92\xc5\x9a\x8b\xaa\x43\x5a\xab\xc5\xdd\x03\xc2\x83\x46\xaf\x9a\x59\xef\x3f\x15\x1f\xff\x1c\x83\x79\x74\xfe\xbe\x36\x1a\xcd\x13\x77\xd6\xfd\xda\xc8\x2e\xe2\xfe\x36\xd7\xdf\x28\x9e\xd6\x09\x6a\xcd\xcc\x64\x38\xc2\xbb\x45\x2e\x5c\x07\x63\x65\x0a\x66\x83\x45\xb3\x56\x31\xc2\xb8\xa6\x74\xea\x4a\x25\x67\xd0\x8e\x9f\x5f\xc5\xed\xc1\xae\x37\x68\xe4\x23\xb3\x5c\x9b\xee\x48\x59\x56\x27\xa5\xba\xe1\xb2\x41\x5f\xa8\xab\x63\xfe\x37\x18\x9d\x2d\xde\x62\xc5\x03\xa3\xb3\xa0\xf4\x1d\xb9\xf7\x7d\xae\x37\x32\xda\xb2\x2d\xce\x25\x67\x0a\xd0\x14\xac\xa9\x42\x65\x8a\xa2\x50\xa8\x0a\x40\x2c\x4d\x68\x0a\x43\x1c\x4b\x69\x2b\x44\xd3\x91\x4e\x6c\x2e\x15\x4c\xa5\x8e\x74\x80\x6c\x66\x03\x29\xf6\x6c\xfc\x88\x5a\xa1\xda\x96\xa5\x29\x58\xe1\x6c\xff\x98\x2e\x38\xb6\x81\x26\x24\x53\x6c\x4d\x48\xae\x4a\x45\xc1\x92\x58\x2a\x81\x02\xd8\x58\x53\x04\xb0\x38\xa0\x0a\xd0\x21\x04\x40\x13\x4c\x7e\xfa\x9c\x40\x67\x46\x93\x87\x18\x9c\xd9\xcc\x37\xae\x91\x0a\xc2\xa0\xe3\x52\x8f\x69\x7a\x53\x59\xe3\xa1\x95\xef\x8f\x3a\xf3\xd9\x26\xb7\xa2\x23\x9c\x2e\x9b\x4e\x27\x74\x50\x5b\xab\x15\x76\xd5\x71\x98\x76\x56\x8e\x1b\xe2\xc9\xb2\x99\xb1\xdd\xba\xb6\xf1\x52\xab\x71\x9d\x4e\xc7\x4e\xc3\x63\x9d\xcc\xb8\xb1\xc8\xad\xce\x8c\xce\x5e\x20\xde\xdf\xc6\x8d\x4d\xb0\x14\xb9\x38\x6d\x24\x07\x8d\x71\x30\x20\x7a\xdd\x6f\xcf\xb7\x0b\x90\xd9\xd6\x4a\x1b\x2b\x35\x9e\x55\xf5\xdd\xc4\x59\x94\x1a\x4b\x54\x6a\x6f\x27\x59\x6b\xca\x07\x6b\x5b\x06\x2b\x5b\x6e\xea\x45\x17\x87\xad\x09\x68\xf4\xb6\xa0\xb2\x2e\x15\x8b\x66\x33\x4d\xc3\x43\x0c\xae\xde\x60\xac\x19\xdd\xf2\xfa\xdf\x80\xb1\x90\x29\x94\xda\x48\x00\x26\x30\xe0\x4c\x07\x08\x22\x42\x84\x46\x74\x4c\x34\x1d\x12\x0d\x29\x2a\xd6\x2d\xa4\x72\xa4\xdb\xba\xad\x71\x05\x31\x0a\x19\x83\x44\xa1\x58\x20\xfb\xd0\xe1\xfa\x00\xd6\x73\x5d\x45\xb6\xd0\x18\x11\x18\x42\x8c\xa8\x0a\x21\x55\x10\xd6\xb1\x50\x75\xa1\x53\x26\x28\xd0\x04\x17\x50\x45\x3a\x51\x38\x91\x9a\xaa\x02\x0a\x35\x9d\x11\x62\x5b\xba\xa2\x7f\xfa\x9c\x50\x2f\x18\x0b\x1f\x18\xab\x25\xf5\x5d\x14\x8c\xb9\x2b\x6a\x6d\xa7\x38\xcf\xd5\xd2\xa1\x3d\x28\x4f\x37\x52\xdb\x8e\xd4\x7a\x3e\x55\x2f\x8d\x48\x76\x9c\x4d\xae\xb2\x71\x6a\x5b\x16\xd9\x5a\x0a\xba\xf9\xae\x9d\xab\xc7\x4a\xb2\x33\xe2\x9d\xf6\xbc\x5c\x18\x6d\x56\x92\x8d\xbb\x44\xc4\xc6\x78\x2d\x9a\xf9\xf8\x48\x96\x03\x63\x2f\x48\xc4\xa0\x83\xc4\xb4\xa2\x96\xf2\x4a\x17\x2c\xb6\x9e\x92\xa9\x06\x32\xbd\x71\xc3\xe4\xca\x93\x4b\x6b\xa4\xad\xf2\x19\xd5\x1f\x4f\x54\x5a\x29\x36\x53\x90\x58\x3d\xb3\x57\xef\x9a\xa3\x22\x9c\x88\x76\xcd\x61\x4a\xd3\xe6\xa0\x5b\xcf\x57\xf2\x18\x34\x4b\x39\x75\xee\x25\xd5\xf2\x41\x73\xf3\x06\x63\xf3\x37\xbb\x10\x7f\x07\xc6\xaa\x8a\x2a\x55\x9b\x0a\x64\xab\x44\xe3\xaa\x8d\x99\xaa\x60\xa8\xef\xbb\x01\x00\x00\x29\x34\x0e\x38\xa4\x2a\x56\x88\xa5\x62\xa0\x70\xa2\x03\xac\x6b\x36\xb1\xa1\x64\x94\x92\x63\x8c\xbd\x9f\xf5\x8c\x42\xdd\x62\x1a\x52\x35\xa9\x41\x1b\x20\x04\xf6\xe1\xd9\x02\x42\xdf\xdf\x20\x94\x2a\x2a\xc5\x12\x41\xaa\x6b\x42\x68\x36\x50\x84\xaa\x22\x80\x98\x82\x6d\x21\x31\x83\x9f\x3e\x27\xf0\x05\x63\x95\xc7\x18\x1b\xcc\xfd\x1d\x28\xc3\xe6\x36\x30\x36\x35\x0f\x2a\x93\xbe\x4c\x8f\x76\xa5\x9c\xb3\xeb\x64\xa7\x2a\xd5\x8b\x64\xc6\x82\x7e\xb9\x07\x52\x93\x92\x5e\x17\xa8\xd5\xb3\x3b\xdd\xa2\xbd\x58\xb9\x99\x38\xb9\x6c\xe3\xfc\x24\xce\x36\xb6\xc1\x62\x8b\xd7\xcd\xa5\x08\xad\x64\xbd\x40\x0e\x81\xef\xc8\xd8\xf1\x19\x71\xab\x94\xa9\xb3\xb2\xa7\x64\x98\x59\x9a\x65\x57\x33\xda\xcf\x8d\x79\xd3\x40\xa5\x79\x4d\x41\x99\x4d\xb6\x88\xa7\x9d\x6d\xdf\xf6\x63\xee\xcc\xf3\x95\xf9\xae\x95\xe4\xb6\xb1\x33\xea\xfd\x4a\x76\x68\xfb\xb9\xf9\x6c\xe6\xca\xea\x68\x42\x61\xca\x88\x5b\x59\x83\x94\x6c\xe4\x06\x07\x5e\x76\x6f\x30\xb6\x00\x6e\x79\xfd\x6f\xc0\x58\x44\x04\xc1\x92\xe9\x2a\x57\x88\x8a\x24\x55\xb0\xb0\x85\x0d\xb9\x94\xb6\x10\xba\xca\xd1\x7e\xd8\x43\x01\x91\xba\xc5\x00\xb3\x54\x1d\x50\x26\xf7\xcf\x10\x26\xb1\xad\xe9\x07\xc6\x7e\x00\xeb\xb9\xcd\xb1\x54\x09\x50\x05\x57\xb9\x46\x2d\xaa\x51\xa4\x40\x26\x09\x15\x3a\xb4\x31\x10\x8c\x58\x50\x42\x5d\xa5\x3a\x56\x35\x4d\x41\x4c\xa7\x0c\xdb\xcc\x52\x2c\x20\x2c\x75\xcf\x7a\x72\xc1\x58\xf4\xc8\xd8\xe6\x0c\x37\xfc\x0e\xcd\xdb\x26\x65\x4d\x37\x5f\x9a\x42\xc3\xd0\x06\xeb\x6a\xbe\xdb\xf5\xe2\x9c\x11\x31\xa3\x5f\xa0\xab\xc2\xc2\xeb\x67\x69\x36\x5f\xc2\x49\x81\xa3\xb6\x57\xa4\xd6\xb4\x36\xce\x77\x06\x32\x5c\x25\xfb\x59\x75\xd3\x40\xe9\x7a\xa3\x6a\x9a\x99\x4c\xe0\xea\xc7\x8e\xeb\x81\xb1\xeb\x33\xe2\xcd\x72\xde\xa6\xa0\x96\xca\x48\x6b\xc9\x06\xfd\x8d\x3b\x6f\x58\x7c\xe7\xb0\x74\xd7\x54\xd7\xdb\x20\xe9\xd7\xbd\x6e\x1f\x11\x23\x1b\xaf\x1a\x1b\xd9\x1a\x77\x78\xa7\xe0\x61\xd9\x29\x32\x3c\x57\xd2\xb4\xa9\x78\x91\xcc\x9b\x5e\xae\x85\x8a\xc4\x61\x03\x12\x85\x59\xab\x73\xd0\x3f\xbc\xc1\xd8\xd2\xf0\x96\xd7\xff\x06\x8c\x55\x85\x0d\x35\xc9\xa8\x00\x9c\x53\x26\x85\xe0\x10\x71\x48\x84\x00\x44\x57\x35\x22\x39\x84\x44\x45\x00\xda\x96\xad\x12\x5b\x95\x92\x10\xc8\xb8\x26\x05\x01\x98\x51\xae\xee\xd9\xf6\x11\xac\xb7\x34\x4d\x81\x18\x42\xcd\x66\xaa\x85\x55\x1d\xab\xba\x4d\x15\x4a\x55\x8e\x19\x65\x84\x71\x4b\x51\x88\x22\x29\x43\x04\x62\x1d\xee\x43\x2f\x65\x8a\x4d\x08\x50\x35\x8c\x75\xf6\xe9\x73\x42\xbb\x60\xac\xfa\xc0\xd8\x9d\xd5\x1f\x2c\x26\xd5\xd2\xac\x31\x2f\x89\x94\x5d\xa8\x6b\x54\x31\xd7\xb0\x34\x9a\xe5\x49\x25\x28\xc7\xc5\x0c\xc3\xf1\xa8\x1f\xba\x54\x45\x96\x95\xca\x19\x4b\x7d\x42\xb6\xda\x8c\xe1\x8e\x8a\x86\xdc\x0e\xbb\x15\x0e\x6a\xa9\x1c\x9c\x4e\x92\x0b\x6c\xac\x17\xae\x25\xcd\x73\x3f\xd6\xbc\x40\x5c\x27\x73\x84\x43\x82\xbc\xea\x76\x5b\x14\xeb\xdc\x36\x55\xef\x15\x9b\xfe\x90\x4d\x2a\x3d\x6b\x93\xdc\xb4\xb5\x56\x57\x69\xe5\xfb\xcd\x71\x06\xf1\x49\xb7\x65\x93\x36\x6c\xe7\xda\x8d\xd9\xdc\xad\xf6\xe7\xf3\xc5\x76\x5b\x72\x08\xab\x4d\xfa\x69\xa5\x40\x58\x45\x19\x9a\xa2\xe7\x1c\x62\x38\xbf\xc1\xd8\xb2\x7e\xcb\xeb\x7f\x03\xc6\x72\x15\x0b\x55\xd1\x00\xd5\xb9\xce\x14\x5b\x05\x94\x50\x26\x19\x11\x84\x69\x02\x21\x9d\x73\x44\x08\x94\x94\x31\x5b\xc5\x1a\x27\x08\x2b\x10\x49\x00\x55\x86\xa0\x7a\x6c\x8d\x3f\x84\xf5\x8a\x80\x48\xb3\x55\x55\x07\x92\x40\xaa\x22\x00\x84\xd4\x91\x0a\x6c\xae\x09\xcb\x86\x1c\x5a\x4c\x85\x0a\xd7\xb0\x6e\x23\xaa\x53\x29\x01\x84\x68\xdf\xe7\x45\x48\x32\x1d\xa3\x4f\x9f\x13\xfa\x05\x63\xf1\x03\x63\x01\xda\xd8\x0b\xbf\xb9\x2b\x85\x31\x4a\x37\xd2\x96\x48\x07\x2d\x45\x4b\xe7\x66\xd5\x74\x32\xd5\x5a\x75\x96\xa3\x49\x58\xd0\xfa\x69\xe6\x9b\x95\x72\xbb\x14\x14\x32\x7d\x3c\xb3\x58\x1a\x68\xeb\x8c\xab\xf7\x2a\xab\xc1\x32\x39\x9b\x2e\x66\x19\x32\x5e\x19\x6b\x62\x87\x85\x62\x75\x53\x3d\x20\x7c\x60\xec\x05\x89\x4a\x20\x8e\xd4\xd4\x60\xd8\x8c\x99\x92\x69\xa4\x7d\x3c\x9e\x4f\x33\x9e\xc7\x58\x87\xb8\x2b\xb3\x3b\x89\xc2\x08\x6d\xb7\xc3\x7e\xa0\xcf\x62\x13\x51\x73\x5c\x1f\x8e\x9a\xeb\xac\x1c\x83\xac\x6e\x5b\x3a\xcf\x93\x66\x7b\x03\xa7\x3b\xaf\xa4\x8d\xcd\x0e\x6c\x99\x3b\x12\x74\x0f\x31\x76\x7c\x83\xb1\xd5\xf1\x2d\xaf\xff\x0d\x18\xab\xe8\x4c\x93\x5c\x25\x3a\xd2\x05\x40\x4c\xb7\xa5\x6a\x51\xa0\x28\x08\xda\x9c\x31\xa6\x43\xcc\x28\x54\x75\x1d\x21\xae\x30\x08\xa5\x20\x50\xea\x78\xdf\x7d\xb4\xb1\xaa\xa0\x03\x63\x3f\x82\xf5\x52\x40\xcb\x66\xd0\x62\x98\x2a\x94\x10\x4a\x11\x67\x8a\xc5\x6d\xa4\xd9\x1a\xc7\xba\x2d\x08\xb5\x90\x6a\x13\x8b\x72\xb9\x67\xa4\xaa\xdb\x04\xe9\x5c\x52\xac\x03\x86\xe9\x3e\xc6\xd2\x0b\xc6\x92\x07\xc6\xea\x2d\xd1\xf4\x33\xc3\x6d\xb9\x02\x32\x7d\x6f\x39\x8f\x99\x0f\x76\xd3\x6a\xcd\x2b\xcc\x17\xab\xd6\x60\x33\xed\x4e\x1a\xe3\x5c\xb9\xda\xed\x4f\x16\x8d\x42\xaa\xaa\x25\x0b\x5d\xba\x8d\x75\x4a\xf3\x79\x32\x64\xb8\x36\x4c\xa5\x36\xdd\x55\xc4\x03\xd4\x19\x8d\xab\x6d\xb3\x9f\x4b\xd7\xf8\x01\xe1\x03\x63\x2f\x78\xd3\xa8\x4f\x36\x39\xb3\xac\xd3\x7a\x9f\xed\xba\xe1\xc2\xa9\xf9\xf9\xbc\x59\x98\x74\x57\x4e\x23\x5a\xe4\x96\x05\x24\x17\xd3\x76\x96\x6f\xdd\x5d\x9c\x4f\x05\xd6\x7c\x54\xee\xb3\x51\xa3\x5c\xd6\x75\x44\xf5\x7e\x03\xce\x23\x40\x43\xbf\xee\x7a\xbd\x22\x9d\x4e\xeb\xee\x30\xe3\x7a\x07\xfd\xb3\x1b\x8c\xad\x9b\xb7\xbc\xfe\x37\x60\xac\xad\x61\x95\x23\x00\xa9\xa5\x0b\xc8\x38\x94\x16\x97\xd2\x82\x87\x08\x89\x25\x25\xb6\xa6\x5a\x84\x0b\x8c\x6d\x04\x74\x02\x91\x02\x15\x5d\x95\x14\x73\x22\x11\xe1\x87\x59\xa5\x0f\x61\x3d\xb6\x2c\x6c\xd9\x9a\x0d\x55\x1b\xed\x7b\xb4\x82\xeb\x80\x59\x48\xa7\x5c\xe5\x84\xeb\xba\x02\x75\xa6\x68\x2a\x53\x84\x0e\x38\x07\x9c\x42\x8d\x69\x9a\xd8\x07\x64\x62\x51\x48\x0f\xeb\x63\x17\x94\xd5\x1e\x28\xbb\x75\x7c\xcd\x64\xd9\x69\xb3\x1e\xa4\x66\xcb\x66\x71\x5a\xd0\x17\x8b\x71\x6f\xd1\x6a\x17\xab\x7a\x79\x52\x88\x87\x72\xc2\x4a\x36\xed\x16\x37\xfe\xc8\x5b\xdb\xb3\x51\x54\x59\x90\x6c\xc6\x68\x0e\xb3\xbb\x5c\xa4\x6a\xc8\x47\xca\xae\x8b\x87\xdc\xcb\xa5\x8b\x49\xdf\x13\xd5\x28\x77\x11\x64\x2f\x3a\xb2\xc4\x6d\x99\x60\x3e\x61\x13\xb6\x58\xe4\xbc\x2d\x68\x3a\x85\x36\x6f\x63\xdb\x29\xf4\x23\xbb\x1d\x2d\x46\x25\xe0\xce\x1c\xad\x04\x93\x39\x2b\xb6\x68\x2a\xd7\x68\xe4\x70\x6d\x6b\x2c\x76\x0e\xef\xe4\xb7\xc5\xe2\x30\xf0\xdb\x8e\x62\xec\x8c\x6d\x4b\xfa\xb6\x1c\x8e\x18\x3e\x4e\x09\x04\x37\x28\xdb\x08\x6e\xb9\xfd\x6f\x40\x59\x44\x34\x6a\x73\xcc\x04\xc3\x50\x08\xa2\x51\xc1\x04\xd0\x2c\x95\x2a\x9a\x66\xa9\x18\x21\xc8\xa9\x42\x75\x15\x11\x55\x93\xfb\xb1\x3e\xa0\xd4\xe2\x44\xd5\x35\x4b\x15\xd8\xd6\xf6\x74\xfb\x08\xda\x23\x4d\xda\x58\xea\x10\x20\x42\x88\x2d\x74\x41\x74\x9d\xdb\x12\xd9\x16\xe6\x16\x04\x40\x05\x98\xa9\x10\x00\x69\x23\x70\x08\xb8\x42\xe5\x0a\xd5\xb0\xae\x52\x8d\x69\x1c\x7c\x3a\x2e\x58\x3e\x52\x56\x7f\xa0\x6c\x4a\x74\xd7\xeb\xbc\x35\x6d\x85\x69\xa2\x6b\xa1\xd9\x47\xcd\xc1\xdc\x42\x6d\x65\xd7\x1b\xec\x32\x79\x73\x6b\x06\x9d\xf9\x20\xaf\x2a\xdb\x65\x30\x6e\x85\x35\xa3\x5c\x1c\x79\xae\xd9\xb7\x7a\xed\x42\x32\x98\xad\xeb\x2e\x20\xad\x76\xa0\x04\x7c\x06\x45\xbb\x90\xaa\x56\x0c\x1f\xab\x07\x88\xf7\x94\xcd\x5d\x40\xee\xe5\xd6\x75\x37\xb7\xe0\x3d\xb1\x95\xb1\x8b\x56\xd3\xb9\x33\xa8\x58\xed\xea\x6e\xd8\x73\x98\xaa\xae\xda\x20\xb6\x5a\x33\xac\x0f\x77\x6b\xa4\x41\x92\x36\x94\xd1\x4a\xa9\xb1\xe2\x2e\xd9\xd0\x06\x15\xd3\x68\xe6\xe6\x69\xa3\xae\xaf\xe1\x3c\xa2\x9d\x8c\x0b\x27\x25\xe9\x1f\x6b\x44\x74\x83\xb2\xad\xea\x2d\xb7\xff\x0d\x28\x4b\x29\xa5\x82\x42\x1b\x59\xc8\x96\x04\x5a\x18\xd8\x96\x2e\x04\x86\x1a\x24\x42\x21\xba\xb4\x2d\x05\x50\x28\x01\x55\x29\xb2\x6c\xa8\x23\x24\x74\x85\xa8\xd8\xd6\x81\xcd\x29\x3c\x8e\xbd\xee\xa7\x3d\x25\x4c\xd3\x99\x46\x54\x45\x85\x48\x40\x0b\x10\x22\x91\x46\xa8\xad\x31\x9d\x20\x84\xa9\xaa\x01\x84\x01\xb1\xa0\x00\x2a\x46\x0a\x12\x84\xa8\x4c\x30\x9b\x21\xc0\x09\xdf\xf7\x64\xe1\xc5\xb2\x18\x79\x5c\x16\xdb\x8d\x70\x2a\x17\xb2\xae\x80\xbe\xcf\x40\x21\x2e\x95\x50\x9c\xab\x6e\xb6\x6d\xcf\xac\xcd\xec\xe9\x54\xcd\x8c\x56\xf9\x76\x21\xae\x0d\xd0\xaa\x44\x2a\x39\x99\x6a\xa4\x2c\xda\x9a\xae\xc6\xb1\xdb\xd9\x98\x5e\x63\xd8\xad\xa5\xb2\xab\x00\x56\x52\x0d\x6b\x24\x18\x56\x2a\xd5\xe0\x1c\x65\x73\x17\x2c\x42\x3b\x3a\xf1\x8c\xf6\xbc\x42\x63\xa3\xb7\x99\xc5\x9b\x2c\x1a\xb4\xeb\x73\xe4\xc4\x9b\xf6\xca\xf4\xaa\xc4\xe8\xce\xd6\xe9\xb6\x6a\xb6\xbc\xfe\x5c\x9d\x2b\xcd\x99\x49\xf3\xeb\xd1\xb2\xa6\xf8\x68\x91\xaf\x42\xb7\x60\xc0\x74\x58\x68\xb6\x3a\x45\x3a\x9a\x85\x2c\x39\xcd\xe6\xd7\x07\xce\xae\xff\x36\x94\x7d\x61\x1b\xc3\x8d\xf7\x53\xee\xd8\x14\xf1\xfc\xe5\x86\x7b\x94\xbd\xb4\xfb\xfe\x3e\x9d\xd7\x1b\xe8\xef\xd0\xf6\xc2\xf6\xf7\x3b\x34\xbe\xb0\x51\xfd\x5b\xb7\x94\x5c\x6c\x56\xbf\xd8\xe2\xd3\x50\x9a\xb5\x7e\xa3\x5d\x6c\xd7\x6b\xb5\x4a\x35\x9d\xcd\x22\x35\x9f\x6b\x90\x7a\x16\x8d\xfa\xcd\x81\xda\xc5\x5a\x05\x77\x87\xc5\xb2\x99\x19\xf4\xeb\xa8\x5c\xad\x8c\xaa\x79\xb3\x72\x5c\x16\x3f\x6e\xde\x28\x25\x83\x5a\x94\x6c\x97\xea\x0c\x5a\xc6\xb4\xb0\x9a\x38\x2b\x5d\x95\xba\x32\xb1\xdd\x7a\x6a\xa0\x78\x66\xb9\x58\xa6\xbe\xd5\xdd\xc8\xfe\x99\x7d\x87\x55\xe4\xcc\xe1\xe3\xbe\x9a\x99\x93\x96\xda\x63\x05\x5b\x8d\xa7\x62\x52\x95\xed\xdc\x6a\x81\xb0\x2c\xb7\x1a\xd3\xb5\x31\xef\xb5\x97\x05\x75\xac\x0c\xf8\x66\x0a\x80\x02\x8f\x1b\x27\x38\xed\xae\x2b\x87\xe7\xc7\x8f\x7f\xd2\x07\xa5\xeb\xc7\xef\x59\xc3\xa0\x99\x8b\x5a\x9c\xce\x39\x0d\x5b\xf3\x5d\xdf\xca\xc0\xb0\xe6\x0f\x6d\xae\xf7\x5b\x15\x47\xb7\xdb\x53\x52\x56\xbb\x8b\xf4\xa4\x35\x76\x3b\x8b\x0e\xf6\x27\xcd\x83\xba\x7a\x7f\x16\xf4\xdd\x4c\xba\x6d\x96\x0d\x6b\xb2\xb4\xfa\xe3\xa5\x33\x9c\x7a\x2e\xdc\xee\xf0\x30\x4f\x54\xbb\xd9\x1a\xc3\x7a\x53\xef\xad\x7c\xd9\x0a\x0a\xe3\x7e\x3a\x99\xa1\xbe\x9e\x76\xa6\x6e\x5a\xcf\xc2\xd4\xbc\xed\xb7\x9a\x7e\x52\x4d\xf5\x4a\xdb\xf9\x3a\xa3\x5a\xd9\x66\xe1\xb0\x27\xeb\xaa\xb9\xf8\x60\xd7\xa0\xbb\x5c\x53\x7d\xea\x9a\x6c\x36\x02\x76\x75\x9b\x89\xf2\xe5\x64\xb9\xbf\xf2\xf2\xd8\x28\x25\xbb\xda\x2a\x6f\x25\x93\x86\xa6\xd4\x33\xc5\xe4\x68\x5e\x2d\x1b\xc9\xa0\x4f\xcf\xae\xb9\x0e\x97\xdf\x0c\xbd\x66\xab\x63\xd3\x1a\x3b\xee\x50\xd4\x87\x7e\xb7\xe0\x6a\x43\xa1\x15\xf3\x20\x54\x90\x9d\xcc\xc7\x8d\xce\xcc\xc8\xb7\xb7\xcb\x82\xde\x58\xaf\x86\xca\xd0\x68\x97\x37\xf1\xbc\x33\x5a\x51\x10\xa4\x72\xbb\x41\xae\xec\x6f\x94\xe6\x5a\x4d\x8d\x06\x9b\x36\xab\xd7\x45\xba\x43\xac\xec\xf7\x87\x5e\xbd\x0b\xfa\xe6\x35\xf4\xa9\xe2\x1c\x54\x51\xaa\xdf\x1d\xb5\xf4\x2e\x41\x16\xae\xb9\x9b\x5a\x79\x16\x08\x3f\x4f\xf1\x22\xdd\x99\x2b\x20\x93\x4d\x43\x83\x29\xeb\x47\xe8\x6b\xf7\x42\xbf\xab\x77\x1a\xfd\xc9\x88\x58\xbd\x52\x7e\xd5\x64\xf3\xf2\x00\x6f\xc2\x7a\x33\x8d\x0b\xb3\x11\x60\x35\x6d\xec\x84\xc3\xea\xa0\xb7\xec\x77\x47\xb3\x15\xf7\xf4\xcc\x6a\x6d\x2c\x67\xf5\x58\xba\xda\xbc\xa3\x6e\xe5\xb6\x6a\x0e\xf5\xf4\x76\x55\xef\x69\xd9\xc5\xa8\x8b\x0a\xbb\xd1\x20\xd3\xfc\xee\xd0\xe3\xbb\xa0\xef\x5e\x41\x9f\x31\xfd\x35\x46\x22\xd7\xa3\xb5\xe6\x24\xb9\x48\x76\xcb\x88\xe0\xca\x8c\xe5\x41\x35\x55\x76\xc2\x8a\x9f\xce\x60\x25\x5e\xa9\xaa\xbd\x30\x1e\xa1\xaf\xdf\x0b\xbd\xa0\x45\x96\x6b\xb3\x62\xc6\x4c\x37\x76\x93\xdd\x68\xd6\x53\x36\x45\x11\xc5\xda\x96\x0d\xaa\xb4\xac\xda\x63\xaf\xde\x1e\xb6\x07\x29\xd2\xac\xe5\xda\x28\x1a\xb7\x96\x3a\x2a\x4c\x52\xb6\x55\xea\x35\xa7\xe3\xb8\x30\x63\x95\x55\x6b\xca\x52\xa4\xa8\x23\xd8\xab\x66\xb2\xc3\xa2\xf1\xfd\xa1\x27\x77\x41\x3f\xbc\x82\xde\x68\x80\xea\xd0\xf7\x31\xf2\x36\xe5\xe1\x14\x2e\xab\x8a\x31\xaa\x09\xb2\x4c\xe1\x61\x63\x6a\xa6\xb8\xa9\xea\xeb\x66\xb3\x58\x76\x06\xdb\x73\xc0\x69\xdc\x0b\x3d\xaa\xcf\xcd\x72\xd1\xc0\xd8\xca\xf5\x06\x5b\x33\xbf\xe9\x86\xcb\xb5\xf4\x4a\x61\x4b\xd6\x8a\x73\xb2\x1d\x87\xa9\x51\x18\xf4\x72\xaa\x18\x04\x61\x50\x9f\x2f\xa7\x5e\xa6\x53\x9d\xcd\x79\x27\x68\x35\xd2\xed\xea\xb4\xe2\x83\xa2\xe3\x65\xfa\xab\x71\xad\x0d\xf4\x8e\x3f\x73\x87\x99\xef\x1f\x70\xb4\xbb\xa0\xe7\xd7\x01\x47\xc4\x2b\xbd\x9b\xd1\xb6\x85\xb0\xb2\x6c\x85\x6e\x63\x2a\x26\x9b\x64\xdc\x8c\x77\x4d\xa4\x0f\xfa\xf5\x02\x09\x67\xd9\xcc\xa2\x17\xab\xad\x33\xf4\xd7\xbb\x15\xbe\x19\xfa\xdc\xa4\x6b\xb6\x5d\x56\x48\x7a\xa3\x4a\x36\x8d\x49\x98\x77\x57\x40\x01\x8d\xaa\x5e\xaa\xef\xd0\xac\xe4\x6a\x75\x52\x5f\xc2\xa2\x3e\xa8\x7a\xc0\x5f\x0c\x53\x30\x76\x5a\x45\xd9\x53\xca\x03\x48\xbd\x4a\xcb\xd3\xe2\x91\x35\xc8\x74\x2b\x4e\xa1\x17\x5b\x41\xdc\xd7\xe6\x66\x7a\xfd\xdd\xa1\xd7\xef\x82\x7e\x7c\xcd\xfa\x68\x5e\xf4\xc6\xbc\x64\x79\xad\x38\x28\x74\x56\x46\x79\xb0\xe9\x2e\xa9\xd4\x48\xbb\xbe\x68\x56\x16\x19\x3d\x9b\x9d\x27\x23\x3e\xde\x99\xe7\x58\xdf\xba\x17\xfa\x96\x18\x6b\xc5\x79\x12\x4f\x80\xa0\xf1\xae\xd7\x9e\x17\x63\xdd\x5c\xf7\x9b\xb8\x57\xaa\x00\x60\x29\x49\x1a\x8f\xc2\x86\xb5\x2d\xed\xc0\xa2\xa4\xeb\xb3\x29\x36\x1b\xd8\xef\xcf\xea\x48\xb4\x67\x35\x27\xdf\xf6\x79\x18\xc5\x56\xb1\x5f\x46\x43\x7d\xc9\xe6\x91\x56\x9f\xfc\x00\xe8\xe9\x5d\xd0\xcf\xae\x63\x7d\xa0\xdb\xfa\x6e\xa5\x8a\x0e\x2a\xa3\x1d\x02\x43\x6b\x3e\x09\x67\x70\x9a\x4a\xe5\xda\xc9\xcd\x76\x2a\x6a\x9e\xb1\x29\xb6\x86\x5d\x13\x9e\xa1\x6f\xdf\x0b\xbd\xd6\x6d\x27\x49\xd8\x8e\x1a\x76\x18\x17\x64\x77\xd7\xdd\x48\xb9\x71\x17\x36\x69\x6c\x56\xdb\x1e\x68\xae\x76\x96\x97\x93\x6c\xcd\x93\x75\x00\x61\x2a\x2c\xcf\xb7\x65\x1d\xc4\x6e\xb7\x1c\x7a\x23\x63\x62\x2e\xab\x1b\x45\xda\x52\xd3\xfa\x22\x6b\x98\x6c\xaa\x40\x25\xfe\x01\xb1\x1e\x82\xbb\xb0\x0f\xae\xb1\x17\x9e\x95\x4e\xb6\xbc\xf5\x32\x0c\xaa\xc5\x74\x7a\xdc\xa8\xf6\x77\xd3\x95\xb4\x6d\xab\xd6\x71\x27\xdb\x61\xd7\x9c\x12\x39\x02\xdb\x75\xf7\x8c\x7d\xe7\x5e\xec\x0d\x23\x0e\x1c\x5b\x6c\x71\x72\xa2\x5a\xe9\xe4\x72\x13\xc4\x93\xc8\xe4\xa5\x62\xb8\xf0\x60\x0e\x82\x55\x2d\x57\xc9\x76\x32\xae\xcf\x73\xca\x3c\x3b\xb4\x7b\x7e\x77\xb8\xee\xb1\x09\xdf\xb5\xea\x2d\x85\x8e\x86\x6e\x6a\x95\xe9\xae\xd2\xed\xad\x56\x5c\x28\x83\x8a\xe1\x69\x66\xe6\xfb\xd3\x1e\xc2\xbb\xb0\x8f\xae\xb1\x77\xd2\xf9\x08\x18\xc1\xc4\x63\xdd\xd6\x28\xee\x15\x6d\xe2\x74\x0c\x32\xe8\xcc\x73\xe5\x29\x9b\x6c\x3b\x3d\x58\xb4\xf5\x75\x94\xb1\xfd\xf1\x23\xf6\xdd\x7b\xb1\xaf\x97\x1b\xbd\x4d\xbe\x15\xef\xa4\x1c\x2e\x0b\xea\x72\xbc\x5a\xad\x5a\x2b\xd7\xf7\x10\x6d\x0f\x8d\xc5\x1c\x16\x5a\x83\x4a\xab\x38\x88\x4c\x0e\x53\x46\x6b\xbd\x59\xe6\x45\xc7\x60\x1d\x65\x46\xb7\xf3\xde\xd6\x28\xe1\x20\x6b\x27\xab\xf6\xdc\x98\xdb\x71\x61\x67\xe7\xa3\x66\xfa\x07\x74\x2f\xe1\x7d\x03\xde\xf5\x35\xf6\xba\x1f\x44\x3d\x4d\x4f\xd1\x15\xcc\xd7\x93\x19\xa5\xd7\x30\xdb\x43\x3a\x69\x22\xbd\x9e\x9c\x76\x57\x3a\x8d\x5d\x18\xfa\xc3\x68\x3b\x3e\xf3\xbe\x77\x2f\xf6\xa3\x54\x9c\x21\x2b\x1b\x85\xbd\x49\x86\xc2\xb2\x57\xda\x66\x81\x9f\x6a\x14\xf3\x5e\xe0\xe4\xb4\x65\x1e\x2b\x26\x29\x14\x33\xb8\xbf\x4d\x61\x3f\xea\xb6\x15\x52\xe8\x05\xe1\x34\x70\x1b\xd9\x7c\xb3\x5d\xc4\x21\x5a\x66\x46\x05\xd7\x4b\xe6\x53\xc5\x6c\x73\xb3\x8a\x26\x69\x2f\x3b\x3e\x62\xff\xf2\xec\xc5\xad\x77\xcc\xdf\x31\x7b\xf1\xf0\x9e\xf9\x79\xbb\x20\x51\x90\xb0\xa5\xd4\x28\xd1\x08\x57\x04\xb1\x10\xd1\x08\xb4\x35\xc4\x31\x85\x8a\x54\x6c\x68\xab\x0c\x49\x9d\x49\xa8\x32\x1d\xea\x18\xea\x0a\x56\x25\x53\x6d\x4a\x25\x54\x9f\x78\xf5\xd0\x8b\x39\x2e\xff\xf9\x64\xac\xec\x70\x71\x86\xc3\x5e\x94\xa9\xca\x64\xbe\x9c\xda\x4d\xb4\x1d\xcb\x25\xbb\x1a\xb5\xd9\xb0\x19\x8c\x43\x45\xc4\x9d\x1c\x3e\x6e\x22\x7a\xad\xf4\xb7\x5f\x2a\xff\xe6\xd2\x9f\x5f\x2c\x7f\x2c\xfd\xc3\x49\xce\xc7\x63\xe2\x12\xcf\xae\xc3\xd6\x32\xf0\xac\x56\xdc\xd0\xe4\xcb\x78\x1d\x84\xb3\x39\x8b\xa2\xf9\x24\x64\x91\xbc\xa1\xa9\x23\xa3\x38\xd1\xce\xe6\x12\xb5\xa3\x70\xe2\x8f\x44\x5b\xce\x63\xe9\x59\x32\x4c\x28\x00\xe2\xb7\x64\x64\x07\x21\x97\x11\x9f\x07\xbe\x2f\x37\xb1\xcb\x96\x3e\x9f\x5c\x67\x74\x38\x86\xed\x2d\xca\x8e\x73\xec\xa7\xd7\x1c\xa3\xdb\xe5\xff\xbf\x87\xb7\x22\x7f\x8e\x1d\x4f\xfe\xfc\x7b\x02\x1c\x5f\x92\xfc\xf9\x74\xae\xf5\xcf\xbf\x27\x8e\xe9\x87\x9b\x13\x16\xfd\xfc\xfb\xf1\x10\xb8\xc3\xcd\xff\x9c\x84\x6d\x29\xdf\x26\xe8\xb1\x4d\xbc\x89\x9c\xdd\x1b\xc5\x43\x19\xc9\x70\xf5\x35\xe1\x9f\xfe\xf3\x26\x28\x58\x14\x1f\x4e\x2f\x12\xa7\x53\x44\x6e\x40\x71\xf7\xda\xc3\x1b\xec\x38\xc5\x5b\x16\xf2\x89\xb3\x3a\x25\xbe\xe0\x92\xb3\x0f\xe0\x09\x90\x03\x1c\xe1\xcf\xbf\x27\x7e\x5e\x41\xf8\x2f\xf8\x2f\xf0\xf3\x29\x81\x2f\xc3\x50\xfa\x71\xe5\x50\xb4\xfd\x03\xca\xd3\x84\xf4\xe1\x84\xa9\x3d\x70\xff\xfb\x11\xc9\x33\xa6\x8f\x92\x7b\xcd\x00\x13\x2e\x00\xb5\x99\xa2\x13\x4b\x11\x12\xda\x36\x52\xa8\xa5\x28\xaa\x82\xa9\xa5\x63\xdd\xa6\xaa\xe4\x50\x70\x4e\x91\x0d\x24\xc0\x50\xb1\x14\x9b\xe8\x90\x22\x55\xa7\x18\x9e\x4c\x7a\xd4\xbb\xa7\xf1\x13\x0f\x3e\xa6\x1c\x0a\xbf\xe7\xdc\x93\xa4\xff\x5c\x3d\x1f\xf9\x6c\xbe\xb7\x0b\x2b\x80\x20\x4d\xd1\x55\x45\x42\x8a\x2c\x0a\x00\x67\xba\x26\x15\x21\x38\x13\x4c\xd5\x14\x0d\x28\xd2\x26\x3a\xc1\x0a\x62\x0a\xd5\x15\x81\x19\x21\x16\x26\xc4\x66\xd8\xd6\xf1\xcf\x3f\xdd\xc8\xe1\x05\x0c\xa8\x8a\x09\xa0\xc4\xc6\x02\x49\x02\xb9\xce\x15\x55\xe8\x44\xb3\xb0\xad\x33\x55\xa1\x98\x2b\xd0\xb2\x81\x4e\x05\x80\x3a\x87\x96\x25\x09\x55\x55\x95\x72\xaa\x08\x66\x53\x0c\xbe\x1d\x03\xf8\xf9\x79\x5a\xb0\x8c\xe7\xcb\xf8\x63\xcb\xfe\x1a\xc2\x1a\x66\x54\x55\xa1\xa5\x03\x09\x74\x55\xc5\x1c\x52\x0e\x39\xb6\x88\xc4\x36\xd7\xa5\x65\x5b\xaa\x25\x35\xae\xea\xdc\x06\x42\x48\x01\x99\x80\xaa\x26\x6c\x42\xa9\xa5\x48\xac\x7d\x0b\xc2\xf7\xbe\x61\xf9\xd1\x08\x7f\x5c\xd9\x5f\x43\xf8\xee\x52\xff\xa5\x11\x7e\x5b\x3d\xfe\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\x7f\x30\xf8\x07\x83\xef\x86\xc1\xe1\xd3\xff\x79\xfb\xd8\x28\xe2\xf3\xc3\x29\xb1\xb7\xae\x4f\x0f\x13\x00\xc7\x09\x79\x7b\x91\xb5\x1a\x33\xa7\xe3\xc5\xfd\x75\x71\xa3\xa9\xc3\x30\x55\x2f\xac\x6a\xc1\x00\x77\x56\x90\xce\x27\x19\x27\xb3\x1a\x29\xb0\x3a\x70\xcf\x9b\x94\x8f\x8b\xdd\x9b\xe1\x14\x25\x31\x1e\x29\xeb\x98\xed\x46\x4a\x01\x35\x72\xb3\xb6\xba\x2a\x80\x20\xe9\x2c\x73\xe5\xf1\xb0\x3b\x2c\x75\xc9\x2c\x39\x52\xbb\x8f\x13\x0e\x25\xe7\xce\x69\xa0\xf7\x4c\x58\xa4\x8d\x7c\x85\xad\xea\x24\x92\xcd\xfa\x28\x03\xf2\xfe\xa0\x1b\xa7\xe3\x42\x73\xab\x4f\x76\x13\x34\xb4\x26\xdb\x5a\x67\xeb\x16\x5a\x03\x0b\x45\xe5\x9d\x82\x8b\x3a\x9b\x0e\x78\x67\x90\x81\x93\x31\x33\xe6\x73\x16\xd6\x46\xc3\x54\xd7\x23\x90\xaf\xb5\x8a\xd7\xe9\x0e\x9a\xc3\x96\x7a\xb6\x27\x33\xbc\x73\x6f\x57\xfa\x3d\xd3\x6c\xcd\xb4\xa3\x84\xbb\x65\x58\x98\x65\xbd\x66\x9c\x9e\x43\x58\x69\x5a\x2d\x50\x5d\x15\xb9\x2a\x94\xbc\xca\xa7\x5d\x7d\xde\x02\x3d\x85\x6a\x99\x88\x2e\xdb\x8d\x7c\x00\x91\x09\xd7\xf1\x70\x98\x1f\x97\x59\x7f\xb1\xeb\xf7\x1b\xb0\xb4\x8c\x07\xd5\xfa\x16\xcf\x60\x0e\xe4\x4d\x79\x32\xa7\x0f\xcb\x9a\xb4\x8a\xcb\xac\xaf\xf6\xcb\x71\x7d\xa6\xc5\x69\x6f\x54\x95\xa1\xdd\x6b\xd5\x8d\x5e\xcf\x05\x2b\x6b\xd2\x4e\x17\x44\x63\xdb\x1a\x56\x66\xad\xe1\x3a\xdc\xe2\x79\x3f\x5e\xce\x73\xa3\x34\x5c\x6f\x53\xbb\x79\x2f\x5f\x50\x3a\xbd\xee\x70\x5a\x6a\xf1\x42\x73\x0d\xd5\xf8\x38\x17\x78\x07\xdf\xc6\x8f\xfe\x5f\xdf\xbb\x97\xee\x70\xb5\xbe\x8d\xbf\xcd\xbc\xad\x35\x97\x21\xa2\x04\x0e\x9b\x2b\xd1\x9e\x3b\x7c\x4c\x4b\xa9\xdd\x36\x3d\x5f\x14\x27\x52\x9b\x2c\xc5\xa4\x3e\xd9\x1a\xcb\x5e\xb4\x4a\x8e\xb4\x9c\x19\x2f\x27\x90\x95\x55\x52\xea\xac\x37\x33\xd3\xa9\x33\xaa\x8d\xbd\x16\x1e\xad\x26\xab\xad\x01\xaa\x96\x56\x6c\x8e\xc6\x07\x1a\xa5\x6b\xbe\xaf\xf7\xe3\x79\x0b\xf5\xa5\x08\x9b\x12\xcc\x7c\x09\xba\xbb\x42\xa9\x3c\x6c\x2a\xad\x64\xbd\x31\x2e\x79\xfa\xa8\x28\x01\xb4\xf9\xd9\xfe\xf3\x04\xde\xbb\xf8\xf3\xb0\x2f\xe7\x85\x89\xbc\x17\xce\x61\xbc\x63\x5b\xd7\x8b\xc7\xde\x7d\xeb\xe4\xe0\x93\xa3\xef\xce\xe7\x55\x28\x4c\x51\x34\x8e\x28\x27\x2a\x53\x55\x9b\x6b\xcc\x12\x2a\xa7\x44\x87\x54\xc5\xc4\x06\x88\x52\x0a\x88\x80\x0a\x57\x35\x22\x34\x60\xa9\x40\xb1\x6c\x61\x29\x94\x08\xc2\xd0\xe9\xe4\x93\x27\xd1\xb1\x7a\x46\xf7\x58\x33\x9c\x54\x1a\x54\x40\x29\xbf\x8d\x27\xeb\x1a\x74\x87\x80\x6d\xe7\x01\xa4\xb5\xc2\x66\x55\xc9\x6c\xeb\x38\x4e\x9b\x3c\xd3\x5b\xad\x73\x74\x8d\xc6\x71\x58\xf7\x47\xc6\x1b\xae\x17\x4f\xd0\x39\x78\x37\x73\x4f\xfe\xc3\x54\x92\x5f\xe9\x7b\x63\xfe\xcf\x17\x18\x6e\xe3\x8e\x88\x25\x35\x60\x5b\x9a\xa6\x2b\x36\xd5\x01\xe4\x82\x4b\xc1\xa1\x02\x88\x54\xa0\x4d\xa9\x42\x11\xa7\x54\x27\x80\x41\x2c\x55\x15\xda\xaa\xa6\x52\x4d\xd5\x18\x60\x48\x63\xd6\x11\x77\xe5\x39\xee\xff\xa5\x72\x7f\x14\xee\xba\x7a\x7e\xfe\xe6\x19\x32\x77\xe2\xce\x35\x62\xeb\x2a\x12\x42\xa1\x92\x2a\x16\xe3\x96\xad\x40\x82\xa9\xc0\x40\xc5\x2a\x03\x2a\x92\x4c\x12\x86\xa5\xad\x43\xa9\x48\x5d\x70\xaa\x59\x40\x02\x80\x05\x02\x94\x28\xa7\x73\x51\x5e\xc5\x3d\xb3\x0c\x50\x10\xab\x78\x91\x69\x98\x9b\x79\x33\x85\x82\x42\x2d\xb9\x83\x5a\x6b\xeb\x44\xd0\xb5\xab\xb9\xa1\xd7\xec\x8f\xc3\x65\x3b\x79\x5c\xa1\x2c\x75\x33\xc9\x53\xa1\x6e\xbe\x0a\xf7\x26\xdc\xb3\xf7\xe5\x5f\xe7\xef\xcb\xff\xad\xb8\xeb\x14\x5b\x50\x22\x26\x11\xd6\x80\xcd\x38\x56\xa9\x14\x36\xe7\x0a\x01\x50\x51\x98\x62\x53\x04\x2c\x84\x2d\xaa\x5a\x50\xd8\x36\xa3\xb6\xce\x15\x06\x74\x1d\x12\xc6\x91\x46\x4e\xa7\x7b\x3c\xc7\xfd\x03\xcb\x6d\x5e\x97\x55\x1b\x56\x74\x43\x9b\xba\x63\xb3\x21\x81\xe8\x76\xb5\x5e\x81\x67\x9b\x1b\xd2\x4c\xad\xdd\xc2\x82\xa3\x6e\x16\x62\x56\x42\x45\x07\x36\xdf\xec\x27\xf3\x3e\x7b\xab\xea\x8f\xb1\xf7\xad\x7e\xb5\x80\x65\x29\xc4\xb2\x38\xd1\x38\x87\x5c\x51\xc8\x3e\x70\x49\xa8\xdb\x54\xb5\xa9\x46\x88\xa5\x4a\xcc\x89\x0e\x91\xc2\x15\xce\x6c\x5b\xa3\x40\xd3\x28\x14\x50\x53\x90\xad\x68\xa7\x33\x30\x9e\xfb\xf5\x03\x71\x2a\xde\x89\x93\xf9\x16\xbf\xe6\xee\xb3\xb7\xd2\xfd\x31\xf6\xbe\xd5\xaf\x4c\x53\xa0\x25\x99\x0a\x35\x82\xf7\x9d\x03\x29\x30\x51\xb9\x64\xb6\xa5\x01\x5d\x65\x08\x72\x2c\x24\xb3\x25\xd4\xb8\x04\x16\x56\x84\x22\x15\x0d\x2b\xb6\x64\x52\xd5\x84\xa5\x9d\x4e\x8a\x78\xee\xd7\x0f\xc4\xa9\xfa\x31\x38\xbd\x18\xf3\x0e\xe9\xf9\xfb\xec\x2d\xad\x7f\x8c\xbd\x6f\x6e\xff\x18\xe6\x42\xa7\x0a\x11\x18\x08\x6c\x53\x95\x71\x0e\x0e\xaf\xaf\x51\x42\x24\x55\x34\x48\x31\xd6\x20\xb7\x54\xaa\x69\x12\x72\x4b\x23\x14\x08\x5b\x57\xb1\x42\x6d\x78\xa8\xaf\xda\x4d\xbf\x7e\x20\x4e\xcd\x8f\xc2\x29\x73\x1b\xab\x43\x7a\xe1\x3e\x7b\x8b\xd5\x1f\x63\xef\x5b\xfd\x2a\x2d\x55\x20\x8c\x00\xc5\x14\x62\x55\xb3\xa4\x66\x4b\xc5\xb6\x28\x57\x55\x1d\xa9\x42\x01\x52\x15\x98\x50\x85\xaa\x40\xd7\x19\x87\x0c\x09\x05\xa8\x02\x12\x49\x19\xd0\x30\x3c\x9d\x3a\xf0\xdc\xaf\x1f\x88\x53\xf7\x23\x70\xaa\x3d\x3f\xdc\xd5\x38\xc6\xcc\xf1\xcd\xfe\xe2\xf1\x6d\x8f\x8b\x1b\xe1\xa2\x46\x2a\xb2\xce\xc6\xd3\x4d\x95\x75\x1b\x94\xa4\x77\x76\x44\x25\xe0\x41\x58\x1b\x0d\x76\xe9\x7e\x69\x96\x0b\xca\xda\x6c\x35\x3b\x6e\xc6\xe9\x19\xab\xc9\x71\xf3\xf6\x41\x7f\xee\x8a\x47\x46\x5d\xc9\xa4\x8c\xba\x8a\x87\xe9\x2c\x8a\x0b\xbd\x5c\x1d\xb6\x90\x01\xaa\x72\xd6\xd0\x4b\x2d\xe2\xd7\xa0\x41\x65\xdf\x11\xdb\xe2\xf1\xe0\xc6\x83\x3d\xd9\x3e\x86\x56\x7e\xb3\x13\x05\x37\x1a\xb5\xf1\xd4\x52\xc0\xc9\xcc\x62\xe6\xba\x00\x6f\x6c\x87\xa5\x8e\x2d\x2c\xa1\x2a\xb8\x45\x6d\x49\x35\xc2\x34\xc4\x39\xe7\xba\x65\x33\x4e\xa8\x25\x35\xc9\x25\x57\xa0\x42\x2c\x5b\x62\xc9\x39\xc6\x90\x13\x1d\x59\x2a\x12\x5c\x68\xa7\x77\xf8\x9f\xfb\xbf\x78\x9f\xff\xf3\xc1\x59\xdf\xf0\xb1\xfc\xdf\xd1\xff\x47\xfd\x95\xbe\x9a\x03\x72\x52\x27\xc6\x96\x66\x40\x23\xca\x9b\xe3\x15\x87\x1a\x84\x5d\xaa\x0f\xa7\xaa\x57\x99\x79\xb4\xa9\xe1\x59\x06\xad\x2e\xec\xb9\xe2\xe7\xc5\xa9\xab\x65\x32\x95\x0e\x9a\x7a\x41\x51\xef\xe4\xdd\x6c\x4a\x8e\x39\xd2\x1a\x83\xb8\x50\x2e\xef\xfa\x3d\x7d\xdd\x73\x46\x69\x96\x59\xe2\x0a\x3e\xf2\xdd\x6d\x56\xd4\xee\xf9\x3d\x8d\xf4\xb9\xbf\x76\xb4\x2f\x1b\x8f\x57\xeb\xec\xb2\xde\x37\x9a\x54\x6b\xc1\x56\x27\xee\x8a\x75\x2d\x5b\x98\x67\x53\x99\xae\x9c\xef\x44\xb3\x31\x70\x03\x9f\x3b\x95\xde\xd9\x1e\xb8\x14\xfd\x4d\xc4\x51\x0b\x5b\xf9\xee\x72\xa8\xd0\xf8\x84\x6d\xe6\xb2\x3f\x18\x5b\xe3\x41\x8b\x98\x5a\x90\xad\x80\x4a\x33\xb9\x1e\xb6\x33\x74\x37\x58\x0d\x7a\x1d\xb4\x71\x1a\xce\x70\xd9\xb6\x60\x76\xe5\x35\x2b\x52\x37\x9e\x8e\xd3\x8d\x37\xc6\x1a\x15\x30\xdd\xd6\x04\x91\xaa\xae\x28\x96\x4d\x54\xac\x13\x2c\x34\x8d\x52\x45\x11\x5c\x88\x3d\xa7\x30\xd2\x2c\x4a\x91\xd4\xb0\xd4\x20\xc1\x9c\xeb\x2a\xe3\x40\x95\x40\x58\xec\xe1\xed\xfb\xe7\x64\x2b\xdd\x47\xb6\x9c\x79\xd6\xc7\xff\xb2\x64\x4b\xdf\x24\x5b\x70\x1f\xd9\x8e\xef\x94\x1c\xc9\xb6\xfe\xcb\x92\x2d\xf7\xed\x64\x03\x1a\x42\xc2\xa2\x98\x4a\x5b\xd7\xa0\xd4\x00\x10\x52\x85\x9c\x2b\x40\x53\xb9\x85\x74\x20\x98\x66\x41\xa0\x10\x45\x20\x0c\x04\xb0\x24\x80\x1a\x50\x75\x1d\x63\x95\x51\xa2\x3f\xbc\x37\xff\x9c\x6c\xe5\xfb\xc8\x76\x3a\x46\xef\xea\xbd\xc2\x3b\x46\x62\x3f\x90\x6c\xd1\x7d\x64\x2b\x9c\xb7\xa9\x1e\x9b\xab\x3b\xc8\x66\xfc\x38\xb2\xbd\x38\xc3\xfa\x31\xd3\xab\xdf\x7b\x6e\x35\x5f\xd1\x0b\xcd\x55\x73\x66\x95\x95\x82\x81\xfa\xbd\x69\x2b\x2c\x7b\xd3\x01\x00\x76\x5e\x8f\x2a\x45\xcd\x03\x66\x6b\x5d\xea\xa7\x8c\x01\x32\x0e\x6f\x9d\x3f\x5e\xe9\x2b\x0e\x5c\x7f\x7f\x4f\x9f\xe8\xf2\x48\xf2\xf4\x71\x0e\x6f\xef\xa8\x6c\x8c\xca\x6b\x8f\x35\x96\x0d\x91\x6b\x77\x37\xc2\xc8\x49\x8b\xd4\x9b\x32\xde\x36\xcb\xc5\x3e\xdb\xb9\x56\xbb\x5a\x9d\x78\x85\x72\xad\x92\x55\xa3\xc5\xc4\x5c\x74\x47\xbc\xd9\x00\x6e\x72\x90\xaa\xcf\x93\x41\xd4\xf7\x6a\x24\x99\xeb\x0e\xad\x68\xa7\xe1\xa6\x32\xcd\xab\xab\x6a\xf5\xd3\xe7\xc4\xa7\x68\x51\xf4\xd7\x78\x33\x9b\x9b\xa9\xc2\x82\x76\x4a\x2c\xed\xe6\xac\x75\x7d\x34\xcb\x83\xf6\xa6\x60\x0d\x32\xc0\x08\x53\x56\xb9\x0f\x17\xe7\x71\xd6\x2b\x18\x3c\x10\xe3\xcf\x4f\x4f\xb6\xf6\x5e\xc8\x1e\x8a\xfa\x11\x73\xaa\xef\x9d\xd3\x34\x3e\x60\x4e\x35\xd7\xe9\xa7\xa3\x3b\xf2\x37\x8c\xff\xde\xdc\xe6\xad\xb1\xcf\xf7\x9e\x48\x7f\x7f\x25\xbb\xee\xb8\x3f\x23\xdc\x37\x0e\x14\x5e\xa9\x64\x06\xda\xf4\xad\x4d\xa3\x6e\xf9\xa3\xaa\x93\xce\xe7\xca\x95\x52\x73\x69\x97\x2a\xe3\x65\x27\x2a\x94\x36\x5b\x23\x6a\x34\x70\x8e\x8e\xa6\x98\x40\x36\xf0\x57\xb5\x54\xa1\xd7\x2a\x59\xb9\xc8\xe4\x4e\x9c\xb7\xc6\x0e\x15\xfd\x9e\x28\xb7\x86\x2b\xaf\xd7\xcf\x38\xbb\xa2\xf0\x2a\xc5\xec\xbe\x22\xd4\x42\xbc\x4e\x22\x99\x49\x0e\x0d\x8e\xea\x28\x5d\xcc\xab\x93\xe4\xa8\xdc\xd9\x8e\x26\xe3\xa0\x87\xcd\x02\x10\x25\x51\x08\xca\x35\x72\x6e\x42\xfe\xfb\x95\xec\x5e\x92\xdf\x59\xc9\x16\x5a\xaa\x93\xe5\x1f\x58\xc9\xbe\xb5\xfb\xf0\xdd\x2b\xd9\x07\xaf\x9a\x7c\x63\x9f\x63\x74\x06\xf5\x95\x96\xec\x3c\xba\x7e\x5f\x87\xf7\x5a\xdf\x9b\xae\xf4\x63\xa4\x33\x33\xba\xb6\x2d\xb9\x65\xbc\x1b\xac\x97\x33\x97\x37\x36\x13\xaf\x11\xd3\x42\x9a\x0e\xeb\x56\x12\x14\x0a\xbc\xa6\xb4\x63\xd9\xee\x55\xa2\xa9\xbf\x65\x76\x6d\x99\xc2\x04\x54\xa7\x7a\xaa\x59\xda\xd9\x6d\xbf\xec\x21\x16\xb6\x7a\xa5\xb8\x30\xce\x8d\x59\x3b\x57\x72\xb6\xeb\x56\x90\xdb\x57\x9c\x8d\x92\x34\x1b\xa2\x2c\x67\x61\x58\xd1\x27\xa3\x11\x6c\xb6\xba\x81\xd9\x58\xe0\xc5\x60\x35\x96\x95\x00\x95\xe4\x5a\x35\x06\x9d\x4c\xff\x4c\xbc\xdb\x95\xb2\xfb\xd4\xf1\x4f\x2a\xe5\xe1\xd9\xe3\x6a\xca\xc5\x29\x65\xef\xe8\x19\x4c\xfd\xb3\xbf\x5e\xb8\x5e\x58\x59\x7c\x12\x14\x3e\x24\xff\x17\xfc\xf9\x95\xfc\xbf\xf7\xea\xd2\xe5\xf5\xc3\x56\xf5\x7e\xf4\x6a\xd1\xf7\x5e\x02\x7c\x7f\x10\x79\xa5\xa5\x7e\x36\x45\x69\x5c\x0d\xec\xde\x72\x5d\x04\x05\xa3\xd2\xf5\x8b\xa2\x3f\x98\x66\xcb\x39\xc7\xd5\x93\x28\xdb\xe0\xc5\x6d\x2c\xaa\x3c\x48\xa5\xab\x7d\x3f\x5c\x6c\x57\xb4\xc0\x53\xd9\x66\x94\x37\xea\x95\x42\x4b\x4c\x84\xd1\xab\xa4\xa2\x5e\x7b\xd3\xd7\x8a\x9d\xdd\x7c\x33\x44\xd6\x0a\xc2\x46\xb6\xe7\x86\xa9\x2e\xce\x8a\x70\x9c\xde\x57\x5c\xa7\x17\xc9\xfa\xb2\x36\xc8\x92\x4d\xd7\x8f\x53\xd5\xd2\xd8\x74\x82\xd5\x6c\x1d\xc1\x65\x37\x12\x29\xe2\xab\xeb\x45\xa6\x98\x5b\xac\xd1\xf9\x08\xeb\x7b\x82\xc2\x65\x4d\x7a\x4f\xa5\xac\x9f\xf1\xbf\x50\xf5\xae\x29\xd4\x27\xcf\xde\xc2\xff\x83\xed\xcd\xfc\x08\x7b\xff\x9a\x4b\x9f\x4f\x9e\xbd\x71\x7d\xf4\x92\xf6\x8f\x5e\xfa\xfc\xde\xeb\xd9\xef\x0f\x52\xd9\x9b\x24\x39\x5c\xaf\x04\xa9\xb3\x53\x9e\xad\x23\xdc\xbc\xd8\x03\xe9\xd3\x06\xf5\x26\xf9\x56\x3a\x18\x49\x24\x59\x23\xbb\x30\x49\x6a\xd1\x33\xe7\xd8\xc9\xa5\xcd\xf2\xd4\x0c\x87\x56\x77\xd7\x73\xc3\x38\x24\x3c\x8b\xe3\xd8\x07\xcb\xfc\xae\xd2\x8c\x7a\x55\xd7\x1c\x37\xe6\x69\x5d\x19\xf4\x99\x36\xde\x75\x5a\x63\x50\xdf\xce\xf8\xd0\xd4\x83\x38\x38\xfd\xd8\xde\xa7\xa8\x12\x79\x4b\x7d\xa4\xaf\x79\xd1\x2b\x77\x76\x93\x29\xee\x60\xe1\xc5\xf5\x41\x7e\xdc\xa9\x64\xb6\x2b\x8a\xd3\x68\x26\x72\xdb\xc6\xf6\xbc\xfd\xe8\xae\x60\x75\x41\x80\x77\x54\x7e\x07\x9e\xfd\x70\x6f\xe5\x4f\x5f\x3e\x7b\xe3\x4a\x7f\xb0\xbd\xd9\x1f\x61\xef\x5f\x7a\x3d\xff\x87\xed\xd3\xf8\xd1\xeb\xf9\xdf\x7b\x93\xc6\xfb\x83\xd5\x35\x5b\xbe\x21\x58\x5d\x7f\xbf\x08\x5e\xe7\x4a\x7d\x7d\x5d\xf4\xb0\xd2\x26\x29\xac\x48\x5a\x26\xdb\x3e\x0d\x7a\xdb\x82\x97\x6c\x4a\xd1\x18\x34\xd7\x91\x99\xea\x52\x3b\x94\xfd\x69\xa9\xd3\xd2\xd3\x35\x7d\xe1\xaf\x7c\xd2\xeb\xd6\x77\x82\x83\x2e\x69\x64\x9b\x99\x6d\x18\x54\x32\xc6\x7a\x02\x2b\x5e\x19\x39\x75\xcf\x1f\x2f\xf8\xce\x86\xad\x61\x7e\x1f\x58\xe6\xdb\x7c\x72\x9e\x16\x6e\x9d\x5b\x71\x6f\xb6\x5b\x24\x51\xc6\x0c\x36\x1b\x41\x56\xea\x60\x37\x8e\xdb\x60\x59\x82\x95\x64\x38\xb3\xad\x0f\x0a\x5a\x17\x44\x78\x4f\x10\xe0\x86\xf1\xc1\x41\xe0\xc5\x21\x5c\xfa\x83\xed\x35\x7f\x84\xbd\x7f\xf1\xcd\x2a\x2f\x5c\x1f\xbd\x09\xe9\x47\x6f\x56\xf9\xde\x3b\x90\xde\x1f\xb4\x72\x37\x49\x72\xb8\xde\x14\xb4\xae\xaf\xd7\x76\x76\x5c\x5d\xf9\x47\x7b\x9a\x75\x1c\xba\x8c\xd2\x2d\xf2\xc8\xd2\x6b\xa5\xfd\xb8\x92\x9e\xc0\xf6\x5c\xf8\xd0\xd8\xed\x8a\xce\xb4\x99\x4c\x9a\x68\x30\xd3\x33\xa1\x31\x59\x86\x66\x89\x64\x57\x4a\x55\x96\x75\x77\x4d\xca\x99\x7e\x7d\x5d\xaf\xe6\x87\xcd\x80\xe0\x42\xd1\x89\x8c\x5a\xbb\xbe\x5c\xb1\xb4\xc1\x0f\x41\x66\xeb\xee\x86\x33\x0f\x36\xa1\xed\x96\x77\x86\xa8\x58\xa5\xd1\x72\xe6\xe7\x7b\xbd\xcd\x16\xb8\x48\xe5\xb1\x32\xab\x25\xcd\xee\x5c\x6f\x7f\x50\x00\xbb\x6f\xde\xc6\xc9\x9e\x7d\xf3\x71\x01\xe1\x95\x5d\x41\x1f\x68\xef\x87\xec\x0a\xfa\x9a\xbd\x7f\xe1\x5d\x59\x3f\x70\xb7\xdd\x0f\xdf\x45\xf6\x96\xa0\xf6\xc1\xdb\xef\xde\x1f\xd4\xf2\x37\x89\x63\xdc\x04\xce\x78\xf3\x84\xf7\x71\x27\x13\x5c\xa6\x45\x21\xe8\x2c\xc7\xd5\x55\x33\xce\x6a\xe9\x49\xb1\x82\x6a\x92\x8a\x5e\xc3\xce\x17\x93\x25\x07\x97\x56\xdd\x7a\x72\x64\xc4\xda\x79\x07\xca\xf1\xba\x18\x66\x6e\x3b\x51\xae\x94\x82\x33\x31\xf5\xeb\xb3\x6a\xae\x31\x59\xf7\xca\x56\xd9\x1a\xd7\xba\xd5\x5e\xbc\xf5\x52\xb3\x49\x01\xf7\x88\xa6\xcd\x2b\x60\x36\xec\xd6\x33\x51\xbd\xdf\x4f\xa7\x37\x46\xb2\xb0\x40\xac\xb0\x75\x45\x64\x8b\xde\x2a\x2f\x3c\xbd\xbe\x2d\x57\x6d\x37\x27\x72\x61\xf6\x34\xcc\x24\x00\xc0\x6a\xa9\xdf\xea\x15\x56\x7e\xca\x49\xe2\x8d\x39\x06\x60\x8c\x6b\xbd\x79\xb9\x9b\x29\x86\xe9\x80\x16\x4d\xd0\x27\x2c\x0d\xcf\xb6\xdd\x13\xf0\xfe\x27\x6f\x2b\x3c\x97\xe7\xa2\xd6\xbe\x67\x33\x08\x3b\x1f\x51\x79\xd1\x23\xfc\x8e\x3b\x8f\xae\xaf\x8b\x11\xc3\xfa\xff\x9b\xf2\xfc\xed\xb6\x5d\xbe\x65\x6e\xee\x63\xf7\xb8\xbe\x3f\xc8\x16\xae\x3c\xf6\x5f\x0c\xb2\x17\xf9\x5d\x04\xd9\x54\x32\x0e\x86\xda\x24\x5f\x60\xdd\x5d\x48\x34\xa8\x8f\xa6\x6d\xde\xee\x24\xfb\xd3\xdc\x78\x58\xeb\xd2\x66\x24\xe1\xba\xb1\xe8\xd5\x49\x37\x95\xa9\xf6\x46\x8d\x2d\x19\xed\x1c\x6f\xe6\x0c\x72\x1b\x9e\xe6\x68\xbe\x85\x69\x39\xf4\x50\xc6\x48\x0e\x33\x8b\x72\x58\x68\xed\x8c\x74\xf3\x18\x08\x57\x41\x1f\xaa\x5d\x54\xf1\x93\xae\x32\xdf\xed\xaa\xdb\x4a\x32\x62\x16\x4e\xee\xa2\x62\x9b\xa5\xb0\xdc\xe5\xba\x9c\x65\xe3\x2c\xaa\x7d\x4c\xaf\x32\x73\xdf\xdc\xd8\xa4\x75\xf6\x5b\xfe\xac\xff\x3b\x06\xd9\x7b\x1b\x4b\xe3\xf1\xfb\xdf\x62\x3b\xec\xed\xbd\xd7\xdf\xc5\xff\x85\x7f\xfc\xff\xd7\xf3\x7f\xfa\xdb\x1a\x81\x8f\xde\x7c\xfe\xfe\x56\xe0\x7a\xa0\xf0\x4a\x2b\x60\x1a\xf7\xed\x2d\x49\xd3\x72\xb5\x5c\x36\xda\x4e\x6d\x9a\x9b\xe4\x18\x9b\x6c\x1c\x7f\xcb\x15\xde\x6c\xae\x34\xd3\x70\x9a\x71\xba\x43\xc0\xb0\xd5\x1e\xef\xd4\x94\x22\x8c\x1a\x1f\x04\x3c\x33\x4b\x23\xb3\x99\x9b\xcb\xc1\x2a\x18\x4c\x37\x9b\x92\x59\x8d\xcd\x45\x4f\xa9\x0d\x1a\x22\xbd\xdd\xac\x8a\xf5\x7d\xc4\x6d\x96\xa7\x08\x2e\xdb\x99\x72\x6a\x94\x9b\xb8\x10\x79\xed\x0a\x47\x9d\x38\xdb\x45\xcb\x51\xc3\x1f\xf8\x39\x77\x57\x6c\x47\xe9\x7a\xd6\x3a\x6f\x50\xbf\x2b\x9a\xdf\x37\x69\x78\x3c\xf9\xe1\x2f\x5f\x9b\xaf\x4f\x3f\x3e\xd8\xf7\x17\xda\x6f\xfe\xa3\x5f\x6e\xf8\x2e\xfe\x2f\xfe\xe3\xff\xbf\xf6\xfb\x06\x6f\x88\xe6\x1f\xfd\x76\xc7\xfb\xa3\xf9\xf5\x4f\xb3\xfd\x17\xfb\xf4\x17\xd7\x45\x9f\x1e\xa6\xcc\x3e\x33\x1a\x75\x77\xa9\xb6\xf2\x3a\xed\xba\xd5\xf9\xa0\xd2\x2c\xb8\x33\x2a\xd6\xd5\x6d\xaa\x53\xf1\x4a\x5a\x1c\x67\x3a\x5a\x77\x53\xa2\xb3\x76\x57\xcd\x58\x83\x5e\x37\x9f\x72\xb4\x6d\x7e\xd3\x0e\x23\xba\xd2\xc7\xbd\x72\x25\xb7\x89\x3b\x45\x77\xe0\xd6\xac\x82\x05\x8c\x53\x9f\x3e\xbd\x6b\x58\xee\x48\x53\xb9\xe4\x06\x9a\x15\xaa\xc5\x42\xa7\x52\x37\x14\x3f\x6a\x96\x1c\x00\xb3\xcd\xd5\x38\xb7\x6e\x17\x7b\xdd\x45\xff\x5c\x7d\xef\x6a\x05\xee\x9b\x79\x1d\xdb\x67\xbf\xdd\x1b\x05\x0e\xd7\x0f\x8c\x02\x95\xf3\xf7\xf7\x44\x81\xf4\xf1\xe7\xdd\x8f\x3f\x4d\x6c\xfc\x4f\x88\x02\xdf\xd9\xff\xa5\xbf\xb9\xff\x8d\xef\xec\xff\xcb\xeb\xb5\xb7\xa8\x4e\x27\xac\x7f\xc4\xab\x54\x4f\x55\x3d\x36\x16\x97\xef\x42\x1d\xdf\x62\x3b\xc7\x97\x1b\x4b\x8f\x2f\x6b\x79\x7c\xd9\x63\x6d\x34\x9a\x33\xe3\x99\x96\x87\x12\x1e\x0b\xc6\x38\x0f\x96\x7e\x7c\x38\x19\xf0\xe2\xf3\x97\xf9\x4c\x3e\x16\x33\x53\xaf\xb5\x3b\x2d\xa3\x58\xeb\x7c\xa5\x98\x46\xa5\x63\xb6\x4e\xa8\xd4\x6b\x95\xe1\xa5\xc6\xc3\x71\x85\x46\x36\x7b\xa1\xed\x59\x86\x89\x46\xab\x58\x35\x5a\xc3\x44\xd9\x1c\x26\x7e\x39\xa5\x3a\xe2\x73\x62\x2f\xe1\x33\x4f\xbe\x64\x7e\xf4\xf8\xe1\x63\x0d\x8f\x5e\xb1\x3a\x7a\xcd\xe4\x67\x86\x5a\xcc\xdf\xff\xfb\x20\xf3\x2c\xe6\xdf\xb2\xec\x21\x83\xa7\x46\xf9\x81\x90\x37\x2c\x7a\xfa\xf3\xbc\x4f\xbe\x7d\x39\x7e\x8b\xe4\xe2\xcb\x87\x98\xfb\x44\xf9\x2d\xc3\x5f\xc9\x3d\xd1\xad\x15\x9b\x5d\x33\xf1\xcb\xe3\xdd\x6f\x2a\xc9\xc7\xe0\xfd\x8d\x05\x78\xee\x83\x53\x3a\x8b\x26\xcf\xac\x3f\xfe\xd0\xec\xe9\xbf\x0f\xb2\xf7\xa8\xec\x96\xa1\x17\xd9\x3c\xb5\xf0\x90\x70\x83\x26\x87\x5f\xae\x3d\xfe\xfd\x20\xe3\x0e\xba\x6e\xd9\x76\xce\xe4\xa9\x69\xce\xfc\x73\x62\x1e\x84\xf1\x73\xdb\x2e\x7e\x08\xf7\xc9\x97\x8f\xb2\xf4\x42\xe5\x4d\x83\xaf\xb3\xbc\xe5\xf4\x5b\x56\x47\x4b\xeb\xf4\xdf\xc7\x59\x1a\x2d\xad\x17\x6c\x7c\xc8\xe6\xa9\x75\xa1\x8c\x6e\xb8\xfb\xfc\xcb\xbd\x17\x1f\x3f\xc8\xc8\xb3\xc2\x5b\x86\x5e\x65\xf7\xa6\x18\x76\xf1\x83\x38\xe7\x8f\x1f\x64\xed\x59\xe1\x2d\x6b\xaf\xb2\x7b\x6a\xed\x22\x92\xf1\xcd\xba\x7e\x71\x36\xef\xf9\xe3\x47\xd9\xfb\xa8\xf0\xa6\xbd\x4f\xb3\x7b\x6a\xef\xe1\xfe\xcd\xf6\xf5\x7c\xe2\xe7\xc5\xc7\x0f\x32\xf8\xac\xf0\x96\xc1\x57\xd9\xbd\xd8\x35\x70\xa2\x68\x29\xc3\xcf\x09\x16\x45\x32\xe6\x81\xb8\x51\x86\xcb\x93\x17\x2e\xbf\x7c\x54\x39\x2e\x54\xde\x2c\xc9\x75\x96\xb7\xa2\x44\x24\x17\x9f\x13\xf1\xc6\xf1\x85\xdc\xdc\x28\xc1\xd9\xfc\x8f\xb6\xfd\x55\xc3\xef\xb2\xfa\xaa\x8b\xfa\xf4\xeb\x07\xd9\xff\x54\xe9\xad\x42\xdc\xc8\xf6\xc5\x92\x9c\x64\x6f\x17\xe7\xc4\x39\x8b\xb9\xcc\xe7\xe7\x13\x70\x8b\xb5\xac\x39\xf8\x8a\xd9\x99\x96\x69\x74\xcc\xa3\xe8\xb5\x9e\x44\xbd\x76\xee\xc5\x76\xdb\xc5\x5a\x3e\x61\xc5\xa1\x94\x89\x5f\x4e\x12\xbf\x26\xfa\x05\xb3\x65\x3e\x7e\x4f\xfc\xfb\xcf\x04\x7c\x3c\x10\xfc\x79\x47\x53\x46\xf1\xb1\x2d\xdf\x97\xe2\xdd\x56\x3e\x55\xb3\x37\xf2\xd4\x4f\x79\x62\x62\x24\x5d\xd7\xf1\xc7\x87\xba\xf7\x39\x61\x2d\xb7\xe7\x2f\xf3\xd0\xe1\xcf\xeb\xe2\xde\x0d\xd6\x36\x92\x8b\x77\x1b\xf6\xa8\x61\x6f\xd3\xb9\x62\x3c\x31\xeb\xe5\xae\xe2\x5e\xdc\x96\xf2\x7e\x13\x1e\x94\x1c\xad\xb8\x08\x30\x6f\x34\xe4\x94\x72\x9f\x21\x97\x4a\xf6\x86\x3c\xed\x08\xbf\xd1\x92\x88\xcf\xa5\xbf\xba\xd3\x92\x4b\x25\x7b\x4b\x2e\x7e\x77\xf0\xed\x66\x9c\x1a\xd4\xbb\x2d\xb9\xd4\x73\x32\xe6\xa1\x97\xf0\xd4\x18\x16\xc5\x2f\x1b\x74\x11\x38\xee\xb3\xe8\x5a\xd1\xde\xa4\xab\xd8\xf8\x55\x8c\x1a\x41\x14\x8f\x43\xd9\x6e\x56\x12\x0f\x3f\x79\x97\x10\x4b\x6f\x9e\xe0\x81\x37\x77\x65\x2c\x0f\xd9\xfe\xbf\x00\x00\x00\xff\xff\x8b\x07\x72\x9b\x0a\xc9\x00\x00") - -func set_optionsCoreSqlBytes() ([]byte, error) { - return bindataRead( - _set_optionsCoreSql, - "set_options-core.sql", - ) -} - -func set_optionsCoreSql() (*asset, error) { - bytes, err := set_optionsCoreSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "set_options-core.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x96, 0x60, 0x12, 0xa4, 0xa1, 0x5b, 0xe1, 0x7a, 0xc1, 0xe1, 0x79, 0x85, 0xe8, 0x98, 0x66, 0xba, 0x68, 0xd6, 0x80, 0x17, 0x32, 0xb3, 0x15, 0x45, 0x16, 0xb3, 0xf2, 0xc5, 0xfd, 0xb, 0xc0}} - return a, nil -} - -var _set_optionsHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\xbd\x79\xaf\xa2\xc8\xfa\x38\xfe\xff\xbc\x0a\xd2\xb9\xc9\x99\x89\xdd\x23\xc5\x52\x50\x3d\xdf\xb9\x09\x2a\xee\xfb\xae\x93\x89\x29\xa0\x50\x14\x41\x01\xd7\x9b\xcf\x7b\xff\x45\xd4\x23\x72\xdc\xb5\x7b\x7a\x7e\x4d\x3a\xa7\xc5\xaa\x7a\xb6\x7a\xb6\xaa\x7a\xc0\x2f\x5f\x7e\xf9\xf2\x85\x2a\xdb\xae\xd7\x77\x48\xad\x92\xa7\x34\xec\x61\x05\xbb\x84\xd2\x66\xe3\xc9\x2f\x5f\xbe\xfc\xb2\x69\x4f\xcc\xc6\x13\xa2\x51\xba\x63\x8f\x0f\x1d\xe6\xc4\x71\x0d\xdb\xa2\xd0\xef\xf0\x77\x10\xe8\xa5\xac\xa8\x49\xbf\xb7\x19\x1e\xea\xf2\x4b\x4d\xae\x53\xae\x87\x3d\x32\x26\x96\xd7\xf3\x8c\x31\xb1\x67\x1e\xf5\x27\x45\xff\xe1\x37\x99\xb6\x3a\xfa\xf8\xad\x6a\x1a\x9b\xde\xc4\x52\x6d\xcd\xb0\xfa\xd4\x9f\xd4\x5b\xa3\x9e\x14\xdf\xfe\xd8\x83\xb3\x34\xec\x68\x3d\xd5\xb6\x74\xdb\x19\x1b\x56\xbf\xe7\x7a\x8e\x61\xf5\x5d\xea\x4f\xca\xb6\x76\x30\x06\x44\x1d\xf5\xf4\x99\xa5\x7a\x86\x6d\xf5\x14\x5b\x33\xc8\xa6\x5d\xc7\xa6\x4b\x8e\xd0\x8c\x0d\xab\x37\x26\xae\x8b\xfb\x7e\x87\x05\x76\x2c\xc3\xea\xff\xb1\xa3\x9d\x60\x47\x1d\xf4\x26\xd8\x1b\x50\x7f\x52\x93\x99\x62\x1a\xea\xe7\x0d\xb3\x2a\xf6\xb0\x69\x6f\xba\x49\xf9\xba\x5c\xa5\xea\x52\x2c\x2f\x53\x99\x24\x25\xb7\x33\xb5\x7a\x8d\x2a\x15\xf3\x9d\x5d\xff\xdf\x07\x86\xeb\xd9\xce\xaa\xe7\x39\x58\x23\x2e\x95\xa8\x96\xca\x54\xbc\x54\xac\xd5\xab\x52\xa6\x58\x0f\x0c\x3a\xee\xd8\x53\xed\x99\xe5\x11\xa7\x87\x5d\x97\x78\x3d\x43\xeb\xe9\x23\xb2\xfa\xe3\x7b\x20\x54\xfd\x4f\xdf\x03\xe5\x46\xaf\xbe\x1f\x83\x5b\x6c\xf7\x73\xb7\x25\x70\xa3\xc8\x97\x90\x05\x7a\x1d\x80\xfb\xdd\x33\xc5\x84\xdc\x0e\xf4\xdc\x81\xf5\xa9\xea\x11\x5d\x27\xaa\xe7\xf6\x94\x55\xcf\x76\x34\xe2\xf4\x14\xdb\x1e\x5d\x1e\x68\x58\x1a\x59\xf6\x02\xcc\x59\x2e\xf6\x15\xdd\xed\xd9\x56\xcf\xd0\xee\x19\x6d\x4f\x88\x83\xdf\xc7\x7a\xab\x09\x79\x62\xf4\x81\x92\xa7\xa8\xb8\x6f\xac\x49\xb4\x3e\x71\xfc\x81\x2e\x99\xce\x88\xa5\xde\xc5\x42\x60\xf8\xc4\x21\x73\xc3\x9e\xb9\xbb\xef\x7a\x03\xec\x0e\x1e\x04\xf5\x3c\x04\x63\x3c\xb1\x9d\x8d\x39\xee\x7c\xea\xa3\x60\x1e\x95\xa5\x6a\xda\x2e\xd1\x7a\xd8\xbb\x67\xfc\x5e\x99\x1f\x50\xa5\x9d\x5d\x3e\x40\x74\x70\x24\xd6\x34\x87\xb8\xee\xe5\xe1\x03\xcf\xd1\xfc\xb8\xd3\x33\x6d\x7b\x34\x9b\xdc\xd0\x7b\x72\x8d\xa4\x6d\x2f\x6c\x38\x77\x02\xde\x3b\xdd\x9b\x07\x6c\xfc\x84\xae\x13\xe7\xb6\xae\x7b\xf0\x0f\x0c\xd9\x89\xf5\xb6\x41\xbe\x6b\xbd\x03\x49\xd0\x15\x5f\x1b\x31\xd9\x0c\x18\x78\x57\x67\xc0\x3d\x72\x40\xca\xea\xaa\x1a\x0d\xde\x2d\xfd\x96\xce\xf6\x96\x0e\xfb\x6a\x47\xc3\xf5\x7a\xde\xb2\x37\xb9\x0e\x72\xd3\xd3\x9e\xdc\xda\x93\xdc\xda\x6d\x1f\x4a\x2e\x77\x56\xf6\xe6\x7e\xb5\xdb\x75\x2f\xa6\xac\x6e\x9b\xcc\x6d\x8c\xdc\x48\xdb\x75\x67\xd7\x30\xbf\x77\x56\x6d\x8d\xdc\x99\x17\xbc\xab\xc1\x04\x3b\x9e\xa1\x1a\x13\x6c\x5d\x0c\xde\xd7\x86\xf6\x26\x77\xe6\x26\xef\x11\xed\x5e\x0a\x4e\x0f\xbc\x1b\xbf\x2f\xbc\x5b\xf0\x6d\x3b\x7e\x73\xf8\xdb\xc9\xdc\xcc\xe4\xee\xe3\x26\x3e\xec\x53\x3f\x5f\x19\x7a\x37\x52\xd0\xb7\x9d\x49\x6f\x6c\xf4\x77\x09\xc3\x05\x12\x42\x3d\x6f\xe6\xf1\xfe\x7c\xef\x12\xe4\x5b\x95\x73\x3b\x3a\x5e\xca\x37\x0a\x45\xca\xd0\xb6\x98\x13\x72\x52\x6a\xe4\xeb\x37\xc2\x3e\xa3\x74\x2f\x80\xbc\x9b\xee\xcb\x90\xfc\xbb\xdb\xd9\xdf\x47\xe9\x9a\x5c\x69\xc8\xc5\xf8\x03\x32\xdb\xe4\xd9\x2e\x99\xde\x8d\xf9\x08\xc8\xcd\xa3\x35\x72\x63\xdf\x43\x36\x7b\x33\x87\x67\xac\xfe\x1e\xfe\x4e\x83\xb8\x6d\xec\x2e\xef\xbb\xad\xf3\x2e\xc9\xbb\x99\xb7\x9d\x07\xb8\x87\x97\xed\x90\x1b\xfb\xee\xd2\xbf\xdb\xe9\xd9\xe7\x8b\xb7\x50\x14\xf2\x21\x97\x3b\x07\x5c\xc2\xae\xa3\x94\x4a\x55\xe5\x94\x54\x3f\xd1\x79\x6c\x6c\x56\x1c\x86\x4a\x7e\xb5\x66\x63\xe2\x18\xea\x5f\x7f\xff\x76\xc3\x28\xbc\x7c\x60\x94\x89\x5d\xef\x57\x6c\xad\x88\xe9\x6f\xc5\xdc\x30\x42\x37\x9c\x93\x43\x92\x8d\x62\xbc\x9e\x29\x15\x2f\xf0\xd3\xc3\xfd\xfe\x81\xba\xcf\xd4\x07\x42\x2f\xc0\xd8\x73\xf7\x04\x8c\x0d\xaf\xfe\xf0\x03\xf1\x9f\xa9\x7b\x18\xf1\x59\xbf\x01\x82\xdc\xae\xcb\xc5\x5a\x08\x84\x39\xe9\xbb\x53\x73\xaf\x8b\xf1\xb4\x5c\x90\x3e\x60\xf8\xe3\x97\xed\x2e\x5c\x11\x8f\xc9\xd7\xfd\x77\x54\x7d\x35\x21\x5f\x77\x43\xfe\xa0\x6a\xea\x80\x8c\xf1\x57\xea\xcb\x1f\x54\x69\x61\x11\xe7\x2b\xf5\xc5\xdf\x9c\x8b\x57\xe5\xcd\x7c\xed\x20\xef\xe1\xfd\x72\x04\xf1\xb8\x71\x07\x38\x5e\x2a\x14\xe4\x62\xfd\x02\xe4\x6d\x07\xaa\x54\x3c\x06\x40\x65\x6a\xd4\xdb\x7e\xdb\x6d\xff\x9d\xeb\x03\x79\x0b\x63\xde\xb3\xbf\xc3\xf9\x2e\xa1\xab\xfc\x1c\xc9\xb2\x58\xaa\x87\xe4\x49\xb5\x32\xf5\xf4\x3b\x59\xc1\xfd\xb7\x23\xf4\x07\x28\x21\x42\xee\x61\xfe\x03\x10\x5f\x00\xe5\x7c\x74\xd2\xaf\x55\xf2\xd4\xc4\xb1\x55\xa2\xcd\x1c\x6c\x52\x26\xb6\xfa\x33\xdc\x27\xbe\x18\x6e\xdc\x2f\x0c\x92\x7b\x5d\xd1\x76\xe4\xef\x75\xf5\x40\xff\x7e\x6e\x4f\xc9\xf2\x5d\xb3\xaf\xc2\xa7\xaa\x72\xbd\x51\x2d\xd6\x02\xdf\xfd\x42\x51\x14\x95\x97\x8a\xa9\x86\x94\x92\x29\x9f\xfb\x42\xa1\xb1\xf5\x77\xb5\x7a\x35\x13\xaf\xfb\x3d\xa4\x1a\xf5\x9f\xde\x7f\xa8\x9a\x9c\x97\xe3\x75\xea\x3f\x60\x73\x17\x9e\x8d\xab\x86\xf8\x1c\x77\xd7\xc0\xbf\x8c\x39\xe6\x14\x73\xb7\x78\xaa\xe7\xf8\xbb\x01\xc3\x3b\x8b\xef\x5f\x3d\xc4\xe1\xaf\xbf\x50\x54\x5c\xaa\xc9\x54\x2b\x2d\x17\xa9\xff\x80\xbf\xc0\xdf\xd1\xff\x80\xbf\x98\xbf\xff\xfb\x1f\xc6\xff\xcc\xfc\xc5\xfc\x4d\xd5\xb7\x8d\x94\x9c\xaf\xc9\x1b\xa1\xc8\xc5\xc4\x6f\x27\x25\x73\x43\x1c\x78\x52\x32\xd7\x31\x7c\x6b\xc9\xfc\xbf\x47\x24\xf3\x31\xa6\xee\xe4\xf0\x1e\x87\x6f\x13\xc4\x21\x6c\x7f\x80\xe8\x53\x4c\x51\xb5\x8d\xac\xa8\x3f\x0f\x1e\xe0\xf3\xf6\xeb\x7a\xa7\x2c\x53\x7f\x06\x2d\xe2\xb7\x53\x56\xfb\x52\x1a\xc3\x00\x43\x24\xee\xcd\xf8\x76\x0a\x4f\xa6\x40\xcf\x52\x79\x0a\x68\x88\xd2\x23\x83\x3c\x26\xf7\xa0\x65\x1f\xa9\x3d\x95\xe6\x3d\x4d\xed\x09\xa0\x61\x6a\x83\x46\x72\x91\xda\x4d\xe4\xd2\x88\x8e\x67\xa6\xd7\xf3\xb0\x62\x12\x77\x82\x55\x42\xfd\x49\xbd\xbd\xfd\x71\xdc\xba\x30\xbc\x41\xcf\x36\xb4\xc0\x51\xda\x11\xaf\xc1\xfc\x77\xc7\xa2\x6f\x60\xb7\xb1\xb7\xb5\xc5\xe0\xe2\x7b\xcb\x91\xa1\x51\x8a\xd1\x37\x2c\xcf\x4f\x0c\x8a\x8d\x7c\x7e\xcb\x0e\x1e\x6f\xd2\x78\x4a\x1d\x60\x07\xab\x1e\x71\xa8\x39\x76\x56\x86\xd5\x0f\x75\xb3\x66\xe3\xf7\x94\x9f\x32\x2c\x8f\xf4\x89\x13\xea\xa2\x9b\xb8\xef\x52\xee\x18\x9b\xe6\x47\x34\x9e\x3d\x36\x3f\x22\xf9\x95\xe1\xf9\xdf\xde\x7b\x7e\x9c\xf6\xf0\xba\xe1\x51\x71\x84\x77\x3b\xde\x45\xe2\x91\xe5\x07\x81\x4c\x26\xa6\xe1\xef\xd9\x53\x9e\x31\x26\xae\x87\xc7\x13\x6a\x33\x67\xfe\x2d\xb5\xb6\x2d\xf2\x91\xd0\x73\xab\xa2\x7d\x3e\xba\x5b\x4e\xdd\x46\xf3\xfb\xe2\xeb\x0c\xd4\x9d\x1a\x4a\xd5\xfa\x36\xa3\x03\xfe\x17\x99\x62\xbc\x2a\xfb\xe9\x57\xac\xb3\xfb\xaa\x58\xa2\x0a\x99\x62\x53\xca\x37\xe4\xf7\x7b\xa9\x7d\xb8\x8f\x4b\xf1\xb4\x4c\x81\x6b\xcc\x3c\x2c\xf6\x30\xa0\x0f\xaa\xb8\xdb\xf4\xa0\x2c\xb2\xf4\xe6\xd8\xfc\xf5\xed\x0c\xc7\x6f\x5f\xbf\x3a\xa4\xaf\x9a\xd8\x75\x7f\x0b\x4f\xd7\xf6\xac\xe2\x84\x6e\x41\xee\xb7\x0b\x13\xb5\x5d\x1b\x3f\xcd\xd9\x76\x47\xe7\x9d\xaf\xd3\x96\x71\xd8\xab\x3b\x4d\xe6\xc9\xee\xaa\xad\x9d\xea\x0e\x98\xd3\xdd\xb7\xdb\x7f\x27\x06\xf0\xf0\x92\x85\x9d\xde\x5e\x78\x91\xda\x06\x61\x7e\x37\xa5\xbd\xc4\x08\x55\x6a\x15\xe5\x04\x15\xeb\x5c\xe1\x68\xbb\x43\x77\x99\xa1\x77\x58\xa1\xe6\xdf\x0d\xed\x1c\x6d\xfb\x3d\x9f\x67\xb5\x6e\x07\x67\xa7\x76\x21\x9b\xe9\x9d\xf3\xf4\x1f\xb7\xb8\xce\xf5\xfc\xe4\x1f\x7c\x7c\x3a\xa3\xcd\xbe\x1e\x9f\x6e\xd2\x88\x87\x0d\xd3\xa5\x86\xae\x6d\x29\xe7\x95\x6d\xbf\x51\xf6\xac\x1c\x76\x70\x76\x72\xd8\x9f\x5b\x9f\xa1\x2d\x70\x98\x7c\x93\x15\x9e\x3a\xc7\x3e\x3d\x70\x27\x96\xc0\xce\xa8\x3f\x11\xef\x74\xec\xbd\x1c\x1d\xc2\x70\x98\x88\xdb\xfa\xbf\x1f\x26\x87\x02\x93\x3d\xf3\x0e\xb1\x29\x3c\xc6\x21\xd8\xbb\x3a\x68\xdb\x77\x36\xd1\x6e\xee\xfb\xae\x3a\xbb\xdb\xd0\x39\xfb\x07\x5e\xc0\x87\x7c\xc0\xc3\x66\x4f\xb5\x0d\xcb\x3d\xad\x83\x3a\x21\xbd\x89\x6d\x9b\xa7\x5b\xfd\x93\x4f\x9d\x9c\x9b\x6b\xbf\xd9\x21\x2e\x71\xe6\xe7\xba\x6c\xf2\x50\x6f\xd9\xf3\xd3\x24\x63\x7d\xae\xd7\xc4\xb1\x3d\x5b\xb5\xcd\xb3\x7c\x85\xe7\x68\xaf\x2c\x04\x6b\xc4\xf1\xd3\x8b\xed\xf7\xee\x4c\x55\x89\xeb\xea\x33\xb3\x77\x56\x51\x76\x8c\x63\xc3\x24\xda\xf9\x5e\xe7\xcd\xea\xcc\xde\xf5\xb3\x56\x76\xe6\x3c\xe4\x4a\xcc\xbb\xdd\xdb\x5c\xf7\x5f\xf7\xb2\xfc\xda\x30\x76\x11\xc7\xf7\x0a\x6b\x77\x31\xfa\x64\x98\xbb\x88\xeb\x63\xd8\x3b\xdd\xfd\x42\x18\x0c\x9c\xec\xbc\x4c\x37\xaf\x2d\x73\x8e\xab\xaa\xce\x2c\x85\x36\x99\xbf\xba\x65\xc5\x8f\x80\x4f\x06\xc0\x9d\xe5\xdb\x33\x47\x7d\x2f\xd3\x38\x13\x7a\xf6\xee\xe4\xed\xed\xeb\xd7\xf3\x4b\xb1\xf3\x76\xb0\x3b\x58\x7b\x56\x9c\xbb\x5a\xc0\x5f\x5f\x9a\x2f\xec\x5c\xe2\x23\xd1\xcb\xaf\x85\x39\x8b\x36\x54\x89\x78\xa9\xd3\xae\x38\xf2\x52\x97\xed\x3a\xf8\x64\x87\x8f\x35\x9d\x57\xfa\x5d\x44\xf7\xde\xeb\x02\x46\x9f\x24\xc3\xed\xb9\xc4\x34\x89\x43\x29\xb6\x6d\x12\x6c\xed\x63\x92\xa1\x92\x9e\x75\x14\x7f\xb7\xdf\x1d\xc7\xe4\x43\x35\x51\x2f\x14\xad\x8f\xea\x99\xc2\x8d\x81\x63\xfa\x93\x95\x9f\x3e\xd5\x3d\xbf\x36\x98\x8a\xa7\xe5\x78\x8e\xfa\xf5\xd7\xa0\x04\xff\x4b\xd1\xbf\xfd\x76\x0d\xd4\xa9\xe1\x7b\xa1\xfd\xbf\x0f\x72\xbc\x01\xde\x91\x4c\x43\xe0\x43\x02\xf7\x09\xbc\x68\x4a\xa7\x4f\xb8\x5f\x60\x5c\xa7\x6b\x16\x6e\x8c\xa4\xb7\xb8\xb0\x67\x62\xe9\xb5\xfa\x80\xd7\x44\xd3\x2b\x58\xbe\x57\x3c\xbd\x93\xd9\x27\x23\xea\x15\x6c\x1f\x63\xea\xb9\x01\x17\xa2\xea\x51\x4d\xc8\x0b\x75\x75\xaf\x9f\x41\x92\x6e\x5e\x44\xed\x7c\xff\x95\xa5\xd9\xad\x81\xf7\x72\x0c\x3d\xd9\xf7\x80\xfa\xa4\xbd\x6c\x56\x01\xe7\x97\x11\xe7\x16\x68\xff\xc8\x12\xcb\x5b\xf6\x88\x35\x27\xa6\x3d\x21\xa7\xb6\x2d\xbd\xe5\x66\xc1\x33\x33\xbd\x33\x8d\x63\xe2\xe1\x33\x4d\x9b\xa5\xd6\xb9\x66\xd7\xe8\x5b\xd8\x9b\x39\xe4\xd4\x0e\x1b\x82\xbf\xfd\xf5\xf7\x21\x77\xf9\xdf\xff\x9d\xca\x5e\xfe\xfa\x3b\x2c\x73\x32\xb6\xcf\x6c\x86\x1d\x60\x59\xb6\x45\x2e\xe6\x42\x07\x58\x1f\xc1\xec\x38\x33\xc6\xa4\xa7\xd8\x33\x4b\xf3\x77\xac\x45\x07\x5b\x7d\x12\x5e\x8d\x1d\x87\xd6\x8d\x24\x36\xd0\xfa\x44\xbb\xbe\xdc\xda\xed\xfd\x19\xda\xde\xda\xf6\x25\x5c\xb7\xb8\x88\xad\xb9\xf9\xf5\x72\x57\xaa\xc3\x6a\x72\xfd\xc2\x3e\x69\x70\x47\x2a\xb8\x4b\x7a\xdf\x3a\xe2\x75\x4c\xdc\x58\x3c\x77\x91\xa9\x8b\xeb\x8f\x5b\x98\x3c\x1b\x69\x5f\xc6\xe6\xcd\xf5\x87\x17\x19\xbd\x12\x16\x4e\xb3\x9a\xc0\x1e\xa6\x74\xdb\xb9\x72\x5a\x44\x25\xa4\xba\x74\x85\xbd\x33\x20\x2f\x9d\xba\xdc\x02\x36\x53\xac\xc9\xd5\x3a\x95\x29\xd6\x4b\x1f\x4e\x5e\xfc\x00\x5d\xa3\x7e\x7d\x03\x3d\xc3\x32\x3c\x03\x9b\xbd\x6d\x15\xcc\xef\xee\xd4\x7c\xfb\x4c\xbd\x31\x34\x40\x5f\x68\xf8\x85\x66\x29\x20\x7e\x65\xc4\xaf\x9c\xf0\x3b\xcd\x32\x1c\x82\x11\x9a\x79\xfb\xed\x8f\xdb\xa0\x33\xbd\xed\xd3\x0d\x47\x52\x55\x56\x3d\xcf\x36\xb4\xcb\x98\x10\xe4\x85\x7b\x30\xb1\xbd\x99\x4b\xde\xa3\x4c\xcf\xb0\x3e\x3c\x51\x71\x11\x1f\xc7\xd1\x9c\x78\x0f\x3e\xae\x87\x35\xad\x17\xde\x97\xba\x88\x83\xe7\x78\x96\xb9\x07\x07\xdf\xdb\xc6\xb4\x7d\x76\xed\x9f\x67\x5e\x44\x01\x59\x9a\xb9\x8b\x0d\xb8\x47\xb1\xf3\x60\x37\xa0\x10\x39\xc0\xdf\x83\x42\xe8\x8d\x6d\xcd\xd0\x57\xb7\x73\x21\x02\xc8\xdc\x85\x42\x3c\xe2\x62\x57\xc6\x7c\x03\x1e\x81\x83\xec\x7d\x78\x36\x93\x8e\xfb\x7d\x87\xf4\xb1\x67\x3b\x97\x75\x0a\xd1\x80\x46\xf7\x80\x47\x3e\xf8\xed\x9e\x65\x6f\xa9\x39\x97\xa1\x33\x02\xb8\x6b\xaa\x01\xed\x83\xdf\xcd\x82\xbf\x52\xbd\x8c\x80\x47\xc2\x5d\xd2\x01\x20\x88\xe0\x7d\xe9\xb3\x71\x00\x97\x11\x21\x88\xee\xe3\x84\x39\x9a\xe8\xdd\x62\x73\xfb\xe0\xec\x25\x4c\x80\x16\x78\xee\xae\x19\x01\xec\x96\x9d\xf7\x25\xfa\xc5\x19\x07\x80\x11\xe0\x7d\x9c\x70\x3d\xdd\x58\xee\x1f\x22\xb0\xc7\x66\x4f\x37\x88\x79\xd1\x35\x02\xc0\x03\x70\x97\x13\x06\xfc\xfe\xec\x64\xbf\xa7\xbd\xbc\xc2\x06\x14\xee\x73\xf3\x00\xf6\x0c\xab\x4f\x5c\xaf\xf7\x71\xd7\xfc\x0a\x2a\x01\x89\xf7\xcd\x88\x70\x14\xae\xfd\xe3\x09\x7c\x39\x98\x00\x86\xa6\x59\x6e\x87\xe4\x4c\xac\xbd\x78\xd6\x7e\x6f\xb0\xfd\x70\xde\xbe\xa7\x1e\x7c\xa6\xde\x52\xf1\x76\x2e\x05\xab\x45\xae\x54\xcc\xc8\xe5\x78\xa1\x98\x8c\x09\x2c\x23\x71\x2c\xec\xf2\xe5\x62\xa2\x56\xcd\xa7\x5a\x39\x21\x15\xcb\xc7\x0b\x95\x7c\x26\x59\xe2\x6a\x82\xdc\x69\x35\x1b\x61\x09\x9d\x45\xc2\x6c\x90\xc4\xaa\xe5\x4e\x3a\x93\x67\xe2\x19\x36\x59\xac\x70\xb1\x76\x3e\x59\x28\x26\xf2\xc9\x6c\xa3\x58\x6e\x30\xe9\x0e\xdb\x2d\x24\x6b\xe9\x52\xb1\x11\x97\x4b\x52\xad\x25\x54\xe2\x42\xa9\xcd\xa4\x6f\x46\xc2\x6e\x90\x48\x7c\x2b\x56\xee\x48\x7c\x87\x6b\x49\x72\xba\xdd\xaa\x32\x8d\x5c\x89\x69\x94\xb8\x58\x23\x95\x6e\x54\x04\x4e\x6e\x94\x73\xa5\x22\x53\x49\x37\xb9\x56\x35\x5d\xca\x54\x8b\xb9\x5c\xfa\x68\x1a\xee\x2a\xdb\xd8\x64\x71\x57\xa6\x61\x57\xea\x76\xa8\x52\xfd\xdd\x25\x97\x4b\x1a\x3e\x53\xec\x67\xca\x73\x66\xe4\x06\xe5\xf8\x58\xac\x70\x4f\x7a\x77\xcf\x01\xf9\x4b\x38\x3d\x5a\x94\x7c\xa6\xc0\xe7\x6d\x9d\xd3\x75\x46\x4f\x1d\x90\x3f\x6a\x04\xfb\x43\xf2\x80\x0d\x70\x02\xc3\x71\x90\xe3\x58\x9e\xf5\xa9\x02\x1b\x95\xfd\xdf\xa7\x05\x31\xfa\x03\xef\xd3\x57\x8a\xf9\x4c\x7d\xda\xc2\xef\x8d\xc8\xea\xd3\x57\xea\xd3\xa3\x46\xf3\xe9\xff\xce\x69\xf4\x35\xb2\x98\xcf\x14\x00\x3e\x59\x61\x4a\x18\xb6\x92\x64\xd2\x0d\x99\x67\xa4\x42\xbb\x91\x6c\xa4\x59\xa9\x93\x95\xda\xed\x54\xbb\xdd\x64\x9a\xe9\x76\xa7\x53\x85\x72\xa7\x2d\xd7\xcb\xb9\x44\xbb\x5b\x93\x5a\x50\x68\x97\xb8\xfb\x28\x61\x10\x87\xa0\x20\xd0\xbc\xe0\x0b\x08\xfa\x84\xe0\x99\x37\xe8\x39\x64\x3a\x33\x1c\xa2\xf5\x74\x13\xf7\x3f\x7d\xdd\xce\xe8\x3d\xb0\x59\x11\xf2\x9c\x40\x23\x01\x82\x1f\x49\xf8\x47\x64\x31\x1f\xc9\xe2\x4f\x90\xf5\x1d\x66\x82\xe5\x58\x1e\x09\x1c\xc3\x41\xfe\x87\x92\x56\x90\xac\x8d\xb4\xe8\x63\xb2\xc0\x3f\x24\x2d\x9a\x86\x9c\x20\xf0\x00\x22\x5f\x5a\xbc\x4f\xd5\xc0\x1e\x93\x9e\x66\x8f\xb1\x61\x6d\x28\xb1\x66\xa6\xe9\x7a\x2b\x93\xfc\xae\xda\xe3\xbb\xc0\x33\xbc\x00\x91\x48\x0b\xa2\xb0\xf5\x1b\x9c\x0f\xde\xb4\x17\x3d\x6f\xe0\x10\x77\x60\x9b\xda\xa7\xaf\x14\xfd\x99\xfa\x34\xde\xe4\x20\x81\xef\x36\xd3\x34\x30\xfa\x83\xe3\x2f\xef\xc2\x0d\x38\x81\x13\x39\x9a\x17\x84\x1f\x49\x11\x80\xb0\xc9\xa0\x04\x96\x11\xc1\x35\x4f\xb1\x89\x71\x77\x81\x66\x44\x91\x43\x34\x8f\xc4\xad\xea\x0b\x3e\x68\xc3\xd2\xcd\xed\xa6\x90\x46\x5c\xcf\xb0\xfc\xcf\x3e\xbb\x0f\x66\x03\x77\xb1\x2b\xf2\x22\x42\xac\x08\xc5\xad\x7e\x6d\xb5\xde\xf5\xb0\xe3\x19\x56\xbf\xa7\x60\x13\x5b\x2a\xd9\x50\x03\x68\x9a\xfe\x9d\xde\x5e\xb7\x63\x60\x8e\x31\x30\x7e\x6e\xb0\x91\xa7\xbf\xc2\xf8\x00\xf7\x33\xf5\xe9\x50\x52\xe8\xab\x36\xf6\x8c\x39\x79\x98\x23\xf6\x36\x43\xfe\xd6\x6a\xc5\xee\xa8\xe2\x18\x61\x37\xf5\xdf\x4a\xce\x3b\x0c\xdf\x5c\xce\x21\x8e\x6e\x93\xf3\x53\xfa\x7c\x25\xc1\x3a\x55\x79\xf7\x68\x82\xb5\xaf\xbe\x7b\x57\xaa\x8d\x67\x42\x08\x21\x0d\x01\x9d\x55\x58\x9d\x40\xa0\xf0\xb4\xae\x88\x9a\xc6\x03\x01\x40\x8d\x81\x22\xd1\x15\x86\x46\x80\xd0\x88\x43\xac\xa2\x03\x91\x65\x35\x91\x81\x1c\xaf\x8b\xb4\xae\x22\xb0\x59\x4b\xb1\x50\x40\xba\xca\x63\x0d\xf3\x40\xd3\xa0\x80\x34\xac\xd1\x82\xc2\x21\x46\x10\x14\x8e\x67\x59\xa0\x22\x06\x89\x1c\x0b\x39\x81\xb0\xa2\x2e\xd2\x08\x29\x2a\xe4\x44\x41\xe1\x34\x5e\x17\xde\x7c\xc5\xa1\x43\xab\x32\xf8\x95\xe5\xbe\x32\x28\xbc\x58\xdb\x7e\xcd\xfc\x0e\x18\x11\x22\xf1\x6a\x2b\x0f\x78\x16\x41\x5a\xe0\xf9\x4d\xf4\x83\x9b\x09\xfd\x70\x6d\x32\x38\xff\xef\xee\xcf\xfb\xb7\x87\xe6\xcf\xd4\x9b\x24\x49\x52\x7c\xdd\xe5\xa3\x49\x07\x37\x34\x60\x59\x98\x4e\x7b\xd9\x2c\xeb\x25\x0b\xcb\x55\x6d\x2c\x17\x47\xfa\x70\xc8\xc5\xbb\xf3\x54\x2d\xed\x15\xdb\xec\x3c\x0b\xf3\x49\x12\x2d\x47\x15\x54\x1d\xce\xfb\x9e\x59\x5f\xca\xe3\x72\xa7\x51\x8c\x26\xe6\x36\xc8\x47\xcb\x4a\x57\xc3\x3c\x93\x2f\xd8\x85\x0d\x68\xa9\x5d\x6e\x16\x92\x15\xe9\xfd\x62\xd7\x68\x30\x96\x6a\x93\x3c\xf2\xa4\xe6\x72\xe4\x2d\x13\x6c\xbb\x56\x9a\xb0\x86\xb7\xac\xcd\xe5\x71\x01\x4a\x8d\xd1\x22\x56\xe3\xe4\xea\xb8\x35\xe1\x26\x4c\x65\x24\xa3\xd4\xa2\x3b\x2b\x32\x16\x3b\x4d\x15\x80\x99\x96\x40\xcc\x49\x57\xaa\xf5\x0c\xea\x8e\x1c\x1c\x19\x26\x52\x8b\xc5\x06\xf2\xa2\xc8\xe5\xf1\x7a\xc2\x04\x90\x49\xd5\x82\x74\xe2\xea\x4a\x6d\xc0\x55\x24\x29\x41\x67\x4f\x35\xff\xd0\xd7\x4e\xab\xce\x58\xfe\x07\x63\x00\xaf\x51\xe4\x37\x5d\xe0\x39\x95\xa5\x01\x52\x44\x0d\x60\x15\x10\x45\x25\x44\x01\x00\x6a\x1a\xcd\x13\x04\x75\x81\x53\xa0\xaa\xf1\xbc\xce\xd2\x22\x04\x2c\x03\x18\x91\x23\x88\x57\x21\x61\xa1\x8a\xc9\x76\xfd\x05\x4e\xea\xf5\x79\x75\x67\x85\x6b\x6d\xbb\x45\x0b\xcd\xf0\xf0\x15\x86\x10\xd5\x1a\x8b\x45\x4a\x19\x56\x9d\x18\x14\x05\x47\x6e\xb1\x95\xf6\x44\x61\x6b\xcc\xba\xd9\x5e\xc7\x53\xf2\x4a\xb6\xeb\x93\x76\x8a\x63\x56\x33\xbb\x5f\x75\x8a\x52\x2e\xd3\x1d\x9b\x72\x4b\x69\xd6\xd2\x11\x7b\xb4\x28\x99\x34\xac\xd6\x6c\xc6\x56\x47\x40\xab\xa5\xa3\x85\xbc\x64\xf1\x9c\x3f\x71\xbe\x21\x04\x26\x72\x9c\x5c\x94\xcc\xe4\x54\x6d\x6a\x2b\xe2\x99\xec\x7c\x38\x31\xda\x79\xa5\x56\x58\x77\x9a\x06\xe6\xb8\x79\x8d\xf6\x94\xea\x88\x17\x3b\xeb\x05\x2b\x00\x18\x93\x98\xee\x9c\x29\xe2\xcc\x3a\x52\x16\xda\x79\x59\xaa\x24\x27\x31\xa9\x24\x2e\xc0\xc4\x45\xf5\xb8\x09\x06\x59\x62\xf9\x76\x20\xb9\x3f\x8b\x21\x80\x3b\x0c\x81\x7e\x8d\x12\xbf\x31\x22\x16\x88\xca\x41\x91\x15\x35\x9a\xc5\xa2\x4e\x38\x05\xd1\x0c\xc3\x02\x5d\xc5\x18\x8b\x80\xc7\x08\x70\xa2\xc8\xb2\x2a\x83\x01\x20\x1a\x04\x44\xe4\x31\xc3\xeb\x3a\xcf\x31\x2c\xb8\x64\x08\xc2\x59\x65\xe7\x59\x56\xb8\xdc\xea\x1b\xc3\x76\xdd\xcc\x20\x48\x5f\x32\x06\xfa\x46\x63\x58\x19\x96\x20\xe3\xc4\xb0\x52\xb2\xa3\xa3\x59\x25\x33\x4c\x8b\xd3\x69\xbf\x39\xad\xd6\x32\x05\x31\x37\x48\x7b\x1d\x32\xc0\x59\x1d\x35\x32\x4b\xab\x3b\x5e\xe8\xa3\xae\x9b\x9f\xc2\x44\x5c\xaa\x74\x12\xeb\xa4\xcb\x09\xac\xc5\x32\xeb\x06\xdf\x51\xc7\xc9\x58\x26\x62\x8d\xb5\x82\x9b\x3c\x44\x05\x79\x71\x98\x4c\x68\x56\x65\x7a\x32\xc0\x03\x3c\x9d\x26\xc7\x2b\xba\x62\xa4\x6b\x6a\x8d\xd7\x8d\x74\xcb\xd5\x6b\xee\xb4\x9b\xa5\xcd\x91\x21\x64\x41\x24\xa9\x78\x0a\x8a\x26\xcb\xe5\x24\x5f\x5c\x49\xd3\xb5\xa1\xd6\x53\xab\x4c\xa6\x63\x5b\x35\x83\x91\xd6\xd2\xaa\x4a\x2c\x9d\x74\xba\x98\x4f\xf9\xfa\x6f\x9f\x30\x86\xb2\x7d\x4a\xa1\x7e\x1e\x63\x40\xaf\xd1\xe3\x37\x95\xe3\x35\x8e\x11\x68\x24\xaa\x22\x66\x74\x8e\x46\x10\x61\x82\xa1\x06\xb1\xa0\xb1\xac\xa8\xaa\x2c\x84\x80\x20\x8c\x75\x8e\x17\x54\xc8\xf2\x0c\x60\x09\x0d\x38\xcc\x02\x8e\xc7\x17\x6d\x01\x9e\xd5\x76\x28\xb0\x88\xbd\xda\xba\xdb\x50\xe1\x21\xe4\x2e\xd8\x02\xba\xd1\x14\xc4\xaa\x56\xb1\xe2\x9d\x55\x2e\x4f\xc7\x5b\xe3\xd9\xc4\xc3\x16\xbd\x1e\x16\x8a\xe3\xf4\x64\x3a\xaf\xb6\x97\xc3\xc6\xa0\xdc\x4f\xe6\x0a\x8d\xd6\x60\x5a\x4e\x47\x0b\x42\x24\xdd\x40\x2b\x4f\x44\x28\x95\x82\x1d\xcc\x17\x3b\xd1\xe8\xb2\x31\x77\x55\x9b\xad\x77\xfb\x85\x9a\xdc\x4a\xc6\x8a\xaa\x3f\x75\xbe\x29\xf4\x0f\x53\x59\x2e\x0d\x96\x49\x39\x27\xa2\x52\x0b\xaf\x1b\xce\xd4\x28\x5a\xa9\x94\x9c\x1e\x34\xe6\x46\xd9\x9d\x26\x67\x69\x96\x4c\x87\xb5\x84\xba\x32\xd7\x5e\x2a\x6a\x2b\x93\x6e\xae\x85\xbb\xe5\x5c\x4e\x14\x59\x24\xb6\xca\x60\xe2\xd2\xc8\xb1\x4a\xe6\xb8\x99\x41\xc3\x61\xc9\xec\xc4\xcd\xb1\x0f\x7f\x74\xc2\x14\x4a\xf2\x29\x75\xfa\x79\x4c\x41\x7c\x8d\x1a\xbf\x71\x9a\x0e\x04\x82\x91\x46\xab\x2a\xc2\x44\xd3\x54\xc0\xaa\x7e\x60\x81\x22\x27\x40\xa2\x02\x00\x39\x96\x06\xba\xa2\x73\x50\xe7\x08\x81\x10\x60\x55\x20\x1a\xa4\x79\x8c\x54\xee\x92\x29\xf0\x67\x95\x5d\x40\xa2\x70\xbd\x75\xbb\x5b\xc6\x8a\x2c\x14\x2f\x98\x82\x78\xa3\x29\xd0\xec\x52\x9f\x5a\x95\x75\xd6\xf1\xd8\x58\x39\xa6\x68\x31\xbb\xca\x08\xb1\xe4\xa8\x10\x8b\x44\xab\xf3\xfa\xac\x3b\x70\xd2\x42\x2b\x86\x2d\x39\x9f\xab\x65\xed\x74\xbc\xc5\x8f\x14\x1c\xa3\x85\x45\xdc\x14\x9b\xf9\x79\x7b\x16\x19\x0d\xa7\xa3\x38\xec\xcf\xa5\x05\xd4\x9d\x74\xa6\xb0\x0c\x44\x85\x80\x76\x66\x69\xcf\xe5\xa2\xed\x4e\xc5\xc3\x4c\xbc\x1c\xb3\xf8\xfe\x64\x18\x1f\x8f\x31\xae\x43\x73\x2e\x37\x06\xae\xe3\xb2\xab\x55\xa7\x65\x8b\x23\x4f\x66\x91\xdc\x2f\x75\xba\x95\x45\x82\xf4\xe9\x84\xa8\x2b\xa2\x9a\x82\x95\xda\x12\x0c\xd7\xe3\xac\xd0\x97\xeb\xa0\x2a\xaf\xa1\xdd\xf0\xa3\x4e\xff\x84\x29\x14\xfa\xa7\xd4\xe9\xe7\x31\x05\xe1\x35\x6a\xfc\xc6\x42\x0d\xf2\x04\x8b\x9c\xca\x40\x8e\x25\x88\xe1\x35\x5d\xd3\x81\x4a\x88\xae\x69\x22\xa7\xb2\x3c\xc3\x23\x44\x43\x22\x2a\x98\xc6\x0a\x27\xd2\x08\x93\xcd\x18\x88\x09\xaf\xfb\x89\xcc\x59\x53\xe0\xce\x2a\x3b\xa2\x05\xee\xfc\x62\x61\xdf\xba\xdb\xa1\x05\xb4\x70\x69\xdd\x2c\xdc\xba\x6c\x56\x5a\xed\xe9\xa0\x90\x1d\x95\x27\x59\x2d\xaa\xa7\x4b\x02\x62\xe4\x05\xc8\x76\x47\x29\x98\xb7\x73\x5e\x26\x8e\x79\xaf\xdb\x72\x4c\xc4\xb1\x8a\x12\x4d\x4a\x33\x71\x00\x57\xc2\x08\xf3\x75\x8e\xed\xa8\xba\xd3\xc8\xab\x74\x31\x9a\x04\xc3\x41\x64\xca\x4b\x8b\xa9\xa9\x10\xb9\xe1\x4f\x9d\x6f\x0a\x81\xa9\x14\xe1\x84\xe5\x1d\xc8\x8e\x0b\xab\x55\x46\x5b\x24\x57\xd1\x52\x33\x53\xb1\x3a\x78\x90\x6f\x2a\xcb\xc8\xb2\x26\x54\x1b\x4c\x35\xd5\xaa\xf4\xe3\xac\x3a\x68\x54\x75\x58\x03\xb5\x64\xad\x3c\x9a\x98\x85\xd6\x64\x32\x5d\xad\xb2\x06\xc4\xc5\x41\x2b\xc6\xa4\x21\xce\x33\x1d\x59\x6b\x1a\xbe\xc2\xab\x27\x4c\x21\x27\x9e\x52\xa7\x9f\xc7\x14\xe0\x6b\xd4\xf8\x0d\x70\x0c\x47\x38\x1d\x69\xac\xce\x41\x41\xe5\x74\x1e\x73\x0c\x0f\x44\x24\xea\x3c\x4d\xd3\x44\x13\x54\x5a\x05\x88\xe3\x19\xa8\x70\x3c\xcd\xa8\x50\xa4\x79\x51\xd0\xa1\x0e\x08\x46\x08\x5e\x32\x85\xb3\x29\x10\x43\xf3\x1c\xc3\x5c\x6d\xdd\x9d\x26\xb0\x82\x70\x69\xe5\x0c\x6f\x34\x85\x65\x65\xc4\x97\xad\x3a\x4a\xe9\x32\xc2\x15\x33\x95\x1d\x02\x49\x12\xda\x8b\x42\xaa\xd1\x18\x7b\x49\xc9\xc5\x52\x2b\x8d\xe6\xe9\xe9\xb8\x95\x40\x89\x54\x96\x8f\x68\xbc\x5b\x1b\x67\x90\x32\x2c\xf6\x53\xf5\x36\x71\xe6\x91\x56\x82\x5b\x96\xd9\x58\xa9\x5c\x90\xe5\x78\xdc\x36\xc5\x91\x3f\x75\x1b\x53\x48\x04\xd6\x0a\x95\x5c\x4a\x47\x74\x31\x1a\x27\xca\x0c\xb7\x5b\x4b\x73\x52\x56\xd4\xb5\x81\x63\x0d\x99\x5b\xac\xec\x88\x55\x1a\x37\x5a\x2c\x94\x12\xde\xbc\xbc\x24\xd5\x7e\x5d\xad\xa7\xc7\x3c\xa9\x67\x30\x3f\x61\x62\xa8\xc2\x8c\x5d\x92\x92\xc7\xc9\x2a\x9b\x81\x06\x6e\x43\xd7\x49\x28\x75\x1f\x7e\xe7\x84\x29\x64\x3b\xa7\xd4\xe9\xe7\x31\x05\xfe\x35\x6a\xfc\x06\x30\x83\x90\xce\x6a\x34\xd6\x78\x5a\xc5\x22\xcd\x02\x16\x42\x4d\x80\x22\x0f\x05\x71\x93\xb6\x33\x1c\x2f\x2a\x2c\xa7\xb2\xa2\x2e\xea\x82\xca\xb0\x18\x01\x8c\x01\x64\x10\xaf\xb1\xfa\x25\x53\x38\xaf\xec\x0c\x2d\xf0\xe0\x6a\xeb\xf6\x70\x8b\x85\x9c\x78\x69\xdd\xcc\xdf\x6a\x0a\xf6\xc4\x5a\xd3\x39\x50\x59\xd9\xd2\xb2\x38\x06\xcc\xa0\x45\x62\xdd\x75\x36\x69\xac\xeb\x89\x21\x87\xc4\x0c\x1c\x61\xbb\x95\x6b\xd2\xd1\x41\x56\x2c\x69\x6c\xb5\xa9\xd7\x1b\x19\x7d\x3a\x37\xe3\x5e\x64\x56\xe3\x53\x03\x2f\x51\x5e\xd9\xd3\x15\xbf\xa8\xcc\x34\x47\x89\x94\xd2\x70\x9b\x9b\xf8\xa6\x10\x48\x53\x94\x6c\xbc\x84\x73\x63\x26\x8e\xe5\xec\x28\x31\x1f\xa1\x56\xb2\xaf\x56\x24\x36\x3b\x29\x32\x6c\x7c\x99\xc8\xf0\xc3\xfa\xaa\xa5\x5b\x9e\x6a\x4c\x52\xf9\xc9\xba\x1a\x51\x75\x69\x2d\x95\x5a\xf9\x44\x47\xb7\x92\x93\xd1\xc8\x24\x85\xee\x00\x81\xa8\xe4\x55\x13\x12\xcc\xea\xac\x69\xfb\xda\xdf\x38\x61\x0a\x69\xfa\x94\x3a\xfd\x3c\xa6\xc0\xbd\x46\x8d\xdf\x14\x5d\x51\x55\xa2\x62\x86\x16\x18\x5e\xe0\x34\x0e\x33\x0c\x83\x00\xa7\xd1\x50\x11\x34\x81\xc1\xac\xca\x13\xa2\x33\x50\x10\x59\x11\xea\x2a\x61\x78\x44\x44\x56\xa4\x59\x1d\xeb\x34\xd1\x2e\x99\xc2\x79\x65\x67\x39\x44\x9f\x5d\x54\xbf\xb7\x6e\x0f\x54\x21\x02\xe2\xa5\x65\x33\x77\xa3\x29\x08\x11\x71\xed\xda\x7d\xd5\xd4\x8a\x35\x23\x33\x49\x16\x63\x8e\xde\xce\x0d\x97\x44\x58\x75\xb9\x52\x2a\x5a\xca\x76\x61\xa2\x9f\x88\xcc\x13\x5e\x74\x95\xd3\x12\xc5\x28\x30\x53\x0d\x3d\x59\xf2\x98\x48\xbd\xab\xd6\x6b\x93\x5c\xba\xbb\x9c\x13\xdc\x6f\x40\xcd\x93\xfa\x0b\xad\x92\xf2\x5c\x7f\xea\x7c\x53\x08\x68\x27\x06\x06\xab\x0d\xf3\x5c\x36\xc5\x34\xe8\xe9\x6a\xcc\xc4\x0b\x36\x89\x2d\x4d\x27\x32\x1f\x93\x99\xd2\x15\xe6\xa9\x38\x67\xf5\x07\x1c\xca\x67\x2a\x51\x00\x95\xa6\xdc\x2c\x35\xe4\x6e\x06\x0c\xb4\x5a\xd1\xc0\x4c\x45\x57\xe9\x46\x29\x95\x4f\xf1\x74\x25\x9b\xe4\x26\xe3\x08\x97\xf3\x21\x57\x4e\x98\x42\xaa\x72\x4a\x9d\x7e\x1e\x53\x60\x5f\xa3\xc6\x6f\x00\x0b\x00\x71\xb4\x4e\x44\x4c\x44\x8e\xf0\x3a\x84\x50\x51\x74\x40\x6b\x0a\x4d\x78\x11\xaa\x90\x47\x88\x23\x08\xb1\x00\x40\x5d\xe7\x11\xe1\x00\x23\x72\x22\x62\x31\x61\x34\x8d\xb9\x64\x0a\xf4\x59\x65\xe7\x44\xfe\xfc\xfe\x92\xdf\x2a\xbc\xbd\x17\x00\x00\x51\xbc\xb4\x6c\x66\x6f\x8d\x0a\x93\xa5\x29\x45\x6d\xc7\xae\x9b\x68\x8c\x05\xb1\xc2\x2c\xf8\x8e\x92\x6a\x75\xeb\x93\xd1\x32\x39\x47\x5d\x3e\x96\x93\x8d\xba\x63\xb0\x35\xa1\x98\x5e\x17\xfa\x4e\xcc\x98\x1b\xa6\xc3\x0f\x66\x95\xb8\x6e\x96\x84\xe5\x38\x3a\xef\x97\xd0\xb0\x6f\x94\xc7\xb8\x1e\xef\x97\xa7\xc9\xf9\x61\xad\x90\x08\x4c\x65\x6b\xe5\x95\x97\xf6\x4c\x4b\x7a\x31\x29\xd2\x2e\xf7\xed\x36\x14\x4b\x56\x6d\xb2\x9a\xd2\xf1\x55\x31\xbb\x54\xa2\xfd\x51\x41\x5c\x0f\x8c\x69\xb6\x3c\x63\xb3\xb5\xd5\x20\xa1\x0c\xd5\xf6\x42\x27\xf6\x5c\x27\xcb\x52\xc6\xe4\x9d\xea\x80\x2e\x37\x57\x74\x7e\x91\xcd\x64\xe4\x4a\x0c\x39\x7e\xd4\x29\x9c\x30\x05\xd9\x3d\xa5\x4e\x3f\x8f\x29\x30\xaf\x51\xe3\x37\xc8\x6a\x9b\x7c\x8a\x85\x84\x40\x51\x03\x0a\x23\x28\xbc\x22\x22\x9d\x61\xb1\xce\xb3\x00\x28\x02\x0f\x11\x66\x38\x1d\xeb\x80\xa3\x59\xac\xd1\x0a\xcf\x28\x90\x65\x15\x5a\x50\x08\x42\x6f\x7e\x21\x01\x73\x4a\xab\xc1\xd9\xe3\x66\x86\x47\x9c\x70\x3e\x7d\xda\xb7\x6e\xab\x34\x38\x1e\x5d\x5a\x35\x33\x37\x5a\x02\x53\xee\x0e\x41\x71\xc6\xdb\xb4\x92\x15\x5a\x9c\xb5\x2a\xcd\x1b\xcb\x14\xdb\x9c\xd8\xa3\xc8\x3c\x29\x95\xbc\x38\xc8\x31\x05\x21\x26\xc0\x6e\x83\x24\x5b\x03\x36\x92\xef\xb0\x9d\x7a\x7a\x34\x50\xa0\x17\x69\x1b\xa3\x3a\x27\x4a\xb9\x66\xc3\x19\x44\x32\x45\x93\x2d\x74\x50\xb1\xe8\x1d\x2c\x21\xee\xa7\xf2\x99\xf7\x3f\x92\xaf\xac\xee\xe1\x7e\x21\x95\x2b\xdb\x95\x85\xb4\x68\x15\xbb\x7a\x86\x6f\xad\x92\xad\x25\x33\x16\xea\x76\xb1\x12\x1f\x74\xba\xfc\x7a\x9a\x74\x16\x76\x9f\x19\xd2\xa3\xf6\xb4\x52\xcc\x4b\x8e\x57\x64\xea\x25\x26\x9f\x94\x50\xdd\x4a\xcd\xbd\x5a\x7b\xdd\x6c\x97\x53\xae\x9c\x2b\x0e\xd7\x30\x47\x0a\x83\x6c\x49\x32\x71\xbb\xa5\x71\xf3\x2d\xfe\x13\x96\x92\xc8\x9c\xd2\xb6\x7f\xb9\xa5\x30\x77\x9c\xc1\xbd\x46\xcb\xfd\xc7\x2e\xf7\xa5\x15\x00\x09\xf4\x17\x1a\x7c\xa1\x01\x45\xd3\x5f\xfd\x7f\x67\xb5\x59\x60\x18\x74\xde\x12\xf6\xad\x87\x43\xb4\x0b\xba\x7e\x5a\xd3\xb7\x24\xfd\xd3\x93\x72\xfe\x8a\xb5\x73\x06\xb7\x8a\xae\x6a\xb9\x98\x90\xb0\x12\x28\xcd\xd0\xcb\x61\x2c\xe2\xd2\x7d\xcf\x5d\x64\x16\x6b\xd0\xd6\x6a\xad\x0e\x8e\x65\x71\xd2\x77\xf7\xf2\x09\x25\x3e\x7d\xed\x95\x58\x92\x62\xa3\xef\xc0\xc8\x4b\xaf\x43\x45\xc5\x95\xaa\xa5\x1b\x5e\x6c\xf4\x68\x11\xd3\x99\xe7\x55\xcf\x16\x8d\x9f\xb1\xb8\x2b\x60\x98\x70\x69\xf5\x63\x60\xd8\x70\x15\xf5\x63\x60\xb8\x70\x79\xf1\x63\x60\xf8\x70\xdd\xed\x63\x60\x60\xb8\xbe\xf6\x31\x30\x42\xb8\x54\xf6\x31\x30\x62\xb8\xb4\xf5\x31\x30\x28\x5c\xc6\xfa\x18\x18\x40\x87\x0a\x43\x1f\x04\x13\xae\x60\x7d\x10\x4c\xa8\x7c\x92\x7d\x10\x4c\xa8\x2a\x92\x79\xcd\xdb\xbd\x5e\xf2\xe8\xca\xe5\x47\xcf\x3f\x53\xe0\xe6\x67\x76\xce\xbc\xe4\xea\x69\x3f\x15\x30\xe3\xa0\x63\x3a\xdc\x30\x81\x0a\x78\xd7\xe8\x5b\xdb\xdf\x04\x7a\xaa\x14\xff\x33\xb5\x87\xf4\x5e\xb7\x4a\xff\xdf\xdb\x37\x78\xa6\xec\x14\x97\x41\xbf\x79\xb8\x81\x01\x2e\x55\x93\x60\xc7\xaf\x36\x77\x3f\x7d\xa5\xfe\x02\x7f\x7f\xa6\x82\xdf\xf5\xfc\x6f\x8f\x6b\xd3\x3f\xfd\xfd\xbd\xe8\x3f\x72\xd8\x87\x1b\xfa\xbb\xcc\x12\xff\xdd\xb8\x0c\xc6\x93\xc3\x0d\xf7\x5d\xb8\x04\xdf\x8d\xcb\x60\xb8\x3b\xdc\x88\xb7\x3f\x73\xf2\x7d\xe8\x3c\x8a\xa7\x87\x9b\xa0\x67\x78\xe6\xe1\x95\xef\xc4\x44\x30\x9a\x1f\x6e\x82\x86\x3f\xc6\xae\xb7\x55\xa9\x83\x32\x7c\x37\xfa\x8e\xd3\x84\xf7\x9b\x23\xc3\x26\x5e\xc8\x2d\xbd\x7f\xf3\xcf\x3a\xa5\xe3\xdc\xe4\xfd\x26\x68\xae\xc7\xcf\xdb\x3c\xf9\x60\xc2\xf7\xe1\x2a\x98\xe2\xbc\x7f\x16\x03\x0f\x92\xe8\x33\x4b\x23\x8e\xcf\xcb\x83\xcf\x29\xfb\x8f\x84\x6c\x1f\xe4\x7d\xea\x99\x98\x8d\x2a\x5c\x7f\xaa\xe5\x1b\x3c\x50\x7d\x4e\x6c\xbb\x5c\xec\xfd\x33\xf7\x4d\xc5\xf6\xa8\x26\x7d\x17\xb1\x5d\x49\xec\x4e\xbc\x6a\xf3\x89\x77\xed\xdc\xf5\xd6\xc1\x47\x93\xc7\xb3\x6f\x2b\x3a\xb9\xcc\x65\xce\x2f\x10\xae\x02\x62\xc2\x39\xda\xa3\x80\xd8\x70\xb2\xf4\x28\x20\x2e\x9c\x8f\x3c\x0a\x88\x0f\x87\xfc\x47\x01\xc1\x70\x4c\x7e\x14\xd0\x87\xb8\xf8\x28\x20\x31\x1c\xc0\x1e\x05\x84\xc2\xd1\xe4\x51\x40\x47\x0b\x5f\xf1\xfc\xc2\xf7\x3a\x20\x10\x8a\x05\x0f\x03\x62\x8e\xbd\xe3\xe3\x14\xb1\xc7\x80\xd8\x57\xbd\x90\xf3\x25\x0b\xe0\x6b\xaf\x24\xbb\x67\x09\x7c\xf6\x8d\x94\x2f\xf0\x63\x81\x37\xb3\xd0\x02\xcb\x6a\x0a\xe2\x11\xd1\x45\x01\x10\x81\xa6\x35\xc2\x01\x55\x65\x68\x81\x53\x15\x56\xa4\x35\x2c\x28\x80\x66\x20\xa3\xb1\x3c\xad\xd1\x0a\xa1\x81\x40\x73\xa2\xc8\xf3\x1c\x46\xd0\x2f\x7b\xdc\x9d\x65\x3e\x9c\xa4\xbc\x9f\xd4\x40\x1a\xec\x77\xa8\xcf\x3f\x3f\x85\xc4\xb3\x27\x3f\xef\xad\x47\xfe\x78\xbb\xb5\x9d\x83\x43\x62\xb0\xc3\xb1\x9d\x11\xeb\x29\x33\x11\x25\x7d\x95\x15\xca\x6d\x2f\x9d\xcb\xad\x5b\x4d\x71\xd1\x34\xba\x31\x1c\x9f\xf1\x79\xde\xaf\xea\xed\xfa\x83\xfc\xa3\x8f\xf0\x01\x47\xec\xf0\xb1\x71\xf8\x58\x39\xd5\x7e\xe1\xf2\xfb\xc7\xc1\x2c\xa6\xa5\xed\xfa\xac\x5f\x98\x57\xbc\x84\x10\x1b\x64\xf2\x6c\x91\x20\xad\x59\xd6\x53\x99\x48\xd6\xe0\xb3\xf3\x46\x29\xd2\x95\x3c\x61\x11\x1a\x8f\x85\xd1\x7c\xb4\xf0\xd1\x81\xa8\xdc\xc2\x52\xb9\x64\xce\xb8\x6a\x4a\x44\x0d\xb3\x30\x69\xe7\x2b\x69\x73\x84\xb4\x45\x61\x15\xad\xe7\xc7\x59\xc1\xf3\xe2\x75\xa1\xb1\xcc\xa2\x51\xad\xc1\xc5\x95\x76\xb3\x91\x8a\x1a\xc2\x2a\xb5\xac\x39\x2e\x9a\x8b\xfd\x66\x2e\x9f\x5c\x7a\xf5\x8c\xd9\x36\x8b\x4a\x5a\xa1\xa5\xca\x9f\x7f\xbe\x05\x8f\x05\x82\xb5\x03\x87\x8f\xc1\x47\xc3\x0e\xfd\x2b\xef\xb2\xf3\x0f\x78\xe3\x01\xda\x9d\x69\x11\xe6\x49\x09\xf7\x87\xcb\x02\x6e\x94\x11\x8c\xad\x75\x17\x11\x5a\xb5\x9d\x62\xb7\xbd\x8e\xb5\xb2\xa3\xa4\x9d\xdb\xf3\x26\xc5\x9b\xd2\xbc\xaf\x1f\xe6\x22\x70\x36\xb6\xad\x33\x2d\x31\xf1\xa8\x54\xe2\xf8\x4e\x2c\xc1\x7a\xe9\x66\xb2\x04\xaa\xac\x44\x17\xc8\xa8\x2c\x66\xab\xd0\x2a\x02\x09\x91\x96\xa1\xad\x32\xde\x61\xae\x12\x2d\x1e\x28\xa9\xe5\x5a\x4b\x9b\x6e\xb7\xc6\x0f\x15\xc6\x2f\x11\x8a\x4b\x52\x26\xfe\xf8\xdc\x34\x42\x13\xe4\xd3\x97\x3f\xdc\xc7\x67\x36\x6b\x7b\x1c\x3f\x8d\x97\xe5\xe5\xa4\x12\x65\xed\x74\x31\xb2\x06\x42\x75\x65\xb8\xc0\xd4\x0b\xc9\xce\xb8\xd2\xea\x3b\xb3\x5a\xa4\xee\xf7\xcf\x36\xe2\x91\xd8\xb6\xa2\x75\xfb\x1c\x84\xf4\xae\x5b\x5b\xf9\x0b\x9d\xbc\x28\x09\x43\xb3\x2f\x97\x09\xad\x35\x1a\x42\x33\xad\x26\x2a\x4b\x58\x89\x2e\xcc\xf4\x54\x65\x1b\x09\xc0\xe3\x2c\x9b\x31\xc0\x61\xbe\x8a\x8a\xd5\x74\x95\x74\x91\x26\xad\xa5\x99\x1f\x17\xe7\xca\x7e\xae\xfa\x99\x03\xfc\x7c\x8b\x4b\xd2\x64\x50\x82\xd2\x0a\xc5\xe9\xb2\x9b\x92\xfb\x73\x15\x08\x00\x34\x90\xd8\x19\x72\xe3\xfc\x68\x8c\x2a\x02\x3f\x8a\xb3\x73\x7f\x50\xf8\xa4\xe5\xdb\xcd\x7f\xf6\x27\x9f\x7f\xe9\x1b\xcf\x7f\xf0\x3a\xd8\xf3\xb6\x8a\x62\xf3\x27\xf7\x1c\x3f\xbb\x2a\xc0\xfe\xfb\x9f\x7f\x91\x3e\x07\x0a\x46\xee\x8c\x25\x92\x59\xc9\x73\xe9\xc5\x4e\xc7\x76\x7f\xb6\xfa\xb1\xa5\x2f\xe1\xf5\xe7\x8b\xc4\xac\xd4\x92\x2a\x48\xa8\x82\x6a\xdd\x6b\x68\x8b\x62\x22\x3d\x49\x44\xe3\x0d\x32\x59\x6b\x95\x72\xdb\xb4\x2d\xd5\xc8\x37\x0f\x44\x80\x99\xd6\x5a\xba\x2a\x5b\xe5\x95\x54\x63\xd6\x61\x90\xb7\x93\x6d\x7c\x2b\xda\xad\x7d\x78\x4a\xbf\x5d\x85\xb2\x60\x27\xf2\x74\xbe\x12\x59\x74\x6a\x71\xb4\x6e\xcf\xdb\xcd\x3a\xbb\x34\xca\x46\x67\x56\x53\x40\x62\x3e\xae\xe4\x89\xaf\x6a\x1f\xfc\xf9\xff\xbe\x55\x70\xf1\x57\x9a\xfe\x8b\x8a\xf7\x67\xe3\xdb\xbf\x9b\xec\xc8\x4f\x02\xae\xa7\x88\xc1\x17\x7b\xd2\x58\xd4\x05\x0d\x12\x4e\x64\x18\x45\x87\x1c\x2f\x42\x5e\x13\x04\x84\x18\x46\x53\x35\x8d\x55\x38\x96\x67\x05\x05\x21\x96\x08\x3c\x11\x00\xe4\x55\x55\xe4\xb0\x4a\x73\x84\xd6\x14\xfc\xb6\x7d\xb9\xc4\xab\xd2\x18\xfa\x5a\x1a\xc3\xb3\xfc\x85\x07\xc8\xf7\xad\x47\xab\xc1\x67\xd3\x98\xb0\x7d\x5f\x48\x63\x64\xe9\xe6\x34\x26\x00\xef\xdd\xd4\xe5\x18\xca\x15\x72\x39\xa9\x66\x14\x87\xc9\x41\x12\xe3\xc1\xd2\xb0\x56\x2a\xa3\x56\x2a\x73\x41\x96\x8c\x8a\x17\xab\x43\xba\x53\xad\xf5\xd7\x5c\x94\xd1\xa4\xa2\xda\xb6\xd5\xf8\x28\xc6\xca\x95\xe4\x84\xb4\xe7\x76\x7b\xb8\x5c\x66\xe5\x82\x27\x4f\x9b\x4c\xb1\x5d\xd6\x62\xab\xe5\x3c\x53\x7a\x59\x3a\x12\x28\x45\x7e\x24\x1c\x71\x07\x99\xa6\x43\x32\xbb\x37\x1c\xf9\x32\xfe\x8e\xe1\xe8\x07\x72\xdf\x3e\x3d\xff\x4c\x3a\xf2\xba\xf9\x7f\x36\x1d\xfd\x89\xe7\x5f\xfa\x2e\xf3\x7f\x22\x85\xc9\x3e\x27\x83\xa4\x7c\x80\xa7\xfe\xcb\x6c\x20\xf0\x02\x81\x47\x52\x98\x92\x24\xed\xb3\x97\xd8\x42\x7a\x2e\x85\xf1\xe9\xf9\x4e\x29\x8c\x5e\x1b\xc6\x8d\xbe\x6c\x0f\x3b\xcb\x4e\xb5\x35\xb6\xd5\xce\x44\xb4\x8a\x96\x2c\xe7\x23\x4b\x29\x33\xca\x57\x1a\x11\x2f\x25\x37\xec\x42\xa4\x8c\xac\x4a\xa2\x9d\x84\x69\x69\x22\x69\x4b\x39\x86\xdb\xa6\x00\x93\x9c\xa8\xd6\xaa\x89\x7c\x35\x67\x6a\xc3\xe6\x9a\xad\xa8\xae\xb2\x4a\xf4\x5f\x9d\xc2\x28\x44\xe4\x15\x9e\x00\x4e\x53\x15\xa4\x13\x24\x40\x2c\xb0\xaa\xaa\xaa\xa2\xa2\x63\x15\x22\x85\x08\x44\x25\x2a\x03\x18\xa8\xe8\x84\x27\xaa\xca\xf3\x40\x85\xe2\x26\xb5\xd1\x54\x4d\x78\xfb\x4c\xa1\x57\x65\x30\x3c\x42\xd7\x32\x18\x28\x40\xf6\xfc\x43\xdc\xfb\xd6\xa3\x6d\xe8\x67\x33\x98\x74\x48\xa7\xff\xc1\x8d\x98\x00\xbe\xc0\x46\x4c\x34\xe2\xd9\x1d\x61\x90\x4a\xe3\xc6\xda\x81\x02\x10\xbb\xc3\x9a\x5a\xab\x47\x5a\xc3\x64\xbf\x53\x6c\xa0\x8a\x4b\xc0\xa2\x3c\x6d\x96\x60\x23\x1a\x2f\x34\xbb\xe5\x15\xec\xae\x8d\xf1\xc8\x68\x27\x97\x6a\x4c\x65\x27\x2b\x10\x23\x9d\x31\x1b\x97\x22\x9d\xf8\x34\xe7\xa4\xab\x6b\x29\xf6\xca\x8d\x98\xc0\xd0\x07\x22\xdf\xa0\x7a\x98\x8b\xd4\x01\xfe\x8f\x16\xf9\xc2\xef\x86\xf0\xef\x7f\x0a\xaf\x2f\x5d\xcb\x7c\x5e\x37\xff\x3f\x70\xe6\xfb\xf3\xce\xff\x95\xcc\x27\xf3\x9c\x0c\x52\xf6\x01\x5e\xe7\x87\x95\xc1\x69\x1b\x08\x6c\x9e\x3d\x92\xf9\x34\x2a\xd2\x7b\xe6\x73\xc8\x4c\x7e\xb4\xcc\x27\x18\xef\xb6\x99\xcf\xb7\x0a\x48\xaf\xcd\x7c\x88\xc2\x69\x2c\xcf\xd2\x88\x47\x80\xe7\x04\x85\x08\x3a\x61\x74\x05\xa9\x1c\x27\xb2\x9c\xc6\xd0\x84\xd3\x78\x88\x18\xc4\xd1\xa2\x88\x55\x80\x59\x8d\xa1\x39\x0d\x40\x82\xf0\xee\x59\x68\xf1\x75\x99\x8f\x78\x2d\xf3\x11\x69\xe6\xfc\x03\xab\xef\xad\x47\xe7\xe6\xcf\x66\x3e\xa9\x90\x4e\xff\x83\x99\x4f\xc0\xbb\x06\x32\x9f\x55\xdd\x4d\x66\xa3\x60\xa4\x0d\xad\xd2\xa8\x90\x2c\x0f\x16\xcd\x9c\x92\x53\xfa\xc5\x46\xa1\xe9\xad\xc6\xd1\xd1\x20\xcd\x37\xa1\x20\x4c\xf2\xf4\xa8\xd3\x28\xc5\xdd\x52\xab\x15\x8b\x2d\xa5\x48\x7a\xca\xe2\xf4\xca\xd4\x5c\x5d\x6b\xce\x53\xda\x58\x2c\xad\x72\x05\xdd\x4c\x6a\x49\x67\x93\x62\xbf\x2c\xf3\x09\x74\x7a\x24\xf2\x4d\x0f\x73\x11\xc0\xf7\x0d\x23\xdf\xc9\xb9\x0a\x6c\x5c\x3c\xe2\xc5\x70\x5f\x3a\xf6\x62\x92\xf4\x6d\xbd\x58\xf8\x92\x0f\x53\xb1\xf8\xff\x0d\x3f\x3f\x5d\x54\x3d\x91\x59\xa4\x9f\x93\x41\xa6\x70\x80\xf7\xc1\x9f\x7d\x0b\x19\x84\xaf\x98\xf4\x2f\xf7\x11\x7e\xb4\xff\x56\x4e\xf8\xb5\xd1\x5e\xc5\xbc\xaa\x89\x88\x81\x1a\x4f\x6b\xbc\x8e\x38\xac\xaa\xb4\xff\x0a\x53\x04\x21\x41\x8c\x00\x10\xcf\x0b\x40\x55\x38\x24\x08\x04\xa8\x8a\x00\x11\xad\xe9\x22\xc7\x33\x48\x07\xfe\x33\xee\xc2\xeb\xa2\xbd\x70\x2d\xda\x23\x1a\xf1\xe7\xdf\xdb\xb8\x69\xe5\xde\x42\xc5\x6d\xcf\x46\xfb\xe4\x29\xed\xdc\x5e\x0f\x45\xfb\x4b\xda\x14\xba\x52\xef\xf4\x54\x4a\xbc\x63\x62\x84\x56\xec\x18\xce\xc6\xd5\x98\xe5\xe5\x63\x03\x50\x9b\x68\x16\x90\xd6\xeb\x8c\x31\xac\x44\x22\x32\xdb\x1e\x89\x71\x47\x1a\xcc\x1c\x39\x0b\x13\x73\xa6\x40\x72\xa2\xb9\x80\xb9\x78\xab\xb4\x28\x15\x52\x9d\x8a\x0d\xf9\x74\xc6\x70\xa5\x62\xad\x34\x9b\xe3\x98\xa4\xbe\x2c\xa2\xc7\x9e\x2b\x2a\x30\x12\x07\x79\x07\x52\x9a\xc7\xad\xf5\x9a\x77\x79\x21\xbd\x2f\xf1\x2e\xd7\xe8\xfd\x81\xbd\xfb\xb5\x88\xfc\xa3\xd1\xfb\x6c\xd1\x45\xea\x39\x7e\xb2\x8b\x03\xbc\x0f\xf6\xf6\x83\xcb\xff\x5b\xd2\xbb\x5d\x5d\xfc\x4f\x18\xcf\x9a\x0e\xcb\xe6\x89\x32\x85\x5d\x39\x45\x68\x37\x95\x6e\xe6\x4c\x46\x6f\x24\xca\x05\x23\x57\x4c\x08\x5c\x5d\x23\xf5\x45\xce\x8d\xa7\xa0\x5b\xb1\xec\x52\xb4\xb3\xe4\x9c\x55\x3b\x61\xdb\xd9\x8e\x20\x71\x8b\xee\x20\x3e\x74\x46\xaa\x91\x5b\x48\x20\x03\x21\xb2\xe5\xd8\xe2\xd5\x51\x13\x0b\x0c\x50\x08\xe6\x80\x00\x79\x16\xa9\x90\x68\x3c\xe4\x54\x82\x75\x45\xa0\x45\x0e\xb3\x40\xe5\x35\x82\x75\x02\x04\x95\xd0\x0a\xcf\x68\x0c\x61\x04\x9e\xd1\x09\x26\x9c\xa0\x29\x9b\xa8\x09\x5f\x17\x35\xe1\x95\xa8\xc9\xd0\xbc\x40\x9f\x7f\xa9\xd3\xbe\xf5\xa8\x92\xfb\xd9\xa8\x19\xde\xf6\xbb\x37\x6a\xc6\x42\x5a\x1c\xd8\x81\x3c\xed\x25\x03\xf5\x0e\x32\x4c\xcf\x61\x8c\x44\x6a\x16\xb2\x9b\xab\xf4\x38\x52\x21\x5a\xb9\x5d\x59\xb8\x72\xb4\x81\x74\x87\xb4\x86\xd9\x7a\x55\x8c\x15\xc5\xa9\x35\xb7\x60\xb3\x51\x5a\x6b\x2a\xdd\x80\xe5\x44\x25\xbe\x72\xec\x7c\x5c\x5a\x0c\x40\x7e\x9c\x63\x8d\xd2\xd8\xea\x4f\xd5\xb5\x0e\xaa\x9d\xd4\xcb\x22\xe5\x73\xe7\xdd\x86\x2a\x1d\xc3\x0b\xc8\xe8\xf1\xc8\x73\xfa\x8a\xbd\x98\xde\xd7\x45\xf6\x0b\xf4\xfe\xe0\x9e\xfa\xcc\x25\xff\xa8\xf4\x9e\xf5\xd4\x21\x59\x27\x9f\xa3\x3d\xdf\x08\xc1\xfb\x17\xc9\xfa\x5b\xd2\xbb\x8b\x8a\xd5\xd2\x40\x88\xf4\xdb\xf3\xd1\x24\x8a\x93\xea\x80\x9f\x8f\xd2\x56\x1d\xd0\x85\x7c\xac\x0c\xca\x6d\xc8\x9a\xf6\xaa\x41\xeb\x52\x5d\xcf\x4d\x04\x3e\x62\x36\x13\x2e\xdb\x2e\x26\x4b\xc3\x05\x2d\xb9\x53\x18\x5f\xf4\x0b\x19\xad\xc6\x1b\x1e\x37\x9c\x4c\xb8\x9c\x55\x60\x51\xa3\x15\x7b\xfd\x99\x39\xad\x28\x0c\x54\x14\x15\x0a\xaa\x0a\x54\x86\x81\x0c\x62\x55\x02\x44\x1d\x71\x3a\x12\x20\x54\x38\xc2\xab\x50\x04\x2c\xa3\x32\x2a\xd6\x75\x01\xd1\x82\x80\x80\x06\x04\x86\xd5\xfd\xb5\x24\xff\xba\xa8\xc8\x5f\x8b\x8a\x0c\x8d\xe8\xb3\x55\x7f\xef\xad\x47\x8f\x25\x3d\x1b\x15\x13\xa1\xe9\xbd\x23\x2a\x06\xa2\xe0\xb5\x2b\xb0\x13\x8c\xc6\x83\x54\x35\x66\x77\x09\x4b\x70\x39\x31\x95\x61\x74\xda\x94\x27\xbc\x91\x8c\xc9\xb9\xa1\xec\x74\x94\xc6\xba\x69\x3a\x9e\x03\xd5\x04\xef\x79\x16\x3d\x4b\xad\xf3\x15\xb7\x59\x30\xe5\x7e\x79\x12\x13\x99\x76\x0b\x0b\xfd\x75\xbd\xda\xa7\x4b\xab\x91\xda\x91\x45\xdb\xb3\xa5\x17\xee\x04\xc7\x9e\x3b\x03\x35\xc0\x41\xb6\xf1\x90\xac\x1e\x8c\x2e\x27\x7f\xcb\xe0\xbd\xfd\x85\xf4\xbe\x28\x7a\x5f\xa6\xf7\x87\xf6\xd0\x67\x5f\x09\x25\xff\x98\xf4\x5e\xf0\xd0\x21\x5c\xf2\x73\xb4\x17\xb8\x03\xbc\xcc\xbf\x4c\xd6\xdf\x92\xde\x5d\x34\xfc\x56\x4e\xed\xb5\xd1\x50\x44\xbc\x02\x08\x8b\x09\xcb\x0b\xb4\x8e\x55\x9e\x43\x44\xd3\x55\x95\x81\x34\x60\x18\xcc\xe8\x88\xa5\x15\x96\x57\x10\xa7\x00\x4d\xd7\x31\xd2\x45\x95\xc1\xb4\x28\x02\x88\x55\x56\x80\x6f\xfe\x8f\xb3\xbe\x2a\x1a\x72\xd7\xa2\x21\xcb\x83\x0b\xef\x33\xdd\xb7\x1e\x3d\x5b\xfb\x6c\x34\x0c\x47\xb3\xdb\xa2\xe1\x59\x4d\xfe\x70\x05\xd6\x84\x52\xbe\x61\x65\xb4\x56\x7b\x98\xc8\x25\x0d\x53\x8c\xb0\x89\xb2\x9a\x59\x79\x5a\x41\xb5\xa3\xb1\x42\xcb\x72\xa6\xab\x39\x4a\xab\xd1\x44\xc5\x4d\x49\xa5\x7c\xba\xaa\x0d\x34\xa9\x99\x8f\xba\xcd\xda\xb2\x25\x64\xea\xeb\xc9\xb2\xc3\x2a\x73\x00\xca\x89\xa6\xe9\x44\x1b\x7c\x42\x73\xfa\xb1\x97\x45\xc1\x40\xa7\x07\xa2\xca\xb0\x74\x90\x69\x38\x63\x78\xe8\x91\xac\xab\x51\xf0\x75\xf4\x3e\x1b\xb5\x6f\xa2\xf7\xc7\xf4\xcc\x47\x63\x4f\x5c\xf2\x0f\x46\xef\x75\xcf\x1c\x92\x75\xe2\x39\xda\x4b\xea\x01\x9e\xfc\x2f\x93\xf5\xb7\xa4\x77\x17\x05\xe3\x20\xbb\x4a\x37\x4d\x6e\xb1\x1a\x74\x26\x7a\xd9\x5b\xac\xd9\x78\xc1\x69\xd7\xd3\xb9\xf2\xa2\x9e\x9c\x40\xe8\x3a\xd1\x2a\x5b\x5e\xd0\xf9\x58\x3f\x61\x2c\xe9\x76\xa7\x5d\x49\xd6\xa2\x42\xb2\xe1\x36\x67\x2b\x59\x84\x6a\xab\xc8\x08\x48\xab\x2f\x40\x17\x47\x41\xa9\xc2\x62\xee\xf5\x8f\x82\xa9\x02\xd4\x45\x8e\xd5\x34\x06\x11\xc4\x28\x58\x55\x74\x06\x40\x1e\x69\x3c\xcd\xf1\x1c\xa6\x39\x96\x60\x02\x31\x4f\x74\x11\x10\x86\x88\x9a\x8a\x04\x85\x26\x34\xcd\x6b\x2c\x8d\x20\xf3\xb6\xfd\xa9\xe1\x17\x45\x41\xf6\x5a\x14\xe4\x44\xe1\xc2\xab\x8c\xf7\xad\x47\x2f\x86\x78\x36\x0a\x5e\xd8\xf9\x0c\xe4\xf9\x0f\x55\x50\x84\xe1\xdd\x74\x05\xa2\x66\x5c\x14\x56\x59\x33\xc7\xaf\xdb\x8b\xd9\xc8\x54\xcb\xcb\xc1\xb8\xec\xa1\x74\x0c\x75\x4a\x4a\x84\x4e\xa7\xd5\x22\x53\xf3\x48\xad\x99\x77\x87\xd6\x0a\xeb\xc5\x59\x94\x87\x74\x61\x28\x46\x2b\xd9\xb5\x5e\xb3\x72\x63\x16\x3b\xd5\x66\xd6\x4b\xf7\x93\x7d\x5c\x4b\x66\x8d\xd5\xa2\x6a\x27\x5f\x15\x35\xa5\xe7\xce\xf0\x86\xd6\x61\x0e\xce\x5c\x57\xa2\xca\xeb\xf0\x9f\x99\xa3\x9b\xa3\xda\xb7\xf1\xb4\xc1\xeb\xb2\xe7\xfc\x97\x78\xfa\x93\x51\x2a\xfe\x1c\xed\x3b\x44\x67\x77\x1b\xbf\xa7\xec\xee\xc1\xbf\x8b\x22\xf3\x92\x68\x74\x6b\x33\x15\x88\xf9\x49\xb6\x9d\x10\x3b\xdd\xa1\xa0\x57\x17\x7a\x2b\x31\x8e\x7a\xb1\x25\x9b\xd0\x46\x4e\x7b\x64\xd6\x84\x0c\x2f\x8e\xad\xb5\x32\x8f\x10\x2f\x91\x89\x96\xe9\xb8\xca\xd2\x93\xd5\xc4\x63\xa6\x74\xb3\xa6\x54\xb9\x58\x27\x35\x1a\xd4\x3a\xae\x2b\xe3\xd7\xd7\xa4\x2a\x0c\x66\x18\x41\x65\x91\x0a\x39\xcc\x71\xba\x2a\x60\x45\xe3\x54\x04\x45\x80\x38\x1e\xea\x34\x8b\x10\xa2\xa1\x06\x18\x95\x13\xa0\x26\xd0\x0a\x47\x33\x8a\xae\x29\x0c\x82\x1a\xc4\xec\xf6\x1d\xe3\xe0\x99\xb7\x69\x6d\x7f\x24\xe2\x62\xf0\xe0\x11\xa4\xcf\xff\xa2\xd6\xbe\x35\xf8\x0a\x9f\xad\x2e\xa6\xf2\x62\xba\x32\xaf\x8c\x94\x1c\x93\x96\xd8\x56\x73\x58\x75\x72\xe3\x61\x9b\xa6\xf5\x94\xe8\xe6\x33\xc2\x98\x96\xab\x8b\x6c\x2b\x2a\xb5\x59\xe9\x3d\x76\xf8\xd7\x85\xd8\xb1\xbd\x1e\xf0\x4b\xc1\x77\x6f\xc7\x9a\xf3\x45\x12\x6d\x9a\xe4\x84\xc7\xe6\x16\x63\x5c\x9e\x95\xb5\x64\xad\xb1\xd4\xa4\x24\x51\x60\xa9\x42\xbc\x55\x25\x97\x69\xe1\xb5\xa9\xd4\x0a\x85\xc1\x38\x9d\x2b\xe6\x13\x9c\x3b\x1d\xc8\xd3\x46\x57\xad\x94\x69\x33\xd2\x8e\x96\x26\x11\xdb\x6d\x8d\x8b\x30\x92\x6c\x74\x14\x77\x2d\xf0\x15\x66\x98\xe2\xe6\x85\xc2\x0d\xb1\xe0\x48\x69\x8f\x63\x41\x80\x67\x9f\xfc\xb0\x3d\xc7\x8c\x68\x8c\xce\xd3\xd9\xd4\xca\x1b\x2c\x8a\xc0\xec\xd0\x78\x35\xb1\x01\x2a\xa6\x97\xf3\x7c\x7c\x55\xe2\xbd\x98\xac\xc6\xb7\x3c\xb2\x7d\xcf\x29\x59\x9d\xa8\xc8\x1d\xc6\x9f\x89\x0d\x97\xed\xf9\x09\xfc\xc9\x7a\x2b\xe6\x3e\x81\x5f\x92\xfe\x39\x7f\x76\xd2\xb7\xc6\x1e\x97\x45\xc9\xea\x5e\x64\xf3\x9a\x2c\x9e\x9d\x8b\x8d\x2e\x44\xd4\x10\xbc\xbb\x64\xf1\x3f\x41\x5b\xb9\xd9\xf1\x50\x18\xb2\xd5\x86\x59\x68\x57\x62\xed\x71\x64\x38\x4a\x3b\xea\x28\x6e\x24\xc7\x2e\xdf\xa2\x87\x89\x4c\x77\xb0\x1a\xd6\x16\x91\x7c\xce\xae\xe6\xcc\x54\x5b\x4e\xa0\xac\x6e\x46\xd7\x53\x7d\x9a\x4f\x4e\x86\x64\x3e\x68\xa6\x52\x42\x21\x12\x69\x14\xed\xe5\x2c\xbf\x4e\x48\xaf\xf6\xad\x2c\x54\x88\x40\xeb\x8a\x20\x88\x8c\x8e\x44\x1a\xa8\x9a\x4a\x34\x15\x30\x34\x24\x0c\xd0\x11\x62\x10\xab\x22\x24\x42\x1a\x03\x9e\x70\x1c\xd0\x39\x81\x43\x02\x27\x60\x1a\xb3\x02\x56\x0e\xbf\x19\xf2\x84\x6f\x65\xae\xfb\x56\x01\x9d\x2f\x61\xd8\xb4\xbe\xff\xc6\xc8\xee\x65\x64\xcf\xfa\xd6\x0b\xbb\x53\xdb\xeb\xce\x9d\x8a\x0b\xbe\x55\x62\x97\x2d\x65\x59\x2e\x29\x56\xb7\x60\xc4\x52\xc9\x5c\x3e\x5b\x99\xe9\xd9\x7c\x7f\x56\x77\xd3\xd9\xe5\x4a\x72\xcb\x65\x3e\x89\xba\x43\x1e\x02\xdc\xb6\xe6\xc5\x68\xba\x59\xcd\x2a\x49\x57\x56\x0d\x2f\xa5\xf4\x0d\xa4\xb5\x9a\x5a\xae\xda\x99\x8f\x9b\xad\xb8\xb1\xce\x68\xe3\x7c\x26\xf1\x63\xf9\xd6\x67\x7d\xdb\x93\xf6\x3c\x15\xa2\xf5\x84\xfa\x42\xdf\x7a\x6f\x5e\xfa\x72\xdf\xfa\x0f\xf9\x36\xe9\x45\xbe\xf5\xd1\x38\xbb\xf3\xad\x45\xb1\x39\x16\xeb\xeb\x31\xcf\xd4\x33\xfd\xea\xa0\x66\xac\x1a\x79\x6b\x55\xe3\xf2\x23\x21\xb6\x52\xd5\x7e\x3e\xb1\x8e\x54\xf5\x56\x27\x42\xbc\x96\xc9\x0b\x6b\x7d\x09\x1a\xb5\xd6\x52\x89\xa5\x33\x4e\x75\xcc\x65\xe6\xed\xa6\xd9\xae\x8d\x5a\x79\xde\x6c\xf6\x6d\x77\x95\xee\x1a\x2b\xe9\xc6\x3a\xb1\xe3\x57\x1c\x62\xd7\x25\x5e\xcf\xf5\xb0\xe7\x06\x3f\xf7\x26\x23\xb2\xda\xbf\x2a\x30\x5e\x2a\xd6\xea\x55\x29\x53\xbc\xf6\x56\x43\x29\x5f\x97\xab\xbb\x37\x0b\x96\x8a\xf9\x4e\x10\xe2\x2f\x14\x45\x51\x52\x22\x11\x80\xf6\x01\x21\x55\xae\x66\x0a\x52\xb5\x43\xe5\xe4\x0e\xf5\xab\xa1\x7d\xa0\xb6\x6f\x3b\x93\xde\xd8\xe8\xef\xdf\x9c\x1b\xba\x7f\x11\xd5\x21\xa8\xa7\x28\x3f\x85\xf8\x2a\xf5\xfb\x48\xe6\xb3\xed\x86\x6e\xb7\xff\xf5\x54\x5b\x23\xbb\x8f\xde\x6a\xb2\xff\x68\xb8\xee\x6c\xfb\x7e\xed\xe7\xb9\x3b\x46\x7b\x8a\xb9\x87\x08\xa3\x1a\xc5\x4c\xa5\x21\x53\xbf\x1e\xba\x7f\xa6\x0e\xfd\xf7\x9f\xb7\x03\xee\x14\xcd\x6b\xa6\xf5\x6e\xc6\xef\x9a\xd4\x33\xbf\xb5\x71\xe5\xf7\x2c\x5e\xcb\xd9\x69\x24\x97\x38\xbd\x40\xd6\xcd\x9c\x9f\x7d\xd1\xea\xd5\x57\x99\xbe\x96\xfb\x73\x68\x2e\xf1\x7f\x91\xb4\xab\x12\xd8\xaa\xb4\xb2\xf2\xb5\x7d\xcf\x48\xa6\x98\x90\xdb\x57\x78\x88\x57\x65\xa9\x2e\x6f\xbb\x1e\x43\xa1\x4a\xc5\xb0\x31\x34\x6a\x99\x62\x8a\x52\x3c\x87\x90\xa0\x75\x9d\xa7\x66\x6b\x63\xcf\xd3\xb3\x85\x73\x1b\x45\x67\xec\x5a\x59\xf5\x76\xaf\x1b\x7f\x98\x9c\x03\x88\x20\x25\x47\xab\x81\x63\x7a\xb6\x9d\x3f\x53\xbb\x0f\x3d\x97\x4c\x67\xc4\x52\x3f\x0a\x4c\x59\xf5\x06\xd8\x1d\x3c\x43\xd9\x66\xfc\x6d\x64\x05\x35\x6d\x33\xea\x14\x35\xdb\x9f\x8b\x7b\x86\x9e\x2d\x84\xdb\x28\xda\xf6\x7d\x17\xcf\x67\x0a\x4f\x26\xa6\xa1\x6e\xdd\x81\xed\x68\x67\xdc\x74\x8f\x6c\x74\xc3\x6f\x7f\x80\xd2\x5d\x94\xd8\x12\x1c\x02\x17\x24\x9b\xe8\x3a\x51\xc3\xaa\xf6\xd1\x6b\x19\xda\x67\xea\x93\x3f\xf8\xd3\x39\x62\x0d\xed\x45\x64\x1a\xda\xcd\x04\xee\x55\x6f\x43\xde\x03\x44\xdb\x93\xde\xe4\x55\x74\xef\x60\x05\x49\x3f\x13\xaa\x1e\xe2\xe4\x34\x03\xde\xf2\x75\x0c\xec\x60\x9d\xd1\xe9\x07\x59\x08\x42\x38\xc5\x84\x3d\xd9\x68\xe5\xc0\x7e\x88\x87\x1d\xf1\x07\x18\x8f\x0a\xff\xb2\xa0\xdd\x9d\xb5\xfb\xae\xfa\x79\x59\x1f\x83\x0b\x92\xbc\xff\x15\xcb\x23\x1a\x4f\x53\x14\x94\xeb\xab\xc8\xfa\x00\xf3\x36\xf7\x76\x8a\x40\x6f\x3b\x25\xde\x33\xd3\x7a\x80\xf1\xb8\x4a\x5e\x53\x3f\xcf\xd1\x36\x48\x14\xec\x92\xa7\xe3\xe7\x29\x60\x21\xca\x35\x12\xa2\x33\xd8\xf7\x2a\x81\xb6\xae\x3f\x11\xb4\x3e\x82\xba\x89\x38\xbf\xe7\x25\xd2\x7c\xda\x89\xf3\x32\xf1\x85\xe0\x5d\x23\x32\xd4\xfd\x16\x4a\x5f\x23\xc7\x23\x68\xb7\x52\x79\x55\x9a\xaf\xa1\xed\x26\x9a\x2e\xd3\xb2\xa7\xd8\xb4\xed\xd1\x6c\xf2\x1c\x45\xc7\xb0\x6e\x9e\xd1\x6d\xbe\x7b\x86\xbe\x09\x36\x9c\x9e\x67\x8c\xc9\x4b\x28\x0c\x43\xbb\xcd\x6e\x77\x04\x7e\xa6\xc2\x24\x7f\xa6\x76\x2e\x5e\x35\x6d\x97\x68\x3d\xec\x9d\x61\xe2\x05\x7e\x7b\x07\xe7\x1a\xc5\x77\x66\x47\x1b\xa8\x2f\x93\xee\x1d\x82\xbd\x2a\x37\xc3\xd2\xc8\xb2\x17\x4a\x39\xdc\x9e\x6d\xf5\xb0\xa6\x39\xc4\x75\x9f\x15\xe8\x55\x04\x47\xeb\xb4\x5d\x73\x68\x65\xb4\xed\x78\x07\xed\xcf\xeb\xc1\x25\xd8\xd7\x29\x3e\x61\x65\xc7\x00\x77\x59\xf8\x06\x9e\xb7\x9a\x3c\xbe\x06\xbf\x08\xf5\x6a\xda\xbf\xe9\x74\x85\xd0\x5d\x0e\xb5\x01\xf9\xae\x44\x2f\xa2\xf6\x14\xe8\xab\xe9\xdb\xad\x9a\x1c\x00\xfe\x6a\x65\x38\x02\xfd\x48\xbe\x79\x1e\xdc\x78\x62\x3b\x1b\xc7\x37\x27\x8e\x6b\xd8\xd6\xeb\x05\x1d\xc6\x70\x9d\xfc\xd0\x80\xdb\x99\xd9\xb9\x9e\x07\x77\x2a\x6e\x93\x7f\x00\xc7\x55\x4e\x02\x7d\x6f\x67\x62\xe2\x90\xb9\x61\xcf\xdc\xef\xc2\xcd\x29\x64\x57\xd9\x3a\x35\xe8\x76\xfe\xf6\x9b\x28\xdf\x8c\xa7\x3d\x82\xab\x7c\x9c\xdd\xed\x3a\x06\x7d\xf8\xf9\xc1\x6f\x61\xda\x61\xe8\x27\x17\xc0\xf7\x1a\xf8\x31\xd0\xe3\x25\xd4\x8b\x2c\xfc\x12\x8a\x5b\x78\xb8\xb2\xae\xbb\x88\xec\x75\xe1\xeb\x23\xe0\x9b\x68\xbf\x1e\xc4\x82\x8b\xed\x6f\xa1\x36\x1f\xe1\x3f\xbc\xd4\xf7\x93\xb8\xf7\x40\xbe\xdf\x61\xec\x29\xb6\x3d\x7a\x58\xca\x17\x60\x5e\x4d\x11\x7e\xfd\x55\x23\x1e\x36\x4c\x97\xfa\xf2\xdf\xff\x52\x6f\xae\x6d\x6a\x81\xd3\xb4\xb7\xaf\x5f\x3d\xb2\xf4\x7e\xfb\xed\x33\x75\xbe\xa3\x6a\x6b\xb7\x75\xdc\xee\xc5\x9f\xef\xaa\xd8\xb3\xfe\xc0\xbb\x09\xfd\x51\xd7\xcb\x04\x1c\x75\x0d\x91\xf0\x1b\xd5\x4a\xcb\x55\x79\xab\x64\xd4\x9f\x14\xfb\xf1\xb7\xf6\xce\x1d\x44\x1b\x5a\x4f\x0f\x1c\x13\x25\x73\xdf\xe7\x38\x7a\x87\x96\x4a\x96\xaa\x72\x26\x55\x7c\x3f\x02\xa2\xaa\x72\x52\xae\xca\xc5\xb8\x5c\x0b\x9d\x8a\xf8\xad\xa5\x22\xd5\x28\x27\x36\x2a\x53\x95\x6b\xf5\x6a\x26\x5e\xdf\x7c\x95\x90\xf3\x72\x5d\xa6\xe2\x52\x2d\x2e\x25\xe4\x0b\xe7\x68\x9b\x75\xc7\xf1\x6d\x2f\xb4\x15\xf3\x3a\x61\x1c\xe3\xb9\x72\x48\x76\x8e\x92\x63\xf9\x84\xb7\x8d\x4e\x0a\x6b\x97\xe8\x5f\x39\x51\x3c\x2b\x89\xdd\x52\xf6\x1f\x97\x43\x90\x8e\x53\x52\xd8\xef\x12\x5c\x56\x98\xfb\x24\xf0\x71\x53\xe9\x1f\x14\xc3\x19\x62\x8e\x65\x71\x62\x1b\xec\xb5\x4a\x11\xde\xe2\xf8\x11\x04\x72\x5e\x35\x3e\xec\x21\xdd\xaa\x1d\x65\xdb\xf5\xfa\x0e\xa9\x55\xf2\x94\x86\x3d\xbc\x51\x31\x4a\x9b\x8d\x27\x94\x6a\x8f\x27\x26\xf1\x88\xcf\xc3\xff\x17\x00\x00\xff\xff\x1c\xf6\x5b\xce\x0e\xf7\x00\x00") - -func set_optionsHorizonSqlBytes() ([]byte, error) { - return bindataRead( - _set_optionsHorizonSql, - "set_options-horizon.sql", - ) -} - -func set_optionsHorizonSql() (*asset, error) { - bytes, err := set_optionsHorizonSqlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "set_options-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0xbe, 0xeb, 0x77, 0xf6, 0xc, 0x4c, 0x7b, 0x2d, 0x28, 0x31, 0x9f, 0xc2, 0xf1, 0x51, 0xab, 0x3d, 0xec, 0xc, 0x49, 0xb7, 0x95, 0x9d, 0x4d, 0x2, 0xec, 0x27, 0xd3, 0xb2, 0xaf, 0x6, 0xd4}} - return a, nil -} - var _tradesCoreSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x69\x93\xea\x38\xf2\x37\x0c\xbf\xef\x4f\x41\xf4\x9b\xd3\x13\x9c\x19\x64\xd9\x96\xe4\xe9\xa7\xff\x11\xc6\x6c\x66\x31\xfb\xfa\xc4\x1d\x1d\xb2\x24\x1b\xb3\xd8\x60\x9b\xf5\x8e\xeb\xbb\xdf\xc1\x52\x05\x45\x51\x1b\x70\xfa\xf4\xff\x9a\x71\x74\xd7\x01\x9c\xce\x4c\xfd\x94\x99\x4a\xad\xfe\xe7\x3f\x7f\xf9\xe7\x3f\x13\xb5\x20\x8a\xdd\x50\x34\xeb\xe5\x04\xa7\x31\xb5\x69\x24\x12\x7c\x31\x9d\xfd\xf2\xcf\x7f\xfe\xb2\xbb\x9f\x59\x4c\x67\x82\x27\x9c\x30\x98\x9e\x08\x96\x22\x8c\xbc\xc0\x4f\x68\xff\x42\xff\x92\xce\xa8\xec\x4d\x62\xe6\xfe\xb9\x7b\xfc\x82\xe4\x97\x66\xb6\x95\x88\x62\x1a\x8b\xa9\xf0\xe3\x3f\x63\x6f\x2a\x82\x45\x9c\xf8\x23\x01\x7e\xdf\xdf\x9a\x04\x6c\xfc\xfa\x57\x8f\x4f\xc4\x9f\x9e\xff\x67\x1c\x52\x3f\xa2\x2c\xf6\x02\xff\xcf\x48\x44\x3b\xbe\xaf\x89\xd9\xc4\xdb\xb1\x16\x3e\x0b\xb8\xe7\xbb\x89\x3f\x12\xdf\xda\xad\x1c\xf9\xf6\xfb\x93\x6c\x9f\xd3\x90\xff\xc9\x02\xdf\x09\xc2\xa9\xe7\xbb\x7f\x46\x71\xe8\xf9\x6e\x94\xf8\x23\x11\xf8\x47\x1e\x43\xc1\xc6\x7f\x3a\x0b\xff\x20\xcb\x0e\xb8\x27\x76\xf7\x1d\x3a\x89\xc4\x0b\x31\x53\xcf\xff\x73\x2a\xa2\x88\xba\x7b\x82\x15\x0d\x7d\xcf\x77\x0f\x24\x61\xb0\xfa\x33\x12\x6c\x11\x7a\xf1\x66\xc7\xdc\x71\x7e\x3f\x02\x20\x68\xc8\x86\x7f\xce\x68\x3c\x4c\xfc\x91\x98\x2d\xec\x89\xc7\xbe\xef\x10\x63\x34\xa6\x93\xc0\xfd\xfd\x97\x5f\x32\x8d\x6a\x2d\x61\x5a\x99\x6c\x2f\x61\xe6\x12\xd9\x9e\xd9\x6c\x35\x8f\x94\xff\x5a\xcc\xdc\x90\x72\x31\xf4\xa2\xd8\xde\x44\x62\xfe\xfb\xbb\xd4\x11\x9b\xcd\x17\x41\xb8\x98\x46\x9f\x23\x16\xfe\xf2\x33\x94\x13\xc1\x5d\x11\x7e\x86\x72\xa7\xa7\x23\xc4\x27\x29\x3f\x41\x66\x8b\x28\x0e\x1c\x47\x84\x9e\xcf\xc5\xfa\x7d\x5a\xca\x58\xb0\xf0\x63\x9b\x4e\xa8\xcf\x44\xf4\xfb\x2f\x7a\xb9\x95\x6d\x24\x5a\x7a\xba\x9c\x3d\xa3\xae\x5a\xe5\xfe\x15\x78\x83\x70\x93\xd8\x73\x37\xaa\x56\xb3\xd5\xd0\x4d\xab\x75\xf6\xd0\x4b\xc2\x3f\x67\x63\xb1\xf9\x0c\xff\x78\xfd\x31\xeb\x67\x9a\x2f\x70\x75\xc4\x27\x74\x3e\x27\xfb\x3c\xef\x70\x11\xc5\x13\xcf\x17\xd1\x7b\x9c\x9f\x89\x3e\xcd\x77\xa7\x85\xd8\x47\x83\x77\xf8\x9e\x88\x3e\xcf\xf7\xd9\xe4\xdf\xe3\xfb\x4c\xf4\x69\xbe\x07\x7a\xcf\x77\x82\x77\xf8\x9e\x88\x3e\xcd\x77\xb6\xb0\xa3\x85\xfd\x0e\xcf\x03\xc1\x57\xf8\x4d\xbc\x68\x38\x5f\x88\xc5\x7b\xc8\x9e\x93\x7d\x9e\xb7\x10\xe1\x7b\xb0\xee\xef\x7f\x9a\xdb\xde\x8d\xdf\x63\x77\x20\xf8\x34\xbf\x43\x54\x1a\x0a\xca\xdf\x67\xfb\x82\xee\x07\x73\x3f\x46\x4a\x31\xff\xf3\x93\x62\x6c\xea\xbf\xc3\xdc\xa6\xfe\xa7\x15\x3e\x46\xbf\xf7\x74\x7d\x22\xf9\x2a\xcf\x5d\x0e\xf0\x31\xdb\x1d\xd5\x91\xf3\x9e\xf6\x92\xf1\xd5\x90\xfb\x3e\xed\x73\x68\xfc\x88\xec\x14\xe8\x3e\xa0\x7c\x0e\x5c\xef\xd3\x9d\x02\xd1\x07\x74\xcf\x81\xe5\x43\xba\x4f\xe9\x77\x0a\x28\xef\xd3\x1d\x82\xc4\x87\x34\xcf\x2e\xff\x01\xe5\xce\x8f\xdf\x27\x39\xf8\xe6\xfb\x34\x2f\x5c\xe1\x7d\x52\x9b\xfa\xef\x13\x3c\x99\xea\xa7\xa8\x76\x96\x77\x24\xcc\xf6\x5a\x59\xab\x69\x56\xad\x73\xe2\xc9\xcc\x8d\xe6\x93\x23\x45\xd3\x28\x64\x2b\xfa\x2b\x5e\xbf\xff\x72\xc8\x8d\x2d\x3a\x15\xff\x7e\xfa\x2d\xd1\xda\xcc\xc4\xbf\x8f\x8f\xfc\x9e\x68\xb2\xa1\x98\xd2\x7f\x27\xfe\xf9\x7b\xa2\xba\xf2\x45\xf8\xef\xc4\x3f\xf7\x29\xb3\xd1\xc8\xea\xad\xec\x13\xe7\x27\x7e\xbf\xbc\xe0\xf8\xf2\xe6\x91\xb1\x51\xad\x54\xb2\x56\xeb\x1d\xce\x07\x82\x44\xd5\x7a\xc9\x20\x61\x36\x13\xdf\x9e\xf2\xdb\xa7\xdf\xa2\x3d\x93\x6f\x97\x92\x9f\x8a\x7f\x94\xf9\x8c\xd0\x87\xe5\x79\x81\xa5\x55\x6d\x5d\xe0\x99\xe8\x9a\xad\xc2\xb3\x5a\xe7\x09\xed\x0b\xf1\x27\x2e\x17\x8a\x7c\xa5\xf0\xaf\x98\xec\x01\xa8\x95\x53\x33\x77\xd7\x8b\x99\x85\x01\x13\x7c\x11\xd2\x49\x62\x42\x7d\x77\x41\x5d\xb1\x87\xe1\x93\x09\xf8\x8e\x8c\x0b\x87\x2e\x26\xf1\x9f\x31\xb5\x27\x22\x9a\x51\x26\x76\xbd\x89\x6f\x17\x77\x57\x5e\x3c\xfc\x33\xf0\xf8\x59\x07\xe1\x45\x61\xcf\x0d\xf2\x58\xcc\xbd\xe9\x9e\x0a\xf9\x64\x00\xd7\x00\x3f\x58\xf9\x79\xd0\xfd\xed\x97\x44\x22\xf1\xf4\x8b\xc7\x13\x6c\x48\x43\xca\x62\x11\x26\x96\x34\xdc\x78\xbe\xfb\x9b\x8a\xfe\xb1\xaf\x1b\xab\x5d\x2e\x7f\xdf\x53\xef\x1e\xf4\xe9\x54\x5c\x21\x26\xe4\x1a\xf1\x92\x4e\x16\xd7\xa8\x25\x09\x5e\x92\x4f\x68\x14\x4f\x03\xee\x39\x9e\xe0\x09\xcf\x8f\x85\x2b\xc2\x67\x92\x5f\xfe\x71\x59\xf7\xcf\x5e\x7c\x27\x16\xd1\x4d\x40\x1c\x3b\x02\x09\xdb\x73\x3d\x3f\xbe\xb8\x19\x89\xb9\xbf\x98\x5e\xbf\xe7\x2f\xa6\xd1\xc2\x16\x7e\x1c\xee\xba\x82\x97\xc5\x3c\xd0\x78\xbe\x33\xa1\xbb\x1e\x23\x17\x51\x7c\x5d\x9d\x03\xe1\x30\x98\x0a\x1e\x4c\xa9\xe7\x5f\xa1\x52\x94\x4b\xa5\xe3\x61\x28\xa2\x61\x30\xe1\x51\x22\x16\xeb\x4b\xcd\x9c\x09\x75\xdf\xd2\xe8\xdd\xba\x39\x22\xb2\xd8\x49\x9d\x78\xd4\xf6\x26\x5e\xbc\x2b\xdc\xa1\xfc\x4f\x90\x4c\x26\xef\xdd\xf6\x5c\x7f\x97\x0b\xed\xd4\x3a\xfc\x72\x96\x0d\x3c\xa7\x16\x47\xd0\xff\xdc\x77\xab\x13\x46\x21\x6b\x94\x12\xbf\xfd\xf6\x54\x15\xff\xf3\x47\x02\xfc\xe3\x1f\xef\x3c\x7d\xa9\xe0\x25\x9f\x57\x05\xf8\x88\xe3\x8b\xba\xbc\xe0\xf6\xb2\x9e\x3f\xe2\xf4\x1a\x9e\x0b\x76\x57\xf0\x3b\xf0\x7c\xed\x18\xbb\xf6\xef\x56\x9f\xd8\xa5\x8c\x07\x77\xf0\x03\x2e\xce\x7d\xe1\x85\x0f\xbc\x16\xfa\xb2\x7d\xbe\x55\xfc\xcb\xc4\xf8\xa0\xc8\xf1\x37\x1a\x0d\xcf\x94\x41\xaf\x6c\x7b\x16\x8a\xe5\x87\x44\xf6\x82\x8d\x45\x3c\xf1\xa2\xf8\x43\xd2\xe7\x6c\xfb\xc9\xdc\x0f\x3f\xb3\x49\x10\x89\xd8\x9b\xbe\xe1\xf9\xfb\xc0\x7a\xc5\xb7\xce\xea\xfc\x65\x52\xff\xcc\xef\xa2\xbe\x4f\x72\xde\x30\x9d\xb7\xfa\x06\x2f\xd9\x9c\x4a\xf1\x96\xb5\x1c\x93\xaf\x5b\x6b\xec\xd8\xf1\xfa\xed\xd9\xc9\x45\xf8\xc9\x08\x7a\x18\x79\xe1\x6f\x45\xd0\xbd\xb9\xd3\x28\x12\xf1\x35\x3c\x0f\xbe\xfa\xe6\x6d\x3a\xdd\xb9\xd5\x75\xd6\xb3\xd0\x63\xc2\x7f\x23\x88\xed\x6f\xbe\x15\xe1\xf6\x37\x13\x3c\x58\xd8\x13\xb1\xb3\x37\xe6\xed\x47\x24\x1f\x1a\x45\xcf\x6a\xf8\xd8\x65\x3d\x94\xe5\xa2\x5e\x8f\x05\x7c\xc3\x36\x8e\x4f\x1e\x11\xbe\x78\xf4\x09\xf7\xb7\x0c\xe2\x90\xb0\xdf\x6a\x0f\x87\x6e\xfd\xc1\x1c\xbc\xd9\xb5\x86\x5f\x7d\xe5\xb9\x41\x18\x3f\xa3\x91\xc9\xe6\xf4\x76\xb9\x95\x00\x97\xcd\xa6\x58\xc7\x34\x8e\xc5\x74\x16\x27\x76\x6e\x11\xc5\x74\x3a\x4b\xec\x52\xa6\x60\x71\xf8\x25\xb1\x0d\x7c\xf1\xba\xb1\x75\xa8\x37\x59\x84\x67\x4d\xed\x5b\x12\xe2\xcd\x4c\x7c\x5c\x29\x87\x61\x89\x33\xbe\xaf\xc3\xfe\xb3\xc4\x37\x6a\xe7\x38\xb2\x11\x84\x97\x95\xfa\xdb\x1e\x89\xff\x49\x80\x7f\x24\x74\x2b\x93\x38\x7c\xfd\xff\xfd\x91\x40\xaa\x2a\xab\xff\xb8\x5a\x57\xe7\xdd\xb0\x9b\xab\xec\x7c\x94\xe7\x3c\xe6\xbe\x81\xc6\x61\xa0\x6d\xe7\x75\x57\x15\xda\xf5\x1d\xef\x50\x25\x5a\xd8\x47\x25\x42\x11\xbd\x68\x80\xe4\xab\x19\x63\x28\xe8\xb3\x2f\xbd\xd6\xe7\xac\xcf\x7b\xab\x4e\x67\x83\x75\x9f\x68\x19\x0f\x8a\xcd\x23\xf1\x5e\x0b\xf3\x5a\xcf\xb3\x3e\xfc\xad\x7a\x9e\x58\x7c\x5e\xcf\x57\x8d\xdc\xc5\x7d\xe1\x2f\xc5\x24\x98\x89\x0f\x9a\xb4\x93\xe8\x3b\x1a\xa2\xb3\xe1\x8e\x3b\x20\x78\x1a\xaf\xfd\xed\x33\xf5\x70\xb2\xa2\x8f\x80\x98\xbf\xd1\xd0\xbc\x04\xe1\x69\x1c\xf8\x05\xc7\x4b\x20\x5e\x48\x7b\x13\x8c\xd3\x18\xd1\xcd\x60\x9c\x06\xc5\x7f\x3b\xf9\xed\xcb\xce\xdb\x15\x9f\x7a\xcf\xbb\xcf\x46\xb8\x6e\xd5\xea\x6c\x0a\xe0\x96\x6e\xd7\xbe\xc5\x7f\x27\x52\x7b\x51\xb4\x10\xe1\xe7\x59\xb1\x80\x5f\xed\x9d\xbe\x82\x25\x9e\x78\x53\xef\x8d\x8c\xe2\xdd\xbe\xe0\xcf\xec\x55\x9d\x59\xe7\xd9\xac\xca\x4d\xbd\xa8\xf3\xe7\x1f\xd5\x8f\x3a\xe3\x79\x7b\xff\xe7\x3d\xae\x87\x4a\xbb\xe0\x74\xac\xc9\xff\xb9\xee\x78\x2f\x86\x7b\x6f\x36\xf2\xf3\x39\xb4\x83\x99\xc7\xeb\x17\xa1\xf8\x13\xfd\x8d\x4b\x03\x5c\xef\x67\x29\xdf\xbc\xcb\x86\xd4\x77\xc5\xd5\x8e\xfd\x39\x38\xe7\xd3\x76\xb7\xc7\xea\xd3\xd8\xf9\xed\x10\xfd\xc5\xf8\xd8\x01\xdf\x5c\x03\x27\x5e\x87\x22\x5a\x4c\xae\x46\xf7\x78\x3d\x15\x1f\xf6\xe7\x4e\x53\xac\xb7\xe3\x79\x31\x6f\x71\x2b\xa8\x17\x33\xce\xbf\x7d\x0a\xb8\xe3\x43\xef\xa1\x77\x24\xb9\x06\xc4\xe7\xcc\xee\x62\x86\xfb\x16\xa0\x32\xbb\x9e\xb5\x13\x84\x1f\x0c\x86\x26\x32\x7a\x4b\xff\x00\xb3\xf7\x59\x46\x5f\xe6\x67\x5a\xcd\x6c\xa3\x95\x30\xad\x56\xf5\x34\xa8\xd8\xd1\xcb\xed\x6c\x33\xf1\xdb\xb7\x7c\xba\x51\xeb\x17\xcc\x32\x34\x4c\x39\x67\xd5\x95\x74\xaf\x9c\xab\x58\x99\x72\xae\xd8\xb6\x6a\x6d\x58\xe8\xcb\x83\x4a\xae\x59\xa8\x5a\x6d\x23\x5b\xd5\x9b\x5d\x5c\x37\x70\xb5\x07\x0b\xdf\xbe\x27\xb4\xe3\xa5\x1e\xfe\x41\x00\x7c\x4f\x28\xdf\x13\xe0\xfb\x01\xe5\xc4\xb7\x6f\xdf\x13\xdf\xf4\xba\xae\xeb\xfa\x1f\x7f\x7c\xdb\xdf\x80\x4f\xf7\x4e\x7f\xff\xf1\xfb\x47\x1a\x1a\x50\xae\xe7\x60\xa1\x9d\x55\xa1\x5e\xe9\xb5\x73\xed\x82\xac\xf7\x8b\x7a\xaf\x97\xef\xf5\x3a\xb0\x53\xe8\xf5\xfb\x0d\x94\xed\xf7\xb2\xad\x5a\x29\xd3\x1b\x34\xf5\x2e\xc2\xbd\xaa\x72\xd2\x70\xa7\x18\x51\x89\xa6\xc9\x8a\xaa\xc9\xef\x6b\xa8\xdc\xa4\x61\xbd\xd6\xcf\x17\x94\x92\x8a\x7b\xe9\x4c\xd6\x2a\x95\x7a\xaa\x5a\xca\xb4\xba\xd5\x56\x49\xed\x66\xba\x8d\x7a\xb5\x00\xcb\x85\x6c\xa6\x27\x67\x4b\x1d\xb3\xde\x28\x57\xb2\xcd\x7c\x3a\x7f\x9b\x86\xea\x2d\x1a\xea\x6a\x37\x5d\xeb\xeb\x6a\x5f\xe9\xea\xd9\x42\xaf\xdb\x80\xed\x52\x15\xb6\xab\x4a\xba\x9d\x2f\xb4\xeb\x58\xc9\xb6\x6b\xa5\xaa\x05\xeb\x85\x8e\xd2\x6d\x14\xaa\x66\xc3\x2a\x95\x0a\xf0\x59\x43\xf5\x85\x86\xf8\x4c\x8b\x2b\x1a\x92\x9b\x30\xec\x95\xf2\xa8\x61\x29\x55\xcb\xcc\xd6\x8c\x8a\x95\x4b\x63\x19\xea\x8a\x8c\x06\x6a\xcd\xca\x34\x1b\xe5\x7c\xb7\x84\xf3\xe9\xb2\x51\xa9\x97\xcd\x5c\x55\x69\xe2\x6c\xbf\xdb\x69\xbf\xad\xa1\xfc\x8e\x86\x92\xf4\x3d\xa1\x82\xe3\xf5\x0c\xf7\xdb\xfe\x7c\x39\x68\x79\x87\x1f\xbf\x3d\x14\xf9\x55\x67\x7e\x39\x1c\xf9\x8c\x24\x92\xb9\x46\x1c\x55\x46\x42\x20\xc2\x25\x1b\x62\x5b\xb5\x89\xe6\x40\x99\x3a\xaa\x2c\x49\x36\x56\x91\x46\xa1\xe2\x50\x47\x52\x80\x4c\x39\xb0\x55\x68\x23\x59\xb6\x01\xb6\x85\xa6\xed\xd0\x02\x77\x5e\x3b\x1e\x2a\x86\x14\x0a\x19\x3a\x0e\x54\x08\x05\xd8\x06\x02\x03\x87\x4b\x0e\xe2\xb2\x44\x98\xe4\x50\xc6\x21\xb0\x11\x63\x80\x30\x59\xe6\x2a\xc6\x2a\x54\x35\x82\x88\x04\x55\x2a\xa1\x6f\xdf\x13\xd2\xbe\x6a\xbe\xe9\x7f\xdb\x2b\xdd\x2b\x79\xca\x26\xb5\x69\x96\xd2\x38\xe3\x67\xb4\x02\x04\xeb\x51\x3a\x19\x01\x37\x8e\x56\xe6\x6a\x2b\xf5\x78\xb3\xdb\xa7\xe9\x22\xcd\xb9\x3b\xfa\xac\xa5\x94\xe9\x76\x06\xeb\x1f\x72\x1e\xe8\x3d\x49\xd9\x93\xa5\xc7\x7f\x41\x41\x1e\x7a\x7d\xbb\xf0\xf6\x37\x0c\x95\x09\x4e\x80\x06\x14\xdb\x61\x08\x68\x54\x76\x64\x9b\xa8\x0e\xc0\x12\xc5\x08\x22\x9b\x0a\x86\x31\x75\xa8\x50\x64\x89\x4b\xd8\x21\x50\xd6\x28\x91\x65\x1b\x63\x4c\x1c\x19\xef\x0d\xf5\x11\xc6\x4e\x05\xc4\x92\xc6\x15\x21\x54\x66\x0b\xc6\x05\x53\x35\x9b\x32\xd5\x91\x38\xe0\x90\x63\x46\x09\xb4\x35\x9b\xab\x0a\x20\x36\x93\x19\x93\x35\x47\x48\x08\x21\xa0\xca\x9a\x20\x3b\x43\x85\xdf\x13\x92\xaa\x6a\x2a\xd6\x30\x56\x8f\x16\x6b\xc0\xda\x60\x24\x59\x0b\x35\x00\x76\x11\x77\x15\x7f\x53\x5d\xb6\xd7\x79\xb9\x33\x0b\xc6\xc9\x65\x4e\xaf\xc6\x86\x54\x82\x15\x9c\xc6\x68\x30\x24\xb0\xee\x46\x0b\xbd\x39\x6d\x82\xb5\x9b\x9b\x49\xce\xc8\x6b\xc1\x95\xe5\x2e\x3b\xdd\x86\x31\x69\x76\xd5\x45\xa5\x26\x2b\x4a\xb3\x12\xec\x11\xee\xd5\x3a\x15\x67\xb5\xfb\x64\x3e\xff\x39\x44\xb8\xe8\xf4\x7d\xa5\xd7\xea\x47\xdb\x19\xe2\xb0\x50\x90\xc5\x70\xbe\x6c\x47\xdd\x6c\xcd\xd1\x27\xcb\x4e\x34\xd3\x75\x98\x1a\x34\x40\x71\x54\xd3\x73\x26\x2f\xd8\x75\x18\x35\xbd\x45\x71\xed\xb7\xf1\x64\x93\xdc\x8a\xf5\x60\x11\xf5\xd6\xc0\x2a\xf7\x36\x41\x49\x5d\x76\xea\xe6\x32\xb3\xcd\xf8\xc9\xdc\xb4\x9f\xab\x8a\xe1\xde\xa2\xcd\x2b\x16\x9d\xbf\x6a\xde\x4f\x16\x9d\x01\xc5\x1f\x68\x7b\x3f\xe6\xfa\xa4\x45\x53\x8a\x6c\xe6\x08\xa8\x28\x42\x71\x34\x40\x25\x5b\xa8\x36\xa1\x40\x02\xd8\x86\x50\x66\xd4\x26\x2a\x03\xb2\x8a\xb1\xc6\x29\x26\x94\x49\x0c\x51\xa6\x31\x6e\x13\x0d\x01\x59\xda\x59\xe3\x23\xbc\x82\x70\x45\xb1\x89\x86\x01\xd6\x10\xc1\x98\x51\x00\x90\x4a\x6d\xce\x30\x43\x44\x53\x81\x22\x4b\x44\x86\x4c\xc5\x40\xe3\x84\x39\x4c\xa3\x42\xd3\x54\x2c\x23\x4d\x55\x88\xaa\x38\xdf\xf6\xad\xe7\xb3\x45\xa3\x27\x8b\x26\xb8\x6f\xd4\x9b\xa9\xb5\x3b\x1d\x11\x3c\x74\xd2\xeb\x19\x2c\x86\x61\xc4\x51\x72\x51\x5f\x83\x5e\xd2\xa8\x52\x77\x1b\xcb\xa2\x66\xa9\xeb\x30\xd7\x6a\x56\x2b\x8e\xd2\xb5\x9b\xb3\x85\xd6\xab\x8e\x58\xd1\xf5\xca\xa3\xb0\x3d\x81\x34\x0f\x1d\x3d\xb5\x0a\x5a\xeb\x68\x11\xb2\x83\xb1\xec\x2c\xda\x3d\x43\xdc\xce\xac\x52\x6e\xad\xb5\x20\xd9\x70\xda\x33\x5a\x21\x6a\xe2\x72\x16\x59\x3d\xb8\xad\x57\x2d\xd3\x14\x70\x38\xae\x96\xb2\x25\x45\x8d\x0c\xab\x51\xf6\x7a\x69\x95\x16\x9c\x92\x9e\xef\x86\x72\x61\x1d\x4c\xea\xf5\xb5\xbb\x59\xf7\x0c\x3e\xaa\x6d\x28\x1a\x74\xb6\xb4\xd3\xcc\xb5\xf6\x1e\x53\xb9\x62\xb1\x2f\x44\x3f\x5f\xff\x01\x16\xab\x88\x5d\x40\xd3\x6c\xaa\x40\x24\xc9\x5c\x56\x25\xcc\x20\xa7\x04\xab\x44\x03\x54\x10\x49\x52\x00\x51\x6c\x0c\xa1\x8a\x39\x51\x98\xa3\x11\x46\x10\xa0\x9c\x73\x5b\x65\x74\x6f\xb1\x8f\xb0\x7a\x05\x72\xd5\x81\xc0\x41\x84\x2b\x84\x48\xd8\x56\x99\x8d\x20\xa2\x44\x22\x54\xa8\xbb\xef\x08\xd9\x8a\x4c\x30\x13\x9a\x22\xab\xaa\x2d\xa8\xc4\x80\x4d\xb0\x0c\x35\x62\x53\xf2\x6d\x9f\xb9\x3f\x5b\x2c\x7e\xb2\x58\x34\x0b\xb7\xc9\x62\x56\xad\x8d\x4b\xf9\x64\x57\x09\xd2\x69\x6c\x8e\x36\xe1\x90\xe9\x12\x57\xa1\xef\x45\x85\x7c\x58\xdc\xda\x5e\x57\x5f\x4b\x85\x0e\xe8\x2f\x57\x4d\xe1\x14\xb3\x5c\x67\xfd\x79\x66\xa6\xa4\xfb\x72\x19\x95\x5a\x5a\x9f\x87\xf2\x82\x52\x1c\x19\xa6\x1b\x74\xc1\x1e\xe1\xbd\xc5\x9e\x19\x51\x43\x4a\x0d\x8b\xa3\x94\x83\x3c\x5a\x2d\x26\x1b\x93\x32\xef\x19\x7a\x69\xd1\x75\x1a\xab\xee\x48\xb2\x26\x40\xa8\x2c\xae\x73\x34\xee\x0c\x0c\xc9\x31\x6b\xd4\x6a\x9a\x39\xdc\x2b\xf7\xa7\xf3\xb4\xb7\x68\xf7\xe2\x2e\x05\xd5\xc2\x76\x56\x97\xba\xc9\x80\x19\x0a\xdb\x4c\xcb\xf3\x3d\xe7\xfa\x15\x8b\xad\x66\xaf\xd5\xfa\x7f\x80\xc5\x6a\x82\xa8\x8c\x51\x15\x10\x45\xe6\x9a\x42\x15\xc2\x91\xa4\x00\x8d\x68\xbb\x66\xdb\x96\x00\xd1\x6c\x8c\x1c\x08\xb8\x03\x38\x02\x0a\x55\x34\x45\x42\x02\xcb\xaa\xc2\x54\x09\xa8\x7b\x6b\x7b\x80\xd5\x03\xc8\x34\x99\xc8\x50\x95\x1d\x48\x08\x93\x15\xa1\x69\xb2\x83\x6c\x84\x77\x52\x25\xb4\x0b\xd4\x9a\x06\x39\xe7\xd8\x51\x35\xa4\x68\x8e\x83\xb8\x43\x6c\x95\xaa\xc2\x76\x9c\x1d\x0f\xf5\xcc\x62\xc9\x93\xc5\x02\x9c\xd9\x16\x17\xe3\xe2\xb0\xd6\x6a\xf7\x56\xf1\xbc\xd0\x2d\x1a\x0b\xb7\x51\x37\x9b\xb2\x39\x71\xfa\xad\xda\xb4\x32\x74\x43\x0e\xa5\xcd\x30\x2c\x84\xcb\xed\xba\x5f\x73\xd9\x26\x34\x52\x55\x8e\x78\xad\xab\x55\x06\x3e\x52\xcb\x04\x35\x1d\x8f\xcf\xf0\xc8\xa8\xab\xf5\xa6\x5b\xd9\x23\xbc\xb7\xd8\xb3\x48\x37\xd1\xd2\x74\x9a\x8f\x49\x6e\xeb\x76\x32\x60\xd9\xae\x64\x48\x9e\x14\xc4\x98\xad\x3c\x9f\x4b\x72\x2d\x74\x53\xd5\x7c\xad\xb8\x6e\x1b\x63\x63\xd3\x72\x37\xed\x54\xc9\x5c\x01\x34\xa8\xc1\xd8\x97\xdc\x7a\x37\x8c\xc4\xa0\xcc\xa5\x54\xb7\xdb\x74\xb4\x38\x59\xee\x4e\x50\x8a\xec\x8d\xb4\x7d\xc5\x62\x6b\xc1\xb5\x5a\xff\x0f\xb0\x58\x41\x99\xcc\x35\x07\x21\x44\x55\xec\xd8\x2a\x04\xc2\x91\x24\x2c\x84\x46\x64\x6e\xdb\x32\x41\x36\x04\x1c\x29\x08\x20\x6a\x73\x02\x24\x45\x92\x91\x2c\x43\xa4\xd9\x8c\x31\xbc\xef\x4c\x3d\xc2\xea\x25\x04\xb1\x22\x71\x0a\x11\xd6\x08\x20\x48\x73\x08\x00\x14\xda\x10\x42\xae\x72\xa8\x09\x07\x6b\x8a\xac\x68\x0a\x72\x98\xc4\x15\x48\x99\xe6\x48\x8a\x22\x24\x02\x24\x4d\x96\x77\x3c\xd0\x99\xc5\x6a\x4f\x16\xab\xa2\xdc\xb6\xd4\x36\xeb\xda\xa4\xd4\xb4\xfa\x6d\xa3\xef\xe7\xa6\x38\x6b\x4e\x65\x7b\x93\x71\x32\xdd\x74\xa9\xd9\xce\x2d\x98\xd4\xca\x65\x73\x46\x23\x97\xe4\x62\xd1\xcb\x14\x73\x76\x1a\xcf\xfb\x7c\x38\x6e\x76\xcb\x6d\x33\x22\xc9\xa5\xae\xb4\x83\x71\xa1\x2c\x96\x9d\xf6\x54\x2a\x1c\xc2\xdb\xde\x62\x57\x27\xc4\xd5\x38\x47\xc7\x29\x67\x88\x2b\xd9\xaa\x17\x0f\x47\x93\x0d\xcf\x86\xe9\x36\x48\x55\x80\x37\xa1\xc2\x59\x48\x6d\x1b\x18\x2b\x89\xd9\xf5\x6e\x11\x14\x68\xd1\x9f\xea\xc3\x59\x52\x37\xbc\xc8\x2b\x77\xc0\x0c\xcb\x93\x4c\xb3\x6d\x93\x42\xbb\x14\xf9\xeb\x46\x35\xaf\xe7\x5b\xd6\xde\x48\xfb\x57\x2c\xb6\x51\xb9\xa8\xf0\xb4\xfe\x9f\x61\xb1\xaa\xe0\x8c\xc8\xb6\x24\x64\x81\x35\xa0\x71\xc0\x99\x6d\xdb\x9a\xc0\x0c\x6b\x4c\x02\x9c\xa8\x92\x0c\xb1\xa4\x52\x40\xb1\x0d\x39\x84\x82\x12\x40\x6c\x44\x15\x00\x08\xd7\xec\x9d\xb5\x3d\xc2\xea\x55\x28\x98\xb0\x19\x17\x9a\x22\x29\x36\x90\x1c\x47\x72\x80\x66\xdb\x04\x68\x32\x46\x12\x15\x36\x50\x64\x8d\xda\x54\x96\x29\x75\x24\x49\x56\x64\xe2\xc8\x80\x13\x04\x00\xd4\xd4\x9d\xc5\xe2\x93\xc5\x92\xa7\xb1\x04\x23\x19\x66\xa0\x33\x98\xce\x7a\x49\xc9\xac\x92\x86\xb3\x98\x66\x20\xae\xe6\x23\x57\x1a\xf7\xf3\x73\xcd\x4d\xd7\x5b\xfd\x6d\x71\xb6\xac\xac\x57\x8d\x61\x72\x45\x97\x55\x33\xce\x48\x2d\x9e\x62\xc2\xee\xe7\x27\x96\x3d\x2d\x66\xe2\x69\x8a\x27\xe3\x76\x89\x07\x55\x04\xd7\x99\x55\x7c\xe8\x74\xed\x2c\x76\x78\x86\xf8\xa2\x1e\xd6\xea\x21\x9c\x4f\xac\xce\xcc\x30\xe7\xc3\x3a\x15\xf5\x4a\x94\xd1\x8a\xdd\xae\x45\xd7\x66\xb3\x6a\xae\x2a\xd1\x7a\xe9\x4d\xcc\x4e\x13\x57\x97\x16\x6a\xe7\xca\xba\x43\x1c\xc3\x5e\xe8\x63\xb9\x4f\xd1\xaa\xae\xce\x51\x05\x85\xeb\x2c\xa8\xd6\x2a\xd6\xd0\xd5\x67\x9d\xbd\x91\xb2\x2b\x16\xdb\x5c\x5d\x54\xb8\xa1\xff\x67\x58\xac\x44\x65\x8d\x49\x14\x72\x07\x3b\x18\x0b\x4d\x72\x18\xd5\x30\x41\xb2\x84\x98\xc0\x40\x52\x09\x22\x14\x50\x20\xd9\x90\x70\x15\x01\xc7\x66\x50\x56\x88\x64\x3b\x32\x75\x14\x45\xd9\x5b\xdb\x03\xac\x9e\x51\xa4\x49\x9a\x50\x65\x19\x3a\x40\x61\x5c\xa2\xdc\x91\x1d\x99\x50\x05\x11\x4d\x10\x06\x28\x54\x55\xec\x10\x04\x31\x95\x64\x0d\x20\xce\x6d\xac\x52\x87\xa9\x44\x12\x8a\xb4\xd3\x83\x9c\x59\xac\xf4\x64\xb1\x12\x66\x2e\x2e\x8c\x54\xd5\xe0\x19\xb6\xc0\xbe\xbf\x56\x57\x75\x98\xcb\x6e\x58\x27\x28\x89\x0d\xf0\x50\x60\x94\xe9\x58\x37\xa1\x3d\x5f\x4c\xa6\xa5\x0a\x56\x57\x85\x82\x1c\x2d\x67\xa5\xc5\x48\x2e\x15\xf0\xc8\x18\xa6\xfd\x06\x94\x82\xc2\x20\xe0\x41\xaa\xe7\x66\xc4\x76\x3f\x56\x70\xb0\xd8\x33\x23\x22\x40\x92\x4c\xc2\x56\xc2\xeb\xb4\xcb\x8d\x31\x76\x93\xa6\x2c\xba\x95\xd4\x38\xd9\x4e\x46\xcb\x72\x79\x59\x2c\x93\x9e\x96\xb5\xd2\x52\x58\xa2\x0d\x7f\x52\xd9\x90\xec\xb6\x11\x3a\xb5\xad\x37\xa6\x45\x54\x31\xbc\x4e\x2f\x99\x2f\xa2\xac\x9a\x8e\xa1\xdc\x5d\xae\xfb\x85\x71\x6e\xcf\xd9\xbd\x62\xb1\xed\xf6\x45\x85\x67\xf4\xff\x0c\x8b\x15\x40\xd8\x50\xa3\x82\x30\xa6\x12\x0e\xb9\xc3\x91\xed\x50\x84\x01\x93\x89\xec\x30\x1b\x62\xc1\xb0\x4a\x55\x8e\x29\x02\xb2\x2a\xc9\x12\x17\x02\x02\x07\x02\x59\x20\x28\x91\x7d\x8b\xfe\x00\xab\xb7\x21\x23\xc0\xb6\x05\x77\xb0\x60\x48\x51\x34\x09\x43\x42\xb8\xaa\x72\x0e\x21\x55\x80\xa6\x10\x21\x10\x46\x8a\x66\x43\x0c\x14\x55\xd3\x1c\x9b\x51\x41\x19\xd7\x88\x43\xa0\xf3\xed\x7b\x42\x3b\xb3\x58\xf8\x64\xb1\xeb\x40\x5d\xd1\xb2\xe3\xc8\xce\xac\x40\xe6\xbd\xe1\x28\x17\xa9\xab\x5c\x9f\x96\x0c\x37\xbf\x19\x75\xfa\xb5\xa5\x61\x99\xf9\x54\x75\xd9\xc8\xda\xe5\xc1\x52\xd6\xab\xf5\x81\x63\x8d\x33\x0e\xdf\x24\x8b\xeb\x7e\x93\xa0\xe1\x04\xc3\x4c\x7a\xb1\x9d\x42\x3a\x22\xcb\x82\xe7\x67\xec\xc3\x70\xd6\xde\x62\xcf\xf2\x58\x6d\x32\x4b\x27\x83\x29\xef\x07\xe5\x6d\x76\xd2\x49\x91\x49\x77\x12\x4f\x04\x4e\xcd\xf2\x2c\xf2\x53\xa4\xd7\x92\xb8\x6b\x4a\xc9\x02\xaf\x6e\x36\xfa\x22\x29\xcb\x38\xdf\x28\xe6\x36\x9e\xd5\xe1\xc0\x9b\xe9\x13\x13\x4f\xf9\x78\xba\x61\xd9\xee\x20\x49\xc2\xf9\x76\x30\x52\xca\xfb\x48\x3a\xbe\x62\xb1\x1d\xe5\xa2\xc2\xff\x53\x2c\x56\x91\x24\x09\x08\xc1\x00\x94\x08\x51\x20\xb0\x29\x52\x14\x85\xa9\xcc\x71\x38\xe1\x12\xe4\x40\x03\x84\x41\x40\x6d\x07\x53\xc6\x34\x84\x34\x22\x41\xc0\x6c\x00\x15\x47\x52\xf1\x3e\x2b\x78\x80\xd5\xdb\xb2\x46\x19\x51\x88\xd0\x08\x42\x10\x63\x55\xc3\x8a\x80\x8a\x50\x90\x82\x89\x50\x25\x28\xc9\x90\x73\x09\x53\x15\x11\x48\x35\x0d\x10\x2a\x03\x87\x40\x99\xc9\xaa\x02\x1d\xf1\xed\x7b\x42\x02\x67\x26\x2b\x3f\xa7\x05\x99\xb0\x44\x51\x65\xdd\x07\x71\xaa\xbb\x44\x83\xd5\x4a\xa9\x91\xc8\xc7\x85\xee\x44\x42\xfd\x4c\xbb\x55\x10\x8a\x4b\xdc\xda\xd4\xec\x77\xc7\x82\x4c\xc6\x76\x25\x37\x88\x92\xd5\x7c\xa7\x35\xc8\xb4\x26\x4a\x9c\xeb\x59\x23\x96\x9a\xe5\xeb\x7c\x31\xae\x0e\xfa\x63\x09\xda\xde\x69\xb0\x60\x78\xd6\x38\x13\x94\xf5\xd9\xb6\xd9\xe0\x55\x25\x34\xcc\xea\xb4\x49\xe8\xa6\x30\x5c\x46\xf3\x82\x6f\xa5\x4a\xb9\x78\x6c\xbb\x56\x77\x92\x5a\x55\x8a\x62\x3b\x8d\x86\x26\xea\x0f\x3c\x2e\x4d\x80\x32\x56\xf3\x0d\x45\x6d\x98\xad\x32\xcf\xa1\x4e\x50\x9a\x8d\xcd\x60\x95\x34\x6a\x99\x8e\x91\xda\xbb\x44\x70\xc5\x64\x7b\xec\xa2\xc6\xf7\xd9\xf5\x7f\x80\xc9\x22\x45\x00\xa6\x01\x00\x85\xa6\x60\x4c\x14\x59\x93\x19\x20\x9c\x08\xa8\xaa\x32\xb1\x29\xd5\x04\x06\x48\x21\x8c\x51\x2a\x90\xa3\x50\xa8\x3a\x4c\x95\x31\x21\x92\xc6\x25\x86\xf6\x83\x05\x0f\x30\x7b\x20\x13\x95\x50\x47\x08\xca\xa8\x2c\x14\xc6\x55\x47\x30\xc7\xa1\x12\x61\x0e\x91\x6c\x1b\xd9\xbb\xa8\x4c\x00\x01\x2a\xc0\x50\xb1\x29\xa7\xea\x8e\x89\x03\x80\x6c\x33\x65\x6f\xb2\xd2\x99\xc9\x2a\xcf\xa3\x05\xd9\x46\x66\xb1\x32\xf2\x66\xdd\x5d\x4c\x1b\xd9\x35\x4b\x69\xa3\x46\xb9\x3e\x36\x57\xee\x3c\x25\xa2\x4d\x97\xf6\xb3\xee\x66\x55\xac\xe5\x7a\x73\x05\x2d\x9b\xcd\x00\x07\xcd\xa8\x39\x9d\x0c\xc6\xdd\x65\x2f\xdd\x82\x22\xdc\x0c\xb7\x5a\x41\x98\x28\x2f\x71\x5e\x5c\x4d\x82\x59\x70\x68\x92\x77\x26\xeb\x9d\x41\xbe\x69\x05\x9d\xfe\x14\x0e\xfb\x0d\xd9\x6c\xe7\x64\x32\x9b\xce\xb1\xd5\xc9\x8c\x72\x95\x6d\x23\x2c\xd6\xcd\xdc\x26\xb2\x17\xc4\x28\x96\xb7\x41\x66\xd8\x0f\x93\x28\x0a\x92\x2d\xab\x97\xdc\xa6\x82\xfe\x56\xc9\x63\x0a\x5c\xdb\x35\xd3\x75\x36\x5e\xc4\xb3\x7e\xd6\x25\x7a\x95\xb4\xf6\x26\x1b\x5d\x31\xd9\xc1\x65\x8d\xff\x5f\x61\xb2\x6f\xcc\x09\x5f\xd9\xe5\xf0\xd5\xc9\xe0\xe3\x4e\x87\x47\xcc\xf8\x3f\x35\xe1\x7a\xbb\xd3\x69\x1f\x9b\xd9\xa0\xb6\xea\xa7\x72\x3c\xc5\xcc\x8d\xd5\x9e\xa7\xc4\xbc\x50\xdd\xce\xe6\xb8\xcf\x83\x15\x73\x9a\xdb\x71\xc1\x19\xe4\x3a\x0d\xa3\x04\xb3\xe3\x3f\xbe\x3d\x3d\xdf\xe9\xb4\x1a\xc7\xc2\xc7\xb6\xdb\x6b\xa0\x2c\x0e\x32\x65\x50\xae\x27\x57\xfd\xa6\xa1\x6d\x7b\xcb\x5e\xa7\x25\xaf\xbd\x9a\xd7\x5f\x34\x6d\x29\xb3\x9c\xd6\xcb\x82\xec\x9e\xd7\x4e\x73\xf3\xd2\xf3\xb5\x0b\xdb\x67\xbf\xff\xeb\xf9\xc6\xf1\xb7\xc3\xda\x13\x7c\x11\x19\x1e\x08\x8c\xfc\xf3\x81\x21\x27\x00\xd4\xc3\x90\xf7\xbf\xa0\x7a\x58\x74\xf1\x51\xb9\x6f\x5f\x60\xa1\xdc\xaf\xf7\x71\x0e\x7f\xbf\xfe\xe2\x6c\xe1\x85\xf4\xf4\xdf\xee\x33\xf8\x71\x35\x27\xfd\xfc\x9a\x93\xdf\x28\xb5\xf4\x76\x58\x78\xbd\xd7\xe5\x8e\x75\x27\x6f\x6e\xc6\xb8\x8f\xe7\xe5\x7e\x8a\x3b\xb8\xbd\xb1\x1b\xe2\x0e\x8e\x6f\xec\x5b\xf8\x6a\x6c\x3d\xdb\xbb\x70\xb6\x6e\x4e\xee\x1a\x4a\xbf\xad\xf4\xad\x5e\xb1\xa0\x17\x6a\xb9\x6e\xd6\xa8\x22\xa5\x9d\x37\x4a\xe9\x7a\xb7\x9f\x2d\xf7\x55\xa3\x56\xc9\xe8\x1d\x84\x1b\x99\x4a\x77\x90\x69\x95\x1b\xdd\x41\xe6\x3c\xbe\x16\xf8\x90\xad\x5b\xd3\xbc\xdc\x64\x69\x79\x12\xd5\x5b\x4b\x16\xf4\x9b\xee\x2a\x76\x3d\xc2\xb3\x9a\xbb\xea\x68\x49\x13\x76\x37\x55\x7a\xd6\xe5\xd8\x0f\x33\xed\x87\x75\xf6\x13\xfe\x59\xaf\xb0\x1d\x18\xc6\x46\x49\x97\x06\xe5\x56\x5e\xef\xfa\x9d\x64\xb5\x58\xb3\x75\x68\x68\x9d\x41\xb6\xd4\x29\xda\x53\x65\x95\x72\x46\x43\x73\xb3\x37\xfc\x34\xd3\xda\xeb\xd4\xfe\x79\xf7\xf9\xcf\x7e\x60\xd3\x58\x3d\x7f\xcf\xe8\xba\x66\x9c\x35\xc7\xe9\xb0\x86\x02\xcf\xf3\x45\x89\x36\xb2\xd6\x78\x61\x95\x53\xd9\x7a\xab\xb0\xf6\xcd\x42\xd6\x14\x3d\x20\x0d\x47\xa2\x4e\x3a\x9d\x65\xcf\x6c\xef\xd9\xa5\x36\xb9\xba\x5c\xaa\xb6\x3a\xeb\x82\x5e\x6a\x15\x4a\xfd\x46\x6e\x09\xa6\x4e\xba\xba\xde\x66\xa7\x28\x60\xb6\x3c\x8c\x40\x72\x44\x2d\xe6\x53\x91\x52\x9d\x8d\x1b\x82\x86\xed\x8f\x37\x0b\x07\x19\x29\xbd\x52\x4d\x19\xa0\xdc\xa4\xad\xd9\x64\xc3\xc6\x29\x63\x30\x9e\x90\xd8\xd8\x85\x8f\x8b\x18\xf1\xe0\xaa\x91\xef\xaa\x9a\xca\xcb\xaa\xc9\x64\xf2\x51\xc7\x32\x95\x75\x6a\x38\x88\x4b\x53\x2c\x31\x64\xad\xa6\x86\xb9\xa8\xc6\xcd\xde\x20\xb0\x07\x24\x93\x32\x86\xb5\xfc\x06\xc5\x6b\xfd\xa9\x6a\x36\x97\x69\xc3\x97\xa1\x0f\xd3\x1a\x9b\x01\xbf\x93\x1a\xb2\xfa\xa8\x3c\xe9\x6c\x47\xf5\x60\x64\x8c\x07\x1d\xc8\x0c\x6a\x07\xba\x5f\x0b\x26\xc0\x77\x74\xa3\xc8\x14\x2d\xeb\xb4\xeb\x4d\xc5\x6f\x84\x6a\x3b\x2a\x95\x48\xab\xb2\x28\xb0\x1c\x2e\x8e\x47\x83\x12\xf2\x3b\x92\xb5\x18\x74\xb4\x72\x79\xa3\xaf\x7e\x38\xf4\xca\x5d\xd0\xd7\x2f\xa1\x6f\xf3\x5e\xc3\x4b\xa5\x8b\x2a\x19\x37\x40\x7a\xed\x05\x55\xdf\xcd\x8d\xd8\x32\x98\xd5\xa4\x21\x5c\x0a\x75\x16\x2e\x56\xa6\x67\x0c\xed\xfa\x33\xf4\xe9\x7b\xa1\x4f\x66\x93\xdc\x34\xdc\x51\xab\xca\xd6\xb9\x5a\xbd\x4e\x97\x0a\x4d\xce\x19\x49\xf6\x9c\x06\x5d\x65\x27\xbd\xc0\x2f\x1a\xfd\xcc\xb8\x5a\xb1\x3c\x34\xb1\xa4\x56\x21\x32\xb0\x6f\xa5\x5c\xd5\xf1\x52\x3a\x65\x80\x27\xeb\x21\xae\xe5\x7a\x58\x53\xf4\x5c\x15\x4f\xb0\x39\xcd\xfc\x78\xab\x57\xef\x82\xbe\x7d\x01\xbd\x11\x89\x45\xaa\x96\x73\x93\xe9\x6d\x29\x2a\x13\x55\x9e\x01\xcd\x06\xeb\xa9\x13\x8e\x97\xdb\x59\x31\x59\x84\xfe\xa2\x52\xcc\x4c\xd2\x25\x7d\xf5\x0c\xbd\x71\x2f\xf4\x6d\x60\x8e\xea\x9b\xc5\xa2\x08\x90\xad\xb8\xe9\xee\x34\x1e\xf5\x6a\x46\xc3\xcb\x6a\xf1\xb8\x88\x5b\xdb\x34\x51\x0c\xb0\x4d\x96\xb2\xfd\x81\x06\x97\xc6\xcc\x29\x66\xf2\x0b\x2c\x59\x9b\xb9\x3e\xf0\x43\x66\x11\x19\x68\x2b\x6c\x8d\xcc\x65\x87\x1b\xed\x52\xc9\x37\x24\xcb\xf8\xf1\x56\x8f\xee\x82\xbe\x7f\x01\xbd\x5e\xcc\xf6\x54\x09\xa9\xac\x32\xee\x44\x85\xc5\x6c\x08\xf3\x8d\x62\x3f\xae\x7b\xdb\x2d\x22\x99\x61\xd3\xab\xb3\x18\x69\x9d\xa6\xdd\x66\x27\xab\xcf\xdc\x0b\x7d\x47\xb1\x87\xde\x08\xe3\x72\x25\x9b\x75\xa5\x30\xbb\xae\xc5\xdd\x86\x34\xa8\xd1\x2e\xf7\x33\xf5\x4d\x7d\x94\x5e\x27\x57\x1d\xe6\x32\xe6\xab\x14\x8f\x56\x73\xc7\x52\xe8\xa8\x17\xcd\xfa\x8b\xa5\x5a\x73\xe6\x2b\xdb\x60\xb5\xa4\xd3\xf3\xb5\x5a\x1c\xa8\xb6\xcf\xf9\xa8\xa2\xd7\x7f\x38\xf4\xf8\x2e\xe8\xd9\x05\xf4\xe9\x7c\x01\xa7\xe7\x44\xf1\x40\xad\x63\xc9\xda\x5a\x8d\x5d\xda\x96\x16\xfd\x71\x15\xda\x9a\x8c\xa4\xfa\x0c\xba\x38\xb4\xb3\x35\x03\x3c\x37\xc3\x9b\xcb\x35\x1c\x5f\x86\xbe\xc7\x56\xc5\x51\x41\xd1\xdc\xc2\x32\xcc\xa7\x17\x7d\xbe\x98\xcf\xb2\xfa\xb6\x15\x15\xa1\xee\xb9\xe5\xc1\x58\x71\xb4\x2a\xee\x8e\xba\x9e\x3c\x90\x79\x94\x6a\x6a\x83\x74\x75\xa1\x87\x59\xb7\x2d\x77\xe3\xc9\x76\x0a\x8c\x8a\xae\xe8\x6c\x54\xd0\x68\x68\x82\xc8\xec\x4a\x65\xfd\xc7\x07\x1c\x72\x17\xf4\xee\x65\xc0\x99\xa3\x6e\x3f\xd8\x2e\x7d\x9d\x39\x62\x93\x1c\xcf\x51\x8d\x05\xce\xa2\x52\xca\xe6\x79\xc1\xee\xba\x7c\x3a\x84\x23\x4d\xe8\x16\xae\x9e\x02\x4e\xee\x6e\xab\xb7\xd8\x9a\xcf\xd7\x50\xad\xf5\x3c\x57\xb6\xf8\x38\xbd\x99\xae\xf3\xca\x68\xe1\xce\x7b\x64\x99\x07\x33\xbb\x9b\x59\xbb\xeb\x36\x20\x78\x68\x94\x05\xcc\xa9\xc5\x2e\x6c\xd7\xe6\xa1\x9a\x8e\x96\x6d\x7b\xde\x2b\xd9\x99\xb2\x17\x06\x2a\x1e\x8e\xad\x6d\x0e\x78\x52\xc3\x4d\xbb\x3f\x1c\x7a\xed\x2e\xe8\xc7\x97\x56\x1f\xc5\xd3\x14\xd3\xd5\xf4\x84\xc0\xba\xa5\xc9\x65\xc5\xcf\x0d\xcb\xdb\x79\xbe\xb7\xec\x57\xf2\xb8\x6a\x0f\xe6\xb5\x0d\x11\x25\x66\x2d\x4e\x01\x27\x7f\x2f\xf4\xe9\x51\x9d\x88\x6a\x4f\x6c\xb7\x90\xd6\xb0\x3a\xac\xe1\x61\x7f\xdd\x5c\x14\x5a\x9d\xbe\x3f\x77\x6b\x93\x69\xda\xcb\x9b\xc5\x4e\x19\x5a\x9e\x14\x6e\xd3\xbd\x0c\x76\xd0\x26\x76\xfb\xbd\xea\x7a\xa9\x61\xd7\xa8\xf5\xf2\x15\x7f\x6b\xb4\xf2\xb6\xd2\xe9\xea\x6e\xdb\x65\xc5\x66\xfa\xc7\x07\x1c\x09\xdc\x85\x7d\x70\x89\x3d\x6d\xe0\x4d\xb7\x11\xad\x3a\xd3\xad\xa2\x0c\x3a\xd6\xd8\xaa\xf6\x3c\xd0\x61\xd0\xda\x26\xc7\x83\x34\x44\x75\x75\xe2\xb5\x7a\x83\x45\xf9\x84\x7d\xe1\x5e\xec\x85\x9c\x99\x0f\x17\x7a\x60\x54\x3a\xca\x62\xb6\x54\x9a\xf9\xa5\x93\x77\xc8\x24\xd9\x54\x4b\x25\x6d\xd3\xad\xf5\x45\xbc\xe9\xb2\x5c\x83\x56\xdd\xe1\xcc\x8d\xe9\x60\x9c\xef\x33\x56\x28\x18\x19\x7f\x34\xf7\xea\x4b\x36\x5f\xf6\xb2\x4b\xa3\x5e\xf3\x83\x91\xda\xd7\x32\xfd\x05\xc9\xfc\x05\xd8\x4b\x77\x61\x1f\x5d\x86\x9c\x70\x34\xd7\x8a\xa5\xd1\x62\x58\x5a\x97\x68\x67\xda\xa0\x1a\xcb\xd5\x06\x68\x59\x2a\xd4\x00\x57\x46\x81\xdd\x91\x80\x6f\x74\xbd\xe9\xf0\x84\xbd\x79\x2f\xf6\x9a\x0a\x86\x7c\x66\xa4\xda\xd9\x86\x56\x49\xd6\xfc\x4d\x20\xd5\xd7\x72\x54\x1f\x64\x23\x9b\x27\xb3\x5d\x57\xb4\xc6\xe9\xce\xb2\x6a\x8e\xd1\x48\x16\xcd\x5a\xc1\x37\x96\x83\x32\x52\x6b\xf1\xc0\x5b\x64\x9b\x56\x52\x9a\x7a\x6e\x43\x71\x0a\x4c\xc2\x61\x92\xa0\x9a\xe2\x04\x4f\x0d\xed\xdb\x3d\xe8\x6b\xdb\xde\x6f\xe8\x41\x3f\x6d\x7d\x3f\x2d\x96\x66\x8e\xa0\x84\x50\xa8\x71\x01\x35\xaa\x28\x8a\x8c\x14\x9b\x70\xe8\x38\x92\x04\x14\x86\x19\xc2\x10\x60\x09\x10\xac\x61\x2e\xab\x04\xc9\x58\x03\x8e\xa4\xaa\xc8\x51\x19\x51\x5f\xd4\xea\x1e\xe5\x43\x73\xca\x61\x6e\x9b\xab\xf6\x6d\x5e\x5c\x15\x44\x77\x9d\xae\x6a\x9b\xe1\xb0\x94\x31\xa0\x51\x5e\x83\x16\xcc\xa4\x7b\xb2\x32\x1a\xd8\xa6\x1a\x1e\x06\x82\xde\x2b\xfd\xf5\x7d\xee\x5f\x2e\xfd\x69\xaf\xfb\x73\xe9\x9f\x0e\x97\x3e\x9c\x5c\x97\x78\x75\xed\xa7\x77\xc1\x2b\xaf\xb8\xc2\xc9\x17\xf1\x2a\x08\xc7\x33\x1a\x45\xb3\x61\x48\x23\x71\x85\x53\x4b\x44\x71\xa2\x99\xc9\x25\xac\x03\x71\xe2\xf7\x44\x53\xcc\x62\x31\xb5\x45\x98\x80\x40\x52\x3f\x23\xc8\x09\x42\x26\x22\x36\x0b\x7c\x5f\xac\xe3\x09\x5d\xf8\x6c\x78\x29\x68\x7f\x32\xdc\x67\x98\x1d\x26\x6c\x8e\x3b\x2f\xa3\xeb\xe5\xff\x7f\xf7\x1b\x35\x7f\x8d\xbd\xa9\xf8\xf5\xdf\x09\x70\xd8\xb7\xf9\xeb\xf1\xa8\xed\x5f\xff\x9d\x38\xdc\xdf\xff\x38\xa4\xd1\xaf\xff\x3e\x9c\x4b\xb7\xff\xf1\xff\x1c\x89\x1d\x21\x3e\x47\x38\xa5\xeb\x78\x1d\x79\xdb\x4f\x92\x87\x22\x12\xe1\xf2\x23\xe2\x5f\xfe\xcf\xa7\xa0\xa0\x51\xbc\x3f\x50\x89\x1f\x0f\x36\xb9\x02\xc5\xdd\x13\x59\x9f\xd0\xe3\x18\x6f\x69\xc8\x86\xde\xf2\x78\xf3\x8d\x2a\x39\xd5\x81\x74\x04\x64\x0f\x47\xf8\xeb\xbf\x13\xbf\x2e\x25\xe9\x5f\xd2\xbf\xc0\xaf\xc7\x1b\x6c\x11\x86\xc2\x8f\xcb\xfb\xa2\xed\x1e\x90\x5e\xde\x48\xef\x0f\xbd\xda\x01\xf7\xff\x7f\x46\xf2\x84\xe9\x33\xe5\x8e\x33\xe6\x9c\xc9\x10\xca\x00\x13\x02\x34\xe4\x70\x99\x2a\x08\x2a\x58\x56\x6d\x6a\x2b\xd8\x46\x8a\x23\x84\x60\x58\x30\x21\xd9\x32\x40\x84\x60\x2a\x01\x55\x68\xaa\x02\x09\x26\xda\x51\xa5\x67\xbe\x3b\x33\x7e\x51\x83\xcf\x77\xf6\x85\xdf\xd9\xdc\x8b\x5b\xff\xe7\xe2\xf9\xc8\xa7\xb3\x9d\x5e\xaa\x2a\x21\x2a\x41\x66\x43\xc6\x09\x64\xaa\x26\xa9\x42\xe3\x12\x12\x54\x75\x38\x04\xc4\x16\x9a\x90\x1d\x59\x13\xaa\xa3\x12\x1b\x10\x05\x0b\xa1\x12\x49\x61\xaa\x90\x35\x04\xf8\xaf\xbf\x5c\x91\xf0\x06\x06\x48\x92\x34\x15\x21\xa0\x09\x02\x38\x20\x8a\x04\x15\x89\x0a\x2a\x3b\x04\x02\xc4\x34\x87\x4a\x42\x65\x98\x29\x50\x38\x0c\x73\x47\xe5\x08\x33\x9b\x28\x0a\x90\x39\x42\x32\x97\xbe\x8e\x81\xf4\xfd\xf5\xbd\x60\x11\xcf\x16\xbb\xe7\x7e\xb5\x6d\x55\xd6\x84\x2d\x61\x88\x14\xcd\xc6\x00\x62\x88\x38\xb3\x09\x61\x88\x4a\x9a\x0c\xa0\x06\xa1\xc3\x19\x55\x28\x91\xa9\x20\x92\xed\x20\x55\xa3\x84\x03\x19\x31\x5b\x16\xd2\xaf\x9f\x42\x18\x50\xdb\x01\x0a\xd4\x84\x04\x65\x02\x64\xae\x01\xc1\x80\x46\x65\x21\x2b\xc4\x16\x90\x52\xa4\x20\x85\x0a\xa4\x08\x8d\x13\x05\x12\x49\x95\x20\x51\x6d\x45\xa6\x58\x02\x58\xfb\x12\xc2\xf7\xee\x7d\x7c\x34\xc2\x8f\x2b\xfb\xbb\x08\xdf\x5b\xea\xbf\x35\xc2\x9f\xf3\xe3\xff\x62\xf0\x5f\x0c\xfe\x8b\xc1\x7f\x31\xf8\x2f\x06\xff\xc5\xe0\xbf\x18\xfc\x30\x0c\xf6\x9f\xfe\x9f\xcf\xf7\x8d\x22\x36\xdb\x1f\x5c\x7b\xed\x7a\x5e\x98\x71\x18\x54\x97\xfb\xbd\x4a\x5b\x1d\xc6\xc0\xd7\xb9\x6a\x67\xb3\x58\x2e\xe5\xb3\x41\xa5\xdc\x37\x97\x85\x46\xad\x5f\xc9\x39\x8e\x67\x4d\xa2\xd1\x74\x71\x1a\x86\x29\xef\xff\xa2\x6d\x72\x6e\x06\x33\xd9\x9b\x8e\x1b\x99\x41\x79\xd4\x4c\xad\xb3\xd9\x35\x19\x6c\xd2\x6b\xa3\x30\xd1\xac\x7e\x5f\x1e\xd7\x72\x1d\x5b\x3a\x8e\x1c\xd7\x75\x5d\x2f\x7a\x77\x0e\x03\xdd\x32\x60\x91\xd6\x7b\x0d\xbc\x6d\x67\x87\x85\xb5\x52\xde\x06\x51\xd3\x1d\xae\x5a\x72\xdb\x1d\x84\xea\xac\xda\x10\xf9\x59\xbb\x62\x24\x73\xe5\xa8\x55\x58\x0d\xbd\xf1\x36\x9e\x9a\xb5\x75\x84\xbc\xb1\xb1\xf5\x33\x2c\x6f\xcc\x9b\xa3\xba\x45\x7a\x33\xd8\xdb\xc6\x8a\x32\x50\xc7\x46\x05\x8c\xea\xc6\x49\x1f\xa3\x7f\xe7\x42\xc1\xf4\x2d\xc3\x6c\xf5\x1c\x10\x44\x4a\x9b\x0d\x22\x0c\x82\xca\xd9\xc0\x64\x59\x4d\x32\xf3\x34\x49\x5b\xe3\xde\x70\xde\xc9\xe8\xcb\x61\x13\x67\xd7\xc4\xec\xcf\x2a\x78\xe0\x65\x88\x5d\x0d\x66\x7a\xa4\xae\xe4\xb4\x3b\x1f\x07\x20\xe3\xe4\x10\x9f\x10\x2c\xaa\x79\x31\xd0\x47\x96\x09\x9e\x96\x36\xa8\x26\xde\xd2\x34\x4e\x33\x5c\xf2\xaa\x64\xbe\x4c\x31\x5c\x4f\x05\x8d\x76\x6e\x93\xf1\x73\x93\x29\xea\x6d\x1b\x03\xa5\xb9\x9e\x6d\xc7\xa9\xd2\x58\x9a\x0c\xb7\xcb\x45\xc1\x29\xf1\x5a\xc9\xb2\x5b\x93\xcc\x54\xb1\xc2\xb4\x91\x65\xc8\x58\xa7\xda\x6c\x2b\x5a\xe6\xc6\x49\x55\x0f\x03\x4e\x77\xd8\x9b\xfb\x5c\xff\xab\x7b\x17\x66\xee\x2f\xfa\x35\xfb\xad\xd7\x04\x37\x7b\xb4\xbe\x94\xd2\x59\xa7\x55\x1b\xa9\x64\x6e\xb5\x2b\x1c\x67\xf3\x8d\x72\x5e\x76\x86\xb9\xa0\x30\x56\xf5\x8e\xbd\xf5\x8a\xd5\x40\x93\xc7\xa3\xb5\xba\x0a\x61\x33\xb9\x68\xe1\x6e\x3f\x1c\x66\x47\x4e\x3c\x08\x82\xac\x28\xac\x65\x4b\xa0\xd4\xb2\x3a\x4a\x16\xd0\xa1\x3c\xe9\x7a\x23\x5b\xc5\xba\xd9\x1f\x1a\x06\x1a\x64\x5b\xb9\x6d\x0a\x5a\xd9\xd8\xa8\x8f\x0c\x23\xd4\xd0\xb6\x38\x98\xb9\xcd\x4c\x59\x1f\x93\x0e\x3b\xd9\x4b\x09\x8d\x84\x27\x8f\xa6\x81\x49\x5a\xf9\x49\x26\x25\x5c\x26\xe3\x5a\x2f\x2e\x94\x4a\xdb\x6e\x87\xac\x3a\xde\x20\x4d\x8d\x85\x5a\x56\xf7\xab\x2c\x0e\xcb\x43\xf7\xae\xf4\x6a\x26\xe7\xf4\x71\x4f\x9a\xee\x74\xac\xe3\x44\x9b\x21\x2d\xd2\xbc\x10\xb4\x16\x6e\x65\x59\x8f\x33\x38\x3d\x34\xcb\xb2\x25\x34\xde\xa9\x39\x79\x33\x59\xf4\xd4\xe2\xb2\x5d\x4d\x0e\xf4\x18\xef\x67\x8a\x72\xb9\x4e\xe7\xe8\xae\xa5\x0c\xc9\xd7\xd6\x3d\x47\x36\x2a\xa3\x4e\x69\x29\xcf\x87\xdb\x08\xd1\x05\x2c\xd0\x4a\xa1\x00\x22\x35\x2d\xc3\x46\xa7\x5d\xf7\xe2\xe1\x71\x65\xea\x32\x5c\xb9\x67\xfa\x5c\x3d\x12\x23\xff\x5c\x9e\x7a\x76\xd0\x4e\x6b\x73\x4f\x8c\xb7\x95\x68\x96\x1a\x94\xe5\xd8\xc8\xa7\x35\x67\x5d\xf1\x07\x4b\x9a\xce\xcc\x86\x9b\xba\xc0\xdc\x8f\x0c\xb3\x50\x9a\x58\x9d\xd4\xda\x54\x10\x76\x97\xd5\x5e\xd3\xb7\x73\x20\x50\xa6\x06\xe3\x55\x27\xd6\xd2\xfe\x9a\x9b\x68\x30\x19\x4c\x86\xee\xaa\x7f\x21\xff\xe1\x03\xa4\x6f\x1c\xb9\xf9\xd5\x01\xd2\xb3\x63\x37\x1f\xb5\xda\xef\x8e\x33\xb9\xbe\x65\xdb\x8d\x6f\xdf\x13\x1a\x84\xb2\x8c\x21\x90\x11\x51\x15\x8c\x55\x02\xf0\xf7\x84\x72\xb1\x8c\xef\xb0\x88\x0f\x3e\x37\x73\x17\x4d\xda\xd5\x82\xdd\xbe\x10\xf3\x07\x16\x0c\xbf\x2a\xd7\x9b\x87\x77\xfd\x90\xda\xba\xf9\x8c\xb7\x6f\xed\x66\xe6\xf3\x85\x82\xf0\xe9\xd4\xba\xef\x89\xbf\xa4\xb2\x7e\x48\xb9\xae\x5b\xa1\x7a\x66\x84\x6f\xf9\xeb\x5b\xe7\x87\x7e\xd9\x63\xcf\xcf\x10\x7d\x46\x0b\xca\x78\x7f\x0c\x82\xa2\xd9\x9a\x70\x30\xb7\xa9\x46\x55\x6e\xcb\xb2\xac\xd9\x98\x38\x9c\x12\x47\x56\x30\xc6\xb6\x44\x1d\x59\xb6\xa9\x82\x08\xe5\x2a\x03\xdc\xd1\x14\xc4\x15\x7e\x3c\x49\xe9\x45\x4e\x57\xb9\x88\xe9\x69\x2f\x95\x06\x65\x50\xcc\x6f\xe2\xe1\xca\x92\x26\x7d\x40\x37\xb3\x40\xd2\xac\xc2\x7a\x59\x36\x36\x55\x35\x4e\x67\x99\xd1\x59\xae\x72\xda\x4a\x76\xe3\xb0\xea\xbf\xda\x4a\x70\xed\x7a\xf3\x44\xae\x7d\xcc\x34\xee\x91\xdf\x4f\x25\xd9\x05\xbf\x4f\xca\x7f\x3d\x2d\x7a\x1d\x77\x09\x29\x54\x05\x48\x11\x36\x45\x8a\x03\x19\xb7\x29\xb7\x89\x8a\x6c\x47\x56\x14\xa2\x10\xd5\x61\x08\x22\xa8\x60\xca\xa9\x2c\xb8\xac\x31\xce\x1d\xe0\x20\x0d\x40\x49\x96\xed\xe3\x09\x56\xf0\x35\xee\x3f\xa9\xdc\x8f\xc2\x9d\x5c\xae\x9b\x7d\x30\xee\x90\xcb\x48\x65\x32\x53\x34\x47\xc6\x48\xc5\x80\x3b\x3b\xd4\x19\x45\x50\x05\xb2\x86\x90\x03\x04\x44\x1a\x85\x8e\x2a\x31\x6e\x23\xc2\x04\x14\x42\xd2\x28\x76\x08\x54\x54\x7a\xc0\x5d\x7e\x38\xee\xb7\x96\xfb\x51\xb8\xe3\xb3\x4d\xbd\x97\x67\x28\x3c\x02\x77\x00\x64\xa1\x49\x12\x90\xb8\xa4\x51\x6a\xdb\x0a\xd4\x14\x4d\xd2\x54\x99\x00\x44\x08\xe2\x18\x63\x06\x11\x80\xb2\xcc\x90\x82\x89\x23\x31\x0d\x12\x8a\x35\xc1\x14\x01\xb1\x22\x1f\x70\x57\x1e\x8e\xfb\xad\xe5\x7e\x14\xee\xea\xea\x43\x41\x77\xe2\x4e\x6d\x8d\x39\x4c\x40\x5b\x61\x8a\xa4\x48\x9c\xd8\x36\xc2\x88\x70\x0e\x34\xc5\xe6\xb6\x2d\x31\xac\x00\x84\x25\xc0\x6d\x5b\xb6\x29\x10\x8e\x46\x08\x06\x0e\x92\xa9\xbc\xdf\x6f\x2c\x5f\x8d\xef\xe7\xcb\x3f\x71\xbf\x4c\x74\x3c\x9a\xb8\xd9\x9a\x00\xbc\xdd\xc6\x9d\x02\xcb\xd4\xd7\xa8\x9e\x5a\x4d\x0a\x73\x26\xb7\x33\x92\x4a\x8b\xb2\xe9\x49\x87\xb2\xe0\x69\x74\x3c\x59\xe6\xea\x21\x5e\x9f\xc2\x3d\x73\x9f\xfc\x29\xbb\x4d\xfe\x67\x71\xb7\xb9\x42\x10\xb7\x39\x07\x90\x2b\x08\x10\x09\x23\x2c\x31\x85\xaa\x14\x0b\x8d\x23\x41\x90\xca\x28\xd4\x98\xad\x48\x02\x41\x8e\x29\x75\x30\xa0\xd0\x11\x42\xb5\x65\xc4\xc5\x01\xf7\xf7\xe3\xbb\xb1\x08\xe4\x20\x56\xd4\xb9\x51\xcb\xae\x67\xf5\x94\x1c\x14\xac\xe4\x56\xc2\x8d\x8d\x17\x49\x13\xa7\x92\xeb\x4f\xeb\x5d\x37\x5c\x34\x93\x2d\xfd\x47\xe0\x7e\x8b\xfc\x1f\x8d\x3b\xc3\xd4\x96\x89\x22\x3b\x80\x02\xa6\x38\x02\x6b\x5c\x30\x01\x1c\x47\xb2\x89\xac\x49\x0e\xa6\x1a\x97\x15\xa6\x60\x66\x73\x2c\x64\x15\xc8\x8a\x83\x6d\x48\x1c\x04\xb8\xc3\xf6\xc7\xa0\xca\x57\xe3\xfb\x4f\x2a\xf7\xa3\x70\x1f\x2b\x3f\x16\x77\x55\x38\x1a\x03\xc8\xb6\x11\x54\x39\xe4\x14\x42\x22\x49\x12\xb1\xb9\x23\x29\x9c\x00\x82\x11\x91\x55\x59\x08\xe8\x30\x8a\x15\x15\x33\x22\x54\x80\x1c\x5b\xd8\x9a\xe4\xb0\xfd\xb9\x2f\xf2\xd5\xf8\xfe\x93\xfc\xfc\x1a\xee\xb7\xc8\xff\xd1\xb8\x43\x22\x63\x2a\xd9\x32\x17\x0e\x64\x90\x73\x87\x33\x2e\x54\x5b\x51\x6c\x07\x10\x8e\xa9\x24\x51\x4d\x86\x84\x93\x5d\xa6\x23\x61\x87\x42\xdb\x46\x88\x2b\x8c\xc8\x10\x01\x86\x8f\xa7\xf0\xbd\x1f\x67\xbe\x38\x06\xf3\x90\x38\x93\xbd\x4f\xfe\x8f\x8e\x33\x42\x71\x84\x6d\x23\x4a\x6d\xd5\x21\x32\x77\x14\x26\x69\xb6\xe2\x48\x0e\xb2\x09\x22\xd8\x91\x24\x42\x90\x84\x34\xa1\x69\x48\x48\xc8\xa6\x14\xab\x94\x32\xc8\x09\x05\x1a\x43\xe4\x78\x96\xdc\xfb\xb8\xbb\xa9\xf4\x88\x74\x64\x6d\x35\x32\xa5\x66\xa8\xa1\x80\xe1\xea\x34\x8c\x87\x70\x94\x5e\x6b\xe5\x6a\x9d\x6b\xe3\x4e\x27\x6b\x86\xfd\xe6\xe3\xda\xd5\xdc\x7d\xf2\x7f\x34\xee\xb2\x8a\x84\x60\x92\x03\x14\x19\xda\xb6\x6d\x53\xa0\x71\xce\x98\xa4\xc9\x58\x40\x02\x55\x99\x2a\x9c\x11\xa1\x11\xc7\xc1\x98\xab\x42\xe3\x42\x48\x0a\xb0\x85\x0a\x34\x99\xee\xcf\xa8\x42\x57\x71\x7f\xa0\x9f\x9b\x17\xf5\xf8\x29\xdc\xf3\xf7\xc9\x1f\xb5\x6f\x93\xff\xf9\x7e\x13\xe0\x10\x29\x5c\x13\x50\xc8\x32\x52\x18\xd4\x1c\xea\x20\x8a\x04\x23\x92\x4a\x09\x25\x02\x51\x05\x09\x28\x03\x0d\x71\x2a\x29\x92\xe4\x40\x6d\xf7\x8d\x63\x82\x25\x78\x3c\xd7\xeb\x35\xee\x0f\x2c\xf7\xab\x7a\xfc\x0c\xee\x85\xfb\xe4\x1f\x4f\x08\xf9\xb2\xfc\xcf\xe2\xae\x50\x40\x99\x84\x84\xa6\x10\x2c\x01\x49\xd3\x90\xaa\xd9\x40\x10\x49\x96\x6c\x01\x10\x77\x54\x4d\x51\x84\x8a\x09\x40\x0c\x70\x1b\x43\x48\x54\x4d\x28\x82\x50\xca\x25\xa1\x3c\x9d\x4e\xf5\x1a\xf7\x07\x96\xfb\x6c\xa0\xfa\xf3\xb8\x9b\xf7\xc9\x3f\x9e\x8f\xf9\x65\xf9\x9f\xee\x37\xd9\x0e\x04\x40\x52\x24\x8a\xb1\x23\x6c\x4a\x35\x0d\x2a\x8e\x02\x65\xc1\x55\x82\x15\x4d\xb3\x21\x66\x42\x03\x0a\xd3\xa0\x86\x30\x05\x0a\x95\xa0\x03\x89\x2d\x53\xd5\x16\x2a\x39\x9e\xb1\xf4\xf0\x3c\xf2\xee\x38\x53\xbc\x4f\xfe\x8f\x8e\x33\x9a\x2d\x41\xc4\x20\x54\xb8\x90\x64\x82\x35\x88\x29\x96\x39\x44\x12\x11\x0a\x94\x15\x09\x1e\x4e\xc7\xc2\x50\xe1\x32\x57\xa0\x4c\x08\x03\x82\x30\x2c\x34\x4c\x39\xd8\x9f\x9a\x29\x81\xab\xc0\x3f\xb0\xe0\xaf\x3a\xc0\x9f\x01\xbe\x74\x9f\xfc\x57\x81\xe6\xc1\xc0\x53\x45\x70\xaa\x2a\x32\x15\x0e\x91\x31\xb4\x15\x99\x22\x41\xa9\xc6\x04\xe4\x1a\xd1\xb0\x44\xa0\x62\x53\x26\x31\xe2\x40\x01\xb8\xc4\x21\x96\x1d\x5b\xb6\x55\x15\x42\x28\x41\xe9\xe9\xbc\x9b\xd7\xc0\x3f\xb0\xe0\xfb\x12\x7e\x14\x61\x0f\x23\xcf\x69\xd9\x1a\xbc\xf7\xce\x86\xd3\xd1\xfb\x87\xeb\x8b\xb3\x99\x7a\x66\x41\x37\x87\xdd\xb0\xc6\x49\xe8\xab\x11\xa4\x8b\xfd\xc9\x87\x20\x55\x60\xd2\xe4\x0d\xad\xde\xdb\xd8\x71\xfd\x1d\x59\x5f\x9f\x06\xf8\xd1\x73\x00\xf9\x32\x29\xd4\x97\xf5\xb1\x5d\x82\x05\x5d\xee\x76\x46\x8d\xb0\x34\x1d\xf5\x00\x70\xf2\x24\x2a\x9b\x78\x0a\xb2\x8d\x55\xb1\x9b\xd2\x7b\xb2\xfe\xf2\xd8\xa0\x57\xbb\xb9\x2f\xe1\x09\xe7\x16\x2a\x8b\x2a\x75\x47\xeb\x0a\x6d\xd7\x34\x94\xde\x3a\x91\x26\x00\x0b\x42\x6b\xd0\xdb\xa6\xbb\xc5\x71\x2e\x28\xe1\xf1\x72\x7c\x30\x9a\xaa\x1a\x96\xce\xf9\x1d\xc6\xde\x76\x15\x61\x64\xb6\xf3\xe5\xb8\x9e\xae\x07\x96\x5e\xf4\x9c\x5a\xa3\x97\x09\xca\xc3\x65\xbc\x61\x2d\x79\x92\xab\x19\x75\x55\x72\xc7\x3c\xca\x15\x68\xda\xea\xae\x80\xda\x4c\x75\x86\x5d\xd0\x73\xc7\x21\x30\xd2\xb5\xac\x62\xd1\x5c\x07\x96\xa6\x2c\x92\x07\xab\xf2\xd4\xb3\x95\x56\x23\xac\x94\xbf\x7d\x4f\x7c\x33\xe5\xd6\x6c\x0c\xa6\x2a\x96\x21\x9a\x4e\xe0\xb6\xa2\xc6\x4a\x8a\x8e\xb6\x0d\x59\xac\xc3\x6d\x15\x35\x82\xb0\xb3\xb2\x92\x6d\xbb\x0d\x9e\x15\x7b\x07\x83\x27\xc3\x38\x1d\x68\x52\xbf\xa0\x3d\x1c\x91\xaf\xff\xbc\xb1\x48\xfd\x01\x63\xa1\x56\xb8\x69\x35\xee\x90\xaf\xeb\x3f\x6f\x6c\xec\x5a\x88\xfd\xd1\x13\x3e\xb7\x3b\xd9\xab\x7d\xfb\x97\xc5\xa9\x42\x23\xa5\x57\x15\xb5\x9f\xce\xc8\x71\xa1\x93\xab\x4a\x0d\x59\x07\x15\x31\xae\x91\x62\x03\xf9\x96\xa4\x6b\xa2\xeb\xf1\x8d\x19\x1f\x9a\xc4\xb7\x9d\x4c\x6f\x66\x07\xde\xc0\x16\xb9\x95\x11\x85\xa5\xb4\x5f\x32\x17\x51\x0a\xa8\x9d\xb8\x98\x49\x87\x6e\x10\x2d\x86\xe5\x7a\xaa\x8d\x7a\xed\x91\x12\xaf\xba\x9b\x61\x84\xdb\x71\x53\x31\x2a\x62\x5d\xad\xa0\xe2\x9c\x39\xf3\x62\x49\x02\xdd\x49\x7a\x3c\x5e\xf9\x8a\x4b\x6a\xa6\x33\x32\xf7\xd3\xe2\xb9\xf1\xac\x3e\xa8\x2e\xa6\xad\xcd\xd6\x0e\xed\x61\x77\xb9\x6d\x98\xcd\x5c\x2a\x5f\xf4\x1a\x08\x8e\x70\xcb\xb7\xe4\x95\x36\xd3\x87\x15\xdc\x7f\x56\xec\xe7\x3b\xd9\xbd\x46\x7e\xaf\x93\x55\x56\xe5\xe9\xec\x81\x4e\xf6\x57\x0e\xfc\x7f\xca\xc9\x1e\x3c\xbb\x77\xbb\x93\xbd\x3a\xa1\xe1\xb2\x38\x5f\x38\x8a\x6a\x4f\xff\xb6\x93\xa5\x53\xc5\xb4\xbb\x34\x2b\x58\x72\xcb\x69\x73\x08\x5a\x55\x4b\xb3\x93\x93\xa4\x3e\x1b\x6c\x25\xa3\x94\xa9\x7b\xed\x5c\xb3\x03\x22\xd6\x70\x17\x69\x89\xfa\x9b\xca\xaa\xd2\x40\x91\xda\xf4\xa8\xb1\x8a\x33\xfe\x3a\xaa\xf9\x54\x82\x0d\xde\xae\x97\x26\x05\x48\x45\x45\xdf\x90\xc2\xce\x11\xca\xad\x01\xab\x65\xfd\x2d\x9f\x30\x2b\x99\xa3\x64\xe6\xb5\x33\x93\x29\xa9\x16\x67\xc1\xb2\xcd\x20\x1c\x55\xcb\x8b\x3c\x75\x94\x62\xee\xf4\x9e\x80\x9f\xef\x64\xf7\x1a\xf9\xbd\x4e\x56\x06\x63\x94\x7e\x64\x4b\xf6\x17\x8e\xbe\x7e\xca\xc9\x1e\x3c\x95\x7b\xbb\x93\xbd\x3a\x8b\xe3\xb2\x38\x5f\x38\x2f\x6e\x4f\xff\xb6\x93\x65\xcc\xea\x82\x6f\x17\x23\x27\x48\xf2\xa6\x59\xec\xf5\x6c\x80\x9a\xa3\x72\xba\x5c\xee\x45\xb9\xb5\xdf\xf1\x1b\x52\xa1\x28\x46\xce\x1c\x5a\x6e\xae\x1d\x97\x17\x3d\x58\x0a\x3b\x56\x73\xb0\x69\xa4\xf3\xc9\xee\xd2\xe1\x41\x6f\x65\xd4\xd8\x8c\xa8\xc3\x4c\xc3\x36\xa6\x23\xbb\xd6\xaf\xec\x1d\x21\x83\x1a\xd9\x34\x18\xcc\xc3\xd8\x98\x14\xf3\x9d\xaa\x4e\x4d\xbb\xc7\x49\xd1\x35\xb7\xeb\xb1\xa8\x15\x8a\xa5\x92\x10\xeb\x6a\x11\x9c\x3a\x17\x3f\xdf\xc9\xee\x35\xf2\x7b\x9d\xac\xa4\x24\xad\xc1\x23\x9d\xec\x2f\x1c\x6a\xff\xa4\x93\x3d\x74\xde\x3e\x13\xbb\xcb\x55\x66\x51\xed\xea\x75\x0d\x37\xa4\x46\x2b\x6e\xf3\x95\x95\x29\xcc\x32\x29\xa3\x2d\x66\x5b\x5e\xaf\xf5\x26\x81\xcf\xbc\x72\x47\x7f\xb9\x56\xf7\x9d\x3e\xd9\x61\xad\xea\x4d\x6b\x75\xe5\xd4\xf3\x75\xe2\x97\x7d\x96\x5f\x2f\x77\x6c\xd3\x4c\x4a\x65\xe1\x6d\xd7\xae\xcf\x32\xa6\x82\x4a\x85\x4d\x3a\x06\x6a\xb2\xa0\x41\x5f\x4a\x36\x64\x48\x8a\xda\xd6\x9a\x40\xc7\x2d\x76\xa1\xef\xf8\x72\xce\x0c\xca\x9d\x08\xce\x3b\x52\xd2\x68\xcf\x42\x09\x4a\x14\xa6\xb1\x5e\x41\x85\x52\xa8\xf8\xe9\xb2\x6e\x1e\x9c\xa2\xb4\x60\xa9\x6a\x09\xac\xd3\x75\xee\xe1\x01\x1c\x71\xa3\xbd\xb4\x23\xc6\xf5\xc1\x3a\x63\x47\x38\xa8\x26\xfb\xc3\x95\x36\x0a\xc0\xa9\xf6\xae\x3b\x5c\xff\x65\xa5\xbe\x70\xb8\x3d\x76\x87\x2c\xe0\xcc\x4c\x6f\x48\xad\x8b\xd5\x53\x5d\xbc\x71\xbd\xb1\x4e\xeb\x85\xc3\x3f\x44\xfe\x1b\xc1\xe6\x33\xf2\x1f\x3d\xc7\x72\xd3\xda\xb4\x47\xcb\x7f\x8d\xc7\xfb\x01\x27\x73\x46\xf3\x45\xf9\xb9\x4e\xfb\xc9\x1e\xcb\x5d\x25\x07\xc4\xb0\x8a\xf4\x8d\x66\x80\x5a\x94\xcf\xba\x4b\x26\x61\x49\x6a\x6b\xa4\x3f\x52\xa6\xe5\xf1\x54\xab\x63\x75\x6c\xc8\xcb\xb3\xaa\x38\x39\xdc\xea\x12\xbf\x4f\x05\xa4\x07\x2f\x68\xb9\x7d\xf3\xc0\x5f\x18\x90\xce\x16\xfb\xa7\xb5\xf1\xb4\xd4\x85\x73\x79\x89\xeb\xce\x86\xd4\x2a\x62\x9c\xb5\xa5\x56\xcb\x54\xbd\xf5\x7c\x6c\x82\x74\xe0\xf6\xc2\x6a\x8c\xdd\xaa\x84\x60\xdd\x1e\x0f\x21\x6f\xb6\xda\x8e\xc8\x04\x4b\x06\x6a\x3a\x75\x86\x99\xde\x3a\x1e\x76\xf4\x49\x54\x5e\x8c\x26\xe9\xe9\x66\x94\xd6\xfb\xfb\xa0\xb1\x6c\x0f\xe3\x25\xd7\xe3\x86\xeb\xf6\x06\xeb\x75\xa9\xeb\x23\x6e\x07\x03\x16\xcc\x36\xa0\x30\x2d\xf7\xe6\x4b\x56\x2a\x27\x55\xdb\x8a\x4f\x6b\x04\x1f\x15\x90\x6e\x18\x50\x7b\x68\x40\xba\x53\xfe\x03\x03\xd2\xbd\x93\x31\xf7\x06\xa4\x87\xc8\xbf\x23\x20\x7d\x55\xfe\x4f\x0f\x48\x0f\x5e\xe9\x75\x7b\x40\x7a\x67\x40\xed\x10\x90\x1a\x9d\x4e\xf3\x58\xc9\x9f\x4f\x33\x7b\x1f\x04\xa4\x6a\xca\xb7\x27\x01\x29\xe9\xe3\x66\xd5\x21\xac\x5e\xad\x7a\x7a\xa6\xb7\x71\xd7\x49\x13\x0c\x78\x37\xa8\x28\x1d\x57\xc9\x96\x6a\xba\x5e\xec\xe5\xfc\x98\xc5\x23\xc3\xdc\xd4\x15\x16\x75\xda\x9b\x15\xed\xca\xb0\x98\x1a\x8b\x7a\xb7\x6f\x6f\x54\x98\x1e\x79\xd6\xb0\x95\x42\xf5\x60\x1f\x34\xd6\x28\x52\xea\x29\xc3\x5d\xd7\x54\x55\x8e\x94\x1a\xb1\x5d\xb5\x20\xcf\xb9\x55\x69\x90\x65\x4f\x91\x74\xa0\xe1\x52\xad\x6f\x9d\x29\xf6\x77\x09\x48\x6f\xec\xdc\xfa\xcb\x02\x92\x71\xbb\xfc\x1f\x32\x3b\xfc\x85\x80\xf0\xe8\x80\xf4\xd5\xd9\x69\x5d\xbf\x33\x20\xdd\xb1\xf3\x4f\x7f\x44\x40\x7a\xf0\x12\xc8\xdb\xbb\x6c\x7f\x61\x40\x3a\xeb\xb2\x55\xf3\x30\x5f\xaa\x6a\x1e\x02\xac\x22\xd5\x4b\xb0\x6d\x49\x6e\x2f\x2c\x64\xfb\x23\x91\x2f\x37\x7a\xb9\x96\x1a\xf9\xc6\xbc\xaa\xe6\xfc\x5a\xb6\xa5\xb2\x4e\x24\x03\x0b\x9b\xad\xda\x00\x15\x0a\xa8\xce\x06\xd0\xe4\x86\xc4\x10\x5a\x95\x5d\xa1\xe4\x37\x0d\xb2\x9c\xad\x56\x60\x1f\x34\x7a\x4b\x5f\xa7\xb8\x3f\x01\x71\xe0\xb9\x8d\x7c\x59\x5e\xb7\xfa\x46\x81\x66\xda\x49\x65\xb9\xf1\x1b\xbd\x4d\xb5\x9d\x4f\x26\x17\x8d\x54\xee\xb4\x9a\xff\x6f\xd2\x65\xbb\x3b\x20\xdd\x29\xff\x81\x01\xe9\x21\xcb\xe2\xee\x08\x48\x7f\xf5\xb2\x3c\x5d\xbf\xb3\xcb\xf6\xb3\x03\xd2\x83\xd7\x06\x7f\x31\xcd\xfb\x5c\x97\xed\x50\xa8\x2f\xb6\xba\x77\xec\x0f\xcf\xce\xd3\xce\x79\xd7\xa5\xf0\xac\x6f\x3d\x1f\xd4\x6b\x5e\x06\x14\xb2\x69\x0f\xb4\x09\x2b\x58\xc8\x9f\x0c\xe4\x60\x9c\x75\xf8\x34\xc6\xd3\xf9\xb8\x5e\x30\x63\x18\x2f\x1a\x65\x3a\x18\x48\x5e\xa5\xbe\x6a\x2b\x72\x85\x2c\x93\x7e\x5c\xac\x47\xba\xc2\xa0\x48\xf7\x62\x2d\xdf\x9f\xa5\xa0\x96\x2b\x8f\x7c\x9b\x4a\xf5\xd5\x3e\xc8\x94\x32\x62\x18\x69\x78\xb3\x8a\x65\x6d\x2b\xba\xa0\x99\x32\x2c\x31\xcc\xcf\x2a\x01\x2c\x64\x9c\x5c\x2a\x08\xe3\xa9\x54\x71\x37\xfd\xca\x69\xfb\xdd\xf5\x00\x76\x61\x04\x6f\x04\xb0\x73\xc0\x6f\x98\x69\x2a\xfa\xa7\xba\x7b\xe3\x7a\x3f\x80\x3c\x50\xfe\x6d\x5d\xbc\xcb\xf5\x76\x7f\xbb\x2e\x8e\xfe\x72\x9d\xfb\x5f\xad\x5f\x33\xc8\x11\xf7\xee\x00\xf3\xe0\x45\xf0\x5f\x8c\x92\x5f\x09\x30\x5f\x6c\x45\x6f\xcb\x90\x0e\xeb\x50\x2f\x02\x4c\xf6\x59\xdf\x7a\xd6\x1d\x76\xd3\xe5\xcc\x68\x6a\x95\xb7\xac\x96\x43\x01\xe1\xf3\x76\xa1\x12\x99\xa0\x3b\x8c\xe3\x6e\x36\xa5\xa7\x9b\x25\x5a\xb0\x58\x12\xe4\xe6\x51\x2e\xb9\xf0\xd4\xa4\x18\x6f\x94\x6c\x63\xb3\xd0\xb4\x7e\x03\xa5\xb3\x85\x9c\x62\x4d\xdc\x4d\xd9\x6f\xce\xe5\x2d\xcb\x84\xda\xb1\xcb\xa6\xd6\x10\xa6\xf3\xd8\x71\x35\xad\x92\xb7\x5b\x6b\x2d\x1c\x06\xce\x3a\x6f\xf6\xbb\xfe\x6c\xb2\xc8\x85\x73\xbf\x3b\x5f\xc5\x9e\xeb\xe7\x4f\xd3\x15\x77\x05\x98\xb3\x56\xf3\x86\x59\xb6\xfb\x03\xcc\xe3\xe4\x3f\x30\xc0\xfc\x9d\x32\x04\xfd\xe5\x86\x8e\xbf\x5a\xbf\xc7\x04\x98\x07\xef\xf6\xb8\xbd\x4b\xf5\xce\x7a\x8e\xc3\x69\x07\xb7\x07\x8c\x3b\xa2\x78\x66\x41\x37\x1f\x9e\x58\x73\xd6\x45\xcb\x22\x7d\xbc\xc9\x24\x7b\x72\x2d\x60\x28\x37\x42\x13\x3a\xe9\x2f\xa7\x85\x36\xb7\x2d\x99\x2c\x16\x3e\x32\x7a\x6a\x85\xa5\x58\xd1\xcf\xd5\xe9\x3c\x1e\xa4\xab\x81\xbe\xca\xf8\x71\x6b\x22\xe5\xb7\x29\x07\x87\xa2\x31\xeb\xb1\x62\xbf\xc9\xeb\xc9\x59\x96\xb5\xfd\x14\xac\xe9\xd9\x7d\x90\xb0\xba\x38\x2a\xac\xea\x9b\x05\x5e\xb8\x3e\xdf\xa6\xc7\xb2\x12\x14\x5b\x33\x6b\x53\x9d\xd6\x34\x59\x12\xbe\x50\xda\x46\xb2\x5d\xac\xfa\x27\xcd\xae\x07\xa0\xeb\xbb\xb0\xbf\xda\x0d\x3a\xe1\x71\x87\x11\xdf\xf6\xea\xb8\x83\xbe\xcf\x4b\x09\xae\x0f\xcc\xbe\x19\x58\xdd\xdb\xcb\x5c\x55\x43\x53\xd2\xf5\x97\x5d\x9d\x57\xd3\xd3\x1f\x04\xd6\xc7\xc9\xcf\xdc\x24\xff\xd4\xf5\xcd\x9f\x3d\xff\xd5\xae\xdf\x33\xbf\x1b\x5f\x1f\xa8\xdf\xd7\xcb\x38\x5b\x1e\xf0\xc6\xe6\x94\x97\x43\x0d\xb7\x25\x29\x77\xe8\xb7\xbf\x9c\xe7\xe8\x4c\xf4\xb7\x92\xa8\xb4\xfb\x37\xd3\xef\x72\xf9\xc5\xd5\xeb\x87\xec\x2c\xfb\x89\x3b\xfa\xbe\xba\xb3\x6d\x4f\xff\x37\x6d\xf8\x2f\xf0\xf9\xfb\xe8\xf7\x7a\x21\xf4\xcb\xe5\x60\xaf\xde\x60\x7d\x75\x01\xea\x43\xb7\x49\xde\x9e\xb0\xbc\xb3\x36\xee\x67\x26\x2c\xdd\x31\xaa\xa7\x8d\xea\xa8\x57\xb8\x04\xf7\xcc\x38\x4e\x09\x4b\x21\x70\x84\x6c\xbb\x7c\x94\xe6\x08\x29\x7a\x38\x0f\x4b\xe5\x11\x4c\x79\x54\xb1\xcb\x54\xed\x4f\xf2\xa9\x4a\x19\x2f\x72\x9d\x46\xa9\xdb\xb2\x67\x60\x32\xb3\x4b\x06\x05\x76\xae\xa1\xea\x59\xdf\x28\x64\x52\xb9\x4d\xd1\x2d\x0d\xe5\x96\x67\x55\x67\x25\xb9\x90\x6b\x8c\xbb\xf5\xc3\xdb\x6d\xcb\x75\x30\x6d\x0d\x94\x45\x05\xb6\x0c\x1f\x69\x73\x3b\x72\x3b\xf3\xd2\x68\x3a\xcb\x2b\x23\xa3\x0b\x87\xf5\x06\x99\x99\x2b\xbf\x37\x5c\x9f\x7a\x29\x3f\x3c\x61\xd9\x3b\xfb\xcf\x49\x58\x2c\xda\x9a\xe9\x59\x13\x59\x8c\x5d\x0d\xae\x6f\x26\x2c\xf7\x8d\x55\x9b\x87\x01\xaf\xeb\x63\xef\x47\x7b\xb8\x6e\x26\xaf\x13\x86\x7b\xe5\x67\xef\x94\x7f\xd8\x52\x7b\x7b\xc2\x72\x68\x60\x7e\x4e\xc2\x22\xcd\xaa\x63\xbd\x3e\x0a\xa4\xf5\xf6\xb9\x53\x71\x79\x9d\x25\xa8\x3f\x67\x54\xe5\x9d\x84\xe0\x4c\xcb\x6b\xfa\x9f\x6d\xf5\xfe\x1b\x37\x38\xac\x95\xdc\xbe\x42\x7d\x4f\x7f\x76\x2a\xdb\x17\xdb\x84\x3d\x1e\x85\x93\x7d\x7d\x6e\xa3\xe2\xd9\x55\xff\x11\xf2\x5f\x65\x2e\x6f\xcb\xdf\x97\xff\xec\x58\xd4\xaf\xca\xbf\x23\x26\xee\xaf\xc2\xc5\xbc\xe7\x59\x42\xff\x76\x1b\x76\x2a\x53\xfa\xef\x96\xe0\xef\xf5\x4f\xcb\xd6\xa0\x96\xba\xae\xf6\xa7\x46\x66\x1e\x7c\x2e\xc1\xed\x89\xce\x87\x67\x09\xff\x94\x44\xc7\x48\x2e\x8f\xdd\x85\x9c\xfe\xa6\x75\x9f\x25\x3a\x79\x63\x59\x6e\x54\x57\x85\x38\x9f\x47\x53\x58\x2b\x02\xd3\xdc\xca\xb9\x46\x21\xdf\x5e\x6b\xdd\x8d\x3b\xb7\x7a\x05\xab\x5e\xb3\x40\x7f\x36\x4e\x05\x2d\x6b\x12\x17\xf5\x45\xcd\x57\x61\x6e\x90\xac\x62\xc7\x9c\x2e\x59\xc1\x71\x2a\xe5\x4e\xc5\xc8\x65\xac\x4c\xcb\xcd\xf9\xa1\x59\xaf\xec\x13\x9d\xa6\x1b\xa6\xed\x59\xb3\x90\x4d\x4f\xbb\x5d\x3b\x13\x64\xd7\x4b\xd7\x76\xba\xed\xd6\x44\xe8\xb6\x0e\x65\x33\xe8\x8a\x56\x30\x8f\x0b\xe3\x8f\xd6\x3b\x3f\x30\xd1\xb9\xf7\xac\xe6\x3b\x9c\xba\x8c\xc8\x51\xe8\x5e\x9f\x57\xad\xfb\x5b\x89\x8e\x71\x47\x99\x77\x89\xc6\x21\xbb\x39\x25\x1a\xaf\x6d\xe2\xfd\x44\xe3\x81\xf2\xdf\xb0\xc9\x4f\x27\x3a\x07\xfc\x6e\x4f\x74\x0e\xaa\xfc\x9c\x44\xe7\x74\xc8\xf7\x5e\x9f\xab\x5d\xe8\xb3\xc4\xf6\x7f\x53\xe0\xd6\x5f\x9e\xad\xf2\xf7\x59\x67\x7e\xd0\xbf\x5c\xae\xf7\x1c\xf2\xb6\xea\x2b\xfd\xe5\x70\xe1\x2d\x89\xc6\xf9\x89\x0c\xd7\xeb\xf7\x83\x44\xe7\xd1\xf2\xdb\x9f\x97\x7f\x4a\xf4\x6e\x4b\x74\xee\xf0\xa7\x92\xdb\xdb\xbc\x97\xe8\x9c\xa9\xbf\xae\xe1\xeb\xc9\xe3\x21\x3e\xfd\x8d\x3b\x06\xa5\xcc\x62\xf1\xa2\x73\xf7\xb9\x8d\x58\x8f\x3d\x08\xe8\xf6\x65\xc6\x1f\x4e\x41\xfd\x94\x97\x26\x9c\x8e\x59\xf9\xdc\x4b\x13\xca\x43\xbe\x44\xfd\xc6\xd6\x8d\x8b\x33\x6c\xc2\x92\xb5\x69\x57\xad\x6c\x2b\x40\x53\xc4\x52\x0d\x1e\xf6\x72\xb1\x9f\x6d\xda\x75\x39\x55\xad\x58\x3d\x31\x1e\xa7\x64\x11\x80\x3e\x93\x81\x1a\x95\xd4\xe4\x66\xd8\x2a\x57\x36\x86\x57\x37\x7d\x3f\x53\x89\x7b\x33\xab\x53\xd4\xdc\xc3\x3e\x0a\x23\x65\xea\xb9\xf4\x4c\x4e\x85\xf3\xd9\x78\xac\x19\xb5\xb8\x5b\x68\x0e\x22\x7f\x3b\x4b\x57\xc6\xb3\x01\x4a\x97\xb2\xcb\x52\xb9\x3a\x59\x4e\x3e\x9a\x03\x3f\x33\xf0\x9b\x82\xe8\x19\xbf\xdb\x9d\xf2\xec\x98\x98\x3b\x82\xf2\xa9\x7e\x8c\x67\xa3\x7f\x2b\xc1\x39\xab\xbb\x1b\x96\x41\xdf\x3d\xf5\xf4\x40\xf9\x37\x4d\x3d\x19\xa7\xa1\xf6\xff\x9d\x0d\xe8\x5e\xec\x58\xff\x19\x3d\xe5\xbd\xad\xbe\xd3\x80\x4c\xea\x65\x25\xf5\x6a\x64\xed\xf9\x3a\x1b\x59\x3a\x40\xff\x7f\xdb\x74\xef\x45\xfd\x18\x37\xd5\xcf\x19\xff\x9f\xd2\xa9\xfd\x54\xac\xbf\xdb\x7f\xfe\x92\x91\xb6\xa0\x8a\xf0\x3b\xf5\xf3\x97\x27\x60\x99\x8c\x67\x7d\x2e\x01\x33\x32\x66\xa7\x7f\xa9\xf9\xab\xa9\xe4\xaf\x2e\xa8\xbd\xdd\x9e\x0e\xd7\x67\xa6\x92\x8d\xfa\x4f\xd1\x8f\x6f\xbb\xed\x8f\xf4\x3b\x5b\x34\xfb\x73\x16\x24\xff\x68\xfc\xee\xd0\xaf\x52\x35\xc1\x7b\xfa\x7d\x26\x89\x7e\xf4\xa9\x8e\xb7\x67\xd1\x1f\xce\x8b\xde\xdb\x75\x3f\x65\x6d\xef\xb4\x04\xf4\xa9\x66\xd2\xba\x04\x1c\x69\xc2\xd7\xa5\x8d\xba\x8c\x97\xf5\x81\x9a\x0f\x8c\x88\x21\x6d\x6d\x82\x65\x9a\xad\xaa\x59\x6a\x4c\xb4\x5c\xec\x27\xe1\xac\x93\x2b\xdb\xf5\xde\xd6\x68\x9b\xdb\x56\x81\x2e\xd8\x2c\x95\x84\x32\x93\x27\x39\x1a\x6a\xeb\x32\x89\x69\x21\xae\xa6\x93\x83\x70\x25\x65\xdc\x43\x96\x37\x5d\x17\x23\x73\x2c\x0f\xab\x85\xb1\x3f\xdb\x82\x69\xbe\x5a\x1f\xd5\x9b\x9e\x1b\xa4\xd9\x18\x68\xf5\x91\x57\xc9\x04\xeb\xe4\x04\x01\xfd\xa3\x7d\x33\xd7\x87\xfe\xbe\x9a\xa5\x9d\x98\xde\x9b\x25\x1d\xbc\x7a\x7f\x5d\x5f\x60\xf3\x76\x96\xeb\xde\xae\xff\xd5\xf9\xca\x9b\xb2\xcc\x87\xc8\xcf\xde\x22\xff\x30\x2c\xf1\x43\x0e\xe6\xfc\x89\x27\xa2\xee\x05\x3d\xe6\x60\xd0\xfd\x15\x9c\xca\xf3\xd5\x83\x41\x4f\x82\xff\x9a\x58\xb2\xa7\x3f\xcb\x5a\xbe\xaa\xef\xed\x59\xef\x3b\x59\xcb\x65\x1d\x04\x7f\x33\xfd\x5e\xf9\xc8\x29\x9e\x1c\xae\xcf\xb4\x6a\x8f\x3e\x32\xf7\xbf\x2f\xd4\xfc\x11\x2f\xd4\xdc\xb7\x04\xb3\x2a\x9c\xd4\x11\x56\xac\x4d\x9c\x99\x2d\xe6\xb3\xad\x07\xfb\x93\xb5\x3b\x5e\x44\x05\x93\x2c\x32\x0d\xe0\xd7\x70\x55\x6a\x7b\x66\xf3\x64\x19\x7f\xe7\xb1\xa1\xb3\xf9\xc5\x3b\x5a\xd2\xe7\xfa\xf9\x78\x6c\xe8\xbe\x2d\xf2\xaf\x26\xbf\x3e\x5c\x65\x73\x96\xbb\xbf\x7d\xed\x9f\x29\x9f\xbe\xdf\xd2\x8a\x9c\x1f\x24\xdf\xd6\x1f\x7b\xbc\x74\xa0\xbf\x1c\x5b\xfb\xcb\x27\x93\xde\xee\xfb\x1c\x1a\xec\x8e\xbe\x1c\x7d\x34\x99\x54\x3e\xc3\xe0\xaf\x1b\x0b\x33\xa6\x6a\x71\xf5\x4e\x5f\xde\x1c\xf7\xac\xe5\x47\x93\x49\xff\xb7\x8f\xb5\x9c\xd5\xcf\xff\xce\x65\xf2\x0d\x85\x1e\xe3\xe9\x07\xcb\xe4\xef\xf1\x9f\x3b\x26\x97\xde\xee\xfb\x5e\xd6\x87\x59\x19\x76\xae\x67\xe2\xf7\xf8\xcf\xed\x6d\x6f\x3d\x5d\xd9\xbc\xe7\x3f\x67\xd7\xd5\x20\x7b\x6f\x56\x79\xef\xbc\xc7\xa7\xb2\xca\xe8\xa7\xe8\x57\xb2\xc7\xfe\x87\xfa\xed\xf1\xfb\x5f\x97\xf5\x3e\xeb\x6b\xdc\x31\x96\x78\xc7\x58\x93\xde\xaa\x44\x9f\xf3\xb7\x57\xed\xef\x1f\xef\xbd\x3a\x61\x31\x73\x43\xca\x1f\xf2\x1a\xe5\x97\xac\x9e\x3b\x03\xe7\x2f\x40\x38\xd8\xe6\x29\x97\xba\x32\xd1\xfc\x36\x97\xe7\x13\xf2\x56\x7a\xad\x3e\xd6\x5f\x71\x79\x2a\xe1\xa1\x60\x94\xb1\x60\xe1\xc7\x7c\x57\xdc\xb3\xcf\x7f\xce\xc6\xe2\xb9\x98\x46\xd5\x6a\xb6\x1a\xba\x69\xb5\x3e\x28\xa6\x5e\x6e\x65\x1b\x47\x54\xaa\x56\xb9\x7f\xce\xf1\x97\x44\x22\x91\xd0\x33\x99\x33\x6e\xaf\x04\x26\x6a\x0d\xb3\xa2\x37\xfa\x89\x52\xb6\x9f\xf8\xed\x78\xd7\xe3\xdf\x13\x3b\x0a\x9f\x4e\xc5\x5b\xea\x47\xcf\x1f\x1e\xab\x78\xf4\x8e\xd6\xd1\x7b\x2a\xbf\x52\xd4\xa6\xfe\xee\xff\x07\xa9\x67\x53\xff\x9a\x66\x4f\x02\x5e\x2a\xe5\x07\x5c\x5c\xd1\x68\x22\xb8\x2b\xc2\xa1\xa0\x5c\x84\xd1\xcb\x6f\x7f\x1e\xbe\x45\x62\xfe\xe7\x43\xd4\x7d\xc1\xfc\x9a\xe2\xef\x48\x4f\xb4\x2d\xb3\xde\xce\x26\x7e\x7b\xfe\xf5\x4b\x25\x79\x0c\xde\x5f\x2c\xc0\xeb\x3a\x38\xde\xa7\xd1\xf0\x95\xf6\x81\xe3\xec\xd4\x3e\xfc\xf3\x20\x7d\x0f\xcc\xae\x29\x7a\x26\xe6\xa5\x86\xfb\x1b\x57\xcc\x64\x26\x76\xda\xed\xff\x3e\x48\xb9\x3d\xaf\x6b\xba\x9d\x84\xbc\x54\xcd\x9b\x7d\x4f\xcc\x82\x30\x7e\xad\xdb\x4e\x5e\x34\x9c\x2f\xc4\x42\xbc\xf8\xf2\x28\x4d\xcf\x58\x5e\x55\xf8\x52\xe4\xb5\x4a\xbf\xa6\x75\xb4\xb0\x8f\xff\x3c\x4e\xd3\x68\x61\xbf\xa1\xe3\x93\x98\x97\xda\x85\x22\xba\x52\xdd\xf3\x45\x10\x2e\xa6\x9e\xef\x04\x67\x1f\x1f\xa4\xe4\x89\xe1\x35\x45\x2f\xc4\x7d\x2a\x86\x45\x6c\x76\x78\x2c\x3a\xfb\xf8\x20\x6d\x4f\x0c\xaf\x69\x7b\x21\xee\xa5\xb6\xf3\x48\xc4\x57\x7d\x7d\xd7\x58\x8b\x28\xa6\xb1\x38\xfb\xf8\x28\x7d\x9f\x19\x5e\xd5\xf7\xa5\xb8\x97\xfa\xee\x7f\xbf\xda\xbe\xc6\xe1\x22\x8a\x27\x9e\x2f\xa2\xb3\x8f\x0f\x52\xf8\xc4\xf0\x9a\xc2\x17\xe2\xde\x4c\x0d\xbc\x28\x5a\x88\xf0\x7b\x82\x46\x91\x88\x59\xc0\xaf\x94\xe1\xfc\x75\x65\xe7\x5f\x1e\x55\x8e\x33\x96\x57\x4b\x72\x29\xf2\x5a\x94\x88\xc4\xfc\x7b\x22\x5e\x7b\x3e\x17\xeb\x2b\x25\x38\xa9\xff\x68\xdd\xdf\x55\xfc\x2e\xad\x2f\x52\xd4\x97\x5f\x1f\xa4\xff\x4b\xa6\xd7\x0a\x71\x45\xec\x9b\x25\x39\xd2\x5e\x2f\xce\xd1\xe6\x6c\x3a\xa1\x3e\x13\xd1\x93\xee\xa6\x95\xc9\xf6\x3e\x50\xdb\x68\x64\xf5\x56\xf6\x40\x7a\xc9\x27\x51\xb5\x4e\x59\x6c\xbb\x69\x5a\xf9\x84\x1d\x87\x42\x24\x7e\x3b\x52\xfc\x23\xd1\x2d\x64\x1b\xd9\xe7\xef\x89\xff\xf9\x23\x21\x81\xa7\xeb\x75\xa2\x29\xa2\xf8\xd0\x96\xef\x4a\x71\xb3\x96\x2f\xd9\xec\x94\x3c\xe6\x29\x2f\x54\x8c\xc4\x64\xe2\xf9\xee\xde\xf7\xbe\x27\xec\xc5\xe6\xf4\x65\x16\x7a\xec\xb5\x2f\xee\xaa\xc1\xde\x44\x62\x7e\xb3\x62\xcf\x1c\x76\x3a\x9d\x1c\xe3\x85\x5a\x6f\xa7\x8a\x3b\x72\x47\x88\xfb\x55\x78\x62\x72\xd0\xe2\x2c\xc0\x7c\x52\x91\xe3\x9d\xfb\x14\x39\x67\xb2\x53\xe4\x65\x22\xfc\x49\x4d\x22\x36\x13\xfe\xf2\x4e\x4d\xce\x99\xec\x34\x89\xd8\xec\x8b\x80\x9c\x1a\xd4\xbb\x35\x39\xe7\x73\x54\xe6\x29\x4b\x78\xa9\x0c\x8d\xe2\xb7\x15\x3a\x0b\x1c\xf7\x69\x74\xc9\x68\xa7\xd2\x45\x6c\xfc\x10\xa3\x5a\x10\xc5\x6e\x28\x9a\xf5\xf2\xbe\x2f\x6c\xd3\x48\x24\xf8\x62\x3a\x4b\xb0\x60\x3a\x9b\x88\x58\xec\xc5\xfe\x7f\x01\x00\x00\xff\xff\x65\xba\xd4\xb0\xf0\xfc\x00\x00") func tradesCoreSqlBytes() ([]byte, error) { @@ -1461,68 +663,30 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "account_merge-core.sql": account_mergeCoreSql, - "account_merge-horizon.sql": account_mergeHorizonSql, - "allow_trust-core.sql": allow_trustCoreSql, - "allow_trust-horizon.sql": allow_trustHorizonSql, - "asset_stat_account-core.sql": asset_stat_accountCoreSql, - "asset_stat_account-horizon.sql": asset_stat_accountHorizonSql, - "asset_stat_operations-core.sql": asset_stat_operationsCoreSql, - "asset_stat_operations-horizon.sql": asset_stat_operationsHorizonSql, - "asset_stat_trustlines_1-core.sql": asset_stat_trustlines_1CoreSql, - "asset_stat_trustlines_1-horizon.sql": asset_stat_trustlines_1HorizonSql, - "asset_stat_trustlines_2-core.sql": asset_stat_trustlines_2CoreSql, - "asset_stat_trustlines_2-horizon.sql": asset_stat_trustlines_2HorizonSql, - "asset_stat_trustlines_3-core.sql": asset_stat_trustlines_3CoreSql, - "asset_stat_trustlines_3-horizon.sql": asset_stat_trustlines_3HorizonSql, - "asset_stat_trustlines_4-core.sql": asset_stat_trustlines_4CoreSql, - "asset_stat_trustlines_4-horizon.sql": asset_stat_trustlines_4HorizonSql, - "asset_stat_trustlines_5-core.sql": asset_stat_trustlines_5CoreSql, - "asset_stat_trustlines_5-horizon.sql": asset_stat_trustlines_5HorizonSql, - "asset_stat_trustlines_6-core.sql": asset_stat_trustlines_6CoreSql, - "asset_stat_trustlines_6-horizon.sql": asset_stat_trustlines_6HorizonSql, - "asset_stat_trustlines_7-core.sql": asset_stat_trustlines_7CoreSql, - "asset_stat_trustlines_7-horizon.sql": asset_stat_trustlines_7HorizonSql, - "base-core.sql": baseCoreSql, - "base-horizon.sql": baseHorizonSql, - "change_trust-core.sql": change_trustCoreSql, - "change_trust-horizon.sql": change_trustHorizonSql, - "core_database_schema_version_8-core.sql": core_database_schema_version_8CoreSql, - "core_database_schema_version_9-core.sql": core_database_schema_version_9CoreSql, - "failed_transactions-core.sql": failed_transactionsCoreSql, - "failed_transactions-horizon.sql": failed_transactionsHorizonSql, - "ingest_asset_stats-core.sql": ingest_asset_statsCoreSql, - "ingest_asset_stats-horizon.sql": ingest_asset_statsHorizonSql, - "kahuna-2-core.sql": kahuna2CoreSql, - "kahuna-2-horizon.sql": kahuna2HorizonSql, - "kahuna-core.sql": kahunaCoreSql, - "kahuna-horizon.sql": kahunaHorizonSql, - "non_native_payment-core.sql": non_native_paymentCoreSql, - "non_native_payment-horizon.sql": non_native_paymentHorizonSql, - "offer_ids-core.sql": offer_idsCoreSql, - "offer_ids-horizon.sql": offer_idsHorizonSql, - "operation_fee_stats_1-core.sql": operation_fee_stats_1CoreSql, - "operation_fee_stats_1-horizon.sql": operation_fee_stats_1HorizonSql, - "operation_fee_stats_2-core.sql": operation_fee_stats_2CoreSql, - "operation_fee_stats_2-horizon.sql": operation_fee_stats_2HorizonSql, - "operation_fee_stats_3-core.sql": operation_fee_stats_3CoreSql, - "operation_fee_stats_3-horizon.sql": operation_fee_stats_3HorizonSql, - "order_books-core.sql": order_booksCoreSql, - "order_books-horizon.sql": order_booksHorizonSql, - "order_books_310-core.sql": order_books_310CoreSql, - "order_books_310-horizon.sql": order_books_310HorizonSql, - "pathed_payment-core.sql": pathed_paymentCoreSql, - "pathed_payment-horizon.sql": pathed_paymentHorizonSql, - "paths_strict_send-core.sql": paths_strict_sendCoreSql, - "paths_strict_send-horizon.sql": paths_strict_sendHorizonSql, - "self_send-core.sql": self_sendCoreSql, - "self_send-horizon.sql": self_sendHorizonSql, - "send_to_issuer-core.sql": send_to_issuerCoreSql, - "send_to_issuer-horizon.sql": send_to_issuerHorizonSql, - "set_options-core.sql": set_optionsCoreSql, - "set_options-horizon.sql": set_optionsHorizonSql, - "trades-core.sql": tradesCoreSql, - "trades-horizon.sql": tradesHorizonSql, + "account_merge-core.sql": account_mergeCoreSql, + "account_merge-horizon.sql": account_mergeHorizonSql, + "base-core.sql": baseCoreSql, + "base-horizon.sql": baseHorizonSql, + "failed_transactions-core.sql": failed_transactionsCoreSql, + "failed_transactions-horizon.sql": failed_transactionsHorizonSql, + "ingest_asset_stats-core.sql": ingest_asset_statsCoreSql, + "ingest_asset_stats-horizon.sql": ingest_asset_statsHorizonSql, + "kahuna-core.sql": kahunaCoreSql, + "kahuna-horizon.sql": kahunaHorizonSql, + "offer_ids-core.sql": offer_idsCoreSql, + "offer_ids-horizon.sql": offer_idsHorizonSql, + "operation_fee_stats_1-core.sql": operation_fee_stats_1CoreSql, + "operation_fee_stats_1-horizon.sql": operation_fee_stats_1HorizonSql, + "operation_fee_stats_2-core.sql": operation_fee_stats_2CoreSql, + "operation_fee_stats_2-horizon.sql": operation_fee_stats_2HorizonSql, + "operation_fee_stats_3-core.sql": operation_fee_stats_3CoreSql, + "operation_fee_stats_3-horizon.sql": operation_fee_stats_3HorizonSql, + "pathed_payment-core.sql": pathed_paymentCoreSql, + "pathed_payment-horizon.sql": pathed_paymentHorizonSql, + "paths_strict_send-core.sql": paths_strict_sendCoreSql, + "paths_strict_send-horizon.sql": paths_strict_sendHorizonSql, + "trades-core.sql": tradesCoreSql, + "trades-horizon.sql": tradesHorizonSql, } // AssetDir returns the file names below a certain @@ -1566,68 +730,30 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "account_merge-core.sql": &bintree{account_mergeCoreSql, map[string]*bintree{}}, - "account_merge-horizon.sql": &bintree{account_mergeHorizonSql, map[string]*bintree{}}, - "allow_trust-core.sql": &bintree{allow_trustCoreSql, map[string]*bintree{}}, - "allow_trust-horizon.sql": &bintree{allow_trustHorizonSql, map[string]*bintree{}}, - "asset_stat_account-core.sql": &bintree{asset_stat_accountCoreSql, map[string]*bintree{}}, - "asset_stat_account-horizon.sql": &bintree{asset_stat_accountHorizonSql, map[string]*bintree{}}, - "asset_stat_operations-core.sql": &bintree{asset_stat_operationsCoreSql, map[string]*bintree{}}, - "asset_stat_operations-horizon.sql": &bintree{asset_stat_operationsHorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_1-core.sql": &bintree{asset_stat_trustlines_1CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_1-horizon.sql": &bintree{asset_stat_trustlines_1HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_2-core.sql": &bintree{asset_stat_trustlines_2CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_2-horizon.sql": &bintree{asset_stat_trustlines_2HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_3-core.sql": &bintree{asset_stat_trustlines_3CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_3-horizon.sql": &bintree{asset_stat_trustlines_3HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_4-core.sql": &bintree{asset_stat_trustlines_4CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_4-horizon.sql": &bintree{asset_stat_trustlines_4HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_5-core.sql": &bintree{asset_stat_trustlines_5CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_5-horizon.sql": &bintree{asset_stat_trustlines_5HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_6-core.sql": &bintree{asset_stat_trustlines_6CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_6-horizon.sql": &bintree{asset_stat_trustlines_6HorizonSql, map[string]*bintree{}}, - "asset_stat_trustlines_7-core.sql": &bintree{asset_stat_trustlines_7CoreSql, map[string]*bintree{}}, - "asset_stat_trustlines_7-horizon.sql": &bintree{asset_stat_trustlines_7HorizonSql, map[string]*bintree{}}, - "base-core.sql": &bintree{baseCoreSql, map[string]*bintree{}}, - "base-horizon.sql": &bintree{baseHorizonSql, map[string]*bintree{}}, - "change_trust-core.sql": &bintree{change_trustCoreSql, map[string]*bintree{}}, - "change_trust-horizon.sql": &bintree{change_trustHorizonSql, map[string]*bintree{}}, - "core_database_schema_version_8-core.sql": &bintree{core_database_schema_version_8CoreSql, map[string]*bintree{}}, - "core_database_schema_version_9-core.sql": &bintree{core_database_schema_version_9CoreSql, map[string]*bintree{}}, - "failed_transactions-core.sql": &bintree{failed_transactionsCoreSql, map[string]*bintree{}}, - "failed_transactions-horizon.sql": &bintree{failed_transactionsHorizonSql, map[string]*bintree{}}, - "ingest_asset_stats-core.sql": &bintree{ingest_asset_statsCoreSql, map[string]*bintree{}}, - "ingest_asset_stats-horizon.sql": &bintree{ingest_asset_statsHorizonSql, map[string]*bintree{}}, - "kahuna-2-core.sql": &bintree{kahuna2CoreSql, map[string]*bintree{}}, - "kahuna-2-horizon.sql": &bintree{kahuna2HorizonSql, map[string]*bintree{}}, - "kahuna-core.sql": &bintree{kahunaCoreSql, map[string]*bintree{}}, - "kahuna-horizon.sql": &bintree{kahunaHorizonSql, map[string]*bintree{}}, - "non_native_payment-core.sql": &bintree{non_native_paymentCoreSql, map[string]*bintree{}}, - "non_native_payment-horizon.sql": &bintree{non_native_paymentHorizonSql, map[string]*bintree{}}, - "offer_ids-core.sql": &bintree{offer_idsCoreSql, map[string]*bintree{}}, - "offer_ids-horizon.sql": &bintree{offer_idsHorizonSql, map[string]*bintree{}}, - "operation_fee_stats_1-core.sql": &bintree{operation_fee_stats_1CoreSql, map[string]*bintree{}}, - "operation_fee_stats_1-horizon.sql": &bintree{operation_fee_stats_1HorizonSql, map[string]*bintree{}}, - "operation_fee_stats_2-core.sql": &bintree{operation_fee_stats_2CoreSql, map[string]*bintree{}}, - "operation_fee_stats_2-horizon.sql": &bintree{operation_fee_stats_2HorizonSql, map[string]*bintree{}}, - "operation_fee_stats_3-core.sql": &bintree{operation_fee_stats_3CoreSql, map[string]*bintree{}}, - "operation_fee_stats_3-horizon.sql": &bintree{operation_fee_stats_3HorizonSql, map[string]*bintree{}}, - "order_books-core.sql": &bintree{order_booksCoreSql, map[string]*bintree{}}, - "order_books-horizon.sql": &bintree{order_booksHorizonSql, map[string]*bintree{}}, - "order_books_310-core.sql": &bintree{order_books_310CoreSql, map[string]*bintree{}}, - "order_books_310-horizon.sql": &bintree{order_books_310HorizonSql, map[string]*bintree{}}, - "pathed_payment-core.sql": &bintree{pathed_paymentCoreSql, map[string]*bintree{}}, - "pathed_payment-horizon.sql": &bintree{pathed_paymentHorizonSql, map[string]*bintree{}}, - "paths_strict_send-core.sql": &bintree{paths_strict_sendCoreSql, map[string]*bintree{}}, - "paths_strict_send-horizon.sql": &bintree{paths_strict_sendHorizonSql, map[string]*bintree{}}, - "self_send-core.sql": &bintree{self_sendCoreSql, map[string]*bintree{}}, - "self_send-horizon.sql": &bintree{self_sendHorizonSql, map[string]*bintree{}}, - "send_to_issuer-core.sql": &bintree{send_to_issuerCoreSql, map[string]*bintree{}}, - "send_to_issuer-horizon.sql": &bintree{send_to_issuerHorizonSql, map[string]*bintree{}}, - "set_options-core.sql": &bintree{set_optionsCoreSql, map[string]*bintree{}}, - "set_options-horizon.sql": &bintree{set_optionsHorizonSql, map[string]*bintree{}}, - "trades-core.sql": &bintree{tradesCoreSql, map[string]*bintree{}}, - "trades-horizon.sql": &bintree{tradesHorizonSql, map[string]*bintree{}}, + "account_merge-core.sql": &bintree{account_mergeCoreSql, map[string]*bintree{}}, + "account_merge-horizon.sql": &bintree{account_mergeHorizonSql, map[string]*bintree{}}, + "base-core.sql": &bintree{baseCoreSql, map[string]*bintree{}}, + "base-horizon.sql": &bintree{baseHorizonSql, map[string]*bintree{}}, + "failed_transactions-core.sql": &bintree{failed_transactionsCoreSql, map[string]*bintree{}}, + "failed_transactions-horizon.sql": &bintree{failed_transactionsHorizonSql, map[string]*bintree{}}, + "ingest_asset_stats-core.sql": &bintree{ingest_asset_statsCoreSql, map[string]*bintree{}}, + "ingest_asset_stats-horizon.sql": &bintree{ingest_asset_statsHorizonSql, map[string]*bintree{}}, + "kahuna-core.sql": &bintree{kahunaCoreSql, map[string]*bintree{}}, + "kahuna-horizon.sql": &bintree{kahunaHorizonSql, map[string]*bintree{}}, + "offer_ids-core.sql": &bintree{offer_idsCoreSql, map[string]*bintree{}}, + "offer_ids-horizon.sql": &bintree{offer_idsHorizonSql, map[string]*bintree{}}, + "operation_fee_stats_1-core.sql": &bintree{operation_fee_stats_1CoreSql, map[string]*bintree{}}, + "operation_fee_stats_1-horizon.sql": &bintree{operation_fee_stats_1HorizonSql, map[string]*bintree{}}, + "operation_fee_stats_2-core.sql": &bintree{operation_fee_stats_2CoreSql, map[string]*bintree{}}, + "operation_fee_stats_2-horizon.sql": &bintree{operation_fee_stats_2HorizonSql, map[string]*bintree{}}, + "operation_fee_stats_3-core.sql": &bintree{operation_fee_stats_3CoreSql, map[string]*bintree{}}, + "operation_fee_stats_3-horizon.sql": &bintree{operation_fee_stats_3HorizonSql, map[string]*bintree{}}, + "pathed_payment-core.sql": &bintree{pathed_paymentCoreSql, map[string]*bintree{}}, + "pathed_payment-horizon.sql": &bintree{pathed_paymentHorizonSql, map[string]*bintree{}}, + "paths_strict_send-core.sql": &bintree{paths_strict_sendCoreSql, map[string]*bintree{}}, + "paths_strict_send-horizon.sql": &bintree{paths_strict_sendHorizonSql, map[string]*bintree{}}, + "trades-core.sql": &bintree{tradesCoreSql, map[string]*bintree{}}, + "trades-horizon.sql": &bintree{tradesHorizonSql, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. diff --git a/services/horizon/internal/test/scenarios/change_trust-core.sql b/services/horizon/internal/test/scenarios/change_trust-core.sql deleted file mode 100644 index e05aa0b732..0000000000 --- a/services/horizon/internal/test/scenarios/change_trust-core.sql +++ /dev/null @@ -1,733 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999700, 8589934595, 0, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('186b3bb606ad48284ac8e6e192ffec5ed11b0f113d1438887591071c1b6575b2', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '69b2226ee24347478a171c44c8778d4f3495fba49aa8d36038a3ee6745bdf3bb', 2, 1559579702, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMNgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('9efe990e515ee9afc9d77c1941bd78b60332f4fb2e77e825f7f945430c7ae8c9', '186b3bb606ad48284ac8e6e192ffec5ed11b0f113d1438887591071c1b6575b2', '90d0d3fb695b7e03b5c2de781e7a8839c18b2d4c713fb2e27f28d9a992860963', 3, 1559579703, 'AAAACxhrO7YGrUgoSsjm4ZL/7F7RGw8RPRQ4iHWRBxwbZXWyZdLxdBVSiPnsrA6mEcC24V5yM/OP1/9WlqlVHiezRRAAAAAAXPVMNwAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('b6e85fd882bc3d4d779234c1f16c49082ee277216a1f9f8d1ec571617533754b', '9efe990e515ee9afc9d77c1941bd78b60332f4fb2e77e825f7f945430c7ae8c9', 'f7a622d8ae0fc033c7545f092859a411bbfb2a894d0d0ef18e4e4c46af8893e2', 4, 1559579704, 'AAAAC57+mQ5RXumvydd8GUG9eLYDMvT7LnfoJff5RUMMeujJA/YCetmPPz3dqMUTty86T8avJCHvRTHDEZBASmYNPK4AAAAAXPVMOAAAAAAAAAAALG1UZnCzCamYL0dOv0yVmx9sJIXQO2l+Gr9BTnPshPn3piLYrg/AM8dUXwkoWaQRu/sqiU0NDvGOTkxGr4iT4gAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('5452787b07e5f0bc3359541076cb0282286e3e8647d5de09fd7801511264b544', 'b6e85fd882bc3d4d779234c1f16c49082ee277216a1f9f8d1ec571617533754b', '833e0f2c54328081ae3d8c70884614ea56c77c30a91093a6d8024ccfa2444821', 5, 1559579705, 'AAAAC7boX9iCvD1Nd5I0wfFsSQgu4nchah+fjR7FcWF1M3VLX6EpDWeDpdgOfYJIkfD2Ytg74/bF3rEDepNDsLpgHeYAAAAAXPVMOQAAAAAAAAAAtqD7ZvGzk5mv/AtZ7AfsBkliGMVUtteUvuL+rVvYC/6DPg8sVDKAga49jHCIRhTqVsd8MKkQk6bYAkzPokRIIQAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('3255d3bc8ff43e368bb695bc050974b60397e4bbaf660b4cc3f583065d556c8b', '5452787b07e5f0bc3359541076cb0282286e3e8647d5de09fd7801511264b544', '0684b2f9d3b62507cbda9965950da266e5345052253a4b71816248d96598793f', 6, 1559579706, 'AAAAC1RSeHsH5fC8M1lUEHbLAoIobj6GR9XeCf14AVESZLVEa6Tp072W0EkuY6/2dc+oc9aXVE3Ut+w/j9EIOTqSjX4AAAAAXPVMOgAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERkGhLL507YlB8vamWWVDaJm5TRQUiU6S3GBYkjZZZh5PwAAAAYN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GAMRKQHSSLDLFX7LYSGRCRDITABOGHMPPVVM7NII3HIZU6RXR3RNLX4K', 2, 'AAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAAAAAAIAAAACAAAAAQAAAEi7kf1wd3SoCxmP1DpjzIghzq62R/8I74ub/Qpux+vM9QAAAABc9Uw2AAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAAB4phH9vGKk0JgsrkwYAn644NQIx7WGQ6K2L46L9EZS2YAAABA3hka/k4r11fpW39GrccmUUr2LJ2Zeb5TAgu56WVxP6Yq7q/NjgqeB/ZgRr5ilq06EQV/isVCHQw7urKjG7XqAw=='); -INSERT INTO scphistory VALUES ('GAMRKQHSSLDLFX7LYSGRCRDITABOGHMPPVVM7NII3HIZU6RXR3RNLX4K', 3, 'AAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAAAAAAMAAAACAAAAAQAAADBl0vF0FVKI+eysDqYRwLbhXnIz84/X/1aWqVUeJ7NFEAAAAABc9Uw3AAAAAAAAAAAAAAAB4phH9vGKk0JgsrkwYAn644NQIx7WGQ6K2L46L9EZS2YAAABACP8nPO+bvUQvIZ91f1sWDtrgxo0jnFFMt7wNTtZs+T/Lh3FKakSmqErJTx7X/5rnfwkX49+ujbdsZkEdwl8oAQ=='); -INSERT INTO scphistory VALUES ('GAMRKQHSSLDLFX7LYSGRCRDITABOGHMPPVVM7NII3HIZU6RXR3RNLX4K', 4, 'AAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAAAAAAQAAAACAAAAAQAAADAD9gJ62Y8/Pd2oxRO3LzpPxq8kIe9FMcMRkEBKZg08rgAAAABc9Uw4AAAAAAAAAAAAAAAB4phH9vGKk0JgsrkwYAn644NQIx7WGQ6K2L46L9EZS2YAAABAOP7+lXQaX8I6BQlpDK8bgnL6M/03MqUDBQXIAfJqh64duyw9nGvY4BLG0db5yk/opR3qa6iGHOWkY79PGgGnCg=='); -INSERT INTO scphistory VALUES ('GAMRKQHSSLDLFX7LYSGRCRDITABOGHMPPVVM7NII3HIZU6RXR3RNLX4K', 5, 'AAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAAAAAAUAAAACAAAAAQAAADBfoSkNZ4Ol2A59gkiR8PZi2Dvj9sXesQN6k0OwumAd5gAAAABc9Uw5AAAAAAAAAAAAAAAB4phH9vGKk0JgsrkwYAn644NQIx7WGQ6K2L46L9EZS2YAAABAsK/Jv0dIzU9wIvnwWlNP06Ep3DMamCKQXpQlpRY71x3BkA1puVYSTLb4+OdwzqHpo+P9nhn505Jajd9RXkvVDw=='); -INSERT INTO scphistory VALUES ('GAMRKQHSSLDLFX7LYSGRCRDITABOGHMPPVVM7NII3HIZU6RXR3RNLX4K', 6, 'AAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAAAAAAYAAAACAAAAAQAAADBrpOnTvZbQSS5jr/Z1z6hz1pdUTdS37D+P0Qg5OpKNfgAAAABc9Uw6AAAAAAAAAAAAAAAB4phH9vGKk0JgsrkwYAn644NQIx7WGQ6K2L46L9EZS2YAAABACdsuXjqqRwpabwe49WMDCdWV0rsLwo6WzlVIbeklFifk79Rvzc1cfBP8sdJY8V+8udp3HgQZ6deBv/Mc5xEEDA=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('e29847f6f18a934260b2b9306009fae38350231ed6190e8ad8be3a2fd1194b66', 6, 'AAAAAQAAAAEAAAAAGRVA8pLGst/rxI0RRGiYAuMdj31qz7UI2dGaejeO4tUAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastclosedledger ', '3255d3bc8ff43e368bb695bc050974b60397e4bbaf660b4cc3f583065d556c8b'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 6, - "currentBuckets": [ - { - "curr": "056cd09fa286b2de1ff329b224259b858f94ec1dcc93f0e0512b2f6819348951", - "next": { - "state": 0 - }, - "snap": "7d36bdc9b3c5c49df25b3d919d30b64dd6733232ec93a33c81a9da7379ac3c02" - }, - { - "curr": "5e9b6cf93c3d773407f0bd3735e8d02aa3ab4e6e6a4c61f0126008e4c7cf7bf0", - "next": { - "state": 1, - "output": "7d36bdc9b3c5c49df25b3d919d30b64dd6733232ec93a33c81a9da7379ac3c02" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAAZFUDyksay3+vEjRFEaJgC4x2PfWrPtQjZ0Zp6N47i1QAAAAAAAAAGAAAAA+KYR/bxipNCYLK5MGAJ+uODUCMe1hkOiti+Oi/RGUtmAAAAAQAAAJhrpOnTvZbQSS5jr/Z1z6hz1pdUTdS37D+P0Qg5OpKNfgAAAABc9Uw6AAAAAAAAAAEAAAAAGRVA8pLGst/rxI0RRGiYAuMdj31qz7UI2dGaejeO4tUAAABA7EEhSEaR3nL6Go/F3AMeCJyMwTEpV8uGp/EKDXB8A99MeN00lNmxCMvclei6ycCaBHRpJSvgSH9nY7Qxwda1BAAAAAEAAACYa6Tp072W0EkuY6/2dc+oc9aXVE3Ut+w/j9EIOTqSjX4AAAAAXPVMOgAAAAAAAAABAAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAQOxBIUhGkd5y+hqPxdwDHgicjMExKVfLhqfxCg1wfAPfTHjdNJTZsQjL3JXousnAmgR0aSUr4Eh/Z2O0McHWtQQAAABAj1accIl2WV82ZoYIOXmHghce73wqmt24AfOVs8IjOvW/OwHCG4zz4AGeB1Ym9IwBmhKPyYKrmEH/S+VaUR3nCAAAAAAZFUDyksay3+vEjRFEaJgC4x2PfWrPtQjZ0Zp6N47i1QAAAAAAAAAGAAAAAgAAAAEAAAAwa6Tp072W0EkuY6/2dc+oc9aXVE3Ut+w/j9EIOTqSjX4AAAAAXPVMOgAAAAAAAAAAAAAAAeKYR/bxipNCYLK5MGAJ+uODUCMe1hkOiti+Oi/RGUtmAAAAQAnbLl46qkcKWm8HuPVjAwnVldK7C8KOls5VSG3pJRYn5O/Ub83NXHwT/LHSWPFfvLnadx4EGenXgb/zHOcRBAwAAAABVFJ4ewfl8LwzWVQQdssCgihuPoZH1d4J/XgBURJktUQAAAAAAAAAAQAAAAEAAAABAAAAABkVQPKSxrLf68SNEURomALjHY99as+1CNnRmno3juLVAAAAAA=='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('857fd8ff2fdf3d24a6781c955d902ae100dc2715814f25e7282b2e567479c65a', 4, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('31f210d64fced45a34ea630f944433de5f339b3480c7d3fff92f2b3426fbc594', 5, 1, 'AAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', '+Xyv+rjBYCOjeIQWXLCz/xqi2vQAD+9J0h78hH3b++oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('857fd8ff2fdf3d24a6781c955d902ae100dc2715814f25e7282b2e567479c65a', 4, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAAAAAAGu5L5MAAAAQFXNYQ1nN8EmRkvMcd2feWgcArIxRflch7zupcTFCkz8rBJFwobg4z+hs4Umn3TLWL5Nlr1Sf9CP8JcgGXsDSgQ=', 'hX/Y/y/fPSSmeByVXZAq4QDcJxWBTyXnKCsuVnR5xloAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('31f210d64fced45a34ea630f944433de5f339b3480c7d3fff92f2b3426fbc594', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQGwsqMIzwrRIIdYGXSzgym6DUbMHrUre+JV1IWsNriIomdY3zGufZtCCV59ADJ9y165PVEFVsX457e4j0M/RWw0=', 'MfIQ1k/O1Fo06mMPlEQz3l8zmzSAx9P/+S8rNCb7xZQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAAAAAAIAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/change_trust-horizon.sql b/services/horizon/internal/test/scenarios/change_trust-horizon.sql deleted file mode 100644 index 00c2a7700b..0000000000 --- a/services/horizon/internal/test/scenarios/change_trust-horizon.sql +++ /dev/null @@ -1,966 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, false); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 21474840577, 1, 21, '{"limit": "0.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179873281, 1, 22, '{"limit": "4000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (6, '3255d3bc8ff43e368bb695bc050974b60397e4bbaf660b4cc3f583065d556c8b', '5452787b07e5f0bc3359541076cb0282286e3e8647d5de09fd7801511264b544', 0, 0, '2019-06-03 16:35:06', '2019-06-03 16:35:05.728314', '2019-06-03 16:35:05.728314', 25769803776, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAAC1RSeHsH5fC8M1lUEHbLAoIobj6GR9XeCf14AVESZLVEa6Tp072W0EkuY6/2dc+oc9aXVE3Ut+w/j9EIOTqSjX4AAAAAXPVMOgAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERkGhLL507YlB8vamWWVDaJm5TRQUiU6S3GBYkjZZZh5PwAAAAYN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); -INSERT INTO history_ledgers VALUES (5, '5452787b07e5f0bc3359541076cb0282286e3e8647d5de09fd7801511264b544', 'b6e85fd882bc3d4d779234c1f16c49082ee277216a1f9f8d1ec571617533754b', 1, 1, '2019-06-03 16:35:05', '2019-06-03 16:35:05.737241', '2019-06-03 16:35:05.737241', 21474836480, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAAC7boX9iCvD1Nd5I0wfFsSQgu4nchah+fjR7FcWF1M3VLX6EpDWeDpdgOfYJIkfD2Ytg74/bF3rEDepNDsLpgHeYAAAAAXPVMOQAAAAAAAAAAtqD7ZvGzk5mv/AtZ7AfsBkliGMVUtteUvuL+rVvYC/6DPg8sVDKAga49jHCIRhTqVsd8MKkQk6bYAkzPokRIIQAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, 'b6e85fd882bc3d4d779234c1f16c49082ee277216a1f9f8d1ec571617533754b', '9efe990e515ee9afc9d77c1941bd78b60332f4fb2e77e825f7f945430c7ae8c9', 1, 1, '2019-06-03 16:35:04', '2019-06-03 16:35:05.754', '2019-06-03 16:35:05.754', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC57+mQ5RXumvydd8GUG9eLYDMvT7LnfoJff5RUMMeujJA/YCetmPPz3dqMUTty86T8avJCHvRTHDEZBASmYNPK4AAAAAXPVMOAAAAAAAAAAALG1UZnCzCamYL0dOv0yVmx9sJIXQO2l+Gr9BTnPshPn3piLYrg/AM8dUXwkoWaQRu/sqiU0NDvGOTkxGr4iT4gAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '9efe990e515ee9afc9d77c1941bd78b60332f4fb2e77e825f7f945430c7ae8c9', '186b3bb606ad48284ac8e6e192ffec5ed11b0f113d1438887591071c1b6575b2', 1, 1, '2019-06-03 16:35:03', '2019-06-03 16:35:05.763421', '2019-06-03 16:35:05.763421', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACxhrO7YGrUgoSsjm4ZL/7F7RGw8RPRQ4iHWRBxwbZXWyZdLxdBVSiPnsrA6mEcC24V5yM/OP1/9WlqlVHiezRRAAAAAAXPVMNwAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPCQ0NP7aVt+A7XC3ngeeog5wYstTHE/suJ/KNmpkoYJYwAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '186b3bb606ad48284ac8e6e192ffec5ed11b0f113d1438887591071c1b6575b2', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:35:02', '2019-06-03 16:35:05.775013', '2019-06-03 16:35:05.775013', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76Zu5H9cHd0qAsZj9Q6Y8yIIc6utkf/CO+Lm/0KbsfrzPUAAAAAXPVMNgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAP0PjS3Rf7hs8xVIBg2g8xKvqOO/n/g/XwgPR/HB7qe9psiJu4kNHR4oXHETId41PNJX7pJqo02A4o+5nRb3zuwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:35:05.788257', '2019-06-03 16:35:05.788257', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (2, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (3, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (4, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (5, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (6, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (7, 8589942785, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 7, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 6, '{"limit": "0.0000000", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 6, '{"limit": "4000.0000000", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (2, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (3, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (4, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (5, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (6, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (7, 8589942784, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 7, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('31f210d64fced45a34ea630f944433de5f339b3480c7d3fff92f2b3426fbc594', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934595, 100, 1, '2019-06-03 16:35:05.737487', '2019-06-03 16:35:05.737487', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQGwsqMIzwrRIIdYGXSzgym6DUbMHrUre+JV1IWsNriIomdY3zGufZtCCV59ADJ9y165PVEFVsX457e4j0M/RWw0=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAAAAAAIAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{bCyowjPCtEgh1gZdLODKboNRswetSt74lXUhaw2uIiiZ1jfMa59m0IJXn0AMn3LXrk9UQVWxfjnt7iPQz9FbDQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('857fd8ff2fdf3d24a6781c955d902ae100dc2715814f25e7282b2e567479c65a', 4, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:35:05.754151', '2019-06-03 16:35:05.754151', 17179873280, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAAAAAAGu5L5MAAAAQFXNYQ1nN8EmRkvMcd2feWgcArIxRflch7zupcTFCkz8rBJFwobg4z+hs4Umn3TLWL5Nlr1Sf9CP8JcgGXsDSgQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAAAAAJUC+QAAAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Vc1hDWc3wSZGS8xx3Z95aBwCsjFF+VyHvO6lxMUKTPysEkXChuDjP6GzhSafdMtYvk2WvVJ/0I/wlyAZewNKBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:35:05.763603', '2019-06-03 16:35:05.763603', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:35:05.775142', '2019-06-03 16:35:05.775143', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f97caffab8c16023a37884165cb0b3ff1aa2daf4000fef49d21efc847ddbfbea', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:35:05.775331', '2019-06-03 16:35:05.775331', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEBmKpSgvrwKO20XCOfYfXsGEEUtwYaaEfqSu6ymJmlDma+IX6I7IggbUZMocQdZ94IMAfKdQANqXbIO7ysweeMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ZiqUoL68CjttFwjn2H17BhBFLcGGmhH6kruspiZpQ5mviF+iOyIIG1GTKHEHWfeCDAHynUADal2yDu8rMHnjAg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/change_trust.rb b/services/horizon/internal/test/scenarios/change_trust.rb deleted file mode 100644 index 88d4b0fbc4..0000000000 --- a/services/horizon/internal/test/scenarios/change_trust.rb +++ /dev/null @@ -1,14 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott - -close_ledger - -trust :scott, :usd_gateway, "USD" ; close_ledger -change_trust :scott, :usd_gateway, "USD", 4000 ; close_ledger -change_trust :scott, :usd_gateway, "USD", 0 ; close_ledger - -close_ledger diff --git a/services/horizon/internal/test/scenarios/core_database_schema_version_8-core.sql b/services/horizon/internal/test/scenarios/core_database_schema_version_8-core.sql deleted file mode 100644 index bdf5fd6016..0000000000 --- a/services/horizon/internal/test/scenarios/core_database_schema_version_8-core.sql +++ /dev/null @@ -1,222 +0,0 @@ --- This file is not generated by SCC. It's used by tests that check Core DB schema --- version compatibility. All unnecessary tables are removed. - --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.signersaccount; -DROP INDEX IF EXISTS public.sellingissuerindex; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.priceindex; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.buyingissuerindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.signers DROP CONSTRAINT IF EXISTS signers_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.signers; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - -INSERT INTO storestate VALUES ('databaseschema ', '8'); - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(32) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, 'stellar.org', 'AQAAAA==', 0, 2, NULL, NULL); - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(64) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - -INSERT INTO accountdata VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 'aaa', 'bWFu', 10); - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingassettype integer NOT NULL, - sellingassetcode character varying(12), - sellingissuer character varying(56), - buyingassettype integer NOT NULL, - buyingassetcode character varying(12), - buyingissuer character varying(56), - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - -INSERT INTO offers VALUES ('GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU', 1, 0, NULL, NULL, 1, 'USD', 'GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU', 2000000000, 1, 2, 0.5, 0, 19); - -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 4, 1, 'USD', 'GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 0, NULL, NULL, 100000000, 1, 1, 1, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 5, 1, 'USD', 'GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 0, NULL, NULL, 200000000, 2, 1, 2, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 6, 0, NULL, NULL, 1, 'USD', 'GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 300000000, 1, 1, 1, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 7, 0, NULL, NULL, 1, 'USD', 'GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 400000000, 3, 1, 3, 0, 24); - --- --- Name: signers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE signers ( - accountid character varying(56) NOT NULL, - publickey character varying(56) NOT NULL, - weight integer NOT NULL -); - --- --- Name: signers signers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY signers - ADD CONSTRAINT signers_pkey PRIMARY KEY (accountid, publickey); - - --- --- Name: signersaccount; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX signersaccount ON signers USING btree (accountid); - -INSERT INTO signers VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 'GAFEES4MDE5Z7Q6JBB2BYMLS7YWEHTPNR7ICANZA7TAOLMSRELE4H4S2', 2); diff --git a/services/horizon/internal/test/scenarios/core_database_schema_version_9-core.sql b/services/horizon/internal/test/scenarios/core_database_schema_version_9-core.sql deleted file mode 100644 index a7ad15b4dc..0000000000 --- a/services/horizon/internal/test/scenarios/core_database_schema_version_9-core.sql +++ /dev/null @@ -1,227 +0,0 @@ --- This file is not generated by SCC. It's used by tests that check Core DB schema --- version compatibility. All unnecessary tables are removed. - - --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.sellingissuerindex; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.priceindex; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.buyingissuerindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - -INSERT INTO accountdata VALUES ('GDZOBPTVEECUYFCHSQ5NCEUVAV4JKRZI6KO5HFOM7HGQT22E3XIGRHNU', 'amFt', 'bWFu', 10); - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - -INSERT INTO accounts VALUES ('GDZOBPTVEECUYFCHSQ5NCEUVAV4JKRZI6KO5HFOM7HGQT22E3XIGRHNU', 999999979999999800, 2, 0, NULL, 'bG9ic3RyLmNv', 'AQAAAA==', 0, 2, NULL, NULL, 'AAAAAQAAAAC+GwdMJxaEbnW0z0RP6jJvTg+s8mjVw7+wPpJEbZAJdQAAAAo='); --- NULL signers: -INSERT INTO accounts VALUES ('GD7HOGYRECGFKFR2GGOWEF2FT3DVR3GU4K7BVRGGPWVSXAVKGSYKTXOH', 999999979999999800, 2, 0, NULL, 'bG9ic3RyLmNv', 'AQAAAA==', 0, 2, NULL, NULL, NULL); - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - -INSERT INTO offers VALUES ('GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU', 1, 'AAAAAA==', 'AAAAAVVTRAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7E=', 2000000000, 1, 2, 0.5, 0, 19); - -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 4, 'AAAAAVVTRAAAAAAAdQRiekAoVkbqXJa3xIIXnCcZLADk+cVfmZs9SLHWDWE=', 'AAAAAA==', 100000000, 1, 1, 1, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 5, 'AAAAAVVTRAAAAAAAdQRiekAoVkbqXJa3xIIXnCcZLADk+cVfmZs9SLHWDWE=', 'AAAAAA==', 200000000, 2, 1, 2, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 6, 'AAAAAA==', 'AAAAAVVTRAAAAAAAdQRiekAoVkbqXJa3xIIXnCcZLADk+cVfmZs9SLHWDWE=', 300000000, 1, 1, 1, 0, 24); -INSERT INTO offers VALUES ('GB2QIYT2IAUFMRXKLSLLPRECC6OCOGJMADSPTRK7TGNT2SFR2YGWDARD', 7, 'AAAAAA==', 'AAAAAVVTRAAAAAAAdQRiekAoVkbqXJa3xIIXnCcZLADk+cVfmZs9SLHWDWE=', 400000000, 3, 1, 3, 0, 24); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - -INSERT INTO storestate VALUES ('databaseschema ', '9'); - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/kahuna-2-core.sql b/services/horizon/internal/test/scenarios/kahuna-2-core.sql deleted file mode 100644 index 1824f92821..0000000000 --- a/services/horizon/internal/test/scenarios/kahuna-2-core.sql +++ /dev/null @@ -1,727 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accountdata VALUES ('GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS', 'ZG9uZQ==', 'dHJ1ZQ==', 5); - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999989999999900, 1, 0, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS', 9999999800, 12884901890, 2, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, 'AAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAE='); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('35f3b67394a33eaa987f4e33b08aed4ae7e42ab2de1ce5cbc8d7fb4cdedc4b47', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 'eff8bb6dff2733ff1f3ffa5141f34ae7571ee3d8cae6dbd129bac511fa0bfd64', 2, 1559579650, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZuZRHr9UdXKbTKiclfOjy72YZFJUkJPVcKT5htvorm1QAAAAAXPVMAgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERnv+Ltt/ycz/x8/+lFB80rnVx7j2Mrm29EpusUR+gv9ZAAAAAIN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('11b30d3f607073a6d8047839090736b0cf93ae96e14004798176174970bb8b2f', '35f3b67394a33eaa987f4e33b08aed4ae7e42ab2de1ce5cbc8d7fb4cdedc4b47', '6df70c934dccb6a0f43f15f9525326ad9cd07646e664e490ffb9f70afedbef82', 3, 1559579651, 'AAAACzXztnOUoz6qmH9OM7CK7Urn5Cqy3hzly8jX+0ze3EtHbkjkAt1T5xqAMvZbyaibTYR4siB6UZQ6i9uDgpciZcwAAAAAXPVMAwAAAAAAAAAAlzJ1vISHXzElAf05LhN7qiqWqKvjHhTijb/BgG6FsuJt9wyTTcy2oPQ/FflSUyatnNB2RuZk5JD/ufcK/tvvggAAAAMN4Lazp2QAAAAAAAAAAABkAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('692c12ea9b911175075910cc1b9d5f6f326fe723acaa8f739e370eec369d8d46', '11b30d3f607073a6d8047839090736b0cf93ae96e14004798176174970bb8b2f', '28b63ad5cd29b8ba0237fcd1d4bc04e586892b4c4144d1603105209162872ca0', 4, 1559579652, 'AAAACxGzDT9gcHOm2AR4OQkHNrDPk66W4UAEeYF2F0lwu4svoRSWfkzXxzLrvmQlTbRa24SQC+hnjId7Fz2OMlxERhAAAAAAXPVMBAAAAAAAAAAApOCJokUPy1wA/XbpkumCKr9Nv3B8+fRGt4d1ygPrKBwotjrVzSm4ugI3/NHUvATlhokrTEFE0WAxBSCRYocsoAAAAAQN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('90e59c32688ab5d10efdea02d65dfd3db1ba80f0ddf2461265e1da512155dd16', '692c12ea9b911175075910cc1b9d5f6f326fe723acaa8f739e370eec369d8d46', '562d5344fb67f34162494a21c7511a6692a4b059794160a185e3b9d1662585c2', 5, 1559579653, 'AAAAC2ksEuqbkRF1B1kQzBudX28yb+cjrKqPc543Duw2nY1Gt/oVFkRuE8I+RLpLO1D1xqCntezzg+kvP8aaL6cYcaQAAAAAXPVMBQAAAAAAAAAAnzt6UJX5by6BwcesLvsJTMJPn/Y/s/aBHlEOtmT5mwdWLVNE+2fzQWJJSiHHURpmkqSwWXlBYKGF47nRZiWFwgAAAAUN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GAXSS2S45SRXVUMU2YYOKHU7DZWOIQC53FXVLG7N5HSS26IWALYOCHIK', 2, 'AAAAAC8palzso3rRlNYw5R6fHmzkQF3Zb1Wb7enlLXkWAvDhAAAAAAAAAAIAAAACAAAAAQAAAEi5lEev1R1cptMqJyV86PLvZhkUlSQk9VwpPmG2+iubVAAAAABc9UwCAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABD1nV889bSHky9AqDzzV+TcQCYDhCBis2UOezFuOq5fIAAABABdfFIyqhS72c4oNkczzKYzOPvCAd8WkuIlLuk/V787NXH4ZSqHpEN/7vitedmznMnCSVSiZJdY1Hx6u5bVjnAQ=='); -INSERT INTO scphistory VALUES ('GAXSS2S45SRXVUMU2YYOKHU7DZWOIQC53FXVLG7N5HSS26IWALYOCHIK', 3, 'AAAAAC8palzso3rRlNYw5R6fHmzkQF3Zb1Wb7enlLXkWAvDhAAAAAAAAAAMAAAACAAAAAQAAADBuSOQC3VPnGoAy9lvJqJtNhHiyIHpRlDqL24OClyJlzAAAAABc9UwDAAAAAAAAAAAAAAABD1nV889bSHky9AqDzzV+TcQCYDhCBis2UOezFuOq5fIAAABAA66ZGGZS4aexGe9rG4SzYPzV9yEdEvuTPJ2opCOrcAx6Fxf/B7Ovsnv6JEyjcfrCRd2LSVpu4JjjUZ/ZPe+QCw=='); -INSERT INTO scphistory VALUES ('GAXSS2S45SRXVUMU2YYOKHU7DZWOIQC53FXVLG7N5HSS26IWALYOCHIK', 4, 'AAAAAC8palzso3rRlNYw5R6fHmzkQF3Zb1Wb7enlLXkWAvDhAAAAAAAAAAQAAAACAAAAAQAAADChFJZ+TNfHMuu+ZCVNtFrbhJAL6GeMh3sXPY4yXERGEAAAAABc9UwEAAAAAAAAAAAAAAABD1nV889bSHky9AqDzzV+TcQCYDhCBis2UOezFuOq5fIAAABA7TpGdIoutG8J+jcNKoU1VeIq//aEKNTiP31b6VTC7fO4X4OyIbQBmLzQOoGvITboi14Qhon6PddyocncX3SyCg=='); -INSERT INTO scphistory VALUES ('GAXSS2S45SRXVUMU2YYOKHU7DZWOIQC53FXVLG7N5HSS26IWALYOCHIK', 5, 'AAAAAC8palzso3rRlNYw5R6fHmzkQF3Zb1Wb7enlLXkWAvDhAAAAAAAAAAUAAAACAAAAAQAAADC3+hUWRG4Twj5Euks7UPXGoKe17POD6S8/xpovpxhxpAAAAABc9UwFAAAAAAAAAAAAAAABD1nV889bSHky9AqDzzV+TcQCYDhCBis2UOezFuOq5fIAAABAjOLNbe4NBurgvqIblTzze0n7i3jAZRDZDTvzW+f6xZaH1v4kxB1S/woA9gqN7IsP14RHJ43nUV6wlkyS7+5RDw=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('0f59d5f3cf5b487932f40a83cf357e4dc402603842062b3650e7b316e3aae5f2', 5, 'AAAAAQAAAAEAAAAALylqXOyjetGU1jDlHp8ebORAXdlvVZvt6eUteRYC8OEAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastclosedledger ', '90e59c32688ab5d10efdea02d65dfd3db1ba80f0ddf2461265e1da512155dd16'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 5, - "currentBuckets": [ - { - "curr": "bb27c0e46bfdf4f6ec3301b40609006bc5c33f59776c2687d7003f3333673ced", - "next": { - "state": 0 - }, - "snap": "db8f2c7d69f4f931e8e11d78ee798e6c2d64b62e42c654cc1b8dcde9787e8a43" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "db8f2c7d69f4f931e8e11d78ee798e6c2d64b62e42c654cc1b8dcde9787e8a43" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAAvKWpc7KN60ZTWMOUenx5s5EBd2W9Vm+3p5S15FgLw4QAAAAAAAAAFAAAAAw9Z1fPPW0h5MvQKg881fk3EAmA4QgYrNlDnsxbjquXyAAAAAQAAAJi3+hUWRG4Twj5Euks7UPXGoKe17POD6S8/xpovpxhxpAAAAABc9UwFAAAAAAAAAAEAAAAALylqXOyjetGU1jDlHp8ebORAXdlvVZvt6eUteRYC8OEAAABAKFrOJO1ddvLL+PsPj2+4dzOpAbYruX1Muah5tw8HJlicwXlNQm9uEVjv0CaHwkIfXM4OWnSD1q5tT9M/fZ98AAAAAAEAAACYt/oVFkRuE8I+RLpLO1D1xqCntezzg+kvP8aaL6cYcaQAAAAAXPVMBQAAAAAAAAABAAAAAC8palzso3rRlNYw5R6fHmzkQF3Zb1Wb7enlLXkWAvDhAAAAQChaziTtXXbyy/j7D49vuHczqQG2K7l9TLmoebcPByZYnMF5TUJvbhFY79Amh8JCH1zODlp0g9aubU/TP32ffAAAAABAjOL1ltRJwEgn9xwArWzZep2MVc4uJGr1Zf7oWw41MVPSw+Vv3c8PUTtUU2ov4ub122/JS3YGDygWjmEHQTsmAgAAAAAvKWpc7KN60ZTWMOUenx5s5EBd2W9Vm+3p5S15FgLw4QAAAAAAAAAFAAAAAgAAAAEAAAAwt/oVFkRuE8I+RLpLO1D1xqCntezzg+kvP8aaL6cYcaQAAAAAXPVMBQAAAAAAAAAAAAAAAQ9Z1fPPW0h5MvQKg881fk3EAmA4QgYrNlDnsxbjquXyAAAAQIzizW3uDQbq4L6iG5U883tJ+4t4wGUQ2Q0781vn+sWWh9b+JMQdUv8KAPYKjeyLD9eERyeN51FesJZMku/uUQ8AAAABaSwS6puREXUHWRDMG51fbzJv5yOsqo9znjcO7DadjUYAAAABAAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAZAAAAAMAAAACAAAAAAAAAAAAAAABAAAAAAAAAAoAAAAEZG9uZQAAAAEAAAAEdHJ1ZQAAAAAAAAABqbdEIwAAACC5TSe5k00+CKUuUtfafav6xITv43pTgO6QiPes4u/N6QAAAAEAAAABAAAAAQAAAAAvKWpc7KN60ZTWMOUenx5s5EBd2W9Vm+3p5S15FgLw4QAAAAA='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('54c49533d937a906c0e6e501322bb600ffe332bf888cb474bd4261d42f542470', 3, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('59de4450bcc1830b6da83fb481aab833db04dadf1e88d568a00274d4038d531e', 4, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+QAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('b0879add9f3957c9796d1d1fb23720dbed15d07793c742773455f2706c0e9a25', 5, 1, 'AAAAAgAAAAMAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAAAAAABAAAABQAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjOAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAABAAAAArxi1LgNnjbaKcFsXU2fEXMfNgUsckAadsI8D7Wpt0QjAAAAAQAAAAAAAAAA'); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('54c49533d937a906c0e6e501322bb600ffe332bf888cb474bd4261d42f542470', 3, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDi0+98/ltS2PZOxNCNogdC0ctkOWrNnQ+3eVu2PI3+LNdVssYOrw4gwvZFULsMpS166y7rVfyn6AIp7gqV5pMD', 'VMSVM9k3qQbA5uUBMiu2AP/jMr+IjLR0vUJh1C9UJHAAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcN4Lazp2P/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcN4Lazp2P/nAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBucAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+QAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('59de4450bcc1830b6da83fb481aab833db04dadf1e88d568a00274d4038d531e', 4, 1, 'AAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAZAAAAAMAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAZccXbwAAABAeVu+uPT8KOhoKoNJidCWqVs71WAIqQns2Zq4mM3LBluMVDHej/SJhUxiKlsSR5MJwQU3trQbPsOAwb56BinbCw==', 'Wd5EULzBgwttqD+0gaq4M9sE2t8eiNVooAJ01AONUx4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjnAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjnAAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAA='); -INSERT INTO txhistory VALUES ('b0879add9f3957c9796d1d1fb23720dbed15d07793c742773455f2706c0e9a25', 5, 1, 'AAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAZAAAAAMAAAACAAAAAAAAAAAAAAABAAAAAAAAAAoAAAAEZG9uZQAAAAEAAAAEdHJ1ZQAAAAAAAAABqbdEIwAAACC5TSe5k00+CKUuUtfafav6xITv43pTgO6QiPes4u/N6Q==', 'sIea3Z85V8l5bR0fsjcg2+0V0HeTx0J3NFXycGwOmiUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAoAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjOAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAABAAAAArxi1LgNnjbaKcFsXU2fEXMfNgUsckAadsI8D7Wpt0QjAAAAAQAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAAlQL4zgAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAwAAAAUAAAAAAAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAAlQL4zgAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+M4AAAAAwAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAAAAAAAAAAABQAAAAMAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAAEZG9uZQAAAAR0cnVlAAAAAAAAAAA='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/kahuna-2-horizon.sql b/services/horizon/internal/test/scenarios/kahuna-2-horizon.sql deleted file mode 100644 index 374827db66..0000000000 --- a/services/horizon/internal/test/scenarios/kahuna-2-horizon.sql +++ /dev/null @@ -1,951 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS'); -INSERT INTO history_accounts VALUES (2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 2, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, false); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 21474840577, 1, 40, '{"name": "done", "value": "dHJ1ZQ=="}'); -INSERT INTO history_effects VALUES (1, 17179873281, 1, 12, '{"weight": 1, "public_key": "GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS"}'); -INSERT INTO history_effects VALUES (1, 17179873281, 2, 10, '{"weight": 1, "public_key": "XC6GFVFYBWPDNWRJYFWF2TM7CFZR6NQFFRZEAGTWYI6A7NNJW5CCGCON"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (2, 12884905985, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 3, 10, '{"weight": 1, "public_key": "GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (5, '90e59c32688ab5d10efdea02d65dfd3db1ba80f0ddf2461265e1da512155dd16', '692c12ea9b911175075910cc1b9d5f6f326fe723acaa8f739e370eec369d8d46', 1, 1, '2019-06-03 16:34:13', '2019-06-03 16:34:13.450066', '2019-06-03 16:34:13.450066', 21474836480, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2ksEuqbkRF1B1kQzBudX28yb+cjrKqPc543Duw2nY1Gt/oVFkRuE8I+RLpLO1D1xqCntezzg+kvP8aaL6cYcaQAAAAAXPVMBQAAAAAAAAAAnzt6UJX5by6BwcesLvsJTMJPn/Y/s/aBHlEOtmT5mwdWLVNE+2fzQWJJSiHHURpmkqSwWXlBYKGF47nRZiWFwgAAAAUN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, '692c12ea9b911175075910cc1b9d5f6f326fe723acaa8f739e370eec369d8d46', '11b30d3f607073a6d8047839090736b0cf93ae96e14004798176174970bb8b2f', 1, 1, '2019-06-03 16:34:12', '2019-06-03 16:34:13.467526', '2019-06-03 16:34:13.467527', 17179869184, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAACxGzDT9gcHOm2AR4OQkHNrDPk66W4UAEeYF2F0lwu4svoRSWfkzXxzLrvmQlTbRa24SQC+hnjId7Fz2OMlxERhAAAAAAXPVMBAAAAAAAAAAApOCJokUPy1wA/XbpkumCKr9Nv3B8+fRGt4d1ygPrKBwotjrVzSm4ugI3/NHUvATlhokrTEFE0WAxBSCRYocsoAAAAAQN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '11b30d3f607073a6d8047839090736b0cf93ae96e14004798176174970bb8b2f', '35f3b67394a33eaa987f4e33b08aed4ae7e42ab2de1ce5cbc8d7fb4cdedc4b47', 1, 1, '2019-06-03 16:34:11', '2019-06-03 16:34:13.478681', '2019-06-03 16:34:13.478681', 12884901888, 16, 1000000000000000000, 100, 100, 100000000, 1000000, 11, 'AAAACzXztnOUoz6qmH9OM7CK7Urn5Cqy3hzly8jX+0ze3EtHbkjkAt1T5xqAMvZbyaibTYR4siB6UZQ6i9uDgpciZcwAAAAAXPVMAwAAAAAAAAAAlzJ1vISHXzElAf05LhN7qiqWqKvjHhTijb/BgG6FsuJt9wyTTcy2oPQ/FflSUyatnNB2RuZk5JD/ufcK/tvvggAAAAMN4Lazp2QAAAAAAAAAAABkAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '35f3b67394a33eaa987f4e33b08aed4ae7e42ab2de1ce5cbc8d7fb4cdedc4b47', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 0, 0, '2019-06-03 16:34:10', '2019-06-03 16:34:13.490365', '2019-06-03 16:34:13.490365', 8589934592, 16, 1000000000000000000, 0, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZuZRHr9UdXKbTKiclfOjy72YZFJUkJPVcKT5htvorm1QAAAAAXPVMAgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERnv+Ltt/ycz/x8/+lFB80rnVx7j2Mrm29EpusUR+gv9ZAAAAAIN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:34:13.498238', '2019-06-03 16:34:13.498239', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (2, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (3, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (4, 12884905985, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 4, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 10, '{"name": "done", "value": "dHJ1ZQ=="}', 'GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 5, '{"signer_key": "XC6GFVFYBWPDNWRJYFWF2TM7CFZR6NQFFRZEAGTWYI6A7NNJW5CCGCON", "signer_weight": 1}', 'GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (2, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (3, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (4, 12884905984, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 4, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('b0879add9f3957c9796d1d1fb23720dbed15d07793c742773455f2706c0e9a25', 5, 1, 'GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS', 12884901890, 100, 1, '2019-06-03 16:34:13.450322', '2019-06-03 16:34:13.450323', 21474840576, 'AAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAZAAAAAMAAAACAAAAAAAAAAAAAAABAAAAAAAAAAoAAAAEZG9uZQAAAAEAAAAEdHJ1ZQAAAAAAAAABqbdEIwAAACC5TSe5k00+CKUuUtfafav6xITv43pTgO6QiPes4u/N6Q==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAKAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjOAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAABAAAAArxi1LgNnjbaKcFsXU2fEXMfNgUsckAadsI8D7Wpt0QjAAAAAQAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAAlQL4zgAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAAAAAAEAAAADAAAAAwAAAAUAAAAAAAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAAlQL4zgAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+M4AAAAAwAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAAAAAAAAAAABQAAAAMAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAAEZG9uZQAAAAR0cnVlAAAAAAAAAAA=', 'AAAAAgAAAAMAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAAAAAABAAAABQAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjOAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAABAAAAArxi1LgNnjbaKcFsXU2fEXMfNgUsckAadsI8D7Wpt0QjAAAAAQAAAAAAAAAA', '{uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('59de4450bcc1830b6da83fb481aab833db04dadf1e88d568a00274d4038d531e', 4, 1, 'GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS', 12884901889, 100, 1, '2019-06-03 16:34:13.467672', '2019-06-03 16:34:13.467672', 17179873280, 'AAAAAPzZxTbufNFY/KSsxpMF/+NI6ZN3mv4og6pBOYqXHF28AAAAZAAAAAMAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAK8YtS4DZ422inBbF1NnxFzHzYFLHJAGnbCPA+1qbdEIwAAAAEAAAAAAAAAAZccXbwAAABAeVu+uPT8KOhoKoNJidCWqVs71WAIqQns2Zq4mM3LBluMVDHej/SJhUxiKlsSR5MJwQU3trQbPsOAwb56BinbCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjnAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvjnAAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAACvGLUuA2eNtopwWxdTZ8Rcx82BSxyQBp2wjwPtam3RCMAAAABAAAAAAAAAAA=', 'AAAAAgAAAAMAAAADAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+QAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+OcAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{eVu+uPT8KOhoKoNJidCWqVs71WAIqQns2Zq4mM3LBluMVDHej/SJhUxiKlsSR5MJwQU3trQbPsOAwb56BinbCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('54c49533d937a906c0e6e501322bb600ffe332bf888cb474bd4261d42f542470', 3, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:34:13.478841', '2019-06-03 16:34:13.478841', 12884905984, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA/NnFNu580Vj8pKzGkwX/40jpk3ea/iiDqkE5ipccXbwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDi0+98/ltS2PZOxNCNogdC0ctkOWrNnQ+3eVu2PI3+LNdVssYOrw4gwvZFULsMpS166y7rVfyn6AIp7gqV5pMD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcN4Lazp2P/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcN4Lazp2P/nAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBucAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAD82cU27nzRWPykrMaTBf/jSOmTd5r+KIOqQTmKlxxdvAAAAAJUC+QAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{4tPvfP5bUtj2TsTQjaIHQtHLZDlqzZ0Pt3lbtjyN/izXVbLGDq8OIML2RVC7DKUteusu61X8p+gCKe4KleaTAw==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/kahuna-2.rb b/services/horizon/internal/test/scenarios/kahuna-2.rb deleted file mode 100644 index ca9aa32497..0000000000 --- a/services/horizon/internal/test/scenarios/kahuna-2.rb +++ /dev/null @@ -1,44 +0,0 @@ -# This is the 2nd big kahuna test scenario. It continues where the first big kahuna recipe left off `kahuna.rb` due to an unfortunate edge case. -# -use_manual_close -KP = Stellar::KeyPair -close_ledger #2 - - -# one-time signer being consumed - - # Public Key GD6NTRJW5Z6NCWH4USWMNEYF77RUR2MTO6NP4KEDVJATTCUXDRO3YIFS - # Secret Key SAOCKUHEWRFMHSDBG33XFOUZDOXRZPKIXR3FUBS5QJ4IVKBGZDZPMLT3 - - account :onetime, KP.from_seed("SAOCKUHEWRFMHSDBG33XFOUZDOXRZPKIXR3FUBS5QJ4IVKBGZDZPMLT3") - create_account :onetime - close_ledger #3 - - # add one time signer - - require 'digest' - x = Digest::SHA256.digest("hello world") - key = Stellar::SignerKey.hash_x(x) - set_options :onetime, signer: Stellar::Signer.new({ - key: key, - weight: 1, - }) - close_ledger #4 - - # consume one time signer - account = get_account :onetime - tx = Stellar::Transaction.manage_data({ - account: account, - sequence: next_sequence(account), - name: "done", - value: "true", - }) - env = tx.to_envelope - env.signatures << Stellar::DecoratedSignature.new({ - hint: key.to_xdr.slice(-4, 4), - signature: x - }) - - submit_transaction env - - close_ledger #5 diff --git a/services/horizon/internal/test/scenarios/non_native_payment-core.sql b/services/horizon/internal/test/scenarios/non_native_payment-core.sql deleted file mode 100644 index 16f46ebd88..0000000000 --- a/services/horizon/internal/test/scenarios/non_native_payment-core.sql +++ /dev/null @@ -1,738 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999996999999700, 3, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 999999900, 8589934593, 1, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 999999800, 8589934594, 1, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('8787c7784c599f41a8d27b03ad3467b8f603395b9c87d79d03688424f1d9bf00', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 'e10a12ae38dc8ee2b8b2364ea481889ab3f7edea1fb7e913dba4a1441e6be06b', 2, 1559579897, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZP3bET1BQWO7v25lKgR/u6tNkZT/xU5qQN30ohPD6CoAAAAAAXPVM+QAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAATmS1LmeTcag6pi81IhaOG+MYxa34gawjnsRB3rvSgEzhChKuONyO4riyNk6kgYias/ft6h+36RPbpKFEHmvgawAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('e87dedd74b1b1b9f1f2e7c1a6579c194007e647220a2f7c7a227880ff1771c49', '8787c7784c599f41a8d27b03ad3467b8f603395b9c87d79d03688424f1d9bf00', 'a0259836c57a10e9160d6816b0c7f41ce949bf2be20a2d67a44c86c2b54eb0e5', 3, 1559579898, 'AAAAC4eHx3hMWZ9BqNJ7A600Z7j2AzlbnIfXnQNohCTx2b8Ax5WK6vGg6w3efIp2cBuaDLIcPI0zqFcz3fzJ3IOdzHoAAAAAXPVM+gAAAAAAAAAAN13a+3Gscvm/C1jZHTPHN4HPw5H2WdEz2kGkUix7+FygJZg2xXoQ6RYNaBawx/Qc6Um/K+IKLWekTIbCtU6w5QAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('de5766be545d9fc98c8bd06c603be896af4ffe0562e6f4dc8abe01bd99d75182', 'e87dedd74b1b1b9f1f2e7c1a6579c194007e647220a2f7c7a227880ff1771c49', 'cada07fda4a768ad67ef79d4d9fdbb46827ab7fc5a6b6f71f901929eb5fee52e', 4, 1559579899, 'AAAAC+h97ddLGxufHy58GmV5wZQAfmRyIKL3x6IniA/xdxxJiW0EgjQPUCA+cCDzPL41fKJJiEkXoDSHZnHSHuX0ll4AAAAAXPVM+wAAAAAAAAAA89aPZigAg+IMx5cMdGKxwXobEhFVZAiHObRfY4fyizHK2gf9pKdorWfvedTZ/btGgnq3/Fprb3H5AZKetf7lLgAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('da8bbb872d70f26ce16d510482d2f611747552823a5f4dc81aa94fa809df4a88', 'de5766be545d9fc98c8bd06c603be896af4ffe0562e6f4dc8abe01bd99d75182', '336610d619b40792d257608754618a37f6f480569d899fbeee4d5ca5d015c810', 5, 1559579900, 'AAAAC95XZr5UXZ/JjIvQbGA76JavT/4FYub03Iq+Ab2Z11GC8LDIogXVFWCU1BUFb1zv9bNJ282gfsIFyoF30vhy3QIAAAAAXPVM/AAAAAAAAAAAnpHN6r0WB8KXbaGDbS3aPdFFMJZ+yrybEFpZjcDQA/0zZhDWGbQHktJXYIdUYYo39vSAVp2Jn77uTVyl0BXIEAAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GDSTYMKIOCA5NSQOX5XZTUFCASRT4IR5KYPRTMU2O2ORQO5ITWWJKZY2', 2, 'AAAAAOU8MUhwgdbKDr9vmdCiBKM+Ij1WHxmymnadGDuonayVAAAAAAAAAAIAAAACAAAAAQAAAEg/dsRPUFBY7u/bmUqBH+7q02RlP/FTmpA3fSiE8PoKgAAAAABc9Uz5AAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABTvAP6rqpmBruGhYX7KTLs52bttB6ev7DELZh6Ql6kMAAAABAWbGoWY4uqJWX+NfWb9/oIX4mr8JXVx2why5rLayIkSawz+t8If/+FX6JqlgjBLjUS0GmHzuIfwOlby1V4nhXDw=='); -INSERT INTO scphistory VALUES ('GDSTYMKIOCA5NSQOX5XZTUFCASRT4IR5KYPRTMU2O2ORQO5ITWWJKZY2', 3, 'AAAAAOU8MUhwgdbKDr9vmdCiBKM+Ij1WHxmymnadGDuonayVAAAAAAAAAAMAAAACAAAAAQAAADDHlYrq8aDrDd58inZwG5oMshw8jTOoVzPd/Mncg53MegAAAABc9Uz6AAAAAAAAAAAAAAABTvAP6rqpmBruGhYX7KTLs52bttB6ev7DELZh6Ql6kMAAAABA3GYq4jWYhXCVYEN8PZSdfjjTCNE/VsoU4Tf37oyeo9pnRRS2qZvdKHWTT0eoFUAbmG1mamn1Cej3MeXxAk1JDQ=='); -INSERT INTO scphistory VALUES ('GDSTYMKIOCA5NSQOX5XZTUFCASRT4IR5KYPRTMU2O2ORQO5ITWWJKZY2', 4, 'AAAAAOU8MUhwgdbKDr9vmdCiBKM+Ij1WHxmymnadGDuonayVAAAAAAAAAAQAAAACAAAAAQAAADCJbQSCNA9QID5wIPM8vjV8okmISRegNIdmcdIe5fSWXgAAAABc9Uz7AAAAAAAAAAAAAAABTvAP6rqpmBruGhYX7KTLs52bttB6ev7DELZh6Ql6kMAAAABAJ3JAbYGnJHBR8iUx7zqCEFdFT8m2IUo0XR9OPCP+iiclhuAC+K8IP4XV2U8nhSxqU4bWX/aPY1uFxuTLOtJSCA=='); -INSERT INTO scphistory VALUES ('GDSTYMKIOCA5NSQOX5XZTUFCASRT4IR5KYPRTMU2O2ORQO5ITWWJKZY2', 5, 'AAAAAOU8MUhwgdbKDr9vmdCiBKM+Ij1WHxmymnadGDuonayVAAAAAAAAAAUAAAACAAAAAQAAADDwsMiiBdUVYJTUFQVvXO/1s0nbzaB+wgXKgXfS+HLdAgAAAABc9Uz8AAAAAAAAAAAAAAABTvAP6rqpmBruGhYX7KTLs52bttB6ev7DELZh6Ql6kMAAAABAc9fIJqAhNA0bj32ibI7odpZTVqMIqdV22D0wb8CvqMHf9WzjRbTZSNx7dHIo1GUbGvoogCOlTkEF45W0SF0rDg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('4ef00feabaa9981aee1a1617eca4cbb39d9bb6d07a7afec310b661e9097a90c0', 5, 'AAAAAQAAAAEAAAAA5TwxSHCB1soOv2+Z0KIEoz4iPVYfGbKadp0YO6idrJUAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastclosedledger ', 'da8bbb872d70f26ce16d510482d2f611747552823a5f4dc81aa94fa809df4a88'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 5, - "currentBuckets": [ - { - "curr": "de41a904d34c96e4d1465d35c891bcbdf2bf1ea969c844868a3cea426bfd410d", - "next": { - "state": 0 - }, - "snap": "cfe41837a167b530d56e82d7697ce59fbe35439bc2340f5a788e2452e3be1881" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "cfe41837a167b530d56e82d7697ce59fbe35439bc2340f5a788e2452e3be1881" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAADlPDFIcIHWyg6/b5nQogSjPiI9Vh8Zspp2nRg7qJ2slQAAAAAAAAAFAAAAA07wD+q6qZga7hoWF+yky7Odm7bQenr+wxC2YekJepDAAAAAAQAAAJjwsMiiBdUVYJTUFQVvXO/1s0nbzaB+wgXKgXfS+HLdAgAAAABc9Uz8AAAAAAAAAAEAAAAA5TwxSHCB1soOv2+Z0KIEoz4iPVYfGbKadp0YO6idrJUAAABAA9ks6GM05tzXCeIQM5Y0J4ROVr6Vl4EreXpCp5PWp4mtA5xG7oyeI4R0xoYgty1EakbKiDRaYwCTpYMDW8xXDgAAAAEAAACY8LDIogXVFWCU1BUFb1zv9bNJ282gfsIFyoF30vhy3QIAAAAAXPVM/AAAAAAAAAABAAAAAOU8MUhwgdbKDr9vmdCiBKM+Ij1WHxmymnadGDuonayVAAAAQAPZLOhjNObc1wniEDOWNCeETla+lZeBK3l6QqeT1qeJrQOcRu6MniOEdMaGILctRGpGyog0WmMAk6WDA1vMVw4AAABA5wHWjmqmsBTBtSi7eL1WSds/KVk4D+c8lSJgSiVPLilv35S/4NLQyHrQpLrLRLaqfA0xaeLRhF7QCnbraId1BQAAAADlPDFIcIHWyg6/b5nQogSjPiI9Vh8Zspp2nRg7qJ2slQAAAAAAAAAFAAAAAgAAAAEAAAAw8LDIogXVFWCU1BUFb1zv9bNJ282gfsIFyoF30vhy3QIAAAAAXPVM/AAAAAAAAAAAAAAAAU7wD+q6qZga7hoWF+yky7Odm7bQenr+wxC2YekJepDAAAAAQHPXyCagITQNG499omyO6HaWU1ajCKnVdtg9MG/Ar6jB3/Vs40W02Ujce3RyKNRlGxr6KIAjpU5BBeOVtEhdKw4AAAAB3ldmvlRdn8mMi9BsYDvolq9P/gVi5vTcir4BvZnXUYIAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAdzWUAAAAAAAAAAAGu5L5MAAAAQFbO0ttd/vGGsr58kHpKsBkO1RaLpAxEOj/X5D93EKfX5xxHpuGiU9PlJOy1/alHN9kcOxtKNdvv7zChGRPR/Q8AAAABAAAAAQAAAAEAAAAA5TwxSHCB1soOv2+Z0KIEoz4iPVYfGbKadp0YO6idrJUAAAAA'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 500000000, 1, 5, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 500000000, 1, 5, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f508f24622cb2658b8b46c84fd1cd0f13b68090baae85b41e8b67cf16edf578c', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('2b2e82dbabb024b27a0c3140ca71d8ac9bc71831f9f5a3bd69eca3d88fb0ec5c', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('7736f0b869de0f74a5ed7f8d6529949238eb0f0421f3fc2bbc438084f21c8055', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3b6dc5f46ed8140595cff4b3b8cba6b7fc0bc0801fd222e4c717b9497ee5ced0', 5, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msk4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAECDzqvkQBQoNAJifPRXDoLhvtycT3lFPCQ51gkdsFHaBNWw05S/VhW0Xgkr0CBPE4NaFV2Kmcs3ZwLmib4TRrML', 'I3Tpk0m57326ml2zM5t4/ajzR3exrzO6RorVwN+UbU0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTTUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f508f24622cb2658b8b46c84fd1cd0f13b68090baae85b41e8b67cf16edf578c', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAAAAAABVvwF9wAAAEArq72awj8I0bL2hCJ9DOo1fUwxpwUnK9R5NvR/ewXcofvO+1pRNJJeTNHMGlbdlFKeqkwm3fkPP91vgLWX47oD', '9QjyRiLLJli4tGyE/RzQ8TtoCQuq6FtB6LZ88W7fV4wAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTTUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLmrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('2b2e82dbabb024b27a0c3140ca71d8ac9bc71831f9f5a3bd69eca3d88fb0ec5c', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rKAAAAAAAAAAABVvwF9wAAAEDJul1tLGLF4Vxwt0dDCVEf6tb5l4byMrGgCp+lVZMmxct54iNf2mxtjx6Md5ZJ4E4Dlcsf46EAhBGSUPsn8fYD', 'Ky6C26uwJLJ6DDFAynHYrJvHGDH59aO9aeyj2I+w7FwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLmrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrL0k6DUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 1, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'gRGSw4ZD33PAFaWh13uALf8F1PUPxtEIFqp1wKYQn5oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('7736f0b869de0f74a5ed7f8d6529949238eb0f0421f3fc2bbc438084f21c8055', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAAAAAAH5kC3vAAAAQDjBSAulKc9tRqGg+OkVbKPz4olRQYUevyCfv0LAlqbXG6yPbpR0BR6o7mrimRm8O4VoRBGIATQB42NOWcFzdQw=', 'dzbwuGneD3Sl7X+NZSmUkjjrDwQh8/wrvEOAhPIcgFUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3b6dc5f46ed8140595cff4b3b8cba6b7fc0bc0801fd222e4c717b9497ee5ced0', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAdzWUAAAAAAAAAAAGu5L5MAAAAQFbO0ttd/vGGsr58kHpKsBkO1RaLpAxEOj/X5D93EKfX5xxHpuGiU9PlJOy1/alHN9kcOxtKNdvv7zChGRPR/Q8=', 'O23F9G7YFAWVz/SzuMumt/wLwIAf0iLkxxe5SX7lztAAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAB3NZQB//////////wAAAAEAAAAAAAAAAAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAB3NZQB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/non_native_payment-horizon.sql b/services/horizon/internal/test/scenarios/non_native_payment-horizon.sql deleted file mode 100644 index 00c3252ef5..0000000000 --- a/services/horizon/internal/test/scenarios/non_native_payment-horizon.sql +++ /dev/null @@ -1,988 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '1000000000', 2, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_accounts VALUES (2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 4, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 21474840577, 1, 2, '{"amount": "50.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 21474840577, 2, 3, '{"amount": "50.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179873281, 1, 2, '{"amount": "100.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179873281, 2, 3, '{"amount": "100.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589942785, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589946881, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589946881, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589946881, 3, 10, '{"weight": 1, "public_key": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (5, 'da8bbb872d70f26ce16d510482d2f611747552823a5f4dc81aa94fa809df4a88', 'de5766be545d9fc98c8bd06c603be896af4ffe0562e6f4dc8abe01bd99d75182', 1, 1, '2019-06-03 16:38:20', '2019-06-03 16:38:20.635671', '2019-06-03 16:38:20.635671', 21474836480, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAAC95XZr5UXZ/JjIvQbGA76JavT/4FYub03Iq+Ab2Z11GC8LDIogXVFWCU1BUFb1zv9bNJ282gfsIFyoF30vhy3QIAAAAAXPVM/AAAAAAAAAAAnpHN6r0WB8KXbaGDbS3aPdFFMJZ+yrybEFpZjcDQA/0zZhDWGbQHktJXYIdUYYo39vSAVp2Jn77uTVyl0BXIEAAAAAUN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, 'de5766be545d9fc98c8bd06c603be896af4ffe0562e6f4dc8abe01bd99d75182', 'e87dedd74b1b1b9f1f2e7c1a6579c194007e647220a2f7c7a227880ff1771c49', 1, 1, '2019-06-03 16:38:19', '2019-06-03 16:38:20.663951', '2019-06-03 16:38:20.663951', 17179869184, 16, 1000000000000000000, 600, 100, 100000000, 1000000, 11, 'AAAAC+h97ddLGxufHy58GmV5wZQAfmRyIKL3x6IniA/xdxxJiW0EgjQPUCA+cCDzPL41fKJJiEkXoDSHZnHSHuX0ll4AAAAAXPVM+wAAAAAAAAAA89aPZigAg+IMx5cMdGKxwXobEhFVZAiHObRfY4fyizHK2gf9pKdorWfvedTZ/btGgnq3/Fprb3H5AZKetf7lLgAAAAQN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, 'e87dedd74b1b1b9f1f2e7c1a6579c194007e647220a2f7c7a227880ff1771c49', '8787c7784c599f41a8d27b03ad3467b8f603395b9c87d79d03688424f1d9bf00', 2, 2, '2019-06-03 16:38:18', '2019-06-03 16:38:20.677274', '2019-06-03 16:38:20.677275', 12884901888, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAAC4eHx3hMWZ9BqNJ7A600Z7j2AzlbnIfXnQNohCTx2b8Ax5WK6vGg6w3efIp2cBuaDLIcPI0zqFcz3fzJ3IOdzHoAAAAAXPVM+gAAAAAAAAAAN13a+3Gscvm/C1jZHTPHN4HPw5H2WdEz2kGkUix7+FygJZg2xXoQ6RYNaBawx/Qc6Um/K+IKLWekTIbCtU6w5QAAAAMN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (2, '8787c7784c599f41a8d27b03ad3467b8f603395b9c87d79d03688424f1d9bf00', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 3, 3, '2019-06-03 16:38:17', '2019-06-03 16:38:20.689887', '2019-06-03 16:38:20.689887', 8589934592, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZP3bET1BQWO7v25lKgR/u6tNkZT/xU5qQN30ohPD6CoAAAAAAXPVM+QAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAATmS1LmeTcag6pi81IhaOG+MYxa34gawjnsRB3rvSgEzhChKuONyO4riyNk6kgYias/ft6h+36RPbpKFEHmvgawAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 3, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:38:20.703551', '2019-06-03 16:38:20.703551', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 2); -INSERT INTO history_operation_participants VALUES (2, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (3, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (4, 17179873281, 3); -INSERT INTO history_operation_participants VALUES (5, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (6, 12884910081, 2); -INSERT INTO history_operation_participants VALUES (7, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (8, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (9, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (10, 8589942785, 4); -INSERT INTO history_operation_participants VALUES (11, 8589946881, 4); -INSERT INTO history_operation_participants VALUES (12, 8589946881, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 12, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 1, '{"to": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "amount": "50.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "100.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 2); -INSERT INTO history_transaction_participants VALUES (2, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (3, 17179873280, 3); -INSERT INTO history_transaction_participants VALUES (4, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (5, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (6, 12884910080, 2); -INSERT INTO history_transaction_participants VALUES (7, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (8, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (9, 8589942784, 4); -INSERT INTO history_transaction_participants VALUES (10, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (11, 8589946880, 4); -INSERT INTO history_transaction_participants VALUES (12, 8589946880, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 12, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('3b6dc5f46ed8140595cff4b3b8cba6b7fc0bc0801fd222e4c717b9497ee5ced0', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:38:20.635848', '2019-06-03 16:38:20.635848', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAdzWUAAAAAAAAAAAGu5L5MAAAAQFbO0ttd/vGGsr58kHpKsBkO1RaLpAxEOj/X5D93EKfX5xxHpuGiU9PlJOy1/alHN9kcOxtKNdvv7zChGRPR/Q8=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAB3NZQB//////////wAAAAEAAAAAAAAAAAAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAB3NZQB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msk4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Vs7S213+8YayvnyQekqwGQ7VFoukDEQ6P9fkP3cQp9fnHEem4aJT0+Uk7LX9qUc32Rw7G0o12+/vMKEZE9H9Dw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('7736f0b869de0f74a5ed7f8d6529949238eb0f0421f3fc2bbc438084f21c8055', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:38:20.664151', '2019-06-03 16:38:20.664152', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAAAAAAH5kC3vAAAAQDjBSAulKc9tRqGg+OkVbKPz4olRQYUevyCfv0LAlqbXG6yPbpR0BR6o7mrimRm8O4VoRBGIATQB42NOWcFzdQw=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{OMFIC6Upz21GoaD46RVso/PiiVFBhR6/IJ+/QsCWptcbrI9ulHQFHqjuauKZGbw7hWhEEYgBNAHjY05ZwXN1DA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 1, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934593, 100, 1, '2019-06-03 16:38:20.677481', '2019-06-03 16:38:20.677482', 12884905984, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{+WDsYuEmDTHuOkDDUTDofZcXrJEiZ8kjAV/HT026Llu04kAV7AUA185oAHwVBmXmncDmDeToMcOKB9Q1QPXqBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:38:20.677754', '2019-06-03 16:38:20.677754', 12884910080, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:38:20.690031', '2019-06-03 16:38:20.690031', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAECDzqvkQBQoNAJifPRXDoLhvtycT3lFPCQ51gkdsFHaBNWw05S/VhW0Xgkr0CBPE4NaFV2Kmcs3ZwLmib4TRrML', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTTUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{g86r5EAUKDQCYnz0Vw6C4b7cnE95RTwkOdYJHbBR2gTVsNOUv1YVtF4JK9AgTxODWhVdipnLN2cC5om+E0azCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f508f24622cb2658b8b46c84fd1cd0f13b68090baae85b41e8b67cf16edf578c', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:38:20.690207', '2019-06-03 16:38:20.690207', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAAAAAABVvwF9wAAAEArq72awj8I0bL2hCJ9DOo1fUwxpwUnK9R5NvR/ewXcofvO+1pRNJJeTNHMGlbdlFKeqkwm3fkPP91vgLWX47oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTTUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLmrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{K6u9msI/CNGy9oQifQzqNX1MMacFJyvUeTb0f3sF3KH7zvtaUTSSXkzRzBpW3ZRSnqpMJt35Dz/db4C1l+O6Aw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('2b2e82dbabb024b27a0c3140ca71d8ac9bc71831f9f5a3bd69eca3d88fb0ec5c', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:38:20.690327', '2019-06-03 16:38:20.690328', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAO5rKAAAAAAAAAAABVvwF9wAAAEDJul1tLGLF4Vxwt0dDCVEf6tb5l4byMrGgCp+lVZMmxct54iNf2mxtjx6Md5ZJ4E4Dlcsf46EAhBGSUPsn8fYD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLmrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrL0k6DUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ybpdbSxixeFccLdHQwlRH+rW+ZeG8jKxoAqfpVWTJsXLeeIjX9psbY8ejHeWSeBOA5XLH+OhAIQRklD7J/H2Aw==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/non_native_payment.rb b/services/horizon/internal/test/scenarios/non_native_payment.rb deleted file mode 100644 index fc824ca117..0000000000 --- a/services/horizon/internal/test/scenarios/non_native_payment.rb +++ /dev/null @@ -1,22 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :scott, :master, 100 -create_account :usd_gateway, :master, 100 -create_account :andrew, :master, 100 - -close_ledger - -trust :scott, :usd_gateway, "USD" -trust :andrew, :usd_gateway, "USD" - -close_ledger - -payment :usd_gateway, :scott, ["USD", :usd_gateway, 100] - -close_ledger - -payment :scott, :andrew, ["USD", :usd_gateway, 50] - -close_ledger diff --git a/services/horizon/internal/test/scenarios/order_books-core.sql b/services/horizon/internal/test/scenarios/order_books-core.sql deleted file mode 100644 index c372d4ffae..0000000000 --- a/services/horizon/internal/test/scenarios/order_books-core.sql +++ /dev/null @@ -1,786 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999789999999700, 3, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999600, 8589934596, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 99999999200, 8589934600, 8, NULL, '', 'AQAAAA==', 0, 6, 521500000000, 0, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 99999999200, 8589934600, 8, NULL, '', 'AQAAAA==', 0, 6, 0, 60000000000, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('d3f31f4c9cc9e5a3e3a1a555ee4117c7832b138d1d7fa6a56100a6ad9691d8af', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 'f755f43251361a4c01d1f4bf92bfe06d0df275a0c69a5d036385901158acd403', 2, 1559579693, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZCS8URcyE4gRYsZAdb7e4uHwbaA5fhFIEcA1CSR23Z5oAAAAAXPVMLQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAzi1xgnE3PAfb2CbU6dwiHL3p/nbMw7WpXJpWKu4ASuj3VfQyUTYaTAHR9L+Sv+BtDfJ1oMaaXQNjhZARWKzUAwAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('ee5eb4ca3953f13267d150232a56130d85f1046a095475c2ced90e70fd0b7c3f', 'd3f31f4c9cc9e5a3e3a1a555ee4117c7832b138d1d7fa6a56100a6ad9691d8af', 'd677e16d86d2db025d8566c07e637b5d6e73feb740a8f3ed90338aa7b1ffbf22', 3, 1559579694, 'AAAAC9PzH0ycyeWj46GlVe5BF8eDKxONHX+mpWEApq2WkdivNyQdrblsa09Sp07tvZedQwAg6pVWfut907LWUCZCF7MAAAAAXPVMLgAAAAAAAAAAgzaJz4Xq1aG8spy1oEm7qAluf8fQetm330Mf8Zmid+DWd+FthtLbAl2FZsB+Y3tdbnP+t0Co8+2QM4qnsf+/IgAAAAMN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('489fc344816d731c2d49c820ffca50c3b2f8bccf4601d54b85e670e18660583b', 'ee5eb4ca3953f13267d150232a56130d85f1046a095475c2ced90e70fd0b7c3f', '140db62d895989dd8ba0f9e7af1ffe779e94d004adab1e81eaf59b47af033854', 4, 1559579695, 'AAAAC+5etMo5U/EyZ9FQIypWEw2F8QRqCVR1ws7ZDnD9C3w/XrJpvir6M5qcfccRwfa25D82mk9KqVu+jfp2oyV8oB4AAAAAXPVMLwAAAAAAAAAAEvM5tT8l0dTEZQLsPGomBGcTJkGZVcTwRLD10i4EXb8UDbYtiVmJ3Yug+eevH/53npTQBK2rHoHq9ZtHrwM4VAAAAAQN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1a55abf2af4c3e77fc6566e22e64673a3af93eb7f3868cb71d24517b69ddf321', '489fc344816d731c2d49c820ffca50c3b2f8bccf4601d54b85e670e18660583b', 'fbbe3ab2f80a6e7c0bb95c1b242c149e3fc7a47ab2629bb60cf12435813892fb', 5, 1559579696, 'AAAAC0ifw0SBbXMcLUnIIP/KUMOy+LzPRgHVS4XmcOGGYFg74pBNjQudZQeUtO+ef0ClbZW4mHTsXDthjA1m2/YMKVYAAAAAXPVMMAAAAAAAAAAAIMV0QzQRdUmn10wWB1qZt+ll6BH0Tj/XNrUL4wpqrGv7vjqy+ApufAu5XBskLBSeP8ekerJim7YM8SQ1gTiS+wAAAAUN4Lazp2QAAAAAAAAAAAakAAAAAAAAAAAAAAAGAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('c4a6a74732738a3c0a9f593eeed9a3934ded945f534960237af97d14a19c2d7a', '1a55abf2af4c3e77fc6566e22e64673a3af93eb7f3868cb71d24517b69ddf321', 'ecb8ce5b84985d9d82711596227eceef237496f801dd35bf033bcd8d3dc4c8a2', 6, 1559579697, 'AAAACxpVq/KvTD53/GVm4i5kZzo6+T6384aMtx0kUXtp3fMhZfwtfyZ3No855TGDHuDE64RHIVy2DVnZ1LWuKKUjO7cAAAAAXPVMMQAAAAAAAAAAO03rkSSGII+TmdA0r8T7dSNCWamYkyOlDZ73gpuryU/suM5bhJhdnYJxFZYifs7vI3SW+AHdNb8DO82NPcTIogAAAAYN4Lazp2QAAAAAAAAAAAj8AAAAAAAAAAAAAAAMAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 1000000000, 1, 10, 0.100000000000000006, 0, 5); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 6, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAA==', 10000000000, 50, 1, 50, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 5, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 50000000000, 1, 5, 0.200000000000000011, 0, 5); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 2, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAA==', 100000000, 15, 1, 15, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 3, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 9000000000, 1, 9, 0.111111111111111105, 0, 5); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 4, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAA==', 1000000000, 20, 1, 20, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 10, 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 9000000000, 1, 9, 0.111111111111111105, 0, 6); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8, 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 1000000000, 1, 10, 0.100000000000000006, 0, 6); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 9, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 1000000000, 20, 1, 20, 0, 6); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 12, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 10000000000, 50, 1, 50, 0, 6); -INSERT INTO offers VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 7, 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 100000000, 15, 1, 15, 0, 6); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 11, 'AAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 50000000000, 1, 5, 0.200000000000000011, 0, 6); - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCYWLNHNGLG4O3CDVPTJEFAGNHBSZWTR3G4XVJ6FVYKKVQLD2FLCZSFW', 2, 'AAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAAAAAAIAAAACAAAAAQAAAEgJLxRFzITiBFixkB1vt7i4fBtoDl+EUgRwDUJJHbdnmgAAAABc9UwtAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABAnM0x3iVcxcSz6Sau6Ro2AFxoawHqjvEbAcemvolBWgAAABAOBqb0lxPXzSAWaqPJFx2Rmnsg1G84M8xDdaiJv3K+7I5dAIy6F3my/rtVFbQaOuwq5YQXUQUskk/eiBrErorBQ=='); -INSERT INTO scphistory VALUES ('GCYWLNHNGLG4O3CDVPTJEFAGNHBSZWTR3G4XVJ6FVYKKVQLD2FLCZSFW', 3, 'AAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAAAAAAMAAAACAAAAAQAAADA3JB2tuWxrT1KnTu29l51DACDqlVZ+633TstZQJkIXswAAAABc9UwuAAAAAAAAAAAAAAABAnM0x3iVcxcSz6Sau6Ro2AFxoawHqjvEbAcemvolBWgAAABAmYYNdEohGlNrqnolPJOfUtN1fsDx6J2nP3CUduWTHTAY8I5+s2+WocAPDhudtaLo+JCZdRuyhumS/d3khvGZCg=='); -INSERT INTO scphistory VALUES ('GCYWLNHNGLG4O3CDVPTJEFAGNHBSZWTR3G4XVJ6FVYKKVQLD2FLCZSFW', 4, 'AAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAAAAAAQAAAACAAAAAQAAADBesmm+Kvozmpx9xxHB9rbkPzaaT0qpW76N+najJXygHgAAAABc9UwvAAAAAAAAAAAAAAABAnM0x3iVcxcSz6Sau6Ro2AFxoawHqjvEbAcemvolBWgAAABAiHstUEFyW/m20cZFihsKXq6koYZDeLhZq5zWoXJimVeBBJh/p3YGQyCPX3svxn59vgJUpLmQEt7XOL4doUMWDA=='); -INSERT INTO scphistory VALUES ('GCYWLNHNGLG4O3CDVPTJEFAGNHBSZWTR3G4XVJ6FVYKKVQLD2FLCZSFW', 5, 'AAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAAAAAAUAAAACAAAAAQAAADDikE2NC51lB5S0755/QKVtlbiYdOxcO2GMDWbb9gwpVgAAAABc9UwwAAAAAAAAAAAAAAABAnM0x3iVcxcSz6Sau6Ro2AFxoawHqjvEbAcemvolBWgAAABA3nvvrq9/ISoOw6tiLf2eQ+sFmLa0NVuPve4/LW30eJHfHcp5XV6SvX+a/h7EgoPAmACnE8dEHEyKr1p9nNAdAA=='); -INSERT INTO scphistory VALUES ('GCYWLNHNGLG4O3CDVPTJEFAGNHBSZWTR3G4XVJ6FVYKKVQLD2FLCZSFW', 6, 'AAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAAAAAAYAAAACAAAAAQAAADBl/C1/Jnc2jznlMYMe4MTrhEchXLYNWdnUta4opSM7twAAAABc9UwxAAAAAAAAAAAAAAABAnM0x3iVcxcSz6Sau6Ro2AFxoawHqjvEbAcemvolBWgAAABAgL9UjzPolwVYSrKrVz7/p/8gERzXwhJj9CM12JeQCqSHc/0VPjxGxi76TdRgoKoUBuzNE68yul+HyJLtNcaDBg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('027334c77895731712cfa49abba468d80171a1ac07aa3bc46c071e9afa250568', 6, 'AAAAAQAAAAEAAAAAsWW07TLNx2xDq+aSFAZpwyzacdm5eqfFrhSqwWPRViwAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('lastclosedledger ', 'c4a6a74732738a3c0a9f593eeed9a3934ded945f534960237af97d14a19c2d7a'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 6, - "currentBuckets": [ - { - "curr": "e1a58d303c4742d0ed42425a1503342ae2c60dadada019eedbc6f8109e88253b", - "next": { - "state": 0 - }, - "snap": "d88c8528d563c2a1aebbffb2bdd399fdbb7d4336a0e4a8be2257b20ffae5f0ca" - }, - { - "curr": "8c67e3be919360b81a9d1c939354ed3aa51c36a87b8e66d601e45403634aff1c", - "next": { - "state": 1, - "output": "d88c8528d563c2a1aebbffb2bdd399fdbb7d4336a0e4a8be2257b20ffae5f0ca" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACxZbTtMs3HbEOr5pIUBmnDLNpx2bl6p8WuFKrBY9FWLAAAAAAAAAAGAAAAAwJzNMd4lXMXEs+kmrukaNgBcaGsB6o7xGwHHpr6JQVoAAAAAQAAAJhl/C1/Jnc2jznlMYMe4MTrhEchXLYNWdnUta4opSM7twAAAABc9UwxAAAAAAAAAAEAAAAAsWW07TLNx2xDq+aSFAZpwyzacdm5eqfFrhSqwWPRViwAAABAyHi8IXOpKZt9m3kmd9LNVc9lVswNXD0AM+6MYmCmoucGLesgmpZ8N3RYu1MRxvggJ/tHEeinMnjOZ8DFrviMCQAAAAEAAACYZfwtfyZ3No855TGDHuDE64RHIVy2DVnZ1LWuKKUjO7cAAAAAXPVMMQAAAAAAAAABAAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAQMh4vCFzqSmbfZt5JnfSzVXPZVbMDVw9ADPujGJgpqLnBi3rIJqWfDd0WLtTEcb4ICf7RxHopzJ4zmfAxa74jAkAAABAjymmUODr/NaoYIUtirtkOSYoy2I7OyzqVLSGb2DqwSUMTUIZDpUg5jOumgrAU5svRosR0em3JKBJvnAksjMkCgAAAACxZbTtMs3HbEOr5pIUBmnDLNpx2bl6p8WuFKrBY9FWLAAAAAAAAAAGAAAAAgAAAAEAAAAwZfwtfyZ3No855TGDHuDE64RHIVy2DVnZ1LWuKKUjO7cAAAAAXPVMMQAAAAAAAAAAAAAAAQJzNMd4lXMXEs+kmrukaNgBcaGsB6o7xGwHHpr6JQVoAAAAQIC/VI8z6JcFWEqyq1c+/6f/IBEc18ISY/QjNdiXkAqkh3P9FT48RsYu+k3UYKCqFAbszROvMrpfh8iS7TXGgwYAAAABGlWr8q9MPnf8ZWbiLmRnOjr5Prfzhoy3HSRRe2nd8yEAAAAGAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQOEPkO/tqT4kQBzNlTOezZtiybuEk9mMmxGjLlmHueW8QtUS4J1O3Why4NKh8vwmonKQ1uMpCM/zYRzumjSEuAkAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAAgAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAnoayYrF6OEhKYq4sh0Xp2LEPACIaoYIbEnndY6gUDG5R2kC+vfFXkiG/+ePx2DlG0HNvwpgKg5hOJsVEMysHBQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAABgAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAQAAAAoAAAAAAAAAAAAAAAAAAAABruS+TAAAAEDoBM5a3yMs2NzlblnUTlI+98iwSLVdZqWZVjjmTIOevFY6temrHsk4L1FAb1pgUDo3Syw7GO71N0kfEQIIgjAJAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAhhxGgAAAAABAAAACQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQDsHLzD/7q/tBaFt+vL8svn4y3q1AFxMIYuT8NMzbswVsCUcLI1QlkxBQWtB7SjoDQMtd6dJEaO2upmPX9P3PAQAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAABkAAAAAgAAAAYAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAABfXhAAAAAA8AAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABAlFlL601BUvClwtCF2Ml08uHMy0rQ/xguaNPgG8aOgbt/n9z236xF+rkndcbjsTCf5LM6dz1VXhDC8st26yLDAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAGQAAAACAAAABwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAFAAAAAEAAAAAAAAAAAAAAAAAAAABbxSIWgAAAEDT2I08k+/5mGmtkJGxcw5tIy6Sw4SbWQPqyTSUe0k37gXFCV3OVvlMFrP8CN9osLuInlN5WuqSSJMCP9HaunUMAAAAAQAAAAEAAAABAAAAALFltO0yzcdsQ6vmkhQGacMs2nHZuXqnxa4UqsFj0VYsAAAAAA=='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 50000000000, 1, 6, 0, 22200000000); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 50000000000, 1, 6, 22200000000, 0); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'BTC', 9223372036854775807, 60000000000, 1, 6, 0, 60000000000); -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'BTC', 9223372036854775807, 60000000000, 1, 6, 521500000000, 0); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('2aadfb093f2817bd454a973ab441c4a3d7c948cc3a277fcb006bef7528bf949b', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('37156be3b9c170a015dbb63fe7b282b1309d477626f84cc6c9bcad1bf2bb3927', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 3, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 4, 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('73d859647f9f24f6a74bfc936df199256f67d852c472c26cabea83bec22b832d', 4, 3, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5ce932151e3d972e4ef521b0a6c63f173a5d73c324178379c1c8d52b19713ec8', 4, 4, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f42caf0be4aa867ffa832f8f925b75cf89b5615528016eb7ea47a285d2919a6c', 5, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('6fcbcfbcde0ad6e2da47126334413984d7337dffa9c537fb0569f848b3d2f6f2', 5, 2, 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('dcd151fda3242912d2fe71e0181f80806f081a61cf4746873b2ec15bb1bae395', 5, 3, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('e9185c1cd138c5c15625531cfb527c50b9b84fadaa1a45c749f7af9647dec450', 5, 4, 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f93841b864bc4ce3ddcc2e2ab4378bfd443ecd6eee85b95d634da5c00b0cd667', 5, 5, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('cd12e89db9e04541e37c796ebaae118d36f3bf9dcd3dde4ae0af96b768ffe71f', 5, 6, 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('82ebbbd502be295802887ff05f5cc888c4357a3c6c81f6b1dbdde1e3fb3989b1', 6, 1, 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25agAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('701efa0b0226e961d31df74f4282982b4048b2b9849ea3f7e02a418511d7a9c5', 6, 2, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25agAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('a415b192f3730a3ef139035f3c67e3b10a4ea69ff5145f3a76615c1a82400dc9', 6, 3, 'AAAAAgAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduWoAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25UQAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('5dbdfd3ab91f4a52a11ba92c60334bca0d4aad951fe3d159b373afaba1632ea1', 6, 4, 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduWoAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25UQAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('dfcf019e8c71290048dcd0e4fa01a6d7278386b3e6a793b4c53dd7751cd289e9', 6, 5, 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduVEAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('483298f40a79f46f684c41d22d4d902f1d3feb53abe5551d3ad69dc832408055', 6, 6, 'AAAAAgAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduVEAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('2aadfb093f2817bd454a973ab441c4a3d7c948cc3a277fcb006bef7528bf949b', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHboAAAAAAAAAAABVvwF9wAAAECHa9hPxY+5w4/Cg1gW2BdJIU0CmCgnjjXQzx1DjeJzT4phXDLOieuZJoTX6jvhdzMahfepPlpQEIx82W5X8pIG', 'Kq37CT8oF71FSpc6tEHEo9fJSMw6J3/LAGvvdSi/lJsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtpoK4TLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('37156be3b9c170a015dbb63fe7b282b1309d477626f84cc6c9bcad1bf2bb3927', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHboAAAAAAAAAAABVvwF9wAAAEDJvf4IwI5rQT3Ap0/ZSFq+RwV1J6eAZV53d+d4+Bal+v3zdhIu82I/eIrOhDHQYrtuPZFwIcE4fuDjBgVIguEO', 'NxVr47nBcKAV27Y/57KCsTCdR3Ym+EzGybytG/K7OScAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtpoK4TLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtoLCakrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'gRGSw4ZD33PAFaWh13uALf8F1PUPxtEIFqp1wKYQn5oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 3, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQEKBv+8zL1epwxC+sJhEYPmbjL9XScXtctoMIdet5dhgk7YJVJzAnRSgYTvfyoIJKJdQmX66uh2o+rG9K6JImgY=', 'NHa8ZJVjSIzwJdgnkKqcRGSRiCMrFQ0oZNE/6frOVAYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 4, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQBH/ML6+RzWquFPh8gLF2RuZzYtjjpPeHv/od9M74xlU09Xa4a5e1NhMtMSRIoLItg1EaDWE9zvtHflVWIAaSwQ=', 'ffhXwjx9/rl018OVZ3VoWo7fqElrt4H9NGyOICX62b8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQH/ZkzR/eC0F7xP9zApeHvMH7nqetzaSdYh8WHyrwwvbEnx4Db6gz0grnRJBJS66OZbGmCk7yzHm8DkJ7bJ4QAU=', '6pRUNqO2UO+ogGPnN1GM8ZKNmkPRq6PsaEcE8WCzcz4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQFFGLGFFXbEDRdk2eFyQATNpHuqO/sFrpqsxmNNwGa+MLibNQJLDXWafC4W8KMKQ/hE0M0TLxZeu/O8tYnBuwwA=', 'QWpjw/FJFTdpjNtvmBCX7Y5EyifS2QBr0Lpogy6/nVUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('73d859647f9f24f6a74bfc936df199256f67d852c472c26cabea83bec22b832d', 4, 3, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAAAAAAAAAAAH5kC3vAAAAQDRihMZEiZbpT45/sHslqaKo9bRzLTxvKY+d7hxxHyvlpZSCM8LOZ6frXbAweCsomNpe449ZDHEiwT2oQTWjXg8=', 'c9hZZH+fJPanS/yTbfGZJW9n2FLEcsJsq+qDvsIrgy0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5ce932151e3d972e4ef521b0a6c63f173a5d73c324178379c1c8d52b19713ec8', 4, 4, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAAAAAAAAAAAH5kC3vAAAAQIk+tsokBzu1gulfbYjE1e8r1k1piyBZ4dBn0u7vVgZ6/+qiElx7hKerBLj1KjbZGQXdaf90YaYEiJ8bby0EYgo=', 'XOkyFR49ly5O9SGwpsY/Fzpdc8MkF4N5wcjVKxlxPsgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f42caf0be4aa867ffa832f8f925b75cf89b5615528016eb7ea47a285d2919a6c', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAeyObGhkwxonX/VI/jcfjrHOdhMDI9U7u4KxVjA3XHqkW4ENworQ5mZDRjj282acAG8cMfWGvYfFcQVVdX62nCw==', '9CyvC+Sqhn/6gy+Pklt1z4m1YVUoAW636keihdKRmmwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAQAAAAoAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO5rKAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAABfXhAAAAAAAAAAAAAAAAAAAAAAA='); -INSERT INTO txhistory VALUES ('6fcbcfbcde0ad6e2da47126334413984d7337dffa9c537fb0569f848b3d2f6f2', 5, 2, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAABfXhAAAAAA8AAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABAxsghzEhvQmICVccjSoy9Q2LUjXol62JlBd8shmRwqO9XyelpSY554bdmHq6xqc6jYZow955E47PWqCEfeVhhCw==', 'b8vPvN4K1uLaRxJjNEE5hNczff+pxTf7BWn4SLPS9vIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAAAgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAF9eEAAAAADwAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAFloLwAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAAF9eEAAAAAAAAAAAAAAAAAAAAABQAAAAIAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAAAgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAF9eEAAAAADwAAAAEAAAAAAAAAAAAAAAA='); -INSERT INTO txhistory VALUES ('dcd151fda3242912d2fe71e0181f80806f081a61cf4746873b2ec15bb1bae395', 5, 3, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAqPx69qSD18N3YK5zdNznZdpXBkbohJTuCKnYl0dQPAE/HWxA8fNfVggVZtGaGk8YMcH/4dvB7zeGF9SEQoSQBg==', '3NFR/aMkKRLS/nHgGB+AgG8IGmHPR0aHOy7BW7G645UAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAIYcRoAAAAAAQAAAAkAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO5rKAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAABQAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAIYcRoAAAAAAQAAAAkAAAAAAAAAAAAAAAAAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAABfXhAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAABBkKsAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('e9185c1cd138c5c15625531cfb527c50b9b84fadaa1a45c749f7af9647dec450', 5, 4, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAO5rKAAAAABQAAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABAgI2ziUivGtOdn4yh1DKts6kzH4kZroEEHAUKspjBt8JrewsqrY1vOvn/5ob+x5EGmpEOFaDB/mINM33OASmyAA==', '6RhcHNE4xcFWJVMc+1J8ULm4T62qGkXHSfevlkfexFAAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAABAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAA7msoAAAAAFAAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAFloLwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAAF9eEAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAAEGQqwAAAAAAAAAAAAAAAAAAAAAFAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAEAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAADuaygAAAAAUAAAAAQAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f93841b864bc4ce3ddcc2e2ab4378bfd443ecd6eee85b95d634da5c00b0cd667', 5, 5, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAO6P8u7hte5mLhMJe3EDbGFmBHKg/kN03Gfvwao0kYaGv7wHYouK/zhWBLu3A+tB4haCav2a/dO1JiND6xX11AA==', '+ThBuGS8TOPdzC4qtDeL/UQ+zW7uhbldY02lwAsM1mcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAQAAAAUAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAABQAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAQAAAAUAAAAAAAAAAAAAAAAAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAQZCrAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAKVnI8AAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('cd12e89db9e04541e37c796ebaae118d36f3bf9dcd3dde4ae0af96b768ffe71f', 5, 6, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABA5Xo6CV4r7iFHfyeH2p1RsjxOyoXGqhom3bEbhCMeTQNK2+UYCyWnmhZR6yRiWge9MSfcFhiv1LafatF+SW+EAg==', 'zRLonbngRUHjfHluuq4RjTbzv53NPd5K4K+Wt2j/5x8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAABgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAJUC+QAAAAAMgAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAABBkKsAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApWcjwAAAAAAAAAAAAAAAAAAAAAFAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAGAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('82ebbbd502be295802887ff05f5cc888c4357a3c6c81f6b1dbdde1e3fb3989b1', 6, 1, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAX14QAAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQJRZS+tNQVLwpcLQhdjJdPLhzMtK0P8YLmjT4BvGjoG7f5/c9t+sRfq5J3XG47Ewn+SzOnc9VV4QwvLLdusiwwA=', 'guu71QK+KVgCiH/wX1zIiMQ1ejxsgfax293h4/s5ibEAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAABwAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAABfXhAAAAAA8AAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApWcjwAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAABAAAAAAAAAAAAAAACm5JwAAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAcAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAX14QAAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABgAAAAYAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAAAAAAAAAAABAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('701efa0b0226e961d31df74f4282982b4048b2b9849ea3f7e02a418511d7a9c5', 6, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAABAAAACgAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQOgEzlrfIyzY3OVuWdROUj73yLBItV1mpZlWOOZMg568Vjq16aseyTgvUUBvWmBQOjdLLDsY7vU3SR8RAgiCMAk=', 'cB76CwIm6WHTHfdPQoKYK0BIsrmEnqP34CpBhRHXqcUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAGAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAYAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAA7msoAAAAAAAAAAAAAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAClZyPAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAKbknAAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('a415b192f3730a3ef139035f3c67e3b10a4ea69ff5145f3a76615c1a82400dc9', 6, 3, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAAUAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQNPYjTyT7/mYaa2QkbFzDm0jLpLDhJtZA+rJNJR7STfuBcUJXc5W+UwWs/wI32iwu4ieU3la6pJIkwI/0dq6dQw=', 'pBWxkvNzCj7xOQNfPGfjsQpOpp/1FF86dmFcGoJADckAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAACQAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAABQAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApuScAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAABAAAAAAAAAAAAAAAC1y06AAAAAAAAAAAAAAAAAwAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABwAAAAYAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAJAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAFAAAAAEAAAAAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('5dbdfd3ab91f4a52a11ba92c60334bca0d4aad951fe3d159b373afaba1632ea1', 6, 4, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAhhxGgAAAAABAAAACQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQDsHLzD/7q/tBaFt+vL8svn4y3q1AFxMIYuT8NMzbswVsCUcLI1QlkxBQWtB7SjoDQMtd6dJEaO2upmPX9P3PAQ=', 'Xb39OrkfSlKhG6ksYDNLyg1KrZUf49FZs3Ovq6FjLqEAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACm5JwAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAALXLToAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAABwAAAAcAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('dfcf019e8c71290048dcd0e4fa01a6d7278386b3e6a793b4c53dd7751cd289e9', 6, 5, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQJ6GsmKxejhISmKuLIdF6dixDwAiGqGCGxJ53WOoFAxuUdpAvr3xV5Ihv/nj8dg5RtBzb8KYCoOYTibFRDMrBwU=', '388BnoxxKQBI3NDk+gGm1yeDhrPmp5O0xT3XdRzSiekAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACwAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACwAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAC1y06AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAUrOR4AAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAACAAAAAgAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('483298f40a79f46f684c41d22d4d902f1d3feb53abe5551d3ad69dc832408055', 6, 6, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQOEPkO/tqT4kQBzNlTOezZtiybuEk9mMmxGjLlmHueW8QtUS4J1O3Why4NKh8vwmonKQ1uMpCM/zYRzumjSEuAk=', 'SDKY9Ap59G9oTEHSLU2QLx0/61Or5VUdOtadyDJAgFUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAADAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAADAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAALXLToAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAABSs5HgAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAACAAAAAgAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/order_books-horizon.sql b/services/horizon/internal/test/scenarios/order_books-horizon.sql deleted file mode 100644 index 58a7265f19..0000000000 --- a/services/horizon/internal/test/scenarios/order_books-horizon.sql +++ /dev/null @@ -1,1065 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '120000000000', 2, 0, ''); -INSERT INTO asset_stats VALUES (2, '100000000000', 2, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_accounts VALUES (2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 4, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'BTC', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_assets VALUES (2, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 2, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (2, 17179873281, 1, 2, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179873281, 2, 3, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179877377, 1, 2, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179877377, 2, 3, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179881473, 1, 2, '{"amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179881473, 2, 3, '{"amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179885569, 1, 2, '{"amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179885569, 2, 3, '{"amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 12884914177, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884918273, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 1, 0, '{"starting_balance": "10000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589942785, 2, 3, '{"amount": "10000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 8589946881, 1, 0, '{"starting_balance": "10000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589946881, 2, 3, '{"amount": "10000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589946881, 3, 10, '{"weight": 1, "public_key": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (6, 'c4a6a74732738a3c0a9f593eeed9a3934ded945f534960237af97d14a19c2d7a', '1a55abf2af4c3e77fc6566e22e64673a3af93eb7f3868cb71d24517b69ddf321', 6, 6, '2019-06-03 16:34:57', '2019-06-03 16:34:56.56589', '2019-06-03 16:34:56.56589', 25769803776, 16, 1000000000000000000, 2300, 100, 100000000, 1000000, 11, 'AAAACxpVq/KvTD53/GVm4i5kZzo6+T6384aMtx0kUXtp3fMhZfwtfyZ3No855TGDHuDE64RHIVy2DVnZ1LWuKKUjO7cAAAAAXPVMMQAAAAAAAAAAO03rkSSGII+TmdA0r8T7dSNCWamYkyOlDZ73gpuryU/suM5bhJhdnYJxFZYifs7vI3SW+AHdNb8DO82NPcTIogAAAAYN4Lazp2QAAAAAAAAAAAj8AAAAAAAAAAAAAAAMAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 6, 0); -INSERT INTO history_ledgers VALUES (5, '1a55abf2af4c3e77fc6566e22e64673a3af93eb7f3868cb71d24517b69ddf321', '489fc344816d731c2d49c820ffca50c3b2f8bccf4601d54b85e670e18660583b', 6, 6, '2019-06-03 16:34:56', '2019-06-03 16:34:56.585303', '2019-06-03 16:34:56.585303', 21474836480, 16, 1000000000000000000, 1700, 100, 100000000, 1000000, 11, 'AAAAC0ifw0SBbXMcLUnIIP/KUMOy+LzPRgHVS4XmcOGGYFg74pBNjQudZQeUtO+ef0ClbZW4mHTsXDthjA1m2/YMKVYAAAAAXPVMMAAAAAAAAAAAIMV0QzQRdUmn10wWB1qZt+ll6BH0Tj/XNrUL4wpqrGv7vjqy+ApufAu5XBskLBSeP8ekerJim7YM8SQ1gTiS+wAAAAUN4Lazp2QAAAAAAAAAAAakAAAAAAAAAAAAAAAGAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 6, 0); -INSERT INTO history_ledgers VALUES (4, '489fc344816d731c2d49c820ffca50c3b2f8bccf4601d54b85e670e18660583b', 'ee5eb4ca3953f13267d150232a56130d85f1046a095475c2ced90e70fd0b7c3f', 4, 4, '2019-06-03 16:34:55', '2019-06-03 16:34:56.604266', '2019-06-03 16:34:56.604266', 17179869184, 16, 1000000000000000000, 1100, 100, 100000000, 1000000, 11, 'AAAAC+5etMo5U/EyZ9FQIypWEw2F8QRqCVR1ws7ZDnD9C3w/XrJpvir6M5qcfccRwfa25D82mk9KqVu+jfp2oyV8oB4AAAAAXPVMLwAAAAAAAAAAEvM5tT8l0dTEZQLsPGomBGcTJkGZVcTwRLD10i4EXb8UDbYtiVmJ3Yug+eevH/53npTQBK2rHoHq9ZtHrwM4VAAAAAQN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (3, 'ee5eb4ca3953f13267d150232a56130d85f1046a095475c2ced90e70fd0b7c3f', 'd3f31f4c9cc9e5a3e3a1a555ee4117c7832b138d1d7fa6a56100a6ad9691d8af', 4, 4, '2019-06-03 16:34:54', '2019-06-03 16:34:56.629121', '2019-06-03 16:34:56.629121', 12884901888, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAAC9PzH0ycyeWj46GlVe5BF8eDKxONHX+mpWEApq2WkdivNyQdrblsa09Sp07tvZedQwAg6pVWfut907LWUCZCF7MAAAAAXPVMLgAAAAAAAAAAgzaJz4Xq1aG8spy1oEm7qAluf8fQetm330Mf8Zmid+DWd+FthtLbAl2FZsB+Y3tdbnP+t0Co8+2QM4qnsf+/IgAAAAMN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (2, 'd3f31f4c9cc9e5a3e3a1a555ee4117c7832b138d1d7fa6a56100a6ad9691d8af', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 3, 3, '2019-06-03 16:34:53', '2019-06-03 16:34:56.655059', '2019-06-03 16:34:56.655059', 8589934592, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZCS8URcyE4gRYsZAdb7e4uHwbaA5fhFIEcA1CSR23Z5oAAAAAXPVMLQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAzi1xgnE3PAfb2CbU6dwiHL3p/nbMw7WpXJpWKu4ASuj3VfQyUTYaTAHR9L+Sv+BtDfJ1oMaaXQNjhZARWKzUAwAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 3, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:34:56.666765', '2019-06-03 16:34:56.666765', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 25769807873, 1); -INSERT INTO history_operation_participants VALUES (2, 25769811969, 2); -INSERT INTO history_operation_participants VALUES (3, 25769816065, 1); -INSERT INTO history_operation_participants VALUES (4, 25769820161, 2); -INSERT INTO history_operation_participants VALUES (5, 25769824257, 2); -INSERT INTO history_operation_participants VALUES (6, 25769828353, 1); -INSERT INTO history_operation_participants VALUES (7, 21474840577, 2); -INSERT INTO history_operation_participants VALUES (8, 21474844673, 1); -INSERT INTO history_operation_participants VALUES (9, 21474848769, 2); -INSERT INTO history_operation_participants VALUES (10, 21474852865, 1); -INSERT INTO history_operation_participants VALUES (11, 21474856961, 2); -INSERT INTO history_operation_participants VALUES (12, 21474861057, 1); -INSERT INTO history_operation_participants VALUES (13, 17179873281, 3); -INSERT INTO history_operation_participants VALUES (14, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (15, 17179877377, 3); -INSERT INTO history_operation_participants VALUES (16, 17179877377, 1); -INSERT INTO history_operation_participants VALUES (17, 17179881473, 3); -INSERT INTO history_operation_participants VALUES (18, 17179881473, 2); -INSERT INTO history_operation_participants VALUES (19, 17179885569, 3); -INSERT INTO history_operation_participants VALUES (20, 17179885569, 1); -INSERT INTO history_operation_participants VALUES (21, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (22, 12884910081, 1); -INSERT INTO history_operation_participants VALUES (23, 12884914177, 2); -INSERT INTO history_operation_participants VALUES (24, 12884918273, 1); -INSERT INTO history_operation_participants VALUES (25, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (26, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (27, 8589942785, 4); -INSERT INTO history_operation_participants VALUES (28, 8589942785, 2); -INSERT INTO history_operation_participants VALUES (29, 8589946881, 4); -INSERT INTO history_operation_participants VALUES (30, 8589946881, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 30, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (25769807873, 25769807872, 1, 3, '{"price": "15.0000000", "amount": "10.0000000", "price_r": {"d": 1, "n": 15}, "offer_id": 0, "buying_asset_code": "BTC", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (25769811969, 25769811968, 1, 3, '{"price": "0.1000000", "amount": "100.0000000", "price_r": {"d": 10, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "BTC", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (25769816065, 25769816064, 1, 3, '{"price": "20.0000000", "amount": "100.0000000", "price_r": {"d": 1, "n": 20}, "offer_id": 0, "buying_asset_code": "BTC", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (25769820161, 25769820160, 1, 3, '{"price": "0.1111111", "amount": "900.0000000", "price_r": {"d": 9, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "BTC", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (25769824257, 25769824256, 1, 3, '{"price": "0.2000000", "amount": "5000.0000000", "price_r": {"d": 5, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "BTC", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (25769828353, 25769828352, 1, 3, '{"price": "50.0000000", "amount": "1000.0000000", "price_r": {"d": 1, "n": 50}, "offer_id": 0, "buying_asset_code": "BTC", "buying_asset_type": "credit_alphanum4", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 3, '{"price": "0.1000000", "amount": "100.0000000", "price_r": {"d": 10, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474844673, 21474844672, 1, 3, '{"price": "15.0000000", "amount": "10.0000000", "price_r": {"d": 1, "n": 15}, "offer_id": 0, "buying_asset_type": "native", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (21474848769, 21474848768, 1, 3, '{"price": "0.1111111", "amount": "900.0000000", "price_r": {"d": 9, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474852865, 21474852864, 1, 3, '{"price": "20.0000000", "amount": "100.0000000", "price_r": {"d": 1, "n": 20}, "offer_id": 0, "buying_asset_type": "native", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (21474856961, 21474856960, 1, 3, '{"price": "0.2000000", "amount": "5000.0000000", "price_r": {"d": 5, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474861057, 21474861056, 1, 3, '{"price": "50.0000000", "amount": "1000.0000000", "price_r": {"d": 1, "n": 50}, "offer_id": 0, "buying_asset_type": "native", "selling_asset_code": "USD", "selling_asset_type": "credit_alphanum4", "selling_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179877377, 17179877376, 1, 1, '{"to": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179881473, 17179881472, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179885569, 17179885568, 1, 1, '{"to": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "6000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884914177, 12884914176, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884918273, 12884918272, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "10000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "starting_balance": "10000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 25769807872, 1); -INSERT INTO history_transaction_participants VALUES (2, 25769811968, 2); -INSERT INTO history_transaction_participants VALUES (3, 25769816064, 1); -INSERT INTO history_transaction_participants VALUES (4, 25769820160, 2); -INSERT INTO history_transaction_participants VALUES (5, 25769824256, 2); -INSERT INTO history_transaction_participants VALUES (6, 25769828352, 1); -INSERT INTO history_transaction_participants VALUES (7, 21474840576, 2); -INSERT INTO history_transaction_participants VALUES (8, 21474844672, 1); -INSERT INTO history_transaction_participants VALUES (9, 21474848768, 2); -INSERT INTO history_transaction_participants VALUES (10, 21474852864, 1); -INSERT INTO history_transaction_participants VALUES (11, 21474856960, 2); -INSERT INTO history_transaction_participants VALUES (12, 21474861056, 1); -INSERT INTO history_transaction_participants VALUES (13, 17179873280, 3); -INSERT INTO history_transaction_participants VALUES (14, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (15, 17179877376, 3); -INSERT INTO history_transaction_participants VALUES (16, 17179877376, 1); -INSERT INTO history_transaction_participants VALUES (17, 17179881472, 3); -INSERT INTO history_transaction_participants VALUES (18, 17179881472, 2); -INSERT INTO history_transaction_participants VALUES (19, 17179885568, 1); -INSERT INTO history_transaction_participants VALUES (20, 17179885568, 3); -INSERT INTO history_transaction_participants VALUES (21, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (22, 12884910080, 1); -INSERT INTO history_transaction_participants VALUES (23, 12884914176, 2); -INSERT INTO history_transaction_participants VALUES (24, 12884918272, 1); -INSERT INTO history_transaction_participants VALUES (25, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (26, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (27, 8589942784, 4); -INSERT INTO history_transaction_participants VALUES (28, 8589942784, 2); -INSERT INTO history_transaction_participants VALUES (29, 8589946880, 1); -INSERT INTO history_transaction_participants VALUES (30, 8589946880, 4); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 30, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('82ebbbd502be295802887ff05f5cc888c4357a3c6c81f6b1dbdde1e3fb3989b1', 6, 1, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934598, 100, 1, '2019-06-03 16:34:56.566205', '2019-06-03 16:34:56.566205', 25769807872, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAX14QAAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQJRZS+tNQVLwpcLQhdjJdPLhzMtK0P8YLmjT4BvGjoG7f5/c9t+sRfq5J3XG47Ewn+SzOnc9VV4QwvLLdusiwwA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAcAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAX14QAAAAAPAAAAAQAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApWcjwAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAABAAAAAAAAAAAAAAACm5JwAAAAAAAAAAAAAAAAAAAAAAYAAAACAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAcAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAX14QAAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABgAAAAYAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAAAAAAAAAAABAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25agAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA=', '{lFlL601BUvClwtCF2Ml08uHMy0rQ/xguaNPgG8aOgbt/n9z236xF+rkndcbjsTCf5LM6dz1VXhDC8st26yLDAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('701efa0b0226e961d31df74f4282982b4048b2b9849ea3f7e02a418511d7a9c5', 6, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934598, 100, 1, '2019-06-03 16:34:56.566584', '2019-06-03 16:34:56.566584', 25769811968, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAABAAAACgAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQOgEzlrfIyzY3OVuWdROUj73yLBItV1mpZlWOOZMg568Vjq16aseyTgvUUBvWmBQOjdLLDsY7vU3SR8RAgiCMAk=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAgAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAABAAAACgAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAGAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAYAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAA7msoAAAAAAAAAAAAAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAClZyPAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAKbknAAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25agAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA=', '{6ATOWt8jLNjc5W5Z1E5SPvfIsEi1XWalmVY45kyDnrxWOrXpqx7JOC9RQG9aYFA6N0ssOxju9TdJHxECCIIwCQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('a415b192f3730a3ef139035f3c67e3b10a4ea69ff5145f3a76615c1a82400dc9', 6, 3, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934599, 100, 1, '2019-06-03 16:34:56.56681', '2019-06-03 16:34:56.56681', 25769816064, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAAUAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQNPYjTyT7/mYaa2QkbFzDm0jLpLDhJtZA+rJNJR7STfuBcUJXc5W+UwWs/wI32iwu4ieU3la6pJIkwI/0dq6dQw=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAkAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAAUAAAAAQAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApuScAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAABAAAAAAAAAAAAAAAC1y06AAAAAAAAAAAAAAAAAwAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABwAAAAYAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAJAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAFAAAAAEAAAAAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAA', 'AAAAAgAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduWoAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25UQAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA=', '{09iNPJPv+ZhprZCRsXMObSMuksOEm1kD6sk0lHtJN+4FxQldzlb5TBaz/AjfaLC7iJ5TeVrqkkiTAj/R2rp1DA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5dbdfd3ab91f4a52a11ba92c60334bca0d4aad951fe3d159b373afaba1632ea1', 6, 4, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934599, 100, 1, '2019-06-03 16:34:56.567022', '2019-06-03 16:34:56.567022', 25769820160, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAhhxGgAAAAABAAAACQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQDsHLzD/7q/tBaFt+vL8svn4y3q1AFxMIYuT8NMzbswVsCUcLI1QlkxBQWtB7SjoDQMtd6dJEaO2upmPX9P3PAQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAhhxGgAAAAABAAAACQAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACm5JwAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAALXLToAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAABwAAAAcAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAA', 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduWoAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25UQAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA=', '{OwcvMP/ur+0FoW368vyy+fjLerUAXEwhi5Pw0zNuzBWwJRwsjVCWTEFBa0HtKOgNAy13p0kRo7a6mY9f0/c8BA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('dfcf019e8c71290048dcd0e4fa01a6d7278386b3e6a793b4c53dd7751cd289e9', 6, 5, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934600, 100, 1, '2019-06-03 16:34:56.567234', '2019-06-03 16:34:56.567234', 25769824256, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQJ6GsmKxejhISmKuLIdF6dixDwAiGqGCGxJ53WOoFAxuUdpAvr3xV5Ihv/nj8dg5RtBzb8KYCoOYTibFRDMrBwU=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAsAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAAAAAABAAAABQAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAADfhHWAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACwAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAC1y06AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAUrOR4AAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAACAAAAAgAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAA', 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduVEAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAF0h25OAAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAA34R1gAAAAAAAAAAAA=', '{noayYrF6OEhKYq4sh0Xp2LEPACIaoYIbEnndY6gUDG5R2kC+vfFXkiG/+ePx2DlG0HNvwpgKg5hOJsVEMysHBQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('483298f40a79f46f684c41d22d4d902f1d3feb53abe5551d3ad69dc832408055', 6, 6, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934600, 100, 1, '2019-06-03 16:34:56.567438', '2019-06-03 16:34:56.567438', 25769828352, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAAAAAAFvFIhaAAAAQOEPkO/tqT4kQBzNlTOezZtiybuEk9mMmxGjLlmHueW8QtUS4J1O3Why4NKh8vwmonKQ1uMpCM/zYRzumjSEuAk=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbk4AAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAHlr0n8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABgAAAAIAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAADAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAUJUQwAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAYAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAALXLToAAAAAAAAAAAAAAAABAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAABSs5HgAAAAAAAAAAAAAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduTgAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAACAAAAAgAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABgAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAf/////////8AAAABAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAA', 'AAAAAgAAAAMAAAAGAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduVEAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAF0h25OAAAAACAAAABQAAAAUAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAB5a9J/AAAAAAAAAAAAAAAAAAAAAAA=', '{4Q+Q7+2pPiRAHM2VM57Nm2LJu4ST2YybEaMuWYe55bxC1RLgnU7daHLg0qHy/CaicpDW4ykIz/NhHO6aNIS4CQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f42caf0be4aa867ffa832f8f925b75cf89b5615528016eb7ea47a285d2919a6c', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934595, 100, 1, '2019-06-03 16:34:56.585503', '2019-06-03 16:34:56.585503', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAeyObGhkwxonX/VI/jcfjrHOdhMDI9U7u4KxVjA3XHqkW4ENworQ5mZDRjj282acAG8cMfWGvYfFcQVVdX62nCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO5rKAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAABfXhAAAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{eyObGhkwxonX/VI/jcfjrHOdhMDI9U7u4KxVjA3XHqkW4ENworQ5mZDRjj282acAG8cMfWGvYfFcQVVdX62nCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('6fcbcfbcde0ad6e2da47126334413984d7337dffa9c537fb0569f848b3d2f6f2', 5, 2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934595, 100, 1, '2019-06-03 16:34:56.585699', '2019-06-03 16:34:56.585699', 21474844672, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAABfXhAAAAAA8AAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABAxsghzEhvQmICVccjSoy9Q2LUjXol62JlBd8shmRwqO9XyelpSY554bdmHq6xqc6jYZow955E47PWqCEfeVhhCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAIAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAABfXhAAAAAA8AAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAFloLwAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAAF9eEAAAAAAAAAAAAAAAAAAAAABQAAAAIAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAAAAAAAgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAAF9eEAAAAADwAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{xsghzEhvQmICVccjSoy9Q2LUjXol62JlBd8shmRwqO9XyelpSY554bdmHq6xqc6jYZow955E47PWqCEfeVhhCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('dcd151fda3242912d2fe71e0181f80806f081a61cf4746873b2ec15bb1bae395', 5, 3, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934596, 100, 1, '2019-06-03 16:34:56.585868', '2019-06-03 16:34:56.585868', 21474848768, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAqPx69qSD18N3YK5zdNznZdpXBkbohJTuCKnYl0dQPAE/HWxA8fNfVggVZtGaGk8YMcH/4dvB7zeGF9SEQoSQBg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACGHEaAAAAAAEAAAAJAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO5rKAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAABQAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAIYcRoAAAAAAQAAAAkAAAAAAAAAAAAAAAAAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAADuaygAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAABfXhAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAABBkKsAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{qPx69qSD18N3YK5zdNznZdpXBkbohJTuCKnYl0dQPAE/HWxA8fNfVggVZtGaGk8YMcH/4dvB7zeGF9SEQoSQBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('e9185c1cd138c5c15625531cfb527c50b9b84fadaa1a45c749f7af9647dec450', 5, 4, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934596, 100, 1, '2019-06-03 16:34:56.586037', '2019-06-03 16:34:56.586037', 21474852864, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAO5rKAAAAABQAAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABAgI2ziUivGtOdn4yh1DKts6kzH4kZroEEHAUKspjBt8JrewsqrY1vOvn/5ob+x5EGmpEOFaDB/mINM33OASmyAA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAQAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAO5rKAAAAABQAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAFloLwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAABZaC8AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAAAF9eEAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAAEGQqwAAAAAAAAAAAAAAAAAAAAAFAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAEAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAADuaygAAAAAUAAAAAQAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdubUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{gI2ziUivGtOdn4yh1DKts6kzH4kZroEEHAUKspjBt8JrewsqrY1vOvn/5ob+x5EGmpEOFaDB/mINM33OASmyAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f93841b864bc4ce3ddcc2e2ab4378bfd443ecd6eee85b95d634da5c00b0cd667', 5, 5, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934597, 100, 1, '2019-06-03 16:34:56.586199', '2019-06-03 16:34:56.586199', 21474856960, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAO6P8u7hte5mLhMJe3EDbGFmBHKg/kN03Gfvwao0kYaGv7wHYouK/zhWBLu3A+tB4haCav2a/dO1JiND6xX11AA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAACVAvkAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAABQAAAAIAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAQAAAAUAAAAAAAAAAAAAAAAAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbmDAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAlQL5AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAN+EdYAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAQZCrAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAKVnI8AAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduYMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{O6P8u7hte5mLhMJe3EDbGFmBHKg/kN03Gfvwao0kYaGv7wHYouK/zhWBLu3A+tB4haCav2a/dO1JiND6xX11AA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('cd12e89db9e04541e37c796ebaae118d36f3bf9dcd3dde4ae0af96b768ffe71f', 5, 6, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934597, 100, 1, '2019-06-03 16:34:56.586374', '2019-06-03 16:34:56.586374', 21474861056, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAAAAAAAW8UiFoAAABA5Xo6CV4r7iFHfyeH2p1RsjxOyoXGqhom3bEbhCMeTQNK2+UYCyWnmhZR6yRiWge9MSfcFhiv1LafatF+SW+EAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAACVAvkAAAAADIAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAABQF/9wAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbmDAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAUBf/cAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAeWvSfwAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAAAAAAAAAAAABBkKsAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAAAAAAAAAAAApWcjwAAAAAAAAAAAAAAAAAAAAAFAAAAAgAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAAAAAAGAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAAAAAAlQL5AAAAAAyAAAAAQAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduZwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduYMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{5Xo6CV4r7iFHfyeH2p1RsjxOyoXGqhom3bEbhCMeTQNK2+UYCyWnmhZR6yRiWge9MSfcFhiv1LafatF+SW+EAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:34:56.604445', '2019-06-03 16:34:56.604445', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQH/ZkzR/eC0F7xP9zApeHvMH7nqetzaSdYh8WHyrwwvbEnx4Db6gz0grnRJBJS66OZbGmCk7yzHm8DkJ7bJ4QAU=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{f9mTNH94LQXvE/3MCl4e8wfuep63NpJ1iHxYfKvDC9sSfHgNvqDPSCudEkElLro5lsaYKTvLMebwOQntsnhABQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934594, 100, 1, '2019-06-03 16:34:56.604638', '2019-06-03 16:34:56.604639', 17179877376, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQFFGLGFFXbEDRdk2eFyQATNpHuqO/sFrpqsxmNNwGa+MLibNQJLDXWafC4W8KMKQ/hE0M0TLxZeu/O8tYnBuwwA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{UUYsYUVdsQNF2TZ4XJABM2ke6o7+wWumqzGY03AZr4wuJs1AksNdZp8LhbwowpD+ETQzRMvFl6787y1icG7DAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('73d859647f9f24f6a74bfc936df199256f67d852c472c26cabea83bec22b832d', 4, 3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934595, 100, 1, '2019-06-03 16:34:56.604782', '2019-06-03 16:34:56.604782', 17179881472, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAAAAAAAAAAAH5kC3vAAAAQDRihMZEiZbpT45/sHslqaKo9bRzLTxvKY+d7hxxHyvlpZSCM8LOZ6frXbAweCsomNpe449ZDHEiwT2oQTWjXg8=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{NGKExkSJlulPjn+weyWpoqj1tHMtPG8pj53uHHEfK+WllIIzws5np+tdsDB4KyiY2l7jj1kMcSLBPahBNaNeDw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5ce932151e3d972e4ef521b0a6c63f173a5d73c324178379c1c8d52b19713ec8', 4, 4, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934596, 100, 1, '2019-06-03 16:34:56.604915', '2019-06-03 16:34:56.604927', 17179885568, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAAAAAAAAAAAH5kC3vAAAAQIk+tsokBzu1gulfbYjE1e8r1k1piyBZ4dBn0u7vVgZ6/+qiElx7hKerBLj1KjbZGQXdaf90YaYEiJ8bby0EYgo=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{iT62yiQHO7WC6V9tiMTV7yvWTWmLIFnh0GfS7u9WBnr/6qISXHuEp6sEuPUqNtkZBd1p/3RhpgSInxtvLQRiCg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:34:56.629328', '2019-06-03 16:34:56.629329', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934593, 100, 1, '2019-06-03 16:34:56.629864', '2019-06-03 16:34:56.629866', 12884910080, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{+WDsYuEmDTHuOkDDUTDofZcXrJEiZ8kjAV/HT026Llu04kAV7AUA185oAHwVBmXmncDmDeToMcOKB9Q1QPXqBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 3, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:34:56.630812', '2019-06-03 16:34:56.630813', 12884914176, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQEKBv+8zL1epwxC+sJhEYPmbjL9XScXtctoMIdet5dhgk7YJVJzAnRSgYTvfyoIJKJdQmX66uh2o+rG9K6JImgY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHbnOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIduc4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{QoG/7zMvV6nDEL6wmERg+ZuMv1dJxe1y2gwh163l2GCTtglUnMCdFKBhO9/Kggkol1CZfrq6Haj6sb0rokiaBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 4, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934594, 100, 1, '2019-06-03 16:34:56.631057', '2019-06-03 16:34:56.631057', 12884918272, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQBH/ML6+RzWquFPh8gLF2RuZzYtjjpPeHv/od9M74xlU09Xa4a5e1NhMtMSRIoLItg1EaDWE9zvtHflVWIAaSwQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHbnOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIduc4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Ef8wvr5HNaq4U+HyAsXZG5nNi2OOk94e/+h30zvjGVTT1drhrl7U2Ey0xJEigsi2DURoNYT3O+0d+VVYgBpLBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:34:56.655221', '2019-06-03 16:34:56.655221', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('2aadfb093f2817bd454a973ab441c4a3d7c948cc3a277fcb006bef7528bf949b', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:34:56.65539', '2019-06-03 16:34:56.65539', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAXSHboAAAAAAAAAAABVvwF9wAAAECHa9hPxY+5w4/Cg1gW2BdJIU0CmCgnjjXQzx1DjeJzT4phXDLOieuZJoTX6jvhdzMahfepPlpQEIx82W5X8pIG', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtpoK4TLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{h2vYT8WPucOPwoNYFtgXSSFNApgoJ4410M8dQ43ic0+KYVwyzonrmSaE1+o74XczGoX3qT5aUBCMfNluV/KSBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('37156be3b9c170a015dbb63fe7b282b1309d477626f84cc6c9bcad1bf2bb3927', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:34:56.655524', '2019-06-03 16:34:56.655524', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAXSHboAAAAAAAAAAABVvwF9wAAAEDJvf4IwI5rQT3Ap0/ZSFq+RwV1J6eAZV53d+d4+Bal+v3zdhIu82I/eIrOhDHQYrtuPZFwIcE4fuDjBgVIguEO', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtpoK4TLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtoLCakrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAABdIdugAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{yb3+CMCOa0E9wKdP2UhavkcFdSengGVed3fnePgWpfr983YSLvNiP3iKzoQx0GK7bj2RcCHBOH7g4wYFSILhDg==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/order_books.rb b/services/horizon/internal/test/scenarios/order_books.rb deleted file mode 100644 index c85a68c300..0000000000 --- a/services/horizon/internal/test/scenarios/order_books.rb +++ /dev/null @@ -1,45 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott, :master, "10000.0" -create_account :andrew, :master, "10000.0" - -close_ledger - -trust :scott, :usd_gateway, "USD" -trust :andrew, :usd_gateway, "USD" - -trust :scott, :usd_gateway, "BTC" -trust :andrew, :usd_gateway, "BTC" - -close_ledger - -payment :usd_gateway, :scott, ["USD", :usd_gateway, "5000.0"] -payment :usd_gateway, :andrew, ["USD", :usd_gateway, "5000.0"] - -payment :usd_gateway, :scott, ["BTC", :usd_gateway, "6000.0"] -payment :usd_gateway, :andrew, ["BTC", :usd_gateway, "6000.0"] - -close_ledger - -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "10", "10.0" # price = 1/10; amount = 10*10 = 100 -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "100", "9.0" # price = 1/9; amount = 100*9 = 900 -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "5.0" # price = 1/5; amount = 1000*5 = 5000 - -offer :andrew, {sell:["USD", :usd_gateway], for: :native}, "10", "15.0" -offer :andrew, {sell:["USD", :usd_gateway], for: :native}, "100", "20.0" -offer :andrew, {sell:["USD", :usd_gateway], for: :native}, "1000", "50.0" - -close_ledger - -offer :scott, {buy:["USD", :usd_gateway], with: ["BTC", :usd_gateway]}, 10, "10.0" # price = 1/10; amount = 10*10 = 100 -offer :scott, {buy:["USD", :usd_gateway], with: ["BTC", :usd_gateway]}, 100, "9.0" # price = 1/9; amount = 100*9 = 900 -offer :scott, {buy:["USD", :usd_gateway], with: ["BTC", :usd_gateway]}, 1000, "5.0" # price = 1/5; amount = 1000*5 = 5000 - -offer :andrew, {sell:["USD", :usd_gateway], for: ["BTC", :usd_gateway]}, 10, "15.0" -offer :andrew, {sell:["USD", :usd_gateway], for: ["BTC", :usd_gateway]}, 100, "20.0" -offer :andrew, {sell:["USD", :usd_gateway], for: ["BTC", :usd_gateway]}, 1000, "50.0" - -close_ledger diff --git a/services/horizon/internal/test/scenarios/order_books_310-core.sql b/services/horizon/internal/test/scenarios/order_books_310-core.sql deleted file mode 100644 index 24dc062c50..0000000000 --- a/services/horizon/internal/test/scenarios/order_books_310-core.sql +++ /dev/null @@ -1,847 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999989929999999700, 3, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 59999999800, 8589934594, 2, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 9999999600, 8589934596, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999996500, 8589934627, 35, NULL, '', 'AQAAAA==', 0, 5, 0, 1685999999998, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('d1cc81a10bc2fd6dd13a4444e9522f361b0eb28519f1d893c8bbb753466eec0e', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '34c5a4aded48da54f4b82538e068133ea4c6497a6e6e1296effd13a9fa276e40', 2, 1559579810, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZjdLwAXsL2eIh4K+qv7MhQiH7W7LZaUq9IK+/p5Db8bMAAAAAXPVMogAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAA5YwG7hzcH7+TYJ0iG4Sklbds5327gq5uPLExV/3yG/00xaSt7UjaVPS4JTjgaBM+pMZJem5uEpbv/ROp+iduQAAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('e15e176a36631b4c1067eb4d1fca8d22706c38ed0a84377d45b71197097370e5', 'd1cc81a10bc2fd6dd13a4444e9522f361b0eb28519f1d893c8bbb753466eec0e', '271672d663148a387ff1c53cf4f0b2a0e737fd7097f1b597aa16e3ac91edb6d4', 3, 1559579811, 'AAAAC9HMgaELwv1t0TpEROlSLzYbDrKFGfHYk8i7t1NGbuwOrN7iIAwij4SkRAlla+ZJYO0IQWnc7kcoZn1WbRODJXIAAAAAXPVMowAAAAAAAAAAhrVFL6RjAMOSd+xZbT+ONgXtaV13E2WDVpOKC2IZ2LYnFnLWYxSKOH/xxTz08LKg5zf9cJfxtZeqFuOske221AAAAAMN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('e55ebe57d2ae24f6bc9b636f3e66c299f789a9f7d8159f46d93a38071eb5784f', 'e15e176a36631b4c1067eb4d1fca8d22706c38ed0a84377d45b71197097370e5', 'c7f84bec04b0319cfe0619ba17770d7c282511272cde21e4427606a8761fc1ba', 4, 1559579812, 'AAAAC+FeF2o2YxtMEGfrTR/KjSJwbDjtCoQ3fUW3EZcJc3DlW1gzwzaHXpYaRffreilu/1k5AQHqGMV2UTD4ewI9ovsAAAAAXPVMpAAAAAAAAAAA9P74c8f1xfd4wX2Dasj3a3ZXngqhfaJ2yA7eEO3Lts/H+EvsBLAxnP4GGboXdw18KCURJyzeIeRCdgaodh/BugAAAAQN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('80e8bf9a11c3a19711b4aa87272f1ad76ecf6e7adb0145f91fd519756c341d8e', 'e55ebe57d2ae24f6bc9b636f3e66c299f789a9f7d8159f46d93a38071eb5784f', '133743fa1c3cf5ad33bf67f033783bc1158701a1d1f65090aa78e273f67aaece', 5, 1559579813, 'AAAAC+VevlfSriT2vJtjbz5mwpn3ian32BWfRtk6OAcetXhPglYX/kzvbCweg7Ey06USwQ6c6cIjrofNgyH4uSoXJNcAAAAAXPVMpQAAAAAAAAAAJ4/Gr554ZVHMujN++AAdhrv5CCDQrTNFeytjikmekx0TN0P6HDz1rTO/Z/AzeDvBFYcBodH2UJCqeOJz9nquzgAAAAUN4Lazp2QAAAAAAAAAABEwAAAAAAAAAAAAAAAhAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 18, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 41000000000, 10, 41, 0.243902439024390238, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 33, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 3000000000, 10, 3, 3.33333333333333348, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 30000000000, 1, 3, 0.333333333333333315, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 100000000000, 1, 10, 0.100000000000000006, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 3, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 80000000000, 1, 8, 0.125, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 5, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 60000000000, 1, 6, 0.166666666666666657, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 20000000000, 1, 2, 0.5, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 12, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 101000000000, 10, 101, 0.0990099009900990146, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 13, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 91000000000, 10, 91, 0.109890109890109888, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 2, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 90000000000, 1, 9, 0.111111111111111105, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 29, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 42000000000, 5, 21, 0.238095238095238082, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 4, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 70000000000, 1, 7, 0.142857142857142849, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 14, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 81000000000, 10, 81, 0.123456790123456783, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 32, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 12000000000, 5, 6, 0.83333333333333337, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 16, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 61000000000, 10, 61, 0.163934426229508184, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 21, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 11000000000, 10, 11, 0.909090909090909061, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 24, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 92000000000, 5, 46, 0.10869565217391304, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 11, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 1000000000, 10, 1, 10, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 27, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 62000000000, 5, 31, 0.161290322580645157, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 19, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 30999999998, 100000009, 310000028, 0.322580645057232052, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 20, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 21000000000, 10, 21, 0.476190476190476164, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 6, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 50000000000, 1, 5, 0.200000000000000011, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 10, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 10000000000, 1, 1, 1, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 17, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 51000000000, 10, 51, 0.196078431372549017, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 22, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 2000000000, 5, 1, 5, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 23, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 102000000000, 5, 51, 0.0980392156862745084, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 15, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 71000000000, 10, 71, 0.140845070422535218, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 25, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 82000000000, 5, 41, 0.121951219512195119, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 7, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 40000000000, 1, 4, 0.25, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 28, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 52000000000, 5, 26, 0.192307692307692318, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 26, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 72000000000, 5, 36, 0.138888888888888895, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 30, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 32000000000, 5, 16, 0.3125, 0, 5); -INSERT INTO offers VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 31, 'AAAAAA==', 'AAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8=', 22000000000, 5, 11, 0.45454545454545453, 0, 5); - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GBQBMJYSCE6Q5ZHHVCVPGWKS5HWMFH743D4EDF6MTYBTBYHSP7LHOBEI', 2, 'AAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAAAAAAAIAAAACAAAAAQAAAEiN0vABewvZ4iHgr6q/syFCIftbstlpSr0gr7+nkNvxswAAAABc9UyiAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABVWkG+LRhLSSUm15z4+2PEA3tAsIKYFdVO0faqhpGgPoAAABAqQ4v5UhiYMnIPkL7/Tr7FZYb5Sn0J0uDNgHqzlEIGm+JXa045iinZfS5GfETsAGdQNCZpFTIr5JOSXJKgOgMCA=='); -INSERT INTO scphistory VALUES ('GBQBMJYSCE6Q5ZHHVCVPGWKS5HWMFH743D4EDF6MTYBTBYHSP7LHOBEI', 3, 'AAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAAAAAAAMAAAACAAAAAQAAADCs3uIgDCKPhKRECWVr5klg7QhBadzuRyhmfVZtE4MlcgAAAABc9UyjAAAAAAAAAAAAAAABVWkG+LRhLSSUm15z4+2PEA3tAsIKYFdVO0faqhpGgPoAAABAMbCfZ88FM31f5+JBOWL8o/30xX5K8v6p6gcV5bCUfDdzO3KOa5y9w2/OfH3H5knsIoLUZbw2lDxO49oalEkzAg=='); -INSERT INTO scphistory VALUES ('GBQBMJYSCE6Q5ZHHVCVPGWKS5HWMFH743D4EDF6MTYBTBYHSP7LHOBEI', 4, 'AAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAAAAAAAQAAAACAAAAAQAAADBbWDPDNodelhpF9+t6KW7/WTkBAeoYxXZRMPh7Aj2i+wAAAABc9UykAAAAAAAAAAAAAAABVWkG+LRhLSSUm15z4+2PEA3tAsIKYFdVO0faqhpGgPoAAABAr7tOb/1nkqCRY55zhhKv3SZ9xJh/Hd/ddHO0A5GSBzlOBsZlcP0MPwVLdVltY8Qsqe8lo4wFCeniBIzumNM8Dw=='); -INSERT INTO scphistory VALUES ('GBQBMJYSCE6Q5ZHHVCVPGWKS5HWMFH743D4EDF6MTYBTBYHSP7LHOBEI', 5, 'AAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAAAAAAAUAAAACAAAAAQAAADCCVhf+TO9sLB6DsTLTpRLBDpzpwiOuh82DIfi5Khck1wAAAABc9UylAAAAAAAAAAAAAAABVWkG+LRhLSSUm15z4+2PEA3tAsIKYFdVO0faqhpGgPoAAABAMCkP9vp+GGBiGAa9U2axqMzGt9M3xzOmSLNKn+7yl5OEl60AoUomeoCJM+kBdBpQxeJ4D/+jwDe4OwM/g2NHCQ=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('556906f8b4612d24949b5e73e3ed8f100ded02c20a6057553b47daaa1a4680fa', 5, 'AAAAAQAAAAEAAAAAYBYnEhE9DuTnqKrzWVLp7MKf/Nj4QZfMngMw4PJ/1ncAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '80e8bf9a11c3a19711b4aa87272f1ad76ecf6e7adb0145f91fd519756c341d8e'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 5, - "currentBuckets": [ - { - "curr": "3c05eaa1fcda32243b6613f76e9909763f0dcb1c5af1f85cfbfb6452602b4ee2", - "next": { - "state": 0 - }, - "snap": "1c923cac5a09341366a55fad9381493a3e827fece995036ba7dbc64c8dc4d9cc" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "1c923cac5a09341366a55fad9381493a3e827fece995036ba7dbc64c8dc4d9cc" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAABgFicSET0O5OeoqvNZUunswp/82PhBl8yeAzDg8n/WdwAAAAAAAAAFAAAAA1VpBvi0YS0klJtec+PtjxAN7QLCCmBXVTtH2qoaRoD6AAAAAQAAAJiCVhf+TO9sLB6DsTLTpRLBDpzpwiOuh82DIfi5Khck1wAAAABc9UylAAAAAAAAAAEAAAAAYBYnEhE9DuTnqKrzWVLp7MKf/Nj4QZfMngMw4PJ/1ncAAABAkAO05kziTISPcp9eIyDUyr2WZYSGEOjNfWuux6Xlrr+/ZeOevf4EhjeduQ3qJU6A+7JgPMmQtirfl+oF9yuZCwAAAAEAAACYglYX/kzvbCweg7Ey06USwQ6c6cIjrofNgyH4uSoXJNcAAAAAXPVMpQAAAAAAAAABAAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAQJADtOZM4kyEj3KfXiMg1Mq9lmWEhhDozX1rrsel5a6/v2Xjnr3+BIY3nbkN6iVOgPuyYDzJkLYq35fqBfcrmQsAAABAfAWE9hALEV/fDXLXq9cJgtoo/TX4R1PFV+r5YKUzMCuFYEWWPnRD8pU2GMeneDHYHluG0u+U/bZUrzXQorGOCAAAAABgFicSET0O5OeoqvNZUunswp/82PhBl8yeAzDg8n/WdwAAAAAAAAAFAAAAAgAAAAEAAAAwglYX/kzvbCweg7Ey06USwQ6c6cIjrofNgyH4uSoXJNcAAAAAXPVMpQAAAAAAAAAAAAAAAVVpBvi0YS0klJtec+PtjxAN7QLCCmBXVTtH2qoaRoD6AAAAQDApD/b6fhhgYhgGvVNmsajMxrfTN8czpkizSp/u8peThJetAKFKJnqAiTPpAXQaUMXieA//o8A3uDsDP4NjRwkAAAAB5V6+V9KuJPa8m2NvPmbCmfeJqffYFZ9G2To4Bx61eE8AAAAhAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAALAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA2pl8oiRj9zUIFp9AYMaKOb0OAbMsMjJNUUHewa3JwSH0V2Zaol7gkH5ymr3CNwO1e5X8fGilLZm+x5P7okPWDQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAADQAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAADuaygAAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQIpDJQQAAOqIuEYOhqd7L80zxnGlEMeB7aTdE4LrF6zE5G1bAabxzbPsNGxRfQToLchmCtv+s35F2DFRAfV+mgoAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAABAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABLb+eoAAAAACgAAAFEAAAAAAAAAAAAAAAAAAAABruS+TAAAAEAZjDBjBQxoO7GGN/EWuZiC/raVmJTFN7xA3Dvllr88LJn9lLg0rql5YAmH6bwffeWFxWyy3kSUCEVn7PBlndUNAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAMAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA0lB577a6VFTmqiBKQXiyg6YgjTPcU8n9Mldb5GdKeZ8DRkWG797qE3Tn/WL5uFYnY6qldsI9U31ASttn/Mh8CgAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAACAAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAAAAAABAAAABQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQHeiwLOOXWwZAA1jVOXrZ6KGssB6qwdfU3+NIcuv5olAJzQMeqPP7nqEWsJ/t0Sckb0Ft1iqWT26eMwePc3GJA8AAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAACIAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAALLQXgAAAAABQAAAAYAAAAAAAAAAAAAAAAAAAABruS+TAAAAEBpKgRz8rFqjdnqBSxOHVB8uOVPjzpNAqC2702GpPwTNJDaMUJaA/6h0lSdMg9FTvgM6CrASBwcEami9pqyzbgPAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAaZXT/bkDz3FqTJhXKtcSev5gzrE0wL2GSnszf7t4qBTcnW3P4heHeAFIkSjtgz0m7IgGT1goVlbtdA5PtZNNCwAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAFQAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABze+dgAF9eEJEno5nAAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQBIZdVYcyed5VfY5zLEwvfw+f7a9I2lgoEnNCgpnUqpam0P5AxIL0/o30iw7kOoDPRiQkn6BV0+Ka3kNJqS7wgkAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAB4AAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAwbcQgAAAAABQAAABoAAAAAAAAAAAAAAAAAAAABruS+TAAAAEBsfIq3NATTJZ8ALBZ/7WlhXc84ZwArGU220srgHkuZffhXBQgaNYeooiLD9oO2xoioEkjrZt+RifoqIxaJGeUCAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAYAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAJnrtXGyjkqpAJAFfDY0JyJjXfS9/xXLLHdu3XT20IxpJCBQ2K0fhYnVis0tnbacC9/vTcmLnWxKg1oGCR9usBAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAHAAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAEMOI0AAAAAAFAAAAJAAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQMY37gLF7K08b/uTVWJ7G9LKKgumaJbk/16G467eOXgHjWTMKff0VdoS18kpFTlZNjvNeP3YMnmqezPi4FomzwYAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAACAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAdzWUAAAAAABQAAABAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEAajFCzeL5oTo4B6AGROYDR2oRp0PnjUIVRgxVDVoKKLmKgsxo/qLmhJnn7hzRV9jYwA+anF00I5je/AfhcPzILAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAATAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAXUhb5QTAO+vV5kTEQqOp9yi4sDerjU5vIT5VH3MiOG381zIplmafJjLNHS02enkonOHtHWIvqznVQjHqQ389DQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAACgAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABvwjrAAAAAABAAAAAwAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQJvGjSdfEHTtvJYf6v0yUV/SA5UqoWjc8YJWvzYMnaRl8XYAGGAPW0i3XJJ5EPMxcH0nWJpoyqpw8WBtVNNKywcAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABUwBc4AAAAACgAAAFsAAAAAAAAAAAAAAAAAAAABruS+TAAAAECPgXqKc/KeDp7Ri0u0D0IETw1gO64wRGYdH148S3d0VrSCZr8/zgtGRZ4NrhlvYTrApUueuNypF1YeMTVg3cIDAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAdAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAcFijipV/lZRIDYicNpHFwnaL4J0Fmwkcr0G9VxH4lZSYgLjgQnvgniCBQrvu2eqyqOFHC8H04T7D9jXseYr4CgAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAAwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAF0h26AAAAAABAAAACgAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQDi/O/fYHZeBvZAv3Dk+qULts3w+RoYRMQCrSpm+7PKM5LMqiGCNtXqgi3JbsC5W9sAYpuTsK9Mts88WB+76jgcAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAAkAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAQAAAAQAAAAAAAAAAAAAAAAAAAABruS+TAAAAEAUepZQrgu6Ph3yxSJDXw4Hp+KRuw9BdkA4h9nfayCzrb5DXsYyfBiqzEWjW2Lj1Htwwtp0OyeEeOSeQ5AzNz4OAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA9LQUhBPQFZOopSh/vuUNPcUm0DLI9wD4aw449Ccu6ADMejat8t2MyuzWvx8RwQMPd9zdXlwCE5d8cT3upwuPAgAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAEQAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAEIfuBgAAAAAKAAAARwAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQL4Kguk8hIUq4ReyuMMDoHdLAr5hQEIHzNRM/nhMFm5vwTyUltFqTk8VOX3hCgDqS2Ghyb77w/lmSpuTyP8mnQcAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAABQAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAmLyloAAAAACgAAACkAAAAAAAAAAAAAAAAAAAABruS+TAAAAECInAVyjMD1DhWP+0AECSmFu86LoezfblscMGlOLon8s3dJUcaxhDZTAPWt5yBihi2hYPX6qQp0UxLN64hmh0kNAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAuUnZlMxj8taqMo/PYfI4rBl41Cpps/XHGlNot5+TWTZE9A06ipER6Q7XqbxhNzmAR8NaQbS3Ds0RQv44r3GLCgAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAABwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADfhHWAAAAAABAAAABgAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQKdYTKDPKzYnd6ZwUr/7KoEcCCMi4JHgW1DB/UmExoF11mUgdUO0b+eEIF2yeVzcT6gPZIM/y2KSXN1fS7JPpgQAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAABsAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABMXlLQAAAAABQAAACkAAAAAAAAAAAAAAAAAAAABruS+TAAAAEAuGXjVp68vR5ZlP93H2PAVFVvucN4OyM9648orlAIGBZmMFYXDBFfP6BOIdxwK8blbh33e5wBTjE6RsKPVUf0JAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAWAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAW7ujBoctNRfa1M6+T0tShj0Q+l9ybp9C6jQmrSEUeBSwAqucU1YAMlc3XzqIBy35EsuVN0k0hD81/rrCNCtICgAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAIQAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABR9NXAAAAAAFAAAACwAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQJUxpeS5e1keqKB6OEz0x4j7D4WEBHD7hXeJW8uN54on7Agpy5GX86GWMTg5gBx7/0V5LJAR+3kZMQmWAUV0UAQAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAACMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAACy0F4AAAAACgAAAAMAAAAAAAAAAAAAAAAAAAABruS+TAAAAEDYXCh6dclU5OL2jJYfI0v7TAtF2KQPAHip00maP45CLxrSNGCNAb/X8SxKrzzmruZS9fntcKNQYf6t/vQH4IUCAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAjAuehle1J2zs3RaLV5FD/TsgwVWQTHrGyz9xtHfjohTp9ugklMElF1GFa7zxijTpghCK1A0yyVuIrf8mIQiuBAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAEgAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAADjPiIgAAAAAKAAAAPQAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQBNDe/ZLQKZUko6L1OdCJLc4rkayTesZkZBe37FfmIyuYPF1j3oHVrh/Luecws2XAc3XaPAmorhFqSTD4zGWSAgAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAABkAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABe/rHwAAAAABQAAADMAAAAAAAAAAAAAAAAAAAABruS+TAAAAEAarEL9yJ330koQG/pju+aRTW75RD5LAPEciMt4yaau3lS/ZMKzoK3i2iS/COUaxsGjWxxTydCbC5e6Lxt80ZMAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABATU8XW0HLVKABibMcV0H3VxUkGh/dQhUcM0eFCkFzVgeXmY9g1V/MnP9DsNs1aipuJVlAGS0B88gxbmoQ5h6rDAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAGQAAAACAAAAFwAAAAAAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAo+mrgAAAAAKAAAACwAAAAAAAAAAAAAAAAAAAAGu5L5MAAAAQJhM/nIi2VhFyJbBFra2NSItX86GsdnRghPxbtBoTsqm8PdA77PpN2lTpkC0wclOSVoxL3ejqfqFd4vuyjz7cQMAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAABkAAAAAgAAAB8AAAAAAAAAAAAAAAEAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAnHZSQAAAAABQAAABUAAAAAAAAAAAAAAAAAAAABruS+TAAAAECSRmrmxXBzmmvo1h+qVJiRB6+vbveJuE70TBXKQ7aZDj6Rr4GtCP77B9yy4kVsZp4To23NDFN/tdBoZmnCOTkLAAAAAQAAAAEAAAABAAAAAGAWJxIRPQ7k56iq81lS6ezCn/zY+EGXzJ4DMODyf9Z3AAAAAA=='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'BTC', 9223372036854775807, 50000000000, 1, 4, NULL, NULL); -INSERT INTO trustlines VALUES ('GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 50000000000, 1, 4, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'BTC', 9223372036854775807, 50000000000, 1, 4, NULL, NULL); -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 50000000000, 1, 5, 329999999996, 0); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5cd7e1d317153a8d739c0f6d6861e1dc1ab5c264e3e8d4caab6aae3fc949326c', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f7cb8309318368f694c8830bf789841e7e2c46dce30e60969d88bd0ce588cbe9', 2, 3, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcqAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp+cAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1gAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1ecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 3, 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1ecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 4, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp+cAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c29948d1ca87bad2e3299c1b018c996c22ff5d56f5753bc38f0fd88c4d2c5d94', 4, 3, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('554ea22913ebf01fc4b3a4d60b59ae28f379b800d5b6da40a6987a53ebd87f07', 4, 4, 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c48b48982dcd1f079d90ee3289dc2b6269bce088bd7183ddba8e3dca25b1e84b', 5, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp7UAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('437a48108dd143273dcf1c28296d6048d0915c6072650eb5f794b89560a40c0c', 5, 2, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp7UAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp5wAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('9f9ea714b1a39664b1e6df0fafd1aa17eda71bb05715fe1371246f3208b3a1b1', 5, 3, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp5wAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp4MAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f966ab310137dae86c7ee7ee08850339537c78f854eaaaea78d7fd834134da79', 5, 4, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp4MAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp2oAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('360d890880eebd224d7506b9881352fbc6b6b1921f84a85e9807f0775b5560bc', 5, 5, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp2oAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp1EAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bc1c988cc29d96ba3ed032e48f862cda1c9ed615b07ac8db51ef399cd3fa2941', 5, 6, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp1EAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpzgAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('61b33dced6b81dde0e86b61ba4abc280b6c35c6e4ba8045b5082f74a9a2b60ed', 5, 7, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpzgAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpx8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('163aab67c5a24a59eda5e4b4e5f32924f603cff52a5e4fb25eae987538c23106', 5, 8, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpx8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpwYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('627fdbd55feaf21e6e96addebb0f5fc73540ff9505d5d0dc76c9ec69f4d2f76f', 5, 9, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpwYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpu0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('e252b8842716f49fe824df8c95e51a55b40db1b51017ba97dc59b2d971e5cb10', 5, 10, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpu0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcptQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('b962b228793859d32de9d6a3d3e782acb8f2d0b9e3a17a91571a402d7cd47a8a', 5, 11, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcptQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcprsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('0343d98ff86bf4b5f9e24db8b3889fe34df7a166cfde7e9098a83c11f7eb9722', 5, 12, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcprsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpqIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('e82691759c9c5796c5cc91a1c71f233b6c5a38af9ad5976c7e655078818838e7', 5, 13, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpqIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpokAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('d80c809a4065600d7705e7db04e1260bf39582d941446a95fb9cea66680ef0c3', 5, 14, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpokAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpnAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('fd0bc444f5e90e9a61a5aa011a8b62376ef2d7e304418a188a294bb0b95740f8', 5, 15, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpnAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcplcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('04b1a1a09159b1c7bb43fd1dc0f282958d0a01c337d72a0324c0262b58d93615', 5, 16, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcplcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpj4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5d37d98f720dfb3dce49331f403bfa3f9ef13122fae954a73b7b688b180b1516', 5, 17, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpj4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpiUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('a3d82c4ac237e77f385f3cdf5a358cabc4b0c12b7f58b59c197fdba8a76010cf', 5, 18, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpiUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpgwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('e09337eedf136665192e840b23bf26b86fc85b93bb401d3a1ce4ee2a1b579213', 5, 19, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpgwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpfMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f140ddf0c75f70ddf0d79391e6b5992b9c56b9c23c040008b908c70a413eb03d', 5, 20, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpfMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpdoAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5d46530574ecf525512b5184af69899d95a826ec6bbad2e0b2d34b3efa352d7f', 5, 21, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpdoAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpcEAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bc2a16ca82b7d0bd903c26482736cceb9f4efa077071e72849654b3aced94136', 5, 22, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpcEAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpagAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('a0bdbdb1aa35b7f2aec201b618fca59405e4c375f8f76a24ef25e885a96fd7ed', 5, 23, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpagAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpY8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('9b90554626c9bfa396b4f61cc910d383a38f1223c8f5478edde6fe60a7f2f406', 5, 24, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpY8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpXYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('0e17e87fcda53937d77cbf1e2658fcdf41eb0689e9649545bb14a5960832e5b8', 5, 25, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpXYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpV0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f277e4abf7d0d326fa63ee62415f7a117e43453072677d1f6e9618c8d2bb8524', 5, 26, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpV0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpUQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('5e3622bf6dab1276155014b8387f261a0bbfbef247caa05e9c4be8c890dad958', 5, 27, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpUQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpSsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('b00c83ae8f3d0cd4f1760517182abdf0440eca6efcd2b0fa893aac85b35e42cb', 5, 28, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpSsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpRIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('3f731b66c1a3d2c4cf9d15bb17e910beaa6f6fa6a77cccfd62f5eabcd3ecfcc5', 5, 29, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpRIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpPkAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('492c8c2808bf649ba321f0f75dda11581107bff229ef457340aab8494f5ad412', 5, 30, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpPkAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpOAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c03dfbea35606bd565f3609a306aa27a82aa14b3fd142f1a13b79c1871f54a3b', 5, 31, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpOAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpMcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('42e47f8fdcb738c844e1556c9fad18eb8887d78681ef5e9616898eb6e1c5e8eb', 5, 32, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpMcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpK4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('ee96865dfca78c43c4074317f3dbcd7ca978643b973bc9a5dc4f2588f981c6d7', 5, 33, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpK4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', '2zmOtK6JdWMlZDytIclOE7/AdLMj7oPhQb9wGl2QTxsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5cd7e1d317153a8d739c0f6d6861e1dc1ab5c264e3e8d4caab6aae3fc949326c', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKgAAAAAAAAAAABVvwF9wAAAECHm7ok7sq0fJE4UYerrvzdtJgwKw3iHGQ2D43YeWAE+/Jjbwa2pVllbwPb5KeNomP/gXau9K9503k0yiId/HMC', 'XNfh0xcVOo1znA9taGHh3Bq1wmTj6NTKq2quP8lJMmwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grZkE5XrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcqAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f7cb8309318368f694c8830bf789841e7e2c46dce30e60969d88bd0ce588cbe9', 2, 3, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdYAAAAAAAAAAABVvwF9wAAAEAQAaCgnhAHvWviyyciJH3kp9yoTQtn2SFjbCqLUUPBKzcRt8huITE9etfxlEBrW4iiJkrgyQeOCq/IGbGe2RAA', '98uDCTGDaPaUyIML94mEHn4sRtzjDmCWnYi9DOWIy+kAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grZkE5XrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grYsMniLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1gAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'gRGSw4ZD33PAFaWh13uALf8F1PUPxtEIFqp1wKYQn5oAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 3, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQBH/ML6+RzWquFPh8gLF2RuZzYtjjpPeHv/od9M74xlU09Xa4a5e1NhMtMSRIoLItg1EaDWE9zvtHflVWIAaSwQ=', 'ffhXwjx9/rl018OVZ3VoWo7fqElrt4H9NGyOICX62b8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 4, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQEKBv+8zL1epwxC+sJhEYPmbjL9XScXtctoMIdet5dhgk7YJVJzAnRSgYTvfyoIJKJdQmX66uh2o+rG9K6JImgY=', 'NHa8ZJVjSIzwJdgnkKqcRGSRiCMrFQ0oZNE/6frOVAYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQH/ZkzR/eC0F7xP9zApeHvMH7nqetzaSdYh8WHyrwwvbEnx4Db6gz0grnRJBJS66OZbGmCk7yzHm8DkJ7bJ4QAU=', '6pRUNqO2UO+ogGPnN1GM8ZKNmkPRq6PsaEcE8WCzcz4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQFFGLGFFXbEDRdk2eFyQATNpHuqO/sFrpqsxmNNwGa+MLibNQJLDXWafC4W8KMKQ/hE0M0TLxZeu/O8tYnBuwwA=', 'QWpjw/FJFTdpjNtvmBCX7Y5EyifS2QBr0Lpogy6/nVUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c29948d1ca87bad2e3299c1b018c996c22ff5d56f5753bc38f0fd88c4d2c5d94', 4, 3, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQLn0NeCsam5YrmtsMJQVOLyOTPqDb7SMTCZGofm5ShU6fcl3PPieInQNtk1FmRVeUxdYX1rsW2KH1HQbJ644Hw0=', 'wplI0cqHutLjKZwbAYyZbCL/XVb1dTvDjw/YjE0sXZQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('554ea22913ebf01fc4b3a4d60b59ae28f379b800d5b6da40a6987a53ebd87f07', 4, 4, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQF34mYyRLbVT42QtFuY5UN0sr9EcuE3ltA/9yAxiNOvukbVTOaz86uCXpEZlX1FnExYDZwOZJWVXfsbdovbVUwc=', 'VU6iKRPr8B/Es6TWC1muKPN5uADVttpApph6U+vYfwcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c48b48982dcd1f079d90ee3289dc2b6269bce088bd7183ddba8e3dca25b1e84b', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXSHboAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAOL8799gdl4G9kC/cOT6pQu2zfD5GhhExAKtKmb7s8ozksyqIYI21eqCLcluwLlb2wBim5Owr0y2zzxYH7vqOBw==', 'xItImC3NHwedkO4yidwrYmm84Ii9cYPduo49yiWx6EsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABdIdugAAAAAAQAAAAoAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXSHboAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAA='); -INSERT INTO txhistory VALUES ('437a48108dd143273dcf1c28296d6048d0915c6072650eb5f794b89560a40c0c', 5, 2, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAuUnZlMxj8taqMo/PYfI4rBl41Cpps/XHGlNot5+TWTZE9A06ipER6Q7XqbxhNzmAR8NaQbS3Ds0RQv44r3GLCg==', 'Q3pIEI3RQyc9zxwoKW1gSNCRXGByZQ6195S4lWCkDAwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABT0awQAAAAAAQAAAAkAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAF0h26AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAF0h26AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAsPOHsAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAASoF8gAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('9f9ea714b1a39664b1e6df0fafd1aa17eda71bb05715fe1371246f3208b3a1b1', 5, 3, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA9LQUhBPQFZOopSh/vuUNPcUm0DLI9wD4aw449Ccu6ADMejat8t2MyuzWvx8RwQMPd9zdXlwCE5d8cT3upwuPAg==', 'n56nFLGjlmSx5t8Pr9GqF+2nG7BXFf4TcSRvMgizobEAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABKgXyAAAAAAAQAAAAgAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAALDzh7AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAsPOHsAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAALDzh7AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAA+3UEMAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAEqBfIAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAb8I6wAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f966ab310137dae86c7ee7ee08850339537c78f854eaaaea78d7fd834134da79', 5, 4, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAaZXT/bkDz3FqTJhXKtcSev5gzrE0wL2GSnszf7t4qBTcnW3P4heHeAFIkSjtgz0m7IgGT1goVlbtdA5PtZNNCw==', '+WarMQE32uhsfufuCIUDOVN8ePhU6qrqeNf9g0E02nkAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABBMUzwAAAAAAQAAAAcAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAPt1BDAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAA+3UEMAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAGAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAPt1BDAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAYAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABPKZRIAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAG/COsAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAlQL5AAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('360d890880eebd224d7506b9881352fbc6b6b1921f84a85e9807f0775b5560bc', 5, 5, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAAAAAAEAAAAGAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAp1hMoM8rNid3pnBSv/sqgRwIIyLgkeBbUMH9SYTGgXXWZSB1Q7Rv54QgXbJ5XNxPqA9kgz/LYpJc3V9Lsk+mBA==', 'Ng2JCIDuvSJNdQa5iBNS+8a2sZIfhKhemAfwd1tVYLwAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA34R1gAAAAAAQAAAAYAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAATymUSAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABPKZRIAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAHAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAATymUSAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAcAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABdIdugAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAAAAAAEAAAAGAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAJUC+QAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAukO3QAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bc1c988cc29d96ba3ed032e48f862cda1c9ed615b07ac8db51ef399cd3fa2941', 5, 6, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAd6LAs45dbBkADWNU5etnooaywHqrB19Tf40hy6/miUAnNAx6o8/ueoRawn+3RJyRvQW3WKpZPbp4zB49zcYkDw==', 'vByYjMKdlro+0DLkj4Ys2hye1hWwesjbUe85nNP6KUEAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAQAAAAUAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABdIdugAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAIAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAgAAAAIAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABoxhcUAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAALpDt0AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAA34R1gAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('61b33dced6b81dde0e86b61ba4abc280b6c35c6e4ba8045b5082f74a9a2b60ed', 5, 7, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAJAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJUC+QAAAAAAEAAAAEAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAFHqWUK4Luj4d8sUiQ18OB6fikbsPQXZAOIfZ32sgs62+Q17GMnwYqsxFo1ti49R7cMLadDsnhHjknkOQMzc+Dg==', 'YbM9zta4Hd4OhrYbpKvCgLbDXG5LqARbUIL3SporYO0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAABwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAlQL5AAAAAAAQAAAAQAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAIAAAACAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAaMYXFAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAkAAAAIAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABoxhcUAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAJAAAACAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAaMYXFAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAkAAAAJAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAByFkakAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJUC+QAAAAAAEAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAN+EdYAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABBMUzwAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('163aab67c5a24a59eda5e4b4e5f32924f603cff52a5e4fb25eae987538c23106', 5, 8, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAKAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAG/COsAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAm8aNJ18QdO28lh/q/TJRX9IDlSqhaNzxgla/NgydpGXxdgAYYA9bSLdcknkQ8zFwfSdYmmjKqnDxYG1U00rLBw==', 'FjqrZ8WiSlntpeS05fMpJPYDz/UqXk+yXq6YdTjCMQYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAb8I6wAAAAAAQAAAAMAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAJAAAACQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAchZGpAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAoAAAAJAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAByFkakAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAKAAAACQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAchZGpAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAoAAAAKAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB5EmpQAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAG/COsAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAQTFM8AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABKgXyAAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('627fdbd55feaf21e6e96addebb0f5fc73540ff9505d5d0dc76c9ec69f4d2f76f', 5, 9, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAALAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA2pl8oiRj9zUIFp9AYMaKOb0OAbMsMjJNUUHewa3JwSH0V2Zaol7gkH5ymr3CNwO1e5X8fGilLZm+x5P7okPWDQ==', 'Yn/b1V/q8h5ulq3euw9fxzVA/5UF1dDcdsnsafTS928AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAASoF8gAAAAAAQAAAAIAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAKAAAACgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAeRJqUAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAsAAAAKAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB5EmpQAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAALAAAACgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAeRJqUAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAsAAAALAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB9uoIYAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAASoF8gAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABT0awQAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('e252b8842716f49fe824df8c95e51a55b40db1b51017ba97dc59b2d971e5cb10', 5, 10, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAMAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA0lB577a6VFTmqiBKQXiyg6YgjTPcU8n9Mldb5GdKeZ8DRkWG797qE3Tn/WL5uFYnY6qldsI9U31ASttn/Mh8Cg==', '4lK4hCcW9J/oJN+MleUaVbQNsbUQF7qX3Fmy2XHlyxAAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAQAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAALAAAACwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAfbqCGAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAwAAAALAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB9uoIYAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAMAAAACwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAfbqCGAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAwAAAAMAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACADo38AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAU9GsEAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABdIdugAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('b962b228793859d32de9d6a3d3e782acb8f2d0b9e3a17a91571a402d7cd47a8a', 5, 11, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAANAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAikMlBAAA6oi4Rg6Gp3svzTPGcaUQx4HtpN0TgusXrMTkbVsBpvHNs+w0bFF9BOgtyGYK2/6zfkXYMVEB9X6aCg==', 'uWKyKHk4WdMt6daj0+eCrLjy0LnjoXqRVxpALXzUeooAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAACwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAACgAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAMAAAADAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgA6N/AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA0AAAAMAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACADo38AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAANAAAADAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgA6N/AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA0AAAANAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACASijGAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAXSHboAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABmcgswAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('0343d98ff86bf4b5f9e24db8b3889fe34df7a166cfde7e9098a83c11f7eb9722', 5, 12, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAjAuehle1J2zs3RaLV5FD/TsgwVWQTHrGyz9xtHfjohTp9ugklMElF1GFa7zxijTpghCK1A0yyVuIrf8mIQiuBA==', 'A0PZj/hr9LX54k24s4if4033oWbP3n6QmKg8EffrlyIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAADAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABeEEbIAAAAACgAAAGUAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAANAAAADQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgEooxgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA4AAAANAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACASijGAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAOAAAADQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgEooxgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA4AAAAOAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACXzjp4AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAZnILMAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABvwjrAAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('e82691759c9c5796c5cc91a1c71f233b6c5a38af9ad5976c7e655078818838e7', 5, 13, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAPAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVMAXOAAAAAAoAAABbAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAj4F6inPyng6e0YtLtA9CBE8NYDuuMERmHR9ePEt3dFa0gma/P84LRkWeDa4Zb2E6wKVLnrjcqRdWHjE1YN3CAw==', '6CaRdZycV5bFzJGhxx8jO2xaOK+a1ZdsfmVQeIGIOOcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAADQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABUwBc4AAAAACgAAAFsAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAOAAAADgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAl846eAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA8AAAAOAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACXzjp4AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAPAAAADgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAl846eAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA8AAAAPAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACs/kBGAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVMAXOAAAAAAoAAABbAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAb8I6wAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAB5EmpQAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('d80c809a4065600d7705e7db04e1260bf39582d941446a95fb9cea66680ef0c3', 5, 14, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAQAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAS2/nqAAAAAAoAAABRAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGYwwYwUMaDuxhjfxFrmYgv62lZiUxTe8QNw75Za/PCyZ/ZS4NK6peWAJh+m8H33lhcVsst5ElAhFZ+zwZZ3VDQ==', '2AyAmkBlYA13BefbBOEmC/OVgtlBRGqV+5zqZmgO8MMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAADgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABLb+eoAAAAACgAAAFEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAPAAAADwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAArP5ARgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABAAAAAPAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACs/kBGAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAQAAAADwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAArP5ARgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABAAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAC/2jowAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAS2/nqAAAAAAoAAABRAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAeRJqUAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACCYpngAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('fd0bc444f5e90e9a61a5aa011a8b62376ef2d7e304418a188a294bb0b95740f8', 5, 15, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAARAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQh+4GAAAAAAoAAABHAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAvgqC6TyEhSrhF7K4wwOgd0sCvmFAQgfM1Ez+eEwWbm/BPJSW0WpOTxU5feEKAOpLYaHJvvvD+WZKm5PI/yadBw==', '/QvERPXpDpphpaoBGotiN27y1+MEQYoYiilLsLlXQPgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAADwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABCH7gYAAAAACgAAAEcAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAQAAAAEAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAv9o6MAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABEAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAC/2jowAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAARAAAAEAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAv9o6MAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABEAAAARAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADQYig2AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQh+4GAAAAAAoAAABHAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAgmKZ4AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACLsslwAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('04b1a1a09159b1c7bb43fd1dc0f282958d0a01c337d72a0324c0262b58d93615', 5, 16, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAASAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOM+IiAAAAAAoAAAA9AAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAE0N79ktAplSSjovU50IktziuRrJN6xmRkF7fsV+YjK5g8XWPegdWuH8u55zCzZcBzddo8CaiuEWpJMPjMZZICA==', 'BLGhoJFZsce7Q/0dwPKClY0KAcM31yoDJMAmK1jZNhUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAEAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA4z4iIAAAAACgAAAD0AAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAARAAAAEQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA0GIoNgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABIAAAARAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADQYig2AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAASAAAAEQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA0GIoNgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABIAAAASAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADelgpYAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOM+IiAAAAAAoAAAA9AAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAi7LJcAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5d37d98f720dfb3dce49331f403bfa3f9ef13122fae954a73b7b688b180b1516', 5, 17, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAATAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAXUhb5QTAO+vV5kTEQqOp9yi4sDerjU5vIT5VH3MiOG381zIplmafJjLNHS02enkonOHtHWIvqznVQjHqQ389DQ==', 'XTfZj3IN+z3OSTMfQDv6P57xMSL66VSnO3toixgLFRYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAEQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAvf1j4AAAAACgAAADMAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAASAAAAEgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA3pYKWAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABMAAAASAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADelgpYAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAATAAAAEgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA3pYKWAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABMAAAATAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADqdeCWAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAlQL5AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACeUyiQAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('a3d82c4ac237e77f385f3cdf5a358cabc4b0c12b7f58b59c197fdba8a76010cf', 5, 18, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAUAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJi8paAAAAAAoAAAApAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAiJwFcozA9Q4Vj/tABAkphbvOi6Hs325bHDBpTi6J/LN3SVHGsYQ2UwD1recgYoYtoWD1+qkKdFMSzeuIZodJDQ==', 'o9gsSsI35384XzzfWjWMq8SwwSt/WLWcGX/bqKdgEM8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAEgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAmLyloAAAAACgAAACkAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAATAAAAEwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA6nXglgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABQAAAATAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADqdeCWAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAUAAAAEwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA6nXglgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABQAAAAUAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD0AarwAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJi8paAAAAAAoAAAApAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAnlMokAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACno1ggAAAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('e09337eedf136665192e840b23bf26b86fc85b93bb401d3a1ce4ee2a1b579213', 5, 19, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAVAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHN752AAX14QkSejmcAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAEhl1VhzJ53lV9jnMsTC9/D5/tr0jaWCgSc0KCmdSqlqbQ/kDEgvT+jfSLDuQ6gM9GJCSfoFXT4preQ0mpLvCCQ==', '4JM37t8TZmUZLoQLI78muG/IW5O7QB06HOTuKhtXkhMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAEwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAc3vnX+BfXhCRJ6OZwAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAUAAAAFAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA9AGq8AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABUAAAAUAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD0AarwAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAVAAAAFAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA9AGq8AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABUAAAAVAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD7OWll/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHN751/gX14QkSejmcAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAp6NYIAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACw84ev8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f140ddf0c75f70ddf0d79391e6b5992b9c56b9c23c040008b908c70a413eb03d', 5, 20, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAWAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAW7ujBoctNRfa1M6+T0tShj0Q+l9ybp9C6jQmrSEUeBSwAqucU1YAMlc3XzqIBy35EsuVN0k0hD81/rrCNCtICg==', '8UDd8MdfcN3w15OR5rWZK5xWucI8BAAIuQjHCkE+sD0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAFAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAATjspIAAAAACgAAABUAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAVAAAAFQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA+zlpZf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABYAAAAVAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD7OWll/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAWAAAAFQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA+zlpZf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABYAAAAWAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEAHRv3/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAsPOHr/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAC6Q7c/8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5d46530574ecf525512b5184af69899d95a826ec6bbad2e0b2d34b3efa352d7f', 5, 21, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAXAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACj6auAAAAAAoAAAALAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAmEz+ciLZWEXIlsEWtrY1Ii1fzoax2dGCE/Fu0GhOyqbw90Dvs+k3aVOmQLTByU5JWjEvd6Op+oV3i+7KPPtxAw==', 'XUZTBXTs9SVRK1GEr2mJnZWoJuxrutLgstNLPvo1LX8AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAFQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAKPpq4AAAAACgAAAAsAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAWAAAAFgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAB0b9/4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABcAAAAWAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEAHRv3/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAXAAAAFgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAB0b9/4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABcAAAAXAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAECrMKl/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACj6auAAAAAAoAAAALAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAukO3P/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADDk+bP8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bc2a16ca82b7d0bd903c26482736cceb9f4efa077071e72849654b3aced94136', 5, 22, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAYAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAJnrtXGyjkqpAJAFfDY0JyJjXfS9/xXLLHdu3XT20IxpJCBQ2K0fhYnVis0tnbacC9/vTcmLnWxKg1oGCR9usBA==', 'vCoWyoK30L2QPCZIJzbM659O+gdwcecoSWVLOs7ZQTYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAFgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAB3NZQAAAAABQAAAAEAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAXAAAAFwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAqzCpf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABgAAAAXAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAECrMKl/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAYAAAAFwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAqzCpf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABgAAAAYAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEDI/g5/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAw5Pmz/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADM5BZf8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('a0bdbdb1aa35b7f2aec201b618fca59405e4c375f8f76a24ef25e885a96fd7ed', 5, 23, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAZAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXv6x8AAAAAAUAAAAzAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGqxC/cid99JKEBv6Y7vmkU1u+UQ+SwDxHIjLeMmmrt5Uv2TCs6Ct4tokvwjlGsbBo1scU8nQmwuXui8bfNGTAA==', 'oL29sao1t/KuwgG2GPyllAXkw3X492ok7yXohalv1+0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAFwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABe/rHwAAAAABQAAADMAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAYAAAAGAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAyP4Of4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABkAAAAYAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEDI/g5/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAZAAAAGAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAyP4Of4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABkAAAAZAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEa46S1/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXv6x8AAAAAAUAAAAzAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAzOQWX/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADWNEXv8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('9b90554626c9bfa396b4f61cc910d383a38f1223c8f5478edde6fe60a7f2f406', 5, 24, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABATU8XW0HLVKABibMcV0H3VxUkGh/dQhUcM0eFCkFzVgeXmY9g1V/MnP9DsNs1aipuJVlAGS0B88gxbmoQ5h6rDA==', 'm5BVRibJv6OWtPYcyRDTg6OPEiPI9UeO3eb+YKfy9AYAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAGAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABVroJgAAAAABQAAAC4AAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAZAAAAGQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABGuOktf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABoAAAAZAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEa46S1/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAaAAAAGQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABGuOktf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABoAAAAaAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEwT0VN/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA1jRF7/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADfhHV/8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('0e17e87fcda53937d77cbf1e2658fcdf41eb0689e9649545bb14a5960832e5b8', 5, 25, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAbAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAATF5S0AAAAAAUAAAApAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABALhl41aevL0eWZT/dx9jwFRVb7nDeDsjPeuPKK5QCBgWZjBWFwwRXz+gTiHccCvG5W4d93ucAU4xOkbCj1VH9CQ==', 'Dhfof82lOTfXfL8eJlj830HrBonpZJVFuxSllggy5bgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAGQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABMXlLQAAAAABQAAACkAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAaAAAAGgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABME9FTf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABsAAAAaAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEwT0VN/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAbAAAAGgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABME9FTf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABsAAAAbAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFDZtoB/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAATF5S0AAAAAAUAAAApAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA34R1f/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADo1KUP8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f277e4abf7d0d326fa63ee62415f7a117e43453072677d1f6e9618c8d2bb8524', 5, 26, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAcAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQw4jQAAAAAAUAAAAkAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAxjfuAsXsrTxv+5NVYnsb0soqC6ZoluT/Xobjrt45eAeNZMwp9/RV2hLXySkVOVk2O814/dgyeap7M+LgWibPBg==', '8nfkq/fQ0yb6Y+5iQV96EX5DRTByZ30fbpYYyNK7hSQAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAGgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABDDiNAAAAAABQAAACQAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAbAAAAGwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABQ2baAf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABwAAAAbAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFDZtoB/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAcAAAAGwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABQ2baAf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABwAAAAcAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFUKmLR/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQw4jQAAAAAAUAAAAkAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA6NSlD/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADyJNSf8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('5e3622bf6dab1276155014b8387f261a0bbfbef247caa05e9c4be8c890dad958', 5, 27, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAdAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAcFijipV/lZRIDYicNpHFwnaL4J0Fmwkcr0G9VxH4lZSYgLjgQnvgniCBQrvu2eqyqOFHC8H04T7D9jXseYr4Cg==', 'XjYiv22rEnYVUBS4OH8mGgu/vvJHyqBenEvoyJDa2VgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAGwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAA5vfOwAAAAABQAAAB8AAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAcAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABVCpi0f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB0AAAAcAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFUKmLR/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAdAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABVCpi0f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB0AAAAdAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFimd+9/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA8iTUn/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAD7dQQv8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('b00c83ae8f3d0cd4f1760517182abdf0440eca6efcd2b0fa893aac85b35e42cb', 5, 28, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAeAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAMG3EIAAAAAAUAAAAaAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAbHyKtzQE0yWfACwWf+1pYV3POGcAKxlNttLK4B5LmX34VwUIGjWHqKIiw/aDtsaIqBJI62bfkYn6KiMWiRnlAg==', 'sAyDro89DNTxdgUXGCq98EQOym780rD6iTqshbNeQssAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAHAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAwbcQgAAAAABQAAABoAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAdAAAAHQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABYpnfvf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB4AAAAdAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFimd+9/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAeAAAAHQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABYpnfvf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB4AAAAeAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFutVDF/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAMG3EIAAAAAAUAAAAaAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA+3UEL/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEExTO/8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('3f731b66c1a3d2c4cf9d15bb17e910beaa6f6fa6a77cccfd62f5eabcd3ecfcc5', 5, 29, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAfAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJx2UkAAAAAAUAAAAVAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAkkZq5sVwc5pr6NYfqlSYkQevr273ibhO9EwVykO2mQ4+ka+BrQj++wfcsuJFbGaeE6NtzQxTf7XQaGZpwjk5Cw==', 'P3MbZsGj0sTPnRW7F+kQvqpvb6anfMz9YvXqvNPs/MUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAHQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAnHZSQAAAAABQAAABUAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAeAAAAHgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABbrVQxf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB8AAAAeAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFutVDF/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAfAAAAHgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABbrVQxf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB8AAAAfAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF4fLXp/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJx2UkAAAAAAUAAAAVAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABBMUzv/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEOFWNP8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('492c8c2808bf649ba321f0f75dda11581107bff229ef457340aab8494f5ad412', 5, 30, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAgAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHc1lAAAAAAAUAAAAQAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGoxQs3i+aE6OAegBkTmA0dqEadD541CFUYMVQ1aCii5ioLMaP6i5oSZ5+4c0VfY2MAPmpxdNCOY3vwH4XD8yCw==', 'SSyMKAi/ZJujIfD3XdoRWBEHv/Ip70VzQKq4SU9a1BIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAHgAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAdzWUAAAAAABQAAABAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAfAAAAHwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABeHy16f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACAAAAAfAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF4fLXp/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAgAAAAHwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABeHy16f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACAAAAAgAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF/8A8p/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHc1lAAAAAAAUAAAAQAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABDhVjT/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEXZZLf8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c03dfbea35606bd565f3609a306aa27a82aa14b3fd142f1a13b79c1871f54a3b', 5, 31, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAhAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFH01cAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAlTGl5Ll7WR6ooHo4TPTHiPsPhYQEcPuFd4lby43niifsCCnLkZfzoZYxODmAHHv/RXkskBH7eRkxCZYBRXRQBA==', 'wD376jVga9Vl82CaMGqieoKqFLP9FC8aE7ecGHH1SjsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAHwAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUfTVwAAAAABQAAAAsAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAgAAAAIAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABf/APKf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACEAAAAgAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF/8A8p/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAhAAAAIAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABf/APKf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACEAAAAhAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGFD1yF/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFH01cAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABF2WS3/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEgtcJv8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('42e47f8fdcb738c844e1556c9fad18eb8887d78681ef5e9616898eb6e1c5e8eb', 5, 32, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAiAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACy0F4AAAAAAUAAAAGAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAaSoEc/Kxao3Z6gUsTh1QfLjlT486TQKgtu9NhqT8EzSQ2jFCWgP+odJUnTIPRU74DOgqwEgcHBGpovaass24Dw==', 'QuR/j9y3OMhE4VVsn60Y64iH14aB716WFomOtuHF6OsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAIAAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAALLQXgAAAAABQAAAAYAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAhAAAAIQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABhQ9chf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACIAAAAhAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGFD1yF/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAiAAAAIQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABhQ9chf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACIAAAAiAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGH2p39/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACy0F4AAAAAAUAAAAGAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABILXCb/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEqBfH/8AAAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('ee96865dfca78c43c4074317f3dbcd7ca978643b973bc9a5dc4f2588f981c6d7', 5, 33, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAjAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAstBeAAAAAAoAAAADAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA2FwoenXJVOTi9oyWHyNL+0wLRdikDwB4qdNJmj+OQi8a0jRgjQG/1/EsSq885q7mUvX57XCjUGH+rf70B+CFAg==', '7paGXfynjEPEB0MX89vNfKl4ZDuXO8ml3E8liPmBxtcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAIQAAAAAAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAACy0F4AAAAACgAAAAMAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAiAAAAIgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABh9qd/f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACMAAAAiAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGH2p39/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAjAAAAIgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABh9qd/f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACMAAAAjAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGIjW5b/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAstBeAAAAAAoAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABKgXx//AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEzViGP8AAAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/order_books_310-horizon.sql b/services/horizon/internal/test/scenarios/order_books_310-horizon.sql deleted file mode 100644 index f454114bd0..0000000000 --- a/services/horizon/internal/test/scenarios/order_books_310-horizon.sql +++ /dev/null @@ -1,1148 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '100000000000', 2, 0, ''); -INSERT INTO asset_stats VALUES (2, '100000000000', 2, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (3, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_accounts VALUES (4, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 4, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'BTC', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_assets VALUES (2, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 2, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 17179873281, 1, 2, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179873281, 2, 3, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179877377, 1, 2, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179877377, 2, 3, '{"amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179881473, 1, 2, '{"amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179881473, 2, 3, '{"amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 17179885569, 1, 2, '{"amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179885569, 2, 3, '{"amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 12884910081, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (3, 12884914177, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 12884918273, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 1, 0, '{"starting_balance": "1000000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589942785, 2, 3, '{"amount": "1000000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (3, 8589946881, 1, 0, '{"starting_balance": "6000.0000000"}'); -INSERT INTO history_effects VALUES (4, 8589946881, 2, 3, '{"amount": "6000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589946881, 3, 10, '{"weight": 1, "public_key": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (5, '80e8bf9a11c3a19711b4aa87272f1ad76ecf6e7adb0145f91fd519756c341d8e', 'e55ebe57d2ae24f6bc9b636f3e66c299f789a9f7d8159f46d93a38071eb5784f', 33, 33, '2019-06-03 16:36:53', '2019-06-03 16:36:53.548298', '2019-06-03 16:36:53.548298', 21474836480, 16, 1000000000000000000, 4400, 100, 100000000, 1000000, 11, 'AAAAC+VevlfSriT2vJtjbz5mwpn3ian32BWfRtk6OAcetXhPglYX/kzvbCweg7Ey06USwQ6c6cIjrofNgyH4uSoXJNcAAAAAXPVMpQAAAAAAAAAAJ4/Gr554ZVHMujN++AAdhrv5CCDQrTNFeytjikmekx0TN0P6HDz1rTO/Z/AzeDvBFYcBodH2UJCqeOJz9nquzgAAAAUN4Lazp2QAAAAAAAAAABEwAAAAAAAAAAAAAAAhAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 33, 0); -INSERT INTO history_ledgers VALUES (4, 'e55ebe57d2ae24f6bc9b636f3e66c299f789a9f7d8159f46d93a38071eb5784f', 'e15e176a36631b4c1067eb4d1fca8d22706c38ed0a84377d45b71197097370e5', 4, 4, '2019-06-03 16:36:52', '2019-06-03 16:36:53.587603', '2019-06-03 16:36:53.587603', 17179869184, 16, 1000000000000000000, 1100, 100, 100000000, 1000000, 11, 'AAAAC+FeF2o2YxtMEGfrTR/KjSJwbDjtCoQ3fUW3EZcJc3DlW1gzwzaHXpYaRffreilu/1k5AQHqGMV2UTD4ewI9ovsAAAAAXPVMpAAAAAAAAAAA9P74c8f1xfd4wX2Dasj3a3ZXngqhfaJ2yA7eEO3Lts/H+EvsBLAxnP4GGboXdw18KCURJyzeIeRCdgaodh/BugAAAAQN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (3, 'e15e176a36631b4c1067eb4d1fca8d22706c38ed0a84377d45b71197097370e5', 'd1cc81a10bc2fd6dd13a4444e9522f361b0eb28519f1d893c8bbb753466eec0e', 4, 4, '2019-06-03 16:36:51', '2019-06-03 16:36:53.605262', '2019-06-03 16:36:53.605262', 12884901888, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAAC9HMgaELwv1t0TpEROlSLzYbDrKFGfHYk8i7t1NGbuwOrN7iIAwij4SkRAlla+ZJYO0IQWnc7kcoZn1WbRODJXIAAAAAXPVMowAAAAAAAAAAhrVFL6RjAMOSd+xZbT+ONgXtaV13E2WDVpOKC2IZ2LYnFnLWYxSKOH/xxTz08LKg5zf9cJfxtZeqFuOske221AAAAAMN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 4, 0); -INSERT INTO history_ledgers VALUES (2, 'd1cc81a10bc2fd6dd13a4444e9522f361b0eb28519f1d893c8bbb753466eec0e', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 3, 3, '2019-06-03 16:36:50', '2019-06-03 16:36:53.619519', '2019-06-03 16:36:53.61952', 8589934592, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZjdLwAXsL2eIh4K+qv7MhQiH7W7LZaUq9IK+/p5Db8bMAAAAAXPVMogAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAA5YwG7hzcH7+TYJ0iG4Sklbds5327gq5uPLExV/3yG/00xaSt7UjaVPS4JTjgaBM+pMZJem5uEpbv/ROp+iduQAAAAAIN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 3, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:36:53.635795', '2019-06-03 16:36:53.635795', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (2, 21474844673, 1); -INSERT INTO history_operation_participants VALUES (3, 21474848769, 1); -INSERT INTO history_operation_participants VALUES (4, 21474852865, 1); -INSERT INTO history_operation_participants VALUES (5, 21474856961, 1); -INSERT INTO history_operation_participants VALUES (6, 21474861057, 1); -INSERT INTO history_operation_participants VALUES (7, 21474865153, 1); -INSERT INTO history_operation_participants VALUES (8, 21474869249, 1); -INSERT INTO history_operation_participants VALUES (9, 21474873345, 1); -INSERT INTO history_operation_participants VALUES (10, 21474877441, 1); -INSERT INTO history_operation_participants VALUES (11, 21474881537, 1); -INSERT INTO history_operation_participants VALUES (12, 21474885633, 1); -INSERT INTO history_operation_participants VALUES (13, 21474889729, 1); -INSERT INTO history_operation_participants VALUES (14, 21474893825, 1); -INSERT INTO history_operation_participants VALUES (15, 21474897921, 1); -INSERT INTO history_operation_participants VALUES (16, 21474902017, 1); -INSERT INTO history_operation_participants VALUES (17, 21474906113, 1); -INSERT INTO history_operation_participants VALUES (18, 21474910209, 1); -INSERT INTO history_operation_participants VALUES (19, 21474914305, 1); -INSERT INTO history_operation_participants VALUES (20, 21474918401, 1); -INSERT INTO history_operation_participants VALUES (21, 21474922497, 1); -INSERT INTO history_operation_participants VALUES (22, 21474926593, 1); -INSERT INTO history_operation_participants VALUES (23, 21474930689, 1); -INSERT INTO history_operation_participants VALUES (24, 21474934785, 1); -INSERT INTO history_operation_participants VALUES (25, 21474938881, 1); -INSERT INTO history_operation_participants VALUES (26, 21474942977, 1); -INSERT INTO history_operation_participants VALUES (27, 21474947073, 1); -INSERT INTO history_operation_participants VALUES (28, 21474951169, 1); -INSERT INTO history_operation_participants VALUES (29, 21474955265, 1); -INSERT INTO history_operation_participants VALUES (30, 21474959361, 1); -INSERT INTO history_operation_participants VALUES (31, 21474963457, 1); -INSERT INTO history_operation_participants VALUES (32, 21474967553, 1); -INSERT INTO history_operation_participants VALUES (33, 21474971649, 1); -INSERT INTO history_operation_participants VALUES (34, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (35, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (36, 17179877377, 2); -INSERT INTO history_operation_participants VALUES (37, 17179877377, 3); -INSERT INTO history_operation_participants VALUES (38, 17179881473, 2); -INSERT INTO history_operation_participants VALUES (39, 17179881473, 1); -INSERT INTO history_operation_participants VALUES (40, 17179885569, 2); -INSERT INTO history_operation_participants VALUES (41, 17179885569, 3); -INSERT INTO history_operation_participants VALUES (42, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (43, 12884910081, 3); -INSERT INTO history_operation_participants VALUES (44, 12884914177, 3); -INSERT INTO history_operation_participants VALUES (45, 12884918273, 1); -INSERT INTO history_operation_participants VALUES (46, 8589938689, 4); -INSERT INTO history_operation_participants VALUES (47, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (48, 8589942785, 4); -INSERT INTO history_operation_participants VALUES (49, 8589942785, 1); -INSERT INTO history_operation_participants VALUES (50, 8589946881, 4); -INSERT INTO history_operation_participants VALUES (51, 8589946881, 3); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 51, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 3, '{"price": "0.1000000", "amount": "10000.0000000", "price_r": {"d": 10, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474844673, 21474844672, 1, 3, '{"price": "0.1111111", "amount": "9000.0000000", "price_r": {"d": 9, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474848769, 21474848768, 1, 3, '{"price": "0.1250000", "amount": "8000.0000000", "price_r": {"d": 8, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474852865, 21474852864, 1, 3, '{"price": "0.1428571", "amount": "7000.0000000", "price_r": {"d": 7, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474856961, 21474856960, 1, 3, '{"price": "0.1666667", "amount": "6000.0000000", "price_r": {"d": 6, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474861057, 21474861056, 1, 3, '{"price": "0.2000000", "amount": "5000.0000000", "price_r": {"d": 5, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474865153, 21474865152, 1, 3, '{"price": "0.2500000", "amount": "4000.0000000", "price_r": {"d": 4, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474869249, 21474869248, 1, 3, '{"price": "0.3333333", "amount": "3000.0000000", "price_r": {"d": 3, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474873345, 21474873344, 1, 3, '{"price": "0.5000000", "amount": "2000.0000000", "price_r": {"d": 2, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474877441, 21474877440, 1, 3, '{"price": "1.0000000", "amount": "1000.0000000", "price_r": {"d": 1, "n": 1}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474881537, 21474881536, 1, 3, '{"price": "10.0000000", "amount": "100.0000000", "price_r": {"d": 1, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474885633, 21474885632, 1, 3, '{"price": "0.0990099", "amount": "10100.0000000", "price_r": {"d": 101, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474889729, 21474889728, 1, 3, '{"price": "0.1098901", "amount": "9100.0000000", "price_r": {"d": 91, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474893825, 21474893824, 1, 3, '{"price": "0.1234568", "amount": "8100.0000000", "price_r": {"d": 81, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474897921, 21474897920, 1, 3, '{"price": "0.1408451", "amount": "7100.0000000", "price_r": {"d": 71, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474902017, 21474902016, 1, 3, '{"price": "0.1639344", "amount": "6100.0000000", "price_r": {"d": 61, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474906113, 21474906112, 1, 3, '{"price": "0.1960784", "amount": "5100.0000000", "price_r": {"d": 51, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474910209, 21474910208, 1, 3, '{"price": "0.2439024", "amount": "4100.0000000", "price_r": {"d": 41, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474914305, 21474914304, 1, 3, '{"price": "0.3225806", "amount": "3100.0000000", "price_r": {"d": 310000028, "n": 100000009}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474918401, 21474918400, 1, 3, '{"price": "0.4761905", "amount": "2100.0000000", "price_r": {"d": 21, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474922497, 21474922496, 1, 3, '{"price": "0.9090909", "amount": "1100.0000000", "price_r": {"d": 11, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474926593, 21474926592, 1, 3, '{"price": "5.0000000", "amount": "200.0000000", "price_r": {"d": 1, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474930689, 21474930688, 1, 3, '{"price": "0.0980392", "amount": "10200.0000000", "price_r": {"d": 51, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474934785, 21474934784, 1, 3, '{"price": "0.1086957", "amount": "9200.0000000", "price_r": {"d": 46, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474938881, 21474938880, 1, 3, '{"price": "0.1219512", "amount": "8200.0000000", "price_r": {"d": 41, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474942977, 21474942976, 1, 3, '{"price": "0.1388889", "amount": "7200.0000000", "price_r": {"d": 36, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474947073, 21474947072, 1, 3, '{"price": "0.1612903", "amount": "6200.0000000", "price_r": {"d": 31, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474951169, 21474951168, 1, 3, '{"price": "0.1923077", "amount": "5200.0000000", "price_r": {"d": 26, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474955265, 21474955264, 1, 3, '{"price": "0.2380952", "amount": "4200.0000000", "price_r": {"d": 21, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474959361, 21474959360, 1, 3, '{"price": "0.3125000", "amount": "3200.0000000", "price_r": {"d": 16, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474963457, 21474963456, 1, 3, '{"price": "0.4545455", "amount": "2200.0000000", "price_r": {"d": 11, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474967553, 21474967552, 1, 3, '{"price": "0.8333333", "amount": "1200.0000000", "price_r": {"d": 6, "n": 5}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474971649, 21474971648, 1, 3, '{"price": "3.3333333", "amount": "300.0000000", "price_r": {"d": 3, "n": 10}, "offer_id": 0, "buying_asset_code": "USD", "buying_asset_type": "credit_alphanum4", "selling_asset_type": "native", "buying_asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179877377, 17179877376, 1, 1, '{"to": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179881473, 17179881472, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (17179885569, 17179885568, 1, 1, '{"to": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "5000.0000000", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884910081, 12884910080, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884914177, 12884914176, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON'); -INSERT INTO history_operations VALUES (12884918273, 12884918272, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "BTC", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589946881, 8589946880, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON", "starting_balance": "6000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (2, 21474844672, 1); -INSERT INTO history_transaction_participants VALUES (3, 21474848768, 1); -INSERT INTO history_transaction_participants VALUES (4, 21474852864, 1); -INSERT INTO history_transaction_participants VALUES (5, 21474856960, 1); -INSERT INTO history_transaction_participants VALUES (6, 21474861056, 1); -INSERT INTO history_transaction_participants VALUES (7, 21474865152, 1); -INSERT INTO history_transaction_participants VALUES (8, 21474869248, 1); -INSERT INTO history_transaction_participants VALUES (9, 21474873344, 1); -INSERT INTO history_transaction_participants VALUES (10, 21474877440, 1); -INSERT INTO history_transaction_participants VALUES (11, 21474881536, 1); -INSERT INTO history_transaction_participants VALUES (12, 21474885632, 1); -INSERT INTO history_transaction_participants VALUES (13, 21474889728, 1); -INSERT INTO history_transaction_participants VALUES (14, 21474893824, 1); -INSERT INTO history_transaction_participants VALUES (15, 21474897920, 1); -INSERT INTO history_transaction_participants VALUES (16, 21474902016, 1); -INSERT INTO history_transaction_participants VALUES (17, 21474906112, 1); -INSERT INTO history_transaction_participants VALUES (18, 21474910208, 1); -INSERT INTO history_transaction_participants VALUES (19, 21474914304, 1); -INSERT INTO history_transaction_participants VALUES (20, 21474918400, 1); -INSERT INTO history_transaction_participants VALUES (21, 21474922496, 1); -INSERT INTO history_transaction_participants VALUES (22, 21474926592, 1); -INSERT INTO history_transaction_participants VALUES (23, 21474930688, 1); -INSERT INTO history_transaction_participants VALUES (24, 21474934784, 1); -INSERT INTO history_transaction_participants VALUES (25, 21474938880, 1); -INSERT INTO history_transaction_participants VALUES (26, 21474942976, 1); -INSERT INTO history_transaction_participants VALUES (27, 21474947072, 1); -INSERT INTO history_transaction_participants VALUES (28, 21474951168, 1); -INSERT INTO history_transaction_participants VALUES (29, 21474955264, 1); -INSERT INTO history_transaction_participants VALUES (30, 21474959360, 1); -INSERT INTO history_transaction_participants VALUES (31, 21474963456, 1); -INSERT INTO history_transaction_participants VALUES (32, 21474967552, 1); -INSERT INTO history_transaction_participants VALUES (33, 21474971648, 1); -INSERT INTO history_transaction_participants VALUES (34, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (35, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (36, 17179877376, 2); -INSERT INTO history_transaction_participants VALUES (37, 17179877376, 3); -INSERT INTO history_transaction_participants VALUES (38, 17179881472, 2); -INSERT INTO history_transaction_participants VALUES (39, 17179881472, 1); -INSERT INTO history_transaction_participants VALUES (40, 17179885568, 2); -INSERT INTO history_transaction_participants VALUES (41, 17179885568, 3); -INSERT INTO history_transaction_participants VALUES (42, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (43, 12884910080, 3); -INSERT INTO history_transaction_participants VALUES (44, 12884914176, 3); -INSERT INTO history_transaction_participants VALUES (45, 12884918272, 1); -INSERT INTO history_transaction_participants VALUES (46, 8589938688, 4); -INSERT INTO history_transaction_participants VALUES (47, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (48, 8589942784, 4); -INSERT INTO history_transaction_participants VALUES (49, 8589942784, 1); -INSERT INTO history_transaction_participants VALUES (50, 8589946880, 4); -INSERT INTO history_transaction_participants VALUES (51, 8589946880, 3); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 51, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('c48b48982dcd1f079d90ee3289dc2b6269bce088bd7183ddba8e3dca25b1e84b', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934595, 100, 1, '2019-06-03 16:36:53.54857', '2019-06-03 16:36:53.54857', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXSHboAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAOL8799gdl4G9kC/cOT6pQu2zfD5GhhExAKtKmb7s8ozksyqIYI21eqCLcluwLlb2wBim5Owr0y2zzxYH7vqOBw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXSHboAAAAAAEAAAAKAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAMAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAMAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXSHboAAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAwAAAAQAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAAAAAAAAAAAAQAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp7UAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{OL8799gdl4G9kC/cOT6pQu2zfD5GhhExAKtKmb7s8ozksyqIYI21eqCLcluwLlb2wBim5Owr0y2zzxYH7vqOBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('437a48108dd143273dcf1c28296d6048d0915c6072650eb5f794b89560a40c0c', 5, 2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934596, 100, 1, '2019-06-03 16:36:53.54883', '2019-06-03 16:36:53.54883', 21474844672, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAuUnZlMxj8taqMo/PYfI4rBl41Cpps/XHGlNot5+TWTZE9A06ipER6Q7XqbxhNzmAR8NaQbS3Ds0RQv44r3GLCg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAADAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAF0h26AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAQAAAADAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAEAAAAAwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAF0h26AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAQAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAsPOHsAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAU9GsEAAAAAAEAAAAJAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAASoF8gAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp7UAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp5wAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{uUnZlMxj8taqMo/PYfI4rBl41Cpps/XHGlNot5+TWTZE9A06ipER6Q7XqbxhNzmAR8NaQbS3Ds0RQv44r3GLCg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('9f9ea714b1a39664b1e6df0fafd1aa17eda71bb05715fe1371246f3208b3a1b1', 5, 3, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934597, 100, 1, '2019-06-03 16:36:53.548976', '2019-06-03 16:36:53.548976', 21474848768, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA9LQUhBPQFZOopSh/vuUNPcUm0DLI9wD4aw449Ccu6ADMejat8t2MyuzWvx8RwQMPd9zdXlwCE5d8cT3upwuPAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAEAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAALDzh7AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAUAAAAEAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAsPOHsAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAFAAAABAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAALDzh7AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAUAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAA+3UEMAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAASoF8gAAAAAAEAAAAIAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAEqBfIAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAb8I6wAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp5wAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp4MAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{9LQUhBPQFZOopSh/vuUNPcUm0DLI9wD4aw449Ccu6ADMejat8t2MyuzWvx8RwQMPd9zdXlwCE5d8cT3upwuPAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f966ab310137dae86c7ee7ee08850339537c78f854eaaaea78d7fd834134da79', 5, 4, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934598, 100, 1, '2019-06-03 16:36:53.549117', '2019-06-03 16:36:53.549117', 21474852864, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAaZXT/bkDz3FqTJhXKtcSev5gzrE0wL2GSnszf7t4qBTcnW3P4heHeAFIkSjtgz0m7IgGT1goVlbtdA5PtZNNCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAFAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAPt1BDAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAYAAAAFAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAA+3UEMAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAGAAAABQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAPt1BDAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAYAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABPKZRIAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQTFM8AAAAAAEAAAAHAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAG/COsAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAlQL5AAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp4MAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp2oAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{aZXT/bkDz3FqTJhXKtcSev5gzrE0wL2GSnszf7t4qBTcnW3P4heHeAFIkSjtgz0m7IgGT1goVlbtdA5PtZNNCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('360d890880eebd224d7506b9881352fbc6b6b1921f84a85e9807f0775b5560bc', 5, 5, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934599, 100, 1, '2019-06-03 16:36:53.549264', '2019-06-03 16:36:53.549264', 21474856960, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAAAAAAEAAAAGAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAp1hMoM8rNid3pnBSv/sqgRwIIyLgkeBbUMH9SYTGgXXWZSB1Q7Rv54QgXbJ5XNxPqA9kgz/LYpJc3V9Lsk+mBA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAAAAAAEAAAAGAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAGAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAATymUSAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAcAAAAGAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABPKZRIAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAHAAAABgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAATymUSAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAcAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABdIdugAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAN+EdYAAAAAAEAAAAGAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAJUC+QAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAAukO3QAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp2oAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp1EAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{p1hMoM8rNid3pnBSv/sqgRwIIyLgkeBbUMH9SYTGgXXWZSB1Q7Rv54QgXbJ5XNxPqA9kgz/LYpJc3V9Lsk+mBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bc1c988cc29d96ba3ed032e48f862cda1c9ed615b07ac8db51ef399cd3fa2941', 5, 6, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934600, 100, 1, '2019-06-03 16:36:53.549415', '2019-06-03 16:36:53.549415', 21474861056, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAd6LAs45dbBkADWNU5etnooaywHqrB19Tf40hy6/miUAnNAx6o8/ueoRawn+3RJyRvQW3WKpZPbp4zB49zcYkDw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAHAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAgAAAAHAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABdIdugAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAIAAAABwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAXSHboAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAgAAAAIAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABoxhcUAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAALpDt0AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAA34R1gAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp1EAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpzgAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{d6LAs45dbBkADWNU5etnooaywHqrB19Tf40hy6/miUAnNAx6o8/ueoRawn+3RJyRvQW3WKpZPbp4zB49zcYkDw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('61b33dced6b81dde0e86b61ba4abc280b6c35c6e4ba8045b5082f74a9a2b60ed', 5, 7, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934601, 100, 1, '2019-06-03 16:36:53.549535', '2019-06-03 16:36:53.549535', 21474865152, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAJAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJUC+QAAAAAAEAAAAEAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAFHqWUK4Luj4d8sUiQ18OB6fikbsPQXZAOIfZ32sgs62+Q17GMnwYqsxFo1ti49R7cMLadDsnhHjknkOQMzc+Dg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJUC+QAAAAAAEAAAAEAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAIAAAACAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAaMYXFAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAkAAAAIAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAABoxhcUAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAJAAAACAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAaMYXFAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAkAAAAJAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAByFkakAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJUC+QAAAAAAEAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAN+EdYAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABBMUzwAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpzgAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpx8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{FHqWUK4Luj4d8sUiQ18OB6fikbsPQXZAOIfZ32sgs62+Q17GMnwYqsxFo1ti49R7cMLadDsnhHjknkOQMzc+Dg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('163aab67c5a24a59eda5e4b4e5f32924f603cff52a5e4fb25eae987538c23106', 5, 8, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934602, 100, 1, '2019-06-03 16:36:53.549659', '2019-06-03 16:36:53.54966', 21474869248, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAKAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAG/COsAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAm8aNJ18QdO28lh/q/TJRX9IDlSqhaNzxgla/NgydpGXxdgAYYA9bSLdcknkQ8zFwfSdYmmjKqnDxYG1U00rLBw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAG/COsAAAAAAEAAAADAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAJAAAACQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAchZGpAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAoAAAAJAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAByFkakAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAKAAAACQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAchZGpAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAoAAAAKAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB5EmpQAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAG/COsAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAQTFM8AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABKgXyAAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpx8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpwYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{m8aNJ18QdO28lh/q/TJRX9IDlSqhaNzxgla/NgydpGXxdgAYYA9bSLdcknkQ8zFwfSdYmmjKqnDxYG1U00rLBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('627fdbd55feaf21e6e96addebb0f5fc73540ff9505d5d0dc76c9ec69f4d2f76f', 5, 9, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934603, 100, 1, '2019-06-03 16:36:53.549777', '2019-06-03 16:36:53.549777', 21474873344, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAALAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA2pl8oiRj9zUIFp9AYMaKOb0OAbMsMjJNUUHewa3JwSH0V2Zaol7gkH5ymr3CNwO1e5X8fGilLZm+x5P7okPWDQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAKAAAACgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAeRJqUAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAsAAAAKAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB5EmpQAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAALAAAACgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAeRJqUAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAsAAAALAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB9uoIYAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAEqBfIAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAASoF8gAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABT0awQAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpwYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpu0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{2pl8oiRj9zUIFp9AYMaKOb0OAbMsMjJNUUHewa3JwSH0V2Zaol7gkH5ymr3CNwO1e5X8fGilLZm+x5P7okPWDQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('e252b8842716f49fe824df8c95e51a55b40db1b51017ba97dc59b2d971e5cb10', 5, 10, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934604, 100, 1, '2019-06-03 16:36:53.549897', '2019-06-03 16:36:53.549897', 21474877440, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAMAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA0lB577a6VFTmqiBKQXiyg6YgjTPcU8n9Mldb5GdKeZ8DRkWG797qE3Tn/WL5uFYnY6qldsI9U31ASttn/Mh8Cg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAALAAAACwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAfbqCGAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAwAAAALAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAB9uoIYAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAMAAAACwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAfbqCGAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAwAAAAMAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACADo38AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAU9GsEAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABdIdugAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpu0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcptQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{0lB577a6VFTmqiBKQXiyg6YgjTPcU8n9Mldb5GdKeZ8DRkWG797qE3Tn/WL5uFYnY6qldsI9U31ASttn/Mh8Cg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b962b228793859d32de9d6a3d3e782acb8f2d0b9e3a17a91571a402d7cd47a8a', 5, 11, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934605, 100, 1, '2019-06-03 16:36:53.550025', '2019-06-03 16:36:53.550025', 21474881536, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAANAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAikMlBAAA6oi4Rg6Gp3svzTPGcaUQx4HtpN0TgusXrMTkbVsBpvHNs+w0bFF9BOgtyGYK2/6zfkXYMVEB9X6aCg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAoAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAMAAAADAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgA6N/AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA0AAAAMAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACADo38AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAANAAAADAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgA6N/AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA0AAAANAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACASijGAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAXSHboAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABmcgswAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcptQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcprsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ikMlBAAA6oi4Rg6Gp3svzTPGcaUQx4HtpN0TgusXrMTkbVsBpvHNs+w0bFF9BOgtyGYK2/6zfkXYMVEB9X6aCg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('0343d98ff86bf4b5f9e24db8b3889fe34df7a166cfde7e9098a83c11f7eb9722', 5, 12, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934606, 100, 1, '2019-06-03 16:36:53.550144', '2019-06-03 16:36:53.550144', 21474885632, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAOAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAjAuehle1J2zs3RaLV5FD/TsgwVWQTHrGyz9xtHfjohTp9ugklMElF1GFa7zxijTpghCK1A0yyVuIrf8mIQiuBA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAANAAAADQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgEooxgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA4AAAANAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACASijGAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAOAAAADQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAgEooxgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA4AAAAOAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACXzjp4AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAAwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXhBGyAAAAAAoAAABlAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAZnILMAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAABvwjrAAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcprsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpqIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{jAuehle1J2zs3RaLV5FD/TsgwVWQTHrGyz9xtHfjohTp9ugklMElF1GFa7zxijTpghCK1A0yyVuIrf8mIQiuBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('e82691759c9c5796c5cc91a1c71f233b6c5a38af9ad5976c7e655078818838e7', 5, 13, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934607, 100, 1, '2019-06-03 16:36:53.550264', '2019-06-03 16:36:53.550264', 21474889728, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAPAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVMAXOAAAAAAoAAABbAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAj4F6inPyng6e0YtLtA9CBE8NYDuuMERmHR9ePEt3dFa0gma/P84LRkWeDa4Zb2E6wKVLnrjcqRdWHjE1YN3CAw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVMAXOAAAAAAoAAABbAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAOAAAADgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAl846eAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA8AAAAOAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACXzjp4AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAPAAAADgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAl846eAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAA8AAAAPAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACs/kBGAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVMAXOAAAAAAoAAABbAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAb8I6wAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAB5EmpQAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpqIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpokAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{j4F6inPyng6e0YtLtA9CBE8NYDuuMERmHR9ePEt3dFa0gma/P84LRkWeDa4Zb2E6wKVLnrjcqRdWHjE1YN3CAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('d80c809a4065600d7705e7db04e1260bf39582d941446a95fb9cea66680ef0c3', 5, 14, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934608, 100, 1, '2019-06-03 16:36:53.550382', '2019-06-03 16:36:53.550382', 21474893824, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAQAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAS2/nqAAAAAAoAAABRAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGYwwYwUMaDuxhjfxFrmYgv62lZiUxTe8QNw75Za/PCyZ/ZS4NK6peWAJh+m8H33lhcVsst5ElAhFZ+zwZZ3VDQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAS2/nqAAAAAAoAAABRAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAPAAAADwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAArP5ARgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABAAAAAPAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAACs/kBGAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAQAAAADwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAArP5ARgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABAAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAC/2jowAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAS2/nqAAAAAAoAAABRAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAeRJqUAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACCYpngAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpokAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpnAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GYwwYwUMaDuxhjfxFrmYgv62lZiUxTe8QNw75Za/PCyZ/ZS4NK6peWAJh+m8H33lhcVsst5ElAhFZ+zwZZ3VDQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('fd0bc444f5e90e9a61a5aa011a8b62376ef2d7e304418a188a294bb0b95740f8', 5, 15, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934609, 100, 1, '2019-06-03 16:36:53.550503', '2019-06-03 16:36:53.550503', 21474897920, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAARAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQh+4GAAAAAAoAAABHAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAvgqC6TyEhSrhF7K4wwOgd0sCvmFAQgfM1Ez+eEwWbm/BPJSW0WpOTxU5feEKAOpLYaHJvvvD+WZKm5PI/yadBw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQh+4GAAAAAAoAAABHAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAQAAAAEAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAv9o6MAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABEAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAC/2jowAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAARAAAAEAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAv9o6MAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABEAAAARAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADQYig2AAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAA8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQh+4GAAAAAAoAAABHAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAgmKZ4AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACLsslwAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpnAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcplcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{vgqC6TyEhSrhF7K4wwOgd0sCvmFAQgfM1Ez+eEwWbm/BPJSW0WpOTxU5feEKAOpLYaHJvvvD+WZKm5PI/yadBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('04b1a1a09159b1c7bb43fd1dc0f282958d0a01c337d72a0324c0262b58d93615', 5, 16, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934610, 100, 1, '2019-06-03 16:36:53.55062', '2019-06-03 16:36:53.55062', 21474902016, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAASAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOM+IiAAAAAAoAAAA9AAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAE0N79ktAplSSjovU50IktziuRrJN6xmRkF7fsV+YjK5g8XWPegdWuH8u55zCzZcBzddo8CaiuEWpJMPjMZZICA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOM+IiAAAAAAoAAAA9AAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAARAAAAEQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA0GIoNgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABIAAAARAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADQYig2AAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAASAAAAEQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA0GIoNgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABIAAAASAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADelgpYAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOM+IiAAAAAAoAAAA9AAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAi7LJcAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACVAvkAAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcplcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpj4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{E0N79ktAplSSjovU50IktziuRrJN6xmRkF7fsV+YjK5g8XWPegdWuH8u55zCzZcBzddo8CaiuEWpJMPjMZZICA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5d37d98f720dfb3dce49331f403bfa3f9ef13122fae954a73b7b688b180b1516', 5, 17, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934611, 100, 1, '2019-06-03 16:36:53.550747', '2019-06-03 16:36:53.550747', 21474906112, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAATAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAXUhb5QTAO+vV5kTEQqOp9yi4sDerjU5vIT5VH3MiOG381zIplmafJjLNHS02enkonOHtHWIvqznVQjHqQ389DQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAASAAAAEgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA3pYKWAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABMAAAASAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADelgpYAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAATAAAAEgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA3pYKWAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABMAAAATAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADqdeCWAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAL39Y+AAAAAAoAAAAzAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAlQL5AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACeUyiQAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpj4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpiUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{XUhb5QTAO+vV5kTEQqOp9yi4sDerjU5vIT5VH3MiOG381zIplmafJjLNHS02enkonOHtHWIvqznVQjHqQ389DQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('a3d82c4ac237e77f385f3cdf5a358cabc4b0c12b7f58b59c197fdba8a76010cf', 5, 18, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934612, 100, 1, '2019-06-03 16:36:53.550878', '2019-06-03 16:36:53.550878', 21474910208, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAUAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJi8paAAAAAAoAAAApAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAiJwFcozA9Q4Vj/tABAkphbvOi6Hs325bHDBpTi6J/LN3SVHGsYQ2UwD1recgYoYtoWD1+qkKdFMSzeuIZodJDQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJi8paAAAAAAoAAAApAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAATAAAAEwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA6nXglgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABQAAAATAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAADqdeCWAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAUAAAAEwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA6nXglgAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABQAAAAUAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD0AarwAAAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABIAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJi8paAAAAAAoAAAApAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAnlMokAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACno1ggAAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpiUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpgwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{iJwFcozA9Q4Vj/tABAkphbvOi6Hs325bHDBpTi6J/LN3SVHGsYQ2UwD1recgYoYtoWD1+qkKdFMSzeuIZodJDQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('e09337eedf136665192e840b23bf26b86fc85b93bb401d3a1ce4ee2a1b579213', 5, 19, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934613, 100, 1, '2019-06-03 16:36:53.551056', '2019-06-03 16:36:53.551056', 21474914304, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAVAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHN752AAX14QkSejmcAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAEhl1VhzJ53lV9jnMsTC9/D5/tr0jaWCgSc0KCmdSqlqbQ/kDEgvT+jfSLDuQ6gM9GJCSfoFXT4preQ0mpLvCCQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHN751/gX14QkSejmcAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAUAAAAFAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA9AGq8AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABUAAAAUAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD0AarwAAAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAVAAAAFAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA9AGq8AAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABUAAAAVAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD7OWll/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHN751/gX14QkSejmcAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAp6NYIAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAACw84ev8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpgwAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpfMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Ehl1VhzJ53lV9jnMsTC9/D5/tr0jaWCgSc0KCmdSqlqbQ/kDEgvT+jfSLDuQ6gM9GJCSfoFXT4preQ0mpLvCCQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f140ddf0c75f70ddf0d79391e6b5992b9c56b9c23c040008b908c70a413eb03d', 5, 20, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934614, 100, 1, '2019-06-03 16:36:53.551177', '2019-06-03 16:36:53.551177', 21474918400, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAWAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAW7ujBoctNRfa1M6+T0tShj0Q+l9ybp9C6jQmrSEUeBSwAqucU1YAMlc3XzqIBy35EsuVN0k0hD81/rrCNCtICg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAVAAAAFQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA+zlpZf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABYAAAAVAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAD7OWll/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAWAAAAFQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAA+zlpZf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABYAAAAWAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEAHRv3/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABQAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAE47KSAAAAAAoAAAAVAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAsPOHr/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAC6Q7c/8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpfMAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpdoAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{W7ujBoctNRfa1M6+T0tShj0Q+l9ybp9C6jQmrSEUeBSwAqucU1YAMlc3XzqIBy35EsuVN0k0hD81/rrCNCtICg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5d46530574ecf525512b5184af69899d95a826ec6bbad2e0b2d34b3efa352d7f', 5, 21, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934615, 100, 1, '2019-06-03 16:36:53.551294', '2019-06-03 16:36:53.551294', 21474922496, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAXAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACj6auAAAAAAoAAAALAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAmEz+ciLZWEXIlsEWtrY1Ii1fzoax2dGCE/Fu0GhOyqbw90Dvs+k3aVOmQLTByU5JWjEvd6Op+oV3i+7KPPtxAw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACj6auAAAAAAoAAAALAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAWAAAAFgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAB0b9/4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABcAAAAWAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEAHRv3/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAXAAAAFgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAB0b9/4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABcAAAAXAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAECrMKl/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABUAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACj6auAAAAAAoAAAALAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAukO3P/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADDk+bP8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpdoAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpcEAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{mEz+ciLZWEXIlsEWtrY1Ii1fzoax2dGCE/Fu0GhOyqbw90Dvs+k3aVOmQLTByU5JWjEvd6Op+oV3i+7KPPtxAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bc2a16ca82b7d0bd903c26482736cceb9f4efa077071e72849654b3aced94136', 5, 22, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934616, 100, 1, '2019-06-03 16:36:53.55141', '2019-06-03 16:36:53.55141', 21474926592, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAYAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAJnrtXGyjkqpAJAFfDY0JyJjXfS9/xXLLHdu3XT20IxpJCBQ2K0fhYnVis0tnbacC9/vTcmLnWxKg1oGCR9usBA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAXAAAAFwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAqzCpf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABgAAAAXAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAECrMKl/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAYAAAAFwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAqzCpf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABgAAAAYAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEDI/g5/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABYAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAdzWUAAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAw5Pmz/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADM5BZf8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpcEAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpagAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{JnrtXGyjkqpAJAFfDY0JyJjXfS9/xXLLHdu3XT20IxpJCBQ2K0fhYnVis0tnbacC9/vTcmLnWxKg1oGCR9usBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('a0bdbdb1aa35b7f2aec201b618fca59405e4c375f8f76a24ef25e885a96fd7ed', 5, 23, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934617, 100, 1, '2019-06-03 16:36:53.55153', '2019-06-03 16:36:53.55153', 21474930688, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAZAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXv6x8AAAAAAUAAAAzAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGqxC/cid99JKEBv6Y7vmkU1u+UQ+SwDxHIjLeMmmrt5Uv2TCs6Ct4tokvwjlGsbBo1scU8nQmwuXui8bfNGTAA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXv6x8AAAAAAUAAAAzAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAYAAAAGAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAyP4Of4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABkAAAAYAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEDI/g5/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAZAAAAGAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABAyP4Of4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABkAAAAZAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEa46S1/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABcAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAXv6x8AAAAAAUAAAAzAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAAzOQWX/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADWNEXv8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpagAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpY8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GqxC/cid99JKEBv6Y7vmkU1u+UQ+SwDxHIjLeMmmrt5Uv2TCs6Ct4tokvwjlGsbBo1scU8nQmwuXui8bfNGTAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('9b90554626c9bfa396b4f61cc910d383a38f1223c8f5478edde6fe60a7f2f406', 5, 24, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934618, 100, 1, '2019-06-03 16:36:53.551655', '2019-06-03 16:36:53.551655', 21474934784, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABATU8XW0HLVKABibMcV0H3VxUkGh/dQhUcM0eFCkFzVgeXmY9g1V/MnP9DsNs1aipuJVlAGS0B88gxbmoQ5h6rDA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAZAAAAGQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABGuOktf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABoAAAAZAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEa46S1/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAaAAAAGQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABGuOktf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABoAAAAaAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEwT0VN/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABgAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAVa6CYAAAAAAUAAAAuAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA1jRF7/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADfhHV/8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpY8AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpXYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{TU8XW0HLVKABibMcV0H3VxUkGh/dQhUcM0eFCkFzVgeXmY9g1V/MnP9DsNs1aipuJVlAGS0B88gxbmoQ5h6rDA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('0e17e87fcda53937d77cbf1e2658fcdf41eb0689e9649545bb14a5960832e5b8', 5, 25, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934619, 100, 1, '2019-06-03 16:36:53.551786', '2019-06-03 16:36:53.551786', 21474938880, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAbAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAATF5S0AAAAAAUAAAApAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABALhl41aevL0eWZT/dx9jwFRVb7nDeDsjPeuPKK5QCBgWZjBWFwwRXz+gTiHccCvG5W4d93ucAU4xOkbCj1VH9CQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAATF5S0AAAAAAUAAAApAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAaAAAAGgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABME9FTf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABsAAAAaAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAEwT0VN/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAbAAAAGgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABME9FTf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABsAAAAbAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFDZtoB/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABkAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAATF5S0AAAAAAUAAAApAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA34R1f/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADo1KUP8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpXYAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpV0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Lhl41aevL0eWZT/dx9jwFRVb7nDeDsjPeuPKK5QCBgWZjBWFwwRXz+gTiHccCvG5W4d93ucAU4xOkbCj1VH9CQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f277e4abf7d0d326fa63ee62415f7a117e43453072677d1f6e9618c8d2bb8524', 5, 26, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934620, 100, 1, '2019-06-03 16:36:53.551905', '2019-06-03 16:36:53.551905', 21474942976, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAcAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQw4jQAAAAAAUAAAAkAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAxjfuAsXsrTxv+5NVYnsb0soqC6ZoluT/Xobjrt45eAeNZMwp9/RV2hLXySkVOVk2O814/dgyeap7M+LgWibPBg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQw4jQAAAAAAUAAAAkAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAbAAAAGwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABQ2baAf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABwAAAAbAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFDZtoB/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAcAAAAGwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABQ2baAf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAABwAAAAcAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFUKmLR/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABoAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAQw4jQAAAAAAUAAAAkAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA6NSlD/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAADyJNSf8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpV0AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpUQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{xjfuAsXsrTxv+5NVYnsb0soqC6ZoluT/Xobjrt45eAeNZMwp9/RV2hLXySkVOVk2O814/dgyeap7M+LgWibPBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5e3622bf6dab1276155014b8387f261a0bbfbef247caa05e9c4be8c890dad958', 5, 27, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934621, 100, 1, '2019-06-03 16:36:53.552027', '2019-06-03 16:36:53.552028', 21474947072, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAdAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAcFijipV/lZRIDYicNpHFwnaL4J0Fmwkcr0G9VxH4lZSYgLjgQnvgniCBQrvu2eqyqOFHC8H04T7D9jXseYr4Cg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAcAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABVCpi0f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB0AAAAcAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFUKmLR/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAdAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABVCpi0f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB0AAAAdAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFimd+9/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABsAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAOb3zsAAAAAAUAAAAfAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA8iTUn/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAD7dQQv8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpUQAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpSsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{cFijipV/lZRIDYicNpHFwnaL4J0Fmwkcr0G9VxH4lZSYgLjgQnvgniCBQrvu2eqyqOFHC8H04T7D9jXseYr4Cg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b00c83ae8f3d0cd4f1760517182abdf0440eca6efcd2b0fa893aac85b35e42cb', 5, 28, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934622, 100, 1, '2019-06-03 16:36:53.552154', '2019-06-03 16:36:53.552154', 21474951168, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAeAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAMG3EIAAAAAAUAAAAaAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAbHyKtzQE0yWfACwWf+1pYV3POGcAKxlNttLK4B5LmX34VwUIGjWHqKIiw/aDtsaIqBJI62bfkYn6KiMWiRnlAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAMG3EIAAAAAAUAAAAaAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAdAAAAHQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABYpnfvf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB4AAAAdAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFimd+9/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAeAAAAHQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABYpnfvf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB4AAAAeAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFutVDF/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAABwAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAMG3EIAAAAAAUAAAAaAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAAA+3UEL/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEExTO/8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpSsAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpRIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{bHyKtzQE0yWfACwWf+1pYV3POGcAKxlNttLK4B5LmX34VwUIGjWHqKIiw/aDtsaIqBJI62bfkYn6KiMWiRnlAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3f731b66c1a3d2c4cf9d15bb17e910beaa6f6fa6a77cccfd62f5eabcd3ecfcc5', 5, 29, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934623, 100, 1, '2019-06-03 16:36:53.55227', '2019-06-03 16:36:53.55227', 21474955264, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAfAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJx2UkAAAAAAUAAAAVAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAkkZq5sVwc5pr6NYfqlSYkQevr273ibhO9EwVykO2mQ4+ka+BrQj++wfcsuJFbGaeE6NtzQxTf7XQaGZpwjk5Cw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJx2UkAAAAAAUAAAAVAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAeAAAAHgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABbrVQxf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB8AAAAeAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAFutVDF/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAfAAAAHgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABbrVQxf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAB8AAAAfAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF4fLXp/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB0AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAJx2UkAAAAAAUAAAAVAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABBMUzv/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEOFWNP8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpRIAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpPkAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{kkZq5sVwc5pr6NYfqlSYkQevr273ibhO9EwVykO2mQ4+ka+BrQj++wfcsuJFbGaeE6NtzQxTf7XQaGZpwjk5Cw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('492c8c2808bf649ba321f0f75dda11581107bff229ef457340aab8494f5ad412', 5, 30, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934624, 100, 1, '2019-06-03 16:36:53.552434', '2019-06-03 16:36:53.552434', 21474959360, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAgAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHc1lAAAAAAAUAAAAQAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAGoxQs3i+aE6OAegBkTmA0dqEadD541CFUYMVQ1aCii5ioLMaP6i5oSZ5+4c0VfY2MAPmpxdNCOY3vwH4XD8yCw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHc1lAAAAAAAUAAAAQAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAfAAAAHwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABeHy16f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACAAAAAfAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF4fLXp/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAgAAAAHwAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABeHy16f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACAAAAAgAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF/8A8p/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB4AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAHc1lAAAAAAAUAAAAQAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABDhVjT/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEXZZLf8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpPkAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpOAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GoxQs3i+aE6OAegBkTmA0dqEadD541CFUYMVQ1aCii5ioLMaP6i5oSZ5+4c0VfY2MAPmpxdNCOY3vwH4XD8yCw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c03dfbea35606bd565f3609a306aa27a82aa14b3fd142f1a13b79c1871f54a3b', 5, 31, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934625, 100, 1, '2019-06-03 16:36:53.552553', '2019-06-03 16:36:53.552553', 21474963456, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAhAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFH01cAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAlTGl5Ll7WR6ooHo4TPTHiPsPhYQEcPuFd4lby43niifsCCnLkZfzoZYxODmAHHv/RXkskBH7eRkxCZYBRXRQBA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFH01cAAAAAAUAAAALAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAgAAAAIAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABf/APKf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACEAAAAgAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAF/8A8p/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAhAAAAIAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABf/APKf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACEAAAAhAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGFD1yF/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAAB8AAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFH01cAAAAAAUAAAALAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABF2WS3/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEgtcJv8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpOAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpMcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{lTGl5Ll7WR6ooHo4TPTHiPsPhYQEcPuFd4lby43niifsCCnLkZfzoZYxODmAHHv/RXkskBH7eRkxCZYBRXRQBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('42e47f8fdcb738c844e1556c9fad18eb8887d78681ef5e9616898eb6e1c5e8eb', 5, 32, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934626, 100, 1, '2019-06-03 16:36:53.55267', '2019-06-03 16:36:53.55267', 21474967552, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAiAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACy0F4AAAAAAUAAAAGAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABAaSoEc/Kxao3Z6gUsTh1QfLjlT486TQKgtu9NhqT8EzSQ2jFCWgP+odJUnTIPRU74DOgqwEgcHBGpovaass24Dw==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACy0F4AAAAAAUAAAAGAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAhAAAAIQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABhQ9chf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACIAAAAhAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGFD1yF/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAiAAAAIQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABhQ9chf4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACIAAAAiAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGH2p39/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACAAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACy0F4AAAAAAUAAAAGAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABILXCb/AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEqBfH/8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpMcAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpK4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{aSoEc/Kxao3Z6gUsTh1QfLjlT486TQKgtu9NhqT8EzSQ2jFCWgP+odJUnTIPRU74DOgqwEgcHBGpovaass24Dw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('ee96865dfca78c43c4074317f3dbcd7ca978643b973bc9a5dc4f2588f981c6d7', 5, 33, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934627, 100, 1, '2019-06-03 16:36:53.552789', '2019-06-03 16:36:53.552789', 21474971648, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAjAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAstBeAAAAAAoAAAADAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA2FwoenXJVOTi9oyWHyNL+0wLRdikDwB4qdNJmj+OQi8a0jRgjQG/1/EsSq885q7mUvX57XCjUGH+rf70B+CFAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAstBeAAAAAAoAAAADAAAAAAAAAAAAAAAA', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAiAAAAIgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABh9qd/f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACMAAAAiAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGH2p39/gAAAAAAAAAAAAAAAQAAAAUAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKSVAAAAAIAAAAjAAAAIgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAABh9qd/f4AAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAACMAAAAjAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAGIjW5b/gAAAAAAAAAAAAAAAAAAAAUAAAACAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAAAAACEAAAAAAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAstBeAAAAAAoAAAADAAAAAAAAAAAAAAAAAAAAAwAAAAUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAVVTRAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAALpDt0AH//////////AAAAAQAAAAEAAABKgXx//AAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAf/////////8AAAABAAAAAQAAAEzViGP8AAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpK4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcpJUAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{2FwoenXJVOTi9oyWHyNL+0wLRdikDwB4qdNJmj+OQi8a0jRgjQG/1/EsSq885q7mUvX57XCjUGH+rf70B+CFAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('ea945436a3b650efa88063e737518cf1928d9a43d1aba3ec684704f160b3733e', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:36:53.587743', '2019-06-03 16:36:53.587743', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQH/ZkzR/eC0F7xP9zApeHvMH7nqetzaSdYh8WHyrwwvbEnx4Db6gz0grnRJBJS66OZbGmCk7yzHm8DkJ7bJ4QAU=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{f9mTNH94LQXvE/3MCl4e8wfuep63NpJ1iHxYfKvDC9sSfHgNvqDPSCudEkElLro5lsaYKTvLMebwOQntsnhABQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('416a63c3f1491537698cdb6f981097ed8e44ca27d2d9006bd0ba68832ebf9d55', 4, 2, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934594, 100, 1, '2019-06-03 16:36:53.587892', '2019-06-03 16:36:53.587892', 17179877376, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQFFGLGFFXbEDRdk2eFyQATNpHuqO/sFrpqsxmNNwGa+MLibNQJLDXWafC4W8KMKQ/hE0M0TLxZeu/O8tYnBuwwA=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{UUYsYUVdsQNF2TZ4XJABM2ke6o7+wWumqzGY03AZr4wuJs1AksNdZp8LhbwowpD+ETQzRMvFl6787y1icG7DAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c29948d1ca87bad2e3299c1b018c996c22ff5d56f5753bc38f0fd88c4d2c5d94', 4, 3, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934595, 100, 1, '2019-06-03 16:36:53.588021', '2019-06-03 16:36:53.588022', 17179881472, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQLn0NeCsam5YrmtsMJQVOLyOTPqDb7SMTCZGofm5ShU6fcl3PPieInQNtk1FmRVeUxdYX1rsW2KH1HQbJ644Hw0=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+M4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{ufQ14Kxqbliua2wwlBU4vI5M+oNvtIxMJkah+blKFTp9yXc8+J4idA22TUWZFV5TF1hfWuxbYofUdBsnrjgfDQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('554ea22913ebf01fc4b3a4d60b59ae28f379b800d5b6da40a6987a53ebd87f07', 4, 4, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934596, 100, 1, '2019-06-03 16:36:53.588169', '2019-06-03 16:36:53.588169', 17179885568, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAukO3QAAAAAAAAAAAH5kC3vAAAAQF34mYyRLbVT42QtFuY5UN0sr9EcuE3ltA/9yAxiNOvukbVTOaz86uCXpEZlX1FnExYDZwOZJWVXfsbdovbVUwc=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAADAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvicAAAAAIAAAAEAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAC6Q7dAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+LUAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+JwAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{XfiZjJEttVPjZC0W5jlQ3Syv0Ry4TeW0D/3IDGI06+6RtVM5rPzq4JekRmVfUWcTFgNnA5klZVd+xt2i9tVTBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:36:53.605428', '2019-06-03 16:36:53.605428', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcqAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp+cAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('811192c38643df73c015a5a1d77b802dff05d4f50fc6d10816aa75c0a6109f9a', 3, 2, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934593, 100, 1, '2019-06-03 16:36:53.605654', '2019-06-03 16:36:53.605654', 12884910080, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQPlg7GLhJg0x7jpAw1Ew6H2XF6yRImfJIwFfx09Nui5btOJAFewFANfOaAB8FQZl5p3A5g3k6DHDigfUNUD16gc=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1gAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1ecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{+WDsYuEmDTHuOkDDUTDofZcXrJEiZ8kjAV/HT026Llu04kAV7AUA185oAHwVBmXmncDmDeToMcOKB9Q1QPXqBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('7df857c23c7dfeb974d7c3956775685a8edfa8496bb781fd346c8e2025fad9bf', 3, 3, 'GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON', 8589934594, 100, 1, '2019-06-03 16:36:53.605788', '2019-06-03 16:36:53.605788', 12884914176, 'AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAFvFIhaAAAAQBH/ML6+RzWquFPh8gLF2RuZzYtjjpPeHv/od9M74xlU09Xa4a5e1NhMtMSRIoLItg1EaDWE9zvtHflVWIAaSwQ=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdXOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1ecAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1c4AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{Ef8wvr5HNaq4U+HyAsXZG5nNi2OOk94e/+h30zvjGVTT1drhrl7U2Ey0xJEigsi2DURoNYT3O+0d+VVYgBpLBA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('3476bc649563488cf025d82790aa9c44649188232b150d2864d13fe9face5406', 3, 4, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:36:53.60592', '2019-06-03 16:36:53.60592', 12884918272, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABQlRDAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQEKBv+8zL1epwxC+sJhEYPmbjL9XScXtctoMIdet5dhgk7YJVJzAnRSgYTvfyoIJKJdQmX66uh2o+rG9K6JImgY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKfOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFCVEMAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp+cAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcp84AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{QoG/7zMvV6nDEL6wmERg+ZuMv1dJxe1y2gwh163l2GCTtglUnMCdFKBhO9/Kggkol1CZfrq6Haj6sb0rokiaBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('db398eb4ae89756325643cad21c94e13bfc074b323ee83e141bf701a5d904f1b', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:36:53.620351', '2019-06-03 16:36:53.620351', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAACVAvkAAAAAAAAAAABVvwF9wAAAEAYjQcPT2G5hqnBmgGGeg9J8l4c1EnUlxklElH9sqZr0971F6OLWfe/m4kpFtI+sI0i1qLit5A0JyWnbhYLW5oD', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GI0HD09huYapwZoBhnoPSfJeHNRJ1JcZJRJR/bKma9Pe9Reji1n3v5uJKRbSPrCNItai4reQNCclp24WC1uaAw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('5cd7e1d317153a8d739c0f6d6861e1dc1ab5c264e3e8d4caab6aae3fc949326c', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:36:53.620693', '2019-06-03 16:36:53.620693', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAkYTnKgAAAAAAAAAAABVvwF9wAAAECHm7ok7sq0fJE4UYerrvzdtJgwKw3iHGQ2D43YeWAE+/Jjbwa2pVllbwPb5KeNomP/gXau9K9503k0yiId/HMC', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grZkE5XrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAACRhOcqAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{h5u6JO7KtHyROFGHq6783bSYMCsN4hxkNg+N2HlgBPvyY28GtqVZZW8D2+SnjaJj/4F2rvSvedN5NMoiHfxzAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('f7cb8309318368f694c8830bf789841e7e2c46dce30e60969d88bd0ce588cbe9', 2, 3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 3, 100, 1, '2019-06-03 16:36:53.620896', '2019-06-03 16:36:53.620896', 8589946880, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAAN+EdYAAAAAAAAAAABVvwF9wAAAEAQAaCgnhAHvWviyyciJH3kp9yoTQtn2SFjbCqLUUPBKzcRt8huITE9etfxlEBrW4iiJkrgyQeOCq/IGbGe2RAA', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grZkE5XrUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3grYsMniLUAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAABuaCbVXZ2DlXWarV6UxwbW3GNJgpn3ASChIFp5bxSIWgAAAA34R1gAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/7UAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{EAGgoJ4QB71r4ssnIiR95KfcqE0LZ9khY2wqi1FDwSs3EbfIbiExPXrX8ZRAa1uIoiZK4MkHjgqvyBmxntkQAA==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/order_books_310.rb b/services/horizon/internal/test/scenarios/order_books_310.rb deleted file mode 100644 index fa3acd8409..0000000000 --- a/services/horizon/internal/test/scenarios/order_books_310.rb +++ /dev/null @@ -1,66 +0,0 @@ -# This scenario attempts to emulate the scenario that gave rise to https://github.com/stellar/horizon/issues/310 - -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway -create_account :scott, :master, "1000000.0" -create_account :andrew, :master, "6000.0" - -close_ledger - -trust :scott, :usd_gateway, "USD" -trust :andrew, :usd_gateway, "USD" - -trust :scott, :usd_gateway, "BTC" -trust :andrew, :usd_gateway, "BTC" - -close_ledger - -payment :usd_gateway, :scott, ["USD", :usd_gateway, "5000.0"] -payment :usd_gateway, :andrew, ["USD", :usd_gateway, "5000.0"] - -payment :usd_gateway, :scott, ["BTC", :usd_gateway, "5000.0"] -payment :usd_gateway, :andrew, ["BTC", :usd_gateway, "5000.0"] - -close_ledger - - -# polate an order book with more than 20 price levels, inserted into the db out -# of order. -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "10.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "9.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "8.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "7.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "6.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "5.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "4.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "3.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "2.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "1.0" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "0.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "10.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "9.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "8.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "7.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "6.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "5.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "4.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "3.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "2.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "1.1" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "0.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "10.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "9.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "8.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "7.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "6.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "5.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "4.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "3.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "2.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "1.2" -offer :scott, {buy:["USD", :usd_gateway], with: :native}, "1000", "0.3" - -close_ledger diff --git a/services/horizon/internal/test/scenarios/self_send-core.sql b/services/horizon/internal/test/scenarios/self_send-core.sql deleted file mode 100644 index 9f2651d59f..0000000000 --- a/services/horizon/internal/test/scenarios/self_send-core.sql +++ /dev/null @@ -1,720 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999998999999900, 1, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 0, 3, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('70565cbcdb07a3474afb0bd50cc9f53749a6ab054bcff38aebf4b1a60666cea6', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 'd5bb5a59cee67f47da99b43c3d333751d3c837187428e58c895af0168d027e06', 2, 1559579758, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZoHUUqPO1SoXWBQWiQne6+AHcM0CVKtgN/zEmvaDE04AAAAAAXPVMbgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAEtgyinnIssW5tBeb2/tNZBp1rtCbIvdoa9kC/D9mgLzVu1pZzuZ/R9qZtDw9MzdR08g3GHQo5YyJWvAWjQJ+BgAAAAIN4Lazp2QAAAAAAAAAAABkAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('33e885d6f88e211eb098dbc05d4cf3a56c92f85633f0a51e7b18db33f5d58e34', '70565cbcdb07a3474afb0bd50cc9f53749a6ab054bcff38aebf4b1a60666cea6', '871d0618eb26d195e9f6c03329153d820c025accdc1ea86c4481238105bf6c76', 3, 1559579759, 'AAAAC3BWXLzbB6NHSvsL1QzJ9TdJpqsFS8/ziuv0saYGZs6m67Pfjw+EK4OMXU8wMlooxUujkIpFifCoolBzZKzu68EAAAAAXPVMbwAAAAAAAAAAHwHNsmRY+V05R8QcxzL6y8Pg5b8K5XPCts8of63QFDqHHQYY6ybRlen2wDMpFT2CDAJazNweqGxEgSOBBb9sdgAAAAMN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GA7ZTOPBS3ILDIN6XCF3EZSCK3JKVZHYIXSX2TAO2SS7BGQXK7FTLKU2', 2, 'AAAAAD+ZueGW0LGhvriLsmZCVtKq5PhF5X1MDtSl8JoXV8s1AAAAAAAAAAIAAAACAAAAAQAAAEigdRSo87VKhdYFBaJCd7r4AdwzQJUq2A3/MSa9oMTTgAAAAABc9UxuAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABnxczizktiNDJL1qrLgjTzrZfMnOs8iiYtGOCdLYciKoAAABAeejjtunl4apezMjsTkEWZFzR+HFBDRnDrsfXBfqKPNZdd+s+VaoXkXI0RAuQP9wFTYmyihopOHHUQPt07Qc6BA=='); -INSERT INTO scphistory VALUES ('GA7ZTOPBS3ILDIN6XCF3EZSCK3JKVZHYIXSX2TAO2SS7BGQXK7FTLKU2', 3, 'AAAAAD+ZueGW0LGhvriLsmZCVtKq5PhF5X1MDtSl8JoXV8s1AAAAAAAAAAMAAAACAAAAAQAAADDrs9+PD4Qrg4xdTzAyWijFS6OQikWJ8KiiUHNkrO7rwQAAAABc9UxvAAAAAAAAAAAAAAABnxczizktiNDJL1qrLgjTzrZfMnOs8iiYtGOCdLYciKoAAABASH4EdJQHmUuyJ4qXmp9dcuuJI+O+iWi5k7QLRi7oKQ2r7BX5ewHonGVyjThilb7IZ+H0Mqp9usrHpLRHfdSyDw=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('9f17338b392d88d0c92f5aab2e08d3ceb65f3273acf22898b4638274b61c88aa', 3, 'AAAAAQAAAAEAAAAAP5m54ZbQsaG+uIuyZkJW0qrk+EXlfUwO1KXwmhdXyzUAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '33e885d6f88e211eb098dbc05d4cf3a56c92f85633f0a51e7b18db33f5d58e34'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 3, - "currentBuckets": [ - { - "curr": "2417841b07c327a508fe84df58c8f4ab063c47fa3ffee8008510840863c439b5", - "next": { - "state": 0 - }, - "snap": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAA/mbnhltCxob64i7JmQlbSquT4ReV9TA7UpfCaF1fLNQAAAAAAAAADAAAAA58XM4s5LYjQyS9aqy4I0862XzJzrPIomLRjgnS2HIiqAAAAAQAAAJjrs9+PD4Qrg4xdTzAyWijFS6OQikWJ8KiiUHNkrO7rwQAAAABc9UxvAAAAAAAAAAEAAAAAP5m54ZbQsaG+uIuyZkJW0qrk+EXlfUwO1KXwmhdXyzUAAABAzUjGJrO9EV0Lr0qZUhdS4tXPMGIpSehcpD4W9qMcU5msroTr6RgMEdFSvJe9faiwW7AsM3DUxymL8aNnZF/JAQAAAAEAAACY67Pfjw+EK4OMXU8wMlooxUujkIpFifCoolBzZKzu68EAAAAAXPVMbwAAAAAAAAABAAAAAD+ZueGW0LGhvriLsmZCVtKq5PhF5X1MDtSl8JoXV8s1AAAAQM1IxiazvRFdC69KmVIXUuLVzzBiKUnoXKQ+FvajHFOZrK6E6+kYDBHRUryXvX2osFuwLDNw1Mcpi/GjZ2RfyQEAAABACff5DfQ8vNsGNbVuqfcEOJEttdap3b8idgpe6fpFjPNsRbSd1w2UmVCmDqTw4UrJd4H3SyHg1AOaNN4ejYp3DAAAAAA/mbnhltCxob64i7JmQlbSquT4ReV9TA7UpfCaF1fLNQAAAAAAAAADAAAAAgAAAAEAAAAw67Pfjw+EK4OMXU8wMlooxUujkIpFifCoolBzZKzu68EAAAAAXPVMbwAAAAAAAAAAAAAAAZ8XM4s5LYjQyS9aqy4I0862XzJzrPIomLRjgnS2HIiqAAAAQEh+BHSUB5lLsieKl5qfXXLriSPjvolouZO0C0Yu6CkNq+wV+XsB6Jxlco04YpW+yGfh9DKqfbrKx6S0R33Usg8AAAABcFZcvNsHo0dK+wvVDMn1N0mmqwVLz/OK6/SxpgZmzqYAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAAL68IAAAAAAAAAAAa7kvkwAAABAsWrm6a8GQsiVWFe3lswEI88Cq56ij2ztlHnqIiRwWhNBR1YMXHlNwcuICXzJ+2Sux6LQpjpLabuwDUWhHWIZAAAAAAEAAAABAAAAAQAAAAA/mbnhltCxob64i7JmQlbSquT4ReV9TA7UpfCaF1fLNQAAAAA='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('f5971def3ff08c05ce222e7d71bf43703bb98ea1f776ea73085265d35dfd42ab', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAECDzqvkQBQoNAJifPRXDoLhvtycT3lFPCQ51gkdsFHaBNWw05S/VhW0Xgkr0CBPE4NaFV2Kmcs3ZwLmib4TRrML', 'I3Tpk0m57326ml2zM5t4/ajzR3exrzO6RorVwN+UbU0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTWcAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('f5971def3ff08c05ce222e7d71bf43703bb98ea1f776ea73085265d35dfd42ab', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAAL68IAAAAAAAAAAAa7kvkwAAABAsWrm6a8GQsiVWFe3lswEI88Cq56ij2ztlHnqIiRwWhNBR1YMXHlNwcuICXzJ+2Sux6LQpjpLabuwDUWhHWIZAA==', '9Zcd7z/wjAXOIi59cb9DcDu5jqH3dupzCFJl0139QqsAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/self_send-horizon.sql b/services/horizon/internal/test/scenarios/self_send-horizon.sql deleted file mode 100644 index ef67368ac9..0000000000 --- a/services/horizon/internal/test/scenarios/self_send-horizon.sql +++ /dev/null @@ -1,944 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 2, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, false); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 12884905985, 1, 2, '{"amount": "5.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 12884905985, 2, 3, '{"amount": "5.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (3, '33e885d6f88e211eb098dbc05d4cf3a56c92f85633f0a51e7b18db33f5d58e34', '70565cbcdb07a3474afb0bd50cc9f53749a6ab054bcff38aebf4b1a60666cea6', 1, 1, '2019-06-03 16:35:59', '2019-06-03 16:36:01.088232', '2019-06-03 16:36:01.088232', 12884901888, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC3BWXLzbB6NHSvsL1QzJ9TdJpqsFS8/ziuv0saYGZs6m67Pfjw+EK4OMXU8wMlooxUujkIpFifCoolBzZKzu68EAAAAAXPVMbwAAAAAAAAAAHwHNsmRY+V05R8QcxzL6y8Pg5b8K5XPCts8of63QFDqHHQYY6ybRlen2wDMpFT2CDAJazNweqGxEgSOBBb9sdgAAAAMN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '70565cbcdb07a3474afb0bd50cc9f53749a6ab054bcff38aebf4b1a60666cea6', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 1, 1, '2019-06-03 16:35:58', '2019-06-03 16:36:01.111029', '2019-06-03 16:36:01.111029', 8589934592, 16, 1000000000000000000, 100, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZoHUUqPO1SoXWBQWiQne6+AHcM0CVKtgN/zEmvaDE04AAAAAAXPVMbgAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAEtgyinnIssW5tBeb2/tNZBp1rtCbIvdoa9kC/D9mgLzVu1pZzuZ/R9qZtDw9MzdR08g3GHQo5YyJWvAWjQJ+BgAAAAIN4Lazp2QAAAAAAAAAAABkAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:36:01.122637', '2019-06-03 16:36:01.122637', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (2, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (3, 8589938689, 1); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 3, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "amount": "5.0000000", "asset_type": "native"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (2, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (3, 8589938688, 1); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 3, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('f5971def3ff08c05ce222e7d71bf43703bb98ea1f776ea73085265d35dfd42ab', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:36:01.088382', '2019-06-03 16:36:01.088382', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAAAAAAAL68IAAAAAAAAAAAa7kvkwAAABAsWrm6a8GQsiVWFe3lswEI88Cq56ij2ztlHnqIiRwWhNBR1YMXHlNwcuICXzJ+2Sux6LQpjpLabuwDUWhHWIZAA==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{sWrm6a8GQsiVWFe3lswEI88Cq56ij2ztlHnqIiRwWhNBR1YMXHlNwcuICXzJ+2Sux6LQpjpLabuwDUWhHWIZAA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:36:01.111233', '2019-06-03 16:36:01.111233', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAECDzqvkQBQoNAJifPRXDoLhvtycT3lFPCQ51gkdsFHaBNWw05S/VhW0Xgkr0CBPE4NaFV2Kmcs3ZwLmib4TRrML', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTWcAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{g86r5EAUKDQCYnz0Vw6C4b7cnE95RTwkOdYJHbBR2gTVsNOUv1YVtF4JK9AgTxODWhVdipnLN2cC5om+E0azCw==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/self_send.rb b/services/horizon/internal/test/scenarios/self_send.rb deleted file mode 100644 index 10b945a5c1..0000000000 --- a/services/horizon/internal/test/scenarios/self_send.rb +++ /dev/null @@ -1,11 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :scott, :master, 100 - -close_ledger - -payment :scott, :scott, [:native, 5] - -close_ledger diff --git a/services/horizon/internal/test/scenarios/send_to_issuer-core.sql b/services/horizon/internal/test/scenarios/send_to_issuer-core.sql deleted file mode 100644 index 4a2a164ab0..0000000000 --- a/services/horizon/internal/test/scenarios/send_to_issuer-core.sql +++ /dev/null @@ -1,732 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999997999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 999999900, 8589934593, 0, NULL, '', 'AQAAAA==', 0, 4, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 999999800, 8589934594, 1, NULL, '', 'AQAAAA==', 0, 5, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('06030f6f83683dcf9bdb635640dfe78722024b6039706d79bed7c5e88f0f7900', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '02382d151ef8a21e92b9dd136d32b3278f152e6c0d08489733c81a728ddeb600', 2, 1559579685, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZUJe9O5kAzNzu/6p0ZJoZ88h0TDub3uYslZJ7cSsRWgAAAAAAXPVMJQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAAnQIKiwQ7y1yg69ER0rE+8ttWxjdS9dphrI7bdn6YS4COC0VHviiHpK53RNtMrMnjxUubA0ISJczyBpyjd62AAAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('2131c46d35ce48cc5530faa1c2cca5dea861afdf073056cb0f1785b3b02ca47a', '06030f6f83683dcf9bdb635640dfe78722024b6039706d79bed7c5e88f0f7900', '31682b891a5753d9a484b2bb1d788a5b7d234494c0aeb32b244e665df02854f3', 3, 1559579686, 'AAAACwYDD2+DaD3Pm9tjVkDf54ciAktgOXBteb7XxeiPD3kAfKighrk3qMITRIlaJ+sPyNXJCUM6ZSdz5viYP7GxwMQAAAAAXPVMJgAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPAxaCuJGldT2aSEsrsdeIpbfSNElMCusyskTmZd8ChU8wAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('195529e1e5ce65ca91d9cb45ceef10cfc890103386c30442388e15dcce669db5', '2131c46d35ce48cc5530faa1c2cca5dea861afdf073056cb0f1785b3b02ca47a', '3e5fae333daee3c0694efa83bb9b07cb6e50cd1667dab400ab06c654db8e788a', 4, 1559579687, 'AAAACyExxG01zkjMVTD6ocLMpd6oYa/fBzBWyw8XhbOwLKR60f9eDPaaEVCr9QNXUUec3rTFbbhr3LDTVK1g5yQbv7IAAAAAXPVMJwAAAAAAAAAANvoQ5f0h4XOu2zzdNp+2aYFizWM/TiKsCFrgq+HrV6I+X64zPa7jwGlO+oO7mwfLblDNFmfatACrBsZU2454igAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('c273671c9103f040ce157a253d39c8c1aa04e4d5e6acc6a23118e3364af540c4', '195529e1e5ce65ca91d9cb45ceef10cfc890103386c30442388e15dcce669db5', '6332ec568a94696ce7d2308992b4d1caab5eec51645898f347a988546782b7dc', 5, 1559579688, 'AAAACxlVKeHlzmXKkdnLRc7vEM/IkBAzhsMEQjiOFdzOZp21qQa11RFfEssatTTOAH9HevAS5aPVlAGmWEZ2ypQMc0gAAAAAXPVMKAAAAAAAAAAAqwSxrFb8etq4gSdxOi9F1KjbMMbBhDJdKXyKRqyFTJtjMuxWipRpbOfSMImStNHKq17sUWRYmPNHqYhUZ4K33AAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GABOVXDGD2LDZG42HP6XANUBMQXYHPNQR562ST6XPGJDU5KGLKC4GR7Z', 2, 'AAAAAALq3GYeljybmjv9cDaBZC+DvbCPfalP13mSOnVGWoXDAAAAAAAAAAIAAAACAAAAAQAAAEhQl707mQDM3O7/qnRkmhnzyHRMO5ve5iyVkntxKxFaAAAAAABc9UwlAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABjAVAnR2dAsiF8MbFoEL3xlcLge6gJKbQhaUtK/QCiMsAAABA+yjMImaqjTN7gbxEfWYKA2g4AWmrDDQpmigQfJVuwKHoQWayNqsMHMLwicHqWoC+kq3NW1Fcync8txknU2t0Dw=='); -INSERT INTO scphistory VALUES ('GABOVXDGD2LDZG42HP6XANUBMQXYHPNQR562ST6XPGJDU5KGLKC4GR7Z', 3, 'AAAAAALq3GYeljybmjv9cDaBZC+DvbCPfalP13mSOnVGWoXDAAAAAAAAAAMAAAACAAAAAQAAADB8qKCGuTeowhNEiVon6w/I1ckJQzplJ3Pm+Jg/sbHAxAAAAABc9UwmAAAAAAAAAAAAAAABjAVAnR2dAsiF8MbFoEL3xlcLge6gJKbQhaUtK/QCiMsAAABAD74BVEtdOsyybqtq9NdiRy+XnPvybJTNjNhHMC0gjbVQwvJ3LSAPtfYHwV8I/d4VfKGVBGMsQmXfASTV5Hd8Cw=='); -INSERT INTO scphistory VALUES ('GABOVXDGD2LDZG42HP6XANUBMQXYHPNQR562ST6XPGJDU5KGLKC4GR7Z', 4, 'AAAAAALq3GYeljybmjv9cDaBZC+DvbCPfalP13mSOnVGWoXDAAAAAAAAAAQAAAACAAAAAQAAADDR/14M9poRUKv1A1dRR5zetMVtuGvcsNNUrWDnJBu/sgAAAABc9UwnAAAAAAAAAAAAAAABjAVAnR2dAsiF8MbFoEL3xlcLge6gJKbQhaUtK/QCiMsAAABAxnlai+Cg6u1flmrSiP+yoI+FwBFirMft3QguMzElfagmK2YNprF1HBkZwPKMRoCzrOaU+RD505lbfnA/EL3qBg=='); -INSERT INTO scphistory VALUES ('GABOVXDGD2LDZG42HP6XANUBMQXYHPNQR562ST6XPGJDU5KGLKC4GR7Z', 5, 'AAAAAALq3GYeljybmjv9cDaBZC+DvbCPfalP13mSOnVGWoXDAAAAAAAAAAUAAAACAAAAAQAAADCpBrXVEV8Syxq1NM4Af0d68BLlo9WUAaZYRnbKlAxzSAAAAABc9UwoAAAAAAAAAAAAAAABjAVAnR2dAsiF8MbFoEL3xlcLge6gJKbQhaUtK/QCiMsAAABAQydmGb9gSXcivq5jnKNE6c5yuv00D+NRqSyHOG6qNZlmiTPMogFxkYq46B9TfjRvC9gM68EwCfwVPcEd3rD+DQ=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('8c05409d1d9d02c885f0c6c5a042f7c6570b81eea024a6d085a52d2bf40288cb', 5, 'AAAAAQAAAAEAAAAAAurcZh6WPJuaO/1wNoFkL4O9sI99qU/XeZI6dUZahcMAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', 'c273671c9103f040ce157a253d39c8c1aa04e4d5e6acc6a23118e3364af540c4'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 5, - "currentBuckets": [ - { - "curr": "8ff79124402aab6aa63c2d9b7bda83bc5b03bf4e369eaa6a5de30a9b022e9be2", - "next": { - "state": 0 - }, - "snap": "663f0003aeb37c9b7ee2f4d2eca34c1431e457cdfa20400fa0106d8eb525c19c" - }, - { - "curr": "ef31a20a398ee73ce22275ea8177786bac54656f33dcc4f3fec60d55ddf163d9", - "next": { - "state": 1, - "output": "663f0003aeb37c9b7ee2f4d2eca34c1431e457cdfa20400fa0106d8eb525c19c" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAAAC6txmHpY8m5o7/XA2gWQvg72wj32pT9d5kjp1RlqFwwAAAAAAAAAFAAAAA4wFQJ0dnQLIhfDGxaBC98ZXC4HuoCSm0IWlLSv0AojLAAAAAQAAAJipBrXVEV8Syxq1NM4Af0d68BLlo9WUAaZYRnbKlAxzSAAAAABc9UwoAAAAAAAAAAEAAAAAAurcZh6WPJuaO/1wNoFkL4O9sI99qU/XeZI6dUZahcMAAABA/RBxxQoUIhieya1fnaHDcUxhJp3fjgAWTTlrsJIbvD2GmACyssamfZbJJlVQ+wmvMt7prsyMH81NfegYNo6XAQAAAAEAAACYqQa11RFfEssatTTOAH9HevAS5aPVlAGmWEZ2ypQMc0gAAAAAXPVMKAAAAAAAAAABAAAAAALq3GYeljybmjv9cDaBZC+DvbCPfalP13mSOnVGWoXDAAAAQP0QccUKFCIYnsmtX52hw3FMYSad344AFk05a7CSG7w9hpgAsrLGpn2WySZVUPsJrzLe6a7MjB/NTX3oGDaOlwEAAABAbvpDG01oX1fttKTT89zfC38UYz2nk6ttfzcThBE4oIkeJ6LTx2+8PbkL7GtfGpX0iq5Z3Cpb0RJ5+6++9JavAgAAAAAC6txmHpY8m5o7/XA2gWQvg72wj32pT9d5kjp1RlqFwwAAAAAAAAAFAAAAAgAAAAEAAAAwqQa11RFfEssatTTOAH9HevAS5aPVlAGmWEZ2ypQMc0gAAAAAXPVMKAAAAAAAAAAAAAAAAYwFQJ0dnQLIhfDGxaBC98ZXC4HuoCSm0IWlLSv0AojLAAAAQEMnZhm/YEl3Ir6uY5yjROnOcrr9NA/jUakshzhuqjWZZokzzKIBcZGKuOgfU340bwvYDOvBMAn8FT3BHd6w/g0AAAABGVUp4eXOZcqR2ctFzu8Qz8iQEDOGwwRCOI4V3M5mnbUAAAABAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABdIdugAAAAAAAAAAAGu5L5MAAAAQJ7fL6KMtjD6elUg6OEd0ovvhbmnZNzM2qMAU8DWy7qjlknRETI1c9yaVhSrLlubyio5ExWa42fBEMMXqOA1iQYAAAABAAAAAQAAAAEAAAAAAurcZh6WPJuaO/1wNoFkL4O9sI99qU/XeZI6dUZahcMAAAAA'); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO trustlines VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 'USD', 9223372036854775807, 99900000000000, 1, 5, NULL, NULL); - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('666656a6eade2082c5780571267d9e4453eee5781ca9a58aa319eb0fe83455fd', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('0ee11ddb4817a6165f062c28273bf521d9bfedca4ea304f7bded2cb8ed422b7e', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('267d3bd55a6902624d03f3895bc91bf89cb0379b75d39e5b97dc3d448a6ee5cb', 4, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('23071d02983ad8b70733b8ee52a19745a366d71c1f7455199773e7683ddaa035', 5, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msk4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('666656a6eade2082c5780571267d9e4453eee5781ca9a58aa319eb0fe83455fd', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAAAAAABVvwF9wAAAEBdDXe23U4e9C2SxpBLZRx1rJzSFLJ0xDD0uKGpmqbflDT+XXIq6UiDBzmFxt+GO+XqFoQPdrXT7p1oLZIHqTMP', 'ZmZWpureIILFeAVxJn2eRFPu5XgcqaWKoxnrD+g0Vf0AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTU4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('0ee11ddb4817a6165f062c28273bf521d9bfedca4ea304f7bded2cb8ed422b7e', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAEAZCSSFbUKIiIThB3BIHf1u5g0vDSZQ0CD4fBA+pPqUQ/9dwSOSL+NGMZZvl2eJW02eOREjO4QVR4cIcmRmBdYN', 'DuEd20gXphZfBiwoJzv1Idm/7cpOowT3ve0suO1CK34AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTU4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLms4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'vUhtvdAtRggXZxxKWn6dboZcopy0HmLXqvcKL+5bNt4AAAAAAAAAZAAAAAAAAAABAAAAAAAAAAYAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('267d3bd55a6902624d03f3895bc91bf89cb0379b75d39e5b97dc3d448a6ee5cb', 4, 1, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAWvMQekAAAAAAAAAAAAH5kC3vAAAAQMvzjWcUe8CdwX/cl5px2TkYt672RXOFvJOTK5fK6SjBpPHGj5EIFxCRXdLAFy2K1nSkHSnIk9N2qwwQKwK1sww=', 'Jn071VppAmJNA/OJW8kb+JywN5t1055bl9w9RIpu5csAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa8xB6QAB//////////wAAAAEAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('23071d02983ad8b70733b8ee52a19745a366d71c1f7455199773e7683ddaa035', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABdIdugAAAAAAAAAAAGu5L5MAAAAQJ7fL6KMtjD6elUg6OEd0ovvhbmnZNzM2qMAU8DWy7qjlknRETI1c9yaVhSrLlubyio5ExWa42fBEMMXqOA1iQY=', 'IwcdApg62LcHM7juUqGXRaNm1xwfdFUZl3PnaD3aoDUAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa8xB6QAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa28gDWAB//////////wAAAAEAAAAAAAAAAA=='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/send_to_issuer-horizon.sql b/services/horizon/internal/test/scenarios/send_to_issuer-horizon.sql deleted file mode 100644 index 99e78b298a..0000000000 --- a/services/horizon/internal/test/scenarios/send_to_issuer-horizon.sql +++ /dev/null @@ -1,973 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO asset_stats VALUES (1, '99900000000000', 1, 0, ''); - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_accounts VALUES (2, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (3, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_assets VALUES (1, 'credit_alphanum4', 'USD', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, true); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 21474840577, 1, 2, '{"amount": "10000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 21474840577, 2, 3, '{"amount": "10000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 17179873281, 1, 2, '{"amount": "10000000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 17179873281, 2, 3, '{"amount": "10000000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 12884905985, 1, 20, '{"limit": "922337203685.4775807", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589938689, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 1, 0, '{"starting_balance": "100.0000000"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 2, 3, '{"amount": "100.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (5, 'c273671c9103f040ce157a253d39c8c1aa04e4d5e6acc6a23118e3364af540c4', '195529e1e5ce65ca91d9cb45ceef10cfc890103386c30442388e15dcce669db5', 1, 1, '2019-06-03 16:34:48', '2019-06-03 16:34:48.034469', '2019-06-03 16:34:48.034469', 21474836480, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAACxlVKeHlzmXKkdnLRc7vEM/IkBAzhsMEQjiOFdzOZp21qQa11RFfEssatTTOAH9HevAS5aPVlAGmWEZ2ypQMc0gAAAAAXPVMKAAAAAAAAAAAqwSxrFb8etq4gSdxOi9F1KjbMMbBhDJdKXyKRqyFTJtjMuxWipRpbOfSMImStNHKq17sUWRYmPNHqYhUZ4K33AAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, '195529e1e5ce65ca91d9cb45ceef10cfc890103386c30442388e15dcce669db5', '2131c46d35ce48cc5530faa1c2cca5dea861afdf073056cb0f1785b3b02ca47a', 1, 1, '2019-06-03 16:34:47', '2019-06-03 16:34:48.058219', '2019-06-03 16:34:48.058219', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAACyExxG01zkjMVTD6ocLMpd6oYa/fBzBWyw8XhbOwLKR60f9eDPaaEVCr9QNXUUec3rTFbbhr3LDTVK1g5yQbv7IAAAAAXPVMJwAAAAAAAAAANvoQ5f0h4XOu2zzdNp+2aYFizWM/TiKsCFrgq+HrV6I+X64zPa7jwGlO+oO7mwfLblDNFmfatACrBsZU2454igAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, '2131c46d35ce48cc5530faa1c2cca5dea861afdf073056cb0f1785b3b02ca47a', '06030f6f83683dcf9bdb635640dfe78722024b6039706d79bed7c5e88f0f7900', 1, 1, '2019-06-03 16:34:46', '2019-06-03 16:34:48.071406', '2019-06-03 16:34:48.071406', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACwYDD2+DaD3Pm9tjVkDf54ciAktgOXBteb7XxeiPD3kAfKighrk3qMITRIlaJ+sPyNXJCUM6ZSdz5viYP7GxwMQAAAAAXPVMJgAAAAAAAAAALLKPbMojH+RR+TSBDKGB/tufH2mL12ccCHr1Jn27yPAxaCuJGldT2aSEsrsdeIpbfSNElMCusyskTmZd8ChU8wAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '06030f6f83683dcf9bdb635640dfe78722024b6039706d79bed7c5e88f0f7900', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:34:45', '2019-06-03 16:34:48.084372', '2019-06-03 16:34:48.084373', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZUJe9O5kAzNzu/6p0ZJoZ88h0TDub3uYslZJ7cSsRWgAAAAAAXPVMJQAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAAnQIKiwQ7y1yg69ER0rE+8ttWxjdS9dphrI7bdn6YS4COC0VHviiHpK53RNtMrMnjxUubA0ISJczyBpyjd62AAAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:34:48.097798', '2019-06-03 16:34:48.097798', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (2, 21474840577, 2); -INSERT INTO history_operation_participants VALUES (3, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (4, 17179873281, 2); -INSERT INTO history_operation_participants VALUES (5, 12884905985, 2); -INSERT INTO history_operation_participants VALUES (6, 8589938689, 1); -INSERT INTO history_operation_participants VALUES (7, 8589938689, 3); -INSERT INTO history_operation_participants VALUES (8, 8589942785, 2); -INSERT INTO history_operation_participants VALUES (9, 8589942785, 3); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 9, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 1, '{"to": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "from": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "amount": "10000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 1, '{"to": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "from": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "amount": "10000000.0000000", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 6, '{"limit": "922337203685.4775807", "trustee": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "trustor": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "asset_code": "USD", "asset_type": "credit_alphanum4", "asset_issuer": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "100.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 21474840576, 2); -INSERT INTO history_transaction_participants VALUES (2, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (3, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (4, 17179873280, 2); -INSERT INTO history_transaction_participants VALUES (5, 12884905984, 2); -INSERT INTO history_transaction_participants VALUES (6, 8589938688, 3); -INSERT INTO history_transaction_participants VALUES (7, 8589938688, 1); -INSERT INTO history_transaction_participants VALUES (8, 8589942784, 3); -INSERT INTO history_transaction_participants VALUES (9, 8589942784, 2); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 9, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('23071d02983ad8b70733b8ee52a19745a366d71c1f7455199773e7683ddaa035', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:34:48.03467', '2019-06-03 16:34:48.03467', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAABdIdugAAAAAAAAAAAGu5L5MAAAAQJ7fL6KMtjD6elUg6OEd0ovvhbmnZNzM2qMAU8DWy7qjlknRETI1c9yaVhSrLlubyio5ExWa42fBEMMXqOA1iQY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAABAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJOAAAAAIAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa8xB6QAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAFAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa28gDWAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msk4AAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{nt8vooy2MPp6VSDo4R3Si++Fuadk3MzaowBTwNbLuqOWSdERMjVz3JpWFKsuW5vKKjkTFZrjZ8EQwxeo4DWJBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('267d3bd55a6902624d03f3895bc91bf89cb0379b75d39e5b97dc3d448a6ee5cb', 4, 1, 'GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4', 8589934593, 100, 1, '2019-06-03 16:34:48.058377', '2019-06-03 16:34:48.058377', 17179873280, 'AAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAWvMQekAAAAAAAAAAAAH5kC3vAAAAQMvzjWcUe8CdwX/cl5px2TkYt672RXOFvJOTK5fK6SjBpPHGj5EIFxCRXdLAFy2K1nSkHSnIk9N2qwwQKwK1sww=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAABa8xB6QAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{y/ONZxR7wJ3Bf9yXmnHZORi3rvZFc4W8k5Mrl8rpKMGk8caPkQgXEJFd0sAXLYrWdKQdKciT03arDBArArWzDA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('bd486dbdd02d460817671c4a5a7e9d6e865ca29cb41e62d7aaf70a2fee5b36de', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:34:48.07157', '2019-06-03 16:34:48.07157', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt73//////////AAAAAAAAAAGu5L5MAAAAQB9kmKW2q3v7Qfy8PMekEb1TTI5ixqkI0BogXrOt7gO162Qbkh2dSTUfeDovc0PAafhDXxthVAlsLujlBmyjBAY=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rJnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAFVU0QAAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msmcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{H2SYpbare/tB/Lw8x6QRvVNMjmLGqQjQGiBes63uA7XrZBuSHZ1JNR94Oi9zQ8Bp+ENfG2FUCWwu6OUGbKMEBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('666656a6eade2082c5780571267d9e4453eee5781ca9a58aa319eb0fe83455fd', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:34:48.084682', '2019-06-03 16:34:48.084682', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAAO5rKAAAAAAAAAAABVvwF9wAAAEBdDXe23U4e9C2SxpBLZRx1rJzSFLJ0xDD0uKGpmqbflDT+XXIq6UiDBzmFxt+GO+XqFoQPdrXT7p1oLZIHqTMP', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTU4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{XQ13tt1OHvQtksaQS2Ucdayc0hSydMQw9LihqZqm35Q0/l1yKulIgwc5hcbfhjvl6haED3a10+6daC2SB6kzDw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('0ee11ddb4817a6165f062c28273bf521d9bfedca4ea304f7bded2cb8ed422b7e', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:34:48.085002', '2019-06-03 16:34:48.085003', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAEAZCSSFbUKIiIThB3BIHf1u5g0vDSZQ0CD4fBA+pPqUQ/9dwSOSL+NGMZZvl2eJW02eOREjO4QVR4cIcmRmBdYN', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrNryTU4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrMwLms4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{GQkkhW1CiIiE4QdwSB39buYNLw0mUNAg+HwQPqT6lEP/XcEjki/jRjGWb5dniVtNnjkRIzuEFUeHCHJkZgXWDQ==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/send_to_issuer.rb b/services/horizon/internal/test/scenarios/send_to_issuer.rb deleted file mode 100644 index 963392b5f9..0000000000 --- a/services/horizon/internal/test/scenarios/send_to_issuer.rb +++ /dev/null @@ -1,20 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :usd_gateway, :master, 100 -create_account :scott, :master, 100 - -close_ledger - -trust :scott, :usd_gateway, "USD" - -close_ledger - -payment :usd_gateway, :scott, ["USD", :usd_gateway, 10_000_000] - -close_ledger - -payment :scott, :usd_gateway, ["USD", :usd_gateway, 10_000] - -close_ledger diff --git a/services/horizon/internal/test/scenarios/set_options-core.sql b/services/horizon/internal/test/scenarios/set_options-core.sql deleted file mode 100644 index 55a3b2d29d..0000000000 --- a/services/horizon/internal/test/scenarios/set_options-core.sql +++ /dev/null @@ -1,758 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - -SET search_path = public, pg_catalog; - -DROP INDEX IF EXISTS public.upgradehistbyseq; -DROP INDEX IF EXISTS public.scpquorumsbyseq; -DROP INDEX IF EXISTS public.scpenvsbyseq; -DROP INDEX IF EXISTS public.ledgersbyseq; -DROP INDEX IF EXISTS public.histfeebyseq; -DROP INDEX IF EXISTS public.histbyseq; -DROP INDEX IF EXISTS public.bestofferindex; -DROP INDEX IF EXISTS public.accountbalances; -ALTER TABLE IF EXISTS ONLY public.upgradehistory DROP CONSTRAINT IF EXISTS upgradehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txhistory DROP CONSTRAINT IF EXISTS txhistory_pkey; -ALTER TABLE IF EXISTS ONLY public.txfeehistory DROP CONSTRAINT IF EXISTS txfeehistory_pkey; -ALTER TABLE IF EXISTS ONLY public.trustlines DROP CONSTRAINT IF EXISTS trustlines_pkey; -ALTER TABLE IF EXISTS ONLY public.storestate DROP CONSTRAINT IF EXISTS storestate_pkey; -ALTER TABLE IF EXISTS ONLY public.scpquorums DROP CONSTRAINT IF EXISTS scpquorums_pkey; -ALTER TABLE IF EXISTS ONLY public.quoruminfo DROP CONSTRAINT IF EXISTS quoruminfo_pkey; -ALTER TABLE IF EXISTS ONLY public.pubsub DROP CONSTRAINT IF EXISTS pubsub_pkey; -ALTER TABLE IF EXISTS ONLY public.publishqueue DROP CONSTRAINT IF EXISTS publishqueue_pkey; -ALTER TABLE IF EXISTS ONLY public.peers DROP CONSTRAINT IF EXISTS peers_pkey; -ALTER TABLE IF EXISTS ONLY public.offers DROP CONSTRAINT IF EXISTS offers_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_pkey; -ALTER TABLE IF EXISTS ONLY public.ledgerheaders DROP CONSTRAINT IF EXISTS ledgerheaders_ledgerseq_key; -ALTER TABLE IF EXISTS ONLY public.ban DROP CONSTRAINT IF EXISTS ban_pkey; -ALTER TABLE IF EXISTS ONLY public.accounts DROP CONSTRAINT IF EXISTS accounts_pkey; -ALTER TABLE IF EXISTS ONLY public.accountdata DROP CONSTRAINT IF EXISTS accountdata_pkey; -DROP TABLE IF EXISTS public.upgradehistory; -DROP TABLE IF EXISTS public.txhistory; -DROP TABLE IF EXISTS public.txfeehistory; -DROP TABLE IF EXISTS public.trustlines; -DROP TABLE IF EXISTS public.storestate; -DROP TABLE IF EXISTS public.scpquorums; -DROP TABLE IF EXISTS public.scphistory; -DROP TABLE IF EXISTS public.quoruminfo; -DROP TABLE IF EXISTS public.pubsub; -DROP TABLE IF EXISTS public.publishqueue; -DROP TABLE IF EXISTS public.peers; -DROP TABLE IF EXISTS public.offers; -DROP TABLE IF EXISTS public.ledgerheaders; -DROP TABLE IF EXISTS public.ban; -DROP TABLE IF EXISTS public.accounts; -DROP TABLE IF EXISTS public.accountdata; -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accountdata; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accountdata ( - accountid character varying(56) NOT NULL, - dataname character varying(88) NOT NULL, - datavalue character varying(112) NOT NULL, - lastmodified integer NOT NULL -); - - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE accounts ( - accountid character varying(56) NOT NULL, - balance bigint NOT NULL, - seqnum bigint NOT NULL, - numsubentries integer NOT NULL, - inflationdest character varying(56), - homedomain character varying(44) NOT NULL, - thresholds text NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - signers text, - CONSTRAINT accounts_balance_check CHECK ((balance >= 0)), - CONSTRAINT accounts_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT accounts_numsubentries_check CHECK ((numsubentries >= 0)), - CONSTRAINT accounts_sellingliabilities_check CHECK ((sellingliabilities >= 0)) -); - - --- --- Name: ban; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ban ( - nodeid character(56) NOT NULL -); - - --- --- Name: ledgerheaders; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE ledgerheaders ( - ledgerhash character(64) NOT NULL, - prevhash character(64) NOT NULL, - bucketlisthash character(64) NOT NULL, - ledgerseq integer, - closetime bigint NOT NULL, - data text NOT NULL, - CONSTRAINT ledgerheaders_closetime_check CHECK ((closetime >= 0)), - CONSTRAINT ledgerheaders_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: offers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE offers ( - sellerid character varying(56) NOT NULL, - offerid bigint NOT NULL, - sellingasset text NOT NULL, - buyingasset text NOT NULL, - amount bigint NOT NULL, - pricen integer NOT NULL, - priced integer NOT NULL, - price double precision NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - CONSTRAINT offers_amount_check CHECK ((amount >= 0)), - CONSTRAINT offers_offerid_check CHECK ((offerid >= 0)) -); - - --- --- Name: peers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE peers ( - ip character varying(15) NOT NULL, - port integer DEFAULT 0 NOT NULL, - nextattempt timestamp without time zone NOT NULL, - numfailures integer DEFAULT 0 NOT NULL, - type integer NOT NULL, - CONSTRAINT peers_numfailures_check CHECK ((numfailures >= 0)), - CONSTRAINT peers_port_check CHECK (((port > 0) AND (port <= 65535))) -); - - --- --- Name: publishqueue; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE publishqueue ( - ledger integer NOT NULL, - state text -); - - --- --- Name: pubsub; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE pubsub ( - resid character(32) NOT NULL, - lastread integer -); - - --- --- Name: quoruminfo; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE quoruminfo ( - nodeid character(56) NOT NULL, - qsethash character(64) NOT NULL -); - - --- --- Name: scphistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scphistory ( - nodeid character(56) NOT NULL, - ledgerseq integer NOT NULL, - envelope text NOT NULL, - CONSTRAINT scphistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: scpquorums; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE scpquorums ( - qsethash character(64) NOT NULL, - lastledgerseq integer NOT NULL, - qset text NOT NULL, - CONSTRAINT scpquorums_lastledgerseq_check CHECK ((lastledgerseq >= 0)) -); - - --- --- Name: storestate; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE storestate ( - statename character(32) NOT NULL, - state text -); - - --- --- Name: trustlines; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE trustlines ( - accountid character varying(56) NOT NULL, - assettype integer NOT NULL, - issuer character varying(56) NOT NULL, - assetcode character varying(12) NOT NULL, - tlimit bigint NOT NULL, - balance bigint NOT NULL, - flags integer NOT NULL, - lastmodified integer NOT NULL, - buyingliabilities bigint, - sellingliabilities bigint, - CONSTRAINT trustlines_balance_check CHECK ((balance >= 0)), - CONSTRAINT trustlines_buyingliabilities_check CHECK ((buyingliabilities >= 0)), - CONSTRAINT trustlines_sellingliabilities_check CHECK ((sellingliabilities >= 0)), - CONSTRAINT trustlines_tlimit_check CHECK ((tlimit > 0)) -); - - --- --- Name: txfeehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txfeehistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txchanges text NOT NULL, - CONSTRAINT txfeehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: txhistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE txhistory ( - txid character(64) NOT NULL, - ledgerseq integer NOT NULL, - txindex integer NOT NULL, - txbody text NOT NULL, - txresult text NOT NULL, - txmeta text NOT NULL, - CONSTRAINT txhistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Name: upgradehistory; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE upgradehistory ( - ledgerseq integer NOT NULL, - upgradeindex integer NOT NULL, - upgrade text NOT NULL, - changes text NOT NULL, - CONSTRAINT upgradehistory_ledgerseq_check CHECK ((ledgerseq >= 0)) -); - - --- --- Data for Name: accountdata; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO accounts VALUES ('GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 999999979999999800, 2, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 10000000000, 8589934592, 0, NULL, '', 'AQAAAA==', 0, 2, NULL, NULL, NULL); -INSERT INTO accounts VALUES ('GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 9999999100, 8589934601, 0, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2', 'bnVsbHN0eWxlLmNvbQ==', 'AgACAg==', 0, 11, NULL, NULL, NULL); - - --- --- Data for Name: ban; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: ledgerheaders; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO ledgerheaders VALUES ('63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '0000000000000000000000000000000000000000000000000000000000000000', '572a2e32ff248a07b0e70fd1f6d318c1facd20b6cc08c33d5775259868125a16', 1, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1a71940fe8ae84e5f666bbf10db0e586c65994e993116ff59e41284893ae2dd2', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', '4dd933b62c503d4e71afb525f35573c6b0428d8f3e8a78c84938095a5d6778bf', 2, 1559579659, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZUeFWh3+LY3YTHkhb6t+XikT48AKVUrh+INl3MY9NNtUAAAAAXPVMCwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAwWNZfI5WyFWx2m7ToNQChYZ5zqFrwog2j0kXqQNLArtN2TO2LFA9TnGvtSXzVXPGsEKNjz6KeMhJOAlaXWd4vwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('bfbcceca2072574d4a222914d06b7d72a3c5eef2678386fce259e83803faf0ed', '1a71940fe8ae84e5f666bbf10db0e586c65994e993116ff59e41284893ae2dd2', '4fbb7252ca10db8dc5f07dea2f7dec4e225e6b461d0f572d0bc0920811007dae', 3, 1559579660, 'AAAACxpxlA/oroTl9ma78Q2w5YbGWZTpkxFv9Z5BKEiTri3S7NHzMgrBivilr5huQCflO7xm/vgO9jgiPmaTCgPqFvUAAAAAXPVMDAAAAAAAAAAAWytPxoudFtBA+XPgoX68OnSpyq0CyNJxb/gkM8zhiqJPu3JSyhDbjcXwfeovfexOIl5rRh0PVy0LwJIIEQB9rgAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1a299f3d0ad50ca8031366d768567816732458b34c38f8f7c23a91aa16295d3f', 'bfbcceca2072574d4a222914d06b7d72a3c5eef2678386fce259e83803faf0ed', 'c843fd7a6d511539411923585d48d89ad907dcd143862c6e74409178a66fb828', 4, 1559579661, 'AAAAC7+8zsogcldNSiIpFNBrfXKjxe7yZ4OG/OJZ6DgD+vDt/yKdDN/1lGUfFOt2+TZcTSpKHZxveagU6dtAgwdQGtsAAAAAXPVMDQAAAAAAAAAAa1i3djL4JG2U0qym2CMoeBxlr+vmeubZ7vGC4ngh49LIQ/16bVEVOUEZI1hdSNia2Qfc0UOGLG50QJF4pm+4KAAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('1424e4f9d3f467c4f5a4251898f5000ed7c0c194526b4502c680587f6f1ea996', '1a299f3d0ad50ca8031366d768567816732458b34c38f8f7c23a91aa16295d3f', 'a918ba7347e71f03300e58b0d87e716992495e31987dd7f02d44303a25fde5a1', 5, 1559579662, 'AAAACxopnz0K1QyoAxNm12hWeBZzJFizTDj498I6kaoWKV0/hJ8Od3RVfTUIfqvlCt+uS5GhtDPyoqy5wQudrb+OH6gAAAAAXPVMDgAAAAAAAAAAbJCOaKm2CaEJkDvk9WFgcQA3JpN23CxDI5jTyWfntcipGLpzR+cfAzAOWLDYfnFpkkleMZh91/AtRDA6Jf3loQAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('36d65ea84c2643e925dfdf1ceefdd84c35259906e8ba0ab4809ae6d656ae5f78', '1424e4f9d3f467c4f5a4251898f5000ed7c0c194526b4502c680587f6f1ea996', 'cfc5e4604dc4c79b979321ae69d81f50da6b1e18498547723a89a5fab2b0db4f', 6, 1559579663, 'AAAACxQk5PnT9GfE9aQlGJj1AA7XwMGUUmtFAsaAWH9vHqmWD9DGJ5+d5sSmI9bjNgGTXerv+WD4xP3BOPMEECCol8kAAAAAXPVMDwAAAAAAAAAAQKGf90N/CebuaXWxlpPbcziaBUE4wyo+nOmUW36ADtvPxeRgTcTHm5eTIa5p2B9Q2mseGEmFR3I6iaX6srDbTwAAAAYN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('4df17ea9d0cc9aeddc13c16dd068476ec1164301fbf46f4ee661ac7ed605a9c4', '36d65ea84c2643e925dfdf1ceefdd84c35259906e8ba0ab4809ae6d656ae5f78', 'b77215117fa4b548548f92994c5a9a6acb2262e9a361581d87e9a2f66047558a', 7, 1559579664, 'AAAACzbWXqhMJkPpJd/fHO792Ew1JZkG6LoKtICa5tZWrl943bb/FAu8h6y7ka5T43YcfrULc0N/F1jh+q5AwqlbeEUAAAAAXPVMEAAAAAAAAAAA86p35r63mMyyIdwFy/OVIQnYahLVbx+xS7RU2RGWQgC3chURf6S1SFSPkplMWppqyyJi6aNhWB2H6aL2YEdVigAAAAcN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('c45d427098c8a2f40969aea6d6a7d338cc3661e9aaf457c635213e014a3145a1', '4df17ea9d0cc9aeddc13c16dd068476ec1164301fbf46f4ee661ac7ed605a9c4', '2d137f4480e6194300de8340fc7dbf1c1ba412c758f3989ee0113d51133ea853', 8, 1559579665, 'AAAAC03xfqnQzJrt3BPBbdBoR27BFkMB+/RvTuZhrH7WBanELKSJoHCW5kbaB07wCl8VLvXu+kjqkC6gvAw6frHIMxMAAAAAXPVMEQAAAAAAAAAAJ0ts4/XYQta2CPBn5gpjCmmaaT6lvEUhsrs3yyYWo8ktE39EgOYZQwDeg0D8fb8cG6QSx1jzmJ7gET1REz6oUwAAAAgN4Lazp2QAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('28a7ec46838d03a8fe4b902231fcaaa815a9148833c2a11ed61e85a25ff54231', 'c45d427098c8a2f40969aea6d6a7d338cc3661e9aaf457c635213e014a3145a1', 'ed1bfa1ba592966993ca2bcf37f7c58fd69b34f6b9ce966548f638ce9580a59a', 9, 1559579666, 'AAAAC8RdQnCYyKL0CWmuptan0zjMNmHpqvRXxjUhPgFKMUWhqPH/M7+HU9yt899GG6Ya5NY//xUvsco3TZgMSEWFBNcAAAAAXPVMEgAAAAAAAAAAPOhxFEK89OWazUrqiNnGGEHhUviPsqFuH3eqjSDcylztG/obpZKWaZPKK88398WP1ps09rnOlmVI9jjOlYClmgAAAAkN4Lazp2QAAAAAAAAAAAOEAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('f754c3019b8d1ac1ebceeb116dd05e96f74b6cd55f30861321284e95c6e36cae', '28a7ec46838d03a8fe4b902231fcaaa815a9148833c2a11ed61e85a25ff54231', '5bb5bf7f14f3c5e4dc80ab389c4c6c88218a274a2d80cc0c917a77de6196b919', 10, 1559579667, 'AAAACyin7EaDjQOo/kuQIjH8qqgVqRSIM8KhHtYehaJf9UIxnZmwfkZsLq6DCAQYDzFs473n32zU5YcmFBI+nmdMsFMAAAAAXPVMEwAAAAAAAAAA6lRE0phahaqqFmy0QiHScS5fiHWsfSsqZJ0lki7J1+Fbtb9/FPPF5NyAqzicTGyIIYonSi2AzAyRenfeYZa5GQAAAAoN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('3679fc5ada51dd679dad07b49277b45331c929843647e38f8099bc6487b4d5f7', 'f754c3019b8d1ac1ebceeb116dd05e96f74b6cd55f30861321284e95c6e36cae', '37ef5e8103666fd8d688cfe3fb5cb100405a4100ef30d69b3d4c29758497a7c0', 11, 1559579668, 'AAAAC/dUwwGbjRrB687rEW3QXpb3S2zVXzCGEyEoTpXG42yuogRrNAKIZmlEWbVSH+okwOl06RSo2ock1dSH/MLAn54AAAAAXPVMFAAAAAAAAAAAmFwOlFqcVdyetl3vjpiXLbSMzYVia44vS0tbRk58Yzw3716BA2Zv2NaIz+P7XLEAQFpBAO8w1ps9TCl1hJenwAAAAAsN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); -INSERT INTO ledgerheaders VALUES ('9999d91f3b3fe61b50fb8dd51716d268efb2091e09493bf1833d82645f80fc91', '3679fc5ada51dd679dad07b49277b45331c929843647e38f8099bc6487b4d5f7', '96a78a7642413d1b066e3769f7a8633594703506b1d045323d664adafa30c6c3', 12, 1559579669, 'AAAACzZ5/FraUd1nna0HtJJ3tFMxySmENkfjj4CZvGSHtNX3vJ6LFe/P/b9RjvgtlTxEmPYUN/Dvo1L/PbZda52LMoMAAAAAXPVMFQAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERmWp4p2QkE9GwZuN2n3qGM1lHA1BrHQRTI9Zkra+jDGwwAAAAwN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'); - - --- --- Data for Name: offers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: peers; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: publishqueue; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: pubsub; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: quoruminfo; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: scphistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 2, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAIAAAACAAAAAQAAAEhR4VaHf4tjdhMeSFvq35eKRPjwApVSuH4g2Xcxj0021QAAAABc9UwLAAAAAgAAAAgAAAABAAAACwAAAAgAAAADAA9CQAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAOWkoWlCBSEKAbhubWguiYjml1yz5YG64fQRg1OQ8VvneRoHgWB+C9n8BijlB8D1/pSnRQn+4/VJypwC4bDQHAA=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 3, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAMAAAACAAAAAQAAADDs0fMyCsGK+KWvmG5AJ+U7vGb++A72OCI+ZpMKA+oW9QAAAABc9UwMAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABA7f4gEbgilYdOYnUHl7Yd7IG0r23f+GtPTkAGSyuH8PwvY2YASKxtpTZv90o/FzXFKnx2Qw4/ZXxSaOOdBT6bDA=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 4, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAQAAAACAAAAAQAAADD/Ip0M3/WUZR8U63b5NlxNKkodnG95qBTp20CDB1Aa2wAAAABc9UwNAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAzOTPWhZ6bVJGvQapKX5xrOQB5HkZ0aN7girYMXVuWUZkvcm8CvwAukOtel7pT4yeyMEY8ByvOV7DqZU3HzZXCQ=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 5, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAUAAAACAAAAAQAAADCEnw53dFV9NQh+q+UK365LkaG0M/KirLnBC52tv44fqAAAAABc9UwOAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAd9IaFSaICEBPzhzZkV2xIdst7yaXM9K4fgmOSYSX/6QNFS3sgRu83Hh/fbJVQjgtHkaLvRja/6I831VMCDYIAQ=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 6, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAYAAAACAAAAAQAAADAP0MYnn53mxKYj1uM2AZNd6u/5YPjE/cE48wQQIKiXyQAAAABc9UwPAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABA3OpEKIA55bFVXyEGxUruwemJrReNIp6ygr/ZroVF4dXoroOpujmCTMkpcToRPBSMjLn0IimCWvgNS08TnklYCA=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 7, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAcAAAACAAAAAQAAADDdtv8UC7yHrLuRrlPjdhx+tQtzQ38XWOH6rkDCqVt4RQAAAABc9UwQAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAFhUESlaH+mZLDB56rGlv020PM8JOz3kJl7O6Ou1I8XMm0nqY/1tiRIeV2KX19mLRm7tZbXCULiHVtbotW7pEBw=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 8, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAgAAAACAAAAAQAAADAspImgcJbmRtoHTvAKXxUu9e76SOqQLqC8DDp+scgzEwAAAABc9UwRAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABARdg7Ip+5h0d9tzVSpIt8EwWQ5VJL00b2+9tZrPbyJz0qJ88kj5EP5nWkO3dSkNiGSncrstbIWK3Y8uaps7OhBw=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 9, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAkAAAACAAAAAQAAADCo8f8zv4dT3K3z30Ybphrk1j//FS+xyjdNmAxIRYUE1wAAAABc9UwSAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABA7US+6rSsPfrtHeUzUxeexlqf6PxvyV0QvzbmFeawc+O011/rKpyK80tlUKrmZAhEuMx2efe77WdDAEaj212tAQ=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 10, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAoAAAACAAAAAQAAADCdmbB+RmwuroMIBBgPMWzjveffbNTlhyYUEj6eZ0ywUwAAAABc9UwTAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAAAtoifdy5+h4bB+uxothsEcJIrqm1F10vNFLDTClncF2pDYfVnUYwVahczROR29ZYl/vCUvBSy7Iq2XLAm7ECw=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 11, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAsAAAACAAAAAQAAADCiBGs0AohmaURZtVIf6iTA6XTpFKjahyTV1If8wsCfngAAAABc9UwUAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAOKPVxGRtzeeYuH4ugvvvRvlnm39SYAqp1HRXLRIXsEc1/ARwxuGdTAaT2k9ypVyAJ5oDf+MfpApftHzfGsQBCQ=='); -INSERT INTO scphistory VALUES ('GCP2QNWPSISONNLMBDD34GFP6OD3ZWQX4U57L5UYIKECXWO3KMLZMGEL', 12, 'AAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAAAAAAwAAAACAAAAAQAAADC8nosV78/9v1GO+C2VPESY9hQ38O+jUv89tl1rnYsygwAAAABc9UwVAAAAAAAAAAAAAAABFiPf7nlnbC1rNnYfc8WRLi8fSj6K4UqBhRglTqT5nhQAAABAZ/tC6vf3rVhC91KmJyD0n/PIGmoiF7uG52E6HIC5Wy/5nsUS26HVorjolPDGQSI5r3uCZHlm+G/IDQxvshBmDg=='); - - --- --- Data for Name: scpquorums; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO scpquorums VALUES ('1623dfee79676c2d6b36761f73c5912e2f1f4a3e8ae14a818518254ea4f99e14', 12, 'AAAAAQAAAAEAAAAAn6g2z5Ik5rVsCMe+GK/zh7zaF+U79faYQogr2dtTF5YAAAAA'); - - --- --- Data for Name: storestate; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO storestate VALUES ('databaseschema ', '10'); -INSERT INTO storestate VALUES ('networkpassphrase ', 'Test SDF Network ; September 2015'); -INSERT INTO storestate VALUES ('forcescponnextlaunch ', 'false'); -INSERT INTO storestate VALUES ('ledgerupgrades ', '{ - "time": 0, - "version": { - "has": false - }, - "fee": { - "has": false - }, - "maxtxsize": { - "has": false - }, - "reserve": { - "has": false - } -}'); -INSERT INTO storestate VALUES ('lastclosedledger ', '9999d91f3b3fe61b50fb8dd51716d268efb2091e09493bf1833d82645f80fc91'); -INSERT INTO storestate VALUES ('historyarchivestate ', '{ - "version": 1, - "server": "v11.1.0", - "currentLedger": 12, - "currentBuckets": [ - { - "curr": "056cd09fa286b2de1ff329b224259b858f94ec1dcc93f0e0512b2f6819348951", - "next": { - "state": 0 - }, - "snap": "5206372842e193b900ca87e2ddcada472702ef686523a2982d5a66b566fa5f85" - }, - { - "curr": "9456096f5d3e61c8c24d867b5f8a4295c21bf089d018c1bbe694449c92daf950", - "next": { - "state": 1, - "output": "5206372842e193b900ca87e2ddcada472702ef686523a2982d5a66b566fa5f85" - }, - "snap": "75a9441b80e08445c19c1c5b6e5fc8ebfb4be7c48cf0dded1ad147df699b2e57" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 1, - "output": "75a9441b80e08445c19c1c5b6e5fc8ebfb4be7c48cf0dded1ad147df699b2e57" - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "curr": "0000000000000000000000000000000000000000000000000000000000000000", - "next": { - "state": 0 - }, - "snap": "0000000000000000000000000000000000000000000000000000000000000000" - } - ] -}'); -INSERT INTO storestate VALUES ('lastscpdata ', 'AAAAAgAAAACfqDbPkiTmtWwIx74Yr/OHvNoX5Tv19phCiCvZ21MXlgAAAAAAAAAMAAAAAxYj3+55Z2wtazZ2H3PFkS4vH0o+iuFKgYUYJU6k+Z4UAAAAAQAAAJi8nosV78/9v1GO+C2VPESY9hQ38O+jUv89tl1rnYsygwAAAABc9UwVAAAAAAAAAAEAAAAAn6g2z5Ik5rVsCMe+GK/zh7zaF+U79faYQogr2dtTF5YAAABAGLavO6seQOZC0GnXUtBtHQy8hzh3YbhyNTylHRXb3sKz25I8ajXcTXC1hgaApparNZY/Um61cw7LmTUXQYR4AAAAAAEAAACYvJ6LFe/P/b9RjvgtlTxEmPYUN/Dvo1L/PbZda52LMoMAAAAAXPVMFQAAAAAAAAABAAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAQBi2rzurHkDmQtBp11LQbR0MvIc4d2G4cjU8pR0V297Cs9uSPGo13E1wtYYGgKaWqzWWP1JutXMOy5k1F0GEeAAAAABAW1K7ebIuDn4WKtOk7tBmZMerfVROAVVl0vbhSBHdPyRYLkRYwry5pWtupFZB1wy/zpVGH2TVUYjJRcHQw14tCAAAAACfqDbPkiTmtWwIx74Yr/OHvNoX5Tv19phCiCvZ21MXlgAAAAAAAAAMAAAAAgAAAAEAAAAwvJ6LFe/P/b9RjvgtlTxEmPYUN/Dvo1L/PbZda52LMoMAAAAAXPVMFQAAAAAAAAAAAAAAARYj3+55Z2wtazZ2H3PFkS4vH0o+iuFKgYUYJU6k+Z4UAAAAQGf7Qur3961YQvdSpicg9J/zyBpqIhe7hudhOhyAuVsv+Z7FEtuh1aK46JTwxkEiOa97gmR5ZvhvyA0Mb7IQZg4AAAABNnn8WtpR3WedrQe0kne0UzHJKYQ2R+OPgJm8ZIe01fcAAAAAAAAAAQAAAAEAAAABAAAAAJ+oNs+SJOa1bAjHvhiv84e82hflO/X2mEKIK9nbUxeWAAAAAA=='); - - --- --- Data for Name: trustlines; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: txfeehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txfeehistory VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('c76f843dd29e92bacbf21659d50454a043eae6a5ef81e2e8dc97b0e005d30962', 3, 1, 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('895b1e3ae3570fac549edfcc260122a2f930b35b94b1dffa9f8c2a08816ac376', 4, 1, 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('b0bb26bbc67cc1c226293ce18f94f9766b4e5c68132c2caff7907791d1723f27', 5, 1, 'AAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('a721bea4176539c6ed564ceafb7084a31c5deafe17ce0b52d2e2752feae47db7', 6, 1, 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('ca5cd8926d50d5f94acc074b6c966e927195571cb4977e1cb7690df84529f127', 7, 1, 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAA=='); -INSERT INTO txfeehistory VALUES ('eb4d35309591547be7fe2fb9c44834d20e4d569294088ac1a3d204d16e9a0751', 8, 1, 'AAAAAgAAAAMAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAACAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhqAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAAAAAAAAAAAA'); -INSERT INTO txfeehistory VALUES ('be85b5e14dcb9fe976a73cccc8bfac69be7ecec2126bfe5ecc551c683b43dcd7', 9, 1, 'AAAAAgAAAAMAAAAIAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+GoAAAAAgAAAAYAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAAAAAAAQAAAAkAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4UQAAAACAAAABgAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('40a8f7d6e4822bf645865d779922dcdd3b43537b993e75e7165cc84ac04e0dba', 10, 1, 'AAAAAgAAAAMAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAoAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4OAAAAACAAAABwAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFAAAAAAAAAAA='); -INSERT INTO txfeehistory VALUES ('0733db959ef871e700de41cc2074cb380da7b10262d350d0be0170488554a968', 11, 1, 'AAAAAgAAAAMAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAsAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4HwAAAACAAAACAAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAAAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFAAAAAAAAAAA='); - - --- --- Data for Name: txhistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO txhistory VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDt3KwmaPuPdFSUxdAFeb6OQetyQKIWazlbSMMhmHKNLD4sqhEqUZcQP0l+X/Op+osWmN6+FUYbsz75Q2jG4vMM', 'sqInw5xkpE/Hq9TJaBlFbwOZkG0SxHbXC0Ar/bKW1qMAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEA3xWbxPObnZMiBGFKLJQufJLguTsHJxyAsPP5F9Zj561aXnvN/HVRJbFsEcitGbgi9dWVdKRYvmVWCizIdmLID', 'Nr5w+3eC+YAc3O3BIG4h+ZKTyZhgoV5EH0dJdHoKN6sAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA==', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('c76f843dd29e92bacbf21659d50454a043eae6a5ef81e2e8dc97b0e005d30962', 3, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEC87yJlK5zXwuklcPxhmPt9HB9YOb+0HHcN2SteSVLsjnyafNu/560Mj8/QJzfSnKm3arRVJtHgFgaSFJiywRoF', 'x2+EPdKekrrL8hZZ1QRUoEPq5qXvgeLo3Jew4AXTCWIAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('895b1e3ae3570fac549edfcc260122a2f930b35b94b1dffa9f8c2a08816ac376', 4, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEALUnIdWXjDKFil8+3DPcIytdMco/BMWnrqyv9Hc/DQsGAOLHRdhdAVL/sVSxW7ITzpxY3bv11PDVlr/U5DdrgB', 'iVseOuNXD6xUnt/MJgEiovkws1uUsd/6n4wqCIFqw3YAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('b0bb26bbc67cc1c226293ce18f94f9766b4e5c68132c2caff7907791d1723f27', 5, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA9mhGRBoZe3eaPDqE6/qVEp5iFBEKjErYbUzVlrtr6cD5ttn0uGzLQsVMlEgPpB82XWa7gzTRg0OykcYE8otoAg==', 'sLsmu8Z8wcImKTzhj5T5dmtOXGgTLCyv95B3kdFyPycAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAACAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('a721bea4176539c6ed564ceafb7084a31c5deafe17ce0b52d2e2752feae47db7', 6, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAACAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAABruS+TAAAAEBE6Hv6Be+Sn9oVyHm+QedPXQwsE/U9freWjJTR8BN8qnvn6VUOzdc0U6PDQCyroLCAwh1LmK3iOmngqczf1RYG', 'pyG+pBdlOcbtVkzq+3CEoxxd6v4XzgtS0uJ1L+rkfbcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvicAAAAAIAAAADAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvicAAAAAIAAAAEAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAA=='); -INSERT INTO txhistory VALUES ('ca5cd8926d50d5f94acc074b6c966e927195571cb4977e1cb7690df84529f127', 7, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAADW51bGxzdHlsZS5jb20AAAAAAAAAAAAAAAAAAAGu5L5MAAAAQO5rla99y3m6umRBntLBh1Spdn1AzzIijQ++E3Xk8CrAhurEJ6Dv2MeK8lw6KCWOwOMGYQo65HIisANSOuvaBAc=', 'ylzYkm1Q1flKzAdLbJZuknGVVxy0l34ct2kN+EUp8ScAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAABwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAviDAAAAAIAAAAEAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAABwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAviDAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAA='); -INSERT INTO txhistory VALUES ('eb4d35309591547be7fe2fb9c44834d20e4d569294088ac1a3d204d16e9a0751', 8, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAa7kvkwAAABAyTsFJ/1kdjnOkMFPhwVKbKbgNUMVtym/khH5V677pL0kYUOCsOWWBBxA+Hq3aHyldsfdVvGdm8OyKMflFdFrDg==', '6001MJWRVHvn/i+5xEg00g5NVpKUCIrBo9IE0W6aB1EAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAACAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhqAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4agAAAACAAAABgAAAAAAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAgAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4agAAAACAAAABgAAAAAAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAIAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+GoAAAAAgAAAAYAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('be85b5e14dcb9fe976a73cccc8bfac69be7ecec2126bfe5ecc551c683b43dcd7', 9, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAa7kvkwAAABA/+toY7hGHaUzr6718ZjScST+WjFgYNU9Qse1wPqVO6U/CMVZPy6ZzimkiXFxcBc3py1BeYm3CA+YCqKrHRzABQ==', 'voW14U3Ln+l2pzzMyL+sab5+zsISa/5ezFUcaDtD3NcAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAACQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhRAAAAAIAAAAGAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAAAAAAEAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhRAAAAAIAAAAHAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAAAAAAEAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('40a8f7d6e4822bf645865d779922dcdd3b43537b993e75e7165cc84ac04e0dba', 10, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEB9KMKKASiNjFhFaahxinyc2cQQv7EAiQtBT60YRSgz4/2dANcXocCkB3EQFpeXvoXjxxJEMtEqV2NXPdByxvIO', 'QKj31uSCK/ZFhl13mSLc3TtDU3uZPnXnFlzISsBODboAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAACgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvg4AAAAAIAAAAHAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvg4AAAAAIAAAAIAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAA'); -INSERT INTO txhistory VALUES ('0733db959ef871e700de41cc2074cb380da7b10262d350d0be0170488554a968', 11, 1, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAJAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAAAAAAa7kvkwAAABA1/EWaAPOlu4RG89UlMpXLQHlk9dwMy/TLmJ7ttCT7UxJ9kSU4CbXVUG/i7yGxSrs9v8gVKLFxtTIlXlNbHb0AQ==', 'BzPblZ74cecA3kHMIHTLOA2nsQJi01DQvgFwSIVUqWgAAAAAAAAAZAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAA==', 'AAAAAQAAAAIAAAADAAAACwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvgfAAAAAIAAAAIAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAALAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+B8AAAAAgAAAAkAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvgfAAAAAIAAAAJAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAALAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+B8AAAAAgAAAAkAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAA='); - - --- --- Data for Name: upgradehistory; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO upgradehistory VALUES (2, 1, 'AAAAAQAAAAs=', 'AAAAAA=='); -INSERT INTO upgradehistory VALUES (2, 2, 'AAAAAwAPQkA=', 'AAAAAA=='); - - --- --- Name: accountdata accountdata_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accountdata - ADD CONSTRAINT accountdata_pkey PRIMARY KEY (accountid, dataname); - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (accountid); - - --- --- Name: ban ban_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ban - ADD CONSTRAINT ban_pkey PRIMARY KEY (nodeid); - - --- --- Name: ledgerheaders ledgerheaders_ledgerseq_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_ledgerseq_key UNIQUE (ledgerseq); - - --- --- Name: ledgerheaders ledgerheaders_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY ledgerheaders - ADD CONSTRAINT ledgerheaders_pkey PRIMARY KEY (ledgerhash); - - --- --- Name: offers offers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY offers - ADD CONSTRAINT offers_pkey PRIMARY KEY (offerid); - - --- --- Name: peers peers_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY peers - ADD CONSTRAINT peers_pkey PRIMARY KEY (ip, port); - - --- --- Name: publishqueue publishqueue_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY publishqueue - ADD CONSTRAINT publishqueue_pkey PRIMARY KEY (ledger); - - --- --- Name: pubsub pubsub_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY pubsub - ADD CONSTRAINT pubsub_pkey PRIMARY KEY (resid); - - --- --- Name: quoruminfo quoruminfo_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY quoruminfo - ADD CONSTRAINT quoruminfo_pkey PRIMARY KEY (nodeid); - - --- --- Name: scpquorums scpquorums_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY scpquorums - ADD CONSTRAINT scpquorums_pkey PRIMARY KEY (qsethash); - - --- --- Name: storestate storestate_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY storestate - ADD CONSTRAINT storestate_pkey PRIMARY KEY (statename); - - --- --- Name: trustlines trustlines_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY trustlines - ADD CONSTRAINT trustlines_pkey PRIMARY KEY (accountid, issuer, assetcode); - - --- --- Name: txfeehistory txfeehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txfeehistory - ADD CONSTRAINT txfeehistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: txhistory txhistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY txhistory - ADD CONSTRAINT txhistory_pkey PRIMARY KEY (ledgerseq, txindex); - - --- --- Name: upgradehistory upgradehistory_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY upgradehistory - ADD CONSTRAINT upgradehistory_pkey PRIMARY KEY (ledgerseq, upgradeindex); - - --- --- Name: accountbalances; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX accountbalances ON accounts USING btree (balance) WHERE (balance >= 1000000000); - - --- --- Name: bestofferindex; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX bestofferindex ON offers USING btree (sellingasset, buyingasset, price); - - --- --- Name: histbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histbyseq ON txhistory USING btree (ledgerseq); - - --- --- Name: histfeebyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX histfeebyseq ON txfeehistory USING btree (ledgerseq); - - --- --- Name: ledgersbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX ledgersbyseq ON ledgerheaders USING btree (ledgerseq); - - --- --- Name: scpenvsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpenvsbyseq ON scphistory USING btree (ledgerseq); - - --- --- Name: scpquorumsbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX scpquorumsbyseq ON scpquorums USING btree (lastledgerseq); - - --- --- Name: upgradehistbyseq; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX upgradehistbyseq ON upgradehistory USING btree (ledgerseq); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/set_options-horizon.sql b/services/horizon/internal/test/scenarios/set_options-horizon.sql deleted file mode 100644 index 538e3085f1..0000000000 --- a/services/horizon/internal/test/scenarios/set_options-horizon.sql +++ /dev/null @@ -1,1005 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 9.6.1 --- Dumped by pg_dump version 9.6.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; - -SET search_path = public, pg_catalog; - -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_counter_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_asset_id_fkey; -ALTER TABLE IF EXISTS ONLY public.history_trades DROP CONSTRAINT IF EXISTS history_trades_base_account_id_fkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_id_fkey; -DROP INDEX IF EXISTS public.trade_effects_by_order_book; -DROP INDEX IF EXISTS public.index_history_transactions_on_id; -DROP INDEX IF EXISTS public.index_history_operations_on_type; -DROP INDEX IF EXISTS public.index_history_operations_on_transaction_id; -DROP INDEX IF EXISTS public.index_history_operations_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_sequence; -DROP INDEX IF EXISTS public.index_history_ledgers_on_previous_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_ledger_hash; -DROP INDEX IF EXISTS public.index_history_ledgers_on_importer_version; -DROP INDEX IF EXISTS public.index_history_ledgers_on_id; -DROP INDEX IF EXISTS public.index_history_ledgers_on_closed_at; -DROP INDEX IF EXISTS public.index_history_effects_on_type; -DROP INDEX IF EXISTS public.index_history_accounts_on_id; -DROP INDEX IF EXISTS public.index_history_accounts_on_address; -DROP INDEX IF EXISTS public.htrd_time_lookup; -DROP INDEX IF EXISTS public.htrd_pid; -DROP INDEX IF EXISTS public.htrd_pair_time_lookup; -DROP INDEX IF EXISTS public.htrd_counter_lookup; -DROP INDEX IF EXISTS public.htrd_by_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_offer; -DROP INDEX IF EXISTS public.htrd_by_counter_account; -DROP INDEX IF EXISTS public.htrd_by_base_offer; -DROP INDEX IF EXISTS public.htrd_by_base_account; -DROP INDEX IF EXISTS public.htp_by_htid; -DROP INDEX IF EXISTS public.hs_transaction_by_id; -DROP INDEX IF EXISTS public.hs_ledger_by_id; -DROP INDEX IF EXISTS public.hop_by_hoid; -DROP INDEX IF EXISTS public.hist_tx_p_id; -DROP INDEX IF EXISTS public.hist_op_p_id; -DROP INDEX IF EXISTS public.hist_e_id; -DROP INDEX IF EXISTS public.hist_e_by_order; -DROP INDEX IF EXISTS public.by_ledger; -DROP INDEX IF EXISTS public.by_hash; -DROP INDEX IF EXISTS public.by_account; -DROP INDEX IF EXISTS public.asset_by_issuer; -DROP INDEX IF EXISTS public.asset_by_code; -ALTER TABLE IF EXISTS ONLY public.history_transaction_participants DROP CONSTRAINT IF EXISTS history_transaction_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_operation_participants DROP CONSTRAINT IF EXISTS history_operation_participants_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_pkey; -ALTER TABLE IF EXISTS ONLY public.history_assets DROP CONSTRAINT IF EXISTS history_assets_asset_code_asset_type_asset_issuer_key; -ALTER TABLE IF EXISTS ONLY public.gorp_migrations DROP CONSTRAINT IF EXISTS gorp_migrations_pkey; -ALTER TABLE IF EXISTS ONLY public.asset_stats DROP CONSTRAINT IF EXISTS asset_stats_pkey; -ALTER TABLE IF EXISTS public.history_transaction_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_operation_participants ALTER COLUMN id DROP DEFAULT; -ALTER TABLE IF EXISTS public.history_assets ALTER COLUMN id DROP DEFAULT; -DROP TABLE IF EXISTS public.history_transactions; -DROP SEQUENCE IF EXISTS public.history_transaction_participants_id_seq; -DROP TABLE IF EXISTS public.history_transaction_participants; -DROP TABLE IF EXISTS public.history_trades; -DROP TABLE IF EXISTS public.history_operations; -DROP SEQUENCE IF EXISTS public.history_operation_participants_id_seq; -DROP TABLE IF EXISTS public.history_operation_participants; -DROP TABLE IF EXISTS public.history_ledgers; -DROP TABLE IF EXISTS public.history_effects; -DROP SEQUENCE IF EXISTS public.history_assets_id_seq; -DROP TABLE IF EXISTS public.history_assets; -DROP TABLE IF EXISTS public.history_accounts; -DROP SEQUENCE IF EXISTS public.history_accounts_id_seq; -DROP TABLE IF EXISTS public.gorp_migrations; -DROP TABLE IF EXISTS public.asset_stats; -DROP AGGREGATE IF EXISTS public.min_price(numeric[]); -DROP AGGREGATE IF EXISTS public.max_price(numeric[]); -DROP AGGREGATE IF EXISTS public.last(anyelement); -DROP AGGREGATE IF EXISTS public.first(anyelement); -DROP FUNCTION IF EXISTS public.min_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.max_price_agg(numeric[], numeric[]); -DROP FUNCTION IF EXISTS public.last_agg(anyelement, anyelement); -DROP FUNCTION IF EXISTS public.first_agg(anyelement, anyelement); -DROP EXTENSION IF EXISTS plpgsql; -DROP SCHEMA IF EXISTS public; --- --- Name: public; Type: SCHEMA; Schema: -; Owner: - --- - -CREATE SCHEMA public; - - --- --- Name: SCHEMA public; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON SCHEMA public IS 'standard public schema'; - - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: - --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: - --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - --- --- Name: first_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION first_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $1 $_$; - - --- --- Name: last_agg(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION last_agg(anyelement, anyelement) RETURNS anyelement - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT $2 $_$; - - --- --- Name: max_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION max_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]>$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: min_price_agg(numeric[], numeric[]); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION min_price_agg(numeric[], numeric[]) RETURNS numeric[] - LANGUAGE sql IMMUTABLE STRICT - AS $_$ SELECT ( - CASE WHEN $1[1]/$1[2]<$2[1]/$2[2] THEN $1 ELSE $2 END) $_$; - - --- --- Name: first(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE first(anyelement) ( - SFUNC = first_agg, - STYPE = anyelement -); - - --- --- Name: last(anyelement); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE last(anyelement) ( - SFUNC = last_agg, - STYPE = anyelement -); - - --- --- Name: max_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE max_price(numeric[]) ( - SFUNC = max_price_agg, - STYPE = numeric[] -); - - --- --- Name: min_price(numeric[]); Type: AGGREGATE; Schema: public; Owner: - --- - -CREATE AGGREGATE min_price(numeric[]) ( - SFUNC = min_price_agg, - STYPE = numeric[] -); - - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: asset_stats; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE asset_stats ( - id bigint NOT NULL, - amount character varying NOT NULL, - num_accounts integer NOT NULL, - flags smallint NOT NULL, - toml character varying(255) NOT NULL -); - - --- --- Name: gorp_migrations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE gorp_migrations ( - id text NOT NULL, - applied_at timestamp with time zone -); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_accounts_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_accounts; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_accounts ( - id bigint DEFAULT nextval('history_accounts_id_seq'::regclass) NOT NULL, - address character varying(64) -); - - --- --- Name: history_assets; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_assets ( - id integer NOT NULL, - asset_type character varying(64) NOT NULL, - asset_code character varying(12) NOT NULL, - asset_issuer character varying(56) NOT NULL -); - - --- --- Name: history_assets_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_assets_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_assets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_assets_id_seq OWNED BY history_assets.id; - - --- --- Name: history_effects; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_effects ( - history_account_id bigint NOT NULL, - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - type integer NOT NULL, - details jsonb -); - - --- --- Name: history_ledgers; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_ledgers ( - sequence integer NOT NULL, - ledger_hash character varying(64) NOT NULL, - previous_ledger_hash character varying(64), - transaction_count integer DEFAULT 0 NOT NULL, - operation_count integer DEFAULT 0 NOT NULL, - closed_at timestamp without time zone NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - importer_version integer DEFAULT 1 NOT NULL, - total_coins bigint NOT NULL, - fee_pool bigint NOT NULL, - base_fee integer NOT NULL, - base_reserve integer NOT NULL, - max_tx_set_size integer NOT NULL, - protocol_version integer DEFAULT 0 NOT NULL, - ledger_header text, - successful_transaction_count integer, - failed_transaction_count integer -); - - --- --- Name: history_operation_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operation_participants ( - id integer NOT NULL, - history_operation_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_operation_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_operation_participants_id_seq OWNED BY history_operation_participants.id; - - --- --- Name: history_operations; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_operations ( - id bigint NOT NULL, - transaction_id bigint NOT NULL, - application_order integer NOT NULL, - type integer NOT NULL, - details jsonb, - source_account character varying(64) DEFAULT ''::character varying NOT NULL -); - - --- --- Name: history_trades; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_trades ( - history_operation_id bigint NOT NULL, - "order" integer NOT NULL, - ledger_closed_at timestamp without time zone NOT NULL, - offer_id bigint NOT NULL, - base_account_id bigint NOT NULL, - base_asset_id bigint NOT NULL, - base_amount bigint NOT NULL, - counter_account_id bigint NOT NULL, - counter_asset_id bigint NOT NULL, - counter_amount bigint NOT NULL, - base_is_seller boolean, - price_n bigint, - price_d bigint, - base_offer_id bigint, - counter_offer_id bigint, - CONSTRAINT history_trades_base_amount_check CHECK ((base_amount > 0)), - CONSTRAINT history_trades_check CHECK ((base_asset_id < counter_asset_id)), - CONSTRAINT history_trades_counter_amount_check CHECK ((counter_amount > 0)) -); - - --- --- Name: history_transaction_participants; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transaction_participants ( - id integer NOT NULL, - history_transaction_id bigint NOT NULL, - history_account_id bigint NOT NULL -); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE; Schema: public; Owner: - --- - -CREATE SEQUENCE history_transaction_participants_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - --- - -ALTER SEQUENCE history_transaction_participants_id_seq OWNED BY history_transaction_participants.id; - - --- --- Name: history_transactions; Type: TABLE; Schema: public; Owner: - --- - -CREATE TABLE history_transactions ( - transaction_hash character varying(64) NOT NULL, - ledger_sequence integer NOT NULL, - application_order integer NOT NULL, - account character varying(64) NOT NULL, - account_sequence bigint NOT NULL, - max_fee integer NOT NULL, - operation_count integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, - id bigint, - tx_envelope text NOT NULL, - tx_result text NOT NULL, - tx_meta text NOT NULL, - tx_fee_meta text NOT NULL, - signatures character varying(96)[] DEFAULT '{}'::character varying[] NOT NULL, - memo_type character varying DEFAULT 'none'::character varying NOT NULL, - memo character varying, - time_bounds int8range, - successful boolean, - fee_charged integer -); - - --- --- Name: history_assets id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets ALTER COLUMN id SET DEFAULT nextval('history_assets_id_seq'::regclass); - - --- --- Name: history_operation_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants ALTER COLUMN id SET DEFAULT nextval('history_operation_participants_id_seq'::regclass); - - --- --- Name: history_transaction_participants id; Type: DEFAULT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants ALTER COLUMN id SET DEFAULT nextval('history_transaction_participants_id_seq'::regclass); - - --- --- Data for Name: asset_stats; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: gorp_migrations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO gorp_migrations VALUES ('1_initial_schema.sql', '2019-06-03 18:28:47.032496+02'); -INSERT INTO gorp_migrations VALUES ('2_index_participants_by_toid.sql', '2019-06-03 18:28:47.039657+02'); -INSERT INTO gorp_migrations VALUES ('3_use_sequence_in_history_accounts.sql', '2019-06-03 18:28:47.044048+02'); -INSERT INTO gorp_migrations VALUES ('4_add_protocol_version.sql', '2019-06-03 18:28:47.054532+02'); -INSERT INTO gorp_migrations VALUES ('5_create_trades_table.sql', '2019-06-03 18:28:47.063028+02'); -INSERT INTO gorp_migrations VALUES ('6_create_assets_table.sql', '2019-06-03 18:28:47.068415+02'); -INSERT INTO gorp_migrations VALUES ('7_modify_trades_table.sql', '2019-06-03 18:28:47.081625+02'); -INSERT INTO gorp_migrations VALUES ('8_create_asset_stats_table.sql', '2019-06-03 18:28:47.087463+02'); -INSERT INTO gorp_migrations VALUES ('8_add_aggregators.sql', '2019-06-03 18:28:47.090109+02'); -INSERT INTO gorp_migrations VALUES ('9_add_header_xdr.sql', '2019-06-03 18:28:47.092718+02'); -INSERT INTO gorp_migrations VALUES ('10_add_trades_price.sql', '2019-06-03 18:28:47.095973+02'); -INSERT INTO gorp_migrations VALUES ('11_add_trades_account_index.sql', '2019-06-03 18:28:47.099698+02'); -INSERT INTO gorp_migrations VALUES ('12_asset_stats_amount_string.sql', '2019-06-03 18:28:47.107549+02'); -INSERT INTO gorp_migrations VALUES ('13_trade_offer_ids.sql', '2019-06-03 18:28:47.112768+02'); -INSERT INTO gorp_migrations VALUES ('14_fix_asset_toml_field.sql', '2019-06-03 18:28:47.115116+02'); -INSERT INTO gorp_migrations VALUES ('15_ledger_failed_txs.sql', '2019-06-03 18:28:47.116796+02'); -INSERT INTO gorp_migrations VALUES ('16_ingest_failed_transactions.sql', '2019-06-03 18:28:47.117989+02'); -INSERT INTO gorp_migrations VALUES ('17_transaction_fee_paid.sql', '2019-06-03 18:28:47.120034+02'); - - --- --- Data for Name: history_accounts; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_accounts VALUES (1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_accounts VALUES (2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_accounts VALUES (3, 'GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2'); - - --- --- Name: history_accounts_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_accounts_id_seq', 3, true); - - --- --- Data for Name: history_assets; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Name: history_assets_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_assets_id_seq', 1, false); - - --- --- Data for Name: history_effects; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_effects VALUES (1, 47244644353, 1, 12, '{"weight": 2, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 47244644353, 2, 11, '{"public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 42949677057, 1, 6, '{"auth_required_flag": false}'); -INSERT INTO history_effects VALUES (1, 38654709761, 1, 12, '{"weight": 2, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 38654709761, 2, 12, '{"weight": 5, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 34359742465, 1, 12, '{"weight": 2, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 34359742465, 2, 10, '{"weight": 1, "public_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4"}'); -INSERT INTO history_effects VALUES (1, 30064775169, 1, 5, '{"home_domain": "nullstyle.com"}'); -INSERT INTO history_effects VALUES (1, 25769807873, 1, 4, '{"low_threshold": 0, "med_threshold": 2, "high_threshold": 2}'); -INSERT INTO history_effects VALUES (1, 21474840577, 1, 12, '{"weight": 2, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (1, 17179873281, 1, 6, '{"auth_required_flag": true}'); -INSERT INTO history_effects VALUES (1, 12884905985, 1, 7, '{"inflation_destination": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (2, 8589938689, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (1, 8589938689, 3, 10, '{"weight": 1, "public_key": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 1, 0, '{"starting_balance": "1000.0000000"}'); -INSERT INTO history_effects VALUES (2, 8589942785, 2, 3, '{"amount": "1000.0000000", "asset_type": "native"}'); -INSERT INTO history_effects VALUES (3, 8589942785, 3, 10, '{"weight": 1, "public_key": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"}'); - - --- --- Data for Name: history_ledgers; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_ledgers VALUES (12, '9999d91f3b3fe61b50fb8dd51716d268efb2091e09493bf1833d82645f80fc91', '3679fc5ada51dd679dad07b49277b45331c929843647e38f8099bc6487b4d5f7', 0, 0, '2019-06-03 16:34:29', '2019-06-03 16:34:22.128698', '2019-06-03 16:34:22.128698', 51539607552, 16, 1000000000000000000, 1100, 100, 100000000, 1000000, 11, 'AAAACzZ5/FraUd1nna0HtJJ3tFMxySmENkfjj4CZvGSHtNX3vJ6LFe/P/b9RjvgtlTxEmPYUN/Dvo1L/PbZda52LMoMAAAAAXPVMFQAAAAAAAAAA3z9hmASpL9tAVxktxD3XSOp3itxSvEmM6AUkwBS4ERmWp4p2QkE9GwZuN2n3qGM1lHA1BrHQRTI9Zkra+jDGwwAAAAwN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); -INSERT INTO history_ledgers VALUES (11, '3679fc5ada51dd679dad07b49277b45331c929843647e38f8099bc6487b4d5f7', 'f754c3019b8d1ac1ebceeb116dd05e96f74b6cd55f30861321284e95c6e36cae', 1, 1, '2019-06-03 16:34:28', '2019-06-03 16:34:22.1378', '2019-06-03 16:34:22.1378', 47244640256, 16, 1000000000000000000, 1100, 100, 100000000, 1000000, 11, 'AAAAC/dUwwGbjRrB687rEW3QXpb3S2zVXzCGEyEoTpXG42yuogRrNAKIZmlEWbVSH+okwOl06RSo2ock1dSH/MLAn54AAAAAXPVMFAAAAAAAAAAAmFwOlFqcVdyetl3vjpiXLbSMzYVia44vS0tbRk58Yzw3716BA2Zv2NaIz+P7XLEAQFpBAO8w1ps9TCl1hJenwAAAAAsN4Lazp2QAAAAAAAAAAARMAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (10, 'f754c3019b8d1ac1ebceeb116dd05e96f74b6cd55f30861321284e95c6e36cae', '28a7ec46838d03a8fe4b902231fcaaa815a9148833c2a11ed61e85a25ff54231', 1, 1, '2019-06-03 16:34:27', '2019-06-03 16:34:22.153377', '2019-06-03 16:34:22.153378', 42949672960, 16, 1000000000000000000, 1000, 100, 100000000, 1000000, 11, 'AAAACyin7EaDjQOo/kuQIjH8qqgVqRSIM8KhHtYehaJf9UIxnZmwfkZsLq6DCAQYDzFs473n32zU5YcmFBI+nmdMsFMAAAAAXPVMEwAAAAAAAAAA6lRE0phahaqqFmy0QiHScS5fiHWsfSsqZJ0lki7J1+Fbtb9/FPPF5NyAqzicTGyIIYonSi2AzAyRenfeYZa5GQAAAAoN4Lazp2QAAAAAAAAAAAPoAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (9, '28a7ec46838d03a8fe4b902231fcaaa815a9148833c2a11ed61e85a25ff54231', 'c45d427098c8a2f40969aea6d6a7d338cc3661e9aaf457c635213e014a3145a1', 1, 1, '2019-06-03 16:34:26', '2019-06-03 16:34:22.167393', '2019-06-03 16:34:22.167393', 38654705664, 16, 1000000000000000000, 900, 100, 100000000, 1000000, 11, 'AAAAC8RdQnCYyKL0CWmuptan0zjMNmHpqvRXxjUhPgFKMUWhqPH/M7+HU9yt899GG6Ya5NY//xUvsco3TZgMSEWFBNcAAAAAXPVMEgAAAAAAAAAAPOhxFEK89OWazUrqiNnGGEHhUviPsqFuH3eqjSDcylztG/obpZKWaZPKK88398WP1ps09rnOlmVI9jjOlYClmgAAAAkN4Lazp2QAAAAAAAAAAAOEAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (8, 'c45d427098c8a2f40969aea6d6a7d338cc3661e9aaf457c635213e014a3145a1', '4df17ea9d0cc9aeddc13c16dd068476ec1164301fbf46f4ee661ac7ed605a9c4', 1, 1, '2019-06-03 16:34:25', '2019-06-03 16:34:22.179875', '2019-06-03 16:34:22.179875', 34359738368, 16, 1000000000000000000, 800, 100, 100000000, 1000000, 11, 'AAAAC03xfqnQzJrt3BPBbdBoR27BFkMB+/RvTuZhrH7WBanELKSJoHCW5kbaB07wCl8VLvXu+kjqkC6gvAw6frHIMxMAAAAAXPVMEQAAAAAAAAAAJ0ts4/XYQta2CPBn5gpjCmmaaT6lvEUhsrs3yyYWo8ktE39EgOYZQwDeg0D8fb8cG6QSx1jzmJ7gET1REz6oUwAAAAgN4Lazp2QAAAAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (7, '4df17ea9d0cc9aeddc13c16dd068476ec1164301fbf46f4ee661ac7ed605a9c4', '36d65ea84c2643e925dfdf1ceefdd84c35259906e8ba0ab4809ae6d656ae5f78', 1, 1, '2019-06-03 16:34:24', '2019-06-03 16:34:22.190748', '2019-06-03 16:34:22.190748', 30064771072, 16, 1000000000000000000, 700, 100, 100000000, 1000000, 11, 'AAAACzbWXqhMJkPpJd/fHO792Ew1JZkG6LoKtICa5tZWrl943bb/FAu8h6y7ka5T43YcfrULc0N/F1jh+q5AwqlbeEUAAAAAXPVMEAAAAAAAAAAA86p35r63mMyyIdwFy/OVIQnYahLVbx+xS7RU2RGWQgC3chURf6S1SFSPkplMWppqyyJi6aNhWB2H6aL2YEdVigAAAAcN4Lazp2QAAAAAAAAAAAK8AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (6, '36d65ea84c2643e925dfdf1ceefdd84c35259906e8ba0ab4809ae6d656ae5f78', '1424e4f9d3f467c4f5a4251898f5000ed7c0c194526b4502c680587f6f1ea996', 1, 1, '2019-06-03 16:34:23', '2019-06-03 16:34:22.205422', '2019-06-03 16:34:22.205422', 25769803776, 16, 1000000000000000000, 600, 100, 100000000, 1000000, 11, 'AAAACxQk5PnT9GfE9aQlGJj1AA7XwMGUUmtFAsaAWH9vHqmWD9DGJ5+d5sSmI9bjNgGTXerv+WD4xP3BOPMEECCol8kAAAAAXPVMDwAAAAAAAAAAQKGf90N/CebuaXWxlpPbcziaBUE4wyo+nOmUW36ADtvPxeRgTcTHm5eTIa5p2B9Q2mseGEmFR3I6iaX6srDbTwAAAAYN4Lazp2QAAAAAAAAAAAJYAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (5, '1424e4f9d3f467c4f5a4251898f5000ed7c0c194526b4502c680587f6f1ea996', '1a299f3d0ad50ca8031366d768567816732458b34c38f8f7c23a91aa16295d3f', 1, 1, '2019-06-03 16:34:22', '2019-06-03 16:34:22.220751', '2019-06-03 16:34:22.220751', 21474836480, 16, 1000000000000000000, 500, 100, 100000000, 1000000, 11, 'AAAACxopnz0K1QyoAxNm12hWeBZzJFizTDj498I6kaoWKV0/hJ8Od3RVfTUIfqvlCt+uS5GhtDPyoqy5wQudrb+OH6gAAAAAXPVMDgAAAAAAAAAAbJCOaKm2CaEJkDvk9WFgcQA3JpN23CxDI5jTyWfntcipGLpzR+cfAzAOWLDYfnFpkkleMZh91/AtRDA6Jf3loQAAAAUN4Lazp2QAAAAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (4, '1a299f3d0ad50ca8031366d768567816732458b34c38f8f7c23a91aa16295d3f', 'bfbcceca2072574d4a222914d06b7d72a3c5eef2678386fce259e83803faf0ed', 1, 1, '2019-06-03 16:34:21', '2019-06-03 16:34:22.234906', '2019-06-03 16:34:22.234906', 17179869184, 16, 1000000000000000000, 400, 100, 100000000, 1000000, 11, 'AAAAC7+8zsogcldNSiIpFNBrfXKjxe7yZ4OG/OJZ6DgD+vDt/yKdDN/1lGUfFOt2+TZcTSpKHZxveagU6dtAgwdQGtsAAAAAXPVMDQAAAAAAAAAAa1i3djL4JG2U0qym2CMoeBxlr+vmeubZ7vGC4ngh49LIQ/16bVEVOUEZI1hdSNia2Qfc0UOGLG50QJF4pm+4KAAAAAQN4Lazp2QAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (3, 'bfbcceca2072574d4a222914d06b7d72a3c5eef2678386fce259e83803faf0ed', '1a71940fe8ae84e5f666bbf10db0e586c65994e993116ff59e41284893ae2dd2', 1, 1, '2019-06-03 16:34:20', '2019-06-03 16:34:22.248526', '2019-06-03 16:34:22.248527', 12884901888, 16, 1000000000000000000, 300, 100, 100000000, 1000000, 11, 'AAAACxpxlA/oroTl9ma78Q2w5YbGWZTpkxFv9Z5BKEiTri3S7NHzMgrBivilr5huQCflO7xm/vgO9jgiPmaTCgPqFvUAAAAAXPVMDAAAAAAAAAAAWytPxoudFtBA+XPgoX68OnSpyq0CyNJxb/gkM8zhiqJPu3JSyhDbjcXwfeovfexOIl5rRh0PVy0LwJIIEQB9rgAAAAMN4Lazp2QAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 1, 0); -INSERT INTO history_ledgers VALUES (2, '1a71940fe8ae84e5f666bbf10db0e586c65994e993116ff59e41284893ae2dd2', '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', 2, 2, '2019-06-03 16:34:19', '2019-06-03 16:34:22.259472', '2019-06-03 16:34:22.259472', 8589934592, 16, 1000000000000000000, 200, 100, 100000000, 1000000, 11, 'AAAAC2PZj1Nu5o0bJ7W4nyOvUxG3Vpok+vFAOtC1K2M7B76ZUeFWh3+LY3YTHkhb6t+XikT48AKVUrh+INl3MY9NNtUAAAAAXPVMCwAAAAIAAAAIAAAAAQAAAAsAAAAIAAAAAwAPQkAAAAAAwWNZfI5WyFWx2m7ToNQChYZ5zqFrwog2j0kXqQNLArtN2TO2LFA9TnGvtSXzVXPGsEKNjz6KeMhJOAlaXWd4vwAAAAIN4Lazp2QAAAAAAAAAAADIAAAAAAAAAAAAAAAAAAAAZAX14QAAD0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 2, 0); -INSERT INTO history_ledgers VALUES (1, '63d98f536ee68d1b27b5b89f23af5311b7569a24faf1403ad0b52b633b07be99', NULL, 0, 0, '1970-01-01 00:00:00', '2019-06-03 16:34:22.272299', '2019-06-03 16:34:22.272299', 4294967296, 16, 1000000000000000000, 0, 100, 100000000, 100, 0, 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXKi4y/ySKB7DnD9H20xjB+s0gtswIwz1XdSWYaBJaFgAAAAEN4Lazp2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAX14QAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 0, 0); - - --- --- Data for Name: history_operation_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operation_participants VALUES (1, 47244644353, 1); -INSERT INTO history_operation_participants VALUES (2, 42949677057, 1); -INSERT INTO history_operation_participants VALUES (3, 38654709761, 1); -INSERT INTO history_operation_participants VALUES (4, 34359742465, 1); -INSERT INTO history_operation_participants VALUES (5, 30064775169, 1); -INSERT INTO history_operation_participants VALUES (6, 25769807873, 1); -INSERT INTO history_operation_participants VALUES (7, 21474840577, 1); -INSERT INTO history_operation_participants VALUES (8, 17179873281, 1); -INSERT INTO history_operation_participants VALUES (9, 12884905985, 1); -INSERT INTO history_operation_participants VALUES (10, 8589938689, 2); -INSERT INTO history_operation_participants VALUES (11, 8589938689, 1); -INSERT INTO history_operation_participants VALUES (12, 8589942785, 3); -INSERT INTO history_operation_participants VALUES (13, 8589942785, 2); - - --- --- Name: history_operation_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_operation_participants_id_seq', 13, true); - - --- --- Data for Name: history_operations; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_operations VALUES (47244644353, 47244644352, 1, 5, '{"signer_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "signer_weight": 0}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (42949677057, 42949677056, 1, 5, '{"clear_flags": [1], "clear_flags_s": ["auth_required"]}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (38654709761, 38654709760, 1, 5, '{"signer_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "signer_weight": 5}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (34359742465, 34359742464, 1, 5, '{"signer_key": "GC23QF2HUE52AMXUFUH3AYJAXXGXXV2VHXYYR6EYXETPKDXZSAW67XO4", "signer_weight": 1}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (30064775169, 30064775168, 1, 5, '{"home_domain": "nullstyle.com"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (25769807873, 25769807872, 1, 5, '{"low_threshold": 0, "med_threshold": 2, "high_threshold": 2}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (21474840577, 21474840576, 1, 5, '{"master_key_weight": 2}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (17179873281, 17179873280, 1, 5, '{"set_flags": [1], "set_flags_s": ["auth_required"]}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (12884905985, 12884905984, 1, 5, '{"inflation_dest": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"}', 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU'); -INSERT INTO history_operations VALUES (8589938689, 8589938688, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); -INSERT INTO history_operations VALUES (8589942785, 8589942784, 1, 0, '{"funder": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "account": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "starting_balance": "1000.0000000"}', 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H'); - - --- --- Data for Name: history_trades; Type: TABLE DATA; Schema: public; Owner: - --- - - - --- --- Data for Name: history_transaction_participants; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transaction_participants VALUES (1, 47244644352, 1); -INSERT INTO history_transaction_participants VALUES (2, 42949677056, 1); -INSERT INTO history_transaction_participants VALUES (3, 38654709760, 1); -INSERT INTO history_transaction_participants VALUES (4, 34359742464, 1); -INSERT INTO history_transaction_participants VALUES (5, 30064775168, 1); -INSERT INTO history_transaction_participants VALUES (6, 25769807872, 1); -INSERT INTO history_transaction_participants VALUES (7, 21474840576, 1); -INSERT INTO history_transaction_participants VALUES (8, 17179873280, 1); -INSERT INTO history_transaction_participants VALUES (9, 12884905984, 1); -INSERT INTO history_transaction_participants VALUES (10, 8589938688, 2); -INSERT INTO history_transaction_participants VALUES (11, 8589938688, 1); -INSERT INTO history_transaction_participants VALUES (12, 8589942784, 2); -INSERT INTO history_transaction_participants VALUES (13, 8589942784, 3); - - --- --- Name: history_transaction_participants_id_seq; Type: SEQUENCE SET; Schema: public; Owner: - --- - -SELECT pg_catalog.setval('history_transaction_participants_id_seq', 13, true); - - --- --- Data for Name: history_transactions; Type: TABLE DATA; Schema: public; Owner: - --- - -INSERT INTO history_transactions VALUES ('0733db959ef871e700de41cc2074cb380da7b10262d350d0be0170488554a968', 11, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934601, 100, 1, '2019-06-03 16:34:22.137982', '2019-06-03 16:34:22.137982', 47244644352, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAJAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAAAAAAAAAAAAa7kvkwAAABA1/EWaAPOlu4RG89UlMpXLQHlk9dwMy/TLmJ7ttCT7UxJ9kSU4CbXVUG/i7yGxSrs9v8gVKLFxtTIlXlNbHb0AQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAACwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvgfAAAAAIAAAAIAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAALAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+B8AAAAAgAAAAkAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvgfAAAAAIAAAAJAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAALAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+B8AAAAAgAAAAkAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAsAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4HwAAAACAAAACAAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAAAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFAAAAAAAAAAA=', '{1/EWaAPOlu4RG89UlMpXLQHlk9dwMy/TLmJ7ttCT7UxJ9kSU4CbXVUG/i7yGxSrs9v8gVKLFxtTIlXlNbHb0AQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('40a8f7d6e4822bf645865d779922dcdd3b43537b993e75e7165cc84ac04e0dba', 10, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934600, 100, 1, '2019-06-03 16:34:22.153528', '2019-06-03 16:34:22.153528', 42949677056, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEB9KMKKASiNjFhFaahxinyc2cQQv7EAiQtBT60YRSgz4/2dANcXocCkB3EQFpeXvoXjxxJEMtEqV2NXPdByxvIO', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAACgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvg4AAAAAIAAAAHAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvg4AAAAAIAAAAIAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAAAAAAEAAAAKAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+DgAAAAAgAAAAgAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAA', 'AAAAAgAAAAMAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAAAAAAAQAAAAoAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4OAAAAACAAAABwAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAAFAAAAAAAAAAA=', '{fSjCigEojYxYRWmocYp8nNnEEL+xAIkLQU+tGEUoM+P9nQDXF6HApAdxEBaXl76F48cSRDLRKldjVz3QcsbyDg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('be85b5e14dcb9fe976a73cccc8bfac69be7ecec2126bfe5ecc551c683b43dcd7', 9, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934599, 100, 1, '2019-06-03 16:34:22.167635', '2019-06-03 16:34:22.167635', 38654709760, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAHAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAUAAAAAAAAAAa7kvkwAAABA/+toY7hGHaUzr6718ZjScST+WjFgYNU9Qse1wPqVO6U/CMVZPy6ZzimkiXFxcBc3py1BeYm3CA+YCqKrHRzABQ==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAACQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhRAAAAAIAAAAGAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAAAAAAEAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAAAAAAAQAAAAIAAAADAAAACQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhRAAAAAIAAAAHAAAAAQAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAAAAAAEAAAAJAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+FEAAAAAgAAAAcAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAABQAAAAAAAAAA', 'AAAAAgAAAAMAAAAIAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+GoAAAAAgAAAAYAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAAAAAAAQAAAAkAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4UQAAAACAAAABgAAAAEAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAEAAAAAtbgXR6E7oDL0LQ+wYSC9zXvXVT3xiPiYuSb1DvmQLe8AAAABAAAAAAAAAAA=', '{/+toY7hGHaUzr6718ZjScST+WjFgYNU9Qse1wPqVO6U/CMVZPy6ZzimkiXFxcBc3py1BeYm3CA+YCqKrHRzABQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('eb4d35309591547be7fe2fb9c44834d20e4d569294088ac1a3d204d16e9a0751', 8, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934598, 100, 1, '2019-06-03 16:34:22.180221', '2019-06-03 16:34:22.180221', 34359742464, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAC1uBdHoTugMvQtD7BhIL3Ne9dVPfGI+Ji5JvUO+ZAt7wAAAAEAAAAAAAAAAa7kvkwAAABAyTsFJ/1kdjnOkMFPhwVKbKbgNUMVtym/khH5V677pL0kYUOCsOWWBBxA+Hq3aHyldsfdVvGdm8OyKMflFdFrDg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAACAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhqAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAAAAAAAAAAAAAAAAAQAAAAgAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4agAAAACAAAABgAAAAAAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAgAAAAAAAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAAlQL4agAAAACAAAABgAAAAAAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAA1udWxsc3R5bGUuY29tAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAIAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+GoAAAAAgAAAAYAAAABAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAABAAAAALW4F0ehO6Ay9C0PsGEgvc1711U98Yj4mLkm9Q75kC3vAAAAAQAAAAAAAAAA', 'AAAAAgAAAAMAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAACAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvhqAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAADW51bGxzdHlsZS5jb20AAAACAAICAAAAAAAAAAAAAAAA', '{yTsFJ/1kdjnOkMFPhwVKbKbgNUMVtym/khH5V677pL0kYUOCsOWWBBxA+Hq3aHyldsfdVvGdm8OyKMflFdFrDg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('ca5cd8926d50d5f94acc074b6c966e927195571cb4977e1cb7690df84529f127', 7, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934597, 100, 1, '2019-06-03 16:34:22.190953', '2019-06-03 16:34:22.190954', 30064775168, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAFAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAADW51bGxzdHlsZS5jb20AAAAAAAAAAAAAAAAAAAGu5L5MAAAAQO5rla99y3m6umRBntLBh1Spdn1AzzIijQ++E3Xk8CrAhurEJ6Dv2MeK8lw6KCWOwOMGYQo65HIisANSOuvaBAc=', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAviDAAAAAIAAAAEAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAABwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAviDAAAAAIAAAAFAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAgIAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAUAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAANbnVsbHN0eWxlLmNvbQAAAAIAAgIAAAAAAAAAAAAAAAA=', 'AAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAAAAAAEAAAAHAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+IMAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAA==', '{7muVr33Lebq6ZEGe0sGHVKl2fUDPMiKND74TdeTwKsCG6sQnoO/Yx4ryXDooJY7A4wZhCjrkciKwA1I669oEBw==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('a721bea4176539c6ed564ceafb7084a31c5deafe17ce0b52d2e2752feae47db7', 6, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934596, 100, 1, '2019-06-03 16:34:22.205701', '2019-06-03 16:34:22.205701', 25769807872, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAAEAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAACAAAAAQAAAAIAAAAAAAAAAAAAAAAAAAABruS+TAAAAEBE6Hv6Be+Sn9oVyHm+QedPXQwsE/U9freWjJTR8BN8qnvn6VUOzdc0U6PDQCyroLCAwh1LmK3iOmngqczf1RYG', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvicAAAAAIAAAADAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvicAAAAAIAAAAEAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAQAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgACAgAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAEAAAAGAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+JwAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAA==', '{ROh7+gXvkp/aFch5vkHnT10MLBP1PX63loyU0fATfKp75+lVDs3XNFOjw0Asq6CwgMIdS5it4jpp4KnM39UWBg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b0bb26bbc67cc1c226293ce18f94f9766b4e5c68132c2caff7907791d1723f27', 5, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934595, 100, 1, '2019-06-03 16:34:22.220908', '2019-06-03 16:34:22.220908', 21474840576, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAADAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa7kvkwAAABA9mhGRBoZe3eaPDqE6/qVEp5iFBEKjErYbUzVlrtr6cD5ttn0uGzLQsVMlEgPpB82XWa7gzTRg0OykcYE8otoAg==', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAACAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvi1AAAAAIAAAADAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAMAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAgAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+LUAAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{9mhGRBoZe3eaPDqE6/qVEp5iFBEKjErYbUzVlrtr6cD5ttn0uGzLQsVMlEgPpB82XWa7gzTRg0OykcYE8otoAg==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('895b1e3ae3570fac549edfcc260122a2f930b35b94b1dffa9f8c2a08816ac376', 4, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934594, 100, 1, '2019-06-03 16:34:22.235126', '2019-06-03 16:34:22.235126', 17179873280, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAUAAAAAAAAAAQAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEALUnIdWXjDKFil8+3DPcIytdMco/BMWnrqyv9Hc/DQsGAOLHRdhdAVL/sVSxW7ITzpxY3bv11PDVlr/U5DdrgB', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjOAAAAAIAAAACAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAIAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAEAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+M4AAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{C1JyHVl4wyhYpfPtwz3CMrXTHKPwTFp66sr/R3Pw0LBgDix0XYXQFS/7FUsVuyE86cWN279dTw1Za/1OQ3a4AQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('c76f843dd29e92bacbf21659d50454a043eae6a5ef81e2e8dc97b0e005d30962', 3, 1, 'GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU', 8589934593, 100, 1, '2019-06-03 16:34:22.248772', '2019-06-03 16:34:22.248772', 12884905984, 'AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAUAAAABAAAAADtgvwDuOWAQ97R1RTtUdwNDHpD/CUepzdQPXlonciLVAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABruS+TAAAAEC87yJlK5zXwuklcPxhmPt9HB9YOb+0HHcN2SteSVLsjnyafNu/560Mj8/QJzfSnKm3arRVJtHgFgaSFJiywRoF', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAFAAAAAAAAAAA=', 'AAAAAQAAAAIAAAADAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvjnAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAEAAAAAAAAAAQAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+OcAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{vO8iZSuc18LpJXD8YZj7fRwfWDm/tBx3DdkrXklS7I58mnzbv+etDI/P0Cc30pypt2q0VSbR4BYGkhSYssEaBQ==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('b2a227c39c64a44fc7abd4c96819456f0399906d12c476d70b402bfdb296d6a3', 2, 1, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 1, 100, 1, '2019-06-03 16:34:22.259603', '2019-06-03 16:34:22.259603', 8589938688, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAACVAvkAAAAAAAAAAABVvwF9wAAAEDt3KwmaPuPdFSUxdAFeb6OQetyQKIWazlbSMMhmHKNLD4sqhEqUZcQP0l+X/Op+osWmN6+FUYbsz75Q2jG4vMM', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAABAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{7dysJmj7j3RUlMXQBXm+jkHrckCiFms5W0jDIZhyjSw+LKoRKlGXED9Jfl/zqfqLFpjevhVGG7M++UNoxuLzDA==}', 'none', NULL, NULL, true, 100); -INSERT INTO history_transactions VALUES ('36be70fb7782f9801cdcedc1206e21f99293c99860a15e441f4749747a0a37ab', 2, 2, 'GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H', 2, 100, 1, '2019-06-03 16:34:22.259791', '2019-06-03 16:34:22.259792', 8589942784, 'AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAACVAvkAAAAAAAAAAABVvwF9wAAAEA3xWbxPObnZMiBGFKLJQufJLguTsHJxyAsPP5F9Zj561aXnvN/HVRJbFsEcitGbgi9dWVdKRYvmVWCizIdmLID', 'AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=', 'AAAAAQAAAAAAAAABAAAAAwAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrFTWBs4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtq7/TDc4AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA7YL8A7jlgEPe0dUU7VHcDQx6Q/wlHqc3UD15aJ3Ii1QAAAAJUC+QAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', 'AAAAAgAAAAMAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/+cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtrOnY/84AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==', '{N8Vm8Tzm52TIgRhSiyULnyS4Lk7ByccgLDz+RfWY+etWl57zfx1USWxbBHIrRm4IvXVlXSkWL5lVgosyHZiyAw==}', 'none', NULL, NULL, true, 100); - - --- --- Name: asset_stats asset_stats_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_pkey PRIMARY KEY (id); - - --- --- Name: gorp_migrations gorp_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY gorp_migrations - ADD CONSTRAINT gorp_migrations_pkey PRIMARY KEY (id); - - --- --- Name: history_assets history_assets_asset_code_asset_type_asset_issuer_key; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_asset_code_asset_type_asset_issuer_key UNIQUE (asset_code, asset_type, asset_issuer); - - --- --- Name: history_assets history_assets_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_assets - ADD CONSTRAINT history_assets_pkey PRIMARY KEY (id); - - --- --- Name: history_operation_participants history_operation_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_operation_participants - ADD CONSTRAINT history_operation_participants_pkey PRIMARY KEY (id); - - --- --- Name: history_transaction_participants history_transaction_participants_pkey; Type: CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_transaction_participants - ADD CONSTRAINT history_transaction_participants_pkey PRIMARY KEY (id); - - --- --- Name: asset_by_code; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_code ON history_assets USING btree (asset_code); - - --- --- Name: asset_by_issuer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX asset_by_issuer ON history_assets USING btree (asset_issuer); - - --- --- Name: by_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_account ON history_transactions USING btree (account, account_sequence); - - --- --- Name: by_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_hash ON history_transactions USING btree (transaction_hash); - - --- --- Name: by_ledger; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX by_ledger ON history_transactions USING btree (ledger_sequence, application_order); - - --- --- Name: hist_e_by_order; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_by_order ON history_effects USING btree (history_operation_id, "order"); - - --- --- Name: hist_e_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_e_id ON history_effects USING btree (history_account_id, history_operation_id, "order"); - - --- --- Name: hist_op_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_op_p_id ON history_operation_participants USING btree (history_account_id, history_operation_id); - - --- --- Name: hist_tx_p_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hist_tx_p_id ON history_transaction_participants USING btree (history_account_id, history_transaction_id); - - --- --- Name: hop_by_hoid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX hop_by_hoid ON history_operation_participants USING btree (history_operation_id); - - --- --- Name: hs_ledger_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_ledger_by_id ON history_ledgers USING btree (id); - - --- --- Name: hs_transaction_by_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX hs_transaction_by_id ON history_transactions USING btree (id); - - --- --- Name: htp_by_htid; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htp_by_htid ON history_transaction_participants USING btree (history_transaction_id); - - --- --- Name: htrd_by_base_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_account ON history_trades USING btree (base_account_id); - - --- --- Name: htrd_by_base_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_base_offer ON history_trades USING btree (base_offer_id); - - --- --- Name: htrd_by_counter_account; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_account ON history_trades USING btree (counter_account_id); - - --- --- Name: htrd_by_counter_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_counter_offer ON history_trades USING btree (counter_offer_id); - - --- --- Name: htrd_by_offer; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_by_offer ON history_trades USING btree (offer_id); - - --- --- Name: htrd_counter_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_counter_lookup ON history_trades USING btree (counter_asset_id); - - --- --- Name: htrd_pair_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_pair_time_lookup ON history_trades USING btree (base_asset_id, counter_asset_id, ledger_closed_at); - - --- --- Name: htrd_pid; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX htrd_pid ON history_trades USING btree (history_operation_id, "order"); - - --- --- Name: htrd_time_lookup; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX htrd_time_lookup ON history_trades USING btree (ledger_closed_at); - - --- --- Name: index_history_accounts_on_address; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_address ON history_accounts USING btree (address); - - --- --- Name: index_history_accounts_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_accounts_on_id ON history_accounts USING btree (id); - - --- --- Name: index_history_effects_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_effects_on_type ON history_effects USING btree (type); - - --- --- Name: index_history_ledgers_on_closed_at; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_closed_at ON history_ledgers USING btree (closed_at); - - --- --- Name: index_history_ledgers_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_id ON history_ledgers USING btree (id); - - --- --- Name: index_history_ledgers_on_importer_version; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_ledgers_on_importer_version ON history_ledgers USING btree (importer_version); - - --- --- Name: index_history_ledgers_on_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_ledger_hash ON history_ledgers USING btree (ledger_hash); - - --- --- Name: index_history_ledgers_on_previous_ledger_hash; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_previous_ledger_hash ON history_ledgers USING btree (previous_ledger_hash); - - --- --- Name: index_history_ledgers_on_sequence; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_ledgers_on_sequence ON history_ledgers USING btree (sequence); - - --- --- Name: index_history_operations_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_operations_on_id ON history_operations USING btree (id); - - --- --- Name: index_history_operations_on_transaction_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_transaction_id ON history_operations USING btree (transaction_id); - - --- --- Name: index_history_operations_on_type; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_history_operations_on_type ON history_operations USING btree (type); - - --- --- Name: index_history_transactions_on_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE UNIQUE INDEX index_history_transactions_on_id ON history_transactions USING btree (id); - - --- --- Name: trade_effects_by_order_book; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX trade_effects_by_order_book ON history_effects USING btree (((details ->> 'sold_asset_type'::text)), ((details ->> 'sold_asset_code'::text)), ((details ->> 'sold_asset_issuer'::text)), ((details ->> 'bought_asset_type'::text)), ((details ->> 'bought_asset_code'::text)), ((details ->> 'bought_asset_issuer'::text))) WHERE (type = 33); - - --- --- Name: asset_stats asset_stats_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY asset_stats - ADD CONSTRAINT asset_stats_id_fkey FOREIGN KEY (id) REFERENCES history_assets(id) ON UPDATE RESTRICT ON DELETE CASCADE; - - --- --- Name: history_trades history_trades_base_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_account_id_fkey FOREIGN KEY (base_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_base_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_base_asset_id_fkey FOREIGN KEY (base_asset_id) REFERENCES history_assets(id); - - --- --- Name: history_trades history_trades_counter_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_account_id_fkey FOREIGN KEY (counter_account_id) REFERENCES history_accounts(id); - - --- --- Name: history_trades history_trades_counter_asset_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: - --- - -ALTER TABLE ONLY history_trades - ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/services/horizon/internal/test/scenarios/set_options.rb b/services/horizon/internal/test/scenarios/set_options.rb deleted file mode 100644 index 94980f5d44..0000000000 --- a/services/horizon/internal/test/scenarios/set_options.rb +++ /dev/null @@ -1,21 +0,0 @@ -run_recipe File.dirname(__FILE__) + "/_common_accounts.rb" - -use_manual_close - -create_account :scott -create_account :bartek - -close_ledger -kp = Stellar::KeyPair.from_seed("SB2XGZC7M5QXIZLXMF4SAIBAEAQCAIBAEAQCAIBAEAQCAIBAEAQCBV6K") - -set_inflation_dest :scott, :bartek ; close_ledger -set_flags :scott, [:auth_required_flag] ; close_ledger -set_master_signer_weight :scott, 2 ; close_ledger -set_thresholds :scott, low: 0, medium: 2, high: 2 ; close_ledger -set_home_domain :scott, "nullstyle.com" ; close_ledger -add_signer :scott, kp, 1 ; close_ledger -add_signer :scott, kp, 5 ; close_ledger -clear_flags :scott, [:auth_required_flag] ; close_ledger -remove_signer :scott, kp ; close_ledger - -close_ledger From 36f465cfe0fc5ae87689723edc23b6a73191d165 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Tue, 4 May 2021 18:29:14 +0100 Subject: [PATCH 20/67] services/horizon: Change ingest/ledgerbackend/LedgerBackend.GetLedger to be always blocking (#3576) * Add ctx to TrustedLedgerHashStore * Add ctx to LedgerBackend and TrustedHashStore * Stop using old GetLedger * Rename GetLedgerBlocking -> GetLedger and remove old from the API * Clean up the GetLedger implementations * Set timeouts on captive core server so long-polling works * Re-use IsPrepared to simplify RemoteCaptiveCore.PrepareRange * Add explicit 408 timeout to captive core server to ensure long-polling works * Update changelog * remove dead code * startPrepareRange outlives the request context * Remove Present flag from exp/services/captivecore/internal/api --- exp/services/captivecore/internal/api.go | 29 +-- exp/services/captivecore/internal/api_test.go | 47 ++--- exp/services/captivecore/internal/server.go | 26 ++- .../captivecore/internal/server_test.go | 64 ++++-- exp/services/captivecore/main.go | 5 +- exp/tools/captive-core-start-tester/main.go | 11 +- ingest/doc_test.go | 5 +- ingest/ledger_change_reader.go | 5 +- ingest/ledger_change_reader_test.go | 57 +++--- ingest/ledger_transaction_reader.go | 9 +- ingest/ledgerbackend/captive_core_backend.go | 186 +++++++----------- .../captive_core_backend_test.go | 148 +++++++------- ingest/ledgerbackend/database_backend.go | 53 ++--- ingest/ledgerbackend/ledger_backend.go | 12 +- ingest/ledgerbackend/ledger_hash_store.go | 22 +-- ingest/ledgerbackend/mock_database_backend.go | 23 +-- ingest/ledgerbackend/remote_captive_core.go | 139 +++++-------- .../ledgerbackend/remote_captive_core_test.go | 74 +++++++ ingest/tutorial/example_hello.go | 10 +- ingest/tutorial/example_statistics.go | 7 +- ingest/tutorial/getting-started.md | 8 +- services/horizon/CHANGELOG.md | 4 + .../internal/db2/history/ledger_test.go | 6 +- .../internal/ingest/build_state_test.go | 16 +- .../internal/ingest/database_backend_test.go | 8 +- .../internal/ingest/db_integration_test.go | 4 +- .../internal/ingest/fake_ledger_backend.go | 14 +- services/horizon/internal/ingest/fsm.go | 39 ++-- .../ingest/ingest_history_range_state_test.go | 32 +-- services/horizon/internal/ingest/main.go | 6 +- services/horizon/internal/ingest/main_test.go | 21 +- .../internal/ingest/resume_state_test.go | 22 +-- .../ingest/verify_range_state_test.go | 16 +- 33 files changed, 558 insertions(+), 570 deletions(-) create mode 100644 ingest/ledgerbackend/remote_captive_core_test.go diff --git a/exp/services/captivecore/internal/api.go b/exp/services/captivecore/internal/api.go index 9e666e565c..b39f7c0854 100644 --- a/exp/services/captivecore/internal/api.go +++ b/exp/services/captivecore/internal/api.go @@ -63,14 +63,18 @@ func (c *CaptiveCoreAPI) Shutdown() { c.core.Close() } -func (c *CaptiveCoreAPI) startPrepareRange(ledgerRange ledgerbackend.Range) { +func (c *CaptiveCoreAPI) isShutdown() bool { + return c.ctx.Err() != nil +} + +func (c *CaptiveCoreAPI) startPrepareRange(ctx context.Context, ledgerRange ledgerbackend.Range) { defer c.wg.Done() - err := c.core.PrepareRange(ledgerRange) + err := c.core.PrepareRange(ctx, ledgerRange) c.activeRequest.Lock() defer c.activeRequest.Unlock() - if c.ctx.Err() != nil { + if c.isShutdown() { return } @@ -100,10 +104,10 @@ func (c *CaptiveCoreAPI) startPrepareRange(ledgerRange ledgerbackend.Range) { } // PrepareRange executes the PrepareRange operation on the captive core instance. -func (c *CaptiveCoreAPI) PrepareRange(ledgerRange ledgerbackend.Range) (ledgerbackend.PrepareRangeResponse, error) { +func (c *CaptiveCoreAPI) PrepareRange(ctx context.Context, ledgerRange ledgerbackend.Range) (ledgerbackend.PrepareRangeResponse, error) { c.activeRequest.Lock() defer c.activeRequest.Unlock() - if c.ctx.Err() != nil { + if c.isShutdown() { return ledgerbackend.PrepareRangeResponse{}, errors.New("Cannot prepare range when shut down") } @@ -121,7 +125,7 @@ func (c *CaptiveCoreAPI) PrepareRange(ledgerRange ledgerbackend.Range) (ledgerba c.activeRequest.valid = true c.wg.Add(1) - go c.startPrepareRange(ledgerRange) + go c.startPrepareRange(c.ctx, ledgerRange) return ledgerbackend.PrepareRangeResponse{ LedgerRange: ledgerRange, @@ -140,7 +144,7 @@ func (c *CaptiveCoreAPI) PrepareRange(ledgerRange ledgerbackend.Range) (ledgerba } // GetLatestLedgerSequence determines the latest ledger sequence available on the captive core instance. -func (c *CaptiveCoreAPI) GetLatestLedgerSequence() (ledgerbackend.LatestLedgerSequenceResponse, error) { +func (c *CaptiveCoreAPI) GetLatestLedgerSequence(ctx context.Context) (ledgerbackend.LatestLedgerSequenceResponse, error) { c.activeRequest.Lock() defer c.activeRequest.Unlock() @@ -151,7 +155,7 @@ func (c *CaptiveCoreAPI) GetLatestLedgerSequence() (ledgerbackend.LatestLedgerSe return ledgerbackend.LatestLedgerSequenceResponse{}, ErrPrepareRangeNotReady } - seq, err := c.core.GetLatestLedgerSequence() + seq, err := c.core.GetLatestLedgerSequence(ctx) if err != nil { c.activeRequest.valid = false } @@ -159,7 +163,7 @@ func (c *CaptiveCoreAPI) GetLatestLedgerSequence() (ledgerbackend.LatestLedgerSe } // GetLedger fetches the ledger with the given sequence number from the captive core instance. -func (c *CaptiveCoreAPI) GetLedger(sequence uint32) (ledgerbackend.LedgerResponse, error) { +func (c *CaptiveCoreAPI) GetLedger(ctx context.Context, sequence uint32) (ledgerbackend.LedgerResponse, error) { c.activeRequest.Lock() defer c.activeRequest.Unlock() @@ -170,12 +174,13 @@ func (c *CaptiveCoreAPI) GetLedger(sequence uint32) (ledgerbackend.LedgerRespons return ledgerbackend.LedgerResponse{}, ErrPrepareRangeNotReady } - present, ledger, err := c.core.GetLedger(sequence) + ledger, err := c.core.GetLedger(ctx, sequence) if err != nil { c.activeRequest.valid = false } + // TODO: We are always true here now, so this changes the semantics of this + // call a bit. We need to change the client to long-poll this endpoint. return ledgerbackend.LedgerResponse{ - Present: present, - Ledger: ledgerbackend.Base64Ledger(ledger), + Ledger: ledgerbackend.Base64Ledger(ledger), }, err } diff --git a/exp/services/captivecore/internal/api_test.go b/exp/services/captivecore/internal/api_test.go index 223f5e9bb4..b9c96bf8b4 100644 --- a/exp/services/captivecore/internal/api_test.go +++ b/exp/services/captivecore/internal/api_test.go @@ -1,10 +1,12 @@ package internal import ( + "context" "fmt" "testing" "time" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" "github.com/stellar/go/ingest/ledgerbackend" @@ -18,11 +20,13 @@ func TestAPITestSuite(t *testing.T) { type APITestSuite struct { suite.Suite + ctx context.Context ledgerBackend *ledgerbackend.MockDatabaseBackend api CaptiveCoreAPI } func (s *APITestSuite) SetupTest() { + s.ctx = context.Background() s.ledgerBackend = &ledgerbackend.MockDatabaseBackend{} s.api = NewCaptiveCoreAPI(s.ledgerBackend, log.New()) } @@ -32,23 +36,23 @@ func (s *APITestSuite) TearDownTest() { } func (s *APITestSuite) TestLatestSeqActiveRequestInvalid() { - _, err := s.api.GetLatestLedgerSequence() + _, err := s.api.GetLatestLedgerSequence(s.ctx) s.Assert().Equal(err, ErrMissingPrepareRange) } func (s *APITestSuite) TestGetLedgerActiveRequestInvalid() { - _, err := s.api.GetLedger(64) + _, err := s.api.GetLedger(s.ctx, 64) s.Assert().Equal(err, ErrMissingPrepareRange) } func (s *APITestSuite) runBeforeReady(prepareRangeErr error, f func()) { waitChan := make(chan time.Time) ledgerRange := ledgerbackend.UnboundedRange(63) - s.ledgerBackend.On("PrepareRange", ledgerRange). + s.ledgerBackend.On("PrepareRange", mock.Anything, ledgerRange). WaitUntil(waitChan). Return(prepareRangeErr).Once() - response, err := s.api.PrepareRange(ledgerRange) + response, err := s.api.PrepareRange(s.ctx, ledgerRange) s.Assert().NoError(err) s.Assert().False(response.Ready) s.Assert().Equal(response.LedgerRange, ledgerRange) @@ -61,23 +65,23 @@ func (s *APITestSuite) runBeforeReady(prepareRangeErr error, f func()) { func (s *APITestSuite) TestLatestSeqActiveRequestNotReady() { s.runBeforeReady(nil, func() { - _, err := s.api.GetLatestLedgerSequence() + _, err := s.api.GetLatestLedgerSequence(s.ctx) s.Assert().Equal(err, ErrPrepareRangeNotReady) }) } func (s *APITestSuite) TestGetLedgerNotReady() { s.runBeforeReady(nil, func() { - _, err := s.api.GetLedger(64) + _, err := s.api.GetLedger(s.ctx, 64) s.Assert().Equal(err, ErrPrepareRangeNotReady) }) } func (s *APITestSuite) waitUntilReady(ledgerRange ledgerbackend.Range) { - s.ledgerBackend.On("PrepareRange", ledgerRange). + s.ledgerBackend.On("PrepareRange", mock.Anything, ledgerRange). Return(nil).Once() - response, err := s.api.PrepareRange(ledgerRange) + response, err := s.api.PrepareRange(s.ctx, ledgerRange) s.Assert().NoError(err) s.Assert().False(response.Ready) s.Assert().Equal(response.LedgerRange, ledgerRange) @@ -89,9 +93,9 @@ func (s *APITestSuite) TestLatestSeqError() { s.waitUntilReady(ledgerbackend.UnboundedRange(63)) expectedErr := fmt.Errorf("test error") - s.ledgerBackend.On("GetLatestLedgerSequence").Return(uint32(0), expectedErr).Once() + s.ledgerBackend.On("GetLatestLedgerSequence", s.ctx).Return(uint32(0), expectedErr).Once() - _, err := s.api.GetLatestLedgerSequence() + _, err := s.api.GetLatestLedgerSequence(s.ctx) s.Assert().Equal(err, expectedErr) } @@ -99,10 +103,10 @@ func (s *APITestSuite) TestGetLedgerError() { s.waitUntilReady(ledgerbackend.UnboundedRange(63)) expectedErr := fmt.Errorf("test error") - s.ledgerBackend.On("GetLedger", uint32(64)). - Return(false, xdr.LedgerCloseMeta{}, expectedErr).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(64)). + Return(xdr.LedgerCloseMeta{}, expectedErr).Once() - _, err := s.api.GetLedger(64) + _, err := s.api.GetLedger(s.ctx, 64) s.Assert().Equal(err, expectedErr) } @@ -110,8 +114,8 @@ func (s *APITestSuite) TestLatestSeqSucceeds() { s.waitUntilReady(ledgerbackend.UnboundedRange(63)) expectedSeq := uint32(100) - s.ledgerBackend.On("GetLatestLedgerSequence").Return(expectedSeq, nil).Once() - seq, err := s.api.GetLatestLedgerSequence() + s.ledgerBackend.On("GetLatestLedgerSequence", s.ctx).Return(expectedSeq, nil).Once() + seq, err := s.api.GetLatestLedgerSequence(s.ctx) s.Assert().NoError(err) s.Assert().Equal(seq, ledgerbackend.LatestLedgerSequenceResponse{Sequence: expectedSeq}) } @@ -128,21 +132,20 @@ func (s *APITestSuite) TestGetLedgerSucceeds() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(64)). - Return(true, expectedLedger, nil).Once() - seq, err := s.api.GetLedger(64) + s.ledgerBackend.On("GetLedger", s.ctx, uint32(64)). + Return(expectedLedger, nil).Once() + seq, err := s.api.GetLedger(s.ctx, 64) s.Assert().NoError(err) s.Assert().Equal(seq, ledgerbackend.LedgerResponse{ - Present: true, - Ledger: ledgerbackend.Base64Ledger(expectedLedger), + Ledger: ledgerbackend.Base64Ledger(expectedLedger), }) } func (s *APITestSuite) TestShutDownBeforePrepareRange() { s.ledgerBackend.On("Close").Return(nil).Once() s.api.Shutdown() - _, err := s.api.PrepareRange(ledgerbackend.UnboundedRange(63)) + _, err := s.api.PrepareRange(s.ctx, ledgerbackend.UnboundedRange(63)) s.Assert().EqualError(err, "Cannot prepare range when shut down") } @@ -226,7 +229,7 @@ func (s *APITestSuite) TestRangeAlreadyPrepared() { ledgerbackend.UnboundedRange(100), ledgerbackend.BoundedRange(63, 70), } { - response, err := s.api.PrepareRange(ledgerRange) + response, err := s.api.PrepareRange(s.ctx, ledgerRange) s.Assert().NoError(err) s.Assert().True(response.Ready) s.Assert().Equal(superSetRange, response.LedgerRange) diff --git a/exp/services/captivecore/internal/server.go b/exp/services/captivecore/internal/server.go index b451a35c93..127444611f 100644 --- a/exp/services/captivecore/internal/server.go +++ b/exp/services/captivecore/internal/server.go @@ -1,8 +1,10 @@ package internal import ( + "context" "encoding/json" "net/http" + "time" "github.com/stellar/go/ingest/ledgerbackend" supporthttp "github.com/stellar/go/support/http" @@ -39,7 +41,7 @@ func Handler(api CaptiveCoreAPI) http.Handler { mux := supporthttp.NewMux(api.log) mux.Get("/latest-sequence", func(w http.ResponseWriter, r *http.Request) { - response, err := api.GetLatestLedgerSequence() + response, err := api.GetLatestLedgerSequence(r.Context()) serializeResponse(api.log, w, r, response, err) }) @@ -51,8 +53,24 @@ func Handler(api CaptiveCoreAPI) http.Handler { return } - response, err := api.GetLedger(req.Sequence) - serializeResponse(api.log, w, r, response, err) + // must be shorter than the RemoteCaptiveCore http client timeout. + ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second) + defer cancel() // release timer + + var response ledgerbackend.LedgerResponse + var err error + done := make(chan struct{}) + go func() { + response, err = api.GetLedger(ctx, req.Sequence) + close(done) + }() + + select { + case <-ctx.Done(): + w.WriteHeader(http.StatusRequestTimeout) + case <-done: + serializeResponse(api.log, w, r, response, err) + } }) mux.Post("/prepare-range", func(w http.ResponseWriter, r *http.Request) { @@ -63,7 +81,7 @@ func Handler(api CaptiveCoreAPI) http.Handler { return } - response, err := api.PrepareRange(ledgerRange) + response, err := api.PrepareRange(r.Context(), ledgerRange) serializeResponse(api.log, w, r, response, err) }) diff --git a/exp/services/captivecore/internal/server_test.go b/exp/services/captivecore/internal/server_test.go index 8339641e2b..86ad989191 100644 --- a/exp/services/captivecore/internal/server_test.go +++ b/exp/services/captivecore/internal/server_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" "github.com/stellar/go/ingest/ledgerbackend" @@ -22,6 +23,7 @@ func TestServerTestSuite(t *testing.T) { type ServerTestSuite struct { suite.Suite + ctx context.Context ledgerBackend *ledgerbackend.MockDatabaseBackend api CaptiveCoreAPI handler http.Handler @@ -30,13 +32,13 @@ type ServerTestSuite struct { } func (s *ServerTestSuite) SetupTest() { + s.ctx = context.Background() s.ledgerBackend = &ledgerbackend.MockDatabaseBackend{} s.api = NewCaptiveCoreAPI(s.ledgerBackend, log.New()) s.handler = Handler(s.api) s.server = httptest.NewServer(s.handler) var err error s.client, err = ledgerbackend.NewRemoteCaptive( - context.Background(), s.server.URL, ledgerbackend.PrepareRangePollInterval(time.Millisecond), ) @@ -54,9 +56,9 @@ func (s *ServerTestSuite) TestLatestSequence() { s.api.activeRequest.ready = true expectedSeq := uint32(100) - s.ledgerBackend.On("GetLatestLedgerSequence").Return(expectedSeq, nil).Once() + s.ledgerBackend.On("GetLatestLedgerSequence", mock.Anything).Return(expectedSeq, nil).Once() - seq, err := s.client.GetLatestLedgerSequence() + seq, err := s.client.GetLatestLedgerSequence(s.ctx) s.Assert().NoError(err) s.Assert().Equal(expectedSeq, seq) } @@ -65,34 +67,34 @@ func (s *ServerTestSuite) TestLatestSequenceError() { s.api.activeRequest.valid = true s.api.activeRequest.ready = true - s.ledgerBackend.On("GetLatestLedgerSequence").Return(uint32(100), fmt.Errorf("test error")).Once() + s.ledgerBackend.On("GetLatestLedgerSequence", mock.Anything).Return(uint32(100), fmt.Errorf("test error")).Once() - _, err := s.client.GetLatestLedgerSequence() + _, err := s.client.GetLatestLedgerSequence(s.ctx) s.Assert().EqualError(err, "test error") } func (s *ServerTestSuite) TestPrepareBoundedRange() { ledgerRange := ledgerbackend.BoundedRange(10, 30) - s.ledgerBackend.On("PrepareRange", ledgerRange). + s.ledgerBackend.On("PrepareRange", mock.Anything, ledgerRange). Return(nil).Once() - s.Assert().NoError(s.client.PrepareRange(ledgerRange)) + s.Assert().NoError(s.client.PrepareRange(s.ctx, ledgerRange)) s.Assert().True(s.api.activeRequest.ready) - prepared, err := s.client.IsPrepared(ledgerRange) + prepared, err := s.client.IsPrepared(s.ctx, ledgerRange) s.Assert().NoError(err) s.Assert().True(prepared) } func (s *ServerTestSuite) TestPrepareUnboundedRange() { ledgerRange := ledgerbackend.UnboundedRange(100) - s.ledgerBackend.On("PrepareRange", ledgerRange). + s.ledgerBackend.On("PrepareRange", mock.Anything, ledgerRange). Return(nil).Once() - s.Assert().NoError(s.client.PrepareRange(ledgerRange)) + s.Assert().NoError(s.client.PrepareRange(s.ctx, ledgerRange)) s.Assert().True(s.api.activeRequest.ready) - prepared, err := s.client.IsPrepared(ledgerRange) + prepared, err := s.client.IsPrepared(s.ctx, ledgerRange) s.Assert().NoError(err) s.Assert().True(prepared) } @@ -102,13 +104,14 @@ func (s *ServerTestSuite) TestPrepareError() { s.api.Shutdown() s.Assert().EqualError( - s.client.PrepareRange(ledgerbackend.UnboundedRange(100)), + s.client.PrepareRange(s.ctx, ledgerbackend.UnboundedRange(100)), "Cannot prepare range when shut down", ) } func (s *ServerTestSuite) TestGetLedgerInvalidSequence() { req := httptest.NewRequest("GET", "/ledger/abcdef", nil) + req = req.WithContext(s.ctx) w := httptest.NewRecorder() s.handler.ServeHTTP(w, req) @@ -126,10 +129,10 @@ func (s *ServerTestSuite) TestGetLedgerError() { s.api.activeRequest.ready = true expectedErr := fmt.Errorf("test error") - s.ledgerBackend.On("GetLedger", uint32(64)). - Return(false, xdr.LedgerCloseMeta{}, expectedErr).Once() + s.ledgerBackend.On("GetLedger", mock.Anything, uint32(64)). + Return(xdr.LedgerCloseMeta{}, expectedErr).Once() - _, _, err := s.client.GetLedger(64) + _, err := s.client.GetLedger(s.ctx, 64) s.Assert().EqualError(err, "test error") } @@ -146,11 +149,34 @@ func (s *ServerTestSuite) TestGetLedgerSucceeds() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(64)). - Return(true, expectedLedger, nil).Once() + s.ledgerBackend.On("GetLedger", mock.Anything, uint32(64)). + Return(expectedLedger, nil).Once() - present, ledger, err := s.client.GetLedger(64) + ledger, err := s.client.GetLedger(s.ctx, 64) + s.Assert().NoError(err) + s.Assert().Equal(expectedLedger, ledger) +} + +func (s *ServerTestSuite) TestGetLedgerTakesAWhile() { + s.api.activeRequest.valid = true + s.api.activeRequest.ready = true + + expectedLedger := xdr.LedgerCloseMeta{ + V0: &xdr.LedgerCloseMetaV0{ + LedgerHeader: xdr.LedgerHeaderHistoryEntry{ + Header: xdr.LedgerHeader{ + LedgerSeq: 64, + }, + }, + }, + } + s.ledgerBackend.On("GetLedger", mock.Anything, uint32(64)). + Run(func(mock.Arguments) { time.Sleep(6 * time.Second) }). + Return(xdr.LedgerCloseMeta{}, nil).Once() + s.ledgerBackend.On("GetLedger", mock.Anything, uint32(64)). + Return(expectedLedger, nil).Once() + + ledger, err := s.client.GetLedger(s.ctx, 64) s.Assert().NoError(err) - s.Assert().True(present) s.Assert().Equal(expectedLedger, ledger) } diff --git a/exp/services/captivecore/main.go b/exp/services/captivecore/main.go index d0f2fdd425..c8c2d425ab 100644 --- a/exp/services/captivecore/main.go +++ b/exp/services/captivecore/main.go @@ -1,7 +1,6 @@ package main import ( - "context" "fmt" "go/types" "strings" @@ -139,7 +138,7 @@ func main() { if err != nil { logger.WithError(err).Fatal("Could not create db connection instance") } - captiveConfig.LedgerHashStore = ledgerbackend.NewHorizonDBLedgerHashStore(context.Background(), dbConn) + captiveConfig.LedgerHashStore = ledgerbackend.NewHorizonDBLedgerHashStore(dbConn) } core, err := ledgerbackend.NewCaptive(captiveConfig) @@ -155,6 +154,8 @@ func main() { logger.Infof("Starting Captive Core server on %v", port) }, OnStopping: func() { + // TODO: Check this aborts in-progress requests instead of letting + // them finish, to preserve existing behaviour. api.Shutdown() if dbConn != nil { dbConn.Close() diff --git a/exp/tools/captive-core-start-tester/main.go b/exp/tools/captive-core-start-tester/main.go index 18984818ed..9e1183bd5c 100644 --- a/exp/tools/captive-core-start-tester/main.go +++ b/exp/tools/captive-core-start-tester/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "github.com/stellar/go/ingest/ledgerbackend" @@ -36,23 +37,19 @@ func check(ledger uint32) bool { } defer c.Close() - err = c.PrepareRange(ledgerbackend.UnboundedRange(ledger)) + ctx := context.Background() + err = c.PrepareRange(ctx, ledgerbackend.UnboundedRange(ledger)) if err != nil { fmt.Println(err) return false } - ok, meta, err := c.GetLedger(ledger) + meta, err := c.GetLedger(ctx, ledger) if err != nil { fmt.Println(err) return false } - if !ok { - fmt.Println("no ledger") - return false - } - if meta.LedgerSequence() != ledger { fmt.Println("wrong ledger", meta.LedgerSequence()) return false diff --git a/ingest/doc_test.go b/ingest/doc_test.go index efad710140..5277add909 100644 --- a/ingest/doc_test.go +++ b/ingest/doc_test.go @@ -64,6 +64,7 @@ func Example_ledgerentrieshistoryarchive() { // for a specific ledger using captive stellar-core. Please note that transaction // meta IS available when using this backend. func Example_changes() { + ctx := context.Background() archiveURL := "http://history.stellar.org/prd/core-live/core_live_001" networkPassphrase := network.PublicNetworkPassphrase @@ -82,12 +83,12 @@ func Example_changes() { sequence := uint32(3) - err = backend.PrepareRange(ledgerbackend.SingleLedgerRange(sequence)) + err = backend.PrepareRange(ctx, ledgerbackend.SingleLedgerRange(sequence)) if err != nil { panic(err) } - changeReader, err := NewLedgerChangeReader(backend, networkPassphrase, sequence) + changeReader, err := NewLedgerChangeReader(ctx, backend, networkPassphrase, sequence) if err != nil { panic(err) } diff --git a/ingest/ledger_change_reader.go b/ingest/ledger_change_reader.go index f693963070..e1aa3fb2ed 100644 --- a/ingest/ledger_change_reader.go +++ b/ingest/ledger_change_reader.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "io" "github.com/stellar/go/ingest/ledgerbackend" @@ -46,8 +47,8 @@ var _ ChangeReader = (*LedgerChangeReader)(nil) // NewLedgerChangeReader constructs a new LedgerChangeReader instance bound to the given ledger. // Note that the returned LedgerChangeReader is not thread safe and should not be shared // by multiple goroutines. -func NewLedgerChangeReader(backend ledgerbackend.LedgerBackend, networkPassphrase string, sequence uint32) (*LedgerChangeReader, error) { - transactionReader, err := NewLedgerTransactionReader(backend, networkPassphrase, sequence) +func NewLedgerChangeReader(ctx context.Context, backend ledgerbackend.LedgerBackend, networkPassphrase string, sequence uint32) (*LedgerChangeReader, error) { + transactionReader, err := NewLedgerTransactionReader(ctx, backend, networkPassphrase, sequence) if err != nil { return nil, err } diff --git a/ingest/ledger_change_reader_test.go b/ingest/ledger_change_reader_test.go index b338ba935a..c461ef28c3 100644 --- a/ingest/ledger_change_reader_test.go +++ b/ingest/ledger_change_reader_test.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "fmt" "io" "testing" @@ -19,14 +20,14 @@ const ( ) func TestNewLedgerChangeReaderFails(t *testing.T) { + ctx := context.Background() mock := &ledgerbackend.MockDatabaseBackend{} seq := uint32(123) - mock.On("GetLedger", seq).Return( - true, + mock.On("GetLedger", ctx, seq).Return( xdr.LedgerCloseMeta{}, fmt.Errorf("ledger error"), ).Once() - _, err := NewLedgerChangeReader(mock, network.TestNetworkPassphrase, seq) + _, err := NewLedgerChangeReader(ctx, mock, network.TestNetworkPassphrase, seq) assert.EqualError( t, err, @@ -34,23 +35,8 @@ func TestNewLedgerChangeReaderFails(t *testing.T) { ) } -func TestNewLedgerChangeReaderLedgerDoesNotExist(t *testing.T) { - mock := &ledgerbackend.MockDatabaseBackend{} - seq := uint32(123) - mock.On("GetLedger", seq).Return( - false, - xdr.LedgerCloseMeta{}, - nil, - ).Once() - _, err := NewLedgerChangeReader(mock, network.TestNetworkPassphrase, seq) - assert.Equal( - t, - err, - ErrNotFound, - ) -} - func TestNewLedgerChangeReaderSucceeds(t *testing.T) { + ctx := context.Background() mock := &ledgerbackend.MockDatabaseBackend{} seq := uint32(123) @@ -61,8 +47,7 @@ func TestNewLedgerChangeReaderSucceeds(t *testing.T) { }, } - mock.On("GetLedger", seq).Return( - true, + mock.On("GetLedger", ctx, seq).Return( xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ LedgerHeader: header, @@ -71,7 +56,7 @@ func TestNewLedgerChangeReaderSucceeds(t *testing.T) { nil, ).Once() - reader, err := NewLedgerChangeReader(mock, network.TestNetworkPassphrase, seq) + reader, err := NewLedgerChangeReader(ctx, mock, network.TestNetworkPassphrase, seq) assert.NoError(t, err) assert.Equal(t, reader.GetHeader(), header) @@ -106,11 +91,12 @@ func parseChange(change Change) balanceEntry { func assertChangesEqual( t *testing.T, + ctx context.Context, sequence uint32, backend ledgerbackend.LedgerBackend, expected []balanceEntry, ) { - reader, err := NewLedgerChangeReader(backend, network.TestNetworkPassphrase, sequence) + reader, err := NewLedgerChangeReader(ctx, backend, network.TestNetworkPassphrase, sequence) assert.NoError(t, err) changes := []balanceEntry{} @@ -130,6 +116,7 @@ func assertChangesEqual( } func TestLedgerChangeReaderOrder(t *testing.T) { + ctx := context.Background() mock := &ledgerbackend.MockDatabaseBackend{} seq := uint32(123) @@ -235,9 +222,9 @@ func TestLedgerChangeReaderOrder(t *testing.T) { }, }, } - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() - assertChangesEqual(t, seq, mock, []balanceEntry{ + assertChangesEqual(t, ctx, seq, mock, []balanceEntry{ {feeAddress, 100}, {feeAddress, 200}, {feeAddress, 300}, @@ -253,8 +240,8 @@ func TestLedgerChangeReaderOrder(t *testing.T) { mock.AssertExpectations(t) ledger.V0.LedgerHeader.Header.LedgerVersion = 8 - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() - _, err = NewLedgerChangeReader(mock, network.TestNetworkPassphrase, seq) + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() + _, err = NewLedgerChangeReader(ctx, mock, network.TestNetworkPassphrase, seq) assert.EqualError( t, err, @@ -266,9 +253,9 @@ func TestLedgerChangeReaderOrder(t *testing.T) { ledger.V0.LedgerHeader.Header.LedgerVersion = 9 ledger.V0.TxProcessing[0].FeeProcessing = xdr.LedgerEntryChanges{} ledger.V0.TxProcessing[1].FeeProcessing = xdr.LedgerEntryChanges{} - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() - assertChangesEqual(t, seq, mock, []balanceEntry{ + assertChangesEqual(t, ctx, seq, mock, []balanceEntry{ {metaAddress, 300}, {metaAddress, 400}, {metaAddress, 600}, @@ -283,9 +270,9 @@ func TestLedgerChangeReaderOrder(t *testing.T) { ledger.V0.LedgerHeader.Header.LedgerVersion = 10 ledger.V0.TxProcessing[0].FeeProcessing = xdr.LedgerEntryChanges{} ledger.V0.TxProcessing[1].FeeProcessing = xdr.LedgerEntryChanges{} - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() - assertChangesEqual(t, seq, mock, []balanceEntry{ + assertChangesEqual(t, ctx, seq, mock, []balanceEntry{ {metaAddress, 300}, {metaAddress, 400}, {metaAddress, 600}, @@ -305,9 +292,9 @@ func TestLedgerChangeReaderOrder(t *testing.T) { Changes: xdr.LedgerEntryChanges{}, }, } - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() - assertChangesEqual(t, seq, mock, []balanceEntry{ + assertChangesEqual(t, ctx, seq, mock, []balanceEntry{ {metaAddress, 300}, {metaAddress, 400}, {metaAddress, 600}, @@ -329,8 +316,8 @@ func TestLedgerChangeReaderOrder(t *testing.T) { Operations: []xdr.OperationMeta{}, }, } - mock.On("GetLedger", seq).Return(true, ledger, nil).Once() + mock.On("GetLedger", ctx, seq).Return(ledger, nil).Once() - assertChangesEqual(t, seq, mock, []balanceEntry{}) + assertChangesEqual(t, ctx, seq, mock, []balanceEntry{}) mock.AssertExpectations(t) } diff --git a/ingest/ledger_transaction_reader.go b/ingest/ledger_transaction_reader.go index a33355261c..ef68e67aa0 100644 --- a/ingest/ledger_transaction_reader.go +++ b/ingest/ledger_transaction_reader.go @@ -1,6 +1,7 @@ package ingest import ( + "context" "encoding/hex" "io" @@ -20,16 +21,12 @@ type LedgerTransactionReader struct { // NewLedgerTransactionReader creates a new TransactionReader instance. // Note that TransactionReader is not thread safe and should not be shared by multiple goroutines. -func NewLedgerTransactionReader(backend ledgerbackend.LedgerBackend, networkPassphrase string, sequence uint32) (*LedgerTransactionReader, error) { - exists, ledgerCloseMeta, err := backend.GetLedger(sequence) +func NewLedgerTransactionReader(ctx context.Context, backend ledgerbackend.LedgerBackend, networkPassphrase string, sequence uint32) (*LedgerTransactionReader, error) { + ledgerCloseMeta, err := backend.GetLedger(ctx, sequence) if err != nil { return nil, errors.Wrap(err, "error getting ledger from the backend") } - if !exists { - return nil, ErrNotFound - } - return NewLedgerTransactionReaderFromLedgerCloseMeta(networkPassphrase, ledgerCloseMeta) } diff --git a/ingest/ledgerbackend/captive_core_backend.go b/ingest/ledgerbackend/captive_core_backend.go index ea09b9aa3e..85b4158022 100644 --- a/ingest/ledgerbackend/captive_core_backend.go +++ b/ingest/ledgerbackend/captive_core_backend.go @@ -85,15 +85,6 @@ type CaptiveStellarCore struct { // For testing stellarCoreRunnerFactory func(mode stellarCoreRunnerMode) (stellarCoreRunnerInterface, error) - // Defines if the blocking mode (off by default) is on or off. In blocking mode, - // calling GetLedger blocks until the requested ledger is available. This is useful - // for scenarios when Horizon consumes ledgers faster than Stellar-Core produces them - // and using `time.Sleep` when ledger is not available can actually slow entire - // ingestion process. - // blockingLock locks access to blocking. - blockingLock sync.Mutex - blocking bool - // cachedMeta keeps that ledger data of the last fetched ledger. Updated in GetLedger(). cachedMeta *xdr.LedgerCloseMeta @@ -235,13 +226,12 @@ func (c *CaptiveStellarCore) openOfflineReplaySubprocess(from, to uint32) error // the requested ledger c.nextLedger = c.roundDownToFirstReplayAfterCheckpointStart(from) c.lastLedger = &to - c.setBlocking(true) c.previousLedgerHash = nil return nil } -func (c *CaptiveStellarCore) openOnlineReplaySubprocess(from uint32) error { +func (c *CaptiveStellarCore) openOnlineReplaySubprocess(ctx context.Context, from uint32) error { latestCheckpointSequence, err := c.getLatestCheckpointSequence() if err != nil { return errors.Wrap(err, "error getting latest checkpoint sequence") @@ -269,7 +259,7 @@ func (c *CaptiveStellarCore) openOnlineReplaySubprocess(from uint32) error { c.stellarCoreRunner = runner } - runFrom, ledgerHash, nextLedger, err := c.runFromParams(from) + runFrom, ledgerHash, nextLedger, err := c.runFromParams(ctx, from) if err != nil { return errors.Wrap(err, "error calculating ledger and hash for stelar-core run") } @@ -285,7 +275,7 @@ func (c *CaptiveStellarCore) openOnlineReplaySubprocess(from uint32) error { if c.ledgerHashStore != nil { var exists bool - ledgerHash, exists, err = c.ledgerHashStore.GetLedgerHash(nextLedger - 1) + ledgerHash, exists, err = c.ledgerHashStore.GetLedgerHash(ctx, nextLedger-1) if err != nil { return errors.Wrapf(err, "error trying to read ledger hash %d", nextLedger-1) } @@ -294,13 +284,11 @@ func (c *CaptiveStellarCore) openOnlineReplaySubprocess(from uint32) error { } } - c.setBlocking(false) - return nil } // runFromParams receives a ledger sequence and calculates the required values to call stellar-core run with --start-ledger and --start-hash -func (c *CaptiveStellarCore) runFromParams(from uint32) (runFrom uint32, ledgerHash string, nextLedger uint32, err error) { +func (c *CaptiveStellarCore) runFromParams(ctx context.Context, from uint32) (runFrom uint32, ledgerHash string, nextLedger uint32, err error) { if from == 1 { // Trying to start-from 1 results in an error from Stellar-Core: // Target ledger 1 is not newer than last closed ledger 1 - nothing to do @@ -338,7 +326,7 @@ func (c *CaptiveStellarCore) runFromParams(from uint32) (runFrom uint32, ledgerH runFrom = from - 1 if c.ledgerHashStore != nil { var exists bool - ledgerHash, exists, err = c.ledgerHashStore.GetLedgerHash(runFrom) + ledgerHash, exists, err = c.ledgerHashStore.GetLedgerHash(ctx, runFrom) if err != nil { err = errors.Wrapf(err, "error trying to read ledger hash %d", runFrom) return @@ -357,7 +345,7 @@ func (c *CaptiveStellarCore) runFromParams(from uint32) (runFrom uint32, ledgerH return } -func (c *CaptiveStellarCore) startPreparingRange(ledgerRange Range) (bool, error) { +func (c *CaptiveStellarCore) startPreparingRange(ctx context.Context, ledgerRange Range) (bool, error) { c.stellarCoreLock.Lock() defer c.stellarCoreLock.Unlock() @@ -375,7 +363,7 @@ func (c *CaptiveStellarCore) startPreparingRange(ledgerRange Range) (bool, error if ledgerRange.bounded { err = c.openOfflineReplaySubprocess(ledgerRange.from, ledgerRange.to) } else { - err = c.openOnlineReplaySubprocess(ledgerRange.from) + err = c.openOnlineReplaySubprocess(ctx, ledgerRange.from) } if err != nil { return false, errors.Wrap(err, "opening subprocess") @@ -393,18 +381,14 @@ func (c *CaptiveStellarCore) startPreparingRange(ledgerRange Range) (bool, error // it normally (including connecting to the Stellar network). // Please note that using a BoundedRange, currently, requires a full-trust on // history archive. This issue is being fixed in Stellar-Core. -func (c *CaptiveStellarCore) PrepareRange(ledgerRange Range) error { - if alreadyPrepared, err := c.startPreparingRange(ledgerRange); err != nil { +func (c *CaptiveStellarCore) PrepareRange(ctx context.Context, ledgerRange Range) error { + if alreadyPrepared, err := c.startPreparingRange(ctx, ledgerRange); err != nil { return errors.Wrap(err, "error starting prepare range") } else if alreadyPrepared { return nil } - old := c.isBlocking() - c.setBlocking(true) - _, _, err := c.GetLedger(ledgerRange.from) - c.setBlocking(old) - + _, err := c.GetLedger(ctx, ledgerRange.from) if err != nil { return errors.Wrapf(err, "Error fast-forwarding to %d", ledgerRange.from) } @@ -413,7 +397,7 @@ func (c *CaptiveStellarCore) PrepareRange(ledgerRange Range) error { } // IsPrepared returns true if a given ledgerRange is prepared. -func (c *CaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { +func (c *CaptiveStellarCore) IsPrepared(ctx context.Context, ledgerRange Range) (bool, error) { c.stellarCoreLock.RLock() defer c.stellarCoreLock.RUnlock() @@ -454,51 +438,39 @@ func (c *CaptiveStellarCore) isPrepared(ledgerRange Range) bool { return false } -// GetLedgerBlocking works as GetLedger but will block until the ledger is -// available in the backend (even for UnboundedRange). -// Please note that requesting a ledger sequence far after current ledger will -// block the execution for a long time. -func (c *CaptiveStellarCore) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { - old := c.isBlocking() - c.setBlocking(true) - _, meta, err := c.GetLedger(sequence) - c.setBlocking(old) - return meta, err -} - -// GetLedger returns true when ledger is found and it's LedgerCloseMeta. -// Call PrepareRange first to instruct the backend which ledgers to fetch. +// GetLedger will block until the ledger is available in the backend +// (even for UnboundedRange), then return it's LedgerCloseMeta. // +// Call PrepareRange first to instruct the backend which ledgers to fetch. // CaptiveStellarCore requires PrepareRange call first to initialize Stellar-Core. // Requesting a ledger on non-prepared backend will return an error. // -// Because data is streamed from Stellar-Core ledger after ledger user should +// Please note that requesting a ledger sequence far after current +// ledger will block the execution for a long time. +// +// Because ledger data is streamed from Stellar-Core sequentially, users should // request sequences in a non-decreasing order. If the requested sequence number // is less than the last requested sequence number, an error will be returned. // // This function behaves differently for bounded and unbounded ranges: -// * BoundedRange makes GetLedger blocking if the requested ledger is not yet -// available in the ledger. After getting the last ledger in a range this -// method will also Close() the backend. -// * UnboundedRange makes GetLedger non-blocking. The method will return with -// the first argument equal false. -// This is done to provide maximum performance when streaming old ledgers. -func (c *CaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { +// * BoundedRange: After getting the last ledger in a range this method will +// also Close() the backend. +func (c *CaptiveStellarCore) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { c.stellarCoreLock.RLock() defer c.stellarCoreLock.RUnlock() if c.cachedMeta != nil && sequence == c.cachedMeta.LedgerSequence() { // GetLedger can be called multiple times using the same sequence, ex. to create // change and transaction readers. If we have this ledger buffered, let's return it. - return true, *c.cachedMeta, nil + return *c.cachedMeta, nil } if c.isClosed() { - return false, xdr.LedgerCloseMeta{}, errors.New("session is closed, call PrepareRange first") + return xdr.LedgerCloseMeta{}, errors.New("session is closed, call PrepareRange first") } if sequence < c.nextLedger { - return false, xdr.LedgerCloseMeta{}, errors.Errorf( + return xdr.LedgerCloseMeta{}, errors.Errorf( "requested ledger %d is behind the captive core stream (expected=%d)", sequence, c.nextLedger, @@ -506,7 +478,7 @@ func (c *CaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMe } if c.lastLedger != nil && sequence > *c.lastLedger { - return false, xdr.LedgerCloseMeta{}, errors.Errorf( + return xdr.LedgerCloseMeta{}, errors.Errorf( "reading past bounded range (requested sequence=%d, last ledger in range=%d)", sequence, *c.lastLedger, @@ -514,62 +486,66 @@ func (c *CaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMe } // Now loop along the range until we find the ledger we want. - var errOut error for { - if !c.isBlocking() && len(c.stellarCoreRunner.getMetaPipe()) == 0 { - return false, xdr.LedgerCloseMeta{}, nil + select { + case <-ctx.Done(): + return xdr.LedgerCloseMeta{}, ctx.Err() + case result, ok := <-c.stellarCoreRunner.getMetaPipe(): + found, ledger, err := c.handleMetaPipeResult(sequence, result, ok) + if found || err != nil { + return ledger, err + } } + } +} - result, ok := <-c.stellarCoreRunner.getMetaPipe() - if errOut = c.checkMetaPipeResult(result, ok); errOut != nil { - break - } +func (c *CaptiveStellarCore) handleMetaPipeResult(sequence uint32, result metaResult, ok bool) (bool, xdr.LedgerCloseMeta, error) { + if err := c.checkMetaPipeResult(result, ok); err != nil { + c.stellarCoreRunner.close() + return false, xdr.LedgerCloseMeta{}, err + } - seq := result.LedgerCloseMeta.LedgerSequence() - if seq != c.nextLedger { - // We got something unexpected; close and reset - errOut = errors.Errorf( - "unexpected ledger sequence (expected=%d actual=%d)", - c.nextLedger, - seq, - ) - break - } + seq := result.LedgerCloseMeta.LedgerSequence() + if seq != c.nextLedger { + // We got something unexpected; close and reset + c.stellarCoreRunner.close() + return false, xdr.LedgerCloseMeta{}, errors.Errorf( + "unexpected ledger sequence (expected=%d actual=%d)", + c.nextLedger, + seq, + ) + } - newPreviousLedgerHash := result.LedgerCloseMeta.PreviousLedgerHash().HexString() - if c.previousLedgerHash != nil && *c.previousLedgerHash != newPreviousLedgerHash { - // We got something unexpected; close and reset - errOut = errors.Errorf( - "unexpected previous ledger hash for ledger %d (expected=%s actual=%s)", - seq, - *c.previousLedgerHash, - newPreviousLedgerHash, - ) - break - } + newPreviousLedgerHash := result.LedgerCloseMeta.PreviousLedgerHash().HexString() + if c.previousLedgerHash != nil && *c.previousLedgerHash != newPreviousLedgerHash { + // We got something unexpected; close and reset + c.stellarCoreRunner.close() + return false, xdr.LedgerCloseMeta{}, errors.Errorf( + "unexpected previous ledger hash for ledger %d (expected=%s actual=%s)", + seq, + *c.previousLedgerHash, + newPreviousLedgerHash, + ) + } - c.nextLedger++ - currentLedgerHash := result.LedgerCloseMeta.LedgerHash().HexString() - c.previousLedgerHash = ¤tLedgerHash + c.nextLedger++ + currentLedgerHash := result.LedgerCloseMeta.LedgerHash().HexString() + c.previousLedgerHash = ¤tLedgerHash - // Update cache with the latest value because we incremented nextLedger. - c.cachedMeta = result.LedgerCloseMeta + // Update cache with the latest value because we incremented nextLedger. + c.cachedMeta = result.LedgerCloseMeta - if seq == sequence { - // If we got the _last_ ledger in a segment, close before returning. - if c.lastLedger != nil && *c.lastLedger == seq { - if err := c.stellarCoreRunner.close(); err != nil { - return false, xdr.LedgerCloseMeta{}, errors.Wrap(err, "error closing session") - } + if seq == sequence { + // If we got the _last_ ledger in a segment, close before returning. + if c.lastLedger != nil && *c.lastLedger == seq { + if err := c.stellarCoreRunner.close(); err != nil { + return false, xdr.LedgerCloseMeta{}, errors.Wrap(err, "error closing session") } - return true, *c.cachedMeta, nil } + return true, *c.cachedMeta, nil } - // All paths above that break out of the loop (instead of return) - // set errOut to non-nil: there was an error and we should close and - // reset state before retuning an error to our caller. - c.stellarCoreRunner.close() - return false, xdr.LedgerCloseMeta{}, errOut + + return false, xdr.LedgerCloseMeta{}, nil } func (c *CaptiveStellarCore) checkMetaPipeResult(result metaResult, ok bool) error { @@ -609,7 +585,7 @@ func (c *CaptiveStellarCore) checkMetaPipeResult(result metaResult, ok bool) err // Note that for UnboundedRange the returned sequence number is not necessarily // the latest sequence closed by the network. It's always the last value available // in the backend. -func (c *CaptiveStellarCore) GetLatestLedgerSequence() (uint32, error) { +func (c *CaptiveStellarCore) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { c.stellarCoreLock.RLock() defer c.stellarCoreLock.RUnlock() @@ -627,18 +603,6 @@ func (c *CaptiveStellarCore) isClosed() bool { return c.nextLedger == 0 || c.stellarCoreRunner == nil || c.stellarCoreRunner.context().Err() != nil } -func (c *CaptiveStellarCore) isBlocking() bool { - c.blockingLock.Lock() - defer c.blockingLock.Unlock() - return c.blocking -} - -func (c *CaptiveStellarCore) setBlocking(val bool) { - c.blockingLock.Lock() - c.blocking = val - c.blockingLock.Unlock() -} - // Close closes existing Stellar-Core process, streaming sessions and removes all // temporary files. Note, once a CaptiveStellarCore instance is closed it can can no longer be used and // all subsequent calls to PrepareRange(), GetLedger(), etc will fail. diff --git a/ingest/ledgerbackend/captive_core_backend_test.go b/ingest/ledgerbackend/captive_core_backend_test.go index 29aeb9aa22..4c510ce2c4 100644 --- a/ingest/ledgerbackend/captive_core_backend_test.go +++ b/ingest/ledgerbackend/captive_core_backend_test.go @@ -187,7 +187,7 @@ func TestCaptivePrepareRange(t *testing.T) { }), } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.NoError(t, err) mockRunner.On("close").Return(nil).Once() err = captiveBackend.Close() @@ -223,7 +223,7 @@ func TestCaptivePrepareRangeCrash(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.EqualError(t, err, "Error fast-forwarding to 100: stellar core exited unexpectedly: exit code -1") mockRunner.AssertExpectations(t) mockArchive.AssertExpectations(t) @@ -262,7 +262,7 @@ func TestCaptivePrepareRangeTerminated(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.NoError(t, err) mockRunner.AssertExpectations(t) mockArchive.AssertExpectations(t) @@ -279,16 +279,17 @@ func TestCaptivePrepareRange_ErrClosingSession(t *testing.T) { stellarCoreRunner: mockRunner, } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.EqualError(t, err, "error starting prepare range: error closing existing session: transient error") - err = captiveBackend.PrepareRange(UnboundedRange(64)) + err = captiveBackend.PrepareRange(ctx, UnboundedRange(64)) assert.EqualError(t, err, "error starting prepare range: error closing existing session: transient error") mockRunner.AssertExpectations(t) } func TestCaptivePrepareRange_ErrGettingRootHAS(t *testing.T) { + ctx := context.Background() mockArchive := &historyarchive.MockArchive{} mockArchive. On("GetRootHAS"). @@ -298,16 +299,17 @@ func TestCaptivePrepareRange_ErrGettingRootHAS(t *testing.T) { archive: mockArchive, } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: error getting latest checkpoint sequence: error getting root HAS: transient error") - err = captiveBackend.PrepareRange(UnboundedRange(100)) + err = captiveBackend.PrepareRange(ctx, UnboundedRange(100)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: error getting latest checkpoint sequence: error getting root HAS: transient error") mockArchive.AssertExpectations(t) } func TestCaptivePrepareRange_FromIsAheadOfRootHAS(t *testing.T) { + ctx := context.Background() mockArchive := &historyarchive.MockArchive{} mockArchive. On("GetRootHAS"). @@ -319,10 +321,10 @@ func TestCaptivePrepareRange_FromIsAheadOfRootHAS(t *testing.T) { archive: mockArchive, } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: sequence: 100 is greater than max available in history archives: 64") - err = captiveBackend.PrepareRange(UnboundedRange(100)) + err = captiveBackend.PrepareRange(ctx, UnboundedRange(100)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: trying to start online mode too far (latest checkpoint=64), only two checkpoints in the future allowed") mockArchive.AssertExpectations(t) @@ -361,7 +363,7 @@ func TestCaptivePrepareRange_ToIsAheadOfRootHAS(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.NoError(t, err) mockArchive.AssertExpectations(t) @@ -380,6 +382,7 @@ func TestCaptivePrepareRange_ErrCatchup(t *testing.T) { CurrentLedger: uint32(192), }, nil) + ctx := context.Background() cancelCalled := false captiveBackend := CaptiveStellarCore{ archive: mockArchive, @@ -391,7 +394,7 @@ func TestCaptivePrepareRange_ErrCatchup(t *testing.T) { }), } - err := captiveBackend.PrepareRange(BoundedRange(100, 200)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(100, 200)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: error running stellar-core: transient error") // make sure we can Close without errors @@ -418,6 +421,7 @@ func TestCaptivePrepareRangeUnboundedRange_ErrRunFrom(t *testing.T) { On("GetLedgerHeader", uint32(127)). Return(xdr.LedgerHeaderHistoryEntry{}, nil) + ctx := context.Background() cancelCalled := false captiveBackend := CaptiveStellarCore{ archive: mockArchive, @@ -430,7 +434,7 @@ func TestCaptivePrepareRangeUnboundedRange_ErrRunFrom(t *testing.T) { }), } - err := captiveBackend.PrepareRange(UnboundedRange(128)) + err := captiveBackend.PrepareRange(ctx, UnboundedRange(128)) assert.EqualError(t, err, "error starting prepare range: opening subprocess: error running stellar-core: transient error") // make sure we can Close without errors @@ -477,11 +481,11 @@ func TestCaptivePrepareRangeUnboundedRange_ReuseSession(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(UnboundedRange(65)) + err := captiveBackend.PrepareRange(ctx, UnboundedRange(65)) assert.NoError(t, err) captiveBackend.nextLedger = 64 - err = captiveBackend.PrepareRange(UnboundedRange(65)) + err = captiveBackend.PrepareRange(ctx, UnboundedRange(65)) assert.NoError(t, err) mockArchive.AssertExpectations(t) @@ -525,10 +529,10 @@ func TestGetLatestLedgerSequence(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(UnboundedRange(64)) + err := captiveBackend.PrepareRange(ctx, UnboundedRange(64)) assert.NoError(t, err) - latest, err := captiveBackend.GetLatestLedgerSequence() + latest, err := captiveBackend.GetLatestLedgerSequence(ctx) assert.NoError(t, err) assert.Equal(t, uint32(200), latest) @@ -570,23 +574,22 @@ func TestCaptiveGetLedger(t *testing.T) { } // requires PrepareRange - _, _, err := captiveBackend.GetLedger(64) + _, err := captiveBackend.GetLedger(ctx, 64) tt.EqualError(err, "session is closed, call PrepareRange first") - err = captiveBackend.PrepareRange(BoundedRange(65, 66)) + err = captiveBackend.PrepareRange(ctx, BoundedRange(65, 66)) assert.NoError(t, err) - _, _, err = captiveBackend.GetLedger(64) + _, err = captiveBackend.GetLedger(ctx, 64) tt.Error(err, "requested ledger 64 is behind the captive core stream (expected=66)") // reads value from buffer - found, meta, err := captiveBackend.GetLedger(65) + meta, err := captiveBackend.GetLedger(ctx, 65) tt.NoError(err) - tt.True(found) tt.Equal(xdr.Uint32(65), meta.V0.LedgerHeader.Header.LedgerSeq) // reads value from cachedMeta - _, cachedMeta, err := captiveBackend.GetLedger(65) + cachedMeta, err := captiveBackend.GetLedger(ctx, 65) tt.NoError(err) tt.Equal(meta, cachedMeta) @@ -597,14 +600,14 @@ func TestCaptiveGetLedger(t *testing.T) { cancel() }).Once() - _, _, err = captiveBackend.GetLedger(66) + _, err = captiveBackend.GetLedger(ctx, 66) tt.NoError(err) // closes after last ledger is consumed tt.True(captiveBackend.isClosed()) // we should be able to call last ledger even after get ledger is closed - _, _, err = captiveBackend.GetLedger(66) + _, err = captiveBackend.GetLedger(ctx, 66) tt.NoError(err) mockArchive.AssertExpectations(t) @@ -618,6 +621,8 @@ func TestCaptiveGetLedger(t *testing.T) { // // Before 3d97762 this test failed because cachedMeta was only updated when // the ledger with a requested sequence was reached while streaming meta. +// +// TODO: Not sure this test is really valid or worth it anymore, now that GetLedger is always blocking. func TestCaptiveGetLedgerCacheLatestLedger(t *testing.T) { tt := assert.New(t) metaChan := make(chan metaResult, 300) @@ -659,18 +664,17 @@ func TestCaptiveGetLedgerCacheLatestLedger(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(UnboundedRange(66)) + err := captiveBackend.PrepareRange(ctx, UnboundedRange(66)) assert.NoError(t, err) - found, _, err := captiveBackend.GetLedger(68) - tt.NoError(err) - tt.False(found) - tt.Equal(uint32(67), captiveBackend.cachedMeta.LedgerSequence()) - tt.Equal(uint32(68), captiveBackend.nextLedger) + // found, _, err := captiveBackend.GetLedger(ctx, 68) + // tt.NoError(err) + // tt.False(found) + // tt.Equal(uint32(67), captiveBackend.cachedMeta.LedgerSequence()) + // tt.Equal(uint32(68), captiveBackend.nextLedger) - found, meta, err := captiveBackend.GetLedger(67) + meta, err := captiveBackend.GetLedger(ctx, 67) tt.NoError(err) - tt.True(found) tt.Equal(uint32(67), meta.LedgerSequence()) mockArchive.AssertExpectations(t) @@ -715,10 +719,10 @@ func TestCaptiveGetLedger_NextLedgerIsDifferentToLedgerFromBuffer(t *testing.T) checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(65, 66)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(65, 66)) assert.NoError(t, err) - _, _, err = captiveBackend.GetLedger(66) + _, err = captiveBackend.GetLedger(ctx, 66) assert.EqualError(t, err, "unexpected ledger sequence (expected=66 actual=68)") mockArchive.AssertExpectations(t) @@ -726,6 +730,7 @@ func TestCaptiveGetLedger_NextLedgerIsDifferentToLedgerFromBuffer(t *testing.T) } func TestCaptiveStellarCore_PrepareRangeAfterClose(t *testing.T) { + ctx := context.Background() executablePath := "/etc/stellar-core" networkPassphrase := network.PublicNetworkPassphrase historyURLs := []string{"http://localhost"} @@ -743,7 +748,7 @@ func TestCaptiveStellarCore_PrepareRangeAfterClose(t *testing.T) { assert.EqualError( t, - captiveStellarCore.PrepareRange(BoundedRange(65, 66)), + captiveStellarCore.PrepareRange(ctx, BoundedRange(65, 66)), "error starting prepare range: opening subprocess: error getting latest checkpoint sequence: "+ "error getting root HAS: Get \"http://localhost/.well-known/stellar-history.json\": context canceled", ) @@ -758,7 +763,7 @@ func TestCaptiveStellarCore_PrepareRangeAfterClose(t *testing.T) { captiveStellarCore.archive = mockArchive assert.EqualError( t, - captiveStellarCore.PrepareRange(BoundedRange(65, 66)), + captiveStellarCore.PrepareRange(ctx, BoundedRange(65, 66)), "error starting prepare range: opening subprocess: error running stellar-core: context canceled", ) mockArchive.AssertExpectations(t) @@ -805,16 +810,15 @@ func TestCaptiveGetLedger_ErrReadingMetaResult(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(65, 66)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(65, 66)) assert.NoError(t, err) - found, meta, err := captiveBackend.GetLedger(65) + meta, err := captiveBackend.GetLedger(ctx, 65) tt.NoError(err) - tt.True(found) tt.Equal(xdr.Uint32(65), meta.V0.LedgerHeader.Header.LedgerSeq) // try reading from an empty buffer - _, _, err = captiveBackend.GetLedger(66) + _, err = captiveBackend.GetLedger(ctx, 66) tt.EqualError(err, "unmarshalling error") // closes if there is an error getting ledger @@ -857,10 +861,10 @@ func TestCaptiveGetLedger_ErrClosingAfterLastLedger(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(65, 66)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(65, 66)) assert.NoError(t, err) - _, _, err = captiveBackend.GetLedger(66) + _, err = captiveBackend.GetLedger(ctx, 66) tt.EqualError(err, "error closing session: transient error") mockArchive.AssertExpectations(t) @@ -901,20 +905,20 @@ func TestCaptiveAfterClose(t *testing.T) { } boundedRange := BoundedRange(65, 66) - err := captiveBackend.PrepareRange(boundedRange) + err := captiveBackend.PrepareRange(ctx, boundedRange) assert.NoError(t, err) assert.NoError(t, captiveBackend.Close()) - _, _, err = captiveBackend.GetLedger(boundedRange.to) + _, err = captiveBackend.GetLedger(ctx, boundedRange.to) assert.EqualError(t, err, "session is closed, call PrepareRange first") var prepared bool - prepared, err = captiveBackend.IsPrepared(boundedRange) + prepared, err = captiveBackend.IsPrepared(ctx, boundedRange) assert.False(t, prepared) assert.NoError(t, err) - _, err = captiveBackend.GetLatestLedgerSequence() + _, err = captiveBackend.GetLatestLedgerSequence(ctx) assert.EqualError(t, err, "stellar-core must be opened to return latest available sequence") mockArchive.AssertExpectations(t) @@ -952,21 +956,19 @@ func TestGetLedgerBoundsCheck(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(128, 130)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(128, 130)) assert.NoError(t, err) - exists, meta, err := captiveBackend.GetLedger(128) + meta, err := captiveBackend.GetLedger(ctx, 128) assert.NoError(t, err) - assert.True(t, exists) assert.Equal(t, uint32(128), meta.LedgerSequence()) prev := meta - exists, meta, err = captiveBackend.GetLedger(128) + meta, err = captiveBackend.GetLedger(ctx, 128) assert.NoError(t, err) - assert.True(t, exists) assert.Equal(t, prev, meta) - _, _, err = captiveBackend.GetLedger(64) + _, err = captiveBackend.GetLedger(ctx, 64) assert.EqualError(t, err, "requested ledger 64 is behind the captive core stream (expected=129)") mockArchive.AssertExpectations(t) @@ -1056,15 +1058,14 @@ func TestCaptiveGetLedgerTerminatedUnexpectedly(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(BoundedRange(64, 100)) + err := captiveBackend.PrepareRange(ctx, BoundedRange(64, 100)) assert.NoError(t, err) - exists, meta, err := captiveBackend.GetLedger(64) + meta, err := captiveBackend.GetLedger(ctx, 64) assert.NoError(t, err) - assert.True(t, exists) assert.Equal(t, uint32(64), meta.LedgerSequence()) - _, _, err = captiveBackend.GetLedger(65) + _, err = captiveBackend.GetLedger(ctx, 65) assert.EqualError(t, err, testCase.expectedError) mockArchive.AssertExpectations(t) @@ -1074,6 +1075,7 @@ func TestCaptiveGetLedgerTerminatedUnexpectedly(t *testing.T) { } func TestCaptiveUseOfLedgerHashStore(t *testing.T) { + ctx := context.Background() mockArchive := &historyarchive.MockArchive{} mockArchive. On("GetLedgerHeader", uint32(255)). @@ -1084,15 +1086,15 @@ func TestCaptiveUseOfLedgerHashStore(t *testing.T) { }, nil) mockLedgerHashStore := &MockLedgerHashStore{} - mockLedgerHashStore.On("GetLedgerHash", uint32(1022)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(1022)). Return("", false, fmt.Errorf("transient error")).Once() - mockLedgerHashStore.On("GetLedgerHash", uint32(254)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(254)). Return("", false, nil).Once() - mockLedgerHashStore.On("GetLedgerHash", uint32(62)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(62)). Return("cde", true, nil).Once() - mockLedgerHashStore.On("GetLedgerHash", uint32(126)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(126)). Return("ghi", true, nil).Once() - mockLedgerHashStore.On("GetLedgerHash", uint32(2)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(2)). Return("mnb", true, nil).Once() cancelCalled := false @@ -1105,28 +1107,28 @@ func TestCaptiveUseOfLedgerHashStore(t *testing.T) { }), } - runFrom, ledgerHash, nextLedger, err := captiveBackend.runFromParams(24) + runFrom, ledgerHash, nextLedger, err := captiveBackend.runFromParams(ctx, 24) assert.NoError(t, err) assert.Equal(t, uint32(2), runFrom) assert.Equal(t, "mnb", ledgerHash) assert.Equal(t, uint32(2), nextLedger) - runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(86) + runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(ctx, 86) assert.NoError(t, err) assert.Equal(t, uint32(62), runFrom) assert.Equal(t, "cde", ledgerHash) assert.Equal(t, uint32(2), nextLedger) - runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(128) + runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(ctx, 128) assert.NoError(t, err) assert.Equal(t, uint32(126), runFrom) assert.Equal(t, "ghi", ledgerHash) assert.Equal(t, uint32(64), nextLedger) - runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(1050) + runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(ctx, 1050) assert.EqualError(t, err, "error trying to read ledger hash 1022: transient error") - runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(300) + runFrom, ledgerHash, nextLedger, err = captiveBackend.runFromParams(ctx, 300) assert.NoError(t, err) assert.Equal(t, uint32(254), runFrom, "runFrom") assert.Equal(t, "0101010100000000000000000000000000000000000000000000000000000000", ledgerHash) @@ -1184,7 +1186,8 @@ func TestCaptiveRunFromParams(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - runFrom, ledgerHash, nextLedger, err := captiveBackend.runFromParams(tc.from) + ctx := context.Background() + runFrom, ledgerHash, nextLedger, err := captiveBackend.runFromParams(ctx, tc.from) tt.NoError(err) tt.Equal(tc.runFrom, runFrom, "runFrom") tt.Equal("0101010100000000000000000000000000000000000000000000000000000000", ledgerHash) @@ -1292,9 +1295,9 @@ func TestCaptivePreviousLedgerCheck(t *testing.T) { }, nil).Once() mockLedgerHashStore := &MockLedgerHashStore{} - mockLedgerHashStore.On("GetLedgerHash", uint32(254)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(254)). Return("", false, nil).Once() - mockLedgerHashStore.On("GetLedgerHash", uint32(191)). + mockLedgerHashStore.On("GetLedgerHash", ctx, uint32(191)). Return("0200000000000000000000000000000000000000000000000000000000000000", true, nil).Once() captiveBackend := CaptiveStellarCore{ @@ -1306,17 +1309,16 @@ func TestCaptivePreviousLedgerCheck(t *testing.T) { checkpointManager: historyarchive.NewCheckpointManager(64), } - err := captiveBackend.PrepareRange(UnboundedRange(300)) + err := captiveBackend.PrepareRange(ctx, UnboundedRange(300)) assert.NoError(t, err) - exists, meta, err := captiveBackend.GetLedger(300) + meta, err := captiveBackend.GetLedger(ctx, 300) assert.NoError(t, err) - assert.True(t, exists) assert.NotNil(t, captiveBackend.previousLedgerHash) assert.Equal(t, uint32(301), captiveBackend.nextLedger) assert.Equal(t, meta.LedgerHash().HexString(), *captiveBackend.previousLedgerHash) - _, _, err = captiveBackend.GetLedger(301) + _, err = captiveBackend.GetLedger(ctx, 301) assert.EqualError(t, err, "unexpected previous ledger hash for ledger 301 (expected=6f00000000000000000000000000000000000000000000000000000000000000 actual=0000000000000000000000000000000000000000000000000000000000000000)") mockRunner.AssertExpectations(t) diff --git a/ingest/ledgerbackend/database_backend.go b/ingest/ledgerbackend/database_backend.go index 0cd19a79b0..8586a072c2 100644 --- a/ingest/ledgerbackend/database_backend.go +++ b/ingest/ledgerbackend/database_backend.go @@ -27,67 +27,51 @@ var _ LedgerBackend = (*DatabaseBackend)(nil) // DatabaseBackend implements a database data store. type DatabaseBackend struct { - cancel context.CancelFunc - ctx context.Context networkPassphrase string session session } -func NewDatabaseBackend(ctx context.Context, dataSourceName, networkPassphrase string) (*DatabaseBackend, error) { +func NewDatabaseBackend(dataSourceName, networkPassphrase string) (*DatabaseBackend, error) { session, err := createSession(dataSourceName) if err != nil { return nil, err } - return NewDatabaseBackendFromSession(ctx, session, networkPassphrase) + return NewDatabaseBackendFromSession(session, networkPassphrase) } -func NewDatabaseBackendFromSession(ctx context.Context, session *db.Session, networkPassphrase string) (*DatabaseBackend, error) { - // TODO: To avoid changing the LedgerBackend interface in this call we create - // a context once for this, so that Close() can cancel any in-progress method-calls. - ctx, cancel := context.WithCancel(ctx) - +func NewDatabaseBackendFromSession(session *db.Session, networkPassphrase string) (*DatabaseBackend, error) { return &DatabaseBackend{ - cancel: cancel, - ctx: ctx, session: session, networkPassphrase: networkPassphrase, }, nil } -func (dbb *DatabaseBackend) PrepareRange(ledgerRange Range) error { - fromExists, _, err := dbb.GetLedger(ledgerRange.from) +func (dbb *DatabaseBackend) PrepareRange(ctx context.Context, ledgerRange Range) error { + _, err := dbb.GetLedger(ctx, ledgerRange.from) if err != nil { return errors.Wrap(err, "error getting ledger") } - if !fromExists { - return errors.New("`from` ledger does not exist") - } - if ledgerRange.bounded { - toExists, _, err := dbb.GetLedger(ledgerRange.to) + _, err := dbb.GetLedger(ctx, ledgerRange.to) if err != nil { return errors.Wrap(err, "error getting ledger") } - - if !toExists { - return errors.New("`to` ledger does not exist") - } } return nil } // IsPrepared returns true if a given ledgerRange is prepared. -func (*DatabaseBackend) IsPrepared(ledgerRange Range) (bool, error) { +func (*DatabaseBackend) IsPrepared(ctx context.Context, ledgerRange Range) (bool, error) { return true, nil } // GetLatestLedgerSequence returns the most recent ledger sequence number present in the database. -func (dbb *DatabaseBackend) GetLatestLedgerSequence() (uint32, error) { +func (dbb *DatabaseBackend) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { var ledger []ledgerHeader - err := dbb.session.SelectRaw(dbb.ctx, &ledger, latestLedgerSeqQuery) + err := dbb.session.SelectRaw(ctx, &ledger, latestLedgerSeqQuery) if err != nil { return 0, errors.Wrap(err, "couldn't select ledger sequence") } @@ -130,13 +114,13 @@ func sortByHash(transactions []xdr.TransactionEnvelope, passphrase string) error return nil } -// GetLedgerBlocking works as GetLedger but will block until the ledger is +// GetLedger will block until the ledger is // available in the backend (even for UnaboundedRange). // Please note that requesting a ledger sequence far after current ledger will // block the execution for a long time. -func (dbb *DatabaseBackend) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { +func (dbb *DatabaseBackend) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { for { - exists, meta, err := dbb.GetLedger(sequence) + exists, meta, err := dbb.getLedgerQuery(ctx, sequence) if err != nil { return xdr.LedgerCloseMeta{}, err } @@ -149,9 +133,9 @@ func (dbb *DatabaseBackend) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseM } } -// GetLedger returns the LedgerCloseMeta for the given ledger sequence number. +// getLedgerQuery returns the LedgerCloseMeta for the given ledger sequence number. // The first returned value is false when the ledger does not exist in the database. -func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { +func (dbb *DatabaseBackend) getLedgerQuery(ctx context.Context, sequence uint32) (bool, xdr.LedgerCloseMeta, error) { lcm := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{}, } @@ -159,7 +143,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - ledgerheader var lRow ledgerHeaderHistory - err := dbb.session.GetRaw(dbb.ctx, &lRow, ledgerHeaderQuery, sequence) + err := dbb.session.GetRaw(ctx, &lRow, ledgerHeaderQuery, sequence) // Return errors... if err != nil { switch err { @@ -180,7 +164,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - txhistory var txhRows []txHistory - err = dbb.session.SelectRaw(dbb.ctx, &txhRows, txHistoryQuery+orderBy, sequence) + err = dbb.session.SelectRaw(ctx, &txhRows, txHistoryQuery+orderBy, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting txHistory") @@ -206,7 +190,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - txfeehistory var txfhRows []txFeeHistory - err = dbb.session.SelectRaw(dbb.ctx, &txfhRows, txFeeHistoryQuery+orderBy, sequence) + err = dbb.session.SelectRaw(ctx, &txfhRows, txFeeHistoryQuery+orderBy, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting txFeeHistory") @@ -223,7 +207,7 @@ func (dbb *DatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMet // Query - upgradehistory var upgradeHistoryRows []upgradeHistory - err = dbb.session.SelectRaw(dbb.ctx, &upgradeHistoryRows, upgradeHistoryQuery, sequence) + err = dbb.session.SelectRaw(ctx, &upgradeHistoryRows, upgradeHistoryQuery, sequence) // Return errors... if err != nil { return false, lcm, errors.Wrap(err, "Error getting upgradeHistoryRows") @@ -252,6 +236,5 @@ func createSession(dataSourceName string) (*db.Session, error) { // Close disconnects an active database session. func (dbb *DatabaseBackend) Close() error { - dbb.cancel() return dbb.session.Close() } diff --git a/ingest/ledgerbackend/ledger_backend.go b/ingest/ledgerbackend/ledger_backend.go index 2e2a7db1de..572de2e183 100644 --- a/ingest/ledgerbackend/ledger_backend.go +++ b/ingest/ledgerbackend/ledger_backend.go @@ -10,17 +10,15 @@ import ( type LedgerBackend interface { // GetLatestLedgerSequence returns the sequence of the latest ledger available // in the backend. - GetLatestLedgerSequence() (sequence uint32, err error) - // The first returned value is false when the ledger does not exist in a backend. - GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) - // Works like GetLedger but will block until the ledger is available. - GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) + GetLatestLedgerSequence(ctx context.Context) (sequence uint32, err error) + // GetLedger will block until the ledger is available. + GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) // PrepareRange prepares the given range (including from and to) to be loaded. // Some backends (like captive stellar-core) need to initalize data to be // able to stream ledgers. Blocks until the first ledger is available. - PrepareRange(ledgerRange Range) error + PrepareRange(ctx context.Context, ledgerRange Range) error // IsPrepared returns true if a given ledgerRange is prepared. - IsPrepared(ledgerRange Range) (bool, error) + IsPrepared(ctx context.Context, ledgerRange Range) (bool, error) Close() error } diff --git a/ingest/ledgerbackend/ledger_hash_store.go b/ingest/ledgerbackend/ledger_hash_store.go index 13cd3e4d6d..d0eeefa5a9 100644 --- a/ingest/ledgerbackend/ledger_hash_store.go +++ b/ingest/ledgerbackend/ledger_hash_store.go @@ -14,34 +14,27 @@ import ( // source like history archives. type TrustedLedgerHashStore interface { // GetLedgerHash returns the ledger hash for the given sequence number - GetLedgerHash(seq uint32) (string, bool, error) + GetLedgerHash(ctx context.Context, seq uint32) (string, bool, error) Close() error } // HorizonDBLedgerHashStore is a TrustedLedgerHashStore which uses horizon's db to look up ledger hashes type HorizonDBLedgerHashStore struct { - cancel context.CancelFunc - ctx context.Context session *db.Session } // NewHorizonDBLedgerHashStore constructs a new TrustedLedgerHashStore backed by the horizon db -func NewHorizonDBLedgerHashStore(ctx context.Context, session *db.Session) TrustedLedgerHashStore { - ctx, cancel := context.WithCancel(ctx) - return HorizonDBLedgerHashStore{ - cancel: cancel, - ctx: ctx, - session: session, - } +func NewHorizonDBLedgerHashStore(session *db.Session) TrustedLedgerHashStore { + return HorizonDBLedgerHashStore{session: session} } // GetLedgerHash returns the ledger hash for the given sequence number -func (h HorizonDBLedgerHashStore) GetLedgerHash(seq uint32) (string, bool, error) { +func (h HorizonDBLedgerHashStore) GetLedgerHash(ctx context.Context, seq uint32) (string, bool, error) { sql := sq.Select("hl.ledger_hash").From("history_ledgers hl"). Limit(1).Where("sequence = ?", seq) var hash string - err := h.session.Get(h.ctx, &hash, sql) + err := h.session.Get(ctx, &hash, sql) if h.session.NoRows(err) { return hash, false, nil } @@ -49,7 +42,6 @@ func (h HorizonDBLedgerHashStore) GetLedgerHash(seq uint32) (string, bool, error } func (h HorizonDBLedgerHashStore) Close() error { - h.cancel() return h.session.Close() } @@ -59,8 +51,8 @@ type MockLedgerHashStore struct { } // GetLedgerHash returns the ledger hash for the given sequence number -func (m *MockLedgerHashStore) GetLedgerHash(seq uint32) (string, bool, error) { - args := m.Called(seq) +func (m *MockLedgerHashStore) GetLedgerHash(ctx context.Context, seq uint32) (string, bool, error) { + args := m.Called(ctx, seq) return args.Get(0).(string), args.Get(1).(bool), args.Error(2) } diff --git a/ingest/ledgerbackend/mock_database_backend.go b/ingest/ledgerbackend/mock_database_backend.go index 67d9a367d7..c5f85ecef7 100644 --- a/ingest/ledgerbackend/mock_database_backend.go +++ b/ingest/ledgerbackend/mock_database_backend.go @@ -1,6 +1,8 @@ package ledgerbackend import ( + "context" + "github.com/stretchr/testify/mock" "github.com/stellar/go/xdr" @@ -12,28 +14,23 @@ type MockDatabaseBackend struct { mock.Mock } -func (m *MockDatabaseBackend) GetLatestLedgerSequence() (uint32, error) { - args := m.Called() +func (m *MockDatabaseBackend) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *MockDatabaseBackend) PrepareRange(ledgerRange Range) error { - args := m.Called(ledgerRange) +func (m *MockDatabaseBackend) PrepareRange(ctx context.Context, ledgerRange Range) error { + args := m.Called(ctx, ledgerRange) return args.Error(0) } -func (m *MockDatabaseBackend) IsPrepared(ledgerRange Range) (bool, error) { - args := m.Called(ledgerRange) +func (m *MockDatabaseBackend) IsPrepared(ctx context.Context, ledgerRange Range) (bool, error) { + args := m.Called(ctx, ledgerRange) return args.Bool(0), args.Error(1) } -func (m *MockDatabaseBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { - args := m.Called(sequence) - return args.Bool(0), args.Get(1).(xdr.LedgerCloseMeta), args.Error(2) -} - -func (m *MockDatabaseBackend) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { - args := m.Called(sequence) +func (m *MockDatabaseBackend) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { + args := m.Called(ctx, sequence) return args.Get(0).(xdr.LedgerCloseMeta), args.Error(1) } diff --git a/ingest/ledgerbackend/remote_captive_core.go b/ingest/ledgerbackend/remote_captive_core.go index 52332ac76e..18946a8d3c 100644 --- a/ingest/ledgerbackend/remote_captive_core.go +++ b/ingest/ledgerbackend/remote_captive_core.go @@ -31,8 +31,7 @@ type LatestLedgerSequenceResponse struct { // LedgerResponse is the response for the GetLedger command. type LedgerResponse struct { - Present bool `json:"present"` - Ledger Base64Ledger `json:"ledger"` + Ledger Base64Ledger `json:"ledger"` } // Base64Ledger extends xdr.LedgerCloseMeta with JSON encoding and decoding @@ -66,8 +65,6 @@ type RemoteCaptiveStellarCore struct { url *url.URL client *http.Client lock *sync.Mutex - cancel context.CancelFunc - parentCtx context.Context prepareRangePollInterval time.Duration } @@ -85,7 +82,7 @@ func PrepareRangePollInterval(d time.Duration) RemoteCaptiveOption { // NewRemoteCaptive returns a new RemoteCaptiveStellarCore instance. // // Only the captiveCoreURL parameter is required. -func NewRemoteCaptive(ctx context.Context, captiveCoreURL string, options ...RemoteCaptiveOption) (RemoteCaptiveStellarCore, error) { +func NewRemoteCaptive(captiveCoreURL string, options ...RemoteCaptiveOption) (RemoteCaptiveStellarCore, error) { u, err := url.Parse(captiveCoreURL) if err != nil { return RemoteCaptiveStellarCore{}, errors.Wrap(err, "unparseable url") @@ -94,9 +91,8 @@ func NewRemoteCaptive(ctx context.Context, captiveCoreURL string, options ...Rem client := RemoteCaptiveStellarCore{ prepareRangePollInterval: time.Second, url: u, - client: &http.Client{Timeout: 5 * time.Second}, + client: &http.Client{Timeout: 10 * time.Second}, lock: &sync.Mutex{}, - parentCtx: ctx, } for _, option := range options { option(&client) @@ -129,13 +125,17 @@ func decodeResponse(response *http.Response, payload interface{}) error { // Note that for UnboundedRange the returned sequence number is not necessarily // the latest sequence closed by the network. It's always the last value available // in the backend. -func (c RemoteCaptiveStellarCore) GetLatestLedgerSequence() (sequence uint32, err error) { +func (c RemoteCaptiveStellarCore) GetLatestLedgerSequence(ctx context.Context) (sequence uint32, err error) { // TODO: Have a context on this request so we can cancel all outstanding // requests, not just PrepareRange. u := *c.url u.Path = path.Join(u.Path, "latest-sequence") + request, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil) + if err != nil { + return 0, errors.Wrap(err, "cannot construct http request") + } - response, err := c.client.Get(u.String()) + response, err := c.client.Do(request) if err != nil { return 0, errors.Wrap(err, "failed to execute request") } @@ -150,29 +150,9 @@ func (c RemoteCaptiveStellarCore) GetLatestLedgerSequence() (sequence uint32, er // Close cancels any pending PrepareRange requests. func (c RemoteCaptiveStellarCore) Close() error { - c.lock.Lock() - defer c.lock.Unlock() - if c.cancel != nil { - c.cancel() - } return nil } -func (c RemoteCaptiveStellarCore) createContext() context.Context { - c.lock.Lock() - defer c.lock.Unlock() - - // Cancel any outstanding PrepareRange request - if c.cancel != nil { - c.cancel() - } - - // Make a new context for this new request. - ctx, cancel := context.WithCancel(c.parentCtx) - c.cancel = cancel - return ctx -} - // PrepareRange prepares the given range (including from and to) to be loaded. // Captive stellar-core backend needs to initalize Stellar-Core state to be // able to stream ledgers. @@ -182,36 +162,20 @@ func (c RemoteCaptiveStellarCore) createContext() context.Context { // it normally (including connecting to the Stellar network). // Please note that using a BoundedRange, currently, requires a full-trust on // history archive. This issue is being fixed in Stellar-Core. -func (c RemoteCaptiveStellarCore) PrepareRange(ledgerRange Range) error { - ctx := c.createContext() - u := *c.url - u.Path = path.Join(u.Path, "prepare-range") - rangeBytes, err := json.Marshal(ledgerRange) - if err != nil { - return errors.Wrap(err, "cannot serialize range") - } +func (c RemoteCaptiveStellarCore) PrepareRange(ctx context.Context, ledgerRange Range) error { + // TODO: removing createContext call here means we could technically have + // multiple prepareRange requests happening at the same time. Do we still + // need to enforce that? timer := time.NewTimer(c.prepareRangePollInterval) defer timer.Stop() for { - req, err := http.NewRequestWithContext(ctx, http.MethodPost, u.String(), bytes.NewReader(rangeBytes)) - if err != nil { - return errors.Wrap(err, "cannot construct http request") - } - - var response *http.Response - response, err = c.client.Do(req) + ready, err := c.IsPrepared(ctx, ledgerRange) if err != nil { - return errors.Wrap(err, "failed to execute request") - } - - var parsed PrepareRangeResponse - if err = decodeResponse(response, &parsed); err != nil { return err } - - if parsed.Ready { + if ready { return nil } @@ -225,9 +189,9 @@ func (c RemoteCaptiveStellarCore) PrepareRange(ledgerRange Range) error { } // IsPrepared returns true if a given ledgerRange is prepared. -func (c RemoteCaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { - // TODO: Have a context on this request so we can cancel all outstanding - // requests, not just PrepareRange. +func (c RemoteCaptiveStellarCore) IsPrepared(ctx context.Context, ledgerRange Range) (bool, error) { + // TODO: Have some way to cancel all outstanding requests, not just + // PrepareRange. u := *c.url u.Path = path.Join(u.Path, "prepare-range") rangeBytes, err := json.Marshal(ledgerRange) @@ -235,9 +199,14 @@ func (c RemoteCaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { return false, errors.Wrap(err, "cannot serialize range") } body := bytes.NewReader(rangeBytes) + request, err := http.NewRequestWithContext(ctx, "POST", u.String(), body) + if err != nil { + return false, errors.Wrap(err, "cannot construct http request") + } + request.Header.Add("Content-Type", "application/json; charset=utf-8") var response *http.Response - response, err = c.client.Post(u.String(), "application/json; charset=utf-8", body) + response, err = c.client.Do(request) if err != nil { return false, errors.Wrap(err, "failed to execute request") } @@ -250,53 +219,43 @@ func (c RemoteCaptiveStellarCore) IsPrepared(ledgerRange Range) (bool, error) { return parsed.Ready, nil } -// GetLedger returns true when ledger is found and it's LedgerCloseMeta. +// GetLedger long-polls a remote stellar core backend, until the requested +// ledger is ready. + // Call PrepareRange first to instruct the backend which ledgers to fetch. // -// CaptiveStellarCore requires PrepareRange call first to initialize Stellar-Core. // Requesting a ledger on non-prepared backend will return an error. // // Because data is streamed from Stellar-Core ledger after ledger user should // request sequences in a non-decreasing order. If the requested sequence number // is less than the last requested sequence number, an error will be returned. -// -// This function behaves differently for bounded and unbounded ranges: -// * BoundedRange makes GetLedger blocking if the requested ledger is not yet -// available in the ledger. After getting the last ledger in a range this -// method will also Close() the backend. -// * UnboundedRange makes GetLedger non-blocking. The method will return with -// the first argument equal false. -// This is done to provide maximum performance when streaming old ledgers. -func (c RemoteCaptiveStellarCore) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { - // TODO: Have a context on this request so we can cancel all outstanding - // requests, not just PrepareRange. - u := *c.url - u.Path = path.Join(u.Path, "ledger", strconv.FormatUint(uint64(sequence), 10)) - - response, err := c.client.Get(u.String()) - if err != nil { - return false, xdr.LedgerCloseMeta{}, errors.Wrap(err, "failed to execute request") - } +func (c RemoteCaptiveStellarCore) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { + for { + // TODO: Have some way to cancel all outstanding requests, not just + // PrepareRange. + u := *c.url + u.Path = path.Join(u.Path, "ledger", strconv.FormatUint(uint64(sequence), 10)) + request, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil) + if err != nil { + return xdr.LedgerCloseMeta{}, errors.Wrap(err, "cannot construct http request") + } - var parsed LedgerResponse - if err = decodeResponse(response, &parsed); err != nil { - return false, xdr.LedgerCloseMeta{}, err - } + response, err := c.client.Do(request) + if err != nil { + return xdr.LedgerCloseMeta{}, errors.Wrap(err, "failed to execute request") + } - return parsed.Present, xdr.LedgerCloseMeta(parsed.Ledger), nil -} + if response.StatusCode == http.StatusRequestTimeout { + response.Body.Close() + // This request timed out. Retry. + continue + } -func (c RemoteCaptiveStellarCore) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { - for { - exists, meta, err := c.GetLedger(sequence) - if err != nil { + var parsed LedgerResponse + if err = decodeResponse(response, &parsed); err != nil { return xdr.LedgerCloseMeta{}, err } - if exists { - return meta, nil - } else { - time.Sleep(time.Second) - } + return xdr.LedgerCloseMeta(parsed.Ledger), nil } } diff --git a/ingest/ledgerbackend/remote_captive_core_test.go b/ingest/ledgerbackend/remote_captive_core_test.go new file mode 100644 index 0000000000..3a4b4d28a7 --- /dev/null +++ b/ingest/ledgerbackend/remote_captive_core_test.go @@ -0,0 +1,74 @@ +package ledgerbackend + +import ( + "context" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/stellar/go/xdr" +) + +func TestGetLedgerSucceeds(t *testing.T) { + expectedLedger := xdr.LedgerCloseMeta{ + V0: &xdr.LedgerCloseMetaV0{ + LedgerHeader: xdr.LedgerHeaderHistoryEntry{ + Header: xdr.LedgerHeader{ + LedgerSeq: 64, + }, + }, + }, + } + called := 0 + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called++ + json.NewEncoder(w).Encode(LedgerResponse{ + Ledger: Base64Ledger(expectedLedger), + }) + })) + defer server.Close() + + client, err := NewRemoteCaptive(server.URL) + require.NoError(t, err) + + ledger, err := client.GetLedger(context.Background(), 64) + require.NoError(t, err) + require.Equal(t, 1, called) + require.Equal(t, expectedLedger, ledger) +} + +func TestGetLedgerTakesAWhile(t *testing.T) { + expectedLedger := xdr.LedgerCloseMeta{ + V0: &xdr.LedgerCloseMetaV0{ + LedgerHeader: xdr.LedgerHeaderHistoryEntry{ + Header: xdr.LedgerHeader{ + LedgerSeq: 64, + }, + }, + }, + } + called := 0 + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called++ + if called == 1 { + // TODO: Check this is what the server really does. + w.WriteHeader(http.StatusRequestTimeout) + return + } + json.NewEncoder(w).Encode(LedgerResponse{ + Ledger: Base64Ledger(expectedLedger), + }) + })) + defer server.Close() + + client, err := NewRemoteCaptive(server.URL) + require.NoError(t, err) + + ledger, err := client.GetLedger(context.Background(), 64) + require.NoError(t, err) + require.Equal(t, 2, called) + require.Equal(t, expectedLedger, ledger) +} diff --git a/ingest/tutorial/example_hello.go b/ingest/tutorial/example_hello.go index 229ffeacad..44c9f409b2 100644 --- a/ingest/tutorial/example_hello.go +++ b/ingest/tutorial/example_hello.go @@ -1,26 +1,24 @@ package main import ( + "context" "fmt" backends "github.com/stellar/go/ingest/ledgerbackend" ) func helloworld() { + ctx := context.Background() backend, err := backends.NewCaptive(config) panicIf(err) defer backend.Close() // Prepare a single ledger to be ingested, - err = backend.PrepareRange(backends.BoundedRange(123456, 123456)) + err = backend.PrepareRange(ctx, backends.BoundedRange(123456, 123456)) panicIf(err) // then retrieve it: - ok, ledger, err := backend.GetLedger(123456) - if !ok { - err = fmt.Errorf("The ledger doesn't exist on the backend.") - } - + ledger, err := backend.GetLedger(ctx, 123456) panicIf(err) // Now `ledger` is a raw `xdr.LedgerCloseMeta` object containing the diff --git a/ingest/tutorial/example_statistics.go b/ingest/tutorial/example_statistics.go index 4a5fe18d6d..f6174fb1b0 100644 --- a/ingest/tutorial/example_statistics.go +++ b/ingest/tutorial/example_statistics.go @@ -1,6 +1,7 @@ package main import ( + "context" "fmt" "io" @@ -11,6 +12,7 @@ import ( ) func statistics() { + ctx := context.Background() // Only log errors from the backend to keep output cleaner. lg := log.New() lg.SetLevel(logrus.ErrorLevel) @@ -26,7 +28,7 @@ func statistics() { fmt.Printf("Preparing range (%d ledgers)...\n", ledgersToRead) ledgerRange := backends.BoundedRange(startingSeq, startingSeq+ledgersToRead) - err = backend.PrepareRange(ledgerRange) + err = backend.PrepareRange(ctx, ledgerRange) panicIf(err) // These are the statistics that we're tracking. @@ -37,7 +39,8 @@ func statistics() { fmt.Printf("Processed ledger %d...\r", seq) txReader, err := ingest.NewLedgerTransactionReader( - backend, config.NetworkPassphrase, seq) + ctx, backend, config.NetworkPassphrase, seq, + ) panicIf(err) defer txReader.Close() diff --git a/ingest/tutorial/getting-started.md b/ingest/tutorial/getting-started.md index 6bec707d03..0091880c1d 100644 --- a/ingest/tutorial/getting-started.md +++ b/ingest/tutorial/getting-started.md @@ -49,6 +49,7 @@ With that in mind, here's a minimalist example of the ingestion library: package main import ( + "context" "fmt" "github.com/stellar/go/ingest/ledgerbackend" @@ -64,11 +65,8 @@ func main() { panicIf(err) // then retrieve it: - ok, ledger, err := ledgerbackend.GetLedger(123456) - if !ok { - err = fmt.Errorf("The ledger doesn't exist on the backend.") - } - + ctx := context.Background() + ledger, err := ledgerbackend.GetLedger(ctx, 123456) panicIf(err) // Now `ledger` is a raw `xdr.LedgerCloseMeta` object containing the diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 735075576d..25326cdd5e 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## Unreleased + +* Refactor `ingest/ledgerbackend/LedgerBackend.GetLedger` method to always block, removing `ingest/ledgerbackend/LedgerBackend.GetLedgerBlocking`. Adds a first `context.Context` param to most `LedgerBackend` methods. + ## v2.2.0 **Upgrading to this version will trigger state rebuild. During this process (which can take up to 20 minutes) it will not ingest new ledgers.** diff --git a/services/horizon/internal/db2/history/ledger_test.go b/services/horizon/internal/db2/history/ledger_test.go index c148b6ed8e..6101b99bd5 100644 --- a/services/horizon/internal/db2/history/ledger_test.go +++ b/services/horizon/internal/db2/history/ledger_test.go @@ -58,8 +58,8 @@ func TestInsertLedger(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - ledgerHashStore := ledgerbackend.NewHorizonDBLedgerHashStore(tt.Ctx, tt.HorizonSession()) - _, exists, err := ledgerHashStore.GetLedgerHash(100) + ledgerHashStore := ledgerbackend.NewHorizonDBLedgerHashStore(tt.HorizonSession()) + _, exists, err := ledgerHashStore.GetLedgerHash(tt.Ctx, 100) tt.Assert.NoError(err) tt.Assert.False(exists) @@ -143,7 +143,7 @@ func TestInsertLedger(t *testing.T) { tt.Assert.Equal(expectedLedger, ledgerFromDB) - hash, exists, err := ledgerHashStore.GetLedgerHash(uint32(expectedLedger.Sequence)) + hash, exists, err := ledgerHashStore.GetLedgerHash(tt.Ctx, uint32(expectedLedger.Sequence)) tt.Assert.NoError(err) tt.Assert.True(exists) tt.Assert.Equal(expectedLedger.LedgerHash, hash) diff --git a/services/horizon/internal/ingest/build_state_test.go b/services/horizon/internal/ingest/build_state_test.go index 6b13539043..75e5c83c13 100644 --- a/services/horizon/internal/ingest/build_state_test.go +++ b/services/horizon/internal/ingest/build_state_test.go @@ -53,9 +53,9 @@ func (s *BuildStateTestSuite) SetupTest() { s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("Rollback", s.ctx).Return(nil).Once() - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(63)).Return(nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(63)).Return(xdr.LedgerCloseMeta{ + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(63)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(63)).Return(xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ LedgerHeader: xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ @@ -107,8 +107,8 @@ func (s *BuildStateTestSuite) TestRangeNotPreparedFailPrepare() { *s.historyQ = mockDBQ{} *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(63)).Return(errors.New("my error")).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(63)).Return(errors.New("my error")).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) @@ -122,9 +122,9 @@ func (s *BuildStateTestSuite) TestRangeNotPreparedSuccessPrepareGetLedgerFail() *s.historyQ = mockDBQ{} *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(63)).Return(nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(63)).Return(xdr.LedgerCloseMeta{}, errors.New("my error")).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(63)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(63)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(63)).Return(xdr.LedgerCloseMeta{}, errors.New("my error")).Once() next, err := buildState{checkpointLedger: s.checkpointLedger}.run(s.system) diff --git a/services/horizon/internal/ingest/database_backend_test.go b/services/horizon/internal/ingest/database_backend_test.go index 64769b602a..69de728116 100644 --- a/services/horizon/internal/ingest/database_backend_test.go +++ b/services/horizon/internal/ingest/database_backend_test.go @@ -13,9 +13,9 @@ func TestGetLatestLedger(t *testing.T) { tt.ScenarioWithoutHorizon("base") defer tt.Finish() - backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.Ctx, tt.CoreSession(), network.TestNetworkPassphrase) + backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.CoreSession(), network.TestNetworkPassphrase) tt.Assert.NoError(err) - seq, err := backend.GetLatestLedgerSequence() + seq, err := backend.GetLatestLedgerSequence(tt.Ctx) tt.Assert.NoError(err) tt.Assert.Equal(uint32(3), seq) } @@ -28,8 +28,8 @@ func TestGetLatestLedgerNotFound(t *testing.T) { _, err := tt.CoreDB.Exec(`DELETE FROM ledgerheaders`) tt.Assert.NoError(err, "failed to remove ledgerheaders") - backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.Ctx, tt.CoreSession(), network.TestNetworkPassphrase) + backend, err := ledgerbackend.NewDatabaseBackendFromSession(tt.CoreSession(), network.TestNetworkPassphrase) tt.Assert.NoError(err) - _, err = backend.GetLatestLedgerSequence() + _, err = backend.GetLatestLedgerSequence(tt.Ctx) tt.Assert.EqualError(err, "no ledgers exist in ledgerheaders table") } diff --git a/services/horizon/internal/ingest/db_integration_test.go b/services/horizon/internal/ingest/db_integration_test.go index 6f20de97bf..2857a277ef 100644 --- a/services/horizon/internal/ingest/db_integration_test.go +++ b/services/horizon/internal/ingest/db_integration_test.go @@ -113,8 +113,8 @@ func (s *DBTestSuite) setupMocksForBuildState() { s.historyAdapter.On("BucketListHash", s.sequence). Return(checkpointHash, nil).Once() - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(s.sequence)).Return(true, nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", s.sequence). + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(s.sequence)).Return(true, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, s.sequence). Return( xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ diff --git a/services/horizon/internal/ingest/fake_ledger_backend.go b/services/horizon/internal/ingest/fake_ledger_backend.go index b985e43569..74e82d8708 100644 --- a/services/horizon/internal/ingest/fake_ledger_backend.go +++ b/services/horizon/internal/ingest/fake_ledger_backend.go @@ -1,6 +1,8 @@ package ingest import ( + "context" + "github.com/stellar/go/ingest/ledgerbackend" "github.com/stellar/go/keypair" logpkg "github.com/stellar/go/support/log" @@ -12,15 +14,15 @@ type fakeLedgerBackend struct { changesPerTransaction int } -func (fakeLedgerBackend) GetLatestLedgerSequence() (uint32, error) { +func (fakeLedgerBackend) GetLatestLedgerSequence(ctx context.Context) (uint32, error) { return 1, nil } -func (fakeLedgerBackend) PrepareRange(r ledgerbackend.Range) error { +func (fakeLedgerBackend) PrepareRange(ctx context.Context, r ledgerbackend.Range) error { return nil } -func (fakeLedgerBackend) IsPrepared(r ledgerbackend.Range) (bool, error) { +func (fakeLedgerBackend) IsPrepared(ctx context.Context, r ledgerbackend.Range) (bool, error) { return true, nil } @@ -98,7 +100,7 @@ func fakeOffer(offerID int64) xdr.LedgerEntryChange { } } -func (f fakeLedgerBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { +func (f fakeLedgerBackend) getLedgerAsync(ctx context.Context, sequence uint32) (bool, xdr.LedgerCloseMeta, error) { ledgerCloseMeta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ LedgerHeader: xdr.LedgerHeaderHistoryEntry{ @@ -199,8 +201,8 @@ func (f fakeLedgerBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta return true, ledgerCloseMeta, nil } -func (f *fakeLedgerBackend) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { - _, meta, err := f.GetLedger(sequence) +func (f *fakeLedgerBackend) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { + _, meta, err := f.getLedgerAsync(ctx, sequence) return meta, err } diff --git a/services/horizon/internal/ingest/fsm.go b/services/horizon/internal/ingest/fsm.go index 88eeafa8b7..bfd6df15db 100644 --- a/services/horizon/internal/ingest/fsm.go +++ b/services/horizon/internal/ingest/fsm.go @@ -251,7 +251,7 @@ func (b buildState) run(s *system) (transition, error) { log.WithField("ledger", b.checkpointLedger).Info("Waiting for ledger to be available in the backend...") startTime := time.Now() - ledgerCloseMeta, err = s.ledgerBackend.GetLedgerBlocking(b.checkpointLedger) + ledgerCloseMeta, err = s.ledgerBackend.GetLedger(s.ctx, b.checkpointLedger) if err != nil { return nextFailState, errors.Wrap(err, "error getting ledger blocking") } @@ -379,7 +379,7 @@ func (r resumeState) run(s *system) (transition, error) { log.WithField("ledger", ingestLedger).Info("Waiting for ledger to be available in the backend...") startTime := time.Now() - ledgerCloseMeta, err := s.ledgerBackend.GetLedgerBlocking(ingestLedger) + ledgerCloseMeta, err := s.ledgerBackend.GetLedger(s.ctx, ingestLedger) if err != nil { return start(), errors.Wrap(err, "error getting ledger blocking") } @@ -565,7 +565,7 @@ func (h historyRangeState) run(s *system) (transition, error) { log.WithField("ledger", cur).Info("Waiting for ledger to be available in the backend...") startTime := time.Now() - ledgerCloseMeta, err = s.ledgerBackend.GetLedgerBlocking(cur) + ledgerCloseMeta, err = s.ledgerBackend.GetLedger(s.ctx, cur) if err != nil { // Commit finished work in case of ledger backend error. commitErr := s.historyQ.Commit(s.ctx) @@ -656,15 +656,11 @@ func (h reingestHistoryRangeState) ingestRange(s *system, fromLedger, toLedger u } for cur := fromLedger; cur <= toLedger; cur++ { - exists, ledgerCloseMeta, err := s.ledgerBackend.GetLedger(cur) + ledgerCloseMeta, err := s.ledgerBackend.GetLedger(s.ctx, cur) if err != nil { return errors.Wrap(err, "error getting ledger") } - if !exists { - return errors.New("error getting ledger: ledger does not exist") - } - if err = runTransactionProcessorsOnLedger(s, ledgerCloseMeta); err != nil { return err } @@ -691,7 +687,7 @@ func (h reingestHistoryRangeState) run(s *system) (transition, error) { }).Info("Preparing ledger backend to retrieve range") startTime := time.Now() - err := s.ledgerBackend.PrepareRange(ledgerbackend.BoundedRange(h.fromLedger, h.toLedger)) + err := s.ledgerBackend.PrepareRange(s.ctx, ledgerbackend.BoundedRange(h.fromLedger, h.toLedger)) if err != nil { return stop(), errors.Wrap(err, "error preparing range") } @@ -820,7 +816,7 @@ func (v verifyRangeState) run(s *system) (transition, error) { log.WithField("ledger", v.fromLedger).Info("Preparing range") startTime := time.Now() - err = s.ledgerBackend.PrepareRange(ledgerbackend.BoundedRange(v.fromLedger, v.toLedger)) + err = s.ledgerBackend.PrepareRange(s.ctx, ledgerbackend.BoundedRange(v.fromLedger, v.toLedger)) if err != nil { return stop(), errors.Wrap(err, "Error preparing range") } @@ -833,15 +829,11 @@ func (v verifyRangeState) run(s *system) (transition, error) { log.WithField("ledger", v.fromLedger).Info("Processing state") startTime = time.Now() - exists, ledgerCloseMeta, err := s.ledgerBackend.GetLedger(v.fromLedger) + ledgerCloseMeta, err := s.ledgerBackend.GetLedger(s.ctx, v.fromLedger) if err != nil { return stop(), errors.Wrap(err, "error getting ledger") } - if !exists { - return stop(), errors.New("error getting ledger: ledger does not exist") - } - stats, err := s.runner.RunHistoryArchiveIngestion( ledgerCloseMeta.LedgerSequence(), ledgerCloseMeta.ProtocolVersion(), @@ -878,17 +870,12 @@ func (v verifyRangeState) run(s *system) (transition, error) { return stop(), err } - var exists bool var ledgerCloseMeta xdr.LedgerCloseMeta - exists, ledgerCloseMeta, err = s.ledgerBackend.GetLedger(sequence) + ledgerCloseMeta, err = s.ledgerBackend.GetLedger(s.ctx, sequence) if err != nil { return stop(), errors.Wrap(err, "error getting ledger") } - if !exists { - return stop(), errors.New("error getting ledger: ledger does not exist") - } - var changeStats ingest.StatsChangeProcessorResults var ledgerTransactionStats processors.StatsLedgerTransactionProcessorResults changeStats, _, ledgerTransactionStats, _, err = @@ -959,15 +946,11 @@ func (stressTestState) run(s *system) (transition, error) { }).Info("Processing ledger") startTime := time.Now() - exists, ledgerCloseMeta, err := s.ledgerBackend.GetLedger(sequence) + ledgerCloseMeta, err := s.ledgerBackend.GetLedger(s.ctx, sequence) if err != nil { return stop(), errors.Wrap(err, "error getting ledger") } - if !exists { - return stop(), errors.New("error getting ledger: ledger does not exist") - } - changeStats, _, ledgerTransactionStats, _, err := s.runner.RunAllProcessorsOnLedger(ledgerCloseMeta) if err != nil { err = errors.Wrap(err, "Error running processors on ledger") @@ -1017,7 +1000,7 @@ func (s *system) completeIngestion(ctx context.Context, ledger uint32) error { func (s *system) maybePrepareRange(ctx context.Context, from uint32) error { ledgerRange := ledgerbackend.UnboundedRange(from) - prepared, err := s.ledgerBackend.IsPrepared(ledgerRange) + prepared, err := s.ledgerBackend.IsPrepared(ctx, ledgerRange) if err != nil { return errors.Wrap(err, "error checking prepared range") } @@ -1026,7 +1009,7 @@ func (s *system) maybePrepareRange(ctx context.Context, from uint32) error { log.WithFields(logpkg.F{"from": from}).Info("Preparing range") startTime := time.Now() - err = s.ledgerBackend.PrepareRange(ledgerRange) + err = s.ledgerBackend.PrepareRange(ctx, ledgerRange) if err != nil { return errors.Wrap(err, "error preparing range") } diff --git a/services/horizon/internal/ingest/ingest_history_range_state_test.go b/services/horizon/internal/ingest/ingest_history_range_state_test.go index 751e5bbfa3..9e29d7d635 100644 --- a/services/horizon/internal/ingest/ingest_history_range_state_test.go +++ b/services/horizon/internal/ingest/ingest_history_range_state_test.go @@ -47,8 +47,8 @@ func (s *IngestHistoryRangeStateTestSuite) SetupTest() { s.historyQ.On("Rollback", s.ctx).Return(nil).Once() - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(100)).Return(nil).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(100)).Return(nil).Once() } func (s *IngestHistoryRangeStateTestSuite) TearDownTest() { @@ -90,8 +90,8 @@ func (s *IngestHistoryRangeStateTestSuite) TestRangeNotPreparedFailPrepare() { *s.historyQ = mockDBQ{} *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(100)).Return(errors.New("my error")).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(100)).Return(errors.New("my error")).Once() next, err := historyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) s.Assert().Error(err) @@ -158,7 +158,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedgerR }, }, } - s.ledgerBackend.On("GetLedgerBlocking", uint32(100)).Return(meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, @@ -187,7 +187,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccess() { }, }, } - s.ledgerBackend.On("GetLedgerBlocking", uint32(i)).Return(meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(i)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, @@ -217,7 +217,7 @@ func (s *IngestHistoryRangeStateTestSuite) TestSuccessOneLedger() { }, }, } - s.ledgerBackend.On("GetLedgerBlocking", uint32(100)).Return(meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, @@ -246,8 +246,8 @@ func (s *IngestHistoryRangeStateTestSuite) TestCommitsWorkOnLedgerBackendFailure }, }, } - s.ledgerBackend.On("GetLedgerBlocking", uint32(100)).Return(meta, nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(101)). + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(101)). Return(xdr.LedgerCloseMeta{}, errors.New("my error")).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( @@ -296,7 +296,7 @@ func (s *ReingestHistoryRangeStateTestSuite) SetupTest() { s.historyQ.On("Rollback", s.ctx).Return(nil).Once() s.historyQ.On("Begin", s.ctx).Return(nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() } func (s *ReingestHistoryRangeStateTestSuite) TearDownTest() { @@ -407,7 +407,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestRunTransactionProcessorsOnLedge }, }, } - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta). Return( @@ -443,7 +443,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestCommitFails() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, @@ -482,7 +482,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccess() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(i)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(i)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, @@ -527,8 +527,8 @@ func (s *ReingestHistoryRangeStateTestSuite) TestSuccessOneLedger() { // Recreate mock in this single test to remove previous assertion. *s.ledgerBackend = mockLedgerBackend{} - s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 100)).Return(nil).Once() - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.BoundedRange(100, 100)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() err := s.system.ReingestRange(100, 100, false) s.Assert().NoError(err) @@ -562,7 +562,7 @@ func (s *ReingestHistoryRangeStateTestSuite) TestReingestRangeForce() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(i)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(i)).Return(meta, nil).Once() s.runner.On("RunTransactionProcessorsOnLedger", meta).Return( processors.StatsLedgerTransactionProcessorResults{}, diff --git a/services/horizon/internal/ingest/main.go b/services/horizon/internal/ingest/main.go index ac4669b412..a19890b703 100644 --- a/services/horizon/internal/ingest/main.go +++ b/services/horizon/internal/ingest/main.go @@ -188,7 +188,7 @@ func NewSystem(config Config) (System, error) { var ledgerBackend ledgerbackend.LedgerBackend if config.EnableCaptiveCore { if len(config.RemoteCaptiveCoreURL) > 0 { - ledgerBackend, err = ledgerbackend.NewRemoteCaptive(ctx, config.RemoteCaptiveCoreURL) + ledgerBackend, err = ledgerbackend.NewRemoteCaptive(config.RemoteCaptiveCoreURL) if err != nil { cancel() return nil, errors.Wrap(err, "error creating captive core backend") @@ -206,7 +206,7 @@ func NewSystem(config Config) (System, error) { NetworkPassphrase: config.NetworkPassphrase, HistoryArchiveURLs: []string{config.HistoryArchiveURL}, CheckpointFrequency: config.CheckpointFrequency, - LedgerHashStore: ledgerbackend.NewHorizonDBLedgerHashStore(ctx, config.HistorySession), + LedgerHashStore: ledgerbackend.NewHorizonDBLedgerHashStore(config.HistorySession), Log: logger, Context: ctx, }, @@ -218,7 +218,7 @@ func NewSystem(config Config) (System, error) { } } else { coreSession := config.CoreSession.Clone() - ledgerBackend, err = ledgerbackend.NewDatabaseBackendFromSession(ctx, coreSession, config.NetworkPassphrase) + ledgerBackend, err = ledgerbackend.NewDatabaseBackendFromSession(coreSession, config.NetworkPassphrase) if err != nil { cancel() return nil, errors.Wrap(err, "error creating ledger backend") diff --git a/services/horizon/internal/ingest/main_test.go b/services/horizon/internal/ingest/main_test.go index bddafb3239..764c4765a0 100644 --- a/services/horizon/internal/ingest/main_test.go +++ b/services/horizon/internal/ingest/main_test.go @@ -360,28 +360,23 @@ type mockLedgerBackend struct { mock.Mock } -func (m *mockLedgerBackend) GetLatestLedgerSequence() (sequence uint32, err error) { - args := m.Called() +func (m *mockLedgerBackend) GetLatestLedgerSequence(ctx context.Context) (sequence uint32, err error) { + args := m.Called(ctx) return args.Get(0).(uint32), args.Error(1) } -func (m *mockLedgerBackend) GetLedger(sequence uint32) (bool, xdr.LedgerCloseMeta, error) { - args := m.Called(sequence) - return args.Get(0).(bool), args.Get(1).(xdr.LedgerCloseMeta), args.Error(2) -} - -func (m *mockLedgerBackend) GetLedgerBlocking(sequence uint32) (xdr.LedgerCloseMeta, error) { - args := m.Called(sequence) +func (m *mockLedgerBackend) GetLedger(ctx context.Context, sequence uint32) (xdr.LedgerCloseMeta, error) { + args := m.Called(ctx, sequence) return args.Get(0).(xdr.LedgerCloseMeta), args.Error(1) } -func (m *mockLedgerBackend) PrepareRange(ledgerRange ledgerbackend.Range) error { - args := m.Called(ledgerRange) +func (m *mockLedgerBackend) PrepareRange(ctx context.Context, ledgerRange ledgerbackend.Range) error { + args := m.Called(ctx, ledgerRange) return args.Error(0) } -func (m *mockLedgerBackend) IsPrepared(ledgerRange ledgerbackend.Range) (bool, error) { - args := m.Called(ledgerRange) +func (m *mockLedgerBackend) IsPrepared(ctx context.Context, ledgerRange ledgerbackend.Range) (bool, error) { + args := m.Called(ctx, ledgerRange) return args.Get(0).(bool), args.Error(1) } diff --git a/services/horizon/internal/ingest/resume_state_test.go b/services/horizon/internal/ingest/resume_state_test.go index 92c95a675d..b6e2b4c2a8 100644 --- a/services/horizon/internal/ingest/resume_state_test.go +++ b/services/horizon/internal/ingest/resume_state_test.go @@ -52,9 +52,9 @@ func (s *ResumeTestTestSuite) SetupTest() { s.historyQ.On("Rollback", s.ctx).Return(nil).Once() - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(101)).Return(nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(101)).Return(xdr.LedgerCloseMeta{ + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(101)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(101)).Return(xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ LedgerHeader: xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ @@ -95,8 +95,8 @@ func (s *ResumeTestTestSuite) TestRangeNotPreparedFailPrepare() { *s.historyQ = mockDBQ{} *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(101)).Return(errors.New("my error")).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(101)).Return(errors.New("my error")).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -112,9 +112,9 @@ func (s *ResumeTestTestSuite) TestRangeNotPreparedSuccessPrepareGetLedgerFail() *s.historyQ = mockDBQ{} *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(101)).Return(nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(101)).Return(xdr.LedgerCloseMeta{}, errors.New("my error")).Once() + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(101)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(101)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(101)).Return(xdr.LedgerCloseMeta{}, errors.New("my error")).Once() next, err := resumeState{latestSuccessfullyProcessedLedger: 100}.run(s.system) s.Assert().Error(err) @@ -291,9 +291,9 @@ func (s *ResumeTestTestSuite) mockSuccessfulIngestion() { func (s *ResumeTestTestSuite) TestBumpIngestLedger() { *s.ledgerBackend = ledgerbackend.MockDatabaseBackend{} - s.ledgerBackend.On("IsPrepared", ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.UnboundedRange(100)).Return(nil).Once() - s.ledgerBackend.On("GetLedgerBlocking", uint32(100)).Return(xdr.LedgerCloseMeta{ + s.ledgerBackend.On("IsPrepared", s.ctx, ledgerbackend.UnboundedRange(100)).Return(false, nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.UnboundedRange(100)).Return(nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ LedgerHeader: xdr.LedgerHeaderHistoryEntry{ Header: xdr.LedgerHeader{ diff --git a/services/horizon/internal/ingest/verify_range_state_test.go b/services/horizon/internal/ingest/verify_range_state_test.go index 5eb763e992..503becf979 100644 --- a/services/horizon/internal/ingest/verify_range_state_test.go +++ b/services/horizon/internal/ingest/verify_range_state_test.go @@ -144,7 +144,7 @@ func (s *VerifyRangeStateTestSuite) TestGetLastLedgerIngestNonEmpty() { func (s *VerifyRangeStateTestSuite) TestRunHistoryArchiveIngestionReturnsError() { s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -157,7 +157,7 @@ func (s *VerifyRangeStateTestSuite) TestRunHistoryArchiveIngestionReturnsError() }, }, } - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunHistoryArchiveIngestion", uint32(100), MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}).Return(ingest.StatsChangeProcessorResults{}, errors.New("my error")).Once() next, err := verifyRangeState{fromLedger: 100, toLedger: 200}.run(s.system) @@ -172,7 +172,7 @@ func (s *VerifyRangeStateTestSuite) TestRunHistoryArchiveIngestionReturnsError() func (s *VerifyRangeStateTestSuite) TestSuccess() { s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.BoundedRange(100, 200)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -185,7 +185,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunHistoryArchiveIngestion", uint32(100), MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}).Return(ingest.StatsChangeProcessorResults{}, nil).Once() s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(100)).Return(nil).Once() @@ -203,7 +203,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(i)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(i)).Return(meta, nil).Once() s.runner.On("RunAllProcessorsOnLedger", meta).Return( ingest.StatsChangeProcessorResults{}, @@ -227,7 +227,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccess() { func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { s.historyQ.On("Begin", s.ctx).Return(nil).Once() s.historyQ.On("GetLastLedgerIngest", s.ctx).Return(uint32(0), nil).Once() - s.ledgerBackend.On("PrepareRange", ledgerbackend.BoundedRange(100, 110)).Return(nil).Once() + s.ledgerBackend.On("PrepareRange", s.ctx, ledgerbackend.BoundedRange(100, 110)).Return(nil).Once() meta := xdr.LedgerCloseMeta{ V0: &xdr.LedgerCloseMetaV0{ @@ -240,7 +240,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(100)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(100)).Return(meta, nil).Once() s.runner.On("RunHistoryArchiveIngestion", uint32(100), MaxSupportedProtocolVersion, xdr.Hash{1, 2, 3}).Return(ingest.StatsChangeProcessorResults{}, nil).Once() s.historyQ.On("UpdateLastLedgerIngest", s.ctx, uint32(100)).Return(nil).Once() @@ -258,7 +258,7 @@ func (s *VerifyRangeStateTestSuite) TestSuccessWithVerify() { }, }, } - s.ledgerBackend.On("GetLedger", uint32(i)).Return(true, meta, nil).Once() + s.ledgerBackend.On("GetLedger", s.ctx, uint32(i)).Return(meta, nil).Once() s.runner.On("RunAllProcessorsOnLedger", meta).Return( ingest.StatsChangeProcessorResults{}, From c28c2a63d7f42e48a31c5c10230fd2fe15b9a523 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 4 May 2021 15:37:30 -0700 Subject: [PATCH 21/67] rename `serve/` to `internal/` - import correct package - move files from `serve/` to `internal/serve` Signed-off-by: Lawrence Lawson --- services/regulated-assets-approval-server/cmd/serve.go | 2 +- .../{ => internal}/serve/friendbot.go | 0 .../{ => internal}/serve/friendbot_test.go | 0 .../{ => internal}/serve/handlers.go | 0 .../{ => internal}/serve/http_error.go | 0 .../{ => internal}/serve/http_error_test.go | 0 .../{ => internal}/serve/middleware.go | 0 .../{ => internal}/serve/serve.go | 0 .../{ => internal}/serve/serve_test.go | 0 .../{ => internal}/serve/tx_approve.go | 0 .../{ => internal}/serve/tx_approve_test.go | 0 11 files changed, 1 insertion(+), 1 deletion(-) rename services/regulated-assets-approval-server/{ => internal}/serve/friendbot.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/friendbot_test.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/handlers.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/http_error.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/http_error_test.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/middleware.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/serve.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/serve_test.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/tx_approve.go (100%) rename services/regulated-assets-approval-server/{ => internal}/serve/tx_approve_test.go (100%) diff --git a/services/regulated-assets-approval-server/cmd/serve.go b/services/regulated-assets-approval-server/cmd/serve.go index fda4417ca0..0cbdf7c0f1 100644 --- a/services/regulated-assets-approval-server/cmd/serve.go +++ b/services/regulated-assets-approval-server/cmd/serve.go @@ -6,7 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/network" - "github.com/stellar/go/services/regulated-assets-approval-server/serve" + serve "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve" "github.com/stellar/go/support/config" ) diff --git a/services/regulated-assets-approval-server/serve/friendbot.go b/services/regulated-assets-approval-server/internal/serve/friendbot.go similarity index 100% rename from services/regulated-assets-approval-server/serve/friendbot.go rename to services/regulated-assets-approval-server/internal/serve/friendbot.go diff --git a/services/regulated-assets-approval-server/serve/friendbot_test.go b/services/regulated-assets-approval-server/internal/serve/friendbot_test.go similarity index 100% rename from services/regulated-assets-approval-server/serve/friendbot_test.go rename to services/regulated-assets-approval-server/internal/serve/friendbot_test.go diff --git a/services/regulated-assets-approval-server/serve/handlers.go b/services/regulated-assets-approval-server/internal/serve/handlers.go similarity index 100% rename from services/regulated-assets-approval-server/serve/handlers.go rename to services/regulated-assets-approval-server/internal/serve/handlers.go diff --git a/services/regulated-assets-approval-server/serve/http_error.go b/services/regulated-assets-approval-server/internal/serve/http_error.go similarity index 100% rename from services/regulated-assets-approval-server/serve/http_error.go rename to services/regulated-assets-approval-server/internal/serve/http_error.go diff --git a/services/regulated-assets-approval-server/serve/http_error_test.go b/services/regulated-assets-approval-server/internal/serve/http_error_test.go similarity index 100% rename from services/regulated-assets-approval-server/serve/http_error_test.go rename to services/regulated-assets-approval-server/internal/serve/http_error_test.go diff --git a/services/regulated-assets-approval-server/serve/middleware.go b/services/regulated-assets-approval-server/internal/serve/middleware.go similarity index 100% rename from services/regulated-assets-approval-server/serve/middleware.go rename to services/regulated-assets-approval-server/internal/serve/middleware.go diff --git a/services/regulated-assets-approval-server/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go similarity index 100% rename from services/regulated-assets-approval-server/serve/serve.go rename to services/regulated-assets-approval-server/internal/serve/serve.go diff --git a/services/regulated-assets-approval-server/serve/serve_test.go b/services/regulated-assets-approval-server/internal/serve/serve_test.go similarity index 100% rename from services/regulated-assets-approval-server/serve/serve_test.go rename to services/regulated-assets-approval-server/internal/serve/serve_test.go diff --git a/services/regulated-assets-approval-server/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go similarity index 100% rename from services/regulated-assets-approval-server/serve/tx_approve.go rename to services/regulated-assets-approval-server/internal/serve/tx_approve.go diff --git a/services/regulated-assets-approval-server/serve/tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go similarity index 100% rename from services/regulated-assets-approval-server/serve/tx_approve_test.go rename to services/regulated-assets-approval-server/internal/serve/tx_approve_test.go From c69ed04736c98b41f86f7920c872c72c35b5142e Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 4 May 2021 15:42:55 -0700 Subject: [PATCH 22/67] rename handelers.go to toml.go Signed-off-by: Lawrence Lawson --- .../internal/serve/{handlers.go => toml.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename services/regulated-assets-approval-server/internal/serve/{handlers.go => toml.go} (100%) diff --git a/services/regulated-assets-approval-server/internal/serve/handlers.go b/services/regulated-assets-approval-server/internal/serve/toml.go similarity index 100% rename from services/regulated-assets-approval-server/internal/serve/handlers.go rename to services/regulated-assets-approval-server/internal/serve/toml.go From bee71f12aba1caa0a4be7392e43d3bcfd42cd1cf Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 4 May 2021 20:59:01 -0700 Subject: [PATCH 23/67] move httperror to its own package Signed-off-by: Lawrence Lawson --- .../internal/serve/{ => httperror}/http_error.go | 16 ++++++++-------- .../serve/{ => httperror}/http_error_test.go | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) rename services/regulated-assets-approval-server/internal/serve/{ => httperror}/http_error.go (74%) rename services/regulated-assets-approval-server/internal/serve/{ => httperror}/http_error_test.go (87%) diff --git a/services/regulated-assets-approval-server/internal/serve/http_error.go b/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go similarity index 74% rename from services/regulated-assets-approval-server/internal/serve/http_error.go rename to services/regulated-assets-approval-server/internal/serve/httperror/http_error.go index 285c986944..d96dabf571 100644 --- a/services/regulated-assets-approval-server/internal/serve/http_error.go +++ b/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go @@ -1,4 +1,4 @@ -package serve +package httperror import ( "net/http" @@ -8,32 +8,32 @@ import ( "github.com/stellar/go/support/render/httpjson" ) -type httpError struct { +type Error struct { ErrorMessage string `json:"error"` Status int `json:"-"` } -func (h *httpError) Error() string { +func (h *Error) Error() string { return h.ErrorMessage } -func NewHTTPError(status int, errorMessage string) *httpError { - return &httpError{ +func NewHTTPError(status int, errorMessage string) *Error { + return &Error{ ErrorMessage: errorMessage, Status: status, } } -func (e *httpError) Render(w http.ResponseWriter) { +func (e *Error) Render(w http.ResponseWriter) { httpjson.RenderStatus(w, e.Status, e, httpjson.JSON) } -var serverError = &httpError{ +var InternalServerError = &Error{ ErrorMessage: "An error occurred while processing this request.", Status: http.StatusInternalServerError, } -func parseHorizonError(err error) error { +func ParseHorizonError(err error) error { if err == nil { return nil } diff --git a/services/regulated-assets-approval-server/internal/serve/http_error_test.go b/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go similarity index 87% rename from services/regulated-assets-approval-server/internal/serve/http_error_test.go rename to services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go index 24a60667f5..2eba3a8d4a 100644 --- a/services/regulated-assets-approval-server/internal/serve/http_error_test.go +++ b/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go @@ -1,4 +1,4 @@ -package serve +package httperror import ( "net/http" @@ -12,10 +12,10 @@ import ( ) func TestParseHorizonError(t *testing.T) { - err := parseHorizonError(nil) + err := ParseHorizonError(nil) require.Nil(t, err) - err = parseHorizonError(errors.New("some error")) + err = ParseHorizonError(errors.New("some error")) require.EqualError(t, err, "error submitting transaction: some error") horizonError := horizonclient.Error{ @@ -34,6 +34,6 @@ func TestParseHorizonError(t *testing.T) { }, }, } - err = parseHorizonError(horizonError) + err = ParseHorizonError(horizonError) require.EqualError(t, err, "error submitting transaction: problem: bad_request, &{TransactionCode:tx_code_here OperationCodes:[op_success op_bad_auth]}\n: horizon error: \"Bad Request\" - check horizon.Error.Problem for more information") } From 5711879bf1b056b84438ad70d4becba35397ccc4 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 4 May 2021 20:59:22 -0700 Subject: [PATCH 24/67] update httperror calls to adhere to the refactor Signed-off-by: Lawrence Lawson --- .../internal/serve/friendbot.go | 19 ++++++++++--------- .../internal/serve/tx_approve.go | 7 ++++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/services/regulated-assets-approval-server/internal/serve/friendbot.go b/services/regulated-assets-approval-server/internal/serve/friendbot.go index 0a0f40a154..b7a406cc94 100644 --- a/services/regulated-assets-approval-server/internal/serve/friendbot.go +++ b/services/regulated-assets-approval-server/internal/serve/friendbot.go @@ -7,6 +7,7 @@ import ( "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" "github.com/stellar/go/strkey" "github.com/stellar/go/support/errors" "github.com/stellar/go/support/http/httpdecode" @@ -67,16 +68,16 @@ func (h friendbotHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := httpdecode.Decode(r, &in) if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "decoding input parameters")) - httpErr := NewHTTPError(http.StatusBadRequest, "Invalid input parameters") + httpErr := httperror.NewHTTPError(http.StatusBadRequest, "Invalid input parameters") httpErr.Render(w) return } err = h.topUpAccountWithRegulatedAsset(ctx, in) if err != nil { - httpErr, ok := err.(*httpError) + httpErr, ok := err.(*httperror.Error) if !ok { - httpErr = serverError + httpErr = httperror.InternalServerError } httpErr.Render(w) return @@ -94,17 +95,17 @@ func (h friendbotHandler) topUpAccountWithRegulatedAsset(ctx context.Context, in } if in.Address == "" { - return NewHTTPError(http.StatusBadRequest, `Missing query paramater "addr".`) + return httperror.NewHTTPError(http.StatusBadRequest, `Missing query paramater "addr".`) } if !strkey.IsValidEd25519PublicKey(in.Address) { - return NewHTTPError(http.StatusBadRequest, `"addr" is not a valid Stellar address.`) + return httperror.NewHTTPError(http.StatusBadRequest, `"addr" is not a valid Stellar address.`) } account, err := h.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: in.Address}) if err != nil { log.Ctx(ctx).Error(errors.Wrapf(err, "getting detail for account %s", in.Address)) - return NewHTTPError(http.StatusBadRequest, `Please make sure the provided account address already exists in the network.`) + return httperror.NewHTTPError(http.StatusBadRequest, `Please make sure the provided account address already exists in the network.`) } kp, err := keypair.ParseFull(h.issuerAccountSecret) @@ -127,13 +128,13 @@ func (h friendbotHandler) topUpAccountWithRegulatedAsset(ctx context.Context, in } } if !accountHasTrustline { - return NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Account with address %s doesn't have a trustline for %s:%s", in.Address, asset.Code, asset.Issuer)) + return httperror.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Account with address %s doesn't have a trustline for %s:%s", in.Address, asset.Code, asset.Issuer)) } issuerAcc, err := h.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: kp.Address()}) if err != nil { log.Ctx(ctx).Error(errors.Wrapf(err, "getting detail for issuer account %s", kp.Address())) - return serverError + return httperror.InternalServerError } tx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ @@ -174,7 +175,7 @@ func (h friendbotHandler) topUpAccountWithRegulatedAsset(ctx context.Context, in _, err = h.horizonClient.SubmitTransaction(tx) if err != nil { - err = parseHorizonError(err) + err = httperror.ParseHorizonError(err) log.Ctx(ctx).Error(err) return err } diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go index 560ba48ee2..90c5de70f3 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve.go @@ -5,6 +5,7 @@ import ( "net/http" "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" "github.com/stellar/go/support/errors" "github.com/stellar/go/support/http/httpdecode" "github.com/stellar/go/support/log" @@ -55,15 +56,15 @@ func (h txApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := httpdecode.Decode(r, &in) if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "decoding input parameters")) - httpErr := NewHTTPError(http.StatusBadRequest, "Invalid input parameters") + httpErr := httperror.NewHTTPError(http.StatusBadRequest, "Invalid input parameters") httpErr.Render(w) return } rejectedResponse, err := h.isRejected(ctx, in) if err != nil { - httpErr, ok := err.(*httpError) + httpErr, ok := err.(*httperror.Error) if !ok { - httpErr = serverError + httpErr = httperror.InternalServerError } httpErr.Render(w) return From 67fe4a723429cb680c745fd93539df22ef6c8ed3 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Wed, 5 May 2021 15:24:31 +0200 Subject: [PATCH 25/67] services/horizon: Apply and check migrations on ingesting instances only (#3586) This commit reverts 7c92b23 and changes the DB migrations behaviour to only trigger on ingesting instances. When checking if there are any migrations required Horizon calls `migrate.PlanMigration` which sends `CREATE TABLE gorp_migrations`. This write query is forbidden when using read only database (like replica). The new flag in 7c92b23 added unnecessary complexity. Ingesting instances are guaranteed to have write access to a DB. Thanks @jacekn for the idea! --- services/horizon/internal/config.go | 3 --- services/horizon/internal/flags.go | 24 +++++++----------------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/services/horizon/internal/config.go b/services/horizon/internal/config.go index f96851527b..2bca813e91 100644 --- a/services/horizon/internal/config.go +++ b/services/horizon/internal/config.go @@ -74,9 +74,6 @@ type Config struct { // ApplyMigrations will apply pending migrations to the horizon database // before starting the horizon service ApplyMigrations bool - // SkipMigrationsCheck will skip checking if there are any migrations - // required - SkipMigrationsCheck bool // CheckpointFrequency establishes how many ledgers exist between checkpoints CheckpointFrequency uint32 // BehindCloudflare determines if Horizon instance is behind Cloudflare. In diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index a17a89a534..3dba16e441 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -386,14 +386,6 @@ func Flags() (*Config, support.ConfigOptions) { Required: false, Usage: "applies pending migrations before starting horizon", }, - &support.ConfigOption{ - Name: "skip-migrations-check", - ConfigKey: &config.SkipMigrationsCheck, - OptType: types.Bool, - FlagDefault: false, - Required: false, - Usage: "skips checking if there are migrations required", - }, &support.ConfigOption{ Name: "checkpoint-frequency", ConfigKey: &config.CheckpointFrequency, @@ -446,19 +438,17 @@ func ApplyFlags(config *Config, flags support.ConfigOptions) { flags.Require() flags.SetValues() - if config.ApplyMigrations { - applyMigrations(*config) - } - - // Migrations should be checked as early as possible - if !config.SkipMigrationsCheck { - checkMigrations(*config) - } - // Validate options that should be provided together validateBothOrNeither("tls-cert", "tls-key") if config.Ingest { + // Migrations should be checked as early as possible. Apply and check + // only on ingesting instances which are required to have write-access + // to the DB. + if config.ApplyMigrations { + applyMigrations(*config) + } + checkMigrations(*config) // config.HistoryArchiveURLs contains a single empty value when empty so using // viper.GetString is easier. From 4c983802b17b22efe4f968820847470e9e54fbc1 Mon Sep 17 00:00:00 2001 From: tamirms Date: Wed, 5 May 2021 10:43:13 -0400 Subject: [PATCH 26/67] ingest/ledgerbackend: Parse captive core toml to implement better merging (#3558) This PR fixes #3486 and lays the groundwork for implementing #3442 . This PR changes how we interpret captive core append file (configured via --captive-core-config-append-path). Previously, we automatically generated the stellar core toml file for the captive core subprocess in ingest/ledgerbackend/stellar_core_runner.go by presetting some defaults and then concatenating the generated configuration with the user supplied append file. This strategy did not work out so well because sometimes horizon operators included configuration in the append file which was already configured in the presets generated by ingest/ledgerbackend/stellar_core_runner.go. An example of this type of error can be found in #3486 . Now, in this PR, instead of generating the stellar core toml file via simple string concatenation we actually parse the user supplied append file and try to do more robust merging between the user supplied configuration and the captive core preset defaults. The merging code is implemented in ingest/ledgerbackend/toml.go . The merging strategy is unfortunately complicated by the fact that captive core configuration can come from 3 places: User supplied append file horizon command line flag (e.g. --captive-core-peer-port, --captive-core-http-port, etc) default values which we preset (e.g. DISABLE_XDR_FSYNC) In theory the user supplied append file should only contain the quorum set but in practice we have never validated the append file to ensure that it configures a quorum set and nothing else. We could simplify the merging logic in this PR by choosing to validate the append file in this way. I decided not to take that approach because I think that it would be a breaking change for many horizon operators (including SDF) who have configuration in the append file which is not related to quorum sets. If you disagree with this design decision please let me know. The merging algorithm generally works as follows: If there is a configuration field which is set both in source (1) and source (2) we check that both sources provide equivalent values, otherwise we return an error. The exception to this rule is the history archive configuration. We take the history archive configuration from source (1) and completely disregard what is provided in source (2) unless there is no history archive configuration in source (1). The reason for this is that it's difficult to compare the history archive values from source (1) and source (2). If a configuration field is defined in source (1) but not source (2), we will use the field which is explicitly defined. The same logic applies if the field is defined in source (2) but not source (1). Finally, if there is no configuration defined in either source (1) or source (2), we use the value from source (3). In the next PR, my plan is to fully implement #3442 by introducing a new horizon command line flag --captive-core-config-file which deprecates --captive-core-config-append-path. The difference between --captive-core-config-file and --captive-core-config-append-path is that the validation is stricter. --captive-core-config-file will not allow any unknown fields to be present in the toml file. Furthermore, if --captive-core-config-file is provided then you will not be allowed to use any horizon command line flags to configure captive core. In other words, --captive-core-config-file deprecates source (2). Along with defining --captive-core-config-file, the next PR will also add documentation for the captive core configuration file in an captive-core_example.cfg file (similar to how stellar core does it https://github.com/stellar/stellar-core/blob/master/docs/stellar-core_example.cfg ). The example file will document the full range of configuration options available to captive core instances. Unfortunately there will be some slight differences between the stellar core example cfg and the captive core example cfg because captive core has different defaults compared to stellar core. For example, captive core sets DISABLE_XDR_FSYNC to true by default whereas stellar core sets DISABLE_XDR_FSYNC to false by default. We should think carefully about each of the cases where captive core diverges from stellar core. --- exp/services/captivecore/main.go | 32 +- exp/tools/captive-core-start-tester/main.go | 1 - go.list | 1 + go.mod | 1 + go.sum | 2 + ingest/doc_test.go | 10 +- ingest/ledgerbackend/captive_core_backend.go | 13 +- .../captive_core_backend_test.go | 6 +- ingest/ledgerbackend/stellar_core_runner.go | 101 +--- .../ledgerbackend/stellar_core_runner_test.go | 58 +- .../testdata/appendix-with-fields.cfg | 68 +++ .../testdata/duplicate-home-domain.cfg | 13 + .../testdata/duplicate-validator.cfg | 16 + .../testdata/empty-home-domain-quality.cfg | 8 + .../testdata/empty-home-domain.cfg | 12 + .../testdata/expected-offline-core.cfg | 27 +- .../expected-offline-with-appendix-core.cfg | 33 +- .../expected-offline-with-extra-fields.cfg | 37 ++ .../expected-offline-with-no-peer-port.cfg | 15 + .../testdata/expected-online-core.cfg | 29 +- .../expected-online-with-no-http-port.cfg | 20 + .../expected-online-with-no-peer-port.cfg | 19 + .../testdata/invalid-home-domain-quality.cfg | 9 + .../testdata/sample-appendix.cfg | 2 +- .../validator-has-invalid-public-key.cfg | 6 + .../validator-has-invalid-quality.cfg | 6 + .../validator-missing-home-domain.cfg | 9 + .../testdata/validator-missing-name.cfg | 5 + .../testdata/validator-missing-public-key.cfg | 8 + .../testdata/validator-missing-quality.cfg | 15 + ingest/ledgerbackend/toml.go | 517 ++++++++++++++++++ ingest/ledgerbackend/toml_test.go | 294 ++++++++++ ingest/tutorial/example_common.go | 32 +- services/horizon/CHANGELOG.md | 1 + services/horizon/cmd/db.go | 5 +- services/horizon/internal/config.go | 16 +- services/horizon/internal/flags.go | 64 ++- services/horizon/internal/ingest/main.go | 30 +- services/horizon/internal/init.go | 23 +- .../horizon/internal/integration/db_test.go | 4 +- .../internal/test/integration/integration.go | 2 +- support/config/config_option.go | 24 + support/config/config_option_test.go | 52 ++ 43 files changed, 1364 insertions(+), 282 deletions(-) create mode 100644 ingest/ledgerbackend/testdata/appendix-with-fields.cfg create mode 100644 ingest/ledgerbackend/testdata/duplicate-home-domain.cfg create mode 100644 ingest/ledgerbackend/testdata/duplicate-validator.cfg create mode 100644 ingest/ledgerbackend/testdata/empty-home-domain-quality.cfg create mode 100644 ingest/ledgerbackend/testdata/empty-home-domain.cfg create mode 100644 ingest/ledgerbackend/testdata/expected-offline-with-extra-fields.cfg create mode 100644 ingest/ledgerbackend/testdata/expected-offline-with-no-peer-port.cfg create mode 100644 ingest/ledgerbackend/testdata/expected-online-with-no-http-port.cfg create mode 100644 ingest/ledgerbackend/testdata/expected-online-with-no-peer-port.cfg create mode 100644 ingest/ledgerbackend/testdata/invalid-home-domain-quality.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-has-invalid-public-key.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-has-invalid-quality.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-missing-home-domain.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-missing-name.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-missing-public-key.cfg create mode 100644 ingest/ledgerbackend/testdata/validator-missing-quality.cfg create mode 100644 ingest/ledgerbackend/toml.go create mode 100644 ingest/ledgerbackend/toml_test.go diff --git a/exp/services/captivecore/main.go b/exp/services/captivecore/main.go index c8c2d425ab..2f33e400cb 100644 --- a/exp/services/captivecore/main.go +++ b/exp/services/captivecore/main.go @@ -20,9 +20,9 @@ import ( func main() { var port int - var networkPassphrase, binaryPath, configAppendPath, dbURL string + var networkPassphrase, binaryPath, configPath, dbURL string + var captiveCoreTomlParams ledgerbackend.CaptiveCoreTomlParams var historyArchiveURLs []string - var stellarCoreHTTPPort uint var checkpointFrequency uint32 var logLevel logrus.Level logger := supportlog.New() @@ -56,9 +56,9 @@ func main() { Name: "captive-core-config-append-path", OptType: types.String, FlagDefault: "", - Required: false, + Required: true, Usage: "path to additional configuration for the Stellar Core configuration file used by captive core. It must, at least, include enough details to define a quorum set", - ConfigKey: &configAppendPath, + ConfigKey: &configPath, }, &config.ConfigOption{ Name: "history-archive-urls", @@ -97,12 +97,13 @@ func main() { Usage: "horizon postgres database to connect with", }, &config.ConfigOption{ - Name: "stellar-captive-core-http-port", - ConfigKey: &stellarCoreHTTPPort, - OptType: types.Uint, - FlagDefault: uint(11626), - Required: false, - Usage: "HTTP port for captive core to listen on (0 disables the HTTP server)", + Name: "stellar-captive-core-http-port", + ConfigKey: &captiveCoreTomlParams.HTTPPort, + OptType: types.Uint, + CustomSetValue: config.SetOptionalUint, + Required: false, + FlagDefault: uint(11626), + Usage: "HTTP port for Captive Core to listen on (0 disables the HTTP server)", }, &config.ConfigOption{ Name: "checkpoint-frequency", @@ -121,19 +122,24 @@ func main() { configOpts.SetValues() logger.SetLevel(logLevel) + captiveCoreTomlParams.HistoryArchiveURLs = historyArchiveURLs + captiveCoreTomlParams.NetworkPassphrase = networkPassphrase + captiveCoreToml, err := ledgerbackend.NewCaptiveCoreTomlFromFile(configPath, captiveCoreTomlParams) + if err != nil { + logger.WithError(err).Fatal("Invalid captive core toml") + } + captiveConfig := ledgerbackend.CaptiveCoreConfig{ BinaryPath: binaryPath, - ConfigAppendPath: configAppendPath, NetworkPassphrase: networkPassphrase, HistoryArchiveURLs: historyArchiveURLs, CheckpointFrequency: checkpointFrequency, - HTTPPort: stellarCoreHTTPPort, Log: logger.WithField("subservice", "stellar-core"), + Toml: captiveCoreToml, } var dbConn *db.Session if len(dbURL) > 0 { - var err error dbConn, err = db.Open("postgres", dbURL) if err != nil { logger.WithError(err).Fatal("Could not create db connection instance") diff --git a/exp/tools/captive-core-start-tester/main.go b/exp/tools/captive-core-start-tester/main.go index 9e1183bd5c..7e44dea282 100644 --- a/exp/tools/captive-core-start-tester/main.go +++ b/exp/tools/captive-core-start-tester/main.go @@ -27,7 +27,6 @@ func check(ledger uint32) bool { c, err := ledgerbackend.NewCaptive( ledgerbackend.CaptiveCoreConfig{ BinaryPath: "stellar-core", - ConfigAppendPath: "stellar-core-standalone2.cfg", NetworkPassphrase: "Standalone Network ; February 2017", HistoryArchiveURLs: []string{"http://localhost:1570"}, }, diff --git a/go.list b/go.list index 12ef698517..2d5ebefd53 100644 --- a/go.list +++ b/go.list @@ -83,6 +83,7 @@ github.com/onsi/ginkgo v1.7.0 github.com/onsi/gomega v1.4.3 github.com/opentracing/opentracing-go v1.1.0 github.com/openzipkin/zipkin-go v0.1.6 +github.com/pelletier/go-toml v1.9.0 github.com/pierrec/lz4 v2.0.5+incompatible github.com/pkg/errors v0.8.1 github.com/pmezard/go-difflib v1.0.0 diff --git a/go.mod b/go.mod index ddf2df57fe..cb018ab408 100644 --- a/go.mod +++ b/go.mod @@ -48,6 +48,7 @@ require ( github.com/onsi/ginkgo v1.7.0 github.com/onsi/gomega v1.4.3 github.com/opentracing/opentracing-go v1.1.0 // indirect + github.com/pelletier/go-toml v1.9.0 github.com/pkg/errors v0.8.1 github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f diff --git a/go.sum b/go.sum index bd458e5351..5319aec14e 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,8 @@ github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFSt github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/pelletier/go-toml v1.9.0 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0= +github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= diff --git a/ingest/doc_test.go b/ingest/doc_test.go index 5277add909..7ac0719df3 100644 --- a/ingest/doc_test.go +++ b/ingest/doc_test.go @@ -68,13 +68,21 @@ func Example_changes() { archiveURL := "http://history.stellar.org/prd/core-live/core_live_001" networkPassphrase := network.PublicNetworkPassphrase + captiveCoreToml, err := ledgerbackend.NewCaptiveCoreToml(ledgerbackend.CaptiveCoreTomlParams{ + NetworkPassphrase: networkPassphrase, + HistoryArchiveURLs: []string{archiveURL}, + }) + if err != nil { + panic(err) + } + // Requires Stellar-Core 13.2.0+ backend, err := ledgerbackend.NewCaptive( ledgerbackend.CaptiveCoreConfig{ BinaryPath: "/bin/stellar-core", - ConfigAppendPath: "/opt/stellar-core.cfg", NetworkPassphrase: networkPassphrase, HistoryArchiveURLs: []string{archiveURL}, + Toml: captiveCoreToml, }, ) if err != nil { diff --git a/ingest/ledgerbackend/captive_core_backend.go b/ingest/ledgerbackend/captive_core_backend.go index 85b4158022..a7127c3110 100644 --- a/ingest/ledgerbackend/captive_core_backend.go +++ b/ingest/ledgerbackend/captive_core_backend.go @@ -97,13 +97,11 @@ type CaptiveStellarCore struct { type CaptiveCoreConfig struct { // BinaryPath is the file path to the Stellar Core binary BinaryPath string - // ConfigAppendPath is the file path to additional configuration for the Stellar Core configuration file used - // by captive core. This field is only required when ingesting in online mode (e.g. UnboundedRange). - ConfigAppendPath string // NetworkPassphrase is the Stellar network passphrase used by captive core when connecting to the Stellar network NetworkPassphrase string // HistoryArchiveURLs are a list of history archive urls HistoryArchiveURLs []string + Toml *CaptiveCoreToml // Optional fields @@ -112,18 +110,9 @@ type CaptiveCoreConfig struct { CheckpointFrequency uint32 // LedgerHashStore is an optional store used to obtain hashes for ledger sequences from a trusted source LedgerHashStore TrustedLedgerHashStore - // HTTPPort is the TCP port to listen for requests (defaults to 0, which disables the HTTP server) - HTTPPort uint - // PeerPort is the TCP port to bind to for connecting to the Stellar network - // (defaults to 11625). It may be useful for example when there's >1 Stellar-Core - // instance running on a machine. - PeerPort uint // Log is an (optional) custom logger which will capture any output from the Stellar Core process. // If Log is omitted then all output will be printed to stdout. Log *log.Entry - // LogPath is the (optional) path in which to store Core logs, passed along - // to Stellar Core's LOG_FILE_PATH - LogPath string // Context is the (optional) context which controls the lifetime of a CaptiveStellarCore instance. Once the context is done // the CaptiveStellarCore instance will not be able to stream ledgers from Stellar Core or spawn new // instances of Stellar Core. If Context is omitted CaptiveStellarCore will default to using context.Background. diff --git a/ingest/ledgerbackend/captive_core_backend_test.go b/ingest/ledgerbackend/captive_core_backend_test.go index 4c510ce2c4..02b36c6314 100644 --- a/ingest/ledgerbackend/captive_core_backend_test.go +++ b/ingest/ledgerbackend/captive_core_backend_test.go @@ -132,14 +132,12 @@ type testLedgerHeader struct { func TestCaptiveNew(t *testing.T) { executablePath := "/etc/stellar-core" - configPath := "/etc/stellar-core.cfg" networkPassphrase := network.PublicNetworkPassphrase historyURLs := []string{"http://history.stellar.org/prd/core-live/core_live_001"} captiveStellarCore, err := NewCaptive( CaptiveCoreConfig{ BinaryPath: executablePath, - ConfigAppendPath: configPath, NetworkPassphrase: networkPassphrase, HistoryArchiveURLs: historyURLs, }, @@ -735,11 +733,15 @@ func TestCaptiveStellarCore_PrepareRangeAfterClose(t *testing.T) { networkPassphrase := network.PublicNetworkPassphrase historyURLs := []string{"http://localhost"} + captiveCoreToml, err := NewCaptiveCoreToml(CaptiveCoreTomlParams{}) + assert.NoError(t, err) + captiveStellarCore, err := NewCaptive( CaptiveCoreConfig{ BinaryPath: executablePath, NetworkPassphrase: networkPassphrase, HistoryArchiveURLs: historyURLs, + Toml: captiveCoreToml, }, ) assert.NoError(t, err) diff --git a/ingest/ledgerbackend/stellar_core_runner.go b/ingest/ledgerbackend/stellar_core_runner.go index bbfd78d41a..1105ee743c 100644 --- a/ingest/ledgerbackend/stellar_core_runner.go +++ b/ingest/ledgerbackend/stellar_core_runner.go @@ -49,14 +49,7 @@ type pipe struct { } type stellarCoreRunner struct { - logPath string - executablePath string - configAppendPath string - networkPassphrase string - historyURLs []string - httpPort uint - peerPort uint - mode stellarCoreRunnerMode + executablePath string started bool wg sync.WaitGroup @@ -112,17 +105,10 @@ func newStellarCoreRunner(config CaptiveCoreConfig, mode stellarCoreRunnerMode) ctx, cancel := context.WithCancel(config.Context) runner := &stellarCoreRunner{ - logPath: config.LogPath, - executablePath: config.BinaryPath, - configAppendPath: config.ConfigAppendPath, - networkPassphrase: config.NetworkPassphrase, - historyURLs: config.HistoryArchiveURLs, - httpPort: config.HTTPPort, - peerPort: config.PeerPort, - mode: mode, - ctx: ctx, - cancel: cancel, - storagePath: fullStoragePath, + executablePath: config.BinaryPath, + ctx: ctx, + cancel: cancel, + storagePath: fullStoragePath, nonce: fmt.Sprintf( "captive-stellar-core-%x", rand.New(rand.NewSource(time.Now().UnixNano())).Uint64(), @@ -130,66 +116,42 @@ func newStellarCoreRunner(config CaptiveCoreConfig, mode stellarCoreRunnerMode) log: config.Log, } - if err := runner.writeConf(); err != nil { + if conf, err := writeConf(config.Toml, mode, runner.getConfFileName()); err != nil { return nil, errors.Wrap(err, "error writing configuration") + } else { + runner.log.Debugf("captive core config file contents:\n%s", conf) } return runner, nil } -func (r *stellarCoreRunner) generateConfig() (string, error) { - if r.mode == stellarCoreRunnerModeOnline && r.configAppendPath == "" { - return "", errors.New("stellar-core append config file path cannot be empty in online mode") - } - - lines := []string{ - "# Generated file -- do not edit", - "NODE_IS_VALIDATOR=false", - "DISABLE_XDR_FSYNC=true", - fmt.Sprintf(`NETWORK_PASSPHRASE="%s"`, r.networkPassphrase), - // Note: We don't pass BUCKET_DIR_PATH here because it's created - // *relative* to the storage path (i.e. where the config lives). - fmt.Sprintf(`HTTP_PORT=%d`, r.httpPort), - fmt.Sprintf(`LOG_FILE_PATH="%s"`, r.logPath), - } - - if r.peerPort > 0 { - lines = append(lines, fmt.Sprintf(`PEER_PORT=%d`, r.peerPort)) - } - - if r.mode == stellarCoreRunnerModeOffline { - // In offline mode, there is no need to connect to peers - lines = append(lines, "RUN_STANDALONE=true") - // We don't need consensus when catching up - lines = append(lines, "UNSAFE_QUORUM=true") +func writeConf(captiveCoreToml *CaptiveCoreToml, mode stellarCoreRunnerMode, location string) (string, error) { + text, err := generateConfig(captiveCoreToml, mode) + if err != nil { + return "", err } - if r.mode == stellarCoreRunnerModeOffline && r.configAppendPath == "" { - // Add a fictional quorum -- necessary to convince core to start up; - // but not used at all for our purposes. Pubkey here is just random. - lines = append(lines, - "[QUORUM_SET]", - "THRESHOLD_PERCENT=100", - `VALIDATORS=["GCZBOIAY4HLKAJVNJORXZOZRAY2BJDBZHKPBHZCRAIUR5IHC2UHBGCQR"]`) - } + return string(text), ioutil.WriteFile(location, text, 0644) +} - result := strings.ReplaceAll(strings.Join(lines, "\n"), `\`, `\\`) + "\n\n" - if r.configAppendPath != "" { - appendConfigContents, err := ioutil.ReadFile(r.configAppendPath) +func generateConfig(captiveCoreToml *CaptiveCoreToml, mode stellarCoreRunnerMode) ([]byte, error) { + if mode == stellarCoreRunnerModeOffline { + var err error + captiveCoreToml, err = captiveCoreToml.CatchupToml() if err != nil { - return "", errors.Wrap(err, "reading quorum config file") + return nil, errors.Wrap(err, "could not generate catch up config") } - result += string(appendConfigContents) + "\n\n" } - lines = []string{} - for i, val := range r.historyURLs { - lines = append(lines, fmt.Sprintf("[HISTORY.h%d]", i)) - lines = append(lines, fmt.Sprintf(`get="curl -sf %s/{0} -o {1}"`, val)) + if !captiveCoreToml.QuorumSetIsConfigured() { + return nil, errors.New("stellar-core append config file does not define any quorum set") } - result += strings.Join(lines, "\n") - return result, nil + text, err := captiveCoreToml.Marshal() + if err != nil { + return nil, errors.Wrap(err, "could not marshal captive core config") + } + return text, nil } func (r *stellarCoreRunner) getConfFileName() string { @@ -255,17 +217,6 @@ func (r *stellarCoreRunner) getLogLineWriter() io.Writer { return wr } -// Makes the temp directory and writes the config file to it; called by the -// platform-specific captiveStellarCore.Start() methods. -func (r *stellarCoreRunner) writeConf() error { - conf, err := r.generateConfig() - if err != nil { - return err - } - r.log.Debugf("captive core config file contents:\n%s", conf) - return ioutil.WriteFile(r.getConfFileName(), []byte(conf), 0644) -} - func (r *stellarCoreRunner) createCmd(params ...string) *exec.Cmd { allParams := append([]string{"--conf", r.getConfFileName()}, params...) cmd := exec.CommandContext(r.ctx, r.executablePath, allParams...) diff --git a/ingest/ledgerbackend/stellar_core_runner_test.go b/ingest/ledgerbackend/stellar_core_runner_test.go index 24d99e17b8..326c029ff1 100644 --- a/ingest/ledgerbackend/stellar_core_runner_test.go +++ b/ingest/ledgerbackend/stellar_core_runner_test.go @@ -2,9 +2,7 @@ package ledgerbackend import ( "context" - "io/ioutil" "os" - "path/filepath" "testing" "github.com/stretchr/testify/assert" @@ -12,63 +10,15 @@ import ( "github.com/stellar/go/support/log" ) -func TestGenerateConfig(t *testing.T) { - for _, testCase := range []struct { - name string - appendPath string - mode stellarCoreRunnerMode - expectedPath string - }{ - { - name: "offline config with no appendix", - mode: stellarCoreRunnerModeOffline, - appendPath: "", - expectedPath: filepath.Join("testdata", "expected-offline-core.cfg"), - }, - { - name: "online config with appendix", - mode: stellarCoreRunnerModeOnline, - appendPath: filepath.Join("testdata", "sample-appendix.cfg"), - expectedPath: filepath.Join("testdata", "expected-online-core.cfg"), - }, - { - name: "offline config with appendix", - mode: stellarCoreRunnerModeOffline, - appendPath: filepath.Join("testdata", "sample-appendix.cfg"), - expectedPath: filepath.Join("testdata", "expected-offline-with-appendix-core.cfg"), - }, - } { - t.Run(testCase.name, func(t *testing.T) { - stellarCoreRunner, err := newStellarCoreRunner(CaptiveCoreConfig{ - HTTPPort: 6789, - HistoryArchiveURLs: []string{"http://localhost:1170"}, - Log: log.New(), - ConfigAppendPath: testCase.appendPath, - StoragePath: "./test-temp-dir", - PeerPort: 12345, - Context: context.Background(), - NetworkPassphrase: "Public Global Stellar Network ; September 2015", - }, testCase.mode) - assert.NoError(t, err) - - config, err := stellarCoreRunner.generateConfig() - assert.NoError(t, err) - - expectedByte, err := ioutil.ReadFile(testCase.expectedPath) - assert.NoError(t, err) - - assert.Equal(t, config, string(expectedByte)) - - assert.NoError(t, stellarCoreRunner.close()) - }) - } -} - func TestCloseBeforeStart(t *testing.T) { + captiveCoreToml, err := NewCaptiveCoreToml(CaptiveCoreTomlParams{}) + assert.NoError(t, err) + runner, err := newStellarCoreRunner(CaptiveCoreConfig{ HistoryArchiveURLs: []string{"http://localhost"}, Log: log.New(), Context: context.Background(), + Toml: captiveCoreToml, }, stellarCoreRunnerModeOffline) assert.NoError(t, err) diff --git a/ingest/ledgerbackend/testdata/appendix-with-fields.cfg b/ingest/ledgerbackend/testdata/appendix-with-fields.cfg new file mode 100644 index 0000000000..c77833b1b2 --- /dev/null +++ b/ingest/ledgerbackend/testdata/appendix-with-fields.cfg @@ -0,0 +1,68 @@ +NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" +FAILURE_SAFETY=2 +UNSAFE_QUORUM=false +PUBLIC_HTTP_PORT=true +RUN_STANDALONE=false +DISABLE_XDR_FSYNC=false +BUCKET_DIR_PATH="test-buckets" +HTTP_PORT = 6789 +PEER_PORT = 12345 +LOG_FILE_PATH = "" + +NODE_NAMES=[ + "GA22N4YGO7IJDRF2SISA5KHULGYYKDXBQGYIWUVNMSNHF5G2DNBKP3M5 eliza", + "GCDENOCHA6TQL6DFC4FS54HIH7RP7XR7VZCQZFANMGLT2WXJ7D7KGV2P hal9000", + "GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ victor" +] + +[HISTORY] +get="curl http://mirror.history.stellar.org/{0} -o {1}" + +[HISTORY.stellar] +get="curl http://history.stellar.org/{0} -o {1}" +put="aws s3 cp {0} s3://history.stellar.org/{1}" + +[HISTORY.stellar---backup] +get="curl http://history.stellar.org/{0} -o {1}" +put="aws s3 cp [QUORUM_SET.1]" + + +#[QUORUM_SET--1] +#THRESHOLD_PERCENT=66 +#VALIDATORS=[ +# "GDQWITFJLZ5HT6JCOXYEVV5VFD6FTLAKJAUDKHAV3HKYGVJWA2DPYSQV A_from_above", +# "GANLKVE4WOTE75MJS6FQ73CL65TSPYYMFZKC4VDEZ45LGQRCATGAIGIA B_from_above", +# "GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ C_from_above" +#] + +[QUORUM_SET] +THRESHOLD_PERCENT=66 +VALIDATORS=[ + "GDQWITFJLZ5HT6JCOXYEVV5VFD6FTLAKJAUDKHAV3HKYGVJWA2DPYSQV A_from_above", + "GANLKVE4WOTE75MJS6FQ73CL65TSPYYMFZKC4VDEZ45LGQRCATGAIGIA B_from_above", + "GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ C_from_above" +] + +[QUORUM_SET.1] +THRESHOLD_PERCENT=67 +VALIDATORS=[ + "$self", + "GDXJAZZJ3H5MJGR6PDQX3JHRREAVYNCVM7FJYGLZJKEHQV2ZXEUO5SX2 E_from_above", + "GB6GK3WWTZYY2JXWM6C5LRKLQ2X7INQ7IYTSECCG3SMZFYOZNEZR4SO5 F_from_above" +] + +[QUORUM_SET.2] +THRESHOLD_PERCENT=100 +VALIDATORS=[ + "GCTAIXWDDBM3HBDHGSAOLY223QZHPS2EDROF7YUBB3GNYXLOCPV5PXUK G_from_above", + "GCJ6UBAOXNQFN3HGLCVQBWGEZO6IABSMNE2OCQC4FJAZXJA5AIE7WSPW H_from_above" +] + +[QUORUM_SET.2.1] +THRESHOLD_PERCENT=50 +VALIDATORS=[ + "GC4X65TQJVI3OWAS4DTA2EN2VNZ5ZRJD646H5WKEJHO5ZHURDRAX2OTH I_from_above", + "GAXSWUO4RBELRQT5WMDLIKTRIKC722GGXX2GIGEYQZDQDLOTINQ4DX6F J_from_above", + "GAWOEMG7DQDWHCFDTPJEBYWRKUUZTX2M2HLMNABM42G7C7IAPU54GL6X K_from_above", + "GDZAJNUUDJFKTZX3YWZSOAS4S4NGCJ5RQAY7JPYBG5CUFL3JZ5C3ECOH L_from_above" +] \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/duplicate-home-domain.cfg b/ingest/ledgerbackend/testdata/duplicate-home-domain.cfg new file mode 100644 index 0000000000..d3fd5a77dc --- /dev/null +++ b/ingest/ledgerbackend/testdata/duplicate-home-domain.cfg @@ -0,0 +1,13 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/testdata/duplicate-validator.cfg b/ingest/ledgerbackend/testdata/duplicate-validator.cfg new file mode 100644 index 0000000000..10b916cc2c --- /dev/null +++ b/ingest/ledgerbackend/testdata/duplicate-validator.cfg @@ -0,0 +1,16 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="pubnet.stellar.org" +PUBLIC_KEY="GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ" +ADDRESS="localhost:9834" +QUALITY="HIGH" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/empty-home-domain-quality.cfg b/ingest/ledgerbackend/testdata/empty-home-domain-quality.cfg new file mode 100644 index 0000000000..f4e259fdcf --- /dev/null +++ b/ingest/ledgerbackend/testdata/empty-home-domain-quality.cfg @@ -0,0 +1,8 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/testdata/empty-home-domain.cfg b/ingest/ledgerbackend/testdata/empty-home-domain.cfg new file mode 100644 index 0000000000..c4ae874593 --- /dev/null +++ b/ingest/ledgerbackend/testdata/empty-home-domain.cfg @@ -0,0 +1,12 @@ +[[HOME_DOMAINS]] +QUALITY="MEDIUM" + +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/testdata/expected-offline-core.cfg b/ingest/ledgerbackend/testdata/expected-offline-core.cfg index 40daca9422..6fc2616d8f 100644 --- a/ingest/ledgerbackend/testdata/expected-offline-core.cfg +++ b/ingest/ledgerbackend/testdata/expected-offline-core.cfg @@ -1,15 +1,16 @@ -# Generated file -- do not edit -NODE_IS_VALIDATOR=false -DISABLE_XDR_FSYNC=true -NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" -HTTP_PORT=6789 -LOG_FILE_PATH="" -PEER_PORT=12345 -RUN_STANDALONE=true -UNSAFE_QUORUM=true -[QUORUM_SET] -THRESHOLD_PERCENT=100 -VALIDATORS=["GCZBOIAY4HLKAJVNJORXZOZRAY2BJDBZHKPBHZCRAIUR5IHC2UHBGCQR"] +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = 0 +HTTP_PORT = 0 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +PEER_PORT = 12345 +RUN_STANDALONE = true +UNSAFE_QUORUM = true [HISTORY.h0] -get="curl -sf http://localhost:1170/{0} -o {1}" \ No newline at end of file + get = "curl -sf http://localhost:1170/{0} -o {1}" + +[QUORUM_SET] + THRESHOLD_PERCENT = 100 + VALIDATORS = ["GCZBOIAY4HLKAJVNJORXZOZRAY2BJDBZHKPBHZCRAIUR5IHC2UHBGCQR"] diff --git a/ingest/ledgerbackend/testdata/expected-offline-with-appendix-core.cfg b/ingest/ledgerbackend/testdata/expected-offline-with-appendix-core.cfg index 4e6011cdf0..d7edb3421b 100644 --- a/ingest/ledgerbackend/testdata/expected-offline-with-appendix-core.cfg +++ b/ingest/ledgerbackend/testdata/expected-offline-with-appendix-core.cfg @@ -1,23 +1,22 @@ -# Generated file -- do not edit -NODE_IS_VALIDATOR=false -DISABLE_XDR_FSYNC=true -NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" -HTTP_PORT=6789 -LOG_FILE_PATH="" -PEER_PORT=12345 -RUN_STANDALONE=true -UNSAFE_QUORUM=true +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = 0 +HTTP_PORT = 0 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +PEER_PORT = 12345 +RUN_STANDALONE = true +UNSAFE_QUORUM = true [[HOME_DOMAINS]] -HOME_DOMAIN="testnet.stellar.org" -QUALITY="MEDIUM" + HOME_DOMAIN = "testnet.stellar.org" + QUALITY = "MEDIUM" [[VALIDATORS]] -NAME="sdf_testnet_1" -HOME_DOMAIN="testnet.stellar.org" -PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" -ADDRESS="core-testnet1.stellar.org" - + ADDRESS = "localhost:123" + HOME_DOMAIN = "testnet.stellar.org" + NAME = "sdf_testnet_1" + PUBLIC_KEY = "GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" [HISTORY.h0] -get="curl -sf http://localhost:1170/{0} -o {1}" \ No newline at end of file + get = "curl -sf http://localhost:1170/{0} -o {1}" diff --git a/ingest/ledgerbackend/testdata/expected-offline-with-extra-fields.cfg b/ingest/ledgerbackend/testdata/expected-offline-with-extra-fields.cfg new file mode 100644 index 0000000000..5d2d74fb1a --- /dev/null +++ b/ingest/ledgerbackend/testdata/expected-offline-with-extra-fields.cfg @@ -0,0 +1,37 @@ +# Generated file, do not edit +BUCKET_DIR_PATH = "test-buckets" +FAILURE_SAFETY = 0 +HTTP_PORT = 0 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +NODE_NAMES = ["GA22N4YGO7IJDRF2SISA5KHULGYYKDXBQGYIWUVNMSNHF5G2DNBKP3M5 eliza", "GCDENOCHA6TQL6DFC4FS54HIH7RP7XR7VZCQZFANMGLT2WXJ7D7KGV2P hal9000", "GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ victor"] +PEER_PORT = 12345 +RUN_STANDALONE = true +UNSAFE_QUORUM = true + +[HISTORY] + get = "curl http://mirror.history.stellar.org/{0} -o {1}" + +[HISTORY.stellar] + get = "curl http://history.stellar.org/{0} -o {1}" + put = "aws s3 cp {0} s3://history.stellar.org/{1}" + +[HISTORY.stellar---backup] + get = "curl http://history.stellar.org/{0} -o {1}" + put = "aws s3 cp [QUORUM_SET.1]" + +[QUORUM_SET] + THRESHOLD_PERCENT = 66 + VALIDATORS = ["GDQWITFJLZ5HT6JCOXYEVV5VFD6FTLAKJAUDKHAV3HKYGVJWA2DPYSQV A_from_above", "GANLKVE4WOTE75MJS6FQ73CL65TSPYYMFZKC4VDEZ45LGQRCATGAIGIA B_from_above", "GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ C_from_above"] + +[QUORUM_SET.1] + THRESHOLD_PERCENT = 67 + VALIDATORS = ["$self", "GDXJAZZJ3H5MJGR6PDQX3JHRREAVYNCVM7FJYGLZJKEHQV2ZXEUO5SX2 E_from_above", "GB6GK3WWTZYY2JXWM6C5LRKLQ2X7INQ7IYTSECCG3SMZFYOZNEZR4SO5 F_from_above"] + +[QUORUM_SET.2] + THRESHOLD_PERCENT = 100 + VALIDATORS = ["GCTAIXWDDBM3HBDHGSAOLY223QZHPS2EDROF7YUBB3GNYXLOCPV5PXUK G_from_above", "GCJ6UBAOXNQFN3HGLCVQBWGEZO6IABSMNE2OCQC4FJAZXJA5AIE7WSPW H_from_above"] + +[QUORUM_SET.2.1] + THRESHOLD_PERCENT = 50 + VALIDATORS = ["GC4X65TQJVI3OWAS4DTA2EN2VNZ5ZRJD646H5WKEJHO5ZHURDRAX2OTH I_from_above", "GAXSWUO4RBELRQT5WMDLIKTRIKC722GGXX2GIGEYQZDQDLOTINQ4DX6F J_from_above", "GAWOEMG7DQDWHCFDTPJEBYWRKUUZTX2M2HLMNABM42G7C7IAPU54GL6X K_from_above", "GDZAJNUUDJFKTZX3YWZSOAS4S4NGCJ5RQAY7JPYBG5CUFL3JZ5C3ECOH L_from_above"] diff --git a/ingest/ledgerbackend/testdata/expected-offline-with-no-peer-port.cfg b/ingest/ledgerbackend/testdata/expected-offline-with-no-peer-port.cfg new file mode 100644 index 0000000000..7b358cc079 --- /dev/null +++ b/ingest/ledgerbackend/testdata/expected-offline-with-no-peer-port.cfg @@ -0,0 +1,15 @@ +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = 0 +HTTP_PORT = 0 +LOG_FILE_PATH = "/var/stellar-core/test.log" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +RUN_STANDALONE = true +UNSAFE_QUORUM = true + +[HISTORY.h0] + get = "curl -sf http://localhost:1170/{0} -o {1}" + +[QUORUM_SET] + THRESHOLD_PERCENT = 100 + VALIDATORS = ["GCZBOIAY4HLKAJVNJORXZOZRAY2BJDBZHKPBHZCRAIUR5IHC2UHBGCQR"] diff --git a/ingest/ledgerbackend/testdata/expected-online-core.cfg b/ingest/ledgerbackend/testdata/expected-online-core.cfg index 464554156e..e5944587ca 100644 --- a/ingest/ledgerbackend/testdata/expected-online-core.cfg +++ b/ingest/ledgerbackend/testdata/expected-online-core.cfg @@ -1,21 +1,20 @@ -# Generated file -- do not edit -NODE_IS_VALIDATOR=false -DISABLE_XDR_FSYNC=true -NETWORK_PASSPHRASE="Public Global Stellar Network ; September 2015" -HTTP_PORT=6789 -LOG_FILE_PATH="" -PEER_PORT=12345 +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = -1 +HTTP_PORT = 6789 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +PEER_PORT = 12345 [[HOME_DOMAINS]] -HOME_DOMAIN="testnet.stellar.org" -QUALITY="MEDIUM" + HOME_DOMAIN = "testnet.stellar.org" + QUALITY = "MEDIUM" [[VALIDATORS]] -NAME="sdf_testnet_1" -HOME_DOMAIN="testnet.stellar.org" -PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" -ADDRESS="core-testnet1.stellar.org" - + ADDRESS = "localhost:123" + HOME_DOMAIN = "testnet.stellar.org" + NAME = "sdf_testnet_1" + PUBLIC_KEY = "GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" [HISTORY.h0] -get="curl -sf http://localhost:1170/{0} -o {1}" \ No newline at end of file + get = "curl -sf http://localhost:1170/{0} -o {1}" diff --git a/ingest/ledgerbackend/testdata/expected-online-with-no-http-port.cfg b/ingest/ledgerbackend/testdata/expected-online-with-no-http-port.cfg new file mode 100644 index 0000000000..249101f33c --- /dev/null +++ b/ingest/ledgerbackend/testdata/expected-online-with-no-http-port.cfg @@ -0,0 +1,20 @@ +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = -1 +HTTP_PORT = 11626 +LOG_FILE_PATH = "" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" +PEER_PORT = 12345 + +[[HOME_DOMAINS]] + HOME_DOMAIN = "testnet.stellar.org" + QUALITY = "MEDIUM" + +[[VALIDATORS]] + ADDRESS = "localhost:123" + HOME_DOMAIN = "testnet.stellar.org" + NAME = "sdf_testnet_1" + PUBLIC_KEY = "GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" + +[HISTORY.h0] + get = "curl -sf http://localhost:1170/{0} -o {1}" diff --git a/ingest/ledgerbackend/testdata/expected-online-with-no-peer-port.cfg b/ingest/ledgerbackend/testdata/expected-online-with-no-peer-port.cfg new file mode 100644 index 0000000000..356fc6c736 --- /dev/null +++ b/ingest/ledgerbackend/testdata/expected-online-with-no-peer-port.cfg @@ -0,0 +1,19 @@ +# Generated file, do not edit +DISABLE_XDR_FSYNC = true +FAILURE_SAFETY = -1 +HTTP_PORT = 6789 +LOG_FILE_PATH = "/var/stellar-core/test.log" +NETWORK_PASSPHRASE = "Public Global Stellar Network ; September 2015" + +[[HOME_DOMAINS]] + HOME_DOMAIN = "testnet.stellar.org" + QUALITY = "MEDIUM" + +[[VALIDATORS]] + ADDRESS = "localhost:123" + HOME_DOMAIN = "testnet.stellar.org" + NAME = "sdf_testnet_1" + PUBLIC_KEY = "GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" + +[HISTORY.h0] + get = "curl -sf http://localhost:1170/{0} -o {1}" diff --git a/ingest/ledgerbackend/testdata/invalid-home-domain-quality.cfg b/ingest/ledgerbackend/testdata/invalid-home-domain-quality.cfg new file mode 100644 index 0000000000..715e0286bc --- /dev/null +++ b/ingest/ledgerbackend/testdata/invalid-home-domain-quality.cfg @@ -0,0 +1,9 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="DECENT" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/testdata/sample-appendix.cfg b/ingest/ledgerbackend/testdata/sample-appendix.cfg index bb547755a6..08791e06a2 100644 --- a/ingest/ledgerbackend/testdata/sample-appendix.cfg +++ b/ingest/ledgerbackend/testdata/sample-appendix.cfg @@ -6,4 +6,4 @@ QUALITY="MEDIUM" NAME="sdf_testnet_1" HOME_DOMAIN="testnet.stellar.org" PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" -ADDRESS="core-testnet1.stellar.org" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/testdata/validator-has-invalid-public-key.cfg b/ingest/ledgerbackend/testdata/validator-has-invalid-public-key.cfg new file mode 100644 index 0000000000..46fb13e6f9 --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-has-invalid-public-key.cfg @@ -0,0 +1,6 @@ +[[VALIDATORS]] +NAME="sdf_testnet_2" +HOME_DOMAIN="testnet2.stellar.org" +PUBLIC_KEY="invalid-key" +ADDRESS="localhost:9834" +QUALITY="HIGH" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/validator-has-invalid-quality.cfg b/ingest/ledgerbackend/testdata/validator-has-invalid-quality.cfg new file mode 100644 index 0000000000..863eba5d23 --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-has-invalid-quality.cfg @@ -0,0 +1,6 @@ +[[VALIDATORS]] +NAME="sdf_testnet_2" +HOME_DOMAIN="testnet2.stellar.org" +PUBLIC_KEY="GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ" +ADDRESS="localhost:9834" +QUALITY="DECENT" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/validator-missing-home-domain.cfg b/ingest/ledgerbackend/testdata/validator-missing-home-domain.cfg new file mode 100644 index 0000000000..95d7d95de4 --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-missing-home-domain.cfg @@ -0,0 +1,9 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" +QUALITY="MEDIUM" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/validator-missing-name.cfg b/ingest/ledgerbackend/testdata/validator-missing-name.cfg new file mode 100644 index 0000000000..d3ace191cb --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-missing-name.cfg @@ -0,0 +1,5 @@ +[[VALIDATORS]] +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" +QUALITY="MEDIUM" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/validator-missing-public-key.cfg b/ingest/ledgerbackend/testdata/validator-missing-public-key.cfg new file mode 100644 index 0000000000..61d11b0628 --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-missing-public-key.cfg @@ -0,0 +1,8 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +ADDRESS="localhost:123" \ No newline at end of file diff --git a/ingest/ledgerbackend/testdata/validator-missing-quality.cfg b/ingest/ledgerbackend/testdata/validator-missing-quality.cfg new file mode 100644 index 0000000000..eab0af956a --- /dev/null +++ b/ingest/ledgerbackend/testdata/validator-missing-quality.cfg @@ -0,0 +1,15 @@ +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" + +[[VALIDATORS]] +NAME="sdf_testnet_2" +HOME_DOMAIN="testnet2.stellar.org" +PUBLIC_KEY="GDV46EIEF57TDL4W27UFDAUVPDDCKJNVBYB3WIV2WYUYUG753FCFU6EJ" +ADDRESS="localhost:9834" diff --git a/ingest/ledgerbackend/toml.go b/ingest/ledgerbackend/toml.go new file mode 100644 index 0000000000..20668d5920 --- /dev/null +++ b/ingest/ledgerbackend/toml.go @@ -0,0 +1,517 @@ +package ledgerbackend + +import ( + "bytes" + "fmt" + "io/ioutil" + "regexp" + "strings" + + "github.com/stellar/go/support/errors" + "github.com/stellar/go/support/log" + "github.com/stellar/go/xdr" + + "github.com/pelletier/go-toml" +) + +const ( + defaultHTTPPort = 11626 + defaultFailureSafety = -1 + + // if LOG_FILE_PATH is omitted stellar core actually defaults to "stellar-core.log" + // however, we are overriding this default for captive core + defaultLogFilePath = "" // by default we disable logging to a file + + // if DISABLE_XDR_FSYNC is omitted stellar core actually defaults to false + // however, we are overriding this default for captive core + defaultDisableXDRFsync = true +) + +var validQuality = map[string]bool{ + "CRITICAL": true, + "HIGH": true, + "MEDIUM": true, + "LOW": true, +} + +// Validator represents a [[VALIDATORS]] entry in the captive core toml file. +type Validator struct { + Name string `toml:"NAME"` + Quality string `toml:"QUALITY,omitempty"` + HomeDomain string `toml:"HOME_DOMAIN"` + PublicKey string `toml:"PUBLIC_KEY"` + Address string `toml:"ADDRESS,omitempty"` + History string `toml:"HISTORY,omitempty"` +} + +// HomeDomain represents a [[HOME_DOMAINS]] entry in the captive core toml file. +type HomeDomain struct { + HomeDomain string `toml:"HOME_DOMAIN"` + Quality string `toml:"QUALITY"` +} + +// History represents a [HISTORY] table in the captive core toml file. +type History struct { + Get string `toml:"get"` + // should we allow put and mkdir for captive core? + Put string `toml:"put,omitempty"` + Mkdir string `toml:"mkdir,omitempty"` +} + +// QuorumSet represents a [QUORUM_SET] table in the captive core toml file. +type QuorumSet struct { + ThresholdPercent int `toml:"THRESHOLD_PERCENT"` + Validators []string `toml:"VALIDATORS"` +} + +type captiveCoreTomlValues struct { + // we cannot omitempty because the empty string is a valid configuration for LOG_FILE_PATH + // and the default is stellar-core.log + LogFilePath string `toml:"LOG_FILE_PATH"` + BucketDirPath string `toml:"BUCKET_DIR_PATH,omitempty"` + // we cannot omitempty because 0 is a valid configuration for HTTP_PORT + // and the default is 11626 + HTTPPort uint `toml:"HTTP_PORT"` + PublicHTTPPort bool `toml:"PUBLIC_HTTP_PORT,omitempty"` + NodeNames []string `toml:"NODE_NAMES,omitempty"` + NetworkPassphrase string `toml:"NETWORK_PASSPHRASE,omitempty"` + PeerPort uint `toml:"PEER_PORT,omitempty"` + // we cannot omitempty because 0 is a valid configuration for FAILURE_SAFETY + // and the default is -1 + FailureSafety int `toml:"FAILURE_SAFETY"` + UnsafeQuorum bool `toml:"UNSAFE_QUORUM,omitempty"` + RunStandalone bool `toml:"RUN_STANDALONE,omitempty"` + ArtificiallyAccelerateTimeForTesting bool `toml:"ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING,omitempty"` + DisableXDRFsync bool `toml:"DISABLE_XDR_FSYNC,omitempty"` + HomeDomains []HomeDomain `toml:"HOME_DOMAINS,omitempty"` + Validators []Validator `toml:"VALIDATORS,omitempty"` + HistoryEntries map[string]History `toml:"-"` + QuorumSetEntries map[string]QuorumSet `toml:"-"` +} + +// QuorumSetIsConfigured returns true if there is a quorum set defined in the configuration. +func (c *captiveCoreTomlValues) QuorumSetIsConfigured() bool { + return len(c.QuorumSetEntries) > 0 || len(c.Validators) > 0 +} + +// HistoryIsConfigured returns true if the history archive locations are configured. +func (c *captiveCoreTomlValues) HistoryIsConfigured() bool { + if len(c.HistoryEntries) > 0 { + return true + } + for _, v := range c.Validators { + if v.History != "" { + return true + } + } + return false +} + +type placeholders struct { + labels map[string]string + count int +} + +func (p *placeholders) newPlaceholder(key string) string { + if p.labels == nil { + p.labels = map[string]string{} + } + placeHolder := fmt.Sprintf("__placeholder_label_%d__", p.count) + p.count++ + p.labels[placeHolder] = key + return placeHolder +} + +func (p *placeholders) get(placeholder string) (string, bool) { + if p.labels == nil { + return "", false + } + val, ok := p.labels[placeholder] + return val, ok +} + +// CaptiveCoreToml represents a parsed captive core configuration. +type CaptiveCoreToml struct { + captiveCoreTomlValues + tree *toml.Tree + tablePlaceholders *placeholders +} + +// flattenTables will transform a given toml text by flattening all nested tables +// whose root can be found in `rootNames`. +// +// In the TOML spec dotted keys represents nesting. So we flatten the table key by replacing each table +// path with a placeholder. For example: +// +// text := `[QUORUM_SET.a.b.c] +// THRESHOLD_PERCENT=67 +// VALIDATORS=["a","b"]` +// flattenTables(text, []string{"QUORUM_SET"}) -> +// +// `[__placeholder_label_0__] +// THRESHOLD_PERCENT=67 +// VALIDATORS=["a","b"]` +func flattenTables(text string, rootNames []string) (string, *placeholders) { + orExpression := strings.Join(rootNames, "|") + re := regexp.MustCompile(`\[(` + orExpression + `)(\..+)?\]`) + + tablePlaceHolders := &placeholders{} + + flattened := re.ReplaceAllStringFunc(text, func(match string) string { + insideBrackets := match[1 : len(match)-1] + return "[" + tablePlaceHolders.newPlaceholder(insideBrackets) + "]" + }) + return flattened, tablePlaceHolders +} + +// unflattenTables is the inverse of flattenTables, it restores the +// text back to its original form by replacing all placeholders with their +// original values. +func unflattenTables(text string, tablePlaceHolders *placeholders) string { + re := regexp.MustCompile(`\[.*\]`) + + return re.ReplaceAllStringFunc(text, func(match string) string { + insideBrackets := match[1 : len(match)-1] + original, ok := tablePlaceHolders.get(insideBrackets) + if !ok { + return match + } + return "[" + original + "]" + }) +} + +// Marshal serializes the CaptiveCoreToml into a toml document. +func (c *CaptiveCoreToml) Marshal() ([]byte, error) { + var sb strings.Builder + sb.WriteString("# Generated file, do not edit\n") + encoder := toml.NewEncoder(&sb) + if err := encoder.Encode(c.captiveCoreTomlValues); err != nil { + return nil, errors.Wrap(err, "could not encode toml file") + } + + if len(c.HistoryEntries) > 0 { + if err := encoder.Encode(c.HistoryEntries); err != nil { + return nil, errors.Wrap(err, "could not encode history entries") + } + } + + if len(c.QuorumSetEntries) > 0 { + if err := encoder.Encode(c.QuorumSetEntries); err != nil { + return nil, errors.Wrap(err, "could not encode quorum set") + } + } + + return []byte(unflattenTables(sb.String(), c.tablePlaceholders)), nil +} + +func unmarshalTreeNode(t *toml.Tree, key string, dest interface{}) error { + tree, ok := t.Get(key).(*toml.Tree) + if !ok { + return fmt.Errorf("unexpected key %v", key) + } + return tree.Unmarshal(dest) +} + +func (c *CaptiveCoreToml) unmarshal(data []byte) error { + var body captiveCoreTomlValues + quorumSetEntries := map[string]QuorumSet{} + historyEntries := map[string]History{} + // The toml library has trouble with nested tables so we need to flatten all nested + // QUORUM_SET and HISTORY tables as a workaround. + // In Marshal() we apply the inverse process to unflatten the nested tables. + flattened, tablePlaceholders := flattenTables(string(data), []string{"QUORUM_SET", "HISTORY"}) + + data = []byte(flattened) + tree, err := toml.Load(flattened) + if err != nil { + return err + } + + err = toml.NewDecoder(bytes.NewReader(data)).Decode(&body) + if err != nil { + return err + } + + for _, key := range tree.Keys() { + originalKey, ok := tablePlaceholders.get(key) + if !ok { + continue + } + + switch { + case strings.HasPrefix(originalKey, "QUORUM_SET"): + var qs QuorumSet + if err = unmarshalTreeNode(tree, key, &qs); err != nil { + return err + } + quorumSetEntries[key] = qs + case strings.HasPrefix(originalKey, "HISTORY"): + var h History + if err = unmarshalTreeNode(tree, key, &h); err != nil { + return err + } + historyEntries[key] = h + } + } + + c.tree = tree + c.captiveCoreTomlValues = body + c.tablePlaceholders = tablePlaceholders + c.QuorumSetEntries = quorumSetEntries + c.HistoryEntries = historyEntries + return nil +} + +// CaptiveCoreTomlParams defines captive core configuration provided by Horizon flags. +type CaptiveCoreTomlParams struct { + // NetworkPassphrase is the Stellar network passphrase used by captive core when connecting to the Stellar network. + NetworkPassphrase string + // HistoryArchiveURLs are a list of history archive urls. + HistoryArchiveURLs []string + // HTTPPort is the TCP port to listen for requests (defaults to 0, which disables the HTTP server). + HTTPPort *uint + // PeerPort is the TCP port to bind to for connecting to the Stellar network + // (defaults to 11625). It may be useful for example when there's >1 Stellar-Core + // instance running on a machine. + PeerPort *uint + // LogPath is the (optional) path in which to store Core logs, passed along + // to Stellar Core's LOG_FILE_PATH. + LogPath *string +} + +// NewCaptiveCoreTomlFromFile constructs a new CaptiveCoreToml instance by merging configuration +// from the toml file located at `configPath` and the configuration provided by `params`. +func NewCaptiveCoreTomlFromFile(configPath string, params CaptiveCoreTomlParams) (*CaptiveCoreToml, error) { + var captiveCoreToml CaptiveCoreToml + data, err := ioutil.ReadFile(configPath) + if err != nil { + return nil, errors.Wrap(err, "could not load toml path") + } + + if err = captiveCoreToml.unmarshal(data); err != nil { + return nil, errors.Wrap(err, "could not unmarshal captive core toml") + } + + if err = captiveCoreToml.validate(params); err != nil { + return nil, errors.Wrap(err, "invalid captive core toml") + } + + if len(captiveCoreToml.HistoryEntries) > 0 { + log.Warnf( + "Configuring captive core with history archive from %s instead of %v", + configPath, + params.HistoryArchiveURLs, + ) + } + + captiveCoreToml.setDefaults(params) + return &captiveCoreToml, nil +} + +// NewCaptiveCoreToml constructs a new CaptiveCoreToml instance based off +// the configuration in `params`. +func NewCaptiveCoreToml(params CaptiveCoreTomlParams) (*CaptiveCoreToml, error) { + var captiveCoreToml CaptiveCoreToml + var err error + + captiveCoreToml.tablePlaceholders = &placeholders{} + captiveCoreToml.tree, err = toml.TreeFromMap(map[string]interface{}{}) + if err != nil { + return nil, err + } + + captiveCoreToml.setDefaults(params) + return &captiveCoreToml, nil +} + +func (c *CaptiveCoreToml) clone() (*CaptiveCoreToml, error) { + data, err := c.Marshal() + if err != nil { + return nil, errors.Wrap(err, "could not marshal toml") + } + var cloned CaptiveCoreToml + if err = cloned.unmarshal(data); err != nil { + return nil, errors.Wrap(err, "could not unmarshal captive core toml") + } + return &cloned, nil +} + +// CatchupToml returns a new CaptiveCoreToml instance based off the existing +// instance with some modifications which are suitable for running +// the catchup command on captive core. +func (c *CaptiveCoreToml) CatchupToml() (*CaptiveCoreToml, error) { + offline, err := c.clone() + if err != nil { + return nil, errors.Wrap(err, "could not clone toml") + } + + offline.RunStandalone = true + offline.UnsafeQuorum = true + offline.PublicHTTPPort = false + offline.HTTPPort = 0 + offline.FailureSafety = 0 + + if !c.QuorumSetIsConfigured() { + // Add a fictional quorum -- necessary to convince core to start up; + // but not used at all for our purposes. Pubkey here is just random. + offline.QuorumSetEntries = map[string]QuorumSet{ + "QUORUM_SET": QuorumSet{ + ThresholdPercent: 100, + Validators: []string{"GCZBOIAY4HLKAJVNJORXZOZRAY2BJDBZHKPBHZCRAIUR5IHC2UHBGCQR"}, + }, + } + } + return offline, nil +} + +func (c *CaptiveCoreToml) setDefaults(params CaptiveCoreTomlParams) { + if !c.tree.Has("NETWORK_PASSPHRASE") { + c.NetworkPassphrase = params.NetworkPassphrase + } + + if def := c.tree.Has("HTTP_PORT"); !def && params.HTTPPort != nil { + c.HTTPPort = *params.HTTPPort + } else if !def && params.HTTPPort == nil { + c.HTTPPort = defaultHTTPPort + } + + if def := c.tree.Has("PEER_PORT"); !def && params.PeerPort != nil { + c.PeerPort = *params.PeerPort + } + + if def := c.tree.Has("LOG_FILE_PATH"); !def && params.LogPath != nil { + c.LogFilePath = *params.LogPath + } else if !def && params.LogPath == nil { + c.LogFilePath = defaultLogFilePath + } + + if !c.tree.Has("FAILURE_SAFETY") { + c.FailureSafety = defaultFailureSafety + } + if !c.tree.Has("DISABLE_XDR_FSYNC") { + c.DisableXDRFsync = defaultDisableXDRFsync + } + + if !c.HistoryIsConfigured() { + c.HistoryEntries = map[string]History{} + for i, val := range params.HistoryArchiveURLs { + name := fmt.Sprintf("HISTORY.h%d", i) + c.HistoryEntries[c.tablePlaceholders.newPlaceholder(name)] = History{ + Get: fmt.Sprintf("curl -sf %s/{0} -o {1}", val), + } + } + } +} + +func (c *CaptiveCoreToml) validate(params CaptiveCoreTomlParams) error { + if def := c.tree.Has("NETWORK_PASSPHRASE"); def && c.NetworkPassphrase != params.NetworkPassphrase { + return fmt.Errorf( + "NETWORK_PASSPHRASE in captive core config file: %s does not match Horizon network-passphrase flag: %s", + c.NetworkPassphrase, + params.NetworkPassphrase, + ) + } + + if def := c.tree.Has("HTTP_PORT"); def && params.HTTPPort != nil && c.HTTPPort != *params.HTTPPort { + return fmt.Errorf( + "HTTP_PORT in captive core config file: %d does not match Horizon captive-core-http-port flag: %d", + c.HTTPPort, + *params.HTTPPort, + ) + } + + if def := c.tree.Has("PEER_PORT"); def && params.PeerPort != nil && c.PeerPort != *params.PeerPort { + return fmt.Errorf( + "PEER_PORT in captive core config file: %d does not match Horizon captive-core-peer-port flag: %d", + c.PeerPort, + *params.PeerPort, + ) + } + + if def := c.tree.Has("LOG_FILE_PATH"); def && params.LogPath != nil && c.LogFilePath != *params.LogPath { + return fmt.Errorf( + "LOG_FILE_PATH in captive core config file: %s does not match Horizon captive-core-log-path flag: %s", + c.LogFilePath, + *params.LogPath, + ) + } + + homeDomainSet := map[string]HomeDomain{} + for _, hd := range c.HomeDomains { + if _, ok := homeDomainSet[hd.HomeDomain]; ok { + return fmt.Errorf( + "found duplicate home domain in captive core configuration: %s", + hd.HomeDomain, + ) + } + if hd.HomeDomain == "" { + return fmt.Errorf( + "found invalid home domain entry which is missing a HOME_DOMAIN value", + ) + } + if hd.Quality == "" { + return fmt.Errorf( + "found invalid home domain entry which is missing a QUALITY value: %s", + hd.HomeDomain, + ) + } + if !validQuality[hd.Quality] { + return fmt.Errorf( + "found invalid home domain entry which has an invalid QUALITY value: %s", + hd.HomeDomain, + ) + } + homeDomainSet[hd.HomeDomain] = hd + } + + names := map[string]bool{} + for _, v := range c.Validators { + if names[v.Name] { + return fmt.Errorf( + "found duplicate validator in captive core configuration: %s", + v.Name, + ) + } + if v.Name == "" { + return fmt.Errorf( + "found invalid validator entry which is missing a NAME value: %s", + v.Name, + ) + } + if v.HomeDomain == "" { + return fmt.Errorf( + "found invalid validator entry which is missing a HOME_DOMAIN value: %s", + v.Name, + ) + } + if v.PublicKey == "" { + return fmt.Errorf( + "found invalid validator entry which is missing a PUBLIC_KEY value: %s", + v.Name, + ) + } + if _, err := xdr.AddressToAccountId(v.PublicKey); err != nil { + return fmt.Errorf( + "found invalid validator entry which has an invalid PUBLIC_KEY : %s", + v.Name, + ) + } + if v.Quality == "" { + if _, ok := homeDomainSet[v.HomeDomain]; !ok { + return fmt.Errorf( + "found invalid validator entry which is missing a QUALITY value: %s", + v.Name, + ) + } + } else if !validQuality[v.Quality] { + return fmt.Errorf( + "found invalid validator entry which has an invalid QUALITY value: %s", + v.Name, + ) + } + + names[v.Name] = true + } + + return nil +} diff --git a/ingest/ledgerbackend/toml_test.go b/ingest/ledgerbackend/toml_test.go new file mode 100644 index 0000000000..3a9f7c92ad --- /dev/null +++ b/ingest/ledgerbackend/toml_test.go @@ -0,0 +1,294 @@ +package ledgerbackend + +import ( + "github.com/stretchr/testify/assert" + "io/ioutil" + "path/filepath" + "testing" +) + +func newUint(v uint) *uint { + return &v +} + +func newString(s string) *string { + return &s +} + +func TestCaptiveCoreTomlValidation(t *testing.T) { + for _, testCase := range []struct { + name string + networkPassphrase string + appendPath string + httpPort *uint + peerPort *uint + logPath *string + expectedError string + }{ + { + name: "mismatching NETWORK_PASSPHRASE", + networkPassphrase: "bogus passphrase", + appendPath: filepath.Join("testdata", "appendix-with-fields.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + expectedError: "invalid captive core toml: NETWORK_PASSPHRASE in captive core config file: " + + "Public Global Stellar Network ; September 2015 does not match Horizon network-passphrase " + + "flag: bogus passphrase", + }, + { + name: "mismatching HTTP_PORT", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "appendix-with-fields.cfg"), + httpPort: newUint(1161), + peerPort: newUint(12345), + logPath: nil, + expectedError: "invalid captive core toml: HTTP_PORT in captive core config file: 6789 " + + "does not match Horizon captive-core-http-port flag: 1161", + }, + { + name: "mismatching PEER_PORT", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "appendix-with-fields.cfg"), + httpPort: newUint(6789), + peerPort: newUint(2346), + logPath: nil, + expectedError: "invalid captive core toml: PEER_PORT in captive core config file: 12345 " + + "does not match Horizon captive-core-peer-port flag: 2346", + }, + { + name: "mismatching LOG_FILE_PATH", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "appendix-with-fields.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: newString("/my/test/path"), + expectedError: "invalid captive core toml: LOG_FILE_PATH in captive core config file: " + + "does not match Horizon captive-core-log-path flag: /my/test/path", + }, + { + name: "duplicate HOME_DOMAIN entry", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "duplicate-home-domain.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found duplicate home domain in captive " + + "core configuration: testnet.stellar.org", + }, + { + name: "empty HOME_DOMAIN entry", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "empty-home-domain.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid home domain entry which is " + + "missing a HOME_DOMAIN value", + }, + { + name: "HOME_DOMAIN with empty QUALITY", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "empty-home-domain-quality.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid home domain entry which is " + + "missing a QUALITY value: testnet.stellar.org", + }, + { + name: "HOME_DOMAIN with invalid QUALITY", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "invalid-home-domain-quality.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid home domain entry which has an " + + "invalid QUALITY value: testnet.stellar.org", + }, + { + name: "duplicate VALIDATOR entry", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "duplicate-validator.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found duplicate validator in captive core " + + "configuration: sdf_testnet_1", + }, + { + name: "VALIDATOR with invalid public key", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-has-invalid-public-key.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which has an invalid " + + "PUBLIC_KEY : sdf_testnet_2", + }, + { + name: "VALIDATOR with invalid quality", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-has-invalid-quality.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which has an invalid " + + "QUALITY value: sdf_testnet_2", + }, + { + name: "VALIDATOR without home domain", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-missing-home-domain.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which is missing a " + + "HOME_DOMAIN value: sdf_testnet_1", + }, + { + name: "VALIDATOR without name", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-missing-name.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which is missing " + + "a NAME value: ", + }, + { + name: "VALIDATOR without public key", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-missing-public-key.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which is missing " + + "a PUBLIC_KEY value: sdf_testnet_1", + }, + { + name: "VALIDATOR without quality", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "validator-missing-quality.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "invalid captive core toml: found invalid validator entry which is missing " + + "a QUALITY value: sdf_testnet_2", + }, + } { + t.Run(testCase.name, func(t *testing.T) { + params := CaptiveCoreTomlParams{ + NetworkPassphrase: testCase.networkPassphrase, + HistoryArchiveURLs: []string{"http://localhost:1170"}, + HTTPPort: testCase.httpPort, + PeerPort: testCase.peerPort, + LogPath: testCase.logPath, + } + _, err := NewCaptiveCoreTomlFromFile(testCase.appendPath, params) + assert.EqualError(t, err, testCase.expectedError) + }) + } +} + +func TestGenerateConfig(t *testing.T) { + for _, testCase := range []struct { + name string + appendPath string + mode stellarCoreRunnerMode + expectedPath string + httpPort *uint + peerPort *uint + logPath *string + }{ + { + name: "offline config with no appendix", + mode: stellarCoreRunnerModeOffline, + appendPath: "", + expectedPath: filepath.Join("testdata", "expected-offline-core.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + }, + { + name: "offline config with no peer port", + mode: stellarCoreRunnerModeOffline, + appendPath: "", + expectedPath: filepath.Join("testdata", "expected-offline-with-no-peer-port.cfg"), + httpPort: newUint(6789), + peerPort: nil, + logPath: newString("/var/stellar-core/test.log"), + }, + { + name: "online config with appendix", + mode: stellarCoreRunnerModeOnline, + appendPath: filepath.Join("testdata", "sample-appendix.cfg"), + expectedPath: filepath.Join("testdata", "expected-online-core.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + }, + { + name: "online config with no peer port", + mode: stellarCoreRunnerModeOnline, + appendPath: filepath.Join("testdata", "sample-appendix.cfg"), + expectedPath: filepath.Join("testdata", "expected-online-with-no-peer-port.cfg"), + httpPort: newUint(6789), + peerPort: nil, + logPath: newString("/var/stellar-core/test.log"), + }, + { + name: "online config with no http port", + mode: stellarCoreRunnerModeOnline, + appendPath: filepath.Join("testdata", "sample-appendix.cfg"), + expectedPath: filepath.Join("testdata", "expected-online-with-no-http-port.cfg"), + httpPort: nil, + peerPort: newUint(12345), + logPath: nil, + }, + { + name: "offline config with appendix", + mode: stellarCoreRunnerModeOffline, + appendPath: filepath.Join("testdata", "sample-appendix.cfg"), + expectedPath: filepath.Join("testdata", "expected-offline-with-appendix-core.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + }, + { + name: "offline config with extra fields in appendix", + mode: stellarCoreRunnerModeOffline, + appendPath: filepath.Join("testdata", "appendix-with-fields.cfg"), + expectedPath: filepath.Join("testdata", "expected-offline-with-extra-fields.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + var err error + var captiveCoreToml *CaptiveCoreToml + params := CaptiveCoreTomlParams{ + NetworkPassphrase: "Public Global Stellar Network ; September 2015", + HistoryArchiveURLs: []string{"http://localhost:1170"}, + HTTPPort: testCase.httpPort, + PeerPort: testCase.peerPort, + LogPath: testCase.logPath, + } + if testCase.appendPath != "" { + captiveCoreToml, err = NewCaptiveCoreTomlFromFile(testCase.appendPath, params) + } else { + captiveCoreToml, err = NewCaptiveCoreToml(params) + } + assert.NoError(t, err) + + configBytes, err := generateConfig(captiveCoreToml, testCase.mode) + assert.NoError(t, err) + + expectedByte, err := ioutil.ReadFile(testCase.expectedPath) + assert.NoError(t, err) + + assert.Equal(t, string(configBytes), string(expectedByte)) + }) + } +} diff --git a/ingest/tutorial/example_common.go b/ingest/tutorial/example_common.go index b10829352b..133ac02de6 100644 --- a/ingest/tutorial/example_common.go +++ b/ingest/tutorial/example_common.go @@ -7,18 +7,30 @@ import ( ) var ( - config = ledgerbackend.CaptiveCoreConfig{ + config = captiveCoreConfig() +) + +func captiveCoreConfig() ledgerbackend.CaptiveCoreConfig { + archiveURLs := []string{ + "https://history.stellar.org/prd/core-testnet/core_testnet_001", + "https://history.stellar.org/prd/core-testnet/core_testnet_002", + "https://history.stellar.org/prd/core-testnet/core_testnet_003", + } + networkPassphrase := "Test SDF Network ; September 2015" + captiveCoreToml, err := ledgerbackend.NewCaptiveCoreToml(ledgerbackend.CaptiveCoreTomlParams{ + NetworkPassphrase: networkPassphrase, + HistoryArchiveURLs: archiveURLs, + }) + panicIf(err) + + return ledgerbackend.CaptiveCoreConfig{ // Change these based on your environment: - BinaryPath: "/usr/local/bin/stellar-core", - ConfigAppendPath: "stellar-core-stub.toml", - NetworkPassphrase: "Test SDF Network ; September 2015", - HistoryArchiveURLs: []string{ - "https://history.stellar.org/prd/core-testnet/core_testnet_001", - "https://history.stellar.org/prd/core-testnet/core_testnet_002", - "https://history.stellar.org/prd/core-testnet/core_testnet_003", - }, + BinaryPath: "/usr/local/bin/stellar-core", + NetworkPassphrase: networkPassphrase, + HistoryArchiveURLs: archiveURLs, + Toml: captiveCoreToml, } -) +} func panicIf(err error) { if err != nil { diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 25326cdd5e..724d3e7707 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -5,6 +5,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +* Improve parsing logic for captive core toml configuration ([3558](https://github.com/stellar/go/pull/3558)). * Refactor `ingest/ledgerbackend/LedgerBackend.GetLedger` method to always block, removing `ingest/ledgerbackend/LedgerBackend.GetLedgerBlocking`. Adds a first `context.Context` param to most `LedgerBackend` methods. ## v2.2.0 diff --git a/services/horizon/cmd/db.go b/services/horizon/cmd/db.go index 67323cd3f0..91957b4062 100644 --- a/services/horizon/cmd/db.go +++ b/services/horizon/cmd/db.go @@ -251,7 +251,10 @@ func RunDBReingestRange(from, to uint32, reingestForce bool, parallelWorkers uin EnableCaptiveCore: config.EnableCaptiveCoreIngestion, CaptiveCoreBinaryPath: config.CaptiveCoreBinaryPath, RemoteCaptiveCoreURL: config.RemoteCaptiveCoreURL, - CaptiveCoreConfigAppendPath: config.CaptiveCoreConfigAppendPath, + CaptiveCoreToml: config.CaptiveCoreToml, + CaptiveCoreStoragePath: config.CaptiveCoreStoragePath, + StellarCoreCursor: config.CursorName, + StellarCoreURL: config.StellarCoreURL, } if !ingestConfig.EnableCaptiveCore { diff --git a/services/horizon/internal/config.go b/services/horizon/internal/config.go index 2bca813e91..3b1e80306a 100644 --- a/services/horizon/internal/config.go +++ b/services/horizon/internal/config.go @@ -1,6 +1,7 @@ package horizon import ( + "github.com/stellar/go/ingest/ledgerbackend" "net/url" "time" @@ -16,14 +17,13 @@ type Config struct { Port uint AdminPort uint - EnableCaptiveCoreIngestion bool - CaptiveCoreBinaryPath string - CaptiveCoreConfigAppendPath string - RemoteCaptiveCoreURL string - CaptiveCoreHTTPPort uint - CaptiveCorePeerPort uint - CaptiveCoreLogPath string - CaptiveCoreStoragePath string + EnableCaptiveCoreIngestion bool + CaptiveCoreBinaryPath string + RemoteCaptiveCoreURL string + CaptiveCoreConfigPath string + CaptiveCoreTomlParams ledgerbackend.CaptiveCoreTomlParams + CaptiveCoreToml *ledgerbackend.CaptiveCoreToml + CaptiveCoreStoragePath string StellarCoreDatabaseURL string StellarCoreURL string diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index 3dba16e441..d7f878ee40 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -2,6 +2,7 @@ package horizon import ( "fmt" + "github.com/stellar/go/ingest/ledgerbackend" "go/types" stdLog "log" "os" @@ -23,7 +24,7 @@ const ( DatabaseURLFlagName = "db-url" // StellarCoreDBURLFlagName is the command line flag for configuring the postgres Stellar Core URL StellarCoreDBURLFlagName = "stellar-core-db-url" - // StellarCoreDBURLFlagName is the command line flag for configuring the URL fore Stellar Core HTTP endpoint + // StellarCoreURLFlagName is the command line flag for configuring the URL fore Stellar Core HTTP endpoint StellarCoreURLFlagName = "stellar-core-url" // StellarCoreBinaryPathName is the command line flag for configuring the path to the stellar core binary StellarCoreBinaryPathName = "stellar-core-binary-path" @@ -115,7 +116,7 @@ func Flags() (*Config, support.ConfigOptions) { FlagDefault: "", Required: false, Usage: "path to additional configuration for the Stellar Core configuration file used by captive core. It must, at least, include enough details to define a quorum set", - ConfigKey: &config.CaptiveCoreConfigAppendPath, + ConfigKey: &config.CaptiveCoreConfigPath, }, &support.ConfigOption{ Name: "enable-captive-core-ingestion", @@ -126,17 +127,17 @@ func Flags() (*Config, support.ConfigOptions) { ConfigKey: &config.EnableCaptiveCoreIngestion, }, &support.ConfigOption{ - Name: "captive-core-http-port", - OptType: types.Uint, - FlagDefault: uint(11626), - Required: false, - Usage: "HTTP port for Captive Core to listen on (0 disables the HTTP server)", - ConfigKey: &config.CaptiveCoreHTTPPort, + Name: "captive-core-http-port", + OptType: types.Uint, + CustomSetValue: support.SetOptionalUint, + Required: false, + FlagDefault: uint(0), + Usage: "HTTP port for Captive Core to listen on (0 disables the HTTP server)", + ConfigKey: &config.CaptiveCoreTomlParams.HTTPPort, }, &support.ConfigOption{ - Name: "captive-core-storage-path", - OptType: types.String, - FlagDefault: "", + Name: "captive-core-storage-path", + OptType: types.String, CustomSetValue: func(opt *support.ConfigOption) { existingValue := viper.GetString(opt.Name) if existingValue == "" || existingValue == "." { @@ -153,12 +154,13 @@ func Flags() (*Config, support.ConfigOptions) { ConfigKey: &config.CaptiveCoreStoragePath, }, &support.ConfigOption{ - Name: "captive-core-peer-port", - OptType: types.Uint, - FlagDefault: uint(0), - Required: false, - Usage: "port for Captive Core to bind to for connecting to the Stellar swarm (0 uses Stellar Core's default)", - ConfigKey: &config.CaptiveCorePeerPort, + Name: "captive-core-peer-port", + OptType: types.Uint, + FlagDefault: uint(0), + CustomSetValue: support.SetOptionalUint, + Required: false, + Usage: "port for Captive Core to bind to for connecting to the Stellar swarm (0 uses Stellar Core's default)", + ConfigKey: &config.CaptiveCoreTomlParams.PeerPort, }, &support.ConfigOption{ Name: StellarCoreDBURLFlagName, @@ -285,10 +287,12 @@ func Flags() (*Config, support.ConfigOptions) { Usage: "name of the file where logs will be saved (leave empty to send logs to stdout)", }, &support.ConfigOption{ - Name: "captive-core-log-path", - ConfigKey: &config.CaptiveCoreLogPath, - OptType: types.String, - Usage: "name of the path for Core logs (leave empty to log w/ Horizon only)", + Name: "captive-core-log-path", + ConfigKey: &config.CaptiveCoreTomlParams.LogPath, + OptType: types.String, + CustomSetValue: support.SetOptionalString, + Required: false, + Usage: "name of the path for Core logs (leave empty to log w/ Horizon only)", }, &support.ConfigOption{ Name: "max-path-length", @@ -480,20 +484,30 @@ func ApplyFlags(config *Config, flags support.ConfigOptions) { StellarCoreBinaryPathName, captiveCoreMigrationHint) } - if binaryPath == "" || config.CaptiveCoreConfigAppendPath == "" { + if config.RemoteCaptiveCoreURL == "" && (binaryPath == "" || config.CaptiveCoreConfigPath == "") { stdLog.Fatalf("Invalid config: captive core requires that both --%s and --%s are set. %s", StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName, captiveCoreMigrationHint) } + if config.RemoteCaptiveCoreURL == "" { + var err error + config.CaptiveCoreTomlParams.HistoryArchiveURLs = config.HistoryArchiveURLs + config.CaptiveCoreTomlParams.NetworkPassphrase = config.NetworkPassphrase + config.CaptiveCoreToml, err = ledgerbackend.NewCaptiveCoreTomlFromFile(config.CaptiveCoreConfigPath, config.CaptiveCoreTomlParams) + if err != nil { + stdLog.Fatalf("Invalid captive core toml file %v", err) + } + } + // If we don't supply an explicit core URL and we are running a local // captive core process with the http port enabled, point to it. - if config.StellarCoreURL == "" && config.RemoteCaptiveCoreURL == "" && config.CaptiveCoreHTTPPort != 0 { - config.StellarCoreURL = fmt.Sprintf("http://localhost:%d", config.CaptiveCoreHTTPPort) + if config.StellarCoreURL == "" && config.RemoteCaptiveCoreURL == "" && config.CaptiveCoreToml.HTTPPort != 0 { + config.StellarCoreURL = fmt.Sprintf("http://localhost:%d", config.CaptiveCoreToml.HTTPPort) viper.Set(StellarCoreURLFlagName, config.StellarCoreURL) } } } else { - if config.EnableCaptiveCoreIngestion && (config.CaptiveCoreBinaryPath != "" || config.CaptiveCoreConfigAppendPath != "") { + if config.EnableCaptiveCoreIngestion && (config.CaptiveCoreBinaryPath != "" || config.CaptiveCoreConfigPath != "") { stdLog.Fatalf("Invalid config: one or more captive core params passed (--%s or --%s) but --ingest not set. "+captiveCoreMigrationHint, StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName) } diff --git a/services/horizon/internal/ingest/main.go b/services/horizon/internal/ingest/main.go index a19890b703..6906889c74 100644 --- a/services/horizon/internal/ingest/main.go +++ b/services/horizon/internal/ingest/main.go @@ -66,18 +66,15 @@ const ( var log = logpkg.DefaultLogger.WithField("service", "ingest") type Config struct { - CoreSession *db.Session - StellarCoreURL string - StellarCoreCursor string - EnableCaptiveCore bool - CaptiveCoreBinaryPath string - CaptiveCoreStoragePath string - CaptiveCoreConfigAppendPath string - CaptiveCoreHTTPPort uint - CaptiveCorePeerPort uint - CaptiveCoreLogPath string - RemoteCaptiveCoreURL string - NetworkPassphrase string + CoreSession *db.Session + StellarCoreURL string + StellarCoreCursor string + EnableCaptiveCore bool + CaptiveCoreBinaryPath string + CaptiveCoreStoragePath string + CaptiveCoreToml *ledgerbackend.CaptiveCoreToml + RemoteCaptiveCoreURL string + NetworkPassphrase string HistorySession *db.Session HistoryArchiveURL string @@ -197,12 +194,9 @@ func NewSystem(config Config) (System, error) { logger := log.WithField("subservice", "stellar-core") ledgerBackend, err = ledgerbackend.NewCaptive( ledgerbackend.CaptiveCoreConfig{ - LogPath: config.CaptiveCoreLogPath, BinaryPath: config.CaptiveCoreBinaryPath, StoragePath: config.CaptiveCoreStoragePath, - ConfigAppendPath: config.CaptiveCoreConfigAppendPath, - HTTPPort: config.CaptiveCoreHTTPPort, - PeerPort: config.CaptiveCorePeerPort, + Toml: config.CaptiveCoreToml, NetworkPassphrase: config.NetworkPassphrase, HistoryArchiveURLs: []string{config.HistoryArchiveURL}, CheckpointFrequency: config.CheckpointFrequency, @@ -312,7 +306,7 @@ func (s *system) initMetrics() { Help: "1 if sync, 0 if not synced, -1 if unable to connect or HTTP server disabled.", }, func() float64 { - if !s.config.EnableCaptiveCore || s.config.CaptiveCoreHTTPPort == 0 { + if !s.config.EnableCaptiveCore || (s.config.CaptiveCoreToml.HTTPPort == 0) { return -1 } @@ -320,7 +314,7 @@ func (s *system) initMetrics() { HTTP: &http.Client{ Timeout: 2 * time.Second, }, - URL: fmt.Sprintf("http://localhost:%d", s.config.CaptiveCoreHTTPPort), + URL: fmt.Sprintf("http://localhost:%d", s.config.CaptiveCoreToml.HTTPPort), } info, err := client.Info(s.ctx) diff --git a/services/horizon/internal/init.go b/services/horizon/internal/init.go index bc9a5056bd..33212b70ec 100644 --- a/services/horizon/internal/init.go +++ b/services/horizon/internal/init.go @@ -65,19 +65,16 @@ func initIngester(app *App) { // TODO: // Use the first archive for now. We don't have a mechanism to // use multiple archives at the same time currently. - HistoryArchiveURL: app.config.HistoryArchiveURLs[0], - CheckpointFrequency: app.config.CheckpointFrequency, - StellarCoreURL: app.config.StellarCoreURL, - StellarCoreCursor: app.config.CursorName, - CaptiveCoreBinaryPath: app.config.CaptiveCoreBinaryPath, - CaptiveCoreStoragePath: app.config.CaptiveCoreStoragePath, - CaptiveCoreConfigAppendPath: app.config.CaptiveCoreConfigAppendPath, - CaptiveCoreHTTPPort: app.config.CaptiveCoreHTTPPort, - CaptiveCorePeerPort: app.config.CaptiveCorePeerPort, - CaptiveCoreLogPath: app.config.CaptiveCoreLogPath, - RemoteCaptiveCoreURL: app.config.RemoteCaptiveCoreURL, - EnableCaptiveCore: app.config.EnableCaptiveCoreIngestion, - DisableStateVerification: app.config.IngestDisableStateVerification, + HistoryArchiveURL: app.config.HistoryArchiveURLs[0], + CheckpointFrequency: app.config.CheckpointFrequency, + StellarCoreURL: app.config.StellarCoreURL, + StellarCoreCursor: app.config.CursorName, + CaptiveCoreBinaryPath: app.config.CaptiveCoreBinaryPath, + CaptiveCoreStoragePath: app.config.CaptiveCoreStoragePath, + CaptiveCoreToml: app.config.CaptiveCoreToml, + RemoteCaptiveCoreURL: app.config.RemoteCaptiveCoreURL, + EnableCaptiveCore: app.config.EnableCaptiveCoreIngestion, + DisableStateVerification: app.config.IngestDisableStateVerification, }) if err != nil { diff --git a/services/horizon/internal/integration/db_test.go b/services/horizon/internal/integration/db_test.go index f7163e0413..572710d703 100644 --- a/services/horizon/internal/integration/db_test.go +++ b/services/horizon/internal/integration/db_test.go @@ -81,8 +81,8 @@ func TestReingestDB(t *testing.T) { toLedger = latestCheckpoint } - horizonConfig.CaptiveCoreConfigAppendPath = filepath.Join( - filepath.Dir(horizonConfig.CaptiveCoreConfigAppendPath), + horizonConfig.CaptiveCoreConfigPath = filepath.Join( + filepath.Dir(horizonConfig.CaptiveCoreConfigPath), "captive-core-reingest-range-integration-tests.cfg", ) diff --git a/services/horizon/internal/test/integration/integration.go b/services/horizon/internal/test/integration/integration.go index 3e4f02a8c5..015c3dc442 100644 --- a/services/horizon/internal/test/integration/integration.go +++ b/services/horizon/internal/test/integration/integration.go @@ -142,7 +142,7 @@ func (i *Test) RestartHorizon() { i.startHorizon( i.horizonConfig.CaptiveCoreBinaryPath, - i.horizonConfig.CaptiveCoreConfigAppendPath, + i.horizonConfig.CaptiveCoreConfigPath, i.horizonConfig.DatabaseURL, false, ) diff --git a/support/config/config_option.go b/support/config/config_option.go index c152c5059d..7a8300966d 100644 --- a/support/config/config_option.go +++ b/support/config/config_option.go @@ -161,3 +161,27 @@ func SetURL(co *ConfigOption) { *(co.ConfigKey.(**url.URL)) = urlType } } + +// SetOptionalUint converts a command line uint to a *uint where the nil +// value indicates the flag was not explicitly set +func SetOptionalUint(co *ConfigOption) { + key := co.ConfigKey.(**uint) + if co.flag.Changed { + *key = new(uint) + **key = uint(viper.GetInt(co.Name)) + } else { + *key = nil + } +} + +// SetOptionalString converts a command line uint to a *string where the nil +// value indicates the flag was not explicitly set +func SetOptionalString(co *ConfigOption) { + key := co.ConfigKey.(**string) + if co.flag.Changed { + *key = new(string) + **key = viper.GetString(co.Name) + } else { + *key = nil + } +} diff --git a/support/config/config_option_test.go b/support/config/config_option_test.go index a7853b0dbd..a19e718907 100644 --- a/support/config/config_option_test.go +++ b/support/config/config_option_test.go @@ -25,6 +25,52 @@ type testOptions struct { Uint32 uint32 } +// Test that optional flags are set to nil if they are not configured explicitly. +func TestConfigOption_optionalFlags_defaults(t *testing.T) { + var optUint *uint + var optString *string + configOpts := ConfigOptions{ + {Name: "uint", OptType: types.Uint, ConfigKey: &optUint, CustomSetValue: SetOptionalUint, FlagDefault: uint(0)}, + {Name: "string", OptType: types.String, ConfigKey: &optString, CustomSetValue: SetOptionalString}, + } + cmd := &cobra.Command{ + Use: "doathing", + Run: func(_ *cobra.Command, _ []string) { + configOpts.Require() + configOpts.SetValues() + }, + } + configOpts.Init(cmd) + + cmd.SetArgs([]string{}) + cmd.Execute() + assert.Equal(t, (*string)(nil), optString) + assert.Equal(t, (*uint)(nil), optUint) +} + +// Test that optional flags are set to non nil values when they are configured explicitly. +func TestConfigOption_optionalFlags_set(t *testing.T) { + var optUint *uint + var optString *string + configOpts := ConfigOptions{ + {Name: "uint", OptType: types.Uint, ConfigKey: &optUint, CustomSetValue: SetOptionalUint, FlagDefault: uint(0)}, + {Name: "string", OptType: types.String, ConfigKey: &optString, CustomSetValue: SetOptionalString}, + } + cmd := &cobra.Command{ + Use: "doathing", + Run: func(_ *cobra.Command, _ []string) { + configOpts.Require() + configOpts.SetValues() + }, + } + configOpts.Init(cmd) + + cmd.SetArgs([]string{"--uint", "6", "--string", "test-string"}) + cmd.Execute() + assert.Equal(t, "test-string", *optString) + assert.Equal(t, uint(6), *optUint) +} + // Test that when there are no args the defaults in the config options are // used. func TestConfigOption_getSimpleValue_defaults(t *testing.T) { @@ -52,6 +98,9 @@ func TestConfigOption_getSimpleValue_defaults(t *testing.T) { assert.Equal(t, true, opts.Bool) assert.Equal(t, uint(2), opts.Uint) assert.Equal(t, uint32(3), opts.Uint32) + for _, opt := range configOpts { + assert.False(t, opt.flag.Changed) + } } // Test that when args are given, their values are used. @@ -86,6 +135,9 @@ func TestConfigOption_getSimpleValue_setFlag(t *testing.T) { assert.Equal(t, true, opts.Bool) assert.Equal(t, uint(20), opts.Uint) assert.Equal(t, uint32(30), opts.Uint32) + for _, opt := range configOpts { + assert.True(t, opt.flag.Changed) + } } // Test that when args are not given but env vars are, their values are used. From 69aabbaceabbc612b72c1c9b6f78108e180a0bf2 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Wed, 5 May 2021 08:59:09 -0700 Subject: [PATCH 27/67] remove explicit import declaration Signed-off-by: Lawrence Lawson --- services/regulated-assets-approval-server/cmd/serve.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/regulated-assets-approval-server/cmd/serve.go b/services/regulated-assets-approval-server/cmd/serve.go index 0cbdf7c0f1..c3ca59e390 100644 --- a/services/regulated-assets-approval-server/cmd/serve.go +++ b/services/regulated-assets-approval-server/cmd/serve.go @@ -6,7 +6,7 @@ import ( "github.com/spf13/cobra" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/network" - serve "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve" "github.com/stellar/go/support/config" ) From 15ccb7b780387fcdb423b681cedf5882c8569819 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Thu, 6 May 2021 14:08:52 +0200 Subject: [PATCH 28/67] services/horizon: Build and test verify-range Docker image (#3575) --- .circleci/config.yml | 14 ++++++++++++++ services/horizon/docker/verify-range/dependencies | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 063130240e..53edd36e05 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -383,6 +383,19 @@ jobs: docker build -f services/horizon/docker/Dockerfile.dev -t stellar/horizon:$VERSION . docker push stellar/horizon:$VERSION + test_verify_range_docker_image: + docker: + - image: docker:18.04-git + steps: + - checkout + - setup_remote_docker + - run: + name: Build and test Verify Range Docker image + command: | + docker build -f services/horizon/docker/verify-range/Dockerfile -t stellar/horizon-verify-range services/horizon/docker/verify-range/ + # Any range should do for basic testing, this range was chosen pretty early in history so that it only takes a few mins to run + docker run -ti -e BRANCH=${CIRCLE_SHA1} -e FROM=10000063 -e TO=10000127 stellar/horizon-verify-range + publish_latest_horizon_docker_image: docker: - image: docker:18.04-git @@ -493,6 +506,7 @@ workflows: name: test_horizon_integration_cap35_with_captive_core enable-captive-core: true enable-cap-35-tests: true + - test_verify_range_docker_image - publish_state_diff_docker_image: filters: branches: diff --git a/services/horizon/docker/verify-range/dependencies b/services/horizon/docker/verify-range/dependencies index 0dd005c7fa..958d2c58ed 100644 --- a/services/horizon/docker/verify-range/dependencies +++ b/services/horizon/docker/verify-range/dependencies @@ -22,4 +22,8 @@ sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';" git clone https://github.com/stellar/go.git stellar-go cd stellar-go +# By default "git fetch" only fetches refs/ +# Below ensures we also fetch PR refs +git config --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pull/*" +git fetch --force --quiet origin /usr/local/go/bin/go build -v ./services/horizon From 1bff751d9fc040e7060ab11510382843e31a3c11 Mon Sep 17 00:00:00 2001 From: Marcelo Salloum dos Santos Date: Thu, 6 May 2021 11:47:05 -0300 Subject: [PATCH 29/67] `services/regulated-assets-approval-server/internal/db`: add a database support to the sep8 regulated assets server (#3587) ### What Add a database support to the sep8 regulated assets server. ### Why To store the KYC statuses. --- .../README.md | 16 +++ .../cmd/migrate.go | 103 ++++++++++++++++++ .../cmd/serve.go | 8 ++ .../internal/db/db.go | 9 ++ .../internal/db/db_test.go | 30 +++++ .../internal/db/dbmigrate/dbmigrate.go | 31 ++++++ .../migrations/2021-05-05.0.initial.sql | 7 ++ .../internal/db/dbtest/dbtest.go | 34 ++++++ .../internal/db/dbtest/dbtest_test.go | 18 +++ .../internal/serve/serve.go | 1 + .../regulated-assets-approval-server/main.go | 1 + 11 files changed, 258 insertions(+) create mode 100644 services/regulated-assets-approval-server/cmd/migrate.go create mode 100644 services/regulated-assets-approval-server/internal/db/db.go create mode 100644 services/regulated-assets-approval-server/internal/db/db_test.go create mode 100644 services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go create mode 100644 services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-05.0.initial.sql create mode 100644 services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go create mode 100644 services/regulated-assets-approval-server/internal/db/dbtest/dbtest_test.go diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index 197af0d8b7..2b930855b7 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -24,11 +24,26 @@ Usage: regulated-assets-approval-server [command] Available Commands: + migrate Run migrations on the database serve Serve the SEP-8 Approval Server Use "regulated-assets-approval-server [command] --help" for more information about a command. ``` +### Usage: Migrate + +```sh +$ go install +$ regulated-assets-approval-server migrate --help +Run migrations on the database + +Usage: + regulated-assets-approval-server migrate [up|down] [count] [flags] + +Flags: + --database-url string Database URL (DATABASE_URL) (default "postgres://localhost:5432/?sslmode=disable") +``` + ### Usage: Serve ```sh @@ -41,6 +56,7 @@ Usage: Flags: --asset-code string The code of the regulated asset (ASSET_CODE) + --database-url string Database URL (DATABASE_URL) (default "postgres://localhost:5432/?sslmode=disable") --friendbot-payment-amount int The amount of regulated assets the friendbot will be distributing (FRIENDBOT_PAYMENT_AMOUNT) (default 10000) --horizon-url string Horizon URL used for looking up account details (HORIZON_URL) (default "https://horizon-testnet.stellar.org/") --issuer-account-secret string Secret key of the asset issuer's stellar account. (ISSUER_ACCOUNT_SECRET) diff --git a/services/regulated-assets-approval-server/cmd/migrate.go b/services/regulated-assets-approval-server/cmd/migrate.go new file mode 100644 index 0000000000..c6801678a1 --- /dev/null +++ b/services/regulated-assets-approval-server/cmd/migrate.go @@ -0,0 +1,103 @@ +package cmd + +import ( + "go/types" + "strconv" + "strings" + + migrate "github.com/rubenv/sql-migrate" + "github.com/spf13/cobra" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbmigrate" + "github.com/stellar/go/support/config" + "github.com/stellar/go/support/log" +) + +type MigrateCommand struct { + DatabaseURL string +} + +func (c *MigrateCommand) Command() *cobra.Command { + configOpts := config.ConfigOptions{ + { + Name: "database-url", + Usage: "Database URL", + OptType: types.String, + ConfigKey: &c.DatabaseURL, + FlagDefault: "postgres://localhost:5432/?sslmode=disable", + Required: true, + }, + } + cmd := &cobra.Command{ + Use: "migrate [up|down] [count]", + Short: "Run migrations on the database", + PersistentPreRun: func(cmd *cobra.Command, args []string) { + configOpts.Require() + configOpts.SetValues() + }, + Run: func(cmd *cobra.Command, args []string) { + c.Migrate(cmd, args) + }, + } + configOpts.Init(cmd) + + return cmd +} + +func (c *MigrateCommand) Migrate(cmd *cobra.Command, args []string) { + db, err := db.Open(c.DatabaseURL) + if err != nil { + log.Errorf("Error opening database: %s", err.Error()) + return + } + + if len(args) < 1 { + cmd.Help() + return + } + dirStr := args[0] + + var dir migrate.MigrationDirection + switch dirStr { + case "down": + dir = migrate.Down + case "up": + dir = migrate.Up + default: + log.Errorf("Invalid migration direction, must be 'up' or 'down'.") + return + } + + var count int + if len(args) >= 2 { + count, err = strconv.Atoi(args[1]) + if err != nil { + log.Errorf("Invalid migration count, must be a number.") + return + } + if count < 1 { + log.Errorf("Invalid migration count, must be a number greater than zero.") + return + } + } + + migrations, err := dbmigrate.PlanMigration(db, dir, count) + if err != nil { + log.Errorf("Error planning migration: %s", err.Error()) + return + } + if len(migrations) > 0 { + log.Infof("Migrations to apply %s: %s", dirStr, strings.Join(migrations, ", ")) + } + + n, err := dbmigrate.Migrate(db, dir, count) + if err != nil { + log.Errorf("Error applying migrations: %s", err.Error()) + return + } + if n > 0 { + log.Infof("Successfully applied %d migrations %s.", n, dirStr) + } else { + log.Infof("No migrations applied %s.", dirStr) + } +} diff --git a/services/regulated-assets-approval-server/cmd/serve.go b/services/regulated-assets-approval-server/cmd/serve.go index c3ca59e390..95fd1ec000 100644 --- a/services/regulated-assets-approval-server/cmd/serve.go +++ b/services/regulated-assets-approval-server/cmd/serve.go @@ -29,6 +29,14 @@ func (c *ServeCommand) Command() *cobra.Command { ConfigKey: &opts.AssetCode, Required: true, }, + { + Name: "database-url", + Usage: "Database URL", + OptType: types.String, + ConfigKey: &opts.DatabaseURL, + FlagDefault: "postgres://localhost:5432/?sslmode=disable", + Required: true, + }, { Name: "friendbot-payment-amount", Usage: "The amount of regulated assets the friendbot will be distributing", diff --git a/services/regulated-assets-approval-server/internal/db/db.go b/services/regulated-assets-approval-server/internal/db/db.go new file mode 100644 index 0000000000..d0cab4db33 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/db.go @@ -0,0 +1,9 @@ +package db + +import ( + "github.com/jmoiron/sqlx" +) + +func Open(dataSourceName string) (*sqlx.DB, error) { + return sqlx.Open("postgres", dataSourceName) +} diff --git a/services/regulated-assets-approval-server/internal/db/db_test.go b/services/regulated-assets-approval-server/internal/db/db_test.go new file mode 100644 index 0000000000..91cb6771c0 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/db_test.go @@ -0,0 +1,30 @@ +package db + +import ( + "testing" + + "github.com/stellar/go/support/db/dbtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOpen_openAndPingSucceeds(t *testing.T) { + db := dbtest.Postgres(t) + + sqlxDB, err := Open(db.DSN) + require.NoError(t, err) + assert.Equal(t, "postgres", sqlxDB.DriverName()) + + err = sqlxDB.Ping() + require.NoError(t, err) +} + +func TestOpen_openAndPingFails(t *testing.T) { + sqlxDB, err := Open("postgres://127.0.0.1:0") + require.NoError(t, err) + assert.Equal(t, "postgres", sqlxDB.DriverName()) + + err = sqlxDB.Ping() + require.Error(t, err) + require.Contains(t, err.Error(), "dial tcp 127.0.0.1:0: connect:") +} diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go new file mode 100644 index 0000000000..2b3c9e56d1 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go @@ -0,0 +1,31 @@ +package dbmigrate + +import ( + "github.com/jmoiron/sqlx" + migrate "github.com/rubenv/sql-migrate" +) + +var migrationSource = &migrate.FileMigrationSource{ + Dir: "internal/db/dbmigrate/migrations", +} + +// PlanMigration finds the migrations that would be applied if Migrate was to +// be run now. +func PlanMigration(db *sqlx.DB, dir migrate.MigrationDirection, count int) ([]string, error) { + migrations, _, err := migrate.PlanMigration(db.DB, db.DriverName(), migrationSource, dir, count) + if err != nil { + return nil, err + } + ids := make([]string, 0, len(migrations)) + for _, m := range migrations { + ids = append(ids, m.Id) + } + return ids, nil +} + +// Migrate runs all the migrations to get the database to the state described +// by the migration files in the direction specified. Count is the maximum +// number of migrations to apply or rollback. +func Migrate(db *sqlx.DB, dir migrate.MigrationDirection, count int) (int, error) { + return migrate.ExecMax(db.DB, db.DriverName(), migrationSource, dir, count) +} diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-05.0.initial.sql b/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-05.0.initial.sql new file mode 100644 index 0000000000..21884dcac3 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-05.0.initial.sql @@ -0,0 +1,7 @@ +-- This migration file is intentionally empty and is a first starting point for +-- our migrations before we yet have a schema. + +-- +migrate Up + +-- +migrate Down + diff --git a/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go new file mode 100644 index 0000000000..382cf6753d --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go @@ -0,0 +1,34 @@ +package dbtest + +import ( + "path" + "runtime" + "testing" + + migrate "github.com/rubenv/sql-migrate" + "github.com/stellar/go/support/db/dbtest" +) + +func Open(t *testing.T) *dbtest.DB { + db := dbtest.Postgres(t) + + // Get the folder holding the migrations relative to this file. We cannot + // hardcode "../dbmigrate/migrations" because Open is called from tests in + // multiple packages and tests are executed with the current working + // directory set to the package the test lives in. + _, filename, _, _ := runtime.Caller(0) + migrationsDir := path.Join(path.Dir(filename), "..", "dbmigrate", "migrations") + + migrations := &migrate.FileMigrationSource{ + Dir: migrationsDir, + } + + conn := db.Open() + defer conn.Close() + + _, err := migrate.Exec(conn.DB, "postgres", migrations, migrate.Up) + if err != nil { + t.Fatal(err) + } + return db +} diff --git a/services/regulated-assets-approval-server/internal/db/dbtest/dbtest_test.go b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest_test.go new file mode 100644 index 0000000000..95f6213b13 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest_test.go @@ -0,0 +1,18 @@ +package dbtest + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOpen(t *testing.T) { + db := Open(t) + session := db.Open() + + count := 0 + err := session.Get(&count, `SELECT COUNT(*) FROM gorp_migrations`) + require.NoError(t, err) + assert.Greater(t, count, 0) +} diff --git a/services/regulated-assets-approval-server/internal/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go index 4bf637ff35..fc4c05a5cd 100644 --- a/services/regulated-assets-approval-server/internal/serve/serve.go +++ b/services/regulated-assets-approval-server/internal/serve/serve.go @@ -18,6 +18,7 @@ import ( type Options struct { IssuerAccountSecret string AssetCode string + DatabaseURL string FriendbotPaymentAmount int HorizonURL string NetworkPassphrase string diff --git a/services/regulated-assets-approval-server/main.go b/services/regulated-assets-approval-server/main.go index f641fdc6ee..930d3c8410 100644 --- a/services/regulated-assets-approval-server/main.go +++ b/services/regulated-assets-approval-server/main.go @@ -19,6 +19,7 @@ func main() { }, } + rootCmd.AddCommand((&cmd.MigrateCommand{}).Command()) rootCmd.AddCommand((&cmd.ServeCommand{}).Command()) err := rootCmd.Execute() From b96e00e78b9390ff4f7ba034e4d55e8905840f4e Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Thu, 6 May 2021 14:08:07 -0700 Subject: [PATCH 30/67] `services/regulated-assets-approval-server/{cmd, internal}`: Add `base-url` and `approval-server-payment-threshold` env/cli args to sep8 server (#3588) * ignore .env Signed-off-by: Lawrence Lawson * add BASE_URL and APPROVAL_SERVER_PAYMENT_THRESHOLD cli args Signed-off-by: Lawrence Lawson * update toml.go to support BASE_URL and APPROVAL_SERVER_PAYMENT_THRESHOLD cli args Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * rename approval-server-payment-threshold to kyc-required-payment-amount-threshold Signed-off-by: Lawrence Lawson * update readme Signed-off-by: Lawrence Lawson * use net/url package to parse parse and generate full url path Signed-off-by: Lawrence Lawson * apply PR suggestions for buildURLString - https://github.com/stellar/go/pull/3588#discussion_r627073975 Signed-off-by: Lawrence Lawson * return the previous approval_criteria msg - TODO: we should make this an env var Signed-off-by: Lawrence Lawson * rename KYCPaymentThreshold arg to KYCRequiredPaymentAmountThreshold Signed-off-by: Lawrence Lawson * use amount package for KYCRequiredPaymentAmountThreshold Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson --- .../.gitignore | 1 + .../README.md | 2 ++ .../cmd/serve.go | 15 ++++++++ .../internal/serve/serve.go | 34 +++++++++++++++---- .../internal/serve/toml.go | 8 ++--- 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 services/regulated-assets-approval-server/.gitignore diff --git a/services/regulated-assets-approval-server/.gitignore b/services/regulated-assets-approval-server/.gitignore new file mode 100644 index 0000000000..4cb512ec1f --- /dev/null +++ b/services/regulated-assets-approval-server/.gitignore @@ -0,0 +1 @@ +/.env \ No newline at end of file diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index 2b930855b7..47f9b50ff5 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -62,6 +62,8 @@ Flags: --issuer-account-secret string Secret key of the asset issuer's stellar account. (ISSUER_ACCOUNT_SECRET) --network-passphrase string Network passphrase of the Stellar network transactions should be signed for (NETWORK_PASSPHRASE) (default "Test SDF Network ; September 2015") --port int Port to listen and serve on (PORT) (default 8000) + --base-url string The base url address to this server + --kyc-required-payment-amount-threshold string The amount threshold when KYC is required, may contain decimals (default 500 units) ``` ## Account Setup diff --git a/services/regulated-assets-approval-server/cmd/serve.go b/services/regulated-assets-approval-server/cmd/serve.go index 95fd1ec000..43011ad4aa 100644 --- a/services/regulated-assets-approval-server/cmd/serve.go +++ b/services/regulated-assets-approval-server/cmd/serve.go @@ -69,6 +69,21 @@ func (c *ServeCommand) Command() *cobra.Command { FlagDefault: 8000, Required: true, }, + { + Name: "base-url", + Usage: "The base url address to this server", + OptType: types.String, + ConfigKey: &opts.BaseURL, + Required: true, + }, + { + Name: "kyc-required-payment-amount-threshold", + Usage: "The amount threshold to require KYC", + OptType: types.String, + ConfigKey: &opts.KYCRequiredPaymentAmountThreshold, + FlagDefault: "500", + Required: true, + }, } cmd := &cobra.Command{ Use: "serve", diff --git a/services/regulated-assets-approval-server/internal/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go index fc4c05a5cd..cb65fa0238 100644 --- a/services/regulated-assets-approval-server/internal/serve/serve.go +++ b/services/regulated-assets-approval-server/internal/serve/serve.go @@ -3,10 +3,13 @@ package serve import ( "fmt" "net/http" + "net/url" + "path" "time" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" + "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" "github.com/stellar/go/support/errors" @@ -16,13 +19,15 @@ import ( ) type Options struct { - IssuerAccountSecret string - AssetCode string - DatabaseURL string - FriendbotPaymentAmount int - HorizonURL string - NetworkPassphrase string - Port int + AssetCode string + BaseURL string + DatabaseURL string + FriendbotPaymentAmount int + HorizonURL string + IssuerAccountSecret string + KYCRequiredPaymentAmountThreshold string + NetworkPassphrase string + Port int } func Serve(opts Options) { @@ -51,6 +56,10 @@ func handleHTTP(opts Options) http.Handler { if err != nil { log.Fatal(errors.Wrap(err, "parsing secret")) } + parsedKYCRequiredPaymentThreshold, err := amount.ParseInt64(opts.KYCRequiredPaymentAmountThreshold) + if err != nil { + log.Fatal(errors.Wrapf(err, "%s cannot be parsed as a Stellar amount", opts.KYCRequiredPaymentAmountThreshold)) + } mux := chi.NewMux() mux.Use(middleware.RequestID) @@ -63,6 +72,8 @@ func handleHTTP(opts Options) http.Handler { assetCode: opts.AssetCode, issuerAddress: issuerKP.Address(), networkPassphrase: opts.NetworkPassphrase, + approvalServer: buildURLString(opts.BaseURL, "tx-approve"), + kycThreshold: parsedKYCRequiredPaymentThreshold, }.ServeHTTP) mux.Get("/friendbot", friendbotHandler{ assetCode: opts.AssetCode, @@ -85,3 +96,12 @@ func (opts Options) horizonClient() horizonclient.ClientInterface { HTTP: &http.Client{Timeout: 30 * time.Second}, } } + +func buildURLString(baseURL, endpoint string) string { + URL, err := url.Parse(baseURL) + if err != nil { + log.Fatal(errors.Wrapf(err, "Unable to parse URL: %s", baseURL)) + } + URL.Path = path.Join(URL.Path, endpoint) + return URL.String() +} diff --git a/services/regulated-assets-approval-server/internal/serve/toml.go b/services/regulated-assets-approval-server/internal/serve/toml.go index 75b45eb0dc..7e1596c9c3 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml.go +++ b/services/regulated-assets-approval-server/internal/serve/toml.go @@ -7,19 +7,19 @@ import ( type stellarTOMLHandler struct { assetCode string + approvalServer string issuerAddress string networkPassphrase string + kycThreshold int64 } func (h stellarTOMLHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - approvalServer := fmt.Sprintf("%s/tx_approve", r.Host) - approvalCriteria := fmt.Sprintf("Currently %s is not approving any %s transactions", approvalServer, h.assetCode) + approvalCriteria := fmt.Sprintf("Currently %s is not approving any %s transactions", h.approvalServer, h.assetCode) fmt.Fprintf(rw, "NETWORK_PASSPHRASE=%q\n", h.networkPassphrase) fmt.Fprintf(rw, "[[CURRENCIES]]\n") fmt.Fprintf(rw, "code=%q\n", h.assetCode) fmt.Fprintf(rw, "issuer=%q\n", h.issuerAddress) fmt.Fprintf(rw, "regulated=true\n") - fmt.Fprintf(rw, "approval_server=%q\n", approvalServer) + fmt.Fprintf(rw, "approval_server=%q\n", h.approvalServer) fmt.Fprintf(rw, "approval_criteria=%q\n", approvalCriteria) - } From 23cb3ea686d3b1d7476f519d7f35e8c00a0f12be Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Fri, 7 May 2021 10:15:07 -0700 Subject: [PATCH 31/67] `services/regulated-assets-approval-server/internal/serve/`: Add validator and tests to toml handler (#3590) * add validate func to toml handeler Signed-off-by: Lawrence Lawson * add test for toml handler and toml validator Signed-off-by: Lawrence Lawson * Update toml validate and validate toml test Signed-off-by: Lawrence Lawson * change tx_approve to tx-approve for consistency Signed-off-by: Lawrence Lawson * change validates threshold condition to ensure only positive values Signed-off-by: Lawrence Lawson * fix toml test assert error msg Signed-off-by: Lawrence Lawson * test against negative kycThreshold value Signed-off-by: Lawrence Lawson --- .../README.md | 2 +- .../internal/serve/toml.go | 44 ++++++- .../internal/serve/toml_test.go | 119 ++++++++++++++++++ 3 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 services/regulated-assets-approval-server/internal/serve/toml_test.go diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index 47f9b50ff5..dcf60dbd8e 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -63,7 +63,7 @@ Flags: --network-passphrase string Network passphrase of the Stellar network transactions should be signed for (NETWORK_PASSPHRASE) (default "Test SDF Network ; September 2015") --port int Port to listen and serve on (PORT) (default 8000) --base-url string The base url address to this server - --kyc-required-payment-amount-threshold string The amount threshold when KYC is required, may contain decimals (default 500 units) + --kyc-required-payment-amount-threshold string The amount threshold when KYC is required, may contain decimals and is greater than 0 (default 500 units) ``` ## Account Setup diff --git a/services/regulated-assets-approval-server/internal/serve/toml.go b/services/regulated-assets-approval-server/internal/serve/toml.go index 7e1596c9c3..a219bfb8d4 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml.go +++ b/services/regulated-assets-approval-server/internal/serve/toml.go @@ -3,6 +3,11 @@ package serve import ( "fmt" "net/http" + + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" + "github.com/stellar/go/strkey" + "github.com/stellar/go/support/errors" + "github.com/stellar/go/support/log" ) type stellarTOMLHandler struct { @@ -13,8 +18,45 @@ type stellarTOMLHandler struct { kycThreshold int64 } +func (h stellarTOMLHandler) validate() error { + if h.networkPassphrase == "" { + return errors.New("network passphrase cannot be empty") + } + + if h.assetCode == "" { + return errors.New("asset code cannot be empty") + } + + if h.issuerAddress == "" { + return errors.New("asset issuer address cannot be empty") + } + + if !strkey.IsValidEd25519PublicKey(h.issuerAddress) { + return errors.New("asset issuer address is not a valid public key") + } + + if h.approvalServer == "" { + return errors.New("approval server cannot be empty") + } + + if h.kycThreshold <= 0 { + return errors.New("kyc threshold cannot be less than or equal to zero") + } + + return nil +} + func (h stellarTOMLHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - approvalCriteria := fmt.Sprintf("Currently %s is not approving any %s transactions", h.approvalServer, h.assetCode) + ctx := r.Context() + + err := h.validate() + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating tomlHandler")) + httperror.InternalServerError.Render(rw) + return + } + approvalCriteria := fmt.Sprintf("Currently %s is not approving any %s transactions.", h.approvalServer, h.assetCode) + fmt.Fprintf(rw, "NETWORK_PASSPHRASE=%q\n", h.networkPassphrase) fmt.Fprintf(rw, "[[CURRENCIES]]\n") fmt.Fprintf(rw, "code=%q\n", h.assetCode) diff --git a/services/regulated-assets-approval-server/internal/serve/toml_test.go b/services/regulated-assets-approval-server/internal/serve/toml_test.go new file mode 100644 index 0000000000..9703ae47eb --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/toml_test.go @@ -0,0 +1,119 @@ +package serve + +import ( + "context" + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-chi/chi" + "github.com/stellar/go/network" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTomlHandler_validate(t *testing.T) { + // empty network passphrase + h := stellarTOMLHandler{} + err := h.validate() + require.EqualError(t, err, "network passphrase cannot be empty") + + // empty asset code + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + } + err = h.validate() + require.EqualError(t, err, "asset code cannot be empty") + + // empty asset issuer address + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + } + err = h.validate() + require.EqualError(t, err, "asset issuer address cannot be empty") + + // invalid asset issuer address + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + issuerAddress: "foobar", + } + err = h.validate() + require.EqualError(t, err, "asset issuer address is not a valid public key") + + // empty approval server + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", + } + err = h.validate() + require.EqualError(t, err, "approval server cannot be empty") + + // empty kyc threshold + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", + approvalServer: "localhost:8000/tx-approve", + } + err = h.validate() + require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + + // negative kyc threshold + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", + approvalServer: "localhost:8000/tx-approve", + kycThreshold: -500, + } + err = h.validate() + require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + + // success + h = stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOOBAR", + issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", + approvalServer: "localhost:8000/tx-approve", + kycThreshold: 500, + } + err = h.validate() + require.NoError(t, err) +} + +func TestTomlHandler_ServeHTTP(t *testing.T) { + mux := chi.NewMux() + mux.Get("/.well-known/stellar.toml", stellarTOMLHandler{ + networkPassphrase: network.TestNetworkPassphrase, + assetCode: "FOO", + issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", + approvalServer: "localhost:8000/tx-approve", + kycThreshold: 10, + }.ServeHTTP) + + ctx := context.Background() + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "/.well-known/stellar.toml", nil) + r = r.WithContext(ctx) + mux.ServeHTTP(w, r) + + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "text/plain; charset=utf-8", resp.Header.Get("Content-Type")) + + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + wantBody := `NETWORK_PASSPHRASE="` + network.TestNetworkPassphrase + `" +[[CURRENCIES]] +code="FOO" +issuer="GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM" +regulated=true +approval_server="localhost:8000/tx-approve" +approval_criteria="Currently localhost:8000/tx-approve is not approving any FOO transactions." +` + require.Equal(t, wantBody, string(body)) +} From 72c01edaa63e8c903e5e99666545e5fd8d59ae2b Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 10 May 2021 16:51:56 +0200 Subject: [PATCH 32/67] Use Core 17 for CI (and disable cap35-specific job) (#3585) --- .circleci/config.yml | 29 ++----------------- services/horizon/docker/Dockerfile.dev | 2 +- services/horizon/docker/core-start.sh | 3 +- .../docker-compose.integration-tests.yml | 2 +- .../internal/integration/protocol16_test.go | 14 ++------- 5 files changed, 9 insertions(+), 41 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 53edd36e05..33b2128a9d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -430,10 +430,6 @@ jobs: enable-captive-core: type: boolean default: false - # TODO: remove once a stellar core version with cap-35 is released - enable-cap-35-tests: - type: boolean - default: false working_directory: ~/go/src/github.com/stellar/go machine: image: ubuntu-1604:202010-01 @@ -452,28 +448,12 @@ jobs: - when: condition: <> steps: - - unless: - condition: <> - steps: - # Install the default version of stellar core - - install_stellar_core - - when: - condition: <> - steps: - # Install a Stellar Core version with CAP35 support - - install_stellar_core: - core-version: 15.3.0-498.7a7f18c.xenial~SetTrustlineFlagsPR~buildtests + - install_stellar_core - run: name: Setting Captive Core env variables command: echo "export HORIZON_INTEGRATION_ENABLE_CAPTIVE_CORE=true" >> $BASH_ENV - - when: - condition: <> - steps: - - run: - name: Setting CAP35 env variables - command: echo "export HORIZON_INTEGRATION_ENABLE_CAP_35=true" >> $BASH_ENV - run: - name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> <<#parameters.enable-cap-35-tests>>(With CAP35)<> + name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> # Currently all integration tests are in a single directory. # Pulling the image helps with test running time command: | @@ -501,11 +481,6 @@ workflows: - test_horizon_integration: name: test_horizon_integration_with_captive_core enable-captive-core: true - # ... and cap35 with captive core - - test_horizon_integration: - name: test_horizon_integration_cap35_with_captive_core - enable-captive-core: true - enable-cap-35-tests: true - test_verify_range_docker_image - publish_state_diff_docker_image: filters: diff --git a/services/horizon/docker/Dockerfile.dev b/services/horizon/docker/Dockerfile.dev index 3d2f69b960..7ddefbd4d7 100644 --- a/services/horizon/docker/Dockerfile.dev +++ b/services/horizon/docker/Dockerfile.dev @@ -9,7 +9,7 @@ RUN go install github.com/stellar/go/exp/services/captivecore FROM ubuntu:18.04 -ENV STELLAR_CORE_VERSION 15.0.0-40 +ENV STELLAR_CORE_VERSION 17.0.0-557.096f6a7.focal ENV STELLAR_CORE_BINARY_PATH /usr/bin/stellar-core ENV DEBIAN_FRONTEND=noninteractive diff --git a/services/horizon/docker/core-start.sh b/services/horizon/docker/core-start.sh index 89e90fba91..aea5db249f 100755 --- a/services/horizon/docker/core-start.sh +++ b/services/horizon/docker/core-start.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -e +set -x source /etc/profile @@ -23,4 +24,4 @@ if [ "$1" = "standalone" ]; then popd fi -exec /init -- stellar-core run \ No newline at end of file +exec stellar-core run diff --git a/services/horizon/docker/docker-compose.integration-tests.yml b/services/horizon/docker/docker-compose.integration-tests.yml index 0be467e074..0618bc90b4 100644 --- a/services/horizon/docker/docker-compose.integration-tests.yml +++ b/services/horizon/docker/docker-compose.integration-tests.yml @@ -10,7 +10,7 @@ services: - "5641:5641" command: ["-p", "5641"] core: - image: ${CORE_IMAGE:-stellar/stellar-core} + image: ${CORE_IMAGE:-stellar/stellar-core:v17.0.0} depends_on: - core-postgres restart: on-failure diff --git a/services/horizon/internal/integration/protocol16_test.go b/services/horizon/internal/integration/protocol16_test.go index 22d29dfc0f..7ca62a24b0 100644 --- a/services/horizon/internal/integration/protocol16_test.go +++ b/services/horizon/internal/integration/protocol16_test.go @@ -1,7 +1,6 @@ package integration import ( - "os" "testing" "github.com/stretchr/testify/assert" @@ -18,14 +17,7 @@ import ( ) func NewProtocol16Test(t *testing.T) *integration.Test { - // TODO, this should be removed once a core version with CAP 35 is released - if os.Getenv("HORIZON_INTEGRATION_ENABLE_CAP_35") != "true" { - t.Skip("skipping CAP35 test, set HORIZON_INTEGRATION_ENABLE_CAP_35=true if you want to run it") - } - config := integration.Config{ - ProtocolVersion: 16, - CoreDockerImage: "2opremio/stellar-core:cap35", - } + config := integration.Config{ProtocolVersion: 17} return integration.NewTest(t, config) } @@ -37,8 +29,8 @@ func TestProtocol16Basics(t *testing.T) { t.Run("Sanity", func(t *testing.T) { root, err := itest.Client().Root() tt.NoError(err) - tt.LessOrEqual(int32(16), root.CoreSupportedProtocolVersion) - tt.Equal(int32(16), root.CurrentProtocolVersion) + tt.LessOrEqual(int32(17), root.CoreSupportedProtocolVersion) + tt.Equal(int32(17), root.CurrentProtocolVersion) // Submit a simple tx op := txnbuild.Payment{ From cf7664fb618236f4c3ab4d344e7a601a22d1ea9b Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Mon, 10 May 2021 11:22:28 -0700 Subject: [PATCH 33/67] `services/regulated-assets-approval-server/internal/serve`: Port and Refactor `\tx-approve` endpoint logic (#3592) * add tx_approve_response Signed-off-by: Lawrence Lawson * move tx_approve_response to correct dir Signed-off-by: Lawrence Lawson * refactor isRejected to leverage the new NewRejectedTxApprovalResponse - update tests to do the same -remove any depricated txApproveResponse code Signed-off-by: Lawrence Lawson * replaceconst with hardcoded strings Signed-off-by: Lawrence Lawson * extend txApproveHandler struct to include new fields - baseURL, db, horizonClient, kycThreshold, networkPassphrase, paymentAmount Signed-off-by: Lawrence Lawson * add validate to tx_approve - add validate test - remove paymentAmount arg to handler Signed-off-by: Lawrence Lawson * make consistent baseurl for test Signed-off-by: Lawrence Lawson * use validate in tx_approve ServeHTTP - update request from Transaction to Tx to keep consistent - update tests to sync with the handler updates Signed-off-by: Lawrence Lawson * refactor isRejected to be txApprove - port all the is rejected logic to validate input - update tests to work wit new refactor Signed-off-by: Lawrence Lawson * correct error msg punctuation Signed-off-by: Lawrence Lawson * add doc strings Signed-off-by: Lawrence Lawson * validateInput definition closer to declaration Signed-off-by: Lawrence Lawson * add new logs to validate Signed-off-by: Lawrence Lawson * refactor test with idomatic names - remove redundant integration test (http form https://github.com/stellar/go/pull/3480#pullrequestreview-620226686) Signed-off-by: Lawrence Lawson * reject and test against any ops that are not payments Signed-off-by: Lawrence Lawson * remove debug comment Signed-off-by: Lawrence Lawson * reduce discance between call and use Signed-off-by: Lawrence Lawson * Test if op is payment in TestAPIRejectedIntegration Signed-off-by: Lawrence Lawson * reducing the code scope for code needed at the present Signed-off-by: Lawrence Lawson * remove txnbuild.Transaction return value Signed-off-by: Lawrence Lawson * refactor op type assertion Signed-off-by: Lawrence Lawson * remove unneeeded erroor return from validateInput Signed-off-by: Lawrence Lawson * convention test name Signed-off-by: Lawrence Lawson * update comment Signed-off-by: Lawrence Lawson * remove error logic until needed - moved default NewRejectedTxApprovalResponse to validateInput for clarity Signed-off-by: Lawrence Lawson --- .../internal/serve/tx_approve.go | 115 +++--- .../internal/serve/tx_approve_response.go | 31 ++ .../internal/serve/tx_approve_test.go | 336 ++++++------------ 3 files changed, 194 insertions(+), 288 deletions(-) create mode 100644 services/regulated-assets-approval-server/internal/serve/tx_approve_response.go diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go index 90c5de70f3..e1e80b1726 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve.go @@ -9,101 +9,110 @@ import ( "github.com/stellar/go/support/errors" "github.com/stellar/go/support/http/httpdecode" "github.com/stellar/go/support/log" - "github.com/stellar/go/support/render/httpjson" "github.com/stellar/go/txnbuild" ) -type sep8Status string - -const ( - Sep8StatusRejected sep8Status = "rejected" -) - -const ( - missingParamErr = "Missing parameter \"tx\"." - invalidParamErr = "Invalid parameter \"tx\"." - internalErrErr = "Internal Error." - invalidSrcAccErr = "The source account is invalid." - unauthorizedOpErr = "There is one or more unauthorized operations in the provided transaction." - notImplementedErr = "Not implemented." -) - type txApproveHandler struct { issuerKP *keypair.Full assetCode string } type txApproveRequest struct { - Transaction string `json:"tx" form:"tx"` + Tx string `json:"tx" form:"tx"` } -type txApproveResponse struct { - Status sep8Status `json:"status"` - Error string `json:"error"` -} +func (h txApproveHandler) validate() error { + if h.issuerKP == nil { + return errors.New("issuer keypair cannot be nil") + } -func NewRejectedTXApproveResponse(errorMessage string) *txApproveResponse { - return &txApproveResponse{ - Status: Sep8StatusRejected, - Error: errorMessage, + if h.assetCode == "" { + return errors.New("asset code cannot be empty") } + + return nil } func (h txApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - in := txApproveRequest{} - err := httpdecode.Decode(r, &in) + err := h.validate() if err != nil { - log.Ctx(ctx).Error(errors.Wrap(err, "decoding input parameters")) - httpErr := httperror.NewHTTPError(http.StatusBadRequest, "Invalid input parameters") - httpErr.Render(w) + log.Ctx(ctx).Error(errors.Wrap(err, "validating txApproveHandler")) + httperror.InternalServerError.Render(w) return } - rejectedResponse, err := h.isRejected(ctx, in) + + in := txApproveRequest{} + err = httpdecode.Decode(r, &in) if err != nil { - httpErr, ok := err.(*httperror.Error) - if !ok { - httpErr = httperror.InternalServerError - } + log.Ctx(ctx).Error(errors.Wrap(err, "decoding input parameters")) + httpErr := httperror.NewHTTPError(http.StatusBadRequest, "Invalid input parameters") httpErr.Render(w) return } - httpjson.RenderStatus(w, http.StatusBadRequest, rejectedResponse, httpjson.JSON) + + txApproveResp := h.txApprove(ctx, in) + + txApproveResp.Render(w) } -func (h txApproveHandler) isRejected(ctx context.Context, in txApproveRequest) (*txApproveResponse, error) { - if in.Transaction == "" { - return NewRejectedTXApproveResponse(missingParamErr), nil +// validateInput performs some validations on the provided transaction. It can +// reject the transaction based on general criteria that would be applied in any +// approval server. +func (h txApproveHandler) validateInput(ctx context.Context, in txApproveRequest) *txApprovalResponse { + if in.Tx == "" { + log.Ctx(ctx).Error(`request is missing parameter "tx".`) + return NewRejectedTxApprovalResponse(`Missing parameter "tx".`) } - // Decode the request transaction. - parsed, err := txnbuild.TransactionFromXDR(in.Transaction) + genericTx, err := txnbuild.TransactionFromXDR(in.Tx) if err != nil { - log.Ctx(ctx).Error(errors.Wrapf(err, "Parsing transaction %s failed", in.Transaction)) - return NewRejectedTXApproveResponse(invalidParamErr), nil + log.Ctx(ctx).Error(errors.Wrap(err, "parsing transaction xdr")) + return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`) } - tx, ok := parsed.Transaction() + tx, ok := genericTx.Transaction() if !ok { - log.Ctx(ctx).Errorf("Transaction %s is not a simple transaction.", in.Transaction) - return NewRejectedTXApproveResponse(invalidParamErr), nil + log.Ctx(ctx).Error(`invalid parameter "tx", generic transaction not given.`) + return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`) } - // Check if transaction's source account is the same as the server issuer account. if tx.SourceAccount().AccountID == h.issuerKP.Address() { - log.Ctx(ctx).Errorf("Transaction %s sourceAccount is the same as the server issuer account %s", - in.Transaction, + log.Ctx(ctx).Errorf("transaction %s sourceAccount is the same as the server issuer account %s", + in.Tx, h.issuerKP.Address()) - return NewRejectedTXApproveResponse(invalidSrcAccErr), nil + return NewRejectedTxApprovalResponse("The source account is invalid.") } - // Check if transaction's operation(s)' sourceaccount is the same as the server issuer account. for _, op := range tx.Operations() { if op.GetSourceAccount() == h.issuerKP.Address() { - return NewRejectedTXApproveResponse(unauthorizedOpErr), nil + log.Ctx(ctx).Error(`transaction contains one or more operations where sourceAccount is issuer account.`) + return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction.") + } + + _, ok := op.(*txnbuild.Payment) + if !ok { + log.Ctx(ctx).Error(`transaction contains one or more operations is not of type payment`) + return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction.") } } - return NewRejectedTXApproveResponse(notImplementedErr), nil + // Temporarily reject all approval attempts(even those that meet the validateInput standards) + return NewRejectedTxApprovalResponse("Not implemented.") +} + +// txApprove is called to validate the input transaction. +// At the moment valid transactions will be rejected with "Not implemented." until subsequent updates. +func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (resp *txApprovalResponse) { + defer func() { + log.Ctx(ctx).Debug("==== will log responses ====") + log.Ctx(ctx).Debugf("req: %+v", in) + log.Ctx(ctx).Debugf("resp: %+v", resp) + log.Ctx(ctx).Debug("==== did log responses ====") + }() + + txRejectedResp := h.validateInput(ctx, in) + + return txRejectedResp } diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go new file mode 100644 index 0000000000..8bbe7b6d94 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go @@ -0,0 +1,31 @@ +package serve + +import ( + "net/http" + + "github.com/stellar/go/support/render/httpjson" +) + +type txApprovalResponse struct { + Status sep8Status `json:"status"` + Error string `json:"error,omitempty"` + StatusCode int `json:"-"` +} + +func (t *txApprovalResponse) Render(w http.ResponseWriter) { + httpjson.RenderStatus(w, t.StatusCode, t, httpjson.JSON) +} + +func NewRejectedTxApprovalResponse(errMessage string) *txApprovalResponse { + return &txApprovalResponse{ + Status: sep8StatusRejected, + Error: errMessage, + StatusCode: http.StatusBadRequest, + } +} + +type sep8Status string + +const ( + sep8StatusRejected sep8Status = "rejected" +) diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go index 9ae7160611..9349a476f8 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go @@ -5,7 +5,6 @@ import ( "io/ioutil" "net/http" "net/http/httptest" - "net/url" "strings" "testing" @@ -16,7 +15,30 @@ import ( "github.com/stretchr/testify/require" ) -func TestTxApproveHandler_isRejected(t *testing.T) { +func TestTxApproveHandlerValidate(t *testing.T) { + // empty asset issuer KP + h := txApproveHandler{} + err := h.validate() + require.EqualError(t, err, "issuer keypair cannot be nil") + + // empty asset code + issuerAccKeyPair := keypair.MustRandom() + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + } + err = h.validate() + require.EqualError(t, err, "asset code cannot be empty") + + // Success + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + } + err = h.validate() + require.NoError(t, err) +} + +func TestTxApproveHandlerTxApprove(t *testing.T) { ctx := context.Background() issuerAccKeyPair := keypair.MustRandom() assetGOAT := txnbuild.CreditAsset{ @@ -25,29 +47,31 @@ func TestTxApproveHandler_isRejected(t *testing.T) { } // Test if no transaction is submitted. req := txApproveRequest{ - Transaction: "", + Tx: "", } handler := txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: assetGOAT.GetCode(), } - rejectedResponse, err := handler.isRejected(ctx, req) - require.NoError(t, err) - wantRejectedResponse := txApproveResponse{ - Status: Sep8StatusRejected, - Error: missingParamErr, + rejectedResponse := handler.txApprove(ctx, req) + + wantRejectedResponse := txApprovalResponse{ + Status: "rejected", + Error: `Missing parameter "tx".`, + StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) // Test if can't parse XDR. req = txApproveRequest{ - Transaction: "BADXDRTRANSACTIONENVELOPE", + Tx: "BADXDRTRANSACTIONENVELOPE", } - rejectedResponse, err = handler.isRejected(ctx, req) - require.NoError(t, err) - wantRejectedResponse = txApproveResponse{ - Status: Sep8StatusRejected, - Error: invalidParamErr, + rejectedResponse = handler.txApprove(ctx, req) + + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: `Invalid parameter "tx".`, + StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) @@ -81,10 +105,9 @@ func TestTxApproveHandler_isRejected(t *testing.T) { feeBumpTxEnc, err := feeBumpTx.Base64() require.NoError(t, err) req = txApproveRequest{ - Transaction: feeBumpTxEnc, + Tx: feeBumpTxEnc, } - rejectedResponse, err = handler.isRejected(ctx, req) - require.NoError(t, err) + rejectedResponse = handler.txApprove(ctx, req) assert.Equal(t, &wantRejectedResponse, rejectedResponse) // wantRejectedResponse is identical to "if can't parse XDR". // Test if the transaction sourceAccount the same as the server issuer account @@ -106,13 +129,13 @@ func TestTxApproveHandler_isRejected(t *testing.T) { require.NoError(t, err) txEnc, err := tx.Base64() req = txApproveRequest{ - Transaction: txEnc, + Tx: txEnc, } - rejectedResponse, err = handler.isRejected(ctx, req) - require.NoError(t, err) - wantRejectedResponse = txApproveResponse{ - Status: Sep8StatusRejected, - Error: invalidSrcAccErr, + rejectedResponse = handler.txApprove(ctx, req) + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: "The source account is invalid.", + StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) @@ -136,13 +159,43 @@ func TestTxApproveHandler_isRejected(t *testing.T) { require.NoError(t, err) txEnc, err = tx.Base64() req = txApproveRequest{ - Transaction: txEnc, + Tx: txEnc, + } + rejectedResponse = handler.txApprove(ctx, req) + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: "There is one or more unauthorized operations in the provided transaction.", + StatusCode: http.StatusBadRequest, } - rejectedResponse, err = handler.isRejected(ctx, req) + assert.Equal(t, &wantRejectedResponse, rejectedResponse) + + // Test if operation is not a payment (in this case allowing trust for a random account) + kp03 := keypair.MustRandom() + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.AllowTrust{ + Trustor: kp03.Address(), + Type: assetGOAT, + Authorize: true, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) require.NoError(t, err) - wantRejectedResponse = txApproveResponse{ - Status: Sep8StatusRejected, - Error: unauthorizedOpErr, + txEnc, err = tx.Base64() + req = txApproveRequest{ + Tx: txEnc, + } + rejectedResponse = handler.txApprove(ctx, req) + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: "There is one or more unauthorized operations in the provided transaction.", + StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) @@ -166,18 +219,18 @@ func TestTxApproveHandler_isRejected(t *testing.T) { require.NoError(t, err) txEnc, err = tx.Base64() req = txApproveRequest{ - Transaction: txEnc, + Tx: txEnc, } - rejectedResponse, err = handler.isRejected(ctx, req) - require.NoError(t, err) - wantRejectedResponse = txApproveResponse{ - Status: Sep8StatusRejected, - Error: notImplementedErr, + rejectedResponse = handler.txApprove(ctx, req) + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: "Not implemented.", + StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) } -func TestTxApproveHandler_serveHTTPJson(t *testing.T) { +func TestAPI_RejectedIntegration(t *testing.T) { ctx := context.Background() issuerAccKeyPair := keypair.MustRandom() assetGOAT := txnbuild.CreditAsset{ @@ -367,17 +420,17 @@ func TestTxApproveHandler_serveHTTPJson(t *testing.T) { }` require.JSONEq(t, wantBody, string(body)) - // Test "not implemented" + // Test if the transaction's operation is not a payment. + kp03 := keypair.MustRandom() tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: kp01.Address(), - Destination: kp02.Address(), - Amount: "1", - Asset: assetGOAT, + &txnbuild.AllowTrust{ + Trustor: kp03.Address(), + Type: assetGOAT, + Authorize: true, }, }, BaseFee: txnbuild.MinBaseFee, @@ -404,198 +457,10 @@ func TestTxApproveHandler_serveHTTPJson(t *testing.T) { body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ - "status":"rejected", "error":"Not implemented." - }` - require.JSONEq(t, wantBody, string(body)) -} - -func TestTxApproveHandler_serveHTTPForm(t *testing.T) { - ctx := context.Background() - issuerAccKeyPair := keypair.MustRandom() - assetGOAT := txnbuild.CreditAsset{ - Code: "GOAT", - Issuer: issuerAccKeyPair.Address(), - } - handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), - } - - // Test if no transaction is submitted. - req := url.Values{} - req.Set("tx", "") - - r := httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") - r = r.WithContext(ctx) - - w := httptest.NewRecorder() - m := chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) - m.ServeHTTP(w, r) - resp := w.Result() - - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - - body, err := ioutil.ReadAll(resp.Body) - require.NoError(t, err) - wantBody := `{ - "status":"rejected", "error":"Missing parameter \"tx\"." - }` - require.JSONEq(t, wantBody, string(body)) - - // Test if can't parse XDR. - req.Set("tx", "BADXDRTRANSACTIONENVELOPE") - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") - r = r.WithContext(ctx) - - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) - m.ServeHTTP(w, r) - resp = w.Result() - - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - wantBody = `{ - "status":"rejected", "error":"Invalid parameter \"tx\"." + "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." }` require.JSONEq(t, wantBody, string(body)) - // Test if a non generic transaction fails, same result as malformed XDR. - kp01 := keypair.MustRandom() - kp02 := keypair.MustRandom() - tx, err := txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - Destination: kp02.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - feeBumpTx, err := txnbuild.NewFeeBumpTransaction( - txnbuild.FeeBumpTransactionParams{ - Inner: tx, - FeeAccount: kp02.Address(), - BaseFee: 2 * txnbuild.MinBaseFee, - }, - ) - require.NoError(t, err) - feeBumpTxEnc, err := feeBumpTx.Base64() - require.NoError(t, err) - req.Set("tx", feeBumpTxEnc) - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") - r = r.WithContext(ctx) - - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) - m.ServeHTTP(w, r) - resp = w.Result() - - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - wantBody = `{ - "status":"rejected", "error":"Invalid parameter \"tx\"." - }` - require.JSONEq(t, wantBody, string(body)) - - // Test if the transaction sourceAccount the same as the server issuer account - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: issuerAccKeyPair.Address()}, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - Destination: kp01.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err := tx.Base64() - req.Set("tx", txEnc) - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") - r = r.WithContext(ctx) - - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) - m.ServeHTTP(w, r) - resp = w.Result() - - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - wantBody = `{ - "status":"rejected", "error":"The source account is invalid." - }` - require.JSONEq(t, wantBody, string(body)) - - // Test if the transaction's operation sourceaccount the same as the server issuer account - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: issuerAccKeyPair.Address(), - Destination: kp01.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err = tx.Base64() - req.Set("tx", txEnc) - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") - r = r.WithContext(ctx) - - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) - m.ServeHTTP(w, r) - resp = w.Result() - - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - wantBody = `{ - "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." - }` - require.JSONEq(t, wantBody, string(body)) - // Test "not implemented" tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ @@ -615,9 +480,10 @@ func TestTxApproveHandler_serveHTTPForm(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() - req.Set("tx", txEnc) - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req.Encode())) - r.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) r = r.WithContext(ctx) w = httptest.NewRecorder() @@ -632,7 +498,7 @@ func TestTxApproveHandler_serveHTTPForm(t *testing.T) { body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ - "status":"rejected", "error":"Not implemented." - }` + "status":"rejected", "error":"Not implemented." + }` require.JSONEq(t, wantBody, string(body)) } From 45f7bc28b89167766a88da8f634cb9a1d5d42cd1 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Tue, 11 May 2021 13:56:42 +0200 Subject: [PATCH 34/67] Fix Horizon docker image (#3594) --- services/horizon/docker/Dockerfile.dev | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/horizon/docker/Dockerfile.dev b/services/horizon/docker/Dockerfile.dev index 7ddefbd4d7..bec6cd2625 100644 --- a/services/horizon/docker/Dockerfile.dev +++ b/services/horizon/docker/Dockerfile.dev @@ -7,7 +7,7 @@ COPY . ./ RUN go install github.com/stellar/go/services/horizon RUN go install github.com/stellar/go/exp/services/captivecore -FROM ubuntu:18.04 +FROM ubuntu:20.04 ENV STELLAR_CORE_VERSION 17.0.0-557.096f6a7.focal ENV STELLAR_CORE_BINARY_PATH /usr/bin/stellar-core @@ -16,8 +16,8 @@ ENV DEBIAN_FRONTEND=noninteractive # ca-certificates are required to make tls connections RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl wget gnupg apt-utils RUN wget -qO - https://apt.stellar.org/SDF.asc | APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=true apt-key add - -RUN echo "deb https://apt.stellar.org xenial stable" >/etc/apt/sources.list.d/SDF.list -RUN echo "deb https://apt.stellar.org xenial unstable" >/etc/apt/sources.list.d/SDF-unstable.list +RUN echo "deb https://apt.stellar.org focal stable" >/etc/apt/sources.list.d/SDF.list +RUN echo "deb https://apt.stellar.org focal unstable" >/etc/apt/sources.list.d/SDF-unstable.list RUN apt-get update && apt-get install -y stellar-core=${STELLAR_CORE_VERSION} RUN apt-get clean From d48da5b75ee441610daebc5c5ca342c751c45cef Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Tue, 11 May 2021 18:50:08 +0200 Subject: [PATCH 35/67] ReplicaSyncMiddleware (#3574) --- services/horizon/internal/app.go | 5 ++ services/horizon/internal/config.go | 1 + services/horizon/internal/flags.go | 7 +++ services/horizon/internal/httpx/middleware.go | 48 +++++++++++++++++++ services/horizon/internal/httpx/router.go | 17 +++++-- services/horizon/internal/httpx/server.go | 9 +++- services/horizon/internal/init.go | 26 ++++++++-- .../internal/render/problem/problem.go | 4 +- 8 files changed, 106 insertions(+), 11 deletions(-) diff --git a/services/horizon/internal/app.go b/services/horizon/internal/app.go index 8b9109a22d..c7edd09cec 100644 --- a/services/horizon/internal/app.go +++ b/services/horizon/internal/app.go @@ -56,6 +56,7 @@ type App struct { config Config webServer *httpx.Server historyQ *history.Q + primaryHistoryQ *history.Q ctx context.Context cancel func() horizonVersion string @@ -507,6 +508,10 @@ func (a *App) init() error { }, } + if a.primaryHistoryQ != nil { + routerConfig.PrimaryDBSession = a.primaryHistoryQ.Session + } + var err error config := httpx.ServerConfig{ Port: uint16(a.config.Port), diff --git a/services/horizon/internal/config.go b/services/horizon/internal/config.go index 3b1e80306a..3fcdad27fd 100644 --- a/services/horizon/internal/config.go +++ b/services/horizon/internal/config.go @@ -13,6 +13,7 @@ import ( // app's main function and is provided to NewApp. type Config struct { DatabaseURL string + RoDatabaseURL string HistoryArchiveURLs []string Port uint AdminPort uint diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index d7f878ee40..9a5831cebc 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -94,6 +94,13 @@ func Flags() (*Config, support.ConfigOptions) { Required: true, Usage: "horizon postgres database to connect with", }, + &support.ConfigOption{ + Name: "ro-database-url", + ConfigKey: &config.RoDatabaseURL, + OptType: types.String, + Required: false, + Usage: "horizon postgres read-replica to connect with, when set it will return stale history error when replica is behind primary", + }, &support.ConfigOption{ Name: StellarCoreBinaryPathName, OptType: types.String, diff --git a/services/horizon/internal/httpx/middleware.go b/services/horizon/internal/httpx/middleware.go index 164bc0d5fb..d9c8dee70a 100644 --- a/services/horizon/internal/httpx/middleware.go +++ b/services/horizon/internal/httpx/middleware.go @@ -353,3 +353,51 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { func (m *StateMiddleware) Wrap(h http.Handler) http.Handler { return m.WrapFunc(h.ServeHTTP) } + +type ReplicaSyncCheckMiddleware struct { + PrimaryHistoryQ *history.Q + ReplicaHistoryQ *history.Q + ServerMetrics *ServerMetrics +} + +// WrapFunc executes the middleware on a given HTTP handler function +func (m *ReplicaSyncCheckMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + for attempt := 1; attempt <= 4; attempt++ { + primaryIngestLedger, err := m.PrimaryHistoryQ.GetLastLedgerIngestNonBlocking() + if err != nil { + problem.Render(r.Context(), w, err) + return + } + + replicaIngestLedger, err := m.ReplicaHistoryQ.GetLastLedgerIngestNonBlocking() + if err != nil { + problem.Render(r.Context(), w, err) + return + } + + if replicaIngestLedger >= primaryIngestLedger { + break + } + + switch attempt { + case 1: + time.Sleep(20 * time.Millisecond) + case 2: + time.Sleep(40 * time.Millisecond) + case 3: + time.Sleep(80 * time.Millisecond) + case 4: + problem.Render(r.Context(), w, hProblem.StaleHistory) + m.ServerMetrics.ReplicaLagErrorsCounter.Inc() + return + } + } + + h.ServeHTTP(w, r) + } +} + +func (m *ReplicaSyncCheckMiddleware) Wrap(h http.Handler) http.Handler { + return m.WrapFunc(h.ServeHTTP) +} diff --git a/services/horizon/internal/httpx/router.go b/services/horizon/internal/httpx/router.go index 966d70178c..09049f6727 100644 --- a/services/horizon/internal/httpx/router.go +++ b/services/horizon/internal/httpx/router.go @@ -16,6 +16,7 @@ import ( "github.com/stellar/throttled" "github.com/stellar/go/services/horizon/internal/actions" + "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/ledger" "github.com/stellar/go/services/horizon/internal/paths" "github.com/stellar/go/services/horizon/internal/render/sse" @@ -28,9 +29,10 @@ import ( const maxAssetsForPathFinding = 15 type RouterConfig struct { - DBSession *db.Session - TxSubmitter *txsub.System - RateQuota *throttled.RateQuota + DBSession *db.Session + PrimaryDBSession *db.Session + TxSubmitter *txsub.System + RateQuota *throttled.RateQuota BehindCloudflare bool BehindAWSLoadBalancer bool @@ -99,6 +101,15 @@ func (r *Router) addMiddleware(config *RouterConfig, r.Use(rateLimitter.RateLimit) } + if config.PrimaryDBSession != nil { + replicaSyncMiddleware := ReplicaSyncCheckMiddleware{ + PrimaryHistoryQ: &history.Q{config.PrimaryDBSession}, + ReplicaHistoryQ: &history.Q{config.DBSession}, + ServerMetrics: serverMetrics, + } + r.Use(replicaSyncMiddleware.Wrap) + } + // Internal middlewares r.Internal.Use(chimiddleware.StripSlashes) r.Internal.Use(chimiddleware.RequestID) diff --git a/services/horizon/internal/httpx/server.go b/services/horizon/internal/httpx/server.go index bdcd4a696e..87073ff563 100644 --- a/services/horizon/internal/httpx/server.go +++ b/services/horizon/internal/httpx/server.go @@ -22,7 +22,8 @@ import ( ) type ServerMetrics struct { - RequestDurationSummary *prometheus.SummaryVec + RequestDurationSummary *prometheus.SummaryVec + ReplicaLagErrorsCounter prometheus.Counter } type TLSConfig struct { @@ -67,6 +68,12 @@ func NewServer(serverConfig ServerConfig, routerConfig RouterConfig, ledgerState }, []string{"status", "route", "streaming", "method"}, ), + ReplicaLagErrorsCounter: prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: "horizon", Subsystem: "http", Name: "replica_lag_errors_count", + Help: "Count of HTTP errors returned due to replica lag", + }, + ), } router, err := NewRouter(&routerConfig, sm, ledgerState) if err != nil { diff --git a/services/horizon/internal/init.go b/services/horizon/internal/init.go index 33212b70ec..c3e91c78b4 100644 --- a/services/horizon/internal/init.go +++ b/services/horizon/internal/init.go @@ -43,11 +43,26 @@ func mustInitHorizonDB(app *App) { } } - app.historyQ = &history.Q{mustNewDBSession( - app.config.DatabaseURL, - maxIdle, - maxOpen, - )} + if app.config.RoDatabaseURL == "" { + app.historyQ = &history.Q{mustNewDBSession( + app.config.DatabaseURL, + maxIdle, + maxOpen, + )} + } else { + // If RO set, use it for all DB queries + app.historyQ = &history.Q{mustNewDBSession( + app.config.RoDatabaseURL, + maxIdle, + maxOpen, + )} + + app.primaryHistoryQ = &history.Q{mustNewDBSession( + app.config.DatabaseURL, + maxIdle, + maxOpen, + )} + } } func initIngester(app *App) { @@ -293,6 +308,7 @@ func initTxSubMetrics(app *App) { func initWebMetrics(app *App) { app.prometheusRegistry.MustRegister(app.webServer.Metrics.RequestDurationSummary) + app.prometheusRegistry.MustRegister(app.webServer.Metrics.ReplicaLagErrorsCounter) } func initSubmissionSystem(app *App) { diff --git a/services/horizon/internal/render/problem/problem.go b/services/horizon/internal/render/problem/problem.go index a6278c956f..f1b23b676e 100644 --- a/services/horizon/internal/render/problem/problem.go +++ b/services/horizon/internal/render/problem/problem.go @@ -100,8 +100,8 @@ var ( Status: http.StatusServiceUnavailable, Detail: "This horizon instance is configured to reject client requests " + "when it can determine that the history database is lagging too far " + - "behind the connected instance of stellar-core. If you operate this " + - "server, please ensure that the ingestion system is properly running.", + "behind the connected instance of stellar-core or read replica. Please " + + "try again later.", } // StillIngesting is a well-known problem type. Use it as a shortcut From 163c692efe5a6d89e228e05290a4cecdf9032a3f Mon Sep 17 00:00:00 2001 From: George Date: Tue, 11 May 2021 12:10:49 -0700 Subject: [PATCH 36/67] services/horizon: Pass context to read-replica database calls (#3596) --- services/horizon/internal/httpx/middleware.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/horizon/internal/httpx/middleware.go b/services/horizon/internal/httpx/middleware.go index d9c8dee70a..a3969b1528 100644 --- a/services/horizon/internal/httpx/middleware.go +++ b/services/horizon/internal/httpx/middleware.go @@ -364,13 +364,13 @@ type ReplicaSyncCheckMiddleware struct { func (m *ReplicaSyncCheckMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { for attempt := 1; attempt <= 4; attempt++ { - primaryIngestLedger, err := m.PrimaryHistoryQ.GetLastLedgerIngestNonBlocking() + primaryIngestLedger, err := m.PrimaryHistoryQ.GetLastLedgerIngestNonBlocking(r.Context()) if err != nil { problem.Render(r.Context(), w, err) return } - replicaIngestLedger, err := m.ReplicaHistoryQ.GetLastLedgerIngestNonBlocking() + replicaIngestLedger, err := m.ReplicaHistoryQ.GetLastLedgerIngestNonBlocking(r.Context()) if err != nil { problem.Render(r.Context(), w, err) return From 3252a0b396096da1e5f8c9b9cac7fb829bd589cc Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Wed, 12 May 2021 07:23:43 -0700 Subject: [PATCH 37/67] services/regulated-assets-approval-server/internal: SEP-8 approval server should revise transaction payments for happy path (#3595) * add tx_approve_response Signed-off-by: Lawrence Lawson * move tx_approve_response to correct dir Signed-off-by: Lawrence Lawson * refactor isRejected to leverage the new NewRejectedTxApprovalResponse - update tests to do the same -remove any depricated txApproveResponse code Signed-off-by: Lawrence Lawson * replaceconst with hardcoded strings Signed-off-by: Lawrence Lawson * extend txApproveHandler struct to include new fields - baseURL, db, horizonClient, kycThreshold, networkPassphrase, paymentAmount Signed-off-by: Lawrence Lawson * add validate to tx_approve - add validate test - remove paymentAmount arg to handler Signed-off-by: Lawrence Lawson * make consistent baseurl for test Signed-off-by: Lawrence Lawson * use validate in tx_approve ServeHTTP - update request from Transaction to Tx to keep consistent - update tests to sync with the handler updates Signed-off-by: Lawrence Lawson * refactor isRejected to be txApprove - port all the is rejected logic to validate input - update tests to work wit new refactor Signed-off-by: Lawrence Lawson * correct error msg punctuation Signed-off-by: Lawrence Lawson * add doc strings Signed-off-by: Lawrence Lawson * validateInput definition closer to declaration Signed-off-by: Lawrence Lawson * add new logs to validate Signed-off-by: Lawrence Lawson * refactor test with idomatic names - remove redundant integration test (http form https://github.com/stellar/go/pull/3480#pullrequestreview-620226686) Signed-off-by: Lawrence Lawson * reject and test against any ops that are not payments Signed-off-by: Lawrence Lawson * remove debug comment Signed-off-by: Lawrence Lawson * reduce discance between call and use Signed-off-by: Lawrence Lawson * Test if op is payment in TestAPIRejectedIntegration Signed-off-by: Lawrence Lawson * reducing the code scope for code needed at the present Signed-off-by: Lawrence Lawson * remove txnbuild.Transaction return value Signed-off-by: Lawrence Lawson * refactor op type assertion Signed-off-by: Lawrence Lawson * remove unneeeded erroor return from validateInput Signed-off-by: Lawrence Lawson * convention test name Signed-off-by: Lawrence Lawson * update comment Signed-off-by: Lawrence Lawson * remove error logic until needed - moved default NewRejectedTxApprovalResponse to validateInput for clarity Signed-off-by: Lawrence Lawson * remove not implemented logic Signed-off-by: Lawrence Lawson * update toml acceptance criteria Signed-off-by: Lawrence Lawson * add errors to txApprove - add new check for how many ops are in tx - port the payment op check to txApprove - return *txnbuild.Transaction obj from validateInput Signed-off-by: Lawrence Lawson * test against multiple ops in transaction Signed-off-by: Lawrence Lawson * add NewRevisedTxApprovalResponse for revised messages Signed-off-by: Lawrence Lawson * set up the revised response - also set up test for revised response Signed-off-by: Lawrence Lawson * add horizon client and passphrase attributes Signed-off-by: Lawrence Lawson * update TestAPI_RejectedIntegration with new handler fields Signed-off-by: Lawrence Lawson * add new handler fields horizonClient and networkPassphrase Signed-off-by: Lawrence Lawson * build and sandwich transaction - return the encoded sandwich transaction - test successful sandwich Signed-off-by: Lawrence Lawson * consistent err logs Signed-off-by: Lawrence Lawson * test 2 successful Revised flows - when payment op has a source account and when it doesnt Signed-off-by: Lawrence Lawson * Update older tests transaction building to be consistent Signed-off-by: Lawrence Lawson * adding BadRequest to http error - return bad request if error occurs when decoding request Signed-off-by: Lawrence Lawson * fix punctuation in log Signed-off-by: Lawrence Lawson * returned wrapped errors Signed-off-by: Lawrence Lawson * Change kp seq numbers to nonzero values Signed-off-by: Lawrence Lawson * add new no error asserts Signed-off-by: Lawrence Lawson * set kp03 to horizon mock Signed-off-by: Lawrence Lawson * reorder mux/request/recorder in a more intuitive way Signed-off-by: Lawrence Lawson * less generic kp var names - and account detail var Signed-off-by: Lawrence Lawson * testing inccorect seq num Signed-off-by: Lawrence Lawson * rename InternalServerError - obvious its an error due to it being in httperror Signed-off-by: Lawrence Lawson * remove newlines Signed-off-by: Lawrence Lawson * clarify empty srcaccount op param comment Signed-off-by: Lawrence Lawson * refactor from map to native txApprovalResponse struct Signed-off-by: Lawrence Lawson * rename endpoint Signed-off-by: Lawrence Lawson * minor nits Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * correct README Signed-off-by: Lawrence Lawson * refactor error return Signed-off-by: Lawrence Lawson * remove kp03 in favor of reusing receiverAccKP - the assertions dont require a third kp in their scenarios Signed-off-by: Lawrence Lawson * remove redundant asserts Signed-off-by: Lawrence Lawson * remove redundant test scenario Signed-off-by: Lawrence Lawson --- .../README.md | 31 ++ .../internal/serve/friendbot.go | 4 +- .../internal/serve/httperror/http_error.go | 7 +- .../internal/serve/serve.go | 8 +- .../internal/serve/toml.go | 4 +- .../internal/serve/toml_test.go | 2 +- .../internal/serve/tx_approve.go | 149 ++++-- .../internal/serve/tx_approve_response.go | 14 +- .../internal/serve/tx_approve_test.go | 482 ++++++++++++++---- 9 files changed, 547 insertions(+), 154 deletions(-) diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index dcf60dbd8e..1049146955 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -80,7 +80,38 @@ to set those flags. Just click the link, fulfill the account address, sequence number, then the account secret and submit the transaction. ### API Spec +#### `POST /tx-approve` +This is the core [SEP-8] endpoint used to validate and process approval/revision/rejection of regulated assets transactions. + +**Request:** + +```json +{ + "tx": "AAAAAgAAAAA0Nk3++mfFw4Is6OaUJTKe71XNtxdktcjGrPildK84xAAAJxAAAJ3YAAAABwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAARllVv+K58Rbwzc/2Ti1IsisLC03udNJblQx2sPLfDygAAAAJNWVVTRAAAAAAAAAAAAAAAqjdTmDnuZm4YrIZ3wQVmVXmWSMO4dLk5dOPzUjWDvIgAAAABKp6IgAAAAAAAAAABdK84xAAAAEACHShDhulyTyvFx9lCU2LjAN9P7g6XqZJ6aNKo/NFb+9awp4pE5soK5cTtahhVzx9RsUcH+FSRmOPu4YEqqBsK" +} +``` + +**Responses:** + +_Revised:_ + +```json +{ + "status": "revised", + "message": "Authorization and deauthorization operations were added.", + "tx": "AAAAAgAAAAA0Nk3++mfFw4Is6OaUJTKe71XNtxdktcjGrPildK84xAAABdwAAJ3YAAAABwAAAAEAAAAAAAAAAAAAAABgXdapAAAAAAAAAAUAAAABAAAAAKo3U5g57mZuGKyGd8EFZlV5lkjDuHS5OXTj81I1g7yIAAAABwAAAAA0Nk3++mfFw4Is6OaUJTKe71XNtxdktcjGrPildK84xAAAAAJNWVVTRAAAAAAAAAAAAAABAAAAAQAAAACqN1OYOe5mbhishnfBBWZVeZZIw7h0uTl04/NSNYO8iAAAAAcAAAAAEZZVb/iufEW8M3P9k4tSLIrCwtN7nTSW5UMdrDy3w8oAAAACTVlVU0QAAAAAAAAAAAAAAQAAAAAAAAABAAAAABGWVW/4rnxFvDNz/ZOLUiyKwsLTe500luVDHaw8t8PKAAAAAk1ZVVNEAAAAAAAAAAAAAACqN1OYOe5mbhishnfBBWZVeZZIw7h0uTl04/NSNYO8iAAAAAEqnoiAAAAAAQAAAACqN1OYOe5mbhishnfBBWZVeZZIw7h0uTl04/NSNYO8iAAAAAcAAAAAEZZVb/iufEW8M3P9k4tSLIrCwtN7nTSW5UMdrDy3w8oAAAACTVlVU0QAAAAAAAAAAAAAAAAAAAEAAAAAqjdTmDnuZm4YrIZ3wQVmVXmWSMO4dLk5dOPzUjWDvIgAAAAHAAAAADQ2Tf76Z8XDgizo5pQlMp7vVc23F2S1yMas+KV0rzjEAAAAAk1ZVVNEAAAAAAAAAAAAAAAAAAAAAAAAATWDvIgAAABAxXindTDbKTpw9B+1aUdTOTE6CUF610A0ZL+ofBVSlcvHYadc3LfO/L4/V22h2FyHNt2ALwncmlEq+3hpojZDDQ==" +} +``` + +_Rejected:_ + +```json +{ + "status": "rejected", + "error": "There is one or more unauthorized operations in the provided transaction." +} +``` #### `GET /friendbot?addr=GDDIO6SFRD4SJEQFJOSKPIDYTDM7LM4METFBKN4NFGVR5DTGB7H75N5S` This endpoint sends a payment of 10,000 (this value is configurable) regulated diff --git a/services/regulated-assets-approval-server/internal/serve/friendbot.go b/services/regulated-assets-approval-server/internal/serve/friendbot.go index b7a406cc94..6da2936461 100644 --- a/services/regulated-assets-approval-server/internal/serve/friendbot.go +++ b/services/regulated-assets-approval-server/internal/serve/friendbot.go @@ -77,7 +77,7 @@ func (h friendbotHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if err != nil { httpErr, ok := err.(*httperror.Error) if !ok { - httpErr = httperror.InternalServerError + httpErr = httperror.InternalServer } httpErr.Render(w) return @@ -134,7 +134,7 @@ func (h friendbotHandler) topUpAccountWithRegulatedAsset(ctx context.Context, in issuerAcc, err := h.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: kp.Address()}) if err != nil { log.Ctx(ctx).Error(errors.Wrapf(err, "getting detail for issuer account %s", kp.Address())) - return httperror.InternalServerError + return httperror.InternalServer } tx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ diff --git a/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go b/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go index d96dabf571..7f0acd1c80 100644 --- a/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go +++ b/services/regulated-assets-approval-server/internal/serve/httperror/http_error.go @@ -28,11 +28,16 @@ func (e *Error) Render(w http.ResponseWriter) { httpjson.RenderStatus(w, e.Status, e, httpjson.JSON) } -var InternalServerError = &Error{ +var InternalServer = &Error{ ErrorMessage: "An error occurred while processing this request.", Status: http.StatusInternalServerError, } +var BadRequest = &Error{ + ErrorMessage: "The request was invalid in some way.", + Status: http.StatusBadRequest, +} + func ParseHorizonError(err error) error { if err == nil { return nil diff --git a/services/regulated-assets-approval-server/internal/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go index cb65fa0238..2f5971f6b0 100644 --- a/services/regulated-assets-approval-server/internal/serve/serve.go +++ b/services/regulated-assets-approval-server/internal/serve/serve.go @@ -83,9 +83,11 @@ func handleHTTP(opts Options) http.Handler { networkPassphrase: opts.NetworkPassphrase, paymentAmount: opts.FriendbotPaymentAmount, }.ServeHTTP) - mux.Post("/tx_approve", txApproveHandler{ - assetCode: opts.AssetCode, - issuerKP: issuerKP, + mux.Post("/tx-approve", txApproveHandler{ + assetCode: opts.AssetCode, + issuerKP: issuerKP, + horizonClient: opts.horizonClient(), + networkPassphrase: opts.NetworkPassphrase, }.ServeHTTP) return mux } diff --git a/services/regulated-assets-approval-server/internal/serve/toml.go b/services/regulated-assets-approval-server/internal/serve/toml.go index a219bfb8d4..9ee09b3852 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml.go +++ b/services/regulated-assets-approval-server/internal/serve/toml.go @@ -52,10 +52,10 @@ func (h stellarTOMLHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { err := h.validate() if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "validating tomlHandler")) - httperror.InternalServerError.Render(rw) + httperror.InternalServer.Render(rw) return } - approvalCriteria := fmt.Sprintf("Currently %s is not approving any %s transactions.", h.approvalServer, h.assetCode) + approvalCriteria := fmt.Sprintf("Currently %s only approves %s payment transactions.", h.approvalServer, h.assetCode) fmt.Fprintf(rw, "NETWORK_PASSPHRASE=%q\n", h.networkPassphrase) fmt.Fprintf(rw, "[[CURRENCIES]]\n") diff --git a/services/regulated-assets-approval-server/internal/serve/toml_test.go b/services/regulated-assets-approval-server/internal/serve/toml_test.go index 9703ae47eb..ecd5f4ee54 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml_test.go +++ b/services/regulated-assets-approval-server/internal/serve/toml_test.go @@ -113,7 +113,7 @@ code="FOO" issuer="GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM" regulated=true approval_server="localhost:8000/tx-approve" -approval_criteria="Currently localhost:8000/tx-approve is not approving any FOO transactions." +approval_criteria="Currently localhost:8000/tx-approve only approves FOO payment transactions." ` require.Equal(t, wantBody, string(body)) } diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go index e1e80b1726..cc7a71929e 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve.go @@ -3,7 +3,9 @@ package serve import ( "context" "net/http" + "strconv" + "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" "github.com/stellar/go/support/errors" @@ -13,23 +15,30 @@ import ( ) type txApproveHandler struct { - issuerKP *keypair.Full - assetCode string + issuerKP *keypair.Full + assetCode string + horizonClient horizonclient.ClientInterface + networkPassphrase string } type txApproveRequest struct { Tx string `json:"tx" form:"tx"` } +// validate performs some validations on the provided handler data. func (h txApproveHandler) validate() error { if h.issuerKP == nil { return errors.New("issuer keypair cannot be nil") } - if h.assetCode == "" { return errors.New("asset code cannot be empty") } - + if h.horizonClient == nil { + return errors.New("horizon client cannot be nil") + } + if h.networkPassphrase == "" { + return errors.New("network passphrase cannot be empty") + } return nil } @@ -39,80 +48,158 @@ func (h txApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := h.validate() if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "validating txApproveHandler")) - httperror.InternalServerError.Render(w) + httperror.InternalServer.Render(w) return } in := txApproveRequest{} err = httpdecode.Decode(r, &in) if err != nil { - log.Ctx(ctx).Error(errors.Wrap(err, "decoding input parameters")) - httpErr := httperror.NewHTTPError(http.StatusBadRequest, "Invalid input parameters") - httpErr.Render(w) + log.Ctx(ctx).Error(errors.Wrap(err, "decoding txApproveRequest")) + httperror.BadRequest.Render(w) return } - txApproveResp := h.txApprove(ctx, in) - + txApproveResp, err := h.txApprove(ctx, in) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating the input transaction for approval")) + httperror.InternalServer.Render(w) + return + } txApproveResp.Render(w) } // validateInput performs some validations on the provided transaction. It can // reject the transaction based on general criteria that would be applied in any // approval server. -func (h txApproveHandler) validateInput(ctx context.Context, in txApproveRequest) *txApprovalResponse { +func (h txApproveHandler) validateInput(ctx context.Context, in txApproveRequest) (*txApprovalResponse, *txnbuild.Transaction) { if in.Tx == "" { log.Ctx(ctx).Error(`request is missing parameter "tx".`) - return NewRejectedTxApprovalResponse(`Missing parameter "tx".`) + return NewRejectedTxApprovalResponse(`Missing parameter "tx".`), nil } genericTx, err := txnbuild.TransactionFromXDR(in.Tx) if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "parsing transaction xdr")) - return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`) + return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`), nil } tx, ok := genericTx.Transaction() if !ok { log.Ctx(ctx).Error(`invalid parameter "tx", generic transaction not given.`) - return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`) + return NewRejectedTxApprovalResponse(`Invalid parameter "tx".`), nil } if tx.SourceAccount().AccountID == h.issuerKP.Address() { log.Ctx(ctx).Errorf("transaction %s sourceAccount is the same as the server issuer account %s", in.Tx, h.issuerKP.Address()) - return NewRejectedTxApprovalResponse("The source account is invalid.") + return NewRejectedTxApprovalResponse("The source account is invalid."), nil } - for _, op := range tx.Operations() { - if op.GetSourceAccount() == h.issuerKP.Address() { - log.Ctx(ctx).Error(`transaction contains one or more operations where sourceAccount is issuer account.`) - return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction.") - } + if len(tx.Operations()) != 1 { + return NewRejectedTxApprovalResponse("Please submit a transaction with exactly one operation of type payment."), nil + } - _, ok := op.(*txnbuild.Payment) - if !ok { - log.Ctx(ctx).Error(`transaction contains one or more operations is not of type payment`) - return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction.") - } + if tx.Operations()[0].GetSourceAccount() == h.issuerKP.Address() { + log.Ctx(ctx).Error(`transaction contains one or more operations where sourceAccount is issuer account.`) + return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction."), nil } - // Temporarily reject all approval attempts(even those that meet the validateInput standards) - return NewRejectedTxApprovalResponse("Not implemented.") + return nil, tx } // txApprove is called to validate the input transaction. -// At the moment valid transactions will be rejected with "Not implemented." until subsequent updates. -func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (resp *txApprovalResponse) { +func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (resp *txApprovalResponse, err error) { defer func() { log.Ctx(ctx).Debug("==== will log responses ====") log.Ctx(ctx).Debugf("req: %+v", in) log.Ctx(ctx).Debugf("resp: %+v", resp) + log.Ctx(ctx).Debugf("err: %+v", err) log.Ctx(ctx).Debug("==== did log responses ====") }() - txRejectedResp := h.validateInput(ctx, in) + txRejectedResp, tx := h.validateInput(ctx, in) + if txRejectedResp != nil { + return txRejectedResp, nil + } + paymentOp, ok := tx.Operations()[0].(*txnbuild.Payment) + if !ok { + log.Ctx(ctx).Error(`transaction contains one or more operations is not of type payment`) + return NewRejectedTxApprovalResponse("There is one or more unauthorized operations in the provided transaction."), nil + } + paymentSource := paymentOp.SourceAccount + if paymentSource == "" { + paymentSource = tx.SourceAccount().AccountID + } + + issuerAddress := h.issuerKP.Address() + if paymentOp.Asset.GetCode() != h.assetCode || paymentOp.Asset.GetIssuer() != issuerAddress { + log.Ctx(ctx).Error(`the payment asset is not supported by this issuer`) + return NewRejectedTxApprovalResponse("The payment asset is not supported by this issuer."), nil + } + + acc, err := h.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: paymentSource}) + if err != nil { + return nil, errors.Wrapf(err, "getting detail for payment source account %s", issuerAddress) + } + // validate the sequence number + accountSequence, err := strconv.ParseInt(acc.Sequence, 10, 64) + if err != nil { + return nil, errors.Wrapf(err, "parsing account sequence number %q from string to int64", acc.Sequence) + } + if tx.SourceAccount().Sequence != accountSequence+1 { + log.Ctx(ctx).Errorf(`invalid transaction sequence number tx.SourceAccount().Sequence: %d, accountSequence+1:%d`, tx.SourceAccount().Sequence, accountSequence+1) + return NewRejectedTxApprovalResponse("Invalid transaction sequence number."), nil + } - return txRejectedResp + // build the transaction + revisedOperations := []txnbuild.Operation{ + &txnbuild.AllowTrust{ + Trustor: paymentSource, + Type: paymentOp.Asset, + Authorize: true, + SourceAccount: issuerAddress, + }, + &txnbuild.AllowTrust{ + Trustor: paymentOp.Destination, + Type: paymentOp.Asset, + Authorize: true, + SourceAccount: issuerAddress, + }, + paymentOp, + &txnbuild.AllowTrust{ + Trustor: paymentOp.Destination, + Type: paymentOp.Asset, + Authorize: false, + SourceAccount: issuerAddress, + }, + &txnbuild.AllowTrust{ + Trustor: paymentSource, + Type: paymentOp.Asset, + Authorize: false, + SourceAccount: issuerAddress, + }, + } + revisedTx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + SourceAccount: &acc, + IncrementSequenceNum: true, + Operations: revisedOperations, + BaseFee: 300, + Timebounds: txnbuild.NewTimeout(300), + }) + if err != nil { + return nil, errors.Wrap(err, "building transaction") + } + + revisedTx, err = revisedTx.Sign(h.networkPassphrase, h.issuerKP) + if err != nil { + return nil, errors.Wrap(err, "signing transaction") + } + + txe, err := revisedTx.Base64() + if err != nil { + return nil, errors.Wrap(err, "encoding revised transaction") + } + return NewRevisedTxApprovalResponse(txe), nil } diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go index 8bbe7b6d94..e26875aae2 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go @@ -7,9 +7,11 @@ import ( ) type txApprovalResponse struct { - Status sep8Status `json:"status"` Error string `json:"error,omitempty"` + Message string `json:"message,omitempty"` + Status sep8Status `json:"status"` StatusCode int `json:"-"` + Tx string `json:"tx,omitempty"` } func (t *txApprovalResponse) Render(w http.ResponseWriter) { @@ -24,8 +26,18 @@ func NewRejectedTxApprovalResponse(errMessage string) *txApprovalResponse { } } +func NewRevisedTxApprovalResponse(tx string) *txApprovalResponse { + return &txApprovalResponse{ + Status: sep8StatusRevised, + Tx: tx, + StatusCode: http.StatusOK, + Message: "Authorization and deauthorization operations were added.", + } +} + type sep8Status string const ( sep8StatusRejected sep8Status = "rejected" + sep8StatusRevised sep8Status = "revised" ) diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go index 9349a476f8..4c2105b01d 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go @@ -2,6 +2,7 @@ package serve import ( "context" + "encoding/json" "io/ioutil" "net/http" "net/http/httptest" @@ -9,38 +10,60 @@ import ( "testing" "github.com/go-chi/chi" + "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" + "github.com/stellar/go/network" + "github.com/stellar/go/protocols/horizon" + "github.com/stellar/go/protocols/horizon/base" "github.com/stellar/go/txnbuild" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestTxApproveHandlerValidate(t *testing.T) { - // empty asset issuer KP + // empty asset issuer KP. h := txApproveHandler{} err := h.validate() require.EqualError(t, err, "issuer keypair cannot be nil") - - // empty asset code + // empty asset code. issuerAccKeyPair := keypair.MustRandom() h = txApproveHandler{ issuerKP: issuerAccKeyPair, } err = h.validate() require.EqualError(t, err, "asset code cannot be empty") - - // Success + // No Horizon client. h = txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: "FOOBAR", } err = h.validate() + require.EqualError(t, err, "horizon client cannot be nil") + // No network passphrase. + horizonMock := horizonclient.MockClient{} + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + } + err = h.validate() + require.EqualError(t, err, "network passphrase cannot be empty") + // Success. + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + } + err = h.validate() require.NoError(t, err) } func TestTxApproveHandlerTxApprove(t *testing.T) { ctx := context.Background() issuerAccKeyPair := keypair.MustRandom() + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() assetGOAT := txnbuild.CreditAsset{ Code: "GOAT", Issuer: issuerAccKeyPair.Address(), @@ -49,42 +72,67 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req := txApproveRequest{ Tx: "", } + horizonMock := horizonclient.MockClient{} + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + AccountID: issuerAccKeyPair.Address(), + Sequence: "1", + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "0", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "2", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "3", + }, nil) handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, } - rejectedResponse := handler.txApprove(ctx, req) - + rejectedResponse, err := handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse := txApprovalResponse{ Status: "rejected", Error: `Missing parameter "tx".`, StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if can't parse XDR. req = txApproveRequest{ Tx: "BADXDRTRANSACTIONENVELOPE", } - rejectedResponse = handler.txApprove(ctx, req) - + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ Status: "rejected", Error: `Invalid parameter "tx".`, StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if a non generic transaction fails, same result as malformed XDR. - kp01 := keypair.MustRandom() - kp02 := keypair.MustRandom() + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) tx, err := txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - Destination: kp02.Address(), + Destination: receiverAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -97,7 +145,7 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { feeBumpTx, err := txnbuild.NewFeeBumpTransaction( txnbuild.FeeBumpTransactionParams{ Inner: tx, - FeeAccount: kp02.Address(), + FeeAccount: receiverAccKP.Address(), BaseFee: 2 * txnbuild.MinBaseFee, }, ) @@ -107,17 +155,19 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: feeBumpTxEnc, } - rejectedResponse = handler.txApprove(ctx, req) + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) assert.Equal(t, &wantRejectedResponse, rejectedResponse) // wantRejectedResponse is identical to "if can't parse XDR". - - // Test if the transaction sourceAccount the same as the server issuer account + // Test if the transaction sourceAccount the same as the server issuer account. + issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) + require.NoError(t, err) tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: issuerAccKeyPair.Address()}, + SourceAccount: &issuerAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - Destination: kp01.Address(), + Destination: senderAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -128,26 +178,27 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { ) require.NoError(t, err) txEnc, err := tx.Base64() + require.NoError(t, err) req = txApproveRequest{ Tx: txEnc, } - rejectedResponse = handler.txApprove(ctx, req) + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ Status: "rejected", Error: "The source account is invalid.", StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - - // Test if the transaction's operation sourceAccount the same as the server issuer account + // Test if the transaction's operation sourceAccount the same as the server issuer account. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ SourceAccount: issuerAccKeyPair.Address(), - Destination: kp01.Address(), + Destination: senderAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -158,26 +209,26 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + require.NoError(t, err) req = txApproveRequest{ Tx: txEnc, } - rejectedResponse = handler.txApprove(ctx, req) + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ Status: "rejected", Error: "There is one or more unauthorized operations in the provided transaction.", StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - - // Test if operation is not a payment (in this case allowing trust for a random account) - kp03 := keypair.MustRandom() + // Test if operation is not a payment (in this case allowing trust for receiverAccKP). tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.AllowTrust{ - Trustor: kp03.Address(), + Trustor: receiverAccKP.Address(), Type: assetGOAT, Authorize: true, }, @@ -191,26 +242,32 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } - rejectedResponse = handler.txApprove(ctx, req) + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ Status: "rejected", Error: "There is one or more unauthorized operations in the provided transaction.", StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - - // Test "not implemented" + // Test if multiple operations in transaction. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - SourceAccount: kp01.Address(), - Destination: kp02.Address(), + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), Amount: "1", Asset: assetGOAT, }, + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "2", + Asset: assetGOAT, + }, }, BaseFee: txnbuild.MinBaseFee, Timebounds: txnbuild.NewInfiniteTimeout(), @@ -218,13 +275,50 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + require.NoError(t, err) req = txApproveRequest{ Tx: txEnc, } - rejectedResponse = handler.txApprove(ctx, req) + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ Status: "rejected", - Error: "Not implemented.", + Error: "Please submit a transaction with exactly one operation of type payment.", + StatusCode: http.StatusBadRequest, + } + assert.Equal(t, &wantRejectedResponse, rejectedResponse) + // Test if transaction source account seq num is equal to account sequence+1. + // This tests the scenario where sequence numbers are too far in the future. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "50", + }, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + req = txApproveRequest{ + Tx: txEnc, + } + rejectedResponse, err = handler.txApprove(ctx, req) + require.NoError(t, err) + wantRejectedResponse = txApprovalResponse{ + Status: "rejected", + Error: "Invalid transaction sequence number.", StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) @@ -237,67 +331,85 @@ func TestAPI_RejectedIntegration(t *testing.T) { Code: "GOAT", Issuer: issuerAccKeyPair.Address(), } + horizonMock := horizonclient.MockClient{} + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + AccountID: issuerAccKeyPair.Address(), + Sequence: "1", + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "1", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "2", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "3", + }, nil) handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, } - // Test if no transaction is submitted. + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) req := `{ "tx": "" - }` - r := httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + }` + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w := httptest.NewRecorder() - m := chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp := w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody := `{ "status":"rejected", "error":"Missing parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - // Test if can't parse XDR. req = `{ "tx": "BADXDRTRANSACTIONENVELOPE" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ "status":"rejected", "error":"Invalid parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - // Test if a non generic transaction fails, same result as malformed XDR. - kp01 := keypair.MustRandom() - kp02 := keypair.MustRandom() + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) tx, err := txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - Destination: kp02.Address(), + Destination: receiverAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -310,7 +422,7 @@ func TestAPI_RejectedIntegration(t *testing.T) { feeBumpTx, err := txnbuild.NewFeeBumpTransaction( txnbuild.FeeBumpTransactionParams{ Inner: tx, - FeeAccount: kp02.Address(), + FeeAccount: receiverAccKP.Address(), BaseFee: 2 * txnbuild.MinBaseFee, }, ) @@ -320,33 +432,29 @@ func TestAPI_RejectedIntegration(t *testing.T) { req = `{ "tx": "` + feeBumpTxEnc + `" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ "status":"rejected", "error":"Invalid parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - - // Test if the transaction sourceAccount the same as the server issuer account + // Test if the transaction sourceAccount the same as the server issuer account. + issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) + require.NoError(t, err) tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: issuerAccKeyPair.Address()}, + SourceAccount: &issuerAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - Destination: kp01.Address(), + Destination: senderAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -357,37 +465,32 @@ func TestAPI_RejectedIntegration(t *testing.T) { ) require.NoError(t, err) txEnc, err := tx.Base64() + require.NoError(t, err) req = `{ "tx": "` + txEnc + `" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ "status":"rejected", "error":"The source account is invalid." }` require.JSONEq(t, wantBody, string(body)) - - // Test if the transaction's operation sourceAccount the same as the server issuer account + // Test if the transaction's operation sourceAccount the same as the server issuer account. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ SourceAccount: issuerAccKeyPair.Address(), - Destination: kp01.Address(), + Destination: senderAccKP.Address(), Amount: "1", Asset: assetGOAT, }, @@ -398,37 +501,31 @@ func TestAPI_RejectedIntegration(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + require.NoError(t, err) req = `{ "tx": "` + txEnc + `" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." }` require.JSONEq(t, wantBody, string(body)) - // Test if the transaction's operation is not a payment. - kp03 := keypair.MustRandom() tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.AllowTrust{ - Trustor: kp03.Address(), + Trustor: receiverAccKP.Address(), Type: assetGOAT, Authorize: true, }, @@ -439,40 +536,41 @@ func TestAPI_RejectedIntegration(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + require.NoError(t, err) req = `{ "tx": "` + txEnc + `" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." }` require.JSONEq(t, wantBody, string(body)) - - // Test "not implemented" + // Test if more than one operation in transaction. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ - SourceAccount: &txnbuild.SimpleAccount{AccountID: kp01.Address()}, + SourceAccount: &senderAcc, IncrementSequenceNum: true, Operations: []txnbuild.Operation{ &txnbuild.Payment{ - SourceAccount: kp01.Address(), - Destination: kp02.Address(), + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), Amount: "1", Asset: assetGOAT, }, + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "2", + Asset: assetGOAT, + }, }, BaseFee: txnbuild.MinBaseFee, Timebounds: txnbuild.NewInfiniteTimeout(), @@ -480,25 +578,183 @@ func TestAPI_RejectedIntegration(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + require.NoError(t, err) req = `{ "tx": "` + txEnc + `" }` - r = httptest.NewRequest("POST", "/tx_approve", strings.NewReader(req)) + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + wantBody = `{ + "status":"rejected", "error":"Please submit a transaction with exactly one operation of type payment." + }` + require.JSONEq(t, wantBody, string(body)) + // Test when transaction source account seq num is not equal to account sequence+1. + // This tests the scenario where sequence numbers are too far in the future. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "50", + }, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) r = r.WithContext(ctx) - w = httptest.NewRecorder() - m = chi.NewMux() - m.Post("/tx_approve", handler.ServeHTTP) m.ServeHTTP(w, r) resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) wantBody = `{ - "status":"rejected", "error":"Not implemented." + "status":"rejected", "error":"Invalid transaction sequence number." }` require.JSONEq(t, wantBody, string(body)) } + +func TestAPI_RevisedIntegration(t *testing.T) { + ctx := context.Background() + issuerAccKeyPair := keypair.MustRandom() + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + horizonMock := horizonclient.MockClient{} + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "0", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "5", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "0", + }, nil) + handler := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + } + // Test Successful request. + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) + tx, err := txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err := tx.Base64() + require.NoError(t, err) + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) + req := `{ + "tx": "` + txEnc + `" + }` + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + var txApprovePOSTResponse txApprovalResponse + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("revised"), + Tx: txApprovePOSTResponse.Tx, + Message: `Authorization and deauthorization operations were added.`, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + // Decode the request's transaction. + parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) + require.NoError(t, err) + tx, ok := parsed.Transaction() + require.True(t, ok) + // Check if revised transaction only has 5 operations. + require.Len(t, tx.Operations(), 5) + // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. + op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op1.Trustor, senderAccKP.Address()) + assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op1.Authorize) + // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. + op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op2.Trustor, receiverAccKP.Address()) + assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op2.Authorize) + // Check Operation 3: Payment from A to B. + op3, ok := tx.Operations()[2].(*txnbuild.Payment) + require.True(t, ok) + assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) + assert.Equal(t, op3.Destination, receiverAccKP.Address()) + assert.Equal(t, op3.Asset, assetGOAT) + // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. + op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op4.Trustor, receiverAccKP.Address()) + assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op4.Authorize) + // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. + op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op5.Trustor, senderAccKP.Address()) + assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op5.Authorize) +} From e0ee6de0cc586f5deb6b1d65716cdb6e85bf09d1 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Wed, 12 May 2021 10:30:50 -0700 Subject: [PATCH 38/67] all: remove codecov bash script (#3583) --- .circleci/config.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 33b2128a9d..f8eb48a9bd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -218,13 +218,6 @@ commands: name: Build release artifacts command: go run ./support/scripts/build_release_artifacts/main.go - # send_coverage_report sends coverage report to codecov.io - send_coverage_report: - steps: - - run: - name: Send report to codecov.io - command: bash <(curl -s https://codecov.io/bash) - #-----------------------------------------------------------------------------# # Jobs use the commands to accomplish a given task, and run through workflows # #-----------------------------------------------------------------------------# @@ -284,7 +277,6 @@ jobs: steps: - install_go_deps - test_packages - - send_coverage_report # test_code_1_16 performs all package tests using Go 1.16. test_code_1_16: @@ -326,7 +318,6 @@ jobs: steps: - install_go_deps - test_packages - - send_coverage_report # publish_artifacts builds and uploads artifacts to any tagged commit. # # NOTE: this commands relies on an env var called GITHUB_TOKEN which is a From 5029e28d1ec6272a44f5c03ad732059b2fead31d Mon Sep 17 00:00:00 2001 From: George Date: Thu, 13 May 2021 11:00:42 -0700 Subject: [PATCH 39/67] services/horizon: Update v2.3.0 changelog to reflect all PRs since 2.2.0 (#3589) --- services/horizon/CHANGELOG.md | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 724d3e7707..806be48321 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -5,8 +5,22 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased -* Improve parsing logic for captive core toml configuration ([3558](https://github.com/stellar/go/pull/3558)). -* Refactor `ingest/ledgerbackend/LedgerBackend.GetLedger` method to always block, removing `ingest/ledgerbackend/LedgerBackend.GetLedgerBlocking`. Adds a first `context.Context` param to most `LedgerBackend` methods. + +## v2.3.0 + +**Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.** + +### New features +* Introduces a flag (`--ro-database-url` / `RO_DATABASE_URL`) which allows setting a connection to a read-replica database. This flag makes Horizon take into account data propagation lag to the replica instance, adding retries if the data is out of sync ([3574](https://github.com/stellar/go/pull/3574)). + + +### Code changes +* Improved test suite coverage and stability ([3560](https://github.com/stellar/go/pull/3560), [3562](https://github.com/stellar/go/pull/3562), [3551](https://github.com/stellar/go/pull/3551), and [3547](https://github.com/stellar/go/pull/3547)). + +* Improved session handling and timeouts ([3576](https://github.com/stellar/go/pull/3576), [3545](https://github.com/stellar/go/pull/3545), and [3567](https://github.com/stellar/go/pull/3567)). + +* Improved stability of Captive Core's configuration options. Specifically, it will now prefer either the command-line parameter (e.g. `--captive-core-peer-port` or its env-var equivalent) or the user-supplied append file (`--captive-core-append-path`) over Horizon's internal defaults. However, if a value is set in *both* the append file and at the command-line, an error will be thrown unless both values are equal ([3558](https://github.com/stellar/go/pull/3558)). + ## v2.2.0 @@ -30,7 +44,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ### Breaking changes * Add a flag `--captive-core-storage-path/CAPTIVE_CORE_STORAGE_PATH` that allows users to control the storage location for Captive Core bucket data ([3479](https://github.com/stellar/go/pull/3479)). - Previously, Horizon created a directory in `/tmp` to store Captive Core bucket data. Now, if the captive core storage path flag is not set, Horizon will default to using the current working directory. + - Previously, Horizon created a directory in `/tmp` to store Captive Core bucket data. Now, if the captive core storage path flag is not set, Horizon will default to using the current working directory. * Add a flag `--captive-core-log-path`/`CAPTIVE_CORE_LOG_PATH` that allows users to control the location of the logs emitted by Captive Core ([3472](https://github.com/stellar/go/pull/3472)). If you have a `LOG_FILE_PATH` entry in your Captive Core toml file remove that entry and use the horizon flag instead. * `--stellar-core-db-url` / `STELLAR_CORE_DATABASE_URL` should only be configured if Horizon ingestion is enabled otherwise Horizon will not start ([3477](https://github.com/stellar/go/pull/3477)). From 1dffd616d62cf3f79afa8f3742f46209f7a36862 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Fri, 14 May 2021 17:26:47 +0100 Subject: [PATCH 40/67] services/horizon: Revert "Use Core 17 for CI (and disable cap35-specific job) (#3585)" (#3600) * Revert "Use Core 17 for CI (and disable cap35-specific job) (#3585)" This reverts commit 72c01edaa63e8c903e5e99666545e5fd8d59ae2b. * Try forcing integration tests to stellar 15 * Force core version to 15.3 --- .circleci/config.yml | 33 +++++++++++++++++-- services/horizon/docker/Dockerfile.dev | 2 +- services/horizon/docker/core-start.sh | 3 +- .../docker-compose.integration-tests.yml | 2 +- .../internal/integration/protocol16_test.go | 14 ++++++-- 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f8eb48a9bd..659072bb79 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -147,7 +147,9 @@ commands: parameters: core-version: type: string - default: "" # latest version by default + # version which works with captive-core by default + # TODO: Set this to latest once core is fixed + default: "15.3.0-498.7a7f18c.xenial~SetTrustlineFlagsPR~buildtests" steps: - run: name: Install Stellar Core <<#parameters.core-version>> (version <>)<> @@ -421,6 +423,10 @@ jobs: enable-captive-core: type: boolean default: false + # TODO: remove once a stellar core version with cap-35 is released + enable-cap-35-tests: + type: boolean + default: false working_directory: ~/go/src/github.com/stellar/go machine: image: ubuntu-1604:202010-01 @@ -439,12 +445,28 @@ jobs: - when: condition: <> steps: - - install_stellar_core + - unless: + condition: <> + steps: + # Install the default version of stellar core + - install_stellar_core + - when: + condition: <> + steps: + # Install a Stellar Core version with CAP35 support + - install_stellar_core: + core-version: 15.3.0-498.7a7f18c.xenial~SetTrustlineFlagsPR~buildtests - run: name: Setting Captive Core env variables command: echo "export HORIZON_INTEGRATION_ENABLE_CAPTIVE_CORE=true" >> $BASH_ENV + - when: + condition: <> + steps: + - run: + name: Setting CAP35 env variables + command: echo "export HORIZON_INTEGRATION_ENABLE_CAP_35=true" >> $BASH_ENV - run: - name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> + name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> <<#parameters.enable-cap-35-tests>>(With CAP35)<> # Currently all integration tests are in a single directory. # Pulling the image helps with test running time command: | @@ -472,6 +494,11 @@ workflows: - test_horizon_integration: name: test_horizon_integration_with_captive_core enable-captive-core: true + # ... and cap35 with captive core + - test_horizon_integration: + name: test_horizon_integration_cap35_with_captive_core + enable-captive-core: true + enable-cap-35-tests: true - test_verify_range_docker_image - publish_state_diff_docker_image: filters: diff --git a/services/horizon/docker/Dockerfile.dev b/services/horizon/docker/Dockerfile.dev index bec6cd2625..3e531c820f 100644 --- a/services/horizon/docker/Dockerfile.dev +++ b/services/horizon/docker/Dockerfile.dev @@ -9,7 +9,7 @@ RUN go install github.com/stellar/go/exp/services/captivecore FROM ubuntu:20.04 -ENV STELLAR_CORE_VERSION 17.0.0-557.096f6a7.focal +ENV STELLAR_CORE_VERSION 15.0.0-40 ENV STELLAR_CORE_BINARY_PATH /usr/bin/stellar-core ENV DEBIAN_FRONTEND=noninteractive diff --git a/services/horizon/docker/core-start.sh b/services/horizon/docker/core-start.sh index aea5db249f..89e90fba91 100755 --- a/services/horizon/docker/core-start.sh +++ b/services/horizon/docker/core-start.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash set -e -set -x source /etc/profile @@ -24,4 +23,4 @@ if [ "$1" = "standalone" ]; then popd fi -exec stellar-core run +exec /init -- stellar-core run \ No newline at end of file diff --git a/services/horizon/docker/docker-compose.integration-tests.yml b/services/horizon/docker/docker-compose.integration-tests.yml index 0618bc90b4..66d8744759 100644 --- a/services/horizon/docker/docker-compose.integration-tests.yml +++ b/services/horizon/docker/docker-compose.integration-tests.yml @@ -10,7 +10,7 @@ services: - "5641:5641" command: ["-p", "5641"] core: - image: ${CORE_IMAGE:-stellar/stellar-core:v17.0.0} + image: ${CORE_IMAGE:-stellar/stellar-core:15.3.0-1506-ff56e7f2} depends_on: - core-postgres restart: on-failure diff --git a/services/horizon/internal/integration/protocol16_test.go b/services/horizon/internal/integration/protocol16_test.go index 7ca62a24b0..22d29dfc0f 100644 --- a/services/horizon/internal/integration/protocol16_test.go +++ b/services/horizon/internal/integration/protocol16_test.go @@ -1,6 +1,7 @@ package integration import ( + "os" "testing" "github.com/stretchr/testify/assert" @@ -17,7 +18,14 @@ import ( ) func NewProtocol16Test(t *testing.T) *integration.Test { - config := integration.Config{ProtocolVersion: 17} + // TODO, this should be removed once a core version with CAP 35 is released + if os.Getenv("HORIZON_INTEGRATION_ENABLE_CAP_35") != "true" { + t.Skip("skipping CAP35 test, set HORIZON_INTEGRATION_ENABLE_CAP_35=true if you want to run it") + } + config := integration.Config{ + ProtocolVersion: 16, + CoreDockerImage: "2opremio/stellar-core:cap35", + } return integration.NewTest(t, config) } @@ -29,8 +37,8 @@ func TestProtocol16Basics(t *testing.T) { t.Run("Sanity", func(t *testing.T) { root, err := itest.Client().Root() tt.NoError(err) - tt.LessOrEqual(int32(17), root.CoreSupportedProtocolVersion) - tt.Equal(int32(17), root.CurrentProtocolVersion) + tt.LessOrEqual(int32(16), root.CoreSupportedProtocolVersion) + tt.Equal(int32(16), root.CurrentProtocolVersion) // Submit a simple tx op := txnbuild.Payment{ From 21155fc6255ab016545e44e0a2899f03af98ec6d Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 17 May 2021 12:50:11 +0100 Subject: [PATCH 41/67] services/horizon: Add prometheus metrics to database queries (#3597) * Add missing stats from DBStats * How about we actually use our fancy-pants db.SessionInterface interface? * Add db.RegisterMetrics to track db metrics * add route label to db metrics where available * use a summaryvec for db durations * Better query_type detection for db metrics * Update changelog * Review feedback --- ingest/ledgerbackend/database_backend.go | 2 +- ingest/ledgerbackend/ledger_hash_store.go | 4 +- services/horizon/CHANGELOG.md | 1 + .../horizon/internal/actions/account_test.go | 14 +- .../horizon/internal/actions/asset_test.go | 4 +- .../actions/claimable_balance_test.go | 48 +- .../horizon/internal/actions/helpers_test.go | 2 +- .../horizon/internal/actions/offer_test.go | 36 +- .../internal/actions/operation_test.go | 50 +-- .../internal/actions/orderbook_test.go | 2 +- .../internal/actions/transaction_test.go | 20 +- .../internal/actions_operation_test.go | 2 +- .../horizon/internal/actions_payment_test.go | 2 +- .../horizon/internal/actions_trade_test.go | 2 +- services/horizon/internal/app.go | 27 +- services/horizon/internal/context/context.go | 2 +- .../internal/db2/assets/asset_stat_test.go | 2 +- .../horizon/internal/db2/history/accounts.go | 3 +- services/horizon/internal/db2/history/main.go | 2 +- .../internal/db2/history/trust_lines.go | 5 +- services/horizon/internal/httpx/middleware.go | 45 +- services/horizon/internal/httpx/router.go | 86 ++-- services/horizon/internal/ingest/main.go | 4 +- services/horizon/internal/init.go | 64 +-- services/horizon/internal/middleware_test.go | 13 +- services/horizon/internal/reap/main.go | 2 +- .../horizon/internal/txsub/results_test.go | 6 +- support/db/main.go | 11 +- support/db/metrics.go | 414 ++++++++++++++++++ support/db/mock_session.go | 29 +- support/db/session.go | 2 +- 31 files changed, 654 insertions(+), 252 deletions(-) create mode 100644 support/db/metrics.go diff --git a/ingest/ledgerbackend/database_backend.go b/ingest/ledgerbackend/database_backend.go index 8586a072c2..189cfcaf75 100644 --- a/ingest/ledgerbackend/database_backend.go +++ b/ingest/ledgerbackend/database_backend.go @@ -40,7 +40,7 @@ func NewDatabaseBackend(dataSourceName, networkPassphrase string) (*DatabaseBack return NewDatabaseBackendFromSession(session, networkPassphrase) } -func NewDatabaseBackendFromSession(session *db.Session, networkPassphrase string) (*DatabaseBackend, error) { +func NewDatabaseBackendFromSession(session db.SessionInterface, networkPassphrase string) (*DatabaseBackend, error) { return &DatabaseBackend{ session: session, networkPassphrase: networkPassphrase, diff --git a/ingest/ledgerbackend/ledger_hash_store.go b/ingest/ledgerbackend/ledger_hash_store.go index d0eeefa5a9..be9ebf1bfc 100644 --- a/ingest/ledgerbackend/ledger_hash_store.go +++ b/ingest/ledgerbackend/ledger_hash_store.go @@ -20,11 +20,11 @@ type TrustedLedgerHashStore interface { // HorizonDBLedgerHashStore is a TrustedLedgerHashStore which uses horizon's db to look up ledger hashes type HorizonDBLedgerHashStore struct { - session *db.Session + session db.SessionInterface } // NewHorizonDBLedgerHashStore constructs a new TrustedLedgerHashStore backed by the horizon db -func NewHorizonDBLedgerHashStore(session *db.Session) TrustedLedgerHashStore { +func NewHorizonDBLedgerHashStore(session db.SessionInterface) TrustedLedgerHashStore { return HorizonDBLedgerHashStore{session: session} } diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 25326cdd5e..df0acb1350 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -6,6 +6,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased * Refactor `ingest/ledgerbackend/LedgerBackend.GetLedger` method to always block, removing `ingest/ledgerbackend/LedgerBackend.GetLedgerBlocking`. Adds a first `context.Context` param to most `LedgerBackend` methods. +* Add more in-depth Prometheus metrics (count & duration) for db queries. ## v2.2.0 diff --git a/services/horizon/internal/actions/account_test.go b/services/horizon/internal/actions/account_test.go index 7695394a72..404160b07b 100644 --- a/services/horizon/internal/actions/account_test.go +++ b/services/horizon/internal/actions/account_test.go @@ -339,7 +339,7 @@ func TestGetAccountsHandlerPageNoResults(t *testing.T) { "signer": signer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -375,7 +375,7 @@ func TestGetAccountsHandlerPageResultsBySigner(t *testing.T) { "signer": signer, }, map[string]string{}, - q.Session, + q, ), ) @@ -405,7 +405,7 @@ func TestGetAccountsHandlerPageResultsBySigner(t *testing.T) { "cursor": accountOne, }, map[string]string{}, - q.Session, + q, ), ) @@ -455,7 +455,7 @@ func TestGetAccountsHandlerPageResultsBySponsor(t *testing.T) { "sponsor": sponsor.Address(), }, map[string]string{}, - q.Session, + q, ), ) @@ -511,7 +511,7 @@ func TestGetAccountsHandlerPageResultsByAsset(t *testing.T) { t, params, map[string]string{}, - q.Session, + q, ), ) @@ -529,7 +529,7 @@ func TestGetAccountsHandlerPageResultsByAsset(t *testing.T) { t, params, map[string]string{}, - q.Session, + q, ), ) @@ -613,7 +613,7 @@ func TestGetAccountsHandlerInvalidParams(t *testing.T) { t, tc.params, map[string]string{}, - q.Session, + q, ), ) tt.Assert.Error(err) diff --git a/services/horizon/internal/actions/asset_test.go b/services/horizon/internal/actions/asset_test.go index 12969da2b5..e0233fedc7 100644 --- a/services/horizon/internal/actions/asset_test.go +++ b/services/horizon/internal/actions/asset_test.go @@ -407,7 +407,7 @@ func TestAssetStats(t *testing.T) { }, } { t.Run(testCase.name, func(t *testing.T) { - r := makeRequest(t, testCase.queryParams, map[string]string{}, q.Session) + r := makeRequest(t, testCase.queryParams, map[string]string{}, q) results, err := handler.GetResourcePage(httptest.NewRecorder(), r) assert.NoError(t, err) @@ -450,7 +450,7 @@ func TestAssetStatsIssuerDoesNotExist(t *testing.T) { tt.Assert.NoError(err) tt.Assert.Equal(numChanged, int64(1)) - r := makeRequest(t, map[string]string{}, map[string]string{}, q.Session) + r := makeRequest(t, map[string]string{}, map[string]string{}, q) results, err := handler.GetResourcePage(httptest.NewRecorder(), r) tt.Assert.NoError(err) diff --git a/services/horizon/internal/actions/claimable_balance_test.go b/services/horizon/internal/actions/claimable_balance_test.go index 5cc3ea466b..540aa0fa4e 100644 --- a/services/horizon/internal/actions/claimable_balance_test.go +++ b/services/horizon/internal/actions/claimable_balance_test.go @@ -67,7 +67,7 @@ func TestGetClaimableBalanceByID(t *testing.T) { t, map[string]string{}, map[string]string{"id": id}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -85,7 +85,7 @@ func TestGetClaimableBalanceByID(t *testing.T) { t, map[string]string{}, map[string]string{"id": id}, - q.Session, + q, )) tt.Assert.Error(err) tt.Assert.True(q.NoRows(errors.Cause(err))) @@ -95,7 +95,7 @@ func TestGetClaimableBalanceByID(t *testing.T) { t, map[string]string{}, map[string]string{"id": "0000001112122"}, - q.Session, + q, )) tt.Assert.Error(err) p := err.(*problem.P) @@ -108,7 +108,7 @@ func TestGetClaimableBalanceByID(t *testing.T) { t, map[string]string{}, map[string]string{"id": ""}, - q.Session, + q, )) tt.Assert.Error(err) p = err.(*problem.P) @@ -212,7 +212,7 @@ func TestGetClaimableBalances(t *testing.T) { t, map[string]string{}, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) tt.Assert.Len(response, 4) @@ -230,7 +230,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": response[3].(protocol.ClaimableBalance).PagingToken(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) tt.Assert.Len(response, 0) @@ -240,7 +240,7 @@ func TestGetClaimableBalances(t *testing.T) { t, map[string]string{"limit": "2"}, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) tt.Assert.Len(response, 2) @@ -259,7 +259,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": response[1].(protocol.ClaimableBalance).PagingToken(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -281,7 +281,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": lastIngestedCursor, }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -329,7 +329,7 @@ func TestGetClaimableBalances(t *testing.T) { t, map[string]string{}, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -342,7 +342,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": lastIngestedCursor, }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -361,7 +361,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": response[1].(protocol.ClaimableBalance).PagingToken(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -378,7 +378,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": response[0].(protocol.ClaimableBalance).PagingToken(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -392,7 +392,7 @@ func TestGetClaimableBalances(t *testing.T) { "order": "desc", }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -414,7 +414,7 @@ func TestGetClaimableBalances(t *testing.T) { "cursor": response[1].(protocol.ClaimableBalance).PagingToken(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -431,7 +431,7 @@ func TestGetClaimableBalances(t *testing.T) { "asset": native.StringCanonical(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -450,7 +450,7 @@ func TestGetClaimableBalances(t *testing.T) { "asset": usd.StringCanonical(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -469,7 +469,7 @@ func TestGetClaimableBalances(t *testing.T) { "asset": euro.StringCanonical(), }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -488,7 +488,7 @@ func TestGetClaimableBalances(t *testing.T) { "sponsor": "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -507,7 +507,7 @@ func TestGetClaimableBalances(t *testing.T) { "claimant": "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML", }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -519,7 +519,7 @@ func TestGetClaimableBalances(t *testing.T) { "claimant": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", }, map[string]string{}, - q.Session, + q, )) tt.Assert.NoError(err) @@ -539,7 +539,7 @@ func TestCursorAndOrderValidation(t *testing.T) { "cursor": "-1-00000043d380c38a2f2cac46ab63674064c56fdce6b977fdef1a278ad50e1a7e6a5e18", }, map[string]string{}, - q.Session, + q, )) p := err.(*problem.P) tt.Assert.Equal("bad_request", p.Type) @@ -552,7 +552,7 @@ func TestCursorAndOrderValidation(t *testing.T) { "cursor": "1003529-00000043d380c38a2f2cac46ab63674064c56fdce6b977fdef1a278ad50e1a7e6a5e18", }, map[string]string{}, - q.Session, + q, )) p = err.(*problem.P) tt.Assert.Equal("bad_request", p.Type) @@ -566,7 +566,7 @@ func TestCursorAndOrderValidation(t *testing.T) { "cursor": "1003529-00000043d380c38a2f2cac46ab63674064c56fdce6b977fdef1a278ad50e1a7e6a5e18", }, map[string]string{}, - q.Session, + q, )) p = err.(*problem.P) tt.Assert.Equal("bad_request", p.Type) diff --git a/services/horizon/internal/actions/helpers_test.go b/services/horizon/internal/actions/helpers_test.go index d64c738225..eb17e709af 100644 --- a/services/horizon/internal/actions/helpers_test.go +++ b/services/horizon/internal/actions/helpers_test.go @@ -508,7 +508,7 @@ func makeRequest( t *testing.T, queryParams map[string]string, routeParams map[string]string, - session *db.Session, + session db.SessionInterface, ) *http.Request { request, err := http.NewRequest("GET", "/", nil) if err != nil { diff --git a/services/horizon/internal/actions/offer_test.go b/services/horizon/internal/actions/offer_test.go index 11c5f63f5b..781265aaf0 100644 --- a/services/horizon/internal/actions/offer_test.go +++ b/services/horizon/internal/actions/offer_test.go @@ -105,7 +105,7 @@ func TestGetOfferByIDHandler(t *testing.T) { { "offer id is invalid", makeRequest( - t, map[string]string{}, map[string]string{"offer_id": "invalid"}, q.Session, + t, map[string]string{}, map[string]string{"offer_id": "invalid"}, q, ), func(err error) { tt.Assert.Error(err) @@ -121,7 +121,7 @@ func TestGetOfferByIDHandler(t *testing.T) { { "offer does not exist", makeRequest( - t, map[string]string{}, map[string]string{"offer_id": "1234567"}, q.Session, + t, map[string]string{}, map[string]string{"offer_id": "1234567"}, q, ), func(err error) { tt.Assert.Equal(err, sql.ErrNoRows) @@ -133,7 +133,7 @@ func TestGetOfferByIDHandler(t *testing.T) { { "offer with ledger close time", makeRequest( - t, map[string]string{}, map[string]string{"offer_id": "4"}, q.Session, + t, map[string]string{}, map[string]string{"offer_id": "4"}, q, ), func(err error) { tt.Assert.NoError(err) @@ -153,7 +153,7 @@ func TestGetOfferByIDHandler(t *testing.T) { { "offer without ledger close time", makeRequest( - t, map[string]string{}, map[string]string{"offer_id": "6"}, q.Session, + t, map[string]string{}, map[string]string{"offer_id": "6"}, q, ), func(err error) { tt.Assert.NoError(err) @@ -213,7 +213,7 @@ func TestGetOffersHandler(t *testing.T) { records, err := handler.GetResourcePage( httptest.NewRecorder(), makeRequest( - t, map[string]string{}, map[string]string{}, q.Session, + t, map[string]string{}, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -239,7 +239,7 @@ func TestGetOffersHandler(t *testing.T) { "seller": issuer.Address(), }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -258,7 +258,7 @@ func TestGetOffersHandler(t *testing.T) { "seller": "GCXEWJ6U4KPGTNTBY5HX4WQ2EEVPWV2QKXEYIQ32IDYIX", }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.Error(err) @@ -281,7 +281,7 @@ func TestGetOffersHandler(t *testing.T) { "sponsor": sponsor.Address(), }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -298,7 +298,7 @@ func TestGetOffersHandler(t *testing.T) { "sponsor": "GCXEWJ6U4KPGTNTBY5HX4WQ2EEVPWV2QKXEYIQ32IDYIX", }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.Error(err) @@ -323,7 +323,7 @@ func TestGetOffersHandler(t *testing.T) { "selling_asset_type": asset.Type, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -347,7 +347,7 @@ func TestGetOffersHandler(t *testing.T) { "selling_asset_issuer": asset.Issuer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -364,7 +364,7 @@ func TestGetOffersHandler(t *testing.T) { "selling": asset.Code + ":" + asset.Issuer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -388,7 +388,7 @@ func TestGetOffersHandler(t *testing.T) { "buying_asset_issuer": asset.Issuer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -412,7 +412,7 @@ func TestGetOffersHandler(t *testing.T) { "buying_asset_issuer": asset.Issuer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -431,7 +431,7 @@ func TestGetOffersHandler(t *testing.T) { "buying": asset.Code + ":" + asset.Issuer, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -455,7 +455,7 @@ func TestGetOffersHandler(t *testing.T) { "buying": `native\\u0026cursor=\\u0026limit=10\\u0026order=asc\\u0026selling=BTC:GAEDZ7BHMDYEMU6IJT3CTTGDUSLZWS5CQWZHGP4XUOIDG5ISH3AFAEK2`, }, map[string]string{}, - q.Session, + q, ), ) tt.Assert.Error(err) @@ -491,7 +491,7 @@ func TestGetAccountOffersHandler(t *testing.T) { t, map[string]string{}, map[string]string{"account_id": issuer.Address()}, - q.Session, + q, ), ) tt.Assert.NoError(err) @@ -509,7 +509,7 @@ func TestGetAccountOffersHandler(t *testing.T) { t, map[string]string{}, map[string]string{}, - q.Session, + q, ), ) tt.Assert.Error(err) diff --git a/services/horizon/internal/actions/operation_test.go b/services/horizon/internal/actions/operation_test.go index 7af114a964..ac18e3e877 100644 --- a/services/horizon/internal/actions/operation_test.go +++ b/services/horizon/internal/actions/operation_test.go @@ -27,7 +27,7 @@ func TestGetOperationsWithoutFilter(t *testing.T) { records, err := handler.GetResourcePage( httptest.NewRecorder(), makeRequest( - t, map[string]string{}, map[string]string{}, q.Session, + t, map[string]string{}, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -73,7 +73,7 @@ func TestGetOperationsExclusiveFilters(t *testing.T) { _, err := handler.GetResourcePage( httptest.NewRecorder(), makeRequest( - t, tc.query, map[string]string{}, q.Session, + t, tc.query, map[string]string{}, q, ), ) tt.Assert.IsType(&supportProblem.P{}, err) @@ -121,7 +121,7 @@ func TestGetOperationsFilterByAccountID(t *testing.T) { makeRequest( t, map[string]string{ "account_id": tc.accountID, - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -179,7 +179,7 @@ func TestGetOperationsFilterByTxID(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": tc.transactionID, - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) @@ -217,7 +217,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { makeRequest( t, map[string]string{ "limit": "200", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -243,7 +243,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { t, map[string]string{ "include_failed": "true", "limit": "200", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -268,7 +268,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": "aa168f12124b7c196c0adaee7c73a64d37f99428cacb59a91ff389626845e7cf", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -283,7 +283,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -305,7 +305,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": "56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -320,7 +320,7 @@ func TestGetOperationsIncludeFailed(t *testing.T) { makeRequest( t, map[string]string{ "include_failed": "foo", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.Error(err) @@ -381,7 +381,7 @@ func TestGetOperationsFilterByLedgerID(t *testing.T) { makeRequest( t, map[string]string{ "ledger_id": tc.ledgerID, - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) if tc.expectedErr == "" { @@ -418,7 +418,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { records, err := handler.GetResourcePage( httptest.NewRecorder(), makeRequest( - t, map[string]string{}, map[string]string{}, q.Session, + t, map[string]string{}, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -429,7 +429,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { makeRequest( t, map[string]string{ "ledger_id": "1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -440,7 +440,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { makeRequest( t, map[string]string{ "ledger_id": "3", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -451,7 +451,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { makeRequest( t, map[string]string{ "account_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -464,7 +464,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": "b52f16ffb98c047e33b9c2ec30880330cde71f85b3443dae2c5cb86c7d4d8452", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -475,7 +475,7 @@ func TestGetOperationsOnlyPayments(t *testing.T) { makeRequest( t, map[string]string{ "tx_id": "1d2a4be72470658f68db50eef29ea0af3f985ce18b5c218f03461d40c47dc292", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -498,7 +498,7 @@ func TestOperation_CreatedAt(t *testing.T) { makeRequest( t, map[string]string{ "ledger_id": "3", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -526,7 +526,7 @@ func TestGetOperationsPagination(t *testing.T) { t, map[string]string{ "order": "asc", "limit": "1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -538,7 +538,7 @@ func TestGetOperationsPagination(t *testing.T) { t, map[string]string{ "limit": "1", "order": "desc", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -550,7 +550,7 @@ func TestGetOperationsPagination(t *testing.T) { t, map[string]string{ "order": "desc", "cursor": "12884905985", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -562,7 +562,7 @@ func TestGetOperationsPagination(t *testing.T) { t, map[string]string{ "order": "desc", "cursor": "0", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.Error(err) @@ -582,7 +582,7 @@ func TestGetOperations_IncludeTransactions(t *testing.T) { makeRequest( t, map[string]string{ "join": "accounts", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.Error(err) @@ -601,7 +601,7 @@ func TestGetOperations_IncludeTransactions(t *testing.T) { t, map[string]string{ "join": "transactions", "limit": "1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -615,7 +615,7 @@ func TestGetOperations_IncludeTransactions(t *testing.T) { makeRequest( t, map[string]string{ "limit": "1", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) diff --git a/services/horizon/internal/actions/orderbook_test.go b/services/horizon/internal/actions/orderbook_test.go index 0b1d4de0c0..6413360778 100644 --- a/services/horizon/internal/actions/orderbook_test.go +++ b/services/horizon/internal/actions/orderbook_test.go @@ -659,7 +659,7 @@ func TestOrderbookGetResource(t *testing.T) { "limit": strconv.Itoa(testCase.limit), }, map[string]string{}, - q.Session, + q, ) w := httptest.NewRecorder() response, err := handler.GetResource(w, r) diff --git a/services/horizon/internal/actions/transaction_test.go b/services/horizon/internal/actions/transaction_test.go index 1588776aa5..e029edef3a 100644 --- a/services/horizon/internal/actions/transaction_test.go +++ b/services/horizon/internal/actions/transaction_test.go @@ -25,7 +25,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "account_id": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -37,7 +37,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "account_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -49,7 +49,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "account_id": "GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -62,7 +62,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "ledger_id": "1", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -74,7 +74,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "ledger_id": "2", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -86,7 +86,7 @@ func TestGetTransactionsHandler(t *testing.T) { t, map[string]string{ "ledger_id": "3", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -99,7 +99,7 @@ func TestGetTransactionsHandler(t *testing.T) { "account_id": "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", "ledger_id": "3", "include_failed": "true", - }, map[string]string{}, q.Session, + }, map[string]string{}, q, ), ) tt.Assert.IsType(&supportProblem.P{}, err) @@ -159,7 +159,7 @@ func TestFeeBumpTransactionPage(t *testing.T) { records, err := handler.GetResourcePage( httptest.NewRecorder(), makeRequest( - t, map[string]string{}, map[string]string{}, q.Session, + t, map[string]string{}, map[string]string{}, q, ), ) tt.Assert.NoError(err) @@ -185,7 +185,7 @@ func TestFeeBumpTransactionResource(t *testing.T) { makeRequest( t, map[string]string{}, map[string]string{ "tx_id": fixture.OuterHash, - }, q.Session, + }, q, ), ) tt.Assert.NoError(err) @@ -197,7 +197,7 @@ func TestFeeBumpTransactionResource(t *testing.T) { makeRequest( t, map[string]string{}, map[string]string{ "tx_id": fixture.InnerHash, - }, q.Session, + }, q, ), ) tt.Assert.NoError(err) diff --git a/services/horizon/internal/actions_operation_test.go b/services/horizon/internal/actions_operation_test.go index f1ab63901a..bce94f4722 100644 --- a/services/horizon/internal/actions_operation_test.go +++ b/services/horizon/internal/actions_operation_test.go @@ -279,7 +279,7 @@ func TestOperation_CreatedAt(t *testing.T) { ht.UnmarshalPage(w.Body, &records) l := history.Ledger{} - hq := history.Q{Session: ht.HorizonSession()} + hq := history.Q{SessionInterface: ht.HorizonSession()} ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 3)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) diff --git a/services/horizon/internal/actions_payment_test.go b/services/horizon/internal/actions_payment_test.go index 839e8efe9e..446fc02d67 100644 --- a/services/horizon/internal/actions_payment_test.go +++ b/services/horizon/internal/actions_payment_test.go @@ -240,7 +240,7 @@ func TestPayment_CreatedAt(t *testing.T) { ht.UnmarshalPage(w.Body, &records) l := history.Ledger{} - hq := history.Q{Session: ht.HorizonSession()} + hq := history.Q{SessionInterface: ht.HorizonSession()} ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 3)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) diff --git a/services/horizon/internal/actions_trade_test.go b/services/horizon/internal/actions_trade_test.go index 03978d44c5..91cd4b087e 100644 --- a/services/horizon/internal/actions_trade_test.go +++ b/services/horizon/internal/actions_trade_test.go @@ -35,7 +35,7 @@ func TestTradeActions_Index(t *testing.T) { // ensure created_at is populated correctly l := history.Ledger{} - hq := history.Q{Session: ht.HorizonSession()} + hq := history.Q{SessionInterface: ht.HorizonSession()} ht.Require.NoError(hq.LedgerBySequence(ht.Ctx, &l, 9)) ht.Assert.WithinDuration(l.ClosedAt, records[0].LedgerCloseTime, 1*time.Second) diff --git a/services/horizon/internal/app.go b/services/horizon/internal/app.go index 8b9109a22d..b333d1d6e5 100644 --- a/services/horizon/internal/app.go +++ b/services/horizon/internal/app.go @@ -75,11 +75,6 @@ type App struct { historyLatestLedgerCounter prometheus.CounterFunc historyLatestLedgerClosedAgoGauge prometheus.GaugeFunc historyElderLedgerCounter prometheus.CounterFunc - dbMaxOpenConnectionsGauge prometheus.GaugeFunc - dbOpenConnectionsGauge prometheus.GaugeFunc - dbInUseConnectionsGauge prometheus.GaugeFunc - dbWaitCountCounter prometheus.CounterFunc - dbWaitDurationCounter prometheus.CounterFunc coreLatestLedgerCounter prometheus.CounterFunc coreSynced prometheus.GaugeFunc } @@ -182,7 +177,7 @@ func (a *App) waitForDone() { // sure all requests are first properly finished to avoid "sql: database is // closed" errors. func (a *App) CloseDB() { - a.historyQ.Session.DB.Close() + a.historyQ.SessionInterface.Close() } // HistoryQ returns a helper object for performing sql queries against the @@ -198,8 +193,8 @@ func (a *App) Ingestion() ingest.System { // HorizonSession returns a new session that loads data from the horizon // database. -func (a *App) HorizonSession() *db.Session { - return &db.Session{DB: a.historyQ.Session.DB} +func (a *App) HorizonSession() db.SessionInterface { + return a.historyQ.SessionInterface.Clone() } // UpdateLedgerState triggers a refresh of several metrics gauges, such as open @@ -441,6 +436,12 @@ func (a *App) init() error { // loggly initLogglyLog(a) + // metrics and log.metrics + a.prometheusRegistry = prometheus.NewRegistry() + for _, meter := range *logmetrics.DefaultMetrics { + a.prometheusRegistry.MustRegister(meter) + } + // stellarCoreInfo a.UpdateStellarCoreInfo(a.ctx) @@ -459,12 +460,6 @@ func (a *App) init() error { // reaper a.reaper = reap.New(a.config.HistoryRetentionCount, a.HorizonSession(), a.ledgerState) - // metrics and log.metrics - a.prometheusRegistry = prometheus.NewRegistry() - for _, meter := range *logmetrics.DefaultMetrics { - a.prometheusRegistry.MustRegister(meter) - } - // go metrics initGoMetrics(a) @@ -481,7 +476,7 @@ func (a *App) init() error { initTxSubMetrics(a) routerConfig := httpx.RouterConfig{ - DBSession: a.historyQ.Session, + DBSession: a.historyQ.SessionInterface, TxSubmitter: a.submitter, RateQuota: a.config.RateQuota, BehindCloudflare: a.config.BehindCloudflare, @@ -497,7 +492,7 @@ func (a *App) init() error { HorizonVersion: a.horizonVersion, FriendbotURL: a.config.FriendbotURL, HealthCheck: healthCheck{ - session: a.historyQ.Session, + session: a.historyQ.SessionInterface, ctx: a.ctx, core: &stellarcore.Client{ HTTP: &http.Client{Timeout: infoRequestTimeout}, diff --git a/services/horizon/internal/context/context.go b/services/horizon/internal/context/context.go index 35ed2d7254..eefac63a76 100644 --- a/services/horizon/internal/context/context.go +++ b/services/horizon/internal/context/context.go @@ -55,7 +55,7 @@ func BaseURL(ctx context.Context) *url.URL { func HistoryQFromRequest(request *http.Request) (*history.Q, error) { ctx := request.Context() - session, ok := ctx.Value(&SessionContextKey).(*db.Session) + session, ok := ctx.Value(&SessionContextKey).(db.SessionInterface) if !ok { return nil, errors.New("missing session in request context") } diff --git a/services/horizon/internal/db2/assets/asset_stat_test.go b/services/horizon/internal/db2/assets/asset_stat_test.go index c7ef50fe90..c87edc19cb 100644 --- a/services/horizon/internal/db2/assets/asset_stat_test.go +++ b/services/horizon/internal/db2/assets/asset_stat_test.go @@ -92,7 +92,7 @@ func TestAssetsStatsQExec(t *testing.T) { tt.Require.NoError(err) var results []AssetStatsR - err = history.Q{Session: tt.HorizonSession()}.Select(context.Background(), &results, sql) + err = history.Q{SessionInterface: tt.HorizonSession()}.Select(context.Background(), &results, sql) tt.Require.NoError(err) if !tt.Assert.Equal(3, len(results)) { return diff --git a/services/horizon/internal/db2/history/accounts.go b/services/horizon/internal/db2/history/accounts.go index 73cb182618..a4b60fd382 100644 --- a/services/horizon/internal/db2/history/accounts.go +++ b/services/horizon/internal/db2/history/accounts.go @@ -8,6 +8,7 @@ import ( "github.com/lib/pq" "github.com/stellar/go/services/horizon/internal/db2" + "github.com/stellar/go/support/db" "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) @@ -190,7 +191,7 @@ func (q *Q) UpsertAccounts(ctx context.Context, accounts []xdr.LedgerEntry) erro num_sponsoring = excluded.num_sponsoring` _, err := q.ExecRaw( - ctx, + context.WithValue(ctx, &db.QueryTypeContextKey, db.UpsertQueryType), sql, pq.Array(accountID), pq.Array(balance), diff --git a/services/horizon/internal/db2/history/main.go b/services/horizon/internal/db2/history/main.go index 4da6945006..9f488f1cde 100644 --- a/services/horizon/internal/db2/history/main.go +++ b/services/horizon/internal/db2/history/main.go @@ -603,7 +603,7 @@ type OperationsQ struct { // Q is a helper struct on which to hang common_trades queries against a history // portion of the horizon database. type Q struct { - *db.Session + db.SessionInterface } // QSigners defines signer related queries. diff --git a/services/horizon/internal/db2/history/trust_lines.go b/services/horizon/internal/db2/history/trust_lines.go index 1d351c9cd3..3dfe50b80d 100644 --- a/services/horizon/internal/db2/history/trust_lines.go +++ b/services/horizon/internal/db2/history/trust_lines.go @@ -8,6 +8,7 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/guregu/null" "github.com/lib/pq" + "github.com/stellar/go/support/db" "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) @@ -221,7 +222,9 @@ func (q *Q) UpsertTrustLines(ctx context.Context, trustLines []xdr.LedgerEntry) last_modified_ledger = excluded.last_modified_ledger, sponsor = excluded.sponsor` - _, err := q.ExecRaw(ctx, sql, + _, err := q.ExecRaw( + context.WithValue(ctx, &db.QueryTypeContextKey, db.UpsertQueryType), + sql, pq.Array(ledgerKey), pq.Array(accountID), pq.Array(assetType), diff --git a/services/horizon/internal/httpx/middleware.go b/services/horizon/internal/httpx/middleware.go index 164bc0d5fb..cfc36274f4 100644 --- a/services/horizon/internal/httpx/middleware.go +++ b/services/horizon/internal/httpx/middleware.go @@ -141,16 +141,16 @@ func sanitizeMetricRoute(routePattern string) string { route = strings.ReplaceAll(route, "\\", "\\\\") route = strings.ReplaceAll(route, "\"", "\\\"") route = strings.ReplaceAll(route, "\n", "\\n") + if route == "" { + // Can be empty when request did not reach the final route (ex. blocked by + // a middleware). More info: https://github.com/go-chi/chi/issues/270 + return "undefined" + } return route } func logEndOfRequest(ctx context.Context, r *http.Request, requestDurationSummary *prometheus.SummaryVec, duration time.Duration, mw middleware.WrapResponseWriter, streaming bool) { route := sanitizeMetricRoute(chi.RouteContext(r.Context()).RoutePattern()) - // Can be empty when request did not reached the final route (ex. blocked by - // a middleware). More info: https://github.com/go-chi/chi/issues/270 - if route == "" { - route = "undefined" - } referer := r.Referer() if referer == "" { @@ -205,10 +205,15 @@ func recoverMiddleware(h http.Handler) http.Handler { // NewHistoryMiddleware adds session to the request context and ensures Horizon // is not in a stale state, which is when the difference between latest core // ledger and latest history ledger is higher than the given threshold -func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, session *db.Session) func(http.Handler) http.Handler { +func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, session db.SessionInterface) func(http.Handler) http.Handler { return func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + chiRoute := chi.RouteContext(ctx) + if chiRoute != nil { + ctx = context.WithValue(ctx, &db.RouteContextKey, sanitizeMetricRoute(chiRoute.RoutePattern())) + } if staleThreshold > 0 { ls := ledgerState.CurrentStatus() isStale := (ls.CoreLatest - ls.HistoryLatest) > int32(staleThreshold) @@ -218,7 +223,7 @@ func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, sessi "history_latest_ledger": ls.HistoryLatest, "core_latest_ledger": ls.CoreLatest, } - problem.Render(r.Context(), w, err) + problem.Render(ctx, w, err) return } } @@ -226,7 +231,7 @@ func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, sessi requestSession := session.Clone() h.ServeHTTP(w, r.WithContext( context.WithValue( - r.Context(), + ctx, &horizonContext.SessionContextKey, requestSession, ), @@ -241,7 +246,7 @@ func NewHistoryMiddleware(ledgerState *ledger.State, staleThreshold int32, sessi // has been verified and is correct (Otherwise returns `500 Internal Server Error` to prevent // returning invalid data to the user) type StateMiddleware struct { - HorizonSession *db.Session + HorizonSession db.SessionInterface NoStateVerification bool } @@ -277,6 +282,10 @@ func ingestionStatus(ctx context.Context, q *history.Q) (uint32, bool, error) { func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() + chiRoute := chi.RouteContext(ctx) + if chiRoute != nil { + ctx = context.WithValue(ctx, &db.RouteContextKey, sanitizeMetricRoute(chiRoute.RoutePattern())) + } session := m.HorizonSession.Clone() q := &history.Q{session} sseRequest := render.Negotiate(r) == render.MimeEventStream @@ -292,7 +301,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { }) if err != nil { err = supportErrors.Wrap(err, "Error starting ingestion read transaction") - problem.Render(r.Context(), w, err) + problem.Render(ctx, w, err) return } defer session.Rollback(ctx) @@ -301,22 +310,22 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { stateInvalid, invalidErr := q.GetExpStateInvalid(ctx) if invalidErr != nil { invalidErr = supportErrors.Wrap(invalidErr, "Error running GetExpStateInvalid") - problem.Render(r.Context(), w, invalidErr) + problem.Render(ctx, w, invalidErr) return } if stateInvalid { - problem.Render(r.Context(), w, problem.ServerError) + problem.Render(ctx, w, problem.ServerError) return } } lastIngestedLedger, ready, err := ingestionStatus(ctx, q) if err != nil { - problem.Render(r.Context(), w, err) + problem.Render(ctx, w, err) return } if !m.NoStateVerification && !ready { - problem.Render(r.Context(), w, hProblem.StillIngesting) + problem.Render(ctx, w, hProblem.StillIngesting) return } @@ -326,7 +335,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { if sseRequest { if err = session.Rollback(ctx); err != nil { problem.Render( - r.Context(), + ctx, w, supportErrors.Wrap( err, @@ -340,11 +349,7 @@ func (m *StateMiddleware) WrapFunc(h http.HandlerFunc) http.HandlerFunc { } h.ServeHTTP(w, r.WithContext( - context.WithValue( - r.Context(), - &horizonContext.SessionContextKey, - session, - ), + context.WithValue(ctx, &horizonContext.SessionContextKey, session), )) } } diff --git a/services/horizon/internal/httpx/router.go b/services/horizon/internal/httpx/router.go index 966d70178c..3c9a865329 100644 --- a/services/horizon/internal/httpx/router.go +++ b/services/horizon/internal/httpx/router.go @@ -28,7 +28,7 @@ import ( const maxAssetsForPathFinding = 15 type RouterConfig struct { - DBSession *db.Session + DBSession db.SessionInterface TxSubmitter *txsub.System RateQuota *throttled.RateQuota @@ -128,12 +128,10 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate historyMiddleware := NewHistoryMiddleware(ledgerState, int32(config.StaleThreshold), config.DBSession) // State endpoints behind stateMiddleware r.Group(func(r chi.Router) { - r.Use(stateMiddleware.Wrap) - r.Route("/accounts", func(r chi.Router) { - r.Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetAccountsHandler{LedgerState: ledgerState})) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetAccountsHandler{LedgerState: ledgerState})) r.Route("/{account_id}", func(r chi.Router) { - r.Method( + r.With(stateMiddleware.Wrap).Method( http.MethodGet, "/", streamableObjectActionHandler{ @@ -142,25 +140,25 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate }, ) accountData := actions.GetAccountDataHandler{} - r.Method(http.MethodGet, "/data/{key}", WrapRaw( + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/data/{key}", WrapRaw( streamableObjectActionHandler{streamHandler: streamHandler, action: accountData}, accountData, )) - r.Method(http.MethodGet, "/offers", streamableStatePageHandler(ledgerState, actions.GetAccountOffersHandler{LedgerState: ledgerState}, streamHandler)) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/offers", streamableStatePageHandler(ledgerState, actions.GetAccountOffersHandler{LedgerState: ledgerState}, streamHandler)) }) }) r.Route("/claimable_balances", func(r chi.Router) { - r.Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetClaimableBalancesHandler{LedgerState: ledgerState})) - r.Method(http.MethodGet, "/{id}", ObjectActionHandler{actions.GetClaimableBalanceByIDHandler{}}) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetClaimableBalancesHandler{LedgerState: ledgerState})) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/{id}", ObjectActionHandler{actions.GetClaimableBalanceByIDHandler{}}) }) r.Route("/offers", func(r chi.Router) { - r.Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetOffersHandler{LedgerState: ledgerState})) - r.Method(http.MethodGet, "/{offer_id}", ObjectActionHandler{actions.GetOfferByID{}}) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/", restPageHandler(ledgerState, actions.GetOffersHandler{LedgerState: ledgerState})) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/{offer_id}", ObjectActionHandler{actions.GetOfferByID{}}) }) - r.Method(http.MethodGet, "/assets", restPageHandler(ledgerState, actions.AssetStatsHandler{LedgerState: ledgerState})) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/assets", restPageHandler(ledgerState, actions.AssetStatsHandler{LedgerState: ledgerState})) findPaths := ObjectActionHandler{actions.FindPathsHandler{ StaleThreshold: config.StaleThreshold, @@ -176,11 +174,11 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate PathFinder: config.PathFinder, }} - r.Method(http.MethodGet, "/paths", findPaths) - r.Method(http.MethodGet, "/paths/strict-receive", findPaths) - r.Method(http.MethodGet, "/paths/strict-send", findFixedPaths) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/paths", findPaths) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/paths/strict-receive", findPaths) + r.With(stateMiddleware.Wrap).Method(http.MethodGet, "/paths/strict-send", findFixedPaths) - r.Method( + r.With(stateMiddleware.Wrap).Method( http.MethodGet, "/order_book", streamableObjectActionHandler{ @@ -194,33 +192,31 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate // need to use absolute routes here. Make sure we use regexp check here for // emptiness. Without it, requesting `/accounts//payments` return all payments! r.Group(func(r chi.Router) { - r.Use(historyMiddleware) - r.Method(http.MethodGet, "/accounts/{account_id:\\w+}/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) - r.Method(http.MethodGet, "/accounts/{account_id:\\w+}/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/accounts/{account_id:\\w+}/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/accounts/{account_id:\\w+}/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: false, }, streamHandler)) - r.Method(http.MethodGet, "/accounts/{account_id:\\w+}/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/accounts/{account_id:\\w+}/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: true, }, streamHandler)) - r.Method(http.MethodGet, "/accounts/{account_id:\\w+}/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) - r.Method(http.MethodGet, "/accounts/{account_id:\\w+}/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/accounts/{account_id:\\w+}/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/accounts/{account_id:\\w+}/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) }) // ledger actions r.Route("/ledgers", func(r chi.Router) { - r.Use(historyMiddleware) - r.Method(http.MethodGet, "/", streamableHistoryPageHandler(ledgerState, actions.GetLedgersHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/", streamableHistoryPageHandler(ledgerState, actions.GetLedgersHandler{LedgerState: ledgerState}, streamHandler)) r.Route("/{ledger_id}", func(r chi.Router) { - r.Method(http.MethodGet, "/", ObjectActionHandler{actions.GetLedgerByIDHandler{LedgerState: ledgerState}}) - r.Method(http.MethodGet, "/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/", ObjectActionHandler{actions.GetLedgerByIDHandler{LedgerState: ledgerState}}) + r.With(historyMiddleware).Method(http.MethodGet, "/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) r.Group(func(r chi.Router) { - r.Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) - r.Method(http.MethodGet, "/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: false, }, streamHandler)) - r.Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: true, }, streamHandler)) @@ -229,26 +225,24 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate }) // claimable balance actions r.Group(func(r chi.Router) { - r.Use(historyMiddleware) - r.Method(http.MethodGet, "/claimable_balances/{claimable_balance_id:\\w+}/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/claimable_balances/{claimable_balance_id:\\w+}/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: false, }, streamHandler)) - r.Method(http.MethodGet, "/claimable_balances/{claimable_balance_id:\\w+}/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/claimable_balances/{claimable_balance_id:\\w+}/transactions", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) }) // transaction history actions r.Route("/transactions", func(r chi.Router) { r.With(historyMiddleware).Method(http.MethodGet, "/", streamableHistoryPageHandler(ledgerState, actions.GetTransactionsHandler{LedgerState: ledgerState}, streamHandler)) r.Route("/{tx_id}", func(r chi.Router) { - r.Use(historyMiddleware) - r.Method(http.MethodGet, "/", ObjectActionHandler{actions.GetTransactionByHashHandler{}}) - r.Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) - r.Method(http.MethodGet, "/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/", ObjectActionHandler{actions.GetTransactionByHashHandler{}}) + r.With(historyMiddleware).Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/operations", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: false, }, streamHandler)) - r.Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: true, }, streamHandler)) @@ -257,32 +251,30 @@ func (r *Router) addRoutes(config *RouterConfig, rateLimiter *throttled.HTTPRate // operation actions r.Route("/operations", func(r chi.Router) { - r.Use(historyMiddleware) - r.Method(http.MethodGet, "/", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: false, }, streamHandler)) - r.Method(http.MethodGet, "/{id}", ObjectActionHandler{actions.GetOperationByIDHandler{LedgerState: ledgerState}}) - r.Method(http.MethodGet, "/{op_id}/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/{id}", ObjectActionHandler{actions.GetOperationByIDHandler{LedgerState: ledgerState}}) + r.With(historyMiddleware).Method(http.MethodGet, "/{op_id}/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) }) r.Group(func(r chi.Router) { - r.Use(historyMiddleware) // payment actions - r.Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ + r.With(historyMiddleware).Method(http.MethodGet, "/payments", streamableHistoryPageHandler(ledgerState, actions.GetOperationsHandler{ LedgerState: ledgerState, OnlyPayments: true, }, streamHandler)) // effect actions - r.Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/effects", streamableHistoryPageHandler(ledgerState, actions.GetEffectsHandler{LedgerState: ledgerState}, streamHandler)) // trading related endpoints - r.Method(http.MethodGet, "/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) - r.Method(http.MethodGet, "/trade_aggregations", ObjectActionHandler{actions.GetTradeAggregationsHandler{LedgerState: ledgerState}}) + r.With(historyMiddleware).Method(http.MethodGet, "/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/trade_aggregations", ObjectActionHandler{actions.GetTradeAggregationsHandler{LedgerState: ledgerState}}) // /offers/{offer_id} has been created above so we need to use absolute // routes here. - r.Method(http.MethodGet, "/offers/{offer_id}/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) + r.With(historyMiddleware).Method(http.MethodGet, "/offers/{offer_id}/trades", streamableHistoryPageHandler(ledgerState, actions.GetTradesHandler{LedgerState: ledgerState}, streamHandler)) }) // Transaction submission API diff --git a/services/horizon/internal/ingest/main.go b/services/horizon/internal/ingest/main.go index a19890b703..a0ceb077f7 100644 --- a/services/horizon/internal/ingest/main.go +++ b/services/horizon/internal/ingest/main.go @@ -66,7 +66,7 @@ const ( var log = logpkg.DefaultLogger.WithField("service", "ingest") type Config struct { - CoreSession *db.Session + CoreSession db.SessionInterface StellarCoreURL string StellarCoreCursor string EnableCaptiveCore bool @@ -79,7 +79,7 @@ type Config struct { RemoteCaptiveCoreURL string NetworkPassphrase string - HistorySession *db.Session + HistorySession db.SessionInterface HistoryArchiveURL string DisableStateVerification bool diff --git a/services/horizon/internal/init.go b/services/horizon/internal/init.go index bc9a5056bd..5665e125e0 100644 --- a/services/horizon/internal/init.go +++ b/services/horizon/internal/init.go @@ -18,7 +18,7 @@ import ( "github.com/stellar/go/support/log" ) -func mustNewDBSession(databaseURL string, maxIdle, maxOpen int) *db.Session { +func mustNewDBSession(subsystem db.Subsystem, databaseURL string, maxIdle, maxOpen int, registry *prometheus.Registry) db.SessionInterface { session, err := db.Open("postgres", databaseURL) if err != nil { log.Fatalf("cannot open Horizon DB: %v", err) @@ -26,7 +26,7 @@ func mustNewDBSession(databaseURL string, maxIdle, maxOpen int) *db.Session { session.DB.SetMaxIdleConns(maxIdle) session.DB.SetMaxOpenConns(maxOpen) - return session + return db.RegisterMetrics(session, "horizon", subsystem, registry) } func mustInitHorizonDB(app *App) { @@ -44,22 +44,25 @@ func mustInitHorizonDB(app *App) { } app.historyQ = &history.Q{mustNewDBSession( + db.HistorySubsystem, app.config.DatabaseURL, maxIdle, maxOpen, + app.prometheusRegistry, )} } func initIngester(app *App) { var err error - var coreSession *db.Session + var coreSession db.SessionInterface if !app.config.EnableCaptiveCoreIngestion { - coreSession = mustNewDBSession(app.config.StellarCoreDatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections) + coreSession = mustNewDBSession( + db.CoreSubsystem, app.config.StellarCoreDatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry) } app.ingester, err = ingest.NewSystem(ingest.Config{ CoreSession: coreSession, HistorySession: mustNewDBSession( - app.config.DatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, + db.IngestSubsystem, app.config.DatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry, ), NetworkPassphrase: app.config.NetworkPassphrase, // TODO: @@ -198,55 +201,6 @@ func initDbMetrics(app *App) { ) app.prometheusRegistry.MustRegister(app.coreSynced) - app.dbMaxOpenConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: "horizon", Subsystem: "db", Name: "max_open_connections"}, - func() float64 { - // Right now MaxOpenConnections in Horizon is static however it's possible that - // it will change one day. In such case, using GaugeFunc is very cheap and will - // prevent issues with this metric in the future. - return float64(app.historyQ.Session.DB.Stats().MaxOpenConnections) - }, - ) - app.prometheusRegistry.MustRegister(app.dbMaxOpenConnectionsGauge) - - app.dbOpenConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: "horizon", Subsystem: "db", Name: "open_connections"}, - func() float64 { - return float64(app.historyQ.Session.DB.Stats().OpenConnections) - }, - ) - app.prometheusRegistry.MustRegister(app.dbOpenConnectionsGauge) - - app.dbInUseConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: "horizon", Subsystem: "db", Name: "in_use_connections"}, - func() float64 { - return float64(app.historyQ.Session.DB.Stats().InUse) - }, - ) - app.prometheusRegistry.MustRegister(app.dbInUseConnectionsGauge) - - app.dbWaitCountCounter = prometheus.NewCounterFunc( - prometheus.CounterOpts{ - Namespace: "horizon", Subsystem: "db", Name: "wait_count_total", - Help: "total number of number of connections waited for", - }, - func() float64 { - return float64(app.historyQ.Session.DB.Stats().WaitCount) - }, - ) - app.prometheusRegistry.MustRegister(app.dbWaitCountCounter) - - app.dbWaitDurationCounter = prometheus.NewCounterFunc( - prometheus.CounterOpts{ - Namespace: "horizon", Subsystem: "db", Name: "wait_duration_seconds_total", - Help: "total time blocked waiting for a new connection", - }, - func() float64 { - return app.historyQ.Session.DB.Stats().WaitDuration.Seconds() - }, - ) - app.prometheusRegistry.MustRegister(app.dbWaitDurationCounter) - app.prometheusRegistry.MustRegister(app.orderBookStream.LatestLedgerGauge) } @@ -304,7 +258,7 @@ func initSubmissionSystem(app *App) { Submitter: txsub.NewDefaultSubmitter(http.DefaultClient, app.config.StellarCoreURL), SubmissionQueue: sequence.NewManager(), DB: func(ctx context.Context) txsub.HorizonDB { - return &history.Q{Session: app.HorizonSession()} + return &history.Q{SessionInterface: app.HorizonSession()} }, } } diff --git a/services/horizon/internal/middleware_test.go b/services/horizon/internal/middleware_test.go index c7c1e92142..92472c2ca9 100644 --- a/services/horizon/internal/middleware_test.go +++ b/services/horizon/internal/middleware_test.go @@ -9,6 +9,7 @@ import ( "strconv" "testing" + "github.com/go-chi/chi" "github.com/stellar/throttled" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" @@ -148,12 +149,12 @@ func TestStateMiddleware(t *testing.T) { q := &history.Q{tt.HorizonSession()} - request, err := http.NewRequest("GET", "http://localhost", nil) + request, err := http.NewRequest("GET", "http://localhost/", nil) tt.Assert.NoError(err) expectTransaction := true endpoint := func(w http.ResponseWriter, r *http.Request) { - session := r.Context().Value(&horizonContext.SessionContextKey).(*db.Session) + session := r.Context().Value(&horizonContext.SessionContextKey).(db.SessionInterface) if (session.GetTx() == nil) == expectTransaction { t.Fatalf("expected transaction to be in session: %v", expectTransaction) } @@ -163,7 +164,8 @@ func TestStateMiddleware(t *testing.T) { stateMiddleware := &httpx.StateMiddleware{ HorizonSession: tt.HorizonSession(), } - handler := stateMiddleware.Wrap(http.HandlerFunc(endpoint)) + handler := chi.NewRouter() + handler.With(stateMiddleware.Wrap).MethodFunc("GET", "/", endpoint) for i, testCase := range []struct { name string @@ -307,7 +309,7 @@ func TestStateMiddleware(t *testing.T) { func TestCheckHistoryStaleMiddleware(t *testing.T) { tt := test.Start(t) defer tt.Finish() - request, err := http.NewRequest("GET", "http://localhost", nil) + request, err := http.NewRequest("GET", "http://localhost/", nil) tt.Assert.NoError(err) endpoint := func(w http.ResponseWriter, r *http.Request) { @@ -351,7 +353,8 @@ func TestCheckHistoryStaleMiddleware(t *testing.T) { ledgerState := &ledger.State{} ledgerState.SetStatus(state) historyMiddleware := httpx.NewHistoryMiddleware(ledgerState, testCase.staleThreshold, tt.HorizonSession()) - handler := historyMiddleware(http.HandlerFunc(endpoint)) + handler := chi.NewRouter() + handler.With(historyMiddleware).MethodFunc("GET", "/", endpoint) w := httptest.NewRecorder() handler.ServeHTTP(w, request) tt.Assert.Equal(testCase.expectedStatus, w.Code) diff --git a/services/horizon/internal/reap/main.go b/services/horizon/internal/reap/main.go index 917782be55..65b29f53cd 100644 --- a/services/horizon/internal/reap/main.go +++ b/services/horizon/internal/reap/main.go @@ -23,7 +23,7 @@ type System struct { // New initializes the reaper, causing it to begin polling the stellar-core // database for now ledgers and ingesting data into the horizon database. -func New(retention uint, dbSession *db.Session, ledgerState *ledger.State) *System { +func New(retention uint, dbSession db.SessionInterface, ledgerState *ledger.State) *System { r := &System{ HistoryQ: &history.Q{dbSession}, RetentionCount: retention, diff --git a/services/horizon/internal/txsub/results_test.go b/services/horizon/internal/txsub/results_test.go index 09e1ea5b18..a0695c22c2 100644 --- a/services/horizon/internal/txsub/results_test.go +++ b/services/horizon/internal/txsub/results_test.go @@ -11,7 +11,7 @@ func TestGetIngestedTx(t *testing.T) { tt := test.Start(t) tt.Scenario("base") defer tt.Finish() - q := &history.Q{Session: tt.HorizonSession()} + q := &history.Q{SessionInterface: tt.HorizonSession()} hash := "2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d" tx, err := txResultByHash(tt.Ctx, q, hash) tt.Assert.NoError(err) @@ -22,7 +22,7 @@ func TestGetMissingTx(t *testing.T) { tt := test.Start(t) tt.Scenario("base") defer tt.Finish() - q := &history.Q{Session: tt.HorizonSession()} + q := &history.Q{SessionInterface: tt.HorizonSession()} hash := "adf1efb9fd253f53cbbe6230c131d2af19830328e52b610464652d67d2fb7195" _, err := txResultByHash(tt.Ctx, q, hash) @@ -33,7 +33,7 @@ func TestGetFailedTx(t *testing.T) { tt := test.Start(t) tt.Scenario("failed_transactions") defer tt.Finish() - q := &history.Q{Session: tt.HorizonSession()} + q := &history.Q{SessionInterface: tt.HorizonSession()} hash := "aa168f12124b7c196c0adaee7c73a64d37f99428cacb59a91ff389626845e7cf" _, err := txResultByHash(tt.Ctx, q, hash) diff --git a/support/db/main.go b/support/db/main.go index 49d7d9216d..acd4e7d576 100644 --- a/support/db/main.go +++ b/support/db/main.go @@ -107,8 +107,11 @@ type SessionInterface interface { BeginTx(ctx context.Context, opts *sql.TxOptions) error Begin(ctx context.Context) error Rollback(ctx context.Context) error + Commit(ctx context.Context) error + GetTx() *sqlx.Tx + GetTxOptions() *sql.TxOptions TruncateTables(ctx context.Context, tables []string) error - Clone() *Session + Clone() SessionInterface Close() error Get(ctx context.Context, dest interface{}, query squirrel.Sqlizer) error GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) error @@ -119,6 +122,12 @@ type SessionInterface interface { ExecRaw(ctx context.Context, query string, args ...interface{}) (sql.Result, error) NoRows(err error) bool Ping(ctx context.Context, timeout time.Duration) error + DeleteRange( + ctx context.Context, + start, end int64, + table string, + idCol string, + ) error } // Table helps to build sql queries against a given table. It logically diff --git a/support/db/metrics.go b/support/db/metrics.go new file mode 100644 index 0000000000..1dbfed3d8e --- /dev/null +++ b/support/db/metrics.go @@ -0,0 +1,414 @@ +package db + +import ( + "context" + "database/sql" + "fmt" + "strings" + "time" + + "github.com/Masterminds/squirrel" + "github.com/prometheus/client_golang/prometheus" +) + +type CtxKey string + +var RouteContextKey = CtxKey("route") +var QueryTypeContextKey = CtxKey("query_type") + +type Subsystem string + +var CoreSubsystem = Subsystem("core") +var HistorySubsystem = Subsystem("history") +var IngestSubsystem = Subsystem("ingest") + +type QueryType string + +var DeleteQueryType = QueryType("delete") +var InsertQueryType = QueryType("insert") +var SelectQueryType = QueryType("select") +var UndefinedQueryType = QueryType("undefined") +var UpdateQueryType = QueryType("update") +var UpsertQueryType = QueryType("upsert") + +// contextRoute returns a string representing the request endpoint, or "undefined" if it wasn't found +func contextRoute(ctx context.Context) string { + if endpoint, ok := ctx.Value(&RouteContextKey).(string); ok { + return endpoint + } + return "undefined" +} + +type SessionWithMetrics struct { + SessionInterface + registry *prometheus.Registry + queryCounter *prometheus.CounterVec + queryDurationSummary *prometheus.SummaryVec + maxOpenConnectionsGauge prometheus.GaugeFunc + openConnectionsGauge prometheus.GaugeFunc + inUseConnectionsGauge prometheus.GaugeFunc + idleConnectionsGauge prometheus.GaugeFunc + waitCountCounter prometheus.CounterFunc + waitDurationCounter prometheus.CounterFunc + maxIdleClosedCounter prometheus.CounterFunc + maxIdleTimeClosedCounter prometheus.CounterFunc + maxLifetimeClosedCounter prometheus.CounterFunc +} + +func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *prometheus.Registry) SessionInterface { + subsystem := fmt.Sprintf("db_%s", sub) + s := &SessionWithMetrics{ + SessionInterface: base, + registry: registry, + } + + s.queryCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{Namespace: namespace, Subsystem: subsystem, Name: "query_total"}, + []string{"query_type", "error", "route"}, + ) + registry.MustRegister(s.queryCounter) + + s.queryDurationSummary = prometheus.NewSummaryVec( + prometheus.SummaryOpts{ + Namespace: namespace, Subsystem: subsystem, + Name: "query_duration_seconds", + }, + []string{"query_type", "error", "route"}, + ) + registry.MustRegister(s.queryDurationSummary) + + // txnCounter: prometheus.NewCounter( + // prometheus.CounterOpts{Namespace: namespace, Subsystem: subsystem, Name: "transaction_total"}, + // ), + // registry.MustRegister(s.txnCounter) + // txnDuration: prometheus.NewHistogram( + // prometheus.HistogramOpts{ + // Namespace: namespace, Subsystem: subsystem, + // Name: "transaction_duration_seconds", + // Buckets: prometheus.ExponentialBuckets(0.1, 3, 5), + // }, + // ), + // registry.MustRegister(s.txnDuration) + + s.maxOpenConnectionsGauge = prometheus.NewGaugeFunc( + prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "max_open_connections"}, + func() float64 { + // Right now MaxOpenConnections in Horizon is static however it's possible that + // it will change one day. In such case, using GaugeFunc is very cheap and will + // prevent issues with this metric in the future. + return float64(base.DB.Stats().MaxOpenConnections) + }, + ) + registry.MustRegister(s.maxOpenConnectionsGauge) + + s.openConnectionsGauge = prometheus.NewGaugeFunc( + prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "open_connections"}, + func() float64 { + return float64(base.DB.Stats().OpenConnections) + }, + ) + registry.MustRegister(s.openConnectionsGauge) + + s.inUseConnectionsGauge = prometheus.NewGaugeFunc( + prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "in_use_connections"}, + func() float64 { + return float64(base.DB.Stats().InUse) + }, + ) + registry.MustRegister(s.inUseConnectionsGauge) + + s.idleConnectionsGauge = prometheus.NewGaugeFunc( + prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "idle_connections"}, + func() float64 { + return float64(base.DB.Stats().Idle) + }, + ) + registry.MustRegister(s.idleConnectionsGauge) + + s.waitCountCounter = prometheus.NewCounterFunc( + prometheus.CounterOpts{ + Namespace: namespace, Subsystem: subsystem, Name: "wait_count_total", + Help: "total number of number of connections waited for", + }, + func() float64 { + return float64(base.DB.Stats().WaitCount) + }, + ) + registry.MustRegister(s.waitCountCounter) + + s.waitDurationCounter = prometheus.NewCounterFunc( + prometheus.CounterOpts{ + Namespace: namespace, Subsystem: subsystem, Name: "wait_duration_seconds_total", + Help: "total time blocked waiting for a new connection", + }, + func() float64 { + return base.DB.Stats().WaitDuration.Seconds() + }, + ) + registry.MustRegister(s.waitDurationCounter) + + s.maxIdleClosedCounter = prometheus.NewCounterFunc( + prometheus.CounterOpts{ + Namespace: namespace, Subsystem: subsystem, Name: "max_idle_closed_total", + Help: "total number of number of connections closed due to SetMaxIdleConns", + }, + func() float64 { + return float64(base.DB.Stats().MaxIdleClosed) + }, + ) + registry.MustRegister(s.maxIdleClosedCounter) + + s.maxIdleTimeClosedCounter = prometheus.NewCounterFunc( + prometheus.CounterOpts{ + Namespace: namespace, Subsystem: subsystem, Name: "max_idle_time_closed_total", + Help: "total number of number of connections closed due to SetConnMaxIdleTime", + }, + func() float64 { + return float64(base.DB.Stats().MaxIdleTimeClosed) + }, + ) + registry.MustRegister(s.maxIdleTimeClosedCounter) + + s.maxLifetimeClosedCounter = prometheus.NewCounterFunc( + prometheus.CounterOpts{ + Namespace: namespace, Subsystem: subsystem, Name: "max_lifetime_closed_total", + Help: "total number of number of connections closed due to SetConnMaxLifetime", + }, + func() float64 { + return float64(base.DB.Stats().MaxLifetimeClosed) + }, + ) + registry.MustRegister(s.maxLifetimeClosedCounter) + + return s +} + +func (s *SessionWithMetrics) Close() error { + s.registry.Unregister(s.queryCounter) + s.registry.Unregister(s.queryDurationSummary) + // s.registry.Unregister(s.txnCounter) + // s.registry.Unregister(s.txnDurationSummary) + s.registry.Unregister(s.maxOpenConnectionsGauge) + s.registry.Unregister(s.openConnectionsGauge) + s.registry.Unregister(s.inUseConnectionsGauge) + s.registry.Unregister(s.idleConnectionsGauge) + s.registry.Unregister(s.waitCountCounter) + s.registry.Unregister(s.waitDurationCounter) + s.registry.Unregister(s.maxIdleClosedCounter) + s.registry.Unregister(s.maxIdleTimeClosedCounter) + s.registry.Unregister(s.maxLifetimeClosedCounter) + return s.SessionInterface.Close() +} + +// TODO: Implement these +// func (s *SessionWithMetrics) BeginTx(ctx context.Context, opts *sql.TxOptions) error { +// func (s *SessionWithMetrics) Begin(ctx context.Context) error { +// func (s *SessionWithMetrics) Commit(ctx context.Context) error +// func (s *SessionWithMetrics) Rollback(ctx context.Context) error + +func (s *SessionWithMetrics) TruncateTables(ctx context.Context, tables []string) (err error) { + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": "truncate_tables", + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": "truncate_tables", + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + err = s.SessionInterface.TruncateTables(ctx, tables) + return err +} + +func (s *SessionWithMetrics) Clone() SessionInterface { + return &SessionWithMetrics{ + SessionInterface: s.SessionInterface.Clone(), + registry: s.registry, + queryCounter: s.queryCounter, + queryDurationSummary: s.queryDurationSummary, + // txnCounter: s.txnCounter, + // txnDurationSummary: s.txnDurationSummary, + maxOpenConnectionsGauge: s.maxOpenConnectionsGauge, + openConnectionsGauge: s.openConnectionsGauge, + inUseConnectionsGauge: s.inUseConnectionsGauge, + idleConnectionsGauge: s.idleConnectionsGauge, + waitCountCounter: s.waitCountCounter, + waitDurationCounter: s.waitDurationCounter, + maxIdleClosedCounter: s.maxIdleClosedCounter, + maxIdleTimeClosedCounter: s.maxIdleTimeClosedCounter, + maxLifetimeClosedCounter: s.maxLifetimeClosedCounter, + } +} + +func getQueryType(ctx context.Context, query squirrel.Sqlizer) QueryType { + // Do we have an explicit query type set in the context? For raw execs, in + // lieu of better detection. e.g. "upsert" + if q, ok := ctx.Value(&QueryTypeContextKey).(QueryType); ok { + return q + } + + // is it a squirrel builder? + if _, ok := query.(squirrel.DeleteBuilder); ok { + return DeleteQueryType + } + if _, ok := query.(squirrel.InsertBuilder); ok { + return InsertQueryType + } + if _, ok := query.(squirrel.SelectBuilder); ok { + return SelectQueryType + } + if _, ok := query.(squirrel.UpdateBuilder); ok { + return UpdateQueryType + } + + // Try to guess based on the first word of the string. + // e.g. "SELECT * FROM table" + str, _, err := query.ToSql() + words := strings.Fields(strings.TrimSpace(strings.ToLower(str))) + if err == nil && len(words) > 0 { + // Make sure we don't only get known keywords here, incase it's a more + // complex query. + for _, word := range []string{"delete", "insert", "select", "update"} { + if word == words[0] { + return QueryType(word) + } + } + } + + // Fresh out of ideas. + return UndefinedQueryType +} + +func (s *SessionWithMetrics) Get(ctx context.Context, dest interface{}, query squirrel.Sqlizer) (err error) { + queryType := string(getQueryType(ctx, query)) + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + err = s.SessionInterface.Get(ctx, dest, query) + return err +} + +func (s *SessionWithMetrics) GetRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { + return s.Get(ctx, dest, squirrel.Expr(query, args...)) +} + +func (s *SessionWithMetrics) Select(ctx context.Context, dest interface{}, query squirrel.Sqlizer) (err error) { + queryType := string(getQueryType(ctx, query)) + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + err = s.SessionInterface.Select(ctx, dest, query) + return err +} + +func (s *SessionWithMetrics) SelectRaw(ctx context.Context, dest interface{}, query string, args ...interface{}) (err error) { + return s.Select(ctx, dest, squirrel.Expr(query, args...)) +} + +func (s *SessionWithMetrics) Exec(ctx context.Context, query squirrel.Sqlizer) (result sql.Result, err error) { + queryType := string(getQueryType(ctx, query)) + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + result, err = s.SessionInterface.Exec(ctx, query) + return result, err +} + +func (s *SessionWithMetrics) ExecRaw(ctx context.Context, query string, args ...interface{}) (result sql.Result, err error) { + return s.Exec(ctx, squirrel.Expr(query, args...)) +} + +func (s *SessionWithMetrics) Ping(ctx context.Context, timeout time.Duration) (err error) { + queryType := "ping" + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + err = s.SessionInterface.Ping(ctx, timeout) + return err +} + +func (s *SessionWithMetrics) DeleteRange( + ctx context.Context, + start, end int64, + table string, + idCol string, +) (err error) { + queryType := "delete" + timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) { + s.queryDurationSummary.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Observe(v) + })) + defer func() { + timer.ObserveDuration() + s.queryCounter.With(prometheus.Labels{ + "query_type": queryType, + "error": fmt.Sprint(err != nil), + "route": contextRoute(ctx), + }).Inc() + }() + + err = s.SessionInterface.DeleteRange(ctx, start, end, table, idCol) + return err +} diff --git a/support/db/mock_session.go b/support/db/mock_session.go index 18898de94c..fb5971bb29 100644 --- a/support/db/mock_session.go +++ b/support/db/mock_session.go @@ -7,6 +7,7 @@ import ( "github.com/Masterminds/squirrel" sq "github.com/Masterminds/squirrel" + "github.com/jmoiron/sqlx" "github.com/stretchr/testify/mock" ) @@ -31,14 +32,29 @@ func (m *MockSession) Rollback(ctx context.Context) error { return args.Error(0) } +func (m *MockSession) Commit(ctx context.Context) error { + args := m.Called(ctx) + return args.Error(0) +} + +func (m *MockSession) GetTx() *sqlx.Tx { + args := m.Called() + return args.Get(0).(*sqlx.Tx) +} + +func (m *MockSession) GetTxOptions() *sql.TxOptions { + args := m.Called() + return args.Get(0).(*sql.TxOptions) +} + func (m *MockSession) TruncateTables(ctx context.Context, tables []string) error { args := m.Called(ctx, tables) return args.Error(0) } -func (m *MockSession) Clone() *Session { +func (m *MockSession) Clone() SessionInterface { args := m.Called() - return args.Get(0).(*Session) + return args.Get(0).(SessionInterface) } func (m *MockSession) Close() error { @@ -93,3 +109,12 @@ func (m *MockSession) NoRows(err error) bool { func (m *MockSession) Ping(ctx context.Context, timeout time.Duration) error { return m.Called(ctx, timeout).Error(0) } + +func (m *MockSession) DeleteRange( + ctx context.Context, + start, end int64, + table string, + idCol string, +) (err error) { + return m.Called(ctx, start, end, table, idCol).Error(0) +} diff --git a/support/db/session.go b/support/db/session.go index f5cbc74ef8..5a34dd0057 100644 --- a/support/db/session.go +++ b/support/db/session.go @@ -68,7 +68,7 @@ func (s *Session) GetTxOptions() *sql.TxOptions { // Clone clones the receiver, returning a new instance backed by the same // context and db. The result will not be bound to any transaction that the // source is currently within. -func (s *Session) Clone() *Session { +func (s *Session) Clone() SessionInterface { return &Session{ DB: s.DB, } From 0f6f3f66b3783a341633f6c1b53315a3e40039bd Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 17 May 2021 13:05:16 +0100 Subject: [PATCH 42/67] Fallback to Origin header if Referer is not set (#3599) --- services/horizon/internal/httpx/middleware.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/horizon/internal/httpx/middleware.go b/services/horizon/internal/httpx/middleware.go index cfc36274f4..f02a859893 100644 --- a/services/horizon/internal/httpx/middleware.go +++ b/services/horizon/internal/httpx/middleware.go @@ -153,6 +153,9 @@ func logEndOfRequest(ctx context.Context, r *http.Request, requestDurationSummar route := sanitizeMetricRoute(chi.RouteContext(r.Context()).RoutePattern()) referer := r.Referer() + if referer == "" { + referer = r.Header.Get("Origin") + } if referer == "" { referer = "undefined" } From 6d45e627f4ab14d111199dc6d1d2fa8f80ea1276 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 17 May 2021 16:33:17 +0200 Subject: [PATCH 43/67] Horizon: re-enable core 17 for CI (reverts #3600) (#3601) * Revert "services/horizon: Revert "Use Core 17 for CI (and disable cap35-specific job) (#3585)" (#3600)" This reverts commit 1dffd616d62cf3f79afa8f3742f46209f7a36862. * Set default captive core version to 17.0.0 * Unify Core versions --- .circleci/config.yml | 33 ++----------------- services/horizon/docker/Dockerfile.dev | 3 +- services/horizon/docker/core-start.sh | 3 +- .../docker-compose.integration-tests.yml | 2 +- .../internal/integration/protocol16_test.go | 14 ++------ 5 files changed, 11 insertions(+), 44 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 659072bb79..44e0c2d1c1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -147,9 +147,7 @@ commands: parameters: core-version: type: string - # version which works with captive-core by default - # TODO: Set this to latest once core is fixed - default: "15.3.0-498.7a7f18c.xenial~SetTrustlineFlagsPR~buildtests" + default: "17.0.0-568.ea5878e.xenial~buildtests" steps: - run: name: Install Stellar Core <<#parameters.core-version>> (version <>)<> @@ -423,10 +421,6 @@ jobs: enable-captive-core: type: boolean default: false - # TODO: remove once a stellar core version with cap-35 is released - enable-cap-35-tests: - type: boolean - default: false working_directory: ~/go/src/github.com/stellar/go machine: image: ubuntu-1604:202010-01 @@ -445,28 +439,12 @@ jobs: - when: condition: <> steps: - - unless: - condition: <> - steps: - # Install the default version of stellar core - - install_stellar_core - - when: - condition: <> - steps: - # Install a Stellar Core version with CAP35 support - - install_stellar_core: - core-version: 15.3.0-498.7a7f18c.xenial~SetTrustlineFlagsPR~buildtests + - install_stellar_core - run: name: Setting Captive Core env variables command: echo "export HORIZON_INTEGRATION_ENABLE_CAPTIVE_CORE=true" >> $BASH_ENV - - when: - condition: <> - steps: - - run: - name: Setting CAP35 env variables - command: echo "export HORIZON_INTEGRATION_ENABLE_CAP_35=true" >> $BASH_ENV - run: - name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> <<#parameters.enable-cap-35-tests>>(With CAP35)<> + name: Run Horizon integration tests <<#parameters.enable-captive-core>>(With captive core)<> # Currently all integration tests are in a single directory. # Pulling the image helps with test running time command: | @@ -494,11 +472,6 @@ workflows: - test_horizon_integration: name: test_horizon_integration_with_captive_core enable-captive-core: true - # ... and cap35 with captive core - - test_horizon_integration: - name: test_horizon_integration_cap35_with_captive_core - enable-captive-core: true - enable-cap-35-tests: true - test_verify_range_docker_image - publish_state_diff_docker_image: filters: diff --git a/services/horizon/docker/Dockerfile.dev b/services/horizon/docker/Dockerfile.dev index 3e531c820f..ee58351666 100644 --- a/services/horizon/docker/Dockerfile.dev +++ b/services/horizon/docker/Dockerfile.dev @@ -9,7 +9,7 @@ RUN go install github.com/stellar/go/exp/services/captivecore FROM ubuntu:20.04 -ENV STELLAR_CORE_VERSION 15.0.0-40 +ENV STELLAR_CORE_VERSION 17.0.0-568.ea5878e.focal ENV STELLAR_CORE_BINARY_PATH /usr/bin/stellar-core ENV DEBIAN_FRONTEND=noninteractive @@ -25,3 +25,4 @@ COPY --from=builder /go/bin/horizon ./ COPY --from=builder /go/bin/captivecore ./ ENTRYPOINT ["./horizon"] + diff --git a/services/horizon/docker/core-start.sh b/services/horizon/docker/core-start.sh index 89e90fba91..aea5db249f 100755 --- a/services/horizon/docker/core-start.sh +++ b/services/horizon/docker/core-start.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash set -e +set -x source /etc/profile @@ -23,4 +24,4 @@ if [ "$1" = "standalone" ]; then popd fi -exec /init -- stellar-core run \ No newline at end of file +exec stellar-core run diff --git a/services/horizon/docker/docker-compose.integration-tests.yml b/services/horizon/docker/docker-compose.integration-tests.yml index 66d8744759..0618bc90b4 100644 --- a/services/horizon/docker/docker-compose.integration-tests.yml +++ b/services/horizon/docker/docker-compose.integration-tests.yml @@ -10,7 +10,7 @@ services: - "5641:5641" command: ["-p", "5641"] core: - image: ${CORE_IMAGE:-stellar/stellar-core:15.3.0-1506-ff56e7f2} + image: ${CORE_IMAGE:-stellar/stellar-core:v17.0.0} depends_on: - core-postgres restart: on-failure diff --git a/services/horizon/internal/integration/protocol16_test.go b/services/horizon/internal/integration/protocol16_test.go index 22d29dfc0f..7ca62a24b0 100644 --- a/services/horizon/internal/integration/protocol16_test.go +++ b/services/horizon/internal/integration/protocol16_test.go @@ -1,7 +1,6 @@ package integration import ( - "os" "testing" "github.com/stretchr/testify/assert" @@ -18,14 +17,7 @@ import ( ) func NewProtocol16Test(t *testing.T) *integration.Test { - // TODO, this should be removed once a core version with CAP 35 is released - if os.Getenv("HORIZON_INTEGRATION_ENABLE_CAP_35") != "true" { - t.Skip("skipping CAP35 test, set HORIZON_INTEGRATION_ENABLE_CAP_35=true if you want to run it") - } - config := integration.Config{ - ProtocolVersion: 16, - CoreDockerImage: "2opremio/stellar-core:cap35", - } + config := integration.Config{ProtocolVersion: 17} return integration.NewTest(t, config) } @@ -37,8 +29,8 @@ func TestProtocol16Basics(t *testing.T) { t.Run("Sanity", func(t *testing.T) { root, err := itest.Client().Root() tt.NoError(err) - tt.LessOrEqual(int32(16), root.CoreSupportedProtocolVersion) - tt.Equal(int32(16), root.CurrentProtocolVersion) + tt.LessOrEqual(int32(17), root.CoreSupportedProtocolVersion) + tt.Equal(int32(17), root.CurrentProtocolVersion) // Submit a simple tx op := txnbuild.Payment{ From b9e26ec4bc034580463ae3cc4a85bbde35b72e18 Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Tue, 18 May 2021 16:49:38 +0100 Subject: [PATCH 44/67] services/horizon: Fixup db metrics (#3605) * Change db subsystem to a label to make aggregation easier * Add explicit query_type to a couple queries * Add comment * s/subsystem/subservice/g --- .../horizon/internal/db2/history/orderbook.go | 3 + .../horizon/internal/db2/history/trade.go | 3 + services/horizon/internal/init.go | 10 +-- support/db/metrics.go | 90 +++++++++++++------ 4 files changed, 76 insertions(+), 30 deletions(-) diff --git a/services/horizon/internal/db2/history/orderbook.go b/services/horizon/internal/db2/history/orderbook.go index 4ea068f022..3de321a4ac 100644 --- a/services/horizon/internal/db2/history/orderbook.go +++ b/services/horizon/internal/db2/history/orderbook.go @@ -6,6 +6,7 @@ import ( "math/big" "github.com/stellar/go/amount" + "github.com/stellar/go/support/db" "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) @@ -101,6 +102,8 @@ func (q *Q) GetOrderBookSummary(ctx context.Context, sellingAsset, buyingAsset x LIMIT $3 ) ` + // Add explicit query type for prometheus metrics, since we use raw sql. + ctx = context.WithValue(ctx, &db.QueryTypeContextKey, db.SelectQueryType) err = q.SelectRaw(ctx, &levels, selectPriceLevels, selling, buying, maxPriceLevels) if err != nil { return result, errors.Wrap(err, "cannot select price levels") diff --git a/services/horizon/internal/db2/history/trade.go b/services/horizon/internal/db2/history/trade.go index a291d0357e..2cf66cd312 100644 --- a/services/horizon/internal/db2/history/trade.go +++ b/services/horizon/internal/db2/history/trade.go @@ -8,6 +8,7 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/stellar/go/services/horizon/internal/db2" + "github.com/stellar/go/support/db" "github.com/stellar/go/support/errors" "github.com/stellar/go/xdr" ) @@ -195,6 +196,8 @@ func (q *TradesQ) Select(ctx context.Context, dest interface{}) error { return errors.New("TradesQ.Page call is required before calling Select") } + // Add explicit query type for prometheus metrics, since we use raw sql. + ctx = context.WithValue(ctx, &db.QueryTypeContextKey, db.SelectQueryType) if q.rawSQL != "" { q.Err = q.parent.SelectRaw(ctx, dest, q.rawSQL, q.rawArgs...) } else { diff --git a/services/horizon/internal/init.go b/services/horizon/internal/init.go index 5665e125e0..f776081dd2 100644 --- a/services/horizon/internal/init.go +++ b/services/horizon/internal/init.go @@ -18,7 +18,7 @@ import ( "github.com/stellar/go/support/log" ) -func mustNewDBSession(subsystem db.Subsystem, databaseURL string, maxIdle, maxOpen int, registry *prometheus.Registry) db.SessionInterface { +func mustNewDBSession(subservice db.Subservice, databaseURL string, maxIdle, maxOpen int, registry *prometheus.Registry) db.SessionInterface { session, err := db.Open("postgres", databaseURL) if err != nil { log.Fatalf("cannot open Horizon DB: %v", err) @@ -26,7 +26,7 @@ func mustNewDBSession(subsystem db.Subsystem, databaseURL string, maxIdle, maxOp session.DB.SetMaxIdleConns(maxIdle) session.DB.SetMaxOpenConns(maxOpen) - return db.RegisterMetrics(session, "horizon", subsystem, registry) + return db.RegisterMetrics(session, "horizon", subservice, registry) } func mustInitHorizonDB(app *App) { @@ -44,7 +44,7 @@ func mustInitHorizonDB(app *App) { } app.historyQ = &history.Q{mustNewDBSession( - db.HistorySubsystem, + db.HistorySubservice, app.config.DatabaseURL, maxIdle, maxOpen, @@ -57,12 +57,12 @@ func initIngester(app *App) { var coreSession db.SessionInterface if !app.config.EnableCaptiveCoreIngestion { coreSession = mustNewDBSession( - db.CoreSubsystem, app.config.StellarCoreDatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry) + db.CoreSubservice, app.config.StellarCoreDatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry) } app.ingester, err = ingest.NewSystem(ingest.Config{ CoreSession: coreSession, HistorySession: mustNewDBSession( - db.IngestSubsystem, app.config.DatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry, + db.IngestSubservice, app.config.DatabaseURL, ingest.MaxDBConnections, ingest.MaxDBConnections, app.prometheusRegistry, ), NetworkPassphrase: app.config.NetworkPassphrase, // TODO: diff --git a/support/db/metrics.go b/support/db/metrics.go index 1dbfed3d8e..1733d2d1d7 100644 --- a/support/db/metrics.go +++ b/support/db/metrics.go @@ -16,11 +16,11 @@ type CtxKey string var RouteContextKey = CtxKey("route") var QueryTypeContextKey = CtxKey("query_type") -type Subsystem string +type Subservice string -var CoreSubsystem = Subsystem("core") -var HistorySubsystem = Subsystem("history") -var IngestSubsystem = Subsystem("ingest") +var CoreSubservice = Subservice("core") +var HistorySubservice = Subservice("history") +var IngestSubservice = Subservice("ingest") type QueryType string @@ -55,35 +55,40 @@ type SessionWithMetrics struct { maxLifetimeClosedCounter prometheus.CounterFunc } -func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *prometheus.Registry) SessionInterface { - subsystem := fmt.Sprintf("db_%s", sub) +func RegisterMetrics(base *Session, namespace string, sub Subservice, registry *prometheus.Registry) SessionInterface { s := &SessionWithMetrics{ SessionInterface: base, registry: registry, } s.queryCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{Namespace: namespace, Subsystem: subsystem, Name: "query_total"}, + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: "db", + Name: "query_total", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, + }, []string{"query_type", "error", "route"}, ) registry.MustRegister(s.queryCounter) s.queryDurationSummary = prometheus.NewSummaryVec( prometheus.SummaryOpts{ - Namespace: namespace, Subsystem: subsystem, - Name: "query_duration_seconds", + Namespace: namespace, Subsystem: "db", + Name: "query_duration_seconds", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, []string{"query_type", "error", "route"}, ) registry.MustRegister(s.queryDurationSummary) // txnCounter: prometheus.NewCounter( - // prometheus.CounterOpts{Namespace: namespace, Subsystem: subsystem, Name: "transaction_total"}, + // prometheus.CounterOpts{Namespace: namespace, Subsystem: "db", Name: "transaction_total"}, // ), // registry.MustRegister(s.txnCounter) // txnDuration: prometheus.NewHistogram( // prometheus.HistogramOpts{ - // Namespace: namespace, Subsystem: subsystem, + // Namespace: namespace, Subsystem: "db", // Name: "transaction_duration_seconds", // Buckets: prometheus.ExponentialBuckets(0.1, 3, 5), // }, @@ -91,7 +96,12 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p // registry.MustRegister(s.txnDuration) s.maxOpenConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "max_open_connections"}, + prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "db", + Name: "max_open_connections", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, + }, func() float64 { // Right now MaxOpenConnections in Horizon is static however it's possible that // it will change one day. In such case, using GaugeFunc is very cheap and will @@ -102,7 +112,12 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p registry.MustRegister(s.maxOpenConnectionsGauge) s.openConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "open_connections"}, + prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "db", + Name: "open_connections", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, + }, func() float64 { return float64(base.DB.Stats().OpenConnections) }, @@ -110,7 +125,12 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p registry.MustRegister(s.openConnectionsGauge) s.inUseConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "in_use_connections"}, + prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "db", + Name: "in_use_connections", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, + }, func() float64 { return float64(base.DB.Stats().InUse) }, @@ -118,7 +138,12 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p registry.MustRegister(s.inUseConnectionsGauge) s.idleConnectionsGauge = prometheus.NewGaugeFunc( - prometheus.GaugeOpts{Namespace: namespace, Subsystem: subsystem, Name: "idle_connections"}, + prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: "db", + Name: "idle_connections", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, + }, func() float64 { return float64(base.DB.Stats().Idle) }, @@ -127,8 +152,11 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p s.waitCountCounter = prometheus.NewCounterFunc( prometheus.CounterOpts{ - Namespace: namespace, Subsystem: subsystem, Name: "wait_count_total", - Help: "total number of number of connections waited for", + Namespace: namespace, + Subsystem: "db", + Name: "wait_count_total", + Help: "total number of number of connections waited for", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, func() float64 { return float64(base.DB.Stats().WaitCount) @@ -138,8 +166,11 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p s.waitDurationCounter = prometheus.NewCounterFunc( prometheus.CounterOpts{ - Namespace: namespace, Subsystem: subsystem, Name: "wait_duration_seconds_total", - Help: "total time blocked waiting for a new connection", + Namespace: namespace, + Subsystem: "db", + Name: "wait_duration_seconds_total", + Help: "total time blocked waiting for a new connection", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, func() float64 { return base.DB.Stats().WaitDuration.Seconds() @@ -149,8 +180,11 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p s.maxIdleClosedCounter = prometheus.NewCounterFunc( prometheus.CounterOpts{ - Namespace: namespace, Subsystem: subsystem, Name: "max_idle_closed_total", - Help: "total number of number of connections closed due to SetMaxIdleConns", + Namespace: namespace, + Subsystem: "db", + Name: "max_idle_closed_total", + Help: "total number of number of connections closed due to SetMaxIdleConns", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, func() float64 { return float64(base.DB.Stats().MaxIdleClosed) @@ -160,8 +194,11 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p s.maxIdleTimeClosedCounter = prometheus.NewCounterFunc( prometheus.CounterOpts{ - Namespace: namespace, Subsystem: subsystem, Name: "max_idle_time_closed_total", - Help: "total number of number of connections closed due to SetConnMaxIdleTime", + Namespace: namespace, + Subsystem: "db", + Name: "max_idle_time_closed_total", + Help: "total number of number of connections closed due to SetConnMaxIdleTime", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, func() float64 { return float64(base.DB.Stats().MaxIdleTimeClosed) @@ -171,8 +208,11 @@ func RegisterMetrics(base *Session, namespace string, sub Subsystem, registry *p s.maxLifetimeClosedCounter = prometheus.NewCounterFunc( prometheus.CounterOpts{ - Namespace: namespace, Subsystem: subsystem, Name: "max_lifetime_closed_total", - Help: "total number of number of connections closed due to SetConnMaxLifetime", + Namespace: namespace, + Subsystem: "db", + Name: "max_lifetime_closed_total", + Help: "total number of number of connections closed due to SetConnMaxLifetime", + ConstLabels: prometheus.Labels{"subservice": string(sub)}, }, func() float64 { return float64(base.DB.Stats().MaxLifetimeClosed) From e5f431919de250aea748d741cf09fbba25cb350b Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 18 May 2021 15:52:41 -0700 Subject: [PATCH 45/67] `regulated-assets-approval-server/internal/`: Implement minimum kyc logic to approve or reject incoming transactions with action required response (#3598) * add migrate up sql Signed-off-by: Lawrence Lawson * add db and kyc threshold to tx-approve handler Signed-off-by: Lawrence Lawson * update toml with new acceptance criteria Signed-off-by: Lawrence Lawson * add dummy kyc condition code Signed-off-by: Lawrence Lawson * add NewActionRequiredTxApprovalResponse - implementation not complete Signed-off-by: Lawrence Lawson * update toml test Signed-off-by: Lawrence Lawson * add baseurl - update tx_approve tests Signed-off-by: Lawrence Lawson * fix tests with correct kycThreshold value Signed-off-by: Lawrence Lawson * update sql Signed-off-by: Lawrence Lawson * pass base url to handler Signed-off-by: Lawrence Lawson * add callback_id Signed-off-by: Lawrence Lawson * WIP add handleKYCRequiredOperation - logs the incoming kycable requests to database - returns the action required response Signed-off-by: Lawrence Lawson * WIP TestAPI_KYCIntegration Signed-off-by: Lawrence Lawson * WIP decouple kyc rule Signed-off-by: Lawrence Lawson * whitespace cleanup Signed-off-by: Lawrence Lawson * refactor and decouple kyc rule logic Signed-off-by: Lawrence Lawson * Revert "add migrate up sql" This reverts commit db53eaebc5bbb1908cf9b9de6371bcfbda79393f. Signed-off-by: Lawrence Lawson * add migration file Signed-off-by: Lawrence Lawson * Remove loose ends logic Signed-off-by: Lawrence Lawson * restore whitespace Signed-off-by: Lawrence Lawson * remove BaseURL param to txApprove andler - dont need it until theres a action URL to follow Signed-off-by: Lawrence Lawson * Communicate action required methods are not yet implemented. Signed-off-by: Lawrence Lawson * improve not implemented communication Signed-off-by: Lawrence Lawson * add go list Signed-off-by: Lawrence Lawson * update go list Signed-off-by: Lawrence Lawson * remove callback_id column Signed-off-by: Lawrence Lawson * fix dependencies - dont need uuid for callback_id yet Signed-off-by: Lawrence Lawson * changes to comments Signed-off-by: Lawrence Lawson * fix comments Signed-off-by: Lawrence Lawson * remove action required response loose ends - remove action url, action method, action fields - reduce confusion of having params in response that are always empty Signed-off-by: Lawrence Lawson * add TestTxApproveHandlerValidateKYC Signed-off-by: Lawrence Lawson * add TestTxApproveHandlerHandleKYCRequiredOperationIfNeeded Signed-off-by: Lawrence Lawson * add comments Signed-off-by: Lawrence Lawson * update comment Signed-off-by: Lawrence Lawson * remove unneeded line Signed-off-by: Lawrence Lawson * add whitespace Signed-off-by: Lawrence Lawson * update sql file and query - table includes stellar_address,created_at,callbackID, email_address, kyc_submitted_at, approved_at, rejected_at - update dependencies to have uuid - update insert into query in handleKYCRequiredOperation Signed-off-by: Lawrence Lawson * add WIP post_handeler for kyc-status - Add baseURL param for tx-approve handler Signed-off-by: Lawrence Lawson * update NewActionRequiredTxApprovalResponse Signed-off-by: Lawrence Lawson * update tx-approve kyc logic - inserts and returns stellar_address, callback_id to/from db - WIP update response for action url - WIP update breaking test Signed-off-by: Lawrence Lawson * fix validate test Signed-off-by: Lawrence Lawson * fix kyc tests Signed-off-by: Lawrence Lawson * WIP kyc post req test Signed-off-by: Lawrence Lawson * update test with rejected case Signed-off-by: Lawrence Lawson * WIP cleanup post_handler Signed-off-by: Lawrence Lawson * Update toml Signed-off-by: Lawrence Lawson * remove "not implemented communication" Signed-off-by: Lawrence Lawson * test no email in request Signed-off-by: Lawrence Lawson * Test repeated KYC attempt after approval. Signed-off-by: Lawrence Lawson * update whitespace Signed-off-by: Lawrence Lawson * test repeated attempt after rejection Signed-off-by: Lawrence Lawson * change comment Signed-off-by: Lawrence Lawson * test not found Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * update action required message Signed-off-by: Lawrence Lawson * add table of contents Signed-off-by: Lawrence Lawson * add rejection and approval results to query - add logic if approved or rejected from KYC flow Signed-off-by: Lawrence Lawson * add integration test resubmit and revise after kyc - after rejection and approval Signed-off-by: Lawrence Lawson * remove not implemented comments Signed-off-by: Lawrence Lawson * remove comment Signed-off-by: Lawrence Lawson * remove double log Signed-off-by: Lawrence Lawson * change UUID in docs to callback_id Signed-off-by: Lawrence Lawson * add missing require.NoError(t, err) Signed-off-by: Lawrence Lawson * clarify not found Signed-off-by: Lawrence Lawson * extract kyc response Signed-off-by: Lawrence Lawson * update kyc status response obj - rename vars - add render func Signed-off-by: Lawrence Lawson * whitespace refactor Signed-off-by: Lawrence Lawson * change to database cannot be nil error in validate Signed-off-by: Lawrence Lawson * add validate test Signed-off-by: Lawrence Lawson * log response and err like in tx_approve Signed-off-by: Lawrence Lawson * add TestIsKYCRuleRespected Signed-off-by: Lawrence Lawson * test buildUpdateKYCQuery Signed-off-by: Lawrence Lawson * grammar Signed-off-by: Lawrence Lawson * clean test Signed-off-by: Lawrence Lawson * comments grammar Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * move responses closer to handler - make response SEP8 compliant Signed-off-by: Lawrence Lawson * add newline before migrate down Signed-off-by: Lawrence Lawson * update queries in api_test - change callbackID vars Signed-off-by: Lawrence Lawson * fix expected json response Signed-off-by: Lawrence Lawson * make acceptance criteria one line Signed-off-by: Lawrence Lawson * reformat tx_approve - improve readability Signed-off-by: Lawrence Lawson * change func name (validateKYC) to kycRules Signed-off-by: Lawrence Lawson * change to kycRules Signed-off-by: Lawrence Lawson * remove chi call - decode from the request Signed-off-by: Lawrence Lawson * shorten kycRuleRespected Signed-off-by: Lawrence Lawson * init kycAmmount directly Signed-off-by: Lawrence Lawson * make post_handler more readable Signed-off-by: Lawrence Lawson * rename test funct Signed-off-by: Lawrence Lawson * update README real KYC rejection response Signed-off-by: Lawrence Lawson * update KYC rule to be x instead of xx Signed-off-by: Lawrence Lawson * add more newlines to accounts kyc status sql Signed-off-by: Lawrence Lawson * rename kycRules to kycRequiredMessageIfNeeded Signed-off-by: Lawrence Lawson * move method tests to post_handler_test Signed-off-by: Lawrence Lawson * fix repeated comment Signed-off-by: Lawrence Lawson * add more new lines to improve readability Signed-off-by: Lawrence Lawson * update README with correct response Signed-off-by: Lawrence Lawson * Apply suggestions from code review Co-authored-by: Marcelo Salloum dos Santos * refactor/reorganize api_test - add if approved on db side test Signed-off-by: Lawrence Lawson * remove redundant validate call Signed-off-by: Lawrence Lawson * Update declaration to be idiomatic Signed-off-by: Lawrence Lawson * changed to camelCase Signed-off-by: Lawrence Lawson * remove var ( Signed-off-by: Lawrence Lawson * refactor expectedArgs instansiation Signed-off-by: Lawrence Lawson * change kycThresholdAmount back to amount.ParseInt64("500") Signed-off-by: Lawrence Lawson * add TestRxEmail Signed-off-by: Lawrence Lawson * comment and space out buildUpdateKYCQuery Signed-off-by: Lawrence Lawson * refactor and space out tx_approve_test and api_test Signed-off-by: Lawrence Lawson * change header heiarchy to reflect toc Signed-off-by: Lawrence Lawson * add convertThresholdToReadableString and test Signed-off-by: Lawrence Lawson * apply convertThresholdToReadableString to messages that print kycThreshold Signed-off-by: Lawrence Lawson * remove var parens Signed-off-by: Lawrence Lawson Co-authored-by: Marcelo Salloum dos Santos --- go.list | 1 + go.mod | 1 + go.sum | 2 + .../README.md | 93 ++- .../migrations/accounts-kyc-status.sql | 15 + .../internal/serve/kyc-status/api_test.go | 201 ++++++ .../internal/serve/kyc-status/post_handler.go | 161 +++++ .../serve/kyc-status/post_handler_test.go | 79 +++ .../internal/serve/serve.go | 20 + .../internal/serve/toml.go | 12 +- .../internal/serve/toml_test.go | 6 +- .../internal/serve/tx_approve.go | 105 +++- .../internal/serve/tx_approve_response.go | 29 +- .../internal/serve/tx_approve_test.go | 590 +++++++++++++++++- 14 files changed, 1270 insertions(+), 45 deletions(-) create mode 100644 services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go diff --git a/go.list b/go.list index 12ef698517..94bbf6138f 100644 --- a/go.list +++ b/go.list @@ -40,6 +40,7 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db github.com/google/go-cmp v0.2.0 github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 github.com/google/martian v2.1.0+incompatible +github.com/google/uuid v1.2.0 github.com/googleapis/gax-go v2.0.2+incompatible github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 github.com/gorilla/context v1.1.1 diff --git a/go.mod b/go.mod index ddf2df57fe..9df8563e65 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/gobuffalo/packr v1.12.1 // indirect github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 // indirect github.com/google/martian v2.1.0+incompatible // indirect + github.com/google/uuid v1.2.0 github.com/googleapis/gax-go v2.0.2+incompatible // indirect github.com/gorilla/schema v1.1.0 github.com/graph-gophers/graphql-go v0.0.0-20190225005345-3e8838d4614c diff --git a/go.sum b/go.sum index bd458e5351..a2c1d61dc2 100644 --- a/go.sum +++ b/go.sum @@ -69,6 +69,8 @@ github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5 h1:oERTZ1buO github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index 1049146955..28db00d38f 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -12,6 +12,21 @@ intended for **testing only**. It is being conceived to: 2. Serve as a demo server where wallets can test and validate their SEP-8 implementation. +## Table of Contents + +* [regulated\-assets\-approval\-server](#regulated-assets-approval-server) + * [Table of Contents](#table-of-contents) + * [Usage](#usage) + * [Usage: Migrate](#usage-migrate) + * [Usage: Serve](#usage-serve) + * [Account Setup](#account-setup) + * [GET /friendbot?addr=\{stellar\_address\}](#get-friendbotaddrstellar_address) + * [API Spec](#api-spec) + * [POST /tx\-approve](#post-tx-approve) + * [POST /kyc\-status/\{CALLBACK\_ID\}](#post-kyc-statuscallback_id) + +Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc.go) + ## Usage ```sh @@ -79,10 +94,23 @@ link](https://laboratory.stellar.org/#txbuilder?params=eyJhdHRyaWJ1dGVzIjp7ImZlZ to set those flags. Just click the link, fulfill the account address, sequence number, then the account secret and submit the transaction. -### API Spec -#### `POST /tx-approve` +After setting up the issuer account you can fund a stellar account with an initial balance of the regulated asset with our internal `friendbot/?addr={stellar_address}` endpoint. +This endpoint is not part of the official SEP-8 Approval Server spec, it's a debug feature to allow accounts to test sending transactions (payments with the issuer's regulated asset) to the server. + +### `GET /friendbot?addr={stellar_address}` + +This endpoint sends a payment of 10,000 (this value is configurable) regulated +assets to the provided `addr`. Please be aware the address must first establish +a trustline to the regulated asset in order to receive that payment. You can use +[this +link](https://laboratory.stellar.org/#txbuilder?params=eyJhdHRyaWJ1dGVzIjp7ImZlZSI6IjEwMCIsImJhc2VGZWUiOiIxMDAiLCJtaW5GZWUiOiIxMDAifSwiZmVlQnVtcEF0dHJpYnV0ZXMiOnsibWF4RmVlIjoiMTAwIn0sIm9wZXJhdGlvbnMiOlt7ImlkIjowLCJhdHRyaWJ1dGVzIjp7ImFzc2V0Ijp7InR5cGUiOiJjcmVkaXRfYWxwaGFudW00IiwiY29kZSI6IiIsImlzc3VlciI6IiJ9fSwibmFtZSI6ImNoYW5nZVRydXN0In1dfQ%3D%3D&network=test) +to do that in Stellar Laboratory. + +## API Spec +### `POST /tx-approve` This is the core [SEP-8] endpoint used to validate and process approval/revision/rejection of regulated assets transactions. +Note: The example responses below have set their `base-url` env var to `"https://sep8-base-url.com"`. **Request:** @@ -112,14 +140,61 @@ _Rejected:_ "error": "There is one or more unauthorized operations in the provided transaction." } ``` -#### `GET /friendbot?addr=GDDIO6SFRD4SJEQFJOSKPIDYTDM7LM4METFBKN4NFGVR5DTGB7H75N5S` -This endpoint sends a payment of 10,000 (this value is configurable) regulated -assets to the provided `addr`. Please be aware the address must first establish -a trustline to the regulated asset in order to receive that payment. You can use -[this -link](https://laboratory.stellar.org/#txbuilder?params=eyJhdHRyaWJ1dGVzIjp7ImZlZSI6IjEwMCIsImJhc2VGZWUiOiIxMDAiLCJtaW5GZWUiOiIxMDAifSwiZmVlQnVtcEF0dHJpYnV0ZXMiOnsibWF4RmVlIjoiMTAwIn0sIm9wZXJhdGlvbnMiOlt7ImlkIjowLCJhdHRyaWJ1dGVzIjp7ImFzc2V0Ijp7InR5cGUiOiJjcmVkaXRfYWxwaGFudW00IiwiY29kZSI6IiIsImlzc3VlciI6IiJ9fSwibmFtZSI6ImNoYW5nZVRydXN0In1dfQ%3D%3D&network=test) -to do that in Stellar Laboratory. +_Action Required:_ + +```json +{ + "status": "action_required", + "message": "Payments exceeding 500.00 GOAT needs KYC approval. Please provide an email address.", + "action_url": "https://sep8-base-url.com/kyc-status/cf4fe081-5b38-48b6-86ed-1bcfb7171c7d", + "action_method": "POST", + "action_fields": [ + "email_address" + ] +} +``` + +### `POST /kyc-status/{CALLBACK_ID}` + +This endpoint is used for the extra action after `/tx-approve`, as described in +the SEP-8 [Action Required] section. + +Currently an arbitrarily criteria is implemented, email addresses starting with "x" will have the KYC +automatically denied while all other emails will be accepted. + +Note: Subsequent KYC attempts with new (valid)emails addresses will approve your account for KYC required transactions. + +**Request:** + +```json +{ + "email_address": "foo@bar.com" +} +``` + +**Response:** + +```json +{ + "result": "no_further_action_required", +} +``` + +After the user has been approved or rejected they can POST their transaction to [`POST /tx-approve`](#post-tx-approve) for revision. + +If their KYC was rejected they should see a rejection response. +**Response (rejected for emails staring with "x"):** + +```json +{ + "status": "rejected", + "error": "Your KYC was rejected and you're not authorized for operations above 500.00 GOAT." +} +``` + + [SEP-8]: https://github.com/stellar/stellar-protocol/blob/7c795bb9abc606cd1e34764c4ba07900d58fe26e/ecosystem/sep-0008.md [authorization flags]: https://github.com/stellar/stellar-protocol/blob/7c795bb9abc606cd1e34764c4ba07900d58fe26e/ecosystem/sep-0008.md#authorization-flags +[Action Required]: https://github.com/stellar/stellar-protocol/blob/7c795bb9abc606cd1e34764c4ba07900d58fe26e/ecosystem/sep-0008.md#action-required diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql b/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql new file mode 100644 index 0000000000..a40e01892b --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql @@ -0,0 +1,15 @@ +-- +migrate Up + +CREATE TABLE public.accounts_kyc_status ( + stellar_address text NOT NULL PRIMARY KEY, + callback_id text NOT NULL, + email_address text, + created_at timestamp with time zone NOT NULL DEFAULT NOW(), + kyc_submitted_at timestamp with time zone, + approved_at timestamp with time zone, + rejected_at timestamp with time zone +); + +-- +migrate Down + +DROP TABLE public.accounts_kyc_status; \ No newline at end of file diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go new file mode 100644 index 0000000000..c55327c740 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go @@ -0,0 +1,201 @@ +package kycstatus + +import ( + "context" + "database/sql" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/go-chi/chi" + "github.com/google/uuid" + "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAPI_POSTKYCStatus(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Create kyc-status PostHandler. + postHandler := PostHandler{ + DB: conn, + } + + // INSERT new unverified account in db's accounts_kyc_status table. + const insertNewAccountQuery = ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id) + VALUES ($1, $2) + ` + approveKP := keypair.MustRandom() + callbackID := uuid.New().String() + _, err := postHandler.DB.ExecContext(ctx, insertNewAccountQuery, approveKP.Address(), callbackID) + require.NoError(t, err) + + // Preparing and send /kyc-status/{callback_id} POST request. + m := chi.NewMux() + m.Post("/kyc-status/{callback_id}", postHandler.ServeHTTP) + reqBody := `{ + "email_address": "TestEmail@email.com" + }` + r := httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(reqBody)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for approved account. + var kycStatusPOSTResponseApprove kycPostResponse + err = json.Unmarshal(body, &kycStatusPOSTResponseApprove) + require.NoError(t, err) + wantPostResponse := kycPostResponse{ + Result: "no_further_action_required", + } + assert.Equal(t, wantPostResponse, kycStatusPOSTResponseApprove) + + // Query db's accounts_kyc_status table account after /kyc-status/{callback_id} POST request. + const selectAccountQuery = ` + SELECT approved_at, rejected_at + FROM accounts_kyc_status + WHERE callback_id = $1 + ` + var approvedAt, rejectedAt sql.NullTime + err = postHandler.DB.QueryRowContext(ctx, selectAccountQuery, callbackID).Scan(&approvedAt, &rejectedAt) + require.NoError(t, err) + + // TEST if account in db's accounts_kyc_status table was approved. + // sql.NullTime.Valid is true if Time is not NULL + assert.True(t, approvedAt.Valid) + assert.False(t, rejectedAt.Valid) + + // INSERT new unverified account in db's accounts_kyc_status table. + rejectedKP := keypair.MustRandom() + callbackIDRejected := uuid.New().String() + _, err = postHandler.DB.ExecContext(ctx, insertNewAccountQuery, rejectedKP.Address(), callbackIDRejected) + require.NoError(t, err) + + // Preparing and send /kyc-status/{callback_id} POST request. + reqBody = `{ + "email_address": "xTestEmail@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDRejected), strings.NewReader(reqBody)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for rejected account. + var kycStatusPOSTResponseRejected kycPostResponse + err = json.Unmarshal(body, &kycStatusPOSTResponseRejected) + require.NoError(t, err) + wantPostResponse = kycPostResponse{ + Result: "no_further_action_required", + } + assert.Equal(t, wantPostResponse, kycStatusPOSTResponseRejected) + + // Query db's accounts_kyc_status table account after /kyc-status/{callback_id} POST request. + err = postHandler.DB.QueryRowContext(ctx, selectAccountQuery, callbackIDRejected).Scan(&approvedAt, &rejectedAt) + require.NoError(t, err) + + // TEST if account in db's accounts_kyc_status table was rejected. + // Should be rejected based on arbitrary rule where emails begin with "x". + // sql.NullTime.Valid is true if Time is not NULL + assert.True(t, rejectedAt.Valid) + assert.False(t, approvedAt.Valid) + + // Preparing and send /kyc-status/{callback_id} POST request; using the rejected account's callback_ID. + reqBody = `{ + "email_address": "TestEmailx@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDRejected), strings.NewReader(reqBody)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for repeated KYC request after REJECTED w/ new email. + var kycStatusPOSTResponseRejectedNewEmail kycPostResponse + err = json.Unmarshal(body, &kycStatusPOSTResponseRejectedNewEmail) + require.NoError(t, err) + wantPostResponse = kycPostResponse{ + Result: "no_further_action_required", + } + assert.Equal(t, wantPostResponse, kycStatusPOSTResponseRejectedNewEmail) + + // Query db's accounts_kyc_status table account after /kyc-status/{callback_id} POST request. + selectUpdatedAccountEmailQuery := ` + SELECT approved_at, rejected_at, email_address + FROM accounts_kyc_status + WHERE callback_id = $1 + ` + var updatedEmail string + err = postHandler.DB.QueryRowContext(ctx, selectUpdatedAccountEmailQuery, callbackIDRejected).Scan(&approvedAt, &rejectedAt, &updatedEmail) + require.NoError(t, err) + + // TEST if account in db's accounts_kyc_status table was approved, and email was overwritten. + // sql.NullTime.Valid is true if Time is not NULL + assert.True(t, approvedAt.Valid) + assert.False(t, rejectedAt.Valid) + assert.NotEqual(t, "xTestEmail@email.com", updatedEmail) + + // Preparing and send /kyc-status/{callback_id} POST request; w/ empty email value. + noEmailKP := keypair.MustRandom() + callbackIDNoEmail := uuid.New().String() + _, err = postHandler.DB.ExecContext(ctx, insertNewAccountQuery, noEmailKP.Address(), callbackIDNoEmail) + require.NoError(t, err) + reqBody = `{ + "email_address": "" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDNoEmail), strings.NewReader(reqBody)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "Missing email_address" error response. + wantPostResponseMissingEmail := `{ + "error": "Missing email_address." + }` + require.JSONEq(t, wantPostResponseMissingEmail, string(body)) + + // Preparing and send /kyc-status/{callback_id} POST request; callback_id not registered. + callbackIDNotFound := uuid.New().String() + reqBody = `{ + "email_address": "notFound@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDNotFound), strings.NewReader(reqBody)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusNotFound, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "Not Found" error response. + wantPostResponseNotFound := `{ + "error": "Not found." + }` + require.JSONEq(t, wantPostResponseNotFound, string(body)) +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go new file mode 100644 index 0000000000..e5dcb800c5 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go @@ -0,0 +1,161 @@ +package kycstatus + +import ( + "context" + "fmt" + "net/http" + "regexp" + "strings" + + "github.com/jmoiron/sqlx" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" + "github.com/stellar/go/support/errors" + "github.com/stellar/go/support/http/httpdecode" + "github.com/stellar/go/support/log" + "github.com/stellar/go/support/render/httpjson" +) + +type kycPostRequest struct { + CallbackID string `path:"callback_id"` + EmailAddress string `json:"email_address"` +} + +type kycPostResponse struct { + Result string `json:"result"` + StatusCode int `json:"-"` +} + +func (k *kycPostResponse) Render(w http.ResponseWriter) { + httpjson.RenderStatus(w, k.StatusCode, k, httpjson.JSON) +} + +func NewKYCStatusPostResponse() *kycPostResponse { + return &kycPostResponse{ + Result: "no_further_action_required", + StatusCode: http.StatusOK, + } +} + +type PostHandler struct { + DB *sqlx.DB +} + +func (h PostHandler) validate() error { + if h.DB == nil { + return errors.New("database cannot be nil") + } + return nil +} + +func (h PostHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + err := h.validate() + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating kyc-status PostHandler")) + httperror.InternalServer.Render(w) + return + } + + in := kycPostRequest{} + err = httpdecode.Decode(r, &in) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "decoding kyc-status POST Request")) + httperror.BadRequest.Render(w) + return + } + + kycResponse, err := h.handle(ctx, in) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating the input POST request for kyc-status")) + httpErr, ok := err.(*httperror.Error) + if !ok { + httpErr = httperror.InternalServer + } + httpErr.Render(w) + return + } + + kycResponse.Render(w) +} + +func (h PostHandler) handle(ctx context.Context, in kycPostRequest) (resp *kycPostResponse, err error) { + defer func() { + log.Ctx(ctx).Debug("==== will log responses ====") + log.Ctx(ctx).Debugf("req: %+v", in) + log.Ctx(ctx).Debugf("resp: %+v", resp) + log.Ctx(ctx).Debugf("err: %+v", err) + log.Ctx(ctx).Debug("==== did log responses ====") + }() + + // Check if kycPostRequest values are present or not malformed. + if in.CallbackID == "" { + return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing callback ID.") + } + if in.EmailAddress == "" { + return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing email_address.") + } + if !RxEmail.MatchString(in.EmailAddress) { + return nil, httperror.NewHTTPError(http.StatusBadRequest, "The provided email_address is invalid.") + } + + var exists bool + query, args := in.buildUpdateKYCQuery() + err = h.DB.QueryRowContext(ctx, query, args...).Scan(&exists) + if err != nil { + return nil, errors.Wrap(err, "querying the database") + } + if !exists { + return nil, httperror.NewHTTPError(http.StatusNotFound, "Not found.") + } + + return NewKYCStatusPostResponse(), nil +} + +// isKYCRuleRespected validates if KYC data is approved or rejected. +// Current rule(s) emails starting "x" are rejected and other emails are automatically approved. +func (in kycPostRequest) isKYCRuleRespected() bool { + return !strings.HasPrefix(strings.ToLower(in.EmailAddress), "x") +} + +// buildUpdateKYCQuery builds a query that will approve or reject stellar account from accounts_kyc_status table. +// Afterwards the query should return an exists boolean if present. +func (in kycPostRequest) buildUpdateKYCQuery() (string, []interface{}) { + var ( + query strings.Builder + args []interface{} + ) + query.WriteString("WITH updated_row AS (") + query.WriteString("UPDATE accounts_kyc_status ") + query.WriteString("SET kyc_submitted_at = NOW(), ") + + // Append email address for query built. + args = append(args, in.EmailAddress) + query.WriteString(fmt.Sprintf("email_address = $%d, ", len(args))) + + // Check if KYC info is approved or rejected + if in.isKYCRuleRespected() { + query.WriteString("approved_at = NOW(), rejected_at = NULL ") + } else { + query.WriteString("rejected_at = NOW(), approved_at = NULL ") + } + + // Append CallbackID for query built. + args = append(args, in.CallbackID) + query.WriteString(fmt.Sprintf("WHERE callback_id = $%d ", len(args))) + + // Build remaining query. + query.WriteString("RETURNING * ") + query.WriteString(")") + query.WriteString(` + SELECT EXISTS( + SELECT * FROM updated_row + ) + `) + + return query.String(), args +} + +// RxEmail is a regex used to validate e-mail addresses, according with the reference https://www.alexedwards.net/blog/validation-snippets-for-go#email-validation. +// It's free to use under the [MIT Licence](https://opensource.org/licenses/MIT) +var RxEmail = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$") diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go new file mode 100644 index 0000000000..5bcdee0bcc --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go @@ -0,0 +1,79 @@ +package kycstatus + +import ( + "testing" + + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestValidate(t *testing.T) { + // Test no db. + h := PostHandler{} + err := h.validate() + require.EqualError(t, err, "database cannot be nil") + // Success. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h = PostHandler{ + DB: conn, + } + err = h.validate() + require.NoError(t, err) +} + +func TestIsKYCRuleRespected(t *testing.T) { + // Test if email approved. + in := kycPostRequest{ + EmailAddress: "test@email.com", + } + approved := in.isKYCRuleRespected() + assert.True(t, approved) + // Test if email rejected. + in = kycPostRequest{ + EmailAddress: "xtest@email.com", + } + approved = in.isKYCRuleRespected() + assert.False(t, approved) +} + +func TestBuildUpdateKYCQuery(t *testing.T) { + // Test query returned if email approved. + in := kycPostRequest{ + CallbackID: "1234567890-12345", + EmailAddress: "test@email.com", + } + query, args := in.buildUpdateKYCQuery() + expectedQuery := "WITH updated_row AS (UPDATE accounts_kyc_status SET kyc_submitted_at = NOW(), email_address = $1, approved_at = NOW(), rejected_at = NULL WHERE callback_id = $2 RETURNING * )\n\t\tSELECT EXISTS(\n\t\t\tSELECT * FROM updated_row\n\t\t)\n\t" + expectedArgs := []interface{}{in.EmailAddress, in.CallbackID} + require.Equal(t, expectedQuery, query) + require.Equal(t, expectedArgs, args) + + // Test query returned if email rejected. + in = kycPostRequest{ + CallbackID: "9999999999-9999", + EmailAddress: "xtest@email.com", + } + query, args = in.buildUpdateKYCQuery() + expectedQuery = "WITH updated_row AS (UPDATE accounts_kyc_status SET kyc_submitted_at = NOW(), email_address = $1, rejected_at = NOW(), approved_at = NULL WHERE callback_id = $2 RETURNING * )\n\t\tSELECT EXISTS(\n\t\t\tSELECT * FROM updated_row\n\t\t)\n\t" + expectedArgs = []interface{}{in.EmailAddress, in.CallbackID} + require.Equal(t, expectedQuery, query) + require.Equal(t, expectedArgs, args) +} + +func TestRxEmail(t *testing.T) { + // Test empty email string. + assert.NotRegexp(t, RxEmail, "") + + // Test empty prefix. + assert.NotRegexp(t, RxEmail, "email.com") + + // Test only domain given. + assert.NotRegexp(t, RxEmail, "@email.com") + + // Test correct email. + assert.Regexp(t, RxEmail, "t@email.com") +} diff --git a/services/regulated-assets-approval-server/internal/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go index 2f5971f6b0..3b75c3aa13 100644 --- a/services/regulated-assets-approval-server/internal/serve/serve.go +++ b/services/regulated-assets-approval-server/internal/serve/serve.go @@ -12,6 +12,8 @@ import ( "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db" + kycstatus "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/kyc-status" "github.com/stellar/go/support/errors" supporthttp "github.com/stellar/go/support/http" "github.com/stellar/go/support/log" @@ -60,6 +62,15 @@ func handleHTTP(opts Options) http.Handler { if err != nil { log.Fatal(errors.Wrapf(err, "%s cannot be parsed as a Stellar amount", opts.KYCRequiredPaymentAmountThreshold)) } + db, err := db.Open(opts.DatabaseURL) + if err != nil { + log.Fatal(errors.Wrap(err, "error parsing database url")) + } + db.SetMaxOpenConns(20) + err = db.Ping() + if err != nil { + log.Warn("Error pinging to Database: ", err) + } mux := chi.NewMux() mux.Use(middleware.RequestID) @@ -88,7 +99,16 @@ func handleHTTP(opts Options) http.Handler { issuerKP: issuerKP, horizonClient: opts.horizonClient(), networkPassphrase: opts.NetworkPassphrase, + db: db, + kycThreshold: parsedKYCRequiredPaymentThreshold, + baseURL: opts.BaseURL, }.ServeHTTP) + mux.Route("/kyc-status", func(mux chi.Router) { + mux.Post("/{callback_id}", kycstatus.PostHandler{ + DB: db, + }.ServeHTTP) + }) + return mux } diff --git a/services/regulated-assets-approval-server/internal/serve/toml.go b/services/regulated-assets-approval-server/internal/serve/toml.go index 9ee09b3852..d50dd39e8f 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml.go +++ b/services/regulated-assets-approval-server/internal/serve/toml.go @@ -55,13 +55,21 @@ func (h stellarTOMLHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { httperror.InternalServer.Render(rw) return } - approvalCriteria := fmt.Sprintf("Currently %s only approves %s payment transactions.", h.approvalServer, h.assetCode) + // Convert kycThreshold value to human readable string; from amount package's int64 5000000000 to 500.00. + kycThreshold, err := convertThresholdToReadableString(h.kycThreshold) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "converting kycThreshold value to human readable string")) + httperror.InternalServer.Render(rw) + return + } + + // Generate toml content. fmt.Fprintf(rw, "NETWORK_PASSPHRASE=%q\n", h.networkPassphrase) fmt.Fprintf(rw, "[[CURRENCIES]]\n") fmt.Fprintf(rw, "code=%q\n", h.assetCode) fmt.Fprintf(rw, "issuer=%q\n", h.issuerAddress) fmt.Fprintf(rw, "regulated=true\n") fmt.Fprintf(rw, "approval_server=%q\n", h.approvalServer) - fmt.Fprintf(rw, "approval_criteria=%q\n", approvalCriteria) + fmt.Fprintf(rw, "approval_criteria=\"The approval server currently only accepts payments. The transaction must have exactly one operation of type payment. If the payment amount exceeds %s %s it will need KYC approval.\"", kycThreshold, h.assetCode) } diff --git a/services/regulated-assets-approval-server/internal/serve/toml_test.go b/services/regulated-assets-approval-server/internal/serve/toml_test.go index ecd5f4ee54..4f552fde10 100644 --- a/services/regulated-assets-approval-server/internal/serve/toml_test.go +++ b/services/regulated-assets-approval-server/internal/serve/toml_test.go @@ -92,7 +92,7 @@ func TestTomlHandler_ServeHTTP(t *testing.T) { assetCode: "FOO", issuerAddress: "GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM", approvalServer: "localhost:8000/tx-approve", - kycThreshold: 10, + kycThreshold: 5000000000, }.ServeHTTP) ctx := context.Background() @@ -107,13 +107,13 @@ func TestTomlHandler_ServeHTTP(t *testing.T) { body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) + wantBody := `NETWORK_PASSPHRASE="` + network.TestNetworkPassphrase + `" [[CURRENCIES]] code="FOO" issuer="GCVDOU4YHHXGM3QYVSDHPQIFMZKXTFSIYO4HJOJZOTR7GURVQO6IQ5HM" regulated=true approval_server="localhost:8000/tx-approve" -approval_criteria="Currently localhost:8000/tx-approve only approves FOO payment transactions." -` +approval_criteria="The approval server currently only accepts payments. The transaction must have exactly one operation of type payment. If the payment amount exceeds 500.00 FOO it will need KYC approval."` require.Equal(t, wantBody, string(body)) } diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go index cc7a71929e..801d93e6ea 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve.go @@ -2,9 +2,14 @@ package serve import ( "context" + "database/sql" + "fmt" "net/http" "strconv" + "github.com/google/uuid" + "github.com/jmoiron/sqlx" + "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" @@ -19,6 +24,9 @@ type txApproveHandler struct { assetCode string horizonClient horizonclient.ClientInterface networkPassphrase string + db *sqlx.DB + kycThreshold int64 + baseURL string } type txApproveRequest struct { @@ -39,12 +47,29 @@ func (h txApproveHandler) validate() error { if h.networkPassphrase == "" { return errors.New("network passphrase cannot be empty") } + if h.db == nil { + return errors.New("database cannot be nil") + } + if h.kycThreshold <= 0 { + return errors.New("kyc threshold cannot be less than or equal to zero") + } + if h.baseURL == "" { + return errors.New("base url cannot be empty") + } return nil } +func convertThresholdToReadableString(threshold int64) (string, error) { + thresholdStr := amount.StringFromInt64(threshold) + res, err := strconv.ParseFloat(thresholdStr, 1) + if err != nil { + return "", errors.Wrap(err, "converting threshold amount from string to float") + } + return fmt.Sprintf("%.2f", res), nil +} + func (h txApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - err := h.validate() if err != nil { log.Ctx(ctx).Error(errors.Wrap(err, "validating txApproveHandler")) @@ -66,6 +91,7 @@ func (h txApproveHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { httperror.InternalServer.Render(w) return } + txApproveResp.Render(w) } @@ -123,6 +149,7 @@ func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (r if txRejectedResp != nil { return txRejectedResp, nil } + paymentOp, ok := tx.Operations()[0].(*txnbuild.Payment) if !ok { log.Ctx(ctx).Error(`transaction contains one or more operations is not of type payment`) @@ -152,7 +179,15 @@ func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (r log.Ctx(ctx).Errorf(`invalid transaction sequence number tx.SourceAccount().Sequence: %d, accountSequence+1:%d`, tx.SourceAccount().Sequence, accountSequence+1) return NewRejectedTxApprovalResponse("Invalid transaction sequence number."), nil } - + // Validate if payment operation requires KYC. + var kycRequiredResponse *txApprovalResponse + kycRequiredResponse, err = h.handleKYCRequiredOperationIfNeeded(ctx, paymentSource, paymentOp) + if err != nil { + return nil, errors.Wrap(err, "handling KYC required payment") + } + if kycRequiredResponse != nil { + return kycRequiredResponse, nil + } // build the transaction revisedOperations := []txnbuild.Operation{ &txnbuild.AllowTrust{ @@ -201,5 +236,71 @@ func (h txApproveHandler) txApprove(ctx context.Context, in txApproveRequest) (r if err != nil { return nil, errors.Wrap(err, "encoding revised transaction") } + return NewRevisedTxApprovalResponse(txe), nil } + +// handleKYCRequiredOperationIfNeeded validates and returns an action_required response if the payment requires KYC. +func (h txApproveHandler) handleKYCRequiredOperationIfNeeded(ctx context.Context, stellarAddress string, paymentOp *txnbuild.Payment) (*txApprovalResponse, error) { + // validate payment operation against KYC condition(s). + KYCRequiredMessage, err := h.kycRequiredMessageIfNeeded(paymentOp) + if err != nil { + return nil, errors.Wrap(err, "validating KYC") + } + if KYCRequiredMessage == "" { + return nil, nil + } + + intendedCallbackID := uuid.New().String() + const q = ` + WITH new_row AS ( + INSERT INTO accounts_kyc_status (stellar_address, callback_id) + VALUES ($1, $2) + ON CONFLICT(stellar_address) DO NOTHING + RETURNING * + ) + SELECT callback_id, approved_at, rejected_at FROM new_row + UNION + SELECT callback_id, approved_at, rejected_at + FROM accounts_kyc_status + WHERE stellar_address = $1 + ` + var ( + callbackID string + approvedAt, rejectedAt sql.NullTime + ) + err = h.db.QueryRowContext(ctx, q, stellarAddress, intendedCallbackID).Scan(&callbackID, &approvedAt, &rejectedAt) + if err != nil { + return nil, errors.Wrap(err, "inserting new row into accounts_kyc_status table") + } + + if approvedAt.Valid { + return nil, nil + } + if rejectedAt.Valid { + return NewRejectedTxApprovalResponse(fmt.Sprintf("Your KYC was rejected and you're not authorized for operations above %s %s.", amount.StringFromInt64(h.kycThreshold), h.assetCode)), nil + } + + return NewActionRequiredTxApprovalResponse( + KYCRequiredMessage, + fmt.Sprintf("%s/kyc-status/%s", h.baseURL, callbackID), + []string{"email_address"}, + ), nil +} + +// kycRequiredMessageIfNeeded returns a "action_required" message for the NewActionRequiredTxApprovalResponse if the payment operation meets KYC conditions. +// Currently rule(s) are, checking if payment amount is > KYCThreshold amount. +func (h txApproveHandler) kycRequiredMessageIfNeeded(paymentOp *txnbuild.Payment) (string, error) { + paymentAmount, err := amount.ParseInt64(paymentOp.Amount) + if err != nil { + return "", errors.Wrap(err, "parsing account payment amount from string to Int64") + } + if paymentAmount > h.kycThreshold { + kycThreshold, err := convertThresholdToReadableString(h.kycThreshold) + if err != nil { + return "", errors.Wrap(err, "converting kycThreshold to human readable string") + } + return fmt.Sprintf(`Payments exceeding %s %s requires KYC approval. Please provide an email address.`, kycThreshold, h.assetCode), nil + } + return "", nil +} diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go index e26875aae2..579d79f300 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_response.go @@ -7,11 +7,14 @@ import ( ) type txApprovalResponse struct { - Error string `json:"error,omitempty"` - Message string `json:"message,omitempty"` - Status sep8Status `json:"status"` - StatusCode int `json:"-"` - Tx string `json:"tx,omitempty"` + Error string `json:"error,omitempty"` + Message string `json:"message,omitempty"` + Status sep8Status `json:"status"` + StatusCode int `json:"-"` + Tx string `json:"tx,omitempty"` + ActionURL string `json:"action_url,omitempty"` + ActionMethod string `json:"action_method,omitempty"` + ActionFields []string `json:"action_fields,omitempty"` } func (t *txApprovalResponse) Render(w http.ResponseWriter) { @@ -35,9 +38,21 @@ func NewRevisedTxApprovalResponse(tx string) *txApprovalResponse { } } +func NewActionRequiredTxApprovalResponse(message, actionURL string, actionFields []string) *txApprovalResponse { + return &txApprovalResponse{ + Status: sep8StatusActionRequired, + Message: message, + ActionMethod: "POST", + StatusCode: http.StatusOK, + ActionURL: actionURL, + ActionFields: actionFields, + } +} + type sep8Status string const ( - sep8StatusRejected sep8Status = "rejected" - sep8StatusRevised sep8Status = "revised" + sep8StatusRejected sep8Status = "rejected" + sep8StatusRevised sep8Status = "revised" + sep8StatusActionRequired sep8Status = "action_required" ) diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go index 4c2105b01d..39b48083ea 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go @@ -3,18 +3,23 @@ package serve import ( "context" "encoding/json" + "fmt" "io/ioutil" "net/http" "net/http/httptest" + "regexp" "strings" "testing" "github.com/go-chi/chi" + "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" "github.com/stellar/go/network" "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/protocols/horizon/base" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + kycstatus "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/kyc-status" "github.com/stellar/go/txnbuild" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -48,19 +53,229 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "network passphrase cannot be empty") + // No db. + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + } + err = h.validate() + require.EqualError(t, err, "database cannot be nil") + // Empty kycThreshold. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + } + err = h.validate() + require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + // Negative kycThreshold. + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: -1, + } + err = h.validate() + require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + // no baseURL. + h = txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: "FOOBAR", + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: 1, + } + err = h.validate() + require.EqualError(t, err, "base url cannot be empty") // Success. h = txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: "FOOBAR", horizonClient: &horizonMock, networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: 1, + baseURL: "https://sep8-server.test", + } + err = h.validate() + require.NoError(t, err) +} + +func TestConvertThresholdToReadableString(t *testing.T) { + // Prepare raw int64 amountValue. + // Context: stellar-core represents asset "amounts" as 64-bit so amounts shown as "500" is represented in stellar-core as 5000000000. + var amountValue int64 = 5000000000 + + // TEST if no error and if "500.00" returned + amountString, err := convertThresholdToReadableString(amountValue) + require.NoError(t, err) + assert.Equal(t, "500.00", amountString) + + // Prepare amount parsed Int64 from string + // Context: env var KYCRequiredPaymentAmountThreshold is the token's unit quantity represented as string. + // This string is converted to int64 and passed to the txApproveHandler for payment evaluation. + parsedThresholdResult, err := amount.ParseInt64("500") + + // TEST if no error and if "500.00" returned + amountString, err = convertThresholdToReadableString(parsedThresholdResult) + require.NoError(t, err) + assert.Equal(t, "500.00", amountString) +} + +func TestTxApproveHandlerKYCRequiredMessageIfNeeded(t *testing.T) { + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Create tx-approve/ txApproveHandler. + issuerAccKeyPair := keypair.MustRandom() + horizonMock := horizonclient.MockClient{} + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + h := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // TEST if txApproveHandler is valid. + err = h.validate() + require.NoError(t, err) + + // Preparing payment op for kycRequiredMessageIfNeeded; payment amount is below kycThreshold. + destinationKP := keypair.MustRandom() + paymentOP := txnbuild.Payment{ + Destination: destinationKP.Address(), + Amount: "100", + Asset: assetGOAT, + } + + // TEST No KYC needed response. actionRequiredMessage should be "". + actionRequiredMessage, err := h.kycRequiredMessageIfNeeded(&paymentOP) + require.NoError(t, err) + require.Empty(t, actionRequiredMessage) + + // Prepare payment op for kycRequiredMessageIfNeeded; payment amount is malformed. + paymentOP = txnbuild.Payment{ + Destination: destinationKP.Address(), + Amount: "ten", + Asset: assetGOAT, + } + + // TEST kycRequiredMessageIfNeeded returns error. + _, err = h.kycRequiredMessageIfNeeded(&paymentOP) + assert.Contains(t, + err.Error(), + `parsing account payment amount from string to Int64: invalid amount format: ten`, + ) + + // Preparing payment op for kycRequiredMessageIfNeeded; payment amount is above kycThreshold. + paymentOP = txnbuild.Payment{ + Destination: destinationKP.Address(), + Amount: "501", + Asset: assetGOAT, + } + + // TEST Successful KYC required response. + // actionRequiredMessage should return "Payments exceeding [kycThreshold] [assetCode] requires KYC approval..." message. + actionRequiredMessage, err = h.kycRequiredMessageIfNeeded(&paymentOP) + require.NoError(t, err) + assert.Equal(t, `Payments exceeding 500.00 GOAT requires KYC approval. Please provide an email address.`, actionRequiredMessage) +} + +func TestTxApproveHandlerHandleKYCRequiredOperationIfNeeded(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Create tx-approve/ txApproveHandler. + issuerAccKeyPair := keypair.MustRandom() + horizonMock := horizonclient.MockClient{} + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + h := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", } + + // TEST if txApproveHandler is valid. err = h.validate() require.NoError(t, err) + + // Prepare payment op whose amount is greater than 500 GOATs. + sourceKP := keypair.MustRandom() + destinationKP := keypair.MustRandom() + paymentOP := txnbuild.Payment{ + SourceAccount: sourceKP.Address(), + Destination: destinationKP.Address(), + Amount: "501", + Asset: assetGOAT, + } + + // TEST successful "action_required" response. + actionRequiredTxApprovalResponse, err := h.handleKYCRequiredOperationIfNeeded(ctx, sourceKP.Address(), &paymentOP) + require.NoError(t, err) + wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("action_required"), + Message: `Payments exceeding 500.00 GOAT requires KYC approval. Please provide an email address.`, + StatusCode: http.StatusOK, + ActionURL: actionRequiredTxApprovalResponse.ActionURL, + ActionMethod: "POST", + ActionFields: []string{"email_address"}, + } + assert.Equal(t, &wantTXApprovalResponse, actionRequiredTxApprovalResponse) + + // TEST if the kyc attempt was logged in db's accounts_kyc_status table. + const q = ` + SELECT stellar_address + FROM accounts_kyc_status + WHERE stellar_address = $1 + ` + var stellarAddress string + err = h.db.QueryRowContext(ctx, q, sourceKP.Address()).Scan(&stellarAddress) + require.NoError(t, err) + assert.Equal(t, sourceKP.Address(), stellarAddress) } func TestTxApproveHandlerTxApprove(t *testing.T) { ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. issuerAccKeyPair := keypair.MustRandom() senderAccKP := keypair.MustRandom() receiverAccKP := keypair.MustRandom() @@ -68,10 +283,6 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { Code: "GOAT", Issuer: issuerAccKeyPair.Address(), } - // Test if no transaction is submitted. - req := txApproveRequest{ - Tx: "", - } horizonMock := horizonclient.MockClient{} horizonMock. On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). @@ -97,12 +308,26 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { AccountID: receiverAccKP.Address(), Sequence: "3", }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) handler := txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: assetGOAT.GetCode(), horizonClient: &horizonMock, networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // Prepare empty "tx" for txApprove. + req := txApproveRequest{ + Tx: "", } + + // TEST "rejected" response if no transaction is submitted. rejectedResponse, err := handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse := txApprovalResponse{ @@ -111,10 +336,13 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if can't parse XDR. + + // Prepare malformed "tx" for txApprove. req = txApproveRequest{ Tx: "BADXDRTRANSACTIONENVELOPE", } + + // TEST "rejected" response if can't parse XDR. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -123,7 +351,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if a non generic transaction fails, same result as malformed XDR. + + // Prepare invalid(non generic transaction) "tx" for txApprove. senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) require.NoError(t, err) tx, err := txnbuild.NewTransaction( @@ -155,10 +384,13 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: feeBumpTxEnc, } + + // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) assert.Equal(t, &wantRejectedResponse, rejectedResponse) // wantRejectedResponse is identical to "if can't parse XDR". - // Test if the transaction sourceAccount the same as the server issuer account. + + // Prepare transaction sourceAccount the same as the server issuer account for txApprove. issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) require.NoError(t, err) tx, err = txnbuild.NewTransaction( @@ -182,6 +414,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } + + // TEST "rejected" response for sender account; transaction sourceAccount the same as the server issuer account. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -190,7 +424,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if the transaction's operation sourceAccount the same as the server issuer account. + + // Prepare transaction where transaction's payment operation sourceAccount the same as the server issuer account. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -213,6 +448,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } + + // TEST "rejected" response for sender account; payment operation sourceAccount the same as the server issuer account. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -221,7 +458,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if operation is not a payment (in this case allowing trust for receiverAccKP). + + // Prepare transaction where operation is not a payment (in this case allowing trust for receiverAccKP). tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -242,6 +480,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } + + // TEST "rejected" response if operation is not a payment (in this case allowing trust for receiverAccKP). rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -250,7 +490,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if multiple operations in transaction. + + // Prepare transaction with multiple operations. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -279,6 +520,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } + + // TEST "rejected" response for sender account; transaction with multiple operations. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -287,8 +530,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { StatusCode: http.StatusBadRequest, } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Test if transaction source account seq num is equal to account sequence+1. - // This tests the scenario where sequence numbers are too far in the future. + + // Prepare transaction where sourceAccount seq num too far in the future. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &horizon.Account{ @@ -314,6 +557,8 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { req = txApproveRequest{ Tx: txEnc, } + + // TEST "rejected" response if transaction source account seq num is not equal to account sequence+1. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -326,6 +571,12 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { func TestAPI_RejectedIntegration(t *testing.T) { ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. issuerAccKeyPair := keypair.MustRandom() assetGOAT := txnbuild.CreditAsset{ Code: "GOAT", @@ -358,13 +609,21 @@ func TestAPI_RejectedIntegration(t *testing.T) { AccountID: receiverAccKP.Address(), Sequence: "3", }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) handler := txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: assetGOAT.GetCode(), horizonClient: &horizonMock, networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", } - // Test if no transaction is submitted. + + // Prepare and send empty "tx" for "/tx-approve" POST request. m := chi.NewMux() m.Post("/tx-approve", handler.ServeHTTP) req := `{ @@ -379,11 +638,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if no transaction is submitted. wantBody := `{ "status":"rejected", "error":"Missing parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - // Test if can't parse XDR. + + // Prepare malformed "tx" for "/tx-approve" POST request. req = `{ "tx": "BADXDRTRANSACTIONENVELOPE" }` @@ -396,11 +658,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if can't parse XDR. wantBody = `{ "status":"rejected", "error":"Invalid parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - // Test if a non generic transaction fails, same result as malformed XDR. + + // Prepare and send invalid(non generic transaction) "tx" for "/tx-approve" POST request. senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) require.NoError(t, err) tx, err := txnbuild.NewTransaction( @@ -441,11 +706,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. wantBody = `{ "status":"rejected", "error":"Invalid parameter \"tx\"." }` require.JSONEq(t, wantBody, string(body)) - // Test if the transaction sourceAccount the same as the server issuer account. + + // Prepare and send "tx" where transaction sourceAccount the same as the server issuer account for "/tx-approve" POST request. issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) require.NoError(t, err) tx, err = txnbuild.NewTransaction( @@ -478,11 +746,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if the transaction sourceAccount the same as the server issuer account. wantBody = `{ "status":"rejected", "error":"The source account is invalid." }` require.JSONEq(t, wantBody, string(body)) - // Test if the transaction's operation sourceAccount the same as the server issuer account. + + // Prepare and send "tx" where transaction's operation sourceAccount the same as the server issuer account for "/tx-approve" POST request. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -514,11 +785,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if the transaction's operation sourceAccount the same as the server issuer account. wantBody = `{ "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." }` require.JSONEq(t, wantBody, string(body)) - // Test if the transaction's operation is not a payment. + + // Prepare and send "tx" where transaction's operation is not a payment for "/tx-approve" POST request. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -549,11 +823,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if transaction's operation is not a payment. wantBody = `{ "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." }` require.JSONEq(t, wantBody, string(body)) - // Test if more than one operation in transaction. + + // Prepare and send "tx" where theres more than one operation in transaction for "/tx-approve" POST request. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &senderAcc, @@ -591,12 +868,14 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if more than one operation in transaction. wantBody = `{ "status":"rejected", "error":"Please submit a transaction with exactly one operation of type payment." }` require.JSONEq(t, wantBody, string(body)) - // Test when transaction source account seq num is not equal to account sequence+1. - // This tests the scenario where sequence numbers are too far in the future. + + // Prepare and send "tx" where transaction's transaction source account seq num is not equal to account sequence+1 for "/tx-approve" POST request. tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ SourceAccount: &horizon.Account{ @@ -631,6 +910,8 @@ func TestAPI_RejectedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST "rejected" response if where transaction's transaction source account seq num is not equal to account sequence+1. wantBody = `{ "status":"rejected", "error":"Invalid transaction sequence number." }` @@ -639,6 +920,12 @@ func TestAPI_RejectedIntegration(t *testing.T) { func TestAPI_RevisedIntegration(t *testing.T) { ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. issuerAccKeyPair := keypair.MustRandom() senderAccKP := keypair.MustRandom() receiverAccKP := keypair.MustRandom() @@ -669,13 +956,21 @@ func TestAPI_RevisedIntegration(t *testing.T) { AccountID: receiverAccKP.Address(), Sequence: "0", }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) handler := txApproveHandler{ issuerKP: issuerAccKeyPair, assetCode: assetGOAT.GetCode(), horizonClient: &horizonMock, networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", } - // Test Successful request. + + // Prepare and send revisable "tx" for "/tx-approve" POST request. senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) require.NoError(t, err) tx, err := txnbuild.NewTransaction( @@ -711,20 +1006,234 @@ func TestAPI_RevisedIntegration(t *testing.T) { assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) + + // TEST Successful request. + var txApprovePOSTResponse txApprovalResponse + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("revised"), + Tx: txApprovePOSTResponse.Tx, + Message: `Authorization and deauthorization operations were added.`, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + + // Decode the request's transaction. + parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) + require.NoError(t, err) + tx, ok := parsed.Transaction() + require.True(t, ok) + + // Check if revised transaction only has 5 operations. + require.Len(t, tx.Operations(), 5) + // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. + op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op1.Trustor, senderAccKP.Address()) + assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op1.Authorize) + // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. + op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op2.Trustor, receiverAccKP.Address()) + assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op2.Authorize) + // Check Operation 3: Payment from A to B. + op3, ok := tx.Operations()[2].(*txnbuild.Payment) + require.True(t, ok) + assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) + assert.Equal(t, op3.Destination, receiverAccKP.Address()) + assert.Equal(t, op3.Asset, assetGOAT) + // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. + op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op4.Trustor, receiverAccKP.Address()) + assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op4.Authorize) + // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. + op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op5.Trustor, senderAccKP.Address()) + assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op5.Authorize) +} + +func TestAPI_KYCIntegration(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. + issuerAccKeyPair := keypair.MustRandom() + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + horizonMock := horizonclient.MockClient{} + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "0", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "5", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "0", + }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + handler := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // Prepare transaction whose payment amount is <=500 GOATs for /tx-approve POST request. + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) + tx, err := txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "501", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err := tx.Base64() + require.NoError(t, err) + + // Prepare and send /tx-approve POST request with transaction in request body. + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) + req := `{ + "tx": "` + txEnc + `" + }` + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "action_required" response for sender account. var txApprovePOSTResponse txApprovalResponse err = json.Unmarshal(body, &txApprovePOSTResponse) require.NoError(t, err) wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("action_required"), + Message: `Payments exceeding 500.00 GOAT requires KYC approval. Please provide an email address.`, + ActionURL: txApprovePOSTResponse.ActionURL, + ActionMethod: "POST", + ActionFields: []string{"email_address"}, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + + // Setup /kyc-status route for subsequent integration steps. + m.Route("/kyc-status", func(mux chi.Router) { + mux.Post("/{callback_id}", kycstatus.PostHandler{ + DB: conn, + }.ServeHTTP) + }) + // RxUUID is a regex used to validate correct UUIDs, https://w.wiki/39fK + var RxUUID = regexp.MustCompile( + `[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) + // Grab callbackID + callbackID := RxUUID.FindAllString(txApprovePOSTResponse.ActionURL, 1)[0] + + // Verify the KYC entree was inserted in db. + const q = ` + SELECT callback_id + FROM accounts_kyc_status + WHERE stellar_address = $1 + ` + var returnedCallbackID string + err = handler.db.QueryRowContext(ctx, q, senderAccKP.Address()).Scan(&returnedCallbackID) + require.NoError(t, err) + assert.Equal(t, callbackID, returnedCallbackID) + + // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that doesn't start with "x". + req = `{ + "email_address": "TestEmail@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for approved account. + wantBody := `{"result": "no_further_action_required"}` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "revised" response for approved account. + txApprovePOSTResponse = txApprovalResponse{} + assert.Empty(t, txApprovePOSTResponse) + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse = txApprovalResponse{ Status: sep8Status("revised"), Tx: txApprovePOSTResponse.Tx, Message: `Authorization and deauthorization operations were added.`, } assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + // Decode the request's transaction. parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) require.NoError(t, err) tx, ok := parsed.Transaction() require.True(t, ok) + // Check if revised transaction only has 5 operations. require.Len(t, tx.Operations(), 5) // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. @@ -757,4 +1266,41 @@ func TestAPI_RevisedIntegration(t *testing.T) { assert.Equal(t, op5.Trustor, senderAccKP.Address()) assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) require.False(t, op5.Authorize) + + // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that starts with "x". + req = `{ + "email_address": "xTestEmail@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for approved account. + wantBody = `{"result": "no_further_action_required"}` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response for rejected KYC account. + wantBody = `{ + "status":"rejected", "error":"Your KYC was rejected and you're not authorized for operations above 500.0000000 GOAT." + }` + require.JSONEq(t, wantBody, string(body)) } From 4e3c550a5492cab844f14c71fabce1f3d5c8ffa8 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Tue, 18 May 2021 21:24:38 -0700 Subject: [PATCH 46/67] regulated-assets-approval-server/: Copy migrations to image (#3607) Signed-off-by: Lawrence Lawson --- services/regulated-assets-approval-server/docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/services/regulated-assets-approval-server/docker/Dockerfile b/services/regulated-assets-approval-server/docker/Dockerfile index e29a355f7b..eaba80040a 100644 --- a/services/regulated-assets-approval-server/docker/Dockerfile +++ b/services/regulated-assets-approval-server/docker/Dockerfile @@ -9,6 +9,7 @@ FROM ubuntu:20.04 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/regulated-assets-approval-server /app/ +COPY --from=build /bin/regulated-assets-approval-server/internal/db/dbmigrate/migrations /app/internal/db/dbmigrate/migrations/ EXPOSE 8000 ENTRYPOINT ["/app/regulated-assets-approval-server"] CMD ["serve"] From dc27694bbdb3245ccad6d74f88e0539753e5ce90 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Wed, 19 May 2021 09:42:00 -0700 Subject: [PATCH 47/67] go/services/regulated-assets-approval-server/internal/db: Build migrations into image. (#3609) * revert docker changes Signed-off-by: Lawrence Lawson * add dbmigrate_generated.go to build migrations in the binary Signed-off-by: Lawrence Lawson * pull the generated migrations instead of .sql files Signed-off-by: Lawrence Lawson * add dbmigrate tests, borrowered from recovery signer service Signed-off-by: Lawrence Lawson * Update README Signed-off-by: Lawrence Lawson * update generate migrations with ./gogenerate.sh Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * update migration files to conventional naming scheme Signed-off-by: Lawrence Lawson * revert comment to correct path Signed-off-by: Lawrence Lawson * Update services/regulated-assets-approval-server/README.md Co-authored-by: Leigh McCulloch Co-authored-by: Leigh McCulloch --- .../README.md | 9 + .../docker/Dockerfile | 1 - .../internal/db/dbmigrate/dbmigrate.go | 8 +- .../db/dbmigrate/dbmigrate_generated.go | 296 ++++++++++++++++++ .../internal/db/dbmigrate/dbmigrate_test.go | 243 ++++++++++++++ ...l => 2021-05-18.0.accounts-kyc-status.sql} | 0 .../internal/db/dbtest/dbtest.go | 7 +- 7 files changed, 560 insertions(+), 4 deletions(-) create mode 100644 services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_generated.go create mode 100644 services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_test.go rename services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/{accounts-kyc-status.sql => 2021-05-18.0.accounts-kyc-status.sql} (100%) diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index 28db00d38f..afbdc05bb5 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -18,6 +18,7 @@ intended for **testing only**. It is being conceived to: * [Table of Contents](#table-of-contents) * [Usage](#usage) * [Usage: Migrate](#usage-migrate) + * [Migration files](#migration-files) * [Usage: Serve](#usage-serve) * [Account Setup](#account-setup) * [GET /friendbot?addr=\{stellar\_address\}](#get-friendbotaddrstellar_address) @@ -59,6 +60,14 @@ Flags: --database-url string Database URL (DATABASE_URL) (default "postgres://localhost:5432/?sslmode=disable") ``` +#### Migration files + +regulated-assets-approval-server builds the migrations into the binary. If there are any changes to the db(adding, removing or updating tables) generate a new `internal/db/dbmigrate/dbmigrate_generated.go` using the `gogenerate.sh` script located at the root of the repo. + +```sh +$ ./gogenerate.sh +``` + ### Usage: Serve ```sh diff --git a/services/regulated-assets-approval-server/docker/Dockerfile b/services/regulated-assets-approval-server/docker/Dockerfile index eaba80040a..e29a355f7b 100644 --- a/services/regulated-assets-approval-server/docker/Dockerfile +++ b/services/regulated-assets-approval-server/docker/Dockerfile @@ -9,7 +9,6 @@ FROM ubuntu:20.04 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates COPY --from=build /bin/regulated-assets-approval-server /app/ -COPY --from=build /bin/regulated-assets-approval-server/internal/db/dbmigrate/migrations /app/internal/db/dbmigrate/migrations/ EXPOSE 8000 ENTRYPOINT ["/app/regulated-assets-approval-server"] CMD ["serve"] diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go index 2b3c9e56d1..313ee3399e 100644 --- a/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate.go @@ -5,8 +5,12 @@ import ( migrate "github.com/rubenv/sql-migrate" ) -var migrationSource = &migrate.FileMigrationSource{ - Dir: "internal/db/dbmigrate/migrations", +//go:generate go-bindata -nometadata -ignore .+\.(go|swp)$ -pkg dbmigrate -o dbmigrate_generated.go ./migrations + +var migrationSource = &migrate.AssetMigrationSource{ + Asset: Asset, + AssetDir: AssetDir, + Dir: "migrations", } // PlanMigration finds the migrations that would be applied if Migrate was to diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_generated.go b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_generated.go new file mode 100644 index 0000000000..e70bfccdf3 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_generated.go @@ -0,0 +1,296 @@ +// Code generated by go-bindata. DO NOT EDIT. +// sources: +// migrations/2021-05-05.0.initial.sql (162B) +// migrations/2021-05-18.0.accounts-kyc-status.sql (414B) + +package dbmigrate + +import ( + "bytes" + "compress/gzip" + "crypto/sha256" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +func bindataRead(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("read %q: %w", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + clErr := gz.Close() + + if err != nil { + return nil, fmt.Errorf("read %q: %w", name, err) + } + if clErr != nil { + return nil, err + } + + return buf.Bytes(), nil +} + +type asset struct { + bytes []byte + info os.FileInfo + digest [sha256.Size]byte +} + +type bindataFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (fi bindataFileInfo) Name() string { + return fi.name +} +func (fi bindataFileInfo) Size() int64 { + return fi.size +} +func (fi bindataFileInfo) Mode() os.FileMode { + return fi.mode +} +func (fi bindataFileInfo) ModTime() time.Time { + return fi.modTime +} +func (fi bindataFileInfo) IsDir() bool { + return false +} +func (fi bindataFileInfo) Sys() interface{} { + return nil +} + +var _migrations202105050InitialSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x54\xcc\xd1\x0d\xc2\x30\x0c\x04\xd0\xff\x4c\x71\xff\x28\x4c\xc1\x08\x30\x80\x01\xa7\xb5\xd4\xda\x91\x6d\xa8\xb2\x3d\x8a\xf8\x40\x7c\xde\xdd\xd3\xd5\x8a\xeb\x2a\x81\x5d\x16\xa7\x14\x53\x34\xd9\x18\x12\x10\x4d\xd6\xd9\xd0\xb6\x0d\xf0\xde\x73\x80\xf4\x39\x27\x42\x13\x8f\x44\x24\x79\x8a\x2e\xe8\x26\x9a\x68\xe6\xa5\x56\xd8\xcb\x7f\x77\x81\x3b\x37\x73\xc6\xc1\x18\x9c\x58\xe9\xcd\x20\xc4\x63\xe5\x9d\xce\x65\xfa\xd3\x17\x33\x6e\xfd\x3f\x5f\xec\xd0\x52\x3e\x01\x00\x00\xff\xff\xd3\x79\x21\xda\xa2\x00\x00\x00") + +func migrations202105050InitialSqlBytes() ([]byte, error) { + return bindataRead( + _migrations202105050InitialSql, + "migrations/2021-05-05.0.initial.sql", + ) +} + +func migrations202105050InitialSql() (*asset, error) { + bytes, err := migrations202105050InitialSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "migrations/2021-05-05.0.initial.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xd1, 0x21, 0xe9, 0x6d, 0xe0, 0xfe, 0xb4, 0x8b, 0x78, 0x2, 0xae, 0x5c, 0xd5, 0x8b, 0x41, 0xb8, 0x4b, 0xaa, 0x3a, 0xea, 0x69, 0xf, 0xf3, 0x2f, 0x6c, 0xae, 0x38, 0x46, 0xb, 0x2, 0xfc}} + return a, nil +} + +var _migrations202105180AccountsKycStatusSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x90\xc1\x4e\x83\x40\x10\x86\xef\xfb\x14\xff\xb1\x8d\xd6\x17\xe8\x09\x05\x13\x23\x42\x43\x20\xa6\x27\x32\x2c\x13\x5d\xbb\x0b\x9b\xdd\xc1\xaa\x4f\x6f\x02\x26\xda\x13\x1e\x27\xf3\xfd\xdf\x4c\xfe\xdd\x0e\x57\xce\xbc\x04\x12\x46\xe3\x95\xba\xab\xb2\xa4\xce\x50\x27\xb7\x79\x06\x3f\x75\xd6\xe8\x1b\xd2\x7a\x9c\x06\x89\xed\xe9\x53\xb7\x51\x48\xa6\x88\x8d\x02\x80\x28\x6c\x2d\x85\x96\xfa\x3e\x70\x8c\x10\xfe\x10\x14\x65\x8d\xa2\xc9\x73\x1c\xaa\x87\xa7\xa4\x3a\xe2\x31\x3b\x5e\xcf\xb8\x26\x6b\x3b\xd2\xa7\xd6\xf4\x97\xe8\xb2\x66\x47\xc6\x5e\xb8\x7e\x62\x81\x49\xb8\x6f\x49\x20\xc6\x71\x14\x72\x1e\x67\x23\xaf\xf3\x88\xaf\x71\xe0\xdf\xa3\x69\x76\x9f\x34\x79\x8d\xa2\x7c\xde\x6c\x97\xfc\xfc\xf6\xd4\x39\x23\x2b\x96\x05\x27\xef\xc3\xf8\xfe\x1f\x32\xf0\x1b\xeb\x15\xa7\xda\xee\x95\xfa\xdb\x72\x3a\x9e\x07\xa5\xd2\xaa\x3c\xac\xb6\xbc\xff\x0e\x00\x00\xff\xff\x68\xde\x80\x57\x9e\x01\x00\x00") + +func migrations202105180AccountsKycStatusSqlBytes() ([]byte, error) { + return bindataRead( + _migrations202105180AccountsKycStatusSql, + "migrations/2021-05-18.0.accounts-kyc-status.sql", + ) +} + +func migrations202105180AccountsKycStatusSql() (*asset, error) { + bytes, err := migrations202105180AccountsKycStatusSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "migrations/2021-05-18.0.accounts-kyc-status.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb0, 0x7b, 0x8c, 0x97, 0xe7, 0x6, 0x27, 0x5f, 0x19, 0xe2, 0xbb, 0x98, 0x73, 0x1e, 0x37, 0x74, 0xf0, 0x4a, 0x7, 0xe7, 0x15, 0x66, 0x90, 0x3c, 0x2, 0xab, 0x16, 0x39, 0x65, 0xf2, 0x8a, 0x1f}} + return a, nil +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + } + return a.bytes, nil + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + +// MustAsset is like Asset but panics when Asset would return an error. +// It simplifies safe initialization of global variables. +func MustAsset(name string) []byte { + a, err := Asset(name) + if err != nil { + panic("asset: Asset(" + name + "): " + err.Error()) + } + + return a +} + +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + +// AssetInfo loads and returns the asset info for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func AssetInfo(name string) (os.FileInfo, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + } + return a.info, nil + } + return nil, fmt.Errorf("AssetInfo %s not found", name) +} + +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() (*asset, error){ + "migrations/2021-05-05.0.initial.sql": migrations202105050InitialSql, + "migrations/2021-05-18.0.accounts-kyc-status.sql": migrations202105180AccountsKycStatusSql, +} + +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"}, +// AssetDir("data/img") would return []string{"a.png", "b.png"}, +// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + canonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(canonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for childName := range node.Children { + rv = append(rv, childName) + } + return rv, nil +} + +type bintree struct { + Func func() (*asset, error) + Children map[string]*bintree +} + +var _bintree = &bintree{nil, map[string]*bintree{ + "migrations": &bintree{nil, map[string]*bintree{ + "2021-05-05.0.initial.sql": &bintree{migrations202105050InitialSql, map[string]*bintree{}}, + "2021-05-18.0.accounts-kyc-status.sql": &bintree{migrations202105180AccountsKycStatusSql, map[string]*bintree{}}, + }}, +}} + +// RestoreAsset restores an asset under the given directory. +func RestoreAsset(dir, name string) error { + data, err := Asset(name) + if err != nil { + return err + } + info, err := AssetInfo(name) + if err != nil { + return err + } + err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) + if err != nil { + return err + } + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) + if err != nil { + return err + } + return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) +} + +// RestoreAssets restores an asset under the given directory recursively. +func RestoreAssets(dir, name string) error { + children, err := AssetDir(name) + // File + if err != nil { + return RestoreAsset(dir, name) + } + // Dir + for _, child := range children { + err = RestoreAssets(dir, filepath.Join(name, child)) + if err != nil { + return err + } + } + return nil +} + +func _filePath(dir, name string) string { + canonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) +} diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_test.go b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_test.go new file mode 100644 index 0000000000..6a78298fb3 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/db/dbmigrate/dbmigrate_test.go @@ -0,0 +1,243 @@ +package dbmigrate + +import ( + "net/http" + "os" + "strings" + "testing" + + assetfs "github.com/elazarl/go-bindata-assetfs" + migrate "github.com/rubenv/sql-migrate" + "github.com/shurcooL/httpfs/filter" + dbpkg "github.com/stellar/go/services/regulated-assets-approval-server/internal/db" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + supportHttp "github.com/stellar/go/support/http" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGeneratedAssets(t *testing.T) { + localAssets := http.FileSystem(filter.Keep(http.Dir("."), func(path string, fi os.FileInfo) bool { + return fi.IsDir() || strings.HasSuffix(path, ".sql") + })) + generatedAssets := &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, AssetInfo: AssetInfo} + + if !supportHttp.EqualFileSystems(localAssets, generatedAssets, "/") { + t.Fatalf("generated migrations does not match local migrations") + } +} + +func TestPlanMigration_upApplyOne(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + migrations, err := PlanMigration(session, migrate.Up, 1) + require.NoError(t, err) + wantMigrations := []string{"2021-05-05.0.initial.sql"} + assert.Equal(t, wantMigrations, migrations) +} + +func TestPlanMigration_upApplyAll(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + migrations, err := PlanMigration(session, migrate.Up, 0) + require.NoError(t, err) + require.GreaterOrEqual(t, len(migrations), 2) + wantAtLeastMigrations := []string{ + "2021-05-05.0.initial.sql", + "2021-05-18.0.accounts-kyc-status.sql", + } + assert.Equal(t, wantAtLeastMigrations, migrations[:2]) +} + +func TestPlanMigration_upApplyNone(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 0) + require.NoError(t, err) + require.Greater(t, n, 1) + + migrations, err := PlanMigration(session, migrate.Up, 0) + require.NoError(t, err) + require.Empty(t, migrations) +} + +func TestPlanMigration_downApplyOne(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + migrations, err := PlanMigration(session, migrate.Down, 1) + require.NoError(t, err) + wantMigrations := []string{"2021-05-18.0.accounts-kyc-status.sql"} + assert.Equal(t, wantMigrations, migrations) +} + +func TestPlanMigration_downApplyAll(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + migrations, err := PlanMigration(session, migrate.Down, 0) + require.NoError(t, err) + wantMigrations := []string{ + "2021-05-18.0.accounts-kyc-status.sql", + "2021-05-05.0.initial.sql", + } + assert.Equal(t, wantMigrations, migrations) +} + +func TestPlanMigration_downApplyNone(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + n, err = Migrate(session, migrate.Down, 0) + require.NoError(t, err) + require.Equal(t, 2, n) + + migrations, err := PlanMigration(session, migrate.Down, 0) + require.NoError(t, err) + assert.Empty(t, migrations) +} + +func TestMigrate_upApplyOne(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 1) + require.NoError(t, err) + assert.Equal(t, 1, n) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + wantIDs := []string{ + "2021-05-05.0.initial.sql", + } + assert.Equal(t, wantIDs, ids) +} + +func TestMigrate_upApplyAll(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 0) + require.NoError(t, err) + require.Greater(t, n, 1) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + wantIDs := []string{ + "2021-05-05.0.initial.sql", + "2021-05-18.0.accounts-kyc-status.sql", + } + assert.Equal(t, wantIDs, ids) +} + +func TestMigrate_upApplyNone(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 0) + require.NoError(t, err) + require.Greater(t, n, 1) + + n, err = Migrate(session, migrate.Up, 0) + require.NoError(t, err) + require.Zero(t, n) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + wantIDs := []string{ + "2021-05-05.0.initial.sql", + "2021-05-18.0.accounts-kyc-status.sql", + } + assert.Equal(t, wantIDs, ids) +} + +func TestMigrate_downApplyOne(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + n, err = Migrate(session, migrate.Down, 1) + require.NoError(t, err) + require.Equal(t, 1, n) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + wantIDs := []string{ + "2021-05-05.0.initial.sql", + } + assert.Equal(t, wantIDs, ids) +} + +func TestMigrate_downApplyAll(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + n, err = Migrate(session, migrate.Down, 0) + require.NoError(t, err) + require.Equal(t, 2, n) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + assert.Empty(t, ids) +} + +func TestMigrate_downApplyNone(t *testing.T) { + db := dbtest.OpenWithoutMigrations(t) + session, err := dbpkg.Open(db.DSN) + require.NoError(t, err) + + n, err := Migrate(session, migrate.Up, 2) + require.NoError(t, err) + require.Equal(t, 2, n) + + n, err = Migrate(session, migrate.Down, 0) + require.NoError(t, err) + require.Equal(t, 2, n) + + n, err = Migrate(session, migrate.Down, 0) + require.NoError(t, err) + require.Equal(t, 0, n) + + ids := []string{} + err = session.Select(&ids, `SELECT id FROM gorp_migrations`) + require.NoError(t, err) + assert.Empty(t, ids) +} diff --git a/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql b/services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-18.0.accounts-kyc-status.sql similarity index 100% rename from services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/accounts-kyc-status.sql rename to services/regulated-assets-approval-server/internal/db/dbmigrate/migrations/2021-05-18.0.accounts-kyc-status.sql diff --git a/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go index 382cf6753d..d09610c795 100644 --- a/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go +++ b/services/regulated-assets-approval-server/internal/db/dbtest/dbtest.go @@ -9,8 +9,13 @@ import ( "github.com/stellar/go/support/db/dbtest" ) -func Open(t *testing.T) *dbtest.DB { +func OpenWithoutMigrations(t *testing.T) *dbtest.DB { db := dbtest.Postgres(t) + return db +} + +func Open(t *testing.T) *dbtest.DB { + db := OpenWithoutMigrations(t) // Get the folder holding the migrations relative to this file. We cannot // hardcode "../dbmigrate/migrations" because Open is called from tests in From ad9b6f9274f2b98f7ec20fe80408bb753496d0f5 Mon Sep 17 00:00:00 2001 From: George Kudrayvtsev Date: Wed, 19 May 2021 14:55:45 -0700 Subject: [PATCH 48/67] Resolves a merge issue: changed *Session to SessionInterface. --- services/horizon/internal/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/horizon/internal/app.go b/services/horizon/internal/app.go index 30f81154bf..617107ee3f 100644 --- a/services/horizon/internal/app.go +++ b/services/horizon/internal/app.go @@ -504,7 +504,7 @@ func (a *App) init() error { } if a.primaryHistoryQ != nil { - routerConfig.PrimaryDBSession = a.primaryHistoryQ.Session + routerConfig.PrimaryDBSession = a.primaryHistoryQ.SessionInterface } var err error From f289da6090d143495249712b61a0f1a6fabc9150 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Thu, 20 May 2021 18:19:53 +0200 Subject: [PATCH 49/67] services/horizon: Add Muxed Account details to operation responses (#3603) --- protocols/horizon/operations/main.go | 48 +++- .../ingest/processors/effects_processor.go | 67 ++--- .../ingest/processors/operations_processor.go | 70 ++--- .../transaction_operation_wrapper_test.go | 242 ++++++++++++++++-- .../internal/resourceadapter/operations.go | 23 +- .../resourceadapter/operations_test.go | 71 +++-- 6 files changed, 369 insertions(+), 152 deletions(-) diff --git a/protocols/horizon/operations/main.go b/protocols/horizon/operations/main.go index 4e00f85a0d..7ce81f49a9 100644 --- a/protocols/horizon/operations/main.go +++ b/protocols/horizon/operations/main.go @@ -54,6 +54,8 @@ type Base struct { // successful transaction. TransactionSuccessful bool `json:"transaction_successful"` SourceAccount string `json:"source_account"` + SourceAccountMuxed string `json:"source_account_muxed,omitempty"` + SourceAccountMuxedID uint64 `json:"source_account_muxed_id,omitempty"` Type string `json:"type"` TypeI int32 `json:"type_i"` LedgerCloseTime time.Time `json:"created_at"` @@ -85,6 +87,8 @@ type CreateAccount struct { Base StartingBalance string `json:"starting_balance"` Funder string `json:"funder"` + FunderMuxed string `json:"funder_muxed,omitempty"` + FunderMuxedID uint64 `json:"funder_muxed_id,omitempty"` Account string `json:"account"` } @@ -93,9 +97,13 @@ type CreateAccount struct { type Payment struct { Base base.Asset - From string `json:"from"` - To string `json:"to"` - Amount string `json:"amount"` + From string `json:"from"` + FromMuxed string `json:"from_muxed,omitempty"` + FromMuxedID uint64 `json:"from_muxed_id,omitempty"` + To string `json:"to"` + ToMuxed string `json:"to_muxed,omitempty"` + ToMuxedID uint64 `json:"to_muxed_id,omitempty"` + Amount string `json:"amount"` } // PathPayment is the json resource representing a single operation whose type @@ -190,9 +198,11 @@ type SetOptions struct { type ChangeTrust struct { Base base.Asset - Limit string `json:"limit"` - Trustee string `json:"trustee"` - Trustor string `json:"trustor"` + Limit string `json:"limit"` + Trustee string `json:"trustee"` + Trustor string `json:"trustor"` + TrustorMuxed string `json:"trustor_muxed,omitempty"` + TrustorMuxedID uint64 `json:"trustor_muxed_id,omitempty"` } // Deprecated: use TrustlineFlagsUpdated instead. @@ -202,6 +212,8 @@ type AllowTrust struct { Base base.Asset Trustee string `json:"trustee"` + TrusteeMuxed string `json:"trustee_muxed,omitempty"` + TrusteeMuxedID uint64 `json:"trustee_muxed_id,omitempty"` Trustor string `json:"trustor"` Authorize bool `json:"authorize"` AuthorizeToMaintainLiabilities bool `json:"authorize_to_maintain_liabilities"` @@ -211,8 +223,12 @@ type AllowTrust struct { // is AccountMerge. type AccountMerge struct { Base - Account string `json:"account"` - Into string `json:"into"` + Account string `json:"account"` + AccountMuxed string `json:"account_muxed,omitempty"` + AccountMuxedID uint64 `json:"account_muxed_id,omitempty"` + Into string `json:"into"` + IntoMuxed string `json:"into_muxed,omitempty"` + IntoMuxedID uint64 `json:"into_muxed_id,omitempty"` } // Inflation is the json resource representing a single operation whose type is @@ -234,8 +250,10 @@ type CreateClaimableBalance struct { // ClaimClaimableBalance. type ClaimClaimableBalance struct { Base - BalanceID string `json:"balance_id"` - Claimant string `json:"claimant"` + BalanceID string `json:"balance_id"` + Claimant string `json:"claimant"` + ClaimantMuxed string `json:"claimant_muxed,omitempty"` + ClaimantMuxedID uint64 `json:"claimant_muxed_id,omitempty"` } // BeginSponsoringFutureReserves is the json resource representing a single operation whose type is @@ -249,7 +267,9 @@ type BeginSponsoringFutureReserves struct { // EndSponsoringFutureReserves. type EndSponsoringFutureReserves struct { Base - BeginSponsor string `json:"begin_sponsor,omitempty"` + BeginSponsor string `json:"begin_sponsor,omitempty"` + BeginSponsorMuxed string `json:"begin_sponsor_muxed,omitempty"` + BeginSponsorMuxedID uint64 `json:"begin_sponsor_muxed_id,omitempty"` } // RevokeSponsorship is the json resource representing a single operation whose type is @@ -272,8 +292,10 @@ type RevokeSponsorship struct { type Clawback struct { Base base.Asset - From string `json:"from"` - Amount string `json:"amount"` + From string `json:"from"` + FromMuxed string `json:"from_muxed,omitempty"` + FromMuxedID uint64 `json:"from_muxed_id,omitempty"` + Amount string `json:"amount"` } // ClawbackClaimableBalance is the json resource representing a single operation whose type is diff --git a/services/horizon/internal/ingest/processors/effects_processor.go b/services/horizon/internal/ingest/processors/effects_processor.go index 93e129cd9c..17ed9ff876 100644 --- a/services/horizon/internal/ingest/processors/effects_processor.go +++ b/services/horizon/internal/ingest/processors/effects_processor.go @@ -410,8 +410,9 @@ func (e *effectsWrapper) addAccountCreatedEffects() { "starting_balance": amount.String(op.StartingBalance), }, ) + accId := e.operation.SourceAccount().ToAccountId() e.add( - e.operation.SourceAccount().Address(), + accId.Address(), history.EffectAccountDebited, map[string]interface{}{ "asset_type": "native", @@ -440,8 +441,9 @@ func (e *effectsWrapper) addPaymentEffects() { history.EffectAccountCredited, details, ) + source := e.operation.SourceAccount().ToAccountId() e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectAccountDebited, details, ) @@ -450,7 +452,7 @@ func (e *effectsWrapper) addPaymentEffects() { func (e *effectsWrapper) pathPaymentStrictReceiveEffects() { op := e.operation.operation.Body.MustPathPaymentStrictReceiveOp() resultSuccess := e.operation.OperationResult().MustPathPaymentStrictReceiveResult().MustSuccess() - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() details := map[string]interface{}{"amount": amount.String(op.DestAmount)} addAssetDetails(details, op.DestAsset, "") @@ -472,11 +474,11 @@ func (e *effectsWrapper) pathPaymentStrictReceiveEffects() { details, ) - e.addIngestTradeEffects(*source, resultSuccess.Offers) + e.addIngestTradeEffects(source, resultSuccess.Offers) } func (e *effectsWrapper) addPathPaymentStrictSendEffects() { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustPathPaymentStrictSendOp() resultSuccess := e.operation.OperationResult().MustPathPaymentStrictSendResult().MustSuccess() result := e.operation.OperationResult().MustPathPaymentStrictSendResult() @@ -490,24 +492,24 @@ func (e *effectsWrapper) addPathPaymentStrictSendEffects() { addAssetDetails(details, op.SendAsset, "") e.add(source.Address(), history.EffectAccountDebited, details) - e.addIngestTradeEffects(*source, resultSuccess.Offers) + e.addIngestTradeEffects(source, resultSuccess.Offers) } func (e *effectsWrapper) addManageSellOfferEffects() { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() result := e.operation.OperationResult().MustManageSellOfferResult().MustSuccess() - e.addIngestTradeEffects(*source, result.OffersClaimed) + e.addIngestTradeEffects(source, result.OffersClaimed) } func (e *effectsWrapper) addManageBuyOfferEffects() { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() result := e.operation.OperationResult().MustManageBuyOfferResult().MustSuccess() - e.addIngestTradeEffects(*source, result.OffersClaimed) + e.addIngestTradeEffects(source, result.OffersClaimed) } func (e *effectsWrapper) addCreatePassiveSellOfferEffect() { result := e.operation.OperationResult() - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() var claims []xdr.ClaimOfferAtom @@ -519,11 +521,11 @@ func (e *effectsWrapper) addCreatePassiveSellOfferEffect() { claims = result.MustCreatePassiveSellOfferResult().MustSuccess().OffersClaimed } - e.addIngestTradeEffects(*source, claims) + e.addIngestTradeEffects(source, claims) } func (e *effectsWrapper) addSetOptionsEffects() error { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustSetOptionsOp() if op.HomeDomain != nil { @@ -640,7 +642,7 @@ func (e *effectsWrapper) addSetOptionsEffects() error { } func (e *effectsWrapper) addChangeTrustEffects() error { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustChangeTrustOp() changes, err := e.operation.transaction.GetOperationChanges(e.operation.index) @@ -680,9 +682,9 @@ func (e *effectsWrapper) addChangeTrustEffects() error { } func (e *effectsWrapper) addAllowTrustEffects() { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustAllowTrustOp() - asset := op.Asset.ToAsset(*source) + asset := op.Asset.ToAsset(source) details := map[string]interface{}{ "trustor": op.Trustor.Address(), } @@ -693,7 +695,7 @@ func (e *effectsWrapper) addAllowTrustEffects() { e.add(source.Address(), history.EffectTrustlineAuthorized, details) // Forward compatibility setFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag) - e.addTrustLineFlagsEffect(source, &op.Trustor, asset, &setFlags, nil) + e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, &setFlags, nil) case xdr.TrustLineFlags(op.Authorize).IsAuthorizedToMaintainLiabilitiesFlag(): e.add( source.Address(), @@ -702,17 +704,17 @@ func (e *effectsWrapper) addAllowTrustEffects() { ) // Forward compatibility setFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag) - e.addTrustLineFlagsEffect(source, &op.Trustor, asset, &setFlags, nil) + e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, &setFlags, nil) default: e.add(source.Address(), history.EffectTrustlineDeauthorized, details) // Forward compatibility, show both as cleared clearFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag | xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag) - e.addTrustLineFlagsEffect(source, &op.Trustor, asset, nil, &clearFlags) + e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, nil, &clearFlags) } } func (e *effectsWrapper) addAccountMergeEffects() { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() dest := e.operation.operation.Body.MustDestination() result := e.operation.OperationResult().MustAccountMergeResult() @@ -740,7 +742,7 @@ func (e *effectsWrapper) addInflationEffects() { } func (e *effectsWrapper) addManageDataEffects() error { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustManageDataOp() details := map[string]interface{}{"name": op.DataName} effect := history.EffectType(0) @@ -781,7 +783,7 @@ func (e *effectsWrapper) addManageDataEffects() error { } func (e *effectsWrapper) addBumpSequenceEffects() error { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() changes, err := e.operation.transaction.GetOperationChanges(e.operation.index) if err != nil { return err @@ -836,8 +838,9 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang setClaimableBalanceFlagDetails(details, change.Post.Data.ClaimableBalance.Flags()) break } + source := e.operation.SourceAccount() e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectClaimableBalanceCreated, details, ) @@ -861,7 +864,7 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang } addAssetDetails(details, op.Asset, "") e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectAccountDebited, details, ) @@ -908,8 +911,9 @@ func (e *effectsWrapper) addClaimClaimableBalanceEffects(changes []ingest.Change "asset": cBalance.Asset.StringCanonical(), } setClaimableBalanceFlagDetails(details, cBalance.Flags()) + source := e.operation.SourceAccount().ToAccountId() e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectClaimableBalanceClaimed, details, ) @@ -919,7 +923,7 @@ func (e *effectsWrapper) addClaimClaimableBalanceEffects(changes []ingest.Change } addAssetDetails(details, cBalance.Asset, "") e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectAccountCredited, details, ) @@ -955,7 +959,7 @@ func (e *effectsWrapper) addClawbackEffects() error { details := map[string]interface{}{ "amount": amount.String(op.Amount), } - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() addAssetDetails(details, op.Asset, "") // The funds will be burned, but even with that, we generated an account credited effect @@ -984,8 +988,9 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha details := map[string]interface{}{ "balance_id": balanceId, } + source := e.operation.SourceAccount().ToAccountId() e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectClaimableBalanceClawedBack, details, ) @@ -997,7 +1002,7 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha details = map[string]interface{}{"amount": amount.String(cb.Amount)} addAssetDetails(details, cb.Asset, "") e.add( - e.operation.SourceAccount().Address(), + source.Address(), history.EffectAccountCredited, details, ) @@ -1009,9 +1014,9 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha } func (e *effectsWrapper) addSetTrustLineFlagsEffects() error { - source := e.operation.SourceAccount() + source := e.operation.SourceAccount().ToAccountId() op := e.operation.operation.Body.MustSetTrustLineFlagsOp() - e.addTrustLineFlagsEffect(source, &op.Trustor, op.Asset, &op.SetFlags, &op.ClearFlags) + e.addTrustLineFlagsEffect(&source, &op.Trustor, op.Asset, &op.SetFlags, &op.ClearFlags) return nil } diff --git a/services/horizon/internal/ingest/processors/operations_processor.go b/services/horizon/internal/ingest/processors/operations_processor.go index ba9fa3ede6..2c4d05f5b7 100644 --- a/services/horizon/internal/ingest/processors/operations_processor.go +++ b/services/horizon/internal/ingest/processors/operations_processor.go @@ -49,13 +49,14 @@ func (p *OperationProcessor) ProcessTransaction(ctx context.Context, transaction return errors.Wrapf(err, "Error marshaling details for operation %v", operation.ID()) } + source := operation.SourceAccount() if err := p.batch.Add(ctx, operation.ID(), operation.TransactionID(), operation.Order(), operation.OperationType(), detailsJSON, - operation.SourceAccount().Address(), + source.Address(), ); err != nil { return errors.Wrap(err, "Error batch inserting operation rows") } @@ -96,16 +97,14 @@ func (operation *transactionOperationWrapper) TransactionID() int64 { } // SourceAccount returns the operation's source account. -func (operation *transactionOperationWrapper) SourceAccount() *xdr.AccountId { +func (operation *transactionOperationWrapper) SourceAccount() *xdr.MuxedAccount { sourceAccount := operation.operation.SourceAccount - var sa xdr.AccountId if sourceAccount != nil { - sa = sourceAccount.ToAccountId() + return sourceAccount } else { - sa = operation.transaction.Envelope.SourceAccount().ToAccountId() + ret := operation.transaction.Envelope.SourceAccount() + return &ret } - - return &sa } // OperationType returns the operation type. @@ -191,7 +190,7 @@ func (operation *transactionOperationWrapper) findInitatingBeginSponsoringOp() * // and thus we bail out since we could return incorrect information. return nil } - sponsoree := operation.SourceAccount() + sponsoree := operation.SourceAccount().ToAccountId() operations := operation.transaction.Envelope.Operations() for i := int(operation.index) - 1; i >= 0; i-- { if beginOp, ok := operations[i].Body.GetBeginSponsoringFutureReservesOp(); ok && @@ -205,6 +204,19 @@ func (operation *transactionOperationWrapper) findInitatingBeginSponsoringOp() * return nil } +func addMuxedAccountDetails(result map[string]interface{}, a xdr.MuxedAccount, prefix string) { + if a.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + result[prefix+"_muxed"] = a.Address() + result[prefix+"_muxed_id"] = uint64(a.Med25519.Id) + } +} + +func addAccountAndMuxedAccountDetails(result map[string]interface{}, a xdr.MuxedAccount, prefix string) { + accid := a.ToAccountId() + result[prefix] = accid.Address() + addMuxedAccountDetails(result, a, prefix) +} + // Details returns the operation details as a map which can be stored as JSON. func (operation *transactionOperationWrapper) Details() (map[string]interface{}, error) { details := map[string]interface{}{} @@ -212,21 +224,19 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, switch operation.OperationType() { case xdr.OperationTypeCreateAccount: op := operation.operation.Body.MustCreateAccountOp() - details["funder"] = source.Address() + addAccountAndMuxedAccountDetails(details, *source, "funder") details["account"] = op.Destination.Address() details["starting_balance"] = amount.String(op.StartingBalance) case xdr.OperationTypePayment: op := operation.operation.Body.MustPaymentOp() - details["from"] = source.Address() - accid := op.Destination.ToAccountId() - details["to"] = accid.Address() + addAccountAndMuxedAccountDetails(details, *source, "from") + addAccountAndMuxedAccountDetails(details, op.Destination, "to") details["amount"] = amount.String(op.Amount) addAssetDetails(details, op.Asset, "") case xdr.OperationTypePathPaymentStrictReceive: op := operation.operation.Body.MustPathPaymentStrictReceiveOp() - details["from"] = source.Address() - accid := op.Destination.ToAccountId() - details["to"] = accid.Address() + addAccountAndMuxedAccountDetails(details, *source, "from") + addAccountAndMuxedAccountDetails(details, op.Destination, "to") details["amount"] = amount.String(op.DestAmount) details["source_amount"] = amount.String(0) @@ -248,9 +258,8 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, case xdr.OperationTypePathPaymentStrictSend: op := operation.operation.Body.MustPathPaymentStrictSendOp() - details["from"] = source.Address() - accid := op.Destination.ToAccountId() - details["to"] = accid.Address() + addAccountAndMuxedAccountDetails(details, *source, "from") + addAccountAndMuxedAccountDetails(details, op.Destination, "to") details["amount"] = amount.String(0) details["source_amount"] = amount.String(op.SendAmount) @@ -343,13 +352,13 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, case xdr.OperationTypeChangeTrust: op := operation.operation.Body.MustChangeTrustOp() addAssetDetails(details, op.Line, "") - details["trustor"] = source.Address() + addAccountAndMuxedAccountDetails(details, *source, "trustor") details["trustee"] = details["asset_issuer"] details["limit"] = amount.String(op.Limit) case xdr.OperationTypeAllowTrust: op := operation.operation.Body.MustAllowTrustOp() - addAssetDetails(details, op.Asset.ToAsset(*source), "") - details["trustee"] = source.Address() + addAssetDetails(details, op.Asset.ToAsset(source.ToAccountId()), "") + addAccountAndMuxedAccountDetails(details, *source, "trustee") details["trustor"] = op.Trustor.Address() details["authorize"] = xdr.TrustLineFlags(op.Authorize).IsAuthorized() authLiabilities := xdr.TrustLineFlags(op.Authorize).IsAuthorizedToMaintainLiabilitiesFlag() @@ -361,9 +370,8 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, details["clawback_enabled"] = clawbackEnabled } case xdr.OperationTypeAccountMerge: - aid := operation.operation.Body.MustDestination().ToAccountId() - details["account"] = source.Address() - details["into"] = aid.Address() + addAccountAndMuxedAccountDetails(details, *source, "account") + addAccountAndMuxedAccountDetails(details, operation.operation.Body.MustDestination(), "into") case xdr.OperationTypeInflation: // no inflation details, presently case xdr.OperationTypeManageData: @@ -397,14 +405,15 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, panic(fmt.Errorf("Invalid balanceId in op: %d", operation.index)) } details["balance_id"] = balanceID - details["claimant"] = source.Address() + addAccountAndMuxedAccountDetails(details, *source, "claimant") case xdr.OperationTypeBeginSponsoringFutureReserves: op := operation.operation.Body.MustBeginSponsoringFutureReservesOp() details["sponsored_id"] = op.SponsoredId.Address() case xdr.OperationTypeEndSponsoringFutureReserves: beginSponsorshipOp := operation.findInitatingBeginSponsoringOp() if beginSponsorshipOp != nil { - details["begin_sponsor"] = beginSponsorshipOp.SourceAccount().Address() + beginSponsorshipSource := beginSponsorshipOp.SourceAccount() + addAccountAndMuxedAccountDetails(details, *beginSponsorshipSource, "begin_sponsor") } case xdr.OperationTypeRevokeSponsorship: op := operation.operation.Body.MustRevokeSponsorshipOp() @@ -420,8 +429,7 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, case xdr.OperationTypeClawback: op := operation.operation.Body.MustClawbackOp() addAssetDetails(details, op.Asset, "") - from := op.From.ToAccountId() - details["from"] = from.Address() + addAccountAndMuxedAccountDetails(details, op.From, "from") details["amount"] = amount.String(op.Amount) case xdr.OperationTypeClawbackClaimableBalance: op := operation.operation.Body.MustClawbackClaimableBalanceOp() @@ -452,6 +460,8 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, if sponsor != nil { details["sponsor"] = sponsor.Address() } + // We abuse the details to inject muxed-account information without changing the DB schema + addMuxedAccountDetails(details, *source, "source_account") return details, nil } @@ -578,7 +588,7 @@ func getLedgerKeyParticipants(ledgerKey xdr.LedgerKey) []xdr.AccountId { // Participants returns the accounts taking part in the operation. func (operation *transactionOperationWrapper) Participants() ([]xdr.AccountId, error) { participants := []xdr.AccountId{} - participants = append(participants, *operation.SourceAccount()) + participants = append(participants, operation.SourceAccount().ToAccountId()) op := operation.operation switch operation.OperationType() { @@ -621,7 +631,7 @@ func (operation *transactionOperationWrapper) Participants() ([]xdr.AccountId, e case xdr.OperationTypeEndSponsoringFutureReserves: beginSponsorshipOp := operation.findInitatingBeginSponsoringOp() if beginSponsorshipOp != nil { - participants = append(participants, *beginSponsorshipOp.SourceAccount()) + participants = append(participants, beginSponsorshipOp.SourceAccount().ToAccountId()) } case xdr.OperationTypeRevokeSponsorship: op := operation.operation.Body.MustRevokeSponsorshipOp() diff --git a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go index 8979047d24..0a8b759604 100644 --- a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go +++ b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go @@ -3,6 +3,7 @@ package processors import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -101,6 +102,16 @@ func TestOperationTransactionSourceAccount(t *testing.T) { sourceAccount: "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", expected: "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", }, + { + desc: "Operation with source account", + sourceAccount: "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", + expected: "GDMQUXK7ZUCWM5472ZU3YLDP4BMJLQQ76DEMNYDEY2ODEEGGRKLEWGW2", + }, + { + desc: "Operation with muxed source account", + sourceAccount: "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + expected: "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + }, } for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { @@ -118,8 +129,7 @@ func TestOperationTransactionSourceAccount(t *testing.T) { ) op := transaction.Envelope.Operations()[0] if len(tc.sourceAccount) > 0 { - aid := xdr.MustAddress(tc.sourceAccount) - sourceAccount := aid.ToMuxedAccount() + sourceAccount := xdr.MustMuxedAddress(tc.sourceAccount) op.SourceAccount = &sourceAccount } @@ -215,6 +225,23 @@ func TestTransactionOperationDetails(t *testing.T) { "starting_balance": "1000.0000000", }, }, + { + desc: "createAccount with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAoZftFP3p4ifbTm6hQdieotu3Zw9E05GtoSh5MBytEpQAAAACVAvkAAAAAAAAAAAA", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", + metaXDR: "AAAAAQAAAAIAAAADAAAAOQAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcLGrZY9dZxbAAAAAAAAAAZAAAAAAAAAAEAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAOQAAAAAAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcLGrZY9dZxbAAAAAAAAAAaAAAAAAAAAAEAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAA5AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nFsAAAAAAAAABoAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA5AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlahyo1sAAAAAAAAABoAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAAAAAAAChl+0U/eniJ9tObqFB2J6i27dnD0TTka2hKHkwHK0SlAAAAAJUC+QAAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nHQAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA5AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nFsAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "account": "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", + "funder": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "funder_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "funder_muxed_id": uint64(1234), + "starting_balance": "1000.0000000", + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "payment", envelopeXDR: "AAAAABpcjiETZ0uhwxJJhgBPYKWSVJy2TZ2LI87fqV1cUf/UAAAAZAAAADcAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAAAAAAAAAX14QAAAAAAAAAAAVxR/9QAAABAK6pcXYMzAEmH08CZ1LWmvtNDKauhx+OImtP/Lk4hVTMJRVBOebVs5WEPj9iSrgGT0EswuDCZ2i5AEzwgGof9Ag==", @@ -230,6 +257,26 @@ func TestTransactionOperationDetails(t *testing.T) { "to": "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", }, }, + { + desc: "payment with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAEAAAEAAAAAAAAAAAA/DDS/k60NmXHQTMyQ9wVRHIOKrZc0pKL7DXoD/H/omgAAAAAAAAAABfXhAAAAAAAAAAAA", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", + metaXDR: "AAAAAQAAAAIAAAADAAAAOAAAAAAAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAACVAvjnAAAADcAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAOAAAAAAAAAAAGlyOIRNnS6HDEkmGAE9gpZJUnLZNnYsjzt+pXVxR/9QAAAACVAvjnAAAADcAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA==", + feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+QAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA4AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+OcAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "amount": "10.0000000", + "asset_type": "native", + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "pathPaymentStrictReceive", envelopeXDR: "AAAAAONt/6wGI884Zi6sYDYC1GOV/drnh4OcRrTrqJPoOTUKAAAAZAAAABAAAAADAAAAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAADuaygAAAAAABAjoBMEUiZNLUjsWXL1iK59D90Li4w56076b8HKxZfIAAAABRVVSAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAA7msoAAAAAAAAAAAAAAAAB6Dk1CgAAAEB+7jxesBKKrF343onyycjp2tiQLZiGH2ETl+9fuOqotveY2rIgvt9ng+QJ2aDP3+PnDsYEa9ZUaA+Zne2nIGgE", @@ -251,6 +298,32 @@ func TestTransactionOperationDetails(t *testing.T) { "source_asset_type": "native", }, }, + { + desc: "pathPaymentStrictReceive with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAAADuaygAAAAEAAAAAAAAAAAA/DDS/k60NmXHQTMyQ9wVRHIOKrZc0pKL7DXoD/H/omgAAAAFFVVIAAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAADuaygAAAAAAAAAAAAAAAAA=", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAEAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAAAAAAAgAAAAFFVVIAAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAADuaygAAAAAAAAAAADuaygAAAAAABAjoBMEUiZNLUjsWXL1iK59D90Li4w56076b8HKxZfIAAAABRVVSAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAA7msoAAAAAAA==", + metaXDR: "AAAAAQAAAAIAAAADAAAAFAAAAAAAAAAA423/rAYjzzhmLqxgNgLUY5X92ueHg5xGtOuok+g5NQoAAAACVAvi1AAAABAAAAACAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAFAAAAAAAAAAA423/rAYjzzhmLqxgNgLUY5X92ueHg5xGtOuok+g5NQoAAAACVAvi1AAAABAAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAACAAAAAMAAAATAAAAAQAAAAAECOgEwRSJk0tSOxZcvWIrn0P3QuLjDnrTvpvwcrFl8gAAAAFFVVIAAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAAHc1lAB//////////wAAAAEAAAAAAAAAAAAAAAEAAAAUAAAAAQAAAAAECOgEwRSJk0tSOxZcvWIrn0P3QuLjDnrTvpvwcrFl8gAAAAFFVVIAAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAALLQXgB//////////wAAAAEAAAAAAAAAAAAAAAMAAAATAAAAAgAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAAAAAACAAAAAUVVUgAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAAAAAAADuaygAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAAAAAAAIAAAADAAAAFAAAAAAAAAAA423/rAYjzzhmLqxgNgLUY5X92ueHg5xGtOuok+g5NQoAAAACVAvi1AAAABAAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAFAAAAAAAAAAA423/rAYjzzhmLqxgNgLUY5X92ueHg5xGtOuok+g5NQoAAAACGHEY1AAAABAAAAADAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAADAAAAEwAAAAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAACVAvi1AAAABAAAAADAAAAAgAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAA7msoAAAAAAHc1lAAAAAAAAAAAAAAAAAEAAAAUAAAAAAAAAAAuwvNzNk9twbuJHUBqnX26GYI3MbCdpQU9t4n6EVRXsQAAAAKPpqzUAAAAEAAAAAMAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAdzWUAAAAAAAAAAAA", + feeChangesXDR: "AAAAAgAAAAMAAAATAAAAAAAAAADjbf+sBiPPOGYurGA2AtRjlf3a54eDnEa066iT6Dk1CgAAAAJUC+M4AAAAEAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAUAAAAAAAAAADjbf+sBiPPOGYurGA2AtRjlf3a54eDnEa066iT6Dk1CgAAAAJUC+LUAAAAEAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "path": []map[string]interface{}{}, + "amount": "100.0000000", + "asset_code": "EUR", + "asset_type": "credit_alphanum4", + "source_max": "100.0000000", + "asset_issuer": "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU", + "source_amount": "100.0000000", + "source_asset_type": "native", + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "manageSellOffer", envelopeXDR: "AAAAAC7C83M2T23Bu4kdQGqdfboZgjcxsJ2lBT23ifoRVFexAAAAZAAAABAAAAACAAAAAAAAAAAAAAABAAAAAAAAAAMAAAAAAAAAAVVTRAAAAAAALsLzczZPbcG7iR1Aap19uhmCNzGwnaUFPbeJ+hFUV7EAAAAA7msoAAAAAAEAAAACAAAAAAAAAAAAAAAAAAAAARFUV7EAAABALuai5QxceFbtAiC5nkntNVnvSPeWR+C+FgplPAdRgRS+PPESpUiSCyuiwuhmvuDw7kwxn+A6E0M4ca1s2qzMAg==", @@ -466,6 +539,26 @@ func TestTransactionOperationDetails(t *testing.T) { "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", }, }, + { + desc: "changeTrust with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAYAAAABVVNEAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+H//////////AAAAAAAAAAA=", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", + metaXDR: "AAAAAQAAAAIAAAADAAAAKAAAAAAAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAACVAvjOAAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAKAAAAAAAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAACVAvjOAAAACYAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+M4AAAAJgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+M4AAAAJgAAAAEAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAAAAAAAAAAAAA==", + feeChangesXDR: "AAAAAgAAAAMAAAAmAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+QAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+OcAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "asset_code": "USD", + "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", + "asset_type": "credit_alphanum4", + "limit": "922337203685.4775807", + "trustee": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", + "trustor": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "trustor_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "trustor_muxed_id": uint64(1234), + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "allowTrust", envelopeXDR: "AAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAZAAAACYAAAACAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAABVVNEAAAAAAEAAAAAAAAAAUpI8/gAAABA6O2fe1gQBwoO0fMNNEUKH0QdVXVjEWbN5VL51DmRUedYMMXtbX5JKVSzla2kIGvWgls1dXuXHZY/IOlaK01rBQ==", @@ -483,6 +576,26 @@ func TestTransactionOperationDetails(t *testing.T) { "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", }, }, + { + desc: "allowTrust with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAcAAAAAq26sUclf95G3mAzqohcAxtpe+UiaovKwDpCv20t6bF8AAAABVVNEAAAAAAEAAAAAAAAAAA==", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", + metaXDR: "AAAAAQAAAAIAAAADAAAAKQAAAAAAAAAA+SY4m6vkX+Y7FMkNv7RswsIkYNGXeZ4/YwEQNUpI8/gAAAACVAvi1AAAACYAAAABAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAKQAAAAAAAAAA+SY4m6vkX+Y7FMkNv7RswsIkYNGXeZ4/YwEQNUpI8/gAAAACVAvi1AAAACYAAAACAAAAAAAAAAAAAAADAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAoAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAAAAAAAAAAAAAAAAAEAAAApAAAAAQAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAFVU0QAAAAAAPkmOJur5F/mOxTJDb+0bMLCJGDRl3meP2MBEDVKSPP4AAAAAAAAAAB//////////wAAAAEAAAAAAAAAAA==", + feeChangesXDR: "AAAAAgAAAAMAAAAnAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+OcAAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAApAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+M4AAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "asset_code": "USD", + "asset_issuer": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "asset_type": "credit_alphanum4", + "authorize": true, + "trustee": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "trustee_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "trustee_muxed_id": uint64(1234), + "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "accountMerge (Destination)", envelopeXDR: "AAAAAI77mqNTy9VPgmgn+//uvjP8VJxJ1FHQ4jCrYS+K4+HvAAAAZAAAACsAAAABAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAYrj4e8AAABA3jJ7wBrRpsrcnqBQWjyzwvVz2v5UJ56G60IhgsaWQFSf+7om462KToc+HJ27aLVOQ83dGh1ivp+VIuREJq/SBw==", @@ -496,6 +609,24 @@ func TestTransactionOperationDetails(t *testing.T) { "account": "GCHPXGVDKPF5KT4CNAT7X77OXYZ7YVE4JHKFDUHCGCVWCL4K4PQ67KKZ", }, }, + { + desc: "accountMerge (Destination) with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAAgAAAEAAAAAAAAAAAA/DDS/k60NmXHQTMyQ9wVRHIOKrZc0pKL7DXoD/H/omgAAAAAAAAAA", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA=", + metaXDR: "AAAAAQAAAAIAAAADAAAALAAAAAAAAAAAjvuao1PL1U+CaCf7/+6+M/xUnEnUUdDiMKthL4rj4e8AAAACVAvjnAAAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAALAAAAAAAAAAAjvuao1PL1U+CaCf7/+6+M/xUnEnUUdDiMKthL4rj4e8AAAACVAvjnAAAACsAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMAAAArAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtonM3Az4AAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsAAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9w3gtowg5/CUAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMAAAAsAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+OcAAAAKwAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAI77mqNTy9VPgmgn+//uvjP8VJxJ1FHQ4jCrYS+K4+Hv", + feeChangesXDR: "AAAAAgAAAAMAAAArAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+QAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+OcAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "into": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "into_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "into_muxed_id": uint64(0), + "account": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "account_muxed_id": uint64(1234), + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + }, + }, { desc: "inflation", envelopeXDR: "AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAAZAAAAAAAAAAVAAAAAAAAAAAAAAABAAAAAAAAAAkAAAAAAAAAAVb8BfcAAABABUHuXY+MTgW/wDv5+NDVh9fw4meszxeXO98HEQfgXVeCZ7eObCI2orSGUNA/SK6HV9/uTVSxIQQWIso1QoxHBQ==", @@ -574,6 +705,30 @@ func TestTransactionOperationDetails(t *testing.T) { "to": "GDQVLGCJPJ57SALDJPH3YWZVGYUJJTRUUIEJGYKHLTSFY3ZOBKU3QIO3", }, }, + { + desc: "pathPaymentStrictSend with muxed accounts", + envelopeXDR: "AAAAAgAAAQAAAAAAAAAE0iAAdX7q5YP8UN1mn5dnOswl7HJYI6xz+vbH3zGtMeUJAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAABAAAAAAAAAA0AAAAAAAAAAAX14QAAAAEAAAAAAAAAAAA/DDS/k60NmXHQTMyQ9wVRHIOKrZc0pKL7DXoD/H/omgAAAAAAAAAABfXhAAAAAAEAAAAAAAAAAAAAAAA=", + resultXDR: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAANAAAAAAAAAAAAAAAA4VWYSXp7+QFjS8+8WzU2KJTONKIIk2FHXORcby4KqbgAAAAAAAAAAAX14QAAAAAA", + metaXDR: "AAAAAQAAAAIAAAADAApOFQAAAAAAAAAA6wLdS5Ald4laXujZD1Z/ZG9mIeIcp9Ju0M2xeSfc0yIAAAAXSHbnnAAKTgQAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAApOFQAAAAAAAAAA6wLdS5Ald4laXujZD1Z/ZG9mIeIcp9Ju0M2xeSfc0yIAAAAXSHbnnAAKTgQAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAMACk4VAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdIduecAApOBAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACk4VAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdCgQacAApOBAAAAAEAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAMABZwuAAAAAAAAAADhVZhJenv5AWNLz7xbNTYolM40ogiTYUdc5FxvLgqpuAAAAAAAmJaAAAWcLgAAAAAAAAAAAAAAAAAAAAQAAAARdHN0LnRlc3Rhc3NldC5jb20AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAKThUAAAAAAAAAAOFVmEl6e/kBY0vPvFs1NiiUzjSiCJNhR1zkXG8uCqm4AAAAAAaOd4AABZwuAAAAAAAAAAAAAAAAAAAABAAAABF0c3QudGVzdGFzc2V0LmNvbQAAAAAAAAAAAAAAAAAAAAAAAAA=", + feeChangesXDR: "AAAAAgAAAAMACk4EAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdIdugAAApOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACk4VAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdIduecAApOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", + index: 0, + expected: map[string]interface{}{ + "amount": "10.0000000", + "asset_type": "native", + "destination_min": "10.0000000", + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "path": []map[string]interface{}{{"asset_type": "native"}}, + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), + "source_amount": "10.0000000", + "source_asset_type": "native", + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), + }, + }, { desc: "revokeSponsorship (signer)", envelopeXDR: getRevokeSponsorshipEnvelopeXDR(t), @@ -613,6 +768,28 @@ func TestTransactionOperationDetails(t *testing.T) { }, } + var tx1 xdr.TransactionEnvelope + err := xdr.SafeUnmarshalBase64("AAAAAI77mqNTy9VPgmgn+//uvjP8VJxJ1FHQ4jCrYS+K4+HvAAAAZAAAACsAAAABAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAYvwdC9CRsrYcDdZWNGsqaNfTR8bywsjubQRHAlb8BfcAAAAAAAAAAYrj4e8AAABA3jJ7wBrRpsrcnqBQWjyzwvVz2v5UJ56G60IhgsaWQFSf+7om462KToc+HJ27aLVOQ83dGh1ivp+VIuREJq/SBw==", &tx1) + assert.NoError(t, err) + fmt.Printf("%#v\n", tx1) + destination := xdr.MustMuxedAddress("MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ") + tx2 := xdr.TransactionEnvelope{ + Type: xdr.EnvelopeTypeEnvelopeTypeTx, + V1: &xdr.TransactionV1Envelope{ + Tx: xdr.Transaction{ + SourceAccount: xdr.MustMuxedAddress("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26"), + Fee: 0, + SeqNum: 26, + TimeBounds: nil, + Memo: xdr.Memo{Type: xdr.MemoTypeMemoNone}, + Operations: []xdr.Operation{{Body: xdr.OperationBody{Type: xdr.OperationTypeAccountMerge, Destination: &destination}}}, + Ext: xdr.TransactionExt{}, + }, + }, + } + str, err := xdr.MarshalBase64(&tx2) + assert.NoError(t, err) + fmt.Println(str) for _, tc := range testCases { t.Run(tc.desc, func(t *testing.T) { tt := assert.New(t) @@ -1246,8 +1423,7 @@ type ClaimClaimableBalanceOpTestSuite struct { func (s *ClaimClaimableBalanceOpTestSuite) SetupTest() { s.balanceID = "00000000da0d57da7d4850e7fc10d2a9d0ebc731f7afb40574c03395b17d49149b91f5be" - aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") - source := aid.ToMuxedAccount() + source := xdr.MustMuxedAddress("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26") var balanceID xdr.ClaimableBalanceId xdr.SafeUnmarshalHex(s.balanceID, &balanceID) s.op = xdr.Operation{ @@ -1262,8 +1438,12 @@ func (s *ClaimClaimableBalanceOpTestSuite) SetupTest() { } func (s *ClaimClaimableBalanceOpTestSuite) TestDetails() { expected := map[string]interface{}{ - "claimant": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", - "balance_id": s.balanceID, + "claimant": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "claimant_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "claimant_muxed_id": uint64(1234), + "balance_id": s.balanceID, + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), } operation := transactionOperationWrapper{ @@ -1302,7 +1482,7 @@ func (s *ClaimClaimableBalanceOpTestSuite) TestParticipants() { participants, err := operation.Participants() s.Assert().NoError(err) s.Assert().ElementsMatch([]xdr.AccountId{ - xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD"), + xdr.MustAddress("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY"), }, participants) } @@ -1311,8 +1491,9 @@ func TestClaimClaimableBalanceOpTestSuite(t *testing.T) { } var ( - sponsor = xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY") - sponsoree = xdr.MustAddress("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") + sponsor = xdr.MustMuxedAddress("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26") + sponsorAID = sponsor.ToAccountId() + sponsoree = xdr.MustAddress("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2") ) func getSponsoredSandwichWrappers() []*transactionOperationWrapper { @@ -1342,7 +1523,7 @@ func getSponsoredSandwichWrappers() []*transactionOperationWrapper { }, } - sponsorMuxed := sponsor.ToMuxedAccount() + sponsorMuxed := sponsor // Do not provide the source explicitly so that the transaction source is used // It tests https://github.com/stellar/go/issues/2982 . // tx.Envelope.Operations()[0].SourceAccount = &sponsorMuxed @@ -1366,7 +1547,7 @@ func getSponsoredSandwichWrappers() []*transactionOperationWrapper { Ext: xdr.LedgerEntryExt{ V: 1, V1: &xdr.LedgerEntryExtensionV1{ - SponsoringId: &sponsor, + SponsoringId: &sponsorAID, }, }, }, @@ -1398,7 +1579,9 @@ func TestSponsoredSandwichTransaction_Details(t *testing.T) { details, err := wrappers[0].Details() assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ - "sponsored_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", + "sponsored_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), }, details) details, err = wrappers[1].Details() @@ -1406,14 +1589,16 @@ func TestSponsoredSandwichTransaction_Details(t *testing.T) { assert.Equal(t, map[string]interface{}{ "account": "GC6VKA3RC3CVU7POEKFORVMHWJNQIRZS6AEH3KIIHCVO3YRGWUV7MSUC", "funder": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", - "sponsor": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", + "sponsor": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", "starting_balance": "0.0000000", }, details) details, err = wrappers[2].Details() assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ - "begin_sponsor": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", + "begin_sponsor": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "begin_sponsor_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "begin_sponsor_muxed_id": uint64(1234), }, details) } @@ -1424,7 +1609,7 @@ func TestSponsoredSandwichTransaction_Participants(t *testing.T) { assert.NoError(t, err) assert.ElementsMatch(t, []xdr.AccountId{ - xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), + xdr.MustAddress("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY"), xdr.MustAddress("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"), }, participants, @@ -1436,7 +1621,7 @@ func TestSponsoredSandwichTransaction_Participants(t *testing.T) { []xdr.AccountId{ xdr.MustAddress("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"), xdr.MustAddress("GC6VKA3RC3CVU7POEKFORVMHWJNQIRZS6AEH3KIIHCVO3YRGWUV7MSUC"), - xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), + xdr.MustAddress("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY"), }, participants, ) @@ -1446,7 +1631,7 @@ func TestSponsoredSandwichTransaction_Participants(t *testing.T) { assert.ElementsMatch(t, []xdr.AccountId{ xdr.MustAddress("GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2"), - xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), + xdr.MustAddress("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY"), }, participants, ) @@ -1459,15 +1644,14 @@ type ClawbackTestSuite struct { } func (s *ClawbackTestSuite) SetupTest() { - aid := xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD") - source := aid.ToMuxedAccount() + source := xdr.MustMuxedAddress("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26") s.op = xdr.Operation{ SourceAccount: &source, Body: xdr.OperationBody{ Type: xdr.OperationTypeClawback, ClawbackOp: &xdr.ClawbackOp{ Asset: xdr.MustNewCreditAsset("USD", "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD"), - From: xdr.MustMuxedAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), + From: xdr.MustMuxedAddress("MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ"), Amount: 20, }, }, @@ -1475,11 +1659,15 @@ func (s *ClawbackTestSuite) SetupTest() { } func (s *ClawbackTestSuite) TestDetails() { expected := map[string]interface{}{ - "asset_code": "USD", - "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", - "asset_type": "credit_alphanum4", - "amount": "0.0000020", - "from": "GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY", + "asset_code": "USD", + "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", + "asset_type": "credit_alphanum4", + "amount": "0.0000020", + "from": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "from_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "from_muxed_id": uint64(0), + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": uint64(1234), } operation := transactionOperationWrapper{ @@ -1518,8 +1706,8 @@ func (s *ClawbackTestSuite) TestParticipants() { participants, err := operation.Participants() s.Assert().NoError(err) s.Assert().ElementsMatch([]xdr.AccountId{ - xdr.MustAddress("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD"), - xdr.MustAddress("GAUJETIZVEP2NRYLUESJ3LS66NVCEGMON4UDCBCSBEVPIID773P2W6AY"), + xdr.MustAddress("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY"), + xdr.MustAddress("GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ"), }, participants) } diff --git a/services/horizon/internal/resourceadapter/operations.go b/services/horizon/internal/resourceadapter/operations.go index eaeaef65c9..ac25a81b7d 100644 --- a/services/horizon/internal/resourceadapter/operations.go +++ b/services/horizon/internal/resourceadapter/operations.go @@ -12,6 +12,11 @@ import ( "github.com/stellar/go/xdr" ) +type sourceMuxedAccount struct { + SourceAccountMuxed string `json:"source_account_muxed"` + SourceAccountMuxedID uint64 `json:"source_account_muxed_id"` +} + // NewOperation creates a new operation resource, finding the appropriate type to use // based upon the row's type. func NewOperation( @@ -23,8 +28,13 @@ func NewOperation( ) (result hal.Pageable, err error) { base := operations.Base{} + var sourceMuxed sourceMuxedAccount + // We abuse the details to inject muxed-account information without changing the DB schema + if err = operationRow.UnmarshalDetails(&sourceMuxed); err != nil { + return + } err = PopulateBaseOperation( - ctx, &base, operationRow, transactionHash, transactionRow, ledger, + ctx, &base, sourceMuxed, operationRow, transactionHash, transactionRow, ledger, ) if err != nil { return @@ -148,18 +158,13 @@ func NewOperation( } // Populate fills out this resource using `row` as the source. -func PopulateBaseOperation( - ctx context.Context, - dest *operations.Base, - operationRow history.Operation, - transactionHash string, - transactionRow *history.Transaction, - ledger history.Ledger, -) error { +func PopulateBaseOperation(ctx context.Context, dest *operations.Base, muxed sourceMuxedAccount, operationRow history.Operation, transactionHash string, transactionRow *history.Transaction, ledger history.Ledger) error { dest.ID = fmt.Sprintf("%d", operationRow.ID) dest.PT = operationRow.PagingToken() dest.TransactionSuccessful = operationRow.TransactionSuccessful dest.SourceAccount = operationRow.SourceAccount + dest.SourceAccountMuxed = muxed.SourceAccountMuxed + dest.SourceAccountMuxedID = muxed.SourceAccountMuxedID populateOperationType(dest, operationRow) dest.LedgerCloseTime = ledger.ClosedAt dest.TransactionHash = transactionHash diff --git a/services/horizon/internal/resourceadapter/operations_test.go b/services/horizon/internal/resourceadapter/operations_test.go index a1248305f3..594a13a54d 100644 --- a/services/horizon/internal/resourceadapter/operations_test.go +++ b/services/horizon/internal/resourceadapter/operations_test.go @@ -51,7 +51,7 @@ func TestPopulateOperation_Successful(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, row, "", nil, ledger), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, row, "", nil, ledger), ) assert.True(t, dest.TransactionSuccessful) assert.Nil(t, dest.Transaction) @@ -61,7 +61,7 @@ func TestPopulateOperation_Successful(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, row, "", nil, ledger), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, row, "", nil, ledger), ) assert.False(t, dest.TransactionSuccessful) assert.Nil(t, dest.Transaction) @@ -90,14 +90,7 @@ func TestPopulateOperation_WithTransaction(t *testing.T) { assert.NoError( t, - PopulateBaseOperation( - ctx, - &dest, - operationsRow, - transactionRow.TransactionHash, - &transactionRow, - ledger, - ), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, &transactionRow, ledger), ) assert.True(t, dest.TransactionSuccessful) assert.True(t, dest.Transaction.Successful) @@ -200,6 +193,28 @@ func TestPopulateOperation_ClaimClaimableBalance(t *testing.T) { tt.Equal("GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", resp["claimant"]) } +func TestPopulateOperation_ClaimClaimableBalance_Muxed(t *testing.T) { + tt := assert.New(t) + + details := `{ + "claimant": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "claimant_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "claimant_muxed_id": 1234, + "balance_id": "abc", + "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "source_account_muxed_id": 1234 + }` + + resp, err := getJSONResponse(xdr.OperationTypeClaimClaimableBalance, details) + tt.NoError(err) + tt.Equal("abc", resp["balance_id"]) + tt.Equal("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", resp["claimant"]) + tt.Equal("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", resp["claimant_muxed"]) + tt.Equal(1234, int(resp["claimant_muxed_id"].(float64))) + tt.Equal("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", resp["source_account_muxed"]) + tt.Equal(1234, int(resp["source_account_muxed_id"].(float64))) +} + func TestPopulateOperation_BeginSponsoringFutureReserves(t *testing.T) { tt := assert.New(t) @@ -324,40 +339,19 @@ func TestFeeBumpOperation(t *testing.T) { assert.NoError( t, - PopulateBaseOperation( - ctx, - &dest, - operationsRow, - transactionRow.TransactionHash, - nil, - history.Ledger{}, - ), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, nil, history.Ledger{}), ) assert.Equal(t, transactionRow.TransactionHash, dest.TransactionHash) assert.NoError( t, - PopulateBaseOperation( - ctx, - &dest, - operationsRow, - transactionRow.InnerTransactionHash.String, - nil, - history.Ledger{}, - ), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.InnerTransactionHash.String, nil, history.Ledger{}), ) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.TransactionHash) assert.NoError( t, - PopulateBaseOperation( - ctx, - &dest, - operationsRow, - transactionRow.TransactionHash, - &transactionRow, - history.Ledger{}, - ), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, &transactionRow, history.Ledger{}), ) assert.Equal(t, transactionRow.TransactionHash, dest.TransactionHash) @@ -376,14 +370,7 @@ func TestFeeBumpOperation(t *testing.T) { assert.NoError( t, - PopulateBaseOperation( - ctx, - &dest, - operationsRow, - transactionRow.InnerTransactionHash.String, - &transactionRow, - history.Ledger{}, - ), + PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.InnerTransactionHash.String, &transactionRow, history.Ledger{}), ) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.TransactionHash) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.Transaction.Hash) From ca57112dd1fc8d29efb01048ee442c83e7726e72 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Thu, 20 May 2021 13:06:33 -0700 Subject: [PATCH 50/67] go/services/regulated-assets-approval-server/internal/: Add kyc-status GET and DELETE methods (#3612) * update README with new endpoints Signed-off-by: Lawrence Lawson * add get_detail_handler.go Signed-off-by: Lawrence Lawson * add delete_handler.go Signed-off-by: Lawrence Lawson * add new handler methods Signed-off-by: Lawrence Lawson * add delete handler test Signed-off-by: Lawrence Lawson * add get handler test Signed-off-by: Lawrence Lawson * update post handlers validate test func name Signed-off-by: Lawrence Lawson * update kycrecord to response Signed-off-by: Lawrence Lawson * add TestAPI_GETKYCStatus Signed-off-by: Lawrence Lawson * add TestAPI_DELETEKYCStatus Signed-off-by: Lawrence Lawson * fix comments in api_test Signed-off-by: Lawrence Lawson * fix comment grammar Signed-off-by: Lawrence Lawson * remove extra newline Signed-off-by: Lawrence Lawson * rename test Signed-off-by: Lawrence Lawson * Update services/regulated-assets-approval-server/README.md Co-authored-by: Marcelo Salloum dos Santos * Update readme Signed-off-by: Lawrence Lawson * update README Signed-off-by: Lawrence Lawson * update error message to "Missing stellar address or CallbackID." Signed-off-by: Lawrence Lawson * change comment Signed-off-by: Lawrence Lawson * Rename unit test file names Signed-off-by: Lawrence Lawson * add TestDeleteHandlerHandle Signed-off-by: Lawrence Lawson * add TestGetDetailHandlerTimePointerIfValid Signed-off-by: Lawrence Lawson * update comments Signed-off-by: Lawrence Lawson * add TestGetDetailHandlerHandle Signed-off-by: Lawrence Lawson * update spacing Signed-off-by: Lawrence Lawson * update example resp for rejected get req Signed-off-by: Lawrence Lawson * update code formatting; punctuations spacing, grammar. Signed-off-by: Lawrence Lawson * remove quotes Signed-off-by: Lawrence Lawson * remove quotes "kycGetResponse" Signed-off-by: Lawrence Lawson * more minor tweaks in wording, comments or error msgs Signed-off-by: Lawrence Lawson * pcap and punctuate external api errors Signed-off-by: Lawrence Lawson * remove redundant query test Signed-off-by: Lawrence Lawson * update TestGetDetailHandlerHandle with new TESTs Signed-off-by: Lawrence Lawson * fix comment formatting Signed-off-by: Lawrence Lawson * correct comment Signed-off-by: Lawrence Lawson Co-authored-by: Marcelo Salloum dos Santos --- .../README.md | 56 +++++ .../internal/serve/kyc-status/api_test.go | 229 +++++++++++++++++- .../serve/kyc-status/delete_handler.go | 92 +++++++ .../serve/kyc-status/delete_handler_test.go | 77 ++++++ .../serve/kyc-status/get_detail_handler.go | 129 ++++++++++ .../kyc-status/get_detail_handler_test.go | 125 ++++++++++ .../internal/serve/kyc-status/post_handler.go | 2 +- .../serve/kyc-status/post_handler_test.go | 2 +- .../internal/serve/serve.go | 6 + 9 files changed, 715 insertions(+), 3 deletions(-) create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler.go create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler_test.go create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go create mode 100644 services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler_test.go diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index afbdc05bb5..dabf1aab6e 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -25,6 +25,8 @@ intended for **testing only**. It is being conceived to: * [API Spec](#api-spec) * [POST /tx\-approve](#post-tx-approve) * [POST /kyc\-status/\{CALLBACK\_ID\}](#post-kyc-statuscallback_id) + * [GET /kyc\-status/\{STELLAR\_ADDRESS\_OR\_CALLBACK\_ID\}](#get-kyc-statusstellar_address_or_callback_id) + * [DELETE /kyc\-status/\{STELLAR\_ADDRESS\}](#delete-kyc-statusstellar_address) Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc.go) @@ -202,7 +204,61 @@ If their KYC was rejected they should see a rejection response. } ``` +### `GET /kyc-status/{STELLAR_ADDRESS_OR_CALLBACK_ID}` +Returns the detail of an account that requested KYC, as well some metadata about +its status. +Note: This functionality is for test/debugging purposes and it's not part of the [SEP-8] spec. + +**Response (No KYC Submitted):** + +```json +{ + "stellar_address": "GA2DMTP67JT4LQ4CFTUONFBFGKPO6VONW4LWJNOIY2WPRJLUV44MJZOK", + "callback_id":"e0d9243a-40cf-4baa-9575-913e6c98a12e", + "created_at": "2021-03-26T09:35:06.907293-03:00", +} +``` + +**Response (Approved KYC):** + +```json +{ + "stellar_address": "GA2DMTP67JT4LQ4CFTUONFBFGKPO6VONW4LWJNOIY2WPRJLUV44MJZOK", + "callback_id":"e0d9243a-40cf-4baa-9575-913e6c98a12e", + "email_address": "test@test.com", + "created_at": "2021-03-26T09:35:06.907293-03:00", + "kyc_submitted_at": "2021-03-26T14:03:43.314334-03:00", + "approved_at": "2021-03-26T14:03:43.314334-03:00", +} +``` + +**Response (Rejected KYC):** + +```json +{ + "stellar_address": "GA2DMTP67JT4LQ4CFTUONFBFGKPO6VONW4LWJNOIY2WPRJLUV44MJZOK", + "callback_id":"e0d9243a-40cf-4baa-9575-913e6c98a12e", + "email_address": "xtest@test.com", + "created_at": "2021-03-26T09:35:06.907293-03:00", + "kyc_submitted_at": "2021-03-26T14:03:43.314334-03:00", + "rejected_at": "2021-03-26T14:03:43.314334-03:00", +} +``` + +### `DELETE /kyc-status/{STELLAR_ADDRESS}` + +Deletes a stellar account from the list of KYCs. If the stellar address is not +in the database to be deleted the server will return with a `404 - Not Found`. +Note: This functionality is for test/debugging purposes and it's not part of the [SEP-8] spec. + +**Response:** + +```json +{ + "message": "ok" +} +``` [SEP-8]: https://github.com/stellar/stellar-protocol/blob/7c795bb9abc606cd1e34764c4ba07900d58fe26e/ecosystem/sep-0008.md [authorization flags]: https://github.com/stellar/stellar-protocol/blob/7c795bb9abc606cd1e34764c4ba07900d58fe26e/ecosystem/sep-0008.md#authorization-flags diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go index c55327c740..4b226008a1 100644 --- a/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go @@ -193,9 +193,236 @@ func TestAPI_POSTKYCStatus(t *testing.T) { body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) - // TEST "Not Found" error response. + // TEST "Not found." error response. wantPostResponseNotFound := `{ "error": "Not found." }` require.JSONEq(t, wantPostResponseNotFound, string(body)) } + +func TestAPI_GETKYCStatus(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Create kyc-status GetDetailHandler. + getHandler := GetDetailHandler{DB: conn} + + // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. + insertNewApprovedAccountQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, $3, NOW(), NOW(), NULL) + ` + approveKP := keypair.MustRandom() + approveCallbackID := uuid.New().String() + approveEmailAddress := "email@approved.com" + _, err := getHandler.DB.ExecContext(ctx, insertNewApprovedAccountQuery, approveKP.Address(), approveCallbackID, approveEmailAddress) + require.NoError(t, err) + + // Prepare and send /kyc-status/{stellar_address_or_callback_id} GET request; for approved account in the accounts_kyc_status table. + m := chi.NewMux() + m.Get("/kyc-status/{stellar_address_or_callback_id}", getHandler.ServeHTTP) + r := httptest.NewRequest("GET", fmt.Sprintf("/kyc-status/%s", approveKP.Address()), nil) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST kycGetResponse response for approved account. + var kycStatusGETResponseApprove kycGetResponse + err = json.Unmarshal(body, &kycStatusGETResponseApprove) + require.NoError(t, err) + wantPostResponse := kycGetResponse{ + StellarAddress: approveKP.Address(), + CallbackID: approveCallbackID, + EmailAddress: approveEmailAddress, + CreatedAt: kycStatusGETResponseApprove.CreatedAt, + KYCSubmittedAt: kycStatusGETResponseApprove.KYCSubmittedAt, + ApprovedAt: kycStatusGETResponseApprove.ApprovedAt, + RejectedAt: kycStatusGETResponseApprove.RejectedAt, + } + assert.Equal(t, wantPostResponse, kycStatusGETResponseApprove) + + // TEST if response timestamps are present or null. + require.NotNil(t, kycStatusGETResponseApprove.CreatedAt) + require.NotNil(t, kycStatusGETResponseApprove.KYCSubmittedAt) + require.NotNil(t, kycStatusGETResponseApprove.ApprovedAt) + require.Nil(t, kycStatusGETResponseApprove.RejectedAt) + + // INSERT new account in db's accounts_kyc_status table; new account was rejected after submiting kyc. + insertNewRejectedAccountQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, $3, NOW(), NULL, NOW()) + ` + rejectKP := keypair.MustRandom() + rejectCallbackID := uuid.New().String() + rejectEmailAddress := "xemail@rejected.com" + _, err = getHandler.DB.ExecContext(ctx, insertNewRejectedAccountQuery, rejectKP.Address(), rejectCallbackID, rejectEmailAddress) + require.NoError(t, err) + + // Prepare and send /kyc-status/{stellar_address_or_callback_id} GET request; for rejected account in the accounts_kyc_status table. + r = httptest.NewRequest("GET", fmt.Sprintf("/kyc-status/%s", rejectKP.Address()), nil) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST kycGetResponse response for rejected account. + var kycStatusGETResponseReject kycGetResponse + err = json.Unmarshal(body, &kycStatusGETResponseReject) + require.NoError(t, err) + wantPostResponse = kycGetResponse{ + StellarAddress: rejectKP.Address(), + CallbackID: rejectCallbackID, + EmailAddress: rejectEmailAddress, + CreatedAt: kycStatusGETResponseReject.CreatedAt, + KYCSubmittedAt: kycStatusGETResponseReject.KYCSubmittedAt, + ApprovedAt: kycStatusGETResponseReject.ApprovedAt, + RejectedAt: kycStatusGETResponseReject.RejectedAt, + } + assert.Equal(t, wantPostResponse, kycStatusGETResponseReject) + + // TEST if response timestamps are present or null. + require.NotNil(t, kycStatusGETResponseReject.CreatedAt) + require.NotNil(t, kycStatusGETResponseReject.KYCSubmittedAt) + require.NotNil(t, kycStatusGETResponseReject.RejectedAt) + require.Nil(t, kycStatusGETResponseReject.ApprovedAt) + + // INSERT new account in db's accounts_kyc_status table; new account hasn't submitted kyc. + insertNewAccountNoKycQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, NULL, NULL, NULL, NULL) + ` + noKycAccountKP := keypair.MustRandom() + noKycCallbackID := uuid.New().String() + _, err = getHandler.DB.ExecContext(ctx, insertNewAccountNoKycQuery, noKycAccountKP.Address(), noKycCallbackID) + require.NoError(t, err) + + // Prepare and send /kyc-status/{stellar_address_or_callback_id} GET request; for no KYC account in the accounts_kyc_status table (this time using their callbackID). + r = httptest.NewRequest("GET", fmt.Sprintf("/kyc-status/%s", noKycCallbackID), nil) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST kycGetResponse response for account that hasn't submitted kyc. + var kycStatusGETResponseNoKyc kycGetResponse + err = json.Unmarshal(body, &kycStatusGETResponseNoKyc) + require.NoError(t, err) + wantPostResponse = kycGetResponse{ + StellarAddress: noKycAccountKP.Address(), + CallbackID: noKycCallbackID, + EmailAddress: "", + CreatedAt: kycStatusGETResponseNoKyc.CreatedAt, + KYCSubmittedAt: kycStatusGETResponseNoKyc.KYCSubmittedAt, + ApprovedAt: kycStatusGETResponseNoKyc.ApprovedAt, + RejectedAt: kycStatusGETResponseNoKyc.RejectedAt, + } + assert.Equal(t, wantPostResponse, kycStatusGETResponseNoKyc) + + // TEST if response timestamps are present or null. + require.NotNil(t, kycStatusGETResponseNoKyc.CreatedAt) + require.Nil(t, kycStatusGETResponseNoKyc.KYCSubmittedAt) + require.Nil(t, kycStatusGETResponseNoKyc.RejectedAt) + require.Nil(t, kycStatusGETResponseNoKyc.ApprovedAt) + + // Prepare and send /kyc-status/{stellar_address_or_callback_id} GET request; for an account that isn't in the accounts_kyc_status table. + notPresentKP := keypair.MustRandom() + r = httptest.NewRequest("GET", fmt.Sprintf("/kyc-status/%s", notPresentKP.Address()), nil) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusNotFound, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "Not found." error response. + wantGetResponseNotFound := `{ + "error": "Not found." + }` + require.JSONEq(t, wantGetResponseNotFound, string(body)) +} + +func TestAPI_DELETEKYCStatus(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Create kyc-status DeleteHandler. + deleteHandler := DeleteHandler{ + DB: conn, + } + + // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. + insertNewApprovedAccountQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, $3, NOW(), NOW(), NULL) + ` + approveKP := keypair.MustRandom() + approveCallbackID := uuid.New().String() + approveEmailAddress := "email@approved.com" + _, err := deleteHandler.DB.ExecContext(ctx, insertNewApprovedAccountQuery, approveKP.Address(), approveCallbackID, approveEmailAddress) + require.NoError(t, err) + + // Prepare and send /kyc-status/{stellar_address} DELETE request; for approved account in the accounts_kyc_status table. + m := chi.NewMux() + m.Delete("/kyc-status/{stellar_address}", deleteHandler.ServeHTTP) + r := httptest.NewRequest("DELETE", fmt.Sprintf("/kyc-status/%s", approveKP.Address()), nil) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST ok response for deleteing account's kyc record from db's accounts_kyc_status table. + wantBody := `{ + "message":"ok" + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and execute SELECT query for account that was deleted. + existQuery := ` + SELECT EXISTS( + SELECT stellar_address + FROM accounts_kyc_status + WHERE stellar_address = $1 + )` + var exists bool + err = deleteHandler.DB.QueryRowContext(ctx, existQuery, approveKP.Address()).Scan(&exists) + require.NoError(t, err) + + // TEST if the the account doesn't exist in the db. + assert.False(t, exists) + + // Prepare and send /kyc-status/{stellar_address} DELETE request; for account that isn't in the accounts_kyc_status table. + r = httptest.NewRequest("DELETE", fmt.Sprintf("/kyc-status/%s", approveKP.Address()), nil) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusNotFound, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST error "Not found." response for attempting to delete an account that isn't in the accounts_kyc_status table. + wantDeleteResponseNotFound := `{ + "error": "Not found." + }` + require.JSONEq(t, wantDeleteResponseNotFound, string(body)) +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler.go new file mode 100644 index 0000000000..4c0b4ba3b0 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler.go @@ -0,0 +1,92 @@ +package kycstatus + +import ( + "context" + "net/http" + + "github.com/jmoiron/sqlx" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" + "github.com/stellar/go/support/errors" + "github.com/stellar/go/support/http/httpdecode" + "github.com/stellar/go/support/log" + "github.com/stellar/go/support/render/httpjson" +) + +type DeleteHandler struct { + DB *sqlx.DB +} + +func (h DeleteHandler) validate() error { + if h.DB == nil { + return errors.New("database cannot be nil") + } + return nil +} + +type deleteRequest struct { + StellarAddress string `path:"stellar_address"` +} + +func (h DeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + err := h.validate() + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating kyc-status DeleteHandler")) + httperror.InternalServer.Render(w) + return + } + + in := deleteRequest{} + err = httpdecode.Decode(r, &in) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "decoding kyc-status DELETE Request")) + httperror.BadRequest.Render(w) + return + } + + err = h.handle(ctx, in) + if err != nil { + httpErr, ok := err.(*httperror.Error) + if !ok { + httpErr = httperror.InternalServer + } + httpErr.Render(w) + return + } + + httpjson.Render(w, httpjson.DefaultResponse, httpjson.JSON) +} + +func (h DeleteHandler) handle(ctx context.Context, in deleteRequest) (err error) { + defer func() { + log.Ctx(ctx).Debug("==== will log responses ====") + log.Ctx(ctx).Debugf("req: %+v", in) + log.Ctx(ctx).Debugf("err: %+v", err) + log.Ctx(ctx).Debug("==== did log responses ====") + }() + + // Check if deleteRequest StellarAddress value is present. + if in.StellarAddress == "" { + return httperror.NewHTTPError(http.StatusBadRequest, "Missing stellar address.") + } + + var existed bool + const q = ` + WITH deleted_rows AS ( + DELETE FROM accounts_kyc_status + WHERE stellar_address = $1 + RETURNING * + ) SELECT EXISTS ( + SELECT * FROM deleted_rows + ) + ` + err = h.DB.QueryRowContext(ctx, q, in.StellarAddress).Scan(&existed) + if err != nil { + return errors.Wrap(err, "querying the database") + } + if !existed { + return httperror.NewHTTPError(http.StatusNotFound, "Not found.") + } + + return nil +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler_test.go new file mode 100644 index 0000000000..a6b4c1b94b --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/delete_handler_test.go @@ -0,0 +1,77 @@ +package kycstatus + +import ( + "context" + "testing" + + "github.com/google/uuid" + "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestDeleteHandlerValidate(t *testing.T) { + // Test no db. + h := DeleteHandler{} + err := h.validate() + require.EqualError(t, err, "database cannot be nil") + // Success. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h = DeleteHandler{DB: conn} + err = h.validate() + require.NoError(t, err) +} + +func TestDeleteHandlerHandle(t *testing.T) { + ctx := context.Background() + + // Prepare and validate DeleteHandler. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h := DeleteHandler{DB: conn} + err := h.validate() + require.NoError(t, err) + + // Prepare and send empty deleteRequest. TEST error "Missing stellar address." + in := deleteRequest{} + err = h.handle(ctx, in) + require.EqualError(t, err, "Missing stellar address.") + + // Prepare and send deleteRequest to an account not in the db. TEST error "Not found.". + accountKP := keypair.MustRandom() + in = deleteRequest{StellarAddress: accountKP.Address()} + err = h.handle(ctx, in) + require.EqualError(t, err, "Not found.") + + // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. + insertNewAccountQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, $3, NOW(), NOW(), NULL) + ` + callbackID := uuid.New().String() + emailAddress := "email@approved.com" + _, err = h.DB.ExecContext(ctx, insertNewAccountQuery, accountKP.Address(), callbackID, emailAddress) + require.NoError(t, err) + + // Send deleteRequest to an account in the db. TEST if nil error returned (success). + err = h.handle(ctx, in) + require.NoError(t, err) + + // Prepare and execute SELECT query for account that was deleted; ensure its no longer in db + existQuery := ` + SELECT EXISTS( + SELECT stellar_address + FROM accounts_kyc_status + WHERE stellar_address = $1 + )` + var exists bool + err = h.DB.QueryRowContext(ctx, existQuery, accountKP.Address()).Scan(&exists) + require.NoError(t, err) + assert.False(t, exists) +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go new file mode 100644 index 0000000000..e07dccf8af --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go @@ -0,0 +1,129 @@ +package kycstatus + +import ( + "context" + "database/sql" + "net/http" + "time" + + "github.com/jmoiron/sqlx" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/httperror" + "github.com/stellar/go/support/errors" + "github.com/stellar/go/support/http/httpdecode" + "github.com/stellar/go/support/log" + "github.com/stellar/go/support/render/httpjson" +) + +type kycGetResponse struct { + StellarAddress string `json:"stellar_address"` + CallbackID string `json:"callback_id"` + EmailAddress string `json:"email_address,omitempty"` + CreatedAt *time.Time `json:"created_at"` + KYCSubmittedAt *time.Time `json:"kyc_submitted_at,omitempty"` + ApprovedAt *time.Time `json:"approved_at,omitempty"` + RejectedAt *time.Time `json:"rejected_at,omitempty"` + StatusCode int `json:"-"` +} + +func (k *kycGetResponse) Render(w http.ResponseWriter) { + httpjson.RenderStatus(w, k.StatusCode, k, httpjson.JSON) +} + +type GetDetailHandler struct { + DB *sqlx.DB +} + +func (h GetDetailHandler) validate() error { + if h.DB == nil { + return errors.New("database cannot be nil") + } + return nil +} + +type getDetailRequest struct { + StellarAddressOrCallbackID string `path:"stellar_address_or_callback_id"` +} + +func (h GetDetailHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + err := h.validate() + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "validating kyc-status GetDetailHandler")) + httperror.InternalServer.Render(w) + return + } + + in := getDetailRequest{} + err = httpdecode.Decode(r, &in) + if err != nil { + log.Ctx(ctx).Error(errors.Wrap(err, "decoding kyc-status GET Request")) + httperror.BadRequest.Render(w) + return + } + + kycGetResponse, err := h.handle(ctx, in) + if err != nil { + httpErr, ok := err.(*httperror.Error) + if !ok { + httpErr = httperror.InternalServer + } + httpErr.Render(w) + return + } + + kycGetResponse.Render(w) +} + +func (h GetDetailHandler) handle(ctx context.Context, in getDetailRequest) (resp *kycGetResponse, err error) { + defer func() { + log.Ctx(ctx).Debug("==== will log responses ====") + log.Ctx(ctx).Debugf("req: %+v", in) + log.Ctx(ctx).Debugf("resp: %+v", resp) + log.Ctx(ctx).Debugf("err: %+v", err) + log.Ctx(ctx).Debug("==== did log responses ====") + }() + + // Check if getDetailRequest StellarAddressOrCallbackID value is present. + if in.StellarAddressOrCallbackID == "" { + return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing stellar address or callbackID") + } + + // Prepare SELECT query return values. + var ( + stellarAddress, callbackID string + emailAddress sql.NullString + createdAt time.Time + kycSubmittedAt, approvedAt, rejectedAt sql.NullTime + ) + const q = ` + SELECT stellar_address, email_address, created_at, kyc_submitted_at, approved_at, rejected_at, callback_id + FROM accounts_kyc_status + WHERE stellar_address = $1 OR callback_id = $1 + ` + err = h.DB.QueryRowContext(ctx, q, in.StellarAddressOrCallbackID).Scan(&stellarAddress, &emailAddress, &createdAt, &kycSubmittedAt, &approvedAt, &rejectedAt, &callbackID) + if err == sql.ErrNoRows { + return nil, httperror.NewHTTPError(http.StatusNotFound, "Not found.") + } + if err != nil { + return nil, errors.Wrap(err, "querying the database") + } + + return &kycGetResponse{ + StellarAddress: stellarAddress, + CallbackID: callbackID, + EmailAddress: emailAddress.String, + CreatedAt: &createdAt, + KYCSubmittedAt: timePointerIfValid(kycSubmittedAt), + ApprovedAt: timePointerIfValid(approvedAt), + RejectedAt: timePointerIfValid(rejectedAt), + }, nil +} + +// timePointerIfValid returns a pointer to the date from the provided +// `sql.NullTime` if it's valid or `nil` if it's not. +func timePointerIfValid(nt sql.NullTime) *time.Time { + if nt.Valid { + return &nt.Time + } + return nil +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler_test.go new file mode 100644 index 0000000000..6791f80482 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler_test.go @@ -0,0 +1,125 @@ +package kycstatus + +import ( + "context" + "database/sql" + "testing" + "time" + + "github.com/google/uuid" + "github.com/stellar/go/keypair" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetDetailHandlerValidate(t *testing.T) { + // Test no db. + h := GetDetailHandler{} + err := h.validate() + require.EqualError(t, err, "database cannot be nil") + // Success. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h = GetDetailHandler{DB: conn} + err = h.validate() + require.NoError(t, err) +} + +func TestTimePointerIfValid(t *testing.T) { + // Prepare NULL nullTimePtr. + var nullTimePtr sql.NullTime + + // Send a NullTime Pointer to timePointerIfValid. + // TEST if timePointer is null; timePointerIfValid will return nil in this case. + timePointer := timePointerIfValid(nullTimePtr) + require.Nil(t, timePointer) + + // Prepare a valid nullTimePtr with a time set. + nullTimePtr.Valid = true + timeNow := time.Now() + nullTimePtr.Time = timeNow + + // Send a valid Pointer to timePointerIfValid. + // TEST if timePointer is valid and if return a time.Time pointer equals the time.Now(). + timePointer = timePointerIfValid(nullTimePtr) + require.NotNil(t, timePointer) + assert.Equal(t, &timeNow, timePointer) +} + +func TestGetDetailHandlerHandle(t *testing.T) { + ctx := context.Background() + + // Prepare and validate GetDetailHandler. + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + h := GetDetailHandler{DB: conn} + err := h.validate() + require.NoError(t, err) + + // Prepare and send empty getDetailRequest. TEST error "Missing stellar address or callbackID" + in := getDetailRequest{} + kycGetResp, err := h.handle(ctx, in) + require.Nil(t, kycGetResp) + require.EqualError(t, err, "Missing stellar address or callbackID") + + // Prepare and send getDetailRequest to an account not in the db. TEST error "Not found.". + accountKP := keypair.MustRandom() + in = getDetailRequest{StellarAddressOrCallbackID: accountKP.Address()} + kycGetResp, err = h.handle(ctx, in) + require.Nil(t, kycGetResp) + require.EqualError(t, err, "Not found.") + + // Prepare and send getDetailRequest to a callbackID not in the db. TEST error "Not found.". + callbackID := uuid.New().String() + in = getDetailRequest{StellarAddressOrCallbackID: callbackID} + kycGetResp, err = h.handle(ctx, in) + require.Nil(t, kycGetResp) + require.EqualError(t, err, "Not found.") + + // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. + insertNewAccountQuery := ` + INSERT INTO accounts_kyc_status (stellar_address, callback_id, email_address, kyc_submitted_at, approved_at, rejected_at) + VALUES ($1, $2, $3, NOW(), NOW(), NULL) + ` + emailAddress := "email@approved.com" + _, err = h.DB.ExecContext(ctx, insertNewAccountQuery, accountKP.Address(), callbackID, emailAddress) + require.NoError(t, err) + + // Prepare and send getDetailRequest to an account in the db; using stellar address. TEST if response returns with account that was inserted in db; using stellar address. + in = getDetailRequest{StellarAddressOrCallbackID: accountKP.Address()} + kycGetResp, err = h.handle(ctx, in) + require.NoError(t, err) + wantKycGetResponse := kycGetResponse{ + StellarAddress: accountKP.Address(), + CallbackID: callbackID, + EmailAddress: emailAddress, + CreatedAt: kycGetResp.CreatedAt, + KYCSubmittedAt: kycGetResp.KYCSubmittedAt, + ApprovedAt: kycGetResp.ApprovedAt, + RejectedAt: kycGetResp.RejectedAt, + } + assert.Equal(t, &wantKycGetResponse, kycGetResp) + + // TEST if response timestamps are present or null. + require.NotNil(t, kycGetResp.CreatedAt) + require.NotNil(t, kycGetResp.KYCSubmittedAt) + require.NotNil(t, kycGetResp.ApprovedAt) + require.Nil(t, kycGetResp.RejectedAt) + + /// Prepare and send getDetailRequest to an account in the db; using callbackID. TEST if response returns with account that was inserted in db; using callbackID. + in = getDetailRequest{StellarAddressOrCallbackID: callbackID} + kycGetResp, err = h.handle(ctx, in) + require.NoError(t, err) + assert.Equal(t, &wantKycGetResponse, kycGetResp) + + // TEST if response timestamps are present or null. + require.NotNil(t, kycGetResp.CreatedAt) + require.NotNil(t, kycGetResp.KYCSubmittedAt) + require.NotNil(t, kycGetResp.ApprovedAt) + require.Nil(t, kycGetResp.RejectedAt) +} diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go index e5dcb800c5..1da29a4fa0 100644 --- a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler.go @@ -90,7 +90,7 @@ func (h PostHandler) handle(ctx context.Context, in kycPostRequest) (resp *kycPo // Check if kycPostRequest values are present or not malformed. if in.CallbackID == "" { - return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing callback ID.") + return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing callbackID.") } if in.EmailAddress == "" { return nil, httperror.NewHTTPError(http.StatusBadRequest, "Missing email_address.") diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go index 5bcdee0bcc..d688f33d1e 100644 --- a/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/post_handler_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestValidate(t *testing.T) { +func TestPostHandlerValidate(t *testing.T) { // Test no db. h := PostHandler{} err := h.validate() diff --git a/services/regulated-assets-approval-server/internal/serve/serve.go b/services/regulated-assets-approval-server/internal/serve/serve.go index 3b75c3aa13..3d0f7b6cae 100644 --- a/services/regulated-assets-approval-server/internal/serve/serve.go +++ b/services/regulated-assets-approval-server/internal/serve/serve.go @@ -107,6 +107,12 @@ func handleHTTP(opts Options) http.Handler { mux.Post("/{callback_id}", kycstatus.PostHandler{ DB: db, }.ServeHTTP) + mux.Get("/{stellar_address_or_callback_id}", kycstatus.GetDetailHandler{ + DB: db, + }.ServeHTTP) + mux.Delete("/{stellar_address}", kycstatus.DeleteHandler{ + DB: db, + }.ServeHTTP) }) return mux From 17bd528a002feb7794f3fac24c79b006c024f258 Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Thu, 20 May 2021 14:18:31 -0700 Subject: [PATCH 51/67] update rendering json (#3618) Signed-off-by: Lawrence Lawson --- .../internal/serve/kyc-status/get_detail_handler.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go index e07dccf8af..0bb143fe92 100644 --- a/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go +++ b/services/regulated-assets-approval-server/internal/serve/kyc-status/get_detail_handler.go @@ -22,11 +22,10 @@ type kycGetResponse struct { KYCSubmittedAt *time.Time `json:"kyc_submitted_at,omitempty"` ApprovedAt *time.Time `json:"approved_at,omitempty"` RejectedAt *time.Time `json:"rejected_at,omitempty"` - StatusCode int `json:"-"` } func (k *kycGetResponse) Render(w http.ResponseWriter) { - httpjson.RenderStatus(w, k.StatusCode, k, httpjson.JSON) + httpjson.Render(w, k, httpjson.JSON) } type GetDetailHandler struct { From 154bad44591bde94b391e884179b67f1aa386089 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Fri, 21 May 2021 09:13:50 -0700 Subject: [PATCH 52/67] keypair: rename Master to Root (#3614) ### What Add a `Root` function that returns a networks root account keypair derived from the network passphrase, and deprecate the `Master` function that does same. ### Why The `Master` function is difficult to discover because the term 'master' is not normally what we call the keypair for the networks root account. The term master is what we use to refer to the keypair of an account that the account ID is derived from, which is the default keypair that can sign for an account. Every account on a network has a master keypair. In stellar-core and the quickstart image this keypair is referred to as the root account keypair. It would be easier to discover functionality in the Go SDK if it uses language that is consistent with stellar-core and other components. The `Master` function returns a `KP` interface type. The intention for this function is to return a full keypair, a public and private key, so there is little benefit to the caller to obfuscate the `*Full` type from the caller. In fact I see in code that we routinely cast the `KP` to a `*Full` anyway, so we have a dependence on this always being a `*Full`. For this reason the `Root` function returns a `*Full`. The `Master` function is exported, so rather than rename it, keeping it and marking it as deprecated preserves backwards compatibility. --- keypair/main.go | 6 ++++++ keypair/main_test.go | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/keypair/main.go b/keypair/main.go index 267a0fb5c3..fc8c7a9713 100644 --- a/keypair/main.go +++ b/keypair/main.go @@ -61,7 +61,13 @@ func Random() (*Full, error) { } // Master returns the master keypair for a given network passphrase +// Deprecated: Use keypair.Root instead. func Master(networkPassphrase string) KP { + return Root(networkPassphrase) +} + +// Root returns the root account keypair for a given network passphrase. +func Root(networkPassphrase string) *Full { kp, err := FromRawSeed(network.ID(networkPassphrase)) if err != nil { diff --git a/keypair/main_test.go b/keypair/main_test.go index 6a4c6ead2e..76ff28f213 100644 --- a/keypair/main_test.go +++ b/keypair/main_test.go @@ -328,3 +328,12 @@ var _ = Describe("keypair.MustRandom()", func() { }) }) }) + +var _ = Describe("keypair.Root()", func() { + It("returns the root key pair for the passphrase", func() { + networkPassphrase := "Standalone Network ; February 2017" + kp := Root(networkPassphrase) + seed := kp.Seed() + Expect(seed).To(Equal("SC5O7VZUXDJ6JBDSZ74DSERXL7W3Y5LTOAMRF7RQRL3TAGAPS7LUVG3L")) + }) +}) From dae1442926d3dfa3d0fcbf27e3893cd9c363168e Mon Sep 17 00:00:00 2001 From: Lawrence Lawson Date: Fri, 21 May 2021 13:35:10 -0700 Subject: [PATCH 53/67] regulated-assets-approval-server/internal/serve/: refactor-reorganize api tests and unit tests (#3620) * port api tests to correct files Signed-off-by: Lawrence Lawson * update formatting Signed-off-by: Lawrence Lawson * port api tests to api_tx_approve.go Signed-off-by: Lawrence Lawson * update README with .env var names Signed-off-by: Lawrence Lawson * assert http recorder code was equal to response code Signed-off-by: Lawrence Lawson * assert http recorder code was equal to response code tx approve Signed-off-by: Lawrence Lawson * minor tweaks Signed-off-by: Lawrence Lawson * minor format tweaks Signed-off-by: Lawrence Lawson * reformatting TestAPI_RejectedIntegration Signed-off-by: Lawrence Lawson * minor tweaks Signed-off-by: Lawrence Lawson * make rejected kyc threshold human readable Signed-off-by: Lawrence Lawson * update comments Signed-off-by: Lawrence Lawson * update Usage text for kyc-required-payment-amount-threshold Signed-off-by: Lawrence Lawson * remove decoded suffix from response structs Signed-off-by: Lawrence Lawson --- .../README.md | 4 +- .../cmd/serve.go | 2 +- .../api_test.go => api_kyc_status_test.go} | 93 ++- .../internal/serve/api_tx_approve_test.go | 790 ++++++++++++++++++ .../internal/serve/tx_approve.go | 6 +- .../internal/serve/tx_approve_test.go | 784 +---------------- 6 files changed, 881 insertions(+), 798 deletions(-) rename services/regulated-assets-approval-server/internal/serve/{kyc-status/api_test.go => api_kyc_status_test.go} (85%) create mode 100644 services/regulated-assets-approval-server/internal/serve/api_tx_approve_test.go diff --git a/services/regulated-assets-approval-server/README.md b/services/regulated-assets-approval-server/README.md index dabf1aab6e..514f163fc4 100644 --- a/services/regulated-assets-approval-server/README.md +++ b/services/regulated-assets-approval-server/README.md @@ -88,8 +88,8 @@ Flags: --issuer-account-secret string Secret key of the asset issuer's stellar account. (ISSUER_ACCOUNT_SECRET) --network-passphrase string Network passphrase of the Stellar network transactions should be signed for (NETWORK_PASSPHRASE) (default "Test SDF Network ; September 2015") --port int Port to listen and serve on (PORT) (default 8000) - --base-url string The base url address to this server - --kyc-required-payment-amount-threshold string The amount threshold when KYC is required, may contain decimals and is greater than 0 (default 500 units) + --base-url string The base url address to this server(BASE_URL) + --kyc-required-payment-amount-threshold string The amount threshold when KYC is required, may contain decimals and is greater than 0 (KYC_REQUIRED_PAYMENT_AMOUNT_THRESHOLD)(default 500 units) ``` ## Account Setup diff --git a/services/regulated-assets-approval-server/cmd/serve.go b/services/regulated-assets-approval-server/cmd/serve.go index 43011ad4aa..baccf46554 100644 --- a/services/regulated-assets-approval-server/cmd/serve.go +++ b/services/regulated-assets-approval-server/cmd/serve.go @@ -78,7 +78,7 @@ func (c *ServeCommand) Command() *cobra.Command { }, { Name: "kyc-required-payment-amount-threshold", - Usage: "The amount threshold to require KYC", + Usage: "The amount threshold when KYC is required, may contain decimals and is greater than 0", OptType: types.String, ConfigKey: &opts.KYCRequiredPaymentAmountThreshold, FlagDefault: "500", diff --git a/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go b/services/regulated-assets-approval-server/internal/serve/api_kyc_status_test.go similarity index 85% rename from services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go rename to services/regulated-assets-approval-server/internal/serve/api_kyc_status_test.go index 4b226008a1..5e0beb0387 100644 --- a/services/regulated-assets-approval-server/internal/serve/kyc-status/api_test.go +++ b/services/regulated-assets-approval-server/internal/serve/api_kyc_status_test.go @@ -1,4 +1,4 @@ -package kycstatus +package serve import ( "context" @@ -10,11 +10,13 @@ import ( "net/http/httptest" "strings" "testing" + "time" "github.com/go-chi/chi" "github.com/google/uuid" "github.com/stellar/go/keypair" "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + kycstatus "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/kyc-status" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -27,9 +29,7 @@ func TestAPI_POSTKYCStatus(t *testing.T) { defer conn.Close() // Create kyc-status PostHandler. - postHandler := PostHandler{ - DB: conn, - } + postHandler := kycstatus.PostHandler{DB: conn} // INSERT new unverified account in db's accounts_kyc_status table. const insertNewAccountQuery = ` @@ -46,21 +46,26 @@ func TestAPI_POSTKYCStatus(t *testing.T) { m.Post("/kyc-status/{callback_id}", postHandler.ServeHTTP) reqBody := `{ "email_address": "TestEmail@email.com" - }` + }` r := httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(reqBody)) r = r.WithContext(ctx) w := httptest.NewRecorder() m.ServeHTTP(w, r) resp := w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST "no_further_action_required" response for approved account. - var kycStatusPOSTResponseApprove kycPostResponse + type kycStatusPOSTResponse struct { + Result string `json:"result"` + } + var kycStatusPOSTResponseApprove kycStatusPOSTResponse err = json.Unmarshal(body, &kycStatusPOSTResponseApprove) require.NoError(t, err) - wantPostResponse := kycPostResponse{ + wantPostResponse := kycStatusPOSTResponse{ Result: "no_further_action_required", } assert.Equal(t, wantPostResponse, kycStatusPOSTResponseApprove) @@ -89,21 +94,23 @@ func TestAPI_POSTKYCStatus(t *testing.T) { // Preparing and send /kyc-status/{callback_id} POST request. reqBody = `{ "email_address": "xTestEmail@email.com" - }` + }` r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDRejected), strings.NewReader(reqBody)) r = r.WithContext(ctx) w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST "no_further_action_required" response for rejected account. - var kycStatusPOSTResponseRejected kycPostResponse + var kycStatusPOSTResponseRejected kycStatusPOSTResponse err = json.Unmarshal(body, &kycStatusPOSTResponseRejected) require.NoError(t, err) - wantPostResponse = kycPostResponse{ + wantPostResponse = kycStatusPOSTResponse{ Result: "no_further_action_required", } assert.Equal(t, wantPostResponse, kycStatusPOSTResponseRejected) @@ -121,21 +128,23 @@ func TestAPI_POSTKYCStatus(t *testing.T) { // Preparing and send /kyc-status/{callback_id} POST request; using the rejected account's callback_ID. reqBody = `{ "email_address": "TestEmailx@email.com" - }` + }` r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDRejected), strings.NewReader(reqBody)) r = r.WithContext(ctx) w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST "no_further_action_required" response for repeated KYC request after REJECTED w/ new email. - var kycStatusPOSTResponseRejectedNewEmail kycPostResponse + var kycStatusPOSTResponseRejectedNewEmail kycStatusPOSTResponse err = json.Unmarshal(body, &kycStatusPOSTResponseRejectedNewEmail) require.NoError(t, err) - wantPostResponse = kycPostResponse{ + wantPostResponse = kycStatusPOSTResponse{ Result: "no_further_action_required", } assert.Equal(t, wantPostResponse, kycStatusPOSTResponseRejectedNewEmail) @@ -163,13 +172,15 @@ func TestAPI_POSTKYCStatus(t *testing.T) { require.NoError(t, err) reqBody = `{ "email_address": "" - }` + }` r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDNoEmail), strings.NewReader(reqBody)) r = r.WithContext(ctx) w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) @@ -183,20 +194,22 @@ func TestAPI_POSTKYCStatus(t *testing.T) { callbackIDNotFound := uuid.New().String() reqBody = `{ "email_address": "notFound@email.com" - }` + }` r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackIDNotFound), strings.NewReader(reqBody)) r = r.WithContext(ctx) w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusNotFound, w.Code) assert.Equal(t, http.StatusNotFound, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST "Not found." error response. wantPostResponseNotFound := `{ - "error": "Not found." - }` + "error": "Not found." + }` require.JSONEq(t, wantPostResponseNotFound, string(body)) } @@ -208,7 +221,7 @@ func TestAPI_GETKYCStatus(t *testing.T) { defer conn.Close() // Create kyc-status GetDetailHandler. - getHandler := GetDetailHandler{DB: conn} + getHandler := kycstatus.GetDetailHandler{DB: conn} // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. insertNewApprovedAccountQuery := ` @@ -229,15 +242,26 @@ func TestAPI_GETKYCStatus(t *testing.T) { w := httptest.NewRecorder() m.ServeHTTP(w, r) resp := w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST kycGetResponse response for approved account. - var kycStatusGETResponseApprove kycGetResponse + type kycGETResponse struct { + StellarAddress string `json:"stellar_address"` + CallbackID string `json:"callback_id"` + EmailAddress string `json:"email_address,omitempty"` + CreatedAt *time.Time `json:"created_at"` + KYCSubmittedAt *time.Time `json:"kyc_submitted_at,omitempty"` + ApprovedAt *time.Time `json:"approved_at,omitempty"` + RejectedAt *time.Time `json:"rejected_at,omitempty"` + } + var kycStatusGETResponseApprove kycGETResponse err = json.Unmarshal(body, &kycStatusGETResponseApprove) require.NoError(t, err) - wantPostResponse := kycGetResponse{ + wantPostResponse := kycGETResponse{ StellarAddress: approveKP.Address(), CallbackID: approveCallbackID, EmailAddress: approveEmailAddress, @@ -271,15 +295,17 @@ func TestAPI_GETKYCStatus(t *testing.T) { w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST kycGetResponse response for rejected account. - var kycStatusGETResponseReject kycGetResponse + var kycStatusGETResponseReject kycGETResponse err = json.Unmarshal(body, &kycStatusGETResponseReject) require.NoError(t, err) - wantPostResponse = kycGetResponse{ + wantPostResponse = kycGETResponse{ StellarAddress: rejectKP.Address(), CallbackID: rejectCallbackID, EmailAddress: rejectEmailAddress, @@ -312,15 +338,17 @@ func TestAPI_GETKYCStatus(t *testing.T) { w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST kycGetResponse response for account that hasn't submitted kyc. - var kycStatusGETResponseNoKyc kycGetResponse + var kycStatusGETResponseNoKyc kycGETResponse err = json.Unmarshal(body, &kycStatusGETResponseNoKyc) require.NoError(t, err) - wantPostResponse = kycGetResponse{ + wantPostResponse = kycGETResponse{ StellarAddress: noKycAccountKP.Address(), CallbackID: noKycCallbackID, EmailAddress: "", @@ -344,6 +372,7 @@ func TestAPI_GETKYCStatus(t *testing.T) { w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusNotFound, w.Code) assert.Equal(t, http.StatusNotFound, resp.StatusCode) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) @@ -351,7 +380,7 @@ func TestAPI_GETKYCStatus(t *testing.T) { // TEST "Not found." error response. wantGetResponseNotFound := `{ "error": "Not found." - }` + }` require.JSONEq(t, wantGetResponseNotFound, string(body)) } @@ -363,9 +392,7 @@ func TestAPI_DELETEKYCStatus(t *testing.T) { defer conn.Close() // Create kyc-status DeleteHandler. - deleteHandler := DeleteHandler{ - DB: conn, - } + deleteHandler := kycstatus.DeleteHandler{DB: conn} // INSERT new account in db's accounts_kyc_status table; new account was approved after submitting kyc. insertNewApprovedAccountQuery := ` @@ -386,7 +413,9 @@ func TestAPI_DELETEKYCStatus(t *testing.T) { w := httptest.NewRecorder() m.ServeHTTP(w, r) resp := w.Result() + assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) @@ -396,7 +425,7 @@ func TestAPI_DELETEKYCStatus(t *testing.T) { }` require.JSONEq(t, wantBody, string(body)) - // Prepare and execute SELECT query for account that was deleted. + // Prepare and execute SELECT query for account that was deleted, TEST if the the account doesn't exist in the db. existQuery := ` SELECT EXISTS( SELECT stellar_address @@ -406,8 +435,6 @@ func TestAPI_DELETEKYCStatus(t *testing.T) { var exists bool err = deleteHandler.DB.QueryRowContext(ctx, existQuery, approveKP.Address()).Scan(&exists) require.NoError(t, err) - - // TEST if the the account doesn't exist in the db. assert.False(t, exists) // Prepare and send /kyc-status/{stellar_address} DELETE request; for account that isn't in the accounts_kyc_status table. @@ -416,13 +443,15 @@ func TestAPI_DELETEKYCStatus(t *testing.T) { w = httptest.NewRecorder() m.ServeHTTP(w, r) resp = w.Result() + assert.Equal(t, http.StatusNotFound, w.Code) assert.Equal(t, http.StatusNotFound, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) body, err = ioutil.ReadAll(resp.Body) require.NoError(t, err) // TEST error "Not found." response for attempting to delete an account that isn't in the accounts_kyc_status table. wantDeleteResponseNotFound := `{ "error": "Not found." - }` + }` require.JSONEq(t, wantDeleteResponseNotFound, string(body)) } diff --git a/services/regulated-assets-approval-server/internal/serve/api_tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/api_tx_approve_test.go new file mode 100644 index 0000000000..4ee6b6a310 --- /dev/null +++ b/services/regulated-assets-approval-server/internal/serve/api_tx_approve_test.go @@ -0,0 +1,790 @@ +package serve + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "regexp" + "strings" + "testing" + + "github.com/go-chi/chi" + "github.com/stellar/go/amount" + "github.com/stellar/go/clients/horizonclient" + "github.com/stellar/go/keypair" + "github.com/stellar/go/network" + "github.com/stellar/go/protocols/horizon" + "github.com/stellar/go/protocols/horizon/base" + "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" + kycstatus "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/kyc-status" + "github.com/stellar/go/txnbuild" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAPI_RejectedIntegration(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. + issuerAccKeyPair := keypair.MustRandom() + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + horizonMock := horizonclient.MockClient{} + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + AccountID: issuerAccKeyPair.Address(), + Sequence: "1", + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "1", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "2", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "3", + }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + handler := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // Prepare and send empty "tx" for "/tx-approve" POST request. + req := `{ + "tx": "" + }` + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if no transaction is submitted. + wantBody := `{ + "status":"rejected", "error":"Missing parameter \"tx\"." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and send malformed "tx" for "/tx-approve" POST request. + req = `{ + "tx": "BADXDRTRANSACTIONENVELOPE" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if can't parse XDR. + wantBody = `{ + "status":"rejected", "error":"Invalid parameter \"tx\"." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare non generic transaction "tx". + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) + tx, err := txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + feeBumpTx, err := txnbuild.NewFeeBumpTransaction( + txnbuild.FeeBumpTransactionParams{ + Inner: tx, + FeeAccount: receiverAccKP.Address(), + BaseFee: 2 * txnbuild.MinBaseFee, + }, + ) + require.NoError(t, err) + feeBumpTxEnc, err := feeBumpTx.Base64() + require.NoError(t, err) + + // Send invalid "tx" for "/tx-approve" POST request. + req = `{ + "tx": "` + feeBumpTxEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. + wantBody = `{ + "status":"rejected", "error":"Invalid parameter \"tx\"." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare "tx" where transaction sourceAccount the same as the server issuer account. + issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) + require.NoError(t, err) + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &issuerAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + Destination: senderAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err := tx.Base64() + require.NoError(t, err) + + // Send "tx" where transaction sourceAccount the same as the server issuer account for "/tx-approve" POST request. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if the transaction sourceAccount the same as the server issuer account. + wantBody = `{ + "status":"rejected", "error":"The source account is invalid." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare "tx" where transaction's operation sourceAccount the same as the server issuer account. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: issuerAccKeyPair.Address(), + Destination: senderAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + + // Send "tx" where transaction's operation sourceAccount the same as the server issuer account for "/tx-approve" POST request. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if the transaction's operation sourceAccount the same as the server issuer account. + wantBody = `{ + "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare "tx" where transaction's operation is not a payment. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.AllowTrust{ + Trustor: receiverAccKP.Address(), + Type: assetGOAT, + Authorize: true, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + + // Send "tx" where transaction's operation is not a payment for "/tx-approve" POST request. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if transaction's operation is not a payment. + wantBody = `{ + "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare "tx" where theres more than one operation in transaction. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "2", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + + // Send "tx" where theres more than one operation in transaction for "/tx-approve" POST request. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if more than one operation in transaction. + wantBody = `{ + "status":"rejected", "error":"Please submit a transaction with exactly one operation of type payment." + }` + require.JSONEq(t, wantBody, string(body)) + + // Prepare "tx" where transaction's transaction source account seq num is not equal to account sequence+1. + tx, err = txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "50", + }, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err = tx.Base64() + require.NoError(t, err) + + // Send "tx" where transaction's transaction source account seq num is not equal to account sequence+1 for "/tx-approve" POST request. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response if where transaction's transaction source account seq num is not equal to account sequence+1. + wantBody = `{ + "status":"rejected", "error":"Invalid transaction sequence number." + }` + require.JSONEq(t, wantBody, string(body)) +} + +func TestAPI_RevisedIntegration(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. + issuerAccKeyPair := keypair.MustRandom() + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + horizonMock := horizonclient.MockClient{} + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "0", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "5", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "0", + }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + handler := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // Prepare revisable "tx". + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) + tx, err := txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "1", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err := tx.Base64() + require.NoError(t, err) + + // Send revisable "tx" for "/tx-approve" POST request. + req := `{ + "tx": "` + txEnc + `" + }` + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST successful "revised" response. + var txApprovePOSTResponse txApprovalResponse + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("revised"), + Tx: txApprovePOSTResponse.Tx, + Message: `Authorization and deauthorization operations were added.`, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + + // Decode the request's transaction. + parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) + require.NoError(t, err) + tx, ok := parsed.Transaction() + require.True(t, ok) + + // Check if revised transaction only has 5 operations. + require.Len(t, tx.Operations(), 5) + // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. + op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op1.Trustor, senderAccKP.Address()) + assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op1.Authorize) + // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. + op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op2.Trustor, receiverAccKP.Address()) + assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op2.Authorize) + // Check Operation 3: Payment from A to B. + op3, ok := tx.Operations()[2].(*txnbuild.Payment) + require.True(t, ok) + assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) + assert.Equal(t, op3.Destination, receiverAccKP.Address()) + assert.Equal(t, op3.Asset, assetGOAT) + // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. + op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op4.Trustor, receiverAccKP.Address()) + assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op4.Authorize) + // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. + op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op5.Trustor, senderAccKP.Address()) + assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op5.Authorize) +} + +func TestAPI_KYCIntegration(t *testing.T) { + ctx := context.Background() + db := dbtest.Open(t) + defer db.Close() + conn := db.Open() + defer conn.Close() + + // Perpare accounts on mock horizon. + issuerAccKeyPair := keypair.MustRandom() + senderAccKP := keypair.MustRandom() + receiverAccKP := keypair.MustRandom() + assetGOAT := txnbuild.CreditAsset{ + Code: "GOAT", + Issuer: issuerAccKeyPair.Address(), + } + horizonMock := horizonclient.MockClient{} + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). + Return(horizon.Account{ + Balances: []horizon.Balance{ + { + Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, + Balance: "0", + }, + }, + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). + Return(horizon.Account{ + AccountID: senderAccKP.Address(), + Sequence: "5", + }, nil) + horizonMock. + On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). + Return(horizon.Account{ + AccountID: receiverAccKP.Address(), + Sequence: "0", + }, nil) + + // Create tx-approve/ txApproveHandler. + kycThresholdAmount, err := amount.ParseInt64("500") + require.NoError(t, err) + handler := txApproveHandler{ + issuerKP: issuerAccKeyPair, + assetCode: assetGOAT.GetCode(), + horizonClient: &horizonMock, + networkPassphrase: network.TestNetworkPassphrase, + db: conn, + kycThreshold: kycThresholdAmount, + baseURL: "https://sep8-server.test", + } + + // Prepare transaction whose payment amount is <=500 GOATs for /tx-approve POST request. + senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) + require.NoError(t, err) + tx, err := txnbuild.NewTransaction( + txnbuild.TransactionParams{ + SourceAccount: &senderAcc, + IncrementSequenceNum: true, + Operations: []txnbuild.Operation{ + &txnbuild.Payment{ + SourceAccount: senderAccKP.Address(), + Destination: receiverAccKP.Address(), + Amount: "501", + Asset: assetGOAT, + }, + }, + BaseFee: txnbuild.MinBaseFee, + Timebounds: txnbuild.NewInfiniteTimeout(), + }, + ) + require.NoError(t, err) + txEnc, err := tx.Base64() + require.NoError(t, err) + + // Send /tx-approve POST request with transaction in request body. + req := `{ + "tx": "` + txEnc + `" + }` + m := chi.NewMux() + m.Post("/tx-approve", handler.ServeHTTP) + r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w := httptest.NewRecorder() + m.ServeHTTP(w, r) + resp := w.Result() + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "action_required" response for sender account. + var txApprovePOSTResponse txApprovalResponse + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse := txApprovalResponse{ + Status: sep8Status("action_required"), + Message: `Payments exceeding 500.00 GOAT requires KYC approval. Please provide an email address.`, + ActionURL: txApprovePOSTResponse.ActionURL, + ActionMethod: "POST", + ActionFields: []string{"email_address"}, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + + // Setup /kyc-status route for subsequent integration steps. + m.Route("/kyc-status", func(mux chi.Router) { + mux.Post("/{callback_id}", kycstatus.PostHandler{ + DB: conn, + }.ServeHTTP) + }) + // RxUUID is a regex used to validate correct UUIDs, https://w.wiki/39fK + var RxUUID = regexp.MustCompile( + `[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) + // Grab callbackID + callbackID := RxUUID.FindAllString(txApprovePOSTResponse.ActionURL, 1)[0] + + // Verify the KYC entree was inserted in db. + const q = ` + SELECT callback_id + FROM accounts_kyc_status + WHERE stellar_address = $1 + ` + var returnedCallbackID string + err = handler.db.QueryRowContext(ctx, q, senderAccKP.Address()).Scan(&returnedCallbackID) + require.NoError(t, err) + assert.Equal(t, callbackID, returnedCallbackID) + + // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that doesn't start with "x". + req = `{ + "email_address": "TestEmail@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for approved account. + wantBody := `{"result": "no_further_action_required"}` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "revised" response for approved account. + txApprovePOSTResponse = txApprovalResponse{} + assert.Empty(t, txApprovePOSTResponse) + err = json.Unmarshal(body, &txApprovePOSTResponse) + require.NoError(t, err) + wantTXApprovalResponse = txApprovalResponse{ + Status: sep8Status("revised"), + Tx: txApprovePOSTResponse.Tx, + Message: `Authorization and deauthorization operations were added.`, + } + assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) + + // Decode the request's transaction. + parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) + require.NoError(t, err) + tx, ok := parsed.Transaction() + require.True(t, ok) + + // Check if revised transaction only has 5 operations. + require.Len(t, tx.Operations(), 5) + // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. + op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op1.Trustor, senderAccKP.Address()) + assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op1.Authorize) + // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. + op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op2.Trustor, receiverAccKP.Address()) + assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) + require.True(t, op2.Authorize) + // Check Operation 3: Payment from A to B. + op3, ok := tx.Operations()[2].(*txnbuild.Payment) + require.True(t, ok) + assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) + assert.Equal(t, op3.Destination, receiverAccKP.Address()) + assert.Equal(t, op3.Asset, assetGOAT) + // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. + op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op4.Trustor, receiverAccKP.Address()) + assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op4.Authorize) + // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. + op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) + require.True(t, ok) + assert.Equal(t, op5.Trustor, senderAccKP.Address()) + assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) + require.False(t, op5.Authorize) + + // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that starts with "x". + req = `{ + "email_address": "xTestEmail@email.com" + }` + r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "no_further_action_required" response for approved account. + wantBody = `{"result": "no_further_action_required"}` + require.JSONEq(t, wantBody, string(body)) + + // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. + req = `{ + "tx": "` + txEnc + `" + }` + r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) + r = r.WithContext(ctx) + w = httptest.NewRecorder() + m.ServeHTTP(w, r) + resp = w.Result() + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Equal(t, http.StatusBadRequest, resp.StatusCode) + assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) + body, err = ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + // TEST "rejected" response for rejected KYC account. + wantBody = `{ + "status":"rejected", "error":"Your KYC was rejected and you're not authorized for operations above 500.00 GOAT." + }` + require.JSONEq(t, wantBody, string(body)) +} diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve.go b/services/regulated-assets-approval-server/internal/serve/tx_approve.go index 801d93e6ea..e37d7b153f 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve.go @@ -278,7 +278,11 @@ func (h txApproveHandler) handleKYCRequiredOperationIfNeeded(ctx context.Context return nil, nil } if rejectedAt.Valid { - return NewRejectedTxApprovalResponse(fmt.Sprintf("Your KYC was rejected and you're not authorized for operations above %s %s.", amount.StringFromInt64(h.kycThreshold), h.assetCode)), nil + kycThreshold, err := convertThresholdToReadableString(h.kycThreshold) + if err != nil { + return nil, errors.Wrap(err, "converting kycThreshold to human readable string") + } + return NewRejectedTxApprovalResponse(fmt.Sprintf("Your KYC was rejected and you're not authorized for operations above %s %s.", kycThreshold, h.assetCode)), nil } return NewActionRequiredTxApprovalResponse( diff --git a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go index 39b48083ea..1092416668 100644 --- a/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go +++ b/services/regulated-assets-approval-server/internal/serve/tx_approve_test.go @@ -2,16 +2,9 @@ package serve import ( "context" - "encoding/json" - "fmt" - "io/ioutil" "net/http" - "net/http/httptest" - "regexp" - "strings" "testing" - "github.com/go-chi/chi" "github.com/stellar/go/amount" "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/keypair" @@ -19,7 +12,6 @@ import ( "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/protocols/horizon/base" "github.com/stellar/go/services/regulated-assets-approval-server/internal/db/dbtest" - kycstatus "github.com/stellar/go/services/regulated-assets-approval-server/internal/serve/kyc-status" "github.com/stellar/go/txnbuild" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -30,6 +22,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { h := txApproveHandler{} err := h.validate() require.EqualError(t, err, "issuer keypair cannot be nil") + // empty asset code. issuerAccKeyPair := keypair.MustRandom() h = txApproveHandler{ @@ -37,6 +30,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "asset code cannot be empty") + // No Horizon client. h = txApproveHandler{ issuerKP: issuerAccKeyPair, @@ -44,6 +38,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "horizon client cannot be nil") + // No network passphrase. horizonMock := horizonclient.MockClient{} h = txApproveHandler{ @@ -53,6 +48,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "network passphrase cannot be empty") + // No db. h = txApproveHandler{ issuerKP: issuerAccKeyPair, @@ -62,6 +58,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "database cannot be nil") + // Empty kycThreshold. db := dbtest.Open(t) defer db.Close() @@ -76,6 +73,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + // Negative kycThreshold. h = txApproveHandler{ issuerKP: issuerAccKeyPair, @@ -87,6 +85,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "kyc threshold cannot be less than or equal to zero") + // no baseURL. h = txApproveHandler{ issuerKP: issuerAccKeyPair, @@ -98,6 +97,7 @@ func TestTxApproveHandlerValidate(t *testing.T) { } err = h.validate() require.EqualError(t, err, "base url cannot be empty") + // Success. h = txApproveHandler{ issuerKP: issuerAccKeyPair, @@ -322,12 +322,10 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { baseURL: "https://sep8-server.test", } - // Prepare empty "tx" for txApprove. + // TEST "rejected" response if no transaction is submitted; with empty "tx" for txApprove. req := txApproveRequest{ Tx: "", } - - // TEST "rejected" response if no transaction is submitted. rejectedResponse, err := handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse := txApprovalResponse{ @@ -337,12 +335,10 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { } assert.Equal(t, &wantRejectedResponse, rejectedResponse) - // Prepare malformed "tx" for txApprove. + // TEST "rejected" response if can't parse XDR; with malformed "tx" for txApprove. req = txApproveRequest{ Tx: "BADXDRTRANSACTIONENVELOPE", } - - // TEST "rejected" response if can't parse XDR. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -381,11 +377,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { require.NoError(t, err) feeBumpTxEnc, err := feeBumpTx.Base64() require.NoError(t, err) + + // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. req = txApproveRequest{ Tx: feeBumpTxEnc, } - - // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) assert.Equal(t, &wantRejectedResponse, rejectedResponse) // wantRejectedResponse is identical to "if can't parse XDR". @@ -411,11 +407,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { require.NoError(t, err) txEnc, err := tx.Base64() require.NoError(t, err) + + // TEST "rejected" response for sender account; transaction sourceAccount the same as the server issuer account. req = txApproveRequest{ Tx: txEnc, } - - // TEST "rejected" response for sender account; transaction sourceAccount the same as the server issuer account. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -445,11 +441,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { require.NoError(t, err) txEnc, err = tx.Base64() require.NoError(t, err) + + // TEST "rejected" response for sender account; payment operation sourceAccount the same as the server issuer account. req = txApproveRequest{ Tx: txEnc, } - - // TEST "rejected" response for sender account; payment operation sourceAccount the same as the server issuer account. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -477,11 +473,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { ) require.NoError(t, err) txEnc, err = tx.Base64() + + // TEST "rejected" response if operation is not a payment (in this case allowing trust for receiverAccKP). req = txApproveRequest{ Tx: txEnc, } - - // TEST "rejected" response if operation is not a payment (in this case allowing trust for receiverAccKP). rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -517,11 +513,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { require.NoError(t, err) txEnc, err = tx.Base64() require.NoError(t, err) + + // TEST "rejected" response for sender account; transaction with multiple operations. req = txApproveRequest{ Tx: txEnc, } - - // TEST "rejected" response for sender account; transaction with multiple operations. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -554,11 +550,11 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { require.NoError(t, err) txEnc, err = tx.Base64() require.NoError(t, err) + + // TEST "rejected" response if transaction source account seq num is not equal to account sequence+1. req = txApproveRequest{ Tx: txEnc, } - - // TEST "rejected" response if transaction source account seq num is not equal to account sequence+1. rejectedResponse, err = handler.txApprove(ctx, req) require.NoError(t, err) wantRejectedResponse = txApprovalResponse{ @@ -568,739 +564,3 @@ func TestTxApproveHandlerTxApprove(t *testing.T) { } assert.Equal(t, &wantRejectedResponse, rejectedResponse) } - -func TestAPI_RejectedIntegration(t *testing.T) { - ctx := context.Background() - db := dbtest.Open(t) - defer db.Close() - conn := db.Open() - defer conn.Close() - - // Perpare accounts on mock horizon. - issuerAccKeyPair := keypair.MustRandom() - assetGOAT := txnbuild.CreditAsset{ - Code: "GOAT", - Issuer: issuerAccKeyPair.Address(), - } - horizonMock := horizonclient.MockClient{} - senderAccKP := keypair.MustRandom() - receiverAccKP := keypair.MustRandom() - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). - Return(horizon.Account{ - AccountID: issuerAccKeyPair.Address(), - Sequence: "1", - Balances: []horizon.Balance{ - { - Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, - Balance: "1", - }, - }, - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). - Return(horizon.Account{ - AccountID: senderAccKP.Address(), - Sequence: "2", - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). - Return(horizon.Account{ - AccountID: receiverAccKP.Address(), - Sequence: "3", - }, nil) - - // Create tx-approve/ txApproveHandler. - kycThresholdAmount, err := amount.ParseInt64("500") - require.NoError(t, err) - handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), - horizonClient: &horizonMock, - networkPassphrase: network.TestNetworkPassphrase, - db: conn, - kycThreshold: kycThresholdAmount, - baseURL: "https://sep8-server.test", - } - - // Prepare and send empty "tx" for "/tx-approve" POST request. - m := chi.NewMux() - m.Post("/tx-approve", handler.ServeHTTP) - req := `{ - "tx": "" - }` - r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - resp := w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err := ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if no transaction is submitted. - wantBody := `{ - "status":"rejected", "error":"Missing parameter \"tx\"." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare malformed "tx" for "/tx-approve" POST request. - req = `{ - "tx": "BADXDRTRANSACTIONENVELOPE" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if can't parse XDR. - wantBody = `{ - "status":"rejected", "error":"Invalid parameter \"tx\"." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send invalid(non generic transaction) "tx" for "/tx-approve" POST request. - senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) - require.NoError(t, err) - tx, err := txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - Destination: receiverAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - feeBumpTx, err := txnbuild.NewFeeBumpTransaction( - txnbuild.FeeBumpTransactionParams{ - Inner: tx, - FeeAccount: receiverAccKP.Address(), - BaseFee: 2 * txnbuild.MinBaseFee, - }, - ) - require.NoError(t, err) - feeBumpTxEnc, err := feeBumpTx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + feeBumpTxEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if a non generic transaction fails, same result as malformed XDR. - wantBody = `{ - "status":"rejected", "error":"Invalid parameter \"tx\"." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send "tx" where transaction sourceAccount the same as the server issuer account for "/tx-approve" POST request. - issuerAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}) - require.NoError(t, err) - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &issuerAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - Destination: senderAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err := tx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if the transaction sourceAccount the same as the server issuer account. - wantBody = `{ - "status":"rejected", "error":"The source account is invalid." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send "tx" where transaction's operation sourceAccount the same as the server issuer account for "/tx-approve" POST request. - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: issuerAccKeyPair.Address(), - Destination: senderAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err = tx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if the transaction's operation sourceAccount the same as the server issuer account. - wantBody = `{ - "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send "tx" where transaction's operation is not a payment for "/tx-approve" POST request. - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.AllowTrust{ - Trustor: receiverAccKP.Address(), - Type: assetGOAT, - Authorize: true, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err = tx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if transaction's operation is not a payment. - wantBody = `{ - "status":"rejected", "error":"There is one or more unauthorized operations in the provided transaction." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send "tx" where theres more than one operation in transaction for "/tx-approve" POST request. - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: senderAccKP.Address(), - Destination: receiverAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - &txnbuild.Payment{ - SourceAccount: senderAccKP.Address(), - Destination: receiverAccKP.Address(), - Amount: "2", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err = tx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if more than one operation in transaction. - wantBody = `{ - "status":"rejected", "error":"Please submit a transaction with exactly one operation of type payment." - }` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send "tx" where transaction's transaction source account seq num is not equal to account sequence+1 for "/tx-approve" POST request. - tx, err = txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &horizon.Account{ - AccountID: senderAccKP.Address(), - Sequence: "50", - }, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: senderAccKP.Address(), - Destination: receiverAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err = tx.Base64() - require.NoError(t, err) - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response if where transaction's transaction source account seq num is not equal to account sequence+1. - wantBody = `{ - "status":"rejected", "error":"Invalid transaction sequence number." - }` - require.JSONEq(t, wantBody, string(body)) -} - -func TestAPI_RevisedIntegration(t *testing.T) { - ctx := context.Background() - db := dbtest.Open(t) - defer db.Close() - conn := db.Open() - defer conn.Close() - - // Perpare accounts on mock horizon. - issuerAccKeyPair := keypair.MustRandom() - senderAccKP := keypair.MustRandom() - receiverAccKP := keypair.MustRandom() - assetGOAT := txnbuild.CreditAsset{ - Code: "GOAT", - Issuer: issuerAccKeyPair.Address(), - } - horizonMock := horizonclient.MockClient{} - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). - Return(horizon.Account{ - Balances: []horizon.Balance{ - { - Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, - Balance: "0", - }, - }, - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). - Return(horizon.Account{ - AccountID: senderAccKP.Address(), - Sequence: "5", - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). - Return(horizon.Account{ - AccountID: receiverAccKP.Address(), - Sequence: "0", - }, nil) - - // Create tx-approve/ txApproveHandler. - kycThresholdAmount, err := amount.ParseInt64("500") - require.NoError(t, err) - handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), - horizonClient: &horizonMock, - networkPassphrase: network.TestNetworkPassphrase, - db: conn, - kycThreshold: kycThresholdAmount, - baseURL: "https://sep8-server.test", - } - - // Prepare and send revisable "tx" for "/tx-approve" POST request. - senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) - require.NoError(t, err) - tx, err := txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: senderAccKP.Address(), - Destination: receiverAccKP.Address(), - Amount: "1", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err := tx.Base64() - require.NoError(t, err) - m := chi.NewMux() - m.Post("/tx-approve", handler.ServeHTTP) - req := `{ - "tx": "` + txEnc + `" - }` - r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - resp := w.Result() - assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err := ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST Successful request. - var txApprovePOSTResponse txApprovalResponse - err = json.Unmarshal(body, &txApprovePOSTResponse) - require.NoError(t, err) - wantTXApprovalResponse := txApprovalResponse{ - Status: sep8Status("revised"), - Tx: txApprovePOSTResponse.Tx, - Message: `Authorization and deauthorization operations were added.`, - } - assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) - - // Decode the request's transaction. - parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) - require.NoError(t, err) - tx, ok := parsed.Transaction() - require.True(t, ok) - - // Check if revised transaction only has 5 operations. - require.Len(t, tx.Operations(), 5) - // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. - op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op1.Trustor, senderAccKP.Address()) - assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) - require.True(t, op1.Authorize) - // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. - op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op2.Trustor, receiverAccKP.Address()) - assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) - require.True(t, op2.Authorize) - // Check Operation 3: Payment from A to B. - op3, ok := tx.Operations()[2].(*txnbuild.Payment) - require.True(t, ok) - assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) - assert.Equal(t, op3.Destination, receiverAccKP.Address()) - assert.Equal(t, op3.Asset, assetGOAT) - // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. - op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op4.Trustor, receiverAccKP.Address()) - assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) - require.False(t, op4.Authorize) - // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. - op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op5.Trustor, senderAccKP.Address()) - assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) - require.False(t, op5.Authorize) -} - -func TestAPI_KYCIntegration(t *testing.T) { - ctx := context.Background() - db := dbtest.Open(t) - defer db.Close() - conn := db.Open() - defer conn.Close() - - // Perpare accounts on mock horizon. - issuerAccKeyPair := keypair.MustRandom() - senderAccKP := keypair.MustRandom() - receiverAccKP := keypair.MustRandom() - assetGOAT := txnbuild.CreditAsset{ - Code: "GOAT", - Issuer: issuerAccKeyPair.Address(), - } - horizonMock := horizonclient.MockClient{} - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: issuerAccKeyPair.Address()}). - Return(horizon.Account{ - Balances: []horizon.Balance{ - { - Asset: base.Asset{Code: "ASSET", Issuer: issuerAccKeyPair.Address()}, - Balance: "0", - }, - }, - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: senderAccKP.Address()}). - Return(horizon.Account{ - AccountID: senderAccKP.Address(), - Sequence: "5", - }, nil) - horizonMock. - On("AccountDetail", horizonclient.AccountRequest{AccountID: receiverAccKP.Address()}). - Return(horizon.Account{ - AccountID: receiverAccKP.Address(), - Sequence: "0", - }, nil) - - // Create tx-approve/ txApproveHandler. - kycThresholdAmount, err := amount.ParseInt64("500") - require.NoError(t, err) - handler := txApproveHandler{ - issuerKP: issuerAccKeyPair, - assetCode: assetGOAT.GetCode(), - horizonClient: &horizonMock, - networkPassphrase: network.TestNetworkPassphrase, - db: conn, - kycThreshold: kycThresholdAmount, - baseURL: "https://sep8-server.test", - } - - // Prepare transaction whose payment amount is <=500 GOATs for /tx-approve POST request. - senderAcc, err := handler.horizonClient.AccountDetail(horizonclient.AccountRequest{AccountID: senderAccKP.Address()}) - require.NoError(t, err) - tx, err := txnbuild.NewTransaction( - txnbuild.TransactionParams{ - SourceAccount: &senderAcc, - IncrementSequenceNum: true, - Operations: []txnbuild.Operation{ - &txnbuild.Payment{ - SourceAccount: senderAccKP.Address(), - Destination: receiverAccKP.Address(), - Amount: "501", - Asset: assetGOAT, - }, - }, - BaseFee: txnbuild.MinBaseFee, - Timebounds: txnbuild.NewInfiniteTimeout(), - }, - ) - require.NoError(t, err) - txEnc, err := tx.Base64() - require.NoError(t, err) - - // Prepare and send /tx-approve POST request with transaction in request body. - m := chi.NewMux() - m.Post("/tx-approve", handler.ServeHTTP) - req := `{ - "tx": "` + txEnc + `" - }` - r := httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - resp := w.Result() - assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err := ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "action_required" response for sender account. - var txApprovePOSTResponse txApprovalResponse - err = json.Unmarshal(body, &txApprovePOSTResponse) - require.NoError(t, err) - wantTXApprovalResponse := txApprovalResponse{ - Status: sep8Status("action_required"), - Message: `Payments exceeding 500.00 GOAT requires KYC approval. Please provide an email address.`, - ActionURL: txApprovePOSTResponse.ActionURL, - ActionMethod: "POST", - ActionFields: []string{"email_address"}, - } - assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) - - // Setup /kyc-status route for subsequent integration steps. - m.Route("/kyc-status", func(mux chi.Router) { - mux.Post("/{callback_id}", kycstatus.PostHandler{ - DB: conn, - }.ServeHTTP) - }) - // RxUUID is a regex used to validate correct UUIDs, https://w.wiki/39fK - var RxUUID = regexp.MustCompile( - `[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) - // Grab callbackID - callbackID := RxUUID.FindAllString(txApprovePOSTResponse.ActionURL, 1)[0] - - // Verify the KYC entree was inserted in db. - const q = ` - SELECT callback_id - FROM accounts_kyc_status - WHERE stellar_address = $1 - ` - var returnedCallbackID string - err = handler.db.QueryRowContext(ctx, q, senderAccKP.Address()).Scan(&returnedCallbackID) - require.NoError(t, err) - assert.Equal(t, callbackID, returnedCallbackID) - - // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that doesn't start with "x". - req = `{ - "email_address": "TestEmail@email.com" - }` - r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusOK, resp.StatusCode) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "no_further_action_required" response for approved account. - wantBody := `{"result": "no_further_action_required"}` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "revised" response for approved account. - txApprovePOSTResponse = txApprovalResponse{} - assert.Empty(t, txApprovePOSTResponse) - err = json.Unmarshal(body, &txApprovePOSTResponse) - require.NoError(t, err) - wantTXApprovalResponse = txApprovalResponse{ - Status: sep8Status("revised"), - Tx: txApprovePOSTResponse.Tx, - Message: `Authorization and deauthorization operations were added.`, - } - assert.Equal(t, wantTXApprovalResponse, txApprovePOSTResponse) - - // Decode the request's transaction. - parsed, err := txnbuild.TransactionFromXDR(txApprovePOSTResponse.Tx) - require.NoError(t, err) - tx, ok := parsed.Transaction() - require.True(t, ok) - - // Check if revised transaction only has 5 operations. - require.Len(t, tx.Operations(), 5) - // Check Operation 1: AllowTrust op where issuer fully authorizes account A, asset X. - op1, ok := tx.Operations()[0].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op1.Trustor, senderAccKP.Address()) - assert.Equal(t, op1.Type.GetCode(), assetGOAT.GetCode()) - require.True(t, op1.Authorize) - // Check Operation 2: AllowTrust op where issuer fully authorizes account B, asset X. - op2, ok := tx.Operations()[1].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op2.Trustor, receiverAccKP.Address()) - assert.Equal(t, op2.Type.GetCode(), assetGOAT.GetCode()) - require.True(t, op2.Authorize) - // Check Operation 3: Payment from A to B. - op3, ok := tx.Operations()[2].(*txnbuild.Payment) - require.True(t, ok) - assert.Equal(t, op3.SourceAccount, senderAccKP.Address()) - assert.Equal(t, op3.Destination, receiverAccKP.Address()) - assert.Equal(t, op3.Asset, assetGOAT) - // Check Operation 4: AllowTrust op where issuer fully deauthorizes account B, asset X. - op4, ok := tx.Operations()[3].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op4.Trustor, receiverAccKP.Address()) - assert.Equal(t, op4.Type.GetCode(), assetGOAT.GetCode()) - require.False(t, op4.Authorize) - // Check Operation 5: AllowTrust op where issuer fully deauthorizes account A, asset X. - op5, ok := tx.Operations()[4].(*txnbuild.AllowTrust) - require.True(t, ok) - assert.Equal(t, op5.Trustor, senderAccKP.Address()) - assert.Equal(t, op5.Type.GetCode(), assetGOAT.GetCode()) - require.False(t, op5.Authorize) - - // Prepare and send /kyc-status/{callback_id} POST request; with an email_address that starts with "x". - req = `{ - "email_address": "xTestEmail@email.com" - }` - r = httptest.NewRequest("POST", fmt.Sprintf("/kyc-status/%s", callbackID), strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusOK, resp.StatusCode) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "no_further_action_required" response for approved account. - wantBody = `{"result": "no_further_action_required"}` - require.JSONEq(t, wantBody, string(body)) - - // Prepare and send /tx-approve POST request to be revised tx via a new /tx-approve POST. - req = `{ - "tx": "` + txEnc + `" - }` - r = httptest.NewRequest("POST", "/tx-approve", strings.NewReader(req)) - r = r.WithContext(ctx) - w = httptest.NewRecorder() - m.ServeHTTP(w, r) - resp = w.Result() - assert.Equal(t, http.StatusBadRequest, resp.StatusCode) - assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get("Content-Type")) - body, err = ioutil.ReadAll(resp.Body) - require.NoError(t, err) - - // TEST "rejected" response for rejected KYC account. - wantBody = `{ - "status":"rejected", "error":"Your KYC was rejected and you're not authorized for operations above 500.0000000 GOAT." - }` - require.JSONEq(t, wantBody, string(body)) -} From 59cef489c479394a2c402f71454a4e69a014481c Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Fri, 21 May 2021 19:05:52 -0700 Subject: [PATCH 54/67] txnbuild: add missing test for timebounds (#3623) Add missing test for when time bounds are not provided, where an error is expected. It looks like this behavior is not tested and I'm changing the behavior of this functionality for CAP-21, and it would be helpful if it was tested so that any changes in behavior are detected and clear. --- txnbuild/transaction_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/txnbuild/transaction_test.go b/txnbuild/transaction_test.go index cb26411e55..f792e6634e 100644 --- a/txnbuild/transaction_test.go +++ b/txnbuild/transaction_test.go @@ -15,6 +15,37 @@ import ( "github.com/stretchr/testify/require" ) +func TestMissingTimebounds(t *testing.T) { + kp0 := newKeypair0() + + _, err := NewTransaction( + TransactionParams{ + SourceAccount: &SimpleAccount{AccountID: kp0.Address(), Sequence: 1}, + Operations: []Operation{&BumpSequence{BumpTo: 0}}, + BaseFee: MinBaseFee, + }, + ) + assert.EqualError(t, err, "invalid time bounds: timebounds must be constructed using NewTimebounds(), NewTimeout(), or NewInfiniteTimeout()") +} + +func TestTimebounds(t *testing.T) { + kp0 := newKeypair0() + + tb := NewTimeout(300) + tx, err := NewTransaction( + TransactionParams{ + SourceAccount: &SimpleAccount{AccountID: kp0.Address(), Sequence: 1}, + Operations: []Operation{&BumpSequence{BumpTo: 0}}, + BaseFee: MinBaseFee, + Timebounds: tb, + }, + ) + assert.NoError(t, err) + assert.Equal(t, tb, tx.timebounds) + assert.Equal(t, xdr.TimePoint(tb.MinTime), tx.envelope.V1.Tx.TimeBounds.MinTime) + assert.Equal(t, xdr.TimePoint(tb.MaxTime), tx.envelope.V1.Tx.TimeBounds.MaxTime) +} + func TestMissingSourceAccount(t *testing.T) { _, err := NewTransaction(TransactionParams{}) assert.EqualError(t, err, "transaction has no source account") From eee7b9adc37855af352b7b37d2c6abc0dedd58a2 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Fri, 21 May 2021 23:28:20 -0700 Subject: [PATCH 55/67] txnbuild: fix bug where base fee is not allowed to be zero (#3622) Allow the base fee to be zero when building transactions. The `txnbuild.NewTransaction` function errors when creating a transaction with a base fee of zero. This is a bug. Transactions with a zero base fee are accepted to the Stellar network when they are wrapped in a fee bump transaction envelope that pays the fee of the transaction. Applications use a zero base fee on the inner transaction to support fee sponsorship by an account that isn't the transaction source account. --- txnbuild/CHANGELOG.md | 4 ++++ txnbuild/transaction.go | 6 ++---- txnbuild/transaction_fee_test.go | 28 ++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/txnbuild/CHANGELOG.md b/txnbuild/CHANGELOG.md index dbea01d93d..889be9b870 100644 --- a/txnbuild/CHANGELOG.md +++ b/txnbuild/CHANGELOG.md @@ -5,6 +5,10 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### Bug Fix + +* `BaseFee` in `TransactionParams` when calling `NewTransaction` is allowed to be zero because the fee can be paid by wrapping a `Transaction` in a `FeeBumpTransaction`. ([#3622](https://github.com/stellar/go/pull/3622)) + ## [v7.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v7.0.0) - 2021-05-15 ### Breaking changes diff --git a/txnbuild/transaction.go b/txnbuild/transaction.go index 871a2a5089..814028837c 100644 --- a/txnbuild/transaction.go +++ b/txnbuild/transaction.go @@ -678,10 +678,8 @@ func NewTransaction(params TransactionParams) (*Transaction, error) { sourceAccount = accountID.ToMuxedAccount() } - if tx.baseFee < MinBaseFee { - return nil, errors.Errorf( - "base fee cannot be lower than network minimum of %d", MinBaseFee, - ) + if tx.baseFee < 0 { + return nil, errors.Errorf("base fee cannot be negative") } if len(tx.operations) == 0 { diff --git a/txnbuild/transaction_fee_test.go b/txnbuild/transaction_fee_test.go index ae49462f0f..888f8a2483 100644 --- a/txnbuild/transaction_fee_test.go +++ b/txnbuild/transaction_fee_test.go @@ -4,23 +4,36 @@ import ( "math" "testing" + "github.com/stellar/go/keypair" "github.com/stretchr/testify/assert" ) -func TestMinBaseFee(t *testing.T) { - kp0 := newKeypair0() - sourceAccount := NewSimpleAccount(kp0.Address(), 1) +func TestBaseFeeCanBeZeroOrPositive(t *testing.T) { + validBaseFees := []int64{0, MinBaseFee} + for _, bf := range validBaseFees { + tx, err := NewTransaction( + TransactionParams{ + SourceAccount: &SimpleAccount{keypair.MustRandom().Address(), 1}, + Operations: []Operation{&Inflation{}}, + BaseFee: bf, + Timebounds: NewInfiniteTimeout(), + }, + ) + assert.NoError(t, err) + assert.Equal(t, bf, tx.baseFee) + } +} +func TestBaseFeeErrorWhenNegative(t *testing.T) { _, err := NewTransaction( TransactionParams{ - SourceAccount: &sourceAccount, + SourceAccount: &SimpleAccount{keypair.MustRandom().Address(), 1}, Operations: []Operation{&Inflation{}}, - BaseFee: MinBaseFee - 1, + BaseFee: -1, Timebounds: NewInfiniteTimeout(), }, ) - - assert.EqualError(t, err, "base fee cannot be lower than network minimum of 100") + assert.EqualError(t, err, "base fee cannot be negative") } func TestFeeBumpMinBaseFee(t *testing.T) { @@ -46,7 +59,6 @@ func TestFeeBumpMinBaseFee(t *testing.T) { }, ) assert.EqualError(t, err, "base fee cannot be lower than network minimum of 100") - } func TestFeeOverflow(t *testing.T) { From a11d444f7a0b70a11efae0ff181f1caad11abdd1 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 24 May 2021 01:32:11 +0200 Subject: [PATCH 56/67] services/horizon: Add Muxed Account details to effect responses (#3610) --- protocols/horizon/effects/main.go | 6 +- services/horizon/internal/db2/history/main.go | 2 + .../ingest/processors/effects_processor.go | 216 +++++++++--------- .../processors/effects_processor_test.go | 24 +- .../internal/resourceadapter/effects.go | 18 +- .../internal/resourceadapter/effects_test.go | 43 ++++ 6 files changed, 196 insertions(+), 113 deletions(-) diff --git a/protocols/horizon/effects/main.go b/protocols/horizon/effects/main.go index 1e5cb54590..7a83e6e5a8 100644 --- a/protocols/horizon/effects/main.go +++ b/protocols/horizon/effects/main.go @@ -2,11 +2,11 @@ package effects import ( "encoding/json" - "github.com/stellar/go/xdr" "time" "github.com/stellar/go/protocols/horizon/base" "github.com/stellar/go/support/render/hal" + "github.com/stellar/go/xdr" ) // Peter 30-04-2019: this is copied from the history package "github.com/stellar/go/services/horizon/internal/db2/history" @@ -249,6 +249,8 @@ type Base struct { ID string `json:"id"` PT string `json:"paging_token"` Account string `json:"account"` + AccountMuxed string `json:"account_muxed,omitempty"` + AccountMuxedID uint64 `json:"account_muxed_id,omitempty"` Type string `json:"type"` TypeI int32 `json:"type_i"` LedgerCloseTime time.Time `json:"created_at"` @@ -382,6 +384,8 @@ type TrustlineDeauthorized struct { type Trade struct { Base Seller string `json:"seller"` + SellerMuxed string `json:"seller_muxed,omitempty"` + SellerMuxedID uint64 `json:"seller_muxed_id,omitempty"` OfferID int64 `json:"offer_id,string"` SoldAmount string `json:"sold_amount"` SoldAssetType string `json:"sold_asset_type"` diff --git a/services/horizon/internal/db2/history/main.go b/services/horizon/internal/db2/history/main.go index 9f488f1cde..beb4cf5a1b 100644 --- a/services/horizon/internal/db2/history/main.go +++ b/services/horizon/internal/db2/history/main.go @@ -427,6 +427,8 @@ type Effect struct { // when the effect type is trade type TradeEffectDetails struct { Seller string `json:"seller"` + SellerMuxed string `json:"seller_muxed,omitempty"` + SellerMuxedID uint64 `json:"seller_muxed_id,omitempty"` OfferID int64 `json:"offer_id"` SoldAmount string `json:"sold_amount"` SoldAssetType string `json:"sold_asset_type"` diff --git a/services/horizon/internal/ingest/processors/effects_processor.go b/services/horizon/internal/ingest/processors/effects_processor.go index 17ed9ff876..0f421d7607 100644 --- a/services/horizon/internal/ingest/processors/effects_processor.go +++ b/services/horizon/internal/ingest/processors/effects_processor.go @@ -234,9 +234,9 @@ type effectsWrapper struct { operation *transactionOperationWrapper } -func (e *effectsWrapper) add(address string, effectType history.EffectType, details map[string]interface{}) { +func (e *effectsWrapper) add(address *xdr.AccountId, effectType history.EffectType, details map[string]interface{}) { e.effects = append(e.effects, effect{ - address: address, + address: address.Address(), operationID: e.operation.ID(), effectType: effectType, order: uint32(len(e.effects) + 1), @@ -244,6 +244,16 @@ func (e *effectsWrapper) add(address string, effectType history.EffectType, deta }) } +func (e *effectsWrapper) addMuxed(address *xdr.MuxedAccount, effectType history.EffectType, details map[string]interface{}) { + if address.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + // We abuse the details to inject muxed-account information without changing the DB schema + details["account_muxed"] = address.Address() + details["account_muxed_id"] = uint64(address.Med25519.Id) + } + accID := address.ToAccountId() + e.add(&accID, effectType, details) +} + var sponsoringEffectsTable = map[xdr.LedgerEntryType]struct { created, updated, removed history.EffectType }{ @@ -312,12 +322,12 @@ func (e *effectsWrapper) addSignerSponsorshipEffects(change ingest.Change) { details["sponsor"] = post.Address() details["signer"] = signer srcAccount := change.Post.Data.MustAccount().AccountId - e.add(srcAccount.Address(), history.EffectSignerSponsorshipCreated, details) + e.add(&srcAccount, history.EffectSignerSponsorshipCreated, details) case !foundPost && foundPre: details["former_sponsor"] = pre.Address() details["signer"] = signer srcAccount := change.Pre.Data.MustAccount().AccountId - e.add(srcAccount.Address(), history.EffectSignerSponsorshipRemoved, details) + e.add(&srcAccount, history.EffectSignerSponsorshipRemoved, details) case foundPre && foundPost: formerSponsor := pre.Address() newSponsor := post.Address() @@ -329,7 +339,7 @@ func (e *effectsWrapper) addSignerSponsorshipEffects(change ingest.Change) { details["new_sponsor"] = newSponsor details["signer"] = signer srcAccount := change.Post.Data.MustAccount().AccountId - e.add(srcAccount.Address(), history.EffectSignerSponsorshipUpdated, details) + e.add(&srcAccount, history.EffectSignerSponsorshipUpdated, details) } } } @@ -366,7 +376,11 @@ func (e *effectsWrapper) addLedgerEntrySponsorshipEffects(change ingest.Change) return nil } - var accountAddress string + var ( + accountID *xdr.AccountId + muxedAccount *xdr.MuxedAccount + ) + var data xdr.LedgerEntryData if change.Post != nil { data = change.Post.Data @@ -376,17 +390,17 @@ func (e *effectsWrapper) addLedgerEntrySponsorshipEffects(change ingest.Change) switch change.Type { case xdr.LedgerEntryTypeAccount: - aid := data.MustAccount().AccountId - accountAddress = aid.Address() + a := data.MustAccount().AccountId + accountID = &a case xdr.LedgerEntryTypeTrustline: - aid := data.MustTrustLine().AccountId - accountAddress = aid.Address() + a := data.MustTrustLine().AccountId + accountID = &a details["asset"] = data.MustTrustLine().Asset.StringCanonical() case xdr.LedgerEntryTypeData: - accountAddress = e.operation.SourceAccount().Address() + muxedAccount = e.operation.SourceAccount() details["data_name"] = data.MustData().DataName case xdr.LedgerEntryTypeClaimableBalance: - accountAddress = e.operation.SourceAccount().Address() + muxedAccount = e.operation.SourceAccount() var err error details["balance_id"], err = xdr.MarshalHex(data.MustClaimableBalance().BalanceId) if err != nil { @@ -396,7 +410,12 @@ func (e *effectsWrapper) addLedgerEntrySponsorshipEffects(change ingest.Change) return errors.Errorf("invalid sponsorship ledger entry type %v", change.Type.String()) } - e.add(accountAddress, effectType, details) + if accountID != nil { + e.add(accountID, effectType, details) + } else { + e.addMuxed(muxedAccount, effectType, details) + } + return nil } @@ -404,15 +423,14 @@ func (e *effectsWrapper) addAccountCreatedEffects() { op := e.operation.operation.Body.MustCreateAccountOp() e.add( - op.Destination.Address(), + &op.Destination, history.EffectAccountCreated, map[string]interface{}{ "starting_balance": amount.String(op.StartingBalance), }, ) - accId := e.operation.SourceAccount().ToAccountId() - e.add( - accId.Address(), + e.addMuxed( + e.operation.SourceAccount(), history.EffectAccountDebited, map[string]interface{}{ "asset_type": "native", @@ -420,7 +438,7 @@ func (e *effectsWrapper) addAccountCreatedEffects() { }, ) e.add( - op.Destination.Address(), + &op.Destination, history.EffectSignerCreated, map[string]interface{}{ "public_key": op.Destination.Address(), @@ -435,15 +453,13 @@ func (e *effectsWrapper) addPaymentEffects() { details := map[string]interface{}{"amount": amount.String(op.Amount)} addAssetDetails(details, op.Asset, "") - aid := op.Destination.ToAccountId() - e.add( - aid.Address(), + e.addMuxed( + &op.Destination, history.EffectAccountCredited, details, ) - source := e.operation.SourceAccount().ToAccountId() - e.add( - source.Address(), + e.addMuxed( + e.operation.SourceAccount(), history.EffectAccountDebited, details, ) @@ -452,14 +468,13 @@ func (e *effectsWrapper) addPaymentEffects() { func (e *effectsWrapper) pathPaymentStrictReceiveEffects() { op := e.operation.operation.Body.MustPathPaymentStrictReceiveOp() resultSuccess := e.operation.OperationResult().MustPathPaymentStrictReceiveResult().MustSuccess() - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() details := map[string]interface{}{"amount": amount.String(op.DestAmount)} addAssetDetails(details, op.DestAsset, "") - aid := op.Destination.ToAccountId() - e.add( - aid.Address(), + e.addMuxed( + &op.Destination, history.EffectAccountCredited, details, ) @@ -468,48 +483,47 @@ func (e *effectsWrapper) pathPaymentStrictReceiveEffects() { details = map[string]interface{}{"amount": amount.String(result.SendAmount())} addAssetDetails(details, op.SendAsset, "") - e.add( - source.Address(), + e.addMuxed( + source, history.EffectAccountDebited, details, ) - e.addIngestTradeEffects(source, resultSuccess.Offers) + e.addIngestTradeEffects(*source, resultSuccess.Offers) } func (e *effectsWrapper) addPathPaymentStrictSendEffects() { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustPathPaymentStrictSendOp() resultSuccess := e.operation.OperationResult().MustPathPaymentStrictSendResult().MustSuccess() result := e.operation.OperationResult().MustPathPaymentStrictSendResult() details := map[string]interface{}{"amount": amount.String(result.DestAmount())} addAssetDetails(details, op.DestAsset, "") - aid := op.Destination.ToAccountId() - e.add(aid.Address(), history.EffectAccountCredited, details) + e.addMuxed(&op.Destination, history.EffectAccountCredited, details) details = map[string]interface{}{"amount": amount.String(op.SendAmount)} addAssetDetails(details, op.SendAsset, "") - e.add(source.Address(), history.EffectAccountDebited, details) + e.addMuxed(source, history.EffectAccountDebited, details) - e.addIngestTradeEffects(source, resultSuccess.Offers) + e.addIngestTradeEffects(*source, resultSuccess.Offers) } func (e *effectsWrapper) addManageSellOfferEffects() { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() result := e.operation.OperationResult().MustManageSellOfferResult().MustSuccess() - e.addIngestTradeEffects(source, result.OffersClaimed) + e.addIngestTradeEffects(*source, result.OffersClaimed) } func (e *effectsWrapper) addManageBuyOfferEffects() { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() result := e.operation.OperationResult().MustManageBuyOfferResult().MustSuccess() - e.addIngestTradeEffects(source, result.OffersClaimed) + e.addIngestTradeEffects(*source, result.OffersClaimed) } func (e *effectsWrapper) addCreatePassiveSellOfferEffect() { result := e.operation.OperationResult() - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() var claims []xdr.ClaimOfferAtom @@ -521,15 +535,15 @@ func (e *effectsWrapper) addCreatePassiveSellOfferEffect() { claims = result.MustCreatePassiveSellOfferResult().MustSuccess().OffersClaimed } - e.addIngestTradeEffects(source, claims) + e.addIngestTradeEffects(*source, claims) } func (e *effectsWrapper) addSetOptionsEffects() error { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustSetOptionsOp() if op.HomeDomain != nil { - e.add(source.Address(), history.EffectAccountHomeDomainUpdated, + e.addMuxed(source, history.EffectAccountHomeDomainUpdated, map[string]interface{}{ "home_domain": string(*op.HomeDomain), }, @@ -551,7 +565,7 @@ func (e *effectsWrapper) addSetOptionsEffects() error { } if len(thresholdDetails) > 0 { - e.add(source.Address(), history.EffectAccountThresholdsUpdated, thresholdDetails) + e.addMuxed(source, history.EffectAccountThresholdsUpdated, thresholdDetails) } flagDetails := map[string]interface{}{} @@ -563,11 +577,11 @@ func (e *effectsWrapper) addSetOptionsEffects() error { } if len(flagDetails) > 0 { - e.add(source.Address(), history.EffectAccountFlagsUpdated, flagDetails) + e.addMuxed(source, history.EffectAccountFlagsUpdated, flagDetails) } if op.InflationDest != nil { - e.add(source.Address(), history.EffectAccountInflationDestinationUpdated, + e.addMuxed(source, history.EffectAccountInflationDestinationUpdated, map[string]interface{}{ "inflation_destination": op.InflationDest.Address(), }, @@ -603,14 +617,14 @@ func (e *effectsWrapper) addSetOptionsEffects() error { for _, addy := range beforeSortedSigners { weight, ok := after[addy] if !ok { - e.add(source.Address(), history.EffectSignerRemoved, map[string]interface{}{ + e.addMuxed(source, history.EffectSignerRemoved, map[string]interface{}{ "public_key": addy, }) continue } if weight != before[addy] { - e.add(source.Address(), history.EffectSignerUpdated, map[string]interface{}{ + e.addMuxed(source, history.EffectSignerUpdated, map[string]interface{}{ "public_key": addy, "weight": weight, }) @@ -632,7 +646,7 @@ func (e *effectsWrapper) addSetOptionsEffects() error { continue } - e.add(source.Address(), history.EffectSignerCreated, map[string]interface{}{ + e.addMuxed(source, history.EffectSignerCreated, map[string]interface{}{ "public_key": addy, "weight": weight, }) @@ -642,7 +656,7 @@ func (e *effectsWrapper) addSetOptionsEffects() error { } func (e *effectsWrapper) addChangeTrustEffects() error { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustChangeTrustOp() changes, err := e.operation.transaction.GetOperationChanges(e.operation.index) @@ -676,15 +690,15 @@ func (e *effectsWrapper) addChangeTrustEffects() error { break } - e.add(source.Address(), effect, details) + e.addMuxed(source, effect, details) } return nil } func (e *effectsWrapper) addAllowTrustEffects() { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustAllowTrustOp() - asset := op.Asset.ToAsset(source) + asset := op.Asset.ToAsset(source.ToAccountId()) details := map[string]interface{}{ "trustor": op.Trustor.Address(), } @@ -692,29 +706,29 @@ func (e *effectsWrapper) addAllowTrustEffects() { switch { case xdr.TrustLineFlags(op.Authorize).IsAuthorized(): - e.add(source.Address(), history.EffectTrustlineAuthorized, details) + e.addMuxed(source, history.EffectTrustlineAuthorized, details) // Forward compatibility setFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag) - e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, &setFlags, nil) + e.addTrustLineFlagsEffect(source, &op.Trustor, asset, &setFlags, nil) case xdr.TrustLineFlags(op.Authorize).IsAuthorizedToMaintainLiabilitiesFlag(): - e.add( - source.Address(), + e.addMuxed( + source, history.EffectTrustlineAuthorizedToMaintainLiabilities, details, ) // Forward compatibility setFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag) - e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, &setFlags, nil) + e.addTrustLineFlagsEffect(source, &op.Trustor, asset, &setFlags, nil) default: - e.add(source.Address(), history.EffectTrustlineDeauthorized, details) + e.addMuxed(source, history.EffectTrustlineDeauthorized, details) // Forward compatibility, show both as cleared clearFlags := xdr.Uint32(xdr.TrustLineFlagsAuthorizedFlag | xdr.TrustLineFlagsAuthorizedToMaintainLiabilitiesFlag) - e.addTrustLineFlagsEffect(&source, &op.Trustor, asset, nil, &clearFlags) + e.addTrustLineFlagsEffect(source, &op.Trustor, asset, nil, &clearFlags) } } func (e *effectsWrapper) addAccountMergeEffects() { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() dest := e.operation.operation.Body.MustDestination() result := e.operation.OperationResult().MustAccountMergeResult() @@ -723,16 +737,15 @@ func (e *effectsWrapper) addAccountMergeEffects() { "asset_type": "native", } - e.add(source.Address(), history.EffectAccountDebited, details) - aid := dest.ToAccountId() - e.add(aid.Address(), history.EffectAccountCredited, details) - e.add(source.Address(), history.EffectAccountRemoved, map[string]interface{}{}) + e.addMuxed(source, history.EffectAccountDebited, details) + e.addMuxed(&dest, history.EffectAccountCredited, details) + e.addMuxed(source, history.EffectAccountRemoved, map[string]interface{}{}) } func (e *effectsWrapper) addInflationEffects() { payouts := e.operation.OperationResult().MustInflationResult().MustPayouts() for _, payout := range payouts { - e.add(payout.Destination.Address(), history.EffectAccountCredited, + e.add(&payout.Destination, history.EffectAccountCredited, map[string]interface{}{ "amount": amount.String(payout.Amount), "asset_type": "native", @@ -742,7 +755,7 @@ func (e *effectsWrapper) addInflationEffects() { } func (e *effectsWrapper) addManageDataEffects() error { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustManageDataOp() details := map[string]interface{}{"name": op.DataName} effect := history.EffectType(0) @@ -778,12 +791,12 @@ func (e *effectsWrapper) addManageDataEffects() error { break } - e.add(source.Address(), effect, details) + e.addMuxed(source, effect, details) return nil } func (e *effectsWrapper) addBumpSequenceEffects() error { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() changes, err := e.operation.transaction.GetOperationChanges(e.operation.index) if err != nil { return err @@ -802,7 +815,7 @@ func (e *effectsWrapper) addBumpSequenceEffects() error { if beforeAccount.SeqNum != afterAccount.SeqNum { details := map[string]interface{}{"new_seq": afterAccount.SeqNum} - e.add(source.Address(), history.EffectSequenceBumped, details) + e.addMuxed(source, history.EffectSequenceBumped, details) } break } @@ -839,8 +852,8 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang break } source := e.operation.SourceAccount() - e.add( - source.Address(), + e.addMuxed( + source, history.EffectClaimableBalanceCreated, details, ) @@ -848,7 +861,7 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang for _, c := range op.Claimants { cv0 := c.MustV0() e.add( - cv0.Destination.Address(), + &cv0.Destination, history.EffectClaimableBalanceClaimantCreated, map[string]interface{}{ "balance_id": balanceID, @@ -863,8 +876,8 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang "amount": amount.String(op.Amount), } addAssetDetails(details, op.Asset, "") - e.add( - source.Address(), + e.addMuxed( + source, history.EffectAccountDebited, details, ) @@ -911,9 +924,9 @@ func (e *effectsWrapper) addClaimClaimableBalanceEffects(changes []ingest.Change "asset": cBalance.Asset.StringCanonical(), } setClaimableBalanceFlagDetails(details, cBalance.Flags()) - source := e.operation.SourceAccount().ToAccountId() - e.add( - source.Address(), + source := e.operation.SourceAccount() + e.addMuxed( + source, history.EffectClaimableBalanceClaimed, details, ) @@ -922,8 +935,8 @@ func (e *effectsWrapper) addClaimClaimableBalanceEffects(changes []ingest.Change "amount": amount.String(cBalance.Amount), } addAssetDetails(details, cBalance.Asset, "") - e.add( - source.Address(), + e.addMuxed( + source, history.EffectAccountCredited, details, ) @@ -931,7 +944,7 @@ func (e *effectsWrapper) addClaimClaimableBalanceEffects(changes []ingest.Change return nil } -func (e *effectsWrapper) addIngestTradeEffects(buyer xdr.AccountId, claims []xdr.ClaimOfferAtom) { +func (e *effectsWrapper) addIngestTradeEffects(buyer xdr.MuxedAccount, claims []xdr.ClaimOfferAtom) { for _, claim := range claims { if claim.AmountSold == 0 && claim.AmountBought == 0 { continue @@ -940,14 +953,14 @@ func (e *effectsWrapper) addIngestTradeEffects(buyer xdr.AccountId, claims []xdr seller := claim.SellerId bd, sd := tradeDetails(buyer, seller, claim) - e.add( - buyer.Address(), + e.addMuxed( + &buyer, history.EffectTrade, bd, ) e.add( - seller.Address(), + &seller, history.EffectTrade, sd, ) @@ -959,19 +972,18 @@ func (e *effectsWrapper) addClawbackEffects() error { details := map[string]interface{}{ "amount": amount.String(op.Amount), } - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() addAssetDetails(details, op.Asset, "") // The funds will be burned, but even with that, we generated an account credited effect - e.add( - source.Address(), + e.addMuxed( + source, history.EffectAccountCredited, details, ) - from := op.From.ToAccountId() - e.add( - from.Address(), + e.addMuxed( + &op.From, history.EffectAccountDebited, details, ) @@ -988,9 +1000,9 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha details := map[string]interface{}{ "balance_id": balanceId, } - source := e.operation.SourceAccount().ToAccountId() - e.add( - source.Address(), + source := e.operation.SourceAccount() + e.addMuxed( + source, history.EffectClaimableBalanceClawedBack, details, ) @@ -1001,8 +1013,8 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha cb := c.Pre.Data.ClaimableBalance details = map[string]interface{}{"amount": amount.String(cb.Amount)} addAssetDetails(details, cb.Asset, "") - e.add( - source.Address(), + e.addMuxed( + source, history.EffectAccountCredited, details, ) @@ -1014,14 +1026,14 @@ func (e *effectsWrapper) addClawbackClaimableBalanceEffects(changes []ingest.Cha } func (e *effectsWrapper) addSetTrustLineFlagsEffects() error { - source := e.operation.SourceAccount().ToAccountId() + source := e.operation.SourceAccount() op := e.operation.operation.Body.MustSetTrustLineFlagsOp() - e.addTrustLineFlagsEffect(&source, &op.Trustor, op.Asset, &op.SetFlags, &op.ClearFlags) + e.addTrustLineFlagsEffect(source, &op.Trustor, op.Asset, &op.SetFlags, &op.ClearFlags) return nil } func (e *effectsWrapper) addTrustLineFlagsEffect( - account *xdr.AccountId, + account *xdr.MuxedAccount, trustor *xdr.AccountId, asset xdr.Asset, setFlags *xdr.Uint32, @@ -1042,7 +1054,7 @@ func (e *effectsWrapper) addTrustLineFlagsEffect( } if flagDetailsAdded { - e.add(account.Address(), history.EffectTrustlineFlagsUpdated, details) + e.addMuxed(account, history.EffectTrustlineFlagsUpdated, details) } } @@ -1073,7 +1085,7 @@ func setAuthFlagDetails(flagDetails map[string]interface{}, flags xdr.AccountFla } } -func tradeDetails(buyer, seller xdr.AccountId, claim xdr.ClaimOfferAtom) (bd map[string]interface{}, sd map[string]interface{}) { +func tradeDetails(buyer xdr.MuxedAccount, seller xdr.AccountId, claim xdr.ClaimOfferAtom) (bd map[string]interface{}, sd map[string]interface{}) { bd = map[string]interface{}{ "offer_id": claim.OfferId, "seller": seller.Address(), @@ -1085,10 +1097,10 @@ func tradeDetails(buyer, seller xdr.AccountId, claim xdr.ClaimOfferAtom) (bd map sd = map[string]interface{}{ "offer_id": claim.OfferId, - "seller": buyer.Address(), "bought_amount": amount.String(claim.AmountBought), "sold_amount": amount.String(claim.AmountSold), } + addAccountAndMuxedAccountDetails(sd, buyer, "seller") addAssetDetails(sd, claim.AssetBought, "bought_") addAssetDetails(sd, claim.AssetSold, "sold_") diff --git a/services/horizon/internal/ingest/processors/effects_processor_test.go b/services/horizon/internal/ingest/processors/effects_processor_test.go index 0b0da1049f..3d2916a129 100644 --- a/services/horizon/internal/ingest/processors/effects_processor_test.go +++ b/services/horizon/internal/ingest/processors/effects_processor_test.go @@ -946,10 +946,12 @@ func TestOperationEffects(t *testing.T) { { address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", details: map[string]interface{}{ - "amount": "1.0000000", - "asset_code": "ARS", - "asset_type": "credit_alphanum4", - "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", + "account_muxed": "MDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQGAAAAAAMV7V2X24II", + "account_muxed_id": uint64(0xcafebabe), + "amount": "1.0000000", + "asset_code": "ARS", + "asset_type": "credit_alphanum4", + "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", }, effectType: history.EffectAccountCredited, operationID: int64(85899350017), @@ -958,10 +960,12 @@ func TestOperationEffects(t *testing.T) { { address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", details: map[string]interface{}{ - "amount": "0.0300000", - "asset_code": "BRL", - "asset_type": "credit_alphanum4", - "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", + "account_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", + "account_muxed_id": uint64(0xcafebabe), + "amount": "0.0300000", + "asset_code": "BRL", + "asset_type": "credit_alphanum4", + "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", }, effectType: history.EffectAccountDebited, operationID: int64(85899350017), @@ -970,6 +974,8 @@ func TestOperationEffects(t *testing.T) { { address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", details: map[string]interface{}{ + "account_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", + "account_muxed_id": uint64(0xcafebabe), "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", "offer_id": xdr.Int64(10072128), "sold_amount": "0.0300000", @@ -989,6 +995,8 @@ func TestOperationEffects(t *testing.T) { address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", details: map[string]interface{}{ "seller": "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", + "seller_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", + "seller_muxed_id": uint64(0xcafebabe), "offer_id": xdr.Int64(10072128), "sold_amount": "1.0000000", "bought_amount": "0.0300000", diff --git a/services/horizon/internal/resourceadapter/effects.go b/services/horizon/internal/resourceadapter/effects.go index ab9fdc9867..7789372f09 100644 --- a/services/horizon/internal/resourceadapter/effects.go +++ b/services/horizon/internal/resourceadapter/effects.go @@ -59,6 +59,11 @@ var EffectTypeNames = map[history.EffectType]string{ history.EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", } +type muxedAccount struct { + AccountMuxed string `json:"account_muxed"` + AccountMuxedID uint64 `json:"account_muxed_id"` +} + // NewEffect creates a new effect resource from the provided database representation // of the effect. func NewEffect( @@ -68,7 +73,12 @@ func NewEffect( ) (result hal.Pageable, err error) { basev := effects.Base{} - PopulateBaseEffect(ctx, &basev, row, ledger) + var mAccount muxedAccount + // We abuse the details to inject muxed-account information without changing the DB schema + if err = row.UnmarshalDetails(&mAccount); err != nil { + return + } + PopulateBaseEffect(ctx, &basev, mAccount, row, ledger) switch row.Type { case history.EffectAccountCreated: @@ -141,6 +151,8 @@ func NewEffect( err = row.UnmarshalDetails(&tradeDetails) if err == nil { e.Seller = tradeDetails.Seller + e.SellerMuxed = tradeDetails.SellerMuxed + e.SellerMuxedID = tradeDetails.SellerMuxedID e.OfferID = tradeDetails.OfferID e.SoldAmount = tradeDetails.SoldAmount e.SoldAssetType = tradeDetails.SoldAssetType @@ -269,10 +281,12 @@ func NewEffect( } // Populate loads this resource from `row` -func PopulateBaseEffect(ctx context.Context, this *effects.Base, row history.Effect, ledger history.Ledger) { +func PopulateBaseEffect(ctx context.Context, this *effects.Base, account muxedAccount, row history.Effect, ledger history.Ledger) { this.ID = row.ID() this.PT = row.PagingToken() this.Account = row.Account + this.AccountMuxed = account.AccountMuxed + this.AccountMuxedID = account.AccountMuxedID populateEffectType(this, row) this.LedgerCloseTime = ledger.ClosedAt diff --git a/services/horizon/internal/resourceadapter/effects_test.go b/services/horizon/internal/resourceadapter/effects_test.go index 3e95a329bd..1793507c4d 100644 --- a/services/horizon/internal/resourceadapter/effects_test.go +++ b/services/horizon/internal/resourceadapter/effects_test.go @@ -88,3 +88,46 @@ func TestNewEffect_EffectTrustlineAuthorizedToMaintainLiabilities(t *testing.T) tt.Len(page.Embedded.Records, 1) tt.Equal(effect, page.Embedded.Records[0].(effects.TrustlineAuthorizedToMaintainLiabilities)) } + +func TestNewEffect_EffectTrade_Muxed(t *testing.T) { + tt := assert.New(t) + ctx, _ := test.ContextWithLogBuffer() + + details := `{ + "seller": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "seller_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "seller_muxed_id": 1234, + "account_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ" + }` + + hEffect := history.Effect{ + Account: "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + HistoryOperationID: 1, + Order: 1, + Type: history.EffectTrade, + DetailsString: null.StringFrom(details), + } + resource, err := NewEffect(ctx, hEffect, history.Ledger{}) + tt.NoError(err) + + var resourcePage hal.Page + resourcePage.Add(resource) + + effect, ok := resource.(effects.Trade) + tt.True(ok) + tt.Equal("trade", effect.Type) + + binary, err := json.Marshal(resourcePage) + tt.NoError(err) + + var page effects.EffectsPage + tt.NoError(json.Unmarshal(binary, &page)) + tt.Len(page.Embedded.Records, 1) + tt.Equal(effect, page.Embedded.Records[0].(effects.Trade)) + tt.Equal("GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", effect.Account) + tt.Equal("MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", effect.AccountMuxed) + tt.Equal(uint64(0), effect.AccountMuxedID) + tt.Equal("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", effect.Seller) + tt.Equal("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", effect.SellerMuxed) + tt.Equal(uint64(1234), effect.SellerMuxedID) +} From 0ea183c90e7d32ba22958ed27e60fce12e263a1a Mon Sep 17 00:00:00 2001 From: Bill Allen Date: Mon, 24 May 2021 09:51:56 -0600 Subject: [PATCH 57/67] Clarify that MinBaseFee is in stroops. (#3352) Co-authored-by: Leigh McCulloch Co-authored-by: George Co-authored-by: Paul Bellamy --- txnbuild/transaction.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/txnbuild/transaction.go b/txnbuild/transaction.go index 814028837c..04048bea47 100644 --- a/txnbuild/transaction.go +++ b/txnbuild/transaction.go @@ -28,7 +28,7 @@ import ( "github.com/stellar/go/xdr" ) -// MinBaseFee is the minimum transaction fee for the Stellar network. +// MinBaseFee is the minimum transaction fee for the Stellar network of 100 stroops (0.00001 XLM). const MinBaseFee = 100 // Account represents the aspects of a Stellar account necessary to construct transactions. See From 97f248dfe2c755c405d864e228dae62271b2c918 Mon Sep 17 00:00:00 2001 From: tamirms Date: Mon, 24 May 2021 18:24:21 +0100 Subject: [PATCH 58/67] services/horizon/cmd: Fix prepare range bug (#3625) The `horizon db reingest range` command failed because it requires that the top level horizon ingest flag to be true. In other words, `horizon --ingest db reingest range` works but `horizon db reingest range` responds with the following error: 2021/05/03 12:49:43 Invalid config: one or more captive core params passed (--stellar-core-binary-path or --captive-core-config-append-path) but --ingest not set. This PR fixes this bug by making all ingestion subcommands set ingest to true implicitly. This PR also fixes the captive core config validation by only requiring the config file to be present when ingesting in online mode. It is not necessary to have a captive core config file when ingesting bounded ledger ranges. --- services/horizon/CHANGELOG.md | 1 + services/horizon/cmd/db.go | 16 +++++----- services/horizon/cmd/ingest.go | 10 +++--- services/horizon/cmd/root.go | 6 ++-- services/horizon/cmd/serve.go | 2 +- services/horizon/cmd/version.go | 2 +- services/horizon/internal/flags.go | 31 ++++++++++++++----- .../horizon/internal/integration/db_test.go | 29 ++++++++++++++++- 8 files changed, 72 insertions(+), 25 deletions(-) diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index cbdf557130..688de695cf 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -9,6 +9,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). * Add more in-depth Prometheus metrics (count & duration) for db queries. +* Fix bug in `horizon db reingest range` command which required the `--ingest` flag to be set [3625](https://github.com/stellar/go/pull/3625)). ## v2.3.0 diff --git a/services/horizon/cmd/db.go b/services/horizon/cmd/db.go index 91957b4062..7cc5b3d1c9 100644 --- a/services/horizon/cmd/db.go +++ b/services/horizon/cmd/db.go @@ -202,16 +202,18 @@ var dbReingestRangeCmd = &cobra.Command{ argsUInt32 := make([]uint32, 2) for i, arg := range args { - seq, err := strconv.Atoi(arg) - if err != nil { + if seq, err := strconv.Atoi(arg); err != nil { cmd.Usage() log.Fatalf(`Invalid sequence number "%s"`, arg) + } else if seq < 0 { + log.Fatalf("sequence number %s cannot be negative", arg) + } else { + argsUInt32[i] = uint32(seq) } - argsUInt32[i] = uint32(seq) } - horizon.ApplyFlags(config, flags) - err := RunDBReingestRange(argsUInt32[0], argsUInt32[1], reingestForce, parallelWorkers, *config) + horizon.ApplyFlags(config, flags, horizon.ApplyOptions{RequireCaptiveCoreConfig: false, AlwaysIngest: true}) + err := runDBReingestRange(argsUInt32[0], argsUInt32[1], reingestForce, parallelWorkers, *config) if err != nil { if errors.Cause(err) == ingest.ErrReingestRangeConflict { message := ` @@ -232,7 +234,7 @@ var dbReingestRangeCmd = &cobra.Command{ }, } -func RunDBReingestRange(from, to uint32, reingestForce bool, parallelWorkers uint, config horizon.Config) error { +func runDBReingestRange(from, to uint32, reingestForce bool, parallelWorkers uint, config horizon.Config) error { if reingestForce && parallelWorkers > 1 { return errors.New("--force is incompatible with --parallel-workers > 1") } @@ -303,7 +305,7 @@ func init() { viper.BindPFlags(dbReingestRangeCmd.PersistentFlags()) - rootCmd.AddCommand(dbCmd) + RootCmd.AddCommand(dbCmd) dbCmd.AddCommand( dbInitCmd, dbMigrateCmd, diff --git a/services/horizon/cmd/ingest.go b/services/horizon/cmd/ingest.go index d66aad2676..fab195fac2 100644 --- a/services/horizon/cmd/ingest.go +++ b/services/horizon/cmd/ingest.go @@ -71,7 +71,7 @@ var ingestVerifyRangeCmd = &cobra.Command{ co.SetValue() } - horizon.ApplyFlags(config, flags) + horizon.ApplyFlags(config, flags, horizon.ApplyOptions{RequireCaptiveCoreConfig: false, AlwaysIngest: true}) if ingestVerifyDebugServerPort != 0 { go func() { @@ -170,7 +170,7 @@ var ingestStressTestCmd = &cobra.Command{ co.SetValue() } - horizon.ApplyFlags(config, flags) + horizon.ApplyFlags(config, flags, horizon.ApplyOptions{RequireCaptiveCoreConfig: false, AlwaysIngest: true}) horizonSession, err := db.Open("postgres", config.DatabaseURL) if err != nil { @@ -229,7 +229,7 @@ var ingestTriggerStateRebuildCmd = &cobra.Command{ Short: "updates a database to trigger state rebuild, state will be rebuilt by a running Horizon instance, DO NOT RUN production DB, some endpoints will be unavailable until state is rebuilt", Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() - horizon.ApplyFlags(config, flags) + horizon.ApplyFlags(config, flags, horizon.ApplyOptions{RequireCaptiveCoreConfig: false, AlwaysIngest: true}) horizonSession, err := db.Open("postgres", config.DatabaseURL) if err != nil { @@ -251,7 +251,7 @@ var ingestInitGenesisStateCmd = &cobra.Command{ Short: "ingests genesis state (ledger 1)", Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() - horizon.ApplyFlags(config, flags) + horizon.ApplyFlags(config, flags, horizon.ApplyOptions{RequireCaptiveCoreConfig: false, AlwaysIngest: true}) horizonSession, err := db.Open("postgres", config.DatabaseURL) if err != nil { @@ -322,7 +322,7 @@ func init() { viper.BindPFlags(ingestVerifyRangeCmd.PersistentFlags()) - rootCmd.AddCommand(ingestCmd) + RootCmd.AddCommand(ingestCmd) ingestCmd.AddCommand( ingestVerifyRangeCmd, ingestStressTestCmd, diff --git a/services/horizon/cmd/root.go b/services/horizon/cmd/root.go index 5f6a88f862..92f5980256 100644 --- a/services/horizon/cmd/root.go +++ b/services/horizon/cmd/root.go @@ -12,7 +12,7 @@ import ( var ( config, flags = horizon.Flags() - rootCmd = &cobra.Command{ + RootCmd = &cobra.Command{ Use: "horizon", Short: "client-facing api server for the Stellar network", Long: "Client-facing API server for the Stellar network. It acts as the interface between Stellar Core and applications that want to access the Stellar network. It allows you to submit transactions to the network, check the status of accounts, subscribe to event streams and more.", @@ -23,14 +23,14 @@ var ( ) func init() { - err := flags.Init(rootCmd) + err := flags.Init(RootCmd) if err != nil { stdLog.Fatal(err.Error()) } } func Execute() { - if err := rootCmd.Execute(); err != nil { + if err := RootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/services/horizon/cmd/serve.go b/services/horizon/cmd/serve.go index 812f07f4c3..f88e2d6e8e 100644 --- a/services/horizon/cmd/serve.go +++ b/services/horizon/cmd/serve.go @@ -15,5 +15,5 @@ var serveCmd = &cobra.Command{ } func init() { - rootCmd.AddCommand(serveCmd) + RootCmd.AddCommand(serveCmd) } diff --git a/services/horizon/cmd/version.go b/services/horizon/cmd/version.go index 3187c73daa..cbfedb0a66 100644 --- a/services/horizon/cmd/version.go +++ b/services/horizon/cmd/version.go @@ -19,5 +19,5 @@ var versionCmd = &cobra.Command{ } func init() { - rootCmd.AddCommand(versionCmd) + RootCmd.AddCommand(versionCmd) } diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index 9a5831cebc..f534bb333d 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -428,7 +428,7 @@ func Flags() (*Config, support.ConfigOptions) { // NewAppFromFlags constructs a new Horizon App from the given command line flags func NewAppFromFlags(config *Config, flags support.ConfigOptions) *App { - ApplyFlags(config, flags) + ApplyFlags(config, flags, ApplyOptions{RequireCaptiveCoreConfig: true, AlwaysIngest: false}) // Validate app-specific arguments if config.StellarCoreURL == "" { log.Fatalf("flag --%s cannot be empty", StellarCoreURLFlagName) @@ -443,8 +443,13 @@ func NewAppFromFlags(config *Config, flags support.ConfigOptions) *App { return app } +type ApplyOptions struct { + AlwaysIngest bool + RequireCaptiveCoreConfig bool +} + // ApplyFlags applies the command line flags on the given Config instance -func ApplyFlags(config *Config, flags support.ConfigOptions) { +func ApplyFlags(config *Config, flags support.ConfigOptions, options ApplyOptions) { // Verify required options and load the config struct flags.Require() flags.SetValues() @@ -452,6 +457,10 @@ func ApplyFlags(config *Config, flags support.ConfigOptions) { // Validate options that should be provided together validateBothOrNeither("tls-cert", "tls-key") + if options.AlwaysIngest { + config.Ingest = true + } + if config.Ingest { // Migrations should be checked as early as possible. Apply and check // only on ingesting instances which are required to have write-access @@ -492,11 +501,19 @@ func ApplyFlags(config *Config, flags support.ConfigOptions) { } if config.RemoteCaptiveCoreURL == "" && (binaryPath == "" || config.CaptiveCoreConfigPath == "") { - stdLog.Fatalf("Invalid config: captive core requires that both --%s and --%s are set. %s", - StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName, captiveCoreMigrationHint) - } - - if config.RemoteCaptiveCoreURL == "" { + if options.RequireCaptiveCoreConfig { + stdLog.Fatalf("Invalid config: captive core requires that both --%s and --%s are set. %s", + StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName, captiveCoreMigrationHint) + } else { + var err error + config.CaptiveCoreTomlParams.HistoryArchiveURLs = config.HistoryArchiveURLs + config.CaptiveCoreTomlParams.NetworkPassphrase = config.NetworkPassphrase + config.CaptiveCoreToml, err = ledgerbackend.NewCaptiveCoreToml(config.CaptiveCoreTomlParams) + if err != nil { + stdLog.Fatalf("Invalid captive core toml file %v", err) + } + } + } else if config.RemoteCaptiveCoreURL == "" { var err error config.CaptiveCoreTomlParams.HistoryArchiveURLs = config.HistoryArchiveURLs config.CaptiveCoreTomlParams.NetworkPassphrase = config.NetworkPassphrase diff --git a/services/horizon/internal/integration/db_test.go b/services/horizon/internal/integration/db_test.go index 572710d703..e94a3440fc 100644 --- a/services/horizon/internal/integration/db_test.go +++ b/services/horizon/internal/integration/db_test.go @@ -1,7 +1,9 @@ package integration import ( + "fmt" "path/filepath" + "strconv" "testing" "time" @@ -85,9 +87,34 @@ func TestReingestDB(t *testing.T) { filepath.Dir(horizonConfig.CaptiveCoreConfigPath), "captive-core-reingest-range-integration-tests.cfg", ) + horizoncmd.RootCmd.SetArgs([]string{ + "--stellar-core-url", + horizonConfig.StellarCoreURL, + "--history-archive-urls", + horizonConfig.HistoryArchiveURLs[0], + "--db-url", + horizonConfig.DatabaseURL, + "--stellar-core-db-url", + horizonConfig.StellarCoreDatabaseURL, + "--stellar-core-binary-path", + horizonConfig.CaptiveCoreBinaryPath, + "--captive-core-config-append-path", + horizonConfig.CaptiveCoreConfigPath, + "--enable-captive-core-ingestion=" + strconv.FormatBool(horizonConfig.EnableCaptiveCoreIngestion), + "--network-passphrase", + horizonConfig.NetworkPassphrase, + // due to ARTIFICIALLY_ACCELERATE_TIME_FOR_TESTING + "--checkpoint-frequency", + "8", + "db", + "reingest", + "range", + "1", + fmt.Sprintf("%d", toLedger), + }) + err = horizoncmd.RootCmd.Execute() // Reingest into the DB - err = horizoncmd.RunDBReingestRange(1, toLedger, false, 1, horizonConfig) tt.NoError(err) } From a5ddb4e1cfcd7c336711b2b137382ce068d4df79 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Mon, 24 May 2021 11:49:11 -0700 Subject: [PATCH 59/67] txnbuild: add SequenceNumber func to Transaction (#3616) Add `SequenceNumber` function to `Transaction`. Stellar transactions have a sequence number. If a transaction is valid and it is accepted into a ledger the source account of the transaction is updated such that its sequence number becomes the sequence number of the transaction. In the Go SDK a parsed transaction has no sequence number field or function directly on it. For a developer to get the sequence number they must look at the source account object. This is not intuitive and not consistent conceptually because a transaction has a sequence number and it should be a first class attribute of the transaction. In my own development using the Go SDK I spent time trying to figure out where the sequence was stored and how to get at it. I work on Stellar everyday, so if this is not intuitive to me, I suspect it isn't intuitive to others. Other Stellar SDKs, such as the JS SDK, expose it as an attribute on a Transaction. This is likely to become even less intuitive as we plan to change the sequence number rules where the sequence number on an account does not need to be sequential. Regardless of this, it isn't intuitive today. --- txnbuild/CHANGELOG.md | 4 ++++ txnbuild/transaction.go | 5 +++++ txnbuild/transaction_test.go | 2 ++ 3 files changed, 11 insertions(+) diff --git a/txnbuild/CHANGELOG.md b/txnbuild/CHANGELOG.md index 889be9b870..f5d7c9c400 100644 --- a/txnbuild/CHANGELOG.md +++ b/txnbuild/CHANGELOG.md @@ -5,6 +5,10 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### New features + +* Add `SequenceNumber` function to `Transaction`. + ### Bug Fix * `BaseFee` in `TransactionParams` when calling `NewTransaction` is allowed to be zero because the fee can be paid by wrapping a `Transaction` in a `FeeBumpTransaction`. ([#3622](https://github.com/stellar/go/pull/3622)) diff --git a/txnbuild/transaction.go b/txnbuild/transaction.go index 04048bea47..425b2ce85d 100644 --- a/txnbuild/transaction.go +++ b/txnbuild/transaction.go @@ -212,6 +212,11 @@ func (t *Transaction) SourceAccount() SimpleAccount { return t.sourceAccount } +// SequenceNumber returns the sequence number of the transaction. +func (t *Transaction) SequenceNumber() int64 { + return t.sourceAccount.Sequence +} + // Memo returns the memo configured for this transaction. func (t *Transaction) Memo() Memo { return t.memo diff --git a/txnbuild/transaction_test.go b/txnbuild/transaction_test.go index f792e6634e..b75abaf672 100644 --- a/txnbuild/transaction_test.go +++ b/txnbuild/transaction_test.go @@ -1374,6 +1374,7 @@ func TestFromXDR(t *testing.T) { assert.Equal(t, int64(100), newTx.BaseFee(), "Base fee should match") sa := newTx.SourceAccount() assert.Equal(t, int64(6606179392290817), sa.Sequence, "Sequence number should match") + assert.Equal(t, int64(6606179392290817), newTx.SequenceNumber(), "Sequence number should match") assert.Equal(t, 1, len(newTx.Operations()), "Operations length should match") assert.IsType(t, newTx.Operations()[0], &Payment{}, "Operation types should match") paymentOp, ok1 := newTx.Operations()[0].(*Payment) @@ -1394,6 +1395,7 @@ func TestFromXDR(t *testing.T) { assert.Equal(t, "GBUKBCG5VLRKAVYAIREJRUJHOKLIADZJOICRW43WVJCLES52BDOTCQZU", newTx2.SourceAccount().AccountID, "source accounts should match") assert.Equal(t, int64(200), newTx2.BaseFee(), "Base fee should match") assert.Equal(t, int64(14800457302017), newTx2.SourceAccount().Sequence, "Sequence number should match") + assert.Equal(t, int64(14800457302017), newTx2.SequenceNumber(), "Sequence number should match") memo, ok := newTx2.Memo().(MemoText) assert.Equal(t, true, ok) From 2625255ca58c0e208a267fab70984c6b7d526be4 Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Mon, 24 May 2021 13:18:53 -0700 Subject: [PATCH 60/67] clients/horizonclient: make errors easier to understand at a glance (#3627) Include the transaction result codes in the horizonclient.Error string that is outputted when serializing the error to a string. When developing the transaction failed error is very opaque, displaying only `"Transaction Failed"` in logs. This is fine for code that has been written well to unwrap the error using `horizonclient.GetError`, and that also uses `ResultsCodes()`. But developers, even experienced ones, don't often start out writing code that inspects errors perfectly. It's helpful to get succinct textual errors that are as meaningful as possible, and really pin point what happened. Including the result code in the string that is output will in most cases significantly increase the signal a developer gets on why a transaction failed. This is a recurring pain point for me using the horizonclient package in applications. This function was not tested, so I added tests first in the first commit and the second commit contains the changes to the test and the new functionality. --- clients/horizonclient/CHANGELOG.md | 4 ++ clients/horizonclient/error.go | 14 ++++- clients/horizonclient/error_test.go | 52 +++++++++++++++++++ .../serve/httperror/http_error_test.go | 2 +- 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/clients/horizonclient/CHANGELOG.md b/clients/horizonclient/CHANGELOG.md index 292f9aae93..35a74f5745 100644 --- a/clients/horizonclient/CHANGELOG.md +++ b/clients/horizonclient/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## Unreleased + +* Added transaction and operation result codes to the horizonclient.Error string for easy glancing at string only errors for underlying cause. + ## [v7.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v7.0.0) - 2021-05-15 None diff --git a/clients/horizonclient/error.go b/clients/horizonclient/error.go index 09c87af0ea..75beb54786 100644 --- a/clients/horizonclient/error.go +++ b/clients/horizonclient/error.go @@ -2,6 +2,7 @@ package horizonclient import ( "encoding/json" + "strings" hProtocol "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/support/errors" @@ -9,7 +10,18 @@ import ( ) func (herr Error) Error() string { - return `horizon error: "` + herr.Problem.Title + `" - check horizon.Error.Problem for more information` + s := strings.Builder{} + s.WriteString(`horizon error: "`) + s.WriteString(herr.Problem.Title) + s.WriteString(`" `) + if rc, err := herr.ResultCodes(); err == nil { + s.WriteString(`(`) + resultCodes := append([]string{rc.TransactionCode}, rc.OperationCodes...) + s.WriteString(strings.Join(resultCodes, `, `)) + s.WriteString(`) `) + } + s.WriteString(`- check horizon.Error.Problem for more information`) + return s.String() } // Envelope extracts the transaction envelope that triggered this error from the diff --git a/clients/horizonclient/error_test.go b/clients/horizonclient/error_test.go index a4bc0972cc..f7584bea16 100644 --- a/clients/horizonclient/error_test.go +++ b/clients/horizonclient/error_test.go @@ -3,9 +3,61 @@ package horizonclient import ( "testing" + "github.com/stellar/go/support/render/problem" "github.com/stretchr/testify/assert" ) +func TestError_Error(t *testing.T) { + var herr Error + + // transaction failed happy path: with the appropriate extra fields + herr = Error{ + Problem: problem.P{ + Title: "Transaction Failed", + Type: "transaction_failed", + Extras: map[string]interface{}{ + "result_codes": map[string]interface{}{ + "transaction": "tx_failed", + "operations": []string{"op_underfunded", "op_already_exists"}, + }, + }, + }, + } + assert.Equal(t, `horizon error: "Transaction Failed" (tx_failed, op_underfunded, op_already_exists) - check horizon.Error.Problem for more information`, herr.Error()) + + // transaction failed sad path: missing result_codes extra + herr = Error{ + Problem: problem.P{ + Title: "Transaction Failed", + Type: "transaction_failed", + Extras: map[string]interface{}{}, + }, + } + assert.Equal(t, `horizon error: "Transaction Failed" - check horizon.Error.Problem for more information`, herr.Error()) + + // transaction failed sad path: unparseable result_codes extra + herr = Error{ + Problem: problem.P{ + Title: "Transaction Failed", + Type: "transaction_failed", + Extras: map[string]interface{}{ + "result_codes": "kaboom", + }, + }, + } + assert.Equal(t, `horizon error: "Transaction Failed" - check horizon.Error.Problem for more information`, herr.Error()) + + // non-transaction errors + herr = Error{ + Problem: problem.P{ + Type: "https://stellar.org/horizon-errors/not_found", + Title: "Resource Missing", + Status: 404, + }, + } + assert.Equal(t, `horizon error: "Resource Missing" - check horizon.Error.Problem for more information`, herr.Error()) +} + func TestError_ResultCodes(t *testing.T) { var herr Error diff --git a/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go b/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go index 2eba3a8d4a..6298189e25 100644 --- a/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go +++ b/services/regulated-assets-approval-server/internal/serve/httperror/http_error_test.go @@ -35,5 +35,5 @@ func TestParseHorizonError(t *testing.T) { }, } err = ParseHorizonError(horizonError) - require.EqualError(t, err, "error submitting transaction: problem: bad_request, &{TransactionCode:tx_code_here OperationCodes:[op_success op_bad_auth]}\n: horizon error: \"Bad Request\" - check horizon.Error.Problem for more information") + require.EqualError(t, err, "error submitting transaction: problem: bad_request, &{TransactionCode:tx_code_here OperationCodes:[op_success op_bad_auth]}\n: horizon error: \"Bad Request\" (tx_code_here, op_success, op_bad_auth) - check horizon.Error.Problem for more information") } From b2450c3596a7f4210d47d13947fbde6a04362e4d Mon Sep 17 00:00:00 2001 From: George Date: Mon, 24 May 2021 14:47:34 -0700 Subject: [PATCH 61/67] ingest: Prepares the package for a v2.0.0 release. (#3617) --- ingest/CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 ingest/CHANGELOG.md diff --git a/ingest/CHANGELOG.md b/ingest/CHANGELOG.md new file mode 100644 index 0000000000..e10a940801 --- /dev/null +++ b/ingest/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). + + +## Unreleased + + +## v2.0.0 + +This release is related to the release of [Horizon v2.3.0](https://github.com/stellar/go/releases/tag/horizon-v2.3.0) and introduces some breaking changes to the `ingest` package for those building their own tools. + +### Breaking Changes +- Many APIs now require a `context.Context` parameter, allowing you to interact with the backends and control calls in a more finely-controlled manner. This includes the readers (`ChangeReader` et al.) as well as the backends themselves (`CaptiveStellarCore` et al.). + +- **`GetLedger()` always blocks** now, even for an `UnboundedRange`. + +- The `CaptiveCoreBackend` now requires an all-inclusive `CaptiveCoreToml` object to configure Captive Core rather than an assortment of individual parameters. This object can be built from a TOML file (see `NewCaptiveCoreTomlFromFile`) or from parameters (see `NewCaptiveCoreToml`) as was done before. + +- `LedgerTransaction.Meta` has been renamed to `UnsafeMeta` to highlight that users should be careful when interacting with it. + +- Remote Captive Core no longer includes the `present` field in the ledger response JSON. + +### New Features +- `NewLedgerChangeReaderFromLedgerCloseMeta` and `NewLedgerTransactionReaderFromLedgerCloseMeta` are new ways to construct readers from a particular single ledger. + +### Other Changes +- The remote Captive Core client timeout has doubled. + +- Captive Core now creates a temporary directory (`captive-core-...`) in the specified storage path (current directory by default) that it cleans it up on shutdown rather than in the OS's temp directory. From a81cea3860bc5c4ad1998d4f88dfe6dccf93176d Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Tue, 25 May 2021 14:19:07 +0200 Subject: [PATCH 62/67] services/horizon: Add muxed account details to transactions and change schema (#3626) --- protocols/horizon/main.go | 4 + services/horizon/CHANGELOG.md | 11 ++ .../history/effect_batch_insert_builder.go | 4 + .../effect_batch_insert_builder_test.go | 6 +- .../internal/db2/history/fee_bump_scenario.go | 2 + services/horizon/internal/db2/history/main.go | 2 + .../mock_effect_batch_insert_builder.go | 4 + .../mock_operations_batch_insert_builder.go | 4 + .../horizon/internal/db2/history/operation.go | 1 + .../history/operation_batch_insert_builder.go | 16 +- .../operation_batch_insert_builder_test.go | 13 +- .../internal/db2/history/operation_test.go | 8 +- .../internal/db2/history/transaction.go | 2 + .../transaction_batch_insert_builder.go | 21 ++- .../internal/db2/history/transaction_test.go | 2 +- .../horizon/internal/db2/schema/bindata.go | 23 +++ .../migrations/46_add_muxed_accounts.sql | 11 ++ .../ingest/processors/effects_processor.go | 55 +++--- .../processors/effects_processor_test.go | 39 ++-- .../ingest/processors/operations_processor.go | 21 +-- .../processors/operations_processor_test.go | 11 +- .../transaction_operation_wrapper_test.go | 166 ++++++++---------- .../integration/muxed_account_details_test.go | 90 ++++++++++ .../internal/resourceadapter/effects.go | 22 +-- .../internal/resourceadapter/effects_test.go | 12 +- .../internal/resourceadapter/operations.go | 23 +-- .../resourceadapter/operations_test.go | 14 +- .../internal/resourceadapter/transaction.go | 14 +- .../resourceadapter/transaction_test.go | 17 +- .../internal/test/integration/integration.go | 1 + .../test/scenarios/account_merge-horizon.sql | 5 + .../internal/test/scenarios/base-horizon.sql | 15 +- .../internal/test/scenarios/bindata.go | 42 ++--- .../scenarios/failed_transactions-horizon.sql | 3 + .../test/scenarios/kahuna-horizon.sql | 4 + .../test/scenarios/pathed_payment-horizon.sql | 3 + .../scenarios/paths_strict_send-horizon.sql | 4 + .../test/scenarios/trades-horizon.sql | 3 + 38 files changed, 461 insertions(+), 237 deletions(-) create mode 100644 services/horizon/internal/db2/schema/migrations/46_add_muxed_accounts.sql create mode 100644 services/horizon/internal/integration/muxed_account_details_test.go diff --git a/protocols/horizon/main.go b/protocols/horizon/main.go index 12d96d74b1..97cee69ed7 100644 --- a/protocols/horizon/main.go +++ b/protocols/horizon/main.go @@ -454,8 +454,12 @@ type Transaction struct { Ledger int32 `json:"ledger"` LedgerCloseTime time.Time `json:"created_at"` Account string `json:"source_account"` + AccountMuxed string `json:"account_muxed,omitempty"` + AccountMuxedID uint64 `json:"account_muxed_id,omitempty"` AccountSequence string `json:"source_account_sequence"` FeeAccount string `json:"fee_account"` + FeeAccountMuxed string `json:"fee_account_muxed,omitempty"` + FeeAccountMuxedID uint64 `json:"fee_account_muxed_id,omitempty"` FeeCharged int64 `json:"fee_charged,string"` MaxFee int64 `json:"max_fee,string"` OperationCount int32 `json:"operation_count"` diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 688de695cf..05b9b25aeb 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -5,12 +5,23 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### DB Schema change + +* This release comes with a small DB schema change (new multiplexed-account-related columns are incororated). It should not take more than five minutes to run due to new columns being NULL-able. + +### New features + * Refactor `ingest/ledgerbackend/LedgerBackend.GetLedger` method to always block, removing `ingest/ledgerbackend/LedgerBackend.GetLedgerBlocking`. Adds a first `context.Context` param to most `LedgerBackend` methods. * Add more in-depth Prometheus metrics (count & duration) for db queries. * Fix bug in `horizon db reingest range` command which required the `--ingest` flag to be set [3625](https://github.com/stellar/go/pull/3625)). +* Add Multiplexed Account details to API responses (additional `_muxed` and `_muxed_id` optional fields following what's described in [SEP 23](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0023.md#horizon-api-changes)): + * Transactions: `account_muxed`, `account_muxed_id`, `fee_account` and `fee_account_muxed`. + * Operations: `source_account_muxed`, `source_account_muxed_id` and additional fields depending on the operation (e.g. `from_muxed`, `from_muxed_id`, `to_muxed` and `to_muxed_id` for Payment operations) + * Effects: `account_muxed`, `account_muxed_id` and additional fields depending on the effect (e.g. `seller_muxed` and `seller_muxed_id` for the Trade effect). + ## v2.3.0 **Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.** diff --git a/services/horizon/internal/db2/history/effect_batch_insert_builder.go b/services/horizon/internal/db2/history/effect_batch_insert_builder.go index 3a0bab6836..8b2522cf9e 100644 --- a/services/horizon/internal/db2/history/effect_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/effect_batch_insert_builder.go @@ -3,6 +3,7 @@ package history import ( "context" + "github.com/guregu/null" "github.com/stellar/go/support/db" ) @@ -12,6 +13,7 @@ type EffectBatchInsertBuilder interface { Add( ctx context.Context, accountID int64, + muxedAccount null.String, operationID int64, order uint32, effectType EffectType, @@ -39,6 +41,7 @@ func (q *Q) NewEffectBatchInsertBuilder(maxBatchSize int) EffectBatchInsertBuild func (i *effectBatchInsertBuilder) Add( ctx context.Context, accountID int64, + muxedAccount null.String, operationID int64, order uint32, effectType EffectType, @@ -46,6 +49,7 @@ func (i *effectBatchInsertBuilder) Add( ) error { return i.builder.Row(ctx, map[string]interface{}{ "history_account_id": accountID, + "address_muxed": muxedAccount, "history_operation_id": operationID, "\"order\"": order, "type": effectType, diff --git a/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go b/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go index 3e4ac3f83c..fd9a01fa87 100644 --- a/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/effect_batch_insert_builder_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "testing" + "github.com/guregu/null" "github.com/stellar/go/services/horizon/internal/test" "github.com/stellar/go/services/horizon/internal/toid" ) @@ -14,7 +15,8 @@ func TestAddEffect(t *testing.T) { test.ResetHorizonDB(t, tt.HorizonDB) q := &Q{tt.HorizonSession()} - address := "GBXGQJWVLWOYHFLVTKWV5FGHA3LNYY2JQKM7OAJAUEQFU6LPCSEFVXON" + address := "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY" + muxedAddres := "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26" accounIDs, err := q.CreateAccounts(tt.Ctx, []string{address}, 1) tt.Assert.NoError(err) @@ -27,6 +29,7 @@ func TestAddEffect(t *testing.T) { err = builder.Add(tt.Ctx, accounIDs[address], + null.StringFrom(muxedAddres), toid.New(sequence, 1, 1).ToInt64(), 1, 3, @@ -43,6 +46,7 @@ func TestAddEffect(t *testing.T) { effect := effects[0] tt.Assert.Equal(address, effect.Account) + tt.Assert.Equal(muxedAddres, effect.AccountMuxed.String) tt.Assert.Equal(int64(240518172673), effect.HistoryOperationID) tt.Assert.Equal(int32(1), effect.Order) tt.Assert.Equal(EffectType(3), effect.Type) diff --git a/services/horizon/internal/db2/history/fee_bump_scenario.go b/services/horizon/internal/db2/history/fee_bump_scenario.go index 98dd49ec3a..fc2532028f 100644 --- a/services/horizon/internal/db2/history/fee_bump_scenario.go +++ b/services/horizon/internal/db2/history/fee_bump_scenario.go @@ -268,6 +268,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { xdr.OperationTypeBumpSequence, details, account.Address(), + null.String{}, )) tt.Assert.NoError(opBuilder.Exec(ctx)) @@ -281,6 +282,7 @@ func FeeBumpScenario(tt *test.T, q *Q, successful bool) FeeBumpFixture { err = effectBuilder.Add( ctx, accounIDs[account.Address()], + null.String{}, toid.New(fixture.Ledger.Sequence, 1, 1).ToInt64(), 1, EffectSequenceBumped, diff --git a/services/horizon/internal/db2/history/main.go b/services/horizon/internal/db2/history/main.go index beb4cf5a1b..a23abe8133 100644 --- a/services/horizon/internal/db2/history/main.go +++ b/services/horizon/internal/db2/history/main.go @@ -417,6 +417,7 @@ type QCreateAccountsHistory interface { type Effect struct { HistoryAccountID int64 `db:"history_account_id"` Account string `db:"address"` + AccountMuxed null.String `db:"address_muxed"` HistoryOperationID int64 `db:"history_operation_id"` Order int32 `db:"order"` Type EffectType `db:"type"` @@ -554,6 +555,7 @@ type Operation struct { Type xdr.OperationType `db:"type"` DetailsString null.String `db:"details"` SourceAccount string `db:"source_account"` + SourceAccountMuxed null.String `db:"source_account_muxed"` TransactionSuccessful bool `db:"transaction_successful"` } diff --git a/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go index 87777a70ff..48ee96e306 100644 --- a/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_effect_batch_insert_builder.go @@ -2,6 +2,8 @@ package history import ( "context" + + "github.com/guregu/null" "github.com/stretchr/testify/mock" ) @@ -13,6 +15,7 @@ type MockEffectBatchInsertBuilder struct { // Add mock func (m *MockEffectBatchInsertBuilder) Add(ctx context.Context, accountID int64, + muxedAccount null.String, operationID int64, order uint32, effectType EffectType, @@ -20,6 +23,7 @@ func (m *MockEffectBatchInsertBuilder) Add(ctx context.Context, ) error { a := m.Called(ctx, accountID, + muxedAccount, operationID, order, effectType, diff --git a/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go b/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go index a2f00f1fb7..e57eb93db9 100644 --- a/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/mock_operations_batch_insert_builder.go @@ -2,6 +2,8 @@ package history import ( "context" + + "github.com/guregu/null" "github.com/stellar/go/xdr" "github.com/stretchr/testify/mock" ) @@ -19,6 +21,7 @@ func (m *MockOperationsBatchInsertBuilder) Add(ctx context.Context, operationType xdr.OperationType, details []byte, sourceAccount string, + sourceAccountMuxed null.String, ) error { a := m.Called(ctx, id, @@ -27,6 +30,7 @@ func (m *MockOperationsBatchInsertBuilder) Add(ctx context.Context, operationType, details, sourceAccount, + sourceAccountMuxed, ) return a.Error(0) } diff --git a/services/horizon/internal/db2/history/operation.go b/services/horizon/internal/db2/history/operation.go index 949f861d23..a70eaf47d5 100644 --- a/services/horizon/internal/db2/history/operation.go +++ b/services/horizon/internal/db2/history/operation.go @@ -344,6 +344,7 @@ var selectOperation = sq.Select( "hop.type, " + "hop.details, " + "hop.source_account, " + + "hop.source_account_muxed, " + "ht.transaction_hash, " + "ht.tx_result, " + "COALESCE(ht.successful, true) as transaction_successful"). diff --git a/services/horizon/internal/db2/history/operation_batch_insert_builder.go b/services/horizon/internal/db2/history/operation_batch_insert_builder.go index 73525b97cb..a3baee8863 100644 --- a/services/horizon/internal/db2/history/operation_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/operation_batch_insert_builder.go @@ -3,6 +3,7 @@ package history import ( "context" + "github.com/guregu/null" "github.com/stellar/go/support/db" "github.com/stellar/go/xdr" ) @@ -18,6 +19,7 @@ type OperationBatchInsertBuilder interface { operationType xdr.OperationType, details []byte, sourceAccount string, + sourceAcccountMuxed null.String, ) error Exec(ctx context.Context) error } @@ -46,14 +48,16 @@ func (i *operationBatchInsertBuilder) Add( operationType xdr.OperationType, details []byte, sourceAccount string, + sourceAccountMuxed null.String, ) error { return i.builder.Row(ctx, map[string]interface{}{ - "id": id, - "transaction_id": transactionID, - "application_order": applicationOrder, - "type": operationType, - "details": details, - "source_account": sourceAccount, + "id": id, + "transaction_id": transactionID, + "application_order": applicationOrder, + "type": operationType, + "details": details, + "source_account": sourceAccount, + "source_account_muxed": sourceAccountMuxed, }) } diff --git a/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go b/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go index fd7d44271c..e5f2206f64 100644 --- a/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go +++ b/services/horizon/internal/db2/history/operation_batch_insert_builder_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "testing" + "github.com/guregu/null" "github.com/stellar/go/services/horizon/internal/test" "github.com/stellar/go/services/horizon/internal/toid" "github.com/stellar/go/xdr" @@ -39,19 +40,22 @@ func TestAddOperation(t *testing.T) { details, err := json.Marshal(map[string]string{ "to": "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", - "from": "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", "amount": "10.0000000", "asset_type": "native", }) tt.Assert.NoError(err) + sourceAccount := "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY" + sourceAccountMuxed := "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26" err = builder.Add(tt.Ctx, toid.New(sequence, 1, 1).ToInt64(), toid.New(sequence, 1, 0).ToInt64(), 1, xdr.OperationTypePayment, details, - "GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", + sourceAccount, + null.StringFrom(sourceAccountMuxed), ) tt.Assert.NoError(err) @@ -72,10 +76,11 @@ func TestAddOperation(t *testing.T) { tt.Assert.Equal(int32(1), op.ApplicationOrder) tt.Assert.Equal(xdr.OperationTypePayment, op.Type) tt.Assert.Equal( - "{\"to\": \"GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y\", \"from\": \"GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y\", \"amount\": \"10.0000000\", \"asset_type\": \"native\"}", + "{\"to\": \"GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y\", \"from\": \"GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY\", \"amount\": \"10.0000000\", \"asset_type\": \"native\"}", op.DetailsString.String, ) - tt.Assert.Equal("GANFZDRBCNTUXIODCJEYMACPMCSZEVE4WZGZ3CZDZ3P2SXK4KH75IK6Y", op.SourceAccount) + tt.Assert.Equal(sourceAccount, op.SourceAccount) + tt.Assert.Equal(sourceAccountMuxed, op.SourceAccountMuxed.String) tt.Assert.Equal(true, op.TransactionSuccessful) } } diff --git a/services/horizon/internal/db2/history/operation_test.go b/services/horizon/internal/db2/history/operation_test.go index a26d43beca..dbbf1db64a 100644 --- a/services/horizon/internal/db2/history/operation_test.go +++ b/services/horizon/internal/db2/history/operation_test.go @@ -74,7 +74,7 @@ func TestOperationQueryBuilder(t *testing.T) { tt.Assert.NoError(err) // Operations for account queries will use hopp.history_operation_id in their predicates. - want := "SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hopp.history_account_id = ? AND hopp.history_operation_id > ? ORDER BY hopp.history_operation_id asc LIMIT 10" + want := "SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, hop.source_account_muxed, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hopp.history_account_id = ? AND hopp.history_operation_id > ? ORDER BY hopp.history_operation_id asc LIMIT 10" tt.Assert.EqualValues(want, got) opsQ = q.Operations().ForLedger(tt.Ctx, 2).Page(db2.PageQuery{Cursor: "8589938689", Order: "asc", Limit: 10}) @@ -83,7 +83,7 @@ func TestOperationQueryBuilder(t *testing.T) { tt.Assert.NoError(err) // Other operation queries will use hop.id in their predicates. - want = "SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id WHERE hop.id >= ? AND hop.id < ? AND hop.id > ? ORDER BY hop.id asc LIMIT 10" + want = "SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, hop.source_account_muxed, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id WHERE hop.id >= ? AND hop.id < ? AND hop.id > ? ORDER BY hop.id asc LIMIT 10" tt.Assert.EqualValues(want, got) } @@ -145,7 +145,7 @@ func TestOperationIncludeFailed(t *testing.T) { sql, _, err := query.sql.ToSql() tt.Assert.NoError(err) - tt.Assert.Equal("SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hopp.history_account_id = ?", sql) + tt.Assert.Equal("SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, hop.source_account_muxed, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hopp.history_account_id = ?", sql) } // TestPaymentsSuccessfulOnly tests if default query returns payments in @@ -208,7 +208,7 @@ func TestPaymentsIncludeFailed(t *testing.T) { sql, _, err := query.sql.ToSql() tt.Assert.NoError(err) - tt.Assert.Equal("SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hop.type IN (?,?,?,?,?) AND hopp.history_account_id = ?", sql) + tt.Assert.Equal("SELECT hop.id, hop.transaction_id, hop.application_order, hop.type, hop.details, hop.source_account, hop.source_account_muxed, ht.transaction_hash, ht.tx_result, COALESCE(ht.successful, true) as transaction_successful FROM history_operations hop LEFT JOIN history_transactions ht ON ht.id = hop.transaction_id JOIN history_operation_participants hopp ON hopp.history_operation_id = hop.id WHERE hop.type IN (?,?,?,?,?) AND hopp.history_account_id = ?", sql) } func TestExtraChecksOperationsTransactionSuccessfulTrueResultFalse(t *testing.T) { diff --git a/services/horizon/internal/db2/history/transaction.go b/services/horizon/internal/db2/history/transaction.go index 622bf60287..d538ad20ab 100644 --- a/services/horizon/internal/db2/history/transaction.go +++ b/services/horizon/internal/db2/history/transaction.go @@ -192,6 +192,7 @@ var selectTransaction = sq.Select( "ht.ledger_sequence, " + "ht.application_order, " + "ht.account, " + + "ht.account_muxed, " + "ht.account_sequence, " + "ht.max_fee, " + // `fee_charged` is NULL by default, DB needs to be reingested @@ -212,6 +213,7 @@ var selectTransaction = sq.Select( "hl.closed_at AS ledger_close_time, " + "ht.inner_transaction_hash, " + "ht.fee_account, " + + "ht.fee_account_muxed, " + "ht.new_max_fee, " + "ht.inner_signatures"). From("history_transactions ht"). diff --git a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go index 345550a189..2e2f736df8 100644 --- a/services/horizon/internal/db2/history/transaction_batch_insert_builder.go +++ b/services/horizon/internal/db2/history/transaction_batch_insert_builder.go @@ -206,6 +206,7 @@ type TransactionWithoutLedger struct { LedgerSequence int32 `db:"ledger_sequence"` ApplicationOrder int32 `db:"application_order"` Account string `db:"account"` + AccountMuxed null.String `db:"account_muxed"` AccountSequence string `db:"account_sequence"` MaxFee int64 `db:"max_fee"` FeeCharged int64 `db:"fee_charged"` @@ -222,6 +223,7 @@ type TransactionWithoutLedger struct { UpdatedAt time.Time `db:"updated_at"` Successful bool `db:"successful"` FeeAccount null.String `db:"fee_account"` + FeeAccountMuxed null.String `db:"fee_account_muxed"` InnerTransactionHash null.String `db:"inner_transaction_hash"` NewMaxFee null.Int `db:"new_max_fee"` InnerSignatures pq.StringArray `db:"inner_signatures"` @@ -245,12 +247,18 @@ func transactionToRow(transaction ingest.LedgerTransaction, sequence uint32) (Tr return TransactionWithoutLedger{}, err } - sourceAccount := transaction.Envelope.SourceAccount().ToAccountId() + source := transaction.Envelope.SourceAccount() + account := source.ToAccountId() + var accountMuxed null.String + if source.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + accountMuxed = null.StringFrom(source.Address()) + } t := TransactionWithoutLedger{ TransactionHash: hex.EncodeToString(transaction.Result.TransactionHash[:]), LedgerSequence: int32(sequence), ApplicationOrder: int32(transaction.Index), - Account: sourceAccount.Address(), + Account: account.Address(), + AccountMuxed: accountMuxed, AccountSequence: strconv.FormatInt(transaction.Envelope.SeqNum(), 10), MaxFee: int64(transaction.Envelope.Fee()), FeeCharged: int64(transaction.Result.Result.FeeCharged), @@ -271,14 +279,21 @@ func transactionToRow(transaction ingest.LedgerTransaction, sequence uint32) (Tr if transaction.Envelope.IsFeeBump() { innerHash := transaction.Result.InnerHash() t.InnerTransactionHash = null.StringFrom(hex.EncodeToString(innerHash[:])) - feeAccount := transaction.Envelope.FeeBumpAccount().ToAccountId() + feeBumpAccount := transaction.Envelope.FeeBumpAccount() + feeAccount := feeBumpAccount.ToAccountId() + var feeAccountMuxed null.String + if source.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + feeAccountMuxed = null.StringFrom(source.Address()) + } t.FeeAccount = null.StringFrom(feeAccount.Address()) + t.FeeAccountMuxed = feeAccountMuxed t.NewMaxFee = null.IntFrom(transaction.Envelope.FeeBumpFee()) t.InnerSignatures = signatures(transaction.Envelope.Signatures()) t.Signatures = signatures(transaction.Envelope.FeeBumpSignatures()) } else { t.InnerTransactionHash = null.StringFromPtr(nil) t.FeeAccount = null.StringFromPtr(nil) + t.FeeAccountMuxed = null.StringFromPtr(nil) t.NewMaxFee = null.IntFromPtr(nil) t.InnerSignatures = nil t.Signatures = signatures(transaction.Envelope.Signatures()) diff --git a/services/horizon/internal/db2/history/transaction_test.go b/services/horizon/internal/db2/history/transaction_test.go index e07d24e9c3..d887c33bfe 100644 --- a/services/horizon/internal/db2/history/transaction_test.go +++ b/services/horizon/internal/db2/history/transaction_test.go @@ -90,7 +90,7 @@ func TestTransactionIncludeFailed(t *testing.T) { sql, _, err := query.sql.ToSql() tt.Assert.NoError(err) - tt.Assert.Equal("SELECT ht.id, ht.transaction_hash, ht.ledger_sequence, ht.application_order, ht.account, ht.account_sequence, ht.max_fee, COALESCE(ht.fee_charged, ht.max_fee) as fee_charged, ht.operation_count, ht.tx_envelope, ht.tx_result, ht.tx_meta, ht.tx_fee_meta, ht.created_at, ht.updated_at, COALESCE(ht.successful, true) as successful, ht.signatures, ht.memo_type, ht.memo, time_bounds, hl.closed_at AS ledger_close_time, ht.inner_transaction_hash, ht.fee_account, ht.new_max_fee, ht.inner_signatures FROM history_transactions ht LEFT JOIN history_ledgers hl ON ht.ledger_sequence = hl.sequence JOIN history_transaction_participants htp ON htp.history_transaction_id = ht.id WHERE htp.history_account_id = ?", sql) + tt.Assert.Equal("SELECT ht.id, ht.transaction_hash, ht.ledger_sequence, ht.application_order, ht.account, ht.account_muxed, ht.account_sequence, ht.max_fee, COALESCE(ht.fee_charged, ht.max_fee) as fee_charged, ht.operation_count, ht.tx_envelope, ht.tx_result, ht.tx_meta, ht.tx_fee_meta, ht.created_at, ht.updated_at, COALESCE(ht.successful, true) as successful, ht.signatures, ht.memo_type, ht.memo, time_bounds, hl.closed_at AS ledger_close_time, ht.inner_transaction_hash, ht.fee_account, ht.fee_account_muxed, ht.new_max_fee, ht.inner_signatures FROM history_transactions ht LEFT JOIN history_ledgers hl ON ht.ledger_sequence = hl.sequence JOIN history_transaction_participants htp ON htp.history_transaction_id = ht.id WHERE htp.history_account_id = ?", sql) } func TestExtraChecksTransactionSuccessfulTrueResultFalse(t *testing.T) { diff --git a/services/horizon/internal/db2/schema/bindata.go b/services/horizon/internal/db2/schema/bindata.go index 2fb4924565..d38a342815 100644 --- a/services/horizon/internal/db2/schema/bindata.go +++ b/services/horizon/internal/db2/schema/bindata.go @@ -40,6 +40,7 @@ // migrations/43_add_claimable_balances_flags.sql (145B) // migrations/44_asset_stat_accounts_and_balances.sql (439B) // migrations/45_add_claimable_balances_history.sql (2.163kB) +// migrations/46_add_muxed_accounts.sql (465B) // migrations/4_add_protocol_version.sql (188B) // migrations/5_create_trades_table.sql (1.1kB) // migrations/6_create_assets_table.sql (366B) @@ -915,6 +916,26 @@ func migrations45_add_claimable_balances_historySql() (*asset, error) { return a, nil } +var _migrations46_add_muxed_accountsSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x90\xbf\xce\x82\x40\x10\xc4\xfb\x7b\x8a\x2d\xbf\x2f\x42\x6b\x62\xa8\x30\x47\x77\x51\x43\xa0\x26\x9b\x63\x11\x0a\xee\xc8\xde\xe1\x9f\xb7\x37\x01\x13\x31\x22\x1a\xdb\xcd\xcc\xce\xfc\x26\x0c\x61\xd5\x36\x47\x46\x4f\x90\x77\x42\xc4\x2a\x4b\x52\xc8\xe2\xad\x4a\xa0\x6e\x9c\xb7\x7c\x2d\x3c\xa3\x71\xa8\x7d\x63\x8d\x83\x58\x4a\x40\xad\x6d\x6f\x7c\xd1\xf6\x17\x2a\xe1\x84\xac\x6b\xe4\xbf\xf5\xe6\x1f\x76\xb9\x52\xc1\xa0\xa9\x88\x8a\x65\x5d\x34\x1b\x66\x3b\x62\x7c\x44\x39\xdb\xb3\xfe\xed\x13\x55\x15\x69\x7f\x6f\x5c\x96\x4c\xce\xbd\xf5\x8b\xe9\x0e\xd2\x9e\xcd\x17\x4b\xc8\x74\x7f\x78\x9e\x22\x18\x6f\x2f\xe8\x1f\x49\x07\xdb\x1c\xea\x32\xd9\xd8\x60\x8a\x16\x89\x5b\x00\x00\x00\xff\xff\x1e\x83\x01\x2a\xd1\x01\x00\x00") + +func migrations46_add_muxed_accountsSqlBytes() ([]byte, error) { + return bindataRead( + _migrations46_add_muxed_accountsSql, + "migrations/46_add_muxed_accounts.sql", + ) +} + +func migrations46_add_muxed_accountsSql() (*asset, error) { + bytes, err := migrations46_add_muxed_accountsSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "migrations/46_add_muxed_accounts.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf2, 0x2e, 0xec, 0xdc, 0x13, 0x2a, 0x94, 0xfa, 0xba, 0x5c, 0xe7, 0x2d, 0x10, 0x39, 0x2b, 0xf3, 0x28, 0xd, 0x46, 0x7f, 0xf, 0xc3, 0x4c, 0xd1, 0x43, 0xff, 0x81, 0xe1, 0x68, 0xa, 0xef, 0xd1}} + return a, nil +} + var _migrations4_add_protocol_versionSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\xcd\xb1\x0a\xc2\x30\x10\x06\xe0\x3d\x4f\xf1\xef\x52\x70\xef\x14\x4d\x9d\xce\x44\x4a\x32\x38\x15\xd1\xa3\x06\x6a\xae\x5c\x82\xe2\xdb\xbb\xba\x88\x4f\xf0\x75\x1d\x36\x8f\x3c\xeb\xa5\x31\xd2\x6a\x2c\xc5\x61\x44\xb4\x3b\x1a\x10\x3c\x9d\x71\xcf\xb5\x89\xbe\xa7\x85\x6f\x33\x6b\x85\x01\xac\x73\xd8\x07\x4a\x47\x8f\x55\xa5\xc9\x55\x96\xe9\xc9\x5a\xb3\x14\xe4\xd2\x78\x66\x85\x1b\x0e\x36\x51\xc4\x16\x3e\x44\xf8\x44\xd4\x1b\xf3\x6d\x39\x79\x95\xff\x9a\x1b\xc3\xe9\x97\xd5\x9b\x4f\x00\x00\x00\xff\xff\x83\xbb\x30\x2e\xbc\x00\x00\x00") func migrations4_add_protocol_versionSqlBytes() ([]byte, error) { @@ -1186,6 +1207,7 @@ var _bindata = map[string]func() (*asset, error){ "migrations/43_add_claimable_balances_flags.sql": migrations43_add_claimable_balances_flagsSql, "migrations/44_asset_stat_accounts_and_balances.sql": migrations44_asset_stat_accounts_and_balancesSql, "migrations/45_add_claimable_balances_history.sql": migrations45_add_claimable_balances_historySql, + "migrations/46_add_muxed_accounts.sql": migrations46_add_muxed_accountsSql, "migrations/4_add_protocol_version.sql": migrations4_add_protocol_versionSql, "migrations/5_create_trades_table.sql": migrations5_create_trades_tableSql, "migrations/6_create_assets_table.sql": migrations6_create_assets_tableSql, @@ -1277,6 +1299,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "43_add_claimable_balances_flags.sql": &bintree{migrations43_add_claimable_balances_flagsSql, map[string]*bintree{}}, "44_asset_stat_accounts_and_balances.sql": &bintree{migrations44_asset_stat_accounts_and_balancesSql, map[string]*bintree{}}, "45_add_claimable_balances_history.sql": &bintree{migrations45_add_claimable_balances_historySql, map[string]*bintree{}}, + "46_add_muxed_accounts.sql": &bintree{migrations46_add_muxed_accountsSql, map[string]*bintree{}}, "4_add_protocol_version.sql": &bintree{migrations4_add_protocol_versionSql, map[string]*bintree{}}, "5_create_trades_table.sql": &bintree{migrations5_create_trades_tableSql, map[string]*bintree{}}, "6_create_assets_table.sql": &bintree{migrations6_create_assets_tableSql, map[string]*bintree{}}, diff --git a/services/horizon/internal/db2/schema/migrations/46_add_muxed_accounts.sql b/services/horizon/internal/db2/schema/migrations/46_add_muxed_accounts.sql new file mode 100644 index 0000000000..3cc03750c7 --- /dev/null +++ b/services/horizon/internal/db2/schema/migrations/46_add_muxed_accounts.sql @@ -0,0 +1,11 @@ +-- +migrate Up + +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; + +-- +migrate Down + +ALTER TABLE history_transactions DROP account_muxed, DROP fee_account_muxed; +ALTER TABLE history_operations DROP source_account_muxed; +ALTER TABLE history_effects DROP address_muxed; diff --git a/services/horizon/internal/ingest/processors/effects_processor.go b/services/horizon/internal/ingest/processors/effects_processor.go index 0f421d7607..b45d1f726f 100644 --- a/services/horizon/internal/ingest/processors/effects_processor.go +++ b/services/horizon/internal/ingest/processors/effects_processor.go @@ -8,6 +8,7 @@ import ( "reflect" "sort" + "github.com/guregu/null" "github.com/stellar/go/amount" "github.com/stellar/go/ingest" "github.com/stellar/go/keypair" @@ -93,6 +94,7 @@ func (p *EffectProcessor) insertDBOperationsEffects(ctx context.Context, effects if err := batch.Add(ctx, accountID, + effect.addressMuxed, effect.operationID, effect.order, effect.effectType, @@ -145,11 +147,12 @@ func (p *EffectProcessor) Commit(ctx context.Context) (err error) { } type effect struct { - address string - operationID int64 - details map[string]interface{} - effectType history.EffectType - order uint32 + address string + addressMuxed null.String + operationID int64 + details map[string]interface{} + effectType history.EffectType + order uint32 } // Effects returns the operation effects @@ -234,24 +237,28 @@ type effectsWrapper struct { operation *transactionOperationWrapper } -func (e *effectsWrapper) add(address *xdr.AccountId, effectType history.EffectType, details map[string]interface{}) { +func (e *effectsWrapper) add(address string, addressMuxed null.String, effectType history.EffectType, details map[string]interface{}) { e.effects = append(e.effects, effect{ - address: address.Address(), - operationID: e.operation.ID(), - effectType: effectType, - order: uint32(len(e.effects) + 1), - details: details, + address: address, + addressMuxed: addressMuxed, + operationID: e.operation.ID(), + effectType: effectType, + order: uint32(len(e.effects) + 1), + details: details, }) } +func (e *effectsWrapper) addUnmuxed(address *xdr.AccountId, effectType history.EffectType, details map[string]interface{}) { + e.add(address.Address(), null.String{}, effectType, details) +} + func (e *effectsWrapper) addMuxed(address *xdr.MuxedAccount, effectType history.EffectType, details map[string]interface{}) { + var addressMuxed null.String if address.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { - // We abuse the details to inject muxed-account information without changing the DB schema - details["account_muxed"] = address.Address() - details["account_muxed_id"] = uint64(address.Med25519.Id) + addressMuxed = null.StringFrom(address.Address()) } accID := address.ToAccountId() - e.add(&accID, effectType, details) + e.add(accID.Address(), addressMuxed, effectType, details) } var sponsoringEffectsTable = map[xdr.LedgerEntryType]struct { @@ -322,12 +329,12 @@ func (e *effectsWrapper) addSignerSponsorshipEffects(change ingest.Change) { details["sponsor"] = post.Address() details["signer"] = signer srcAccount := change.Post.Data.MustAccount().AccountId - e.add(&srcAccount, history.EffectSignerSponsorshipCreated, details) + e.addUnmuxed(&srcAccount, history.EffectSignerSponsorshipCreated, details) case !foundPost && foundPre: details["former_sponsor"] = pre.Address() details["signer"] = signer srcAccount := change.Pre.Data.MustAccount().AccountId - e.add(&srcAccount, history.EffectSignerSponsorshipRemoved, details) + e.addUnmuxed(&srcAccount, history.EffectSignerSponsorshipRemoved, details) case foundPre && foundPost: formerSponsor := pre.Address() newSponsor := post.Address() @@ -339,7 +346,7 @@ func (e *effectsWrapper) addSignerSponsorshipEffects(change ingest.Change) { details["new_sponsor"] = newSponsor details["signer"] = signer srcAccount := change.Post.Data.MustAccount().AccountId - e.add(&srcAccount, history.EffectSignerSponsorshipUpdated, details) + e.addUnmuxed(&srcAccount, history.EffectSignerSponsorshipUpdated, details) } } } @@ -411,7 +418,7 @@ func (e *effectsWrapper) addLedgerEntrySponsorshipEffects(change ingest.Change) } if accountID != nil { - e.add(accountID, effectType, details) + e.addUnmuxed(accountID, effectType, details) } else { e.addMuxed(muxedAccount, effectType, details) } @@ -422,7 +429,7 @@ func (e *effectsWrapper) addLedgerEntrySponsorshipEffects(change ingest.Change) func (e *effectsWrapper) addAccountCreatedEffects() { op := e.operation.operation.Body.MustCreateAccountOp() - e.add( + e.addUnmuxed( &op.Destination, history.EffectAccountCreated, map[string]interface{}{ @@ -437,7 +444,7 @@ func (e *effectsWrapper) addAccountCreatedEffects() { "amount": amount.String(op.StartingBalance), }, ) - e.add( + e.addUnmuxed( &op.Destination, history.EffectSignerCreated, map[string]interface{}{ @@ -745,7 +752,7 @@ func (e *effectsWrapper) addAccountMergeEffects() { func (e *effectsWrapper) addInflationEffects() { payouts := e.operation.OperationResult().MustInflationResult().MustPayouts() for _, payout := range payouts { - e.add(&payout.Destination, history.EffectAccountCredited, + e.addUnmuxed(&payout.Destination, history.EffectAccountCredited, map[string]interface{}{ "amount": amount.String(payout.Amount), "asset_type": "native", @@ -860,7 +867,7 @@ func (e *effectsWrapper) addCreateClaimableBalanceEffects(changes []ingest.Chang for _, c := range op.Claimants { cv0 := c.MustV0() - e.add( + e.addUnmuxed( &cv0.Destination, history.EffectClaimableBalanceClaimantCreated, map[string]interface{}{ @@ -959,7 +966,7 @@ func (e *effectsWrapper) addIngestTradeEffects(buyer xdr.MuxedAccount, claims [] bd, ) - e.add( + e.addUnmuxed( &seller, history.EffectTrade, sd, diff --git a/services/horizon/internal/ingest/processors/effects_processor_test.go b/services/horizon/internal/ingest/processors/effects_processor_test.go index 3d2916a129..331aab7cc9 100644 --- a/services/horizon/internal/ingest/processors/effects_processor_test.go +++ b/services/horizon/internal/ingest/processors/effects_processor_test.go @@ -6,6 +6,7 @@ import ( "context" "testing" + "github.com/guregu/null" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" @@ -136,6 +137,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[2]], + null.String{}, toid.New(int32(s.sequence), 1, 1).ToInt64(), uint32(1), history.EffectSequenceBumped, @@ -145,6 +147,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[2]], + null.String{}, toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(1), history.EffectAccountCreated, @@ -154,6 +157,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[1]], + null.String{}, toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(2), history.EffectAccountDebited, @@ -163,6 +167,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[2]], + null.String{}, toid.New(int32(s.sequence), 2, 1).ToInt64(), uint32(3), history.EffectSignerCreated, @@ -173,6 +178,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[0]], + null.String{}, toid.New(int32(s.sequence), 3, 1).ToInt64(), uint32(1), history.EffectAccountCredited, @@ -183,6 +189,7 @@ func (s *EffectsProcessorTestSuiteLedger) mockSuccessfulEffectBatchAdds() { "Add", s.ctx, s.addressToID[s.addresses[0]], + null.String{}, toid.New(int32(s.sequence), 3, 1).ToInt64(), uint32(2), history.EffectAccountDebited, @@ -244,6 +251,7 @@ func (s *EffectsProcessorTestSuiteLedger) TestBatchAddFails() { s.mockBatchInsertBuilder.On( "Add", s.ctx, s.addressToID[s.addresses[2]], + null.String{}, toid.New(int32(s.sequence), 1, 1).ToInt64(), uint32(1), history.EffectSequenceBumped, @@ -944,38 +952,35 @@ func TestOperationEffects(t *testing.T) { sequence: 20, expected: []effect{ { - address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", + address: "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", + addressMuxed: null.StringFrom("MDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQGAAAAAAMV7V2X24II"), details: map[string]interface{}{ - "account_muxed": "MDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQGAAAAAAMV7V2X24II", - "account_muxed_id": uint64(0xcafebabe), - "amount": "1.0000000", - "asset_code": "ARS", - "asset_type": "credit_alphanum4", - "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", + "amount": "1.0000000", + "asset_code": "ARS", + "asset_type": "credit_alphanum4", + "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", }, effectType: history.EffectAccountCredited, operationID: int64(85899350017), order: uint32(1), }, { - address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", + address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", + addressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), details: map[string]interface{}{ - "account_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", - "account_muxed_id": uint64(0xcafebabe), - "amount": "0.0300000", - "asset_code": "BRL", - "asset_type": "credit_alphanum4", - "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", + "amount": "0.0300000", + "asset_code": "BRL", + "asset_type": "credit_alphanum4", + "asset_issuer": "GCXI6Q73J7F6EUSBZTPW4G4OUGVDHABPYF2U4KO7MVEX52OH5VMVUCRF", }, effectType: history.EffectAccountDebited, operationID: int64(85899350017), order: uint32(2), }, { - address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", + address: "GD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY737V", + addressMuxed: null.StringFrom("MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C"), details: map[string]interface{}{ - "account_muxed": "MD3MMHD2YZWL5RAUWG6O3RMA5HTZYM7S3JLSZ2Z35JNJAWTDIKXY6AAAAAAMV7V2XZY4C", - "account_muxed_id": uint64(0xcafebabe), "seller": "GDEOVUDLCYTO46D6GD6WH7BFESPBV5RACC6F6NUFCIRU7PL2XONQHVGJ", "offer_id": xdr.Int64(10072128), "sold_amount": "0.0300000", diff --git a/services/horizon/internal/ingest/processors/operations_processor.go b/services/horizon/internal/ingest/processors/operations_processor.go index 2c4d05f5b7..010f4b5b88 100644 --- a/services/horizon/internal/ingest/processors/operations_processor.go +++ b/services/horizon/internal/ingest/processors/operations_processor.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" + "github.com/guregu/null" "github.com/stellar/go/amount" "github.com/stellar/go/ingest" "github.com/stellar/go/services/horizon/internal/db2/history" @@ -50,13 +51,19 @@ func (p *OperationProcessor) ProcessTransaction(ctx context.Context, transaction } source := operation.SourceAccount() + acID := source.ToAccountId() + var sourceAccountMuxed null.String + if source.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + sourceAccountMuxed = null.StringFrom(source.Address()) + } if err := p.batch.Add(ctx, operation.ID(), operation.TransactionID(), operation.Order(), operation.OperationType(), detailsJSON, - source.Address(), + acID.Address(), + sourceAccountMuxed, ); err != nil { return errors.Wrap(err, "Error batch inserting operation rows") } @@ -204,19 +211,15 @@ func (operation *transactionOperationWrapper) findInitatingBeginSponsoringOp() * return nil } -func addMuxedAccountDetails(result map[string]interface{}, a xdr.MuxedAccount, prefix string) { +func addAccountAndMuxedAccountDetails(result map[string]interface{}, a xdr.MuxedAccount, prefix string) { + accid := a.ToAccountId() + result[prefix] = accid.Address() if a.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { result[prefix+"_muxed"] = a.Address() result[prefix+"_muxed_id"] = uint64(a.Med25519.Id) } } -func addAccountAndMuxedAccountDetails(result map[string]interface{}, a xdr.MuxedAccount, prefix string) { - accid := a.ToAccountId() - result[prefix] = accid.Address() - addMuxedAccountDetails(result, a, prefix) -} - // Details returns the operation details as a map which can be stored as JSON. func (operation *transactionOperationWrapper) Details() (map[string]interface{}, error) { details := map[string]interface{}{} @@ -460,8 +463,6 @@ func (operation *transactionOperationWrapper) Details() (map[string]interface{}, if sponsor != nil { details["sponsor"] = sponsor.Address() } - // We abuse the details to inject muxed-account information without changing the DB schema - addMuxedAccountDetails(details, *source, "source_account") return details, nil } diff --git a/services/horizon/internal/ingest/processors/operations_processor_test.go b/services/horizon/internal/ingest/processors/operations_processor_test.go index 23a9e0e65c..79b94b1f7f 100644 --- a/services/horizon/internal/ingest/processors/operations_processor_test.go +++ b/services/horizon/internal/ingest/processors/operations_processor_test.go @@ -7,6 +7,7 @@ import ( "encoding/json" "testing" + "github.com/guregu/null" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/suite" @@ -65,6 +66,12 @@ func (s *OperationsProcessorTestSuiteLedger) mockBatchInsertAdds(txs []ingest.Le return err } + source := expected.SourceAccount() + acID := source.ToAccountId() + var muxedAccount null.String + if source.Type == xdr.CryptoKeyTypeKeyTypeMuxedEd25519 { + muxedAccount = null.StringFrom(source.Address()) + } s.mockBatchInsertBuilder.On( "Add", s.ctx, @@ -73,7 +80,8 @@ func (s *OperationsProcessorTestSuiteLedger) mockBatchInsertAdds(txs []ingest.Le expected.Order(), expected.OperationType(), detailsJSON, - expected.SourceAccount().Address(), + acID.Address(), + muxedAccount, ).Return(nil).Once() } } @@ -135,6 +143,7 @@ func (s *OperationsProcessorTestSuiteLedger) TestAddOperationFails() { mock.Anything, mock.Anything, mock.Anything, + mock.Anything, ).Return(errors.New("transient error")).Once() err := s.processor.ProcessTransaction(s.ctx, tx) diff --git a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go index 0a8b759604..01f32a6427 100644 --- a/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go +++ b/services/horizon/internal/ingest/processors/transaction_operation_wrapper_test.go @@ -233,13 +233,11 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nHQAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA5AAAAAAAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wsatlj11nFsAAAAAAAAABkAAAAAAAAAAQAAAABi/B0L0JGythwN1lY0aypo19NHxvLCyO5tBEcCVvwF9wAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "account": "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", - "funder": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "funder_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "funder_muxed_id": uint64(1234), - "starting_balance": "1000.0000000", - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "account": "GCQZP3IU7XU6EJ63JZXKCQOYT2RNXN3HB5CNHENNUEUHSMA4VUJJJSEN", + "funder": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "funder_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "funder_muxed_id": uint64(1234), + "starting_balance": "1000.0000000", }, }, { @@ -265,16 +263,14 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAA3AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+QAAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAA4AAAAAAAAAAAaXI4hE2dLocMSSYYAT2ClklSctk2diyPO36ldXFH/1AAAAAJUC+OcAAAANwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "amount": "10.0000000", - "asset_type": "native", - "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "from_muxed_id": uint64(1234), - "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", - "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", - "to_muxed_id": uint64(0), - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "amount": "10.0000000", + "asset_type": "native", + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), }, }, { @@ -306,22 +302,20 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAATAAAAAAAAAADjbf+sBiPPOGYurGA2AtRjlf3a54eDnEa066iT6Dk1CgAAAAJUC+M4AAAAEAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAUAAAAAAAAAADjbf+sBiPPOGYurGA2AtRjlf3a54eDnEa066iT6Dk1CgAAAAJUC+LUAAAAEAAAAAIAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", - "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", - "to_muxed_id": uint64(0), - "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "from_muxed_id": uint64(1234), - "path": []map[string]interface{}{}, - "amount": "100.0000000", - "asset_code": "EUR", - "asset_type": "credit_alphanum4", - "source_max": "100.0000000", - "asset_issuer": "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU", - "source_amount": "100.0000000", - "source_asset_type": "native", - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "path": []map[string]interface{}{}, + "amount": "100.0000000", + "asset_code": "EUR", + "asset_type": "credit_alphanum4", + "source_max": "100.0000000", + "asset_issuer": "GAXMF43TGZHW3QN3REOUA2U5PW5BTARXGGYJ3JIFHW3YT6QRKRL3CPPU", + "source_amount": "100.0000000", + "source_asset_type": "native", }, }, { @@ -547,16 +541,14 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAAmAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+QAAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAoAAAAAAAAAACrbqxRyV/3kbeYDOqiFwDG2l75SJqi8rAOkK/bS3psXwAAAAJUC+OcAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "asset_code": "USD", - "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", - "asset_type": "credit_alphanum4", - "limit": "922337203685.4775807", - "trustee": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", - "trustor": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "trustor_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "trustor_muxed_id": uint64(1234), - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "asset_code": "USD", + "asset_issuer": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", + "asset_type": "credit_alphanum4", + "limit": "922337203685.4775807", + "trustee": "GD4SMOE3VPSF7ZR3CTEQ3P5UNTBMEJDA2GLXTHR7MMARANKKJDZ7RPGF", + "trustor": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "trustor_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "trustor_muxed_id": uint64(1234), }, }, { @@ -584,16 +576,14 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAAnAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+OcAAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAApAAAAAAAAAAD5Jjibq+Rf5jsUyQ2/tGzCwiRg0Zd5nj9jARA1Skjz+AAAAAJUC+M4AAAAJgAAAAEAAAAAAAAAAAAAAAMAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "asset_code": "USD", - "asset_issuer": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "asset_type": "credit_alphanum4", - "authorize": true, - "trustee": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "trustee_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "trustee_muxed_id": uint64(1234), - "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "asset_code": "USD", + "asset_issuer": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "asset_type": "credit_alphanum4", + "authorize": true, + "trustee": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "trustee_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "trustee_muxed_id": uint64(1234), + "trustor": "GCVW5LCRZFP7PENXTAGOVIQXADDNUXXZJCNKF4VQB2IK7W2LPJWF73UG", }, }, { @@ -617,14 +607,12 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMAAAArAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+QAAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAsAAAAAAAAAACO+5qjU8vVT4JoJ/v/7r4z/FScSdRR0OIwq2EviuPh7wAAAAJUC+OcAAAAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "into": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", - "into_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", - "into_muxed_id": uint64(0), - "account": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "account_muxed_id": uint64(1234), - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "into": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "into_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "into_muxed_id": uint64(0), + "account": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "account_muxed_id": uint64(1234), }, }, { @@ -713,20 +701,18 @@ func TestTransactionOperationDetails(t *testing.T) { feeChangesXDR: "AAAAAgAAAAMACk4EAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdIdugAAApOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEACk4VAAAAAAAAAADrAt1LkCV3iVpe6NkPVn9kb2Yh4hyn0m7QzbF5J9zTIgAAABdIduecAApOBAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==", index: 0, expected: map[string]interface{}{ - "amount": "10.0000000", - "asset_type": "native", - "destination_min": "10.0000000", - "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "from_muxed_id": uint64(1234), - "path": []map[string]interface{}{{"asset_type": "native"}}, - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), - "source_amount": "10.0000000", - "source_asset_type": "native", - "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", - "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", - "to_muxed_id": uint64(0), + "amount": "10.0000000", + "asset_type": "native", + "destination_min": "10.0000000", + "from": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "from_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "from_muxed_id": uint64(1234), + "path": []map[string]interface{}{{"asset_type": "native"}}, + "source_amount": "10.0000000", + "source_asset_type": "native", + "to": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "to_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "to_muxed_id": uint64(0), }, }, { @@ -1438,12 +1424,10 @@ func (s *ClaimClaimableBalanceOpTestSuite) SetupTest() { } func (s *ClaimClaimableBalanceOpTestSuite) TestDetails() { expected := map[string]interface{}{ - "claimant": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", - "claimant_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "claimant_muxed_id": uint64(1234), - "balance_id": s.balanceID, - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "claimant": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + "claimant_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", + "claimant_muxed_id": uint64(1234), + "balance_id": s.balanceID, } operation := transactionOperationWrapper{ @@ -1579,9 +1563,7 @@ func TestSponsoredSandwichTransaction_Details(t *testing.T) { details, err := wrappers[0].Details() assert.NoError(t, err) assert.Equal(t, map[string]interface{}{ - "sponsored_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "sponsored_id": "GA5WBPYA5Y4WAEHXWR2UKO2UO4BUGHUQ74EUPKON2QHV4WRHOIRNKKH2", }, details) details, err = wrappers[1].Details() @@ -1659,15 +1641,13 @@ func (s *ClawbackTestSuite) SetupTest() { } func (s *ClawbackTestSuite) TestDetails() { expected := map[string]interface{}{ - "asset_code": "USD", - "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", - "asset_type": "credit_alphanum4", - "amount": "0.0000020", - "from": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", - "from_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", - "from_muxed_id": uint64(0), - "source_account_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "source_account_muxed_id": uint64(1234), + "asset_code": "USD", + "asset_issuer": "GDRW375MAYR46ODGF2WGANQC2RRZL7O246DYHHCGWTV2RE7IHE2QUQLD", + "asset_type": "credit_alphanum4", + "amount": "0.0000020", + "from": "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + "from_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", + "from_muxed_id": uint64(0), } operation := transactionOperationWrapper{ diff --git a/services/horizon/internal/integration/muxed_account_details_test.go b/services/horizon/internal/integration/muxed_account_details_test.go new file mode 100644 index 0000000000..98bc0c3503 --- /dev/null +++ b/services/horizon/internal/integration/muxed_account_details_test.go @@ -0,0 +1,90 @@ +package integration + +import ( + "testing" + + "github.com/stellar/go/clients/horizonclient" + hProtocol "github.com/stellar/go/protocols/horizon" + "github.com/stellar/go/protocols/horizon/effects" + "github.com/stellar/go/protocols/horizon/operations" + "github.com/stellar/go/services/horizon/internal/test/integration" + "github.com/stellar/go/txnbuild" + "github.com/stellar/go/xdr" + "github.com/stretchr/testify/assert" +) + +func TestMuxedAccountDetails(t *testing.T) { + tt := assert.New(t) + itest := integration.NewTest(t, integration.Config{ProtocolVersion: 17}) + master := itest.Master() + masterStr := master.Address() + masterAcID := xdr.MustAddress(masterStr) + + accs, _ := itest.CreateAccounts(1, "100") + destionationStr := accs[0].Address() + destinationAcID := xdr.MustAddress(destionationStr) + + source := xdr.MuxedAccount{ + Type: xdr.CryptoKeyTypeKeyTypeMuxedEd25519, + Med25519: &xdr.MuxedAccountMed25519{ + Id: 0xcafebabe, + Ed25519: *masterAcID.Ed25519, + }, + } + + destination := xdr.MuxedAccount{ + Type: xdr.CryptoKeyTypeKeyTypeMuxedEd25519, + Med25519: &xdr.MuxedAccountMed25519{ + Id: 0xdeadbeef, + Ed25519: *destinationAcID.Ed25519, + }, + } + + // Submit a simple payment tx + op := txnbuild.Payment{ + SourceAccount: source.Address(), + Destination: destination.Address(), + Amount: "10", + Asset: txnbuild.NativeAsset{}, + } + + txSource := itest.MasterAccount().(*hProtocol.Account) + txSource.AccountID = source.Address() + txResp := itest.MustSubmitOperations(txSource, master, &op) + + // check the transaction details + txDetails, err := itest.Client().TransactionDetail(txResp.Hash) + tt.NoError(err) + tt.Equal(source.Address(), txDetails.AccountMuxed) + tt.Equal(uint64(source.Med25519.Id), txDetails.AccountMuxedID) + tt.Equal(source.Address(), txDetails.FeeAccountMuxed) + tt.Equal(uint64(source.Med25519.Id), txDetails.FeeAccountMuxedID) + + // check the operation details + opsResp, err := itest.Client().Operations(horizonclient.OperationRequest{ + ForTransaction: txResp.Hash, + }) + tt.NoError(err) + opDetails := opsResp.Embedded.Records[0].(operations.Payment) + tt.Equal(source.Address(), opDetails.SourceAccountMuxed) + tt.Equal(uint64(source.Med25519.Id), opDetails.SourceAccountMuxedID) + tt.Equal(source.Address(), opDetails.FromMuxed) + tt.Equal(uint64(source.Med25519.Id), opDetails.FromMuxedID) + tt.Equal(destination.Address(), opDetails.ToMuxed) + tt.Equal(uint64(destination.Med25519.Id), opDetails.ToMuxedID) + + // check the effect details + effectsResp, err := itest.Client().Effects(horizonclient.EffectRequest{ + ForTransaction: txResp.Hash, + }) + tt.NoError(err) + records := effectsResp.Embedded.Records + + credited := records[0].(effects.AccountCredited) + tt.Equal(destination.Address(), credited.AccountMuxed) + tt.Equal(uint64(destination.Med25519.Id), credited.AccountMuxedID) + + debited := records[1].(effects.AccountDebited) + tt.Equal(source.Address(), debited.AccountMuxed) + tt.Equal(uint64(source.Med25519.Id), debited.AccountMuxedID) +} diff --git a/services/horizon/internal/resourceadapter/effects.go b/services/horizon/internal/resourceadapter/effects.go index 7789372f09..e73800fb46 100644 --- a/services/horizon/internal/resourceadapter/effects.go +++ b/services/horizon/internal/resourceadapter/effects.go @@ -8,6 +8,7 @@ import ( horizonContext "github.com/stellar/go/services/horizon/internal/context" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/support/render/hal" + "github.com/stellar/go/xdr" ) var EffectTypeNames = map[history.EffectType]string{ @@ -59,11 +60,6 @@ var EffectTypeNames = map[history.EffectType]string{ history.EffectClaimableBalanceClawedBack: "claimable_balance_clawed_back", } -type muxedAccount struct { - AccountMuxed string `json:"account_muxed"` - AccountMuxedID uint64 `json:"account_muxed_id"` -} - // NewEffect creates a new effect resource from the provided database representation // of the effect. func NewEffect( @@ -73,12 +69,7 @@ func NewEffect( ) (result hal.Pageable, err error) { basev := effects.Base{} - var mAccount muxedAccount - // We abuse the details to inject muxed-account information without changing the DB schema - if err = row.UnmarshalDetails(&mAccount); err != nil { - return - } - PopulateBaseEffect(ctx, &basev, mAccount, row, ledger) + PopulateBaseEffect(ctx, &basev, row, ledger) switch row.Type { case history.EffectAccountCreated: @@ -281,12 +272,15 @@ func NewEffect( } // Populate loads this resource from `row` -func PopulateBaseEffect(ctx context.Context, this *effects.Base, account muxedAccount, row history.Effect, ledger history.Ledger) { +func PopulateBaseEffect(ctx context.Context, this *effects.Base, row history.Effect, ledger history.Ledger) { this.ID = row.ID() this.PT = row.PagingToken() this.Account = row.Account - this.AccountMuxed = account.AccountMuxed - this.AccountMuxedID = account.AccountMuxedID + if row.AccountMuxed.Valid { + this.AccountMuxed = row.AccountMuxed.String + muxedAccount := xdr.MustMuxedAddress(row.AccountMuxed.String) + this.AccountMuxedID = uint64(muxedAccount.Med25519.Id) + } populateEffectType(this, row) this.LedgerCloseTime = ledger.ClosedAt diff --git a/services/horizon/internal/resourceadapter/effects_test.go b/services/horizon/internal/resourceadapter/effects_test.go index 1793507c4d..f0ef2f4912 100644 --- a/services/horizon/internal/resourceadapter/effects_test.go +++ b/services/horizon/internal/resourceadapter/effects_test.go @@ -96,12 +96,12 @@ func TestNewEffect_EffectTrade_Muxed(t *testing.T) { details := `{ "seller": "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", "seller_muxed": "MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", - "seller_muxed_id": 1234, - "account_muxed": "MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ" + "seller_muxed_id": 1234 }` hEffect := history.Effect{ - Account: "GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", + Account: "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + AccountMuxed: null.StringFrom("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26"), HistoryOperationID: 1, Order: 1, Type: history.EffectTrade, @@ -124,9 +124,9 @@ func TestNewEffect_EffectTrade_Muxed(t *testing.T) { tt.NoError(json.Unmarshal(binary, &page)) tt.Len(page.Embedded.Records, 1) tt.Equal(effect, page.Embedded.Records[0].(effects.Trade)) - tt.Equal("GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ", effect.Account) - tt.Equal("MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ", effect.AccountMuxed) - tt.Equal(uint64(0), effect.AccountMuxedID) + tt.Equal("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", effect.Account) + tt.Equal("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", effect.AccountMuxed) + tt.Equal(uint64(1234), effect.AccountMuxedID) tt.Equal("GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", effect.Seller) tt.Equal("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26", effect.SellerMuxed) tt.Equal(uint64(1234), effect.SellerMuxedID) diff --git a/services/horizon/internal/resourceadapter/operations.go b/services/horizon/internal/resourceadapter/operations.go index ac25a81b7d..fb4b406fb0 100644 --- a/services/horizon/internal/resourceadapter/operations.go +++ b/services/horizon/internal/resourceadapter/operations.go @@ -12,11 +12,6 @@ import ( "github.com/stellar/go/xdr" ) -type sourceMuxedAccount struct { - SourceAccountMuxed string `json:"source_account_muxed"` - SourceAccountMuxedID uint64 `json:"source_account_muxed_id"` -} - // NewOperation creates a new operation resource, finding the appropriate type to use // based upon the row's type. func NewOperation( @@ -28,14 +23,7 @@ func NewOperation( ) (result hal.Pageable, err error) { base := operations.Base{} - var sourceMuxed sourceMuxedAccount - // We abuse the details to inject muxed-account information without changing the DB schema - if err = operationRow.UnmarshalDetails(&sourceMuxed); err != nil { - return - } - err = PopulateBaseOperation( - ctx, &base, sourceMuxed, operationRow, transactionHash, transactionRow, ledger, - ) + err = PopulateBaseOperation(ctx, &base, operationRow, transactionHash, transactionRow, ledger) if err != nil { return } @@ -158,13 +146,16 @@ func NewOperation( } // Populate fills out this resource using `row` as the source. -func PopulateBaseOperation(ctx context.Context, dest *operations.Base, muxed sourceMuxedAccount, operationRow history.Operation, transactionHash string, transactionRow *history.Transaction, ledger history.Ledger) error { +func PopulateBaseOperation(ctx context.Context, dest *operations.Base, operationRow history.Operation, transactionHash string, transactionRow *history.Transaction, ledger history.Ledger) error { dest.ID = fmt.Sprintf("%d", operationRow.ID) dest.PT = operationRow.PagingToken() dest.TransactionSuccessful = operationRow.TransactionSuccessful dest.SourceAccount = operationRow.SourceAccount - dest.SourceAccountMuxed = muxed.SourceAccountMuxed - dest.SourceAccountMuxedID = muxed.SourceAccountMuxedID + if operationRow.SourceAccountMuxed.Valid { + dest.SourceAccountMuxed = operationRow.SourceAccountMuxed.String + muxedAccount := xdr.MustMuxedAddress(dest.SourceAccountMuxed) + dest.SourceAccountMuxedID = uint64(muxedAccount.Med25519.Id) + } populateOperationType(dest, operationRow) dest.LedgerCloseTime = ledger.ClosedAt dest.TransactionHash = transactionHash diff --git a/services/horizon/internal/resourceadapter/operations_test.go b/services/horizon/internal/resourceadapter/operations_test.go index 594a13a54d..0cac1957dc 100644 --- a/services/horizon/internal/resourceadapter/operations_test.go +++ b/services/horizon/internal/resourceadapter/operations_test.go @@ -51,7 +51,7 @@ func TestPopulateOperation_Successful(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, row, "", nil, ledger), + PopulateBaseOperation(ctx, &dest, row, "", nil, ledger), ) assert.True(t, dest.TransactionSuccessful) assert.Nil(t, dest.Transaction) @@ -61,7 +61,7 @@ func TestPopulateOperation_Successful(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, row, "", nil, ledger), + PopulateBaseOperation(ctx, &dest, row, "", nil, ledger), ) assert.False(t, dest.TransactionSuccessful) assert.Nil(t, dest.Transaction) @@ -90,7 +90,7 @@ func TestPopulateOperation_WithTransaction(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, &transactionRow, ledger), + PopulateBaseOperation(ctx, &dest, operationsRow, transactionRow.TransactionHash, &transactionRow, ledger), ) assert.True(t, dest.TransactionSuccessful) assert.True(t, dest.Transaction.Successful) @@ -339,19 +339,19 @@ func TestFeeBumpOperation(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, nil, history.Ledger{}), + PopulateBaseOperation(ctx, &dest, operationsRow, transactionRow.TransactionHash, nil, history.Ledger{}), ) assert.Equal(t, transactionRow.TransactionHash, dest.TransactionHash) assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.InnerTransactionHash.String, nil, history.Ledger{}), + PopulateBaseOperation(ctx, &dest, operationsRow, transactionRow.InnerTransactionHash.String, nil, history.Ledger{}), ) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.TransactionHash) assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.TransactionHash, &transactionRow, history.Ledger{}), + PopulateBaseOperation(ctx, &dest, operationsRow, transactionRow.TransactionHash, &transactionRow, history.Ledger{}), ) assert.Equal(t, transactionRow.TransactionHash, dest.TransactionHash) @@ -370,7 +370,7 @@ func TestFeeBumpOperation(t *testing.T) { assert.NoError( t, - PopulateBaseOperation(ctx, &dest, sourceMuxedAccount{}, operationsRow, transactionRow.InnerTransactionHash.String, &transactionRow, history.Ledger{}), + PopulateBaseOperation(ctx, &dest, operationsRow, transactionRow.InnerTransactionHash.String, &transactionRow, history.Ledger{}), ) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.TransactionHash) assert.Equal(t, transactionRow.InnerTransactionHash.String, dest.Transaction.Hash) diff --git a/services/horizon/internal/resourceadapter/transaction.go b/services/horizon/internal/resourceadapter/transaction.go index aa6f2ee4e6..ec5b8cc01c 100644 --- a/services/horizon/internal/resourceadapter/transaction.go +++ b/services/horizon/internal/resourceadapter/transaction.go @@ -30,6 +30,11 @@ func PopulateTransaction( dest.Ledger = row.LedgerSequence dest.LedgerCloseTime = row.LedgerCloseTime dest.Account = row.Account + if row.AccountMuxed.Valid { + dest.AccountMuxed = row.AccountMuxed.String + muxedAccount := xdr.MustMuxedAddress(dest.AccountMuxed) + dest.AccountMuxedID = uint64(muxedAccount.Med25519.Id) + } dest.AccountSequence = row.AccountSequence dest.FeeCharged = row.FeeCharged @@ -56,6 +61,11 @@ func PopulateTransaction( if row.InnerTransactionHash.Valid { dest.FeeAccount = row.FeeAccount.String + if row.FeeAccountMuxed.Valid { + dest.FeeAccountMuxed = row.FeeAccountMuxed.String + muxedAccount := xdr.MustMuxedAddress(dest.FeeAccountMuxed) + dest.FeeAccountMuxedID = uint64(muxedAccount.Med25519.Id) + } dest.MaxFee = row.NewMaxFee.Int64 dest.FeeBumpTransaction = &protocol.FeeBumpTransaction{ Hash: row.TransactionHash, @@ -70,7 +80,9 @@ func PopulateTransaction( dest.Signatures = dest.InnerTransaction.Signatures } } else { - dest.FeeAccount = row.Account + dest.FeeAccount = dest.Account + dest.FeeAccountMuxed = dest.AccountMuxed + dest.FeeAccountMuxedID = dest.AccountMuxedID dest.MaxFee = row.MaxFee } diff --git a/services/horizon/internal/resourceadapter/transaction_test.go b/services/horizon/internal/resourceadapter/transaction_test.go index 7d23a284cb..b522858240 100644 --- a/services/horizon/internal/resourceadapter/transaction_test.go +++ b/services/horizon/internal/resourceadapter/transaction_test.go @@ -2,9 +2,10 @@ package resourceadapter import ( "encoding/base64" + "testing" + "github.com/guregu/null" "github.com/stellar/go/xdr" - "testing" . "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/services/horizon/internal/db2/history" @@ -158,8 +159,10 @@ func TestFeeBumpTransaction(t *testing.T) { MaxFee: 123, FeeCharged: 100, TransactionHash: "cebb875a00ff6e1383aef0fd251a76f22c1f9ab2a2dffcb077855736ade2659a", - FeeAccount: null.StringFrom("GCXKG6RN4ONIEPCMNFB732A436Z5PNDSRLGWK7GBLCMQLIFO4S7EYWVU"), - Account: "GBRPYHIL2CI3FNQ4BXLFMNDLFJUNPU2HY3ZMFSHONUCEOASW7QC7OX2H", + FeeAccount: null.StringFrom("GA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJVSGZ"), + FeeAccountMuxed: null.StringFrom("MA7QYNF7SOWQ3GLR2BGMZEHXAVIRZA4KVWLTJJFC7MGXUA74P7UJUAAAAAAAAAAAACJUQ"), + Account: "GAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSTVY", + AccountMuxed: null.StringFrom("MAQAA5L65LSYH7CQ3VTJ7F3HHLGCL3DSLAR2Y47263D56MNNGHSQSAAAAAAAAAAE2LP26"), NewMaxFee: null.IntFrom(10000), InnerTransactionHash: null.StringFrom("2374e99349b9ef7dba9a5db3339b78fda8f34777b1af33ba468ad5c0df946d4d"), Signatures: []string{"a", "b", "c"}, @@ -171,7 +174,11 @@ func TestFeeBumpTransaction(t *testing.T) { assert.Equal(t, row.TransactionHash, dest.Hash) assert.Equal(t, row.TransactionHash, dest.ID) assert.Equal(t, row.FeeAccount.String, dest.FeeAccount) + assert.Equal(t, row.FeeAccountMuxed.String, dest.FeeAccountMuxed) + assert.Equal(t, uint64(0), dest.FeeAccountMuxedID) assert.Equal(t, row.Account, dest.Account) + assert.Equal(t, row.AccountMuxed.String, dest.AccountMuxed) + assert.Equal(t, uint64(1234), dest.AccountMuxedID) assert.Equal(t, row.FeeCharged, dest.FeeCharged) assert.Equal(t, row.NewMaxFee.Int64, dest.MaxFee) assert.Equal(t, []string{"a", "b", "c"}, dest.Signatures) @@ -186,7 +193,11 @@ func TestFeeBumpTransaction(t *testing.T) { assert.Equal(t, row.InnerTransactionHash.String, dest.Hash) assert.Equal(t, row.InnerTransactionHash.String, dest.ID) assert.Equal(t, row.FeeAccount.String, dest.FeeAccount) + assert.Equal(t, row.FeeAccountMuxed.String, dest.FeeAccountMuxed) + assert.Equal(t, uint64(0), dest.FeeAccountMuxedID) assert.Equal(t, row.Account, dest.Account) + assert.Equal(t, row.AccountMuxed.String, dest.AccountMuxed) + assert.Equal(t, uint64(1234), dest.AccountMuxedID) assert.Equal(t, row.FeeCharged, dest.FeeCharged) assert.Equal(t, row.NewMaxFee.Int64, dest.MaxFee) assert.Equal(t, []string{"d", "e", "f"}, dest.Signatures) diff --git a/services/horizon/internal/test/integration/integration.go b/services/horizon/internal/test/integration/integration.go index 015c3dc442..fb2ea836ca 100644 --- a/services/horizon/internal/test/integration/integration.go +++ b/services/horizon/internal/test/integration/integration.go @@ -526,6 +526,7 @@ func (i *Test) CreateSignedTransaction( BaseFee: txnbuild.MinBaseFee, Timebounds: txnbuild.NewInfiniteTimeout(), IncrementSequenceNum: true, + EnableMuxedAccounts: true, } tx, err := txnbuild.NewTransaction(txParams) diff --git a/services/horizon/internal/test/scenarios/account_merge-horizon.sql b/services/horizon/internal/test/scenarios/account_merge-horizon.sql index 3d999bbcd4..232f3221e2 100644 --- a/services/horizon/internal/test/scenarios/account_merge-horizon.sql +++ b/services/horizon/internal/test/scenarios/account_merge-horizon.sql @@ -951,6 +951,11 @@ ALTER TABLE ONLY history_trades ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); +-- added manually +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; + -- -- PostgreSQL database dump complete -- diff --git a/services/horizon/internal/test/scenarios/base-horizon.sql b/services/horizon/internal/test/scenarios/base-horizon.sql index b4e02eec20..d8eb87b34e 100644 --- a/services/horizon/internal/test/scenarios/base-horizon.sql +++ b/services/horizon/internal/test/scenarios/base-horizon.sql @@ -713,6 +713,7 @@ INSERT INTO gorp_migrations VALUES ('35_drop_participant_id.sql', '2019-11-30 14 INSERT INTO gorp_migrations VALUES ('37_add_tx_set_operation_count_to_ledgers.sql', '2019-11-30 12:19:49.163728+01'); INSERT INTO gorp_migrations VALUES ('41_add_sponsor_to_state_tables.sql', '2019-11-30 13:19:49.163718+01'); INSERT INTO gorp_migrations VALUES ('45_add_claimable_balances_history.sql', '2019-11-30 14:19:49.163718+01'); +INSERT INTO gorp_migrations VALUES ('46_add_muxed_accounts.sql', '2019-12-30 14:19:49.163718+01'); -- @@ -1357,11 +1358,6 @@ ALTER TABLE ONLY history_trades ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); --- --- PostgreSQL database dump complete --- - - -- needed for migrations to work ALTER TABLE accounts ADD sponsor TEXT; CREATE INDEX accounts_by_sponsor ON accounts USING BTREE(sponsor); @@ -1390,3 +1386,12 @@ DROP INDEX index_history_transactions_on_id; DROP INDEX index_history_ledgers_on_id; DROP INDEX asset_by_code; + +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; + + +-- +-- PostgreSQL database dump complete +-- diff --git a/services/horizon/internal/test/scenarios/bindata.go b/services/horizon/internal/test/scenarios/bindata.go index f56e041c07..7ad557e10e 100644 --- a/services/horizon/internal/test/scenarios/bindata.go +++ b/services/horizon/internal/test/scenarios/bindata.go @@ -1,15 +1,15 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // account_merge-core.sql (26.849kB) -// account_merge-horizon.sql (36.385kB) +// account_merge-horizon.sql (36.651kB) // base-core.sql (29.682kB) -// base-horizon.sql (52.175kB) +// base-horizon.sql (52.522kB) // failed_transactions-core.sql (38.723kB) -// failed_transactions-horizon.sql (54.67kB) +// failed_transactions-horizon.sql (54.917kB) // ingest_asset_stats-core.sql (61.38kB) // ingest_asset_stats-horizon.sql (87.473kB) // kahuna-core.sql (232.639kB) -// kahuna-horizon.sql (301.496kB) +// kahuna-horizon.sql (301.761kB) // offer_ids-core.sql (61.677kB) // offer_ids-horizon.sql (85.572kB) // operation_fee_stats_1-core.sql (48.276kB) @@ -19,11 +19,11 @@ // operation_fee_stats_3-core.sql (45.051kB) // operation_fee_stats_3-horizon.sql (58.503kB) // pathed_payment-core.sql (52.308kB) -// pathed_payment-horizon.sql (76.08kB) +// pathed_payment-horizon.sql (76.327kB) // paths_strict_send-core.sql (70.821kB) -// paths_strict_send-horizon.sql (92.703kB) +// paths_strict_send-horizon.sql (92.968kB) // trades-core.sql (64.752kB) -// trades-horizon.sql (85.918kB) +// trades-horizon.sql (86.165kB) package scenarios @@ -112,7 +112,7 @@ func account_mergeCoreSql() (*asset, error) { return a, nil } -var _account_mergeHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5d\x79\x6f\xe2\x48\xd3\xff\x7f\x3e\x85\x35\x5a\x29\x33\x4a\x66\xe2\xfb\xc8\x3c\xb3\x92\x01\x13\x08\x60\xee\x40\xb2\x5a\x59\x3e\xda\xc4\x89\xb1\x89\x6d\x12\xc8\xea\xf9\xee\xaf\x7c\x81\x6d\x7c\x02\x33\xfb\xbc\x28\x8a\x00\x57\x57\xfd\xaa\xba\xba\xab\xab\xbb\xe9\xfe\xf6\xed\xd3\xb7\x6f\xd0\xc0\xb4\x9d\x85\x05\xc6\xc3\x2e\xa4\x88\x8e\x28\x89\x36\x80\x94\xf5\x72\xf5\xe9\xdb\xb7\x4f\xee\xf3\xc6\x7a\xb9\x02\x0a\xa4\x5a\xe6\x72\x4f\xf0\x06\x2c\x5b\x33\x0d\x88\xf9\x4e\x7e\x47\x22\x54\xd2\x16\x5a\x2d\x04\xb7\x78\x82\xe4\xd3\x98\x9b\x40\xb6\x23\x3a\x60\x09\x0c\x47\x70\xb4\x25\x30\xd7\x0e\xf4\x13\x82\x7f\x78\x8f\x74\x53\x7e\x39\xfc\x56\xd6\x35\x97\x1a\x18\xb2\xa9\x68\xc6\x02\xfa\x09\x5d\x4c\x27\x4d\xfa\xe2\x47\xc8\xce\x50\x44\x4b\x11\x64\xd3\x50\x4d\x6b\xa9\x19\x0b\xc1\x76\x2c\xcd\x58\xd8\xd0\x4f\xc8\x34\x02\x1e\x4f\x40\x7e\x11\xd4\xb5\x21\x3b\x9a\x69\x08\x92\xa9\x68\xc0\x7d\xae\x8a\xba\x0d\x62\x62\x96\x9a\x21\x2c\x81\x6d\x8b\x0b\x8f\xe0\x5d\xb4\x0c\xcd\x58\xfc\x08\xb0\x03\xd1\x92\x9f\x84\x95\xe8\x3c\x41\x3f\xa1\xd5\x5a\xd2\x35\xf9\xca\x55\x56\x16\x1d\x51\x37\x5d\x32\xb6\x3b\xe1\x46\xd0\x84\xad\x75\x39\xa8\xdd\x84\xb8\x79\x7b\x3c\x19\x43\x7d\xbe\xfb\x10\xd0\x7f\x7f\xd2\x6c\xc7\xb4\xb6\x82\x63\x89\x0a\xb0\xa1\xc6\xa8\x3f\x80\xea\x7d\x7e\x3c\x19\xb1\x6d\x7e\x12\x29\x14\x27\x14\x64\x73\x6d\x38\xc0\x12\x44\xdb\x06\x8e\xa0\x29\x82\xfa\x02\xb6\x3f\x7e\x87\x40\xd9\x7b\xf7\x3b\x44\xba\x7e\xf5\xfb\x14\xf4\xa5\x55\xd7\xce\x07\xe8\x3a\x72\x9e\xb0\x08\xd5\x9e\xb9\x47\xde\xe6\x1b\xdc\x3c\x42\x19\xb0\xf5\x50\x09\x40\x55\x81\xec\xd8\x82\xb4\x15\x4c\x4b\x01\x96\x20\x99\xe6\x4b\x7e\x41\xcd\x50\xc0\x46\x88\x28\x67\xd8\xa2\xe7\xe8\xb6\x60\x1a\x82\xa6\x54\x29\x6d\xae\x80\x25\xee\xca\x3a\xdb\x15\x38\xa1\xf4\x1e\xc9\x49\x28\xaa\x95\xd5\x81\xb2\x00\x96\x57\xd0\x06\xaf\x6b\x60\xc8\x95\x54\x88\x14\x5f\x59\xe0\x4d\x33\xd7\x76\xf0\x9d\xf0\x24\xda\x4f\x47\xb2\x3a\x9d\x83\xb6\x5c\x99\x96\xdb\x1c\x83\x3e\xf5\x58\x36\xc7\xda\x52\xd6\x4d\x1b\x28\x82\xe8\x54\x29\x1f\x3a\xf3\x11\xae\x14\xb4\xcb\x23\x40\x47\x4b\x8a\x8a\x62\x01\xdb\xce\x2f\xfe\xe4\x58\x8a\x17\x77\x04\xdd\x34\x5f\xd6\xab\x12\xd4\xab\x22\x48\x3e\x95\xa8\x59\x15\x19\x87\x9d\x6e\xe9\x02\x6e\x3f\xa1\xaa\xc0\x2a\x47\x1a\xb2\x3f\xa2\x48\x60\xd6\x72\x85\xbc\xae\xb5\x82\x90\x68\x57\x5c\x54\x62\xe5\x16\x78\x72\x0a\x6b\xc0\x8e\x75\x40\xd2\xb6\xd0\x8d\x9e\x76\x2d\xbd\x0c\xb1\xe9\xe3\x30\x0b\x09\x35\xdb\x11\x9c\x8d\xb0\x2a\x66\xe9\x52\x9a\xab\xb2\x94\xa0\x2c\x59\x18\x4a\xf2\x89\xa5\xb0\xb9\x17\x92\x15\xf7\x62\xd2\xb6\x5c\x65\xfa\x31\xd2\xb5\xb6\x6d\xaf\x8b\x24\xef\x88\x65\x53\x01\x15\xc7\x05\x3b\x37\x58\x89\x96\xa3\xc9\xda\x4a\x34\x72\x83\x77\x51\x51\x61\x55\x71\x6c\xb2\x8b\x68\x55\x11\xa4\x17\xac\x2c\xdf\x33\x5e\x19\x79\x3e\xe1\x2f\xe7\xef\x57\xa6\x5b\x93\xc1\x5b\x37\x3e\x84\x43\x3f\xcf\x19\x84\x92\x08\x16\xa6\xb5\x12\x96\xda\x22\x18\x30\xe4\x40\x48\x50\x96\xd6\xb1\xfa\x78\x2f\x8f\x73\x59\xe7\xf4\x4b\xd7\xfb\xdd\x69\x8f\x87\x34\xc5\x97\xdc\xe0\x9a\xec\xb4\x3b\x29\xc9\x3b\xc3\xe9\xce\xc0\x39\xa8\xee\x7c\x4e\xde\xa7\xf2\xea\x87\x51\x7a\xcc\x0d\xa7\x1c\x5f\x3f\xc2\x66\xee\x38\xdb\x06\xaf\x95\x25\xc7\x98\x94\x2e\xad\x80\x92\xb4\xfb\xd1\x6c\x69\x0d\x33\x5a\x7d\x15\xfd\xd2\x59\x94\x2b\x1b\x8c\xfb\xca\x11\x07\x83\xbc\xd2\xba\x05\x3d\x40\x15\x5d\xfc\x22\x25\x69\x83\xe1\x5f\x79\x3c\xe1\x78\xb1\x0c\xa2\x44\x1f\x92\x4f\x1c\xe9\x12\x02\x42\xf6\xf6\x76\xc4\xdd\xb2\x93\x14\xe2\xa5\xe6\x66\x1c\x9a\x0c\xbe\x18\xeb\x25\xb0\x34\xf9\xaf\xbf\xbf\x96\x28\x25\x6e\x8e\x28\xa5\x8b\xb6\xf3\x45\x34\xb6\x40\xf7\xa6\x62\x4a\x94\x50\x35\x2b\xb5\x48\x73\xca\xd7\x27\xed\x3e\x9f\xa3\x8f\x20\x2e\x16\x7b\x74\x57\xd0\x01\xd0\x1c\x1e\xa1\x76\x27\xf0\x70\x75\xf5\x8a\xef\xc1\x5f\x41\x55\x14\xf1\x54\x2f\xc1\x81\x9b\x4f\x38\x7e\x9c\x60\xa1\xaf\x16\xf6\xab\x1e\xfa\x62\xbd\xc5\xf5\xd8\x03\x09\x3f\x3e\xf9\xb3\x70\xbc\xb8\x04\x37\xe1\x77\xd0\x64\xbb\x02\x37\x41\x91\x1f\xd0\x58\x7e\x02\x4b\xf1\x06\xfa\xf6\x03\xea\xbf\x1b\xc0\xba\x81\xbe\x79\x93\x73\xf5\x11\xe7\xd6\x57\xc0\x39\xe4\xf7\x29\xc6\x31\xfe\x30\x60\x5c\xef\xf7\x7a\x1c\x3f\xc9\xe1\xec\x13\x40\x7d\x3e\xce\x00\x6a\x8f\xa1\x8b\x70\xda\x2d\xfc\xce\xf6\x98\x5c\x24\x25\x87\xea\x07\x32\x77\x16\x2a\xd4\x27\x66\x4b\xbe\x3f\x49\xd8\x13\x9a\xb5\x27\xad\x1d\xac\xe8\xfc\x5b\x4c\xfc\x9e\x4b\x02\x48\x15\xe5\x0f\x98\x78\x06\x18\x74\xaf\x57\x8b\xf1\xb0\x0b\xad\x2c\x53\x06\xca\xda\x12\x75\x48\x17\x8d\xc5\x5a\x5c\x00\xcf\x0c\x25\xe7\x0b\xa3\x70\x8b\x1d\x2d\x80\x1f\xfa\xea\x1e\x7f\x58\xb7\x69\xb6\xdc\x79\x76\x21\x7f\x68\xc4\x4d\xa6\x23\x7e\x1c\xf9\xee\x13\x04\x41\x50\x97\xe5\x6f\xa7\xec\x2d\x07\x79\xda\xf7\x7a\x53\xbf\xbf\x1b\x4f\x46\xed\xfa\xc4\xa3\x60\xc7\xd0\x1f\xc2\x1f\xd0\x98\xeb\x72\xf5\x09\xf4\x07\xe2\x7e\x4a\xd6\x46\x61\x43\x3c\x4d\xbb\x22\xf6\x67\x53\x0e\x4d\x53\xae\x4c\x4f\x75\x9a\x7e\x25\x24\xec\x54\xdc\x7d\x75\x94\x86\x5f\x3e\x41\x50\x9d\x1d\x73\xd0\xac\xc5\xf1\xd0\x1f\xc8\x5f\xc8\xdf\xd7\x7f\x20\x7f\xa1\x7f\xff\xf9\x07\xea\xbd\x47\xff\x42\xff\x86\x26\xfe\x43\x88\xeb\x8e\x39\xd7\x28\x1c\xdf\xf8\x9a\x6a\x99\x12\x71\xe0\x44\xcb\x14\x4b\xf8\xd5\x96\xf9\xcf\x31\x96\x39\x8c\xa9\x81\x1d\x76\x71\xb8\x9c\x21\xf6\x61\xfb\x80\xa3\x87\x18\x82\xc6\xae\xad\xa0\x9f\xfb\x1e\xe0\xca\xff\x7a\xf2\x30\xe0\xa0\x9f\xd1\x16\xf1\x35\xad\xd5\x9e\x15\x63\x92\x61\x02\x62\xd8\x8c\xcb\x23\x4c\x1d\x02\x9d\x8a\x32\x8d\x69\x02\x69\xac\x41\xc6\xe1\xee\xbd\xec\x10\x6d\xda\x30\xef\x64\xb4\x29\x4c\x93\x68\xa3\x8d\x24\x17\xad\x1b\xb9\x14\xa0\x8a\x6b\xdd\x11\x1c\x51\xd2\x81\xbd\x12\x65\x00\xfd\x84\x2e\x2e\x7e\xc4\x9f\xbe\x6b\xce\x93\x60\x6a\x4a\x64\x29\x2d\xa6\x6b\x74\xfc\x1b\xa8\xe8\x35\xb0\x72\xea\xf9\x6d\x31\x9a\x7c\xfb\x1a\x69\x0a\x24\x69\x0b\xcd\x70\xbc\x81\x01\x3f\xed\x76\x7d\x75\xc4\xa5\x3b\x8c\x87\xe4\x27\xd1\x12\x65\x07\x58\xd0\x9b\x68\x6d\x35\x63\x91\x20\x33\xd6\xcb\xdd\x90\x1f\xd2\x0c\x07\x2c\x80\x95\x20\x51\x75\x71\x61\x43\xf6\x52\xd4\xf5\x43\x31\x8e\xb9\xd4\x0f\x85\x7c\x41\x09\xe2\xeb\x8e\xf2\xb0\xda\x93\x79\xc3\xb1\xe6\x48\xce\x76\xec\x4c\xe2\x80\xcd\x81\x41\x56\x2b\x5d\xf3\xe6\xec\x21\x47\x5b\x02\xdb\x11\x97\x2b\xc8\xad\x33\xef\x23\xf4\x61\x1a\xe0\x10\x68\x56\x56\x14\x8e\x47\x83\x74\xaa\x1c\xe6\x5d\xf2\x95\xc1\x35\x70\x43\x76\x34\xf1\x47\x74\x88\xf7\x45\x9b\xaf\x8f\x38\x6f\xf8\x55\x7b\x08\xbe\xe2\xfb\x50\xaf\xcd\xdf\xb3\xdd\x29\xb7\xfb\xcc\xce\xf7\x9f\xeb\x6c\xbd\xc5\x41\x48\x91\x32\x47\x9b\x3d\xc9\xe8\xc0\x15\x83\x49\x0f\xc8\x00\x1b\xe7\x4d\xd4\xbf\x5c\x64\x68\x7c\x71\x73\x63\x81\x85\xac\x8b\xb6\xfd\x35\x59\x5d\xfe\x5a\x45\x8a\x6f\x91\xf8\xd7\x9c\x8a\xf2\x73\xe3\x93\x35\xf3\x67\x74\x76\x7a\xa5\xb7\x8c\xfd\x5c\x5d\x3a\xcc\x54\x72\xd9\x54\xd2\xc8\x11\x34\x9d\xdc\x9f\xfe\x4b\x29\x40\x90\x79\x2d\x2c\x7d\x7a\xe1\x4c\x6e\x1b\xe5\xf9\xdb\x9c\x36\x4f\x11\xa8\x3f\xe3\xb9\x06\x54\x7b\x28\xd0\xc8\x9f\xa1\xcb\x57\x68\xc7\x2b\xf1\xf8\xbb\xa6\x64\x61\x0b\xe7\x7c\x4e\xf5\xba\x80\x4f\xe0\x76\x89\x36\x23\x64\xf5\xf4\x87\x53\x5c\x59\x94\x9f\xbd\x85\x8f\xcf\x19\xde\xec\xf9\x71\xfa\x23\x05\x38\xa2\xa6\xdb\xd0\xb3\x6d\x1a\x52\xb6\xb3\x85\x13\x65\xa7\xda\x21\xe0\x13\xd8\x21\x5c\xb7\xce\xc0\x16\x59\x4c\x2e\xd5\x0a\xd3\xd6\xb1\xd3\x0b\x06\x66\x89\xcc\x8c\x7a\x15\xb1\xc3\x11\xf6\x72\x70\x42\xc2\xbe\x22\xca\xd1\xef\x16\x93\x13\x81\xc9\x5c\x3b\xfb\xd8\x94\x2c\x63\x01\xd1\x29\x2c\xe4\xd3\xae\x57\x4a\x69\xda\x9d\xeb\x04\x1f\x13\xeb\xec\x07\xba\x20\x07\xe3\x01\x47\xd4\x05\xd9\xd4\x0c\x3b\xdd\x07\x55\x00\x84\x95\x69\xea\xe9\x4f\xbd\x95\x4f\x15\x64\xd5\xb5\xf7\xd8\x02\x36\xb0\xde\xb2\x48\xdc\x71\xa8\xb3\x11\xbc\x61\x92\xf6\x91\x45\xb5\xb2\x4c\xc7\x94\x4d\x3d\x53\xaf\x64\x1d\x85\xce\x02\x44\x05\x58\xde\xf0\xc2\xff\xde\x5e\xcb\x32\xb0\x6d\x75\xad\x0b\x99\x8e\x12\x28\x2e\x6a\x3a\x50\xb2\xa9\xb2\x9b\x55\xc6\xdc\xf5\xa9\xad\x2c\x63\x3d\xa4\x20\xe6\x95\xef\x6d\x8a\xfb\xaf\xaa\x2a\x9f\x37\x8c\xe5\xca\xf8\x5d\x61\xad\x92\xa2\x27\x86\xb9\x5c\x59\x87\x61\x2f\x9d\x3c\x27\x0c\x46\x56\x76\xce\xe6\x9b\x45\x69\x4e\x7c\x57\x55\x46\x2a\xe4\x8e\xfc\x65\x5f\x15\x2f\x02\x9e\x18\x00\x83\x96\x6f\xae\x2d\x79\xb7\x4d\x23\x23\xf4\x84\xdd\xc9\xc5\xc5\xcd\x4d\x76\x2a\x96\xdd\x0e\x82\x85\xb5\x53\xcd\x19\xec\x05\xfc\x72\xd6\xf1\x42\xd0\x25\x1e\x13\xbd\xbc\xbd\x30\x99\x62\x13\x3b\x11\xf3\x88\x82\xcd\x91\x79\x24\x7e\x1e\x9c\x4a\x70\xb8\xa7\xb3\x80\x2e\x57\xdc\x8e\x2a\x47\xa2\x07\x49\xb3\x05\x1b\xe8\x3a\xb0\x20\xc9\x34\x75\x20\x1a\x61\x4c\xd2\x64\x20\x18\xb1\xf8\xeb\x7f\x17\x8f\xc9\xfb\xdd\x44\x42\x22\x5a\xc7\xf6\x33\x25\x1f\x46\x96\xe9\x53\x77\x7e\x7a\xa8\x05\x6f\x6f\x30\x54\x6f\x71\xf5\x0e\xf4\xe5\x4b\xd4\x82\x7f\x42\xf0\xd7\xaf\x45\xac\xd2\x8a\x87\x46\xfb\xcf\x81\x1d\x4b\xf0\x8b\xd9\x34\xc1\x3e\x61\x70\x0f\x60\x6e\x53\x4a\x5f\xe1\x3e\x43\xe3\x4a\xdf\xb3\x50\x32\x92\x96\xe9\xc2\x4e\x89\xa5\x45\xfb\x03\xce\x13\x4d\x0b\xa4\xfc\xae\x78\x5a\x51\xd9\x13\x23\x6a\x81\xb4\xc3\x98\x9a\x55\x20\x27\xaa\xc6\xf6\x84\x9c\xd1\x57\x43\xff\x8c\x42\x2a\x9d\x44\x05\x7d\x7f\x41\x6a\x56\x36\xf0\xe6\xc7\xd0\x54\xda\xbd\xe8\xd4\xf6\xe2\x66\x01\xd9\x69\x44\x56\x82\xf6\xaf\xa4\x58\xce\x46\x00\xc6\x1b\xd0\xcd\x15\x48\x9b\xb6\x74\x36\x6e\xc2\xb3\xd6\x9d\x8c\x87\x4b\xe0\x88\x19\x8f\xdc\x54\x2b\xeb\xb1\xad\x2d\x0c\xd1\x59\x5b\x20\x6d\x86\x8d\x21\xbf\xfe\xf5\xf7\x7e\xec\xf2\xcf\x7f\xd3\x46\x2f\x7f\xfd\x9d\xb4\x39\x58\x9a\x19\x93\x61\x7b\x5e\x86\x69\x80\xdc\xb1\xd0\x9e\xd7\x21\x9b\x40\x33\x6d\x09\x04\xc9\x5c\x1b\x8a\x37\x63\x4d\x5b\xa2\xb1\x00\xc9\x6c\x2c\x1e\x5a\x5d\x4b\xb8\xdc\x16\x40\x29\x4e\xb7\x82\xb9\x3f\x4d\x09\x5b\x5b\xb8\x85\xab\x4c\x17\xe1\x37\x37\x6f\xbf\x5c\xc1\xee\xb0\x31\x37\xc9\x99\x27\x8d\xce\x48\x45\x67\x49\xab\xe5\x11\xe7\x53\xa2\xe4\xe6\xb9\x5c\xa5\x72\xf3\x8f\x32\x4a\x66\x46\xda\xb3\xa9\x59\x7a\xff\x61\xae\xa2\x05\x61\x21\x5d\xd5\x86\xe8\x88\x90\x6a\x5a\x05\xab\x45\x50\x83\x9d\xb0\x05\xea\x65\xb0\xcc\x5b\x75\x29\xc3\xb6\xcd\x8f\xb9\xd1\x04\x6a\xf3\x93\xfe\xc1\xca\x8b\x17\xa0\xc7\xd0\x97\x0b\x44\xd0\x0c\xcd\xd1\x44\x5d\xf0\x77\xc1\x7c\xb7\x5f\xf5\x8b\x2b\xe8\x02\x85\x11\xe6\x1b\x4c\x7e\x83\x31\x08\xa1\x6f\x50\xfa\x06\xa7\xbe\xc3\x18\x8a\x33\xe4\x25\x8c\x5e\x7c\xfd\x51\x8e\x3b\x2a\xf8\xbf\x6e\x88\x59\x55\xda\x0a\x8e\xa9\x29\xf9\x92\x18\x92\xa0\xaa\x48\xc2\x84\xb5\x0d\x76\x51\x46\xd0\x8c\x83\x5f\x54\xe4\xca\xc3\x71\x18\xa7\xab\xc8\xc3\x05\x51\x51\x84\xe4\xbc\x54\xae\x0c\x02\x27\x30\xb4\x8a\x0c\x42\xf0\x63\x5a\x38\xba\xf6\xd6\x33\x73\x45\x90\x18\x8c\x56\x52\x83\x0c\x45\x04\x3d\x58\x09\x11\x34\x8e\x10\x55\x44\x50\xc2\xd2\x54\x34\x75\x5b\x5e\x0b\x1a\x21\xd1\x4a\x22\xe8\x98\x16\xc1\x36\xe6\x12\x72\x28\x9c\xc4\xaa\xc9\x71\x2b\x5d\x5c\x2c\x2c\xb0\x10\x1d\xd3\xca\xf7\x29\x06\x46\x60\xa6\x0a\x7b\xc6\x63\xef\xcf\x59\x0a\x1b\xc5\xca\xe7\x8e\x52\x48\xa5\xaa\x46\x60\x8f\x7d\x50\x0b\x5e\xa6\x9a\x2f\x80\x60\xa8\x4a\xd6\x41\x90\xa8\x80\x5d\xea\xe3\x76\x00\xf9\x82\x18\x92\xa9\xa6\x09\x1a\xab\xe8\x20\xd9\xf4\x7f\x38\x9b\x27\x09\x81\x29\x02\xaf\x54\x23\x08\xe6\xab\xb3\x4b\xd1\x73\x6b\x1c\x41\x50\x8a\xac\xa6\x09\x2e\xa8\xda\x26\xfc\x11\x81\xb9\xd4\x05\x55\x03\x7a\x6e\xd7\x88\x20\x04\x82\x54\xea\x84\x11\x22\x5c\x3b\x09\xe7\xb4\x37\x05\x6a\x90\x54\xb5\x6e\x1e\x21\x05\xcd\x58\x00\xdb\x11\x0e\x67\xcd\x0b\x44\x51\x0c\x5d\xad\x46\xa8\x58\xb8\xf6\x96\x27\xc4\xfc\x60\x82\xa0\x30\x8c\xe1\x81\x90\x8c\x58\x9b\xbb\xd6\x5e\x35\xd8\x1e\xac\xb7\x87\xe8\x91\x2b\xe8\xe2\xb6\x3e\xef\xdc\x92\x23\x1e\xef\xf3\x6d\x6e\x50\xef\xf1\xcd\x1a\x85\xa1\x2c\x8e\x91\x8f\xc4\x80\x6f\x8c\x47\xdd\xdb\x59\x87\xba\xad\x75\xeb\xbd\x61\xb7\xdd\xec\xe3\x63\x8a\x7b\x98\xdd\x4f\x93\x16\xca\x14\x82\xba\x42\x58\x62\x56\x1b\x3c\xb0\xc4\x03\x3e\x63\xb9\xd6\x7c\x36\x42\xa7\x9d\x3e\x3a\xed\xe3\xb5\xe9\x6d\x6b\x3a\xa4\x70\x6e\x3a\xe8\xf4\x79\x74\xd8\xba\xc7\x67\xa3\x56\xbf\x3d\xe2\x3b\x9d\xd6\x41\x35\x64\x0a\xc1\x5c\x21\xb5\xd1\xe0\xa1\xd5\xee\xa2\xf5\x36\xd6\xe4\x87\x78\x6d\xde\x6d\xf6\xf8\x46\xb7\x79\x37\xe5\x07\x53\xb4\xf5\x80\x3d\xf6\x9a\xe3\x56\x9f\x9f\xd6\xb9\x3e\x3b\x9e\x51\xc3\x3a\xd5\x9f\xa3\xad\x8b\x63\xb7\x6d\xb8\xa3\xb8\x82\x6a\x08\xb6\xba\xed\x77\xa9\x7e\xb7\x41\xfe\x96\x86\x2b\x08\xbb\x82\x1c\x6b\x0d\x4a\x38\xc7\xe1\x66\x85\x2a\xc3\xbb\x2a\x0b\xe4\x67\xd1\x34\x96\x94\x5c\x41\xc8\x95\xbf\xcf\xa9\x58\xd1\xb4\x05\xf2\x63\x1b\x41\xb8\x48\x1e\x69\x03\x08\x4a\xd3\x38\x03\x13\x0c\x4d\x78\xa8\x5c\x67\xfa\xe7\xb3\xdf\x8d\x7f\xbe\x81\x3e\x33\x0c\xf3\x9d\x71\x5f\x30\xfc\xf9\x0a\xfa\xbc\xdf\xb6\xe1\x3e\x34\x44\x47\x7b\x03\x9f\xff\x9b\xe5\xaa\x49\x79\x68\x42\x1e\xea\xfd\xfd\x3a\x79\x49\xfd\x30\x4f\x45\x37\x29\x2f\xcf\x80\x26\x68\x86\xc1\x68\x92\x66\xbc\xc2\xb0\x87\xd7\x76\xdc\x41\xb4\xb1\x10\x24\x51\x17\x0d\xd9\x03\x87\xc0\x30\xfc\x1d\xf6\x5f\xe5\x21\x62\x71\x09\xe8\x61\x0d\xc4\xf8\x9e\xc3\x24\x51\x79\xae\x45\x7c\x95\xde\x81\xb6\x78\x72\x05\x22\x57\xd0\x67\xdf\xa3\x84\x17\xb0\x75\x65\x1c\xdb\x4d\x56\x72\x0c\x0f\x15\x8e\x52\x81\x1f\xfe\x2a\x3b\x07\x12\x7e\xb9\x9d\x13\x1a\x95\xb3\xf3\x91\x91\xc2\x47\x55\xd0\x8f\xa4\x6d\x30\x39\xb6\x1f\x09\x37\x99\x44\x23\x10\xaa\xd0\x84\x8c\xe3\x24\x26\xa1\x22\xc9\xa0\x28\x05\x28\x85\xc2\x10\x4a\x55\x09\x02\xa5\x24\x40\x2a\x08\x46\x50\x34\x01\x70\x15\x96\x44\x95\x22\x09\x8a\x01\xb8\x8a\xaa\x8a\x82\x21\x92\x48\xb8\x23\x06\x98\x92\x45\x1c\xc8\x12\x8a\xd3\xa2\x8a\xaa\x18\xc9\xc8\xa8\x88\x89\x34\x43\x61\x24\xc0\x49\x20\xa2\x38\x8c\x11\x8a\x8a\x2b\x40\x42\x54\x06\x67\x14\x19\x43\x30\x85\x21\x54\x52\xa4\x64\x42\xf6\x3b\x56\x24\x31\xf6\x20\x6f\x30\xe2\x06\x45\x92\x43\x12\xff\x6b\xf4\x3b\x43\x53\x30\x42\x15\x3e\x0d\x3a\x12\x84\xa6\xe9\x2b\x08\x21\xdd\xfa\x3c\x78\x5d\x41\x98\xfb\x0f\x09\xfe\x85\x5f\x22\xbb\x37\x2e\x34\x96\x65\xd9\xfa\xbb\xda\x99\xd8\xf6\x8b\xf6\xd6\xfd\x10\xe5\xce\xf3\xeb\x9d\x8c\x12\xb7\xa4\x36\x6c\xcc\xd5\x09\xb0\x55\xfd\x0e\x6b\x70\x8c\xae\x8a\xc6\x46\x96\x08\x16\xc3\x5f\xdf\x5a\xf4\xe5\xed\xf6\x6d\x5d\x53\xf4\xb1\xdc\x03\xf6\xe2\xce\x5a\xf1\xa3\x77\x5b\x62\x5e\x99\x49\x8f\x45\x71\x59\x7b\x85\x5d\xd6\xec\x7c\x70\xdf\x1b\x0f\xd9\xdd\x4b\xc7\x54\xfe\x4d\x7d\x54\x1e\x6a\x9b\xc1\x6d\x9d\x26\x9f\x5f\x31\xa5\x4d\x74\x3a\xd3\xcd\xa3\x6c\xae\x50\x69\xfe\x71\xdd\x69\x3d\x50\xfd\xcd\xf5\xa8\x2f\xbf\xb2\xcb\xfe\xc8\x6c\x2f\x7b\xe8\xdd\x63\x8d\x78\x7d\x9d\x8e\x09\xfe\x85\x7e\x46\x3a\xe8\xe5\xd3\x04\xa3\x65\xa3\xdf\x9d\xf3\x60\x8d\xbd\xbb\x9c\x7b\x3c\xde\x15\x3f\x56\x68\x44\x18\xcb\xd9\x6c\xca\xeb\x91\x9d\x23\xf8\x90\x65\x1b\xf0\x5d\xda\xe3\xff\xe9\x97\xef\x54\x70\x46\xbb\x4f\x36\x05\xf4\x3c\x6e\x7c\x41\x62\x0a\x43\xab\x04\x46\x02\x40\xd2\x0a\x22\xa1\x94\x44\x48\x34\xa3\xa2\x98\xa8\x12\x18\x82\x48\x14\x41\x32\x22\x8a\xab\xa2\x8a\xe0\x30\x26\x2a\xb0\x44\xa0\x12\x89\x61\x12\x4c\x49\x80\x61\x2e\x76\xd1\xf5\xd0\xab\xe1\x74\x67\xc7\xbe\xc3\x30\x46\x31\x19\x4d\x21\xf2\xd4\x0f\x20\x38\xc1\xa0\x39\x2d\x01\x2d\xd9\x12\xd0\xc1\xe3\x33\xc2\xaf\x09\x13\x96\xee\xa8\x19\x6e\x6c\xfb\x6f\xd3\xcd\x2d\x76\xbf\x32\x5f\x2e\xdf\x9a\x6c\xdf\xa9\x23\x1d\xb4\x47\xd5\x28\xf2\x71\x0a\x9a\xb3\x27\xec\xb2\xfb\x80\x3d\x4c\x5a\x2f\x4f\x12\xe9\x5c\xce\xb5\x97\x09\x4e\xb3\x9d\xfb\xa9\xf5\x74\xd9\xe6\x75\xac\xf7\xc0\xf0\xbc\x33\xf5\x6a\xce\x6b\x09\xde\xbb\xf6\xee\x1f\xeb\x39\xab\xbd\xff\xfc\xce\x0e\x86\x2f\x7e\x4d\xbf\xcf\xf8\x47\xb5\x4d\xcc\xb6\xcd\xd9\x06\x5d\x52\x13\x93\x1f\xd6\x9f\x1e\x1e\x89\x8f\xd7\xa6\xf5\x6e\x2e\xd0\x67\xf8\x65\xfe\x3a\xe4\xbb\xac\xe5\xf0\xe8\xa4\x8f\x76\x9b\x2c\x33\x31\x6e\xdf\x9c\xf1\xfc\xe3\x7e\x3e\xb8\xb5\xb9\x0e\xff\xfc\x41\x76\x40\xef\xe9\xae\xcf\xea\xe2\x7c\xa6\xe0\x6f\x5e\x4b\x69\xa7\xb4\x94\x46\x3b\xcd\xdb\xfe\x9f\xb7\x14\xb4\x7c\x4b\x41\xce\xe3\xe5\xde\xc2\x87\x3b\x5c\x70\xc3\x2b\xc2\x50\xf0\x37\x18\xf9\x06\x23\x10\x0c\xdf\x78\x7f\x99\xde\x8c\x50\x08\x99\xfb\xd0\x8d\x18\x38\xca\xe0\x0c\x49\xa1\x0c\x99\xe3\xea\xe9\x8e\xee\x23\xfa\xb7\xeb\x24\xfb\x55\x9b\x77\x34\x7c\x7b\xbd\x1d\x77\x6a\x54\xc3\x68\x30\x2d\x14\xde\x3c\xd7\x2e\x6d\x78\xe1\xd8\xef\xed\xf7\x0f\x64\xae\x8c\x67\x0f\x62\xed\x4e\x6c\x2e\x5c\x7a\x2e\xc5\x87\xd3\x5f\xa1\x0f\xb3\x6c\xed\xe5\x37\x28\x72\xd6\xd7\x85\xef\x4b\xc5\xe3\xa9\x12\x3b\x0b\x8f\x1d\x5e\x65\x2c\x18\x65\x66\x6d\x19\x0d\xae\x80\xcd\x41\x32\x76\x1c\x9b\x44\x02\x83\x1d\xc7\x05\x4f\x24\x5a\xc7\x71\x21\x12\x83\xee\xe3\xb8\x90\x89\x54\xe1\x3c\x3b\x2d\xcf\x32\x8d\x90\xbf\x0c\x78\x05\x91\x65\xa7\x4f\x32\xf6\x1b\x9e\xec\xb1\x11\x2f\x8d\xb9\xe8\xee\x03\xee\x8d\xa6\x68\x2f\x15\xd2\x0c\xc7\x3c\x29\xef\x71\xb3\x34\x7f\x0a\xe9\xc4\x34\xf5\x17\xcc\x05\xa6\x98\x24\xea\xe1\xbb\xf7\x74\x24\xdd\x55\xd7\x86\x02\x2c\x4f\x97\x23\xe7\xf3\xce\x65\x92\x2b\xa8\x4c\xee\x7d\xe2\xc4\x63\x15\xb3\x05\x8d\x71\xf7\x1e\xff\xa5\x66\x3b\xc1\x21\x7f\xbd\xd9\x0a\x9a\x76\xca\xbe\xd7\x13\x16\xbe\x2b\x6d\x01\x3c\xb6\xfb\xc8\xdc\x3a\x90\x1a\xf2\xf0\xec\xf8\x50\xc8\x08\x4d\x30\xca\x0a\x7a\x85\x8c\xb0\x78\x13\xce\x0a\x35\x85\x7c\xf0\x44\x57\x70\x2c\x9f\x44\xdb\x38\x1a\x0f\x19\xe7\x93\x1d\xfc\xaa\xee\x16\x3c\x47\xf8\x2b\xda\x1c\x52\x21\x00\x66\x6e\x0d\x3c\x83\x0f\x47\x17\xdc\x31\x5c\x02\x0c\x4e\x91\xa8\xa2\xe0\x12\xa5\x32\xb4\x4a\xe2\xb8\x02\x50\x98\x42\x29\x4c\x45\x44\x04\x63\x54\x02\x13\x81\x2a\xa3\x22\x02\x80\x44\x22\x34\x4d\x22\x08\x2d\x8b\x14\x8d\x52\xea\xc5\x6e\xd2\xfa\xe8\xf8\x14\xc9\xd7\xb1\x30\x51\xc9\x9e\xec\x42\x11\x2c\x67\x2a\xcc\x7f\x1a\x6b\x41\x7e\x86\xd3\x21\x9f\x81\x86\x3d\x2f\xcd\x36\x3d\xb9\xd5\x1b\xd7\x60\x21\x63\xd4\x60\xee\xb4\x3a\x9d\x8f\xd9\x3d\xfd\x7e\xaf\x3d\xd6\xc4\xfa\x9a\xe8\x12\x3d\xd6\xcb\x10\xd8\x30\x01\xaf\x25\x06\xe0\x91\xcf\x5e\xda\xc1\xf6\xd1\xfa\x35\xdb\xc7\x89\x87\x5a\x03\x73\x5a\xf7\xcd\x3e\x32\xc2\x58\xb8\x07\x5e\x06\xf4\xdd\x88\x34\x78\x84\x65\xc0\x4c\x53\xb6\xed\x20\xeb\xf7\x5e\x22\xf5\xf2\xf6\xf2\xee\xb1\xeb\x5d\x37\xd6\x4d\x06\xb5\x9d\xa1\x09\x3f\x0f\x55\xc7\xe2\xd6\x6f\xa3\x91\x85\x36\x1f\x1c\x91\x5e\x5c\x37\x98\x99\xb4\x9c\x4d\xef\x3e\xb4\x29\xfd\x4c\x3d\x5e\x8f\x3b\xe8\xed\xd3\xf5\xb5\xb5\x00\xf0\x33\x3c\x1f\xd2\xdb\x17\x09\x6b\xd0\x5d\x83\xf9\x50\x57\xd6\xa0\x43\x4d\x2e\xa7\xdb\x0f\x76\xf8\xf3\xe7\x45\x34\xbb\xbb\x8d\x64\x45\xfb\xb7\x91\x0c\xff\x6e\x5a\xbf\xec\xcb\xfe\xfb\x48\xd9\xe1\x8e\xac\xe1\x7d\x7e\xdf\x97\xb0\x5e\x79\xb2\x0b\xfa\xe2\xe2\x79\xd3\x13\xa7\x03\x86\xac\x7d\xa8\x36\x03\x60\xd9\xb4\xf8\xc7\xf9\x47\x6d\x76\xf7\xd2\x34\x3b\xa1\x9e\x6c\xfd\x9e\x7d\x7b\x36\x92\x62\x0f\x5e\x5c\xd6\x83\xda\x99\xe5\x27\xeb\xb5\x94\x7c\xbf\x90\xe7\x22\xf5\xc8\x33\xea\xa1\x4b\xb3\xd4\xb3\xbe\xe0\x06\x00\x56\xa6\x53\xea\xbe\x25\x37\x86\x1b\x72\x78\xfd\xae\xb7\x5e\x65\x6c\xda\x40\x08\xf1\x0e\x6b\x6b\x88\x67\x4f\xd7\xd6\x41\x25\x2c\x72\x4c\x91\x99\xc8\x7a\x18\x1b\xc7\xcb\x1f\x9b\x4d\x1a\xc8\xc7\xcb\xef\x25\xe4\xd7\xd7\x26\x66\x3a\x38\xf1\x5a\x1f\x70\x9b\xd5\xf0\x1a\x33\x5b\xfc\xe5\x07\x42\x8d\xb6\x9a\x8d\xe8\x6a\xaf\xf9\xb0\x1c\xce\x16\xd6\x7a\x7c\x39\x61\xd9\xb8\xaf\x2d\xd8\x6c\x9b\x67\xca\x8f\xf8\x4f\x85\x76\xbd\xf3\xe9\x05\x9b\x52\x87\xc7\xe8\x70\xce\x3a\x3c\xd5\x86\x55\xe4\xfb\xed\xfb\x9f\x5f\xd5\xf1\x78\x03\x48\x6f\x33\x70\x38\xfb\xe5\xff\x77\x03\x9f\xd7\xc1\x17\xc7\xfe\x48\x84\x92\x50\x11\x45\x29\x19\x63\x64\x12\x17\x71\x5c\x95\x29\x51\x52\x70\x99\x21\x69\x84\xc1\x09\x52\x85\x31\x86\x61\x60\x52\x41\x50\x19\xa7\x48\x85\x82\x25\x1c\x46\x25\x55\x91\x50\x86\x54\x48\x11\xf3\x27\xfd\x90\x53\xc6\xb4\xfe\xaa\x4d\x76\x60\xf2\xa6\x9e\x19\x2c\x7b\xb6\xce\x7d\xba\x9f\x98\xf6\x47\x52\xbe\x2f\xde\x76\xe9\xd6\xf0\x6d\xf8\x22\x75\xd0\x16\x8b\xcd\xee\x9f\x47\x56\x67\xf9\x3c\x87\x61\xf5\x96\xb6\xbb\x6d\x6a\x09\x73\xa3\xf7\xbb\xd9\x35\x3b\xc7\xd8\x5d\x5c\xf2\x5e\x39\x71\xc9\x7f\x1d\xd1\x3f\x46\x67\xc3\x6a\xf7\x6f\xef\x4d\xc6\x7d\xc4\x35\x1c\xac\xf3\xbe\x14\x07\xeb\x81\xd2\x1c\x4f\x37\x0a\xdb\x04\x12\xd9\x1f\x02\x67\x3b\xec\xb4\x67\xe2\x87\x2e\x8d\x7b\xbd\xa7\x65\xab\xc3\x77\x1b\xb8\xfd\xfa\xc4\xbd\x4e\x1f\xe5\xe1\x00\xd6\x2f\xe7\xd7\xfd\xd5\xa5\x69\xcf\x96\x3c\x79\xd9\x9c\x3e\x48\xf6\x07\x45\x0c\xd1\xe7\x5b\xfc\xad\xd7\x2b\x11\x9f\x62\x4e\x1b\x8f\x49\x11\x9d\xfd\xb5\x1e\x36\xde\x9e\x6b\xda\x75\x0d\xee\xc2\x77\xb7\x5b\xe7\xe9\x9d\x47\xf4\x07\x58\xdc\xae\x4c\x84\xe1\x5b\x9b\xb7\x6e\x7d\xdb\x27\x9c\x1a\x27\xd7\x7d\x1d\xb1\x85\x63\xf5\x8d\x87\x6b\x1a\xdf\x97\xcf\x88\x51\xf9\xed\xf9\x04\xf9\xcd\xc9\xac\x66\x9f\x20\x9f\x65\xff\xbd\xfe\x2c\x32\x5e\xd8\xf7\xad\xb5\xe3\x6d\xd1\x37\x1e\x73\xd5\x2c\xb2\xc5\xa9\x75\xe1\xfa\xc2\xa5\x9c\xe0\x57\xc9\x16\xff\x50\xca\xd6\xbe\x5b\x3e\x53\xcf\xd8\x68\xaa\xf7\xe6\xc3\xda\x7c\x79\xf9\xfc\xd2\xb2\xe4\x97\xba\xd6\x5c\xda\xc4\x0c\x7e\x6e\xb4\x1f\x9f\xb6\xcf\xe3\xf7\xcb\x6e\xc7\x1c\x75\xf4\xdb\x39\xd7\x60\xee\x54\xfd\xfa\xe3\x55\x7d\xed\x36\x57\xcf\xe0\xed\xe9\xfe\xf6\x96\xea\x5d\x5e\x4e\x79\x73\xb3\xee\x7e\x34\xd8\x73\xf7\xad\x18\x29\x01\x0a\x56\x25\x8a\xa2\x51\x95\xa1\x61\x44\x56\x64\xa0\xc8\x08\x0a\x93\x00\x45\x54\x86\x41\x19\x4c\x66\x18\x9a\x84\x45\x84\x00\x38\x8e\xa8\x38\x85\x33\x14\x4e\x89\xb0\x88\x51\xa2\xb4\x5f\xc4\x3b\xa1\x6f\x45\x0b\xfb\x56\x1c\x41\x98\xec\xbe\x35\x78\x1a\xcd\x0a\x4f\xed\x5b\xeb\x89\x4a\x3d\xe8\x5b\x2b\x8e\xf9\x73\xfa\x56\x16\xdb\xcc\xa4\xcd\xa0\x2f\x19\x8f\x3d\xad\x76\xdb\xec\x74\xef\x86\x6b\xf5\xae\xbb\x58\x4f\xec\xd6\xdd\x66\xcb\xda\x83\x01\xd1\x64\x1e\x9f\x09\x12\x11\xe7\xc6\x1b\x7f\xdd\xba\x1f\xdd\x49\x4d\x9b\x93\x35\xe7\x56\x5a\x68\x8c\x32\xbb\x57\x3a\xa3\x87\xb7\xe5\xfd\xac\xae\x7d\xb4\x95\x65\xb7\xdd\xf8\xdf\xea\x5b\x4f\xed\xdb\x4e\x6c\xcf\xaf\xd4\xf5\xa4\x21\x9f\xb1\x6f\xfd\x9d\xe3\xfd\xd4\xbe\xf5\x5f\xea\xdb\xd8\x33\xf5\xad\xc7\xc6\xd9\xa0\x6f\xe5\xe9\xfb\x25\x3d\xf9\x58\x12\xe8\xa4\xbd\x18\x3d\x8d\xb5\xed\xb4\x6b\x6c\xc7\x78\xf7\x85\xaa\x6d\x65\x79\xd1\x6d\x7c\x5c\x8e\xd4\xd9\xc3\x25\x70\x66\x3a\x41\x7d\xa8\x1b\x64\x3a\x9e\x6d\xa4\x5a\xab\x6d\x8d\x96\x78\xfb\x6d\x7e\xaf\xcf\xc7\x2f\xb3\x2e\xa1\xdf\x2f\x4c\x7b\xdb\x7a\xd4\xb6\xec\x7b\xb9\xbe\x35\xf3\xd8\xb7\xc3\x53\xd1\x77\x27\xb0\x86\x3f\x80\xae\xfa\xc3\xa5\x08\x47\xff\x84\xc6\x46\x23\xfa\x73\xea\xa4\x40\x68\x30\x6a\xf7\xd8\xd1\x03\xd4\xe1\x1e\xa0\x2f\x9a\x52\x74\x32\x5b\xfa\x29\xf1\x27\xa3\x4e\x70\x4d\x43\x9e\x26\xb8\x10\x7d\xe2\x27\x77\xc7\x9d\xb2\x7f\xb2\x76\x71\xb1\x69\xca\x1d\x05\x0c\x9a\xf2\xed\xe1\x94\x83\xbe\xec\xc9\xaf\x22\x47\x90\x5d\xc5\x0e\x0c\xab\x68\x9a\xf3\x54\x6b\x65\xc5\x2b\x55\x6a\xc6\x8a\x67\xc1\xb2\xe2\x79\x35\x4b\x17\x92\xa7\x69\x0e\xac\xd2\x9a\x67\x4e\x78\x17\xce\x29\x9f\x57\xfb\x2c\x31\x79\xfa\xe7\x42\x2b\xb4\x40\xfc\x96\x93\x40\x11\xef\x46\x94\x72\xbf\x7e\xf7\x2f\x4f\x89\x71\x81\xfa\x7c\xb2\x31\x4c\xc7\x6d\xfe\x16\x92\x1c\x0b\x80\x68\xeb\xca\x46\x13\x5c\xd0\x72\x32\x9e\xe0\x70\xbf\x52\x88\x32\xda\x75\xe4\x72\x99\x63\xe1\xec\x59\x44\x91\xc4\xb2\x81\x38\x1e\x9f\xf8\xea\xe0\xb7\xf8\x69\xe0\xbc\xeb\x71\x4e\x40\xe6\x1d\x49\x50\x0a\x56\xf2\x20\x83\x34\x34\xc1\x9d\x3e\x27\xe0\xf1\x39\x94\x43\x94\x38\x25\xe1\xea\xf0\x40\x84\xd4\x26\x1f\xbd\xa4\xa8\x3a\xd2\x20\x4a\xf8\x80\x13\xec\xa2\xb0\xc3\xcd\xde\x31\xc4\x69\x67\x03\x5d\x85\xe7\x00\x65\x81\xdd\xff\xfa\xfa\x44\x98\x9a\x52\x1a\xe0\xfe\x20\x94\xab\xd4\x03\x8d\x0a\x40\x87\xf7\x4a\x9d\x03\x77\xc0\x2b\x0a\x3d\x23\x54\x1d\xa5\x49\xba\x02\xe1\x15\x5a\xe7\x50\x20\xe0\x95\xe1\xd3\x47\xaa\x10\x3f\xd5\xe6\x50\x89\xc8\x85\x61\xc7\xb6\xc6\x08\x8f\x63\x8d\x9f\x6f\xe8\xc4\x0d\x68\xa7\xda\x3a\xce\x2e\x0a\x39\xdc\x56\x1a\xc3\x98\x8e\xe8\xf0\x16\xb7\xd3\x61\x1d\xf0\x2c\xd7\xbd\xa5\x01\x8c\xdc\x47\x77\x74\xb5\xee\x79\x1c\xef\x92\x45\xee\x97\x76\xd3\xde\xf1\x80\x0f\x99\x25\x90\x2b\x20\x81\x33\x71\xc6\x59\x3e\x40\xff\xea\xc0\xb3\xc0\xf3\x58\x95\x02\x17\xfe\x42\x39\x13\x5a\xf2\x2a\xc4\x53\xf1\x25\xf8\x15\x81\x3c\x3c\xbc\xad\x10\xe9\x79\xec\x18\xe3\x56\x16\x65\xa1\x35\xcf\x83\xad\x14\xa6\x7c\x2c\x89\x3b\x37\x4f\x42\x14\xe7\x55\xba\x46\xc3\xe3\xe1\x52\xf1\x1d\x5c\x23\x7a\x12\xc2\x24\xb7\x72\xed\x36\x00\x78\x75\x70\xa2\xdd\xd5\xc1\xa9\x88\x19\x4a\x9c\xa1\xdf\x0e\xf8\x14\x21\xae\x38\x3a\x4a\xde\xfe\x7a\x92\x75\x2b\x18\xb6\xd0\x6e\xc5\xd7\xda\x9e\x68\xd0\x42\x01\xb1\x3c\x2d\xfc\x01\x7b\x3c\x33\xf2\x09\x2b\x60\x3f\xdd\x0f\xf2\x78\x17\x23\x4e\x69\x65\xf9\x97\x16\x1f\xeb\x0f\xb9\x5c\x0b\x87\xfd\x2e\x51\x01\xd0\xd4\xdb\x99\xcf\x83\x36\x8d\x75\xe1\xf0\xad\xac\x27\xc7\xaf\xa3\x3e\xab\x33\xc4\x58\x1f\x33\xde\x2c\x7f\xff\xf6\xd9\x0d\x7d\x70\xf2\x78\x21\xfc\x44\x81\xf2\xca\x44\xaf\x23\xff\x55\xf6\x8f\x1e\x36\x5f\xa4\x49\x84\xb6\xbc\x12\xa9\xd7\xb3\xff\x2a\x6d\x52\xcf\xd0\x2f\x52\x2b\xad\x50\x79\xfd\x76\xb7\xd7\xff\x2a\x9d\x76\x07\x4a\x16\xe9\x91\x39\xdb\x55\x70\x6b\xff\x59\x81\x27\xb9\xa7\x26\xc0\x55\x1b\x78\x9c\x69\x3c\x85\x3a\x53\x0b\xcf\x13\x51\x46\x87\x82\xbc\x2e\x57\xd8\xf9\xc2\xd7\x21\xe3\x52\xd8\x8b\x83\x58\x34\xd9\xfe\x15\x6e\x73\xc8\xff\xe8\x54\xdf\x3f\xc7\x2a\x0c\xe4\xe1\x0c\xa3\x20\x99\xe6\xcb\xd1\x56\xce\xe1\x59\x38\x44\xf8\xf2\x25\x3c\xa4\xfd\xdb\x9f\x7f\x42\x17\xb6\xa9\x2b\x91\xd5\xb4\x8b\x9b\x1b\x07\x6c\x9c\xaf\x5f\xaf\xa0\x6c\x42\xd9\x54\xca\x11\xfa\x73\xf1\xd9\xa4\x92\xb9\x5e\x3c\x39\xa5\xc4\xc7\x48\xf3\x01\xc4\x48\x13\x10\xbe\x42\xb3\x16\x37\xe2\x7c\x27\x83\x7e\x42\x18\x56\x7a\x21\x5a\x53\x04\x35\xb2\x4c\xd4\xec\xfc\x9e\xe5\xe8\x40\x2c\xd4\xec\x8f\xb8\xf6\x2d\xbf\x5b\x02\x82\x46\x5c\x93\x1b\x71\x7c\x9d\x4b\x5e\x93\xee\x3d\xed\xf3\xd0\x74\xd0\x70\x5d\x66\xc4\xf9\x37\x13\xba\x5f\x35\xb8\x2e\x37\xe1\xa0\x3a\x3b\xae\xb3\x0d\x2e\xff\x34\xfd\xc4\x47\x21\x31\x15\x73\x3e\x63\xc4\xe5\x14\x2c\x92\x65\x21\x89\xdb\x27\x39\x6d\x94\x6a\xac\x60\xa0\x5f\xb0\xa2\x98\x69\x89\x20\x95\xfd\xd7\xed\x10\xc5\x91\x66\x85\x70\x96\x20\xdf\x61\xaa\x59\xe0\x70\x52\xe9\x5f\x34\x43\x06\x98\xb8\x2d\x52\xa6\xc1\xce\xeb\x14\xc9\x29\x8e\xff\x05\x83\x64\xbb\xc6\xc1\x1c\x52\x59\xef\x18\x98\xb6\xb3\xb0\xc0\x78\xd8\x85\x14\xd1\x11\x5d\x17\x83\x94\xf5\x72\x05\xc9\xe6\x72\xa5\x03\x07\x78\x3a\xfc\x5f\x00\x00\x00\xff\xff\x35\x02\x7e\xcd\x21\x8e\x00\x00") +var _account_mergeHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5d\x79\x6f\xe2\x48\xd3\xff\x7f\x3e\x85\x35\x5a\x29\x33\x4a\x66\xe2\xdb\x38\xf3\xcc\x4a\x06\xcc\x11\xc0\xdc\x81\x64\xb5\xb2\x7c\xb4\xc1\x89\xb1\x89\x6d\x12\xc8\xea\xf9\xee\xaf\x7c\x81\x6d\x7c\x02\x33\xfb\xbc\x28\x8a\x00\x57\x57\xfd\xaa\xba\xba\xab\xab\xbb\xe9\xfe\xf6\xed\xd3\xb7\x6f\xd0\xc0\xb0\xec\x85\x09\xc6\xc3\x2e\x24\x0b\xb6\x20\x0a\x16\x80\xe4\xcd\x6a\xfd\xe9\xdb\xb7\x4f\xce\xf3\xfa\x66\xb5\x06\x32\xa4\x98\xc6\xea\x40\xf0\x06\x4c\x4b\x35\x74\x88\xfe\x4e\x7e\x47\x42\x54\xe2\x0e\x5a\x2f\x78\xa7\x78\x8c\xe4\xd3\x98\x9d\x40\x96\x2d\xd8\x60\x05\x74\x9b\xb7\xd5\x15\x30\x36\x36\xf4\x13\x82\x7f\xb8\x8f\x34\x43\x7a\x39\xfe\x56\xd2\x54\x87\x1a\xe8\x92\x21\xab\xfa\x02\xfa\x09\x5d\x4d\x27\x8d\xca\xd5\x8f\x80\x9d\x2e\x0b\xa6\xcc\x4b\x86\xae\x18\xe6\x4a\xd5\x17\xbc\x65\x9b\xaa\xbe\xb0\xa0\x9f\x90\xa1\xfb\x3c\x96\x40\x7a\xe1\x95\x8d\x2e\xd9\xaa\xa1\xf3\xa2\x21\xab\xc0\x79\xae\x08\x9a\x05\x22\x62\x56\xaa\xce\xaf\x80\x65\x09\x0b\x97\xe0\x5d\x30\x75\x55\x5f\xfc\xf0\xb1\x03\xc1\x94\x96\xfc\x5a\xb0\x97\xd0\x4f\x68\xbd\x11\x35\x55\xba\x71\x94\x95\x04\x5b\xd0\x0c\x87\x8c\xe9\x4e\xd8\x11\x34\x61\xaa\x5d\x16\x6a\x37\x20\x76\xde\x1e\x4f\xc6\x50\x9f\xeb\x3e\xfa\xf4\xdf\x97\xaa\x65\x1b\xe6\x8e\xb7\x4d\x41\x06\x16\x54\x1f\xf5\x07\x50\xad\xcf\x8d\x27\x23\xa6\xcd\x4d\x42\x85\xa2\x84\xbc\x64\x6c\x74\x1b\x98\xbc\x60\x59\xc0\xe6\x55\x99\x57\x5e\xc0\xee\xc7\xef\x10\x28\xb9\xef\x7e\x87\x48\xc7\xaf\x7e\x9f\x82\x9e\xb4\xf2\xda\x79\x00\x1d\x47\xce\x12\x16\xa2\x3a\x30\x77\xc9\xdb\x5c\x9d\x9d\x87\x28\x7d\xb6\x2e\x2a\x1e\x28\x0a\x90\x6c\x8b\x17\x77\xbc\x61\xca\xc0\xe4\x45\xc3\x78\xc9\x2e\xa8\xea\x32\xd8\xf2\x21\xe5\x74\x4b\x70\x1d\xdd\xe2\x0d\x9d\x57\xe5\x32\xa5\x8d\x35\x30\x85\x7d\x59\x7b\xb7\x06\x67\x94\x3e\x20\x39\x0b\x45\xb9\xb2\x1a\x90\x17\xc0\x74\x0b\x5a\xe0\x75\x03\x74\xa9\x94\x0a\xa1\xe2\x6b\x13\xbc\xa9\xc6\xc6\xf2\xbf\xe3\x97\x82\xb5\x3c\x91\xd5\xf9\x1c\xd4\xd5\xda\x30\x9d\xe6\xe8\xf7\xa9\xa7\xb2\x39\xd5\x96\x92\x66\x58\x40\xe6\x05\xbb\x4c\xf9\xc0\x99\x4f\x70\x25\xbf\x5d\x9e\x00\x3a\x5c\x52\x90\x65\x13\x58\x56\x76\xf1\xa5\x6d\xca\x6e\xdc\xe1\x35\xc3\x78\xd9\xac\x0b\x50\xaf\xf3\x20\x79\x54\x82\x6a\x96\x64\x1c\x74\xba\x85\x0b\x38\xfd\x84\xa2\x00\xb3\x18\x69\xc0\xfe\x84\x22\xbe\x59\x8b\x15\x72\xbb\xd6\x12\x42\xc2\x5d\x71\x5e\x89\xb5\x53\x60\x69\xe7\xd6\x80\x15\xe9\x80\xc4\x5d\xae\x1b\x2d\xf7\x2d\xbd\x08\xb1\xe1\xe1\x30\x72\x09\x55\xcb\xe6\xed\x2d\xbf\xce\x67\xe9\x50\x1a\xeb\xa2\x94\xa0\x28\x59\x10\x4a\xb2\x89\xc5\xa0\xb9\xe7\x92\xe5\xf7\x62\xe2\xae\x58\x65\x7a\x31\xd2\xb1\xb6\x65\x6d\xf2\x24\xef\x89\x25\x43\x06\x25\xc7\x05\x7b\x37\x58\x0b\xa6\xad\x4a\xea\x5a\xd0\x33\x83\x77\x5e\x51\x7e\x5d\x72\x6c\xb2\x8f\x68\x65\x11\x24\x17\x2c\x2d\xdf\x35\x5e\x11\x79\x1e\xe1\x2f\xe7\xef\x55\xa6\x53\x93\xfe\x5b\x27\x3e\x04\x43\x3f\xd7\x19\xf8\x82\x08\x16\x86\xb9\xe6\x57\xea\xc2\x1f\x30\x64\x40\x88\x51\x16\xd6\xb1\xfc\x78\x2f\x8b\x73\x51\xe7\xf4\x4a\xd7\xfa\xdd\x69\x8f\x83\x54\xd9\x93\x5c\x67\x1b\xcc\xb4\x3b\x29\xc8\x3b\xc5\xe9\x2e\xc0\xd9\xaf\xee\x6c\x4e\xee\xa7\xe2\xea\x07\x51\x7a\xcc\x0e\xa7\x2c\x57\x3b\xc1\x66\xce\x38\xdb\x02\xaf\xa5\x25\x47\x98\x14\x2e\x2d\x83\x82\xb4\x87\xd1\x6c\x61\x0d\x53\x5a\x7d\x19\xfd\x92\x59\x14\x2b\xeb\x8f\xfb\x8a\x11\xfb\x83\xbc\xc2\xba\xf9\x3d\x40\x19\x5d\xbc\x22\x05\x69\xfd\xe1\x5f\x71\x3c\xc1\x78\xb1\x08\xa2\x58\x1f\x92\x4d\x1c\xea\x12\x7c\x42\xa6\xd9\x1c\xb1\x4d\x66\x92\x40\xbc\x52\x9d\x8c\x43\x95\xc0\x17\x7d\xb3\x02\xa6\x2a\xfd\xf5\xf7\xd7\x02\xa5\x84\xed\x09\xa5\x34\xc1\xb2\xbf\x08\xfa\x0e\x68\xee\x54\x4c\x81\x12\x8a\x6a\x26\x16\x69\x4c\xb9\xda\xa4\xdd\xe7\x32\xf4\xe1\x85\xc5\xe2\x80\xee\x06\x3a\x02\x9a\xc1\x23\xd0\xee\x0c\x1e\x8e\xae\x6e\xf1\x03\xf8\x1b\xa8\x8c\x22\xae\xea\x05\x38\xb0\xf3\x09\xcb\x8d\x63\x2c\xb4\xf5\xc2\x7a\xd5\x02\x5f\xac\xb5\xd8\x1e\x73\x24\xe1\xc7\x27\x6f\x16\x8e\x13\x56\xe0\x2e\xf8\x0e\x9a\xec\xd6\xe0\xce\x2f\xf2\x03\x1a\x4b\x4b\xb0\x12\xee\xa0\x6f\x3f\xa0\xfe\xbb\x0e\xcc\x3b\xe8\x9b\x3b\x39\x57\x1b\xb1\x4e\x7d\xf9\x9c\x03\x7e\x9f\x22\x1c\xa3\x0f\x7d\xc6\xb5\x7e\xaf\xc7\x72\x93\x0c\xce\x1e\x01\xd4\xe7\xa2\x0c\xa0\xf6\x18\xba\x0a\xa6\xdd\x82\xef\x2c\x97\xc9\x55\x5c\x72\xa0\xbe\x2f\x73\x6f\xa1\x5c\x7d\x22\xb6\xe4\xfa\x93\x98\x3d\xa1\x59\x7b\xd2\xda\xc3\x0a\xcf\xbf\x45\xc4\x1f\xb8\xc4\x80\x94\x51\xfe\x88\x89\x6b\x80\x41\xf7\x76\xbd\x18\x0f\xbb\xd0\xda\x34\x24\x20\x6f\x4c\x41\x83\x34\x41\x5f\x6c\x84\x05\x70\xcd\x50\x70\xbe\x30\x0c\x37\xdf\xd1\x7c\xf8\x81\xaf\x1e\xf0\x07\x75\x9b\x64\xcb\xbd\x67\xe7\xf2\x87\x46\xec\x64\x3a\xe2\xc6\xa1\xef\x3e\x41\x10\x04\x75\x19\xae\x39\x65\x9a\x2c\xe4\x6a\xdf\xeb\x4d\xbd\xfe\x6e\x3c\x19\xb5\x6b\x13\x97\x82\x19\x43\x7f\xf0\x7f\x40\x63\xb6\xcb\xd6\x26\xd0\x1f\x88\xf3\x29\x5e\x1b\xb9\x0d\xf1\x3c\xed\xf2\xd8\x5f\x4c\x39\x34\x49\xb9\x22\x3d\xd5\x79\xfa\x15\x90\xb0\x57\x71\xff\xd5\x49\x1a\x7e\xf9\x04\x41\x35\x66\xcc\x42\xb3\x16\xcb\x41\x7f\x20\x7f\x21\x7f\xdf\xfe\x81\xfc\x85\xfe\xfd\xe7\x1f\xa8\xfb\x1e\xfd\x0b\xfd\x1b\x9a\x78\x0f\x21\xb6\x3b\x66\x1d\xa3\xb0\x5c\xfd\x6b\xa2\x65\x0a\xc4\x81\x33\x2d\x93\x2f\xe1\x57\x5b\xe6\x3f\xa7\x58\xe6\x38\xa6\xfa\x76\xd8\xc7\xe1\x62\x86\x38\x84\xed\x23\x8e\x2e\x62\x08\x1a\x3b\xb6\x82\x7e\x1e\x7a\x80\x1b\xef\xeb\xc9\xe3\x80\x85\x7e\x86\x5b\xc4\xd7\xa4\x56\x7b\x51\x8c\x71\x86\x31\x88\x41\x33\x2e\x8e\x30\x71\x08\x74\x2e\xca\x24\xa6\x31\xa4\x91\x06\x19\x85\x7b\xf0\xb2\x63\xb4\x49\xc3\xbc\xb3\xd1\x26\x30\x8d\xa3\x0d\x37\x92\x4c\xb4\x4e\xe4\x92\x81\x22\x6c\x34\x9b\xb7\x05\x51\x03\xd6\x5a\x90\x00\xf4\x13\xba\xba\xfa\x11\x7d\xfa\xae\xda\x4b\xde\x50\xe5\xd0\x52\x5a\x44\xd7\xf0\xf8\xd7\x57\xd1\x6d\x60\xc5\xd4\xf3\xda\x62\x38\xf9\xf6\x34\x52\x65\x48\x54\x17\xaa\x6e\xbb\x03\x03\x6e\xda\xed\x7a\xea\x08\x2b\x67\x18\x0f\x49\x4b\xc1\x14\x24\x1b\x98\xd0\x9b\x60\xee\x54\x7d\x11\x23\xd3\x37\xab\xfd\x90\x1f\x52\x75\x1b\x2c\x80\x19\x23\x51\x34\x61\x61\x41\xd6\x4a\xd0\xb4\x63\x31\xb6\xb1\xd2\x8e\x85\x7c\x41\x09\xe2\xeb\x9e\xf2\xb8\xda\xe3\x79\xc3\xa9\xe6\x88\xcf\x76\xec\x4d\x62\x83\xed\x91\x41\xd6\x6b\x4d\x75\xe7\xec\x21\x5b\x5d\x01\xcb\x16\x56\x6b\xc8\xa9\x33\xf7\x23\xf4\x61\xe8\xe0\x18\x68\x5a\x56\x14\x8c\x47\xfd\x74\xaa\x18\xe6\x7d\xf2\x95\xc2\xd5\x77\x43\x66\x34\xf1\x46\x74\x88\xfb\x45\x9b\xab\x8d\x58\x77\xf8\x55\x7d\xf4\xbf\xe2\xfa\x50\xaf\xcd\x3d\x30\xdd\x29\xbb\xff\xcc\xcc\x0f\x9f\x6b\x4c\xad\xc5\x42\x48\x9e\x32\x27\x9b\x3d\xce\xe8\xc8\x15\xfd\x49\x0f\x48\x07\x5b\xfb\x4d\xd0\xbe\x5c\xa5\x68\x7c\x75\x77\x67\x82\x85\xa4\x09\x96\xf5\x35\x5e\x5d\xde\x5a\x45\x82\x6f\x91\xf8\xd7\x8c\x8a\xf2\x72\xe3\xb3\x35\xf3\x66\x74\xf6\x7a\x25\xb7\x8c\xc3\x5c\x5d\x32\xcc\x44\x72\xc9\x90\x93\xc8\x11\x34\x99\xdc\x9b\xfe\x4b\x28\x40\x90\x59\x2d\x2c\x79\x7a\xe1\x42\x6e\x1b\xe6\xf9\xdb\x9c\x36\x4b\x11\xa8\x3f\xe3\xd8\x3a\x54\x7d\xcc\xd1\xc8\x9b\xa1\xcb\x56\x68\xcf\x2b\xf6\xf8\xbb\x2a\xa7\x61\x0b\xe6\x7c\xce\xf5\x3a\x9f\x8f\xef\x76\xb1\x36\xc3\xa7\xf5\xf4\xc7\x53\x5c\x69\x94\x9f\xdd\x85\x8f\xcf\x29\xde\xec\xfa\x71\xf2\x23\x19\xd8\x82\xaa\x59\xd0\xb3\x65\xe8\x62\xba\xb3\x05\x13\x65\xe7\xda\xc1\xe7\xe3\xdb\x21\x58\xb7\x4e\xc1\x16\x5a\x4c\x2e\xd4\x0a\x93\xd6\xb1\x93\x0b\xfa\x66\x09\xcd\x8c\xba\x15\xb1\xc7\x11\xf4\x72\x70\x4c\xc2\xa1\x22\x8a\xd1\xef\x17\x93\x63\x81\xc9\xd8\xd8\x87\xd8\x14\x2f\x63\x02\xc1\xce\x2d\xe4\xd1\x6e\xd6\x72\x61\xda\xbd\xeb\xf8\x1f\x63\xeb\xec\x47\xba\x20\x47\xe3\x01\x5b\xd0\x78\xc9\x50\x75\x2b\xd9\x07\x15\x00\xf8\xb5\x61\x68\xc9\x4f\xdd\x95\x4f\x05\xa4\xd5\xb5\xfb\xd8\x04\x16\x30\xdf\xd2\x48\x9c\x71\xa8\xbd\xe5\xdd\x61\x92\xfa\x91\x46\xb5\x36\x0d\xdb\x90\x0c\x2d\x55\xaf\x78\x1d\x05\xce\x02\x04\x19\x98\xee\xf0\xc2\xfb\xde\xda\x48\x12\xb0\x2c\x65\xa3\xf1\xa9\x8e\xe2\x2b\x2e\xa8\x1a\x90\xd3\xa9\xd2\x9b\x55\xca\xdc\xf5\xb9\xad\x2c\x65\x3d\x24\x27\xe6\x15\xef\x6d\xf2\xfb\xaf\xb2\x2a\x5f\x36\x8c\x65\xca\xf8\x5d\x61\xad\x94\xa2\x67\x86\xb9\x4c\x59\xc7\x61\x2f\x99\x3c\x23\x0c\x86\x56\x76\x2e\xe6\x9b\x79\x69\x4e\x74\x57\x55\x4a\x2a\xe4\x8c\xfc\x25\x4f\x15\x37\x02\x9e\x19\x00\xfd\x96\x6f\x6c\x4c\x69\xbf\x4d\x23\x25\xf4\x04\xdd\xc9\xd5\xd5\xdd\x5d\x7a\x2a\x96\xde\x0e\xfc\x85\xb5\x73\xcd\xe9\xef\x05\xfc\x72\xd1\xf1\x82\xdf\x25\x9e\x12\xbd\xdc\xbd\x30\xa9\x62\x63\x3b\x11\xb3\x88\xfc\xcd\x91\x59\x24\x5e\x1e\x9c\x48\x70\xbc\xa7\x33\x87\x2e\x53\xdc\x9e\x2a\x43\xa2\x0b\x49\xb5\x78\x0b\x68\x1a\x30\x21\xd1\x30\x34\x20\xe8\x41\x4c\x52\x25\xc0\xeb\x91\xf8\xeb\x7d\x17\x8d\xc9\x87\xdd\x44\x7c\x2c\x5a\x47\xf6\x33\xc5\x1f\x86\x96\xe9\x13\x77\x7e\xba\xa8\x79\x77\x6f\x30\x54\x6b\xb1\xb5\x0e\xf4\xe5\x4b\xd8\x82\x7f\x42\xf0\xd7\xaf\x79\xac\x92\x8a\x07\x46\xfb\xcf\x91\x1d\x0b\xf0\x8b\xd8\x34\xc6\x3e\x66\x70\x17\x60\x66\x53\x4a\x5e\xe1\xbe\x40\xe3\x4a\xde\xb3\x50\x30\x92\x16\xe9\xc2\xce\x89\xa5\x79\xfb\x03\x2e\x13\x4d\x73\xa4\xfc\xae\x78\x5a\x52\xd9\x33\x23\x6a\x8e\xb4\xe3\x98\x9a\x56\x20\x23\xaa\x46\xf6\x84\x5c\xd0\x57\x03\xff\x0c\x43\x2a\x9c\x44\xf9\x7d\x7f\x4e\x6a\x56\x34\xf0\x66\xc7\xd0\x44\xda\x83\xe8\xc4\xf6\xe2\x64\x01\xe9\x69\x44\x5a\x82\xf6\xaf\xa4\x58\xf6\x96\x07\xfa\x1b\xd0\x8c\x35\x48\x9a\xb6\xb4\xb7\x4e\xc2\xb3\xd1\xec\x94\x87\x2b\x60\x0b\x29\x8f\x9c\x54\x2b\xed\xb1\xa5\x2e\x74\xc1\xde\x98\x20\x69\x86\x8d\x26\xbf\xfe\xf5\xf7\x61\xec\xf2\xcf\x7f\x93\x46\x2f\x7f\xfd\x1d\xb7\x39\x58\x19\x29\x93\x61\x07\x5e\xba\xa1\x83\xcc\xb1\xd0\x81\xd7\x31\x1b\x5f\x33\x75\x05\x78\xd1\xd8\xe8\xb2\x3b\x63\x5d\x31\x05\x7d\x01\xe2\xd9\x58\x34\xb4\x3a\x96\x70\xb8\x2d\x80\x9c\x9f\x6e\xf9\x73\x7f\xaa\x1c\xb4\xb6\x60\x0b\x57\x91\x2e\xc2\x6b\x6e\xee\x7e\xb9\x9c\xdd\x61\x63\x76\x92\x31\x4f\x1a\x9e\x91\x0a\xcf\x92\x96\xcb\x23\x2e\xa7\x44\xc1\xcd\x73\x99\x4a\x65\xe6\x1f\x45\x94\x4c\x8d\xb4\x17\x53\xb3\xf0\xfe\xc3\x4c\x45\x73\xc2\x42\xb2\xaa\x75\xc1\x16\x20\xc5\x30\x73\x56\x8b\xa0\x3a\x33\x61\x72\xd4\x4b\x61\x99\xb5\xea\x52\x84\x6d\x9b\x1b\xb3\xa3\x09\xd4\xe6\x26\xfd\xa3\x95\x17\x37\x40\x8f\xa1\x2f\x57\x08\xaf\xea\xaa\xad\x0a\x1a\xef\xed\x82\xf9\x6e\xbd\x6a\x57\x37\xd0\x15\x0a\x23\xf4\x37\x98\xfc\x06\x63\x10\x52\xb9\x43\x2b\x77\x38\xf5\x1d\xc6\x50\x9c\x26\xaf\x61\xf4\xea\xeb\x8f\x62\xdc\x51\xde\xfb\x75\x43\xc4\xaa\xe2\x8e\xb7\x0d\x55\xce\x96\x44\x93\x04\x55\x46\x12\xc6\x6f\x2c\xb0\x8f\x32\xbc\xaa\x1f\xfd\xa2\x22\x53\x1e\x8e\xc3\x78\xa5\x8c\x3c\x9c\x17\x64\x99\x8f\xcf\x4b\x65\xca\x20\x70\x02\x43\xcb\xc8\x20\x78\x2f\xa6\x05\xa3\x6b\x77\x3d\x33\x53\x04\x89\xc1\x68\x29\x35\xc8\x40\x84\xdf\x83\x15\x10\x51\xc1\x11\xa2\x8c\x08\x8a\x5f\x19\xb2\xaa\xec\x8a\x6b\x51\x41\x48\xb4\x94\x88\x4a\x44\x0b\x7f\x1b\x73\x01\x39\x14\x4e\x62\xe5\xe4\x38\x95\x2e\x2c\x16\x26\x58\x08\xb6\x61\x66\xfb\x14\x0d\x23\x30\x5d\x86\x3d\xed\xb2\xf7\xe6\x2c\xf9\xad\x6c\x66\x73\x47\x29\xa4\x54\x55\x23\xb0\xcb\xde\xaf\x05\x37\x53\xcd\x16\x40\xd0\x54\x29\xeb\x20\x48\x58\xc0\x3e\xf5\x71\x3a\x80\x6c\x41\x34\x49\x97\xd3\x04\x8d\x54\xb4\x9f\x6c\x7a\x3f\x9c\xcd\x92\x84\xc0\x14\x81\x97\xaa\x11\x04\xf3\xd4\xd9\xa7\xe8\x99\x35\x8e\x20\x28\x45\x96\xd3\x04\xe7\x15\x75\x1b\xfc\x88\xc0\x58\x69\xbc\xa2\x02\x2d\xb3\x6b\x44\x10\x02\x41\x4a\x75\xc2\x08\x11\xac\x9d\x04\x73\xda\xdb\x1c\x35\x48\xaa\x5c\x37\x8f\x90\xbc\xaa\x2f\x80\x65\xf3\xc7\xb3\xe6\x39\xa2\x28\xba\x52\xae\x46\xa8\x48\xb8\x76\x97\x27\x84\xec\x60\x82\xa0\x30\x8c\xe1\xbe\x90\x94\x58\x9b\xb9\xd6\x5e\x36\xd8\x1e\xad\xb7\x07\xe8\x91\x1b\xe8\xaa\x59\x9b\x77\x9a\xe4\x88\xc3\xfb\x5c\x9b\x1d\xd4\x7a\x5c\xa3\x4a\x61\x28\x83\x63\xe4\x13\x31\xe0\xea\xe3\x51\xb7\x39\xeb\x50\xcd\x6a\xb7\xd6\x1b\x76\xdb\x8d\x3e\x3e\xa6\xd8\xc7\xd9\xc3\x34\x6e\xa1\x54\x21\xa8\x23\x84\x21\x66\xd5\xc1\x23\x43\x3c\xe2\x33\x86\x6d\xcd\x67\x23\x74\xda\xe9\xa3\xd3\x3e\x5e\x9d\x36\x5b\xd3\x21\x85\xb3\xd3\x41\xa7\xcf\xa1\xc3\xd6\x03\x3e\x1b\xb5\xfa\xed\x11\xd7\xe9\xb4\x8e\xaa\x21\x55\x08\xe6\x08\xa9\x8e\x06\x8f\xad\x76\x17\xad\xb5\xb1\x06\x37\xc4\xab\xf3\x6e\xa3\xc7\xd5\xbb\x8d\xfb\x29\x37\x98\xa2\xad\x47\xec\xa9\xd7\x18\xb7\xfa\xdc\xb4\xc6\xf6\x99\xf1\x8c\x1a\xd6\xa8\xfe\x1c\x6d\x5d\x9d\xba\x6d\xc3\x19\xc5\xe5\x54\x83\xbf\xd5\xed\xb0\x4b\xf5\xbb\x05\xb2\xb7\x34\xdc\x40\xd8\x0d\x64\x9b\x1b\x50\xc0\x39\x8e\x37\x2b\x94\x19\xde\x95\x59\x20\xbf\x88\xa6\x91\xa4\xe4\x06\x42\x6e\xbc\x7d\x4e\xf9\x8a\x26\x2d\x90\x9f\xda\x08\x82\x45\xf2\x50\x1b\x40\xd0\x4a\x05\xa7\x61\x82\xae\x10\x2e\x2a\xc7\x99\xfe\xf9\xec\x75\xe3\x9f\xef\xa0\xcf\x34\x4d\x7f\xa7\x9d\x17\x0c\x7f\xbe\x81\x3e\x1f\xb6\x6d\x38\x0f\x75\xc1\x56\xdf\xc0\xe7\xff\xa6\xb9\x6a\x5c\x1e\x1a\x93\x87\xba\x7f\xbf\x4e\x5e\x5c\x3f\xcc\x55\xd1\x49\xca\x8b\x33\xa8\x10\x15\x9a\xc6\x2a\x64\x85\x76\x0b\xc3\x2e\x5e\xcb\x76\x06\xd1\xfa\x82\x17\x05\x4d\xd0\x25\x17\x1c\x02\xc3\xf0\x77\xd8\x7b\x15\x87\x88\x45\x25\xa0\xc7\x35\x10\xe1\x7b\x09\x93\x84\xe5\x39\x16\xf1\x54\x7a\x07\xea\x62\xe9\x08\x44\x6e\xa0\xcf\x9e\x47\xf1\x2f\x60\xe7\xc8\x38\xb5\x9b\x2c\xe5\x18\x2e\x2a\x1c\xa5\x7c\x3f\xfc\x55\x76\xf6\x25\xfc\x72\x3b\xc7\x34\x2a\x66\xe7\x13\x23\x85\x87\x2a\xa7\x1f\x49\xda\x60\x72\x6a\x3f\x12\x6c\x32\x09\x47\x20\x54\xae\x10\x12\x8e\x93\x98\x88\x0a\x24\x8d\xa2\x14\xa0\x64\x0a\x43\x28\x45\x21\x08\x94\x12\x01\x29\x23\x18\x41\x55\x08\x80\x2b\xb0\x28\x28\x14\x49\x50\x34\xc0\x15\x54\x91\x65\x0c\x11\x05\xc2\x19\x31\xc0\x94\x24\xe0\x40\x12\x51\xbc\x22\x28\xa8\x82\x91\xb4\x84\x0a\x98\x50\xa1\x29\x8c\x04\x38\x09\x04\x14\x87\x31\x42\x56\x70\x19\x88\x88\x42\xe3\xb4\x2c\x61\x08\x26\xd3\x84\x42\x0a\x94\x44\x48\x5e\xc7\x8a\xc4\xc6\x1e\xe4\x1d\x46\xdc\xa1\x48\x7c\x48\xe2\x7d\x8d\x7e\xa7\x2b\x14\x8c\x50\xb9\x4f\xfd\x8e\x04\xa9\x54\x2a\x37\x10\x42\x3a\xf5\x79\xf4\xba\x81\x30\xe7\x1f\xe2\xff\x0b\xbe\x44\xf6\x6f\x1c\x68\x0c\xc3\x30\xb5\x77\xa5\x33\xb1\xac\x17\xf5\xad\xfb\x21\x48\x9d\xe7\xd7\x7b\x09\x25\x9a\xa4\x3a\xac\xcf\x95\x09\xb0\x14\xed\x1e\xab\xb3\xb4\xa6\x08\xfa\x56\x12\x09\x06\xc3\x5f\xdf\x5a\x95\xeb\xe6\xee\x6d\x53\x95\xb5\xb1\xd4\x03\xd6\xe2\xde\x5c\x73\xa3\x77\x4b\xa4\x5f\xe9\x49\x8f\x41\x71\x49\x7d\x85\x1d\xd6\xcc\x7c\xf0\xd0\x1b\x0f\x99\xfd\x4b\xc3\x14\xee\x4d\x79\x92\x1f\xab\xdb\x41\xb3\x56\x21\x9f\x5f\x31\xb9\x4d\x74\x3a\xd3\xed\x93\x64\xac\x51\x71\xfe\x71\xdb\x69\x3d\x52\xfd\xed\xed\xa8\x2f\xbd\x32\xab\xfe\xc8\x68\xaf\x7a\xe8\xfd\x53\x95\x78\x7d\x9d\x8e\x09\xee\xa5\xf2\x8c\x74\xd0\xeb\xe5\x04\xab\x48\x7a\xbf\x3b\xe7\xc0\x06\x7b\x77\x38\xf7\x38\xbc\x2b\x7c\xac\xd1\x90\x30\x86\xb5\x98\x84\xd7\x13\x33\x47\xf0\x21\xc3\xd4\xe1\xfb\xa4\xc7\xff\xd3\x2f\xcf\xa9\xe0\x94\x76\x1f\x6f\x0a\xe8\x65\xdc\xf8\x8a\xc4\x64\xba\xa2\x10\x18\x09\x00\x59\x91\x11\x11\xa5\x44\x42\xac\xd0\x0a\x8a\x09\x0a\x81\x21\x88\x48\x11\x24\x2d\xa0\xb8\x22\x28\x08\x0e\x63\x82\x0c\x8b\x04\x2a\x92\x18\x26\xc2\x94\x08\x68\xfa\x6a\x1f\x5d\x8f\xbd\x1a\x4e\x76\x76\xec\x3b\x0c\x63\x14\x9d\xd2\x14\x42\x4f\xbd\x00\x82\x13\x34\x9a\xd1\x12\xd0\x82\x2d\x01\x1d\x3c\x3d\x23\xdc\x86\x30\x60\xf1\x9e\x9a\xe1\xfa\xae\xff\x36\xdd\x36\xb1\x87\xb5\xf1\x72\xfd\xd6\x60\xfa\x76\x0d\xe9\xa0\x3d\xaa\x4a\x91\x4f\x53\xd0\x98\x2d\xb1\xeb\xee\x23\xf6\x38\x69\xbd\x2c\x45\xd2\xbe\x9e\xab\x2f\x13\xbc\xc2\x74\x1e\xa6\xe6\xf2\xba\xcd\x69\x58\xef\x91\xe6\x38\x7b\xea\xd6\x9c\xdb\x12\xdc\x77\xed\xfd\x3f\xc6\x75\x56\xeb\xf0\xf9\x9d\x19\x0c\x5f\xbc\x9a\x7e\x9f\x71\x4f\x4a\x9b\x98\xed\x1a\xb3\x2d\xba\xa2\x26\x06\x37\xac\x2d\x1f\x9f\x88\x8f\xd7\x86\xf9\x6e\x2c\xd0\x67\xf8\x65\xfe\x3a\xe4\xba\x8c\x69\x73\xe8\xa4\x8f\x76\x1b\x0c\x3d\xd1\x9b\x6f\xf6\x78\xfe\xf1\x30\x1f\x34\x2d\xb6\xc3\x3d\x7f\x90\x1d\xd0\x5b\xde\xf7\x19\x4d\x98\xcf\x64\xfc\xcd\x6d\x29\xed\x84\x96\x52\x6f\x27\x79\xdb\xff\xf3\x96\x82\x16\x6f\x29\xc8\x65\xbc\xdc\x5d\xf8\x70\x86\x0b\x4e\x78\x45\x68\x0a\xfe\x06\x23\xdf\x60\x04\x82\xe1\x3b\xf7\x2f\xd5\x9b\x11\x0a\x21\x33\x1f\x3a\x11\x03\x47\x69\x9c\x26\x29\x94\x26\x33\x5c\x3d\xd9\xd1\x3d\x44\xff\x76\x9d\xa4\xbf\xaa\xf3\x8e\x8a\xef\x6e\x77\xe3\x4e\x95\xaa\xeb\x75\xba\x85\xc2\xdb\xe7\xea\xb5\x05\x2f\x6c\xeb\xbd\xfd\xfe\x81\xcc\xe5\xf1\xec\x51\xa8\xde\x0b\x8d\x85\x43\xcf\x26\xf8\x70\xf2\x2b\xf0\x61\x86\xa9\xbe\xfc\x06\x45\x2e\xfa\xba\xf2\x7c\x29\x7f\x3c\x55\x60\x67\xe1\xa9\xc3\xab\x94\x05\xa3\xd4\xac\x2d\xa5\xc1\xe5\xb0\x39\x4a\xc6\x4e\x63\x13\x4b\x60\xb0\xd3\xb8\xe0\xb1\x44\xeb\x34\x2e\x44\x6c\xd0\x7d\x1a\x17\x32\x96\x2a\x5c\x66\xa7\xe5\x45\xa6\x11\xb2\x97\x01\x6f\x20\xb2\xe8\xf4\x49\xca\x7e\xc3\xb3\x3d\x36\xe4\xa5\x11\x17\xdd\x7f\xc0\xdd\xd1\x54\xc5\x4d\x85\x54\xdd\x36\xce\xca\x7b\x9c\x2c\xcd\x9b\x42\x3a\x33\x4d\xfd\x05\x73\x81\x09\x26\x09\x7b\xf8\xfe\x7d\x25\x94\xee\x2a\x1b\x5d\x06\xa6\xab\xcb\x89\xf3\x79\x97\x32\xc9\x0d\x54\x24\xf7\x3e\x73\xe2\xb1\x8c\xd9\xfc\xc6\xb8\x7f\x8f\xff\x52\xb3\x9d\xe1\x90\xbf\xde\x6c\x39\x4d\x3b\x61\xdf\xeb\x19\x0b\xdf\xa5\xb6\x00\x9e\xda\x7d\xa4\x6e\x1d\x48\x0c\x79\x78\x7a\x7c\xc8\x65\x84\xc6\x18\xa5\x05\xbd\x5c\x46\x58\xb4\x09\xa7\x85\x9a\x5c\x3e\x78\xac\x2b\x38\x95\x4f\xac\x6d\x9c\x8c\x87\x8c\xf2\x49\x0f\x7e\x65\x77\x0b\x5e\x22\xfc\xe5\x6d\x0e\x29\x11\x00\x53\xb7\x06\x5e\xc0\x87\xc3\x0b\xee\x18\x2e\x02\x1a\xa7\x48\x54\x96\x71\x91\x52\xe8\x8a\x42\xe2\xb8\x0c\x50\x98\x42\x29\x4c\x41\x04\x04\xa3\x15\x02\x13\x80\x22\xa1\x02\x02\x80\x48\x22\x95\x0a\x89\x20\x15\x49\xa0\x2a\x28\xa5\x5c\xed\x27\xad\x4f\x8e\x4f\xa1\x7c\x1d\x0b\x12\x95\xf4\xc9\x2e\x14\xc1\x32\xa6\xc2\xbc\xa7\x91\x16\xe4\x65\x38\x1d\xf2\x19\xa8\xd8\xf3\xca\x68\x57\x26\x4d\xad\x7e\x0b\x16\x12\x46\x0d\xe6\x76\xab\xd3\xf9\x98\x3d\x54\xde\x1f\xd4\xa7\xaa\x50\xdb\x10\x5d\xa2\xc7\xb8\x19\x02\x13\x24\xe0\xd5\xd8\x00\x3c\xf4\xd9\x4d\x3b\x98\x3e\x5a\xbb\x65\xfa\x38\xf1\x58\xad\x63\x76\xeb\xa1\xd1\x47\x46\x18\x03\xf7\xc0\xcb\xa0\x72\x3f\x22\x75\x0e\x61\x68\x30\x53\xe5\x5d\xdb\xcf\xfa\xdd\x97\x40\xbd\xbc\xbd\xbc\xbb\xec\x7a\xb7\xf5\x4d\x83\x46\x2d\x7b\x68\xc0\xcf\x43\xc5\x36\xd9\xcd\xdb\x68\x64\xa2\x8d\x47\x5b\xa8\x2c\x6e\xeb\xf4\x4c\x5c\xcd\xa6\xf7\x1f\xea\xb4\xf2\x4c\x3d\xdd\x8e\x3b\x68\x73\x79\x7b\x6b\x2e\x00\xfc\x0c\xcf\x87\x95\xdd\x8b\x88\xd5\x2b\x5d\x9d\xfe\x50\xd6\xe6\xa0\x43\x4d\xae\xa7\xbb\x0f\x66\xf8\xf3\xe7\x55\x38\xbb\x6b\x86\xb2\xa2\xc3\xdb\x50\x86\x7f\x3f\xad\x5d\xf7\x25\xef\x7d\xa8\xec\x70\x4f\x56\x77\x3f\xbf\x1f\x4a\x98\xaf\x1c\xd9\x05\x7d\x61\xf1\xbc\xed\x09\xd3\x01\x4d\x56\x3f\x14\x8b\x06\xb0\x64\x98\xdc\xd3\xfc\xa3\x3a\xbb\x7f\x69\x18\x9d\x40\x4f\xa6\xf6\xc0\xbc\x3d\xeb\x71\xb1\x47\x2f\x36\xed\x41\xf5\xc2\xf2\xe3\xf5\x5a\x48\xbe\x57\xc8\x75\x91\x5a\xe8\x19\xf5\xd8\xad\x30\xd4\xb3\xb6\x60\x07\x00\x96\xa7\x53\xea\xa1\x25\xd5\x87\x5b\x72\x78\xfb\xae\xb5\x5e\x25\x6c\x5a\x47\x08\xe1\x1e\x6b\xab\x88\x6b\x4f\xc7\xd6\x7e\x25\x2c\x32\x4c\x91\x9a\xc8\xba\x18\xeb\xa7\xcb\x1f\x1b\x8d\x0a\x90\x4e\x97\xdf\x8b\xc9\xaf\x6d\x0c\xcc\xb0\x71\xe2\xb5\x36\x60\xb7\xeb\xe1\x2d\x66\xb4\xb8\xeb\x0f\x84\x1a\xed\x54\x0b\xd1\x94\x5e\xe3\x71\x35\x9c\x2d\xcc\xcd\xf8\x7a\xc2\x30\x51\x5f\x5b\x30\xe9\x36\x4f\x95\x1f\xf2\x9f\x12\xed\x7a\xef\xd3\x0b\x26\xa1\x0e\x4f\xd1\xe1\x92\x75\x78\xae\x0d\xcb\xc8\xf7\xda\xf7\x3f\xbf\xaa\xe3\x71\x07\x90\xee\x66\xe0\x60\xf6\xcb\xfb\xef\x04\x3e\xb7\x83\xcf\x8f\xfd\xa1\x08\x25\xa2\x02\x8a\x52\x12\x46\x4b\x24\x2e\xe0\xb8\x22\x51\x82\x28\xe3\x12\x4d\x56\x10\x1a\x27\x48\x05\xc6\x68\x9a\x86\x49\x19\x41\x25\x9c\x22\x65\x0a\x16\x71\x18\x15\x15\x59\x44\x69\x52\x26\x05\xcc\x9b\xf4\x43\xce\x19\xd3\x7a\xab\x36\xe9\x81\xc9\x9d\x7a\xa6\xb1\xf4\xd9\x3a\xe7\xe9\x61\x62\xda\x1b\x49\x79\xbe\xd8\xec\x56\x5a\xc3\xb7\xe1\x8b\xd8\x41\x5b\x0c\x36\x7b\x78\x1e\x99\x9d\xd5\xf3\x1c\x86\x95\x66\xc5\xea\xb6\xa9\x15\xcc\x8e\xde\xef\x67\xb7\xcc\x1c\x63\xf6\x71\xc9\x7d\x65\xc4\x25\xef\x75\x42\xff\x18\x9e\x0d\xab\x3e\xbc\xbd\x37\x68\xe7\x11\x5b\xb7\xb1\xce\xfb\x4a\x18\x6c\x06\x72\x63\x3c\xdd\xca\x4c\x03\x88\x64\x7f\x08\xec\xdd\xb0\xd3\x9e\x09\x1f\x9a\x38\xee\xf5\x96\xab\x56\x87\xeb\xd6\x71\xeb\x75\xc9\xbe\x4e\x9f\xa4\xe1\x00\xd6\xae\xe7\xb7\xfd\xf5\xb5\x61\xcd\x56\x1c\x79\xdd\x98\x3e\x8a\xd6\x07\x45\x0c\xd1\xe7\x26\xfe\xd6\xeb\x15\x88\x4f\x11\xa7\x8d\xc6\xa4\x90\xce\xde\x5a\x0f\x13\x6d\xcf\x55\xf5\xb6\x0a\x77\xe1\xfb\xe6\xce\x5e\xbe\x73\x88\xf6\x08\x0b\xbb\xb5\x81\xd0\x5c\x6b\xfb\xd6\xad\xed\xfa\x84\x5d\x65\xa5\x9a\xa7\x23\xb6\xb0\xcd\xbe\xfe\x78\x5b\xc1\x0f\xe5\x53\x62\x54\x76\x7b\x3e\x43\x7e\x63\x32\xab\x5a\x67\xc8\x67\x98\x7f\xaf\x3f\x0b\x8d\x17\x0e\x7d\x6b\xf5\x74\x5b\xf4\xf5\xa7\x4c\x35\xf3\x6c\x71\x6e\x5d\x38\xbe\x70\x2d\xc5\xf8\x95\xb2\xc5\x3f\x94\xbc\xb3\xee\x57\xcf\xd4\x33\x36\x9a\x6a\xbd\xf9\xb0\x3a\x5f\x5d\x3f\xbf\xb4\x4c\xe9\xa5\xa6\x36\x56\x16\x31\x83\x9f\xeb\xed\xa7\xe5\xee\x79\xfc\x7e\xdd\xed\x18\xa3\x8e\xd6\x9c\xb3\x75\xfa\x5e\xd1\x6e\x3f\x5e\x95\xd7\x6e\x63\xfd\x0c\xde\x96\x0f\xcd\x26\xd5\xbb\xbe\x9e\x72\xc6\x76\xd3\xfd\xa8\x33\x97\xee\x5b\x31\x52\x04\x14\xac\x88\x14\x55\x41\x15\xba\x02\x23\x92\x2c\x01\x59\x42\x50\x98\x04\x28\xa2\xd0\x34\x4a\x63\x12\x4d\x57\x48\x58\x40\x08\x80\xe3\x88\x82\x53\x38\x4d\xe1\x94\x00\x0b\x18\x25\x88\x87\x45\xbc\x33\xfa\x56\x34\xb7\x6f\xc5\x11\x84\x4e\xef\x5b\xfd\xa7\xe1\xac\xf0\xdc\xbe\xb5\x16\xab\xd4\xa3\xbe\xb5\xe4\x98\x3f\xa3\x6f\x65\xb0\xed\x4c\xdc\x0e\xfa\xa2\xfe\xd4\x53\xab\xcd\x46\xa7\x7b\x3f\xdc\x28\xf7\xdd\xc5\x66\x62\xb5\xee\xb7\x3b\xc6\x1a\x0c\x88\x06\xfd\xf4\x4c\x90\x88\x30\xd7\xdf\xb8\xdb\xd6\xc3\xe8\x5e\x6c\x58\xac\xa4\xda\x4d\x71\xa1\xd2\xf2\xec\x41\xee\x8c\x1e\xdf\x56\x0f\xb3\x9a\xfa\xd1\x96\x57\xdd\x76\xfd\x7f\xab\x6f\x3d\xb7\x6f\x3b\xb3\x3d\xbf\x52\xb7\x93\xba\x74\xc1\xbe\xf5\x77\x8e\xf7\x13\xfb\xd6\x7f\xa9\x6f\x63\x2e\xd4\xb7\x9e\x1a\x67\xfd\xbe\x95\xab\x3c\xac\x2a\x93\x8f\x15\x81\x4e\xda\x8b\xd1\x72\xac\xee\xa6\x5d\x7d\x37\xc6\xbb\x2f\x54\x75\x27\x49\x8b\x6e\xfd\xe3\x7a\xa4\xcc\x1e\xaf\x81\x3d\xd3\x08\xea\x43\xd9\x22\xd3\xf1\x6c\x2b\x56\x5b\x6d\x73\xb4\xc2\xdb\x6f\xf3\x07\x6d\x3e\x7e\x99\x75\x09\xed\x61\x61\x58\xbb\xd6\x93\xba\x63\xde\x8b\xf5\xad\xa9\xc7\xbe\x1d\x9f\x8a\xbe\x3f\x81\x35\xf8\x01\x74\xd9\x1f\x2e\x85\x38\x7a\x27\x34\xd6\xeb\xe1\x9f\x53\xc7\x05\x42\x83\x51\xbb\xc7\x8c\x1e\xa1\x0e\xfb\x08\x7d\x51\xe5\xbc\x93\xd9\x92\x4f\x89\x3f\x1b\x75\x8c\x6b\x12\xf2\x24\xc1\xb9\xe8\x63\x3f\xb9\x3b\xed\x94\xfd\xb3\xb5\x8b\x8a\x4d\x52\xee\x24\x60\xd0\x94\x6b\x0f\xa7\x2c\xf4\xe5\x40\x7e\x13\x3a\x82\xec\x26\x72\x60\x58\x49\xd3\x5c\xa6\x5a\x4b\x2b\x5e\xaa\x52\x53\x56\x3c\x73\x96\x15\x2f\xab\x59\xb2\x90\x2c\x4d\x33\x60\x15\xd6\x3c\x75\xc2\x3b\x77\x4e\xf9\xb2\xda\xa7\x89\xc9\xd2\x3f\x13\x5a\xae\x05\xa2\xb7\x9c\xf8\x8a\xb8\x37\xa2\x14\xfb\xf5\xbb\x77\x79\x4a\x84\x0b\xd4\xe7\xe2\x8d\x61\x3a\x6e\x73\x4d\x48\xb4\x4d\x00\xc2\xad\x2b\x1d\x8d\x7f\x41\xcb\xd9\x78\xfc\xc3\xfd\x0a\x21\x4a\x69\xd7\xa1\xcb\x65\x4e\x85\x73\x60\x11\x46\x12\xc9\x06\xa2\x78\x3c\xe2\x9b\xa3\xdf\xe2\x27\x81\x73\xaf\xc7\x39\x03\x99\x7b\x24\x41\x21\x58\xf1\x83\x0c\x92\xd0\xf8\x77\xfa\x9c\x81\xc7\xe3\x50\x0c\x51\xec\x94\x84\x9b\xe3\x03\x11\x12\x9b\x7c\xf8\x92\xa2\xf2\x48\xfd\x28\xe1\x01\x8e\xb1\x0b\xc3\x0e\x36\x7b\x47\x10\x27\x9d\x0d\x74\x13\x9c\x03\x94\x06\xf6\xf0\xeb\xeb\x33\x61\xaa\x72\x61\x80\x87\x83\x50\x6e\x12\x0f\x34\xca\x01\x1d\xdc\x2b\x75\x09\xdc\x3e\xaf\x30\xf4\x94\x50\x75\x92\x26\xc9\x0a\x04\x57\x68\x5d\x42\x01\x9f\x57\x8a\x4f\x9f\xa8\x42\xf4\x54\x9b\x63\x25\x42\x17\x86\x9d\xda\x1a\x43\x3c\x4e\x35\x7e\xb6\xa1\x63\x37\xa0\x9d\x6b\xeb\x28\xbb\x30\xe4\x60\x5b\x69\x04\x63\x32\xa2\xe3\x5b\xdc\xce\x87\x75\xc4\xb3\x58\xf7\x96\x04\x30\x74\x1f\xdd\xc9\xd5\x7a\xe0\x71\xba\x4b\xe6\xb9\x5f\xd2\x4d\x7b\xa7\x03\x3e\x66\x16\x43\x2e\x83\x18\xce\xd8\x19\x67\xd9\x00\xbd\xab\x03\x2f\x02\xcf\x65\x55\x08\x5c\xf0\x0b\xe5\x54\x68\xf1\xab\x10\xcf\xc5\x17\xe3\x97\x07\xf2\xf8\xf0\xb6\x5c\xa4\x97\xb1\x63\x84\x5b\x51\x94\xb9\xd6\xbc\x0c\xb6\x42\x98\xb2\xb1\xc4\xee\xdc\x3c\x0b\x51\x94\x57\xe1\x1a\x0d\x8e\x87\x4b\xc4\x77\x74\x8d\xe8\x59\x08\xe3\xdc\x8a\xb5\x5b\x1f\xe0\xcd\xd1\x89\x76\x37\x47\xa7\x22\xa6\x28\x71\x81\x7e\xdb\xe7\x93\x87\xb8\xe4\xe8\x28\x7e\xfb\xeb\x59\xd6\x2d\x61\xd8\x5c\xbb\xe5\x5f\x6b\x7b\xa6\x41\x73\x05\x44\xf2\xb4\xe0\x07\xec\xd1\xcc\xc8\x23\x2c\x81\xfd\x7c\x3f\xc8\xe2\x9d\x8f\x38\xa1\x95\x65\x5f\x5a\x7c\xaa\x3f\x64\x72\xcd\x1d\xf6\x3b\x44\x39\x40\x13\x6f\x67\xbe\x0c\xda\x24\xd6\xb9\xc3\xb7\xa2\x9e\x1c\xbd\x8e\xfa\xa2\xce\x10\x61\x7d\xca\x78\xb3\xf8\xfd\xdb\x17\x37\xf4\xd1\xc9\xe3\xb9\xf0\x63\x05\x8a\x2b\x13\xbe\x8e\xfc\x57\xd9\x3f\x7c\xd8\x7c\x9e\x26\x21\xda\xe2\x4a\x24\x5e\xcf\xfe\xab\xb4\x49\x3c\x43\x3f\x4f\xad\xa4\x42\xc5\xf5\xdb\xdf\x5e\xff\xab\x74\xda\x1f\x28\x99\xa7\x47\xea\x6c\x57\xce\xad\xfd\x17\x05\x1e\xe7\x9e\x98\x00\x97\x6d\xe0\x51\xa6\xd1\x14\xea\x42\x2d\x3c\x4b\x44\x11\x1d\x72\xf2\xba\x4c\x61\x97\x0b\x5f\xc7\x8c\x0b\x61\xcf\x0f\x62\xe1\x64\xfb\x57\xb8\xcd\x31\xff\x93\x53\x7d\xef\x1c\xab\x20\x90\x07\x33\x8c\xbc\x68\x18\x2f\x27\x5b\x39\x83\x67\xee\x10\xe1\xcb\x97\xe0\x90\xf6\x6f\x7f\xfe\x09\x5d\x59\x86\x26\x87\x56\xd3\xae\xee\xee\x6c\xb0\xb5\xbf\x7e\xbd\x81\xd2\x09\x25\x43\x2e\x46\xe8\xcd\xc5\xa7\x93\x8a\xc6\x66\xb1\xb4\x0b\x89\x8f\x90\x66\x03\x88\x90\xc6\x20\x7c\x85\x66\x2d\x76\xc4\x7a\x4e\x06\xfd\x84\x30\xac\xf0\x42\xb4\x2a\xf3\x4a\x68\x99\xa8\xd1\xf9\x3d\xcb\xd1\xbe\x58\xa8\xd1\x1f\xb1\xed\x26\xb7\x5f\x02\x82\x46\x6c\x83\x1d\xb1\x5c\x8d\x8d\x5f\x93\xee\x3e\xed\x73\xd0\x74\x50\x77\x5c\x66\xc4\x7a\x37\x13\x3a\x5f\xd5\xd9\x2e\x3b\x61\xa1\x1a\x33\xae\x31\x75\x36\xfb\x34\xfd\xd8\x47\x3e\x36\x15\x73\x39\x63\x44\xe5\xe4\x2c\x92\xa5\x21\x89\xda\x27\x3e\x6d\x94\x68\x2c\x7f\xa0\x9f\xb3\xa2\x98\x6a\x09\x3f\x95\xfd\xd7\xed\x10\xc6\x91\x64\x85\x60\x96\x20\xdb\x61\xca\x59\xe0\x78\x52\xe9\x5f\x34\x43\x0a\x98\xa8\x2d\x12\xa6\xc1\x2e\xeb\x14\xf1\x29\x8e\xff\x05\x83\xa4\xbb\xc6\xd1\x1c\x52\x11\xef\x80\x04\x59\x06\x32\xb4\x12\xf4\x8d\xa0\x69\xbb\x08\xd2\xc4\xd8\xe8\xc0\x0c\x0c\xbe\xda\x6c\x81\x0c\xbd\x09\xa6\xb4\x14\xcc\x2f\x24\xfd\xd5\xdf\x11\xe4\xd0\x28\xe0\xd0\x5a\x93\xe9\x7e\x24\x0a\x0b\x8d\x20\x1c\x36\xd1\xab\x46\x4a\x71\x0a\x42\xa5\x8b\xd8\x9b\x9d\x48\x2d\xef\x3b\xc5\xc0\xb0\xec\x85\x09\xc6\xc3\x2e\x24\x0b\xb6\xe0\x34\x36\x48\xde\xac\xd6\x90\x64\xac\xd6\x1a\xb0\x81\x5b\x9b\xff\x17\x00\x00\xff\xff\xa6\x6a\x02\x7e\x2b\x8f\x00\x00") func account_mergeHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -128,7 +128,7 @@ func account_mergeHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "account_merge-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6a, 0x42, 0x81, 0x26, 0x5d, 0x26, 0xa6, 0x1d, 0xfe, 0x58, 0xa3, 0x33, 0xdf, 0x89, 0xc, 0x51, 0x78, 0x86, 0xa6, 0x67, 0x86, 0x3b, 0x81, 0x5d, 0x50, 0x17, 0x98, 0x2d, 0x50, 0x38, 0x62, 0xdf}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6d, 0x3a, 0x55, 0x79, 0x80, 0xdc, 0x87, 0x4e, 0x2c, 0x66, 0x25, 0xc8, 0x9d, 0x9d, 0xf2, 0x1, 0xc9, 0x76, 0x42, 0x95, 0x6d, 0x48, 0x27, 0xe6, 0x15, 0xbb, 0x4, 0xab, 0x4e, 0xd4, 0xa4, 0x14}} return a, nil } @@ -152,7 +152,7 @@ func baseCoreSql() (*asset, error) { return a, nil } -var _baseHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x79\x6f\xe2\x48\xf3\xf0\xff\xf3\x29\xac\xd1\x4a\x99\x68\x32\x1b\xdf\xd8\x33\xbf\x79\x24\x03\x26\x10\xee\x2b\x24\x59\xad\xac\xb6\xdd\x06\x27\xc6\x26\xb6\x09\x30\xab\xe7\xbb\xbf\xf2\x05\xb6\xf1\x09\x64\x9e\x7d\xa3\xd5\x2c\xe0\xea\xba\x5c\x5d\x5d\x5d\x5d\xdd\xfd\xed\xdb\xa7\x6f\xdf\x90\x81\x61\xd9\x73\x13\x8e\x87\x1d\x44\x06\x36\x10\x81\x05\x11\x79\xbd\x5c\x7d\xfa\xf6\xed\x93\xf3\xbc\xbe\x5e\xae\xa0\x8c\x28\xa6\xb1\x3c\x00\xbc\x43\xd3\x52\x0d\x1d\x61\xff\xa4\xff\xc4\x42\x50\xe2\x0e\x59\xcd\x05\xa7\x79\x0c\xe4\xd3\x98\x9f\x20\x96\x0d\x6c\xb8\x84\xba\x2d\xd8\xea\x12\x1a\x6b\x1b\xf9\x89\xa0\x3f\xdc\x47\x9a\x21\xbd\x1e\xff\x2a\x69\xaa\x03\x0d\x75\xc9\x90\x55\x7d\x8e\xfc\x44\xae\xa6\x93\x06\x73\xf5\x23\x40\xa7\xcb\xc0\x94\x05\xc9\xd0\x15\xc3\x5c\xaa\xfa\x5c\xb0\x6c\x53\xd5\xe7\x16\xf2\x13\x31\x74\x1f\xc7\x02\x4a\xaf\x82\xb2\xd6\x25\x5b\x35\x74\x41\x34\x64\x15\x3a\xcf\x15\xa0\x59\x30\x42\x66\xa9\xea\xc2\x12\x5a\x16\x98\xbb\x00\x1b\x60\xea\xaa\x3e\xff\xe1\xf3\x0e\x81\x29\x2d\x84\x15\xb0\x17\xc8\x4f\x64\xb5\x16\x35\x55\xba\x71\x84\x95\x80\x0d\x34\xc3\x01\xe3\x3a\x13\x7e\x84\x4c\xb8\x6a\x87\x47\x5a\x0d\x84\x7f\x6c\x8d\x27\x63\xa4\xdf\xeb\x3c\xf9\xf0\x7f\x2e\x54\xcb\x36\xcc\x9d\x60\x9b\x40\x86\x16\x52\x1f\xf5\x07\x48\xad\xdf\x1b\x4f\x46\x5c\xab\x37\x09\x35\x8a\x02\x0a\x92\xb1\xd6\x6d\x68\x0a\xc0\xb2\xa0\x2d\xa8\xb2\xa0\xbc\xc2\xdd\x8f\xdf\x41\x50\x72\x3f\xfd\x0e\x92\x8e\x5d\xfd\x3e\x01\x3d\x6a\xe5\xa5\xf3\x18\x74\x0c\x39\x8b\x58\x08\xea\x80\xdc\x05\x6f\xf5\xea\xfc\x63\x08\xd2\x47\x6b\x9b\x6b\xcb\x16\x34\x55\x77\x58\xdb\x09\xf6\x6e\x05\x05\xc9\x90\xa1\xa0\x5a\xd6\x1a\x9a\xa5\x1a\x9f\xd0\xe4\xa0\x88\xbc\x66\x40\x86\x02\x54\x14\x28\xd9\x6e\x43\xc3\x94\xa1\x29\x88\x86\xf1\x9a\xdd\xd0\x52\xe7\x3a\x34\xc3\xb4\xb2\xe1\x0d\x45\xf1\xc1\x2d\xa8\x69\x4e\xc7\x76\x55\x5a\xa6\x51\x9e\x0a\x0e\xd0\x1a\xb0\x6c\x61\x69\xc8\xaa\xa2\x42\x59\xd0\xa0\x3c\x2f\xde\x56\x5c\xef\x0a\x72\xa7\xea\x32\xdc\x0a\x21\x33\xd4\x2d\xe0\xba\x24\x4b\x30\xf4\x5c\xcd\x47\x5b\x1b\x2b\x68\x82\x7d\x5b\xc7\x5a\xce\x68\x7d\xe0\xe4\x2c\x2e\xca\xb5\xf5\xb4\xec\x36\xb4\xe0\xdb\x1a\xea\x52\x29\x11\x42\xcd\x57\x26\x7c\x57\x8d\xb5\xe5\xff\x26\x2c\x80\xb5\x38\x11\xd5\xf9\x18\xd4\xe5\xca\x30\x1d\xc7\xe9\x8f\x7e\xa7\xa2\x39\x55\x97\x92\x66\x58\x50\x16\x40\x29\x5b\x0c\xfa\xf3\x09\xa6\xe4\x77\xe6\x13\x98\x0e\xb7\x04\xb2\x6c\x42\xcb\xca\x6e\xbe\xb0\x4d\xd9\x8d\x10\x04\xcd\x30\x5e\xd7\xab\x02\xd0\xab\x3c\x96\x3c\x28\xa0\x9a\x25\x11\x07\xc3\x63\xe1\x06\x8e\xab\x74\x7c\x46\x31\xd0\x00\xfd\x09\x4d\x0a\x79\xd7\xa0\x91\x3b\x08\x96\x20\x12\x1e\x34\xf3\x5a\xac\x9c\x06\x0b\x3b\xf7\x0d\x58\x11\x07\xe4\x0c\x5f\xf9\x2d\xfc\x7e\x5a\x04\xd8\xf0\xf8\x30\x72\x01\x55\xcb\x16\xec\xad\xb0\xca\x47\xe9\x40\x1a\xab\xa2\x90\xb0\x28\x58\x30\x9a\x66\x03\xc3\xed\x4a\x08\x47\x17\x05\xc7\xfb\x84\x66\x4e\x78\x91\xdd\x48\xdc\x15\x1a\x0c\x1d\xfd\xe6\x7a\xcc\xa2\x03\xbf\xc7\x64\x41\xa9\xf6\xc0\xf9\xb2\xec\xdd\x8d\xaa\x2b\x9a\x3b\x68\x09\x32\xb4\x6c\x55\x77\x3f\x17\x6c\xbb\x30\x96\x50\x90\x8d\x25\x50\x8b\xb6\x70\x26\x4c\xe1\x30\x53\x07\x4b\x58\x24\xcc\x0c\xc5\x67\x19\x61\x66\x38\x8a\x5b\x15\x0c\x60\xbd\xd0\x25\x03\xa9\x1f\xdb\x14\xc5\xf7\x0a\x77\xc2\x3b\xd0\xd6\x50\x70\xfc\x3a\xcc\x40\x1c\x83\x2c\x4c\x21\x21\x64\x12\x56\xc0\xb4\x55\x49\x5d\x01\x3d\x33\x0e\xcf\x6b\x5a\x9a\x87\x7d\xc8\x53\x96\x83\xe4\x86\xa5\xe9\xbb\x16\x5f\x84\x9e\x07\xf8\xe1\xf8\xbd\x1e\xe8\xce\x54\xbc\x8f\xee\xcc\xc5\x9f\xc5\xb9\x3d\x58\x28\xc8\xc1\xdc\x30\x57\xc2\x52\x9d\xfb\x11\x65\x06\x0b\x31\xc8\xc2\x32\xc6\x7c\x60\x06\x85\xb8\xb7\x2c\x4a\xa1\xfc\xe4\xb0\x30\xe6\xc0\xa1\xf8\x13\xa9\x2c\xf4\x31\xd0\xd2\x34\x8a\xe0\x2e\xcd\xb7\xe3\x08\x8b\x20\x76\x1d\x66\x16\xf6\xa2\x4e\xc1\x6b\x5d\xeb\x77\xa6\xdd\x1e\xa2\xca\x1e\xed\x3a\xdf\xe0\xa6\x9d\x49\x41\xdc\x29\x9d\xfd\x02\x98\xfd\x6e\x96\x8d\xc9\xfd\x96\x82\x28\xe4\xf9\xb3\x01\x3d\x6f\x9e\x0d\x13\x73\xcc\xd9\xc0\x49\x13\x58\xbf\xc5\x98\x1f\x4e\xf9\x5e\xed\x84\xb7\xe5\x0c\x8d\x16\x7c\x2b\x4d\x39\x82\xa4\x70\x6b\x39\x4f\x69\xc7\x13\xdc\xc2\x12\xa6\xf8\xf9\x32\xf2\x25\xa3\x28\xd6\xd6\x9f\x0a\x16\x03\xf6\xe7\x7d\x85\x65\xf3\x7d\x7e\x19\x59\xbc\x26\x05\x61\x7d\x1f\x50\x9c\x9f\x7d\x4c\x57\x80\xa3\xd8\xa8\x91\x0d\x1c\x1b\x00\xb2\x81\x8b\x03\xc6\x3c\x73\x41\x68\xc7\x25\x16\x03\xf5\xa1\xb8\xbb\xbb\x11\x7f\xc7\x4d\x12\x20\x97\xaa\x2e\xac\x4c\x55\x82\x5f\xf4\xf5\x12\x9a\xaa\xf4\xd7\xdf\xd7\x05\x5a\x81\xed\x09\xad\x34\x60\xd9\x5f\x80\xbe\x83\x9a\x9b\xf3\x2f\xd0\x42\x51\xcd\xc4\x26\x8d\x69\xaf\x36\x69\xf5\x7b\x19\xf2\x08\x60\x3e\x3f\x70\x77\x83\x1c\x31\x9a\x81\x23\x90\xee\x0c\x1c\x6e\x0a\xd1\x69\x7e\x60\xfe\x06\x29\x23\x88\x2b\x7a\x01\x0c\xfc\xe3\x84\xef\x8d\x63\x28\xb4\xd5\xdc\x7a\xd3\x82\x7e\x53\x6b\xf2\x5d\xee\x88\xc2\x8f\x4f\xde\x72\x4f\x0f\x2c\xe1\xf7\xe0\x37\x64\xb2\x5b\xc1\xef\x7e\x93\x1f\xc8\x58\x5a\xc0\x25\xf8\x8e\x7c\xfb\x81\xf4\x37\x3a\x34\xbf\x23\xdf\xdc\x55\xa0\xda\x88\x77\xde\x97\x8f\x39\xc0\xf7\x29\x82\x31\xfa\xd0\x47\x5c\xeb\x77\xbb\x7c\x6f\x92\x81\xd9\x03\x40\xfa\xbd\x28\x02\xa4\x35\x46\xae\x82\xf5\x9d\xe0\x37\xcb\x45\x72\x15\xa7\x1c\x88\xef\xd3\xdc\x6b\x28\x57\x9e\x88\x2e\x7b\xfd\x49\x4c\x9f\xc8\xac\x35\x69\xee\xd9\x0a\x2f\xf4\x44\xc8\x1f\xb0\xc4\x18\x29\x23\xfc\x11\x12\x57\x01\x83\xce\xed\x6a\x3e\x1e\x76\x90\x95\x69\x48\x50\x5e\x9b\x40\x43\x34\xa0\xcf\xd7\x60\x0e\x5d\x35\x14\x5c\x98\x0a\xb3\x9b\x6f\x68\x3e\xfb\x81\xad\x1e\xf8\x0f\xde\x6d\x92\x2e\xf7\x96\x9d\x8b\x1f\x19\xf1\x93\xe9\xa8\x37\x0e\xfd\xf6\x09\x41\x10\xa4\xc3\xf5\xee\xa6\xdc\x1d\x8f\xb8\xd2\x77\xbb\x53\xcf\xd9\x8d\x27\xa3\x56\x6d\xe2\x42\x70\x63\xe4\x0f\xe1\x0f\x64\xcc\x77\xf8\xda\x04\xf9\x03\x73\xbe\xc5\xdf\x46\x6e\x47\x3c\x4f\xba\x3c\xf4\x17\x13\x0e\x4f\x12\xae\x88\xa7\x3a\x4f\xbe\x02\x14\xf6\x22\xee\x7f\x3a\x49\xc2\x2f\x9f\x10\xa4\xc6\x8d\x79\x64\xd6\xe4\x7b\xc8\x1f\xd8\x5f\xd8\xdf\xb7\x7f\x60\x7f\xe1\x7f\xff\xe7\x0f\xdc\xfd\x8c\xff\x85\xff\x8d\x4c\xbc\x87\x08\xdf\x19\xf3\x8e\x52\xf8\x5e\xfd\x3a\x51\x33\x05\xc6\x81\x33\x35\x93\x4f\xe1\xa3\x35\xf3\x7f\xa7\x68\xe6\x78\x4c\xf5\xf5\xb0\x1f\x87\x8b\x29\xe2\x30\x6c\x1f\x61\x74\x39\x46\x90\xb1\xa3\x2b\xe4\xe7\xc1\x03\xdc\x78\x3f\x4f\x9e\x06\x3c\xf2\x33\xdc\x23\xae\x93\x7a\xed\x45\x79\x8c\x23\x8c\xb1\x18\x74\xe3\xe2\x1c\x26\x86\x40\xe7\x72\x99\x84\x34\xc6\x69\xa4\x43\x46\xd9\x3d\x58\xd9\x31\xb7\x49\x61\xde\xd9\xdc\x26\x20\x8d\x73\x1b\xee\x24\x99\xdc\x3a\x23\x97\x0c\x15\xb0\xd6\x6c\xc1\x06\xa2\x06\xad\x15\x90\x20\xf2\x13\xb9\xba\xfa\x11\x7d\xba\x51\xed\x85\x60\xa8\x72\xa8\x66\x23\x22\xeb\x3e\xf8\xf5\xe5\x73\x7b\x57\x31\xd9\xbc\x8e\xb8\xcf\x7b\x78\xb2\x1c\xb2\xb5\x88\xb4\x00\x26\x90\x6c\x68\x22\xef\xc0\xdc\xa9\xfa\xfc\x0b\x45\x5f\xbb\x91\x42\x6f\xda\xe9\x78\xf2\x89\x40\x03\xba\x04\x11\x51\x9d\xab\xba\x1d\x7f\xe8\xad\x0e\x6b\x2a\x10\x55\x4d\xb5\x55\x68\x25\xc3\x05\x8b\xdc\x05\x00\xbd\xb5\x52\x41\x5f\x2f\x45\x68\x26\x03\xe9\xeb\xa5\x60\xad\x45\xa8\xdb\xa6\x83\x48\xd5\x6d\x38\x87\x66\x0c\x28\x31\x0f\x5e\x48\x62\x45\x03\xf3\x34\xac\xa1\x0c\x79\x02\x2e\x02\x8f\xe3\x5a\x02\xcb\x86\xa6\xb0\x81\xea\x7c\x61\x23\xd6\x12\x38\x7a\x88\xcb\x63\x2f\x4c\x68\x2d\x0c\x4d\x16\x34\x63\x93\x0f\xb4\x84\xb2\xba\x5e\xe6\xc3\x2d\xd4\xf9\x22\x0d\x2a\xa9\x24\xe0\x48\xe4\xe3\x7e\x17\x9d\xb3\x9d\x6b\x90\x5e\xd2\xcc\xb3\x4a\x7f\xc9\xeb\x15\xee\x12\xf4\x8a\x51\x68\x5c\xb1\x25\xad\x58\x07\x4b\x98\x00\x48\x93\x71\x40\x37\x4f\x94\x00\xc9\x1e\x71\x70\xae\x0a\x83\x49\xf2\xd9\x5a\x0c\x52\xa6\x05\xba\xf7\xb1\xbc\x5e\xe3\x42\xa0\xbe\x11\x27\x77\x0c\x6b\x65\xe8\x96\x91\x84\x88\xa2\xaf\x5d\x2d\xf8\xcc\x7b\x2b\x4a\x47\x49\x5c\x71\x27\x04\x28\xfa\xbd\x63\xd9\xa6\xe3\x56\xef\x0e\xa9\x4e\x46\x3c\xff\xc5\x87\x3b\xd6\x6c\x28\x4f\x71\xb2\x52\x43\x19\x6e\x4f\x9f\xaa\x9c\xec\x84\xc0\xd2\xe1\xf0\x58\xde\x04\x5f\xb5\x77\xc0\xc9\xaa\xf3\xfc\x4d\x5a\x77\x36\x96\x5a\x82\x52\x71\x8a\xba\xce\x30\xb2\x78\x7e\xe7\x54\x75\xc4\x97\x14\x7c\x13\xdb\xaf\x84\xa4\x48\x74\x58\x35\x49\xea\xcc\x47\x4e\x32\xbc\x9c\x52\xa8\x37\xfb\xba\xb7\xe1\x36\x69\x68\x48\x55\xf7\xb1\x9e\xe2\x49\xb3\x53\xf5\x14\x5f\xdc\xd9\x9b\x4e\x02\x8b\x60\xb5\xd2\x54\xb7\x86\x05\xb1\xd5\x25\xb4\x6c\xb0\x5c\x21\x4e\x10\xe0\x7e\x45\x7e\x19\x3a\x3c\x66\x34\x2d\x25\x18\x24\x38\xfc\x5c\x62\x31\x9e\xf7\x99\xc7\x14\xac\x7e\x5c\xc3\x8d\x26\x5e\x8a\x00\x73\x7f\x68\xf5\x6a\x23\xde\x9d\xcf\x57\x9f\xfc\x9f\x7a\x7d\xa4\xdb\xea\x3d\x70\x9d\x29\xbf\xff\xce\x3d\x1e\xbe\xd7\xb8\x5a\x93\x47\xb0\x3c\x61\x4e\x56\x7b\x1c\xd1\x51\x97\xf5\xd7\x1a\x10\x1d\x6e\xed\x77\xa0\x7d\xb9\x4a\x91\xf8\xea\xfb\x77\x13\xce\x25\x0d\x58\xd6\x91\xad\x79\xb5\x3b\xc9\x1e\x32\x78\x51\x7b\x4e\x24\x0d\xa8\x4b\x27\xdc\x13\xfc\xb8\xc9\x42\xbe\x2c\x81\xbe\x06\x9a\xb6\x73\x50\x41\xf9\x3a\xf5\x2d\x1c\xb7\xfd\xb8\xf7\x91\xa8\xc6\x24\xe6\x53\x7c\x60\xba\x66\x53\xa5\x08\xeb\xd8\x53\xed\x11\xa8\x10\xef\x31\xe1\x81\x63\xda\x6b\x0d\xa7\xc1\xf8\xf1\x39\x5a\x6c\x95\x40\xd4\x2d\xd8\xfa\xec\x0c\x26\x19\xe2\x79\xc3\x8a\x68\x9b\x10\x22\x5f\x54\xf9\xfa\xc7\xe9\xc4\x92\x84\x29\x45\x3e\x09\xc1\x75\xda\xab\x3a\xac\xa1\xa4\xbe\xb4\x63\xd0\xb4\xa1\x2c\x95\xc3\x84\x16\x45\xdf\x48\x16\x83\xde\xbb\xb1\x22\xda\xc9\x14\x28\xa2\xa7\x44\xb9\x6e\x32\x85\x38\xbc\xd7\x93\x78\x0d\x53\xba\x20\xd3\xa9\x2f\x37\xbc\x00\x98\xfb\x7a\xa3\xe5\xad\xbf\xef\x05\x67\x33\x99\xf4\x8a\x73\xc4\x4a\xd4\x57\x4c\xba\xb3\x5e\x73\x3e\xc7\x51\x6a\x17\x66\xde\x1d\x2a\x5a\xbd\x31\x3f\x9a\x20\xad\xde\xa4\x9f\xe5\x18\x5c\x97\x3d\x46\xbe\x60\x37\xc8\x15\xea\xff\x61\x15\x86\xc1\x69\x45\x54\x20\x41\xb0\x10\x53\x28\x89\x22\x48\xac\x22\xd1\x0a\x94\x15\x88\x4b\x28\x05\x19\x11\x4a\x18\x49\xa0\x04\x46\x12\x50\x22\x69\x91\x60\x58\x06\x13\x51\x56\x22\x14\xf6\xea\xfa\xc7\x27\x3f\x03\x77\x48\x9e\xff\x69\xc1\xa2\xee\xfb\x06\xc1\x6e\x10\xdb\x5c\xc3\xeb\x1f\xce\x88\x37\x59\x40\xe4\xb0\x7e\x7c\x1b\x5e\x2e\x47\x80\x09\x91\xb9\xe1\x04\xc3\xb6\x81\x88\x10\x59\xeb\x26\xd4\x80\x0d\x65\xe7\xfb\x9e\x42\x90\x5a\xb0\x6e\x10\x71\x6d\x23\xaa\x8d\xc8\x06\xb4\xf4\x2b\x1b\x59\x02\xdb\x19\x68\x15\xc3\x44\x6c\x77\xf2\x3e\x4f\x54\x5c\x66\xf7\xdb\xab\x10\x67\x18\x92\x45\x29\x96\xa1\x6e\x10\xec\xfa\xc7\xe9\x98\x18\x8a\x61\x59\x82\xa1\x19\x36\x1d\x51\x8e\x99\x1c\x33\x45\x9e\x8d\x6b\xcf\x16\xe3\xa1\x4a\x0e\xb5\xbc\x75\xea\xb3\x03\x2d\xaf\xae\x63\x1f\x15\x64\x85\xff\xee\xfc\xa0\xc8\xbc\xf2\xe3\x66\x0b\x19\x71\x74\x64\xa9\xff\x42\x51\x74\x18\xe7\x6f\x8b\xa1\xb3\x04\x41\xfa\xb3\x1e\x5f\x47\xaa\x4f\x39\x12\x79\x75\x3a\xd9\x02\xed\x71\xc5\x1e\xff\xa9\xca\x69\xbc\x05\xf5\x17\xe7\x5a\x9d\x8f\x27\x36\xf0\x85\x12\x1d\x99\x83\x5e\x7e\xfc\xf3\xd9\xad\x4b\xfe\x9c\x62\xcd\x19\xf3\x5c\x19\xda\x40\xd5\x2c\xe4\xc5\x32\x74\x31\xdd\xd8\x82\xa2\x95\x73\xf5\xe0\xe3\xf1\xf5\x10\xa4\x4a\x53\x78\x0b\xed\xf5\x28\xd4\x0b\x93\xb6\x99\x24\x37\xf4\xd5\x12\xf6\x4e\xee\x74\x3c\xe0\x23\x98\x1a\xa0\x31\x0a\x21\x27\x5b\x08\x7e\xbf\xd7\x23\x36\x4f\x36\xd6\xf6\x61\xaa\x1c\x6f\x63\x42\x67\x9c\xc9\x69\xe4\xc1\xae\x57\x72\x61\xd8\xbd\xe9\xf8\x5f\x63\xdb\x60\x8e\x64\xc1\x8e\xd2\x38\x36\xd0\x04\xc9\x50\xf5\x94\xc4\xb7\x02\xa1\xb0\x32\x0c\x2d\x25\xcf\x0e\x2c\x28\x28\x30\xed\x5d\xbb\x8f\x4d\x68\x41\xf3\x3d\x0d\x64\x09\xb6\x82\xbd\x15\xdc\x54\x8e\xfa\x2b\x0d\x6a\x65\x1a\xb6\x21\x19\x5a\xaa\x5c\xf1\x77\x14\x18\x0b\x04\x32\x34\xdd\xb9\x9b\x9f\x0e\x5c\x4b\x12\xb4\x2c\x65\xad\x09\xa9\x86\xe2\x0b\x0e\x54\x0d\xca\x79\x50\x3e\xeb\x29\x26\x94\xde\xf5\x52\x6a\xcd\xce\xed\x89\x29\x95\x93\x39\xe3\x62\xf9\x19\x59\xba\x8f\x2b\x2b\xf2\x65\x87\xba\x4c\x1a\xbf\x6b\xe8\x2b\x25\xe8\x99\x43\x61\x26\xad\xe3\xa1\x31\x19\x3c\x63\xa8\x0c\x55\x62\x5e\xcc\x36\xf3\x32\xd8\x45\x66\x8e\x6e\xb2\x52\xf2\x44\x71\x47\xc9\x33\x07\x49\xdf\x3b\x18\x6b\x53\xda\xef\xb4\x4a\x19\x9e\x02\x97\x73\x75\xf5\xfd\x7b\x7a\x96\x3d\xbd\x1f\xf8\x85\xb0\xe7\xaa\xd3\xdf\x78\x5d\x36\xa7\x92\x1d\x53\xf8\x6e\xf3\x94\x11\xce\x2d\x78\x4e\x25\x1b\xdb\xf6\x9d\x05\xe4\xef\x44\xcf\x02\xf1\xd2\xec\x89\x00\xc7\x1b\xe8\x73\xe0\x32\xc9\xed\xa1\x32\x28\xba\x2c\xa9\x96\xbf\xf7\x19\x11\x0d\x43\x83\x40\x0f\xc6\x2d\x55\x82\x82\x1e\x19\xa3\xbd\xdf\xa2\xe3\xf6\x61\x43\xa0\x10\x1b\xd1\x23\x5b\x12\xe3\x0f\x43\x25\xfd\x89\xdb\xec\x5d\xae\x05\xf7\x20\x06\xa4\xd6\xe4\x6b\x6d\xe4\xcb\x97\xb0\x06\xff\xf3\x13\x41\xaf\xaf\xf3\x70\x25\xb5\x0f\xb4\xf6\x7f\x47\x8a\x2c\x80\x2f\xa2\xd4\x18\xfa\x98\xc6\x3d\x0e\x33\x3b\x53\x72\x4d\xfa\x05\xba\x57\xf2\xfe\x86\x82\x63\x69\x99\xf4\xd7\x29\xa3\x69\x5e\x45\xff\x65\xc6\xd3\x1c\x2a\xbf\x6b\x44\x2d\x29\xec\x99\x63\x6a\x0e\xb5\xe3\x51\x35\xad\x41\xc6\xb8\x1a\xd9\xc5\x71\xaa\xad\x66\xec\x0c\xf1\xcd\x34\xcc\x59\xe1\x19\x97\x3f\x08\xe4\xcc\xe3\x8a\x8e\xc0\xd9\x83\x69\x72\xf1\xc4\x9e\x74\x62\xb7\x71\xa6\x0c\xe9\x73\x8e\xb4\xd9\xdc\xff\x64\x3e\x66\x6f\x05\xa8\xbf\x43\xcd\x58\xc1\xa4\x25\x57\x7b\xeb\xcc\x8e\xd6\x5a\xe2\x92\xb1\xbd\x15\x96\xd0\x06\x29\x8f\x9c\x79\x59\xda\x63\x4b\x9d\xeb\xc0\x5e\x9b\x30\x69\x75\x90\xa5\xaf\xff\xfa\xfb\x10\xc4\xfc\xf3\xdf\xa4\x30\xe6\xaf\xbf\xe3\x3a\x87\x4b\x23\x25\x73\x76\xc0\xa5\x1b\x3a\xcc\x0c\x8a\x0e\xb8\x8e\xd1\xf8\x92\xa9\x4b\x28\x88\xc6\x5a\x97\xdd\x65\x72\xc6\x04\xfa\x1c\xc6\xa7\x6e\xd1\x31\xd6\xd1\x84\x83\x6d\x0e\x63\x73\x61\x5d\x87\xa6\x50\xac\x07\x1c\x30\x65\x9a\x6b\x18\x71\xbe\x92\xfd\x95\x7f\xb8\x11\x02\x8b\xf5\xd8\xfb\x14\x4f\x86\xc6\xf7\x81\x9d\xea\x0f\xe2\x5b\x82\x3d\x1f\x90\x5c\xba\x14\x29\xd4\xc8\x2e\x31\xca\xa9\xe9\xf0\x77\xba\x9d\xca\xb4\xbf\x2f\x3a\xc8\x1d\x39\x31\x54\xd1\xe2\xa9\xec\x90\x33\x72\x80\x4d\x52\x37\x09\x1f\x21\x93\x58\x10\x91\x11\xf4\xb9\x41\x9c\x9e\x9a\xad\x50\x25\x98\x16\x20\xb8\x0f\x11\xd9\x58\x8b\x1a\x44\x56\x26\x94\x54\x37\xa1\x51\xbc\xd4\xef\xc4\xfa\xae\xf0\xce\xc5\x53\xdf\x55\x78\x77\xfc\x6f\x29\x8f\x2b\x58\xd1\x53\xa6\x44\xa7\x5c\x52\x3f\xb3\xca\xf4\xa0\x0e\x41\x53\x97\x6a\xda\xfc\xe0\xd2\xb5\xa8\x1f\x60\x1c\xb1\x75\x14\x55\x0e\x4c\x24\xd8\x14\x5b\x24\x90\xf2\x6c\xc4\xdd\x85\x9c\xb3\xdf\x76\xcc\x4f\x32\x4a\x60\xc2\xd9\xfd\x70\x71\x46\xb9\x7c\xcb\xe5\x84\x28\xb8\x1d\x39\x53\xa8\xcc\x3c\x4d\x11\x21\x53\xe7\x23\x17\x13\xb3\xf0\x8e\xee\x4c\x41\x73\x82\xe7\x64\x51\xeb\xc0\x06\xee\xaa\x6a\x46\x65\x39\x52\xe7\x26\x5c\x8e\x6c\x39\xf8\x8e\xab\x83\x2f\x81\x34\xa9\x5e\xf6\x1c\xbc\x29\xe5\x91\x67\xa0\xcc\xaa\xba\x3c\x03\x6d\x56\x91\x62\x11\xb4\xe1\xb5\xe5\x78\xa1\x62\xb0\x88\x7c\x85\x09\xaa\xae\xda\x2a\xd0\x04\x6f\x17\xe2\x9f\xd6\x9b\x76\x75\x83\x5c\xe1\x28\xc6\x7e\xc3\xd0\x6f\x04\x86\x60\xe4\x77\x8c\xfd\x4e\xb2\x7f\xa2\x04\x43\x10\x5f\x51\xec\x2a\xb6\x70\x9d\x8a\x1c\x17\xbc\x4a\x8c\x88\xa1\x8a\x3b\xc1\x36\x54\x39\x93\x10\x89\xd3\x95\x32\x84\x08\x61\x6d\xc1\xfd\xb4\x46\x50\xf5\xa3\xe3\xb8\xb2\xc9\x51\x2c\x4e\x97\xa1\x47\x0a\x40\x96\x85\xf8\xaa\x49\x26\x0d\x8a\xc4\xc8\x52\x32\x51\x82\x37\x89\x0a\xd2\x3a\xee\x6e\x92\x4c\x12\x34\xc6\xa0\x64\x19\x12\x74\x40\xc2\x1f\x13\x0a\x90\xa8\xa0\x6c\x29\x13\xa8\x78\xa3\xe5\xae\xb8\x14\x0c\x86\x96\x53\x14\xe3\xbe\x0c\x30\x9f\x9b\x70\x0e\x6c\xc3\xcc\x7e\xd7\x0c\x85\xe1\x4c\x39\xf4\x61\x25\xf9\xe7\x9b\x14\x10\x83\xa5\x2a\xa5\x5e\x06\xeb\x8a\xe1\xad\xa8\x09\x5b\xd9\xcc\xc4\xce\xe2\x04\x5d\xca\x62\x31\xd4\x45\xef\xbf\x05\x37\x48\xce\x26\x40\xd1\x15\xac\x14\x01\x2c\x4c\x60\x1f\x87\x3a\xfd\x3f\x9b\x10\x8b\x33\x6c\x29\x42\x78\xe4\x4d\xf8\x59\x4e\xef\x7c\xdc\x2c\x4a\x18\x4a\xb1\x74\x39\x91\x08\x4f\x9c\x7d\x72\x38\xd3\xb2\x30\x0c\xab\x50\xa5\x0c\x17\x23\x05\x45\xdd\x06\x07\x0c\x19\x4b\x4d\x50\x54\xa8\x65\x7a\x46\x0c\x23\x2a\x44\xb9\x17\x4f\x05\x2b\xfb\xc1\x8a\xeb\x36\x47\x0c\x8a\xaa\x94\xea\x20\x18\x2d\xa8\xfa\x1c\x5a\xb6\x70\xbc\xa6\x9b\x43\x8a\x66\xcb\xf5\x45\xac\x12\x09\x80\xdc\xc5\x73\x90\x3d\x96\x60\x18\x43\xd1\x78\x29\x22\xcc\xde\x7c\x15\xc3\x0c\xe2\x8f\x4c\x1a\x38\xc1\x10\x54\x29\x1a\xac\x67\x54\xd9\x68\x09\x02\x43\x4b\x59\x14\x8e\x26\xb0\x9e\xdf\x09\x31\x82\x22\xd9\x52\x9d\x10\xc7\x82\x9e\x6e\xc2\xa5\xf1\x0e\x85\x5f\xd0\x34\xf6\x2b\x0e\x86\x6e\xd9\x26\x50\x73\x86\x5d\x8c\x60\x50\xa2\x54\x87\xc4\x71\x21\x34\x45\xce\xc4\x4d\x92\x15\xb4\x94\x69\xe1\x84\x10\x8b\xe3\x32\xf1\x53\x38\x5e\xca\xa8\x70\xb2\x50\x28\x82\xd1\x28\x43\x96\x1a\x36\x70\xca\xe1\xdb\xef\x80\x26\xd4\xc1\x12\x0a\x92\xa1\xad\x97\x39\x7d\x8f\x26\x2a\x58\xb9\x18\x8b\x08\xde\xf5\x5a\x5f\x5b\x30\xd6\xe9\xb0\x6f\x04\x8a\x60\x68\x18\x7b\x29\xf5\x13\xa4\xdb\x9b\xc5\xf5\x72\x95\xe1\x3f\x3c\x2a\xd8\xe9\x54\x28\x41\x36\x8d\x55\x38\x20\x15\xe2\xee\xc3\xa3\x11\xd6\x53\x39\x1f\x45\x54\xbc\x81\x30\xb1\x72\x45\xb0\x8d\xa0\x9c\x2b\x89\x2a\x7e\x32\x55\xd2\x1b\x7e\xfd\x3d\x72\x0e\x19\xf7\x50\x7a\x7f\x0f\x72\x12\x2d\xe2\x64\x2d\x92\x94\x4b\x2b\xa1\x64\xd8\x8f\xba\xf3\x14\xba\x27\x97\x32\xf3\xc9\xdc\x28\x54\x76\xea\x73\xb4\x59\x28\x5c\x64\x7d\x57\x7b\x6c\xdf\xd1\xa3\x1e\xd9\xef\xb5\xf8\x41\xad\xdb\x6b\x54\x2b\x04\xce\x91\x04\xfd\x4c\x0d\x7a\xf5\xf1\xa8\x73\x37\x6b\x57\xee\xaa\x9d\x5a\x77\xd8\x69\x35\xfa\xe4\xb8\xc2\x3f\xcd\x1e\xa6\x71\x5d\xa5\x12\xc1\x1d\x22\xd5\xc7\xbb\xe1\xfd\xec\xa1\x33\xeb\x3f\x35\x1b\x9d\x87\x49\x7b\xf6\x40\x35\xee\x9a\x1c\xd1\xe9\x3d\x3d\xe1\xf7\xc3\x76\xb7\xd2\xe7\xee\xb9\x29\x3f\x6c\x4c\xe9\xce\xa0\x36\xe6\x1b\x0f\x8f\xfd\x5e\x61\x22\x84\x4b\x64\x34\x78\x6a\xb6\x3a\x78\xad\x45\x34\x7a\x43\xb2\xfa\xd8\x69\x74\x7b\xf5\x4e\xe3\x7e\xda\x1b\x4c\xf1\xe6\x13\xf1\xdc\x6d\x8c\x9b\xfd\xde\xb4\xc6\xf7\xb9\xf1\xac\x32\xac\x55\xfa\x8f\x78\xb3\x30\x11\xd2\x21\xc2\x51\xb3\xea\xe0\x89\xa3\x9e\xc8\x19\xc7\x37\x1f\x67\x23\x7c\xda\xee\xe3\xd3\x3e\x59\x9d\xde\x35\xa7\xc3\x0a\xc9\x4f\x07\xed\x7e\x0f\x1f\x36\x1f\xc8\xd9\xa8\xd9\x6f\x8d\x7a\xed\x76\x13\xbf\x3a\x75\x63\x1b\x32\xe6\xf3\x12\x2e\xf9\xb5\xed\xf1\x4d\x5f\x37\x08\xb9\xaf\x68\xcf\xb3\xc0\xe3\xfa\xe9\x32\x33\xfa\x32\x35\xbb\x17\x91\x34\x92\xdb\x73\x2b\xf7\xdd\xa3\x05\xf2\x05\x4d\xaa\xd9\x3d\xb5\xa7\x05\x75\xbb\xa1\x3e\x10\xad\xc6\xbf\x41\x9c\x6e\xf1\xcf\x67\x2f\x5e\xf8\xfc\x1d\xf9\x4c\xfd\xe9\xef\x76\xf8\x7c\x83\x7c\x3e\x64\xa5\x9d\x47\x3a\xb0\xd5\x77\xf8\xf9\xbf\x69\x86\x1a\xa7\x86\xc5\xa8\xe1\x37\x08\xf1\xa1\xd4\x22\xfb\x03\x6e\x10\xd4\x25\x66\xd9\xce\x10\xa3\xcf\x03\xdf\xe8\xe0\xc6\x50\x74\x4f\xb8\x30\x01\x22\x4a\x20\x41\x9a\x30\xda\x4b\xcb\x43\xdc\x20\x98\x27\x90\xb7\x0b\xfc\xf3\x77\x47\xc4\xcf\x9e\x29\x08\xaf\x70\xe7\xd0\x38\xd5\x89\x16\xe7\x8a\xf4\xb9\x22\xf1\x8a\x6f\x40\x1f\xa4\x65\x9f\xc0\x47\x6b\x39\x26\x4f\x31\x2d\x9f\xe8\x7b\x8b\x73\x85\x07\x5c\xd1\x0c\x83\x7d\xa8\x96\x3d\x02\x1f\xad\xe5\x98\x3c\xc5\xb4\x7c\xe2\x58\xed\x71\x95\xe3\x64\x93\x36\x04\x9c\xea\x64\x83\x4d\x01\xe1\x18\x80\xa2\x00\x8b\x89\x14\x4d\x33\x12\x09\x01\x4b\x89\x12\xab\xa0\x0a\x4a\x92\x40\x54\x70\x89\x40\x25\x82\xa1\x81\x2c\x33\x95\x0a\x81\x42\x11\x52\x34\x29\xca\x14\x25\xa3\x2c\xa0\x65\xa5\x82\x29\x4e\xcc\xc6\x8a\x15\x89\x11\x15\x80\x01\x56\xa2\x08\x0c\x13\x19\x9c\x46\xd1\x8a\xc2\xa2\x8a\x58\xa1\x68\x20\xa1\x24\x01\x65\x8c\xc4\x71\x40\x48\x38\x8b\xa3\x0c\x23\xe1\x04\x06\x68\x1c\xa5\x21\x4d\xa3\xde\xa8\x83\xc5\xa6\x1d\x5e\xb0\x49\xc7\x67\x23\x41\x0c\x4a\xb0\x24\x43\x93\xb9\x4f\x7d\xbf\x8e\x31\xee\x9e\x27\xda\x79\x9f\x47\x7f\x37\x08\xe9\xfc\x83\xf9\xff\x04\x3f\x62\xfb\x0f\xce\xd0\xc3\x71\x1c\x57\xbf\xb7\x19\xf5\xd6\x00\x7a\xa3\x3b\x5a\xd7\x9e\x38\x85\xaa\x57\xe4\x99\xc9\x0d\xbf\xa2\xd3\xd6\xdb\xa0\xf6\x3a\x57\xbb\xad\xed\x4a\xad\xae\x9f\xe7\xe3\x01\x06\xba\xc6\xe0\x69\x45\xbc\xd5\xc6\x35\xe5\x19\xab\xbe\xcc\x66\x5b\x7d\x67\xd9\x8a\xb9\x33\x87\x7a\x8f\x52\x20\xf3\xf4\xfc\x8c\x6d\x25\x07\x35\xf7\x28\x9a\x8a\x34\x77\x3e\xb5\xf6\xff\x70\x43\xe7\x9f\xcd\xe1\xfb\x86\x1b\x0c\x5f\xdd\x4f\x5c\xa3\xdb\xbe\x7f\x07\xf4\x70\xd9\xd7\xea\x1d\x1b\xbe\x3c\x89\x8b\xd5\x53\xab\x32\x9e\xb6\xfb\x0a\xbc\x17\x5b\xf2\xeb\xdb\x0b\xbb\xe9\x63\x9c\x6d\xde\x2a\x4c\x97\x17\x8d\x96\x2a\x6d\xc8\x5a\x95\xdb\x61\xb4\xbd\xb4\x67\x77\x0d\xb1\xd9\x5c\x83\x0d\x5f\x59\x3c\x32\x2d\x9e\x68\xfc\x7a\x54\x5d\xfa\xdd\x1e\xd9\x01\xbf\x56\xf8\x90\x3b\xfc\xdd\x85\xbf\xec\xff\x9e\xb9\x47\x8c\x1c\x72\x5c\x1d\xbd\x4f\x7a\xfc\xaf\xfe\xbb\x0a\xbc\x55\x6f\xda\xe9\xa4\x78\x87\x78\x87\xc1\x2f\x63\xec\x57\x34\x21\xb3\x8c\x42\x11\x34\x84\x34\x23\x63\x22\x5e\x11\x29\x91\x61\x15\x9c\x00\x8a\x8b\xb3\x42\xd1\x2c\xc0\x49\x05\x28\x18\x89\x12\x40\x46\x45\x0a\x17\x69\x82\x10\xd1\x8a\x08\x59\xf6\xca\xf5\x4c\x44\xa2\xed\x53\x69\x5d\x82\x44\x59\x1a\x25\x72\x9f\x7a\x43\x39\x49\xb1\x78\x46\x7f\x21\x52\xfa\x8b\xe7\xfe\x5d\xfd\xde\x0d\x9e\x5f\xb0\xde\x9a\x32\x50\xf1\xbe\x32\x23\xf5\x5d\xff\x7d\xba\xbd\x23\x1e\x56\xc6\xeb\xd7\xf7\x06\xd7\xb7\x6b\x58\x1b\xef\x56\xaa\x15\xfa\x59\x5b\xf2\x72\x7f\xf5\x50\xeb\x52\xcd\x8e\xc9\x36\x7a\x2f\x14\xf5\x06\xe8\x0d\xde\x6c\x77\xed\xb7\xc9\xa0\xd1\x79\xbf\x63\x76\x83\xe9\x2d\xe0\x0c\x17\xb5\xdb\x55\x42\x06\x39\x9a\x72\x0f\xdb\xfb\x25\xa6\xd5\xbb\x9b\xcd\xdb\xfa\xa5\x2d\xed\x86\xbf\x2c\xb6\xd2\xb8\xe5\xf8\x89\x5a\x9b\x0f\x07\xe6\x86\x26\x36\x6f\x60\x70\xd7\xb7\x5f\xd0\x87\x37\xf8\x52\x1b\xdd\xe9\x0c\x47\xb6\x37\xf7\xba\x5a\xd1\xdf\x20\x58\xdf\xa2\xfc\x62\x71\x7b\xf7\xca\xec\xf8\xfa\xb2\xa2\x37\xbd\xae\x98\xd0\x15\x78\x2b\xc9\x9c\x82\xae\xc0\x71\xd5\xd7\x0f\xb5\xdb\x0f\xf8\xf3\xcc\xa9\x5c\x57\xc0\x2e\x63\xc6\x6e\x99\x04\xe2\xdb\x0d\xc6\x56\xd0\x6f\x28\xf6\x0d\xc5\x10\x14\xfd\xee\xfe\x97\x6a\xae\x38\x46\xe3\x78\xee\x53\x12\x67\x49\x96\xae\xe0\x2c\x9d\x61\xcc\xb9\xa6\xfc\xaf\xfc\xab\x3e\xb6\x55\x72\x77\xbb\x1b\xb7\xab\x95\xba\x5e\x67\x9b\x38\xba\x7d\xa9\x7e\xb5\xd0\xb9\x6d\x6d\x5a\x9b\x5f\xd8\xa3\x3c\x9e\x3d\x81\xea\x3d\x68\xb8\xa6\xcc\x27\x98\x72\xf2\xdf\xff\xe7\xa6\x8c\x86\x4d\x39\x27\xba\x2a\xb0\xe7\xeb\xd4\x60\x2b\xa5\x44\x25\x6d\xca\x99\xbf\xdd\x3c\x11\x4d\x7c\x9e\x8c\x9f\x86\x26\x36\x63\x24\x4e\xc3\x42\xc6\x26\xb6\xa7\x61\xa1\x62\x13\x9d\xd3\xb0\xd0\x51\x2c\xe4\x69\x58\x2a\xb1\xe9\xc0\x69\x58\x98\xd8\x1c\xe6\x32\xfb\xf1\x2e\x92\xfd\xc9\x2e\x82\xba\x41\x98\xa2\x59\xaf\x94\x5d\x69\x67\xf7\x9e\xb4\xd3\x19\x22\xa7\x22\x78\x93\x87\x7f\x3e\xdb\xc6\x59\xf3\xb1\x1b\xe4\xb3\x62\x1a\xcb\xb3\xf2\x13\xce\x0c\xb4\x54\xd2\xe8\x03\x32\xca\x09\xca\x0b\xf7\xcb\xc8\x29\x10\xc1\x84\x5d\x59\xeb\x32\x34\x3d\xf5\x9d\x96\x15\x76\x65\xf4\xd2\xa6\xe7\x6a\x30\x3f\x7b\xf0\x01\xd9\xeb\x34\xad\xf9\x1e\x64\xff\x99\xfc\x50\xad\x9d\x9a\xb1\xf9\xd7\x69\xcd\xf3\x75\xfb\xcf\xe8\x87\x6a\xed\x8c\x1e\xff\xe1\x5a\xcb\x71\x9c\x09\x7b\x4f\xcf\x28\x00\x2c\xb5\x09\xef\x54\xe7\x9c\x5a\x96\x9a\x18\xdc\x14\x3c\xb6\x26\x3f\xbc\x21\xd3\xc3\x9b\x5c\x44\x44\xd4\xed\xa5\x0d\xe4\xb9\x78\xc8\x98\xfb\x3c\x15\x4f\xcc\xa1\x9c\xcc\x0f\x1d\xc5\x93\x16\xe6\xe4\xe2\xa9\x44\xbb\xea\xc9\xfc\x30\x51\x3c\xe9\xa1\x4e\xd9\xfd\x83\x97\x08\x76\xf2\x0a\xa1\x4b\x84\x3b\xa9\x9b\x05\x2f\xd0\xa7\x42\xcb\xe6\x12\x14\x45\xa6\x42\x01\x14\x55\x14\x1a\x62\x04\x43\x00\xa8\xa0\x8a\x8c\x53\x18\xa8\xd0\x0a\x8e\x4b\x98\xc2\x02\x11\x07\xb8\xac\x28\x92\x88\x56\x2a\x0c\x45\x55\x08\x1a\xc8\x10\xa7\x29\x16\x78\x33\xfb\xb3\x56\xad\x43\x19\x21\x22\x98\x28\xa7\x26\x5d\x29\x14\xcb\x48\xd8\xfa\x4f\x23\x3d\xda\x9b\x61\xb7\xe9\x17\xa8\x12\x2f\x4b\xa3\xc5\x4c\xee\xb4\xfa\x2d\x9c\x4b\x44\x65\xf0\x68\x37\xdb\xed\x5f\xb3\x07\x66\xf3\xa0\x3e\x57\x41\x6d\x4d\x75\xa8\x2e\xe7\xce\x50\xb9\x20\x25\x5a\x8d\x4d\x00\x43\xdf\x79\xf7\x5f\x71\x39\x5f\x62\x0f\xb8\x3c\xa7\x1e\xb0\xe5\x1b\x06\xb5\xae\x74\x87\xd9\xdb\x97\xf1\x53\xfb\x99\xdd\xf0\x73\x63\x5c\x05\x70\xc6\x4c\xd5\x86\x11\x42\xd3\xa1\x99\x56\xe8\x2b\xa8\xbc\xbe\xbf\x6e\x5c\xf4\xec\x60\xcd\xae\x5e\x76\xaf\xd2\x68\x4c\xa3\xda\x5b\xbf\xf3\xd6\x63\x1a\xcd\x5f\x38\x49\x0e\x07\x8c\x08\x9e\x7a\x70\x32\xb9\x7f\x6e\x69\x26\x31\x16\x47\x35\x8c\x78\xe3\x4d\x76\x3d\x20\xfb\xa3\xfa\x7c\x57\xab\xde\xce\xa5\xf5\x1c\xbf\x6b\x9b\xf5\xee\xba\x8d\x8e\x27\xc4\xb0\x0f\xda\xd3\xea\xe6\xe7\xcf\xab\x70\xb6\x21\x9c\x6e\x1d\x26\xc9\xc6\x1d\xe0\x63\xcf\x3d\x20\x57\x4d\xb5\x90\x5a\xd6\xa0\x26\x3e\x3c\x3e\xe3\x75\xed\x71\x06\xcc\x07\x7a\xba\xdd\x88\x33\xe2\xae\x77\x3f\x5f\xe9\x04\x37\xae\x2d\x5a\x8d\x15\x25\x6e\xc7\xad\x99\x9b\x2d\xe0\x2a\x4b\xcb\xd7\xc7\x3c\x63\xba\x9d\x9a\x4c\x70\x75\x5f\x3f\x83\xfe\x57\x4d\x7c\x3b\x83\x7e\x37\x46\xbf\xb6\x36\x08\xc3\x26\xa9\xb7\xda\x80\xdf\xae\x86\xb7\x84\xd1\xec\x7d\xfd\x85\x55\x46\x3b\xd5\xc2\x34\xa5\xdb\x78\x5a\x0e\x67\x73\x73\x3d\xfe\x3a\xe1\x02\xf9\x97\xd2\x81\x3e\x7f\xa6\xfc\xa5\xe9\x93\x3a\xfb\x7a\x22\xfd\x90\x2d\xcd\xb9\x04\x5b\x38\x45\x17\x97\xb4\x85\xdf\xf9\x2e\x3c\x5d\xfc\xf3\x51\x9d\xd6\x0d\x0e\xdd\x3d\xb6\x41\x2a\xd3\xfb\xd7\x19\x44\x5c\x67\x99\x3f\x8e\x46\xea\x09\x2b\x24\x74\x5c\x2d\x2b\xb2\x50\xa9\xc8\x22\x60\x01\x25\x8b\x04\x41\xb0\x62\x85\x51\x64\xc0\x28\x04\x59\xa9\x54\x44\x0c\x28\x04\x21\x02\x92\x66\x80\x4c\x49\xa8\xac\xb0\x24\x2d\x93\xf2\x95\xbb\x3e\x8a\x9d\x13\xaf\x7a\x93\xe9\x2c\x27\x4f\xa2\x6c\x05\x4b\x5d\x77\xdb\x3f\x0d\x47\x49\xfe\x82\x40\x87\x69\x0e\xdf\x87\xaf\x62\x1b\x6f\x72\xc4\xec\xe1\x65\x64\xb6\x97\x2f\x8f\x28\xaa\xdc\x31\x56\xa7\x55\x59\xa2\xfc\x68\x73\x3f\xbb\xe5\x1e\x09\x6e\xef\xe3\xdd\xbf\x0c\x1f\xef\xfd\x99\x6f\x3d\xba\x03\xfb\x60\xfe\xb2\xed\x82\xe9\x80\xa5\xab\xbf\x14\x8b\x85\xa8\x64\x98\xbd\xe7\xc7\x5f\xd5\xd9\xfd\x6b\xc3\x68\x07\x3e\x9c\xe3\xfa\x94\xd9\x0e\xe3\x7b\x78\xdf\x34\x58\xe7\x11\x5f\xab\xff\x7a\x7b\x7f\x1d\x56\x87\x46\x8f\xbb\x57\x95\xc1\xe8\xb1\x6e\x74\x16\xef\xf6\x4e\x9a\x10\x5a\x63\x50\x1b\x52\xd8\xfc\x55\xb6\x1a\x4d\x50\xed\xcd\x36\x28\x35\xbe\x7d\x58\xcc\xd0\xc7\xf9\xab\x89\xd6\xaa\x03\x9e\xec\x81\xc6\x03\xde\x5e\x4a\x16\xf1\xbc\xe9\x2c\x55\x91\x9c\x8c\xcc\x6e\xa7\x80\x6f\x8f\x18\x6d\x9a\x6f\xf7\x96\x02\x8f\x7c\xbb\x7a\x5b\x45\x3b\xe8\xfd\xdd\xce\x5e\x6c\x7a\x98\xf6\x84\x82\xdd\xca\xc0\xd8\x5e\x73\xfb\xde\xa9\xed\xfa\x94\x5d\xe5\xa5\x9a\x27\x23\x31\xb7\xcd\xbe\xfe\x74\x5b\x99\x1e\xda\x77\x13\x99\xc8\xe9\xcf\x67\xd0\xef\x99\xbb\xc9\xe4\x0c\xfa\x1c\xf7\xbf\xf3\x67\x89\xbe\xb5\x7a\xba\x2e\xfa\xfa\x73\xa6\x98\x79\xba\x38\xf7\x5d\x38\xb6\xf0\x55\x8a\xe1\x2b\xa5\x8b\x7f\xe6\x0c\x6d\x52\x3c\x37\x6d\xd7\x87\xb5\x27\xfd\x17\xfa\xb0\xa1\x6b\xa4\x58\x91\x74\x9e\xa5\x46\x93\xcd\x6b\x5f\x7e\xba\x6f\x8a\xd5\x11\x3e\x9f\x3c\x58\xbd\xfe\xf4\x1d\x7b\x7a\xb0\x1b\xe4\x7d\x9b\xe5\xe6\x93\x6d\xbf\x3e\x5b\x3c\xc8\xea\x4a\xef\xf4\x70\xa9\x46\x19\xcb\xaf\x3c\x0a\x7e\xd5\x2e\xee\x5b\x31\x9a\x04\x14\x4a\x93\x50\x04\x34\xa9\xe0\x92\x2c\x02\x59\x64\x28\x5a\x54\x08\x92\x64\x48\x86\x52\x24\x1a\xa7\x71\xb2\x02\x64\x40\x40\x99\x60\x25\x59\x56\x50\x85\x66\x51\x1c\x23\x08\x91\xf6\x7c\x2b\x7e\x9e\x6f\xc5\xf3\x7d\x2b\x43\xb0\x19\xbe\xd5\x7b\x1a\x9e\xf1\x9d\xeb\x5b\x6b\xb1\x97\x7a\xe4\x5b\xfb\x78\xed\x96\xeb\x93\xd4\x53\xb5\x4e\xd8\xcd\x87\x46\x1f\x1b\x11\x1c\xda\x85\xaf\x03\xe6\x7e\x44\xeb\x3d\x8c\x63\xe1\x4c\x95\x77\x2d\xdb\xeb\xd2\xe9\xbe\x95\x1b\xf3\xcf\xea\xb3\x08\x1b\x9b\x9a\x65\xb6\xab\x7a\xbb\xb5\xb6\x6e\x51\xea\xc1\xbe\xaf\x57\xcd\xb9\x61\xad\x17\x9d\xe1\xed\x94\x7e\x9c\xbe\x90\xf6\x66\xb6\x5b\x58\x95\xa9\x3d\x26\x6b\x5d\xb8\xed\x77\xe9\xfb\x37\x49\x79\xbb\x6f\x63\xe8\x4c\xab\xbe\xbe\x6e\x74\x72\xce\x0c\x5a\xca\x4b\xeb\xee\xdf\xe5\x5b\xcf\xf5\x6d\xe7\xf6\xe7\xee\xa6\xb3\x34\x2f\xe8\x5b\xb9\xca\x53\x87\xe1\x2a\x2f\xda\x9c\x1f\x40\x54\x9e\x4e\x2b\x0f\x4d\xa9\x3e\xdc\xd2\xc3\xdb\x8d\xd6\x7c\x93\x88\x69\x1d\xa3\xc0\x3d\xd1\x52\x31\x0f\xe7\xa5\x7d\xeb\xff\xc8\xb7\x71\x17\xf2\xad\x0c\x79\x68\xdf\x2a\xad\x8b\x7f\xf8\xc5\xdd\xd3\x72\x46\x2c\x24\xce\x6c\xef\xe6\xcf\x3b\xb5\x63\x0e\xd8\xfe\x83\x38\x1e\x6e\x00\xd9\xee\x74\x8c\x31\x3a\xc0\xfa\x1a\xd6\xfa\xda\x91\x1a\x96\x21\xf6\xb1\xce\x74\xcd\xbd\x34\xad\xc9\x4b\x5f\x05\x7a\x93\x56\xc7\xb6\xdc\x58\x0d\x9f\xef\xbb\xf7\x5f\x5b\x83\xfa\xae\x49\xee\xaa\xf3\x8b\xc7\xad\x22\x0e\x19\x5c\x16\x81\x28\xa2\x38\x29\xe2\x15\x80\x4a\x04\x46\xa2\x12\xa8\x60\x32\x03\x24\x56\x94\x2a\x18\x43\x60\x0a\xab\x50\x80\x10\x65\x9a\x85\x12\x20\x64\x86\x51\x44\x14\x4a\x94\x74\xb5\xaf\xeb\x3b\xc3\xb7\xe6\x25\x27\x48\x94\x65\xa9\xac\xf2\x17\xef\x69\x38\x7b\x75\xae\x6f\xad\xc7\x5e\xea\x91\x6f\x2d\x9b\x9b\x48\xf7\xad\xf5\xfb\xb5\x86\xd9\x9d\xbb\x4e\x83\x7c\xd8\x6e\x6c\x54\xae\xd7\x1e\x78\x85\xb6\x45\x4a\x23\xc5\x5d\xd7\xbc\x9b\xd7\x56\x5f\xb5\x87\xe7\xee\x72\x2b\xd9\x14\xa9\xf6\x14\x7c\xb9\xb5\x5f\xb6\x74\x57\xa6\x9e\xef\x49\x9e\xac\x6b\x92\xa5\x90\x34\xcf\x2d\xaa\x77\xe3\xe9\xc0\xd2\x19\xe5\xa9\xfe\xef\xf2\xad\xe7\xfa\xb6\x73\xfb\x73\x07\x7d\xa5\xeb\x17\xf4\xad\xbf\x33\x27\xf3\x11\xbe\xf5\x54\xdf\xc6\x5d\xc8\xb7\x9e\x3a\x87\xf1\x7d\xeb\x4e\x5c\xc9\xe2\x78\xab\x6e\x61\x43\x92\x3a\x72\x73\xb8\xd1\x46\xcd\xaf\xe6\xec\xeb\x33\xbc\x63\x5e\xda\x5b\x83\x7b\x53\x56\x0f\xb3\xc9\xbd\xf5\xd8\x81\xb0\xf5\xf2\xc8\xae\x2c\xf1\x89\x81\x2f\x4d\x38\x1b\xc3\x6a\x9f\xa3\x1e\x3b\xcd\xaf\xfd\x05\xd7\x1a\x8e\x5e\xb5\x7a\xe5\xfe\xb6\x89\x73\x05\xe3\xd6\x94\xec\x72\xd6\xa9\x53\x65\x13\xcb\xf1\x93\xa7\xf6\xde\x1a\x6e\x57\xc1\xe6\x5b\xf7\x68\x1a\xaf\xb2\xcb\x61\x1a\xcd\x58\xae\x4a\x38\x52\xea\x8c\x65\xaa\xb4\x93\x8f\xca\x6f\x94\x89\x5e\x10\x18\xf9\x26\xac\x5e\xe1\xee\x70\x03\x75\x70\xf6\x65\xd9\xc3\x58\x22\x38\xdd\x13\x7d\xb8\x7a\x3d\x7c\x96\xe6\x31\x51\x64\x30\x6a\x75\xb9\xd1\x13\xd2\xe6\x9f\x90\x2f\x87\x03\x99\x52\x6f\xf8\x3b\xe0\xb8\x2c\xcf\x99\xec\x1e\x73\x7a\x38\x0a\x2a\xf7\x2e\xc2\xe3\x6b\xf9\x2e\xac\x6d\x1f\x6d\xa6\x04\x61\xd2\x51\x49\xbc\x27\x37\x48\x96\x44\xa1\xcb\xea\xc2\xa7\x03\x5c\x48\x8e\x03\xc6\x44\x11\x62\x04\xa3\xdc\x27\x70\x1b\xbf\x5e\x2f\xf6\xfd\x42\x5c\xc7\xb0\x26\x71\x9e\x44\x38\x66\x45\xfb\xf3\xbc\x6e\x22\x87\x81\xdd\x84\xce\x0e\xcb\xbb\x5e\x2f\xfe\xfd\x42\xf2\xc5\xb0\x26\xc9\x97\x44\x38\xf7\xed\xc4\x0e\xd7\x8a\xed\xad\x3b\x28\x44\x38\x68\x40\x08\xab\x46\xb8\x88\x74\x51\xb2\x49\xc2\x9d\xc4\x58\x70\xb7\x53\xc2\x8b\x75\xe0\xa3\x2f\xb9\xa4\x6a\x2e\xf3\x5a\x4b\x0b\x5e\xea\xa5\xa6\x54\xf7\xe5\x94\xd0\x5d\x56\xb2\x64\x22\x59\x92\x66\xb0\x55\x58\xf2\xd4\xe5\xfe\xdc\x15\xf5\xcb\x4a\x9f\x46\x26\x4b\xfe\x4c\xd6\x72\x35\x10\x8f\x9e\x62\xdf\x2f\x24\x5f\x0c\x6b\x92\x38\x49\x84\xa3\xdc\x27\xc5\x15\xfe\x09\x9e\xde\xff\x2e\xc4\xac\x87\x2c\x89\xc7\x10\x99\x28\x6b\xc1\x21\x38\x59\x27\x5f\x86\x3f\x5f\x88\xd3\x10\xc6\x24\x76\xe3\x04\x4b\x47\x6b\x5e\xa0\x77\x08\x2d\x04\x1d\x2c\xf7\xc1\xba\x7b\x9f\x5c\xb1\x13\x3c\x23\x77\xe6\x65\x22\x8f\x5c\x74\xec\x46\xba\x91\x5b\xe4\x0e\xd0\x37\xee\xf5\xd5\xe9\x9c\x87\x2e\x25\x3f\x81\xe1\x18\xa7\xe1\x1b\xce\x43\x0c\xc6\x6e\xb8\x3b\x00\xa5\xb3\x95\x78\x03\xfb\xf9\x0c\x26\x5f\xec\x9e\xca\x6a\x22\x78\x4a\xdc\x28\xee\xdc\x81\xf0\x74\x1e\xc3\x58\xc2\xb7\x07\xfa\xe3\x64\xf4\xfd\xee\x07\xde\x74\x6e\xbc\xe1\xf7\x7c\x7e\xfc\x83\x5b\x0b\x71\x94\x32\xe4\x8b\xfb\xf3\x13\x4e\x66\xe7\x80\x22\xe5\x66\xc5\x38\x3f\x1e\xf0\xcd\xd1\x79\xe5\x49\xcc\x85\x0e\x95\x2e\xc6\xe0\xca\xb0\xec\xb9\x09\xad\x44\x3e\xc3\x47\x54\x17\xe2\x35\xd4\xe0\x1a\x99\x35\xf9\x11\x1f\x39\xe6\xba\x35\xde\x9f\x0a\xfb\xe3\x88\xf5\x05\xb0\x16\x17\xe0\xd9\x3d\x76\xbb\xdf\xcb\x3c\xae\x3e\xc2\x73\xfc\xcc\xee\x24\xb5\x7a\x87\x70\x5f\x88\xc3\x03\xb2\x62\x4a\x4d\x3e\x5a\x3c\xd0\x6f\xca\xc1\xe3\x99\xaa\xf6\x06\x82\x73\x2c\xd8\x3f\xeb\xb7\x10\xff\xb1\x13\xfe\x6f\x8e\x0f\xf3\xcf\x9b\x12\x9e\xed\x92\x52\xf0\x39\xfc\xc7\x67\x9f\x45\xbd\x53\x02\xca\x33\xfd\x54\x2a\xc6\x82\x6c\x66\xcc\x52\x04\xe8\x60\x73\x75\x7d\xee\x60\x1e\x43\x17\x36\x81\xe0\xc4\x81\xdc\x3b\x7f\x6f\x82\x8b\x81\xd2\x98\x3d\x1c\x33\x7c\x26\x9b\xaa\x5c\x98\xc1\x70\xa4\x71\x02\xd3\xc6\x4a\x58\x5d\x8a\x6f\x1f\x57\xf2\x25\xcb\x91\xd9\xca\x49\x92\x24\x0b\x60\x6f\x2f\x27\x80\x8f\x2b\xed\xea\xe0\xd3\x44\x48\xb8\x48\x38\x22\x84\xb1\x72\xac\x72\x61\x9c\x24\x83\xcf\xfc\x01\xc7\xa9\xca\xcf\x56\xf4\xfe\x62\x49\xa7\x73\x9f\xaf\xeb\x28\xba\x30\xcb\xc1\xa6\xe6\xe3\xbb\xdd\x8f\x38\x0a\xeb\xf5\x52\x6c\x1d\xe1\x2c\x38\xd4\x25\x30\x68\x7b\xaf\xc4\x3e\xe7\xb5\x1e\x70\x9c\x6e\x92\x79\xe6\x67\x9b\xb2\x43\x24\x7c\xf7\xd8\x19\x0c\x1f\x23\x8b\x71\x2e\xc7\xef\xdb\x8e\x5d\x7a\x96\xcd\xa0\x3b\x7d\xbd\x0c\x7b\x2e\xaa\x42\xcc\xa5\xce\x99\x03\x7c\xb1\xeb\xd4\xce\xe6\x2f\x86\x2f\x8f\xc9\xe3\xdb\xdc\x72\x39\xbd\x8c\x1e\x23\xd8\x8a\x72\x99\xab\xcd\xcb\xf0\x56\x88\xa7\x6c\x5e\x02\x8e\x35\xc3\x78\x5d\xaf\xce\xe3\x28\x8a\xab\xf0\x1b\x0d\xae\x8b\x4b\xe4\x6f\x05\x54\x53\x70\xef\x02\xba\x04\x87\x71\x6c\xc5\xfa\xad\xcf\xe0\xcd\xd1\x0d\x77\x37\x47\xd7\x24\xa6\x08\x71\x01\xbf\xed\xe3\xc9\xe3\xb8\x64\x74\xe4\x60\xbd\x98\x76\x4b\x28\x36\x57\x6f\xde\x71\xfc\x47\xe7\x22\x1a\xba\x00\x64\xd9\x84\x96\x75\xae\x42\x73\x09\x44\x72\x11\x89\x89\x1b\x1f\xb0\x04\xef\xe7\xdb\x41\x16\xee\x7c\x8e\x13\x7a\x59\x14\xa1\x1f\x85\x3b\xf8\xec\xdd\xea\xf4\x49\x5d\x26\xd6\xdc\xb0\x3f\x71\xa9\x2e\x8a\xd2\x8f\xa1\x1c\x94\x7b\x23\xba\x10\xb7\x49\xa8\x73\xc3\xb7\xa2\x96\x1c\x42\x7e\x69\x63\x88\xa0\x3e\x25\xde\x4c\x47\x17\xbb\x4c\xfc\xf2\x8a\x3e\xba\xae\x3c\x97\xfd\x58\x83\xe2\xc2\x84\x6e\x8f\xff\x30\xfd\x87\x6f\xa8\xcf\x93\x24\x04\x5b\x5c\x88\xa4\xbb\xf0\x3f\x4c\x9a\xc4\x8b\xf7\xf3\xc4\x4a\x6a\x54\x5c\xbe\x20\x21\xf5\x61\x32\xed\x2f\x96\xcc\x93\x23\x35\xa3\x1b\x45\x7d\x38\x90\xe0\x23\xba\x76\x1c\x7b\xe2\x04\xb8\x6c\x07\x8f\x22\x8d\x4e\xa1\x2e\xd4\xc3\xb3\x48\x14\x91\x21\x67\x5e\x97\x49\xec\x72\xc3\xd7\x31\xe2\x42\xbc\xe7\x0f\x62\xe1\xc9\xf6\x47\x98\xcd\x31\xfe\x93\xa7\xfa\xfe\x62\xab\x33\xb1\x0c\x5d\x96\x78\xb2\x82\x93\xd1\x39\xdc\xf9\x6b\xc8\xd1\x30\x3c\x04\x93\xc1\x59\xd2\x95\x77\x17\xe0\x30\xf1\x26\xbd\x14\x4e\x93\x60\x33\x38\xf6\x6e\xb9\xbc\x00\x8f\xfe\x95\xe3\x29\x5c\xed\x2f\xd3\xcc\x61\xe5\x92\xef\x35\x7a\xe9\x66\x06\x63\xe9\x6f\x36\xa8\xb3\xbb\xc0\xc2\xde\x31\xaa\xc8\xda\x76\x50\x5d\x98\xb2\xbc\x9d\x50\x48\x00\x64\xb8\x0f\x6b\x83\x7c\xbb\x20\x1a\xc6\xeb\xc9\x2c\x66\xe0\xcc\x0d\x98\xbf\x7c\x91\xa1\x0d\x54\xcd\x42\xbe\xfd\xe7\x3f\xc8\x95\x65\x68\x72\xa8\xb4\xea\xea\xfb\x77\x1b\x6e\xed\xeb\xeb\x1b\x24\x1d\x50\x32\xe4\x62\x80\xde\x52\x46\x3a\xa8\x68\xac\xe7\x0b\xbb\x10\xf9\x08\x68\x36\x03\x11\xd0\x18\x0b\xc1\x72\x9b\xeb\x72\x91\x9f\x08\x41\x64\x55\x7e\x84\x6c\xe0\x9c\x81\x2e\x15\xa3\xf3\xb2\xc2\x85\x26\xc5\x6d\x2a\x82\xf0\xcc\x05\xab\x44\x6c\xd9\xac\x65\x2d\x54\xc5\xd0\xb9\x05\x7b\x6e\x01\xdf\x65\xd9\x8c\xe3\x2d\xc0\x70\xb8\x16\xf0\xb8\xf8\xb3\x70\xf9\xad\x2a\x0b\x4a\xa8\x0a\xa8\xd1\xfe\x3d\x45\xb8\x3e\x59\xa4\xd1\x1f\xf1\xad\xbb\xde\xbe\x30\x0c\x19\xf1\x0d\x7e\xc4\xf7\x6a\xfc\x38\x56\x10\xe1\x3e\xed\xf7\x90\xe9\xa0\xee\xa8\x71\xc4\x8f\x27\xa3\x56\x6d\xe2\xfc\x54\xe7\x3b\xfc\x84\x47\x6a\xdc\xb8\xc6\xd5\xf9\x8c\xea\x3a\x19\x5a\xb1\xaf\x42\x2c\x43\x7d\x39\x65\x44\xe9\xe4\x94\xce\xa5\x71\x12\xd5\x4f\x3c\x9b\x9e\xa8\x2c\xdf\xb5\xe7\xd4\x19\xa6\x6a\xc2\xcf\xf0\xfd\xcf\xf5\x10\xe6\x23\x49\x0b\x41\xf2\x34\xdb\x60\xca\x69\xe0\x38\xd7\xfe\x3f\x54\x43\x0a\x33\x51\x5d\x24\xac\x0e\x5c\xd6\x28\xe2\x99\xdf\x7f\x83\x42\xd2\x4d\xe3\x28\xb5\x5e\xd4\x3a\x06\x5e\x6d\xcc\x78\xd8\x41\x64\x60\x03\xc7\xc4\x10\x79\xbd\x5c\x21\x92\xb1\x5c\x69\xd0\x86\xae\x0c\x0e\xa4\x0e\xa1\x0c\x65\x77\x6f\x4d\xa8\x7c\xde\x36\x90\x8d\x61\xbe\x46\xa4\xdc\x67\x22\x1d\xb1\xfc\x5b\x9f\x90\x09\xff\x38\xf9\x91\x52\x3e\xe7\x04\x8f\x3e\xd8\x71\xcd\x5c\x75\x32\xe2\xf9\x2f\xfe\x73\x87\xf3\x24\x52\x5e\xad\x62\x51\x7a\x6e\xe5\x63\x32\xd1\x70\xd1\x63\x26\xe5\xf0\x20\x95\x43\x37\x36\xe4\x85\xa8\x1e\x8f\x74\x99\x34\xfd\x80\x3a\x87\x5c\x28\x22\x3f\x50\x8a\xc4\xe2\x99\x44\x0a\x54\x82\xd7\x47\xfd\xc1\xe1\x52\xe8\x94\xf6\x99\xb5\xd4\x47\x18\xdc\x1f\xfc\x77\x1a\x1a\xb0\x25\x60\x49\x40\x86\x01\x40\x66\xfd\x50\x14\x28\x77\xde\x9d\x01\x1d\x4d\xd9\x46\x00\xa3\x45\x99\x9f\xfe\x5f\x00\x00\x00\xff\xff\x49\xc4\xbe\x0d\xcf\xcb\x00\x00") +var _baseHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x7d\x79\x6f\xe2\x48\xf3\xf0\xff\xf3\x29\xac\xd1\x4a\x99\x68\x32\x1b\xdf\xd8\x33\xbf\x79\x24\x03\x26\x10\xee\x2b\x24\x59\xad\xac\xb6\xdd\x06\x27\xc6\x26\xb6\x09\x30\xab\xe7\xbb\xbf\xf2\x05\xb6\xf1\x09\x64\x9e\x7d\xa3\xd5\x2c\xe0\xea\xba\x5c\x5d\x5d\x5d\x5d\xdd\xfd\xed\xdb\xa7\x6f\xdf\x90\x81\x61\xd9\x73\x13\x8e\x87\x1d\x44\x06\x36\x10\x81\x05\x11\x79\xbd\x5c\x7d\xfa\xf6\xed\x93\xf3\xbc\xbe\x5e\xae\xa0\x8c\x28\xa6\xb1\x3c\x00\xbc\x43\xd3\x52\x0d\x1d\x61\xff\xa4\xff\xc4\x42\x50\xe2\x0e\x59\xcd\x05\xa7\x79\x0c\xe4\xd3\x98\x9f\x20\x96\x0d\x6c\xb8\x84\xba\x2d\xd8\xea\x12\x1a\x6b\x1b\xf9\x89\xa0\x3f\xdc\x47\x9a\x21\xbd\x1e\xff\x2a\x69\xaa\x03\x0d\x75\xc9\x90\x55\x7d\x8e\xfc\x44\xae\xa6\x93\x06\x73\xf5\x23\x40\xa7\xcb\xc0\x94\x05\xc9\xd0\x15\xc3\x5c\xaa\xfa\x5c\xb0\x6c\x53\xd5\xe7\x16\xf2\x13\x31\x74\x1f\xc7\x02\x4a\xaf\x82\xb2\xd6\x25\x5b\x35\x74\x41\x34\x64\x15\x3a\xcf\x15\xa0\x59\x30\x42\x66\xa9\xea\xc2\x12\x5a\x16\x98\xbb\x00\x1b\x60\xea\xaa\x3e\xff\xe1\xf3\x0e\x81\x29\x2d\x84\x15\xb0\x17\xc8\x4f\x64\xb5\x16\x35\x55\xba\x71\x84\x95\x80\x0d\x34\xc3\x01\xe3\x3a\x13\x7e\x84\x4c\xb8\x6a\x87\x47\x5a\x0d\x84\x7f\x6c\x8d\x27\x63\xa4\xdf\xeb\x3c\xf9\xf0\x7f\x2e\x54\xcb\x36\xcc\x9d\x60\x9b\x40\x86\x16\x52\x1f\xf5\x07\x48\xad\xdf\x1b\x4f\x46\x5c\xab\x37\x09\x35\x8a\x02\x0a\x92\xb1\xd6\x6d\x68\x0a\xc0\xb2\xa0\x2d\xa8\xb2\xa0\xbc\xc2\xdd\x8f\xdf\x41\x50\x72\x3f\xfd\x0e\x92\x8e\x5d\xfd\x3e\x01\x3d\x6a\xe5\xa5\xf3\x18\x74\x0c\x39\x8b\x58\x08\xea\x80\xdc\x05\x6f\xf5\xea\xfc\x63\x08\xd2\x47\x6b\x9b\x6b\xcb\x16\x34\x55\x77\x58\xdb\x09\xf6\x6e\x05\x05\xc9\x90\xa1\xa0\x5a\xd6\x1a\x9a\xa5\x1a\x9f\xd0\xe4\xa0\x88\xbc\x66\x40\x86\x02\x54\x14\x28\xd9\x6e\x43\xc3\x94\xa1\x29\x88\x86\xf1\x9a\xdd\xd0\x52\xe7\x3a\x34\xc3\xb4\xb2\xe1\x0d\x45\xf1\xc1\x2d\xa8\x69\x4e\xc7\x76\x55\x5a\xa6\x51\x9e\x0a\x0e\xd0\x1a\xb0\x6c\x61\x69\xc8\xaa\xa2\x42\x59\xd0\xa0\x3c\x2f\xde\x56\x5c\xef\x0a\x72\xa7\xea\x32\xdc\x0a\x21\x33\xd4\x2d\xe0\xba\x24\x4b\x30\xf4\x5c\xcd\x47\x5b\x1b\x2b\x68\x82\x7d\x5b\xc7\x5a\xce\x68\x7d\xe0\xe4\x2c\x2e\xca\xb5\xf5\xb4\xec\x36\xb4\xe0\xdb\x1a\xea\x52\x29\x11\x42\xcd\x57\x26\x7c\x57\x8d\xb5\xe5\xff\x26\x2c\x80\xb5\x38\x11\xd5\xf9\x18\xd4\xe5\xca\x30\x1d\xc7\xe9\x8f\x7e\xa7\xa2\x39\x55\x97\x92\x66\x58\x50\x16\x40\x29\x5b\x0c\xfa\xf3\x09\xa6\xe4\x77\xe6\x13\x98\x0e\xb7\x04\xb2\x6c\x42\xcb\xca\x6e\xbe\xb0\x4d\xd9\x8d\x10\x04\xcd\x30\x5e\xd7\xab\x02\xd0\xab\x3c\x96\x3c\x28\xa0\x9a\x25\x11\x07\xc3\x63\xe1\x06\x8e\xab\x74\x7c\x46\x31\xd0\x00\xfd\x09\x4d\x0a\x79\xd7\xa0\x91\x3b\x08\x96\x20\x12\x1e\x34\xf3\x5a\xac\x9c\x06\x0b\x3b\xf7\x0d\x58\x11\x07\xe4\x0c\x5f\xf9\x2d\xfc\x7e\x5a\x04\xd8\xf0\xf8\x30\x72\x01\x55\xcb\x16\xec\xad\xb0\xca\x47\xe9\x40\x1a\xab\xa2\x90\xb0\x28\x58\x30\x9a\x66\x03\xc3\xed\x4a\x08\x47\x17\x05\xc7\xfb\x84\x66\x4e\x78\x91\xdd\x48\xdc\x15\x1a\x0c\x1d\xfd\xe6\x7a\xcc\xa2\x03\xbf\xc7\x64\x41\xa9\xf6\xc0\xf9\xb2\xec\xdd\x8d\xaa\x2b\x9a\x3b\x68\x09\x32\xb4\x6c\x55\x77\x3f\x17\x6c\xbb\x30\x96\x50\x90\x8d\x25\x50\x8b\xb6\x70\x26\x4c\xe1\x30\x53\x07\x4b\x58\x24\xcc\x0c\xc5\x67\x19\x61\x66\x38\x8a\x5b\x15\x0c\x60\xbd\xd0\x25\x03\xa9\x1f\xdb\x14\xc5\xf7\x0a\x77\xc2\x3b\xd0\xd6\x50\x70\xfc\x3a\xcc\x40\x1c\x83\x2c\x4c\x21\x21\x64\x12\x56\xc0\xb4\x55\x49\x5d\x01\x3d\x33\x0e\xcf\x6b\x5a\x9a\x87\x7d\xc8\x53\x96\x83\xe4\x86\xa5\xe9\xbb\x16\x5f\x84\x9e\x07\xf8\xe1\xf8\xbd\x1e\xe8\xce\x54\xbc\x8f\xee\xcc\xc5\x9f\xc5\xb9\x3d\x58\x28\xc8\xc1\xdc\x30\x57\xc2\x52\x9d\xfb\x11\x65\x06\x0b\x31\xc8\xc2\x32\xc6\x7c\x60\x06\x85\xb8\xb7\x2c\x4a\xa1\xfc\xe4\xb0\x30\xe6\xc0\xa1\xf8\x13\xa9\x2c\xf4\x31\xd0\xd2\x34\x8a\xe0\x2e\xcd\xb7\xe3\x08\x8b\x20\x76\x1d\x66\x16\xf6\xa2\x4e\xc1\x6b\x5d\xeb\x77\xa6\xdd\x1e\xa2\xca\x1e\xed\x3a\xdf\xe0\xa6\x9d\x49\x41\xdc\x29\x9d\xfd\x02\x98\xfd\x6e\x96\x8d\xc9\xfd\x96\x82\x28\xe4\xf9\xb3\x01\x3d\x6f\x9e\x0d\x13\x73\xcc\xd9\xc0\x49\x13\x58\xbf\xc5\x98\x1f\x4e\xf9\x5e\xed\x84\xb7\xe5\x0c\x8d\x16\x7c\x2b\x4d\x39\x82\xa4\x70\x6b\x39\x4f\x69\xc7\x13\xdc\xc2\x12\xa6\xf8\xf9\x32\xf2\x25\xa3\x28\xd6\xd6\x9f\x0a\x16\x03\xf6\xe7\x7d\x85\x65\xf3\x7d\x7e\x19\x59\xbc\x26\x05\x61\x7d\x1f\x50\x9c\x9f\x7d\x4c\x57\x80\xa3\xd8\xa8\x91\x0d\x1c\x1b\x00\xb2\x81\x8b\x03\xc6\x3c\x73\x41\x68\xc7\x25\x16\x03\xf5\xa1\xb8\xbb\xbb\x11\x7f\xc7\x4d\x12\x20\x97\xaa\x2e\xac\x4c\x55\x82\x5f\xf4\xf5\x12\x9a\xaa\xf4\xd7\xdf\xd7\x05\x5a\x81\xed\x09\xad\x34\x60\xd9\x5f\x80\xbe\x83\x9a\x9b\xf3\x2f\xd0\x42\x51\xcd\xc4\x26\x8d\x69\xaf\x36\x69\xf5\x7b\x19\xf2\x08\x60\x3e\x3f\x70\x77\x83\x1c\x31\x9a\x81\x23\x90\xee\x0c\x1c\x6e\x0a\xd1\x69\x7e\x60\xfe\x06\x29\x23\x88\x2b\x7a\x01\x0c\xfc\xe3\x84\xef\x8d\x63\x28\xb4\xd5\xdc\x7a\xd3\x82\x7e\x53\x6b\xf2\x5d\xee\x88\xc2\x8f\x4f\xde\x72\x4f\x0f\x2c\xe1\xf7\xe0\x37\x64\xb2\x5b\xc1\xef\x7e\x93\x1f\xc8\x58\x5a\xc0\x25\xf8\x8e\x7c\xfb\x81\xf4\x37\x3a\x34\xbf\x23\xdf\xdc\x55\xa0\xda\x88\x77\xde\x97\x8f\x39\xc0\xf7\x29\x82\x31\xfa\xd0\x47\x5c\xeb\x77\xbb\x7c\x6f\x92\x81\xd9\x03\x40\xfa\xbd\x28\x02\xa4\x35\x46\xae\x82\xf5\x9d\xe0\x37\xcb\x45\x72\x15\xa7\x1c\x88\xef\xd3\xdc\x6b\x28\x57\x9e\x88\x2e\x7b\xfd\x49\x4c\x9f\xc8\xac\x35\x69\xee\xd9\x0a\x2f\xf4\x44\xc8\x1f\xb0\xc4\x18\x29\x23\xfc\x11\x12\x57\x01\x83\xce\xed\x6a\x3e\x1e\x76\x90\x95\x69\x48\x50\x5e\x9b\x40\x43\x34\xa0\xcf\xd7\x60\x0e\x5d\x35\x14\x5c\x98\x0a\xb3\x9b\x6f\x68\x3e\xfb\x81\xad\x1e\xf8\x0f\xde\x6d\x92\x2e\xf7\x96\x9d\x8b\x1f\x19\xf1\x93\xe9\xa8\x37\x0e\xfd\xf6\x09\x41\x10\xa4\xc3\xf5\xee\xa6\xdc\x1d\x8f\xb8\xd2\x77\xbb\x53\xcf\xd9\x8d\x27\xa3\x56\x6d\xe2\x42\x70\x63\xe4\x0f\xe1\x0f\x64\xcc\x77\xf8\xda\x04\xf9\x03\x73\xbe\xc5\xdf\x46\x6e\x47\x3c\x4f\xba\x3c\xf4\x17\x13\x0e\x4f\x12\xae\x88\xa7\x3a\x4f\xbe\x02\x14\xf6\x22\xee\x7f\x3a\x49\xc2\x2f\x9f\x10\xa4\xc6\x8d\x79\x64\xd6\xe4\x7b\xc8\x1f\xd8\x5f\xd8\xdf\xb7\x7f\x60\x7f\xe1\x7f\xff\xe7\x0f\xdc\xfd\x8c\xff\x85\xff\x8d\x4c\xbc\x87\x08\xdf\x19\xf3\x8e\x52\xf8\x5e\xfd\x3a\x51\x33\x05\xc6\x81\x33\x35\x93\x4f\xe1\xa3\x35\xf3\x7f\xa7\x68\xe6\x78\x4c\xf5\xf5\xb0\x1f\x87\x8b\x29\xe2\x30\x6c\x1f\x61\x74\x39\x46\x90\xb1\xa3\x2b\xe4\xe7\xc1\x03\xdc\x78\x3f\x4f\x9e\x06\x3c\xf2\x33\xdc\x23\xae\x93\x7a\xed\x45\x79\x8c\x23\x8c\xb1\x18\x74\xe3\xe2\x1c\x26\x86\x40\xe7\x72\x99\x84\x34\xc6\x69\xa4\x43\x46\xd9\x3d\x58\xd9\x31\xb7\x49\x61\xde\xd9\xdc\x26\x20\x8d\x73\x1b\xee\x24\x99\xdc\x3a\x23\x97\x0c\x15\xb0\xd6\x6c\xc1\x06\xa2\x06\xad\x15\x90\x20\xf2\x13\xb9\xba\xfa\x11\x7d\xba\x51\xed\x85\x60\xa8\x72\xa8\x66\x23\x22\xeb\x3e\xf8\xf5\xe5\x73\x7b\x57\x31\xd9\xbc\x8e\xb8\xcf\x7b\x78\xb2\x1c\xb2\xb5\x88\xb4\x00\x26\x90\x6c\x68\x22\xef\xc0\xdc\xa9\xfa\xfc\x0b\x45\x5f\xbb\x91\x42\x6f\xda\xe9\x78\xf2\x89\x40\x03\xba\x04\x11\x51\x9d\xab\xba\x1d\x7f\xe8\xad\x0e\x6b\x2a\x10\x55\x4d\xb5\x55\x68\x25\xc3\x05\x8b\xdc\x05\x00\xbd\xb5\x52\x41\x5f\x2f\x45\x68\x26\x03\xe9\xeb\xa5\x60\xad\x45\xa8\xdb\xa6\x83\x48\xd5\x6d\x38\x87\x66\x0c\x28\x31\x0f\x5e\x48\x62\x45\x03\xf3\x34\xac\xa1\x0c\x79\x02\x2e\x02\x8f\xe3\x5a\x02\xcb\x86\xa6\xb0\x81\xea\x7c\x61\x23\xd6\x12\x38\x7a\x88\xcb\x63\x2f\x4c\x68\x2d\x0c\x4d\x16\x34\x63\x93\x0f\xb4\x84\xb2\xba\x5e\xe6\xc3\x2d\xd4\xf9\x22\x0d\x2a\xa9\x24\xe0\x48\xe4\xe3\x7e\x17\x9d\xb3\x9d\x6b\x90\x5e\xd2\xcc\xb3\x4a\x7f\xc9\xeb\x15\xee\x12\xf4\x8a\x51\x68\x5c\xb1\x25\xad\x58\x07\x4b\x98\x00\x48\x93\x71\x40\x37\x4f\x94\x00\xc9\x1e\x71\x70\xae\x0a\x83\x49\xf2\xd9\x5a\x0c\x52\xa6\x05\xba\xf7\xb1\xbc\x5e\xe3\x42\xa0\xbe\x11\x27\x77\x0c\x6b\x65\xe8\x96\x91\x84\x88\xa2\xaf\x5d\x2d\xf8\xcc\x7b\x2b\x4a\x47\x49\x5c\x71\x27\x04\x28\xfa\xbd\x63\xd9\xa6\xe3\x56\xef\x0e\xa9\x4e\x46\x3c\xff\xc5\x87\x3b\xd6\x6c\x28\x4f\x71\xb2\x52\x43\x19\x6e\x4f\x9f\xaa\x9c\xec\x84\xc0\xd2\xe1\xf0\x58\xde\x04\x5f\xb5\x77\xc0\xc9\xaa\xf3\xfc\x4d\x5a\x77\x36\x96\x5a\x82\x52\x71\x8a\xba\xce\x30\xb2\x78\x7e\xe7\x54\x75\xc4\x97\x14\x7c\x13\xdb\xaf\x84\xa4\x48\x74\x58\x35\x49\xea\xcc\x47\x4e\x32\xbc\x9c\x52\xa8\x37\xfb\xba\xb7\xe1\x36\x69\x68\x48\x55\xf7\xb1\x9e\xe2\x49\xb3\x53\xf5\x14\x5f\xdc\xd9\x9b\x4e\x02\x8b\x60\xb5\xd2\x54\xb7\x86\x05\xb1\xd5\x25\xb4\x6c\xb0\x5c\x21\x4e\x10\xe0\x7e\x45\x7e\x19\x3a\x3c\x66\x34\x2d\x25\x18\x24\x38\xfc\x5c\x62\x31\x9e\xf7\x99\xc7\x14\xac\x7e\x5c\xc3\x8d\x26\x5e\x8a\x00\x73\x7f\x68\xf5\x6a\x23\xde\x9d\xcf\x57\x9f\xfc\x9f\x7a\x7d\xa4\xdb\xea\x3d\x70\x9d\x29\xbf\xff\xce\x3d\x1e\xbe\xd7\xb8\x5a\x93\x47\xb0\x3c\x61\x4e\x56\x7b\x1c\xd1\x51\x97\xf5\xd7\x1a\x10\x1d\x6e\xed\x77\xa0\x7d\xb9\x4a\x91\xf8\xea\xfb\x77\x13\xce\x25\x0d\x58\xd6\x91\xad\x79\xb5\x3b\xc9\x1e\x32\x78\x51\x7b\x4e\x24\x0d\xa8\x4b\x27\xdc\x13\xfc\xb8\xc9\x42\xbe\x2c\x81\xbe\x06\x9a\xb6\x73\x50\x41\xf9\x3a\xf5\x2d\x1c\xb7\xfd\xb8\xf7\x91\xa8\xc6\x24\xe6\x53\x7c\x60\xba\x66\x53\xa5\x08\xeb\xd8\x53\xed\x11\xa8\x10\xef\x31\xe1\x81\x63\xda\x6b\x0d\xa7\xc1\xf8\xf1\x39\x5a\x6c\x95\x40\xd4\x2d\xd8\xfa\xec\x0c\x26\x19\xe2\x79\xc3\x8a\x68\x9b\x10\x22\x5f\x54\xf9\xfa\xc7\xe9\xc4\x92\x84\x29\x45\x3e\x09\xc1\x75\xda\xab\x3a\xac\xa1\xa4\xbe\xb4\x63\xd0\xb4\xa1\x2c\x95\xc3\x84\x16\x45\xdf\x48\x16\x83\xde\xbb\xb1\x22\xda\xc9\x14\x28\xa2\xa7\x44\xb9\x6e\x32\x85\x38\xbc\xd7\x93\x78\x0d\x53\xba\x20\xd3\xa9\x2f\x37\xbc\x00\x98\xfb\x7a\xa3\xe5\xad\xbf\xef\x05\x67\x33\x99\xf4\x8a\x73\xc4\x4a\xd4\x57\x4c\xba\xb3\x5e\x73\x3e\xc7\x51\x6a\x17\x66\xde\x1d\x2a\x5a\xbd\x31\x3f\x9a\x20\xad\xde\xa4\x9f\xe5\x18\x5c\x97\x3d\x46\xbe\x60\x37\xc8\x15\xea\xff\x61\x15\x86\xc1\x69\x45\x54\x20\x41\xb0\x10\x53\x28\x89\x22\x48\xac\x22\xd1\x0a\x94\x15\x88\x4b\x28\x05\x19\x11\x4a\x18\x49\xa0\x04\x46\x12\x50\x22\x69\x91\x60\x58\x06\x13\x51\x56\x22\x14\xf6\xea\xfa\xc7\x27\x3f\x03\x77\x48\x9e\xff\x69\xc1\xa2\xee\xfb\x06\xc1\x6e\x10\xdb\x5c\xc3\xeb\x1f\xce\x88\x37\x59\x40\xe4\xb0\x7e\x7c\x1b\x5e\x2e\x47\x80\x09\x91\xb9\xe1\x04\xc3\xb6\x81\x88\x10\x59\xeb\x26\xd4\x80\x0d\x65\xe7\xfb\x9e\x42\x90\x5a\xb0\x6e\x10\x71\x6d\x23\xaa\x8d\xc8\x06\xb4\xf4\x2b\x1b\x59\x02\xdb\x19\x68\x15\xc3\x44\x6c\x77\xf2\x3e\x4f\x54\x5c\x66\xf7\xdb\xab\x10\x67\x18\x92\x45\x29\x96\xa1\x6e\x10\xec\xfa\xc7\xe9\x98\x18\x8a\x61\x59\x82\xa1\x19\x36\x1d\x51\x8e\x99\x1c\x33\x45\x9e\x8d\x6b\xcf\x16\xe3\xa1\x4a\x0e\xb5\xbc\x75\xea\xb3\x03\x2d\xaf\xae\x63\x1f\x15\x64\x85\xff\xee\xfc\xa0\xc8\xbc\xf2\xe3\x66\x0b\x19\x71\x74\x64\xa9\xff\x42\x51\x74\x18\xe7\x6f\x8b\xa1\xb3\x04\x41\xfa\xb3\x1e\x5f\x47\xaa\x4f\x39\x12\x79\x75\x3a\xd9\x02\xed\x71\xc5\x1e\xff\xa9\xca\x69\xbc\x05\xf5\x17\xe7\x5a\x9d\x8f\x27\x36\xf0\x85\x12\x1d\x99\x83\x5e\x7e\xfc\xf3\xd9\xad\x4b\xfe\x9c\x62\xcd\x19\xf3\x5c\x19\xda\x40\xd5\x2c\xe4\xc5\x32\x74\x31\xdd\xd8\x82\xa2\x95\x73\xf5\xe0\xe3\xf1\xf5\x10\xa4\x4a\x53\x78\x0b\xed\xf5\x28\xd4\x0b\x93\xb6\x99\x24\x37\xf4\xd5\x12\xf6\x4e\xee\x74\x3c\xe0\x23\x98\x1a\xa0\x31\x0a\x21\x27\x5b\x08\x7e\xbf\xd7\x23\x36\x4f\x36\xd6\xf6\x61\xaa\x1c\x6f\x63\x42\x67\x9c\xc9\x69\xe4\xc1\xae\x57\x72\x61\xd8\xbd\xe9\xf8\x5f\x63\xdb\x60\x8e\x64\xc1\x8e\xd2\x38\x36\xd0\x04\xc9\x50\xf5\x94\xc4\xb7\x02\xa1\xb0\x32\x0c\x2d\x25\xcf\x0e\x2c\x28\x28\x30\xed\x5d\xbb\x8f\x4d\x68\x41\xf3\x3d\x0d\x64\x09\xb6\x82\xbd\x15\xdc\x54\x8e\xfa\x2b\x0d\x6a\x65\x1a\xb6\x21\x19\x5a\xaa\x5c\xf1\x77\x14\x18\x0b\x04\x32\x34\xdd\xb9\x9b\x9f\x0e\x5c\x4b\x12\xb4\x2c\x65\xad\x09\xa9\x86\xe2\x0b\x0e\x54\x0d\xca\x79\x50\x3e\xeb\x29\x26\x94\xde\xf5\x52\x6a\xcd\xce\xed\x89\x29\x95\x93\x39\xe3\x62\xf9\x19\x59\xba\x8f\x2b\x2b\xf2\x65\x87\xba\x4c\x1a\xbf\x6b\xe8\x2b\x25\xe8\x99\x43\x61\x26\xad\xe3\xa1\x31\x19\x3c\x63\xa8\x0c\x55\x62\x5e\xcc\x36\xf3\x32\xd8\x45\x66\x8e\x6e\xb2\x52\xf2\x44\x71\x47\xc9\x33\x07\x49\xdf\x3b\x18\x6b\x53\xda\xef\xb4\x4a\x19\x9e\x02\x97\x73\x75\xf5\xfd\x7b\x7a\x96\x3d\xbd\x1f\xf8\x85\xb0\xe7\xaa\xd3\xdf\x78\x5d\x36\xa7\x92\x1d\x53\xf8\x6e\xf3\x94\x11\xce\x2d\x78\x4e\x25\x1b\xdb\xf6\x9d\x05\xe4\xef\x44\xcf\x02\xf1\xd2\xec\x89\x00\xc7\x1b\xe8\x73\xe0\x32\xc9\xed\xa1\x32\x28\xba\x2c\xa9\x96\xbf\xf7\x19\x11\x0d\x43\x83\x40\x0f\xc6\x2d\x55\x82\x82\x1e\x19\xa3\xbd\xdf\xa2\xe3\xf6\x61\x43\xa0\x10\x1b\xd1\x23\x5b\x12\xe3\x0f\x43\x25\xfd\x89\xdb\xec\x5d\xae\x05\xf7\x20\x06\xa4\xd6\xe4\x6b\x6d\xe4\xcb\x97\xb0\x06\xff\xf3\x13\x41\xaf\xaf\xf3\x70\x25\xb5\x0f\xb4\xf6\x7f\x47\x8a\x2c\x80\x2f\xa2\xd4\x18\xfa\x98\xc6\x3d\x0e\x33\x3b\x53\x72\x4d\xfa\x05\xba\x57\xf2\xfe\x86\x82\x63\x69\x99\xf4\xd7\x29\xa3\x69\x5e\x45\xff\x65\xc6\xd3\x1c\x2a\xbf\x6b\x44\x2d\x29\xec\x99\x63\x6a\x0e\xb5\xe3\x51\x35\xad\x41\xc6\xb8\x1a\xd9\xc5\x71\xaa\xad\x66\xec\x0c\xf1\xcd\x34\xcc\x59\xe1\x19\x97\x3f\x08\xe4\xcc\xe3\x8a\x8e\xc0\xd9\x83\x69\x72\xf1\xc4\x9e\x74\x62\xb7\x71\xa6\x0c\xe9\x73\x8e\xb4\xd9\xdc\xff\x64\x3e\x66\x6f\x05\xa8\xbf\x43\xcd\x58\xc1\xa4\x25\x57\x7b\xeb\xcc\x8e\xd6\x5a\xe2\x92\xb1\xbd\x15\x96\xd0\x06\x29\x8f\x9c\x79\x59\xda\x63\x4b\x9d\xeb\xc0\x5e\x9b\x30\x69\x75\x90\xa5\xaf\xff\xfa\xfb\x10\xc4\xfc\xf3\xdf\xa4\x30\xe6\xaf\xbf\xe3\x3a\x87\x4b\x23\x25\x73\x76\xc0\xa5\x1b\x3a\xcc\x0c\x8a\x0e\xb8\x8e\xd1\xf8\x92\xa9\x4b\x28\x88\xc6\x5a\x97\xdd\x65\x72\xc6\x04\xfa\x1c\xc6\xa7\x6e\xd1\x31\xd6\xd1\x84\x83\x6d\x0e\x63\x73\x61\x5d\x87\xa6\x50\xac\x07\x1c\x30\x65\x9a\x6b\x18\x71\xbe\x92\xfd\x95\x7f\xb8\x11\x02\x8b\xf5\xd8\xfb\x14\x4f\x86\xc6\xf7\x81\x9d\xea\x0f\xe2\x5b\x82\x3d\x1f\x90\x5c\xba\x14\x29\xd4\xc8\x2e\x31\xca\xa9\xe9\xf0\x77\xba\x9d\xca\xb4\xbf\x2f\x3a\xc8\x1d\x39\x31\x54\xd1\xe2\xa9\xec\x90\x33\x72\x80\x4d\x52\x37\x09\x1f\x21\x93\x58\x10\x91\x11\xf4\xb9\x41\x9c\x9e\x9a\xad\x50\x25\x98\x16\x20\xb8\x0f\x11\xd9\x58\x8b\x1a\x44\x56\x26\x94\x54\x37\xa1\x51\xbc\xd4\xef\xc4\xfa\xae\xf0\xce\xc5\x53\xdf\x55\x78\x77\xfc\x6f\x29\x8f\x2b\x58\xd1\x53\xa6\x44\xa7\x5c\x52\x3f\xb3\xca\xf4\xa0\x0e\x41\x53\x97\x6a\xda\xfc\xe0\xd2\xb5\xa8\x1f\x60\x1c\xb1\x75\x14\x55\x0e\x4c\x24\xd8\x14\x5b\x24\x90\xf2\x6c\xc4\xdd\x85\x9c\xb3\xdf\x76\xcc\x4f\x32\x4a\x60\xc2\xd9\xfd\x70\x71\x46\xb9\x7c\xcb\xe5\x84\x28\xb8\x1d\x39\x53\xa8\xcc\x3c\x4d\x11\x21\x53\xe7\x23\x17\x13\xb3\xf0\x8e\xee\x4c\x41\x73\x82\xe7\x64\x51\xeb\xc0\x06\xee\xaa\x6a\x46\x65\x39\x52\xe7\x26\x5c\x8e\x6c\x39\xf8\x8e\xab\x83\x2f\x81\x34\xa9\x5e\xf6\x1c\xbc\x29\xe5\x91\x67\xa0\xcc\xaa\xba\x3c\x03\x6d\x56\x91\x62\x11\xb4\xe1\xb5\xe5\x78\xa1\x62\xb0\x88\x7c\x85\x09\xaa\xae\xda\x2a\xd0\x04\x6f\x17\xe2\x9f\xd6\x9b\x76\x75\x83\x5c\xe1\x28\xc6\x7e\xc3\xd0\x6f\x04\x86\x60\xe4\x77\x8c\xfd\x4e\xb2\x7f\xa2\x04\x43\x10\x5f\x51\xec\x2a\xb6\x70\x9d\x8a\x1c\x17\xbc\x4a\x8c\x88\xa1\x8a\x3b\xc1\x36\x54\x39\x93\x10\x89\xd3\x95\x32\x84\x08\x61\x6d\xc1\xfd\xb4\x46\x50\xf5\xa3\xe3\xb8\xb2\xc9\x51\x2c\x4e\x97\xa1\x47\x0a\x40\x96\x85\xf8\xaa\x49\x26\x0d\x8a\xc4\xc8\x52\x32\x51\x82\x37\x89\x0a\xd2\x3a\xee\x6e\x92\x4c\x12\x34\xc6\xa0\x64\x19\x12\x74\x40\xc2\x1f\x13\x0a\x90\xa8\xa0\x6c\x29\x13\xa8\x78\xa3\xe5\xae\xb8\x14\x0c\x86\x96\x53\x14\xe3\xbe\x0c\x30\x9f\x9b\x70\x0e\x6c\xc3\xcc\x7e\xd7\x0c\x85\xe1\x4c\x39\xf4\x61\x25\xf9\xe7\x9b\x14\x10\x83\xa5\x2a\xa5\x5e\x06\xeb\x8a\xe1\xad\xa8\x09\x5b\xd9\xcc\xc4\xce\xe2\x04\x5d\xca\x62\x31\xd4\x45\xef\xbf\x05\x37\x48\xce\x26\x40\xd1\x15\xac\x14\x01\x2c\x4c\x60\x1f\x87\x3a\xfd\x3f\x9b\x10\x8b\x33\x6c\x29\x42\x78\xe4\x4d\xf8\x59\x4e\xef\x7c\xdc\x2c\x4a\x18\x4a\xb1\x74\x39\x91\x08\x4f\x9c\x7d\x72\x38\xd3\xb2\x30\x0c\xab\x50\xa5\x0c\x17\x23\x05\x45\xdd\x06\x07\x0c\x19\x4b\x4d\x50\x54\xa8\x65\x7a\x46\x0c\x23\x2a\x44\xb9\x17\x4f\x05\x2b\xfb\xc1\x8a\xeb\x36\x47\x0c\x8a\xaa\x94\xea\x20\x18\x2d\xa8\xfa\x1c\x5a\xb6\x70\xbc\xa6\x9b\x43\x8a\x66\xcb\xf5\x45\xac\x12\x09\x80\xdc\xc5\x73\x90\x3d\x96\x60\x18\x43\xd1\x78\x29\x22\xcc\xde\x7c\x15\xc3\x0c\xe2\x8f\x4c\x1a\x38\xc1\x10\x54\x29\x1a\xac\x67\x54\xd9\x68\x09\x02\x43\x4b\x59\x14\x8e\x26\xb0\x9e\xdf\x09\x31\x82\x22\xd9\x52\x9d\x10\xc7\x82\x9e\x6e\xc2\xa5\xf1\x0e\x85\x5f\xd0\x34\xf6\x2b\x0e\x86\x6e\xd9\x26\x50\x73\x86\x5d\x8c\x60\x50\xa2\x54\x87\xc4\x71\x21\x34\x45\xce\xc4\x4d\x92\x15\xb4\x94\x69\xe1\x84\x10\x8b\xe3\x32\xf1\x53\x38\x5e\xca\xa8\x70\xb2\x50\x28\x82\xd1\x28\x43\x96\x1a\x36\x70\xca\xe1\xdb\xef\x80\x26\xd4\xc1\x12\x0a\x92\xa1\xad\x97\x39\x7d\x8f\x26\x2a\x58\xb9\x18\x8b\x08\xde\xf5\x5a\x5f\x5b\x30\xd6\xe9\xb0\x6f\x04\x8a\x60\x68\x18\x7b\x29\xf5\x13\xa4\xdb\x9b\xc5\xf5\x72\x95\xe1\x3f\x3c\x2a\xd8\xe9\x54\x28\x41\x36\x8d\x55\x38\x20\x15\xe2\xee\xc3\xa3\x11\xd6\x53\x39\x1f\x45\x54\xbc\x81\x30\xb1\x72\x45\xb0\x8d\xa0\x9c\x2b\x89\x2a\x7e\x32\x55\xd2\x1b\x7e\xfd\x3d\x72\x0e\x19\xf7\x50\x7a\x7f\x0f\x72\x12\x2d\xe2\x64\x2d\x92\x94\x4b\x2b\xa1\x64\xd8\x8f\xba\xf3\x14\x5a\x92\x1c\xed\x92\x5b\xae\xb7\x50\x4e\xe9\x44\x78\x3a\x89\x94\xc9\x55\xe6\x5e\xa4\xb2\xb3\xab\xa3\xfd\x48\xe1\x3a\xee\xbb\xda\x63\xfb\x8e\x1e\xf5\xc8\x7e\xaf\xc5\x0f\x6a\xdd\x5e\xa3\x5a\x21\x70\x8e\x24\xe8\x67\x6a\xd0\xab\x8f\x47\x9d\xbb\x59\xbb\x72\x57\xed\xd4\xba\xc3\x4e\xab\xd1\x27\xc7\x15\xfe\x69\xf6\x30\x8d\xeb\x27\x95\x08\xee\x10\xa9\x3e\xde\x0d\xef\x67\x0f\x9d\x59\xff\xa9\xd9\xe8\x3c\x4c\xda\xb3\x07\xaa\x71\xd7\xe4\x88\x4e\xef\xe9\x09\xbf\x1f\xb6\xbb\x95\x3e\x77\xcf\x4d\xf9\x61\x63\x4a\x77\x06\xb5\x31\xdf\x78\x78\xec\xf7\x0a\x13\x21\x5c\x22\xa3\xc1\x53\xb3\xd5\xc1\x6b\x2d\xa2\xd1\x1b\x92\xd5\xc7\x4e\xa3\xdb\xab\x77\x1a\xf7\xd3\xde\x60\x8a\x37\x9f\x88\xe7\x6e\x63\xdc\xec\xf7\xa6\x35\xbe\xcf\x8d\x67\x95\x61\xad\xd2\x7f\xc4\x9b\x85\x89\x90\x0e\x11\x8e\x9a\x55\x07\x4f\x1c\xf5\x44\xce\x38\xbe\xf9\x38\x1b\xe1\xd3\x76\x1f\x9f\xf6\xc9\xea\xf4\xae\x39\x1d\x56\x48\x7e\x3a\x68\xf7\x7b\xf8\xb0\xf9\x40\xce\x46\xcd\x7e\x6b\xd4\x6b\xb7\x9b\xf8\xd5\xa9\x7b\xe7\x90\x31\x9f\x97\xd3\xc9\x2f\x9f\x8f\xef\x2b\xbb\x41\xc8\x7d\xd1\x7c\x9e\x05\x1e\x97\x68\x97\x49\x1a\x94\x29\x0b\xbe\x88\xa4\x91\xf4\xa1\xbb\x39\xc0\x3d\xbd\x20\x5f\xd0\xa4\xb2\xe0\x53\x7b\x5a\x50\x1a\x1c\xea\x03\xd1\x82\xff\x1b\xc4\xe9\x16\xff\x7c\xf6\x42\x92\xcf\xdf\x91\xcf\xd4\x9f\xfe\x86\x8a\xcf\x37\xc8\xe7\x43\xe2\xdb\x79\xa4\x03\x5b\x7d\x87\x9f\xff\x9b\x66\xa8\x71\x6a\x58\x8c\x1a\x7e\x83\x10\x1f\x4a\x2d\xb2\x05\xe1\x06\x41\x5d\x62\x96\xed\x8c\x62\xfa\x3c\x70\xbf\x0e\x6e\x0c\x45\xf7\x84\x0b\x13\x20\xa2\x04\x12\xa4\x09\xa3\xbd\xb4\x3c\xc4\x0d\x82\x79\x02\x79\x1b\xcd\x3f\x7f\x77\x44\xfc\xec\x99\x82\xf0\x0a\x77\x0e\x8d\x53\x9d\x68\x71\xae\x48\x9f\x2b\x12\xaf\xf8\x06\xf4\x41\x5a\xf6\x09\x7c\xb4\x96\x63\xf2\x14\xd3\xf2\x89\xbe\xb7\x38\x57\x78\xc0\x15\xcd\x30\xd8\x87\x6a\xd9\x23\xf0\xd1\x5a\x8e\xc9\x53\x4c\xcb\x27\x8e\xd5\x1e\x57\x39\x4e\x36\x69\xcf\xc1\xa9\x4e\x36\xd8\x77\x10\x8e\x01\x28\x0a\xb0\x98\x48\xd1\x34\x23\x91\x10\xb0\x94\x28\xb1\x0a\xaa\xa0\x24\x09\x44\x05\x97\x08\x54\x22\x18\x1a\xc8\x32\x53\xa9\x10\x28\x14\x21\x45\x93\xa2\x4c\x51\x32\xca\x02\x5a\x56\x2a\x98\xe2\xc4\x6c\xac\x58\x91\x18\x51\x01\x18\x60\x25\x8a\xc0\x30\x91\xc1\x69\x14\xad\x28\x2c\xaa\x88\x15\x8a\x06\x12\x4a\x12\x50\xc6\x48\x1c\x07\x84\x84\xb3\x38\xca\x30\x12\x4e\x60\x80\xc6\x51\x1a\xd2\x34\xea\x8d\x3a\x58\x6c\x66\xe3\xc5\xb3\x74\x7c\xc2\x13\x84\xb9\x04\x4b\x32\x34\x99\xfb\xd4\xf7\xeb\x18\xe3\x6e\xab\xa2\x9d\xf7\x79\xf4\x77\x83\x90\xce\x3f\x98\xff\x4f\xf0\x23\xb6\xff\xe0\x0c\x3d\x1c\xc7\x71\xf5\x7b\x9b\x51\x6f\x0d\xa0\x37\xba\xa3\x75\xed\x89\x53\xa8\x7a\x45\x9e\x99\xdc\xf0\x2b\x3a\x6d\xbd\x0d\x6a\xaf\x73\xb5\xdb\xda\xae\xd4\xea\xfa\x79\x3e\x1e\x60\xa0\x6b\x0c\x9e\x56\xc4\x5b\x6d\x5c\x53\x9e\xb1\xea\xcb\x6c\xb6\xd5\x77\x96\xad\x98\x3b\x73\xa8\xf7\x28\x05\x32\x4f\xcf\xcf\xd8\x56\x72\x50\x73\x8f\xa2\xa9\x48\x73\xe7\x53\x6b\xff\x0f\x37\x74\xfe\xd9\x1c\xbe\x6f\xb8\xc1\xf0\xd5\xfd\xc4\x35\xba\xed\xfb\x77\x40\x0f\x97\x7d\xad\xde\xb1\xe1\xcb\x93\xb8\x58\x3d\xb5\x2a\xe3\x69\xbb\xaf\xc0\x7b\xb1\x25\xbf\xbe\xbd\xb0\x9b\x3e\xc6\xd9\xe6\xad\xc2\x74\x79\xd1\x68\xa9\xd2\x86\xac\x55\xb9\x1d\x46\xdb\x4b\x7b\x76\xd7\x10\x9b\xcd\x35\xd8\xf0\x95\xc5\x23\xd3\xe2\x89\xc6\xaf\x47\xd5\xa5\xdf\xed\x91\x1d\xf0\x6b\x85\x0f\xb9\xc3\xdf\x5d\xf8\xcb\xfe\xef\x99\x7b\xc4\xc8\x21\xc7\xd5\xd1\xfb\xa4\xc7\xff\xea\xbf\xab\xc0\x5b\xf5\xa6\x9d\x4e\x8a\x77\x88\x77\x18\xfc\x32\xc6\x7e\x45\x13\x32\xcb\x28\x14\x41\x43\x48\x33\x32\x26\xe2\x15\x91\x12\x19\x56\xc1\x09\xa0\xb8\x38\x2b\x14\xcd\x02\x9c\x54\x80\x82\x91\x28\x01\x64\x54\xa4\x70\x91\x26\x08\x11\xad\x88\x90\x65\xaf\x5c\xcf\x44\x24\xda\x3e\x95\xd6\x25\x48\x94\xa5\x51\x22\xf7\xa9\x37\x94\x93\x14\x8b\x67\xf4\x17\x22\xa5\xbf\x78\xee\xdf\xd5\xef\xdd\xe0\xf9\x05\xeb\xad\x29\x03\x15\xef\x2b\x33\x52\xdf\xf5\xdf\xa7\xdb\x3b\xe2\x61\x65\xbc\x7e\x7d\x6f\x70\x7d\xbb\x86\xb5\xf1\x6e\xa5\x5a\xa1\x9f\xb5\x25\x2f\xf7\x57\x0f\xb5\x2e\xd5\xec\x98\x6c\xa3\xf7\x42\x51\x6f\x80\xde\xe0\xcd\x76\xd7\x7e\x9b\x0c\x1a\x9d\xf7\x3b\x66\x37\x98\xde\x02\xce\x70\x51\xbb\x5d\x25\x64\x90\xa3\x29\xf7\xb0\xbd\x5f\x62\x5a\xbd\xbb\xd9\xbc\xad\x5f\xda\xd2\x6e\xf8\xcb\x62\x2b\x8d\x5b\x8e\x9f\xa8\xb5\xf9\x70\x60\x6e\x68\x62\xf3\x06\x06\x77\x7d\xfb\x05\x7d\x78\x83\x2f\xb5\xd1\x9d\xce\x70\x64\x7b\x73\xaf\xab\x15\xfd\x0d\x82\xf5\x2d\xca\x2f\x16\xb7\x77\xaf\xcc\x8e\xaf\x2f\x2b\x7a\xd3\xeb\x8a\x09\x5d\x81\xb7\x92\xcc\x29\xe8\x0a\x1c\x57\x7d\xfd\x50\xbb\xfd\x80\x3f\xcf\x9c\xca\x75\x05\xec\x32\x66\xec\x56\x62\x20\xbe\xdd\x60\x6c\x05\xfd\x86\x62\xdf\x50\x0c\x41\xd1\xef\xee\x7f\xa9\xe6\x8a\x63\x34\x8e\xe7\x3e\x25\x71\x96\x64\xe9\x0a\xce\xd2\x19\xc6\x9c\x6b\xca\xff\xca\xbf\xea\x63\x5b\x25\x77\xb7\xbb\x71\xbb\x5a\xa9\xeb\x75\xb6\x89\xa3\xdb\x97\xea\x57\x0b\x9d\xdb\xd6\xa6\xb5\xf9\x85\x3d\xca\xe3\xd9\x13\xa8\xde\x83\x86\x6b\xca\x7c\x82\x29\x27\xff\xfd\x7f\x6e\xca\x68\xd8\x94\x73\xa2\xab\x02\xdb\xca\x4e\x0d\xb6\x52\xaa\x60\xd2\xa6\x9c\xf9\x3b\xda\x13\xd1\xc4\xe7\xc9\xf8\x69\x68\x62\x33\x46\xe2\x34\x2c\x64\x6c\x62\x7b\x1a\x16\x2a\x36\xd1\x39\x0d\x0b\x1d\xc5\x42\x9e\x86\xa5\x12\x9b\x0e\x9c\x86\x85\x89\xcd\x61\x2e\xb3\xe5\xef\x22\xd9\x9f\xec\x3a\xab\x1b\x84\x29\x9a\xf5\x4a\xd9\xf8\x76\x76\xef\x49\x3b\x00\x22\x72\xf0\x82\x37\x79\xf8\xe7\xb3\x6d\x9c\x35\x1f\xbb\x41\x3e\x2b\xa6\xb1\x3c\x2b\x3f\xe1\xcc\x40\x4b\x25\x8d\x3e\x20\xa3\x9c\xa0\xbc\x70\xbf\x8c\x1c\x34\x11\x4c\xd8\x95\xb5\x2e\x43\xd3\x53\xdf\x69\x59\x61\x57\x46\x2f\x6d\x7a\xae\x06\xf3\xb3\x07\x1f\x90\xbd\x4e\xd3\x9a\xef\x41\xf6\x9f\xc9\x0f\xd5\xda\xa9\x19\x9b\x7f\x9d\xd6\x3c\x5f\xb7\xff\x8c\x7e\xa8\xd6\xce\xe8\xf1\x1f\xae\xb5\x1c\xc7\x99\xb0\xbd\xf5\x8c\x1a\xc3\x52\xfb\xfc\x4e\x75\xce\xa9\x95\xaf\x89\xc1\x4d\xc1\x93\x71\xf2\xc3\x1b\x32\x3d\xbc\xc9\x45\x44\x44\xdd\x5e\xda\x40\x9e\x8b\x87\x8c\xb9\xcf\x53\xf1\xc4\x1c\xca\xc9\xfc\xd0\x51\x3c\x69\x61\x4e\x2e\x9e\x4a\xb4\xab\x9e\xcc\x0f\x13\xc5\x93\x1e\xea\x94\xdd\xa2\x78\x89\x60\x27\xaf\xd6\xba\x44\xb8\x93\xba\x1f\xf1\x02\x7d\x2a\xb4\x54\x2e\x41\x51\x64\x2a\x14\x40\x51\x45\xa1\x21\x46\x30\x04\x80\x0a\xaa\xc8\x38\x85\x81\x0a\xad\xe0\xb8\x84\x29\x2c\x10\x71\x80\xcb\x8a\x22\x89\x68\xa5\xc2\x50\x54\x85\xa0\x81\x0c\x71\x9a\x62\x81\x37\xb3\x3f\x6b\xd5\x3a\x94\x11\x22\x82\x89\x72\x6a\xd2\x95\x42\xb1\x8c\x84\xad\xff\x34\xd2\xa3\xbd\x19\x76\x9b\x7e\x81\x2a\xf1\xb2\x34\x5a\xcc\xe4\x4e\xab\xdf\xc2\xb9\x44\x54\x06\x8f\x76\xb3\xdd\xfe\x35\x7b\x60\x36\x0f\xea\x73\x15\xd4\xd6\x54\x87\xea\x72\xee\x0c\x95\x0b\x52\xa2\xd5\xd8\x04\x30\xf4\x9d\x77\xff\x15\x97\xf3\x25\xf6\x80\xcb\x73\xea\x01\x5b\xbe\x61\x50\xeb\x4a\x77\x98\xbd\x7d\x19\x3f\xb5\x9f\xd9\x0d\x3f\x37\xc6\x55\x00\x67\xcc\x54\x6d\x18\x21\x34\x1d\x9a\x69\x85\xbe\x82\xca\xeb\xfb\xeb\xc6\x45\xcf\x0e\xd6\xec\xea\x65\xf7\x2a\x8d\xc6\x34\xaa\xbd\xf5\x3b\x6f\x3d\xa6\xd1\xfc\x85\x93\xe4\x70\xc0\x88\xe0\xa9\x07\x27\x93\xfb\xe7\x96\x66\x12\x63\x71\x54\xc3\x88\x37\xde\x64\xd7\x03\xb2\x3f\xaa\xcf\x77\xb5\xea\xed\x5c\x5a\xcf\xf1\xbb\xb6\x59\xef\xae\xdb\xe8\x78\x42\x0c\xfb\xa0\x3d\xad\x6e\x7e\xfe\xbc\x0a\x67\x1b\xc2\xe9\xd6\x61\x92\x6c\xdc\x01\x3e\xf6\xdc\x03\x72\xd5\x54\x0b\xa9\x65\x0d\x6a\xe2\xc3\xe3\x33\x5e\xd7\x1e\x67\xc0\x7c\xa0\xa7\xdb\x8d\x38\x23\xee\x7a\xf7\xf3\x95\x4e\x70\xe3\xda\xa2\xd5\x58\x51\xe2\x76\xdc\x9a\xb9\xd9\x02\xae\xb2\xb4\x7c\x7d\xcc\x33\xa6\xdb\xa9\xc9\x04\x57\xf7\xf5\x33\xe8\x7f\xd5\xc4\xb7\x33\xe8\x77\x63\xf4\x6b\x6b\x83\x30\x6c\x92\x7a\xab\x0d\xf8\xed\x6a\x78\x4b\x18\xcd\xde\xd7\x5f\x58\x65\xb4\x53\x2d\x4c\x53\xba\x8d\xa7\xe5\x70\x36\x37\xd7\xe3\xaf\x13\x2e\x90\x7f\x29\x1d\xe8\xf3\x67\xca\x5f\x9a\x3e\xa9\xb3\xaf\x27\xd2\x0f\xd9\xd2\x9c\x4b\xb0\x85\x53\x74\x71\x49\x5b\xf8\x9d\xef\xc2\xd3\xc5\x3f\x1f\xd5\x69\xdd\xe0\xd0\xdd\xc6\x1b\xa4\x32\xbd\x7f\x9d\x41\xc4\x75\x96\xf9\xe3\x68\xa4\x64\xb1\x42\x42\xc7\xd5\xb2\x22\x0b\x95\x8a\x2c\x02\x16\x50\xb2\x48\x10\x04\x2b\x56\x18\x45\x06\x8c\x42\x90\x95\x4a\x45\xc4\x80\x42\x10\x22\x20\x69\x06\xc8\x94\x84\xca\x0a\x4b\xd2\x32\x29\x5f\xb9\xeb\xa3\xd8\x39\xf1\xaa\x37\x99\xce\x72\xf2\x24\xca\x56\xb0\xd4\x75\xb7\xfd\xd3\x70\x94\xe4\x2f\x08\x74\x98\xe6\xf0\x7d\xf8\x2a\xb6\xf1\x26\x47\xcc\x1e\x5e\x46\x66\x7b\xf9\xf2\x88\xa2\xca\x1d\x63\x75\x5a\x95\x25\xca\x8f\x36\xf7\xb3\x5b\xee\x91\xe0\xf6\x3e\xde\xfd\xcb\xf0\xf1\xde\x9f\xf9\xd6\xa3\x3b\xb0\x0f\xe6\x2f\xdb\x2e\x98\x0e\x58\xba\xfa\x4b\xb1\x58\x88\x4a\x86\xd9\x7b\x7e\xfc\x55\x9d\xdd\xbf\x36\x8c\x76\xe0\xc3\x39\xae\x4f\x99\xed\x30\xbe\x87\xf7\x4d\x83\x75\x1e\xf1\xb5\xfa\xaf\xb7\xf7\xd7\x61\x75\x68\xf4\xb8\x7b\x55\x19\x8c\x1e\xeb\x46\x67\xf1\x6e\xef\xa4\x09\xa1\x35\x06\xb5\x21\x85\xcd\x5f\x65\xab\xd1\x04\xd5\xde\x6c\x83\x52\xe3\xdb\x87\xc5\x0c\x7d\x9c\xbf\x9a\x68\xad\x3a\xe0\xc9\x1e\x68\x3c\xe0\xed\xa5\x64\x11\xcf\x9b\xce\x52\x15\xc9\xc9\xc8\xec\x76\x0a\xf8\xf6\x88\xd1\xa6\xf9\x76\x6f\x29\xf0\xc8\xb7\xab\xb7\x55\xb4\x83\xde\xdf\xed\xec\xc5\xa6\x87\x69\x4f\x28\xd8\xad\x0c\x8c\xed\x35\xb7\xef\x9d\xda\xae\x4f\xd9\x55\x5e\xaa\x79\x32\x12\x73\xdb\xec\xeb\x4f\xb7\x95\xe9\xa1\x7d\x37\x91\x89\x9c\xfe\x7c\x06\xfd\x9e\xb9\x9b\x4c\xce\xa0\xcf\x71\xff\x3b\x7f\x96\xe8\x5b\xab\xa7\xeb\xa2\xaf\x3f\x67\x8a\x99\xa7\x8b\x73\xdf\x85\x63\x0b\x5f\xa5\x18\xbe\x52\xba\xf8\x67\xce\xd0\x26\xc5\x73\xd3\x76\x7d\x58\x7b\xd2\x7f\xa1\x0f\x1b\xba\x46\x8a\x15\x49\xe7\x59\x6a\x34\xd9\xbc\xf6\xe5\xa7\xfb\xa6\x58\x1d\xe1\xf3\xc9\x83\xd5\xeb\x4f\xdf\xb1\xa7\x07\xbb\x41\xde\xb7\x59\x6e\x3e\xd9\xf6\xeb\xb3\xc5\x83\xac\xae\xf4\x4e\x0f\x97\x6a\x94\xb1\xfc\xca\xa3\xe0\x57\xed\xe2\xbe\x15\xa3\x49\x40\xa1\x34\x09\x45\x40\x93\x0a\x2e\xc9\x22\x90\x45\x86\xa2\x45\x85\x20\x49\x86\x64\x28\x45\xa2\x71\x1a\x27\x2b\x40\x06\x04\x94\x09\x56\x92\x65\x05\x55\x68\x16\xc5\x31\x82\x10\x69\xcf\xb7\xe2\xe7\xf9\x56\x3c\xdf\xb7\x32\x04\x9b\xe1\x5b\xbd\xa7\xe1\x19\xdf\xb9\xbe\xb5\x16\x7b\xa9\x47\xbe\xb5\x8f\xd7\x6e\xb9\x3e\x49\x3d\x55\xeb\x84\xdd\x7c\x68\xf4\xb1\x11\xc1\xa1\x5d\xf8\x3a\x60\xee\x47\xb4\xde\xc3\x38\x16\xce\x54\x79\xd7\xb2\xbd\x2e\x9d\xee\x5b\xb9\x31\xff\xac\x3e\x8b\xb0\xb1\xa9\x59\x66\xbb\xaa\xb7\x5b\x6b\xeb\x16\xa5\x1e\xec\xfb\x7a\xd5\x9c\x1b\xd6\x7a\xd1\x19\xde\x4e\xe9\xc7\xe9\x0b\x69\x6f\x66\xbb\x85\x55\x99\xda\x63\xb2\xd6\x85\xdb\x7e\x97\xbe\x7f\x93\x94\xb7\xfb\x36\x86\xce\xb4\xea\xeb\xeb\x46\x27\xe7\xcc\xa0\xa5\xbc\xb4\xee\xfe\x5d\xbe\xf5\x5c\xdf\x76\x6e\x7f\xee\x6e\x3a\x4b\xf3\x82\xbe\x95\xab\x3c\x75\x18\xae\xf2\xa2\xcd\xf9\x01\x44\xe5\xe9\xb4\xf2\xd0\x94\xea\xc3\x2d\x3d\xbc\xdd\x68\xcd\x37\x89\x98\xd6\x31\x0a\xdc\x13\x2d\x15\xf3\x70\x5e\xda\xb7\xfe\x8f\x7c\x1b\x77\x21\xdf\xca\x90\x87\xf6\xad\xd2\xba\xf8\x87\x5f\xdc\x3d\x2d\x67\xc4\x42\xe2\xcc\xf6\x6e\xfe\xbc\x53\x3b\xe6\x80\xed\x3f\x88\xe3\xe1\x06\x90\xed\x4e\xc7\x18\xa3\x03\xac\xaf\x61\xad\xaf\x1d\xa9\x61\x19\x62\x1f\xeb\x4c\xd7\xdc\x4b\xd3\x9a\xbc\xf4\x55\xa0\x37\x69\x75\x6c\xcb\x8d\xd5\xf0\xf9\xbe\x7b\xff\xb5\x35\xa8\xef\x9a\xe4\xae\x3a\xbf\x78\xdc\x2a\xe2\x90\xc1\x65\x11\x88\x22\x8a\x93\x22\x5e\x01\xa8\x44\x60\x24\x2a\x81\x0a\x26\x33\x40\x62\x45\xa9\x82\x31\x04\xa6\xb0\x0a\x05\x08\x51\xa6\x59\x28\x01\x42\x66\x18\x45\x44\xa1\x44\x49\x57\xfb\xba\xbe\x33\x7c\x6b\x5e\x72\x82\x44\x59\x96\xca\x2a\x7f\xf1\x9e\x86\xb3\x57\xe7\xfa\xd6\x7a\xec\xa5\x1e\xf9\xd6\xb2\xb9\x89\x74\xdf\x5a\xbf\x5f\x6b\x98\xdd\xb9\xeb\x34\xc8\x87\xed\xc6\x46\xe5\x7a\xed\x81\x57\x68\x5b\xa4\x34\x52\xdc\x75\xcd\xbb\x79\x6d\xf5\x55\x7b\x78\xee\x2e\xb7\x92\x4d\x91\x6a\x4f\xc1\x97\x5b\xfb\x65\x4b\x77\x65\xea\xf9\x9e\xe4\xc9\xba\x26\x59\x0a\x49\xf3\xdc\xa2\x7a\x37\x9e\x0e\x2c\x9d\x51\x9e\xea\xff\x2e\xdf\x7a\xae\x6f\x3b\xb7\x3f\x77\xd0\x57\xba\x7e\x41\xdf\xfa\x3b\x73\x32\x1f\xe1\x5b\x4f\xf5\x6d\xdc\x85\x7c\xeb\xa9\x73\x18\xdf\xb7\xee\xc4\x95\x2c\x8e\xb7\xea\x16\x36\x24\xa9\x23\x37\x87\x1b\x6d\xd4\xfc\x6a\xce\xbe\x3e\xc3\x3b\xe6\xa5\xbd\x35\xb8\x37\x65\xf5\x30\x9b\xdc\x5b\x8f\x1d\x08\x5b\x2f\x8f\xec\xca\x12\x9f\x18\xf8\xd2\x84\xb3\x31\xac\xf6\x39\xea\xb1\xd3\xfc\xda\x5f\x70\xad\xe1\xe8\x55\xab\x57\xee\x6f\x9b\x38\x57\x30\x6e\x4d\xc9\x2e\x67\x1d\x6c\x55\x36\xb1\x1c\x3f\xdc\x6a\xef\xad\xe1\x76\x15\xec\xef\x75\x4f\xbf\xf1\x2a\xbb\x1c\xa6\xd1\x8c\xe5\xaa\x84\x53\xab\xce\x58\xa6\x4a\x3b\x5c\xa9\xfc\x46\x99\xe8\x1d\x84\x91\x6f\xc2\xea\x15\xee\x0e\x97\x5c\x07\xc7\x6b\x96\x3d\xef\x25\x82\xd3\x3d\x34\x88\xab\xd7\xc3\xc7\x75\x1e\x13\x45\x06\xa3\x56\x97\x1b\x3d\x21\x6d\xfe\x09\xf9\x72\x38\xf3\x29\xf5\x12\xc1\x03\x8e\xcb\xf2\x9c\xc9\xee\x31\xa7\x87\xd3\xa6\x72\xaf\x3b\x3c\xbe\xf9\xef\xc2\xda\xf6\xd1\x66\x4a\x10\x26\x1d\x95\xc4\x7b\x72\x83\x64\x49\x14\xba\x0f\x2f\x7c\x00\xc1\x85\xe4\x38\x60\x4c\x14\x21\x46\x30\xca\x7d\x02\xb7\xf1\x1b\xfc\x62\xdf\x2f\xc4\x75\x0c\x6b\x12\xe7\x49\x84\x63\x56\xb4\x3f\x32\xec\x26\x72\xde\xd8\x4d\xe8\x78\xb2\xbc\x1b\xfc\xe2\xdf\x2f\x24\x5f\x0c\x6b\x92\x7c\x49\x84\x73\xdf\x4e\xec\xfc\xae\xd8\xde\xba\x83\x42\x84\x83\x06\x84\xb0\x6a\x84\x8b\x48\x17\x25\x9b\x24\xdc\x49\x8c\x05\xd7\x47\x25\xbc\x58\x07\x3e\xfa\x92\x4b\xaa\xe6\x32\xaf\xb5\xb4\xe0\xa5\x5e\x6a\x4a\x75\x5f\x4e\x09\xdd\x65\x25\x4b\x26\x92\x25\x69\x06\x5b\x85\x25\x4f\x5d\xee\xcf\x5d\x51\xbf\xac\xf4\x69\x64\xb2\xe4\xcf\x64\x2d\x57\x03\xf1\xe8\x29\xf6\xfd\x42\xf2\xc5\xb0\x26\x89\x93\x44\x38\xca\x7d\x52\x5c\xe1\x1f\x12\xea\xfd\xef\x42\xcc\x7a\xc8\x92\x78\x0c\x91\x89\xb2\x16\x9c\xb3\x93\x75\xb8\x66\xf8\xf3\x85\x38\x0d\x61\x4c\x62\x37\x4e\xb0\x74\xb4\xe6\x05\x7a\x87\xd0\x42\xd0\xc1\x72\x1f\xac\xbb\x57\xd6\x15\x3b\x24\x34\x72\x2d\x5f\x26\xf2\xc8\x5d\xca\x6e\xa4\x1b\xb9\xa8\xee\x00\x7d\xe3\xde\x90\x9d\xce\x79\xe8\xde\xf3\x13\x18\x8e\x71\x1a\xbe\x44\x3d\xc4\x60\xec\x12\xbd\x03\x50\x3a\x5b\x89\x97\xbc\x9f\xcf\x60\xf2\xdd\xf1\xa9\xac\x26\x82\xa7\xc4\x8d\xe2\xce\x1d\x08\x4f\xe7\x31\x8c\x25\x7c\x41\xa1\x3f\x4e\x46\xdf\xef\x7e\xe0\x4d\xe7\xc6\x1b\x7e\xcf\xe7\xc7\x3f\x1b\xb6\x10\x47\x29\x43\xbe\xb8\x3f\x3f\xe1\x64\x76\x0e\x28\x52\x2e\x6f\x8c\xf3\xe3\x01\xdf\x1c\x1d\x89\x9e\xc4\x5c\xe8\xdc\xea\x62\x0c\xae\x0c\xcb\x9e\x9b\xd0\x4a\xe4\x33\x7c\x0a\x76\x21\x5e\x43\x0d\xae\x91\x59\x93\x1f\xf1\x91\x93\xb4\x5b\xe3\xfd\xc1\xb3\x3f\x8e\x58\x5f\x00\x6b\x71\x01\x9e\xdd\x93\xbd\xfb\xbd\xcc\x13\xf1\x23\x3c\xc7\x8f\x05\x4f\x52\xab\x77\xce\xf7\x85\x38\x3c\x20\x2b\xa6\xd4\xe4\xd3\xcb\x03\xfd\xa6\x9c\x6d\x9e\xa9\x6a\x6f\x20\x38\xc7\x82\xfd\xe3\x84\x0b\xf1\x1f\xbb\x44\xe0\xe6\xf8\xbe\x80\xbc\x29\xe1\xd9\x2e\x29\x05\x9f\xc3\x7f\x7c\xf6\x59\xd4\x3b\x25\xa0\x3c\xd3\x4f\xa5\x62\x2c\xc8\x66\xc6\x2c\x45\x80\x0e\x36\x57\xd7\xe7\x0e\xe6\x31\x74\x61\x13\x08\x4e\x1c\xc8\xbd\x56\xf8\x26\xb8\x7b\x28\x8d\xd9\xc3\x49\xc6\x67\xb2\xa9\xca\x85\x19\x0c\x47\x1a\x27\x30\x6d\xac\x84\xd5\xa5\xf8\xf6\x71\x25\xdf\xe3\x1c\x99\xad\x9c\x24\x49\xb2\x00\xf6\xf6\x72\x02\xf8\xb8\xd2\x6e\x27\x3e\x4d\x84\x84\xbb\x8a\x23\x42\x18\x2b\xc7\x2a\x17\xc6\x49\x32\xf8\xcc\x1f\x70\x9c\xaa\xfc\x6c\x45\xef\xef\xae\x74\x3a\xf7\xf9\xba\x8e\xa2\x0b\xb3\x1c\x6c\x6a\x3e\xbe\x3e\xfe\x88\xa3\xb0\x5e\x2f\xc5\xd6\x11\xce\x82\x43\x5d\x02\x83\xb6\xf7\x4a\xec\x73\x5e\xeb\x01\xc7\xe9\x26\x99\x67\x7e\xb6\x29\x3b\x44\xc2\xd7\x9b\x9d\xc1\xf0\x31\xb2\x18\xe7\x72\xfc\x4a\xef\xd8\xbd\x6a\xd9\x0c\xba\xd3\xd7\xcb\xb0\xe7\xa2\x2a\xc4\x5c\xea\x9c\x39\xc0\x17\xbb\xb1\xed\x6c\xfe\x62\xf8\xf2\x98\x3c\xbe\x30\x2e\x97\xd3\xcb\xe8\x31\x82\xad\x28\x97\xb9\xda\xbc\x0c\x6f\x85\x78\xca\xe6\x25\xe0\x58\x33\x8c\xd7\xf5\xea\x3c\x8e\xa2\xb8\x0a\xbf\xd1\xe0\x46\xba\x44\xfe\x56\x40\x35\x05\xf7\xba\xa1\x4b\x70\x18\xc7\x56\xac\xdf\xfa\x0c\xde\x1c\x5d\xa2\x77\x73\x74\x13\x63\x8a\x10\x17\xf0\xdb\x3e\x9e\x3c\x8e\x4b\x46\x47\x0e\xd6\x8b\x69\xb7\x84\x62\x73\xf5\xe6\x9d\xf8\x7f\x74\x2e\xa2\xa1\x0b\x40\x96\x4d\x68\x59\xe7\x2a\x34\x97\x40\x24\x17\x91\x98\xb8\xf1\x01\x4b\xf0\x7e\xbe\x1d\x64\xe1\xce\xe7\x38\xa1\x97\x45\x11\xfa\x51\xb8\x83\xcf\xde\xad\x4e\x9f\xd4\x65\x62\xcd\x0d\xfb\x13\x97\xea\xa2\x28\xfd\x18\xca\x41\xb9\x37\xa2\x0b\x71\x9b\x84\x3a\x37\x7c\x2b\x6a\xc9\x21\xe4\x97\x36\x86\x08\xea\x53\xe2\xcd\x74\x74\xb1\xfb\xca\x2f\xaf\xe8\xa3\x1b\xd1\x73\xd9\x8f\x35\x28\x2e\x4c\xe8\x82\xfa\x0f\xd3\x7f\xf8\x12\xfc\x3c\x49\x42\xb0\xc5\x85\x48\xba\x6e\xff\xc3\xa4\x49\xbc\xdb\x3f\x4f\xac\xa4\x46\xc5\xe5\x0b\x12\x52\x1f\x26\xd3\xfe\xee\xca\x3c\x39\x52\x33\xba\x51\xd4\x87\x03\x09\x3e\xa2\x6b\xc7\xb1\x27\x4e\x80\xcb\x76\xf0\x28\xd2\xe8\x14\xea\x42\x3d\x3c\x8b\x44\x11\x19\x72\xe6\x75\x99\xc4\x2e\x37\x7c\x1d\x23\x2e\xc4\x7b\xfe\x20\x16\x9e\x6c\x7f\x84\xd9\x1c\xe3\x3f\x79\xaa\xef\x2f\xb6\x3a\x13\xcb\xd0\x7d\x8c\x27\x2b\x38\x19\x9d\xc3\x9d\xbf\x86\x1c\x0d\xc3\x43\x30\x19\x9c\x25\xdd\xaa\x77\x01\x0e\x13\x2f\xeb\x4b\xe1\x34\x09\x36\x83\x63\xef\x22\xcd\x0b\xf0\xe8\xdf\x6a\x9e\xc2\xd5\xfe\xbe\xce\x1c\x56\x2e\xf9\x5e\xa3\xf7\x7a\x66\x30\x96\xfe\x66\x83\x3a\xbb\x0b\x2c\xec\x1d\xa3\x8a\xac\x6d\x07\xd5\x85\x29\xcb\xdb\x09\x85\x04\x40\x86\xfb\xb0\x36\xc8\xb7\x0b\xa2\x61\xbc\x9e\xcc\x62\x06\xce\xdc\x80\xf9\xcb\x17\x19\xda\x40\xd5\x2c\xe4\xdb\x7f\xfe\x83\x5c\x59\x86\x26\x87\x4a\xab\xae\xbe\x7f\xb7\xe1\xd6\xbe\xbe\xbe\x41\xd2\x01\x25\x43\x2e\x06\xe8\x2d\x65\xa4\x83\x8a\xc6\x7a\xbe\xb0\x0b\x91\x8f\x80\x66\x33\x10\x01\x8d\xb1\x10\x2c\xb7\xb9\x2e\x17\xf9\x89\x10\x44\x56\xe5\x47\xc8\x06\xce\x19\xe8\x52\x31\x3a\x2f\x2b\x5c\x68\x52\xdc\xa6\x22\x08\xcf\x5c\xb0\x4a\xc4\x96\xcd\x5a\xd6\x42\x55\x0c\x9d\x5b\xb0\xe7\x16\xf0\x5d\x96\xcd\x38\xde\x02\x0c\x87\x6b\x01\x8f\x8b\x3f\x0b\x97\xdf\xaa\xb2\xa0\x84\xaa\x80\x1a\xed\xdf\x53\x84\xeb\x93\x45\x1a\xfd\x11\xdf\xba\xeb\xed\x0b\xc3\x90\x11\xdf\xe0\x47\x7c\xaf\xc6\x8f\x63\x05\x11\xee\xd3\x7e\x0f\x99\x0e\xea\x8e\x1a\x47\xfc\x78\x32\x6a\xd5\x26\xce\x4f\x75\xbe\xc3\x4f\x78\xa4\xc6\x8d\x6b\x5c\x9d\xcf\xa8\xae\x93\xa1\x15\xfb\x2a\xc4\x32\xd4\x97\x53\x46\x94\x4e\x4e\xe9\x5c\x1a\x27\x51\xfd\xc4\xb3\xe9\x89\xca\xf2\x5d\x7b\x4e\x9d\x61\xaa\x26\xfc\x0c\xdf\xff\x5c\x0f\x61\x3e\x92\xb4\x10\x24\x4f\xb3\x0d\xa6\x9c\x06\x8e\x73\xed\xff\x43\x35\xa4\x30\x13\xd5\x45\xc2\xea\xc0\x65\x8d\x22\x9e\xf9\xfd\x37\x28\x24\xdd\x34\x8e\x52\xeb\x45\xac\x03\xd1\x21\x94\xa1\xec\x6e\x97\x09\x55\xc4\xdb\x06\xb2\x31\xcc\xd7\x08\xe3\xfb\xe4\xa2\xc3\xa9\x7f\x57\x14\x32\xe1\x1f\x27\x3f\x52\x2a\xe2\x9c\x78\xd0\x07\x3b\x2e\x83\xab\x4e\x46\x3c\xff\xc5\x7f\xee\x30\x93\x44\xca\x2b\x3f\x2c\x4a\xcf\x2d\x66\x4c\x26\x1a\xae\x63\xcc\xa4\x1c\x1e\x77\x72\xe8\xc6\x46\xb1\x10\xd5\xe3\xc1\x2b\x93\xa6\x1f\x23\xe7\x90\x0b\x05\xd9\x07\x4a\x91\xf0\x3a\x93\x48\x81\xe2\xee\xfa\xa8\x3f\x38\x5c\x25\x9d\xd2\x3e\xb3\x3c\xfa\x08\x83\xfb\x83\xff\x4e\x43\x63\xb0\x04\x2c\x09\xc8\x30\x00\xc8\x2c\x09\x8a\x02\xe5\x4e\xa5\x33\xa0\xa3\x59\xd8\x08\x60\xb4\xce\x32\x57\x72\xef\x65\x05\x7e\xc7\xbd\x5c\x0c\x79\x07\xa6\xb4\x00\xe6\x17\x9a\xbd\xf6\x37\xe1\x39\x30\xa1\x62\xbb\x14\xb8\x1f\xd9\xaf\xc9\xb7\x0b\x63\x6d\x4a\xa7\x61\x0a\xa6\x0e\x2e\xc7\xde\xda\x45\x6a\xfb\xc0\x39\x0e\xbc\x6a\xb9\xf1\xb0\x83\x38\x1d\xc7\x19\x74\x10\x79\xbd\x5c\x21\x92\xb1\x5c\x69\xd0\x86\x0e\xdc\xff\x0b\x00\x00\xff\xff\xbf\x08\x61\xd3\x2a\xcd\x00\x00") func baseHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -168,7 +168,7 @@ func baseHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "base-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x65, 0xb0, 0x7b, 0xdf, 0x3d, 0xc2, 0x19, 0x1, 0x51, 0x97, 0x38, 0x94, 0xc7, 0xa4, 0x95, 0xe, 0x6a, 0x91, 0xe, 0x5a, 0x1b, 0xb6, 0xd1, 0xb2, 0x0, 0xd9, 0x93, 0x1b, 0xe9, 0xde, 0xa6, 0xdb}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0x86, 0x8, 0xb6, 0xec, 0xb3, 0xb8, 0x25, 0xd7, 0xc0, 0xa8, 0x37, 0x9e, 0xe2, 0x1e, 0x36, 0xea, 0x49, 0xc8, 0x14, 0xfb, 0xbd, 0x7d, 0x22, 0xb8, 0x4d, 0x62, 0x48, 0x6b, 0xb3, 0xa2, 0xbb}} return a, nil } @@ -192,7 +192,7 @@ func failed_transactionsCoreSql() (*asset, error) { return a, nil } -var _failed_transactionsHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xf9\xaf\xa2\x4a\xf6\xf8\xef\xef\xaf\x20\x9d\x49\x6e\x77\xbc\xdd\xb2\x2f\xfd\x3e\x3d\x09\x2a\xee\xe2\xbe\x4e\x26\xa6\x80\x02\x51\x04\x2f\xe0\x55\xef\x64\xfe\xf7\x6f\x04\x54\x44\x51\x5c\xba\x5f\xbf\xc9\x97\x74\x3a\x57\x39\x75\xb6\x3a\x4b\xd5\xa9\x03\x7e\xfd\xfa\xc7\xd7\xaf\x48\xc3\x72\x5c\xcd\x86\xed\x66\x15\x51\x80\x0b\x24\xe0\x40\x44\x59\xce\x17\x7f\x7c\xfd\xfa\xc7\xf6\x7e\x6e\x39\x5f\x40\x05\x51\x6d\x6b\x7e\x00\x78\x87\xb6\xa3\x5b\x26\xc2\x7d\xa3\xbf\x61\x21\x28\x69\x83\x2c\xb4\xf1\x76\x78\x04\xe4\x8f\xb6\xd0\x41\x1c\x17\xb8\x70\x0e\x4d\x77\xec\xea\x73\x68\x2d\x5d\xe4\x07\x82\xfe\xe9\xdd\x32\x2c\x79\x76\xfa\xad\x6c\xe8\x5b\x68\x68\xca\x96\xa2\x9b\x1a\xf2\x03\x79\xe9\x76\xf2\xec\xcb\x9f\x3b\x74\xa6\x02\x6c\x65\x2c\x5b\xa6\x6a\xd9\x73\xdd\xd4\xc6\x8e\x6b\xeb\xa6\xe6\x20\x3f\x10\xcb\x0c\x70\x4c\xa0\x3c\x1b\xab\x4b\x53\x76\x75\xcb\x1c\x4b\x96\xa2\xc3\xed\x7d\x15\x18\x0e\x3c\x22\x33\xd7\xcd\xf1\x1c\x3a\x0e\xd0\x3c\x80\x15\xb0\x4d\xdd\xd4\xfe\x0c\x78\x87\xc0\x96\x27\xe3\x05\x70\x27\xc8\x0f\x64\xb1\x94\x0c\x5d\x7e\xdd\x0a\x2b\x03\x17\x18\xd6\x16\x8c\xaf\x76\x84\x16\xd2\xe1\x33\x55\x01\x29\xe5\x11\x61\x50\x6a\x77\xda\x48\x5d\xac\x0e\x03\xf8\x6f\x13\xdd\x71\x2d\x7b\x33\x76\x6d\xa0\x40\x07\xc9\xb5\xea\x0d\x24\x5b\x17\xdb\x9d\x16\x5f\x12\x3b\xa1\x41\xc7\x80\x63\xd9\x5a\x9a\x2e\xb4\xc7\xc0\x71\xa0\x3b\xd6\x95\xb1\x3a\x83\x9b\x3f\x7f\x05\x41\xd9\xfb\xeb\x57\x90\xdc\xda\xd5\xaf\x13\xd0\xa7\x76\xbb\x74\x3e\x83\x5b\x43\xbe\x44\x2c\x04\x75\x40\xee\x81\x97\xc4\x9c\x30\x08\x41\x06\x68\x3d\xae\xc6\x50\x55\xa1\xec\x3a\x63\x69\x33\xb6\x6c\x05\xda\x63\xc9\xb2\x66\x97\x07\xea\xa6\x02\xd7\xe3\x90\x70\xa6\x03\x3c\x43\x77\xc6\x96\x39\xd6\x95\x5b\x46\x5b\x0b\x68\x83\xfd\x58\x77\xb3\x80\x0f\x8c\x3e\x70\xf2\x10\x17\xb7\x8d\x35\xa0\xa2\x41\xdb\x1b\xe8\xc0\xb7\x25\x34\xe5\x9b\x44\x08\x0d\x5f\xd8\xf0\x5d\xb7\x96\x4e\xf0\xdd\x78\x02\x9c\xc9\x9d\xa8\x1e\xc7\xa0\xcf\x17\x96\xbd\x75\xc7\x20\xa6\xde\x8b\xe6\x5e\x5d\xca\x86\xe5\x40\x65\x0c\xdc\x5b\xc6\xef\x8c\xf9\x0e\x53\x0a\xfc\xf2\x0e\xa6\xc3\x23\x81\xa2\xd8\xd0\x71\x2e\x0f\x9f\xb8\xb6\xe2\xe5\x9d\xb1\x61\x59\xb3\xe5\x22\x01\xf4\xe2\x1a\x4b\x3e\x14\xd0\xed\x1b\x11\xef\x82\x6e\xe2\x01\xdb\x38\xa1\xaa\xd0\x4e\x06\xba\x43\x7f\xc7\x90\x40\xad\xc9\x06\x79\xa1\xf5\x06\x22\xe1\x50\x7c\x6d\xc4\x62\x3b\x60\xe2\x5e\x9d\x01\xe7\x28\x00\x49\x9b\xab\x66\x34\xd9\x7b\x7a\x12\x60\xcb\xe7\xc3\xba\x0a\xa8\x3b\xee\xd8\x5d\x8f\x17\xd7\x51\x6e\x21\xad\x45\x52\x48\x98\x14\x6c\x97\x4a\x2e\x03\x4b\x3b\x77\xbf\x0a\x76\x3d\x8a\x49\x9b\x64\x93\xe9\xe7\xc8\xad\xb6\x1d\x67\x79\x8d\xf2\x1e\x58\xb6\x14\x78\xe3\xba\x60\x6f\x06\x0b\x60\xbb\xba\xac\x2f\x80\x79\x31\x79\x5f\x1b\x3a\x5e\xdc\xb8\x36\xd9\x67\xb4\x5b\x39\x38\x3f\xf0\x66\xfa\x9e\xf2\x92\xd0\xf3\x01\x7f\x3a\x7e\x7f\x32\xb7\x33\x19\xfc\xb9\xcd\x0f\xbb\xa5\x9f\x67\x0c\xe3\x84\x1c\x68\x96\xbd\x18\xcf\x75\x2d\x58\x30\x5c\x60\x21\x02\x99\x58\xc6\xdb\xd7\x7b\x97\x30\x27\x35\x4e\x7f\x74\xb6\x5e\xed\xd6\x44\x44\x57\x7c\xca\x39\x21\xcf\x77\xab\x9d\x84\xb8\x63\x8c\xee\x09\x98\x83\xe9\xbe\x8c\xc9\xfb\x94\x5c\xfc\x5d\x96\x6e\x0b\xcd\xae\x20\x66\xef\xd0\xd9\x76\x9d\xed\xc0\xb7\x9b\x29\x1f\x21\x49\x3c\x5a\x81\x09\x61\x0f\xab\xd9\xc4\x12\xc6\x78\xfd\x2d\xf2\x9d\x47\x91\x6c\x6c\xb0\xee\x4b\x06\x1c\x2c\xf2\x12\xcb\x16\x44\x80\x5b\x64\xf1\x87\x24\x84\x0d\x96\x7f\xc9\xf9\xd9\xad\x17\x93\x70\x14\x89\x21\x97\x81\x43\x21\x21\x00\xe4\x0b\x85\x96\x50\xe0\x3b\x67\x80\xe7\xfa\x76\xc7\xa1\xcb\xf0\xb3\xb9\x9c\x43\x5b\x97\xff\xf5\xef\x2f\x09\x46\x81\xf5\x1d\xa3\x0c\xe0\xb8\x9f\x81\xb9\x81\x86\x57\x8a\x49\x30\x42\xd5\xed\xb3\x43\xf2\x5d\x31\xdb\x29\xd5\xc5\x0b\xf2\x8c\x81\xa6\x1d\xb8\x7b\x45\x4e\x18\xbd\x80\x63\x27\xdd\x03\x38\xb6\xb2\x7a\xc3\x0f\xcc\xbf\x22\xb7\x08\xe2\x89\x9e\x00\x83\x30\xe8\x08\x62\x3b\x82\xc2\x58\x68\xce\x9b\xb1\xb3\xc5\x6c\x51\xa8\xf1\x27\x14\xfe\xfc\xc3\xaf\xc2\x89\x60\x0e\xbf\xef\xbe\x43\x3a\x9b\x05\xfc\x1e\x0c\xf9\x13\x69\xcb\x13\x38\x07\xdf\x91\xaf\x7f\x22\xf5\x95\x09\xed\xef\xc8\x57\xaf\x38\x97\x6d\x09\xdb\xf9\x0a\x30\xef\xf0\xfd\x71\x84\xf1\xf8\x66\x80\x38\x5b\xaf\xd5\x04\xb1\x73\x01\xb3\x0f\x80\xd4\xc5\x63\x04\x48\xa9\x8d\xbc\xec\xca\x6e\xbb\xef\x1c\x0f\xc9\x4b\x94\xf2\x4e\xfc\x80\xe6\x5e\x43\x57\xe5\x39\xd2\xa5\x58\xef\x44\xf4\x89\xf4\x4b\x9d\xe2\x9e\xad\x70\xfd\xed\x88\xfc\x01\x4b\x84\x91\x5b\x84\x3f\x41\xe2\x29\xa0\x51\x4d\x2f\xb4\x76\xb3\x8a\x2c\x6c\x4b\x86\xca\xd2\x06\x06\x62\x00\x53\x5b\x02\x0d\x7a\x6a\x48\x58\x2f\x0c\xb3\x7b\xdd\xd0\x02\xf6\x77\xb6\x7a\xe0\x7f\x37\xb7\xe7\x74\xb9\xb7\xec\xab\xf8\x91\x96\xd0\xe9\xb6\xc4\x76\xe8\xbb\x3f\x10\x04\x41\xaa\xbc\x58\xe8\xf2\x05\x01\xf1\xa4\xaf\xd5\xba\x7e\xbc\x6b\x77\x5a\xa5\x6c\xc7\x83\xe0\xdb\xc8\x3f\xc6\xff\x40\xda\x42\x55\xc8\x76\x90\x7f\x60\xdb\x4f\xd1\xd9\xb8\xea\x88\x8f\x49\x77\x0d\xfd\xd3\x84\xc3\xcf\x09\x97\x24\x52\x3d\x26\x5f\x02\x0a\x7b\x11\xf7\x5f\xdd\x25\xe1\xe7\x3f\x10\x24\xcb\xb7\x05\xa4\x5f\x14\x44\xe4\x1f\xd8\xbf\xb0\x7f\xa7\xff\x81\xfd\x0b\xff\xf7\x3f\xff\x81\x7b\x7f\xe3\xff\xc2\xff\x8d\x74\xfc\x9b\x88\x50\x6d\x0b\x5b\xa5\x08\x62\xee\xcb\x59\xcd\x24\xc8\x03\x0f\x6a\xe6\x3a\x85\x9f\xad\x99\xff\xbb\x47\x33\xa7\x39\x35\xd0\xc3\x3e\x0f\x27\x53\xc4\x21\x6d\x9f\x60\xf4\x38\x46\x90\xf6\x56\x57\xc8\x8f\x43\x04\x78\xf5\xbf\xee\x0c\x1b\x02\xf2\x23\xec\x11\x5f\xce\x79\xed\x53\x79\x8c\x22\x8c\xb0\xb8\x73\xe3\xe4\x1c\x9e\x5d\x02\x3d\xca\xe5\x39\xa4\x11\x4e\x8f\x1c\xf2\x98\xdd\x83\x95\x9d\x72\x7b\x6e\x99\xf7\x30\xb7\x67\x90\x46\xb9\x0d\x3b\xc9\x45\x6e\xb7\x99\x4b\x81\x2a\x58\x1a\xee\xd8\x05\x92\x01\x9d\x05\x90\x21\xf2\x03\x79\x79\xf9\xf3\xf8\xee\x4a\x77\x27\x63\x4b\x57\x42\x47\x69\x47\xb2\x86\xd7\xbf\x81\x88\x9e\x83\x25\x13\xcf\xf7\xc5\xf0\xe6\xdb\x97\x48\x57\x10\x49\xd7\x74\xd3\xf5\x16\x06\x62\xb7\x5a\xf5\xc5\x01\xf3\xed\x32\x1e\x91\x27\xc0\x06\xb2\x0b\x6d\xe4\x1d\xd8\x1b\xdd\xd4\x22\x60\xe6\x72\xbe\x5f\xf2\x23\xba\xe9\x42\x0d\xda\x11\x10\xd5\x00\x9a\x83\x38\x73\x60\x18\xa7\x64\x5c\x6b\x6e\x9c\x12\xf9\x8c\x53\xd4\x97\x3d\xe4\xe9\xb4\x47\xf7\x0d\xf7\xaa\x23\x5a\xed\xd8\xab\xc4\x85\xeb\x13\x85\x2c\x16\x86\xee\xd5\xec\x11\x57\x9f\x43\xc7\x05\xf3\x05\xb2\x9d\x33\xef\x23\xf2\x61\x99\xf0\x94\xd1\xb8\x5d\xd1\x6e\x3d\x1a\x6c\xa7\x92\xf1\xbc\xdf\x7c\xc5\x60\x0d\xcc\x90\x6f\x75\xfc\x15\x1d\xe6\x7d\x51\x12\xb3\x2d\xc1\x5b\x7e\x65\x86\xc1\x57\x62\x1d\xa9\x95\xc4\x1e\x5f\xed\x0a\xfb\xcf\xfc\xe0\xf0\x39\xcb\x67\x8b\x02\x82\x5d\x13\xe6\x6e\xb5\x47\x11\x9d\x98\x62\x50\xf4\x40\x4c\xb8\x76\xdf\x81\xf1\xf9\x25\x46\xe2\x97\xef\xdf\x6d\xa8\xc9\x06\x70\x9c\x2f\xd1\xe9\xf2\xcf\x2a\xce\xd8\x16\x4d\x7e\xb9\x30\x51\xfe\xde\xf8\x61\xc9\xfc\x8a\xce\x5e\xae\xf3\x9e\x71\xa8\xd5\x9d\x67\xf3\x2c\xb8\x6c\x29\xe7\xc0\x31\xfc\x3c\xb8\x5f\xfe\x3b\x33\x80\xa2\x2f\x79\xd8\xf9\xf2\xc2\x93\xcc\x36\x8c\xf3\x97\x19\xed\x25\x41\x90\x7a\x5f\x14\x72\x48\x66\x78\x45\x22\xbf\x42\x77\x59\xa0\x3d\xae\xc8\xed\x6f\xba\x12\xc7\xdb\xae\xe6\xf3\xa8\xd5\x05\x78\x02\xb3\x8b\xf8\xcc\x38\x2e\xd2\x9f\x96\xb8\xe2\x20\x3f\x79\x07\x1f\x9f\x62\xac\xd9\xb3\xe3\xf3\xb7\x14\xe8\x02\xdd\x70\x90\xa9\x63\x99\x52\xbc\xb1\xed\x0a\x65\x8f\xea\x21\xc0\x13\xe8\x61\x77\x6e\x1d\xc3\x5b\xe8\x30\x39\x91\x17\x9e\x3b\xc7\x3e\x3f\x30\x50\x4b\xa8\x32\xea\x4d\xc4\x9e\x8f\x5d\x94\x43\x23\x14\x0e\x13\x91\x0c\x7e\x7f\x98\x1c\x49\x4c\xd6\xd2\x3d\xe4\xa6\xe8\x18\x1b\x02\xf7\xea\x20\x1f\x76\xb9\x50\x12\xc3\xee\x4d\x27\xf8\x18\x39\x67\x3f\x91\x05\x3b\x59\x0f\xb8\xc0\x18\xcb\x96\x6e\x3a\xe7\x6d\x50\x85\x70\xbc\xb0\x2c\xe3\xfc\x5d\xef\xe4\x53\x85\x71\x73\xed\xdd\xb6\xa1\x03\xed\xf7\x38\x90\xed\x3a\xd4\x5d\x8f\xbd\x65\x92\xfe\x11\x07\xb5\xb0\x2d\xd7\x92\x2d\x23\x56\xae\xe8\x1c\xed\x8c\x05\x02\x05\xda\xde\xf2\xc2\xff\xde\x59\xca\x32\x74\x1c\x75\x69\x8c\x63\x0d\x25\x10\x1c\xe8\x06\x54\xae\x41\x05\xac\xc7\x98\x50\xbc\xeb\xc5\xd4\xb7\x1f\xf5\xc4\x98\x33\x93\x2b\x79\x31\x79\x44\xba\x1e\xe3\x6e\x15\xf9\xb9\xa9\xee\x22\x8d\x5f\x95\xfa\x6e\x12\xf4\xc1\x54\x78\x91\xd6\x69\x6a\x3c\x0f\x7e\x21\x55\x86\x4e\x7f\x9e\x66\x9b\xd7\xb6\x42\xc7\x9d\x57\x31\xdb\xa5\xed\xee\x40\xf6\x45\xf1\xb2\xe4\x83\x49\x32\x88\x0e\xd6\xd2\x96\xf7\xad\x1c\x31\xe9\x69\x17\x72\x5e\x5e\xbe\x7f\x8f\xdf\xae\xc5\xfb\x41\x70\xf8\xf6\xa8\x3a\x83\x7e\xc1\xcf\x4f\x5d\x53\x04\x61\xf3\x9e\x0c\xe7\xf5\xcb\xc4\x92\x8d\x74\x2b\x5e\x02\x0a\x1a\x28\x2f\x81\xf8\x7b\xe5\xb3\x00\xa7\x7d\x9f\x57\xe0\x2e\x92\xdb\x43\x5d\xa0\xe8\xb1\xa4\x3b\x63\x07\x1a\x06\xb4\x11\xc9\xb2\x0c\x08\xcc\x5d\xde\xd2\x65\x38\x36\x8f\x72\xb4\xff\xdd\x71\xde\x3e\x74\x1c\x8d\x23\x19\xfd\xa8\xe7\x29\x7a\x33\x74\x94\x7f\xb6\x3b\xd4\xe3\x7a\xec\xf5\x0f\x23\xd9\xa2\x90\xad\x20\x9f\x3f\x87\x35\xf8\x4f\x04\xfd\xf2\xe5\x1a\xaa\x73\xc3\x77\x4a\xfb\xbf\x13\x3d\x26\xc0\x77\xa4\xd3\x08\xfa\x88\xc2\x3d\x06\x2f\xba\xd2\xf9\x53\xf0\x27\x38\xd7\xf9\xbe\x86\x84\x99\x34\x49\x08\x7b\x24\x97\x5e\xeb\x21\x78\x4e\x36\xbd\x42\xe5\x57\xe5\xd3\x1b\x85\x7d\x30\xa3\x5e\xa1\x76\x9a\x53\xe3\x06\x5c\xc8\xaa\x47\x7d\x23\x4f\xb4\xd5\x9d\x7d\x86\x59\x4a\xbc\xd1\x0a\x62\xff\x95\xed\x5b\xd2\xc4\x7b\x39\x87\x9e\x85\x3d\x90\x3e\xeb\x2f\xdb\x9d\x42\xfc\x56\x23\x6e\x13\xf7\x97\x6c\xc3\xdc\xf5\x18\x9a\xef\xd0\xb0\x16\xf0\x5c\x69\xd3\x5d\x6f\x37\x45\x4b\xc3\x8d\xb9\x39\x87\x2e\x88\xb9\xb5\xdd\x8e\xc5\xdd\x76\x74\xcd\x04\xee\xd2\x86\xe7\xaa\x70\x1c\xfd\xe5\x5f\xff\x3e\xac\x5d\xfe\xf3\xdf\x73\xab\x97\x7f\xfd\x3b\xaa\x73\x38\xb7\x62\x0a\x66\x07\x5c\xa6\x65\xc2\x8b\x6b\xa1\x03\xae\x53\x34\x81\x64\xfa\x1c\x8e\x25\x6b\x69\x2a\x5e\x55\x9b\xb5\x81\xa9\xc1\xe8\x8e\xed\x38\xb5\x6e\x35\xb1\xc5\xa6\xc1\xc8\x16\xd8\x34\xa1\x3d\x4e\xe6\x01\x07\x4c\x17\xcd\x35\x8c\xf8\xba\x92\x83\x42\x3d\x5c\x8d\x77\x16\xeb\xb3\x77\xad\xe8\x87\xe8\xca\x2e\x16\xec\x9a\xd0\x92\x04\x30\x3f\x18\x78\x1d\x7f\x57\xfa\xdb\xda\x42\xe7\x42\xa5\x37\x5c\x53\x0b\xd7\x79\x6f\xdb\xe5\x3c\x4f\x88\x84\xed\x7f\x17\x85\xba\xb8\x3b\x4a\x22\x64\xec\x3a\xe0\x69\x62\x26\xee\xa0\xbc\x28\xe8\x95\xa4\x75\x5e\xd4\x1c\x70\x01\xa2\x5a\xf6\x95\xf3\x2e\x24\xc7\x77\xf8\x2b\xe2\x95\xc4\xb6\xd0\xea\x20\x25\xb1\x53\x3f\x3a\xf3\xf2\x72\x7c\x1b\xf9\x8c\xbd\x22\x2f\x38\xba\xbb\x5e\x5e\x11\xfc\x15\x41\x5f\x91\x97\x97\x78\x76\x2e\x9d\x39\xdd\xca\x52\xf4\xdc\x69\xc7\xd6\x0b\x36\xd6\x4d\xdd\xd5\x81\x31\xf6\x7b\x80\xbe\x39\x6f\xc6\x8b\xc7\x2b\xc6\x7d\x45\xe9\xaf\x28\x81\x60\xec\x77\x9c\xfd\x4e\x32\xdf\x50\x02\x27\x39\x3a\x85\xe2\x5b\xa6\x13\x61\xc7\xc7\xfe\xb3\x1d\x47\x33\x22\x6d\xc6\xae\xa5\x2b\x97\x29\x71\x34\xc5\xdc\x42\x89\x18\x2f\x1d\xb8\xcf\x9f\x63\xdd\x3c\x79\x9e\xe4\x22\x3d\x92\x44\x49\xf6\x16\x7a\xe4\x18\x28\xca\x38\x5a\x95\xbb\x48\x83\x22\x29\x02\xbf\x85\x06\x35\xf6\xb3\xf5\x6e\xdf\xe0\x9d\xe6\x5e\x24\x41\x13\x28\x7e\x93\x18\xf4\x8e\x44\x10\xfd\x12\x90\x60\x49\x8c\xba\x85\x04\x33\x9e\x5b\x8a\xae\x6e\x92\x4b\xc1\x62\x34\x7e\x13\x09\xf6\x48\x8a\xa0\x89\x3b\x01\x1d\x86\xa4\x89\xdb\xe8\x6c\x27\x1d\x68\x9a\x0d\x35\xe0\x5a\xf6\x65\x9b\xe2\x50\x0c\xe5\x6e\x41\xcf\x79\xe8\xfd\x8a\xed\x78\xad\xd8\x97\xb1\xe3\x0c\x76\xd3\x54\x63\xa8\x87\x3e\x98\x05\x6f\x0f\x7e\x99\x00\xc5\x31\x37\x69\x07\xc3\xc2\x04\xf6\x9b\xba\x6d\x00\xb8\x4c\x88\xa3\xb9\xdb\x24\xc1\x8f\x26\x3a\xd8\x46\xfb\x8f\x0d\x5f\xa2\x84\xa1\x0c\x45\xde\x34\x23\x18\xe1\x8b\xb3\x2f\x3e\x5c\x9c\x71\x0c\xc3\x19\xfa\x36\x49\xc8\xb1\xaa\xaf\x77\x8f\x50\x58\x73\x63\xac\xea\xd0\xb8\x18\x1a\x31\x8c\xc2\xb0\x9b\x82\x30\x46\xed\x4e\x8e\x76\x15\xfd\xf5\x15\x31\x68\xe6\xb6\x30\x8f\xd1\x63\xdd\xd4\xa0\xe3\x8e\x4f\xcf\x0c\xae\x90\x62\x38\xf6\xb6\x19\x61\x8e\x52\xbd\x77\x38\x03\x2e\x27\x13\x0c\x47\x51\x82\xbc\x89\x08\xbb\x37\x5f\xd5\xf2\x57\xbc\x30\xe2\xec\x18\xfa\x95\xc0\x10\x8c\xfc\x8e\x71\xdf\x49\xee\x1b\x86\x13\x2c\x41\xa5\x50\xec\x42\x3e\xbf\xd8\xcd\x70\x6b\x42\x3f\xe9\x68\x08\x2f\x34\x0a\x99\x41\xa1\x59\xee\xf7\xaa\xfd\xfa\xb0\x98\xaf\xf6\x3a\x95\x7e\x8f\xca\x17\x8a\x3c\x51\x15\x87\x43\xbc\xdc\xac\xd4\x98\x3a\x5f\xe6\xbb\x42\x33\xdf\xa5\xab\x8d\x6c\x5b\xc8\xf7\x06\x75\x31\xaa\xa0\x58\x22\xf8\x96\x08\x4f\xf5\x33\x8d\x21\x4f\x0d\xc9\x3e\x2f\x14\x07\xfd\x16\xde\xad\xd4\xf1\x6e\x9d\xcc\x74\x0b\xc5\x6e\x93\x21\x85\x6e\xa3\x52\x17\xf1\x66\xb1\x47\xf6\x5b\xc5\x7a\xa9\x25\x56\x2a\xc5\x93\x59\x88\x25\x42\x6c\x89\x64\x07\x95\x02\xdd\x12\xc9\xba\x58\x12\x1a\xd9\x9a\x98\xcf\x30\x04\xce\x93\x04\x3d\xa2\x1a\x62\xae\xdd\xaa\x16\xfa\x15\xa6\x90\xa9\x66\x6b\xcd\x6a\x29\x5f\x27\xdb\x8c\x30\xec\xf7\xba\x89\x89\x90\x9e\xba\x5a\x8d\x61\xb1\x54\xc5\xb3\x25\x22\x2f\x36\xc9\xcc\xa0\x9a\xaf\x89\xb9\x6a\xbe\xdc\x15\x1b\x5d\xbc\x38\x24\x46\xb5\x7c\xbb\x58\x17\xbb\x59\xa1\xce\xb7\xfb\x4c\x33\xcb\xd4\x07\x78\xf1\xe5\xde\xee\x9b\xed\x52\xf6\xca\x5c\x07\x1d\x8b\x87\x66\xe3\x6f\x0e\xbc\xdc\x99\xf2\x8a\x90\xaf\x88\x6b\x2f\x61\x02\x0b\x3c\xed\x39\xb9\xdb\xfe\xfc\x9d\x56\xd8\xfa\x64\x1b\x2a\xba\x3b\x06\xc6\x62\x02\xcc\xe5\x9c\xdc\xfa\x4c\xb7\x9d\x7b\x79\x70\x3a\xef\xe9\xb2\x78\x8a\x9e\x8f\xf6\x85\xaf\x08\x96\x54\xcb\xe7\x9a\x2c\xee\x55\xf3\xae\xd1\x22\xa4\x67\x8c\xd9\x06\x4f\x86\xc0\x59\xcc\x63\x6a\xeb\x93\xff\xf9\xe4\x27\xc3\x4f\xdf\x91\x4f\x18\x8a\x7e\x0b\xb6\x1b\x9f\x5e\x91\x4f\x87\x5e\x9e\xed\xcd\x6e\x3b\x77\xf8\xd2\xdd\x2c\xbc\x2f\xa3\x13\x77\x80\xf0\x7b\x7a\xb6\x30\xf7\xce\xe0\xa7\xff\xc6\xb9\x64\x54\x34\x22\x22\x1a\xfe\x8a\x10\xff\x23\xa2\xe1\x7b\xd1\x18\x82\x61\xfe\x47\x67\xcd\x17\xed\x7f\x6c\xd6\x70\x96\x25\x39\x94\xe2\x58\xca\x9f\x35\xd4\x93\xcd\xd0\xe7\xba\x27\x1a\x87\xe3\x04\xc1\xe0\x28\x41\xb3\xd4\x37\x92\x61\x28\x16\x65\xfe\x56\x32\x62\x3b\x19\x31\x14\xdd\xc5\x93\xff\x35\x19\x89\x57\x84\xa5\x58\x8e\x23\x58\x9a\xe5\x3c\x11\x7d\x09\x1d\x17\xd8\xae\x6e\x6a\x63\x09\x18\xc0\x94\x61\x60\xab\x07\x63\x4d\x4c\x81\x3c\xa6\x70\xde\x07\xce\x38\xc1\x4e\x4f\x26\x70\xf5\x77\x78\xb7\x44\x5b\x1f\xf4\x45\x5a\x41\x5d\x9b\x6c\x09\x62\xaf\xc8\x27\x3f\xc9\x8c\x67\x70\xf3\xcb\x6c\xc9\xe3\x8a\xc4\x99\xc0\x5d\x7e\x96\x9e\x03\x0a\x3f\x5d\xcf\x11\x89\x92\xe9\xf9\xce\x35\xf8\x4d\x71\xc9\xe7\x8a\x66\x03\x97\xfd\x69\x7a\xf6\x29\xfc\x74\x3d\x47\x24\x4a\xa6\xe7\x3b\xb7\x21\x3e\x57\x57\x96\x70\xe7\xfa\x43\xef\x5d\xc2\xed\x7a\x44\x77\xc2\x52\xaf\xc8\x0b\x4d\xcb\xac\x44\x10\x14\xa7\x00\x06\xaa\x8a\x42\x63\x2a\xa5\xe2\x12\xc1\xa0\x34\xce\x61\x34\x4e\x91\x32\x4d\x62\x2c\x4d\x10\xb2\x82\x63\x38\x46\x12\x0c\x89\xca\x8c\xac\xa0\x12\x44\x59\x8a\xda\xae\xa9\x25\x15\xe3\x58\x5a\xc6\x25\x49\x55\x24\x5c\x66\x69\x86\x54\x08\x52\xe2\x20\xc4\x08\x94\x91\x54\x95\x94\x51\x19\x03\x92\x84\x52\x38\xe4\x54\x06\xa8\x00\x55\x18\x5a\x86\x32\x81\x4b\x94\xca\xbe\x78\x76\x83\x46\x36\xcf\xf4\x77\x82\xfc\x4e\x70\xd1\x3d\x75\xf0\xf5\x37\x0a\x23\x48\x8e\xba\x7a\x17\xc7\x48\x86\x64\x09\x9a\x64\xd1\x57\x04\xa3\xb7\xf3\x79\x72\xbd\x22\xdc\xf6\x3f\x2c\xf8\x6f\xf7\x25\xb6\xff\x63\xbb\xa7\xe0\x79\x9e\xcf\x32\xec\x68\xe2\x54\x98\xb4\x54\x2d\x8d\x50\x14\x5d\x42\xb2\x93\x61\xd2\xe8\xaa\x56\xb0\x9d\x7c\x75\xc1\xd1\x29\x0d\xc3\x3f\x9c\x9a\x3d\x20\xdf\xac\xb5\x68\xaf\xa7\x98\x99\x67\x53\xdd\x52\x89\xee\x8b\xb3\xdc\x87\x31\x6d\xb5\xa0\x4d\xf4\x96\xad\xd9\x47\xbb\x3c\xe2\x9b\x4d\x92\xe9\x34\xb7\xa8\xf9\x41\xa3\x57\x2b\xae\xf8\xfd\x05\x95\x6a\x7e\xce\x65\xb5\x41\x8f\xe1\xf8\xe5\x48\xe4\x80\x96\x17\xd7\xf6\x28\xd7\xd4\x7a\x84\xa4\x1a\x05\xfe\xad\xc1\xa4\xd6\x25\x75\x94\xed\xf4\x37\x99\x85\xd2\xee\x92\x05\x76\xb8\x70\x15\xa5\x58\x59\x19\xef\x0d\x27\x23\x0f\xfb\x6b\xa5\x34\xdb\xb4\xcb\xda\x54\xa1\x36\xab\x5a\x5e\xdb\x62\xee\x8a\x64\x15\x7c\x2c\xf0\xe6\x81\x18\x5f\x17\xf8\xe3\x2b\xb3\xfd\x6f\xc4\x0f\x30\xb2\xc9\xf3\x39\xb4\xcc\xff\xdd\x2e\xdf\xa8\xb0\x57\xef\xf4\x33\xc6\xfb\xa3\x0e\x41\x3e\xc7\x98\x5f\x00\x4e\x72\xb8\xc2\x71\x0c\x90\x31\x82\x50\x39\x14\x23\xa0\x2a\xe3\x14\xab\x4a\x94\x24\x53\x84\x04\x55\x94\x63\x25\x95\xe3\x58\x45\xa6\x58\x59\xa2\x50\x55\xa6\x55\x96\x95\x18\x15\xb0\xde\xe1\x0c\xe1\x47\xba\x53\xdb\x66\x63\x4d\x9e\x40\x69\x22\xde\x21\x76\x77\xfd\x35\x32\xcd\x61\x2c\x79\xc1\x21\xd8\x84\x0e\x41\x97\xcb\xd5\x91\x41\xaf\x3a\x0d\x8a\xef\x30\x6c\x79\x98\xc2\xde\xf3\xf5\x14\x5b\xd6\xd3\xf3\x21\x91\x9f\x56\xbb\x8d\xf5\xbb\x5e\x55\x69\x8d\xef\x1a\xd5\xa5\x8d\xe9\x83\x42\x71\x3e\xec\x52\xed\x79\xab\xa8\xa8\xf9\x26\xb7\xa9\xe7\xde\x38\x23\x5f\xdb\xe4\xdf\x48\x94\x2e\x3b\x12\x33\xf0\xbd\xc0\x73\x08\xed\x30\xa1\x69\xfb\xad\x33\x2d\x55\xfb\x9d\x77\x45\x48\xe1\xa8\xe4\x7e\x28\x00\x70\x84\xd0\x70\xbb\xb3\x3c\xd9\x6f\xd7\xd9\x4a\xa9\xc5\x6f\xb8\x52\x29\xcb\x96\x71\xbc\xe7\x00\x82\x5b\xb6\x5d\x97\x20\x73\x5c\xd3\xaa\x4d\x3b\x54\x9a\xd4\xba\x52\x1e\xb8\xe9\x92\xd1\x07\xa2\xa6\x18\x54\xd1\xf3\x81\xe6\x19\x87\xa8\x69\x11\x7b\xfa\x5f\x70\x08\xc2\xf3\x89\x1b\x1c\x82\x78\x8e\x31\xbf\x30\x14\x4a\xb3\x32\x90\x71\x15\x83\x34\x40\x25\x5c\x06\x2a\xc0\x15\x4a\x91\x24\x59\x96\x29\x19\xe3\x68\x06\x63\x54\x5a\x55\x55\x96\xe1\x38\x59\x26\x80\x44\x03\x9a\xa3\x24\x94\x91\x38\x0c\xf8\xa7\x95\xf8\x59\xdb\x66\x62\x4d\x9e\xc4\x69\x3c\xde\x5d\xb6\x77\xb7\xd9\x25\xd8\x59\x61\x2c\xcb\x5e\x70\x08\x2a\xa1\x43\x10\xdd\xc2\xb4\xb2\x7a\x2f\xce\xad\x6a\xb5\x92\xd2\x31\x65\xc9\x7e\xe4\x57\xa3\xd1\x5a\xc5\xd3\xe9\x09\x65\xd6\xea\x36\x98\x1b\x52\x86\x99\x01\xe9\xe3\x1d\x6d\x16\x1a\xb3\xc2\xa0\x2d\xe3\xb2\x96\xc9\xe6\x16\x96\xae\x0b\x85\x16\xa9\xe2\x73\x1b\x5d\x64\xb8\x02\x60\x86\x5a\x6a\x20\x95\xbc\x09\xf4\x1c\x22\x64\xa3\xed\x56\xb5\xdb\x2d\x3a\x99\x74\xfa\xa3\xe8\x4c\x8b\xbc\x85\x8d\xf8\x6e\x66\x66\xb1\x6b\xb2\xdd\x1a\x88\x1b\xa0\xba\xa3\xb7\x9e\x99\xa7\x6a\xc5\xa9\x3b\xb2\x8c\xb2\xba\x06\x6a\x1d\xac\xd2\x1d\x82\xe8\x76\x57\xc6\x47\x4d\xa9\xd7\x2b\x03\x0d\x8a\xb9\x0c\xd6\x81\x6f\x42\x8e\xb3\x86\x1e\xfe\xda\x19\x87\x28\xa2\xe7\x8c\xea\x6f\xee\x10\xf8\xad\x0e\x81\x3f\xc7\x98\x5f\x68\x42\xe1\x58\x95\x22\x68\x08\x69\x56\xc1\x24\x9c\x91\x28\x89\xe5\x54\x9c\x00\x2a\x45\x60\x98\xc4\x50\x34\x07\x70\x52\x05\x2a\x46\xa2\x04\x50\x50\x89\xc2\x25\x9a\x20\xb6\x38\x20\xc7\x5d\xca\x10\x74\xac\xc9\x53\x24\x43\xc6\x2f\xa8\x28\x92\xd9\x26\x08\x7f\x3f\x47\x52\x1c\x7e\xc1\x1d\x88\x84\xee\x80\x37\x46\x53\x4c\x5c\x52\x16\x2a\x95\x99\x3e\x69\x6e\xea\xef\xdd\x75\x81\xe8\x2d\xac\x59\xea\x3d\xcf\xd7\xdd\x2c\x56\xc1\x6b\x4c\x86\xa1\x47\xe9\x1a\x55\x6a\x67\xdf\x5a\x44\x6a\xf1\x91\xef\x57\x9a\xf5\x0f\x41\xd3\x35\xc3\x25\xcb\x6d\x1e\xe6\x98\xa1\x6d\x39\x02\xa8\xa6\xa9\x52\xd5\x5f\xab\x78\xee\xe0\xfd\x55\xda\xff\xc7\x7b\x16\xeb\x1c\x3e\xaf\xf8\x46\x73\xe6\x4f\x37\xda\x6b\xb2\xcb\xf9\xa2\x56\x4f\xb5\xca\xe9\xec\x47\x09\xed\x8d\xca\x30\x45\xc1\xc9\x2a\x3d\x23\x3b\xa4\x32\x59\x35\x9a\xab\x95\xd0\x63\x98\xb9\x39\x02\xf4\xa4\x57\xad\x76\x33\x42\x11\x2c\xd3\x70\x5d\xa6\x67\x62\xad\xf4\xf1\xd1\xe8\xbd\x63\x83\x3a\x07\x57\x8b\xe2\x7a\xd0\xe3\xf3\x0d\x2f\x4b\x94\xce\xb8\x8b\xe0\x9c\x33\xb9\xbf\xb9\xbb\xdc\x9c\x3f\xb0\xe7\x98\xba\xd7\xc0\xb6\xdb\x23\x60\x1c\x83\x7e\x45\xb1\xaf\x28\x86\xa0\xe8\x77\xef\x5f\xac\x49\xd3\x2c\x43\xc5\xe7\x87\xed\xdd\x6d\x7e\x20\x71\x8e\xe4\x68\x06\xe7\xe8\x0b\x16\x7f\xde\xde\x7d\x96\xfe\xea\xa9\x89\xbf\x32\x83\x8a\x4e\x6e\xd2\x9b\x76\x25\xc3\xe4\xcc\x1c\x57\xc4\xd1\xf5\x34\x93\x72\x50\xcd\x75\x56\xa5\xd5\x07\x36\x50\xda\xfd\x21\xc8\x94\x81\xbf\x37\x10\xce\x98\xf2\xf9\x6b\x67\xca\x3c\x9f\x99\xfd\x02\x41\x9e\x7a\xed\x37\x9c\x81\x29\x5f\xd9\x83\x27\x78\x50\xec\xde\x2d\x79\x4c\x87\x5d\xc8\x7f\xfc\x0d\x2c\x89\x52\x5e\xb9\x3e\xc6\xef\xae\xa0\xc1\x23\x68\xf0\xfb\xd0\x44\xcf\x45\x88\xfb\xd0\x90\xd1\x93\xa3\xfb\xd0\x50\x91\x7a\xff\x9d\xdc\xd0\xd1\x63\x83\xfb\xd0\x30\x3b\x34\x2c\x46\x32\xc4\xdd\xdc\xb0\x91\x4a\xff\x9d\xdc\x70\xd1\x62\xfa\x7d\x68\x30\xf4\xb8\xbc\x4b\xde\x89\x06\x8b\x54\x89\xef\x44\x83\x1f\x17\x41\xef\xe5\x86\x88\x54\x87\xef\x44\x13\x29\x4d\xde\xcb\x0d\x15\xa9\x70\x3e\xe7\xd9\xcd\xa7\x9c\x3b\x5f\x6e\xdd\x7d\x45\xb6\xbc\x27\x3b\x88\x8e\x79\x84\xf1\xe1\xa8\x19\x0a\x71\x47\xf1\x6d\xff\x81\xf6\x4a\x40\x98\x57\xc2\x75\xad\x87\xaa\xb5\xaf\xc8\x27\xd5\xb6\xe6\x0f\x55\xd6\x5f\x91\x50\xe5\x1a\xff\xdd\x4e\x23\x7f\x42\xdf\xce\x99\x99\x3a\x8e\xfd\xfb\x0f\xe8\xe9\x4c\x3d\xa0\xe5\xfd\x4c\xdd\xab\x8d\xa3\x99\xfa\xed\xce\x8d\x7f\x42\x5f\x52\xfc\x4c\x05\x9d\x02\xfb\x0f\x3f\xc9\xa7\xfe\xff\x4c\x3d\x3a\x53\xc1\xd2\xe3\xf0\x01\xf7\xa6\xc9\x3f\x31\xf3\xda\x6d\xb7\xc2\xa0\xdf\xa8\x90\x82\xf6\x9a\x23\x8f\x35\xe7\x3f\x21\xbb\x95\xfe\x3f\x9f\x94\x4f\xdf\x11\xfc\x15\xf9\x64\x7e\xfa\x8e\x60\xff\x7d\x45\x3e\xed\x7a\x51\x3f\x7d\xdf\x2e\xa2\x3f\x49\xcb\x8d\x6e\x6a\xe3\xb3\xca\x3e\xba\x77\x49\xe7\x0e\x34\x8c\x53\xc8\xe0\xfc\x2e\x8a\xe8\xef\x34\x35\x47\x8d\x1b\xfb\x0f\xa4\x37\x35\x74\xb2\x06\x07\xd7\x5e\x3a\x2e\x84\x8f\xba\x89\x87\xc6\xb2\x1f\xf5\xd8\xdf\xc3\xa9\x9e\xdc\xfb\x19\x3b\x73\xbb\x15\xf4\xfe\x03\xfa\x17\xcf\xdc\x23\x6b\x8f\xdf\x62\xe6\x7e\xfe\x12\x23\xbc\xd9\xd8\xff\xcd\x86\x1a\x14\xd4\xa5\xa9\x04\xb2\xdc\xd9\x79\xeb\xe9\xc5\xef\x7f\x7d\x74\x72\x13\x74\x4b\x3c\xd8\x22\x7c\x8b\xda\x82\x5d\xd1\xfe\x6f\xf2\xa7\xaa\xed\x01\x63\xfe\xcd\xd4\xe6\x6f\xdf\xf6\x7f\xa3\x3f\x55\x6d\x0f\x44\xef\x9f\xaf\xb6\x2b\x7b\xc1\x33\xef\x5e\x49\xb2\x0f\xbc\x8e\xf5\xfa\x6b\x28\xee\xdd\x6f\xc6\x3e\x20\x7a\xb6\x4e\x47\xc7\xd7\x14\xae\x22\xc2\x23\x88\xe2\xea\x3f\x57\x11\x11\x91\xbd\x55\x5c\xcd\xe5\x2a\x22\x32\xba\x49\xbb\x17\x11\x15\xd9\x43\xdc\xcd\x11\x1d\x41\x74\xb7\x8e\x98\xc8\x5a\xf9\x6e\x8e\xd8\xc8\xca\xee\x6e\x8e\xb8\xe8\x42\xe3\x5e\x44\x47\x95\x3b\x36\xbe\x3a\x75\x1d\x11\x76\x8c\xe8\x6e\x1d\x1d\x55\xef\xc8\x47\x38\x22\x22\xd9\xe9\x6e\x44\xe4\x71\xbc\xbe\x9f\x23\xea\x18\x51\x7c\x0d\xef\xd6\xd7\xa8\x3c\xa3\x8a\x77\xed\xb9\xf4\x5b\xea\x78\xb1\x2f\x4d\x79\x42\x64\x0d\x3d\xfd\x06\x00\x46\xb3\x2a\x86\x63\x38\x29\x31\x32\xc6\xd1\x32\x0a\x14\x00\x21\x23\x33\x04\xa0\x49\x85\x60\xd4\xed\xf4\xb3\x32\x90\x25\x8a\x03\x1c\xa6\xaa\x04\xcb\xd1\x38\xcd\x92\x14\x64\x64\xf5\xe5\x15\xf1\xdb\x7e\xef\x5f\x6c\x86\xce\xc1\xc9\xdd\xc9\x5f\x7c\xaf\x21\x4d\x5c\x68\x44\xf4\x6e\x1e\x45\x75\xff\xc0\xb0\x40\x59\x65\xb7\xa7\x98\xc3\x7a\x4f\x19\xbd\xb9\x83\x45\xa7\x98\x71\x25\x79\x88\xce\xb3\x73\x55\xce\x94\x2a\x82\xd6\x37\x8d\xf7\x7c\x69\x02\x78\xef\xc0\x8d\xdf\x1d\x6b\x67\x23\xe7\x59\x99\xc3\x9f\xfe\xd9\x78\x1d\xcf\xa6\xf9\x3a\x49\x0d\x33\x39\xc2\x2d\xf6\xf2\x75\xac\x45\xf0\x68\x0d\xce\x1a\x6c\xb9\x45\x9b\x22\xc6\x73\xb0\xaf\x2b\x9b\x92\xdb\xf5\xc6\xf7\x7a\x62\xd0\x00\x98\x5d\x5a\x84\xe5\x92\xd4\x5b\xb6\x21\xac\x17\xcd\x34\x61\x15\xc5\xd4\x07\xc6\xb4\x36\xba\x83\x19\x6a\x2d\x3f\x9c\x37\xfb\x9a\xbd\x6c\xa7\x3a\x3e\x69\x42\x1c\x85\x0f\x0b\xf3\x7b\x7e\x9b\x15\xb9\xd0\xe6\xea\x4e\xcf\xec\x15\xb3\xbd\x52\x11\x25\xb3\xdc\xa8\xf2\xf1\x51\x19\x66\x5a\x4a\x76\xbe\x49\x95\x57\xf3\x0f\x43\x61\x9a\x32\x5f\xad\xaf\x47\x5d\x99\xd7\x66\xcb\x82\x6a\xb5\x95\xf7\xc1\xa2\x48\xb0\x73\xf1\xdd\x7e\x6b\xea\xa0\xe6\xb4\xc5\x79\xa7\xdc\x1f\xb6\x3e\x8a\xef\x9a\xf5\xe3\x25\x7c\xe0\x5a\xe8\xa4\xb7\x97\xf7\xf7\x81\x8d\x8c\xf7\xa5\xdf\xc1\x75\x80\x6f\xee\xf5\x97\xf3\x80\x42\x6c\x4b\x73\x6d\x8e\xf5\x70\x45\xa3\x7a\xd8\xfc\x0d\x83\x46\x4d\x2e\x60\xee\x7a\xda\x1e\x56\x46\xdc\x4a\xd0\xac\x76\x06\xc0\x3e\xdb\xd5\xf3\x96\xa7\xa4\x1e\xff\x3e\xad\x1f\xe6\x23\x13\xa1\x7f\x34\x17\x67\xae\xcc\x93\xe9\x67\x6f\xa4\xcf\xef\x75\xe2\xe9\xa8\xb6\xd7\x49\xc0\xde\x12\x64\xa5\xde\x60\x84\xe7\x8c\x41\x1f\xd8\x3d\xba\xbb\x5e\x49\x7d\xa2\x20\x96\xb5\x85\x49\xf0\xed\xec\xa4\x94\x5f\x50\xd2\xba\x5d\xea\x7b\xe3\xcb\xdd\x6c\xaa\x2e\x1f\xf0\x09\xfc\xb1\x4d\x06\x57\xec\x99\xb2\x07\x9f\x7f\x8c\x7e\x8d\xbc\x8f\xfe\x0f\xcf\x3e\xfe\xb3\x58\x8d\xaa\x28\xbd\xee\x2b\x5d\xb9\xdc\xd5\xd4\x8e\x56\xc5\x66\x76\xa3\xb6\xd0\xf2\x79\xb4\x22\x55\x49\x33\x2b\xd5\x7b\x84\x9b\x59\xf1\x0e\x93\x37\x5a\xab\x6c\xb6\x4d\x8e\x52\x93\x32\xce\xc1\x99\xaa\x6e\x86\x78\x6a\xb9\xc8\x96\xad\xcd\xba\x84\x8f\x6a\xc6\x68\x52\xac\xc1\x54\x56\xfb\xf1\xc3\x5b\x4c\x7b\x2f\xe7\xd9\x75\x31\xf8\xff\x7b\x2f\xbb\xf7\xe2\xca\xf5\xa4\x13\x7e\x1f\x03\x0d\x09\x1c\xa3\x51\x92\x52\x28\x86\x93\x20\x20\x51\x15\x57\x08\x0a\xa0\x1c\x89\xd2\x0a\x24\x00\xcb\x91\x50\x96\x28\x09\x32\xa8\x22\x29\x80\x82\x32\x27\xa3\x24\xce\x00\x54\xa1\x00\xe6\x3f\xa2\x89\x3d\x52\xf9\x0a\x05\x46\xe2\x5a\x60\x24\x50\x86\xc3\x2e\x74\xa4\xfa\x77\x8f\x96\x97\xbe\x59\x56\xe8\x29\xd4\x89\xe9\xdc\x2a\xb1\x9d\x82\x91\x4b\x43\x4d\x26\x98\xc6\xc0\x2d\x56\x2a\x1f\xfd\x1e\xbb\xea\xe9\xa3\x0c\xc8\x2e\xa9\x2a\xe5\xd9\x6e\x28\x34\x46\xa7\xfd\x24\x34\xde\xe8\x6a\x0f\x84\x46\x9e\x99\x3b\x56\x88\x95\xc2\x9e\xdf\xa6\x60\x56\x72\x52\x6e\xf8\x5e\x99\x95\xa7\xc3\x0a\x0a\xec\xf7\x49\xde\x30\x53\x85\x0a\x9a\x62\xf8\x0d\xad\xa1\x20\x85\x4d\xa6\xad\x16\x34\x04\x1e\x92\xab\xf9\x14\xbe\x89\x72\x4b\xc3\xe7\x64\xd6\x64\x5c\x92\x9f\x96\x3f\x78\x27\xd7\x2c\xa1\xfa\x00\x4c\x0a\x92\x55\x6e\x94\x44\x7e\x15\x09\x8d\xcd\x73\xa6\x1f\xd6\x4f\x7c\x68\x0c\x01\xd9\x6f\x22\x5d\x85\x75\xa0\x4d\xd7\x35\xd0\x6d\x70\x74\xe6\x43\x75\x38\x88\xca\x96\x2d\x8e\x06\x1f\x99\x7e\x79\x96\xb7\x2a\xcc\xec\x7d\xe6\xb5\xed\x6e\x43\x93\x8e\x1d\xe6\x23\xe6\xba\x12\x1a\x9f\x47\xff\x34\x0c\x24\xa0\x7f\x12\x16\xfd\x3e\x97\x1b\xc3\x52\xbe\xd7\x45\x03\xc5\xdf\x68\xcf\x01\x2b\xe9\xfd\xb5\x3a\xc7\xb3\x70\xf8\xf2\x57\xf3\x97\x5b\x82\x8d\x76\x89\xbf\x1f\x3f\xce\xa4\x98\xd0\xb2\xe5\x56\x5f\xda\x86\xf8\x80\xd7\x68\x63\x76\xf8\xba\x9c\x62\x84\xc7\xe8\x87\x53\xdc\x2d\xf4\x83\x14\xd3\x96\x2d\xd1\x11\x75\xf6\xad\x39\x17\x35\xbb\xf5\xb6\x4c\x09\xfd\xbe\x4a\x0e\xed\x0e\xe3\xe4\xaa\x6f\xb9\x96\xcd\xf4\x0b\x62\x3e\x4f\x77\x9b\x19\x66\x9a\x05\x22\x6d\x61\xeb\x42\x0e\x48\x5a\x45\x5d\x12\x5a\xb6\x66\xd6\xb2\x2b\x91\x9f\xb6\xcb\xca\x9b\x30\x5a\x6a\x33\x56\x43\x73\x7c\x7c\x8a\xd9\xae\xe8\x6f\xcf\x30\x98\x4c\x52\x24\x4d\xa0\x38\xcd\x00\xc0\x32\x34\x03\x65\x56\x66\x21\x81\x92\x14\x2a\x43\x40\x4b\x80\xa6\x51\x8c\xa4\x20\x27\x73\x38\x09\x24\x89\xa1\x14\x06\xd0\x34\xcd\x49\xb4\x8c\xb3\xc0\xcf\x30\xf8\x93\x32\xcc\xd5\xa5\x37\x81\x72\xf1\x0d\xad\xc1\xcd\xa3\x62\xc1\xa3\xf9\xe5\x37\x5a\x7a\x5f\xc8\x2f\xb9\x45\x69\xc6\xbd\x11\xa8\xfb\xa1\x36\x67\x8b\xe6\x32\xbb\xca\x33\x3a\x68\x10\x92\x48\xe7\x5a\xd9\x59\x6a\xd5\x25\x7a\x2c\xcd\xb8\x6f\xb3\x6a\xb3\x47\x94\x14\x92\xc2\xfb\x4e\xa5\x3b\x5c\x34\x9a\xb6\xc8\xc2\x29\xad\xce\xd0\xe5\x1a\xc2\x79\x46\x74\x3e\x30\x91\xea\xd5\x1c\x4e\x1b\xfe\x8e\xf9\xe5\xae\xf8\xfe\x44\xfa\x51\x7b\x48\x44\xff\x7c\x7e\xe1\x99\x61\x95\xe5\x99\xa9\xa1\x09\x0d\x88\x2a\xdd\x2e\xd3\x2b\xca\xb9\xe6\x9a\x6e\xa6\x57\x46\xf1\x4d\x26\xba\x39\x8c\x02\x65\xa2\xa4\x63\x1e\xfc\xaf\xce\x2f\xbf\x90\xbf\xfb\xf2\xcb\x5f\x14\xdf\xf9\x27\xe5\x97\xf0\x16\xe6\x16\xfa\x41\x7e\xa9\xcf\xf4\x0e\x6e\xab\x6d\x42\xe4\xb2\x6d\x23\x4b\x56\xf9\xc1\xb2\x6c\xa5\x15\x87\xb0\x44\xa1\xd2\x61\x32\x1d\x65\xf0\x61\x2f\xf1\xb7\xa6\x9b\x19\xc8\x13\x62\x6a\x8e\xc0\x6a\xd1\xd2\x67\x5c\xd6\x21\xd6\x74\x63\x91\xea\xb4\x99\x3c\x45\x0f\x05\xfc\xa3\xd1\x25\x8c\xee\xe6\x03\xcf\x5c\xd8\xc2\xdc\x97\x5f\x38\x28\x41\xa8\x40\x49\xa6\x70\x05\x10\x18\xab\xd0\x92\x42\x50\x24\x4d\x92\x04\x47\x70\x0c\xaa\x28\x0c\x85\xd2\x92\xc4\x4a\x2a\x60\x69\x95\x26\x64\x96\x93\x29\x9a\x61\x65\x94\x91\x29\xef\xe9\x05\xd2\x6f\x69\x78\x46\x7e\xa1\xae\xe6\x17\x0c\x63\x2e\x3c\x71\x17\xdc\x3d\xaa\x22\x3f\x9a\x61\x72\x91\xe9\x0d\x05\xab\x90\xf3\xf6\x7a\x9d\x56\xf0\xe7\x8d\x11\x2c\x94\x36\x3c\x83\x3d\x1f\xc1\xc0\x0e\x3e\xc3\xbf\x3b\x4b\x4a\x4d\xbd\x33\x3d\xbb\x9c\x2b\x56\x96\x38\xdb\x5f\x09\xf8\xc7\x2a\xd7\xa4\x8c\x5a\xdf\xcc\x32\x79\x4b\x6b\x1b\x9d\xb4\x38\x5d\x6b\xc5\x75\x8e\x99\xcd\x46\xc5\x5a\x1f\x37\x66\xd3\xe1\x3a\xcd\xb5\x49\xca\x29\x95\x0b\xd9\x3a\xf9\x3e\xa5\x53\x5a\xe9\x7d\x5d\xb4\x57\xb4\x91\x09\x7b\x30\x1f\x9b\x4d\xa2\xba\xe0\xef\xd1\x6d\x48\xd6\x9f\xae\xbb\x5f\x90\xf1\xee\xca\x38\x4f\xa4\x7f\x7e\x4e\xae\x65\x3c\x0f\xd5\x33\xa2\x74\xd5\x5b\x36\x85\xa2\xfe\xe9\xf5\x53\xa3\xf4\x09\xfd\x6b\x85\xa6\x93\xfb\x91\x65\x5b\x74\xa0\x3f\xbf\x7f\x07\x1b\x7f\x5a\xe6\xbd\x37\xf3\xf1\x3f\x61\x4e\x6f\xa1\x1f\x64\xde\x9f\x15\x20\x9f\x9b\x79\x29\x0c\x03\x98\x8a\x53\x10\x53\x29\x08\x70\x45\x46\x25\x14\xe3\x70\x02\x53\x21\xc3\xe1\x0c\xa1\xca\x32\xce\x90\x0c\x2e\xe3\x04\x2d\x53\x1c\x8b\xaa\x32\xa7\xc8\x8a\x42\x2b\x1c\x46\x41\x3c\x78\x28\x1d\x7b\xa4\xf7\xea\x96\xda\x21\x89\xb3\x24\x7e\xe1\xe1\x5d\xff\xee\xd1\xb1\xab\x6f\x95\x39\x57\x7b\x5f\xe5\x96\xf5\x3e\xdf\xe4\x98\x16\xd6\xea\xb8\x5d\x65\x25\xe6\x8a\x8b\x5c\x3a\xdb\x85\x8b\x0f\xa5\xd9\x18\x18\x96\x29\xeb\xd5\x1e\x9f\xb8\x76\x38\xe4\xef\xde\xab\x15\x0f\xcb\xd8\x90\xd5\xee\xe9\x37\x8b\x02\xb6\x48\x51\x6e\xa6\xf1\xc6\x2e\xba\x56\x81\x1f\xbc\xd5\xb9\x36\x03\x56\x54\x9d\x93\x4c\x96\x69\x6d\x1a\x2b\x74\x80\x29\x15\x54\x61\x26\xed\x16\xcd\x2c\x0b\xe9\xd9\x84\xdf\x64\x09\x8b\xeb\xd8\x8d\x0e\xfd\xc1\x29\xa3\xd9\x64\x3e\x48\x8b\xfc\x8c\x35\xd7\x73\x6e\x62\x0c\x9b\x42\x92\xec\x5a\x08\x9b\x72\x5c\xe6\xe2\x43\xef\xa4\xb8\x71\x6f\xeb\x1d\x53\x98\x07\xfd\xc6\x5c\x49\x32\xc7\x53\xe8\xdf\x57\x0b\x3c\x64\xae\x70\xe6\xbb\x71\x2f\x74\xf6\x88\xe4\xf4\xba\x1c\xe5\x9e\x4d\xff\x86\x23\x1a\x9e\xff\x7d\xf7\xaa\xd7\x6a\x8d\xf7\xe8\xea\xe1\x5a\xe3\x13\xe7\xea\x16\xfa\x41\x46\x92\x3b\x7d\x93\x99\xa3\x42\xca\xde\x18\x6d\x6d\x98\x81\x16\x83\x55\x5d\x3b\x37\x63\xb0\xa5\xfa\xe1\x16\x4b\xe9\x5c\x4b\xed\xa1\x76\x8b\x58\xe6\xcb\x45\x7b\x49\x4a\xa9\xb6\x90\x2b\x55\xe1\x14\xab\x3b\x5c\xc3\x6e\x60\xd8\xbc\x5d\x18\xa9\x2c\x9a\xed\x6c\xd4\x82\x84\x17\x7a\x13\xbe\xf9\xec\x8c\x04\x70\x05\x48\x2a\x09\x39\x05\xa3\x49\x9c\xc1\x71\x1a\xc5\x71\x06\x87\x18\xc3\x02\x82\x91\x39\x86\x90\x39\x8c\x61\x24\x8e\x62\x14\xc0\xd2\x18\x87\x03\x8e\x93\x08\xc8\xa9\x04\xe0\x00\x20\xfd\x8c\x84\x3f\xe9\x98\xff\x7a\x46\x22\x30\x34\xfe\x34\x6b\x77\xf7\xa8\x7f\xe7\xd1\x83\xfe\x5f\x98\x91\x42\x07\xf7\x45\xbd\xba\x10\xc4\x3e\x43\x4c\xe5\x0e\xd6\x56\x66\x6a\x1a\x82\xf5\xb4\x5d\x2d\x74\x9a\x59\xad\x64\x42\xd4\x25\x48\x50\x82\x1b\x65\xb2\x30\x7a\x6e\x9f\x5b\xe7\x9a\xf4\x84\xef\x10\x6c\x81\x9b\xe9\x76\xa5\xd2\x2a\x6d\xac\xca\x72\x66\x75\x45\x71\xc2\xaf\x94\xfe\x26\xdd\x98\x36\xe5\x9f\x92\x91\xee\x39\x38\x7f\x66\x46\x7a\x90\xfe\x13\x33\xd2\x53\x0e\xed\x4f\xaf\xc4\x51\xee\x57\x37\x0d\xf0\xfc\xef\x7b\x3a\x77\x2d\x23\xdd\xa3\xab\x67\x66\xa4\x47\xe7\xea\x16\xfa\x41\x46\x82\xa5\xe5\xac\x89\x49\xef\x50\x5c\x37\x7a\x65\xbc\x95\xe6\x28\xbb\x20\x96\x9c\x91\xc8\x57\x78\x5d\x61\xda\x84\x3a\xb1\x26\x4c\x19\x2f\xcc\x7b\x7d\x4c\x22\x04\x31\xf7\x26\x64\x1a\xea\x4a\xc2\xdb\x15\xc7\x5a\x08\xd3\x8a\xf6\x46\xb7\x27\x4d\x14\x17\x72\x19\x4c\xaa\xb2\x29\x31\xb3\x7a\x76\x46\x92\x70\x80\xe3\x8c\x4c\x70\x32\x4d\x02\x92\x54\x65\x06\x48\x0a\x29\x73\x34\x8b\x71\x24\x45\xab\x28\xc1\x71\x1c\x4a\x2b\x18\x2e\x93\x0c\xad\x30\xa8\x44\xa2\xb8\xf7\xa2\x30\x8e\x56\x68\x40\xf8\xaf\x94\xc1\x1e\x69\xa0\xf6\x1f\xae\xbb\x98\x88\x28\x92\x43\xe3\x1b\xce\x76\x77\xc3\x5d\x9b\x41\x1e\xaa\xb2\xc5\xe6\x7b\x73\x26\x55\xf0\x22\x4f\xf4\x7b\xd3\x96\x5d\x99\x4f\x07\x28\xaa\x16\x58\xa7\x5a\xda\x2e\x18\x5a\xab\x72\x3f\xcd\x0f\x08\x7e\x9f\x87\x7c\x83\x89\x4c\xea\x89\x9f\xde\x51\x53\x0a\xbf\x35\x22\xd3\x7b\x5f\xe5\xb9\xed\x2d\x21\xe7\x12\x95\xd5\x1c\x34\x96\x0d\x25\xdf\xee\xae\x15\x3e\x0f\x25\xba\xde\x84\xee\xa6\x59\x29\xf5\xc1\x87\x21\xb5\x6b\xb5\xc9\xbc\x58\x11\xab\x39\xd2\x79\x9b\x08\x6f\xdd\x91\xdc\x6c\xa0\x46\x6a\x90\xae\x2f\x52\x96\xd3\x9f\x8b\x74\x2a\xdf\x1d\x4a\xce\x07\x43\x35\xf1\x69\x81\x7c\xaf\xd5\x12\xe4\x9e\x23\xa3\x3d\xce\x3d\x21\x99\x0f\xb1\x37\xec\xcf\x7a\x3a\x83\x56\xd1\x72\x61\xe3\x4e\x56\x22\x66\x0c\x51\xb0\x59\x58\x18\x27\x16\xd7\xef\xd5\xec\xa6\x4e\xb9\x19\x41\xce\xfa\x32\x12\x9a\x6b\xd7\xcd\x61\x9a\xe9\x1e\xc6\xdf\x55\xc7\x7a\x80\x7e\xbe\xd3\xcf\xd8\x0f\xd0\xe7\xf9\xbf\xee\x34\xff\x6c\x6c\xcd\xdc\xaf\x8b\xba\x39\xba\x28\xe6\x35\x5d\x3c\x3a\x17\x5b\x5b\x48\xc9\x11\x7c\x37\xe9\xe2\x3f\x8c\xb2\x71\xca\xf3\x29\x33\x25\x5a\x5d\xa3\x36\x68\x66\x06\xf3\xd4\x74\x56\xb4\xe5\x59\x56\xcf\xcf\x1d\xaa\x8f\x4e\x73\xa5\xd1\x64\x33\x6d\xaf\x52\xd5\x8a\xd5\xaa\x18\x85\x81\x90\xe3\xca\xaa\x91\xfe\x78\x53\xdf\xaa\xf9\xc5\x14\xbe\x4f\x7a\x85\x02\x53\x4b\xa5\xba\xa2\xb5\x5e\x56\x3f\x9e\xdf\x59\x40\x2a\x04\x09\x49\x12\xc5\x28\x8a\x50\x69\x12\xd0\x9c\x0c\x68\x82\xc5\x49\x8a\x63\x55\x52\xe1\x54\x14\xe0\x9c\x84\xaa\x90\x90\x21\xc1\xca\x24\x24\x15\x06\x25\x51\x05\xa8\x2a\x86\xab\xaa\x7a\x78\x07\xdc\x03\xb1\x15\xbf\x1a\x5b\x29\xec\xc2\x2b\x16\x77\x77\xc3\xfd\xe7\x8f\xc6\xd6\x0b\x1d\x05\xfe\x75\xc7\x1a\x33\x26\xb6\x66\x95\x9c\x5b\xc0\xd7\x73\xad\x99\xae\xf1\xee\xdb\x9b\xaa\x6a\x99\x5a\xaa\xab\x8e\x7a\xc5\x0f\xce\xca\xad\xdd\x8f\xbc\xa8\x50\xec\x2c\x3d\xc7\x25\xa3\x51\x30\x4b\x92\xb4\x84\x60\xee\x2e\x9a\xef\x59\x8e\xb4\x5b\x13\xb0\x4a\x17\x9d\x8c\xa0\x02\xc0\xbd\x4d\x47\x2b\x66\xb8\xe8\xcd\x0a\xbf\x57\x6c\x7d\x34\xb6\x3d\xe8\xcf\x6f\x4c\xba\x93\x93\x9e\x18\x5b\x7f\xe5\x5a\xf1\xea\xba\xf5\x17\xc6\x36\xfe\x49\xb1\x95\x25\x0f\xe3\x63\xf6\x7c\x97\x62\xab\xd9\x64\x5a\xae\x33\xb2\x84\xc6\x07\x5f\x05\x6f\x26\x41\xf2\x9d\x86\x51\xc4\x7b\x2d\x36\x0d\x78\x56\x92\xd7\x9d\x01\x54\xcb\x0d\xca\x9d\x53\x9d\xf5\x62\x53\xc0\x19\x73\xbe\xb0\x41\xb7\xba\x7a\x87\x15\x74\xd8\x77\x1a\x6b\x86\x6f\x15\xf1\xf9\x3b\xb0\x70\xb9\x8e\x57\x7a\xa3\xe7\x9f\xaa\x33\x38\xc5\x50\xb4\x84\xa9\x92\xa2\xb2\x84\x84\xb2\x18\xce\xa8\x04\x4b\x41\x15\x2a\x2a\xca\xa1\x9c\x2c\xb3\x38\x2a\xd1\xb2\x0c\x19\x4c\xc5\x64\x94\xe5\x18\x05\xa3\x48\x9c\x91\x25\x0a\x28\xca\xcb\xfe\xd5\xda\x0f\xc4\xd6\xab\x05\x14\x8a\xc2\xe3\x5f\xc6\x16\xdc\x0c\x3f\x47\xf3\x68\x64\xbd\x70\x92\xee\x5f\x77\xd4\x93\x63\x22\x6b\x66\x4a\x6a\x99\x66\x3a\xc3\x4b\xda\x9b\xca\xbc\xd5\x2d\x17\xb8\xda\xa8\x5b\x9c\xe6\x0c\xa7\xee\xe6\x44\x65\xc1\x00\x63\xd4\xa2\xd2\xf9\x19\xa7\x16\xa6\x29\x63\x2d\x6c\x34\x7e\xd4\xff\x18\x32\xe9\xea\x10\x1b\x11\xed\x3c\x2d\xa3\x6f\x0e\xc6\xe0\xd5\x09\x3f\x9b\xbd\xf7\xd8\x05\xfa\x7b\xad\x5a\x1f\x8e\x6c\x8f\x46\xd6\x8d\xdd\xcc\x57\x9f\x18\x59\x7f\x65\x5d\xf8\x67\x44\xd6\x7b\x23\x1b\xff\xa4\xc8\x7a\xef\x0e\x26\x88\xac\xc3\x54\x89\xef\x36\x56\xcd\x02\x59\x31\x53\xf4\xf4\xad\xda\xb7\x87\x85\x5e\x86\x5c\x51\x52\xce\x6e\x7e\x0c\x00\xc4\x17\xfd\x2e\x54\xd7\xa3\xc6\x60\x6d\xa5\x17\x72\xab\x66\xf1\x85\x9e\x83\xd7\xd3\x1b\x5c\xec\x2b\xe8\x04\x9a\x62\xc5\x16\x21\xa7\x93\xcd\x72\xb9\x8a\xa9\x15\x25\xe9\xaa\xf5\xf8\xe9\xbc\xf0\xaf\xa5\x86\x7f\xd6\x6f\x31\x83\x9b\xdd\x53\x6e\x87\xdf\xd2\xbf\xf5\x57\x66\x43\x18\xbd\x5f\x25\xe6\x73\xb9\xf0\x2f\xf3\x47\x09\x22\x8d\x56\xa9\xc6\xb7\x86\x48\x45\x18\x22\x9f\x75\xe5\x84\xdb\xe8\x6f\xc6\x45\x3e\x3f\x89\xeb\x08\xd6\x73\x9c\x9f\x23\x7c\x95\xfb\xc8\xaf\x76\x45\x7e\xe2\xea\xf0\x82\x8a\xd0\x7b\x60\x8e\xde\xf9\x32\x7e\x8a\x74\xc7\x64\xcf\x09\x77\x17\x63\x48\x57\x2c\x35\xbb\x02\xf2\xf9\x00\xfe\x8a\x1c\xe0\x77\x7f\xfb\x03\x6e\x54\xcd\x73\xa6\xf5\x66\xc1\x6f\x9a\xd4\x98\x77\xdd\x5d\x79\x9f\xdc\x73\x25\x3b\x4f\xe4\x92\xa4\x17\xd8\x4a\x2c\x79\xec\x33\xc2\x57\x9f\xc2\x7d\xae\xf4\x71\x64\x2e\xc9\x7f\x91\xb5\xab\x1a\xf0\x4d\x5a\xda\x78\xd6\xbe\x13\xa4\x24\xe6\x84\xc1\x15\x19\xb2\x2d\x81\xef\x08\x3e\xe8\x31\x16\xa4\x2e\x46\x9d\xa1\xdb\x2e\x89\x05\x44\x72\x6d\x08\xc3\xde\x15\xcf\x8d\xef\x63\x8f\xf3\xe3\xe3\x49\xc6\x51\x8c\x5f\x4b\xfb\x5f\x4a\xbc\x9b\x9d\x03\x8a\x30\x27\x47\x7b\x81\x63\x7e\x7c\xe0\x57\x64\xf7\x23\xa2\xbb\x9f\xa5\x3e\xc7\x5c\xe8\xb7\xf7\x93\x31\xb8\xb0\x1c\x57\xb3\xa1\x73\x96\xcf\xf0\x2f\xf9\x27\xe2\x35\x34\xe0\x0b\xd2\x2f\x0a\x2d\x01\x09\xe3\x28\xb5\x11\xb1\xde\xf1\x72\xf8\x9f\x27\xac\x4f\x80\x33\x79\x02\xcf\x5b\x34\xc9\x98\x0d\xfb\xca\x76\xd4\x39\x7d\xea\xa6\x09\xed\x67\xb1\x76\x40\x96\x8c\x41\x1f\xfe\x84\xcd\x40\xb1\xe7\xef\x5e\xd6\xb1\xff\x4e\xef\x47\x4c\xd7\xc7\x90\x8c\xff\xe0\x77\x82\x77\xf6\xfa\x8a\x80\xc5\xc2\xd0\x65\x3f\x3e\x5b\xb6\x12\x93\x37\xc7\x70\xeb\xac\xde\xfd\x3b\x38\x0d\xd2\xb6\xcf\x70\x04\x5d\x98\xed\xdd\xaf\x45\x1d\x71\x7c\x9a\x46\x74\xe5\x15\xf9\xe4\x0d\xfe\x14\xc7\xac\xae\x3c\x89\x4d\x5d\x49\xcc\xe0\xfe\xf7\xb0\x95\xd7\x33\xb9\xef\x2a\xd3\xd6\x62\xbc\x78\x16\xdf\x01\xae\x30\xeb\x31\x6b\x87\xbb\x24\x39\x2f\x80\xbb\x7e\x9e\x00\x01\xae\x18\x9b\xbe\x53\x84\x30\x86\x73\x42\x58\x8b\xad\x55\x4e\xac\xbb\x64\x08\x98\x3f\xe0\xb8\x57\xf9\x97\x15\xed\xec\x7e\xe9\x7b\x1b\xbb\x1e\xd7\xf5\x31\xba\x30\xcb\xbb\x9f\x1a\x38\x8e\x7e\x67\x39\x0a\xeb\xf5\x59\x6c\x9d\xe0\x4c\x18\x9e\xcf\x30\xe8\xfa\x53\xe2\x3e\x32\xad\x07\x1c\xf7\x9b\xe4\x35\xf3\x73\x6d\x65\x4b\x44\x02\xce\x8d\xeb\x85\xb3\x0c\x9f\x22\x8b\x70\xae\xc0\x08\x9f\x61\xd8\xab\x0c\x7a\xaf\x28\x7d\x0e\x7b\x1e\xaa\x44\xcc\xed\xde\x8b\x1a\xcb\x9a\xc7\x3b\xb4\x9f\xa6\xbe\x08\xbe\x6b\x4c\x46\xc0\x93\x70\xfa\x1c\x3d\x1e\x61\x4b\xca\xe5\x55\x6d\x3e\x87\xb7\x44\x3c\x5d\xe6\x65\xc7\xb1\x61\x59\xb3\xe5\xe2\x31\x8e\x8e\x71\x25\x9e\x51\x7f\x03\x12\xc3\xdf\x02\xe8\xf6\xd8\xd5\xe7\xf0\x29\x1c\x46\xb1\x25\xf3\xdb\x80\xc1\x57\x24\xca\xf2\x2b\x12\x84\x78\xd9\xb0\x1c\xa8\x8c\x81\x1b\x23\xc4\x13\xe2\x76\x80\xe7\x1a\xc7\x37\xae\x8e\xb6\x58\x9f\xa6\xdd\x1b\x14\x7b\x55\x6f\xba\xa9\xc0\xf5\x38\xb2\xe4\x70\xc6\x96\x39\x06\x8a\x62\x43\xc7\x79\x54\xa1\x57\x09\x1c\x6d\x9c\x83\xdb\x91\xad\xaa\x0f\x78\x03\xef\x8f\xdb\xc1\x25\xdc\xd7\x39\x3e\xe3\x65\xc7\x08\x83\x55\xf8\x16\x9f\xbb\x59\xdc\x5f\x14\xb9\x88\xf5\xea\xb2\x7f\x0b\x74\x85\xd1\x60\x0d\xb5\x45\xb9\x37\xa2\x27\x71\x7b\x0e\xf5\xd5\xe5\x5b\x52\x4b\x0e\x21\x7f\xb6\x31\x1c\xa1\xbe\x67\xbd\x19\x8f\x6e\xbe\xb0\xec\x6d\xe0\x7b\x87\xb6\xa3\x5b\xe6\xf3\x15\x1d\xa5\x70\x9d\xfd\xc8\x80\xe4\xc2\x04\xa1\x27\x79\x91\xe3\x0e\xfd\x87\x68\x5c\x95\x24\x04\x9b\x5c\x88\x85\x0d\xdf\x75\x6b\xe9\xfc\x12\x69\xce\x11\xbb\x2a\xd6\xb9\x41\xc9\xe5\xdb\x15\x51\x7e\x9a\x4c\x3b\x02\x57\xe5\x88\x2d\x3f\x1e\xa3\x3e\xbc\x5c\xf9\x67\xb8\x76\x14\xfb\xd9\x0d\xf0\xad\x0e\x7e\x8c\xf4\x78\x0b\xf5\x24\x0f\xbf\x44\x22\x89\x0c\x57\xf6\x75\x17\x89\x3d\x2f\x7d\x9d\x22\x4e\xc4\xfb\xf5\x24\x16\xde\x6c\xff\x0c\xb3\x39\xc5\x7f\xf7\x56\xdf\x5b\xc4\xed\x13\xf9\xae\xc2\x38\x96\x2c\x6b\x76\xb7\x96\x2f\xe0\xbc\xba\x44\xf8\xfc\x59\x81\x2e\xd0\x0d\x07\xf9\xfa\xcf\x7f\x22\x2f\x8e\x65\x28\xa1\xe3\xcd\x97\xef\xdf\x5d\xb8\x76\xbf\x7c\x79\x45\xe2\x01\x65\x4b\x49\x06\xe8\x1f\x8e\xc4\x83\x4a\xd6\x52\x9b\xb8\x89\xc8\x1f\x81\x5e\x66\xe0\x08\x34\xc2\xc2\xae\x28\xee\x19\x19\xf2\x03\x21\x88\xc4\x9d\x01\xba\x32\x56\x43\xe7\x76\xf9\xca\xaf\xe9\x0f\x08\xc8\x22\xf9\x7a\x4b\x28\x15\xc4\xfd\x99\x1c\xd2\x12\xf2\x42\x4b\x10\xb3\x42\x3b\x72\x4c\xe5\xdd\xad\x8b\x48\xb7\x91\xdb\x9a\x4c\x4b\x68\x77\x5a\xa5\x6c\x67\xfb\x55\x4e\xa8\x0a\x1d\x01\xc9\xf2\xed\x2c\x9f\x13\x2e\x1c\x6c\x6e\xf7\x1d\xc7\x1f\xc7\x91\x52\xcc\xf3\x94\x71\x4c\xe7\xca\xa9\x65\x1c\x27\xc7\xfa\x89\x96\x8d\xce\x2a\x2b\x58\xe8\x5f\x39\xe2\x8d\xd5\x44\xb0\x95\xfd\xcb\xf5\x10\xe6\xe3\x9c\x16\x76\x55\x82\xcb\x06\x73\x9b\x06\x4e\x8b\x4a\x7f\xa1\x1a\x62\x98\x39\xd6\xc5\x99\x32\xd8\x73\x8d\x22\x5a\xe2\xf8\x1d\x14\x12\x6f\x1a\x27\x35\xa4\x24\xd6\x81\x00\x45\x81\x0a\x32\x07\xe6\x12\x18\xc6\xe6\x88\xd3\x52\x1e\x11\x06\xa5\x76\xa7\xed\xf3\xec\x4b\xf6\x6d\x06\x37\xe3\x77\x60\x2c\xe1\x78\x8b\x11\x22\xb9\x56\xbd\x11\x66\xfc\x30\x2a\x02\xe9\xb7\x48\xfc\xe1\xc1\x47\x09\x9c\xc7\xfd\xe7\x2e\x45\xfa\xe0\x51\xca\x9f\x3d\xbd\x5d\xbc\xb6\x4a\x92\x27\xc0\x06\xb2\x0b\x6d\xe4\x1d\xd8\x1b\xdd\xd4\x3e\xe3\x14\xf5\x65\x7f\x52\xfa\x7a\x1d\x8b\x47\xf4\x1a\x9e\x3f\x22\x9d\xbe\x51\x6e\xf7\x4d\xbe\x70\xbd\x18\xeb\xa6\x06\x1d\x77\x6c\x80\xed\x7f\xde\x4a\xfb\xe5\x15\x79\x41\x5f\xbe\xfc\x79\x6a\x2b\x11\x44\xe7\x8c\xe5\x9c\xa6\x8f\x3b\x3e\x66\x70\xb3\x9d\xf1\x23\x7d\xee\x0b\x26\x8e\xae\x99\xdb\xb5\x7e\x02\x85\xee\x06\x9d\xd1\x06\x4d\x7e\x49\xa0\x4b\xc4\x27\x76\xff\xf8\x15\xd4\xb5\x89\x8b\xe8\xa6\x0b\x35\x68\x47\xa6\xf1\xeb\x57\x64\x05\x91\x95\x6e\x18\xc8\xdb\x12\xda\x1b\x44\xda\xec\x08\x3a\x16\xe2\x4e\x80\x8b\xe8\x0e\xb2\x9a\xec\xbf\xd5\x1d\xc4\x9d\x40\x44\xd5\x6d\xc7\x45\x74\x17\xce\x11\xdd\xf4\xbe\x91\xad\xf9\xc2\x72\x74\x17\x6e\x95\x9b\x80\xad\x23\x6d\xfb\xc8\xf7\x6d\x1b\x5f\xb6\xb6\x11\xc4\x9d\x86\xdf\x25\xd0\x6e\x56\x11\x05\xb8\x60\x1b\xcf\x11\x65\x39\x5f\x78\x04\x0d\xe8\x42\x2f\x60\xfc\xbf\x00\x00\x00\xff\xff\x1a\xbe\x8b\x9f\x8e\xd5\x00\x00") +var _failed_transactionsHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xf9\xaf\xa2\x4a\xf6\xf8\xef\xef\xaf\x20\x9d\x49\x6e\x77\xbc\xdd\xb2\x2f\xfd\x3e\x3d\x09\x2a\xee\xe2\xbe\x4e\x26\xa6\x80\x42\x51\x04\x2f\xe0\x55\xef\x64\xfe\xf7\x6f\x58\x54\x44\x51\x5c\xba\x5f\xbf\xc9\x97\x74\x3a\x57\x39\x75\xb6\x3a\x4b\xd5\xa9\x03\x7e\xfd\xfa\xc7\xd7\xaf\x48\xc3\xb4\x9d\x89\x05\xdb\xcd\x2a\xa2\x00\x07\x48\xc0\x86\x88\xb2\x5a\x2c\xff\xf8\xfa\xf5\x0f\xf7\x7e\x6e\xb5\x58\x42\x05\x51\x2d\x73\x71\x00\x78\x87\x96\xad\x99\x06\xc2\x7d\xa3\xbf\x61\x21\x28\x69\x8b\x2c\x27\x63\x77\x78\x04\xe4\x8f\xb6\xd0\x41\x6c\x07\x38\x70\x01\x0d\x67\xec\x68\x0b\x68\xae\x1c\xe4\x07\x82\xfe\xe9\xdd\xd2\x4d\x79\x7e\xfa\xad\xac\x6b\x2e\x34\x34\x64\x53\xd1\x8c\x09\xf2\x03\x79\xe9\x76\xf2\xec\xcb\x9f\x3b\x74\x86\x02\x2c\x65\x2c\x9b\x86\x6a\x5a\x0b\xcd\x98\x8c\x6d\xc7\xd2\x8c\x89\x8d\xfc\x40\x4c\x23\xc0\x31\x85\xf2\x7c\xac\xae\x0c\xd9\xd1\x4c\x63\x2c\x99\x8a\x06\xdd\xfb\x2a\xd0\x6d\x78\x44\x66\xa1\x19\xe3\x05\xb4\x6d\x30\xf1\x00\xd6\xc0\x32\x34\x63\xf2\x67\xc0\x3b\x04\x96\x3c\x1d\x2f\x81\x33\x45\x7e\x20\xcb\x95\xa4\x6b\xf2\xab\x2b\xac\x0c\x1c\xa0\x9b\x2e\x18\x5f\xed\x08\x2d\xa4\xc3\x67\xaa\x02\x52\xca\x23\xc2\xa0\xd4\xee\xb4\x91\xba\x58\x1d\x06\xf0\xdf\xa6\x9a\xed\x98\xd6\x76\xec\x58\x40\x81\x36\x92\x6b\xd5\x1b\x48\xb6\x2e\xb6\x3b\x2d\xbe\x24\x76\x42\x83\x8e\x01\xc7\xb2\xb9\x32\x1c\x68\x8d\x81\x6d\x43\x67\xac\x29\x63\x75\x0e\xb7\x7f\xfe\x0a\x82\xb2\xf7\xd7\xaf\x20\xe9\xda\xd5\xaf\x13\xd0\xa7\x76\xbb\x74\x3e\x83\xae\x21\x5f\x22\x16\x82\x3a\x20\xf7\xc0\x4b\x62\x4e\x18\x84\x20\x03\xb4\x1e\x57\x63\xa8\xaa\x50\x76\xec\xb1\xb4\x1d\x9b\x96\x02\xad\xb1\x64\x9a\xf3\xcb\x03\x35\x43\x81\x9b\x71\x48\x38\xc3\x06\x9e\xa1\xdb\x63\xd3\x18\x6b\xca\x2d\xa3\xcd\x25\xb4\xc0\x7e\xac\xb3\x5d\xc2\x07\x46\x1f\x38\x79\x88\x8b\xdb\xc6\xea\x50\x99\x40\xcb\x1b\x68\xc3\xb7\x15\x34\xe4\x9b\x44\x08\x0d\x5f\x5a\xf0\x5d\x33\x57\x76\xf0\xdd\x78\x0a\xec\xe9\x9d\xa8\x1e\xc7\xa0\x2d\x96\xa6\xe5\xba\x63\x10\x53\xef\x45\x73\xaf\x2e\x65\xdd\xb4\xa1\x32\x06\xce\x2d\xe3\x77\xc6\x7c\x87\x29\x05\x7e\x79\x07\xd3\xe1\x91\x40\x51\x2c\x68\xdb\x97\x87\x4f\x1d\x4b\xf1\xf2\xce\x58\x37\xcd\xf9\x6a\x99\x00\x7a\x79\x8d\x25\x1f\x0a\x68\xd6\x8d\x88\x77\x41\x37\xf1\x00\x37\x4e\xa8\x2a\xb4\x92\x81\xee\xd0\xdf\x31\x24\x50\x6b\xb2\x41\x5e\x68\xbd\x81\x48\x38\x14\x5f\x1b\xb1\x74\x07\x4c\x9d\xab\x33\x60\x1f\x05\x20\x69\x7b\xd5\x8c\xa6\x7b\x4f\x4f\x02\x6c\xfa\x7c\x98\x57\x01\x35\xdb\x19\x3b\x9b\xf1\xf2\x3a\x4a\x17\xd2\x5c\x26\x85\x84\x49\xc1\x76\xa9\xe4\x32\xb0\xb4\x73\xf7\xab\x60\xd7\xa3\x98\xb4\x4d\x36\x99\x7e\x8e\x74\xb5\x6d\xdb\xab\x6b\x94\xf7\xc0\xb2\xa9\xc0\x1b\xd7\x05\x7b\x33\x58\x02\xcb\xd1\x64\x6d\x09\x8c\x8b\xc9\xfb\xda\xd0\xf1\xf2\xc6\xb5\xc9\x3e\xa3\xdd\xca\xc1\xf9\x81\x37\xd3\xf7\x94\x97\x84\x9e\x0f\xf8\xd3\xf1\xfb\x93\xe9\xce\x64\xf0\xa7\x9b\x1f\x76\x4b\x3f\xcf\x18\xc6\x09\x39\x98\x98\xd6\x72\xbc\xd0\x26\xc1\x82\xe1\x02\x0b\x11\xc8\xc4\x32\xde\xbe\xde\xbb\x84\x39\xa9\x71\xfa\xa3\xb3\xf5\x6a\xb7\x26\x22\x9a\xe2\x53\xce\x09\x79\xbe\x5b\xed\x24\xc4\x1d\x63\x74\x4f\xc0\x1c\x4c\xf7\x65\x4c\xde\xa7\xe4\xe2\xef\xb2\x74\x5b\x68\x76\x05\x31\x7b\x87\xce\xdc\x75\xb6\x0d\xdf\x6e\xa6\x7c\x84\x24\xf1\x68\x05\x26\x84\x3d\xac\x66\x13\x4b\x18\xe3\xf5\xb7\xc8\x77\x1e\x45\xb2\xb1\xc1\xba\x2f\x19\x70\xb0\xc8\x4b\x2c\x5b\x10\x01\x6e\x91\xc5\x1f\x92\x10\x36\x58\xfe\x25\xe7\x67\xb7\x5e\x4c\xc2\x51\x24\x86\x5c\x06\x0e\x85\x84\x00\x90\x2f\x14\x5a\x42\x81\xef\x9c\x01\x5e\x68\xee\x8e\x43\x93\xe1\x67\x63\xb5\x80\x96\x26\xff\xeb\xdf\x5f\x12\x8c\x02\x9b\x3b\x46\xe9\xc0\x76\x3e\x03\x63\x0b\x75\xaf\x14\x93\x60\x84\xaa\x59\x67\x87\xe4\xbb\x62\xb6\x53\xaa\x8b\x17\xe4\x19\x83\xc9\xe4\xc0\xdd\x2b\x72\xc2\xe8\x05\x1c\x3b\xe9\x1e\xc0\xe1\xca\xea\x0d\x3f\x30\xff\x8a\xdc\x22\x88\x27\x7a\x02\x0c\xc2\xa0\x23\x88\xed\x08\x0a\x7d\x39\xb1\xdf\xf4\x9d\x2d\x66\x8b\x42\x8d\x3f\xa1\xf0\xe7\x1f\x7e\x15\x4e\x04\x0b\xf8\x7d\xf7\x1d\xd2\xd9\x2e\xe1\xf7\x60\xc8\x9f\x48\x5b\x9e\xc2\x05\xf8\x8e\x7c\xfd\x13\xa9\xaf\x0d\x68\x7d\x47\xbe\x7a\xc5\xb9\x6c\x4b\x70\xe7\x2b\xc0\xbc\xc3\xf7\xc7\x11\xc6\xe3\x9b\x01\xe2\x6c\xbd\x56\x13\xc4\xce\x05\xcc\x3e\x00\x52\x17\x8f\x11\x20\xa5\x36\xf2\xb2\x2b\xbb\xed\xbe\xb3\x3d\x24\x2f\x51\xca\x3b\xf1\x03\x9a\x7b\x0d\x5d\x95\xe7\x48\x97\x62\xbd\x13\xd1\x27\xd2\x2f\x75\x8a\x7b\xb6\xc2\xf5\xb7\x23\xf2\x07\x2c\x11\x46\x6e\x11\xfe\x04\x89\xa7\x80\x46\x35\xbd\x9c\xb4\x9b\x55\x64\x69\x99\x32\x54\x56\x16\xd0\x11\x1d\x18\x93\x15\x98\x40\x4f\x0d\x09\xeb\x85\x61\x76\xaf\x1b\x5a\xc0\xfe\xce\x56\x0f\xfc\xef\xe6\xf6\x9c\x2e\xf7\x96\x7d\x15\x3f\xd2\x12\x3a\xdd\x96\xd8\x0e\x7d\xf7\x07\x82\x20\x48\x95\x17\x0b\x5d\xbe\x20\x20\x9e\xf4\xb5\x5a\xd7\x8f\x77\xed\x4e\xab\x94\xed\x78\x10\x7c\x1b\xf9\xc7\xf8\x1f\x48\x5b\xa8\x0a\xd9\x0e\xf2\x0f\xcc\xfd\x14\x9d\x8d\xab\x8e\xf8\x98\x74\xd7\xd0\x3f\x4d\x38\xfc\x9c\x70\x49\x22\xd5\x63\xf2\x25\xa0\xb0\x17\x71\xff\xd5\x5d\x12\x7e\xfe\x03\x41\xb2\x7c\x5b\x40\xfa\x45\x41\x44\xfe\x81\xfd\x0b\xfb\x77\xfa\x1f\xd8\xbf\xf0\x7f\xff\xf3\x1f\xb8\xf7\x37\xfe\x2f\xfc\xdf\x48\xc7\xbf\x89\x08\xd5\xb6\xe0\x2a\x45\x10\x73\x5f\xce\x6a\x26\x41\x1e\x78\x50\x33\xd7\x29\xfc\x6c\xcd\xfc\xdf\x3d\x9a\x39\xcd\xa9\x81\x1e\xf6\x79\x38\x99\x22\x0e\x69\xfb\x04\xa3\xc7\x31\x82\xb4\x5d\x5d\x21\x3f\x0e\x11\xe0\xd5\xff\xba\x33\x6c\x08\xc8\x8f\xb0\x47\x7c\x39\xe7\xb5\x4f\xe5\x31\x8a\x30\xc2\xe2\xce\x8d\x93\x73\x78\x76\x09\xf4\x28\x97\xe7\x90\x46\x38\x3d\x72\xc8\x63\x76\x0f\x56\x76\xca\xed\xb9\x65\xde\xc3\xdc\x9e\x41\x1a\xe5\x36\xec\x24\x17\xb9\x75\x33\x97\x02\x55\xb0\xd2\x9d\xb1\x03\x24\x1d\xda\x4b\x20\x43\xe4\x07\xf2\xf2\xf2\xe7\xf1\xdd\xb5\xe6\x4c\xc7\xa6\xa6\x84\x8e\xd2\x8e\x64\x0d\xaf\x7f\x03\x11\x3d\x07\x4b\x26\x9e\xef\x8b\xe1\xcd\xb7\x2f\x91\xa6\x20\x92\x36\xd1\x0c\xc7\x5b\x18\x88\xdd\x6a\xd5\x17\x07\x2c\xdc\x65\x3c\x22\x4f\x81\x05\x64\x07\x5a\xc8\x3b\xb0\xb6\x9a\x31\x89\x80\x19\xab\xc5\x7e\xc9\x8f\x68\x86\x03\x27\xd0\x8a\x80\xa8\x3a\x98\xd8\x88\xbd\x00\xba\x7e\x4a\xc6\x31\x17\xfa\x29\x91\xcf\x38\x45\x7d\xd9\x43\x9e\x4e\x7b\x74\xdf\x70\xaf\x3a\xa2\xd5\x8e\xbd\x4a\x1c\xb8\x39\x51\xc8\x72\xa9\x6b\x5e\xcd\x1e\x71\xb4\x05\xb4\x1d\xb0\x58\x22\xee\x9c\x79\x1f\x91\x0f\xd3\x80\xa7\x8c\xc6\xed\x8a\x76\xeb\xd1\x60\x3b\x95\x8c\xe7\xfd\xe6\x2b\x06\x6b\x60\x86\x7c\xab\xe3\xaf\xe8\x30\xef\x8b\x92\x98\x6d\x09\xde\xf2\x2b\x33\x0c\xbe\x12\xeb\x48\xad\x24\xf6\xf8\x6a\x57\xd8\x7f\xe6\x07\x87\xcf\x59\x3e\x5b\x14\x10\xec\x9a\x30\x77\xab\x3d\x8a\xe8\xc4\x14\x83\xa2\x07\x62\xc0\x8d\xf3\x0e\xf4\xcf\x2f\x31\x12\xbf\x7c\xff\x6e\xc1\x89\xac\x03\xdb\xfe\x12\x9d\x2e\xff\xac\xe2\x8c\x6d\xd1\xe4\x97\x0b\x13\xe5\xef\x8d\x1f\x96\xcc\xaf\xe8\xec\xe5\x3a\xef\x19\x87\x5a\xdd\x79\x36\xcf\x82\xcb\xa6\x72\x0e\x1c\xc3\xcf\x83\xfb\xe5\xbf\x33\x03\x28\xfa\x92\x87\x9d\x2f\x2f\x3c\xc9\x6c\xc3\x38\x7f\x99\xd1\x5e\x12\x04\xa9\xf7\x45\x21\x87\x64\x86\x57\x24\xf2\x2b\x74\x97\x05\xda\xe3\x8a\xdc\xfe\xa6\x29\x71\xbc\xed\x6a\x3e\x8f\x5a\x5d\x80\x27\x30\xbb\x88\xcf\x8c\xe3\x22\xfd\x69\x89\x2b\x0e\xf2\x93\x77\xf0\xf1\x29\xc6\x9a\x3d\x3b\x3e\x7f\x4b\x81\x0e\xd0\x74\x1b\x99\xd9\xa6\x21\xc5\x1b\xdb\xae\x50\xf6\xa8\x1e\x02\x3c\x81\x1e\x76\xe7\xd6\x31\xbc\x85\x0e\x93\x13\x79\xe1\xb9\x73\xec\xf3\x03\x03\xb5\x84\x2a\xa3\xde\x44\xec\xf9\xd8\x45\x39\x34\x42\xe1\x30\x11\xc9\xe0\xf7\x87\xc9\x91\xc4\x64\xae\x9c\x43\x6e\x8a\x8e\xb1\x20\x70\xae\x0e\xf2\x61\x57\x4b\x25\x31\xec\xde\x74\x82\x8f\x91\x73\xf6\x13\x59\xb0\x93\xf5\x80\x03\xf4\xb1\x6c\x6a\x86\x7d\xde\x06\x55\x08\xc7\x4b\xd3\xd4\xcf\xdf\xf5\x4e\x3e\x55\x18\x37\xd7\xde\x6d\x0b\xda\xd0\x7a\x8f\x03\x71\xd7\xa1\xce\x66\xec\x2d\x93\xb4\x8f\x38\xa8\xa5\x65\x3a\xa6\x6c\xea\xb1\x72\x45\xe7\x68\x67\x2c\x10\x28\xd0\xf2\x96\x17\xfe\xf7\xf6\x4a\x96\xa1\x6d\xab\x2b\x7d\x1c\x6b\x28\x81\xe0\x40\xd3\xa1\x72\x0d\x2a\x60\x3d\xc6\x84\xe2\x5d\x2f\xa6\xbe\xfd\xa8\x27\xc6\x9c\x99\x5c\xc9\x8b\xc9\x23\xd2\xf5\x18\x77\xab\xc8\xcf\x4d\x75\x17\x69\xfc\xaa\xd4\x77\x93\xa0\x0f\xa6\xc2\x8b\xb4\x4e\x53\xe3\x79\xf0\x0b\xa9\x32\x74\xfa\xf3\x34\xdb\xbc\xb6\x15\x3a\xee\xbc\x8a\xd9\x2e\xb9\xbb\x03\xd9\x17\xc5\xcb\x92\x0f\x26\xc9\x20\x3a\x98\x2b\x4b\xde\xb7\x72\xc4\xa4\xa7\x5d\xc8\x79\x79\xf9\xfe\x3d\x7e\xbb\x16\xef\x07\xc1\xe1\xdb\xa3\xea\x0c\xfa\x05\x3f\x3f\x75\x4d\x11\x84\xcd\x7b\x32\x9c\xd7\x2f\x13\x4b\x36\xd2\xad\x78\x09\x28\x68\xa0\xbc\x04\xe2\xef\x95\xcf\x02\x9c\xf6\x7d\x5e\x81\xbb\x48\x6e\x0f\x75\x81\xa2\xc7\x92\x66\x8f\x6d\xa8\xeb\xd0\x42\x24\xd3\xd4\x21\x30\x76\x79\x4b\x93\xe1\xd8\x38\xca\xd1\xfe\x77\xc7\x79\xfb\xd0\x71\x34\x8e\x64\xf4\xa3\x9e\xa7\xe8\xcd\xd0\x51\xfe\xd9\xee\x50\x8f\xeb\xb1\xd7\x3f\x8c\x64\x8b\x42\xb6\x82\x7c\xfe\x1c\xd6\xe0\x3f\x11\xf4\xcb\x97\x6b\xa8\xce\x0d\xdf\x29\xed\xff\x4e\xf4\x98\x00\xdf\x91\x4e\x23\xe8\x23\x0a\xf7\x18\xbc\xe8\x4a\xe7\x4f\xc1\x9f\xe0\x5c\xe7\xfb\x1a\x12\x66\xd2\x24\x21\xec\x91\x5c\x7a\xad\x87\xe0\x39\xd9\xf4\x0a\x95\x5f\x95\x4f\x6f\x14\xf6\xc1\x8c\x7a\x85\xda\x69\x4e\x8d\x1b\x70\x21\xab\x1e\xf5\x8d\x3c\xd1\x56\x77\xf6\x19\x66\x29\xf1\x46\x2b\x88\xfd\x57\xb6\x6f\x49\x13\xef\xe5\x1c\x7a\x16\xf6\x40\xfa\xac\xbf\xb8\x3b\x85\xf8\xad\x46\xdc\x26\xee\x2f\xd9\x86\x39\x9b\x31\x34\xde\xa1\x6e\x2e\xe1\xb9\xd2\xa6\xb3\x71\x37\x45\x2b\xdd\x89\xb9\xb9\x80\x0e\x88\xb9\xe5\x6e\xc7\xe2\x6e\xdb\xda\xc4\x00\xce\xca\x82\xe7\xaa\x70\x1c\xfd\xe5\x5f\xff\x3e\xac\x5d\xfe\xf3\xdf\x73\xab\x97\x7f\xfd\x3b\xaa\x73\xb8\x30\x63\x0a\x66\x07\x5c\x86\x69\xc0\x8b\x6b\xa1\x03\xae\x53\x34\x81\x64\xda\x02\x8e\x25\x73\x65\x28\x5e\x55\x9b\xb5\x80\x31\x81\xd1\x1d\xdb\x71\x6a\x75\x35\xe1\x62\x9b\xc0\xc8\x16\xd8\x30\xa0\x35\x4e\xe6\x01\x07\x4c\x17\xcd\x35\x8c\xf8\xba\x92\x83\x42\x3d\x5c\x8f\x77\x16\xeb\xb3\x77\xad\xe8\x87\x68\xca\x2e\x16\xec\x9a\xd0\x92\x04\x30\x3f\x18\x78\x1d\x7f\x57\xfa\xdb\xda\x42\xe7\x42\xa5\x37\x5c\x53\x0b\xd7\x79\x6f\xdb\xe5\x3c\x4f\x88\x84\xed\x7f\x17\x85\xba\xb8\x3b\x4a\x22\x64\xec\x3a\xe0\x69\x62\x26\xee\xa0\xbc\x28\xe8\x95\xa4\x75\x5e\xd4\x1c\x70\x00\xa2\x9a\xd6\x95\xf3\x2e\x24\xc7\x77\xf8\x2b\xe2\x95\xc4\xb6\xd0\xea\x20\x25\xb1\x53\x3f\x3a\xf3\xf2\x72\x7c\x1b\xf9\x8c\xbd\x22\x2f\x38\xba\xbb\x5e\x5e\x11\xfc\x15\x41\x5f\x91\x97\x97\x78\x76\x2e\x9d\x39\xdd\xca\x52\xf4\xdc\x69\xc7\xd6\x0b\x36\xd6\x0c\xcd\xd1\x80\x3e\xf6\x7b\x80\xbe\xd9\x6f\xfa\x8b\xc7\x2b\xc6\x7d\x45\xe9\xaf\x28\x81\x60\xec\x77\x9c\xfd\x4e\x32\xdf\x50\x02\x27\x39\x3a\x85\xe2\x2e\xd3\x89\xb0\xe3\x63\xff\xd9\x8e\xa3\x19\x91\xb6\x63\xc7\xd4\x94\xcb\x94\x38\x9a\x62\x6e\xa1\x44\x8c\x57\x36\xdc\xe7\xcf\xb1\x66\x9c\x3c\x4f\x72\x91\x1e\x49\xa2\x24\x7b\x0b\x3d\x72\x0c\x14\x65\x1c\xad\xca\x5d\xa4\x41\x91\x14\x81\xdf\x42\x83\x1a\xfb\xd9\x7a\xb7\x6f\xf0\x4e\x73\x2f\x92\xa0\x09\x14\xbf\x49\x0c\x7a\x47\x22\x88\x7e\x09\x48\xb0\x24\x46\xdd\x42\x82\x19\x2f\x4c\x45\x53\xb7\xc9\xa5\x60\x31\x1a\xbf\x89\x04\x7b\x24\x45\xd0\xc4\x9d\x80\x0e\x43\xd2\xc4\x6d\x74\xdc\x49\x07\x93\x89\x05\x27\xc0\x31\xad\xcb\x36\xc5\xa1\x18\xca\xdd\x82\x9e\xf3\xd0\xfb\x15\xdb\xf1\x46\xb1\x2e\x63\xc7\x19\xec\xa6\xa9\xc6\x50\x0f\x7d\x30\x0b\xde\x1e\xfc\x32\x01\x8a\x63\x6e\xd2\x0e\x86\x85\x09\xec\x37\x75\x6e\x00\xb8\x4c\x88\xa3\xb9\xdb\x24\xc1\x8f\x26\x3a\xd8\x46\xfb\x8f\x0d\x5f\xa2\x84\xa1\x0c\x45\xde\x34\x23\x18\xe1\x8b\xb3\x2f\x3e\x5c\x9c\x71\x0c\xc3\x19\xfa\x36\x49\xc8\xb1\xaa\x6d\x76\x8f\x50\x98\x0b\x7d\xac\x6a\x50\xbf\x18\x1a\x31\x8c\xc2\xb0\x9b\x82\x30\x46\xed\x4e\x8e\x76\x15\xfd\xcd\x15\x31\x68\xe6\xb6\x30\x8f\xd1\x63\xcd\x98\x40\xdb\x19\x9f\x9e\x19\x5c\x21\xc5\x70\xec\x6d\x33\xc2\x1c\xa5\x7a\xef\x70\x06\x5c\x4e\x26\x18\x8e\xa2\x04\x79\x13\x11\x76\x6f\xbe\xaa\xe9\xaf\x78\x61\xc4\xd9\x31\xf4\x2b\x81\x21\x18\xf9\x1d\xe3\xbe\x93\xdc\x37\x0c\x27\x58\x82\x4a\xa1\xd8\x85\x7c\x7e\xb1\x9b\xe1\xd6\x84\x7e\xd2\xd1\x10\x5e\x68\x14\x32\x83\x42\xb3\xdc\xef\x55\xfb\xf5\x61\x31\x5f\xed\x75\x2a\xfd\x1e\x95\x2f\x14\x79\xa2\x2a\x0e\x87\x78\xb9\x59\xa9\x31\x75\xbe\xcc\x77\x85\x66\xbe\x4b\x57\x1b\xd9\xb6\x90\xef\x0d\xea\x62\x54\x41\xb1\x44\x70\x97\x08\x4f\xf5\x33\x8d\x21\x4f\x0d\xc9\x3e\x2f\x14\x07\xfd\x16\xde\xad\xd4\xf1\x6e\x9d\xcc\x74\x0b\xc5\x6e\x93\x21\x85\x6e\xa3\x52\x17\xf1\x66\xb1\x47\xf6\x5b\xc5\x7a\xa9\x25\x56\x2a\xc5\x93\x59\x88\x25\x42\xb8\x44\xb2\x83\x4a\x81\x6e\x89\x64\x5d\x2c\x09\x8d\x6c\x4d\xcc\x67\x18\x02\xe7\x49\x82\x1e\x51\x0d\x31\xd7\x6e\x55\x0b\xfd\x0a\x53\xc8\x54\xb3\xb5\x66\xb5\x94\xaf\x93\x6d\x46\x18\xf6\x7b\xdd\xc4\x44\x48\x4f\x5d\xad\xc6\xb0\x58\xaa\xe2\xd9\x12\x91\x17\x9b\x64\x66\x50\xcd\xd7\xc4\x5c\x35\x5f\xee\x8a\x8d\x2e\x5e\x1c\x12\xa3\x5a\xbe\x5d\xac\x8b\xdd\xac\x50\xe7\xdb\x7d\xa6\x99\x65\xea\x03\xbc\xf8\x72\x6f\xf7\x8d\xbb\x94\xbd\x32\xd7\x41\xc7\xe2\xa1\xd9\xf8\x9b\x0d\x2f\x77\xa6\xbc\x22\xe4\x2b\xe2\x58\x2b\x98\xc0\x02\x4f\x7b\x4e\xee\xb6\x3f\x7f\xa7\x15\xb6\x3e\xd9\x82\x8a\xe6\x8c\x81\xbe\x9c\x02\x63\xb5\x20\x5d\x9f\xe9\xb6\x73\x2f\x0f\x4e\xe7\x3d\x5d\x16\x4f\xd1\xf3\xd1\xbe\xf0\x15\xc1\x92\x6a\xf9\x5c\x93\xc5\xbd\x6a\xde\x35\x5a\x84\xf4\x8c\x31\x6e\xf0\x64\x08\x9c\xc5\x3c\xa6\x5c\x9f\xfc\xcf\x27\x3f\x19\x7e\xfa\x8e\x7c\xc2\x50\xf4\x5b\xb0\xdd\xf8\xf4\x8a\x7c\x3a\xf4\xf2\xb8\x37\xbb\xed\xdc\xe1\x4b\x67\xbb\xf4\xbe\x8c\x4e\xdc\x01\xc2\xef\xe9\x71\x61\xee\x9d\xc1\x4f\xff\x8d\x73\xc9\xa8\x68\x44\x44\x34\xfc\x15\x21\xfe\x47\x44\xc3\xf7\xa2\x31\x04\xc3\xfc\x8f\xce\x9a\x2f\xda\xff\xd8\xac\xe1\x2c\x4b\x72\x28\xc5\xb1\x94\x3f\x6b\xa8\x27\x9b\xae\x2d\x34\x4f\x34\x0e\xc7\x09\x82\xc1\x51\x82\x66\xa9\x6f\x24\xc3\x50\x2c\xca\xfc\xad\x64\xc4\x76\x32\x62\x28\xba\x8b\x27\xff\x6b\x32\x12\xaf\x08\x4b\xb1\x1c\x47\xb0\x34\xcb\x79\x22\xfa\x12\xda\x0e\xb0\x1c\xcd\x98\x8c\x25\xa0\x03\x43\x86\x81\xad\x1e\x8c\x35\x31\x05\xf2\x98\xc2\x79\x1f\x38\xe3\x04\x3b\x3d\x19\xc0\xd1\xde\xe1\xdd\x12\xb9\x3e\xe8\x8b\xb4\x86\xda\x64\xea\x12\xc4\x5e\x91\x4f\x7e\x92\x19\xcf\xe1\xf6\x97\xd9\x92\xc7\x15\x89\x33\x81\xbb\xfc\x2c\x3d\x07\x14\x7e\xba\x9e\x23\x12\x25\xd3\xf3\x9d\x6b\xf0\x9b\xe2\x92\xcf\x15\xcd\x06\x2e\xfb\xd3\xf4\xec\x53\xf8\xe9\x7a\x8e\x48\x94\x4c\xcf\x77\x6e\x43\x7c\xae\xae\x2c\xe1\xce\xf5\x87\xde\xbb\x84\xdb\xf5\x88\xee\x84\xa5\x5e\x91\x17\x9a\x96\x59\x89\x20\x28\x4e\x01\x0c\x54\x15\x85\xc6\x54\x4a\xc5\x25\x82\x41\x69\x9c\xc3\x68\x9c\x22\x65\x9a\xc4\x58\x9a\x20\x64\x05\xc7\x70\x8c\x24\x18\x12\x95\x19\x59\x41\x25\x88\xb2\x14\xe5\xae\xa9\x25\x15\xe3\x58\x5a\xc6\x25\x49\x55\x24\x5c\x66\x69\x86\x54\x08\x52\xe2\x20\xc4\x08\x94\x91\x54\x95\x94\x51\x19\x03\x92\x84\x52\x38\xe4\x54\x06\xa8\x00\x55\x18\x5a\x86\x32\x81\x4b\x94\xca\xbe\x78\x76\x83\x46\x36\xcf\xf4\x77\x82\xfc\x4e\x70\xd1\x3d\x75\xf0\xf5\x37\x0a\x23\x48\x8e\xba\x7a\x17\xc7\x48\x86\x64\x09\x9a\x64\xd1\x57\x04\xa3\xdd\xf9\x3c\xb9\x5e\x11\xce\xfd\x0f\x0b\xfe\xdb\x7d\x89\xed\xff\x70\xf7\x14\x3c\xcf\xf3\x59\x86\x1d\x4d\xed\x0a\x93\x96\xaa\xa5\x11\x8a\xa2\x2b\x48\x76\x32\x4c\x1a\x5d\xd7\x0a\x96\x9d\xaf\x2e\x39\x3a\x35\xc1\xf0\x0f\xbb\x66\x0d\xc8\x37\x73\x23\x5a\x9b\x19\x66\xe4\xd9\x54\xb7\x54\xa2\xfb\xe2\x3c\xf7\xa1\xcf\x5a\x2d\x68\x11\xbd\x55\x6b\xfe\xd1\x2e\x8f\xf8\x66\x93\x64\x3a\x4d\x17\x35\x3f\x68\xf4\x6a\xc5\x35\xbf\xbf\xa0\x52\xcd\x2f\xb8\xec\x64\xd0\x63\x38\x7e\x35\x12\x39\x30\xc9\x8b\x1b\x6b\x94\x6b\x4e\x7a\x84\xa4\xea\x05\xfe\xad\xc1\xa4\x36\x25\x75\x94\xed\xf4\xb7\x99\xa5\xd2\xee\x92\x05\x76\xb8\x74\x14\xa5\x58\x59\xeb\xef\x0d\x3b\x23\x0f\xfb\x1b\xa5\x34\xdf\xb6\xcb\x93\x99\x42\x6d\xd7\xb5\xfc\xc4\xc5\xdc\x15\xc9\x2a\xf8\x58\xe2\xcd\x03\x31\xbe\x2e\xf0\xc7\x57\xc6\xfd\x6f\xc4\x0f\x30\xb2\xc9\xf3\x39\xb4\xcc\xff\xdd\x2e\xdf\xa8\xb0\x57\xef\xf4\x33\xc6\xfb\xa3\x0e\x41\x3e\xc7\x98\x5f\x00\x4e\x72\xb8\xc2\x71\x0c\x90\x31\x82\x50\x39\x14\x23\xa0\x2a\xe3\x14\xab\x4a\x94\x24\x53\x84\x04\x55\x94\x63\x25\x95\xe3\x58\x45\xa6\x58\x59\xa2\x50\x55\xa6\x55\x96\x95\x18\x15\xb0\xde\xe1\x0c\xe1\x47\xba\x53\xdb\x66\x63\x4d\x9e\x40\x69\x22\xde\x21\x76\x77\xfd\x35\x32\xcd\x61\x2c\x79\xc1\x21\xd8\x84\x0e\x41\x97\xcb\xd5\x91\x4e\xaf\x3b\x0d\x8a\xef\x30\x6c\x79\x98\xc2\xde\xf3\xf5\x14\x5b\xd6\xd2\x8b\x21\x91\x9f\x55\xbb\x8d\xcd\xbb\x56\x55\xe9\x09\xdf\xd5\xab\x2b\x0b\xd3\x06\x85\xe2\x62\xd8\xa5\xda\x8b\x56\x51\x51\xf3\x4d\x6e\x5b\xcf\xbd\x71\x7a\xbe\xb6\xcd\xbf\x91\x28\x5d\xb6\x25\x66\xe0\x7b\x81\xe7\x10\x93\xc3\x84\xa6\xad\xb7\xce\xac\x54\xed\x77\xde\x15\x21\x85\xa3\x92\xf3\xa1\x00\xc0\x11\x42\xc3\xe9\xce\xf3\x64\xbf\x5d\x67\x2b\xa5\x16\xbf\xe5\x4a\xa5\x2c\x5b\xc6\xf1\x9e\x0d\x08\x6e\xd5\x76\x1c\x82\xcc\x71\x4d\xb3\x36\xeb\x50\x69\x72\xd2\x95\xf2\xc0\x49\x97\xf4\x3e\x10\x27\x8a\x4e\x15\x3d\x1f\x68\x9e\x71\x88\xda\x24\x62\x4f\xff\x0b\x0e\x41\x78\x3e\x71\x83\x43\x10\xcf\x31\xe6\x17\x86\x42\x69\x56\x06\x32\xae\x62\x90\x06\xa8\x84\xcb\x40\x05\xb8\x42\x29\x92\x24\xcb\x32\x25\x63\x1c\xcd\x60\x8c\x4a\xab\xaa\xca\x32\x1c\x27\xcb\x04\x90\x68\x40\x73\x94\x84\x32\x12\x87\x01\xff\xb4\x12\x3f\x6b\xdb\x4c\xac\xc9\x93\x38\x8d\xc7\xbb\x8b\x7b\xd7\xcd\x2e\xc1\xce\x0a\x63\x59\xf6\x82\x43\x50\x09\x1d\x82\xe8\x16\x66\x95\xf5\x7b\x71\x61\x56\xab\x95\x94\x86\x29\x2b\xf6\x23\xbf\x1e\x8d\x36\x2a\x9e\x4e\x4f\x29\xa3\x56\xb7\xc0\x42\x97\x32\xcc\x1c\x48\x1f\xef\x68\xb3\xd0\x98\x17\x06\x6d\x19\x97\x27\x99\x6c\x6e\x69\x6a\x9a\x50\x68\x91\x2a\xbe\xb0\xd0\x65\x86\x2b\x00\x66\x38\x49\x0d\xa4\x92\x37\x81\x9e\x43\x84\x6c\xb4\xdd\xaa\x76\xbb\x45\x3b\x93\x4e\x7f\x14\xed\x59\x91\x37\xb1\x11\xdf\xcd\xcc\x4d\x76\x43\xb6\x5b\x03\x71\x0b\x54\x67\xf4\xd6\x33\xf2\x54\xad\x38\x73\x46\xa6\x5e\x56\x37\x40\xad\x83\x75\xba\x43\x10\xdd\xee\x5a\xff\xa8\x29\xf5\x7a\x65\x30\x81\x62\x2e\x83\x75\xe0\x9b\x90\xe3\xcc\xa1\x87\xbf\x76\xc6\x21\x8a\xe8\x39\xa3\xfa\x9b\x3b\x04\x7e\xab\x43\xe0\xcf\x31\xe6\x17\x9a\x50\x38\x56\xa5\x08\x1a\x42\x9a\x55\x30\x09\x67\x24\x4a\x62\x39\x15\x27\x80\x4a\x11\x18\x26\x31\x14\xcd\x01\x9c\x54\x81\x8a\x91\x28\x01\x14\x54\xa2\x70\x89\x26\x08\x17\x07\xe4\xb8\x4b\x19\x82\x8e\x35\x79\x8a\x64\xc8\xf8\x05\x15\x45\x32\x6e\x82\xf0\xf7\x73\x24\xc5\xe1\x17\xdc\x81\x48\xe8\x0e\x78\x63\x34\xc3\xc4\x15\x65\xa2\x52\x99\xe9\x93\xc6\xb6\xfe\xde\xdd\x14\x88\xde\xd2\x9c\xa7\xde\xf3\x7c\xdd\xc9\x62\x15\xbc\xc6\x64\x18\x7a\x94\xae\x51\xa5\x76\xf6\xad\x45\xa4\x96\x1f\xf9\x7e\xa5\x59\xff\x10\x26\xda\x44\x77\xc8\x72\x9b\x87\x39\x66\x68\x99\xb6\x00\xaa\x69\xaa\x54\xf5\xd7\x2a\x9e\x3b\x78\x7f\x95\xf6\xff\xf1\x9e\xc5\xda\x87\xcf\x6b\xbe\xd1\x9c\xfb\xd3\x8d\xf6\x9a\xec\x6a\xb1\xac\xd5\x53\xad\x72\x3a\xfb\x51\x42\x7b\xa3\x32\x4c\x51\x70\xba\x4e\xcf\xc9\x0e\xa9\x4c\xd7\x8d\xe6\x7a\x2d\xf4\x18\x66\x61\x8c\x00\x3d\xed\x55\xab\xdd\x8c\x50\x04\xab\x34\xdc\x94\xe9\xb9\x58\x2b\x7d\x7c\x34\x7a\xef\xd8\xa0\xce\xc1\xf5\xb2\xb8\x19\xf4\xf8\x7c\xc3\xcb\x12\xa5\x33\xee\x22\xd8\xe7\x4c\xee\x6f\xee\x2e\x37\xe7\x0f\xec\x39\xa6\xee\x35\xb0\xed\xf6\x08\x18\xc7\xa0\x5f\x51\xec\x2b\x8a\x21\x28\xfa\xdd\xfb\x17\x6b\xd2\x34\xcb\x50\xf1\xf9\xc1\xbd\xeb\xe6\x07\x12\xe7\x48\x8e\x66\x70\x8e\xbe\x60\xf1\xe7\xed\xdd\x67\xe9\xaf\x9e\x9a\xf8\x2b\x33\xa8\x68\xe4\x36\xbd\x6d\x57\x32\x4c\xce\xc8\x71\x45\x1c\xdd\xcc\x32\x29\x1b\x9d\x38\xf6\xba\xb4\xfe\xc0\x06\x4a\xbb\x3f\x04\x99\x32\xf0\xf7\x06\xc2\x19\x53\x3e\x7f\xed\x4c\x99\xe7\x33\xf3\x5f\x20\xc8\x53\xaf\xfd\x86\x33\x30\xe5\x2b\x7b\xf0\x04\x0f\x8a\xdd\xbb\x25\x8f\xe9\xb0\x0b\xf9\x8f\xbf\x81\x25\x51\xca\x2b\xd7\xc7\xf8\xdd\x15\x34\x78\x04\x0d\x7e\x1f\x9a\xe8\xb9\x08\x71\x1f\x1a\x32\x7a\x72\x74\x1f\x1a\x2a\x52\xef\xbf\x93\x1b\x3a\x7a\x6c\x70\x1f\x1a\x66\x87\x86\xc5\x48\x86\xb8\x9b\x1b\x36\x52\xe9\xbf\x93\x1b\x2e\x5a\x4c\xbf\x0f\x0d\x86\x1e\x97\x77\xc9\x3b\xd1\x60\x91\x2a\xf1\x9d\x68\xf0\xe3\x22\xe8\xbd\xdc\x10\x91\xea\xf0\x9d\x68\x22\xa5\xc9\x7b\xb9\xa1\x22\x15\xce\xe7\x3c\xbb\xf9\x94\x73\xe7\xcb\xad\xbb\xaf\x88\xcb\x7b\xb2\x83\xe8\x98\x47\x18\x1f\x8e\x9a\xa1\x10\x77\x14\xdf\xf6\x1f\x68\xaf\x04\x84\x79\x25\x5c\xc7\x7c\xa8\x5a\xfb\x8a\x7c\x52\x2d\x73\xf1\x50\x65\xfd\x15\x09\x55\xae\xf1\xdf\xed\x34\xf2\x27\xf4\xed\x9c\x99\xa9\xe3\xd8\xbf\xff\x80\x9e\xce\xd4\x03\x5a\xde\xcf\xd4\xbd\xda\x38\x9a\xa9\xdf\xee\xdc\xf8\x27\xf4\x25\xc5\xcf\x54\xd0\x29\xb0\xff\xf0\x93\x7c\xea\xff\xcf\xd4\xa3\x33\x15\x2c\x3d\x0e\x1f\x70\x6f\x9a\xfc\x13\x33\xaf\xdd\xd6\x15\x06\xfd\x46\x85\x14\xb4\xd7\x1c\x79\xac\x39\xff\x09\x59\x57\xfa\xff\x7c\x52\x3e\x7d\x47\xf0\x57\xe4\x93\xf1\xe9\x3b\x82\xfd\xf7\x15\xf9\xb4\xeb\x45\xfd\xf4\xdd\x5d\x44\x7f\x92\x56\x5b\xcd\x98\x8c\xcf\x2a\xfb\xe8\xde\x25\x9d\xdb\x50\xd7\x4f\x21\x83\xf3\xbb\x28\xa2\xbf\xd3\xd4\x1c\x35\x6e\xec\x3f\x90\xde\xd4\xd0\xc9\x1a\x1c\x1c\x6b\x65\x3b\x10\x3e\xea\x26\x1e\x1a\xd3\x7a\xd4\x63\x7f\x0f\xa7\x7a\x72\xef\x67\xec\xcc\xed\x56\xd0\xfb\x0f\xe8\x5f\x3c\x73\x8f\xac\x3d\x7e\x8b\x99\xfb\xf9\x4b\x8c\xf0\x66\x63\xff\x37\x1b\x6a\x50\x50\x57\x86\x12\xc8\x72\x67\xe7\xad\xa7\x17\xbf\xff\xf5\xd1\xc9\x4d\xd0\x2d\xf1\x60\x8b\xf0\x2d\x6a\x0b\x76\x45\xfb\xbf\xc9\x9f\xaa\xb6\x07\x8c\xf9\x37\x53\x9b\xbf\x7d\xdb\xff\x8d\xfe\x54\xb5\x3d\x10\xbd\x7f\xbe\xda\xae\xec\x05\xcf\xbc\x7b\x25\xc9\x3e\xf0\x3a\xd6\xeb\xaf\xa1\xb8\x77\xbf\x19\xfb\x80\xe8\xd9\x3a\x1d\x1d\x5f\x53\xb8\x8a\x08\x8f\x20\x8a\xab\xff\x5c\x45\x44\x44\xf6\x56\x71\x35\x97\xab\x88\xc8\xe8\x26\xed\x5e\x44\x54\x64\x0f\x71\x37\x47\x74\x04\xd1\xdd\x3a\x62\x22\x6b\xe5\xbb\x39\x62\x23\x2b\xbb\xbb\x39\xe2\xa2\x0b\x8d\x7b\x11\x1d\x55\xee\xd8\xf8\xea\xd4\x75\x44\xd8\x31\xa2\xbb\x75\x74\x54\xbd\x23\x1f\xe1\x88\x88\x64\xa7\xbb\x11\x91\xc7\xf1\xfa\x7e\x8e\xa8\x63\x44\xf1\x35\xbc\x5b\x5f\xa3\xf2\x8c\x2a\xde\xb5\xe7\xd2\x6f\xa9\xe3\xc5\xbe\x34\xe5\x09\x91\x35\xf4\xf4\x1b\x00\x18\xcd\xaa\x18\x8e\xe1\xa4\xc4\xc8\x18\x47\xcb\x28\x50\x00\x84\x8c\xcc\x10\x80\x26\x15\x82\x51\xdd\xe9\x67\x65\x20\x4b\x14\x07\x38\x4c\x55\x09\x96\xa3\x71\x9a\x25\x29\xc8\xc8\xea\xcb\x2b\xe2\xb7\xfd\xde\xbf\xd8\x0c\x9d\x83\x93\xbb\x93\xbf\xf8\x5e\x43\x9a\xb8\xd0\x88\xe8\xdd\x3c\x8a\xea\xfe\x81\x61\x81\x32\xcb\x4e\x4f\x31\x86\xf5\x9e\x32\x7a\x73\x06\xcb\x4e\x31\xe3\x48\xf2\x10\x5d\x64\x17\xaa\x9c\x29\x55\x84\x49\xdf\xd0\xdf\xf3\xa5\x29\xe0\xbd\x03\x37\x7e\x77\xac\x9d\x8d\x9c\x67\x65\x0e\x7f\xfa\x67\xe3\x75\x3c\x9b\xe6\xeb\x24\x35\xcc\xe4\x08\xa7\xd8\xcb\xd7\xb1\x16\xc1\xa3\x35\x38\x6f\xb0\xe5\x16\x6d\x88\x18\xcf\xc1\xbe\xa6\x6c\x4b\x4e\xd7\x1b\xdf\xeb\x89\x41\x03\x60\x76\x65\x12\xa6\x43\x52\x6f\xd9\x86\xb0\x59\x36\xd3\x84\x59\x14\x53\x1f\x18\xd3\xda\x6a\x36\xa6\xab\xb5\xfc\x70\xd1\xec\x4f\xac\x55\x3b\xd5\xf1\x49\x13\xe2\x28\x7c\x58\x98\xdf\xf3\xdb\xac\xc8\x85\x36\x57\xb7\x7b\x46\xaf\x98\xed\x95\x8a\x28\x99\xe5\x46\x95\x8f\x8f\xca\x30\xd3\x52\xb2\x8b\x6d\xaa\xbc\x5e\x7c\xe8\x0a\xd3\x94\xf9\x6a\x7d\x33\xea\xca\xfc\x64\xbe\x2a\xa8\x66\x5b\x79\x1f\x2c\x8b\x04\xbb\x10\xdf\xad\xb7\xa6\x06\x6a\x76\x5b\x5c\x74\xca\xfd\x61\xeb\xa3\xf8\x3e\x31\x7f\xbc\x84\x0f\x5c\x0b\x9d\xb4\x7b\x79\x7f\x1f\xd8\xc8\x78\x5f\xfa\x1d\x5c\x07\xf8\xe6\x5e\x7f\x39\x0f\x28\xc4\xb6\xb4\x98\x2c\xb0\x1e\xae\x4c\xa8\x1e\xb6\x78\xc3\xa0\x5e\x93\x0b\x98\xb3\x99\xb5\x87\x95\x11\xb7\x16\x26\x66\x3b\x03\x60\x9f\xed\x6a\x79\xd3\x53\x52\x8f\x7f\x9f\xd5\x0f\xf3\x91\x89\xd0\x3f\x9a\x8b\x33\x57\xe6\xc9\xf4\xb3\x37\xd2\xe7\xf7\x3a\xf1\x74\x54\xdb\xeb\x24\x60\x6f\x05\xb2\x52\x6f\x30\xc2\x73\xfa\xa0\x0f\xac\x1e\xdd\xdd\xac\xa5\x3e\x51\x10\xcb\x93\xa5\x41\xf0\xed\xec\xb4\x94\x5f\x52\xd2\xa6\x5d\xea\x7b\xe3\xcb\xdd\x6c\xaa\x2e\x1f\xf0\x09\xfc\xb1\x4d\x06\x57\xec\x99\xb2\x07\x9f\x7f\x8c\x7e\x8d\xbc\x8f\xfe\x0f\xcf\x3e\xfe\xb3\x5c\x8f\xaa\x28\xbd\xe9\x2b\x5d\xb9\xdc\x9d\xa8\x9d\x49\x15\x9b\x5b\x8d\xda\x72\x92\xcf\xa3\x15\xa9\x4a\x1a\x59\xa9\xde\x23\x9c\xcc\x9a\xb7\x99\xbc\xde\x5a\x67\xb3\x6d\x72\x94\x9a\x96\x71\x0e\xce\x55\x75\x3b\xc4\x53\xab\x65\xb6\x6c\x6e\x37\x25\x7c\x54\xd3\x47\xd3\x62\x0d\xa6\xb2\x93\x1f\x3f\xbc\xc5\xb4\xf7\x72\x9e\x5d\x17\x83\xff\xbf\xf7\xb2\x7b\x2f\xae\x5c\x4f\x3a\xe1\xf7\x31\xd0\x90\xc0\x31\x1a\x25\x29\x85\x62\x38\x09\x02\x12\x55\x71\x85\xa0\x00\xca\x91\x28\xad\x40\x02\xb0\x1c\x09\x65\x89\x92\x20\x83\x2a\x92\x02\x28\x28\x73\x32\x4a\xe2\x0c\x40\x15\x0a\x60\xfe\x23\x9a\xd8\x23\x95\xaf\x50\x60\x24\xae\x05\x46\x02\x65\x38\xec\x42\x47\xaa\x7f\xf7\x68\x79\xe9\x9b\x65\x85\x9e\x41\x8d\x98\x2d\xcc\x12\xdb\x29\xe8\xb9\x34\x9c\xc8\x04\xd3\x18\x38\xc5\x4a\xe5\xa3\xdf\x63\xd7\x3d\x6d\x94\x01\xd9\x15\x55\xa5\x3c\xdb\x0d\x85\xc6\xe8\xb4\x9f\x84\xc6\x1b\x5d\xed\x81\xd0\xc8\x33\x0b\xdb\x0c\xb1\x52\xd8\xf3\xdb\x14\x8c\x4a\x4e\xca\x0d\xdf\x2b\xf3\xf2\x6c\x58\x41\x81\xf5\x3e\xcd\xeb\x46\xaa\x50\x41\x53\x0c\xbf\xa5\x27\x28\x48\x61\xd3\x59\xab\x05\x75\x81\x87\xe4\x7a\x31\x83\x6f\xa2\xdc\x9a\xe0\x0b\x32\x6b\x30\x0e\xc9\xcf\xca\x1f\xbc\x9d\x6b\x96\x50\x6d\x00\xa6\x05\xc9\x2c\x37\x4a\x22\xbf\x8e\x84\xc6\xe6\x39\xd3\x0f\xeb\x27\x3e\x34\x86\x80\xac\x37\x91\xae\xc2\x3a\x98\xcc\x36\x35\xd0\x6d\x70\x74\xe6\x43\xb5\x39\x88\xca\xa6\x25\x8e\x06\x1f\x99\x7e\x79\x9e\x37\x2b\xcc\xfc\x7d\xee\xb5\xed\xba\xa1\x49\xc3\x0e\xf3\x11\x73\x5d\x09\x8d\xcf\xa3\x7f\x1a\x06\x12\xd0\x3f\x09\x8b\x7e\x9f\xcb\x8d\x61\x29\xdf\xeb\xa2\x81\xe2\x6f\xb4\xe7\x80\x95\xf4\xfe\x5a\x9f\xe3\x59\x38\x7c\xf9\xab\xf9\xcb\xad\xc0\x76\x72\x89\xbf\x1f\x3f\xce\xa4\x98\xd0\xb2\xe5\x56\x5f\x72\x43\x7c\xc0\x6b\xb4\x31\x3b\x7c\x5d\x4e\x31\xc2\x63\xf4\xc3\x29\xee\x16\xfa\x41\x8a\x69\xcb\xa6\x68\x8b\x1a\xfb\xd6\x5c\x88\x13\xab\xf5\xb6\x4a\x09\xfd\xbe\x4a\x0e\xad\x0e\x63\xe7\xaa\x6f\xb9\x96\xc5\xf4\x0b\x62\x3e\x4f\x77\x9b\x19\x66\x96\x05\x22\x6d\x62\x9b\x42\x0e\x48\x93\x8a\xba\x22\x26\xd9\x9a\x51\xcb\xae\x45\x7e\xd6\x2e\x2b\x6f\xc2\x68\x35\x99\xb3\x13\x34\xc7\xc7\xa7\x18\x77\x45\x7f\x7b\x86\xc1\x64\x92\x22\x69\x02\xc5\x69\x06\x00\x96\xa1\x19\x28\xb3\x32\x0b\x09\x94\xa4\x50\x19\x02\x5a\x02\x34\x8d\x62\x24\x05\x39\x99\xc3\x49\x20\x49\x0c\xa5\x30\x80\xa6\x69\x4e\xa2\x65\x9c\x05\x7e\x86\xc1\x9f\x94\x61\xae\x2e\xbd\x09\x94\x8b\x6f\x68\x0d\x6e\x1e\x15\x0b\x1e\xcd\x2f\xbf\xd1\xd2\xfb\x42\x7e\xc9\x2d\x4b\x73\xee\x8d\x40\x9d\x0f\xb5\x39\x5f\x36\x57\xd9\x75\x9e\xd1\x40\x83\x90\x44\x3a\xd7\xca\xce\x53\xeb\x2e\xd1\x63\x69\xc6\x79\x9b\x57\x9b\x3d\xa2\xa4\x90\x14\xde\xb7\x2b\xdd\xe1\xb2\xd1\xb4\x44\x16\xce\x68\x75\x8e\xae\x36\x10\x2e\x32\xa2\xfd\x81\x89\x54\xaf\x66\x73\x93\xe1\xef\x98\x5f\xee\x8a\xef\x4f\xa4\x1f\xb5\x87\x44\xf4\xcf\xe7\x17\x9e\x19\x56\x59\x9e\x99\xe9\x13\xa1\x01\x51\xa5\xdb\x65\x7a\x45\x39\xd7\xdc\xd0\xcd\xf4\x5a\x2f\xbe\xc9\x44\x37\x87\x51\xa0\x4c\x94\x34\xcc\x83\xff\xd5\xf9\xe5\x17\xf2\x77\x5f\x7e\xf9\x8b\xe2\x3b\xff\xa4\xfc\x12\xde\xc2\xdc\x42\x3f\xc8\x2f\xf5\xb9\xd6\xc1\x2d\xb5\x4d\x88\x5c\xb6\xad\x67\xc9\x2a\x3f\x58\x95\xcd\xb4\x62\x13\xa6\x28\x54\x3a\x4c\xa6\xa3\x0c\x3e\xac\x15\xfe\xd6\x74\x32\x03\x79\x4a\xcc\x8c\x11\x58\x2f\x5b\xda\x9c\xcb\xda\xc4\x86\x6e\x2c\x53\x9d\x36\x93\xa7\xe8\xa1\x80\x7f\x34\xba\x84\xde\xdd\x7e\xe0\x99\x0b\x5b\x98\xfb\xf2\x0b\x07\x25\x08\x15\x28\xc9\x14\xae\x00\x02\x63\x15\x5a\x52\x08\x8a\xa4\x49\x92\xe0\x08\x8e\x41\x15\x85\xa1\x50\x5a\x92\x58\x49\x05\x2c\xad\xd2\x84\xcc\x72\x32\x45\x33\xac\x8c\x32\x32\xe5\x3d\xbd\x40\xfa\x2d\x0d\xcf\xc8\x2f\xd4\xd5\xfc\x82\x61\xcc\x85\x27\xee\x82\xbb\x47\x55\xe4\x47\x33\x4c\x2e\x32\xbd\xa1\x60\x15\x72\xde\x5e\xaf\xd3\x0a\xfe\xbc\x31\x82\x85\xd2\x86\x67\xb0\xe7\x23\x18\xd8\xc1\x67\xf8\x77\x7b\x45\xa9\xa9\x77\xa6\x67\x95\x73\xc5\xca\x0a\x67\xfb\x6b\x01\xff\x58\xe7\x9a\x94\x5e\xeb\x1b\x59\x26\x6f\x4e\xda\x7a\x27\x2d\xce\x36\x93\xe2\x26\xc7\xcc\xe7\xa3\x62\xad\x8f\xeb\xf3\xd9\x70\x93\xe6\xda\x24\x65\x97\xca\x85\x6c\x9d\x7c\x9f\xd1\xa9\x49\xe9\x7d\x53\xb4\xd6\xb4\x9e\x09\x7b\x30\x1f\x9b\x4d\xa2\xba\xe0\xef\xd1\x6d\x48\xd6\x9f\xae\xbb\x5f\x90\xf1\xee\xca\x38\x4f\xa4\x7f\x7e\x4e\xae\x65\x3c\x0f\xd5\x33\xa2\x74\xd5\x5b\x36\x85\xa2\xfe\xe9\xf5\x53\xa3\xf4\x09\xfd\x6b\x85\xa6\x93\xfb\x91\x65\x5b\x74\xa0\x3f\xbf\x7f\x07\x1b\x7f\x5a\xe6\xbd\x37\xf3\xf1\x3f\x61\x4e\x6f\xa1\x1f\x64\xde\x9f\x15\x20\x9f\x9b\x79\x29\x0c\x03\x98\x8a\x53\x10\x53\x29\x08\x70\x45\x46\x25\x14\xe3\x70\x02\x53\x21\xc3\xe1\x0c\xa1\xca\x32\xce\x90\x0c\x2e\xe3\x04\x2d\x53\x1c\x8b\xaa\x32\xa7\xc8\x8a\x42\x2b\x1c\x46\x41\x3c\x78\x28\x1d\x7b\xa4\xf7\xea\x96\xda\x21\x89\xb3\x24\x7e\xe1\xe1\x5d\xff\xee\xd1\xb1\xab\x6f\x95\x39\x67\xf2\xbe\xce\xad\xea\x7d\xbe\xc9\x31\x2d\xac\xd5\x71\xba\xca\x5a\xcc\x15\x97\xb9\x74\xb6\x0b\x97\x1f\x4a\xb3\x31\xd0\x4d\x43\xd6\xaa\x3d\x3e\x71\xed\x70\xc8\xdf\xbd\x57\x2b\x1e\x96\xb1\x21\xab\xdd\xd3\x6f\x16\x05\x6c\x99\xa2\x9c\x4c\xe3\x8d\x5d\x76\xcd\x02\x3f\x78\xab\x73\x6d\x06\xac\xa9\x3a\x27\x19\x2c\xd3\xda\x36\xd6\xe8\x00\x53\x2a\xa8\xc2\x4c\xdb\x2d\x9a\x59\x15\xd2\xf3\x29\xbf\xcd\x12\x26\xd7\xb1\x1a\x1d\xfa\x83\x53\x46\xf3\xe9\x62\x90\x16\xf9\x39\x6b\x6c\x16\xdc\x54\x1f\x36\x85\x24\xd9\xb5\x10\x36\xe5\xb8\xcc\xc5\x87\xde\x49\x71\xe3\xde\xd6\x3b\xa6\x30\x0e\xfa\x8d\xb9\x92\x64\x8e\xa7\xd0\xbf\xaf\x16\x78\xc8\x5c\xe1\xcc\x77\xe3\x5e\xe8\xec\x11\xc9\xe9\x75\x39\xca\x3d\x9b\xfe\x0d\x47\x34\x3c\xff\xfb\xee\x55\xaf\xd5\x1a\xef\xd1\xd5\xc3\xb5\xc6\x27\xce\xd5\x2d\xf4\x83\x8c\x24\x77\xfa\x06\xb3\x40\x85\x94\xb5\xd5\xdb\x93\x61\x06\x9a\x0c\x56\x75\xac\xdc\x9c\xc1\x56\xea\x87\x53\x2c\xa5\x73\x2d\xb5\x87\x5a\x2d\x62\x95\x2f\x17\xad\x15\x29\xa5\xda\x42\xae\x54\x85\x33\xac\x6e\x73\x0d\xab\x81\x61\x8b\x76\x61\xa4\xb2\x68\xb6\xb3\x55\x0b\x12\x5e\xe8\x4d\xf9\xe6\xb3\x33\x12\xc0\x15\x20\xa9\x24\xe4\x14\x8c\x26\x71\x06\xc7\x69\x14\xc7\x19\x1c\x62\x0c\x0b\x08\x46\xe6\x18\x42\xe6\x30\x86\x91\x38\x8a\x51\x00\x4b\x63\x1c\x0e\x38\x4e\x22\x20\xa7\x12\x80\x03\x80\xf4\x33\x12\xfe\xa4\x63\xfe\xeb\x19\x89\xc0\xd0\xf8\xd3\xac\xdd\xdd\xa3\xfe\x9d\x47\x0f\xfa\x7f\x61\x46\x0a\x1d\xdc\x17\xb5\xea\x52\x10\xfb\x0c\x31\x93\x3b\x58\x5b\x99\xab\x69\x08\x36\xb3\x76\xb5\xd0\x69\x66\x27\x25\x03\xa2\x0e\x41\x82\x12\xdc\x2a\xd3\xa5\xde\x73\xfa\xdc\x26\xd7\xa4\xa7\x7c\x87\x60\x0b\xdc\x5c\xb3\x2a\x95\x56\x69\x6b\x56\x56\x73\xb3\x2b\x8a\x53\x7e\xad\xf4\xb7\xe9\xc6\xac\x29\xff\x94\x8c\x74\xcf\xc1\xf9\x33\x33\xd2\x83\xf4\x9f\x98\x91\x9e\x72\x68\x7f\x7a\x25\x8e\x72\xbf\xba\x69\x80\xe7\x7f\xdf\xd3\xb9\x6b\x19\xe9\x1e\x5d\x3d\x33\x23\x3d\x3a\x57\xb7\xd0\x0f\x32\x12\x2c\xad\xe6\x4d\x4c\x7a\x87\xe2\xa6\xd1\x2b\xe3\xad\x34\x47\x59\x05\xb1\x64\x8f\x44\xbe\xc2\x6b\x0a\xd3\x26\xd4\xa9\x39\x65\xca\x78\x61\xd1\xeb\x63\x12\x21\x88\xb9\x37\x21\xd3\x50\xd7\x12\xde\xae\xd8\xe6\x52\x98\x55\x26\x6f\x74\x7b\xda\x44\x71\x21\x97\xc1\xa4\x2a\x9b\x12\x33\xeb\x67\x67\x24\x09\x07\x38\xce\xc8\x04\x27\xd3\x24\x20\x49\x55\x66\x80\xa4\x90\x32\x47\xb3\x18\x47\x52\xb4\x8a\x12\x1c\xc7\xa1\xb4\x82\xe1\x32\xc9\xd0\x0a\x83\x4a\x24\x8a\x7b\x2f\x0a\xe3\x68\x85\x06\x84\xff\x4a\x19\xec\x91\x06\x6a\xff\xe1\xba\x8b\x89\x88\x22\x39\x34\xbe\xe1\x6c\x77\x37\xdc\xb5\x19\xe4\xa1\x2a\x5b\x6c\xbe\x37\xe7\x52\x05\x2f\xf2\x44\xbf\x37\x6b\x59\x95\xc5\x6c\x80\xa2\x6a\x81\xb5\xab\x25\x77\xc1\xd0\x5a\x97\xfb\x69\x7e\x40\xf0\xfb\x3c\xe4\x1b\x4c\x64\x52\x4f\xfc\xf4\x8e\x9a\x52\xf8\xad\x11\x99\xde\xfb\x3a\xcf\xb9\xb7\x84\x9c\x43\x54\xd6\x0b\xd0\x58\x35\x94\x7c\xbb\xbb\x51\xf8\x3c\x94\xe8\x7a\x13\x3a\xdb\x66\xa5\xd4\x07\x1f\xba\xd4\xae\xd5\xa6\x8b\x62\x45\xac\xe6\x48\xfb\x6d\x2a\xbc\x75\x47\x72\xb3\x81\xea\xa9\x41\xba\xbe\x4c\x99\x76\x7f\x21\xd2\xa9\x7c\x77\x28\xd9\x1f\x0c\xd5\xc4\x67\x05\xf2\xbd\x56\x4b\x90\x7b\x8e\x8c\xf6\x38\xf7\x84\x64\x3e\xc4\xde\xb0\x3f\x6b\xe9\x0c\x5a\x45\xcb\x85\xad\x33\x5d\x8b\x98\x3e\x44\xc1\x76\x69\x62\x9c\x58\xdc\xbc\x57\xb3\xdb\x3a\xe5\x64\x04\x39\xeb\xcb\x48\x4c\x1c\xab\x6e\x0c\xd3\x4c\xf7\x30\xfe\xae\x3a\xd6\x03\xf4\xf3\x9d\x7e\xc6\x7a\x80\x3e\xcf\xff\x75\xa7\xf9\x67\x63\x6b\xe6\x7e\x5d\xd4\x8d\xd1\x45\x31\xaf\xe9\xe2\xd1\xb9\x70\x6d\x21\x25\x47\xf0\xdd\xa4\x8b\xff\x30\xca\xd6\x2e\x2f\x66\xcc\x8c\x68\x75\xf5\xda\xa0\x99\x19\x2c\x52\xb3\x79\xd1\x92\xe7\x59\x2d\xbf\xb0\xa9\x3e\x3a\xcb\x95\x46\xd3\xed\xac\xbd\x4e\x55\x2b\x66\xab\xa2\x17\x06\x42\x8e\x2b\xab\x7a\xfa\xe3\x4d\x7d\xab\xe6\x97\x33\xf8\x3e\xed\x15\x0a\x4c\x2d\x95\xea\x8a\xe6\x66\x55\xfd\x78\x7e\x67\x01\xa9\x10\x24\x24\x49\x14\xa3\x28\x42\xa5\x49\x40\x73\x32\xa0\x09\x16\x27\x29\x8e\x55\x49\x85\x53\x51\x80\x73\x12\xaa\x42\x42\x86\x04\x2b\x93\x90\x54\x18\x94\x44\x15\xa0\xaa\x18\xae\xaa\xea\xe1\x1d\x70\x0f\xc4\x56\xfc\x6a\x6c\xa5\xb0\x0b\xaf\x58\xdc\xdd\x0d\xf7\x9f\x3f\x1a\x5b\x2f\x74\x14\xf8\xd7\x1d\x6b\xcc\x98\xd8\x9a\x55\x72\x4e\x01\xdf\x2c\x26\xcd\x74\x8d\x77\xde\xde\x54\x75\x92\xa9\xa5\xba\xea\xa8\x57\xfc\xe0\xcc\xdc\xc6\xf9\xc8\x8b\x0a\xc5\xce\xd3\x0b\x5c\xd2\x1b\x05\xa3\x24\x49\x2b\x08\x16\xce\xb2\xf9\x9e\xe5\x48\xab\x35\x05\xeb\x74\xd1\xce\x08\x2a\x00\xdc\xdb\x6c\xb4\x66\x86\xcb\xde\xbc\xf0\x7b\xc5\xd6\x47\x63\xdb\x83\xfe\xfc\xc6\xa4\x3b\x39\xe9\x89\xb1\xf5\x57\xae\x15\xaf\xae\x5b\x7f\x61\x6c\xe3\x9f\x14\x5b\x59\xf2\x30\x3e\x66\xcf\x77\x29\xb6\x1a\x4d\xa6\xe5\xd8\x23\x53\x68\x7c\xf0\x55\xf0\x66\x10\x24\xdf\x69\xe8\x45\xbc\xd7\x62\xd3\x80\x67\x25\x79\xd3\x19\x40\xb5\xdc\xa0\x9c\x05\xd5\xd9\x2c\xb7\x05\x9c\x31\x16\x4b\x0b\x74\xab\xeb\x77\x58\x41\x87\x7d\xbb\xb1\x61\xf8\x56\x11\x5f\xbc\x03\x13\x97\xeb\x78\xa5\x37\x7a\xfe\xa9\x3a\x83\x53\x0c\x45\x4b\x98\x2a\x29\x2a\x4b\x48\x28\x8b\xe1\x8c\x4a\xb0\x14\x54\xa1\xa2\xa2\x1c\xca\xc9\x32\x8b\xa3\x12\x2d\xcb\x90\xc1\x54\x4c\x46\x59\x8e\x51\x30\x8a\xc4\x19\x59\xa2\x80\xa2\xbc\xec\x5f\xad\xfd\x40\x6c\xbd\x5a\x40\xa1\x28\x3c\xfe\x65\x6c\xc1\xcd\xf0\x73\x34\x8f\x46\xd6\x0b\x27\xe9\xfe\x75\x47\x3d\x39\x26\xb2\x66\x66\xe4\x24\xd3\x4c\x67\x78\x69\xf2\xa6\x32\x6f\x75\xd3\x01\xce\x64\xd4\x2d\xce\x72\xba\x5d\x77\x72\xa2\xb2\x64\x80\x3e\x6a\x51\xe9\xfc\x9c\x53\x0b\xb3\x94\xbe\x11\xb6\x13\x7e\xd4\xff\x18\x32\xe9\xea\x10\x1b\x11\xed\x3c\x2d\xa3\x6f\x36\xc6\xe0\xd5\x29\x3f\x9f\xbf\xf7\xd8\x25\xfa\x7b\xad\x5a\x1f\x8e\x6c\x8f\x46\xd6\xad\xd5\xcc\x57\x9f\x18\x59\x7f\x65\x5d\xf8\x67\x44\xd6\x7b\x23\x1b\xff\xa4\xc8\x7a\xef\x0e\x26\x88\xac\xc3\x54\x89\xef\x36\xd6\xcd\x02\x59\x31\x52\xf4\xec\xad\xda\xb7\x86\x85\x5e\x86\x5c\x53\x52\xce\x6a\x7e\x0c\x00\xc4\x97\xfd\x2e\x54\x37\xa3\xc6\x60\x63\xa6\x97\x72\xab\x66\xf2\x85\x9e\x8d\xd7\xd3\x5b\x5c\xec\x2b\xe8\x14\x1a\x62\xc5\x12\x21\xa7\x91\xcd\x72\xb9\x8a\xa9\x15\x25\xe9\xaa\xf5\xf8\xe9\xbc\xf0\xaf\xa5\x86\x7f\xd6\x6f\x39\x87\xdb\xdd\x53\x6e\x87\xdf\xd2\xbf\xf5\x57\x66\x43\x18\xbd\x5f\x25\xe6\x73\xb9\xf0\x2f\xf3\x47\x09\x22\x8d\x56\xa9\xc6\xb7\x86\x48\x45\x18\x22\x9f\x35\xe5\x84\xdb\xe8\x6f\xc6\x45\x3e\x3f\x89\xeb\x08\xd6\x73\x9c\x9f\x23\x7c\x95\xfb\xc8\xaf\x76\x45\x7e\xe2\xea\xf0\x82\x8a\xd0\x7b\x60\x8e\xde\xf9\x32\x7e\x8a\x74\xc7\x64\xcf\x09\x77\x17\x63\x48\x57\x2c\x35\xbb\x02\xf2\xf9\x00\xfe\x8a\x1c\xe0\x77\x7f\xfb\x03\x6e\x54\xcd\x73\xa6\xf5\x66\xc1\x6f\x9a\xd4\x98\x77\xdd\x5d\x79\x9f\xdc\x73\x25\x3b\x4f\xe4\x92\xa4\x17\xd8\x4a\x2c\x79\xec\x33\xc2\x57\x9f\xc2\x7d\xae\xf4\x71\x64\x2e\xc9\x7f\x91\xb5\xab\x1a\xf0\x4d\x5a\xda\x7a\xd6\xbe\x13\xa4\x24\xe6\x84\xc1\x15\x19\xb2\x2d\x81\xef\x08\x3e\xe8\x31\x16\xa4\x2e\x46\x9d\xa1\xdb\x2e\x89\x05\x44\x72\x2c\x08\xc3\xde\x15\xcf\x8d\xef\x63\x8f\xf3\xe3\xe3\x49\xc6\x51\x8c\x5f\x4b\xfb\x5f\x4a\xbc\x9b\x9d\x03\x8a\x30\x27\x47\x7b\x81\x63\x7e\x7c\xe0\x57\x64\xf7\x23\xa2\xbb\x9f\xa5\x3e\xc7\x5c\xe8\xb7\xf7\x93\x31\xb8\x34\x6d\x67\x62\x41\xfb\x2c\x9f\xe1\x5f\xf2\x4f\xc4\x6b\x68\xc0\x17\xa4\x5f\x14\x5a\x02\x12\xc6\x51\x6a\x23\x62\xbd\xe3\xe5\xf0\x3f\x4f\x58\x9f\x02\x7b\xfa\x04\x9e\x5d\x34\xc9\x98\x0d\xfb\x8a\x3b\xea\x9c\x3e\x35\xc3\x80\xd6\xb3\x58\x3b\x20\x4b\xc6\xa0\x0f\x7f\xc2\x66\xa0\xd8\xf3\x77\x2f\xeb\xd8\x7f\xa7\xf7\x23\xa6\xeb\x63\x48\xc6\x7f\xf0\x3b\xc1\x3b\x7b\x7d\x45\xc0\x72\xa9\x6b\xb2\x1f\x9f\x4d\x4b\x89\xc9\x9b\x63\xe8\x3a\xab\x77\xff\x0e\x4e\x83\xb4\xed\x33\x1c\x41\x17\x66\x7b\xf7\x6b\x51\x47\x1c\x9f\xa6\x11\x4d\x79\x45\x3e\x79\x83\x3f\xc5\x31\xab\x29\x4f\x62\x53\x53\x12\x33\xb8\xff\x3d\x6c\xe5\xf5\x4c\xee\xbb\xca\xb4\xb9\x1c\x2f\x9f\xc5\x77\x80\x2b\xcc\x7a\xcc\xda\xe1\x2e\x49\xce\x0b\xe0\x6c\x9e\x27\x40\x80\x2b\xc6\xa6\xef\x14\x21\x8c\xe1\x9c\x10\xe6\xd2\xb5\xca\xa9\x79\x97\x0c\x01\xf3\x07\x1c\xf7\x2a\xff\xb2\xa2\xed\xdd\x2f\x7d\xbb\xb1\xeb\x71\x5d\x1f\xa3\x0b\xb3\xbc\xfb\xa9\x81\xe3\xe8\x77\x96\xa3\xb0\x5e\x9f\xc5\xd6\x09\xce\x84\xe1\xf9\x0c\x83\x8e\x3f\x25\xce\x23\xd3\x7a\xc0\x71\xbf\x49\x5e\x33\x3f\xc7\x52\x5c\x22\x12\xb0\x6f\x5c\x2f\x9c\x65\xf8\x14\x59\x84\x73\x05\x46\xf8\x0c\xc3\x5e\x65\xd0\x7b\x45\xe9\x73\xd8\xf3\x50\x25\x62\x6e\xf7\x5e\xd4\x58\xd6\x3c\xde\xa1\xf5\x34\xf5\x45\xf0\x5d\x63\x32\x02\x9e\x84\xd3\xe7\xe8\xf1\x08\x5b\x52\x2e\xaf\x6a\xf3\x39\xbc\x25\xe2\xe9\x32\x2f\x3b\x8e\x75\xd3\x9c\xaf\x96\x8f\x71\x74\x8c\x2b\xf1\x8c\xfa\x1b\x90\x18\xfe\x96\x40\xb3\xc6\x8e\xb6\x80\x4f\xe1\x30\x8a\x2d\x99\xdf\x06\x0c\xbe\x22\x51\x96\x5f\x91\x20\xc4\xcb\xba\x69\x43\x65\x0c\x9c\x18\x21\x9e\x10\xb7\x03\x3c\xd7\x38\xbe\x71\x75\xe4\x62\x7d\x9a\x76\x6f\x50\xec\x55\xbd\x69\x86\x02\x37\xe3\xc8\x92\xc3\x1e\x9b\xc6\x18\x28\x8a\x05\x6d\xfb\x51\x85\x5e\x25\x70\xb4\x71\x0e\x6e\x47\xb6\xaa\x3e\xe0\x0d\xbc\x3f\x6e\x07\x97\x70\x5f\xe7\xf8\x8c\x97\x1d\x23\x0c\x56\xe1\x2e\x3e\x67\xbb\xbc\xbf\x28\x72\x11\xeb\xd5\x65\xbf\x0b\x74\x85\xd1\x60\x0d\xe5\xa2\xdc\x1b\xd1\x93\xb8\x3d\x87\xfa\xea\xf2\x2d\xa9\x25\x87\x90\x3f\xdb\x18\x8e\x50\xdf\xb3\xde\x8c\x47\xb7\x58\x9a\x96\x1b\xf8\xde\xa1\x65\x6b\xa6\xf1\x7c\x45\x47\x29\x5c\x67\x3f\x32\x20\xb9\x30\x41\xe8\x49\x5e\xe4\xb8\x43\xff\x21\x1a\x57\x25\x09\xc1\x26\x17\x62\x69\xc1\x77\xcd\x5c\xd9\xbf\x44\x9a\x73\xc4\xae\x8a\x75\x6e\x50\x72\xf9\x76\x45\x94\x9f\x26\xd3\x8e\xc0\x55\x39\x62\xcb\x8f\xc7\xa8\x0f\x2f\x57\xfe\x19\xae\x1d\xc5\x7e\x76\x03\x7c\xab\x83\x1f\x23\x3d\xde\x42\x3d\xc9\xc3\x2f\x91\x48\x22\xc3\x95\x7d\xdd\x45\x62\xcf\x4b\x5f\xa7\x88\x13\xf1\x7e\x3d\x89\x85\x37\xdb\x3f\xc3\x6c\x4e\xf1\xdf\xbd\xd5\xf7\x16\x71\xfb\x44\xbe\xab\x30\x8e\x25\xd3\x9c\xdf\xad\xe5\x0b\x38\xaf\x2e\x11\x3e\x7f\x56\xa0\x03\x34\xdd\x46\xbe\xfe\xf3\x9f\xc8\x8b\x6d\xea\x4a\xe8\x78\xf3\xe5\xfb\x77\x07\x6e\x9c\x2f\x5f\x5e\x91\x78\x40\xd9\x54\x92\x01\xfa\x87\x23\xf1\xa0\x92\xb9\x9a\x4c\x9d\x44\xe4\x8f\x40\x2f\x33\x70\x04\x1a\x61\x61\x57\x14\xf7\x8c\x0c\xf9\x81\x10\x44\xe2\xce\x00\x4d\x19\xab\xa1\x73\xbb\x7c\xe5\xd7\xf4\x07\x04\x64\x91\x7c\xbd\x25\x94\x0a\xe2\xfe\x4c\x0e\x69\x09\x79\xa1\x25\x88\x59\xa1\x1d\x39\xa6\xf2\xee\xd6\x45\xa4\xdb\xc8\xb9\x26\xd3\x12\xda\x9d\x56\x29\xdb\x71\xbf\xca\x09\x55\xa1\x23\x20\x59\xbe\x9d\xe5\x73\xc2\x85\x83\x4d\x77\xdf\x71\xfc\x71\x1c\x29\xc5\x3c\x4f\x19\xc7\x74\xae\x9c\x5a\xc6\x71\x72\xac\x9f\x68\xd9\xe8\xac\xb2\x82\x85\xfe\x95\x23\xde\x58\x4d\x04\x5b\xd9\xbf\x5c\x0f\x61\x3e\xce\x69\x61\x57\x25\xb8\x6c\x30\xb7\x69\xe0\xb4\xa8\xf4\x17\xaa\x21\x86\x99\x63\x5d\x9c\x29\x83\x3d\xd7\x28\xa2\x25\x8e\xdf\x41\x21\xf1\xa6\x71\x52\x43\x4a\x62\x1d\x08\x50\x14\xa8\x20\x0b\x60\xac\x80\xae\x6f\x8f\x38\x2d\xe5\x11\x61\x50\x6a\x77\xda\x3e\xcf\xbe\x64\xdf\xe6\x70\x3b\x7e\x07\xfa\x0a\x8e\x5d\x8c\x10\xc9\xb5\xea\x8d\x30\xe3\x87\x51\x11\x48\xbf\x45\xe2\x0f\x0f\x3e\x4a\xe0\x3c\xee\x3f\x77\x29\xd2\x07\x8f\x52\xfe\xec\xe9\xed\xe2\xe5\x2a\x49\x9e\x02\x0b\xc8\x0e\xb4\x90\x77\x60\x6d\x35\x63\xf2\x19\xa7\xa8\x2f\xfb\x93\xd2\xd7\xeb\x58\x3c\xa2\xd7\xf0\xfc\x11\xe9\xf4\x8d\x72\xbb\x6f\xf2\x85\x9b\xe5\x58\x33\x26\xd0\x76\xc6\x3a\x70\xff\xf3\x56\xda\x2f\xaf\xc8\x0b\xfa\xf2\xe5\xcf\x53\x5b\x89\x20\x3a\x67\x2c\xe7\x34\x7d\xdc\xf1\x31\x87\x5b\x77\xc6\x8f\xf4\xb9\x2f\x98\xd8\xda\xc4\x70\xd7\xfa\x09\x14\xba\x1b\x74\x46\x1b\x34\xf9\x25\x81\x2e\x11\x9f\xd8\xfd\xe3\xd7\x50\x9b\x4c\x1d\x44\x33\x1c\x38\x81\x56\x64\x1a\xbf\x7e\x45\xd6\x10\x59\x6b\xba\x8e\xbc\xad\xa0\xb5\x45\xa4\xed\x8e\xa0\x6d\x22\xce\x14\x38\x88\x66\x23\xeb\xe9\xfe\x5b\xcd\x46\x9c\x29\x44\x54\xcd\xb2\x1d\x44\x73\xe0\x02\xd1\x0c\xef\x1b\xd9\x5c\x2c\x4d\x5b\x73\xa0\xab\xdc\x04\x6c\x1d\x69\xdb\x47\xbe\x6f\xdb\xf8\xf2\x47\x64\x5e\xcf\xae\x3a\xdd\x39\xdd\x85\xb2\xc5\x6a\x03\x15\x57\x33\xae\x9a\x3e\xd3\xdc\x97\xa0\xf9\xd1\x85\x09\x75\x55\xc4\xc0\x9d\x27\x16\x5a\x9b\xbb\x68\x6c\x73\x65\xc9\xf7\x61\xda\x2d\x42\x3d\x8e\xfd\xba\x5f\xec\xf8\x20\xdc\x36\xfc\xe6\x88\x76\xb3\x8a\x28\xc0\x01\x6e\x1a\x43\x94\xd5\x62\xe9\xe9\x59\x87\x0e\xf4\xe2\xe4\xff\x0b\x00\x00\xff\xff\x7b\x3c\x5b\x1f\x85\xd6\x00\x00") func failed_transactionsHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -208,7 +208,7 @@ func failed_transactionsHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "failed_transactions-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8f, 0x12, 0xa7, 0x91, 0xa5, 0x7a, 0xae, 0x57, 0x16, 0x4a, 0xd2, 0x49, 0x33, 0xe2, 0x70, 0x8c, 0xc2, 0x4b, 0x1e, 0x41, 0xf0, 0xda, 0x6e, 0xd8, 0xa6, 0xab, 0xc4, 0xa1, 0x95, 0x1c, 0x19, 0x98}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb4, 0xa, 0xb6, 0x80, 0x69, 0xce, 0x9d, 0xd9, 0x5b, 0xf6, 0xcd, 0xf9, 0x2, 0xf0, 0x55, 0xc3, 0x6, 0x86, 0xf3, 0x5b, 0x8c, 0x13, 0xb9, 0xde, 0xf0, 0x25, 0x47, 0xb0, 0xef, 0x10, 0xee, 0x11}} return a, nil } @@ -272,7 +272,7 @@ func kahunaCoreSql() (*asset, error) { return a, nil } -var _kahunaHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x79\x6f\x22\xcb\xd9\xef\xff\xf9\x14\xe8\x28\x92\x13\x31\x39\xd4\xbe\x4c\x6e\xae\xd4\x40\xb3\x77\x03\xcd\x4e\x14\x59\xbd\x54\x43\xb3\x35\xfb\xf6\xea\x7e\xf7\x2b\x16\xdb\xd8\x06\x8c\x3d\xf6\x24\x39\xf3\x5a\x27\x11\x43\x55\xd7\xb3\xd4\xf3\xab\x67\xa9\xaa\xe6\x6f\x7f\xfb\xd3\xdf\xfe\x16\x29\x85\xb3\x79\x67\xaa\x2a\xe5\x42\xc4\xb3\xe7\xb6\x63\xcf\x54\xc4\x5b\x0c\xc7\x7f\xfa\xdb\xdf\xfe\xb4\x6b\x4f\x2e\x86\x63\xe5\x45\xfc\x69\x38\x7c\xea\xb0\x54\xd3\x59\x10\x8e\x22\xf2\x77\xf6\x3b\x3c\xe9\xe5\x6c\x22\xe3\xce\xfd\xee\xf1\x17\x5d\xfe\x54\xd1\xab\x91\xd9\xdc\x9e\xab\xa1\x1a\xcd\xef\xe7\xc1\x50\x85\x8b\x79\xe4\x1f\x11\xf0\xf7\x7d\xd3\x20\x74\xfb\xaf\xbf\x75\x07\xc1\xae\xb7\x1a\xb9\xa1\x17\x8c\x3a\x91\x7f\x44\xee\x6a\xd5\x94\xb8\xfb\xfb\xc3\x70\x23\xcf\x9e\x7a\xf7\x6e\x38\xf2\xc3\xe9\x30\x18\x75\xee\x67\xf3\x69\x30\xea\xcc\x22\xff\x88\x84\xa3\xe3\x18\x5d\xe5\xf6\xef\xfd\xc5\xc8\x9d\x07\xe1\xe8\xde\x09\xbd\x40\xed\xda\x7d\x7b\x30\x53\xcf\xc8\x0c\x83\xd1\xfd\x50\xcd\x66\x76\x67\xdf\x61\x65\x4f\x47\xc1\xa8\xf3\xf7\x23\xef\xca\x9e\xba\xdd\xfb\xb1\x3d\xef\x46\xfe\x11\x19\x2f\x9c\x41\xe0\x7e\xdb\x09\xeb\xda\x73\x7b\x10\xee\xba\x69\x85\xaa\x6e\x45\xaa\x5a\xbc\xa0\x47\xb2\xa9\x88\xde\xcc\x56\xaa\x95\x48\xd1\x2c\xb4\x8e\xfd\x7f\xef\x06\xb3\x79\x38\xdd\xdc\xcf\xa7\xb6\xa7\x66\x91\xa4\x55\x2c\x45\x12\x45\xb3\x52\xb5\xb4\xac\x59\x3d\x79\xe8\x79\xc7\x7b\x37\x5c\x8c\xe6\x6a\x7a\x6f\xcf\x66\x6a\x7e\x1f\x78\xf7\x7e\x5f\x6d\xfe\xfe\x33\x08\xba\xfb\x4f\x3f\x83\xe4\xce\xae\x7e\x9e\x80\x07\x6a\xef\x97\xee\xc0\xe0\xce\x90\xaf\x11\x3b\xe9\xf5\x34\xf8\xbe\x7b\xd6\x4c\xea\xcd\x93\x9e\xc7\x61\xf7\x5c\xdd\x2b\xdf\x57\xee\x7c\x76\xef\x6c\xee\xc3\xa9\xa7\xa6\xf7\x4e\x18\xf6\xaf\x3f\x18\x8c\x3c\xb5\xbe\x3f\x11\x6e\x34\xb3\xf7\x86\x3e\xbb\x0f\x47\xf7\x81\xf7\x9e\xa7\xc3\xb1\x9a\xda\x8f\xcf\xce\x37\x63\xf5\x03\x4f\x3f\x71\xf2\x43\x5c\xbc\xef\xd9\x81\xf2\x3a\x6a\xba\x7f\x70\xa6\x26\x0b\x35\x72\xdf\x25\xc2\xc9\xe3\xe3\xa9\x5a\x06\xe1\x62\x76\xfc\xee\xbe\x6b\xcf\xba\x1f\x1c\xea\xc7\x47\x08\x86\xe3\x70\xba\x83\xe3\x71\x4d\xfd\xe8\x30\x1f\xd5\xa5\x3b\x08\x67\xca\xbb\xb7\xe7\xef\x79\xfe\xc1\x98\x3f\x60\x4a\x47\x5c\x7e\x80\xe9\xd3\x27\x6d\xcf\x9b\xaa\xd9\xec\xfa\xe3\xdd\xf9\xd4\xdb\xfb\x9d\xfb\x41\x18\xf6\x17\xe3\x1b\x7a\x8f\xdf\x62\xe9\xd0\xcb\x0e\xa6\xef\x1c\xf8\x61\xd1\xbd\xf9\x81\xdd\x3a\xe1\xfb\x6a\x7a\x5b\xd7\x87\xe1\x3f\xf0\xc8\x51\xad\xb7\x3d\xb4\x5f\x5a\xdf\x41\xe4\x74\x29\x7e\xeb\x89\xf1\xee\x81\xee\xfc\xcd\x19\x98\x3d\x5b\x80\x9c\xcd\x9b\x66\xd4\x7d\x44\xfa\x2d\x9d\xc3\x03\x1f\xe1\x9b\x1d\x83\xd9\xfc\x7e\xbe\xbe\x1f\xbf\x3d\xe4\xae\x67\x38\xbe\xb5\xa7\xba\xb5\xdb\x83\x2b\xb9\xde\xd9\x79\x80\xfb\x9b\xdd\xde\x5e\xc5\x9c\xcd\x6d\x93\x79\xf0\x91\x3b\x6d\xcf\x66\x8b\xb7\x28\x3f\x76\x76\x43\x4f\xbd\x33\x2e\x78\x34\x83\xb1\x3d\x9d\x07\x6e\x30\xb6\x47\x57\x9d\xf7\x5b\x8f\xde\x8f\xdf\x19\x9b\x3c\x7a\xb4\xf7\x72\x70\xfe\xc1\x77\xd3\xdf\x2b\xef\x16\x7a\x87\x8e\x5f\x3e\xfe\x61\x32\x77\x33\x79\xfc\xb8\xf3\x0f\x0f\xa1\xdf\xde\x18\xee\x6f\xe4\xa0\x13\x4e\xc7\xf7\xc3\xa0\x73\x0c\x18\xae\xb0\xf0\xa2\xe7\xcd\x32\xbe\x3f\xde\xbb\x36\xf2\xad\xc6\x79\x78\x3a\x51\x2c\xd4\x0c\x33\x12\x78\x07\xca\x49\x3d\xa5\xd5\x0a\xd5\x1b\xc7\xbe\x60\x74\x9f\x30\xf2\x71\xba\xaf\x8f\xb4\xff\xd7\xed\xe2\x3f\x78\xe9\x8a\x5e\xae\xe9\x66\xe2\x03\x3a\xdb\xc5\xd9\x33\x35\x79\x37\xe5\x67\x83\xdc\xfc\xb4\xa7\x6e\xec\xfb\x14\xcd\xde\x2c\xe1\x05\xd4\xbf\x47\xbe\xf3\x43\xdc\xf6\xec\x31\xee\xbb\xad\xf3\x31\xc8\xbb\x59\xb6\xe3\x0a\xf0\x1e\x59\x0e\x8f\xdc\xd8\xf7\x18\xfe\xdd\xce\xcf\x43\xbc\x78\x0b\x47\x2f\xd6\x90\xeb\x9d\x4f\x96\x84\x63\x47\x2d\x9d\xb6\xf4\xb4\x56\x3d\xd3\x79\x18\xec\x32\x8e\xc0\x55\x7f\x19\x2d\x86\x6a\x1a\xb8\xff\xfc\xd7\x5f\x6f\x78\xca\x5e\x7f\xe0\xa9\x81\x3d\x9b\xff\xc5\x1e\x6d\xd4\x60\x5f\x8a\xb9\xe1\x09\x3f\x98\x9e\x7d\x24\x55\x33\x13\xd5\x6c\xd1\xbc\x22\xcf\xbd\xdd\xe9\x3c\x71\xf7\x2d\xf2\x8a\xd1\x2b\x63\x3c\x48\xf7\x03\x63\xec\x64\xdd\x3f\xfe\xc4\xfc\xb7\xc8\x7b\x04\xd9\x8b\x7e\xc3\x08\x7a\xb3\xaa\x9b\x95\x17\x43\x0c\xc6\x9d\xd9\x64\xf0\x60\x8b\x89\x8c\x6e\x68\xaf\x28\xfc\xfd\x4f\x87\x2a\x9c\x69\x0f\xd5\xf7\x87\xef\x22\xd5\xcd\x58\x7d\x3f\x3e\xf2\xf7\x48\xc5\xed\xaa\xa1\xfd\x3d\xf2\xb7\xbf\x47\x8a\xab\x91\x9a\x7e\x8f\xfc\x6d\x5f\x9c\x4b\x58\xfa\x6e\xbe\x8e\x23\x3f\x8c\xf7\xa7\x67\x23\x3e\x6f\x3c\x0e\x9c\x28\x1a\x86\x6e\x56\xaf\x8c\x7c\xe8\x10\x29\x9a\xcf\x07\x88\x64\x2b\x91\xbb\x87\xb2\xdb\xc3\x77\xb3\xfd\x20\x77\x2f\x29\x3f\x88\x7f\xa4\xf9\xa8\xa1\x37\xe5\x79\xa6\x4b\xb3\x58\x7d\xa1\xcf\x48\x23\x5b\xcd\x3c\xb2\x75\x5a\x7f\x7b\x46\xfe\x69\x94\x17\x8c\xbc\x47\xf8\x57\x83\xec\x15\x50\x2a\xc4\xc6\x9d\x4a\xb9\x10\x19\x4f\x43\x57\x79\x8b\xa9\x3d\x88\x0c\xec\x51\x67\x61\x77\xd4\x5e\x0d\x37\xd6\x0b\x4f\xd9\x7d\xdb\xd0\x8e\xec\x3f\xd8\xea\x13\xff\x0f\x73\x7b\x4e\x97\x8f\x96\xfd\xe6\xf8\x11\x4b\xaf\xd6\x2c\xb3\x72\xf2\xdd\x9f\x22\x91\x48\xa4\xa0\x99\xe9\x9a\x96\xd6\x23\x7b\xe9\x0d\xa3\x76\x58\xef\x2a\x55\x2b\x9b\xa8\xee\x7b\x68\x95\xc8\x9f\xef\xff\x1c\xa9\xe8\x05\x3d\x51\x8d\xfc\x19\xee\xfe\xf5\x72\x36\xde\x04\xe2\x8f\x49\xf7\xd6\xf0\x9f\x26\x1c\x3a\x27\xdc\x2d\x2b\xd5\x8f\xc9\x77\x03\x85\x47\x11\x1f\xbf\xfa\x90\x84\x7f\xf9\x53\x24\x92\xd0\x2a\x7a\xa4\x91\xd1\xcd\xc8\x9f\xe1\x3f\xe1\xbf\x62\x7f\x86\xff\x44\xff\xfa\xbf\x7f\x46\xfb\xcf\xe8\x9f\xe8\x5f\x91\xea\xa1\x31\xa2\x17\x2a\xfa\x4e\x29\xba\x99\xfc\xeb\x59\xcd\xdc\xe0\x07\x7e\x50\x33\x6f\x53\xf8\x6a\xcd\xfc\x9f\x8f\x68\xe6\xb5\x4f\x3d\xea\xe1\xd1\x0f\xdf\xa6\x88\x27\xb7\xfd\x6a\xc4\x3d\xc7\x91\x48\x65\xa7\xab\xc8\x3f\x9e\x56\x80\x6f\x87\xaf\xab\xad\x92\x1e\xf9\xc7\x29\x22\xfe\x7a\x0e\xb5\x9f\xca\xe3\xcb\x01\x5f\xb0\xf8\x00\xe3\xdb\x39\x3c\x1b\x02\xfd\x28\x97\xe7\x06\x7d\xc1\xe9\x33\x40\x3e\x67\xf7\xc9\xca\x5e\x73\x7b\x2e\xcc\xfb\x61\x6e\xcf\x0c\xfa\x92\xdb\x53\x90\x5c\xe5\x76\xe7\xb9\x3c\xe5\xdb\x8b\xc1\xfc\x7e\x6e\x3b\x03\x35\x1b\xdb\xae\x8a\xfc\x23\x72\x77\xf7\xf7\xe7\xad\xab\x60\xde\xbd\x0f\x03\xef\x64\x2b\xed\x99\xac\xa7\xf1\xef\x51\xc4\x3d\xc0\x6e\x13\xef\x80\xc5\xd3\xe4\xfb\x20\x51\xe0\x45\x9c\xa0\x13\x8c\xe6\xfb\xc0\xc0\xac\x15\x0a\x07\x71\xec\xe1\x2e\x8c\x8f\xb8\x5d\x7b\x6a\xbb\x73\x35\x8d\x2c\xed\xe9\x26\x18\x75\x5e\x74\x1b\x2d\x86\x8f\x21\x7f\x24\x18\xcd\x55\x47\x4d\x5f\x74\xf1\x07\x76\x67\x16\x99\x0d\xed\xc1\xe0\x35\x99\x79\x38\x1c\xbc\x26\xf2\x17\x44\xe9\x5f\x1f\x7b\xbe\x9e\xf6\x97\x79\xc3\x47\xd5\xf1\xb2\xda\xf1\xa8\x92\xb9\x5a\xbf\x52\xc8\x78\x3c\x08\xf6\x35\xfb\xc8\x3c\x18\xaa\xd9\xdc\x1e\x8e\x23\xbb\x39\xdb\xff\x33\xb2\x0d\x47\xea\x35\xa3\x97\xb2\xa2\x87\x78\xf4\x98\x4e\xdd\xc6\xf3\x63\xf2\x75\x61\xd4\xa3\x19\x6a\x56\xf5\x10\xd1\xc1\xfd\x17\x59\x33\x61\xe9\xfb\xf0\x2b\xde\x3a\x7e\x65\x16\x23\x46\xd6\xac\x6b\x85\x9a\xfe\xf8\x6f\xad\xf9\xf4\xef\x84\x96\xc8\xe8\x11\xf8\x96\x30\x1f\x56\xfb\xcb\x81\x5e\x99\xe2\xb1\xe8\x11\x19\xa9\xf5\x7c\x69\x0f\xfe\x72\x77\x41\xe2\xbb\xef\xdf\xa7\xaa\xe3\x0e\xec\xd9\xec\xaf\x2f\xa7\xeb\xb0\x57\x71\xc6\xb6\x18\xf9\xeb\x95\x89\x3a\xe4\xc6\x3f\x2c\xd9\xa1\xa2\xf3\x28\xd7\x79\x64\x3c\xd5\xea\xce\xb3\x79\xb6\xbb\x1b\x7a\xe7\xba\x43\x74\xbe\xfb\xa1\xfc\x77\xe6\x01\xca\xae\x21\xec\x7c\x79\xe1\x93\xcc\xf6\x74\xcc\x9f\x66\xb4\xd7\x04\x89\x14\x1b\xa6\x9e\x8c\xc4\x5b\x6f\x48\x74\xa8\xd0\x5d\x17\xe8\x71\xac\x17\xcd\xbf\x07\xde\x25\xde\x1e\x6a\x3e\x3f\x6a\x75\xc7\x71\x8e\x66\xf7\x02\x33\xf7\x97\x56\xfa\xd7\x25\xae\x4b\x3d\x7f\xdb\x6f\x7c\xfc\x76\xc1\x9a\xf7\x76\x7c\xbe\xc9\x53\x73\x3b\x18\xcc\x22\xbd\x59\x38\x72\x2e\x1b\xdb\x43\xa1\xec\x47\xf5\x70\x1c\xe7\xa8\x87\x87\x7d\xeb\x0b\xbc\x9d\x6c\x26\xdf\x84\xc2\x73\xfb\xd8\xe7\x1f\x3c\xaa\xe5\xa4\x32\xba\x9f\x88\x47\x3e\x1e\x56\x39\xf0\x82\xc2\xd3\x44\xdc\xd6\xff\x71\x33\xf9\x85\x63\x0a\x17\xf3\x27\xdf\xf4\xf2\x99\xa9\xb2\xe7\x6f\x3e\x74\xe8\xbb\x18\x7b\x37\xf7\x7d\x34\x9d\xe3\x3f\x5f\xec\xb3\xbf\x92\x05\xbe\x8a\x07\xe6\xf6\xe0\xde\x0d\x83\xd1\xec\xbc\x0d\xfa\x4a\xdd\x8f\xc3\x70\x70\xbe\x75\xbf\xf3\xe9\xab\x4b\x73\xbd\x6f\x9e\xaa\x99\x9a\x2e\x2f\x75\xd9\xc5\xa1\xf3\xf5\xfd\x3e\x4c\x0a\xb6\x97\x7a\x8d\xa7\xe1\x3c\x74\xc3\xc1\x45\xb9\x5e\xce\xd1\x83\xb1\x28\xdb\x53\xd3\x7d\x78\x71\xf8\x7e\xb6\x70\x5d\x35\x9b\xf9\x8b\xc1\xfd\x45\x43\x39\x0a\x6e\x07\x03\xe5\xbd\xd5\xeb\xc8\xfa\x05\x13\xba\x0c\xbd\x0b\xf5\xed\x1f\x45\xe2\x85\x3d\x93\x37\xfc\xe2\xed\x2b\xd2\xdb\x6b\xdc\x7b\x45\xfe\x5c\x57\x77\x95\xc6\xcf\x72\x7d\xef\x12\xf4\x07\x5d\xe1\x55\x5a\xaf\x5d\xe3\xf9\xee\x57\x5c\xe5\xc9\xee\xcf\xa7\xd9\xe6\x5b\xa9\xd0\xf3\x93\x57\x17\xd2\xa5\x5d\x76\xe0\x1e\x44\xd9\x7b\xc9\x1f\x74\x92\xc7\xd5\x21\x5c\x4c\xdd\xc7\xa3\x1c\x17\xdc\xd3\xc3\x92\x73\x77\xf7\xfd\xfb\xe5\x74\xed\x32\x0e\x8e\x9b\x6f\x3f\xaa\xce\xe3\x79\xc1\xbf\x7c\x6a\x4c\x71\x5c\x36\x3f\xe2\xe1\xf6\xe7\x65\x2e\x92\x7d\x71\x5a\xf1\x5a\xa7\xe3\x01\xca\x6b\x5d\x0e\xb9\xf2\xd9\x0e\xaf\xcf\x7d\xbe\xd1\xef\x2a\xb9\xc7\x5e\x57\x28\xee\x59\x0a\x66\xf7\x33\x35\x18\xa8\x69\xc4\x09\xc3\x81\xb2\x47\x0f\x7e\x2b\x70\xd5\xfd\xe8\x99\x8f\x3e\x7c\xf7\xdc\x6f\x3f\x9d\x38\xba\x7f\xe1\xd1\x9f\x9d\x79\x7a\xd9\x78\xb2\x95\x7f\xf6\x74\xe8\x9e\xeb\xfb\xfd\xf9\xe1\x48\x22\xa3\x27\xf2\x91\xbf\xfc\xe5\x54\x83\xff\x37\x02\xfe\xfa\xd7\xb7\x86\x3a\xf7\xf8\x83\xd2\xfe\xcf\x2b\x3d\xde\x30\xde\x33\x9d\xbe\x18\xfe\x85\xc2\xf7\x0c\x5e\x85\xd2\xf9\x5d\xf0\x4f\x00\xd7\xf9\x73\x0d\x37\x7a\xd2\x5b\x96\xb0\x1f\xf1\xa5\x6f\x9d\x21\xf8\x1c\x6f\xfa\x06\x95\x9f\xe5\x4f\xdf\x29\xec\x0f\x7a\xd4\x37\xa8\xbd\xf6\xa9\x97\x1e\xb8\xe2\x55\x9f\x9d\x1b\xf9\x44\x5b\x7d\xb0\xcf\x53\x96\x6e\x4e\xb4\x8e\x6b\xff\x1b\xe9\xdb\xad\x8e\xf7\xba\x0f\x3d\xdb\xf7\x89\xf4\x59\xbc\xec\x32\x85\xcb\xa9\xc6\xa5\x24\xee\xdf\x92\x86\xcd\xd7\xf7\x6a\xb4\x54\x83\x70\xac\xce\x95\x36\xe7\xeb\x5d\x52\xb4\x18\xcc\x2f\x34\x0e\xd5\xdc\xbe\xd0\xb4\x4b\xc7\x2e\x35\xcf\x82\xce\xc8\x9e\x2f\xa6\xea\x5c\x15\x4e\xb2\xbf\xfe\xf3\x5f\x4f\xb1\xcb\xff\xfc\xbf\x73\xd1\xcb\x3f\xff\xf5\x52\xe7\x6a\x18\x5e\x28\x98\x3d\x8d\x35\x0a\x47\xea\x6a\x2c\xf4\x34\xd6\xeb\x61\x8e\x92\x05\x43\x75\xef\x84\x8b\x91\xb7\xaf\x6a\x8b\xa9\x3d\xea\xa8\x97\x19\xdb\x73\xd7\xba\xd3\xc4\x6e\xb4\x8e\x7a\x91\x02\x8f\x46\x6a\x7a\x7f\x1b\x02\x9e\x46\xba\x6a\xae\xa7\x03\xbf\xad\xe4\x63\xa1\x5e\xad\xee\x1f\x2c\xf6\xc0\xde\x5b\x45\xbf\x48\xe0\x3d\xac\x05\x0f\x87\xd0\x6e\x59\xc0\x0e\x8b\xc1\xfe\xc4\xdf\x1b\xe7\xdb\x2a\x7a\xf5\x4a\xa5\xf7\xb4\xa6\x76\x5a\xe7\x7d\x5f\x96\xf3\x79\x42\xdc\x78\xfc\xef\xaa\x50\x57\xb3\xa3\x5b\x84\xbc\x18\x07\x7c\x9a\x98\x37\x9f\xa0\xbc\x2a\xe8\x1b\x4e\xeb\xbc\xa8\x49\x7b\x6e\x47\xfc\x70\xfa\xc6\x7e\x57\x24\xa9\x55\xb5\x37\xc4\xcb\x9a\x15\xdd\xaa\x46\xb2\x66\xb5\xf8\x6c\xcf\x6b\xef\xe3\x2b\x91\xbf\xc0\x6f\x91\x3b\x04\x8e\x7f\x77\xdf\x22\xf0\x5b\x04\x7c\x8b\xdc\xdd\xfd\xf5\xef\x6f\x3e\x8a\xbe\x45\xee\xde\xf9\x08\x3e\x3e\x02\xbe\x45\xf0\x8d\x8f\x90\x6f\x91\x3b\x0c\x3e\xc6\x21\x7d\xe2\xf0\x56\x72\xec\x5b\xe4\x0e\x9e\xa7\x76\x61\x76\xae\x6d\xc1\xbd\x77\x86\x5e\x6e\xc3\x3d\x70\x75\x07\xef\x83\x51\x30\x0f\xec\xc1\xfd\xe1\x48\xd4\xef\xb3\xc9\xe0\x6e\x3f\x75\x50\xfe\x0d\xb0\xbf\x01\x1c\x81\xe2\x3b\x12\xdf\x09\xff\x1d\x60\x44\x24\x8b\x02\xf4\x52\xde\x8b\xa3\xa3\xfb\xc3\x55\x97\x67\x06\xea\x6c\xee\xe7\x61\xe0\x5d\xa7\x24\x19\xe5\xef\xa1\x84\xef\x17\x33\xf5\x18\x4e\xdc\x07\xa3\x57\xd7\x6b\xae\xd2\x23\x04\x10\xf1\x1e\x7a\xe4\xde\xf6\xbc\xfb\x97\x45\xca\xab\x34\x28\xa1\x18\xbd\x87\x06\xbd\x3f\x04\x2f\x0f\x69\xd4\x7e\x73\xfb\x2a\x09\x86\x01\x7a\x97\x18\xec\x81\xc4\xd1\x19\xdc\x40\x42\x10\x48\xdf\x43\x82\xdf\x0f\x43\x2f\xf0\x37\xb7\x4b\x21\x20\x43\xef\x22\x21\x9e\x49\x71\x3c\xd3\x7e\x03\x1d\x4e\x18\x7e\x1f\x9d\xdd\xa4\xdb\x9d\xce\x54\x75\xec\x79\x38\xbd\x6e\x53\x12\x40\x20\xdf\x33\xbc\xdc\x0f\x7f\x28\x60\xdf\xaf\xbd\xe9\xf5\xd1\x11\x87\xef\x9a\x6a\x08\xf6\xc3\x1f\x67\x61\x5f\x92\xb8\x4e\x80\x4a\xfe\x2e\xed\x40\x78\x4a\xe0\x31\xc7\xdd\x2d\x00\xd7\x09\x49\x26\xdf\x27\x09\x7a\x36\xd1\xc7\xaa\xc2\xe1\x16\xf5\x35\x4a\x10\x70\x4a\xde\x35\x23\x10\x1f\xc4\x79\xac\xc5\x5c\x9d\x71\x08\x11\x67\xef\x93\x84\xdc\xfb\xc1\xfa\xe1\x46\x49\x38\x1c\xdc\xfb\x81\x1a\x5c\x5d\x1a\x21\xa4\x10\xbe\x6b\x11\x86\xf4\x61\x23\xed\x61\x83\x63\xfd\x86\x18\x8c\xbf\x6f\x99\x87\xec\x3e\x18\x75\xd4\x6c\x7e\xff\x7a\x0b\xe5\x0d\x52\x5c\x8a\xf7\xcd\x08\x7f\x16\xf9\xec\xf7\xaa\xec\xeb\xce\x04\x22\x00\x30\x39\x12\xb9\xe0\x6b\xaf\x1e\xbc\x78\xaf\xb3\x7d\x75\xf8\xe2\x34\x26\x4a\x27\xca\xed\x12\xce\xd6\x78\xb3\xc6\xf4\x1c\xc3\xb9\x76\x33\x9f\x28\x17\x5b\x55\x64\x99\x4d\x13\x67\xe2\x34\x61\x66\x74\xd3\xac\xe9\xb5\x4c\xc5\xd0\x48\xbd\x96\xcb\xe5\x2a\xba\xf9\x52\x43\x17\x89\xec\xa2\xa7\x74\xdc\x2a\xb5\x32\xd9\x02\x4a\x64\x71\xca\x2c\x93\x78\xb3\x90\x32\xcc\x64\x21\x95\xab\x99\xa5\x1a\xca\xb4\x70\xdb\x48\x55\x32\x45\xb3\x96\xd0\x8b\x5a\xa5\xc1\xcb\x09\x5e\x6c\xa2\xcc\xcd\x44\x76\x51\x4f\x5a\x33\x53\xed\xa4\x15\x4f\x98\xd5\x5a\x33\x5b\x4c\x26\x72\x7a\xcb\xd0\x12\x25\x23\x51\x69\xeb\x75\x9d\x34\xda\xe9\x36\x4e\xb4\x93\x6d\x5c\x42\x95\x66\x9e\xe4\x33\x9c\x66\xf3\xac\x75\x33\x11\xb2\x27\x92\xc8\x95\x74\xd2\xaa\x59\x08\xd5\x4b\x24\x61\xa0\x78\x32\x95\xd4\x32\x2d\x9c\x2c\xe8\x29\x9c\xe1\xa6\x6e\xe6\x6b\x65\x8a\x93\x55\x5a\xd5\xb3\x28\xad\x65\xaa\xd4\x24\xcd\x9b\x89\xd0\x3d\x91\x56\x25\x61\xe4\xcb\x2d\xa6\xb7\x0a\xcd\x62\xa9\x5a\x65\xb9\x52\xa9\xd8\x4c\x1a\x75\x33\xde\xc8\x56\x4b\xd5\x4a\x3b\x5b\x6f\x34\x48\xa1\xa1\x59\xf5\x78\xb1\x9a\xa1\x56\xb5\xa0\x25\x6f\x26\xb2\x0b\xfe\xd2\x49\x8b\xe2\x86\xa6\x67\xf3\xc5\x1a\x6e\xe7\x4d\x4c\x12\x95\x8c\xd6\xc8\xf0\x4c\x9d\xe5\x19\x4e\xc4\x73\x56\xad\xda\xa8\x25\xe3\xa9\x8a\xd1\xe2\x96\x55\xce\xe3\x4a\x29\x5f\xac\xdc\x4c\x84\xef\xad\x2b\x53\x6a\xa6\xeb\xc9\x7c\x29\x45\xf3\x55\x92\x30\xb5\x2a\x6f\x72\x5e\x6c\xb6\xda\xbc\x55\xd7\x49\x2e\x93\x4f\x25\x6b\x99\x44\x3a\x51\x6f\x24\x0a\x24\x4f\x4a\x65\xc6\xf3\xf9\xf6\xcd\x44\xc4\x5e\x12\x52\x31\x8a\x3a\xae\x97\x2a\x29\xde\xb6\x70\xa2\xaa\x97\x71\x89\xd6\xcc\x6a\xdc\xd0\x73\x49\x0d\xa5\x0b\xcd\x6a\xc6\xe2\x86\xa1\x59\x9a\x99\xcf\xe7\x92\x6d\x6e\x95\xd2\xa9\x9b\x89\xc8\xbd\x24\xf5\x06\x2d\x24\xac\x76\xaa\xc4\x4b\xba\xd9\xac\x6a\xe9\x62\x3d\x5b\x6e\x6a\xc9\xa4\x59\x6b\x36\xdb\xb9\x84\x99\x4f\x91\x7a\x39\x8e\xb2\x79\xde\x40\x85\x52\xae\x91\xe2\xb8\x96\xbe\x99\x08\x04\x7b\x2a\xb9\x7c\xae\x59\xca\xc7\x53\xd9\x4c\xb1\x88\x09\xa5\x8d\x66\x23\x4d\x13\xc9\x78\xbb\x59\x36\x5b\x29\xcb\x4a\x67\x13\x2d\xa3\x54\x2b\x63\x9a\x28\x95\x49\xa3\x5e\xc1\xf9\x76\xe1\x1d\x54\x0e\x98\xcf\xa6\x52\x56\x39\x9f\x31\x32\x2c\x97\xe4\x89\x3c\x2d\x66\x49\xb3\x9e\x68\x25\x0c\xd3\x32\x53\xac\xd4\xd2\x78\xae\x9a\xb0\x70\xaa\x94\x29\xe5\xda\xe5\x6a\xab\x95\x8a\x53\xfd\xf6\xa9\x87\x07\xd0\xb3\xb4\x89\x0b\xb9\x5a\x83\xe5\x5a\x16\xd7\x93\xc5\x1c\xe1\xf5\x78\x86\x27\x09\x35\x48\xae\x91\x69\xa6\xf3\xac\x90\xc9\x59\x9a\x9e\xa5\xb9\x78\xc5\x44\xc9\x78\xb9\xc5\xcb\xb7\x53\xd9\xa3\x3e\x5e\xcc\xf3\x78\xb1\x56\x29\x36\x4a\x99\xb8\x66\xc6\x5b\x06\x33\xb2\x56\xab\x9d\xcb\x26\xb3\xa5\x5a\x2b\x57\x6a\x66\xaa\x19\x2d\x99\xe2\xb4\xa6\xd7\xb3\xf5\x56\x23\x93\x29\x9a\xe5\xc4\xed\x54\xf6\xb0\x8f\xa3\x72\xb6\x55\x45\x59\xad\x96\x32\xac\x66\xbe\x50\x29\x14\x4a\x96\x9e\x48\xb0\x62\xa2\x98\xce\x19\x5a\xb2\x52\xaa\x5a\x79\x5e\x4d\x9b\x55\x54\x49\x59\xa8\x95\x6e\x24\x35\xeb\x76\x44\xc2\x03\xee\x9b\x46\x8a\xe0\x6a\xba\x9d\x69\xe0\xb2\x89\x2d\xbd\x58\xd3\x50\x8d\x96\x1a\x34\x5e\xd5\xac\x66\x3a\xdd\xca\xe1\x5c\x36\x95\x69\xe0\x56\x95\x95\xad\xbc\x55\xc0\x89\x52\xa9\x76\x3b\x95\x23\xf0\x1b\x98\x53\x43\x6b\x59\x84\x15\x93\xe9\x14\x6a\xa4\x35\xb3\x9c\x40\x96\xd5\x2e\xf0\x22\x22\x2c\xd9\xca\x64\x12\xe9\x46\xb5\x8e\x2c\x9d\x67\x33\x3a\x2a\xd7\xca\x85\x77\xc8\xc2\x0f\x0b\xa5\x66\x21\x4d\x6f\xe9\xf9\x6c\x55\x47\x85\x7c\x96\x5a\x46\x33\x45\x8d\x6c\xbd\xcd\xca\xbc\x99\x2d\x58\xc5\x74\xb2\x8a\x50\x91\xe7\x9a\x24\x59\x69\xa4\x2a\x3c\x95\x4c\x96\x6e\xa7\x22\x0e\x6b\x7e\x3b\x5d\xca\xb7\x68\xa3\x92\x69\xa4\x69\xab\xd8\x36\xcc\x34\x45\xe9\x44\x9e\x56\x12\x39\xd2\x4a\xd7\x1a\x46\x2e\x57\x4f\xb7\x2b\x79\x94\x2a\x91\x78\x16\xe5\xb2\x39\x13\xbd\x63\xf6\x0f\xd8\xcf\x24\x48\x12\x25\x2a\x84\x26\x72\x96\x69\x92\xb2\x96\xa9\xa2\x42\xaa\xad\xe5\xb2\x35\x5a\xd2\x78\x86\xe2\x3c\xae\x17\x4b\xac\xa1\xe7\x58\xb3\x91\x31\x2b\x66\x3b\x5f\xbe\x1d\x95\xe8\x80\xfd\x38\x4f\x95\x5a\xe9\x42\x81\x59\x39\xcc\x33\x79\x4b\x6b\x35\x68\x55\x6b\x18\xa9\x78\x3a\x9d\x4a\x1b\x24\x6b\x30\xdd\x8a\x27\xda\xcd\x2c\x8a\xb7\x49\xb1\x58\x6c\xa2\x9a\x76\xbb\xff\x42\x7b\xec\x27\x13\xf5\x6a\x3c\x5d\xd1\xf5\x1a\xcf\x17\x9a\x35\x23\x63\x54\x9a\x71\xad\xd0\xcc\xa1\x2a\xc9\xa2\x7c\xb1\xd4\x6c\xa0\x0a\xad\x5a\x85\x7c\xd2\xca\x6a\xcd\x24\xad\x25\x33\x5a\xab\x78\x3b\x95\x3d\xf6\xb5\x34\x45\xd5\x06\x2b\x6b\x71\x56\x4d\x9b\x46\xb1\x5a\xc0\xa8\x45\x0c\x5c\x2b\x97\x0b\xa6\x69\x66\x4a\x7a\xa6\xa5\x65\x5b\x56\x89\x55\x52\x29\xd6\xd6\xea\x56\x8a\xb6\xcb\xef\x90\xe5\xe0\xf1\x09\xab\x5b\xf9\x78\xa2\x90\x45\x4d\x96\x6c\x16\x9a\x5c\xcb\xea\x75\x2b\x55\xc8\xe0\x9a\xc6\x9b\x71\x1d\x9b\x69\xb3\xc4\x8a\x9c\x64\xca\xb4\xd0\xcc\x18\xe9\x6a\x1d\xe5\xe2\xb7\x53\xd9\x63\x3f\xd9\x4c\x69\xe9\x5c\xa2\x92\xc8\x92\x44\x1e\xb5\x32\x79\xd6\xb2\x0a\x1a\xab\xe6\xf5\x66\xca\x6a\xf2\xb8\x91\xae\x1b\xe5\x62\xdc\x28\x64\xf5\x5a\xce\xca\xd1\x56\xd9\x2c\x18\xd9\x77\x50\x39\x62\x3f\x8b\x71\x2d\x51\x28\x57\x13\x79\x03\x99\x86\x15\xaf\xf0\x66\x2b\x6e\x51\x4c\x0b\x05\xbd\xae\x65\x0a\xb4\x15\x37\x49\xaa\x9a\x88\x93\x4c\x3b\x53\xe5\x6d\x8d\x26\xea\xf9\xbb\x8f\x9e\x40\x8e\x54\xf4\xb7\x4a\x86\xc7\x5b\x1b\x4f\x17\xae\x7e\x9f\xa9\xeb\xa7\x73\xbf\x45\x76\xc2\xcc\xa7\x0b\x75\x43\x6c\xfb\xfa\xe0\xed\x87\x23\xdb\x43\xb9\xf9\x34\xae\x75\xa7\xca\x0b\xe6\xf7\xf6\x60\xdc\xb5\x47\x8b\x21\xd9\x45\xe3\xb5\x4a\xf2\xee\x2b\x16\xf3\xe7\xd4\xd1\x1b\xd4\x3f\x7b\x91\x7f\x4e\x1d\x5f\xa0\xae\xd7\xac\xbb\xaf\x88\x95\x9e\x53\x27\x6f\x50\xff\x5a\xd9\xe9\x1b\x9a\xff\x5a\xd9\xd9\x1b\xd4\x3f\xdb\x89\x3c\xa7\xbe\xf3\xb9\x23\x7b\x1e\x2c\xd5\x8e\xd8\xdd\x8b\x52\xee\x7b\x4e\x46\x7f\xca\xba\xf0\x6c\x2f\xe7\x5b\x84\xdf\xba\x28\x9c\x3b\x18\xfd\xd1\x55\xe1\xe1\x70\xf4\xc9\xb2\x80\x88\x84\x40\x40\xc0\x11\xa3\xfb\x9a\x37\xd9\xe1\xe5\x7f\x7e\x1b\xa9\xd5\x8e\xd3\xdf\xbe\x47\x9e\x4a\xf0\x00\xfc\xbf\x4b\xba\x3f\x3b\x32\x11\x10\x43\x2c\x25\x93\x8f\xd5\xf4\xff\xf9\x6d\x36\xb7\xa7\xf3\x60\xd4\xb9\x77\xec\x81\x3d\x72\xd5\x6f\xdf\x23\xbf\x41\x00\xc0\xef\x47\x12\xbf\xdd\x4c\x03\xbd\xa4\x81\x0e\xc5\xfe\xff\xf9\xed\x50\x70\x7a\x35\xf2\xb7\xc8\x6f\x4f\xd7\x0d\x76\xad\x07\xf3\xb8\x9d\xe2\x2b\xa9\xf0\xb7\x08\x3c\x88\xb5\x52\x41\xa7\xbb\x23\x09\xbf\x45\x7e\x3b\x4c\xc8\x7d\x5f\x6d\x76\x54\x3e\x5a\x50\xb8\x9d\x2f\xbc\xe3\x0b\x50\x28\x20\x47\x8c\xe3\xbd\xb6\xd1\x2b\x4d\x7c\x9e\x1e\x5e\xd1\x3b\xab\xf9\xcf\xa5\x87\x19\x42\x18\x01\x8a\x39\xff\x32\x6b\x7a\x46\xe3\xcb\xad\xe9\x95\x54\xb7\x59\xd3\x07\x8b\x3a\xb7\xf3\x45\x76\x7c\x41\x89\x04\xc2\x02\x08\xf8\xe5\xd6\x84\x5e\xd2\xfb\x62\x6b\x7a\x4e\x0f\x7d\xb9\x7c\xe4\x25\xbd\x2f\x96\x6f\x47\x0f\x71\x86\x31\xe2\x80\x0b\xfa\x65\x68\x79\x46\xe3\xcb\xd1\xf2\x4a\xaa\x1b\xd1\xf2\xb1\xea\xe4\xed\x7c\xed\x64\x47\x18\x63\x81\x01\x26\xe2\xe0\xe9\xc8\xc1\x9c\x46\xf6\xf0\x28\xea\x50\xc1\x9d\x06\x96\xf6\x60\xb1\xff\xc6\x48\x6a\x2b\x43\xfb\xc7\x3f\xde\x47\x06\x4a\x40\x30\xc6\x0c\x4a\x7c\x23\x99\x6a\x76\x6b\xbe\x9f\x0c\xe1\x44\x60\x26\x84\x3c\xac\xb4\x04\xbe\x22\x83\xde\x39\x22\x20\x14\x13\x00\x19\x38\xac\x26\x04\x7c\x0d\xe3\x07\x32\x94\x3d\x30\xfe\x9a\x0c\x7a\x46\xc6\xac\xb6\x70\xf1\xa3\x64\x24\x7f\x98\x86\xd7\x64\x22\xcf\xc8\xd8\x4d\x6b\x9b\x4d\x7b\x4b\x2f\x11\xdf\xba\xe9\x54\xaf\xdd\x34\xba\xef\x23\x09\x18\xa4\x82\x60\x82\xc1\xd7\xc1\xf9\x19\x8d\x2f\x87\xf3\x2b\xa9\x6e\x84\xf3\xc7\xf6\x01\xde\xa9\x09\x28\x18\x26\x8c\x03\x20\xcf\x3b\x07\x8a\x28\x67\x9c\xfd\x2e\x29\x66\x40\xa2\x1f\xd7\x06\x7b\x49\x15\xbd\xa6\x8a\x05\x24\x04\xed\xa7\x00\x12\x28\x3f\x85\x28\x94\x9c\x32\x41\xa4\xe4\xf0\x60\xcb\x7c\x4f\x34\x18\xf9\x83\xc3\x19\x2d\x4f\xcd\xe6\xc1\x68\xff\x79\xaf\xff\x0f\x6e\x91\xbc\x4b\xff\x07\xa6\x28\xc0\xe2\xa8\xff\xb7\x98\xfa\xe0\x5e\xda\x3b\x35\x85\x11\xc7\x14\x23\x02\xdf\x8a\x3f\xd1\x53\xbe\xf4\x21\x24\x3e\x27\x75\x06\x89\xe7\x08\x7c\x8e\x35\x9c\x12\xbe\x0d\x90\x5f\x6e\x10\x3b\x6d\xef\x5c\x91\xa0\x8c\x42\x04\x1f\x8f\x74\x9d\x2a\x44\x4a\xf9\xbb\xdc\xfd\x7d\x52\x78\xf8\x9c\xe0\x19\x2c\x7e\x2a\xc1\x57\x12\x1e\xa0\x78\xf7\x3f\xef\x1b\x81\x30\x81\xa9\xe4\x02\x7d\x99\x8b\x78\x4e\xe3\xcb\x5d\xc4\x2b\xa9\x6e\xcc\xb6\x3f\xb6\xc1\x7a\x3b\x5f\x62\xc7\x17\xc0\x42\x30\x0c\x28\x3a\xba\x08\xb2\xe7\x6b\x3e\x5d\xec\x9e\x39\xf0\xf1\xb1\xed\xd1\x27\xbd\xb9\xa1\xb7\xd7\x9b\x5e\xb3\x5e\x2b\xf3\x65\x5d\xed\xa9\xc7\xe1\x6d\x07\x07\x70\x7e\xac\xbc\xf7\x3e\x55\x70\x06\x24\x66\x0c\x23\x7c\x2c\x3c\xe0\xaf\x53\x45\xad\x92\xfc\x2f\x50\x05\xc7\x0f\x56\xf1\x85\xaa\xf8\x0f\xb6\x8a\x9d\xf0\x1c\x72\x29\x98\xa4\x12\x1f\xdc\x25\x3a\x00\x77\x10\x0c\x83\xc3\x0a\xba\x4b\x9a\x38\x02\x98\x09\xfa\x3b\xe1\x9c\x0a\xc0\xff\xab\xe6\xfb\x51\x48\x0e\x00\x78\x30\xfd\x0f\x09\xf9\x1f\x3c\x93\x3b\xa3\x66\x9c\x02\xcc\x91\x60\xe4\xe0\x7c\xd9\x61\xd1\x5f\xcc\xbb\xf7\x53\x35\x59\x04\x53\xe5\xdd\xfb\x03\xbb\xf3\xdb\xf7\x7d\x45\x7b\xc7\xe7\xa1\x6d\x19\xba\xb6\x33\x50\xa7\x8d\xef\xd2\x2e\xc3\x08\x08\xce\x20\x26\x5f\xe7\xd1\x9e\xd1\xf8\x72\x8f\xf6\x4a\xaa\x1b\x3d\xda\x07\xd7\x8c\xf7\x4d\xf3\x81\x2f\x4a\x8e\xd3\xfc\x85\xda\x3e\xd0\xf8\x72\x6d\xbf\x92\xea\xc6\x88\xf6\xab\x41\xb5\xe3\x01\x52\x21\x21\xe6\x92\x00\x72\x74\x15\xf0\xf9\xd2\x71\x46\x0f\x3f\xbe\x28\x7e\x79\xa2\x74\x10\x8d\x30\x28\x04\x62\x9c\x1e\x57\x45\xf4\x5c\x34\x78\x6e\x92\xff\x6b\x84\x03\x18\x61\x41\x25\xa1\xfc\x8f\x27\x1c\x61\x00\x09\x21\x11\x64\xf0\xdf\xe2\xb4\x7f\x92\x94\x90\x63\x2c\x11\x11\xec\xeb\xfc\xca\x33\x1a\x5f\xbf\x2f\xf9\x4a\xac\x1b\x1d\xcb\xc7\xce\x56\xbe\x83\xb1\x9d\x1d\x61\x4e\xb0\x90\x94\xd3\xe3\x3e\xf0\x95\x00\x62\xff\xce\xc7\x8b\x11\xc4\xbe\xf5\x23\xb4\x19\x64\xc7\xb9\x86\xe8\xb9\x52\xd0\x19\xa5\x7c\xec\x28\xe8\x87\x94\x72\x64\x6c\x67\x31\x87\xf5\xff\x05\x2f\x71\x96\xc3\x8d\x62\x21\xdf\x2a\xeb\x2c\x5f\x4f\xb6\x75\x8d\xe4\x92\x46\xaa\x5a\x2d\x9a\xb5\x56\x09\x97\x6a\x19\x33\x69\xb6\xad\x46\x36\xaf\xb1\x5c\xb9\x91\x35\x72\x6d\xad\x9a\xd2\xdf\xcb\x0b\x86\x04\x4b\x09\xd0\x71\xeb\xf8\x3f\x47\x49\xa7\x8c\xa1\xd7\x8c\xd1\xd7\x8c\xfd\x1c\x8d\x21\x80\xa8\x04\x42\xe0\xe3\xf6\xda\xbf\xbd\x42\x79\xc2\xd5\x6e\x09\xb8\x29\x52\xff\xd0\xe0\x8c\x1e\xf7\xdf\x9f\x0d\xfe\x23\xa1\xfe\xd3\xe8\x10\x00\xf6\x9f\x66\x82\x47\xc6\x08\x3f\x2e\x5e\x87\x3a\xcf\x20\x5c\xdd\xcf\xbb\x53\x35\xeb\x86\x03\xef\xb7\xef\x3b\x17\xf2\xdb\x50\x79\xcf\xbe\xdb\xb1\xdc\x0d\x3a\xdd\xe7\x5f\x7e\x88\xba\x78\x70\x55\x74\x4f\xbd\x1b\x0e\xd5\xbd\x17\x0e\xed\x60\x6f\x5d\x6a\x6d\x0f\xc7\x03\xf5\xbb\x1b\x0e\x3f\x24\x1c\x44\xf2\xe8\xef\xff\xc3\xb4\x7e\x64\x0c\xdd\xe4\xcb\x7e\x0e\xf0\x21\x95\x8c\x40\x04\x81\xf8\xb2\x33\x4d\xcf\x69\x7c\x7d\xec\xf0\x4a\xac\x1b\x63\x87\x2f\x37\x84\xfd\xbc\x73\xcc\x09\x14\x8c\xc8\x2f\x3b\xf5\xf3\x9c\xc6\xd7\xeb\xfb\x15\xc9\xdb\xf4\xfd\xc1\xbb\x23\xef\x60\x8c\xec\xf8\xc0\x80\x4b\x04\x25\x3a\xee\xd4\xe3\x83\x32\x0e\xef\xd1\x3a\xf0\xf1\xb1\xdb\x25\x3b\xc5\x3d\xdc\xd1\xfc\xed\xfb\x4e\xe6\xdf\x66\xe1\xc0\xbb\x3f\xdd\xd5\x3a\x55\xb2\x13\x2e\x3a\xdd\xf9\xc5\xe6\xc3\xb3\xe7\xd2\x8e\x93\x96\x6b\xb9\xc7\xc3\xf8\xe7\xe6\xf2\xf9\x28\xa7\xf9\xc9\xc7\x8e\x49\xbf\x63\x0e\xf0\xcb\x39\x40\x67\xe7\xe0\x83\x7c\x7c\xd9\x1c\xbc\x56\xe0\x33\xfd\xbe\x98\xa2\xb3\xba\x7f\x73\x92\x7e\xf6\x3c\x48\x42\x84\x44\x82\xb0\x87\x53\x00\x3f\x3b\x19\xfe\x29\x42\x02\x28\x09\x86\x1c\x1f\xf7\xff\xbf\x60\x7d\x7d\x46\xe2\xeb\x97\xd7\x97\x42\xdd\xb8\xba\x7e\x70\x55\x7b\xd7\xea\x7a\xe0\x0b\x41\x02\xbe\x2c\x78\x78\x46\xe2\xeb\x95\xfd\x52\xa8\x1b\x95\xfd\xe5\x96\xcd\xbf\x45\x04\x15\x52\x62\x0a\xc0\xf1\xbc\xc6\xeb\x13\x9e\x57\x0a\x75\x1f\xdf\x92\xf9\xe0\x7d\x8e\x77\xc8\xc6\x5e\xc8\x76\x7e\x96\x3f\x71\x92\x5f\x12\xc4\xe7\x5c\xd2\x47\xe5\x7e\xee\x92\xd0\x6b\x97\xf4\x42\x96\x57\x3e\xe9\x45\xfb\xfb\x9d\xd2\x71\xae\x7f\xd8\x29\x7d\xfd\xcc\xd3\x17\x13\x41\xce\x4d\xc4\x07\xef\xb2\x7e\xe5\x44\xbc\xd0\xf4\x57\x46\x68\x5f\x3f\x09\xbb\xa5\x05\x32\x40\xb0\x40\x1c\x9d\x3f\x1c\x8f\xfe\x9b\x97\x96\x53\xd9\x6e\x5d\x5a\x7e\x3c\xd8\xf9\xf9\xb2\x7d\xe1\x2a\x06\xdf\x0f\x1e\xf4\x26\x78\x7e\x42\x7a\xf3\x73\x56\xb0\xd3\x49\xf8\xc2\x15\xec\xcc\x24\xa0\xaf\x76\x25\x9f\x95\xdf\xfc\x7c\x34\xd0\x9f\xea\xd3\xdf\x9a\x88\xcb\x68\xf8\x43\xfa\xf4\xd3\x89\x60\x3f\xd5\xa7\x7f\x7c\x22\xfe\x50\x3e\x9d\x7d\x8b\x70\x8e\x81\x24\x90\x92\xe3\xf1\xd9\x77\xa5\x0b\xff\xc9\x7e\x8f\xbe\x90\xed\x0f\xe6\xd3\x39\x06\x90\x10\x22\x20\xfa\xf7\x54\x69\x7e\x4a\xc0\x79\x10\x92\x22\xf4\x60\x9c\x3f\xf9\x9c\xe1\x4f\x99\x49\x26\x38\x94\x44\x00\x81\xbf\xac\x14\xf5\x8c\xc4\xd7\x57\x47\x5e\x0a\x75\xeb\x8d\x8a\x8f\x2d\xf6\xef\xb2\xa8\x23\x5f\x44\xa2\x2f\x2b\x45\x3d\x23\xf1\xf5\xca\x7e\x29\xd4\xad\xd7\x43\x3f\xf4\x4e\xa6\xf7\xad\xbf\x47\xbe\x24\xf8\xba\xab\x19\xcf\x48\x7c\xbd\xb2\x5f\x0a\x75\xa3\xb2\xbf\x7c\x19\x11\xdf\x22\x8c\x10\x44\x28\xc4\x14\x5f\xaa\xfb\x7d\x85\xaf\xfb\xe0\xab\x4c\xde\x21\x9a\x7c\x21\xda\x8d\x97\xc8\xff\x1b\x44\xdb\xcd\x1a\x80\x48\x52\xc2\x10\xf9\xfa\xf7\x0d\xec\x55\x79\x4a\xef\x8b\xef\xe3\x3f\xc9\x47\x01\xfe\x37\x5d\x87\xf8\x29\xf6\x49\xa9\xc0\x84\x72\x21\xbf\xee\xc0\xfe\x33\x12\x5f\xbf\xce\xbd\x14\xea\xd6\x1b\x68\x3f\x01\x31\x07\xbe\x04\x06\x5f\x77\x5e\xff\x19\x89\xaf\x57\xf6\x4b\xa1\x6e\x7d\x1d\xca\x87\xde\x77\xf8\x0e\x45\x80\x6f\x11\x0a\x29\x96\x0c\x42\x46\xde\x0a\x97\xe8\x47\x54\x0d\x5f\x50\x38\xa3\x6b\xfa\x99\x2f\x40\x79\x29\xd1\x8d\x66\xfd\xb1\xb7\x31\xbe\x4f\x0f\x84\x23\x42\x18\x21\x98\x7e\x59\x16\xf0\x8c\xc4\x97\x9b\xf5\x2b\xa1\x6e\xcc\x02\x3e\xf6\x52\xca\xf7\x29\x02\x49\x22\x19\xe7\x80\xde\x1e\x2a\x7d\x58\x0d\x2f\xe9\x7d\xfd\x4b\x7e\x9e\xc8\x89\x9f\x2c\x9e\xf8\x7a\xf1\x76\xe3\x0b\x46\x09\x07\x92\xb3\x2f\xf3\x00\xcf\x48\x7c\x3d\x54\x5e\x52\xbc\xd1\x03\x7c\xec\xcd\xaa\xef\x53\x04\xc1\x54\x72\x82\x08\xbb\x50\x1e\xfc\x44\x2d\xe0\x17\xe4\xce\xe9\xfd\x53\x81\x72\xa4\xc6\x28\xbb\x10\x7c\x7f\x89\x70\x07\x72\x3f\x49\x38\x0a\xd8\xa5\x45\xee\x2b\x84\x3b\x92\xfb\x59\xc2\x91\xc7\xab\x76\x3f\x45\xb8\x03\xb9\x2f\x16\x6e\x47\x0e\x00\xb6\xcb\x85\xe0\xd7\xbd\x40\xf2\x19\x89\xaf\x5f\xe0\x5e\x0a\x75\xe3\x02\xf7\xb1\x97\x3a\xbf\x83\x2f\xf2\x2d\x82\x28\x67\x52\x00\x2e\x6e\xbf\x81\xf1\xc1\xd7\x40\xff\x00\x5f\x67\xee\x00\x9d\x8b\x9d\xb0\xce\x33\x79\xc3\x32\xab\x2c\x93\x8e\xa7\x33\xf1\x2a\xcb\xb2\x9c\x4e\x4c\x54\x21\x0d\x9a\x6f\x23\xc2\xaa\xe9\x1c\xc9\x97\x2b\xcd\x1c\x2a\x91\x78\x33\x51\x2b\x95\x8d\x77\x14\xf5\xf6\x7c\xed\x5f\x93\x46\xc8\xa5\x1b\x2b\xe7\xf8\xfa\x29\xfa\x3a\xe5\xeb\xb6\xab\x13\x3f\x53\x5f\xe2\xfa\x45\x1a\xf4\xf9\x17\x69\x76\xc4\x8f\x6f\x6a\xc0\x48\x7c\xdd\xe5\xf6\x53\x12\x5f\xbf\x92\xbc\x14\xea\xc6\xac\xe2\xcb\x2d\x70\x17\x1e\x21\x21\x88\x04\x54\x7e\xdd\xbb\x27\x9f\x91\xf8\x7a\x65\xbf\x14\xea\xd6\x72\xf7\x87\xde\x5f\x7f\xe0\xeb\x8d\xb7\x42\x1f\x7e\x2f\xea\x73\xde\x0a\x7d\x1c\xeb\xe9\x4d\x60\xf0\x5b\xe4\x8e\x13\x97\x79\xbe\x87\x85\xcb\x1c\x97\x38\x10\x78\xca\xf3\x1c\x85\x7c\xcf\xa3\x36\x24\xd8\x16\x90\x33\x0a\x11\x56\x4c\x39\x0c\x23\xe2\xf9\xca\x07\x9e\xeb\x11\x9b\x52\xdf\x81\x77\xdf\x22\x77\xbe\x2b\x08\xf6\x10\x24\xd8\xe5\xcc\xf1\x90\x54\x0e\x76\xa0\xef\x7b\x9e\x8b\x3d\x22\x3c\x06\x5c\x6e\x43\xcf\xf5\x6d\x88\x6d\x4f\x08\x28\xa1\x67\x03\xcc\x81\x44\x3e\x44\xde\xf1\x47\x18\xe1\x8b\x5f\x8d\x62\xdf\x31\xfb\x8e\xf8\xcb\x1f\x93\x62\xdf\x31\xfd\x8e\xf1\xef\xfb\x77\x33\xa3\x37\x5b\x11\x83\x52\x62\x00\x28\xa0\xec\x5b\x04\xee\xfe\x07\x00\x80\x12\x70\xf4\xf8\x23\x90\x60\xe7\xad\x09\x87\x68\x7f\xd9\x6b\xf7\x4f\xf8\xd4\x02\x1f\x3f\xec\x18\xd4\x34\x4d\x4b\xc4\x36\x7a\xa9\x92\x4a\xae\xd1\xb2\x32\x9a\x16\xd7\x31\x89\x93\x30\x0b\x3b\x6b\x96\x71\xa3\xdd\xe2\x3c\x88\xf7\xbd\x30\xe9\xe6\x0a\xeb\x42\x79\x35\x72\xc2\x64\x7b\x53\xec\xb8\x1b\xdf\x21\x7d\x45\x57\x59\x5c\x09\x67\xf5\x36\x6b\x95\x17\xeb\xec\xc8\x44\x35\xe6\xc5\x3d\x22\xbb\xad\xdd\xd0\x5a\xb3\x54\x37\x82\x95\xf6\xf8\x17\xce\xf4\xee\xd2\xaa\x26\x96\xb6\x97\x8d\xe5\xe4\x34\x2a\xfa\xf1\xe8\xa0\xa5\xb1\xe2\xb8\x5b\xed\x65\x32\x31\x1a\xa2\x68\xd0\x1f\x64\x49\x89\x4c\x97\xa5\x8c\xb6\xc6\xf6\x2c\x80\x21\xe1\x46\x09\xa2\xa9\x99\x28\x57\xb2\xb5\x7a\xb2\x07\xeb\x53\x6f\x21\x60\x74\x5e\x2c\x24\xfd\xdd\xf8\x49\x60\x92\x46\x79\xdc\x30\x7b\xf9\x23\xa9\x38\x28\x59\x74\xff\xa9\xfc\x48\x3e\xbd\xfb\xbf\xb6\xd6\x84\xa4\xbc\x7b\x24\xa7\xe5\x19\x9a\xf8\xbd\x74\x33\xb9\xe9\x45\xe1\xb8\x59\x2d\x68\x6a\xc6\x62\xb1\x92\x17\x64\x8c\xec\x80\x76\x32\xc5\x7e\xb5\xa7\x9a\xc5\xd8\x0a\x68\xff\x09\x7f\x8f\xbf\xef\x69\xd6\x0a\x85\x0b\xcb\xc0\x2b\x5c\x80\xcf\xb1\xe9\x3b\x41\x15\x47\x8c\x11\xd7\x83\x02\x53\x84\x18\x12\x8c\xf9\x80\x62\x4a\x09\x80\x98\x21\xc7\x16\xae\xb2\x99\x8d\x7c\xc2\x15\xe2\x90\x11\x0e\x6d\x47\x00\x8f\xdb\x02\x01\x71\x0d\x17\xec\xa2\xe5\x63\x4a\x10\x7c\xb3\xf5\x18\x6e\x61\xce\x77\xe2\x5e\xc7\x05\xbc\x11\x17\xa4\x39\xca\x0d\xab\x66\x3a\x59\x0b\x5a\x61\x7b\x19\xaf\xd6\x6b\x5a\xb5\x35\x9d\x18\x6c\x18\x2e\xad\x68\x6e\xdd\xce\xa4\xa7\x1d\x53\x85\xd9\x2c\x15\x7e\x7d\x39\x98\x56\xbb\x6e\x61\x66\x75\xdb\x31\xa3\xd1\x35\x0c\x3f\x56\x6b\x4d\x51\x71\xdb\xb7\xfa\xd5\x7c\xaa\xd5\x4e\xa6\xcb\x54\x1d\xc0\xb0\xc7\x45\xe7\x69\x5e\xdb\x71\xd4\xe4\x03\x37\xe1\x70\x8e\x06\x25\x5e\x1e\xcc\xb3\x2b\x9f\x6b\x7e\x54\xaf\x04\xb3\xfc\x2c\x4c\x8d\x6b\xd0\x8d\xb7\x97\x15\x97\xbb\x5d\x27\x85\x4b\x5d\xd5\x2c\x45\xb7\x3c\x3a\x9f\xe5\xa8\x43\xd3\xad\x59\x43\xb7\x37\x2c\x19\xb0\x44\xbf\xdf\xb7\xbd\xdc\x30\xd5\xc7\xbb\x81\x93\xab\x33\xb8\x28\xd7\xf7\x9f\x7e\x71\x5c\x50\xf9\x39\x36\x7d\x07\x94\x84\x8c\x21\x8f\x41\xc7\xe1\x0e\x12\xbe\xed\x53\x4e\x1d\x69\x63\x0a\x28\x67\xbe\x4b\x80\x0f\x99\xc2\x02\x41\xce\x31\x04\x92\x11\x2c\x89\xe3\x20\xe4\x29\x46\x85\x73\x0d\x17\xf4\xa2\xe5\x13\x06\xd8\xf5\x56\xb6\xc7\x05\x26\x00\x03\x0e\x08\x23\x6f\xe1\x02\xdc\x88\x8b\x15\xb3\xda\x01\xec\x2e\xf0\x2c\x8c\x2e\xeb\x70\x61\x9b\xe5\x3a\x8a\xe9\xc9\xb5\xd3\xeb\x74\xbd\xad\x9e\x6b\x27\x07\x85\x59\x80\x87\x8d\x42\x34\x9b\x18\xe1\x78\xa1\xdc\xb4\x66\xdc\x1f\x90\x59\xd0\x48\x25\xd0\xc0\x4b\xaa\x28\x87\x9e\xdf\x8e\x16\xe7\xac\xb2\x5d\x58\x79\x27\x3c\xcc\xe3\x1e\x17\x4f\x76\xa9\x0d\x4c\x63\x15\x4f\xd6\xf4\xc9\x3c\xd0\xab\xc3\x5a\xd4\x5e\x0c\xfa\xc6\x34\xb9\xa8\xcf\xe3\xbe\x5f\x10\xb3\xba\x9a\x0c\xc1\x7a\x18\xdd\xa4\xb6\xf3\x8c\xdf\xa3\x4d\x91\x28\xd4\xc3\x8a\xb2\x50\x67\x2c\xb4\x44\xa8\x6f\xb2\xaa\x32\x37\x49\x91\x4e\xe7\x7c\x52\xa9\xd8\xeb\x75\x77\xb1\xf7\x17\xb3\x33\xb8\x28\xae\xf7\x9f\x7e\x75\x5c\x88\xcf\xb1\xe9\x3b\xe2\x33\x4f\xda\xb6\xf0\x81\x8b\x6c\xe0\x38\x9c\x21\x04\x31\x82\x18\x22\x07\x10\x22\x39\x02\x0a\x10\xee\xb8\x2e\xe1\xb6\xf0\x08\x57\x58\x08\xca\x10\xc4\x92\x79\x0a\xa3\x6b\xb8\x20\x17\x2d\x9f\x72\x44\x2f\xc7\x51\x0f\xad\x0f\xbf\x1f\x82\x21\x13\x6f\xe0\x02\xc8\x1b\x71\x01\xe4\x7c\x38\xe9\xad\x56\x93\x04\xf7\x82\x6c\x35\x5b\xd5\xa7\x71\x7d\xb0\x49\x76\x2c\xbe\xd5\x55\x08\x33\x84\x74\x1b\xd9\xea\x60\x4e\x36\x74\x60\xdb\x6a\xdd\x0e\x70\x5c\x85\x39\x27\xde\xca\xeb\x99\xba\x65\x37\xcb\xf1\x6d\x7b\xdb\x4c\xf6\xa6\xc1\x76\x18\x6f\xdb\x69\x24\x1a\x07\x60\xec\x71\x71\x32\xaf\x69\xc3\x2f\xc7\x53\xb1\xd6\xa4\xa5\x3c\xbd\x66\x8e\xca\x8b\x60\xb0\x5d\xf4\xb7\x85\x5c\x49\xd5\xa7\x96\xcc\xb2\x09\x76\x6c\x33\x2d\xf0\x48\xf4\xbd\x86\x55\x9a\x58\xbe\xc7\x66\xfd\x62\xd5\xcb\x75\x71\x67\x05\x13\x85\x8d\xd6\xf6\x07\x20\x3f\x1b\x2f\x95\xdd\x8f\x35\x6b\xf1\xe9\x6e\xe0\x64\x78\x06\x17\xa6\xb9\xff\xf4\xab\xe3\x82\x7f\x8e\x4d\xdf\x11\x22\x09\xb6\x6d\x97\x01\x9f\x63\x2e\x10\x72\x1d\x47\x28\x0f\x48\xcf\xf6\xb0\xed\xfa\x3e\x03\xbe\x14\x10\x7a\x8e\x74\x5d\xca\x94\xbf\x4b\x5f\x18\x10\x48\x79\x1c\xfa\xce\xd5\xfc\x02\x5f\xb4\x7c\x26\x08\xb9\xde\x4a\xee\x9e\x7e\x27\x86\x0a\x8e\xde\xc2\x85\xb8\x15\x17\x95\x5a\x71\xb2\xee\xc8\xad\x4a\x14\x0a\x8b\x22\xc8\xa1\x79\x71\x16\x43\x49\xda\xb1\x10\xdd\xa6\x9c\x25\x59\xc2\x4e\x67\x01\xd7\xd1\x55\xa5\xad\x2f\x54\xbd\x3c\xae\x4f\xbd\x26\x09\xa3\x79\x63\xc1\x68\x9b\x69\x93\x92\x5e\xee\xe0\x6e\xb2\x63\xa4\x9b\xf5\x6d\xc3\xf3\x3b\xe4\x29\xbf\xe8\x9e\xe4\x17\x90\xcc\x52\x59\x6b\xd1\x6b\xac\x3a\x32\x3f\x6e\xe0\xb5\x5b\xaa\xc6\xb5\xb4\x5a\xc4\x59\x62\x36\xaa\x18\xd5\x71\x49\x54\x7a\x95\x99\x27\xc3\x9e\x1c\x88\x72\xcc\x29\x42\xd1\x18\xab\xcc\xba\x08\xab\xdd\x7c\x35\xed\x68\xf3\xec\x90\x5a\x09\xb2\x99\xcc\x9b\x24\x5f\xb0\xad\x4c\x6c\x67\xf7\xc9\xfe\x19\x5c\x14\xc6\xfb\x4f\xbf\x3a\x2e\xd8\xe7\xd8\xf4\x9d\xf4\x15\x13\x82\x43\xe2\xd8\x84\x21\xc7\x41\x8e\xed\x39\x14\x21\x1b\x09\x9f\x60\xca\xb8\x70\x5d\x6c\x7b\x58\x60\xcf\x25\xb6\xef\x49\x68\x0b\x17\x42\x85\xa9\x8d\x3d\x8e\xe9\x35\x5c\x5c\xf6\x08\x02\x10\x79\xd9\x9b\xec\x5a\xe9\xdd\xe3\xef\x06\x31\x41\xf9\x5b\x79\x37\xe0\x37\xe2\x82\xc6\x86\x41\x26\x55\x18\xa7\xf3\x3c\xcf\x10\xcc\x4e\xf2\xa5\x32\x6c\x93\x6d\x72\x5a\xed\xc8\x75\x3e\xd6\x4e\x87\x2b\x8b\xc0\x50\xba\x50\xf3\xa7\x0b\x1d\x66\x4d\xd7\x8c\xda\xd6\xb2\xaf\x0d\x8c\x92\x8b\x90\x57\xed\x74\x3a\x81\xcf\x56\x83\xd0\x98\x97\x09\xef\xe5\x26\x56\x76\x3f\x8f\x7b\x5c\x9c\xe4\x17\x0b\x6f\x99\xcd\x3b\x5e\xaa\x5c\x64\xee\x68\x12\x1f\xf8\x5a\x19\x4c\x56\xc1\x52\x54\x63\x4e\xb8\x8a\x35\x4a\xd5\xac\x66\x86\x31\xdd\xb2\xf4\x49\x99\x24\x56\xb6\xca\xb4\x53\xc3\x28\x58\xa4\xc3\xb6\x33\x6c\x79\x61\x7c\xa5\xd9\xc3\x14\x5d\x42\xa0\x0f\x47\x75\x9f\x2c\xd6\x19\xb6\x1b\x3f\xd9\x39\x83\x8b\x7c\x6a\xff\xe9\x57\xc7\x05\xfd\x1c\x9b\xbe\x73\x84\x04\xae\xef\x71\x8c\x18\x10\xd8\xf6\x28\x97\x36\xa4\x90\x31\x89\x20\xf2\x29\x44\x1c\xbb\x40\x00\x85\x1c\xc6\x6d\xcc\x18\x51\x0e\x77\x1d\xd7\x91\x3e\xe4\x1c\x92\xab\xfe\xe2\x72\x66\x2d\x11\x61\xd7\x5b\xf7\x71\xd4\xf1\x97\xa0\x20\x12\x6f\xe5\xdd\x80\xdd\x88\x0b\x1e\x94\xb7\xd2\xdd\xb4\xb2\xc5\x79\x9d\x86\xf5\xd4\xb0\xdf\x2d\x40\x7d\x54\xd2\x3a\xc5\x3c\x52\xbd\x76\x9f\xe1\x8d\x58\xf8\x29\x9c\xd2\xd2\xba\x4a\xeb\x32\x8e\xe7\x03\x1e\xca\x84\x9f\x9f\x97\xea\x06\x49\xaa\x86\x53\xf3\x63\xf1\x10\x4b\x37\x99\xa9\x4e\xf5\xac\x3d\x72\x4f\xfc\xc5\x49\x7e\x91\x29\x2e\x40\xdc\x8a\x22\x5a\x4d\x6e\xdc\x16\xf7\x5c\xb3\xb2\xa9\xbb\x7d\x38\xda\xb4\xe3\x89\xbe\x16\x4f\xb5\x9b\xab\x5e\x3f\x70\x29\xaa\xd0\x12\x42\xed\x61\x2d\xda\xe9\x95\x92\xd9\x5e\x57\x6b\x74\xda\xf1\xc6\xb6\xdd\x06\x2b\xab\xcb\x37\x45\x6b\x2a\x47\x41\x6f\x1c\xc7\xab\xc6\x3e\xbf\x70\xcf\xe0\x22\xdb\xdd\x7f\xfa\xd5\x71\x41\x3e\xc7\xa6\xef\x88\x60\x84\xda\x9e\x20\x18\x28\x2a\x29\xa2\x14\xbb\x1e\x93\x94\x49\x9b\x72\x08\x1d\xdb\x95\x98\x30\xe8\x40\x57\xba\x00\x03\x87\x01\x07\x30\xe4\x13\x41\xb1\xc3\x1c\x48\xee\x1e\xf7\x9e\x5f\xe3\x02\x5c\xb2\x7c\x02\xa8\x80\x17\xbd\xc9\x63\xeb\xc3\x2f\x67\x61\x29\xde\xca\xbb\x01\xbd\x35\x8e\xea\xf6\x1b\xf3\x6e\x32\x39\x18\x54\xea\xd5\x6d\x63\xd0\x18\x0e\x5c\x6b\x31\xeb\x83\x96\x93\xc9\xad\x92\x09\x94\x58\xb5\x96\x95\x54\x11\xcd\x6a\x9e\xb6\x1d\x0f\xdb\xa4\x3e\x0c\x72\x5a\x3a\xdb\x1d\xc1\x84\x48\x30\xba\xd1\xfa\xc3\x79\xdc\x4d\xf4\x53\xcd\x4c\x72\xd5\xaf\x96\xc2\x56\xff\xa9\x1e\xd5\x3d\x99\x57\xbf\x59\xf7\x4b\x15\xd9\x8b\x4f\xba\x55\x7f\x4b\x0a\xc1\xb2\xd5\x2a\x49\x67\x3e\x5a\x44\x27\x2b\x3f\x36\x19\xd7\x5b\x05\x9e\xe9\x38\x9a\x81\x68\xd1\x2b\x64\x48\xa1\xb9\x58\x8d\x4c\x99\x1c\x2f\x72\xc5\xbe\x88\xeb\x2e\xc9\x06\x6e\xd0\xb3\x7a\xda\x74\xd5\x0a\xdc\x3a\xee\x93\xf5\x3e\x8e\x6a\x9d\xc1\x45\x5a\xee\x3f\xfd\xea\xb8\xc0\x9f\x63\xd3\x77\x8e\xc7\x1d\x82\xa4\xe7\x78\xc2\x17\xca\xf7\xa0\x43\x99\xf2\x38\x40\x8e\x0f\x05\x56\x84\x63\x0c\xa9\x42\x3e\x20\x08\x79\x0e\xa5\x52\x52\x22\x5c\x02\x88\xab\xd4\xb1\x6c\x74\xc9\x5f\x40\x79\xd1\xf2\x11\x40\x52\xbc\xd9\x7a\xfc\x2d\x34\xc6\x98\x78\x33\xef\xc6\xb7\xfa\x0b\xc8\xcb\x63\x24\x7b\x84\xcb\x34\x74\xe6\x6e\x62\xb9\xee\x44\xad\xad\x51\x27\xcb\x78\xa2\xe0\xd4\xdb\x83\x5a\x4f\x8f\x1b\x7c\x18\x1f\x26\x97\x56\x80\xc9\x82\x5a\x1d\x5d\x4b\x06\xce\xd8\x2d\x12\x97\x16\xe3\x4e\x21\x4b\x33\xa9\xc6\x1a\xce\xb7\xb0\x18\x5f\xad\x79\xd6\x78\xf2\x17\x9d\x93\xfc\xa2\x25\x80\x3d\x5b\x87\x99\x7a\xd6\xe3\x60\xdd\x97\xb4\xd0\x9d\x59\x66\x3f\xc0\x8b\x4a\xab\xdb\xc9\x4d\x97\xc6\x78\xcb\xca\x0a\xd3\x55\x99\x19\x72\x13\x1d\xc7\xc6\x73\xb3\xcd\xb6\x71\x34\x09\xd8\x78\xb2\xca\xa4\x36\xd4\x8f\x79\xc6\x00\x93\x14\x1c\xaf\xfd\x55\x67\x19\xf7\xf6\xfe\xa2\x76\x06\x17\x49\xb8\xff\xf4\xab\xe3\x02\x7d\x8e\x4d\xdf\x49\x40\x31\xc1\x14\xf8\xd8\x57\x36\xb0\x99\x4d\xa9\xf4\x14\x02\x9c\x49\xaa\x90\x40\x4a\x48\x21\x81\xa4\x84\x08\x84\x6d\x97\xba\x1c\x00\xe0\x73\x66\x3b\xb6\xe7\x02\xa1\xae\xe1\xe2\xb2\xe5\x63\xc0\xc1\xc5\x38\xea\xb1\xf5\xf0\x5b\x7c\x48\x4a\x2c\xdf\xcc\xbb\x6f\xdd\xd7\xa3\xf1\x6a\x19\x26\xb7\xb1\x49\x62\x38\xae\x8f\x54\x36\x63\xd7\x49\x58\x08\x87\xb9\x44\xdd\xca\x66\xd9\xda\x75\xb5\x24\xb6\xa7\x53\x37\x51\xdc\xaa\x94\x6e\xa3\x1e\x9b\xa7\xd3\xa2\xe3\x18\x31\x68\x58\xc2\xd6\xe2\xad\x58\x69\xbd\x28\xca\xf6\x16\xcd\xe4\x70\x9d\x1e\x15\xea\xe1\xc1\x18\xf7\xb8\x38\xc9\x2f\xbc\xd4\x0c\x2c\x96\x5e\x7f\x81\x14\x24\xed\x42\xdb\x6c\xc5\x82\x51\x3f\x09\xb2\x9d\xb4\x1c\x46\x65\x17\x88\xb4\xd3\x1f\xb5\x67\x52\xdf\xb6\xb7\x8b\xb1\xd6\x0c\xb6\x7e\xbc\x39\xec\x4a\x39\xca\x54\x17\xbc\x41\x33\x70\xbb\x1c\xf7\x1b\x15\x94\x48\xc1\xf9\x24\xae\xe7\x57\x8b\xc4\xde\x5f\x94\xcf\xe0\x22\x61\xed\x3f\xfd\xea\xb8\x80\x9f\x63\xd3\x77\x0e\x74\xb9\xc7\xa1\xad\x1c\x5b\x70\xe0\x40\x86\x1c\x80\x90\x8b\xa1\xed\x29\x07\x31\x06\x89\x62\x3b\x3b\x95\x48\x30\xc2\x6d\xe8\x48\x97\x39\x2e\x85\xb6\x63\x0b\xec\x01\xef\x1a\x2e\x2e\xee\x77\x93\x1d\xd7\x97\xbd\xc9\x43\xeb\xc3\x8f\x47\x22\x20\xdf\xcc\xbb\x6f\xdd\xd7\xe3\x99\x0c\x5c\x4f\xa7\x93\x4c\x62\xdd\x9a\x6a\xc1\x6a\x3d\x55\xb3\x61\xab\x46\x7b\xf1\x55\x3f\x6c\x67\x42\x67\x94\x5e\xa6\xd2\xd3\x49\x12\x98\x73\xb4\xcc\x55\x33\xb3\xfc\xc6\xc8\x78\xf5\x44\x26\xd6\x99\x01\x17\xd7\x62\xaa\x9c\x9f\xd8\x0d\x4b\xe9\x51\xd2\xdb\xa0\xce\x3c\xba\x38\x89\xa3\x3a\x27\xf9\x45\x5a\x16\x96\x2a\x14\xf9\xa2\x11\x9f\x2d\xaa\xcd\xf5\xda\x9e\xda\x7e\xab\xbc\xcd\xe4\x07\x93\x55\xb7\xd9\x98\xbb\x56\x6f\x3c\xac\x16\xdd\x68\x31\x1e\x1d\xab\x85\x59\x9a\xb5\x06\xbe\xca\x9a\xb1\x78\x19\x47\xd7\xc5\x72\x9b\x7b\x31\xa7\x1e\x9b\x8f\x72\x9d\x82\x3e\x6e\xfa\xa3\xca\x90\xec\x71\x61\x9c\xc1\x85\x36\xdf\x7f\xfa\xd5\x71\x01\x3e\xc7\xa6\xef\x80\xe7\x0a\x06\x81\x72\x19\x91\x8a\x43\xe1\x11\x0a\x04\x76\x98\x84\x80\x42\x8a\x1d\xca\x84\x74\x94\xcb\x38\x41\xdc\xe6\x08\x50\xe1\x48\x4c\xb9\x52\x0e\xb0\x5d\x65\xbb\xd7\x70\x71\x71\xbf\x9b\x50\x0e\xe9\x65\xd4\x3c\xb4\x3e\xfc\xda\x29\x11\xe0\xcd\xbc\xfb\xe6\x7d\x3d\x9c\x6d\x95\x79\xba\xa2\xdc\x16\x4c\x25\x92\xf3\xb1\x9e\x4a\x55\xe7\x8d\xc0\xe1\x69\x2f\xa1\x46\xd9\x54\x40\xcd\x26\x9f\x26\x66\x6c\x16\x00\xa7\x3a\x8b\x3b\x15\x2f\x59\x4c\x85\xdd\xe8\x86\xfa\xc2\x1d\xe0\x79\x74\x58\x68\xfb\xdb\x69\x37\x93\x8e\x31\x67\x1d\x1f\x58\xd0\x38\xc1\xc5\xc9\xbc\x2a\xb4\x35\x6a\x8d\x3a\x0a\xfd\xf5\xba\x92\xab\x79\xa0\xdb\xd1\xc7\x8d\xa8\xd7\x8f\x1a\x14\xe0\x9a\xd9\x9d\x4d\x9a\x85\x7c\x01\x54\x8d\xce\x74\x6a\x8f\xa3\x46\xdb\x2d\xe5\x4b\xbc\x31\xf0\x8c\x59\x9c\x6d\xa7\x31\x21\x51\xd6\x5d\x05\xcd\xa1\xe6\x32\xab\x68\x52\x97\xc7\x92\x7b\x5c\x64\x5f\xe3\xa2\x18\xcb\xed\x3f\xfd\xe2\xb8\x20\xf2\x73\x6c\xfa\x8e\x40\x87\x42\xa1\x1c\x4c\x39\x86\x0c\x79\x8e\x8d\x25\x11\xd2\xa3\x8a\x4b\x17\xba\x80\x28\xc5\x5c\xe6\x01\xe1\x42\x89\x21\x74\xa8\xe3\x73\x4f\x3a\xc2\x97\xb6\x0d\xb9\xb7\x33\xfd\xc3\x7d\xa2\x33\xb8\xb8\xb8\xa3\x4d\x38\x02\xf8\xed\xd6\xc3\xaf\xdc\x62\xc9\x29\x78\x23\xef\x66\xf2\xe6\x7d\xbd\x34\x4c\x17\x67\xd0\x5d\xb7\xe6\x8b\xde\x20\x3b\xaa\x53\xba\x72\xe3\x45\x3a\x73\xca\xbd\x78\x7f\x9d\x86\x4b\x8c\x9c\x1e\x9d\x74\xfd\x86\xaa\x5b\xa9\x68\x2a\x68\xc0\xf2\xc0\x8d\xe2\x05\x1c\xc6\xdd\xb6\x20\xb5\x82\xe5\x85\x38\xea\x56\x43\x42\x5b\x56\x2e\x59\x8c\x96\x2a\x64\x3f\x8f\x3b\x5c\xf8\x27\xf9\xc5\xac\x52\x2c\xc4\xa3\xa9\x2e\x2f\x65\x61\xdc\x1b\x6a\xd1\xd1\x60\x4d\x93\x9e\x6a\x56\xb4\x76\x8b\x17\x47\x9b\x8c\xbb\xd8\x28\x43\x1f\xe6\x34\xec\xf4\x09\x5c\xcd\xa7\x1b\x23\x86\x07\x9d\xee\x48\xd3\xea\xa3\x52\x2c\x88\xef\x04\x03\x93\xec\x3c\xe9\x0f\xa3\xf3\x41\xb1\x61\xda\x7b\x5c\xe8\x67\x70\x21\x07\xfb\x4f\x57\x70\xf1\xdf\xf6\x77\x30\xad\x77\xe2\x42\x7c\x8e\x4d\xdf\x39\x44\x2a\x1b\x28\x07\xfa\x8a\x21\xe9\xbb\xc8\x95\x9e\x8f\x5c\xc9\x99\xe3\x4a\xc9\xa1\xaf\x3c\xe6\x7b\xc2\x43\x94\x2b\x57\x71\x2c\x14\xa1\x2e\xf6\x85\x64\xdc\x83\x94\xc9\x6b\xfe\xe2\xe2\x0e\x05\x11\x88\xa0\xcb\x71\x94\x40\xfb\x4d\xbf\x87\xdf\x2c\x06\x08\xbc\x91\x76\x33\x79\x73\x99\xb6\xa2\xc2\xe2\xcc\xa7\xc1\x48\x14\x72\x78\xb3\x69\xda\x62\xd8\xcc\x44\xe1\x12\x99\xb9\x26\x2f\xba\x84\xa6\x56\xb1\xa0\xe1\x5b\xf5\x31\xb3\x93\x0d\x5c\x28\x39\x8d\xf2\xa8\x5f\x9e\x68\x1b\xb3\xdd\xce\x0d\x92\x0d\xbb\xae\x15\x64\x7a\x58\xcf\x0f\x8c\xba\x93\x09\x6d\xad\xba\x79\x72\x17\xfe\x89\xbf\x28\x9b\x1d\xe2\x4e\x49\x32\xe4\x93\x45\x13\xe3\x90\x4c\x1d\xbb\x69\xf3\x68\x3c\xe9\x65\x5c\x51\x72\xaa\x7a\x33\xee\x2e\xca\x7a\xb5\x24\xa6\xd5\x8e\xeb\xf0\x11\xae\x35\xf5\x34\xb0\x97\x22\x58\x2c\xbb\xeb\xc6\x20\xd1\xce\xf9\x8c\x18\x89\x4c\x74\xbe\x6e\x75\xca\xcd\x7c\xa3\xb4\x1b\x38\xa9\x9d\x81\x05\x79\xf3\xd8\xe0\x7f\xdb\xdf\x87\xdc\x05\xff\x1c\x93\xbe\xe3\x80\x79\x92\x08\x9b\x51\x1b\x40\x4a\xa5\x8b\x31\x62\x04\x32\xa1\x24\xc4\x3e\x71\x88\x04\x00\x13\x49\x90\xcf\xa5\xad\x6c\xc9\x7c\x06\x99\x0d\xb0\x92\x02\x49\xee\xe2\x6b\xb0\xb8\xb8\xa1\x4d\x24\x85\xec\x72\x52\xbe\x6b\xdd\xa7\x17\xc7\x5f\xaf\x46\x12\xbe\x91\x76\x33\x79\x6b\x99\x16\xc7\xe7\x83\xec\x78\x10\xc6\xeb\xed\xd5\x36\xd7\x4f\x85\xcc\x2a\x81\x79\x4e\x4b\x56\x6a\x05\x3c\x5c\x4c\x1a\xb2\x6b\x77\x4a\xe3\xce\xd8\x4f\x42\xbd\xce\x60\x89\x86\x7a\x1a\xf6\xc6\x4b\x92\xb5\x63\x99\x5a\x27\x9d\x18\xe7\x57\xd5\x32\x69\x8f\x07\x99\xee\x9c\x87\x7c\xac\x71\x78\x00\xc3\x1e\x17\x27\xe9\x85\x28\x1a\x3c\x61\xf6\x06\xe1\xba\x31\x59\x0d\x6c\x7b\x34\x8c\xdb\x53\x6b\x3b\xb4\x75\xad\x57\x81\x56\xb5\xca\x93\x46\xbc\xd6\x8d\x15\x33\xc1\xd2\x68\x76\x03\x28\xba\xe9\xb5\xd6\xe2\x3c\x60\x5a\xa2\xaa\x4f\xec\x55\x52\x2c\x9b\xfd\x65\xb3\xd0\x8b\x6f\x95\x6a\x25\x3b\x89\x52\x75\x37\x7e\x42\x9c\xc1\x05\x7e\xf3\xd8\xe0\x7f\xdb\xdf\x87\x70\xc1\x3e\xc7\xa6\xef\x98\x14\x04\x28\x01\x7d\xc5\x15\x15\xc4\xb6\x3d\xe0\x23\xe4\xf9\xb6\x90\x4a\x71\xc6\x5d\x0f\x53\x44\x88\xe4\x94\x61\x45\x38\xb4\x7d\x61\xfb\x8c\x3b\x14\xfb\xc2\x23\x7c\x5f\x35\xba\xb0\x7d\x71\x79\x83\x82\x02\x46\xc9\xc5\xe4\xe3\xb1\xf5\xe1\x07\xd6\x29\x83\x27\x69\xf7\x8b\xbf\x6f\x11\xfe\x80\x81\xb7\x30\x81\x86\x7a\x32\xcc\x44\xfd\x41\x37\x3f\x2d\x8b\x00\xb3\x40\x51\xe4\x9b\x66\xc5\xca\x79\x8d\x52\xdf\xb5\xa3\x79\x39\x9a\x57\xa3\xa6\xb5\xd6\x3a\xd5\x6c\xa9\x90\x2e\x6e\x46\x8b\x72\xa7\xd8\xdc\x0e\x9b\xe5\xf6\xb4\xb0\x49\x57\xb5\x74\x36\xd9\x28\x66\x72\x56\x39\x37\xa9\xf9\x8e\x16\xd4\xf6\x73\xb8\xc7\xc4\xc9\x9c\x76\xfb\xad\x4e\xb5\x55\x4f\xf9\x81\xb9\xde\xac\xda\xa9\x4d\xbe\xd6\x63\xd3\x9a\xb2\x08\xaa\x58\x5b\x73\x5b\x1c\xd9\xb3\x4e\x3d\xd6\x58\x24\x97\xf3\x95\xd9\xb7\x1d\xaf\x1c\x9d\x77\xda\x8a\xe0\xcc\xbc\xa9\xcf\x12\x4e\x59\x76\x1a\xc5\x85\xd5\x64\x05\xea\x2e\x8b\xa2\xbd\x8a\x5b\xe3\x3d\x26\x88\x49\x0a\xf6\x76\x8c\x4e\x00\x18\x9f\xb7\x5e\x98\xd4\x1f\x01\x13\xe8\xdd\x98\xa0\x9f\x63\xcf\x77\x54\x29\x1f\x02\xc6\x6d\xe0\x3b\x9e\x43\x20\x46\x50\x11\x8e\x6c\xe8\x42\xe2\x2b\xcf\xa5\x14\x7b\x10\x53\xbc\x5b\xbf\x3d\x65\x13\xdf\xf3\x30\x94\x1e\x70\x6d\xee\x21\xdb\xbf\x76\xc4\x1c\x5e\x2c\xc2\x52\x28\x28\xb9\x98\x72\x3f\xb6\x1e\x7f\x66\x1e\x09\x8c\xc0\x15\x4c\x30\x71\x23\x26\x20\x5f\xea\x69\xd5\x89\xca\x79\xdc\xe8\xd2\x4c\xbe\xbb\xaa\xc5\xe6\xeb\x7a\xc9\x32\xab\x03\xcb\x51\xe3\x12\xae\xa6\xbd\x64\xde\xaf\x4c\x49\x3f\x9d\xc8\x64\x46\x1a\xcb\x17\xbd\xb0\xe4\x56\x96\x63\x66\xad\xbb\x7d\xd4\xad\x59\x83\x74\x0a\xd6\x4b\x28\xac\xd4\xcd\x78\x3f\x99\x95\xee\x7e\x0e\x77\x98\x50\x27\x69\x05\x9a\x45\x5b\x1e\x66\xe9\x5a\x7c\x98\x9a\x26\x46\x62\xb4\xde\x5a\x38\xcd\xd3\x2c\x3e\x68\xac\x92\xbd\x46\x76\x59\x59\x94\xd7\x69\x23\x9b\x68\x49\x64\xf5\x9a\x34\xe9\x14\xd7\xad\x6e\xce\x30\x62\x7a\xd9\x85\xe1\x24\xbd\x02\x9d\x59\xca\x99\x4f\x66\xc5\x66\xbc\x57\x28\xd4\xa5\xde\xdc\x0b\x01\xce\x60\x62\x52\x7e\x61\x52\x7f\x04\x4c\xbc\xdf\x4f\x90\xcf\xb1\xe7\x3b\x42\x80\xb4\x05\x87\x1e\xdd\x2d\xcf\xc0\x61\x36\xb0\x19\x06\x10\x33\x25\x80\xeb\x21\x2a\x6d\x8c\xb1\x6b\x53\x8a\x00\xf6\x1c\x48\x89\xf0\x30\xa4\x3e\x94\xca\x27\x36\xbd\x5a\x86\xba\xb8\xcd\x4d\x91\x90\x57\x10\xf3\xd0\x0a\x85\x90\x5c\x50\x06\x01\x22\xd7\x30\xc1\x6f\xc4\x04\x28\xe7\x26\x99\x4c\xbd\x96\xae\x15\xec\xce\xb8\xa7\x55\x9d\x30\x69\xe6\xda\xe1\xb6\x94\xaf\x57\x34\x39\xab\x57\x4c\xa3\x2e\xda\x1c\x8c\xdd\x69\xb8\xaa\x79\x79\x6b\xab\xc5\xda\x56\xdf\x53\xa1\x48\x2f\xd0\xa4\x4e\xaa\xdd\x1a\x64\x9e\x1c\x0b\x93\x93\x8c\x3d\x5a\xd0\xda\x6c\xb6\x9f\xc3\x3d\x26\x4e\x72\x8a\x46\xc3\x85\xe3\x56\xb7\xde\xb0\x42\x3d\x67\xb3\xb4\x9b\xc9\xce\xec\x1e\xdc\xcc\xd6\x59\x92\x28\x47\xe3\x6e\x6e\x12\xa4\x1b\x78\xd5\x1b\xe6\xa2\x4b\x3f\x65\x15\x02\x9a\x43\x41\xd2\x68\x9a\xd5\xc6\xc4\x1c\x8e\xfc\xb9\xd8\x66\x52\x45\xc2\x48\xab\x93\x6b\x57\xf9\xc2\x01\x93\xe9\xde\x4f\xac\xce\x60\x22\x9c\xbd\x30\xa9\x5f\x13\x13\xf8\x73\xec\xf9\xce\x96\xcc\x75\x7c\xe9\x63\x17\x79\xd8\xa5\xcc\xf1\x20\x71\x08\xa0\x00\x11\x66\x53\x85\xa5\xa2\x12\x01\x1b\x01\xa8\xa4\xc7\x98\x4b\x80\xe3\x52\xdb\x66\x82\x0b\xe4\x2b\x7a\x2d\xa7\xb8\xbc\x29\x41\x09\x44\x57\x62\xa7\x87\x56\x28\x08\x13\x98\x4a\xcc\x91\xb8\x86\x09\x76\x23\x26\xd8\x60\xb6\xa4\x42\x14\xaa\xeb\xc6\xd2\xaa\x80\x78\x39\x97\x1e\xab\xa2\x6a\x54\x12\x81\xa6\x46\x0d\x47\x4f\x88\xc6\xc4\xce\x74\x96\xb4\xda\x36\x2b\x9b\x6e\x33\xe9\xe7\xf5\x4d\x8d\xf5\xfa\x60\x28\x46\x6b\x4d\x67\xa5\x44\xce\x4e\xaf\xb5\xb0\xb8\x9a\x2c\x5d\xad\x62\xcc\x6a\x27\xe5\x27\x75\x62\xa6\xb2\x80\x56\x93\xb8\x3d\x14\xeb\x35\xd3\x8d\x41\x19\xaa\x98\xc5\x73\xa5\x6e\x7f\x96\x9b\xa4\xc2\x76\x72\x98\x4f\xb9\xa9\xf8\xca\xc7\xeb\xc4\xca\x45\xb9\xc2\x20\xcc\x6e\xc7\xf3\x56\x37\x34\x13\x3c\x03\x8a\xf9\xa4\x4a\xca\x70\xd5\xd6\xfa\x34\x6b\x8f\x46\x53\xd5\x9b\x82\xa2\xb6\xf3\x43\x89\xd9\x19\x4c\x8c\xb2\x2f\x4c\xea\xd7\xc4\x04\xfa\x1c\x7b\xbe\x43\xc8\x01\xcc\x21\x40\x12\xc2\x5c\xe8\x03\x17\x71\x61\xfb\xc0\x55\x90\xda\x9e\x94\x8c\xee\xbc\x90\x8f\xa0\x64\x36\x75\x7c\xe5\x29\x8f\x32\x8f\x49\x0f\x33\xce\xa5\x2b\xaf\x6d\xe3\x81\x8b\x99\x34\xa5\x48\x5c\xce\xc2\x1f\x5b\xa1\x00\x58\x08\x86\x18\xc1\xe8\x1a\x26\xe8\x8d\x98\xd8\xe4\x57\x36\x48\xd4\xac\x59\x66\xb5\x1a\x05\xcb\x64\x31\x65\xa3\x76\xbb\x19\x96\x44\x77\x30\x69\xc4\xb8\x82\x0d\x38\x06\xc8\xa3\x1b\x2f\x0b\xb7\x19\x7b\x1e\xad\x66\x2a\x41\x5a\xa4\x82\x5c\xab\xdb\x44\xd9\xde\xc4\x55\x2b\x63\x33\x19\x73\x95\x2d\x58\xf3\xc2\x7a\x30\xd1\xea\x87\xd2\xfe\x1e\x13\x27\x73\x4a\x86\xe5\xf5\x22\xbb\x49\xf7\x8d\x51\xcd\x1c\x4f\xd7\x21\x5c\x30\x07\x9b\xc5\x7c\xa7\x12\x4b\x4c\x2c\x0b\xf4\x65\x68\x94\x4b\x85\xc6\x4c\x44\xeb\x4c\x4c\x46\x09\x3b\x95\xd2\xd7\x24\x0f\x3b\x61\xc3\xc6\x56\x32\x23\xb2\xed\x59\x8b\x07\x28\xde\x6c\x54\x12\x46\x63\xb2\x1d\xaf\x77\x7e\x28\x11\x9e\xc1\xc4\xa0\xff\xc2\xa4\x7e\x4d\x4c\xc0\xcf\xb1\xe7\x3b\x9b\xf9\xd4\x71\x39\xf1\x6c\x49\x98\xe4\x40\x12\xe9\xba\xc2\xa6\xc2\xe1\xbe\x0b\x5c\x9b\x22\x5b\x32\xc4\x7d\x1b\xda\x84\xfa\xae\xeb\x53\xc6\x6d\x66\x7b\xc8\xc7\x10\xda\x12\x5c\xc9\xb1\xc1\xe5\x8c\x81\x11\x79\xf9\x6a\xde\x63\x2b\xe4\x0c\x48\xcc\xa8\x84\xf8\x5a\x8e\xcd\xc8\xad\x7e\xc2\x81\xcb\x4c\xd5\x1e\xa4\x07\xab\x41\x6e\x9b\x1d\xb7\xe6\xb1\x95\x31\xae\x4c\x1a\xb9\x58\x68\x5b\xfe\xb6\x54\x1f\x8d\x27\x60\x69\x58\x93\x72\xde\xdc\xb4\x9c\xe2\xaa\xc0\x2d\x27\xb0\x7b\xd9\xec\x48\xae\x42\xd8\xcc\x4e\xd6\xd3\x75\xbe\xd9\xad\xb8\x95\x5c\x7b\x31\xeb\x76\x46\xb0\x26\xf6\x73\xb8\xc3\x84\x77\x92\x4f\xe0\xb9\x5a\x67\x1a\x7d\xd5\x1c\xcc\xba\x62\x33\xa0\x28\xb7\xd5\xa1\xc1\xc7\x31\xb1\xd8\xf6\x31\x4b\x7a\x03\x67\xb9\xf2\x26\x8d\x15\x6c\x01\x5e\xcd\xcc\x42\x7d\x16\xe7\xb1\x95\xb0\xca\xbd\x1c\x01\x83\xb1\x41\xf3\x50\x77\xc2\x84\xaa\x8a\x4d\xac\x17\x8b\xc5\x7a\x58\xb3\xf7\x98\xe8\x9f\xc1\xc4\x4b\x48\xfc\x21\x30\xf1\xfe\x1c\x1b\x7c\x8e\x3d\xdf\x39\x2e\xb6\xa9\x2d\x29\x16\x44\xf8\x0a\xb9\x0e\x61\xca\xe3\x54\xb9\xca\x51\xcc\xb1\x81\x74\x05\x65\x1e\xe1\x1e\xf3\x95\x0d\x10\x45\x08\x0b\x2a\x3c\xe1\xb9\xdc\xb6\xbd\xc3\x6d\x88\x4b\x98\xb8\x1c\x1d\x09\x80\x2f\x6f\x7a\x3f\xb6\x1e\xde\x0d\xc2\x24\x14\xe4\x6a\x8e\x8d\x6e\xc4\x04\x5f\xb1\xc6\xb8\x46\x2a\x25\x32\x9b\xa7\x79\xb3\x39\x63\x51\x9b\x25\xdc\x6e\x03\x66\xe0\x92\x75\x72\x95\x2c\x69\x98\x3d\x57\x4d\x50\x3d\x16\x8c\xb2\x2a\x9d\x4b\x4d\xeb\xd0\xaa\xd7\xa2\xeb\xf1\x34\xdb\xb6\x32\x22\x5f\xb7\xb3\x9c\x0c\x62\x55\x6d\x1e\x8d\x4d\x73\x2a\x93\xa3\x4f\x7e\xc2\x3b\xcd\x27\x72\x83\x50\xf2\xa9\x5f\xee\xf5\xb2\xe6\x42\xd3\xfb\x2a\x51\x74\xb0\xb5\x1a\x30\xb3\x55\xeb\x4b\xda\xb4\x19\x36\x5d\x50\x4b\x2c\x21\xa8\xe1\xd9\xd8\x2c\x27\xc4\x90\x96\xeb\xf6\x00\x19\x0d\xc4\xcb\xa1\x28\xae\xe2\xda\x28\xb3\xe8\x8a\x95\xde\xc8\x1b\xdd\xd6\x3c\xbb\x1f\x3e\xd1\x39\x83\x89\x0e\x79\x61\x52\xbf\x24\x26\xb0\xfc\x1c\x7b\xbe\x73\x04\x92\xcc\x16\xd0\x75\xb0\x4b\x98\x70\x09\xf7\x21\x00\x8c\x21\xdb\x75\x30\xe6\x0a\x32\x21\x18\xe4\x18\xb9\x0a\x41\xe8\x79\x9e\x8d\x01\x82\x02\x48\xa1\x04\x60\xee\xb5\xa3\x81\xe0\xb2\x27\x90\x88\x93\xcb\xd9\xc6\x43\x2b\x64\x9c\x02\xcc\x11\xa1\xe4\x6a\x8e\x7d\x6b\x2d\x96\x77\xc6\x76\x98\x29\x94\x74\xdb\xb0\x62\xba\xd6\x0e\xa6\x05\x03\x93\x46\x90\x4e\x6d\x0b\xc5\xac\x85\xbd\x70\x95\x6d\x25\x5a\x4c\x73\x8a\x99\x60\x59\x58\x6f\x4a\x22\x1b\x65\x7d\x92\x1b\xc7\x89\x86\x4b\xeb\x62\x7e\x66\xe9\xed\x9a\x31\xda\xb6\xe2\xa1\x36\xea\x88\xf6\x42\x3f\x5c\x10\x3d\x60\xe2\xc4\x4c\x2b\x2a\x13\x9f\x2e\x92\x1d\xb3\x94\x73\x64\xdf\x77\x73\x75\x63\x93\xe8\xb0\xa1\x72\x40\x3f\x5c\x52\xaf\x21\x8b\x7d\xa1\xeb\x6a\x8c\x1c\x1d\x56\x7b\xdc\x9a\x24\x61\x0c\x94\x59\x34\x03\x16\x46\xdf\xa8\x17\x57\x8d\xc6\xb4\x9a\x32\x7d\xdc\x12\x6e\x7d\x2b\xc3\x5e\x22\x07\xf7\x39\xb6\x7b\x06\x13\xa7\x1e\x6a\xff\xf7\x47\xc0\xc4\xbb\x63\x27\x2c\x3e\xc7\x9e\xef\x7c\x2c\x25\x83\x8a\x7b\x8a\x62\x00\xb0\xb7\x4b\xda\x05\xe2\x1c\x13\x0c\x24\x74\x19\x50\x50\xd9\x9e\xf2\x1d\x1b\x63\x04\x90\xa3\x80\xc0\x98\xb8\xb6\x62\x5c\x70\x47\xf9\xd7\xfc\xc4\xc5\xed\x6c\x06\x30\xbd\xe8\x26\x1e\x1a\x21\xc3\x08\x08\x4e\x39\x22\xd7\x32\x6c\x2a\x6f\x44\x44\xac\xd8\x6e\x29\x5f\xd5\x56\x9a\x1c\x86\x2a\xe1\x6d\xcb\xab\xbe\xdb\x2a\x66\x26\x78\xb9\xe8\x19\x9d\x7c\x34\x91\x34\x8d\xe9\x50\x65\x96\xcb\xa5\x57\x34\x9a\x6e\xbb\xbc\x44\x7e\xc2\x28\x8f\xea\x46\xcd\xcf\xc7\x73\xbc\x59\x49\x35\x9c\x4e\x3c\xb6\xd2\x71\x7c\xc6\xd5\x54\xf0\xc5\x61\x06\xf7\x88\x38\x99\x51\x33\x16\xf5\x12\xb3\x66\xa5\xee\x06\xe3\x5c\xa1\x49\xfd\x4a\x7d\x10\xf3\xe6\x49\x31\x4e\xa9\x68\xd0\x1e\xf9\x23\xb3\x8d\x3a\x7c\xd9\xec\xc5\x74\x27\x18\x83\x4d\x61\xd9\xb0\x44\x9b\x2f\xc6\x6e\xc9\x9c\x4e\x92\x4d\x55\x58\xd6\xd7\xed\x60\x1b\x27\xa0\x1b\xa0\x7e\x36\xe8\x8e\x46\xfb\xc8\xa9\x75\x06\x11\xae\xf1\xc2\xa0\xfe\x08\x88\x78\xbf\x97\xe0\x9f\x63\xcd\x77\xbe\x64\xd4\xa7\x8a\x33\x85\x3c\x9f\x4b\x22\x39\x55\xbb\x75\x59\x60\xe8\x48\xea\x08\xa6\x5c\x57\x72\x08\x7d\xee\x70\xdf\x81\x84\x78\xbe\x74\x5c\xdb\xc5\xae\xb0\xb9\x8d\xec\x6b\x5e\xe2\x62\x0e\xcd\x20\xa5\xf2\x62\x25\xf6\xb1\x15\x52\x21\x21\xe6\x42\x4a\x7a\x2d\xc3\xa6\xb7\x56\x62\x63\x83\x81\x54\xde\xa2\xe0\xab\xda\x00\xd2\x8d\xd5\x32\x9c\x81\xd3\x5d\x6c\x73\xae\x25\xb9\xcf\x53\x3a\xa6\xcb\xfc\x4a\x04\xa3\x70\xd2\x53\x4d\x7f\x46\x2d\x3b\x11\x1b\x57\x1c\xa3\x0c\x6a\x7d\xb3\x53\xcc\x4c\x58\x3e\x35\x4e\x0d\x27\x34\xb6\x2e\x75\xbb\x76\x6c\x92\x9d\x06\x87\x48\x7e\x87\x09\xf7\x64\xad\x2e\x15\x2d\x67\xb1\xcc\x98\x66\xca\x9f\x55\x2a\x43\xcf\x9b\x0c\x6b\x25\x91\xea\x8b\xa0\x21\x73\x0e\xdc\x94\x0b\xb1\x85\xbe\x69\xa5\x5d\xb4\xc8\xb6\x42\xcf\x31\xcb\xe9\x6a\x5a\x9b\x15\xaa\x78\x55\x4f\xcd\xb6\x8b\x72\x7c\xd3\x34\xc7\xa5\x3c\x9a\x95\x05\xe8\xe4\x3b\x5a\xc8\xac\xfd\x21\xd9\x44\xed\x0c\x26\xda\xfa\x0b\x93\xfa\x23\x60\xe2\xfd\x5e\x82\x7d\x8e\x3d\xdf\xf9\x40\x02\x46\xa9\x0f\x3c\xea\x2a\x45\x05\x46\x88\x7b\x00\x08\xe1\x3a\xdc\xf6\x91\xc3\x05\xf0\x99\xef\x49\xa8\x04\x66\x36\x81\x90\xdb\x8e\x03\xa1\x47\xb8\x74\xa8\xab\xe0\x35\x4c\x5c\xdc\xc5\x66\x98\x52\x71\x31\x72\xda\xb5\xee\x03\x27\x4a\x18\x14\x02\x21\x46\xaf\x25\xd8\xf4\xd6\x42\x6c\x2c\x51\x6e\xd7\x85\xd9\x2c\xd2\x96\x11\xf8\xe5\x44\x76\x83\xa7\x9b\x39\x49\xa2\x58\x3b\x13\x9a\x93\xb2\xa5\xa6\x33\x0b\x66\x86\x70\xdb\x9d\x13\xe0\x8e\x97\xcc\x4e\x98\xc3\x76\xd3\x1d\xf4\x40\x7a\x0c\x3b\x22\x56\xae\x3a\xd1\xa9\x3e\xdb\xf2\x22\x2b\x5b\x6a\xa9\x8f\xf9\xf8\x04\x12\x27\xc9\x44\x72\xcd\x17\xb8\x3a\x17\x12\x24\x93\x09\xad\x85\x4a\xb5\x10\x0f\xf2\x41\x0d\x1b\x78\xb4\x19\xb8\xd3\xc9\x70\x69\x0c\x52\x85\x4a\xd4\xd7\x47\x6b\x5f\x6f\xf4\x06\x4e\x52\x65\x3d\x2f\xd9\x54\x89\x7c\x95\xcb\x5e\x48\xfc\xd5\xa6\x0e\x36\xc3\x92\xb6\x65\x31\xa8\x49\x92\xda\x5f\xb2\x4b\x94\xcf\x40\xa2\xd9\x79\x61\x51\xbf\x26\x24\xe8\xe7\x98\xf3\x9d\x02\x12\x50\xc7\x63\x90\x49\x2e\x20\x55\xdc\xf3\x04\xb0\x99\xcf\x6d\x4f\x28\x81\x01\xe7\x36\xc5\x80\xd8\x0e\x60\x02\x0a\x44\x15\xb5\x05\x02\x8e\xef\xb8\x2e\x44\x9e\x73\xb5\x10\x7b\xd9\x11\x10\x0a\x2f\xbf\x5d\xf0\xb1\x15\x52\x80\x77\xf9\x0f\xc5\xec\x5a\x82\x4d\x6f\x2d\xc4\x46\x13\xe5\x86\x6c\x35\x06\x24\xa5\x7c\xaf\x93\x77\xf0\xb4\xc5\x92\x71\x3c\xae\xc6\xf3\xb3\x74\xa7\x95\x53\x8d\x30\x5b\x88\x8a\x55\x05\xc9\xea\xb4\x51\xf3\x58\x91\x1b\xa4\x02\x7c\x25\x6a\xba\xeb\x75\x07\xee\xb0\xe5\x6e\x3c\x10\x0d\x9d\x8e\xed\x95\x7b\xad\xb6\x16\xab\xe5\x9f\x36\x27\xdc\x13\x33\xad\xe1\x41\xa3\x24\xfd\x6a\x25\x37\xb4\x46\x26\x2f\x8d\xcd\xb8\xdd\xb6\x5b\xdb\x20\xdd\x95\xcd\x3e\xca\xa2\xc1\x46\xeb\xb4\x6a\x9e\x39\x5b\xad\xcb\xd5\x79\xd6\xcc\xd0\x9a\xea\x8c\xbd\x22\x40\xfd\x76\xb8\x2d\xfa\x33\x16\xeb\xb5\xac\xd4\x78\x9d\x18\xb7\x3a\x7a\x75\xcb\x2a\x8a\xef\x43\x27\xe3\x0c\x26\xea\xe2\x85\x49\xfd\x9a\x98\x20\x9f\x63\xcf\x77\x14\x71\xec\x21\xc4\x7c\x6c\x7b\x92\x10\xcf\xe1\x42\x71\x02\x3c\xa4\x7c\xc8\x31\x13\x84\x42\xc9\x6d\x20\x85\x2f\x5c\x84\x5c\x64\x43\x9b\x40\x24\xb0\xf0\x90\x8f\x38\xbf\xf6\x0e\x03\x70\x71\x13\x9b\x51\x26\x2e\x6f\x62\x3f\xb6\x42\xc2\x00\x12\x42\x08\xc0\xae\x25\xd8\xf4\xd6\x42\x2c\xcc\x6d\x41\xe0\x6c\xa7\x6d\xcb\x9c\x13\x0a\x92\x15\xbe\x76\x51\x37\x95\x6e\x86\xb9\x1e\x59\x05\xab\x49\xba\xaf\x87\x45\xb3\xb0\xf1\x56\x9b\xb9\x99\xcb\x2d\xf2\x64\x61\x8d\xe3\x13\x53\x67\x49\x2d\x36\x5f\x25\xe6\xb3\x8d\xb1\x6a\xc6\xe2\x66\xaf\x9a\x47\x3d\xa8\x21\xb7\x30\x7e\x7a\xaf\x87\x7b\x32\xa7\x31\x47\x8f\x96\x54\xd9\x72\x5c\x63\x59\xc9\xfa\xe5\x8d\xdd\xac\x34\x9a\x7a\x67\x1b\xe7\xb6\xb3\x9a\x2a\xb3\x5e\x56\xad\x56\xb6\xbb\x0a\xda\xa0\x3d\x59\xbb\xee\x66\xe3\xad\xf2\x41\x67\x51\xcf\x79\x4e\x36\xdd\xd6\xd3\x15\xa3\x2d\x65\xad\x5c\x68\x48\x2b\xbb\x29\x85\xae\x1b\x54\xf7\x42\x64\xcf\x60\xa2\xf6\x47\x3c\xec\xf4\x7e\x4c\xe0\xcf\xb1\xe7\x3b\x40\x15\xe7\xae\x23\x19\x60\xc0\x75\xa0\x43\x09\xe6\x84\xfa\x42\xf8\x0a\x33\x85\x11\x61\x0e\xa1\x0e\x62\xb6\x54\x8a\x4a\xee\x43\x49\x7c\xcf\xdf\xe5\x27\x12\x52\xdb\xbd\x7c\x4f\x9b\x7e\xa7\x97\x83\x23\x46\x29\xbd\xb8\x9d\xf7\xd8\x0a\x09\xe4\x18\x4b\x04\x38\xbb\x9a\x62\xe3\x1b\x31\xb1\x6a\x8e\xfc\xc2\xa0\xd3\x32\x66\x4e\x3d\xe9\xa5\xa2\xd9\x58\xcf\xe9\xe5\xd2\xf3\xd4\x6c\x38\x51\xb4\xed\xaf\x07\x25\xcc\x8c\x4d\xbf\x3e\x4d\x2f\x94\x91\x5e\xe5\x6b\x1b\xbc\xf5\x12\x39\xdd\x71\x47\x85\xd1\x3a\x6c\xeb\x35\x5c\xa7\xd2\x6e\x4d\x79\x74\xe2\xf8\x46\x00\x92\xab\xd1\xd3\xa1\x58\xe7\x24\x9d\xc8\x78\x25\x31\x8f\xc7\xe7\x63\xb5\x29\x08\x29\xe7\x85\xd2\xc8\xf4\xec\x49\x2d\xcc\x58\x8d\x61\x26\xdf\xcb\x8b\x61\xe8\x4c\x09\x44\x2b\x3d\xeb\xf5\xea\x6e\xc6\xc1\xf5\x5c\xb7\xac\xcd\x17\x23\xb3\xd4\xeb\x8e\xbb\xfd\x8a\xdf\x8d\x76\xfb\xa4\xef\xc6\x57\x7d\x32\xf7\x4b\x32\x60\xfb\x4d\x6c\xfd\x0c\x26\x2a\x2f\x2f\x04\xfd\x9a\x98\x40\x9f\x63\xcf\x77\xbe\x82\x18\x33\xe6\x12\x97\x62\x17\x10\x9b\x51\xe5\x12\xaa\xa8\xe7\x71\x4a\x80\x87\x31\xb2\x85\x8b\x05\xa1\xcc\xe7\xd0\x26\xcc\x11\xee\x0e\x68\xc2\x67\x90\x41\xe2\xe0\x8b\x45\x27\xfa\xfd\x8a\xd5\x73\x8e\xf8\xe5\x04\xfc\xa1\x15\x62\x4e\xb0\x90\x14\x13\x7e\x35\xc5\xbe\x75\x73\x22\x46\xaa\xe6\x70\x6d\xd4\x44\x3c\xdf\x56\xeb\x14\xf5\x20\x2c\x9b\xc6\x66\x62\x14\xf5\xfa\xd2\xb5\xad\x69\x2f\x3e\x60\x3d\x94\xea\x56\xb6\x8e\xb7\x5e\x3b\x7e\x2a\x59\x8f\xce\x02\xa6\xa5\xad\x65\x81\xce\xa2\x61\xdd\x9d\xb5\x44\x7b\xd5\x4f\xd1\x7e\x41\xea\xf1\xcd\x38\xe0\xfd\xa7\x0d\x3b\xe7\x24\xaa\x47\xdb\x24\xe5\x1e\x0a\x6b\x2b\x54\x60\xc3\xc5\x74\x3e\x8c\x85\x0a\x25\x7b\x2c\xb5\xd8\xc6\x9b\xa3\xfa\x90\x0f\x78\x26\x4c\xce\x8c\xda\xd6\x9c\xb4\x9c\xb6\xea\x35\x86\xcb\x95\x45\x48\xaa\x5e\x2e\x39\x46\xd6\x5b\x20\xa7\x97\x61\xfd\x26\xce\xe6\x78\xa2\x1b\x90\xd6\xb0\xb3\xd8\xc7\x4e\xda\x19\x4c\x58\x7f\xc4\x03\x80\xef\x2f\x3b\xc1\xcf\xb1\xe7\x3b\x4e\x81\xaf\x3c\x7f\xff\x52\x66\xac\x28\x10\x04\x71\x8f\xbb\xcc\x87\x36\x86\x3e\xc0\xc8\xf5\x7d\x4f\x38\x14\x62\x65\x3b\xc8\x77\x6d\xec\x12\x81\x38\xc1\xae\x44\x0a\xb2\xcb\x07\x00\xe9\xf7\xcb\x37\x4d\x99\xdc\x79\x80\x37\x5b\x21\xc6\x90\x60\x29\x18\xe4\x57\x73\xec\x5b\x37\x27\x70\xad\xc4\xfd\x20\xde\xaf\xd2\x72\x37\xe1\x37\xd7\xcb\x74\x2f\xb3\x32\x66\x31\x19\x40\x3d\x3a\xd9\xc4\xf2\x25\xbd\x33\x2a\x8b\xfe\x22\x35\x73\xb3\x93\xfa\xb0\xb7\x59\x4e\xb2\x03\x27\xe5\x0d\x87\x89\x99\x5b\xcd\xac\x16\x29\xb8\xf6\x63\x10\x89\xfc\x30\x1c\xc7\x0b\x46\xb9\x61\x4e\x9e\x2e\x15\x39\xa7\x97\x27\xd2\xc3\x36\x1a\x76\xd3\x8d\x52\xc2\x6d\x68\x1e\x1c\xd7\x64\x25\x9e\x6b\xfa\xaa\x37\x4f\xf2\x54\x51\x0f\x0b\x49\x16\xa6\x66\xd5\xe2\x92\x18\xf9\x46\xd6\x5c\xd6\xb6\xfd\x64\xa0\x9b\xa3\xad\xa1\xcd\xe0\x60\x99\x11\x7a\xa0\x37\x72\xb6\xb5\x9a\xe6\xac\xa5\x09\x5a\x0b\x6b\xb9\xdd\x0d\x1c\x17\x67\x30\x51\xfc\xdf\xc3\x4e\x3b\x4c\x80\xcf\xb1\xe7\x3b\x89\x99\x0b\x15\xf4\x81\xe3\x43\xdb\x97\x0c\x0b\xa0\x1c\x20\x15\x95\x8a\x22\xe8\x51\x85\x3d\xcf\xc3\x1c\x78\x08\xfa\x3e\xf1\x3d\x68\x03\x69\x3b\x10\x61\x9b\xb8\xbe\x63\x5f\x2e\xc5\xd2\xef\x97\xf7\x1f\x38\x10\x44\x5c\xcc\x27\x1e\x5b\x8f\xbf\xb9\x00\x77\x19\xc5\x15\x4c\x90\x5b\xb7\x27\xa8\x39\xcb\x74\x45\x41\xd8\xd1\x46\x51\x63\xab\xd1\x60\x34\xc8\x7a\xcd\x1e\xf6\xcc\x15\xe8\xc6\x40\xcc\x0a\x73\x93\x75\x96\x55\x4b\x8b\x49\x7f\x5b\x6c\x6e\xe9\xd0\x47\x85\x4e\x6b\x64\x87\xda\xbc\xb9\x36\xdb\x85\x7e\xb4\xe6\x57\x45\xcb\x92\xa8\xec\xc8\x36\x6f\x95\x9c\x02\x3e\xec\x0c\xec\x31\x71\x32\xa7\xb0\xd7\x2c\xd8\x61\x3e\x96\x2d\x4e\xf2\x66\xbd\x1f\x38\xc8\x35\x0b\xd3\xde\x40\xaf\x66\x9a\xe3\xf6\xc0\xcd\x91\x78\xaa\x55\x14\x8e\x81\x87\xd6\x76\x32\x6e\xf8\x9d\xe5\x9a\x8f\x7c\x2a\xb8\xb7\xee\xe5\x5a\x75\x73\xd8\xb1\x06\xbe\x9f\xd3\xb7\x8d\x64\xbc\xb3\xea\xfa\xb9\x61\xa7\xb6\x83\x5f\xfc\xdc\xe5\x09\xe3\x7f\x0f\x3b\x55\x22\x7f\x41\xf2\x73\xec\xf9\xce\x85\x84\x50\x49\x11\xf2\x15\x41\x0a\x79\x10\x38\x48\xda\x98\x03\xc7\x51\x8e\xbd\x83\x13\xb1\x95\x22\x48\x22\x81\x3c\x47\x11\x22\x08\x12\x98\x7a\xd0\x21\x04\x33\x76\xf9\x50\x2c\xfd\x4e\x2f\x6e\x62\x73\x28\x08\xb9\x58\xa8\x7d\x6c\x85\x88\x50\x4a\x00\x85\x54\x5c\xcb\xb1\xc9\xad\x97\x27\x44\x4a\x6f\xd4\xb3\x4b\x9a\x20\x73\xbd\x90\xb7\xcd\xd5\x22\xba\x18\xe8\xd1\xca\x82\x26\xfa\x61\xc1\xa1\x7a\x37\xd1\x81\xc0\xb1\x92\xed\x9e\x91\x49\xce\x86\xb9\xb0\x3a\xde\xf8\xc6\x14\x8c\x78\xdb\xea\xc1\xd2\xbc\xde\x72\x83\x55\x85\xa6\x10\x8d\x29\xa7\x4e\xf3\xc3\x52\x66\xf3\x94\x63\xdb\x27\xf9\x84\x63\x27\x92\xc4\x72\x7c\x7d\x52\x99\x66\xa3\x93\x71\x76\xb3\xdd\xd6\x6a\x51\xa7\xd5\x32\x72\x33\x6b\x85\xc7\x19\x77\x98\x59\x95\xa7\x4b\x5b\x0b\x32\xb5\xad\x5e\x71\xf8\x70\xdd\xe8\x38\x6c\x9a\x94\x41\xd4\x59\xb6\x6c\xaf\xd7\x5d\x1b\x56\x3a\xa6\xd6\x61\xb2\x31\x16\xb1\xb0\xb6\x7f\x2d\x42\xfc\xdc\xe5\x89\xc2\x4b\x93\xfa\x35\x31\x21\x3e\xc7\x9e\xef\x24\x40\x0e\xf0\xa9\x82\x4a\x51\xc0\x1c\xe9\x4b\x8f\x09\xa1\x08\x23\x8c\x63\xc7\xb3\x91\x6f\xdb\x80\x32\xc1\x99\xeb\xf9\x0a\xd8\x2e\xa2\x40\xf9\xd4\x95\x9e\x0f\x6c\x61\xef\x5c\x01\xdf\xff\x77\x06\x13\x17\x37\xb1\x39\x92\x57\xde\x9d\xf9\xd8\x0a\x11\x40\x54\xee\xdc\x9f\xb8\x96\x63\x93\x5b\xb7\xec\xa8\x36\x4d\x42\xa2\x68\xd9\xa6\x51\xcf\xce\xd2\xb4\x35\x2a\xca\x70\x39\xe9\xd4\x43\x6f\x86\xa3\x89\x59\xae\xcc\xe1\xc6\x13\xf9\x60\x38\x32\x93\xab\x42\x2b\xa3\x78\x27\x9b\x69\x19\x9b\x75\x2b\x68\x94\x0a\x4c\xf3\xc6\xc5\x61\x31\x9d\xb0\xb2\xe6\xb0\xe4\xea\xcb\x61\x7c\x44\x9f\xde\x3f\x6e\x9f\xbe\xef\xa9\x1c\xab\x92\x4d\xce\xcc\x8f\x64\x37\xc8\x85\xd5\xc5\x3a\x39\x33\x1d\x4f\x06\x8e\xd5\xf0\x51\xd7\xcc\xe4\xba\xb3\x60\x12\xcf\x37\x92\xd0\x99\x0f\x66\x41\x43\x33\xd7\x13\xbd\x8d\x6b\xf1\x3c\xca\xce\x16\xad\x94\x41\x6c\x26\xa6\x45\xab\xbc\x5a\x78\xaa\x3d\x8b\xe7\xe1\xa2\xbe\x83\x41\xfc\xdc\xe5\x89\x9c\xfb\xc2\xa4\xfe\x08\x98\xe0\xef\xc6\x04\xff\x1c\x7b\xbe\x93\x88\x2a\x22\x7c\x25\x5c\x0c\xa5\x42\xd8\x11\x14\x40\xe2\x79\x3e\x53\x98\x49\xe1\x39\xb6\x72\x20\x75\x3c\x41\x14\x50\x84\x60\xca\x20\xf1\x31\x44\xd4\x13\x84\x2b\xdb\xbf\xe6\x27\x2e\x66\x0c\x9c\x32\x7c\xf9\x92\xdd\xbe\x75\x5f\x77\x82\x54\x32\x02\x21\x93\xf2\x5a\x8e\x4d\x6e\xcd\x27\x68\x4e\x55\x4a\xcc\x30\xda\xa4\xb7\x48\x69\x35\xec\x3b\x3d\xbb\x85\x18\x5b\x37\x64\xb7\x98\xec\x97\x61\xab\x26\xd6\x39\xaf\x9b\x61\xcb\xf2\xc6\xcb\x65\x9b\xba\x36\x83\x8b\x62\x92\x65\xfb\x35\x63\x26\xd2\x83\xd1\xa6\x94\xac\xae\xad\x49\x68\xe5\x1b\x24\xb6\xea\xb4\xdb\xb6\xf9\x94\x4f\xd8\x27\x66\xda\x1f\xab\xa6\x67\x36\xfd\x61\x17\xea\xa3\x5a\x2f\xd1\xca\x1a\xca\xf1\xb6\x75\x51\x1a\x74\x12\x8a\xe5\x98\xca\x4d\x84\xe1\x90\x4a\xb3\x55\x35\x6a\xd2\xa2\x63\x27\x55\x8e\xc7\xc6\x5d\x7d\xbc\x0e\xd2\x81\x5b\xed\x0f\xe2\x7a\xb3\x56\x29\x37\x44\x73\x3a\xaf\x83\x8c\x8c\x9b\xd1\xdd\xc0\xf1\x33\x97\x27\xb4\xe8\xff\xee\xd9\xed\x30\xc1\x3e\xc7\x9e\xef\x7c\x4a\x5c\x00\x24\xf7\x08\x81\xbe\xcf\x99\x4b\x04\xf7\x88\x72\x1c\x28\x7c\xaa\xa8\x4f\x91\x4b\x6d\x0a\x5d\x5b\x32\x01\x80\xe3\x4b\x47\x40\x81\x24\xe5\x12\xd8\x98\x73\x71\xad\xee\x74\x39\x3a\x62\x5c\x90\xcb\x91\xd5\x43\x2b\x84\x90\x31\x09\x89\x64\xf2\x5a\x8e\x8d\x6f\x3e\xee\x54\x37\xb4\x9c\x5f\x2b\xfb\x12\xad\xb3\x7e\x8d\xf1\x74\xa9\x39\x90\x95\xb5\x5d\x73\x27\x8d\x8e\xb6\xa4\x8b\x78\x67\x5c\xa7\x89\x9e\x47\x8a\x4e\x7c\xe2\xaa\x99\xd8\x36\xdb\x5a\xcf\x2f\xa4\x6d\x2b\x6a\x78\xa0\x93\x59\x95\xea\xa4\x10\x35\x17\x5e\xa9\x53\x29\xe7\xbc\x99\x4e\x9f\xea\x4e\xf6\xc9\x9c\xa6\xab\x79\xb7\xe7\xd1\xf9\xcc\x1d\xa4\x70\x29\x3a\x9e\x27\x03\xc3\xab\x35\xc6\x02\xcf\x17\xad\x54\x74\x3b\xd0\x92\xe3\x68\x33\xda\x99\x47\x55\x7c\x00\x87\xed\x4e\x19\xf5\xe3\x9d\xe2\x20\x99\xc0\x1b\x83\xf4\x61\x33\x55\xe9\x77\xc4\x68\xae\xea\x39\x63\x1c\xcb\x77\x27\xc5\x4d\x03\xed\x63\xa7\x33\x97\x27\x34\xf1\x47\xdc\xb3\x7b\x77\xdd\x09\xd1\xcf\xb1\xe7\x3b\x8f\x43\x07\x22\xe4\xf8\x0e\x04\x0a\x42\x89\xa9\xe4\xb6\xeb\x13\xce\xa4\x2f\xa5\xc3\x21\x53\x5c\x2a\xee\x41\x65\xbb\xae\x8f\x10\xb5\x3d\x9f\xfa\x1e\xa3\xae\xa3\x94\xc2\xfc\x9a\x9f\xb8\x1c\x1d\x71\xc9\x2f\x1f\x0f\x7c\x6c\x85\x80\x63\x4e\xa0\x40\x04\x5c\xcb\xb1\xf1\xad\xb1\x93\x74\x1d\x3d\x58\x72\xbd\xa8\xb7\xcd\xb6\x9a\xc9\x8c\xed\x0f\x1d\xb7\x41\x29\x95\x99\xc9\xb6\x94\x1d\x4c\xfd\xa6\x6c\xbb\xcb\x05\xc1\x09\xea\xf5\x5a\x2b\x95\xe8\xfb\x0b\x47\xb5\x82\xcd\x54\x5b\xae\x07\xa5\xe1\xa2\x96\xe9\xac\x9d\x7e\x74\xdc\x6f\x12\x0a\x06\x4e\x50\x8b\x3f\xe5\x13\xed\x93\x7c\xc2\x90\x9d\x42\x3d\xb9\xec\xad\x8c\x45\xbd\x1d\x1d\xf5\xac\xde\x72\x69\xac\x07\xdd\xd0\xb3\x3a\xb1\x7a\x6e\xbc\xb0\xc7\x41\xc2\x01\x1b\x59\x49\xce\x1a\x59\x1d\xb4\xdb\xcd\x44\x8e\x23\x63\x66\xc7\x58\x6d\x5a\xf3\xaa\xc9\x7e\x74\x38\x31\x8d\x09\xca\xab\x76\x3d\x1f\xef\x79\xf3\xc3\xfe\x47\xfc\xcc\xe5\x09\x8d\xbe\xdc\x9f\xd8\x1f\x7f\xfa\x2f\xc7\xc4\xfb\xfd\x04\xf9\x1c\x7b\xbe\xf3\x80\x74\x11\xa7\x54\xd9\x18\x42\x20\x39\xe3\x1e\xb3\x77\xff\x71\x48\xa9\xeb\xfb\xd0\x61\x18\x28\xcf\x61\x98\x09\x9b\x38\x48\x00\xc7\x61\xc2\x53\x88\xb8\x48\x39\x0e\xb9\x86\x89\x8b\xfb\xd8\x5c\x42\x88\x2f\xee\xe8\x3d\xb6\x42\x80\x01\x97\x08\x52\x08\xae\xe5\xd8\xf8\xd6\xf3\x4e\x32\xe1\xe6\x60\x73\x62\x58\x89\x66\x5b\xda\x73\x7b\xee\xd6\x9b\x25\xe1\xb4\x56\xdc\x69\xa1\xa0\x3f\x0b\x13\xdc\x36\x49\x7f\xb5\x58\x00\xdc\x35\x98\xcb\x2a\x9b\x95\x66\x55\x46\x25\x07\xbb\xf3\x14\xf3\xc3\xba\xe7\x74\x36\xeb\xee\x38\x66\x91\xd8\x2c\xda\xd0\xa3\x73\x75\x78\xb5\xd2\x01\x13\x27\x11\x0c\xdc\x06\x19\xbb\xb7\x70\x92\xd3\x1e\xcc\x2e\xa8\x5e\x16\xad\x76\x1c\x91\xc4\x76\x88\xa4\x96\x2b\x79\x76\x6e\x34\x6b\xe2\xa8\x16\xf5\xeb\x38\xef\x7b\x2a\x98\xe4\x26\x9b\x4d\xd7\xef\x47\xf9\x70\xd5\xa8\xc5\xc1\xd4\x71\x96\x73\xb6\x61\x04\x74\x0b\x31\x67\x14\x96\x8c\xb6\xec\xec\x2f\x4a\x9c\xc1\x04\x79\xb9\x3f\xf1\x6b\x62\x02\x7f\x8e\x3d\xdf\x39\xc2\x13\xd0\x96\xc4\x75\xa5\xed\x42\xcf\xf5\xf6\x07\x09\xa9\x63\x2b\xc0\x04\xb0\x39\x61\x3e\x81\xb6\x23\x11\xf6\x94\x74\x98\x60\x14\x10\x84\x00\x96\xbe\xf0\x7c\xc2\xaf\xd5\x62\x2f\x5f\x8f\x10\x90\xa2\xcb\xb5\xd8\x7d\xeb\x2e\xee\x92\x82\x0b\x82\x08\x17\xe0\x5a\x8a\x8d\x6f\x3d\xee\xc4\x7b\xad\xf4\xb8\x6a\x0c\x67\x19\x17\xe6\x3c\xd5\x60\x24\xdd\xc9\x7b\x69\x19\x9f\xd0\xac\x64\x8e\x9d\xae\xe9\xd9\x4e\xd1\xef\xf9\x16\x2b\x96\x3a\x54\x0b\x83\x54\xad\x33\xc7\xe9\x34\x68\x14\x73\x53\x92\xc0\x39\xbb\x9c\x19\x72\xa3\x14\x2f\x07\x33\x2f\x41\xba\xfd\xed\xba\xf2\x14\x3a\xb5\x4f\x0c\x53\x2d\x58\xbb\xb0\x8d\x46\x55\x71\xd3\xc0\xb1\x4c\xa9\xc5\x20\x5b\x46\xc3\x14\x6a\x72\xca\x1a\x89\xaa\x48\x4b\xac\x8d\xbd\x4c\xe0\x87\xb3\x5a\x71\x9c\x70\xa2\xb3\xa2\xe3\x8e\x67\xdb\xd2\xbc\x24\xa3\x99\x0d\x30\x32\xc3\xed\xba\x3b\xde\x6a\xa5\xd8\xac\xaa\x55\xdd\xf2\x78\x94\xdf\x43\xe2\xcc\xdd\x09\x0d\xbd\x7c\x3f\x41\x52\xfb\x15\x21\x81\x3e\xc7\x9c\xef\xa0\xe2\x18\x31\xe6\x48\x17\x7a\x4c\x79\x82\x2a\x0f\x01\xc4\xc1\xfe\xbd\xfd\x04\x08\x48\x08\xf5\xa8\x8f\x00\x84\x42\x3a\xca\x71\x28\x47\xd0\x95\x0e\xa2\x8c\xfa\xc7\x6b\x3f\x97\x20\x71\x71\x1b\x5b\x20\x4e\x2e\x1f\x77\x7a\x6c\x95\x84\x08\x89\x04\xa0\xf0\x5a\x86\x8d\x6f\x3d\xed\xb4\xa6\xdb\xdc\x70\xe1\x66\x1a\xbc\xd5\x9c\x67\x13\x6e\x21\x93\x5b\x6b\x9d\x9a\xe5\x35\x37\x9a\x15\x38\x8c\xd7\x37\x99\xdc\x6c\xd0\xf6\xbd\x1c\x49\x6e\xb7\xcb\xba\x5f\xea\x29\xba\x4c\x30\xb7\xd3\x4d\xa4\xfc\x69\x7b\x65\x64\x0c\x3d\x69\xa4\xe0\xb8\xbb\x1a\xc7\xfa\xd9\xde\x22\xc6\x4f\x20\x71\x32\xa5\x40\x33\x82\x4d\x95\x24\x36\xc9\x42\x61\x69\x6f\x2a\x40\x1b\x96\x24\xef\xaa\x91\xec\xc1\x69\x3f\x3b\x0b\x5b\xca\x04\x41\x79\xda\x5b\x8c\x81\x5d\x4a\x79\x8b\x7a\x76\x96\x8b\x8e\xfc\xad\xcc\x9a\x89\x5c\x65\x4a\x85\x59\x2c\xad\x4b\x66\xb9\x9a\x6f\x4f\xaa\xd5\xd6\xb6\x42\xa3\xc5\x7d\xe4\x74\xe6\xf2\x84\x06\x5f\xee\xd8\x25\xb4\x5f\x11\x12\xf0\x73\xcc\xf9\x4e\x01\x57\x0a\x1b\x30\x85\x3d\x97\x70\x28\xb0\x4d\x04\xc0\xbe\x24\xdc\xf5\x00\xb0\x7d\x85\xb9\x27\x1c\x49\x3c\x17\x13\x4f\x11\x24\x6d\xcf\x23\xc0\xb7\xb9\x0b\xa5\xcb\xe0\xb5\x0c\xfb\x72\x5d\x49\x60\x01\xaf\x00\xe6\xa1\x55\x02\x28\x09\x86\x18\x5d\x7d\xdb\x19\xbe\xf5\xb0\x53\x34\x99\x0b\x3a\x4e\x0f\xeb\x6e\xab\xd8\xef\x24\xa3\x35\xdf\xd4\xf2\xb1\x9e\xdf\x5a\xd4\x70\xb2\xaa\xca\xe3\xa9\x57\x2e\x8d\x45\xda\x6d\xb5\x52\x21\x8f\xa6\x07\xf6\x0c\xf5\x82\x71\x98\x1e\xd8\x72\x39\x2d\x14\xf2\x20\x0c\xb5\xc0\xc8\xd2\x74\x59\x15\xfb\x85\x7a\x6c\xd1\x93\xee\x53\x32\xd1\x3a\xbd\x89\x5d\xd0\x46\x66\xaf\xb2\x1a\x16\x42\xc2\x49\xd8\x0b\x33\x9d\xcd\xcc\xef\x37\x87\x4a\xc5\xb3\x4d\xaf\xd3\x70\x36\xc5\xdc\xca\x19\xcd\xd6\xd1\x72\xcd\xb3\xf3\x25\x5f\x6b\xb6\xba\x9b\x65\x7f\x9b\x2f\xe7\xf5\x68\xb5\xe5\x74\xb1\x67\xf4\x84\xdb\x04\x9d\xb9\x0f\xa2\xc5\xb0\x3a\xdf\xff\x40\x6a\xfc\xcc\xdd\x09\x6d\xfb\x72\xc3\xee\x8f\x00\x89\xf7\x27\xd8\xe0\x73\xcc\xf9\xce\x55\xd0\xf5\xb8\x6d\x3b\x40\x21\x64\x43\x25\xa0\x2b\xa4\xe3\x41\x0e\x3d\xe0\x78\x36\xf5\x84\xa7\x5c\x24\x04\x22\x90\x60\x80\xa8\xcf\x7c\xe0\x41\x6a\x43\x8f\xdb\xae\x0b\x2f\xbf\xed\x8c\x7e\xbf\xfc\x9e\x1a\xb1\x0f\x86\xde\x6c\x15\x54\x48\x89\x09\x95\x57\x5f\x76\x86\xe1\xad\xfb\x75\xc4\x85\x6c\xb2\x22\x41\xa8\x3a\x6e\xe0\x80\x66\xa6\xbc\xb4\x9b\x2d\x3c\xcb\x67\x73\xf1\xf2\x2a\xe7\x3b\x2b\x50\x0f\x3d\x35\x5b\xb5\xa2\x7e\xb8\x9a\x15\xdc\xfc\x96\xe7\xa0\xa7\x63\xda\xc9\x8f\x5a\x96\x61\xa3\xad\xf6\xff\xd9\x7b\xb3\x1e\xd5\x91\x65\x5f\xfc\xfd\x7c\x8a\xa5\x7e\x59\x57\xa2\xf7\x26\xe7\x4c\xf7\xd5\x79\xb0\x8d\xc1\x36\x93\x01\x1b\x30\x57\x47\x2d\x8f\xcc\xf3\xcc\xd6\xff\xbb\xff\x05\x35\x30\x54\x51\x83\xa1\xaa\x57\xef\x7d\xd0\xd2\x52\x65\xb9\xf8\x39\x32\x32\x32\x22\x23\x33\x22\x12\x07\xd3\x78\x39\x2e\x39\x45\x18\x47\xdd\x96\xb5\x3c\x5a\x09\xf7\xc4\x97\xd8\xa4\x3b\x1b\x4f\x6b\xa0\x66\xc9\x54\x70\x37\x13\x23\x1c\xb9\x71\x2e\x58\x07\x15\xc1\xd0\xa4\xb6\xe0\x65\x93\x65\xb3\x10\x08\xc3\x4b\xab\x9d\x6d\x37\x9c\xc6\xf3\x28\xed\x61\x9e\xed\xc6\x05\x79\x90\xc9\xa7\xb4\x65\x05\x6f\x72\x5b\x6f\xaa\xd6\x68\xb1\xd0\x6f\x54\x9c\x43\x86\x84\xf2\x4a\xee\x84\xbc\xbe\x3c\x9b\xf8\x77\x98\x12\x9f\xb6\x12\x50\xba\x8f\x38\xff\x8c\x58\x4c\x49\xe4\xd1\x30\x88\x3d\x09\xb1\x98\x46\x84\x85\x21\xa0\x8c\x49\x20\xf6\x01\x86\x61\x80\x25\xc4\x21\x0f\x03\x10\xfb\x5e\x00\x7c\x14\x13\x08\x23\x41\x24\x46\x11\xbc\x1e\x27\x4e\xff\xb8\xbe\xd3\x2a\xd8\x1b\x21\xb1\x4f\x0f\x05\x64\x80\x60\x2e\xd8\x9b\x95\xce\xf0\x47\x0f\x26\x52\x3e\xb4\xa7\xcd\x20\x35\x31\x57\xcd\xbe\x1f\x2a\x0d\xaf\x92\x5a\x17\xc3\x35\x35\x37\x71\x90\xe1\x33\x79\xbe\xaa\x54\x99\x36\x18\x18\x15\xcf\x95\x6a\xc6\x7c\x93\x42\xc3\xdd\xc0\xef\xa7\x62\xa9\xa6\x8d\x57\xd1\x68\x52\x18\xa7\x0b\xe6\xd6\xb1\x3a\x4c\x4e\xb5\x53\xf5\xac\x98\x1c\x13\x27\xdc\x13\x19\x75\x77\x2a\x23\xf1\xb0\xd1\x6b\x95\x17\x53\x8d\x98\xbd\x79\x7e\xba\x8e\x66\xe1\x68\x57\x62\xdb\xf5\xc8\xac\xad\xc2\x79\xa6\x91\xb5\x82\x25\x9e\x98\xd9\x45\x71\xa8\x0f\x27\x73\x14\xc8\x9b\x71\xa5\x9f\x9e\xee\x62\x51\x19\x97\xca\x4a\x57\x31\x72\xb2\xc6\x44\xa4\x4b\x9b\xea\xf6\x70\xf0\xa1\xbc\x92\x38\x21\x2f\x2f\x2b\x13\xfc\x67\x4e\x08\x71\x1f\x61\xfe\x29\xbc\x38\x06\x00\x31\x1a\xfb\x92\x20\x10\x49\x00\x85\xb1\x14\xd2\x00\x83\x08\x4a\xc4\x03\xd0\x0b\xfd\x90\x4b\x88\x48\x20\x8a\xa9\x10\x98\x11\x2e\x42\x5f\x0a\x45\x84\x21\xbd\x5e\x6c\x9f\xfe\x41\xae\x6e\xb3\x0a\x81\xa5\xeb\x75\x0b\x0e\x4f\x0f\x27\xe3\x1c\x03\x89\x40\x88\xdf\x2c\x74\x86\x3e\x7a\x2e\x41\x66\x69\x59\x6d\xc5\x4b\xb7\x52\xeb\xab\x98\xc2\xa0\x58\xce\x39\x63\x65\xe6\x43\x6a\x9a\x99\x55\xc3\x28\xf5\xa3\xd2\x32\xec\xf5\xb2\x8d\x09\xd7\xbb\xa9\x7e\x46\xd1\x0a\x81\xe3\x0e\xca\xe9\x7a\x64\x4e\x56\x05\xb6\xa2\x63\xa3\xd2\xee\xc5\x8a\x2e\x2d\x50\x7d\xee\x3a\x60\x75\xbc\xc7\xeb\x34\x79\xa1\x94\xdf\x6c\xe5\xe2\x78\x5b\x4c\xb7\x47\x54\xea\x28\xee\xae\xb0\xf1\x1d\x24\x1a\x7e\x77\x83\x2b\xfa\x96\xcf\x81\x60\xab\x49\xcd\x25\xe1\x3c\x9e\x77\x20\xd8\x4e\xa2\x99\x3f\x34\xe2\xbc\xe3\xad\xc7\x63\xcb\x2d\x4d\x4b\xe9\x8a\x82\x7a\x79\x32\x5d\xa2\x85\xdc\x4c\x2d\x8c\x43\xcc\x88\xf2\x4a\xde\x84\xbc\x70\x2e\x24\xea\xdf\x61\x4a\x7c\xba\xce\x3e\xe4\xf7\x11\xe7\x9f\x2c\x26\x3e\x0f\x24\xca\x3d\x82\x3c\x8c\xc2\x50\x60\x10\x12\x8c\x20\x0a\xa9\xef\x7b\x71\xe4\x4b\x08\x41\x8a\x45\x44\x00\x04\x1e\x41\x98\x50\x8a\x31\x08\x43\x1f\x48\x3e\xf2\xdf\xf2\x24\xae\x9e\x5f\x0b\x89\x4b\xd7\xcb\x2a\x3f\x3f\xe5\x18\x40\x42\x08\x01\x6f\xd6\x39\x43\x1f\xdd\x82\x45\x52\x21\x36\xeb\xac\x32\x2d\x2e\x50\x26\xe3\x14\x3b\x85\xfa\x92\xa5\x67\xfd\x6e\xd6\xee\xf5\xe5\xca\x44\x2d\x65\x9d\x5d\x26\x9c\x9b\xf3\xd9\x36\x28\x63\x33\xad\x4f\x50\xa0\xad\x66\x04\xe3\x9c\x15\x4d\x71\x73\x61\xea\x56\x5d\xa4\x76\xcd\x70\x53\xa8\x56\x9d\x0d\x64\x95\xce\x43\x02\xf4\x7e\x4a\x34\x4f\x3c\x89\xa9\xde\x28\x67\xab\x61\x23\xb3\x8e\xf2\xa4\x65\x68\x8a\x6b\xbb\xe5\xfe\x6e\xdd\x45\x53\xd1\x35\xc6\x8a\xb4\xc9\xee\xe4\xf2\xd4\xaa\xa5\xe3\xb8\x67\x15\x3c\xad\x9a\xcb\x14\x66\xae\xca\x17\x2d\xb7\x5e\xe5\x23\xdb\xb6\x1d\x6e\x8f\x00\x29\x05\xd8\x2e\xcf\x21\x6e\xcf\x55\x78\x98\x12\xaf\xa4\x4d\xc8\xe3\xf1\x6b\x62\xf5\x37\x9f\x12\x9f\xf6\x24\xf6\x02\x72\x0f\x71\xfe\x29\x3c\x24\x21\x8c\x24\x09\x85\x4c\xf2\x7d\x06\x63\x42\x79\xc0\x99\xf0\x38\xa1\x3e\x8b\x7d\x14\x0a\x18\x7a\xa1\x2f\x42\xc6\x05\x88\x89\xc4\x80\x2f\x45\x11\x16\x28\x90\xbc\x90\xbe\x65\x25\xae\x0a\xbd\x04\x01\x25\x57\xf7\x9b\x9e\x9f\x32\xc1\xa1\x44\x38\xe3\x6f\x96\x39\x43\x1f\xdd\x6f\x22\xe3\x89\xb1\x1d\xd6\xe0\x64\x89\x74\x50\x17\xe1\x78\x02\x1a\x28\xb5\x45\x0a\x5a\x2c\x4b\x2d\x92\x01\x83\xf6\x32\x22\xa4\x60\xce\xea\x2e\x6c\xcb\x4e\x43\xc9\xad\x2b\x15\xab\x38\x75\x99\x65\x89\x6c\x76\x3b\x99\xf4\xf5\xf1\x3c\x5f\x25\x76\x06\xae\xe7\x6e\x98\x4e\x1b\xa9\x63\xd9\xe4\xd3\x5c\x68\x37\x3f\x5e\x72\xa5\x6f\x2d\x2a\x8b\x61\x86\x94\x29\x49\xdb\xf6\xd8\x69\x2b\x72\xdd\x51\x87\xea\x20\x5d\x4e\x49\x76\x7b\x8a\x3a\x25\x7d\x37\xc8\xbb\x52\xa5\x4d\x55\xd9\xd8\x84\xd5\xa6\x3f\x4f\x37\x83\xfa\x48\xf3\xb1\xe9\x9a\x71\x3a\xd3\x97\xf2\xa0\x54\x1c\x37\x68\x59\xd8\x87\x29\xf1\x4a\xd6\x84\x3c\xb8\x8c\xe8\x38\x7c\xfe\xe6\x53\xe2\xf3\x56\x82\xde\x47\x9c\x7f\x7a\x8c\x78\x31\x0c\x80\x88\x7d\x1a\x22\xe1\xf9\x41\x08\xe3\x40\x0a\xbd\x48\x04\x81\x0f\xfd\x38\x90\x7c\x3f\x0a\xa0\xcf\x7d\xc2\x79\x04\x49\x1c\x78\x28\xf0\xbd\x30\xf0\x88\x04\xf8\x5b\x59\x13\x6f\x08\x3d\x02\xec\x8d\x09\xf3\xf4\x94\x11\x82\x08\x05\x12\x79\xb3\xca\x19\xfa\xa8\x73\xcd\x5a\x79\x11\xa8\xd6\x22\xcc\xe7\x57\x25\x5d\x8c\x3c\x56\xdc\x6e\x56\x62\xc8\xb9\xb2\xe0\x55\x4c\x9c\x74\xbe\x50\x98\x05\x13\x53\x11\x21\x6a\x87\x9e\xe4\x35\x7b\xd5\x0d\x18\x7a\xa9\x65\x8e\x1a\xa3\x8c\xa5\x69\x0d\x1f\xf3\xb8\xd7\xda\x96\x2a\x5b\x6b\x6d\x75\x2b\xda\xea\xc4\x4a\x9c\x26\x61\xcf\x7b\xce\xa0\x61\xee\x9a\xbb\x66\x26\xa7\x2d\x79\xab\x29\x4a\x45\x92\xc3\x9d\x66\xd1\x6c\xdb\xd3\x21\x1c\x93\xe9\x4a\x2b\xc6\x3e\xcb\xe9\x6a\xb5\x5f\xef\x8e\x94\x60\x12\xb5\xd7\xd4\xef\xac\xdc\xe2\x64\x6d\x22\x3f\xdc\x6b\x34\x3c\x80\x7e\x4d\xb1\xea\x4e\xa6\xb7\x9e\x1d\x04\xff\x95\xa4\x09\xb9\xfd\xea\x6d\x5b\x7f\xf3\x29\xf1\x79\x5f\x82\xdc\x47\x9c\x7f\x82\x00\x12\x8f\x30\x1a\x33\x00\x00\xc4\x00\x7b\x94\xb1\x38\x0a\x20\x8d\x51\xe0\x07\xa1\x87\xb8\xe7\x07\x98\x44\x52\x20\x7c\x0a\x7d\x21\x24\x4a\x3c\x14\x4b\x3e\x06\x31\xf3\xaf\xdf\x38\x41\xff\x20\x57\x0f\xaf\x25\x8c\xa1\x74\x75\x37\xea\xf9\x29\x03\x10\x49\x94\x20\xf8\x66\x91\x33\xf4\x51\xf7\x7a\xbd\x76\x26\xb9\x26\x92\x65\x6d\x5d\x1e\xb4\x56\x5c\x69\x6e\xb7\x02\x75\xa3\xd9\x1a\xb0\xa0\x0b\x73\xa4\x5b\xaf\x75\x53\x7e\xd1\xf2\x36\x2b\x1a\x2c\xdc\x30\x28\xd6\xb4\xa1\xc0\xf3\xda\x6a\xdc\x9f\x60\xa4\xc2\x5a\x5a\x36\xda\xbe\x1f\x2c\x5a\x0d\xaf\xb1\x72\x36\x25\x24\x1f\x73\x26\x9a\x27\x43\x3a\x10\x51\xd1\x5f\x15\xcc\x45\x59\x19\xdb\xea\x6a\x3c\x1b\x68\xf9\x4d\x99\xb5\x27\xa3\xb9\x1a\xcd\x7b\xa3\x14\x54\x61\x5a\xcf\x81\x15\x9c\x85\x88\x8f\xcb\x3c\x55\x6f\xd4\xb4\x9c\x98\x89\x38\x28\x67\xdd\xbc\xe8\xe3\x56\x38\x19\x38\xfe\xce\x08\x63\x63\xd3\x2f\x79\x8a\x97\x3f\xcc\x82\x57\x72\x26\xe4\xf8\xf2\xec\xfa\xf0\xf9\x9b\x4f\x89\xcf\x2f\x9c\xf0\x7d\xc4\xf9\x27\xc0\x52\x28\x61\x80\x03\x04\x02\xc9\xa3\x02\x08\x14\x43\x1a\x13\xc1\x69\x24\xc8\xa1\xec\x6c\x44\xc2\x00\x81\xc8\x43\x98\x0b\xc6\x02\x2a\x85\x54\xe2\x41\x80\x89\xe4\xc1\xf0\x8d\x29\x71\x3d\x62\x43\x22\x42\xba\xea\x5d\x3f\x3d\xa4\x54\x60\x42\x39\x11\x6f\xd6\x38\x83\x1f\x4d\x98\x58\x97\xc3\xfe\xda\x52\x33\xe6\xc4\x55\x55\x51\x97\x8c\x30\xea\x14\xf5\xf5\xae\x8f\xd5\xcc\xd4\xc0\x9d\xe1\xa6\x05\x5b\x71\xb1\x64\x8e\xc3\x6c\xbc\x0a\x77\x8b\xcd\xcc\xd5\x2d\x69\xb3\x0b\xa7\x7e\x5a\x9a\x04\xf9\x71\xc7\x68\x76\xed\xd1\xa2\xb1\x4b\xd5\x36\x16\x1a\x6f\xa9\x82\x8f\x95\xf5\x1b\x27\x9e\x44\xb6\xdf\x70\x4a\xdb\x6c\x6a\xcd\x78\x95\x8e\x52\x7a\x3b\x53\x8a\xfc\x01\x9d\x8f\xea\xc8\x1d\x28\xf3\x1d\xde\x14\xec\xa9\x52\xac\xcc\x2b\xda\x22\x95\x6b\x14\x25\x67\xa1\x85\xb3\xbe\x3b\x1c\x1a\xb4\xae\xbb\xe3\xa5\x8d\x77\xd6\xc0\x9d\x14\xd4\xf2\x76\x30\xed\x4d\x51\xd0\xad\x1e\x82\x39\xe4\x57\x12\x26\xe4\xe0\xf2\x98\xee\xf0\xf9\x8f\x9b\x10\xe8\x3e\xc2\xfc\x93\x46\x34\x12\x12\xf6\x41\x2c\x01\x2e\x3c\xce\x19\xc0\x31\x03\x4c\x48\x04\xd0\x10\x91\x10\x11\x44\x78\xb8\xf7\xd6\x7d\x00\x62\x01\x69\x88\x20\xf2\xa3\xd8\x17\x50\x62\xf4\xad\xa2\x04\xf8\xea\x1e\xab\xc4\x00\xe4\xd7\xa7\xcb\xd3\x53\x0a\x29\x96\x18\xe0\xf4\xcd\x12\x67\xf0\xa3\xce\x35\xa4\x51\xd7\x9e\x5b\x7d\xbd\x3b\x0a\xdb\x16\x52\xc6\x03\xb9\x59\xb3\x6b\x95\x7e\x5c\x21\xad\xb9\x9c\x52\x9a\x35\x6d\xc6\x79\xbb\xd5\x6a\x64\x6b\xfa\x36\xe8\xca\x56\x64\x0c\x81\xec\x45\x9d\x69\xaa\x39\xab\xfa\xb1\x12\x23\xb7\xb1\x40\xe3\xe1\x2e\xae\x8c\x8a\xb5\x51\xd1\x9b\x1c\x3d\x89\xc6\xc9\x7a\x3e\x20\x16\x1e\xa7\x14\xb3\x6b\xae\x9a\x4d\x23\xee\xa5\xa3\x7a\xc5\xca\xc2\x6a\xd5\x98\x8d\x34\x34\x8a\x9b\xc0\x23\x26\x6f\x64\xb7\xb5\x59\xc6\xde\xd5\xa7\x5e\x21\x15\xae\x73\xb3\x05\xec\xa9\xb5\x69\x8b\x87\x7d\x2b\x72\x32\x92\xf0\x6a\xf9\x42\xab\x04\xc3\x8a\xee\x8e\x2b\x9d\xc3\x2c\x78\x25\x5f\x42\x6e\xbd\x2a\x56\x7f\xf3\x29\xf1\xf9\x65\x13\xbc\x8f\x38\xff\x64\xc8\x0b\x89\x8f\x3d\xcf\x0f\x90\x27\xe1\xe8\xb0\xe7\x29\x24\x26\x22\x06\x21\x09\x61\x04\xa9\x17\xc3\x30\xf6\x39\xc5\x31\xf5\x39\x20\x22\x00\xd0\x8f\x68\xec\xe3\x48\xf2\xdf\x0a\xe6\xc0\x57\x4f\xae\x25\x0e\xd9\x07\x9e\x12\x8e\x08\x61\x04\xa0\x37\x4b\x9c\xc1\x8f\xc6\x37\xa1\xfc\xa2\xb6\x9b\xce\xd6\xd3\x7e\x4a\x75\x34\x77\x30\xa6\x9d\x6c\x49\xef\x34\x56\x7a\xbc\x80\x16\x5c\xac\x6b\x45\xd9\xa7\xf1\x3c\x35\xa4\x9c\x17\xb3\xd4\x87\x46\xd4\xc5\x3b\x3d\x2b\x69\xf2\x70\x5e\xb0\x05\x19\x70\xd7\x97\x9d\x9a\x9e\xe6\xd9\xf4\x7a\x3b\xac\x4e\x25\x71\xbc\x32\xbe\x71\x22\xa5\x13\x63\x33\xf1\x6c\x4b\x2e\x99\x35\xdc\x8c\x17\xb9\x66\xb6\xe6\xce\x34\x13\x14\x3b\x71\x89\xe5\x4a\xb0\x1c\xd1\x94\xab\x59\x0c\x48\xa9\x05\x1c\x12\x35\xe3\xf9\x7e\xb6\xae\xae\x37\x9e\x0d\xeb\xc6\x4a\x25\x0d\x35\xcd\x46\x6c\x38\x9b\x95\x6b\xab\x71\xba\xec\xd3\x61\xff\x50\x1b\x56\x7e\x2d\x5d\xa2\x79\x79\x4c\x77\xf8\xfc\xc7\x4d\x09\x70\x1f\x71\xfe\xc9\xa4\x18\xf1\x88\x23\x5f\xe2\x31\x0f\x7c\xee\xc7\xe1\xfe\x87\x10\x00\x88\x7c\xee\x7b\x40\x80\x10\x87\x51\x00\x05\x64\x42\x08\x22\x18\x62\x3e\x8c\xa0\xef\x85\x88\x46\x1e\x7d\x20\xfe\xf5\x65\xd3\x75\x5f\x41\x80\xc7\xac\xbe\x37\x9f\x12\x24\x11\x89\x71\x24\xbd\x59\xe1\x0c\x7e\x74\xbf\x09\x8d\xb6\xf1\x28\x4f\x63\xbc\xc5\x2b\x29\xc6\xbb\x8a\x5c\x5b\xf0\xb1\x91\xb1\xf1\x3c\xa7\x78\x46\xc7\x70\x87\xf3\x28\xc7\xc0\x80\x0d\x26\x92\x43\x59\xb5\x36\x0e\xaa\xa4\x35\x69\x36\x5b\xf3\x74\x7b\x10\x8c\x72\x75\x5d\xab\xd5\xb3\x59\x87\x15\xba\x79\x29\x5e\x47\x85\x82\x7b\xac\xfa\xd7\x38\x19\x52\x29\xd5\xeb\xcd\x1b\x79\xb6\x62\x6d\x50\x76\x8b\xd9\x8d\x3d\x86\x29\x77\xdc\xee\xa2\x6d\xa6\xd6\x6b\x76\x4c\xc1\x4a\x50\xde\x98\xe5\x95\x16\xc0\xc1\xa6\x84\x06\x13\x43\xd4\xa2\x76\xce\x65\x8b\x95\xec\xcd\x27\x4b\x12\xea\x9b\x61\xa1\x1e\xce\xb4\x7e\xaf\x36\x30\xdc\x55\xfc\x50\x55\xf0\xb5\x6c\x89\xfa\xe5\x41\xdd\xe1\xf3\x9f\x36\x25\xa4\xfb\x48\xf3\x4f\xe6\xc5\x21\xc4\xd8\x8b\x39\x8e\x63\x3f\xe4\x51\x48\x59\x80\x18\x0d\x59\x88\x7d\x1e\x61\x4e\x7c\x10\x42\x0e\x28\x0c\x42\x18\xc4\x22\x92\xa2\xd0\xe7\xcc\x8f\xe2\x20\xf4\x09\xf7\xdf\x32\x12\xd7\x7d\x05\x21\x89\xb7\x66\xc4\xe3\x53\x2c\x18\x25\x1c\x50\xf6\x66\x7d\x33\xf8\xd1\xba\x35\x68\x26\x69\xbb\x19\xb6\xd2\xab\x26\xaf\xfb\x6a\x2b\xf4\xed\x45\xaa\x04\xe6\xa5\xec\xda\x09\x40\x90\x2a\x8f\x16\x0b\xb4\x5a\xed\xfc\x2a\x37\xa0\x57\x76\x52\xfa\x62\xb7\x82\xee\x76\x5c\x6e\xa4\x4a\x4e\x73\x3c\xef\x69\x6b\x56\x6d\x65\x3b\xeb\x45\x19\x5a\xc5\x91\x5c\x95\x17\xcb\xe3\x8c\xa8\x9f\xe6\x5e\x37\x2b\x85\xc6\xb2\x8d\x8c\x16\xca\x91\xea\x68\xed\xcc\x54\x7b\x65\xac\xcb\xcc\x2e\x4e\x96\x08\xa6\x6a\xc8\x69\x76\xa6\x85\x7c\xc3\xd6\x73\xf2\xba\x49\xb7\x20\x5b\x77\xb4\x5e\x26\xa4\x6e\xa6\xeb\xf3\x75\x27\xed\x97\x6a\x9b\x16\x03\xcc\x2d\x82\x0c\xb5\xa4\x55\xb7\x5d\x3b\xcc\x88\xd7\x72\x25\x6a\x97\x05\xc4\x0f\x9f\xff\xb4\x19\x21\xee\x23\xcd\x3f\x41\xe0\x7b\x34\x64\x44\x30\x1f\x08\x10\x20\x20\x11\x12\x8a\x08\x01\x2e\x42\x0f\x50\x41\x49\xe4\x93\x90\x09\x1f\x04\x84\x78\xdc\xe3\x20\x06\x2c\x8c\x7d\x1f\x89\x00\x88\xc3\x35\x5c\xe4\xf0\xef\x15\xe1\xbe\x7a\x72\x2d\x49\x12\xbd\x7e\xf7\xca\xf3\x53\x4c\x30\x95\x38\x16\xf8\xcd\xea\x66\xf0\xa3\x1b\xb0\xeb\x2d\x6b\x36\x6a\xb9\xb9\x91\x51\x55\xc7\x76\x49\x3b\x2a\x8d\xb3\x1d\x87\x01\x38\x9e\x17\xab\xf9\x68\x94\x59\xfb\xf1\x72\xdb\x93\xdb\x66\x2b\xdd\xae\xeb\x1d\xa2\xe5\xc6\xd5\x66\x6f\xa3\x0c\xcc\x66\x3b\xf4\xd9\x98\xd2\x88\x16\x2c\x45\xa4\x67\xc6\xa2\x99\xea\x2a\xc5\x61\xfb\x78\xcd\x44\xfd\xc4\x93\xa0\x71\x07\x64\xaa\xad\x54\x39\x8e\x64\xd2\xd5\x71\xce\x2e\xfa\x39\x16\x4c\xcd\x9c\xb6\x01\x53\x95\x72\x04\x99\xee\xdb\xeb\x8a\xe5\x80\xce\xae\x5c\x01\x0b\x6d\x3d\x0e\x41\x23\x9f\xcb\xd0\x7e\x91\x15\xd6\x75\xbd\x90\xf7\x8d\xf2\x4e\x19\xfa\x69\xa9\x66\xac\xb5\x31\x51\x0e\x72\xff\x5a\xa6\x44\xf5\xb2\x80\xf8\xe1\xf3\x37\x9f\x11\xe4\xb3\x33\x82\xdf\x47\x9a\x7f\x46\x94\xf9\x12\x96\x50\x0c\x24\x22\xa1\x98\x00\x41\xb8\x90\x3c\x16\xf3\x28\xf2\x30\xe2\x24\x64\x92\x04\x03\x09\x8a\x50\xa2\x40\x62\x00\x48\x91\x24\x68\xec\x47\x2c\x00\x21\x78\xd3\x91\xb8\x62\x05\xc8\x3f\x01\x84\x44\x5c\xf1\xbc\x4f\x9e\x62\x00\x18\xe1\x1c\x82\x37\x6b\x9b\x7d\x34\x9d\x2e\x55\x9f\xf5\x69\x61\x3d\x30\x0b\x40\xd5\x22\x73\xb2\x8a\x97\xe3\x6d\x58\xf2\x5a\xba\x99\x2b\x0d\x2a\x83\xb6\x1a\x0d\xb3\xa9\x94\x2f\x03\x73\xe6\x20\x65\x44\x3c\xbb\xe7\x16\x0b\x93\x4c\x1c\xc7\x46\x3a\x62\x7a\x06\xe7\x6a\x55\x55\x33\xc7\x44\x9e\xb9\x8b\xae\x44\xca\x8d\xe9\x31\x94\xa3\x7e\x9a\x76\x4d\xf5\x72\x65\x82\x6d\xd5\xd8\x96\x9d\x9e\xa8\x0f\x4b\xb9\x59\x67\x8e\xd4\x94\xd1\xec\x49\x04\x4d\x46\x78\x6a\xd5\x0d\xb9\xd9\xdc\x30\x17\x73\x31\xb3\xba\xf3\x4a\xda\x6a\x54\x0b\xde\x6e\x53\x54\x07\x85\xb5\x28\x20\xa7\x6f\x84\xd2\x98\x91\xc8\x98\x0c\xbc\x7a\x5f\x3c\x5c\xb7\xfd\x5a\x9e\x44\xfe\x32\xc5\xf4\xf0\xf9\x9b\x4f\x88\x4f\x9b\x08\x76\x1f\x61\xfe\x19\xd3\x58\x0a\x60\x1c\x70\x00\x28\x87\xa1\x47\xc3\x18\x84\x2c\x02\x51\x10\x85\x9e\xcf\x45\x1c\x09\x18\xb1\x98\x31\x40\x49\x44\x30\x45\xb1\xc4\x3d\x1c\x83\x20\xc6\x21\x8d\xdf\xcc\x30\xc5\x57\x4e\xe1\xc8\x3f\x01\x82\xd7\xa7\xc3\xc3\x33\x44\x39\x93\x04\xc0\xfc\xcd\xa2\x66\x1f\xae\x1b\xde\xa4\xeb\x78\xb3\x56\x9a\xba\xd7\x8c\x33\x0d\x52\xde\x2d\xa6\xb8\x97\x6a\x47\x3e\x72\xb3\x76\xbf\x54\x4b\x35\xc7\xe9\x8c\x65\xd5\x05\x2e\x6d\x25\xde\x4f\x83\x2c\x92\x1b\x3a\xb2\x2c\xd6\x53\x36\xe3\xd0\x68\x16\xdb\xbd\x61\xb5\x60\xae\x3b\x99\x45\x59\x2c\x2a\xad\x76\x2c\x8e\x5b\xaf\xf5\x93\xc1\x2c\x89\x0a\x92\x17\xaa\x3a\x8f\x06\x44\x37\xe6\x79\xb2\x0c\xa7\xcd\x6d\xa1\x32\x0d\x66\x5e\xae\x17\xc8\x7a\xbd\xe6\x94\x04\xa4\xed\x59\x76\xdd\x0c\x46\x4b\xdd\x81\x4b\x67\x92\x9b\xda\xce\xc2\x37\xd2\xdb\x96\x05\xb7\xee\xaa\xa2\x8d\xba\xf2\xb2\x18\xa3\x4e\x77\xdd\xf5\x16\x87\x7a\xb0\xf2\x6b\x19\x12\xe6\x65\x3d\xd8\xc3\xe7\x3f\x6d\x32\xd0\xfb\x08\xf2\xcf\x00\x31\x00\x25\x08\x51\xc4\x43\xe8\x61\xc0\x7d\xee\x33\x4f\x10\xec\x85\x94\xc5\x21\xc7\x3e\x85\xb1\x1f\x06\x28\x62\x98\xc6\x11\xf7\x41\x1c\x04\xc2\xf7\x22\xc2\x22\x89\x40\xfe\x46\x0c\x07\xbe\x72\x60\x4d\xfe\x09\x30\x7d\xc3\x38\xec\x1f\x1e\x4e\xfd\x20\xe1\x44\x60\x46\xde\x2c\x68\xf6\xd1\x4d\x26\x61\xb6\x73\x55\x6d\x19\x57\xc7\xeb\x08\x2f\xa6\x9d\xcc\xac\xee\x4b\x01\x77\xe2\x55\x50\x18\x96\x62\xca\x33\x62\x5b\x98\xf5\xfd\x49\xa5\xb9\xdd\x49\x5d\x17\xcd\xf4\xce\x7a\xe9\xac\xca\xd9\x65\x41\x63\x43\x65\x65\x97\x09\xeb\x18\xa9\xe6\x26\x8f\x4c\x1a\xc0\xc5\xb2\x30\x3f\xb9\x0c\xde\x39\x59\xc5\xf7\xd9\xaa\x9c\xce\x57\x37\xeb\x16\xd8\x8e\xcc\x62\x71\x96\x77\x26\xe5\x5a\x4c\x1b\x1d\x3f\xec\x97\xfa\xa0\x60\x94\xd3\xbb\xd6\x46\x49\x4d\xa3\x26\xf7\xdc\x1c\xd8\xe1\xe6\x30\xbb\xde\x0c\x67\x98\x58\xb3\x4d\xa7\xbe\x15\xb5\xea\x6e\xe0\x14\x73\xbd\x8e\x5d\x68\x44\xb8\x9b\x1a\x3c\x48\xf5\x6b\xe9\x11\xfa\xbf\xe3\x71\xf5\xa7\x23\x38\xc8\x7d\x64\xf9\x27\x26\x30\x8e\xa5\x80\x48\xc2\x97\x00\x67\xb1\x88\x11\xf4\x22\x8f\x0b\x0f\x63\x3f\x00\x01\xc3\x92\xe7\xd3\x20\x96\x04\xf3\x42\x3f\x40\xa1\x08\x01\x09\x25\xe4\x53\x4f\x0a\x59\xf8\x56\x99\x1a\x7c\xe5\xb4\x9a\xfc\x13\x50\xc4\xaf\x9d\xcd\x9d\x3c\x3d\xb9\xa7\xee\xed\xd3\xea\x0f\x4d\x88\x5d\x25\x4e\x05\x35\x77\x59\x09\x57\xbd\x6d\x6e\x39\x21\xe3\xdd\x4a\xde\xf4\x86\xb3\xa6\x35\xcc\xcd\xfc\xf5\xa2\x57\xb1\x5b\x79\x38\x0d\xfd\xb8\x96\x6a\x46\x31\xc9\x36\x9b\x86\x8d\xfa\x01\x6c\x06\xf1\x6e\x54\x86\xb2\x6b\x49\x66\x69\x99\x51\x0d\x68\x66\x9b\xfa\x64\xe4\x48\xc6\xd1\x40\x38\x27\xee\x83\x21\xb2\x91\xae\xed\x4c\x90\x26\xd9\xb2\x48\x97\x72\x69\x82\xd7\xb6\x36\xda\x42\xb5\x91\x5e\x05\x3a\xea\x05\xb3\x4a\x7f\xe7\xfb\x41\x2f\x95\x8d\x59\x26\x6e\x8f\x48\xb6\x62\xe7\xcc\xe6\x00\xcf\x53\x1b\x65\xba\x55\x46\xa9\xe5\x4a\xb3\x34\x77\x3d\x9d\x59\xf6\xcc\xd2\xd2\x0f\x06\xe8\xb5\xe4\x88\xcc\xbf\xe3\xd9\xdc\xe7\x8b\x5e\xde\x47\x98\x7f\xc6\xa1\x84\x98\x08\x21\x0b\x39\x05\xd0\x67\x91\xcf\x25\xca\x7c\xc6\x29\xf3\x91\x88\x23\x82\x83\x88\x7a\x0c\x40\xe0\x73\x16\x71\xce\x42\x09\xc6\x0c\x44\x34\x8a\x42\xee\xbf\x71\xfd\x10\xfd\x03\x5d\x39\x7c\x23\xff\x04\x8c\x42\x7e\xc5\xdd\x7e\x7c\x4a\xcf\x6b\x5e\xbe\xe5\x50\x7f\x74\xc5\x84\x6a\x5e\x29\xbb\x08\x2b\x39\xc4\xf0\xa0\xb1\x18\xd5\x67\x79\x8b\x66\x76\x83\x49\x5b\x2b\x84\xcb\x10\xa1\xaa\xd4\xa6\x11\x6f\xce\xa7\x99\x56\xae\xa2\x68\xd0\x9d\x8f\x17\xc6\xac\xda\xec\xaf\xf9\x86\xa5\x83\xbc\x15\xa2\x5d\x59\x55\x96\x3b\xae\xa3\xea\xa0\x3a\xae\xe5\xdc\x63\x40\x93\x73\x22\xa3\xd4\x1a\xad\xb4\x55\xb1\xac\x89\xfe\x36\x33\xc7\x39\x7f\x09\x3b\xe3\xa5\x08\x86\xe3\xf5\x1a\x1a\x7c\x33\x75\x73\x65\x7f\x01\x5a\x63\x30\x6e\xc9\xf9\x0c\x75\x60\x75\x53\xda\x8a\xf1\xaa\x97\x22\xe5\x5e\x91\xcc\x0c\x05\x58\x69\x15\x07\x95\x54\x47\x2d\xc8\xb3\x22\x91\xda\x87\xaa\x4d\xf2\x6b\xc9\x11\x2f\xef\x32\x95\xff\x03\x27\x04\xba\x8f\x30\xff\x64\x38\x94\x44\x4c\x31\x8b\xa2\x3d\x94\x8f\xb8\x4f\x7d\x21\xc5\x08\x7b\x31\xc5\x10\xfa\x9c\x32\xc9\x43\x24\xf6\x62\x48\x00\xf6\x42\xe0\x53\xe4\x33\x8c\x7d\xc0\xfd\x48\xda\xcb\x3c\x38\xfc\x7b\x65\x42\x5c\x5f\x14\x71\x86\xae\xdd\xc7\x75\xf2\xf4\x98\x3f\xf7\xc6\x7c\xf8\xe0\x7e\xab\xd5\xea\xc1\xd2\x92\x8e\x81\x6f\xf2\x06\x19\x6d\xcb\x2b\x67\x93\xc3\xf5\xc9\xb8\x9f\x5a\x65\xe5\xf2\x42\x85\x79\x54\xe4\x0a\x67\xad\x65\xab\xaa\xcf\x24\x27\x6c\xe6\x7d\x3b\xdf\x0d\x06\x71\xb9\xb7\xe5\xc8\x6d\x65\x4d\xa7\x6f\x5a\xf5\x20\x6f\xd3\xce\x62\x35\x9e\x0d\xe1\xf1\x50\xee\x61\xe5\x64\x3c\xff\x27\x3f\x1c\xa2\x1d\xdb\x6b\xd9\xaa\x3c\xca\x2d\xde\x49\x9d\xa1\x5c\x9b\x14\xa4\x85\x5c\xdf\xf4\x17\x9b\x0c\x6e\xd6\xca\x13\xdc\x5d\x6c\x6a\x2b\x6d\x58\x64\xb2\xd3\x5f\x2b\x35\xa2\x55\x47\xab\x54\x61\xb1\x48\x6f\x83\x5d\x7a\x23\xd2\xa9\x41\x56\x11\x60\x36\xaa\x6f\x78\x0f\x15\x67\x43\x24\x69\x93\xe5\xdc\xa9\xa6\xda\x2b\xe9\xe1\xb4\xfa\xb5\xbc\x89\xd7\x3f\x7f\xf3\xd9\x02\x3e\x7d\x68\x77\x1f\x49\xdf\xbf\xf1\x59\xde\xa1\xc4\xc1\x3f\x00\xfc\x07\x80\x3f\x00\xf8\xe3\xf0\xef\xaa\x44\x0b\xc4\xd8\xf5\xd9\xf0\xf4\xf4\x78\xea\xf6\x69\x79\x7f\x20\xe9\xaf\x1e\x9a\xeb\x1f\xa5\x99\xef\x92\x6d\x7a\x5b\xcb\x2b\x3c\x33\xca\x48\x3a\x02\x9b\x9e\x92\x9a\x83\xf6\x62\xbe\x36\xd6\x3b\xd8\x0c\x6b\x0d\xd7\x53\x4c\x2f\x7b\x58\x69\xbd\x96\xef\xf0\xfa\xe7\x49\x94\xaf\x19\x86\x5f\xf9\x73\x29\xca\xff\xf5\x5f\xff\xf8\xc7\x7f\xfd\xe3\x1f\x3f\x32\xde\xc2\xfb\x11\x8f\x67\x3f\x4a\xde\x30\xfa\xe3\x59\xaa\xc7\x93\x68\xe6\x2d\xba\xe3\xd1\x9f\x13\x6f\xb6\xe8\x06\xdd\x89\x37\x5a\xcc\xff\xef\x0f\x7b\x3b\x89\xfe\xf8\x61\xcb\x4a\x41\xfb\x91\x91\x6d\xf9\xff\xfe\xa8\x05\x9d\x68\xe8\xfd\xf1\x63\xb2\xf4\x07\xdd\xe0\xff\xfe\x28\xaf\x47\xd1\xec\x8f\x1f\x7b\xf0\xff\x7a\x75\xc2\xbc\x0e\x7d\x3a\x7f\x10\x83\x92\x84\x01\x90\x20\xc5\xbf\xff\x80\x57\x26\xde\x3b\x38\xe8\x79\x5f\x88\x40\x41\x79\x62\x1c\xbc\xc7\xc1\x04\x60\xc0\x09\x65\x30\x31\x0e\xf9\xfd\x07\x22\x12\x04\x02\x02\x8e\x18\x4d\x8c\x43\xf7\x38\x44\x40\x0c\xb1\x24\x31\x29\x31\x0e\xbb\xc4\x41\xc9\x70\xf8\x21\x19\x84\x42\x01\x39\x62\x1c\xff\xfe\x03\x27\xc3\x11\xbf\xff\x40\x98\x21\x84\x11\xa0\x98\xf3\xc4\xf4\x48\x97\x38\x09\xe9\x81\x7b\x8f\x10\x43\x09\x09\x84\x05\x10\x30\x31\x41\xfb\x95\xc1\x39\x10\x49\x08\x84\xce\x80\x50\x72\x20\x7c\x09\x94\xb4\x6b\x7b\xa1\x46\x9c\x61\x8c\x38\xe0\x82\x26\x07\xa2\x97\x40\x49\xbb\xb6\x17\x6b\x84\x31\x16\x18\x60\x22\xa4\xdf\x7f\xd0\x84\x40\x7b\x09\x84\x12\x20\x18\x63\x06\x25\x9c\x1c\x48\x1c\x37\xe4\x84\x90\x78\x72\x20\xe9\x90\x63\x42\xf6\xca\x08\x32\x00\x13\x03\x21\x70\x04\xa2\xec\x06\x8a\x10\x3c\x02\x49\xfc\x06\x1e\xa1\xbd\x08\x02\x06\xa9\x20\x98\x60\x90\x5c\x8e\x10\xbe\x04\x4a\x4a\xd1\x5e\xb2\x01\x14\x0c\x13\xc6\x01\x48\xae\x1e\xd1\x5e\xd3\x4b\x9c\x32\x41\x24\x89\xef\x67\x1e\x4b\x08\xc4\x9e\x80\x28\xc0\xe2\x16\x8a\xf6\xb6\x50\xc2\x88\x63\x8a\x11\xd9\xcb\x79\x52\x8a\xc4\x25\x50\x52\x8a\xf6\x56\x6c\x3f\x37\x04\x65\x14\xa2\xe4\xaa\x16\x83\x4b\x20\x9e\x10\x68\x6f\xe7\x05\x61\x02\x53\x89\x8b\xfd\x18\x26\x05\x42\x97\x40\x49\xbb\x86\x0f\xd9\x03\x58\x08\x86\x01\xdd\x73\x4c\x24\x04\x22\x97\x40\x52\x42\xa0\xbd\x64\x73\x06\x24\xcc\x18\x46\x7b\xfa\x92\x52\xc4\x2e\x81\x92\x52\xc4\x8f\x40\x1c\xdf\xc2\x23\x71\x09\x94\x94\x22\xe9\xb8\xf9\x4c\xa5\x3d\x7d\x09\x81\x0e\x99\x87\x07\x20\x0e\x00\xb8\x81\x47\x64\x2f\xd9\x8c\x53\x80\x39\x12\x6c\xdf\x4a\xc8\x23\x82\x9e\x6f\xf6\x67\x10\x93\xe4\x92\x4d\xf0\x25\x50\xd2\xae\x91\x23\x10\x25\x24\xb9\x1a\xd9\xd3\x70\x0e\x94\x94\x47\xec\xf9\xa6\x77\x89\x00\xb2\x17\x06\x90\x10\x89\x1f\x2f\xc8\x66\xfc\xe0\x16\x25\x45\x12\xc7\x6b\x85\x25\x72\x70\x8c\x92\x22\x49\xcf\x97\xb1\x4a\x08\x1e\x5c\xa3\x84\x48\x14\x1c\xaf\xb0\x24\x82\x25\x97\x25\x0a\x2f\x81\x12\x93\x84\x8e\x37\x08\x72\x7a\xf0\xb3\x92\x3a\x6c\xf8\x19\x89\x41\x76\xa0\x29\x29\x12\x79\xbe\xc1\x4d\x02\x68\xef\x6b\x25\x46\xa2\xcf\x67\x00\x08\x49\x7b\x2f\x29\x31\x12\x3b\xde\x16\x44\xd9\xde\xbb\x49\x8c\xc4\x8f\x77\xac\x08\x2c\x6e\xe1\x93\x78\x46\xda\x8b\xc1\x2d\x34\x49\x47\x24\x46\x6f\xe1\x13\x03\x4f\x48\x10\x00\x76\xcb\xd8\x1d\x26\xda\x23\x12\xe1\xb7\x48\x26\x43\x47\x24\x21\x6e\x91\x4c\x86\x9f\x91\x20\x92\xd8\x0d\x1c\x3f\xc4\x3c\x3f\xdc\x2a\x82\x20\x10\xc9\x97\xb9\x0f\xdd\x39\x05\x4a\x4c\x12\x7b\xbe\xd4\x81\xe2\x83\x9b\x03\x93\xd2\xc4\x8f\x48\x5c\x1c\x68\x4a\x8a\x24\x8e\x45\xf5\x19\x91\x92\xaf\xbd\x0f\xf2\x73\x06\x94\x94\x24\x0e\x8e\x35\xcd\x25\x04\x0e\x9a\x38\x21\x12\x7c\xaa\x04\x4d\xa1\xb4\x77\xe2\x60\xc2\x3d\x1c\x8e\x9e\xeb\xe7\x12\xb6\x77\x99\x12\x03\xe1\xe7\xaa\xa3\x1c\x1f\xb6\x4f\x12\xe2\x90\x0b\x9c\xc4\x04\xd1\x27\x20\x04\xc9\x0d\xce\x20\x67\x17\x38\x89\xc7\x8c\x3f\x1d\xa2\x51\x00\xf6\xbe\x20\x4c\xe8\x55\x72\x71\x09\x94\xd0\xf5\xe2\xd2\x53\x15\x40\x81\x38\x82\xc9\x29\x12\xe0\x12\x28\x21\x45\x7b\x4b\xf4\x58\x84\x8d\x92\xc3\xc6\x40\xc2\xdd\x09\x81\x2e\x81\x92\x76\x0d\x3f\x03\x49\xf4\xd0\xb5\xa4\x14\x91\x27\x20\x84\xd9\x61\xd4\x92\x02\xd1\xe7\xaa\x5c\x02\x1e\x36\x06\x92\x76\x8d\x3d\x01\x51\x84\x0e\x3c\x4a\x3a\x6a\xfc\xa9\x28\x92\x00\x02\x27\x9f\xfb\x42\x5c\xe0\x24\xee\x99\xf4\x0c\x44\x24\x94\x7c\xee\x4b\xe0\x02\x27\x29\x87\x24\xf8\x0c\x24\x81\x1b\xf6\x38\x24\x74\x81\x93\x54\x88\xf6\x36\xfa\xa1\x68\x0f\xc4\xf4\xb0\x2b\x90\xd0\xa5\x94\xc8\x25\x50\x42\x4f\x50\xa2\xcf\x35\x53\x18\x3a\xf8\xe0\x49\x29\x62\x97\x40\x49\x29\xe2\x4f\x40\x14\xe0\x9b\xba\x26\x9e\xab\x5f\x08\xe9\x86\x7d\x00\x49\xba\xc0\x49\xca\xa2\xc3\x19\xf5\x03\x92\xc0\xe0\x86\x7d\x00\x78\xd8\x64\x3f\x05\x4a\xca\x23\x08\xd0\x53\x3d\x04\x08\x19\x39\xec\xe4\x27\x45\xc2\x97\x48\x09\x3d\xdc\xc3\xb5\x33\x8f\x09\xe9\x04\xd3\xe4\x8a\x0d\xee\x97\x68\xe7\x40\x89\x3b\xc7\x9e\x43\x13\x38\xd8\x3b\x84\x28\x31\x4d\xfc\x12\x29\x29\x90\x38\x05\x12\xb7\x90\x24\x5d\x22\x25\x3d\x50\x04\xcf\x49\xa2\x12\x67\xb7\x9c\x4c\xc2\x4b\xa0\xc4\x48\xe8\x29\x4b\x8f\x20\x72\xd8\xc0\x49\x7a\xec\xba\x5f\x15\x9f\x23\x25\x05\x22\xcf\x40\xec\x70\x70\x9f\x9c\x24\x7a\x89\x94\x14\x88\x3d\x01\x51\xc0\x0e\x42\x99\x98\x24\x7e\x89\x94\x14\x48\x3c\x03\x91\xc3\xbe\x62\x72\x92\xa4\x4b\xa4\xa4\xc7\xdc\xe0\x39\xbf\x8d\xc2\x1b\x22\x13\x0e\x07\x40\xe7\x40\x49\xfb\x86\x8e\xd1\x24\x5c\xec\x9d\x41\x94\xf8\x0c\x1f\x3f\x1d\x07\x13\x70\xd8\x50\x4a\x8e\x44\x9e\x91\x08\xbb\x8d\x26\xfa\x8c\x24\x0e\x1b\x4a\xc9\x91\xd8\xf3\x31\x05\x46\x87\x98\x89\xc4\x48\xfc\x12\x29\x29\x90\x78\xde\xea\xa4\xd2\x2d\x21\x0a\x87\x15\xf2\x19\x10\x3d\x89\xa3\xfa\x48\xf8\xd4\x9f\xdd\xf0\xcf\x79\x34\x7d\x8a\xa2\xaa\x69\x15\x47\x2b\xa9\xda\x8f\x9a\x66\xbf\x13\x47\x55\xd3\x0a\x9a\x6a\xff\x98\xb4\xff\x0c\xbc\x85\x37\x18\xb7\xff\x39\x8f\x16\x2b\x6f\xf0\x7f\x7e\x7e\xe8\x8d\x87\x88\x6f\xe9\xf7\x1f\x8b\xd9\x32\xfa\x44\xec\xd7\x9d\xe3\xbd\x4e\xcf\xb2\x4f\x03\xbc\x4e\x5a\xe8\x21\xe6\x1d\xfe\xfe\xe3\xe7\xbf\x7e\xf3\x97\xc3\xc9\x9f\x8b\xf1\x6f\x7f\xfc\xf8\x0d\x1f\xc3\x12\xf1\x6f\xff\xdf\xcf\xdf\x7f\xfc\xcc\xa9\x95\x96\x85\x0d\x87\x37\x1d\xa6\x99\x0c\x9b\xad\x66\x5e\xad\x94\x5d\x1b\x55\x4b\xcd\x12\xd6\x15\xaa\x96\x74\xad\x54\x72\x34\x47\xaf\x15\x65\x52\x77\x4c\xd3\xac\x69\xa5\x9f\xef\x8d\xfe\xe9\xd1\xfd\x69\xf8\xd8\x49\x8b\xbd\x4f\x25\xfc\x46\x2a\x4f\x83\xd3\x4e\x5a\xe0\x0a\x95\x10\x80\xef\x23\xee\x2c\xe2\xed\xa4\x45\xde\x67\xe1\x77\x52\x79\x16\x07\x77\x6c\x89\xa7\x68\xf9\x9f\xff\xfa\x2d\x5e\x8e\xc2\x68\xb6\xa7\x31\xa7\x54\x2d\x57\x37\x0a\x48\x35\x70\xb6\x54\x21\x4a\xb3\x90\x2d\x96\x32\x85\xac\xe9\x94\x2c\x07\xe9\x2e\x6e\x15\xb3\x35\xbd\x5c\x72\x54\xad\x2c\xd7\x1a\xbc\xa2\xf2\x72\x13\xe9\xbf\xfd\xfe\xe3\x37\x2f\x08\xc6\xcb\xd1\xe2\x00\x93\xb0\x63\x7b\x98\xf9\x62\x3f\xc9\x47\xed\x3f\x7d\x6f\xe0\x8d\x82\xe8\x71\x5c\xc1\x3f\xcf\x59\x97\x90\xd0\x4f\xb1\xee\x34\xf4\xef\xa4\x85\x9e\xb3\x57\xfe\xf5\xdb\xc3\xd0\xe6\xe4\x52\xb6\x95\xa9\x2a\x6a\xc9\x76\x9a\x46\x39\xa3\x9a\x9a\x5b\x94\x55\xab\xa8\xd6\x5a\x5a\x5d\x23\x8d\x56\xae\x85\xd5\x56\xa6\x85\x2d\x54\x6b\xe6\x49\x5e\xe7\xd4\xc8\x33\x77\xdf\xdf\x78\x36\x1e\xde\x8a\xe1\x0d\x9f\x38\x0f\x8f\x7c\xda\xff\x7e\x3e\x8f\x16\x7f\x2e\xb6\x93\x03\x17\x47\xde\xa2\xbb\x8a\x1e\xf9\x97\xf0\x6d\x9f\xe1\xdf\x79\xc8\xe3\xb1\xc5\xbe\x54\xf4\x6e\x60\xe3\xaf\x23\x7a\xe7\xc1\x99\xc7\x16\x78\x45\xf4\x54\xd3\xd2\x88\xeb\x54\x11\xaa\x5b\x44\x2d\x22\x25\x93\xcd\xc8\xba\x8b\x33\x05\x2d\x8b\x75\x5e\xd2\x4a\x79\xa7\x42\x71\xc6\xa6\xb6\x66\xa0\x9c\xac\xdb\xb4\x44\x9a\x67\xa2\x77\x0b\xeb\x3f\x2f\x7a\xdf\xca\x3f\x74\xc9\x3f\x74\xc1\xbf\x1b\xfa\x7e\x9c\xba\xc9\xc7\x20\xc9\xd4\x4d\xf6\xb6\xcf\xf0\xef\x3c\xf0\xf5\xd8\x22\x5f\x3b\x75\x93\xb3\xf1\xd7\x99\xba\x67\x11\xba\x27\xad\x07\x83\x0b\x1f\x78\x37\xf2\x86\x8f\xe3\x3a\x8c\xe0\x9e\xfe\x95\x37\x58\x1e\x7e\x53\xcc\xc8\xeb\xa2\xfc\xdf\xff\xfd\x34\xd6\x6e\x4d\x2d\xe6\x2b\x2e\xd3\xdc\x42\xb3\x6c\xd9\x36\x33\x2d\xab\xdc\xcc\x14\xeb\x25\xa5\x61\xd8\x96\x5d\x6b\x19\xf5\x46\x83\x14\x1a\x72\xb5\xae\x94\x6d\x9d\x56\xed\x82\x9c\xf9\x0c\xc1\x67\x91\xc0\x27\x2d\xf4\x41\x82\x6d\x63\x57\xfa\x5e\x82\x4f\x23\x8e\x4f\x5a\xec\x1a\xc1\xe8\x94\xe0\xd1\x72\x30\xf8\x3e\x52\x4f\x63\x9a\x4f\x5a\xe0\x97\xe5\xed\x69\xec\xf4\x49\xeb\x63\xbc\xfd\xad\x64\xbb\xb8\xfc\x57\x10\xfc\x10\xa3\x7d\xd2\xba\x2a\xbd\x3f\xce\x08\xf6\x9a\xd5\x9d\x91\x0b\x57\xa1\xaa\xec\x82\x5c\xb6\xd7\x6a\x16\x3b\xdf\x47\xfc\x79\x5c\xf8\xb1\xf5\xc5\x6a\x36\x59\xc7\x7e\x2d\x35\x7b\x1e\xc0\x7e\x6c\x3d\xa8\x59\x69\xcf\xba\xef\xa2\xe5\x3c\x06\xfe\xa4\xf5\x20\x83\xf4\x30\x8c\xdd\x51\x3c\x78\xd8\xc4\x08\xa3\xf9\xc3\x38\x64\xaa\x14\x37\x64\xcd\xc8\x97\x1d\xdc\xca\x97\x30\x51\x6b\xba\xdc\xd0\xb9\x5e\x67\x79\x86\x55\xc5\xac\x3a\x76\xc3\xc9\x28\xd9\x5a\xd1\xe5\xd5\x6a\x25\x8f\x6b\x56\xbe\x5c\x7b\xe4\x71\xc2\x6f\x7f\xba\x5f\x4f\x21\xf9\x27\x2d\xf1\x76\xbf\x92\x8a\xe9\xf7\x8d\xd7\x69\x60\xff\x49\xeb\x6b\x1d\x93\xa4\xc3\x7d\x65\xda\xa1\xe3\x6e\xc2\xb7\xcf\xbe\xf3\x44\x84\x93\xd6\x83\x5d\x13\x8f\x92\x71\xfb\x0a\xfb\x6c\x4f\x41\xb7\x9a\xb9\x7a\x26\x6f\x65\x69\xde\x26\x6a\x49\xb6\x79\x93\xf3\x72\xd3\x6d\x71\xb7\xae\x11\x53\xcf\x67\x33\x8e\xae\xe6\xd4\x7a\x43\x2d\x90\x3c\xb1\x2a\x8c\xe7\xf3\xad\xa7\xad\x96\x64\xdf\xfe\x14\x53\x4e\x73\x21\x4e\x5a\x5f\xab\xcd\x93\xb2\xe5\x57\xd2\xe6\xe7\x49\x1b\x27\xad\x07\x4d\xc3\x1f\xfc\xb5\xd9\x72\xbe\x88\xa2\x87\xb9\x44\x6a\xc5\xb2\x86\xeb\x56\x2d\xcb\x5b\x55\xac\xda\x5a\x05\x5b\xd4\x29\xd9\x4a\x51\x33\x33\x32\xca\x15\x9a\xb6\x5e\xe5\xc5\xa2\x5c\x95\x4b\xf9\xbc\x99\x69\xf1\xaa\x95\xcb\xee\x3b\x7d\x80\x19\x3f\x0c\x81\x5a\x6f\xd0\x82\x5a\x6d\x65\x2d\x6e\x69\xa5\xa6\x2d\xe7\xca\x75\xa3\xd2\x94\x33\x99\x92\xd3\x6c\xb6\x4c\xb5\x94\xcf\x92\x7a\x45\x41\x46\x9e\x37\x50\xc1\x32\x1b\x59\x8e\x9d\xdc\x61\x08\x96\x8b\xce\x78\xd6\xdd\xed\xe9\x89\xbd\xc1\x3c\x7a\xf6\xd9\x82\x71\x78\x20\x52\x73\xaa\x2f\x1d\xb9\x60\x16\x85\xdd\xc5\x9f\xde\x60\xd2\xf1\x46\xcb\x21\x39\xfe\x45\x77\x3e\x5f\x3e\x4a\x46\xd2\xde\x3d\x1a\x86\x64\xdf\xfe\xcc\x70\x9d\x65\xb4\x9c\xb4\xd0\xdf\x62\xb8\x16\xb3\xe5\xcb\xd1\x72\x6a\x99\x7f\xf3\xd1\x7a\xc8\xf6\x39\x69\xfd\x3d\x26\xd7\xab\xa3\xf5\xef\x3c\xb7\x4e\x53\xaa\x4e\x5a\x0f\x8b\x13\x76\x18\xad\x41\x77\xd8\x3d\x68\x7f\x09\x21\x8c\x39\x02\x98\x09\xfa\x4f\xc2\x39\x15\x80\x3f\x8f\xc3\xaf\x33\x9c\xbf\xc4\x4c\x4b\xd8\x81\x4f\x8f\xdd\x53\x16\xdb\x49\x0b\xfd\xbb\x8c\xdd\x5f\x35\xef\xbe\x61\xec\xce\x12\x07\x4f\x5a\xe0\xc4\xd9\xd9\xf7\x29\x1e\x78\xed\xf9\x6f\x7f\xfc\xf8\x7f\xf0\xf7\x1f\xe8\x7f\xf6\xab\xa8\xa7\x5f\xfe\x79\xf8\xf5\x41\x79\xfd\x39\x8b\xa6\xcb\xee\x2c\x0a\x9f\xb4\xd9\x9f\xb3\x68\x35\x0e\x3c\x7f\x10\xfd\xf6\x3f\xdf\xa6\x4a\xce\x32\x0f\x4f\x5a\x5f\xbc\x20\x4d\x2e\x6c\xbf\xce\x82\xf4\x2c\x45\xf2\xa4\x05\xbe\xd6\x45\x4c\x3e\xdd\x7f\x1d\xd6\x9d\x27\x85\x1e\x5b\xe2\x35\x25\x78\x76\xe6\x71\xaa\xf9\x6e\xe0\xe8\x99\xe6\x33\xf3\x66\xd3\xca\x2b\x59\x43\x2f\x97\x31\xa1\xb4\xd1\x6c\xe4\xa8\x9a\x51\x5a\xcd\x4a\xc9\xcd\x56\xab\x39\x43\x75\x8b\x96\x53\xc1\x54\xb5\x2a\xa4\x51\xaf\xe1\x7c\xab\x70\x57\xab\x75\xdb\x76\x48\xc2\x0e\x7c\x6a\xc0\xce\x72\x6f\x8f\xad\x57\xad\x16\x04\xff\x3b\x64\xbf\xc0\x90\x9d\x25\x39\x1f\x5b\xaf\x2e\x12\xff\x77\xc8\x7e\x85\x21\x3b\xcf\x26\x3f\xb6\x40\xd2\xb5\xe1\xff\x8e\xdd\xf7\x8d\xdd\x59\xda\xfd\xb1\xf5\xc5\x0b\xa9\xe4\x23\xf3\xeb\xac\x06\xce\xeb\x0c\x1c\x5b\xa7\x67\x08\xc1\x20\xf2\x66\x2f\x17\xd6\x27\xbf\xfe\xdc\xd2\x5a\x35\xb2\xd9\x6a\x25\xaf\x17\x75\x66\x66\xb8\x9a\xa7\x65\x83\x34\xeb\xaa\xab\x16\x4b\xd5\x52\x96\x59\xae\xcc\x4d\x5b\xad\xe2\xac\xa5\x5b\x66\xab\x62\xbb\x6e\x56\xa1\xda\xa7\x8e\x46\xce\x8b\x1e\x1c\x5b\xe4\xd4\x5b\xe8\xb6\x47\xd1\xec\xcf\x7e\xb4\x7d\x90\x0a\x66\xe2\x46\xb9\x90\x77\x2b\x1a\xcb\xd7\x33\x2d\x4d\x26\x66\xa6\x98\xb5\xed\x72\xc9\x71\x2d\x6c\x39\x7a\x29\x53\x6a\x55\x1b\x46\x5e\x66\x66\xa5\x61\x14\xcd\x96\x6c\x67\xb5\xc3\x70\x3e\x20\xad\xa3\x6e\xbb\xb3\x97\x0d\xf0\x7d\xfd\x3c\x2b\xc9\x70\x6c\xa1\x6f\xe9\x27\xfd\xb6\x7e\x9e\x17\x8c\x38\xb6\xd8\xb7\xf4\x13\x7e\x5f\x3f\xcf\xca\x59\x1c\x5b\xa7\x5e\xee\xd0\x9b\x2f\x1e\xfa\x79\xa4\x10\x7d\x1f\x85\x67\x65\x32\x8e\x2d\xf2\x95\x87\x8e\xdf\xd6\xaf\xa7\xa2\x1d\xc7\xd6\xf5\xfd\x85\xf7\x37\x17\xbe\x4f\xdf\x9d\x17\x0a\x39\xb6\xd8\x35\xea\xdf\xda\x1a\xf9\x7e\x75\x7d\x5e\x9d\xe4\xd8\x42\xbf\x96\xd8\x3f\x57\x3d\x39\xb6\x4e\xed\xe4\x60\xbc\xfe\x73\xd1\x99\x45\xf3\xce\x78\x10\xee\xcd\xc0\xef\x3f\x7e\x1b\x46\xe1\xd9\xef\xd0\xef\x3f\x7e\xeb\x74\xdb\x9d\xf3\x5f\x7e\x77\x37\x1e\x4b\xae\x1c\x5b\xa7\xb3\xb7\x33\x1e\x46\x7f\x86\xe3\xa1\xd7\x1d\xed\xa7\x6e\xb4\xf1\x86\x93\x41\xf4\xcf\x60\x3c\xfc\xe6\xd9\xf8\x5c\xd0\xe5\xd8\x02\xff\x66\xfa\xfe\xa2\x4a\xcc\x73\xeb\x8b\xc3\xff\x93\x75\xec\xd7\x5a\xb9\x9e\x97\xc5\x39\xb6\x1e\x74\x06\x39\xb0\x6e\x32\xeb\x3e\x92\x78\x16\xbb\xfb\x1c\xd3\x8b\xce\x5d\xef\xc3\x9f\xff\xb9\x67\xf5\xbf\x7e\xdb\xcf\x4b\xf8\xfb\x8f\xdf\x46\x07\x79\xf8\xfd\xc7\x6f\xfe\x72\xbb\xef\xf7\xab\x81\xbf\x07\x5d\x3a\x18\x1c\x9f\x5f\x38\x5d\xe7\x0f\xdf\x72\xbe\xce\xff\xf2\xd4\x09\x63\xb9\x12\x2e\x98\x4e\x83\x99\x6e\x95\x6b\x99\xb2\x49\x78\x5d\xd1\x79\x86\xd0\x22\x31\x1b\x7a\x33\x97\x67\x05\xdd\xac\xca\x9a\x41\x4d\xa5\x56\x42\x19\xa5\xe2\xf2\xca\xd3\x78\x24\xfb\x76\x82\xf1\x78\x2c\x2e\x74\x6c\x89\xef\x18\x8f\x0b\x7e\xbf\x3a\x56\xef\xb3\xfb\xe5\xa8\x9e\x01\xfd\x9d\x46\xe3\xbc\xae\xd2\xb1\xf5\xb5\x31\x54\x49\xd9\xf2\x4b\x29\x96\xf3\x42\x52\xc7\xd6\x83\xed\xc1\x1f\x12\x64\xfc\x71\x39\x1e\xc7\x71\x34\xfb\xb3\xfb\xb4\x60\xf8\xab\xd5\x0c\xaa\x18\xae\x8d\x0c\xd9\xc9\x16\xab\xcd\x7c\xa1\x56\x28\x58\x55\x4d\x55\x59\x59\x2d\xe7\xcc\xa2\x9c\xa9\x59\x76\x35\xcf\xed\x5c\xc9\x46\xb5\x6c\x15\xb9\xb9\x46\x46\xae\x66\x9e\x46\x27\xd9\xb7\x3f\x31\x3a\x67\xc5\xb9\x8e\x0d\xf2\x89\xb1\x41\xf7\x19\x9b\x6f\x57\x39\xb7\x8d\x4c\x39\xcf\x95\xb2\x53\x2b\x37\x2c\x5d\x91\x4b\x8a\x5b\x64\x45\xa3\xea\xb6\x4c\x23\x63\x58\x8e\x6b\x5a\x4d\xdd\xd6\xe5\x4c\x96\x53\x47\xab\x1b\x75\xb7\xa1\xeb\xe5\x52\x45\xfd\xcc\xc8\x9c\x56\x3b\x3b\x36\x5e\x3d\x56\xfa\xd0\xfe\x69\xc2\xfe\x5e\xec\x9f\x26\xec\xf8\x5d\xf7\x4f\x7f\xf5\x91\x3b\x2d\x0b\x77\x6c\xa0\xaf\x35\x15\xc9\xc7\xe5\x97\x31\x15\x67\xe5\xeb\x8e\x8d\xaf\x5d\xbc\xdf\x30\x2f\x7e\x19\xc6\x9d\x55\xd9\x3b\x36\x1e\x16\x27\xe8\x3c\x7d\x52\xae\x22\x59\x73\xb5\xbc\x61\x6b\xa8\x90\x37\x68\xb5\xd8\xcc\xd2\xa2\x51\x6f\xb1\x0a\x6f\x1a\x85\x6a\x39\x97\xb1\x11\x2a\x73\xb3\x49\x32\xb5\x46\xb6\xc6\xb3\x99\x8c\x75\x96\xfe\x97\xa9\x36\x30\xa7\x45\xd9\xad\x12\x56\xce\xe4\xb2\xa8\x91\x93\x4b\x15\x15\x55\xab\xad\x02\x2f\x23\xc2\x32\xae\xae\xab\xb9\x86\x5d\x47\x55\x8d\x1b\xba\x86\x2a\x4e\xa5\x70\xe0\xd8\xc4\x5b\x74\x7e\xfb\xe3\xc7\xff\xfb\x9f\x8b\x54\xc0\x57\x72\x01\x3f\x1d\x83\x33\x1f\x2f\x67\x41\xf4\xe7\xd0\xdb\x5c\xc5\x3c\x51\x22\x72\xb3\x98\x25\xd8\xce\xb5\xf4\x06\xae\x94\x70\x55\x2b\x3b\x32\x72\xa8\xd5\xa0\x8a\x2d\x57\x9b\xb9\x9c\x6b\x62\xd3\xc8\xea\x0d\xec\xda\xac\x52\xcd\x57\x0b\x58\xb5\x2c\xe7\xe4\x45\x57\xe9\x7f\x7a\x7e\x3d\xa5\x31\x21\x07\x3f\x23\x11\xa7\x55\x0e\x8f\x0d\xf0\xcb\x4a\xc4\xbf\xae\xa4\x80\xfe\xcf\x5b\x0e\xcd\xbf\x95\xa4\x5c\x2e\x3e\x5f\x93\xa2\x37\x7a\x73\x37\xba\xbf\x4b\x44\xcf\xca\x5e\x1e\x1b\xe4\x65\xce\xf7\x0d\xe2\x75\xcc\x59\x4e\x3e\x8a\x1f\x54\x54\xc9\x17\x34\xb7\x8d\x54\xc2\x6f\x7f\x7e\xa4\x1e\xea\x8a\x1e\x1b\xaf\x3a\x70\xe0\x9f\xf4\x35\x27\x81\xbc\xbd\x13\x81\x7e\x55\x2f\xe1\xef\x31\x34\x8f\x95\x5a\x8f\x0d\xf6\x29\xdf\xfa\x7b\x9d\xeb\x47\x35\x7d\x07\xe7\xfa\x97\x1f\x9c\xd3\xea\xb7\xc7\x46\x62\x17\xee\x06\x1d\x76\xea\xc2\xdd\xa0\x4e\x7f\x0d\x8d\xf7\x0d\xb6\xe9\xb4\xdc\xf0\xb1\x41\xfe\xe2\x91\xbb\x61\xad\x76\xaf\xc0\xf6\x1b\xe7\x5c\xb2\x0e\x7c\x62\xe4\xce\xea\x32\x1f\x1b\x5f\xeb\x7c\xdf\x30\xa3\x7e\x19\x1f\xf2\xac\x7e\xf4\xb1\xf1\xb5\xce\xf7\x0d\x02\xfd\xab\x31\xee\xa1\xce\xf5\xb1\xf1\xc5\x45\x0d\x6e\x70\x4a\x7e\x19\xc6\x9d\x96\xe3\x3e\x36\xd8\x6b\xf5\xc6\x5a\x39\x2b\xef\xd2\x46\x4d\x6f\xe4\xa8\x5b\x6e\x15\x4b\x39\x8a\x72\x6a\x9e\xd6\x54\x93\xb8\x39\xa7\x51\x34\xcd\x7a\xae\x55\xcb\xa3\xac\x45\x14\x03\x99\x86\x59\x42\xea\x99\x03\xa0\xea\x2a\xc9\x20\xb5\x46\xa8\x6a\x56\x4b\x25\x52\x91\x75\x1b\x15\xb2\x2d\xd9\x34\x1c\x6a\xc9\x5c\xa7\x38\x8f\xeb\x65\x8b\x35\x34\x93\x35\x1b\x7a\xa9\x56\x6a\xe5\x2b\xb9\x4b\x07\xe0\x2b\xd6\xff\x49\x49\x7b\x4a\xf5\x4e\xf4\xed\xcf\x0c\xd4\x69\x95\xf2\x63\xe3\xb5\xea\x5c\xbf\xf2\x40\xbd\xba\x15\xf3\x5d\xdc\x7b\x2c\xcd\x7e\x6c\x24\x4e\x70\xbc\x81\x3f\x67\x6b\x89\xe4\x43\xf5\x6b\xc8\x7d\xc2\x0e\x7c\x62\xe4\xce\x6a\xd8\x1f\x1b\x5f\x5d\xe0\x20\xf1\xf0\xfe\x32\x9a\xfd\xac\xd2\xfe\xb1\xf1\xb5\xd9\x64\x37\x08\xf4\xaf\xc3\xb8\xd3\xeb\x00\x8e\x8d\x2b\x8b\xb0\x8c\x5a\xb7\x95\x5c\x4d\xd3\x1c\x9e\x2f\x34\x9d\xa2\x5e\xac\x35\x15\xb9\xd0\x34\x91\x4d\x0c\x94\x2f\x5b\xcd\x06\xaa\x51\xbb\x5a\xc8\x67\xaa\x86\xdc\xcc\x50\x27\xa3\xcb\x6e\xf9\x85\xc4\x29\x3c\x6b\xb9\xb9\x42\x81\x55\x4d\xcc\xf5\x7c\x55\x76\x1b\xd4\x96\x1b\xc5\xac\x92\xcb\x65\x73\x45\x62\x14\x99\x56\x55\xd4\x56\xd3\x40\x4a\x8b\x94\xcb\xe5\x26\x72\xe4\xab\x25\x24\xe9\x25\xdb\x12\x92\xf9\x09\xb6\x9d\x5d\x59\x70\x6c\x7c\xf1\xa2\x3f\x39\xf7\x7f\x19\x79\x3b\xbb\x57\xe1\xd8\x78\x65\x09\x76\x97\xba\x91\x39\x8a\xec\x06\xab\xc8\x0a\xb3\x73\xa5\x62\xd9\x2e\x60\xe4\x92\x22\x76\x2a\x95\x42\xa9\x54\xd2\x2d\x4d\x77\x65\xc3\xad\x5a\xac\x96\xcd\xb2\x96\x5c\xaf\x66\x69\xab\x92\xb8\xe4\x6b\xb2\xb7\x25\xe2\x9e\xb8\xe0\xde\x97\x54\xdd\xfc\x37\xe3\xde\xd9\x75\x15\xc7\xc6\x17\x1b\x89\xe4\x4c\xfc\x65\x26\xed\xd9\x9d\x1a\xc7\xc6\x2b\x07\x27\x77\x11\x3b\xc2\xea\xd5\xbc\xa2\x16\x0c\xd4\x64\x99\x66\xa1\xc9\x65\x43\xab\x57\xb3\x05\x1d\x3b\x32\x6f\x2a\x1a\x2e\xe5\x4a\x16\x2b\x73\xa2\x57\x68\xa1\xa9\x17\x73\x76\x1d\x99\xca\x85\xd8\x7d\x54\xea\x92\xbd\xec\xf3\xcc\x7b\xb8\xfd\xe3\xd8\x78\xc5\x97\xf9\x5f\xe6\x5d\x61\xde\xe3\x3d\x25\xc7\xc6\x57\x99\x8b\x7f\x4b\xe6\x3d\xdc\xa8\x72\x6c\xbc\x52\x5e\xfd\x7f\x99\xf7\x92\x79\xa7\x97\xbf\x1c\x1b\x5f\xbc\x3b\x99\x9c\x87\xbf\x8c\xb1\x38\xbf\xeb\xe6\xb9\xf1\xc1\x4c\xa0\x4c\x33\x2b\xe7\x4c\xb5\xa6\x1a\x44\xcd\x23\x57\xcf\x33\xb7\x5a\x90\x99\x9d\xd7\x9a\xd9\x6a\x93\x2b\xc5\x5c\xbd\x58\x29\x2b\xc5\x82\xa1\x39\x66\xd5\xa4\x6e\xa5\x54\x28\x1a\x9f\x19\xd8\xf3\x1b\x74\x9e\x1b\xec\x1d\xfa\xe0\x37\xd3\xf7\x78\x2f\xcf\x73\xe3\x8d\x84\xd0\x0c\xd6\xb8\x9e\x2f\x56\x4b\x36\xd3\x73\x4a\x4e\x57\x6c\x66\x30\x53\x23\x25\x54\x23\x0d\x9a\x6f\x21\xc2\xec\x9c\x49\xf2\x95\x5a\xd3\x44\x16\x51\x9a\xaa\x63\x55\x8a\xd6\x1b\x89\x33\xdf\xd6\xcb\xc7\x3b\x83\x9e\x1b\x6f\x65\x63\xa1\x4f\x66\x63\x7d\x7d\x27\xce\x2e\x19\x3a\x36\xbe\xb8\x86\x4d\xb2\x6e\xfd\x52\x3a\xe2\xec\x2e\xa4\x63\xe3\xab\x4f\x30\x0c\x8c\x1d\xb5\x50\xb1\xd5\x7c\x11\x95\x8a\x55\xa5\xc6\x9b\xae\x52\xa5\x98\x16\x0a\x5a\x5d\xd6\x0b\xd4\x55\x4a\x24\x6b\xab\x0a\xd1\x5b\xba\xcd\x5b\x32\x55\xeb\xf9\xef\x61\xdc\x3b\xf7\x2a\x2d\x66\x5e\x18\xdd\xe7\x4e\xa5\x07\xa8\x2b\xd9\x12\x7b\xde\x23\x00\xa5\x7f\x00\xf6\x0f\x80\x7f\x40\xf6\x07\xa6\x7f\x50\xf0\xf3\x10\xda\x01\x1f\xc6\xe7\xb9\x30\xee\xef\x3f\x20\x3e\xd4\x37\x3c\xf9\xcd\x63\xa9\x4e\xf8\x94\x33\x74\xed\xd6\xb4\x0b\x2a\xce\xe2\x49\x5f\x25\x82\xb0\x9f\x0f\x5e\x2e\x3d\xe0\x42\x70\x42\x05\x3b\x50\x71\xfa\xab\x87\xa2\x86\xf0\x29\xf8\x90\x30\x08\x99\x60\x10\x10\x8c\x18\xc7\xfb\xfe\x7e\x90\xae\xd3\xa8\xc6\xd7\xe9\xa2\x3f\x1f\x5e\xf4\xe8\x84\x9f\xd2\x45\xcf\xb9\x73\x64\xcf\x63\x8a\xdb\x13\x55\x00\x60\xc8\x39\x60\x87\xba\xb6\x09\x08\x83\x57\x09\x3b\x32\x0c\xbd\x64\x18\xfa\x00\xc3\x8e\xa4\x7d\x48\x48\x47\x73\x2f\x78\x71\x93\xd8\xbd\xc4\xf6\x55\xf0\xa3\x20\xbf\xb8\x0d\xec\x3a\x27\xdf\x46\x42\x2f\x6e\xec\x4a\x8a\x84\x5f\xdc\xaa\x95\x14\x89\xbc\xb8\x02\x2b\x29\x12\xbd\xbc\xa6\xea\xda\xa5\x76\xef\x22\xb1\x17\x17\x5e\x25\x45\xe2\x97\xf7\x3f\xbd\xa1\x36\xde\x46\x12\x97\x37\x21\x25\xee\x9d\x74\x89\x94\x98\x26\x08\x5e\xdc\x91\x93\x18\xea\xc5\x75\x45\xd7\x2e\x49\x7c\x1f\x0a\x5d\xde\x3c\x93\x9c\x2a\x7c\x09\x95\x9c\x2a\x72\x79\xa9\xcb\xb5\x7b\xbc\xdf\x87\xa2\x97\xd7\xad\x24\x87\x62\x97\x17\xa1\x24\x87\xe2\x97\x17\x95\x24\x87\x12\x97\x57\x88\x24\x87\x92\x2e\x2f\xf7\x48\x0c\x85\xc0\xe5\x55\x1b\x89\xe5\x0a\xc1\x4b\xa8\xe4\x54\xa1\xcb\x5b\x2c\x92\x53\xf5\xe2\x12\x8a\x6b\x97\xf1\xbf\x0f\x45\x2e\xef\x7d\x48\x4e\x15\xbd\xbc\x6a\x21\x39\x14\xbb\x84\x4a\xde\x41\x7e\x79\x7d\x01\x4f\x0c\x25\x2e\xa1\x92\x77\x50\xba\xbc\x3f\x20\x31\x14\x06\x97\x50\x89\x3b\x88\xe1\x65\x69\xfe\x6b\x37\xc6\xbf\x0f\x85\x2e\xa1\xae\xdd\x87\xff\x3e\xd4\x8b\x0a\xf4\xc9\xa9\x22\x97\x50\xc9\xa9\xa2\x97\x95\xd6\x93\x43\xb1\x4b\xa8\xe4\x1d\x7c\x51\x51\x3c\x39\x55\xe2\xb2\xc0\x75\x72\x28\xe9\xb2\xde\x72\xe2\x0e\x1e\x02\x2a\xce\xea\x1c\x27\x9e\x38\xa7\x75\x7f\x1f\xa0\x12\x77\x90\xa0\xcb\x12\xc2\xc9\x3b\x88\x2f\xa1\x92\x77\x90\xbc\xa8\xce\x0b\x12\x63\xd1\x17\x85\x63\x93\x63\xb1\x17\x15\x4d\x93\x63\xf1\x17\xa5\x36\x93\x63\x89\xcb\xd2\x8f\xc9\x59\x2f\xbd\xa8\x22\x99\x98\x2c\x0a\x5e\x94\x55\x4c\xee\x7a\xc1\x17\xb5\x0c\x93\x63\xa1\x17\xf5\x02\x93\x63\xe1\x17\x35\xf9\x92\x63\x91\x17\x75\xef\x92\x63\xbd\xac\x50\x97\x1c\x8b\xbd\xa8\x0a\x97\x1c\xeb\x65\x8d\xb6\xe4\x58\xe2\x45\xc1\xb4\xe4\x58\x2f\x4b\x9b\x25\xc6\x3a\x4c\xe6\xf3\xfa\x62\xc9\xb1\x5e\xd6\x00\x4b\x8e\x85\x5e\xd4\xd9\x4a\x8e\x85\x2f\xb1\x92\xef\x85\x90\x17\x35\xac\x92\x63\xd1\x17\xf5\x97\x92\x63\xb1\xcb\xea\x41\xc9\xa1\x5e\x16\x22\x4a\x8e\x25\x5e\x54\xe6\x49\xbc\x65\xc0\xa4\xcb\x42\x32\x89\x77\x6a\x38\xb8\xac\x7c\x92\x1c\x0a\x5e\x94\xe2\x48\xcc\xab\xbd\x4e\x38\x2f\xea\x91\x9c\x28\x7c\x51\xe6\x22\x39\x51\xe4\xb2\x60\x46\xe2\xf1\xe3\xf4\xb2\x84\x44\x62\x77\x73\xaf\x8a\xcf\xa1\x12\x7b\x63\x9c\x5f\x96\x31\x48\x4e\x95\xb8\x84\x4a\x4e\x95\x74\x99\xb9\x9e\x78\x47\x64\x6f\x02\xcf\xa1\x12\x77\x50\xbc\xc8\xd2\x4e\x4e\x15\xba\xcc\x2a\x4e\x0e\x85\x2f\x73\x60\x93\x77\x90\x5c\x26\x65\x26\x1e\x41\x41\x2f\xb2\x04\x13\x4f\x41\xc1\x2e\xf3\x0d\x93\xf7\x8f\x5f\x66\xe0\x25\xef\x9f\xb8\x80\x4a\xde\x3f\xe9\x22\xbb\x2d\xf9\x56\x3e\xb8\xcc\x93\x4b\x2c\x54\x12\xbc\xcc\x1c\x4b\xec\xb6\xee\x17\x09\xe7\x50\x89\xdd\x56\x09\x5f\xa6\x49\x25\xa7\x8a\x5c\x42\x25\xa7\x8a\x5e\xa6\x1f\x25\x87\x62\x17\xf9\x30\xc9\x65\x81\x5f\x66\xd6\x24\x67\x95\xb8\xc8\x35\x49\x4e\x94\x74\x99\xb5\x92\x98\x53\xf0\x70\xa4\x70\x9a\xc8\xf1\xd6\x59\xf7\x7b\x58\xf0\x12\x2b\xb1\x1f\x0d\x01\xba\xc8\x94\x48\x7e\xdc\x04\x2e\x93\x2e\x6e\xe9\x22\xb9\x8c\xa4\xbf\x81\x2e\x7a\x89\x95\x1c\x8a\x5d\x84\xa8\xdf\x00\xc5\x2f\xa1\x6e\xc0\x12\x17\x01\xe0\xe8\x86\x53\x51\xe9\x12\x2b\xf9\xa9\x28\xb8\x08\xad\xbe\x81\x2c\x78\x19\xa6\x7d\x03\x59\xe8\x22\x68\xf9\x16\xb2\xf0\x25\x56\x72\x28\x72\x11\x0e\x7c\x0b\x59\xf4\x12\x2b\x39\x14\xbb\x08\xb4\xbd\x01\x8a\x5f\x42\xdd\xd0\x43\x71\x11\xc6\x8a\x92\x1f\x6e\x43\xe9\x22\xe4\xf4\x06\xac\xc3\x09\xd8\x69\x78\xe8\x2d\x58\xf0\x22\x08\xf3\x16\x2c\x74\x11\x0b\x99\x7c\x18\x11\xbe\x84\xba\x81\x2c\x72\x11\x69\x78\x03\x59\x97\x41\x8b\x67\xc1\x51\x1f\x8b\x89\xfa\xb3\x1b\xfe\x39\x8f\xa6\x4f\xa1\x51\x35\xad\xe2\x68\x25\x55\xfb\x51\xd3\xec\x77\x82\xa3\x6a\x5a\x41\x53\xed\x1f\x93\xf6\x9f\x81\xb7\xf0\x06\xe3\xf6\x3f\xe7\xd1\x62\xe5\x0d\xfe\xcf\xcf\x0f\xbe\xf3\xe7\x9e\x7a\xfa\x10\xf2\xf5\xa9\xa0\xae\xbb\x07\x72\x1d\x79\xfa\xd3\x0f\x20\xf4\x69\x40\x60\x18\x71\x09\x62\x26\xc5\xa1\xa0\xb1\x07\x83\x20\x06\x30\xc0\x34\x40\x20\x8c\x69\x2c\x89\x38\x46\x31\xa7\x21\x40\x91\x17\x32\xe8\xc7\x21\x45\x20\x42\xf0\xe7\xef\x3f\xd8\x63\x24\x5c\x4e\xad\xb4\x2c\x6c\x38\xbc\xe9\x30\xcd\x64\xd8\x6c\x35\xf3\x6a\xa5\xec\xda\xa8\x5a\x6a\x96\xb0\xae\x50\xb5\xa4\x6b\xa5\x92\xa3\x39\x7a\xad\x28\x93\xba\x63\x9a\x66\x4d\x2b\xfd\x3c\xe8\x8c\xa7\x0f\x3e\xc4\xf2\x5d\x89\xad\xc3\xf8\x9f\x18\x12\x04\xf6\xaf\x7d\xfb\xe9\x79\x48\xda\x4f\x79\xff\xc9\xe7\x9a\xbc\x6a\x4b\x2c\x32\x46\x08\xd0\xe5\xd8\xd1\xdd\xd1\xb4\xe0\x2f\x50\x60\x55\x4b\xe5\xea\xcc\xd3\xc6\x91\x2d\x07\xb3\x6a\xde\xd9\xff\x79\x6b\xff\x9f\xd6\x6c\xb5\x0a\xed\x8c\x7c\xfe\x51\x8e\x3f\xce\xf7\xcd\x2c\x6a\xd4\x88\xbc\x3e\x3e\xd7\xf3\xa0\x36\x38\x7c\x5f\x0d\x0c\x16\x6d\x40\x66\xca\x5c\xb9\xc3\xbc\x3c\x24\x3d\x7d\xb3\x94\x57\x9d\x55\x3e\x87\x52\xa5\xe5\xce\x1f\xcb\xf9\x59\xec\xaa\x9e\x0a\x5b\xb5\x0a\xe7\x8a\xab\xa7\x69\xb1\xdd\xb1\x9a\x12\x37\xcb\x52\xa3\x59\x87\x3c\xea\x94\xf2\x3c\x04\xcb\xe1\x46\x69\x7b\x66\x4f\xc8\x3f\x9f\xfa\xb4\xff\xe4\x2a\x47\x72\x8e\x3f\x16\x4e\xe8\xfd\xef\xe7\xbf\x3f\x3c\x37\xf6\xff\x1d\xfa\x64\x9d\x7c\x75\xdc\x8a\x17\x59\x0b\x4f\x48\x37\xf6\xed\x21\xeb\x54\xc2\x6e\x34\x5e\x2c\x71\x6b\x2d\x69\x80\xe6\x16\xe3\x5a\x87\x16\x95\xed\x42\x9b\x1c\xbe\xa4\xd6\xe5\x55\x37\x38\xf2\x48\x95\x5f\xfd\x68\xaf\xff\xfa\x91\x87\x77\x7c\xff\xe5\x18\x7d\xe8\xfd\xb2\xfc\xdf\x47\xde\xb4\xf7\xff\x15\xf7\xff\x89\xe3\x9f\xa9\x9d\x41\x0a\x38\xe9\x68\xd4\x35\xa5\x45\xd9\x9f\x66\x15\x64\xb2\x2e\xe2\xe1\x28\x03\x6c\xbb\xef\xa1\x4e\x5e\xef\xaf\x9f\xc7\x5b\x36\x1d\x35\x55\x38\xc8\x4f\x35\x1c\xf4\x97\x0f\xbc\x7e\xf9\xa9\x5c\x23\xeb\x40\xaf\x74\xdb\xfb\xcd\x75\xb2\xf7\x3f\xf0\xe2\x5f\x23\xb5\x3c\x9a\x87\x32\x5b\x0e\x65\x23\x1a\x76\x17\x91\xb1\x11\x7e\xbb\x40\xfc\x6d\x67\xb1\xea\xf9\x73\xc4\x64\x75\x8a\x91\x3c\x6c\x2f\x1a\x4e\xbf\x9c\x5a\x37\x94\x74\xca\x36\x0c\x1b\xa6\xa3\xad\xbd\xaa\x0f\x60\x18\xe1\xb1\x5d\x5b\xe2\xb0\x30\x99\x57\xdc\x5c\xd7\x4d\xef\xc1\x0f\xc1\xda\xa3\xf1\x28\xfa\xf9\xfb\x8f\x92\x53\x28\x3c\xfd\xff\x18\x03\x0b\x3e\xe0\xe3\x9c\x68\xae\x40\x40\x8c\x7c\x89\x06\x00\x30\x1c\x78\x71\x88\x80\x8f\x58\x88\x78\x0c\x58\x00\x51\xc4\x84\x60\x40\x0a\x51\x28\x85\x98\x23\xe2\x0b\x02\x04\x82\x91\x60\x50\x70\xe0\x8b\x3d\x11\x8f\xc9\x80\x77\xd2\x5c\xe8\x3d\xcd\x85\xf7\xae\xe6\x55\xcd\xb5\x7f\x4a\x7e\x5e\x86\xc0\xde\xaa\xb9\x2e\x67\xe5\xeb\x9a\xeb\x28\x0d\xa7\x9a\x8b\xe8\xdc\xce\x8c\x16\x65\xa7\x99\x29\xb6\x49\x31\x1e\xab\xd6\xc0\x2f\x54\x2b\x2d\x9d\xd7\xd7\xa5\x89\xa3\x17\x57\x8b\x51\xb5\x31\x6d\x18\x5d\x37\x3d\x1d\xb9\xee\x12\xf8\xab\xb6\xeb\xd4\x17\xe3\x6c\xb9\x1c\x4d\xb5\x41\x35\x5f\x70\xa7\x8b\x72\x03\x67\x77\x52\x37\x3f\x00\x8d\x8a\x79\x37\xcd\x75\xf2\x47\x49\x34\x07\x3c\xf2\x48\x79\x7d\x8a\xbc\xa3\xb9\xee\xf7\xfe\x44\x9a\xf3\x8a\xe6\xe2\xc7\x3f\x4b\xa2\x39\x8a\x44\x7e\xd6\x1c\x57\xde\xff\xb6\xe6\xba\xa3\xe6\xfc\xcc\xfb\x1f\x35\xd7\x52\x49\x81\x35\xe5\xf6\x20\xbb\xde\x19\xe5\x8c\xce\xe4\x1e\x6d\x6c\x81\x93\xab\xa6\x60\x90\xf1\xea\xca\xae\xc0\x5b\xa0\x3e\x1d\x74\x8d\xa1\xc5\x26\x28\x57\x58\xe4\x38\xc9\x65\xb3\xbe\xa7\xd8\xbd\xd1\xb4\x63\x3a\xb5\x2e\xca\xcf\xec\xc1\x62\x13\xa4\xdd\xee\x24\xcc\xf6\xd5\xca\xbd\x35\x17\x27\x3e\x43\x21\x45\x18\xc2\xc8\xc3\x31\xe1\x98\x4a\x31\x27\x7c\xbf\xac\xa5\x98\xe0\x58\xe2\xcc\x8b\x3d\x12\x87\x18\xb0\xc0\xf3\xa2\x38\x8a\x68\x14\x87\xbe\xef\x43\x40\xe2\xf8\xe7\xef\x3f\x0e\x27\xce\x77\xd3\x5c\xf0\x3d\xcd\x45\x18\xa2\xfc\xaa\xe6\x7a\x7a\x7a\x1e\x72\x7f\xab\xe6\xba\x9c\x95\x17\x9a\xeb\xe1\xd3\x3a\x79\x7e\xd4\x5c\x72\x79\xb6\x6a\xd5\xb2\x23\x1b\x9b\xab\xa1\x0d\x2d\x3a\x30\xd3\x83\x76\x7b\xd2\x8a\xc8\x68\xa3\xd3\xc6\xca\x94\xf2\xe9\x5a\xa1\x9c\x21\xd2\x3a\x9e\x4e\x05\x99\x2f\x47\xc1\xb8\x65\x8c\xb0\x21\xc7\xc0\xd2\x36\xc5\x35\x8e\x16\x4b\x9a\xed\x66\xea\x6b\x1c\xe0\x9e\xeb\x76\xe4\xc2\xbd\x34\x57\xf9\xb8\x4e\x4c\xa2\x39\x7a\xe5\x23\x8f\x5e\x9f\x21\xef\x68\x8e\x3b\xbe\x3f\x91\xe6\xbc\xa2\xb9\xd8\xf1\xcf\x92\x68\x8e\xf2\x61\x29\xf8\xa0\x39\xae\x7c\xde\xd6\x5c\x77\xd4\x9c\x9f\x79\xff\xa3\xe6\xca\x4c\x39\x72\x3a\x2d\x20\x6d\x7d\xda\x97\xec\x54\xab\x16\x53\xd7\xc8\x37\x9a\x4b\x53\x54\x53\xf5\xd9\x36\xae\xad\x40\x77\xd7\x4e\x59\x81\xce\xa6\xab\x72\xa1\x30\xc1\xf9\x5c\xcd\x94\xb6\xb2\x2e\x65\x36\x45\xbb\x58\xc2\x33\x7f\x59\x75\xdb\x30\x28\xe1\x12\x41\x39\xa3\xa2\xae\xef\xad\xb9\x04\x92\x42\x8a\x63\x14\x06\x51\xe4\x47\x10\x78\xb1\x00\x80\x53\x46\x7c\xe0\x45\x71\x18\x09\x28\xf9\x12\xe5\x98\x78\x21\xc1\x30\x8c\x05\x41\x1c\x30\x0a\x23\x1e\x85\xc2\x93\xc0\x5e\x73\x89\x9b\x35\xd7\x53\xf2\x0b\x3d\xa4\x3a\xbf\xad\xb9\x28\xc7\x92\x74\x55\x73\x3d\x3d\x3d\x4f\xf1\x49\xae\xb9\x32\x7d\xf9\x5c\x53\xc9\xf2\xd5\x35\xd7\xc9\xf3\xa3\xe6\xca\x4c\x81\x59\xef\xe4\x4b\xc6\x54\xf2\xda\x60\x5e\x4d\x55\xd3\xc1\x0a\x87\xd2\x42\x5b\x7a\xae\x36\x44\x8a\xb7\x33\x76\x46\xa1\x1a\xe6\x7a\x92\x37\xf0\xea\xc5\x96\xd2\xd9\x8c\x4d\xdc\x32\x26\x16\x9e\xcd\x3c\xd5\xdc\x6d\xc7\xf9\x56\x39\x35\xa1\xba\x52\xdf\x8f\x10\x4a\x39\xb9\xbb\x69\xae\x13\x85\x93\x44\x73\x8c\x8e\x3c\xba\xf2\x79\x47\x73\xdd\xef\xfd\xc9\x34\xd7\x9d\xb5\x55\xb9\xf2\xc6\x3b\xdf\xd6\x56\x7f\x91\xb6\x7c\x55\x73\xd3\xdb\x68\x79\x78\x51\xf9\x6a\x7f\xbf\x87\x17\x9f\x7f\xff\xa3\xe6\x66\x0b\xb5\xee\xd6\x7a\xb5\xfc\xaa\x31\x2e\x15\xb4\xb8\x1f\xe3\x82\x84\x63\xbf\x5a\x18\x0e\x15\x73\xd1\x6e\xcc\xb7\xc5\xad\x0a\x9a\xd5\x71\xba\x31\x69\x0c\xec\x5c\xc5\x0d\x3c\x35\x44\xb5\xbc\x2d\x31\x86\xda\xdd\x40\x4c\xd5\xa1\xbd\x9a\x46\xd5\x75\xbd\xb9\x08\x73\x8b\xd5\x40\x69\xdf\x5b\x73\x83\x88\xfa\x21\xc6\x08\x49\x30\xc2\x40\x12\x11\x91\x84\x60\x61\x8c\x82\xd0\x97\x7c\x8a\x99\xe4\xd1\x58\x8a\x80\x27\x49\x1c\xc7\x20\x94\x22\xe8\x49\x44\x48\x01\xa3\x02\xfa\x1e\xda\x6b\x6e\xfe\xa8\xb9\x93\xa6\x5b\xff\xfe\xe3\x90\xe1\xf2\xa6\xbe\x66\x82\x81\xeb\x3e\xf2\xd3\xd3\xf3\xf4\xc7\x07\x79\xcc\x15\x84\x5e\x59\x55\xfa\x7e\x1e\xe9\x32\x6e\xd4\x7b\xd5\x59\x7e\xd8\x6b\x02\x10\xe7\xc4\xbc\x60\xf0\x21\xd0\xaa\x6b\xb3\x91\x96\x9b\x58\x3e\x5f\x39\x7a\x17\x03\xfb\x42\x37\x24\xd0\x35\xa7\x4a\x4e\xa9\xaf\xd6\x59\x69\x7d\xd0\xef\xba\x23\x51\x4d\x5a\x6f\xda\x9a\x9d\x11\xf6\x74\xe3\xcc\xfa\x6d\x15\xa4\x79\x53\xdf\x96\x32\x8b\x39\xab\xd0\xce\xb2\xaa\xc7\x99\xea\xb6\x1a\x8c\xf5\x70\xc5\xbd\xe2\x24\x3d\xb7\x56\x2a\xae\x5a\xfd\x66\xaf\x5c\xec\xb5\xfd\xbc\xe9\x34\x79\xad\xad\x6d\x9c\xc8\x55\x68\x2c\xb2\x1f\xd0\xef\x67\x82\x7b\x55\xbf\x9f\xfc\xbd\xbb\x5a\x87\xaa\xa4\x56\xe7\x33\x37\xc8\x84\xad\x46\x29\x37\x9f\x7a\xa5\xd8\xae\x0a\x7f\xbb\x9e\xf7\x96\x7e\xa5\xaa\xcb\x03\x5f\x28\x71\x50\xc8\xcd\x5a\xae\x14\xb6\x36\xfe\xf1\xeb\x27\xec\xd5\x3e\x8b\x27\x5f\x7e\xf7\x95\x8f\x72\x67\x7a\xbd\xef\xa0\xf7\x61\x87\xf8\x52\x67\x2a\xdd\xb4\x02\x0a\xc0\xcc\x6d\x17\x9d\x75\x09\x0e\x5c\xe0\x6d\x27\x63\x28\x95\xf4\xcd\xaa\xa0\x6e\xcb\x74\xa1\x68\x81\xfa\x20\x43\x73\x6f\x31\xe8\x41\x38\xca\x1e\x5d\x20\x65\x7c\x84\xaa\x7c\x16\x4f\xbe\xf8\xee\x6b\x1f\xed\x46\x7a\xbd\xce\x76\x0c\xbf\x91\x5e\x59\xfe\xeb\x6c\xd2\xab\xf6\x11\x27\xe7\xdd\x7e\xac\xf5\x93\xdd\xb9\xfe\x17\xf3\xee\xd6\xb1\xbe\x94\xcd\xaf\xa4\xf7\xd1\xfe\x6e\xa0\x15\x55\xad\xa0\xe8\x2a\xda\x3a\xad\xb1\x79\x3d\x4f\x0d\x79\x61\xa5\xe0\x46\xf4\x2a\xdc\x2f\xf7\xcb\xae\xdf\xaf\xe2\x35\x08\xfa\xcd\xbc\x82\xfd\x14\xea\xe5\x63\x9e\xe1\xeb\x05\xb0\x69\x96\xec\x7a\x06\xc9\x6d\xbb\xf5\x6c\x0a\x8c\x95\x62\x5d\x1f\xca\x51\x33\xad\xdc\x7d\xcf\x07\x79\x02\x50\x0e\x51\xc0\x42\x08\x62\x29\xe2\xc4\xf7\x41\x10\xc4\x94\x78\x91\x84\x3c\xe4\x13\x1f\x46\x54\x30\x42\x61\x1c\x09\x88\xb1\x87\x08\xc6\x02\xb2\x98\xf9\x94\xf1\x60\x6f\x7f\xd9\xa3\xfd\x95\x4b\xd9\x56\xa6\xaa\xa8\x25\xdb\x69\x1a\xe5\x8c\x6a\x6a\x6e\x51\x56\xad\xa2\x5a\x6b\x69\x75\x8d\x34\x5a\xb9\x16\x56\x5b\x99\x16\xb6\x50\xad\x99\x27\x79\x9d\x53\x23\xcf\xdc\x9f\xc7\xc4\x7a\xf8\x50\x39\xe7\x4d\x4b\x2c\x00\x13\xe2\xaa\x25\x7e\x7a\x7a\x5e\x3e\xe0\x41\xf2\x95\x49\xd0\xeb\x6a\x76\x0b\x2c\x3b\xeb\x8d\x69\x76\xda\x8a\xe5\xe6\x1b\xb5\xba\xb9\x45\x76\x0b\x15\x0c\xc1\xe3\x69\x1d\x06\x4e\x9c\x3e\xf1\x9c\x0e\x5a\xf4\x0d\xcf\xe9\x41\xb3\xe6\x06\xdb\xb2\x51\x2d\x8d\x6a\x4c\xcf\x68\xfd\x61\x4e\xd6\xa4\xf6\xa4\x65\x3a\xa3\x42\xab\x34\x72\xe7\xbd\xdd\x22\x35\x69\xd6\x37\xd5\xb4\x74\x2a\x32\x4d\x48\x4e\x9b\xcf\xcf\x15\x39\xcf\x26\x41\xd3\x2d\xee\x64\x6d\xa8\x03\xa1\xb6\x60\xa1\x31\x5c\x2d\x4a\x99\xbc\xb7\xec\x6c\x52\x65\x63\xb8\xb0\xd2\x85\x3e\xe9\xd4\xed\xa2\x59\xad\x2b\xe5\xc8\xaf\xcf\x69\x43\xb3\x7a\x52\xb7\x36\x6b\xe7\x6c\xa0\xcd\xd7\xcb\x8c\xda\x42\x5d\x2a\x6b\xbb\x75\x3b\x37\x8e\x25\xb9\x7d\xa2\x05\xe4\xab\x16\xf9\xb4\xaf\xd7\x2d\xf2\xc9\x1f\x7d\xb2\xef\x27\x1e\x4f\xf0\xda\xf4\x39\xe3\xeb\x2b\x1f\xe5\xce\xef\xbf\xe7\x5e\xd1\x89\x46\x95\xbd\xa6\x41\x3a\x1a\x0a\x0b\xe3\xa0\x58\xab\xb9\xae\x6c\x23\x75\xd0\x1f\xd4\x82\x45\x1f\x85\xdd\xad\x55\xc6\x6c\x10\x36\xb3\x7a\xfa\xb0\xe3\x7e\xa2\xdd\x4b\xeb\x37\xd8\xf2\xb6\x86\x24\xb7\xbd\xff\xc1\xe3\xf8\xfc\xfb\x1f\x35\xde\x57\x09\xed\x7d\x35\x1e\xf5\x7d\x3f\x0a\x63\x9f\xa2\x28\x0e\x61\x48\x43\x89\xe3\x08\x21\x4a\x00\x20\xc4\x43\xdc\x17\x10\x52\xce\x11\x86\x04\x49\x38\xc2\xbe\x27\x7c\x18\xfb\x10\x45\x0c\x07\x1e\xda\x13\x71\xc8\x43\xbb\xd1\xe3\xa0\xef\xe9\x39\x09\xf1\x37\x3c\x8e\xa7\xa7\xe7\x25\x49\x6e\xf5\x38\x5a\x17\x03\xfb\x62\x6e\x24\x98\x6b\x57\x3c\x0e\x45\x2d\x16\x7b\x4d\x69\x53\xc6\xcd\xfc\xa4\xc2\x96\xb5\xb4\x03\x95\x69\xb8\xab\x76\x6a\x8a\x5b\xc1\xb4\xbb\x1a\xb6\x36\x96\xd2\x8e\xa7\x95\xb9\x9d\x19\x7a\x50\xd9\x95\xe7\xd3\xb4\x3f\xd4\x4d\x62\xa5\xe2\xbe\x6b\x56\x4d\x27\x6c\xb5\xbc\x5d\xd3\x2c\xa2\x2e\x19\x66\xf9\xc8\xd1\xef\xe5\x71\x9c\xce\x81\x4f\xae\xe0\xfd\x5a\x64\xd6\xc1\xc9\xd7\x8f\x3f\x7e\xdd\x0a\xfe\x8e\xf4\x7e\x8b\x87\x74\xe2\x71\xdc\xb0\x0a\x5d\x98\x64\xd0\xfc\xee\x55\xe8\xdf\x68\xd5\x2c\xcb\x7f\x9d\x4d\x7a\xd5\x3e\xa2\xe4\xbc\xdb\x8f\xb5\x7b\x14\x53\xa5\xfd\xc5\xbc\xbb\x75\xac\x2f\x65\xf3\x2b\xe9\x7d\xb4\xbf\x95\x5e\xc6\x80\xe9\xc0\x5e\xc0\xed\xd4\x29\xcf\xfa\x2b\x58\xaa\x78\xa3\x00\xb8\x4e\xbb\xa1\x95\x52\xee\x8c\x0e\x03\x7b\xed\xea\xac\x5f\xd0\xd6\x74\xb8\xa8\x04\xbb\x59\x7e\x85\x68\x67\x1b\x65\xd2\x23\x9a\x53\x9d\x5a\x5d\x6f\x34\x1a\x73\xb8\xb5\x4b\xe3\xa5\xd9\x89\x28\x54\xee\x7f\x56\x43\x7d\x3f\x44\x3e\xa5\x82\x32\x4c\xa1\xf0\xb0\x88\x24\x9f\x13\xc9\x0f\x89\x2f\x82\x28\x64\xc0\x97\x62\xdf\xf7\xb9\xc7\x7c\x24\x70\x04\xa9\x17\x49\x82\x12\x81\x01\xf2\x02\xb2\xb7\xbf\xe4\x76\xfb\xfb\x50\x02\xef\xe1\x2a\xe2\xd7\x2c\x2c\x01\x0c\xa0\xab\x7e\xc6\xf3\xd3\xf3\xe2\x5b\x89\xec\xef\xf6\x38\x90\xee\xc5\xc0\xaa\x17\xf2\x28\x2b\x66\x64\x0f\xf3\x55\x38\x9d\xa5\xd4\xd6\xd8\xd8\xf6\xe4\x38\xb7\x99\x19\xcd\x56\x7a\x61\xc0\xba\x11\xa2\x72\xdc\xea\x57\xc7\xeb\xcc\xee\x74\x29\xf8\xec\x67\x3c\xda\xf3\x5a\xb3\x4f\xbb\xfd\xd0\x9b\xa6\xdb\x43\x4f\x2d\x8e\xd7\xfa\x66\xee\x6d\xb3\x28\xe6\xb5\x52\xbd\xa6\x87\xbd\x11\x6a\x69\x5e\x51\x16\xa9\x5b\xe5\x55\x89\x9b\x9d\xd3\xfe\x9c\xec\x38\x56\xab\x8d\x75\x71\x16\x16\x66\x9d\xd1\x20\x95\x35\xac\x14\x87\x0b\x5b\x57\xe8\x6c\xb0\x53\xe7\x56\x7d\x9b\x1b\x55\xf1\x3c\x58\x19\x19\xa9\x34\x34\x0a\xb8\xd0\xd2\xc6\x92\x84\x96\xf6\x2a\x63\x48\x95\xc2\x76\x4e\x7d\x15\x6d\xab\x01\x6e\xb8\x55\xb0\xca\x76\x5b\xd5\x39\x01\x46\xae\x27\x5b\x56\xfb\x80\xdf\xf4\x9b\x8d\x7a\xb8\x1b\x96\x58\xa9\xa1\xf4\x5c\x87\x96\x57\x0a\xc6\x0d\xdb\xf1\x3c\xb4\xce\xb4\x9a\xb8\x3a\xcc\xda\xad\x4a\x25\x9d\xe2\xe6\xca\x0a\xfd\x41\x71\x51\x52\x37\x63\x61\x94\xdd\xc8\xaa\xb4\x25\x50\xf5\x7a\x75\x69\xa6\xa4\xfa\xc2\x4a\xd5\xb4\x89\xa5\xab\x17\xeb\x8b\xe2\xc9\x9c\x3e\xfe\xf8\x86\xaf\xf8\xc6\x7a\xe3\x04\x2a\x81\xfd\x6e\x94\x4e\x06\xfb\x52\x66\xbe\x64\xbd\x71\x3f\x7a\xbf\x7a\x7d\xa4\x1e\x07\xe1\x60\x83\xe0\xe9\x97\x06\xb4\xec\x4e\xf4\xc6\x74\x45\xcc\x61\xbb\x97\x2f\x2a\xc2\xcf\xcd\x3b\xe1\x28\x05\x7a\x75\xa7\x83\x5d\x2a\x0d\xab\xcf\x32\x75\x6a\x0f\x93\x9f\x0a\xa1\x1b\xde\xef\xc9\x81\x73\xc3\xfb\xff\x96\x36\xf8\x16\x7a\x33\x5c\x77\xbe\x91\xde\xc3\x83\x9b\xe7\x73\x25\xb5\x81\xdf\x38\x3f\xfe\x6e\xf3\xf9\x05\x7f\x3f\x69\x13\xd5\x46\x5b\xcf\x3e\x20\x39\xd7\xde\xf1\x29\x7e\x7d\xf6\xfd\xcf\x3e\xf1\xe7\xdf\xff\xda\x9a\xfa\x44\x9f\x25\x99\xcf\xfe\x31\x32\x52\x39\xe1\xff\xaf\x39\x9f\x2f\xf4\xcf\x57\xd2\xfb\xb8\xa6\x06\x4e\x7d\x9e\xc9\xe3\x1a\x23\x2d\x1a\x77\x6a\x99\xf4\x52\xf2\x9d\xcd\x3a\xf2\x68\xb0\x9e\x65\x60\xd0\x99\x80\x90\xeb\x85\xad\x9c\xb6\x5b\x5d\x55\xda\xa2\x6a\xde\x8a\xc3\x59\x9f\xaf\xb7\x96\xa3\x8a\x59\xb9\xb1\x5e\xcc\xfb\xcd\x12\x1c\x6a\x61\x61\xe3\x0e\x1d\xbf\x5c\x52\xe5\xff\xfe\xef\xdf\x21\x82\x70\xd0\x0c\x68\x2f\xea\xd5\xdb\x2e\xca\x96\xed\xd9\x3a\x94\x60\x1f\xe6\x86\x8b\xb9\x8c\xea\x12\x68\x75\x1c\xe4\x68\x56\x7a\xb9\xf5\x77\xb8\x41\xed\x82\x5d\x99\x7b\x96\x9a\x19\xea\x3d\x60\x58\xa1\xd6\x18\xc3\xd8\x5b\xc7\x13\x2b\x93\xee\x77\xf2\xf6\x66\x3d\x78\x7f\xb1\x8e\x3e\xb9\x58\x0f\x63\x1a\x83\x48\xf8\xd8\xa7\x18\x87\xa1\x14\x84\x1e\x88\x63\x4e\x09\xf0\xa3\x18\x47\x52\x04\x25\xcc\x24\xc0\x40\x2c\x3c\xe2\x03\x02\x89\x0f\x22\x1c\x40\x9f\x60\x48\x7d\x78\x38\x1e\xc0\xb7\x2f\xd6\xdf\x0b\xa7\x22\x08\x10\x8a\xae\x2e\xd6\x9f\x9e\x9e\xd7\xa4\xbd\x75\xb3\xac\x79\x21\x31\x2f\x36\xcb\x12\x2b\x86\xc7\xaf\x9f\x2c\x96\xb7\xfa\xba\xd3\x90\x72\xcd\x4a\xbd\x99\x83\xd3\xae\xef\x47\xd3\x5a\x6f\xe3\xee\x3a\x2b\x6a\xa8\x40\xe4\xd1\xaa\xd6\xdf\xec\x5c\x7b\x6d\x6e\xfb\xab\x8a\x18\x80\x54\x44\x8a\xa4\x83\xda\xcb\x71\x5e\x48\x73\xa1\x3b\xb1\x31\x35\xca\xbb\xcc\x70\x9c\x9b\x97\x6c\xaf\x10\xb8\x1f\x0a\xbf\x3a\x9b\x11\x57\x17\xaf\xc9\x8f\xbb\xc3\x51\x44\x58\xfa\xf8\xf5\xc6\xf1\xc7\x2f\x34\x76\xf7\xa3\xf7\x5b\x16\xdb\x27\x9b\x65\x37\x28\x7b\x14\xf2\xde\xec\xbb\x95\xfd\xdf\xc8\x38\xc9\xf2\x5f\xe7\x1c\xbc\xba\x59\xb6\x4e\xce\xbb\xfd\x58\x2f\x4e\x5c\x52\xf7\x8b\x79\x77\xeb\x58\x5f\xca\xe6\x57\xd2\xfb\x68\xd8\x45\x47\x18\xf5\x55\x75\x00\xb2\xf5\xcd\xc2\x1b\x0f\x11\x9e\xf6\xc7\xa2\x51\x24\x7e\xaa\x26\x2f\x2c\x75\x31\x03\x93\x62\x80\x34\xa1\x06\x93\x02\xb0\xcc\xd0\x1a\x2d\x33\x65\x23\x1c\x17\xa6\xea\xca\xf2\x2d\x05\xea\xdb\x7c\x37\x33\x5f\xd3\xa9\x32\xcb\x38\xa8\x8b\x73\xd9\xfb\x87\xc7\x05\xc2\x43\x22\xf6\x11\x0d\x09\x17\x24\xc6\xdc\xe3\x1e\xe0\x22\x82\x71\x14\xc5\x20\xf2\x31\x08\x3c\x46\x22\x49\x22\xfc\x90\xee\xe0\x05\x24\xf2\x00\xe3\x41\xc0\x10\x24\xec\xb0\x59\x86\x9e\x8e\xe7\xdd\x9a\x5a\xcc\x57\x5c\xa6\xb9\x85\x66\xd9\xb2\x6d\x66\x5a\x56\xb9\x99\x29\xd6\x4b\x4a\xc3\xb0\x2d\xbb\xd6\x32\xea\x8d\x06\x29\x34\xe4\x6a\x5d\x29\xdb\x3a\xad\xda\x05\x39\xf3\xf3\x58\x73\x1b\x20\x48\xde\xb3\xc4\x18\x08\x7a\xf5\xd8\xea\xf0\xf4\x90\x4c\x76\x56\xd2\xfd\x41\xf2\x33\x5a\xa7\x58\xcf\xe8\x5d\xb7\x19\xee\xe8\x4e\x0c\x38\x6e\xe6\xb6\xb3\x0a\xaa\x96\x04\x6d\x55\x1b\x70\x59\x98\xab\xa5\xca\x72\x18\xcf\x0f\x46\xf8\xe1\x78\xfe\xf0\xcd\xdc\xc5\x10\x9f\x58\xe2\x43\x50\x4f\xd6\x1f\x66\x17\x2d\x5b\x3b\x7b\xae\x64\xe4\x75\xf1\x34\x39\xb3\xc6\x5a\xa9\x4d\xff\xf0\x18\x6b\x1b\xb3\xa4\x73\x69\x9d\xab\x55\xdd\x56\x34\xb3\x2c\xb8\x2b\xba\x83\x68\x52\x9c\x2f\x3b\x63\x33\x4b\x57\xfa\x08\xb5\xd5\xb9\x3e\xcc\x4c\x1a\x71\xbb\x2c\xea\x79\x15\x2b\x55\x63\x58\x4e\x8d\x22\x69\x3e\x71\x9a\x83\xba\x5e\xec\x69\xcb\x4e\x59\x1f\x5b\x9d\x01\xec\xcc\x8a\xea\xc7\x8e\xdf\xf3\xa7\xa2\x7a\xd5\xe2\x9e\xfc\x51\xb1\xa6\x6d\x9c\x62\x64\x76\x42\x6c\x8d\xac\x6d\x73\x15\x06\x7e\x7e\x91\x69\x69\x78\x37\x18\x64\xfd\x06\x59\xae\x0d\xa8\x3e\xf5\xed\xb0\xca\xe8\x4c\x8f\xbc\x7b\x70\x85\x5e\x64\x6c\xbc\x63\x41\xef\xf7\xfe\x5c\x92\xf7\x9f\x68\xc9\xdd\xa1\xfd\x30\xeb\x37\x86\x9d\xad\x6c\xc8\x30\x8b\x83\x54\x90\x36\x23\x09\x6e\xe6\x53\x50\xea\xdb\x71\xb9\xe1\xd4\x17\x7e\x97\xcb\x3d\xa7\x30\x19\xf1\x07\xd6\xd7\x97\x6e\x03\x0e\x8a\xcf\xbc\xaf\x6c\x8a\xbd\x22\xb8\xde\xdf\x62\x92\xfe\x5e\xca\x9e\x56\xdc\xcb\xdd\xc9\x0b\x5e\xd1\xfc\xbb\x93\xc7\x9f\xec\xd3\xde\x0a\x19\xc5\x23\xb5\x07\x17\xf3\x65\x22\xdf\xdb\x9a\x1c\xdc\xf6\xfe\xdc\x38\xd9\xfb\x1f\x35\xf3\x57\x4d\xbe\xfb\x6a\x66\x18\x72\x81\x71\x40\x62\xcf\xf3\x81\x88\x18\x62\x40\xf2\x82\x18\x73\x48\x42\xe8\x7b\x7e\x84\x38\x43\xd0\x43\x3e\x46\x22\x0a\x63\xcc\x09\xa3\x91\x24\x79\x5e\x8c\x85\x14\x78\xfe\x5e\x33\xc3\x7b\x6a\xe6\x77\x7d\x24\x82\x39\xba\xae\x99\xf7\x4f\x0f\x9a\xf9\xec\x86\x8c\x5b\x35\x73\xf6\x62\x88\x3f\xa8\x99\xb5\x6d\x71\x77\x22\x22\x27\x9a\xd9\x68\x90\xed\x2c\x1b\xf6\x19\x8b\xdb\x99\x4c\x77\xc6\xdd\xac\x6c\x6b\x21\x1a\x0c\xca\x4b\x7f\xb7\x49\x77\x3d\x33\x28\xa2\x75\x3f\x8b\xc7\xcb\xa9\x59\x29\xa5\xe4\x5d\x77\x8b\x66\xf5\x45\x9e\xca\xe3\xed\xa4\x33\xee\x77\xd7\x73\xb7\xb9\xd2\x6b\xcc\xc9\x4a\xc5\x4e\x38\x72\xe4\x4c\xe5\x7e\x9a\xb9\x78\xb2\xfe\x48\xa0\x19\xbb\x99\x23\xef\x1e\x98\xf2\x49\xcd\x78\xc7\xf7\x27\xb2\x0c\x27\x5a\x6c\x73\x68\x7f\xb1\x66\x2e\x1e\x7d\xa3\xdb\x35\xb3\x6d\xec\x4e\x2d\xdb\x2b\x9a\xf9\xe4\xac\x2e\x89\x66\x34\x4f\xa8\x7d\x08\x90\x79\xc1\xc5\xb7\x35\xf3\x1d\x2d\xc3\x67\xde\xff\xa8\x99\xbf\x6a\xf2\xdd\x57\x33\x33\xc8\x02\x06\x24\x40\x78\x14\x8b\x58\x0a\x3c\x09\x08\x8f\xf0\xfd\x3f\x8f\xf8\x3e\x80\x82\x10\x29\xa0\x4c\xa2\x44\xf2\x42\x14\x78\x0c\x50\x09\x78\x9e\xcf\x09\x62\x3c\x12\x7b\xcd\x0c\xee\xa9\x99\xdf\x2b\xc0\x40\x28\xc7\x80\x5e\xd5\xcc\x4f\x4f\xcf\x2f\x1c\xba\x55\x33\x5f\x4e\xe3\x2b\x9a\xf9\xb5\x32\x1d\xda\x33\x5e\x45\x76\xab\xad\x92\xd5\x31\x55\x7b\xdd\x33\xdb\xb2\x29\xf9\x91\x86\x5b\xe5\xb4\x8e\xfb\xae\xd9\x71\x87\x75\x38\x51\x87\x5b\x1e\x88\xd6\x0c\xcd\xf3\x61\xbe\x3c\xf4\x0a\x23\x12\x0f\x65\x3a\xf5\x0a\xa9\x41\xa5\x98\x5f\x97\x6b\x9d\x45\x6f\xdd\x6f\x09\x53\xdf\x58\x4e\x28\x72\x72\xff\x7e\xda\xf8\x44\x7b\x25\xd1\x86\xc1\x91\x5f\x0f\xff\xbf\x08\x83\x79\x47\x1b\xdf\xef\xfd\x5a\x92\xf7\x9f\x1c\x7b\xde\xae\x8d\x9f\xfb\x52\x81\xa5\x5e\x40\x2e\xde\xa7\xde\x0f\xff\x4b\x34\xed\xcb\x32\x3c\x6f\x6b\xda\xbf\x48\xd3\xbf\xba\x13\xb4\xb9\x8d\x96\x87\xe2\x15\xc5\x23\x6f\xff\x42\x5e\x7c\xe6\xfd\x8f\x56\x47\xe9\x64\xfb\x20\xa5\xf5\x4d\x4b\x2d\x0e\x65\x79\x04\x17\xc4\x0e\xfb\x5c\xc4\x51\xb5\x3d\xcc\x76\x5b\xcd\x46\x3f\xef\x17\x16\xbb\xcd\x70\xe5\xad\x27\x60\xcc\x5a\xe3\x65\xdc\x49\xb9\x99\xe1\x64\xbc\x62\x75\x79\x3d\x93\x69\x3e\x87\x2c\xb5\x3a\x5a\xf7\x63\x4d\xaa\xe2\xb5\x7b\xff\xe2\x19\x52\x1c\xc7\x0c\x4a\x90\x71\xc8\x62\x1f\x51\x0a\x00\xc1\xb1\x17\x48\x4c\x78\x01\x0b\x20\x16\x00\x79\x31\x85\x9c\x79\x10\xc4\x01\x92\x20\x10\x71\x10\x07\x84\xd0\x28\xa6\x70\xbf\x30\x27\xd2\x1d\xad\x0e\x90\xde\xb3\x3a\x1c\xc1\xeb\x65\x7f\x9e\x9f\x9e\xdf\x4d\x77\xab\xd5\x79\x23\x38\x26\x99\x3f\xb0\xc9\x77\x75\xd7\x2d\x15\xcc\x6e\x03\xcf\x68\xaa\xaf\x9a\x43\xb1\x0c\xbc\x71\x9d\x2b\xc1\x4c\x1b\x55\x9a\x59\x1f\xcf\x61\x75\x5b\xdd\x3a\xbe\xdc\xcf\x0c\x3c\x75\xa5\xa5\xaa\xf9\x75\xb1\x35\x2e\x39\xb1\xdf\xaf\x38\xb9\xd9\x78\xb9\xad\xe7\xb7\xb0\x35\x71\xa2\x20\x50\xb6\xd3\xcc\x1d\x77\x6a\x8a\x27\x5f\x4d\x62\x01\xe0\xeb\xf3\xe5\xe4\xf3\x8e\x05\xba\xdf\xfb\x93\x25\x4a\x1c\xe7\xfe\x1d\xb5\x58\xa2\xd4\xf4\x7b\xbf\xff\x25\x3f\xde\x3e\x5b\xf8\x4a\x7f\xe8\x9d\xf3\x83\x24\xfd\x7d\x78\x59\xf1\xad\x1e\x7d\x29\xbf\x1f\x92\x51\x3e\xff\xfe\xa7\xf4\xbb\x2f\x52\x0c\xf7\xb5\x1a\x11\x61\x40\x82\x02\x70\x0a\x23\xce\x01\x22\x8c\x79\x42\x10\x2a\x28\x0f\x63\x82\x23\x12\x42\x4a\xa2\x40\x10\x9f\xf9\x5e\xc8\x50\x10\x51\xc0\xe3\x08\xa2\x18\x86\x5e\x7c\xa8\x11\xb2\xb7\x1a\xe8\x6e\xbe\x0a\x78\xdf\x6a\xe0\x37\x76\x91\xf6\x4f\xc9\xcf\xcb\x6b\x48\x6f\xb5\x1a\x6f\x14\x8b\x7b\xd5\x57\x79\xb4\x1a\x0e\x2a\xed\x4e\x16\xe0\x27\x56\xa3\xb7\x69\x8f\xec\xaa\xa2\x7a\x60\x04\xa3\xb8\x35\x0e\x36\x13\xad\xd7\x8c\x0c\xbb\x42\xe7\x9a\x6b\xd7\x43\x29\x1e\xaf\x97\x8b\x31\xea\x5b\x6b\x1a\x65\xd7\xed\xfa\x68\xc7\xca\xb3\xbc\xb9\x56\xab\x0b\x5a\x10\xdb\xc1\xb0\xd1\x95\xed\x66\xdd\xc0\xad\x6d\xdc\xc5\x5b\x3b\x3f\x55\xe4\x5f\xd2\x6a\x28\xaf\xcf\x94\x6f\xb3\x1a\x6a\x92\xf7\x7f\x8d\xd5\x30\xe4\xcf\x69\xed\x7b\x5b\x0d\x43\xfe\xdc\x8e\x8f\x2c\x7f\xb1\xdf\xf6\x05\xbe\x46\x52\xad\x2d\xdf\x89\xdf\x0f\xe5\xae\x12\x5b\x8d\xaf\x52\x0c\xf7\xb5\x1a\x44\x10\x48\x83\x10\xc4\xa1\x27\xf9\x81\xe4\x45\x3e\x8c\x81\x4f\xa0\xe4\xc7\x3e\x92\x24\x1e\x73\x0f\x79\x1e\xf4\x61\x14\xa3\x88\x42\x0f\x30\x80\x02\x06\x21\x20\x71\x80\x70\x10\x3c\x5a\x0d\x7c\x37\xab\xf1\x5e\xd2\x36\xe1\x88\x60\xf6\x86\xd5\x78\x78\x7a\x7e\xe3\xf4\xad\x56\xe3\x8d\xe2\xc8\x27\x56\xa3\x76\xfe\x3c\x83\x06\x20\xd8\x2a\x23\x1f\x57\xda\x01\x56\x3a\x2e\xaa\xef\x8c\x53\x89\x39\xb1\x22\xa5\xa1\xdb\xee\x8e\xdc\x4e\x33\xc5\xea\xf2\x7c\x00\xcd\xe5\x30\xde\xf4\x15\xca\xb7\xa8\xa0\xcf\xbc\x46\xc6\xe9\x57\x53\xf9\xcc\xa6\xd1\x10\x03\x3a\x89\xed\x7a\xb7\xb0\xd9\x70\x53\xd0\xfc\xac\x5c\x07\xd3\x92\xea\x92\x6a\xec\xcd\xdb\xd3\x4d\x16\x64\x55\xac\xcd\xdc\x20\x52\xef\x79\x16\x71\x6f\x2d\xfe\xd9\xb3\x88\xfb\xbd\x3f\x93\xe4\xfd\x5f\x63\x45\x8a\x72\x82\x7d\xfb\xbf\x70\x07\x47\x96\xef\x61\x45\x8e\xfb\xc0\xd2\x24\xd4\x8b\xed\x16\x92\x80\xa1\x97\xd6\x6e\xa3\x34\x08\xb6\x67\xe3\xf0\x05\x56\x25\xa9\x56\x97\xbf\x80\xff\x9f\x79\xff\xa3\x55\xf9\x2a\x45\x71\x67\x5f\xc4\x17\x54\xb0\x40\x82\x9c\x05\x24\x88\x51\x24\x18\xf1\x11\x45\x50\x22\xc2\x93\x38\x0a\x7d\x8a\x38\x09\x23\x44\x18\xc7\x8c\x49\x84\xe1\x08\x04\x5c\x20\x12\x44\x11\xa0\x7b\x05\x4e\xc4\xed\xb1\xbe\xef\x9e\x96\x08\x44\xc5\xd5\xa2\xaf\xcf\x4f\x9f\xac\x13\xc1\xe0\x0e\xb1\xbe\x8d\x8b\x81\x7d\xb1\x8a\x4c\xa0\xdf\xae\xc4\xfa\xaa\x72\xb1\x3c\x62\x39\xd2\x5b\xce\xdb\x93\xb8\x36\xd6\xd7\xa3\x85\x5e\xe9\xbb\x46\x66\x63\xa4\xeb\xa3\xad\x9e\x9e\x1a\xdd\x94\x1f\x16\x1b\xbb\x2e\xb4\x59\x63\xb0\x1e\x95\x53\x5b\xc3\x6e\x0f\x51\x6a\x58\xf6\x1a\x01\xdb\xd5\x97\x9b\x6e\xa1\xa7\x0f\x06\x3b\x25\xaa\xa4\x37\xf9\x55\xa5\x74\xaf\x58\xdf\xd3\x39\xf0\xc9\xd8\xd9\x58\xc4\xe3\xf8\x24\xb2\xaf\x7e\xfc\xf1\xeb\x62\x67\xef\x48\xef\xb7\xc4\x26\x9f\xd8\xac\x1b\xe2\x3f\xd3\x9b\x54\x47\xfa\xee\xf8\xcf\xbf\x51\xbc\xaa\x2c\xff\x75\xfb\x63\xaf\x9e\xf0\xac\x92\xf3\x6e\x3f\xd6\xe9\xa3\x50\x29\xce\x17\xf3\xee\xd6\xb1\xbe\x94\xcd\xaf\xa4\xf7\xd1\xfe\xb6\x33\x99\x49\xaa\xb3\x34\xf8\xcc\xc8\x37\xc1\x54\x11\x26\xaf\x02\x33\xa7\xca\xa2\x66\xc1\x96\xe8\xa4\x59\xd7\x58\x0d\xb1\x9d\x9d\x93\x85\x93\x1a\x4c\x02\x73\xb7\x9a\x77\x35\x62\x2e\x56\x93\xde\x70\x30\x2a\xcf\xa1\x3f\x77\xbb\x64\x43\x5b\xc1\xba\xd9\xb7\x44\x6d\x06\xee\x1f\xb7\x10\x79\x12\x8e\xe2\x50\x04\x28\x26\x11\xa1\x01\xc0\x50\x04\x4c\x8a\x02\x89\x0a\x86\xb0\x07\x22\x82\x39\x89\x09\x08\x29\x93\xa2\x28\x80\x88\x84\x04\x07\xc2\xa3\x24\x64\xe8\xc1\xfe\xde\xa1\x14\xe6\xbb\xbe\x9c\x44\x09\xbc\x9e\x6b\xb3\x7f\x7a\x38\x37\x02\x50\x30\x4c\x18\x07\xe0\x0e\xa5\x30\xeb\x17\x03\x7b\x62\x7f\x4f\xcc\x68\xfd\x49\xd7\x2a\xb2\xe2\xe8\xcb\xa6\x9b\x2a\xda\xed\x46\x7a\x9d\x59\xd1\x54\x29\x53\xef\x48\xf1\x9a\x0c\xa3\xf9\x6e\x13\x35\xcb\x92\xd0\xb5\x4a\xdc\x6e\xd6\x23\xb5\xc5\xa3\xb2\xaf\x1a\x68\x3c\xab\xe5\x9c\x92\x9c\xae\xe5\x99\x5e\x97\xd2\x4b\xbb\x5e\xdb\x18\x95\x4a\xc3\x98\x8f\x61\x65\xbc\xd1\x95\x8f\xf9\x66\xe6\xf1\x97\x0f\xab\xe6\x4f\xd9\x09\x63\xa6\xf5\x54\x77\xfd\x90\x58\x92\xe9\xe1\xb0\xad\x55\x26\xb0\x44\x1d\x1c\x2b\xb5\xb2\xba\x49\x8f\x66\xb4\xb9\xe8\xaa\xc3\x92\x89\xc6\x45\xb3\x55\xdc\xa4\x8a\x6e\x1e\x9b\xeb\x87\xaf\xc6\x41\x54\x38\x95\xfd\x23\x6d\x47\x1b\x5e\x48\x5a\x2c\xa6\xbb\xf4\x5b\xa1\xb5\x3a\xa9\x49\x79\x32\x79\xbf\xce\x26\xde\x91\xde\x6f\x59\x73\x9c\x44\x5d\x24\xd6\xeb\x79\xba\x18\x80\x94\x74\xac\x49\xf9\x3d\x7a\xfd\x6f\x64\x87\x0e\xfc\x3d\xa9\x12\xfd\x99\xb9\x52\xc8\x75\x57\x2a\xd7\xd2\xa9\xc3\xa0\x16\x2a\xf2\xf9\x98\x56\x3e\x8b\x97\x84\xbf\x9f\xa3\x77\xe6\xe9\x51\x3f\x08\x46\xdf\x43\xef\xab\x6b\x94\x13\x5e\x27\x91\xe5\xf4\x71\xa9\xa4\x5c\xea\xcd\x5f\x4b\x96\x5f\xce\xbd\xaf\xa4\xf7\x29\xca\xe5\x8b\x0c\xd6\x9d\xaf\x88\x41\x80\x87\x11\xf5\x39\x45\x04\x47\xc0\x07\x0c\x05\x58\x60\x1c\x53\xc1\x01\x66\x3e\x8f\xa4\x98\x11\x42\xb1\x1f\x11\x29\x8e\x29\x88\x71\x8c\xe3\x30\xe0\x14\xb2\x28\x60\xfe\x7e\x8d\xf2\x54\x2e\x34\x53\xa5\xb8\x21\x6b\x46\xbe\xec\xe0\x56\xbe\x84\x89\x5a\xd3\xe5\x86\xce\xf5\x3a\xcb\x33\xac\x2a\x66\xd5\xb1\x1b\x4e\x46\xc9\xd6\x8a\x2e\xaf\x56\x2b\x79\x5c\xb3\xf2\xe5\xda\xcf\xdf\x7f\x40\x09\x23\x8e\x29\x12\xf8\xdd\xd5\x0a\x05\x8c\x49\x57\xcf\x2b\x9f\x9f\x42\x89\x53\x26\x88\x24\x71\xf8\xbc\xf3\x5c\xb6\x42\x24\x57\xd5\x91\x83\x07\x76\x28\xb2\x06\x29\xe8\xa9\x68\x35\x88\x90\x91\x77\xc1\xc8\x6b\xaf\x07\xfd\x9d\x4e\x36\xed\xd9\xc3\xac\x3c\xac\x56\xd4\xc3\xa1\xfc\x1b\x51\x2e\xce\xb1\xfd\x49\xfc\x2b\x25\x3a\x3f\xf2\x51\x9e\x67\xbd\x26\x97\xfb\xb9\xb2\x65\x97\x95\x4c\xad\xc2\x47\x0d\xd4\x1a\xa5\xfc\xc1\x1c\x59\x19\x27\xf2\xfb\x28\xdd\xc7\xe9\xf6\x54\xcf\x57\x44\xe4\x96\xb3\xf3\x0c\x1b\x29\x91\xb6\xda\x16\x33\x82\x8a\xd5\x98\x2a\x9e\xdf\xab\xac\x15\xa9\x3b\xea\xc9\x8a\x51\x14\xd1\x3c\xd3\xe1\xbe\xd6\x57\x3f\xb0\x2a\x3a\xcd\x04\xb8\xbe\x32\x39\xd9\xe1\x25\x12\x76\x15\x2d\x1f\xda\x51\xbd\x84\xd7\x4e\xaf\x3d\x8f\x29\x4b\xd5\xb9\xdb\x9e\xf4\x6a\xe1\x34\xa3\x36\xec\x62\xdc\xcb\xa9\x8b\x6d\xa0\x6e\xc6\xb3\xf5\x72\x63\xa5\x47\xc7\x31\xb8\xf2\x79\x67\xa5\x71\xbf\xf7\xdf\x7a\x91\xc3\xd7\x58\xb6\xd3\xcf\xdb\xda\xf3\x6f\x62\x59\x5f\xb5\x54\x8b\x5b\x68\x7f\x12\xd4\xc2\x5b\xbb\x07\xdf\xc6\xbb\xcf\xbc\xff\xe9\xca\x9e\x89\xd2\xeb\x81\x5d\xbb\x02\xfa\x65\x0a\x17\xc3\x56\x7a\x48\xfd\x52\x6f\x0d\xf5\x21\x2d\xad\x68\x29\x4d\xf2\x9d\x6d\xdf\xd2\x87\x99\x8e\x2f\xa7\x26\xeb\x66\xa7\x20\x7a\x72\xba\x1c\x17\x58\xb9\xd2\x18\x12\x50\x94\x63\x77\x42\xd6\x72\x2d\x63\xe9\x33\x99\x44\x68\x63\xde\xbf\x0c\x6b\x88\x48\x4c\x04\xf3\x43\x8e\x50\x1c\x42\xc1\xa9\x2f\x08\x16\x58\x8a\x84\x00\x7e\x18\x45\x1e\x46\x24\x42\x34\xf4\x39\x60\x1e\x62\x5e\x4c\x23\x12\x7a\x9e\x08\x28\xe0\x30\x7a\xb2\x24\xe8\x46\x6f\xf7\xbd\x78\x17\x0a\x98\xa0\x57\x4f\x2e\x9f\x9f\x3e\xd8\x0f\x0a\xb0\xb8\x87\xb7\x7b\x59\x17\xe6\x75\xfb\xf1\x49\xfc\x5b\xec\xc7\x49\xd9\x56\xd7\x00\x76\xb1\x52\x6f\x58\xab\x91\x8a\xf2\x96\x9f\x99\x74\xa4\xe2\x76\x47\x9d\xe2\x52\xa9\x1a\xee\x02\xb9\x95\x70\x31\xb0\x5c\x95\x38\xba\x37\x74\x47\xfa\xbc\xd8\xee\x4c\x8c\x62\xec\xd5\x78\xb1\x11\xea\xcb\x9c\x2b\x60\x2a\xab\x8c\x77\xe5\x79\x2d\x95\xd6\x73\xe3\x4e\x25\xf3\x15\xf6\x23\x89\xa7\x78\x92\x5e\x63\xbf\xce\x8a\x8f\xdb\x8f\x1b\xdf\x7f\xa5\x36\x50\x12\xfb\x71\xc7\xd5\xfa\xe9\xe7\xc3\x3a\xf0\x57\xf6\x16\xde\xb3\x1f\x09\x68\x4f\x9f\x5e\xb8\x7c\x65\x7f\xf8\xdb\x78\xf7\x99\xf7\x3f\xda\x8f\x86\x5a\xd2\x76\x5a\xb6\xde\xe3\x74\xbd\xe8\xf6\xd0\x9a\xb9\xb1\x5d\x9c\xa7\xea\x99\x42\xdb\xa9\xe5\x0a\xe1\x50\xd3\xfd\x96\x8d\xe4\x65\x56\x41\x93\xa1\xb9\xe1\x19\xc3\xf0\x6a\x19\x1d\xf5\x97\xbb\xec\xa8\xca\x3b\x43\xab\x14\x77\x2a\x5e\x71\x37\xd3\x56\xab\xcd\x66\x6a\x38\xf2\xdd\xcb\x88\x52\x9f\xa0\x80\x73\x40\x50\x0c\x88\x1f\x73\xc8\x18\x95\x3c\x40\x23\x1e\x1c\xee\xae\x04\xd8\x8b\x01\x16\x1e\x0f\x3d\x4e\x7d\x08\x7c\x41\xb1\xe0\x80\x07\x52\x1c\x43\x8e\xe2\xbd\xfd\xb8\xbd\x8c\x37\x7c\x2f\xca\x9e\x42\xc1\xf9\xd5\x8b\xde\xf6\x4f\xc5\xd1\xa1\xc1\x88\xc0\x3b\x54\xf1\xbe\x54\x5d\x2f\xd4\xfd\xe7\x97\xb6\x67\xf2\x72\x7a\x58\x99\x53\x07\xd5\xc8\x0a\x64\x6d\x53\x49\x37\xf2\xb3\xf1\x18\xa7\x71\x18\x07\x1d\x2b\xbd\x35\x84\x5d\xcd\xcc\x66\xbd\x45\x3a\xe8\xb4\x04\x76\x0a\x5d\x3b\xa0\x64\x40\xd7\xc1\x0e\xca\x7d\xbf\xe0\x31\x55\xf6\x26\x61\x2d\x37\x71\x1a\xcd\x3e\xed\xcf\xed\x69\xa6\x59\x18\x11\xf9\x23\xb7\x88\x9f\xc9\xed\x55\x73\x70\xf2\xf7\x9f\x50\xc7\x25\x52\xf0\x8a\x46\x39\x3e\x4d\xd3\xaf\xbd\xfa\xe6\xf7\xcc\xc1\xfd\xde\x9f\xc8\x1c\x9d\x1c\x26\x26\x54\x69\xb8\xbd\x18\xaf\xdb\xf4\x76\x95\xf6\x17\xaa\x54\x59\xfe\xeb\x5c\x82\x57\xcd\xcb\x3c\x19\x2f\x9e\xc6\x42\x3d\x2e\x0d\x94\x44\xb7\xb8\xdf\x51\x16\x12\xdc\xe2\xde\x69\x4f\x9c\x66\x0f\xcb\x4a\xd1\xb1\x60\x77\xca\xf2\xa5\xb4\x84\x9b\xd8\xb0\xd3\xa2\x6b\x69\xa0\xc2\x18\xe1\x31\x36\x1a\x71\x09\xaa\xa4\x8f\xcb\x91\x19\x05\x7a\x51\xaa\x98\xb9\x2d\x5a\xb6\xdb\xb9\x69\xd3\xe9\x4c\xeb\xd9\x01\x2d\xb7\x0a\x1a\x6b\xc3\x2d\x4d\xc9\xf7\xbf\xc5\x3d\x02\x9c\xe3\x10\x70\xcf\xf7\x10\x0e\x21\x8c\x98\x07\x98\x0f\x10\x64\x02\x21\x89\xf8\x11\x8c\xa5\x18\x01\xe4\x21\x09\x31\x81\x38\x40\x88\x62\x89\x31\x14\x44\x28\xe0\xf1\x21\xc4\xf2\xa9\x4a\xb5\xaa\x5b\xcd\x5c\x3d\x93\xb7\xb2\x34\x6f\x13\xb5\x24\xdb\xbc\xc9\x79\xb9\xe9\xb6\xb8\x5b\xd7\x88\xa9\xe7\xb3\x19\x47\x57\x73\x6a\xbd\xa1\x16\x48\x9e\x58\x15\xc6\xf3\xf9\xd6\xde\x2e\x08\xc2\x04\xa6\x12\xe6\xe8\x5d\x43\x83\x24\x40\xaf\x26\x11\x3f\x3f\x85\x42\x48\x5c\x50\x46\x21\x7a\x4e\xe7\x32\x38\x1f\x4e\x4b\xf6\x56\xaa\x5b\xed\x61\x7b\x94\x4a\xa7\x97\xab\x9e\x25\xea\xe6\xc6\x84\x59\xbd\x42\x7a\xea\xcc\xad\xa5\xf2\x24\xa5\x1f\xb6\x54\x1f\x36\xba\x0e\x42\xfc\xc6\x46\xd7\xc3\x4a\x38\xd1\xf1\x8a\x3b\xeb\x91\x48\x3c\x14\xe2\xe9\x99\x7c\xad\xcc\xaa\x93\xf9\x2c\x18\x4d\x95\x4a\xa3\xb7\xdd\xad\x57\xf5\x1d\x5a\x51\xc7\xa4\x2c\xc7\x80\xd1\x69\xcf\xbd\x46\x25\x5b\x8b\x53\x7c\x3c\x24\x0c\xe5\xed\x71\x90\xd2\x4d\xc4\xbd\x42\xbd\x5c\x11\x38\xcc\x75\x60\x77\x35\x49\xd5\x8d\x65\x55\x33\xa7\xe9\x9a\xb2\xfe\xd0\x31\xde\x89\x68\x1f\x03\x9b\xdf\x3c\x56\x3b\x61\x44\x6f\xb5\xf4\xc6\xd0\x2a\x40\x27\xa5\x7a\x6a\xcc\xd3\x29\x96\x2a\xa6\x37\xce\x48\x1b\x39\x4e\x98\xe9\x16\xf3\x8b\x4e\x81\x3c\xf5\xf3\xe4\x4e\x1a\x75\xfe\xfa\x8c\x3a\x7c\xde\xb1\x36\xf7\x7b\x7f\xa2\xcd\xab\x93\x63\xaf\xd9\xc9\xa3\x4f\x6a\x98\x51\x11\xcb\x27\xc5\xcb\x93\x69\xb8\xbf\x50\xc3\x5e\x6a\x78\xb5\x9c\xa2\xd3\x9e\x23\x56\x75\x9b\x98\x63\x33\xbd\x4a\xf3\x19\xd9\xa5\xb3\xb5\xa0\x16\x56\xab\xa0\x6c\xac\xa7\x48\x5b\x75\x97\x56\x87\x1f\xf4\xea\x51\xd6\xf2\x6b\x39\xc1\xe6\xdd\x09\xbd\x9f\x98\xd7\xaf\x58\xa9\xd9\x6d\x7d\x78\x20\x30\x9f\xfc\x2e\xa3\x3b\xf2\xf0\x33\xef\x7f\x2a\x42\xf4\x45\x8a\xe7\xce\x49\xc7\x84\xfa\x0c\x72\x18\x46\x9c\x70\xcf\xc7\x08\xfb\x38\x08\x3d\x8a\x90\x04\x24\x8c\xc3\x18\x4b\x51\x18\x72\xc0\x60\xcc\x22\xc4\x00\x67\x88\x31\x1c\xc5\x01\x85\x7e\x10\xf8\x60\x6f\xa5\x6e\x2f\xcf\x0a\xc5\x7b\xb6\x89\x40\xcc\xaf\x86\x6c\x3e\x3f\x7d\xb2\x76\x5c\xa0\x3b\x84\x6c\x5e\xae\xd8\x5f\xe8\xb4\x04\x3a\xf2\xda\x5d\x46\x59\xbf\x86\x02\x3a\x9b\xb9\xa5\xdc\x7c\x50\xaa\xcf\x07\xb6\xae\x8b\x9e\xd8\x80\x76\x3b\x5a\xc3\x48\xd7\xcb\x8e\x5d\xf2\x7a\x45\x6b\x2b\x72\xee\x88\xa2\x6a\x6d\x5d\x1d\x05\xeb\xf5\x6a\x05\xa3\x9e\x16\xcb\xa9\x76\x7a\x68\x37\x8b\x93\xe6\x4c\x29\x0b\xc2\x55\xc2\xf2\xe3\xbb\x79\x41\xf9\x64\xe1\x13\xcf\x5e\x48\xea\xf8\xf5\xea\xab\x6f\x7e\xc7\x2e\xdc\xf1\xfd\x89\xbc\xb0\x13\x2f\xe8\x06\xbb\xb4\xb7\x0b\x99\x5b\xed\xd2\x5f\x68\x17\x65\xf9\xaf\xd3\xe9\xaf\x7a\x41\xc3\xe4\xbc\xd8\x8f\x45\xf6\xb8\x60\x54\x12\x1d\x70\xdd\x51\x16\x3e\xf3\xfe\x47\xfb\x52\x6d\x80\xc5\xa8\xec\x31\x94\xa9\xce\x4c\xbb\xee\x9b\xce\x66\x93\x36\xd2\xc5\xd0\x30\xf4\x79\xa9\xd9\xd9\xec\x06\xda\xae\x31\xde\x65\xc4\x4a\x19\x9a\xa9\xb0\xef\xcc\xb5\x16\x2e\x16\x0b\x5c\x6a\x8e\x37\xfa\xda\x1a\x5b\xb4\x0f\x77\xf9\x3a\x5b\xdb\xab\x72\x79\xbd\x2c\x77\xa7\xf7\xf7\x82\x42\xc6\x83\xd8\x47\x1c\x7a\x42\x48\x11\x17\x94\xc4\x71\xc8\xa0\x0f\x44\xe4\x05\x61\xc4\x59\x48\x59\xc4\xa9\x20\x8c\xc5\x01\xe6\x9e\x88\xa2\xff\x9f\xbc\xf7\xe8\x4e\x5c\xd9\xfe\x86\xbf\xca\x7f\x76\x07\xdc\xb5\xa8\x1c\x06\xef\x40\x28\x91\x85\x88\x12\x33\xa9\x24\x91\x73\xe6\xfd\xf2\xcf\x6a\x70\x1b\x8e\xdb\x36\x06\xe4\xee\xbe\xeb\xd4\xe0\xac\xe3\x2e\x60\x97\xaa\x4a\xfb\xb7\xf3\x56\x28\xc2\x01\x01\x71\x22\x42\x48\x7e\xe0\xcb\xcf\xf2\xa3\x06\x69\x54\x1c\x13\xb7\x6b\x0d\x8b\x77\xeb\x58\x6f\x9a\x2e\xae\xd1\x56\xb5\x99\xab\x98\x45\x43\x43\x76\xd9\x6b\xe6\xeb\xbc\x52\xd1\xea\x5a\xb5\x54\x2a\x1a\x5d\x5e\xaf\xd9\xd6\x0f\x5c\x60\x18\x01\xc1\x29\x47\xf4\x56\x72\x00\xa5\x48\xb2\x8f\xb5\xa0\x9f\xb3\x50\x00\x2c\x04\xc3\x80\xa2\x57\x77\x4d\x6d\x34\x71\x8a\x9b\x25\xb5\xb2\x13\x67\xdf\x2c\x1a\x61\x06\x84\x95\xb2\x5e\xb4\x8d\xfa\x18\x4f\xe2\x1a\xaa\xe4\x4c\xa3\x5d\x6a\xd4\x6a\xa7\x93\x3f\x6b\x41\xbe\xf6\x79\x29\xa5\xf3\x25\x5d\x20\xb6\x6a\xa9\x71\x22\xa9\x8d\x27\xda\x71\x31\xeb\x2b\x6d\xbf\x9e\xc7\x99\xd6\x20\x98\x6d\x4b\x3b\x63\xae\x6f\x11\x58\xb3\xd0\x3a\x21\x4d\xae\xde\x6e\xff\xca\xe9\x5a\xf3\x82\xc8\xf6\x4e\x3f\x6f\xd6\x4a\xca\x9d\x68\x4d\x7b\x1e\x6f\x97\xeb\xb1\xa6\xba\xd3\x6a\x21\x6b\x0f\x93\x72\xd9\x35\xe7\x32\x70\x0c\xdb\xae\x5b\xed\x0c\xd2\x49\xcb\x11\x51\x2b\xd3\xd2\x2a\xcd\x91\xde\xf0\xdc\xb2\x91\xd9\xd7\x82\xba\xbb\x3f\xee\x24\x6e\x28\x73\x36\x62\xf6\xd1\xd7\xd7\x6b\x9e\xfb\x5a\xd1\x8b\xfc\xf5\x55\xfe\x10\x71\xae\xdc\x20\x99\x86\x4f\x26\x6c\x3b\xf2\x32\x3e\xb7\x2a\xa3\xea\x96\xd7\x57\xbb\x55\x61\xe4\x57\x6d\x2f\xee\x92\xac\xbf\x33\xdd\xea\xeb\xb3\x5d\x95\x3d\x3a\xef\xed\xdb\x44\xa7\x97\xbf\x6f\x20\x4e\x7a\xf4\xdf\x12\xfa\x12\xfd\x2b\x2e\x37\xbf\xec\x8f\xbe\x0c\x17\xfb\xfa\xa1\x9d\xc5\xa3\x30\xf6\x0d\x67\x31\xb0\x76\x86\x8d\xc6\x9c\x36\x8a\x8b\x81\x58\x6a\xce\xa8\x94\x0d\x1b\x78\xbe\xf2\x4e\x1c\xd6\xb2\xda\xed\x17\x2e\x7f\xe7\xdd\x7c\x59\x4a\xf6\x75\xbc\xab\x49\x9c\xfe\x5e\xfc\x3d\xeb\xbb\x1e\xef\x22\xc6\xfc\xea\x18\x68\x71\x38\x08\x17\x99\x7a\x42\x87\xab\xd6\xc1\x45\xd9\xb5\x7d\xd4\x77\x83\x7a\x0f\x74\x23\x3a\x1d\xca\xa1\x56\xd7\x60\x63\x34\x3c\x9e\xa5\x87\x4b\x12\x57\xf1\xf2\x7b\x57\xe3\xe5\xef\xcf\x11\x63\xf1\x1c\xfd\x73\x30\xc3\xfd\xf4\x5f\x10\xe3\xbb\x5e\xfa\x94\x8b\xef\x45\x28\xc6\x20\x89\x28\x27\x12\x85\x09\x8a\x51\x08\x31\x8a\x61\xa8\x24\x0c\x28\x11\x01\x66\x12\x0a\x19\xc6\x61\xc2\x79\x1c\xa2\x10\x47\x02\x49\x88\x60\x20\x23\xa4\xe8\x49\x23\x81\x69\x22\xc6\x4d\x07\x3f\xa3\xf0\x54\x27\xfb\xf3\x59\xc8\x19\x90\x98\x31\x8c\x30\x7a\x1e\x31\x3e\x29\x68\xf1\x18\x62\xb4\xdb\x55\xf3\xea\xa6\x9e\xc7\x15\x62\x30\x07\x25\x31\xec\xb9\xb9\xdd\xcc\x01\x49\xa5\x5a\x35\x5b\xa5\x3c\x70\xa3\xb6\xd7\x1e\x9a\x9d\xb0\x4a\xdb\x65\x0a\x8d\x49\xbd\x15\x47\x7e\xa5\xe2\xad\x43\x8f\x16\x4b\xed\xc6\x71\x1c\xa0\x51\xc1\xde\x76\x7a\xe3\x15\x8c\xbc\x8d\x97\xef\xfa\xd9\x82\x33\x0e\x4a\x00\x2e\xbf\x18\x0e\xff\x35\xc4\xb8\xfa\xea\x23\x1c\x1b\x5e\xf6\xf6\xad\x9e\xf7\x35\xc4\x48\x8f\xfe\xdb\xb3\xbd\x17\x31\x66\x97\xfd\xb9\x9b\x23\xb7\x5b\xe0\xe5\x41\x52\xe7\xc8\xaf\xcf\xf0\x0c\xa2\xa5\xbc\xbe\xeb\x3d\x7d\x17\x31\xa6\x57\xc7\xf0\x00\xc7\x3e\xdb\x90\xce\x1c\xfb\xed\xf9\x7d\x09\x31\x9e\x44\xac\x73\xda\xf3\xfd\xf4\x5f\x10\xe3\xbb\x5e\xfa\x74\x11\x23\x10\x18\x25\x09\xe3\x40\x50\x15\xca\x38\x64\x09\x54\x24\xe4\x04\x24\x2c\x06\x18\x87\x81\x0c\x29\x10\x41\xc2\x11\x4d\xc2\x04\x01\x4c\x98\xe4\x48\x06\x8c\x04\x50\xca\x24\x79\x41\x0c\x94\x1a\x62\xdc\x0c\x29\x66\x94\x7c\xdc\x19\xf4\x34\x2b\xaf\x10\x83\xe3\x34\x74\x8c\x4f\x8a\x59\x3c\xab\x63\xbc\x8f\x18\xd0\x8d\xc5\xb4\xb7\xd3\xaa\x47\x92\x94\x17\xbe\xde\xdf\xd5\x87\x75\xba\x9f\xf6\x98\x2a\x2c\x5a\xb4\x93\x5b\x0f\x47\xdd\x9e\x45\x36\xbd\x76\x7f\x20\x8a\x6c\xd4\x9c\x6b\xfa\x76\xba\xf5\x56\x33\x5c\x68\x1f\x26\xac\x9e\x44\xac\x18\xb9\x1d\xe1\xaa\xf2\xc8\x6a\x7a\xb0\x62\x7f\xb1\x05\xc2\xef\x46\x8c\x87\x38\x76\x8a\xf4\x1f\xd2\x71\x52\x42\x8c\x6f\x94\xe1\xb5\x34\x10\xe3\x1b\x75\xa0\xef\xd0\x31\x1e\xe5\xd8\x5a\x4a\x88\x71\xad\xe3\x3c\x80\x18\xdf\xf5\xd2\xa7\xac\x63\x24\x01\x61\x3c\xa4\x38\xa1\x58\xb0\x88\xf3\x20\xc2\x54\x21\x0a\x50\x1c\x21\x15\xe1\x28\x12\x21\x61\x20\xa0\x61\x8c\x50\xc8\x42\x24\xa0\x08\x05\x0c\x55\x84\xe3\x08\x45\xc1\x0f\xc4\xf8\x59\xe0\x5b\x6f\x77\x68\x59\xaf\x77\xad\x1a\xaf\x99\x55\xaf\xa9\xd9\x4e\xbb\xe0\x7a\x9a\x61\x54\x5b\x9e\xd7\x2d\xea\xd5\x92\x45\xda\x6e\x0e\x15\x4a\xbc\x83\xca\xb5\x62\xc7\xe2\xf8\xd4\x3a\xed\x82\x18\xe4\xa6\x6f\x5e\x00\x22\x3e\xb6\x4a\xfd\x9c\x85\x1c\x72\x29\x98\xa4\x12\xbf\x46\x81\x95\xd6\x9b\xa5\x95\x2f\x7a\xd9\xb8\xbe\xa6\xbd\x0a\x5b\x14\x3c\xad\x12\x06\xde\x76\x5c\x98\x2c\xca\x87\x95\xc6\xdc\xa5\x5c\x97\xe3\xc9\x3e\xd1\xfe\x89\x18\x9f\xf8\xe6\xcf\xf3\x17\x9d\xe1\x8e\x9b\x96\xbf\xbc\x50\x97\xdf\xb3\x5e\xe9\xbb\xa5\xaa\x28\x27\x6b\x2d\x48\xe2\x99\x66\x4f\xb6\xf3\x95\x39\x1b\x2d\x26\x84\x0f\xb5\xcd\x62\x47\x7a\xb0\xd5\x19\x4e\xca\x60\xc8\xdc\xda\x04\x0e\xf7\xb3\x60\x7c\x34\x76\x46\x03\x77\x32\x55\x94\x77\xf2\xd1\xb0\x51\x1c\x9b\x6e\xd0\xdc\xdb\xb9\xc4\x2d\xe5\xfb\x4b\x36\xad\xae\xae\x51\x40\xfb\x10\x35\xae\x9b\x00\x7d\x8c\x1a\x57\x1f\xba\x13\x31\x4f\x3e\x72\xe7\xb2\xbf\x1f\x8c\x1b\xa8\x91\x1e\xfd\x67\xcb\xb1\x5e\xd2\xdb\xee\xe6\xca\xb7\x38\xdd\xcb\xf8\x9c\xd3\xa5\x4d\xff\xde\x72\xac\x7f\xa9\x9e\x75\xcb\x57\xf2\xc8\x5e\x9d\xd7\x5a\xfc\xa5\x7c\xd6\x57\xf6\x2a\x8d\xb3\xba\xd6\xa3\xee\xa1\xff\x82\x4a\x33\xbc\x5b\x67\x40\x6e\x2e\x59\x4f\x0b\x82\xcc\x64\xd7\x18\x34\x16\xe1\x70\x53\xd1\xd9\xd2\x18\x18\xed\x7a\xe0\xf8\xdb\x46\x6d\xae\x65\xc2\x4e\xcd\xee\x2f\xbc\x4a\x4d\xab\x96\xa3\x90\x60\x5f\x91\x08\x55\x0b\x93\x56\x3d\x37\xaf\x99\xbe\x25\xb5\x59\x6c\x6f\x17\x0a\xed\xd2\xf7\x95\x80\x50\x85\x8c\x07\x01\x66\x94\x10\x96\x44\x88\x90\x24\x56\x49\x82\x03\xa0\xb0\xe4\x89\x80\x09\x0e\x64\x08\x31\x41\xe2\xd4\xc3\x81\xc6\x9c\xb3\x88\x10\xae\x40\x08\xe3\x9f\xa8\x84\xd2\x42\xa5\xdb\x96\x2f\x01\x3e\x31\x7c\xbd\x4c\x9e\x31\x89\x03\x00\x2e\x76\xaf\xc7\x31\xe9\x13\xbb\xd7\x99\xa7\x5d\xb4\x92\x14\x31\xa9\x52\x6b\xf7\xfc\x24\xb3\x03\x32\x8a\xe7\x46\x63\x5f\x51\xc5\xe9\xb0\xdd\xcd\x6b\xc8\x1a\x8f\x72\x93\x7e\x6d\x32\x00\x55\xc6\xac\x4d\x5f\x3b\x36\xe3\x51\x47\xe9\x4e\x25\xd2\x0b\x40\xb5\x54\x66\x5f\xec\x1f\x76\x65\xaf\x51\x19\x94\x34\xb6\xab\xb1\x92\x24\xd5\xfa\xd8\x1a\xbb\xe6\xdf\x88\x49\x0f\x15\x7b\x4d\x91\xfe\xb3\xc5\x5e\x53\xc4\x84\x87\x8a\xbd\xa6\x4d\xff\xde\x62\xaf\x7f\xa9\x26\xf7\x2e\x26\xfd\x21\x4c\xd0\xbe\xe1\xac\xee\xa1\xff\x82\x49\x3b\xd9\xc9\xf5\xb3\xdc\x68\x42\xc8\x46\xd5\xb2\xb9\xdf\x4d\xe2\x6a\x7b\xa4\x0c\xbf\xd3\x71\xed\xc0\xcc\x04\x65\x17\x2f\x67\x1d\x66\x1a\xd5\x2a\xab\x77\x77\x05\xb2\x07\x85\x61\x7d\x5f\x3f\x72\x73\x92\x2f\x6b\xeb\xa8\x70\x28\xcc\x8c\xa5\x96\x9d\x2d\x71\x0f\xda\xad\x4e\x5b\x4b\xdd\xb6\x06\x21\x07\x34\x91\x44\x45\x8c\x46\x3c\x64\x1c\x07\x10\x91\x40\x50\x15\x63\x26\x94\x00\x89\x20\x54\x24\x49\x10\x47\x49\xc2\xa1\xc4\x80\x44\x22\x11\x44\x52\x4c\x43\x12\x83\xff\xfc\xf7\xff\xb0\x4c\xd1\x1b\x73\x5b\x53\x92\xe8\xe3\x64\x99\xf3\x1c\x64\x9c\x02\xcc\x91\x60\x04\x3c\x6f\x57\xbb\x95\xaa\xff\xf6\x26\x5c\x71\xac\x2f\x8d\xdc\xab\x7e\x6e\xea\x87\xa1\x11\xc0\x38\x33\x5c\x7b\x9b\x51\x73\x99\x1f\x6f\x1c\xbe\x07\x95\x3d\xef\x0c\xc9\xa4\x3e\xab\x90\x06\x6d\x69\xd6\xa4\xde\xce\xa0\x65\x7b\xb6\x1f\x56\x76\x0b\xab\xd8\x5f\xfb\x53\x53\x6b\xb5\xa1\xcc\xe8\xf4\xa0\xe6\x74\xe8\x94\xcb\xf3\xce\x7e\xa9\xc7\xf5\x52\xd1\xfd\x52\x13\xef\x2f\xa5\x4e\x5e\xa7\x5a\x3f\x60\xcf\x7a\x89\x1e\x7e\x5c\x33\x4a\x91\xfe\xb3\xa9\xf7\xdf\xe8\x35\x78\x19\x9f\x73\xb6\x3f\xe4\xb5\xb8\xa5\x79\x3c\xb2\x96\xa7\x35\x8f\x14\xf7\xe2\x1e\xfa\x2f\x5c\x7e\x35\xdb\xa1\xb5\xb7\x9d\xf1\x36\x9f\x9b\x6c\x4f\xc3\xe1\x46\x44\x46\x25\x86\xb3\x4c\x71\x14\x18\x8e\xb9\x69\x6b\xb9\xee\xa8\x9d\xac\x17\x30\xa8\xf8\xc7\x4a\xa9\xdf\xf0\xc3\x4e\x71\xaf\x59\x56\x94\x24\xbd\x8d\x9a\x96\x62\xff\x38\x38\xb0\xf6\x2a\xd8\x4d\x47\x8d\x41\xeb\x1b\x9a\x44\x07\x49\x1c\x0a\x20\x00\x45\x28\x0e\x03\x0e\x55\x80\x91\x40\x88\x86\xa1\x4a\x38\x86\x00\xc9\x38\x52\x49\x80\x28\x51\x02\x71\x45\x68\x18\x53\x01\xc2\x20\x96\x54\x71\x84\xe1\x0f\x2e\xff\x7c\xe1\x56\xc8\x6e\xf0\x76\x06\x30\x17\xf0\x23\xee\xfe\x3a\xfb\x82\x16\x0c\x62\x92\x42\x14\xf0\xdb\xd3\xfd\x85\x37\x3c\x20\xf1\x7e\x10\x05\x6c\x4c\x8f\xdb\x6a\xcf\xf4\x73\x70\x83\x73\x76\x33\x6f\x19\xe3\x42\x67\x3a\x02\xb6\xb3\xe0\xb9\xca\x3c\x51\x87\x78\x57\xac\xaf\x8a\x25\x39\x6e\x92\x7c\xb3\x62\xee\x2a\x2e\x1a\x36\x8a\x87\x65\x67\x92\xe3\xfb\x28\xb7\xcf\x97\x82\x6a\xc5\x73\x03\xad\xb0\x67\x7a\xa3\x5f\xf6\xe6\x6e\x3e\xad\x28\xe0\xe2\x63\xa9\xe9\x55\x52\x0e\xdc\x43\x2d\x43\xbd\xcb\xd7\x6b\xef\x52\xbe\xc5\xdf\xd3\xa3\xff\x01\xc7\xf8\xb2\x96\xf1\x78\xe4\xe9\xdc\x28\x64\xf9\x58\xbd\xf9\xe5\x5f\xc7\xe7\x3c\xed\x89\xc8\x57\x0a\x84\x6c\x3f\x41\x5f\xd3\xfe\x9c\x35\xe9\x5d\x7c\xe9\x3f\xbc\x17\xa7\xb3\x98\x5d\xbd\x8b\xe2\xce\xbd\x78\xf2\x2c\x4e\xf4\xaf\xe0\xe9\x2e\xfa\x2f\xf8\x42\x05\x3f\xfa\x39\x5b\x8b\xc2\xf5\xae\x3e\xda\xef\x5d\xda\xb0\xe6\xb4\x9a\x1b\x2e\x36\xbb\x66\xc9\xc3\x95\xe9\x4a\x6f\x85\x7a\x63\xdb\x6d\x65\x72\xe0\x98\xab\x18\x66\x75\x06\x06\x6a\x01\xe7\xbd\x58\x78\xae\xaa\x1f\x26\xc3\xa6\x05\xec\x9e\x5e\x89\x7b\xa3\x59\x03\xb2\x56\xfa\x59\x26\x08\x53\x12\x25\x02\x20\x08\x21\x81\x22\x90\x52\xc6\x18\x2a\x24\x19\x89\x20\x0b\x45\x9c\xc4\x22\x26\x12\x85\x3c\xe2\x24\x8a\x29\x91\x58\x0a\x44\xa1\x04\x31\x04\x04\x26\x2f\xf8\xf2\x64\xa9\x16\xc8\x6f\xe3\x8b\x94\x1f\x7a\x59\x5e\x67\x7f\xe2\x0b\x25\x17\xfd\xe1\x71\x7c\x79\x9b\x11\xf1\xcb\x1b\xf9\x80\x2c\xfb\x11\xbe\x18\xac\xb3\xd5\xfc\x32\xdc\x0d\xc6\xab\x88\x1f\x7d\xa3\xb8\x06\x03\xcb\xc9\x8e\xe7\x73\x97\xd9\xc5\xe2\x34\xab\x89\x56\x71\x2c\x87\xcd\x61\xa5\xea\x0c\x37\x6e\x2d\xb7\xd6\x78\xd2\xd8\xd7\x69\xa9\x09\x72\xdd\x72\xb8\x76\x0f\x62\x61\x8d\x0f\x2b\x50\x60\x49\x33\xce\xaa\x9d\xf3\x17\xe0\x8b\x13\xd5\x6a\xed\x67\xf9\x7b\x8a\xf4\x1f\xca\x72\x49\x05\x5f\x7e\xe1\xef\x0f\xe9\x0f\x7f\x30\xb3\x42\xd3\xfe\x9c\xce\x90\x72\x96\xc9\x53\xfc\x5d\x4b\x09\x5f\xae\x64\x8d\x47\xf0\x65\x97\x19\x2f\x77\xb6\x2e\x55\x61\x1e\xe6\x63\x81\xb4\x43\x18\x15\xfa\xcd\x2d\x0d\x82\x96\xd3\x1f\x34\xba\xd9\x5d\xcd\xd2\xbb\x89\x0f\xc8\xd1\x68\xce\xf8\xc8\xd8\x85\xae\x83\xc1\xaa\x15\x37\x46\x52\xeb\x34\x10\x6f\x55\xb6\xa5\x7e\x57\x2d\xab\xba\x33\x05\x78\x8b\x2b\xe9\x37\xc1\xa3\x08\x0b\x11\x48\x11\x93\x18\x33\x05\x39\x27\x32\x90\x04\x73\x82\x38\x50\x8a\xd1\x30\x0a\x39\xe2\x50\x85\x14\x22\xce\x13\x20\x69\x10\x04\x22\x81\x2a\x90\x11\x46\x48\xfd\xc0\x97\x9f\x85\xaf\xf5\x62\xa9\xe8\xd5\x4a\x39\xab\x90\x77\x1c\x4c\x28\xed\x78\x1d\x9b\xea\x46\xae\xeb\xb9\x55\xdf\xaa\xd7\xed\x82\xee\x57\x6a\x2d\x17\x53\xbd\xe6\x92\x4e\xbb\x81\x4b\xdd\xf2\xc9\x73\x42\x20\xc7\x58\x22\xc0\xf9\xad\x2c\x13\x06\xa9\x80\x1f\x6b\x32\x3f\x67\x21\x15\x12\x62\x2e\x09\x20\xaf\x11\x60\xc5\xd2\x08\xc7\xb3\x62\x2b\xaf\x78\xe2\xc8\x75\xbc\xdf\x0c\xec\x7c\x95\x54\x77\x9d\x4a\xb3\x60\xf5\x87\xcc\xc5\xa0\x49\xd4\xba\xd3\x39\x05\x08\x9d\x2d\x55\xa6\xf6\x79\x96\xc9\x5b\x7f\xfe\x83\x05\x92\x2e\x37\xf7\x95\xbe\x5b\xa1\x0d\x7d\xd6\x81\xc0\x2c\xce\x4a\xb9\xdc\x6e\x57\xd9\x80\xf6\x2e\x93\x64\x42\x17\xd8\x43\x57\x5a\x0e\xdb\xe1\xb1\x74\xb3\x56\x41\xad\x27\x82\x23\x22\xd6\x72\xe8\x35\xc3\x31\xa8\x47\xa4\xda\xb3\xd5\x6c\x02\x0e\x33\x7b\xdf\x53\xc5\x81\x59\xdf\x75\xed\x5c\xc5\x73\x55\x6a\xbe\x93\xe2\xd5\x57\x47\x8b\x66\xc4\x7a\x63\x37\x3a\xae\x05\x47\x90\xdb\xac\xe0\x2b\xdc\xc3\x39\x7f\x5f\xe9\x75\xec\xda\xdc\x48\xea\xb5\xfe\x01\x76\xc3\x93\x65\xef\x2a\xd3\xc3\x7c\xfd\xbd\x7b\x7d\x17\x29\xd2\x37\x1f\xa1\x7f\x95\x73\x3f\xba\x7c\x5f\x6f\xcc\xab\x78\xa1\xb7\x73\xd8\xc1\xc7\x6d\xe8\xad\xc2\x59\xbf\x7f\x8c\x0d\x65\x0d\xcd\x43\xce\xf7\x33\xa3\xaa\x34\x33\xf9\x72\x7b\xbc\x3e\x7d\xfe\xca\x9f\x7d\x6f\x51\xb9\xab\xe1\xd0\x65\xe9\xfd\x35\x5f\xf9\x62\xee\xbc\xff\x5a\xbb\xdd\xfc\x09\xc7\x77\xd6\x92\x48\xfb\x7e\x3c\x74\x3e\xa9\xd3\xff\x65\xbc\xfb\xcf\xef\x21\xe1\x95\x54\x79\xef\xfd\xb8\x44\x96\x9d\x5b\xa1\x55\xb4\x07\x7c\x6b\xe3\xe7\xe8\x9f\xed\xc3\xf7\xd3\x7f\x41\xc2\xe3\xb8\x50\xea\x87\x9e\xeb\x4e\x7a\x33\x33\x6f\x68\x07\x5e\xf7\x0c\x9a\xa5\x6b\xc3\x0d\xaa\x06\x68\xf1\xa5\x11\x7b\xd0\x10\xad\xfe\x01\x85\xc7\x6d\x38\x3c\x60\x54\x8d\xaa\x1b\xaf\x6e\xe1\x1e\xd2\xba\x87\x41\xd8\x2c\xf5\x42\x3b\xb7\x9b\x14\xea\xf9\xdc\xc8\x37\xf7\x51\xfa\x9a\x16\x21\x2a\x64\x4a\xc4\x11\x89\xc2\x58\x51\x82\x82\x04\x06\x41\x84\x30\x00\x30\x8a\x64\xc4\xb8\x50\x09\x94\x4a\x28\xc2\x60\xc0\x28\x8e\x39\x43\x01\x47\x14\xc7\x51\x1c\x09\xf4\x03\x09\x59\x9a\x48\x78\x2b\x16\x9a\x61\xca\xe9\x87\xe5\x95\x5f\x67\x21\x25\x0c\x0a\x81\x18\xa7\xe8\x79\x24\xfc\x24\x16\xfa\x69\x24\xe4\x93\xd5\xec\xfa\xe6\x5e\x90\xd0\xc9\xc4\xcd\x42\xcd\x6b\x75\x47\x19\x5b\x5b\x70\x87\xe5\x45\x04\xb3\x9d\x26\x0d\x37\x33\x10\xcc\x87\xe5\xbe\xdd\x5b\xe7\xe2\xc6\x61\x8c\x79\xab\xcd\xcb\xfa\xbc\x9b\xe8\x53\x66\xf8\x6d\xc5\xc7\xae\xd3\xae\x76\xfa\x39\xc5\x4b\x86\xc6\xab\xb1\xc0\x5a\x9d\xc0\x91\xaf\x8d\xd2\x43\xc2\xab\x0f\x3d\xc2\x69\xe0\x65\x7f\x1f\xf2\xe2\xa7\x48\xff\x21\x24\xbe\xe2\x74\xc3\xcb\xf7\xff\x36\x24\x3c\xfd\xfd\x97\x22\xf5\xbb\xfa\xd3\xf0\x32\xff\x08\xd7\x3e\x7b\xd9\x0b\x97\xbb\x7a\x2f\x6a\xa4\x88\x5a\xf7\xd0\x7f\x41\x0d\x4e\x69\xa5\x27\xa3\xfa\xa4\x49\x7c\x7d\xb9\xe2\xb3\x64\x8f\x3d\xd9\xad\x8d\x37\x6c\x58\x5f\x4c\x2a\x1b\x33\xd0\x81\x45\xcb\x25\x2f\x59\xd7\xbd\xd5\xaa\x34\x1e\x8b\x52\x32\xab\xf6\xdb\xc7\x4d\x5b\xa3\x2d\x18\x98\xd6\x71\x35\xab\x18\x2b\xc8\x8f\x2a\x97\x1f\x76\xea\xbd\xf4\x1b\xf7\x91\x18\x11\x82\x92\x18\xc5\x22\x8a\x84\x62\x82\x51\x0e\x94\x4c\x28\xe6\x81\x0a\x51\x42\x01\xa4\x38\x90\x42\xe0\x44\x44\x50\xca\x90\x25\x84\x03\x18\x87\x48\xc8\x10\x07\x27\x2f\x3f\x4d\x13\x35\x6e\x45\x9e\x31\x42\x11\xfb\x18\x35\x7e\xce\x42\x0a\x30\xc2\x82\x4a\x42\xd9\xf3\xa8\x71\x33\xf6\xec\x5b\x50\xa3\xba\xe9\x2d\x32\x39\x0c\xe6\x51\x78\xdc\xb6\xdb\xf6\x51\xd6\x1d\x9c\x31\x2a\x71\x3d\xea\x2c\x54\xd6\x5b\x45\xa8\xea\x47\x3d\x56\xcd\x6d\x78\xbc\xda\x3a\x51\xb3\xe3\xe2\xe9\x76\x96\x33\x8b\x87\xd8\x3e\x0a\xd3\x94\xc7\xba\x3b\x68\x0c\x16\xb3\xe5\x2e\x3f\x9e\x64\x34\x3b\xd9\x15\x52\x43\x8d\xc2\x95\xfe\xf7\x00\xd7\x7e\x89\xfd\xba\x8a\xbf\xbd\x93\x6b\xa7\x48\xff\xb1\xd8\xb3\x0b\xa7\x1b\x5c\xbe\xff\xbb\xb9\xf2\x97\x32\xf5\xff\x52\x54\x7b\x17\x35\x06\x97\xf9\x47\xb8\xf6\xd9\x6b\x7f\xe6\xda\xf7\xc6\x76\x5f\xed\xd5\xc3\xf4\xaf\x51\xeb\x1e\xfa\x2f\xa8\x81\x98\xbe\x24\xf9\xa4\x31\x86\x5b\x47\xb6\x5b\x61\x0d\x9a\x3c\x21\x95\x3d\xb5\x60\x30\x3f\xca\x78\x8f\x7d\xd8\x47\xc6\x0c\xd8\x7c\xcd\x0e\x82\xc2\x6a\xd7\x88\xe3\x4c\xcf\x74\xa7\x45\x12\xd6\x76\x6e\x13\x57\x2d\xbd\x58\x2a\x2d\x06\x5b\x2d\xee\x84\x44\xeb\x66\xd3\x2f\xc0\x1f\x00\x1a\x05\x41\x8c\x30\x08\x61\xc2\x09\x26\x9c\xc4\x02\x07\x21\x8b\x88\x80\x3c\x4a\x60\x82\x13\xce\x19\x83\x01\x8f\x04\xa4\x09\x67\x08\xa8\x38\x46\x81\x14\x40\x12\x71\x42\x0d\x92\x22\x6a\xb0\x5b\xb1\x61\x8c\x32\xf9\x71\x16\xcd\xeb\x2c\x24\x0c\x20\x21\x24\x82\x0c\x3c\x8f\x1a\x77\x64\xd1\xdc\x81\x1a\xf8\xbd\x88\xe5\x2b\xd4\xc8\xf9\xad\x69\x1b\x17\xa0\x83\xa9\xa9\x1d\x82\x03\x98\xac\x86\x3d\x5c\x39\x76\x93\x60\xaa\xaf\xb7\xc1\xb8\x64\xdb\x19\x49\xe6\x31\xab\xef\x7b\x66\x76\xa4\x8f\xd0\xa8\xd9\x94\x79\xaf\xe7\x0d\xc3\x65\xb0\xc8\x66\xdd\x2c\xd8\x16\x81\x36\xd3\x35\xaf\x11\x37\xa1\x68\x0d\x7b\xe9\xe9\x1a\x85\x2b\xdb\xfc\x23\x5c\x7b\x7a\xd9\xdf\x0f\xc6\x0d\xd4\x48\x8f\xfe\xb3\x59\x34\x69\x73\xba\x5f\xc7\xe7\x9c\xee\x0f\x72\x5a\x4d\xfb\x7b\x51\xf3\x56\xac\xc1\x23\x7b\x75\x5e\x6b\xe1\xb3\xfd\xf8\x6d\x67\x75\x0f\xfd\x17\x54\xb2\xfa\x8d\xc8\x53\xc3\x16\x4f\x46\xae\x51\x5c\x96\x1b\xc1\xc1\x31\xd4\xb1\x3a\x96\x0b\x55\x42\x72\xd1\x9a\xf9\x21\xc7\x83\x31\x9f\xe7\x6d\xad\x99\x71\x4b\xcd\xa0\x5e\xad\x81\x28\xce\xc5\xd5\xcd\x7a\xb1\xcc\x4a\x23\xdb\x10\x53\x57\xef\x15\x72\x51\x91\xd6\xbc\x7d\xc3\x49\x5f\x97\x61\x11\x17\x09\xe4\x49\x90\x04\x08\x43\x1e\xb1\x20\x61\x5c\xc6\x30\xa6\x04\x81\x04\x53\x88\x00\x4f\x12\x06\x55\x94\x24\x08\x2a\x06\x40\x1c\x88\x44\x50\x48\x69\x88\xe3\xe0\x14\xcb\x96\x42\x45\x4b\x7a\x0b\x8b\x18\xe5\x1f\x37\x41\x7d\x9d\xfd\x89\x6e\x44\xb0\x14\x62\xd9\xde\xc6\x5d\xfd\xf2\xae\x3e\xc0\x0b\x3f\x6a\x42\x9e\x99\xf4\x4a\x85\x63\x77\x91\x8c\xdd\x42\xa9\xb0\xe8\x4c\x65\x79\xa9\x06\x9b\x83\xb9\xe7\x5e\x2d\xf1\xec\x56\x7f\x7b\x70\xf1\xaa\xe0\xe6\xa6\x76\xe4\x74\xfa\x23\x67\x4d\x79\xab\x95\xe5\xb4\xbc\x6e\x1d\xc8\x32\x56\xcd\xcc\x70\xe9\x23\x95\x2f\x75\x87\x18\xcf\x37\x9b\x58\x58\x69\xc5\x1a\x5c\xbf\x03\x77\xfa\xfa\x9b\x79\x77\x13\x5f\xd9\xaa\x9c\x77\x29\xdf\xc2\x9f\xf4\xe8\x3f\x14\x4b\x77\x85\x3f\x4f\xc4\x4f\x55\x22\x9d\x92\x67\xe3\xa7\xfe\x60\xfc\x96\xa6\xfd\x39\x9e\xfe\x2e\xbe\x84\x8f\xef\xc5\x8f\xb3\x60\x57\x25\x3d\xc9\x9d\x7b\xf1\xec\x59\xbc\xbd\x0b\xf7\xd0\x7f\xc1\x97\xed\x7c\xa6\x0f\x2a\x28\x98\xd2\x96\xae\x0f\x4a\xe3\x79\xb6\xc1\x70\x61\xb9\xea\x57\x62\x78\xc4\x70\x3f\x2e\x84\x62\x54\xe5\xba\xa9\x75\xf7\xd3\xe6\x78\xd6\x35\x96\x71\x0c\xad\x5a\x26\xd3\xe0\xed\xca\xa6\x84\xa7\x66\x76\xc6\x50\x75\x9a\x3b\x4c\x7c\x29\x59\xb8\x9c\x6e\xd3\xaf\x36\x13\x86\x32\x62\x8c\x12\x08\x61\x12\xc4\x14\x40\x2a\x09\x01\x20\x52\x12\x40\xc5\x41\x44\x38\x11\x32\x60\x1c\x32\x1c\xa1\x00\x93\x44\x86\x38\xc6\x28\x90\x08\x06\x14\x44\xa7\x58\x83\x9f\x15\x2d\xf5\x82\x65\xd5\xdd\x52\xbe\x92\x67\x45\x83\xeb\x25\xea\x14\x88\xd7\xd6\x7d\xbd\x52\xad\x57\x2d\x56\xf3\x35\x5e\x6c\xea\x75\x6c\xd5\xf2\xb5\x62\xd7\x6d\xfa\xbe\x95\xa3\xe6\xa9\x81\x25\xa4\x92\x11\x08\x39\x00\xf8\x16\xd2\x70\x4e\xf0\x87\x0d\xc8\x5e\x67\x21\xe6\x04\x0b\x49\x39\x65\x97\x58\x83\x5c\x63\xdf\x9b\x71\x23\xd3\xa8\x91\x71\xa4\x86\x63\x36\xd8\x15\x87\xfe\xba\x4c\x33\x5a\xd2\xac\xb4\xa2\x71\x1c\x31\xb5\x9b\x0e\xcf\x1d\x96\x4e\x48\x93\x3b\x95\xdd\x2e\xbf\x39\xe2\x4f\xb2\x62\x3e\xf0\xc5\x7d\x3e\x72\x95\x22\xd9\x9d\x7e\xc9\xd4\xac\xc3\xba\xb5\x1f\xee\xab\x24\x9c\x16\x2b\x4b\xb3\x38\x6a\xcc\x97\x53\xb3\x21\x07\xf6\xdc\xd9\x6b\xab\xaa\x63\xf9\xcb\x66\x2d\xbb\x5f\xdb\xed\x51\xb6\xd6\x45\xb3\x66\xbf\xd5\xc9\x64\xfb\xe5\x7a\x61\x94\xe9\xfb\xbe\xd9\xb3\x10\xb4\x13\x2a\xaa\xd9\x20\x2c\x96\xac\xf9\x62\xbc\x2a\xa4\x95\x15\x73\x5d\x65\x77\x64\x95\x6d\x7d\xb8\xaa\xd1\x42\x76\xd0\x86\x07\xc7\x5b\x94\xb5\x49\x75\x00\xb6\x53\x92\x93\x95\x7d\x1d\xb5\x29\x9e\x1f\xf5\xb8\x72\xfe\xe5\x1f\xe8\x9a\xb4\x2e\x7b\x5a\xba\xfc\xfe\x99\xbb\x3f\xe2\xcf\xd6\x51\x9b\xf8\x1d\xb8\x0b\xed\xd6\xc6\x47\x72\x7d\x5a\x61\xef\xca\xb2\x9d\x3f\x44\x48\xad\x3b\x05\x53\x2c\x66\x62\x94\xdb\x17\x90\x35\xad\x1e\x03\x3f\x59\x4b\x63\x6d\xe3\x4a\x58\x68\x19\x07\xbf\xe3\xee\x9d\xd3\x4a\x7e\xe9\xed\xe5\xbe\xb1\x94\xde\x79\x87\xb4\xb1\x5b\xc6\x67\xcf\xfd\x89\x1b\xea\x17\xc9\xfc\xb1\xa6\x75\xa7\xef\xaf\xc7\xb1\x6d\xad\x95\xbd\x1f\x97\x27\xd5\x6d\xe8\xfe\x58\x61\xe1\xca\xde\x97\x13\xd3\x68\x5a\x6e\x0f\x72\xb5\xd2\xa2\x56\xd4\x54\xa3\xda\xef\x1e\x15\x9a\xe4\x79\xe2\xf2\xfa\xfa\x68\x1f\x2c\x4d\x4c\xac\x51\xa5\x79\x66\x71\x6f\x7b\xab\x5d\xd9\x0f\x77\xff\xda\xe7\xbf\xd2\xa9\x75\xb7\xb5\xf2\x4b\xce\x2e\x3b\x1a\x66\x8a\x9e\x57\xa0\xf1\x6c\xa5\xfb\xa8\xdc\xc8\x24\xbd\x3c\x38\x5a\xf9\xae\x37\x8d\xa7\xaf\xef\xf0\x0f\x24\x95\xf2\xb4\x12\xfb\xb4\xde\xab\x1e\x12\xe7\xf5\x3d\x12\x8f\x54\xee\x7a\xfd\x7e\xe8\xe5\x56\xdd\x06\x1d\x86\x08\xfc\x58\xa1\xae\x5d\x65\x35\x25\x45\xdc\x3d\x40\xbf\xd7\x3c\x2c\x86\x07\x37\x6f\x0e\xfd\x8e\xc2\xd5\x79\x3f\x83\x81\x03\x42\xb5\x5f\xf5\xdd\x5a\xb1\xdf\x35\x4c\x7a\xfa\xf8\xfb\xef\xfb\x05\xbd\x93\xa7\x9e\x3f\x73\x36\x07\x9d\x9f\x7f\xf6\xe4\xf3\x57\xbe\xfb\xf9\x5f\xd7\xf7\x2c\x7f\x3b\xb5\x12\xfa\x1f\xe1\x6f\xe7\x36\xdb\x6a\xd9\xae\xf8\xa2\x19\xdb\xf4\xd0\x2c\xed\xf5\xae\xb9\x08\xe8\xde\xdc\xfa\xfd\x45\x73\xe5\x96\x8d\x66\xbf\x53\x02\xc7\xac\x08\xeb\xe3\x6e\xed\x88\xa2\x85\x49\xda\xd6\x76\x4b\x1a\xa0\x51\xac\xcd\x3a\x76\xae\x90\x8b\xd6\xf5\x69\x26\x31\x12\x34\x39\x34\xfa\x41\x30\x0f\xf5\xd4\x6b\x49\xb0\x10\x0b\x15\x45\x54\x41\x1e\x25\x08\x40\x1c\xd1\x80\xc6\x08\x42\x45\x42\x8c\x10\x14\x21\x0b\x63\x09\x01\xa2\x18\xb2\x10\x06\x41\x88\x44\xa8\x20\xc2\x90\x31\x48\x23\xfa\x22\xa5\xa0\xd4\xa4\x14\x72\x5b\x4a\x61\x1f\x77\x1f\x3a\xcd\x5e\x49\x29\x0c\xb2\x8b\x3e\xfc\xb8\x94\xf2\xb6\x88\xee\xd7\x72\x77\x6f\x8d\x87\x38\xea\xd5\x68\xfe\x7c\x43\x72\x9a\x13\x82\x85\xdd\x99\x8e\x60\x67\xd9\x68\x79\x0d\x36\x70\xad\x99\x0a\x0a\x8e\x9f\xcd\x19\x93\x9e\x0d\x8f\xcd\xc9\xb8\x76\xe8\x81\x70\xd6\x18\x44\x78\xd8\xcc\x95\xf0\x51\xb6\x44\xa6\x50\xb3\x35\xc7\x2c\x57\xcb\xbd\x91\x9b\x5f\xf7\x6c\xdf\xea\x59\x76\x65\x30\x83\x7b\x3f\xf3\xc5\xaa\xab\xbf\x5b\xba\x29\x5f\x7e\xff\xa1\xb7\xff\xfc\xa3\xff\x63\xd2\xcd\x39\x50\xe5\x09\x74\x3f\x8d\xff\x5d\xe9\xe6\x7f\xe8\xf9\x53\x94\x6e\x76\xff\xbc\x4f\xa9\x4b\x37\xd7\xe3\x5d\x3b\xc3\x93\xcf\x92\x01\xda\xbf\x50\x52\xf9\x5f\xd2\xc4\x4e\x92\xca\x77\x81\x47\xca\xb9\x81\x52\x46\x8a\x31\x0c\x23\x2a\x68\x40\x69\x10\x63\x06\x50\xc2\x18\x88\x15\x0d\x69\x00\x80\x10\x11\x22\x01\x24\x21\x26\x44\x71\x14\x2b\xa5\x50\xc0\x50\x24\x03\x21\xb1\xf8\x21\xa9\xc0\x34\xed\x29\x37\x73\x37\x24\xc1\xf4\xc3\x1a\x23\xaf\xb3\x10\x63\x48\xb0\x94\x00\x71\xf4\xbc\xa4\x52\x7a\xef\x46\x9f\xc7\xef\x96\x54\xae\xe8\x5d\x49\x2a\x60\xb7\x1c\xc4\xcb\x69\x63\x99\xa1\x35\xe4\xea\xf1\x6c\x0a\x37\x43\x3a\x59\x3a\xe5\x6a\xd3\x59\xd6\xfc\x5a\x6d\x40\x97\x03\x55\xde\xf4\xb2\xd3\x65\x6c\xb6\xfa\xab\x5e\x23\x3b\xc2\x63\x4d\x16\xed\x79\x3b\x8c\x32\xeb\x40\x55\xcc\xd2\xc4\x2b\x4d\xac\x7d\x5e\x37\x2b\xc3\x4e\xed\x8b\x1d\x45\xbe\x24\xa9\xe4\xaf\xe3\x84\xee\x7f\xfb\x7b\xf6\xe5\x2c\x8a\x97\xdf\xff\x7b\xde\xfe\x5f\x2c\xab\xee\xe9\x68\x2f\x7f\x3f\x80\xd4\x24\x77\x62\xc1\x67\x3b\xc4\xdb\x3a\x89\x7f\x85\x1d\xe2\xdd\x38\xa7\x8b\xa4\xf2\xef\x7c\xfe\x7f\x93\x1d\xe2\x3d\xe9\x26\x7e\xee\xf9\xcf\x97\xe6\xfc\xfc\xa3\xbf\xf1\xf9\xdf\x8d\x28\xfa\x37\xf1\xb7\x93\x74\xf3\x5d\x80\x93\xae\x74\xa3\xb0\x8a\x08\x0f\x30\x84\x31\x40\xa7\xb2\x9e\x1c\x29\x0a\x08\x62\x21\x0d\x29\x21\x24\xa6\x88\x41\x82\x61\xa2\x28\x67\x20\x16\x31\xe5\x84\x71\x25\xb8\x8a\x88\x3c\x75\x81\xc6\x20\x4d\xe9\xe6\x56\x3e\x0e\x07\x82\x7f\xec\x2d\x3a\xcd\x9e\x3a\x6d\x22\x21\x88\x04\x08\x49\xce\x9e\x97\x6e\x8a\xef\xdd\xe8\xf3\xf8\xdd\xd2\xcd\x15\x47\xbd\x92\x6e\x78\xb7\x52\x5a\x08\xb0\x51\x6e\x63\x9d\xa1\x74\x91\x61\x6d\x77\x69\xe3\xfc\x72\xcb\x8e\xf9\xb5\x53\xde\x8d\x12\x6d\xbf\x5f\x75\x23\xbf\x56\xd8\x8c\xf8\xbe\xbb\xea\x85\x87\xbe\xa3\xb7\xbd\x61\x3f\x76\x5c\x79\xe8\x69\x1d\xb8\x5d\x1f\xc2\xc8\xb3\x09\xd4\xf6\x0d\xab\xbe\xd6\xd2\x94\x6e\xae\xe3\xd9\x1e\x78\xfb\x93\xcb\x59\x14\x2e\xbf\xff\x77\xbe\xfd\xaf\x7f\xe7\xae\x7c\xcc\x8f\xa0\xfb\x99\x65\x9e\xd1\xfd\x6d\xfc\xda\xdf\x8b\xee\x57\xd2\xcd\xbf\xf2\xf9\xff\x4d\xe8\xfe\x9e\x74\x13\x3d\xf7\xfc\x46\xef\xf2\xfc\xbd\xbf\xfd\xf9\x5f\xff\xfe\x37\xf1\xb7\x73\xde\xd8\x37\x01\x4e\xca\x5e\x26\x99\x30\x12\xc4\x20\x11\x40\x86\x40\x48\xc9\x14\x4c\xb0\x24\x71\xcc\x25\x05\x00\x06\x04\xc4\x71\xcc\x64\x10\x85\x8c\xd3\x20\x64\x38\x4c\x22\x28\x31\x8a\x70\x10\x24\x21\xfa\xcf\x7f\xff\x0f\xc9\x34\xa5\x9b\x5b\x79\x63\x1c\x0a\xf6\x71\xdd\x8d\xd3\xec\x29\xea\x12\x11\x4a\x09\xa0\x94\x09\xf0\xbc\x74\xf3\xb6\xd1\xf2\x1d\xd2\xcd\xbb\x79\x67\xef\x8f\x2b\x69\x65\xc0\xe4\xc2\xc8\xab\x71\xbb\x21\x35\x61\x6b\xc1\xe2\x30\x62\xb3\xc2\x7e\x50\xd1\x51\xc9\xf3\xcc\x69\x6c\x0d\x86\xc9\x3e\x4f\xdb\x87\xb2\x5d\x70\xbb\x55\x6d\xef\x38\x4a\xaf\xcd\x0b\xc1\xb8\xc5\x6a\x70\xee\xd7\x3d\x5c\x22\xce\xb8\x94\xef\x92\x7e\x21\xda\x17\x8f\x06\x4b\xd3\x6b\x94\xbf\xfa\xea\x23\x6f\x33\xb9\xec\x6d\xfe\xf2\xfb\x7f\xe7\xdb\xfc\xfa\x77\x0e\x5c\xfe\x7e\x04\xad\xcf\x71\xa6\xe1\xe5\x42\xfc\x4f\xa0\xf5\x95\xb4\xf2\xaf\x7c\xfe\x7f\x13\x5a\xbf\x27\xad\xa8\xe7\x9e\xdf\x32\x2f\xcf\xaf\xfe\xf6\xe7\x7f\xfd\xfb\xdf\xc4\xdf\x4e\xd2\xca\x77\x01\x4e\xba\xd2\x4a\x12\x63\x0e\x78\x12\x46\x54\x09\x42\xb0\xa4\x8a\x4a\x91\x60\x18\x29\x0e\xa5\x62\x10\x41\x11\x11\x15\x07\x24\x16\x51\x14\x9d\x64\x16\x8c\x13\x22\x18\x03\x42\x42\x00\x7e\x48\x2b\x22\x35\x69\x85\x49\x79\x2b\x72\x97\x23\xc9\xd8\x87\x9e\xa6\xd7\x59\x88\x00\xa2\x12\x08\x81\x45\x0a\x31\x31\xb7\xea\xd9\x3f\xc6\x71\xef\xb5\xdd\x5c\xd1\xbf\x8a\xf4\xcd\xda\x85\x9e\x29\x57\x7e\xcd\xde\x85\xfa\xa0\x10\x95\xa3\xfe\xcc\xdc\x20\xaa\x1f\x72\xa0\xab\xa9\xc9\xd0\x9d\x4d\xdd\xc2\x7a\xc3\x1a\x26\xe8\x05\x8d\x5c\xbb\x99\x1d\xc7\x98\x52\x2d\x1b\xed\x60\xb5\x16\xcc\x3c\x5f\xd6\xb2\x1b\x30\xdb\x48\x83\xf7\x69\x3b\x84\x89\x2a\xa5\x26\xd5\x5c\x7d\xe8\x81\xb7\xbe\x5f\xbf\x9c\xc1\x07\xe3\xf3\x9c\x8e\x14\xe9\x3f\x5b\xff\x3e\x45\xae\xff\x50\x4e\xe3\xf7\xd0\x7f\x3c\x56\xe3\xc1\x1c\x90\x47\xd6\x7e\x26\x64\x7f\xd6\x5f\xe2\x5b\xf7\xee\x9c\x63\x78\x3f\xfd\x97\x1c\x90\xda\x7e\x50\xc8\xd5\x42\xdb\xd8\xaf\xec\xdd\x6c\x90\x6f\x60\x3f\xc8\x95\xd7\x1b\x77\xd5\x8b\x6c\x37\x5f\x9c\x81\x52\x11\xe8\xe5\x70\x33\xea\x57\x0b\xf6\xa8\xd7\x6e\x65\xa9\xb7\xce\xc4\x6e\x0d\xab\x6a\xb3\x89\x16\x16\xaa\x35\xb3\x7c\x5d\x2a\x6f\xdd\x0c\x89\xdb\x1d\xe9\xe1\xf4\xfb\x47\x62\x42\xe3\x84\x27\x82\x2a\x16\x07\x48\xf2\x18\x27\x52\x92\x24\x8e\x13\xc4\x65\xc8\xb0\x80\x88\x21\xc1\x04\x0c\x23\xc8\x71\x00\x13\x06\x29\x14\x34\x20\x98\x89\x98\x9c\xaa\x6c\x21\x91\x5a\x74\x25\x93\xf2\x56\x74\x25\x47\x52\x88\x0f\x5b\x75\xbd\xce\xbe\x20\x89\x44\x24\x0d\xbd\xf7\x93\x7a\x29\x9f\xe8\xbd\x9f\x67\x6b\xfd\xe3\xf7\x2e\xc8\x60\xf8\xfb\x05\x3e\xce\x03\xab\xa0\xa3\xa2\xda\x14\x5b\xe1\xd2\xc5\x15\xcb\x3b\x2e\xb6\x9b\x0c\xb5\xb9\xd7\x1a\x90\xea\x34\x3f\x4e\xc2\xf2\x66\x3d\xe5\xec\x30\x76\xd5\x70\xb3\x2b\xf7\xc2\x96\x8d\xc6\x0b\xe5\x26\x63\x4e\xa3\x59\xad\xd5\x3d\x6c\x96\xa5\xb5\x55\x83\xcb\x51\xe5\x2b\x95\x8d\x7f\x37\x32\xbc\xb5\x0d\x3c\x14\x25\xf9\x1b\x91\x44\xff\x1d\xeb\xfd\x1e\xe4\xb9\x32\xdb\xa4\xce\xf9\xb5\x6f\x40\xaa\x67\xd7\x6b\x7e\xb2\xde\x77\x91\xea\x0f\x21\x45\x5a\x7b\x77\xae\xd1\xf2\x30\x52\xa1\x4a\xb0\x16\xac\xd3\x6f\x68\xeb\x81\x57\x1e\xb4\x6d\x06\xaa\xc7\x5c\x5b\xb0\x25\xdf\x6e\xea\x1b\x08\x0b\x1b\xa3\xbb\xa7\x1e\x3a\xf0\x65\x37\x93\x59\xcd\x5b\xf9\x02\x5f\xe9\xc4\x86\xb9\xf5\x3c\x98\x9a\x79\x1a\x67\xbc\xc0\x80\xb6\x5a\x2e\x0e\xcb\x7a\x53\x06\xd4\x48\xbf\x32\x32\x0a\x20\xe1\x98\x46\x3c\x04\x14\x02\x89\xa9\x24\x84\x04\x2a\x8a\x04\x8f\x79\x12\x4b\xa4\xa4\x88\x25\x92\x34\x42\x61\xc0\x60\x08\x68\x8c\x68\x04\x13\x1e\xc7\x10\x24\x11\x7e\x41\x2a\x9c\x1a\x52\xdd\xca\x8b\xe7\x18\x80\x4f\x74\x1e\x0c\x00\xbf\x02\x2a\x46\xd3\x70\x3f\x7f\x52\x0e\xf2\x13\xa0\xfa\xac\xbc\xf8\x9b\xdf\xbb\x52\x61\x4a\x1b\x17\xc6\xfb\xca\x46\xf4\xa3\x44\x44\x4e\x2d\x6e\x95\x3d\x64\xd8\xfc\xc7\x5d\xe9\x74\x0a\x2d\x2b\xef\x15\x2b\x1d\xdb\x96\xa5\x49\x7b\xe9\xce\xba\xc6\x1a\x35\x58\x90\x85\x1b\xdf\x6c\x17\xa7\xdb\xad\x9f\x35\x67\xc5\x0a\xad\xcf\xdb\xc3\x3e\xea\xea\x2b\x0c\xda\xbe\xf6\x17\x02\xd5\xb3\x8c\x3f\x77\xfd\xdd\xf7\xf6\x34\xe5\xf5\x1a\xbf\x63\xbd\xdf\x03\x54\x57\x59\x2c\xa9\x33\x7e\xed\x1b\x80\xea\xd9\xf5\xde\xdd\x82\xec\x0f\x01\x45\x5a\x7b\x77\x2e\x41\xf9\x30\x50\xe9\xcb\x51\xd5\x5b\x35\xcb\xdb\x82\xe7\x65\xf3\xcd\x21\x1e\xeb\x50\xf6\xf6\x9b\x1d\x52\x71\x7b\x3c\xb0\x72\x75\x78\x68\x5a\xfd\xfe\xb6\x31\x1f\x07\xa0\x64\xbb\x3c\x1a\x6d\x26\x5b\x19\x4e\x72\x56\xa3\xcb\x39\xaa\xed\x4b\x7a\xd3\x69\x05\x6d\x9f\x44\x13\x77\x59\x95\x56\x27\xfd\xe6\xc7\x24\x91\x54\x0a\x04\x58\x10\x42\xae\x12\xc4\x43\xaa\x70\x1c\xca\x58\x02\x16\x31\x1c\x87\x71\x8c\x18\x3a\x27\xde\xa3\x38\x08\xa3\x08\x85\x2a\xe6\x61\x02\x91\x52\x2a\xf9\xa9\x52\x91\xd4\x80\xea\x56\x33\x32\x8e\x01\xa2\x1f\x07\x4a\xfd\x9c\x3d\x23\x15\x04\x80\xa5\x11\x06\xfe\x49\x09\xff\xef\x71\x25\x6a\x11\xab\x1c\xf3\xc6\xb0\x15\xd5\xd7\xf9\xd9\xf1\x68\x4c\x0d\x3c\x2c\x6a\x99\x4d\xdd\xd0\x83\x25\xae\xb9\xeb\x4d\x3e\x4b\xf0\x7c\x5a\x77\x8e\x23\x98\x1f\xcd\xb6\xc5\x9a\x0b\xfd\xc3\x51\xcd\x9d\x30\x5b\x8d\x37\xad\x6c\xb9\x54\x3d\xae\xe2\x32\xa8\x15\xab\xc1\xaa\xed\xc1\xb1\x96\xa6\x2b\xf1\xea\x43\x7f\x18\x01\x8c\xeb\xef\xbe\x33\xd2\x46\x2c\xf3\x77\xac\xf7\x7b\x10\xeb\xed\x79\xa7\x89\x00\xda\x37\x20\x56\x4a\xeb\x7d\x57\x62\xfc\x0e\xc4\x7a\x14\x31\xd2\xda\xbb\x73\xa9\xfd\x87\x11\xeb\xbb\x98\x4e\xba\x88\x25\x28\x0a\x03\x44\x63\x10\x93\x20\x80\x44\x06\x08\x45\x0a\x4a\x1c\xaa\x90\x11\x1a\xc4\x32\x0e\x03\x84\x63\x9e\x70\x82\x11\x07\x3c\xc1\xa1\x84\x80\x70\x12\xcb\x90\x05\x34\x7c\x41\x2c\x9a\x1a\x62\xdd\x6a\x6f\xc6\xf1\x0f\xea\x9f\x20\xd6\x79\xf6\x27\x62\x11\x9e\x46\x21\x98\x77\x53\xf1\xce\xe3\x4b\xa1\xbd\xef\x23\xd8\x05\x05\xde\x8e\x6b\x5d\x6b\x6a\x1d\x15\x1b\x2d\x76\xf1\xa1\x50\x26\xcd\x63\xc1\x08\x97\x19\x61\xb7\x1c\xdb\x5e\xc1\x0e\x1d\x2a\x8f\x0e\x1a\xd5\x1d\x31\xe2\xd9\xf4\xe8\x6a\xf5\x71\x3c\xf4\x8b\xb2\xea\x4c\xb3\xde\x68\xa9\x66\xba\xcc\x6f\x23\xd1\x57\x74\x5c\xdd\x67\x60\x5f\x4a\x68\xef\x8b\xad\xe2\x5f\x88\x5c\x29\x21\xc1\xbb\xfb\xa9\x7d\x03\x72\x59\xbf\x63\xbd\xdf\x83\x5c\x6f\xef\x6c\x9a\x48\xa0\x7d\x03\x72\xa5\xb6\xde\xaf\xa6\x16\xff\x21\xe4\x48\x6b\xef\x0a\x95\xc7\xe8\xbf\x20\x57\x71\xaf\xb0\x33\x2f\xad\xf2\xab\x81\x9e\x31\xc5\x41\x43\x2c\xbb\xcd\x8d\x8d\x7e\x7f\x59\x6d\x6f\x7c\x6c\x65\xfc\xd1\x50\x39\x1a\x5e\x14\x05\xd0\xcc\xae\x37\x43\x7a\xd2\x6c\xce\xb3\x90\x96\x70\x49\xdb\xd6\x39\x4e\x0a\x9e\xd3\x6d\xaa\x64\xed\x27\x49\x54\x5f\x35\xda\xe9\x97\xc8\x14\x4a\x29\xa0\x90\x50\x38\x96\x32\x60\x58\x29\x2a\xc3\x20\xe2\x51\xac\x70\x42\x15\x65\x71\x88\x25\x41\x8a\x12\x11\xab\x88\x80\x50\x61\xa9\x28\x90\x11\x0b\x81\x80\x11\x79\x41\x2e\x96\x1a\x72\x89\xdb\xc8\xc5\x3e\x2e\xf7\x7f\x9a\xbd\x46\x2e\x21\xd2\x28\x0e\x62\xbf\x39\xe2\x67\x93\x52\x4e\xf3\xbf\x86\xe2\xbc\x19\x57\xba\xd7\xa8\x60\x30\x7d\x94\xcb\xd7\x64\x3c\xdb\x96\x5d\x6f\x54\x71\x8b\xdc\x1d\x99\xac\xda\x19\x4f\xa2\x92\x3d\x29\xef\x83\x41\x01\xfa\x41\xbb\xd4\x0d\x4a\xc5\xfd\x91\xd6\x04\xdd\x67\xd8\xee\x38\xf7\xf7\xfb\x70\xc5\x72\x11\x1a\x93\xc5\xbe\x3d\x6c\x70\x17\x33\x63\x57\x1f\x2c\x72\xda\x5f\xa9\x7b\xa5\x87\x08\xbd\xf7\xa5\x82\x94\xd7\x6b\xff\x8e\xf5\x7e\x0f\x82\xf9\x6f\xce\x3b\x4d\x44\xd0\xbe\x01\xc1\x52\x59\xef\x33\xc5\x32\xfe\x10\xa2\xa4\xb5\x97\xf6\xec\x31\xfa\x2f\x88\xf6\x5d\x4c\x28\x65\x44\xc3\x08\x40\x00\x89\x10\x00\x70\x9c\x88\x38\x49\x58\x82\x60\x10\x73\x16\x53\xa8\x90\x22\x49\x90\x50\x8c\x63\x4a\x41\xac\x22\xac\x10\x02\x34\x24\x22\x00\x12\x49\x06\x82\x17\x44\xe3\xa9\x21\xda\xad\x56\x04\x1c\x03\x49\x3e\x73\x73\x9d\x3b\x4d\x9f\x01\x0d\xfe\x58\xe3\xf3\x80\x96\x7f\x73\xc2\x7f\x5d\x96\xe5\xda\x5f\x8f\x57\x8b\x4a\x3d\x76\x67\xb0\x35\x6b\x21\xdb\x1f\x86\xb8\x4f\xd1\xce\x2c\x6d\xa7\xb3\x8d\xde\x70\x58\xd9\x75\xe0\x7e\x92\xd5\x96\xfd\xb5\xeb\x64\x57\x1e\x5d\x60\xda\x58\x8b\xdc\x30\xf0\x3b\xe6\xc0\x9a\xce\x33\x0d\x77\x88\xac\xae\x2e\xa4\xb3\xda\xe9\xe3\x48\xdb\xfd\x95\x80\x97\x0a\x80\x7c\x12\xd7\xfb\x76\xa4\x0d\x80\xf9\x3f\xb1\xfe\x6f\x8c\x2b\xbf\xba\x0f\xdf\x09\x30\xda\x37\x00\xe4\x5f\x1f\x17\xff\x0d\xa0\xfa\x28\xa8\x7d\xc7\xfe\xdf\x43\xff\x05\x54\xbf\x8b\xd1\xa5\x0b\xaa\x1c\x80\x24\x20\x24\x0c\x09\x88\x59\x10\x21\x45\x85\x10\x8c\x32\x15\xa1\x98\x87\x22\x12\x2c\x8a\x71\x84\x29\xe5\x21\xa3\x38\x88\x99\xe0\x84\x30\x06\x39\x8d\x18\x91\x88\xff\x00\x55\xfe\x7c\x27\x85\x9b\xb1\x8d\x94\x51\xf2\x61\x27\x85\xd3\x2c\xbe\x80\x33\xfa\xa1\x1e\x3e\xdf\x49\xe1\x6d\xd5\xff\x5f\x3b\x29\xdc\xcf\x5f\x3f\xe8\xa4\x90\x5b\x60\xbb\x66\xb4\xe3\x7a\x2d\xd9\x2d\xd6\x1d\x42\xed\x6e\x75\xd0\x8a\x5c\x39\x64\xa6\xac\xae\x8e\xd9\x71\xc5\xef\xa8\x8e\xd1\xb1\xf5\xae\x66\x34\x56\xe6\xc0\x9c\x79\xc1\x12\xe6\x3b\x56\x89\x45\xcb\xf9\x7a\x65\x9b\x63\x59\x63\x05\x99\x70\x1d\xd9\xb9\x52\x48\x7c\xb7\x92\x56\x27\x85\xeb\x77\xe0\xce\x4e\x06\x6d\x55\x8f\xf5\xab\x96\x26\xd5\x77\x29\xdf\x70\x50\xa5\x48\xff\xa1\x4e\x0e\x57\x9d\x14\x9e\xa8\xde\xdf\xde\x5b\xa4\xf4\x6c\xf5\xfe\x3f\xd8\x3d\x40\xd3\xfe\x5c\xe4\xfa\xbb\x4a\x5b\xf7\xf1\xbd\xf8\x71\x16\xe5\xab\x34\x0c\x70\xe7\x5e\x3c\x7b\x16\x6f\xef\xc2\x3d\xf4\x5f\xf0\x25\x58\xef\x87\x3b\xe8\x8d\x9a\x58\x94\x96\xed\x8d\x53\x9f\x34\xfd\x71\xbe\x55\xf3\x33\xfd\x5a\x33\xac\x64\x69\xd3\xb6\xa6\x56\x0f\xf6\x7b\x13\x57\x03\xcb\x5c\xa1\x5f\xb2\xd0\x42\xd6\x61\xbf\xb1\x99\x06\x2c\x0c\x73\xfd\x62\xd2\xcc\x0c\x6a\x5e\x66\xb7\xee\xf7\x1a\x93\x8c\x6d\x1a\xa9\x2b\x6d\x01\x67\x31\x40\x0c\x24\x2c\x14\x58\xb1\x38\x90\x38\xa1\x84\x46\x90\x47\x31\x47\x50\x01\x2e\x23\x85\x61\x2c\x60\x1c\xd3\x38\x52\x04\x26\x90\xca\x58\xd1\x24\x24\x82\x9c\x98\x3a\xfa\xd9\xab\x3a\xc7\xec\x2a\x2e\x17\x5b\x1d\x56\xf4\xeb\xdc\x34\x9c\x22\xe1\xed\x5c\x9e\x1b\x84\x56\x48\xb1\x93\xf7\xec\x12\x2b\xe7\x8b\x75\xcd\x2c\xd0\x62\xae\x51\x45\x46\xce\xf5\xb9\xfb\x03\x17\x00\xc7\x9c\x40\x81\xc8\xed\xda\x38\x4c\x7c\xd2\x49\xe1\x34\x7b\x0a\x4e\x84\x90\x31\x09\x29\xe6\xf2\x35\xe4\x23\xbf\x9f\xf0\xce\x64\xbc\x2d\xee\xf3\x34\xb7\x69\x1e\xa5\x3b\xcd\xd4\xa6\x1d\xd5\xf4\xe5\xb1\x24\x56\xcc\xef\x15\x86\x0b\xf7\x10\xce\x7c\xff\xf5\xfa\xe6\xae\xea\x53\x5c\x5d\xa7\x37\x57\xe0\xba\x7f\x9c\xe8\x6e\xe0\x7c\x1e\x1e\x54\x3d\xe3\x86\x23\x91\x6d\x15\xb3\x43\x0a\xa7\x26\xaa\xa9\xc3\xb6\xec\x4c\x0a\x7a\x81\x8d\x2a\x13\x66\x5f\xdb\x36\xa3\x63\xa7\x75\x75\x73\xaf\x1d\x6e\xaf\xeb\x71\x73\x8b\xa3\xee\x1b\x9b\xb2\x3f\xcd\x0e\xbd\x7e\x62\xb6\xf7\xa6\x3d\xe8\x55\xf4\xa2\x3d\x73\x72\x7a\x49\xa2\x71\x2b\xc4\xad\x09\xa4\xb5\xde\xae\x51\x64\x78\x5d\x1d\x67\xac\x79\x5e\x64\x0e\x54\x65\x26\xfa\x2a\xbb\x3c\xaa\x6d\x74\x98\xc9\x8d\x17\xcd\xa2\x88\x94\xbd\xce\xc0\xed\x7d\x45\x33\x7b\x1b\x9c\xa9\x3d\xb2\x9f\xe7\xd1\xfa\xbe\xfd\x7a\x93\x11\x79\xf9\xb7\x2b\xa4\xbc\xd2\x06\x12\x3b\x5c\x07\x41\x47\x4c\xcd\x64\x64\xd3\x5a\x0d\xea\x09\xc9\x44\xdd\x7d\x75\x88\x2b\xcb\xc3\x71\x3e\xd0\x06\xce\xdc\x28\x6e\xfa\xfd\xd3\x97\x2e\x9d\x4a\x73\xbf\x54\x8b\xbe\x1a\x37\x90\x32\x3d\xfa\xcf\xf6\xbc\x0b\xae\xa6\xee\x3c\x83\xab\x80\x3c\xf7\x13\x9a\x9f\x73\xe7\xb4\xe9\xdf\xea\x79\xf7\x92\x65\xab\xe0\xf8\xa3\x65\xbd\x7e\xf2\xa4\xd8\x9c\x9d\xdc\xff\x0b\x77\xfc\x7d\xc4\x7d\x60\x4f\x5f\xd0\xff\x33\x09\xe3\x5b\xcf\xf4\x25\x1b\xe1\x6e\xfa\x2f\x88\x6b\x2f\x2b\xc5\x9e\x43\xd6\x83\x24\x53\x8d\x2d\x51\xf7\x4c\x37\x28\x69\xbb\xc2\x28\xe8\x11\xb3\xb0\xc4\x41\xbb\xbe\x8d\x1a\xa1\x37\xca\x18\xb9\xc2\x74\x19\x03\xe4\x91\xce\x28\x39\xf2\xf2\xf8\xc8\xfc\xd2\x31\xb3\xad\x1e\x24\x2e\x0d\x11\x8d\x50\x1f\xe2\xde\x3a\x0a\x8a\xe9\x77\x05\x90\x28\x60\x94\x28\xce\x24\x63\x81\x62\x30\x50\x4a\x46\x09\x08\x39\x4d\x24\x54\x61\x14\xe3\x90\x52\xa8\x64\x2c\x39\x63\x1c\x03\x81\x78\x90\x10\x14\xc1\x18\x11\xae\xd4\x4f\xc4\x45\xa9\x21\xee\xad\x5a\xbb\x9c\x49\xf0\x09\xe0\x9e\x27\x7f\xe2\x2d\x17\x17\xcd\xee\x71\xbc\xfd\x24\x6b\xed\xea\x02\xb4\xdb\xcd\xfa\xcb\xff\xde\xc9\x4b\xbf\x88\xb7\xa1\x29\x9b\x7c\x96\x2b\xcd\xaa\x20\xdb\xc0\x5a\x9b\xdb\xb3\x46\x3d\xce\xec\x9b\x5c\x36\xc6\x9d\xaa\xee\x9b\xeb\x32\xac\xd7\xcc\x7d\x59\x58\xe5\xfe\x8e\x9a\xc6\xca\x2b\xcf\xb4\x6d\x21\x17\xe6\xb6\xf9\xc2\x52\x56\x4b\xaa\xb6\xee\x18\x87\xbe\xca\x8f\x0b\x9b\xa0\x5b\x2a\xf4\xc4\x6f\xc6\x5b\xff\xfb\xf6\xeb\xf7\xe2\xed\xd7\x3a\x93\x9f\xc5\x31\x5c\xed\x7e\xc6\x44\xd2\xc6\x9f\xab\x2a\x0e\xbf\xac\xe5\x42\xe4\xf4\xdf\x5b\xf8\x73\xfa\x4e\xe5\x3b\xf6\xef\x6b\x9d\xd5\xff\xdc\xfe\xfd\x1a\x16\x7d\x63\xff\x2e\x77\xf2\xcd\x78\x1a\xbf\x7f\xf3\x3b\x73\xc1\xef\x3f\x84\x9f\xda\x37\x9c\xe9\x3d\xf4\x7f\xf6\xb6\x5d\x35\x61\x6d\xd3\x33\x17\x3d\xdc\x94\x65\x95\xf3\x56\x41\xbf\x68\x71\x6e\xd5\xb6\xb0\xd4\xf6\x41\xb1\xd7\x00\xdb\xb6\x29\x9a\xe6\x76\xd7\xda\xe4\x8d\x91\xeb\xec\xd5\xa6\xa7\x8b\x9e\xb5\xb2\x85\x1a\x6c\x01\x98\xef\x32\xd0\xaf\x95\xac\x5d\xdc\x1a\xd0\xf9\x68\x36\x30\x52\xb7\xc8\x52\xc0\xa8\x8a\xb8\x92\x5c\x25\x21\x4b\xc2\x84\x47\x81\x20\x12\x87\x71\x1c\x11\x1e\x47\x48\xf1\x38\x09\x71\x08\x40\xc8\x79\x40\x94\x44\x4c\xa2\x38\x22\x82\x27\xa1\x60\xc1\x29\x70\x87\x3e\x6f\x91\xbd\x59\xb7\x84\x4b\xf1\x89\x73\xf3\xe7\xec\x4f\x39\x80\x11\xc9\x9e\xb7\xc8\xbe\xb5\x1e\xfe\xc2\x13\x1f\xe0\x61\x1f\x59\x64\xd7\xfd\x5d\x13\x17\xf5\x1e\x2d\x74\x47\xa5\x7a\xb5\x84\xe7\xf9\x5c\x90\x8d\x6d\x71\x5c\x08\x2d\x91\x3d\xab\xd6\x19\xfb\x5b\x33\xaa\xcf\xd8\xf0\xa8\x51\x43\x26\xbe\xa3\x8c\x79\xc9\xc0\x91\xa9\x6d\x6a\xe5\x6a\x55\xcb\x0f\xe5\xba\x1a\x76\x5b\x45\x0d\x2f\x77\xfb\xaa\x24\xb9\xd4\x2c\xb2\x57\x9f\xbf\xd3\x22\xea\xed\x1b\xd5\x09\xbf\x7c\xfd\x6d\x7f\xa4\x97\x71\x43\xcf\x4c\x8f\xfe\x43\x16\xe1\x2b\x3d\xf3\x09\x2b\x60\x62\x15\x50\xf8\xac\x15\xf0\x0f\x5a\x21\xb5\xb7\xf4\x7f\xa3\x4e\xf6\xae\x45\xb6\xfd\xf8\x5e\xfc\x38\x8b\xe8\x8a\xd2\x07\x26\xe2\x6f\x3b\x8b\xb7\x77\xe1\x1e\xfa\x2f\xf8\x12\xfa\xca\x94\x07\x77\xe6\x34\xec\xae\x3e\x6a\x36\xd6\xac\xbe\xeb\x6c\x71\x7f\x5b\x61\x5b\x2d\x9f\xf5\x73\x4d\x38\xef\x94\xf7\xf9\x56\xe0\xcc\xc4\xce\x71\xb3\x1e\x32\xa6\x1a\x6b\xf4\x24\xae\x6b\xe5\xe1\xe1\xd8\x74\x73\x24\x1b\x36\x3b\xa8\xad\xbb\x55\x26\x2a\xcd\x24\x4e\x3f\xa5\x01\x40\x4c\x58\x14\x43\x15\x60\xa0\x62\x80\x21\x91\x91\x4c\x28\x91\x84\x4a\xca\x02\x84\x12\xa9\xc2\x38\xc2\x91\x80\x89\x80\x8a\xa1\x30\xa4\x52\x25\x42\x45\x91\x08\x85\x3c\xe9\x87\xe4\x27\xbe\x20\xb7\xe0\x37\x51\x41\x6b\x59\x95\xba\x57\x2a\x37\xca\xe5\x5a\xdd\xd4\x75\xe6\xe8\x8e\x5d\xac\x68\x46\xa3\xd6\xac\x97\x78\xd3\xae\x36\x51\xc3\xaa\x23\xdf\xee\x18\x5a\xdd\xf8\xcf\x7f\xff\x4f\x02\x28\x09\x86\x18\xc1\x9b\x19\x0d\x12\x7e\x82\x33\x2f\x93\x10\x60\xc0\x25\x82\x12\x81\xd7\x20\x9a\x7c\xcb\xf4\xa7\x73\xad\x64\x75\x6d\x36\x3e\x74\xd6\xa2\xa1\x5b\x74\x37\xb5\x1b\x3b\x8d\xd6\xa6\x96\x47\x27\x61\xad\x35\xd8\xc3\x1e\xec\xbf\xde\x9d\xdc\x55\xf9\xab\xab\xbb\x74\xf9\xdf\x73\x23\xdb\x2b\xd3\x0b\xcc\xd9\x45\xe6\xea\xfd\x4e\x7d\x33\x57\xe3\x65\x62\xf6\xfa\xb1\x2a\xee\x47\x2b\xcd\x69\xd2\x7d\x3b\xd3\x9d\x1c\x61\x61\x15\xf9\x55\xff\xea\xea\x98\xb1\x3d\xbc\xba\xb6\xef\x9b\xda\xc2\x7c\xc7\xe8\x98\xa7\x69\x50\xce\x30\x69\xc0\xfe\x7e\x7e\x58\x6b\x23\x8f\xa9\x6d\x6d\x90\xdb\x38\x02\x2c\xc6\xa2\xe1\x96\xba\x90\xd6\x9c\xf6\x7e\x2f\x77\xfe\x98\x4d\xba\xcb\x72\x86\xb5\x3a\x76\x10\x66\x33\x6c\xda\x43\x95\x4c\x80\xa4\xc9\x9d\x6a\xc6\x5b\x11\xe6\xcb\x4a\x75\xd1\xec\x4b\xf8\xc5\x0c\xbd\x5f\x32\xe6\xbc\x52\xc6\x82\x45\x67\x25\x88\x5b\x35\xfa\xd3\x49\x61\x38\x2c\xb5\x0c\x37\x33\x31\xb7\x9b\xb8\xbb\x33\xca\xd9\xb5\xde\xae\x7b\xd6\x70\xaa\xde\x7d\x9b\xf4\xcc\xf6\x45\x14\xb7\xda\x2d\xf0\x42\xe8\xce\xb3\xd2\xb4\xed\x72\x77\x1d\x78\x71\xf7\xf7\xb5\xf7\x4c\xeb\x0f\x9d\x65\x2e\xf1\xfa\x9f\x9d\xe5\x87\x10\x7e\xf5\x99\xc8\xad\x0f\xe2\x91\x36\x6b\x8f\xc2\x85\x57\x0c\xf0\xbe\x50\xf0\xa6\xba\xea\x96\x35\x63\x94\x51\xed\x64\xd2\x5d\xc9\x46\xf9\xe7\x7d\x38\xab\x5e\x53\xed\xf5\xbe\x7e\x30\x6e\x40\x78\x7a\xf4\x1f\x32\x15\xeb\x17\x55\xd4\x3b\xfd\xeb\xb9\xf6\xa5\x5a\x12\xaf\x35\x62\xc7\x63\x5f\x03\x8e\x1d\xfb\x03\xa7\x32\x77\xab\x06\xf3\x1b\x19\x4a\xa7\x5a\x65\x9b\x01\xc5\xb6\xa5\x3a\x4e\x74\xb9\x53\x57\x77\x34\x95\x3b\xf5\x49\x91\xa2\x2b\x55\xd2\x3a\x6c\xfb\x51\xa3\xb9\xac\x39\xa6\xe1\x92\x2e\x1d\x14\xc8\x61\xac\x81\xda\xbc\x5f\xe6\xd3\x89\xd2\x0e\x59\xee\x8e\x5b\xed\xbd\x4f\xaf\xda\xd8\x5d\x54\x6f\xeb\x2a\x2f\xff\xce\x77\xea\xe9\x3b\x9b\x64\x7f\x0e\xf1\xf6\x79\xcb\x4c\x7c\x98\x73\xf3\x73\xbd\xfe\xe5\xf3\xf7\x9e\xd7\xb3\xe7\x93\x7b\x5d\x79\xf6\x6d\xd3\xe4\x5b\xe3\x54\xa0\xf6\x8a\x27\xdd\x7b\x7e\x63\xb7\x4c\x8e\xa7\x0b\x72\x16\x73\x7a\xda\x7b\xf9\x49\xb9\x77\xf6\xeb\x7a\xbc\xb7\xbf\xbf\xbc\x8f\x77\xde\x07\xbd\xa1\x6b\xfd\xb3\x29\xe6\xf4\x3e\xde\x61\x8a\xf9\xd2\x38\x9f\xf7\xf9\xfd\x7c\xe4\xbe\x9d\x09\x5f\x99\x3a\xee\xe4\x37\x3f\x77\x05\x12\xf7\xb2\x5f\xef\xaf\xbf\xa2\xfd\xd3\xbe\x72\xef\x7a\x2f\x66\x0e\xeb\x71\xd7\xd3\x33\xf4\x13\xc9\x3a\x6f\xe9\x7f\xcd\xf4\x77\xd9\x9f\x5f\xc6\x0d\x51\xfd\x81\x3d\x3a\x13\xb2\x1e\x37\x05\xa5\x78\x46\xf7\xd0\x7f\x11\xd5\xbf\x4b\xa0\x4a\x57\x54\x8f\x44\x88\x28\x10\x10\x61\x46\x59\x08\xa3\x04\xc6\x31\xe4\x0a\x71\xc6\x05\x92\xa1\x42\x28\x08\x09\x94\x54\x06\x11\xa2\x31\x53\x4a\x51\x04\x62\x41\x24\x85\x2c\x09\x03\xf8\x43\x54\xc7\x3f\x45\x75\xa7\xc4\x73\x4e\xab\xe1\x74\x6a\xf9\x9c\x56\xcd\xf9\x15\x56\x29\xd4\xfd\x6e\xb1\x60\x14\x6a\x2d\xbf\x58\xf3\xf2\xcd\xbc\x66\x58\x9c\xb6\xcc\x76\xa1\xed\x77\xf2\x79\xa7\xea\xea\xff\x10\xd5\x6f\xa5\x70\x09\x48\xa9\xf8\xd0\x95\xf3\x3a\x2b\x05\x17\x04\x51\x28\xc1\x6b\x06\xd7\x9d\xbc\xf8\x4a\x56\xff\xc4\x95\x73\x65\xd9\x78\x82\xf7\x5c\xe4\xd5\x4f\xb0\xe6\x95\x17\xe7\xb4\x66\x9d\x88\xbd\x3f\x28\x85\x1b\xa1\x39\x33\xcf\xda\x6d\xd5\xb6\x50\xee\x82\xec\xdc\x1d\x25\xf6\x66\xb7\xd3\x66\x85\x6e\x35\x4e\x96\xfc\x10\x15\x76\x63\xb5\x29\x13\xe2\xd5\x2a\x7c\x5e\xcc\xb2\xa1\xd1\x08\x17\xb9\x4d\xd4\xac\x76\x22\x13\x15\xeb\xc3\xcd\x82\xe7\x0b\xbc\xa0\x7d\x2d\xa3\xeb\x7d\xb7\xce\xe3\x72\xca\xb7\xef\xdd\x47\xb2\xb1\x75\xa5\x2f\xdc\x8b\x85\x17\xb7\xc4\x95\x6c\x7a\x0b\x0b\x2f\x23\x97\x32\xfd\xaf\x61\xf1\x1b\xfa\xb9\xb7\xb2\xf1\x79\xea\x4e\x59\xeb\x62\x32\xb7\xbe\xee\x46\x7a\xbb\xc6\xb4\xe9\x7f\xcd\x0d\x73\x35\x2e\x77\xe8\xed\x4e\x29\x2d\x05\x59\xfc\x3c\xbe\x9b\x3f\x9c\x64\x4f\xff\x32\x7f\xef\x7a\x9f\x95\x9d\xf2\x17\xb1\xf9\x9d\x3d\x7f\x69\x5e\xa1\xfe\xb2\xf5\xbd\xdd\xdf\x5f\xc6\x7b\x26\xc8\xce\xf5\x05\xb9\xff\xbe\xfe\x22\xfb\xfd\xc1\xf7\xe5\x1e\xfa\x2f\x72\xcd\x77\x81\x4f\xba\x72\x4d\x18\x03\x1a\x93\x30\x92\x8c\x45\x54\x30\x21\x63\x18\xb2\x24\x88\x01\xc4\x31\x0d\x02\xce\xc3\x28\xa6\x2c\x66\x81\x8a\x50\x14\xca\x50\x32\xc1\x41\x4c\x63\x4e\x58\x40\x82\xf0\x94\x74\x80\x52\x94\x6b\x6e\x99\x20\x05\xe2\x94\x7f\x98\x7d\xf0\x3a\x2b\x09\x11\x12\x09\xc2\x80\x78\x5e\xae\xf9\xc4\x06\x79\xe6\x23\x0f\xd9\x00\xbc\x37\xef\xd9\xf9\xde\xbe\xd2\x77\x8d\x8a\xde\x49\x74\x10\xdb\xd5\xe2\xc6\x2f\x78\x78\x45\xb5\x56\xb5\x1c\x2f\xa7\x73\x95\x6f\x4e\x85\xc3\x0e\xbd\x45\xb6\xba\xc3\x0d\xba\x9d\x1e\xb2\x1d\x82\x1c\x6a\x13\x9b\xb5\x56\x83\x7e\xbb\x05\xf7\x11\x0d\xeb\x64\x30\x41\x99\xf6\xd1\x1d\xbb\xbe\xdb\x8f\xc1\xb0\xbf\xfb\x52\x08\xe8\xb5\xfa\xfb\xa1\xdb\xcb\xba\xb2\xf9\x3d\x82\xcb\xcf\xda\xcc\x52\xa4\xff\x6c\x78\x65\xda\x7c\xee\xd7\xf1\x39\x9f\xfb\x83\x7c\x56\xbb\xd0\xff\xed\x36\xa8\x13\xbd\xf7\x6c\x50\x2f\xe3\xa6\x5b\xec\x81\xbd\x7a\x5a\xd7\x4e\xf1\xac\xee\xa1\xff\x82\x49\x95\x5d\xb1\x2b\xca\x75\xe2\x83\x09\xed\xf5\x93\xf8\x38\xca\xb9\x60\xcd\x36\xf1\x78\x17\x39\xc9\x8e\x2f\x4b\xfa\x52\x60\x23\x2a\x4f\x32\x49\x59\x86\x43\x9f\x8f\xc2\x5e\x38\x6f\x1c\x4a\x56\xbb\xe9\x59\x78\xbc\xce\x0f\x4a\x61\x48\xbd\xaa\xde\xce\xf5\x75\x8b\x37\x9c\x7c\xfa\x61\x93\x28\x60\x52\xf0\x80\x49\x0c\xe2\x20\xe4\x31\x0e\x63\x15\xa8\x44\x86\x9c\xc5\x11\x0f\x00\x13\x00\x31\x26\x14\x4c\x60\x1c\x82\x44\xa0\x84\x32\x0e\x01\x24\x21\x09\x19\x66\xa7\xec\x72\xf8\x7c\xd8\xc5\xad\xf4\x04\x81\x05\x06\x1f\x56\x49\x79\x9d\x7d\xc1\x36\x8e\x21\x7a\x3e\xea\xa2\xfc\xe6\x5c\x7f\x79\x55\x1f\x60\x85\x1f\x44\x5d\x18\xc9\xbc\x15\xaf\x42\x32\x72\xb3\xf5\x24\xb7\x87\xad\xfd\xa2\xea\xac\xbb\x28\x43\xea\xa4\x01\xbc\xfd\xb1\xd7\xab\xd5\xa1\x8e\xfd\x43\xbf\xab\x2d\xb3\x25\x51\x3a\x74\xf5\x1e\x89\x87\x46\xd3\x9a\xf6\x37\x72\xa1\xf5\x89\x5d\xee\x96\x47\x61\x6e\x19\xd8\x53\xd5\x94\x86\xf2\xad\xb4\xa2\x2e\xac\xc7\xa3\x1e\x54\xd8\x5c\x6d\xaf\x80\xa7\xf4\x2e\xe5\x5b\xf0\x93\x1e\xfd\xb7\x67\xfa\x25\xfa\x57\xf0\xf3\x84\xa7\x7f\xbf\x76\x0e\xf2\xea\x49\x3e\xe8\x86\xf3\x39\x4b\x7b\x82\xfe\xac\x5b\x06\xeb\x27\xe8\x6b\x6f\xe9\xff\x46\x96\xfe\x2e\xbc\xb8\x8f\xef\xc5\x7e\xed\x1c\xaf\x4d\xb1\xb3\x3b\xf7\xe2\xd9\xb3\xf8\x71\x17\x32\xe0\x31\xfa\x2f\xf0\x82\x59\x3b\xbf\xb4\x33\x45\xb3\x06\xbc\x9d\x8a\xda\x95\x60\xd8\x5c\x76\xa2\xed\xc6\x8c\xcd\xb5\x25\x14\x29\x18\x20\x72\xd7\xa8\x32\xeb\xb8\xa5\xec\x61\xab\xaf\x26\xee\xcc\xc9\xcf\x76\x60\xdf\x25\xe1\x36\xe8\x15\xe2\xdc\x00\x35\xa8\xbd\x0b\x50\x7f\x8e\xcd\xac\x8b\xed\xf4\xfb\x92\x49\x46\x20\x0d\x14\x8c\x50\xc2\x25\x43\x30\x44\x2c\x84\x94\x89\x44\x32\x9c\x44\x22\x8a\x98\xa2\x40\x21\x10\x20\xa4\x38\x41\x42\xc5\x49\x98\xc4\x32\x8a\x63\xc1\x38\x15\xe2\x05\x5e\xd0\x93\xf0\x72\x2b\x16\x5f\x60\x41\xd8\x87\xbd\x53\x5f\x67\xcf\xf0\x82\x20\x01\x29\xa4\x59\xbf\x0d\x40\xfb\x05\x5e\x1e\xf0\x4e\x7f\x04\x2f\x51\xd1\x8e\xb6\x51\x17\x35\x88\x3b\xf3\x22\x27\xe3\x44\x6b\xd1\xad\x47\x71\x7b\xc3\x27\xb9\xed\x82\x5b\xeb\x9a\x9c\x8d\x16\x4b\x29\xe6\xb6\x91\x1d\x36\xb4\x65\x30\x1a\xbb\xdb\xa0\x3e\xd1\x0f\x15\xad\x5c\xa8\x18\x68\x64\x8b\x3a\x2a\x0d\xfb\xa5\xed\x81\xcf\x0a\x65\x56\x48\x2d\xa8\xef\x09\xf6\x1e\xd8\x0d\x59\x7e\x96\xbd\xa7\x48\xff\xa1\xa0\xc2\x74\xe0\xe5\x2d\x7b\x7f\x28\x90\xec\x0f\x06\xb2\x69\x6f\xe9\xff\x46\xef\x5c\xda\x41\x7d\xcf\xb0\x77\x2d\x25\x78\xb9\x16\x35\x1e\x81\x97\x46\x7d\x1a\xe2\x4e\x34\xda\x98\x25\x0b\x37\xb7\xc3\x69\x98\xd8\x2d\xcf\x1b\x87\x1b\xda\x0b\xd9\x66\x1f\x36\xb3\x41\xb1\xb4\xc8\x26\xa5\x7a\x2f\x4b\x40\xaf\x84\xe6\xc5\x56\x19\x8d\xba\xbd\xd5\x50\xd3\x0f\x86\x26\xe7\xb9\xad\x19\x0d\x66\xa4\xb1\x14\x1b\xa6\xeb\x99\x41\xfa\x9e\xc2\x04\x88\x48\xc1\x24\x56\x90\x82\x04\x71\x46\x19\x12\x8c\xa9\x98\x24\x14\x71\x94\x30\x2a\x54\x02\xc2\x48\x26\x91\x50\x30\x92\xec\x07\xcc\x40\xc9\xc2\x18\xc5\x30\x44\xf4\xa4\xbd\xbc\xc0\x82\x6d\xd4\x3b\x98\xd3\x8a\xe6\xd7\x09\x73\x0c\xdb\x42\x1d\x5b\xab\xba\x3a\xaa\xd7\xbb\x65\xee\x20\xc2\x0c\x3f\x9f\xd7\xed\x4e\xb3\x8d\xea\x26\x2f\xe4\x4d\xe4\xb6\xdc\xb2\xf1\x9f\xff\xfe\x1f\x13\x1c\x4a\xc2\x19\xc7\xb7\x4a\x63\x09\x22\x20\xfe\xd8\xa2\xf6\x73\x56\x50\x21\x25\xa6\x00\xc0\xd7\xe0\x71\xa7\xba\xce\xb2\x9d\x5d\x10\x82\x74\x07\x6c\xe5\x1b\xbe\x0e\x6d\xa7\x9d\x8d\x96\xd3\x3e\x71\x54\x7d\xd9\x5c\x2e\x8a\xb5\x99\xd3\x6c\x9d\x44\xec\xb3\x45\xed\xf4\xcd\x4f\x3a\xc0\x5c\x45\x64\x18\x9b\xe0\xd0\xfb\xf9\x81\xe1\x2c\x57\x31\x5b\x83\x6e\xb5\xdc\x1a\xae\x3a\x5e\x19\x0e\x4a\x54\x1a\x12\x94\x07\x64\x47\x19\xe0\x2c\x14\xf9\xd2\xbe\x9b\x9c\x3d\x2b\xf5\x76\xbb\xf1\xf2\x2b\x9b\xdd\xb6\x7a\xac\x8e\xe4\x7a\x17\x6e\x8a\xf9\x56\x6e\x31\xf5\x10\xb3\xfd\x02\xae\x84\x7a\x34\x77\x5b\x72\x4d\xa6\xcc\x6c\xd7\xbd\xd5\xf9\xee\xf1\xc9\xea\x97\xbb\x99\x63\xc6\x08\xea\xbd\x53\x30\x7a\x86\x0f\xf7\xf1\x2a\x57\x2a\x2d\x2d\x4c\xf0\x6c\x7a\x38\xa8\xe1\x1c\xad\x07\x6e\xb9\x3b\xb0\xf3\xc8\x6c\x8e\x33\x32\xd9\x38\x8b\xd9\x7a\x1b\xfb\x68\x59\xe8\x6d\xd7\x72\xda\xcb\xb8\x45\x14\x18\x35\x9c\xa9\x4d\x8d\x95\x6f\x06\xb2\xdb\x0a\xb4\x4c\x77\x1a\xa3\x69\xc1\xee\x99\x5f\xc0\xad\x5f\x3a\xbc\x94\x57\xe5\xa3\x3a\x76\x6b\xa1\xb2\xf9\xa0\x0e\xb5\x60\x0e\xe5\xa6\x3f\xd1\xab\x47\x7b\x37\x0d\x5a\x56\x2d\x8c\x8b\x99\xbe\xd5\x6a\xf3\x2b\x5e\x7f\xda\x4f\xcb\x6a\xb7\x5f\xf6\x59\xe7\xba\xc0\x15\xd4\x44\x38\xb7\x21\xa3\xc8\xb5\x17\x51\x12\xce\xba\xbd\xa1\xda\xaf\x8a\x68\x9c\x6b\x22\x3c\x48\x66\xf5\xb6\x15\xef\xdf\x9e\xc9\xdf\x71\x46\xff\xdf\xc7\x18\x7e\xb5\x4c\x82\x70\x76\xa9\xf9\xc3\xe3\xb1\x3f\x29\x2f\xf6\xbd\x6a\xaf\xdc\xf2\xa9\x27\xd1\x26\xce\xf7\xe8\xde\x5e\x3b\x9b\xd9\x28\xd3\xa3\x55\xf7\x9c\x50\xd4\xd6\xb6\x03\x78\xb9\x99\x0f\x79\x0e\x53\xa4\x6f\x3c\x42\xff\xbc\xe8\x13\x6e\x34\xaf\xbe\x6f\xea\x4e\xcf\xdc\xd5\x1b\xc5\x11\x58\x37\x9c\x7d\x57\x6d\x3b\x85\xe5\x14\xd4\xb0\xbb\x29\x0f\x8d\xe9\xb2\xb9\x9d\x6f\x77\x6a\x69\x8d\xc5\xb3\x77\xe5\x94\xc0\xf5\x99\x85\xee\xf5\xef\xd6\x1f\x59\x5f\xb9\xec\x7a\xef\x47\xb1\x5d\x8d\xab\xfd\x3b\xdf\xf3\x7b\xef\xea\xe5\x28\x5a\xed\x76\xeb\xe5\x5d\x79\xe8\xdd\xbd\xbc\x6b\x5f\x8b\x8a\xbc\x77\x3f\x2e\xdf\x4f\xfb\xfd\x79\xe8\xfe\x3e\x43\xdf\xce\x9b\xfe\x13\xf4\x4f\x9f\x37\xaf\xc4\xc5\x3b\xcf\xeb\xfd\xe7\xff\xa5\x3c\xdd\xbb\x51\x80\x17\xde\xf6\x6e\x02\xe9\xd5\xfb\x72\x1e\x77\xde\xc7\x52\x6d\xbe\x38\xb6\x2e\xd4\x2b\xda\xd7\xa3\xda\x2e\xe3\x6d\x42\xe6\x3b\xb2\x6a\xf3\x6a\x3b\x87\x61\x92\x59\xe5\x06\xb5\x9a\x63\xfb\x9b\xa5\xad\x21\x6d\x5d\x1f\x8e\x13\x1c\x50\x12\x1b\x53\x33\x00\x8c\x0d\x9a\xaf\x18\x7b\xe5\x7d\x3d\xaf\xf1\xa1\x68\x89\xd6\x73\xf4\xcb\xad\xc7\xe8\xbf\xc8\xaa\xc9\x86\x08\x6f\xa9\x35\x06\x8b\x7d\x94\xa9\xb2\xa2\x58\x4d\x0b\x2c\x5a\xfa\x23\x1d\xf9\xfd\xbe\xec\x9b\x34\xd9\x7a\x7c\xb8\x58\x94\x43\x3c\xa9\x2e\x0e\x85\x32\x4f\xba\xa4\x36\xd2\xa3\x49\xef\x28\xb3\x43\xba\xe3\x76\xce\xde\x76\xda\x76\xaf\x36\xe9\xe2\xf5\xfc\x90\x9b\xa5\x5f\xc7\x15\x4a\x21\x08\x51\x22\x24\x1c\x45\x41\xa0\x14\x0d\x39\xe4\x4c\xd2\x80\xa8\x00\xb2\x40\x71\x29\x03\x88\x93\x10\xa9\x84\x40\x8a\x22\x28\x63\x04\x21\x0f\x62\xa8\x28\x3b\x15\x28\x80\x32\x45\x59\xf5\x66\x54\x1b\xa3\x92\xf1\x0f\x65\xd5\x9f\xb3\x02\x32\x40\xb0\x40\x1c\x81\xe7\x65\xd5\x4f\xa2\xda\xce\xf7\xe2\xe2\xfd\x7d\x46\x8e\x71\x0b\x4c\x6b\xe6\xac\xc2\xa4\xd9\x80\x05\x6e\x8d\x0f\xd2\x1f\x6c\x12\x37\x1b\xe9\x64\x53\x71\xe2\xb5\x93\x99\x64\x73\x87\x55\xc7\x3b\x9c\x3e\xfe\x04\x96\xbc\x49\x56\xbe\x1a\xf9\xd7\xe7\x77\x2b\x2b\xb9\xad\x76\x29\x14\x33\xbf\x55\x99\x63\xd1\x0c\x46\xb3\x6d\x27\x9b\x35\x8c\x66\xb8\xca\xca\x59\x6d\x08\xeb\xda\x60\x4f\xcd\xb1\x9e\x8d\x78\x2f\xec\x04\x41\xb5\x5a\xdc\x97\xdc\x3a\x8f\x2b\x55\x87\x2d\x73\x99\xe9\xda\x5e\xc4\x31\xe9\x6c\x96\xcd\x62\x4f\x23\x23\xb4\x5b\x7d\xc5\xfb\xac\xbf\xd9\xdf\xc7\xb0\xf2\xea\xa7\x2f\xcf\x7b\xe5\x6d\x7c\x42\xee\xfd\x23\x72\xf7\x5b\x2c\xb8\xfa\xfb\xf7\xc9\xdd\xd7\xc5\x02\x3e\x96\xbb\xaf\x71\xf3\x01\xb9\xe1\x25\x62\x4f\xd3\x1e\x8d\x18\x4c\x91\xfe\x43\x72\xbf\x7e\xc1\xc0\xfa\xd5\xf7\x7f\x9f\x5c\x7b\x5e\xca\x57\xe4\xee\xbf\x58\x2f\x38\xed\x5f\xe3\xb2\xbe\x7b\x31\xfc\xd9\x77\xfd\xde\xfd\xfb\x8d\xeb\xfb\xd2\xf9\x5e\xed\xdf\x9f\xd6\x5b\x4e\x7a\xd6\x79\xd1\x57\xf7\xed\xe3\xfd\xfc\xd3\xeb\xfd\x92\x9e\x75\xb5\xbf\xda\x23\xeb\x7d\x2b\x63\x56\xb4\x2f\x47\xe4\x5e\xf6\xf3\x5d\x63\xd5\x39\x82\xf4\xca\xec\x7f\xef\xfd\x1a\xbb\x65\x72\x36\xdb\x9f\xa9\xbf\x6d\x77\x7e\xbd\x96\xd7\x71\x7e\x0a\x87\x2e\x5f\xdc\xe9\xef\x16\x96\x39\xe3\xc3\x55\xb6\xd6\x93\xd8\xfe\x84\xec\x75\x05\xe8\xee\xbb\xcf\xa7\xfd\x13\x4f\xfe\xf4\x7a\xaf\xf6\xf3\xfd\xf5\xbe\xe7\x2f\xa8\x5f\x6d\xfd\x03\x3a\xd0\x39\xda\xc8\xbc\x9c\xef\xbd\x3a\x58\x8a\x3a\xe0\x03\x11\xb8\x87\x23\x12\x70\x3a\xf5\x0e\xfd\xbe\x7b\x98\x26\xfb\xea\xa2\x31\x90\x61\x56\x54\xaa\xd5\xcd\x31\x8b\x7a\x99\x5a\xdb\xd4\xcb\xf9\x51\xa3\x55\x96\x78\x93\x5b\x77\xe7\x33\x00\xa6\xe6\x3c\x97\x5f\x93\x1d\xe0\x8b\x55\x9e\xc5\x20\x98\x53\xde\x0f\xd8\xba\x32\xd1\x8c\x41\x33\xd4\x53\x2f\x32\x23\x01\x0a\x25\x50\x08\x23\x14\xca\x98\x85\x18\xd3\x98\x53\x82\xb1\x90\x01\x27\x84\x85\x82\xc5\x18\x60\x19\x87\x09\x95\xb1\x62\x2c\x4a\x92\x90\x82\x38\x88\x15\x88\x94\x38\xf5\xad\x10\x2f\x3a\x98\xe6\x55\x2c\x82\x9b\x76\x37\xdf\xc1\x6e\x15\xd7\x4d\xa7\xa5\xa1\x16\xad\x75\x68\xae\xa9\xd5\x3d\xdb\xf6\x8b\xb8\x58\xb0\xf2\x1d\xec\x37\x99\x5b\x2f\xd5\xcb\x58\xaf\xd5\x5a\xff\xd0\xc1\x6e\x46\xe0\x0a\x02\xe4\xc7\x3a\xd8\xcf\x59\x7e\x6a\xb9\x01\x29\x41\xaf\x99\x45\x77\xf2\xa1\x2b\x1d\xec\x56\x97\xc2\x7b\xe5\xbc\x94\x74\xb6\x13\xfd\xd7\xf5\xba\xba\xf4\x50\x01\x77\x8f\x70\x8f\x35\xb7\xb2\x28\x13\x4f\x3f\xc6\xb5\xe6\x78\x37\x9d\x8d\xb6\x28\xe7\x4e\x3b\xf6\xa4\x09\x00\x9f\xe5\xa9\xec\x05\x03\x1c\x57\x37\x3c\xdb\x69\xcf\xf2\xeb\x8e\xe8\xaf\x7a\xf9\xe1\x0a\x4e\xba\x25\x0e\xa4\x75\x3c\xd6\x2d\xa4\x42\x03\xad\x5d\xf3\x2b\x3a\xd3\xfb\xe5\xff\xdf\xca\xe5\x57\xf6\xa7\x27\xed\x59\x1f\x8c\x1b\x72\x79\x7a\xf4\x1f\x8b\xd8\x7d\x57\x2e\xff\xdb\xe4\xb6\xd3\xdf\x7f\xa9\xdc\x7b\x2b\xe4\xe9\x11\x19\xc8\xfd\xfc\xe4\xde\x52\xf8\x68\xaf\x1e\xa6\x7f\x8d\x71\xf7\xd0\x7f\xc1\x98\x32\x4c\xfc\x61\x34\xad\x79\x79\x95\xd3\x0e\xb3\x6d\x5f\x95\xab\x44\x3a\x9e\x1e\x0f\x1a\x59\xdf\xd2\x23\x3f\xe8\xd6\x9a\xcd\x4d\x2f\x99\xa2\xdc\xa2\x1c\x11\xc4\xb7\xb2\xdb\xe9\xc5\x30\x3c\xd8\x07\x2d\x76\x8e\x9d\xee\x68\xb9\x6d\x02\xaf\x56\x35\xbd\xee\x7e\x55\x0b\xbe\x21\x7b\x55\x05\x9c\xb2\x08\x52\x28\x55\x1c\x05\x5c\x26\x82\x23\x04\x08\x0a\x21\x52\x71\xc0\xc3\x00\x00\xa2\x70\x18\x49\x06\x83\x28\x64\x28\xa4\x32\x11\x22\x10\x8c\x27\x82\xc5\x21\x7e\xc1\x18\x94\x16\xc6\xdc\xb4\xf3\x09\x82\x39\xfd\x04\x63\x30\x67\x17\x8c\x91\xf4\x62\xe7\x7b\x1c\x63\xee\xce\x5e\xbd\x57\x16\xbc\x00\x87\xf9\x1e\xbd\xf3\xa8\xff\xfc\x7c\x4e\x2b\x6f\x82\x01\x75\xf7\x2a\xb6\xc2\xb5\x36\xd0\xe9\x74\x34\x5d\x57\xdb\xd3\x6d\xa3\x16\x77\xea\x19\x3d\x63\xf5\xe6\xe3\x9a\x16\xd5\x7b\xf5\x46\xa6\x56\x33\x1b\xf3\xd6\xa0\xa1\x1f\x36\x83\xdd\xa6\x3f\xd9\x6e\x8c\x1d\x1f\xed\xf6\xd3\x8c\xc6\x4c\x50\x21\x2a\x80\x2b\xb4\x38\x56\xb4\xde\x13\xd9\xab\x0f\xf1\x3b\xf3\xb7\xec\xdd\x6f\xc0\xbc\x87\x30\x27\x45\xfa\x1f\x64\xde\x7d\x39\x8e\x2b\x45\x5d\xf5\x83\xaa\x24\xdf\xca\xa7\xef\xf6\xc7\xfc\x32\xff\xae\xae\x7c\xfa\xe4\xb3\x3e\xd3\xdf\x7c\xc7\x2f\xd8\xfb\x87\xb0\x4f\x4b\xe9\x4c\xaf\xf5\xbb\x7b\xe8\xff\xc4\xde\x6f\x62\x90\xe9\x62\x2f\xe6\x61\xc8\x65\xc2\x24\x95\x0a\xc4\x22\x96\x21\x8e\x30\x4c\x98\x92\x18\x88\x48\x44\x40\x90\x48\x2a\xc6\x09\x52\x49\x40\x99\x0a\x80\x24\x2a\x09\x58\x1c\xc4\x52\x12\xf4\x13\x7b\x71\x5a\xd8\x7b\x33\x1e\x4c\x10\xfe\x49\x86\xe5\xcf\xd9\x33\xf6\x22\xcc\x2e\xf1\x60\x8f\x63\xef\x27\xf1\x60\x67\xff\xf4\x13\xb1\x42\xa7\xb1\x5a\xe7\xe2\xab\x7b\xfb\x41\xe5\x88\x0b\xf6\x2e\x8f\x73\x69\xed\xf7\x8b\x71\xe6\x30\x3b\xac\x7a\x63\x63\xe8\x4d\x64\x66\xb9\x2a\xc6\x55\x0f\xd9\xab\x46\xc0\x9b\xce\x01\x6b\xc7\xbc\xb3\x21\x3e\xed\x8a\x82\xbe\xa7\xc8\x15\x82\xf6\x5c\xdb\xed\x54\xd6\x66\x0d\xec\xd8\xa1\x2f\x70\xc4\x32\x33\x36\x1a\xea\xd9\xce\xe6\xf7\x63\xef\xd3\x71\x56\x5f\xda\xbb\xdf\x80\xbd\x8f\x55\x51\xba\x18\x23\xdf\x7e\x27\x6d\xbb\x6d\x3a\x58\xe4\x6a\xff\xa8\x4a\x96\xe2\xfe\x7d\x2d\xfe\xe5\xcf\xed\x5f\x3a\x76\x6f\x2d\x0d\x2c\xff\xcd\xef\x4c\x6a\x58\xfe\x28\x96\x6a\xdf\x70\xa6\xf7\xd0\x7f\xc1\xf2\xef\x62\xb8\x29\xeb\xd1\x51\x9c\x10\x1a\xfd\xd0\x93\x23\x2a\x31\xa7\x98\xc2\x38\xe0\x51\xc4\xe3\x84\x11\x48\x92\x84\x48\xcc\x61\x80\x31\xe5\x08\xc7\x82\x44\x41\x12\xa8\x38\x80\x31\xc4\x8c\x9d\x62\xbb\x21\x4f\x31\x5e\xe6\xa6\xad\x56\x0a\xc0\x3f\xb6\xd5\xfe\x9c\xe5\x18\x40\x42\x88\x80\x48\x3c\x1f\x2f\x73\x47\xb5\x84\x3b\xee\xd9\xbb\xd5\x12\xae\xe2\x55\x0a\xc3\xf2\x42\xf9\x9e\x29\x4c\x6d\x95\x67\xc6\x1e\xf5\x77\xb5\xe1\xc0\x4c\xf2\x76\x97\x0c\x57\x95\x6a\xb7\xab\x78\xed\x30\xad\x0e\x8a\x03\x39\xb2\xbc\x61\xb2\xdd\x96\x8d\x71\x67\x70\xb4\xb5\x25\xca\xc9\x8a\x65\x2c\x13\xa3\x6e\x6c\x87\xd3\xdc\xbe\x54\xea\x17\x07\x89\xa9\xdc\x4a\x6a\xd5\x12\xcc\xab\xaf\x3e\x12\x93\x30\x7d\x6f\x67\xff\x31\x6e\xe8\xa1\xe9\xd1\x7f\xb6\x5a\x42\xda\x3e\xa9\x5f\xc7\xe7\x7c\xee\x0f\xfa\xc4\x34\xed\xef\xb5\x3d\xdf\xb2\xed\x3e\xb2\x57\x4f\xdb\x76\x53\x3c\xab\x7b\xe8\xbf\x60\xd2\xa0\xb2\x99\xef\xfb\xaa\xb9\x73\xf5\x5d\x32\xab\xe5\x83\xbc\x96\x71\x0a\x75\xa1\xba\xd3\x81\xb3\xdb\xc1\xf1\xf8\xb8\xca\x96\x14\x2a\x4c\xca\xc8\x6d\xc7\xd5\x4c\x46\xac\x9c\x76\x50\xae\xf8\xfa\xd6\xcf\x83\x5d\xcb\x59\x8b\xaa\xe9\x64\x1c\x95\x37\x67\x0b\x73\x52\x14\xf5\x7d\xfa\x6d\x83\x23\x98\x50\x89\xe3\x90\xc6\x90\x24\x92\x03\xc4\x43\xc5\xa5\x40\x30\x09\x08\x63\x48\x28\x08\x38\xc0\x24\x09\x03\x19\xd0\x40\xc5\x09\x0b\x64\x14\x70\x19\x03\x0a\xe3\x98\xe3\x17\x4c\x3a\xdb\x76\x75\xad\x8e\x34\xd3\x37\x4b\x85\xa6\x89\xca\xa5\x02\xad\x57\x3c\x8b\x56\x0a\xed\x2e\x73\xb9\x57\x28\xd7\x1d\xdb\x68\x22\xe4\xf0\xa2\x47\x8c\x46\xc7\x6a\x70\xcb\x30\x6a\xf7\x62\x12\xfa\x44\xbf\xfc\x31\x8b\x5f\x31\x89\x22\x74\xf1\x1f\xde\x19\x23\x79\x0f\x26\x3d\x24\xef\xbd\x8b\x49\xd6\x2b\x7d\xb7\xc0\xfb\xe1\xae\xab\x60\xa6\xd4\x49\xfa\x71\x7b\xea\x6b\x0b\xda\xf4\x2c\x4f\x06\x53\x95\x2f\x4e\x8a\x0b\xb0\x6b\x03\x25\x9d\x6a\x21\xb1\x59\x4b\xac\x97\xfd\x42\x3b\x6e\xcf\x06\xa6\x81\xe2\x96\x65\x4d\xfa\xfb\x4c\x98\x5b\x5b\xb2\x59\x6b\x6c\x07\x89\x95\x9d\x24\xc6\xd8\x1d\x7d\x0b\x26\xdd\x19\x43\x98\x3a\x26\x3d\x49\x3f\x45\x4c\xba\x37\x0e\x2e\x6d\x4c\x4a\x85\xfe\x13\x98\xf4\x37\xc5\x29\xde\xf4\x37\x3e\xb0\x57\x69\x62\xd2\xb3\x67\x75\x0f\xfd\x17\x4c\x1a\x6e\xac\x6d\x6e\x7c\xf4\xc8\xbc\x9b\xb1\x68\x27\xea\xe9\xcb\x71\x55\xb5\x13\xb8\x88\x76\x6a\xe2\x4f\x96\xcd\x9c\x57\x3f\x02\x02\xfa\x22\x9c\x37\x0f\x68\x63\xf6\xdb\xb4\x33\x28\xb8\xb5\x2e\x75\x5b\x9d\x20\x9f\xa7\x2b\x1b\x78\xb0\x22\x4b\x99\xa2\xf0\x32\x5d\xe1\xb4\xf5\xd4\xfd\x8d\x01\x0d\x64\x8c\x55\xc0\x70\x2c\x95\x82\x94\x62\x2a\x95\xe4\x18\xf3\x50\x85\x90\x10\x46\x94\x0a\x28\x0b\x11\x06\x01\x89\x80\xe2\x09\xe2\x54\x20\x46\x48\x04\x99\x00\xa7\x36\x12\xec\xe9\x0a\x3e\xb7\xbc\x8c\x12\x02\x76\x2a\xe7\xf0\xf9\xec\x19\xda\x04\x10\x38\x85\x02\x3e\x6f\x5d\x27\xbf\xbc\xa9\x0f\x48\xe7\x1f\xb5\x4d\xea\x5b\x46\x36\xf4\x83\x66\xb7\x5b\xc4\xed\xa2\xdc\x17\x17\xde\xac\x43\xe3\xb8\x5c\x02\x5a\x6c\x05\x5a\x33\x97\x97\x48\xd5\x93\x3d\xe8\xb4\x9a\xd6\x62\xce\x96\xde\x9e\xf0\xa4\x92\x6b\xed\x47\x1d\x7f\x21\x42\x2d\x5f\x49\x7c\xbd\x41\x3d\xaf\x56\xef\x09\xb6\xd2\xec\x56\x29\xad\x0a\x0b\xd7\x6f\xc0\x9d\x15\x0e\x86\x41\x9b\xab\x2b\x88\xcb\xbf\x4b\xf9\x16\xfa\xa4\x47\xff\x03\x77\xd8\x97\xd1\xe7\x1a\x07\xef\xcb\xaa\x5f\x54\xe7\xde\x7a\x77\x55\x34\xe6\x97\x14\xb3\xf3\xf8\x9c\xa3\x3d\x41\xdf\x6c\xb7\xb6\xbd\x27\xe8\xbf\x9d\xfd\x9d\x5a\xc6\xbb\xe8\x52\x7d\x7c\x2f\x7e\x9c\x05\xbc\x5a\x86\xba\x73\x2f\x9e\x3d\x8b\x1f\xf4\x8f\xbd\xc7\xe8\xbf\xa0\x8b\x5f\x77\xb3\x08\xd9\x23\xd4\x69\x44\xb0\x91\xa8\x46\x30\x66\xd6\xc6\x9b\x0e\x0e\x6b\x2d\xdf\xef\xfc\xc0\xba\x6c\x34\x35\x3d\x11\x59\x63\x73\x1f\x2c\xe2\x05\x14\xb1\x83\x8f\x5a\xbb\xd2\xb5\x26\xa5\xad\xbd\xcb\x1d\xf3\x48\x1b\x6d\xda\xf0\x08\xfc\x9a\xb3\xd4\x72\x63\x3d\x75\x2b\x1c\x0b\x00\x65\x50\xc8\x90\x50\xce\x80\x62\x80\xc7\x18\x43\x25\x81\xa2\x81\x08\x89\x8a\x38\x02\x92\xc1\x28\x11\xa1\x12\x2a\x56\x49\x44\x82\x00\x0b\x11\x52\xce\x03\xa6\xc2\x17\x74\x79\xb2\x80\xcf\x2d\x3f\x9a\x84\x40\x90\x0f\x63\x58\x5e\x67\x5f\xd0\x85\x48\x94\x42\xfd\x9e\xe2\x9b\x63\xfd\x05\x5d\x1e\x90\xb3\x3f\x40\x17\x6d\xaf\x53\x35\xe6\xeb\xd1\xd0\x2d\x00\x95\x58\xdd\xe6\xa0\x60\x19\x9b\x19\x68\xec\x0e\xfe\xb4\xba\x68\xb6\xf2\xa8\xbf\x37\x72\xeb\x09\xef\x67\xb7\xad\x51\xce\xc6\xaa\xb7\xb3\xbd\x86\xe0\xd3\xc1\xb4\x3d\xea\x4f\xb6\x51\x61\xde\xec\x24\x71\x21\xb6\x07\x3b\x3e\xea\xc5\x49\x4b\xfb\x0b\xd0\xa5\x6f\xb5\xcb\xe4\x59\xee\x9e\x22\xfd\xb7\x67\xfa\x25\xfa\xe9\xa0\xcb\x5b\xee\xfe\x41\x33\xfc\xef\xe2\x68\x73\x9e\xab\xef\xdd\x27\xe8\xff\x32\xfb\x1b\xf5\x85\x94\xcb\xc3\x3d\xc5\xdd\xb5\x94\xd0\x65\x2f\x1e\xa3\xff\xb3\xfa\xa8\xbb\xf1\x8a\x31\xef\x16\x80\x5e\xcd\xe7\xf7\x9d\x16\x19\xe4\x5c\xbe\xa8\x9a\xab\xca\xa4\x78\x0c\x46\x30\x27\x67\xca\xdd\x85\xdd\x0d\x49\x38\x2c\x6a\xf5\x35\x2e\x54\x72\x63\xb0\x75\x28\x99\xc3\x6e\xa1\xbb\xc4\x8d\x52\x0b\x4e\xf1\x20\xdf\x9f\xad\x1c\x5a\xc8\x4f\x61\xfa\x15\xb1\xa1\x08\x13\xa6\x54\x8c\x80\x4a\xc2\x10\x24\x12\x70\xa9\x48\x28\xb8\xc0\x1c\x0a\x49\x64\x04\x71\x18\x41\x14\x41\x8e\x03\x06\x30\xc3\x11\x0a\x45\x8c\x03\xc0\xe3\x24\x0e\xa2\x17\x74\xc1\x4f\x96\x87\x03\xb7\xe1\x45\xb2\xcf\x94\x97\xf3\xec\x0b\xbc\x48\x70\x31\xa3\x3d\x0e\x2f\x6f\xbd\xc1\xbf\xc0\xcb\x03\x6e\xea\x0f\xe0\x45\xcf\xd6\xdb\xeb\x19\x3b\xac\xb5\x45\x7e\x1e\xb1\xae\xd5\x19\xee\x3c\xf7\xe0\xcd\xe6\x25\xa7\x7e\x14\x6e\x63\x7b\x04\x91\xa8\xcf\x6a\x4b\xc7\xcc\xf5\xaa\xe6\x46\x1b\x8a\xcc\x28\x3c\xf4\x1b\xdc\x1d\xc4\xce\x62\x17\x0e\x8a\xcb\x06\xd0\x5a\xc2\xef\x04\x39\xd7\x25\x47\x95\xd9\x95\xff\x02\x78\x89\x77\x2d\xd5\x7a\x96\xbd\xa7\x48\xff\xa1\xea\xa7\xa9\xc0\xcb\x2f\xec\xfd\xa1\x92\x64\x4f\xd0\x7f\xb6\xe2\xe6\x2f\xb3\xbf\x31\xfc\xfd\x3b\xe0\xe5\x51\xf6\xae\xa5\x04\x2f\xd7\x8a\xec\x03\xf0\xb2\x05\xed\x30\x70\x56\x4b\xb7\xd4\x67\x5e\x3c\xa9\xb7\x67\xc2\x02\x95\x31\x2b\x35\x86\x23\x95\x35\xcd\xa5\x90\xf9\xc4\x0c\x0c\x76\xec\x6b\xbe\x51\x2f\xf7\x0a\xd9\xda\xdc\x16\xb3\xd6\x06\x14\xa6\xc3\xc5\xca\x26\x83\x00\xac\x35\xab\x66\x5b\x93\x5e\xcb\x74\x2a\xb8\xb6\x4a\x3f\xdd\x0b\x12\xa4\xa4\x10\x21\x4c\x18\x97\x82\x24\x9c\x04\x90\x0a\x18\xc5\x52\x05\xb1\x4a\x88\x94\x31\x03\x09\x8c\x41\x1c\x47\x44\x32\xc6\x60\x10\x20\x45\xa9\x44\x58\x70\x46\xd4\x0f\x6c\xf8\xd9\x53\x5c\xcf\xeb\xc4\x40\x7a\x83\x50\xbd\x58\xaf\x56\x89\xab\xe5\x9b\xa8\x6c\x75\xb5\x62\xa1\x45\x6b\x1a\xcf\x53\x5c\xc2\x6d\xa7\xc6\x3a\x66\x91\x79\x9d\x7c\xb5\x51\xed\x96\x5c\xfb\x3f\xff\xfd\x3f\x4a\x05\x26\x94\x13\x41\x6f\xe2\x0c\x02\x02\x90\x0f\x71\xe6\xe7\x2c\x23\x04\x11\x0a\x31\xc5\xaf\xe1\x80\x05\xb2\x31\x40\xc9\x73\x06\x4d\x6b\x19\xbb\x5a\x1c\x8f\xc7\x87\x5c\xa9\x14\xc5\x06\xcd\xf0\xf6\x66\x39\xcd\xac\xea\xb5\x25\x72\x50\xf3\x74\xd8\x67\x9c\x39\x55\x28\xfc\x24\x14\xff\xfc\xa6\xd8\xb4\x22\x3b\x0e\x1a\xc5\xfb\x0d\x89\xc6\xc3\x66\x04\xfc\xc6\xe6\x60\x4e\x27\x46\x6b\xb5\x2f\x05\x93\x63\xb1\x33\xd8\x12\xcb\x1e\xcd\xce\xb9\x93\x97\x90\x03\xdd\x29\xf7\xa4\x3e\x3e\xce\x46\xfb\x00\x8f\xb4\xfc\x74\xde\x55\xbd\xc6\x60\xea\xf5\x32\xc9\x06\x86\x0b\x9a\x5d\x9a\x4d\x26\x87\xeb\xd1\x4b\x77\x1a\x4b\xc6\xd7\x6f\x67\xfe\x75\xbd\x6e\x31\xd7\xda\xd3\x75\x27\x19\x6a\x3b\x6f\x1f\x84\xb2\x45\xf3\xce\xb0\xbb\xcd\xd5\xb7\x78\x23\xe9\xd0\x0b\x0f\xc7\xcd\x22\xee\x66\x47\xc3\xd5\xa1\xb2\x6a\x81\xa1\x93\xed\x01\x5c\x4f\xe0\xb1\x17\xab\x35\xec\x0f\x49\xdf\xf0\xed\xaa\x98\x74\xc8\xcc\x9c\xad\xc1\xaa\xd1\xec\xf6\x76\xa9\xa5\x7b\x19\x57\x65\x10\x86\x03\x52\x73\xe7\x8a\x15\x2b\x9d\x35\xd5\x72\x94\x75\xbc\x82\x39\x9b\x43\x52\x9b\xf2\x75\x87\x6d\x12\xb6\x37\x33\x5b\x9f\x77\xab\xa7\x2f\xe9\xcd\xbe\xaf\x3b\x97\xf3\x78\xc8\xbd\x92\x22\xfd\xc7\x42\xdf\x2f\x7c\xd1\xb9\xda\xbf\x70\x74\x84\x3e\x0f\xea\xdc\xe6\x7d\xd4\xa9\x56\x71\xbd\x5f\xe2\x85\x46\xec\x57\x1b\x47\x73\xbe\x08\x2b\xe3\xa0\x94\xed\xb5\x82\xc6\xb9\xcb\xc0\x95\xcb\xfd\xce\xfb\xfc\xb2\x94\xaf\xa4\x7b\xd5\xfe\xcc\xfa\x3c\x48\xdc\xbb\xdd\x2f\xce\x65\xfe\xde\x77\xa9\xe8\x58\xbd\xd2\x89\xb6\xe1\x7e\x72\x7e\x9f\x63\x4c\xed\x39\xfa\x05\xf2\x18\xfd\x17\x8c\x19\x59\xcd\xfc\x04\x76\x33\x15\x23\x97\x58\xf3\x2d\x6c\x8e\x14\xab\x4e\x84\x65\x67\x63\x8e\x27\xd5\x68\x5b\x76\xd8\x9c\x4e\x33\x0d\xe7\x58\x38\xec\x9b\x8d\x0a\xcf\x18\xcd\xc8\xca\x7a\x4e\x8e\x1e\x70\xc7\xae\x0d\xcc\x6a\xcf\xc7\x87\x6e\x38\xe8\x35\x06\xb8\xb1\x2f\x56\x27\x46\xea\x2a\x0c\x06\x42\x80\x28\x22\x28\x12\x31\x01\x28\xc0\x20\x12\x01\xa6\x88\x87\x94\x29\x18\x63\x1c\x43\x11\x0b\xae\x08\x8b\x21\xc6\x28\x0e\xa8\x4a\x14\xe4\x08\x26\x91\xe0\x2a\x39\x19\xc8\x48\x7a\x18\x43\x6e\x9a\xca\x30\x66\xe8\x63\x8c\xf9\x39\xcb\x00\x44\x92\x12\x86\x08\x78\x1e\x63\x6e\xa6\x14\xdf\x89\x31\x2f\xe3\x4d\xe3\xcf\xe4\x27\x4f\xcb\x69\x83\xb8\xdb\x68\x6c\x9c\xee\x62\xbc\x5b\x1f\x86\xd3\x21\x8d\xb2\x0d\x60\xb7\x1a\xf6\xc0\xdd\x1e\xc0\x60\x5e\x2b\x1f\xa6\xf3\x31\x69\x6d\x1d\xb1\x50\x5c\x37\x8e\x78\xbb\x2a\xd7\x9d\x71\x15\xf5\x28\x58\x78\x83\xe5\x21\x6a\x38\x51\x30\xa3\xac\xbf\xad\xf7\x97\x66\x52\x5f\xd9\xfa\xd7\x9a\x11\x7e\x0d\x2f\xae\x8c\x0b\xf7\xf2\xeb\x57\x77\xbc\x06\xde\x7f\xa7\xae\xf6\xf5\x9d\x91\x4b\x99\xfe\x43\x78\x75\xfe\xd2\x5b\x1e\x77\x2f\x3f\xbe\xb8\x78\x8d\xcf\xf4\x86\xcf\x79\xdc\x33\xf4\x03\x4d\x35\x9e\xa0\xff\x34\x8f\x7f\xf3\xfc\x0f\xf1\xf8\x3f\x84\x31\xb7\x1c\x42\x8f\xec\xc5\x99\x50\x3a\x77\xe1\xd9\xb3\xb8\x87\xfe\xcf\x10\xb8\x6f\x62\x5a\x29\x87\xc0\x85\x91\x64\x24\x51\x49\x14\x62\xcc\x02\x0c\x12\x04\x15\x22\x20\x49\x92\x28\x48\x38\x8e\xb8\xe2\x54\x08\x10\x47\x30\x94\x12\x73\xaa\x18\x4a\x04\x89\x71\x4c\x25\xa2\x1c\xbc\xe0\xdd\x39\x04\xae\xda\xb5\x6b\x25\x9f\x76\x1a\xf9\x8e\x4d\x7d\xa7\x5b\xa9\xda\x14\xd9\x7a\x89\x36\xf4\x22\xf1\xed\x56\xa7\x52\x2c\xb6\xed\x6e\xa3\x84\xac\x1a\xc9\x15\x50\xb1\x50\xac\x22\xfd\x4e\xbc\x23\x00\x7f\xd8\x39\xe8\x75\xf6\x8c\x77\x14\xe0\x8b\x4e\x95\xdb\x34\x6b\xed\xe1\x7a\x9e\x5f\x85\x9b\x7c\xd7\x07\x38\xb2\xcd\xe5\xaa\x5f\xa4\x3d\x58\xae\x34\x26\xf3\xd5\xa1\x3d\x5b\x66\x72\xf5\x79\xe9\x74\x79\xbe\x86\x77\x6f\xc3\xb2\xef\xb8\x67\x6f\x9b\x45\x9e\x86\xfd\x4a\xdf\xb5\x0d\xad\x9d\xa5\xce\x1c\x19\x13\xab\x55\x13\x24\x9a\x1c\x9a\xd4\xce\xf6\xf6\x53\xd8\x39\xf6\xa2\xca\x72\xd4\x68\xb4\xf8\x2e\x99\x6f\xb0\x3c\xa8\x05\x66\x8d\x5e\xa6\xb7\x42\x87\x79\x7d\xb8\xa3\xfd\xfd\x3e\xae\xb4\x86\x59\xbb\x6d\x96\x06\x73\x65\xd8\xd3\x28\x1e\x60\xa1\x7d\x49\x47\xfa\x52\x08\xdc\x35\xe6\xdc\x89\xf7\x7a\xa7\x97\x37\xd3\xc4\xbc\x27\xe9\x3f\x1b\x02\x97\x22\xe6\x3c\xcb\xf3\x53\xa1\x7f\x6f\x08\xdc\x5f\xaa\x23\xde\xc2\xa4\x47\xe4\x93\x34\x31\xe9\x77\xca\x47\x3f\x83\x14\x2a\x39\x2f\x3b\x62\x53\xdf\xf1\xdb\x6e\xf6\xd8\x47\x61\xb1\x36\x0a\x33\x86\x9d\xb4\x43\x27\x07\x0e\x9b\x7a\xb1\xd8\xdc\xe6\x32\x13\x9e\xe0\xe2\x61\x99\xcc\x4b\x06\xd3\x8f\x61\x69\x6c\xd7\x8c\x49\x3e\x6f\x91\x7d\xa3\x26\xba\x2d\x77\x51\x1a\xef\x2a\x41\x04\x59\x39\xd9\xa5\xaf\x83\xa9\x48\x04\x22\x96\x71\x48\x71\x12\x21\x26\x22\x88\x24\x89\x11\x12\x52\x52\x85\x78\x42\x10\x8a\x24\xe0\x02\x2b\x02\x28\x89\x09\x09\x42\x00\x90\x48\x14\x8c\x02\x04\xc1\x29\x55\x08\x3f\x1d\x02\xc7\x6e\x21\x11\x91\x10\x7f\xd8\x26\xfe\x34\xcb\x2f\xd0\x26\x24\x49\xc1\x8b\x64\xbf\x39\xd6\x5f\xde\xd4\x07\xa4\xff\x8f\x82\x14\x5a\xeb\xc8\xef\x1c\x96\x8c\x1c\xb6\xd9\x65\xa9\xb6\x04\xd9\x6d\x9b\x6c\xfd\xc3\x6c\x9a\xac\x3a\xfb\xf9\x3e\xbf\x1a\xf8\xe5\x7c\xa9\x88\xc3\x09\x1b\x65\x0e\xf3\x81\x96\x3b\x28\xb1\x06\xa5\x0c\x0f\x8f\xfb\x46\xb9\x36\x9c\x0c\x4b\xa5\x2a\xad\x2d\x77\x5c\x8b\xe2\xe9\x58\xe7\x95\xd4\x9a\x0c\x5d\xbf\x01\x77\x7a\x71\x66\xa6\x17\x8c\xaf\x22\x51\xad\x77\x29\xdf\x42\x9f\xf4\xe8\xbf\x3d\xd3\x2f\xd1\xbf\x42\x9f\x27\xc2\xae\x7a\xf5\x68\xd1\xbe\x22\xe4\xbf\x4f\xf1\x73\x8e\xf6\x04\xfd\x8e\x0c\x56\xd6\x13\xf4\x35\xed\xcf\x69\x19\xef\xa2\x4b\xf9\xf1\xbd\xf8\x71\x16\xfe\x55\xb5\x9c\x0f\xda\xfb\x7e\xdb\x59\xfc\xa0\xdf\x99\x3d\x46\xff\x05\x5d\xac\xb2\xd7\xb1\x56\x8b\xcc\xa6\xb2\xcc\xb2\xc3\x90\xc9\x1a\x87\x71\x19\x55\x16\x45\xcc\xad\x55\xa0\xea\xbc\x30\xd1\xf7\x87\x41\x84\xe8\x66\x5e\x5b\x2d\xfc\x9e\xa6\xa6\xb5\x72\xa4\x6f\x37\x48\x88\xd6\xe0\x48\xe8\xec\x30\x18\xc6\x4d\x26\x9c\x5d\xde\x9b\x53\x77\x73\x4c\xbf\xa0\x53\x98\x84\x11\x8d\x25\xa1\x3c\xe2\x90\x87\x2a\x11\x84\x23\x09\x03\xa6\x10\x09\xb9\x8a\x44\x14\x92\x24\xe1\x82\xc4\x2a\x22\x54\xa2\x30\xc6\x20\x02\x02\x12\xa6\x80\x42\x8c\xbc\xa0\xcb\x93\x21\x70\xb7\x52\x7d\x24\x91\x98\x7c\xd8\xc2\xee\x75\xf6\x8c\x2e\x02\x83\x8b\x5d\xef\x71\x74\x79\x1b\x0c\xfc\x0b\xba\xdc\x2b\x67\x7f\xd2\xc2\xce\x87\xcd\x41\x65\x98\x59\x0c\x45\xe6\xe8\x87\xa8\x1d\x32\xd0\xcf\x2c\x3a\xfb\xee\xda\x4a\x1a\xf6\x2e\x04\xa3\x6d\x69\xbd\x6e\x58\x5a\xde\xed\xdb\xce\xb0\x10\x45\x83\xb6\x3b\x9b\xef\x65\xd9\xa8\x3b\xac\xd5\xab\x4d\xca\xe5\xbd\xb5\x75\xe7\x85\x63\x6c\x4f\x83\x5e\x1f\x6f\x5d\xe3\x2f\x40\x97\xf1\xb6\xb3\xcc\x3d\xcb\xdd\x53\xa4\xff\x50\x80\x77\x3a\xe8\xf2\x96\xbb\x3f\xe4\x17\xff\x83\x41\xc5\x9a\xf6\xe7\xf4\x85\xb4\x03\xac\x9f\xe1\xee\x5a\x4a\xe8\x72\x2d\x69\x3c\x80\x2e\xa8\xda\x22\xc3\x42\x76\x31\xcb\xd6\x56\xc8\x96\xe3\x4e\x66\x5d\x48\x16\xe3\x55\x27\xac\x7b\xa0\xbf\xb2\x65\xb1\x7c\x58\x86\xad\xbe\x9b\x03\x85\xfa\x70\x76\xc8\x7b\xfe\xb8\x55\x2a\xa9\xa4\xb1\x03\xcd\xcd\xb8\x60\xd0\xc1\x41\xd4\x43\x50\x6a\x54\x70\x7f\x8e\x66\x85\x88\x83\xf4\x53\x4a\x41\x0c\x91\x60\x84\x87\x28\x94\x98\x0b\x16\xb2\x90\xb3\x18\x0a\x14\xa9\x28\x00\x90\x63\x4e\x39\x60\x2c\x11\x2a\x48\x00\x45\x38\x82\x61\x80\x43\xc2\x93\x88\x25\x1c\x81\xe8\x67\x7b\xd3\x53\x99\x03\xbd\xdd\xcc\xd9\x0d\xd3\x6c\xf1\x52\xd9\x6b\x55\xf2\x95\x86\x97\xd3\xca\x5e\x11\x35\x49\x01\x95\x9c\x9a\xd7\x41\x0d\xda\xac\x97\x4b\x46\xbd\xa0\x79\x06\x6d\x19\x79\xcd\x77\xfe\xf3\xdf\xff\x23\x1c\x11\xc2\x08\x40\xf4\x26\xce\x30\x80\x99\xfc\x10\x67\x7e\xce\x52\x48\xb1\x64\x10\x32\xf2\x1a\x6a\x5d\x69\x77\xfb\xd5\x42\xbf\x94\xb4\x36\xd2\xce\x77\x4b\xc4\x2d\x6f\xa6\xad\x4c\x01\xcc\x8f\x1c\xc1\xf2\x8a\x2c\x5b\x4e\x49\xf3\xf2\xa8\x77\xd4\x5e\x71\xe6\xd4\xa5\xf8\x13\x7b\xda\x79\xf4\xb2\xa5\x6c\x6e\xbc\x94\x96\x93\x9d\xb6\x4d\xbb\x1c\x4d\xf4\xa3\xde\xaf\xf8\xf3\x89\x72\x8f\xfb\x42\xdf\x9a\xb0\x6a\xee\xb8\x3f\x4e\xbd\xb3\xfd\xe8\x4d\x87\x87\x9c\xb5\x97\xb3\xca\x39\x91\x67\xe7\xcb\xbc\xab\xd5\x51\xa3\x52\x8b\x71\xb1\xb6\x9d\xe4\x72\xeb\xdc\x08\x0d\x93\x59\x0f\xd8\x96\x69\xf9\xa3\x72\xd5\x3a\xba\xd5\xc5\xd6\x1f\xf3\x41\x77\xb0\x9e\x38\xd4\x72\x27\xa3\xd2\x78\x9b\xad\x3a\xb4\xab\x82\x4e\x6e\xe1\xa9\x7c\xdf\x71\xe7\x23\xb0\x42\x5e\x23\xe7\xa6\xd6\x89\xfb\xba\x5e\xd1\xbe\x3d\x31\xc1\xc0\x9c\xcb\x06\x07\x7e\x34\x5a\xf6\xb5\x0d\x8b\x9a\x64\xd8\x98\xd6\xb6\x61\x6b\x73\x1c\xac\x5d\x32\xcb\xa9\x24\x30\xce\x65\x5f\x2e\x7e\x9b\x0f\x3a\x3f\x9f\xc6\x0d\x9c\x49\x8f\xfe\xb3\x36\xb4\x2b\xc9\xd7\xb0\x3a\x7e\xb3\x51\x68\x4c\x61\x79\x5b\xef\xa3\xc6\xc6\xd4\xf9\x1c\xd6\x06\xd5\x92\xca\xc8\x75\x83\x3b\x25\x68\x0c\x7a\xaf\x67\x7c\x65\x17\xd1\xdf\x8d\x13\x78\x19\x9f\xf3\xb6\x27\xe8\x17\x50\x6d\xca\x9e\xa0\xaf\xbd\xa1\xaf\x1b\x62\x29\xec\xce\x16\xb4\x78\x26\x6a\xb9\xfe\x1a\xf9\xe5\x4a\xc9\xdc\x0f\x26\xdd\xbd\x51\x33\x07\x66\x27\x9c\x81\x7c\x2d\xef\x44\xc9\xf9\x37\x5f\xbb\xb4\xbc\x5f\xff\xea\x33\xfa\xb7\xb4\x98\x47\xce\xe2\x4c\x48\xff\xa0\x63\xec\xe7\x7b\xf1\xec\x59\xbc\xbd\x0b\xf7\xef\xc5\xff\xaf\xec\x5a\x1d\x68\x66\x34\x1a\x1a\x78\x7d\x68\x72\xda\x73\x43\xb7\x5b\x9d\x61\x56\xa8\xe6\xfa\xf5\x5c\xa7\xa8\x1f\xeb\x0a\x18\xc1\x12\x15\x63\x32\xf1\x97\xdd\xe1\xa6\xde\x2a\xce\xf5\x79\x98\x3d\x36\x37\x1d\xcf\x1e\xf7\x82\x31\xce\x91\xe6\xa8\xd4\xad\x96\xab\x63\xd0\x6b\xa5\xdf\x89\x9b\x71\x06\x60\x80\x54\x80\x20\x0a\x05\x01\x12\x05\x3c\xc2\x8a\x22\x08\x39\x0a\x19\x4f\x48\x28\x71\xc4\x51\xc8\x11\x0b\x00\x53\x94\x00\x09\x79\x84\x82\x50\x60\x05\x83\x1f\xba\x03\x84\x4f\xdb\xc8\xe8\x2d\x74\xe1\xf0\xe3\x1a\x3a\x3f\x27\x5f\xc0\x8a\x60\x9a\x42\x92\xe8\x5b\x6b\xce\x2f\x7c\xe9\x01\x3e\xf7\x51\x92\x68\xbe\x3c\x9a\xb1\x6c\x33\xdc\x82\x6d\x96\xea\x9d\xfc\x68\xb0\xf7\xa6\xe1\x61\xd6\x62\x0b\x97\x1d\xe2\x5d\xd7\x5e\xd4\xf2\x56\xe3\x58\xdd\x57\x92\x4d\x24\x58\xec\xdb\xa3\x2a\x18\x92\xc9\xaa\xa2\x7b\x49\x59\x9b\x6d\xf8\xa0\xe4\xb4\xa7\xa0\xd2\x39\x1c\xc7\xf3\xad\x5f\xd7\x40\x6a\x16\xb2\xeb\xfb\x7f\xa7\x0e\xb1\xe8\xfa\xa5\xd2\x15\x2f\xf9\x80\xa1\x7d\xce\xdb\x53\xa4\xff\x90\x85\xee\x0a\x5b\x9e\xb0\xca\xcc\xc7\xbd\xd9\xec\x59\xab\xcc\x1f\xb4\x0a\x69\xda\x9f\xe3\xe7\xef\x62\x4b\xe9\xf1\xbd\xf8\x71\x16\xf3\xdd\xcd\x87\xfe\xb6\xb3\x78\x7b\x17\xee\xa1\xff\x82\x2d\xf5\x03\x2d\x39\x5b\xf0\xff\xa8\xfb\xb2\x26\x67\x6d\xe5\xef\xfb\x7c\x0a\xd7\xff\x26\xe7\x94\x9f\x1c\x83\x00\x01\x39\x95\x53\xc5\xe6\xdd\x60\x1b\xec\x31\x7e\x2f\xa6\x40\x08\x1b\x6f\x60\xc0\xdb\xe4\xcb\xbf\xe5\x65\xc6\x8c\xc7\x2b\x66\xf2\x24\x54\xa5\xe2\x79\x24\xba\x5b\x8d\xd4\x3f\x75\xab\x25\x01\x96\xaf\x17\xf2\xad\xc9\x90\xa9\x44\x5d\x06\x70\xf3\xa2\x36\x1f\x6b\xd1\x2c\x2a\xb5\xe7\xa3\xf5\xba\x13\xbd\x21\xa3\xcc\xce\x5c\x6d\x36\x15\x03\xd9\xa9\xe4\xab\xa1\x2c\x4c\xa8\xcd\xaa\x56\x5f\xd0\xde\x68\xd2\xe7\xe5\x62\x14\x31\x96\x0d\x94\x96\xfa\x0d\xd7\x70\x3b\x36\xe4\xa1\xc5\xf2\xac\xcd\x42\x9e\x64\x21\xb2\x2d\xec\x50\x16\x43\x60\xda\x82\x16\x07\x59\x92\x24\x79\x08\x48\x17\x32\x16\xe5\xf2\x0c\x6d\x51\x36\x72\x49\x82\x40\x2c\x76\x09\xf4\xbe\x07\x67\x97\x13\x50\x62\x80\xf1\x02\x5b\x82\x08\x8d\x92\xda\xd0\x8c\x3a\x05\x4c\xba\x41\x75\x5a\xad\xba\xaa\xaa\xe5\xa6\x52\x36\x85\x8a\xd9\x6e\x42\xbd\x58\x84\x7d\xa1\xdb\x2e\x32\xfd\x96\xf9\xeb\x8f\x1c\xc5\x41\x86\x66\x09\x06\x42\xe6\x47\x0e\x6c\x51\x06\x5c\x02\x12\x8e\xe0\x98\xcb\x3e\xcc\x7b\x29\x0d\x78\x9a\x87\xec\x96\xe4\x87\x8d\xa5\x1c\x23\x86\x82\x90\x9f\xf6\xc3\xb2\xd1\x5b\xbe\x68\x0d\x4a\x57\x8a\xb1\x45\xb0\x9b\xf2\x4a\x2c\x55\x96\x7c\x25\x70\xfb\xe2\x4b\x75\x77\x24\xe1\xfe\xfe\xc0\x1d\x1c\x9c\xe2\xca\x97\x2b\xa6\x1f\xb0\x79\x09\x32\x27\x39\x70\xad\x47\xfb\x69\xa2\x77\xbb\xbd\x61\x82\x92\x08\x5a\x5d\x6f\x77\x04\xa4\x22\xac\x37\x13\x66\xb0\x94\x24\x59\x62\x27\x44\x30\xe7\xed\x82\x18\x3b\x14\xd2\x3a\x1d\x64\xf2\xed\x25\x21\xd4\xd7\xdd\xd1\x62\x42\x2b\x5d\xbd\x4e\x76\x37\x83\x90\x24\xd8\xd2\x48\xf6\x49\x32\x6f\x46\x2b\x67\x3a\x91\x16\x2f\x2e\x5b\xab\xc4\x1d\x02\x0d\x27\xfe\x20\x98\x45\xf4\xe7\xfd\x41\x8d\xc4\xe2\xfc\xf1\xe7\x35\xbf\xef\x32\x8e\x25\x48\xc9\x0e\xa9\x51\xbe\x20\xc3\xfe\x34\x72\x54\xcc\x9b\xf4\x9b\x53\x69\xbd\x90\xa1\xb1\xac\xb8\x82\x62\x7a\x05\xc2\x9b\xf0\xe3\xa2\x39\xd9\xa5\xaa\x1e\xaf\xa4\xbb\xb4\xfd\x31\xf1\xbd\xce\x3c\x62\xc6\xfc\x1f\xf5\x91\x24\xe1\x73\x6e\x5d\x62\xbf\xd3\xc3\xb6\xab\x3f\x89\x86\xcf\xda\xce\x67\x6c\xb7\x3b\xaa\x4d\x9e\xe0\x7f\x8a\x1d\x82\x4a\x75\x58\x3c\x10\x9a\xc1\xd4\x5a\x13\x24\x4b\x8e\x46\x2a\x31\x14\xed\x97\x58\xe3\x86\x9c\xd0\xf6\xea\x05\xbd\xd6\xfb\xe8\xf3\x89\x63\x3e\xa5\xf4\x79\x16\xcf\xf0\xff\xc8\x9f\x4e\xc7\x7f\x57\xf0\x65\x3c\x3c\x3a\xaf\xea\xd1\x9b\x00\x9d\x34\xea\x42\x5b\xcf\x3d\x5f\xc6\x43\x9a\x79\xdd\x13\xfc\x9f\xb6\x07\xc7\xbd\x11\xa9\xc6\xe3\xd3\xf6\x40\x97\x84\x61\x4a\xfe\xe7\xe6\x52\xc9\xfd\x8f\x29\xc6\xc3\x61\x5e\x97\x3e\x97\x25\xc3\xf1\xf8\x08\xff\xf7\x2d\xd1\x28\xc0\x66\x7d\x35\x18\xac\x16\x8c\x53\xb3\x96\x2f\x85\x95\xdd\x73\x28\x79\x52\x2c\x97\x9a\x1d\x9b\x17\x24\xae\x6b\xb2\x01\x16\x8b\x1d\x8f\xef\x22\xbf\xc6\x3b\xda\xda\x5f\x41\xd5\x71\xa7\xf5\x46\xb9\x1f\xb4\xc2\xc9\x2c\xbf\xf1\xea\x5d\xb5\x5c\xe9\x5b\x95\x5a\x9f\xd5\x6e\xef\x59\x03\x8f\xfa\xe9\x10\x01\x0e\x11\x08\x39\x8c\x05\x30\xcd\x12\x00\x5a\x16\xb2\x5c\x0b\x60\xb4\xf5\xd7\x09\xd2\xc5\x8c\x83\x29\x9a\xc7\x2e\xc5\x42\x44\xb8\x9c\xe5\xda\x1c\x4f\x21\xd6\xb6\x19\xc6\x39\x9c\x96\xf1\x9c\x9b\x4e\xdf\x72\xd3\x39\x9e\xbf\x7c\x2f\xd9\x47\xe9\x61\x46\xc6\xb3\x30\x83\xc5\xc6\xd3\x5e\xfe\x65\x30\xa4\x00\xdb\x4b\xa9\x2c\x6d\x19\x36\xba\x2f\x03\x45\xd0\x17\x91\x3b\x0c\x61\xd5\x29\xf2\x35\xaa\xed\x61\xd0\x93\xda\xd5\xda\xa4\xa0\xfa\xb5\x4d\x15\x85\x0e\x39\x2e\x45\xd4\x66\x10\x04\x0c\xb3\x5e\x70\x84\x39\x29\xae\x06\x6a\x57\x09\xfb\x05\xa4\x08\x65\x53\x9b\x13\x50\x5a\xa9\xee\x4c\x01\x91\x94\x99\xa3\x9e\x7e\xb1\x2f\x0a\xad\x5a\x94\x30\xa8\x17\xe2\x7f\x37\x0c\x5a\x76\xfc\x53\x01\x4a\xc2\x51\x7f\x62\x82\xb3\x89\xfd\xf9\xfa\xd9\x09\xce\x4f\x9c\x60\x09\xc2\xcf\x33\xe8\x67\x1d\xf5\x4a\x7a\x5d\x6c\xbf\xc5\x5b\x22\x52\xd1\x78\x50\x17\xcf\x7e\x8b\xd3\xbe\xf0\x08\xff\x03\xb8\x28\xad\xfc\xa8\xd8\xf5\x45\x41\x09\xc3\x32\x6d\xe5\xbd\x5e\xdb\xd5\x63\xc2\x9c\xc5\x93\xd5\x58\xd7\x03\xf7\xcd\x92\x22\xaf\x57\xa3\x9c\xbe\x18\xaa\x9c\x5f\xb3\x30\x46\xf6\x52\x2d\x55\xdb\xa8\x22\x77\xdb\x35\xe0\x52\xa2\x20\x02\x79\x1e\x6b\x83\x48\xee\x31\x6b\x35\xcc\xfe\x4c\x75\xc7\x61\x69\x8c\x31\x60\x2d\x86\xe7\x68\xca\x06\x9c\x45\x30\x96\x43\x70\x96\xed\x42\x06\x5b\x16\xa0\x48\x9b\x75\xb0\x8d\x69\x87\x60\x18\x86\x40\x84\xc5\x5a\x34\xd8\x1d\x21\xc8\x03\xfe\x70\xd0\xdf\xce\x4f\xa7\x61\xb7\x5d\x13\xa5\x7a\x05\xf4\xa0\xdc\xab\xf7\x58\xa1\xa2\x74\xdb\xc5\x7a\x99\xea\x08\x6c\x4f\x54\x28\xb5\xa4\x36\xa1\xc6\xd2\xe5\x16\x53\xef\x95\x1b\x25\xa3\x0b\xaa\xe2\x16\x15\x08\x02\xd2\x2c\x4b\x12\x2c\x75\x0b\x66\x78\x9e\xbd\xb2\x57\x6d\x5b\xca\x6c\x09\xd2\x14\xc3\xb3\x34\xa0\xe1\x47\xc6\xa4\x3c\x9b\xaf\x3b\x8a\x4e\x58\x4b\xda\x21\xa9\xbc\x28\xd6\xd6\xb5\x28\x0f\x85\x02\xaa\xaa\x71\x83\x2c\xcc\x5c\x1a\x97\xbb\x94\xb6\x22\xa0\xf0\x01\x33\x3b\xc3\x94\x80\x95\x63\x8f\xc6\xa7\xeb\x34\x4f\xf8\xd9\x42\xd5\x7b\x49\x4c\x09\x45\xe7\x2d\x52\xb5\x9d\x9f\x2d\x8e\xc6\x8c\x52\x9c\x77\xb9\x92\x57\xe7\xd7\x1d\x08\xb4\x8e\x54\xc3\x3a\xea\xad\x4b\x0d\xa3\x31\xaf\xfa\x32\x1b\x6e\xbc\x92\xcb\x8c\xea\xcd\x7e\xb5\xad\x07\x43\xfb\x45\xa2\xfa\x1b\x54\x56\xf2\x81\xbc\x58\x14\xa0\x52\xd3\xe7\x48\xed\x84\x1e\x23\xf4\xde\x5a\xd3\x46\xbe\x64\xde\x13\x1f\xbe\xcf\xaf\x4e\x54\xd2\x70\x58\x6c\xb5\xeb\xed\x79\x61\x48\xf5\x5c\x5a\x51\x42\x65\xfe\xc6\xfa\x32\xbf\x1a\x03\xe2\xad\x97\x77\x0a\x43\xda\xe9\x21\x56\x36\x3e\x0e\x4e\xf4\xd0\x51\xc7\x17\x9e\x1b\xb0\x93\x1d\xff\x67\xf7\xac\x25\x72\x64\x1e\x36\x35\x61\xab\x58\x7f\xd6\xd4\x3d\x63\x6a\x43\xa0\x4d\x9e\xe0\x7f\x6a\xea\x05\x06\x46\x5d\x51\x89\x4b\x61\xbe\xec\x38\x85\x41\x4b\x8f\xf4\xb0\xb9\x18\x34\x29\xc9\xb0\x0d\xd5\x65\xa8\x7c\x79\x48\x7e\xf4\xf1\x1d\xec\x54\x77\xa3\x41\x4c\xbf\xf6\xfa\x0c\x7f\x03\x11\xcb\x94\xfc\xcf\xc2\x5e\xf9\x39\x5d\xec\x19\x89\xe9\xd7\x3e\x9f\xfc\x16\xfb\xb5\xcf\xc7\xf9\xbf\xef\x0f\x60\xb4\xb6\x68\x4d\x5c\xd1\xf7\x0a\xa8\xab\xc5\xa3\x89\xe0\xcd\xc6\xb3\x22\xd7\x1e\x29\x6f\x35\xcf\x12\xf2\x90\xf3\x87\xb3\xbc\xb9\x79\x03\x7a\xa7\x33\x37\x5f\xc8\x41\x0c\xd0\x4c\x5c\x37\xe7\x2d\x36\x5c\xe6\x87\xd2\x78\x3e\x93\xbb\x35\x7a\xd1\x2a\x72\x44\x75\xd4\x1c\x4e\x3f\xe2\xd3\xde\xd6\x99\xf9\x95\xdc\x5d\xcb\xf5\x0c\xea\x01\x86\x21\x31\x0b\x2d\x0a\x61\x9a\xe3\x48\x9b\xb5\x11\x4b\xb9\x8e\xeb\x70\xbc\x03\x59\xc2\x61\xc8\xdd\xc5\x22\x34\x66\x20\xc9\x40\xc0\x00\x9b\x21\x59\x96\x25\x00\x05\x08\xe0\x60\x76\x8f\x7a\x20\x2b\xd4\xbb\xee\x5c\xd1\xff\x21\xb6\xcf\x85\x1d\x6b\x87\x52\xfa\x88\x7a\x90\x39\x3a\x57\xe9\x51\xef\x34\x1a\x5d\xb4\x4a\xdd\xc8\x2e\x7d\x1c\x52\xf3\x65\xc7\x76\xba\x68\xb5\x64\x4e\x92\x07\xff\x7c\x58\x68\x51\xd0\x41\xbe\x61\x35\x05\x96\x17\x46\x32\x21\xb2\xf3\xd1\x84\x98\x2b\x6f\x84\x0a\xa5\xb1\x3c\xf5\x75\x7a\x3c\x98\xf5\x46\x7d\xd7\x5e\x3a\x88\xaf\x8c\xe7\xea\x94\xd0\xf3\xcb\x9a\xa8\x0e\xba\x1c\x11\xe8\xae\xb7\x36\x49\x9a\xad\xe7\x47\x4b\xbd\x30\xb0\x66\xfe\x72\x6e\xd7\xbd\x6d\x47\xfa\x3b\xa0\x5f\x87\x52\xeb\xdc\x51\xd7\xe9\xa2\x48\xd9\xf1\x4f\x75\xc2\x47\x02\xfd\x7e\x22\xfa\x3c\x8d\x7e\x11\xea\x15\x7e\x26\xfa\x9d\xa0\x4f\xaa\xcb\x3d\x9f\xe1\xaf\x83\xb0\x9b\x92\xff\x2d\xa7\xef\xaf\x44\x9f\x4c\x74\xf1\x11\x51\x4c\x8d\x7e\xdf\x65\xb4\x76\xe8\x17\xe3\x75\xbc\xfd\xff\x10\x4f\x26\xfe\x93\x08\x48\xd9\x14\xc4\xc8\xb5\x11\x02\x96\x63\x13\xc8\x75\x5d\x82\xb3\x30\x07\x49\x9e\x77\x21\x8d\x49\xc0\x73\xb4\x4b\x70\xb4\x6d\x13\x94\x8d\x79\xdb\x06\x34\x0f\x49\xd2\x71\x39\x40\x01\x60\xef\x11\x90\xca\x0a\x01\xaf\x67\x01\xed\x30\x0e\x90\x17\x76\xca\x25\x4a\xf7\x08\xc8\x10\xf0\xb8\x3e\x9b\x1e\x01\x13\xa1\xb0\x86\x28\xb4\x94\x3b\xff\x13\xfe\x02\xbf\x50\x96\xf8\x61\x23\x6e\x98\x7d\x38\xb4\xd7\xa4\x27\x38\xbd\xd9\xa0\x8d\x24\xb3\x35\x75\x39\xbc\xa0\xdf\x90\xc8\xeb\xf5\x32\xe0\x79\x2e\xee\x9a\xc8\x82\x2d\xd3\x1b\x30\x72\x34\xd8\x00\x5f\x6a\xc8\x64\x95\x1d\x0f\x2b\x75\x7e\xf4\x56\xe8\xbe\x8c\x50\x73\xb8\x34\xba\x4b\x89\xbb\xe7\x7c\xc6\xef\x47\xc6\x78\x4e\x26\xfc\xb2\x54\xc8\x94\x21\xff\x54\xe1\xd0\x8c\x90\xf1\x49\x64\x7a\x1a\x19\x63\x69\xd8\xff\x99\xc8\x78\x82\x4c\xcf\xb6\xff\x71\xfe\xad\x21\x9b\x92\xff\x77\x20\x63\x5a\x64\xca\x44\x17\x1f\x57\x4c\xa6\x46\xc6\xd5\xd2\x34\xea\x46\xa9\x84\xfd\x17\xce\x31\x07\xe5\x2e\x43\x2b\x3d\x61\xaa\x54\x67\x85\x72\xb8\x68\x50\x82\xdb\xf1\xd6\xfc\xd2\x75\xeb\xdd\x97\x72\x69\x31\x2e\x55\x7c\xad\xc5\x56\x1a\xf1\x5c\x18\x09\xbc\x8e\x99\x8a\x2e\x15\x4c\xae\x40\x76\x7d\x4a\xa6\x6d\x82\xb4\x57\xcb\x8f\xb5\xb6\xa1\x15\x0d\x77\x1a\xbf\xdb\x4a\x2b\x7f\x3c\x09\xa0\x98\xa4\x39\x8e\x41\x36\x84\x96\xcb\xb8\xac\xcb\x60\x9e\x27\x6d\x82\xa4\x31\x46\x34\xcb\x20\x48\x22\xc4\x51\x24\xe0\x01\x72\x19\x06\x40\xe4\x38\x04\x72\x2c\x92\x66\x28\x82\xe0\xa8\x83\x0b\x49\x67\x05\xa0\xd7\xb7\x9a\xef\x20\x92\x26\x2f\x6c\x06\x4c\x94\x1e\x00\x94\x66\x8f\x89\xb4\xe9\x01\x34\x89\x82\x92\x30\xa8\xdc\xf9\xdf\xe9\xab\xc2\x77\x04\x56\x35\x77\xce\x37\x5b\x9c\x52\x42\xc1\xa8\xfd\xa2\x58\xf3\xd2\x7a\x39\x14\x47\x7a\x77\x31\x86\x35\x46\x00\x61\x3c\xac\x9b\xe5\xd9\x54\xe8\x4d\x5b\x64\x75\x54\x95\x29\xc5\x71\x46\x9e\xa2\x53\x76\xb3\xdf\x29\x32\xd8\x2d\xb5\x96\xed\x91\xaf\xd4\x06\x9e\x08\x9c\x0e\xe5\x82\xd5\x3d\x9b\x3a\xbe\x1f\x40\xc7\x15\x9c\x70\xed\xd2\xad\xe7\x65\xc7\x3f\xd5\x7a\x5e\x46\x00\xfa\x24\x80\x3d\x0f\xa0\xcf\xad\x61\x3d\x0f\xa0\x9f\x01\x2c\xd5\x7a\xe6\x33\xfc\xdb\x73\x73\x98\x92\xff\x77\x00\x68\x5a\x00\xcb\x44\x17\x27\x41\xee\x47\xf8\x1f\x00\xd4\x98\xc1\xa5\x41\x34\x45\x71\x56\x33\x89\xee\xb0\x34\x1f\x46\x36\xdd\x32\x89\x89\x1d\x68\xde\xa2\xa5\xce\x59\x53\x07\x22\xc3\x0c\x8a\xcc\x58\xd5\xcd\x4d\x8b\x5f\x97\x7b\x26\x3d\x54\x62\xf0\x06\xba\x22\xee\xcd\xd6\xe3\x3a\x61\x42\x51\xf2\x2b\x03\x67\xd6\x55\x29\x3e\xfa\xd8\x54\x12\xe2\x78\x11\xce\x76\x3a\xbf\xdb\x4e\x57\x9e\x85\x50\xc2\xb5\x79\x04\x30\x20\x78\x1a\x02\x00\x6c\x40\x61\xd2\x21\x1d\x08\x09\x07\xf3\x0e\x4b\x33\x2c\x44\x34\x89\x5c\x87\xb7\xb7\x5e\x29\xef\x30\x90\xb1\x08\x92\x42\x24\x76\x39\x1e\x59\x87\x3d\xf0\xcf\x25\xb6\x5c\x5f\x71\xa4\xff\x43\x90\x24\xe4\x2e\x5c\x98\x99\x28\x3d\x20\x31\x43\xc2\x0c\x2e\x92\x39\x35\xda\x5f\xe2\x83\x29\x56\xbb\x2e\xed\xa2\xe7\xe2\x4a\x71\xe3\x0f\x78\x0d\x4b\x73\xcf\x12\x55\x77\x5d\x74\x84\xc9\x0c\xab\xa6\xe1\x8e\x7c\xb5\xd3\xa8\x79\xb0\x58\x95\x4c\x46\x9c\xe3\xe9\x4c\x16\xd7\x25\x7f\x4d\x8d\x6a\x7a\x61\xbd\xa6\xdf\x82\xb5\x60\xf8\x4a\x31\xa0\x4c\xd0\xc8\xab\xed\x6a\xa5\x43\x0f\x0a\x65\xa2\x9a\x55\x62\x8b\x98\x7e\x07\xc8\xa2\x40\xac\x00\x79\x7c\x3d\x5d\x8c\x33\x3b\xfe\xa9\x80\x38\x91\xd8\xf2\xc4\x0a\x23\x5b\x30\x64\xfb\x59\x20\xfc\x89\x2b\x9c\x82\xf0\xf3\x56\xd5\xce\x02\x91\x92\x5e\x17\xdb\x6f\x81\xe8\xe3\xfb\xa9\xe2\xbd\x19\xf6\x85\xc7\xe3\xbd\x7f\x16\xea\xba\x88\xe6\x95\xa6\x31\x1b\xcc\xfd\xe9\xc0\xe8\x71\xed\x5e\xab\xda\xa7\x46\x2f\x0a\x45\x43\xb9\x2b\x4b\xfe\x62\xa8\xb7\xa6\x5a\xcb\x9a\x05\xc1\x6a\x85\xda\xf3\x86\x43\x6f\xc6\x4b\x0e\xe1\x06\x44\x2d\x05\x8a\xa2\xe5\x00\x75\xd4\x1c\x75\x74\xbd\xa8\x55\x9a\x6b\xfe\x1b\x2e\xc1\xe4\x09\x8e\xc1\x24\xe5\xda\x98\x77\x39\x1a\x13\x2c\xa6\x00\x61\x11\x0e\x4d\x33\x0c\x05\x1d\x4c\x5a\x2e\x02\xc8\x75\x38\xc4\x62\x9a\xe4\x20\xe4\x58\x8e\x60\xb1\xe3\x00\x9b\xe6\x76\xc9\x8a\xef\x77\x60\xca\xbd\xa2\x50\xaa\x4a\xba\x54\xa1\xa5\x1a\x30\xcb\x35\x68\xb6\xeb\x02\x34\x6a\x4a\xaf\xd8\xee\xb1\x62\xa3\xd4\x6d\xb4\x34\xb1\x51\xaf\x28\x9d\x6a\xbb\xca\x98\x2d\xb5\xde\xa8\x88\xbb\xab\x9d\x49\x96\xe7\x20\x4f\x72\xd7\x6f\xc3\xa4\xff\x43\x00\x92\x87\x97\x61\xe6\xbd\x14\x30\x2c\xe4\x39\x82\xe5\xd8\x0f\xff\x4c\x63\x5a\x25\xbd\xd6\x1a\x23\x25\x7c\x91\xe7\xbc\x57\x5b\xe1\xa9\x3f\xd9\xac\x97\x5c\x5d\xee\xf6\xc5\xd5\x4b\xbd\xa5\x7b\x66\xc0\x7a\x72\x57\xf8\x80\x99\xb3\x19\xe4\x09\x98\xe9\x9c\xeb\x0a\xa7\x4b\x7e\x17\x4c\xea\xc9\xe3\xcd\x16\x15\xb5\xb3\x7b\x9d\x6e\xb6\x05\x4c\xe0\x59\x81\x60\xfa\x65\x30\xc1\x12\x36\xb4\x68\x6d\x1b\x04\xea\x2c\xa8\xd5\xa0\xe3\xbd\x74\xd0\x42\x1e\xd3\x1b\x8b\x2b\x15\x06\x15\x9e\x18\x4e\xba\x30\x78\xd3\xcc\x8d\x20\xc2\x7e\xcc\xb8\x2a\x1b\xb4\xc3\x66\xbb\x5e\x88\x8d\xc9\x6c\x34\xe8\x08\x23\x4b\x5c\xae\xd4\x75\x07\xed\xe8\x17\xa7\x4e\xa9\x0d\xab\xfd\xc5\xb8\x56\xed\x48\x54\x37\x04\xa6\x52\x2d\x00\xba\x44\xc5\x38\x9a\x1b\x4b\x1a\x75\x99\x0e\x12\xfc\xb7\xf6\x50\x07\xf9\x15\xd1\x34\xbb\xdd\x39\x66\x5b\xc6\x54\x6b\xa8\x7a\xa9\x57\x90\xa8\xfa\xba\x49\xc6\xfa\x32\xe8\x39\x9d\x82\x36\x34\x23\x4d\x5e\xdd\xb5\x64\x98\xdc\x60\x78\x19\xce\x12\xce\x28\x3b\x11\xfa\x95\x40\x6a\xaf\xf4\xd8\xd4\x42\x50\x09\x45\x68\x79\xbd\x7a\xa9\xb0\x8a\xd4\xee\xb8\x2c\x9a\xb1\x58\xab\x7e\xe8\x2e\x99\xb0\x72\x4c\xe4\xff\x3a\x4c\x95\xed\xbc\xec\xf8\xad\x9a\xfd\xe6\xac\xb3\xa9\xf7\xf3\x9a\x59\x1d\x0d\x67\x4c\x79\x3c\xa6\xa9\xce\xe2\x05\x86\xda\x02\x4f\xfb\xcd\x62\x6b\xe2\x68\x33\x4e\x46\xdd\xf2\x59\x7a\xbb\xbf\x13\x47\x6a\x3d\xd8\xd7\x84\x49\xab\x4e\xcf\x8e\x1d\x46\x3c\xfe\x4c\x3e\xe2\x6e\x3e\x79\x6c\x1a\x30\x18\xb2\xe1\x01\x77\x34\x95\x4c\xba\x9f\x6f\x33\x55\x4d\x25\xeb\x93\xc5\xfc\x2d\x9c\x05\x53\x63\xdd\xa9\xf6\x8c\xa0\x20\x50\xc5\xf6\xe5\x43\xfd\xf7\xf4\x56\xff\x58\xf9\x13\x87\xfe\xc8\x8b\x8e\x38\xf6\xc6\xd5\xb2\x58\x23\x07\x70\x69\x7a\x51\x39\x98\x57\x51\x64\x17\xa4\x15\xf9\xd2\x42\x45\x8f\x50\xfc\x69\x0d\xd3\x03\x72\xc7\x3f\xe1\x6b\x1c\x85\xfa\xba\xc4\x7c\x12\x6b\xe1\xc7\x79\xc7\xa8\xc4\x33\x9a\x19\x4c\xb5\x92\x3b\xc6\xba\x31\x72\x74\xc6\x9e\x47\x90\x81\xfd\x31\xd7\x95\xba\x04\x74\xdf\xc7\xda\x85\x38\xc6\x11\x22\x8b\xcf\xc9\x7f\xf0\xd5\x84\x0f\x7a\x67\x0e\x14\xcd\x4c\xfe\x8f\xbf\xff\x49\xe3\x73\x07\xc5\xdf\x62\x50\x07\x7f\xfc\xf1\xe3\xbb\x2c\x69\xb6\x18\x8f\x79\x87\xb4\x28\x82\x20\x2c\x6c\x51\x90\xa5\x29\x92\x06\x2e\xc0\x0e\x26\x09\xe8\x50\xc8\xa6\x58\x44\x39\x2c\xe6\x38\x86\xe0\x30\xe5\x02\xd2\xa6\x79\x48\xb1\x84\xcd\x70\x90\xe2\x18\xee\x70\xfc\x40\x56\x18\x7f\x73\x11\xf3\xf2\x3d\x0b\xc7\x42\x40\xd2\x2c\xcd\xd1\x04\xc3\xc2\xe7\x11\xfe\xca\x76\xc9\xbb\x10\xfe\x42\x62\xca\xc9\xa3\x1f\x11\x5e\x7f\x23\x84\xb8\x8f\xd5\xb7\x9e\xde\x1b\x8f\x9a\xe3\x5a\xd5\xd5\x14\xce\xea\x18\xc2\xa2\xd9\x86\xc1\xba\xd1\xb0\x8b\x14\xc5\xae\xd6\x0a\xb5\x7a\xd3\x0c\xd9\xea\x22\xb9\x05\x54\xa6\x49\x29\x7c\xa3\x86\xf2\xae\x6d\x17\x87\x7d\xbe\x96\x27\xd8\x7c\x95\x58\x35\x4a\x93\xb8\x2d\xde\x77\xcd\xc2\x7d\x08\x9c\x78\x35\xcd\x08\x27\x4f\x98\x7e\x7d\x6e\x38\x94\xd9\xf1\x4f\x77\x5c\xce\xb7\x58\xe8\x54\x29\x9b\x3f\x89\xff\x2d\x87\x2e\x8d\x2c\xad\x84\x82\x2f\x3c\xdf\xaa\x0b\xed\x5a\x16\xd9\x4d\x5d\xfc\xf9\x5d\x83\x36\x5b\x63\xcf\xf3\x8c\xcd\x03\xc8\xbb\xbc\xcb\x23\x1a\x91\xd8\x42\x98\x65\x18\x82\x24\x39\x8e\x85\xd0\x81\x98\xb3\x30\x4d\x20\x86\x26\x29\x12\x10\x1c\x49\x5a\x0c\x41\x53\x2c\xe4\x28\x64\xb3\xbb\xab\xdb\x98\x43\xce\x66\x16\xc6\xfe\xe6\x82\x1b\x05\x19\xfe\x72\xce\xe6\x7b\xe9\xc1\xdc\xd3\x30\x0b\x87\xee\xca\xcd\x6d\xb7\xcc\xfd\xad\xae\xf3\xc4\xa4\x36\x01\x0f\x72\x30\x6e\x34\x10\x3b\x1e\x8f\xcd\x91\xec\x37\x57\x6e\x67\xa2\x29\x7c\x5c\x37\x97\x2f\xe5\x4a\x61\x9a\x17\x45\x5c\x18\x48\x35\x95\x44\xdd\xa5\x52\x24\x3b\x62\x17\x4b\xd2\xa2\x24\x1a\xa3\x45\xb8\xa1\x8d\xb9\xbf\x0e\x26\xb5\x09\xad\xf6\xcb\x55\xdd\x60\x0a\x5a\x18\xd2\xbd\x3b\x6f\xe1\xf9\xab\xe1\x21\xdd\x8e\x82\xec\xf8\x3f\x7b\x6b\x5b\x86\xe6\x39\x55\x8c\x2b\x6b\xfe\x57\x6e\x24\xf8\x3b\x3a\x40\x69\x4d\x7a\x56\xfa\x3b\x64\x9b\x3c\xcc\xff\x00\x29\xdf\x35\xd0\x33\x3e\xa5\x86\xe5\x1c\x64\xf1\x00\xd2\x0c\xc3\xb0\xbc\x4d\x5b\x34\x45\x10\xbc\xeb\x62\x8a\xb1\x08\x00\x78\x0b\x3a\x16\x6d\x63\x87\x02\x0e\x85\x78\x9e\x77\x58\x8b\x80\x96\x03\x20\x24\x18\x6b\xb7\xd3\x8c\x39\x24\x41\x66\x01\x29\xd7\x0f\xda\xdc\x81\x06\x0f\x2f\x27\x41\xbe\x97\x1e\x20\x85\x63\x8f\x4b\x51\xe9\x21\xe5\xca\x52\xd4\x5d\x90\x92\x30\x2b\x89\xb8\xcc\xd1\xec\x9e\x3e\xe2\x47\x37\x54\xe4\xc1\xa4\xdd\xde\x4c\xe3\xfa\x68\x95\xaf\x4c\xa7\xa5\x95\xe1\x89\x46\x4d\x61\x7b\x6c\x1e\x48\x9b\xd5\xa4\xbc\xe2\xe6\xd8\xc9\xc7\x0c\x20\x74\x5b\x18\x0c\xd0\xdc\xf6\x37\x4c\xad\x57\xb5\x94\x26\x43\x16\x56\x6d\xbd\xb1\x8e\xfb\x9d\x81\xac\x15\x5d\x4b\x9e\xf1\xb2\x4b\xd0\x8a\xf0\x37\x84\x0a\xe9\x84\xff\xe1\x51\x3e\xeb\x30\x93\x58\x5e\xe2\x9b\xa5\x89\x85\xc5\x89\xb8\xf1\xf9\xcd\x52\xe2\x67\x7e\x59\xc7\xf2\xfe\x91\xf2\xff\x93\x62\x61\xdf\x00\x65\x69\xa1\xe4\x3b\xf4\xf7\x08\xff\x03\x94\xd1\xd5\x4e\x07\x05\xa1\x4e\x73\x4d\xaf\x1a\x0c\x23\x85\x1e\x74\x36\x43\x8d\xcc\x17\xe2\x41\x14\x55\xdb\x5c\xb3\x36\x9b\xb9\x21\x76\x62\x65\xba\xaa\x54\xca\xb5\x29\x6c\x2c\xf4\xc9\xe6\x65\x28\xe7\x1d\x97\x53\x3a\xa3\x86\xfd\xd2\xad\x08\x6f\xc3\x1e\x18\x30\x85\x16\xc5\x6b\xa2\x90\x39\x94\x41\x88\x01\xeb\xda\x80\xe3\x58\x02\xd9\x0c\x60\x20\xb6\x78\xc0\x42\xda\x46\x36\x00\xc0\x72\x6c\xdb\xb2\x18\x17\x23\xe0\x70\xbc\x05\x81\xc5\x5b\x16\x87\x78\xc4\x61\x80\x31\x8f\xf9\xc3\x11\x1f\xcf\xe5\x52\x80\x5b\x00\xc6\x00\xfe\x8a\x4f\xb4\x2d\xa5\x3f\x10\x91\xa5\x00\x97\xc1\x21\x21\x57\x7c\xa2\xfd\x93\xc2\x78\x5f\xc8\xa5\x90\x84\x4e\xa0\xe5\x87\x6b\x6f\x60\x15\xcc\x41\x3b\xea\x52\x61\x31\x10\xab\x1b\x67\xa0\x6d\x66\x84\xd1\xac\x4c\xab\x92\xd5\x92\x1a\xde\x78\xec\x95\xf2\x91\xda\x0b\x5b\x62\x64\xf6\x46\xd5\x70\xa2\x79\xa5\x51\x29\xea\x50\xe1\x98\x5e\x2c\x4b\x13\x8e\x11\x42\xcf\x94\xf9\xa6\x6a\x96\x33\xcb\xa5\x48\x54\x7a\x30\x97\x61\xdd\x21\x07\xb6\x76\x45\x87\xfb\xe7\x9e\xa4\xbe\x4c\xf8\xa7\xf3\x6d\x8e\xb9\x14\xe9\xd7\xef\xc3\xa2\xf1\x22\x46\xcf\xae\xdf\xff\xc4\xfc\x01\x41\xf8\x79\xe1\xae\xb3\xa1\x37\x39\xb5\x2e\x76\xdf\x62\x71\xfb\xec\x98\xef\xfa\x16\x5f\xfa\xc2\xe3\x61\xc8\x3f\x07\xc5\x9a\xb1\xf4\x91\xe9\x97\x96\xa0\xa2\xd8\x45\x07\xae\xad\x96\x8e\x66\xa6\x1c\x05\xbc\xf2\xb6\xa9\x7a\xad\xe9\x58\x18\x55\x82\x6a\x65\xb8\x0c\xe5\x2e\x24\x04\xbb\x54\xa4\x37\x16\x63\xf8\x43\x7f\x1d\x16\x55\xc8\x68\xf5\x70\x1d\xb8\x5a\xab\x46\x4f\x85\x82\xf1\xf6\x22\x66\xbe\xce\x42\x43\x86\x75\x59\xcb\x06\xae\xc3\x01\x0b\x03\x82\x72\x09\xda\x01\x04\x8f\xa1\xe5\x60\x44\x60\x68\x23\xda\x25\x78\x8e\xb2\x69\x17\x51\xae\x05\x59\x9e\x03\x04\x76\x68\x16\x03\xde\x61\x0f\x69\x76\xcf\x81\x0b\x79\x0b\x5c\x20\x43\x71\x97\x97\x57\xde\x4b\x49\xc0\x71\x34\x4f\x30\x3c\x97\xc1\x65\x6a\xe2\xe7\x0f\x2c\xee\x81\xa1\x48\xd7\x89\xe5\x95\x0e\x20\x41\x95\xf5\xab\xa8\xea\x75\xde\x8c\x97\xb6\x5c\xe7\x39\x71\x44\xb9\xdd\xb0\xda\x11\x49\x7e\x55\x5c\x4a\x6f\x4a\x79\xc8\xcd\x66\x85\xca\xde\xe6\x4d\x5a\x75\x26\xf9\x7e\xf7\x7d\x13\xb5\x28\x70\xd2\x66\xf4\xa6\xf4\x7a\x5d\xa3\xb1\x9a\xf5\x0d\xc1\x2e\xbb\x55\x3c\x07\x65\xa9\xf8\x26\xbc\x8c\x3b\x3c\xe7\x44\xa0\xdf\x2b\xce\x47\xbd\x36\xad\x78\x2a\x61\xca\xba\x60\x17\x82\xea\xaa\x87\x08\x63\xd4\xb0\x0a\x05\xdd\xeb\x71\x54\x67\xd9\x29\xea\xf3\xba\xc5\x0d\xb5\x5e\x45\xba\x6f\x93\xf4\xa7\xde\x7c\x09\x74\x84\xf4\x09\x74\x6f\x01\x68\x16\x66\x67\xd9\x25\x9f\x7b\x8c\x7e\x26\xfc\x9f\xbd\x9e\xe0\x09\x43\xa7\xcd\xcc\x42\xfe\x59\x43\xf7\x13\x0d\xad\x70\xc2\x5f\x58\x8c\x30\x94\x7a\x92\x39\x69\x10\xe4\xb8\xb5\x29\xb8\x82\xc9\x53\xa4\xb5\xe9\x0a\x8e\x8b\x44\x7b\x15\xad\x45\xda\xad\x32\x85\x8d\x7c\x92\xc0\x27\x64\x93\xc0\x27\xa6\xd7\x85\x36\xeb\x5f\x6d\xe6\x2d\x5d\x3c\xfb\x2d\x4e\xfb\xc2\xe3\xba\xf8\xf3\xbb\x8c\xc6\x57\xd0\xf9\xf5\xff\x6d\x4d\x36\xc9\xb0\x2c\x47\x51\x80\x20\xfe\xfd\xeb\x67\x08\xfa\xe5\x97\xdf\x7e\xfb\xe5\xb7\xdf\x72\xaa\x35\xc5\xbf\xe7\xac\x28\xc2\xf1\x6b\x14\x5b\x71\x94\xfc\xfd\x1a\x8c\xf1\xe6\xbf\x39\x63\x13\xe0\xdf\x73\x92\xa6\xea\x46\x5b\xa8\xa8\xc6\x7f\x73\x3a\x1a\xe2\xa9\xf5\x7b\x2e\x58\xd8\x13\x0f\xfd\x37\xa7\xad\x66\x38\xfc\x3d\xb7\xa5\xf8\xcb\x2f\x42\xdd\x50\xda\x39\x43\x10\xeb\x4a\x4e\x53\xeb\x66\x92\xe2\x2f\xb9\x5c\x2e\x27\xc8\x72\x82\xda\x17\x86\xb9\x66\xbb\xd2\x10\xda\x66\xae\xa6\x98\xb9\x7f\x79\xce\x17\x69\x07\x7e\x18\xbc\x4e\xbd\x41\x68\xed\xd1\xf2\xe4\xef\x8c\xa4\x3e\xa1\x7a\x4e\xf2\x73\x8c\x6f\x4a\xff\x0e\xf8\xbb\x66\x47\x27\x7f\xee\xff\xf7\x8a\x7c\x07\x1f\x7e\xc6\x9b\xe0\xfd\xa7\x17\x45\x0b\x1c\xbe\x66\xd2\xba\xcf\x6c\xcf\x35\x2e\x95\x60\xb9\x8e\x5a\x69\x75\x94\xdc\xbf\x8e\xd5\x7f\xe4\x8e\xf5\xdf\x7f\xef\x5f\x78\x50\x35\xd9\x7c\xd6\x87\x1b\xfe\xd0\x47\xf5\x03\xbc\xef\x0c\xaf\x81\x15\xc6\x1e\xf2\x02\x6b\x96\x68\xc9\xf9\xe2\x8c\x5b\x76\x9e\xc9\xb5\x96\x5e\x11\xeb\xee\x96\x27\xe6\xaf\xe7\xdb\x7e\xa9\x42\xc6\xad\xbf\xc4\xe6\x5a\xfb\xaf\x8a\x76\x53\x03\xfb\x2e\x6d\x6f\x76\xbd\xfd\xbd\x21\x15\x55\x56\x7a\x37\xda\x20\xb5\x15\xc1\x50\xf6\x55\x3f\x53\xc9\x69\xea\xe9\x60\xe8\xe8\x15\xb5\x94\xb3\xe3\x10\xe3\xe4\xe8\xba\x2c\xcd\x7e\x8c\x3d\x2f\xcf\x9e\xce\x7d\x12\x5d\x18\xd7\xf6\xe6\xd5\x42\xc8\x5f\xcc\xe2\xd4\xe2\x1c\x49\x24\x25\xf9\xe4\x34\x7d\x96\x67\x5f\xf9\x47\xee\xf0\xe3\x35\xc2\xf3\x05\x9e\xa1\xaf\x0a\xb3\x37\xaf\x2e\xc6\x8f\x09\x18\xf8\x51\x3c\x08\x71\x74\x56\xce\x04\xb5\xfb\x64\x4d\xbc\xf0\xef\xdc\x4b\x59\x69\x2b\xb9\x24\x8d\x8a\x9e\x53\x35\x63\x87\xeb\xff\xfd\x22\xfa\xd0\x8a\x86\x19\xc8\xbc\x25\x73\x9f\xb0\xc9\xb1\xb2\x7d\xeb\x9c\x3e\xbd\xd9\x0c\x87\x59\x89\x76\x24\x76\x9f\x80\xfb\xfa\x5f\xc4\x3c\x28\xf6\x7c\xe9\x75\x1d\x4f\xb0\x33\x78\x62\x24\x7d\x50\xb8\x4f\xfe\x7d\xdd\x8f\xfe\xfa\x23\x67\x05\xc1\xc4\x43\x7b\xfb\xec\x87\xce\x05\xdc\x7c\xc5\xdb\xc1\xba\x2b\x4f\x21\xe9\x01\xb6\xf7\x02\x9f\x90\x4b\x8a\x8d\x5d\x17\xa3\xd3\xb1\xff\x15\x46\x3c\xe7\x47\xee\xff\x76\x2f\xff\xdf\x25\x61\x3d\x27\x23\x31\x3d\xe7\x6e\x01\xdf\x6d\xc1\x56\xbc\x14\x42\xfb\xc1\x6b\x90\x95\xdc\x07\x5a\x49\xd1\x2f\xcc\x1d\x52\xb5\xe4\x7c\x03\xe2\x75\x76\x0d\x38\xd0\xba\xd0\xa7\x53\x36\x21\x49\xe1\x5c\x23\xfc\x60\xdb\x2b\x87\x7e\xaa\x36\x1c\x84\x3f\xd2\x48\xab\xfc\xeb\x8a\x8e\x0e\xa3\x7d\x87\x9d\xcf\xeb\xfa\x33\xb9\xa4\xc8\xfb\x7f\x3f\xb5\x7e\x67\x25\x4a\xea\x35\x2b\xb1\xbe\xd0\xbc\xd3\x3c\x9f\x11\x30\xde\x7f\x92\xf8\x99\xcf\x7a\xa4\x91\xbe\x4b\xde\xea\x7e\x71\xe8\x6c\x99\xd8\x56\xf4\xe0\x7c\xe1\xac\xc0\x5f\x89\x9d\x48\xee\xe0\x13\x39\x93\x75\x6f\x0a\xe8\xbb\xee\x13\xa0\xf5\x95\xd4\x5d\xc2\xed\x6a\x5e\x13\x6d\x27\x3b\x0e\x33\x53\xdf\x09\xbd\x5b\x42\x9e\x54\xbf\x47\xd2\x6c\xf4\xf8\x89\xda\xbd\x52\xde\xd4\x66\x36\xb2\xdd\x25\xd3\x75\x59\xde\x25\x9e\xf8\xfe\x78\x11\x3c\x27\xd1\x67\x5a\x77\x7f\xd1\xbd\x03\x72\x41\xbe\xc0\xf2\xc2\xd7\xd8\x9b\xe2\x4c\x24\x3c\xa5\x76\xdf\xb8\x3d\x08\xf8\x23\x77\x2a\xf2\x8f\xdc\xc1\xc4\xa3\x89\x1f\x61\xe7\xd5\x8a\x2f\x34\x22\x03\xbb\x7d\xa0\x73\x4b\xe2\x07\x67\x47\x5b\xaa\x99\x69\xf7\x01\xc5\xde\xd4\x9b\x37\x73\xf0\xfa\xf5\x64\xca\x11\xbd\xfa\xb3\x57\xcb\x71\x42\x1c\x45\xcf\x2a\xf4\x26\x83\x4f\x8e\xf3\xa1\xf8\xc4\x55\xdd\x57\x7c\x40\xf6\xe7\xfb\xc1\x35\xda\xb7\x25\x3e\x33\xca\x3e\x13\x3c\xcc\xc2\xb7\xf4\xe2\x4d\x90\x3e\x28\x72\x95\xea\xcd\x69\xff\xb6\xd2\x0d\x41\x0f\x73\xa8\x2d\xc9\x8f\x4e\x94\x91\xb4\xe7\x48\xdf\x9c\xbe\xdd\xdb\x93\x13\xc4\xb3\xee\x0c\x9f\x48\xa7\x99\x6f\x5e\x26\x37\x0d\xfc\x70\x6b\xf8\x96\x38\x8c\x3c\x7f\x96\xbd\xa2\x4f\x39\xdc\x16\xff\xe4\x85\xfb\x1b\x73\x30\x3d\xf7\x07\x39\x52\xe8\x3f\xc1\xe3\x66\x4b\x12\x75\xef\x6f\x44\x10\xe2\xa5\xe7\x2f\xa2\xbf\xa4\x35\xe7\x98\xdd\x6c\xd6\xb9\x97\xee\x6f\xdf\x7b\x10\xe5\xdb\xda\xf4\xce\xe0\x66\x3b\x2e\x86\x1f\x3f\x93\xfe\xc0\xdb\x6f\x19\xda\xa7\xd4\xcf\x3a\xc0\x8f\x0e\xf0\xcf\x44\x3f\xbb\x50\x19\x8d\xf0\x6b\x2c\xee\x69\xc3\x0d\xbf\xee\x2a\xb3\xec\xe0\xeb\x2b\xe1\xbb\x64\xbf\x0d\x62\x49\x67\xfb\x3b\xba\xcd\x57\xfa\xa9\x5d\xfd\xdd\x24\xee\x03\xc8\xdf\x23\x8c\xaf\xb6\xef\x8f\x53\x6b\xf9\x0a\xcd\x9b\x53\x84\x7f\xfd\xcb\xc1\xb1\xe5\x4d\xa2\xdc\x6f\xff\xfb\x5f\xee\xd7\xc8\x9f\x38\x89\xe5\xcd\x5f\x7f\xff\x3d\xc6\xeb\xf8\xdf\xff\xfe\x91\xbb\x5c\x11\xf9\xce\x7d\x15\xf7\x8b\x23\x97\xab\xda\xfe\x62\x30\x8c\xef\x62\xff\xa9\xea\x75\x01\x3e\x55\x3d\x11\xe1\x3d\x28\xbe\xeb\x64\xb9\x3f\x72\x14\x75\x77\x66\x80\xe7\xbc\xba\x89\x75\xbb\x62\xed\xaf\xc9\x0f\x38\xb0\xcd\x15\xb5\xb6\x52\x29\xa9\x1f\x6b\x72\xb9\xb6\x52\x54\xda\x8a\x2a\x29\xfa\xc9\x32\xd5\xae\x54\x53\x73\x9d\xa6\xbc\xed\x32\x6d\x45\x37\xda\x15\xc9\xd8\xfe\x93\xac\xd4\x15\x43\xc9\x49\x82\x2e\x09\xb2\x72\x65\x61\x73\xeb\x77\x7c\xfe\xf3\xf5\x24\x14\x93\x9d\x32\x3e\xf3\xb9\xb1\x6a\x79\x49\x92\xcf\xfa\x39\x0d\x1b\x9d\x55\xd6\x61\xa2\x7f\x63\x89\xf7\xa2\x26\x0e\xae\xec\x4f\xd7\x43\x52\x8e\x73\x5a\x78\x8f\x12\x5c\xef\x30\x8f\x69\xe0\x6b\x50\xe9\x27\xaa\xe1\x82\x30\x9f\x75\x71\x26\x0c\x96\x6d\xa7\x38\x0d\x71\xfc\x1d\x14\x72\xb9\x6b\x7c\x89\x21\xdd\xdb\x3b\x9a\xfb\x85\x4b\xbd\x55\xcf\x39\x56\x6c\x6d\xbb\x58\xce\x59\x4c\x83\x1c\xf2\xa7\xc1\x04\xc7\x78\xd7\x86\xff\x1f\x00\x00\xff\xff\xc6\x0d\x7d\x47\xb8\x99\x04\x00") +var _kahunaHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x79\x6f\x22\xcb\xd9\xef\xff\xf9\x14\xe8\x28\x92\x13\x31\x39\xd4\xbe\x4c\x6e\xae\xd4\x40\xb3\x77\x03\xcd\x4e\x14\x59\xbd\x54\x43\xb3\x35\xfb\xf6\xea\x7e\xf7\x2b\x16\xdb\xd8\x06\x8c\x3d\xf6\x24\x39\xf3\x5a\x27\x11\x43\x55\xd7\xb3\xd4\xf3\xab\x67\xa9\xaa\xe6\x6f\x7f\xfb\xd3\xdf\xfe\x16\x29\x85\xb3\x79\x67\xaa\x2a\xe5\x42\xc4\xb3\xe7\xb6\x63\xcf\x54\xc4\x5b\x0c\xc7\x7f\xfa\xdb\xdf\xfe\xb4\x6b\x4f\x2e\x86\x63\xe5\x45\xfc\x69\x38\x7c\xea\xb0\x54\xd3\x59\x10\x8e\x22\xf2\x77\xf6\x3b\x3c\xe9\xe5\x6c\x22\xe3\xce\xfd\xee\xf1\x17\x5d\xfe\x54\xd1\xab\x91\xd9\xdc\x9e\xab\xa1\x1a\xcd\xef\xe7\xc1\x50\x85\x8b\x79\xe4\x1f\x11\xf0\xf7\x7d\xd3\x20\x74\xfb\xaf\xbf\x75\x07\xc1\xae\xb7\x1a\xb9\xa1\x17\x8c\x3a\x91\x7f\x44\xee\x6a\xd5\x94\xb8\xfb\xfb\xc3\x70\x23\xcf\x9e\x7a\xf7\x6e\x38\xf2\xc3\xe9\x30\x18\x75\xee\x67\xf3\x69\x30\xea\xcc\x22\xff\x88\x84\xa3\xe3\x18\x5d\xe5\xf6\xef\xfd\xc5\xc8\x9d\x07\xe1\xe8\xde\x09\xbd\x40\xed\xda\x7d\x7b\x30\x53\xcf\xc8\x0c\x83\xd1\xfd\x50\xcd\x66\x76\x67\xdf\x61\x65\x4f\x47\xc1\xa8\xf3\xf7\x23\xef\xca\x9e\xba\xdd\xfb\xb1\x3d\xef\x46\xfe\x11\x19\x2f\x9c\x41\xe0\x7e\xdb\x09\xeb\xda\x73\x7b\x10\xee\xba\x69\x85\xaa\x6e\x45\xaa\x5a\xbc\xa0\x47\xb2\xa9\x88\xde\xcc\x56\xaa\x95\x48\xd1\x2c\xb4\x8e\xfd\x7f\xef\x06\xb3\x79\x38\xdd\xdc\xcf\xa7\xb6\xa7\x66\x91\xa4\x55\x2c\x45\x12\x45\xb3\x52\xb5\xb4\xac\x59\x3d\x79\xe8\x79\xc7\x7b\x37\x5c\x8c\xe6\x6a\x7a\x6f\xcf\x66\x6a\x7e\x1f\x78\xf7\x7e\x5f\x6d\xfe\xfe\x33\x08\xba\xfb\x4f\x3f\x83\xe4\xce\xae\x7e\x9e\x80\x07\x6a\xef\x97\xee\xc0\xe0\xce\x90\xaf\x11\x3b\xe9\xf5\x34\xf8\xbe\x7b\xd6\x4c\xea\xcd\x93\x9e\xc7\x61\xf7\x5c\xdd\x2b\xdf\x57\xee\x7c\x76\xef\x6c\xee\xc3\xa9\xa7\xa6\xf7\x4e\x18\xf6\xaf\x3f\x18\x8c\x3c\xb5\xbe\x3f\x11\x6e\x34\xb3\xf7\x86\x3e\xbb\x0f\x47\xf7\x81\xf7\x9e\xa7\xc3\xb1\x9a\xda\x8f\xcf\xce\x37\x63\xf5\x03\x4f\x3f\x71\xf2\x43\x5c\xbc\xef\xd9\x81\xf2\x3a\x6a\xba\x7f\x70\xa6\x26\x0b\x35\x72\xdf\x25\xc2\xc9\xe3\xe3\xa9\x5a\x06\xe1\x62\x76\xfc\xee\xbe\x6b\xcf\xba\x1f\x1c\xea\xc7\x47\x08\x86\xe3\x70\xba\x83\xe3\x71\x4d\xfd\xe8\x30\x1f\xd5\xa5\x3b\x08\x67\xca\xbb\xb7\xe7\xef\x79\xfe\xc1\x98\x3f\x60\x4a\x47\x5c\x7e\x80\xe9\xd3\x27\x6d\xcf\x9b\xaa\xd9\xec\xfa\xe3\xdd\xf9\xd4\xdb\xfb\x9d\xfb\x41\x18\xf6\x17\xe3\x1b\x7a\x8f\xdf\x62\xe9\xd0\xcb\x0e\xa6\xef\x1c\xf8\x61\xd1\xbd\xf9\x81\xdd\x3a\xe1\xfb\x6a\x7a\x5b\xd7\x87\xe1\x3f\xf0\xc8\x51\xad\xb7\x3d\xb4\x5f\x5a\xdf\x41\xe4\x74\x29\x7e\xeb\x89\xf1\xee\x81\xee\xfc\xcd\x19\x98\x3d\x5b\x80\x9c\xcd\x9b\x66\xd4\x7d\x44\xfa\x2d\x9d\xc3\x03\x1f\xe1\x9b\x1d\x83\xd9\xfc\x7e\xbe\xbe\x1f\xbf\x3d\xe4\xae\x67\x38\xbe\xb5\xa7\xba\xb5\xdb\x83\x2b\xb9\xde\xd9\x79\x80\xfb\x9b\xdd\xde\x5e\xc5\x9c\xcd\x6d\x93\x79\xf0\x91\x3b\x6d\xcf\x66\x8b\xb7\x28\x3f\x76\x76\x43\x4f\xbd\x33\x2e\x78\x34\x83\xb1\x3d\x9d\x07\x6e\x30\xb6\x47\x57\x9d\xf7\x5b\x8f\xde\x8f\xdf\x19\x9b\x3c\x7a\xb4\xf7\x72\x70\xfe\xc1\x77\xd3\xdf\x2b\xef\x16\x7a\x87\x8e\x5f\x3e\xfe\x61\x32\x77\x33\x79\xfc\xb8\xf3\x0f\x0f\xa1\xdf\xde\x18\xee\x6f\xe4\xa0\x13\x4e\xc7\xf7\xc3\xa0\x73\x0c\x18\xae\xb0\xf0\xa2\xe7\xcd\x32\xbe\x3f\xde\xbb\x36\xf2\xad\xc6\x79\x78\x3a\x51\x2c\xd4\x0c\x33\x12\x78\x07\xca\x49\x3d\xa5\xd5\x0a\xd5\x1b\xc7\xbe\x60\x74\x9f\x30\xf2\x71\xba\xaf\x8f\xb4\xff\xd7\xed\xe2\x3f\x78\xe9\x8a\x5e\xae\xe9\x66\xe2\x03\x3a\xdb\xc5\xd9\x33\x35\x79\x37\xe5\x67\x83\xdc\xfc\xb4\xa7\x6e\xec\xfb\x14\xcd\xde\x2c\xe1\x05\xd4\xbf\x47\xbe\xf3\x43\xdc\xf6\xec\x31\xee\xbb\xad\xf3\x31\xc8\xbb\x59\xb6\xe3\x0a\xf0\x1e\x59\x0e\x8f\xdc\xd8\xf7\x18\xfe\xdd\xce\xcf\x43\xbc\x78\x0b\x47\x2f\xd6\x90\xeb\x9d\x4f\x96\x84\x63\x47\x2d\x9d\xb6\xf4\xb4\x56\x3d\xd3\x79\x18\xec\x32\x8e\xc0\x55\x7f\x19\x2d\x86\x6a\x1a\xb8\xff\xfc\xd7\x5f\x6f\x78\xca\x5e\x7f\xe0\xa9\x81\x3d\x9b\xff\xc5\x1e\x6d\xd4\x60\x5f\x8a\xb9\xe1\x09\x3f\x98\x9e\x7d\x24\x55\x33\x13\xd5\x6c\xd1\xbc\x22\xcf\xbd\xdd\xe9\x3c\x71\xf7\x2d\xf2\x8a\xd1\x2b\x63\x3c\x48\xf7\x03\x63\xec\x64\xdd\x3f\xfe\xc4\xfc\xb7\xc8\x7b\x04\xd9\x8b\x7e\xc3\x08\x7a\xb3\xaa\x9b\x95\x17\x43\x0c\xc6\x9d\xd9\x64\xf0\x60\x8b\x89\x8c\x6e\x68\xaf\x28\xfc\xfd\x4f\x87\x2a\x9c\x69\x0f\xd5\xf7\x87\xef\x22\xd5\xcd\x58\x7d\x3f\x3e\xf2\xf7\x48\xc5\xed\xaa\xa1\xfd\x3d\xf2\xb7\xbf\x47\x8a\xab\x91\x9a\x7e\x8f\xfc\x6d\x5f\x9c\x4b\x58\xfa\x6e\xbe\x8e\x23\x3f\x8c\xf7\xa7\x67\x23\x3e\x6f\x3c\x0e\x9c\x28\x1a\x86\x6e\x56\xaf\x8c\x7c\xe8\x10\x29\x9a\xcf\x07\x88\x64\x2b\x91\xbb\x87\xb2\xdb\xc3\x77\xb3\xfd\x20\x77\x2f\x29\x3f\x88\x7f\xa4\xf9\xa8\xa1\x37\xe5\x79\xa6\x4b\xb3\x58\x7d\xa1\xcf\x48\x23\x5b\xcd\x3c\xb2\x75\x5a\x7f\x7b\x46\xfe\x69\x94\x17\x8c\xbc\x47\xf8\x57\x83\xec\x15\x50\x2a\xc4\xc6\x9d\x4a\xb9\x10\x19\x4f\x43\x57\x79\x8b\xa9\x3d\x88\x0c\xec\x51\x67\x61\x77\xd4\x5e\x0d\x37\xd6\x0b\x4f\xd9\x7d\xdb\xd0\x8e\xec\x3f\xd8\xea\x13\xff\x0f\x73\x7b\x4e\x97\x8f\x96\xfd\xe6\xf8\x11\x4b\xaf\xd6\x2c\xb3\x72\xf2\xdd\x9f\x22\x91\x48\xa4\xa0\x99\xe9\x9a\x96\xd6\x23\x7b\xe9\x0d\xa3\x76\x58\xef\x2a\x55\x2b\x9b\xa8\xee\x7b\x68\x95\xc8\x9f\xef\xff\x1c\xa9\xe8\x05\x3d\x51\x8d\xfc\x19\xee\xfe\xf5\x72\x36\xde\x04\xe2\x8f\x49\xf7\xd6\xf0\x9f\x26\x1c\x3a\x27\xdc\x2d\x2b\xd5\x8f\xc9\x77\x03\x85\x47\x11\x1f\xbf\xfa\x90\x84\x7f\xf9\x53\x24\x92\xd0\x2a\x7a\xa4\x91\xd1\xcd\xc8\x9f\xe1\x3f\xe1\xbf\x62\x7f\x86\xff\x44\xff\xfa\xbf\x7f\x46\xfb\xcf\xe8\x9f\xe8\x5f\x91\xea\xa1\x31\xa2\x17\x2a\xfa\x4e\x29\xba\x99\xfc\xeb\x59\xcd\xdc\xe0\x07\x7e\x50\x33\x6f\x53\xf8\x6a\xcd\xfc\x9f\x8f\x68\xe6\xb5\x4f\x3d\xea\xe1\xd1\x0f\xdf\xa6\x88\x27\xb7\xfd\x6a\xc4\x3d\xc7\x91\x48\x65\xa7\xab\xc8\x3f\x9e\x56\x80\x6f\x87\xaf\xab\xad\x92\x1e\xf9\xc7\x29\x22\xfe\x7a\x0e\xb5\x9f\xca\xe3\xcb\x01\x5f\xb0\xf8\x00\xe3\xdb\x39\x3c\x1b\x02\xfd\x28\x97\xe7\x06\x7d\xc1\xe9\x33\x40\x3e\x67\xf7\xc9\xca\x5e\x73\x7b\x2e\xcc\xfb\x61\x6e\xcf\x0c\xfa\x92\xdb\x53\x90\x5c\xe5\x76\xe7\xb9\x3c\xe5\xdb\x8b\xc1\xfc\x7e\x6e\x3b\x03\x35\x1b\xdb\xae\x8a\xfc\x23\x72\x77\xf7\xf7\xe7\xad\xab\x60\xde\xbd\x0f\x03\xef\x64\x2b\xed\x99\xac\xa7\xf1\xef\x51\xc4\x3d\xc0\x6e\x13\xef\x80\xc5\xd3\xe4\xfb\x20\x51\xe0\x45\x9c\xa0\x13\x8c\xe6\xfb\xc0\xc0\xac\x15\x0a\x07\x71\xec\xe1\x2e\x8c\x8f\xb8\x5d\x7b\x6a\xbb\x73\x35\x8d\x2c\xed\xe9\x26\x18\x75\x5e\x74\x1b\x2d\x86\x8f\x21\x7f\x24\x18\xcd\x55\x47\x4d\x5f\x74\xf1\x07\x76\x67\x16\x99\x0d\xed\xc1\xe0\x35\x99\x79\x38\x1c\xbc\x26\xf2\x17\x44\xe9\x5f\x1f\x7b\xbe\x9e\xf6\x97\x79\xc3\x47\xd5\xf1\xb2\xda\xf1\xa8\x92\xb9\x5a\xbf\x52\xc8\x78\x3c\x08\xf6\x35\xfb\xc8\x3c\x18\xaa\xd9\xdc\x1e\x8e\x23\xbb\x39\xdb\xff\x33\xb2\x0d\x47\xea\x35\xa3\x97\xb2\xa2\x87\x78\xf4\x98\x4e\xdd\xc6\xf3\x63\xf2\x75\x61\xd4\xa3\x19\x6a\x56\xf5\x10\xd1\xc1\xfd\x17\x59\x33\x61\xe9\xfb\xf0\x2b\xde\x3a\x7e\x65\x16\x23\x46\xd6\xac\x6b\x85\x9a\xfe\xf8\x6f\xad\xf9\xf4\xef\x84\x96\xc8\xe8\x11\xf8\x96\x30\x1f\x56\xfb\xcb\x81\x5e\x99\xe2\xb1\xe8\x11\x19\xa9\xf5\x7c\x69\x0f\xfe\x72\x77\x41\xe2\xbb\xef\xdf\xa7\xaa\xe3\x0e\xec\xd9\xec\xaf\x2f\xa7\xeb\xb0\x57\x71\xc6\xb6\x18\xf9\xeb\x95\x89\x3a\xe4\xc6\x3f\x2c\xd9\xa1\xa2\xf3\x28\xd7\x79\x64\x3c\xd5\xea\xce\xb3\x79\xb6\xbb\x1b\x7a\xe7\xba\x43\x74\xbe\xfb\xa1\xfc\x77\xe6\x01\xca\xae\x21\xec\x7c\x79\xe1\x93\xcc\xf6\x74\xcc\x9f\x66\xb4\xd7\x04\x89\x14\x1b\xa6\x9e\x8c\xc4\x5b\x6f\x48\x74\xa8\xd0\x5d\x17\xe8\x71\xac\x17\xcd\xbf\x07\xde\x25\xde\x1e\x6a\x3e\x3f\x6a\x75\xc7\x71\x8e\x66\xf7\x02\x33\xf7\x97\x56\xfa\xd7\x25\xae\x4b\x3d\x7f\xdb\x6f\x7c\xfc\x76\xc1\x9a\xf7\x76\x7c\xbe\xc9\x53\x73\x3b\x18\xcc\x22\xbd\x59\x38\x72\x2e\x1b\xdb\x43\xa1\xec\x47\xf5\x70\x1c\xe7\xa8\x87\x87\x7d\xeb\x0b\xbc\x9d\x6c\x26\xdf\x84\xc2\x73\xfb\xd8\xe7\x1f\x3c\xaa\xe5\xa4\x32\xba\x9f\x88\x47\x3e\x1e\x56\x39\xf0\x82\xc2\xd3\x44\xdc\xd6\xff\x71\x33\xf9\x85\x63\x0a\x17\xf3\x27\xdf\xf4\xf2\x99\xa9\xb2\xe7\x6f\x3e\x74\xe8\xbb\x18\x7b\x37\xf7\x7d\x34\x9d\xe3\x3f\x5f\xec\xb3\xbf\x92\x05\xbe\x8a\x07\xe6\xf6\xe0\xde\x0d\x83\xd1\xec\xbc\x0d\xfa\x4a\xdd\x8f\xc3\x70\x70\xbe\x75\xbf\xf3\xe9\xab\x4b\x73\xbd\x6f\x9e\xaa\x99\x9a\x2e\x2f\x75\xd9\xc5\xa1\xf3\xf5\xfd\x3e\x4c\x0a\xb6\x97\x7a\x8d\xa7\xe1\x3c\x74\xc3\xc1\x45\xb9\x5e\xce\xd1\x83\xb1\x28\xdb\x53\xd3\x7d\x78\x71\xf8\x7e\xb6\x70\x5d\x35\x9b\xf9\x8b\xc1\xfd\x45\x43\x39\x0a\x6e\x07\x03\xe5\xbd\xd5\xeb\xc8\xfa\x05\x13\xba\x0c\xbd\x0b\xf5\xed\x1f\x45\xe2\x85\x3d\x93\x37\xfc\xe2\xed\x2b\xd2\xdb\x6b\xdc\x7b\x45\xfe\x5c\x57\x77\x95\xc6\xcf\x72\x7d\xef\x12\xf4\x07\x5d\xe1\x55\x5a\xaf\x5d\xe3\xf9\xee\x57\x5c\xe5\xc9\xee\xcf\xa7\xd9\xe6\x5b\xa9\xd0\xf3\x93\x57\x17\xd2\xa5\x5d\x76\xe0\x1e\x44\xd9\x7b\xc9\x1f\x74\x92\xc7\xd5\x21\x5c\x4c\xdd\xc7\xa3\x1c\x17\xdc\xd3\xc3\x92\x73\x77\xf7\xfd\xfb\xe5\x74\xed\x32\x0e\x8e\x9b\x6f\x3f\xaa\xce\xe3\x79\xc1\xbf\x7c\x6a\x4c\x71\x5c\x36\x3f\xe2\xe1\xf6\xe7\x65\x2e\x92\x7d\x71\x5a\xf1\x5a\xa7\xe3\x01\xca\x6b\x5d\x0e\xb9\xf2\xd9\x0e\xaf\xcf\x7d\xbe\xd1\xef\x2a\xb9\xc7\x5e\x57\x28\xee\x59\x0a\x66\xf7\x33\x35\x18\xa8\x69\xc4\x09\xc3\x81\xb2\x47\x0f\x7e\x2b\x70\xd5\xfd\xe8\x99\x8f\x3e\x7c\xf7\xdc\x6f\x3f\x9d\x38\xba\x7f\xe1\xd1\x9f\x9d\x79\x7a\xd9\x78\xb2\x95\x7f\xf6\x74\xe8\x9e\xeb\xfb\xfd\xf9\xe1\x48\x22\xa3\x27\xf2\x91\xbf\xfc\xe5\x54\x83\xff\x37\x02\xfe\xfa\xd7\xb7\x86\x3a\xf7\xf8\x83\xd2\xfe\xcf\x2b\x3d\xde\x30\xde\x33\x9d\xbe\x18\xfe\x85\xc2\xf7\x0c\x5e\x85\xd2\xf9\x5d\xf0\x4f\x00\xd7\xf9\x73\x0d\x37\x7a\xd2\x5b\x96\xb0\x1f\xf1\xa5\x6f\x9d\x21\xf8\x1c\x6f\xfa\x06\x95\x9f\xe5\x4f\xdf\x29\xec\x0f\x7a\xd4\x37\xa8\xbd\xf6\xa9\x97\x1e\xb8\xe2\x55\x9f\x9d\x1b\xf9\x44\x5b\x7d\xb0\xcf\x53\x96\x6e\x4e\xb4\x8e\x6b\xff\x1b\xe9\xdb\xad\x8e\xf7\xba\x0f\x3d\xdb\xf7\x89\xf4\x59\xbc\xec\x32\x85\xcb\xa9\xc6\xa5\x24\xee\xdf\x92\x86\xcd\xd7\xf7\x6a\xb4\x54\x83\x70\xac\xce\x95\x36\xe7\xeb\x5d\x52\xb4\x18\xcc\x2f\x34\x0e\xd5\xdc\xbe\xd0\xb4\x4b\xc7\x2e\x35\xcf\x82\xce\xc8\x9e\x2f\xa6\xea\x5c\x15\x4e\xb2\xbf\xfe\xf3\x5f\x4f\xb1\xcb\xff\xfc\xbf\x73\xd1\xcb\x3f\xff\xf5\x52\xe7\x6a\x18\x5e\x28\x98\x3d\x8d\x35\x0a\x47\xea\x6a\x2c\xf4\x34\xd6\xeb\x61\x8e\x92\x05\x43\x75\xef\x84\x8b\x91\xb7\xaf\x6a\x8b\xa9\x3d\xea\xa8\x97\x19\xdb\x73\xd7\xba\xd3\xc4\x6e\xb4\x8e\x7a\x91\x02\x8f\x46\x6a\x7a\x7f\x1b\x02\x9e\x46\xba\x6a\xae\xa7\x03\xbf\xad\xe4\x63\xa1\x5e\xad\xee\x1f\x2c\xf6\xc0\xde\x5b\x45\xbf\x48\xe0\x3d\xac\x05\x0f\x87\xd0\x6e\x59\xc0\x0e\x8b\xc1\xfe\xc4\xdf\x1b\xe7\xdb\x2a\x7a\xf5\x4a\xa5\xf7\xb4\xa6\x76\x5a\xe7\x7d\x5f\x96\xf3\x79\x42\xdc\x78\xfc\xef\xaa\x50\x57\xb3\xa3\x5b\x84\xbc\x18\x07\x7c\x9a\x98\x37\x9f\xa0\xbc\x2a\xe8\x1b\x4e\xeb\xbc\xa8\x49\x7b\x6e\x47\xfc\x70\xfa\xc6\x7e\x57\x24\xa9\x55\xb5\x37\xc4\xcb\x9a\x15\xdd\xaa\x46\xb2\x66\xb5\xf8\x6c\xcf\x6b\xef\xe3\x2b\x91\xbf\xc0\x6f\x91\x3b\x04\x8e\x7f\x77\xdf\x22\xf0\x5b\x04\x7c\x8b\xdc\xdd\xfd\xf5\xef\x6f\x3e\x8a\xbe\x45\xee\xde\xf9\x08\x3e\x3e\x02\xbe\x45\xf0\x8d\x8f\x90\x6f\x91\x3b\x0c\x3e\xc6\x21\x7d\xe2\xf0\x56\x72\xec\x5b\xe4\x0e\x9e\xa7\x76\x61\x76\xae\x6d\xc1\xbd\x77\x86\x5e\x6e\xc3\x3d\x70\x75\x07\xef\x83\x51\x30\x0f\xec\xc1\xfd\xe1\x48\xd4\xef\xb3\xc9\xe0\x6e\x3f\x75\x50\xfe\x0d\xb0\xbf\x01\x1c\x81\xe2\x3b\x12\xdf\x09\xff\x1d\x60\x44\x24\x8b\x02\xf4\x52\xde\x8b\xa3\xa3\xfb\xc3\x55\x97\x67\x06\xea\x6c\xee\xe7\x61\xe0\x5d\xa7\x24\x19\xe5\xef\xa1\x84\xef\x17\x33\xf5\x18\x4e\xdc\x07\xa3\x57\xd7\x6b\xae\xd2\x23\x04\x10\xf1\x1e\x7a\xe4\xde\xf6\xbc\xfb\x97\x45\xca\xab\x34\x28\xa1\x18\xbd\x87\x06\xbd\x3f\x04\x2f\x0f\x69\xd4\x7e\x73\xfb\x2a\x09\x86\x01\x7a\x97\x18\xec\x81\xc4\xd1\x19\xdc\x40\x42\x10\x48\xdf\x43\x82\xdf\x0f\x43\x2f\xf0\x37\xb7\x4b\x21\x20\x43\xef\x22\x21\x9e\x49\x71\x3c\xd3\x7e\x03\x1d\x4e\x18\x7e\x1f\x9d\xdd\xa4\xdb\x9d\xce\x54\x75\xec\x79\x38\xbd\x6e\x53\x12\x40\x20\xdf\x33\xbc\xdc\x0f\x7f\x28\x60\xdf\xaf\xbd\xe9\xf5\xd1\x11\x87\xef\x9a\x6a\x08\xf6\xc3\x1f\x67\x61\x5f\x92\xb8\x4e\x80\x4a\xfe\x2e\xed\x40\x78\x4a\xe0\x31\xc7\xdd\x2d\x00\xd7\x09\x49\x26\xdf\x27\x09\x7a\x36\xd1\xc7\xaa\xc2\xe1\x16\xf5\x35\x4a\x10\x70\x4a\xde\x35\x23\x10\x1f\xc4\x79\xac\xc5\x5c\x9d\x71\x08\x11\x67\xef\x93\x84\xdc\xfb\xc1\xfa\xe1\x46\x49\x38\x1c\xdc\xfb\x81\x1a\x5c\x5d\x1a\x21\xa4\x10\xbe\x6b\x11\x86\xf4\x61\x23\xed\x61\x83\x63\xfd\x86\x18\x8c\xbf\x6f\x99\x87\xec\x3e\x18\x75\xd4\x6c\x7e\xff\x7a\x0b\xe5\x0d\x52\x5c\x8a\xf7\xcd\x08\x7f\x16\xf9\xec\xf7\xaa\xec\xeb\xce\x04\x22\x00\x30\x39\x12\xb9\xe0\x6b\xaf\x1e\xbc\x78\xaf\xb3\x7d\x75\xf8\xe2\x34\x26\x4a\x27\xca\xed\x12\xce\xd6\x78\xb3\xc6\xf4\x1c\xc3\xb9\x76\x33\x9f\x28\x17\x5b\x55\x64\x99\x4d\x13\x67\xe2\x34\x61\x66\x74\xd3\xac\xe9\xb5\x4c\xc5\xd0\x48\xbd\x96\xcb\xe5\x2a\xba\xf9\x52\x43\x17\x89\xec\xa2\xa7\x74\xdc\x2a\xb5\x32\xd9\x02\x4a\x64\x71\xca\x2c\x93\x78\xb3\x90\x32\xcc\x64\x21\x95\xab\x99\xa5\x1a\xca\xb4\x70\xdb\x48\x55\x32\x45\xb3\x96\xd0\x8b\x5a\xa5\xc1\xcb\x09\x5e\x6c\xa2\xcc\xcd\x44\x76\x51\x4f\x5a\x33\x53\xed\xa4\x15\x4f\x98\xd5\x5a\x33\x5b\x4c\x26\x72\x7a\xcb\xd0\x12\x25\x23\x51\x69\xeb\x75\x9d\x34\xda\xe9\x36\x4e\xb4\x93\x6d\x5c\x42\x95\x66\x9e\xe4\x33\x9c\x66\xf3\xac\x75\x33\x11\xb2\x27\x92\xc8\x95\x74\xd2\xaa\x59\x08\xd5\x4b\x24\x61\xa0\x78\x32\x95\xd4\x32\x2d\x9c\x2c\xe8\x29\x9c\xe1\xa6\x6e\xe6\x6b\x65\x8a\x93\x55\x5a\xd5\xb3\x28\xad\x65\xaa\xd4\x24\xcd\x9b\x89\xd0\x3d\x91\x56\x25\x61\xe4\xcb\x2d\xa6\xb7\x0a\xcd\x62\xa9\x5a\x65\xb9\x52\xa9\xd8\x4c\x1a\x75\x33\xde\xc8\x56\x4b\xd5\x4a\x3b\x5b\x6f\x34\x48\xa1\xa1\x59\xf5\x78\xb1\x9a\xa1\x56\xb5\xa0\x25\x6f\x26\xb2\x0b\xfe\xd2\x49\x8b\xe2\x86\xa6\x67\xf3\xc5\x1a\x6e\xe7\x4d\x4c\x12\x95\x8c\xd6\xc8\xf0\x4c\x9d\xe5\x19\x4e\xc4\x73\x56\xad\xda\xa8\x25\xe3\xa9\x8a\xd1\xe2\x96\x55\xce\xe3\x4a\x29\x5f\xac\xdc\x4c\x84\xef\xad\x2b\x53\x6a\xa6\xeb\xc9\x7c\x29\x45\xf3\x55\x92\x30\xb5\x2a\x6f\x72\x5e\x6c\xb6\xda\xbc\x55\xd7\x49\x2e\x93\x4f\x25\x6b\x99\x44\x3a\x51\x6f\x24\x0a\x24\x4f\x4a\x65\xc6\xf3\xf9\xf6\xcd\x44\xc4\x5e\x12\x52\x31\x8a\x3a\xae\x97\x2a\x29\xde\xb6\x70\xa2\xaa\x97\x71\x89\xd6\xcc\x6a\xdc\xd0\x73\x49\x0d\xa5\x0b\xcd\x6a\xc6\xe2\x86\xa1\x59\x9a\x99\xcf\xe7\x92\x6d\x6e\x95\xd2\xa9\x9b\x89\xc8\xbd\x24\xf5\x06\x2d\x24\xac\x76\xaa\xc4\x4b\xba\xd9\xac\x6a\xe9\x62\x3d\x5b\x6e\x6a\xc9\xa4\x59\x6b\x36\xdb\xb9\x84\x99\x4f\x91\x7a\x39\x8e\xb2\x79\xde\x40\x85\x52\xae\x91\xe2\xb8\x96\xbe\x99\x08\x04\x7b\x2a\xb9\x7c\xae\x59\xca\xc7\x53\xd9\x4c\xb1\x88\x09\xa5\x8d\x66\x23\x4d\x13\xc9\x78\xbb\x59\x36\x5b\x29\xcb\x4a\x67\x13\x2d\xa3\x54\x2b\x63\x9a\x28\x95\x49\xa3\x5e\xc1\xf9\x76\xe1\x1d\x54\x0e\x98\xcf\xa6\x52\x56\x39\x9f\x31\x32\x2c\x97\xe4\x89\x3c\x2d\x66\x49\xb3\x9e\x68\x25\x0c\xd3\x32\x53\xac\xd4\xd2\x78\xae\x9a\xb0\x70\xaa\x94\x29\xe5\xda\xe5\x6a\xab\x95\x8a\x53\xfd\xf6\xa9\x87\x07\xd0\xb3\xb4\x89\x0b\xb9\x5a\x83\xe5\x5a\x16\xd7\x93\xc5\x1c\xe1\xf5\x78\x86\x27\x09\x35\x48\xae\x91\x69\xa6\xf3\xac\x90\xc9\x59\x9a\x9e\xa5\xb9\x78\xc5\x44\xc9\x78\xb9\xc5\xcb\xb7\x53\xd9\xa3\x3e\x5e\xcc\xf3\x78\xb1\x56\x29\x36\x4a\x99\xb8\x66\xc6\x5b\x06\x33\xb2\x56\xab\x9d\xcb\x26\xb3\xa5\x5a\x2b\x57\x6a\x66\xaa\x19\x2d\x99\xe2\xb4\xa6\xd7\xb3\xf5\x56\x23\x93\x29\x9a\xe5\xc4\xed\x54\xf6\xb0\x8f\xa3\x72\xb6\x55\x45\x59\xad\x96\x32\xac\x66\xbe\x50\x29\x14\x4a\x96\x9e\x48\xb0\x62\xa2\x98\xce\x19\x5a\xb2\x52\xaa\x5a\x79\x5e\x4d\x9b\x55\x54\x49\x59\xa8\x95\x6e\x24\x35\xeb\x76\x44\xc2\x03\xee\x9b\x46\x8a\xe0\x6a\xba\x9d\x69\xe0\xb2\x89\x2d\xbd\x58\xd3\x50\x8d\x96\x1a\x34\x5e\xd5\xac\x66\x3a\xdd\xca\xe1\x5c\x36\x95\x69\xe0\x56\x95\x95\xad\xbc\x55\xc0\x89\x52\xa9\x76\x3b\x95\x23\xf0\x1b\x98\x53\x43\x6b\x59\x84\x15\x93\xe9\x14\x6a\xa4\x35\xb3\x9c\x40\x96\xd5\x2e\xf0\x22\x22\x2c\xd9\xca\x64\x12\xe9\x46\xb5\x8e\x2c\x9d\x67\x33\x3a\x2a\xd7\xca\x85\x77\xc8\xc2\x0f\x0b\xa5\x66\x21\x4d\x6f\xe9\xf9\x6c\x55\x47\x85\x7c\x96\x5a\x46\x33\x45\x8d\x6c\xbd\xcd\xca\xbc\x99\x2d\x58\xc5\x74\xb2\x8a\x50\x91\xe7\x9a\x24\x59\x69\xa4\x2a\x3c\x95\x4c\x96\x6e\xa7\x22\x0e\x6b\x7e\x3b\x5d\xca\xb7\x68\xa3\x92\x69\xa4\x69\xab\xd8\x36\xcc\x34\x45\xe9\x44\x9e\x56\x12\x39\xd2\x4a\xd7\x1a\x46\x2e\x57\x4f\xb7\x2b\x79\x94\x2a\x91\x78\x16\xe5\xb2\x39\x13\xbd\x63\xf6\x0f\xd8\xcf\x24\x48\x12\x25\x2a\x84\x26\x72\x96\x69\x92\xb2\x96\xa9\xa2\x42\xaa\xad\xe5\xb2\x35\x5a\xd2\x78\x86\xe2\x3c\xae\x17\x4b\xac\xa1\xe7\x58\xb3\x91\x31\x2b\x66\x3b\x5f\xbe\x1d\x95\xe8\x80\xfd\x38\x4f\x95\x5a\xe9\x42\x81\x59\x39\xcc\x33\x79\x4b\x6b\x35\x68\x55\x6b\x18\xa9\x78\x3a\x9d\x4a\x1b\x24\x6b\x30\xdd\x8a\x27\xda\xcd\x2c\x8a\xb7\x49\xb1\x58\x6c\xa2\x9a\x76\xbb\xff\x42\x7b\xec\x27\x13\xf5\x6a\x3c\x5d\xd1\xf5\x1a\xcf\x17\x9a\x35\x23\x63\x54\x9a\x71\xad\xd0\xcc\xa1\x2a\xc9\xa2\x7c\xb1\xd4\x6c\xa0\x0a\xad\x5a\x85\x7c\xd2\xca\x6a\xcd\x24\xad\x25\x33\x5a\xab\x78\x3b\x95\x3d\xf6\xb5\x34\x45\xd5\x06\x2b\x6b\x71\x56\x4d\x9b\x46\xb1\x5a\xc0\xa8\x45\x0c\x5c\x2b\x97\x0b\xa6\x69\x66\x4a\x7a\xa6\xa5\x65\x5b\x56\x89\x55\x52\x29\xd6\xd6\xea\x56\x8a\xb6\xcb\xef\x90\xe5\xe0\xf1\x09\xab\x5b\xf9\x78\xa2\x90\x45\x4d\x96\x6c\x16\x9a\x5c\xcb\xea\x75\x2b\x55\xc8\xe0\x9a\xc6\x9b\x71\x1d\x9b\x69\xb3\xc4\x8a\x9c\x64\xca\xb4\xd0\xcc\x18\xe9\x6a\x1d\xe5\xe2\xb7\x53\xd9\x63\x3f\xd9\x4c\x69\xe9\x5c\xa2\x92\xc8\x92\x44\x1e\xb5\x32\x79\xd6\xb2\x0a\x1a\xab\xe6\xf5\x66\xca\x6a\xf2\xb8\x91\xae\x1b\xe5\x62\xdc\x28\x64\xf5\x5a\xce\xca\xd1\x56\xd9\x2c\x18\xd9\x77\x50\x39\x62\x3f\x8b\x71\x2d\x51\x28\x57\x13\x79\x03\x99\x86\x15\xaf\xf0\x66\x2b\x6e\x51\x4c\x0b\x05\xbd\xae\x65\x0a\xb4\x15\x37\x49\xaa\x9a\x88\x93\x4c\x3b\x53\xe5\x6d\x8d\x26\xea\xf9\xbb\x8f\x9e\x40\x8e\x54\xf4\xb7\x4a\x86\xc7\x5b\x1b\x4f\x17\xae\x7e\x9f\xa9\xeb\xa7\x73\xbf\x45\x76\xc2\xcc\xa7\x0b\x75\x43\x6c\xfb\xfa\xe0\xed\x87\x23\xdb\x43\xb9\xf9\x34\xae\x75\xa7\xca\x0b\xe6\xf7\xf6\x60\xdc\xb5\x47\x8b\x21\xd9\x45\xe3\xb5\x4a\xf2\xee\x2b\x16\xf3\xe7\xd4\xd1\x1b\xd4\x3f\x7b\x91\x7f\x4e\x1d\x5f\xa0\xae\xd7\xac\xbb\xaf\x88\x95\x9e\x53\x27\x6f\x50\xff\x5a\xd9\xe9\x1b\x9a\xff\x5a\xd9\xd9\x1b\xd4\x3f\xdb\x89\x3c\xa7\xbe\xf3\xb9\x23\x7b\x1e\x2c\xd5\x8e\xd8\xdd\x8b\x52\xee\x7b\x4e\x46\x7f\xca\xba\xf0\x6c\x2f\xe7\x5b\x84\xdf\xba\x28\x9c\x3b\x18\xfd\xd1\x55\xe1\xe1\x70\xf4\xc9\xb2\x80\x88\x84\x40\x40\xc0\x11\xa3\xfb\x9a\x37\xd9\xe1\xe5\x7f\x7e\x1b\xa9\xd5\x8e\xd3\xdf\xbe\x47\x9e\x4a\xf0\x00\xfc\xbf\x4b\xba\x3f\x3b\x32\x11\x10\x43\x2c\x25\x93\x8f\xd5\xf4\xff\xf9\x6d\x36\xb7\xa7\xf3\x60\xd4\xb9\x77\xec\x81\x3d\x72\xd5\x6f\xdf\x23\xbf\x41\x00\xc0\xef\x47\x12\xbf\xdd\x4c\x03\xbd\xa4\x81\x0e\xc5\xfe\xff\xf9\xed\x50\x70\x7a\x35\xf2\xb7\xc8\x6f\x4f\xd7\x0d\x76\xad\x07\xf3\xb8\x9d\xe2\x2b\xa9\xf0\xb7\x08\x3c\x88\xb5\x52\x41\xa7\xbb\x23\x09\xbf\x45\x7e\x3b\x4c\xc8\x7d\x5f\x6d\x76\x54\x3e\x5a\x50\xb8\x9d\x2f\xbc\xe3\x0b\x50\x28\x20\x47\x8c\xe3\xbd\xb6\xd1\x2b\x4d\x7c\x9e\x1e\x5e\xd1\x3b\xab\xf9\xcf\xa5\x87\x19\x42\x18\x01\x8a\x39\xff\x32\x6b\x7a\x46\xe3\xcb\xad\xe9\x95\x54\xb7\x59\xd3\x07\x8b\x3a\xb7\xf3\x45\x76\x7c\x41\x89\x04\xc2\x02\x08\xf8\xe5\xd6\x84\x5e\xd2\xfb\x62\x6b\x7a\x4e\x0f\x7d\xb9\x7c\xe4\x25\xbd\x2f\x96\x6f\x47\x0f\x71\x86\x31\xe2\x80\x0b\xfa\x65\x68\x79\x46\xe3\xcb\xd1\xf2\x4a\xaa\x1b\xd1\xf2\xb1\xea\xe4\xed\x7c\xed\x64\x47\x18\x63\x81\x01\x26\xe2\xe0\xe9\xc8\xc1\x9c\x46\xf6\xf0\x28\xea\x50\xc1\x9d\x06\x96\xf6\x60\xb1\xff\xc6\x48\x6a\x2b\x43\xfb\xc7\x3f\xde\x47\x06\x4a\x40\x30\xc6\x0c\x4a\x7c\x23\x99\x6a\x76\x6b\xbe\x9f\x0c\xe1\x44\x60\x26\x84\x3c\xac\xb4\x04\xbe\x22\x83\xde\x39\x22\x20\x14\x13\x00\x19\x38\xac\x26\x04\x7c\x0d\xe3\x07\x32\x94\x3d\x30\xfe\x9a\x0c\x7a\x46\xc6\xac\xb6\x70\xf1\xa3\x64\x24\x7f\x98\x86\xd7\x64\x22\xcf\xc8\xd8\x4d\x6b\x9b\x4d\x7b\x4b\x2f\x11\xdf\xba\xe9\x54\xaf\xdd\x34\xba\xef\x23\x09\x18\xa4\x82\x60\x82\xc1\xd7\xc1\xf9\x19\x8d\x2f\x87\xf3\x2b\xa9\x6e\x84\xf3\xc7\xf6\x01\xde\xa9\x09\x28\x18\x26\x8c\x03\x20\xcf\x3b\x07\x8a\x28\x67\x9c\xfd\x2e\x29\x66\x40\xa2\x1f\xd7\x06\x7b\x49\x15\xbd\xa6\x8a\x05\x24\x04\xed\xa7\x00\x12\x28\x3f\x85\x28\x94\x9c\x32\x41\xa4\xe4\xf0\x60\xcb\x7c\x4f\x34\x18\xf9\x83\xc3\x19\x2d\x4f\xcd\xe6\xc1\x68\xff\x79\xaf\xff\x0f\x6e\x91\xbc\x4b\xff\x07\xa6\x28\xc0\xe2\xa8\xff\xb7\x98\xfa\xe0\x5e\xda\x3b\x35\x85\x11\xc7\x14\x23\x02\xdf\x8a\x3f\xd1\x53\xbe\xf4\x21\x24\x3e\x27\x75\x06\x89\xe7\x08\x7c\x8e\x35\x9c\x12\xbe\x0d\x90\x5f\x6e\x10\x3b\x6d\xef\x5c\x91\xa0\x8c\x42\x04\x1f\x8f\x74\x9d\x2a\x44\x4a\xf9\xbb\xdc\xfd\x7d\x52\x78\xf8\x9c\xe0\x19\x2c\x7e\x2a\xc1\x57\x12\x1e\xa0\x78\xf7\x3f\xef\x1b\x81\x30\x81\xa9\xe4\x02\x7d\x99\x8b\x78\x4e\xe3\xcb\x5d\xc4\x2b\xa9\x6e\xcc\xb6\x3f\xb6\xc1\x7a\x3b\x5f\x62\xc7\x17\xc0\x42\x30\x0c\x28\x3a\xba\x08\xb2\xe7\x6b\x3e\x5d\xec\x9e\x39\xf0\xf1\xb1\xed\xd1\x27\xbd\xb9\xa1\xb7\xd7\x9b\x5e\xb3\x5e\x2b\xf3\x65\x5d\xed\xa9\xc7\xe1\x6d\x07\x07\x70\x7e\xac\xbc\xf7\x3e\x55\x70\x06\x24\x66\x0c\x23\x7c\x2c\x3c\xe0\xaf\x53\x45\xad\x92\xfc\x2f\x50\x05\xc7\x0f\x56\xf1\x85\xaa\xf8\x0f\xb6\x8a\x9d\xf0\x1c\x72\x29\x98\xa4\x12\x1f\xdc\x25\x3a\x00\x77\x10\x0c\x83\xc3\x0a\xba\x4b\x9a\x38\x02\x98\x09\xfa\x3b\xe1\x9c\x0a\xc0\xff\xab\xe6\xfb\x51\x48\x0e\x00\x78\x30\xfd\x0f\x09\xf9\x1f\x3c\x93\x3b\xa3\x66\x9c\x02\xcc\x91\x60\xe4\xe0\x7c\xd9\x61\xd1\x5f\xcc\xbb\xf7\x53\x35\x59\x04\x53\xe5\xdd\xfb\x03\xbb\xf3\xdb\xf7\x7d\x45\x7b\xc7\xe7\xa1\x6d\x19\xba\xb6\x33\x50\xa7\x8d\xef\xd2\x2e\xc3\x08\x08\xce\x20\x26\x5f\xe7\xd1\x9e\xd1\xf8\x72\x8f\xf6\x4a\xaa\x1b\x3d\xda\x07\xd7\x8c\xf7\x4d\xf3\x81\x2f\x4a\x8e\xd3\xfc\x85\xda\x3e\xd0\xf8\x72\x6d\xbf\x92\xea\xc6\x88\xf6\xab\x41\xb5\xe3\x01\x52\x21\x21\xe6\x92\x00\x72\x74\x15\xf0\xf9\xd2\x71\x46\x0f\x3f\xbe\x28\x7e\x79\xa2\x74\x10\x8d\x30\x28\x04\x62\x9c\x1e\x57\x45\xf4\x5c\x34\x78\x6e\x92\xff\x6b\x84\x03\x18\x61\x41\x25\xa1\xfc\x8f\x27\x1c\x61\x00\x09\x21\x11\x64\xf0\xdf\xe2\xb4\x7f\x92\x94\x90\x63\x2c\x11\x11\xec\xeb\xfc\xca\x33\x1a\x5f\xbf\x2f\xf9\x4a\xac\x1b\x1d\xcb\xc7\xce\x56\xbe\x83\xb1\x9d\x1d\x61\x4e\xb0\x90\x94\xd3\xe3\x3e\xf0\x95\x00\x62\xff\xce\xc7\x8b\x11\xc4\xbe\xf5\x23\xb4\x19\x64\xc7\xb9\x86\xe8\xb9\x52\xd0\x19\xa5\x7c\xec\x28\xe8\x87\x94\x72\x64\x6c\x67\x31\x87\xf5\xff\x05\x2f\x71\x96\xc3\x8d\x62\x21\xdf\x2a\xeb\x2c\x5f\x4f\xb6\x75\x8d\xe4\x92\x46\xaa\x5a\x2d\x9a\xb5\x56\x09\x97\x6a\x19\x33\x69\xb6\xad\x46\x36\xaf\xb1\x5c\xb9\x91\x35\x72\x6d\xad\x9a\xd2\xdf\xcb\x0b\x86\x04\x4b\x09\xd0\x71\xeb\xf8\x3f\x47\x49\xa7\x8c\xa1\xd7\x8c\xd1\xd7\x8c\xfd\x1c\x8d\x21\x80\xa8\x04\x42\xe0\xe3\xf6\xda\xbf\xbd\x42\x79\xc2\xd5\x6e\x09\xb8\x29\x52\xff\xd0\xe0\x8c\x1e\xf7\xdf\x9f\x0d\xfe\x23\xa1\xfe\xd3\xe8\x10\x00\xf6\x9f\x66\x82\x47\xc6\x08\x3f\x2e\x5e\x87\x3a\xcf\x20\x5c\xdd\xcf\xbb\x53\x35\xeb\x86\x03\xef\xb7\xef\x3b\x17\xf2\xdb\x50\x79\xcf\xbe\xdb\xb1\xdc\x0d\x3a\xdd\xe7\x5f\x7e\x88\xba\x78\x70\x55\x74\x4f\xbd\x1b\x0e\xd5\xbd\x17\x0e\xed\x60\x6f\x5d\x6a\x6d\x0f\xc7\x03\xf5\xbb\x1b\x0e\x3f\x24\x1c\x44\xf2\xe8\xef\xff\xc3\xb4\x7e\x64\x0c\xdd\xe4\xcb\x7e\x0e\xf0\x21\x95\x8c\x40\x04\x81\xf8\xb2\x33\x4d\xcf\x69\x7c\x7d\xec\xf0\x4a\xac\x1b\x63\x87\x2f\x37\x84\xfd\xbc\x73\xcc\x09\x14\x8c\xc8\x2f\x3b\xf5\xf3\x9c\xc6\xd7\xeb\xfb\x15\xc9\xdb\xf4\xfd\xc1\xbb\x23\xef\x60\x8c\xec\xf8\xc0\x80\x4b\x04\x25\x3a\xee\xd4\xe3\x83\x32\x0e\xef\xd1\x3a\xf0\xf1\xb1\xdb\x25\x3b\xc5\x3d\xdc\xd1\xfc\xed\xfb\x4e\xe6\xdf\x66\xe1\xc0\xbb\x3f\xdd\xd5\x3a\x55\xb2\x13\x2e\x3a\xdd\xf9\xc5\xe6\xc3\xb3\xe7\xd2\x8e\x93\x96\x6b\xb9\xc7\xc3\xf8\xe7\xe6\xf2\xf9\x28\xa7\xf9\xc9\xc7\x8e\x49\xbf\x63\x0e\xf0\xcb\x39\x40\x67\xe7\xe0\x83\x7c\x7c\xd9\x1c\xbc\x56\xe0\x33\xfd\xbe\x98\xa2\xb3\xba\x7f\x73\x92\x7e\xf6\x3c\x48\x42\x84\x44\x82\xb0\x87\x53\x00\x3f\x3b\x19\xfe\x29\x42\x02\x28\x09\x86\x1c\x1f\xf7\xff\xbf\x60\x7d\x7d\x46\xe2\xeb\x97\xd7\x97\x42\xdd\xb8\xba\x7e\x70\x55\x7b\xd7\xea\x7a\xe0\x0b\x41\x02\xbe\x2c\x78\x78\x46\xe2\xeb\x95\xfd\x52\xa8\x1b\x95\xfd\xe5\x96\xcd\xbf\x45\x04\x15\x52\x62\x0a\xc0\xf1\xbc\xc6\xeb\x13\x9e\x57\x0a\x75\x1f\xdf\x92\xf9\xe0\x7d\x8e\x77\xc8\xc6\x5e\xc8\x76\x7e\x96\x3f\x71\x92\x5f\x12\xc4\xe7\x5c\xd2\x47\xe5\x7e\xee\x92\xd0\x6b\x97\xf4\x42\x96\x57\x3e\xe9\x45\xfb\xfb\x9d\xd2\x71\xae\x7f\xd8\x29\x7d\xfd\xcc\xd3\x17\x13\x41\xce\x4d\xc4\x07\xef\xb2\x7e\xe5\x44\xbc\xd0\xf4\x57\x46\x68\x5f\x3f\x09\xbb\xa5\x05\x32\x40\xb0\x40\x1c\x9d\x3f\x1c\x8f\xfe\x9b\x97\x96\x53\xd9\x6e\x5d\x5a\x7e\x3c\xd8\xf9\xf9\xb2\x7d\xe1\x2a\x06\xdf\x0f\x1e\xf4\x26\x78\x7e\x42\x7a\xf3\x73\x56\xb0\xd3\x49\xf8\xc2\x15\xec\xcc\x24\xa0\xaf\x76\x25\x9f\x95\xdf\xfc\x7c\x34\xd0\x9f\xea\xd3\xdf\x9a\x88\xcb\x68\xf8\x43\xfa\xf4\xd3\x89\x60\x3f\xd5\xa7\x7f\x7c\x22\xfe\x50\x3e\x9d\x7d\x8b\x70\x8e\x81\x24\x90\x92\xe3\xf1\xd9\x77\xa5\x0b\xff\xc9\x7e\x8f\xbe\x90\xed\x0f\xe6\xd3\x39\x06\x90\x10\x22\x20\xfa\xf7\x54\x69\x7e\x4a\xc0\x79\x10\x92\x22\xf4\x60\x9c\x3f\xf9\x9c\xe1\x4f\x99\x49\x26\x38\x94\x44\x00\x81\xbf\xac\x14\xf5\x8c\xc4\xd7\x57\x47\x5e\x0a\x75\xeb\x8d\x8a\x8f\x2d\xf6\xef\xb2\xa8\x23\x5f\x44\xa2\x2f\x2b\x45\x3d\x23\xf1\xf5\xca\x7e\x29\xd4\xad\xd7\x43\x3f\xf4\x4e\xa6\xf7\xad\xbf\x47\xbe\x24\xf8\xba\xab\x19\xcf\x48\x7c\xbd\xb2\x5f\x0a\x75\xa3\xb2\xbf\x7c\x19\x11\xdf\x22\x8c\x10\x44\x28\xc4\x14\x5f\xaa\xfb\x7d\x85\xaf\xfb\xe0\xab\x4c\xde\x21\x9a\x7c\x21\xda\x8d\x97\xc8\xff\x1b\x44\xdb\xcd\x1a\x80\x48\x52\xc2\x10\xf9\xfa\xf7\x0d\xec\x55\x79\x4a\xef\x8b\xef\xe3\x3f\xc9\x47\x01\xfe\x37\x5d\x87\xf8\x29\xf6\x49\xa9\xc0\x84\x72\x21\xbf\xee\xc0\xfe\x33\x12\x5f\xbf\xce\xbd\x14\xea\xd6\x1b\x68\x3f\x01\x31\x07\xbe\x04\x06\x5f\x77\x5e\xff\x19\x89\xaf\x57\xf6\x4b\xa1\x6e\x7d\x1d\xca\x87\xde\x77\xf8\x0e\x45\x80\x6f\x11\x0a\x29\x96\x0c\x42\x46\xde\x0a\x97\xe8\x47\x54\x0d\x5f\x50\x38\xa3\x6b\xfa\x99\x2f\x40\x79\x29\xd1\x8d\x66\xfd\xb1\xb7\x31\xbe\x4f\x0f\x84\x23\x42\x18\x21\x98\x7e\x59\x16\xf0\x8c\xc4\x97\x9b\xf5\x2b\xa1\x6e\xcc\x02\x3e\xf6\x52\xca\xf7\x29\x02\x49\x22\x19\xe7\x80\xde\x1e\x2a\x7d\x58\x0d\x2f\xe9\x7d\xfd\x4b\x7e\x9e\xc8\x89\x9f\x2c\x9e\xf8\x7a\xf1\x76\xe3\x0b\x46\x09\x07\x92\xb3\x2f\xf3\x00\xcf\x48\x7c\x3d\x54\x5e\x52\xbc\xd1\x03\x7c\xec\xcd\xaa\xef\x53\x04\xc1\x54\x72\x82\x08\xbb\x50\x1e\xfc\x44\x2d\xe0\x17\xe4\xce\xe9\xfd\x53\x81\x72\xa4\xc6\x28\xbb\x10\x7c\x7f\x89\x70\x07\x72\x3f\x49\x38\x0a\xd8\xa5\x45\xee\x2b\x84\x3b\x92\xfb\x59\xc2\x91\xc7\xab\x76\x3f\x45\xb8\x03\xb9\x2f\x16\x6e\x47\x0e\x00\xb6\xcb\x85\xe0\xd7\xbd\x40\xf2\x19\x89\xaf\x5f\xe0\x5e\x0a\x75\xe3\x02\xf7\xb1\x97\x3a\xbf\x83\x2f\xf2\x2d\x82\x28\x67\x52\x00\x2e\x6e\xbf\x81\xf1\xc1\xd7\x40\xff\x00\x5f\x67\xee\x00\x9d\x8b\x9d\xb0\xce\x33\x79\xc3\x32\xab\x2c\x93\x8e\xa7\x33\xf1\x2a\xcb\xb2\x9c\x4e\x4c\x54\x21\x0d\x9a\x6f\x23\xc2\xaa\xe9\x1c\xc9\x97\x2b\xcd\x1c\x2a\x91\x78\x33\x51\x2b\x95\x8d\x77\x14\xf5\xf6\x7c\xed\x5f\x93\x46\xc8\xa5\x1b\x2b\xe7\xf8\xfa\x29\xfa\x3a\xe5\xeb\xb6\xab\x13\x3f\x53\x5f\xe2\xfa\x45\x1a\xf4\xf9\x17\x69\x76\xc4\x8f\x6f\x6a\xc0\x48\x7c\xdd\xe5\xf6\x53\x12\x5f\xbf\x92\xbc\x14\xea\xc6\xac\xe2\xcb\x2d\x70\x17\x1e\x21\x21\x88\x04\x54\x7e\xdd\xbb\x27\x9f\x91\xf8\x7a\x65\xbf\x14\xea\xd6\x72\xf7\x87\xde\x5f\x7f\xe0\xeb\x8d\xb7\x42\x1f\x7e\x2f\xea\x73\xde\x0a\x7d\x1c\xeb\xe9\x4d\x60\xf0\x5b\xe4\x8e\x13\x97\x79\xbe\x87\x85\xcb\x1c\x97\x38\x10\x78\xca\xf3\x1c\x85\x7c\xcf\xa3\x36\x24\xd8\x16\x90\x33\x0a\x11\x56\x4c\x39\x0c\x23\xe2\xf9\xca\x07\x9e\xeb\x11\x9b\x52\xdf\x81\x77\xdf\x22\x77\xbe\x2b\x08\xf6\x10\x24\xd8\xe5\xcc\xf1\x90\x54\x0e\x76\xa0\xef\x7b\x9e\x8b\x3d\x22\x3c\x06\x5c\x6e\x43\xcf\xf5\x6d\x88\x6d\x4f\x08\x28\xa1\x67\x03\xcc\x81\x44\x3e\x44\xde\xf1\x47\x18\xe1\x8b\x5f\x8d\x62\xdf\x31\xfb\x8e\xf8\xcb\x1f\x93\x62\xdf\x31\xfd\x8e\xf1\xef\xfb\x77\x33\xa3\x37\x5b\x11\x83\x52\x62\x00\x28\xa0\xec\x5b\x04\xee\xfe\x07\x00\x80\x12\x70\xf4\xf8\x23\x90\x60\xe7\xad\x09\x87\x68\x7f\xd9\x6b\xf7\x4f\xf8\xd4\x02\x1f\x3f\xec\x18\xd4\x34\x4d\x4b\xc4\x36\x7a\xa9\x92\x4a\xae\xd1\xb2\x32\x9a\x16\xd7\x31\x89\x93\x30\x0b\x3b\x6b\x96\x71\xa3\xdd\xe2\x3c\x88\xf7\xbd\x30\xe9\xe6\x0a\xeb\x42\x79\x35\x72\xc2\x64\x7b\x53\xec\xb8\x1b\xdf\x21\x7d\x45\x57\x59\x5c\x09\x67\xf5\x36\x6b\x95\x17\xeb\xec\xc8\x44\x35\xe6\xc5\x3d\x22\xbb\xad\xdd\xd0\x5a\xb3\x54\x37\x82\x95\xf6\xf8\x17\xce\xf4\xee\xd2\xaa\x26\x96\xb6\x97\x8d\xe5\xe4\x34\x2a\xfa\xf1\xe8\xa0\xa5\xb1\xe2\xb8\x5b\xed\x65\x32\x31\x1a\xa2\x68\xd0\x1f\x64\x49\x89\x4c\x97\xa5\x8c\xb6\xc6\xf6\x2c\x80\x21\xe1\x46\x09\xa2\xa9\x99\x28\x57\xb2\xb5\x7a\xb2\x07\xeb\x53\x6f\x21\x60\x74\x5e\x2c\x24\xfd\xdd\xf8\x49\x60\x92\x46\x79\xdc\x30\x7b\xf9\x23\xa9\x38\x28\x59\x74\xff\xa9\xfc\x48\x3e\xbd\xfb\xbf\xb6\xd6\x84\xa4\xbc\x7b\x24\xa7\xe5\x19\x9a\xf8\xbd\x74\x33\xb9\xe9\x45\xe1\xb8\x59\x2d\x68\x6a\xc6\x62\xb1\x92\x17\x64\x8c\xec\x80\x76\x32\xc5\x7e\xb5\xa7\x9a\xc5\xd8\x0a\x68\xff\x09\x7f\x8f\xbf\xef\x69\xd6\x0a\x85\x0b\xcb\xc0\x2b\x5c\x80\xcf\xb1\xe9\x3b\x41\x15\x47\x8c\x11\xd7\x83\x02\x53\x84\x18\x12\x8c\xf9\x80\x62\x4a\x09\x80\x98\x21\xc7\x16\xae\xb2\x99\x8d\x7c\xc2\x15\xe2\x90\x11\x0e\x6d\x47\x00\x8f\xdb\x02\x01\x71\x0d\x17\xec\xa2\xe5\x63\x4a\x10\x7c\xb3\xf5\x18\x6e\x61\xce\x77\xe2\x5e\xc7\x05\xbc\x11\x17\xa4\x39\xca\x0d\xab\x66\x3a\x59\x0b\x5a\x61\x7b\x19\xaf\xd6\x6b\x5a\xb5\x35\x9d\x18\x6c\x18\x2e\xad\x68\x6e\xdd\xce\xa4\xa7\x1d\x53\x85\xd9\x2c\x15\x7e\x7d\x39\x98\x56\xbb\x6e\x61\x66\x75\xdb\x31\xa3\xd1\x35\x0c\x3f\x56\x6b\x4d\x51\x71\xdb\xb7\xfa\xd5\x7c\xaa\xd5\x4e\xa6\xcb\x54\x1d\xc0\xb0\xc7\x45\xe7\x69\x5e\xdb\x71\xd4\xe4\x03\x37\xe1\x70\x8e\x06\x25\x5e\x1e\xcc\xb3\x2b\x9f\x6b\x7e\x54\xaf\x04\xb3\xfc\x2c\x4c\x8d\x6b\xd0\x8d\xb7\x97\x15\x97\xbb\x5d\x27\x85\x4b\x5d\xd5\x2c\x45\xb7\x3c\x3a\x9f\xe5\xa8\x43\xd3\xad\x59\x43\xb7\x37\x2c\x19\xb0\x44\xbf\xdf\xb7\xbd\xdc\x30\xd5\xc7\xbb\x81\x93\xab\x33\xb8\x28\xd7\xf7\x9f\x7e\x71\x5c\x50\xf9\x39\x36\x7d\x07\x94\x84\x8c\x21\x8f\x41\xc7\xe1\x0e\x12\xbe\xed\x53\x4e\x1d\x69\x63\x0a\x28\x67\xbe\x4b\x80\x0f\x99\xc2\x02\x41\xce\x31\x04\x92\x11\x2c\x89\xe3\x20\xe4\x29\x46\x85\x73\x0d\x17\xf4\xa2\xe5\x13\x06\xd8\xf5\x56\xb6\xc7\x05\x26\x00\x03\x0e\x08\x23\x6f\xe1\x02\xdc\x88\x8b\x15\xb3\xda\x01\xec\x2e\xf0\x2c\x8c\x2e\xeb\x70\x61\x9b\xe5\x3a\x8a\xe9\xc9\xb5\xd3\xeb\x74\xbd\xad\x9e\x6b\x27\x07\x85\x59\x80\x87\x8d\x42\x34\x9b\x18\xe1\x78\xa1\xdc\xb4\x66\xdc\x1f\x90\x59\xd0\x48\x25\xd0\xc0\x4b\xaa\x28\x87\x9e\xdf\x8e\x16\xe7\xac\xb2\x5d\x58\x79\x27\x3c\xcc\xe3\x1e\x17\x4f\x76\xa9\x0d\x4c\x63\x15\x4f\xd6\xf4\xc9\x3c\xd0\xab\xc3\x5a\xd4\x5e\x0c\xfa\xc6\x34\xb9\xa8\xcf\xe3\xbe\x5f\x10\xb3\xba\x9a\x0c\xc1\x7a\x18\xdd\xa4\xb6\xf3\x8c\xdf\xa3\x4d\x91\x28\xd4\xc3\x8a\xb2\x50\x67\x2c\xb4\x44\xa8\x6f\xb2\xaa\x32\x37\x49\x91\x4e\xe7\x7c\x52\xa9\xd8\xeb\x75\x77\xb1\xf7\x17\xb3\x33\xb8\x28\xae\xf7\x9f\x7e\x75\x5c\x88\xcf\xb1\xe9\x3b\xe2\x33\x4f\xda\xb6\xf0\x81\x8b\x6c\xe0\x38\x9c\x21\x04\x31\x82\x18\x22\x07\x10\x22\x39\x02\x0a\x10\xee\xb8\x2e\xe1\xb6\xf0\x08\x57\x58\x08\xca\x10\xc4\x92\x79\x0a\xa3\x6b\xb8\x20\x17\x2d\x9f\x72\x44\x2f\xc7\x51\x0f\xad\x0f\xbf\x1f\x82\x21\x13\x6f\xe0\x02\xc8\x1b\x71\x01\xe4\x7c\x38\xe9\xad\x56\x93\x04\xf7\x82\x6c\x35\x5b\xd5\xa7\x71\x7d\xb0\x49\x76\x2c\xbe\xd5\x55\x08\x33\x84\x74\x1b\xd9\xea\x60\x4e\x36\x74\x60\xdb\x6a\xdd\x0e\x70\x5c\x85\x39\x27\xde\xca\xeb\x99\xba\x65\x37\xcb\xf1\x6d\x7b\xdb\x4c\xf6\xa6\xc1\x76\x18\x6f\xdb\x69\x24\x1a\x07\x60\xec\x71\x71\x32\xaf\x69\xc3\x2f\xc7\x53\xb1\xd6\xa4\xa5\x3c\xbd\x66\x8e\xca\x8b\x60\xb0\x5d\xf4\xb7\x85\x5c\x49\xd5\xa7\x96\xcc\xb2\x09\x76\x6c\x33\x2d\xf0\x48\xf4\xbd\x86\x55\x9a\x58\xbe\xc7\x66\xfd\x62\xd5\xcb\x75\x71\x67\x05\x13\x85\x8d\xd6\xf6\x07\x20\x3f\x1b\x2f\x95\xdd\x8f\x35\x6b\xf1\xe9\x6e\xe0\x64\x78\x06\x17\xa6\xb9\xff\xf4\xab\xe3\x82\x7f\x8e\x4d\xdf\x11\x22\x09\xb6\x6d\x97\x01\x9f\x63\x2e\x10\x72\x1d\x47\x28\x0f\x48\xcf\xf6\xb0\xed\xfa\x3e\x03\xbe\x14\x10\x7a\x8e\x74\x5d\xca\x94\xbf\x4b\x5f\x18\x10\x48\x79\x1c\xfa\xce\xd5\xfc\x02\x5f\xb4\x7c\x26\x08\xb9\xde\x4a\xee\x9e\x7e\x27\x86\x0a\x8e\xde\xc2\x85\xb8\x15\x17\x95\x5a\x71\xb2\xee\xc8\xad\x4a\x14\x0a\x8b\x22\xc8\xa1\x79\x71\x16\x43\x49\xda\xb1\x10\xdd\xa6\x9c\x25\x59\xc2\x4e\x67\x01\xd7\xd1\x55\xa5\xad\x2f\x54\xbd\x3c\xae\x4f\xbd\x26\x09\xa3\x79\x63\xc1\x68\x9b\x69\x93\x92\x5e\xee\xe0\x6e\xb2\x63\xa4\x9b\xf5\x6d\xc3\xf3\x3b\xe4\x29\xbf\xe8\x9e\xe4\x17\x90\xcc\x52\x59\x6b\xd1\x6b\xac\x3a\x32\x3f\x6e\xe0\xb5\x5b\xaa\xc6\xb5\xb4\x5a\xc4\x59\x62\x36\xaa\x18\xd5\x71\x49\x54\x7a\x95\x99\x27\xc3\x9e\x1c\x88\x72\xcc\x29\x42\xd1\x18\xab\xcc\xba\x08\xab\xdd\x7c\x35\xed\x68\xf3\xec\x90\x5a\x09\xb2\x99\xcc\x9b\x24\x5f\xb0\xad\x4c\x6c\x67\xf7\xc9\xfe\x19\x5c\x14\xc6\xfb\x4f\xbf\x3a\x2e\xd8\xe7\xd8\xf4\x9d\xf4\x15\x13\x82\x43\xe2\xd8\x84\x21\xc7\x41\x8e\xed\x39\x14\x21\x1b\x09\x9f\x60\xca\xb8\x70\x5d\x6c\x7b\x58\x60\xcf\x25\xb6\xef\x49\x68\x0b\x17\x42\x85\xa9\x8d\x3d\x8e\xe9\x35\x5c\x5c\xf6\x08\x02\x10\x79\xd9\x9b\xec\x5a\xe9\xdd\xe3\xef\x06\x31\x41\xf9\x5b\x79\x37\xe0\x37\xe2\x82\xc6\x86\x41\x26\x55\x18\xa7\xf3\x3c\xcf\x10\xcc\x4e\xf2\xa5\x32\x6c\x93\x6d\x72\x5a\xed\xc8\x75\x3e\xd6\x4e\x87\x2b\x8b\xc0\x50\xba\x50\xf3\xa7\x0b\x1d\x66\x4d\xd7\x8c\xda\xd6\xb2\xaf\x0d\x8c\x92\x8b\x90\x57\xed\x74\x3a\x81\xcf\x56\x83\xd0\x98\x97\x09\xef\xe5\x26\x56\x76\x3f\x8f\x7b\x5c\x9c\xe4\x17\x0b\x6f\x99\xcd\x3b\x5e\xaa\x5c\x64\xee\x68\x12\x1f\xf8\x5a\x19\x4c\x56\xc1\x52\x54\x63\x4e\xb8\x8a\x35\x4a\xd5\xac\x66\x86\x31\xdd\xb2\xf4\x49\x99\x24\x56\xb6\xca\xb4\x53\xc3\x28\x58\xa4\xc3\xb6\x33\x6c\x79\x61\x7c\xa5\xd9\xc3\x14\x5d\x42\xa0\x0f\x47\x75\x9f\x2c\xd6\x19\xb6\x1b\x3f\xd9\x39\x83\x8b\x7c\x6a\xff\xe9\x57\xc7\x05\xfd\x1c\x9b\xbe\x73\x84\x04\xae\xef\x71\x8c\x18\x10\xd8\xf6\x28\x97\x36\xa4\x90\x31\x89\x20\xf2\x29\x44\x1c\xbb\x40\x00\x85\x1c\xc6\x6d\xcc\x18\x51\x0e\x77\x1d\xd7\x91\x3e\xe4\x1c\x92\xab\xfe\xe2\x72\x66\x2d\x11\x61\xd7\x5b\xf7\x71\xd4\xf1\x97\xa0\x20\x12\x6f\xe5\xdd\x80\xdd\x88\x0b\x1e\x94\xb7\xd2\xdd\xb4\xb2\xc5\x79\x9d\x86\xf5\xd4\xb0\xdf\x2d\x40\x7d\x54\xd2\x3a\xc5\x3c\x52\xbd\x76\x9f\xe1\x8d\x58\xf8\x29\x9c\xd2\xd2\xba\x4a\xeb\x32\x8e\xe7\x03\x1e\xca\x84\x9f\x9f\x97\xea\x06\x49\xaa\x86\x53\xf3\x63\xf1\x10\x4b\x37\x99\xa9\x4e\xf5\xac\x3d\x72\x4f\xfc\xc5\x49\x7e\x91\x29\x2e\x40\xdc\x8a\x22\x5a\x4d\x6e\xdc\x16\xf7\x5c\xb3\xb2\xa9\xbb\x7d\x38\xda\xb4\xe3\x89\xbe\x16\x4f\xb5\x9b\xab\x5e\x3f\x70\x29\xaa\xd0\x12\x42\xed\x61\x2d\xda\xe9\x95\x92\xd9\x5e\x57\x6b\x74\xda\xf1\xc6\xb6\xdd\x06\x2b\xab\xcb\x37\x45\x6b\x2a\x47\x41\x6f\x1c\xc7\xab\xc6\x3e\xbf\x70\xcf\xe0\x22\xdb\xdd\x7f\xfa\xd5\x71\x41\x3e\xc7\xa6\xef\x88\x60\x84\xda\x9e\x20\x18\x28\x2a\x29\xa2\x14\xbb\x1e\x93\x94\x49\x9b\x72\x08\x1d\xdb\x95\x98\x30\xe8\x40\x57\xba\x00\x03\x87\x01\x07\x30\xe4\x13\x41\xb1\xc3\x1c\x48\xee\x1e\xf7\x9e\x5f\xe3\x02\x5c\xb2\x7c\x02\xa8\x80\x17\xbd\xc9\x63\xeb\xc3\x2f\x67\x61\x29\xde\xca\xbb\x01\xbd\x35\x8e\xea\xf6\x1b\xf3\x6e\x32\x39\x18\x54\xea\xd5\x6d\x63\xd0\x18\x0e\x5c\x6b\x31\xeb\x83\x96\x93\xc9\xad\x92\x09\x94\x58\xb5\x96\x95\x54\x11\xcd\x6a\x9e\xb6\x1d\x0f\xdb\xa4\x3e\x0c\x72\x5a\x3a\xdb\x1d\xc1\x84\x48\x30\xba\xd1\xfa\xc3\x79\xdc\x4d\xf4\x53\xcd\x4c\x72\xd5\xaf\x96\xc2\x56\xff\xa9\x1e\xd5\x3d\x99\x57\xbf\x59\xf7\x4b\x15\xd9\x8b\x4f\xba\x55\x7f\x4b\x0a\xc1\xb2\xd5\x2a\x49\x67\x3e\x5a\x44\x27\x2b\x3f\x36\x19\xd7\x5b\x05\x9e\xe9\x38\x9a\x81\x68\xd1\x2b\x64\x48\xa1\xb9\x58\x8d\x4c\x99\x1c\x2f\x72\xc5\xbe\x88\xeb\x2e\xc9\x06\x6e\xd0\xb3\x7a\xda\x74\xd5\x0a\xdc\x3a\xee\x93\xf5\x3e\x8e\x6a\x9d\xc1\x45\x5a\xee\x3f\xfd\xea\xb8\xc0\x9f\x63\xd3\x77\x8e\xc7\x1d\x82\xa4\xe7\x78\xc2\x17\xca\xf7\xa0\x43\x99\xf2\x38\x40\x8e\x0f\x05\x56\x84\x63\x0c\xa9\x42\x3e\x20\x08\x79\x0e\xa5\x52\x52\x22\x5c\x02\x88\xab\xd4\xb1\x6c\x74\xc9\x5f\x40\x79\xd1\xf2\x11\x40\x52\xbc\xd9\x7a\xfc\x2d\x34\xc6\x98\x78\x33\xef\xc6\xb7\xfa\x0b\xc8\xcb\x63\x24\x7b\x84\xcb\x34\x74\xe6\x6e\x62\xb9\xee\x44\xad\xad\x51\x27\xcb\x78\xa2\xe0\xd4\xdb\x83\x5a\x4f\x8f\x1b\x7c\x18\x1f\x26\x97\x56\x80\xc9\x82\x5a\x1d\x5d\x4b\x06\xce\xd8\x2d\x12\x97\x16\xe3\x4e\x21\x4b\x33\xa9\xc6\x1a\xce\xb7\xb0\x18\x5f\xad\x79\xd6\x78\xf2\x17\x9d\x93\xfc\xa2\x25\x80\x3d\x5b\x87\x99\x7a\xd6\xe3\x60\xdd\x97\xb4\xd0\x9d\x59\x66\x3f\xc0\x8b\x4a\xab\xdb\xc9\x4d\x97\xc6\x78\xcb\xca\x0a\xd3\x55\x99\x19\x72\x13\x1d\xc7\xc6\x73\xb3\xcd\xb6\x71\x34\x09\xd8\x78\xb2\xca\xa4\x36\xd4\x8f\x79\xc6\x00\x93\x14\x1c\xaf\xfd\x55\x67\x19\xf7\xf6\xfe\xa2\x76\x06\x17\x49\xb8\xff\xf4\xab\xe3\x02\x7d\x8e\x4d\xdf\x49\x40\x31\xc1\x14\xf8\xd8\x57\x36\xb0\x99\x4d\xa9\xf4\x14\x02\x9c\x49\xaa\x90\x40\x4a\x48\x21\x81\xa4\x84\x08\x84\x6d\x97\xba\x1c\x00\xe0\x73\x66\x3b\xb6\xe7\x02\xa1\xae\xe1\xe2\xb2\xe5\x63\xc0\xc1\xc5\x38\xea\xb1\xf5\xf0\x5b\x7c\x48\x4a\x2c\xdf\xcc\xbb\x6f\xdd\xd7\xa3\xf1\x6a\x19\x26\xb7\xb1\x49\x62\x38\xae\x8f\x54\x36\x63\xd7\x49\x58\x08\x87\xb9\x44\xdd\xca\x66\xd9\xda\x75\xb5\x24\xb6\xa7\x53\x37\x51\xdc\xaa\x94\x6e\xa3\x1e\x9b\xa7\xd3\xa2\xe3\x18\x31\x68\x58\xc2\xd6\xe2\xad\x58\x69\xbd\x28\xca\xf6\x16\xcd\xe4\x70\x9d\x1e\x15\xea\xe1\xc1\x18\xf7\xb8\x38\xc9\x2f\xbc\xd4\x0c\x2c\x96\x5e\x7f\x81\x14\x24\xed\x42\xdb\x6c\xc5\x82\x51\x3f\x09\xb2\x9d\xb4\x1c\x46\x65\x17\x88\xb4\xd3\x1f\xb5\x67\x52\xdf\xb6\xb7\x8b\xb1\xd6\x0c\xb6\x7e\xbc\x39\xec\x4a\x39\xca\x54\x17\xbc\x41\x33\x70\xbb\x1c\xf7\x1b\x15\x94\x48\xc1\xf9\x24\xae\xe7\x57\x8b\xc4\xde\x5f\x94\xcf\xe0\x22\x61\xed\x3f\xfd\xea\xb8\x80\x9f\x63\xd3\x77\x0e\x74\xb9\xc7\xa1\xad\x1c\x5b\x70\xe0\x40\x86\x1c\x80\x90\x8b\xa1\xed\x29\x07\x31\x06\x89\x62\x3b\x3b\x95\x48\x30\xc2\x6d\xe8\x48\x97\x39\x2e\x85\xb6\x63\x0b\xec\x01\xef\x1a\x2e\x2e\xee\x77\x93\x1d\xd7\x97\xbd\xc9\x43\xeb\xc3\x8f\x47\x22\x20\xdf\xcc\xbb\x6f\xdd\xd7\xe3\x99\x0c\x5c\x4f\xa7\x93\x4c\x62\xdd\x9a\x6a\xc1\x6a\x3d\x55\xb3\x61\xab\x46\x7b\xf1\x55\x3f\x6c\x67\x42\x67\x94\x5e\xa6\xd2\xd3\x49\x12\x98\x73\xb4\xcc\x55\x33\xb3\xfc\xc6\xc8\x78\xf5\x44\x26\xd6\x99\x01\x17\xd7\x62\xaa\x9c\x9f\xd8\x0d\x4b\xe9\x51\xd2\xdb\xa0\xce\x3c\xba\x38\x89\xa3\x3a\x27\xf9\x45\x5a\x16\x96\x2a\x14\xf9\xa2\x11\x9f\x2d\xaa\xcd\xf5\xda\x9e\xda\x7e\xab\xbc\xcd\xe4\x07\x93\x55\xb7\xd9\x98\xbb\x56\x6f\x3c\xac\x16\xdd\x68\x31\x1e\x1d\xab\x85\x59\x9a\xb5\x06\xbe\xca\x9a\xb1\x78\x19\x47\xd7\xc5\x72\x9b\x7b\x31\xa7\x1e\x9b\x8f\x72\x9d\x82\x3e\x6e\xfa\xa3\xca\x90\xec\x71\x61\x9c\xc1\x85\x36\xdf\x7f\xfa\xd5\x71\x01\x3e\xc7\xa6\xef\x80\xe7\x0a\x06\x81\x72\x19\x91\x8a\x43\xe1\x11\x0a\x04\x76\x98\x84\x80\x42\x8a\x1d\xca\x84\x74\x94\xcb\x38\x41\xdc\xe6\x08\x50\xe1\x48\x4c\xb9\x52\x0e\xb0\x5d\x65\xbb\xd7\x70\x71\x71\xbf\x9b\x50\x0e\xe9\x65\xd4\x3c\xb4\x3e\xfc\xda\x29\x11\xe0\xcd\xbc\xfb\xe6\x7d\x3d\x9c\x6d\x95\x79\xba\xa2\xdc\x16\x4c\x25\x92\xf3\xb1\x9e\x4a\x55\xe7\x8d\xc0\xe1\x69\x2f\xa1\x46\xd9\x54\x40\xcd\x26\x9f\x26\x66\x6c\x16\x00\xa7\x3a\x8b\x3b\x15\x2f\x59\x4c\x85\xdd\xe8\x86\xfa\xc2\x1d\xe0\x79\x74\x58\x68\xfb\xdb\x69\x37\x93\x8e\x31\x67\x1d\x1f\x58\xd0\x38\xc1\xc5\xc9\xbc\x2a\xb4\x35\x6a\x8d\x3a\x0a\xfd\xf5\xba\x92\xab\x79\xa0\xdb\xd1\xc7\x8d\xa8\xd7\x8f\x1a\x14\xe0\x9a\xd9\x9d\x4d\x9a\x85\x7c\x01\x54\x8d\xce\x74\x6a\x8f\xa3\x46\xdb\x2d\xe5\x4b\xbc\x31\xf0\x8c\x59\x9c\x6d\xa7\x31\x21\x51\xd6\x5d\x05\xcd\xa1\xe6\x32\xab\x68\x52\x97\xc7\x92\x7b\x5c\x64\x5f\xe3\xa2\x18\xcb\xed\x3f\xfd\xe2\xb8\x20\xf2\x73\x6c\xfa\x8e\x40\x87\x42\xa1\x1c\x4c\x39\x86\x0c\x79\x8e\x8d\x25\x11\xd2\xa3\x8a\x4b\x17\xba\x80\x28\xc5\x5c\xe6\x01\xe1\x42\x89\x21\x74\xa8\xe3\x73\x4f\x3a\xc2\x97\xb6\x0d\xb9\xb7\x33\xfd\xc3\x7d\xa2\x33\xb8\xb8\xb8\xa3\x4d\x38\x02\xf8\xed\xd6\xc3\xaf\xdc\x62\xc9\x29\x78\x23\xef\x66\xf2\xe6\x7d\xbd\x34\x4c\x17\x67\xd0\x5d\xb7\xe6\x8b\xde\x20\x3b\xaa\x53\xba\x72\xe3\x45\x3a\x73\xca\xbd\x78\x7f\x9d\x86\x4b\x8c\x9c\x1e\x9d\x74\xfd\x86\xaa\x5b\xa9\x68\x2a\x68\xc0\xf2\xc0\x8d\xe2\x05\x1c\xc6\xdd\xb6\x20\xb5\x82\xe5\x85\x38\xea\x56\x43\x42\x5b\x56\x2e\x59\x8c\x96\x2a\x64\x3f\x8f\x3b\x5c\xf8\x27\xf9\xc5\xac\x52\x2c\xc4\xa3\xa9\x2e\x2f\x65\x61\xdc\x1b\x6a\xd1\xd1\x60\x4d\x93\x9e\x6a\x56\xb4\x76\x8b\x17\x47\x9b\x8c\xbb\xd8\x28\x43\x1f\xe6\x34\xec\xf4\x09\x5c\xcd\xa7\x1b\x23\x86\x07\x9d\xee\x48\xd3\xea\xa3\x52\x2c\x88\xef\x04\x03\x93\xec\x3c\xe9\x0f\xa3\xf3\x41\xb1\x61\xda\x7b\x5c\xe8\x67\x70\x21\x07\xfb\x4f\x57\x70\xf1\xdf\xf6\x77\x30\xad\x77\xe2\x42\x7c\x8e\x4d\xdf\x39\x44\x2a\x1b\x28\x07\xfa\x8a\x21\xe9\xbb\xc8\x95\x9e\x8f\x5c\xc9\x99\xe3\x4a\xc9\xa1\xaf\x3c\xe6\x7b\xc2\x43\x94\x2b\x57\x71\x2c\x14\xa1\x2e\xf6\x85\x64\xdc\x83\x94\xc9\x6b\xfe\xe2\xe2\x0e\x05\x11\x88\xa0\xcb\x71\x94\x40\xfb\x4d\xbf\x87\xdf\x2c\x06\x08\xbc\x91\x76\x33\x79\x73\x99\xb6\xa2\xc2\xe2\xcc\xa7\xc1\x48\x14\x72\x78\xb3\x69\xda\x62\xd8\xcc\x44\xe1\x12\x99\xb9\x26\x2f\xba\x84\xa6\x56\xb1\xa0\xe1\x5b\xf5\x31\xb3\x93\x0d\x5c\x28\x39\x8d\xf2\xa8\x5f\x9e\x68\x1b\xb3\xdd\xce\x0d\x92\x0d\xbb\xae\x15\x64\x7a\x58\xcf\x0f\x8c\xba\x93\x09\x6d\xad\xba\x79\x72\x17\xfe\x89\xbf\x28\x9b\x1d\xe2\x4e\x49\x32\xe4\x93\x45\x13\xe3\x90\x4c\x1d\xbb\x69\xf3\x68\x3c\xe9\x65\x5c\x51\x72\xaa\x7a\x33\xee\x2e\xca\x7a\xb5\x24\xa6\xd5\x8e\xeb\xf0\x11\xae\x35\xf5\x34\xb0\x97\x22\x58\x2c\xbb\xeb\xc6\x20\xd1\xce\xf9\x8c\x18\x89\x4c\x74\xbe\x6e\x75\xca\xcd\x7c\xa3\xb4\x1b\x38\xa9\x9d\x81\x05\x79\xf3\xd8\xe0\x7f\xdb\xdf\x87\xdc\x05\xff\x1c\x93\xbe\xe3\x80\x79\x92\x08\x9b\x51\x1b\x40\x4a\xa5\x8b\x31\x62\x04\x32\xa1\x24\xc4\x3e\x71\x88\x04\x00\x13\x49\x90\xcf\xa5\xad\x6c\xc9\x7c\x06\x99\x0d\xb0\x92\x02\x49\xee\xe2\x6b\xb0\xb8\xb8\xa1\x4d\x24\x85\xec\x72\x52\xbe\x6b\xdd\xa7\x17\xc7\x5f\xaf\x46\x12\xbe\x91\x76\x33\x79\x6b\x99\x16\xc7\xe7\x83\xec\x78\x10\xc6\xeb\xed\xd5\x36\xd7\x4f\x85\xcc\x2a\x81\x79\x4e\x4b\x56\x6a\x05\x3c\x5c\x4c\x1a\xb2\x6b\x77\x4a\xe3\xce\xd8\x4f\x42\xbd\xce\x60\x89\x86\x7a\x1a\xf6\xc6\x4b\x92\xb5\x63\x99\x5a\x27\x9d\x18\xe7\x57\xd5\x32\x69\x8f\x07\x99\xee\x9c\x87\x7c\xac\x71\x78\x00\xc3\x1e\x17\x27\xe9\x85\x28\x1a\x3c\x61\xf6\x06\xe1\xba\x31\x59\x0d\x6c\x7b\x34\x8c\xdb\x53\x6b\x3b\xb4\x75\xad\x57\x81\x56\xb5\xca\x93\x46\xbc\xd6\x8d\x15\x33\xc1\xd2\x68\x76\x03\x28\xba\xe9\xb5\xd6\xe2\x3c\x60\x5a\xa2\xaa\x4f\xec\x55\x52\x2c\x9b\xfd\x65\xb3\xd0\x8b\x6f\x95\x6a\x25\x3b\x89\x52\x75\x37\x7e\x42\x9c\xc1\x05\x7e\xf3\xd8\xe0\x7f\xdb\xdf\x87\x70\xc1\x3e\xc7\xa6\xef\x98\x14\x04\x28\x01\x7d\xc5\x15\x15\xc4\xb6\x3d\xe0\x23\xe4\xf9\xb6\x90\x4a\x71\xc6\x5d\x0f\x53\x44\x88\xe4\x94\x61\x45\x38\xb4\x7d\x61\xfb\x8c\x3b\x14\xfb\xc2\x23\x7c\x5f\x35\xba\xb0\x7d\x71\x79\x83\x82\x02\x46\xc9\xc5\xe4\xe3\xb1\xf5\xe1\x07\xd6\x29\x83\x27\x69\xf7\x8b\xbf\x6f\x11\xfe\x80\x81\xb7\x30\x81\x86\x7a\x32\xcc\x44\xfd\x41\x37\x3f\x2d\x8b\x00\xb3\x40\x51\xe4\x9b\x66\xc5\xca\x79\x8d\x52\xdf\xb5\xa3\x79\x39\x9a\x57\xa3\xa6\xb5\xd6\x3a\xd5\x6c\xa9\x90\x2e\x6e\x46\x8b\x72\xa7\xd8\xdc\x0e\x9b\xe5\xf6\xb4\xb0\x49\x57\xb5\x74\x36\xd9\x28\x66\x72\x56\x39\x37\xa9\xf9\x8e\x16\xd4\xf6\x73\xb8\xc7\xc4\xc9\x9c\x76\xfb\xad\x4e\xb5\x55\x4f\xf9\x81\xb9\xde\xac\xda\xa9\x4d\xbe\xd6\x63\xd3\x9a\xb2\x08\xaa\x58\x5b\x73\x5b\x1c\xd9\xb3\x4e\x3d\xd6\x58\x24\x97\xf3\x95\xd9\xb7\x1d\xaf\x1c\x9d\x77\xda\x8a\xe0\xcc\xbc\xa9\xcf\x12\x4e\x59\x76\x1a\xc5\x85\xd5\x64\x05\xea\x2e\x8b\xa2\xbd\x8a\x5b\xe3\x3d\x26\x88\x49\x0a\xf6\x76\x8c\x4e\x00\x18\x9f\xb7\x5e\x98\xd4\x1f\x01\x13\xe8\xdd\x98\xa0\x9f\x63\xcf\x77\x54\x29\x1f\x02\xc6\x6d\xe0\x3b\x9e\x43\x20\x46\x50\x11\x8e\x6c\xe8\x42\xe2\x2b\xcf\xa5\x14\x7b\x10\x53\xbc\x5b\xbf\x3d\x65\x13\xdf\xf3\x30\x94\x1e\x70\x6d\xee\x21\xdb\xbf\x76\xc4\x1c\x5e\x2c\xc2\x52\x28\x28\xb9\x98\x72\x3f\xb6\x1e\x7f\x66\x1e\x09\x8c\xc0\x15\x4c\x30\x71\x23\x26\x20\x5f\xea\x69\xd5\x89\xca\x79\xdc\xe8\xd2\x4c\xbe\xbb\xaa\xc5\xe6\xeb\x7a\xc9\x32\xab\x03\xcb\x51\xe3\x12\xae\xa6\xbd\x64\xde\xaf\x4c\x49\x3f\x9d\xc8\x64\x46\x1a\xcb\x17\xbd\xb0\xe4\x56\x96\x63\x66\xad\xbb\x7d\xd4\xad\x59\x83\x74\x0a\xd6\x4b\x28\xac\xd4\xcd\x78\x3f\x99\x95\xee\x7e\x0e\x77\x98\x50\x27\x69\x05\x9a\x45\x5b\x1e\x66\xe9\x5a\x7c\x98\x9a\x26\x46\x62\xb4\xde\x5a\x38\xcd\xd3\x2c\x3e\x68\xac\x92\xbd\x46\x76\x59\x59\x94\xd7\x69\x23\x9b\x68\x49\x64\xf5\x9a\x34\xe9\x14\xd7\xad\x6e\xce\x30\x62\x7a\xd9\x85\xe1\x24\xbd\x02\x9d\x59\xca\x99\x4f\x66\xc5\x66\xbc\x57\x28\xd4\xa5\xde\xdc\x0b\x01\xce\x60\x62\x52\x7e\x61\x52\x7f\x04\x4c\xbc\xdf\x4f\x90\xcf\xb1\xe7\x3b\x42\x80\xb4\x05\x87\x1e\xdd\x2d\xcf\xc0\x61\x36\xb0\x19\x06\x10\x33\x25\x80\xeb\x21\x2a\x6d\x8c\xb1\x6b\x53\x8a\x00\xf6\x1c\x48\x89\xf0\x30\xa4\x3e\x94\xca\x27\x36\xbd\x5a\x86\xba\xb8\xcd\x4d\x91\x90\x57\x10\xf3\xd0\x0a\x85\x90\x5c\x50\x06\x01\x22\xd7\x30\xc1\x6f\xc4\x04\x28\xe7\x26\x99\x4c\xbd\x96\xae\x15\xec\xce\xb8\xa7\x55\x9d\x30\x69\xe6\xda\xe1\xb6\x94\xaf\x57\x34\x39\xab\x57\x4c\xa3\x2e\xda\x1c\x8c\xdd\x69\xb8\xaa\x79\x79\x6b\xab\xc5\xda\x56\xdf\x53\xa1\x48\x2f\xd0\xa4\x4e\xaa\xdd\x1a\x64\x9e\x1c\x0b\x93\x93\x8c\x3d\x5a\xd0\xda\x6c\xb6\x9f\xc3\x3d\x26\x4e\x72\x8a\x46\xc3\x85\xe3\x56\xb7\xde\xb0\x42\x3d\x67\xb3\xb4\x9b\xc9\xce\xec\x1e\xdc\xcc\xd6\x59\x92\x28\x47\xe3\x6e\x6e\x12\xa4\x1b\x78\xd5\x1b\xe6\xa2\x4b\x3f\x65\x15\x02\x9a\x43\x41\xd2\x68\x9a\xd5\xc6\xc4\x1c\x8e\xfc\xb9\xd8\x66\x52\x45\xc2\x48\xab\x93\x6b\x57\xf9\xc2\x01\x93\xe9\xde\x4f\xac\xce\x60\x22\x9c\xbd\x30\xa9\x5f\x13\x13\xf8\x73\xec\xf9\xce\x96\xcc\x75\x7c\xe9\x63\x17\x79\xd8\xa5\xcc\xf1\x20\x71\x08\xa0\x00\x11\x66\x53\x85\xa5\xa2\x12\x01\x1b\x01\xa8\xa4\xc7\x98\x4b\x80\xe3\x52\xdb\x66\x82\x0b\xe4\x2b\x7a\x2d\xa7\xb8\xbc\x29\x41\x09\x44\x57\x62\xa7\x87\x56\x28\x08\x13\x98\x4a\xcc\x91\xb8\x86\x09\x76\x23\x26\xd8\x60\xb6\xa4\x42\x14\xaa\xeb\xc6\xd2\xaa\x80\x78\x39\x97\x1e\xab\xa2\x6a\x54\x12\x81\xa6\x46\x0d\x47\x4f\x88\xc6\xc4\xce\x74\x96\xb4\xda\x36\x2b\x9b\x6e\x33\xe9\xe7\xf5\x4d\x8d\xf5\xfa\x60\x28\x46\x6b\x4d\x67\xa5\x44\xce\x4e\xaf\xb5\xb0\xb8\x9a\x2c\x5d\xad\x62\xcc\x6a\x27\xe5\x27\x75\x62\xa6\xb2\x80\x56\x93\xb8\x3d\x14\xeb\x35\xd3\x8d\x41\x19\xaa\x98\xc5\x73\xa5\x6e\x7f\x96\x9b\xa4\xc2\x76\x72\x98\x4f\xb9\xa9\xf8\xca\xc7\xeb\xc4\xca\x45\xb9\xc2\x20\xcc\x6e\xc7\xf3\x56\x37\x34\x13\x3c\x03\x8a\xf9\xa4\x4a\xca\x70\xd5\xd6\xfa\x34\x6b\x8f\x46\x53\xd5\x9b\x82\xa2\xb6\xf3\x43\x89\xd9\x19\x4c\x8c\xb2\x2f\x4c\xea\xd7\xc4\x04\xfa\x1c\x7b\xbe\x43\xc8\x01\xcc\x21\x40\x12\xc2\x5c\xe8\x03\x17\x71\x61\xfb\xc0\x55\x90\xda\x9e\x94\x8c\xee\xbc\x90\x8f\xa0\x64\x36\x75\x7c\xe5\x29\x8f\x32\x8f\x49\x0f\x33\xce\xa5\x2b\xaf\x6d\xe3\x81\x8b\x99\x34\xa5\x48\x5c\xce\xc2\x1f\x5b\xa1\x00\x58\x08\x86\x18\xc1\xe8\x1a\x26\xe8\x8d\x98\xd8\xe4\x57\x36\x48\xd4\xac\x59\x66\xb5\x1a\x05\xcb\x64\x31\x65\xa3\x76\xbb\x19\x96\x44\x77\x30\x69\xc4\xb8\x82\x0d\x38\x06\xc8\xa3\x1b\x2f\x0b\xb7\x19\x7b\x1e\xad\x66\x2a\x41\x5a\xa4\x82\x5c\xab\xdb\x44\xd9\xde\xc4\x55\x2b\x63\x33\x19\x73\x95\x2d\x58\xf3\xc2\x7a\x30\xd1\xea\x87\xd2\xfe\x1e\x13\x27\x73\x4a\x86\xe5\xf5\x22\xbb\x49\xf7\x8d\x51\xcd\x1c\x4f\xd7\x21\x5c\x30\x07\x9b\xc5\x7c\xa7\x12\x4b\x4c\x2c\x0b\xf4\x65\x68\x94\x4b\x85\xc6\x4c\x44\xeb\x4c\x4c\x46\x09\x3b\x95\xd2\xd7\x24\x0f\x3b\x61\xc3\xc6\x56\x32\x23\xb2\xed\x59\x8b\x07\x28\xde\x6c\x54\x12\x46\x63\xb2\x1d\xaf\x77\x7e\x28\x11\x9e\xc1\xc4\xa0\xff\xc2\xa4\x7e\x4d\x4c\xc0\xcf\xb1\xe7\x3b\x9b\xf9\xd4\x71\x39\xf1\x6c\x49\x98\xe4\x40\x12\xe9\xba\xc2\xa6\xc2\xe1\xbe\x0b\x5c\x9b\x22\x5b\x32\xc4\x7d\x1b\xda\x84\xfa\xae\xeb\x53\xc6\x6d\x66\x7b\xc8\xc7\x10\xda\x12\x5c\xc9\xb1\xc1\xe5\x8c\x81\x11\x79\xf9\x6a\xde\x63\x2b\xe4\x0c\x48\xcc\xa8\x84\xf8\x5a\x8e\xcd\xc8\xad\x7e\xc2\x81\xcb\x4c\xd5\x1e\xa4\x07\xab\x41\x6e\x9b\x1d\xb7\xe6\xb1\x95\x31\xae\x4c\x1a\xb9\x58\x68\x5b\xfe\xb6\x54\x1f\x8d\x27\x60\x69\x58\x93\x72\xde\xdc\xb4\x9c\xe2\xaa\xc0\x2d\x27\xb0\x7b\xd9\xec\x48\xae\x42\xd8\xcc\x4e\xd6\xd3\x75\xbe\xd9\xad\xb8\x95\x5c\x7b\x31\xeb\x76\x46\xb0\x26\xf6\x73\xb8\xc3\x84\x77\x92\x4f\xe0\xb9\x5a\x67\x1a\x7d\xd5\x1c\xcc\xba\x62\x33\xa0\x28\xb7\xd5\xa1\xc1\xc7\x31\xb1\xd8\xf6\x31\x4b\x7a\x03\x67\xb9\xf2\x26\x8d\x15\x6c\x01\x5e\xcd\xcc\x42\x7d\x16\xe7\xb1\x95\xb0\xca\xbd\x1c\x01\x83\xb1\x41\xf3\x50\x77\xc2\x84\xaa\x8a\x4d\xac\x17\x8b\xc5\x7a\x58\xb3\xf7\x98\xe8\x9f\xc1\xc4\x4b\x48\xfc\x21\x30\xf1\xfe\x1c\x1b\x7c\x8e\x3d\xdf\x39\x2e\xb6\xa9\x2d\x29\x16\x44\xf8\x0a\xb9\x0e\x61\xca\xe3\x54\xb9\xca\x51\xcc\xb1\x81\x74\x05\x65\x1e\xe1\x1e\xf3\x95\x0d\x10\x45\x08\x0b\x2a\x3c\xe1\xb9\xdc\xb6\xbd\xc3\x6d\x88\x4b\x98\xb8\x1c\x1d\x09\x80\x2f\x6f\x7a\x3f\xb6\x1e\xde\x0d\xc2\x24\x14\xe4\x6a\x8e\x8d\x6e\xc4\x04\x5f\xb1\xc6\xb8\x46\x2a\x25\x32\x9b\xa7\x79\xb3\x39\x63\x51\x9b\x25\xdc\x6e\x03\x66\xe0\x92\x75\x72\x95\x2c\x69\x98\x3d\x57\x4d\x50\x3d\x16\x8c\xb2\x2a\x9d\x4b\x4d\xeb\xd0\xaa\xd7\xa2\xeb\xf1\x34\xdb\xb6\x32\x22\x5f\xb7\xb3\x9c\x0c\x62\x55\x6d\x1e\x8d\x4d\x73\x2a\x93\xa3\x4f\x7e\xc2\x3b\xcd\x27\x72\x83\x50\xf2\xa9\x5f\xee\xf5\xb2\xe6\x42\xd3\xfb\x2a\x51\x74\xb0\xb5\x1a\x30\xb3\x55\xeb\x4b\xda\xb4\x19\x36\x5d\x50\x4b\x2c\x21\xa8\xe1\xd9\xd8\x2c\x27\xc4\x90\x96\xeb\xf6\x00\x19\x0d\xc4\xcb\xa1\x28\xae\xe2\xda\x28\xb3\xe8\x8a\x95\xde\xc8\x1b\xdd\xd6\x3c\xbb\x1f\x3e\xd1\x39\x83\x89\x0e\x79\x61\x52\xbf\x24\x26\xb0\xfc\x1c\x7b\xbe\x73\x04\x92\xcc\x16\xd0\x75\xb0\x4b\x98\x70\x09\xf7\x21\x00\x8c\x21\xdb\x75\x30\xe6\x0a\x32\x21\x18\xe4\x18\xb9\x0a\x41\xe8\x79\x9e\x8d\x01\x82\x02\x48\xa1\x04\x60\xee\xb5\xa3\x81\xe0\xb2\x27\x90\x88\x93\xcb\xd9\xc6\x43\x2b\x64\x9c\x02\xcc\x11\xa1\xe4\x6a\x8e\x7d\x6b\x2d\x96\x77\xc6\x76\x98\x29\x94\x74\xdb\xb0\x62\xba\xd6\x0e\xa6\x05\x03\x93\x46\x90\x4e\x6d\x0b\xc5\xac\x85\xbd\x70\x95\x6d\x25\x5a\x4c\x73\x8a\x99\x60\x59\x58\x6f\x4a\x22\x1b\x65\x7d\x92\x1b\xc7\x89\x86\x4b\xeb\x62\x7e\x66\xe9\xed\x9a\x31\xda\xb6\xe2\xa1\x36\xea\x88\xf6\x42\x3f\x5c\x10\x3d\x60\xe2\xc4\x4c\x2b\x2a\x13\x9f\x2e\x92\x1d\xb3\x94\x73\x64\xdf\x77\x73\x75\x63\x93\xe8\xb0\xa1\x72\x40\x3f\x5c\x52\xaf\x21\x8b\x7d\xa1\xeb\x6a\x8c\x1c\x1d\x56\x7b\xdc\x9a\x24\x61\x0c\x94\x59\x34\x03\x16\x46\xdf\xa8\x17\x57\x8d\xc6\xb4\x9a\x32\x7d\xdc\x12\x6e\x7d\x2b\xc3\x5e\x22\x07\xf7\x39\xb6\x7b\x06\x13\xa7\x1e\x6a\xff\xf7\x47\xc0\xc4\xbb\x63\x27\x2c\x3e\xc7\x9e\xef\x7c\x2c\x25\x83\x8a\x7b\x8a\x62\x00\xb0\xb7\x4b\xda\x05\xe2\x1c\x13\x0c\x24\x74\x19\x50\x50\xd9\x9e\xf2\x1d\x1b\x63\x04\x90\xa3\x80\xc0\x98\xb8\xb6\x62\x5c\x70\x47\xf9\xd7\xfc\xc4\xc5\xed\x6c\x06\x30\xbd\xe8\x26\x1e\x1a\x21\xc3\x08\x08\x4e\x39\x22\xd7\x32\x6c\x2a\x6f\x44\x44\xac\xd8\x6e\x29\x5f\xd5\x56\x9a\x1c\x86\x2a\xe1\x6d\xcb\xab\xbe\xdb\x2a\x66\x26\x78\xb9\xe8\x19\x9d\x7c\x34\x91\x34\x8d\xe9\x50\x65\x96\xcb\xa5\x57\x34\x9a\x6e\xbb\xbc\x44\x7e\xc2\x28\x8f\xea\x46\xcd\xcf\xc7\x73\xbc\x59\x49\x35\x9c\x4e\x3c\xb6\xd2\x71\x7c\xc6\xd5\x54\xf0\xc5\x61\x06\xf7\x88\x38\x99\x51\x33\x16\xf5\x12\xb3\x66\xa5\xee\x06\xe3\x5c\xa1\x49\xfd\x4a\x7d\x10\xf3\xe6\x49\x31\x4e\xa9\x68\xd0\x1e\xf9\x23\xb3\x8d\x3a\x7c\xd9\xec\xc5\x74\x27\x18\x83\x4d\x61\xd9\xb0\x44\x9b\x2f\xc6\x6e\xc9\x9c\x4e\x92\x4d\x55\x58\xd6\xd7\xed\x60\x1b\x27\xa0\x1b\xa0\x7e\x36\xe8\x8e\x46\xfb\xc8\xa9\x75\x06\x11\xae\xf1\xc2\xa0\xfe\x08\x88\x78\xbf\x97\xe0\x9f\x63\xcd\x77\xbe\x64\xd4\xa7\x8a\x33\x85\x3c\x9f\x4b\x22\x39\x55\xbb\x75\x59\x60\xe8\x48\xea\x08\xa6\x5c\x57\x72\x08\x7d\xee\x70\xdf\x81\x84\x78\xbe\x74\x5c\xdb\xc5\xae\xb0\xb9\x8d\xec\x6b\x5e\xe2\x62\x0e\xcd\x20\xa5\xf2\x62\x25\xf6\xb1\x15\x52\x21\x21\xe6\x42\x4a\x7a\x2d\xc3\xa6\xb7\x56\x62\x63\x83\x81\x54\xde\xa2\xe0\xab\xda\x00\xd2\x8d\xd5\x32\x9c\x81\xd3\x5d\x6c\x73\xae\x25\xb9\xcf\x53\x3a\xa6\xcb\xfc\x4a\x04\xa3\x70\xd2\x53\x4d\x7f\x46\x2d\x3b\x11\x1b\x57\x1c\xa3\x0c\x6a\x7d\xb3\x53\xcc\x4c\x58\x3e\x35\x4e\x0d\x27\x34\xb6\x2e\x75\xbb\x76\x6c\x92\x9d\x06\x87\x48\x7e\x87\x09\xf7\x64\xad\x2e\x15\x2d\x67\xb1\xcc\x98\x66\xca\x9f\x55\x2a\x43\xcf\x9b\x0c\x6b\x25\x91\xea\x8b\xa0\x21\x73\x0e\xdc\x94\x0b\xb1\x85\xbe\x69\xa5\x5d\xb4\xc8\xb6\x42\xcf\x31\xcb\xe9\x6a\x5a\x9b\x15\xaa\x78\x55\x4f\xcd\xb6\x8b\x72\x7c\xd3\x34\xc7\xa5\x3c\x9a\x95\x05\xe8\xe4\x3b\x5a\xc8\xac\xfd\x21\xd9\x44\xed\x0c\x26\xda\xfa\x0b\x93\xfa\x23\x60\xe2\xfd\x5e\x82\x7d\x8e\x3d\xdf\xf9\x40\x02\x46\xa9\x0f\x3c\xea\x2a\x45\x05\x46\x88\x7b\x00\x08\xe1\x3a\xdc\xf6\x91\xc3\x05\xf0\x99\xef\x49\xa8\x04\x66\x36\x81\x90\xdb\x8e\x03\xa1\x47\xb8\x74\xa8\xab\xe0\x35\x4c\x5c\xdc\xc5\x66\x98\x52\x71\x31\x72\xda\xb5\xee\x03\x27\x4a\x18\x14\x02\x21\x46\xaf\x25\xd8\xf4\xd6\x42\x6c\x2c\x51\x6e\xd7\x85\xd9\x2c\xd2\x96\x11\xf8\xe5\x44\x76\x83\xa7\x9b\x39\x49\xa2\x58\x3b\x13\x9a\x93\xb2\xa5\xa6\x33\x0b\x66\x86\x70\xdb\x9d\x13\xe0\x8e\x97\xcc\x4e\x98\xc3\x76\xd3\x1d\xf4\x40\x7a\x0c\x3b\x22\x56\xae\x3a\xd1\xa9\x3e\xdb\xf2\x22\x2b\x5b\x6a\xa9\x8f\xf9\xf8\x04\x12\x27\xc9\x44\x72\xcd\x17\xb8\x3a\x17\x12\x24\x93\x09\xad\x85\x4a\xb5\x10\x0f\xf2\x41\x0d\x1b\x78\xb4\x19\xb8\xd3\xc9\x70\x69\x0c\x52\x85\x4a\xd4\xd7\x47\x6b\x5f\x6f\xf4\x06\x4e\x52\x65\x3d\x2f\xd9\x54\x89\x7c\x95\xcb\x5e\x48\xfc\xd5\xa6\x0e\x36\xc3\x92\xb6\x65\x31\xa8\x49\x92\xda\x5f\xb2\x4b\x94\xcf\x40\xa2\xd9\x79\x61\x51\xbf\x26\x24\xe8\xe7\x98\xf3\x9d\x02\x12\x50\xc7\x63\x90\x49\x2e\x20\x55\xdc\xf3\x04\xb0\x99\xcf\x6d\x4f\x28\x81\x01\xe7\x36\xc5\x80\xd8\x0e\x60\x02\x0a\x44\x15\xb5\x05\x02\x8e\xef\xb8\x2e\x44\x9e\x73\xb5\x10\x7b\xd9\x11\x10\x0a\x2f\xbf\x5d\xf0\xb1\x15\x52\x80\x77\xf9\x0f\xc5\xec\x5a\x82\x4d\x6f\x2d\xc4\x46\x13\xe5\x86\x6c\x35\x06\x24\xa5\x7c\xaf\x93\x77\xf0\xb4\xc5\x92\x71\x3c\xae\xc6\xf3\xb3\x74\xa7\x95\x53\x8d\x30\x5b\x88\x8a\x55\x05\xc9\xea\xb4\x51\xf3\x58\x91\x1b\xa4\x02\x7c\x25\x6a\xba\xeb\x75\x07\xee\xb0\xe5\x6e\x3c\x10\x0d\x9d\x8e\xed\x95\x7b\xad\xb6\x16\xab\xe5\x9f\x36\x27\xdc\x13\x33\xad\xe1\x41\xa3\x24\xfd\x6a\x25\x37\xb4\x46\x26\x2f\x8d\xcd\xb8\xdd\xb6\x5b\xdb\x20\xdd\x95\xcd\x3e\xca\xa2\xc1\x46\xeb\xb4\x6a\x9e\x39\x5b\xad\xcb\xd5\x79\xd6\xcc\xd0\x9a\xea\x8c\xbd\x22\x40\xfd\x76\xb8\x2d\xfa\x33\x16\xeb\xb5\xac\xd4\x78\x9d\x18\xb7\x3a\x7a\x75\xcb\x2a\x8a\xef\x43\x27\xe3\x0c\x26\xea\xe2\x85\x49\xfd\x9a\x98\x20\x9f\x63\xcf\x77\x14\x71\xec\x21\xc4\x7c\x6c\x7b\x92\x10\xcf\xe1\x42\x71\x02\x3c\xa4\x7c\xc8\x31\x13\x84\x42\xc9\x6d\x20\x85\x2f\x5c\x84\x5c\x64\x43\x9b\x40\x24\xb0\xf0\x90\x8f\x38\xbf\xf6\x0e\x03\x70\x71\x13\x9b\x51\x26\x2e\x6f\x62\x3f\xb6\x42\xc2\x00\x12\x42\x08\xc0\xae\x25\xd8\xf4\xd6\x42\x2c\xcc\x6d\x41\xe0\x6c\xa7\x6d\xcb\x9c\x13\x0a\x92\x15\xbe\x76\x51\x37\x95\x6e\x86\xb9\x1e\x59\x05\xab\x49\xba\xaf\x87\x45\xb3\xb0\xf1\x56\x9b\xb9\x99\xcb\x2d\xf2\x64\x61\x8d\xe3\x13\x53\x67\x49\x2d\x36\x5f\x25\xe6\xb3\x8d\xb1\x6a\xc6\xe2\x66\xaf\x9a\x47\x3d\xa8\x21\xb7\x30\x7e\x7a\xaf\x87\x7b\x32\xa7\x31\x47\x8f\x96\x54\xd9\x72\x5c\x63\x59\xc9\xfa\xe5\x8d\xdd\xac\x34\x9a\x7a\x67\x1b\xe7\xb6\xb3\x9a\x2a\xb3\x5e\x56\xad\x56\xb6\xbb\x0a\xda\xa0\x3d\x59\xbb\xee\x66\xe3\xad\xf2\x41\x67\x51\xcf\x79\x4e\x36\xdd\xd6\xd3\x15\xa3\x2d\x65\xad\x5c\x68\x48\x2b\xbb\x29\x85\xae\x1b\x54\xf7\x42\x64\xcf\x60\xa2\xf6\x47\x3c\xec\xf4\x7e\x4c\xe0\xcf\xb1\xe7\x3b\x40\x15\xe7\xae\x23\x19\x60\xc0\x75\xa0\x43\x09\xe6\x84\xfa\x42\xf8\x0a\x33\x85\x11\x61\x0e\xa1\x0e\x62\xb6\x54\x8a\x4a\xee\x43\x49\x7c\xcf\xdf\xe5\x27\x12\x52\xdb\xbd\x7c\x4f\x9b\x7e\xa7\x97\x83\x23\x46\x29\xbd\xb8\x9d\xf7\xd8\x0a\x09\xe4\x18\x4b\x04\x38\xbb\x9a\x62\xe3\x1b\x31\xb1\x6a\x8e\xfc\xc2\xa0\xd3\x32\x66\x4e\x3d\xe9\xa5\xa2\xd9\x58\xcf\xe9\xe5\xd2\xf3\xd4\x6c\x38\x51\xb4\xed\xaf\x07\x25\xcc\x8c\x4d\xbf\x3e\x4d\x2f\x94\x91\x5e\xe5\x6b\x1b\xbc\xf5\x12\x39\xdd\x71\x47\x85\xd1\x3a\x6c\xeb\x35\x5c\xa7\xd2\x6e\x4d\x79\x74\xe2\xf8\x46\x00\x92\xab\xd1\xd3\xa1\x58\xe7\x24\x9d\xc8\x78\x25\x31\x8f\xc7\xe7\x63\xb5\x29\x08\x29\xe7\x85\xd2\xc8\xf4\xec\x49\x2d\xcc\x58\x8d\x61\x26\xdf\xcb\x8b\x61\xe8\x4c\x09\x44\x2b\x3d\xeb\xf5\xea\x6e\xc6\xc1\xf5\x5c\xb7\xac\xcd\x17\x23\xb3\xd4\xeb\x8e\xbb\xfd\x8a\xdf\x8d\x76\xfb\xa4\xef\xc6\x57\x7d\x32\xf7\x4b\x32\x60\xfb\x4d\x6c\xfd\x0c\x26\x2a\x2f\x2f\x04\xfd\x9a\x98\x40\x9f\x63\xcf\x77\xbe\x82\x18\x33\xe6\x12\x97\x62\x17\x10\x9b\x51\xe5\x12\xaa\xa8\xe7\x71\x4a\x80\x87\x31\xb2\x85\x8b\x05\xa1\xcc\xe7\xd0\x26\xcc\x11\xee\x0e\x68\xc2\x67\x90\x41\xe2\xe0\x8b\x45\x27\xfa\xfd\x8a\xd5\x73\x8e\xf8\xe5\x04\xfc\xa1\x15\x62\x4e\xb0\x90\x14\x13\x7e\x35\xc5\xbe\x75\x73\x22\x46\xaa\xe6\x70\x6d\xd4\x44\x3c\xdf\x56\xeb\x14\xf5\x20\x2c\x9b\xc6\x66\x62\x14\xf5\xfa\xd2\xb5\xad\x69\x2f\x3e\x60\x3d\x94\xea\x56\xb6\x8e\xb7\x5e\x3b\x7e\x2a\x59\x8f\xce\x02\xa6\xa5\xad\x65\x81\xce\xa2\x61\xdd\x9d\xb5\x44\x7b\xd5\x4f\xd1\x7e\x41\xea\xf1\xcd\x38\xe0\xfd\xa7\x0d\x3b\xe7\x24\xaa\x47\xdb\x24\xe5\x1e\x0a\x6b\x2b\x54\x60\xc3\xc5\x74\x3e\x8c\x85\x0a\x25\x7b\x2c\xb5\xd8\xc6\x9b\xa3\xfa\x90\x0f\x78\x26\x4c\xce\x8c\xda\xd6\x9c\xb4\x9c\xb6\xea\x35\x86\xcb\x95\x45\x48\xaa\x5e\x2e\x39\x46\xd6\x5b\x20\xa7\x97\x61\xfd\x26\xce\xe6\x78\xa2\x1b\x90\xd6\xb0\xb3\xd8\xc7\x4e\xda\x19\x4c\x58\x7f\xc4\x03\x80\xef\x2f\x3b\xc1\xcf\xb1\xe7\x3b\x4e\x81\xaf\x3c\x7f\xff\x52\x66\xac\x28\x10\x04\x71\x8f\xbb\xcc\x87\x36\x86\x3e\xc0\xc8\xf5\x7d\x4f\x38\x14\x62\x65\x3b\xc8\x77\x6d\xec\x12\x81\x38\xc1\xae\x44\x0a\xb2\xcb\x07\x00\xe9\xf7\xcb\x37\x4d\x99\xdc\x79\x80\x37\x5b\x21\xc6\x90\x60\x29\x18\xe4\x57\x73\xec\x5b\x37\x27\x70\xad\xc4\xfd\x20\xde\xaf\xd2\x72\x37\xe1\x37\xd7\xcb\x74\x2f\xb3\x32\x66\x31\x19\x40\x3d\x3a\xd9\xc4\xf2\x25\xbd\x33\x2a\x8b\xfe\x22\x35\x73\xb3\x93\xfa\xb0\xb7\x59\x4e\xb2\x03\x27\xe5\x0d\x87\x89\x99\x5b\xcd\xac\x16\x29\xb8\xf6\x63\x10\x89\xfc\x30\x1c\xc7\x0b\x46\xb9\x61\x4e\x9e\x2e\x15\x39\xa7\x97\x27\xd2\xc3\x36\x1a\x76\xd3\x8d\x52\xc2\x6d\x68\x1e\x1c\xd7\x64\x25\x9e\x6b\xfa\xaa\x37\x4f\xf2\x54\x51\x0f\x0b\x49\x16\xa6\x66\xd5\xe2\x92\x18\xf9\x46\xd6\x5c\xd6\xb6\xfd\x64\xa0\x9b\xa3\xad\xa1\xcd\xe0\x60\x99\x11\x7a\xa0\x37\x72\xb6\xb5\x9a\xe6\xac\xa5\x09\x5a\x0b\x6b\xb9\xdd\x0d\x1c\x17\x67\x30\x51\xfc\xdf\xc3\x4e\x3b\x4c\x80\xcf\xb1\xe7\x3b\x89\x99\x0b\x15\xf4\x81\xe3\x43\xdb\x97\x0c\x0b\xa0\x1c\x20\x15\x95\x8a\x22\xe8\x51\x85\x3d\xcf\xc3\x1c\x78\x08\xfa\x3e\xf1\x3d\x68\x03\x69\x3b\x10\x61\x9b\xb8\xbe\x63\x5f\x2e\xc5\xd2\xef\x97\xf7\x1f\x38\x10\x44\x5c\xcc\x27\x1e\x5b\x8f\xbf\xb9\x00\x77\x19\xc5\x15\x4c\x90\x5b\xb7\x27\xa8\x39\xcb\x74\x45\x41\xd8\xd1\x46\x51\x63\xab\xd1\x60\x34\xc8\x7a\xcd\x1e\xf6\xcc\x15\xe8\xc6\x40\xcc\x0a\x73\x93\x75\x96\x55\x4b\x8b\x49\x7f\x5b\x6c\x6e\xe9\xd0\x47\x85\x4e\x6b\x64\x87\xda\xbc\xb9\x36\xdb\x85\x7e\xb4\xe6\x57\x45\xcb\x92\xa8\xec\xc8\x36\x6f\x95\x9c\x02\x3e\xec\x0c\xec\x31\x71\x32\xa7\xb0\xd7\x2c\xd8\x61\x3e\x96\x2d\x4e\xf2\x66\xbd\x1f\x38\xc8\x35\x0b\xd3\xde\x40\xaf\x66\x9a\xe3\xf6\xc0\xcd\x91\x78\xaa\x55\x14\x8e\x81\x87\xd6\x76\x32\x6e\xf8\x9d\xe5\x9a\x8f\x7c\x2a\xb8\xb7\xee\xe5\x5a\x75\x73\xd8\xb1\x06\xbe\x9f\xd3\xb7\x8d\x64\xbc\xb3\xea\xfa\xb9\x61\xa7\xb6\x83\x5f\xfc\xdc\xe5\x09\xe3\x7f\x0f\x3b\x55\x22\x7f\x41\xf2\x73\xec\xf9\xce\x85\x84\x50\x49\x11\xf2\x15\x41\x0a\x79\x10\x38\x48\xda\x98\x03\xc7\x51\x8e\xbd\x83\x13\xb1\x95\x22\x48\x22\x81\x3c\x47\x11\x22\x08\x12\x98\x7a\xd0\x21\x04\x33\x76\xf9\x50\x2c\xfd\x4e\x2f\x6e\x62\x73\x28\x08\xb9\x58\xa8\x7d\x6c\x85\x88\x50\x4a\x00\x85\x54\x5c\xcb\xb1\xc9\xad\x97\x27\x44\x4a\x6f\xd4\xb3\x4b\x9a\x20\x73\xbd\x90\xb7\xcd\xd5\x22\xba\x18\xe8\xd1\xca\x82\x26\xfa\x61\xc1\xa1\x7a\x37\xd1\x81\xc0\xb1\x92\xed\x9e\x91\x49\xce\x86\xb9\xb0\x3a\xde\xf8\xc6\x14\x8c\x78\xdb\xea\xc1\xd2\xbc\xde\x72\x83\x55\x85\xa6\x10\x8d\x29\xa7\x4e\xf3\xc3\x52\x66\xf3\x94\x63\xdb\x27\xf9\x84\x63\x27\x92\xc4\x72\x7c\x7d\x52\x99\x66\xa3\x93\x71\x76\xb3\xdd\xd6\x6a\x51\xa7\xd5\x32\x72\x33\x6b\x85\xc7\x19\x77\x98\x59\x95\xa7\x4b\x5b\x0b\x32\xb5\xad\x5e\x71\xf8\x70\xdd\xe8\x38\x6c\x9a\x94\x41\xd4\x59\xb6\x6c\xaf\xd7\x5d\x1b\x56\x3a\xa6\xd6\x61\xb2\x31\x16\xb1\xb0\xb6\x7f\x2d\x42\xfc\xdc\xe5\x89\xc2\x4b\x93\xfa\x35\x31\x21\x3e\xc7\x9e\xef\x24\x40\x0e\xf0\xa9\x82\x4a\x51\xc0\x1c\xe9\x4b\x8f\x09\xa1\x08\x23\x8c\x63\xc7\xb3\x91\x6f\xdb\x80\x32\xc1\x99\xeb\xf9\x0a\xd8\x2e\xa2\x40\xf9\xd4\x95\x9e\x0f\x6c\x61\xef\x5c\x01\xdf\xff\x77\x06\x13\x17\x37\xb1\x39\x92\x57\xde\x9d\xf9\xd8\x0a\x11\x40\x54\xee\xdc\x9f\xb8\x96\x63\x93\x5b\xb7\xec\xa8\x36\x4d\x42\xa2\x68\xd9\xa6\x51\xcf\xce\xd2\xb4\x35\x2a\xca\x70\x39\xe9\xd4\x43\x6f\x86\xa3\x89\x59\xae\xcc\xe1\xc6\x13\xf9\x60\x38\x32\x93\xab\x42\x2b\xa3\x78\x27\x9b\x69\x19\x9b\x75\x2b\x68\x94\x0a\x4c\xf3\xc6\xc5\x61\x31\x9d\xb0\xb2\xe6\xb0\xe4\xea\xcb\x61\x7c\x44\x9f\xde\x3f\x6e\x9f\xbe\xef\xa9\x1c\xab\x92\x4d\xce\xcc\x8f\x64\x37\xc8\x85\xd5\xc5\x3a\x39\x33\x1d\x4f\x06\x8e\xd5\xf0\x51\xd7\xcc\xe4\xba\xb3\x60\x12\xcf\x37\x92\xd0\x99\x0f\x66\x41\x43\x33\xd7\x13\xbd\x8d\x6b\xf1\x3c\xca\xce\x16\xad\x94\x41\x6c\x26\xa6\x45\xab\xbc\x5a\x78\xaa\x3d\x8b\xe7\xe1\xa2\xbe\x83\x41\xfc\xdc\xe5\x89\x9c\xfb\xc2\xa4\xfe\x08\x98\xe0\xef\xc6\x04\xff\x1c\x7b\xbe\x93\x88\x2a\x22\x7c\x25\x5c\x0c\xa5\x42\xd8\x11\x14\x40\xe2\x79\x3e\x53\x98\x49\xe1\x39\xb6\x72\x20\x75\x3c\x41\x14\x50\x84\x60\xca\x20\xf1\x31\x44\xd4\x13\x84\x2b\xdb\xbf\xe6\x27\x2e\x66\x0c\x9c\x32\x7c\xf9\x92\xdd\xbe\x75\x5f\x77\x82\x54\x32\x02\x21\x93\xf2\x5a\x8e\x4d\x6e\xcd\x27\x68\x4e\x55\x4a\xcc\x30\xda\xa4\xb7\x48\x69\x35\xec\x3b\x3d\xbb\x85\x18\x5b\x37\x64\xb7\x98\xec\x97\x61\xab\x26\xd6\x39\xaf\x9b\x61\xcb\xf2\xc6\xcb\x65\x9b\xba\x36\x83\x8b\x62\x92\x65\xfb\x35\x63\x26\xd2\x83\xd1\xa6\x94\xac\xae\xad\x49\x68\xe5\x1b\x24\xb6\xea\xb4\xdb\xb6\xf9\x94\x4f\xd8\x27\x66\xda\x1f\xab\xa6\x67\x36\xfd\x61\x17\xea\xa3\x5a\x2f\xd1\xca\x1a\xca\xf1\xb6\x75\x51\x1a\x74\x12\x8a\xe5\x98\xca\x4d\x84\xe1\x90\x4a\xb3\x55\x35\x6a\xd2\xa2\x63\x27\x55\x8e\xc7\xc6\x5d\x7d\xbc\x0e\xd2\x81\x5b\xed\x0f\xe2\x7a\xb3\x56\x29\x37\x44\x73\x3a\xaf\x83\x8c\x8c\x9b\xd1\xdd\xc0\xf1\x33\x97\x27\xb4\xe8\xff\xee\xd9\xed\x30\xc1\x3e\xc7\x9e\xef\x7c\x4a\x5c\x00\x24\xf7\x08\x81\xbe\xcf\x99\x4b\x04\xf7\x88\x72\x1c\x28\x7c\xaa\xa8\x4f\x91\x4b\x6d\x0a\x5d\x5b\x32\x01\x80\xe3\x4b\x47\x40\x81\x24\xe5\x12\xd8\x98\x73\x71\xad\xee\x74\x39\x3a\x62\x5c\x90\xcb\x91\xd5\x43\x2b\x84\x90\x31\x09\x89\x64\xf2\x5a\x8e\x8d\x6f\x3e\xee\x54\x37\xb4\x9c\x5f\x2b\xfb\x12\xad\xb3\x7e\x8d\xf1\x74\xa9\x39\x90\x95\xb5\x5d\x73\x27\x8d\x8e\xb6\xa4\x8b\x78\x67\x5c\xa7\x89\x9e\x47\x8a\x4e\x7c\xe2\xaa\x99\xd8\x36\xdb\x5a\xcf\x2f\xa4\x6d\x2b\x6a\x78\xa0\x93\x59\x95\xea\xa4\x10\x35\x17\x5e\xa9\x53\x29\xe7\xbc\x99\x4e\x9f\xea\x4e\xf6\xc9\x9c\xa6\xab\x79\xb7\xe7\xd1\xf9\xcc\x1d\xa4\x70\x29\x3a\x9e\x27\x03\xc3\xab\x35\xc6\x02\xcf\x17\xad\x54\x74\x3b\xd0\x92\xe3\x68\x33\xda\x99\x47\x55\x7c\x00\x87\xed\x4e\x19\xf5\xe3\x9d\xe2\x20\x99\xc0\x1b\x83\xf4\x61\x33\x55\xe9\x77\xc4\x68\xae\xea\x39\x63\x1c\xcb\x77\x27\xc5\x4d\x03\xed\x63\xa7\x33\x97\x27\x34\xf1\x47\xdc\xb3\x7b\x77\xdd\x09\xd1\xcf\xb1\xe7\x3b\x8f\x43\x07\x22\xe4\xf8\x0e\x04\x0a\x42\x89\xa9\xe4\xb6\xeb\x13\xce\xa4\x2f\xa5\xc3\x21\x53\x5c\x2a\xee\x41\x65\xbb\xae\x8f\x10\xb5\x3d\x9f\xfa\x1e\xa3\xae\xa3\x94\xc2\xfc\x9a\x9f\xb8\x1c\x1d\x71\xc9\x2f\x1f\x0f\x7c\x6c\x85\x80\x63\x4e\xa0\x40\x04\x5c\xcb\xb1\xf1\xad\xb1\x93\x74\x1d\x3d\x58\x72\xbd\xa8\xb7\xcd\xb6\x9a\xc9\x8c\xed\x0f\x1d\xb7\x41\x29\x95\x99\xc9\xb6\x94\x1d\x4c\xfd\xa6\x6c\xbb\xcb\x05\xc1\x09\xea\xf5\x5a\x2b\x95\xe8\xfb\x0b\x47\xb5\x82\xcd\x54\x5b\xae\x07\xa5\xe1\xa2\x96\xe9\xac\x9d\x7e\x74\xdc\x6f\x12\x0a\x06\x4e\x50\x8b\x3f\xe5\x13\xed\x93\x7c\xc2\x90\x9d\x42\x3d\xb9\xec\xad\x8c\x45\xbd\x1d\x1d\xf5\xac\xde\x72\x69\xac\x07\xdd\xd0\xb3\x3a\xb1\x7a\x6e\xbc\xb0\xc7\x41\xc2\x01\x1b\x59\x49\xce\x1a\x59\x1d\xb4\xdb\xcd\x44\x8e\x23\x63\x66\xc7\x58\x6d\x5a\xf3\xaa\xc9\x7e\x74\x38\x31\x8d\x09\xca\xab\x76\x3d\x1f\xef\x79\xf3\xc3\xfe\x47\xfc\xcc\xe5\x09\x8d\xbe\xdc\x9f\xd8\x1f\x7f\xfa\x2f\xc7\xc4\xfb\xfd\x04\xf9\x1c\x7b\xbe\xf3\x80\x74\x11\xa7\x54\xd9\x18\x42\x20\x39\xe3\x1e\xb3\x77\xff\x71\x48\xa9\xeb\xfb\xd0\x61\x18\x28\xcf\x61\x98\x09\x9b\x38\x48\x00\xc7\x61\xc2\x53\x88\xb8\x48\x39\x0e\xb9\x86\x89\x8b\xfb\xd8\x5c\x42\x88\x2f\xee\xe8\x3d\xb6\x42\x80\x01\x97\x08\x52\x08\xae\xe5\xd8\xf8\xd6\xf3\x4e\x32\xe1\xe6\x60\x73\x62\x58\x89\x66\x5b\xda\x73\x7b\xee\xd6\x9b\x25\xe1\xb4\x56\xdc\x69\xa1\xa0\x3f\x0b\x13\xdc\x36\x49\x7f\xb5\x58\x00\xdc\x35\x98\xcb\x2a\x9b\x95\x66\x55\x46\x25\x07\xbb\xf3\x14\xf3\xc3\xba\xe7\x74\x36\xeb\xee\x38\x66\x91\xd8\x2c\xda\xd0\xa3\x73\x75\x78\xb5\xd2\x01\x13\x27\x11\x0c\xdc\x06\x19\xbb\xb7\x70\x92\xd3\x1e\xcc\x2e\xa8\x5e\x16\xad\x76\x1c\x91\xc4\x76\x88\xa4\x96\x2b\x79\x76\x6e\x34\x6b\xe2\xa8\x16\xf5\xeb\x38\xef\x7b\x2a\x98\xe4\x26\x9b\x4d\xd7\xef\x47\xf9\x70\xd5\xa8\xc5\xc1\xd4\x71\x96\x73\xb6\x61\x04\x74\x0b\x31\x67\x14\x96\x8c\xb6\xec\xec\x2f\x4a\x9c\xc1\x04\x79\xb9\x3f\xf1\x6b\x62\x02\x7f\x8e\x3d\xdf\x39\xc2\x13\xd0\x96\xc4\x75\xa5\xed\x42\xcf\xf5\xf6\x07\x09\xa9\x63\x2b\xc0\x04\xb0\x39\x61\x3e\x81\xb6\x23\x11\xf6\x94\x74\x98\x60\x14\x10\x84\x00\x96\xbe\xf0\x7c\xc2\xaf\xd5\x62\x2f\x5f\x8f\x10\x90\xa2\xcb\xb5\xd8\x7d\xeb\x2e\xee\x92\x82\x0b\x82\x08\x17\xe0\x5a\x8a\x8d\x6f\x3d\xee\xc4\x7b\xad\xf4\xb8\x6a\x0c\x67\x19\x17\xe6\x3c\xd5\x60\x24\xdd\xc9\x7b\x69\x19\x9f\xd0\xac\x64\x8e\x9d\xae\xe9\xd9\x4e\xd1\xef\xf9\x16\x2b\x96\x3a\x54\x0b\x83\x54\xad\x33\xc7\xe9\x34\x68\x14\x73\x53\x92\xc0\x39\xbb\x9c\x19\x72\xa3\x14\x2f\x07\x33\x2f\x41\xba\xfd\xed\xba\xf2\x14\x3a\xb5\x4f\x0c\x53\x2d\x58\xbb\xb0\x8d\x46\x55\x71\xd3\xc0\xb1\x4c\xa9\xc5\x20\x5b\x46\xc3\x14\x6a\x72\xca\x1a\x89\xaa\x48\x4b\xac\x8d\xbd\x4c\xe0\x87\xb3\x5a\x71\x9c\x70\xa2\xb3\xa2\xe3\x8e\x67\xdb\xd2\xbc\x24\xa3\x99\x0d\x30\x32\xc3\xed\xba\x3b\xde\x6a\xa5\xd8\xac\xaa\x55\xdd\xf2\x78\x94\xdf\x43\xe2\xcc\xdd\x09\x0d\xbd\x7c\x3f\x41\x52\xfb\x15\x21\x81\x3e\xc7\x9c\xef\xa0\xe2\x18\x31\xe6\x48\x17\x7a\x4c\x79\x82\x2a\x0f\x01\xc4\xc1\xfe\xbd\xfd\x04\x08\x48\x08\xf5\xa8\x8f\x00\x84\x42\x3a\xca\x71\x28\x47\xd0\x95\x0e\xa2\x8c\xfa\xc7\x6b\x3f\x97\x20\x71\x71\x1b\x5b\x20\x4e\x2e\x1f\x77\x7a\x6c\x95\x84\x08\x89\x04\xa0\xf0\x5a\x86\x8d\x6f\x3d\xed\xb4\xa6\xdb\xdc\x70\xe1\x66\x1a\xbc\xd5\x9c\x67\x13\x6e\x21\x93\x5b\x6b\x9d\x9a\xe5\x35\x37\x9a\x15\x38\x8c\xd7\x37\x99\xdc\x6c\xd0\xf6\xbd\x1c\x49\x6e\xb7\xcb\xba\x5f\xea\x29\xba\x4c\x30\xb7\xd3\x4d\xa4\xfc\x69\x7b\x65\x64\x0c\x3d\x69\xa4\xe0\xb8\xbb\x1a\xc7\xfa\xd9\xde\x22\xc6\x4f\x20\x71\x32\xa5\x40\x33\x82\x4d\x95\x24\x36\xc9\x42\x61\x69\x6f\x2a\x40\x1b\x96\x24\xef\xaa\x91\xec\xc1\x69\x3f\x3b\x0b\x5b\xca\x04\x41\x79\xda\x5b\x8c\x81\x5d\x4a\x79\x8b\x7a\x76\x96\x8b\x8e\xfc\xad\xcc\x9a\x89\x5c\x65\x4a\x85\x59\x2c\xad\x4b\x66\xb9\x9a\x6f\x4f\xaa\xd5\xd6\xb6\x42\xa3\xc5\x7d\xe4\x74\xe6\xf2\x84\x06\x5f\xee\xd8\x25\xb4\x5f\x11\x12\xf0\x73\xcc\xf9\x4e\x01\x57\x0a\x1b\x30\x85\x3d\x97\x70\x28\xb0\x4d\x04\xc0\xbe\x24\xdc\xf5\x00\xb0\x7d\x85\xb9\x27\x1c\x49\x3c\x17\x13\x4f\x11\x24\x6d\xcf\x23\xc0\xb7\xb9\x0b\xa5\xcb\xe0\xb5\x0c\xfb\x72\x5d\x49\x60\x01\xaf\x00\xe6\xa1\x55\x02\x28\x09\x86\x18\x5d\x7d\xdb\x19\xbe\xf5\xb0\x53\x34\x99\x0b\x3a\x4e\x0f\xeb\x6e\xab\xd8\xef\x24\xa3\x35\xdf\xd4\xf2\xb1\x9e\xdf\x5a\xd4\x70\xb2\xaa\xca\xe3\xa9\x57\x2e\x8d\x45\xda\x6d\xb5\x52\x21\x8f\xa6\x07\xf6\x0c\xf5\x82\x71\x98\x1e\xd8\x72\x39\x2d\x14\xf2\x20\x0c\xb5\xc0\xc8\xd2\x74\x59\x15\xfb\x85\x7a\x6c\xd1\x93\xee\x53\x32\xd1\x3a\xbd\x89\x5d\xd0\x46\x66\xaf\xb2\x1a\x16\x42\xc2\x49\xd8\x0b\x33\x9d\xcd\xcc\xef\x37\x87\x4a\xc5\xb3\x4d\xaf\xd3\x70\x36\xc5\xdc\xca\x19\xcd\xd6\xd1\x72\xcd\xb3\xf3\x25\x5f\x6b\xb6\xba\x9b\x65\x7f\x9b\x2f\xe7\xf5\x68\xb5\xe5\x74\xb1\x67\xf4\x84\xdb\x04\x9d\xb9\x0f\xa2\xc5\xb0\x3a\xdf\xff\x40\x6a\xfc\xcc\xdd\x09\x6d\xfb\x72\xc3\xee\x8f\x00\x89\xf7\x27\xd8\xe0\x73\xcc\xf9\xce\x55\xd0\xf5\xb8\x6d\x3b\x40\x21\x64\x43\x25\xa0\x2b\xa4\xe3\x41\x0e\x3d\xe0\x78\x36\xf5\x84\xa7\x5c\x24\x04\x22\x90\x60\x80\xa8\xcf\x7c\xe0\x41\x6a\x43\x8f\xdb\xae\x0b\x2f\xbf\xed\x8c\x7e\xbf\xfc\x9e\x1a\xb1\x0f\x86\xde\x6c\x15\x54\x48\x89\x09\x95\x57\x5f\x76\x86\xe1\xad\xfb\x75\xc4\x85\x6c\xb2\x22\x41\xa8\x3a\x6e\xe0\x80\x66\xa6\xbc\xb4\x9b\x2d\x3c\xcb\x67\x73\xf1\xf2\x2a\xe7\x3b\x2b\x50\x0f\x3d\x35\x5b\xb5\xa2\x7e\xb8\x9a\x15\xdc\xfc\x96\xe7\xa0\xa7\x63\xda\xc9\x8f\x5a\x96\x61\xa3\xad\xf6\xff\xd9\x7b\xb3\x1e\xd5\x91\x65\x5f\xfc\xfd\x7c\x8a\xa5\x7e\x59\x57\xa2\xf7\x26\xe7\x4c\xf7\xd5\x79\xb0\x8d\xc1\x36\x93\x01\x1b\x30\x57\x47\x2d\x8f\xcc\xf3\xcc\xd6\xff\xbb\xff\x05\x35\x30\x54\x51\x83\xa1\xaa\x57\xef\x7d\xd0\xd2\x52\x65\xb9\xf8\x39\x32\x32\x32\x22\x23\x33\x22\x12\x07\xd3\x78\x39\x2e\x39\x45\x18\x47\xdd\x96\xb5\x3c\x5a\x09\xf7\xc4\x97\xd8\xa4\x3b\x1b\x4f\x6b\xa0\x66\xc9\x54\x70\x37\x13\x23\x1c\xb9\x71\x2e\x58\x07\x15\xc1\xd0\xa4\xb6\xe0\x65\x93\x65\xb3\x10\x08\xc3\x4b\xab\x9d\x6d\x37\x9c\xc6\xf3\x28\xed\x61\x9e\xed\xc6\x05\x79\x90\xc9\xa7\xb4\x65\x05\x6f\x72\x5b\x6f\xaa\xd6\x68\xb1\xd0\x6f\x54\x9c\x43\x86\x84\xf2\x4a\xee\x84\xbc\xbe\x3c\x9b\xf8\x77\x98\x12\x9f\xb6\x12\x50\xba\x8f\x38\xff\x8c\x58\x4c\x49\xe4\xd1\x30\x88\x3d\x09\xb1\x98\x46\x84\x85\x21\xa0\x8c\x49\x20\xf6\x01\x86\x61\x80\x25\xc4\x21\x0f\x03\x10\xfb\x5e\x00\x7c\x14\x13\x08\x23\x41\x24\x46\x11\xbc\x1e\x27\x4e\xff\xb8\xbe\xd3\x2a\xd8\x1b\x21\xb1\x4f\x0f\x05\x64\x80\x60\x2e\xd8\x9b\x95\xce\xf0\x47\x0f\x26\x52\x3e\xb4\xa7\xcd\x20\x35\x31\x57\xcd\xbe\x1f\x2a\x0d\xaf\x92\x5a\x17\xc3\x35\x35\x37\x71\x90\xe1\x33\x79\xbe\xaa\x54\x99\x36\x18\x18\x15\xcf\x95\x6a\xc6\x7c\x93\x42\xc3\xdd\xc0\xef\xa7\x62\xa9\xa6\x8d\x57\xd1\x68\x52\x18\xa7\x0b\xe6\xd6\xb1\x3a\x4c\x4e\xb5\x53\xf5\xac\x98\x1c\x13\x27\xdc\x13\x19\x75\x77\x2a\x23\xf1\xb0\xd1\x6b\x95\x17\x53\x8d\x98\xbd\x79\x7e\xba\x8e\x66\xe1\x68\x57\x62\xdb\xf5\xc8\xac\xad\xc2\x79\xa6\x91\xb5\x82\x25\x9e\x98\xd9\x45\x71\xa8\x0f\x27\x73\x14\xc8\x9b\x71\xa5\x9f\x9e\xee\x62\x51\x19\x97\xca\x4a\x57\x31\x72\xb2\xc6\x44\xa4\x4b\x9b\xea\xf6\x70\xf0\xa1\xbc\x92\x38\x21\x2f\x2f\x2b\x13\xfc\x67\x4e\x08\x71\x1f\x61\xfe\x29\xbc\x38\x06\x00\x31\x1a\xfb\x92\x20\x10\x49\x00\x85\xb1\x14\xd2\x00\x83\x08\x4a\xc4\x03\xd0\x0b\xfd\x90\x4b\x88\x48\x20\x8a\xa9\x10\x98\x11\x2e\x42\x5f\x0a\x45\x84\x21\xbd\x5e\x6c\x9f\xfe\x41\xae\x6e\xb3\x0a\x81\xa5\xeb\x75\x0b\x0e\x4f\x0f\x27\xe3\x1c\x03\x89\x40\x88\xdf\x2c\x74\x86\x3e\x7a\x2e\x41\x66\x69\x59\x6d\xc5\x4b\xb7\x52\xeb\xab\x98\xc2\xa0\x58\xce\x39\x63\x65\xe6\x43\x6a\x9a\x99\x55\xc3\x28\xf5\xa3\xd2\x32\xec\xf5\xb2\x8d\x09\xd7\xbb\xa9\x7e\x46\xd1\x0a\x81\xe3\x0e\xca\xe9\x7a\x64\x4e\x56\x05\xb6\xa2\x63\xa3\xd2\xee\xc5\x8a\x2e\x2d\x50\x7d\xee\x3a\x60\x75\xbc\xc7\xeb\x34\x79\xa1\x94\xdf\x6c\xe5\xe2\x78\x5b\x4c\xb7\x47\x54\xea\x28\xee\xae\xb0\xf1\x1d\x24\x1a\x7e\x77\x83\x2b\xfa\x96\xcf\x81\x60\xab\x49\xcd\x25\xe1\x3c\x9e\x77\x20\xd8\x4e\xa2\x99\x3f\x34\xe2\xbc\xe3\xad\xc7\x63\xcb\x2d\x4d\x4b\xe9\x8a\x82\x7a\x79\x32\x5d\xa2\x85\xdc\x4c\x2d\x8c\x43\xcc\x88\xf2\x4a\xde\x84\xbc\x70\x2e\x24\xea\xdf\x61\x4a\x7c\xba\xce\x3e\xe4\xf7\x11\xe7\x9f\x2c\x26\x3e\x0f\x24\xca\x3d\x82\x3c\x8c\xc2\x50\x60\x10\x12\x8c\x20\x0a\xa9\xef\x7b\x71\xe4\x4b\x08\x41\x8a\x45\x44\x00\x04\x1e\x41\x98\x50\x8a\x31\x08\x43\x1f\x48\x3e\xf2\xdf\xf2\x24\xae\x9e\x5f\x0b\x89\x4b\xd7\xcb\x2a\x3f\x3f\xe5\x18\x40\x42\x08\x01\x6f\xd6\x39\x43\x1f\xdd\x82\x45\x52\x21\x36\xeb\xac\x32\x2d\x2e\x50\x26\xe3\x14\x3b\x85\xfa\x92\xa5\x67\xfd\x6e\xd6\xee\xf5\xe5\xca\x44\x2d\x65\x9d\x5d\x26\x9c\x9b\xf3\xd9\x36\x28\x63\x33\xad\x4f\x50\xa0\xad\x66\x04\xe3\x9c\x15\x4d\x71\x73\x61\xea\x56\x5d\xa4\x76\xcd\x70\x53\xa8\x56\x9d\x0d\x64\x95\xce\x43\x02\xf4\x7e\x4a\x34\x4f\x3c\x89\xa9\xde\x28\x67\xab\x61\x23\xb3\x8e\xf2\xa4\x65\x68\x8a\x6b\xbb\xe5\xfe\x6e\xdd\x45\x53\xd1\x35\xc6\x8a\xb4\xc9\xee\xe4\xf2\xd4\xaa\xa5\xe3\xb8\x67\x15\x3c\xad\x9a\xcb\x14\x66\xae\xca\x17\x2d\xb7\x5e\xe5\x23\xdb\xb6\x1d\x6e\x8f\x00\x29\x05\xd8\x2e\xcf\x21\x6e\xcf\x55\x78\x98\x12\xaf\xa4\x4d\xc8\xe3\xf1\x6b\x62\xf5\x37\x9f\x12\x9f\xf6\x24\xf6\x02\x72\x0f\x71\xfe\x29\x3c\x24\x21\x8c\x24\x09\x85\x4c\xf2\x7d\x06\x63\x42\x79\xc0\x99\xf0\x38\xa1\x3e\x8b\x7d\x14\x0a\x18\x7a\xa1\x2f\x42\xc6\x05\x88\x89\xc4\x80\x2f\x45\x11\x16\x28\x90\xbc\x90\xbe\x65\x25\xae\x0a\xbd\x04\x01\x25\x57\xf7\x9b\x9e\x9f\x32\xc1\xa1\x44\x38\xe3\x6f\x96\x39\x43\x1f\xdd\x6f\x22\xe3\x89\xb1\x1d\xd6\xe0\x64\x89\x74\x50\x17\xe1\x78\x02\x1a\x28\xb5\x45\x0a\x5a\x2c\x4b\x2d\x92\x01\x83\xf6\x32\x22\xa4\x60\xce\xea\x2e\x6c\xcb\x4e\x43\xc9\xad\x2b\x15\xab\x38\x75\x99\x65\x89\x6c\x76\x3b\x99\xf4\xf5\xf1\x3c\x5f\x25\x76\x06\xae\xe7\x6e\x98\x4e\x1b\xa9\x63\xd9\xe4\xd3\x5c\x68\x37\x3f\x5e\x72\xa5\x6f\x2d\x2a\x8b\x61\x86\x94\x29\x49\xdb\xf6\xd8\x69\x2b\x72\xdd\x51\x87\xea\x20\x5d\x4e\x49\x76\x7b\x8a\x3a\x25\x7d\x37\xc8\xbb\x52\xa5\x4d\x55\xd9\xd8\x84\xd5\xa6\x3f\x4f\x37\x83\xfa\x48\xf3\xb1\xe9\x9a\x71\x3a\xd3\x97\xf2\xa0\x54\x1c\x37\x68\x59\xd8\x87\x29\xf1\x4a\xd6\x84\x3c\xb8\x8c\xe8\x38\x7c\xfe\xe6\x53\xe2\xf3\x56\x82\xde\x47\x9c\x7f\x7a\x8c\x78\x31\x0c\x80\x88\x7d\x1a\x22\xe1\xf9\x41\x08\xe3\x40\x0a\xbd\x48\x04\x81\x0f\xfd\x38\x90\x7c\x3f\x0a\xa0\xcf\x7d\xc2\x79\x04\x49\x1c\x78\x28\xf0\xbd\x30\xf0\x88\x04\xf8\x5b\x59\x13\x6f\x08\x3d\x02\xec\x8d\x09\xf3\xf4\x94\x11\x82\x08\x05\x12\x79\xb3\xca\x19\xfa\xa8\x73\xcd\x5a\x79\x11\xa8\xd6\x22\xcc\xe7\x57\x25\x5d\x8c\x3c\x56\xdc\x6e\x56\x62\xc8\xb9\xb2\xe0\x55\x4c\x9c\x74\xbe\x50\x98\x05\x13\x53\x11\x21\x6a\x87\x9e\xe4\x35\x7b\xd5\x0d\x18\x7a\xa9\x65\x8e\x1a\xa3\x8c\xa5\x69\x0d\x1f\xf3\xb8\xd7\xda\x96\x2a\x5b\x6b\x6d\x75\x2b\xda\xea\xc4\x4a\x9c\x26\x61\xcf\x7b\xce\xa0\x61\xee\x9a\xbb\x66\x26\xa7\x2d\x79\xab\x29\x4a\x45\x92\xc3\x9d\x66\xd1\x6c\xdb\xd3\x21\x1c\x93\xe9\x4a\x2b\xc6\x3e\xcb\xe9\x6a\xb5\x5f\xef\x8e\x94\x60\x12\xb5\xd7\xd4\xef\xac\xdc\xe2\x64\x6d\x22\x3f\xdc\x6b\x34\x3c\x80\x7e\x4d\xb1\xea\x4e\xa6\xb7\x9e\x1d\x04\xff\x95\xa4\x09\xb9\xfd\xea\x6d\x5b\x7f\xf3\x29\xf1\x79\x5f\x82\xdc\x47\x9c\x7f\x82\x00\x12\x8f\x30\x1a\x33\x00\x00\xc4\x00\x7b\x94\xb1\x38\x0a\x20\x8d\x51\xe0\x07\xa1\x87\xb8\xe7\x07\x98\x44\x52\x20\x7c\x0a\x7d\x21\x24\x4a\x3c\x14\x4b\x3e\x06\x31\xf3\xaf\xdf\x38\x41\xff\x20\x57\x0f\xaf\x25\x8c\xa1\x74\x75\x37\xea\xf9\x29\x03\x10\x49\x94\x20\xf8\x66\x91\x33\xf4\x51\xf7\x7a\xbd\x76\x26\xb9\x26\x92\x65\x6d\x5d\x1e\xb4\x56\x5c\x69\x6e\xb7\x02\x75\xa3\xd9\x1a\xb0\xa0\x0b\x73\xa4\x5b\xaf\x75\x53\x7e\xd1\xf2\x36\x2b\x1a\x2c\xdc\x30\x28\xd6\xb4\xa1\xc0\xf3\xda\x6a\xdc\x9f\x60\xa4\xc2\x5a\x5a\x36\xda\xbe\x1f\x2c\x5a\x0d\xaf\xb1\x72\x36\x25\x24\x1f\x73\x26\x9a\x27\x43\x3a\x10\x51\xd1\x5f\x15\xcc\x45\x59\x19\xdb\xea\x6a\x3c\x1b\x68\xf9\x4d\x99\xb5\x27\xa3\xb9\x1a\xcd\x7b\xa3\x14\x54\x61\x5a\xcf\x81\x15\x9c\x85\x88\x8f\xcb\x3c\x55\x6f\xd4\xb4\x9c\x98\x89\x38\x28\x67\xdd\xbc\xe8\xe3\x56\x38\x19\x38\xfe\xce\x08\x63\x63\xd3\x2f\x79\x8a\x97\x3f\xcc\x82\x57\x72\x26\xe4\xf8\xf2\xec\xfa\xf0\xf9\x9b\x4f\x89\xcf\x2f\x9c\xf0\x7d\xc4\xf9\x27\xc0\x52\x28\x61\x80\x03\x04\x02\xc9\xa3\x02\x08\x14\x43\x1a\x13\xc1\x69\x24\xc8\xa1\xec\x6c\x44\xc2\x00\x81\xc8\x43\x98\x0b\xc6\x02\x2a\x85\x54\xe2\x41\x80\x89\xe4\xc1\xf0\x8d\x29\x71\x3d\x62\x43\x22\x42\xba\xea\x5d\x3f\x3d\xa4\x54\x60\x42\x39\x11\x6f\xd6\x38\x83\x1f\x4d\x98\x58\x97\xc3\xfe\xda\x52\x33\xe6\xc4\x55\x55\x51\x97\x8c\x30\xea\x14\xf5\xf5\xae\x8f\xd5\xcc\xd4\xc0\x9d\xe1\xa6\x05\x5b\x71\xb1\x64\x8e\xc3\x6c\xbc\x0a\x77\x8b\xcd\xcc\xd5\x2d\x69\xb3\x0b\xa7\x7e\x5a\x9a\x04\xf9\x71\xc7\x68\x76\xed\xd1\xa2\xb1\x4b\xd5\x36\x16\x1a\x6f\xa9\x82\x8f\x95\xf5\x1b\x27\x9e\x44\xb6\xdf\x70\x4a\xdb\x6c\x6a\xcd\x78\x95\x8e\x52\x7a\x3b\x53\x8a\xfc\x01\x9d\x8f\xea\xc8\x1d\x28\xf3\x1d\xde\x14\xec\xa9\x52\xac\xcc\x2b\xda\x22\x95\x6b\x14\x25\x67\xa1\x85\xb3\xbe\x3b\x1c\x1a\xb4\xae\xbb\xe3\xa5\x8d\x77\xd6\xc0\x9d\x14\xd4\xf2\x76\x30\xed\x4d\x51\xd0\xad\x1e\x82\x39\xe4\x57\x12\x26\xe4\xe0\xf2\x98\xee\xf0\xf9\x8f\x9b\x10\xe8\x3e\xc2\xfc\x93\x46\x34\x12\x12\xf6\x41\x2c\x01\x2e\x3c\xce\x19\xc0\x31\x03\x4c\x48\x04\xd0\x10\x91\x10\x11\x44\x78\xb8\xf7\xd6\x7d\x00\x62\x01\x69\x88\x20\xf2\xa3\xd8\x17\x50\x62\xf4\xad\xa2\x04\xf8\xea\x1e\xab\xc4\x00\xe4\xd7\xa7\xcb\xd3\x53\x0a\x29\x96\x18\xe0\xf4\xcd\x12\x67\xf0\xa3\xce\x35\xa4\x51\xd7\x9e\x5b\x7d\xbd\x3b\x0a\xdb\x16\x52\xc6\x03\xb9\x59\xb3\x6b\x95\x7e\x5c\x21\xad\xb9\x9c\x52\x9a\x35\x6d\xc6\x79\xbb\xd5\x6a\x64\x6b\xfa\x36\xe8\xca\x56\x64\x0c\x81\xec\x45\x9d\x69\xaa\x39\xab\xfa\xb1\x12\x23\xb7\xb1\x40\xe3\xe1\x2e\xae\x8c\x8a\xb5\x51\xd1\x9b\x1c\x3d\x89\xc6\xc9\x7a\x3e\x20\x16\x1e\xa7\x14\xb3\x6b\xae\x9a\x4d\x23\xee\xa5\xa3\x7a\xc5\xca\xc2\x6a\xd5\x98\x8d\x34\x34\x8a\x9b\xc0\x23\x26\x6f\x64\xb7\xb5\x59\xc6\xde\xd5\xa7\x5e\x21\x15\xae\x73\xb3\x05\xec\xa9\xb5\x69\x8b\x87\x7d\x2b\x72\x32\x92\xf0\x6a\xf9\x42\xab\x04\xc3\x8a\xee\x8e\x2b\x9d\xc3\x2c\x78\x25\x5f\x42\x6e\xbd\x2a\x56\x7f\xf3\x29\xf1\xf9\x65\x13\xbc\x8f\x38\xff\x64\xc8\x0b\x89\x8f\x3d\xcf\x0f\x90\x27\xe1\xe8\xb0\xe7\x29\x24\x26\x22\x06\x21\x09\x61\x04\xa9\x17\xc3\x30\xf6\x39\xc5\x31\xf5\x39\x20\x22\x00\xd0\x8f\x68\xec\xe3\x48\xf2\xdf\x0a\xe6\xc0\x57\x4f\xae\x25\x0e\xd9\x07\x9e\x12\x8e\x08\x61\x04\xa0\x37\x4b\x9c\xc1\x8f\xc6\x37\xa1\xfc\xa2\xb6\x9b\xce\xd6\xd3\x7e\x4a\x75\x34\x77\x30\xa6\x9d\x6c\x49\xef\x34\x56\x7a\xbc\x80\x16\x5c\xac\x6b\x45\xd9\xa7\xf1\x3c\x35\xa4\x9c\x17\xb3\xd4\x87\x46\xd4\xc5\x3b\x3d\x2b\x69\xf2\x70\x5e\xb0\x05\x19\x70\xd7\x97\x9d\x9a\x9e\xe6\xd9\xf4\x7a\x3b\xac\x4e\x25\x71\xbc\x32\xbe\x71\x22\xa5\x13\x63\x33\xf1\x6c\x4b\x2e\x99\x35\xdc\x8c\x17\xb9\x66\xb6\xe6\xce\x34\x13\x14\x3b\x71\x89\xe5\x4a\xb0\x1c\xd1\x94\xab\x59\x0c\x48\xa9\x05\x1c\x12\x35\xe3\xf9\x7e\xb6\xae\xae\x37\x9e\x0d\xeb\xc6\x4a\x25\x0d\x35\xcd\x46\x6c\x38\x9b\x95\x6b\xab\x71\xba\xec\xd3\x61\xff\x50\x1b\x56\x7e\x2d\x5d\xa2\x79\x79\x4c\x77\xf8\xfc\xc7\x4d\x09\x70\x1f\x71\xfe\xc9\xa4\x18\xf1\x88\x23\x5f\xe2\x31\x0f\x7c\xee\xc7\xe1\xfe\x87\x10\x00\x88\x7c\xee\x7b\x40\x80\x10\x87\x51\x00\x05\x64\x42\x08\x22\x18\x62\x3e\x8c\xa0\xef\x85\x88\x46\x1e\x7d\x20\xfe\xf5\x65\xd3\x75\x5f\x41\x80\xc7\xac\xbe\x37\x9f\x12\x24\x11\x89\x71\x24\xbd\x59\xe1\x0c\x7e\x74\xbf\x09\x8d\xb6\xf1\x28\x4f\x63\xbc\xc5\x2b\x29\xc6\xbb\x8a\x5c\x5b\xf0\xb1\x91\xb1\xf1\x3c\xa7\x78\x46\xc7\x70\x87\xf3\x28\xc7\xc0\x80\x0d\x26\x92\x43\x59\xb5\x36\x0e\xaa\xa4\x35\x69\x36\x5b\xf3\x74\x7b\x10\x8c\x72\x75\x5d\xab\xd5\xb3\x59\x87\x15\xba\x79\x29\x5e\x47\x85\x82\x7b\xac\xfa\xd7\x38\x19\x52\x29\xd5\xeb\xcd\x1b\x79\xb6\x62\x6d\x50\x76\x8b\xd9\x8d\x3d\x86\x29\x77\xdc\xee\xa2\x6d\xa6\xd6\x6b\x76\x4c\xc1\x4a\x50\xde\x98\xe5\x95\x16\xc0\xc1\xa6\x84\x06\x13\x43\xd4\xa2\x76\xce\x65\x8b\x95\xec\xcd\x27\x4b\x12\xea\x9b\x61\xa1\x1e\xce\xb4\x7e\xaf\x36\x30\xdc\x55\xfc\x50\x55\xf0\xb5\x6c\x89\xfa\xe5\x41\xdd\xe1\xf3\x9f\x36\x25\xa4\xfb\x48\xf3\x4f\xe6\xc5\x21\xc4\xd8\x8b\x39\x8e\x63\x3f\xe4\x51\x48\x59\x80\x18\x0d\x59\x88\x7d\x1e\x61\x4e\x7c\x10\x42\x0e\x28\x0c\x42\x18\xc4\x22\x92\xa2\xd0\xe7\xcc\x8f\xe2\x20\xf4\x09\xf7\xdf\x32\x12\xd7\x7d\x05\x21\x89\xb7\x66\xc4\xe3\x53\x2c\x18\x25\x1c\x50\xf6\x66\x7d\x33\xf8\xd1\xba\x35\x68\x26\x69\xbb\x19\xb6\xd2\xab\x26\xaf\xfb\x6a\x2b\xf4\xed\x45\xaa\x04\xe6\xa5\xec\xda\x09\x40\x90\x2a\x8f\x16\x0b\xb4\x5a\xed\xfc\x2a\x37\xa0\x57\x76\x52\xfa\x62\xb7\x82\xee\x76\x5c\x6e\xa4\x4a\x4e\x73\x3c\xef\x69\x6b\x56\x6d\x65\x3b\xeb\x45\x19\x5a\xc5\x91\x5c\x95\x17\xcb\xe3\x8c\xa8\x9f\xe6\x5e\x37\x2b\x85\xc6\xb2\x8d\x8c\x16\xca\x91\xea\x68\xed\xcc\x54\x7b\x65\xac\xcb\xcc\x2e\x4e\x96\x08\xa6\x6a\xc8\x69\x76\xa6\x85\x7c\xc3\xd6\x73\xf2\xba\x49\xb7\x20\x5b\x77\xb4\x5e\x26\xa4\x6e\xa6\xeb\xf3\x75\x27\xed\x97\x6a\x9b\x16\x03\xcc\x2d\x82\x0c\xb5\xa4\x55\xb7\x5d\x3b\xcc\x88\xd7\x72\x25\x6a\x97\x05\xc4\x0f\x9f\xff\xb4\x19\x21\xee\x23\xcd\x3f\x41\xe0\x7b\x34\x64\x44\x30\x1f\x08\x10\x20\x20\x11\x12\x8a\x08\x01\x2e\x42\x0f\x50\x41\x49\xe4\x93\x90\x09\x1f\x04\x84\x78\xdc\xe3\x20\x06\x2c\x8c\x7d\x1f\x89\x00\x88\xc3\x35\x5c\xe4\xf0\xef\x15\xe1\xbe\x7a\x72\x2d\x49\x12\xbd\x7e\xf7\xca\xf3\x53\x4c\x30\x95\x38\x16\xf8\xcd\xea\x66\xf0\xa3\x1b\xb0\xeb\x2d\x6b\x36\x6a\xb9\xb9\x91\x51\x55\xc7\x76\x49\x3b\x2a\x8d\xb3\x1d\x87\x01\x38\x9e\x17\xab\xf9\x68\x94\x59\xfb\xf1\x72\xdb\x93\xdb\x66\x2b\xdd\xae\xeb\x1d\xa2\xe5\xc6\xd5\x66\x6f\xa3\x0c\xcc\x66\x3b\xf4\xd9\x98\xd2\x88\x16\x2c\x45\xa4\x67\xc6\xa2\x99\xea\x2a\xc5\x61\xfb\x78\xcd\x44\xfd\xc4\x93\xa0\x71\x07\x64\xaa\xad\x54\x39\x8e\x64\xd2\xd5\x71\xce\x2e\xfa\x39\x16\x4c\xcd\x9c\xb6\x01\x53\x95\x72\x04\x99\xee\xdb\xeb\x8a\xe5\x80\xce\xae\x5c\x01\x0b\x6d\x3d\x0e\x41\x23\x9f\xcb\xd0\x7e\x91\x15\xd6\x75\xbd\x90\xf7\x8d\xf2\x4e\x19\xfa\x69\xa9\x66\xac\xb5\x31\x51\x0e\x72\xff\x5a\xa6\x44\xf5\xb2\x80\xf8\xe1\xf3\x37\x9f\x11\xe4\xb3\x33\x82\xdf\x47\x9a\x7f\x46\x94\xf9\x12\x96\x50\x0c\x24\x22\xa1\x98\x00\x41\xb8\x90\x3c\x16\xf3\x28\xf2\x30\xe2\x24\x64\x92\x04\x03\x09\x8a\x50\xa2\x40\x62\x00\x48\x91\x24\x68\xec\x47\x2c\x00\x21\x78\xd3\x91\xb8\x62\x05\xc8\x3f\x01\x84\x44\x5c\xf1\xbc\x4f\x9e\x62\x00\x18\xe1\x1c\x82\x37\x6b\x9b\x7d\x34\x9d\x2e\x55\x9f\xf5\x69\x61\x3d\x30\x0b\x40\xd5\x22\x73\xb2\x8a\x97\xe3\x6d\x58\xf2\x5a\xba\x99\x2b\x0d\x2a\x83\xb6\x1a\x0d\xb3\xa9\x94\x2f\x03\x73\xe6\x20\x65\x44\x3c\xbb\xe7\x16\x0b\x93\x4c\x1c\xc7\x46\x3a\x62\x7a\x06\xe7\x6a\x55\x55\x33\xc7\x44\x9e\xb9\x8b\xae\x44\xca\x8d\xe9\x31\x94\xa3\x7e\x9a\x76\x4d\xf5\x72\x65\x82\x6d\xd5\xd8\x96\x9d\x9e\xa8\x0f\x4b\xb9\x59\x67\x8e\xd4\x94\xd1\xec\x49\x04\x4d\x46\x78\x6a\xd5\x0d\xb9\xd9\xdc\x30\x17\x73\x31\xb3\xba\xf3\x4a\xda\x6a\x54\x0b\xde\x6e\x53\x54\x07\x85\xb5\x28\x20\xa7\x6f\x84\xd2\x98\x91\xc8\x98\x0c\xbc\x7a\x5f\x3c\x5c\xb7\xfd\x5a\x9e\x44\xfe\x32\xc5\xf4\xf0\xf9\x9b\x4f\x88\x4f\x9b\x08\x76\x1f\x61\xfe\x19\xd3\x58\x0a\x60\x1c\x70\x00\x28\x87\xa1\x47\xc3\x18\x84\x2c\x02\x51\x10\x85\x9e\xcf\x45\x1c\x09\x18\xb1\x98\x31\x40\x49\x44\x30\x45\xb1\xc4\x3d\x1c\x83\x20\xc6\x21\x8d\xdf\xcc\x30\xc5\x57\x4e\xe1\xc8\x3f\x01\x82\xd7\xa7\xc3\xc3\x33\x44\x39\x93\x04\xc0\xfc\xcd\xa2\x66\x1f\xae\x1b\xde\xa4\xeb\x78\xb3\x56\x9a\xba\xd7\x8c\x33\x0d\x52\xde\x2d\xa6\xb8\x97\x6a\x47\x3e\x72\xb3\x76\xbf\x54\x4b\x35\xc7\xe9\x8c\x65\xd5\x05\x2e\x6d\x25\xde\x4f\x83\x2c\x92\x1b\x3a\xb2\x2c\xd6\x53\x36\xe3\xd0\x68\x16\xdb\xbd\x61\xb5\x60\xae\x3b\x99\x45\x59\x2c\x2a\xad\x76\x2c\x8e\x5b\xaf\xf5\x93\xc1\x2c\x89\x0a\x92\x17\xaa\x3a\x8f\x06\x44\x37\xe6\x79\xb2\x0c\xa7\xcd\x6d\xa1\x32\x0d\x66\x5e\xae\x17\xc8\x7a\xbd\xe6\x94\x04\xa4\xed\x59\x76\xdd\x0c\x46\x4b\xdd\x81\x4b\x67\x92\x9b\xda\xce\xc2\x37\xd2\xdb\x96\x05\xb7\xee\xaa\xa2\x8d\xba\xf2\xb2\x18\xa3\x4e\x77\xdd\xf5\x16\x87\x7a\xb0\xf2\x6b\x19\x12\xe6\x65\x3d\xd8\xc3\xe7\x3f\x6d\x32\xd0\xfb\x08\xf2\xcf\x00\x31\x00\x25\x08\x51\xc4\x43\xe8\x61\xc0\x7d\xee\x33\x4f\x10\xec\x85\x94\xc5\x21\xc7\x3e\x85\xb1\x1f\x06\x28\x62\x98\xc6\x11\xf7\x41\x1c\x04\xc2\xf7\x22\xc2\x22\x89\x40\xfe\x46\x0c\x07\xbe\x72\x60\x4d\xfe\x09\x30\x7d\xc3\x38\xec\x1f\x1e\x4e\xfd\x20\xe1\x44\x60\x46\xde\x2c\x68\xf6\xd1\x4d\x26\x61\xb6\x73\x55\x6d\x19\x57\xc7\xeb\x08\x2f\xa6\x9d\xcc\xac\xee\x4b\x01\x77\xe2\x55\x50\x18\x96\x62\xca\x33\x62\x5b\x98\xf5\xfd\x49\xa5\xb9\xdd\x49\x5d\x17\xcd\xf4\xce\x7a\xe9\xac\xca\xd9\x65\x41\x63\x43\x65\x65\x97\x09\xeb\x18\xa9\xe6\x26\x8f\x4c\x1a\xc0\xc5\xb2\x30\x3f\xb9\x0c\xde\x39\x59\xc5\xf7\xd9\xaa\x9c\xce\x57\x37\xeb\x16\xd8\x8e\xcc\x62\x71\x96\x77\x26\xe5\x5a\x4c\x1b\x1d\x3f\xec\x97\xfa\xa0\x60\x94\xd3\xbb\xd6\x46\x49\x4d\xa3\x26\xf7\xdc\x1c\xd8\xe1\xe6\x30\xbb\xde\x0c\x67\x98\x58\xb3\x4d\xa7\xbe\x15\xb5\xea\x6e\xe0\x14\x73\xbd\x8e\x5d\x68\x44\xb8\x9b\x1a\x3c\x48\xf5\x6b\xe9\x11\xfa\xbf\xe3\x71\xf5\xa7\x23\x38\xc8\x7d\x64\xf9\x27\x26\x30\x8e\xa5\x80\x48\xc2\x97\x00\x67\xb1\x88\x11\xf4\x22\x8f\x0b\x0f\x63\x3f\x00\x01\xc3\x92\xe7\xd3\x20\x96\x04\xf3\x42\x3f\x40\xa1\x08\x01\x09\x25\xe4\x53\x4f\x0a\x59\xf8\x56\x99\x1a\x7c\xe5\xb4\x9a\xfc\x13\x50\xc4\xaf\x9d\xcd\x9d\x3c\x3d\xb9\xa7\xee\xed\xd3\xea\x0f\x4d\x88\x5d\x25\x4e\x05\x35\x77\x59\x09\x57\xbd\x6d\x6e\x39\x21\xe3\xdd\x4a\xde\xf4\x86\xb3\xa6\x35\xcc\xcd\xfc\xf5\xa2\x57\xb1\x5b\x79\x38\x0d\xfd\xb8\x96\x6a\x46\x31\xc9\x36\x9b\x86\x8d\xfa\x01\x6c\x06\xf1\x6e\x54\x86\xb2\x6b\x49\x66\x69\x99\x51\x0d\x68\x66\x9b\xfa\x64\xe4\x48\xc6\xd1\x40\x38\x27\xee\x83\x21\xb2\x91\xae\xed\x4c\x90\x26\xd9\xb2\x48\x97\x72\x69\x82\xd7\xb6\x36\xda\x42\xb5\x91\x5e\x05\x3a\xea\x05\xb3\x4a\x7f\xe7\xfb\x41\x2f\x95\x8d\x59\x26\x6e\x8f\x48\xb6\x62\xe7\xcc\xe6\x00\xcf\x53\x1b\x65\xba\x55\x46\xa9\xe5\x4a\xb3\x34\x77\x3d\x9d\x59\xf6\xcc\xd2\xd2\x0f\x06\xe8\xb5\xe4\x88\xcc\xbf\xe3\xd9\xdc\xe7\x8b\x5e\xde\x47\x98\x7f\xc6\xa1\x84\x98\x08\x21\x0b\x39\x05\xd0\x67\x91\xcf\x25\xca\x7c\xc6\x29\xf3\x91\x88\x23\x82\x83\x88\x7a\x0c\x40\xe0\x73\x16\x71\xce\x42\x09\xc6\x0c\x44\x34\x8a\x42\xee\xbf\x71\xfd\x10\xfd\x03\x5d\x39\x7c\x23\xff\x04\x8c\x42\x7e\xc5\xdd\x7e\x7c\x4a\xcf\x6b\x5e\xbe\xe5\x50\x7f\x74\xc5\x84\x6a\x5e\x29\xbb\x08\x2b\x39\xc4\xf0\xa0\xb1\x18\xd5\x67\x79\x8b\x66\x76\x83\x49\x5b\x2b\x84\xcb\x10\xa1\xaa\xd4\xa6\x11\x6f\xce\xa7\x99\x56\xae\xa2\x68\xd0\x9d\x8f\x17\xc6\xac\xda\xec\xaf\xf9\x86\xa5\x83\xbc\x15\xa2\x5d\x59\x55\x96\x3b\xae\xa3\xea\xa0\x3a\xae\xe5\xdc\x63\x40\x93\x73\x22\xa3\xd4\x1a\xad\xb4\x55\xb1\xac\x89\xfe\x36\x33\xc7\x39\x7f\x09\x3b\xe3\xa5\x08\x86\xe3\xf5\x1a\x1a\x7c\x33\x75\x73\x65\x7f\x01\x5a\x63\x30\x6e\xc9\xf9\x0c\x75\x60\x75\x53\xda\x8a\xf1\xaa\x97\x22\xe5\x5e\x91\xcc\x0c\x05\x58\x69\x15\x07\x95\x54\x47\x2d\xc8\xb3\x22\x91\xda\x87\xaa\x4d\xf2\x6b\xc9\x11\x2f\xef\x32\x95\xff\x03\x27\x04\xba\x8f\x30\xff\x64\x38\x94\x44\x4c\x31\x8b\xa2\x3d\x94\x8f\xb8\x4f\x7d\x21\xc5\x08\x7b\x31\xc5\x10\xfa\x9c\x32\xc9\x43\x24\xf6\x62\x48\x00\xf6\x42\xe0\x53\xe4\x33\x8c\x7d\xc0\xfd\x48\xda\xcb\x3c\x38\xfc\x7b\x65\x42\x5c\x5f\x14\x71\x86\xae\xdd\xc7\x75\xf2\xf4\x98\x3f\xf7\xc6\x7c\xf8\xe0\x7e\xab\xd5\xea\xc1\xd2\x92\x8e\x81\x6f\xf2\x06\x19\x6d\xcb\x2b\x67\x93\xc3\xf5\xc9\xb8\x9f\x5a\x65\xe5\xf2\x42\x85\x79\x54\xe4\x0a\x67\xad\x65\xab\xaa\xcf\x24\x27\x6c\xe6\x7d\x3b\xdf\x0d\x06\x71\xb9\xb7\xe5\xc8\x6d\x65\x4d\xa7\x6f\x5a\xf5\x20\x6f\xd3\xce\x62\x35\x9e\x0d\xe1\xf1\x50\xee\x61\xe5\x64\x3c\xff\x27\x3f\x1c\xa2\x1d\xdb\x6b\xd9\xaa\x3c\xca\x2d\xde\x49\x9d\xa1\x5c\x9b\x14\xa4\x85\x5c\xdf\xf4\x17\x9b\x0c\x6e\xd6\xca\x13\xdc\x5d\x6c\x6a\x2b\x6d\x58\x64\xb2\xd3\x5f\x2b\x35\xa2\x55\x47\xab\x54\x61\xb1\x48\x6f\x83\x5d\x7a\x23\xd2\xa9\x41\x56\x11\x60\x36\xaa\x6f\x78\x0f\x15\x67\x43\x24\x69\x93\xe5\xdc\xa9\xa6\xda\x2b\xe9\xe1\xb4\xfa\xb5\xbc\x89\xd7\x3f\x7f\xf3\xd9\x02\x3e\x7d\x68\x77\x1f\x49\xdf\xbf\xf1\x59\xde\xa1\xc4\xc1\x3f\x00\xfc\x07\x80\x3f\x00\xf8\xe3\xf0\xef\xaa\x44\x0b\xc4\xd8\xf5\xd9\xf0\xf4\xf4\x78\xea\xf6\x69\x79\x7f\x20\xe9\xaf\x1e\x9a\xeb\x1f\xa5\x99\xef\x92\x6d\x7a\x5b\xcb\x2b\x3c\x33\xca\x48\x3a\x02\x9b\x9e\x92\x9a\x83\xf6\x62\xbe\x36\xd6\x3b\xd8\x0c\x6b\x0d\xd7\x53\x4c\x2f\x7b\x58\x69\xbd\x96\xef\xf0\xfa\xe7\x49\x94\xaf\x19\x86\x5f\xf9\x73\x29\xca\xff\xf5\x5f\xff\xf8\xc7\x7f\xfd\xe3\x1f\x3f\x32\xde\xc2\xfb\x11\x8f\x67\x3f\x4a\xde\x30\xfa\xe3\x59\xaa\xc7\x93\x68\xe6\x2d\xba\xe3\xd1\x9f\x13\x6f\xb6\xe8\x06\xdd\x89\x37\x5a\xcc\xff\xef\x0f\x7b\x3b\x89\xfe\xf8\x61\xcb\x4a\x41\xfb\x91\x91\x6d\xf9\xff\xfe\xa8\x05\x9d\x68\xe8\xfd\xf1\x63\xb2\xf4\x07\xdd\xe0\xff\xfe\x28\xaf\x47\xd1\xec\x8f\x1f\x7b\xf0\xff\x7a\x75\xc2\xbc\x0e\x7d\x3a\x7f\x10\x83\x92\x84\x01\x90\x20\xc5\xbf\xff\x80\x57\x26\xde\x3b\x38\xe8\x79\x5f\x88\x40\x41\x79\x62\x1c\xbc\xc7\xc1\x04\x60\xc0\x09\x65\x30\x31\x0e\xf9\xfd\x07\x22\x12\x04\x02\x02\x8e\x18\x4d\x8c\x43\xf7\x38\x44\x40\x0c\xb1\x24\x31\x29\x31\x0e\xbb\xc4\x41\xc9\x70\xf8\x21\x19\x84\x42\x01\x39\x62\x1c\xff\xfe\x03\x27\xc3\x11\xbf\xff\x40\x98\x21\x84\x11\xa0\x98\xf3\xc4\xf4\x48\x97\x38\x09\xe9\x81\x7b\x8f\x10\x43\x09\x09\x84\x05\x10\x30\x31\x41\xfb\x95\xc1\x39\x10\x49\x08\x84\xce\x80\x50\x72\x20\x7c\x09\x94\xb4\x6b\x7b\xa1\x46\x9c\x61\x8c\x38\xe0\x82\x26\x07\xa2\x97\x40\x49\xbb\xb6\x17\x6b\x84\x31\x16\x18\x60\x22\xa4\xdf\x7f\xd0\x84\x40\x7b\x09\x84\x12\x20\x18\x63\x06\x25\x9c\x1c\x48\x1c\x37\xe4\x84\x90\x78\x72\x20\xe9\x90\x63\x42\xf6\xca\x08\x32\x00\x13\x03\x21\x70\x04\xa2\xec\x06\x8a\x10\x3c\x02\x49\xfc\x06\x1e\xa1\xbd\x08\x02\x06\xa9\x20\x98\x60\x90\x5c\x8e\x10\xbe\x04\x4a\x4a\xd1\x5e\xb2\x01\x14\x0c\x13\xc6\x01\x48\xae\x1e\xd1\x5e\xd3\x4b\x9c\x32\x41\x24\x89\xef\x67\x1e\x4b\x08\xc4\x9e\x80\x28\xc0\xe2\x16\x8a\xf6\xb6\x50\xc2\x88\x63\x8a\x11\xd9\xcb\x79\x52\x8a\xc4\x25\x50\x52\x8a\xf6\x56\x6c\x3f\x37\x04\x65\x14\xa2\xe4\xaa\x16\x83\x4b\x20\x9e\x10\x68\x6f\xe7\x05\x61\x02\x53\x89\x8b\xfd\x18\x26\x05\x42\x97\x40\x49\xbb\x86\x0f\xd9\x03\x58\x08\x86\x01\xdd\x73\x4c\x24\x04\x22\x97\x40\x52\x42\xa0\xbd\x64\x73\x06\x24\xcc\x18\x46\x7b\xfa\x92\x52\xc4\x2e\x81\x92\x52\xc4\x8f\x40\x1c\xdf\xc2\x23\x71\x09\x94\x94\x22\xe9\xb8\xf9\x4c\xa5\x3d\x7d\x09\x81\x0e\x99\x87\x07\x20\x0e\x00\xb8\x81\x47\x64\x2f\xd9\x8c\x53\x80\x39\x12\x6c\xdf\x4a\xc8\x23\x82\x9e\x6f\xf6\x67\x10\x93\xe4\x92\x4d\xf0\x25\x50\xd2\xae\x91\x23\x10\x25\x24\xb9\x1a\xd9\xd3\x70\x0e\x94\x94\x47\xec\xf9\xa6\x77\x89\x00\xb2\x17\x06\x90\x10\x89\x1f\x2f\xc8\x66\xfc\xe0\x16\x25\x45\x12\xc7\x6b\x85\x25\x72\x70\x8c\x92\x22\x49\xcf\x97\xb1\x4a\x08\x1e\x5c\xa3\x84\x48\x14\x1c\xaf\xb0\x24\x82\x25\x97\x25\x0a\x2f\x81\x12\x93\x84\x8e\x37\x08\x72\x7a\xf0\xb3\x92\x3a\x6c\xf8\x19\x89\x41\x76\xa0\x29\x29\x12\x79\xbe\xc1\x4d\x02\x68\xef\x6b\x25\x46\xa2\xcf\x67\x00\x08\x49\x7b\x2f\x29\x31\x12\x3b\xde\x16\x44\xd9\xde\xbb\x49\x8c\xc4\x8f\x77\xac\x08\x2c\x6e\xe1\x93\x78\x46\xda\x8b\xc1\x2d\x34\x49\x47\x24\x46\x6f\xe1\x13\x03\x4f\x48\x10\x00\x76\xcb\xd8\x1d\x26\xda\x23\x12\xe1\xb7\x48\x26\x43\x47\x24\x21\x6e\x91\x4c\x86\x9f\x91\x20\x92\xd8\x0d\x1c\x3f\xc4\x3c\x3f\xdc\x2a\x82\x20\x10\xc9\x97\xb9\x0f\xdd\x39\x05\x4a\x4c\x12\x7b\xbe\xd4\x81\xe2\x83\x9b\x03\x93\xd2\xc4\x8f\x48\x5c\x1c\x68\x4a\x8a\x24\x8e\x45\xf5\x19\x91\x92\xaf\xbd\x0f\xf2\x73\x06\x94\x94\x24\x0e\x8e\x35\xcd\x25\x04\x0e\x9a\x38\x21\x12\x7c\xaa\x04\x4d\xa1\xb4\x77\xe2\x60\xc2\x3d\x1c\x8e\x9e\xeb\xe7\x12\xb6\x77\x99\x12\x03\xe1\xe7\xaa\xa3\x1c\x1f\xb6\x4f\x12\xe2\x90\x0b\x9c\xc4\x04\xd1\x27\x20\x04\xc9\x0d\xce\x20\x67\x17\x38\x89\xc7\x8c\x3f\x1d\xa2\x51\x00\xf6\xbe\x20\x4c\xe8\x55\x72\x71\x09\x94\xd0\xf5\xe2\xd2\x53\x15\x40\x81\x38\x82\xc9\x29\x12\xe0\x12\x28\x21\x45\x7b\x4b\xf4\x58\x84\x8d\x92\xc3\xc6\x40\xc2\xdd\x09\x81\x2e\x81\x92\x76\x0d\x3f\x03\x49\xf4\xd0\xb5\xa4\x14\x91\x27\x20\x84\xd9\x61\xd4\x92\x02\xd1\xe7\xaa\x5c\x02\x1e\x36\x06\x92\x76\x8d\x3d\x01\x51\x84\x0e\x3c\x4a\x3a\x6a\xfc\xa9\x28\x92\x00\x02\x27\x9f\xfb\x42\x5c\xe0\x24\xee\x99\xf4\x0c\x44\x24\x94\x7c\xee\x4b\xe0\x02\x27\x29\x87\x24\xf8\x0c\x24\x81\x1b\xf6\x38\x24\x74\x81\x93\x54\x88\xf6\x36\xfa\xa1\x68\x0f\xc4\xf4\xb0\x2b\x90\xd0\xa5\x94\xc8\x25\x50\x42\x4f\x50\xa2\xcf\x35\x53\x18\x3a\xf8\xe0\x49\x29\x62\x97\x40\x49\x29\xe2\x4f\x40\x14\xe0\x9b\xba\x26\x9e\xab\x5f\x08\xe9\x86\x7d\x00\x49\xba\xc0\x49\xca\xa2\xc3\x19\xf5\x03\x92\xc0\xe0\x86\x7d\x00\x78\xd8\x64\x3f\x05\x4a\xca\x23\x08\xd0\x53\x3d\x04\x08\x19\x39\xec\xe4\x27\x45\xc2\x97\x48\x09\x3d\xdc\xc3\xb5\x33\x8f\x09\xe9\x04\xd3\xe4\x8a\x0d\xee\x97\x68\xe7\x40\x89\x3b\xc7\x9e\x43\x13\x38\xd8\x3b\x84\x28\x31\x4d\xfc\x12\x29\x29\x90\x38\x05\x12\xb7\x90\x24\x5d\x22\x25\x3d\x50\x04\xcf\x49\xa2\x12\x67\xb7\x9c\x4c\xc2\x4b\xa0\xc4\x48\xe8\x29\x4b\x8f\x20\x72\xd8\xc0\x49\x7a\xec\xba\x5f\x15\x9f\x23\x25\x05\x22\xcf\x40\xec\x70\x70\x9f\x9c\x24\x7a\x89\x94\x14\x88\x3d\x01\x51\xc0\x0e\x42\x99\x98\x24\x7e\x89\x94\x14\x48\x3c\x03\x91\xc3\xbe\x62\x72\x92\xa4\x4b\xa4\xa4\xc7\xdc\xe0\x39\xbf\x8d\xc2\x1b\x22\x13\x0e\x07\x40\xe7\x40\x49\xfb\x86\x8e\xd1\x24\x5c\xec\x9d\x41\x94\xf8\x0c\x1f\x3f\x1d\x07\x13\x70\xd8\x50\x4a\x8e\x44\x9e\x91\x08\xbb\x8d\x26\xfa\x8c\x24\x0e\x1b\x4a\xc9\x91\xd8\xf3\x31\x05\x46\x87\x98\x89\xc4\x48\xfc\x12\x29\x29\x90\x78\xde\xea\xa4\xd2\x2d\x21\x0a\x87\x15\xf2\x19\x10\x3d\x89\xa3\xfa\x48\xf8\xd4\x9f\xdd\xf0\xcf\x79\x34\x7d\x8a\xa2\xaa\x69\x15\x47\x2b\xa9\xda\x8f\x9a\x66\xbf\x13\x47\x55\xd3\x0a\x9a\x6a\xff\x98\xb4\xff\x0c\xbc\x85\x37\x18\xb7\xff\x39\x8f\x16\x2b\x6f\xf0\x7f\x7e\x7e\xe8\x8d\x87\x88\x6f\xe9\xf7\x1f\x8b\xd9\x32\xfa\x44\xec\xd7\x9d\xe3\xbd\x4e\xcf\xb2\x4f\x03\xbc\x4e\x5a\xe8\x21\xe6\x1d\xfe\xfe\xe3\xe7\xbf\x7e\xf3\x97\xc3\xc9\x9f\x8b\xf1\x6f\x7f\xfc\xf8\x0d\x1f\xc3\x12\xf1\x6f\xff\xdf\xcf\xdf\x7f\xfc\xcc\xa9\x95\x96\x85\x0d\x87\x37\x1d\xa6\x99\x0c\x9b\xad\x66\x5e\xad\x94\x5d\x1b\x55\x4b\xcd\x12\xd6\x15\xaa\x96\x74\xad\x54\x72\x34\x47\xaf\x15\x65\x52\x77\x4c\xd3\xac\x69\xa5\x9f\xef\x8d\xfe\xe9\xd1\xfd\x69\xf8\xd8\x49\x8b\xbd\x4f\x25\xfc\x46\x2a\x4f\x83\xd3\x4e\x5a\xe0\x0a\x95\x10\x80\xef\x23\xee\x2c\xe2\xed\xa4\x45\xde\x67\xe1\x77\x52\x79\x16\x07\x77\x6c\x89\xa7\x68\xf9\x9f\xff\xfa\x2d\x5e\x8e\xc2\x68\xb6\xa7\x31\xa7\x54\x2d\x57\x37\x0a\x48\x35\x70\xb6\x54\x21\x4a\xb3\x90\x2d\x96\x32\x85\xac\xe9\x94\x2c\x07\xe9\x2e\x6e\x15\xb3\x35\xbd\x5c\x72\x54\xad\x2c\xd7\x1a\xbc\xa2\xf2\x72\x13\xe9\xbf\xfd\xfe\xe3\x37\x2f\x08\xc6\xcb\xd1\xe2\x00\x93\xb0\x63\x7b\x98\xf9\x62\x3f\xc9\x47\xed\x3f\x7d\x6f\xe0\x8d\x82\xe8\x71\x5c\xc1\x3f\xcf\x59\x97\x90\xd0\x4f\xb1\xee\x34\xf4\xef\xa4\x85\x9e\xb3\x57\xfe\xf5\xdb\xc3\xd0\xe6\xe4\x52\xb6\x95\xa9\x2a\x6a\xc9\x76\x9a\x46\x39\xa3\x9a\x9a\x5b\x94\x55\xab\xa8\xd6\x5a\x5a\x5d\x23\x8d\x56\xae\x85\xd5\x56\xa6\x85\x2d\x54\x6b\xe6\x49\x5e\xe7\xd4\xc8\x33\x77\xdf\xdf\x78\x36\x1e\xde\x8a\xe1\x0d\x9f\x38\x0f\x8f\x7c\xda\xff\x7e\x3e\x8f\x16\x7f\x2e\xb6\x93\x03\x17\x47\xde\xa2\xbb\x8a\x1e\xf9\x97\xf0\x6d\x9f\xe1\xdf\x79\xc8\xe3\xb1\xc5\xbe\x54\xf4\x6e\x60\xe3\xaf\x23\x7a\xe7\xc1\x99\xc7\x16\x78\x45\xf4\x54\xd3\xd2\x88\xeb\x54\x11\xaa\x5b\x44\x2d\x22\x25\x93\xcd\xc8\xba\x8b\x33\x05\x2d\x8b\x75\x5e\xd2\x4a\x79\xa7\x42\x71\xc6\xa6\xb6\x66\xa0\x9c\xac\xdb\xb4\x44\x9a\x67\xa2\x77\x0b\xeb\x3f\x2f\x7a\xdf\xca\x3f\x74\xc9\x3f\x74\xc1\xbf\x1b\xfa\x7e\x9c\xba\xc9\xc7\x20\xc9\xd4\x4d\xf6\xb6\xcf\xf0\xef\x3c\xf0\xf5\xd8\x22\x5f\x3b\x75\x93\xb3\xf1\xd7\x99\xba\x67\x11\xba\x27\xad\x07\x83\x0b\x1f\x78\x37\xf2\x86\x8f\xe3\x3a\x8c\xe0\x9e\xfe\x95\x37\x58\x1e\x7e\x53\xcc\xc8\xeb\xa2\xfc\xdf\xff\xfd\x34\xd6\x6e\x4d\x2d\xe6\x2b\x2e\xd3\xdc\x42\xb3\x6c\xd9\x36\x33\x2d\xab\xdc\xcc\x14\xeb\x25\xa5\x61\xd8\x96\x5d\x6b\x19\xf5\x46\x83\x14\x1a\x72\xb5\xae\x94\x6d\x9d\x56\xed\x82\x9c\xf9\x0c\xc1\x67\x91\xc0\x27\x2d\xf4\x41\x82\x6d\x63\x57\xfa\x5e\x82\x4f\x23\x8e\x4f\x5a\xec\x1a\xc1\xe8\x94\xe0\xd1\x72\x30\xf8\x3e\x52\x4f\x63\x9a\x4f\x5a\xe0\x97\xe5\xed\x69\xec\xf4\x49\xeb\x63\xbc\xfd\xad\x64\xbb\xb8\xfc\x57\x10\xfc\x10\xa3\x7d\xd2\xba\x2a\xbd\x3f\xce\x08\xf6\x9a\xd5\x9d\x91\x0b\x57\xa1\xaa\xec\x82\x5c\xb6\xd7\x6a\x16\x3b\xdf\x47\xfc\x79\x5c\xf8\xb1\xf5\xc5\x6a\x36\x59\xc7\x7e\x2d\x35\x7b\x1e\xc0\x7e\x6c\x3d\xa8\x59\x69\xcf\xba\xef\xa2\xe5\x3c\x06\xfe\xa4\xf5\x20\x83\xf4\x30\x8c\xdd\x51\x3c\x78\xd8\xc4\x08\xa3\xf9\xc3\x38\x64\xaa\x14\x37\x64\xcd\xc8\x97\x1d\xdc\xca\x97\x30\x51\x6b\xba\xdc\xd0\xb9\x5e\x67\x79\x86\x55\xc5\xac\x3a\x76\xc3\xc9\x28\xd9\x5a\xd1\xe5\xd5\x6a\x25\x8f\x6b\x56\xbe\x5c\x7b\xe4\x71\xc2\x6f\x7f\xba\x5f\x4f\x21\xf9\x27\x2d\xf1\x76\xbf\x92\x8a\xe9\xf7\x8d\xd7\x69\x60\xff\x49\xeb\x6b\x1d\x93\xa4\xc3\x7d\x65\xda\xa1\xe3\x6e\xc2\xb7\xcf\xbe\xf3\x44\x84\x93\xd6\x83\x5d\x13\x8f\x92\x71\xfb\x0a\xfb\x6c\x4f\x41\xb7\x9a\xb9\x7a\x26\x6f\x65\x69\xde\x26\x6a\x49\xb6\x79\x93\xf3\x72\xd3\x6d\x71\xb7\xae\x11\x53\xcf\x67\x33\x8e\xae\xe6\xd4\x7a\x43\x2d\x90\x3c\xb1\x2a\x8c\xe7\xf3\xad\xa7\xad\x96\x64\xdf\xfe\x14\x53\x4e\x73\x21\x4e\x5a\x5f\xab\xcd\x93\xb2\xe5\x57\xd2\xe6\xe7\x49\x1b\x27\xad\x07\x4d\xc3\x1f\xfc\xb5\xd9\x72\xbe\x88\xa2\x87\xb9\x44\x6a\xc5\xb2\x86\xeb\x56\x2d\xcb\x5b\x55\xac\xda\x5a\x05\x5b\xd4\x29\xd9\x4a\x51\x33\x33\x32\xca\x15\x9a\xb6\x5e\xe5\xc5\xa2\x5c\x95\x4b\xf9\xbc\x99\x69\xf1\xaa\x95\xcb\xee\x3b\x7d\x80\x19\x3f\x0c\x81\x5a\x6f\xd0\x82\x5a\x6d\x65\x2d\x6e\x69\xa5\xa6\x2d\xe7\xca\x75\xa3\xd2\x94\x33\x99\x92\xd3\x6c\xb6\x4c\xb5\x94\xcf\x92\x7a\x45\x41\x46\x9e\x37\x50\xc1\x32\x1b\x59\x8e\x9d\xdc\x61\x08\x96\x8b\xce\x78\xd6\xdd\xed\xe9\x89\xbd\xc1\x3c\x7a\xf6\xd9\x82\x71\x78\x20\x52\x73\xaa\x2f\x1d\xb9\x60\x16\x85\xdd\xc5\x9f\xde\x60\xd2\xf1\x46\xcb\x21\x39\xfe\x45\x77\x3e\x5f\x3e\x4a\x46\xd2\xde\x3d\x1a\x86\x64\xdf\xfe\xcc\x70\x9d\x65\xb4\x9c\xb4\xd0\xdf\x62\xb8\x16\xb3\xe5\xcb\xd1\x72\x6a\x99\x7f\xf3\xd1\x7a\xc8\xf6\x39\x69\xfd\x3d\x26\xd7\xab\xa3\xf5\xef\x3c\xb7\x4e\x53\xaa\x4e\x5a\x0f\x8b\x13\x76\x18\xad\x41\x77\xd8\x3d\x68\x7f\x09\x21\x8c\x39\x02\x98\x09\xfa\x4f\xc2\x39\x15\x80\x3f\x8f\xc3\xaf\x33\x9c\xbf\xc4\x4c\x4b\xd8\x81\x4f\x8f\xdd\x53\x16\xdb\x49\x0b\xfd\xbb\x8c\xdd\x5f\x35\xef\xbe\x61\xec\xce\x12\x07\x4f\x5a\xe0\xc4\xd9\xd9\xf7\x29\x1e\x78\xed\xf9\x6f\x7f\xfc\xf8\x7f\xf0\xf7\x1f\xe8\x7f\xf6\xab\xa8\xa7\x5f\xfe\x79\xf8\xf5\x41\x79\xfd\x39\x8b\xa6\xcb\xee\x2c\x0a\x9f\xb4\xd9\x9f\xb3\x68\x35\x0e\x3c\x7f\x10\xfd\xf6\x3f\xdf\xa6\x4a\xce\x32\x0f\x4f\x5a\x5f\xbc\x20\x4d\x2e\x6c\xbf\xce\x82\xf4\x2c\x45\xf2\xa4\x05\xbe\xd6\x45\x4c\x3e\xdd\x7f\x1d\xd6\x9d\x27\x85\x1e\x5b\xe2\x35\x25\x78\x76\xe6\x71\xaa\xf9\x6e\xe0\xe8\x99\xe6\x33\xf3\x66\xd3\xca\x2b\x59\x43\x2f\x97\x31\xa1\xb4\xd1\x6c\xe4\xa8\x9a\x51\x5a\xcd\x4a\xc9\xcd\x56\xab\x39\x43\x75\x8b\x96\x53\xc1\x54\xb5\x2a\xa4\x51\xaf\xe1\x7c\xab\x70\x57\xab\x75\xdb\x76\x48\xc2\x0e\x7c\x6a\xc0\xce\x72\x6f\x8f\xad\x57\xad\x16\x04\xff\x3b\x64\xbf\xc0\x90\x9d\x25\x39\x1f\x5b\xaf\x2e\x12\xff\x77\xc8\x7e\x85\x21\x3b\xcf\x26\x3f\xb6\x40\xd2\xb5\xe1\xff\x8e\xdd\xf7\x8d\xdd\x59\xda\xfd\xb1\xf5\xc5\x0b\xa9\xe4\x23\xf3\xeb\xac\x06\xce\xeb\x0c\x1c\x5b\xa7\x67\x08\xc1\x20\xf2\x66\x2f\x17\xd6\x27\xbf\xfe\xdc\xd2\x5a\x35\xb2\xd9\x6a\x25\xaf\x17\x75\x66\x66\xb8\x9a\xa7\x65\x83\x34\xeb\xaa\xab\x16\x4b\xd5\x52\x96\x59\xae\xcc\x4d\x5b\xad\xe2\xac\xa5\x5b\x66\xab\x62\xbb\x6e\x56\xa1\xda\xa7\x8e\x46\xce\x8b\x1e\x1c\x5b\xe4\xd4\x5b\xe8\xb6\x47\xd1\xec\xcf\x7e\xb4\x7d\x90\x0a\x66\xe2\x46\xb9\x90\x77\x2b\x1a\xcb\xd7\x33\x2d\x4d\x26\x66\xa6\x98\xb5\xed\x72\xc9\x71\x2d\x6c\x39\x7a\x29\x53\x6a\x55\x1b\x46\x5e\x66\x66\xa5\x61\x14\xcd\x96\x6c\x67\xb5\xc3\x70\x3e\x20\xad\xa3\x6e\xbb\xb3\x97\x0d\xf0\x7d\xfd\x3c\x2b\xc9\x70\x6c\xa1\x6f\xe9\x27\xfd\xb6\x7e\x9e\x17\x8c\x38\xb6\xd8\xb7\xf4\x13\x7e\x5f\x3f\xcf\xca\x59\x1c\x5b\xa7\x5e\xee\xd0\x9b\x2f\x1e\xfa\x79\xa4\x10\x7d\x1f\x85\x67\x65\x32\x8e\x2d\xf2\x95\x87\x8e\xdf\xd6\xaf\xa7\xa2\x1d\xc7\xd6\xf5\xfd\x85\xf7\x37\x17\xbe\x4f\xdf\x9d\x17\x0a\x39\xb6\xd8\x35\xea\xdf\xda\x1a\xf9\x7e\x75\x7d\x5e\x9d\xe4\xd8\x42\xbf\x96\xd8\x3f\x57\x3d\x39\xb6\x4e\xed\xe4\x60\xbc\xfe\x73\xd1\x99\x45\xf3\xce\x78\x10\xee\xcd\xc0\xef\x3f\x7e\x1b\x46\xe1\xd9\xef\xd0\xef\x3f\x7e\xeb\x74\xdb\x9d\xf3\x5f\x7e\x77\x37\x1e\x4b\xae\x1c\x5b\xa7\xb3\xb7\x33\x1e\x46\x7f\x86\xe3\xa1\xd7\x1d\xed\xa7\x6e\xb4\xf1\x86\x93\x41\xf4\xcf\x60\x3c\xfc\xe6\xd9\xf8\x5c\xd0\xe5\xd8\x02\xff\x66\xfa\xfe\xa2\x4a\xcc\x73\xeb\x8b\xc3\xff\x93\x75\xec\xd7\x5a\xb9\x9e\x97\xc5\x39\xb6\x1e\x74\x06\x39\xb0\x6e\x32\xeb\x3e\x92\x78\x16\xbb\xfb\x1c\xd3\x8b\xce\x5d\xef\xc3\x9f\xff\xb9\x67\xf5\xbf\x7e\xdb\xcf\x4b\xf8\xfb\x8f\xdf\x46\x07\x79\xf8\xfd\xc7\x6f\xfe\x72\xbb\xef\xf7\xab\x81\xbf\x07\x5d\x3a\x18\x1c\x9f\x5f\x38\x5d\xe7\x0f\xdf\x72\xbe\xce\xff\xf2\xd4\x09\x63\xb9\x12\x2e\x98\x4e\x83\x99\x6e\x95\x6b\x99\xb2\x49\x78\x5d\xd1\x79\x86\xd0\x22\x31\x1b\x7a\x33\x97\x67\x05\xdd\xac\xca\x9a\x41\x4d\xa5\x56\x42\x19\xa5\xe2\xf2\xca\xd3\x78\x24\xfb\x76\x82\xf1\x78\x2c\x2e\x74\x6c\x89\xef\x18\x8f\x0b\x7e\xbf\x3a\x56\xef\xb3\xfb\xe5\xa8\x9e\x01\xfd\x9d\x46\xe3\xbc\xae\xd2\xb1\xf5\xb5\x31\x54\x49\xd9\xf2\x4b\x29\x96\xf3\x42\x52\xc7\xd6\x83\xed\xc1\x1f\x12\x64\xfc\x71\x39\x1e\xc7\x71\x34\xfb\xb3\xfb\xb4\x60\xf8\xab\xd5\x0c\xaa\x18\xae\x8d\x0c\xd9\xc9\x16\xab\xcd\x7c\xa1\x56\x28\x58\x55\x4d\x55\x59\x59\x2d\xe7\xcc\xa2\x9c\xa9\x59\x76\x35\xcf\xed\x5c\xc9\x46\xb5\x6c\x15\xb9\xb9\x46\x46\xae\x66\x9e\x46\x27\xd9\xb7\x3f\x31\x3a\x67\xc5\xb9\x8e\x0d\xf2\x89\xb1\x41\xf7\x19\x9b\x6f\x57\x39\xb7\x8d\x4c\x39\xcf\x95\xb2\x53\x2b\x37\x2c\x5d\x91\x4b\x8a\x5b\x64\x45\xa3\xea\xb6\x4c\x23\x63\x58\x8e\x6b\x5a\x4d\xdd\xd6\xe5\x4c\x96\x53\x47\xab\x1b\x75\xb7\xa1\xeb\xe5\x52\x45\xfd\xcc\xc8\x9c\x56\x3b\x3b\x36\x5e\x3d\x56\xfa\xd0\xfe\x69\xc2\xfe\x5e\xec\x9f\x26\xec\xf8\x5d\xf7\x4f\x7f\xf5\x91\x3b\x2d\x0b\x77\x6c\xa0\xaf\x35\x15\xc9\xc7\xe5\x97\x31\x15\x67\xe5\xeb\x8e\x8d\xaf\x5d\xbc\xdf\x30\x2f\x7e\x19\xc6\x9d\x55\xd9\x3b\x36\x1e\x16\x27\xe8\x3c\x7d\x52\xae\x22\x59\x73\xb5\xbc\x61\x6b\xa8\x90\x37\x68\xb5\xd8\xcc\xd2\xa2\x51\x6f\xb1\x0a\x6f\x1a\x85\x6a\x39\x97\xb1\x11\x2a\x73\xb3\x49\x32\xb5\x46\xb6\xc6\xb3\x99\x8c\x75\x96\xfe\x97\xa9\x36\x30\xa7\x45\xd9\xad\x12\x56\xce\xe4\xb2\xa8\x91\x93\x4b\x15\x15\x55\xab\xad\x02\x2f\x23\xc2\x32\xae\xae\xab\xb9\x86\x5d\x47\x55\x8d\x1b\xba\x86\x2a\x4e\xa5\x70\xe0\xd8\xc4\x5b\x74\x7e\xfb\xe3\xc7\xff\xfb\x9f\x8b\x54\xc0\x57\x72\x01\x3f\x1d\x83\x33\x1f\x2f\x67\x41\xf4\xe7\xd0\xdb\x5c\xc5\x3c\x51\x22\x72\xb3\x98\x25\xd8\xce\xb5\xf4\x06\xae\x94\x70\x55\x2b\x3b\x32\x72\xa8\xd5\xa0\x8a\x2d\x57\x9b\xb9\x9c\x6b\x62\xd3\xc8\xea\x0d\xec\xda\xac\x52\xcd\x57\x0b\x58\xb5\x2c\xe7\xe4\x45\x57\xe9\x7f\x7a\x7e\x3d\xa5\x31\x21\x07\x3f\x23\x11\xa7\x55\x0e\x8f\x0d\xf0\xcb\x4a\xc4\xbf\xae\xa4\x80\xfe\xcf\x5b\x0e\xcd\xbf\x95\xa4\x5c\x2e\x3e\x5f\x93\xa2\x37\x7a\x73\x37\xba\xbf\x4b\x44\xcf\xca\x5e\x1e\x1b\xe4\x65\xce\xf7\x0d\xe2\x75\xcc\x59\x4e\x3e\x8a\x1f\x54\x54\xc9\x17\x34\xb7\x8d\x54\xc2\x6f\x7f\x7e\xa4\x1e\xea\x8a\x1e\x1b\xaf\x3a\x70\xe0\x9f\xf4\x35\x27\x81\xbc\xbd\x13\x81\x7e\x55\x2f\xe1\xef\x31\x34\x8f\x95\x5a\x8f\x0d\xf6\x29\xdf\xfa\x7b\x9d\xeb\x47\x35\x7d\x07\xe7\xfa\x97\x1f\x9c\xd3\xea\xb7\xc7\x46\x62\x17\xee\x06\x1d\x76\xea\xc2\xdd\xa0\x4e\x7f\x0d\x8d\xf7\x0d\xb6\xe9\xb4\xdc\xf0\xb1\x41\xfe\xe2\x91\xbb\x61\xad\x76\xaf\xc0\xf6\x1b\xe7\x5c\xb2\x0e\x7c\x62\xe4\xce\xea\x32\x1f\x1b\x5f\xeb\x7c\xdf\x30\xa3\x7e\x19\x1f\xf2\xac\x7e\xf4\xb1\xf1\xb5\xce\xf7\x0d\x02\xfd\xab\x31\xee\xa1\xce\xf5\xb1\xf1\xc5\x45\x0d\x6e\x70\x4a\x7e\x19\xc6\x9d\x96\xe3\x3e\x36\xd8\x6b\xf5\xc6\x5a\x39\x2b\xef\xd2\x46\x4d\x6f\xe4\xa8\x5b\x6e\x15\x4b\x39\x8a\x72\x6a\x9e\xd6\x54\x93\xb8\x39\xa7\x51\x34\xcd\x7a\xae\x55\xcb\xa3\xac\x45\x14\x03\x99\x86\x59\x42\xea\x99\x03\xa0\xea\x2a\xc9\x20\xb5\x46\xa8\x6a\x56\x4b\x25\x52\x91\x75\x1b\x15\xb2\x2d\xd9\x34\x1c\x6a\xc9\x5c\xa7\x38\x8f\xeb\x65\x8b\x35\x34\x93\x35\x1b\x7a\xa9\x56\x6a\xe5\x2b\xb9\x4b\x07\xe0\x2b\xd6\xff\x49\x49\x7b\x4a\xf5\x4e\xf4\xed\xcf\x0c\xd4\x69\x95\xf2\x63\xe3\xb5\xea\x5c\xbf\xf2\x40\xbd\xba\x15\xf3\x5d\xdc\x7b\x2c\xcd\x7e\x6c\x24\x4e\x70\xbc\x81\x3f\x67\x6b\x89\xe4\x43\xf5\x6b\xc8\x7d\xc2\x0e\x7c\x62\xe4\xce\x6a\xd8\x1f\x1b\x5f\x5d\xe0\x20\xf1\xf0\xfe\x32\x9a\xfd\xac\xd2\xfe\xb1\xf1\xb5\xd9\x64\x37\x08\xf4\xaf\xc3\xb8\xd3\xeb\x00\x8e\x8d\x2b\x8b\xb0\x8c\x5a\xb7\x95\x5c\x4d\xd3\x1c\x9e\x2f\x34\x9d\xa2\x5e\xac\x35\x15\xb9\xd0\x34\x91\x4d\x0c\x94\x2f\x5b\xcd\x06\xaa\x51\xbb\x5a\xc8\x67\xaa\x86\xdc\xcc\x50\x27\xa3\xcb\x6e\xf9\x85\xc4\x29\x3c\x6b\xb9\xb9\x42\x81\x55\x4d\xcc\xf5\x7c\x55\x76\x1b\xd4\x96\x1b\xc5\xac\x92\xcb\x65\x73\x45\x62\x14\x99\x56\x55\xd4\x56\xd3\x40\x4a\x8b\x94\xcb\xe5\x26\x72\xe4\xab\x25\x24\xe9\x25\xdb\x12\x92\xf9\x09\xb6\x9d\x5d\x59\x70\x6c\x7c\xf1\xa2\x3f\x39\xf7\x7f\x19\x79\x3b\xbb\x57\xe1\xd8\x78\x65\x09\x76\x97\xba\x91\x39\x8a\xec\x06\xab\xc8\x0a\xb3\x73\xa5\x62\xd9\x2e\x60\xe4\x92\x22\x76\x2a\x95\x42\xa9\x54\xd2\x2d\x4d\x77\x65\xc3\xad\x5a\xac\x96\xcd\xb2\x96\x5c\xaf\x66\x69\xab\x92\xb8\xe4\x6b\xb2\xb7\x25\xe2\x9e\xb8\xe0\xde\x97\x54\xdd\xfc\x37\xe3\xde\xd9\x75\x15\xc7\xc6\x17\x1b\x89\xe4\x4c\xfc\x65\x26\xed\xd9\x9d\x1a\xc7\xc6\x2b\x07\x27\x77\x11\x3b\xc2\xea\xd5\xbc\xa2\x16\x0c\xd4\x64\x99\x66\xa1\xc9\x65\x43\xab\x57\xb3\x05\x1d\x3b\x32\x6f\x2a\x1a\x2e\xe5\x4a\x16\x2b\x73\xa2\x57\x68\xa1\xa9\x17\x73\x76\x1d\x99\xca\x85\xd8\x7d\x54\xea\x92\xbd\xec\xf3\xcc\x7b\xb8\xfd\xe3\xd8\x78\xc5\x97\xf9\x5f\xe6\x5d\x61\xde\xe3\x3d\x25\xc7\xc6\x57\x99\x8b\x7f\x4b\xe6\x3d\xdc\xa8\x72\x6c\xbc\x52\x5e\xfd\x7f\x99\xf7\x92\x79\xa7\x97\xbf\x1c\x1b\x5f\xbc\x3b\x99\x9c\x87\xbf\x8c\xb1\x38\xbf\xeb\xe6\xb9\xf1\xc1\x4c\xa0\x4c\x33\x2b\xe7\x4c\xb5\xa6\x1a\x44\xcd\x23\x57\xcf\x33\xb7\x5a\x90\x99\x9d\xd7\x9a\xd9\x6a\x93\x2b\xc5\x5c\xbd\x58\x29\x2b\xc5\x82\xa1\x39\x66\xd5\xa4\x6e\xa5\x54\x28\x1a\x9f\x19\xd8\xf3\x1b\x74\x9e\x1b\xec\x1d\xfa\xe0\x37\xd3\xf7\x78\x2f\xcf\x73\xe3\x8d\x84\xd0\x0c\xd6\xb8\x9e\x2f\x56\x4b\x36\xd3\x73\x4a\x4e\x57\x6c\x66\x30\x53\x23\x25\x54\x23\x0d\x9a\x6f\x21\xc2\xec\x9c\x49\xf2\x95\x5a\xd3\x44\x16\x51\x9a\xaa\x63\x55\x8a\xd6\x1b\x89\x33\xdf\xd6\xcb\xc7\x3b\x83\x9e\x1b\x6f\x65\x63\xa1\x4f\x66\x63\x7d\x7d\x27\xce\x2e\x19\x3a\x36\xbe\xb8\x86\x4d\xb2\x6e\xfd\x52\x3a\xe2\xec\x2e\xa4\x63\xe3\xab\x4f\x30\x0c\x8c\x1d\xb5\x50\xb1\xd5\x7c\x11\x95\x8a\x55\xa5\xc6\x9b\xae\x52\xa5\x98\x16\x0a\x5a\x5d\xd6\x0b\xd4\x55\x4a\x24\x6b\xab\x0a\xd1\x5b\xba\xcd\x5b\x32\x55\xeb\xf9\xef\x61\xdc\x3b\xf7\x2a\x2d\x66\x5e\x18\xdd\xe7\x4e\xa5\x07\xa8\x2b\xd9\x12\x7b\xde\x23\x00\xa5\x7f\x00\xf6\x0f\x80\x7f\x40\xf6\x07\xa6\x7f\x50\xf0\xf3\x10\xda\x01\x1f\xc6\xe7\xb9\x30\xee\xef\x3f\x20\x3e\xd4\x37\x3c\xf9\xcd\x63\xa9\x4e\xf8\x94\x33\x74\xed\xd6\xb4\x0b\x2a\xce\xe2\x49\x5f\x25\x82\xb0\x9f\x0f\x5e\x2e\x3d\xe0\x42\x70\x42\x05\x3b\x50\x71\xfa\xab\x87\xa2\x86\xf0\x29\xf8\x90\x30\x08\x99\x60\x10\x10\x8c\x18\xc7\xfb\xfe\x7e\x90\xae\xd3\xa8\xc6\xd7\xe9\xa2\x3f\x1f\x5e\xf4\xe8\x84\x9f\xd2\x45\xcf\xb9\x73\x64\xcf\x63\x8a\xdb\x13\x55\x00\x60\xc8\x39\x60\x87\xba\xb6\x09\x08\x83\x57\x09\x3b\x32\x0c\xbd\x64\x18\xfa\x00\xc3\x8e\xa4\x7d\x48\x48\x47\x73\x2f\x78\x71\x93\xd8\xbd\xc4\xf6\x55\xf0\xa3\x20\xbf\xb8\x0d\xec\x3a\x27\xdf\x46\x42\x2f\x6e\xec\x4a\x8a\x84\x5f\xdc\xaa\x95\x14\x89\xbc\xb8\x02\x2b\x29\x12\xbd\xbc\xa6\xea\xda\xa5\x76\xef\x22\xb1\x17\x17\x5e\x25\x45\xe2\x97\xf7\x3f\xbd\xa1\x36\xde\x46\x12\x97\x37\x21\x25\xee\x9d\x74\x89\x94\x98\x26\x08\x5e\xdc\x91\x93\x18\xea\xc5\x75\x45\xd7\x2e\x49\x7c\x1f\x0a\x5d\xde\x3c\x93\x9c\x2a\x7c\x09\x95\x9c\x2a\x72\x79\xa9\xcb\xb5\x7b\xbc\xdf\x87\xa2\x97\xd7\xad\x24\x87\x62\x97\x17\xa1\x24\x87\xe2\x97\x17\x95\x24\x87\x12\x97\x57\x88\x24\x87\x92\x2e\x2f\xf7\x48\x0c\x85\xc0\xe5\x55\x1b\x89\xe5\x0a\xc1\x4b\xa8\xe4\x54\xa1\xcb\x5b\x2c\x92\x53\xf5\xe2\x12\x8a\x6b\x97\xf1\xbf\x0f\x45\x2e\xef\x7d\x48\x4e\x15\xbd\xbc\x6a\x21\x39\x14\xbb\x84\x4a\xde\x41\x7e\x79\x7d\x01\x4f\x0c\x25\x2e\xa1\x92\x77\x50\xba\xbc\x3f\x20\x31\x14\x06\x97\x50\x89\x3b\x88\xe1\x65\x69\xfe\x6b\x37\xc6\xbf\x0f\x85\x2e\xa1\xae\xdd\x87\xff\x3e\xd4\x8b\x0a\xf4\xc9\xa9\x22\x97\x50\xc9\xa9\xa2\x97\x95\xd6\x93\x43\xb1\x4b\xa8\xe4\x1d\x7c\x51\x51\x3c\x39\x55\xe2\xb2\xc0\x75\x72\x28\xe9\xb2\xde\x72\xe2\x0e\x1e\x02\x2a\xce\xea\x1c\x27\x9e\x38\xa7\x75\x7f\x1f\xa0\x12\x77\x90\xa0\xcb\x12\xc2\xc9\x3b\x88\x2f\xa1\x92\x77\x90\xbc\xa8\xce\x0b\x12\x63\xd1\x17\x85\x63\x93\x63\xb1\x17\x15\x4d\x93\x63\xf1\x17\xa5\x36\x93\x63\x89\xcb\xd2\x8f\xc9\x59\x2f\xbd\xa8\x22\x99\x98\x2c\x0a\x5e\x94\x55\x4c\xee\x7a\xc1\x17\xb5\x0c\x93\x63\xa1\x17\xf5\x02\x93\x63\xe1\x17\x35\xf9\x92\x63\x91\x17\x75\xef\x92\x63\xbd\xac\x50\x97\x1c\x8b\xbd\xa8\x0a\x97\x1c\xeb\x65\x8d\xb6\xe4\x58\xe2\x45\xc1\xb4\xe4\x58\x2f\x4b\x9b\x25\xc6\x3a\x4c\xe6\xf3\xfa\x62\xc9\xb1\x5e\xd6\x00\x4b\x8e\x85\x5e\xd4\xd9\x4a\x8e\x85\x2f\xb1\x92\xef\x85\x90\x17\x35\xac\x92\x63\xd1\x17\xf5\x97\x92\x63\xb1\xcb\xea\x41\xc9\xa1\x5e\x16\x22\x4a\x8e\x25\x5e\x54\xe6\x49\xbc\x65\xc0\xa4\xcb\x42\x32\x89\x77\x6a\x38\xb8\xac\x7c\x92\x1c\x0a\x5e\x94\xe2\x48\xcc\xab\xbd\x4e\x38\x2f\xea\x91\x9c\x28\x7c\x51\xe6\x22\x39\x51\xe4\xb2\x60\x46\xe2\xf1\xe3\xf4\xb2\x84\x44\x62\x77\x73\xaf\x8a\xcf\xa1\x12\x7b\x63\x9c\x5f\x96\x31\x48\x4e\x95\xb8\x84\x4a\x4e\x95\x74\x99\xb9\x9e\x78\x47\x64\x6f\x02\xcf\xa1\x12\x77\x50\xbc\xc8\xd2\x4e\x4e\x15\xba\xcc\x2a\x4e\x0e\x85\x2f\x73\x60\x93\x77\x90\x5c\x26\x65\x26\x1e\x41\x41\x2f\xb2\x04\x13\x4f\x41\xc1\x2e\xf3\x0d\x93\xf7\x8f\x5f\x66\xe0\x25\xef\x9f\xb8\x80\x4a\xde\x3f\xe9\x22\xbb\x2d\xf9\x56\x3e\xb8\xcc\x93\x4b\x2c\x54\x12\xbc\xcc\x1c\x4b\xec\xb6\xee\x17\x09\xe7\x50\x89\xdd\x56\x09\x5f\xa6\x49\x25\xa7\x8a\x5c\x42\x25\xa7\x8a\x5e\xa6\x1f\x25\x87\x62\x17\xf9\x30\xc9\x65\x81\x5f\x66\xd6\x24\x67\x95\xb8\xc8\x35\x49\x4e\x94\x74\x99\xb5\x92\x98\x53\xf0\x70\xa4\x70\x9a\xc8\xf1\xd6\x59\xf7\x7b\x58\xf0\x12\x2b\xb1\x1f\x0d\x01\xba\xc8\x94\x48\x7e\xdc\x04\x2e\x93\x2e\x6e\xe9\x22\xb9\x8c\xa4\xbf\x81\x2e\x7a\x89\x95\x1c\x8a\x5d\x84\xa8\xdf\x00\xc5\x2f\xa1\x6e\xc0\x12\x17\x01\xe0\xe8\x86\x53\x51\xe9\x12\x2b\xf9\xa9\x28\xb8\x08\xad\xbe\x81\x2c\x78\x19\xa6\x7d\x03\x59\xe8\x22\x68\xf9\x16\xb2\xf0\x25\x56\x72\x28\x72\x11\x0e\x7c\x0b\x59\xf4\x12\x2b\x39\x14\xbb\x08\xb4\xbd\x01\x8a\x5f\x42\xdd\xd0\x43\x71\x11\xc6\x8a\x92\x1f\x6e\x43\xe9\x22\xe4\xf4\x06\xac\xc3\x09\xd8\x69\x78\xe8\x2d\x58\xf0\x22\x08\xf3\x16\x2c\x74\x11\x0b\x99\x7c\x18\x11\xbe\x84\xba\x81\x2c\x72\x11\x69\x78\x03\x59\x97\x41\x8b\x67\xc1\x51\x1f\x8b\x89\xfa\xb3\x1b\xfe\x39\x8f\xa6\x4f\xa1\x51\x35\xad\xe2\x68\x25\x55\xfb\x51\xd3\xec\x77\x82\xa3\x6a\x5a\x41\x53\xed\x1f\x93\xf6\x9f\x81\xb7\xf0\x06\xe3\xf6\x3f\xe7\xd1\x62\xe5\x0d\xfe\xcf\xcf\x0f\xbe\xf3\xe7\x9e\x7a\xfa\x10\xf2\xf5\xa9\xa0\xae\xbb\x07\x72\x1d\x79\xfa\xd3\x0f\x20\xf4\x69\x40\x60\x18\x71\x09\x62\x26\xc5\xa1\xa0\xb1\x07\x83\x20\x06\x30\xc0\x34\x40\x20\x8c\x69\x2c\x89\x38\x46\x31\xa7\x21\x40\x91\x17\x32\xe8\xc7\x21\x45\x20\x42\xf0\xe7\xef\x3f\xd8\x63\x24\x5c\x4e\xad\xb4\x2c\x6c\x38\xbc\xe9\x30\xcd\x64\xd8\x6c\x35\xf3\x6a\xa5\xec\xda\xa8\x5a\x6a\x96\xb0\xae\x50\xb5\xa4\x6b\xa5\x92\xa3\x39\x7a\xad\x28\x93\xba\x63\x9a\x66\x4d\x2b\xfd\x3c\xe8\x8c\xa7\x0f\x3e\xc4\xf2\x5d\x89\xad\xc3\xf8\x9f\x18\x12\x04\xf6\xaf\x7d\xfb\xe9\x79\x48\xda\x4f\x79\xff\xc9\xe7\x9a\xbc\x6a\x4b\x2c\x32\x46\x08\xd0\xe5\xd8\xd1\xdd\xd1\xb4\xe0\x2f\x50\x60\x55\x4b\xe5\xea\xcc\xd3\xc6\x91\x2d\x07\xb3\x6a\xde\xd9\xff\x79\x6b\xff\x9f\xd6\x6c\xb5\x0a\xed\x8c\x7c\xfe\x51\x8e\x3f\xce\xf7\xcd\x2c\x6a\xd4\x88\xbc\x3e\x3e\xd7\xf3\xa0\x36\x38\x7c\x5f\x0d\x0c\x16\x6d\x40\x66\xca\x5c\xb9\xc3\xbc\x3c\x24\x3d\x7d\xb3\x94\x57\x9d\x55\x3e\x87\x52\xa5\xe5\xce\x1f\xcb\xf9\x59\xec\xaa\x9e\x0a\x5b\xb5\x0a\xe7\x8a\xab\xa7\x69\xb1\xdd\xb1\x9a\x12\x37\xcb\x52\xa3\x59\x87\x3c\xea\x94\xf2\x3c\x04\xcb\xe1\x46\x69\x7b\x66\x4f\xc8\x3f\x9f\xfa\xb4\xff\xe4\x2a\x47\x72\x8e\x3f\x16\x4e\xe8\xfd\xef\xe7\xbf\x3f\x3c\x37\xf6\xff\x1d\xfa\x64\x9d\x7c\x75\xdc\x8a\x17\x59\x0b\x4f\x48\x37\xf6\xed\x21\xeb\x54\xc2\x6e\x34\x5e\x2c\x71\x6b\x2d\x69\x80\xe6\x16\xe3\x5a\x87\x16\x95\xed\x42\x9b\x1c\xbe\xa4\xd6\xe5\x55\x37\x38\xf2\x48\x95\x5f\xfd\x68\xaf\xff\xfa\x91\x87\x77\x7c\xff\xe5\x18\x7d\xe8\xfd\xb2\xfc\xdf\x47\xde\xb4\xf7\xff\x15\xf7\xff\x89\xe3\x9f\xa9\x9d\x41\x0a\x38\xe9\x68\xd4\x35\xa5\x45\xd9\x9f\x66\x15\x64\xb2\x2e\xe2\xe1\x28\x03\x6c\xbb\xef\xa1\x4e\x5e\xef\xaf\x9f\xc7\x5b\x36\x1d\x35\x55\x38\xc8\x4f\x35\x1c\xf4\x97\x0f\xbc\x7e\xf9\xa9\x5c\x23\xeb\x40\xaf\x74\xdb\xfb\xcd\x75\xb2\xf7\x3f\xf0\xe2\x5f\x23\xb5\x3c\x9a\x87\x32\x5b\x0e\x65\x23\x1a\x76\x17\x91\xb1\x11\x7e\xbb\x40\xfc\x6d\x67\xb1\xea\xf9\x73\xc4\x64\x75\x8a\x91\x3c\x6c\x2f\x1a\x4e\xbf\x9c\x5a\x37\x94\x74\xca\x36\x0c\x1b\xa6\xa3\xad\xbd\xaa\x0f\x60\x18\xe1\xb1\x5d\x5b\xe2\xb0\x30\x99\x57\xdc\x5c\xd7\x4d\xef\xc1\x0f\xc1\xda\xa3\xf1\x28\xfa\xf9\xfb\x8f\x92\x53\x28\x3c\xfd\xff\x18\x03\x0b\x3e\xe0\xe3\x9c\x68\xae\x40\x40\x8c\x7c\x89\x06\x00\x30\x1c\x78\x71\x88\x80\x8f\x58\x88\x78\x0c\x58\x00\x51\xc4\x84\x60\x40\x0a\x51\x28\x85\x98\x23\xe2\x0b\x02\x04\x82\x91\x60\x50\x70\xe0\x8b\x3d\x11\x8f\xc9\x80\x77\xd2\x5c\xe8\x3d\xcd\x85\xf7\xae\xe6\x55\xcd\xb5\x7f\x4a\x7e\x5e\x86\xc0\xde\xaa\xb9\x2e\x67\xe5\xeb\x9a\xeb\x28\x0d\xa7\x9a\x8b\xe8\xdc\xce\x8c\x16\x65\xa7\x99\x29\xb6\x49\x31\x1e\xab\xd6\xc0\x2f\x54\x2b\x2d\x9d\xd7\xd7\xa5\x89\xa3\x17\x57\x8b\x51\xb5\x31\x6d\x18\x5d\x37\x3d\x1d\xb9\xee\x12\xf8\xab\xb6\xeb\xd4\x17\xe3\x6c\xb9\x1c\x4d\xb5\x41\x35\x5f\x70\xa7\x8b\x72\x03\x67\x77\x52\x37\x3f\x00\x8d\x8a\x79\x37\xcd\x75\xf2\x47\x49\x34\x07\x3c\xf2\x48\x79\x7d\x8a\xbc\xa3\xb9\xee\xf7\xfe\x44\x9a\xf3\x8a\xe6\xe2\xc7\x3f\x4b\xa2\x39\x8a\x44\x7e\xd6\x1c\x57\xde\xff\xb6\xe6\xba\xa3\xe6\xfc\xcc\xfb\x1f\x35\xd7\x52\x49\x81\x35\xe5\xf6\x20\xbb\xde\x19\xe5\x8c\xce\xe4\x1e\x6d\x6c\x81\x93\xab\xa6\x60\x90\xf1\xea\xca\xae\xc0\x5b\xa0\x3e\x1d\x74\x8d\xa1\xc5\x26\x28\x57\x58\xe4\x38\xc9\x65\xb3\xbe\xa7\xd8\xbd\xd1\xb4\x63\x3a\xb5\x2e\xca\xcf\xec\xc1\x62\x13\xa4\xdd\xee\x24\xcc\xf6\xd5\xca\xbd\x35\x17\x27\x3e\x43\x21\x45\x18\xc2\xc8\xc3\x31\xe1\x98\x4a\x31\x27\x7c\xbf\xac\xa5\x98\xe0\x58\xe2\xcc\x8b\x3d\x12\x87\x18\xb0\xc0\xf3\xa2\x38\x8a\x68\x14\x87\xbe\xef\x43\x40\xe2\xf8\xe7\xef\x3f\x0e\x27\xce\x77\xd3\x5c\xf0\x3d\xcd\x45\x18\xa2\xfc\xaa\xe6\x7a\x7a\x7a\x1e\x72\x7f\xab\xe6\xba\x9c\x95\x17\x9a\xeb\xe1\xd3\x3a\x79\x7e\xd4\x5c\x72\x79\xb6\x6a\xd5\xb2\x23\x1b\x9b\xab\xa1\x0d\x2d\x3a\x30\xd3\x83\x76\x7b\xd2\x8a\xc8\x68\xa3\xd3\xc6\xca\x94\xf2\xe9\x5a\xa1\x9c\x21\xd2\x3a\x9e\x4e\x05\x99\x2f\x47\xc1\xb8\x65\x8c\xb0\x21\xc7\xc0\xd2\x36\xc5\x35\x8e\x16\x4b\x9a\xed\x66\xea\x6b\x1c\xe0\x9e\xeb\x76\xe4\xc2\xbd\x34\x57\xf9\xb8\x4e\x4c\xa2\x39\x7a\xe5\x23\x8f\x5e\x9f\x21\xef\x68\x8e\x3b\xbe\x3f\x91\xe6\xbc\xa2\xb9\xd8\xf1\xcf\x92\x68\x8e\xf2\x61\x29\xf8\xa0\x39\xae\x7c\xde\xd6\x5c\x77\xd4\x9c\x9f\x79\xff\xa3\xe6\xca\x4c\x39\x72\x3a\x2d\x20\x6d\x7d\xda\x97\xec\x54\xab\x16\x53\xd7\xc8\x37\x9a\x4b\x53\x54\x53\xf5\xd9\x36\xae\xad\x40\x77\xd7\x4e\x59\x81\xce\xa6\xab\x72\xa1\x30\xc1\xf9\x5c\xcd\x94\xb6\xb2\x2e\x65\x36\x45\xbb\x58\xc2\x33\x7f\x59\x75\xdb\x30\x28\xe1\x12\x41\x39\xa3\xa2\xae\xef\xad\xb9\x04\x92\x42\x8a\x63\x14\x06\x51\xe4\x47\x10\x78\xb1\x00\x80\x53\x46\x7c\xe0\x45\x71\x18\x09\x28\xf9\x12\xe5\x98\x78\x21\xc1\x30\x8c\x05\x41\x1c\x30\x0a\x23\x1e\x85\xc2\x93\xc0\x5e\x73\x89\x9b\x35\xd7\x53\xf2\x0b\x3d\xa4\x3a\xbf\xad\xb9\x28\xc7\x92\x74\x55\x73\x3d\x3d\x3d\x4f\xf1\x49\xae\xb9\x32\x7d\xf9\x5c\x53\xc9\xf2\xd5\x35\xd7\xc9\xf3\xa3\xe6\xca\x4c\x81\x59\xef\xe4\x4b\xc6\x54\xf2\xda\x60\x5e\x4d\x55\xd3\xc1\x0a\x87\xd2\x42\x5b\x7a\xae\x36\x44\x8a\xb7\x33\x76\x46\xa1\x1a\xe6\x7a\x92\x37\xf0\xea\xc5\x96\xd2\xd9\x8c\x4d\xdc\x32\x26\x16\x9e\xcd\x3c\xd5\xdc\x6d\xc7\xf9\x56\x39\x35\xa1\xba\x52\xdf\x8f\x10\x4a\x39\xb9\xbb\x69\xae\x13\x85\x93\x44\x73\x8c\x8e\x3c\xba\xf2\x79\x47\x73\xdd\xef\xfd\xc9\x34\xd7\x9d\xb5\x55\xb9\xf2\xc6\x3b\xdf\xd6\x56\x7f\x91\xb6\x7c\x55\x73\xd3\xdb\x68\x79\x78\x51\xf9\x6a\x7f\xbf\x87\x17\x9f\x7f\xff\xa3\xe6\x66\x0b\xb5\xee\xd6\x7a\xb5\xfc\xaa\x31\x2e\x15\xb4\xb8\x1f\xe3\x82\x84\x63\xbf\x5a\x18\x0e\x15\x73\xd1\x6e\xcc\xb7\xc5\xad\x0a\x9a\xd5\x71\xba\x31\x69\x0c\xec\x5c\xc5\x0d\x3c\x35\x44\xb5\xbc\x2d\x31\x86\xda\xdd\x40\x4c\xd5\xa1\xbd\x9a\x46\xd5\x75\xbd\xb9\x08\x73\x8b\xd5\x40\x69\xdf\x5b\x73\x83\x88\xfa\x21\xc6\x08\x49\x30\xc2\x40\x12\x11\x91\x84\x60\x61\x8c\x82\xd0\x97\x7c\x8a\x99\xe4\xd1\x58\x8a\x80\x27\x49\x1c\xc7\x20\x94\x22\xe8\x49\x44\x48\x01\xa3\x02\xfa\x1e\xda\x6b\x6e\xfe\xa8\xb9\x93\xa6\x5b\xff\xfe\xe3\x90\xe1\xf2\xa6\xbe\x66\x82\x81\xeb\x3e\xf2\xd3\xd3\xf3\xf4\xc7\x07\x79\xcc\x15\x84\x5e\x59\x55\xfa\x7e\x1e\xe9\x32\x6e\xd4\x7b\xd5\x59\x7e\xd8\x6b\x02\x10\xe7\xc4\xbc\x60\xf0\x21\xd0\xaa\x6b\xb3\x91\x96\x9b\x58\x3e\x5f\x39\x7a\x17\x03\xfb\x42\x37\x24\xd0\x35\xa7\x4a\x4e\xa9\xaf\xd6\x59\x69\x7d\xd0\xef\xba\x23\x51\x4d\x5a\x6f\xda\x9a\x9d\x11\xf6\x74\xe3\xcc\xfa\x6d\x15\xa4\x79\x53\xdf\x96\x32\x8b\x39\xab\xd0\xce\xb2\xaa\xc7\x99\xea\xb6\x1a\x8c\xf5\x70\xc5\xbd\xe2\x24\x3d\xb7\x56\x2a\xae\x5a\xfd\x66\xaf\x5c\xec\xb5\xfd\xbc\xe9\x34\x79\xad\xad\x6d\x9c\xc8\x55\x68\x2c\xb2\x1f\xd0\xef\x67\x82\x7b\x55\xbf\x9f\xfc\xbd\xbb\x5a\x87\xaa\xa4\x56\xe7\x33\x37\xc8\x84\xad\x46\x29\x37\x9f\x7a\xa5\xd8\xae\x0a\x7f\xbb\x9e\xf7\x96\x7e\xa5\xaa\xcb\x03\x5f\x28\x71\x50\xc8\xcd\x5a\xae\x14\xb6\x36\xfe\xf1\xeb\x27\xec\xd5\x3e\x8b\x27\x5f\x7e\xf7\x95\x8f\x72\x67\x7a\xbd\xef\xa0\xf7\x61\x87\xf8\x52\x67\x2a\xdd\xb4\x02\x0a\xc0\xcc\x6d\x17\x9d\x75\x09\x0e\x5c\xe0\x6d\x27\x63\x28\x95\xf4\xcd\xaa\xa0\x6e\xcb\x74\xa1\x68\x81\xfa\x20\x43\x73\x6f\x31\xe8\x41\x38\xca\x1e\x5d\x20\x65\x7c\x84\xaa\x7c\x16\x4f\xbe\xf8\xee\x6b\x1f\xed\x46\x7a\xbd\xce\x76\x0c\xbf\x91\x5e\x59\xfe\xeb\x6c\xd2\xab\xf6\x11\x27\xe7\xdd\x7e\xac\xf5\x93\xdd\xb9\xfe\x17\xf3\xee\xd6\xb1\xbe\x94\xcd\xaf\xa4\xf7\xd1\xfe\x6e\xa0\x15\x55\xad\xa0\xe8\x2a\xda\x3a\xad\xb1\x79\x3d\x4f\x0d\x79\x61\xa5\xe0\x46\xf4\x2a\xdc\x2f\xf7\xcb\xae\xdf\xaf\xe2\x35\x08\xfa\xcd\xbc\x82\xfd\x14\xea\xe5\x63\x9e\xe1\xeb\x05\xb0\x69\x96\xec\x7a\x06\xc9\x6d\xbb\xf5\x6c\x0a\x8c\x95\x62\x5d\x1f\xca\x51\x33\xad\xdc\x7d\xcf\x07\x79\x02\x50\x0e\x51\xc0\x42\x08\x62\x29\xe2\xc4\xf7\x41\x10\xc4\x94\x78\x91\x84\x3c\xe4\x13\x1f\x46\x54\x30\x42\x61\x1c\x09\x88\xb1\x87\x08\xc6\x02\xb2\x98\xf9\x94\xf1\x60\x6f\x7f\xd9\xa3\xfd\x95\x4b\xd9\x56\xa6\xaa\xa8\x25\xdb\x69\x1a\xe5\x8c\x6a\x6a\x6e\x51\x56\xad\xa2\x5a\x6b\x69\x75\x8d\x34\x5a\xb9\x16\x56\x5b\x99\x16\xb6\x50\xad\x99\x27\x79\x9d\x53\x23\xcf\xdc\x9f\xc7\xc4\x7a\xf8\x50\x39\xe7\x4d\x4b\x2c\x00\x13\xe2\xaa\x25\x7e\x7a\x7a\x5e\x3e\xe0\x41\xf2\x95\x49\xd0\xeb\x6a\x76\x0b\x2c\x3b\xeb\x8d\x69\x76\xda\x8a\xe5\xe6\x1b\xb5\xba\xb9\x45\x76\x0b\x15\x0c\xc1\xe3\x69\x1d\x06\x4e\x9c\x3e\xf1\x9c\x0e\x5a\xf4\x0d\xcf\xe9\x41\xb3\xe6\x06\xdb\xb2\x51\x2d\x8d\x6a\x4c\xcf\x68\xfd\x61\x4e\xd6\xa4\xf6\xa4\x65\x3a\xa3\x42\xab\x34\x72\xe7\xbd\xdd\x22\x35\x69\xd6\x37\xd5\xb4\x74\x2a\x32\x4d\x48\x4e\x9b\xcf\xcf\x15\x39\xcf\x26\x41\xd3\x2d\xee\x64\x6d\xa8\x03\xa1\xb6\x60\xa1\x31\x5c\x2d\x4a\x99\xbc\xb7\xec\x6c\x52\x65\x63\xb8\xb0\xd2\x85\x3e\xe9\xd4\xed\xa2\x59\xad\x2b\xe5\xc8\xaf\xcf\x69\x43\xb3\x7a\x52\xb7\x36\x6b\xe7\x6c\xa0\xcd\xd7\xcb\x8c\xda\x42\x5d\x2a\x6b\xbb\x75\x3b\x37\x8e\x25\xb9\x7d\xa2\x05\xe4\xab\x16\xf9\xb4\xaf\xd7\x2d\xf2\xc9\x1f\x7d\xb2\xef\x27\x1e\x4f\xf0\xda\xf4\x39\xe3\xeb\x2b\x1f\xe5\xce\xef\xbf\xe7\x5e\xd1\x89\x46\x95\xbd\xa6\x41\x3a\x1a\x0a\x0b\xe3\xa0\x58\xab\xb9\xae\x6c\x23\x75\xd0\x1f\xd4\x82\x45\x1f\x85\xdd\xad\x55\xc6\x6c\x10\x36\xb3\x7a\xfa\xb0\xe3\x7e\xa2\xdd\x4b\xeb\x37\xd8\xf2\xb6\x86\x24\xb7\xbd\xff\xc1\xe3\xf8\xfc\xfb\x1f\x35\xde\x57\x09\xed\x7d\x35\x1e\xf5\x7d\x3f\x0a\x63\x9f\xa2\x28\x0e\x61\x48\x43\x89\xe3\x08\x21\x4a\x00\x20\xc4\x43\xdc\x17\x10\x52\xce\x11\x86\x04\x49\x38\xc2\xbe\x27\x7c\x18\xfb\x10\x45\x0c\x07\x1e\xda\x13\x71\xc8\x43\xbb\xd1\xe3\xa0\xef\xe9\x39\x09\xf1\x37\x3c\x8e\xa7\xa7\xe7\x25\x49\x6e\xf5\x38\x5a\x17\x03\xfb\x62\x6e\x24\x98\x6b\x57\x3c\x0e\x45\x2d\x16\x7b\x4d\x69\x53\xc6\xcd\xfc\xa4\xc2\x96\xb5\xb4\x03\x95\x69\xb8\xab\x76\x6a\x8a\x5b\xc1\xb4\xbb\x1a\xb6\x36\x96\xd2\x8e\xa7\x95\xb9\x9d\x19\x7a\x50\xd9\x95\xe7\xd3\xb4\x3f\xd4\x4d\x62\xa5\xe2\xbe\x6b\x56\x4d\x27\x6c\xb5\xbc\x5d\xd3\x2c\xa2\x2e\x19\x66\xf9\xc8\xd1\xef\xe5\x71\x9c\xce\x81\x4f\xae\xe0\xfd\x5a\x64\xd6\xc1\xc9\xd7\x8f\x3f\x7e\xdd\x0a\xfe\x8e\xf4\x7e\x8b\x87\x74\xe2\x71\xdc\xb0\x0a\x5d\x98\x64\xd0\xfc\xee\x55\xe8\xdf\x68\xd5\x2c\xcb\x7f\x9d\x4d\x7a\xd5\x3e\xa2\xe4\xbc\xdb\x8f\xb5\x7b\x14\x53\xa5\xfd\xc5\xbc\xbb\x75\xac\x2f\x65\xf3\x2b\xe9\x7d\xb4\xbf\x95\x5e\xc6\x80\xe9\xc0\x5e\xc0\xed\xd4\x29\xcf\xfa\x2b\x58\xaa\x78\xa3\x00\xb8\x4e\xbb\xa1\x95\x52\xee\x8c\x0e\x03\x7b\xed\xea\xac\x5f\xd0\xd6\x74\xb8\xa8\x04\xbb\x59\x7e\x85\x68\x67\x1b\x65\xd2\x23\x9a\x53\x9d\x5a\x5d\x6f\x34\x1a\x73\xb8\xb5\x4b\xe3\xa5\xd9\x89\x28\x54\xee\x7f\x56\x43\x7d\x3f\x44\x3e\xa5\x82\x32\x4c\xa1\xf0\xb0\x88\x24\x9f\x13\xc9\x0f\x89\x2f\x82\x28\x64\xc0\x97\x62\xdf\xf7\xb9\xc7\x7c\x24\x70\x04\xa9\x17\x49\x82\x12\x81\x01\xf2\x02\xb2\xb7\xbf\xe4\x76\xfb\xfb\x50\x02\xef\xe1\x2a\xe2\xd7\x2c\x2c\x01\x0c\xa0\xab\x7e\xc6\xf3\xd3\xf3\xe2\x5b\x89\xec\xef\xf6\x38\x90\xee\xc5\xc0\xaa\x17\xf2\x28\x2b\x66\x64\x0f\xf3\x55\x38\x9d\xa5\xd4\xd6\xd8\xd8\xf6\xe4\x38\xb7\x99\x19\xcd\x56\x7a\x61\xc0\xba\x11\xa2\x72\xdc\xea\x57\xc7\xeb\xcc\xee\x74\x29\xf8\xec\x67\x3c\xda\xf3\x5a\xb3\x4f\xbb\xfd\xd0\x9b\xa6\xdb\x43\x4f\x2d\x8e\xd7\xfa\x66\xee\x6d\xb3\x28\xe6\xb5\x52\xbd\xa6\x87\xbd\x11\x6a\x69\x5e\x51\x16\xa9\x5b\xe5\x55\x89\x9b\x9d\xd3\xfe\x9c\xec\x38\x56\xab\x8d\x75\x71\x16\x16\x66\x9d\xd1\x20\x95\x35\xac\x14\x87\x0b\x5b\x57\xe8\x6c\xb0\x53\xe7\x56\x7d\x9b\x1b\x55\xf1\x3c\x58\x19\x19\xa9\x34\x34\x0a\xb8\xd0\xd2\xc6\x92\x84\x96\xf6\x2a\x63\x48\x95\xc2\x76\x4e\x7d\x15\x6d\xab\x01\x6e\xb8\x55\xb0\xca\x76\x5b\xd5\x39\x01\x46\xae\x27\x5b\x56\xfb\x80\xdf\xf4\x9b\x8d\x7a\xb8\x1b\x96\x58\xa9\xa1\xf4\x5c\x87\x96\x57\x0a\xc6\x0d\xdb\xf1\x3c\xb4\xce\xb4\x9a\xb8\x3a\xcc\xda\xad\x4a\x25\x9d\xe2\xe6\xca\x0a\xfd\x41\x71\x51\x52\x37\x63\x61\x94\xdd\xc8\xaa\xb4\x25\x50\xf5\x7a\x75\x69\xa6\xa4\xfa\xc2\x4a\xd5\xb4\x89\xa5\xab\x17\xeb\x8b\xe2\xc9\x9c\x3e\xfe\xf8\x86\xaf\xf8\xc6\x7a\xe3\x04\x2a\x81\xfd\x6e\x94\x4e\x06\xfb\x52\x66\xbe\x64\xbd\x71\x3f\x7a\xbf\x7a\x7d\xa4\x1e\x07\xe1\x60\x83\xe0\xe9\x97\x06\xb4\xec\x4e\xf4\xc6\x74\x45\xcc\x61\xbb\x97\x2f\x2a\xc2\xcf\xcd\x3b\xe1\x28\x05\x7a\x75\xa7\x83\x5d\x2a\x0d\xab\xcf\x32\x75\x6a\x0f\x93\x9f\x0a\xa1\x1b\xde\xef\xc9\x81\x73\xc3\xfb\xff\x96\x36\xf8\x16\x7a\x33\x5c\x77\xbe\x91\xde\xc3\x83\x9b\xe7\x73\x25\xb5\x81\xdf\x38\x3f\xfe\x6e\xf3\xf9\x05\x7f\x3f\x69\x13\xd5\x46\x5b\xcf\x3e\x20\x39\xd7\xde\xf1\x29\x7e\x7d\xf6\xfd\xcf\x3e\xf1\xe7\xdf\xff\xda\x9a\xfa\x44\x9f\x25\x99\xcf\xfe\x31\x32\x52\x39\xe1\xff\xaf\x39\x9f\x2f\xf4\xcf\x57\xd2\xfb\xb8\xa6\x06\x4e\x7d\x9e\xc9\xe3\x1a\x23\x2d\x1a\x77\x6a\x99\xf4\x52\xf2\x9d\xcd\x3a\xf2\x68\xb0\x9e\x65\x60\xd0\x99\x80\x90\xeb\x85\xad\x9c\xb6\x5b\x5d\x55\xda\xa2\x6a\xde\x8a\xc3\x59\x9f\xaf\xb7\x96\xa3\x8a\x59\xb9\xb1\x5e\xcc\xfb\xcd\x12\x1c\x6a\x61\x61\xe3\x0e\x1d\xbf\x5c\x52\xe5\xff\xfe\xef\xdf\x21\x82\x70\xd0\x0c\x68\x2f\xea\xd5\xdb\x2e\xca\x96\xed\xd9\x3a\x94\x60\x1f\xe6\x86\x8b\xb9\x8c\xea\x12\x68\x75\x1c\xe4\x68\x56\x7a\xb9\xf5\x77\xb8\x41\xed\x82\x5d\x99\x7b\x96\x9a\x19\xea\x3d\x60\x58\xa1\xd6\x18\xc3\xd8\x5b\xc7\x13\x2b\x93\xee\x77\xf2\xf6\x66\x3d\x78\x7f\xb1\x8e\x3e\xb9\x58\x0f\x63\x1a\x83\x48\xf8\xd8\xa7\x18\x87\xa1\x14\x84\x1e\x88\x63\x4e\x09\xf0\xa3\x18\x47\x52\x04\x25\xcc\x24\xc0\x40\x2c\x3c\xe2\x03\x02\x89\x0f\x22\x1c\x40\x9f\x60\x48\x7d\x78\x38\x1e\xc0\xb7\x2f\xd6\xdf\x0b\xa7\x22\x08\x10\x8a\xae\x2e\xd6\x9f\x9e\x9e\xd7\xa4\xbd\x75\xb3\xac\x79\x21\x31\x2f\x36\xcb\x12\x2b\x86\xc7\xaf\x9f\x2c\x96\xb7\xfa\xba\xd3\x90\x72\xcd\x4a\xbd\x99\x83\xd3\xae\xef\x47\xd3\x5a\x6f\xe3\xee\x3a\x2b\x6a\xa8\x40\xe4\xd1\xaa\xd6\xdf\xec\x5c\x7b\x6d\x6e\xfb\xab\x8a\x18\x80\x54\x44\x8a\xa4\x83\xda\xcb\x71\x5e\x48\x73\xa1\x3b\xb1\x31\x35\xca\xbb\xcc\x70\x9c\x9b\x97\x6c\xaf\x10\xb8\x1f\x0a\xbf\x3a\x9b\x11\x57\x17\xaf\xc9\x8f\xbb\xc3\x51\x44\x58\xfa\xf8\xf5\xc6\xf1\xc7\x2f\x34\x76\xf7\xa3\xf7\x5b\x16\xdb\x27\x9b\x65\x37\x28\x7b\x14\xf2\xde\xec\xbb\x95\xfd\xdf\xc8\x38\xc9\xf2\x5f\xe7\x1c\xbc\xba\x59\xb6\x4e\xce\xbb\xfd\x58\x2f\x4e\x5c\x52\xf7\x8b\x79\x77\xeb\x58\x5f\xca\xe6\x57\xd2\xfb\x68\xd8\x45\x47\x18\xf5\x55\x75\x00\xb2\xf5\xcd\xc2\x1b\x0f\x11\x9e\xf6\xc7\xa2\x51\x24\x7e\xaa\x26\x2f\x2c\x75\x31\x03\x93\x62\x80\x34\xa1\x06\x93\x02\xb0\xcc\xd0\x1a\x2d\x33\x65\x23\x1c\x17\xa6\xea\xca\xf2\x2d\x05\xea\xdb\x7c\x37\x33\x5f\xd3\xa9\x32\xcb\x38\xa8\x8b\x73\xd9\xfb\x87\xc7\x05\xc2\x43\x22\xf6\x11\x0d\x09\x17\x24\xc6\xdc\xe3\x1e\xe0\x22\x82\x71\x14\xc5\x20\xf2\x31\x08\x3c\x46\x22\x49\x22\xfc\x90\xee\xe0\x05\x24\xf2\x00\xe3\x41\xc0\x10\x24\xec\xb0\x59\x86\x9e\x8e\xe7\xdd\x9a\x5a\xcc\x57\x5c\xa6\xb9\x85\x66\xd9\xb2\x6d\x66\x5a\x56\xb9\x99\x29\xd6\x4b\x4a\xc3\xb0\x2d\xbb\xd6\x32\xea\x8d\x06\x29\x34\xe4\x6a\x5d\x29\xdb\x3a\xad\xda\x05\x39\xf3\xf3\x58\x73\x1b\x20\x48\xde\xb3\xc4\x18\x08\x7a\xf5\xd8\xea\xf0\xf4\x90\x4c\x76\x56\xd2\xfd\x41\xf2\x33\x5a\xa7\x58\xcf\xe8\x5d\xb7\x19\xee\xe8\x4e\x0c\x38\x6e\xe6\xb6\xb3\x0a\xaa\x96\x04\x6d\x55\x1b\x70\x59\x98\xab\xa5\xca\x72\x18\xcf\x0f\x46\xf8\xe1\x78\xfe\xf0\xcd\xdc\xc5\x10\x9f\x58\xe2\x43\x50\x4f\xd6\x1f\x66\x17\x2d\x5b\x3b\x7b\xae\x64\xe4\x75\xf1\x34\x39\xb3\xc6\x5a\xa9\x4d\xff\xf0\x18\x6b\x1b\xb3\xa4\x73\x69\x9d\xab\x55\xdd\x56\x34\xb3\x2c\xb8\x2b\xba\x83\x68\x52\x9c\x2f\x3b\x63\x33\x4b\x57\xfa\x08\xb5\xd5\xb9\x3e\xcc\x4c\x1a\x71\xbb\x2c\xea\x79\x15\x2b\x55\x63\x58\x4e\x8d\x22\x69\x3e\x71\x9a\x83\xba\x5e\xec\x69\xcb\x4e\x59\x1f\x5b\x9d\x01\xec\xcc\x8a\xea\xc7\x8e\xdf\xf3\xa7\xa2\x7a\xd5\xe2\x9e\xfc\x51\xb1\xa6\x6d\x9c\x62\x64\x76\x42\x6c\x8d\xac\x6d\x73\x15\x06\x7e\x7e\x91\x69\x69\x78\x37\x18\x64\xfd\x06\x59\xae\x0d\xa8\x3e\xf5\xed\xb0\xca\xe8\x4c\x8f\xbc\x7b\x70\x85\x5e\x64\x6c\xbc\x63\x41\xef\xf7\xfe\x5c\x92\xf7\x9f\x68\xc9\xdd\xa1\xfd\x30\xeb\x37\x86\x9d\xad\x6c\xc8\x30\x8b\x83\x54\x90\x36\x23\x09\x6e\xe6\x53\x50\xea\xdb\x71\xb9\xe1\xd4\x17\x7e\x97\xcb\x3d\xa7\x30\x19\xf1\x07\xd6\xd7\x97\x6e\x03\x0e\x8a\xcf\xbc\xaf\x6c\x8a\xbd\x22\xb8\xde\xdf\x62\x92\xfe\x5e\xca\x9e\x56\xdc\xcb\xdd\xc9\x0b\x5e\xd1\xfc\xbb\x93\xc7\x9f\xec\xd3\xde\x0a\x19\xc5\x23\xb5\x07\x17\xf3\x65\x22\xdf\xdb\x9a\x1c\xdc\xf6\xfe\xdc\x38\xd9\xfb\x1f\x35\xf3\x57\x4d\xbe\xfb\x6a\x66\x18\x72\x81\x71\x40\x62\xcf\xf3\x81\x88\x18\x62\x40\xf2\x82\x18\x73\x48\x42\xe8\x7b\x7e\x84\x38\x43\xd0\x43\x3e\x46\x22\x0a\x63\xcc\x09\xa3\x91\x24\x79\x5e\x8c\x85\x14\x78\xfe\x5e\x33\xc3\x7b\x6a\xe6\x77\x7d\x24\x82\x39\xba\xae\x99\xf7\x4f\x0f\x9a\xf9\xec\x86\x8c\x5b\x35\x73\xf6\x62\x88\x3f\xa8\x99\xb5\x6d\x71\x77\x22\x22\x27\x9a\xd9\x68\x90\xed\x2c\x1b\xf6\x19\x8b\xdb\x99\x4c\x77\xc6\xdd\xac\x6c\x6b\x21\x1a\x0c\xca\x4b\x7f\xb7\x49\x77\x3d\x33\x28\xa2\x75\x3f\x8b\xc7\xcb\xa9\x59\x29\xa5\xe4\x5d\x77\x8b\x66\xf5\x45\x9e\xca\xe3\xed\xa4\x33\xee\x77\xd7\x73\xb7\xb9\xd2\x6b\xcc\xc9\x4a\xc5\x4e\x38\x72\xe4\x4c\xe5\x7e\x9a\xb9\x78\xb2\xfe\x48\xa0\x19\xbb\x99\x23\xef\x1e\x98\xf2\x49\xcd\x78\xc7\xf7\x27\xb2\x0c\x27\x5a\x6c\x73\x68\x7f\xb1\x66\x2e\x1e\x7d\xa3\xdb\x35\xb3\x6d\xec\x4e\x2d\xdb\x2b\x9a\xf9\xe4\xac\x2e\x89\x66\x34\x4f\xa8\x7d\x08\x90\x79\xc1\xc5\xb7\x35\xf3\x1d\x2d\xc3\x67\xde\xff\xa8\x99\xbf\x6a\xf2\xdd\x57\x33\x33\xc8\x02\x06\x24\x40\x78\x14\x8b\x58\x0a\x3c\x09\x08\x8f\xf0\xfd\x3f\x8f\xf8\x3e\x80\x82\x10\x29\xa0\x4c\xa2\x44\xf2\x42\x14\x78\x0c\x50\x09\x78\x9e\xcf\x09\x62\x3c\x12\x7b\xcd\x0c\xee\xa9\x99\xdf\x2b\xc0\x40\x28\xc7\x80\x5e\xd5\xcc\x4f\x4f\xcf\x2f\x1c\xba\x55\x33\x5f\x4e\xe3\x2b\x9a\xf9\xb5\x32\x1d\xda\x33\x5e\x45\x76\xab\xad\x92\xd5\x31\x55\x7b\xdd\x33\xdb\xb2\x29\xf9\x91\x86\x5b\xe5\xb4\x8e\xfb\xae\xd9\x71\x87\x75\x38\x51\x87\x5b\x1e\x88\xd6\x0c\xcd\xf3\x61\xbe\x3c\xf4\x0a\x23\x12\x0f\x65\x3a\xf5\x0a\xa9\x41\xa5\x98\x5f\x97\x6b\x9d\x45\x6f\xdd\x6f\x09\x53\xdf\x58\x4e\x28\x72\x72\xff\x7e\xda\xf8\x44\x7b\x25\xd1\x86\xc1\x91\x5f\x0f\xff\xbf\x08\x83\x79\x47\x1b\xdf\xef\xfd\x5a\x92\xf7\x9f\x1c\x7b\xde\xae\x8d\x9f\xfb\x52\x81\xa5\x5e\x40\x2e\xde\xa7\xde\x0f\xff\x4b\x34\xed\xcb\x32\x3c\x6f\x6b\xda\xbf\x48\xd3\xbf\xba\x13\xb4\xb9\x8d\x96\x87\xe2\x15\xc5\x23\x6f\xff\x42\x5e\x7c\xe6\xfd\x8f\x56\x47\xe9\x64\xfb\x20\xa5\xf5\x4d\x4b\x2d\x0e\x65\x79\x04\x17\xc4\x0e\xfb\x5c\xc4\x51\xb5\x3d\xcc\x76\x5b\xcd\x46\x3f\xef\x17\x16\xbb\xcd\x70\xe5\xad\x27\x60\xcc\x5a\xe3\x65\xdc\x49\xb9\x99\xe1\x64\xbc\x62\x75\x79\x3d\x93\x69\x3e\x87\x2c\xb5\x3a\x5a\xf7\x63\x4d\xaa\xe2\xb5\x7b\xff\xe2\x19\x52\x1c\xc7\x0c\x4a\x90\x71\xc8\x62\x1f\x51\x0a\x00\xc1\xb1\x17\x48\x4c\x78\x01\x0b\x20\x16\x00\x79\x31\x85\x9c\x79\x10\xc4\x01\x92\x20\x10\x71\x10\x07\x84\xd0\x28\xa6\x70\xbf\x30\x27\xd2\x1d\xad\x0e\x90\xde\xb3\x3a\x1c\xc1\xeb\x65\x7f\x9e\x9f\x9e\xdf\x4d\x77\xab\xd5\x79\x23\x38\x26\x99\x3f\xb0\xc9\x77\x75\xd7\x2d\x15\xcc\x6e\x03\xcf\x68\xaa\xaf\x9a\x43\xb1\x0c\xbc\x71\x9d\x2b\xc1\x4c\x1b\x55\x9a\x59\x1f\xcf\x61\x75\x5b\xdd\x3a\xbe\xdc\xcf\x0c\x3c\x75\xa5\xa5\xaa\xf9\x75\xb1\x35\x2e\x39\xb1\xdf\xaf\x38\xb9\xd9\x78\xb9\xad\xe7\xb7\xb0\x35\x71\xa2\x20\x50\xb6\xd3\xcc\x1d\x77\x6a\x8a\x27\x5f\x4d\x62\x01\xe0\xeb\xf3\xe5\xe4\xf3\x8e\x05\xba\xdf\xfb\x93\x25\x4a\x1c\xe7\xfe\x1d\xb5\x58\xa2\xd4\xf4\x7b\xbf\xff\x25\x3f\xde\x3e\x5b\xf8\x4a\x7f\xe8\x9d\xf3\x83\x24\xfd\x7d\x78\x59\xf1\xad\x1e\x7d\x29\xbf\x1f\x92\x51\x3e\xff\xfe\xa7\xf4\xbb\x2f\x52\x0c\xf7\xb5\x1a\x11\x61\x40\x82\x02\x70\x0a\x23\xce\x01\x22\x8c\x79\x42\x10\x2a\x28\x0f\x63\x82\x23\x12\x42\x4a\xa2\x40\x10\x9f\xf9\x5e\xc8\x50\x10\x51\xc0\xe3\x08\xa2\x18\x86\x5e\x7c\xa8\x11\xb2\xb7\x1a\xe8\x6e\xbe\x0a\x78\xdf\x6a\xe0\x37\x76\x91\xf6\x4f\xc9\xcf\xcb\x6b\x48\x6f\xb5\x1a\x6f\x14\x8b\x7b\xd5\x57\x79\xb4\x1a\x0e\x2a\xed\x4e\x16\xe0\x27\x56\xa3\xb7\x69\x8f\xec\xaa\xa2\x7a\x60\x04\xa3\xb8\x35\x0e\x36\x13\xad\xd7\x8c\x0c\xbb\x42\xe7\x9a\x6b\xd7\x43\x29\x1e\xaf\x97\x8b\x31\xea\x5b\x6b\x1a\x65\xd7\xed\xfa\x68\xc7\xca\xb3\xbc\xb9\x56\xab\x0b\x5a\x10\xdb\xc1\xb0\xd1\x95\xed\x66\xdd\xc0\xad\x6d\xdc\xc5\x5b\x3b\x3f\x55\xe4\x5f\xd2\x6a\x28\xaf\xcf\x94\x6f\xb3\x1a\x6a\x92\xf7\x7f\x8d\xd5\x30\xe4\xcf\x69\xed\x7b\x5b\x0d\x43\xfe\xdc\x8e\x8f\x2c\x7f\xb1\xdf\xf6\x05\xbe\x46\x52\xad\x2d\xdf\x89\xdf\x0f\xe5\xae\x12\x5b\x8d\xaf\x52\x0c\xf7\xb5\x1a\x44\x10\x48\x83\x10\xc4\xa1\x27\xf9\x81\xe4\x45\x3e\x8c\x81\x4f\xa0\xe4\xc7\x3e\x92\x24\x1e\x73\x0f\x79\x1e\xf4\x61\x14\xa3\x88\x42\x0f\x30\x80\x02\x06\x21\x20\x71\x80\x70\x10\x3c\x5a\x0d\x7c\x37\xab\xf1\x5e\xd2\x36\xe1\x88\x60\xf6\x86\xd5\x78\x78\x7a\x7e\xe3\xf4\xad\x56\xe3\x8d\xe2\xc8\x27\x56\xa3\x76\xfe\x3c\x83\x06\x20\xd8\x2a\x23\x1f\x57\xda\x01\x56\x3a\x2e\xaa\xef\x8c\x53\x89\x39\xb1\x22\xa5\xa1\xdb\xee\x8e\xdc\x4e\x33\xc5\xea\xf2\x7c\x00\xcd\xe5\x30\xde\xf4\x15\xca\xb7\xa8\xa0\xcf\xbc\x46\xc6\xe9\x57\x53\xf9\xcc\xa6\xd1\x10\x03\x3a\x89\xed\x7a\xb7\xb0\xd9\x70\x53\xd0\xfc\xac\x5c\x07\xd3\x92\xea\x92\x6a\xec\xcd\xdb\xd3\x4d\x16\x64\x55\xac\xcd\xdc\x20\x52\xef\x79\x16\x71\x6f\x2d\xfe\xd9\xb3\x88\xfb\xbd\x3f\x93\xe4\xfd\x5f\x63\x45\x8a\x72\x82\x7d\xfb\xbf\x70\x07\x47\x96\xef\x61\x45\x8e\xfb\xc0\xd2\x24\xd4\x8b\xed\x16\x92\x80\xa1\x97\xd6\x6e\xa3\x34\x08\xb6\x67\xe3\xf0\x05\x56\x25\xa9\x56\x97\xbf\x80\xff\x9f\x79\xff\xa3\x55\xf9\x2a\x45\x71\x67\x5f\xc4\x17\x54\xb0\x40\x82\x9c\x05\x24\x88\x51\x24\x18\xf1\x11\x45\x50\x22\xc2\x93\x38\x0a\x7d\x8a\x38\x09\x23\x44\x18\xc7\x8c\x49\x84\xe1\x08\x04\x5c\x20\x12\x44\x11\xa0\x7b\x05\x4e\xc4\xed\xb1\xbe\xef\x9e\x96\x08\x44\xc5\xd5\xa2\xaf\xcf\x4f\x9f\xac\x13\xc1\xe0\x0e\xb1\xbe\x8d\x8b\x81\x7d\xb1\x8a\x4c\xa0\xdf\xae\xc4\xfa\xaa\x72\xb1\x3c\x62\x39\xd2\x5b\xce\xdb\x93\xb8\x36\xd6\xd7\xa3\x85\x5e\xe9\xbb\x46\x66\x63\xa4\xeb\xa3\xad\x9e\x9e\x1a\xdd\x94\x1f\x16\x1b\xbb\x2e\xb4\x59\x63\xb0\x1e\x95\x53\x5b\xc3\x6e\x0f\x51\x6a\x58\xf6\x1a\x01\xdb\xd5\x97\x9b\x6e\xa1\xa7\x0f\x06\x3b\x25\xaa\xa4\x37\xf9\x55\xa5\x74\xaf\x58\xdf\xd3\x39\xf0\xc9\xd8\xd9\x58\xc4\xe3\xf8\x24\xb2\xaf\x7e\xfc\xf1\xeb\x62\x67\xef\x48\xef\xb7\xc4\x26\x9f\xd8\xac\x1b\xe2\x3f\xd3\x9b\x54\x47\xfa\xee\xf8\xcf\xbf\x51\xbc\xaa\x2c\xff\x75\xfb\x63\xaf\x9e\xf0\xac\x92\xf3\x6e\x3f\xd6\xe9\xa3\x50\x29\xce\x17\xf3\xee\xd6\xb1\xbe\x94\xcd\xaf\xa4\xf7\xd1\xfe\xb6\x33\x99\x49\xaa\xb3\x34\xf8\xcc\xc8\x37\xc1\x54\x11\x26\xaf\x02\x33\xa7\xca\xa2\x66\xc1\x96\xe8\xa4\x59\xd7\x58\x0d\xb1\x9d\x9d\x93\x85\x93\x1a\x4c\x02\x73\xb7\x9a\x77\x35\x62\x2e\x56\x93\xde\x70\x30\x2a\xcf\xa1\x3f\x77\xbb\x64\x43\x5b\xc1\xba\xd9\xb7\x44\x6d\x06\xee\x1f\xb7\x10\x79\x12\x8e\xe2\x50\x04\x28\x26\x11\xa1\x01\xc0\x50\x04\x4c\x8a\x02\x89\x0a\x86\xb0\x07\x22\x82\x39\x89\x09\x08\x29\x93\xa2\x28\x80\x88\x84\x04\x07\xc2\xa3\x24\x64\xe8\xc1\xfe\xde\xa1\x14\xe6\xbb\xbe\x9c\x44\x09\xbc\x9e\x6b\xb3\x7f\x7a\x38\x37\x02\x50\x30\x4c\x18\x07\xe0\x0e\xa5\x30\xeb\x17\x03\x7b\x62\x7f\x4f\xcc\x68\xfd\x49\xd7\x2a\xb2\xe2\xe8\xcb\xa6\x9b\x2a\xda\xed\x46\x7a\x9d\x59\xd1\x54\x29\x53\xef\x48\xf1\x9a\x0c\xa3\xf9\x6e\x13\x35\xcb\x92\xd0\xb5\x4a\xdc\x6e\xd6\x23\xb5\xc5\xa3\xb2\xaf\x1a\x68\x3c\xab\xe5\x9c\x92\x9c\xae\xe5\x99\x5e\x97\xd2\x4b\xbb\x5e\xdb\x18\x95\x4a\xc3\x98\x8f\x61\x65\xbc\xd1\x95\x8f\xf9\x66\xe6\xf1\x97\x0f\xab\xe6\x4f\xd9\x09\x63\xa6\xf5\x54\x77\xfd\x90\x58\x92\xe9\xe1\xb0\xad\x55\x26\xb0\x44\x1d\x1c\x2b\xb5\xb2\xba\x49\x8f\x66\xb4\xb9\xe8\xaa\xc3\x92\x89\xc6\x45\xb3\x55\xdc\xa4\x8a\x6e\x1e\x9b\xeb\x87\xaf\xc6\x41\x54\x38\x95\xfd\x23\x6d\x47\x1b\x5e\x48\x5a\x2c\xa6\xbb\xf4\x5b\xa1\xb5\x3a\xa9\x49\x79\x32\x79\xbf\xce\x26\xde\x91\xde\x6f\x59\x73\x9c\x44\x5d\x24\xd6\xeb\x79\xba\x18\x80\x94\x74\xac\x49\xf9\x3d\x7a\xfd\x6f\x64\x87\x0e\xfc\x3d\xa9\x12\xfd\x99\xb9\x52\xc8\x75\x57\x2a\xd7\xd2\xa9\xc3\xa0\x16\x2a\xf2\xf9\x98\x56\x3e\x8b\x97\x84\xbf\x9f\xa3\x77\xe6\xe9\x51\x3f\x08\x46\xdf\x43\xef\xab\x6b\x94\x13\x5e\x27\x91\xe5\xf4\x71\xa9\xa4\x5c\xea\xcd\x5f\x4b\x96\x5f\xce\xbd\xaf\xa4\xf7\x29\xca\xe5\x8b\x0c\xd6\x9d\xaf\x88\x41\x80\x87\x11\xf5\x39\x45\x04\x47\xc0\x07\x0c\x05\x58\x60\x1c\x53\xc1\x01\x66\x3e\x8f\xa4\x98\x11\x42\xb1\x1f\x11\x29\x8e\x29\x88\x71\x8c\xe3\x30\xe0\x14\xb2\x28\x60\xfe\x7e\x8d\xf2\x54\x2e\x34\x53\xa5\xb8\x21\x6b\x46\xbe\xec\xe0\x56\xbe\x84\x89\x5a\xd3\xe5\x86\xce\xf5\x3a\xcb\x33\xac\x2a\x66\xd5\xb1\x1b\x4e\x46\xc9\xd6\x8a\x2e\xaf\x56\x2b\x79\x5c\xb3\xf2\xe5\xda\xcf\xdf\x7f\x40\x09\x23\x8e\x29\x12\xf8\xdd\xd5\x0a\x05\x8c\x49\x57\xcf\x2b\x9f\x9f\x42\x89\x53\x26\x88\x24\x71\xf8\xbc\xf3\x5c\xb6\x42\x24\x57\xd5\x91\x83\x07\x76\x28\xb2\x06\x29\xe8\xa9\x68\x35\x88\x90\x91\x77\xc1\xc8\x6b\xaf\x07\xfd\x9d\x4e\x36\xed\xd9\xc3\xac\x3c\xac\x56\xd4\xc3\xa1\xfc\x1b\x51\x2e\xce\xb1\xfd\x49\xfc\x2b\x25\x3a\x3f\xf2\x51\x9e\x67\xbd\x26\x97\xfb\xb9\xb2\x65\x97\x95\x4c\xad\xc2\x47\x0d\xd4\x1a\xa5\xfc\xc1\x1c\x59\x19\x27\xf2\xfb\x28\xdd\xc7\xe9\xf6\x54\xcf\x57\x44\xe4\x96\xb3\xf3\x0c\x1b\x29\x91\xb6\xda\x16\x33\x82\x8a\xd5\x98\x2a\x9e\xdf\xab\xac\x15\xa9\x3b\xea\xc9\x8a\x51\x14\xd1\x3c\xd3\xe1\xbe\xd6\x57\x3f\xb0\x2a\x3a\xcd\x04\xb8\xbe\x32\x39\xd9\xe1\x25\x12\x76\x15\x2d\x1f\xda\x51\xbd\x84\xd7\x4e\xaf\x3d\x8f\x29\x4b\xd5\xb9\xdb\x9e\xf4\x6a\xe1\x34\xa3\x36\xec\x62\xdc\xcb\xa9\x8b\x6d\xa0\x6e\xc6\xb3\xf5\x72\x63\xa5\x47\xc7\x31\xb8\xf2\x79\x67\xa5\x71\xbf\xf7\xdf\x7a\x91\xc3\xd7\x58\xb6\xd3\xcf\xdb\xda\xf3\x6f\x62\x59\x5f\xb5\x54\x8b\x5b\x68\x7f\x12\xd4\xc2\x5b\xbb\x07\xdf\xc6\xbb\xcf\xbc\xff\xe9\xca\x9e\x89\xd2\xeb\x81\x5d\xbb\x02\xfa\x65\x0a\x17\xc3\x56\x7a\x48\xfd\x52\x6f\x0d\xf5\x21\x2d\xad\x68\x29\x4d\xf2\x9d\x6d\xdf\xd2\x87\x99\x8e\x2f\xa7\x26\xeb\x66\xa7\x20\x7a\x72\xba\x1c\x17\x58\xb9\xd2\x18\x12\x50\x94\x63\x77\x42\xd6\x72\x2d\x63\xe9\x33\x99\x44\x68\x63\xde\xbf\x0c\x6b\x88\x48\x4c\x04\xf3\x43\x8e\x50\x1c\x42\xc1\xa9\x2f\x08\x16\x58\x8a\x84\x00\x7e\x18\x45\x1e\x46\x24\x42\x34\xf4\x39\x60\x1e\x62\x5e\x4c\x23\x12\x7a\x9e\x08\x28\xe0\x30\x7a\xb2\x24\xe8\x46\x6f\xf7\xbd\x78\x17\x0a\x98\xa0\x57\x4f\x2e\x9f\x9f\x3e\xd8\x0f\x0a\xb0\xb8\x87\xb7\x7b\x59\x17\xe6\x75\xfb\xf1\x49\xfc\x5b\xec\xc7\x49\xd9\x56\xd7\x00\x76\xb1\x52\x6f\x58\xab\x91\x8a\xf2\x96\x9f\x99\x74\xa4\xe2\x76\x47\x9d\xe2\x52\xa9\x1a\xee\x02\xb9\x95\x70\x31\xb0\x5c\x95\x38\xba\x37\x74\x47\xfa\xbc\xd8\xee\x4c\x8c\x62\xec\xd5\x78\xb1\x11\xea\xcb\x9c\x2b\x60\x2a\xab\x8c\x77\xe5\x79\x2d\x95\xd6\x73\xe3\x4e\x25\xf3\x15\xf6\x23\x89\xa7\x78\x92\x5e\x63\xbf\xce\x8a\x8f\xdb\x8f\x1b\xdf\x7f\xa5\x36\x50\x12\xfb\x71\xc7\xd5\xfa\xe9\xe7\xc3\x3a\xf0\x57\xf6\x16\xde\xb3\x1f\x09\x68\x4f\x9f\x5e\xb8\x7c\x65\x7f\xf8\xdb\x78\xf7\x99\xf7\x3f\xda\x8f\x86\x5a\xd2\x76\x5a\xb6\xde\xe3\x74\xbd\xe8\xf6\xd0\x9a\xb9\xb1\x5d\x9c\xa7\xea\x99\x42\xdb\xa9\xe5\x0a\xe1\x50\xd3\xfd\x96\x8d\xe4\x65\x56\x41\x93\xa1\xb9\xe1\x19\xc3\xf0\x6a\x19\x1d\xf5\x97\xbb\xec\xa8\xca\x3b\x43\xab\x14\x77\x2a\x5e\x71\x37\xd3\x56\xab\xcd\x66\x6a\x38\xf2\xdd\xcb\x88\x52\x9f\xa0\x80\x73\x40\x50\x0c\x88\x1f\x73\xc8\x18\x95\x3c\x40\x23\x1e\x1c\xee\xae\x04\xd8\x8b\x01\x16\x1e\x0f\x3d\x4e\x7d\x08\x7c\x41\xb1\xe0\x80\x07\x52\x1c\x43\x8e\xe2\xbd\xfd\xb8\xbd\x8c\x37\x7c\x2f\xca\x9e\x42\xc1\xf9\xd5\x8b\xde\xf6\x4f\xc5\xd1\xa1\xc1\x88\xc0\x3b\x54\xf1\xbe\x54\x5d\x2f\xd4\xfd\xe7\x97\xb6\x67\xf2\x72\x7a\x58\x99\x53\x07\xd5\xc8\x0a\x64\x6d\x53\x49\x37\xf2\xb3\xf1\x18\xa7\x71\x18\x07\x1d\x2b\xbd\x35\x84\x5d\xcd\xcc\x66\xbd\x45\x3a\xe8\xb4\x04\x76\x0a\x5d\x3b\xa0\x64\x40\xd7\xc1\x0e\xca\x7d\xbf\xe0\x31\x55\xf6\x26\x61\x2d\x37\x71\x1a\xcd\x3e\xed\xcf\xed\x69\xa6\x59\x18\x11\xf9\x23\xb7\x88\x9f\xc9\xed\x55\x73\x70\xf2\xf7\x9f\x50\xc7\x25\x52\xf0\x8a\x46\x39\x3e\x4d\xd3\xaf\xbd\xfa\xe6\xf7\xcc\xc1\xfd\xde\x9f\xc8\x1c\x9d\x1c\x26\x26\x54\x69\xb8\xbd\x18\xaf\xdb\xf4\x76\x95\xf6\x17\xaa\x54\x59\xfe\xeb\x5c\x82\x57\xcd\xcb\x3c\x19\x2f\x9e\xc6\x42\x3d\x2e\x0d\x94\x44\xb7\xb8\xdf\x51\x16\x12\xdc\xe2\xde\x69\x4f\x9c\x66\x0f\xcb\x4a\xd1\xb1\x60\x77\xca\xf2\xa5\xb4\x84\x9b\xd8\xb0\xd3\xa2\x6b\x69\xa0\xc2\x18\xe1\x31\x36\x1a\x71\x09\xaa\xa4\x8f\xcb\x91\x19\x05\x7a\x51\xaa\x98\xb9\x2d\x5a\xb6\xdb\xb9\x69\xd3\xe9\x4c\xeb\xd9\x01\x2d\xb7\x0a\x1a\x6b\xc3\x2d\x4d\xc9\xf7\xbf\xc5\x3d\x02\x9c\xe3\x10\x70\xcf\xf7\x10\x0e\x21\x8c\x98\x07\x98\x0f\x10\x64\x02\x21\x89\xf8\x11\x8c\xa5\x18\x01\xe4\x21\x09\x31\x81\x38\x40\x88\x62\x89\x31\x14\x44\x28\xe0\xf1\x21\xc4\xf2\xa9\x4a\xb5\xaa\x5b\xcd\x5c\x3d\x93\xb7\xb2\x34\x6f\x13\xb5\x24\xdb\xbc\xc9\x79\xb9\xe9\xb6\xb8\x5b\xd7\x88\xa9\xe7\xb3\x19\x47\x57\x73\x6a\xbd\xa1\x16\x48\x9e\x58\x15\xc6\xf3\xf9\xd6\xde\x2e\x08\xc2\x04\xa6\x12\xe6\xe8\x5d\x43\x83\x24\x40\xaf\x26\x11\x3f\x3f\x85\x42\x48\x5c\x50\x46\x21\x7a\x4e\xe7\x32\x38\x1f\x4e\x4b\xf6\x56\xaa\x5b\xed\x61\x7b\x94\x4a\xa7\x97\xab\x9e\x25\xea\xe6\xc6\x84\x59\xbd\x42\x7a\xea\xcc\xad\xa5\xf2\x24\xa5\x1f\xb6\x54\x1f\x36\xba\x0e\x42\xfc\xc6\x46\xd7\xc3\x4a\x38\xd1\xf1\x8a\x3b\xeb\x91\x48\x3c\x14\xe2\xe9\x99\x7c\xad\xcc\xaa\x93\xf9\x2c\x18\x4d\x95\x4a\xa3\xb7\xdd\xad\x57\xf5\x1d\x5a\x51\xc7\xa4\x2c\xc7\x80\xd1\x69\xcf\xbd\x46\x25\x5b\x8b\x53\x7c\x3c\x24\x0c\xe5\xed\x71\x90\xd2\x4d\xc4\xbd\x42\xbd\x5c\x11\x38\xcc\x75\x60\x77\x35\x49\xd5\x8d\x65\x55\x33\xa7\xe9\x9a\xb2\xfe\xd0\x31\xde\x89\x68\x1f\x03\x9b\xdf\x3c\x56\x3b\x61\x44\x6f\xb5\xf4\xc6\xd0\x2a\x40\x27\xa5\x7a\x6a\xcc\xd3\x29\x96\x2a\xa6\x37\xce\x48\x1b\x39\x4e\x98\xe9\x16\xf3\x8b\x4e\x81\x3c\xf5\xf3\xe4\x4e\x1a\x75\xfe\xfa\x8c\x3a\x7c\xde\xb1\x36\xf7\x7b\x7f\xa2\xcd\xab\x93\x63\xaf\xd9\xc9\xa3\x4f\x6a\x98\x51\x11\xcb\x27\xc5\xcb\x93\x69\xb8\xbf\x50\xc3\x5e\x6a\x78\xb5\x9c\xa2\xd3\x9e\x23\x56\x75\x9b\x98\x63\x33\xbd\x4a\xf3\x19\xd9\xa5\xb3\xb5\xa0\x16\x56\xab\xa0\x6c\xac\xa7\x48\x5b\x75\x97\x56\x87\x1f\xf4\xea\x51\xd6\xf2\x6b\x39\xc1\xe6\xdd\x09\xbd\x9f\x98\xd7\xaf\x58\xa9\xd9\x6d\x7d\x78\x20\x30\x9f\xfc\x2e\xa3\x3b\xf2\xf0\x33\xef\x7f\x2a\x42\xf4\x45\x8a\xe7\xce\x49\xc7\x84\xfa\x0c\x72\x18\x46\x9c\x70\xcf\xc7\x08\xfb\x38\x08\x3d\x8a\x90\x04\x24\x8c\xc3\x18\x4b\x51\x18\x72\xc0\x60\xcc\x22\xc4\x00\x67\x88\x31\x1c\xc5\x01\x85\x7e\x10\xf8\x60\x6f\xa5\x6e\x2f\xcf\x0a\xc5\x7b\xb6\x89\x40\xcc\xaf\x86\x6c\x3e\x3f\x7d\xb2\x76\x5c\xa0\x3b\x84\x6c\x5e\xae\xd8\x5f\xe8\xb4\x04\x3a\xf2\xda\x5d\x46\x59\xbf\x86\x02\x3a\x9b\xb9\xa5\xdc\x7c\x50\xaa\xcf\x07\xb6\xae\x8b\x9e\xd8\x80\x76\x3b\x5a\xc3\x48\xd7\xcb\x8e\x5d\xf2\x7a\x45\x6b\x2b\x72\xee\x88\xa2\x6a\x6d\x5d\x1d\x05\xeb\xf5\x6a\x05\xa3\x9e\x16\xcb\xa9\x76\x7a\x68\x37\x8b\x93\xe6\x4c\x29\x0b\xc2\x55\xc2\xf2\xe3\xbb\x79\x41\xf9\x64\xe1\x13\xcf\x5e\x48\xea\xf8\xf5\xea\xab\x6f\x7e\xc7\x2e\xdc\xf1\xfd\x89\xbc\xb0\x13\x2f\xe8\x06\xbb\xb4\xb7\x0b\x99\x5b\xed\xd2\x5f\x68\x17\x65\xf9\xaf\xd3\xe9\xaf\x7a\x41\xc3\xe4\xbc\xd8\x8f\x45\xf6\xb8\x60\x54\x12\x1d\x70\xdd\x51\x16\x3e\xf3\xfe\x47\xfb\x52\x6d\x80\xc5\xa8\xec\x31\x94\xa9\xce\x4c\xbb\xee\x9b\xce\x66\x93\x36\xd2\xc5\xd0\x30\xf4\x79\xa9\xd9\xd9\xec\x06\xda\xae\x31\xde\x65\xc4\x4a\x19\x9a\xa9\xb0\xef\xcc\xb5\x16\x2e\x16\x0b\x5c\x6a\x8e\x37\xfa\xda\x1a\x5b\xb4\x0f\x77\xf9\x3a\x5b\xdb\xab\x72\x79\xbd\x2c\x77\xa7\xf7\xf7\x82\x42\xc6\x83\xd8\x47\x1c\x7a\x42\x48\x11\x17\x94\xc4\x71\xc8\xa0\x0f\x44\xe4\x05\x61\xc4\x59\x48\x59\xc4\xa9\x20\x8c\xc5\x01\xe6\x9e\x88\xa2\xff\x9f\xbc\xf7\xe8\x4e\x5c\xd9\xfe\x86\xbf\xca\x7f\x76\x07\xdc\xb5\xa8\x1c\x06\xef\x40\x28\x91\x85\x88\x12\x33\xa9\x24\x91\x73\xe6\xfd\xf2\xcf\x6a\x70\x1b\x8e\xdb\x36\x06\xe4\xee\xbe\xeb\xd4\xe0\xac\xe3\x2e\x60\x97\xaa\x4a\xfb\xb7\xf3\x56\x28\xc2\x01\x01\x71\x22\x42\x48\x7e\xe0\xcb\xcf\xf2\xa3\x06\x69\x54\x1c\x13\xb7\x6b\x0d\x8b\x77\xeb\x58\x6f\x9a\x2e\xae\xd1\x56\xb5\x99\xab\x98\x45\x43\x43\x76\xd9\x6b\xe6\xeb\xbc\x52\xd1\xea\x5a\xb5\x54\x2a\x1a\x5d\x5e\xaf\xd9\xd6\x0f\x5c\x60\x18\x01\xc1\x29\x47\xf4\x56\x72\x00\xa5\x48\xb2\x8f\xb5\xa0\x9f\xb3\x50\x00\x2c\x04\xc3\x80\xa2\x57\x77\x4d\x6d\x34\x71\x8a\x9b\x25\xb5\xb2\x13\x67\xdf\x2c\x1a\x61\x06\x84\x95\xb2\x5e\xb4\x8d\xfa\x18\x4f\xe2\x1a\xaa\xe4\x4c\xa3\x5d\x6a\xd4\x6a\xa7\x93\x3f\x6b\x41\xbe\xf6\x79\x29\xa5\xf3\x25\x5d\x20\xb6\x6a\xa9\x71\x22\xa9\x8d\x27\xda\x71\x31\xeb\x2b\x6d\xbf\x9e\xc7\x99\xd6\x20\x98\x6d\x4b\x3b\x63\xae\x6f\x11\x58\xb3\xd0\x3a\x21\x4d\xae\xde\x6e\xff\xca\xe9\x5a\xf3\x82\xc8\xf6\x4e\x3f\x6f\xd6\x4a\xca\x9d\x68\x4d\x7b\x1e\x6f\x97\xeb\xb1\xa6\xba\xd3\x6a\x21\x6b\x0f\x93\x72\xd9\x35\xe7\x32\x70\x0c\xdb\xae\x5b\xed\x0c\xd2\x49\xcb\x11\x51\x2b\xd3\xd2\x2a\xcd\x91\xde\xf0\xdc\xb2\x91\xd9\xd7\x82\xba\xbb\x3f\xee\x24\x6e\x28\x73\x36\x62\xf6\xd1\xd7\xd7\x6b\x9e\xfb\x5a\xd1\x8b\xfc\xf5\x55\xfe\x10\x71\xae\xdc\x20\x99\x86\x4f\x26\x6c\x3b\xf2\x32\x3e\xb7\x2a\xa3\xea\x96\xd7\x57\xbb\x55\x61\xe4\x57\x6d\x2f\xee\x92\xac\xbf\x33\xdd\xea\xeb\xb3\x5d\x95\x3d\x3a\xef\xed\xdb\x44\xa7\x97\xbf\x6f\x20\x4e\x7a\xf4\xdf\x12\xfa\x12\xfd\x2b\x2e\x37\xbf\xec\x8f\xbe\x0c\x17\xfb\xfa\xa1\x9d\xc5\xa3\x30\xf6\x0d\x67\x31\xb0\x76\x86\x8d\xc6\x9c\x36\x8a\x8b\x81\x58\x6a\xce\xa8\x94\x0d\x1b\x78\xbe\xf2\x4e\x1c\xd6\xb2\xda\xed\x17\x2e\x7f\xe7\xdd\x7c\x59\x4a\xf6\x75\xbc\xab\x49\x9c\xfe\x5e\xfc\x3d\xeb\xbb\x1e\xef\x22\xc6\xfc\xea\x18\x68\x71\x38\x08\x17\x99\x7a\x42\x87\xab\xd6\xc1\x45\xd9\xb5\x7d\xd4\x77\x83\x7a\x0f\x74\x23\x3a\x1d\xca\xa1\x56\xd7\x60\x63\x34\x3c\x9e\xa5\x87\x4b\x12\x57\xf1\xf2\x7b\x57\xe3\xe5\xef\xcf\x11\x63\xf1\x1c\xfd\x73\x30\xc3\xfd\xf4\x5f\x10\xe3\xbb\x5e\xfa\x94\x8b\xef\x45\x28\xc6\x20\x89\x28\x27\x12\x85\x09\x8a\x51\x08\x31\x8a\x61\xa8\x24\x0c\x28\x11\x01\x66\x12\x0a\x19\xc6\x61\xc2\x79\x1c\xa2\x10\x47\x02\x49\x88\x60\x20\x23\xa4\xe8\x49\x23\x81\x69\x22\xc6\x4d\x07\x3f\xa3\xf0\x54\x27\xfb\xf3\x59\xc8\x19\x90\x98\x31\x8c\x30\x7a\x1e\x31\x3e\x29\x68\xf1\x18\x62\xb4\xdb\x55\xf3\xea\xa6\x9e\xc7\x15\x62\x30\x07\x25\x31\xec\xb9\xb9\xdd\xcc\x01\x49\xa5\x5a\x35\x5b\xa5\x3c\x70\xa3\xb6\xd7\x1e\x9a\x9d\xb0\x4a\xdb\x65\x0a\x8d\x49\xbd\x15\x47\x7e\xa5\xe2\xad\x43\x8f\x16\x4b\xed\xc6\x71\x1c\xa0\x51\xc1\xde\x76\x7a\xe3\x15\x8c\xbc\x8d\x97\xef\xfa\xd9\x82\x33\x0e\x4a\x00\x2e\xbf\x18\x0e\xff\x35\xc4\xb8\xfa\xea\x23\x1c\x1b\x5e\xf6\xf6\xad\x9e\xf7\x35\xc4\x48\x8f\xfe\xdb\xb3\xbd\x17\x31\x66\x97\xfd\xb9\x9b\x23\xb7\x5b\xe0\xe5\x41\x52\xe7\xc8\xaf\xcf\xf0\x0c\xa2\xa5\xbc\xbe\xeb\x3d\x7d\x17\x31\xa6\x57\xc7\xf0\x00\xc7\x3e\xdb\x90\xce\x1c\xfb\xed\xf9\x7d\x09\x31\x9e\x44\xac\x73\xda\xf3\xfd\xf4\x5f\x10\xe3\xbb\x5e\xfa\x74\x11\x23\x10\x18\x25\x09\xe3\x40\x50\x15\xca\x38\x64\x09\x54\x24\xe4\x04\x24\x2c\x06\x18\x87\x81\x0c\x29\x10\x41\xc2\x11\x4d\xc2\x04\x01\x4c\x98\xe4\x48\x06\x8c\x04\x50\xca\x24\x79\x41\x0c\x94\x1a\x62\xdc\x0c\x29\x66\x94\x7c\xdc\x19\xf4\x34\x2b\xaf\x10\x83\xe3\x34\x74\x8c\x4f\x8a\x59\x3c\xab\x63\xbc\x8f\x18\xd0\x8d\xc5\xb4\xb7\xd3\xaa\x47\x92\x94\x17\xbe\xde\xdf\xd5\x87\x75\xba\x9f\xf6\x98\x2a\x2c\x5a\xb4\x93\x5b\x0f\x47\xdd\x9e\x45\x36\xbd\x76\x7f\x20\x8a\x6c\xd4\x9c\x6b\xfa\x76\xba\xf5\x56\x33\x5c\x68\x1f\x26\xac\x9e\x44\xac\x18\xb9\x1d\xe1\xaa\xf2\xc8\x6a\x7a\xb0\x62\x7f\xb1\x05\xc2\xef\x46\x8c\x87\x38\x76\x8a\xf4\x1f\xd2\x71\x52\x42\x8c\x6f\x94\xe1\xb5\x34\x10\xe3\x1b\x75\xa0\xef\xd0\x31\x1e\xe5\xd8\x5a\x4a\x88\x71\xad\xe3\x3c\x80\x18\xdf\xf5\xd2\xa7\xac\x63\x24\x01\x61\x3c\xa4\x38\xa1\x58\xb0\x88\xf3\x20\xc2\x54\x21\x0a\x50\x1c\x21\x15\xe1\x28\x12\x21\x61\x20\xa0\x61\x8c\x50\xc8\x42\x24\xa0\x08\x05\x0c\x55\x84\xe3\x08\x45\xc1\x0f\xc4\xf8\x59\xe0\x5b\x6f\x77\x68\x59\xaf\x77\xad\x1a\xaf\x99\x55\xaf\xa9\xd9\x4e\xbb\xe0\x7a\x9a\x61\x54\x5b\x9e\xd7\x2d\xea\xd5\x92\x45\xda\x6e\x0e\x15\x4a\xbc\x83\xca\xb5\x62\xc7\xe2\xf8\xd4\x3a\xed\x82\x18\xe4\xa6\x6f\x5e\x00\x22\x3e\xb6\x4a\xfd\x9c\x85\x1c\x72\x29\x98\xa4\x12\xbf\x46\x81\x95\xd6\x9b\xa5\x95\x2f\x7a\xd9\xb8\xbe\xa6\xbd\x0a\x5b\x14\x3c\xad\x12\x06\xde\x76\x5c\x98\x2c\xca\x87\x95\xc6\xdc\xa5\x5c\x97\xe3\xc9\x3e\xd1\xfe\x89\x18\x9f\xf8\xe6\xcf\xf3\x17\x9d\xe1\x8e\x9b\x96\xbf\xbc\x50\x97\xdf\xb3\x5e\xe9\xbb\xa5\xaa\x28\x27\x6b\x2d\x48\xe2\x99\x66\x4f\xb6\xf3\x95\x39\x1b\x2d\x26\x84\x0f\xb5\xcd\x62\x47\x7a\xb0\xd5\x19\x4e\xca\x60\xc8\xdc\xda\x04\x0e\xf7\xb3\x60\x7c\x34\x76\x46\x03\x77\x32\x55\x94\x77\xf2\xd1\xb0\x51\x1c\x9b\x6e\xd0\xdc\xdb\xb9\xc4\x2d\xe5\xfb\x4b\x36\xad\xae\xae\x51\x40\xfb\x10\x35\xae\x9b\x00\x7d\x8c\x1a\x57\x1f\xba\x13\x31\x4f\x3e\x72\xe7\xb2\xbf\x1f\x8c\x1b\xa8\x91\x1e\xfd\x67\xcb\xb1\x5e\xd2\xdb\xee\xe6\xca\xb7\x38\xdd\xcb\xf8\x9c\xd3\xa5\x4d\xff\xde\x72\xac\x7f\xa9\x9e\x75\xcb\x57\xf2\xc8\x5e\x9d\xd7\x5a\xfc\xa5\x7c\xd6\x57\xf6\x2a\x8d\xb3\xba\xd6\xa3\xee\xa1\xff\x82\x4a\x33\xbc\x5b\x67\x40\x6e\x2e\x59\x4f\x0b\x82\xcc\x64\xd7\x18\x34\x16\xe1\x70\x53\xd1\xd9\xd2\x18\x18\xed\x7a\xe0\xf8\xdb\x46\x6d\xae\x65\xc2\x4e\xcd\xee\x2f\xbc\x4a\x4d\xab\x96\xa3\x90\x60\x5f\x91\x08\x55\x0b\x93\x56\x3d\x37\xaf\x99\xbe\x25\xb5\x59\x6c\x6f\x17\x0a\xed\xd2\xf7\x95\x80\x50\x85\x8c\x07\x01\x66\x94\x10\x96\x44\x88\x90\x24\x56\x49\x82\x03\xa0\xb0\xe4\x89\x80\x09\x0e\x64\x08\x31\x41\xe2\xd4\xc3\x81\xc6\x9c\xb3\x88\x10\xae\x40\x08\xe3\x9f\xa8\x84\xd2\x42\xa5\xdb\x96\x2f\x01\x3e\x31\x7c\xbd\x4c\x9e\x31\x89\x03\x00\x2e\x76\xaf\xc7\x31\xe9\x13\xbb\xd7\x99\xa7\x5d\xb4\x92\x14\x31\xa9\x52\x6b\xf7\xfc\x24\xb3\x03\x32\x8a\xe7\x46\x63\x5f\x51\xc5\xe9\xb0\xdd\xcd\x6b\xc8\x1a\x8f\x72\x93\x7e\x6d\x32\x00\x55\xc6\xac\x4d\x5f\x3b\x36\xe3\x51\x47\xe9\x4e\x25\xd2\x0b\x40\xb5\x54\x66\x5f\xec\x1f\x76\x65\xaf\x51\x19\x94\x34\xb6\xab\xb1\x92\x24\xd5\xfa\xd8\x1a\xbb\xe6\xdf\x88\x49\x0f\x15\x7b\x4d\x91\xfe\xb3\xc5\x5e\x53\xc4\x84\x87\x8a\xbd\xa6\x4d\xff\xde\x62\xaf\x7f\xa9\x26\xf7\x2e\x26\xfd\x21\x4c\xd0\xbe\xe1\xac\xee\xa1\xff\x82\x49\x3b\xd9\xc9\xf5\xb3\xdc\x68\x42\xc8\x46\xd5\xb2\xb9\xdf\x4d\xe2\x6a\x7b\xa4\x0c\xbf\xd3\x71\xed\xc0\xcc\x04\x65\x17\x2f\x67\x1d\x66\x1a\xd5\x2a\xab\x77\x77\x05\xb2\x07\x85\x61\x7d\x5f\x3f\x72\x73\x92\x2f\x6b\xeb\xa8\x70\x28\xcc\x8c\xa5\x96\x9d\x2d\x71\x0f\xda\xad\x4e\x5b\x4b\xdd\xb6\x06\x21\x07\x34\x91\x44\x45\x8c\x46\x3c\x64\x1c\x07\x10\x91\x40\x50\x15\x63\x26\x94\x00\x89\x20\x54\x24\x49\x10\x47\x49\xc2\xa1\xc4\x80\x44\x22\x11\x44\x52\x4c\x43\x12\x83\xff\xfc\xf7\xff\xb0\x4c\xd1\x1b\x73\x5b\x53\x92\xe8\xe3\x64\x99\xf3\x1c\x64\x9c\x02\xcc\x91\x60\x04\x3c\x6f\x57\xbb\x95\xaa\xff\xf6\x26\x5c\x71\xac\x2f\x8d\xdc\xab\x7e\x6e\xea\x87\xa1\x11\xc0\x38\x33\x5c\x7b\x9b\x51\x73\x99\x1f\x6f\x1c\xbe\x07\x95\x3d\xef\x0c\xc9\xa4\x3e\xab\x90\x06\x6d\x69\xd6\xa4\xde\xce\xa0\x65\x7b\xb6\x1f\x56\x76\x0b\xab\xd8\x5f\xfb\x53\x53\x6b\xb5\xa1\xcc\xe8\xf4\xa0\xe6\x74\xe8\x94\xcb\xf3\xce\x7e\xa9\xc7\xf5\x52\xd1\xfd\x52\x13\xef\x2f\xa5\x4e\x5e\xa7\x5a\x3f\x60\xcf\x7a\x89\x1e\x7e\x5c\x33\x4a\x91\xfe\xb3\xa9\xf7\xdf\xe8\x35\x78\x19\x9f\x73\xb6\x3f\xe4\xb5\xb8\xa5\x79\x3c\xb2\x96\xa7\x35\x8f\x14\xf7\xe2\x1e\xfa\x2f\x5c\x7e\x35\xdb\xa1\xb5\xb7\x9d\xf1\x36\x9f\x9b\x6c\x4f\xc3\xe1\x46\x44\x46\x25\x86\xb3\x4c\x71\x14\x18\x8e\xb9\x69\x6b\xb9\xee\xa8\x9d\xac\x17\x30\xa8\xf8\xc7\x4a\xa9\xdf\xf0\xc3\x4e\x71\xaf\x59\x56\x94\x24\xbd\x8d\x9a\x96\x62\xff\x38\x38\xb0\xf6\x2a\xd8\x4d\x47\x8d\x41\xeb\x1b\x9a\x44\x07\x49\x1c\x0a\x20\x00\x45\x28\x0e\x03\x0e\x55\x80\x91\x40\x88\x86\xa1\x4a\x38\x86\x00\xc9\x38\x52\x49\x80\x28\x51\x02\x71\x45\x68\x18\x53\x01\xc2\x20\x96\x54\x71\x84\xe1\x0f\x2e\xff\x7c\xe1\x56\xc8\x6e\xf0\x76\x06\x30\x17\xf0\x23\xee\xfe\x3a\xfb\x82\x16\x0c\x62\x92\x42\x14\xf0\xdb\xd3\xfd\x85\x37\x3c\x20\xf1\x7e\x10\x05\x6c\x4c\x8f\xdb\x6a\xcf\xf4\x73\x70\x83\x73\x76\x33\x6f\x19\xe3\x42\x67\x3a\x02\xb6\xb3\xe0\xb9\xca\x3c\x51\x87\x78\x57\xac\xaf\x8a\x25\x39\x6e\x92\x7c\xb3\x62\xee\x2a\x2e\x1a\x36\x8a\x87\x65\x67\x92\xe3\xfb\x28\xb7\xcf\x97\x82\x6a\xc5\x73\x03\xad\xb0\x67\x7a\xa3\x5f\xf6\xe6\x6e\x3e\xad\x28\xe0\xe2\x63\xa9\xe9\x55\x52\x0e\xdc\x43\x2d\x43\xbd\xcb\xd7\x6b\xef\x52\xbe\xc5\xdf\xd3\xa3\xff\x01\xc7\xf8\xb2\x96\xf1\x78\xe4\xe9\xdc\x28\x64\xf9\x58\xbd\xf9\xe5\x5f\xc7\xe7\x3c\xed\x89\xc8\x57\x0a\x84\x6c\x3f\x41\x5f\xd3\xfe\x9c\x35\xe9\x5d\x7c\xe9\x3f\xbc\x17\xa7\xb3\x98\x5d\xbd\x8b\xe2\xce\xbd\x78\xf2\x2c\x4e\xf4\xaf\xe0\xe9\x2e\xfa\x2f\xf8\x42\x05\x3f\xfa\x39\x5b\x8b\xc2\xf5\xae\x3e\xda\xef\x5d\xda\xb0\xe6\xb4\x9a\x1b\x2e\x36\xbb\x66\xc9\xc3\x95\xe9\x4a\x6f\x85\x7a\x63\xdb\x6d\x65\x72\xe0\x98\xab\x18\x66\x75\x06\x06\x6a\x01\xe7\xbd\x58\x78\xae\xaa\x1f\x26\xc3\xa6\x05\xec\x9e\x5e\x89\x7b\xa3\x59\x03\xb2\x56\xfa\x59\x26\x08\x53\x12\x25\x02\x20\x08\x21\x81\x22\x90\x52\xc6\x18\x2a\x24\x19\x89\x20\x0b\x45\x9c\xc4\x22\x26\x12\x85\x3c\xe2\x24\x8a\x29\x91\x58\x0a\x44\xa1\x04\x31\x04\x04\x26\x2f\xf8\xf2\x64\xa9\x16\xc8\x6f\xe3\x8b\x94\x1f\x7a\x59\x5e\x67\x7f\xe2\x0b\x25\x17\xfd\xe1\x71\x7c\x79\x9b\x11\xf1\xcb\x1b\xf9\x80\x2c\xfb\x11\xbe\x18\xac\xb3\xd5\xfc\x32\xdc\x0d\xc6\xab\x88\x1f\x7d\xa3\xb8\x06\x03\xcb\xc9\x8e\xe7\x73\x97\xd9\xc5\xe2\x34\xab\x89\x56\x71\x2c\x87\xcd\x61\xa5\xea\x0c\x37\x6e\x2d\xb7\xd6\x78\xd2\xd8\xd7\x69\xa9\x09\x72\xdd\x72\xb8\x76\x0f\x62\x61\x8d\x0f\x2b\x50\x60\x49\x33\xce\xaa\x9d\xf3\x17\xe0\x8b\x13\xd5\x6a\xed\x67\xf9\x7b\x8a\xf4\x1f\xca\x72\x49\x05\x5f\x7e\xe1\xef\x0f\xe9\x0f\x7f\x30\xb3\x42\xd3\xfe\x9c\xce\x90\x72\x96\xc9\x53\xfc\x5d\x4b\x09\x5f\xae\x64\x8d\x47\xf0\x65\x97\x19\x2f\x77\xb6\x2e\x55\x61\x1e\xe6\x63\x81\xb4\x43\x18\x15\xfa\xcd\x2d\x0d\x82\x96\xd3\x1f\x34\xba\xd9\x5d\xcd\xd2\xbb\x89\x0f\xc8\xd1\x68\xce\xf8\xc8\xd8\x85\xae\x83\xc1\xaa\x15\x37\x46\x52\xeb\x34\x10\x6f\x55\xb6\xa5\x7e\x57\x2d\xab\xba\x33\x05\x78\x8b\x2b\xe9\x37\xc1\xa3\x08\x0b\x11\x48\x11\x93\x18\x33\x05\x39\x27\x32\x90\x04\x73\x82\x38\x50\x8a\xd1\x30\x0a\x39\xe2\x50\x85\x14\x22\xce\x13\x20\x69\x10\x04\x22\x81\x2a\x90\x11\x46\x48\xfd\xc0\x97\x9f\x85\xaf\xf5\x62\xa9\xe8\xd5\x4a\x39\xab\x90\x77\x1c\x4c\x28\xed\x78\x1d\x9b\xea\x46\xae\xeb\xb9\x55\xdf\xaa\xd7\xed\x82\xee\x57\x6a\x2d\x17\x53\xbd\xe6\x92\x4e\xbb\x81\x4b\xdd\xf2\xc9\x73\x42\x20\xc7\x58\x22\xc0\xf9\xad\x2c\x13\x06\xa9\x80\x1f\x6b\x32\x3f\x67\x21\x15\x12\x62\x2e\x09\x20\xaf\x11\x60\xc5\xd2\x08\xc7\xb3\x62\x2b\xaf\x78\xe2\xc8\x75\xbc\xdf\x0c\xec\x7c\x95\x54\x77\x9d\x4a\xb3\x60\xf5\x87\xcc\xc5\xa0\x49\xd4\xba\xd3\x39\x05\x08\x9d\x2d\x55\xa6\xf6\x79\x96\xc9\x5b\x7f\xfe\x83\x05\x92\x2e\x37\xf7\x95\xbe\x5b\xa1\x0d\x7d\xd6\x81\xc0\x2c\xce\x4a\xb9\xdc\x6e\x57\xd9\x80\xf6\x2e\x93\x64\x42\x17\xd8\x43\x57\x5a\x0e\xdb\xe1\xb1\x74\xb3\x56\x41\xad\x27\x82\x23\x22\xd6\x72\xe8\x35\xc3\x31\xa8\x47\xa4\xda\xb3\xd5\x6c\x02\x0e\x33\x7b\xdf\x53\xc5\x81\x59\xdf\x75\xed\x5c\xc5\x73\x55\x6a\xbe\x93\xe2\xd5\x57\x47\x8b\x66\xc4\x7a\x63\x37\x3a\xae\x05\x47\x90\xdb\xac\xe0\x2b\xdc\xc3\x39\x7f\x5f\xe9\x75\xec\xda\xdc\x48\xea\xb5\xfe\x01\x76\xc3\x93\x65\xef\x2a\xd3\xc3\x7c\xfd\xbd\x7b\x7d\x17\x29\xd2\x37\x1f\xa1\x7f\x95\x73\x3f\xba\x7c\x5f\x6f\xcc\xab\x78\xa1\xb7\x73\xd8\xc1\xc7\x6d\xe8\xad\xc2\x59\xbf\x7f\x8c\x0d\x65\x0d\xcd\x43\xce\xf7\x33\xa3\xaa\x34\x33\xf9\x72\x7b\xbc\x3e\x7d\xfe\xca\x9f\x7d\x6f\x51\xb9\xab\xe1\xd0\x65\xe9\xfd\x35\x5f\xf9\x62\xee\xbc\xff\x5a\xbb\xdd\xfc\x09\xc7\x77\xd6\x92\x48\xfb\x7e\x3c\x74\x3e\xa9\xd3\xff\x65\xbc\xfb\xcf\xef\x21\xe1\x95\x54\x79\xef\xfd\xb8\x44\x96\x9d\x5b\xa1\x55\xb4\x07\x7c\x6b\xe3\xe7\xe8\x9f\xed\xc3\xf7\xd3\x7f\x41\xc2\xe3\xb8\x50\xea\x87\x9e\xeb\x4e\x7a\x33\x33\x6f\x68\x07\x5e\xf7\x0c\x9a\xa5\x6b\xc3\x0d\xaa\x06\x68\xf1\xa5\x11\x7b\xd0\x10\xad\xfe\x01\x85\xc7\x6d\x38\x3c\x60\x54\x8d\xaa\x1b\xaf\x6e\xe1\x1e\xd2\xba\x87\x41\xd8\x2c\xf5\x42\x3b\xb7\x9b\x14\xea\xf9\xdc\xc8\x37\xf7\x51\xfa\x9a\x16\x21\x2a\x64\x4a\xc4\x11\x89\xc2\x58\x51\x82\x82\x04\x06\x41\x84\x30\x00\x30\x8a\x64\xc4\xb8\x50\x09\x94\x4a\x28\xc2\x60\xc0\x28\x8e\x39\x43\x01\x47\x14\xc7\x51\x1c\x09\xf4\x03\x09\x59\x9a\x48\x78\x2b\x16\x9a\x61\xca\xe9\x87\xe5\x95\x5f\x67\x21\x25\x0c\x0a\x81\x18\xa7\xe8\x79\x24\xfc\x24\x16\xfa\x69\x24\xe4\x93\xd5\xec\xfa\xe6\x5e\x90\xd0\xc9\xc4\xcd\x42\xcd\x6b\x75\x47\x19\x5b\x5b\x70\x87\xe5\x45\x04\xb3\x9d\x26\x0d\x37\x33\x10\xcc\x87\xe5\xbe\xdd\x5b\xe7\xe2\xc6\x61\x8c\x79\xab\xcd\xcb\xfa\xbc\x9b\xe8\x53\x66\xf8\x6d\xc5\xc7\xae\xd3\xae\x76\xfa\x39\xc5\x4b\x86\xc6\xab\xb1\xc0\x5a\x9d\xc0\x91\xaf\x8d\xd2\x43\xc2\xab\x0f\x3d\xc2\x69\xe0\x65\x7f\x1f\xf2\xe2\xa7\x48\xff\x21\x24\xbe\xe2\x74\xc3\xcb\xf7\xff\x36\x24\x3c\xfd\xfd\x97\x22\xf5\xbb\xfa\xd3\xf0\x32\xff\x08\xd7\x3e\x7b\xd9\x0b\x97\xbb\x7a\x2f\x6a\xa4\x88\x5a\xf7\xd0\x7f\x41\x0d\x4e\x69\xa5\x27\xa3\xfa\xa4\x49\x7c\x7d\xb9\xe2\xb3\x64\x8f\x3d\xd9\xad\x8d\x37\x6c\x58\x5f\x4c\x2a\x1b\x33\xd0\x81\x45\xcb\x25\x2f\x59\xd7\xbd\xd5\xaa\x34\x1e\x8b\x52\x32\xab\xf6\xdb\xc7\x4d\x5b\xa3\x2d\x18\x98\xd6\x71\x35\xab\x18\x2b\xc8\x8f\x2a\x97\x1f\x76\xea\xbd\xf4\x1b\xf7\x91\x18\x11\x82\x92\x18\xc5\x22\x8a\x84\x62\x82\x51\x0e\x94\x4c\x28\xe6\x81\x0a\x51\x42\x01\xa4\x38\x90\x42\xe0\x44\x44\x50\xca\x90\x25\x84\x03\x18\x87\x48\xc8\x10\x07\x27\x2f\x3f\x4d\x13\x35\x6e\x45\x9e\x31\x42\x11\xfb\x18\x35\x7e\xce\x42\x0a\x30\xc2\x82\x4a\x42\xd9\xf3\xa8\x71\x33\xf6\xec\x5b\x50\xa3\xba\xe9\x2d\x32\x39\x0c\xe6\x51\x78\xdc\xb6\xdb\xf6\x51\xd6\x1d\x9c\x31\x2a\x71\x3d\xea\x2c\x54\xd6\x5b\x45\xa8\xea\x47\x3d\x56\xcd\x6d\x78\xbc\xda\x3a\x51\xb3\xe3\xe2\xe9\x76\x96\x33\x8b\x87\xd8\x3e\x0a\xd3\x94\xc7\xba\x3b\x68\x0c\x16\xb3\xe5\x2e\x3f\x9e\x64\x34\x3b\xd9\x15\x52\x43\x8d\xc2\x95\xfe\xf7\x00\xd7\x7e\x89\xfd\xba\x8a\xbf\xbd\x93\x6b\xa7\x48\xff\xb1\xd8\xb3\x0b\xa7\x1b\x5c\xbe\xff\xbb\xb9\xf2\x97\x32\xf5\xff\x52\x54\x7b\x17\x35\x06\x97\xf9\x47\xb8\xf6\xd9\x6b\x7f\xe6\xda\xf7\xc6\x76\x5f\xed\xd5\xc3\xf4\xaf\x51\xeb\x1e\xfa\x2f\xa8\x81\x98\xbe\x24\xf9\xa4\x31\x86\x5b\x47\xb6\x5b\x61\x0d\x9a\x3c\x21\x95\x3d\xb5\x60\x30\x3f\xca\x78\x8f\x7d\xd8\x47\xc6\x0c\xd8\x7c\xcd\x0e\x82\xc2\x6a\xd7\x88\xe3\x4c\xcf\x74\xa7\x45\x12\xd6\x76\x6e\x13\x57\x2d\xbd\x58\x2a\x2d\x06\x5b\x2d\xee\x84\x44\xeb\x66\xd3\x2f\xc0\x1f\x00\x1a\x05\x41\x8c\x30\x08\x61\xc2\x09\x26\x9c\xc4\x02\x07\x21\x8b\x88\x80\x3c\x4a\x60\x82\x13\xce\x19\x83\x01\x8f\x04\xa4\x09\x67\x08\xa8\x38\x46\x81\x14\x40\x12\x71\x42\x0d\x92\x22\x6a\xb0\x5b\xb1\x61\x8c\x32\xf9\x71\x16\xcd\xeb\x2c\x24\x0c\x20\x21\x24\x82\x0c\x3c\x8f\x1a\x77\x64\xd1\xdc\x81\x1a\xf8\xbd\x88\xe5\x2b\xd4\xc8\xf9\xad\x69\x1b\x17\xa0\x83\xa9\xa9\x1d\x82\x03\x98\xac\x86\x3d\x5c\x39\x76\x93\x60\xaa\xaf\xb7\xc1\xb8\x64\xdb\x19\x49\xe6\x31\xab\xef\x7b\x66\x76\xa4\x8f\xd0\xa8\xd9\x94\x79\xaf\xe7\x0d\xc3\x65\xb0\xc8\x66\xdd\x2c\xd8\x16\x81\x36\xd3\x35\xaf\x11\x37\xa1\x68\x0d\x7b\xe9\xe9\x1a\x85\x2b\xdb\xfc\x23\x5c\x7b\x7a\xd9\xdf\x0f\xc6\x0d\xd4\x48\x8f\xfe\xb3\x59\x34\x69\x73\xba\x5f\xc7\xe7\x9c\xee\x0f\x72\x5a\x4d\xfb\x7b\x51\xf3\x56\xac\xc1\x23\x7b\x75\x5e\x6b\xe1\xb3\xfd\xf8\x6d\x67\x75\x0f\xfd\x17\x54\xb2\xfa\x8d\xc8\x53\xc3\x16\x4f\x46\xae\x51\x5c\x96\x1b\xc1\xc1\x31\xd4\xb1\x3a\x96\x0b\x55\x42\x72\xd1\x9a\xf9\x21\xc7\x83\x31\x9f\xe7\x6d\xad\x99\x71\x4b\xcd\xa0\x5e\xad\x81\x28\xce\xc5\xd5\xcd\x7a\xb1\xcc\x4a\x23\xdb\x10\x53\x57\xef\x15\x72\x51\x91\xd6\xbc\x7d\xc3\x49\x5f\x97\x61\x11\x17\x09\xe4\x49\x90\x04\x08\x43\x1e\xb1\x20\x61\x5c\xc6\x30\xa6\x04\x81\x04\x53\x88\x00\x4f\x12\x06\x55\x94\x24\x08\x2a\x06\x40\x1c\x88\x44\x50\x48\x69\x88\xe3\xe0\x14\xcb\x96\x42\x45\x4b\x7a\x0b\x8b\x18\xe5\x1f\x37\x41\x7d\x9d\xfd\x89\x6e\x44\xb0\x14\x62\xd9\xde\xc6\x5d\xfd\xf2\xae\x3e\xc0\x0b\x3f\x6a\x42\x9e\x99\xf4\x4a\x85\x63\x77\x91\x8c\xdd\x42\xa9\xb0\xe8\x4c\x65\x79\xa9\x06\x9b\x83\xb9\xe7\x5e\x2d\xf1\xec\x56\x7f\x7b\x70\xf1\xaa\xe0\xe6\xa6\x76\xe4\x74\xfa\x23\x67\x4d\x79\xab\x95\xe5\xb4\xbc\x6e\x1d\xc8\x32\x56\xcd\xcc\x70\xe9\x23\x95\x2f\x75\x87\x18\xcf\x37\x9b\x58\x58\x69\xc5\x1a\x5c\xbf\x03\x77\xfa\xfa\x9b\x79\x77\x13\x5f\xd9\xaa\x9c\x77\x29\xdf\xc2\x9f\xf4\xe8\x3f\x14\x4b\x77\x85\x3f\x4f\xc4\x4f\x55\x22\x9d\x92\x67\xe3\xa7\xfe\x60\xfc\x96\xa6\xfd\x39\x9e\xfe\x2e\xbe\x84\x8f\xef\xc5\x8f\xb3\x60\x57\x25\x3d\xc9\x9d\x7b\xf1\xec\x59\xbc\xbd\x0b\xf7\xd0\x7f\xc1\x97\xed\x7c\xa6\x0f\x2a\x28\x98\xd2\x96\xae\x0f\x4a\xe3\x79\xb6\xc1\x70\x61\xb9\xea\x57\x62\x78\xc4\x70\x3f\x2e\x84\x62\x54\xe5\xba\xa9\x75\xf7\xd3\xe6\x78\xd6\x35\x96\x71\x0c\xad\x5a\x26\xd3\xe0\xed\xca\xa6\x84\xa7\x66\x76\xc6\x50\x75\x9a\x3b\x4c\x7c\x29\x59\xb8\x9c\x6e\xd3\xaf\x36\x13\x86\x32\x62\x8c\x12\x08\x61\x12\xc4\x14\x40\x2a\x09\x01\x20\x52\x12\x40\xc5\x41\x44\x38\x11\x32\x60\x1c\x32\x1c\xa1\x00\x93\x44\x86\x38\xc6\x28\x90\x08\x06\x14\x44\xa7\x58\x83\x9f\x15\x2d\xf5\x82\x65\xd5\xdd\x52\xbe\x92\x67\x45\x83\xeb\x25\xea\x14\x88\xd7\xd6\x7d\xbd\x52\xad\x57\x2d\x56\xf3\x35\x5e\x6c\xea\x75\x6c\xd5\xf2\xb5\x62\xd7\x6d\xfa\xbe\x95\xa3\xe6\xa9\x81\x25\xa4\x92\x11\x08\x39\x00\xf8\x16\xd2\x70\x4e\xf0\x87\x0d\xc8\x5e\x67\x21\xe6\x04\x0b\x49\x39\x65\x97\x58\x83\x5c\x63\xdf\x9b\x71\x23\xd3\xa8\x91\x71\xa4\x86\x63\x36\xd8\x15\x87\xfe\xba\x4c\x33\x5a\xd2\xac\xb4\xa2\x71\x1c\x31\xb5\x9b\x0e\xcf\x1d\x96\x4e\x48\x93\x3b\x95\xdd\x2e\xbf\x39\xe2\x4f\xb2\x62\x3e\xf0\xc5\x7d\x3e\x72\x95\x22\xd9\x9d\x7e\xc9\xd4\xac\xc3\xba\xb5\x1f\xee\xab\x24\x9c\x16\x2b\x4b\xb3\x38\x6a\xcc\x97\x53\xb3\x21\x07\xf6\xdc\xd9\x6b\xab\xaa\x63\xf9\xcb\x66\x2d\xbb\x5f\xdb\xed\x51\xb6\xd6\x45\xb3\x66\xbf\xd5\xc9\x64\xfb\xe5\x7a\x61\x94\xe9\xfb\xbe\xd9\xb3\x10\xb4\x13\x2a\xaa\xd9\x20\x2c\x96\xac\xf9\x62\xbc\x2a\xa4\x95\x15\x73\x5d\x65\x77\x64\x95\x6d\x7d\xb8\xaa\xd1\x42\x76\xd0\x86\x07\xc7\x5b\x94\xb5\x49\x75\x00\xb6\x53\x92\x93\x95\x7d\x1d\xb5\x29\x9e\x1f\xf5\xb8\x72\xfe\xe5\x1f\xe8\x9a\xb4\x2e\x7b\x5a\xba\xfc\xfe\x99\xbb\x3f\xe2\xcf\xd6\x51\x9b\xf8\x1d\xb8\x0b\xed\xd6\xc6\x47\x72\x7d\x5a\x61\xef\xca\xb2\x9d\x3f\x44\x48\xad\x3b\x05\x53\x2c\x66\x62\x94\xdb\x17\x90\x35\xad\x1e\x03\x3f\x59\x4b\x63\x6d\xe3\x4a\x58\x68\x19\x07\xbf\xe3\xee\x9d\xd3\x4a\x7e\xe9\xed\xe5\xbe\xb1\x94\xde\x79\x87\xb4\xb1\x5b\xc6\x67\xcf\xfd\x89\x1b\xea\x17\xc9\xfc\xb1\xa6\x75\xa7\xef\xaf\xc7\xb1\x6d\xad\x95\xbd\x1f\x97\x27\xd5\x6d\xe8\xfe\x58\x61\xe1\xca\xde\x97\x13\xd3\x68\x5a\x6e\x0f\x72\xb5\xd2\xa2\x56\xd4\x54\xa3\xda\xef\x1e\x15\x9a\xe4\x79\xe2\xf2\xfa\xfa\x68\x1f\x2c\x4d\x4c\xac\x51\xa5\x79\x66\x71\x6f\x7b\xab\x5d\xd9\x0f\x77\xff\xda\xe7\xbf\xd2\xa9\x75\xb7\xb5\xf2\x4b\xce\x2e\x3b\x1a\x66\x8a\x9e\x57\xa0\xf1\x6c\xa5\xfb\xa8\xdc\xc8\x24\xbd\x3c\x38\x5a\xf9\xae\x37\x8d\xa7\xaf\xef\xf0\x0f\x24\x95\xf2\xb4\x12\xfb\xb4\xde\xab\x1e\x12\xe7\xf5\x3d\x12\x8f\x54\xee\x7a\xfd\x7e\xe8\xe5\x56\xdd\x06\x1d\x86\x08\xfc\x58\xa1\xae\x5d\x65\x35\x25\x45\xdc\x3d\x40\xbf\xd7\x3c\x2c\x86\x07\x37\x6f\x0e\xfd\x8e\xc2\xd5\x79\x3f\x83\x81\x03\x42\xb5\x5f\xf5\xdd\x5a\xb1\xdf\x35\x4c\x7a\xfa\xf8\xfb\xef\xfb\x05\xbd\x93\xa7\x9e\x3f\x73\x36\x07\x9d\x9f\x7f\xf6\xe4\xf3\x57\xbe\xfb\xf9\x5f\xd7\xf7\x2c\x7f\x3b\xb5\x12\xfa\x1f\xe1\x6f\xe7\x36\xdb\x6a\xd9\xae\xf8\xa2\x19\xdb\xf4\xd0\x2c\xed\xf5\xae\xb9\x08\xe8\xde\xdc\xfa\xfd\x45\x73\xe5\x96\x8d\x66\xbf\x53\x02\xc7\xac\x08\xeb\xe3\x6e\xed\x88\xa2\x85\x49\xda\xd6\x76\x4b\x1a\xa0\x51\xac\xcd\x3a\x76\xae\x90\x8b\xd6\xf5\x69\x26\x31\x12\x34\x39\x34\xfa\x41\x30\x0f\xf5\xd4\x6b\x49\xb0\x10\x0b\x15\x45\x54\x41\x1e\x25\x08\x40\x1c\xd1\x80\xc6\x08\x42\x45\x42\x8c\x10\x14\x21\x0b\x63\x09\x01\xa2\x18\xb2\x10\x06\x41\x88\x44\xa8\x20\xc2\x90\x31\x48\x23\xfa\x22\xa5\xa0\xd4\xa4\x14\x72\x5b\x4a\x61\x1f\x77\x1f\x3a\xcd\x5e\x49\x29\x0c\xb2\x8b\x3e\xfc\xb8\x94\xf2\xb6\x88\xee\xd7\x72\x77\x6f\x8d\x87\x38\xea\xd5\x68\xfe\x7c\x43\x72\x9a\x13\x82\x85\xdd\x99\x8e\x60\x67\xd9\x68\x79\x0d\x36\x70\xad\x99\x0a\x0a\x8e\x9f\xcd\x19\x93\x9e\x0d\x8f\xcd\xc9\xb8\x76\xe8\x81\x70\xd6\x18\x44\x78\xd8\xcc\x95\xf0\x51\xb6\x44\xa6\x50\xb3\x35\xc7\x2c\x57\xcb\xbd\x91\x9b\x5f\xf7\x6c\xdf\xea\x59\x76\x65\x30\x83\x7b\x3f\xf3\xc5\xaa\xab\xbf\x5b\xba\x29\x5f\x7e\xff\xa1\xb7\xff\xfc\xa3\xff\x63\xd2\xcd\x39\x50\xe5\x09\x74\x3f\x8d\xff\x5d\xe9\xe6\x7f\xe8\xf9\x53\x94\x6e\x76\xff\xbc\x4f\xa9\x4b\x37\xd7\xe3\x5d\x3b\xc3\x93\xcf\x92\x01\xda\xbf\x50\x52\xf9\x5f\xd2\xc4\x4e\x92\xca\x77\x81\x47\xca\xb9\x81\x52\x46\x8a\x31\x0c\x23\x2a\x68\x40\x69\x10\x63\x06\x50\xc2\x18\x88\x15\x0d\x69\x00\x80\x10\x11\x22\x01\x24\x21\x26\x44\x71\x14\x2b\xa5\x50\xc0\x50\x24\x03\x21\xb1\xf8\x21\xa9\xc0\x34\xed\x29\x37\x73\x37\x24\xc1\xf4\xc3\x1a\x23\xaf\xb3\x10\x63\x48\xb0\x94\x00\x71\xf4\xbc\xa4\x52\x7a\xef\x46\x9f\xc7\xef\x96\x54\xae\xe8\x5d\x49\x2a\x60\xb7\x1c\xc4\xcb\x69\x63\x99\xa1\x35\xe4\xea\xf1\x6c\x0a\x37\x43\x3a\x59\x3a\xe5\x6a\xd3\x59\xd6\xfc\x5a\x6d\x40\x97\x03\x55\xde\xf4\xb2\xd3\x65\x6c\xb6\xfa\xab\x5e\x23\x3b\xc2\x63\x4d\x16\xed\x79\x3b\x8c\x32\xeb\x40\x55\xcc\xd2\xc4\x2b\x4d\xac\x7d\x5e\x37\x2b\xc3\x4e\xed\x8b\x1d\x45\xbe\x24\xa9\xe4\xaf\xe3\x84\xee\x7f\xfb\x7b\xf6\xe5\x2c\x8a\x97\xdf\xff\x7b\xde\xfe\x5f\x2c\xab\xee\xe9\x68\x2f\x7f\x3f\x80\xd4\x24\x77\x62\xc1\x67\x3b\xc4\xdb\x3a\x89\x7f\x85\x1d\xe2\xdd\x38\xa7\x8b\xa4\xf2\xef\x7c\xfe\x7f\x93\x1d\xe2\x3d\xe9\x26\x7e\xee\xf9\xcf\x97\xe6\xfc\xfc\xa3\xbf\xf1\xf9\xdf\x8d\x28\xfa\x37\xf1\xb7\x93\x74\xf3\x5d\x80\x93\xae\x74\xa3\xb0\x8a\x08\x0f\x30\x84\x31\x40\xa7\xb2\x9e\x1c\x29\x0a\x08\x62\x21\x0d\x29\x21\x24\xa6\x88\x41\x82\x61\xa2\x28\x67\x20\x16\x31\xe5\x84\x71\x25\xb8\x8a\x88\x3c\x75\x81\xc6\x20\x4d\xe9\xe6\x56\x3e\x0e\x07\x82\x7f\xec\x2d\x3a\xcd\x9e\x3a\x6d\x22\x21\x88\x04\x08\x49\xce\x9e\x97\x6e\x8a\xef\xdd\xe8\xf3\xf8\xdd\xd2\xcd\x15\x47\xbd\x92\x6e\x78\xb7\x52\x5a\x08\xb0\x51\x6e\x63\x9d\xa1\x74\x91\x61\x6d\x77\x69\xe3\xfc\x72\xcb\x8e\xf9\xb5\x53\xde\x8d\x12\x6d\xbf\x5f\x75\x23\xbf\x56\xd8\x8c\xf8\xbe\xbb\xea\x85\x87\xbe\xa3\xb7\xbd\x61\x3f\x76\x5c\x79\xe8\x69\x1d\xb8\x5d\x1f\xc2\xc8\xb3\x09\xd4\xf6\x0d\xab\xbe\xd6\xd2\x94\x6e\xae\xe3\xd9\x1e\x78\xfb\x93\xcb\x59\x14\x2e\xbf\xff\x77\xbe\xfd\xaf\x7f\xe7\xae\x7c\xcc\x8f\xa0\xfb\x99\x65\x9e\xd1\xfd\x6d\xfc\xda\xdf\x8b\xee\x57\xd2\xcd\xbf\xf2\xf9\xff\x4d\xe8\xfe\x9e\x74\x13\x3d\xf7\xfc\x46\xef\xf2\xfc\xbd\xbf\xfd\xf9\x5f\xff\xfe\x37\xf1\xb7\x73\xde\xd8\x37\x01\x4e\xca\x5e\x26\x99\x30\x12\xc4\x20\x11\x40\x86\x40\x48\xc9\x14\x4c\xb0\x24\x71\xcc\x25\x05\x00\x06\x04\xc4\x71\xcc\x64\x10\x85\x8c\xd3\x20\x64\x38\x4c\x22\x28\x31\x8a\x70\x10\x24\x21\xfa\xcf\x7f\xff\x0f\xc9\x34\xa5\x9b\x5b\x79\x63\x1c\x0a\xf6\x71\xdd\x8d\xd3\xec\x29\xea\x12\x11\x4a\x09\xa0\x94\x09\xf0\xbc\x74\xf3\xb6\xd1\xf2\x1d\xd2\xcd\xbb\x79\x67\xef\x8f\x2b\x69\x65\xc0\xe4\xc2\xc8\xab\x71\xbb\x21\x35\x61\x6b\xc1\xe2\x30\x62\xb3\xc2\x7e\x50\xd1\x51\xc9\xf3\xcc\x69\x6c\x0d\x86\xc9\x3e\x4f\xdb\x87\xb2\x5d\x70\xbb\x55\x6d\xef\x38\x4a\xaf\xcd\x0b\xc1\xb8\xc5\x6a\x70\xee\xd7\x3d\x5c\x22\xce\xb8\x94\xef\x92\x7e\x21\xda\x17\x8f\x06\x4b\xd3\x6b\x94\xbf\xfa\xea\x23\x6f\x33\xb9\xec\x6d\xfe\xf2\xfb\x7f\xe7\xdb\xfc\xfa\x77\x0e\x5c\xfe\x7e\x04\xad\xcf\x71\xa6\xe1\xe5\x42\xfc\x4f\xa0\xf5\x95\xb4\xf2\xaf\x7c\xfe\x7f\x13\x5a\xbf\x27\xad\xa8\xe7\x9e\xdf\x32\x2f\xcf\xaf\xfe\xf6\xe7\x7f\xfd\xfb\xdf\xc4\xdf\x4e\xd2\xca\x77\x01\x4e\xba\xd2\x4a\x12\x63\x0e\x78\x12\x46\x54\x09\x42\xb0\xa4\x8a\x4a\x91\x60\x18\x29\x0e\xa5\x62\x10\x41\x11\x11\x15\x07\x24\x16\x51\x14\x9d\x64\x16\x8c\x13\x22\x18\x03\x42\x42\x00\x7e\x48\x2b\x22\x35\x69\x85\x49\x79\x2b\x72\x97\x23\xc9\xd8\x87\x9e\xa6\xd7\x59\x88\x00\xa2\x12\x08\x81\x45\x0a\x31\x31\xb7\xea\xd9\x3f\xc6\x71\xef\xb5\xdd\x5c\xd1\xbf\x8a\xf4\xcd\xda\x85\x9e\x29\x57\x7e\xcd\xde\x85\xfa\xa0\x10\x95\xa3\xfe\xcc\xdc\x20\xaa\x1f\x72\xa0\xab\xa9\xc9\xd0\x9d\x4d\xdd\xc2\x7a\xc3\x1a\x26\xe8\x05\x8d\x5c\xbb\x99\x1d\xc7\x98\x52\x2d\x1b\xed\x60\xb5\x16\xcc\x3c\x5f\xd6\xb2\x1b\x30\xdb\x48\x83\xf7\x69\x3b\x84\x89\x2a\xa5\x26\xd5\x5c\x7d\xe8\x81\xb7\xbe\x5f\xbf\x9c\xc1\x07\xe3\xf3\x9c\x8e\x14\xe9\x3f\x5b\xff\x3e\x45\xae\xff\x50\x4e\xe3\xf7\xd0\x7f\x3c\x56\xe3\xc1\x1c\x90\x47\xd6\x7e\x26\x64\x7f\xd6\x5f\xe2\x5b\xf7\xee\x9c\x63\x78\x3f\xfd\x97\x1c\x90\xda\x7e\x50\xc8\xd5\x42\xdb\xd8\xaf\xec\xdd\x6c\x90\x6f\x60\x3f\xc8\x95\xd7\x1b\x77\xd5\x8b\x6c\x37\x5f\x9c\x81\x52\x11\xe8\xe5\x70\x33\xea\x57\x0b\xf6\xa8\xd7\x6e\x65\xa9\xb7\xce\xc4\x6e\x0d\xab\x6a\xb3\x89\x16\x16\xaa\x35\xb3\x7c\x5d\x2a\x6f\xdd\x0c\x89\xdb\x1d\xe9\xe1\xf4\xfb\x47\x62\x42\xe3\x84\x27\x82\x2a\x16\x07\x48\xf2\x18\x27\x52\x92\x24\x8e\x13\xc4\x65\xc8\xb0\x80\x88\x21\xc1\x04\x0c\x23\xc8\x71\x00\x13\x06\x29\x14\x34\x20\x98\x89\x98\x9c\xaa\x6c\x21\x91\x5a\x74\x25\x93\xf2\x56\x74\x25\x47\x52\x88\x0f\x5b\x75\xbd\xce\xbe\x20\x89\x44\x24\x0d\xbd\xf7\x93\x7a\x29\x9f\xe8\xbd\x9f\x67\x6b\xfd\xe3\xf7\x2e\xc8\x60\xf8\xfb\x05\x3e\xce\x03\xab\xa0\xa3\xa2\xda\x14\x5b\xe1\xd2\xc5\x15\xcb\x3b\x2e\xb6\x9b\x0c\xb5\xb9\xd7\x1a\x90\xea\x34\x3f\x4e\xc2\xf2\x66\x3d\xe5\xec\x30\x76\xd5\x70\xb3\x2b\xf7\xc2\x96\x8d\xc6\x0b\xe5\x26\x63\x4e\xa3\x59\xad\xd5\x3d\x6c\x96\xa5\xb5\x55\x83\xcb\x51\xe5\x2b\x95\x8d\x7f\x37\x32\xbc\xb5\x0d\x3c\x14\x25\xf9\x1b\x91\x44\xff\x1d\xeb\xfd\x1e\xe4\xb9\x32\xdb\xa4\xce\xf9\xb5\x6f\x40\xaa\x67\xd7\x6b\x7e\xb2\xde\x77\x91\xea\x0f\x21\x45\x5a\x7b\x77\xae\xd1\xf2\x30\x52\xa1\x4a\xb0\x16\xac\xd3\x6f\x68\xeb\x81\x57\x1e\xb4\x6d\x06\xaa\xc7\x5c\x5b\xb0\x25\xdf\x6e\xea\x1b\x08\x0b\x1b\xa3\xbb\xa7\x1e\x3a\xf0\x65\x37\x93\x59\xcd\x5b\xf9\x02\x5f\xe9\xc4\x86\xb9\xf5\x3c\x98\x9a\x79\x1a\x67\xbc\xc0\x80\xb6\x5a\x2e\x0e\xcb\x7a\x53\x06\xd4\x48\xbf\x32\x32\x0a\x20\xe1\x98\x46\x3c\x04\x14\x02\x89\xa9\x24\x84\x04\x2a\x8a\x04\x8f\x79\x12\x4b\xa4\xa4\x88\x25\x92\x34\x42\x61\xc0\x60\x08\x68\x8c\x68\x04\x13\x1e\xc7\x10\x24\x11\x7e\x41\x2a\x9c\x1a\x52\xdd\xca\x8b\xe7\x18\x80\x4f\x74\x1e\x0c\x00\xbf\x02\x2a\x46\xd3\x70\x3f\x7f\x52\x0e\xf2\x13\xa0\xfa\xac\xbc\xf8\x9b\xdf\xbb\x52\x61\x4a\x1b\x17\xc6\xfb\xca\x46\xf4\xa3\x44\x44\x4e\x2d\x6e\x95\x3d\x64\xd8\xfc\xc7\x5d\xe9\x74\x0a\x2d\x2b\xef\x15\x2b\x1d\xdb\x96\xa5\x49\x7b\xe9\xce\xba\xc6\x1a\x35\x58\x90\x85\x1b\xdf\x6c\x17\xa7\xdb\xad\x9f\x35\x67\xc5\x0a\xad\xcf\xdb\xc3\x3e\xea\xea\x2b\x0c\xda\xbe\xf6\x17\x02\xd5\xb3\x8c\x3f\x77\xfd\xdd\xf7\xf6\x34\xe5\xf5\x1a\xbf\x63\xbd\xdf\x03\x54\x57\x59\x2c\xa9\x33\x7e\xed\x1b\x80\xea\xd9\xf5\xde\xdd\x82\xec\x0f\x01\x45\x5a\x7b\x77\x2e\x41\xf9\x30\x50\xe9\xcb\x51\xd5\x5b\x35\xcb\xdb\x82\xe7\x65\xf3\xcd\x21\x1e\xeb\x50\xf6\xf6\x9b\x1d\x52\x71\x7b\x3c\xb0\x72\x75\x78\x68\x5a\xfd\xfe\xb6\x31\x1f\x07\xa0\x64\xbb\x3c\x1a\x6d\x26\x5b\x19\x4e\x72\x56\xa3\xcb\x39\xaa\xed\x4b\x7a\xd3\x69\x05\x6d\x9f\x44\x13\x77\x59\x95\x56\x27\xfd\xe6\xc7\x24\x91\x54\x0a\x04\x58\x10\x42\xae\x12\xc4\x43\xaa\x70\x1c\xca\x58\x02\x16\x31\x1c\x87\x71\x8c\x18\x3a\x27\xde\xa3\x38\x08\xa3\x08\x85\x2a\xe6\x61\x02\x91\x52\x2a\xf9\xa9\x52\x91\xd4\x80\xea\x56\x33\x32\x8e\x01\xa2\x1f\x07\x4a\xfd\x9c\x3d\x23\x15\x04\x80\xa5\x11\x06\xfe\x49\x09\xff\xef\x71\x25\x6a\x11\xab\x1c\xf3\xc6\xb0\x15\xd5\xd7\xf9\xd9\xf1\x68\x4c\x0d\x3c\x2c\x6a\x99\x4d\xdd\xd0\x83\x25\xae\xb9\xeb\x4d\x3e\x4b\xf0\x7c\x5a\x77\x8e\x23\x98\x1f\xcd\xb6\xc5\x9a\x0b\xfd\xc3\x51\xcd\x9d\x30\x5b\x8d\x37\xad\x6c\xb9\x54\x3d\xae\xe2\x32\xa8\x15\xab\xc1\xaa\xed\xc1\xb1\x96\xa6\x2b\xf1\xea\x43\x7f\x18\x01\x8c\xeb\xef\xbe\x33\xd2\x46\x2c\xf3\x77\xac\xf7\x7b\x10\xeb\xed\x79\xa7\x89\x00\xda\x37\x20\x56\x4a\xeb\x7d\x57\x62\xfc\x0e\xc4\x7a\x14\x31\xd2\xda\xbb\x73\xa9\xfd\x87\x11\xeb\xbb\x98\x4e\xba\x88\x25\x28\x0a\x03\x44\x63\x10\x93\x20\x80\x44\x06\x08\x45\x0a\x4a\x1c\xaa\x90\x11\x1a\xc4\x32\x0e\x03\x84\x63\x9e\x70\x82\x11\x07\x3c\xc1\xa1\x84\x80\x70\x12\xcb\x90\x05\x34\x7c\x41\x2c\x9a\x1a\x62\xdd\x6a\x6f\xc6\xf1\x0f\xea\x9f\x20\xd6\x79\xf6\x27\x62\x11\x9e\x46\x21\x98\x77\x53\xf1\xce\xe3\x4b\xa1\xbd\xef\x23\xd8\x05\x05\xde\x8e\x6b\x5d\x6b\x6a\x1d\x15\x1b\x2d\x76\xf1\xa1\x50\x26\xcd\x63\xc1\x08\x97\x19\x61\xb7\x1c\xdb\x5e\xc1\x0e\x1d\x2a\x8f\x0e\x1a\xd5\x1d\x31\xe2\xd9\xf4\xe8\x6a\xf5\x71\x3c\xf4\x8b\xb2\xea\x4c\xb3\xde\x68\xa9\x66\xba\xcc\x6f\x23\xd1\x57\x74\x5c\xdd\x67\x60\x5f\x4a\x68\xef\x8b\xad\xe2\x5f\x88\x5c\x29\x21\xc1\xbb\xfb\xa9\x7d\x03\x72\x59\xbf\x63\xbd\xdf\x83\x5c\x6f\xef\x6c\x9a\x48\xa0\x7d\x03\x72\xa5\xb6\xde\xaf\xa6\x16\xff\x21\xe4\x48\x6b\xef\x0a\x95\xc7\xe8\xbf\x20\x57\x71\xaf\xb0\x33\x2f\xad\xf2\xab\x81\x9e\x31\xc5\x41\x43\x2c\xbb\xcd\x8d\x8d\x7e\x7f\x59\x6d\x6f\x7c\x6c\x65\xfc\xd1\x50\x39\x1a\x5e\x14\x05\xd0\xcc\xae\x37\x43\x7a\xd2\x6c\xce\xb3\x90\x96\x70\x49\xdb\xd6\x39\x4e\x0a\x9e\xd3\x6d\xaa\x64\xed\x27\x49\x54\x5f\x35\xda\xe9\x97\xc8\x14\x4a\x29\xa0\x90\x50\x38\x96\x32\x60\x58\x29\x2a\xc3\x20\xe2\x51\xac\x70\x42\x15\x65\x71\x88\x25\x41\x8a\x12\x11\xab\x88\x80\x50\x61\xa9\x28\x90\x11\x0b\x81\x80\x11\x79\x41\x2e\x96\x1a\x72\x89\xdb\xc8\xc5\x3e\x2e\xf7\x7f\x9a\xbd\x46\x2e\x21\xd2\x28\x0e\x62\xbf\x39\xe2\x67\x93\x52\x4e\xf3\xbf\x86\xe2\xbc\x19\x57\xba\xd7\xa8\x60\x30\x7d\x94\xcb\xd7\x64\x3c\xdb\x96\x5d\x6f\x54\x71\x8b\xdc\x1d\x99\xac\xda\x19\x4f\xa2\x92\x3d\x29\xef\x83\x41\x01\xfa\x41\xbb\xd4\x0d\x4a\xc5\xfd\x91\xd6\x04\xdd\x67\xd8\xee\x38\xf7\xf7\xfb\x70\xc5\x72\x11\x1a\x93\xc5\xbe\x3d\x6c\x70\x17\x33\x63\x57\x1f\x2c\x72\xda\x5f\xa9\x7b\xa5\x87\x08\xbd\xf7\xa5\x82\x94\xd7\x6b\xff\x8e\xf5\x7e\x0f\x82\xf9\x6f\xce\x3b\x4d\x44\xd0\xbe\x01\xc1\x52\x59\xef\x33\xc5\x32\xfe\x10\xa2\xa4\xb5\x97\xf6\xec\x31\xfa\x2f\x88\xf6\x5d\x4c\x28\x65\x44\xc3\x08\x40\x00\x89\x10\x00\x70\x9c\x88\x38\x49\x58\x82\x60\x10\x73\x16\x53\xa8\x90\x22\x49\x90\x50\x8c\x63\x4a\x41\xac\x22\xac\x10\x02\x34\x24\x22\x00\x12\x49\x06\x82\x17\x44\xe3\xa9\x21\xda\xad\x56\x04\x1c\x03\x49\x3e\x73\x73\x9d\x3b\x4d\x9f\x01\x0d\xfe\x58\xe3\xf3\x80\x96\x7f\x73\xc2\x7f\x5d\x96\xe5\xda\x5f\x8f\x57\x8b\x4a\x3d\x76\x67\xb0\x35\x6b\x21\xdb\x1f\x86\xb8\x4f\xd1\xce\x2c\x6d\xa7\xb3\x8d\xde\x70\x58\xd9\x75\xe0\x7e\x92\xd5\x96\xfd\xb5\xeb\x64\x57\x1e\x5d\x60\xda\x58\x8b\xdc\x30\xf0\x3b\xe6\xc0\x9a\xce\x33\x0d\x77\x88\xac\xae\x2e\xa4\xb3\xda\xe9\xe3\x48\xdb\xfd\x95\x80\x97\x0a\x80\x7c\x12\xd7\xfb\x76\xa4\x0d\x80\xf9\x3f\xb1\xfe\x6f\x8c\x2b\xbf\xba\x0f\xdf\x09\x30\xda\x37\x00\xe4\x5f\x1f\x17\xff\x0d\xa0\xfa\x28\xa8\x7d\xc7\xfe\xdf\x43\xff\x05\x54\xbf\x8b\xd1\xa5\x0b\xaa\x1c\x80\x24\x20\x24\x0c\x09\x88\x59\x10\x21\x45\x85\x10\x8c\x32\x15\xa1\x98\x87\x22\x12\x2c\x8a\x71\x84\x29\xe5\x21\xa3\x38\x88\x99\xe0\x84\x30\x06\x39\x8d\x18\x91\x88\xff\x00\x55\xfe\x7c\x27\x85\x9b\xb1\x8d\x94\x51\xf2\x61\x27\x85\xd3\x2c\xbe\x80\x33\xfa\xa1\x1e\x3e\xdf\x49\xe1\x6d\xd5\xff\x5f\x3b\x29\xdc\xcf\x5f\x3f\xe8\xa4\x90\x5b\x60\xbb\x66\xb4\xe3\x7a\x2d\xd9\x2d\xd6\x1d\x42\xed\x6e\x75\xd0\x8a\x5c\x39\x64\xa6\xac\xae\x8e\xd9\x71\xc5\xef\xa8\x8e\xd1\xb1\xf5\xae\x66\x34\x56\xe6\xc0\x9c\x79\xc1\x12\xe6\x3b\x56\x89\x45\xcb\xf9\x7a\x65\x9b\x63\x59\x63\x05\x99\x70\x1d\xd9\xb9\x52\x48\x7c\xb7\x92\x56\x27\x85\xeb\x77\xe0\xce\x4e\x06\x6d\x55\x8f\xf5\xab\x96\x26\xd5\x77\x29\xdf\x70\x50\xa5\x48\xff\xa1\x4e\x0e\x57\x9d\x14\x9e\xa8\xde\xdf\xde\x5b\xa4\xf4\x6c\xf5\xfe\x3f\xd8\x3d\x40\xd3\xfe\x5c\xe4\xfa\xbb\x4a\x5b\xf7\xf1\xbd\xf8\x71\x16\xe5\xab\x34\x0c\x70\xe7\x5e\x3c\x7b\x16\x6f\xef\xc2\x3d\xf4\x5f\xf0\x25\x58\xef\x87\x3b\xe8\x8d\x9a\x58\x94\x96\xed\x8d\x53\x9f\x34\xfd\x71\xbe\x55\xf3\x33\xfd\x5a\x33\xac\x64\x69\xd3\xb6\xa6\x56\x0f\xf6\x7b\x13\x57\x03\xcb\x5c\xa1\x5f\xb2\xd0\x42\xd6\x61\xbf\xb1\x99\x06\x2c\x0c\x73\xfd\x62\xd2\xcc\x0c\x6a\x5e\x66\xb7\xee\xf7\x1a\x93\x8c\x6d\x1a\xa9\x2b\x6d\x01\x67\x31\x40\x0c\x24\x2c\x14\x58\xb1\x38\x90\x38\xa1\x84\x46\x90\x47\x31\x47\x50\x01\x2e\x23\x85\x61\x2c\x60\x1c\xd3\x38\x52\x04\x26\x90\xca\x58\xd1\x24\x24\x82\x9c\x98\x3a\xfa\xd9\xab\x3a\xc7\xec\x2a\x2e\x17\x5b\x1d\x56\xf4\xeb\xdc\x34\x9c\x22\xe1\xed\x5c\x9e\x1b\x84\x56\x48\xb1\x93\xf7\xec\x12\x2b\xe7\x8b\x75\xcd\x2c\xd0\x62\xae\x51\x45\x46\xce\xf5\xb9\xfb\x03\x17\x00\xc7\x9c\x40\x81\xc8\xed\xda\x38\x4c\x7c\xd2\x49\xe1\x34\x7b\x0a\x4e\x84\x90\x31\x09\x29\xe6\xf2\x35\xe4\x23\xbf\x9f\xf0\xce\x64\xbc\x2d\xee\xf3\x34\xb7\x69\x1e\xa5\x3b\xcd\xd4\xa6\x1d\xd5\xf4\xe5\xb1\x24\x56\xcc\xef\x15\x86\x0b\xf7\x10\xce\x7c\xff\xf5\xfa\xe6\xae\xea\x53\x5c\x5d\xa7\x37\x57\xe0\xba\x7f\x9c\xe8\x6e\xe0\x7c\x1e\x1e\x54\x3d\xe3\x86\x23\x91\x6d\x15\xb3\x43\x0a\xa7\x26\xaa\xa9\xc3\xb6\xec\x4c\x0a\x7a\x81\x8d\x2a\x13\x66\x5f\xdb\x36\xa3\x63\xa7\x75\x75\x73\xaf\x1d\x6e\xaf\xeb\x71\x73\x8b\xa3\xee\x1b\x9b\xb2\x3f\xcd\x0e\xbd\x7e\x62\xb6\xf7\xa6\x3d\xe8\x55\xf4\xa2\x3d\x73\x72\x7a\x49\xa2\x71\x2b\xc4\xad\x09\xa4\xb5\xde\xae\x51\x64\x78\x5d\x1d\x67\xac\x79\x5e\x64\x0e\x54\x65\x26\xfa\x2a\xbb\x3c\xaa\x6d\x74\x98\xc9\x8d\x17\xcd\xa2\x88\x94\xbd\xce\xc0\xed\x7d\x45\x33\x7b\x1b\x9c\xa9\x3d\xb2\x9f\xe7\xd1\xfa\xbe\xfd\x7a\x93\x11\x79\xf9\xb7\x2b\xa4\xbc\xd2\x06\x12\x3b\x5c\x07\x41\x47\x4c\xcd\x64\x64\xd3\x5a\x0d\xea\x09\xc9\x44\xdd\x7d\x75\x88\x2b\xcb\xc3\x71\x3e\xd0\x06\xce\xdc\x28\x6e\xfa\xfd\xd3\x97\x2e\x9d\x4a\x73\xbf\x54\x8b\xbe\x1a\x37\x90\x32\x3d\xfa\xcf\xf6\xbc\x0b\xae\xa6\xee\x3c\x83\xab\x80\x3c\xf7\x13\x9a\x9f\x73\xe7\xb4\xe9\xdf\xea\x79\xf7\x92\x65\xab\xe0\xf8\xa3\x65\xbd\x7e\xf2\xa4\xd8\x9c\x9d\xdc\xff\x0b\x77\xfc\x7d\xc4\x7d\x60\x4f\x5f\xd0\xff\x33\x09\xe3\x5b\xcf\xf4\x25\x1b\xe1\x6e\xfa\x2f\x88\x6b\x2f\x2b\xc5\x9e\x43\xd6\x83\x24\x53\x8d\x2d\x51\xf7\x4c\x37\x28\x69\xbb\xc2\x28\xe8\x11\xb3\xb0\xc4\x41\xbb\xbe\x8d\x1a\xa1\x37\xca\x18\xb9\xc2\x74\x19\x03\xe4\x91\xce\x28\x39\xf2\xf2\xf8\xc8\xfc\xd2\x31\xb3\xad\x1e\x24\x2e\x0d\x11\x8d\x50\x1f\xe2\xde\x3a\x0a\x8a\xe9\x77\x05\x90\x28\x60\x94\x28\xce\x24\x63\x81\x62\x30\x50\x4a\x46\x09\x08\x39\x4d\x24\x54\x61\x14\xe3\x90\x52\xa8\x64\x2c\x39\x63\x1c\x03\x81\x78\x90\x10\x14\xc1\x18\x11\xae\xd4\x4f\xc4\x45\xa9\x21\xee\xad\x5a\xbb\x9c\x49\xf0\x09\xe0\x9e\x27\x7f\xe2\x2d\x17\x17\xcd\xee\x71\xbc\xfd\x24\x6b\xed\xea\x02\xb4\xdb\xcd\xfa\xcb\xff\xde\xc9\x4b\xbf\x88\xb7\xa1\x29\x9b\x7c\x96\x2b\xcd\xaa\x20\xdb\xc0\x5a\x9b\xdb\xb3\x46\x3d\xce\xec\x9b\x5c\x36\xc6\x9d\xaa\xee\x9b\xeb\x32\xac\xd7\xcc\x7d\x59\x58\xe5\xfe\x8e\x9a\xc6\xca\x2b\xcf\xb4\x6d\x21\x17\xe6\xb6\xf9\xc2\x52\x56\x4b\xaa\xb6\xee\x18\x87\xbe\xca\x8f\x0b\x9b\xa0\x5b\x2a\xf4\xc4\x6f\xc6\x5b\xff\xfb\xf6\xeb\xf7\xe2\xed\xd7\x3a\x93\x9f\xc5\x31\x5c\xed\x7e\xc6\x44\xd2\xc6\x9f\xab\x2a\x0e\xbf\xac\xe5\x42\xe4\xf4\xdf\x5b\xf8\x73\xfa\x4e\xe5\x3b\xf6\xef\x6b\x9d\xd5\xff\xdc\xfe\xfd\x1a\x16\x7d\x63\xff\x2e\x77\xf2\xcd\x78\x1a\xbf\x7f\xf3\x3b\x73\xc1\xef\x3f\x84\x9f\xda\x37\x9c\xe9\x3d\xf4\x7f\xf6\xb6\x5d\x35\x61\x6d\xd3\x33\x17\x3d\xdc\x94\x65\x95\xf3\x56\x41\xbf\x68\x71\x6e\xd5\xb6\xb0\xd4\xf6\x41\xb1\xd7\x00\xdb\xb6\x29\x9a\xe6\x76\xd7\xda\xe4\x8d\x91\xeb\xec\xd5\xa6\xa7\x8b\x9e\xb5\xb2\x85\x1a\x6c\x01\x98\xef\x32\xd0\xaf\x95\xac\x5d\xdc\x1a\xd0\xf9\x68\x36\x30\x52\xb7\xc8\x52\xc0\xa8\x8a\xb8\x92\x5c\x25\x21\x4b\xc2\x84\x47\x81\x20\x12\x87\x71\x1c\x11\x1e\x47\x48\xf1\x38\x09\x71\x08\x40\xc8\x79\x40\x94\x44\x4c\xa2\x38\x22\x82\x27\xa1\x60\xc1\x29\x70\x87\x3e\x6f\x91\xbd\x59\xb7\x84\x4b\xf1\x89\x73\xf3\xe7\xec\x4f\x39\x80\x11\xc9\x9e\xb7\xc8\xbe\xb5\x1e\xfe\xc2\x13\x1f\xe0\x61\x1f\x59\x64\xd7\xfd\x5d\x13\x17\xf5\x1e\x2d\x74\x47\xa5\x7a\xb5\x84\xe7\xf9\x5c\x90\x8d\x6d\x71\x5c\x08\x2d\x91\x3d\xab\xd6\x19\xfb\x5b\x33\xaa\xcf\xd8\xf0\xa8\x51\x43\x26\xbe\xa3\x8c\x79\xc9\xc0\x91\xa9\x6d\x6a\xe5\x6a\x55\xcb\x0f\xe5\xba\x1a\x76\x5b\x45\x0d\x2f\x77\xfb\xaa\x24\xb9\xd4\x2c\xb2\x57\x9f\xbf\xd3\x22\xea\xed\x1b\xd5\x09\xbf\x7c\xfd\x6d\x7f\xa4\x97\x71\x43\xcf\x4c\x8f\xfe\x43\x16\xe1\x2b\x3d\xf3\x09\x2b\x60\x62\x15\x50\xf8\xac\x15\xf0\x0f\x5a\x21\xb5\xb7\xf4\x7f\xa3\x4e\xf6\xae\x45\xb6\xfd\xf8\x5e\xfc\x38\x8b\xe8\x8a\xd2\x07\x26\xe2\x6f\x3b\x8b\xb7\x77\xe1\x1e\xfa\x2f\xf8\x12\xfa\xca\x94\x07\x77\xe6\x34\xec\xae\x3e\x6a\x36\xd6\xac\xbe\xeb\x6c\x71\x7f\x5b\x61\x5b\x2d\x9f\xf5\x73\x4d\x38\xef\x94\xf7\xf9\x56\xe0\xcc\xc4\xce\x71\xb3\x1e\x32\xa6\x1a\x6b\xf4\x24\xae\x6b\xe5\xe1\xe1\xd8\x74\x73\x24\x1b\x36\x3b\xa8\xad\xbb\x55\x26\x2a\xcd\x24\x4e\x3f\xa5\x01\x40\x4c\x58\x14\x43\x15\x60\xa0\x62\x80\x21\x91\x91\x4c\x28\x91\x84\x4a\xca\x02\x84\x12\xa9\xc2\x38\xc2\x91\x80\x89\x80\x8a\xa1\x30\xa4\x52\x25\x42\x45\x91\x08\x85\x3c\xe9\x87\xe4\x27\xbe\x20\xb7\xe0\x37\x51\x41\x6b\x59\x95\xba\x57\x2a\x37\xca\xe5\x5a\xdd\xd4\x75\xe6\xe8\x8e\x5d\xac\x68\x46\xa3\xd6\xac\x97\x78\xd3\xae\x36\x51\xc3\xaa\x23\xdf\xee\x18\x5a\xdd\xf8\xcf\x7f\xff\x4f\x02\x28\x09\x86\x18\xc1\x9b\x19\x0d\x12\x7e\x82\x33\x2f\x93\x10\x60\xc0\x25\x82\x12\x81\xd7\x20\x9a\x7c\xcb\xf4\xa7\x73\xad\x64\x75\x6d\x36\x3e\x74\xd6\xa2\xa1\x5b\x74\x37\xb5\x1b\x3b\x8d\xd6\xa6\x96\x47\x27\x61\xad\x35\xd8\xc3\x1e\xec\xbf\xde\x9d\xdc\x55\xf9\xab\xab\xbb\x74\xf9\xdf\x73\x23\xdb\x2b\xd3\x0b\xcc\xd9\x45\xe6\xea\xfd\x4e\x7d\x33\x57\xe3\x65\x62\xf6\xfa\xb1\x2a\xee\x47\x2b\xcd\x69\xd2\x7d\x3b\xd3\x9d\x1c\x61\x61\x15\xf9\x55\xff\xea\xea\x98\xb1\x3d\xbc\xba\xb6\xef\x9b\xda\xc2\x7c\xc7\xe8\x98\xa7\x69\x50\xce\x30\x69\xc0\xfe\x7e\x7e\x58\x6b\x23\x8f\xa9\x6d\x6d\x90\xdb\x38\x02\x2c\xc6\xa2\xe1\x96\xba\x90\xd6\x9c\xf6\x7e\x2f\x77\xfe\x98\x4d\xba\xcb\x72\x86\xb5\x3a\x76\x10\x66\x33\x6c\xda\x43\x95\x4c\x80\xa4\xc9\x9d\x6a\xc6\x5b\x11\xe6\xcb\x4a\x75\xd1\xec\x4b\xf8\xc5\x0c\xbd\x5f\x32\xe6\xbc\x52\xc6\x82\x45\x67\x25\x88\x5b\x35\xfa\xd3\x49\x61\x38\x2c\xb5\x0c\x37\x33\x31\xb7\x9b\xb8\xbb\x33\xca\xd9\xb5\xde\xae\x7b\xd6\x70\xaa\xde\x7d\x9b\xf4\xcc\xf6\x45\x14\xb7\xda\x2d\xf0\x42\xe8\xce\xb3\xd2\xb4\xed\x72\x77\x1d\x78\x71\xf7\xf7\xb5\xf7\x4c\xeb\x0f\x9d\x65\x2e\xf1\xfa\x9f\x9d\xe5\x87\x10\x7e\xf5\x99\xc8\xad\x0f\xe2\x91\x36\x6b\x8f\xc2\x85\x57\x0c\xf0\xbe\x50\xf0\xa6\xba\xea\x96\x35\x63\x94\x51\xed\x64\xd2\x5d\xc9\x46\xf9\xe7\x7d\x38\xab\x5e\x53\xed\xf5\xbe\x7e\x30\x6e\x40\x78\x7a\xf4\x1f\x32\x15\xeb\x17\x55\xd4\x3b\xfd\xeb\xb9\xf6\xa5\x5a\x12\xaf\x35\x62\xc7\x63\x5f\x03\x8e\x1d\xfb\x03\xa7\x32\x77\xab\x06\xf3\x1b\x19\x4a\xa7\x5a\x65\x9b\x01\xc5\xb6\xa5\x3a\x4e\x74\xb9\x53\x57\x77\x34\x95\x3b\xf5\x49\x91\xa2\x2b\x55\xd2\x3a\x6c\xfb\x51\xa3\xb9\xac\x39\xa6\xe1\x92\x2e\x1d\x14\xc8\x61\xac\x81\xda\xbc\x5f\xe6\xd3\x89\xd2\x0e\x59\xee\x8e\x5b\xed\xbd\x4f\xaf\xda\xd8\x5d\x54\x6f\xeb\x2a\x2f\xff\xce\x77\xea\xe9\x3b\x9b\x64\x7f\x0e\xf1\xf6\x79\xcb\x4c\x7c\x98\x73\xf3\x73\xbd\xfe\xe5\xf3\xf7\x9e\xd7\xb3\xe7\x93\x7b\x5d\x79\xf6\x6d\xd3\xe4\x5b\xe3\x54\xa0\xf6\x8a\x27\xdd\x7b\x7e\x63\xb7\x4c\x8e\xa7\x0b\x72\x16\x73\x7a\xda\x7b\xf9\x49\xb9\x77\xf6\xeb\x7a\xbc\xb7\xbf\xbf\xbc\x8f\x77\xde\x07\xbd\xa1\x6b\xfd\xb3\x29\xe6\xf4\x3e\xde\x61\x8a\xf9\xd2\x38\x9f\xf7\xf9\xfd\x7c\xe4\xbe\x9d\x09\x5f\x99\x3a\xee\xe4\x37\x3f\x77\x05\x12\xf7\xb2\x5f\xef\xaf\xbf\xa2\xfd\xd3\xbe\x72\xef\x7a\x2f\x66\x0e\xeb\x71\xd7\xd3\x33\xf4\x13\xc9\x3a\x6f\xe9\x7f\xcd\xf4\x77\xd9\x9f\x5f\xc6\x0d\x51\xfd\x81\x3d\x3a\x13\xb2\x1e\x37\x05\xa5\x78\x46\xf7\xd0\x7f\x11\xd5\xbf\x4b\xa0\x4a\x57\x54\x8f\x44\x88\x28\x10\x10\x61\x46\x59\x08\xa3\x04\xc6\x31\xe4\x0a\x71\xc6\x05\x92\xa1\x42\x28\x08\x09\x94\x54\x06\x11\xa2\x31\x53\x4a\x51\x04\x62\x41\x24\x85\x2c\x09\x03\xf8\x43\x54\xc7\x3f\x45\x75\xa7\xc4\x73\x4e\xab\xe1\x74\x6a\xf9\x9c\x56\xcd\xf9\x15\x56\x29\xd4\xfd\x6e\xb1\x60\x14\x6a\x2d\xbf\x58\xf3\xf2\xcd\xbc\x66\x58\x9c\xb6\xcc\x76\xa1\xed\x77\xf2\x79\xa7\xea\xea\xff\x10\xd5\x6f\xa5\x70\x09\x48\xa9\xf8\xd0\x95\xf3\x3a\x2b\x05\x17\x04\x51\x28\xc1\x6b\x06\xd7\x9d\xbc\xf8\x4a\x56\xff\xc4\x95\x73\x65\xd9\x78\x82\xf7\x5c\xe4\xd5\x4f\xb0\xe6\x95\x17\xe7\xb4\x66\x9d\x88\xbd\x3f\x28\x85\x1b\xa1\x39\x33\xcf\xda\x6d\xd5\xb6\x50\xee\x82\xec\xdc\x1d\x25\xf6\x66\xb7\xd3\x66\x85\x6e\x35\x4e\x96\xfc\x10\x15\x76\x63\xb5\x29\x13\xe2\xd5\x2a\x7c\x5e\xcc\xb2\xa1\xd1\x08\x17\xb9\x4d\xd4\xac\x76\x22\x13\x15\xeb\xc3\xcd\x82\xe7\x0b\xbc\xa0\x7d\x2d\xa3\xeb\x7d\xb7\xce\xe3\x72\xca\xb7\xef\xdd\x47\xb2\xb1\x75\xa5\x2f\xdc\x8b\x85\x17\xb7\xc4\x95\x6c\x7a\x0b\x0b\x2f\x23\x97\x32\xfd\xaf\x61\xf1\x1b\xfa\xb9\xb7\xb2\xf1\x79\xea\x4e\x59\xeb\x62\x32\xb7\xbe\xee\x46\x7a\xbb\xc6\xb4\xe9\x7f\xcd\x0d\x73\x35\x2e\x77\xe8\xed\x4e\x29\x2d\x05\x59\xfc\x3c\xbe\x9b\x3f\x9c\x64\x4f\xff\x32\x7f\xef\x7a\x9f\x95\x9d\xf2\x17\xb1\xf9\x9d\x3d\x7f\x69\x5e\xa1\xfe\xb2\xf5\xbd\xdd\xdf\x5f\xc6\x7b\x26\xc8\xce\xf5\x05\xb9\xff\xbe\xfe\x22\xfb\xfd\xc1\xf7\xe5\x1e\xfa\x2f\x72\xcd\x77\x81\x4f\xba\x72\x4d\x18\x03\x1a\x93\x30\x92\x8c\x45\x54\x30\x21\x63\x18\xb2\x24\x88\x01\xc4\x31\x0d\x02\xce\xc3\x28\xa6\x2c\x66\x81\x8a\x50\x14\xca\x50\x32\xc1\x41\x4c\x63\x4e\x58\x40\x82\xf0\x94\x74\x80\x52\x94\x6b\x6e\x99\x20\x05\xe2\x94\x7f\x98\x7d\xf0\x3a\x2b\x09\x11\x12\x09\xc2\x80\x78\x5e\xae\xf9\xc4\x06\x79\xe6\x23\x0f\xd9\x00\xbc\x37\xef\xd9\xf9\xde\xbe\xd2\x77\x8d\x8a\xde\x49\x74\x10\xdb\xd5\xe2\xc6\x2f\x78\x78\x45\xb5\x56\xb5\x1c\x2f\xa7\x73\x95\x6f\x4e\x85\xc3\x0e\xbd\x45\xb6\xba\xc3\x0d\xba\x9d\x1e\xb2\x1d\x82\x1c\x6a\x13\x9b\xb5\x56\x83\x7e\xbb\x05\xf7\x11\x0d\xeb\x64\x30\x41\x99\xf6\xd1\x1d\xbb\xbe\xdb\x8f\xc1\xb0\xbf\xfb\x52\x08\xe8\xb5\xfa\xfb\xa1\xdb\xcb\xba\xb2\xf9\x3d\x82\xcb\xcf\xda\xcc\x52\xa4\xff\x6c\x78\x65\xda\x7c\xee\xd7\xf1\x39\x9f\xfb\x83\x7c\x56\xbb\xd0\xff\xed\x36\xa8\x13\xbd\xf7\x6c\x50\x2f\xe3\xa6\x5b\xec\x81\xbd\x7a\x5a\xd7\x4e\xf1\xac\xee\xa1\xff\x82\x49\x95\x5d\xb1\x2b\xca\x75\xe2\x83\x09\xed\xf5\x93\xf8\x38\xca\xb9\x60\xcd\x36\xf1\x78\x17\x39\xc9\x8e\x2f\x4b\xfa\x52\x60\x23\x2a\x4f\x32\x49\x59\x86\x43\x9f\x8f\xc2\x5e\x38\x6f\x1c\x4a\x56\xbb\xe9\x59\x78\xbc\xce\x0f\x4a\x61\x48\xbd\xaa\xde\xce\xf5\x75\x8b\x37\x9c\x7c\xfa\x61\x93\x28\x60\x52\xf0\x80\x49\x0c\xe2\x20\xe4\x31\x0e\x63\x15\xa8\x44\x86\x9c\xc5\x11\x0f\x00\x13\x00\x31\x26\x14\x4c\x60\x1c\x82\x44\xa0\x84\x32\x0e\x01\x24\x21\x09\x19\x66\xa7\xec\x72\xf8\x7c\xd8\xc5\xad\xf4\x04\x81\x05\x06\x1f\x56\x49\x79\x9d\x7d\xc1\x36\x8e\x21\x7a\x3e\xea\xa2\xfc\xe6\x5c\x7f\x79\x55\x1f\x60\x85\x1f\x44\x5d\x18\xc9\xbc\x15\xaf\x42\x32\x72\xb3\xf5\x24\xb7\x87\xad\xfd\xa2\xea\xac\xbb\x28\x43\xea\xa4\x01\xbc\xfd\xb1\xd7\xab\xd5\xa1\x8e\xfd\x43\xbf\xab\x2d\xb3\x25\x51\x3a\x74\xf5\x1e\x89\x87\x46\xd3\x9a\xf6\x37\x72\xa1\xf5\x89\x5d\xee\x96\x47\x61\x6e\x19\xd8\x53\xd5\x94\x86\xf2\xad\xb4\xa2\x2e\xac\xc7\xa3\x1e\x54\xd8\x5c\x6d\xaf\x80\xa7\xf4\x2e\xe5\x5b\xf0\x93\x1e\xfd\xb7\x67\xfa\x25\xfa\x57\xf0\xf3\x84\xa7\x7f\xbf\x76\x0e\xf2\xea\x49\x3e\xe8\x86\xf3\x39\x4b\x7b\x82\xfe\xac\x5b\x06\xeb\x27\xe8\x6b\x6f\xe9\xff\x46\x96\xfe\x2e\xbc\xb8\x8f\xef\xc5\x7e\xed\x1c\xaf\x4d\xb1\xb3\x3b\xf7\xe2\xd9\xb3\xf8\x71\x17\x32\xe0\x31\xfa\x2f\xf0\x82\x59\x3b\xbf\xb4\x33\x45\xb3\x06\xbc\x9d\x8a\xda\x95\x60\xd8\x5c\x76\xa2\xed\xc6\x8c\xcd\xb5\x25\x14\x29\x18\x20\x72\xd7\xa8\x32\xeb\xb8\xa5\xec\x61\xab\xaf\x26\xee\xcc\xc9\xcf\x76\x60\xdf\x25\xe1\x36\xe8\x15\xe2\xdc\x00\x35\xa8\xbd\x0b\x50\x7f\x8e\xcd\xac\x8b\xed\xf4\xfb\x92\x49\x46\x20\x0d\x14\x8c\x50\xc2\x25\x43\x30\x44\x2c\x84\x94\x89\x44\x32\x9c\x44\x22\x8a\x98\xa2\x40\x21\x10\x20\xa4\x38\x41\x42\xc5\x49\x98\xc4\x32\x8a\x63\xc1\x38\x15\xe2\x05\x5e\xd0\x93\xf0\x72\x2b\x16\x5f\x60\x41\xd8\x87\xbd\x53\x5f\x67\xcf\xf0\x82\x20\x01\x29\xa4\x59\xbf\x0d\x40\xfb\x05\x5e\x1e\xf0\x4e\x7f\x04\x2f\x51\xd1\x8e\xb6\x51\x17\x35\x88\x3b\xf3\x22\x27\xe3\x44\x6b\xd1\xad\x47\x71\x7b\xc3\x27\xb9\xed\x82\x5b\xeb\x9a\x9c\x8d\x16\x4b\x29\xe6\xb6\x91\x1d\x36\xb4\x65\x30\x1a\xbb\xdb\xa0\x3e\xd1\x0f\x15\xad\x5c\xa8\x18\x68\x64\x8b\x3a\x2a\x0d\xfb\xa5\xed\x81\xcf\x0a\x65\x56\x48\x2d\xa8\xef\x09\xf6\x1e\xd8\x0d\x59\x7e\x96\xbd\xa7\x48\xff\xa1\xa0\xc2\x74\xe0\xe5\x2d\x7b\x7f\x28\x90\xec\x0f\x06\xb2\x69\x6f\xe9\xff\x46\xef\x5c\xda\x41\x7d\xcf\xb0\x77\x2d\x25\x78\xb9\x16\x35\x1e\x81\x97\x46\x7d\x1a\xe2\x4e\x34\xda\x98\x25\x0b\x37\xb7\xc3\x69\x98\xd8\x2d\xcf\x1b\x87\x1b\xda\x0b\xd9\x66\x1f\x36\xb3\x41\xb1\xb4\xc8\x26\xa5\x7a\x2f\x4b\x40\xaf\x84\xe6\xc5\x56\x19\x8d\xba\xbd\xd5\x50\xd3\x0f\x86\x26\xe7\xb9\xad\x19\x0d\x66\xa4\xb1\x14\x1b\xa6\xeb\x99\x41\xfa\x9e\xc2\x04\x88\x48\xc1\x24\x56\x90\x82\x04\x71\x46\x19\x12\x8c\xa9\x98\x24\x14\x71\x94\x30\x2a\x54\x02\xc2\x48\x26\x91\x50\x30\x92\xec\x07\xcc\x40\xc9\xc2\x18\xc5\x30\x44\xf4\xa4\xbd\xbc\xc0\x82\x6d\xd4\x3b\x98\xd3\x8a\xe6\xd7\x09\x73\x0c\xdb\x42\x1d\x5b\xab\xba\x3a\xaa\xd7\xbb\x65\xee\x20\xc2\x0c\x3f\x9f\xd7\xed\x4e\xb3\x8d\xea\x26\x2f\xe4\x4d\xe4\xb6\xdc\xb2\xf1\x9f\xff\xfe\x1f\x13\x1c\x4a\xc2\x19\xc7\xb7\x4a\x63\x09\x22\x20\xfe\xd8\xa2\xf6\x73\x56\x50\x21\x25\xa6\x00\xc0\xd7\xe0\x71\xa7\xba\xce\xb2\x9d\x5d\x10\x82\x74\x07\x6c\xe5\x1b\xbe\x0e\x6d\xa7\x9d\x8d\x96\xd3\x3e\x71\x54\x7d\xd9\x5c\x2e\x8a\xb5\x99\xd3\x6c\x9d\x44\xec\xb3\x45\xed\xf4\xcd\x4f\x3a\xc0\x5c\x45\x64\x18\x9b\xe0\xd0\xfb\xf9\x81\xe1\x2c\x57\x31\x5b\x83\x6e\xb5\xdc\x1a\xae\x3a\x5e\x19\x0e\x4a\x54\x1a\x12\x94\x07\x64\x47\x19\xe0\x2c\x14\xf9\xd2\xbe\x9b\x9c\x3d\x2b\xf5\x76\xbb\xf1\xf2\x2b\x9b\xdd\xb6\x7a\xac\x8e\xe4\x7a\x17\x6e\x8a\xf9\x56\x6e\x31\xf5\x10\xb3\xfd\x02\xae\x84\x7a\x34\x77\x5b\x72\x4d\xa6\xcc\x6c\xd7\xbd\xd5\xf9\xee\xf1\xc9\xea\x97\xbb\x99\x63\xc6\x08\xea\xbd\x53\x30\x7a\x86\x0f\xf7\xf1\x2a\x57\x2a\x2d\x2d\x4c\xf0\x6c\x7a\x38\xa8\xe1\x1c\xad\x07\x6e\xb9\x3b\xb0\xf3\xc8\x6c\x8e\x33\x32\xd9\x38\x8b\xd9\x7a\x1b\xfb\x68\x59\xe8\x6d\xd7\x72\xda\xcb\xb8\x45\x14\x18\x35\x9c\xa9\x4d\x8d\x95\x6f\x06\xb2\xdb\x0a\xb4\x4c\x77\x1a\xa3\x69\xc1\xee\x99\x5f\xc0\xad\x5f\x3a\xbc\x94\x57\xe5\xa3\x3a\x76\x6b\xa1\xb2\xf9\xa0\x0e\xb5\x60\x0e\xe5\xa6\x3f\xd1\xab\x47\x7b\x37\x0d\x5a\x56\x2d\x8c\x8b\x99\xbe\xd5\x6a\xf3\x2b\x5e\x7f\xda\x4f\xcb\x6a\xb7\x5f\xf6\x59\xe7\xba\xc0\x15\xd4\x44\x38\xb7\x21\xa3\xc8\xb5\x17\x51\x12\xce\xba\xbd\xa1\xda\xaf\x8a\x68\x9c\x6b\x22\x3c\x48\x66\xf5\xb6\x15\xef\xdf\x9e\xc9\xdf\x71\x46\xff\xdf\xc7\x18\x7e\xb5\x4c\x82\x70\x76\xa9\xf9\xc3\xe3\xb1\x3f\x29\x2f\xf6\xbd\x6a\xaf\xdc\xf2\xa9\x27\xd1\x26\xce\xf7\xe8\xde\x5e\x3b\x9b\xd9\x28\xd3\xa3\x55\xf7\x9c\x50\xd4\xd6\xb6\x03\x78\xb9\x99\x0f\x79\x0e\x53\xa4\x6f\x3c\x42\xff\xbc\xe8\x13\x6e\x34\xaf\xbe\x6f\xea\x4e\xcf\xdc\xd5\x1b\xc5\x11\x58\x37\x9c\x7d\x57\x6d\x3b\x85\xe5\x14\xd4\xb0\xbb\x29\x0f\x8d\xe9\xb2\xb9\x9d\x6f\x77\x6a\x69\x8d\xc5\xb3\x77\xe5\x94\xc0\xf5\x99\x85\xee\xf5\xef\xd6\x1f\x59\x5f\xb9\xec\x7a\xef\x47\xb1\x5d\x8d\xab\xfd\x3b\xdf\xf3\x7b\xef\xea\xe5\x28\x5a\xed\x76\xeb\xe5\x5d\x79\xe8\xdd\xbd\xbc\x6b\x5f\x8b\x8a\xbc\x77\x3f\x2e\xdf\x4f\xfb\xfd\x79\xe8\xfe\x3e\x43\xdf\xce\x9b\xfe\x13\xf4\x4f\x9f\x37\xaf\xc4\xc5\x3b\xcf\xeb\xfd\xe7\xff\xa5\x3c\xdd\xbb\x51\x80\x17\xde\xf6\x6e\x02\xe9\xd5\xfb\x72\x1e\x77\xde\xc7\x52\x6d\xbe\x38\xb6\x2e\xd4\x2b\xda\xd7\xa3\xda\x2e\xe3\x6d\x42\xe6\x3b\xb2\x6a\xf3\x6a\x3b\x87\x61\x92\x59\xe5\x06\xb5\x9a\x63\xfb\x9b\xa5\xad\x21\x6d\x5d\x1f\x8e\x13\x1c\x50\x12\x1b\x53\x33\x00\x8c\x0d\x9a\xaf\x18\x7b\xe5\x7d\x3d\xaf\xf1\xa1\x68\x89\xd6\x73\xf4\xcb\xad\xc7\xe8\xbf\xc8\xaa\xc9\x86\x08\x6f\xa9\x35\x06\x8b\x7d\x94\xa9\xb2\xa2\x58\x4d\x0b\x2c\x5a\xfa\x23\x1d\xf9\xfd\xbe\xec\x9b\x34\xd9\x7a\x7c\xb8\x58\x94\x43\x3c\xa9\x2e\x0e\x85\x32\x4f\xba\xa4\x36\xd2\xa3\x49\xef\x28\xb3\x43\xba\xe3\x76\xce\xde\x76\xda\x76\xaf\x36\xe9\xe2\xf5\xfc\x90\x9b\xa5\x5f\xc7\x15\x4a\x21\x08\x51\x22\x24\x1c\x45\x41\xa0\x14\x0d\x39\xe4\x4c\xd2\x80\xa8\x00\xb2\x40\x71\x29\x03\x88\x93\x10\xa9\x84\x40\x8a\x22\x28\x63\x04\x21\x0f\x62\xa8\x28\x3b\x15\x28\x80\x32\x45\x59\xf5\x66\x54\x1b\xa3\x92\xf1\x0f\x65\xd5\x9f\xb3\x02\x32\x40\xb0\x40\x1c\x81\xe7\x65\xd5\x4f\xa2\xda\xce\xf7\xe2\xe2\xfd\x7d\x46\x8e\x71\x0b\x4c\x6b\xe6\xac\xc2\xa4\xd9\x80\x05\x6e\x8d\x0f\xd2\x1f\x6c\x12\x37\x1b\xe9\x64\x53\x71\xe2\xb5\x93\x99\x64\x73\x87\x55\xc7\x3b\x9c\x3e\xfe\x04\x96\xbc\x49\x56\xbe\x1a\xf9\xd7\xe7\x77\x2b\x2b\xb9\xad\x76\x29\x14\x33\xbf\x55\x99\x63\xd1\x0c\x46\xb3\x6d\x27\x9b\x35\x8c\x66\xb8\xca\xca\x59\x6d\x08\xeb\xda\x60\x4f\xcd\xb1\x9e\x8d\x78\x2f\xec\x04\x41\xb5\x5a\xdc\x97\xdc\x3a\x8f\x2b\x55\x87\x2d\x73\x99\xe9\xda\x5e\xc4\x31\xe9\x6c\x96\xcd\x62\x4f\x23\x23\xb4\x5b\x7d\xc5\xfb\xac\xbf\xd9\xdf\xc7\xb0\xf2\xea\xa7\x2f\xcf\x7b\xe5\x6d\x7c\x42\xee\xfd\x23\x72\xf7\x5b\x2c\xb8\xfa\xfb\xf7\xc9\xdd\xd7\xc5\x02\x3e\x96\xbb\xaf\x71\xf3\x01\xb9\xe1\x25\x62\x4f\xd3\x1e\x8d\x18\x4c\x91\xfe\x43\x72\xbf\x7e\xc1\xc0\xfa\xd5\xf7\x7f\x9f\x5c\x7b\x5e\xca\x57\xe4\xee\xbf\x58\x2f\x38\xed\x5f\xe3\xb2\xbe\x7b\x31\xfc\xd9\x77\xfd\xde\xfd\xfb\x8d\xeb\xfb\xd2\xf9\x5e\xed\xdf\x9f\xd6\x5b\x4e\x7a\xd6\x79\xd1\x57\xf7\xed\xe3\xfd\xfc\xd3\xeb\xfd\x92\x9e\x75\xb5\xbf\xda\x23\xeb\x7d\x2b\x63\x56\xb4\x2f\x47\xe4\x5e\xf6\xf3\x5d\x63\xd5\x39\x82\xf4\xca\xec\x7f\xef\xfd\x1a\xbb\x65\x72\x36\xdb\x9f\xa9\xbf\x6d\x77\x7e\xbd\x96\xd7\x71\x7e\x0a\x87\x2e\x5f\xdc\xe9\xef\x16\x96\x39\xe3\xc3\x55\xb6\xd6\x93\xd8\xfe\x84\xec\x75\x05\xe8\xee\xbb\xcf\xa7\xfd\x13\x4f\xfe\xf4\x7a\xaf\xf6\xf3\xfd\xf5\xbe\xe7\x2f\xa8\x5f\x6d\xfd\x03\x3a\xd0\x39\xda\xc8\xbc\x9c\xef\xbd\x3a\x58\x8a\x3a\xe0\x03\x11\xb8\x87\x23\x12\x70\x3a\xf5\x0e\xfd\xbe\x7b\x98\x26\xfb\xea\xa2\x31\x90\x61\x56\x54\xaa\xd5\xcd\x31\x8b\x7a\x99\x5a\xdb\xd4\xcb\xf9\x51\xa3\x55\x96\x78\x93\x5b\x77\xe7\x33\x00\xa6\xe6\x3c\x97\x5f\x93\x1d\xe0\x8b\x55\x9e\xc5\x20\x98\x53\xde\x0f\xd8\xba\x32\xd1\x8c\x41\x33\xd4\x53\x2f\x32\x23\x01\x0a\x25\x50\x08\x23\x14\xca\x98\x85\x18\xd3\x98\x53\x82\xb1\x90\x01\x27\x84\x85\x82\xc5\x18\x60\x19\x87\x09\x95\xb1\x62\x2c\x4a\x92\x90\x82\x38\x88\x15\x88\x94\x38\xf5\xad\x10\x2f\x3a\x98\xe6\x55\x2c\x82\x9b\x76\x37\xdf\xc1\x6e\x15\xd7\x4d\xa7\xa5\xa1\x16\xad\x75\x68\xae\xa9\xd5\x3d\xdb\xf6\x8b\xb8\x58\xb0\xf2\x1d\xec\x37\x99\x5b\x2f\xd5\xcb\x58\xaf\xd5\x5a\xff\xd0\xc1\x6e\x46\xe0\x0a\x02\xe4\xc7\x3a\xd8\xcf\x59\x7e\x6a\xb9\x01\x29\x41\xaf\x99\x45\x77\xf2\xa1\x2b\x1d\xec\x56\x97\xc2\x7b\xe5\xbc\x94\x74\xb6\x13\xfd\xd7\xf5\xba\xba\xf4\x50\x01\x77\x8f\x70\x8f\x35\xb7\xb2\x28\x13\x4f\x3f\xc6\xb5\xe6\x78\x37\x9d\x8d\xb6\x28\xe7\x4e\x3b\xf6\xa4\x09\x00\x9f\xe5\xa9\xec\x05\x03\x1c\x57\x37\x3c\xdb\x69\xcf\xf2\xeb\x8e\xe8\xaf\x7a\xf9\xe1\x0a\x4e\xba\x25\x0e\xa4\x75\x3c\xd6\x2d\xa4\x42\x03\xad\x5d\xf3\x2b\x3a\xd3\xfb\xe5\xff\xdf\xca\xe5\x57\xf6\xa7\x27\xed\x59\x1f\x8c\x1b\x72\x79\x7a\xf4\x1f\x8b\xd8\x7d\x57\x2e\xff\xdb\xe4\xb6\xd3\xdf\x7f\xa9\xdc\x7b\x2b\xe4\xe9\x11\x19\xc8\xfd\xfc\xe4\xde\x52\xf8\x68\xaf\x1e\xa6\x7f\x8d\x71\xf7\xd0\x7f\xc1\x98\x32\x4c\xfc\x61\x34\xad\x79\x79\x95\xd3\x0e\xb3\x6d\x5f\x95\xab\x44\x3a\x9e\x1e\x0f\x1a\x59\xdf\xd2\x23\x3f\xe8\xd6\x9a\xcd\x4d\x2f\x99\xa2\xdc\xa2\x1c\x11\xc4\xb7\xb2\xdb\xe9\xc5\x30\x3c\xd8\x07\x2d\x76\x8e\x9d\xee\x68\xb9\x6d\x02\xaf\x56\x35\xbd\xee\x7e\x55\x0b\xbe\x21\x7b\x55\x05\x9c\xb2\x08\x52\x28\x55\x1c\x05\x5c\x26\x82\x23\x04\x08\x0a\x21\x52\x71\xc0\xc3\x00\x00\xa2\x70\x18\x49\x06\x83\x28\x64\x28\xa4\x32\x11\x22\x10\x8c\x27\x82\xc5\x21\x7e\xc1\x18\x94\x16\xc6\xdc\xb4\xf3\x09\x82\x39\xfd\x04\x63\x30\x67\x17\x8c\x91\xf4\x62\xe7\x7b\x1c\x63\xee\xce\x5e\xbd\x57\x16\xbc\x00\x87\xf9\x1e\xbd\xf3\xa8\xff\xfc\x7c\x4e\x2b\x6f\x82\x01\x75\xf7\x2a\xb6\xc2\xb5\x36\xd0\xe9\x74\x34\x5d\x57\xdb\xd3\x6d\xa3\x16\x77\xea\x19\x3d\x63\xf5\xe6\xe3\x9a\x16\xd5\x7b\xf5\x46\xa6\x56\x33\x1b\xf3\xd6\xa0\xa1\x1f\x36\x83\xdd\xa6\x3f\xd9\x6e\x8c\x1d\x1f\xed\xf6\xd3\x8c\xc6\x4c\x50\x21\x2a\x80\x2b\xb4\x38\x56\xb4\xde\x13\xd9\xab\x0f\xf1\x3b\xf3\xb7\xec\xdd\x6f\xc0\xbc\x87\x30\x27\x45\xfa\x1f\x64\xde\x7d\x39\x8e\x2b\x45\x5d\xf5\x83\xaa\x24\xdf\xca\xa7\xef\xf6\xc7\xfc\x32\xff\xae\xae\x7c\xfa\xe4\xb3\x3e\xd3\xdf\x7c\xc7\x2f\xd8\xfb\x87\xb0\x4f\x4b\xe9\x4c\xaf\xf5\xbb\x7b\xe8\xff\xc4\xde\x6f\x62\x90\xe9\x62\x2f\xe6\x61\xc8\x65\xc2\x24\x95\x0a\xc4\x22\x96\x21\x8e\x30\x4c\x98\x92\x18\x88\x48\x44\x40\x90\x48\x2a\xc6\x09\x52\x49\x40\x99\x0a\x80\x24\x2a\x09\x58\x1c\xc4\x52\x12\xf4\x13\x7b\x71\x5a\xd8\x7b\x33\x1e\x4c\x10\xfe\x49\x86\xe5\xcf\xd9\x33\xf6\x22\xcc\x2e\xf1\x60\x8f\x63\xef\x27\xf1\x60\x67\xff\xf4\x13\xb1\x42\xa7\xb1\x5a\xe7\xe2\xab\x7b\xfb\x41\xe5\x88\x0b\xf6\x2e\x8f\x73\x69\xed\xf7\x8b\x71\xe6\x30\x3b\xac\x7a\x63\x63\xe8\x4d\x64\x66\xb9\x2a\xc6\x55\x0f\xd9\xab\x46\xc0\x9b\xce\x01\x6b\xc7\xbc\xb3\x21\x3e\xed\x8a\x82\xbe\xa7\xc8\x15\x82\xf6\x5c\xdb\xed\x54\xd6\x66\x0d\xec\xd8\xa1\x2f\x70\xc4\x32\x33\x36\x1a\xea\xd9\xce\xe6\xf7\x63\xef\xd3\x71\x56\x5f\xda\xbb\xdf\x80\xbd\x8f\x55\x51\xba\x18\x23\xdf\x7e\x27\x6d\xbb\x6d\x3a\x58\xe4\x6a\xff\xa8\x4a\x96\xe2\xfe\x7d\x2d\xfe\xe5\xcf\xed\x5f\x3a\x76\x6f\x2d\x0d\x2c\xff\xcd\xef\x4c\x6a\x58\xfe\x28\x96\x6a\xdf\x70\xa6\xf7\xd0\x7f\xc1\xf2\xef\x62\xb8\x29\xeb\xd1\x51\x9c\x10\x1a\xfd\xd0\x93\x23\x2a\x31\xa7\x98\xc2\x38\xe0\x51\xc4\xe3\x84\x11\x48\x92\x84\x48\xcc\x61\x80\x31\xe5\x08\xc7\x82\x44\x41\x12\xa8\x38\x80\x31\xc4\x8c\x9d\x62\xbb\x21\x4f\x31\x5e\xe6\xa6\xad\x56\x0a\xc0\x3f\xb6\xd5\xfe\x9c\xe5\x18\x40\x42\x88\x80\x48\x3c\x1f\x2f\x73\x47\xb5\x84\x3b\xee\xd9\xbb\xd5\x12\xae\xe2\x55\x0a\xc3\xf2\x42\xf9\x9e\x29\x4c\x6d\x95\x67\xc6\x1e\xf5\x77\xb5\xe1\xc0\x4c\xf2\x76\x97\x0c\x57\x95\x6a\xb7\xab\x78\xed\x30\xad\x0e\x8a\x03\x39\xb2\xbc\x61\xb2\xdd\x96\x8d\x71\x67\x70\xb4\xb5\x25\xca\xc9\x8a\x65\x2c\x13\xa3\x6e\x6c\x87\xd3\xdc\xbe\x54\xea\x17\x07\x89\xa9\xdc\x4a\x6a\xd5\x12\xcc\xab\xaf\x3e\x12\x93\x30\x7d\x6f\x67\xff\x31\x6e\xe8\xa1\xe9\xd1\x7f\xb6\x5a\x42\xda\x3e\xa9\x5f\xc7\xe7\x7c\xee\x0f\xfa\xc4\x34\xed\xef\xb5\x3d\xdf\xb2\xed\x3e\xb2\x57\x4f\xdb\x76\x53\x3c\xab\x7b\xe8\xbf\x60\xd2\xa0\xb2\x99\xef\xfb\xaa\xb9\x73\xf5\x5d\x32\xab\xe5\x83\xbc\x96\x71\x0a\x75\xa1\xba\xd3\x81\xb3\xdb\xc1\xf1\xf8\xb8\xca\x96\x14\x2a\x4c\xca\xc8\x6d\xc7\xd5\x4c\x46\xac\x9c\x76\x50\xae\xf8\xfa\xd6\xcf\x83\x5d\xcb\x59\x8b\xaa\xe9\x64\x1c\x95\x37\x67\x0b\x73\x52\x14\xf5\x7d\xfa\x6d\x83\x23\x98\x50\x89\xe3\x90\xc6\x90\x24\x92\x03\xc4\x43\xc5\xa5\x40\x30\x09\x08\x63\x48\x28\x08\x38\xc0\x24\x09\x03\x19\xd0\x40\xc5\x09\x0b\x64\x14\x70\x19\x03\x0a\xe3\x98\xe3\x17\x4c\x3a\xdb\x76\x75\xad\x8e\x34\xd3\x37\x4b\x85\xa6\x89\xca\xa5\x02\xad\x57\x3c\x8b\x56\x0a\xed\x2e\x73\xb9\x57\x28\xd7\x1d\xdb\x68\x22\xe4\xf0\xa2\x47\x8c\x46\xc7\x6a\x70\xcb\x30\x6a\xf7\x62\x12\xfa\x44\xbf\xfc\x31\x8b\x5f\x31\x89\x22\x74\xf1\x1f\xde\x19\x23\x79\x0f\x26\x3d\x24\xef\xbd\x8b\x49\xd6\x2b\x7d\xb7\xc0\xfb\xe1\xae\xab\x60\xa6\xd4\x49\xfa\x71\x7b\xea\x6b\x0b\xda\xf4\x2c\x4f\x06\x53\x95\x2f\x4e\x8a\x0b\xb0\x6b\x03\x25\x9d\x6a\x21\xb1\x59\x4b\xac\x97\xfd\x42\x3b\x6e\xcf\x06\xa6\x81\xe2\x96\x65\x4d\xfa\xfb\x4c\x98\x5b\x5b\xb2\x59\x6b\x6c\x07\x89\x95\x9d\x24\xc6\xd8\x1d\x7d\x0b\x26\xdd\x19\x43\x98\x3a\x26\x3d\x49\x3f\x45\x4c\xba\x37\x0e\x2e\x6d\x4c\x4a\x85\xfe\x13\x98\xf4\x37\xc5\x29\xde\xf4\x37\x3e\xb0\x57\x69\x62\xd2\xb3\x67\x75\x0f\xfd\x17\x4c\x1a\x6e\xac\x6d\x6e\x7c\xf4\xc8\xbc\x9b\xb1\x68\x27\xea\xe9\xcb\x71\x55\xb5\x13\xb8\x88\x76\x6a\xe2\x4f\x96\xcd\x9c\x57\x3f\x02\x02\xfa\x22\x9c\x37\x0f\x68\x63\xf6\xdb\xb4\x33\x28\xb8\xb5\x2e\x75\x5b\x9d\x20\x9f\xa7\x2b\x1b\x78\xb0\x22\x4b\x99\xa2\xf0\x32\x5d\xe1\xb4\xf5\xd4\xfd\x8d\x01\x0d\x64\x8c\x55\xc0\x70\x2c\x95\x82\x94\x62\x2a\x95\xe4\x18\xf3\x50\x85\x90\x10\x46\x94\x0a\x28\x0b\x11\x06\x01\x89\x80\xe2\x09\xe2\x54\x20\x46\x48\x04\x99\x00\xa7\x36\x12\xec\xe9\x0a\x3e\xb7\xbc\x8c\x12\x02\x76\x2a\xe7\xf0\xf9\xec\x19\xda\x04\x10\x38\x85\x02\x3e\x6f\x5d\x27\xbf\xbc\xa9\x0f\x48\xe7\x1f\xb5\x4d\xea\x5b\x46\x36\xf4\x83\x66\xb7\x5b\xc4\xed\xa2\xdc\x17\x17\xde\xac\x43\xe3\xb8\x5c\x02\x5a\x6c\x05\x5a\x33\x97\x97\x48\xd5\x93\x3d\xe8\xb4\x9a\xd6\x62\xce\x96\xde\x9e\xf0\xa4\x92\x6b\xed\x47\x1d\x7f\x21\x42\x2d\x5f\x49\x7c\xbd\x41\x3d\xaf\x56\xef\x09\xb6\xd2\xec\x56\x29\xad\x0a\x0b\xd7\x6f\xc0\x9d\x15\x0e\x86\x41\x9b\xab\x2b\x88\xcb\xbf\x4b\xf9\x16\xfa\xa4\x47\xff\x03\x77\xd8\x97\xd1\xe7\x1a\x07\xef\xcb\xaa\x5f\x54\xe7\xde\x7a\x77\x55\x34\xe6\x97\x14\xb3\xf3\xf8\x9c\xa3\x3d\x41\xdf\x6c\xb7\xb6\xbd\x27\xe8\xbf\x9d\xfd\x9d\x5a\xc6\xbb\xe8\x52\x7d\x7c\x2f\x7e\x9c\x05\xbc\x5a\x86\xba\x73\x2f\x9e\x3d\x8b\x1f\xf4\x8f\xbd\xc7\xe8\xbf\xa0\x8b\x5f\x77\xb3\x08\xd9\x23\xd4\x69\x44\xb0\x91\xa8\x46\x30\x66\xd6\xc6\x9b\x0e\x0e\x6b\x2d\xdf\xef\xfc\xc0\xba\x6c\x34\x35\x3d\x11\x59\x63\x73\x1f\x2c\xe2\x05\x14\xb1\x83\x8f\x5a\xbb\xd2\xb5\x26\xa5\xad\xbd\xcb\x1d\xf3\x48\x1b\x6d\xda\xf0\x08\xfc\x9a\xb3\xd4\x72\x63\x3d\x75\x2b\x1c\x0b\x00\x65\x50\xc8\x90\x50\xce\x80\x62\x80\xc7\x18\x43\x25\x81\xa2\x81\x08\x89\x8a\x38\x02\x92\xc1\x28\x11\xa1\x12\x2a\x56\x49\x44\x82\x00\x0b\x11\x52\xce\x03\xa6\xc2\x17\x74\x79\xb2\x80\xcf\x2d\x3f\x9a\x84\x40\x90\x0f\x63\x58\x5e\x67\x5f\xd0\x85\x48\x94\x42\xfd\x9e\xe2\x9b\x63\xfd\x05\x5d\x1e\x90\xb3\x3f\x40\x17\x6d\xaf\x53\x35\xe6\xeb\xd1\xd0\x2d\x00\x95\x58\xdd\xe6\xa0\x60\x19\x9b\x19\x68\xec\x0e\xfe\xb4\xba\x68\xb6\xf2\xa8\xbf\x37\x72\xeb\x09\xef\x67\xb7\xad\x51\xce\xc6\xaa\xb7\xb3\xbd\x86\xe0\xd3\xc1\xb4\x3d\xea\x4f\xb6\x51\x61\xde\xec\x24\x71\x21\xb6\x07\x3b\x3e\xea\xc5\x49\x4b\xfb\x0b\xd0\xa5\x6f\xb5\xcb\xe4\x59\xee\x9e\x22\xfd\xb7\x67\xfa\x25\xfa\xe9\xa0\xcb\x5b\xee\xfe\x41\x33\xfc\xef\xe2\x68\x73\x9e\xab\xef\xdd\x27\xe8\xff\x32\xfb\x1b\xf5\x85\x94\xcb\xc3\x3d\xc5\xdd\xb5\x94\xd0\x65\x2f\x1e\xa3\xff\xb3\xfa\xa8\xbb\xf1\x8a\x31\xef\x16\x80\x5e\xcd\xe7\xf7\x9d\x16\x19\xe4\x5c\xbe\xa8\x9a\xab\xca\xa4\x78\x0c\x46\x30\x27\x67\xca\xdd\x85\xdd\x0d\x49\x38\x2c\x6a\xf5\x35\x2e\x54\x72\x63\xb0\x75\x28\x99\xc3\x6e\xa1\xbb\xc4\x8d\x52\x0b\x4e\xf1\x20\xdf\x9f\xad\x1c\x5a\xc8\x4f\x61\xfa\x15\xb1\xa1\x08\x13\xa6\x54\x8c\x80\x4a\xc2\x10\x24\x12\x70\xa9\x48\x28\xb8\xc0\x1c\x0a\x49\x64\x04\x71\x18\x41\x14\x41\x8e\x03\x06\x30\xc3\x11\x0a\x45\x8c\x03\xc0\xe3\x24\x0e\xa2\x17\x74\xc1\x4f\x96\x87\x03\xb7\xe1\x45\xb2\xcf\x94\x97\xf3\xec\x0b\xbc\x48\x70\x31\xa3\x3d\x0e\x2f\x6f\xbd\xc1\xbf\xc0\xcb\x03\x6e\xea\x0f\xe0\x45\xcf\xd6\xdb\xeb\x19\x3b\xac\xb5\x45\x7e\x1e\xb1\xae\xd5\x19\xee\x3c\xf7\xe0\xcd\xe6\x25\xa7\x7e\x14\x6e\x63\x7b\x04\x91\xa8\xcf\x6a\x4b\xc7\xcc\xf5\xaa\xe6\x46\x1b\x8a\xcc\x28\x3c\xf4\x1b\xdc\x1d\xc4\xce\x62\x17\x0e\x8a\xcb\x06\xd0\x5a\xc2\xef\x04\x39\xd7\x25\x47\x95\xd9\x95\xff\x02\x78\x89\x77\x2d\xd5\x7a\x96\xbd\xa7\x48\xff\xa1\xea\xa7\xa9\xc0\xcb\x2f\xec\xfd\xa1\x92\x64\x4f\xd0\x7f\xb6\xe2\xe6\x2f\xb3\xbf\x31\xfc\xfd\x3b\xe0\xe5\x51\xf6\xae\xa5\x04\x2f\xd7\x8a\xec\x03\xf0\xb2\x05\xed\x30\x70\x56\x4b\xb7\xd4\x67\x5e\x3c\xa9\xb7\x67\xc2\x02\x95\x31\x2b\x35\x86\x23\x95\x35\xcd\xa5\x90\xf9\xc4\x0c\x0c\x76\xec\x6b\xbe\x51\x2f\xf7\x0a\xd9\xda\xdc\x16\xb3\xd6\x06\x14\xa6\xc3\xc5\xca\x26\x83\x00\xac\x35\xab\x66\x5b\x93\x5e\xcb\x74\x2a\xb8\xb6\x4a\x3f\xdd\x0b\x12\xa4\xa4\x10\x21\x4c\x18\x97\x82\x24\x9c\x04\x90\x0a\x18\xc5\x52\x05\xb1\x4a\x88\x94\x31\x03\x09\x8c\x41\x1c\x47\x44\x32\xc6\x60\x10\x20\x45\xa9\x44\x58\x70\x46\xd4\x0f\x6c\xf8\xd9\x53\x5c\xcf\xeb\xc4\x40\x7a\x83\x50\xbd\x58\xaf\x56\x89\xab\xe5\x9b\xa8\x6c\x75\xb5\x62\xa1\x45\x6b\x1a\xcf\x53\x5c\xc2\x6d\xa7\xc6\x3a\x66\x91\x79\x9d\x7c\xb5\x51\xed\x96\x5c\xfb\x3f\xff\xfd\x3f\x4a\x05\x26\x94\x13\x41\x6f\xe2\x0c\x02\x02\x90\x0f\x71\xe6\xe7\x2c\x23\x04\x11\x0a\x31\xc5\xaf\xe1\x80\x05\xb2\x31\x40\xc9\x73\x06\x4d\x6b\x19\xbb\x5a\x1c\x8f\xc7\x87\x5c\xa9\x14\xc5\x06\xcd\xf0\xf6\x66\x39\xcd\xac\xea\xb5\x25\x72\x50\xf3\x74\xd8\x67\x9c\x39\x55\x28\xfc\x24\x14\xff\xfc\xa6\xd8\xb4\x22\x3b\x0e\x1a\xc5\xfb\x0d\x89\xc6\xc3\x66\x04\xfc\xc6\xe6\x60\x4e\x27\x46\x6b\xb5\x2f\x05\x93\x63\xb1\x33\xd8\x12\xcb\x1e\xcd\xce\xb9\x93\x97\x90\x03\xdd\x29\xf7\xa4\x3e\x3e\xce\x46\xfb\x00\x8f\xb4\xfc\x74\xde\x55\xbd\xc6\x60\xea\xf5\x32\xc9\x06\x86\x0b\x9a\x5d\x9a\x4d\x26\x87\xeb\xd1\x4b\x77\x1a\x4b\xc6\xd7\x6f\x67\xfe\x75\xbd\x6e\x31\xd7\xda\xd3\x75\x27\x19\x6a\x3b\x6f\x1f\x84\xb2\x45\xf3\xce\xb0\xbb\xcd\xd5\xb7\x78\x23\xe9\xd0\x0b\x0f\xc7\xcd\x22\xee\x66\x47\xc3\xd5\xa1\xb2\x6a\x81\xa1\x93\xed\x01\x5c\x4f\xe0\xb1\x17\xab\x35\xec\x0f\x49\xdf\xf0\xed\xaa\x98\x74\xc8\xcc\x9c\xad\xc1\xaa\xd1\xec\xf6\x76\xa9\xa5\x7b\x19\x57\x65\x10\x86\x03\x52\x73\xe7\x8a\x15\x2b\x9d\x35\xd5\x72\x94\x75\xbc\x82\x39\x9b\x43\x52\x9b\xf2\x75\x87\x6d\x12\xb6\x37\x33\x5b\x9f\x77\xab\xa7\x2f\xe9\xcd\xbe\xaf\x3b\x97\xf3\x78\xc8\xbd\x92\x22\xfd\xc7\x42\xdf\x2f\x7c\xd1\xb9\xda\xbf\x70\x74\x84\x3e\x0f\xea\xdc\xe6\x7d\xd4\xa9\x56\x71\xbd\x5f\xe2\x85\x46\xec\x57\x1b\x47\x73\xbe\x08\x2b\xe3\xa0\x94\xed\xb5\x82\xc6\xb9\xcb\xc0\x95\xcb\xfd\xce\xfb\xfc\xb2\x94\xaf\xa4\x7b\xd5\xfe\xcc\xfa\x3c\x48\xdc\xbb\xdd\x2f\xce\x65\xfe\xde\x77\xa9\xe8\x58\xbd\xd2\x89\xb6\xe1\x7e\x72\x7e\x9f\x63\x4c\xed\x39\xfa\x05\xf2\x18\xfd\x17\x8c\x19\x59\xcd\xfc\x04\x76\x33\x15\x23\x97\x58\xf3\x2d\x6c\x8e\x14\xab\x4e\x84\x65\x67\x63\x8e\x27\xd5\x68\x5b\x76\xd8\x9c\x4e\x33\x0d\xe7\x58\x38\xec\x9b\x8d\x0a\xcf\x18\xcd\xc8\xca\x7a\x4e\x8e\x1e\x70\xc7\xae\x0d\xcc\x6a\xcf\xc7\x87\x6e\x38\xe8\x35\x06\xb8\xb1\x2f\x56\x27\x46\xea\x2a\x0c\x06\x42\x80\x28\x22\x28\x12\x31\x01\x28\xc0\x20\x12\x01\xa6\x88\x87\x94\x29\x18\x63\x1c\x43\x11\x0b\xae\x08\x8b\x21\xc6\x28\x0e\xa8\x4a\x14\xe4\x08\x26\x91\xe0\x2a\x39\x19\xc8\x48\x7a\x18\x43\x6e\x9a\xca\x30\x66\xe8\x63\x8c\xf9\x39\xcb\x00\x44\x92\x12\x86\x08\x78\x1e\x63\x6e\xa6\x14\xdf\x89\x31\x2f\xe3\x4d\xe3\xcf\xe4\x27\x4f\xcb\x69\x83\xb8\xdb\x68\x6c\x9c\xee\x62\xbc\x5b\x1f\x86\xd3\x21\x8d\xb2\x0d\x60\xb7\x1a\xf6\xc0\xdd\x1e\xc0\x60\x5e\x2b\x1f\xa6\xf3\x31\x69\x6d\x1d\xb1\x50\x5c\x37\x8e\x78\xbb\x2a\xd7\x9d\x71\x15\xf5\x28\x58\x78\x83\xe5\x21\x6a\x38\x51\x30\xa3\xac\xbf\xad\xf7\x97\x66\x52\x5f\xd9\xfa\xd7\x9a\x11\x7e\x0d\x2f\xae\x8c\x0b\xf7\xf2\xeb\x57\x77\xbc\x06\xde\x7f\xa7\xae\xf6\xf5\x9d\x91\x4b\x99\xfe\x43\x78\x75\xfe\xd2\x5b\x1e\x77\x2f\x3f\xbe\xb8\x78\x8d\xcf\xf4\x86\xcf\x79\xdc\x33\xf4\x03\x4d\x35\x9e\xa0\xff\x34\x8f\x7f\xf3\xfc\x0f\xf1\xf8\x3f\x84\x31\xb7\x1c\x42\x8f\xec\xc5\x99\x50\x3a\x77\xe1\xd9\xb3\xb8\x87\xfe\xcf\x10\xb8\x6f\x62\x5a\x29\x87\xc0\x85\x91\x64\x24\x51\x49\x14\x62\xcc\x02\x0c\x12\x04\x15\x22\x20\x49\x92\x28\x48\x38\x8e\xb8\xe2\x54\x08\x10\x47\x30\x94\x12\x73\xaa\x18\x4a\x04\x89\x71\x4c\x25\xa2\x1c\xbc\xe0\xdd\x39\x04\xae\xda\xb5\x6b\x25\x9f\x76\x1a\xf9\x8e\x4d\x7d\xa7\x5b\xa9\xda\x14\xd9\x7a\x89\x36\xf4\x22\xf1\xed\x56\xa7\x52\x2c\xb6\xed\x6e\xa3\x84\xac\x1a\xc9\x15\x50\xb1\x50\xac\x22\xfd\x4e\xbc\x23\x00\x7f\xd8\x39\xe8\x75\xf6\x8c\x77\x14\xe0\x8b\x4e\x95\xdb\x34\x6b\xed\xe1\x7a\x9e\x5f\x85\x9b\x7c\xd7\x07\x38\xb2\xcd\xe5\xaa\x5f\xa4\x3d\x58\xae\x34\x26\xf3\xd5\xa1\x3d\x5b\x66\x72\xf5\x79\xe9\x74\x79\xbe\x86\x77\x6f\xc3\xb2\xef\xb8\x67\x6f\x9b\x45\x9e\x86\xfd\x4a\xdf\xb5\x0d\xad\x9d\xa5\xce\x1c\x19\x13\xab\x55\x13\x24\x9a\x1c\x9a\xd4\xce\xf6\xf6\x53\xd8\x39\xf6\xa2\xca\x72\xd4\x68\xb4\xf8\x2e\x99\x6f\xb0\x3c\xa8\x05\x66\x8d\x5e\xa6\xb7\x42\x87\x79\x7d\xb8\xa3\xfd\xfd\x3e\xae\xb4\x86\x59\xbb\x6d\x96\x06\x73\x65\xd8\xd3\x28\x1e\x60\xa1\x7d\x49\x47\xfa\x52\x08\xdc\x35\xe6\xdc\x89\xf7\x7a\xa7\x97\x37\xd3\xc4\xbc\x27\xe9\x3f\x1b\x02\x97\x22\xe6\x3c\xcb\xf3\x53\xa1\x7f\x6f\x08\xdc\x5f\xaa\x23\xde\xc2\xa4\x47\xe4\x93\x34\x31\xe9\x77\xca\x47\x3f\x83\x14\x2a\x39\x2f\x3b\x62\x53\xdf\xf1\xdb\x6e\xf6\xd8\x47\x61\xb1\x36\x0a\x33\x86\x9d\xb4\x43\x27\x07\x0e\x9b\x7a\xb1\xd8\xdc\xe6\x32\x13\x9e\xe0\xe2\x61\x99\xcc\x4b\x06\xd3\x8f\x61\x69\x6c\xd7\x8c\x49\x3e\x6f\x91\x7d\xa3\x26\xba\x2d\x77\x51\x1a\xef\x2a\x41\x04\x59\x39\xd9\xa5\xaf\x83\xa9\x48\x04\x22\x96\x71\x48\x71\x12\x21\x26\x22\x88\x24\x89\x11\x12\x52\x52\x85\x78\x42\x10\x8a\x24\xe0\x02\x2b\x02\x28\x89\x09\x09\x42\x00\x90\x48\x14\x8c\x02\x04\xc1\x29\x55\x08\x3f\x1d\x02\xc7\x6e\x21\x11\x91\x10\x7f\xd8\x26\xfe\x34\xcb\x2f\xd0\x26\x24\x49\xc1\x8b\x64\xbf\x39\xd6\x5f\xde\xd4\x07\xa4\xff\x8f\x82\x14\x5a\xeb\xc8\xef\x1c\x96\x8c\x1c\xb6\xd9\x65\xa9\xb6\x04\xd9\x6d\x9b\x6c\xfd\xc3\x6c\x9a\xac\x3a\xfb\xf9\x3e\xbf\x1a\xf8\xe5\x7c\xa9\x88\xc3\x09\x1b\x65\x0e\xf3\x81\x96\x3b\x28\xb1\x06\xa5\x0c\x0f\x8f\xfb\x46\xb9\x36\x9c\x0c\x4b\xa5\x2a\xad\x2d\x77\x5c\x8b\xe2\xe9\x58\xe7\x95\xd4\x9a\x0c\x5d\xbf\x01\x77\x7a\x71\x66\xa6\x17\x8c\xaf\x22\x51\xad\x77\x29\xdf\x42\x9f\xf4\xe8\xbf\x3d\xd3\x2f\xd1\xbf\x42\x9f\x27\xc2\xae\x7a\xf5\x68\xd1\xbe\x22\xe4\xbf\x4f\xf1\x73\x8e\xf6\x04\xfd\x8e\x0c\x56\xd6\x13\xf4\x35\xed\xcf\x69\x19\xef\xa2\x4b\xf9\xf1\xbd\xf8\x71\x16\xfe\x55\xb5\x9c\x0f\xda\xfb\x7e\xdb\x59\xfc\xa0\xdf\x99\x3d\x46\xff\x05\x5d\xac\xb2\xd7\xb1\x56\x8b\xcc\xa6\xb2\xcc\xb2\xc3\x90\xc9\x1a\x87\x71\x19\x55\x16\x45\xcc\xad\x55\xa0\xea\xbc\x30\xd1\xf7\x87\x41\x84\xe8\x66\x5e\x5b\x2d\xfc\x9e\xa6\xa6\xb5\x72\xa4\x6f\x37\x48\x88\xd6\xe0\x48\xe8\xec\x30\x18\xc6\x4d\x26\x9c\x5d\xde\x9b\x53\x77\x73\x4c\xbf\xa0\x53\x98\x84\x11\x8d\x25\xa1\x3c\xe2\x90\x87\x2a\x11\x84\x23\x09\x03\xa6\x10\x09\xb9\x8a\x44\x14\x92\x24\xe1\x82\xc4\x2a\x22\x54\xa2\x30\xc6\x20\x02\x02\x12\xa6\x80\x42\x8c\xbc\xa0\xcb\x93\x21\x70\xb7\x52\x7d\x24\x91\x98\x7c\xd8\xc2\xee\x75\xf6\x8c\x2e\x02\x83\x8b\x5d\xef\x71\x74\x79\x1b\x0c\xfc\x0b\xba\xdc\x2b\x67\x7f\xd2\xc2\xce\x87\xcd\x41\x65\x98\x59\x0c\x45\xe6\xe8\x87\xa8\x1d\x32\xd0\xcf\x2c\x3a\xfb\xee\xda\x4a\x1a\xf6\x2e\x04\xa3\x6d\x69\xbd\x6e\x58\x5a\xde\xed\xdb\xce\xb0\x10\x45\x83\xb6\x3b\x9b\xef\x65\xd9\xa8\x3b\xac\xd5\xab\x4d\xca\xe5\xbd\xb5\x75\xe7\x85\x63\x6c\x4f\x83\x5e\x1f\x6f\x5d\xe3\x2f\x40\x97\xf1\xb6\xb3\xcc\x3d\xcb\xdd\x53\xa4\xff\x50\x80\x77\x3a\xe8\xf2\x96\xbb\x3f\xe4\x17\xff\x83\x41\xc5\x9a\xf6\xe7\xf4\x85\xb4\x03\xac\x9f\xe1\xee\x5a\x4a\xe8\x72\x2d\x69\x3c\x80\x2e\xa8\xda\x22\xc3\x42\x76\x31\xcb\xd6\x56\xc8\x96\xe3\x4e\x66\x5d\x48\x16\xe3\x55\x27\xac\x7b\xa0\xbf\xb2\x65\xb1\x7c\x58\x86\xad\xbe\x9b\x03\x85\xfa\x70\x76\xc8\x7b\xfe\xb8\x55\x2a\xa9\xa4\xb1\x03\xcd\xcd\xb8\x60\xd0\xc1\x41\xd4\x43\x50\x6a\x54\x70\x7f\x8e\x66\x85\x88\x83\xf4\x53\x4a\x41\x0c\x91\x60\x84\x87\x28\x94\x98\x0b\x16\xb2\x90\xb3\x18\x0a\x14\xa9\x28\x00\x90\x63\x4e\x39\x60\x2c\x11\x2a\x48\x00\x45\x38\x82\x61\x80\x43\xc2\x93\x88\x25\x1c\x81\xe8\x67\x7b\xd3\x53\x99\x03\xbd\xdd\xcc\xd9\x0d\xd3\x6c\xf1\x52\xd9\x6b\x55\xf2\x95\x86\x97\xd3\xca\x5e\x11\x35\x49\x01\x95\x9c\x9a\xd7\x41\x0d\xda\xac\x97\x4b\x46\xbd\xa0\x79\x06\x6d\x19\x79\xcd\x77\xfe\xf3\xdf\xff\x23\x1c\x11\xc2\x08\x40\xf4\x26\xce\x30\x80\x99\xfc\x10\x67\x7e\xce\x52\x48\xb1\x64\x10\x32\xf2\x1a\x6a\x5d\x69\x77\xfb\xd5\x42\xbf\x94\xb4\x36\xd2\xce\x77\x4b\xc4\x2d\x6f\xa6\xad\x4c\x01\xcc\x8f\x1c\xc1\xf2\x8a\x2c\x5b\x4e\x49\xf3\xf2\xa8\x77\xd4\x5e\x71\xe6\xd4\xa5\xf8\x13\x7b\xda\x79\xf4\xb2\xa5\x6c\x6e\xbc\x94\x96\x93\x9d\xb6\x4d\xbb\x1c\x4d\xf4\xa3\xde\xaf\xf8\xf3\x89\x72\x8f\xfb\x42\xdf\x9a\xb0\x6a\xee\xb8\x3f\x4e\xbd\xb3\xfd\xe8\x4d\x87\x87\x9c\xb5\x97\xb3\xca\x39\x91\x67\xe7\xcb\xbc\xab\xd5\x51\xa3\x52\x8b\x71\xb1\xb6\x9d\xe4\x72\xeb\xdc\x08\x0d\x93\x59\x0f\xd8\x96\x69\xf9\xa3\x72\xd5\x3a\xba\xd5\xc5\xd6\x1f\xf3\x41\x77\xb0\x9e\x38\xd4\x72\x27\xa3\xd2\x78\x9b\xad\x3a\xb4\xab\x82\x4e\x6e\xe1\xa9\x7c\xdf\x71\xe7\x23\xb0\x42\x5e\x23\xe7\xa6\xd6\x89\xfb\xba\x5e\xd1\xbe\x3d\x31\xc1\xc0\x9c\xcb\x06\x07\x7e\x34\x5a\xf6\xb5\x0d\x8b\x9a\x64\xd8\x98\xd6\xb6\x61\x6b\x73\x1c\xac\x5d\x32\xcb\xa9\x24\x30\xce\x65\x5f\x2e\x7e\x9b\x0f\x3a\x3f\x9f\xc6\x0d\x9c\x49\x8f\xfe\xb3\x36\xb4\x2b\xc9\xd7\xb0\x3a\x7e\xb3\x51\x68\x4c\x61\x79\x5b\xef\xa3\xc6\xc6\xd4\xf9\x1c\xd6\x06\xd5\x92\xca\xc8\x75\x83\x3b\x25\x68\x0c\x7a\xaf\x67\x7c\x65\x17\xd1\xdf\x8d\x13\x78\x19\x9f\xf3\xb6\x27\xe8\x17\x50\x6d\xca\x9e\xa0\xaf\xbd\xa1\xaf\x1b\x62\x29\xec\xce\x16\xb4\x78\x26\x6a\xb9\xfe\x1a\xf9\xe5\x4a\xc9\xdc\x0f\x26\xdd\xbd\x51\x33\x07\x66\x27\x9c\x81\x7c\x2d\xef\x44\xc9\xf9\x37\x5f\xbb\xb4\xbc\x5f\xff\xea\x33\xfa\xb7\xb4\x98\x47\xce\xe2\x4c\x48\xff\xa0\x63\xec\xe7\x7b\xf1\xec\x59\xbc\xbd\x0b\xf7\xef\xc5\xff\xaf\xec\x5a\x1d\x68\x66\x34\x1a\x1a\x78\x7d\x68\x72\xda\x73\x43\xb7\x5b\x9d\x61\x56\xa8\xe6\xfa\xf5\x5c\xa7\xa8\x1f\xeb\x0a\x18\xc1\x12\x15\x63\x32\xf1\x97\xdd\xe1\xa6\xde\x2a\xce\xf5\x79\x98\x3d\x36\x37\x1d\xcf\x1e\xf7\x82\x31\xce\x91\xe6\xa8\xd4\xad\x96\xab\x63\xd0\x6b\xa5\xdf\x89\x9b\x71\x06\x60\x80\x54\x80\x20\x0a\x05\x01\x12\x05\x3c\xc2\x8a\x22\x08\x39\x0a\x19\x4f\x48\x28\x71\xc4\x51\xc8\x11\x0b\x00\x53\x94\x00\x09\x79\x84\x82\x50\x60\x05\x83\x1f\xba\x03\x84\x4f\xdb\xc8\xe8\x2d\x74\xe1\xf0\xe3\x1a\x3a\x3f\x27\x5f\xc0\x8a\x60\x9a\x42\x92\xe8\x5b\x6b\xce\x2f\x7c\xe9\x01\x3e\xf7\x51\x92\x68\xbe\x3c\x9a\xb1\x6c\x33\xdc\x82\x6d\x96\xea\x9d\xfc\x68\xb0\xf7\xa6\xe1\x61\xd6\x62\x0b\x97\x1d\xe2\x5d\xd7\x5e\xd4\xf2\x56\xe3\x58\xdd\x57\x92\x4d\x24\x58\xec\xdb\xa3\x2a\x18\x92\xc9\xaa\xa2\x7b\x49\x59\x9b\x6d\xf8\xa0\xe4\xb4\xa7\xa0\xd2\x39\x1c\xc7\xf3\xad\x5f\xd7\x40\x6a\x16\xb2\xeb\xfb\x7f\xa7\x0e\xb1\xe8\xfa\xa5\xd2\x15\x2f\xf9\x80\xa1\x7d\xce\xdb\x53\xa4\xff\x90\x85\xee\x0a\x5b\x9e\xb0\xca\xcc\xc7\xbd\xd9\xec\x59\xab\xcc\x1f\xb4\x0a\x69\xda\x9f\xe3\xe7\xef\x62\x4b\xe9\xf1\xbd\xf8\x71\x16\xf3\xdd\xcd\x87\xfe\xb6\xb3\x78\x7b\x17\xee\xa1\xff\x82\x2d\xf5\x03\x2d\x39\x5b\xf0\xff\xa8\xfb\xb2\x26\x67\x6d\xe5\xef\xfb\x7c\x0a\xd7\xff\x26\x49\xf9\xc9\x31\x08\x10\x90\xd4\x39\x55\x6c\xde\x0d\xb6\xc1\x1e\xe3\xf7\x62\x0a\x84\xb0\xf1\x06\x06\xbc\xcd\xf9\xf2\x6f\x79\x99\x31\xe3\xf1\x8a\x99\x3c\x27\x54\xa5\xe2\x79\x24\xba\x5b\x8d\xd4\x3f\x75\xab\x25\x01\x96\xaf\x17\xf2\xad\xc9\x90\xa9\x44\x5d\x06\x70\xf3\xa2\x36\x1f\x6b\xd1\x2c\x2a\xb5\xe7\xa3\xf5\xba\x13\xbd\x21\xa3\xcc\xce\x5c\x6d\x36\x15\x03\xd9\xa9\xe4\xab\xa1\x2c\x4c\xa8\xcd\xaa\x56\x5f\xd0\xde\x68\xd2\xe7\xe5\x62\x14\x31\x96\x0d\x94\x96\xfa\x0d\xd7\x70\x3b\x36\xe4\xa1\xc5\xf2\xac\xcd\x42\x9e\x64\x21\xb2\x2d\xec\x50\x16\x43\x60\xda\x82\x16\x07\x59\x92\x24\x79\x08\x48\x17\x32\x16\xe5\xf2\x0c\x6d\x51\x36\x72\x49\x82\x40\x2c\x76\x09\xf4\xbe\x07\x67\x97\x13\x50\x62\x80\xf1\x02\x5b\x82\x08\x8d\x92\xda\xd0\x8c\x3a\x05\x4c\xba\x41\x75\x5a\xad\xba\xaa\xaa\xe5\xa6\x52\x36\x85\x8a\xd9\x6e\x42\xbd\x58\x84\x7d\xa1\xdb\x2e\x32\xfd\x96\xf9\xeb\x8f\x1c\xc5\x41\x86\x66\x09\x06\x42\xe6\x47\x0e\x6c\x51\x06\x5c\x02\x12\x8e\xe0\x98\xcb\x3e\xcc\x7b\x29\x0d\x78\x9a\x87\xec\x96\xe4\x87\x8d\xa5\x1c\x23\x86\x82\x90\x9f\xf6\xc3\xb2\xd1\x5b\xbe\x68\x0d\x4a\x57\x8a\xb1\x45\xb0\x9b\xf2\x4a\x2c\x55\x96\x7c\x25\x70\xfb\xe2\x4b\x75\x77\x24\xe1\xfe\xfe\xc0\x1d\x1c\x9c\xe2\xca\x97\x2b\xa6\x1f\xb0\x79\x09\x32\x27\x39\x70\xad\x47\xfb\x69\xa2\x77\xbb\xbd\x61\x82\x92\x08\x5a\x5d\x6f\x77\x04\xa4\x22\xac\x37\x13\x66\xb0\x94\x24\x59\x62\x27\x44\x30\xe7\xed\x82\x18\x3b\x14\xd2\x3a\x1d\x64\xf2\xed\x25\x21\xd4\xd7\xdd\xd1\x62\x42\x2b\x5d\xbd\x4e\x76\x37\x83\x90\x24\xd8\xd2\x48\xf6\x49\x32\x6f\x46\x2b\x67\x3a\x91\x16\x2f\x2e\x5b\xab\xc4\x1d\x02\x0d\x27\xfe\x20\x98\x45\xf4\xe7\xfd\x41\x8d\xc4\xe2\xfc\xf1\xe7\x35\xbf\xef\x32\x8e\x25\x48\xc9\x0e\xa9\x51\xbe\x20\xc3\xfe\x34\x72\x54\xcc\x9b\xf4\x9b\x53\x69\xbd\x90\xa1\xb1\xac\xb8\x82\x62\x7a\x05\xc2\x9b\xf0\xe3\xa2\x39\xd9\xa5\xaa\x1e\xaf\xa4\xbb\xb4\xfd\x31\xf1\xbd\xce\x3c\x62\xc6\xfc\x1f\xf5\x91\x24\xe1\x73\x6e\x5d\x62\xbf\xd3\xc3\xb6\xab\x3f\x89\x86\xcf\xda\xce\x67\x6c\xb7\x3b\xaa\x4d\x9e\xe0\x7f\x8a\x1d\x82\x4a\x75\x58\x3c\x10\x9a\xc1\xd4\x5a\x13\x24\x4b\x8e\x46\x2a\x31\x14\xed\x97\x58\xe3\x86\x9c\xd0\xf6\xea\x05\xbd\xd6\xfb\xe8\xf3\x89\x63\x3e\xa5\xf4\x79\x16\xcf\xf0\xff\xc8\x9f\x4e\xc7\x7f\x57\xf0\x65\x3c\x3c\x3a\xaf\xea\xd1\x9b\x00\x9d\x34\xea\x42\x5b\xcf\x3d\x5f\xc6\x43\x9a\x79\xdd\x13\xfc\x9f\xb6\x07\xc7\xbd\x11\xa9\xc6\xe3\xd3\xf6\x40\x97\x84\x61\x4a\xfe\xe7\xe6\x52\xc9\xfd\x8f\x29\xc6\xc3\x61\x5e\x97\x3e\x97\x25\xc3\xf1\xf8\x08\xff\xf7\x2d\xd1\x28\xc0\x66\x7d\x35\x18\xac\x16\x8c\x53\xb3\x96\x2f\x85\x95\xdd\x73\x28\x79\x52\x2c\x97\x9a\x1d\x9b\x17\x24\xae\x6b\xb2\x01\x16\x8b\x1d\x8f\xef\x22\xbf\xc6\x3b\xda\xda\x5f\x41\xd5\x71\xa7\xf5\x46\xb9\x1f\xb4\xc2\xc9\x2c\xbf\xf1\xea\x5d\xb5\x5c\xe9\x5b\x95\x5a\x9f\xd5\x6e\xef\x59\x03\x8f\xfa\xe9\x10\x01\x0e\x11\x08\x39\x8c\x05\x30\xcd\x12\x00\x5a\x16\xb2\x5c\x0b\x60\xb4\xf5\xd7\x09\xd2\xc5\x8c\x83\x29\x9a\xc7\x2e\xc5\x42\x44\xb8\x9c\xe5\xda\x1c\x4f\x21\xd6\xb6\x19\xc6\x39\x9c\x96\xf1\x9c\x9b\x4e\xdf\x72\xd3\x39\x9e\xbf\x7c\x2f\xd9\x47\xe9\x61\x46\xc6\xb3\x30\x83\xc5\xc6\xd3\x5e\xfe\x65\x30\xa4\x00\xdb\x4b\xa9\x2c\x6d\x19\x36\xba\x2f\x03\x45\xd0\x17\x91\x3b\x0c\x61\xd5\x29\xf2\x35\xaa\xed\x61\xd0\x93\xda\xd5\xda\xa4\xa0\xfa\xb5\x4d\x15\x85\x0e\x39\x2e\x45\xd4\x66\x10\x04\x0c\xb3\x5e\x70\x84\x39\x29\xae\x06\x6a\x57\x09\xfb\x05\xa4\x08\x65\x53\x9b\x13\x50\x5a\xa9\xee\x4c\x01\x91\x94\x99\xa3\x9e\x7e\xb1\x2f\x0a\xad\x5a\x94\x30\xa8\x17\xe2\x7f\x37\x0c\x5a\x76\xfc\x53\x01\x4a\xc2\x51\x7f\x62\x82\xb3\x89\xfd\xf9\xfa\xd9\x09\xce\x4f\x9c\x60\x09\xc2\xcf\x33\xe8\x67\x1d\xf5\x4a\x7a\x5d\x6c\xbf\xc5\x5b\x22\x52\xd1\x78\x50\x17\xcf\x7e\x8b\xd3\xbe\xf0\x08\xff\x03\xb8\x28\xad\xfc\xa8\xd8\xf5\x45\x41\x09\xc3\x32\x6d\xe5\xbd\x5e\xdb\xd5\x63\xc2\x9c\xc5\x93\xd5\x58\xd7\x03\xf7\xcd\x92\x22\xaf\x57\xa3\x9c\xbe\x18\xaa\x9c\x5f\xb3\x30\x46\xf6\x52\x2d\x55\xdb\xa8\x22\x77\xdb\x35\xe0\x52\xa2\x20\x02\x79\x1e\x6b\x83\x48\xee\x31\x6b\x35\xcc\xfe\x4c\x75\xc7\x61\x69\x8c\x31\x60\x2d\x86\xe7\x68\xca\x06\x9c\x45\x30\x96\x43\x70\x96\xed\x42\x06\x5b\x16\xa0\x48\x9b\x75\xb0\x8d\x69\x87\x60\x18\x86\x40\x84\xc5\x5a\x34\xd8\x1d\x21\xc8\x03\xfe\x70\xd0\xdf\xce\x4f\xa7\x61\xb7\x5d\x13\xa5\x7a\x05\xf4\xa0\xdc\xab\xf7\x58\xa1\xa2\x74\xdb\xc5\x7a\x99\xea\x08\x6c\x4f\x54\x28\xb5\xa4\x36\xa1\xc6\xd2\xe5\x16\x53\xef\x95\x1b\x25\xa3\x0b\xaa\xe2\x16\x15\x08\x02\xd2\x2c\x4b\x12\x2c\x75\x0b\x66\x78\x9e\xbd\xb2\x57\x6d\x5b\xca\x6c\x09\xd2\x14\xc3\xb3\x34\xa0\xe1\x47\xc6\xa4\x3c\x9b\xaf\x3b\x8a\x4e\x58\x4b\xda\x21\xa9\xbc\x28\xd6\xd6\xb5\x28\x0f\x85\x02\xaa\xaa\x71\x83\x2c\xcc\x5c\x1a\x97\xbb\x94\xb6\x22\xa0\xf0\x01\x33\x3b\xc3\x94\x80\x95\x63\x8f\xc6\xa7\xeb\x34\x4f\xf8\xd9\x42\xd5\x7b\x49\x4c\x09\x45\xe7\x2d\x52\xb5\x9d\x9f\x2d\x8e\xc6\x8c\x52\x9c\x77\xb9\x92\x57\xe7\xd7\x1d\x08\xb4\x8e\x54\xc3\x3a\xea\xad\x4b\x0d\xa3\x31\xaf\xfa\x32\x1b\x6e\xbc\x92\xcb\x8c\xea\xcd\x7e\xb5\xad\x07\x43\xfb\x45\xa2\xfa\x1b\x54\x56\xf2\x81\xbc\x58\x14\xa0\x52\xd3\xe7\x48\xed\x84\x1e\x23\xf4\xde\x5a\xd3\x46\xbe\x64\xde\x13\x1f\xbe\xcf\xaf\x4e\x54\xd2\x70\x58\x6c\xb5\xeb\xed\x79\x61\x48\xf5\x5c\x5a\x51\x42\x65\xfe\xc6\xfa\x32\xbf\x1a\x03\xe2\xad\x97\x77\x0a\x43\xda\xe9\x21\x56\x36\x3e\x0e\x4e\xf4\xd0\x51\xc7\x17\x9e\x1b\xb0\x93\x1d\xff\x67\xf7\xac\x25\x72\x64\x1e\x36\x35\x61\xab\x58\x7f\xd6\xd4\x3d\x63\x6a\x43\xa0\x4d\x9e\xe0\x7f\x6a\xea\x05\x06\x46\x5d\x51\x89\x4b\x61\xbe\xec\x38\x85\x41\x4b\x8f\xf4\xb0\xb9\x18\x34\x29\xc9\xb0\x0d\xd5\x65\xa8\x7c\x79\x48\x7e\xf4\xf1\x1d\xec\x54\x77\xa3\x41\x4c\xbf\xf6\xfa\x0c\x7f\x03\x11\xcb\x94\xfc\xcf\xc2\x5e\xf9\x39\x5d\xec\x19\x89\xe9\xd7\x3e\x9f\xfc\x16\xfb\xb5\xcf\xc7\xf9\xbf\xef\x0f\x60\xb4\xb6\x68\x4d\x5c\xd1\xf7\x0a\xa8\xab\xc5\xa3\x89\xe0\xcd\xc6\xb3\x22\xd7\x1e\x29\x6f\x35\xcf\x12\xf2\x90\xf3\x87\xb3\xbc\xb9\x79\x03\x7a\xa7\x33\x37\x5f\xc8\x41\x0c\xd0\x4c\x5c\x37\xe7\x2d\x36\x5c\xe6\x87\xd2\x78\x3e\x93\xbb\x35\x7a\xd1\x2a\x72\x44\x75\xd4\x1c\x4e\x3f\xe2\xd3\xde\xd6\x99\xf9\x95\xdc\x5d\xcb\xf5\x0c\xea\x01\x86\x21\x31\x0b\x2d\x0a\x61\x9a\xe3\x48\x9b\xb5\x11\x4b\xb9\x8e\xeb\x70\xbc\x03\x59\xc2\x61\xc8\xdd\xc5\x22\x34\x66\x20\xc9\x40\xc0\x00\x9b\x21\x59\x96\x25\x00\x05\x08\xe0\x60\x76\x8f\x7a\x20\x2b\xd4\xbb\xee\x5c\xd1\xff\x22\xb6\xcf\x85\x1d\x6b\x87\x52\xfa\x88\x7a\x90\x39\x3a\x57\xe9\x51\xef\x34\x1a\x5d\xb4\x4a\xdd\xc8\x2e\x7d\x1c\x52\xf3\x65\xc7\x76\xba\x68\xb5\x64\x4e\x92\x07\xff\x7c\x58\x68\x51\xd0\x41\xbe\x61\x35\x05\x96\x17\x46\x32\x21\xb2\xf3\xd1\x84\x98\x2b\x6f\x84\x0a\xa5\xb1\x3c\xf5\x75\x7a\x3c\x98\xf5\x46\x7d\xd7\x5e\x3a\x88\xaf\x8c\xe7\xea\x94\xd0\xf3\xcb\x9a\xa8\x0e\xba\x1c\x11\xe8\xae\xb7\x36\x49\x9a\xad\xe7\x47\x4b\xbd\x30\xb0\x66\xfe\x72\x6e\xd7\xbd\x6d\x47\xfa\x5f\x40\xbf\x0e\xa5\xd6\xb9\xa3\xae\xd3\x45\x91\xb2\xe3\x9f\xea\x84\x8f\x04\xfa\xfd\x44\xf4\x79\x1a\xfd\x22\xd4\x2b\xfc\x4c\xf4\x3b\x41\x9f\x54\x97\x7b\x3e\xc3\x5f\x07\x61\x37\x25\xff\x5b\x4e\xdf\xdf\x89\x3e\x99\xe8\xe2\x23\xa2\x98\x1a\xfd\xbe\xcb\x68\xed\xd0\x2f\xc6\xeb\x78\xfb\xff\x21\x9e\x4c\xfc\x27\x11\x90\xb2\x29\x88\x91\x6b\x23\x04\x2c\xc7\x26\x90\xeb\xba\x04\x67\x61\x0e\x92\x3c\xef\x42\x1a\x93\x80\xe7\x68\x97\xe0\x68\xdb\x26\x28\x1b\xf3\xb6\x0d\x68\x1e\x92\xa4\xe3\x72\x80\x02\xc0\xde\x23\x20\x95\x15\x02\x5e\xcf\x02\xda\x61\x1c\x20\x2f\xec\x94\x4b\x94\xee\x11\x90\x21\xe0\x71\x7d\x36\x3d\x02\x26\x42\x61\x0d\x51\x68\x29\x77\xfe\x27\xfc\x0d\x7e\xa1\x2c\xf1\xc3\x46\xdc\x30\xfb\x70\x68\xaf\x49\x4f\x70\x7a\xb3\x41\x1b\x49\x66\x6b\xea\x72\x78\x41\xbf\x21\x91\xd7\xeb\x65\xc0\xf3\x5c\xdc\x35\x91\x05\x5b\xa6\x37\x60\xe4\x68\xb0\x01\xbe\xd4\x90\xc9\x2a\x3b\x1e\x56\xea\xfc\xe8\xad\xd0\x7d\x19\xa1\xe6\x70\x69\x74\x97\x12\x77\xcf\xf9\x8c\xdf\x8f\x8c\xf1\x9c\x4c\xf8\x65\xa9\x90\x29\x43\xfe\xa9\xc2\xa1\x19\x21\xe3\x93\xc8\xf4\x34\x32\xc6\xd2\xb0\xff\x33\x91\xf1\x04\x99\x9e\x6d\xff\xe3\xfc\x5b\x43\x36\x25\xff\xef\x40\xc6\xb4\xc8\x94\x89\x2e\x3e\xae\x98\x4c\x8d\x8c\xab\xa5\x69\xd4\x8d\x52\x09\xfb\x2f\x9c\x63\x0e\xca\x5d\x86\x56\x7a\xc2\x54\xa9\xce\x0a\xe5\x70\xd1\xa0\x04\xb7\xe3\xad\xf9\xa5\xeb\xd6\xbb\x2f\xe5\xd2\x62\x5c\xaa\xf8\x5a\x8b\xad\x34\xe2\xb9\x30\x12\x78\x1d\x33\x15\x5d\x2a\x98\x5c\x81\xec\xfa\x94\x4c\xdb\x04\x69\xaf\x96\x1f\x6b\x6d\x43\x2b\x1a\xee\x34\x7e\xb7\x95\x56\xfe\xfd\x24\x80\x62\x92\xe6\x38\x06\xd9\x10\x5a\x2e\xe3\xb2\x2e\x83\x79\x9e\xb4\x09\x92\xc6\x18\xd1\x2c\x83\x20\x89\x10\x47\x91\x80\x07\xc8\x65\x18\x00\x91\xe3\x10\xc8\xb1\x48\x9a\xa1\x08\x82\xa3\x0e\x2e\x24\x9d\x15\x80\x5e\xdf\x6a\xbe\x83\x48\x9a\xbc\xb0\x19\x30\x51\x7a\x00\x50\x9a\x3d\x26\xd2\xa6\x07\xd0\x24\x0a\x4a\xc2\xa0\x72\xe7\x7f\xa7\xaf\x0a\xdf\x11\x58\xd5\xdc\x39\xdf\x6c\x71\x4a\x09\x05\xa3\xf6\x8b\x62\xcd\x4b\xeb\xe5\x50\x1c\xe9\xdd\xc5\x18\xd6\x18\x01\x84\xf1\xb0\x6e\x96\x67\x53\xa1\x37\x6d\x91\xd5\x51\x55\xa6\x14\xc7\x19\x79\x8a\x4e\xd9\xcd\x7e\xa7\xc8\x60\xb7\xd4\x5a\xb6\x47\xbe\x52\x1b\x78\x22\x70\x3a\x94\x0b\x56\xf7\x6c\xea\xf8\x7e\x00\x1d\x57\x70\xc2\xb5\x4b\xb7\x9e\x97\x1d\xff\x54\xeb\x79\x19\x01\xe8\x93\x00\xf6\x3c\x80\x3e\xb7\x86\xf5\x3c\x80\x7e\x06\xb0\x54\xeb\x99\xcf\xf0\x6f\xcf\xcd\x61\x4a\xfe\xdf\x01\xa0\x69\x01\x2c\x13\x5d\x9c\x04\xb9\x1f\xe1\x7f\x00\x50\x63\x06\x97\x06\xd1\x14\xc5\x59\xcd\x24\xba\xc3\xd2\x7c\x18\xd9\x74\xcb\x24\x26\x76\xa0\x79\x8b\x96\x3a\x67\x4d\x1d\x88\x0c\x33\x28\x32\x63\x55\x37\x37\x2d\x7e\x5d\xee\x99\xf4\x50\x89\xc1\x1b\xe8\x8a\xb8\x37\x5b\x8f\xeb\x84\x09\x45\xc9\xaf\x0c\x9c\x59\x57\xa5\xf8\xe8\x63\x53\x49\x88\xe3\x45\x38\xdb\xe9\xfc\x6e\x3b\x5d\x79\x16\x42\x09\xd7\xe6\x11\xc0\x80\xe0\x69\x08\x00\xb0\x01\x85\x49\x87\x74\x20\x24\x1c\xcc\x3b\x2c\xcd\xb0\x10\xd1\x24\x72\x1d\xde\xde\x7a\xa5\xbc\xc3\x40\xc6\x22\x48\x0a\x91\xd8\xe5\x78\x64\x1d\xf6\xc0\x3f\x97\xd8\x72\x7d\xc5\x91\xfe\x17\x41\x92\x90\xbb\x70\x61\x66\xa2\xf4\x80\xc4\x0c\x09\x33\xb8\x48\xe6\xd4\x68\x7f\x89\x0f\xa6\x58\xed\xba\xb4\x8b\x9e\x8b\x2b\xc5\x8d\x3f\xe0\x35\x2c\xcd\x3d\x4b\x54\xdd\x75\xd1\x11\x26\x33\xac\x9a\x86\x3b\xf2\xd5\x4e\xa3\xe6\xc1\x62\x55\x32\x19\x71\x8e\xa7\x33\x59\x5c\x97\xfc\x35\x35\xaa\xe9\x85\xf5\x9a\x7e\x0b\xd6\x82\xe1\x2b\xc5\x80\x32\x41\x23\xaf\xb6\xab\x95\x0e\x3d\x28\x94\x89\x6a\x56\x89\x2d\x62\xfa\x1d\x20\x8b\x02\xb1\x02\xe4\xf1\xf5\x74\x31\xce\xec\xf8\xa7\x02\xe2\x44\x62\xcb\x13\x2b\x8c\x6c\xc1\x90\xed\x67\x81\xf0\x27\xae\x70\x0a\xc2\xcf\x5b\x55\x3b\x0b\x44\x4a\x7a\x5d\x6c\xbf\x05\xa2\x8f\xef\xa7\x8a\xf7\x66\xd8\x17\x1e\x8f\xf7\xfe\xb7\x50\xd7\x45\x34\xaf\x34\x8d\xd9\x60\xee\x4f\x07\x46\x8f\x6b\xf7\x5a\xd5\x3e\x35\x7a\x51\x28\x1a\xca\x5d\x59\xf2\x17\x43\xbd\x35\xd5\x5a\xd6\x2c\x08\x56\x2b\xd4\x9e\x37\x1c\x7a\x33\x5e\x72\x08\x37\x20\x6a\x29\x50\x14\x2d\x07\xa8\xa3\xe6\xa8\xa3\xeb\x45\xad\xd2\x5c\xf3\xdf\x70\x09\x26\x4f\x70\x0c\x26\x29\xd7\xc6\xbc\xcb\xd1\x98\x60\x31\x05\x08\x8b\x70\x68\x9a\x61\x28\xe8\x60\xd2\x72\x11\x40\xae\xc3\x21\x16\xd3\x24\x07\x21\xc7\x72\x04\x8b\x1d\x07\xd8\x34\xb7\x4b\x56\x7c\xbf\x03\x53\xee\x15\x85\x52\x55\xd2\xa5\x0a\x2d\xd5\x80\x59\xae\x41\xb3\x5d\x17\xa0\x51\x53\x7a\xc5\x76\x8f\x15\x1b\xa5\x6e\xa3\xa5\x89\x8d\x7a\x45\xe9\x54\xdb\x55\xc6\x6c\xa9\xf5\x46\x45\xdc\x5d\xed\x4c\xb2\x3c\x07\x79\x92\xbb\x7e\x1b\x26\xfd\x2f\x02\x90\x3c\xbc\x0c\x33\xef\xa5\x80\x61\x21\xcf\x11\x2c\xc7\x7e\xf8\x67\x1a\xd3\x2a\xe9\xb5\xd6\x18\x29\xe1\x8b\x3c\xe7\xbd\xda\x0a\x4f\xfd\xc9\x66\xbd\xe4\xea\x72\xb7\x2f\xae\x5e\xea\x2d\xdd\x33\x03\xd6\x93\xbb\xc2\x07\xcc\x9c\xcd\x20\x4f\xc0\x4c\xe7\x5c\x57\x38\x5d\xf2\xbb\x60\x52\x4f\x1e\x6f\xb6\xa8\xa8\x9d\xdd\xeb\x74\xb3\x2d\x60\x02\xcf\x0a\x04\xd3\x2f\x83\x09\x96\xb0\xa1\x45\x6b\xdb\x20\x50\x67\x41\xad\x06\x1d\xef\xa5\x83\x16\xf2\x98\xde\x58\x5c\xa9\x30\xa8\xf0\xc4\x70\xd2\x85\xc1\x9b\x66\x6e\x04\x11\xf6\x63\xc6\x55\xd9\xa0\x1d\x36\xdb\xf5\x42\x6c\x4c\x66\xa3\x41\x47\x18\x59\xe2\x72\xa5\xae\x3b\x68\x47\xbf\x38\x75\x4a\x6d\x58\xed\x2f\xc6\xb5\x6a\x47\xa2\xba\x21\x30\x95\x6a\x01\xd0\x25\x2a\xc6\xd1\xdc\x58\xd2\xa8\xcb\x74\x90\xe0\xbf\xb5\x87\x3a\xc8\xaf\x88\xa6\xd9\xed\xce\x31\xdb\x32\xa6\x5a\x43\xd5\x4b\xbd\x82\x44\xd5\xd7\x4d\x32\xd6\x97\x41\xcf\xe9\x14\xb4\xa1\x19\x69\xf2\xea\xae\x25\xc3\xe4\x06\xc3\xcb\x70\x96\x70\x46\xd9\x89\xd0\xaf\x04\x52\x7b\xa5\xc7\xa6\x16\x82\x4a\x28\x42\xcb\xeb\xd5\x4b\x85\x55\xa4\x76\xc7\x65\xd1\x8c\xc5\x5a\xf5\x43\x77\xc9\x84\x95\x63\x22\xff\xd7\x61\xaa\x6c\xe7\x65\xc7\x6f\xd5\xec\x37\x67\x9d\x4d\xbd\x9f\xd7\xcc\xea\x68\x38\x63\xca\xe3\x31\x4d\x75\x16\x2f\x30\xd4\x16\x78\xda\x6f\x16\x5b\x13\x47\x9b\x71\x32\xea\x96\xcf\xd2\xdb\xfd\x9d\x38\x52\xeb\xc1\xbe\x26\x4c\x5a\x75\x7a\x76\xec\x30\xe2\xf1\x67\xf2\x11\x77\xf3\xc9\x63\xd3\x80\xc1\x90\x0d\x0f\xb8\xa3\xa9\x64\xd2\xfd\x7c\x9b\xa9\x6a\x2a\x59\x9f\x2c\xe6\x6f\xe1\x2c\x98\x1a\xeb\x4e\xb5\x67\x04\x05\x81\x2a\xb6\x2f\x1f\xea\xbf\xa7\xb7\xfa\xc7\xca\x9f\x38\xf4\x47\x5e\x74\xc4\xb1\x37\xae\x96\xc5\x1a\x39\x80\x4b\xd3\x8b\xca\xc1\xbc\x8a\x22\xbb\x20\xad\xc8\x97\x16\x2a\x7a\x84\xe2\x4f\x6b\x98\x1e\x90\x3b\xfe\x09\x5f\xe3\x28\xd4\xd7\x25\xe6\x93\x58\x0b\x3f\xce\x3b\x46\x25\x9e\xd1\xcc\x60\xaa\x95\xdc\x31\xd6\x8d\x91\xa3\x33\xf6\x3c\x82\x0c\xec\x8f\xb9\xae\xd4\x25\xa0\xfb\x3e\xd6\x2e\xc4\x31\x8e\x10\x59\x7c\x4e\xfe\x83\xaf\x26\x7c\xd0\x3b\x73\xa0\x68\x66\xf2\x7f\xfc\xfd\x4f\x1a\x9f\x3b\x28\xfe\x16\x83\x3a\xf8\xf7\xbf\x7f\x7c\x97\x25\xcd\x16\xe3\x31\xef\x90\x16\x45\x10\x84\x85\x2d\x0a\xb2\x34\x45\xd2\xc0\x05\xd8\xc1\x24\x01\x1d\x0a\xd9\x14\x8b\x28\x87\xc5\x1c\xc7\x10\x1c\xa6\x5c\x40\xda\x34\x0f\x29\x96\xb0\x19\x0e\x52\x1c\xc3\x1d\x8e\x1f\xc8\x0a\xe3\x6f\x2e\x62\x5e\xbe\x67\xe1\x58\x08\x48\x9a\xa5\x39\x9a\x60\x58\xf8\x3c\xc2\x5f\xd9\x2e\x79\x17\xc2\x5f\x48\x4c\x39\x79\xf4\x23\xc2\xeb\x6f\x84\x10\xf7\xb1\xfa\xd6\xd3\x7b\xe3\x51\x73\x5c\xab\xba\x9a\xc2\x59\x1d\x43\x58\x34\xdb\x30\x58\x37\x1a\x76\x91\xa2\xd8\xd5\x5a\xa1\x56\x6f\x9a\x21\x5b\x5d\x24\xb7\x80\xca\x34\x29\x85\x6f\xd4\x50\xde\xb5\xed\xe2\xb0\xcf\xd7\xf2\x04\x9b\xaf\x12\xab\x46\x69\x12\xb7\xc5\xfb\xae\x59\xb8\x0f\x81\x13\xaf\xa6\x19\xe1\xe4\x09\xd3\xaf\xcf\x0d\x87\x32\x3b\xfe\xe9\x8e\xcb\xf9\x16\x0b\x9d\x2a\x65\xf3\x27\xf1\xbf\xe5\xd0\xa5\x91\xa5\x95\x50\xf0\x85\xe7\x5b\x75\xa1\x5d\xcb\x22\xbb\xa9\x8b\xff\x7e\xd7\xa0\xcd\xd6\xd8\xf3\x3c\x63\xf3\x00\xf2\x2e\xef\xf2\x88\x46\x24\xb6\x10\x66\x19\x86\x20\x49\x8e\x63\x21\x74\x20\xe6\x2c\x4c\x13\x88\xa1\x49\x8a\x04\x04\x47\x92\x16\x43\xd0\x14\x0b\x39\x0a\xd9\xec\xee\xea\x36\xe6\x90\xb3\x99\x85\xb1\xbf\xb9\xe0\x46\x41\x86\xbf\x9c\xb3\xf9\x5e\x7a\x30\xf7\x34\xcc\xc2\xa1\xbb\x72\x73\xdb\x2d\x73\x7f\xab\xeb\x3c\x31\xa9\x4d\xc0\x83\x1c\x8c\x1b\x0d\xc4\x8e\xc7\x63\x73\x24\xfb\xcd\x95\xdb\x99\x68\x0a\x1f\xd7\xcd\xe5\x4b\xb9\x52\x98\xe6\x45\x11\x17\x06\x52\x4d\x25\x51\x77\xa9\x14\xc9\x8e\xd8\xc5\x92\xb4\x28\x89\xc6\x68\x11\x6e\x68\x63\xee\xaf\x83\x49\x6d\x42\xab\xfd\x72\x55\x37\x98\x82\x16\x86\x74\xef\xce\x5b\x78\xfe\x6e\x78\x48\xb7\xa3\x20\x3b\xfe\xcf\xde\xda\x96\xa1\x79\x4e\x15\xe3\xca\x9a\xff\x95\x1b\x09\xfe\x17\x1d\xa0\xb4\x26\x3d\x2b\xfd\x1d\xb2\x4d\x1e\xe6\x7f\x80\x94\xef\x1a\xe8\x19\x9f\x52\xc3\x72\x0e\xb2\x78\x00\x69\x86\x61\x58\xde\xa6\x2d\x9a\x22\x08\xde\x75\x31\xc5\x58\x04\x00\xbc\x05\x1d\x8b\xb6\xb1\x43\x01\x87\x42\x3c\xcf\x3b\xac\x45\x40\xcb\x01\x10\x12\x8c\xb5\xdb\x69\xc6\x1c\x92\x20\xb3\x80\x94\xeb\x07\x6d\xee\x40\x83\x87\x97\x93\x20\xdf\x4b\x0f\x90\xc2\xb1\xc7\xa5\xa8\xf4\x90\x72\x65\x29\xea\x2e\x48\x49\x98\x95\x44\x5c\xe6\x68\x76\x4f\x1f\xf1\xa3\x1b\x2a\xf2\x60\xd2\x6e\x6f\xa6\x71\x7d\xb4\xca\x57\xa6\xd3\xd2\xca\xf0\x44\xa3\xa6\xb0\x3d\x36\x0f\xa4\xcd\x6a\x52\x5e\x71\x73\xec\xe4\x63\x06\x10\xba\x2d\x0c\x06\x68\x6e\xfb\x1b\xa6\xd6\xab\x5a\x4a\x93\x21\x0b\xab\xb6\xde\x58\xc7\xfd\xce\x40\xd6\x8a\xae\x25\xcf\x78\xd9\x25\x68\x45\xf8\x1f\x84\x0a\xe9\x84\xff\xe1\x51\x3e\xeb\x30\x93\x58\x5e\xe2\x9b\xa5\x89\x85\xc5\x89\xb8\xf1\xf9\xcd\x52\xe2\x67\x7e\x59\xc7\xf2\xfe\x91\xf2\xff\x93\x62\x61\xdf\x00\x65\x69\xa1\xe4\x3b\xf4\xf7\x08\xff\x03\x94\xd1\xd5\x4e\x07\x05\xa1\x4e\x73\x4d\xaf\x1a\x0c\x23\x85\x1e\x74\x36\x43\x8d\xcc\x17\xe2\x41\x14\x55\xdb\x5c\xb3\x36\x9b\xb9\x21\x76\x62\x65\xba\xaa\x54\xca\xb5\x29\x6c\x2c\xf4\xc9\xe6\x65\x28\xe7\x1d\x97\x53\x3a\xa3\x86\xfd\xd2\xad\x08\x6f\xc3\x1e\x18\x30\x85\x16\xc5\x6b\xa2\x90\x39\x94\x41\x88\x01\xeb\xda\x80\xe3\x58\x02\xd9\x0c\x60\x20\xb6\x78\xc0\x42\xda\x46\x36\x00\xc0\x72\x6c\xdb\xb2\x18\x17\x23\xe0\x70\xbc\x05\x81\xc5\x5b\x16\x87\x78\xc4\x61\x80\x31\x8f\xf9\xc3\x11\x1f\xcf\xe5\x52\x80\x5b\x00\xc6\x00\xfe\x8a\x4f\xb4\x2d\xa5\x3f\x10\x91\xa5\x00\x97\xc1\x21\x21\x57\x7c\xa2\xfd\x93\xc2\x78\x5f\xc8\xa5\x90\x84\x4e\xa0\xe5\x87\x6b\x6f\x60\x15\xcc\x41\x3b\xea\x52\x61\x31\x10\xab\x1b\x67\xa0\x6d\x66\x84\xd1\xac\x4c\xab\x92\xd5\x92\x1a\xde\x78\xec\x95\xf2\x91\xda\x0b\x5b\x62\x64\xf6\x46\xd5\x70\xa2\x79\xa5\x51\x29\xea\x50\xe1\x98\x5e\x2c\x4b\x13\x8e\x11\x42\xcf\x94\xf9\xa6\x6a\x96\x33\xcb\xa5\x48\x54\x7a\x30\x97\x61\xdd\x21\x07\xb6\x76\x45\x87\xfb\xe7\x9e\xa4\xbe\x4c\xf8\xa7\xf3\x6d\x8e\xb9\x14\xe9\xd7\xef\xc3\xa2\xf1\x22\x46\xcf\xae\xdf\xff\xc4\xfc\x01\x41\xf8\x79\xe1\xae\xb3\xa1\x37\x39\xb5\x2e\x76\xdf\x62\x71\xfb\xec\x98\xef\xfa\x16\x5f\xfa\xc2\xe3\x61\xc8\xff\x0e\x8a\x35\x63\xe9\x23\xd3\x2f\x2d\x41\x45\xb1\x8b\x0e\x5c\x5b\x2d\x1d\xcd\x4c\x39\x0a\x78\xe5\x6d\x53\xf5\x5a\xd3\xb1\x30\xaa\x04\xd5\xca\x70\x19\xca\x5d\x48\x08\x76\xa9\x48\x6f\x2c\xc6\xf0\x87\xfe\x3a\x2c\xaa\x90\xd1\xea\xe1\x3a\x70\xb5\x56\x8d\x9e\x0a\x05\xe3\xed\x45\xcc\x7c\x9d\x85\x86\x0c\xeb\xb2\x96\x0d\x5c\x87\x03\x16\x06\x04\xe5\x12\xb4\x03\x08\x1e\x43\xcb\xc1\x88\xc0\xd0\x46\xb4\x4b\xf0\x1c\x65\xd3\x2e\xa2\x5c\x0b\xb2\x3c\x07\x08\xec\xd0\x2c\x06\xbc\xc3\x1e\xd2\xec\x9e\x03\x17\xf2\x16\xb8\x40\x86\xe2\x2e\x2f\xaf\xbc\x97\x92\x80\xe3\x68\x9e\x60\x78\x2e\x83\xcb\xd4\xc4\xcf\x1f\x58\xdc\x03\x43\x91\xae\x13\xcb\x2b\x1d\x40\x82\x2a\xeb\x57\x51\xd5\xeb\xbc\x19\x2f\x6d\xb9\xce\x73\xe2\x88\x72\xbb\x61\xb5\x23\x92\xfc\xaa\xb8\x94\xde\x94\xf2\x90\x9b\xcd\x0a\x95\xbd\xcd\x9b\xb4\xea\x4c\xf2\xfd\xee\xfb\x26\x6a\x51\xe0\xa4\xcd\xe8\x4d\xe9\xf5\xba\x46\x63\x35\xeb\x1b\x82\x5d\x76\xab\x78\x0e\xca\x52\xf1\x4d\x78\x19\x77\x78\xce\x89\x40\xbf\x57\x9c\x8f\x7a\x6d\x5a\xf1\x54\xc2\x94\x75\xc1\x2e\x04\xd5\x55\x0f\x11\xc6\xa8\x61\x15\x0a\xba\xd7\xe3\xa8\xce\xb2\x53\xd4\xe7\x75\x8b\x1b\x6a\xbd\x8a\x74\xdf\x26\xe9\x4f\xbd\xf9\x12\xe8\x08\xe9\x13\xe8\xde\x02\xd0\x2c\xcc\xce\xb2\x4b\x3e\xf7\x18\xfd\x4c\xf8\x3f\x7b\x3d\xc1\x13\x86\x4e\x9b\x99\x85\xfc\xb3\x86\xee\x27\x1a\x5a\xe1\x84\xbf\xb0\x18\x61\x28\xf5\x24\x73\xd2\x20\xc8\x71\x6b\x53\x70\x05\x93\xa7\x48\x6b\xd3\x15\x1c\x17\x89\xf6\x2a\x5a\x8b\xb4\x5b\x65\x0a\x1b\xf9\x24\x81\x4f\xc8\x26\x81\x4f\x4c\xaf\x0b\x6d\xd6\xbf\xda\xcc\x5b\xba\x78\xf6\x5b\x9c\xf6\x85\xc7\x75\xf1\xdf\xef\x32\x1a\x5f\x41\xe7\xd7\xff\xb7\x35\xd9\x24\xc3\xb2\x1c\x45\x01\x82\xf8\xfd\xd7\xcf\x10\xf4\xcb\x2f\x7f\xfc\xf1\xcb\x1f\x7f\xe4\x54\x6b\x8a\xff\xcc\x59\x51\x84\xe3\xd7\x28\xb6\xe2\x28\xf9\xfb\x35\x18\xe3\xcd\x5f\x39\x63\x13\xe0\x3f\x73\x92\xa6\xea\x46\x5b\xa8\xa8\xc6\x5f\x39\x1d\x0d\xf1\xd4\xfa\x33\x17\x2c\xec\x89\x87\xfe\xca\x69\xab\x19\x0e\xff\xcc\x6d\x29\xfe\xf2\x8b\x50\x37\x94\x76\xce\x10\xc4\xba\x92\xd3\xd4\xba\x99\xa4\xf8\x4b\x2e\x97\xcb\x09\xb2\x9c\xa0\xf6\x85\x61\xae\xd9\xae\x34\x84\xb6\x99\xab\x29\x66\xee\x37\xcf\xf9\x22\xed\xc0\x0f\x83\xd7\xa9\x37\x08\xad\x3d\x5a\x9e\xfc\x9d\x91\xd4\x27\x54\xcf\x49\x7e\x8e\xf1\x4d\xe9\xdf\x01\x7f\xd7\xec\xe8\xe4\xcf\xfd\xff\x5e\x91\xef\xe0\xc3\xcf\x78\x13\xbc\xff\xf4\xa2\x68\x81\xc3\xd7\x4c\x5a\xf7\x99\xed\xb9\xc6\xa5\x12\x2c\xd7\x51\x2b\xad\x8e\x92\xfb\xed\x58\xfd\x47\xee\x58\xff\xfd\xf7\xfe\x85\x07\x55\x93\xcd\x67\x7d\xb8\xe1\x0f\x7d\x54\x3f\xc0\xfb\xce\xf0\x1a\x58\x61\xec\x21\x2f\xb0\x66\x89\x96\x9c\x2f\xce\xb8\x65\xe7\x99\x5c\x6b\xe9\x15\xb1\xee\x6e\x79\x62\xfe\x7a\xbe\xed\x97\x2a\x64\xdc\xfa\x4b\x6c\xae\xb5\xff\xaa\x68\x37\x35\xb0\xef\xd2\xf6\x66\xd7\xdb\xdf\x1b\x52\x51\x65\xa5\x77\xa3\x0d\x52\x5b\x11\x0c\x65\x5f\xf5\x33\x95\x9c\xa6\x9e\x0e\x86\x8e\x5e\x51\x4b\x39\x3b\x0e\x31\x4e\x8e\xae\xcb\xd2\xec\xc7\xd8\xf3\xf2\xec\xe9\xdc\x27\xd1\x85\x71\x6d\x6f\x5e\x2d\x84\xfc\xc5\x2c\x4e\x2d\xce\x91\x44\x52\x92\x4f\x4e\xd3\x67\x79\xf6\x95\x7f\xe4\x0e\x3f\x5e\x23\x3c\x5f\xe0\x19\xfa\xaa\x30\x7b\xf3\xea\x62\xfc\x98\x80\x81\x1f\xc5\x83\x10\x47\x67\xe5\x4c\x50\xbb\x4f\xd6\xc4\x0b\xbf\xe7\x5e\xca\x4a\x5b\xc9\x25\x69\x54\xf4\x9c\xaa\x19\x3b\x5c\xff\xeb\x8b\xe8\x43\x2b\x1a\x66\x20\xf3\x96\xcc\x7d\xc2\x26\xc7\xca\xf6\xad\x73\xfa\xf4\x66\x33\x1c\x66\x25\xda\x91\xd8\x7d\x02\xee\xeb\x7f\x11\xf3\xa0\xd8\xf3\xa5\xd7\x75\x3c\xc1\xce\xe0\x89\x91\xf4\x41\xe1\x3e\xf9\xf7\x75\x3f\xfa\xeb\x8f\x9c\x15\x04\x13\x0f\xed\xed\xb3\x1f\x3a\x17\x70\xf3\x15\x6f\x07\xeb\xae\x3c\x85\xa4\x07\xd8\xde\x0b\x7c\x42\x2e\x29\x36\x76\x5d\x8c\x4e\xc7\xfe\x57\x18\xf1\x9c\x1f\xb9\xff\xdb\xbd\xfc\x7f\x97\x84\xf5\x9c\x8c\xc4\xf4\x9c\xbb\x05\x7c\xb7\x05\x5b\xf1\x52\x08\xed\x07\xaf\x41\x56\x72\x1f\x68\x25\x45\xbf\x30\x77\x48\xd5\x92\xf3\x0d\x88\xd7\xd9\x35\xe0\x40\xeb\x42\x9f\x4e\xd9\x84\x24\x85\x73\x8d\xf0\x83\x6d\xaf\x1c\xfa\xa9\xda\x70\x10\xfe\x48\x23\xad\xf2\xaf\x2b\x3a\x3a\x8c\xf6\x1d\x76\x3e\xaf\xeb\xcf\xe4\x92\x22\xef\xff\xfd\xd4\xfa\x9d\x95\x28\xa9\xd7\xac\xc4\xfa\x42\xf3\x4e\xf3\x7c\x46\xc0\x78\xff\x49\xe2\x67\x3e\xeb\x91\x46\xfa\x2e\x79\xab\xfb\xc5\xa1\xb3\x65\x62\x5b\xd1\x83\xf3\x85\xb3\x02\x7f\x25\x76\x22\xb9\x83\x4f\xe4\x4c\xd6\xbd\x29\xa0\xef\xba\x4f\x80\xd6\x57\x52\x77\x09\xb7\xab\x79\x4d\xb4\x9d\xec\x38\xcc\x4c\x7d\x27\xf4\x6e\x09\x79\x52\xfd\x1e\x49\xb3\xd1\xe3\x27\x6a\xf7\x4a\x79\x53\x9b\xd9\xc8\x76\x97\x4c\xd7\x65\x79\x97\x78\xe2\xfb\xe3\x45\xf0\x9c\x44\x9f\x69\xdd\xfd\x45\xf7\x0e\xc8\x05\xf9\x02\xcb\x0b\x5f\x63\x6f\x8a\x33\x91\xf0\x94\xda\x7d\xe3\xf6\x20\xe0\x8f\xdc\xa9\xc8\x3f\x72\x07\x13\x8f\x26\x7e\x84\x9d\x57\x2b\xbe\xd0\x88\x0c\xec\xf6\x81\xce\x2d\x89\x1f\x9c\x1d\x6d\xa9\x66\xa6\xdd\x07\x14\x7b\x53\x6f\xde\xcc\xc1\xeb\xd7\x93\x29\x47\xf4\xea\xcf\x5e\x2d\xc7\x09\x71\x14\x3d\xab\xd0\x9b\x0c\x3e\x39\xce\x87\xe2\x13\x57\x75\x5f\xf1\x01\xd9\x9f\xef\x07\xd7\x68\xdf\x96\xf8\xcc\x28\xfb\x4c\xf0\x30\x0b\xdf\xd2\x8b\x37\x41\xfa\xa0\xc8\x55\xaa\x37\xa7\xfd\xdb\x4a\x37\x04\x3d\xcc\xa1\xb6\x24\x3f\x3a\x51\x46\xd2\x9e\x23\x7d\x73\xfa\x76\x6f\x4f\x4e\x10\xcf\xba\x33\x7c\x22\x9d\x66\xbe\x79\x99\xdc\x34\xf0\xc3\xad\xe1\x5b\xe2\x30\xf2\xfc\x59\xf6\x8a\x3e\xe5\x70\x5b\xfc\x93\x17\xee\x6f\xcc\xc1\xf4\xdc\x1f\xe4\x48\xa1\xff\x04\x8f\x9b\x2d\x49\xd4\xbd\xbf\x11\x41\x88\x97\x9e\xbf\x88\xfe\x96\xd6\x9c\x63\x76\xb3\x59\xe7\x5e\xba\xbf\x7d\xef\x41\x94\x6f\x6b\xd3\x3b\x83\x9b\xed\xb8\x18\x7e\xfc\x4c\xfa\x03\x6f\xbf\x65\x68\x9f\x52\x3f\xeb\x00\x3f\x3a\xc0\x3f\x13\xfd\xec\x42\x65\x34\xc2\xaf\xb1\xb8\xa7\x0d\x37\xfc\xba\xab\xcc\xb2\x83\xaf\xaf\x84\xef\x92\xfd\x36\x88\x25\x9d\xed\xef\xe8\x36\x5f\xe9\xa7\x76\xf5\x77\x93\xb8\x0f\x20\x7f\x8f\x30\xbe\xda\xbe\x3f\x4e\xad\xe5\x2b\x34\x6f\x4e\x11\x7e\xfb\xcd\xc1\xb1\xe5\x4d\xa2\xdc\x1f\xff\xf9\x4f\xee\xd7\xc8\x9f\x38\x89\xe5\xcd\x5f\xff\xfc\x33\xc6\xeb\xf8\xf7\xdf\x7f\xe4\x2e\x57\x44\xbe\x73\x5f\xc5\xfd\xe2\xc8\xe5\xaa\xb6\xbf\x18\x0c\xe3\xbb\xd8\x7f\xaa\x7a\x5d\x80\x4f\x55\x4f\x44\x78\x0f\x8a\xef\x3a\x59\xee\xdf\x39\x8a\xba\x3b\x33\xc0\x73\x5e\xdd\xc4\xba\x5d\xb1\xf6\xf7\xe4\x07\x1c\xd8\xe6\x8a\x5a\x5b\xa9\x94\xd4\x8f\x35\xb9\x5c\x5b\x29\x2a\x6d\x45\x95\x14\xfd\x64\x99\x6a\x57\xaa\xa9\xb9\x4e\x53\xde\x76\x99\xb6\xa2\x1b\xed\x8a\x64\x6c\xff\x49\x56\xea\x8a\xa1\xe4\x24\x41\x97\x04\x59\xb9\xb2\xb0\xb9\xf5\x3b\x3e\xff\xf9\x7a\x12\x8a\xc9\x4e\x19\x9f\xf9\xdc\x58\xb5\xbc\x24\xc9\x67\xfd\x9c\x86\x8d\xce\x2a\xeb\x30\xd1\xbf\xb1\xc4\x7b\x51\x13\x07\x57\xf6\xa7\xeb\x21\x29\xc7\x39\x2d\xbc\x47\x09\xae\x77\x98\xc7\x34\xf0\x35\xa8\xf4\x13\xd5\x70\x41\x98\xcf\xba\x38\x13\x06\xcb\xb6\x53\x9c\x86\x38\xfe\x17\x14\x72\xb9\x6b\x7c\x89\x21\xdd\xec\x1d\x7f\xfc\x91\x13\x1c\x07\x3b\xb9\xa9\x35\x5b\x58\x93\xc9\xe6\x93\xa0\x67\xa1\x71\x2b\xe5\xbb\xbe\xa7\x8b\x35\x76\x72\x4b\x2b\x44\x43\x2b\xfc\x0d\xf2\xbf\x1f\xb2\xb6\xb6\x75\x12\x4b\xbf\x17\xea\xfd\x75\x96\x59\x62\x02\xb1\x25\x13\xf9\x8b\x10\xa5\xa3\xf4\x8e\x94\x3b\x89\xf7\xc1\x89\x8b\xef\x1f\xfa\x44\x73\xbf\x82\xab\xb7\xea\x39\xc7\x8a\xad\xed\x58\xcb\x39\x8b\x69\x90\x43\xfe\x34\x98\xe0\x18\xef\x3e\xe6\xff\x0f\x00\x00\xff\xff\x8e\x42\x8c\x8f\xc1\x9a\x04\x00") func kahunaHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -288,7 +288,7 @@ func kahunaHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "kahuna-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0x3d, 0xc9, 0x7, 0x22, 0x2e, 0x8a, 0xb5, 0x33, 0x2a, 0xc0, 0xe0, 0xd7, 0x85, 0x91, 0x41, 0xca, 0xbe, 0x8b, 0xa0, 0xe1, 0xa2, 0x66, 0x8c, 0x4a, 0x7a, 0xd9, 0x57, 0x5d, 0xeb, 0xa6, 0xc}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0xe1, 0x6b, 0x91, 0x39, 0x1e, 0x7c, 0x99, 0xa5, 0xdc, 0xed, 0x7, 0x9b, 0x94, 0x22, 0x4, 0x4d, 0xb7, 0x73, 0xeb, 0xf1, 0xc3, 0xad, 0xd8, 0x30, 0x8, 0x32, 0x6b, 0xd9, 0x1e, 0x66, 0x7f}} return a, nil } @@ -472,7 +472,7 @@ func pathed_paymentCoreSql() (*asset, error) { return a, nil } -var _pathed_paymentHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x69\x93\xaa\xc8\x12\xe8\xf7\xf9\x15\xc4\x89\x1b\xd1\xe7\x84\x7d\xa6\x29\x76\xce\xbc\xb9\x11\xa8\xb8\xef\xbb\xde\x98\x30\x0a\x28\x10\x45\x51\xc0\xad\x6f\xdc\xff\xfe\x42\x70\x41\x14\x17\xb4\x7b\x7a\xde\x23\xce\xf4\xa8\x54\xe5\x56\x59\x99\x59\x59\x59\xf0\xf3\xe7\x6f\x3f\x7f\x62\x15\xd3\x76\x34\x0b\xd5\xab\x05\x4c\x81\x0e\x94\xa0\x8d\x30\x65\x3e\x9e\xfe\xf6\xf3\xe7\x6f\x9b\xfb\xc9\xf9\x78\x8a\x14\x4c\xb5\xcc\xf1\xa1\xc1\x02\x59\xb6\x6e\x4e\x30\xfe\x77\xe6\x77\xe0\x6b\x25\xad\xb1\xa9\xd6\xdf\x74\x0f\x34\xf9\xad\x2e\x36\x30\xdb\x81\x0e\x1a\xa3\x89\xd3\x77\xf4\x31\x32\xe7\x0e\xf6\x27\x86\xff\xe1\xde\x32\x4c\x79\x74\xfa\xab\x6c\xe8\x9b\xd6\x68\x22\x9b\x8a\x3e\xd1\xb0\x3f\xb1\x97\x66\x23\xc5\xbd\xfc\xb1\x03\x37\x51\xa0\xa5\xf4\x65\x73\xa2\x9a\xd6\x58\x9f\x68\x7d\xdb\xb1\xf4\x89\x66\x63\x7f\x62\xe6\x64\x0b\x63\x80\xe4\x51\x5f\x9d\x4f\x64\x47\x37\x27\x7d\xc9\x54\x74\xb4\xb9\xaf\x42\xc3\x46\x47\x68\xc6\xfa\xa4\x3f\x46\xb6\x0d\x35\xb7\xc1\x12\x5a\x13\x7d\xa2\xfd\xb1\xa5\x1d\x41\x4b\x1e\xf4\xa7\xd0\x19\x60\x7f\x62\xd3\xb9\x64\xe8\xf2\xeb\x86\x59\x19\x3a\xd0\x30\x37\xcd\x84\x42\x43\xac\x61\x0d\x21\x5e\x10\xb1\x6c\x0a\x13\x3b\xd9\x7a\xa3\x8e\x95\x4b\x85\xee\xb6\xfd\xef\x03\xdd\x76\x4c\x6b\xdd\x77\x2c\xa8\x20\x1b\x4b\xd6\xca\x15\x2c\x51\x2e\xd5\x1b\x35\x21\x5b\x6a\xf8\x3a\x1d\x37\xec\xcb\xe6\x7c\xe2\x20\xab\x0f\x6d\x1b\x39\x7d\x5d\xe9\xab\x23\xb4\xfe\xe3\x33\x10\xca\xee\xa7\xcf\x40\xb9\xd1\xab\xcf\x63\xd0\xc3\x76\x3f\x77\x1e\x81\x1b\x45\xbe\x84\xcc\xd7\xea\x00\xdc\x6d\x9e\x2d\x25\xc5\x8e\xaf\xe5\x16\xac\x4b\x55\x1f\xa9\x2a\x92\x1d\xbb\x2f\xad\xfb\xa6\xa5\x20\xab\x2f\x99\xe6\xe8\x72\x47\x7d\xa2\xa0\x55\xdf\xc7\xdc\xc4\x86\xae\xa2\xdb\x7d\x73\xd2\xd7\x95\x7b\x7a\x9b\x53\x64\xc1\x7d\x5f\x67\x3d\x45\x0f\xf4\x3e\x50\xf2\x10\x15\xf7\xf5\x35\x90\xa2\x21\xcb\xed\x68\xa3\xd9\x1c\x4d\xe4\xbb\x58\xf0\x75\x9f\x5a\x68\xa1\x9b\x73\x7b\xfb\x5b\x7f\x00\xed\x41\x44\x50\x8f\x43\xd0\xc7\x53\xd3\xda\x4c\xc7\xad\x4d\x8d\x0a\x26\xaa\x2c\x65\xc3\xb4\x91\xd2\x87\xce\x3d\xfd\x77\xca\x1c\x41\x95\xb6\xf3\x32\x02\xd1\xfe\x9e\x50\x51\x2c\x64\xdb\x97\xbb\x0f\x1c\x4b\x71\xfd\x4e\xdf\x30\xcd\xd1\x7c\x7a\x43\xeb\xe9\x35\x92\xbc\x56\x50\xb7\xee\x04\xbc\x33\xba\x37\x77\xd8\xd8\x09\x55\x45\xd6\x6d\x4d\x77\xe0\x23\x74\xd9\x8a\xf5\xb6\x4e\xae\x69\xbd\x03\x89\xdf\x14\x5f\xeb\x31\xdd\x74\x18\x38\x57\x47\xc0\x3e\x32\x40\xd2\xfa\xaa\x1a\x0d\xf6\x33\xfd\x96\xc6\xa6\x47\x87\x79\xb5\xa1\x6e\x3b\x7d\x67\xd5\x9f\x5e\x07\xb9\x69\x69\x4e\x6f\x6d\x89\x6e\x6d\xb6\x73\x25\x97\x1b\x4b\xbb\xe9\x7e\xb5\xd9\x75\x2b\x26\xad\x6f\x1b\x4c\xcf\x47\x6e\xa4\x6d\xdb\xf3\x6b\x98\xf7\x8d\x65\x53\x41\x77\xc6\x05\x7b\x35\x98\x42\xcb\xd1\x65\x7d\x0a\x27\x17\x9d\xf7\xb5\xae\xfd\xe9\x9d\xb1\xc9\xde\xa3\xdd\x4b\xc1\xf9\x8e\x77\xe3\x77\x85\x77\x0b\x3e\xaf\xe1\x87\xc3\xf7\x06\x73\x33\x92\xdb\x8f\x1b\xff\xb0\x0b\xfd\x5c\x65\xe8\xdf\x48\x81\x66\x5a\xd3\xfe\x58\xd7\xb6\x01\xc3\x05\x12\x02\x2d\x6f\xe6\xf1\xfe\x78\xef\x12\xe4\x5b\x95\xd3\xeb\x9d\x28\x17\x9a\xc5\x12\xa6\x2b\x1e\xe6\xa4\x98\x12\x9a\x85\xc6\x8d\xb0\x43\x94\xee\x09\x90\xb7\xc3\x7d\x19\x92\xfb\xed\x76\xf6\x77\x5e\xba\x2e\x56\x9b\x62\x29\x11\x41\x66\x9b\x38\xdb\x46\xb3\xbb\x31\x1f\x01\xb9\xb9\xb7\x82\x6e\x6c\x7b\x88\x66\x6f\xe6\x30\x64\xd6\xdf\xc3\xdf\x79\x10\xb7\xf5\xdd\xc6\x7d\xb7\x35\xde\x06\x79\x37\xf3\xb6\xb5\x00\xf7\xf0\xe2\x75\xb9\xb1\xed\x36\xfc\xbb\x9d\x9e\x5d\xbc\x78\x0b\x45\x01\x1b\x72\xb9\xb1\xcf\x24\x6c\x1b\x0a\xe9\x74\x4d\x4c\x0b\x8d\x33\x8d\xc7\xfa\x66\xc5\xa1\xcb\xe8\xfb\x64\x3e\x46\x96\x2e\xff\xe7\xaf\x1f\x37\xf4\x82\xab\x08\xbd\x0c\x68\x3b\xdf\xe1\x64\x8d\x0c\x37\x15\x73\x43\x0f\x55\xb7\xce\x76\x49\x35\x4b\x89\x46\xb6\x5c\xba\xc0\x4f\x1f\x6a\xda\x81\xba\x57\xec\x84\xd0\x0b\x30\x76\xdc\x3d\x00\x63\xc3\xab\xdb\xfd\x40\xfc\x2b\x76\x0f\x23\x2e\xeb\x37\x40\x10\x3b\x0d\xb1\x54\x0f\x80\x30\xa6\x9a\x3d\x33\x76\xba\x98\xc8\x88\x45\xe1\x04\xc3\x1f\xbf\x79\x59\xb8\x12\x1c\xa3\x5f\xbb\xdf\xb0\xc6\x7a\x8a\x7e\x6d\xbb\xfc\x81\xd5\xe5\x01\x1a\xc3\x5f\xd8\xcf\x3f\xb0\xf2\x72\x82\xac\x5f\xd8\x4f\x37\x39\x97\xa8\x89\x9b\xf1\xda\x42\xde\xc1\xfb\xed\x08\xe2\xf1\xcd\x2d\xe0\x44\xb9\x58\x14\x4b\x8d\x0b\x90\xbd\x06\x58\xb9\x74\x0c\x00\xcb\xd6\xb1\x97\x5d\xda\x6d\xf7\x9b\xed\x02\x79\x09\x62\xde\xb1\xbf\xc5\xb9\x97\xd0\x55\x7e\x8e\x64\x59\x2a\x37\x02\xf2\xc4\xda\xd9\x46\x66\x4f\x96\x3f\xff\x76\x84\xfe\x00\x25\x40\xc8\x3d\xcc\x9f\x00\x71\x05\x50\x29\xbc\x4d\xb5\x7a\xb5\x80\x4d\x2d\x53\x46\xca\xdc\x82\x06\x66\xc0\x89\x36\x87\x1a\x72\xc5\x70\x63\xbe\xd0\x4f\xee\x75\x45\xdb\x92\xbf\xd3\xd5\x03\xfd\xbb\xb1\x3d\x27\xcb\xbd\x66\x5f\x85\x8f\xd5\xc4\x46\xb3\x56\xaa\xfb\x7e\xfb\x0d\xc3\x30\xac\x20\x94\xd2\x4d\x21\x2d\x62\x2e\xf7\xc5\x62\xd3\xb3\x77\xf5\x46\x2d\x9b\x68\xb8\x2d\x84\x3a\xf6\xaf\xfe\xbf\xb0\xba\x58\x10\x13\x0d\xec\x5f\x60\xf3\x2d\x38\x1a\x57\x27\xe2\x63\xdc\x5d\x03\xff\x34\xe6\x88\x73\xcc\xdd\x62\xa9\x1e\xe3\xef\x06\x0c\x7b\x16\xf7\x3f\x45\xe2\xf0\xfb\x6f\x18\x96\x10\xea\x22\xd6\xce\x88\x25\xec\x5f\xe0\x3f\xe0\xaf\xb7\x7f\x81\xff\x10\x7f\xfd\xfb\x5f\x84\xfb\x99\xf8\x0f\xf1\x17\xd6\xf0\x6e\x62\x62\xa1\x2e\x6e\x84\x22\x96\x92\x3f\xce\x4a\xe6\x06\x3f\xf0\xa0\x64\xae\x63\xf8\x68\xc9\xfc\x9f\x28\x92\x39\xf5\xa9\x5b\x39\xec\xfd\xf0\x6d\x82\x38\xb8\xed\x13\x88\x2e\xc5\x18\x56\xdf\xc8\x0a\xfb\xf3\x60\x01\x5e\xbd\x9f\x1b\xdd\x8a\x88\xfd\xe9\x9f\x11\x3f\xce\xcd\xda\xa7\xd2\x18\x04\x18\x20\x71\x37\x8d\x6f\xa7\xf0\x6c\x08\xf4\x28\x95\xe7\x80\x06\x28\x3d\x9a\x90\xc7\xe4\x1e\xb4\xec\x94\xda\x73\x61\xde\xc3\xd4\x9e\x01\x1a\xa4\xd6\x3f\x49\x2e\x52\xbb\xf1\x5c\x0a\x52\xe1\xdc\x70\xfa\x0e\x94\x0c\x64\x4f\xa1\x8c\xb0\x3f\xb1\x97\x97\x3f\x8e\xef\x2e\x75\x67\xd0\x37\x75\xc5\xb7\x95\x76\xc4\xab\x3f\xfe\xdd\xb2\xe8\x4e\xb0\xdb\xd8\xf3\xe6\xa2\x7f\xf1\xed\x71\xa4\x2b\x98\xa4\x6b\xfa\xc4\x71\x03\x83\x52\xb3\x50\xf0\xd8\x81\xe3\x4d\x18\x8f\xc9\x03\x68\x41\xd9\x41\x16\xb6\x80\xd6\x5a\x9f\x68\x81\x66\x93\xf9\x78\x1f\xf2\x63\xfa\xc4\x41\x1a\xb2\x02\x4d\x54\x03\x6a\x36\x66\x8f\xa1\x61\x9c\xa2\x71\xcc\xb1\x71\x8a\xe4\x3b\x41\xd3\x3f\xf6\x2d\x4f\x87\x3d\xb8\x6e\x88\x2a\x8e\x60\xb6\x63\x2f\x12\x07\xad\x4e\x04\x32\x9d\x1a\xba\x9b\xb3\xc7\x1c\x7d\x8c\x6c\x07\x8e\xa7\xd8\x66\xcc\xdc\xaf\xd8\xbb\x39\x41\xa7\x84\x86\xad\x8a\x76\xf1\xe8\x76\x39\x75\x1b\xcd\xfb\xc5\x57\x08\xd4\xad\x1a\x0a\xb5\x86\x17\xd1\x01\xf7\x87\x6c\x29\x51\x13\xdd\xf0\x2b\xde\xdd\xfe\x54\x2a\x63\xc5\x6c\xa9\x25\x14\x9a\xe2\xfe\xbb\xd0\x39\x7c\x4f\x08\x89\x8c\x88\x81\x6b\xcc\x44\x16\x7b\x10\xd0\x89\x2a\x6e\x93\x1e\xd8\x04\xad\x9c\x05\x34\xbe\xbf\x84\x70\xfc\xf2\xeb\x97\x85\x34\xd9\x80\xb6\xfd\x23\x38\x5c\xde\x5e\xc5\x19\xdd\x62\xa8\x1f\x17\x06\xca\x5b\x1b\x3f\xcc\x99\x97\xd1\xd9\xf3\x75\x7e\x66\x1c\x72\x75\xe7\xc9\x3c\xdb\x5c\x36\x95\x73\xcd\x01\x71\xbe\xb9\x97\xfe\x3b\xd3\x81\x66\x2e\xcd\xb0\xf3\xe9\x85\x27\xa9\xad\x1f\xe6\xa7\x29\xed\x25\x46\xb0\x72\xbb\x24\x26\xb1\x78\xf7\x0a\x47\x5e\x86\xee\x32\x43\x7b\x58\x81\xdb\xbf\xeb\x4a\x18\x6d\xbb\x9c\xcf\xa3\x5a\xb7\x85\xb3\x55\xbb\xc0\x9c\xe9\x87\x59\xfa\xd3\x14\x57\x58\xcb\x6f\xee\xc6\xc7\xb7\x10\x6d\x76\xf5\xf8\xfc\x2d\x05\x39\x50\x37\x6c\x6c\x68\x9b\x13\x29\x5c\xd9\x76\x89\xb2\x47\xe5\xb0\x85\xb3\x95\xc3\x6e\xdf\x3a\x84\x36\xdf\x66\xf2\x4d\xb3\xf0\xdc\x3e\xf6\xf9\x8e\x5b\xb1\xf8\x32\xa3\xee\x40\xec\xe9\xd8\x59\x39\x3c\x80\xe1\x30\x10\xb7\xb5\xdf\x6f\x26\x07\x1c\x93\x39\x77\x0e\xbe\x29\xd8\xc7\x42\xd0\xb9\xda\xc9\x6b\x3b\x9f\x2a\x37\xb7\xdd\xab\xce\xf6\x6b\x60\x9f\xfd\x84\x17\x70\x12\x0f\x38\xd0\xe8\xcb\xa6\x3e\xb1\xcf\xeb\xa0\x8a\x50\x7f\x6a\x9a\xc6\xf9\xbb\xee\xce\xa7\x8a\xc2\xc6\xda\xbd\x6d\x21\x1b\x59\x8b\xb0\x26\x9b\x38\xd4\x59\xf5\xdd\x30\x49\x7f\x0f\x6b\x35\xb5\x4c\xc7\x94\x4d\x23\x94\xaf\xe0\x18\xed\x94\x05\x41\x05\x59\x6e\x78\xe1\xfd\x6e\xcf\x65\x19\xd9\xb6\x3a\x37\xfa\xa1\x8a\xb2\x65\x1c\xea\x06\x52\xae\xb5\xda\x92\x1e\xa2\x42\xe1\x53\x2f\x24\xbf\xfd\xe8\x4c\x0c\xd9\x33\xb9\xe2\x17\x6f\xb7\x48\xd7\x6d\xdc\xbd\x2c\x3f\xd7\xd5\x5d\xc4\xf1\x59\xae\xef\x2e\x46\x1f\x74\x85\x17\x71\x9d\xba\xc6\xf3\xcd\x2f\xb8\x4a\xdf\xee\xcf\xd3\x74\xf3\xda\x52\xe8\xb8\xf2\x2a\x64\xb9\xb4\x59\x1d\xc8\x1e\x2b\xae\x97\x7c\xd0\x49\x6e\xad\x83\x39\xb7\xe4\x7d\x29\x47\x88\x7b\xda\x99\x9c\x97\x97\x5f\xbf\xc2\x97\x6b\xe1\xf3\x60\xbb\xf9\xf6\xa8\x38\xb7\xf5\x82\xdf\x9f\x1a\x53\x6c\xcd\x66\x14\x0f\xe7\xd6\xcb\x84\xa2\x0d\x54\x2b\x5e\x6a\xb4\x2d\xa0\xbc\xd4\xc4\x5b\x2b\x9f\x6d\x70\x5a\xf7\x79\xa5\xdd\x45\x74\xfb\x56\x17\x30\xba\x24\xe9\x76\xdf\x46\x86\x81\x2c\x4c\x32\x4d\x03\xc1\xc9\xce\x6f\xe9\x32\xea\x4f\x8e\x7c\xb4\xf7\xdb\xb1\xdf\x3e\x54\x1c\xf5\x03\x1e\xfd\xa8\xe6\x29\x78\xd3\xb7\x95\x7f\xb6\x3a\xd4\xa5\xba\xef\xd6\x0f\x63\x89\x8c\x98\xc8\x63\xdf\xbf\xfb\x25\xf8\x6f\x0c\xff\xf1\xe3\x1a\xa8\x73\xdd\x77\x42\xfb\x3f\x27\x72\xbc\x01\xde\x91\x4c\x03\xe0\x03\x02\x77\x09\xbc\x38\x95\xce\xef\x82\x3f\x61\x72\x9d\xaf\x6b\xb8\xd1\x93\xde\x62\xc2\x1e\xf1\xa5\xd7\x6a\x08\x9e\xe3\x4d\xaf\x60\xf9\x2c\x7f\x7a\x27\xb3\x0f\x7a\xd4\x2b\xd8\x4e\x7d\x6a\x58\x87\x0b\x5e\xf5\xa8\x6e\xe4\x89\xba\xba\xd3\x4f\x3f\x49\x37\x2f\xb4\xb6\xb6\xff\xca\xf2\xed\x56\xc7\x7b\xd9\x87\x9e\x6d\x7b\x40\x7d\x76\xbe\x6c\x56\x0a\xe1\x4b\x8d\xb0\x45\xdc\xdf\xb2\x0c\x73\x56\x7d\x34\x59\x20\xc3\x9c\xa2\x73\xa9\x4d\x67\xb5\x59\x14\xcd\x0d\x27\xe4\xe6\x18\x39\x30\xe4\xd6\x66\x39\x16\x76\xdb\xd6\xb5\x09\x74\xe6\x16\x3a\x97\x85\xe3\x99\x1f\xff\xf9\xeb\x10\xbb\xfc\xf7\x7f\xe7\xa2\x97\xff\xfc\x15\x94\x39\x1a\x9b\x21\x09\xb3\x03\xac\x89\x39\x41\x17\x63\xa1\x03\xac\x53\x30\x5b\xce\xf4\x31\xea\x4b\xe6\x7c\xa2\xb8\x59\x6d\xce\x82\x13\x0d\x05\x57\x6c\xc7\xae\x75\x23\x89\x0d\x34\x0d\x05\x96\xc0\x93\x09\xb2\xfa\xb7\xcd\x80\x03\xa4\x8b\xea\xea\x07\x7c\x5d\xc8\xdb\x44\x3d\x5a\xf6\x77\x1a\xeb\x91\x77\x2d\xe9\x87\xe9\xca\xce\x16\xec\x8a\xd0\x6e\x31\x60\x9e\x31\x70\x2b\xfe\xae\xd4\xb7\xd5\xc5\xc6\x85\x4c\xaf\x3f\xa7\xe6\xcf\xf3\xde\xb7\xca\x79\x1e\x13\x37\x96\xff\x5d\x64\xea\xe2\xea\xe8\x16\x26\x43\xe3\x80\xa7\xb1\x79\x73\x05\xe5\x45\x46\xaf\x38\xad\xf3\xac\x26\xa1\x03\x31\xd5\xb4\xae\xec\x77\x61\x49\xa1\x21\x5c\x61\x2f\x5b\xaa\x8b\xb5\x06\x96\x2d\x35\xca\x47\x7b\x5e\xae\x8f\xaf\x63\xdf\xc1\x2b\xf6\x02\x08\x7c\x7b\xbd\xbc\x62\xc4\x2b\x86\xbf\x62\x2f\x2f\x3f\xfe\xb8\xda\x97\xb8\xd0\x37\x84\x95\x4b\xfb\x55\xf7\xb2\x13\xdc\xb3\xda\x91\xf5\x02\xfa\xfa\x44\x77\x74\x68\xf4\xbd\xfa\xa1\xdf\xed\x99\xf1\xf2\x8a\xbd\x10\x38\xe0\x7f\xe2\xcc\x4f\x9c\xc4\x00\xf7\x8b\xe0\x7e\x51\xec\xef\x38\x49\x50\x3c\x13\xc3\x89\x20\xc3\xa1\xd0\x89\xbe\x77\x2e\xe4\x68\x34\xa5\x75\xdf\x31\x75\xe5\x32\x26\x9e\xa1\xd9\x7b\x30\x91\xfd\xb9\x8d\xf6\xbe\xb7\xaf\x4f\x4e\xce\xa2\x5c\xc4\x47\x51\x38\xc5\xdd\x83\x8f\xea\x43\x45\xe9\x07\x33\x7a\x17\x71\xd0\x14\x4d\x12\xf7\xe0\xa0\xfb\x9e\xa7\xdf\xad\x39\xdc\x9d\xe0\x8b\x28\x18\x12\x27\xee\x62\x83\xd9\xa1\xd8\x5a\xce\x1b\x50\x70\x14\xa0\xef\x41\xc1\xf6\xc7\xa6\xa2\xab\xeb\xdb\xb9\xe0\x00\x43\xdc\x85\x82\x3b\xe2\x62\x5b\x00\x7e\x03\x1e\x96\x62\xc8\xfb\xf0\x6c\x06\x1d\x6a\x9a\x85\x34\xe8\x98\xd6\x65\x9d\xe2\x71\x80\xf3\xf7\x80\xe7\x5d\xf0\x5e\xb6\xb7\xbf\x52\xac\xcb\xd0\x09\x16\xdc\x35\xd4\x00\x77\xc1\x6f\x47\xc1\x5d\xbf\x5f\x46\x40\xf3\xec\x5d\xd2\x01\xc0\x8f\x60\xbf\x20\xdc\x18\x80\xcb\x88\x78\x86\xbf\x8f\x13\xe2\x68\xa0\xb7\x4b\x70\xef\xc8\xf1\x25\x4c\x00\x67\x69\xea\xae\x11\x01\xa4\xc7\xce\x3e\x71\x71\x71\xc4\x01\x20\x58\xe6\x3e\x4e\xa8\xbe\xaa\xaf\x76\xc7\x2f\xcc\xb1\xd1\x57\x75\x64\x5c\x34\x8d\x00\xd0\x00\xdc\x65\x84\x01\xbd\xdb\x75\xda\xed\x06\xac\xae\xb0\xc1\xb0\xf7\x99\x79\xc0\xf4\xf5\x89\x86\x6c\xa7\x7f\xba\xdf\x70\x05\x15\xcb\x73\xf7\x8d\x08\x7b\x14\x26\xb8\x1b\x3b\xf0\xb2\x33\xd9\xb8\x5d\x92\xba\x0b\x09\xb7\x57\x5f\xd5\xf4\xa2\x65\x14\x98\xec\x00\xff\x49\x02\x0c\x50\xbf\x00\xff\x8b\xe2\x7f\x07\x04\xc9\x91\x74\x0c\x07\x17\xfc\xf9\xc5\x4a\x88\x7b\x1d\xfa\x49\x35\x84\x3f\x48\x49\xc7\x3b\xe9\x6a\xae\xdd\x2a\xb4\xcb\xdd\x4c\xaa\xd0\x6a\xe4\xdb\x2d\x3a\x95\xce\x08\x64\xa1\xd4\xed\x12\xb9\x6a\xbe\xc8\x96\x85\x9c\xd0\x14\xab\xa9\x26\x53\xa8\x24\xea\x62\xaa\xd5\x29\x97\x82\x02\x0a\x45\xb2\x89\x66\xd2\x89\x4e\x3e\xcd\xd4\x4a\x54\xb9\x94\x15\x2b\x89\x62\x29\x15\x67\x49\x42\xa0\x48\xa6\x47\x57\x4a\xc9\x7a\xad\x90\x6e\xe7\xd9\x74\xbc\x90\x28\x56\x0b\xd9\x54\x99\xaa\xb3\x62\xb7\xdd\x6a\xde\x8c\x84\xdc\x20\x11\xe8\x76\xbc\xd2\x15\xe8\x2e\xd5\x16\xc4\x4c\xa7\x5d\x23\x9a\xf9\x32\xd1\x2c\x53\xf1\x66\x3a\xd3\xac\xb2\x94\xd8\xac\xe4\xcb\x25\xa2\x9a\x69\x51\xed\x5a\xa6\x9c\xad\x95\xf2\xf9\xcc\xc9\x50\x87\x22\xa1\x5c\x4e\xaa\x95\x6e\x3a\x43\xe5\x69\xb6\x13\x4f\x8a\xa5\x7c\xbe\x43\xd3\xf9\x64\xa3\x5d\x6e\xe4\xe9\x76\xb2\x5d\xab\x96\x33\x44\x21\x23\x26\x3b\xa4\x98\x6f\x65\xab\xb5\x42\x51\xac\xa7\xe3\xe9\x9b\x91\xd0\x2e\x12\x82\xac\xa6\x88\x4c\x53\xa4\x09\xa1\xd8\x69\xa6\x9a\x19\x52\xe8\xe6\x84\x4e\x27\xdd\xe9\xb4\x88\x56\xa6\xd3\xed\xd6\x18\xb1\xdb\x11\x1b\x95\x7c\xb2\xd3\xab\x0b\x6d\x86\xed\x94\xa9\x9b\x91\x30\xee\xc0\xd7\x2a\xdd\x4c\xb6\x40\x24\xb2\x64\xaa\x54\xa5\xe2\x9d\x42\xaa\x58\x4a\x16\x52\xb9\x66\xa9\xd2\x24\x32\x5d\xb2\x57\x4c\xd5\x33\xe5\x52\x33\x21\x96\x85\x7a\x9b\xad\x26\xd8\x72\x87\xc8\xbc\x44\xad\x41\xda\x04\xf4\x57\xb4\x76\x5b\xb7\x79\x28\xb9\xfe\xdd\x46\x97\xeb\x73\x5e\x31\xe6\x15\x73\xac\x39\xba\x61\x2e\x9d\x56\xde\x44\x9e\x49\xde\x7a\xd3\x3f\x8f\x64\x0b\x29\xba\xd3\x87\xc6\x74\x00\x27\xf3\x31\xb5\x99\xfd\xcd\x7a\xf2\xe5\x23\x86\xf3\x18\x3b\x11\x82\x5d\x6c\xd6\x5e\x1e\xd4\xd8\x28\x95\x2e\x4f\x19\xe5\xa3\xb5\xb9\xbb\x00\xba\x6d\x8c\xcf\x15\xba\x44\x1d\xe4\x5d\xb1\x8b\xcf\xc6\x10\x34\xcb\xf0\x1c\xce\x72\x2c\xf9\x8a\x01\x97\xae\x97\xff\x7e\xf3\x82\x8a\x6f\xbf\xb0\x6f\x00\xff\x7d\xbb\x6a\xfb\xf6\x8a\x7d\x3b\x94\x53\x6d\xee\x89\xcd\xda\xe1\x47\x67\x3d\x75\x7f\x0c\x8e\xdb\xa1\x85\x57\x56\xb5\x69\x13\x75\x00\xbf\xfd\x2f\x4c\x81\x82\x9c\x11\x01\xce\x88\x57\x8c\xbc\x83\xb3\x66\x3d\x19\x95\xb3\x68\x13\x23\x3a\x67\x9b\x7f\x1e\x6b\xde\xe6\x95\x4b\x45\x44\x0f\xb8\xe1\x68\x17\xeb\x7d\xfb\xb5\x51\x87\x6f\xb6\x69\x28\xfd\x30\xa1\x49\xe6\x5c\x1b\x38\xa1\xb7\xbd\xbe\xe7\x04\xeb\xbb\x73\x49\xba\x3b\xf8\xe7\xb4\xee\xe8\xde\x25\x20\x3e\x5c\x4f\x18\xa7\x20\xe6\xcf\x54\x6a\x10\x18\x7a\xea\xdc\xd0\x47\x8c\x4b\x3e\x7e\xe8\xb7\xe3\xf6\xc8\xd0\x6f\xb5\xe7\xd1\xa1\x8f\x38\x4e\x97\x86\xfe\xa3\x67\x3d\x78\xc5\x00\xbb\x59\x2e\xb0\x24\xc1\x81\xb3\x96\x9a\xf8\x67\x5a\x6a\x2a\xc0\xd9\x19\x4b\xfd\x0f\xe5\x8c\xd8\x73\xc6\x92\x2c\x1b\xe2\x5d\xff\x99\x4e\x88\x0e\xb0\x76\xd6\xbd\xfe\x33\x59\xdb\xcf\x34\x0e\x50\x21\x31\xd1\x25\x7d\xfc\xc2\x9c\xd1\x01\xce\xee\x9c\x69\x5f\x98\x33\x72\xcf\x19\x4d\x33\xfc\xfd\x33\xed\x0b\x1b\x11\x2a\xc0\xda\xbd\x33\xed\x0b\xb3\xb6\x19\x35\x82\xe3\x28\x1e\xa7\x79\x8e\xf6\x46\x0d\x77\x79\x33\xf4\xb1\xee\xb2\xc6\x13\x04\x49\xb2\x04\x4e\x32\x1c\xfd\x3b\xc5\xb2\x34\x87\xb3\xff\x28\x1e\x89\x1d\x8f\x00\xc7\x77\x7e\x3b\x12\x8f\x5f\x78\xf6\x81\x3d\x8f\x14\xd8\xf9\xb9\xff\x77\x79\xe4\x88\x9d\x57\xf8\x7f\x4d\x57\xe9\x57\x8c\xa3\x39\x9e\x27\x39\x86\xf3\x8c\xa8\xc7\xa1\xed\x40\xcb\xd1\x27\x5a\x5f\x82\x06\x9c\xc8\x28\x68\x73\x6e\x46\xc0\x1c\x23\xb8\xd5\x94\xed\xa4\x34\x81\x8e\xbe\x40\x91\xf9\xd9\x8c\x9a\xc7\xd0\x12\xe9\xda\xc0\xd9\xae\x72\xbc\xe4\x49\x7f\x84\xd6\x9f\xa3\x49\xd4\x96\x2a\x8a\x60\xb7\x46\xef\x83\xa4\xbc\x45\xf0\xd1\x52\x0e\xf0\x73\xa3\x94\x3f\x61\xa9\xec\x51\xc5\x70\x5b\xb3\xfb\x51\x52\xf6\x10\x7c\xb4\x94\x03\xfc\xdc\x26\xe5\xa8\x59\xa0\x7b\x3c\xb8\x4b\x15\x8d\xf3\x5b\xc3\xff\x41\x52\xde\x22\xf8\x68\x29\x07\xf8\xb9\x4d\xca\x11\xf7\x68\xee\x8a\x21\x3c\xaa\x68\x7c\xeb\x7a\x3e\x4a\xca\x1e\x82\x8f\x96\x72\x80\x9f\x1b\x2d\x46\xc4\xb4\xd6\xff\x6e\xd8\x92\x3c\x77\x86\x32\x6a\x8a\x7d\x77\x8e\xd2\xbf\x2f\xc5\x13\x8c\xa2\x12\x80\xa5\x21\xc5\x22\x56\xa5\x64\x1a\x11\x2c\x49\xb2\x3c\x23\x4b\x12\x05\x65\x46\xe2\x24\x1a\xa7\x11\xa5\x40\x8e\x66\x78\x19\x57\x18\x62\x13\x6a\x48\xbc\x02\x58\x40\xab\x2f\xaf\xd8\x0b\xcd\xf0\x2c\x87\x14\x9a\x67\x00\x52\x54\x92\xe3\x08\x20\x4b\x04\xce\x93\x84\xa4\xa8\x04\xab\x22\x1a\x87\x04\xa0\x00\x01\x08\x0a\x27\x14\x5a\x52\x69\x48\xe0\x2c\x64\x09\x85\x96\x79\x86\x7e\x71\x15\x07\x04\x36\x89\x99\x5f\x24\xf3\x0b\xe0\xc1\xbd\x63\xf7\x67\x9c\xff\x9d\x21\x29\x86\xe1\xae\xde\xdd\x26\x25\x49\x96\x65\x5e\x31\xb0\xf9\x0f\x3f\xb9\x5e\x31\x40\xbb\x7f\xb7\x7f\xf6\xbf\xee\x3f\x6c\x68\x13\x04\x41\x48\x00\xd8\x19\x3a\xed\x76\xc6\xe1\x28\x6d\xb0\x5e\x27\x1a\x79\x9e\x9b\xbc\x19\x09\x3d\x15\xcf\xd6\xab\x09\x20\xf1\x30\x9b\x99\xae\x81\x6c\x18\x86\x3e\x06\x33\xa2\x0a\x48\x69\x30\x68\xb1\x44\x37\xa7\x71\x23\xdb\xaa\xb2\x83\x32\x47\x4c\xd7\xb1\xee\x4c\x37\x92\x59\x81\xe3\xd7\xa2\xb6\x01\x2d\x74\x2a\xad\x22\xf2\x3e\xba\x97\x62\x4e\xd3\xb3\xde\x5b\x4a\x7b\xe7\x56\x1a\x0f\xd4\xc4\xb2\x61\x2f\x56\xd9\xb1\xcd\xcf\x47\x6d\x96\x4c\x64\x50\xc2\x89\xcf\x4b\xe3\x52\xbb\x90\x6d\x55\xc7\x6f\xd3\x65\x7d\x3d\xa3\x86\x2a\x5a\x4c\x86\x15\x29\x9b\x21\xb2\x72\x27\x1e\xaf\x34\x62\xef\x8d\x95\x62\xea\xdd\xc5\xc2\x98\xa9\x2e\xfc\x6e\x89\x2a\xc0\xf7\x29\x51\x3d\x20\x13\x3a\xb2\x70\x7c\xc5\x37\x7f\x7a\x42\x07\x50\x55\x41\x48\xe2\x39\xe1\x9f\x76\xbd\xec\xcc\x51\xa9\x59\x28\x84\x4c\xff\xe0\x8c\xa0\x9f\xa3\xcd\x2f\x14\x89\x24\x88\xab\x04\xe2\x29\x1e\xca\x1c\xaf\xe2\x90\xe0\x55\x12\x4a\x2c\x81\x53\x90\x86\x84\x4a\x90\x0a\xc0\x21\xe4\x21\x8d\x70\xc4\x49\x90\x54\x24\x05\x91\x0c\x64\x38\x9e\xa1\xf8\x0b\x33\x02\xe7\x43\x75\x9e\x61\x19\x9c\xbc\x7a\x97\x00\x14\x4b\x71\x24\x43\x71\xf8\xa5\x19\x41\xdd\x38\x23\xf0\x8a\x65\x56\x0a\xd3\x3a\x5c\xe7\xb8\x7c\x5e\x2d\x5b\xb2\x56\x37\xcc\x45\x96\x17\xf3\x33\xd8\xd1\x98\x82\xc9\x2f\x50\x69\x06\x73\xbd\x5c\xa3\x2e\xf4\x8a\xf4\x28\x07\xb3\x43\x32\x35\x9e\x8d\x13\xa2\xac\xb7\xc5\x46\x2d\x56\x7d\x2b\xdb\x3c\xab\x66\x5b\x94\x50\x86\xad\x5a\x6e\x21\xba\x23\xe8\xce\x08\x9f\x92\x16\xf5\x69\x4b\x4b\x4a\x85\x72\x7c\x59\x33\x8d\x4c\xdc\x6e\xd4\xed\xf1\x2a\x55\x7a\x47\x8d\x0e\x29\x28\xb3\x5e\xbd\xe3\x90\x85\x74\x31\x35\x1e\x96\x89\x8a\x3e\x61\x1d\x55\x4b\x25\x84\xf8\xba\xa2\xcb\xda\x30\x47\x94\xea\xc5\x55\x4d\x51\xda\x0c\x2f\x0c\x0b\xce\x92\x91\x21\xac\xf5\xdc\x19\xd1\x3c\x33\x23\x5a\x54\x40\xa1\xfe\xbf\x9c\x11\xd4\x73\xb4\xf9\x05\xf1\x3c\x2b\xb3\x0c\x24\x29\x96\x97\x38\x5e\x26\x54\x19\x71\x90\x44\x2c\x20\x29\x95\x24\x55\x84\x68\x4a\x61\x15\x1a\x90\x0c\x23\x49\xbc\x0a\x64\x9e\xa4\x64\x8e\x20\x69\xa0\x48\x04\x0e\x5f\xdc\x2d\x25\xea\xac\x72\x87\x7b\x01\x8e\x22\x69\xea\xe2\x5d\xd7\xf9\xb8\x49\x2c\x86\x07\x1c\x75\x69\x46\x90\x37\xce\x88\xd8\xb8\xb3\x22\x4c\x1c\x49\xba\x5c\xe0\x98\x7c\x65\x22\xe2\xdc\xfb\xdb\xbc\x55\x52\x5b\x22\x01\xd9\xc9\x6a\xdd\x68\x64\xb3\x20\x23\x65\xf3\xb5\x95\xb8\x76\xf8\xba\x32\xa2\x97\xb1\x35\x5f\x93\x4b\x36\x9d\x9e\x67\x57\xe4\x8c\xae\x27\x5a\x84\x5c\x68\x4e\x59\xd3\x69\xe2\xb9\x58\xa3\xeb\x8e\xa0\x3b\x23\x7c\x23\xda\x43\x46\xb6\x52\x27\xed\xea\x40\x48\xcc\xf3\xd9\x91\x4d\x52\x0c\xa0\xb9\x1a\x99\xe3\xc1\xc8\x9a\xc5\x72\xdc\x1b\x1a\xa7\x47\xab\x45\xdd\x4a\xd4\x3a\x75\x73\x49\xb1\xe2\xbb\x65\x0c\xc8\xb2\xa9\x76\x96\xf1\xcc\xac\x05\x7a\x56\x61\x6e\xd2\xf3\x74\xdb\xcc\x1a\x6a\x41\x2d\x64\x35\x77\x46\x54\xcf\xcc\x88\x66\xf3\x9c\x56\xfd\xc3\x67\x04\x75\xef\x8c\x20\x9f\xa3\xcd\x2f\xa4\xca\xd3\xb2\xac\xca\x40\x91\x70\x9c\x23\x39\x95\x64\x68\x5c\x06\x84\xcc\x02\x19\x67\x19\x1a\xc8\x2a\xc7\x20\x1e\x91\x8a\x44\xca\xb4\xcc\xa9\x1c\x81\x73\x34\x47\x01\x44\x41\x00\x48\xe2\xd2\x8c\x60\x43\x75\x7e\x13\xda\x86\xcf\x88\xdd\xdd\x6d\xee\x13\x70\x1c\x77\x61\x46\xf0\x37\x4e\x88\xf7\x58\xeb\xbd\xb2\x54\x6c\x41\xa3\x38\xa2\x59\x14\x6d\x59\x8e\x13\x4d\x39\x96\x66\x50\x45\xaa\xa4\xd6\x15\x4d\x1b\x74\xab\xa8\x3e\x10\xd7\x3d\x52\x1c\xd1\xbd\x6c\x1e\xa8\x05\xb1\xde\x91\x0b\x86\xf8\x86\xe3\xef\x82\x8d\x33\x09\x1e\x8d\xa6\x20\x27\xbd\x11\xc8\x2a\xad\xe5\xf9\xd2\x1d\xc0\xcd\x84\x50\x96\x87\x01\xad\x8f\xdb\xdd\x2e\x2e\x36\x47\xf1\x76\x91\xd2\xde\x62\xa3\x89\xd6\xd4\x87\xcb\x6c\x8b\x2d\x5b\x09\xba\x37\x7a\x2b\x66\xba\xe9\xdc\x50\x14\x6d\x52\xc0\x57\xc3\xf6\x54\xee\x58\x46\x3b\xd1\x96\x12\x8d\x86\x1a\xcb\x59\xf9\x24\x65\x8d\xf4\xf9\x64\x24\x25\xcb\xc4\x2a\xa3\x73\xc2\x1b\xed\x41\x2e\x9e\x99\x10\x65\xf1\x9c\x52\xfd\xff\x36\x21\x88\xe7\x28\xf3\x0b\x43\x2a\x3c\xa7\xd2\x24\x83\x10\xc3\x29\x40\x22\x58\x89\x96\x38\x5e\x25\x48\xa8\xd2\x24\x00\x12\x4b\x33\x3c\x24\x28\x15\xaa\x80\xc2\x49\xa8\xe0\x12\x4d\x48\x0c\x49\x4a\x38\x2b\x21\x7e\xe3\x66\x68\xf7\xdf\x19\xdd\x66\xc2\x54\x9e\x05\x0c\xe9\xa1\x0f\xbd\xbb\x09\x9a\xbc\x64\x1d\x45\xf3\xc4\x85\xf9\x70\xeb\x22\x82\xa8\xf4\x86\xa0\x34\xa7\x4d\x5c\xca\xb1\x6d\x6a\xb2\x2e\x2f\x9a\xab\x34\xd9\x9a\x9a\xa3\xd8\x22\x25\x94\x9d\x04\xc8\x13\x45\x36\xce\x32\xbd\xc1\x44\x95\xc4\xe4\x34\x53\xe9\x2a\x14\x3d\xa9\xca\x0d\xb6\x33\x52\xb3\xc5\x65\xbd\xc3\x6b\xa9\x24\x1f\x53\xdb\xd0\x61\x01\x53\xcd\xb6\xbd\xf8\xdd\x9d\x0f\xae\x01\xcf\xee\xff\x08\xae\xca\xda\x87\xef\x4b\xa1\x52\x1d\x79\xe3\x5d\xe5\xc7\x5c\xa1\x9e\xe6\x24\xba\x8d\x4b\xf3\x95\xe8\xcc\x6c\xa7\x55\x7d\x67\xb3\xad\xb7\x8c\x95\x1c\xa7\x45\x47\x11\xa8\x71\x42\x4c\x76\xd6\xdc\xa0\xe1\x10\x5d\xad\x36\x69\x64\x1b\xd9\xf9\x3b\x35\x2b\xf5\x44\x7a\x56\x2c\x35\xde\xf1\xa9\x88\x53\xa0\x25\x37\x5b\xe9\xe5\xb8\x0d\x9b\xee\x7c\xcc\x9e\x99\x2f\x19\xfc\x9c\xce\xfd\xc3\xe7\x0b\x7d\xef\x7c\x01\xcf\xd1\x75\xf7\xe4\xe3\x06\x35\xfe\x8a\xbd\x00\x9e\xc5\x7f\xe2\xe0\x27\x0e\x30\x1c\xff\xe5\xfe\x0b\xd5\x69\x92\xf3\xc2\x9e\xcb\x77\x29\x82\xa7\x78\x86\x25\xf8\x4b\xeb\xe6\xf3\xfa\xee\x91\xf4\x77\x0f\x4d\xf8\x15\xef\xe4\x75\x6a\xfd\xb6\xae\xe7\xe3\x6c\x72\x92\xe4\x33\x04\xbe\x1a\xc6\x63\x36\xae\x39\xf6\x32\xbb\x7c\x07\x1d\xa5\xde\xee\xc2\x78\x0e\xa6\xdc\xa9\x24\x9e\x51\xe5\xf3\xd7\x4e\x95\x05\x21\x3e\xfa\x04\x46\x9e\x7a\xbd\xec\x94\x69\xab\xca\x57\x12\x53\x37\x3c\x61\x28\x6a\x9e\x2a\xe4\x68\x66\x58\xa9\x19\x11\x32\xef\xae\x80\x39\x29\x56\x8c\x06\x86\xdc\xad\xa8\x29\x9c\x76\x13\xcd\xd1\xc0\x04\x4b\x8d\xa8\x68\x60\xe8\x60\x2d\x56\x34\x30\x4c\xa0\x86\x86\x8e\x06\x86\x0d\x96\xe2\x44\x03\xc3\x05\x8a\x43\x22\x52\xc3\x07\xab\x67\xa2\x81\x01\x78\xa0\xec\x21\xe2\x50\x01\x10\x80\x13\x51\x01\x01\x11\xa8\x55\x88\x0a\x87\x0c\xd4\x03\x44\x1c\x2d\x40\x05\xf7\xdc\x23\xc2\xa1\x83\xfb\xda\x11\xe1\x04\xb6\x76\x99\x88\x60\xd8\x63\x30\x11\x95\x10\x70\xc7\x7b\x92\x51\xa9\xe1\x8f\xc1\x44\xd4\x41\x02\x3f\xde\xbb\x8b\x48\x0d\x11\xdc\xd2\x8c\x08\x86\x38\xde\xe3\x8a\x4a\x4d\x70\xab\x2c\x22\x18\xea\x78\x2f\x28\x2a\x35\x74\x60\x07\xeb\x39\x0f\xb0\x7b\xca\xc1\x8f\xcb\xcf\x2f\xd8\xf8\xc7\x5b\x4f\x82\x84\x3c\xc7\xed\xe1\x08\xc0\x2f\x47\xbf\xcb\xdf\x7f\x21\x7c\x15\x75\x8e\xf9\xd0\xa6\xe7\x2b\xf6\x4d\xb5\xcc\xf1\xa3\x95\xea\x53\xe8\x0c\xbe\xfd\xc2\xfe\xf3\xd7\x2b\xf6\xec\xb3\x2a\xdb\xe7\xc7\x8d\xe1\x2a\x0c\xe4\x73\x4a\xc9\x77\xcf\xa9\x0b\x2d\xa0\xf7\x6e\x9f\x3f\x3d\xe1\xbb\x77\x03\x2f\x4f\x2c\x97\xfa\x80\x93\x8f\xe7\xf4\xd0\x1f\xec\x1d\xbe\x30\xae\x1e\x7a\x7b\xd3\xee\x09\x6e\x57\x6c\x47\x03\x14\x52\xc9\xea\x3d\xaf\x6d\xc3\xfc\x7f\xbf\xed\x8e\x37\x4c\x36\xff\xff\xdf\xf1\xb1\x07\xfc\x15\xfb\x26\xcd\xd7\xfa\x44\x0b\x39\x79\xe0\xbf\x77\x51\xf2\xc8\x30\x4e\xa1\xec\x8e\x40\x1c\xdd\xbc\x78\x0a\xc2\x8f\xef\x39\xa7\x57\x8e\x91\x3f\xa5\xbe\xec\x03\xce\xdc\x9e\x51\x8a\xe3\x98\x7b\xff\x05\xdf\x6f\xe3\xed\x8d\xd3\x03\xa7\x9f\x0e\xc6\x29\xfa\xcc\xfe\xba\x07\x17\x3e\xe0\xb4\x6f\xf8\x40\x6d\x0f\x3d\xec\xbf\x30\xa7\x03\xf5\x80\x07\x38\x0c\x54\xf4\xa9\xf0\x85\x0f\x2b\x7c\xc0\x19\xdb\xd0\x91\xda\x2d\xd5\xf6\x5f\x88\x0f\x9a\x52\xcf\x18\xa9\xaf\x76\x42\xe1\x53\x07\x6a\x7b\xba\x61\xff\x85\x3b\x1d\xa8\xa7\x04\x66\xcf\xb0\x7d\x5f\xee\x54\xc2\x27\x19\xbf\xa3\x13\x0d\xfb\x2f\x94\x3b\x4c\xcc\x6d\x15\xe3\x8e\x35\xb7\x1d\x84\x1e\x1d\x0b\x17\x8c\x69\x3d\xaa\x16\x5f\x63\xe4\x9e\xfc\x24\x8c\xd0\x91\xdb\x9d\xd3\xd8\x7f\xc1\x23\x8f\x5c\x74\x73\xe7\x1f\xb9\x07\x7c\xe4\x17\xb1\x8e\x1f\xbe\x5c\x38\xce\x84\xed\xbf\x30\x7f\xf3\xc8\x3d\xe0\x33\xbf\xc6\xc8\x7d\x42\x4c\x7f\x94\x7b\xdc\x7f\x21\xfe\x66\x6b\xf9\xb4\x91\xfb\xbb\xac\xe5\xc7\x8f\x9c\x3f\x4d\xbb\xff\xcc\xf9\xaa\xd3\xd5\xf9\x44\xd9\x3d\x8d\x22\xda\x63\x79\x5c\xb9\x78\x0f\xc7\x79\x78\xd1\x7b\xb5\x54\xfe\xc1\xc7\x07\xdd\x23\xb5\x6d\x3a\x79\xff\x99\xfa\x58\xa9\x3d\x90\xa2\xfa\x52\x52\xf3\xd2\xde\xfb\xcf\xf8\x87\x4a\xed\x01\x0b\xf0\xa5\xa4\xb6\x4d\xcf\xef\x3f\x33\x1f\x2a\xb5\x07\xa2\xcc\xaf\x25\x35\x6f\x1b\x61\xff\x99\xf8\xd8\x19\x1a\x3d\xc2\xfb\x70\xa9\x5d\xd9\x92\x38\xf3\x1e\x94\xa8\xdb\x11\xdb\x77\xa1\x9c\xdd\x8a\xc0\x43\x8f\xad\x78\xfb\x12\xe0\xb8\x3a\xc6\xfb\xed\xf0\x83\xfb\x66\xd0\xdd\x52\x99\x62\x00\x60\x38\x06\xa7\x28\xc0\xb3\x80\xa7\xd9\xdd\xf6\xe9\x75\x56\xaf\xbf\xa7\xe2\x01\xe6\xcf\x3f\x41\xfa\x6c\x3d\x06\x11\xbe\x6f\x7c\x15\x10\x11\x00\x14\xb6\x71\x77\x15\x10\x19\xcc\xcc\x47\x05\x44\x05\xb2\xb9\x61\xdb\xac\x57\x01\xd1\xc1\xb4\x70\x54\x40\x4c\x20\x6d\x19\xb6\x0d\x7d\x15\x50\x30\xff\x19\x79\xd4\xb8\x40\x7a\x2e\x32\x45\x7c\x30\xcf\x17\x15\xd0\x71\x85\x06\xf7\xc0\xb0\x1d\xd7\x68\x70\x0f\xa8\xe4\x71\x95\x06\xf5\x08\x24\x32\x90\x02\x88\x3c\x72\xc7\x95\x1a\x8f\xcc\x93\xe3\x5a\x8d\x87\xc6\x8e\x39\x8e\xd9\xc3\x76\xdd\xaf\x03\x62\x8f\x01\x45\x56\xcb\xa3\x8a\x0d\xea\x11\x8a\xf8\x63\x40\x91\xb5\xf2\xa8\x6a\x03\x7f\x80\x22\x22\x18\xb4\x46\x06\x44\x1c\xc7\x71\xd1\x29\x22\x8f\x01\x45\x9e\x25\x47\xd5\x1b\xc4\x23\x14\xd1\xc7\x80\xc2\xeb\x37\xee\x7d\x8f\xd0\x33\x2a\x38\xae\xbd\x98\xe1\x9e\x1a\x8e\xd0\xb7\x06\x3d\x21\x72\xf0\x3f\xc2\x59\x21\x20\x25\x21\x96\xa0\x58\x9c\xa1\x39\x95\xe1\x14\x89\xc6\x11\x52\x09\x1e\x41\x1c\xaa\xa4\xca\x73\xb4\x8c\x00\x27\xd1\x32\x01\x38\x15\x27\x29\x06\x28\x14\x2e\x53\xac\x22\x13\x3c\xe1\x3d\x84\x16\x3c\x92\xbe\xf3\xd5\xf3\x53\xbb\x0a\xe6\xd0\x83\xc4\x34\xce\x86\x56\x4b\xef\xef\x1e\xc5\x2d\x5e\xe9\x73\x9e\x19\x22\x9d\x1c\x8e\xcd\x2c\xd7\x48\x1b\xc9\x37\xa4\xc9\x24\x5b\xe9\x38\x99\x7c\xfe\xbd\xdd\xe2\x96\x2d\xbd\x17\x87\x89\x39\x5d\xa0\x8b\x82\x5b\x3a\x2c\xec\x0a\xf4\x13\x81\xca\xdc\xf8\xe1\xa3\x7b\x3f\xde\x6a\x95\xb6\x27\x4f\x12\x60\x1e\x57\x32\x66\x63\xae\x15\x17\x55\x27\xc9\xc6\x07\xd9\x02\x59\x42\xbc\xd2\xaa\xa8\xe9\x6c\x2c\xa7\xd3\xb9\x45\xb3\x1c\xeb\x09\x0e\xeb\x9d\x92\x49\xf1\x68\xdb\x35\xe9\x68\x8b\x65\x72\x5e\x6e\x0b\x55\x9e\xad\x81\x5a\xc3\x69\x2a\xcb\x52\x32\x33\x4d\xbe\x25\x9a\x68\xfa\xae\x54\x2b\x1d\xc3\x9c\xc8\x7a\xa1\xe5\xb6\x6f\xb6\x5a\xcd\xed\xf1\x64\xb3\xb2\xec\xbe\xa5\x94\x37\x39\xbb\x2e\x35\x67\x6f\x68\x96\x29\xbf\x4f\x67\x6c\x57\x31\x97\xb2\x5a\x7f\x1f\x65\xd4\x5e\xaa\x55\x4b\xe4\x09\xd1\xab\x82\x8e\xab\x9d\xc1\x49\xbd\x31\x64\x47\x8b\xd1\xd2\x65\x2f\x49\xf1\xb0\xd6\x9c\xbf\x77\x3a\xa8\x94\x99\x83\x94\x9a\xed\xc6\xa5\xa9\x11\x37\x2b\x31\x09\xc4\xa9\x79\x31\xed\x10\xcd\x74\xcf\x61\x86\x95\xfc\x62\xd9\x2a\xd7\xc6\xc5\x77\xb5\x93\xec\xc1\x4c\x7c\x91\xd5\x2d\x3b\xcb\xa1\x92\x1a\xe3\x53\x40\xcc\xe2\xa9\x01\x5f\x7c\x23\x86\xe3\x84\xf6\xe7\x9f\x2f\xfe\x32\xf4\xb4\xaf\x7c\xfb\xf0\xd1\x27\x6b\x4f\x2e\xd2\x58\x1b\x83\x16\xa1\x68\x74\x0b\x8c\x67\x00\x19\x45\x39\x0d\x9c\xd5\xb0\xde\xcd\xf7\xf8\xa5\xa8\x99\xf5\x38\x44\x6d\xae\xa9\xa7\xcc\x00\xbc\x54\xaa\xd5\xf2\x0e\x58\x08\xf9\x24\x97\xae\xac\x3a\x2a\x99\x28\x0e\x5b\xf9\x05\x39\x1b\xbc\xdb\x0c\x9c\x13\x19\x58\xcc\x64\x70\x9b\x8e\x93\x44\xad\xd5\xac\xea\xce\x60\x7b\xe4\x61\x57\x36\xfe\x8f\x1e\xdb\x83\xbc\xab\x7b\x5d\x4d\xba\x6d\x7c\xc7\xda\xad\x59\x89\x29\xa0\x32\xd4\x86\xab\x22\x6c\x56\x78\x26\xfe\xae\xda\x3c\xc2\x65\xd3\x2a\xf5\x3a\xef\xf1\x76\x6e\x94\x32\xf3\x3b\xdd\x10\x84\x32\x6d\xe5\xca\x3e\xdd\x0f\x8c\xdf\xd1\xd8\x9d\xb9\xe2\x4f\xc6\x9f\x88\x82\x3f\xe1\xe2\x2f\x1e\x1a\x7a\xfd\xd9\x6e\x81\x13\xd8\xa1\xa1\x89\x15\x84\x2b\xcd\x26\xdb\xca\xc8\xc9\xea\x8a\xa9\xbe\x2d\x8d\xcc\x4c\x26\x9b\x49\x40\xc3\x1c\x99\xd5\xc1\xa3\xfa\x95\x9c\xc3\xb5\x16\x7f\xdb\x5f\xcb\x73\x34\xbb\xdf\xd3\x7f\x0b\x7d\x62\xba\x3a\x5b\x5e\xa3\x2f\x28\xbf\xc4\xdc\x24\x4d\x87\xa2\x67\x89\x8a\xb8\x9a\x56\xdf\x48\x33\x53\x8a\xbd\x03\xb6\xb6\xd6\x6d\x60\xa8\xc5\x54\x77\x5c\x6d\x6b\xd6\xbc\x1e\x6b\xb8\x9d\x52\xad\x26\xbe\x1d\xb8\x42\x9b\x4a\xe1\x68\x50\x66\x84\x35\x9f\xc0\x2b\x76\x5a\xd4\x16\x32\x60\x01\x68\xf2\x5c\x77\x48\x8d\x0b\xa3\x31\x5f\x65\xe9\x51\x82\x5c\x44\x97\xdf\x67\xd2\xd7\x1e\x31\xd5\x9b\xe4\x97\x72\x3f\xba\xfa\x18\x9f\xc3\x84\xd4\xea\xf4\x88\xa4\xd1\x69\x43\xab\xc5\x34\x57\x4b\xa9\x4d\xa6\x4b\x39\x6d\x3a\x21\x85\x7a\x62\x90\x4d\x4d\x69\x69\x55\xcf\xb6\xb5\x63\x7d\x7e\xc0\x5e\x3c\x62\xdf\x0a\x0c\xb7\xd5\xaf\xea\x39\xfe\x0e\xf4\xc5\x0f\x27\xe0\xfe\x1e\x7b\xde\x6a\x35\x6a\x5b\x50\x8e\xa4\x75\x6a\x8c\xc8\x9a\xc9\x02\x5e\xa8\xc6\x96\xdd\x7a\x82\x7f\xef\x2c\x3a\xad\x06\xb9\xd2\x2b\x7a\x77\x5e\x97\x40\x72\x31\xae\x16\x10\xe7\x31\xb0\xb7\xa7\xa2\x70\xec\xfb\x7d\x97\x2b\x8f\xe6\xe1\x7e\x9a\x36\x73\x4e\x4b\x99\x74\xcb\x2d\xa5\x37\x73\x3a\xd3\x46\x26\xee\x48\x72\x17\x1f\x27\xc6\xaa\x1c\xcf\xe6\x45\xad\x3d\x31\x16\xa9\xec\x00\x3e\x4a\x5f\x22\xb6\x48\x08\x99\x83\xaa\x05\xc7\xc3\xbd\x1f\x7e\xf9\xc6\x27\x92\xbf\x7d\x44\x7f\x6a\x14\x2c\x0a\xea\x9e\x72\x4e\x08\xf8\x93\x83\xff\x3c\x7b\xf9\xe6\x8f\x77\xc4\xeb\xce\xf9\xf3\x48\x7c\xb0\xb0\x96\xe7\xed\xcf\x89\x7e\x9c\x95\xbf\x4b\x6f\x37\xba\xbe\x3c\x1a\x1f\x5c\xd0\x17\xdf\x15\x94\xff\x21\x9e\x38\xf8\xcf\xa4\x8f\xd3\x3b\xed\xab\xc0\x8e\xed\xb1\x7c\x80\x17\x32\xbf\x42\x4f\xf9\xf9\xec\x7b\x64\xfc\x23\x2a\x1a\x7e\x2f\x96\xfd\xef\x47\x05\xca\x6e\x2e\xde\x7d\xcf\xe6\xee\x5c\xa9\xf7\x77\xb3\x70\x74\x17\x48\xd7\x57\xcf\xbe\x15\x9e\x44\x13\x2a\x60\x54\x55\xe2\x39\x19\xa7\x58\x44\x92\x12\x2f\x13\x48\x26\x71\x8e\xc3\x49\x12\x97\x15\xc4\x02\x95\xa3\x25\x92\xa2\x48\x05\x22\x42\xa6\x65\x89\x63\x64\x56\xa1\x14\x8e\xa2\x09\xef\x50\xed\x43\xaf\xcb\xf1\xad\xf0\xe8\x6b\x2b\x3c\x86\x03\x4c\xf8\x03\x13\x76\x77\x8f\x12\xca\x9e\x56\xde\x39\x8b\x7c\x2b\xbc\x64\x60\x78\x7d\x5a\xe0\x6a\x79\xbc\xd6\x6a\xd5\xb7\x5a\xa6\xbd\xc5\x87\x5c\x8b\xe4\x97\xc3\x2c\xa8\x5b\x3c\x63\xca\x6c\x79\x6c\x39\x03\x62\x18\x5f\xf1\x85\x72\x55\xe1\x47\xad\x96\x98\xb5\xba\x75\xcf\x6b\x45\x8f\x22\x5c\x2b\xe3\xa3\xe7\xac\x26\xa6\xf6\xfc\x54\x53\x46\x67\x09\xcd\x31\xbb\x36\xea\x0d\x65\x0d\xcb\xec\xac\x54\x64\xa9\x6e\x2c\xd7\x1c\x09\x84\x89\xcf\x65\xb6\x4d\xa4\xde\xe3\xc6\xa8\x85\x08\x5b\x7e\x9f\x14\x8b\x30\x56\xe3\x06\xad\x86\x64\x94\x69\xa3\xca\xc4\x52\x72\xa3\x48\x0f\xb3\x56\xbb\x3a\x5b\xcd\x52\xa9\x9e\x54\x1e\x09\xcb\x5b\x56\x6d\x41\xf9\x09\x51\xc6\xc3\xbb\xc4\x2f\x2c\xef\x3f\xc3\x57\x54\xbe\xb6\xf7\x46\x38\x65\xda\xca\x02\x41\x38\x5e\xd1\x68\x41\xdc\x57\x56\x54\xcf\xc3\x9f\x8c\x84\xdf\xf5\x80\x3e\x8f\xec\xdd\xba\x37\xa2\x65\xc7\xf6\xb0\x79\xc0\x5f\x14\xce\x64\x5f\xae\x79\x84\x67\xe3\x3f\xd5\xed\x50\xfc\xc1\x15\xd1\x97\x88\x48\xce\xcb\xe7\xeb\xd0\x77\x5b\xc4\xb4\x3c\x10\xed\x7e\xff\x12\x11\x76\x50\x27\xfe\x91\x2b\x00\xf7\x8a\x1f\xec\xd9\x3f\x6e\x85\x76\xe0\xef\xbc\x3e\x5d\x8e\x5a\xa3\xd8\x08\x7f\xd4\x78\x36\x43\xfc\x89\x36\xea\x1e\xfc\xdb\xa8\xb5\xdd\x52\xe3\x33\x5d\x5a\xe4\x5b\xb9\x12\x99\x33\xd9\xb9\x89\xbf\x2f\x06\x43\xca\xa8\x57\x93\x70\x58\xa7\xdf\x1d\xa9\xdb\x29\xa6\xdb\xb5\x16\x0b\x57\xef\x65\x79\xb9\xb2\xe8\xcc\x3a\xd5\x2a\xcd\x9b\xec\xb8\x95\xb4\xa8\xd6\xaa\xf8\x3e\x2e\xea\x4e\x2f\x61\xa5\xcd\x66\xcb\xb0\x99\x6a\x52\x78\x76\xd4\x8a\xf3\x32\x0e\x28\x16\x32\x84\xcc\x11\x1c\x49\x00\x84\x38\x9e\x57\x70\x59\x96\x15\x9e\x90\x39\x40\x13\x34\x42\x90\x05\x04\x8d\xb3\x04\x4e\x30\x38\x49\x00\x89\x84\x04\xc5\xf3\x34\xe2\x24\xef\xd1\x49\xe0\x91\x52\x7e\x5f\xd4\x4a\x5e\x8b\x5a\x39\x8a\x01\xe1\x0f\x7b\xdc\xdd\x3d\x2a\x3a\x78\x89\x32\x53\x7c\x51\x6b\x50\xd3\xe3\x01\x2d\xbb\x7b\x2d\x1f\x3d\xea\xf2\xe5\x82\x3c\xfc\x7b\x7a\xab\x09\x98\x19\x4c\xf5\x56\x89\x17\x29\x92\xcd\x76\x52\x72\x66\xaa\xb6\x2c\x73\x05\xea\xe5\xb7\x52\xce\x49\x8c\xe3\xc4\x40\x83\x5a\xb1\x9a\x49\xd6\x92\xe9\x6a\x31\x53\x22\x67\xc3\xba\xdc\x28\xcf\x66\x48\xb4\x4b\xe2\x7c\x91\x8f\x4d\xd8\x2c\x25\xc5\xf8\x94\x85\xd7\x48\x67\x39\x96\x35\xfb\x96\xa8\xd4\x2f\x9f\xf0\xc8\xcd\xd7\xe8\xde\xb5\x74\x20\x17\x1d\x72\x5d\x89\x9c\x9e\x87\xff\x7c\x6e\xea\x0a\xfe\x13\xab\xf8\xe9\x91\x81\x8b\xef\x96\xc8\xe5\x8b\x46\x56\x7f\x9e\xcb\x8b\xf8\x2c\xf2\xdd\x73\x89\x1d\xdb\x5b\xcf\x7a\x12\x85\xfb\xae\xcb\x1e\x46\x7c\x0c\xbf\x3f\x2f\x73\x0f\xfe\xad\x87\xc9\x99\x28\x3d\xce\x35\x49\xbc\x31\x54\xed\x81\xdc\x5a\x22\x83\x6f\xcf\x87\x99\x56\x96\xe5\xf0\x31\x9e\xef\x66\x60\x3a\x3e\x13\x56\x82\x5c\x12\x8b\x3d\x61\x29\x93\x68\x56\xca\xad\x8a\xcc\x6c\x4a\xd5\x97\x78\x9d\xe1\x2c\x46\xb5\x87\x83\x05\x8b\xb7\x17\xb5\x0c\x22\x13\xbd\x75\x62\xf9\x6c\x0f\xc3\xb2\x24\xa3\xe2\x12\xc7\xf0\x0a\xc2\x55\x96\x82\x34\x52\x58\x95\x53\x18\x9a\xe0\x79\x8a\x27\x48\x0e\x49\xb8\x8a\x53\x04\x50\x49\x55\x26\x24\x49\xa6\x48\x0e\xe7\x28\x95\x00\x32\x87\x7b\x4f\xe5\xf2\x9e\x75\x10\xf9\x58\xdf\x7d\x1e\x86\xa3\xc2\xf3\x22\xbb\xbb\x47\x45\x64\x9e\x56\xde\xb9\x0e\xbe\xc7\xc3\xdc\xb9\x7b\xf7\x48\xb6\xf8\x30\x2b\xdc\x2b\xb3\xa7\xb7\x9a\x1c\xc6\xeb\xc2\xdc\xc8\xcb\xbc\x53\x9b\xa5\xb5\x58\x79\xd4\x92\xf2\x95\x77\xca\x34\x6a\xd5\x6e\x13\x2d\xd6\x09\x75\x81\x17\x04\x63\x26\x75\xd2\xcc\xba\x22\x4d\x6b\x78\xbc\xc6\x98\xec\xd8\xd2\xc7\xb5\x31\x57\xa6\x5a\x66\x2d\x9e\xce\x0a\x8d\x6a\x9c\x22\x4a\xe5\xb6\x9c\x7a\x57\xaa\x37\xe5\x3d\xee\xf6\x30\xf7\xc6\xb6\xcf\xf6\x30\x0f\xe2\x7f\xa2\x87\xf9\xc4\xdd\x38\x8f\x94\x3b\x3d\xcc\x57\xda\xcd\xbc\xea\x61\xa2\xcf\xa5\xe7\x78\x98\x08\xf8\x1f\xf4\x30\xe5\x62\x2a\x9b\x60\x9a\xd3\x77\x02\xa4\x4d\x98\xa4\x98\x5a\xcb\x36\xdf\x2a\xba\xde\x4a\xc5\x07\x35\xe6\x2d\x9b\x8b\xbd\x55\xed\x44\x7b\xea\xc8\x92\x95\xe5\xe7\x46\xa6\x9a\xca\xcc\x86\x73\x38\xcf\xf7\xd2\xd2\x92\x1d\xb4\x07\xa2\xd8\xd5\xe2\x25\x21\x33\xec\xe2\x74\x6f\xd9\x29\x81\xe7\xaf\x61\x54\x96\x92\x15\x9a\xe2\x70\x5c\xa1\x49\x56\xc6\x19\x45\x55\x49\x5a\x96\x29\x96\x23\x25\xc4\x71\x40\x26\x14\x86\xc5\x65\x00\x68\x00\x69\x46\x86\xac\xca\xd3\x80\xa5\x39\x45\x66\x29\x40\x2b\x9e\x87\x21\x9f\xe4\x61\xae\xd6\x56\x71\x34\xce\x5c\x78\x3c\x37\x8d\x33\x87\xc7\x73\x6f\x8b\x82\x1f\xf5\x30\x17\x6a\xab\x3e\x7d\x3f\x32\xb0\x86\xf1\x79\x98\x72\x36\x5f\x37\x92\xd5\x31\xdf\xb4\x66\xc4\x7c\x38\x59\xac\x7a\xc3\xf4\x8c\x79\xcf\x55\x27\x72\xa5\x31\xe5\x16\x06\x65\x27\x12\x54\x0d\x52\xc5\xe6\x04\x66\xba\x49\x38\xaa\x75\x1a\x29\xb3\x6a\x64\x53\x82\x45\x3b\xb8\x99\x5b\x2a\xf1\xba\xcd\x34\x72\x5c\x91\x6e\xa1\xb4\x16\x97\xaa\xda\x57\xf4\x30\x91\x2c\xfc\x13\xf1\x87\x64\xaa\x3e\x65\x0d\xf3\xc9\x1e\xe6\x33\xe9\x8b\xb4\x86\xf9\x9b\x2c\xbc\xf0\x24\x0f\xe3\xcf\xd2\xdd\x83\x7f\xeb\x61\x28\x6d\x9a\x6f\x96\x12\x12\xa8\xcf\x2d\xc8\x94\xd1\x5b\x6a\x5c\x84\x96\x55\x34\x12\xca\x92\x2f\x4f\xd6\xb1\x8e\xbe\xcc\x16\x06\x29\x4b\x5b\xd5\x15\x53\xd1\x4a\xb3\x5a\x4a\x29\xb6\x07\x89\xa6\xd6\x4c\x2c\xc6\x64\x5d\x9b\xc4\xf1\x54\xfe\x7d\x5a\x9c\x2c\xdf\x8d\x16\x05\x85\x94\x93\x78\xba\x87\x91\x79\x52\xe5\x70\x86\x61\x55\x92\x55\x54\x16\x87\x04\x8f\x64\x5c\x41\x3c\xa3\xaa\x24\xc9\x01\x86\xa2\xa0\xcc\x11\x1c\xa4\x64\x04\x81\x2c\x31\x32\x92\x80\x24\x23\x99\x51\x55\x15\xa7\xb9\xc3\x53\xeb\x9f\x91\x25\xbb\xc1\xc3\x10\x17\xf6\x76\x77\x77\x8f\x8e\x78\x3c\x9a\x25\xbb\xea\x61\xca\x44\xe2\x4d\x28\x53\x74\x37\x9e\x24\x9d\x4c\x2b\x55\x06\x35\x52\xc0\x8b\x68\x54\xe1\x72\x35\x66\x52\x02\x02\x8f\xda\xba\xb2\xce\x3a\x5e\x7e\xff\x81\x2c\x59\x60\x0d\xe3\xcb\x92\xa5\x29\x83\x1d\x25\x84\x19\x0d\x67\x8b\x3a\xa1\xbc\x65\x1a\x4e\x57\x66\x0b\x02\x64\xa7\xf5\xa6\xae\x97\xa9\xfc\x3a\x9f\x93\x66\x63\x3b\xa9\x2d\xe4\x51\x3a\x41\x28\xd2\x40\xb6\x4c\xde\x91\x17\x89\x5e\x46\x5d\xce\x1a\xad\x98\x3e\x5a\x70\x99\x31\xd7\x53\x21\x43\x8e\xba\x95\x51\xb5\xfb\x15\xb3\x64\x0f\x7b\x98\x07\xf1\x3f\xd1\xc3\x7c\x62\x45\xa6\x47\xca\x9d\x1e\xe6\x2b\x55\xb4\x5e\xf5\x30\x9f\x98\xa5\x12\x9e\x94\x25\x7b\xd0\xc3\x48\x7a\x67\x5e\xcd\x26\x2c\x63\x36\xe3\x0b\x3d\x92\x53\xca\x60\xf0\x6e\xdb\x71\x6b\x6e\xe4\xea\xf9\x2c\xab\x59\x59\xd3\x98\xcf\xe0\xb2\x9c\xe0\xd7\xd5\x6e\xa1\x07\xe6\xa9\xf5\x7c\x48\x80\x35\x97\x1b\x29\x6f\x89\x69\xa9\xc3\xe4\xeb\x6f\x4b\x24\xad\x0c\xde\xb2\x50\x4d\x8b\xd5\xe2\x1f\x50\x3d\x24\x43\x45\x46\x38\xad\xca\x38\x54\x68\x85\x51\x11\x8e\xf3\x12\x27\xe1\x0a\x92\x64\x5c\x21\x15\x55\x21\x09\x04\x29\x42\xe2\x90\x04\x49\xc4\x23\xc8\x70\x32\xc1\x52\x0c\xa2\x00\xae\xbe\x78\xaf\xed\x7b\xe4\xc1\x3c\xf7\x64\xc9\x78\x9e\xbd\xf4\xb6\x15\xf7\xe6\xd1\xc1\x3f\x4f\x27\xef\xac\xd0\xbf\x2d\x47\xe6\x55\xf8\x45\xf2\x17\x9d\xc0\x7e\xae\xa7\xb3\x7b\xfc\x55\xa1\x54\xad\xbf\x2f\xa6\x62\x3c\x21\x74\x16\x36\xa8\x68\xe3\xcc\x5b\x33\x25\xa9\x42\xd7\x21\xcb\x82\xa6\x75\x2b\xad\x86\x82\x4f\x87\x2d\x39\x07\x5b\xa4\x91\x14\xdf\x86\xe5\x5e\x71\x52\x48\xf5\x8a\xa3\x94\x38\xd0\x28\xc5\x98\xb7\xaa\x2b\x94\xec\x09\xcb\x46\xbe\x59\x81\x13\xc5\x5e\xde\xb4\x22\x49\xfb\x15\x39\xcc\x5f\x08\xbe\x77\xc0\xdc\xe9\x5f\x5d\x7b\x3d\x39\xc8\x37\xe4\xba\x62\xaf\x9f\x87\x3f\x5a\xce\xeb\x50\x0f\xe3\xaf\x1f\xb9\xd3\x1e\x9f\xad\x90\x3c\xbd\x2e\xdb\xb8\x67\xe3\xbf\xa3\x42\x53\x10\xbe\xae\xbf\xbc\x96\x53\x8b\x22\xab\x87\x73\x6a\x4f\x1c\xab\x7b\xf0\x6f\xfd\x91\x00\xe2\x85\x72\x6c\x54\x15\xb3\x71\x14\x7b\x6f\xc6\x12\x5d\x95\xaf\xb6\x1c\x2e\xae\x93\x32\x95\x48\xc4\x35\xbe\x55\x22\xeb\xe3\x52\x6b\x69\x4c\x3b\xa8\x59\x6c\xc4\x8a\xf4\x68\x2d\xdb\xad\xd1\xba\xda\xac\xa7\x93\x03\xa2\x4d\xb7\x92\x29\xaa\x34\x4a\xc6\x8b\xd3\x2a\x3f\x53\x88\xf7\xe7\xaf\x78\x24\x85\xe2\x18\x45\x52\x14\x9c\x50\x28\x06\xe7\x00\xcb\xb0\x40\xa6\x20\x0d\x59\xc4\x2b\x0c\xe2\x18\x5a\x86\x04\x2f\x4b\x14\x40\x0c\xa1\xb0\x10\xba\xcb\x22\x15\x21\x5a\x22\x19\x05\x79\xfe\x88\x78\xd2\x79\xc5\x6b\xfe\x88\xc5\x71\x9c\x0a\x7f\xdb\xd1\xe6\xee\xc1\x23\x6d\x0f\x90\x3f\x7a\x5e\xf1\xaa\x47\x8a\x94\x23\x23\xcf\x79\xa4\xf4\x1e\x7f\x35\xce\x8f\xc6\xf9\x36\x31\x23\x17\x6c\x55\x5d\x73\x95\x22\x1a\x89\x12\x68\x34\xb2\xb4\xbe\x9a\x8d\xb2\x78\xdc\xd4\x3a\x56\xd9\x61\xb5\x32\x60\x88\xaa\x34\x1a\x10\x4a\xbd\xd1\x54\x51\xd2\x5c\xc8\x78\x45\x80\xea\x20\xd9\x59\x39\x83\x96\x60\xd8\x85\xf9\xd0\x88\x8f\xd7\xc3\xb8\x70\xd3\x0a\xe6\x6e\x8f\x14\xe5\xcc\xd9\x33\x3d\xd2\x83\xf8\x9f\xe8\x91\x9e\x52\xb3\x7f\x7a\xdd\x6c\xe5\x3e\xfb\xcc\x80\x20\x7c\xdd\x5d\xa8\xab\xbb\x3c\x11\x64\xf5\x4c\x8f\xf4\xe8\x58\xdd\x83\x7f\xeb\x91\x32\x44\xbd\x3b\x95\xa0\x85\xde\x9c\xf8\x5b\x61\xc9\xad\x98\x6a\x6d\xd1\x2a\x15\x87\xe3\x42\x7a\x56\x1d\x56\xd3\x7a\x1c\xd9\x0c\x39\x17\xd8\x8e\xd5\x8b\xcf\xeb\x99\x1e\xc8\x95\x6a\x3c\x55\xd6\xf9\xf7\x2a\x17\x9f\xc6\xc4\x92\x9a\x26\x52\xcd\x44\x7b\x39\x67\xca\xcd\xb4\x94\x2f\x8a\xcf\x5f\x21\x71\x00\x00\x9e\x90\x49\x8e\xa1\x48\x45\x65\x49\x19\x07\x34\xa4\x21\x50\x58\x56\xe2\x70\x42\x51\x55\x9c\x56\x28\x95\xc6\x55\x99\x51\x00\xce\x01\x06\x42\x96\x96\x71\xc8\x00\x9c\x57\x79\xe8\x79\x24\xf2\x49\xe7\x2b\x6e\xf0\x48\x44\xe8\x3b\x8b\x77\x37\x8f\x1e\x43\xf2\xe8\xe9\x8a\x4f\xf4\x47\xbe\xd3\x10\x15\x43\x63\xd3\x85\x41\x4e\xc3\x57\xec\x70\x2a\x2c\x81\xb8\x64\x32\x44\x27\xc5\xac\x6b\xd9\xb1\x9a\xcb\x2e\x53\xea\x0a\xe7\x4b\x73\x9d\x96\x9c\x72\x4e\x48\xa1\x65\x4a\x28\xa9\x65\x28\xc4\xb9\x54\xb5\x67\xd0\x53\x52\xa0\x35\x72\xc4\x24\x33\x49\x5d\x53\x9b\xa5\x66\x12\x30\x9a\xfc\x21\xfe\x28\x42\xc5\xfe\xc3\x55\x01\x4f\xc4\xff\x44\x7f\xf4\x68\x35\xee\xa3\xfe\xe8\x29\xf8\x1f\xf0\x47\x5f\x69\xcf\xea\x9a\x3f\x8a\x22\xab\x67\xfa\xa3\x28\xf8\x1f\xf4\x47\xb1\x76\xd2\xee\xce\xc5\x71\xb2\x91\x99\x97\x47\xc9\x64\xb3\x91\x34\xd5\x9e\xdc\xb1\x72\xa2\xde\xe3\x46\x43\xa1\xf5\x96\x69\xe0\x04\x53\x30\xe6\x38\x35\x12\x5a\xac\xd0\x14\x00\x47\x9b\x42\x66\xd9\x8a\x8f\x3b\xe3\x89\x9c\x1c\x27\x51\xc3\x2c\xca\xe5\x7c\x9c\xaf\x82\x6a\xa5\x33\x8b\x3f\xbd\xae\x8d\x24\x10\x25\x41\xa0\x12\x80\x93\x18\x08\x09\x8a\xc0\x25\x8a\x67\x29\x9a\x81\x40\xc2\x79\x9c\xc7\x11\xc9\x91\x2c\x62\x18\x89\xa4\x78\x1a\x27\x71\x85\x42\x8a\xc2\xe0\x0a\xae\xe2\x34\x8b\x7b\xfe\x88\x7a\x92\x3f\xba\xb6\x27\xc4\xe2\x38\xcd\x84\xbf\xff\x72\x77\xf7\xe8\x71\x56\x8f\x7a\xa4\x0b\x7b\x42\xcf\xce\xd9\xf9\x3c\x52\x31\x37\x5e\xc4\x8c\x41\x8a\xae\xf6\x0c\x4d\xc9\xce\xe2\x9d\x64\x5d\x19\x88\x8e\x66\xc1\x86\x55\xab\x2f\x5b\x16\xad\xbc\xc5\xad\x52\x82\xe0\x90\x9a\x29\x9a\xab\x6e\x09\xc6\x88\x39\xef\xd4\x45\x65\xd5\x8c\x0d\xd2\x1d\x26\x57\x6b\xb3\x4b\x21\x45\x4a\xe5\xa9\xc0\x59\xab\xd5\x4a\x10\xbf\xa2\x47\x8a\xf4\x54\x90\x27\xe2\x8f\xf4\x54\x90\x8f\xf1\x48\x21\x1e\xf2\xd3\x3c\xd2\xbd\xe7\x53\x04\xe1\xeb\x56\x82\x9f\xf5\x48\x7f\x93\x47\x10\x3e\x60\xac\xee\xc1\xbf\xf5\x48\xcb\x31\x7c\x63\xda\x62\xc7\x88\x8f\xdb\x71\x5c\x37\x53\x72\x29\x47\x88\x75\x22\xe1\x4c\xcb\x4e\xaa\x10\x6f\x2f\x0c\x92\x4b\xdb\x78\x41\x5a\xd1\x9c\xbc\x1e\xa6\x34\x60\xb1\x90\x25\x40\xb6\x46\xa6\x1a\x8c\xd8\x53\x4d\x23\x25\x2d\x04\xa1\xa3\xd8\xcc\x28\xb9\x5e\x64\x32\xa2\x50\x7d\xb6\x47\x62\x18\x86\xa1\x19\xc8\x20\xa8\x20\x02\xe7\x08\x99\x66\x39\x9c\x66\x01\xc1\xb0\x0a\x8f\x28\x8a\x26\x11\x42\x34\xcb\x01\x19\xf2\x90\xe6\x20\x24\x01\x8f\x24\x5c\x45\x1c\x49\xd1\xb4\xaa\xbc\xec\x1e\xdd\x1a\xfd\x01\xb5\xbb\x27\xbf\x5e\x70\x44\x80\xa1\x2f\xbd\x79\x9c\x3e\x6c\x44\x79\x8f\x30\xdc\x7a\xa1\x02\x97\xa9\x2e\xaa\x23\x29\x4f\x64\x04\xb2\xdd\x1a\xd6\xac\xfc\x78\xd8\xc1\x71\x35\xcd\xd9\x85\x2c\x3b\xc6\xc5\xda\x32\xd7\x7e\x13\x3a\xa4\xb0\xf7\x42\x9e\xba\x04\x86\xf4\xc4\x4a\x44\xa8\xa5\xca\xfb\xe1\xb5\x16\xcb\x14\xbf\x99\x45\x62\x5c\x49\x76\x10\x41\x36\x29\xc4\x27\x88\xfa\x6a\x1a\x2f\xf4\x6a\x2b\x60\xe5\xde\xeb\xa9\x42\x0e\x5f\x25\x93\xf8\x3c\x9f\x9e\x8e\x67\x92\x6a\x24\x1b\xb1\x4e\x27\x3b\x63\x9a\x7a\x32\xfe\x3e\x4e\xad\x9c\x58\xba\x1c\xeb\xcc\x52\x66\xb5\xa2\x58\x9d\x06\x3b\x05\x66\xa1\x97\xcd\xcc\x1a\xc5\xca\x0d\x9e\xe7\x48\x65\x8f\x3d\x8f\x8f\xe7\x83\xe5\xf5\xc7\x97\xfa\x5b\x1c\x2f\xe0\xb9\xf4\xda\x19\x2c\x4b\xc0\xe8\xe2\x70\x3d\x35\x01\x5f\xca\xac\x16\x85\xc4\xba\x4c\x3b\x71\x51\x4e\x78\x3c\x92\x9a\x63\x95\x27\xdd\x37\xaa\x78\xe8\xdf\x3c\x4b\xc4\x95\xd9\xfc\x00\xfe\x92\xb5\x6e\x54\x1f\xc0\x2f\x08\x7f\x5f\x55\xef\x59\xcb\x1a\x8f\x2e\x8b\xf2\xa4\x77\x91\xcd\x6b\xb2\x78\x74\x2c\x36\xba\x10\x93\x03\xf0\xee\x92\xc5\x7f\x3b\x55\x40\x3a\x0e\x28\x67\x16\x55\x67\x64\xc3\x6a\x9d\x68\xca\x0a\x5c\xcb\xf8\xa0\xbe\x56\x8a\xd5\x25\x5f\xd0\x07\xb3\xde\x6c\x4c\xd2\x55\xfc\xcd\x00\xeb\xfc\xdc\xc8\x6a\x4b\x99\x1e\xc8\x92\x3a\x18\x2e\x0c\x66\x00\xc5\x24\x09\x01\x1e\x63\x14\x98\x20\xea\x71\x66\xf4\x9e\x7c\x7a\xac\x2f\x01\x95\x23\x38\x92\xa3\x64\x9a\x41\x94\x84\x13\x94\x4a\x11\x2c\xad\x12\x14\x43\x73\x38\x94\xa0\xa4\xaa\x00\x22\x52\xe2\x25\xc8\x00\x09\x27\x39\x9e\x25\x69\x16\xd1\x2c\x42\x92\x4c\xe0\x9e\x65\x25\x1e\xb3\xac\xc4\x75\xcb\xca\x52\x97\x4c\xab\x77\xd7\xff\x30\xd6\x47\x6d\xeb\x85\x08\xdf\xbb\x22\x54\x11\x85\xda\x56\x75\x92\xaa\xbf\xf7\xd0\x00\xb0\xef\x0e\x47\x98\x45\x65\x86\xa8\xd8\xdb\x6a\x62\xbf\x8d\x32\x71\x25\xdd\x51\xf9\x78\x36\x5e\xeb\xaa\xad\x1e\x99\xac\x36\x48\xb8\x5c\xf6\x26\x74\x61\xa6\x65\xd3\x7c\x6e\x66\x2c\x8a\xe3\x1a\x68\xe4\xe1\x4a\x36\x73\xd5\xe4\x7c\x96\x96\x13\x75\xb9\xf8\xb5\x6c\xeb\xa3\xb6\xed\xd1\xf9\x5c\x5c\x16\xc6\xe6\x33\x6d\xeb\x27\x9e\xc9\xbb\x9a\x47\xf9\x44\xdb\x26\x3c\xc9\xb6\x72\xd4\xa1\x7f\x48\x0e\xf2\xa2\x6d\xed\xd0\xab\xa6\x4d\x74\x4c\x05\x71\xac\x5a\x9a\x25\x33\x70\x32\xaf\x2c\xb8\x1e\x5b\xa1\xe3\xcb\x4e\xcd\x20\xdf\xaa\x75\xa1\xd9\xce\x80\xb6\xb2\xc4\x45\x9e\xb0\x8b\xe9\x5e\xac\xce\x98\x89\xf8\xa2\x0e\xa7\xd2\x7b\x6e\xa4\x34\xd7\x63\xbb\x93\x4f\x34\x05\x76\x36\x98\x08\xa3\xc9\xf3\x4f\x6f\x10\x12\x81\x38\x42\x91\xa0\xb4\xb1\xab\x12\xc1\x42\x5c\x26\x01\x85\xcb\x90\x05\x0a\x07\x65\x5e\x92\x59\xc0\x91\x40\xe5\x55\x1a\x92\x92\xc2\xf0\x48\x86\xa4\xc2\x71\xaa\x84\x23\x99\x96\x3d\xcb\x48\x3e\x66\x5b\xaf\xa6\xf3\x01\xc3\x93\xa1\x07\xcf\xf7\x77\xfd\x8f\x95\x7e\xd4\xb6\x5e\x78\x5a\x92\x77\x45\x58\xbd\x87\xd8\xd6\x64\x6e\x6e\x00\xa7\x90\x2e\xa4\xa8\xd6\x6a\xe9\xe0\x4a\x32\xd1\x12\x55\xc6\x91\x68\x83\x92\xd6\x45\x2b\xad\x25\xa6\x31\xa3\xd5\x2b\x8e\x57\xb2\x43\x53\x7a\x49\x25\xc6\x2b\x67\xb8\x62\x8a\x0a\xdd\xcb\x51\x22\x95\x34\x64\x5b\xa5\x18\x51\x18\xc4\xd3\xf5\x66\xc5\x9e\x70\x6a\x37\xf9\xb5\x6c\xeb\xa3\xb6\xed\xd1\xf9\x5c\xc0\x47\x8c\xf0\x44\xdb\xfa\x99\x79\xe1\x8f\xb0\xad\x51\x6d\x9b\xf0\x24\xdb\xca\xfa\x06\xa0\x78\xb7\x2c\xfe\xbb\x96\xa6\x8a\x54\x5f\xe9\x2b\x94\x92\xe5\x82\x92\xa9\x2e\x8d\x5a\x26\x66\xb5\x63\x3d\x94\xe6\x86\xf9\x95\x29\xcc\xd4\x69\xab\xdd\xc8\xd9\x9d\x02\x42\xd9\x61\x87\x9f\xda\x52\x97\x43\xc3\x0c\x6a\xd7\x51\xbc\x2c\xd0\x9d\x42\x26\x56\x1e\x08\xd9\x6a\x6d\x64\x24\xd9\xdc\x5b\x86\x10\x9e\x1e\xb7\x22\xc0\x4a\x10\xd1\x34\xa1\x40\x1c\xe0\x34\x54\x48\x42\xc5\x25\x1e\x42\x45\x55\x70\x95\x21\x48\xa4\x92\x2c\x92\x28\x8e\x91\x00\x2e\xe1\x14\x25\x03\x9e\x20\x39\x92\xc1\x11\x45\xd3\x0a\xeb\xd9\x56\xea\x31\xdb\x7a\x35\x35\x0d\x58\x00\xc2\x4d\xab\x77\xd3\xff\x78\xfc\x47\x2d\x6b\xd0\x95\x9f\x58\xd6\x08\xb5\x8c\x61\x96\xb5\xdb\x55\xd7\x65\x6b\x5c\x19\xa8\x23\x9d\x31\xac\x4a\xcc\x4c\xa8\xf3\x49\x6e\x5c\x9b\x13\x63\x75\x65\x50\xb8\x49\xcf\xda\x35\x76\x0d\xba\xe3\x0a\x37\x35\xd3\x31\xa6\x33\xd3\x28\x30\xcc\x27\xda\xa5\x65\xcb\xac\xb0\x80\x4d\xb4\xc4\x0a\x62\xf1\x2c\xee\xa0\xf6\xa2\x81\x86\xa3\xdc\xd7\xb2\xac\x8f\x5a\xb6\x47\x67\x73\x9e\x8a\x95\xba\x4f\xb4\xac\x9f\x59\x93\xf8\x11\x96\x35\xaa\x65\x13\x9e\x64\x59\xe9\xe5\x55\x44\x97\x2c\x2b\x91\xce\x70\xc3\x19\x3d\xa4\x3a\x74\x76\x3e\x85\xef\x6f\x33\x61\xc2\x4e\xd7\xbd\x91\xe4\x4c\x27\x5c\x0f\x95\xf2\x65\x68\x8c\x10\xe7\xb4\x73\xc3\xb7\x3c\x8c\x2f\xe6\x06\x63\x96\x4b\xdd\xb5\x66\x0c\xe5\x14\x4c\xc6\x78\xb4\x34\x6a\x49\x72\xce\x27\x4a\x85\x8e\x61\xe1\xa4\x49\x27\x9e\x9e\x6b\x95\x55\x85\xe3\x00\x83\x14\x9a\x63\x65\x1a\x29\x1c\xa7\x20\x88\x23\x09\xc7\x39\xc0\xc9\x50\x25\x39\x19\x67\x69\x1c\xb1\x2c\x85\x23\x9c\x56\x10\x29\x13\x2c\x60\x19\xc4\x43\x84\x38\x84\x3c\xcb\x4a\x3f\x66\x59\xaf\x3d\xe4\x93\x05\x2c\xcf\x72\x17\x4c\x2b\xcf\xf2\x2f\xc7\x2f\xfa\x78\xd4\xb6\xa6\x02\x83\x7a\x62\x5b\x23\x54\xe5\x85\xd9\xd6\xd2\xb8\x3a\x50\xaa\x68\x5d\x94\xdb\xa9\x76\x85\x53\x5a\xb5\x51\xd2\x49\xd5\x29\x27\x93\x4d\xac\xf3\x0a\xac\x8c\x6a\x4c\xec\xad\xc0\xc6\x9c\xe2\x7b\xbe\x6d\x36\x87\x52\x52\xe8\xd8\x72\xad\x9b\x8d\x0d\x99\x94\xf2\xd6\x4a\x35\x61\xf2\x5d\xe9\xda\xed\x84\x60\x67\x48\xbc\x3d\x1f\x66\x0b\x5f\xcb\xb6\x3e\x6a\xdb\x1e\x9d\xcf\x39\xbe\xa3\x2d\x9f\x99\x11\xf8\xc4\xea\xba\x8f\xb0\xad\x51\x6d\x9b\xf0\x24\xdb\x1a\x35\xf3\xbe\xb5\xad\xef\xbd\x51\xb6\xd3\xcc\xd8\xc3\x4c\x6a\xd0\x1a\xbe\x65\x5a\xcd\x9e\xc0\xd6\x9a\xf3\x42\x6d\x2d\xd8\xfa\xa4\x3d\xa4\x45\xb4\x58\xac\x63\x6f\x56\xa3\xb8\x36\x66\xa9\x2c\xb1\x5c\xa6\xd8\x8c\xd8\x4e\x54\xcc\xd8\xa0\xa3\x82\x5a\x2b\xad\x71\x64\xbb\x90\xd2\xb4\x42\x9c\xe7\x53\x96\x79\xf3\x13\x83\x8e\x5f\x1f\xe4\xbd\x5e\xd7\x76\xa0\x63\xfb\x3f\xf7\xa7\x23\xb4\xde\xbd\x86\x27\x51\x2e\xd5\x1b\x35\x21\x5b\xba\xf6\xc6\x20\xa1\xd0\x10\x6b\xdb\xb7\xf6\x94\x4b\x85\xae\x1f\xe2\x6f\x18\x86\x61\x42\x32\xe9\x83\x76\x82\x10\xab\xd4\xb2\x45\xa1\xd6\xc5\xf2\x62\x17\xfb\xae\x2b\x27\xd4\x6a\xa6\x35\xed\x8f\x75\x6d\xf7\x6e\xca\xc0\xf7\x27\x51\x1d\x80\x7a\x8e\xf2\x73\x88\xaf\x52\xbf\xf3\x64\x2e\xdb\x76\xe0\x6b\xff\xf0\x7e\xe4\xfe\xe1\xad\xc8\x7d\xff\xeb\x8f\xfb\x4f\xe1\xee\x18\xed\x39\xe6\x22\x11\x86\x35\x4b\xd9\x6a\x53\xc4\xbe\x1f\x9a\xbf\x62\x87\xf6\xbb\xcf\x5e\x87\x3b\x45\xf3\x9c\x61\xbd\x9b\xf1\xbb\x06\x75\xff\xc6\xd4\xe3\x17\x79\x5d\xbe\xfd\x64\xce\xce\x23\xb9\xc4\xe9\x05\xb2\x6e\xe6\x3c\xf4\x25\x66\x57\x5f\x13\xf6\x5c\xee\xc3\xd0\x5c\xe2\xff\x22\x69\x57\x25\xe0\xa9\xb4\xb4\x76\xb5\x7d\xc7\x48\xb6\x94\x14\x3b\x57\x78\x48\xd4\x44\xa1\x21\x7a\x4d\x8f\xa1\x60\xe5\x52\x70\x32\x34\xeb\xd9\x52\x1a\x93\x1c\x0b\x21\xff\xec\x0a\xa7\xc6\x9b\x63\x8f\xd3\xe3\xc1\xb9\x8d\xa2\x90\x79\x2d\xad\xfb\xdb\x17\xfa\x46\x26\xe7\x00\xc2\x4f\xc9\xd1\x6a\xe0\x98\x1e\xaf\xf1\x2b\xb6\xfd\xd0\xb7\xd1\x6c\x8e\x26\xf2\xa9\xc0\xa4\x75\x5f\x45\xe8\x3e\x02\xa7\xa6\xed\x68\x16\xb2\xcf\xd2\xe9\x83\x76\x1b\xad\xbe\x0e\x3f\xb0\x76\x46\xac\x89\x98\x1f\x46\xb6\x8e\x95\xca\x0d\xd7\x87\xff\x71\x42\xfa\x00\xda\x83\x27\xd0\xbc\x01\x73\x1b\xb1\xfe\xb9\xb2\xe9\x75\x4e\x9e\xfa\x64\x82\xac\x67\x91\x76\x00\x76\x1b\x81\x5e\xfb\x13\x32\xb7\x82\x3d\x7f\xf7\xb2\x8c\x0d\xa4\x68\x0f\xcc\xa4\x3d\x84\xdb\xe8\xf7\xda\xee\xf5\xf5\x15\x83\xd3\xa9\xa1\xcb\x9e\x7d\x36\x2d\x25\xc4\x6f\xf6\xd1\x66\xb2\xba\xf7\x23\x50\xba\x75\xdb\x1e\xc1\x01\x70\x7e\xb2\x91\xaa\x22\x39\x38\xf7\x4f\xdd\x88\xae\xbc\x62\xdf\xdc\xce\xdf\xc2\x88\xd5\x95\x27\x91\xa9\x2b\x37\x13\xb8\xb3\x05\x1b\xf2\x22\x10\x6d\x4e\xfb\xd3\x67\xd1\xbd\x85\xe5\x27\x3d\x24\x76\x88\xc4\xc9\x79\x06\x9c\xd5\xf3\x18\xd8\xc2\x0a\xd1\xe9\x88\x2c\xf8\x21\x9c\x63\xc2\x9c\x6e\xb4\x72\x60\x46\xe2\x61\x4b\xfc\x01\x46\x54\xe1\x5f\x16\xb4\xbd\x9d\xed\xae\xef\x7c\x5c\xd6\xc7\xe0\xfc\x24\x7b\xbf\x07\xad\xdf\x59\x8a\xfc\x72\x7d\x16\x59\x27\x30\x6f\x34\xcf\x67\x08\x74\xbc\x21\x71\x1e\x19\xd6\x03\x8c\xe8\x2a\x79\x4d\xfd\x1c\x4b\xd9\x20\x91\xa0\x7d\x67\xbc\x70\x96\xe0\x53\x60\x01\xca\x15\x14\xa0\xd3\xdf\xf6\x2a\x81\xa6\xaa\x3e\xe0\xb4\x4e\x41\xdd\x44\x9c\xdb\xf2\x12\x69\x2e\xed\xc8\x7a\x9a\xf8\x02\xf0\xae\x11\x19\x68\x7e\x0b\xa5\xcf\x91\xe3\x11\xb4\x5b\xa9\xbc\x2a\xcd\xe7\xd0\x76\x13\x4d\x97\x69\xd9\x51\x6c\x98\xe6\x68\x3e\x7d\x8c\xa2\x63\x58\x37\x8f\xa8\xb7\x00\x09\xa1\x6f\x0a\x75\xab\xef\xe8\x63\xf4\x14\x0a\x83\xd0\x6e\x9b\xb7\x5b\x02\x5f\xb1\x20\xc9\xaf\xd8\xd6\xc4\xcb\x86\x69\x23\xa5\x0f\x9d\x10\x26\x9e\x60\xb7\xb7\x70\xae\x51\x7c\x67\x74\xb4\x81\xfa\x34\xe9\xde\x21\xd8\xab\x72\xd3\x27\x0a\x5a\xf5\x03\x21\x87\xdd\x37\x27\x7d\xa8\x28\x16\xb2\xed\x47\x05\x7a\x15\xc1\xd1\xc2\x79\x7b\x3b\xb0\x54\xf5\x1a\xde\x41\xfb\xe3\x7a\x70\x09\xf6\x75\x8a\xcf\xcc\xb2\x63\x80\xdb\x28\x7c\x03\xcf\x59\x4f\xa3\x27\x45\x2e\x42\xbd\x1a\xf6\x6f\x1a\x5d\x21\x74\x1b\x43\x6d\x40\xee\x95\xe8\x49\xd4\x9e\x03\x7d\x35\x7c\xbb\x55\x93\x7d\xc0\x9f\xad\x0c\x47\xa0\xa3\xc4\x9b\xe1\xe0\xc6\x53\xd3\xda\x18\xbe\x05\xb2\x6c\xdd\x9c\x3c\x5f\xd0\x41\x0c\xd7\xc9\x0f\x74\xb8\x9d\x99\xad\xe9\xb9\x3d\xc9\x11\x41\xfe\x3e\x1c\x57\x39\xf1\xb5\xbd\x9d\x89\xa9\x85\x16\xba\x39\xb7\x3f\x85\x9b\x73\xc8\xae\xb2\x75\xae\xd3\xed\xfc\xed\x92\x28\x1f\xc6\xd3\x0e\xc1\x55\x3e\x42\xd3\x8f\xc7\xa0\xf7\xfe\xf6\x43\xa6\x76\x10\xfa\xd9\x05\xf0\xbd\x13\xfc\x18\xe8\xf1\x12\xea\x49\x33\xfc\x12\x8a\x5b\x78\xb8\xb2\xae\xbb\x88\xec\x79\xee\xeb\x14\xf0\x4d\xb4\x5f\x77\x62\xfe\xc5\xf6\x47\xa8\xcd\x29\xfc\xc8\x4b\x7d\x37\x88\xdb\x3b\xf2\x5d\x86\xb1\x2f\x99\xe6\x28\xb2\x94\x2f\xc0\xbc\x1a\x22\x7c\xff\xae\x20\x07\xea\x86\x8d\xfd\xfc\xf7\xbf\xb1\x17\xdb\x34\x14\xdf\xf6\xe6\xcb\xaf\x5f\x0e\x5a\x39\x3f\x7e\xbc\x62\xe1\x0d\x65\x53\xb9\xad\xa1\xb7\x39\x12\xde\x54\x32\xe7\xda\xc0\xb9\x09\xfd\x51\xd3\xcb\x04\x1c\x35\x0d\x90\xb0\x4b\x8a\xbb\x4a\x86\xfd\x89\x91\xe4\xcd\x95\x01\xba\xd2\x57\x7d\xfb\x76\xa9\xfc\xe7\xd4\x07\x6c\xd1\x62\xa9\x72\x4d\xcc\xa6\x4b\xfb\x3d\x39\xac\x26\xa6\xc4\x9a\x58\x4a\x88\xf5\xc0\x36\x95\x7b\xb7\x5c\xc2\x9a\x95\xe4\x46\x65\x6a\x62\xbd\x51\xcb\x26\x1a\x9b\x9f\x92\x62\x41\x6c\x88\x58\x42\xa8\x27\x84\xa4\x78\x61\x63\x73\xb3\xee\x38\xfe\xda\x0f\xa4\x62\x9e\x27\x8c\x63\x3c\x57\x76\x2d\xc3\x28\x39\x96\x4f\x30\x6d\x74\x56\x58\xdb\x40\xff\xca\x16\x6f\xa8\x24\xb6\x4b\xd9\xbf\x5d\x0e\x7e\x3a\xce\x49\x61\x97\x25\xb8\xac\x30\xf7\x49\xe0\x34\xa9\xf4\x37\x8a\x21\x84\x98\x63\x59\x9c\x49\x83\x3d\x57\x29\x82\x29\x8e\xaf\x20\x90\x70\xd5\x38\xc9\x21\xdd\xa2\x1d\x18\x54\x14\xa4\x60\x63\x38\x99\x43\xc3\x58\x1f\x51\x9a\x4d\x61\x62\x27\x5b\x6f\xd4\x3d\x9a\x3d\xce\x7e\x1f\xa1\x75\x7f\x01\x8d\x39\xea\x6f\x20\x22\x2c\x59\x2b\x57\xfc\x84\x1f\x7a\x05\x5a\x7a\x25\x12\xbf\xb9\xed\x83\x08\xce\xc3\xfe\x63\xe7\x22\xbd\xe6\x41\xcc\xdf\x5d\xb9\x5d\xbc\x36\x42\x92\x07\xd0\x82\xb2\x83\x2c\x6c\x01\xad\xb5\x3e\xd1\xbe\x13\x34\xfd\x63\xbf\x53\xfa\x7a\x1d\x8a\x8b\xf4\x1a\x9c\xdf\x02\xb5\xbe\x41\x6a\x0f\x07\x28\x56\xd3\xbe\x3e\xd1\x90\xed\xf4\x0d\xb8\xf9\xe3\x46\xda\x2f\xaf\xd8\x0b\xfe\xf2\xe3\x8f\x53\x5d\x09\x00\x3a\xa7\x2c\xe7\x24\x7d\x5c\xf1\x31\x42\xeb\xcd\x88\x1f\xc9\x73\x9f\x30\xb1\x75\x6d\xb2\x89\xf5\x6f\x10\xe8\xae\xd3\x19\x69\x30\xd4\x8f\x1b\x64\x89\x79\xc8\xa2\xf7\x5f\x22\x5d\x1b\x38\x98\x3e\x71\x90\x86\xac\xc0\x30\xfe\xfc\x89\x2d\x11\xb6\xd4\x0d\x03\x9b\xcd\x91\xb5\xc6\xa4\xf5\x0e\xa1\x6d\x62\xce\x00\x3a\x98\x6e\x63\xcb\xc1\xfe\x57\xdd\xc6\x9c\x01\xc2\x54\xdd\xb2\x1d\x4c\x77\xd0\x18\xd3\x27\xee\x2f\xb2\x39\x9e\x9a\xb6\xee\xa0\x8d\x70\x6f\x20\xeb\x48\xda\x1e\xf0\x7d\xd9\xc6\x8f\x8d\x6e\x6c\xed\x4e\xc5\xab\x12\xa8\x57\x0b\x98\x02\x1d\xb8\xb1\xe7\x98\x32\x1f\x4f\x5d\x84\x06\x72\x90\x6b\x30\xfe\x6f\x00\x00\x00\xff\xff\x82\x8f\x9e\x4b\x30\x29\x01\x00") +var _pathed_paymentHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x7d\x69\x93\xaa\xc8\x12\xe8\xf7\xf9\x15\xc4\x89\x1b\xd1\xe7\x84\x7d\xa6\x29\x76\xce\xbc\xb9\x11\xa8\xb8\xef\xbb\xde\x98\x30\x0a\x28\x10\x45\x51\xc0\xad\x6f\xdc\xff\xfe\x42\x70\x41\x14\x17\xb4\x7b\x7a\xde\x23\xce\xf4\xa8\x54\xe5\x56\x59\x99\x59\x59\x59\xf0\xf3\xe7\x6f\x3f\x7f\x62\x15\xd3\x76\x34\x0b\xd5\xab\x05\x4c\x81\x0e\x94\xa0\x8d\x30\x65\x3e\x9e\xfe\xf6\xf3\xe7\x6f\x9b\xfb\xc9\xf9\x78\x8a\x14\x4c\xb5\xcc\xf1\xa1\xc1\x02\x59\xb6\x6e\x4e\x30\xfe\x77\xe6\x77\xe0\x6b\x25\xad\xb1\xa9\xd6\xdf\x74\x0f\x34\xf9\xad\x2e\x36\x30\xdb\x81\x0e\x1a\xa3\x89\xd3\x77\xf4\x31\x32\xe7\x0e\xf6\x27\x86\xff\xe1\xde\x32\x4c\x79\x74\xfa\xab\x6c\xe8\x9b\xd6\x68\x22\x9b\x8a\x3e\xd1\xb0\x3f\xb1\x97\x66\x23\xc5\xbd\xfc\xb1\x03\x37\x51\xa0\xa5\xf4\x65\x73\xa2\x9a\xd6\x58\x9f\x68\x7d\xdb\xb1\xf4\x89\x66\x63\x7f\x62\xe6\x64\x0b\x63\x80\xe4\x51\x5f\x9d\x4f\x64\x47\x37\x27\x7d\xc9\x54\x74\xb4\xb9\xaf\x42\xc3\x46\x47\x68\xc6\xfa\xa4\x3f\x46\xb6\x0d\x35\xb7\xc1\x12\x5a\x13\x7d\xa2\xfd\xb1\xa5\x1d\x41\x4b\x1e\xf4\xa7\xd0\x19\x60\x7f\x62\xd3\xb9\x64\xe8\xf2\xeb\x86\x59\x19\x3a\xd0\x30\x37\xcd\x84\x42\x43\xac\x61\x0d\x21\x5e\x10\xb1\x6c\x0a\x13\x3b\xd9\x7a\xa3\x8e\x95\x4b\x85\xee\xb6\xfd\xef\x03\xdd\x76\x4c\x6b\xdd\x77\x2c\xa8\x20\x1b\x4b\xd6\xca\x15\x2c\x51\x2e\xd5\x1b\x35\x21\x5b\x6a\xf8\x3a\x1d\x37\xec\xcb\xe6\x7c\xe2\x20\xab\x0f\x6d\x1b\x39\x7d\x5d\xe9\xab\x23\xb4\xfe\xe3\x33\x10\xca\xee\xa7\xcf\x40\xb9\xd1\xab\xcf\x63\xd0\xc3\x76\x3f\x77\x1e\x81\x1b\x45\xbe\x84\xcc\xd7\xea\x00\xdc\x6d\x9e\x2d\x25\xc5\x8e\xaf\xe5\x16\xac\x4b\x55\x1f\xa9\x2a\x92\x1d\xbb\x2f\xad\xfb\xa6\xa5\x20\xab\x2f\x99\xe6\xe8\x72\x47\x7d\xa2\xa0\x55\xdf\xc7\xdc\xc4\x86\xae\xa2\xdb\x7d\x73\xd2\xd7\x95\x7b\x7a\x9b\x53\x64\xc1\x7d\x5f\x67\x3d\x45\x0f\xf4\x3e\x50\xf2\x10\x15\xf7\xf5\x35\x90\xa2\x21\xcb\xed\x68\xa3\xd9\x1c\x4d\xe4\xbb\x58\xf0\x75\x9f\x5a\x68\xa1\x9b\x73\x7b\xfb\x5b\x7f\x00\xed\x41\x44\x50\x8f\x43\xd0\xc7\x53\xd3\xda\x4c\xc7\xad\x4d\x8d\x0a\x26\xaa\x2c\x65\xc3\xb4\x91\xd2\x87\xce\x3d\xfd\x77\xca\x1c\x41\x95\xb6\xf3\x32\x02\xd1\xfe\x9e\x50\x51\x2c\x64\xdb\x97\xbb\x0f\x1c\x4b\x71\xfd\x4e\xdf\x30\xcd\xd1\x7c\x7a\x43\xeb\xe9\x35\x92\xbc\x56\x50\xb7\xee\x04\xbc\x33\xba\x37\x77\xd8\xd8\x09\x55\x45\xd6\x6d\x4d\x77\xe0\x23\x74\xd9\x8a\xf5\xb6\x4e\xae\x69\xbd\x03\x89\xdf\x14\x5f\xeb\x31\xdd\x74\x18\x38\x57\x47\xc0\x3e\x32\x40\xd2\xfa\xaa\x1a\x0d\xf6\x33\xfd\x96\xc6\xa6\x47\x87\x79\xb5\xa1\x6e\x3b\x7d\x67\xd5\x9f\x5e\x07\xb9\x69\x69\x4e\x6f\x6d\x89\x6e\x6d\xb6\x73\x25\x97\x1b\x4b\xbb\xe9\x7e\xb5\xd9\x75\x2b\x26\xad\x6f\x1b\x4c\xcf\x47\x6e\xa4\x6d\xdb\xf3\x6b\x98\xf7\x8d\x65\x53\x41\x77\xc6\x05\x7b\x35\x98\x42\xcb\xd1\x65\x7d\x0a\x27\x17\x9d\xf7\xb5\xae\xfd\xe9\x9d\xb1\xc9\xde\xa3\xdd\x4b\xc1\xf9\x8e\x77\xe3\x77\x85\x77\x0b\x3e\xaf\xe1\x87\xc3\xf7\x06\x73\x33\x92\xdb\x8f\x1b\xff\xb0\x0b\xfd\x5c\x65\xe8\xdf\x48\x81\x66\x5a\xd3\xfe\x58\xd7\xb6\x01\xc3\x05\x12\x02\x2d\x6f\xe6\xf1\xfe\x78\xef\x12\xe4\x5b\x95\xd3\xeb\x9d\x28\x17\x9a\xc5\x12\xa6\x2b\x1e\xe6\xa4\x98\x12\x9a\x85\xc6\x8d\xb0\x43\x94\xee\x09\x90\xb7\xc3\x7d\x19\x92\xfb\xed\x76\xf6\x77\x5e\xba\x2e\x56\x9b\x62\x29\x11\x41\x66\x9b\x38\xdb\x46\xb3\xbb\x31\x1f\x01\xb9\xb9\xb7\x82\x6e\x6c\x7b\x88\x66\x6f\xe6\x30\x64\xd6\xdf\xc3\xdf\x79\x10\xb7\xf5\xdd\xc6\x7d\xb7\x35\xde\x06\x79\x37\xf3\xb6\xb5\x00\xf7\xf0\xe2\x75\xb9\xb1\xed\x36\xfc\xbb\x9d\x9e\x5d\xbc\x78\x0b\x45\x01\x1b\x72\xb9\xb1\xcf\x24\x6c\x1b\x0a\xe9\x74\x4d\x4c\x0b\x8d\x33\x8d\xc7\xfa\x66\xc5\xa1\xcb\xe8\xfb\x64\x3e\x46\x96\x2e\xff\xe7\xaf\x1f\x37\xf4\x82\xab\x08\xbd\x0c\x68\x3b\xdf\xe1\x64\x8d\x0c\x37\x15\x73\x43\x0f\x55\xb7\xce\x76\x49\x35\x4b\x89\x46\xb6\x5c\xba\xc0\x4f\x1f\x6a\xda\x81\xba\x57\xec\x84\xd0\x0b\x30\x76\xdc\x3d\x00\x63\xc3\xab\xdb\xfd\x40\xfc\x2b\x76\x0f\x23\x2e\xeb\x37\x40\x10\x3b\x0d\xb1\x54\x0f\x80\x30\xa6\x9a\x3d\x33\x76\xba\x98\xc8\x88\x45\xe1\x04\xc3\x1f\xbf\x79\x59\xb8\x12\x1c\xa3\x5f\xbb\xdf\xb0\xc6\x7a\x8a\x7e\x6d\xbb\xfc\x81\xd5\xe5\x01\x1a\xc3\x5f\xd8\xcf\x3f\xb0\xf2\x72\x82\xac\x5f\xd8\x4f\x37\x39\x97\xa8\x89\x9b\xf1\xda\x42\xde\xc1\xfb\xed\x08\xe2\xf1\xcd\x2d\xe0\x44\xb9\x58\x14\x4b\x8d\x0b\x90\xbd\x06\x58\xb9\x74\x0c\x00\xcb\xd6\xb1\x97\x5d\xda\x6d\xf7\x9b\xed\x02\x79\x09\x62\xde\xb1\xbf\xc5\xb9\x97\xd0\x55\x7e\x8e\x64\x59\x2a\x37\x02\xf2\xc4\xda\xd9\x46\x66\x4f\x96\x3f\xff\x76\x84\xfe\x00\x25\x40\xc8\x3d\xcc\x9f\x00\x71\x05\x50\x29\xbc\x4d\xb5\x7a\xb5\x80\x4d\x2d\x53\x46\xca\xdc\x82\x06\x66\xc0\x89\x36\x87\x1a\x72\xc5\x70\x63\xbe\xd0\x4f\xee\x75\x45\xdb\x92\xbf\xd3\xd5\x03\xfd\xbb\xb1\x3d\x27\xcb\xbd\x66\x5f\x85\x8f\xd5\xc4\x46\xb3\x56\xaa\xfb\x7e\xfb\x0d\xc3\x30\xac\x20\x94\xd2\x4d\x21\x2d\x62\x2e\xf7\xc5\x62\xd3\xb3\x77\xf5\x46\x2d\x9b\x68\xb8\x2d\x84\x3a\xf6\xaf\xfe\xbf\xb0\xba\x58\x10\x13\x0d\xec\x5f\x60\xf3\x2d\x38\x1a\x57\x27\xe2\x63\xdc\x5d\x03\xff\x34\xe6\x88\x73\xcc\xdd\x62\xa9\x1e\xe3\xef\x06\x0c\x7b\x16\xf7\x3f\x45\xe2\xf0\xfb\x6f\x18\x96\x10\xea\x22\xd6\xce\x88\x25\xec\x5f\xe0\x3f\xe0\xaf\xb7\x7f\x81\xff\x10\x7f\xfd\xfb\x5f\x84\xfb\x99\xf8\x0f\xf1\x17\xd6\xf0\x6e\x62\x62\xa1\x2e\x6e\x84\x22\x96\x92\x3f\xce\x4a\xe6\x06\x3f\xf0\xa0\x64\xae\x63\xf8\x68\xc9\xfc\x9f\x28\x92\x39\xf5\xa9\x5b\x39\xec\xfd\xf0\x6d\x82\x38\xb8\xed\x13\x88\x2e\xc5\x18\x56\xdf\xc8\x0a\xfb\xf3\x60\x01\x5e\xbd\x9f\x1b\xdd\x8a\x88\xfd\xe9\x9f\x11\x3f\xce\xcd\xda\xa7\xd2\x18\x04\x18\x20\x71\x37\x8d\x6f\xa7\xf0\x6c\x08\xf4\x28\x95\xe7\x80\x06\x28\x3d\x9a\x90\xc7\xe4\x1e\xb4\xec\x94\xda\x73\x61\xde\xc3\xd4\x9e\x01\x1a\xa4\xd6\x3f\x49\x2e\x52\xbb\xf1\x5c\x0a\x52\xe1\xdc\x70\xfa\x0e\x94\x0c\x64\x4f\xa1\x8c\xb0\x3f\xb1\x97\x97\x3f\x8e\xef\x2e\x75\x67\xd0\x37\x75\xc5\xb7\x95\x76\xc4\xab\x3f\xfe\xdd\xb2\xe8\x4e\xb0\xdb\xd8\xf3\xe6\xa2\x7f\xf1\xed\x71\xa4\x2b\x98\xa4\x6b\xfa\xc4\x71\x03\x83\x52\xb3\x50\xf0\xd8\x81\xe3\x4d\x18\x8f\xc9\x03\x68\x41\xd9\x41\x16\xb6\x80\xd6\x5a\x9f\x68\x81\x66\x93\xf9\x78\x1f\xf2\x63\xfa\xc4\x41\x1a\xb2\x02\x4d\x54\x03\x6a\x36\x66\x8f\xa1\x61\x9c\xa2\x71\xcc\xb1\x71\x8a\xe4\x3b\x41\xd3\x3f\xf6\x2d\x4f\x87\x3d\xb8\x6e\x88\x2a\x8e\x60\xb6\x63\x2f\x12\x07\xad\x4e\x04\x32\x9d\x1a\xba\x9b\xb3\xc7\x1c\x7d\x8c\x6c\x07\x8e\xa7\xd8\x66\xcc\xdc\xaf\xd8\xbb\x39\x41\xa7\x84\x86\xad\x8a\x76\xf1\xe8\x76\x39\x75\x1b\xcd\xfb\xc5\x57\x08\xd4\xad\x1a\x0a\xb5\x86\x17\xd1\x01\xf7\x87\x6c\x29\x51\x13\xdd\xf0\x2b\xde\xdd\xfe\x54\x2a\x63\xc5\x6c\xa9\x25\x14\x9a\xe2\xfe\xbb\xd0\x39\x7c\x4f\x08\x89\x8c\x88\x81\x6b\xcc\x44\x16\x7b\x10\xd0\x89\x2a\x6e\x93\x1e\xd8\x04\xad\x9c\x05\x34\xbe\xbf\x84\x70\xfc\xf2\xeb\x97\x85\x34\xd9\x80\xb6\xfd\x23\x38\x5c\xde\x5e\xc5\x19\xdd\x62\xa8\x1f\x17\x06\xca\x5b\x1b\x3f\xcc\x99\x97\xd1\xd9\xf3\x75\x7e\x66\x1c\x72\x75\xe7\xc9\x3c\xdb\x5c\x36\x95\x73\xcd\x01\x71\xbe\xb9\x97\xfe\x3b\xd3\x81\x66\x2e\xcd\xb0\xf3\xe9\x85\x27\xa9\xad\x1f\xe6\xa7\x29\xed\x25\x46\xb0\x72\xbb\x24\x26\xb1\x78\xf7\x0a\x47\x5e\x86\xee\x32\x43\x7b\x58\x81\xdb\xbf\xeb\x4a\x18\x6d\xbb\x9c\xcf\xa3\x5a\xb7\x85\xb3\x55\xbb\xc0\x9c\xe9\x87\x59\xfa\xd3\x14\x57\x58\xcb\x6f\xee\xc6\xc7\xb7\x10\x6d\x76\xf5\xf8\xfc\x2d\x05\x39\x50\x37\x6c\x6c\x68\x9b\x13\x29\x5c\xd9\x76\x89\xb2\x47\xe5\xb0\x85\xb3\x95\xc3\x6e\xdf\x3a\x84\x36\xdf\x66\xf2\x4d\xb3\xf0\xdc\x3e\xf6\xf9\x8e\x5b\xb1\xf8\x32\xa3\xee\x40\xec\xe9\xd8\x59\x39\x3c\x80\xe1\x30\x10\xb7\xb5\xdf\x6f\x26\x07\x1c\x93\x39\x77\x0e\xbe\x29\xd8\xc7\x42\xd0\xb9\xda\xc9\x6b\x3b\x9f\x2a\x37\xb7\xdd\xab\xce\xf6\x6b\x60\x9f\xfd\x84\x17\x70\x12\x0f\x38\xd0\xe8\xcb\xa6\x3e\xb1\xcf\xeb\xa0\x8a\x50\x7f\x6a\x9a\xc6\xf9\xbb\xee\xce\xa7\x8a\xc2\xc6\xda\xbd\x6d\x21\x1b\x59\x8b\xb0\x26\x9b\x38\xd4\x59\xf5\xdd\x30\x49\x7f\x0f\x6b\x35\xb5\x4c\xc7\x94\x4d\x23\x94\xaf\xe0\x18\xed\x94\x05\x41\x05\x59\x6e\x78\xe1\xfd\x6e\xcf\x65\x19\xd9\xb6\x3a\x37\xfa\xa1\x8a\xb2\x65\x1c\xea\x06\x52\xae\xb5\xda\x92\x1e\xa2\x42\xe1\x53\x2f\x24\xbf\xfd\xe8\x4c\x0c\xd9\x33\xb9\xe2\x17\x6f\xb7\x48\xd7\x6d\xdc\xbd\x2c\x3f\xd7\xd5\x5d\xc4\xf1\x59\xae\xef\x2e\x46\x1f\x74\x85\x17\x71\x9d\xba\xc6\xf3\xcd\x2f\xb8\x4a\xdf\xee\xcf\xd3\x74\xf3\xda\x52\xe8\xb8\xf2\x2a\x64\xb9\xb4\x59\x1d\xc8\x1e\x2b\xae\x97\x7c\xd0\x49\x6e\xad\x83\x39\xb7\xe4\x7d\x29\x47\x88\x7b\xda\x99\x9c\x97\x97\x5f\xbf\xc2\x97\x6b\xe1\xf3\x60\xbb\xf9\xf6\xa8\x38\xb7\xf5\x82\xdf\x9f\x1a\x53\x6c\xcd\x66\x14\x0f\xe7\xd6\xcb\x84\xa2\x0d\x54\x2b\x5e\x6a\xb4\x2d\xa0\xbc\xd4\xc4\x5b\x2b\x9f\x6d\x70\x5a\xf7\x79\xa5\xdd\x45\x74\xfb\x56\x17\x30\xba\x24\xe9\x76\xdf\x46\x86\x81\x2c\x4c\x32\x4d\x03\xc1\xc9\xce\x6f\xe9\x32\xea\x4f\x8e\x7c\xb4\xf7\xdb\xb1\xdf\x3e\x54\x1c\xf5\x03\x1e\xfd\xa8\xe6\x29\x78\xd3\xb7\x95\x7f\xb6\x3a\xd4\xa5\xba\xef\xd6\x0f\x63\x89\x8c\x98\xc8\x63\xdf\xbf\xfb\x25\xf8\x6f\x0c\xff\xf1\xe3\x1a\xa8\x73\xdd\x77\x42\xfb\x3f\x27\x72\xbc\x01\xde\x91\x4c\x03\xe0\x03\x02\x77\x09\xbc\x38\x95\xce\xef\x82\x3f\x61\x72\x9d\xaf\x6b\xb8\xd1\x93\xde\x62\xc2\x1e\xf1\xa5\xd7\x6a\x08\x9e\xe3\x4d\xaf\x60\xf9\x2c\x7f\x7a\x27\xb3\x0f\x7a\xd4\x2b\xd8\x4e\x7d\x6a\x58\x87\x0b\x5e\xf5\xa8\x6e\xe4\x89\xba\xba\xd3\x4f\x3f\x49\x37\x2f\xb4\xb6\xb6\xff\xca\xf2\xed\x56\xc7\x7b\xd9\x87\x9e\x6d\x7b\x40\x7d\x76\xbe\x6c\x56\x0a\xe1\x4b\x8d\xb0\x45\xdc\xdf\xb2\x0c\x73\x56\x7d\x34\x59\x20\xc3\x9c\xa2\x73\xa9\x4d\x67\xb5\x59\x14\xcd\x0d\x27\xe4\xe6\x18\x39\x30\xe4\xd6\x66\x39\x16\x76\xdb\xd6\xb5\x09\x74\xe6\x16\x3a\x97\x85\xe3\x99\x1f\xff\xf9\xeb\x10\xbb\xfc\xf7\x7f\xe7\xa2\x97\xff\xfc\x15\x94\x39\x1a\x9b\x21\x09\xb3\x03\xac\x89\x39\x41\x17\x63\xa1\x03\xac\x53\x30\x5b\xce\xf4\x31\xea\x4b\xe6\x7c\xa2\xb8\x59\x6d\xce\x82\x13\x0d\x05\x57\x6c\xc7\xae\x75\x23\x89\x0d\x34\x0d\x05\x96\xc0\x93\x09\xb2\xfa\xb7\xcd\x80\x03\xa4\x8b\xea\xea\x07\x7c\x5d\xc8\xdb\x44\x3d\x5a\xf6\x77\x1a\xeb\x91\x77\x2d\xe9\x87\xe9\xca\xce\x16\xec\x8a\xd0\x6e\x31\x60\x9e\x31\x70\x2b\xfe\xae\xd4\xb7\xd5\xc5\xc6\x85\x4c\xaf\x3f\xa7\xe6\xcf\xf3\xde\xb7\xca\x79\x1e\x13\x37\x96\xff\x5d\x64\xea\xe2\xea\xe8\x16\x26\x43\xe3\x80\xa7\xb1\x79\x73\x05\xe5\x45\x46\xaf\x38\xad\xf3\xac\x26\xa1\x03\x31\xd5\xb4\xae\xec\x77\x61\x49\xa1\x21\x5c\x61\x2f\x5b\xaa\x8b\xb5\x06\x96\x2d\x35\xca\x47\x7b\x5e\xae\x8f\xaf\x63\xdf\xc1\x2b\xf6\x02\x08\x7c\x7b\xbd\xbc\x62\xc4\x2b\x86\xbf\x62\x2f\x2f\x3f\xfe\xb8\xda\x97\xb8\xd0\x37\x84\x95\x4b\xfb\x55\xf7\xb2\x13\xdc\xb3\xda\x91\xf5\x02\xfa\xfa\x44\x77\x74\x68\xf4\xbd\xfa\xa1\xdf\xed\x99\xf1\xf2\x8a\xbd\x10\x38\xe0\x7f\xe2\xcc\x4f\x9c\xc4\x00\xf7\x8b\xe0\x7e\x51\xec\xef\x38\x49\x50\x3c\x13\xc3\x89\x20\xc3\xa1\xd0\x89\xbe\x77\x2e\xe4\x68\x34\xa5\x75\xdf\x31\x75\xe5\x32\x26\x9e\xa1\xd9\x7b\x30\x91\xfd\xb9\x8d\xf6\xbe\xb7\xaf\x4f\x4e\xce\xa2\x5c\xc4\x47\x51\x38\xc5\xdd\x83\x8f\xea\x43\x45\xe9\x07\x33\x7a\x17\x71\xd0\x14\x4d\x12\xf7\xe0\xa0\xfb\x9e\xa7\xdf\xad\x39\xdc\x9d\xe0\x8b\x28\x18\x12\x27\xee\x62\x83\xd9\xa1\xd8\x5a\xce\x1b\x50\x70\x14\xa0\xef\x41\xc1\xf6\xc7\xa6\xa2\xab\xeb\xdb\xb9\xe0\x00\x43\xdc\x85\x82\x3b\xe2\x62\x5b\x00\x7e\x03\x1e\x96\x62\xc8\xfb\xf0\x6c\x06\x1d\x6a\x9a\x85\x34\xe8\x98\xd6\x65\x9d\xe2\x71\x80\xf3\xf7\x80\xe7\x5d\xf0\x5e\xb6\xb7\xbf\x52\xac\xcb\xd0\x09\x16\xdc\x35\xd4\x00\x77\xc1\x6f\x47\xc1\x5d\xbf\x5f\x46\x40\xf3\xec\x5d\xd2\x01\xc0\x8f\x60\xbf\x20\xdc\x18\x80\xcb\x88\x78\x86\xbf\x8f\x13\xe2\x68\xa0\xb7\x4b\x70\xef\xc8\xf1\x25\x4c\x00\x67\x69\xea\xae\x11\x01\xa4\xc7\xce\x3e\x71\x71\x71\xc4\x01\x20\x58\xe6\x3e\x4e\xa8\xbe\xaa\xaf\x76\xc7\x2f\xcc\xb1\xd1\x57\x75\x64\x5c\x34\x8d\x00\xd0\x00\xdc\x65\x84\x01\xbd\xdb\x75\xda\xed\x06\xac\xae\xb0\xc1\xb0\xf7\x99\x79\xc0\xf4\xf5\x89\x86\x6c\xa7\x7f\xba\xdf\x70\x05\x15\xcb\x73\xf7\x8d\x08\x7b\x14\x26\xb8\x1b\x3b\xf0\xb2\x33\xd9\xb8\x5d\x92\xba\x0b\x09\xb7\x57\x5f\xd5\xf4\xa2\x65\x14\x98\xec\x00\xff\x49\x02\x0c\x50\xbf\x00\xff\x8b\xe2\x7f\x07\x04\xc9\x91\x74\x0c\x07\x17\xfc\xf9\xc5\x4a\x88\x7b\x1d\xfa\x49\x35\x84\x3f\x48\x49\xc7\x3b\xe9\x6a\xae\xdd\x2a\xb4\xcb\xdd\x4c\xaa\xd0\x6a\xe4\xdb\x2d\x3a\x95\xce\x08\x64\xa1\xd4\xed\x12\xb9\x6a\xbe\xc8\x96\x85\x9c\xd0\x14\xab\xa9\x26\x53\xa8\x24\xea\x62\xaa\xd5\x29\x97\x82\x02\x0a\x45\xb2\x89\x66\xd2\x89\x4e\x3e\xcd\xd4\x4a\x54\xb9\x94\x15\x2b\x89\x62\x29\x15\x67\x49\x42\xa0\x48\xa6\x47\x57\x4a\xc9\x7a\xad\x90\x6e\xe7\xd9\x74\xbc\x90\x28\x56\x0b\xd9\x54\x99\xaa\xb3\x62\xb7\xdd\x6a\xde\x8c\x84\xdc\x20\x11\xe8\x76\xbc\xd2\x15\xe8\x2e\xd5\x16\xc4\x4c\xa7\x5d\x23\x9a\xf9\x32\xd1\x2c\x53\xf1\x66\x3a\xd3\xac\xb2\x94\xd8\xac\xe4\xcb\x25\xa2\x9a\x69\x51\xed\x5a\xa6\x9c\xad\x95\xf2\xf9\xcc\xc9\x50\x87\x22\xa1\x5c\x4e\xaa\x95\x6e\x3a\x43\xe5\x69\xb6\x13\x4f\x8a\xa5\x7c\xbe\x43\xd3\xf9\x64\xa3\x5d\x6e\xe4\xe9\x76\xb2\x5d\xab\x96\x33\x44\x21\x23\x26\x3b\xa4\x98\x6f\x65\xab\xb5\x42\x51\xac\xa7\xe3\xe9\x9b\x91\xd0\x2e\x12\x82\xac\xa6\x88\x4c\x53\xa4\x09\xa1\xd8\x69\xa6\x9a\x19\x52\xe8\xe6\x84\x4e\x27\xdd\xe9\xb4\x88\x56\xa6\xd3\xed\xd6\x18\xb1\xdb\x11\x1b\x95\x7c\xb2\xd3\xab\x0b\x6d\x86\xed\x94\xa9\x9b\x91\x30\xee\xc0\xd7\x2a\xdd\x4c\xb6\x40\x24\xb2\x64\xaa\x54\xa5\xe2\x9d\x42\xaa\x58\x4a\x16\x52\xb9\x66\xa9\xd2\x24\x32\x5d\xb2\x57\x4c\xd5\x33\xe5\x52\x33\x21\x96\x85\x7a\x9b\xad\x26\xd8\x72\x87\xc8\xbc\x44\xad\x41\xda\x04\xf4\x57\xb4\x76\x5b\xb7\x79\x28\xb9\xfe\xdd\x46\x97\xeb\x73\x5e\x31\xe6\x15\x73\xac\x39\xba\x61\x2e\x9d\x56\xde\x44\x9e\x49\xde\x7a\xd3\x3f\x8f\x64\x0b\x29\xba\xd3\x87\xc6\x74\x00\x27\xf3\x31\xb5\x99\xfd\xcd\x7a\xf2\xe5\x23\x86\xf3\x18\x3b\x11\x82\x5d\x6c\xd6\x5e\x1e\xd4\xd8\x28\x95\x2e\x4f\x19\xe5\xa3\xb5\xb9\xbb\x00\xba\x6d\x8c\xcf\x15\xba\x44\x1d\xe4\x5d\xb1\x8b\xcf\xc6\x10\x34\xcb\xf0\x1c\xce\x72\x2c\xf9\x8a\x01\x97\xae\x97\xff\x7e\xf3\x82\x8a\x6f\xbf\xb0\x6f\x00\xff\x7d\xbb\x6a\xfb\xf6\x8a\x7d\x3b\x94\x53\x6d\xee\x89\xcd\xda\xe1\x47\x67\x3d\x75\x7f\x0c\x8e\xdb\xa1\x85\x57\x56\xb5\x69\x13\x75\x00\xbf\xfd\x2f\x4c\x81\x82\x9c\x11\x01\xce\x88\x57\x8c\xbc\x83\xb3\x66\x3d\x19\x95\xb3\x68\x13\x23\x3a\x67\x9b\x7f\x1e\x6b\xde\xe6\x95\x4b\x45\x44\x0f\xb8\xe1\x68\x17\xeb\x7d\xfb\xb5\x51\x87\x6f\xb6\x69\x28\xfd\x30\xa1\x49\xe6\x5c\x1b\x38\xa1\xb7\xbd\xbe\xe7\x04\xeb\xbb\x73\x49\xba\x3b\xf8\xe7\xb4\xee\xe8\xde\x25\x20\x3e\x5c\x4f\x18\xa7\x20\xe6\xcf\x54\x6a\x10\x18\x7a\xea\xdc\xd0\x47\x8c\x4b\x3e\x7e\xe8\xb7\xe3\xf6\xc8\xd0\x6f\xb5\xe7\xd1\xa1\x8f\x38\x4e\x97\x86\xfe\xa3\x67\x3d\x78\xc5\x00\xbb\x59\x2e\xb0\x24\xc1\x81\xb3\x96\x9a\xf8\x67\x5a\x6a\x2a\xc0\xd9\x19\x4b\xfd\x0f\xe5\x8c\xd8\x73\xc6\x92\x2c\x1b\xe2\x5d\xff\x99\x4e\x88\x0e\xb0\x76\xd6\xbd\xfe\x33\x59\xdb\xcf\x34\x0e\x50\x21\x31\xd1\x25\x7d\xfc\xc2\x9c\xd1\x01\xce\xee\x9c\x69\x5f\x98\x33\x72\xcf\x19\x4d\x33\xfc\xfd\x33\xed\x0b\x1b\x11\x2a\xc0\xda\xbd\x33\xed\x0b\xb3\xb6\x19\x35\x82\xe3\x28\x1e\xa7\x79\x8e\xf6\x46\x0d\x77\x79\x33\xf4\xb1\xee\xb2\xc6\x13\x04\x49\xb2\x04\x4e\x32\x1c\xfd\x3b\xc5\xb2\x34\x87\xb3\xff\x28\x1e\x89\x1d\x8f\x00\xc7\x77\x7e\x3b\x12\x8f\x5f\x78\xf6\x81\x3d\x8f\x14\xd8\xf9\xb9\xff\x77\x79\xe4\x88\x9d\x57\xf8\x7f\x4d\x57\xe9\x57\x8c\xa3\x39\x9e\x27\x39\x86\xf3\x8c\xa8\xc7\xa1\xed\x40\xcb\xd1\x27\x5a\x5f\x82\x06\x9c\xc8\x28\x68\x73\x6e\x46\xc0\x1c\x23\xb8\xd5\x94\xed\xa4\x34\x81\x8e\xbe\x40\x91\xf9\xd9\x8c\x9a\xc7\xd0\x12\xe9\xda\xc0\xd9\xae\x72\xbc\xe4\x49\x7f\x84\xd6\x9f\xa3\x49\xd4\x96\x2a\x8a\x60\xb7\x46\xef\x83\xa4\xbc\x45\xf0\xd1\x52\x0e\xf0\x73\xa3\x94\x3f\x61\xa9\xec\x51\xc5\x70\x5b\xb3\xfb\x51\x52\xf6\x10\x7c\xb4\x94\x03\xfc\xdc\x26\xe5\xa8\x59\xa0\x7b\x3c\xb8\x4b\x15\x8d\xf3\x5b\xc3\xff\x41\x52\xde\x22\xf8\x68\x29\x07\xf8\xb9\x4d\xca\x11\xf7\x68\xee\x8a\x21\x3c\xaa\x68\x7c\xeb\x7a\x3e\x4a\xca\x1e\x82\x8f\x96\x72\x80\x9f\x1b\x2d\x46\xc4\xb4\xd6\xff\x6e\xd8\x92\x3c\x77\x86\x32\x6a\x8a\x7d\x77\x8e\xd2\xbf\x2f\xc5\x13\x8c\xa2\x12\x80\xa5\x21\xc5\x22\x56\xa5\x64\x1a\x11\x2c\x49\xb2\x3c\x23\x4b\x12\x05\x65\x46\xe2\x24\x1a\xa7\x11\xa5\x40\x8e\x66\x78\x19\x57\x18\x62\x13\x6a\x48\xbc\x02\x58\x40\xab\x2f\xaf\xd8\x0b\xcd\xf0\x2c\x87\x14\x9a\x67\x00\x52\x54\x92\xe3\x08\x20\x4b\x04\xce\x93\x84\xa4\xa8\x04\xab\x22\x1a\x87\x04\xa0\x00\x01\x08\x0a\x27\x14\x5a\x52\x69\x48\xe0\x2c\x64\x09\x85\x96\x79\x86\x7e\x71\x15\x07\x04\x36\x89\x99\x5f\x24\xf3\x0b\xe0\xc1\xbd\x63\xf7\x67\x9c\xff\x9d\x21\x29\x86\xe1\xae\xde\xdd\x26\x25\x49\x96\x65\x5e\x31\xb0\xf9\x0f\x3f\xb9\x5e\x31\x40\xbb\x7f\xb7\x7f\xf6\xbf\xee\x3f\x6c\x68\x13\x04\x41\x48\x00\xd8\x19\x3a\xed\x76\xc6\xe1\x28\x6d\xb0\x5e\x27\x1a\x79\x9e\x9b\xbc\x19\x09\x3d\x15\xcf\xd6\xab\x09\x20\xf1\x30\x9b\x99\xae\x81\x6c\x18\x86\x3e\x06\x33\xa2\x0a\x48\x69\x30\x68\xb1\x44\x37\xa7\x71\x23\xdb\xaa\xb2\x83\x32\x47\x4c\xd7\xb1\xee\x4c\x37\x92\x59\x81\xe3\xd7\xa2\xb6\x01\x2d\x74\x2a\xad\x22\xf2\x3e\xba\x97\x62\x4e\xd3\xb3\xde\x5b\x4a\x7b\xe7\x56\x1a\x0f\xd4\xc4\xb2\x61\x2f\x56\xd9\xb1\xcd\xcf\x47\x6d\x96\x4c\x64\x50\xc2\x89\xcf\x4b\xe3\x52\xbb\x90\x6d\x55\xc7\x6f\xd3\x65\x7d\x3d\xa3\x86\x2a\x5a\x4c\x86\x15\x29\x9b\x21\xb2\x72\x27\x1e\xaf\x34\x62\xef\x8d\x95\x62\xea\xdd\xc5\xc2\x98\xa9\x2e\xfc\x6e\x89\x2a\xc0\xf7\x29\x51\x3d\x20\x13\x3a\xb2\x70\x7c\xc5\x37\x7f\x7a\x42\x07\x50\x55\x41\x48\xe2\x39\xe1\x9f\x76\xbd\xec\xcc\x51\xa9\x59\x28\x84\x4c\xff\xe0\x8c\xa0\x9f\xa3\xcd\x2f\x14\x89\x24\x88\xab\x04\xe2\x29\x1e\xca\x1c\xaf\xe2\x90\xe0\x55\x12\x4a\x2c\x81\x53\x90\x86\x84\x4a\x90\x0a\xc0\x21\xe4\x21\x8d\x70\xc4\x49\x90\x54\x24\x05\x91\x0c\x64\x38\x9e\xa1\xf8\x0b\x33\x02\xe7\x43\x75\x9e\x61\x19\x9c\xbc\x7a\x97\x00\x14\x4b\x71\x24\x43\x71\xf8\xa5\x19\x41\xdd\x38\x23\xf0\x8a\x65\x56\x0a\xd3\x3a\x5c\xe7\xb8\x7c\x5e\x2d\x5b\xb2\x56\x37\xcc\x45\x96\x17\xf3\x33\xd8\xd1\x98\x82\xc9\x2f\x50\x69\x06\x73\xbd\x5c\xa3\x2e\xf4\x8a\xf4\x28\x07\xb3\x43\x32\x35\x9e\x8d\x13\xa2\xac\xb7\xc5\x46\x2d\x56\x7d\x2b\xdb\x3c\xab\x66\x5b\x94\x50\x86\xad\x5a\x6e\x21\xba\x23\xe8\xce\x08\x9f\x92\x16\xf5\x69\x4b\x4b\x4a\x85\x72\x7c\x59\x33\x8d\x4c\xdc\x6e\xd4\xed\xf1\x2a\x55\x7a\x47\x8d\x0e\x29\x28\xb3\x5e\xbd\xe3\x90\x85\x74\x31\x35\x1e\x96\x89\x8a\x3e\x61\x1d\x55\x4b\x25\x84\xf8\xba\xa2\xcb\xda\x30\x47\x94\xea\xc5\x55\x4d\x51\xda\x0c\x2f\x0c\x0b\xce\x92\x91\x21\xac\xf5\xdc\x19\xd1\x3c\x33\x23\x5a\x54\x40\xa1\xfe\xbf\x9c\x11\xd4\x73\xb4\xf9\x05\xf1\x3c\x2b\xb3\x0c\x24\x29\x96\x97\x38\x5e\x26\x54\x19\x71\x90\x44\x2c\x20\x29\x95\x24\x55\x84\x68\x4a\x61\x15\x1a\x90\x0c\x23\x49\xbc\x0a\x64\x9e\xa4\x64\x8e\x20\x69\xa0\x48\x04\x0e\x5f\xdc\x2d\x25\xea\xac\x72\x87\x7b\x01\x8e\x22\x69\xea\xe2\x5d\xd7\xf9\xb8\x49\x2c\x86\x07\x1c\x75\x69\x46\x90\x37\xce\x88\xd8\xb8\xb3\x22\x4c\x1c\x49\xba\x5c\xe0\x98\x7c\x65\x22\xe2\xdc\xfb\xdb\xbc\x55\x52\x5b\x22\x01\xd9\xc9\x6a\xdd\x68\x64\xb3\x20\x23\x65\xf3\xb5\x95\xb8\x76\xf8\xba\x32\xa2\x97\xb1\x35\x5f\x93\x4b\x36\x9d\x9e\x67\x57\xe4\x8c\xae\x27\x5a\x84\x5c\x68\x4e\x59\xd3\x69\xe2\xb9\x58\xa3\xeb\x8e\xa0\x3b\x23\x7c\x23\xda\x43\x46\xb6\x52\x27\xed\xea\x40\x48\xcc\xf3\xd9\x91\x4d\x52\x0c\xa0\xb9\x1a\x99\xe3\xc1\xc8\x9a\xc5\x72\xdc\x1b\x1a\xa7\x47\xab\x45\xdd\x4a\xd4\x3a\x75\x73\x49\xb1\xe2\xbb\x65\x0c\xc8\xb2\xa9\x76\x96\xf1\xcc\xac\x05\x7a\x56\x61\x6e\xd2\xf3\x74\xdb\xcc\x1a\x6a\x41\x2d\x64\x35\x77\x46\x54\xcf\xcc\x88\x66\xf3\x9c\x56\xfd\xc3\x67\x04\x75\xef\x8c\x20\x9f\xa3\xcd\x2f\xa4\xca\xd3\xb2\xac\xca\x40\x91\x70\x9c\x23\x39\x95\x64\x68\x5c\x06\x84\xcc\x02\x19\x67\x19\x1a\xc8\x2a\xc7\x20\x1e\x91\x8a\x44\xca\xb4\xcc\xa9\x1c\x81\x73\x34\x47\x01\x44\x41\x00\x48\xe2\xd2\x8c\x60\x43\x75\x7e\x13\xda\x86\xcf\x88\xdd\xdd\x6d\xee\x13\x70\x1c\x77\x61\x46\xf0\x37\x4e\x88\xf7\x58\xeb\xbd\xb2\x54\x6c\x41\xa3\x38\xa2\x59\x14\x6d\x59\x8e\x13\x4d\x39\x96\x66\x50\x45\xaa\xa4\xd6\x15\x4d\x1b\x74\xab\xa8\x3e\x10\xd7\x3d\x52\x1c\xd1\xbd\x6c\x1e\xa8\x05\xb1\xde\x91\x0b\x86\xf8\x86\xe3\xef\x82\x8d\x33\x09\x1e\x8d\xa6\x20\x27\xbd\x11\xc8\x2a\xad\xe5\xf9\xd2\x1d\xc0\xcd\x84\x50\x96\x87\x01\xad\x8f\xdb\xdd\x2e\x2e\x36\x47\xf1\x76\x91\xd2\xde\x62\xa3\x89\xd6\xd4\x87\xcb\x6c\x8b\x2d\x5b\x09\xba\x37\x7a\x2b\x66\xba\xe9\xdc\x50\x14\x6d\x52\xc0\x57\xc3\xf6\x54\xee\x58\x46\x3b\xd1\x96\x12\x8d\x86\x1a\xcb\x59\xf9\x24\x65\x8d\xf4\xf9\x64\x24\x25\xcb\xc4\x2a\xa3\x73\xc2\x1b\xed\x41\x2e\x9e\x99\x10\x65\xf1\x9c\x52\xfd\xff\x36\x21\x88\xe7\x28\xf3\x0b\x43\x2a\x3c\xa7\xd2\x24\x83\x10\xc3\x29\x40\x22\x58\x89\x96\x38\x5e\x25\x48\xa8\xd2\x24\x00\x12\x4b\x33\x3c\x24\x28\x15\xaa\x80\xc2\x49\xa8\xe0\x12\x4d\x48\x0c\x49\x4a\x38\x2b\x21\x7e\xe3\x66\x68\xf7\xdf\x19\xdd\x66\xc2\x54\x9e\x05\x0c\xe9\xa1\x0f\xbd\xbb\x09\x9a\xbc\x64\x1d\x45\xf3\xc4\x85\xf9\x70\xeb\x22\x82\xa8\xf4\x86\xa0\x34\xa7\x4d\x5c\xca\xb1\x6d\x6a\xb2\x2e\x2f\x9a\xab\x34\xd9\x9a\x9a\xa3\xd8\x22\x25\x94\x9d\x04\xc8\x13\x45\x36\xce\x32\xbd\xc1\x44\x95\xc4\xe4\x34\x53\xe9\x2a\x14\x3d\xa9\xca\x0d\xb6\x33\x52\xb3\xc5\x65\xbd\xc3\x6b\xa9\x24\x1f\x53\xdb\xd0\x61\x01\x53\xcd\xb6\xbd\xf8\xdd\x9d\x0f\xae\x01\xcf\xee\xff\x08\xae\xca\xda\x87\xef\x4b\xa1\x52\x1d\x79\xe3\x5d\xe5\xc7\x5c\xa1\x9e\xe6\x24\xba\x8d\x4b\xf3\x95\xe8\xcc\x6c\xa7\x55\x7d\x67\xb3\xad\xb7\x8c\x95\x1c\xa7\x45\x47\x11\xa8\x71\x42\x4c\x76\xd6\xdc\xa0\xe1\x10\x5d\xad\x36\x69\x64\x1b\xd9\xf9\x3b\x35\x2b\xf5\x44\x7a\x56\x2c\x35\xde\xf1\xa9\x88\x53\xa0\x25\x37\x5b\xe9\xe5\xb8\x0d\x9b\xee\x7c\xcc\x9e\x99\x2f\x19\xfc\x9c\xce\xfd\xc3\xe7\x0b\x7d\xef\x7c\x01\xcf\xd1\x75\xf7\xe4\xe3\x06\x35\xfe\x8a\xbd\x00\x9e\xc5\x7f\xe2\xe0\x27\x0e\x30\x1c\xff\xe5\xfe\x0b\xd5\x69\x92\xf3\xc2\x9e\xcb\x77\x29\x82\xa7\x78\x86\x25\xf8\x4b\xeb\xe6\xf3\xfa\xee\x91\xf4\x77\x0f\x4d\xf8\x15\xef\xe4\x75\x6a\xfd\xb6\xae\xe7\xe3\x6c\x72\x92\xe4\x33\x04\xbe\x1a\xc6\x63\x36\xae\x39\xf6\x32\xbb\x7c\x07\x1d\xa5\xde\xee\xc2\x78\x0e\xa6\xdc\xa9\x24\x9e\x51\xe5\xf3\xd7\x4e\x95\x05\x21\x3e\xfa\x04\x46\x9e\x7a\xbd\xec\x94\x69\xab\xca\x57\x12\x53\x37\x3c\x61\x28\x6a\x9e\x2a\xe4\x68\x66\x58\xa9\x19\x11\x32\xef\xae\x80\x39\x29\x56\x8c\x06\x86\xdc\xad\xa8\x29\x9c\x76\x13\xcd\xd1\xc0\x04\x4b\x8d\xa8\x68\x60\xe8\x60\x2d\x56\x34\x30\x4c\xa0\x86\x86\x8e\x06\x86\x0d\x96\xe2\x44\x03\xc3\x05\x8a\x43\x22\x52\xc3\x07\xab\x67\xa2\x81\x01\x78\xa0\xec\x21\xe2\x50\x01\x10\x80\x13\x51\x01\x01\x11\xa8\x55\x88\x0a\x87\x0c\xd4\x03\x44\x1c\x2d\x40\x05\xf7\xdc\x23\xc2\xa1\x83\xfb\xda\x11\xe1\x04\xb6\x76\x99\x88\x60\xd8\x63\x30\x11\x95\x10\x70\xc7\x7b\x92\x51\xa9\xe1\x8f\xc1\x44\xd4\x41\x02\x3f\xde\xbb\x8b\x48\x0d\x11\xdc\xd2\x8c\x08\x86\x38\xde\xe3\x8a\x4a\x4d\x70\xab\x2c\x22\x18\xea\x78\x2f\x28\x2a\x35\x74\x60\x07\xeb\x39\x0f\xb0\x7b\xca\xc1\x8f\xcb\xcf\x2f\xd8\xf8\xc7\x5b\x4f\x82\x84\x3c\xc7\xed\xe1\x08\xc0\x2f\x47\xbf\xcb\xdf\x7f\x21\x7c\x15\x75\x8e\xf9\xd0\xa6\xe7\x2b\xf6\x4d\xb5\xcc\xf1\xa3\x95\xea\x53\xe8\x0c\xbe\xfd\xc2\xfe\xf3\xd7\x2b\xf6\xec\xb3\x2a\xdb\xe7\xc7\x8d\xe1\x2a\x0c\xe4\x73\x4a\xc9\x77\xcf\xa9\x0b\x2d\xa0\xf7\x6e\x9f\x3f\x3d\xe1\xbb\x77\x03\x2f\x4f\x2c\x97\xfa\x80\x93\x8f\xe7\xf4\xd0\x1f\xec\x1d\xbe\x30\xae\x1e\x7a\x7b\xd3\xee\x09\x6e\x57\x6c\x47\x03\x14\x52\xc9\xea\x3d\xaf\x6d\xc3\xfc\x7f\xbf\xed\x8e\x37\x4c\x36\xff\xff\xdf\xf1\xb1\x07\xfc\x15\xfb\x26\xcd\xd7\xfa\x44\x0b\x39\x79\xe0\xbf\x77\x51\xf2\xc8\x30\x4e\xa1\xec\x8e\x40\x1c\xdd\xbc\x78\x0a\xc2\x8f\xef\x39\xa7\x57\x8e\x91\x3f\xa5\xbe\xec\x03\xce\xdc\x9e\x51\x8a\xe3\x98\x7b\xff\x05\xdf\x6f\xe3\xed\x8d\xd3\x03\xa7\x9f\x0e\xc6\x29\xfa\xcc\xfe\xba\x07\x17\x3e\xe0\xb4\x6f\xf8\x40\x6d\x0f\x3d\xec\xbf\x30\xa7\x03\xf5\x80\x07\x38\x0c\x54\xf4\xa9\xf0\x85\x0f\x2b\x7c\xc0\x19\xdb\xd0\x91\xda\x2d\xd5\xf6\x5f\x88\x0f\x9a\x52\xcf\x18\xa9\xaf\x76\x42\xe1\x53\x07\x6a\x7b\xba\x61\xff\x85\x3b\x1d\xa8\xa7\x04\x66\xcf\xb0\x7d\x5f\xee\x54\xc2\x27\x19\xbf\xa3\x13\x0d\xfb\x2f\x94\x3b\x4c\xcc\x6d\x15\xe3\x8e\x35\xb7\x1d\x84\x1e\x1d\x0b\x17\x8c\x69\x3d\xaa\x16\x5f\x63\xe4\x9e\xfc\x24\x8c\xd0\x91\xdb\x9d\xd3\xd8\x7f\xc1\x23\x8f\x5c\x74\x73\xe7\x1f\xb9\x07\x7c\xe4\x17\xb1\x8e\x1f\xbe\x5c\x38\xce\x84\xed\xbf\x30\x7f\xf3\xc8\x3d\xe0\x33\xbf\xc6\xc8\x7d\x42\x4c\x7f\x94\x7b\xdc\x7f\x21\xfe\x66\x6b\xf9\xb4\x91\xfb\xbb\xac\xe5\xc7\x8f\x9c\x3f\x4d\xbb\xff\xcc\xf9\xaa\xd3\xd5\xf9\x44\xd9\x3d\x8d\x22\xda\x63\x79\x5c\xb9\x78\x0f\xc7\x79\x78\xd1\x7b\xb5\x54\xfe\xc1\xc7\x07\xdd\x23\xb5\x6d\x3a\x79\xff\x99\xfa\x58\xa9\x3d\x90\xa2\xfa\x52\x52\xf3\xd2\xde\xfb\xcf\xf8\x87\x4a\xed\x01\x0b\xf0\xa5\xa4\xb6\x4d\xcf\xef\x3f\x33\x1f\x2a\xb5\x07\xa2\xcc\xaf\x25\x35\x6f\x1b\x61\xff\x99\xf8\xd8\x19\x1a\x3d\xc2\xfb\x70\xa9\x5d\xd9\x92\x38\xf3\x1e\x94\xa8\xdb\x11\xdb\x77\xa1\x9c\xdd\x8a\xc0\x43\x8f\xad\x78\xfb\x12\xe0\xb8\x3a\xc6\xfb\xed\xf0\x83\xfb\x66\xd0\xdd\x52\x99\x62\x00\x60\x38\x06\xa7\x28\xc0\xb3\x80\xa7\xd9\xdd\xf6\xe9\x75\x56\xaf\xbf\xa7\xe2\x01\xe6\xcf\x3f\x41\xfa\x6c\x3d\x06\x11\xbe\x6f\x7c\x15\x10\x11\x00\x14\xb6\x71\x77\x15\x10\x19\xcc\xcc\x47\x05\x44\x05\xb2\xb9\x61\xdb\xac\x57\x01\xd1\xc1\xb4\x70\x54\x40\x4c\x20\x6d\x19\xb6\x0d\x7d\x15\x50\x30\xff\x19\x79\xd4\xb8\x40\x7a\x2e\x32\x45\x7c\x30\xcf\x17\x15\xd0\x71\x85\x06\xf7\xc0\xb0\x1d\xd7\x68\x70\x0f\xa8\xe4\x71\x95\x06\xf5\x08\x24\x32\x90\x02\x88\x3c\x72\xc7\x95\x1a\x8f\xcc\x93\xe3\x5a\x8d\x87\xc6\x8e\x39\x8e\xd9\xc3\x76\xdd\xaf\x03\x62\x8f\x01\x45\x56\xcb\xa3\x8a\x0d\xea\x11\x8a\xf8\x63\x40\x91\xb5\xf2\xa8\x6a\x03\x7f\x80\x22\x22\x18\xb4\x46\x06\x44\x1c\xc7\x71\xd1\x29\x22\x8f\x01\x45\x9e\x25\x47\xd5\x1b\xc4\x23\x14\xd1\xc7\x80\xc2\xeb\x37\xee\x7d\x8f\xd0\x33\x2a\x38\xae\xbd\x98\xe1\x9e\x1a\x8e\xd0\xb7\x06\x3d\x21\x72\xf0\x3f\xc2\x59\x21\x20\x25\x21\x96\xa0\x58\x9c\xa1\x39\x95\xe1\x14\x89\xc6\x11\x52\x09\x1e\x41\x1c\xaa\xa4\xca\x73\xb4\x8c\x00\x27\xd1\x32\x01\x38\x15\x27\x29\x06\x28\x14\x2e\x53\xac\x22\x13\x3c\xe1\x3d\x84\x16\x3c\x92\xbe\xf3\xd5\xf3\x53\xbb\x0a\xe6\xd0\x83\xc4\x34\xce\x86\x56\x4b\xef\xef\x1e\xc5\x2d\x5e\xe9\x73\x9e\x19\x22\x9d\x1c\x8e\xcd\x2c\xd7\x48\x1b\xc9\x37\xa4\xc9\x24\x5b\xe9\x38\x99\x7c\xfe\xbd\xdd\xe2\x96\x2d\xbd\x17\x87\x89\x39\x5d\xa0\x8b\x82\x5b\x3a\x2c\xec\x0a\xf4\x13\x81\xca\xdc\xf8\xe1\xa3\x7b\x3f\xde\x6a\x95\xb6\x27\x4f\x12\x60\x1e\x57\x32\x66\x63\xae\x15\x17\x55\x27\xc9\xc6\x07\xd9\x02\x59\x42\xbc\xd2\xaa\xa8\xe9\x6c\x2c\xa7\xd3\xb9\x45\xb3\x1c\xeb\x09\x0e\xeb\x9d\x92\x49\xf1\x68\xdb\x35\xe9\x68\x8b\x65\x72\x5e\x6e\x0b\x55\x9e\xad\x81\x5a\xc3\x69\x2a\xcb\x52\x32\x33\x4d\xbe\x25\x9a\x68\xfa\xae\x54\x2b\x1d\xc3\x9c\xc8\x7a\xa1\xe5\xb6\x6f\xb6\x5a\xcd\xed\xf1\x64\xb3\xb2\xec\xbe\xa5\x94\x37\x39\xbb\x2e\x35\x67\x6f\x68\x96\x29\xbf\x4f\x67\x6c\x57\x31\x97\xb2\x5a\x7f\x1f\x65\xd4\x5e\xaa\x55\x4b\xe4\x09\xd1\xab\x82\x8e\xab\x9d\xc1\x49\xbd\x31\x64\x47\x8b\xd1\xd2\x65\x2f\x49\xf1\xb0\xd6\x9c\xbf\x77\x3a\xa8\x94\x99\x83\x94\x9a\xed\xc6\xa5\xa9\x11\x37\x2b\x31\x09\xc4\xa9\x79\x31\xed\x10\xcd\x74\xcf\x61\x86\x95\xfc\x62\xd9\x2a\xd7\xc6\xc5\x77\xb5\x93\xec\xc1\x4c\x7c\x91\xd5\x2d\x3b\xcb\xa1\x92\x1a\xe3\x53\x40\xcc\xe2\xa9\x01\x5f\x7c\x23\x86\xe3\x84\xf6\xe7\x9f\x2f\xfe\x32\xf4\xb4\xaf\x7c\xfb\xf0\xd1\x27\x6b\x4f\x2e\xd2\x58\x1b\x83\x16\xa1\x68\x74\x0b\x8c\x67\x00\x19\x45\x39\x0d\x9c\xd5\xb0\xde\xcd\xf7\xf8\xa5\xa8\x99\xf5\x38\x44\x6d\xae\xa9\xa7\xcc\x00\xbc\x54\xaa\xd5\xf2\x0e\x58\x08\xf9\x24\x97\xae\xac\x3a\x2a\x99\x28\x0e\x5b\xf9\x05\x39\x1b\xbc\xdb\x0c\x9c\x13\x19\x58\xcc\x64\x70\x9b\x8e\x93\x44\xad\xd5\xac\xea\xce\x60\x7b\xe4\x61\x57\x36\xfe\x8f\x1e\xdb\x83\xbc\xab\x7b\x5d\x4d\xba\x6d\x7c\xc7\xda\xad\x59\x89\x29\xa0\x32\xd4\x86\xab\x22\x6c\x56\x78\x26\xfe\xae\xda\x3c\xc2\x65\xd3\x2a\xf5\x3a\xef\xf1\x76\x6e\x94\x32\xf3\x3b\xdd\x10\x84\x32\x6d\xe5\xca\x3e\xdd\x0f\x8c\xdf\xd1\xd8\x9d\xb9\xe2\x4f\xc6\x9f\x88\x82\x3f\xe1\xe2\x2f\x1e\x1a\x7a\xfd\xd9\x6e\x81\x13\xd8\xa1\xa1\x89\x15\x84\x2b\xcd\x26\xdb\xca\xc8\xc9\xea\x8a\xa9\xbe\x2d\x8d\xcc\x4c\x26\x9b\x49\x40\xc3\x1c\x99\xd5\xc1\xa3\xfa\x95\x9c\xc3\xb5\x16\x7f\xdb\x5f\xcb\x73\x34\xbb\xdf\xd3\x7f\x0b\x7d\x62\xba\x3a\x5b\x5e\xa3\x2f\x28\xbf\xc4\xdc\x24\x4d\x87\xa2\x67\x89\x8a\xb8\x9a\x56\xdf\x48\x33\x53\x8a\xbd\x03\xb6\xb6\xd6\x6d\x60\xa8\xc5\x54\x77\x5c\x6d\x6b\xd6\xbc\x1e\x6b\xb8\x9d\x52\xad\x26\xbe\x1d\xb8\x42\x9b\x4a\xe1\x68\x50\x66\x84\x35\x9f\xc0\x2b\x76\x5a\xd4\x16\x32\x60\x01\x68\xf2\x5c\x77\x48\x8d\x0b\xa3\x31\x5f\x65\xe9\x51\x82\x5c\x44\x97\xdf\x67\xd2\xd7\x1e\x31\xd5\x9b\xe4\x97\x72\x3f\xba\xfa\x18\x9f\xc3\x84\xd4\xea\xf4\x88\xa4\xd1\x69\x43\xab\xc5\x34\x57\x4b\xa9\x4d\xa6\x4b\x39\x6d\x3a\x21\x85\x7a\x62\x90\x4d\x4d\x69\x69\x55\xcf\xb6\xb5\x63\x7d\x7e\xc0\x5e\x3c\x62\xdf\x0a\x0c\xb7\xd5\xaf\xea\x39\xfe\x0e\xf4\xc5\x0f\x27\xe0\xfe\x1e\x7b\xde\x6a\x35\x6a\x5b\x50\x8e\xa4\x75\x6a\x8c\xc8\x9a\xc9\x02\x5e\xa8\xc6\x96\xdd\x7a\x82\x7f\xef\x2c\x3a\xad\x06\xb9\xd2\x2b\x7a\x77\x5e\x97\x40\x72\x31\xae\x16\x10\xe7\x31\xb0\xb7\xa7\xa2\x70\xec\xfb\x7d\x97\x2b\x8f\xe6\xe1\x7e\x9a\x36\x73\x4e\x4b\x99\x74\xcb\x2d\xa5\x37\x73\x3a\xd3\x46\x26\xee\x48\x72\x17\x1f\x27\xc6\xaa\x1c\xcf\xe6\x45\xad\x3d\x31\x16\xa9\xec\x00\x3e\x4a\x5f\x22\xb6\x48\x08\x99\x83\xaa\x05\xc7\xc3\xbd\x1f\x7e\xf9\xc6\x27\x92\xbf\x7d\x44\x7f\x6a\x14\x2c\x0a\xea\x9e\x72\x4e\x08\xf8\x93\x83\xff\x3c\x7b\xf9\xe6\x8f\x77\xc4\xeb\xce\xf9\xf3\x48\x7c\xb0\xb0\x96\xe7\xed\xcf\x89\x7e\x9c\x95\xbf\x4b\x6f\x37\xba\xbe\x3c\x1a\x1f\x5c\xd0\x17\xdf\x15\x94\xff\x21\x9e\x38\xf8\xcf\xa4\x8f\xd3\x3b\xed\xab\xc0\x8e\xed\xb1\x7c\x80\x17\x32\xbf\x42\x4f\xf9\xf9\xec\x7b\x64\xfc\x23\x2a\x1a\x7e\x2f\x96\xfd\xef\x47\x05\xca\x6e\x2e\xde\x7d\xcf\xe6\xee\x5c\xa9\xf7\x77\xb3\x70\x74\x17\x48\xd7\x57\xcf\xbe\x15\x9e\x44\x13\x2a\x60\x54\x55\xe2\x39\x19\xa7\x58\x44\x92\x12\x2f\x13\x48\x26\x71\x8e\xc3\x49\x12\x97\x15\xc4\x02\x95\xa3\x25\x92\xa2\x48\x05\x22\x42\xa6\x65\x89\x63\x64\x56\xa1\x14\x8e\xa2\x09\xef\x50\xed\x43\xaf\xcb\xf1\xad\xf0\xe8\x6b\x2b\x3c\x86\x03\x4c\xf8\x03\x13\x76\x77\x8f\x12\xca\x9e\x56\xde\x39\x8b\x7c\x2b\xbc\x64\x60\x78\x7d\x5a\xe0\x6a\x79\xbc\xd6\x6a\xd5\xb7\x5a\xa6\xbd\xc5\x87\x5c\x8b\xe4\x97\xc3\x2c\xa8\x5b\x3c\x63\xca\x6c\x79\x6c\x39\x03\x62\x18\x5f\xf1\x85\x72\x55\xe1\x47\xad\x96\x98\xb5\xba\x75\xcf\x6b\x45\x8f\x22\x5c\x2b\xe3\xa3\xe7\xac\x26\xa6\xf6\xfc\x54\x53\x46\x67\x09\xcd\x31\xbb\x36\xea\x0d\x65\x0d\xcb\xec\xac\x54\x64\xa9\x6e\x2c\xd7\x1c\x09\x84\x89\xcf\x65\xb6\x4d\xa4\xde\xe3\xc6\xa8\x85\x08\x5b\x7e\x9f\x14\x8b\x30\x56\xe3\x06\xad\x86\x64\x94\x69\xa3\xca\xc4\x52\x72\xa3\x48\x0f\xb3\x56\xbb\x3a\x5b\xcd\x52\xa9\x9e\x54\x1e\x09\xcb\x5b\x56\x6d\x41\xf9\x09\x51\xc6\xc3\xbb\xc4\x2f\x2c\xef\x3f\xc3\x57\x54\xbe\xb6\xf7\x46\x38\x65\xda\xca\x02\x41\x38\x5e\xd1\x68\x41\xdc\x57\x56\x54\xcf\xc3\x9f\x8c\x84\xdf\xf5\x80\x3e\x8f\xec\xdd\xba\x37\xa2\x65\xc7\xf6\xb0\x79\xc0\x5f\x14\xce\x64\x5f\xae\x79\x84\x67\xe3\x3f\xd5\xed\x50\xfc\xc1\x15\xd1\x97\x88\x48\xce\xcb\xe7\xeb\xd0\x77\x5b\xc4\xb4\x3c\x10\xed\x7e\xff\x12\x11\x76\x50\x27\xfe\x91\x2b\x00\xf7\x8a\x1f\xec\xd9\x3f\x6e\x85\x76\xe0\xef\xbc\x3e\x5d\x8e\x5a\xa3\xd8\x08\x7f\xd4\x78\x36\x43\xfc\x89\x36\xea\x1e\xfc\xdb\xa8\xb5\xdd\x52\xe3\x33\x5d\x5a\xe4\x5b\xb9\x12\x99\x33\xd9\xb9\x89\xbf\x2f\x06\x43\xca\xa8\x57\x93\x70\x58\xa7\xdf\x1d\xa9\xdb\x29\xa6\xdb\xb5\x16\x0b\x57\xef\x65\x79\xb9\xb2\xe8\xcc\x3a\xd5\x2a\xcd\x9b\xec\xb8\x95\xb4\xa8\xd6\xaa\xf8\x3e\x2e\xea\x4e\x2f\x61\xa5\xcd\x66\xcb\xb0\x99\x6a\x52\x78\x76\xd4\x8a\xf3\x32\x0e\x28\x16\x32\x84\xcc\x11\x1c\x49\x00\x84\x38\x9e\x57\x70\x59\x96\x15\x9e\x90\x39\x40\x13\x34\x42\x90\x05\x04\x8d\xb3\x04\x4e\x30\x38\x49\x00\x89\x84\x04\xc5\xf3\x34\xe2\x24\xef\xd1\x49\xe0\x91\x52\x7e\x5f\xd4\x4a\x5e\x8b\x5a\x39\x8a\x01\xe1\x0f\x7b\xdc\xdd\x3d\x2a\x3a\x78\x89\x32\x53\x7c\x51\x6b\x50\xd3\xe3\x01\x2d\xbb\x7b\x2d\x1f\x3d\xea\xf2\xe5\x82\x3c\xfc\x7b\x7a\xab\x09\x98\x19\x4c\xf5\x56\x89\x17\x29\x92\xcd\x76\x52\x72\x66\xaa\xb6\x2c\x73\x05\xea\xe5\xb7\x52\xce\x49\x8c\xe3\xc4\x40\x83\x5a\xb1\x9a\x49\xd6\x92\xe9\x6a\x31\x53\x22\x67\xc3\xba\xdc\x28\xcf\x66\x48\xb4\x4b\xe2\x7c\x91\x8f\x4d\xd8\x2c\x25\xc5\xf8\x94\x85\xd7\x48\x67\x39\x96\x35\xfb\x96\xa8\xd4\x2f\x9f\xf0\xc8\xcd\xd7\xe8\xde\xb5\x74\x20\x17\x1d\x72\x5d\x89\x9c\x9e\x87\xff\x7c\x6e\xea\x0a\xfe\x13\xab\xf8\xe9\x91\x81\x8b\xef\x96\xc8\xe5\x8b\x46\x56\x7f\x9e\xcb\x8b\xf8\x2c\xf2\xdd\x73\x89\x1d\xdb\x5b\xcf\x7a\x12\x85\xfb\xae\xcb\x1e\x46\x7c\x0c\xbf\x3f\x2f\x73\x0f\xfe\xad\x87\xc9\x99\x28\x3d\xce\x35\x49\xbc\x31\x54\xed\x81\xdc\x5a\x22\x83\x6f\xcf\x87\x99\x56\x96\xe5\xf0\x31\x9e\xef\x66\x60\x3a\x3e\x13\x56\x82\x5c\x12\x8b\x3d\x61\x29\x93\x68\x56\xca\xad\x8a\xcc\x6c\x4a\xd5\x97\x78\x9d\xe1\x2c\x46\xb5\x87\x83\x05\x8b\xb7\x17\xb5\x0c\x22\x13\xbd\x75\x62\xf9\x6c\x0f\xc3\xb2\x24\xa3\xe2\x12\xc7\xf0\x0a\xc2\x55\x96\x82\x34\x52\x58\x95\x53\x18\x9a\xe0\x79\x8a\x27\x48\x0e\x49\xb8\x8a\x53\x04\x50\x49\x55\x26\x24\x49\xa6\x48\x0e\xe7\x28\x95\x00\x32\x87\x7b\x4f\xe5\xf2\x9e\x75\x10\xf9\x58\xdf\x7d\x1e\x86\xa3\xc2\xf3\x22\xbb\xbb\x47\x45\x64\x9e\x56\xde\xb9\x0e\xbe\xc7\xc3\xdc\xb9\x7b\xf7\x48\xb6\xf8\x30\x2b\xdc\x2b\xb3\xa7\xb7\x9a\x1c\xc6\xeb\xc2\xdc\xc8\xcb\xbc\x53\x9b\xa5\xb5\x58\x79\xd4\x92\xf2\x95\x77\xca\x34\x6a\xd5\x6e\x13\x2d\xd6\x09\x75\x81\x17\x04\x63\x26\x75\xd2\xcc\xba\x22\x4d\x6b\x78\xbc\xc6\x98\xec\xd8\xd2\xc7\xb5\x31\x57\xa6\x5a\x66\x2d\x9e\xce\x0a\x8d\x6a\x9c\x22\x4a\xe5\xb6\x9c\x7a\x57\xaa\x37\xe5\x3d\xee\xf6\x30\xf7\xc6\xb6\xcf\xf6\x30\x0f\xe2\x7f\xa2\x87\xf9\xc4\xdd\x38\x8f\x94\x3b\x3d\xcc\x57\xda\xcd\xbc\xea\x61\xa2\xcf\xa5\xe7\x78\x98\x08\xf8\x1f\xf4\x30\xe5\x62\x2a\x9b\x60\x9a\xd3\x77\x02\xa4\x4d\x98\xa4\x98\x5a\xcb\x36\xdf\x2a\xba\xde\x4a\xc5\x07\x35\xe6\x2d\x9b\x8b\xbd\x55\xed\x44\x7b\xea\xc8\x92\x95\xe5\xe7\x46\xa6\x9a\xca\xcc\x86\x73\x38\xcf\xf7\xd2\xd2\x92\x1d\xb4\x07\xa2\xd8\xd5\xe2\x25\x21\x33\xec\xe2\x74\x6f\xd9\x29\x81\xe7\xaf\x61\x54\x96\x92\x15\x9a\xe2\x70\x5c\xa1\x49\x56\xc6\x19\x45\x55\x49\x5a\x96\x29\x96\x23\x25\xc4\x71\x40\x26\x14\x86\xc5\x65\x00\x68\x00\x69\x46\x86\xac\xca\xd3\x80\xa5\x39\x45\x66\x29\x40\x2b\x9e\x87\x21\x9f\xe4\x61\xae\xd6\x56\x71\x34\xce\x5c\x78\x3c\x37\x8d\x33\x87\xc7\x73\x6f\x8b\x82\x1f\xf5\x30\x17\x6a\xab\x3e\x7d\x3f\x32\xb0\x86\xf1\x79\x98\x72\x36\x5f\x37\x92\xd5\x31\xdf\xb4\x66\xc4\x7c\x38\x59\xac\x7a\xc3\xf4\x8c\x79\xcf\x55\x27\x72\xa5\x31\xe5\x16\x06\x65\x27\x12\x54\x0d\x52\xc5\xe6\x04\x66\xba\x49\x38\xaa\x75\x1a\x29\xb3\x6a\x64\x53\x82\x45\x3b\xb8\x99\x5b\x2a\xf1\xba\xcd\x34\x72\x5c\x91\x6e\xa1\xb4\x16\x97\xaa\xda\x57\xf4\x30\x91\x2c\xfc\x13\xf1\x87\x64\xaa\x3e\x65\x0d\xf3\xc9\x1e\xe6\x33\xe9\x8b\xb4\x86\xf9\x9b\x2c\xbc\xf0\x24\x0f\xe3\xcf\xd2\xdd\x83\x7f\xeb\x61\x28\x6d\x9a\x6f\x96\x12\x12\xa8\xcf\x2d\xc8\x94\xd1\x5b\x6a\x5c\x84\x96\x55\x34\x12\xca\x92\x2f\x4f\xd6\xb1\x8e\xbe\xcc\x16\x06\x29\x4b\x5b\xd5\x15\x53\xd1\x4a\xb3\x5a\x4a\x29\xb6\x07\x89\xa6\xd6\x4c\x2c\xc6\x64\x5d\x9b\xc4\xf1\x54\xfe\x7d\x5a\x9c\x2c\xdf\x8d\x16\x05\x85\x94\x93\x78\xba\x87\x91\x79\x52\xe5\x70\x86\x61\x55\x92\x55\x54\x16\x87\x04\x8f\x64\x5c\x41\x3c\xa3\xaa\x24\xc9\x01\x86\xa2\xa0\xcc\x11\x1c\xa4\x64\x04\x81\x2c\x31\x32\x92\x80\x24\x23\x99\x51\x55\x15\xa7\xb9\xc3\x53\xeb\x9f\x91\x25\xbb\xc1\xc3\x10\x17\xf6\x76\x77\x77\x8f\x8e\x78\x3c\x9a\x25\xbb\xea\x61\xca\x44\xe2\x4d\x28\x53\x74\x37\x9e\x24\x9d\x4c\x2b\x55\x06\x35\x52\xc0\x8b\x68\x54\xe1\x72\x35\x66\x52\x02\x02\x8f\xda\xba\xb2\xce\x3a\x5e\x7e\xff\x81\x2c\x59\x60\x0d\xe3\xcb\x92\xa5\x29\x83\x1d\x25\x84\x19\x0d\x67\x8b\x3a\xa1\xbc\x65\x1a\x4e\x57\x66\x0b\x02\x64\xa7\xf5\xa6\xae\x97\xa9\xfc\x3a\x9f\x93\x66\x63\x3b\xa9\x2d\xe4\x51\x3a\x41\x28\xd2\x40\xb6\x4c\xde\x91\x17\x89\x5e\x46\x5d\xce\x1a\xad\x98\x3e\x5a\x70\x99\x31\xd7\x53\x21\x43\x8e\xba\x95\x51\xb5\xfb\x15\xb3\x64\x0f\x7b\x98\x07\xf1\x3f\xd1\xc3\x7c\x62\x45\xa6\x47\xca\x9d\x1e\xe6\x2b\x55\xb4\x5e\xf5\x30\x9f\x98\xa5\x12\x9e\x94\x25\x7b\xd0\xc3\x48\x7a\x67\x5e\xcd\x26\x2c\x63\x36\xe3\x0b\x3d\x92\x53\xca\x60\xf0\x6e\xdb\x71\x6b\x6e\xe4\xea\xf9\x2c\xab\x59\x59\xd3\x98\xcf\xe0\xb2\x9c\xe0\xd7\xd5\x6e\xa1\x07\xe6\xa9\xf5\x7c\x48\x80\x35\x97\x1b\x29\x6f\x89\x69\xa9\xc3\xe4\xeb\x6f\x4b\x24\xad\x0c\xde\xb2\x50\x4d\x8b\xd5\xe2\x1f\x50\x3d\x24\x43\x45\x46\x38\xad\xca\x38\x54\x68\x85\x51\x11\x8e\xf3\x12\x27\xe1\x0a\x92\x64\x5c\x21\x15\x55\x21\x09\x04\x29\x42\xe2\x90\x04\x49\xc4\x23\xc8\x70\x32\xc1\x52\x0c\xa2\x00\xae\xbe\x78\xaf\xed\x7b\xe4\xc1\x3c\xf7\x64\xc9\x78\x9e\xbd\xf4\xb6\x15\xf7\xe6\xd1\xc1\x3f\x4f\x27\xef\xac\xd0\xbf\x2d\x47\xe6\x55\xf8\x45\xf2\x17\x9d\xc0\x7e\xae\xa7\xb3\x7b\xfc\x55\xa1\x54\xad\xbf\x2f\xa6\x62\x3c\x21\x74\x16\x36\xa8\x68\xe3\xcc\x5b\x33\x25\xa9\x42\xd7\x21\xcb\x82\xa6\x75\x2b\xad\x86\x82\x4f\x87\x2d\x39\x07\x5b\xa4\x91\x14\xdf\x86\xe5\x5e\x71\x52\x48\xf5\x8a\xa3\x94\x38\xd0\x28\xc5\x98\xb7\xaa\x2b\x94\xec\x09\xcb\x46\xbe\x59\x81\x13\xc5\x5e\xde\xb4\x22\x49\xfb\x15\x39\xcc\x5f\x08\xbe\x77\xc0\xdc\xe9\x5f\x5d\x7b\x3d\x39\xc8\x37\xe4\xba\x62\xaf\x9f\x87\x3f\x5a\xce\xeb\x50\x0f\xe3\xaf\x1f\xb9\xd3\x1e\x9f\xad\x90\x3c\xbd\x2e\xdb\xb8\x67\xe3\xbf\xa3\x42\x53\x10\xbe\xae\xbf\xbc\x96\x53\x8b\x22\xab\x87\x73\x6a\x4f\x1c\xab\x7b\xf0\x6f\xfd\x91\x00\xe2\x85\x72\x6c\x54\x15\xb3\x71\x14\x7b\x6f\xc6\x12\x5d\x95\xaf\xb6\x1c\x2e\xae\x93\x32\x95\x48\xc4\x35\xbe\x55\x22\xeb\xe3\x52\x6b\x69\x4c\x3b\xa8\x59\x6c\xc4\x8a\xf4\x68\x2d\xdb\xad\xd1\xba\xda\xac\xa7\x93\x03\xa2\x4d\xb7\x92\x29\xaa\x34\x4a\xc6\x8b\xd3\x2a\x3f\x53\x88\xf7\xe7\xaf\x78\x24\x85\xe2\x18\x45\x52\x14\x9c\x50\x28\x06\xe7\x00\xcb\xb0\x40\xa6\x20\x0d\x59\xc4\x2b\x0c\xe2\x18\x5a\x86\x04\x2f\x4b\x14\x40\x0c\xa1\xb0\x10\xba\xcb\x22\x15\x21\x5a\x22\x19\x05\x79\xfe\x88\x78\xd2\x79\xc5\x6b\xfe\x88\xc5\x71\x9c\x0a\x7f\xdb\xd1\xe6\xee\xc1\x23\x6d\x0f\x90\x3f\x7a\x5e\xf1\xaa\x47\x8a\x94\x23\x23\xcf\x79\xa4\xf4\x1e\x7f\x35\xce\x8f\xc6\xf9\x36\x31\x23\x17\x6c\x55\x5d\x73\x95\x22\x1a\x89\x12\x68\x34\xb2\xb4\xbe\x9a\x8d\xb2\x78\xdc\xd4\x3a\x56\xd9\x61\xb5\x32\x60\x88\xaa\x34\x1a\x10\x4a\xbd\xd1\x54\x51\xd2\x5c\xc8\x78\x45\x80\xea\x20\xd9\x59\x39\x83\x96\x60\xd8\x85\xf9\xd0\x88\x8f\xd7\xc3\xb8\x70\xd3\x0a\xe6\x6e\x8f\x14\xe5\xcc\xd9\x33\x3d\xd2\x83\xf8\x9f\xe8\x91\x9e\x52\xb3\x7f\x7a\xdd\x6c\xe5\x3e\xfb\xcc\x80\x20\x7c\xdd\x5d\xa8\xab\xbb\x3c\x11\x64\xf5\x4c\x8f\xf4\xe8\x58\xdd\x83\x7f\xeb\x91\x32\x44\xbd\x3b\x95\xa0\x85\xde\x9c\xf8\x5b\x61\xc9\xad\x98\x6a\x6d\xd1\x2a\x15\x87\xe3\x42\x7a\x56\x1d\x56\xd3\x7a\x1c\xd9\x0c\x39\x17\xd8\x8e\xd5\x8b\xcf\xeb\x99\x1e\xc8\x95\x6a\x3c\x55\xd6\xf9\xf7\x2a\x17\x9f\xc6\xc4\x92\x9a\x26\x52\xcd\x44\x7b\x39\x67\xca\xcd\xb4\x94\x2f\x8a\xcf\x5f\x21\x71\x00\x00\x9e\x90\x49\x8e\xa1\x48\x45\x65\x49\x19\x07\x34\xa4\x21\x50\x58\x56\xe2\x70\x42\x51\x55\x9c\x56\x28\x95\xc6\x55\x99\x51\x00\xce\x01\x06\x42\x96\x96\x71\xc8\x00\x9c\x57\x79\xe8\x79\x24\xf2\x49\xe7\x2b\x6e\xf0\x48\x44\xe8\x3b\x8b\x77\x37\x8f\x1e\x43\xf2\xe8\xe9\x8a\x4f\xf4\x47\xbe\xd3\x10\x15\x43\x63\xd3\x85\x41\x4e\xc3\x57\xec\x70\x2a\x2c\x81\xb8\x64\x32\x44\x27\xc5\xac\x6b\xd9\xb1\x9a\xcb\x2e\x53\xea\x0a\xe7\x4b\x73\x9d\x96\x9c\x72\x4e\x48\xa1\x65\x4a\x28\xa9\x65\x28\xc4\xb9\x54\xb5\x67\xd0\x53\x52\xa0\x35\x72\xc4\x24\x33\x49\x5d\x53\x9b\xa5\x66\x12\x30\x9a\xfc\x21\xfe\x28\x42\xc5\xfe\xc3\x55\x01\x4f\xc4\xff\x44\x7f\xf4\x68\x35\xee\xa3\xfe\xe8\x29\xf8\x1f\xf0\x47\x5f\x69\xcf\xea\x9a\x3f\x8a\x22\xab\x67\xfa\xa3\x28\xf8\x1f\xf4\x47\xb1\x76\xd2\xee\xce\xc5\x71\xb2\x91\x99\x97\x47\xc9\x64\xb3\x91\x34\xd5\x9e\xdc\xb1\x72\xa2\xde\xe3\x46\x43\xa1\xf5\x96\x69\xe0\x04\x53\x30\xe6\x38\x35\x12\x5a\xac\xd0\x14\x00\x47\x9b\x42\x66\xd9\x8a\x8f\x3b\xe3\x89\x9c\x1c\x27\x51\xc3\x2c\xca\xe5\x7c\x9c\xaf\x82\x6a\xa5\x33\x8b\x3f\xbd\xae\x8d\x24\x10\x25\x41\xa0\x12\x80\x93\x18\x08\x09\x8a\xc0\x25\x8a\x67\x29\x9a\x81\x40\xc2\x79\x9c\xc7\x11\xc9\x91\x2c\x62\x18\x89\xa4\x78\x1a\x27\x71\x85\x42\x8a\xc2\xe0\x0a\xae\xe2\x34\x8b\x7b\xfe\x88\x7a\x92\x3f\xba\xb6\x27\xc4\xe2\x38\xcd\x84\xbf\xff\x72\x77\xf7\xe8\x71\x56\x8f\x7a\xa4\x0b\x7b\x42\xcf\xce\xd9\xf9\x3c\x52\x31\x37\x5e\xc4\x8c\x41\x8a\xae\xf6\x0c\x4d\xc9\xce\xe2\x9d\x64\x5d\x19\x88\x8e\x66\xc1\x86\x55\xab\x2f\x5b\x16\xad\xbc\xc5\xad\x52\x82\xe0\x90\x9a\x29\x9a\xab\x6e\x09\xc6\x88\x39\xef\xd4\x45\x65\xd5\x8c\x0d\xd2\x1d\x26\x57\x6b\xb3\x4b\x21\x45\x4a\xe5\xa9\xc0\x59\xab\xd5\x4a\x10\xbf\xa2\x47\x8a\xf4\x54\x90\x27\xe2\x8f\xf4\x54\x90\x8f\xf1\x48\x21\x1e\xf2\xd3\x3c\xd2\xbd\xe7\x53\x04\xe1\xeb\x56\x82\x9f\xf5\x48\x7f\x93\x47\x10\x3e\x60\xac\xee\xc1\xbf\xf5\x48\xcb\x31\x7c\x63\xda\x62\xc7\x88\x8f\xdb\x71\x5c\x37\x53\x72\x29\x47\x88\x75\x22\xe1\x4c\xcb\x4e\xaa\x10\x6f\x2f\x0c\x92\x4b\xdb\x78\x41\x5a\xd1\x9c\xbc\x1e\xa6\x34\x60\xb1\x90\x25\x40\xb6\x46\xa6\x1a\x8c\xd8\x53\x4d\x23\x25\x2d\x04\xa1\xa3\xd8\xcc\x28\xb9\x5e\x64\x32\xa2\x50\x7d\xb6\x47\x62\x18\x86\xa1\x19\xc8\x20\xa8\x20\x02\xe7\x08\x99\x66\x39\x9c\x66\x01\xc1\xb0\x0a\x8f\x28\x8a\x26\x11\x42\x34\xcb\x01\x19\xf2\x90\xe6\x20\x24\x01\x8f\x24\x5c\x45\x1c\x49\xd1\xb4\xaa\xbc\xec\x1e\xdd\x1a\xfd\x01\xb5\xbb\x27\xbf\x5e\x70\x44\x80\xa1\x2f\xbd\x79\x9c\x3e\x6c\x44\x79\x8f\x30\xdc\x7a\xa1\x02\x97\xa9\x2e\xaa\x23\x29\x4f\x64\x04\xb2\xdd\x1a\xd6\xac\xfc\x78\xd8\xc1\x71\x35\xcd\xd9\x85\x2c\x3b\xc6\xc5\xda\x32\xd7\x7e\x13\x3a\xa4\xb0\xf7\x42\x9e\xba\x04\x86\xf4\xc4\x4a\x44\xa8\xa5\xca\xfb\xe1\xb5\x16\xcb\x14\xbf\x99\x45\x62\x5c\x49\x76\x10\x41\x36\x29\xc4\x27\x88\xfa\x6a\x1a\x2f\xf4\x6a\x2b\x60\xe5\xde\xeb\xa9\x42\x0e\x5f\x25\x93\xf8\x3c\x9f\x9e\x8e\x67\x92\x6a\x24\x1b\xb1\x4e\x27\x3b\x63\x9a\x7a\x32\xfe\x3e\x4e\xad\x9c\x58\xba\x1c\xeb\xcc\x52\x66\xb5\xa2\x58\x9d\x06\x3b\x05\x66\xa1\x97\xcd\xcc\x1a\xc5\xca\x0d\x9e\xe7\x48\x65\x8f\x3d\x8f\x8f\xe7\x83\xe5\xf5\xc7\x97\xfa\x5b\x1c\x2f\xe0\xb9\xf4\xda\x19\x2c\x4b\xc0\xe8\xe2\x70\x3d\x35\x01\x5f\xca\xac\x16\x85\xc4\xba\x4c\x3b\x71\x51\x4e\x78\x3c\x92\x9a\x63\x95\x27\xdd\x37\xaa\x78\xe8\xdf\x3c\x4b\xc4\x95\xd9\xfc\x00\xfe\x92\xb5\x6e\x54\x1f\xc0\x2f\x08\x7f\x5f\x55\xef\x59\xcb\x1a\x8f\x2e\x8b\xf2\xa4\x77\x91\xcd\x6b\xb2\x78\x74\x2c\x36\xba\x10\x93\x03\xf0\xee\x92\xc5\x7f\x3b\x55\x40\x3a\x0e\x28\x67\x16\x55\x67\x64\xc3\x6a\x9d\x68\xca\x0a\x5c\xcb\xf8\xa0\xbe\x56\x8a\xd5\x25\x5f\xd0\x07\xb3\xde\x6c\x4c\xd2\x55\xfc\xcd\x00\xeb\xfc\xdc\xc8\x6a\x4b\x99\x1e\xc8\x92\x3a\x18\x2e\x0c\x66\x00\xc5\x24\x09\x01\x1e\x63\x14\x98\x20\xea\x71\x66\xf4\x9e\x7c\x7a\xac\x2f\x01\x95\x23\x38\x92\xa3\x64\x9a\x41\x94\x84\x13\x94\x4a\x11\x2c\xad\x12\x14\x43\x73\x38\x94\xa0\xa4\xaa\x00\x22\x52\xe2\x25\xc8\x00\x09\x27\x39\x9e\x25\x69\x16\xd1\x2c\x42\x92\x4c\xe0\x9e\x65\x25\x1e\xb3\xac\xc4\x75\xcb\xca\x52\x97\x4c\xab\x77\xd7\xff\x30\xd6\x47\x6d\xeb\x85\x08\xdf\xbb\x22\x54\x11\x85\xda\x56\x75\x92\xaa\xbf\xf7\xd0\x00\xb0\xef\x0e\x47\x98\x45\x65\x86\xa8\xd8\xdb\x6a\x62\xbf\x8d\x32\x71\x25\xdd\x51\xf9\x78\x36\x5e\xeb\xaa\xad\x1e\x99\xac\x36\x48\xb8\x5c\xf6\x26\x74\x61\xa6\x65\xd3\x7c\x6e\x66\x2c\x8a\xe3\x1a\x68\xe4\xe1\x4a\x36\x73\xd5\xe4\x7c\x96\x96\x13\x75\xb9\xf8\xb5\x6c\xeb\xa3\xb6\xed\xd1\xf9\x5c\x5c\x16\xc6\xe6\x33\x6d\xeb\x27\x9e\xc9\xbb\x9a\x47\xf9\x44\xdb\x26\x3c\xc9\xb6\x72\xd4\xa1\x7f\x48\x0e\xf2\xa2\x6d\xed\xd0\xab\xa6\x4d\x74\x4c\x05\x71\xac\x5a\x9a\x25\x33\x70\x32\xaf\x2c\xb8\x1e\x5b\xa1\xe3\xcb\x4e\xcd\x20\xdf\xaa\x75\xa1\xd9\xce\x80\xb6\xb2\xc4\x45\x9e\xb0\x8b\xe9\x5e\xac\xce\x98\x89\xf8\xa2\x0e\xa7\xd2\x7b\x6e\xa4\x34\xd7\x63\xbb\x93\x4f\x34\x05\x76\x36\x98\x08\xa3\xc9\xf3\x4f\x6f\x10\x12\x81\x38\x42\x91\xa0\xb4\xb1\xab\x12\xc1\x42\x5c\x26\x01\x85\xcb\x90\x05\x0a\x07\x65\x5e\x92\x59\xc0\x91\x40\xe5\x55\x1a\x92\x92\xc2\xf0\x48\x86\xa4\xc2\x71\xaa\x84\x23\x99\x96\x3d\xcb\x48\x3e\x66\x5b\xaf\xa6\xf3\x01\xc3\x93\xa1\x07\xcf\xf7\x77\xfd\x8f\x95\x7e\xd4\xb6\x5e\x78\x5a\x92\x77\x45\x58\xbd\x87\xd8\xd6\x64\x6e\x6e\x00\xa7\x90\x2e\xa4\xa8\xd6\x6a\xe9\xe0\x4a\x32\xd1\x12\x55\xc6\x91\x68\x83\x92\xd6\x45\x2b\xad\x25\xa6\x31\xa3\xd5\x2b\x8e\x57\xb2\x43\x53\x7a\x49\x25\xc6\x2b\x67\xb8\x62\x8a\x0a\xdd\xcb\x51\x22\x95\x34\x64\x5b\xa5\x18\x51\x18\xc4\xd3\xf5\x66\xc5\x9e\x70\x6a\x37\xf9\xb5\x6c\xeb\xa3\xb6\xed\xd1\xf9\x5c\xc0\x47\x8c\xf0\x44\xdb\xfa\x99\x79\xe1\x8f\xb0\xad\x51\x6d\x9b\xf0\x24\xdb\xca\xfa\x06\xa0\x78\xb7\x2c\xfe\xbb\x96\xa6\x8a\x54\x5f\xe9\x2b\x94\x92\xe5\x82\x92\xa9\x2e\x8d\x5a\x26\x66\xb5\x63\x3d\x94\xe6\x86\xf9\x95\x29\xcc\xd4\x69\xab\xdd\xc8\xd9\x9d\x02\x42\xd9\x61\x87\x9f\xda\x52\x97\x43\xc3\x0c\x6a\xd7\x51\xbc\x2c\xd0\x9d\x42\x26\x56\x1e\x08\xd9\x6a\x6d\x64\x24\xd9\xdc\x5b\x86\x10\x9e\x1e\xb7\x22\xc0\x4a\x10\xd1\x34\xa1\x40\x1c\xe0\x34\x54\x48\x42\xc5\x25\x1e\x42\x45\x55\x70\x95\x21\x48\xa4\x92\x2c\x92\x28\x8e\x91\x00\x2e\xe1\x14\x25\x03\x9e\x20\x39\x92\xc1\x11\x45\xd3\x0a\xeb\xd9\x56\xea\x31\xdb\x7a\x35\x35\x0d\x58\x00\xc2\x4d\xab\x77\xd3\xff\x78\xfc\x47\x2d\x6b\xd0\x95\x9f\x58\xd6\x08\xb5\x8c\x61\x96\xb5\xdb\x55\xd7\x65\x6b\x5c\x19\xa8\x23\x9d\x31\xac\x4a\xcc\x4c\xa8\xf3\x49\x6e\x5c\x9b\x13\x63\x75\x65\x50\xb8\x49\xcf\xda\x35\x76\x0d\xba\xe3\x0a\x37\x35\xd3\x31\xa6\x33\xd3\x28\x30\xcc\x27\xda\xa5\x65\xcb\xac\xb0\x80\x4d\xb4\xc4\x0a\x62\xf1\x2c\xee\xa0\xf6\xa2\x81\x86\xa3\xdc\xd7\xb2\xac\x8f\x5a\xb6\x47\x67\x73\x9e\x8a\x95\xba\x4f\xb4\xac\x9f\x59\x93\xf8\x11\x96\x35\xaa\x65\x13\x9e\x64\x59\xe9\xe5\x55\x44\x97\x2c\x2b\x91\xce\x70\xc3\x19\x3d\xa4\x3a\x74\x76\x3e\x85\xef\x6f\x33\x61\xc2\x4e\xd7\xbd\x91\xe4\x4c\x27\x5c\x0f\x95\xf2\x65\x68\x8c\x10\xe7\xb4\x73\xc3\xb7\x3c\x8c\x2f\xe6\x06\x63\x96\x4b\xdd\xb5\x66\x0c\xe5\x14\x4c\xc6\x78\xb4\x34\x6a\x49\x72\xce\x27\x4a\x85\x8e\x61\xe1\xa4\x49\x27\x9e\x9e\x6b\x95\x55\x85\xe3\x00\x83\x14\x9a\x63\x65\x1a\x29\x1c\xa7\x20\x88\x23\x09\xc7\x39\xc0\xc9\x50\x25\x39\x19\x67\x69\x1c\xb1\x2c\x85\x23\x9c\x56\x10\x29\x13\x2c\x60\x19\xc4\x43\x84\x38\x84\x3c\xcb\x4a\x3f\x66\x59\xaf\x3d\xe4\x93\x05\x2c\xcf\x72\x17\x4c\x2b\xcf\xf2\x2f\xc7\x2f\xfa\x78\xd4\xb6\xa6\x02\x83\x7a\x62\x5b\x23\x54\xe5\x85\xd9\xd6\xd2\xb8\x3a\x50\xaa\x68\x5d\x94\xdb\xa9\x76\x85\x53\x5a\xb5\x51\xd2\x49\xd5\x29\x27\x93\x4d\xac\xf3\x0a\xac\x8c\x6a\x4c\xec\xad\xc0\xc6\x9c\xe2\x7b\xbe\x6d\x36\x87\x52\x52\xe8\xd8\x72\xad\x9b\x8d\x0d\x99\x94\xf2\xd6\x4a\x35\x61\xf2\x5d\xe9\xda\xed\x84\x60\x67\x48\xbc\x3d\x1f\x66\x0b\x5f\xcb\xb6\x3e\x6a\xdb\x1e\x9d\xcf\x39\xbe\xa3\x2d\x9f\x99\x11\xf8\xc4\xea\xba\x8f\xb0\xad\x51\x6d\x9b\xf0\x24\xdb\x1a\x35\xf3\xbe\xb5\xad\xef\xbd\x51\xb6\xd3\xcc\xd8\xc3\x4c\x6a\xd0\x1a\xbe\x65\x5a\xcd\x9e\xc0\xd6\x9a\xf3\x42\x6d\x2d\xd8\xfa\xa4\x3d\xa4\x45\xb4\x58\xac\x63\x6f\x56\xa3\xb8\x36\x66\xa9\x2c\xb1\x5c\xa6\xd8\x8c\xd8\x4e\x54\xcc\xd8\xa0\xa3\x82\x5a\x2b\xad\x71\x64\xbb\x90\xd2\xb4\x42\x9c\xe7\x53\x96\x79\xf3\x13\x83\x8e\x5f\x1f\xe4\xbd\x5e\xd7\x76\xa0\x63\xfb\x3f\xf7\xa7\x23\xb4\xde\xbd\x86\x27\x51\x2e\xd5\x1b\x35\x21\x5b\xba\xf6\xc6\x20\xa1\xd0\x10\x6b\xdb\xb7\xf6\x94\x4b\x85\xae\x1f\xe2\x6f\x18\x86\x61\x42\x32\xe9\x83\x76\x82\x10\xab\xd4\xb2\x45\xa1\xd6\xc5\xf2\x62\x17\xfb\xae\x2b\x27\xd4\x6a\xa6\x35\xed\x8f\x75\x6d\xf7\x6e\xca\xc0\xf7\x27\x51\x1d\x80\x7a\x8e\xf2\x73\x88\xaf\x52\xbf\xf3\x64\x2e\xdb\x76\xe0\x6b\xff\xf0\x7e\xe4\xfe\xe1\xad\xc8\x7d\xff\xeb\x8f\xfb\x4f\xe1\xee\x18\xed\x39\xe6\x22\x11\x86\x35\x4b\xd9\x6a\x53\xc4\xbe\x1f\x9a\xbf\x62\x87\xf6\xbb\xcf\x5e\x87\x3b\x45\xf3\x9c\x61\xbd\x9b\xf1\xbb\x06\x75\xff\xc6\xd4\xe3\x17\x79\x5d\xbe\xfd\x64\xce\xce\x23\xb9\xc4\xe9\x05\xb2\x6e\xe6\x3c\xf4\x25\x66\x57\x5f\x13\xf6\x5c\xee\xc3\xd0\x5c\xe2\xff\x22\x69\x57\x25\xe0\xa9\xb4\xb4\x76\xb5\x7d\xc7\x48\xb6\x94\x14\x3b\x57\x78\x48\xd4\x44\xa1\x21\x7a\x4d\x8f\xa1\x60\xe5\x52\x70\x32\x34\xeb\xd9\x52\x1a\x93\x1c\x0b\x21\xff\xec\x0a\xa7\xc6\x9b\x63\x8f\xd3\xe3\xc1\xb9\x8d\xa2\x90\x79\x2d\xad\xfb\xdb\x17\xfa\x46\x26\xe7\x00\xc2\x4f\xc9\xd1\x6a\xe0\x98\x1e\xaf\xf1\x2b\xb6\xfd\xd0\xb7\xd1\x6c\x8e\x26\xf2\xa9\xc0\xa4\x75\x5f\x45\xe8\x3e\x02\xa7\xa6\xed\x68\x16\xb2\xcf\xd2\xe9\x83\x76\x1b\xad\xbe\x0e\x3f\xb0\x76\x46\xac\x89\x98\x1f\x46\xb6\x8e\x95\xca\x0d\xd7\x87\xff\x71\x42\xfa\x00\xda\x83\x27\xd0\xbc\x01\x73\x1b\xb1\xfe\xb9\xb2\xe9\x75\x4e\x9e\xfa\x64\x82\xac\x67\x91\x76\x00\x76\x1b\x81\x5e\xfb\x13\x32\xb7\x82\x3d\x7f\xf7\xb2\x8c\x0d\xa4\x68\x0f\xcc\xa4\x3d\x84\xdb\xe8\xf7\xda\xee\xf5\xf5\x15\x83\xd3\xa9\xa1\xcb\x9e\x7d\x36\x2d\x25\xc4\x6f\xf6\xd1\x66\xb2\xba\xf7\x23\x50\xba\x75\xdb\x1e\xc1\x01\x70\x7e\xb2\x91\xaa\x22\x39\x38\xf7\x4f\xdd\x88\xae\xbc\x62\xdf\xdc\xce\xdf\xc2\x88\xd5\x95\x27\x91\xa9\x2b\x37\x13\xb8\xb3\x05\x1b\xf2\x22\x10\x6d\x4e\xfb\xd3\x67\xd1\xbd\x85\xe5\x27\x3d\x24\x76\x88\xc4\xc9\x79\x06\x9c\xd5\xf3\x18\xd8\xc2\x0a\xd1\xe9\x88\x2c\xf8\x21\x9c\x63\xc2\x9c\x6e\xb4\x72\x60\x46\xe2\x61\x4b\xfc\x01\x46\x54\xe1\x5f\x16\xb4\xbd\x9d\xed\xae\xef\x7c\x5c\xd6\xc7\xe0\xfc\x24\x7b\xbf\x07\xad\xdf\x59\x8a\xfc\x72\x7d\x16\x59\x27\x30\x6f\x34\xcf\x67\x08\x74\xbc\x21\x71\x1e\x19\xd6\x03\x8c\xe8\x2a\x79\x4d\xfd\x1c\x4b\xd9\x20\x91\xa0\x7d\x67\xbc\x70\x96\xe0\x53\x60\x01\xca\x15\x14\xa0\xd3\xdf\xf6\x2a\x81\xa6\xaa\x3e\xe0\xb4\x4e\x41\xdd\x44\x9c\xdb\xf2\x12\x69\x2e\xed\xc8\x7a\x9a\xf8\x02\xf0\xae\x11\x19\x68\x7e\x0b\xa5\xcf\x91\xe3\x11\xb4\x5b\xa9\xbc\x2a\xcd\xe7\xd0\x76\x13\x4d\x97\x69\xd9\x51\x6c\x98\xe6\x68\x3e\x7d\x8c\xa2\x63\x58\x37\x8f\xa8\xb7\x00\x09\xa1\x6f\x0a\x75\xab\xef\xe8\x63\xf4\x14\x0a\x83\xd0\x6e\x9b\xb7\x5b\x02\x5f\xb1\x20\xc9\xaf\xd8\xd6\xc4\xcb\x86\x69\x23\xa5\x0f\x9d\x10\x26\x9e\x60\xb7\xb7\x70\xae\x51\x7c\x67\x74\xb4\x81\xfa\x34\xe9\xde\x21\xd8\xab\x72\xd3\x27\x0a\x5a\xf5\x03\x21\x87\xdd\x37\x27\x7d\xa8\x28\x16\xb2\xed\x47\x05\x7a\x15\xc1\xd1\xc2\x79\x7b\x3b\xb0\x54\xf5\x1a\xde\x41\xfb\xe3\x7a\x70\x09\xf6\x75\x8a\xcf\xcc\xb2\x63\x80\xdb\x28\x7c\x03\xcf\x59\x4f\xa3\x27\x45\x2e\x42\xbd\x1a\xf6\x6f\x1a\x5d\x21\x74\x1b\x43\x6d\x40\xee\x95\xe8\x49\xd4\x9e\x03\x7d\x35\x7c\xbb\x55\x93\x7d\xc0\x9f\xad\x0c\x47\xa0\xa3\xc4\x9b\xe1\xe0\xc6\x53\xd3\xda\x18\xbe\x05\xb2\x6c\xdd\x9c\x3c\x5f\xd0\x41\x0c\xd7\xc9\x0f\x74\xb8\x9d\x99\xad\xe9\xb9\x3d\xc9\x11\x41\xfe\x3e\x1c\x57\x39\xf1\xb5\xbd\x9d\x89\xa9\x85\x16\xba\x39\xb7\x3f\x85\x9b\x73\xc8\xae\xb2\x75\xae\xd3\xed\xfc\xed\x92\x28\x1f\xc6\xd3\x0e\xc1\x55\x3e\x42\xd3\x8f\xc7\xa0\xf7\xfe\xf6\x43\xa6\x76\x10\xfa\xd9\x05\xf0\xbd\x13\xfc\x18\xe8\xf1\x12\xea\x49\x33\xfc\x12\x8a\x5b\x78\xb8\xb2\xae\xbb\x88\xec\x79\xee\xeb\x14\xf0\x4d\xb4\x5f\x77\x62\xfe\xc5\xf6\x47\xa8\xcd\x29\xfc\xc8\x4b\x7d\x37\x88\xdb\x3b\xf2\x5d\x86\xb1\x2f\x99\xe6\x28\xb2\x94\x2f\xc0\xbc\x1a\x22\x7c\xff\xae\x20\x07\xea\x86\x8d\xfd\xfc\xf7\xbf\xb1\x17\xdb\x34\x14\xdf\xf6\xe6\xcb\xaf\x5f\x0e\x5a\x39\x3f\x7e\xbc\x62\xe1\x0d\x65\x53\xb9\xad\xa1\xb7\x39\x12\xde\x54\x32\xe7\xda\xc0\xb9\x09\xfd\x51\xd3\xcb\x04\x1c\x35\x0d\x90\xb0\x4b\x8a\xbb\x4a\x86\xfd\x89\x91\xe4\xcd\x95\x01\xba\xd2\x57\x7d\xfb\x76\xa9\xfc\xe7\xd4\x07\x6c\xd1\x62\xa9\x72\x4d\xcc\xa6\x4b\xfb\x3d\x39\xac\x26\xa6\xc4\x9a\x58\x4a\x88\xf5\xc0\x36\x95\x7b\xb7\x5c\xc2\x9a\x95\xe4\x46\x65\x6a\x62\xbd\x51\xcb\x26\x1a\x9b\x9f\x92\x62\x41\x6c\x88\x58\x42\xa8\x27\x84\xa4\x78\x61\x63\x73\xb3\xee\x38\xfe\xda\x0f\xa4\x62\x9e\x27\x8c\x63\x3c\x57\x76\x2d\xc3\x28\x39\x96\x4f\x30\x6d\x74\x56\x58\xdb\x40\xff\xca\x16\x6f\xa8\x24\xb6\x4b\xd9\xbf\x5d\x0e\x7e\x3a\xce\x49\x61\x97\x25\xb8\xac\x30\xf7\x49\xe0\x34\xa9\xf4\x37\x8a\x21\x84\x98\x63\x59\x9c\x49\x83\x3d\x57\x29\x82\x29\x8e\xaf\x20\x90\x70\xd5\x38\xc9\x21\xdd\xa2\x1d\x18\x54\x14\xa4\x60\x63\x38\x99\x43\xc3\x58\x1f\x51\x9a\x4d\x61\x62\x27\x5b\x6f\xd4\x3d\x9a\x3d\xce\x7e\x1f\xa1\x75\x7f\x01\x8d\x39\xea\x6f\x20\x22\x2c\x59\x2b\x57\xfc\x84\x1f\x7a\x05\x5a\x7a\x25\x12\xbf\xb9\xed\x83\x08\xce\xc3\xfe\x63\xe7\x22\xbd\xe6\x41\xcc\xdf\x5d\xb9\x5d\xbc\x36\x42\x92\x07\xd0\x82\xb2\x83\x2c\x6c\x01\xad\xb5\x3e\xd1\xbe\x13\x34\xfd\x63\xbf\x53\xfa\x7a\x1d\x8a\x8b\xf4\x1a\x9c\xdf\x02\xb5\xbe\x41\x6a\x0f\x07\x28\x56\xd3\xbe\x3e\xd1\x90\xed\xf4\x0d\xb8\xf9\xe3\x46\xda\x2f\xaf\xd8\x0b\xfe\xf2\xe3\x8f\x53\x5d\x09\x00\x3a\xa7\x2c\xe7\x24\x7d\x5c\xf1\x31\x42\xeb\xcd\x88\x1f\xc9\x73\x9f\x30\xb1\x75\x6d\xb2\x89\xf5\x6f\x10\xe8\xae\xd3\x19\x69\x30\xd4\x8f\x1b\x64\x89\x79\xc8\xa2\xf7\x5f\x22\x5d\x1b\x38\x98\x3e\x71\x90\x86\xac\xc0\x30\xfe\xfc\x89\x2d\x11\xb6\xd4\x0d\x03\x9b\xcd\x91\xb5\xc6\xa4\xf5\x0e\xa1\x6d\x62\xce\x00\x3a\x98\x6e\x63\xcb\xc1\xfe\x57\xdd\xc6\x9c\x01\xc2\x54\xdd\xb2\x1d\x4c\x77\xd0\x18\xd3\x27\xee\x2f\xb2\x39\x9e\x9a\xb6\xee\xa0\x8d\x70\x6f\x20\xeb\x48\xda\x1e\xf0\x7d\xd9\xc6\x8f\xdf\x02\xe3\x7a\x36\xea\xdc\x8c\xe9\xce\x94\x8d\xe7\x2b\xa4\x6c\x24\xb3\x11\xd3\x77\x86\xff\xb1\x2d\x7e\xdc\xb4\xf1\x55\x55\x84\xb4\x3b\x8f\xcc\x17\x9b\x6f\xc0\xd8\xe6\xdc\x92\xa3\x41\xda\x05\xa1\x2e\xc5\x5e\xde\x2f\xb4\xff\xd6\xdc\x56\xbc\xe2\x88\x7a\xb5\x80\x29\xd0\x81\x1b\x37\x86\x29\xf3\xf1\xd4\x95\xb3\x81\x1c\xe4\xda\xc9\xff\x1b\x00\x00\xff\xff\xe6\xc2\x51\x59\x27\x2a\x01\x00") func pathed_paymentHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -488,7 +488,7 @@ func pathed_paymentHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "pathed_payment-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc8, 0x36, 0x88, 0x52, 0xc5, 0xca, 0xcb, 0x5a, 0x63, 0xa0, 0xbc, 0xb3, 0xca, 0xd9, 0xa4, 0xf1, 0xfa, 0x54, 0x2, 0xc2, 0x57, 0xbf, 0x4c, 0x81, 0x74, 0x74, 0xef, 0x23, 0xd1, 0x34, 0xd7, 0x3d}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7, 0x51, 0xab, 0x17, 0x3b, 0x30, 0x1c, 0xe, 0x44, 0x69, 0x42, 0xdf, 0x58, 0xbb, 0x36, 0xd1, 0xc2, 0xe5, 0x90, 0x33, 0x7b, 0x5b, 0xb6, 0xb9, 0x5c, 0x78, 0x36, 0x2f, 0x37, 0x4a, 0xd7, 0xd9}} return a, nil } @@ -512,7 +512,7 @@ func paths_strict_sendCoreSql() (*asset, error) { return a, nil } -var _paths_strict_sendHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x69\xb3\xa2\x48\xf6\x38\xfc\xbe\x3f\x05\x51\x31\x11\xd5\x1d\x56\xb5\x90\xec\xd5\xff\xfe\x45\xa0\xe2\xbe\xef\x3a\x31\x61\x24\x90\x28\x8a\xa2\x80\xdb\x9d\x98\xef\xfe\x84\x80\x1b\xe2\x86\xdc\x5b\xb7\xe6\x19\xa6\xe6\xb6\x4a\x72\xb6\x3c\xe7\xe4\xc9\x93\x27\x93\xef\xdf\x7f\xfb\xfe\x1d\xab\x1a\x96\x3d\x34\x51\xa3\x56\xc4\x14\x68\x43\x09\x5a\x08\x53\x96\xd3\xf9\x6f\xdf\xbf\xff\xb6\xbb\x9f\x5a\x4e\xe7\x48\xc1\x54\xd3\x98\x1e\x1b\xac\x90\x69\x69\xc6\x0c\xe3\xff\x64\xfe\x24\x4e\x5a\x49\x5b\x6c\x3e\x1c\xec\x1e\xf7\x35\xf9\xad\x21\x36\x31\xcb\x86\x36\x9a\xa2\x99\x3d\xb0\xb5\x29\x32\x96\x36\xf6\x37\x86\xff\xe5\xdc\xd2\x0d\x79\x72\xf9\xab\xac\x6b\xbb\xd6\x68\x26\x1b\x8a\x36\x1b\x62\x7f\x63\x5f\x5b\xcd\x34\xf7\xf5\xaf\x3d\xb8\x99\x02\x4d\x65\x20\x1b\x33\xd5\x30\xa7\xda\x6c\x38\xb0\x6c\x53\x9b\x0d\x2d\xec\x6f\xcc\x98\x79\x30\x46\x48\x9e\x0c\xd4\xe5\x4c\xb6\x35\x63\x36\x90\x0c\x45\x43\xbb\xfb\x2a\xd4\x2d\x74\x86\x66\xaa\xcd\x06\x53\x64\x59\x70\xe8\x34\x58\x43\x73\xa6\xcd\x86\x7f\x79\xb4\x23\x68\xca\xa3\xc1\x1c\xda\x23\xec\x6f\x6c\xbe\x94\x74\x4d\xfe\xb6\x63\x56\x86\x36\xd4\x8d\x5d\x33\xa1\xd8\x14\xeb\x58\x53\x48\x14\x45\x2c\x97\xc6\xc4\x6e\xae\xd1\x6c\x60\x95\x72\xb1\xe7\xb5\xff\x73\xa4\x59\xb6\x61\x6e\x07\xb6\x09\x15\x64\x61\xa9\x7a\xa5\x8a\x25\x2b\xe5\x46\xb3\x2e\xe4\xca\xcd\x93\x87\xce\x1b\x0e\x64\x63\x39\xb3\x91\x39\x80\x96\x85\xec\x81\xa6\x0c\xd4\x09\xda\xfe\xf5\x11\x08\x65\xe7\xd3\x47\xa0\xdc\xe9\xd5\xc7\x31\xe8\x62\x7b\x9e\x3b\x97\xc0\x9d\x22\xdf\x42\x76\xd2\xea\x08\xdc\x69\x9e\x2b\xa7\xc4\xee\x49\x4b\x0f\xac\x43\xd5\x00\xa9\x2a\x92\x6d\x6b\x20\x6d\x07\x86\xa9\x20\x73\x20\x19\xc6\xe4\xf6\x83\x96\x36\x9c\x21\xd3\x79\xc4\xe3\xe6\x76\x7b\x43\x55\xbd\xe6\x16\xd2\xf5\x9d\xc5\x38\xb4\x3e\xf3\x10\x32\x1f\x6d\xad\x43\xcb\x1e\x4c\x0d\x45\x53\x35\xa4\x0c\x74\xa4\x0c\x1f\x7f\x56\x5a\x6e\x1f\xa4\x4e\x9b\x29\x68\x33\x38\xe9\xdf\x99\x05\x1d\x5b\xb7\x06\xc6\x6c\xa0\x29\xcf\x3c\x6d\xcc\x91\x09\x0f\xcf\xda\xdb\x39\x7a\xe1\xe9\x23\x25\x2f\x51\xf1\xdc\xb3\xae\x94\x9d\x07\x2d\xb4\x58\xa2\x99\xfc\x14\x0b\x27\x8f\xcf\x4d\xb4\xd2\x8c\xa5\xe5\xfd\x36\x18\x41\x6b\x14\x12\xd4\xeb\x10\xb4\xe9\xdc\x30\x77\x1e\xc9\x1b\x56\xc2\x82\x09\x2b\x4b\x59\x37\x2c\xa4\x0c\xe0\x53\xba\xb8\xb7\xe7\x10\xaa\xe4\x19\x73\x08\xa2\x4f\x9f\x84\x8a\x62\x22\xcb\xba\xfd\xf8\xc8\x36\x15\x67\xe8\x1d\xe8\x86\x31\x59\xce\x1f\x68\x3d\xbf\x47\x92\xdb\x0a\x6a\xe6\x93\x80\xf7\xe3\xce\xc3\x0f\xec\x5c\xe5\xce\x67\x3c\xd6\x74\x0f\x3e\xc4\x23\x0f\x79\xd7\xfd\x43\xce\xe8\xf2\x04\x92\xd3\xd1\xe8\xde\x13\xf3\xdd\x03\x23\xfb\x6e\x0f\x58\x67\x0e\x48\xda\xde\x55\xa3\xd1\xc1\xd2\x1f\x69\x6c\xb8\x74\x18\x77\x1b\x6a\x96\x3d\xb0\x37\x83\xf9\x7d\x90\xbb\x96\xc6\xfc\xd1\x96\xe8\xd1\x66\xfb\xd1\xf4\x76\x63\x69\xfb\xd0\x00\xb5\xe3\xf9\xae\x17\x7b\x74\x30\x76\xc3\x84\x9d\xb4\x2d\x6b\x79\x0f\xf3\xa1\xb1\x6c\x28\xe8\x91\x50\xc5\x1d\x4b\x6f\x44\x29\xde\x60\x3b\x7f\x30\xf4\x99\xa0\xed\x60\x05\xf5\x25\x1a\xec\x1c\x0d\xba\x01\xd8\xd7\xf2\x61\x0c\x01\x63\xf8\x60\x0e\x4d\x5b\x93\xb5\x39\x9c\xdd\x8c\xb8\xee\x3d\xfa\x34\x0d\x87\x31\xf8\x59\x0a\x82\x1f\x7c\x1a\xbf\xd3\xdd\x8f\xe0\x73\x1b\xbe\x3b\x7c\x57\xfd\x76\xba\xe7\x7d\xdc\x8d\x68\xfb\x78\xdd\x51\xdf\xc1\x83\x14\x0c\x0d\x73\x3e\x98\x6a\x43\x2f\xc4\xb9\x41\x82\xaf\xe5\xc3\x3c\x3e\x1f\xa4\x3f\x0c\x79\x3f\xb8\x7a\x71\xf7\x2d\xf0\xbe\xa6\x37\x71\x3c\x6a\x00\xee\xd3\xc9\x4a\xb1\x55\x2a\x63\x9a\xe2\xa2\x4f\x89\x69\xa1\x55\x6c\x3e\x08\xfb\x8a\x62\x47\x00\xd9\x53\xa9\xdb\x90\x9c\x6f\x57\x00\xb9\x0e\xe9\x76\x1b\x9f\x6f\xb9\xdd\x38\x68\x52\xe0\x3d\xd1\x10\x6b\x2d\xb1\x9c\x0c\xd1\x09\xbb\x19\x9d\x85\x16\x4f\x63\x3e\x03\xf2\xf0\xd3\x0a\x7a\xb0\xed\x71\xd2\xf0\x30\x87\x57\x5c\xd5\x33\xfc\x05\x83\x78\xec\x59\x2f\xbc\x7e\xac\xb1\x17\x4b\x3f\xcc\x9b\xe7\xb6\x9e\xe1\xc5\x7d\xe4\xc1\xb6\x9e\x75\x3f\x4e\xcf\xde\x1d\x3c\x42\x91\xcf\xf1\xdd\x6e\x7c\xe2\xc7\xee\x34\xf4\x79\x24\xaf\xb5\x90\xc9\xd4\xc5\x8c\xd0\x0c\x78\x62\xaa\xed\xa6\x81\x9a\x8c\x7e\x9f\x2d\xa7\xc8\xd4\xe4\x7f\xfe\xeb\x8f\x07\x9e\x82\x9b\x10\x4f\xe9\xd0\xb2\x7f\x87\xb3\x2d\xd2\x9d\x14\xe1\x03\x4f\xa8\x9a\x19\xf8\x48\xba\x55\x4e\x36\x73\x95\xf2\x0d\x7e\x06\x70\x38\x3c\x52\xf7\x0d\xbb\x20\xf4\x06\x8c\x3d\x77\x2f\xc0\x70\x12\x23\xbb\xc7\x8f\xc4\x7f\xc3\x9e\x61\xc4\x61\xfd\x01\x08\x62\xb7\x29\x96\x1b\x3e\x10\xfa\x7c\x68\x2d\xf4\xbd\xe6\x26\xb3\x62\x49\xb8\xc0\xf0\xd7\x6f\x6e\x76\xb8\x0c\xa7\xe8\xc7\xfe\x37\xac\xb9\x9d\xa3\x1f\xde\x23\x7f\x61\x0d\x79\x84\xa6\xf0\x07\xf6\xfd\x2f\xac\xb2\x9e\x21\xf3\x07\xf6\xdd\x49\x1a\x27\xeb\xe2\xae\xbf\x3c\xc8\x7b\x78\xbf\x9d\x41\x3c\xbf\xe9\x01\x4e\x56\x4a\x25\xb1\xdc\xbc\x01\xd9\x6d\x80\x55\xca\xe7\x00\xb0\x5c\x03\xfb\xba\x4f\x07\xef\x7f\xb3\x1c\x20\x5f\xfd\x98\xf7\xec\x7b\x38\x0f\x12\xba\xcb\xcf\x99\x2c\xcb\x95\xa6\x4f\x9e\x58\x27\xd7\xcc\x1e\xc8\x3a\xcd\x0b\x9f\xa1\x3f\x42\xf1\x11\xf2\x0c\xf3\x17\x40\x1c\x01\x54\x8b\xf1\xf9\xb0\x51\x2b\x62\x73\xd3\x90\x91\xb2\x34\xa1\x8e\xe9\x70\x36\x5c\xc2\x21\x72\xc4\xf0\x60\x1e\xfb\x94\xdc\xfb\x8a\xe6\x91\xbf\xd7\xd5\x23\xfd\xfb\xbe\x0d\x92\xe5\x41\xb3\xef\xc2\xc7\xea\x62\xb3\x55\x2f\x37\x4e\x7e\xfb\x0d\xc3\x30\xac\x28\x94\x33\x2d\x21\x23\x62\x0e\xf7\xa5\x52\xcb\x75\x7a\x8d\x66\x3d\x97\x6c\x3a\x2d\x84\x06\xf6\x8f\xc1\x3f\xb0\x86\x58\x14\x93\x4d\xec\x1f\xc4\xee\x9b\xbf\x37\xee\x1a\xe2\x6b\xdc\xdd\x03\x1f\x19\x73\x20\x88\xb9\x47\x3c\xd5\x6b\xfc\x3d\x80\xe1\xc0\xe2\xe1\xa7\x50\x1c\xfe\xfe\x1b\x86\x25\x85\x86\x88\x75\xb2\x62\x19\xfb\x07\xf1\x4f\xe2\x5f\xf1\x7f\x10\xff\x04\xff\xfa\xbf\x7f\x00\xe7\x33\xf8\x27\xf8\x17\xd6\x74\x6f\x62\x62\xb1\x21\xee\x84\x22\x96\x53\x7f\x04\x4a\xe6\x81\x71\xe0\x45\xc9\xdc\xc7\xf0\xde\x92\xf9\x7f\x61\x24\x73\x39\xa6\x7a\x72\x38\x8c\xc3\x8f\x09\xe2\x38\x6c\x5f\x40\x74\x28\xc6\xb0\xc6\x4e\x56\xd8\xdf\x47\x0f\xf0\xcd\xfd\xb9\xd9\xab\x8a\xd8\xdf\xa7\x16\xf1\x47\x90\xd5\x46\x4a\xa3\x1f\xa0\x8f\xc4\xbd\x19\x3f\x4e\x61\x60\x08\xf4\x2a\x95\x41\x40\x7d\x94\x9e\x19\xe4\x39\xb9\x47\x2d\xbb\xa4\x36\x28\xcc\x7b\x99\xda\x00\xa0\x7e\x6a\x4f\x8d\xe4\x26\xb5\xbb\x91\x4b\x41\x2a\x5c\xea\xf6\xc0\x86\x92\x8e\xac\x39\x94\x11\xf6\x37\xf6\xf5\xeb\x5f\xe7\x77\xd7\x9a\x3d\x1a\x18\x9a\x72\xb2\xc4\x7b\xc6\xeb\x45\x10\xec\xf1\xe9\x58\xd9\x63\x3c\xba\x06\x79\x91\x0a\x70\x79\xf3\x7e\xc6\xe4\x11\x34\xa1\x6c\x23\x13\x5b\x41\x73\xab\xcd\x86\xbf\x33\xd4\x1f\x4e\xd8\x50\x6e\x15\x8b\x2e\xb3\xee\x93\x0f\x35\x5d\x23\x6d\x38\xb2\x31\x6d\x66\xa3\x21\x32\x0f\x37\x2f\xfb\xf2\x74\x36\x10\x9a\xb5\x93\xfc\x89\xcb\x95\xa6\x60\x92\x36\xd4\x66\xb6\x8f\x2c\x38\x0d\x66\xd6\xd7\x6c\xb6\x9c\x1e\x26\x40\x17\x3c\xb8\x4d\x54\x1d\x0e\x2d\xcc\x9a\x42\x5d\xbf\x44\x63\x1b\x53\x3d\x40\x4c\x80\xa6\xff\xb8\x21\x0a\xff\x2c\x2a\xac\x38\xfc\x09\xab\x83\x48\x6c\xb4\xb9\x10\xc8\x7c\xae\x6b\xce\x42\x11\x66\x6b\x53\x64\xd9\x70\x3a\xc7\x76\x3a\xe9\x7c\xc5\xde\x8c\x19\xba\x24\xf4\xda\x1c\x71\x1f\x6f\x7b\x93\xcb\xc7\x68\x3e\x4c\x45\xaf\x40\xf5\xcc\x4c\xa8\x37\xdd\x88\x95\x70\x7e\xc8\x95\x93\x75\xd1\x09\x2f\x13\x3d\xef\xa7\x72\x05\x2b\xe5\xca\x6d\xa1\xd8\x12\x0f\xdf\x85\xee\xf1\x7b\x52\x48\x66\x45\x8c\xb8\xc7\x4c\x68\xb1\xfb\x01\x5d\xa8\xa2\x97\x53\xc2\x66\x68\x63\xaf\xa0\xfe\xfb\xd7\x2b\x1c\x7f\xfd\xf1\xc3\x44\x43\x59\x87\x96\xe5\x37\x2b\x6f\x81\x2c\xd8\x04\x6f\x74\x94\x9b\x29\x78\x99\x33\x37\x61\x76\xe0\x2b\xd8\x32\x8e\xe9\xd6\x87\x3c\xc5\x31\x51\x1b\xd0\x9c\x00\xc1\xcd\xdd\x0c\x6e\xc0\x03\x34\x73\xcb\xc2\x82\x93\x2d\x11\xa9\xed\x29\xcc\x0f\x53\xda\x5b\x8c\x60\x95\x4e\x59\x4c\x61\x89\xde\x1d\x8e\xdc\x04\xe8\x6d\x86\x0e\xb0\x7c\xb7\xff\xd4\x94\x6b\xb4\xed\x33\x60\xaf\x6a\x9d\x07\xc7\x53\x3b\x9f\xcd\x0c\xae\x79\xfa\xcb\x84\xdf\xb5\x96\x5f\x9c\xd5\xb6\x2f\x57\xb4\xd9\xd1\xe3\xe0\x5b\x0a\xb2\xa1\xa6\x5b\xd8\xd8\x32\x66\xd2\x75\x65\xdb\xa7\x0d\x5f\x95\x83\x07\xc7\x93\xc3\xbe\x58\xe2\x0a\x6d\x27\x15\x0c\x0f\x59\x61\x50\xf1\x44\xf0\x83\x9e\x58\x4e\xf2\xc4\x6e\x00\xb1\xa7\x63\xef\xe5\x70\x1f\x86\x63\x47\x3c\xd6\xfe\x50\xc1\xe0\x1b\x98\x8c\xa5\x7d\x1c\x9b\xfc\xcf\x98\x08\xda\x77\x1f\x72\xdb\x2e\xe7\xca\xc3\x6d\x0f\xaa\xe3\x7d\xf5\x15\x77\x5c\xf0\x42\x5c\xc4\x03\x36\xd4\x07\xb2\xa1\xcd\xac\x60\x1d\x54\x11\x1a\xcc\x0d\x43\x0f\xbe\xeb\x2c\xb7\xab\xe8\x5a\x5f\x3b\xb7\x4d\x64\x21\x73\x75\xad\xc9\x2e\xce\xb6\x37\x03\x27\x4c\xd2\xde\xae\xb5\x9a\x9b\x86\x6d\xc8\x86\x7e\x95\x2f\x7f\x1f\xed\x95\x05\x41\x05\x99\x4e\x78\xe1\x05\x8a\x4b\x59\x46\x96\xa5\x2e\xf5\xc1\x55\x45\xf1\x18\x87\x9a\x8e\x94\x7b\xad\x3c\xd2\xaf\xa8\xd0\x75\xd3\xbb\x92\xed\x7f\xd5\x12\xaf\x2c\x49\xdd\x19\x17\x1f\xf7\x48\xf7\x7d\xdc\xb3\x2c\x47\x3b\xd4\xdd\xc4\xf1\x51\x43\xdf\x53\x8c\xbe\x38\x14\xde\xc4\x75\x39\x34\x06\x37\xbf\x31\x54\x9e\xac\x85\x45\xa6\x9b\xf7\xa6\x42\xe7\xe5\x7e\x57\xa6\x4b\xbb\xd9\x81\xec\xb2\xe2\x8c\x92\x2f\x0e\x92\x9e\x77\x30\x96\xa6\x7c\xa8\x1f\xba\x32\x3c\xed\x5d\xce\xd7\xaf\x3f\x7e\x5c\x9f\xae\x5d\xb7\x03\x6f\x29\xf2\x55\x71\x7a\x75\xba\xbf\x47\x1a\x53\x78\x6e\x33\xcc\x08\xe7\x2c\x39\x5f\x45\xeb\xab\x12\xbe\xd5\xc8\x2b\x5c\xbe\xd5\xc4\x9d\x2b\x07\x36\xb8\xac\xb7\xbe\xd3\xee\x26\xba\x43\xab\x1b\x18\x1d\x92\x34\xcb\xab\xe8\xc5\x24\xc3\xd0\x11\x9c\xed\xc7\x2d\x4d\x46\x83\xd9\xd9\x18\xed\xfe\x76\x3e\x6e\x1f\xcb\xdc\x06\xbe\x11\xfd\xac\xd0\xce\x7f\xf3\xa4\x5c\x22\xb0\x2a\xdb\xa1\x7a\xe0\xd4\xed\x63\xc9\xac\x98\x2c\x60\xbf\xff\x7e\x2a\xc1\xff\xfb\x1b\xc3\xff\xf8\xe3\x1e\xac\xa0\xe7\xf7\x52\xfb\x7f\x17\x82\x7c\x00\xde\x99\x50\x7d\xe0\x7d\x12\x77\x29\xbc\x69\x4c\xc1\x55\x01\x11\x98\x57\x70\xe1\xc8\x83\x63\xe9\x23\x4e\xec\x95\xd1\xf4\x5e\x4d\x45\x34\xe3\xe9\x1d\x2c\x1f\x35\xa2\x3e\xc9\xec\x8b\x63\xea\x1d\x6c\x97\xa3\xea\xb5\x07\x6e\x8c\xab\x67\x75\x34\x11\xea\xea\x5e\x3f\x4f\x49\x7a\x78\xaa\xe5\x79\xff\x3b\x13\xb8\x47\x87\xde\x67\xf2\xb7\x7b\x0b\x38\xa0\x0e\xb4\x97\xdd\x5c\xe1\xfa\x64\xe3\xda\x34\xee\xa7\x4c\xc4\xec\xcd\x00\xcd\x56\x48\x37\xe6\x28\x28\xb9\x69\x6f\x76\xd3\xa2\xa5\x6e\x5f\xb9\x39\x45\x36\xbc\x72\x6b\x37\x21\xbb\x76\xdb\xd2\x86\x33\x68\x2f\x4d\x14\x94\x87\xe3\x99\x3f\xfe\xf9\xaf\x63\xf4\xf2\xef\xff\x04\xc5\x2f\xff\xfc\x97\x5f\xe6\x68\x6a\x5c\x49\x99\x1d\x61\xcd\x8c\x19\xba\x19\x0d\x1d\x61\x5d\x82\xf1\x38\xd3\xa6\x68\x20\x19\xcb\x99\xe2\xe4\xb5\x39\x13\xce\x86\xc8\x3f\x67\x3b\x1f\x5c\x77\x92\xd8\x41\x1b\x22\xe5\xfa\x84\xcb\x5f\xe5\x16\xd6\xd6\xfc\x35\xbb\xae\x99\x4d\xd0\xf6\x5e\x36\xdd\xa5\xd5\x79\xf4\xf9\xc4\xbb\x57\xc7\x17\x96\x68\xaf\x70\x79\x9f\x97\xd9\xc5\x27\x9a\x72\x27\x37\x79\x12\xcd\x5d\x1b\xb7\xbc\x0d\x4f\xce\x88\x1f\xa4\x86\xee\x8e\xa3\xab\xb7\x6f\x05\x53\x4e\x70\x34\xbb\x9a\x05\xd0\x64\x74\x6d\xe0\x75\x6e\x62\x8a\xb1\x94\x74\x84\xcd\x4d\x24\x6b\x4e\xa2\x20\x68\x6d\xe4\x4a\xec\x1b\xb0\xc7\xea\x81\x65\x22\x5f\x0a\x5a\x53\xf6\xbd\xb5\x2f\xd4\x7c\x64\x0c\x72\xbb\xcb\xa9\x8f\xbd\x53\x03\xda\x10\x9b\x37\xd2\xf5\xa7\x89\xd1\xd3\x64\xfd\x73\x53\xd5\xe8\x98\x78\xb0\x44\xf6\x26\x53\x37\xa7\xb8\x8f\x30\x79\x35\x94\x8b\x8c\xcd\x87\xab\x8c\x6f\x32\x7a\x27\xee\x08\x66\x35\x05\x6d\x88\xa9\x86\xf9\xc8\xa2\x2c\x96\x12\x9a\xc2\x1d\x1e\xaf\xc1\xbd\xb2\x18\xfa\x02\xc8\x5b\x8b\x8a\x8f\x80\xcd\x95\x1b\x62\xbd\x89\xe5\xca\xcd\xca\xc5\xc2\xa2\x13\x59\x36\xb0\xdf\xbf\x12\x03\x6d\xa6\xd9\x1a\xd4\x07\x6e\x11\xdb\x9f\xd6\x42\xff\xfa\x0d\xfb\x0a\x70\x82\xff\x4e\xe0\xdf\x71\x16\x23\xf8\x1f\x14\xf9\x03\xa7\xff\x24\x09\x9a\x26\xd9\x18\x0e\xbe\xfe\xf1\xd7\x63\xd0\xc1\xc0\xdd\x31\x76\xd6\x5b\xd2\x76\x60\x1b\x9a\x72\x13\x13\xa0\x39\x8a\x7f\x06\x13\x39\x58\x5a\xe8\x10\x1e\x0d\xb4\xd9\xc5\x2e\xb5\xdb\xf8\x78\x8e\x21\x9f\xc1\x47\x0d\xa0\xa2\x0c\xfc\x69\xd7\x9b\x38\x48\x8e\xa3\x9f\x92\x1e\x3d\x70\x83\xb1\xfd\xbc\xd0\x29\x47\xb8\x89\x82\x62\x69\xfe\x29\x36\x98\x3d\x0a\xcf\x33\xde\x47\x41\x03\x8e\x7a\x06\x03\xeb\x0e\x19\xdb\xc7\x99\x60\x68\x92\x79\x4a\x4e\x9c\xd3\x17\x70\x38\x34\xd1\x10\xda\x86\x79\xbb\xab\x59\x9c\xc2\x9f\x52\x2d\xee\x4c\x46\xde\x36\x8e\xfb\x6c\xb0\x34\xcb\x3f\xc5\x06\xef\xb0\xe1\x66\xe4\x07\x1b\xc5\xbc\x0d\x9d\xe3\x59\xf0\x0c\x74\x02\x77\xc0\x7b\xbd\xe0\x04\x03\x37\x11\x70\x04\xc7\x70\x4f\x21\x20\x4e\x11\x1c\xa6\xec\x3b\xfb\xbf\x8d\x88\x26\x9e\xea\x0e\x02\x9c\x75\x84\x97\x24\x71\x4f\x63\xb8\x89\x88\x27\x28\x9a\x78\x0a\x13\xe9\x72\x73\xc8\x2d\xdd\x56\x2c\x9e\xc5\x79\xe6\x29\xf8\xd4\x40\xd5\x36\xfb\x4d\x4e\xc6\x54\x1f\xa8\x1a\xd2\x6f\x3b\x46\x9e\xe3\x9e\xb3\x3f\x82\xde\x2f\x0c\xee\x17\x6c\x36\x37\xd9\xa0\x70\x9c\x65\x9f\xf2\x21\x04\x33\xd0\x66\x43\x64\xd9\x83\xcb\x25\xa1\x3b\xa8\x00\x78\xce\x14\x09\xf6\x2c\x08\x70\xd6\xde\xe0\xed\xa1\x84\xc2\x49\x9e\x7a\x8e\x1f\xee\xa0\xbd\xaa\x61\xee\x03\x85\x9b\x38\x08\x9c\xa3\x9e\xeb\x15\xde\x55\xaa\xdb\x60\x01\xa0\xc0\x53\x1a\x05\xf0\x00\xd2\xef\xdb\x20\x05\x28\x1e\x7f\x0e\x11\xb1\x37\x74\x13\x4d\x8d\x15\x1a\xbc\x21\xd3\x38\x24\x2c\x8d\x99\x65\x9b\x50\xbb\x33\xe8\x52\x80\x3b\x1a\xcc\x95\x18\xe8\x66\x89\xcf\xb3\x41\xd0\x45\x99\xcf\x9e\x1d\xe2\x1b\xf6\x35\x93\xe8\x66\x6a\xf9\x4e\xbb\xd8\xa9\xf4\xb2\xe9\x62\xbb\x59\xe8\xb4\xe9\x74\x26\x2b\x90\xc5\x72\xaf\x07\xf2\xb5\x42\x89\xad\x08\x79\xa1\x25\xd6\xd2\x2d\xa6\x58\x4d\x36\xc4\x74\xbb\x5b\x29\xfb\x45\x76\x15\x09\xd8\x21\x49\x76\x0b\x19\xa6\x5e\xa6\x2a\xe5\x9c\x58\x4d\x96\xca\xe9\x04\x4b\x02\x81\x22\x99\x3e\x5d\x2d\xa7\x1a\xf5\x62\xa6\x53\x60\x33\x89\x62\xb2\x54\x2b\xe6\xd2\x15\xaa\xc1\x8a\xbd\x4e\xbb\xf5\x30\x12\x72\x87\x44\xa0\x3b\x89\x6a\x4f\xa0\x7b\x54\x47\x10\xb3\xdd\x4e\x1d\xb4\x0a\x15\xd0\xaa\x50\x89\x56\x26\xdb\xaa\xb1\x94\xd8\xaa\x16\x2a\x65\x50\xcb\xb6\xa9\x4e\x3d\x5b\xc9\xd5\xcb\x85\x42\xf6\xa2\xf3\xaf\x22\xa1\x1c\x4e\x00\x59\x4b\x83\x6c\x4b\xa4\x81\x50\xea\xb6\xd2\xad\x2c\x29\xf4\xf2\x42\xb7\x9b\xe9\x76\xdb\xa0\x9d\xed\xf6\x7a\x75\x46\xec\x75\xc5\x66\xb5\x90\xea\xf6\x1b\x42\x87\x61\xbb\x15\xea\x61\x24\xb4\x83\xa4\x56\xed\x65\xb2\x54\x81\x66\xbb\x89\x94\x58\x2e\x14\xba\x34\x5d\x48\x35\x3b\x95\x66\x81\xee\xa4\x3a\xf5\x5a\x25\x0b\x8a\x59\x31\xd5\x25\xc5\x42\x3b\x57\xab\x17\x4b\x62\x23\x93\xc8\x3c\x8c\x84\x71\x3a\xbe\x5e\xed\x65\x73\x45\x90\xcc\x91\xe9\x72\x8d\x4a\x74\x8b\xe9\x52\x39\x55\x4c\xe7\x5b\xe5\x6a\x0b\x64\x7b\x64\xbf\x94\x6e\x64\x2b\xe5\x56\x52\xac\x08\x8d\x0e\x5b\x4b\xb2\x95\x2e\xc8\x7e\x0d\x5b\x5c\xb7\x9b\xe4\xdc\xd1\x5a\xaf\xe0\xfa\xb8\x57\xe2\x4f\x0b\xdd\x2e\x3c\xfb\x86\x31\xdf\x30\xdb\x5c\xa2\x07\x6c\xe9\xb2\xa4\x2c\xb4\x25\xb9\x73\xf0\x53\x3b\x92\x4d\xa4\x68\xf6\x00\xea\xf3\x11\x9c\x2d\xa7\xd4\xce\xfa\xc5\x56\xfd\xeb\x7b\x74\xe7\x39\x76\x70\x05\x7b\xab\x91\xfa\xfa\x1e\x1a\x7b\x8e\x7d\x67\x79\x33\x68\x6b\x2b\xb4\x43\xe6\xfc\x3f\x5c\x11\x5b\x34\xea\x71\x96\xe8\xf8\x86\x91\x8f\x2a\x47\x50\xe9\x57\x58\xed\xd8\x97\x7f\x9d\x88\x08\xd0\x2c\xc3\x73\x38\xcb\xb1\xe4\x37\x8c\xf8\x86\xed\xfa\xec\xdf\x5f\xdc\x71\xe3\xcb\x0f\xec\x0b\x41\xfe\x89\xbb\xd7\x97\x6f\xd8\x97\x63\x81\xe1\xee\x9e\xd8\xaa\x1f\x7f\xb4\xb7\x73\xe7\x47\x7f\x87\x1f\x5b\xb8\x85\x86\xbb\x36\x61\xf5\xee\xcb\x7f\xae\xf5\xbd\x9f\x33\xe0\xe3\x0c\x38\x12\x3f\xe7\x0c\xbf\xce\x59\xab\x91\x0a\xcb\x59\x38\x9d\x0e\xcf\xd9\xee\x9f\xcb\x9a\x9b\x2e\x75\xa8\x08\x39\x74\xee\x38\xda\x87\xd6\x5f\x7e\xec\x40\x7f\xb1\x0c\x5d\x19\x5c\x13\x9a\x64\x2c\x87\x23\x7b\x70\x4d\x5b\xdc\x67\x83\x04\x7b\x72\xe7\x96\x74\xf7\xf0\x83\xb4\xee\xec\xde\x2d\x20\x27\xb8\x22\xe8\x27\x3f\xe6\x8f\x54\x6a\xc2\xd7\xf5\x54\x50\xd7\x87\x0c\x68\x1e\xe8\x7a\xf2\x76\xd7\xe3\x77\xba\xde\xeb\xb7\x57\xba\xde\xd3\x9e\x57\xbb\x3e\x64\x3f\xdd\xea\xfa\xf7\xb6\xfa\x83\xa7\x26\x08\x9e\xe1\x83\x3d\x35\xfd\x27\x47\xfd\xc2\x9e\xda\xe3\x2c\xc8\x53\x83\x5f\xdb\x53\x7b\x9c\xbd\xa3\xa7\x26\x02\xcc\x15\xdc\xf3\xd4\xe0\xbd\x3c\xf5\xbe\xa1\x1b\x7d\x45\xef\x83\x9f\x77\x98\x5e\x0f\xbc\xa3\xc3\x0c\xea\x81\x33\x11\x5f\xf6\x00\xb8\xe2\x30\x2f\xc5\x17\x89\x33\xfc\x69\xbe\xcb\x6f\x07\xf4\xfb\xd9\x01\x78\xbe\x17\xce\xbc\xe6\xf3\xbd\xf0\x6c\x34\xf2\xf3\x83\x07\xaf\x17\x98\xf7\xb3\x85\xa0\x5e\x38\x13\xf3\xf3\xde\xe8\x85\xe0\xe1\x61\x6f\xf4\x01\x3d\x40\xb0\x04\xcb\x73\x2c\x09\x38\x22\x78\x0c\xc7\x7f\xcd\x49\x09\xe5\x63\x2d\x70\xba\xf5\x6b\xb2\x76\xec\x35\x96\x64\xd9\xe7\x7b\xed\x13\x87\x5e\xb4\x8f\xb5\x67\x7b\xed\x13\xb3\x06\xf6\xac\x71\x04\x75\x2d\xb3\xf1\x8b\x2a\x24\xe5\x63\xed\xbf\xc8\xd6\xc8\x03\x6b\x34\x7d\x6d\x96\xf3\x8b\x2a\x24\xed\x63\xed\xbf\xc8\xd6\x76\x1e\x12\x70\x1c\xc5\xe3\x34\xcf\xd1\x6e\xaf\xe1\x0e\x6f\xba\x36\xd5\x1c\xd6\x78\x00\x48\x92\x05\x38\xc9\x70\xf4\x9f\x14\xcb\xd2\x1c\xce\xfe\x52\x9a\x09\xf6\x3c\x12\x38\xbe\x1f\xbb\xff\xdb\x78\x24\x0f\x3c\x52\xc4\x7e\xa4\x0b\xc5\xe3\xaf\xa0\xab\x04\x07\xf6\xe3\xc2\x7f\x1b\x8f\xd4\x37\x8c\xa3\x39\x9e\x27\x39\x86\x73\x9d\xa8\xcb\xa1\x65\x43\xd3\xd6\x66\xc3\x81\x04\x75\x38\x93\x91\xdf\xe7\x3c\x8c\x80\x39\x47\xf0\xa8\x2b\xf3\x05\xe2\x61\xf9\xd9\xf5\x9a\xcb\x90\x7b\x30\x8a\x37\xf9\x76\x17\x41\x06\x13\xb4\xfd\x18\x6b\xa1\x3d\xaa\x28\xc0\x7a\x4e\xef\x9d\xa4\xec\x21\x78\x6f\x29\xfb\xf8\x79\x50\xca\x1f\x60\xaf\x2e\x55\x0c\xe7\xb9\xdd\xf7\x92\xb2\x8b\xe0\xbd\xa5\xec\xe3\xe7\x31\x29\x87\xcd\x8d\x3c\xe3\xf9\x1d\xaa\x68\x9c\xf7\x1c\xff\x3b\x49\xd9\x43\xf0\xde\x52\xf6\xf1\xf3\x98\x94\x43\x16\x69\x3c\x15\x43\xb8\x54\xd1\xb8\x37\xf4\xbc\x97\x94\x5d\x04\xef\x2d\x65\x1f\x3f\x0f\x7a\x8c\x90\x19\xa6\xff\x3c\x50\x93\x14\x74\x3a\x48\xd8\xa5\xf2\xfd\x09\x21\xa7\x85\x29\x0a\x47\x31\x24\xc9\xaa\x0a\x8f\x00\xcb\x50\x24\x4f\x51\x8c\x02\x20\x4d\x01\x55\xe2\x59\x49\x66\x20\x24\x18\x1a\xc7\x11\x54\x68\x59\x61\x10\x4f\x00\x8e\x65\x59\x59\x41\x0a\x22\x70\x56\xfe\xba\x83\x81\x10\xcf\xb0\x12\xc5\x49\x32\x4e\xab\x48\x61\x01\xae\x50\x40\xc1\x71\x96\x20\x39\x85\xe3\x65\x05\x47\x38\x43\xb2\x8a\xa2\x52\x14\x8f\xb3\x08\xec\xe2\x31\x92\x51\x70\x85\x95\x19\x8e\xf9\xea\xf4\x2b\xf0\x55\x70\xb1\x4e\x05\x17\xe3\x2f\xec\x62\xbd\xc2\x2e\x86\xe7\x19\xfa\xfe\x5d\x6f\x71\x91\x64\x59\xe6\x1b\x46\xec\xfe\x8f\x5f\x5c\xdf\x30\x82\x77\xfe\x7a\x7f\x0e\xbf\x1e\x3e\xec\x68\x13\x04\x41\x48\x95\xd9\x79\x9f\x6d\x14\xd7\xe9\xb8\x2d\x0f\x89\x24\x2e\xc8\xcd\x71\x6f\x56\x4e\x0d\x7b\x24\xa9\xd6\xf3\x89\x58\x3e\x9f\x4e\x49\x35\x82\x83\x99\x14\x9d\x17\xd6\x80\x43\xa9\xe4\x34\x05\x88\xe6\x72\x53\x35\x67\x1d\x26\xd3\xe7\x8d\xba\x54\xce\x4c\xaa\xa3\x5c\x5c\x81\x53\x7e\x48\x6c\x4b\x3b\xd0\x42\xb7\x6f\xd3\x85\xa1\x70\xb8\x90\xd0\x2e\xbe\x6d\x56\xeb\x37\x61\xb2\x6e\x25\x48\x66\xb9\x5d\x76\x19\xa2\x92\x78\xdb\xf4\xf3\x96\x56\xd3\xe3\xbd\xba\x91\xcd\xb0\x7a\xaf\x00\x46\xa6\xb4\x7e\xab\xb2\x3c\xdf\x5b\xa9\x85\xa9\x12\xaf\x4c\x09\x4a\x95\x01\x5f\x45\x85\x59\xab\x27\x8c\xf8\x22\xdf\x4a\x34\x28\x3b\x5b\xa8\xed\x20\xf7\xca\x54\x11\xbe\xcd\x41\xed\x88\x4c\x50\x2c\xe1\xfc\x4a\xed\xfe\xf4\x85\x2e\x41\xd5\x04\x21\x85\xe7\x85\x5f\xed\x72\xb5\x8a\xf8\xe6\xec\x18\xba\x62\xfe\x7e\x8b\xa0\xa3\xd1\xe6\xaf\x32\x0e\x09\x12\x70\x32\x64\x54\x45\x92\x54\x1a\x92\x94\xa4\x90\x04\x04\x2c\xab\xd2\x2c\xcf\x12\x94\x2a\x11\x9c\xc2\xd3\x12\x89\x53\x08\xe2\xb2\xc2\x49\x8a\xc4\x2b\x32\x8b\x38\x4e\x55\x28\xb7\x98\x86\x0c\x56\xee\x6b\x3a\xcf\x92\x1c\x4b\xdc\xbb\x09\x08\x8a\xa5\x38\x92\xa1\x38\xfc\x96\x3d\x30\x0f\xda\x43\x29\x39\x2a\x19\xdb\x69\x5c\x5a\x11\x06\xbe\x6a\x66\x34\x25\xde\xa6\xe5\x56\x6c\x33\xee\x77\xde\x12\x15\xa3\x04\x8a\x80\x26\xb3\x4c\x2e\xde\x6a\x4a\xf5\x49\x7c\xd3\xad\x8c\x60\x03\x2c\x32\x1b\x92\x4d\x67\x47\xe5\xb7\xf5\x14\x8d\x57\xca\x54\x59\xae\x8d\x86\x42\xad\x69\x4e\x13\x58\xce\xe9\x3f\xc7\x1e\x4e\x54\x54\xd7\xca\x19\x39\x91\x4d\xf4\xd9\x74\x2d\x35\x17\xf0\x59\x8c\x64\xf5\x8d\xa2\xa8\x6c\xce\xa4\x27\x7d\xa2\xc6\x2e\x66\x72\x7d\xb6\x79\xeb\x4c\x8a\x05\xa9\xd0\x4c\xc9\x00\x6a\xeb\x4e\x72\x36\x4c\x0a\x09\xa3\x98\x61\x87\xf2\xcc\x62\x6c\x19\xb1\x22\xa7\x4c\xc4\x95\xf4\xa6\xe5\xfb\x0e\xe4\x56\x80\x3d\xf4\xfd\xea\xf4\xdf\x60\x0f\xa4\x33\x3c\x3f\x61\x0f\x54\x34\xba\xfc\x95\x67\x01\x2d\xc9\x8a\x22\xa9\x0a\x02\x10\xb0\x3c\xab\xb0\x34\x29\xb3\x24\x4f\x23\x85\xe1\x38\x1c\x47\x94\xa2\x02\x16\xf1\x80\x94\x20\x4f\x01\x1e\xd0\x34\x43\x22\x92\xa5\x09\x16\x72\xbb\x51\x86\x72\xfe\x05\xe8\x36\x75\x55\xe5\x69\x1c\xe7\xae\x1b\xc4\xfe\xae\x9b\xc2\x62\x78\x82\xa3\x6e\x59\x04\xf9\xa0\x45\xe4\x65\x7d\x55\x06\x71\x52\x33\x66\x3a\xaf\x34\x37\x6f\x3a\x22\x8c\xa1\x40\x97\xb9\x19\xd3\xa8\x30\x7a\x72\xa2\xb7\xc7\x14\xd9\xea\x2e\x4a\x89\x4a\x01\xa1\x18\x3f\x19\x16\x26\x69\x00\x7a\x93\x2e\x5b\xef\xe4\xd3\xcd\x54\xcd\xa0\xb2\xb8\x60\x12\xfd\xd6\x7a\x64\x25\x60\x7e\xa8\xba\xc3\x82\x63\x11\x27\x3d\x5a\x1a\x67\x2a\xad\xe9\x7a\xd8\x63\x17\x75\x09\x6f\xdb\x64\x6b\x59\xa7\xfb\x8b\x29\xa2\x27\x60\x31\xce\x72\xec\x22\x3b\x12\xea\x68\x8d\x2f\xd6\x70\xa8\xf7\xd5\x9e\x3d\x4d\x4d\x93\x31\xc6\x10\x52\xfa\x96\xa3\x38\x32\x06\xda\x53\x5b\x15\x49\x88\x37\x1a\x7c\x36\x9b\xa7\x34\xad\xed\xa0\xaa\x05\x58\x44\xab\x15\xa4\x55\xbf\xb8\x45\x50\xcf\x5a\x04\x19\x8d\x36\x7f\xc5\x29\x44\x22\x09\x41\x95\x57\x08\x89\x43\xb8\x4a\x53\x34\xa7\xd0\x24\x4e\x30\xbc\x8a\x70\x85\xe3\x55\x42\x52\x15\x85\x95\x14\x4a\x91\x39\x85\x92\x70\x9a\xa3\x24\x40\x32\x0a\xc1\x22\x82\xbe\x65\x11\xe4\x55\x9d\x67\x28\x8e\x67\xef\xde\xf5\x32\x9f\x04\xc7\x71\x37\x2c\xe2\xd1\x90\x49\x68\x8e\x99\x98\x49\xe3\xd2\x78\xc8\xb7\x3a\xe5\xd6\x3a\x3d\x8f\x0f\x41\x9e\x93\xe2\x0a\xe2\x9b\xf2\xb8\x65\xa5\x47\xc5\x1c\xc0\xbb\x54\x7b\xbc\x7c\xd3\x8b\xba\x50\x55\x63\x84\xb5\x6e\x01\x75\x43\x40\x7b\xd9\x54\x09\x75\x5b\x41\xe9\x4d\x8a\x1f\x6f\x8c\xa6\x3d\xca\x76\x13\x73\xc3\xe9\xc0\x9d\x41\xe4\xd7\xbb\x4f\xb9\xc3\x1f\xc1\xd1\xd9\xe3\x8f\xc2\x5a\xa8\xd6\x26\x6e\x87\x6f\xd9\x5a\x17\x55\x26\xb5\xda\xb0\x95\x19\x66\x6b\x13\x19\xc6\x16\x4a\x79\x99\x4d\xf5\x97\x1d\x31\x39\xb1\xc5\x7e\xaf\x92\x49\xae\x97\x69\x2d\xbe\x8a\x1b\xcb\x55\xc1\x5c\x51\x1c\x5e\x6f\x16\x67\xa5\x54\x3a\x5b\xef\x94\x96\xeb\x58\x01\xc4\xd3\x5a\xb3\x94\x48\x0d\xdf\x66\xb1\xf6\x38\x1b\x73\x0c\xa6\x14\x60\x30\x15\x31\x48\xe9\xfe\xff\x66\x30\x20\x1a\x65\xff\xca\x90\x0a\xcf\xa9\x34\xc9\x20\xc4\x70\x0a\x21\x01\x56\xa2\x25\x8e\x57\x01\x09\x55\x9a\x24\x08\x89\xa5\x19\x1e\x02\x4a\x85\x2a\x41\xe1\x24\x54\x70\x89\x06\x12\x43\x92\x12\xce\x4a\x88\xe7\xbf\x3a\x45\x1a\x74\xa0\xee\x83\xab\x26\xc1\x32\x2c\x77\xf3\xe6\x6e\x04\x71\x33\x79\x14\xcd\x83\x1b\xe6\x42\x5f\x31\x17\x77\xc6\xec\x88\x37\x53\xed\x8f\x89\xf2\x92\x36\x70\x29\xcf\x76\xa8\xd9\xb6\xb2\x6a\x6d\x32\x64\x7b\x6e\x4c\x62\xab\xb4\x50\xb1\x93\x44\x01\x94\xd8\x04\xcb\xf4\x47\x33\x55\x12\x53\xf3\x6c\xb5\xa7\x50\xf4\xac\x26\x37\xd9\xee\x44\xcd\x95\xd6\x8d\x2e\x3f\x4c\xa7\xf8\x98\xda\x81\x36\x4b\x30\xb5\x5c\x47\x76\x40\x3b\x96\x72\x32\xb9\xa8\xf1\x53\xae\xd8\xc8\x70\x12\xdd\xc1\xa5\xe5\x46\xb4\x17\x96\xdd\xae\xbd\xb1\xb9\x76\x3c\x6b\xa6\xa6\x19\xd1\x56\x04\x6a\x9a\x14\x53\xdd\xf5\x1c\x0c\x27\x06\x80\xbd\xca\x78\x9b\xe1\x3b\x65\x9d\x49\x0a\x59\xa3\x44\x13\x85\x4d\x3e\x5d\xe0\x87\xb8\x51\x59\x16\xc9\x89\xc5\x69\x5d\x07\x7e\x2e\xc0\x12\xb2\x78\x90\x36\xed\x2d\x41\x10\x12\x93\x77\x55\xdb\x77\xb8\x5c\x6d\x7a\xce\x12\x88\x68\xb4\xd8\x39\x2b\x01\xf3\xf4\x86\xe0\x59\xfc\x3b\x4e\x7c\xc7\x09\x0c\xc7\x7f\x38\xff\xae\xaa\x2b\x8f\x13\xe4\xf5\x60\x69\x7f\x97\x02\x3c\xc5\x33\x2c\xe0\x6f\xcd\x97\xef\xaa\xf2\xa7\xbc\x12\xdd\x82\x46\x6d\xe3\xdb\x46\x21\xc1\xa6\x66\x29\x3e\x0b\xf0\xcd\x38\x11\xb3\xf0\xa1\x6d\xad\x73\xeb\x37\xa2\xab\x34\x3a\x3d\x98\xc8\xc3\xb4\xa3\xca\x62\x80\x2a\x07\x5f\xbf\xb8\x2a\xe3\xa7\xaa\x7c\x27\x21\xf5\xc0\x99\x99\x61\xf3\x53\x57\xce\xa9\xb8\x56\x2a\x0e\xae\xd8\xdd\x1d\x30\x17\x9b\x0d\xc2\x81\xf1\x57\x2f\x87\xa4\x86\xf2\x17\xd4\x86\x03\x43\x1f\xc0\x30\x38\x43\x87\xa6\x86\xf1\x81\x09\x49\x0d\xbb\xcf\x33\x50\x38\xed\x24\xdf\xc3\x81\xe1\x0e\x60\x28\xc6\xc9\x2e\x87\x03\xc3\x1f\xc0\x70\xac\x53\x81\x11\x0e\x0c\x81\xfb\x0a\xc2\xa8\x90\x70\x2e\x6a\xe6\x42\xc2\x01\xbe\x52\x27\x3a\x24\x1c\xd2\x5f\x0d\x16\x12\x8e\xbf\x88\x27\xac\x7c\x68\x7f\x31\x50\x48\x38\x8c\xaf\x3c\x25\xac\x7c\x58\x1f\x9c\x90\x46\x41\x70\xfe\x9a\x92\x90\x70\x78\x5f\xdd\x46\x58\x3f\x88\xfb\x6a\x23\x42\xf2\x05\x2e\xea\x0f\x42\xc2\x01\xe7\x6b\xe2\x4c\x48\x30\xe4\x39\x98\x90\x5a\x08\xa8\xf3\xb5\xe3\xb0\xd4\xf8\x96\xa0\x43\xea\x20\xf0\x2d\xe9\x86\xa5\x86\xf5\x2d\x3d\x87\x04\xc3\xf9\xd6\x22\x43\x82\xe1\xcf\xc1\x84\x64\x8a\xc4\xcf\xd7\xec\xc2\x82\x21\x7c\x2b\x8d\xd1\x1c\xa1\x1d\xc9\x46\xdb\xdb\x87\x6f\x7d\xc3\x76\xb4\x3f\xb6\xf3\xf6\xca\x49\xd2\x2f\x47\x6c\xa7\x1a\x7f\x1a\xa2\x1d\xbe\xb8\x4b\x31\x84\xbb\x78\x6b\x1b\x2f\xad\x4e\x7f\xc3\xbe\xa8\xa6\x31\x7d\xb5\xba\x7f\x0e\xed\xd1\x97\x1f\xd8\x3f\xff\xf5\x0d\xfb\xb4\x9b\x83\x9d\xca\x7e\xf7\x38\xec\x2b\xbb\x12\x15\x64\xd9\xda\xcc\xd5\x8e\xa9\x36\x73\x1a\x9c\x6f\xc2\x71\x1f\x0f\xde\x08\x75\x72\xef\xf6\xa6\xc3\x93\x86\x91\xd4\xef\xbd\xc3\x39\x15\x57\x95\x71\x1f\xa1\x1f\xbe\x70\x9f\x57\x19\xff\x7d\xa5\x80\xc1\xa7\xa4\x9f\x6a\x5f\x64\xa0\x92\x82\x3b\x4a\x0a\xfe\xa7\xa4\xe7\x4a\xea\x4d\xdc\x0e\x5f\xa8\xcf\xab\xa4\xe7\xca\xf8\xa9\x2a\xbc\x03\x75\x91\xbc\xe7\x30\x71\xfc\x7f\xda\x78\x08\xe7\x4f\x26\xee\xc7\x2f\x8c\xa3\x8d\xae\x32\x3a\xe7\xba\xb9\x3d\xcf\xe3\xce\xff\xbe\x9c\x29\x04\x38\xb3\x6d\xf7\xa4\xfd\x1d\xf3\xff\xfe\xe2\xec\x2a\x25\xbe\x61\x5f\x76\x62\x27\xf0\xff\x9c\xef\xb1\xc3\xbf\x61\x5f\xdc\x53\x6b\xaf\x6c\x0b\x3d\xbd\x77\x53\xf6\xee\xd1\xb8\xd7\x77\x3d\x9e\x02\x8a\xac\x6f\x22\x3e\xdb\xe9\x7a\xdf\xb8\xd9\x90\xe3\x17\x10\xdc\x37\x1c\xe9\x5c\xbe\xbe\xa1\x6e\xf5\x0d\xe3\x75\x0d\x7d\xaf\x67\x02\x36\x20\x9e\xc9\xdc\xbf\xc7\x31\xb0\x43\xee\x77\x5d\x24\x25\xe6\x1f\xda\x37\x6e\x8a\xe9\xf8\x85\x0b\xee\x1b\x96\xe1\x01\x89\x73\xbe\xbe\x61\x6e\xda\x0d\xf9\xc1\x76\x13\xba\x0f\xa3\x36\xaf\x5f\x59\x2d\xce\x33\x7d\x87\x2f\xb8\x3b\xb8\x9f\x8e\xed\x2f\xec\x16\x3f\x8e\xed\xe1\x25\xfc\x89\x77\xda\xbd\xc3\xb9\x5a\xd7\x7b\xca\xcb\x81\x1e\xbe\x30\xef\xd4\x53\xe1\xe3\x9b\x4f\xbc\xbb\xee\x1d\xce\x5f\xbb\xda\x53\xfb\x5d\xb0\x87\x2f\xe0\xb2\xa7\x5e\x88\x75\xff\x67\x53\x91\xd9\xd4\x7e\xe7\xeb\xe1\x0b\x77\xd9\x53\x91\xcc\x6c\xfe\x67\x53\xe1\x6d\xea\x6c\x65\xe2\xf0\xc5\x9d\x84\x32\x8f\xed\x26\xb4\xcd\xa5\x65\x23\xf4\xaa\xd5\x38\x60\x8c\x97\x8f\x50\xf9\x1c\x36\xf6\x01\x11\xc6\xd9\x1e\xde\xc3\x17\xfc\x27\xf7\xdc\x0b\xae\xf7\x73\xf4\xdc\xfb\x4f\xb5\xcf\x77\x26\x1f\xbe\x30\xa1\x7b\x2e\xbc\xff\x3b\xed\xb9\x17\x5c\xf1\xe7\xf0\x96\x11\x1f\x4d\x7c\xbd\xe7\xbc\xf5\xce\xc3\x17\xf0\x93\x7b\x2e\x32\x6f\xf9\xb3\x7a\xee\xfd\xbd\xe5\xe9\xd2\xf0\xe1\x33\x77\xb2\x73\x51\x5d\xce\x94\xfd\xf9\x5d\xe1\xce\x6c\x76\xe4\xe2\x9e\x9c\xfc\xf2\xb4\xf7\xee\x36\xca\x17\xcf\x96\x7e\x46\x6a\xde\x12\xf6\xe1\x33\xf5\xbe\x52\x7b\x21\x01\xfc\xa9\xa4\xe6\x2e\xb5\x1f\x3e\xe3\xef\x2a\xb5\x17\x3c\xc0\xa7\x92\x9a\x57\x12\x70\xf8\xcc\xbc\xab\xd4\x5e\x18\xf1\x3e\x97\xd4\xdc\xd2\x85\xc3\x67\xf0\xbe\x16\x1a\x3e\xc2\x7b\x77\xa9\xdd\x29\x83\x08\x78\xfb\x73\xd8\x12\x08\xef\x0d\xd0\x81\xe5\x0f\xf8\xd5\x2d\xcd\xe4\x7e\x06\x4c\x90\x87\x0a\x6a\x77\x0f\xf4\x49\x49\xb5\x6d\x2e\x91\xbb\x01\x9d\x70\x77\x83\x52\x0c\x41\x30\x1c\x83\x53\x14\xc1\xb3\x04\x4f\xb3\x2c\x7b\x45\x43\x02\xa9\xf2\xd6\xc1\xaf\x53\x45\x1c\x88\x00\xc7\xba\x6e\x97\x58\x12\xec\x7f\x50\xa1\x6e\xed\xc8\x22\x5c\xd2\x7c\x34\xf1\xdc\xad\x12\xb0\x5b\x64\x11\x57\xc9\x3a\x24\x76\x08\xda\x5b\xf5\xde\x1f\x04\x70\x42\x96\x2b\x2c\xda\x09\xbf\x40\x20\x59\x0f\xa9\xc5\xfd\xf7\x18\xbf\xa0\x28\xc1\xaf\xa7\x0b\xac\x6f\x06\xd7\xeb\xfa\xee\x02\x02\x3e\x40\xd7\xea\xb3\xee\x02\x22\x7d\x45\x13\xa1\x01\x51\x3e\x40\xa1\x59\xf3\xaf\x90\x87\x06\xc4\xf8\x00\x85\x66\xed\x62\x95\x34\x2c\x20\xce\xbf\xa4\x17\x16\xd0\xc5\xfa\x53\x58\x40\xe7\x15\xcf\xf8\xf5\x5a\xca\xfb\x90\x2e\x16\x3f\x42\x43\x02\xbe\xe4\xfc\xb5\x8a\xca\xfb\x90\x48\x7f\x9a\x3f\x34\x24\xca\x97\x86\x0e\xad\x95\xe7\xb5\xcf\xe0\x15\x89\x33\xbe\x84\x6b\x78\x39\xb1\x3e\x48\xa1\x4d\xe5\xbc\x02\x9a\x7a\x45\xe2\xbc\x2f\xd5\x15\xde\x57\xe2\xbe\xd4\x4b\x68\xee\xce\xeb\xa0\x5f\x31\xe0\xb3\x4a\x68\xee\x7a\x45\xeb\x7d\x40\xe4\x39\xa0\xd0\xda\x74\x56\x0d\x4d\xbd\x42\x91\x6f\x02\x19\x5a\x2b\xcf\x2a\xa2\xf1\x57\x28\x62\x7d\x93\xb3\xd0\x80\xb8\xf3\xf9\x4a\x78\x8a\xf8\x73\x40\xe1\x87\x6f\xfc\x7c\x2e\x10\xda\x48\xce\x6a\xa3\x81\xcb\xda\x73\x6f\xf9\x7d\xcf\xea\xe8\x7b\x6f\xec\x7d\xa6\x3e\xfa\xf4\xad\x82\x51\x47\x7d\x47\x79\x7e\x65\x28\x04\x19\x45\xe6\x71\x1e\x97\x39\x85\x00\x00\x10\xac\x4c\x41\x19\x97\x49\xc8\x03\x96\x52\x19\x1a\xa7\x48\x99\x07\x10\x57\x24\x46\x41\x1c\x45\xb3\x00\x71\x0a\xc5\xcb\x0a\x4e\x03\xc6\x7d\x13\x17\xf1\x4a\x9a\xfa\x64\xdb\x32\xb5\xdf\xcd\x79\xfd\x30\x25\x9e\xe6\x6f\x1c\xb5\xe4\xde\x3d\x8b\x39\xdd\x6d\xa0\x05\x66\x8c\x34\x72\x3c\x35\x72\x5c\x33\xa3\xa7\xe2\x68\x28\x93\x6c\xb5\x6b\x67\x0b\x85\xb7\x4e\x9b\x5b\xb7\xb5\x7e\x02\x26\x97\x74\x91\x76\xce\x40\x72\x0f\x5d\x71\xb6\xed\x27\x7d\xbb\x14\x13\xc7\x8f\xce\x66\xe2\x44\xbb\x5d\xf6\xf6\xd7\x27\x89\x65\x42\xc9\x1a\xcd\xe5\xb0\xb4\xaa\xd9\x29\x36\x31\xca\x15\xc9\x32\xe2\x95\x76\x55\xcd\xe4\x62\x79\x8d\xce\xaf\x5a\x95\x58\x5f\xb0\x59\xe7\x58\x00\x21\xcd\x23\xef\xd1\x94\x3d\x5c\xad\x53\xcb\x4a\x47\xa8\xf1\x6c\x9d\xa8\x37\xed\x96\xb2\x2e\xa7\xb2\xf3\x54\x3c\xd9\x42\xf3\x37\xa5\x56\xed\xea\xc6\x4c\xd6\x8a\x6d\xa7\x7d\xab\xdd\x6e\x79\xbb\xa8\x8d\xea\xba\x17\x4f\x2b\x71\x39\xb7\x2d\xb7\x16\x71\xb4\xc8\x56\xde\xe6\x0b\xb6\xa7\x18\x6b\x59\x6d\xbc\x4d\xb2\x6a\x3f\xdd\xae\x27\x0b\x40\xf4\x76\x84\xe6\xb5\xce\xd0\xbf\xf7\x12\xb2\x93\xd5\x64\xed\xb0\xb7\x4d\x0e\xdf\x66\x28\xbe\x06\x85\xca\x62\x89\x38\x55\x46\x46\x7b\xcd\x75\x61\x7a\x2b\xb6\xb6\x02\x51\x93\x87\xd3\x62\xac\x21\xd9\xcd\x3a\xaf\x6d\x7b\xd2\x68\x28\x19\x90\x67\x53\x68\x9e\x4e\x71\x6f\xcd\xb6\x8c\x2f\x5a\x6b\xa8\x98\x15\x5d\xda\x70\xbc\xd2\x9c\x66\x73\x99\x62\x42\xf8\xfb\xef\xaf\xa7\x5b\x72\x33\x27\x5b\x59\x8f\x1f\xcb\xc7\x1f\x5d\xb9\x48\xd3\xe1\x94\x68\x03\x65\x48\xb7\x89\xe9\x82\x40\x7a\x49\xce\x10\xf6\x66\xdc\xe8\x15\xfa\xfc\x5a\x1c\x1a\x8d\x04\x44\x1d\xae\xa5\xa5\x8d\xe3\xa3\x8e\x6c\xd3\xe9\x76\xdb\x3d\x76\x41\x28\xa4\xb8\x4c\x75\xd3\x55\xc9\x64\x69\xdc\x2e\xac\xc8\xc5\xe8\xcd\x62\xe0\x12\x64\x61\x29\x9b\xc5\x2d\x3a\x41\x82\x7a\xbb\x55\xd3\xec\x91\x77\x10\x02\x8a\xcf\xdd\x47\x7f\xb9\xbe\x4d\xb0\xb1\x89\xf7\xe8\x51\xde\xb5\x83\x2e\x3b\x47\x07\x25\x4e\x3a\xdf\x5c\x94\x99\x22\xaa\xc0\xe1\x78\x53\x82\xad\x2a\xcf\x24\xde\x54\x8b\x47\xb8\x6c\x98\xe5\x7e\xf7\x2d\xd1\xc9\x4f\xd2\x46\x61\xaf\x1b\x82\x50\xa1\xcd\x9c\x7c\xb4\x8d\x84\xaf\xff\xce\xfa\x2e\xe0\x4a\x44\x8c\x3f\x19\x06\x7f\xd2\x3d\x27\xe3\xd8\xd0\x79\x3e\xb9\x34\x48\xc3\xa6\xe8\x45\xb2\x2a\x6e\xe6\xb5\x38\x69\x64\xcb\xb1\x37\x82\xad\x6f\x35\x8b\xd0\xd5\x52\xba\x37\xad\x75\x86\xe6\xb2\x11\x6b\xba\xdd\xdb\x6e\xe1\x1e\xe2\x62\x87\x4a\xe3\x68\x54\x61\x84\x2d\x9f\xc4\xab\x56\x46\x1c\xae\x64\x82\x25\x88\x16\xcf\xf5\xc6\xd4\xb4\x38\x99\xf2\x35\x96\x9e\x24\xc9\x95\xab\x0f\x4b\xb8\x1d\x26\xe2\x87\x6b\x1d\x44\xb3\xf3\x3d\xf3\x73\xe8\xeb\x4c\x98\xda\x3d\xfa\x1c\xf9\xa5\x9d\x8f\x8e\x3c\x13\x4b\x98\x94\xda\xdd\x3e\x48\xe9\xdd\x0e\x34\xdb\x4c\x6b\xb3\x96\x3a\x64\xa6\x9c\x1f\xce\x67\xa4\xd0\x48\x8e\x72\xe9\x39\x2d\x6d\x1a\xb9\x13\xe7\xe3\xe8\xe3\x0b\xfa\xfe\x8a\x7d\x56\x55\xdc\xb5\x19\x57\x1f\x02\x0f\x86\x38\xd1\x57\xd7\x21\xfc\x14\x7f\xd4\x6e\x37\xeb\x1e\x28\x5b\x1a\x76\xeb\x8c\xc8\x1a\xa9\x22\x5e\xac\xc5\xd6\xbd\x46\x92\x7f\xeb\xae\xba\xed\x26\xb9\xd1\xaa\x5a\x6f\xd9\x90\x88\xd4\x6a\x5a\x2b\x22\xf7\xe8\xb2\xa3\x3f\x70\xe8\x29\x07\x31\xe9\xd2\xd7\x3a\xf0\x2b\x64\x68\x23\x6f\xb7\x95\x59\xaf\xd2\x56\xfa\x0b\xbb\x3b\x6f\x66\x13\xb6\x24\xf7\xf0\x69\x72\xaa\xca\x89\x5c\x41\x1c\x76\x66\xfa\x2a\x9d\x1b\xc1\x57\xe9\xab\xd0\x66\x41\xc8\x1e\x55\xed\xa8\xef\x6e\xb7\x1e\x9d\x68\xe0\x75\xd2\x3f\xa1\xc6\x8b\x17\xf4\x27\x91\x98\x14\x2c\x41\x3d\x50\xce\x09\x3e\x7f\x58\xa7\x60\xe9\x06\xe9\x27\xf6\xe3\x1e\xd7\xf0\xa4\xfd\xbc\xa0\x4f\xd7\xfd\x4f\xc2\x4f\x65\x56\x26\xf4\x0b\xd2\xdd\xa3\x1b\xc3\xeb\xcb\x0b\xe3\x5b\x89\xb7\xf4\xe1\x0d\x7d\x39\xb9\x3a\x29\xd9\x1f\xba\x79\xe3\x9f\x70\x6c\x5f\x01\xc9\xb8\x50\xa1\xe8\x5e\x22\x45\xda\xd9\x76\xba\x42\xd4\x49\x01\x2f\xa1\x49\x95\xcb\xd7\x99\x59\x99\x10\x78\xd4\xd1\x94\x6d\xce\x76\xed\xa3\xde\x6e\x37\x3c\x7d\x19\xc6\x13\x63\xae\x4d\xf2\xeb\x71\x8e\x68\x98\x3c\x63\xc8\x6c\x65\x6a\xda\x23\x30\x4e\x6c\xf8\x62\xa5\xa6\xf0\x93\x76\x5b\xcc\x99\xbd\x86\xab\x0f\xec\xd4\x32\x82\xf5\xe5\x78\x5d\xe8\xf3\xc7\xd1\x97\x48\x75\xa6\xcc\x2d\xfa\x8e\xf1\xc4\x71\xfc\x4c\x1d\x6f\x3f\x3b\x3e\xed\xe4\x31\x95\x8f\xf0\x82\xf5\xef\x72\x6c\xdf\x5f\x27\xe3\x63\x68\xfc\x13\x2a\x1c\x7e\x37\x96\xfd\xf7\x7b\x05\xca\xce\x9a\xd3\xcc\x98\xa1\xc3\x19\x3b\xee\xdf\xfd\x2a\x0c\x7e\x7f\xf6\x7c\x32\xc3\xe3\x59\xc4\x90\x0c\x80\x1c\x21\xc9\x8c\x04\xa1\xc2\x40\x00\x54\x24\x21\x04\x01\x22\x19\xa4\x92\x80\xe4\x24\x99\x65\x39\x5a\x21\x81\xa2\x42\x9c\x94\x28\x46\x56\x38\x99\x43\x80\xa5\xa4\xaf\xfb\x85\x8c\x48\x66\x78\xf4\x9d\x19\x1e\x4b\x00\x9a\xb9\x7e\xd0\xd5\xee\xee\x71\x86\xe7\xe5\xf0\x5f\x9d\xe1\xa5\x7c\xdd\x1b\xe5\x0c\x2f\x9b\x5f\xbb\x4a\xf6\xa1\x33\xbc\xa6\x68\x9f\x58\xc9\xc9\x95\x39\xf0\x5f\xcb\x32\x0d\x76\x13\xaf\x15\x93\xf3\xa1\x1d\x07\xa3\x7e\xb9\x3f\xea\x8a\xf3\xf4\x1c\x6e\xe5\x16\xd3\x19\xa3\x06\xf9\x56\x2c\x11\x99\x31\x52\xcb\x19\x56\xb2\x53\x94\x54\x4c\x2e\x7b\xdb\x4e\x7e\xb3\x92\xa5\xb2\xca\x32\x5c\xbf\xfa\x96\xef\x56\x2b\x8a\xd8\x64\x7b\xc9\xf5\x88\x9e\x0b\xc3\xd6\x93\xb3\xbc\x17\xa2\xaa\x13\xd0\x09\x9e\x9a\xbb\x9f\x5e\x88\x7a\x05\x79\x96\xf2\xe4\x1d\x8a\x9e\x57\x47\x65\x41\x5f\xc7\xcf\xa6\xe5\x2a\xda\x1f\x3a\xfb\x81\xa3\x54\x5e\xae\x7a\xfa\x7a\x3a\x63\x7f\xbf\x19\x64\xa8\x19\x5c\x84\xf8\x53\x61\xf0\xa7\x8e\x23\x60\xfa\xe4\xd6\xb3\x33\x20\x76\x6a\x0d\xdd\x10\xd1\xf9\xde\xf2\xc1\xf3\xae\xda\x25\x7e\x41\x58\x99\x6b\x4f\x06\xa9\xfa\xdb\x2a\xf8\x99\xde\xf1\xfb\xb3\x11\xda\x2e\x42\x74\xa7\x05\x4e\xff\x24\x6a\x07\xfa\x02\x68\x39\x97\x59\x42\x00\xfb\x13\x8b\xd3\x55\xab\xe7\x7f\xe6\x44\x7f\x7e\xb5\x88\xdd\x3f\x23\x7f\x3a\x62\x0f\xef\x9b\x44\x8d\x5c\x06\xcf\xc8\xbd\x3e\x58\x30\xfa\xad\xb3\xe1\x8e\x33\x3c\xd7\xde\x9e\xd5\x87\x93\xfe\x75\xae\x17\x66\x7c\x47\x7d\x75\xfa\xb3\x18\x48\xef\x51\x7f\x7f\x3a\xbd\x89\x26\x9b\xb9\x4b\xef\x5a\x38\x9f\x11\x3d\x19\x8b\xbc\x42\x5f\x19\x36\xe7\xc1\x33\xe8\x40\x79\x7e\x38\x7d\xc5\x19\x29\xdd\xa5\x2f\x12\xfd\x74\x33\x92\x2f\x8c\x7d\xce\x95\x9a\x50\xee\xf0\xe0\xd2\x93\x09\xec\xef\x48\xf4\x33\x1a\x7a\x13\x65\x1c\xdd\xa5\xd7\xaf\x9f\xbf\xce\x8c\xfd\xe5\x0c\xcf\x0b\xf2\x5d\x40\x0d\xdd\x1a\x2f\x4e\xae\xad\xbc\x36\xfc\xbf\x95\x84\xf3\xf1\x42\x60\x7b\x45\x4e\x60\xc7\xfa\x50\xac\x22\x5c\x69\xb5\xd8\x76\x56\x4e\xd5\x36\x4c\x2d\xbe\xd6\xb3\x0b\x99\x6c\xa5\x08\x1a\xe6\xc9\x9c\x46\x38\xed\x5f\x88\x25\xc5\x32\x94\x8c\x67\x33\xcc\x1f\x49\xdf\x5b\x51\xca\xdd\xa2\xef\xef\xa0\x6c\xc3\x4f\x9a\xed\x0b\x11\x65\x1b\xc6\xad\x70\xf8\xbd\x6c\x83\x3a\x2f\xae\xb2\xbc\x60\x15\xa6\x49\x32\x0e\xd3\x13\x62\x9a\x96\x1b\x93\x8e\x6e\xe6\x37\xcd\x39\x2c\xd3\x45\xb5\x64\xbd\xb5\x60\x99\xe6\x70\xc9\x5e\xe2\xd5\x91\x65\x15\xe8\x71\xbe\x37\xcb\xf0\x1b\x8b\x88\xaf\xcc\xcd\x24\x5e\xd2\x65\x8e\xc6\xeb\x55\x7b\x58\x4c\x66\xa7\x93\x64\xa2\x16\x75\xb6\x01\x87\x84\x24\x51\xaa\xcc\x21\x92\x87\x32\xcf\xb3\x24\x2e\xcb\x24\x43\x02\x46\xc6\x01\xc7\x33\x80\xe0\x69\x06\x32\x2a\xaf\x00\xc4\x03\x84\x78\xc0\x2a\x2c\x03\x20\xc3\xe2\x1c\x85\xcb\xb2\x9b\x6d\x20\x23\xca\x36\x30\xf7\xb2\x0d\x80\x60\xc8\xeb\x67\x6e\xef\xef\x9e\xd5\xe7\xbd\x9a\x6d\xf0\x9b\x61\xa4\xd9\x86\x15\xe3\x39\xbb\x0f\xcc\x36\x38\x39\x7c\xff\x75\xb2\x9e\x2c\xe4\x62\x73\x46\x93\x2b\x45\xbd\xd1\xdf\xb6\x1a\xad\xbc\x10\xb3\xf0\xd4\xa8\x18\x2b\x35\x53\x05\x81\x44\x9d\x15\xa2\xf1\x4c\x35\xab\xae\x0d\x09\x22\x24\x33\xdd\xe4\x54\xc6\xd1\xa4\x61\xe3\xc4\x6c\xdd\xa0\xca\xc5\xa9\xba\x55\x9b\x99\xfe\x8c\x53\xea\xf5\x7e\x72\x58\x6b\x91\x42\xcd\xbf\x9e\xdc\x0c\x8a\x2e\xca\xbb\xdf\x78\x97\xaf\x8f\x98\xcd\x86\x9a\x4d\x46\x88\x5f\x7c\x12\xbf\x10\xbd\x97\x0d\xeb\xe5\x84\x88\xbc\xec\x68\x1d\x0e\xbf\xe7\x65\xdf\x4b\x59\xaf\x79\xd9\x7d\x0d\xfb\x93\x6e\x96\x23\x19\x85\x62\x14\x85\x84\x80\xa1\x68\x1a\x97\x81\xa4\x50\x38\xce\xca\x04\x8e\x43\x5c\xe6\x69\x89\x26\x65\xc4\x72\x0c\x83\xb3\x08\x52\x0c\x4f\xc8\x04\xc4\x39\x9a\x06\x2a\x87\x08\x08\xdd\x53\xe3\x89\x57\x76\xba\x3d\x93\xd4\x25\x39\x8e\xbb\xfe\xb6\x8f\xfd\xdd\xb3\xea\x65\xef\x45\x04\xcf\x05\xaa\x8f\x25\x75\x4f\x26\xf9\xef\x3d\x91\x3d\x04\xa2\x09\x61\xb4\xad\x31\x22\xbe\xe2\xc5\xaa\x50\x96\x87\xd5\x1e\xb4\x39\x3c\x5d\x99\xe9\x52\xbf\x91\x6c\x67\xa7\xcb\x45\xbd\x5e\x05\x68\x53\xd3\xe3\x8b\x5e\x43\x98\xa2\x61\x6c\xab\x53\x2a\xce\x8d\x93\xf9\x64\xa1\x47\xf7\xa9\x4a\xa2\xd8\x7e\x13\x09\x2b\x1f\xcb\xd2\x1d\xb2\x43\x76\xd6\xda\xa5\x1b\x0c\x4c\xb8\xfa\x65\x21\x84\x91\xad\x7b\x7d\x4c\x12\xe0\xaa\xab\x3e\x61\xef\xd9\x24\xed\xce\x55\xba\x82\x38\x49\x3c\x5e\xd4\x41\xdd\x71\xd5\xd1\xe1\x4f\x85\xc7\x1f\x75\xe2\xb1\x24\x04\x94\xb9\xdd\x73\xd3\x51\xe3\xbf\xd4\xd1\xc0\xc4\xe7\xf1\x0a\x4c\x7c\x3a\xd7\x2f\x94\xe8\x5a\x1f\x18\xfd\x44\xa5\x17\xfe\x3e\xf8\x9c\xa5\x21\xc9\xd8\xea\x52\x67\xdd\xeb\xce\x52\x75\x18\x7d\x3d\x9d\x3c\x06\x96\x85\xbe\xb3\xbd\x9c\x86\x55\xcf\xe0\xf7\xc2\x9a\xf7\x1a\x7c\xa2\x9d\x3c\x12\x2c\x64\x15\x8a\x91\x15\x92\x73\x0e\xa5\x93\x10\x52\xa1\x44\xc8\x80\xa0\x59\x40\x00\x59\xa2\x00\x8f\x23\x40\x31\x00\x92\x0c\xc5\xa9\x38\x4e\x49\x14\x2f\x93\x90\x25\x59\x06\x32\x5e\x54\x03\x22\x8a\x6a\xee\x4e\x1e\x49\x1e\xe7\xaf\xbf\xc6\x66\x7f\xf7\x6c\x2b\xd5\xab\x51\xcd\x8d\xc9\xa3\xa3\xe5\x1f\x93\xfe\x3c\x89\x6a\xb4\x6e\xf6\x2d\xc7\x98\x63\x12\xc4\xfb\xca\xb2\x92\xd7\x73\x23\x2e\xd6\xc9\x34\xca\x45\x6b\x3e\xcf\x13\xa0\x3a\x8e\xa3\x89\x3d\x03\x78\x3b\x91\x62\x27\xf8\xa6\x33\xe6\x41\x12\xbd\x29\x0d\x73\x28\xd0\x2c\xe8\xd6\xc8\x51\xab\xdb\xe9\xb5\x8c\x2a\x5b\xcd\xac\x26\xdb\x6e\xaa\xf7\x96\x5c\x7f\x74\x54\xf3\x31\xa9\xe3\x0f\x88\x6a\xdc\x8f\x6b\x3f\x66\x9f\xda\x5c\x78\x0a\x5c\x66\x83\x9f\x89\x70\x94\xaf\x09\x91\x8d\xf2\xc7\x51\x29\x6a\xf9\xb9\x82\xfa\xbc\xf2\xbb\x0c\x0f\xc3\x2c\x0f\x3b\xd7\x2f\xb4\xdc\xf2\x6a\x94\xf4\x6a\x72\xeb\xbd\xa3\xa4\x77\xa1\xef\x42\x55\x2a\xcd\xd1\x99\x92\x06\x45\x49\x3f\x29\x4a\x11\x22\xb2\x97\xd3\xe4\x4f\x88\x28\xe9\xbd\x06\xb3\x68\xa3\x24\x86\x61\x18\x9a\x81\x0c\x82\x0a\x02\x38\x07\x64\x9a\xe5\x70\x9a\x25\x00\xc3\x2a\x3c\xa2\x28\x9a\x44\x08\xd1\x2c\x47\xc8\x90\x87\x34\x07\x21\x49\xf0\x48\xc2\x55\xc4\x91\x14\x4d\xab\xca\xe1\x1c\x83\xf0\xe7\x5a\xb8\x67\x20\xdc\x0c\x8e\x58\x86\xe3\xae\xbe\x14\xff\x70\xf7\x74\x4f\xa8\x17\x1b\x15\xb9\x6c\x6d\x55\x9b\x48\x05\x90\x15\xc8\x4e\x7b\x5c\x37\x0b\xd3\x71\x17\xc7\xd5\x0c\x67\x15\x73\xec\x14\x17\xeb\xeb\x7c\x27\x2e\x74\x49\xe1\xfc\xed\xd8\x81\xc5\xb4\xa7\x57\xa8\x19\xc8\x09\xbc\xf6\x6a\x9d\xe6\x77\x1a\x26\x26\x94\x54\x17\x01\xb2\x45\x21\x3e\x09\x1a\x9b\x79\xa2\xd8\xaf\x6f\x08\x33\xff\xd6\x48\x17\xf3\xf8\x26\x95\xc2\x97\x85\xcc\x7c\xba\x90\x54\x3d\xd5\x8c\x75\xbb\xb9\x05\xd3\xd2\x52\x89\xb7\x69\x7a\x63\xc7\x32\x95\x58\x77\x91\x36\x6a\x55\xc5\xec\x36\xd9\x39\x61\x14\xfb\xb9\xec\xa2\x59\xaa\x3e\x10\xf3\x9c\x29\xed\x79\x3c\x71\xc2\xb3\x63\x05\xfe\x59\x7d\x42\x8b\x27\xf0\x22\x9e\xcf\x6c\xed\xd1\xba\x4c\xe8\x3d\x1c\x6e\xe7\x06\xc1\x97\xb3\x9b\x55\x31\xb9\xad\xd0\x76\x42\x94\x93\x2e\x8f\xe4\xd0\x36\x2b\xb3\x5e\x9c\x3a\x49\x95\x05\xbe\x74\xf9\x9e\x3d\xbf\x80\xbf\x6c\x6e\x9b\xb5\x17\xf0\x0b\x3e\xfc\x4f\x2f\xa6\x38\x05\xdb\xce\x75\x91\xa5\xb9\x87\x3f\x70\xf9\x32\x11\x5e\x16\x95\xd9\xc5\x5b\xe0\x9f\x92\xc5\xab\x7d\xb1\xd3\x85\x98\xec\x83\xf7\x94\x2c\xfe\xdd\xad\x11\xa4\x6d\x13\x95\xec\xaa\x66\x4f\x2c\x58\x6b\x80\x96\xac\xc0\xad\x8c\x8f\x1a\x5b\xa5\x54\x5b\xf3\x45\x6d\xb4\xe8\x2f\xa6\x24\x5d\xc3\xe3\x3a\xb1\x2d\x2c\xf5\xdc\x70\x2d\xd3\x23\x59\x52\x47\xe3\x95\xce\x8c\xa0\x98\x22\x21\x81\xc7\x18\x05\x26\x41\x23\xc1\x4c\xde\x52\x91\xfb\x56\x55\x42\x8c\xc2\xaa\x14\x2f\x03\x00\x69\x1c\x97\x54\x12\x01\x1c\x67\x09\x96\xe2\x65\x48\x00\x92\xc5\x09\x00\x15\x59\xa2\x29\x55\x91\x65\x9a\x42\x32\x54\x54\x16\x97\x55\xc8\x21\x8e\xf6\xde\xed\x4b\x46\x34\x03\x65\xef\xcf\x40\x01\x7b\x6b\x06\xea\xde\x3d\x3b\x83\xe3\xd5\x19\xa8\xbf\x40\x31\xc2\x19\xe8\x2b\xc5\xbb\x7c\xdc\x8b\x2a\x1d\x8f\x9d\x0a\xd4\xc4\xf4\x81\x9f\x9a\x60\x65\x14\xca\x90\xd9\x15\xd3\x5d\x97\x99\xa1\x2a\xab\xc5\x6e\x1c\xf4\x72\xeb\x71\x3d\x95\x46\x55\xa1\xf4\x56\x69\xd5\xe4\x58\x62\x9a\x6b\xa3\x76\x83\x25\xd6\x4b\x9a\xb3\x98\x62\x86\xd5\x7a\x2d\x35\x53\x13\x34\xe6\xad\x95\x63\x0c\x53\x9c\xca\x40\xc8\x8e\x85\x6d\xf2\x2d\x59\x7b\xa8\xf8\x39\xc2\x59\xeb\x67\x96\xf7\x8d\xe2\xe1\x88\x67\x6b\x97\xeb\x7b\x81\xb3\xb5\x22\xc3\x79\xc5\x2a\x1f\x32\x5b\x6b\x05\x10\xf2\x4a\x31\xaf\xfc\x1e\xf2\x4b\x7f\x72\xf9\x45\x53\x0c\xfd\xea\xf6\xc6\x9f\x33\x3b\x13\xce\xd7\x7c\x3e\xbc\xf8\xed\xfa\x76\x35\xbf\xad\x27\xc8\x72\x3f\x38\xf2\xf8\x6f\xdf\x1e\x9c\x7a\xb5\x7f\x5e\xa0\xef\x5e\xff\x9c\xd8\x6b\xd0\x75\x62\xaf\x1f\x5d\xcc\x7e\x6f\xfb\x69\x42\xed\x8e\xae\x50\x1d\x7d\xc6\x22\x6c\xc6\x40\x78\x07\x9f\x17\x22\x63\x91\x5c\xf7\x49\x6d\xf4\xb6\x8c\xcf\x55\x81\x5c\x24\xf8\x0d\x67\xab\xf1\xfe\x70\x9c\x2c\x8b\xa5\x36\xc5\x09\x6f\x25\xba\x9e\x78\xa3\x32\xbd\x51\x9b\x6e\x17\x57\xdd\x24\x3b\xdb\xbe\x19\x96\xb4\xcc\x8f\xea\x5c\x5f\x48\x16\xcd\x72\x6d\xbc\xd0\xac\x46\xff\xad\x27\xa0\x52\x2a\x57\x2c\xe5\xa3\x2f\x0a\xe4\x29\x95\xe5\x25\x16\xa8\x50\x51\x10\xdc\x45\xb7\x3c\xe0\x21\x2f\xe1\x04\x2b\x13\x32\x4d\x50\x2c\x4d\xa8\x2a\xc4\x21\xab\xa8\xbc\xaa\x48\x90\x95\x11\x47\xc8\x34\xae\xb2\x34\xe4\x00\xfe\xf5\x1b\x46\xed\x0f\x99\x09\xf9\xa6\x88\x93\xa8\x9a\xbc\x17\x55\xd3\x38\x00\xd7\x53\x17\xfb\xbb\x67\xa7\xc8\x7d\x0d\x63\x09\x27\x51\xf5\x8d\xdc\xc5\xcf\xf1\x2c\xc7\x2b\x7b\xa0\xb7\x56\x5a\x00\x71\x5e\xc0\x8b\xdd\x75\x5f\x6b\x98\xeb\xae\x35\x15\x92\x66\x62\x31\xec\xd6\xe3\xb1\x49\x35\x37\xcf\x10\xad\xd2\xb0\x5f\xa5\x62\xb0\x4d\xad\x9a\x4c\x45\x5c\xaf\x84\x61\x3d\x61\x14\x60\xbd\x3a\xce\x2b\x74\xa5\xcb\x0d\x2b\x89\x4a\x7e\x85\xd7\x0b\x55\x54\xab\x48\xfd\x29\x55\x5b\x3f\x12\x35\x07\x6f\x44\xf6\x47\x96\x27\x8d\x42\xe4\x7a\xf2\x95\x63\x7f\x5c\xb9\xee\x54\x67\x44\x87\xff\x32\x28\x7b\x00\xff\xc5\x6a\xf7\x47\x7b\x76\x97\x94\x47\xca\xce\xc5\x9f\x42\xdf\xdd\x83\x57\x02\xf3\x36\x3f\x29\x87\xe4\x93\x55\x68\xfc\xa7\x9b\xec\x9f\xc1\xbf\xdf\xe4\x6e\xf6\x1a\x13\xb3\x66\xab\x89\x69\xbe\xb0\x4a\xa0\x6d\x4f\x28\x58\x99\x45\x42\xc9\xc6\x99\x1a\xa7\x4d\xa4\x76\x6d\x9b\x98\xc4\xc7\xf4\xbc\xab\xf1\x55\x83\x6a\x26\xb9\x64\x42\xcc\x0c\xe7\x73\x31\x56\xd2\xc9\x09\xad\x6e\x05\x4a\xa4\xa6\xf1\xba\x68\xf0\xb4\x40\xdb\x53\x69\x94\x8a\x7c\x93\x3b\xa9\xe2\x9c\xa4\x42\x02\xc9\x92\xca\x93\x12\x81\x48\x9e\x86\x94\xc4\x13\x10\x70\x00\xd1\x14\x29\xab\x12\xa1\x28\xac\x4c\xa8\x14\x83\x58\x1e\xe0\xbb\x76\x80\xe4\x10\x07\x28\x5e\x92\xdd\x11\x06\xbc\xf2\x86\x9b\xe7\x46\x18\x92\xbd\x35\xc2\xb8\x77\xcf\xce\x04\xf5\xca\xce\x9f\xdb\x68\xf1\x9e\x23\xcc\xab\x73\x8b\x13\xfc\x07\x7a\x6b\xa5\x4e\x7c\xa1\xc5\x2a\x49\xb3\xc8\xcd\x67\xf2\xdb\xd2\xcc\x33\x89\xb1\xac\xd7\xa5\x6e\xb2\xb7\x16\xf0\x44\xbe\x0c\xd7\x05\xa9\x23\xbf\xa9\xc2\xba\xbe\x1c\x19\x2b\x00\xa6\x2d\x89\x50\x21\x48\x64\x8a\xba\x96\x55\xb9\xfa\x82\xa9\x6b\x85\x61\xbd\x9a\x28\xae\x88\xac\x59\xc8\xe6\xd6\xd6\xbb\x8c\x30\x21\xe6\x82\x91\x8e\x30\x2f\xe2\xff\x99\x23\xcc\x0b\x9b\xe4\x85\x8f\x18\x61\xde\xe3\x68\x1d\xef\xba\x3b\xc2\x84\xb7\xa5\x68\x46\x98\x10\xf8\x5f\x1c\x61\x36\x52\x6c\x51\xa4\xa8\x82\xb5\xda\x4e\x95\xb7\x0a\x63\xcd\x8c\x4c\x79\xdb\x4e\xdb\x72\x7e\x2c\xa4\x6a\xe2\x84\x30\x85\xb9\xdd\x7f\x2b\x73\xa9\x44\x86\xc9\x68\x71\x09\xf6\xeb\xab\x36\x6f\xf6\xc4\xde\xb2\x93\x53\xe2\x9b\x8c\x39\xcf\xe4\x16\x09\x91\x13\x97\xf1\x16\xb2\x0c\x79\x1c\xfd\xaa\x2b\xcb\xe3\x40\xc2\x29\x45\xc5\x55\x89\x24\x55\x08\x69\x5e\xe2\x48\x95\x27\x38\x49\x25\x20\xcb\x93\x90\x60\x80\xa4\x00\x45\x26\x15\x8a\x92\x78\x9e\xe4\x11\x4b\xb3\xb2\xca\xca\x12\xcb\xb0\x84\x3b\xc2\x90\x11\xcd\x61\xee\x1d\x94\xc9\xd2\x38\xc5\x5d\x5f\x19\xd8\xdf\x3d\x3b\xe1\xf9\xd5\x39\xcc\x8d\x83\x32\x5d\x05\x7b\x72\x73\xcb\xfb\xcc\x61\x92\xc9\xcd\x08\x25\xa8\x64\xdf\xec\x69\x69\xb5\x24\x74\x18\x79\x32\x8e\x8f\x9b\xf9\xb7\xac\x36\x62\x93\x76\x9d\x6b\xa6\xf0\x8c\xbc\x6a\x4b\x4c\x9c\x49\x74\x34\xbe\x0d\x66\x89\xda\x2a\x65\xc7\xb7\x64\x79\x96\xb0\xb7\x96\x94\x16\x2b\x25\x22\xd3\x66\x98\x4d\xda\x5e\x72\xed\x74\x46\xa8\x7d\xc6\x39\x4c\x28\x0f\x1f\x21\xfe\x2b\xd5\xb9\x61\x46\x98\x0f\x3c\xfc\xd0\x25\xe5\xc9\x11\xe6\x33\x1d\x1e\x19\x38\xc2\xfc\xa4\x39\x84\x10\xd1\x1c\xe6\xb4\xfa\xfa\x19\xfc\xde\x08\x93\x2b\x66\xd2\x54\x76\x98\x9f\xda\x5a\xae\xcd\xad\x13\xd2\x7c\xdb\xa8\xc6\xca\xa5\x59\x09\x15\xb2\x56\x81\xc8\x6e\x4a\xd5\x5a\x7f\xcb\xb7\x57\x66\xdc\x48\xc3\x22\xd1\x85\x72\x3a\xc9\x55\xc8\x78\x51\x06\x72\x86\x2c\x6c\xac\x56\x8d\x7a\x6b\xf5\xbb\xa6\x29\x76\x00\xbb\x69\xb5\x7a\xd1\x1f\xd4\x25\x11\x2a\x07\x38\x92\xa3\x64\x9a\x41\x94\x84\x03\x4a\xa5\x00\x4b\xab\x80\x62\x68\x0e\x87\x12\x94\x54\x95\x80\x88\x94\x78\x09\x32\x84\x84\x93\x1c\xcf\x92\x34\x8b\x68\x16\x21\x49\x76\xb2\x64\x60\x5f\xfd\x1c\xba\xae\x07\xdc\xad\xeb\x61\x71\xea\x46\x5d\x8f\x77\xf7\xf4\x64\xf5\x57\xeb\x7a\x6e\x8c\x2b\xee\xf5\xe2\x86\xd5\xb3\xba\x1e\x75\x96\x6e\xbc\xf5\xd1\x88\x60\xdf\x6c\x0e\x18\x25\x65\x81\xa8\x58\x7c\x33\xb3\xe2\x93\x6c\x42\xc9\x74\x55\x3e\x91\x4b\xd4\x7b\x6a\xbb\x4f\xa6\x6a\x4d\x12\xae\xd7\xfd\x19\x5d\x5c\x0c\x73\x19\x3e\xbf\xd0\x57\xa5\x69\x9d\x68\x16\xe0\x46\x36\xf2\xb5\xd4\x72\x91\x91\x93\x0d\xb9\xf4\xb9\xea\x7a\x5e\xad\xab\x79\xb5\x96\xa4\xb4\x2e\x4e\x8d\x28\xeb\x7a\x3e\x30\x62\xbe\x17\xbd\x7f\x64\x5d\x8d\x10\x51\x5d\x0f\x47\x1d\x9f\xbf\x32\x33\xbd\x59\xd7\xd3\xa5\x37\x2d\x0b\x74\x0d\x05\x71\xac\x5a\x5e\xa4\xb2\x70\xb6\xac\xae\xb8\x3e\x5b\xa5\x13\xeb\x6e\x5d\x27\xe3\xb5\x86\xd0\xea\x64\x89\x8e\xb2\xc6\x45\x1e\x58\xa5\x4c\x3f\xd6\x60\x8c\x64\x62\xd5\x80\x73\xe9\x2d\x3f\x51\x5a\xdb\xa9\xd5\x2d\x24\x5b\x02\xbb\x18\xcd\x84\xc9\x2c\xfa\xfc\x90\xcc\x93\x2a\x87\x33\x0c\xab\x92\xac\xa2\xb2\x38\x04\x3c\x92\x71\x05\xf1\x8c\xaa\x92\x24\x47\x30\x14\x05\x65\x0e\x70\x90\x92\x11\x24\x64\x89\x91\x91\x44\x48\x32\x92\x19\x55\x55\x71\x9a\x73\xa3\x77\x2a\xa2\xfc\xd0\x03\xd1\x3b\xcd\x13\x37\xa2\x77\xf7\xee\xd9\xbb\x50\x5e\xcd\x0f\xdd\x8d\xde\x3f\xfa\xa8\xd4\x13\xfc\xc7\xfc\x50\x86\xd2\xd9\x49\x52\x58\xd0\x70\xb1\x6a\x00\x25\x9e\x6d\xda\x3d\x99\x2d\x0a\x90\x9d\x37\x5a\x9a\x56\xa1\x0a\xdb\x42\x5e\x5a\x4c\xad\xd4\x70\x25\x4f\x32\x49\xa0\x48\x23\xd9\x34\x78\x5b\x5e\x25\xfb\x59\x75\xbd\x68\xb6\x63\xda\x64\xc5\x65\xa7\x5c\x5f\x85\x0c\x39\xe9\x55\x27\xb5\xde\x67\xcc\x0f\xbd\x1c\xbd\xbf\x88\x3f\xc2\xe8\xfd\x03\x0f\x96\x71\x49\x79\x32\x7a\xff\x40\xfa\x5e\x8f\xde\x3f\x30\x3f\x23\x44\x94\x1f\x7a\x31\x7a\x97\xb4\xee\xb2\x96\x4b\x9a\xfa\x62\xc1\x17\xfb\x24\xa7\x54\x88\xd1\x9b\x65\x25\xcc\xa5\x9e\x6f\x14\x72\xec\xd0\xcc\x19\xfa\x72\x01\xd7\x95\x24\xbf\xad\xf5\x8a\x7d\x62\x99\xde\x2e\xc7\x80\xd8\x72\xf9\x89\x12\x4f\xce\xcb\x5d\xa6\xd0\x88\xaf\x91\xb4\xd1\x79\xd3\x44\xf5\x61\xac\x9e\x18\x46\x3d\xc2\x70\x04\x41\xf0\x40\x26\x39\x86\x22\x15\x95\x25\x65\x9c\xa0\x21\x0d\x09\x85\x65\x25\x0e\x07\xca\x6e\x18\x51\x28\x95\xc6\x55\x99\x51\x08\x9c\x23\x18\x08\x59\x5a\xc6\x21\x43\xe0\xbc\xca\xc3\xc3\xab\x18\x23\xa9\x1c\xbd\xbb\x02\xc1\xd0\x38\x71\x7d\x84\xd9\xdf\x3d\x7b\x47\xd6\xab\x95\xa3\x37\x56\x20\xdc\xa3\xc9\x42\xe5\x7b\x48\x5f\x75\x95\x73\x9d\x54\x7a\x56\xf5\x21\x9b\x29\x8e\xf2\x43\x7c\xc3\x8e\xe7\xc2\x9a\x10\xd7\x4c\x16\x74\xd3\xcc\xb6\x9e\x9b\xaa\xf9\xdc\x3a\xad\x6e\x70\xbe\xbc\xd4\x68\xc9\xae\xe4\x85\x34\x5a\xa7\x85\xb2\x5a\x81\x42\x82\x4b\xd7\xfa\x3a\x3d\x27\x05\x7a\x48\x4e\x98\x54\x36\xa5\x0d\xd5\x56\xb9\x95\x22\x98\xa1\xfc\xc8\x88\x71\xba\x97\xe9\x91\x98\x3e\xea\x1d\xca\x0f\x5a\x99\xb0\x37\xf0\xa8\xf1\x3f\x71\xf0\x8b\x20\x7c\xde\x35\xeb\xbb\x31\x7f\x08\x59\xbd\x9c\xb1\x7f\xb1\xaf\x2e\x0e\x5e\x7f\x10\xbf\xe7\x91\x63\x9d\x94\xd5\x5b\x8a\xd3\x54\x33\xbb\xac\x4c\x52\xa9\x56\x33\x65\xa8\x7d\xb9\x6b\xe6\x45\xad\xcf\x4d\xc6\x42\x3b\x9e\x6d\xe2\x80\x29\xea\x4b\x9c\x9a\x08\x6d\x56\x68\x09\x04\x47\x1b\x42\x76\xdd\x4e\x4c\xbb\xd3\x99\x9c\x9a\xa6\x50\xd3\x28\xc9\x95\x42\x82\xaf\x11\xb5\x6a\x77\x91\x88\x3c\x63\x2f\x29\x14\xc7\x28\x92\xa2\xe0\x40\xa1\x18\x9c\x23\x58\x86\x25\x64\x0a\xd2\x90\x45\xbc\xc2\x20\x8e\xa1\x65\x08\x78\x59\xa2\x08\xc4\x00\x85\x85\xd0\x99\x18\xa8\x08\xd1\x12\xc9\x28\xc8\xf5\xc8\x51\x1d\x7c\xfe\x80\x47\x26\x18\xf2\x86\x47\x76\xef\x9e\xbd\x6b\xf0\xd5\xa3\xc8\x3e\xd0\x23\x9f\x1c\x3c\x9e\xe0\x27\xd3\x42\x07\x2c\xc8\x15\x5b\x53\xb7\x5c\xb5\x84\x26\xa2\x44\x34\x9b\x39\x5a\xdb\x2c\x26\x39\x3c\x61\x0c\xbb\x66\xc5\x66\x87\x15\x82\x01\x35\x69\x32\x02\x4a\xa3\xd9\x52\x51\xca\x58\xc9\x78\x55\x80\xea\x28\xd5\xdd\xd8\xa3\xb6\xa0\x5b\xc5\xe5\x58\x4f\x4c\xb7\xe3\x84\xf0\x50\x0c\xff\x82\x47\x8e\xe4\xf5\x06\x0f\x5a\x99\x10\x60\xe5\x1f\xfd\x7a\x05\x41\xf8\xbc\x19\xf8\xbb\x6b\xa8\x21\x64\x15\xa5\x47\xfe\x48\x5d\xf1\x3c\x72\x16\x34\x7a\x73\x09\x9a\x28\x6e\x27\xe2\xc5\x35\xb7\x61\x6a\xf5\x55\xbb\x5c\x1a\x4f\x8b\x99\x45\x6d\x5c\xcb\x68\x09\x64\x31\xe4\x52\x60\xbb\x66\x3f\xb1\x6c\x64\xfb\x44\xbe\x5c\xe7\xa9\x8a\xc6\xbf\xd5\xb8\xc4\x3c\x26\x96\xd5\x0c\x48\xb7\x92\x9d\xf5\x92\xa9\xb4\x32\x52\xa1\x24\x46\x1f\x23\x4b\xb4\x0c\x15\x19\xe1\xb4\x2a\xe3\x50\xa1\x15\x46\x45\x38\xce\x4b\x9c\x84\x2b\x48\x92\x71\x85\x54\x54\x85\x04\x08\x52\x40\xe2\x90\x04\x49\xc4\x23\xc8\x70\x32\x60\x29\x06\x51\x04\xae\xba\x1e\xd9\x59\x43\x0d\xf9\xa2\xfc\x27\x3d\x32\xe0\xae\xbf\x8a\x62\x7f\xf7\xec\x9d\xad\xae\x56\x3e\x79\xf8\xe2\x33\x1e\x39\x54\x56\xa5\x1b\xe4\x91\xc5\x03\xfe\x9a\x50\xae\x35\xde\x56\x73\x31\x91\x14\xba\x2b\x8b\xa8\x0e\xa7\xd9\x78\x2b\x2d\xa9\x42\xcf\x26\x2b\xc2\x70\xd8\xab\xb6\x9b\x0a\x3e\x1f\xb7\xe5\x3c\x6c\x93\x7a\x4a\x8c\x8f\x2b\xfd\xd2\xac\x98\xee\x97\x26\x69\x71\x34\xa4\x14\x7d\xd9\xae\x6d\x50\xaa\x2f\xac\x9b\x85\x56\x15\xce\x14\x6b\x3d\x7c\x67\x8f\xfc\xec\xac\x3d\x6a\x8f\x1c\x09\xfe\x17\x3c\xf2\x67\xca\xaa\xdc\xf3\xc8\x61\x64\x15\xa5\x47\xfe\x48\x5d\xd9\x1f\x24\x49\x24\x8a\x95\xd8\xa4\x26\xe6\x12\x28\xf6\xd6\x8a\x25\x7b\x2a\x5f\x6b\xdb\x5c\x42\x23\x65\x2a\x99\x4c\x0c\xf9\x76\x99\x6c\x4c\xcb\xed\xb5\x3e\xef\xa2\x56\xa9\x19\x2b\xd1\x93\xad\x6c\xb5\x27\xdb\x5a\xab\x91\x49\x8d\x40\x87\x6e\xa7\xd2\x54\x79\x92\x4a\x94\xe6\x35\x7e\xa1\x80\xb7\x64\xf4\x75\x93\x00\x51\x12\x24\x54\x40\x70\x12\x03\x21\xa0\x00\x2e\x51\x3c\x4b\xd1\x0c\x24\x24\x9c\xc7\x79\x1c\x91\x1c\xc9\x22\x86\x91\x48\x8a\xa7\x71\x12\x57\x28\xa4\x28\x0c\xae\xe0\x2a\x4e\xb3\xb8\xeb\x91\xa9\x88\xb2\x16\x77\xf3\xe2\x0c\x4d\xf2\xd7\xcf\x91\xdc\xdf\x3d\x7b\xf7\xf5\xab\x59\x8b\x1b\x79\xf1\xa8\x3d\xf2\x49\xd6\xa2\x94\x9f\xae\x62\xfa\x28\x4d\xd7\xfa\xfa\x50\xc9\x2d\x12\xdd\x54\x43\x19\x89\xf6\xd0\x84\x4d\xb3\xde\x58\xb7\x4d\x5a\x89\x27\xcc\x72\x12\x70\x48\xcd\x96\x8c\x4d\xaf\x0c\x63\x60\xc9\xdb\x0d\x51\xd9\xb4\x62\xa3\x4c\x97\xc9\xd7\x3b\xec\x5a\x48\x93\x52\x65\x2e\x70\xe6\x66\xb3\x11\xc4\x5f\x21\x6b\xf1\xec\x71\xb1\x3f\xf1\x5c\x37\x41\xf8\xbc\x75\x90\x81\x1e\xf9\x27\x65\x0d\x84\xf7\xea\xab\x07\xf1\x7b\x1e\x79\x3d\x85\x71\xa6\x23\x76\xf5\xc4\xb4\x93\xc0\x35\x23\x2d\x97\xf3\x40\x6c\x80\xa4\x3d\xaf\xd8\xe9\x62\xa2\xb3\xd2\x49\x2e\x63\xe1\x45\x69\x43\x73\xf2\x76\x9c\x1e\x12\x26\x0b\x59\x40\xe4\xea\x64\xba\xc9\x88\x7d\xd5\xd0\xd3\xd2\x4a\x10\xba\x8a\xc5\x4c\x52\xdb\x55\x36\x2b\x46\x7f\x06\x1e\x90\x00\xe2\x80\x22\x41\x49\xc2\x01\x25\x01\x16\xe2\x32\x49\x50\xb8\x0c\x59\x42\xe1\xa0\xcc\x4b\x32\x4b\x70\x24\xa1\xf2\x2a\x0d\x49\x49\x61\x78\x24\x43\x52\xe1\x38\x55\xc2\x91\x4c\xcb\x6e\x0d\x07\xf9\x5a\x15\xc8\xdd\xd0\x98\x65\x09\xe6\x7a\x79\xe1\xfe\xee\xe9\xdb\xec\x5f\xad\x02\xb9\x71\x9e\xaf\x7b\x85\xd8\x0b\x7d\xa5\x0a\x24\x95\x5f\xea\x84\x5d\xcc\x14\xd3\x54\x7b\xb3\xb6\x71\x25\x95\x6c\x8b\x2a\x63\x4b\xb4\x4e\x49\xdb\x92\x99\x19\x26\xe7\x31\xbd\xdd\x2f\x4d\x37\xb2\x4d\x53\x5a\x59\x05\xd3\x8d\x3d\xde\x30\x25\x85\xee\xe7\x29\x91\x4a\xe9\xb2\xa5\x52\x8c\x28\x8c\x12\x99\x46\xab\x6a\xcd\x38\xb5\x97\xfa\x5c\x55\x20\xaf\x56\x61\xbc\x5a\x79\x50\xc4\x27\x8c\x10\x61\x15\xc8\x47\x66\x61\xdf\xa3\x0a\x24\x6c\x15\x86\x10\x51\x15\x08\x7b\xd2\x01\x57\x5e\x82\x75\x73\x97\x90\x34\x57\xa4\xc6\x46\xdb\xa0\xb4\x2c\x17\x95\x6c\x6d\xad\xd7\xb3\x31\xb3\x13\xeb\xa3\x0c\x37\x2e\x6c\x0c\x61\xa1\xce\xdb\x9d\x66\xde\xea\x16\x11\xca\x8d\xbb\xfc\xdc\x92\x7a\x1c\x1a\x67\x51\xa7\x81\x12\x15\x81\xee\x16\xb3\xb1\xca\x48\xc8\xd5\xea\x13\x3d\xc5\xe6\xe3\x59\x20\x44\x9e\x11\x46\x04\x2b\x41\x44\xd3\x40\x81\x38\x81\xd3\x50\x21\x81\x8a\x4b\x3c\x84\x8a\xaa\xe0\x2a\x03\x48\xa4\x92\x2c\x92\x28\x8e\x91\x08\x5c\xc2\x29\x4a\x26\x78\x40\x72\x24\x83\x23\x8a\xa6\x15\xd6\xf5\xad\xd4\x6b\xbe\xf5\x6e\x90\xcb\xb2\x80\xbd\xfe\x4e\x8a\xfd\x5d\xc7\xb7\xd2\x38\x7f\x72\x56\x7a\x68\xdf\x7a\xe3\x54\x51\xf7\x7a\xb2\xf6\xe3\x96\x6f\xed\xf5\xd4\x6d\xc5\x9c\x56\x47\xea\x44\x63\x74\xb3\x1a\x33\x92\xea\x72\x96\x9f\xd6\x97\x60\xaa\x6e\x74\x0a\x37\xe8\x45\xa7\xce\x6e\x89\xde\xb4\xca\xcd\x8d\x4c\x8c\xe9\x2e\x86\x14\x31\x2e\x24\x3b\xe5\x75\xdb\xa8\xb2\x04\x9b\x6c\x8b\x55\xc4\xe2\x39\xdc\x46\x9d\x55\x13\x8d\x27\xf9\xcf\xe5\x5b\x5f\xf5\x6d\xaf\xda\x73\x81\x8a\x95\x7b\x11\xfa\xd6\x8f\x9c\xbd\xbf\x87\x6f\x0d\xeb\xdb\x84\x88\x7c\x2b\xbd\xbe\x8b\xe8\x96\x6f\x05\x99\x2c\x37\x5e\xd0\x63\xaa\x4b\xe7\x96\x73\xf8\x16\x5f\x08\x33\x76\xbe\xed\x4f\x24\x7b\x3e\xe3\xfa\xa8\x5c\xa8\x40\x7d\x82\x38\xbb\x93\x1f\xc7\x0b\x30\xb1\x5a\xea\x8c\x51\x29\xf7\xb6\x43\x7d\x2c\xa7\x61\x2a\xc6\xa3\xb5\x5e\x4f\x91\x4b\x3e\x59\x2e\x76\x75\x13\x27\x0d\x3a\x19\x79\xdc\x2a\xab\x0a\xc7\x11\x0c\x52\x68\x8e\x95\x69\xa4\x70\x9c\x82\x20\x8e\x24\x1c\xe7\x08\x4e\x86\x2a\xc9\xc9\x38\x4b\xe3\x88\x65\x29\x1c\xe1\xb4\x82\x48\x19\xb0\x04\xcb\x20\x1e\x22\xc4\x21\xe4\xfa\x56\xfa\x35\xdf\x7a\xf7\x45\x14\xce\x66\xca\x1b\xbe\xd5\xbd\xeb\xfa\x56\x1a\x3f\xc9\x1f\x84\xf6\xad\x37\xce\xcb\x72\xaf\x10\xaf\x7c\xb9\xe6\x5b\xcb\xd3\xda\x48\xa9\xa1\x6d\x49\xee\xa4\x3b\x55\x4e\x69\xd7\x27\x29\x3b\xdd\xa0\xec\x6c\x2e\xb9\x2d\x28\xb0\x3a\xa9\x33\xb1\x78\x91\x8d\xd9\xa5\xb7\x42\xc7\x68\x8d\xa5\x94\xd0\xb5\xe4\x7a\x2f\x17\x1b\x33\x69\x25\xde\x4e\xb7\x60\xea\x4d\xe9\x59\x9d\xa4\x60\x65\x49\xbc\xb3\x1c\xe7\x8a\x9f\xcb\xb7\xbe\xea\xdb\x5e\xb5\xe7\x3c\xdf\x1d\xae\xa3\xac\x5e\xfe\xc0\xb5\xaa\xf7\xf0\xad\x61\x7d\x9b\x10\x91\x6f\x0d\x7b\x42\xa5\xe7\x5b\xdf\xfa\x93\x5c\xb7\x95\xb5\xc6\xd9\xf4\xa8\x3d\x8e\x67\xdb\xad\xbe\xc0\xd6\x5b\xcb\x62\x7d\x2b\x58\xda\xac\x33\xa6\x45\xb4\x5a\x6d\x63\x71\xb3\x59\xda\xea\x8b\x74\x0e\xac\xd7\x69\x36\x2b\x76\x92\x55\x23\x36\xea\xaa\x44\xbd\x9d\x19\x72\x64\xa7\x98\x1e\x0e\x8b\x09\x9e\x4f\x9b\xc6\xf6\xd1\xbd\x87\xbf\xfd\xf6\xfd\xfb\x6f\xdf\xbf\x63\x29\x68\x43\x4c\x35\x4c\xac\x0c\xa7\xe8\x07\x36\x41\xdb\xc1\x0a\xea\x4b\x34\xd8\xb9\x5b\xf4\x17\xd6\xdc\xce\xd1\x0f\xac\x29\x24\x8a\x22\x96\x12\x9a\xc2\x5f\x58\x43\x1e\xa1\x29\xfc\x81\xcd\x97\x92\xae\xc9\x7f\x61\x95\xf5\x0c\x99\x3f\xb0\x1d\xb4\xdf\xce\x5c\xb6\x0f\xd6\x49\x24\xbc\x99\x0f\xb4\xd9\x10\x59\xf6\x40\x87\xbb\x3f\x48\x19\x22\x73\x47\x34\xfe\xf5\x3a\x69\x86\xaa\x22\xd3\x7a\x9a\xa2\x3d\x34\x17\x08\x94\x65\x63\x39\xb3\xad\x81\xa5\x0d\x67\xc8\xb4\x2e\x7e\x18\xcc\x27\x68\xbb\x47\x92\xac\x94\x1b\xcd\xba\x90\x2b\x37\xef\x20\x11\x8a\x4d\xb1\xee\xd1\x54\x29\x17\x7b\x17\x60\x7f\xc3\x30\x0c\x13\x52\xa9\x13\x90\xc1\xa8\xb1\x6a\x3d\x57\x12\xea\x3d\xac\x20\xf6\xb0\xdf\xdd\x3b\xdf\xf6\x4d\x4f\x84\xe3\xb1\x63\x59\xc8\x1e\x58\x36\xb4\xad\xd3\xcf\x51\x31\x71\x84\x18\x48\xbf\x0f\xe1\x39\xe9\x9a\x72\x41\xed\xd0\x30\xe7\x83\xa9\x36\x34\xa1\x3b\x7c\xfb\xbe\x47\x44\xb5\x0f\x6a\x10\xe5\x41\x88\xef\x52\xbf\x8f\x40\x1c\xb6\x2d\xdf\x57\xf7\x3f\x03\xd9\x50\x90\xf7\xd1\xde\xce\xf7\x1f\x35\xcb\x5a\x22\x73\x10\x09\x77\xe7\x68\x83\x98\x0b\x45\x18\xd6\x2a\xe7\x6a\x2d\x11\xfb\xfd\xd8\xfc\x1b\x76\x6c\xbf\xff\xec\x3e\xf0\xa4\x68\xa2\xe9\xd6\xa7\x19\x7f\xaa\x53\x8d\x39\x72\x95\x61\x30\x87\xa6\xad\xc9\xda\x1c\xce\x4e\x38\x09\xbe\x1d\x31\x67\xc1\x48\x6e\x71\x7a\x83\xac\x87\x39\x3f\x09\xa8\x83\x79\xbf\xd6\x20\x62\xee\xaf\xa1\xb9\xc5\xff\x4d\xd2\xee\x4a\xc0\x3f\x3e\xf9\xbe\x47\xc4\x9f\x0f\x6a\x10\x3b\x41\x88\xcf\xa9\x9f\xa0\xed\x05\xf9\xee\x78\xe8\xfd\x27\x22\x62\x5d\x60\x41\x34\x9e\xa0\x39\x27\xcd\xb9\x11\x20\x5d\xd7\x61\x48\x5b\xc7\x97\xec\x29\xcb\x95\x53\x62\xf7\x0e\x51\xc9\xba\x28\x34\x45\xb7\xe9\x39\x14\xac\x52\xf6\xbb\x9a\x56\x23\x57\xce\x60\x92\x6d\x22\x74\xea\xbb\xae\x53\xe3\x7a\xb0\xd7\xe9\x71\xe1\x3c\x46\xd1\x15\xaf\x29\x6d\x07\xde\xb8\x1e\x9a\x9c\x23\x88\x53\x4a\xce\xe6\xc8\xe7\xf4\xb8\x8d\x0f\x01\xc5\xc0\x42\x8b\x25\x9a\xc9\x97\x02\x93\xb6\x83\x11\xb4\x46\xaf\x50\xb6\x7b\xfe\x31\xb2\x4e\xed\x78\xf7\x54\x10\x35\x6e\x90\xf8\x0a\x3d\x2e\x84\xc7\x28\x72\xdb\x1e\xc4\xf3\x0d\x83\xf3\xb9\xae\xc9\xae\xb3\x35\x4c\xe5\xca\x20\x38\x40\x3b\xdd\x70\xee\x87\xa0\xd4\x1b\x83\x5d\x82\x7d\xe0\x4e\xc9\x46\xaa\x8a\x64\xbf\xaa\x5d\x8e\x09\x9a\xf2\x0d\xfb\xe2\x3c\xfc\xe5\x1a\xb1\x9a\x12\x11\x99\x9a\xf2\x30\x81\x7b\xd5\xdb\x91\x17\x82\x68\x63\x3e\x98\x47\x45\xb7\x07\xeb\x94\xf4\x2b\x81\x40\x28\x4e\x82\x19\xb0\x37\xd1\x31\xe0\xc1\xba\xa2\xd3\x21\x59\x38\x85\x10\xc4\x84\x31\xdf\x69\xe5\xc8\x08\xc5\x83\x47\xfc\x11\x46\x58\xe1\xdf\x16\xb4\xe5\x59\xbb\xe3\xaa\x5f\x97\xf5\x39\xb8\x53\x92\xdd\xdf\x7d\x34\x06\x53\x74\x2a\xd7\xa8\xc8\xba\x80\xf9\x98\x7b\x0b\x22\xd0\x76\xbb\xc4\x7e\xa5\x5b\x8f\x30\xc2\xab\xe4\x3d\xf5\xb3\x4d\x65\x87\x44\x82\x16\x7a\x79\xfc\x0c\x02\xe6\xa3\x5c\x41\x3e\x3a\x4f\xdb\xde\x25\xd0\x89\x8e\xa2\x21\xcf\x01\xf5\x10\x71\x4e\xcb\x5b\xa4\x39\xb4\x23\x33\x32\xf1\xf9\xe0\xdd\x23\xd2\xd7\xfc\x11\x4a\xa3\x91\xe3\x19\xb4\x47\xa9\xbc\x2b\xcd\x68\x68\x7b\x88\xa6\xdb\xb4\xec\x29\xd6\x0d\x63\xb2\x9c\xbf\x46\xd1\x39\xac\x87\x7b\xd4\x8d\x77\xaf\xd0\x37\x87\x9a\x39\xb0\xb5\x29\x8a\x84\x42\x3f\xb4\xc7\xec\xd6\x23\xf0\x1b\xe6\x27\xf9\x1b\xe6\xb9\x78\x59\x37\x2c\xa4\x0c\xe0\x65\xb6\xcd\x45\x1b\x81\xdf\xf6\xe0\xdc\xa3\xf8\xc9\xe8\x68\x07\x35\x32\xe9\x3e\x21\xd8\xbb\x72\xd3\x66\x0a\xda\x0c\x7c\x21\x87\x35\x30\x66\x03\xa8\x28\x26\xb2\xac\x57\x05\x7a\x17\xc1\xd9\x3c\xcd\xbb\xed\x9b\x19\xb9\x0d\x9f\xa0\xfd\x75\x3d\xb8\x05\xfb\x3e\xc5\x01\x56\x76\x0e\xd0\x8b\xc2\x77\xf0\xec\xed\x3c\xfc\x1c\xfc\x26\xd4\xbb\x61\xff\xae\xd1\x1d\x42\xbd\x18\x6a\x07\xf2\xa0\x44\x11\x51\x1b\x04\xfa\x6e\xf8\xf6\xa8\x26\x9f\x00\x8f\x5a\x19\xce\x40\x87\x89\x37\xaf\x83\x9b\xce\x0d\x73\xe7\xf8\x56\xc8\xb4\x34\x63\x16\xbd\xa0\xfd\x18\xee\x93\xef\x7b\xe0\x71\x66\x3c\xd7\x13\x32\x53\xf1\x98\xfc\x4f\x70\xdc\xe5\xe4\xa4\xed\xe3\x4c\xcc\x4d\xb4\xd2\x8c\xa5\xf5\x21\xdc\x04\x21\xbb\xcb\x56\xd0\x43\x8f\xf3\xb7\x4f\xa2\xbc\x1b\x4f\x7b\x04\x77\xf9\xb8\x9a\xed\x3a\x07\x7d\x18\x6f\xdf\xc5\xb4\xfd\xd0\x03\x27\xc0\xcf\x1a\xf8\x39\xd0\xf3\x29\x54\x44\x16\x7e\x0b\xc5\x23\x3c\xdc\x99\xd7\xdd\x44\x16\xdd\xf0\x75\x09\xf8\x21\xda\xef\x0f\x62\xa7\x93\xed\xf7\x50\x9b\x4b\xf8\xa1\xa7\xfa\x5e\x2e\x7f\x37\xb1\x5c\x6e\xb5\xd9\xd0\x8d\x81\x43\x0b\x38\x18\xdc\x8e\x3a\x6f\x89\xe2\x3c\x0c\x77\xda\x38\x4d\x6e\x10\xe6\xd4\x05\x4c\x0d\x45\x53\x35\xa4\xbc\x9a\xfb\xbd\x0d\xf6\x1a\xa1\x41\x6d\x6f\x50\x6c\x21\x5d\x8f\x84\x46\x17\xd0\x35\xaa\xdc\xbb\x37\x3b\x75\xd7\x24\xca\x5e\x3d\x83\x77\x8b\xae\xab\xfd\xba\x2f\x70\x88\x60\xc5\xe3\x12\xd4\x8e\xa2\x8b\xb2\x8e\xa0\x55\x8f\x0b\xb2\x9c\xc9\xcc\x21\xa0\xdd\x67\xda\x07\x92\x61\x4c\x42\xd3\x77\x03\xe6\xdd\x50\xf9\xf7\xdf\x15\x64\x43\x4d\xb7\xb0\xef\xff\xf7\x7f\xd8\x57\xcb\xd0\x95\x93\x35\xfb\xaf\x3f\x7e\xd8\x68\x63\xff\xf1\xc7\x37\xec\x7a\x43\xd9\x50\x1e\x6b\xe8\xae\x49\x5d\x6f\x2a\x19\xcb\xe1\xc8\x7e\x08\xfd\x59\xd3\xdb\x04\x9c\x35\xf5\x91\xf0\x07\xd6\xc9\x8a\x75\xd1\x75\xb6\xd8\xdf\x18\x49\x3e\x5c\xee\xa2\x29\x03\xf5\x64\xfd\x33\x5d\xf8\x98\xa2\x17\x0f\x2d\x96\xae\xd4\xc5\x5c\xa6\x7c\x58\x68\xc6\xea\x62\x5a\xac\x8b\xe5\xa4\xd8\xf0\xad\x0e\x3a\x77\x2b\x65\xac\x55\x4d\xed\x54\xa6\x2e\x36\x9a\xf5\x5c\xb2\xb9\xfb\x29\x25\x16\xc5\xa6\x88\x25\x85\x46\x52\x48\x89\x37\x56\xeb\x77\xf3\xef\xf3\xaf\x03\x5f\x4a\x32\x3a\x61\x9c\xe3\xb9\xb3\x14\x7f\x8d\x92\x73\xf9\xf8\xd3\xa7\x81\xc2\xf2\xcc\xf9\x4e\xdd\xc2\x55\x49\x78\x29\x9d\x9f\x2e\x87\x53\x3a\x82\xa4\xb0\xcf\x96\xdd\x56\x98\xe7\x24\x70\x99\x5c\xfd\x89\x62\xb8\x42\xcc\xb9\x2c\x02\xd2\xc1\xd1\x2a\x85\x3f\xd5\xf7\x19\x04\x72\x5d\x35\x2e\x72\xa9\x8f\x6a\x47\xd5\xb0\xec\xa1\x89\x1a\xb5\x22\xa6\x40\x1b\xee\x54\x0c\x53\x96\xd3\x39\x26\x1b\xd3\xb9\x8e\x6c\xe4\xf0\xf0\xff\x05\x00\x00\xff\xff\x0b\x3c\xa8\x03\x1f\x6a\x01\x00") +var _paths_strict_sendHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x69\xb3\xa2\x48\xf6\x38\xfc\xbe\x3f\x05\x51\x31\x11\xd5\x1d\x56\xb5\x90\xec\xd5\xff\xfe\x45\xa0\xe2\xbe\xef\x3a\x31\x61\x24\x90\x28\x8a\xa2\x80\xdb\x9d\x98\xef\xfe\x84\x80\x1b\xe2\x86\xdc\x5b\xb7\xe6\x19\xa6\xe6\xb6\x4a\x72\xb6\x3c\xe7\xe4\xc9\x93\x27\x93\xef\xdf\x7f\xfb\xfe\x1d\xab\x1a\x96\x3d\x34\x51\xa3\x56\xc4\x14\x68\x43\x09\x5a\x08\x53\x96\xd3\xf9\x6f\xdf\xbf\xff\xb6\xbb\x9f\x5a\x4e\xe7\x48\xc1\x54\xd3\x98\x1e\x1b\xac\x90\x69\x69\xc6\x0c\xe3\xff\x64\xfe\x24\x4e\x5a\x49\x5b\x6c\x3e\x1c\xec\x1e\xf7\x35\xf9\xad\x21\x36\x31\xcb\x86\x36\x9a\xa2\x99\x3d\xb0\xb5\x29\x32\x96\x36\xf6\x37\x86\xff\xe5\xdc\xd2\x0d\x79\x72\xf9\xab\xac\x6b\xbb\xd6\x68\x26\x1b\x8a\x36\x1b\x62\x7f\x63\x5f\x5b\xcd\x34\xf7\xf5\xaf\x3d\xb8\x99\x02\x4d\x65\x20\x1b\x33\xd5\x30\xa7\xda\x6c\x38\xb0\x6c\x53\x9b\x0d\x2d\xec\x6f\xcc\x98\x79\x30\x46\x48\x9e\x0c\xd4\xe5\x4c\xb6\x35\x63\x36\x90\x0c\x45\x43\xbb\xfb\x2a\xd4\x2d\x74\x86\x66\xaa\xcd\x06\x53\x64\x59\x70\xe8\x34\x58\x43\x73\xa6\xcd\x86\x7f\x79\xb4\x23\x68\xca\xa3\xc1\x1c\xda\x23\xec\x6f\x6c\xbe\x94\x74\x4d\xfe\xb6\x63\x56\x86\x36\xd4\x8d\x5d\x33\xa1\xd8\x14\xeb\x58\x53\x48\x14\x45\x2c\x97\xc6\xc4\x6e\xae\xd1\x6c\x60\x95\x72\xb1\xe7\xb5\xff\x73\xa4\x59\xb6\x61\x6e\x07\xb6\x09\x15\x64\x61\xa9\x7a\xa5\x8a\x25\x2b\xe5\x46\xb3\x2e\xe4\xca\xcd\x93\x87\xce\x1b\x0e\x64\x63\x39\xb3\x91\x39\x80\x96\x85\xec\x81\xa6\x0c\xd4\x09\xda\xfe\xf5\x11\x08\x65\xe7\xd3\x47\xa0\xdc\xe9\xd5\xc7\x31\xe8\x62\x7b\x9e\x3b\x97\xc0\x9d\x22\xdf\x42\x76\xd2\xea\x08\xdc\x69\x9e\x2b\xa7\xc4\xee\x49\x4b\x0f\xac\x43\xd5\x00\xa9\x2a\x92\x6d\x6b\x20\x6d\x07\x86\xa9\x20\x73\x20\x19\xc6\xe4\xf6\x83\x96\x36\x9c\x21\xd3\x79\xc4\xe3\xe6\x76\x7b\x43\x55\xbd\xe6\x16\xd2\xf5\x9d\xc5\x38\xb4\x3e\xf3\x10\x32\x1f\x6d\xad\x43\xcb\x1e\x4c\x0d\x45\x53\x35\xa4\x0c\x74\xa4\x0c\x1f\x7f\x56\x5a\x6e\x1f\xa4\x4e\x9b\x29\x68\x33\x38\xe9\xdf\x99\x05\x1d\x5b\xb7\x06\xc6\x6c\xa0\x29\xcf\x3c\x6d\xcc\x91\x09\x0f\xcf\xda\xdb\x39\x7a\xe1\xe9\x23\x25\x2f\x51\xf1\xdc\xb3\xae\x94\x9d\x07\x2d\xb4\x58\xa2\x99\xfc\x14\x0b\x27\x8f\xcf\x4d\xb4\xd2\x8c\xa5\xe5\xfd\x36\x18\x41\x6b\x14\x12\xd4\xeb\x10\xb4\xe9\xdc\x30\x77\x1e\xc9\x1b\x56\xc2\x82\x09\x2b\x4b\x59\x37\x2c\xa4\x0c\xe0\x53\xba\xb8\xb7\xe7\x10\xaa\xe4\x19\x73\x08\xa2\x4f\x9f\x84\x8a\x62\x22\xcb\xba\xfd\xf8\xc8\x36\x15\x67\xe8\x1d\xe8\x86\x31\x59\xce\x1f\x68\x3d\xbf\x47\x92\xdb\x0a\x6a\xe6\x93\x80\xf7\xe3\xce\xc3\x0f\xec\x5c\xe5\xce\x67\x3c\xd6\x74\x0f\x3e\xc4\x23\x0f\x79\xd7\xfd\x43\xce\xe8\xf2\x04\x92\xd3\xd1\xe8\xde\x13\xf3\xdd\x03\x23\xfb\x6e\x0f\x58\x67\x0e\x48\xda\xde\x55\xa3\xd1\xc1\xd2\x1f\x69\x6c\xb8\x74\x18\x77\x1b\x6a\x96\x3d\xb0\x37\x83\xf9\x7d\x90\xbb\x96\xc6\xfc\xd1\x96\xe8\xd1\x66\xfb\xd1\xf4\x76\x63\x69\xfb\xd0\x00\xb5\xe3\xf9\xae\x17\x7b\x74\x30\x76\xc3\x84\x9d\xb4\x2d\x6b\x79\x0f\xf3\xa1\xb1\x6c\x28\xe8\x91\x50\xc5\x1d\x4b\x6f\x44\x29\xde\x60\x3b\x7f\x30\xf4\x99\xa0\xed\x60\x05\xf5\x25\x1a\xec\x1c\x0d\xba\x01\xd8\xd7\xf2\x61\x0c\x01\x63\xf8\x60\x0e\x4d\x5b\x93\xb5\x39\x9c\xdd\x8c\xb8\xee\x3d\xfa\x34\x0d\x87\x31\xf8\x59\x0a\x82\x1f\x7c\x1a\xbf\xd3\xdd\x8f\xe0\x73\x1b\xbe\x3b\x7c\x57\xfd\x76\xba\xe7\x7d\xdc\x8d\x68\xfb\x78\xdd\x51\xdf\xc1\x83\x14\x0c\x0d\x73\x3e\x98\x6a\x43\x2f\xc4\xb9\x41\x82\xaf\xe5\xc3\x3c\x3e\x1f\xa4\x3f\x0c\x79\x3f\xb8\x7a\x71\xf7\x2d\xf0\xbe\xa6\x37\x71\x3c\x6a\x00\xee\xd3\xc9\x4a\xb1\x55\x2a\x63\x9a\xe2\xa2\x4f\x89\x69\xa1\x55\x6c\x3e\x08\xfb\x8a\x62\x47\x00\xd9\x53\xa9\xdb\x90\x9c\x6f\x57\x00\xb9\x0e\xe9\x76\x1b\x9f\x6f\xb9\xdd\x38\x68\x52\xe0\x3d\xd1\x10\x6b\x2d\xb1\x9c\x0c\xd1\x09\xbb\x19\x9d\x85\x16\x4f\x63\x3e\x03\xf2\xf0\xd3\x0a\x7a\xb0\xed\x71\xd2\xf0\x30\x87\x57\x5c\xd5\x33\xfc\x05\x83\x78\xec\x59\x2f\xbc\x7e\xac\xb1\x17\x4b\x3f\xcc\x9b\xe7\xb6\x9e\xe1\xc5\x7d\xe4\xc1\xb6\x9e\x75\x3f\x4e\xcf\xde\x1d\x3c\x42\x91\xcf\xf1\xdd\x6e\x7c\xe2\xc7\xee\x34\xf4\x79\x24\xaf\xb5\x90\xc9\xd4\xc5\x8c\xd0\x0c\x78\x62\xaa\xed\xa6\x81\x9a\x8c\x7e\x9f\x2d\xa7\xc8\xd4\xe4\x7f\xfe\xeb\x8f\x07\x9e\x82\x9b\x10\x4f\xe9\xd0\xb2\x7f\x87\xb3\x2d\xd2\x9d\x14\xe1\x03\x4f\xa8\x9a\x19\xf8\x48\xba\x55\x4e\x36\x73\x95\xf2\x0d\x7e\x06\x70\x38\x3c\x52\xf7\x0d\xbb\x20\xf4\x06\x8c\x3d\x77\x2f\xc0\x70\x12\x23\xbb\xc7\x8f\xc4\x7f\xc3\x9e\x61\xc4\x61\xfd\x01\x08\x62\xb7\x29\x96\x1b\x3e\x10\xfa\x7c\x68\x2d\xf4\xbd\xe6\x26\xb3\x62\x49\xb8\xc0\xf0\xd7\x6f\x6e\x76\xb8\x0c\xa7\xe8\xc7\xfe\x37\xac\xb9\x9d\xa3\x1f\xde\x23\x7f\x61\x0d\x79\x84\xa6\xf0\x07\xf6\xfd\x2f\xac\xb2\x9e\x21\xf3\x07\xf6\xdd\x49\x1a\x27\xeb\xe2\xae\xbf\x3c\xc8\x7b\x78\xbf\x9d\x41\x3c\xbf\xe9\x01\x4e\x56\x4a\x25\xb1\xdc\xbc\x01\xd9\x6d\x80\x55\xca\xe7\x00\xb0\x5c\x03\xfb\xba\x4f\x07\xef\x7f\xb3\x1c\x20\x5f\xfd\x98\xf7\xec\x7b\x38\x0f\x12\xba\xcb\xcf\x99\x2c\xcb\x95\xa6\x4f\x9e\x58\x27\xd7\xcc\x1e\xc8\x3a\xcd\x0b\x9f\xa1\x3f\x42\xf1\x11\xf2\x0c\xf3\x17\x40\x1c\x01\x54\x8b\xf1\xf9\xb0\x51\x2b\x62\x73\xd3\x90\x91\xb2\x34\xa1\x8e\xe9\x70\x36\x5c\xc2\x21\x72\xc4\xf0\x60\x1e\xfb\x94\xdc\xfb\x8a\xe6\x91\xbf\xd7\xd5\x23\xfd\xfb\xbe\x0d\x92\xe5\x41\xb3\xef\xc2\xc7\xea\x62\xb3\x55\x2f\x37\x4e\x7e\xfb\x0d\xc3\x30\xac\x28\x94\x33\x2d\x21\x23\x62\x0e\xf7\xa5\x52\xcb\x75\x7a\x8d\x66\x3d\x97\x6c\x3a\x2d\x84\x06\xf6\x8f\xc1\x3f\xb0\x86\x58\x14\x93\x4d\xec\x1f\xc4\xee\x9b\xbf\x37\xee\x1a\xe2\x6b\xdc\xdd\x03\x1f\x19\x73\x20\x88\xb9\x47\x3c\xd5\x6b\xfc\x3d\x80\xe1\xc0\xe2\xe1\xa7\x50\x1c\xfe\xfe\x1b\x86\x25\x85\x86\x88\x75\xb2\x62\x19\xfb\x07\xf1\x4f\xe2\x5f\xf1\x7f\x10\xff\x04\xff\xfa\xbf\x7f\x00\xe7\x33\xf8\x27\xf8\x17\xd6\x74\x6f\x62\x62\xb1\x21\xee\x84\x22\x96\x53\x7f\x04\x4a\xe6\x81\x71\xe0\x45\xc9\xdc\xc7\xf0\xde\x92\xf9\x7f\x61\x24\x73\x39\xa6\x7a\x72\x38\x8c\xc3\x8f\x09\xe2\x38\x6c\x5f\x40\x74\x28\xc6\xb0\xc6\x4e\x56\xd8\xdf\x47\x0f\xf0\xcd\xfd\xb9\xd9\xab\x8a\xd8\xdf\xa7\x16\xf1\x47\x90\xd5\x46\x4a\xa3\x1f\xa0\x8f\xc4\xbd\x19\x3f\x4e\x61\x60\x08\xf4\x2a\x95\x41\x40\x7d\x94\x9e\x19\xe4\x39\xb9\x47\x2d\xbb\xa4\x36\x28\xcc\x7b\x99\xda\x00\xa0\x7e\x6a\x4f\x8d\xe4\x26\xb5\xbb\x91\x4b\x41\x2a\x5c\xea\xf6\xc0\x86\x92\x8e\xac\x39\x94\x11\xf6\x37\xf6\xf5\xeb\x5f\xe7\x77\xd7\x9a\x3d\x1a\x18\x9a\x72\xb2\xc4\x7b\xc6\xeb\x45\x10\xec\xf1\xe9\x58\xd9\x63\x3c\xba\x06\x79\x91\x0a\x70\x79\xf3\x7e\xc6\xe4\x11\x34\xa1\x6c\x23\x13\x5b\x41\x73\xab\xcd\x86\xbf\x33\xd4\x1f\x4e\xd8\x50\x6e\x15\x8b\x2e\xb3\xee\x93\x0f\x35\x5d\x23\x6d\x38\xb2\x31\x6d\x66\xa3\x21\x32\x0f\x37\x2f\xfb\xf2\x74\x36\x10\x9a\xb5\x93\xfc\x89\xcb\x95\xa6\x60\x92\x36\xd4\x66\xb6\x8f\x2c\x38\x0d\x66\xd6\xd7\x6c\xb6\x9c\x1e\x26\x40\x17\x3c\xb8\x4d\x54\x1d\x0e\x2d\xcc\x9a\x42\x5d\xbf\x44\x63\x1b\x53\x3d\x40\x4c\x80\xa6\xff\xb8\x21\x0a\xff\x2c\x2a\xac\x38\xfc\x09\xab\x83\x48\x6c\xb4\xb9\x10\xc8\x7c\xae\x6b\xce\x42\x11\x66\x6b\x53\x64\xd9\x70\x3a\xc7\x76\x3a\xe9\x7c\xc5\xde\x8c\x19\xba\x24\xf4\xda\x1c\x71\x1f\x6f\x7b\x93\xcb\xc7\x68\x3e\x4c\x45\xaf\x40\xf5\xcc\x4c\xa8\x37\xdd\x88\x95\x70\x7e\xc8\x95\x93\x75\xd1\x09\x2f\x13\x3d\xef\xa7\x72\x05\x2b\xe5\xca\x6d\xa1\xd8\x12\x0f\xdf\x85\xee\xf1\x7b\x52\x48\x66\x45\x8c\xb8\xc7\x4c\x68\xb1\xfb\x01\x5d\xa8\xa2\x97\x53\xc2\x66\x68\x63\xaf\xa0\xfe\xfb\xd7\x2b\x1c\x7f\xfd\xf1\xc3\x44\x43\x59\x87\x96\xe5\x37\x2b\x6f\x81\x2c\xd8\x04\x6f\x74\x94\x9b\x29\x78\x99\x33\x37\x61\x76\xe0\x2b\xd8\x32\x8e\xe9\xd6\x87\x3c\xc5\x31\x51\x1b\xd0\x9c\x00\xc1\xcd\xdd\x0c\x6e\xc0\x03\x34\x73\xcb\xc2\x82\x93\x2d\x11\xa9\xed\x29\xcc\x0f\x53\xda\x5b\x8c\x60\x95\x4e\x59\x4c\x61\x89\xde\x1d\x8e\xdc\x04\xe8\x6d\x86\x0e\xb0\x7c\xb7\xff\xd4\x94\x6b\xb4\xed\x33\x60\xaf\x6a\x9d\x07\xc7\x53\x3b\x9f\xcd\x0c\xae\x79\xfa\xcb\x84\xdf\xb5\x96\x5f\x9c\xd5\xb6\x2f\x57\xb4\xd9\xd1\xe3\xe0\x5b\x0a\xb2\xa1\xa6\x5b\xd8\xd8\x32\x66\xd2\x75\x65\xdb\xa7\x0d\x5f\x95\x83\x07\xc7\x93\xc3\xbe\x58\xe2\x0a\x6d\x27\x15\x0c\x0f\x59\x61\x50\xf1\x44\xf0\x83\x9e\x58\x4e\xf2\xc4\x6e\x00\xb1\xa7\x63\xef\xe5\x70\x1f\x86\x63\x47\x3c\xd6\xfe\x50\xc1\xe0\x1b\x98\x8c\xa5\x7d\x1c\x9b\xfc\xcf\x98\x08\xda\x77\x1f\x72\xdb\x2e\xe7\xca\xc3\x6d\x0f\xaa\xe3\x7d\xf5\x15\x77\x5c\xf0\x42\x5c\xc4\x03\x36\xd4\x07\xb2\xa1\xcd\xac\x60\x1d\x54\x11\x1a\xcc\x0d\x43\x0f\xbe\xeb\x2c\xb7\xab\xe8\x5a\x5f\x3b\xb7\x4d\x64\x21\x73\x75\xad\xc9\x2e\xce\xb6\x37\x03\x27\x4c\xd2\xde\xae\xb5\x9a\x9b\x86\x6d\xc8\x86\x7e\x95\x2f\x7f\x1f\xed\x95\x05\x41\x05\x99\x4e\x78\xe1\x05\x8a\x4b\x59\x46\x96\xa5\x2e\xf5\xc1\x55\x45\xf1\x18\x87\x9a\x8e\x94\x7b\xad\x3c\xd2\xaf\xa8\xd0\x75\xd3\xbb\x92\xed\x7f\xd5\x12\xaf\x2c\x49\xdd\x19\x17\x1f\xf7\x48\xf7\x7d\xdc\xb3\x2c\x47\x3b\xd4\xdd\xc4\xf1\x51\x43\xdf\x53\x8c\xbe\x38\x14\xde\xc4\x75\x39\x34\x06\x37\xbf\x31\x54\x9e\xac\x85\x45\xa6\x9b\xf7\xa6\x42\xe7\xe5\x7e\x57\xa6\x4b\xbb\xd9\x81\xec\xb2\xe2\x8c\x92\x2f\x0e\x92\x9e\x77\x30\x96\xa6\x7c\xa8\x1f\xba\x32\x3c\xed\x5d\xce\xd7\xaf\x3f\x7e\x5c\x9f\xae\x5d\xb7\x03\x6f\x29\xf2\x55\x71\x7a\x75\xba\xbf\x47\x1a\x53\x78\x6e\x33\xcc\x08\xe7\x2c\x39\x5f\x45\xeb\xab\x12\xbe\xd5\xc8\x2b\x5c\xbe\xd5\xc4\x9d\x2b\x07\x36\xb8\xac\xb7\xbe\xd3\xee\x26\xba\x43\xab\x1b\x18\x1d\x92\x34\xcb\xab\xe8\xc5\x24\xc3\xd0\x11\x9c\xed\xc7\x2d\x4d\x46\x83\xd9\xd9\x18\xed\xfe\x76\x3e\x6e\x1f\xcb\xdc\x06\xbe\x11\xfd\xac\xd0\xce\x7f\xf3\xa4\x5c\x22\xb0\x2a\xdb\xa1\x7a\xe0\xd4\xed\x63\xc9\xac\x98\x2c\x60\xbf\xff\x7e\x2a\xc1\xff\xfb\x1b\xc3\xff\xf8\xe3\x1e\xac\xa0\xe7\xf7\x52\xfb\x7f\x17\x82\x7c\x00\xde\x99\x50\x7d\xe0\x7d\x12\x77\x29\xbc\x69\x4c\xc1\x55\x01\x11\x98\x57\x70\xe1\xc8\x83\x63\xe9\x23\x4e\xec\x95\xd1\xf4\x5e\x4d\x45\x34\xe3\xe9\x1d\x2c\x1f\x35\xa2\x3e\xc9\xec\x8b\x63\xea\x1d\x6c\x97\xa3\xea\xb5\x07\x6e\x8c\xab\x67\x75\x34\x11\xea\xea\x5e\x3f\x4f\x49\x7a\x78\xaa\xe5\x79\xff\x3b\x13\xb8\x47\x87\xde\x67\xf2\xb7\x7b\x0b\x38\xa0\x0e\xb4\x97\xdd\x5c\xe1\xfa\x64\xe3\xda\x34\xee\xa7\x4c\xc4\xec\xcd\x00\xcd\x56\x48\x37\xe6\x28\x28\xb9\x69\x6f\x76\xd3\xa2\xa5\x6e\x5f\xb9\x39\x45\x36\xbc\x72\x6b\x37\x21\xbb\x76\xdb\xd2\x86\x33\x68\x2f\x4d\x14\x94\x87\xe3\x99\x3f\xfe\xf9\xaf\x63\xf4\xf2\xef\xff\x04\xc5\x2f\xff\xfc\x97\x5f\xe6\x68\x6a\x5c\x49\x99\x1d\x61\xcd\x8c\x19\xba\x19\x0d\x1d\x61\x5d\x82\xf1\x38\xd3\xa6\x68\x20\x19\xcb\x99\xe2\xe4\xb5\x39\x13\xce\x86\xc8\x3f\x67\x3b\x1f\x5c\x77\x92\xd8\x41\x1b\x22\xe5\xfa\x84\xcb\x5f\xe5\x16\xd6\xd6\xfc\x35\xbb\xae\x99\x4d\xd0\xf6\x5e\x36\xdd\xa5\xd5\x79\xf4\xf9\xc4\xbb\x57\xc7\x17\x96\x68\xaf\x70\x79\x9f\x97\xd9\xc5\x27\x9a\x72\x27\x37\x79\x12\xcd\x5d\x1b\xb7\xbc\x0d\x4f\xce\x88\x1f\xa4\x86\xee\x8e\xa3\xab\xb7\x6f\x05\x53\x4e\x70\x34\xbb\x9a\x05\xd0\x64\x74\x6d\xe0\x75\x6e\x62\x8a\xb1\x94\x74\x84\xcd\x4d\x24\x6b\x4e\xa2\x20\x68\x6d\xe4\x4a\xec\x1b\xb0\xc7\xea\x81\x65\x22\x5f\x0a\x5a\x53\xf6\xbd\xb5\x2f\xd4\x7c\x64\x0c\x72\xbb\xcb\xa9\x8f\xbd\x53\x03\xda\x10\x9b\x37\xd2\xf5\xa7\x89\xd1\xd3\x64\xfd\x73\x53\xd5\xe8\x98\x78\xb0\x44\xf6\x26\x53\x37\xa7\xb8\x8f\x30\x79\x35\x94\x8b\x8c\xcd\x87\xab\x8c\x6f\x32\x7a\x27\xee\x08\x66\x35\x05\x6d\x88\xa9\x86\xf9\xc8\xa2\x2c\x96\x12\x9a\xc2\x1d\x1e\xaf\xc1\xbd\xb2\x18\xfa\x02\xc8\x5b\x8b\x8a\x8f\x80\xcd\x95\x1b\x62\xbd\x89\xe5\xca\xcd\xca\xc5\xc2\xa2\x13\x59\x36\xb0\xdf\xbf\x12\x03\x6d\xa6\xd9\x1a\xd4\x07\x6e\x11\xdb\x9f\xd6\x42\xff\xfa\x0d\xfb\x0a\x70\x82\xff\x4e\xe0\xdf\x71\x16\x23\xf8\x1f\x14\xf9\x03\xa7\xff\x24\x09\x9a\x26\xd9\x18\x0e\xbe\xfe\xf1\xd7\x63\xd0\xc1\xc0\xdd\x31\x76\xd6\x5b\xd2\x76\x60\x1b\x9a\x72\x13\x13\xa0\x39\x8a\x7f\x06\x13\x39\x58\x5a\xe8\x10\x1e\x0d\xb4\xd9\xc5\x2e\xb5\xdb\xf8\x78\x8e\x21\x9f\xc1\x47\x0d\xa0\xa2\x0c\xfc\x69\xd7\x9b\x38\x48\x8e\xa3\x9f\x92\x1e\x3d\x70\x83\xb1\xfd\xbc\xd0\x29\x47\xb8\x89\x82\x62\x69\xfe\x29\x36\x98\x3d\x0a\xcf\x33\xde\x47\x41\x03\x8e\x7a\x06\x03\xeb\x0e\x19\xdb\xc7\x99\x60\x68\x92\x79\x4a\x4e\x9c\xd3\x17\x70\x38\x34\xd1\x10\xda\x86\x79\xbb\xab\x59\x9c\xc2\x9f\x52\x2d\xee\x4c\x46\xde\x36\x8e\xfb\x6c\xb0\x34\xcb\x3f\xc5\x06\xef\xb0\xe1\x66\xe4\x07\x1b\xc5\xbc\x0d\x9d\xe3\x59\xf0\x0c\x74\x02\x77\xc0\x7b\xbd\xe0\x04\x03\x37\x11\x70\x04\xc7\x70\x4f\x21\x20\x4e\x11\x1c\xa6\xec\x3b\xfb\xbf\x8d\x88\x26\x9e\xea\x0e\x02\x9c\x75\x84\x97\x24\x71\x4f\x63\xb8\x89\x88\x27\x28\x9a\x78\x0a\x13\xe9\x72\x73\xc8\x2d\xdd\x56\x2c\x9e\xc5\x79\xe6\x29\xf8\xd4\x40\xd5\x36\xfb\x4d\x4e\xc6\x54\x1f\xa8\x1a\xd2\x6f\x3b\x46\x9e\xe3\x9e\xb3\x3f\x82\xde\x2f\x0c\xee\x17\x6c\x36\x37\xd9\xa0\x70\x9c\x65\x9f\xf2\x21\x04\x33\xd0\x66\x43\x64\xd9\x83\xcb\x25\xa1\x3b\xa8\x00\x78\xce\x14\x09\xf6\x2c\x08\x70\xd6\xde\xe0\xed\xa1\x84\xc2\x49\x9e\x7a\x8e\x1f\xee\xa0\xbd\xaa\x61\xee\x03\x85\x9b\x38\x08\x9c\xa3\x9e\xeb\x15\xde\x55\xaa\xdb\x60\x01\xa0\xc0\x53\x1a\x05\xf0\x00\xd2\xef\xdb\x20\x05\x28\x1e\x7f\x0e\x11\xb1\x37\x74\x13\x4d\x8d\x15\x1a\xbc\x21\xd3\x38\x24\x2c\x8d\x99\x65\x9b\x50\xbb\x33\xe8\x52\x80\x3b\x1a\xcc\x95\x18\xe8\x66\x89\xcf\xb3\x41\xd0\x45\x99\xcf\x9e\x1d\xe2\x1b\xf6\x35\x93\xe8\x66\x6a\xf9\x4e\xbb\xd8\xa9\xf4\xb2\xe9\x62\xbb\x59\xe8\xb4\xe9\x74\x26\x2b\x90\xc5\x72\xaf\x07\xf2\xb5\x42\x89\xad\x08\x79\xa1\x25\xd6\xd2\x2d\xa6\x58\x4d\x36\xc4\x74\xbb\x5b\x29\xfb\x45\x76\x15\x09\xd8\x21\x49\x76\x0b\x19\xa6\x5e\xa6\x2a\xe5\x9c\x58\x4d\x96\xca\xe9\x04\x4b\x02\x81\x22\x99\x3e\x5d\x2d\xa7\x1a\xf5\x62\xa6\x53\x60\x33\x89\x62\xb2\x54\x2b\xe6\xd2\x15\xaa\xc1\x8a\xbd\x4e\xbb\xf5\x30\x12\x72\x87\x44\xa0\x3b\x89\x6a\x4f\xa0\x7b\x54\x47\x10\xb3\xdd\x4e\x1d\xb4\x0a\x15\xd0\xaa\x50\x89\x56\x26\xdb\xaa\xb1\x94\xd8\xaa\x16\x2a\x65\x50\xcb\xb6\xa9\x4e\x3d\x5b\xc9\xd5\xcb\x85\x42\xf6\xa2\xf3\xaf\x22\xa1\x1c\x4e\x00\x59\x4b\x83\x6c\x4b\xa4\x81\x50\xea\xb6\xd2\xad\x2c\x29\xf4\xf2\x42\xb7\x9b\xe9\x76\xdb\xa0\x9d\xed\xf6\x7a\x75\x46\xec\x75\xc5\x66\xb5\x90\xea\xf6\x1b\x42\x87\x61\xbb\x15\xea\x61\x24\xb4\x83\xa4\x56\xed\x65\xb2\x54\x81\x66\xbb\x89\x94\x58\x2e\x14\xba\x34\x5d\x48\x35\x3b\x95\x66\x81\xee\xa4\x3a\xf5\x5a\x25\x0b\x8a\x59\x31\xd5\x25\xc5\x42\x3b\x57\xab\x17\x4b\x62\x23\x93\xc8\x3c\x8c\x84\x71\x3a\xbe\x5e\xed\x65\x73\x45\x90\xcc\x91\xe9\x72\x8d\x4a\x74\x8b\xe9\x52\x39\x55\x4c\xe7\x5b\xe5\x6a\x0b\x64\x7b\x64\xbf\x94\x6e\x64\x2b\xe5\x56\x52\xac\x08\x8d\x0e\x5b\x4b\xb2\x95\x2e\xc8\x7e\x0d\x5b\x5c\xb7\x9b\xe4\xdc\xd1\x5a\xaf\xe0\xfa\xb8\x57\xe2\x4f\x0b\xdd\x2e\x3c\xfb\x86\x31\xdf\x30\xdb\x5c\xa2\x07\x6c\xe9\xb2\xa4\x2c\xb4\x25\xb9\x73\xf0\x53\x3b\x92\x4d\xa4\x68\xf6\x00\xea\xf3\x11\x9c\x2d\xa7\xd4\xce\xfa\xc5\x56\xfd\xeb\x7b\x74\xe7\x39\x76\x70\x05\x7b\xab\x91\xfa\xfa\x1e\x1a\x7b\x8e\x7d\x67\x79\x33\x68\x6b\x2b\xb4\x43\xe6\xfc\x3f\x5c\x11\x5b\x34\xea\x71\x96\xe8\xf8\x86\x91\x8f\x2a\x47\x50\xe9\x57\x58\xed\xd8\x97\x7f\x9d\x88\x08\xd0\x2c\xc3\x73\x38\xcb\xb1\xe4\x37\x8c\xf8\x86\xed\xfa\xec\xdf\x5f\xdc\x71\xe3\xcb\x0f\xec\x0b\x41\xfe\x89\xbb\xd7\x97\x6f\xd8\x97\x63\x81\xe1\xee\x9e\xd8\xaa\x1f\x7f\xb4\xb7\x73\xe7\x47\x7f\x87\x1f\x5b\xb8\x85\x86\xbb\x36\x61\xf5\xee\xcb\x7f\xae\xf5\xbd\x9f\x33\xe0\xe3\x0c\x38\x12\x3f\xe7\x0c\xbf\xce\x59\xab\x91\x0a\xcb\x59\x38\x9d\x0e\xcf\xd9\xee\x9f\xcb\x9a\x9b\x2e\x75\xa8\x08\x39\x74\xee\x38\xda\x87\xd6\x5f\x7e\xec\x40\x7f\xb1\x0c\x5d\x19\x5c\x13\x9a\x64\x2c\x87\x23\x7b\x70\x4d\x5b\xdc\x67\x83\x04\x7b\x72\xe7\x96\x74\xf7\xf0\x83\xb4\xee\xec\xde\x2d\x20\x27\xb8\x22\xe8\x27\x3f\xe6\x8f\x54\x6a\xc2\xd7\xf5\x54\x50\xd7\x87\x0c\x68\x1e\xe8\x7a\xf2\x76\xd7\xe3\x77\xba\xde\xeb\xb7\x57\xba\xde\xd3\x9e\x57\xbb\x3e\x64\x3f\xdd\xea\xfa\xf7\xb6\xfa\x83\xa7\x26\x08\x9e\xe1\x83\x3d\x35\xfd\x27\x47\xfd\xc2\x9e\xda\xe3\x2c\xc8\x53\x83\x5f\xdb\x53\x7b\x9c\xbd\xa3\xa7\x26\x02\xcc\x15\xdc\xf3\xd4\xe0\xbd\x3c\xf5\xbe\xa1\x1b\x7d\x45\xef\x83\x9f\x77\x98\x5e\x0f\xbc\xa3\xc3\x0c\xea\x81\x33\x11\x5f\xf6\x00\xb8\xe2\x30\x2f\xc5\x17\x89\x33\xfc\x69\xbe\xcb\x6f\x07\xf4\xfb\xd9\x01\x78\xbe\x17\xce\xbc\xe6\xf3\xbd\xf0\x6c\x34\xf2\xf3\x83\x07\xaf\x17\x98\xf7\xb3\x85\xa0\x5e\x38\x13\xf3\xf3\xde\xe8\x85\xe0\xe1\x61\x6f\xf4\x01\x3d\x40\xb0\x04\xcb\x73\x2c\x09\x38\x22\x78\x0c\xc7\x7f\xcd\x49\x09\xe5\x63\x2d\x70\xba\xf5\x6b\xb2\x76\xec\x35\x96\x64\xd9\xe7\x7b\xed\x13\x87\x5e\xb4\x8f\xb5\x67\x7b\xed\x13\xb3\x06\xf6\xac\x71\x04\x75\x2d\xb3\xf1\x8b\x2a\x24\xe5\x63\xed\xbf\xc8\xd6\xc8\x03\x6b\x34\x7d\x6d\x96\xf3\x8b\x2a\x24\xed\x63\xed\xbf\xc8\xd6\x76\x1e\x12\x70\x1c\xc5\xe3\x34\xcf\xd1\x6e\xaf\xe1\x0e\x6f\xba\x36\xd5\x1c\xd6\x78\x00\x48\x92\x05\x38\xc9\x70\xf4\x9f\x14\xcb\xd2\x1c\xce\xfe\x52\x9a\x09\xf6\x3c\x12\x38\xbe\x1f\xbb\xff\xdb\x78\x24\x0f\x3c\x52\xc4\x7e\xa4\x0b\xc5\xe3\xaf\xa0\xab\x04\x07\xf6\xe3\xc2\x7f\x1b\x8f\xd4\x37\x8c\xa3\x39\x9e\x27\x39\x86\x73\x9d\xa8\xcb\xa1\x65\x43\xd3\xd6\x66\xc3\x81\x04\x75\x38\x93\x91\xdf\xe7\x3c\x8c\x80\x39\x47\xf0\xa8\x2b\xf3\x05\xe2\x61\xf9\xd9\xf5\x9a\xcb\x90\x7b\x30\x8a\x37\xf9\x76\x17\x41\x06\x13\xb4\xfd\x18\x6b\xa1\x3d\xaa\x28\xc0\x7a\x4e\xef\x9d\xa4\xec\x21\x78\x6f\x29\xfb\xf8\x79\x50\xca\x1f\x60\xaf\x2e\x55\x0c\xe7\xb9\xdd\xf7\x92\xb2\x8b\xe0\xbd\xa5\xec\xe3\xe7\x31\x29\x87\xcd\x8d\x3c\xe3\xf9\x1d\xaa\x68\x9c\xf7\x1c\xff\x3b\x49\xd9\x43\xf0\xde\x52\xf6\xf1\xf3\x98\x94\x43\x16\x69\x3c\x15\x43\xb8\x54\xd1\xb8\x37\xf4\xbc\x97\x94\x5d\x04\xef\x2d\x65\x1f\x3f\x0f\x7a\x8c\x90\x19\xa6\xff\x3c\x50\x93\x14\x74\x3a\x48\xd8\xa5\xf2\xfd\x09\x21\xa7\x85\x29\x0a\x47\x31\x24\xc9\xaa\x0a\x8f\x00\xcb\x50\x24\x4f\x51\x8c\x02\x20\x4d\x01\x55\xe2\x59\x49\x66\x20\x24\x18\x1a\xc7\x11\x54\x68\x59\x61\x10\x4f\x00\x8e\x65\x59\x59\x41\x0a\x22\x70\x56\xfe\xba\x83\x81\x10\xcf\xb0\x12\xc5\x49\x32\x4e\xab\x48\x61\x01\xae\x50\x40\xc1\x71\x96\x20\x39\x85\xe3\x65\x05\x47\x38\x43\xb2\x8a\xa2\x52\x14\x8f\xb3\x08\xec\xe2\x31\x92\x51\x70\x85\x95\x19\x8e\xf9\xea\xf4\x2b\xf0\x55\x70\xb1\x4e\x05\x17\xe3\x2f\xec\x62\xbd\xc2\x2e\x86\xe7\x19\xfa\xfe\x5d\x6f\x71\x91\x64\x59\xe6\x1b\x46\xec\xfe\x8f\x5f\x5c\xdf\x30\x82\x77\xfe\x7a\x7f\x0e\xbf\x1e\x3e\xec\x68\x13\x04\x41\x48\x95\xd9\x79\x9f\x6d\x14\xd7\xe9\xb8\x2d\x0f\x89\x24\x2e\xc8\xcd\x71\x6f\x56\x4e\x0d\x7b\x24\xa9\xd6\xf3\x89\x58\x3e\x9f\x4e\x49\x35\x82\x83\x99\x14\x9d\x17\xd6\x80\x43\xa9\xe4\x34\x05\x88\xe6\x72\x53\x35\x67\x1d\x26\xd3\xe7\x8d\xba\x54\xce\x4c\xaa\xa3\x5c\x5c\x81\x53\x7e\x48\x6c\x4b\x3b\xd0\x42\xb7\x6f\xd3\x85\xa1\x70\xb8\x90\xd0\x2e\xbe\x6d\x56\xeb\x37\x61\xb2\x6e\x25\x48\x66\xb9\x5d\x76\x19\xa2\x92\x78\xdb\xf4\xf3\x96\x56\xd3\xe3\xbd\xba\x91\xcd\xb0\x7a\xaf\x00\x46\xa6\xb4\x7e\xab\xb2\x3c\xdf\x5b\xa9\x85\xa9\x12\xaf\x4c\x09\x4a\x95\x01\x5f\x45\x85\x59\xab\x27\x8c\xf8\x22\xdf\x4a\x34\x28\x3b\x5b\xa8\xed\x20\xf7\xca\x54\x11\xbe\xcd\x41\xed\x88\x4c\x50\x2c\xe1\xfc\x4a\xed\xfe\xf4\x85\x2e\x41\xd5\x04\x21\x85\xe7\x85\x5f\xed\x72\xb5\x8a\xf8\xe6\xec\x18\xba\x62\xfe\x7e\x8b\xa0\xa3\xd1\xe6\xaf\x32\x0e\x09\x12\x70\x32\x64\x54\x45\x92\x54\x1a\x92\x94\xa4\x90\x04\x04\x2c\xab\xd2\x2c\xcf\x12\x94\x2a\x11\x9c\xc2\xd3\x12\x89\x53\x08\xe2\xb2\xc2\x49\x8a\xc4\x2b\x32\x8b\x38\x4e\x55\x28\xb7\x98\x86\x0c\x56\xee\x6b\x3a\xcf\x92\x1c\x4b\xdc\xbb\x09\x08\x8a\xa5\x38\x92\xa1\x38\xfc\x96\x3d\x30\x0f\xda\x43\x29\x39\x2a\x19\xdb\x69\x5c\x5a\x11\x06\xbe\x6a\x66\x34\x25\xde\xa6\xe5\x56\x6c\x33\xee\x77\xde\x12\x15\xa3\x04\x8a\x80\x26\xb3\x4c\x2e\xde\x6a\x4a\xf5\x49\x7c\xd3\xad\x8c\x60\x03\x2c\x32\x1b\x92\x4d\x67\x47\xe5\xb7\xf5\x14\x8d\x57\xca\x54\x59\xae\x8d\x86\x42\xad\x69\x4e\x13\x58\xce\xe9\x3f\xc7\x1e\x4e\x54\x54\xd7\xca\x19\x39\x91\x4d\xf4\xd9\x74\x2d\x35\x17\xf0\x59\x8c\x64\xf5\x8d\xa2\xa8\x6c\xce\xa4\x27\x7d\xa2\xc6\x2e\x66\x72\x7d\xb6\x79\xeb\x4c\x8a\x05\xa9\xd0\x4c\xc9\x00\x6a\xeb\x4e\x72\x36\x4c\x0a\x09\xa3\x98\x61\x87\xf2\xcc\x62\x6c\x19\xb1\x22\xa7\x4c\xc4\x95\xf4\xa6\xe5\xfb\x0e\xe4\x56\x80\x3d\xf4\xfd\xea\xf4\xdf\x60\x0f\xa4\x33\x3c\x3f\x61\x0f\x54\x34\xba\xfc\x95\x67\x01\x2d\xc9\x8a\x22\xa9\x0a\x02\x10\xb0\x3c\xab\xb0\x34\x29\xb3\x24\x4f\x23\x85\xe1\x38\x1c\x47\x94\xa2\x02\x16\xf1\x80\x94\x20\x4f\x01\x1e\xd0\x34\x43\x22\x92\xa5\x09\x16\x72\xbb\x51\x86\x72\xfe\x05\xe8\x36\x75\x55\xe5\x69\x1c\xe7\xae\x1b\xc4\xfe\xae\x9b\xc2\x62\x78\x82\xa3\x6e\x59\x04\xf9\xa0\x45\xe4\x65\x7d\x55\x06\x71\x52\x33\x66\x3a\xaf\x34\x37\x6f\x3a\x22\x8c\xa1\x40\x97\xb9\x19\xd3\xa8\x30\x7a\x72\xa2\xb7\xc7\x14\xd9\xea\x2e\x4a\x89\x4a\x01\xa1\x18\x3f\x19\x16\x26\x69\x00\x7a\x93\x2e\x5b\xef\xe4\xd3\xcd\x54\xcd\xa0\xb2\xb8\x60\x12\xfd\xd6\x7a\x64\x25\x60\x7e\xa8\xba\xc3\x82\x63\x11\x27\x3d\x5a\x1a\x67\x2a\xad\xe9\x7a\xd8\x63\x17\x75\x09\x6f\xdb\x64\x6b\x59\xa7\xfb\x8b\x29\xa2\x27\x60\x31\xce\x72\xec\x22\x3b\x12\xea\x68\x8d\x2f\xd6\x70\xa8\xf7\xd5\x9e\x3d\x4d\x4d\x93\x31\xc6\x10\x52\xfa\x96\xa3\x38\x32\x06\xda\x53\x5b\x15\x49\x88\x37\x1a\x7c\x36\x9b\xa7\x34\xad\xed\xa0\xaa\x05\x58\x44\xab\x15\xa4\x55\xbf\xb8\x45\x50\xcf\x5a\x04\x19\x8d\x36\x7f\xc5\x29\x44\x22\x09\x41\x95\x57\x08\x89\x43\xb8\x4a\x53\x34\xa7\xd0\x24\x4e\x30\xbc\x8a\x70\x85\xe3\x55\x42\x52\x15\x85\x95\x14\x4a\x91\x39\x85\x92\x70\x9a\xa3\x24\x40\x32\x0a\xc1\x22\x82\xbe\x65\x11\xe4\x55\x9d\x67\x28\x8e\x67\xef\xde\xf5\x32\x9f\x04\xc7\x71\x37\x2c\xe2\xd1\x90\x49\x68\x8e\x99\x98\x49\xe3\xd2\x78\xc8\xb7\x3a\xe5\xd6\x3a\x3d\x8f\x0f\x41\x9e\x93\xe2\x0a\xe2\x9b\xf2\xb8\x65\xa5\x47\xc5\x1c\xc0\xbb\x54\x7b\xbc\x7c\xd3\x8b\xba\x50\x55\x63\x84\xb5\x6e\x01\x75\x43\x40\x7b\xd9\x54\x09\x75\x5b\x41\xe9\x4d\x8a\x1f\x6f\x8c\xa6\x3d\xca\x76\x13\x73\xc3\xe9\xc0\x9d\x41\xe4\xd7\xbb\x4f\xb9\xc3\x1f\xc1\xd1\xd9\xe3\x8f\xc2\x5a\xa8\xd6\x26\x6e\x87\x6f\xd9\x5a\x17\x55\x26\xb5\xda\xb0\x95\x19\x66\x6b\x13\x19\xc6\x16\x4a\x79\x99\x4d\xf5\x97\x1d\x31\x39\xb1\xc5\x7e\xaf\x92\x49\xae\x97\x69\x2d\xbe\x8a\x1b\xcb\x55\xc1\x5c\x51\x1c\x5e\x6f\x16\x67\xa5\x54\x3a\x5b\xef\x94\x96\xeb\x58\x01\xc4\xd3\x5a\xb3\x94\x48\x0d\xdf\x66\xb1\xf6\x38\x1b\x73\x0c\xa6\x14\x60\x30\x15\x31\x48\xe9\xfe\xff\x66\x30\x20\x1a\x65\xff\xca\x90\x0a\xcf\xa9\x34\xc9\x20\xc4\x70\x0a\x21\x01\x56\xa2\x25\x8e\x57\x01\x09\x55\x9a\x24\x08\x89\xa5\x19\x1e\x02\x4a\x85\x2a\x41\xe1\x24\x54\x70\x89\x06\x12\x43\x92\x12\xce\x4a\x88\xe7\xbf\x3a\x45\x1a\x74\xa0\xee\x83\xab\x26\xc1\x32\x2c\x77\xf3\xe6\x6e\x04\x71\x33\x79\x14\xcd\x83\x1b\xe6\x42\x5f\x31\x17\x77\xc6\xec\x88\x37\x53\xed\x8f\x89\xf2\x92\x36\x70\x29\xcf\x76\xa8\xd9\xb6\xb2\x6a\x6d\x32\x64\x7b\x6e\x4c\x62\xab\xb4\x50\xb1\x93\x44\x01\x94\xd8\x04\xcb\xf4\x47\x33\x55\x12\x53\xf3\x6c\xb5\xa7\x50\xf4\xac\x26\x37\xd9\xee\x44\xcd\x95\xd6\x8d\x2e\x3f\x4c\xa7\xf8\x98\xda\x81\x36\x4b\x30\xb5\x5c\x47\x76\x40\x3b\x96\x72\x32\xb9\xa8\xf1\x53\xae\xd8\xc8\x70\x12\xdd\xc1\xa5\xe5\x46\xb4\x17\x96\xdd\xae\xbd\xb1\xb9\x76\x3c\x6b\xa6\xa6\x19\xd1\x56\x04\x6a\x9a\x14\x53\xdd\xf5\x1c\x0c\x27\x06\x80\xbd\xca\x78\x9b\xe1\x3b\x65\x9d\x49\x0a\x59\xa3\x44\x13\x85\x4d\x3e\x5d\xe0\x87\xb8\x51\x59\x16\xc9\x89\xc5\x69\x5d\x07\x7e\x2e\xc0\x12\xb2\x78\x90\x36\xed\x2d\x41\x10\x12\x93\x77\x55\xdb\x77\xb8\x5c\x6d\x7a\xce\x12\x88\x68\xb4\xd8\x39\x2b\x01\xf3\xf4\x86\xe0\x59\xfc\x3b\x4e\x7c\xc7\x09\x0c\xc7\x7f\x38\xff\xae\xaa\x2b\x8f\x13\xe4\xf5\x60\x69\x7f\x97\x02\x3c\xc5\x33\x2c\xe0\x6f\xcd\x97\xef\xaa\xf2\xa7\xbc\x12\xdd\x82\x46\x6d\xe3\xdb\x46\x21\xc1\xa6\x66\x29\x3e\x0b\xf0\xcd\x38\x11\xb3\xf0\xa1\x6d\xad\x73\xeb\x37\xa2\xab\x34\x3a\x3d\x98\xc8\xc3\xb4\xa3\xca\x62\x80\x2a\x07\x5f\xbf\xb8\x2a\xe3\xa7\xaa\x7c\x27\x21\xf5\xc0\x99\x99\x61\xf3\x53\x57\xce\xa9\xb8\x56\x2a\x0e\xae\xd8\xdd\x1d\x30\x17\x9b\x0d\xc2\x81\xf1\x57\x2f\x87\xa4\x86\xf2\x17\xd4\x86\x03\x43\x1f\xc0\x30\x38\x43\x87\xa6\x86\xf1\x81\x09\x49\x0d\xbb\xcf\x33\x50\x38\xed\x24\xdf\xc3\x81\xe1\x0e\x60\x28\xc6\xc9\x2e\x87\x03\xc3\x1f\xc0\x70\xac\x53\x81\x11\x0e\x0c\x81\xfb\x0a\xc2\xa8\x90\x70\x2e\x6a\xe6\x42\xc2\x01\xbe\x52\x27\x3a\x24\x1c\xd2\x5f\x0d\x16\x12\x8e\xbf\x88\x27\xac\x7c\x68\x7f\x31\x50\x48\x38\x8c\xaf\x3c\x25\xac\x7c\x58\x1f\x9c\x90\x46\x41\x70\xfe\x9a\x92\x90\x70\x78\x5f\xdd\x46\x58\x3f\x88\xfb\x6a\x23\x42\xf2\x05\x2e\xea\x0f\x42\xc2\x01\xe7\x6b\xe2\x4c\x48\x30\xe4\x39\x98\x90\x5a\x08\xa8\xf3\xb5\xe3\xb0\xd4\xf8\x96\xa0\x43\xea\x20\xf0\x2d\xe9\x86\xa5\x86\xf5\x2d\x3d\x87\x04\xc3\xf9\xd6\x22\x43\x82\xe1\xcf\xc1\x84\x64\x8a\xc4\xcf\xd7\xec\xc2\x82\x21\x7c\x2b\x8d\xd1\x1c\xa1\x1d\xc9\x46\xdb\xdb\x87\x6f\x7d\xc3\x76\xb4\x3f\xb6\xf3\xf6\xca\x49\xd2\x2f\x47\x6c\xa7\x1a\x7f\x1a\xa2\x1d\xbe\xb8\x4b\x31\x84\xbb\x78\x6b\x1b\x2f\xad\x4e\x7f\xc3\xbe\xa8\xa6\x31\x7d\xb5\xba\x7f\x0e\xed\xd1\x97\x1f\xd8\x3f\xff\xf5\x0d\xfb\xb4\x9b\x83\x9d\xca\x7e\xf7\x38\xec\x2b\xbb\x12\x15\x64\xd9\xda\xcc\xd5\x8e\xa9\x36\x73\x1a\x9c\x6f\xc2\x71\x1f\x0f\xde\x08\x75\x72\xef\xf6\xa6\xc3\x93\x86\x91\xd4\xef\xbd\xc3\x39\x15\x57\x95\x71\x1f\xa1\x1f\xbe\x70\x9f\x57\x19\xff\x7d\xa5\x80\xc1\xa7\xa4\x9f\x6a\x5f\x64\xa0\x92\x82\x3b\x4a\x0a\xfe\xa7\xa4\xe7\x4a\xea\x4d\xdc\x0e\x5f\xa8\xcf\xab\xa4\xe7\xca\xf8\xa9\x2a\xbc\x03\x75\x91\xbc\xe7\x30\x71\xfc\x7f\xda\x78\x08\xe7\x4f\x26\xee\xc7\x2f\x8c\xa3\x8d\xae\x32\x3a\xe7\xba\xb9\x3d\xcf\xe3\xce\xff\xbe\x9c\x29\x04\x38\xb3\x6d\xf7\xa4\xfd\x1d\xf3\xff\xfe\xe2\xec\x2a\x25\xbe\x61\x5f\x76\x62\x27\xf0\xff\x9c\xef\xb1\xc3\xbf\x61\x5f\xdc\x53\x6b\xaf\x6c\x0b\x3d\xbd\x77\x53\xf6\xee\xd1\xb8\xd7\x77\x3d\x9e\x02\x8a\xac\x6f\x22\x3e\xdb\xe9\x7a\xdf\xb8\xd9\x90\xe3\x17\x10\xdc\x37\x1c\xe9\x5c\xbe\xbe\xa1\x6e\xf5\x0d\xe3\x75\x0d\x7d\xaf\x67\x02\x36\x20\x9e\xc9\xdc\xbf\xc7\x31\xb0\x43\xee\x77\x5d\x24\x25\xe6\x1f\xda\x37\x6e\x8a\xe9\xf8\x85\x0b\xee\x1b\x96\xe1\x01\x89\x73\xbe\xbe\x61\x6e\xda\x0d\xf9\xc1\x76\x13\xba\x0f\xa3\x36\xaf\x5f\x59\x2d\xce\x33\x7d\x87\x2f\xb8\x3b\xb8\x9f\x8e\xed\x2f\xec\x16\x3f\x8e\xed\xe1\x25\xfc\x89\x77\xda\xbd\xc3\xb9\x5a\xd7\x7b\xca\xcb\x81\x1e\xbe\x30\xef\xd4\x53\xe1\xe3\x9b\x4f\xbc\xbb\xee\x1d\xce\x5f\xbb\xda\x53\xfb\x5d\xb0\x87\x2f\xe0\xb2\xa7\x5e\x88\x75\xff\x67\x53\x91\xd9\xd4\x7e\xe7\xeb\xe1\x0b\x77\xd9\x53\x91\xcc\x6c\xfe\x67\x53\xe1\x6d\xea\x6c\x65\xe2\xf0\xc5\x9d\x84\x32\x8f\xed\x26\xb4\xcd\xa5\x65\x23\xf4\xaa\xd5\x38\x60\x8c\x97\x8f\x50\xf9\x1c\x36\xf6\x01\x11\xc6\xd9\x1e\xde\xc3\x17\xfc\x27\xf7\xdc\x0b\xae\xf7\x73\xf4\xdc\xfb\x4f\xb5\xcf\x77\x26\x1f\xbe\x30\xa1\x7b\x2e\xbc\xff\x3b\xed\xb9\x17\x5c\xf1\xe7\xf0\x96\x11\x1f\x4d\x7c\xbd\xe7\xbc\xf5\xce\xc3\x17\xf0\x93\x7b\x2e\x32\x6f\xf9\xb3\x7a\xee\xfd\xbd\xe5\xe9\xd2\xf0\xe1\x33\x77\xb2\x73\x51\x5d\xce\x94\xfd\xf9\x5d\xe1\xce\x6c\x76\xe4\xe2\x9e\x9c\xfc\xf2\xb4\xf7\xee\x36\xca\x17\xcf\x96\x7e\x46\x6a\xde\x12\xf6\xe1\x33\xf5\xbe\x52\x7b\x21\x01\xfc\xa9\xa4\xe6\x2e\xb5\x1f\x3e\xe3\xef\x2a\xb5\x17\x3c\xc0\xa7\x92\x9a\x57\x12\x70\xf8\xcc\xbc\xab\xd4\x5e\x18\xf1\x3e\x97\xd4\xdc\xd2\x85\xc3\x67\xf0\xbe\x16\x1a\x3e\xc2\x7b\x77\xa9\xdd\x29\x83\x08\x78\xfb\x73\xd8\x12\x08\xef\x0d\xd0\x81\xe5\x0f\xf8\xd5\x2d\xcd\xe4\x7e\x06\x4c\x90\x87\x0a\x6a\x77\x0f\xf4\x49\x49\xb5\x6d\x2e\x91\xbb\x01\x9d\x70\x77\x83\x52\x0c\x41\x30\x1c\x83\x53\x14\xc1\xb3\x04\x4f\xb3\x2c\x7b\x45\x43\x02\xa9\xf2\xd6\xc1\xaf\x53\x45\x1c\x88\x00\xc7\xba\x6e\x97\x58\x12\xec\x7f\x50\xa1\x6e\xed\xc8\x22\x5c\xd2\x7c\x34\xf1\xdc\xad\x12\xb0\x5b\x64\x11\x57\xc9\x3a\x24\x76\x08\xda\x5b\xf5\xde\x1f\x04\x70\x42\x96\x2b\x2c\xda\x09\xbf\x40\x20\x59\x0f\xa9\xc5\xfd\xf7\x18\xbf\xa0\x28\xc1\xaf\xa7\x0b\xac\x6f\x06\xd7\xeb\xfa\xee\x02\x02\x3e\x40\xd7\xea\xb3\xee\x02\x22\x7d\x45\x13\xa1\x01\x51\x3e\x40\xa1\x59\xf3\xaf\x90\x87\x06\xc4\xf8\x00\x85\x66\xed\x62\x95\x34\x2c\x20\xce\xbf\xa4\x17\x16\xd0\xc5\xfa\x53\x58\x40\xe7\x15\xcf\xf8\xf5\x5a\xca\xfb\x90\x2e\x16\x3f\x42\x43\x02\xbe\xe4\xfc\xb5\x8a\xca\xfb\x90\x48\x7f\x9a\x3f\x34\x24\xca\x97\x86\x0e\xad\x95\xe7\xb5\xcf\xe0\x15\x89\x33\xbe\x84\x6b\x78\x39\xb1\x3e\x48\xa1\x4d\xe5\xbc\x02\x9a\x7a\x45\xe2\xbc\x2f\xd5\x15\xde\x57\xe2\xbe\xd4\x4b\x68\xee\xce\xeb\xa0\x5f\x31\xe0\xb3\x4a\x68\xee\x7a\x45\xeb\x7d\x40\xe4\x39\xa0\xd0\xda\x74\x56\x0d\x4d\xbd\x42\x91\x6f\x02\x19\x5a\x2b\xcf\x2a\xa2\xf1\x57\x28\x62\x7d\x93\xb3\xd0\x80\xb8\xf3\xf9\x4a\x78\x8a\xf8\x73\x40\xe1\x87\x6f\xfc\x7c\x2e\x10\xda\x48\xce\x6a\xa3\x81\xcb\xda\x73\x6f\xf9\x7d\xcf\xea\xe8\x7b\x6f\xec\x7d\xa6\x3e\xfa\xf4\xad\x82\x51\x47\x7d\x47\x79\x7e\x65\x28\x04\x19\x45\xe6\x71\x1e\x97\x39\x85\x00\x00\x10\xac\x4c\x41\x19\x97\x49\xc8\x03\x96\x52\x19\x1a\xa7\x48\x99\x07\x10\x57\x24\x46\x41\x1c\x45\xb3\x00\x71\x0a\xc5\xcb\x0a\x4e\x03\xc6\x7d\x13\x17\xf1\x4a\x9a\xfa\x64\xdb\x32\xb5\xdf\xcd\x79\xfd\x30\x25\x9e\xe6\x6f\x1c\xb5\xe4\xde\x3d\x8b\x39\xdd\x6d\xa0\x05\x66\x8c\x34\x72\x3c\x35\x72\x5c\x33\xa3\xa7\xe2\x68\x28\x93\x6c\xb5\x6b\x67\x0b\x85\xb7\x4e\x9b\x5b\xb7\xb5\x7e\x02\x26\x97\x74\x91\x76\xce\x40\x72\x0f\x5d\x71\xb6\xed\x27\x7d\xbb\x14\x13\xc7\x8f\xce\x66\xe2\x44\xbb\x5d\xf6\xf6\xd7\x27\x89\x65\x42\xc9\x1a\xcd\xe5\xb0\xb4\xaa\xd9\x29\x36\x31\xca\x15\xc9\x32\xe2\x95\x76\x55\xcd\xe4\x62\x79\x8d\xce\xaf\x5a\x95\x58\x5f\xb0\x59\xe7\x58\x00\x21\xcd\x23\xef\xd1\x94\x3d\x5c\xad\x53\xcb\x4a\x47\xa8\xf1\x6c\x9d\xa8\x37\xed\x96\xb2\x2e\xa7\xb2\xf3\x54\x3c\xd9\x42\xf3\x37\xa5\x56\xed\xea\xc6\x4c\xd6\x8a\x6d\xa7\x7d\xab\xdd\x6e\x79\xbb\xa8\x8d\xea\xba\x17\x4f\x2b\x71\x39\xb7\x2d\xb7\x16\x71\xb4\xc8\x56\xde\xe6\x0b\xb6\xa7\x18\x6b\x59\x6d\xbc\x4d\xb2\x6a\x3f\xdd\xae\x27\x0b\x40\xf4\x76\x84\xe6\xb5\xce\xd0\xbf\xf7\x12\xb2\x93\xd5\x64\xed\xb0\xb7\x4d\x0e\xdf\x66\x28\xbe\x06\x85\xca\x62\x89\x38\x55\x46\x46\x7b\xcd\x75\x61\x7a\x2b\xb6\xb6\x02\x51\x93\x87\xd3\x62\xac\x21\xd9\xcd\x3a\xaf\x6d\x7b\xd2\x68\x28\x19\x90\x67\x53\x68\x9e\x4e\x71\x6f\xcd\xb6\x8c\x2f\x5a\x6b\xa8\x98\x15\x5d\xda\x70\xbc\xd2\x9c\x66\x73\x99\x62\x42\xf8\xfb\xef\xaf\xa7\x5b\x72\x33\x27\x5b\x59\x8f\x1f\xcb\xc7\x1f\x5d\xb9\x48\xd3\xe1\x94\x68\x03\x65\x48\xb7\x89\xe9\x82\x40\x7a\x49\xce\x10\xf6\x66\xdc\xe8\x15\xfa\xfc\x5a\x1c\x1a\x8d\x04\x44\x1d\xae\xa5\xa5\x8d\xe3\xa3\x8e\x6c\xd3\xe9\x76\xdb\x3d\x76\x41\x28\xa4\xb8\x4c\x75\xd3\x55\xc9\x64\x69\xdc\x2e\xac\xc8\xc5\xe8\xcd\x62\xe0\x12\x64\x61\x29\x9b\xc5\x2d\x3a\x41\x82\x7a\xbb\x55\xd3\xec\x91\x77\x10\x02\x8a\xcf\xdd\x47\x7f\xb9\xbe\x4d\xb0\xb1\x89\xf7\xe8\x51\xde\xb5\x83\x2e\x3b\x47\x07\x25\x4e\x3a\xdf\x5c\x94\x99\x22\xaa\xc0\xe1\x78\x53\x82\xad\x2a\xcf\x24\xde\x54\x8b\x47\xb8\x6c\x98\xe5\x7e\xf7\x2d\xd1\xc9\x4f\xd2\x46\x61\xaf\x1b\x82\x50\xa1\xcd\x9c\x7c\xb4\x8d\x84\xaf\xff\xce\xfa\x2e\xe0\x4a\x44\x8c\x3f\x19\x06\x7f\xd2\x3d\x27\xe3\xd8\xd0\x79\x3e\xb9\x34\x48\xc3\xa6\xe8\x45\xb2\x2a\x6e\xe6\xb5\x38\x69\x64\xcb\xb1\x37\x82\xad\x6f\x35\x8b\xd0\xd5\x52\xba\x37\xad\x75\x86\xe6\xb2\x11\x6b\xba\xdd\xdb\x6e\xe1\x1e\xe2\x62\x87\x4a\xe3\x68\x54\x61\x84\x2d\x9f\xc4\xab\x56\x46\x1c\xae\x64\x82\x25\x88\x16\xcf\xf5\xc6\xd4\xb4\x38\x99\xf2\x35\x96\x9e\x24\xc9\x95\xab\x0f\x4b\xb8\x1d\x26\xe2\x87\x6b\x1d\x44\xb3\xf3\x3d\xf3\x73\xe8\xeb\x4c\x98\xda\x3d\xfa\x1c\xf9\xa5\x9d\x8f\x8e\x3c\x13\x4b\x98\x94\xda\xdd\x3e\x48\xe9\xdd\x0e\x34\xdb\x4c\x6b\xb3\x96\x3a\x64\xa6\x9c\x1f\xce\x67\xa4\xd0\x48\x8e\x72\xe9\x39\x2d\x6d\x1a\xb9\x13\xe7\xe3\xe8\xe3\x0b\xfa\xfe\x8a\x7d\x56\x55\xdc\xb5\x19\x57\x1f\x02\x0f\x86\x38\xd1\x57\xd7\x21\xfc\x14\x7f\xd4\x6e\x37\xeb\x1e\x28\x5b\x1a\x76\xeb\x8c\xc8\x1a\xa9\x22\x5e\xac\xc5\xd6\xbd\x46\x92\x7f\xeb\xae\xba\xed\x26\xb9\xd1\xaa\x5a\x6f\xd9\x90\x88\xd4\x6a\x5a\x2b\x22\xf7\xe8\xb2\xa3\x3f\x70\xe8\x29\x07\x31\xe9\xd2\xd7\x3a\xf0\x2b\x64\x68\x23\x6f\xb7\x95\x59\xaf\xd2\x56\xfa\x0b\xbb\x3b\x6f\x66\x13\xb6\x24\xf7\xf0\x69\x72\xaa\xca\x89\x5c\x41\x1c\x76\x66\xfa\x2a\x9d\x1b\xc1\x57\xe9\xab\xd0\x66\x41\xc8\x1e\x55\xed\xa8\xef\x6e\xb7\x1e\x9d\x68\xe0\x75\xd2\x3f\xa1\xc6\x8b\x17\xf4\x27\x91\x98\x14\x2c\x41\x3d\x50\xce\x09\x3e\x7f\x58\xa7\x60\xe9\x06\xe9\x27\xf6\xe3\x1e\xd7\xf0\xa4\xfd\xbc\xa0\x4f\xd7\xfd\x4f\xc2\x4f\x65\x56\x26\xf4\x0b\xd2\xdd\xa3\x1b\xc3\xeb\xcb\x0b\xe3\x5b\x89\xb7\xf4\xe1\x0d\x7d\x39\xb9\x3a\x29\xd9\x1f\xba\x79\xe3\x9f\x70\x6c\x5f\x01\xc9\xb8\x50\xa1\xe8\x5e\x22\x45\xda\xd9\x76\xba\x42\xd4\x49\x01\x2f\xa1\x49\x95\xcb\xd7\x99\x59\x99\x10\x78\xd4\xd1\x94\x6d\xce\x76\xed\xa3\xde\x6e\x37\x3c\x7d\x19\xc6\x13\x63\xae\x4d\xf2\xeb\x71\x8e\x68\x98\x3c\x63\xc8\x6c\x65\x6a\xda\x23\x30\x4e\x6c\xf8\x62\xa5\xa6\xf0\x93\x76\x5b\xcc\x99\xbd\x86\xab\x0f\xec\xd4\x32\x82\xf5\xe5\x78\x5d\xe8\xf3\xc7\xd1\x97\x48\x75\xa6\xcc\x2d\xfa\x8e\xf1\xc4\x71\xfc\x4c\x1d\x6f\x3f\x3b\x3e\xed\xe4\x31\x95\x8f\xf0\x82\xf5\xef\x72\x6c\xdf\x5f\x27\xe3\x63\x68\xfc\x13\x2a\x1c\x7e\x37\x96\xfd\xf7\x7b\x05\xca\xce\x9a\xd3\xcc\x98\xa1\xc3\x19\x3b\xee\xdf\xfd\x2a\x0c\x7e\x7f\xf6\x7c\x32\xc3\xe3\x59\xc4\x90\x0c\x80\x1c\x21\xc9\x8c\x04\xa1\xc2\x40\x00\x54\x24\x21\x04\x01\x22\x19\xa4\x92\x80\xe4\x24\x99\x65\x39\x5a\x21\x81\xa2\x42\x9c\x94\x28\x46\x56\x38\x99\x43\x80\xa5\xa4\xaf\xfb\x85\x8c\x48\x66\x78\xf4\x9d\x19\x1e\x4b\x00\x9a\xb9\x7e\xd0\xd5\xee\xee\x71\x86\xe7\xe5\xf0\x5f\x9d\xe1\xa5\x7c\xdd\x1b\xe5\x0c\x2f\x9b\x5f\xbb\x4a\xf6\xa1\x33\xbc\xa6\x68\x9f\x58\xc9\xc9\x95\x39\xf0\x5f\xcb\x32\x0d\x76\x13\xaf\x15\x93\xf3\xa1\x1d\x07\xa3\x7e\xb9\x3f\xea\x8a\xf3\xf4\x1c\x6e\xe5\x16\xd3\x19\xa3\x06\xf9\x56\x2c\x11\x99\x31\x52\xcb\x19\x56\xb2\x53\x94\x54\x4c\x2e\x7b\xdb\x4e\x7e\xb3\x92\xa5\xb2\xca\x32\x5c\xbf\xfa\x96\xef\x56\x2b\x8a\xd8\x64\x7b\xc9\xf5\x88\x9e\x0b\xc3\xd6\x93\xb3\xbc\x17\xa2\xaa\x13\xd0\x09\x9e\x9a\xbb\x9f\x5e\x88\x7a\x05\x79\x96\xf2\xe4\x1d\x8a\x9e\x57\x47\x65\x41\x5f\xc7\xcf\xa6\xe5\x2a\xda\x1f\x3a\xfb\x81\xa3\x54\x5e\xae\x7a\xfa\x7a\x3a\x63\x7f\xbf\x19\x64\xa8\x19\x5c\x84\xf8\x53\x61\xf0\xa7\x8e\x23\x60\xfa\xe4\xd6\xb3\x33\x20\x76\x6a\x0d\xdd\x10\xd1\xf9\xde\xf2\xc1\xf3\xae\xda\x25\x7e\x41\x58\x99\x6b\x4f\x06\xa9\xfa\xdb\x2a\xf8\x99\xde\xf1\xfb\xb3\x11\xda\x2e\x42\x74\xa7\x05\x4e\xff\x24\x6a\x07\xfa\x02\x68\x39\x97\x59\x42\x00\xfb\x13\x8b\xd3\x55\xab\xe7\x7f\xe6\x44\x7f\x7e\xb5\x88\xdd\x3f\x23\x7f\x3a\x62\x0f\xef\x9b\x44\x8d\x5c\x06\xcf\xc8\xbd\x3e\x58\x30\xfa\xad\xb3\xe1\x8e\x33\x3c\xd7\xde\x9e\xd5\x87\x93\xfe\x75\xae\x17\x66\x7c\x47\x7d\x75\xfa\xb3\x18\x48\xef\x51\x7f\x7f\x3a\xbd\x89\x26\x9b\xb9\x4b\xef\x5a\x38\x9f\x11\x3d\x19\x8b\xbc\x42\x5f\x19\x36\xe7\xc1\x33\xe8\x40\x79\x7e\x38\x7d\xc5\x19\x29\xdd\xa5\x2f\x12\xfd\x74\x33\x92\x2f\x8c\x7d\xce\x95\x9a\x50\xee\xf0\xe0\xd2\x93\x09\xec\xef\x48\xf4\x33\x1a\x7a\x13\x65\x1c\xdd\xa5\xd7\xaf\x9f\xbf\xce\x8c\xfd\xe5\x0c\xcf\x0b\xf2\x5d\x40\x0d\xdd\x1a\x2f\x4e\xae\xad\xbc\x36\xfc\xbf\x95\x84\xf3\xf1\x42\x60\x7b\x45\x4e\x60\xc7\xfa\x50\xac\x22\x5c\x69\xb5\xd8\x76\x56\x4e\xd5\x36\x4c\x2d\xbe\xd6\xb3\x0b\x99\x6c\xa5\x08\x1a\xe6\xc9\x9c\x46\x38\xed\x5f\x88\x25\xc5\x32\x94\x8c\x67\x33\xcc\x1f\x49\xdf\x5b\x51\xca\xdd\xa2\xef\xef\xa0\x6c\xc3\x4f\x9a\xed\x0b\x11\x65\x1b\xc6\xad\x70\xf8\xbd\x6c\x83\x3a\x2f\xae\xb2\xbc\x60\x15\xa6\x49\x32\x0e\xd3\x13\x62\x9a\x96\x1b\x93\x8e\x6e\xe6\x37\xcd\x39\x2c\xd3\x45\xb5\x64\xbd\xb5\x60\x99\xe6\x70\xc9\x5e\xe2\xd5\x91\x65\x15\xe8\x71\xbe\x37\xcb\xf0\x1b\x8b\x88\xaf\xcc\xcd\x24\x5e\xd2\x65\x8e\xc6\xeb\x55\x7b\x58\x4c\x66\xa7\x93\x64\xa2\x16\x75\xb6\x01\x87\x84\x24\x51\xaa\xcc\x21\x92\x87\x32\xcf\xb3\x24\x2e\xcb\x24\x43\x02\x46\xc6\x01\xc7\x33\x80\xe0\x69\x06\x32\x2a\xaf\x00\xc4\x03\x84\x78\xc0\x2a\x2c\x03\x20\xc3\xe2\x1c\x85\xcb\xb2\x9b\x6d\x20\x23\xca\x36\x30\xf7\xb2\x0d\x80\x60\xc8\xeb\x67\x6e\xef\xef\x9e\xd5\xe7\xbd\x9a\x6d\xf0\x9b\x61\xa4\xd9\x86\x15\xe3\x39\xbb\x0f\xcc\x36\x38\x39\x7c\xff\x75\xb2\x9e\x2c\xe4\x62\x73\x46\x93\x2b\x45\xbd\xd1\xdf\xb6\x1a\xad\xbc\x10\xb3\xf0\xd4\xa8\x18\x2b\x35\x53\x05\x81\x44\x9d\x15\xa2\xf1\x4c\x35\xab\xae\x0d\x09\x22\x24\x33\xdd\xe4\x54\xc6\xd1\xa4\x61\xe3\xc4\x6c\xdd\xa0\xca\xc5\xa9\xba\x55\x9b\x99\xfe\x8c\x53\xea\xf5\x7e\x72\x58\x6b\x91\x42\xcd\xbf\x9e\xdc\x0c\x8a\x2e\xca\xbb\xdf\x78\x97\xaf\x8f\x98\xcd\x86\x9a\x4d\x46\x88\x5f\x7c\x12\xbf\x10\xbd\x97\x0d\xeb\xe5\x84\x88\xbc\xec\x68\x1d\x0e\xbf\xe7\x65\xdf\x4b\x59\xaf\x79\xd9\x7d\x0d\xfb\x93\x6e\x96\x23\x19\x85\x62\x14\x85\x84\x80\xa1\x68\x1a\x97\x81\xa4\x50\x38\xce\xca\x04\x8e\x43\x5c\xe6\x69\x89\x26\x65\xc4\x72\x0c\x83\xb3\x08\x52\x0c\x4f\xc8\x04\xc4\x39\x9a\x06\x2a\x87\x08\x08\xdd\x53\xe3\x89\x57\x76\xba\x3d\x93\xd4\x25\x39\x8e\xbb\xfe\xb6\x8f\xfd\xdd\xb3\xea\x65\xef\x45\x04\xcf\x05\xaa\x8f\x25\x75\x4f\x26\xf9\xef\x3d\x91\x3d\x04\xa2\x09\x61\xb4\xad\x31\x22\xbe\xe2\xc5\xaa\x50\x96\x87\xd5\x1e\xb4\x39\x3c\x5d\x99\xe9\x52\xbf\x91\x6c\x67\xa7\xcb\x45\xbd\x5e\x05\x68\x53\xd3\xe3\x8b\x5e\x43\x98\xa2\x61\x6c\xab\x53\x2a\xce\x8d\x93\xf9\x64\xa1\x47\xf7\xa9\x4a\xa2\xd8\x7e\x13\x09\x2b\x1f\xcb\xd2\x1d\xb2\x43\x76\xd6\xda\xa5\x1b\x0c\x4c\xb8\xfa\x65\x21\x84\x91\xad\x7b\x7d\x4c\x12\xe0\xaa\xab\x3e\x61\xef\xd9\x24\xed\xce\x55\xba\x82\x38\x49\x3c\x5e\xd4\x41\xdd\x71\xd5\xd1\xe1\x4f\x85\xc7\x1f\x75\xe2\xb1\x24\x04\x94\xb9\xdd\x73\xd3\x51\xe3\xbf\xd4\xd1\xc0\xc4\xe7\xf1\x0a\x4c\x7c\x3a\xd7\x2f\x94\xe8\x5a\x1f\x18\xfd\x44\xa5\x17\xfe\x3e\xf8\x9c\xa5\x21\xc9\xd8\xea\x52\x67\xdd\xeb\xce\x52\x75\x18\x7d\x3d\x9d\x3c\x06\x96\x85\xbe\xb3\xbd\x9c\x86\x55\xcf\xe0\xf7\xc2\x9a\xf7\x1a\x7c\xa2\x9d\x3c\x12\x2c\x64\x15\x8a\x91\x15\x92\x73\x0e\xa5\x93\x10\x52\xa1\x44\xc8\x80\xa0\x59\x40\x00\x59\xa2\x00\x8f\x23\x40\x31\x00\x92\x0c\xc5\xa9\x38\x4e\x49\x14\x2f\x93\x90\x25\x59\x06\x32\x5e\x54\x03\x22\x8a\x6a\xee\x4e\x1e\x49\x1e\xe7\xaf\xbf\xc6\x66\x7f\xf7\x6c\x2b\xd5\xab\x51\xcd\x8d\xc9\xa3\xa3\xe5\x1f\x93\xfe\x3c\x89\x6a\xb4\x6e\xf6\x2d\xc7\x98\x63\x12\xc4\xfb\xca\xb2\x92\xd7\x73\x23\x2e\xd6\xc9\x34\xca\x45\x6b\x3e\xcf\x13\xa0\x3a\x8e\xa3\x89\x3d\x03\x78\x3b\x91\x62\x27\xf8\xa6\x33\xe6\x41\x12\xbd\x29\x0d\x73\x28\xd0\x2c\xe8\xd6\xc8\x51\xab\xdb\xe9\xb5\x8c\x2a\x5b\xcd\xac\x26\xdb\x6e\xaa\xf7\x96\x5c\x7f\x74\x54\xf3\x31\xa9\xe3\x0f\x88\x6a\xdc\x8f\x6b\x3f\x66\x9f\xda\x5c\x78\x0a\x5c\x66\x83\x9f\x89\x70\x94\xaf\x09\x91\x8d\xf2\xc7\x51\x29\x6a\xf9\xb9\x82\xfa\xbc\xf2\xbb\x0c\x0f\xc3\x2c\x0f\x3b\xd7\x2f\xb4\xdc\xf2\x6a\x94\xf4\x6a\x72\xeb\xbd\xa3\xa4\x77\xa1\xef\x42\x55\x2a\xcd\xd1\x99\x92\x06\x45\x49\x3f\x29\x4a\x11\x22\xb2\x97\xd3\xe4\x4f\x88\x28\xe9\xbd\x06\xb3\x68\xa3\x24\x86\x61\x18\x9a\x81\x0c\x82\x0a\x02\x38\x07\x64\x9a\xe5\x70\x9a\x25\x00\xc3\x2a\x3c\xa2\x28\x9a\x44\x08\xd1\x2c\x47\xc8\x90\x87\x34\x07\x21\x49\xf0\x48\xc2\x55\xc4\x91\x14\x4d\xab\xca\xe1\x1c\x83\xf0\xe7\x5a\xb8\x67\x20\xdc\x0c\x8e\x58\x86\xe3\xae\xbe\x14\xff\x70\xf7\x74\x4f\xa8\x17\x1b\x15\xb9\x6c\x6d\x55\x9b\x48\x05\x90\x15\xc8\x4e\x7b\x5c\x37\x0b\xd3\x71\x17\xc7\xd5\x0c\x67\x15\x73\xec\x14\x17\xeb\xeb\x7c\x27\x2e\x74\x49\xe1\xfc\xed\xd8\x81\xc5\xb4\xa7\x57\xa8\x19\xc8\x09\xbc\xf6\x6a\x9d\xe6\x77\x1a\x26\x26\x94\x54\x17\x01\xb2\x45\x21\x3e\x09\x1a\x9b\x79\xa2\xd8\xaf\x6f\x08\x33\xff\xd6\x48\x17\xf3\xf8\x26\x95\xc2\x97\x85\xcc\x7c\xba\x90\x54\x3d\xd5\x8c\x75\xbb\xb9\x05\xd3\xd2\x52\x89\xb7\x69\x7a\x63\xc7\x32\x95\x58\x77\x91\x36\x6a\x55\xc5\xec\x36\xd9\x39\x61\x14\xfb\xb9\xec\xa2\x59\xaa\x3e\x10\xf3\x9c\x29\xed\x79\x3c\x71\xc2\xb3\x63\x05\xfe\x59\x7d\x42\x8b\x27\xf0\x22\x9e\xcf\x6c\xed\xd1\xba\x4c\xe8\x3d\x1c\x6e\xe7\x06\xc1\x97\xb3\x9b\x55\x31\xb9\xad\xd0\x76\x42\x94\x93\x2e\x8f\xe4\xd0\x36\x2b\xb3\x5e\x9c\x3a\x49\x95\x05\xbe\x74\xf9\x9e\x3d\xbf\x80\xbf\x6c\x6e\x9b\xb5\x17\xf0\x0b\x3e\xfc\x4f\x2f\xa6\x38\x05\xdb\xce\x75\x91\xa5\xb9\x87\x3f\x70\xf9\x32\x11\x5e\x16\x95\xd9\xc5\x5b\xe0\x9f\x92\xc5\xab\x7d\xb1\xd3\x85\x98\xec\x83\xf7\x94\x2c\xfe\xdd\xad\x11\xa4\x6d\x13\x95\xec\xaa\x66\x4f\x2c\x58\x6b\x80\x96\xac\xc0\xad\x8c\x8f\x1a\x5b\xa5\x54\x5b\xf3\x45\x6d\xb4\xe8\x2f\xa6\x24\x5d\xc3\xe3\x3a\xb1\x2d\x2c\xf5\xdc\x70\x2d\xd3\x23\x59\x52\x47\xe3\x95\xce\x8c\xa0\x98\x22\x21\x81\xc7\x18\x05\x26\x41\x23\xc1\x4c\xde\x52\x91\xfb\x56\x55\x42\x8c\xc2\xaa\x14\x2f\x03\x00\x69\x1c\x97\x54\x12\x01\x1c\x67\x09\x96\xe2\x65\x48\x00\x92\xc5\x09\x00\x15\x59\xa2\x29\x55\x91\x65\x9a\x42\x32\x54\x54\x16\x97\x55\xc8\x21\x8e\xf6\xde\xed\x4b\x46\x34\x03\x65\xef\xcf\x40\x01\x7b\x6b\x06\xea\xde\x3d\x3b\x83\xe3\xd5\x19\xa8\xbf\x40\x31\xc2\x19\xe8\x2b\xc5\xbb\x7c\xdc\x8b\x2a\x1d\x8f\x9d\x0a\xd4\xc4\xf4\x81\x9f\x9a\x60\x65\x14\xca\x90\xd9\x15\xd3\x5d\x97\x99\xa1\x2a\xab\xc5\x6e\x1c\xf4\x72\xeb\x71\x3d\x95\x46\x55\xa1\xf4\x56\x69\xd5\xe4\x58\x62\x9a\x6b\xa3\x76\x83\x25\xd6\x4b\x9a\xb3\x98\x62\x86\xd5\x7a\x2d\x35\x53\x13\x34\xe6\xad\x95\x63\x0c\x53\x9c\xca\x40\xc8\x8e\x85\x6d\xf2\x2d\x59\x7b\xa8\xf8\x39\xc2\x59\xeb\x67\x96\xf7\x8d\xe2\xe1\x88\x67\x6b\x97\xeb\x7b\x81\xb3\xb5\x22\xc3\x79\xc5\x2a\x1f\x32\x5b\x6b\x05\x10\xf2\x4a\x31\xaf\xfc\x1e\xf2\x4b\x7f\x72\xf9\x45\x53\x0c\xfd\xea\xf6\xc6\x9f\x33\x3b\x13\xce\xd7\x7c\x3e\xbc\xf8\xed\xfa\x76\x35\xbf\xad\x27\xc8\x72\x3f\x38\xf2\xf8\x6f\xdf\x1e\x9c\x7a\xb5\x7f\x5e\xa0\xef\x5e\xff\x9c\xd8\x6b\xd0\x75\x62\xaf\x1f\x5d\xcc\x7e\x6f\xfb\x69\x42\xed\x8e\xae\x50\x1d\x7d\xc6\x22\x6c\xc6\x40\x78\x07\x9f\x17\x22\x63\x91\x5c\xf7\x49\x6d\xf4\xb6\x8c\xcf\x55\x81\x5c\x24\xf8\x0d\x67\xab\xf1\xfe\x70\x9c\x2c\x8b\xa5\x36\xc5\x09\x6f\x25\xba\x9e\x78\xa3\x32\xbd\x51\x9b\x6e\x17\x57\xdd\x24\x3b\xdb\xbe\x19\x96\xb4\xcc\x8f\xea\x5c\x5f\x48\x16\xcd\x72\x6d\xbc\xd0\xac\x46\xff\xad\x27\xa0\x52\x2a\x57\x2c\xe5\xa3\x2f\x0a\xe4\x29\x95\xe5\x25\x16\xa8\x50\x51\x10\xdc\x45\xb7\x3c\xe0\x21\x2f\xe1\x04\x2b\x13\x32\x4d\x50\x2c\x4d\xa8\x2a\xc4\x21\xab\xa8\xbc\xaa\x48\x90\x95\x11\x47\xc8\x34\xae\xb2\x34\xe4\x00\xfe\xf5\x1b\x46\xed\x0f\x99\x09\xf9\xa6\x88\x93\xa8\x9a\xbc\x17\x55\xd3\x38\x00\xd7\x53\x17\xfb\xbb\x67\xa7\xc8\x7d\x0d\x63\x09\x27\x51\xf5\x8d\xdc\xc5\xcf\xf1\x2c\xc7\x2b\x7b\xa0\xb7\x56\x5a\x00\x71\x5e\xc0\x8b\xdd\x75\x5f\x6b\x98\xeb\xae\x35\x15\x92\x66\x62\x31\xec\xd6\xe3\xb1\x49\x35\x37\xcf\x10\xad\xd2\xb0\x5f\xa5\x62\xb0\x4d\xad\x9a\x4c\x45\x5c\xaf\x84\x61\x3d\x61\x14\x60\xbd\x3a\xce\x2b\x74\xa5\xcb\x0d\x2b\x89\x4a\x7e\x85\xd7\x0b\x55\x54\xab\x48\xfd\x29\x55\x5b\x3f\x12\x35\x07\x6f\x44\xf6\x47\x96\x27\x8d\x42\xe4\x7a\xf2\x95\x63\x7f\x5c\xb9\xee\x54\x67\x44\x87\xff\x32\x28\x7b\x00\xff\xc5\x6a\xf7\x47\x7b\x76\x97\x94\x47\xca\xce\xc5\x9f\x42\xdf\xdd\x83\x57\x02\xf3\x36\x3f\x29\x87\xe4\x93\x55\x68\xfc\xa7\x9b\xec\x9f\xc1\xbf\xdf\xe4\x6e\xf6\x1a\x13\xb3\x66\xab\x89\x69\xbe\xb0\x4a\xa0\x6d\x4f\x28\x58\x99\x45\x42\xc9\xc6\x99\x1a\xa7\x4d\xa4\x76\x6d\x9b\x98\xc4\xc7\xf4\xbc\xab\xf1\x55\x83\x6a\x26\xb9\x64\x42\xcc\x0c\xe7\x73\x31\x56\xd2\xc9\x09\xad\x6e\x05\x4a\xa4\xa6\xf1\xba\x68\xf0\xb4\x40\xdb\x53\x69\x94\x8a\x7c\x93\x3b\xa9\xe2\x9c\xa4\x42\x02\xc9\x92\xca\x93\x12\x81\x48\x9e\x86\x94\xc4\x13\x10\x70\x00\xd1\x14\x29\xab\x12\xa1\x28\xac\x4c\xa8\x14\x83\x58\x1e\xe0\xbb\x76\x80\xe4\x10\x07\x28\x5e\x92\xdd\x11\x06\xbc\xf2\x86\x9b\xe7\x46\x18\x92\xbd\x35\xc2\xb8\x77\xcf\xce\x04\xf5\xca\xce\x9f\xdb\x68\xf1\x9e\x23\xcc\xab\x73\x8b\x13\xfc\x07\x7a\x6b\xa5\x4e\x7c\xa1\xc5\x2a\x49\xb3\xc8\xcd\x67\xf2\xdb\xd2\xcc\x33\x89\xb1\xac\xd7\xa5\x6e\xb2\xb7\x16\xf0\x44\xbe\x0c\xd7\x05\xa9\x23\xbf\xa9\xc2\xba\xbe\x1c\x19\x2b\x00\xa6\x2d\x89\x50\x21\x48\x64\x8a\xba\x96\x55\xb9\xfa\x82\xa9\x6b\x85\x61\xbd\x9a\x28\xae\x88\xac\x59\xc8\xe6\xd6\xd6\xbb\x8c\x30\x21\xe6\x82\x91\x8e\x30\x2f\xe2\xff\x99\x23\xcc\x0b\x9b\xe4\x85\x8f\x18\x61\xde\xe3\x68\x1d\xef\xba\x3b\xc2\x84\xb7\xa5\x68\x46\x98\x10\xf8\x5f\x1c\x61\x36\x52\x6c\x51\xa4\xa8\x82\xb5\xda\x4e\x95\xb7\x0a\x63\xcd\x8c\x4c\x79\xdb\x4e\xdb\x72\x7e\x2c\xa4\x6a\xe2\x84\x30\x85\xb9\xdd\x7f\x2b\x73\xa9\x44\x86\xc9\x68\x71\x09\xf6\xeb\xab\x36\x6f\xf6\xc4\xde\xb2\x93\x53\xe2\x9b\x8c\x39\xcf\xe4\x16\x09\x91\x13\x97\xf1\x16\xb2\x0c\x79\x1c\xfd\xaa\x2b\xcb\xe3\x40\xc2\x29\x45\xc5\x55\x89\x24\x55\x08\x69\x5e\xe2\x48\x95\x27\x38\x49\x25\x20\xcb\x93\x90\x60\x80\xa4\x00\x45\x26\x15\x8a\x92\x78\x9e\xe4\x11\x4b\xb3\xb2\xca\xca\x12\xcb\xb0\x84\x3b\xc2\x90\x11\xcd\x61\xee\x1d\x94\xc9\xd2\x38\xc5\x5d\x5f\x19\xd8\xdf\x3d\x3b\xe1\xf9\xd5\x39\xcc\x8d\x83\x32\x5d\x05\x7b\x72\x73\xcb\xfb\xcc\x61\x92\xc9\xcd\x08\x25\xa8\x64\xdf\xec\x69\x69\xb5\x24\x74\x18\x79\x32\x8e\x8f\x9b\xf9\xb7\xac\x36\x62\x93\x76\x9d\x6b\xa6\xf0\x8c\xbc\x6a\x4b\x4c\x9c\x49\x74\x34\xbe\x0d\x66\x89\xda\x2a\x65\xc7\xb7\x64\x79\x96\xb0\xb7\x96\x94\x16\x2b\x25\x22\xd3\x66\x98\x4d\xda\x5e\x72\xed\x74\x46\xa8\x7d\xc6\x39\x4c\x28\x0f\x1f\x21\xfe\x2b\xd5\xb9\x61\x46\x98\x0f\x3c\xfc\xd0\x25\xe5\xc9\x11\xe6\x33\x1d\x1e\x19\x38\xc2\xfc\xa4\x39\x84\x10\xd1\x1c\xe6\xb4\xfa\xfa\x19\xfc\xde\x08\x93\x2b\x66\xd2\x54\x76\x98\x9f\xda\x5a\xae\xcd\xad\x13\xd2\x7c\xdb\xa8\xc6\xca\xa5\x59\x09\x15\xb2\x56\x81\xc8\x6e\x4a\xd5\x5a\x7f\xcb\xb7\x57\x66\xdc\x48\xc3\x22\xd1\x85\x72\x3a\xc9\x55\xc8\x78\x51\x06\x72\x86\x2c\x6c\xac\x56\x8d\x7a\x6b\xf5\xbb\xa6\x29\x76\x00\xbb\x69\xb5\x7a\xd1\x1f\xd4\x25\x11\x2a\x07\x38\x92\xa3\x64\x9a\x41\x94\x84\x03\x4a\xa5\x00\x4b\xab\x80\x62\x68\x0e\x87\x12\x94\x54\x95\x80\x88\x94\x78\x09\x32\x84\x84\x93\x1c\xcf\x92\x34\x8b\x68\x16\x21\x49\x76\xb2\x64\x60\x5f\xfd\x1c\xba\xae\x07\xdc\xad\xeb\x61\x71\xea\x46\x5d\x8f\x77\xf7\xf4\x64\xf5\x57\xeb\x7a\x6e\x8c\x2b\xee\xf5\xe2\x86\xd5\xb3\xba\x1e\x75\x96\x6e\xbc\xf5\xd1\x88\x60\xdf\x6c\x0e\x18\x25\x65\x81\xa8\x58\x7c\x33\xb3\xe2\x93\x6c\x42\xc9\x74\x55\x3e\x91\x4b\xd4\x7b\x6a\xbb\x4f\xa6\x6a\x4d\x12\xae\xd7\xfd\x19\x5d\x5c\x0c\x73\x19\x3e\xbf\xd0\x57\xa5\x69\x9d\x68\x16\xe0\x46\x36\xf2\xb5\xd4\x72\x91\x91\x93\x0d\xb9\xf4\xb9\xea\x7a\x5e\xad\xab\x79\xb5\x96\xa4\xb4\x2e\x4e\x8d\x28\xeb\x7a\x3e\x30\x62\xbe\x17\xbd\x7f\x64\x5d\x8d\x10\x51\x5d\x0f\x47\x1d\x9f\xbf\x32\x33\xbd\x59\xd7\xd3\xa5\x37\x2d\x0b\x74\x0d\x05\x71\xac\x5a\x5e\xa4\xb2\x70\xb6\xac\xae\xb8\x3e\x5b\xa5\x13\xeb\x6e\x5d\x27\xe3\xb5\x86\xd0\xea\x64\x89\x8e\xb2\xc6\x45\x1e\x58\xa5\x4c\x3f\xd6\x60\x8c\x64\x62\xd5\x80\x73\xe9\x2d\x3f\x51\x5a\xdb\xa9\xd5\x2d\x24\x5b\x02\xbb\x18\xcd\x84\xc9\x2c\xfa\xfc\x90\xcc\x93\x2a\x87\x33\x0c\xab\x92\xac\xa2\xb2\x38\x04\x3c\x92\x71\x05\xf1\x8c\xaa\x92\x24\x47\x30\x14\x05\x65\x0e\x70\x90\x92\x11\x24\x64\x89\x91\x91\x44\x48\x32\x92\x19\x55\x55\x71\x9a\x73\xa3\x77\x2a\xa2\xfc\xd0\x03\xd1\x3b\xcd\x13\x37\xa2\x77\xf7\xee\xd9\xbb\x50\x5e\xcd\x0f\xdd\x8d\xde\x3f\xfa\xa8\xd4\x13\xfc\xc7\xfc\x50\x86\xd2\xd9\x49\x52\x58\xd0\x70\xb1\x6a\x00\x25\x9e\x6d\xda\x3d\x99\x2d\x0a\x90\x9d\x37\x5a\x9a\x56\xa1\x0a\xdb\x42\x5e\x5a\x4c\xad\xd4\x70\x25\x4f\x32\x49\xa0\x48\x23\xd9\x34\x78\x5b\x5e\x25\xfb\x59\x75\xbd\x68\xb6\x63\xda\x64\xc5\x65\xa7\x5c\x5f\x85\x0c\x39\xe9\x55\x27\xb5\xde\x67\xcc\x0f\xbd\x1c\xbd\xbf\x88\x3f\xc2\xe8\xfd\x03\x0f\x96\x71\x49\x79\x32\x7a\xff\x40\xfa\x5e\x8f\xde\x3f\x30\x3f\x23\x44\x94\x1f\x7a\x31\x7a\x97\xb4\xee\xb2\x96\x4b\x9a\xfa\x62\xc1\x17\xfb\x24\xa7\x54\x88\xd1\x9b\x65\x25\xcc\xa5\x9e\x6f\x14\x72\xec\xd0\xcc\x19\xfa\x72\x01\xd7\x95\x24\xbf\xad\xf5\x8a\x7d\x62\x99\xde\x2e\xc7\x80\xd8\x72\xf9\x89\x12\x4f\xce\xcb\x5d\xa6\xd0\x88\xaf\x91\xb4\xd1\x79\xd3\x44\xf5\x61\xac\x9e\x18\x46\x3d\xc2\x70\x04\x41\xf0\x40\x26\x39\x86\x22\x15\x95\x25\x65\x9c\xa0\x21\x0d\x09\x85\x65\x25\x0e\x07\xca\x6e\x18\x51\x28\x95\xc6\x55\x99\x51\x08\x9c\x23\x18\x08\x59\x5a\xc6\x21\x43\xe0\xbc\xca\xc3\xc3\xab\x18\x23\xa9\x1c\xbd\xbb\x02\xc1\xd0\x38\x71\x7d\x84\xd9\xdf\x3d\x7b\x47\xd6\xab\x95\xa3\x37\x56\x20\xdc\xa3\xc9\x42\xe5\x7b\x48\x5f\x75\x95\x73\x9d\x54\x7a\x56\xf5\x21\x9b\x29\x8e\xf2\x43\x7c\xc3\x8e\xe7\xc2\x9a\x10\xd7\x4c\x16\x74\xd3\xcc\xb6\x9e\x9b\xaa\xf9\xdc\x3a\xad\x6e\x70\xbe\xbc\xd4\x68\xc9\xae\xe4\x85\x34\x5a\xa7\x85\xb2\x5a\x81\x42\x82\x4b\xd7\xfa\x3a\x3d\x27\x05\x7a\x48\x4e\x98\x54\x36\xa5\x0d\xd5\x56\xb9\x95\x22\x98\xa1\xfc\xc8\x88\x71\xba\x97\xe9\x91\x98\x3e\xea\x1d\xca\x0f\x5a\x99\xb0\x37\xf0\xa8\xf1\x3f\x71\xf0\x8b\x20\x7c\xde\x35\xeb\xbb\x31\x7f\x08\x59\xbd\x9c\xb1\x7f\xb1\xaf\x2e\x0e\x5e\x7f\x10\xbf\xe7\x91\x63\x9d\x94\xd5\x5b\x8a\xd3\x54\x33\xbb\xac\x4c\x52\xa9\x56\x33\x65\xa8\x7d\xb9\x6b\xe6\x45\xad\xcf\x4d\xc6\x42\x3b\x9e\x6d\xe2\x80\x29\xea\x4b\x9c\x9a\x08\x6d\x56\x68\x09\x04\x47\x1b\x42\x76\xdd\x4e\x4c\xbb\xd3\x99\x9c\x9a\xa6\x50\xd3\x28\xc9\x95\x42\x82\xaf\x11\xb5\x6a\x77\x91\x88\x3c\x63\x2f\x29\x14\xc7\x28\x92\xa2\xe0\x40\xa1\x18\x9c\x23\x58\x86\x25\x64\x0a\xd2\x90\x45\xbc\xc2\x20\x8e\xa1\x65\x08\x78\x59\xa2\x08\xc4\x00\x85\x85\xd0\x99\x18\xa8\x08\xd1\x12\xc9\x28\xc8\xf5\xc8\x51\x1d\x7c\xfe\x80\x47\x26\x18\xf2\x86\x47\x76\xef\x9e\xbd\x6b\xf0\xd5\xa3\xc8\x3e\xd0\x23\x9f\x1c\x3c\x9e\xe0\x27\xd3\x42\x07\x2c\xc8\x15\x5b\x53\xb7\x5c\xb5\x84\x26\xa2\x44\x34\x9b\x39\x5a\xdb\x2c\x26\x39\x3c\x61\x0c\xbb\x66\xc5\x66\x87\x15\x82\x01\x35\x69\x32\x02\x4a\xa3\xd9\x52\x51\xca\x58\xc9\x78\x55\x80\xea\x28\xd5\xdd\xd8\xa3\xb6\xa0\x5b\xc5\xe5\x58\x4f\x4c\xb7\xe3\x84\xf0\x50\x0c\xff\x82\x47\x8e\xe4\xf5\x06\x0f\x5a\x99\x10\x60\xe5\x1f\xfd\x7a\x05\x41\xf8\xbc\x19\xf8\xbb\x6b\xa8\x21\x64\x15\xa5\x47\xfe\x48\x5d\xf1\x3c\x72\x16\x34\x7a\x73\x09\x9a\x28\x6e\x27\xe2\xc5\x35\xb7\x61\x6a\xf5\x55\xbb\x5c\x1a\x4f\x8b\x99\x45\x6d\x5c\xcb\x68\x09\x64\x31\xe4\x52\x60\xbb\x66\x3f\xb1\x6c\x64\xfb\x44\xbe\x5c\xe7\xa9\x8a\xc6\xbf\xd5\xb8\xc4\x3c\x26\x96\xd5\x0c\x48\xb7\x92\x9d\xf5\x92\xa9\xb4\x32\x52\xa1\x24\x46\x1f\x23\x4b\xb4\x0c\x15\x19\xe1\xb4\x2a\xe3\x50\xa1\x15\x46\x45\x38\xce\x4b\x9c\x84\x2b\x48\x92\x71\x85\x54\x54\x85\x04\x08\x52\x40\xe2\x90\x04\x49\xc4\x23\xc8\x70\x32\x60\x29\x06\x51\x04\xae\xba\x1e\xd9\x59\x43\x0d\xf9\xa2\xfc\x27\x3d\x32\xe0\xae\xbf\x8a\x62\x7f\xf7\xec\x9d\xad\xae\x56\x3e\x79\xf8\xe2\x33\x1e\x39\x54\x56\xa5\x1b\xe4\x91\xc5\x03\xfe\x9a\x50\xae\x35\xde\x56\x73\x31\x91\x14\xba\x2b\x8b\xa8\x0e\xa7\xd9\x78\x2b\x2d\xa9\x42\xcf\x26\x2b\xc2\x70\xd8\xab\xb6\x9b\x0a\x3e\x1f\xb7\xe5\x3c\x6c\x93\x7a\x4a\x8c\x8f\x2b\xfd\xd2\xac\x98\xee\x97\x26\x69\x71\x34\xa4\x14\x7d\xd9\xae\x6d\x50\xaa\x2f\xac\x9b\x85\x56\x15\xce\x14\x6b\x3d\x7c\x67\x8f\xfc\xec\xac\x3d\x6a\x8f\x1c\x09\xfe\x17\x3c\xf2\x67\xca\xaa\xdc\xf3\xc8\x61\x64\x15\xa5\x47\xfe\x48\x5d\xd9\x1f\x24\x49\x24\x8a\x95\xd8\xa4\x26\xe6\x12\x28\xf6\xd6\x8a\x25\x7b\x2a\x5f\x6b\xdb\x5c\x42\x23\x65\x2a\x99\x4c\x0c\xf9\x76\x99\x6c\x4c\xcb\xed\xb5\x3e\xef\xa2\x56\xa9\x19\x2b\xd1\x93\xad\x6c\xb5\x27\xdb\x5a\xab\x91\x49\x8d\x40\x87\x6e\xa7\xd2\x54\x79\x92\x4a\x94\xe6\x35\x7e\xa1\x80\xb7\x64\xf4\x75\x93\x00\x51\x12\x24\x54\x40\x70\x12\x03\x21\xa0\x00\x2e\x51\x3c\x4b\xd1\x0c\x24\x24\x9c\xc7\x79\x1c\x91\x1c\xc9\x22\x86\x91\x48\x8a\xa7\x71\x12\x57\x28\xa4\x28\x0c\xae\xe0\x2a\x4e\xb3\xb8\xeb\x91\xa9\x88\xb2\x16\x77\xf3\xe2\x0c\x4d\xf2\xd7\xcf\x91\xdc\xdf\x3d\x7b\xf7\xf5\xab\x59\x8b\x1b\x79\xf1\xa8\x3d\xf2\x49\xd6\xa2\x94\x9f\xae\x62\xfa\x28\x4d\xd7\xfa\xfa\x50\xc9\x2d\x12\xdd\x54\x43\x19\x89\xf6\xd0\x84\x4d\xb3\xde\x58\xb7\x4d\x5a\x89\x27\xcc\x72\x12\x70\x48\xcd\x96\x8c\x4d\xaf\x0c\x63\x60\xc9\xdb\x0d\x51\xd9\xb4\x62\xa3\x4c\x97\xc9\xd7\x3b\xec\x5a\x48\x93\x52\x65\x2e\x70\xe6\x66\xb3\x11\xc4\x5f\x21\x6b\xf1\xec\x71\xb1\x3f\xf1\x5c\x37\x41\xf8\xbc\x75\x90\x81\x1e\xf9\x27\x65\x0d\x84\xf7\xea\xab\x07\xf1\x7b\x1e\x79\x3d\x85\x71\xa6\x23\x76\xf5\xc4\xb4\x93\xc0\x35\x23\x2d\x97\xf3\x40\x6c\x80\xa4\x3d\xaf\xd8\xe9\x62\xa2\xb3\xd2\x49\x2e\x63\xe1\x45\x69\x43\x73\xf2\x76\x9c\x1e\x12\x26\x0b\x59\x40\xe4\xea\x64\xba\xc9\x88\x7d\xd5\xd0\xd3\xd2\x4a\x10\xba\x8a\xc5\x4c\x52\xdb\x55\x36\x2b\x46\x7f\x06\x1e\x90\x00\xe2\x80\x22\x41\x49\xc2\x01\x25\x01\x16\xe2\x32\x49\x50\xb8\x0c\x59\x42\xe1\xa0\xcc\x4b\x32\x4b\x70\x24\xa1\xf2\x2a\x0d\x49\x49\x61\x78\x24\x43\x52\xe1\x38\x55\xc2\x91\x4c\xcb\x6e\x0d\x07\xf9\x5a\x15\xc8\xdd\xd0\x98\x65\x09\xe6\x7a\x79\xe1\xfe\xee\xe9\xdb\xec\x5f\xad\x02\xb9\x71\x9e\xaf\x7b\x85\xd8\x0b\x7d\xa5\x0a\x24\x95\x5f\xea\x84\x5d\xcc\x14\xd3\x54\x7b\xb3\xb6\x71\x25\x95\x6c\x8b\x2a\x63\x4b\xb4\x4e\x49\xdb\x92\x99\x19\x26\xe7\x31\xbd\xdd\x2f\x4d\x37\xb2\x4d\x53\x5a\x59\x05\xd3\x8d\x3d\xde\x30\x25\x85\xee\xe7\x29\x91\x4a\xe9\xb2\xa5\x52\x8c\x28\x8c\x12\x99\x46\xab\x6a\xcd\x38\xb5\x97\xfa\x5c\x55\x20\xaf\x56\x61\xbc\x5a\x79\x50\xc4\x27\x8c\x10\x61\x15\xc8\x47\x66\x61\xdf\xa3\x0a\x24\x6c\x15\x86\x10\x51\x15\x08\x7b\xd2\x01\x57\x5e\x82\x75\x73\x97\x90\x34\x57\xa4\xc6\x46\xdb\xa0\xb4\x2c\x17\x95\x6c\x6d\xad\xd7\xb3\x31\xb3\x13\xeb\xa3\x0c\x37\x2e\x6c\x0c\x61\xa1\xce\xdb\x9d\x66\xde\xea\x16\x11\xca\x8d\xbb\xfc\xdc\x92\x7a\x1c\x1a\x67\x51\xa7\x81\x12\x15\x81\xee\x16\xb3\xb1\xca\x48\xc8\xd5\xea\x13\x3d\xc5\xe6\xe3\x59\x20\x44\x9e\x11\x46\x04\x2b\x41\x44\xd3\x40\x81\x38\x81\xd3\x50\x21\x81\x8a\x4b\x3c\x84\x8a\xaa\xe0\x2a\x03\x48\xa4\x92\x2c\x92\x28\x8e\x91\x08\x5c\xc2\x29\x4a\x26\x78\x40\x72\x24\x83\x23\x8a\xa6\x15\xd6\xf5\xad\xd4\x6b\xbe\xf5\x6e\x90\xcb\xb2\x80\xbd\xfe\x4e\x8a\xfd\x5d\xc7\xb7\xd2\x38\x7f\x72\x56\x7a\x68\xdf\x7a\xe3\x54\x51\xf7\x7a\xb2\xf6\xe3\x96\x6f\xed\xf5\xd4\x6d\xc5\x9c\x56\x47\xea\x44\x63\x74\xb3\x1a\x33\x92\xea\x72\x96\x9f\xd6\x97\x60\xaa\x6e\x74\x0a\x37\xe8\x45\xa7\xce\x6e\x89\xde\xb4\xca\xcd\x8d\x4c\x8c\xe9\x2e\x86\x14\x31\x2e\x24\x3b\xe5\x75\xdb\xa8\xb2\x04\x9b\x6c\x8b\x55\xc4\xe2\x39\xdc\x46\x9d\x55\x13\x8d\x27\xf9\xcf\xe5\x5b\x5f\xf5\x6d\xaf\xda\x73\x81\x8a\x95\x7b\x11\xfa\xd6\x8f\x9c\xbd\xbf\x87\x6f\x0d\xeb\xdb\x84\x88\x7c\x2b\xbd\xbe\x8b\xe8\x96\x6f\x05\x99\x2c\x37\x5e\xd0\x63\xaa\x4b\xe7\x96\x73\xf8\x16\x5f\x08\x33\x76\xbe\xed\x4f\x24\x7b\x3e\xe3\xfa\xa8\x5c\xa8\x40\x7d\x82\x38\xbb\x93\x1f\xc7\x0b\x30\xb1\x5a\xea\x8c\x51\x29\xf7\xb6\x43\x7d\x2c\xa7\x61\x2a\xc6\xa3\xb5\x5e\x4f\x91\x4b\x3e\x59\x2e\x76\x75\x13\x27\x0d\x3a\x19\x79\xdc\x2a\xab\x0a\xc7\x11\x0c\x52\x68\x8e\x95\x69\xa4\x70\x9c\x82\x20\x8e\x24\x1c\xe7\x08\x4e\x86\x2a\xc9\xc9\x38\x4b\xe3\x88\x65\x29\x1c\xe1\xb4\x82\x48\x19\xb0\x04\xcb\x20\x1e\x22\xc4\x21\xe4\xfa\x56\xfa\x35\xdf\x7a\xf7\x45\x14\xce\x66\xca\x1b\xbe\xd5\xbd\xeb\xfa\x56\x1a\x3f\xc9\x1f\x84\xf6\xad\x37\xce\xcb\x72\xaf\x10\xaf\x7c\xb9\xe6\x5b\xcb\xd3\xda\x48\xa9\xa1\x6d\x49\xee\xa4\x3b\x55\x4e\x69\xd7\x27\x29\x3b\xdd\xa0\xec\x6c\x2e\xb9\x2d\x28\xb0\x3a\xa9\x33\xb1\x78\x91\x8d\xd9\xa5\xb7\x42\xc7\x68\x8d\xa5\x94\xd0\xb5\xe4\x7a\x2f\x17\x1b\x33\x69\x25\xde\x4e\xb7\x60\xea\x4d\xe9\x59\x9d\xa4\x60\x65\x49\xbc\xb3\x1c\xe7\x8a\x9f\xcb\xb7\xbe\xea\xdb\x5e\xb5\xe7\x3c\xdf\x1d\xae\xa3\xac\x5e\xfe\xc0\xb5\xaa\xf7\xf0\xad\x61\x7d\x9b\x10\x91\x6f\x0d\x7b\x42\xa5\xe7\x5b\xdf\xfa\x93\x5c\xb7\x95\xb5\xc6\xd9\xf4\xa8\x3d\x8e\x67\xdb\xad\xbe\xc0\xd6\x5b\xcb\x62\x7d\x2b\x58\xda\xac\x33\xa6\x45\xb4\x5a\x6d\x63\x71\xb3\x59\xda\xea\x8b\x74\x0e\xac\xd7\x69\x36\x2b\x76\x92\x55\x23\x36\xea\xaa\x44\xbd\x9d\x19\x72\x64\xa7\x98\x1e\x0e\x8b\x09\x9e\x4f\x9b\xc6\xf6\xd1\xbd\x87\xbf\xfd\xf6\xfd\xfb\x6f\xdf\xbf\x63\x29\x68\x43\x4c\x35\x4c\xac\x0c\xa7\xe8\x07\x36\x41\xdb\xc1\x0a\xea\x4b\x34\xd8\xb9\x5b\xf4\x17\xd6\xdc\xce\xd1\x0f\xac\x29\x24\x8a\x22\x96\x12\x9a\xc2\x5f\x58\x43\x1e\xa1\x29\xfc\x81\xcd\x97\x92\xae\xc9\x7f\x61\x95\xf5\x0c\x99\x3f\xb0\x1d\xb4\xdf\xce\x5c\xb6\x0f\xd6\x49\x24\xbc\x99\x0f\xb4\xd9\x10\x59\xf6\x40\x87\xbb\x3f\x48\x19\x22\x73\x47\x34\xfe\xf5\x3a\x69\x86\xaa\x22\xd3\x7a\x9a\xa2\x3d\x34\x17\x08\x94\x65\x63\x39\xb3\xad\x81\xa5\x0d\x67\xc8\xb4\x2e\x7e\x18\xcc\x27\x68\xbb\x47\x92\xac\x94\x1b\xcd\xba\x90\x2b\x37\xef\x20\x11\x8a\x4d\xb1\xee\xd1\x54\x29\x17\x7b\x17\x60\x7f\xc3\x30\x0c\x13\x52\xa9\x13\x90\xc1\xa8\xb1\x6a\x3d\x57\x12\xea\x3d\xac\x20\xf6\xb0\xdf\xdd\x3b\xdf\xf6\x4d\x4f\x84\xe3\xb1\x63\x59\xc8\x1e\x58\x36\xb4\xad\xd3\xcf\x51\x31\x71\x84\x18\x48\xbf\x0f\xe1\x39\xe9\x9a\x72\x41\xed\xd0\x30\xe7\x83\xa9\x36\x34\xa1\x3b\x7c\xfb\xbe\x47\x44\xb5\x0f\x6a\x10\xe5\x41\x88\xef\x52\xbf\x8f\x40\x1c\xb6\x2d\xdf\x57\xf7\x3f\x03\xd9\x50\x90\xf7\xd1\xde\xce\xf7\x1f\x35\xcb\x5a\x22\x73\x10\x09\x77\xe7\x68\x83\x98\x0b\x45\x18\xd6\x2a\xe7\x6a\x2d\x11\xfb\xfd\xd8\xfc\x1b\x76\x6c\xbf\xff\xec\x3e\xf0\xa4\x68\xa2\xe9\xd6\xa7\x19\x7f\xaa\x53\x8d\x39\x72\x95\x61\x30\x87\xa6\xad\xc9\xda\x1c\xce\x4e\x38\x09\xbe\x1d\x31\x67\xc1\x48\x6e\x71\x7a\x83\xac\x87\x39\x3f\x09\xa8\x83\x79\xbf\xd6\x20\x62\xee\xaf\xa1\xb9\xc5\xff\x4d\xd2\xee\x4a\xc0\x3f\x3e\xf9\xbe\x47\xc4\x9f\x0f\x6a\x10\x3b\x41\x88\xcf\xa9\x9f\xa0\xed\x05\xf9\xee\x78\xe8\xfd\x27\x22\x62\x5d\x60\x41\x34\x9e\xa0\x39\x27\xcd\xb9\x11\x20\x5d\xd7\x61\x48\x5b\xc7\x97\xec\x29\xcb\x95\x53\x62\xf7\x0e\x51\xc9\xba\x28\x34\x45\xb7\xe9\x39\x14\xac\x52\xf6\xbb\x9a\x56\x23\x57\xce\x60\x92\x6d\x22\x74\xea\xbb\xae\x53\xe3\x7a\xb0\xd7\xe9\x71\xe1\x3c\x46\xd1\x15\xaf\x29\x6d\x07\xde\xb8\x1e\x9a\x9c\x23\x88\x53\x4a\xce\xe6\xc8\xe7\xf4\xb8\x8d\x0f\x01\xc5\xc0\x42\x8b\x25\x9a\xc9\x97\x02\x93\xb6\x83\x11\xb4\x46\xaf\x50\xb6\x7b\xfe\x31\xb2\x4e\xed\x78\xf7\x54\x10\x35\x6e\x90\xf8\x0a\x3d\x2e\x84\xc7\x28\x72\xdb\x1e\xc4\xf3\x0d\x83\xf3\xb9\xae\xc9\xae\xb3\x35\x4c\xe5\xca\x20\x38\x40\x3b\xdd\x70\xee\x87\xa0\xd4\x1b\x83\x5d\x82\x7d\xe0\x4e\xc9\x46\xaa\x8a\x64\xbf\xaa\x5d\x8e\x09\x9a\xf2\x0d\xfb\xe2\x3c\xfc\xe5\x1a\xb1\x9a\x12\x11\x99\x9a\xf2\x30\x81\x7b\xd5\xdb\x91\x17\x82\x68\x63\x3e\x98\x47\x45\xb7\x07\xeb\x94\xf4\x2b\x81\x40\x28\x4e\x82\x19\xb0\x37\xd1\x31\xe0\xc1\xba\xa2\xd3\x21\x59\x38\x85\x10\xc4\x84\x31\xdf\x69\xe5\xc8\x08\xc5\x83\x47\xfc\x11\x46\x58\xe1\xdf\x16\xb4\xe5\x59\xbb\xe3\xaa\x5f\x97\xf5\x39\xb8\x53\x92\xdd\xdf\x7d\x34\x06\x53\x74\x2a\xd7\xa8\xc8\xba\x80\xf9\x98\x7b\x0b\x22\xd0\x76\xbb\xc4\x7e\xa5\x5b\x8f\x30\xc2\xab\xe4\x3d\xf5\xb3\x4d\x65\x87\x44\x82\x16\x7a\x79\xfc\x0c\x02\xe6\xa3\x5c\x41\x3e\x3a\x4f\xdb\xde\x25\xd0\x89\x8e\xa2\x21\xcf\x01\xf5\x10\x71\x4e\xcb\x5b\xa4\x39\xb4\x23\x33\x32\xf1\xf9\xe0\xdd\x23\xd2\xd7\xfc\x11\x4a\xa3\x91\xe3\x19\xb4\x47\xa9\xbc\x2b\xcd\x68\x68\x7b\x88\xa6\xdb\xb4\xec\x29\xd6\x0d\x63\xb2\x9c\xbf\x46\xd1\x39\xac\x87\x7b\xd4\x8d\x77\xaf\xd0\x37\x87\x9a\x39\xb0\xb5\x29\x8a\x84\x42\x3f\xb4\xc7\xec\xd6\x23\xf0\x1b\xe6\x27\xf9\x1b\xe6\xb9\x78\x59\x37\x2c\xa4\x0c\xe0\x65\xb6\xcd\x45\x1b\x81\xdf\xf6\xe0\xdc\xa3\xf8\xc9\xe8\x68\x07\x35\x32\xe9\x3e\x21\xd8\xbb\x72\xd3\x66\x0a\xda\x0c\x7c\x21\x87\x35\x30\x66\x03\xa8\x28\x26\xb2\xac\x57\x05\x7a\x17\xc1\xd9\x3c\xcd\xbb\xed\x9b\x19\xb9\x0d\x9f\xa0\xfd\x75\x3d\xb8\x05\xfb\x3e\xc5\x01\x56\x76\x0e\xd0\x8b\xc2\x77\xf0\xec\xed\x3c\xfc\x1c\xfc\x26\xd4\xbb\x61\xff\xae\xd1\x1d\x42\xbd\x18\x6a\x07\xf2\xa0\x44\x11\x51\x1b\x04\xfa\x6e\xf8\xf6\xa8\x26\x9f\x00\x8f\x5a\x19\xce\x40\x87\x89\x37\xaf\x83\x9b\xce\x0d\x73\xe7\xf8\x56\xc8\xb4\x34\x63\x16\xbd\xa0\xfd\x18\xee\x93\xef\x7b\xe0\x71\x66\x3c\xd7\x13\x32\x53\xf1\x98\xfc\x4f\x70\xdc\xe5\xe4\xa4\xed\xe3\x4c\xcc\x4d\xb4\xd2\x8c\xa5\xf5\x21\xdc\x04\x21\xbb\xcb\x56\xd0\x43\x8f\xf3\xb7\x4f\xa2\xbc\x1b\x4f\x7b\x04\x77\xf9\xb8\x9a\xed\x3a\x07\x7d\x18\x6f\xdf\xc5\xb4\xfd\xd0\x03\x27\xc0\xcf\x1a\xf8\x39\xd0\xf3\x29\x54\x44\x16\x7e\x0b\xc5\x23\x3c\xdc\x99\xd7\xdd\x44\x16\xdd\xf0\x75\x09\xf8\x21\xda\xef\x0f\x62\xa7\x93\xed\xf7\x50\x9b\x4b\xf8\xa1\xa7\xfa\x5e\x2e\x7f\x37\xb1\x5c\x6e\xb5\xd9\xd0\x8d\x81\x43\x0b\x38\x18\xdc\x8e\x3a\x6f\x89\xe2\x3c\x0c\x77\xda\x38\x4d\x6e\x10\xe6\xd4\x05\x4c\x0d\x45\x53\x35\xa4\xbc\x9a\xfb\xbd\x0d\xf6\x1a\xa1\x41\x6d\x6f\x50\x6c\x21\x5d\x8f\x84\x46\x17\xd0\x35\xaa\xdc\xbb\x37\x3b\x75\xd7\x24\xca\x5e\x3d\x83\x77\x8b\xae\xab\xfd\xba\x2f\x70\x88\x60\xc5\xe3\x12\xd4\x8e\xa2\x8b\xb2\x8e\xa0\x55\x8f\x0b\xb2\x9c\xc9\xcc\x21\xa0\xdd\x67\xda\x07\x92\x61\x4c\x42\xd3\x77\x03\xe6\xdd\x50\xf9\xf7\xdf\x15\x64\x43\x4d\xb7\xb0\xef\xff\xf7\x7f\xd8\x57\xcb\xd0\x95\x93\x35\xfb\xaf\x3f\x7e\xd8\x68\x63\xff\xf1\xc7\x37\xec\x7a\x43\xd9\x50\x1e\x6b\xe8\xae\x49\x5d\x6f\x2a\x19\xcb\xe1\xc8\x7e\x08\xfd\x59\xd3\xdb\x04\x9c\x35\xf5\x91\xf0\x07\xd6\xc9\x8a\x75\xd1\x75\xb6\xd8\xdf\x18\x49\x3e\x5c\xee\xa2\x29\x03\xf5\x64\xfd\x33\x5d\xf8\x98\xa2\x17\x0f\x2d\x96\xae\xd4\xc5\x5c\xa6\x7c\x58\x68\xc6\xea\x62\x5a\xac\x8b\xe5\xa4\xd8\xf0\xad\x0e\x3a\x77\x2b\x65\xac\x55\x4d\xed\x54\xa6\x2e\x36\x9a\xf5\x5c\xb2\xb9\xfb\x29\x25\x16\xc5\xa6\x88\x25\x85\x46\x52\x48\x89\x37\x56\xeb\x77\xf3\xef\xf3\xaf\x03\x5f\x4a\x32\x3a\x61\x9c\xe3\xb9\xb3\x14\x7f\x8d\x92\x73\xf9\xf8\xd3\xa7\x81\xc2\xf2\xcc\xf9\x4e\xdd\xc2\x55\x49\x78\x29\x9d\x9f\x2e\x87\x53\x3a\x82\xa4\xb0\xcf\x96\xdd\x56\x98\xe7\x24\x70\x99\x5c\xfd\x89\x62\xb8\x42\xcc\xb9\x2c\x02\xd2\xc1\xd1\x2a\x85\x3f\xd5\xf7\x19\x04\x72\x5d\x35\x2e\x72\xa9\x77\xb5\xe3\xfb\x77\x0c\x2a\x0a\x52\xb0\x29\x9c\x2d\xa1\xae\x6f\xcf\x08\x0d\x0c\x11\x77\x54\xee\xe5\x3d\x5d\x6e\x90\x82\xad\xa0\x29\x8f\xa0\xf9\x3b\xc3\xff\xe1\x95\x8b\xee\xda\xa8\xe8\x68\xac\xc1\xed\xfe\x0a\x44\x76\x12\x48\xef\xc0\x58\xc6\xd2\x94\xc3\x41\xda\x8f\x94\x0e\xc5\x6e\x92\xee\xea\xf3\x9e\x4e\x54\x0d\xcb\x1e\x9a\xa8\x51\x2b\x62\x0a\xb4\xe1\xce\xd6\x30\x65\x39\x9d\x63\xb2\x31\x9d\xeb\xc8\x46\x4e\x67\xfe\x7f\x01\x00\x00\xff\xff\xab\x33\xed\x40\x28\x6b\x01\x00") func paths_strict_sendHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -528,7 +528,7 @@ func paths_strict_sendHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "paths_strict_send-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0x39, 0xf7, 0xd0, 0xfe, 0x22, 0xd, 0xc9, 0x77, 0xc0, 0x49, 0x6f, 0xac, 0xa5, 0x16, 0x16, 0x65, 0xb6, 0xc1, 0xfc, 0xec, 0x50, 0x4b, 0x21, 0x53, 0x51, 0x64, 0xfc, 0x1c, 0x61, 0x14, 0x18}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb9, 0xbf, 0xdf, 0x6a, 0xd7, 0xf4, 0xc5, 0x71, 0xa6, 0xd9, 0x3c, 0x39, 0xf1, 0x43, 0x96, 0xea, 0x34, 0x84, 0xb3, 0xee, 0x11, 0x2e, 0xd1, 0x42, 0x26, 0xa3, 0x10, 0x7d, 0x88, 0x47, 0xf6, 0xce}} return a, nil } @@ -552,7 +552,7 @@ func tradesCoreSql() (*asset, error) { return a, nil } -var _tradesHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x79\x8f\xab\xb8\xb2\xf8\xff\xf3\x29\xd0\xe8\x4a\x3d\xa3\xf4\x99\x60\xb3\x9f\xf9\xcd\x93\x48\x42\xf6\x7d\x4f\x5f\x5d\x45\x06\x0c\x21\x21\x90\x06\xb2\x5e\xbd\xef\xfe\x53\x20\x2b\x9d\x95\xa4\xfb\x9c\x79\xf7\xa2\x33\x3d\x49\x30\xb5\xb9\xca\x55\x2e\x97\xcd\xb7\x6f\xbf\x7c\xfb\x46\x54\x6d\xd7\xd3\x1d\xdc\xa8\x15\x09\x15\x79\x48\x46\x2e\x26\xd4\xe9\x78\xf2\xcb\xb7\x6f\xbf\xac\xef\xa7\xa6\xe3\x09\x56\x09\xcd\xb1\xc7\xfb\x06\x33\xec\xb8\x86\x6d\x11\xc2\x1f\xec\x1f\xe0\xa0\x95\xbc\x24\x26\x7a\x7f\xfd\x78\xa8\xc9\x2f\x0d\xa9\x49\xb8\x1e\xf2\xf0\x18\x5b\x5e\xdf\x33\xc6\xd8\x9e\x7a\xc4\x5f\x04\xf9\xa7\x7f\xcb\xb4\x95\xd1\xc7\x5f\x15\xd3\x58\xb7\xc6\x96\x62\xab\x86\xa5\x13\x7f\x11\x2f\xad\x66\x9a\x7f\xf9\x73\x0b\xce\x52\x91\xa3\xf6\x15\xdb\xd2\x6c\x67\x6c\x58\x7a\xdf\xf5\x1c\xc3\xd2\x5d\xe2\x2f\xc2\xb6\x36\x30\x06\x58\x19\xf5\xb5\xa9\xa5\x78\x86\x6d\xf5\x65\x5b\x35\xf0\xfa\xbe\x86\x4c\x17\x1f\xa1\x19\x1b\x56\x7f\x8c\x5d\x17\xe9\x7e\x83\x39\x72\x2c\xc3\xd2\xff\xdc\xd0\x8e\x91\xa3\x0c\xfa\x13\xe4\x0d\x88\xbf\x88\xc9\x54\x36\x0d\xe5\x75\xcd\xac\x82\x3c\x64\xda\xeb\x66\x62\xb1\x29\xd5\x89\xa6\x98\x28\x4a\x44\x2e\x4d\x48\xdd\x5c\xa3\xd9\x20\x2a\xe5\x62\x6f\xd3\xfe\x8f\x81\xe1\x7a\xb6\xb3\xec\x7b\x0e\x52\xb1\x4b\xa4\xea\x95\x2a\x91\xac\x94\x1b\xcd\xba\x98\x2b\x37\x0f\x1e\x3a\x6e\xd8\x57\xec\xa9\xe5\x61\xa7\x8f\x5c\x17\x7b\x7d\x43\xed\x6b\x23\xbc\xfc\xf3\x2b\x10\x2a\xfe\xa7\xaf\x40\xb9\xd6\xab\xaf\x63\x30\xc0\x76\x3f\x77\x01\x81\x6b\x45\xbe\x84\xec\xa0\xd5\x1e\xb8\xdf\x3c\x57\x4e\x49\xdd\x83\x96\x1b\xb0\x3e\x55\x7d\xac\x69\x58\xf1\xdc\xbe\xbc\xec\xdb\x8e\x8a\x9d\xbe\x6c\xdb\xa3\xcb\x0f\x1a\x96\x8a\x17\xfd\x03\xe6\x2c\x17\xf9\x8a\xee\xf6\x6d\xab\x6f\xa8\xf7\x3c\x6d\x4f\xb0\x83\x76\xcf\x7a\xcb\x09\x7e\xe0\xe9\x3d\x25\x0f\x51\x71\xdf\xb3\x26\x56\x75\xec\xf8\x0f\xba\xf8\x7d\x8a\x2d\xe5\x2e\x16\x0e\x1e\x9f\x38\x78\x66\xd8\x53\x77\xf3\x5b\x7f\x80\xdc\x41\x44\x50\x8f\x43\x30\xc6\x13\xdb\x59\x9b\xe3\x66\x4c\x8d\x0a\x26\xaa\x2c\x15\xd3\x76\xb1\xda\x47\xde\x3d\xcf\x6f\x95\x39\x82\x2a\x6d\xec\x32\x02\xd1\x87\x4f\x22\x55\x75\xb0\xeb\x5e\x7e\x7c\xe0\x39\xaa\xef\x77\xfa\xa6\x6d\x8f\xa6\x93\x1b\x5a\x4f\xae\x91\x14\xb4\x42\x86\x73\x27\xe0\xed\xa0\x7b\xf3\x03\xeb\x71\x42\xd3\xb0\x73\x5b\xd3\x2d\xf8\x08\x8f\x6c\xc4\x7a\xdb\x43\xfe\xd0\x7a\x07\x92\xc3\xa1\xf8\xda\x13\x93\xf5\x03\x03\xef\x6a\x0f\xb8\x47\x03\x90\xbc\xbc\xaa\x46\x83\x9d\xa5\xdf\xd2\xd8\x0e\xe8\xb0\xaf\x36\x34\x5c\xaf\xef\x2d\xfa\x93\xeb\x20\xd7\x2d\xed\xc9\xad\x2d\xf1\xad\xcd\xb6\xae\xe4\x72\x63\x79\x6b\xee\x57\x9b\x5d\x1f\xc5\xe4\xe5\x6d\x9d\x19\xf8\xc8\xb5\xb4\x5d\x77\x7a\x0d\xf3\xae\xb1\x62\xab\xf8\xce\xb8\x60\xa7\x06\x13\xe4\x78\x86\x62\x4c\x90\x75\xd1\x79\x5f\x7b\xb4\x3f\xb9\x33\x36\xd9\x79\xb4\x7b\x29\x38\xfd\xe0\xdd\xf8\x7d\xe1\xdd\x82\x2f\x68\xf8\xe9\xf0\x83\xce\x5c\xf7\xe4\xe6\xe3\xda\x3f\x6c\x43\x3f\x5f\x19\xfa\x37\x52\xa0\xdb\xce\xa4\x3f\x36\xf4\x4d\xc0\x70\x81\x84\x50\xcb\x9b\x79\xbc\x3f\xde\xbb\x04\xf9\x56\xe5\x0c\x9e\x4e\x56\x8a\xad\x52\x99\x30\xd4\x00\x73\x4a\x4a\x8b\xad\x62\xf3\x46\xd8\x67\x94\xee\x09\x90\x37\xdd\x7d\x19\x92\xff\xed\x76\xf6\xb7\x5e\xba\x21\xd5\x5a\x52\x39\x19\x41\x66\xeb\x38\xdb\xc5\xef\x77\x63\x3e\x02\x72\xf3\xd3\x2a\xbe\xb1\xed\x3e\x9a\xbd\x99\xc3\x33\x56\x7f\x0f\x7f\xa7\x41\xdc\xf6\xec\x26\xee\xbb\xad\xf1\x26\xc8\xbb\x99\xb7\xcd\x08\x70\x0f\x2f\xc1\x23\x37\xb6\xdd\x84\x7f\xb7\xd3\xb3\x8d\x17\x6f\xa1\x28\x34\x86\x5c\x6e\x7c\x30\x24\x6c\x1a\x8a\x99\x4c\x5d\xca\x88\xcd\x13\x8d\xc7\xc6\x7a\xc6\x61\x28\xf8\x37\x6b\x3a\xc6\x8e\xa1\xfc\xf3\x5f\xbf\xdf\xf0\x14\x5a\x44\x78\xca\x44\xae\xf7\x1b\xb2\x96\xd8\xf4\x53\x31\x37\x3c\xa1\x19\xce\xc9\x47\xd2\xad\x72\xb2\x99\xab\x94\x2f\xf0\xd3\x47\xba\xbe\xa7\xee\x95\xf8\x40\xe8\x05\x18\x5b\xee\x1e\x80\xb1\xe6\xd5\x7f\x7c\x4f\xfc\x2b\x71\x0f\x23\x3e\xeb\x37\x40\x90\xba\x4d\xa9\xdc\x08\x81\x30\x27\xba\xfb\x6e\x6e\x75\x31\x99\x95\x4a\xe2\x07\x0c\x7f\xfe\x12\x64\xe1\xca\x68\x8c\xbf\x6f\x7f\x23\x9a\xcb\x09\xfe\xbe\x79\xe4\x4f\xa2\xa1\x0c\xf0\x18\x7d\x27\xbe\xfd\x49\x54\xe6\x16\x76\xbe\x13\xdf\xfc\xe4\x5c\xb2\x2e\xad\xfb\x6b\x03\x79\x0b\xef\x97\x23\x88\xc7\x37\x37\x80\x93\x95\x52\x49\x2a\x37\x2f\x40\x0e\x1a\x10\x95\xf2\x31\x00\x22\xd7\x20\x5e\xb6\x69\xb7\xed\x6f\xae\x0f\xe4\x25\x8c\x79\xcb\xfe\x06\xe7\x4e\x42\x57\xf9\x39\x92\x65\xb9\xd2\x0c\xc9\x93\xe8\xe4\x9a\xd9\x1d\x59\x87\xf9\xb7\x23\xf4\x7b\x28\x21\x42\xee\x61\xfe\x03\x10\x5f\x00\xd5\x62\x7c\xa2\x37\x6a\x45\x62\xe2\xd8\x0a\x56\xa7\x0e\x32\x09\x13\x59\xfa\x14\xe9\xd8\x17\xc3\x8d\xf9\xc2\x43\x72\xaf\x2b\xda\x86\xfc\xad\xae\xee\xe9\xdf\xf6\xed\x29\x59\xee\x34\xfb\x2a\x7c\xa2\x2e\x35\x5b\xf5\x72\xe3\xe0\xb7\x5f\x08\x82\x20\x8a\x62\x39\xd3\x12\x33\x12\xe1\x73\x5f\x2a\xb5\x82\xf1\xae\xd1\xac\xe7\x92\x4d\xbf\x85\xd8\x20\xfe\xd1\xff\x07\xd1\x90\x8a\x52\xb2\x49\xfc\x03\xac\xbf\x85\x7b\xe3\xaa\x21\x3e\xc6\xdd\x35\xf0\x4f\x63\x0e\x9e\x62\xee\x96\x91\xea\x31\xfe\x6e\xc0\xb0\x63\x71\xf7\x53\x24\x0e\x7f\xfb\x85\x20\x92\x62\x43\x22\x3a\x59\xa9\x4c\xfc\x03\xfc\x13\xfc\x2b\xfe\x0f\xf0\x4f\xf8\xaf\xff\xf9\x07\xf4\x3f\xc3\x7f\xc2\x7f\x11\xcd\xe0\x26\x21\x15\x1b\xd2\x5a\x28\x52\x39\xf5\xfb\x49\xc9\xdc\xe0\x07\x1e\x94\xcc\x75\x0c\x9f\x2d\x99\xff\x17\x45\x32\x1f\x7d\xea\x46\x0e\x3b\x3f\x7c\x9b\x20\xf6\x6e\xfb\x03\x44\x9f\x62\x82\x68\xac\x65\x45\xfc\xb5\x1f\x01\x5e\x83\x9f\x9b\xbd\xaa\x44\xfc\x75\x68\x11\xbf\x9f\xb2\xda\xa7\xd2\x18\x06\x18\x22\x71\x6b\xc6\xb7\x53\x78\x32\x04\x7a\x94\xca\x53\x40\x43\x94\x1e\x19\xe4\x31\xb9\x7b\x2d\xfb\x48\xed\xa9\x30\xef\x61\x6a\x4f\x00\x0d\x53\x7b\x68\x24\x17\xa9\x5d\x7b\x2e\x15\x6b\x68\x6a\x7a\x7d\x0f\xc9\x26\x76\x27\x48\xc1\xc4\x5f\xc4\xcb\xcb\x9f\xc7\x77\xe7\x86\x37\xe8\xdb\x86\x7a\xb0\x94\x76\xc4\xeb\x61\xfc\xbb\x61\xd1\x37\xb0\xdb\xd8\x0b\x6c\xf1\x70\xf2\x1d\x70\x64\xa8\x84\x6c\xe8\x86\xe5\xf9\x81\x41\xb9\x55\x2c\x06\xec\xa0\xf1\x3a\x8c\x27\x94\x01\x72\x90\xe2\x61\x87\x98\x21\x67\x69\x58\x7a\xa8\x99\x35\x1d\xef\x42\x7e\xc2\xb0\x3c\xac\x63\x27\xd4\x44\x33\x91\xee\x12\xee\x18\x99\xe6\x47\x34\x9e\x3d\x36\x3f\x22\xf9\x0d\x32\xcc\xef\xbb\x96\x1f\xbb\x3d\x3c\x6f\x88\x2a\x8e\x70\xb6\x63\x27\x12\x0f\x2f\x3e\x08\x64\x32\x31\x0d\x3f\x67\x4f\x78\xc6\x18\xbb\x1e\x1a\x4f\x88\x75\x9f\xf9\x5f\x89\x95\x6d\xe1\x8f\x84\x9e\x9b\x15\x6d\xe3\xd1\xcd\x74\xea\x36\x9a\x77\x93\xaf\x33\x50\x37\x6a\x28\xd6\x9b\x41\x44\x07\xfc\x1f\x72\xe5\x64\x5d\xf2\xc3\xaf\x44\x6f\xf3\x53\xb9\x42\x94\x72\xe5\xb6\x58\x6c\x49\xbb\xef\x62\x77\xff\x3d\x29\x26\xb3\x12\x01\xae\x31\x13\x59\xec\x61\x40\x1f\x54\x71\x93\xf4\x20\x2c\xbc\xf0\x66\xc8\xfc\xed\xe5\x0c\xc7\x2f\xdf\xbf\x3b\x58\x57\x4c\xe4\xba\xbf\x87\xbb\x2b\x58\xab\x38\xa1\x5b\x2c\xfd\xfb\x85\x8e\x0a\xe6\xc6\x0f\x73\x16\x64\x74\x76\x7c\x9d\xb6\x8c\x7d\xae\xee\x34\x99\x27\x9b\x2b\xb6\x7a\xaa\x39\x80\xa7\x9b\x07\xe9\xbf\x13\x0f\x30\xec\x25\x0b\x3b\x9d\x5e\x78\x92\xda\x1e\xc2\xfc\x32\xa5\xbd\xc4\x08\x51\xe9\x94\xa5\x14\x91\xe8\x5d\xe1\x28\xc8\xd0\x5d\x66\x68\x07\x2b\x74\xfb\x0f\x43\x3d\x47\xdb\x36\xe7\xf3\xa8\xd6\x6d\xe0\x6c\xd4\x2e\x64\x33\xfd\x73\x23\xfd\xc7\x14\xd7\xb9\x96\xbf\xfa\x0b\x1f\xbf\x9e\xd1\x66\x5f\x8f\x4f\xdf\x52\xb1\x87\x0c\xd3\x25\x86\xae\x6d\xc9\xe7\x95\x6d\x9b\x28\x7b\x54\x0e\x1b\x38\x1b\x39\x6c\xd7\xad\xcf\xd0\x76\xb0\x98\x7c\x93\x15\x9e\x5a\xc7\x3e\xfd\xe0\x46\x2c\x07\x99\x51\xbf\x23\x76\x74\x6c\x47\x39\x32\x84\x61\xdf\x11\xb7\xb5\xdf\x2d\x26\x87\x1c\x93\x3d\xf5\xf6\xbe\x29\xfc\x8c\x83\x91\x77\xf5\xa1\xa0\xed\x74\xa2\xde\xdc\x76\xa7\x3a\x9b\xaf\xa1\x75\xf6\x0f\xbc\x80\x0f\xf1\x80\x87\xcc\xbe\x62\x1b\x96\x7b\x5a\x07\x35\x8c\xfb\x13\xdb\x36\x4f\xdf\xf5\x57\x3e\x35\x7c\xae\xaf\xfd\xdb\x0e\x76\xb1\x33\x3b\xd7\x64\x1d\x87\x7a\x8b\xbe\x1f\x26\x19\xab\x73\xad\x26\x8e\xed\xd9\x8a\x6d\x9e\xe5\x2b\xdc\x47\x5b\x65\xc1\x48\xc5\x8e\x1f\x5e\x04\xbf\xbb\x53\x45\xc1\xae\xab\x4d\xcd\xfe\x59\x45\xd9\x30\x8e\x0c\x13\xab\xd7\x5a\x6d\x48\x3f\xa3\x42\xe7\x4d\xef\x4c\x7e\xfb\x51\x4b\x3c\xb3\x66\x72\xc5\x2f\xde\x3e\x22\x5d\x1f\xe3\xee\x65\xf9\xb9\xae\xee\x22\x8e\xaf\x72\x7d\x77\x31\xfa\xa0\x2b\xbc\x88\xeb\xa3\x6b\x3c\xdd\xfc\x82\xab\x3c\x58\xfd\x79\x9a\x6e\x5e\x9b\x0a\x1d\x57\x5e\x9d\x99\x2e\xad\x67\x07\x4a\xc0\x8a\xef\x25\x1f\x74\x92\x9b\xd1\xc1\x9e\x3a\xca\xae\x94\xe3\x8c\x7b\xda\x0e\x39\x2f\x2f\xdf\xbf\x9f\x9f\xae\x9d\xb7\x83\xcd\xe2\xdb\xa3\xe2\xdc\xd4\x0b\xfe\xf6\xd4\x98\x62\x33\x6c\x46\xf1\x70\x7e\xbd\xcc\x59\xb4\xa1\x6a\xc5\x4b\x8d\x36\x05\x94\x97\x9a\x04\x73\xe5\x93\x0d\x3e\xd6\x7d\x5e\x69\x77\x11\xdd\xae\xd5\x05\x8c\x3e\x49\x86\xdb\x77\xb1\x69\x62\x87\x90\x6d\xdb\xc4\xc8\xda\xfa\x2d\x43\xc1\x7d\xeb\xc8\x47\x07\xbf\x1d\xfb\xed\x7d\xc5\x51\x3f\xe4\xd1\x8f\x6a\x9e\xc2\x37\x0f\x96\xf2\x4f\x56\x87\xfa\x54\xf7\xfd\xfa\x61\x22\x99\x95\x92\x05\xe2\xb7\xdf\x0e\x25\xf8\x3f\x04\xf9\xfb\xef\xd7\x40\x9d\x7a\x7c\x2b\xb4\xff\xf7\x41\x8e\x37\xc0\x3b\x92\x69\x08\x7c\x48\xe0\x3e\x81\x17\x4d\xe9\xf4\x2a\xf8\x13\x8c\xeb\x74\x5d\xc3\x8d\x9e\xf4\x96\x21\xec\x11\x5f\x7a\xad\x86\xe0\x39\xde\xf4\x0a\x96\xaf\xf2\xa7\x77\x32\xfb\xa0\x47\xbd\x82\xed\xa3\x4f\x3d\xf7\xc0\x05\xaf\x7a\x54\x37\xf2\x44\x5d\xdd\xea\xe7\x21\x49\x37\x4f\xb4\x36\x63\xff\x95\xe9\xdb\xad\x8e\xf7\xb2\x0f\x3d\xd9\x76\x8f\xfa\xa4\xbd\xac\x67\x0a\xe7\xa7\x1a\xe7\x26\x71\x3f\x64\x1a\xe6\x2d\xfa\xd8\x9a\x61\xd3\x9e\xe0\x53\xa9\x4d\x6f\xb1\x9e\x14\x4d\x4d\xef\xcc\xcd\x31\xf6\xd0\x99\x5b\xeb\xe9\xd8\xb9\xdb\xae\xa1\x5b\xc8\x9b\x3a\xf8\x54\x16\x4e\x60\x7f\xff\xe7\xbf\xf6\xb1\xcb\xbf\xff\xf7\x54\xf4\xf2\xcf\x7f\x85\x65\x8e\xc7\xf6\x99\x84\xd9\x1e\x96\x65\x5b\xf8\x62\x2c\xb4\x87\xf5\x11\xcc\x86\x33\x63\x8c\xfb\xb2\x3d\xb5\x54\x3f\xab\xcd\x3b\xc8\xd2\x71\x78\xc6\x76\xec\x5a\xd7\x92\x58\x43\xd3\xb1\x7a\x7d\xba\xb5\xc9\x0f\x1a\xea\xd6\xda\xb6\x65\x5e\xb7\x0c\x11\x81\xb9\xf9\x35\x75\x57\x2a\xc8\x1a\x52\xf3\x42\x2e\xf5\x30\x6b\x75\x98\x49\xbd\x6f\x1e\xf1\x3c\x26\x6e\x2c\xb0\xbb\xc8\xd4\xc5\xf9\xc7\x2d\x4c\x9e\xf5\xb4\x4f\x63\xf3\xe6\x1a\xc5\x8b\x8c\x5e\x71\x0b\xa7\x59\x4d\x21\x0f\x11\x9a\xed\x5c\x59\x51\x22\x52\x62\x53\xbc\xc2\x5e\xae\xdc\x90\xea\x4d\x22\x57\x6e\x56\x8e\x56\x95\x7c\x2f\xda\x20\x7e\x03\xaf\xc4\x0b\x43\x6e\xaf\x97\x57\x02\xbe\x12\xe4\x2b\xf1\xf2\xf2\xfb\x9f\x57\x9f\x85\x17\x9e\x3d\xc3\xca\xa5\x15\xa1\x7b\xd9\x09\xaf\x0a\x6d\xc9\x7a\x01\x7d\xc3\x32\x3c\x03\x99\xfd\xa0\x42\xe7\x0f\xf7\xdd\x7c\x79\x25\x5e\x20\x09\x84\x6f\x24\xfb\x8d\xa4\x08\xc0\x7f\x87\xfc\x77\x9a\xfb\x83\xa4\x20\x2d\xb0\x31\x12\x86\x19\x3e\x0b\x1d\xf6\x83\x9d\x17\x47\xbd\x29\x2f\xfb\x9e\x6d\xa8\x97\x31\x09\x2c\xc3\xdd\x83\x89\xea\x4f\x5d\xbc\xf3\x6e\x7d\xc3\xfa\xb0\xdb\xe3\x22\x3e\x9a\x26\x69\xfe\x1e\x7c\x74\x1f\xa9\x6a\x3f\x9c\x33\xbb\x88\x83\xa1\x19\x0a\xde\x83\x83\xe9\x07\xbe\x74\x1b\xd5\xfb\x6b\xad\x17\x51\xb0\x14\x09\xef\x62\x83\xdd\xa2\xd8\x8c\x9c\x37\xa0\xe0\x69\xc0\xdc\x83\x82\xeb\x8f\x6d\xd5\xd0\x96\xb7\x73\xc1\x03\x16\xde\x85\x82\x3f\xe2\x62\x53\x62\x7d\x03\x1e\x8e\x66\xa9\xfb\xf0\xac\x3b\x1d\xe9\xba\x83\x75\xe4\xd9\xce\x65\x9d\x12\x48\x40\x0a\xf7\x80\x17\x7c\xf0\x41\x3e\xb5\xbf\x50\x9d\xcb\xd0\x21\x07\xee\xea\x6a\x40\xfa\xe0\x37\xbd\xe0\xcf\x90\x2f\x23\x60\x04\xee\x2e\xe9\x00\x70\x88\x60\x37\xe5\x5a\x0f\x00\x97\x11\x09\xac\x70\x1f\x27\xf0\xa8\xa3\x37\x93\xdc\x60\x53\xef\x25\x4c\x80\xe4\x18\xfa\xae\x1e\x01\x54\xc0\xce\x2e\x35\x70\xb1\xc7\x01\x80\x1c\x7b\x1f\x27\x74\x5f\x33\x16\xdb\x0d\x0e\xf6\xd8\xec\x6b\x06\x36\x2f\x0e\x8d\x00\x30\x00\xdc\x35\x08\x03\x66\xbb\xae\xb3\xcd\xb7\x2f\xae\xb0\xc1\x72\xf7\x0d\xf3\x80\xed\x1b\x96\x8e\x5d\xaf\xff\x31\xa3\x7f\x05\x15\x27\xf0\xf7\xf5\x08\x77\x14\x26\xf8\x4b\x27\xe8\xb2\x33\x01\x90\x24\x29\xfa\x2e\x24\xfc\x4e\x7d\x35\xdb\xe9\xaf\x83\x7e\x1c\x32\x76\x40\x7e\xa3\x00\x01\xe8\xef\x40\xf8\x4e\x0b\x7f\x00\x48\xf1\x14\x13\x23\xc1\x05\x7f\x7e\xb1\xd6\xe0\x5e\x87\xfe\xa1\xde\xe0\x30\x48\xc9\x88\x4c\x27\x51\xed\x89\x4c\x8f\xee\x88\x52\xb6\xdb\xa9\xc3\x56\xa1\x02\x5b\x15\x3a\xd1\xca\x64\x5b\x35\x8e\x96\x5a\xd5\x42\xa5\x0c\x6b\xd9\x36\xdd\xa9\x67\x2b\xb9\x7a\xb9\x50\xc8\x7e\x10\xd0\x59\x24\xeb\x68\x26\x93\xec\x16\x32\x6c\xbd\x4c\x57\xca\x39\xa9\x9a\x2c\x95\xd3\x09\x8e\x82\x22\x4d\xb1\x6f\x4c\xb5\x9c\x6a\xd4\x8b\x99\x4e\x81\xcb\x24\x8a\xc9\x52\xad\x98\x4b\x57\xe8\x06\x27\xf5\x3a\xed\xd6\xcd\x48\x28\x1f\x49\xad\xda\xcb\x64\xe9\x02\xc3\x75\x13\x29\xa9\x5c\x28\x74\x19\xa6\x90\x6a\x76\x2a\xcd\x02\xd3\x49\x75\xea\xb5\x4a\x16\x16\xb3\x52\xaa\x4b\x49\x85\x76\xae\x56\x2f\x96\xa4\x46\x26\x91\xb9\x19\x09\xed\x23\x81\x54\x2d\x0d\xb3\x2d\x89\x81\x62\xa9\xdb\x4a\xb7\xb2\x94\xd8\xcb\x8b\xdd\x6e\xa6\xdb\x6d\xc3\x76\xb6\xdb\xeb\xd5\x59\xa9\xd7\x95\x9a\xd5\x42\xaa\xfb\xd6\x10\x3b\x2c\xd7\xad\xd0\x37\x23\x61\xd6\x48\x12\xf5\x6a\x2f\x9b\x2b\xc2\x64\x8e\x4a\x97\x6b\x74\xa2\x5b\x4c\x97\xca\xa9\x62\x3a\xdf\x2a\x57\x5b\x30\xdb\xa3\xde\x4a\xe9\x46\xb6\x52\x6e\x25\xa5\x8a\xd8\xe8\x70\xb5\x24\x57\xe9\xc2\xec\x4b\xd4\x02\x9c\x75\xac\x7d\x45\xa1\x36\x45\x8b\xfb\x7a\xe3\x3f\x5c\x7c\xb9\x38\xe5\x95\x60\x5e\x09\xcf\x99\xe2\x1b\xd4\xfc\x63\xd9\x49\x64\x25\x0f\xa6\x82\x87\x2a\xae\x38\x58\x35\xbc\x3e\x32\x27\x03\x64\x4d\xc7\xf4\xda\x30\x5b\x8d\xd4\xcb\x67\x74\xe7\x31\x76\x78\x06\xbb\xd4\xaa\xbf\x7c\x86\xc6\x1e\x63\xa7\xce\x60\x6f\x48\x85\x47\xb1\x47\xa8\x31\x79\x8a\x8a\x1d\xcd\xd9\xfd\x89\xd1\x6d\x0a\x76\xaa\xc4\x24\xaa\x86\x6d\xcb\x4c\x0e\x3a\x99\xe6\x20\x4d\xb3\x34\x4d\x31\xd4\x2b\x01\x5e\x09\x6a\x2d\xfa\x7f\xff\x1a\x2c\x41\xfc\xfa\x9d\xf8\x35\xea\x28\xfb\xeb\x2b\xf1\xeb\x36\x9e\xf8\xf5\xfb\x1a\xf4\xaf\xae\x6d\xaa\x9b\x38\x66\x0d\x19\x92\x7f\x6c\x26\x8a\xeb\xb6\xb2\x3d\xd5\x07\xde\xd9\xdb\xc1\xb3\xbb\x3a\xaa\x75\x83\x56\x23\x15\xba\xe3\x2d\x27\xfe\x9d\xb0\xea\x1c\xc2\x3f\x02\x21\xb5\xea\x1f\xee\x5d\x02\x72\x80\x2b\x28\xcf\xf2\x25\x14\xd1\x12\x3f\x60\x3e\x04\x19\x4d\xc1\x7f\xfd\xdf\x73\x06\x16\xee\x7a\x10\xea\x7a\x78\xaa\xeb\x23\xfa\xbe\xcf\xef\xfa\x4d\xbf\x3d\xd2\xf5\x1b\xed\x79\xb4\xeb\x23\xf6\xd3\xa5\xae\x8f\xa8\x4d\x37\x77\xfd\xba\xab\x79\x96\xa1\x39\x52\xe0\x58\xf0\xd5\x56\xcf\x5c\xee\x7a\xe6\xbf\x56\xff\xb9\x56\x7f\xd4\xf5\x5f\x6b\xf5\x8f\x76\xfd\x7f\xad\xfe\x01\xab\x5f\xf7\x36\xa0\x39\x9a\xa7\x49\x86\xe3\x7c\xab\x87\x7e\xcf\x1f\x76\xc0\x51\x0f\x9c\x14\xfe\x75\x91\x7d\xbd\x56\x53\x21\xd6\xd6\x5a\xfd\x7f\x84\x35\xf8\x4a\x00\x0e\x70\x02\xcf\x51\x90\x07\xf7\xf7\xda\x46\xdf\xa3\xb0\xf6\xd9\x0a\x49\x87\x58\xbb\xb7\xd7\x7e\x62\xd6\xd6\x1d\x05\x79\x9e\x16\x48\x46\xe0\x99\xa0\xd7\x48\x9f\x37\xd3\x18\x1b\x3e\x6b\x02\x84\x14\xc5\x41\x92\x62\x79\xe6\x0f\x9a\xe3\x18\x9e\xe4\xfe\x56\x3c\xc2\x2d\x8f\x80\x24\xb7\x9a\xf9\x7f\x97\x47\x1a\x6c\xc7\xcc\x48\x3c\xfe\xc4\x23\xcc\x4e\x57\x01\x0f\x39\xea\xff\x26\x8f\xf0\x95\xe0\x19\x5e\x10\x28\x9e\xe5\x05\x9f\xc5\x80\x43\xd7\x43\x8e\x67\x58\x7a\x5f\x46\x26\xb2\x14\x9f\x62\x70\x30\xe6\xdc\x8c\x80\x39\x46\x70\x62\x28\x03\xa7\x86\xb2\xad\x94\x2c\xe4\x19\x33\x1c\x99\x9f\x75\xaf\x05\x0c\xcd\xb1\xa1\x0f\xbc\x4d\xf4\x15\xa4\x05\xfa\x23\xbc\x7c\x28\xac\xbb\x47\x93\x7c\xaa\x68\xc8\x6d\x06\xbd\x4f\x92\xf2\x06\xc1\x67\x4b\x39\xc4\xcf\x6d\x52\x8e\x3a\x6f\xba\xc7\x6d\x06\x54\xb1\xfc\x66\xd8\xfd\x2c\x29\x07\x08\x3e\x5b\xca\x21\x7e\x6e\xd4\xe5\xcf\x1e\xf9\xa9\x0d\x55\x0c\x29\x6c\x06\xfe\x4f\x92\xf2\x06\xc1\x67\x4b\x39\xc4\xcf\x8d\x52\x7e\x64\x5c\xbe\x92\xd6\x3c\xb5\x63\x2c\x6a\x5a\x73\xbb\x6b\x6c\x67\xb8\xe0\x95\x78\x61\x69\x4c\x2a\x02\x49\x42\x2c\xd0\x1c\xc7\xd3\x94\x40\x29\x24\xaf\xf2\x18\x32\x0c\xc5\xcb\x08\x09\x98\x23\x59\x9a\x57\x14\x84\x30\xab\xd1\x08\x32\x9a\xc2\x50\x1c\xcf\x03\x41\x05\x0a\xfb\xf2\x4a\xbc\xd0\x00\x00\x12\x63\x85\x84\x80\xe7\x69\x48\xca\x88\xa5\x69\x5a\x61\x14\x4d\x53\x79\x15\x40\x95\x14\x48\x5e\x81\x24\x92\x35\x0e\x29\x8a\xc0\xb2\x02\x0f\x20\xa9\xc8\x24\xa4\x35\xc0\x70\x2f\xbe\xe6\x80\xd0\x8a\x1d\xfb\x9d\x62\xbf\x43\x3a\xbc\x90\xe7\xff\x0c\xf8\x3f\x18\x8e\x67\x39\xe6\xea\xdd\x4d\xf6\x8e\x84\x0c\xfb\x4a\x80\xf5\x7f\xe4\x87\x6b\x7d\xc3\xff\xbb\xf9\xb3\xfb\x75\xf7\x61\x4d\x9b\x28\x8a\x62\x92\x94\xea\xa9\xe9\x3c\x99\xc9\xd5\xf4\xe9\xb8\x2e\x2d\x94\xb8\x30\xac\x17\x6b\xa3\xdc\x5c\x7f\x8f\x63\x77\xd9\x41\x3d\x49\x5f\xce\xf3\xd5\x74\xf7\x9d\x66\x67\x8d\x86\xcd\xd9\x0d\xb7\x31\x36\xdf\x46\x9d\x59\x37\xd1\x84\xd8\x59\x0e\x56\x42\x16\xe7\xd8\x0c\x50\xd5\xfc\xdc\xb4\x27\x76\x6b\x0d\x5a\xec\x56\xdb\x25\x43\xdc\x5f\xcb\xa6\xdd\xee\x8d\xe1\xa0\x57\xa7\x72\xad\x34\xc5\x4f\xc6\xef\x5c\xb9\x9d\x1a\xa6\x4b\xab\xba\x93\xaf\xe5\xd2\x4b\x57\x9e\xf2\xc9\x7c\x71\x65\xa7\x06\x3d\x27\xc6\xba\x76\xac\x59\xee\xc6\x56\x71\xbb\xb7\xa2\x33\x1c\x22\x75\x59\xcf\x25\x6a\xca\x68\xea\x4d\x7a\x92\xce\x8b\x15\xbe\xa9\xaf\x21\xbb\x65\xba\x88\x56\x13\x58\x3b\xc0\xf6\x26\x86\x2e\x29\xf8\xb5\x0b\xe8\x9a\x28\xa6\xc8\x7c\xf8\xfe\x4f\x7f\xbd\x6c\xc7\xa3\x72\xab\x58\x3c\x63\xff\x1f\x4c\x82\x7c\x8e\x3a\xbf\x60\x12\xcb\x50\x40\x98\x57\x14\x86\x57\xa1\xaa\xa9\xac\xac\x21\x96\x23\x15\x8a\xa7\x34\x45\x86\x1c\x56\x38\x06\x31\x2a\x87\x58\x92\x62\x00\x05\x54\x8c\x21\xa9\x41\x92\xc2\x2c\x04\xfc\x25\x93\xa0\xce\x29\x3d\x0b\x78\x81\x62\xaf\xde\xa5\xa1\x40\x0b\x2c\x07\x05\x96\xbc\x64\x12\xcc\x8d\x26\x11\x4b\x39\x05\xc4\x96\x16\x3d\xd2\x8b\x77\x66\xec\xdb\x7c\x4e\x57\x79\xd7\xe2\xb2\x1d\x13\xb0\xbd\x54\xab\x99\xc5\xb4\xce\xeb\xd5\x71\xae\xd7\x19\x61\xde\x1c\xc9\xa5\xf4\x9b\x1b\xab\x64\xda\xcd\xb7\x54\xd3\xa4\xbd\x74\xb7\x3c\x54\xe2\x93\x4c\x4d\x9d\x8e\x2a\x6f\xbd\x11\x80\xb2\x41\xfa\x5d\xb8\x36\x89\xc1\x7c\xdf\xa5\x3c\x2b\x59\xca\xaa\x51\x57\x2b\xb4\x93\xcc\x55\xc6\x0d\x1e\x2d\xb3\x83\x99\xfb\x9e\xb5\xca\xf1\x42\xda\x1b\xc9\x7a\xb9\x63\xc6\xe7\xa5\x3c\x5e\x8d\xdd\x41\x8e\xed\xbd\x19\x2a\x30\x49\x7a\xc4\x64\xea\x34\x53\xcf\x35\x8b\x6a\x9a\x6d\xdb\x85\xc9\x28\x67\xcf\x63\xc9\x6a\xaa\x9d\x8c\xfb\x26\x61\x9f\x30\x89\xae\x12\xd2\xa8\xff\x48\x93\x10\x9e\xa3\xcd\x2f\x00\x51\x82\x02\x10\x54\x35\x4e\xe3\x38\x2c\x00\x4d\x41\x02\xc7\xb3\x14\x60\x15\xcc\x91\x80\xe1\x59\x1e\x91\x88\x04\x32\xe4\x55\x86\x25\x35\x59\x81\x14\xcd\x03\x59\xa3\x90\x46\xd3\xf4\x25\x8b\x80\x67\x75\x9e\x02\xec\x05\x7b\xd9\xde\xdd\x24\x7b\x19\x96\xa5\x2f\x59\x04\x7d\xa3\x45\x2c\x6c\x66\x8e\x8a\x9a\x46\x69\x93\x2c\xff\xde\x1d\x0c\xd3\x2e\x33\x4f\xf7\x50\x21\xa9\x67\x96\xc3\x76\xaf\x3a\x4b\x96\x73\x99\x78\x65\x56\x97\xe4\xe2\xdb\x8c\x12\x2b\xb5\x37\xad\x3c\x4a\x69\xea\x32\x96\x5f\xf4\x1a\x3c\x3b\x30\x39\x98\x4a\x4c\x57\x63\x88\x86\xfc\x2c\x6b\x58\x29\x79\xe4\xf7\xa0\x6f\x11\xfa\xbe\x47\x05\x73\x92\x88\xd9\x63\xb5\x67\x17\x57\x92\xd9\x8e\xf3\x66\xc7\xf4\x4c\xcc\xc5\x27\x19\xc5\xb5\xe2\x7c\xb7\x09\x54\x3d\x07\x62\x59\xb5\xb2\x5c\x8a\xd3\x18\x45\x71\x99\x7a\x3e\xbd\x34\xca\x6d\x95\x34\x26\xa2\x99\xe3\xc6\xea\x68\xbc\x54\xa4\xce\x5b\x8c\x77\xde\x57\x6f\x43\xba\xe8\x5b\xdc\xe8\x84\x45\xb4\xe9\x90\x42\xa5\xc4\xff\x40\x8b\xe0\x9f\xa3\xcd\x2f\x0c\x56\x15\x9e\x92\x01\xa6\x30\x27\x90\x82\x4a\xaa\x8a\x2c\xcb\x02\xe6\x14\x4e\x50\x00\xa9\xf2\x0c\xa0\x20\x07\x18\x44\x22\x4e\x86\x2a\x84\x18\xf1\x24\x2f\xb3\x88\x26\x49\x5e\x15\xe4\x4b\x16\x01\xce\xea\x3c\x4d\xf3\xfc\xd9\xa0\x6a\x77\x97\xa2\x29\x46\xe0\x28\x9e\x62\xf9\x4b\x16\x41\xdd\x68\x11\x80\x53\x74\x2e\x3b\x64\x98\xa4\x9a\x52\xa6\x9c\x65\x2d\x98\x79\x0d\xa6\xa5\xa5\xd2\xb6\x0b\x78\x49\x1a\xac\x9d\x2c\xa2\x91\x98\x83\xf2\xfb\xd4\x1c\x17\x4a\x1c\x33\xcf\x66\x29\x77\x36\x29\x4c\x87\x54\x21\xcb\x0d\x93\x83\x84\x55\x87\xc0\xce\xbe\xd9\xaa\x1d\xef\xea\x29\xbc\x72\xfd\x1e\xf4\x2d\xe2\x40\x49\x79\x12\x80\x1c\xaf\xcc\xb1\xd1\x6e\x15\xeb\x23\x4e\x8f\xe5\x28\xdc\x29\xc5\x47\xb1\x56\xcc\x9d\x15\x8b\xb3\x7c\x91\xef\x0a\x52\x39\x01\x9c\x02\xaa\x5b\x66\x69\xc9\x4b\xab\xba\xa3\x55\x57\xc6\x08\xe5\xd9\x52\xd2\x68\x77\x63\x99\x3c\x2b\x31\x09\x0f\x52\x9d\xd9\xa2\x97\x1d\xa5\x7d\xc8\xfa\x09\x8b\x68\xb5\x42\x0a\xf5\x1f\x69\x11\xdc\x73\xb4\xf9\x05\x23\x85\x52\x05\x8d\x65\x59\xc4\x70\x9a\xcc\x40\x12\x6b\x00\x70\x18\x0b\x3c\xa5\xca\x32\xc5\xb3\x32\x24\x55\x96\x66\x49\x16\xc9\x2a\x4f\x02\x1a\x50\x2c\x45\x41\x56\x90\x15\x45\xe1\xc8\x4b\x16\x41\x9e\xd5\x79\x86\xa3\x2e\x78\x90\xf5\x5d\xdf\x47\x90\x24\x4b\x73\x1c\x20\x39\x78\xc9\x22\xe0\xad\x51\x93\x93\x82\xda\xdb\x78\xd2\x8d\x81\x5c\x85\xaf\x6b\xd3\x71\x0a\x72\x95\x8c\xab\x83\x51\x2f\xf3\x2e\xe8\x89\x5a\xb3\xb7\xca\x4f\x66\xa5\xc5\xbc\x3e\x88\xcd\xd1\xac\x92\xf3\x52\xa0\xa9\xc6\x15\x2c\xf7\x32\x66\x59\x1e\xe7\x53\xde\x38\xae\xc6\xbc\x56\x41\xb5\x2b\x2c\x5c\xa4\xe6\x5e\xce\xef\x41\xdf\x22\x0e\x7a\x74\x5a\x73\xaa\x35\x07\xbe\x9b\xe5\xf6\x24\x99\x7b\x1f\xd4\x10\xae\x95\xdc\x94\x90\xef\x74\xca\x68\x91\x6b\x54\x72\xf3\x92\xbb\x98\x19\x66\xae\xdd\xe0\x2a\xb3\x32\xdb\x4a\x17\x45\x8d\xd7\x92\xf2\x54\x1c\x51\x3d\xc4\xce\x6b\xcc\x3b\x5b\x62\x9d\x85\x44\x56\xaa\xa5\xf2\x40\x17\x27\x6d\xdf\x08\x94\x13\x16\xd1\x98\x87\x14\x2a\x29\xfe\x07\x5a\x04\xfb\x1c\x6d\x7e\x11\x30\xcf\x28\x0a\x62\x48\x9e\xa6\x54\x81\x46\x34\xaf\xb2\x80\x26\x05\x5e\x50\x18\x41\x96\x01\xc9\x0b\x32\xc7\x6a\x90\x54\x35\x52\x65\x49\x1a\xd1\x02\x0d\x58\xcc\x51\x0c\xad\x30\x80\x64\x2e\x58\x04\x10\xce\xea\x3c\xcb\x32\x24\x77\xf1\xee\x3a\xa4\x83\x0c\xc7\x0a\x3c\x49\x71\xdc\xc5\xa9\x35\xb8\xd1\x22\x18\x36\xbd\x2a\xb4\x72\x35\xc1\x2c\x34\xca\xbd\x56\xb2\x67\xa5\xc7\x9c\x94\x1b\x53\xf2\x32\xa5\xa5\x3a\x89\x42\xa3\x95\x9e\x2a\xa0\x99\x96\xd2\xc9\x7a\x3a\xa6\xe2\x69\x37\x95\x4f\xcb\x09\xee\xbd\xa7\x0e\x46\x8d\x4e\xb1\x95\x73\xf9\xd8\x4c\xa4\x5b\xf6\x28\x5b\xc4\xb3\x76\x6b\x0c\xb2\x7e\xc8\xee\x5b\x84\x7e\xa0\x97\x8c\x97\x46\xa3\xb8\x36\xe0\x4a\x52\xc5\xf0\x06\x43\x73\xa9\x4a\x4e\xa2\x45\xc6\x4b\xa4\x61\x22\xac\x4d\x41\x4b\x26\x93\x73\xa0\xc8\xb5\x4e\x9e\xcc\xa2\xbc\x35\x16\x07\x93\x98\x98\x34\x5c\xa3\xd8\x26\x27\x1c\x65\xa6\x1a\x2d\x99\xcf\xb6\x0a\xae\xb5\xa8\x57\x32\x62\xa6\x59\xf6\x8d\xa0\x77\xc2\x22\xea\xa5\x90\x42\x25\xc4\xff\x40\x8b\x60\x9e\xa3\xcd\x2f\x34\x56\x28\x45\x11\x64\x44\x43\x16\x50\x2a\xc5\x00\x4e\x81\x2a\xe2\x39\x86\x17\x48\x84\x79\x00\x68\x92\xa7\x65\x0e\x42\x86\x53\x79\x5a\xd1\x04\x5e\xe1\x59\x12\xa9\xaa\x2a\x33\x0a\x02\x97\x2c\x82\x3f\xab\xf3\xeb\xd0\xee\xfc\xcc\x7a\x7b\x37\x58\x5e\xa7\x58\x9a\xbf\x38\xb3\x26\x6f\x4d\x36\x71\xa9\x55\x7e\x3a\xca\x0f\xaa\xcd\x56\x77\xee\xbd\x67\x3b\xf9\xe4\x54\xaf\xd7\x72\x0d\x2a\x67\x6a\xbd\x66\x75\x5c\x1a\xe8\x8e\x0a\xc1\x72\xe0\x64\x9d\xd9\x6a\xd1\xab\xea\xca\xd2\x49\xc6\x2b\x2a\xab\x56\x3b\x42\xe9\xcd\x62\x99\x22\xcf\x36\x34\x43\x9d\x70\xc3\x64\x8d\xa9\x35\xf4\x40\x19\x7d\x8b\x38\x98\x47\x98\x42\x02\x8d\x33\x1e\x9f\x5e\xe9\xed\x14\x39\x6b\x95\x52\x7c\x86\xcf\xe2\x91\x32\x37\x2c\x15\x50\x55\x47\x8f\x57\x32\xd5\xfc\xa2\x95\x1c\x25\x97\x4d\x7d\xd9\x8a\x17\x72\x73\x92\x7d\xab\x42\xcf\x02\x7a\xad\xe3\xb8\xf8\xad\xa8\x82\x78\xa7\xd3\xd0\x04\x2f\x56\xec\x98\x6c\x9c\xf7\x8d\xa0\x75\xc2\x22\xaa\xf6\x29\xad\xfa\x4f\xb3\x08\xfa\x39\xda\xfc\x82\x10\x2b\x2b\x1a\x86\x34\x8d\x69\x4d\x20\x11\x90\x31\x23\xf3\x88\x04\x24\x27\x43\x48\x29\x48\xe6\x19\x85\xa4\x18\x8e\x13\x54\xc4\xf1\x48\x01\x0a\x8b\x14\x41\x51\x65\x5e\x60\x49\xea\xa2\x45\x9c\xf7\x02\x02\x60\xce\x1b\xc4\xe6\x66\x50\xb8\xc0\x0a\x80\xbf\x34\xaf\x16\x6e\x34\x07\x76\xe2\xac\x62\x79\x89\xa9\x8e\x0a\x99\x58\x87\xb6\x13\x09\x2e\x37\x5c\x3a\x03\x45\x04\x2a\x03\x2d\xc3\xcd\x66\x9c\xfc\x4a\x36\x3a\xe2\x02\x64\xdb\x64\x6f\x36\x6f\x60\x2d\x2f\xa9\xa2\xd2\x7b\x4f\x4d\xe8\x44\x8f\x2a\xb2\x85\xa6\xd0\x53\x1d\x6a\x8a\x10\xe7\x26\x73\xba\xdd\xd9\x27\x9a\xf4\x03\x0d\xad\x83\xf8\x20\x3f\x8c\x6b\xac\x81\x2a\xf9\x58\xdd\x2c\xaa\xdd\xa4\x58\x98\x76\xb4\xfa\xbc\x33\x04\x65\x93\xc4\x8c\xe2\xd5\x54\x76\xd4\x7e\x4b\x02\x2d\x57\x45\xe5\x46\x2e\xcd\x75\x8b\xbd\xf1\x7b\xc2\x98\xb6\xba\x5e\x07\x91\x95\xec\x6a\x52\x03\x9d\x98\xad\x24\x69\x65\x39\x2e\xbe\xfb\x90\x6b\x27\xcc\xa1\x22\x9d\x52\xa9\xff\x34\x73\xa0\x9e\xa3\xca\x2f\x0a\x56\x79\x52\x20\x69\x59\x53\x58\x52\x40\x94\x46\xc9\x3c\xa3\x91\x1c\x40\x1c\x0b\x59\x19\x61\x85\xe3\x90\x86\x30\x4d\x01\x15\x70\x1a\x0f\x29\x01\xf1\x14\x25\x73\x1c\xc7\x6b\x14\xb7\x8e\x8a\x68\xff\xdf\x09\xd5\x3e\xab\xf1\x1c\xc9\x91\xe4\xd9\xd5\x88\xdd\xdd\x4d\xb9\x0b\xe0\xf9\x4b\xd3\x6a\xfe\x46\x83\xe0\xb9\x5e\xb2\xd6\x88\x2f\xf4\xf1\x90\xe7\x06\x5a\x62\x31\x81\x79\xc7\x71\x55\x36\x36\xad\x2d\xc8\x6e\x2c\x59\x41\xfa\xca\xa3\x70\xb5\xcc\x2c\x9c\x74\xb3\x51\x29\x69\x74\x47\x6e\x4c\xa6\x42\xb7\x32\x54\xf2\xba\x51\x1c\x3a\x2d\x13\xa2\x0c\xd4\xc4\xf8\xdc\x6e\x2e\xdc\xa9\xa3\x04\x8a\xe9\x1b\xc4\x41\x87\xca\xa9\x79\x5c\xaf\x36\xa7\xbc\xe4\x8c\xbb\xc9\xa6\xc3\x36\xb8\xa2\xc4\x96\xbb\x70\x55\xab\x94\x73\x39\x0c\x07\xa3\x4a\x41\x2a\xd0\x8c\x9b\x2c\xd7\x8b\x46\x37\xc1\xa0\xac\x56\x10\x33\x1d\x87\xca\x2e\x6c\xb3\x56\x5b\xe8\xcb\x45\x37\xa9\x0e\xab\x4b\xc4\xbe\xb5\x57\xa8\xdd\x48\x37\xfd\x88\xac\x74\xc2\x20\x8e\x50\xef\xae\xbf\xb9\x41\xd0\xf7\x1a\x04\x7c\x8e\x32\xbf\xb0\x94\x2a\xf0\x1a\x43\xb1\x18\xb3\xbc\x0a\x64\xc8\xc9\x8c\xcc\x0b\x1a\xa4\x90\xc6\x50\x00\xc8\x1c\xc3\x0a\x08\xd2\x1a\xd2\x00\x4d\x52\x48\x25\x65\x06\xca\x2c\x45\xc9\x24\x27\x63\xe1\xa2\x41\x9c\x57\x79\x08\x2e\x2c\xcf\xed\xee\x06\xf5\x19\x34\x23\x5c\x9a\x54\xdf\x9a\x77\x85\xd5\xb7\x21\x28\x4f\x19\x9b\x94\xf3\x5c\x87\xb6\x96\x95\x59\x6b\x91\xa1\xda\x13\x7b\x14\x9b\xa5\xc5\x8a\x97\x04\x05\x58\xe2\x12\x1c\xfb\x36\xe0\x61\x4d\x77\xa7\x62\x63\xdc\x20\x17\x7a\x7a\x02\xb4\xa1\xd1\x84\xf3\xb2\x3e\x6b\x77\xea\x49\xb3\xd1\x61\xa6\xa5\x2a\x45\xd3\x8d\x52\x10\xaa\xac\xed\x41\xf3\xf5\x35\xb7\xfb\x23\xfa\x2a\xeb\xee\xbf\xcf\xc5\x6a\x2d\x48\xd3\x8a\x03\xce\xc9\x66\x29\x3c\x78\x9f\xb5\xdc\x8e\x54\xd5\x44\x73\xd6\x76\x27\xa2\x08\xe3\x6f\x75\x32\x3f\xac\x8a\xe9\x9c\x9a\x95\x6b\xd0\x6d\x18\xd3\xfc\xc2\x6a\x71\xe6\x32\xb6\xc2\x8b\xb7\xa9\xdb\x5d\x90\xe5\x62\x77\x69\x17\x98\x59\xbb\x96\x9b\xa5\x56\x29\x2b\x96\x1e\xf7\xd2\x15\x1c\xe4\x7d\x73\x27\xec\x25\x53\x3b\xa5\x73\xff\x69\xf6\x02\x9e\xa3\xeb\xfe\x01\x2a\x6b\xd4\xe4\x2b\xf1\x02\x04\x8e\xfc\x46\x82\x6f\x24\x20\x48\xf2\xbb\xff\xef\xac\x4e\x53\x34\xcd\x9e\x77\x10\xdb\xbb\xfb\xd5\xb7\x0b\x1a\x7f\x5a\xdf\x03\x92\x7e\x74\xd7\x9c\xbf\x12\xdd\x82\x41\x2f\xe3\xcb\x46\x21\xc1\xa5\xac\x94\x90\x85\xe4\x62\x98\x88\xb9\xa4\xee\xb9\xf3\xdc\x7c\x05\xba\x6a\xa3\xd3\x43\x89\x3c\x4a\xfb\xaa\x2c\x9d\x50\xe5\xd3\xd7\x56\x95\x45\x31\x31\xfa\x02\x46\x9e\x7a\xbd\x6c\x95\x69\xa3\xca\x57\x2a\x3e\x6e\x38\xa8\x34\x6a\x01\xc8\x99\xf3\x67\xce\xee\x75\x3a\x63\x77\x57\xc0\xc0\x9d\x8e\x73\x24\xc3\x45\x06\x43\x85\xf7\x60\x44\x03\x43\x6f\xd7\x32\x68\x48\xb3\xcc\x2b\x01\xa2\x81\x61\x76\x09\x60\x06\xb0\x42\x64\x30\xec\x2e\x6b\xc6\xf1\x7e\x15\x69\x34\x30\x5c\xa8\x92\x9f\x8a\x06\x86\x0f\xef\x75\x88\x06\x46\x08\x55\xa8\xd3\xd1\xc0\x00\x32\x5c\xe9\x1e\x11\xce\x87\xb2\xf2\x88\x70\xc2\xa5\xdb\x51\xe9\xa1\x42\xe5\xd1\x51\xe1\xd0\xe1\x12\xe4\x88\x70\x42\x55\xb8\x4c\x44\x30\x6c\xa8\x98\x37\x22\x18\xee\xb8\x7c\x34\x2a\x35\x7c\xa8\xaa\x36\x22\x18\xe1\xb8\xcc\x32\xa2\x2a\x43\xf2\x18\x4c\x44\xa6\x20\x38\x2e\x47\x8c\x0a\x06\x86\xaa\x1a\x9f\x73\x62\xf4\x53\xf6\x7b\x5f\x3e\xce\xec\x95\x80\x37\x6f\x00\x3f\x73\x70\xf2\xc3\xbe\xf2\xc0\x95\x1c\x3a\xc7\xfd\x17\x18\x6c\x0d\xf5\xcb\x44\xfd\x83\x74\xfc\xaa\xd4\xa3\x9a\xd4\x33\x3b\x76\x83\x83\x69\x9d\x5f\xbf\x13\xff\xfe\x75\xbb\x17\xd0\x5a\xff\xff\x7f\x8f\xf7\x08\x92\xaf\xc4\xaf\xf2\x74\x69\x58\xfa\x99\x1d\x9a\x87\xf7\x2e\x6e\xd3\xc3\xa6\xf9\x11\xca\x76\xab\xe8\xd1\xcd\x8b\x5b\x06\x0f\xf1\x3d\x67\xbf\xdf\x31\xf2\xa7\x6c\x5e\xf9\x84\x53\x49\x4e\x29\xc5\x61\xa8\xb3\xff\xc2\xde\xa1\x14\xcc\x73\x94\x22\x54\xf3\xfc\xbc\xee\xfe\xdb\xf6\xcd\x51\xfc\xb8\xff\x42\x7e\x7d\xdf\xfc\xd7\x60\x7f\x1e\xa5\x38\x9c\x0d\xec\xbf\xd0\xa7\x95\x02\x32\x27\x94\x82\xbf\xa8\x14\xf4\x46\x29\x98\x5b\x95\x62\xbb\xd9\xfa\x31\xa5\xd8\xee\xfa\x7e\x5c\x29\xa2\x6f\xd8\x3f\xaf\x14\x91\xb7\x48\x7c\xc2\x01\x56\xa7\x94\xe2\x70\x6e\xb7\xff\xc2\x9f\x56\x0a\x10\x5c\xc7\x4a\x21\x5c\x1e\x29\x0e\x92\x3b\xc1\x90\xb1\xbb\xfe\xab\x26\x7f\x1b\x35\x39\x9a\xbb\xef\xbf\xdc\x13\x01\x86\xb6\x2b\x3d\xec\x51\xfe\xab\x15\x3f\x5e\x2b\x8e\x0e\x55\xd8\x7d\x61\x77\xcb\xea\xff\xfe\xd5\xb3\x1f\x3d\x2d\x46\x73\xec\xf1\xa3\x3e\xfb\x27\x3e\xe7\xe1\x13\xce\x4a\x3b\xd1\x53\xc7\x67\x44\xec\xbe\x90\x1f\x7b\xea\x81\xc3\x5d\xf6\x3d\x15\xdd\x16\x7e\xe2\xb3\x1d\x3e\xe1\x4c\xbd\x53\x3d\x75\x94\xc0\xdb\x7d\x09\xa2\x34\xf6\xb6\x7d\xf7\x9e\x33\x75\x3d\x8c\x1f\xed\x0b\x1f\x8c\xfd\xf0\x71\x4f\x3f\x47\xcf\x7d\xfe\x68\x78\x7c\xda\xc5\xee\x0b\xf9\x83\x7b\xee\x01\x83\xfe\x39\x7a\xee\xf3\x67\x46\xc7\x67\x78\xec\xbe\xb0\x91\x7b\x2e\xba\xa7\xfa\x94\x9e\xfb\x61\x7e\xed\xab\x7a\x6e\xb3\x2c\xb0\xfb\x02\x7f\x70\xcf\x3d\x6d\xb4\xfc\x51\x3d\xf7\xf9\xa3\xe5\xe1\x0a\xca\xee\x33\x7f\x70\x92\x82\x36\xb5\xd4\x0d\x2f\x11\xcf\x0c\xf6\xe5\x12\x9c\xdc\xfb\xa8\x3d\x5d\x3f\xd6\xe1\xc1\xb3\x8d\xef\x91\xda\x66\xa5\x67\xf7\x99\xfe\x54\xa9\x3d\xa0\xcb\x3f\x97\xd4\x82\x15\xa9\xdd\x67\xf2\x73\x75\xed\x81\xe9\xe0\xcf\x24\xb5\xcd\xca\xd9\xee\x33\xfb\xb9\x52\x7b\x20\x2d\xfb\xd9\x52\xbb\xb2\x0a\x77\xe2\x5d\x9b\x51\x57\xe0\x36\xef\xdb\x3c\xb9\xfa\x46\x9e\x3d\x2b\x24\x38\x8a\xc7\x3f\x9d\x6b\x5f\x3a\xe5\xff\x76\xf0\x83\x86\x4c\x17\x6f\x27\x7d\x34\x0b\x00\xcb\xb3\x24\xcb\xb0\x6b\xb7\x08\x21\x73\xa1\x14\x22\x44\xd4\xd1\x0a\xc3\x69\xa2\xe0\x21\x51\x4c\x98\x28\xe6\x0a\x51\x0c\x47\xf2\x70\x0d\x7f\x5b\xbb\x72\x5d\xfe\xd7\x5f\xd0\xf8\x40\x8f\x9c\x7e\xb1\xd3\xc9\x0a\x22\x78\xbe\x26\xe0\x2a\x20\x18\x5a\x4b\x8b\x0c\x88\x0a\x2d\xfc\x44\x06\x44\x87\x17\x0b\xa2\x02\x62\xc2\x09\xe6\xa8\x80\xd8\x70\x0a\x32\x2a\xa0\x0f\x59\xab\xa8\x80\xf8\x10\xa0\x73\x65\x49\x57\x01\x09\xa1\xec\xcc\xb9\x32\x8c\xeb\x0a\x49\x86\x20\x45\xee\xff\xe3\xaa\xa2\x47\x14\xe0\xb8\xae\xe8\x21\x9a\xa8\xd0\x3c\x2d\x3a\x24\x3a\x3c\x6f\x88\x0c\x89\x39\x0e\x64\xcf\xd5\xac\x5c\x07\xc4\x1e\x03\x8a\xce\x1b\x77\x1c\x24\x46\xa7\x88\x0f\x45\x9b\x91\x01\x09\xc7\x01\x58\x64\x8a\x8e\xea\x8c\x1e\xb1\x93\xa3\x4a\x23\xf6\x11\x8a\xe0\x31\xa0\xf3\xb5\x46\xf7\xbe\x64\xf6\x19\xd5\x46\xd7\xde\x29\x78\x4f\xbd\xd1\xd9\x57\xca\x3e\xc1\xbb\x1e\xbc\x7d\x08\xd1\x58\x45\x0c\x4d\x21\xac\xf1\x14\x07\x65\x9a\x42\x2c\x46\x48\x50\x30\x54\x05\x5e\xe0\x00\x0f\x69\x19\x29\x40\xe1\x35\x88\x49\x15\xa8\x90\xa3\x34\x99\x92\x19\x06\x42\x08\xfc\x73\x40\xc0\x26\xb9\x1d\x39\x11\x71\xb0\x4d\x83\xdb\x16\xa6\x9f\x3d\x77\x4d\x20\xe9\xb3\x07\xee\xec\xee\x1e\x45\x09\x41\x45\x7b\x81\x1d\x62\x83\x1a\x8e\xed\x1c\xdf\xcc\x98\xa9\x38\xd6\x15\x8a\xab\x76\xbd\x6c\xa1\xb0\xea\xb4\xf9\x79\xdb\x78\x4b\xa0\xe4\x94\x29\x32\xfe\x0e\xd6\xe0\xbc\x32\x7f\xdf\x45\x3a\x54\x70\x9d\xd8\x7f\xf4\x9b\x26\xda\xed\xf2\x66\x87\x5d\x12\x4c\x13\x6a\xd6\x6e\x4e\xf5\xd2\xac\xe6\xa5\xb8\xc4\x20\x57\xa4\xca\x58\x50\xdb\x55\x2d\x93\x8b\xe5\x0d\x26\x3f\x6b\x55\x62\x6f\xa2\xc7\xf9\x9b\x3d\xd2\xe9\x76\x3b\xd8\xdb\x21\x16\x52\x7c\xa6\xba\xe8\x6a\x54\xb2\x34\x6c\x17\x66\xd4\xfb\x60\xe5\xb2\x68\x0a\xb3\xa8\x94\xcd\x92\x2e\x93\xa0\x60\xbd\xdd\xaa\x19\xde\x60\xb3\xdb\x62\xe6\xcc\xf5\x03\x7a\x4e\x16\xb9\x67\x76\xfc\xd4\xa4\xb7\x56\x42\x78\x37\xf0\x68\x55\x72\x27\xf1\xb7\x22\xe5\x25\x33\x09\x41\x5b\x94\xac\xb7\x19\x4a\xa4\x26\x83\x65\x0d\x73\xaa\xe5\x26\x73\xd9\x82\x59\x6e\xc7\x17\x39\x9a\xe5\xf4\x59\xa5\xdb\xb0\xe4\x34\x69\xd3\xe3\xa4\xa2\x56\x34\x4f\x48\x58\x0b\x35\xc7\xbe\x99\x6f\xe6\x40\x9f\xf7\xfe\x7a\x39\xdc\x31\x70\xb8\x4f\x64\xff\x31\xb5\xff\x31\x10\x53\x05\x26\xe3\x62\x85\x66\x7a\x89\x14\xe5\x65\xdb\xe9\x0a\xa8\x53\x22\x59\xc2\xa3\x2a\x9f\xaf\xb3\x56\x19\x88\x02\xee\x18\xea\x32\xe7\xb5\x42\xf0\x9e\x23\xaf\xe8\xfd\x25\x16\x59\x7e\x83\x3f\x80\xb5\xe7\xbf\xb6\xd3\x17\x9f\xdf\xe4\xc1\x71\x00\xce\x7b\x99\x2d\xe2\x0a\xd2\x87\x8b\x12\x6a\x55\x05\x36\xb1\xd2\x5c\x01\x93\x8a\xed\x94\xdf\xba\xab\x44\x27\x3f\x4a\xdb\x05\x6e\x34\x1b\x05\x0f\x55\x18\x27\x97\xda\xeb\x5f\x40\x6b\xf8\xd8\x0b\x31\xb4\xa9\x33\x90\xb7\xba\xea\x84\x4f\x8c\xf9\xf0\x4c\x71\xff\x3d\x39\xb5\x29\xdb\xa3\x99\xf7\x64\x55\x5a\x4c\x6a\x71\xca\xce\x96\x63\x2b\xc0\xd5\x97\x86\x0b\x4c\xad\x94\xee\x8d\x6b\x1d\xdd\x99\x36\x62\xcd\xe0\x01\x6e\xec\x6e\x76\x78\xfb\xfc\xb7\x42\xfd\x7b\x44\xcb\xf6\x0a\xf4\x33\x41\x95\xdf\x2e\x6d\xc4\xf0\xef\xd9\x3b\x78\xc9\x9a\x18\x55\x5f\x1e\xe9\x5f\x5f\x7e\x5a\x7c\x7b\xf1\xe2\xb1\x7d\x25\xdb\xe2\x6c\x18\xbf\x49\xbe\x01\xaf\x5c\xaf\xc8\x8b\xdc\xd0\xd4\xa5\x2a\x26\xd5\x56\x8b\x6b\x67\x95\x54\x6d\xc1\xd6\xe2\x73\x33\xfb\xae\x50\xad\x14\x60\x50\x9e\xca\x19\x20\xd0\xef\x76\x8b\xdc\x08\xa9\xd8\xa1\xd3\x24\x1e\x54\x58\x71\x29\x24\xc9\xaa\x9b\x91\xf4\x99\x02\x38\x00\x5a\x02\xdf\x1b\xd2\xe3\xe2\x68\x2c\xd4\x38\x66\x94\xa4\x66\x01\xab\x63\x26\x3f\x4f\xec\x28\x8f\xcf\x77\xf4\x04\xf4\xe7\x46\xdd\xf2\x8c\x3f\x4f\x7a\x70\x28\x97\xb8\x3d\x50\x45\x4c\x79\xfa\x6c\x9e\x9a\x56\x3a\x62\x4d\xe0\xea\xa0\xde\xf4\x5a\xea\xbc\x9c\xca\x4e\x52\xf1\x64\x0b\x4f\x56\x6a\xad\xda\x35\x6d\x4b\x31\x8a\xed\x10\xff\x89\x7a\xbb\xdd\xd8\xc8\x5f\x8f\x27\x86\x7c\x9b\x12\xe6\xc3\x1c\x68\x38\x02\x6b\x2b\x5c\x65\xec\x78\x03\x38\x4c\x2c\x84\x62\xa5\xa6\x0a\xa3\x76\x5b\xca\x39\xbd\xc6\xa3\xfc\xef\xf5\xeb\xc2\x78\x78\xd0\x3f\x7a\x94\xfe\x39\x80\xdf\x6a\xb7\x5b\x9b\x6d\xa4\x76\x75\xde\x8b\xa7\xd5\xb8\x92\x5b\x96\x5b\xef\x71\xfc\x9e\xad\xac\x26\xef\x5c\x4f\xb5\xe7\x8a\xd6\x58\x8d\xb2\xda\x5b\xba\x5d\x4f\x16\xa0\xe4\xcb\xf7\x11\xfd\xac\xd3\x68\x73\xda\xc7\x81\x7d\x84\xae\x87\xed\x27\x7a\xff\x49\xa5\x4a\x8e\xbc\x60\x3f\x07\x57\xae\x34\x68\x7f\xd8\x86\xfb\xb0\xfd\x44\xf7\x0f\xb5\x44\x69\x79\xc9\x7e\x0e\xae\x93\x83\xec\xde\x7e\x82\xf6\x77\xc6\x1b\x0f\xe8\x93\x98\x55\x80\x29\x66\xf7\xa4\x9f\x94\xf7\x7e\x33\xe9\x97\xd3\x57\x90\x47\xd6\x55\xfa\x7c\xf9\xd9\xd1\xe9\x6b\xb7\x9b\xf5\x0d\x28\x4f\xd6\xbb\x75\x56\xe2\xec\x54\x91\x2c\xd6\x62\xf3\x5e\x23\x29\xac\xba\xb3\x6e\xbb\x49\x2d\x8c\xaa\xd1\x9b\x36\x64\x90\x9a\x8d\x6b\x45\x1c\xe8\x67\x2a\x65\x94\x4f\xd3\xf7\xc1\xbe\x4e\x75\xbd\x4f\x6f\x72\xaf\x2f\xf7\xfa\xfb\x07\xc6\x03\x49\x6c\x96\xdc\xdb\xec\xed\x83\xff\xfd\x6b\x1f\xbb\xf8\xfd\xea\x8b\xb1\xb0\xbf\x1f\x25\x36\xd8\x1c\xa6\xaa\xef\x08\x78\x62\x6c\xe0\xee\xbf\xdf\xab\x1b\xa9\x29\x5a\x06\x0a\x96\xdc\x23\x0d\x9f\x9a\x14\xb6\xf3\xa0\x4b\x7c\xdb\x3a\x7d\xf9\xf2\xfb\x77\xdd\xac\x65\xe1\x7b\x9e\x6d\x96\x96\x4b\x4b\x18\xcd\x30\x99\xeb\x65\x41\x5c\x5a\xaa\x63\xc1\x96\x2a\xe3\x6c\x3e\xc1\x79\x10\xcf\x73\xba\xf2\xde\x02\xdd\xb8\x34\x1c\x3a\xd3\x24\xcf\xa8\x05\xd5\xed\x36\x86\x46\x2f\xbf\x20\x99\x18\x45\x66\xb4\x34\x39\x9c\x8c\xdb\xe3\x4e\x26\x95\xd0\xff\xfa\xcb\xcf\xa4\x5b\xb6\x85\x77\x5b\x86\x83\xbf\xeb\xd9\xa3\x3f\x49\xba\x3e\x85\x3e\x7c\xdb\xb3\x0c\x20\xab\x40\x48\xab\x18\x50\x3c\x27\x40\x0e\x71\x94\x0a\x59\xc0\x63\x1a\x52\x34\x80\xc1\x69\x92\x1c\xa4\x55\x4a\xa5\x21\xc5\xf3\x0a\x89\x79\x85\xc3\x02\x87\xd4\xcd\xd9\x12\xe4\xf3\xa6\x79\xec\x95\x69\x1e\x0b\x04\x48\x9d\x3f\x1b\x66\x7b\xf7\x28\x87\xfb\xe8\x34\x2f\x6c\xeb\x4f\x9c\xe6\x89\x21\x55\x3a\xed\x56\xfc\x0b\x6d\x87\x85\x84\x08\x48\x0d\x98\xea\xa2\xb0\x64\x66\xde\xac\xf6\xc6\x64\xec\xa4\xab\xb0\xc2\x22\x47\xce\x12\xca\xbc\x22\xa1\xa4\x29\xa4\x3d\x2b\x06\x27\xed\x74\x51\xae\x75\x57\xc9\x56\x6e\xd5\xcc\xa2\xa9\x32\x89\xc7\x20\xa5\x50\x66\x1a\x39\xc2\xa2\xc8\x7b\x28\xeb\x55\x12\xb1\x37\x67\x0e\x52\xfa\x5f\x77\x4e\xd9\x0e\xae\x7b\xcd\x6e\x0f\xf4\xd3\x65\x77\x76\x1a\x76\x10\x62\x44\x99\x86\x05\x47\x34\xef\xe1\x89\xa7\x43\x96\x53\x57\xe2\xc9\xf8\xa5\x28\xf8\x13\xbe\x3c\x3e\x65\x68\x4f\x7e\xc0\x78\x76\x08\x97\x3e\x03\xff\x73\x5c\x8b\x7f\xd9\x7b\x7e\x7e\x62\x1d\xf7\xaf\x47\xc3\xcc\x4f\x09\x93\xc2\x7d\xf0\xb7\x0b\xe3\x4e\x85\x42\x07\x87\x9a\x44\xd1\xd7\x61\x2b\x04\xef\x07\xda\xcb\x3d\xf8\x03\xff\xf0\xef\xcf\x72\x3e\xcf\x0d\x6b\x48\x59\x83\x24\x09\x68\x80\x38\x4e\xc3\x32\x42\x82\x00\x69\x8d\x86\x14\x56\x19\x9e\xa3\x05\x41\x86\x9c\x82\x05\x92\x56\x04\x28\xb0\x1c\x22\x69\x04\xa0\x06\x79\x99\x42\x8c\x8c\x19\xfe\xe5\x95\x10\x9e\x17\xd5\x30\xd7\xa2\x1a\x0a\x08\xe4\xf9\x93\xb3\xb7\x77\x8f\x16\x94\x1f\x8d\x6a\xc2\xa3\xe4\xcf\x91\xbc\xbe\x29\x59\x73\x90\xbc\x2e\x0e\xd4\x19\xdb\xab\xaf\x74\x2f\x3f\xe1\x72\xb0\x50\x5e\xb6\x2a\x65\xa9\x69\xb3\x63\x56\x89\xd7\x55\xa7\x9b\xf6\x2c\xa9\x21\xd7\xa8\x78\xa5\x54\xee\xe2\xd1\x28\x4e\x61\x9b\xec\x29\x14\xc9\xb8\x05\x26\xb6\x1c\x34\x8b\xa5\x65\xd2\xa8\xe5\x2c\x2b\x55\xf2\xba\x93\x72\x3b\x2f\xe8\x7f\xa3\xe4\xf5\x81\xbc\x1e\x4d\x6e\xfa\xd7\xb5\xe4\xf5\x81\x28\xa2\x44\x2d\x60\xaf\x7f\xc9\x03\x7c\x62\x58\x96\x27\xae\xc4\x93\xf1\x3f\x10\xb5\x95\xc4\xe3\x93\xb8\xbe\x30\x99\x1b\x90\x72\x3e\x19\x55\x2c\xd6\xba\xda\x85\x64\xae\x8f\xf6\x20\x4a\xb8\x37\x99\x1b\xdd\x0b\x5f\x48\x46\x05\x32\x37\x6b\x45\x3a\xfe\x61\x31\x63\x77\xf9\xfd\x95\xd0\xf7\xa2\xff\x21\xf6\xf6\x00\xff\x15\xc6\xd9\x78\xee\x0b\x51\xdc\xbe\x7f\xfe\x0f\x27\xdb\x1f\xb6\x9f\xe8\xfd\xd7\xb0\xd3\xbc\x7e\x5b\x32\xd7\xae\xb0\xdc\x85\xfe\x89\x66\x3f\x0f\x2c\x0e\xdc\x1e\xc5\x26\x53\xb9\x76\x2f\x4c\x79\x30\xde\x3d\x90\x8c\x8c\xae\x4f\xc1\x75\x32\x19\xb9\xbf\x0e\xc6\xf7\x2f\xa7\xef\xfc\xe2\x5e\x48\x7e\xc1\x8f\x5f\x9e\xcc\x7d\x4f\x68\xb9\x4f\x97\xdf\x03\xf4\x9d\x5f\xdc\x09\xae\x53\xb3\xa8\x83\xf8\x29\xca\x2c\x66\x44\xef\xe1\x1d\xc4\x13\x87\xd7\xe5\x59\xd4\x13\x67\x71\xf7\xe0\xdf\xcc\xa2\xa6\x69\x18\x9f\x0c\xb2\x95\x24\x39\xb6\xdc\x61\xcf\xa6\xf2\x35\x9a\xac\x57\x86\xef\xf2\x64\x25\xa4\xa1\xa7\x74\xa0\x52\xcf\x7b\x29\x8d\xa7\xe7\x40\x65\x1b\xcd\xb8\xca\x0e\xeb\x83\x95\xd6\x1c\xcf\x1d\x8b\x2b\xa4\x4b\xee\x2a\x57\xc8\x8b\x06\x56\x4a\x4b\x80\x47\xa0\x65\xc1\xe7\x27\x87\x69\x44\x22\x05\xb0\x58\xa0\x79\x0e\x90\x40\x10\x58\x46\x90\x49\xcc\x03\x0a\xc8\x98\x64\x55\x8d\x11\x68\x1a\x33\x1c\x4f\xb2\x0a\xa9\xca\x1c\x84\x3c\x23\x60\x1a\xf3\x08\xa9\x00\xfb\x2f\x1b\xe2\x37\xb3\xa8\xa8\x3b\x5a\xee\x28\x01\x62\x69\x06\x9c\x7f\xe5\xd6\xfa\x26\x78\x09\x15\xd3\x06\x4a\x79\xe7\x20\x7e\x4f\x05\xd0\x0f\x71\xc2\xc9\xd8\x6c\xa3\x8d\x69\xf1\x6c\xa4\x21\xed\xf8\xa9\x65\x92\xb3\x62\xbd\x32\xcf\x7a\x99\x0c\x3b\x86\xd5\x3c\x99\xcb\xad\xa8\x74\x3d\x9b\x69\x2d\x84\xce\x52\x7f\x2f\x77\xb3\xe5\x5a\xb5\x4c\xf6\x26\xa3\xb8\xdd\x2c\x9b\x5e\x5e\x9c\x56\x2d\x06\xa6\xdf\x62\x15\x4e\xcb\x8d\x67\x4a\x56\xd3\x4a\xc5\x76\x29\x99\x4e\x95\x53\x4d\x3d\x6d\x39\xb9\x5a\x29\x7a\x3a\x39\x52\xd0\xf3\x33\xcb\xfb\xaf\xf3\x13\xaa\x83\x56\xf7\x06\xb4\xa7\xaa\x81\x3e\xe2\xbe\x32\xa1\x79\x1e\xfe\x33\xbc\x5f\x49\x43\xef\x03\xfe\x20\xa2\x8b\x5e\x7d\x11\x90\xf2\x63\xaa\x2f\xf6\x25\x64\x3e\x3d\x27\x47\xfe\xd4\x9e\xdf\x2f\xaf\x5e\xf2\xaf\xf3\xab\xc1\xeb\xa8\xbd\x7a\xad\x7a\xe9\xef\x39\xe1\x9d\x8b\xc7\xb3\xfc\x7b\xc7\x96\xf0\x0a\xf1\xe9\xfe\x3d\x3d\xc4\xee\x9a\x3e\x1b\xff\xe9\x4a\x83\xf3\xfc\x2b\xe2\x8f\x98\xb0\x14\xf4\xee\xf2\xb6\x09\x4b\x62\x51\xe5\x4e\xaf\xba\x07\xe3\xd3\x97\x57\x2b\x9d\x0f\xb8\xc3\x5d\x5f\x48\x4d\xa7\x47\x49\x8b\x93\xd5\x13\xd9\x83\x06\xf7\x8e\x6d\xa7\x96\xb8\x3e\x0e\xaa\x97\x83\xdd\xdc\x63\xf8\x0f\x2b\x3b\xef\xc1\xbf\x09\x76\x7b\x05\xde\x93\x38\x11\x93\x3d\xf9\x5d\xee\xf1\x56\x4d\x1f\x56\x95\xb6\xa4\xbc\x35\xb3\x40\x2e\x24\x6d\xa0\x28\x40\xe4\xa9\xba\x31\x6e\xc6\x06\x25\xd8\x21\x47\x49\x3a\xa6\x59\xbd\xb6\x45\x73\x1e\x6f\x20\x61\xae\x0a\xfc\xdc\x6b\xcd\x73\xad\x12\x59\xae\x88\x1d\xec\x0e\xc4\xf9\xb3\x83\x5d\xc0\xd2\x88\x21\x59\x1a\xcb\x88\xa5\x35\xa8\xa8\x32\x52\x65\x9e\x61\x65\x8d\xa2\x69\x9e\xe6\x19\x4d\x61\x21\x0b\x69\x0e\xa9\x88\xc2\x2a\x25\x28\xaa\xaa\x91\x1a\x2b\x90\x10\x50\x94\xec\xbf\x86\xc9\xff\x17\x7d\x9b\x63\xb0\x5b\xef\x52\x8c\xcb\x41\x78\xfe\x05\x69\xfe\x4d\xf0\x72\xbc\x59\x24\x50\xc5\x4c\x91\xcf\xd6\x66\xb5\x91\x5c\x80\x59\x91\xea\xb4\x87\x75\xa7\x30\x1e\x76\x49\x52\xcb\xf0\x6e\x31\xc7\x8d\x49\xa9\x3e\xcf\x77\xe2\x62\x97\x12\x8f\x5f\xca\x1d\x9e\xd7\x7c\x18\x6a\x22\x84\x0d\x85\x43\x78\xed\xd9\x3c\x2d\xcc\x7d\xa5\x6a\x48\x6f\xc6\x9b\x8c\xd3\xf3\xa4\xeb\x14\x12\x56\x21\x37\x75\xe3\x24\xd3\xf6\xf2\xa9\x84\xa3\xdb\xee\x74\x50\xac\xc5\x5b\x6c\xb7\x35\xa4\xbd\x79\x67\x39\x70\xb9\x96\xd7\xa0\x93\x25\xbc\xa8\x94\xd8\xfc\xbb\xa2\xbd\xe7\x0b\x80\xec\x98\x89\xd1\x68\x6e\xd1\x3a\x5f\xcd\x69\xc3\x5c\xe6\x86\x30\xf4\x48\x67\x8f\x43\xb5\x03\x9e\x83\xb7\x86\x84\x64\x92\x30\xe2\x09\xb2\x48\xe6\x33\x4b\x6f\x30\x2f\x03\xb3\x47\xa2\xe5\xc4\x06\x42\x39\xbb\x98\x15\x93\xcb\x0a\xe3\x25\x24\x25\x19\xf0\x48\xe9\x9e\x53\x76\x96\xcd\xfa\xfc\x1a\x11\x57\xcc\xf9\x01\xfc\xa5\x79\x71\x3c\x79\x00\xbf\x18\xc2\x1f\x65\x38\xd9\xbc\x84\xeb\xe4\xbb\x56\x2e\xe1\x3f\x39\xb4\x3e\x20\x8b\x8a\xd5\x8b\xc7\x0e\xde\xb5\x7d\x26\x54\xfd\xb4\xbe\x58\xe3\xe7\x0f\xde\x6c\x9c\xbb\x5b\x16\xff\x96\x06\x99\xde\xb8\x43\x0d\x14\xd1\x29\x2c\xf5\xb7\xa5\x51\x74\xaa\x42\xa5\x2d\x37\x6a\x73\x44\x17\x8a\x45\xbb\x41\x56\x41\xc5\x04\xb9\x58\x51\x49\xbb\xb6\x5c\x01\xc5\xd6\x54\x1c\x66\xdd\xe6\xb0\x62\x20\x2b\xcb\x1a\x0d\x4f\x4d\x4f\x6a\x6f\xf9\x52\x3e\x96\xab\xa6\x96\x59\x7a\xf9\xfc\x3c\x02\x54\x49\x15\xb2\xb4\x2a\x60\x88\x29\x8a\xa5\x15\x28\x68\x48\x63\x11\x8b\x15\x1e\x30\x88\x47\x3c\x66\x11\xcd\x62\x48\x91\x02\xab\x22\x40\x03\xa0\x41\x61\xfd\x4d\xe5\x78\x0e\xc0\x97\x57\x82\x7b\x5e\x1e\xe1\x6a\x8d\x19\xc3\x31\xf0\xec\x1b\x64\xfc\xbb\xec\x4b\x68\x33\xed\xa3\x89\x84\xab\x35\x66\x3f\x64\x62\x9b\xea\x8c\xd8\x5a\x22\x59\x19\x76\xb3\xa1\x51\xfb\xd0\x0a\xf6\x89\x84\xac\xad\x61\x4a\xd6\xd5\x61\x42\x65\x59\x5a\x74\xde\x9d\x42\x71\x08\xe3\x06\xa2\xe5\x22\x62\x7a\x66\x26\x5e\x2a\x72\xd3\x74\xbb\x5e\xe8\x34\xe5\x09\x69\x4e\xe4\x42\x12\x91\x72\xba\xce\x88\x92\x95\xcc\xa6\xe2\xe9\x65\x5e\x2f\x0c\xa8\xa6\x51\xae\x4c\x0a\x54\x36\x5d\x1f\x75\x6a\xfc\x17\x27\x12\x72\x3f\xb1\xbc\xcf\x27\x12\x0e\x26\xd2\x91\x26\xf2\x1f\xea\xd9\xae\x6d\x2b\xda\x5f\xe1\x89\xfc\xa3\xf8\x6f\xdb\xd6\x74\x1e\x7f\x10\x6c\x47\x4f\x24\x04\x23\xfa\x8f\x49\x24\x80\x49\x65\x24\xd6\x86\x36\x58\xac\xa6\x68\x79\xda\x43\x1e\xac\x84\xfe\xc4\x13\xa3\xd4\x29\xfa\xa5\x7d\xff\xfc\xc4\x2b\x7f\x4a\x33\xb6\xfa\x20\xf5\xfd\x44\x7a\xc3\x5f\x84\x89\x7c\x76\xaf\x5f\xb7\x95\x9a\x1f\x5c\xb5\xcf\xc0\x7f\x47\x22\xc3\xe7\xbf\x27\xfe\x88\xca\x01\xff\xba\x90\x48\x38\xef\x9b\xf6\x3c\xfd\xfd\x12\x6f\x27\xa3\xdd\xcc\x41\x83\x08\x91\xf7\x87\xda\xc3\x6b\xb5\xb2\x07\xd7\x81\xed\x46\xc6\xff\xa1\xf6\xf0\x46\xfc\x9b\x68\x17\x0f\x04\x4e\x9d\x26\x60\x29\x4d\x39\x8e\x9e\x9c\xbe\xbb\xf6\xb4\x2a\xc7\xf2\xce\xc0\xf5\x1c\xd3\x68\xc9\xfc\x7c\x36\xa5\xdb\x6d\x69\xf2\x56\x9e\x5a\x8d\x8e\xe9\xda\x79\xa7\xee\xb6\xb3\x23\xb1\xa1\xe4\x94\x2a\xdf\xcd\x8d\xc5\xf7\xac\x5a\xc9\x91\xec\xc8\x51\x94\x76\xa6\xfe\x96\x7a\x7a\x22\x81\x62\x58\x8c\x15\xa0\x91\x34\x05\x65\x59\x96\x11\x29\xa8\xaa\xa2\x00\x81\xe2\x30\xe4\x21\x43\x21\x5a\x55\x78\x2c\xf0\x9a\xc6\x71\x2a\x83\x05\x15\x63\x40\x93\x32\x66\x48\x81\x42\xfe\xeb\xd7\xd9\xe7\x45\xbb\x57\x6b\x0f\x59\x96\xbb\xf4\x42\x76\x4e\x00\x2f\xa1\x03\x5f\x1e\x0d\x76\xaf\x96\x1e\xfe\x98\xe0\x6b\xe7\xb0\x2e\xed\x13\xdd\x07\xbb\x12\x2b\x8e\x96\xa9\x58\x97\xaa\xda\x0a\x9b\x1e\xb2\x26\x32\x7b\xb3\x71\xb6\xa5\xca\x65\x8a\x9f\x4e\x2d\x36\xd9\x65\x4a\x4a\x5c\xc9\x5b\xe9\x1a\x7a\xf7\xde\x12\x15\x5b\x9c\xa7\x2c\xaf\x69\x82\xcc\x2a\xae\x71\x0e\xae\x4f\xba\x4a\xbe\xd7\x50\x6b\xb1\x89\xa4\xb4\xac\x38\xac\x8a\xd2\x17\x07\xbb\x3f\xb0\x54\xe8\xaa\xbc\x2f\x04\xbb\x07\x81\x45\x94\x60\xf3\xd1\x32\xc4\x27\xe2\x8f\x54\x86\x78\x10\xec\x66\x0e\x9e\xff\xbb\xed\x59\xde\xa7\x82\xce\x24\x95\x4f\x95\x2d\xfd\x14\xce\xfb\xa4\x3e\xfc\x44\xf4\x85\x53\x6d\x27\xaf\x4f\x09\x28\xee\x2d\xc3\xf9\x81\x01\x8d\xdf\x3e\x7d\xd0\xe6\x67\x98\x8c\x9c\x96\xcf\xcf\x43\xdf\xc7\xf4\x7f\x28\xf8\xbe\x5c\xea\x15\xa5\x8f\x1f\x2e\xf5\x7a\xa2\x8e\x45\x28\xf5\x6a\xda\xc9\x66\xae\xca\x68\x4a\x6c\xb0\xb2\x3b\xd5\xf7\xf6\x7b\xdb\x88\xf5\xd4\x3a\x70\x29\x6d\xc9\xb2\x9a\x9d\xd7\x46\x8b\x95\x30\x1f\x2b\xed\xc4\xfb\x3b\x18\x49\xac\x9e\x12\x2b\x18\x54\xba\x2d\xb9\x2a\xc4\xa7\x1e\x93\x31\xd5\xb9\x39\xc8\x83\x14\x3b\xaa\x2f\x1a\x5a\xbc\xc7\x8b\xb5\x67\x07\xad\x98\xd6\xb0\x2c\xb3\x08\xc9\x8c\xc6\x53\xaa\x46\x2b\x40\x90\x69\x0d\x68\xac\xcc\xb3\x3c\xa7\x01\xc0\xf3\x2c\x60\x05\x2c\x08\x2c\x06\xac\x8c\x10\xc7\x20\xa4\x40\x95\x47\xa4\xa0\xb0\xfc\xcb\x2b\xc1\x6c\x37\xcc\x44\x7c\x9d\xc2\x41\xd0\x4a\x5d\x0b\x5a\x39\x9e\xa7\xf8\xb3\x51\xeb\xfa\xee\x3a\xa6\x3d\x3a\x14\xf0\x25\x8a\x25\x1c\x44\xad\x27\x47\xfe\x03\x2d\xfb\xf2\x34\xcc\x01\xfe\x1d\xbd\x35\x49\x1f\x74\x12\xc5\xd4\x70\x5c\x2e\xae\x94\x6a\x9a\xb5\x79\xf5\xbd\x95\x2d\xb9\x39\xb2\x33\xf0\xbc\x8e\x14\x17\x13\x8d\x02\xca\x96\x95\x18\x99\x7e\x77\xd3\xb1\xa9\xc1\xc4\xf0\x68\x49\x4b\xf5\xe5\x54\x10\x7a\x75\x36\x21\x65\xd3\x74\xd9\xd4\x97\x45\xab\xf1\x4e\xad\x94\x94\x23\xd4\xec\x5b\xa2\xd2\xd3\x05\x9f\xe1\xc8\xed\xe0\xd1\x7b\x4f\x8b\xa8\x30\x4e\xde\xda\xf7\xc7\x99\xeb\x96\x6d\xaf\x4f\xc1\x7f\x26\x55\x72\x19\xff\x87\x51\xf1\xab\x47\xf6\x80\x94\x5b\x3c\xcf\x4f\xea\x19\xaf\x2d\x02\xde\x5d\xfc\xfd\xc0\x82\x64\x48\x56\x91\xf1\x8f\x95\x68\xf8\x37\x1e\xa6\x91\x4c\xf7\x24\xb7\x52\xe9\x91\xb3\xf2\x9c\xef\xbe\x0f\x17\x70\x52\x53\x96\xf3\x61\x1d\x65\x20\xe8\x35\x79\x31\x9d\x9b\xd8\x0a\x58\x71\xb5\xce\xfb\xbc\xcb\xb2\x45\x8b\x61\x9b\x45\xbd\x9e\x2d\x70\x14\x18\x64\x6d\xa9\xa6\x74\x75\xd8\x49\xe5\xa6\x6a\xc1\xd1\xca\xf3\xca\x0c\x24\x9f\xbf\x08\xc8\x53\x1c\x02\x32\xa5\x62\x0d\x2a\x50\x55\x35\x55\x51\x31\x23\xd3\xb4\xac\x91\xbc\xca\x21\x00\x90\x40\x41\x5e\xe5\x39\x52\xd5\x00\xa7\x21\x28\xcb\x2c\xab\xd2\x0a\x4f\x41\x96\x54\xb8\xe0\xcd\xfc\xe0\x91\xd7\xc0\xdc\xe3\x61\x04\x70\x21\x2d\xb2\xbe\xe9\x9f\x70\x78\x78\xc4\x6b\xa0\x94\x77\x4e\x83\xef\x71\x30\x5f\xbd\xe3\x60\x7f\x65\x77\xf4\xd6\x32\x76\xad\x6a\xa4\xc8\xac\x94\x30\xc8\x16\xaf\x64\xcb\xac\x65\xbe\x51\xf6\x48\xd2\xd4\xb1\xc7\x8d\xdf\x47\xb5\x6c\xce\x83\xde\xb4\x5e\x44\x6f\x6f\xc0\x28\xd5\xe6\x2d\x9a\x2a\xf1\xb3\x98\xe5\xe5\x6b\xae\x48\x2b\x10\x27\xba\x9e\x90\xe9\x4d\xe2\x50\x48\x17\x87\x96\x8c\x40\x6d\xfe\x3c\x07\x73\xd0\x28\xc2\x0e\xad\xc7\x1d\xcc\xf3\xf0\x3f\xd1\xc1\xdc\xbb\xc3\xe1\x53\x0a\x36\xc3\x3c\x48\x3f\x84\xbe\xc7\x1d\x4c\xf4\x34\x47\x74\x07\x23\x3d\x86\xff\x41\x07\x83\x06\x62\x2c\x57\xad\x29\xb5\x4c\xb1\xde\x5c\xcc\x15\xea\x1d\xb7\x2d\x6c\xd4\xea\x02\x44\xd4\x14\xbd\xd7\x45\xc5\xa0\x10\x64\x24\x6f\x62\x5a\x9d\xdc\x22\x95\x68\x0e\x95\xd5\x32\xce\x62\xd2\x4c\xce\x53\x83\xd5\x1b\x9d\xc6\x14\xf9\x66\x58\x71\x99\x6c\x4d\x2b\xaa\xe7\xb4\x53\xe2\xf3\xab\x4c\x28\x96\x51\x28\x85\x16\x34\x8a\x63\x99\xb5\x1b\xe1\x19\x56\x56\x10\x0b\x19\x92\x12\x58\x56\x23\x31\x64\x05\x04\x35\x06\x28\xaa\xcc\xf2\x0a\x86\x18\x03\x01\x71\x1a\x0f\x69\x06\x05\xe5\x77\xd4\x63\x05\x7c\xd7\xfc\x0a\x07\xaf\x54\xf0\x41\x92\x7f\x39\x3e\x5c\xf9\xd1\x0a\xbe\x0b\xe9\xf6\xe0\x8a\xbe\x93\x35\x80\xb7\xaf\xe0\x4b\xc4\xf3\x09\x7d\x96\x2b\x71\x40\x2f\x26\x72\x03\xb2\x59\x29\x0b\x72\xcc\x8c\x89\x93\xb7\x15\x48\x16\x52\x35\xa3\x95\x6e\xb4\x49\x57\xa9\xeb\xd3\x04\x40\xd6\xb2\x34\x2f\xd5\x59\x97\x69\x18\x28\x39\xf7\x52\xd6\xc2\xad\x5a\x08\xc0\xba\xda\xaa\x15\xcc\x2c\x44\xb8\x24\x2e\xf9\xec\xcf\x55\xc1\xf7\x68\x05\xdd\xa3\x55\x63\x45\x72\xc4\x26\x9e\x58\xc1\xf7\x95\xe3\xd9\x67\x54\xf0\x45\xad\xa0\x13\x9f\x54\xc1\xc7\x1d\x54\xe3\x7f\x58\xcf\xbf\x2a\x8b\x7f\x6b\xcb\x5a\xaf\xb8\x4c\x55\x84\x5e\x72\xde\xc8\xa9\xd2\x6a\xa8\x75\xe2\x13\x4d\x2f\x74\x14\xa1\x66\xe8\x64\xce\x4c\xb4\x4c\xb5\x98\x95\x7a\x45\x5d\xed\x4c\xf8\x61\x29\x25\x61\xa7\xd2\xb2\xc7\xba\x5b\xac\x31\xbc\x9c\x62\xa0\xa7\x8e\xba\x6d\x29\x39\xa9\x0b\x63\x6b\x28\x96\x66\x89\xa7\xaf\x69\x92\x24\x92\x05\x45\x53\x30\x94\x69\x85\x06\x34\x50\x79\x59\x66\x39\x96\x57\x55\x52\xa0\x65\x55\x96\x81\xc2\xd1\x24\xcb\x01\x52\x95\x65\x4a\x46\x24\xd6\x04\x9e\xe7\x48\x8d\xa5\x10\xe5\xef\x04\xa4\x9e\xb7\xa6\x79\x75\x90\x25\x39\x8a\x66\xcf\x0e\xb2\xdb\xbb\x47\xaf\x55\x78\x74\x51\xf3\x42\xf4\x1e\x54\x4d\x44\x8a\xc6\xa9\x50\xd5\x43\xa0\xb5\xfb\x45\xc8\x62\x5b\xce\xe5\x62\xa0\x88\x8d\xd5\x42\xb7\x94\x54\x8e\x66\x0b\xd9\x65\xc2\x23\x99\x58\x56\x80\x16\x88\xd5\x29\xc8\xe7\x85\x55\xd9\x84\x9a\x9e\xef\x40\x4b\xb3\xa8\x74\xce\x2e\xb6\x5d\xf8\xde\x06\xb1\x64\x6b\xe2\x00\x08\x10\x4c\x70\x62\x89\xcd\x16\x1c\xda\x4a\x14\xc5\xdc\x2d\xd1\xf8\x61\x52\xf5\x6c\x34\x2e\x3e\x56\x15\x96\xaf\xec\xe5\x7b\xe6\xba\x12\x0d\x3f\x0f\x7f\xb4\x68\x7c\xef\x71\x9e\x98\x04\x8f\x54\xa7\xfc\x6c\xfc\x1f\xe5\x71\xd9\xe3\x3c\x92\xee\xfa\xc4\xd9\xc8\x35\x8f\xf4\x95\xf5\xed\xe2\x93\xfa\xea\xc1\x68\xdf\x6b\xbb\xfa\x90\x6b\x79\x6c\xb1\x9a\x49\xaa\xf3\xd2\x70\x68\xdb\x5a\x2e\x43\x35\x2d\x5a\xa3\x90\xd6\x65\xb2\x9a\x3c\xb7\xa8\x12\xec\xbe\xc5\x44\x53\x46\x6a\x4c\x53\x5a\x86\xee\x75\x56\x68\xd2\xed\xd2\xf9\xc6\x78\xd6\x95\xdb\x4e\x2f\xeb\x8a\x2b\x5b\x79\x9f\x19\x8a\xe4\x8a\x4f\x4f\x27\xc9\x2a\xcd\xb3\xaa\xac\xaa\x24\x54\x69\x96\xe4\x01\xc7\x72\x40\xa1\x11\x83\x38\x2c\xa8\x2c\xe6\x59\x46\x41\x50\x50\x64\x1a\x60\x16\xaa\x1c\x42\x1a\x47\x22\xa8\x61\xcc\xc8\x14\xab\xe2\xc0\x23\xc1\x27\x9d\xf0\x75\x83\x47\x12\x38\x78\xc1\x23\x09\x1c\xf5\x12\x7a\x3d\xcf\xa3\x27\x7c\x7d\xa1\x47\x3a\x38\x91\x2b\x21\x8c\xc6\x85\x0e\x7c\xa7\x66\x5c\x4d\x5b\xf2\xd5\x12\x1e\x49\x32\x68\x36\x73\x8c\xb1\x78\x1f\xe5\xc8\x84\xad\x77\x9d\x8a\xc7\xe9\x15\xc0\xc2\x9a\x3c\x1a\x40\xb5\xd1\x6c\x69\x38\x65\xcf\x14\xb2\x2a\x22\x6d\x90\xea\x2e\xbc\x41\x5b\x34\xdd\xe2\x74\x68\x26\xc6\xcb\x61\x42\xbc\xe9\x44\xae\xbb\x3d\x52\x84\x13\xa4\x9e\xea\x91\x1e\xc4\xff\x44\x8f\xf4\xe8\x09\x1c\x8f\x7a\xa4\xa7\xe0\x7f\xc0\x23\xfd\x4c\xf9\xb1\xab\xf9\xa7\x08\xb2\x7a\xa6\x47\x8a\x82\xff\x41\x8f\x94\x85\x8d\xde\x44\x46\x0e\x8e\x7b\x89\x78\x71\xce\x2f\xd8\x5a\x7d\xd6\x2e\x97\x86\xe3\x62\xe6\xbd\x36\xac\x65\x8c\x04\x76\x59\x6a\x2a\x72\x5d\xe7\x2d\x31\x6d\x64\xdf\x40\xbe\x5c\x17\xe8\x8a\x21\xac\x6a\x7c\x62\x12\x93\xca\x5a\x06\xa6\x5b\xc9\xce\x7c\xca\x56\x5a\x19\xb9\x50\x92\x9e\xbf\xcb\x49\xe1\x90\x4c\xf1\x34\xa5\x91\x88\x54\x68\x0d\x73\x82\x8a\x15\x4c\x6a\x1a\x90\x79\x4a\x00\x1a\x87\x04\x95\xa2\x15\x9a\x53\x64\x95\xc3\x14\x43\x52\xb4\xc6\xc9\x90\xd7\x58\x52\xd5\x14\x92\x0c\x3c\x12\xf5\x24\x8f\x44\x5f\xf5\x48\x3c\xbc\xe4\x91\x78\x78\xe8\x91\x82\xd7\xbc\x3d\xea\x91\x2e\xec\x25\x0d\x3c\x52\xa4\x25\xf1\xee\x15\x8f\x54\x89\x5b\xb2\x69\xf3\x05\x71\xd4\xa8\x68\xbc\x52\xab\x54\x0c\x31\xd5\x5d\xea\x8b\x58\x8e\x7c\x53\x3b\x76\x89\x6e\xeb\xb4\x54\xa8\x8a\x62\xbe\x9b\xb6\x3c\xc5\x1b\x26\x73\xcb\x1a\xad\xb8\xed\xd6\x72\x8e\x3a\x14\xcc\xc7\x47\xb8\xd6\xe9\xc9\x4b\x06\x26\x86\x46\x79\xd0\x8c\xb3\xb7\x2d\x89\x7f\xb5\x47\x3a\x53\x48\xf9\x65\x1e\x29\x19\x1d\xff\xa7\x9c\x09\x75\x87\x47\x78\xb6\x47\xba\xb7\x50\x49\x14\x1f\xf4\x48\x9f\x58\x12\x70\xd2\x23\xfd\x20\x8f\x20\x7e\x42\x5f\xdd\x83\x7f\xe3\x91\xb8\x98\x3a\xed\x0c\xe7\x76\xb2\x9e\x63\xe2\x8b\x85\x48\xb3\x39\xb1\xac\x15\x52\x59\x7a\x58\x37\x01\xd2\x57\x83\x4e\x4a\xaf\xd9\xbc\x28\x9a\x4a\x07\x83\x25\x2c\xe5\x86\xf9\xd4\x60\xb9\x68\x37\x8b\x89\x89\xac\xf5\xac\x58\x9d\x49\xbc\x0d\x66\x45\xab\x97\xa9\xe4\x60\xba\x1a\x9f\x3c\x7f\xc9\x9d\xc1\x9a\xa0\x90\xac\x2c\xb3\x90\x51\xa1\x8a\x20\xe4\x01\x00\xbc\xac\x6a\x80\x56\x79\x92\xe7\x58\x9e\x62\x28\x8c\xa1\xa6\x20\x8e\x66\x38\x85\xc7\x0c\xc9\x6a\x32\x96\x05\xa0\x29\x0c\x13\x78\x24\xfa\x49\x59\xbb\x1b\x3c\x12\x4d\x9f\x5d\x73\xdf\xdd\x3d\x7a\x5d\xe8\xa3\x59\xbb\x2f\xf4\x48\x07\x59\xbb\x4a\x06\x66\x0a\x15\xc1\x60\x49\xa5\x04\x6a\x05\xd8\x2a\x03\xbd\xeb\x64\xa5\xde\x10\x67\x8a\xf5\x6e\xba\xc9\xb8\x56\xf2\xbd\xc2\xa4\xad\xaa\xd4\x64\x94\xb6\x4b\x91\x65\x2e\xd7\xac\xbe\xb1\xd9\x2c\x5b\x53\xde\x60\x4e\x4d\x02\x85\x65\xe7\x45\x1d\xd3\x99\x65\x9d\x9f\x4d\xe6\x73\xf2\x67\xcc\xda\x3d\xec\x91\x1e\xc4\xff\x44\x8f\xf4\x94\xd2\xd5\x07\x3c\xd2\x57\x97\xce\x8a\xe2\xcf\x5b\xa4\x76\xcd\x23\x7d\x65\xd6\x4c\xfc\x84\xbe\xba\x07\xff\xc6\x23\xd1\x72\xaf\x67\x73\xb0\xe8\xd4\xe7\xab\xb6\xe8\xbc\xd5\xa8\x4e\x02\xbb\x4a\xdd\x28\xd3\x3d\x2f\xad\xb4\xab\xe3\xa5\x52\xb0\xb9\x51\x47\xe1\xeb\x55\x73\xd1\x59\x69\x35\xca\x1d\x94\x04\xcb\x56\xb4\x49\x62\x61\xf5\x06\x64\xb1\xbd\x72\x1c\x71\x9a\xe0\x74\x39\x9f\x5d\xc6\xac\x54\xea\xe9\x65\xc6\x90\xe2\x68\xbc\x76\x07\x82\x2c\x60\x8d\x53\x65\x24\x20\x46\x95\x29\x8a\x12\x64\x8e\xd7\x54\xc4\x6b\x14\xcd\x71\x9c\x0c\x90\x46\x51\x32\xa2\x59\x1e\xa9\x8c\x42\xaa\x9a\x40\xb3\x2a\xad\xbe\x6c\x5f\x68\xff\xc8\x1a\x3d\xb8\xba\x46\x0f\x78\xfe\xfc\xf2\xd1\xf6\xee\xe1\x4b\xa2\x1f\x5d\xa3\xbf\x90\xab\x0b\xae\x08\x91\xf9\x99\x35\xfa\x64\x6a\xf5\x3e\x1b\xd5\x12\x35\xbb\x2c\xe6\x0d\xad\x5a\xef\xa6\xec\xe2\x60\xe6\x2d\x95\x26\x65\xa6\xab\xc9\x1a\x03\xf4\x91\xea\xa6\xb3\x28\x51\xee\xcc\x49\xa6\x11\x6f\x0f\x3a\x64\x57\x1f\x39\x64\x32\x51\x95\xe8\x32\x4a\xb7\x61\x61\xac\xb8\xd4\xdb\xbc\x38\x36\x64\xba\x59\x77\x4a\xc5\x9f\x6b\x8d\xbe\x62\xf5\xe2\xcc\x0f\x5c\xa3\x7f\xf4\x94\x1f\x51\xfc\x71\x39\x9f\x93\x63\x6b\x22\xba\x2c\x2a\xd6\xdb\x45\x36\xaf\xc9\xe2\x19\x6b\xf4\x51\x4f\xf9\xd9\x8c\xad\x3a\xcf\x3a\x8c\x24\xb6\x0a\xa9\x5a\xb2\x67\xad\xc8\xf6\x9c\x4d\xd2\x32\xa7\x58\x92\xc0\xd4\x9b\xf3\x51\x45\xed\xe5\xb3\x72\xa2\x0e\xf5\x66\xdb\x2d\x57\x5a\x33\xd0\x6b\x7b\x69\x3a\x5f\x10\x44\xbd\xb9\xa8\xa4\x3a\x83\xb6\x6a\x4c\xac\x62\x19\x2a\x49\xc6\x1e\xc7\x24\x12\xad\x92\x9f\xb0\x46\x4f\x61\x01\x00\x12\xa8\x40\x40\x48\x96\xfd\x97\xa0\x01\x81\xa1\x78\x92\xe5\x79\x56\xe5\x38\x4e\x81\x2c\x09\x29\x4a\x61\x69\x8e\xd7\x80\x22\x40\x1e\x71\x02\x56\x68\x0c\x39\xff\xf5\xd8\x70\x13\xed\x47\x1f\x5b\xaf\x06\xf9\x10\x52\xdc\xd9\x53\x7a\xfd\xbb\xbb\x3a\xdd\xcd\xab\xdc\x1f\x1d\x5b\x2f\x9c\xad\x13\x5c\x11\x36\x02\x9c\x19\x5b\x53\xb9\xca\x54\x5d\x4d\x87\x9a\x1d\x53\x1b\xb9\x7c\xb7\x2b\x93\x6c\x63\x58\x4c\x14\x8b\x5d\x37\xbd\xb0\xda\x56\x1d\x64\xf3\x78\xa8\xbd\xc3\xb2\x9e\x6e\x79\xc5\x69\x17\x16\x9c\x76\xb9\xf1\xb6\xac\x27\x32\xb1\xce\x4c\x53\xed\xee\x3c\x59\x55\x26\x3c\x33\x48\xd5\xe5\xe4\x78\x28\x57\x7b\xa5\x9f\x6b\x6c\x7d\xb4\xfe\xe8\x51\x7b\x2e\xd0\xb1\xf2\xdb\x33\xc7\xd6\x2f\xdc\x30\xf0\x19\xf5\x4f\x51\xeb\x8f\xc4\x27\x8d\xad\x51\xfd\xec\x66\x6c\x5d\xa6\x1c\x4b\xe1\x6c\x8a\xad\x5a\x2d\x23\xd9\x06\x50\xa8\x8c\xec\xe5\xbc\xb1\x04\x5c\x42\x79\x03\x6f\xa4\x5a\x5f\x76\x6d\x8a\xf5\x86\xbd\x44\xbb\xd8\xe0\x4c\xc1\x78\x07\xcd\xd6\x58\x19\xd5\xea\x33\xd3\xa1\x28\x94\xe6\xc5\x21\x55\xd0\x2a\xbd\x1a\xd9\x99\x4f\x6c\xb8\x82\xb7\xd6\x96\xfe\xf2\xcb\xb7\x6f\xbf\x7c\xfb\x46\x94\xd1\x18\x7f\x27\x90\xeb\x62\xaf\xef\x7a\xc8\x73\x0f\x3f\xf7\x27\x23\xbc\xfc\x93\x68\x2e\x27\xf8\x3b\x91\xac\x94\x1b\xcd\xba\x98\x2b\x37\xff\x24\x1a\xca\x00\x8f\xd1\x77\x62\x32\x95\x4d\x43\xf9\x93\xa8\xcc\x2d\xec\x7c\x27\xd6\x10\x7f\xf9\x45\x2c\x36\xa5\x3a\xd1\x14\x13\x45\x89\xa8\x94\x8b\xbd\x43\x88\xbf\x10\x04\x41\x88\xa9\xd4\x01\xb4\x0f\x08\x89\x6a\x3d\x57\x12\xeb\x3d\xa2\x20\xf5\x88\xdf\x0c\xf5\x03\xb5\xba\xed\x4c\xfa\x63\x43\x77\x50\xe0\x06\x42\xdf\x9f\x44\x75\x08\xea\x29\xca\x4f\x21\xbe\x4a\xfd\xd6\x93\xf9\x6c\xbb\xa1\xaf\xc1\xff\xfa\x8a\xad\xe2\xcd\x47\x6f\x39\xd9\x7e\x34\x5c\x77\x8a\x9d\xfe\x53\xb8\x3b\x46\x7b\x8a\xb9\x48\x84\x11\xad\x72\xae\xd6\x92\x88\xdf\xf6\xcd\x5f\x89\x7d\xfb\xed\xe7\xe0\x81\x3b\x45\xf3\x9c\x6e\xbd\x9b\xf1\xbb\x3a\xd5\x9e\xe0\x40\x19\xfa\x13\xe4\x78\x86\x62\x4c\x90\x75\xc0\xc9\xe9\xdb\x4f\xe6\xec\x34\x92\x4b\x9c\x5e\x20\xeb\x66\xce\x0f\x02\xb3\xd3\xbc\x9f\x6b\xf0\x64\xee\xcf\xa1\xb9\xc4\xff\x45\xd2\xae\x4a\x20\x50\x69\x79\xe9\x6b\xfb\x96\x91\x5c\x39\x25\x75\xaf\xf0\x90\xac\x4b\x62\x53\x0a\x9a\x1e\x43\x21\x2a\xe5\xb0\x31\xb4\x1a\xb9\x72\x86\x90\x3d\x07\xe3\x43\xeb\x3a\x4f\x4d\x60\x63\x8f\xd3\x13\xc0\xb9\x8d\xa2\x33\x76\x2d\x2f\xfb\x48\x51\xec\xa9\xe5\x45\x26\x67\x0f\xe2\x90\x92\xa3\xd9\xc0\x31\x3d\x41\xe3\x57\x62\xf3\xa1\xef\xe2\xf7\x29\xb6\x94\x8f\x02\x93\x97\xfd\x01\x72\x07\x8f\x50\xb6\x7e\xfe\x36\xb2\x0e\x35\x6d\xfd\xd4\x29\x6a\x4c\xac\xea\x0f\x74\xdc\x0e\xc2\x6d\x14\x05\x6d\x77\xe2\x79\x25\xd0\x64\x62\x1a\x4a\x30\x1c\xd8\x8e\x7a\x66\x98\xee\xe3\xb5\x6e\xf8\xf7\x23\x50\xba\xf1\x12\x01\xc1\x21\x70\x87\x64\x63\x4d\xc3\x4a\x58\xd5\x3e\x8e\x5a\x86\xfa\x4a\xfc\xea\x3f\xfc\xeb\x39\x62\x0d\xf5\x49\x64\x1a\xea\xcd\x04\x6e\x55\x6f\x4d\x5e\x04\xa2\xed\x49\x7f\xf2\x2c\xba\x37\xb0\x0e\x49\x3f\xe3\xaa\x22\x71\x72\x9a\x01\x6f\xf1\x3c\x06\x36\xb0\xce\xe8\x74\x44\x16\x0e\x21\x9c\x62\xc2\x9e\xac\xb5\x72\x60\x47\xe2\x61\x43\xfc\x1e\x46\x54\xe1\x5f\x16\xb4\xbb\xb1\x76\x7f\xa8\x7e\x5c\xd6\xc7\xe0\x0e\x49\x0e\x7e\x0f\xd1\x78\x9a\xa2\x43\xb9\x3e\x8b\xac\x0f\x30\x6f\x1b\xde\x4e\x11\xe8\x05\x5d\xe2\x3d\xd2\xad\x7b\x18\xd1\x55\xf2\x9a\xfa\x79\x8e\xba\x46\x22\x23\x17\x3f\xec\x3f\x4f\x01\x0b\x51\xae\xe2\x10\x9d\x87\x6d\xaf\x12\x68\x6b\xda\x03\x4e\xeb\x23\xa8\x9b\x88\xf3\x5b\x5e\x22\xcd\xa7\x1d\x3b\x4f\x13\x5f\x08\xde\x35\x22\x43\xcd\x6f\xa1\xf4\x39\x72\x3c\x82\x76\x2b\x95\x57\xa5\xf9\x1c\xda\x6e\xa2\xe9\x32\x2d\x5b\x8a\x4d\xdb\x1e\x4d\x27\x8f\x51\x74\x0c\xeb\xe6\x1e\x0d\xe2\xdd\x33\xf4\x4d\x90\xe1\xf4\x3d\x63\x8c\x9f\x42\x61\x18\xda\x6d\x76\xbb\x21\xf0\x95\x08\x93\xfc\x4a\x6c\x86\x78\xc5\xb4\x5d\xac\xf6\x91\x77\x86\x89\x27\x8c\xdb\x1b\x38\xd7\x28\xbe\x33\x3a\x5a\x43\x7d\x9a\x74\xef\x10\xec\x55\xb9\x19\x96\x8a\x17\xfd\x50\xc8\xe1\xf6\x6d\xab\x8f\x54\xd5\xc1\xae\xfb\xa8\x40\xaf\x22\x38\x9a\xa7\x6d\x6e\x87\x66\x46\x41\xc3\x3b\x68\x7f\x5c\x0f\x2e\xc1\xbe\x4e\xf1\x09\x2b\x3b\x06\xb8\x89\xc2\xd7\xf0\xbc\xe5\x24\xfa\x1c\xfc\x22\xd4\xab\x61\xff\xba\xd1\x15\x42\x37\x31\xd4\x1a\xe4\x4e\x89\x9e\x44\xed\x29\xd0\x57\xc3\xb7\x5b\x35\xf9\x00\xf8\xb3\x95\xe1\x08\x74\x94\x78\xf3\x3c\xb8\xf1\xc4\x76\xd6\x03\xdf\x0c\x3b\xae\x61\x5b\xcf\x17\x74\x18\xc3\x75\xf2\x43\x0f\xdc\xce\xcc\x66\xe8\x89\x98\xa9\xb8\x4d\xfe\x07\x38\xae\x72\x72\xd0\xf6\x76\x26\x26\x0e\x9e\x19\xf6\xd4\xfd\x12\x6e\x4e\x21\xbb\xca\xd6\xa9\x87\x6e\xe7\x6f\x9b\x44\xf9\x34\x9e\xb6\x08\xae\xf2\x71\x36\xdb\x75\x0c\x7a\xe7\x6f\x3f\xc5\xb4\xc3\xd0\x4f\x4e\x80\xef\x35\xf0\x63\xa0\xc7\x53\xa8\x27\x59\xf8\x25\x14\xb7\xf0\x70\x65\x5e\x77\x11\xd9\xf3\xdc\xd7\x47\xc0\x37\xd1\x7e\xdd\x89\x1d\x4e\xb6\x3f\x43\x6d\x3e\xc2\x8f\x3c\xd5\xf7\x83\xb8\x9d\x23\xdf\x66\x18\xfb\xb2\x6d\x8f\x22\x4b\xf9\x02\xcc\xab\x21\xc2\x6f\xbf\xa9\xd8\x43\x86\xe9\x12\xdf\xfe\xe7\x7f\x88\x17\xd7\x36\xd5\x83\xd5\xb4\x97\xef\xdf\x3d\xbc\xf0\x7e\xff\xfd\x95\x38\xdf\x50\xb1\xd5\xdb\x1a\x06\xb9\xf8\xf3\x4d\x65\x7b\xaa\x0f\xbc\x9b\xd0\x1f\x35\xbd\x4c\xc0\x51\xd3\x10\x09\xbf\x13\x9d\xac\x54\x97\x02\x25\x23\xfe\x22\x28\xea\xe6\x85\x68\x43\xed\x6b\x07\xcb\x44\xe9\xc2\xd7\x2c\x47\x6f\xd0\x12\xe9\x4a\x5d\xca\x65\xca\xbb\x25\x20\xa2\x2e\xa5\xa5\xba\x54\x4e\x4a\x8d\xd0\xaa\x88\x7f\xb7\x52\x26\x5a\xd5\xd4\x5a\x65\xea\x52\xa3\x59\xcf\x25\x9b\xeb\x9f\x52\x52\x51\x6a\x4a\x44\x52\x6c\x24\xc5\x94\x74\x61\x1d\x6d\x3d\xef\x38\xfe\xda\x0f\xa5\x62\x9e\x27\x8c\x63\x3c\x57\x16\xc9\xce\x51\x72\x2c\x9f\x70\xda\xe8\xa4\xb0\x36\x81\xfe\x95\x15\xc5\xb3\x92\xd8\x4c\x65\x7f\xb8\x1c\x0e\xe9\x38\x25\x85\x6d\x96\xe0\xb2\xc2\xdc\x27\x81\x8f\x49\xa5\x1f\x28\x86\x33\xc4\x1c\xcb\xe2\x44\x1a\xec\xb9\x4a\x11\x4e\x71\xfc\x0c\x02\x39\xaf\x1a\x1f\x72\x48\xb7\x68\x07\x81\x54\x15\xab\xc4\x18\x59\x53\x64\x9a\xcb\x23\x4a\x73\x69\x42\xea\xe6\x1a\xcd\x46\x40\x73\xc0\xd9\x1f\x23\xbc\xec\xcf\x90\x39\xc5\xfd\x35\x44\x4c\xa4\xea\x95\xea\x21\xe1\xfb\xa7\x42\x2d\x83\x15\xf9\x5f\xfc\xf6\x61\x04\xa7\x61\xff\xb9\x75\x91\x41\xf3\x30\xe6\xdf\x7c\xb9\x5d\xbc\xd6\x42\x52\x06\xc8\x41\x8a\x87\x1d\x62\x86\x9c\xa5\x61\xe9\xbf\x41\x86\xf9\x9d\x28\x57\x9a\x41\x01\xd3\x75\x28\x3e\xd2\x6b\x70\x7e\x09\x95\x96\x86\xa9\xdd\x1f\x0c\xbe\x98\xf4\x0d\x4b\xc7\xae\xd7\x37\xd1\xfa\x8f\x1f\x69\xbf\xbc\x12\x2f\xe4\xcb\xef\x7f\x7e\xd4\x95\x10\xa0\x53\xca\x72\x4a\xd2\xc7\x05\x06\x23\xbc\x5c\xf7\xf8\x91\x3c\x77\x09\x13\xd7\xd0\xad\x75\xac\x7f\x83\x40\xb7\x0f\x9d\x90\x06\x4b\xff\x7e\x83\x2c\x89\x00\x59\xf4\xe7\xe7\xd8\xd0\x07\x1e\x61\x58\x1e\xd6\xb1\x13\xea\xc6\x6f\xdf\x88\x39\x26\xe6\x86\x69\x12\xef\x53\xec\x2c\x09\x79\xb9\x45\xe8\xda\x84\x37\x40\x1e\x61\xb8\xc4\x7c\xb0\xfb\xd5\x70\x09\x6f\x80\x09\xcd\x70\x5c\x8f\x30\x3c\x3c\x26\x0c\xcb\xff\x45\xb1\xc7\x13\xdb\x35\x3c\xbc\x16\xee\x0d\x64\x1d\x49\x3b\x00\xbe\xab\x12\xf8\x7d\xad\x1b\x9b\x71\xa7\x6a\xbb\x9e\xee\xe0\x46\xad\x48\xa8\xc8\x43\xeb\xf1\x9c\x50\xa7\xe3\x89\x8f\xd0\xc4\x1e\xf6\x07\x8c\xff\x1f\x00\x00\xff\xff\xcb\x54\x43\x61\x9e\x4f\x01\x00") +var _tradesHorizonSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x79\x8f\xa3\x48\xb2\xf8\xff\xfd\x29\xd0\x68\xa5\x9a\x96\xbb\xc7\x64\x72\xf7\xfc\xe6\x49\xd8\xc6\xf7\x7d\xbb\x56\x2b\x2b\x81\x04\x63\x63\x70\x01\x3e\x57\xef\xbb\xff\x64\xf0\x49\xf9\xc4\xae\xea\x9e\xb7\x8b\x7a\x6a\x6c\x93\xc4\x95\x11\x19\x91\x91\x91\xc9\xf7\xef\x5f\xbe\x7f\x27\xaa\xb6\xeb\xe9\x0e\x6e\xd4\x8a\x84\x8a\x3c\x24\x23\x17\x13\xea\x74\x3c\xf9\xf2\xfd\xfb\x97\xf5\xfd\xd4\x74\x3c\xc1\x2a\xa1\x39\xf6\x78\xdf\x60\x86\x1d\xd7\xb0\x2d\x42\xf8\x83\xfd\x03\x1c\xb4\x92\x97\xc4\x44\xef\xaf\x1f\x0f\x35\xf9\xd2\x90\x9a\x84\xeb\x21\x0f\x8f\xb1\xe5\xf5\x3d\x63\x8c\xed\xa9\x47\xfc\x45\x90\x7f\xfa\xb7\x4c\x5b\x19\xbd\xff\x55\x31\x8d\x75\x6b\x6c\x29\xb6\x6a\x58\x3a\xf1\x17\xf1\xd2\x6a\xa6\xf9\x97\x3f\xb7\xe0\x2c\x15\x39\x6a\x5f\xb1\x2d\xcd\x76\xc6\x86\xa5\xf7\x5d\xcf\x31\x2c\xdd\x25\xfe\x22\x6c\x6b\x03\x63\x80\x95\x51\x5f\x9b\x5a\x8a\x67\xd8\x56\x5f\xb6\x55\x03\xaf\xef\x6b\xc8\x74\xf1\x11\x9a\xb1\x61\xf5\xc7\xd8\x75\x91\xee\x37\x98\x23\xc7\x32\x2c\xfd\xcf\x0d\xed\x18\x39\xca\xa0\x3f\x41\xde\x80\xf8\x8b\x98\x4c\x65\xd3\x50\xbe\xad\x99\x55\x90\x87\x4c\x7b\xdd\x4c\x2c\x36\xa5\x3a\xd1\x14\x13\x45\x89\xc8\xa5\x09\xa9\x9b\x6b\x34\x1b\x44\xa5\x5c\xec\x6d\xda\xff\x31\x30\x5c\xcf\x76\x96\x7d\xcf\x41\x2a\x76\x89\x54\xbd\x52\x25\x92\x95\x72\xa3\x59\x17\x73\xe5\xe6\xc1\x43\xc7\x0d\xfb\x8a\x3d\xb5\x3c\xec\xf4\x91\xeb\x62\xaf\x6f\xa8\x7d\x6d\x84\x97\x7f\x7e\x06\x42\xc5\xff\xf4\x19\x28\xd7\x7a\xf5\x79\x0c\x06\xd8\xee\xe7\x2e\x20\x70\xad\xc8\x97\x90\x1d\xb4\xda\x03\xf7\x9b\xe7\xca\x29\xa9\x7b\xd0\x72\x03\xd6\xa7\xaa\x8f\x35\x0d\x2b\x9e\xdb\x97\x97\x7d\xdb\x51\xb1\xd3\x97\x6d\x7b\x74\xf9\x41\xc3\x52\xf1\xa2\x7f\xc0\x9c\xe5\x22\x5f\xd1\xdd\xbe\x6d\xf5\x0d\xf5\x9e\xa7\xed\x09\x76\xd0\xee\x59\x6f\x39\xc1\x0f\x3c\xbd\xa7\xe4\x21\x2a\xee\x7b\xd6\xc4\xaa\x8e\x1d\xff\x41\x17\xbf\x4d\xb1\xa5\xdc\xc5\xc2\xc1\xe3\x13\x07\xcf\x0c\x7b\xea\x6e\x7e\xeb\x0f\x90\x3b\x88\x08\xea\x71\x08\xc6\x78\x62\x3b\x6b\x73\xdc\x8c\xa9\x51\xc1\x44\x95\xa5\x62\xda\x2e\x56\xfb\xc8\xbb\xe7\xf9\xad\x32\x47\x50\xa5\x8d\x5d\x46\x20\xfa\xf0\x49\xa4\xaa\x0e\x76\xdd\xcb\x8f\x0f\x3c\x47\xf5\xfd\x4e\xdf\xb4\xed\xd1\x74\x72\x43\xeb\xc9\x35\x92\x82\x56\xc8\x70\xee\x04\xbc\x1d\x74\x6f\x7e\x60\x3d\x4e\x68\x1a\x76\x6e\x6b\xba\x05\x1f\xe1\x91\x8d\x58\x6f\x7b\xc8\x1f\x5a\xef\x40\x72\x38\x14\x5f\x7b\x62\xb2\x7e\x60\xe0\x5d\xed\x01\xf7\x68\x00\x92\x97\x57\xd5\x68\xb0\xb3\xf4\x5b\x1a\xdb\x01\x1d\xf6\xd5\x86\x86\xeb\xf5\xbd\x45\x7f\x72\x1d\xe4\xba\xa5\x3d\xb9\xb5\x25\xbe\xb5\xd9\xd6\x95\x5c\x6e\x2c\x6f\xcd\xfd\x6a\xb3\xeb\xa3\x98\xbc\xbc\xad\x33\x03\x1f\xb9\x96\xb6\xeb\x4e\xaf\x61\xde\x35\x56\x6c\x15\xdf\x19\x17\xec\xd4\x60\x82\x1c\xcf\x50\x8c\x09\xb2\x2e\x3a\xef\x6b\x8f\xf6\x27\x77\xc6\x26\x3b\x8f\x76\x2f\x05\xa7\x1f\xbc\x1b\xbf\x2f\xbc\x5b\xf0\x05\x0d\x3f\x1c\x7e\xd0\x99\xeb\x9e\xdc\x7c\x5c\xfb\x87\x6d\xe8\xe7\x2b\x43\xff\x46\x0a\x74\xdb\x99\xf4\xc7\x86\xbe\x09\x18\x2e\x90\x10\x6a\x79\x33\x8f\xf7\xc7\x7b\x97\x20\xdf\xaa\x9c\xc1\xd3\xc9\x4a\xb1\x55\x2a\x13\x86\x1a\x60\x4e\x49\x69\xb1\x55\x6c\xde\x08\xfb\x8c\xd2\x3d\x01\xf2\xa6\xbb\x2f\x43\xf2\xbf\xdd\xce\xfe\xd6\x4b\x37\xa4\x5a\x4b\x2a\x27\x23\xc8\x6c\x1d\x67\xbb\xf8\xed\x6e\xcc\x47\x40\x6e\x7e\x5a\xc5\x37\xb6\xdd\x47\xb3\x37\x73\x78\xc6\xea\xef\xe1\xef\x34\x88\xdb\x9e\xdd\xc4\x7d\xb7\x35\xde\x04\x79\x37\xf3\xb6\x19\x01\xee\xe1\x25\x78\xe4\xc6\xb6\x9b\xf0\xef\x76\x7a\xb6\xf1\xe2\x2d\x14\x85\xc6\x90\xcb\x8d\x0f\x86\x84\x4d\x43\x31\x93\xa9\x4b\x19\xb1\x79\xa2\xf1\xd8\x58\xcf\x38\x0c\x05\xff\x6e\x4d\xc7\xd8\x31\x94\x7f\xfe\xeb\xeb\x0d\x4f\xa1\x45\x84\xa7\x4c\xe4\x7a\xbf\x23\x6b\x89\x4d\x3f\x15\x73\xc3\x13\x9a\xe1\x9c\x7c\x24\xdd\x2a\x27\x9b\xb9\x4a\xf9\x02\x3f\x7d\xa4\xeb\x7b\xea\xbe\x11\xef\x08\xbd\x00\x63\xcb\xdd\x03\x30\xd6\xbc\xfa\x8f\xef\x89\xff\x46\xdc\xc3\x88\xcf\xfa\x0d\x10\xa4\x6e\x53\x2a\x37\x42\x20\xcc\x89\xee\xbe\x99\x5b\x5d\x4c\x66\xa5\x92\xf8\x0e\xc3\x9f\x5f\x82\x2c\x5c\x19\x8d\xf1\x8f\xed\x6f\x44\x73\x39\xc1\x3f\x36\x8f\xfc\x49\x34\x94\x01\x1e\xa3\x1f\xc4\xf7\x3f\x89\xca\xdc\xc2\xce\x0f\xe2\xbb\x9f\x9c\x4b\xd6\xa5\x75\x7f\x6d\x20\x6f\xe1\x7d\x39\x82\x78\x7c\x73\x03\x38\x59\x29\x95\xa4\x72\xf3\x02\xe4\xa0\x01\x51\x29\x1f\x03\x20\x72\x0d\xe2\x65\x9b\x76\xdb\xfe\xe6\xfa\x40\x5e\xc2\x98\xb7\xec\x6f\x70\xee\x24\x74\x95\x9f\x23\x59\x96\x2b\xcd\x90\x3c\x89\x4e\xae\x99\xdd\x91\x75\x98\x7f\x3b\x42\xbf\x87\x12\x22\xe4\x1e\xe6\xdf\x01\xf1\x05\x50\x2d\xc6\x27\x7a\xa3\x56\x24\x26\x8e\xad\x60\x75\xea\x20\x93\x30\x91\xa5\x4f\x91\x8e\x7d\x31\xdc\x98\x2f\x3c\x24\xf7\xba\xa2\x6d\xc8\xdf\xea\xea\x9e\xfe\x6d\xdf\x9e\x92\xe5\x4e\xb3\xaf\xc2\x27\xea\x52\xb3\x55\x2f\x37\x0e\x7e\xfb\x42\x10\x04\x51\x14\xcb\x99\x96\x98\x91\x08\x9f\xfb\x52\xa9\x15\x8c\x77\x8d\x66\x3d\x97\x6c\xfa\x2d\xc4\x06\xf1\x8f\xfe\x3f\x88\x86\x54\x94\x92\x4d\xe2\x1f\x60\xfd\x2d\xdc\x1b\x57\x0d\xf1\x31\xee\xae\x81\x7f\x1a\x73\xf0\x14\x73\xb7\x8c\x54\x8f\xf1\x77\x03\x86\x1d\x8b\xbb\x9f\x22\x71\xf8\xfb\x17\x82\x48\x8a\x0d\x89\xe8\x64\xa5\x32\xf1\x0f\xf0\x4f\xf0\xaf\xf8\x3f\xc0\x3f\xe1\xbf\xfe\xe7\x1f\xd0\xff\x0c\xff\x09\xff\x45\x34\x83\x9b\x84\x54\x6c\x48\x6b\xa1\x48\xe5\xd4\xd7\x93\x92\xb9\xc1\x0f\x3c\x28\x99\xeb\x18\x3e\x5a\x32\xff\x2f\x8a\x64\xde\xfb\xd4\x8d\x1c\x76\x7e\xf8\x36\x41\xec\xdd\xf6\x3b\x88\x3e\xc5\x04\xd1\x58\xcb\x8a\xf8\x6b\x3f\x02\x7c\x0b\x7e\x6e\xf6\xaa\x12\xf1\xd7\xa1\x45\x7c\x3d\x65\xb5\x4f\xa5\x31\x0c\x30\x44\xe2\xd6\x8c\x6f\xa7\xf0\x64\x08\xf4\x28\x95\xa7\x80\x86\x28\x3d\x32\xc8\x63\x72\xf7\x5a\xf6\x9e\xda\x53\x61\xde\xc3\xd4\x9e\x00\x1a\xa6\xf6\xd0\x48\x2e\x52\xbb\xf6\x5c\x2a\xd6\xd0\xd4\xf4\xfa\x1e\x92\x4d\xec\x4e\x90\x82\x89\xbf\x88\x97\x97\x3f\x8f\xef\xce\x0d\x6f\xd0\xb7\x0d\xf5\x60\x29\xed\x88\xd7\xc3\xf8\x77\xc3\xa2\x6f\x60\xb7\xb1\x17\xd8\xe2\xe1\xe4\x3b\xe0\xc8\x50\x09\xd9\xd0\x0d\xcb\xf3\x03\x83\x72\xab\x58\x0c\xd8\x41\xe3\x75\x18\x4f\x28\x03\xe4\x20\xc5\xc3\x0e\x31\x43\xce\xd2\xb0\xf4\x50\x33\x6b\x3a\xde\x85\xfc\x84\x61\x79\x58\xc7\x4e\xa8\x89\x66\x22\xdd\x25\xdc\x31\x32\xcd\xf7\x68\x3c\x7b\x6c\xbe\x47\xf2\x3b\x64\x98\xaf\xbb\x96\xef\xbb\x3d\x3c\x6f\x88\x2a\x8e\x70\xb6\x63\x27\x12\x0f\x2f\xde\x09\x64\x32\x31\x0d\x3f\x67\x4f\x78\xc6\x18\xbb\x1e\x1a\x4f\x88\x75\x9f\xf9\x5f\x89\x95\x6d\xe1\xf7\x84\x9e\x9b\x15\x6d\xe3\xd1\xcd\x74\xea\x36\x9a\x77\x93\xaf\x33\x50\x37\x6a\x28\xd6\x9b\x41\x44\x07\xfc\x1f\x72\xe5\x64\x5d\xf2\xc3\xaf\x44\x6f\xf3\x53\xb9\x42\x94\x72\xe5\xb6\x58\x6c\x49\xbb\xef\x62\x77\xff\x3d\x29\x26\xb3\x12\x01\xae\x31\x13\x59\xec\x61\x40\xef\x54\x71\x93\xf4\x20\x2c\xbc\xf0\x66\xc8\xfc\xfd\xe5\x0c\xc7\x2f\x3f\x7e\x38\x58\x57\x4c\xe4\xba\x5f\xc3\xdd\x15\xac\x55\x9c\xd0\x2d\x96\xfe\x7a\xa1\xa3\x82\xb9\xf1\xc3\x9c\x05\x19\x9d\x1d\x5f\xa7\x2d\x63\x9f\xab\x3b\x4d\xe6\xc9\xe6\x8a\xad\x9e\x6a\x0e\xe0\xe9\xe6\x41\xfa\xef\xc4\x03\x0c\x7b\xc9\xc2\x4e\xa7\x17\x9e\xa4\xb6\x87\x30\x3f\x4d\x69\x2f\x31\x42\x54\x3a\x65\x29\x45\x24\x7a\x57\x38\x0a\x32\x74\x97\x19\xda\xc1\x0a\xdd\xfe\xc3\x50\xcf\xd1\xb6\xcd\xf9\x3c\xaa\x75\x1b\x38\x1b\xb5\x0b\xd9\x4c\xff\xdc\x48\xff\x3e\xc5\x75\xae\xe5\x6f\xfe\xc2\xc7\x6f\x67\xb4\xd9\xd7\xe3\xd3\xb7\x54\xec\x21\xc3\x74\x89\xa1\x6b\x5b\xf2\x79\x65\xdb\x26\xca\x1e\x95\xc3\x06\xce\x46\x0e\xdb\x75\xeb\x33\xb4\x1d\x2c\x26\xdf\x64\x85\xa7\xd6\xb1\x4f\x3f\xb8\x11\xcb\x41\x66\xd4\xef\x88\x1d\x1d\xdb\x51\x8e\x0c\x61\xd8\x77\xc4\x6d\xed\x77\x8b\xc9\x21\xc7\x64\x4f\xbd\xbd\x6f\x0a\x3f\xe3\x60\xe4\x5d\x7d\x28\x68\x3b\x9d\xa8\x37\xb7\xdd\xa9\xce\xe6\x6b\x68\x9d\xfd\x1d\x2f\xe0\x5d\x3c\xe0\x21\xb3\xaf\xd8\x86\xe5\x9e\xd6\x41\x0d\xe3\xfe\xc4\xb6\xcd\xd3\x77\xfd\x95\x4f\x0d\x9f\xeb\x6b\xff\xb6\x83\x5d\xec\xcc\xce\x35\x59\xc7\xa1\xde\xa2\xef\x87\x49\xc6\xea\x5c\xab\x89\x63\x7b\xb6\x62\x9b\x67\xf9\x0a\xf7\xd1\x56\x59\x30\x52\xb1\xe3\x87\x17\xc1\xef\xee\x54\x51\xb0\xeb\x6a\x53\xb3\x7f\x56\x51\x36\x8c\x23\xc3\xc4\xea\xb5\x56\x1b\xd2\xcf\xa8\xd0\x79\xd3\x3b\x93\xdf\x7e\xd4\x12\xcf\xac\x99\x5c\xf1\x8b\xb7\x8f\x48\xd7\xc7\xb8\x7b\x59\x7e\xae\xab\xbb\x88\xe3\xb3\x5c\xdf\x5d\x8c\x3e\xe8\x0a\x2f\xe2\x7a\xef\x1a\x4f\x37\xbf\xe0\x2a\x0f\x56\x7f\x9e\xa6\x9b\xd7\xa6\x42\xc7\x95\x57\x67\xa6\x4b\xeb\xd9\x81\x12\xb0\xe2\x7b\xc9\x07\x9d\xe4\x66\x74\xb0\xa7\x8e\xb2\x2b\xe5\x38\xe3\x9e\xb6\x43\xce\xcb\xcb\x8f\x1f\xe7\xa7\x6b\xe7\xed\x60\xb3\xf8\xf6\xa8\x38\x37\xf5\x82\xbf\x3f\x35\xa6\xd8\x0c\x9b\x51\x3c\x9c\x5f\x2f\x73\x16\x6d\xa8\x5a\xf1\x52\xa3\x4d\x01\xe5\xa5\x26\xc1\x5c\xf9\x64\x83\xf7\x75\x9f\x57\xda\x5d\x44\xb7\x6b\x75\x01\xa3\x4f\x92\xe1\xf6\x5d\x6c\x9a\xd8\x21\x64\xdb\x36\x31\xb2\xb6\x7e\xcb\x50\x70\xdf\x3a\xf2\xd1\xc1\x6f\xc7\x7e\x7b\x5f\x71\xd4\x0f\x79\xf4\xa3\x9a\xa7\xf0\xcd\x83\xa5\xfc\x93\xd5\xa1\x3e\xd5\x7d\xbf\x7e\x98\x48\x66\xa5\x64\x81\xf8\xfd\xf7\x43\x09\xfe\x0f\x41\x7e\xfd\x7a\x0d\xd4\xa9\xc7\xb7\x42\xfb\x7f\xef\xe4\x78\x03\xbc\x23\x99\x86\xc0\x87\x04\xee\x13\x78\xd1\x94\x4e\xaf\x82\x3f\xc1\xb8\x4e\xd7\x35\xdc\xe8\x49\x6f\x19\xc2\x1e\xf1\xa5\xd7\x6a\x08\x9e\xe3\x4d\xaf\x60\xf9\x2c\x7f\x7a\x27\xb3\x0f\x7a\xd4\x2b\xd8\xde\xfb\xd4\x73\x0f\x5c\xf0\xaa\x47\x75\x23\x4f\xd4\xd5\xad\x7e\x1e\x92\x74\xf3\x44\x6b\x33\xf6\x5f\x99\xbe\xdd\xea\x78\x2f\xfb\xd0\x93\x6d\xf7\xa8\x4f\xda\xcb\x7a\xa6\x70\x7e\xaa\x71\x6e\x12\xf7\x53\xa6\x61\xde\xa2\x8f\xad\x19\x36\xed\x09\x3e\x95\xda\xf4\x16\xeb\x49\xd1\xd4\xf4\xce\xdc\x1c\x63\x0f\x9d\xb9\xb5\x9e\x8e\x9d\xbb\xed\x1a\xba\x85\xbc\xa9\x83\x4f\x65\xe1\x04\xf6\xeb\x3f\xff\xb5\x8f\x5d\xfe\xfd\xbf\xa7\xa2\x97\x7f\xfe\x2b\x2c\x73\x3c\xb6\xcf\x24\xcc\xf6\xb0\x2c\xdb\xc2\x17\x63\xa1\x3d\xac\xf7\x60\x36\x9c\x19\x63\xdc\x97\xed\xa9\xa5\xfa\x59\x6d\xde\x41\x96\x8e\xc3\x33\xb6\x63\xd7\xba\x96\xc4\x1a\x9a\x8e\xd5\xeb\xd3\xad\x4d\x7e\xd0\x50\xb7\xd6\xb6\x2d\xf3\xba\x65\x88\x08\xcc\xcd\xaf\xa9\xbb\x52\x41\xd6\x90\x9a\x17\x72\xa9\x87\x59\xab\xc3\x4c\xea\x7d\xf3\x88\xe7\x31\x71\x63\x81\xdd\x45\xa6\x2e\xce\x3f\x6e\x61\xf2\xac\xa7\x7d\x1a\x9b\x37\xd7\x28\x5e\x64\xf4\x8a\x5b\x38\xcd\x6a\x0a\x79\x88\xd0\x6c\xe7\xca\x8a\x12\x91\x12\x9b\xe2\x15\xf6\x72\xe5\x86\x54\x6f\x12\xb9\x72\xb3\x72\xb4\xaa\xe4\x7b\xd1\x06\xf1\x3b\xf8\x46\xbc\x30\xe4\xf6\x7a\xf9\x46\xc0\x6f\x04\xf9\x8d\x78\x79\xf9\xfa\xe7\xd5\x67\xe1\x85\x67\xcf\xb0\x72\x69\x45\xe8\x5e\x76\xc2\xab\x42\x5b\xb2\x5e\x40\xdf\xb0\x0c\xcf\x40\x66\x3f\xa8\xd0\xf9\xc3\x7d\x33\x5f\xbe\x11\x2f\x90\x04\xc2\x77\x92\xfd\x4e\x52\x04\xe0\x7f\x40\xfe\x07\xcd\xfd\x41\x52\x90\x16\xd8\x18\x09\xc3\x0c\x9f\x85\x0e\xfb\xc1\xce\x8b\xa3\xde\x94\x97\x7d\xcf\x36\xd4\xcb\x98\x04\x96\xe1\xee\xc1\x44\xf5\xa7\x2e\xde\x79\xb7\xbe\x61\xbd\xdb\xed\x71\x11\x1f\x4d\x93\x34\x7f\x0f\x3e\xba\x8f\x54\xb5\x1f\xce\x99\x5d\xc4\xc1\xd0\x0c\x05\xef\xc1\xc1\xf4\x03\x5f\xba\x8d\xea\xfd\xb5\xd6\x8b\x28\x58\x8a\x84\x77\xb1\xc1\x6e\x51\x6c\x46\xce\x1b\x50\xf0\x34\x60\xee\x41\xc1\xf5\xc7\xb6\x6a\x68\xcb\xdb\xb9\xe0\x01\x0b\xef\x42\xc1\x1f\x71\xb1\x29\xb1\xbe\x01\x0f\x47\xb3\xd4\x7d\x78\xd6\x9d\x8e\x74\xdd\xc1\x3a\xf2\x6c\xe7\xb2\x4e\x09\x24\x20\x85\x7b\xc0\x0b\x3e\xf8\x20\x9f\xda\x5f\xa8\xce\x65\xe8\x90\x03\x77\x75\x35\x20\x7d\xf0\x9b\x5e\xf0\x67\xc8\x97\x11\x30\x02\x77\x97\x74\x00\x38\x44\xb0\x9b\x72\xad\x07\x80\xcb\x88\x04\x56\xb8\x8f\x13\x78\xd4\xd1\x9b\x49\x6e\xb0\xa9\xf7\x12\x26\x40\x72\x0c\x7d\x57\x8f\x00\x2a\x60\x67\x97\x1a\xb8\xd8\xe3\x00\x40\x8e\xbd\x8f\x13\xba\xaf\x19\x8b\xed\x06\x07\x7b\x6c\xf6\x35\x03\x9b\x17\x87\x46\x00\x18\x00\xee\x1a\x84\x01\xb3\x5d\xd7\xd9\xe6\xdb\x17\x57\xd8\x60\xb9\xfb\x86\x79\xc0\xf6\x0d\x4b\xc7\xae\xd7\x7f\x9f\xd1\xbf\x82\x8a\x13\xf8\xfb\x7a\x84\x3b\x0a\x13\xfc\xa5\x13\x74\xd9\x99\x00\x48\x92\x14\x7d\x17\x12\x7e\xa7\xbe\x9a\xed\xf4\xd7\x41\x3f\x0e\x19\x3b\x20\xbf\x53\x80\x00\xf4\x0f\x20\xfc\xa0\x85\x3f\x00\xa4\x78\x8a\x89\x91\xe0\x82\x3f\xbf\x58\x6b\x70\xaf\x43\x7f\x57\x6f\x70\x18\xa4\x64\x44\xa6\x93\xa8\xf6\x44\xa6\x47\x77\x44\x29\xdb\xed\xd4\x61\xab\x50\x81\xad\x0a\x9d\x68\x65\xb2\xad\x1a\x47\x4b\xad\x6a\xa1\x52\x86\xb5\x6c\x9b\xee\xd4\xb3\x95\x5c\xbd\x5c\x28\x64\xdf\x09\xe8\x2c\x92\x75\x34\x93\x49\x76\x0b\x19\xb6\x5e\xa6\x2b\xe5\x9c\x54\x4d\x96\xca\xe9\x04\x47\x41\x91\xa6\xd8\x57\xa6\x5a\x4e\x35\xea\xc5\x4c\xa7\xc0\x65\x12\xc5\x64\xa9\x56\xcc\xa5\x2b\x74\x83\x93\x7a\x9d\x76\xeb\x66\x24\x94\x8f\xa4\x56\xed\x65\xb2\x74\x81\xe1\xba\x89\x94\x54\x2e\x14\xba\x0c\x53\x48\x35\x3b\x95\x66\x81\xe9\xa4\x3a\xf5\x5a\x25\x0b\x8b\x59\x29\xd5\xa5\xa4\x42\x3b\x57\xab\x17\x4b\x52\x23\x93\xc8\xdc\x8c\x84\xf6\x91\x40\xaa\x96\x86\xd9\x96\xc4\x40\xb1\xd4\x6d\xa5\x5b\x59\x4a\xec\xe5\xc5\x6e\x37\xd3\xed\xb6\x61\x3b\xdb\xed\xf5\xea\xac\xd4\xeb\x4a\xcd\x6a\x21\xd5\x7d\x6d\x88\x1d\x96\xeb\x56\xe8\x9b\x91\x30\x6b\x24\x89\x7a\xb5\x97\xcd\x15\x61\x32\x47\xa5\xcb\x35\x3a\xd1\x2d\xa6\x4b\xe5\x54\x31\x9d\x6f\x95\xab\x2d\x98\xed\x51\xaf\xa5\x74\x23\x5b\x29\xb7\x92\x52\x45\x6c\x74\xb8\x5a\x92\xab\x74\x61\xf6\x25\x6a\x01\xce\x3a\xd6\xbe\xa2\x50\x9b\xa2\xc5\x7d\xbd\xf1\x1f\x2e\xbe\x5c\x9c\xf2\x8d\x60\xbe\x11\x9e\x33\xc5\x37\xa8\xf9\xfb\xb2\x93\xc8\x4a\x1e\x4c\x05\x0f\x55\x5c\x71\xb0\x6a\x78\x7d\x64\x4e\x06\xc8\x9a\x8e\xe9\xb5\x61\xb6\x1a\xa9\x97\x8f\xe8\xce\x63\xec\xf0\x0c\x76\xa9\x55\x7f\xf9\x08\x8d\x3d\xc6\x4e\x9d\xc1\xde\x90\x0a\x8f\x62\x8f\x50\x63\xf2\x14\x15\x3b\x9a\xb3\xfb\x13\xa3\xdb\x14\xec\x54\x89\x49\x54\x0d\xdb\x96\x99\x1c\x74\x32\xcd\x41\x9a\x66\x69\x9a\x62\xa8\x6f\x04\xf8\x46\x50\x6b\xd1\xff\xfb\xb7\x60\x09\xe2\xb7\x1f\xc4\x6f\x51\x47\xd9\xdf\xbe\x11\xbf\x6d\xe3\x89\xdf\x7e\xac\x41\xff\xe6\xda\xa6\xba\x89\x63\xd6\x90\x21\xf9\xc7\x66\xa2\xb8\x6e\x2b\xdb\x53\x7d\xe0\x9d\xbd\x1d\x3c\xbb\xab\xa3\x5a\x37\x68\x35\x52\xa1\x3b\xde\x72\xe2\xdf\x09\xab\xce\x21\xfc\x23\x10\x52\xab\xfe\xee\xde\x25\x20\x07\xb8\x82\xf2\x2c\x5f\x42\x11\x2d\xf1\x1d\xe6\x43\x90\xd1\x14\xfc\xb7\xff\x3d\x67\x60\xe1\xae\x07\xa1\xae\x87\xa7\xba\x3e\xa2\xef\xfb\xf8\xae\xdf\xf4\xdb\x23\x5d\xbf\xd1\x9e\x47\xbb\x3e\x62\x3f\x5d\xea\xfa\x88\xda\x74\x73\xd7\xaf\xbb\x9a\x67\x19\x9a\x23\x05\x8e\x05\x9f\x6d\xf5\xcc\xe5\xae\x67\xfe\x6b\xf5\x1f\x6b\xf5\x47\x5d\xff\xb9\x56\xff\x68\xd7\xff\xd7\xea\x1f\xb0\xfa\x75\x6f\x03\x9a\xa3\x79\x9a\x64\x38\xce\xb7\x7a\xe8\xf7\xfc\x61\x07\x1c\xf5\xc0\x49\xe1\x5f\x17\xd9\xe7\x6b\x35\x15\x62\x6d\xad\xd5\xff\x47\x58\x83\xdf\x08\xc0\x01\x4e\xe0\x39\x0a\xf2\xe0\xfe\x5e\xdb\xe8\x7b\x14\xd6\x3e\x5a\x21\xe9\x10\x6b\xf7\xf6\xda\x2f\xcc\xda\xba\xa3\x20\xcf\xd3\x02\xc9\x08\x3c\x13\xf4\x1a\xe9\xf3\x66\x1a\x63\xc3\x67\x4d\x80\x90\xa2\x38\x48\x52\x2c\xcf\xfc\x41\x73\x1c\xc3\x93\xdc\xdf\x8a\x47\xb8\xe5\x11\x90\xe4\x56\x33\xff\xef\xf2\x48\x83\xed\x98\x19\x89\xc7\x5f\x78\x84\xd9\xe9\x2a\xe0\x21\x47\xfd\xdf\xe4\x11\x7e\x23\x78\x86\x17\x04\x8a\x67\x79\xc1\x67\x31\xe0\xd0\xf5\x90\xe3\x19\x96\xde\x97\x91\x89\x2c\xc5\xa7\x18\x1c\x8c\x39\x37\x23\x60\x8e\x11\x9c\x18\xca\xc0\xa9\xa1\x6c\x2b\x25\x0b\x79\xc6\x0c\x47\xe6\x67\xdd\x6b\x01\x43\x73\x6c\xe8\x03\x6f\x13\x7d\x05\x69\x81\xfe\x08\x2f\x1f\x0a\xeb\xee\xd1\x24\x9f\x2a\x1a\x72\x9b\x41\xef\x83\xa4\xbc\x41\xf0\xd1\x52\x0e\xf1\x73\x9b\x94\xa3\xce\x9b\xee\x71\x9b\x01\x55\x2c\xbf\x19\x76\x3f\x4a\xca\x01\x82\x8f\x96\x72\x88\x9f\x1b\x75\xf9\xa3\x47\x7e\x6a\x43\x15\x43\x0a\x9b\x81\xff\x83\xa4\xbc\x41\xf0\xd1\x52\x0e\xf1\x73\xa3\x94\x1f\x19\x97\xaf\xa4\x35\x4f\xed\x18\x8b\x9a\xd6\xdc\xee\x1a\xdb\x19\x2e\xf8\x46\xbc\xb0\x34\x26\x15\x81\x24\x21\x16\x68\x8e\xe3\x69\x4a\xa0\x14\x92\x57\x79\x0c\x19\x86\xe2\x65\x84\x04\xcc\x91\x2c\xcd\x2b\x0a\x42\x98\xd5\x68\x04\x19\x4d\x61\x28\x8e\xe7\x81\xa0\x02\x85\x7d\xf9\x46\xbc\xd0\x00\x00\x12\x63\x85\x84\x80\xe7\x69\x48\xca\x88\xa5\x69\x5a\x61\x14\x4d\x53\x79\x15\x40\x95\x14\x48\x5e\x81\x24\x92\x35\x0e\x29\x8a\xc0\xb2\x02\x0f\x20\xa9\xc8\x24\xa4\x35\xc0\x70\x2f\xbe\xe6\x80\xd0\x8a\x1d\xfb\x83\x62\x7f\x40\x3a\xbc\x90\xe7\xff\x0c\xf8\x3f\x18\x8e\x67\x39\xe6\xea\xdd\x4d\xf6\x8e\x84\x0c\xfb\x8d\x00\xeb\xff\xc8\x77\xd7\xfa\x86\xff\x77\xf3\x67\xf7\xeb\xee\xc3\x9a\x36\x51\x14\xc5\x24\x29\xd5\x53\xd3\x79\x32\x93\xab\xe9\xd3\x71\x5d\x5a\x28\x71\x61\x58\x2f\xd6\x46\xb9\xb9\xfe\x16\xc7\xee\xb2\x83\x7a\x92\xbe\x9c\xe7\xab\xe9\xee\x1b\xcd\xce\x1a\x0d\x9b\xb3\x1b\x6e\x63\x6c\xbe\x8e\x3a\xb3\x6e\xa2\x09\xb1\xb3\x1c\xac\x84\x2c\xce\xb1\x19\xa0\xaa\xf9\xb9\x69\x4f\xec\xd6\x1a\xb4\xd8\xad\xb6\x4b\x86\xb8\xbf\x96\x4d\xbb\xdd\x1b\xc3\x41\xaf\x4e\xe5\x5a\x69\x8a\x9f\x8c\xdf\xb8\x72\x3b\x35\x4c\x97\x56\x75\x27\x5f\xcb\xa5\x97\xae\x3c\xe5\x93\xf9\xe2\xca\x4e\x0d\x7a\x4e\x8c\x75\xed\x58\xb3\xdc\x8d\xad\xe2\x76\x6f\x45\x67\x38\x44\xea\xb2\x9e\x4b\xd4\x94\xd1\xd4\x9b\xf4\x24\x9d\x17\x2b\x7c\x53\x5f\x43\x76\xcb\x74\x11\xad\x26\xb0\x76\x80\xed\x55\x0c\x5d\x52\xf0\x6b\x17\xd0\x35\x51\x4c\x91\xf9\xf0\xfd\x5f\xfe\x7a\xd9\x8e\x47\xe5\x56\xb1\x78\xc6\xfe\xdf\x99\x04\xf9\x1c\x75\x7e\xc1\x24\x96\xa1\x80\x30\xaf\x28\x0c\xaf\x42\x55\x53\x59\x59\x43\x2c\x47\x2a\x14\x4f\x69\x8a\x0c\x39\xac\x70\x0c\x62\x54\x0e\xb1\x24\xc5\x00\x0a\xa8\x18\x43\x52\x83\x24\x85\x59\x08\xf8\x4b\x26\x41\x9d\x53\x7a\x16\xf0\x02\xc5\x5e\xbd\x4b\x43\x81\x16\x58\x0e\x0a\x2c\x79\xc9\x24\x98\x1b\x4d\x22\x96\x72\x0a\x88\x2d\x2d\x7a\xa4\x17\xef\xcc\xd8\xd7\xf9\x9c\xae\xf2\xae\xc5\x65\x3b\x26\x60\x7b\xa9\x56\x33\x8b\x69\x9d\xd7\xab\xe3\x5c\xaf\x33\xc2\xbc\x39\x92\x4b\xe9\x57\x37\x56\xc9\xb4\x9b\xaf\xa9\xa6\x49\x7b\xe9\x6e\x79\xa8\xc4\x27\x99\x9a\x3a\x1d\x55\x5e\x7b\x23\x00\x65\x83\xf4\xbb\x70\x6d\x12\x83\xf9\xbe\x4b\x79\x56\xb2\x94\x55\xa3\xae\x56\x68\x27\x99\xab\x8c\x1b\x3c\x5a\x66\x07\x33\xf7\x2d\x6b\x95\xe3\x85\xb4\x37\x92\xf5\x72\xc7\x8c\xcf\x4b\x79\xbc\x1a\xbb\x83\x1c\xdb\x7b\x35\x54\x60\x92\xf4\x88\xc9\xd4\x69\xa6\x9e\x6b\x16\xd5\x34\xdb\xb6\x0b\x93\x51\xce\x9e\xc7\x92\xd5\x54\x3b\x19\xf7\x4d\xc2\x3e\x61\x12\x5d\x25\xa4\x51\xff\x91\x26\x21\x3c\x47\x9b\x5f\x00\xa2\x04\x05\x20\xa8\x6a\x9c\xc6\x71\x58\x00\x9a\x82\x04\x8e\x67\x29\xc0\x2a\x98\x23\x01\xc3\xb3\x3c\x22\x11\x09\x64\xc8\xab\x0c\x4b\x6a\xb2\x02\x29\x9a\x07\xb2\x46\x21\x8d\xa6\xe9\x4b\x16\x01\xcf\xea\x3c\x05\xd8\x0b\xf6\xb2\xbd\xbb\x49\xf6\x32\x2c\x4b\x5f\xb2\x08\xfa\x46\x8b\x58\xd8\xcc\x1c\x15\x35\x8d\xd2\x26\x59\xfe\xad\x3b\x18\xa6\x5d\x66\x9e\xee\xa1\x42\x52\xcf\x2c\x87\xed\x5e\x75\x96\x2c\xe7\x32\xf1\xca\xac\x2e\xc9\xc5\xd7\x19\x25\x56\x6a\xaf\x5a\x79\x94\xd2\xd4\x65\x2c\xbf\xe8\x35\x78\x76\x60\x72\x30\x95\x98\xae\xc6\x10\x0d\xf9\x59\xd6\xb0\x52\xf2\xc8\xef\x41\xdf\x22\xf4\x7d\x8f\x0a\xe6\x24\x11\xb3\xc7\x6a\xcf\x2e\xae\x24\xb3\x1d\xe7\xcd\x8e\xe9\x99\x98\x8b\x4f\x32\x8a\x6b\xc5\xf9\x6e\x13\xa8\x7a\x0e\xc4\xb2\x6a\x65\xb9\x14\xa7\x31\x8a\xe2\x32\xf5\x7c\x7a\x69\x94\xdb\x2a\x69\x4c\x44\x33\xc7\x8d\xd5\xd1\x78\xa9\x48\x9d\xd7\x18\xef\xbc\xad\x5e\x87\x74\xd1\xb7\xb8\xd1\x09\x8b\x68\xd3\x21\x85\x4a\x89\xff\x81\x16\xc1\x3f\x47\x9b\x5f\x18\xac\x2a\x3c\x25\x03\x4c\x61\x4e\x20\x05\x95\x54\x15\x59\x96\x05\xcc\x29\x9c\xa0\x00\x52\xe5\x19\x40\x41\x0e\x30\x88\x44\x9c\x0c\x55\x08\x31\xe2\x49\x5e\x66\x11\x4d\x92\xbc\x2a\xc8\x97\x2c\x02\x9c\xd5\x79\x9a\xe6\xf9\xb3\x41\xd5\xee\x2e\x45\x53\x8c\xc0\x51\x3c\xc5\xf2\x97\x2c\x82\xba\xd1\x22\x00\xa7\xe8\x5c\x76\xc8\x30\x49\x35\xa5\x4c\x39\xcb\x5a\x30\xf3\x1a\x4c\x4b\x4b\xa5\x6d\x17\xf0\x92\x34\x58\x3b\x59\x44\x23\x31\x07\xe5\xb7\xa9\x39\x2e\x94\x38\x66\x9e\xcd\x52\xee\x6c\x52\x98\x0e\xa9\x42\x96\x1b\x26\x07\x09\xab\x0e\x81\x9d\x7d\xb5\x55\x3b\xde\xd5\x53\x78\xe5\xfa\x3d\xe8\x5b\xc4\x81\x92\xf2\x24\x00\x39\x5e\x99\x63\xa3\xdd\x2a\xd6\x47\x9c\x1e\xcb\x51\xb8\x53\x8a\x8f\x62\xad\x98\x3b\x2b\x16\x67\xf9\x22\xdf\x15\xa4\x72\x02\x38\x05\x54\xb7\xcc\xd2\x92\x97\x56\x75\x47\xab\xae\x8c\x11\xca\xb3\xa5\xa4\xd1\xee\xc6\x32\x79\x56\x62\x12\x1e\xa4\x3a\xb3\x45\x2f\x3b\x4a\xfb\x90\xf5\x13\x16\xd1\x6a\x85\x14\xea\x3f\xd2\x22\xb8\xe7\x68\xf3\x0b\x46\x0a\xa5\x0a\x1a\xcb\xb2\x88\xe1\x34\x99\x81\x24\xd6\x00\xe0\x30\x16\x78\x4a\x95\x65\x8a\x67\x65\x48\xaa\x2c\xcd\x92\x2c\x92\x55\x9e\x04\x34\xa0\x58\x8a\x82\xac\x20\x2b\x8a\xc2\x91\x97\x2c\x82\x3c\xab\xf3\x0c\x47\x5d\xf0\x20\xeb\xbb\xbe\x8f\x20\x49\x96\xe6\x38\x40\x72\xf0\x92\x45\xc0\x5b\xa3\x26\x27\x05\xb5\xd7\xf1\xa4\x1b\x03\xb9\x0a\x5f\xd7\xa6\xe3\x14\xe4\x2a\x19\x57\x07\xa3\x5e\xe6\x4d\xd0\x13\xb5\x66\x6f\x95\x9f\xcc\x4a\x8b\x79\x7d\x10\x9b\xa3\x59\x25\xe7\xa5\x40\x53\x8d\x2b\x58\xee\x65\xcc\xb2\x3c\xce\xa7\xbc\x71\x5c\x8d\x79\xad\x82\x6a\x57\x58\xb8\x48\xcd\xbd\x9c\xdf\x83\xbe\x45\x1c\xf4\xe8\xb4\xe6\x54\x6b\x0e\x7c\x33\xcb\xed\x49\x32\xf7\x36\xa8\x21\x5c\x2b\xb9\x29\x21\xdf\xe9\x94\xd1\x22\xd7\xa8\xe4\xe6\x25\x77\x31\x33\xcc\x5c\xbb\xc1\x55\x66\x65\xb6\x95\x2e\x8a\x1a\xaf\x25\xe5\xa9\x38\xa2\x7a\x88\x9d\xd7\x98\x37\xb6\xc4\x3a\x0b\x89\xac\x54\x4b\xe5\x81\x2e\x4e\xda\xbe\x11\x28\x27\x2c\xa2\x31\x0f\x29\x54\x52\xfc\x0f\xb4\x08\xf6\x39\xda\xfc\x22\x60\x9e\x51\x14\xc4\x90\x3c\x4d\xa9\x02\x8d\x68\x5e\x65\x01\x4d\x0a\xbc\xa0\x30\x82\x2c\x03\x92\x17\x64\x8e\xd5\x20\xa9\x6a\xa4\xca\x92\x34\xa2\x05\x1a\xb0\x98\xa3\x18\x5a\x61\x00\xc9\x5c\xb0\x08\x20\x9c\xd5\x79\x96\x65\x48\xee\xe2\xdd\x75\x48\x07\x19\x8e\x15\x78\x92\xe2\xb8\x8b\x53\x6b\x70\xa3\x45\x30\x6c\x7a\x55\x68\xe5\x6a\x82\x59\x68\x94\x7b\xad\x64\xcf\x4a\x8f\x39\x29\x37\xa6\xe4\x65\x4a\x4b\x75\x12\x85\x46\x2b\x3d\x55\x40\x33\x2d\xa5\x93\xf5\x74\x4c\xc5\xd3\x6e\x2a\x9f\x96\x13\xdc\x5b\x4f\x1d\x8c\x1a\x9d\x62\x2b\xe7\xf2\xb1\x99\x48\xb7\xec\x51\xb6\x88\x67\xed\xd6\x18\x64\xfd\x90\xdd\xb7\x08\xfd\x40\x2f\x19\x2f\x8d\x46\x71\x6d\xc0\x95\xa4\x8a\xe1\x0d\x86\xe6\x52\x95\x9c\x44\x8b\x8c\x97\x48\xc3\x44\x58\x9b\x82\x96\x4c\x26\xe7\x40\x91\x6b\x9d\x3c\x99\x45\x79\x6b\x2c\x0e\x26\x31\x31\x69\xb8\x46\xb1\x4d\x4e\x38\xca\x4c\x35\x5a\x32\x9f\x6d\x15\x5c\x6b\x51\xaf\x64\xc4\x4c\xb3\xec\x1b\x41\xef\x84\x45\xd4\x4b\x21\x85\x4a\x88\xff\x81\x16\xc1\x3c\x47\x9b\x5f\x68\xac\x50\x8a\x22\xc8\x88\x86\x2c\xa0\x54\x8a\x01\x9c\x02\x55\xc4\x73\x0c\x2f\x90\x08\xf3\x00\xd0\x24\x4f\xcb\x1c\x84\x0c\xa7\xf2\xb4\xa2\x09\xbc\xc2\xb3\x24\x52\x55\x55\x66\x14\x04\x2e\x59\x04\x7f\x56\xe7\xd7\xa1\xdd\xf9\x99\xf5\xf6\x6e\xb0\xbc\x4e\xb1\x34\x7f\x71\x66\x4d\xde\x9a\x6c\xe2\x52\xab\xfc\x74\x94\x1f\x54\x9b\xad\xee\xdc\x7b\xcb\x76\xf2\xc9\xa9\x5e\xaf\xe5\x1a\x54\xce\xd4\x7a\xcd\xea\xb8\x34\xd0\x1d\x15\x82\xe5\xc0\xc9\x3a\xb3\xd5\xa2\x57\xd5\x95\xa5\x93\x8c\x57\x54\x56\xad\x76\x84\xd2\xab\xc5\x32\x45\x9e\x6d\x68\x86\x3a\xe1\x86\xc9\x1a\x53\x6b\xe8\x81\x32\xfa\x16\x71\x30\x8f\x30\x85\x04\x1a\x67\x3c\x3e\xbd\xd2\xdb\x29\x72\xd6\x2a\xa5\xf8\x0c\x9f\xc5\x23\x65\x6e\x58\x2a\xa0\xaa\x8e\x1e\xaf\x64\xaa\xf9\x45\x2b\x39\x4a\x2e\x9b\xfa\xb2\x15\x2f\xe4\xe6\x24\xfb\x5a\x85\x9e\x05\xf4\x5a\xc7\x71\xf1\x6b\x51\x05\xf1\x4e\xa7\xa1\x09\x5e\xac\xd8\x31\xd9\x38\xef\x1b\x41\xeb\x84\x45\x54\xed\x53\x5a\xf5\x9f\x66\x11\xf4\x73\xb4\xf9\x05\x21\x56\x56\x34\x0c\x69\x1a\xd3\x9a\x40\x22\x20\x63\x46\xe6\x11\x09\x48\x4e\x86\x90\x52\x90\xcc\x33\x0a\x49\x31\x1c\x27\xa8\x88\xe3\x91\x02\x14\x16\x29\x82\xa2\xca\xbc\xc0\x92\xd4\x45\x8b\x38\xef\x05\x04\xc0\x9c\x37\x88\xcd\xcd\xa0\x70\x81\x15\x00\x7f\x69\x5e\x2d\xdc\x68\x0e\xec\xc4\x59\xc5\xf2\x12\x53\x1d\x15\x32\xb1\x0e\x6d\x27\x12\x5c\x6e\xb8\x74\x06\x8a\x08\x54\x06\x5a\x86\x9b\xcd\x38\xf9\x95\x6c\x74\xc4\x05\xc8\xb6\xc9\xde\x6c\xde\xc0\x5a\x5e\x52\x45\xa5\xf7\x96\x9a\xd0\x89\x1e\x55\x64\x0b\x4d\xa1\xa7\x3a\xd4\x14\x21\xce\x4d\xe6\x74\xbb\xb3\x4f\x34\xe9\x07\x1a\x5a\x07\xf1\x41\x7e\x18\xd7\x58\x03\x55\xf2\xb1\xba\x59\x54\xbb\x49\xb1\x30\xed\x68\xf5\x79\x67\x08\xca\x26\x89\x19\xc5\xab\xa9\xec\xa8\xfd\x9a\x04\x5a\xae\x8a\xca\x8d\x5c\x9a\xeb\x16\x7b\xe3\xb7\x84\x31\x6d\x75\xbd\x0e\x22\x2b\xd9\xd5\xa4\x06\x3a\x31\x5b\x49\xd2\xca\x72\x5c\x7c\xf3\x21\xd7\x4e\x98\x43\x45\x3a\xa5\x52\xff\x69\xe6\x40\x3d\x47\x95\x5f\x14\xac\xf2\xa4\x40\xd2\xb2\xa6\xb0\xa4\x80\x28\x8d\x92\x79\x46\x23\x39\x80\x38\x16\xb2\x32\xc2\x0a\xc7\x21\x0d\x61\x9a\x02\x2a\xe0\x34\x1e\x52\x02\xe2\x29\x4a\xe6\x38\x8e\xd7\x28\x6e\x1d\x15\xd1\xfe\xbf\x13\xaa\x7d\x56\xe3\x39\x92\x23\xc9\xb3\xab\x11\xbb\xbb\x9b\x72\x17\xc0\xf3\x97\xa6\xd5\xfc\x8d\x06\xc1\x73\xbd\x64\xad\x11\x5f\xe8\xe3\x21\xcf\x0d\xb4\xc4\x62\x02\xf3\x8e\xe3\xaa\x6c\x6c\x5a\x5b\x90\xdd\x58\xb2\x82\xf4\x95\x47\xe1\x6a\x99\x59\x38\xe9\x66\xa3\x52\xd2\xe8\x8e\xdc\x98\x4c\x85\x6e\x65\xa8\xe4\x75\xa3\x38\x74\x5a\x26\x44\x19\xa8\x89\xf1\xb9\xdd\x5c\xb8\x53\x47\x09\x14\xd3\x37\x88\x83\x0e\x95\x53\xf3\xb8\x5e\x6d\x4e\x79\xc9\x19\x77\x93\x4d\x87\x6d\x70\x45\x89\x2d\x77\xe1\xaa\x56\x29\xe7\x72\x18\x0e\x46\x95\x82\x54\xa0\x19\x37\x59\xae\x17\x8d\x6e\x82\x41\x59\xad\x20\x66\x3a\x0e\x95\x5d\xd8\x66\xad\xb6\xd0\x97\x8b\x6e\x52\x1d\x56\x97\x88\x7d\x6d\xaf\x50\xbb\x91\x6e\xfa\x11\x59\xe9\x84\x41\x1c\xa1\xde\x5d\x7f\x73\x83\xa0\xef\x35\x08\xf8\x1c\x65\x7e\x61\x29\x55\xe0\x35\x86\x62\x31\x66\x79\x15\xc8\x90\x93\x19\x99\x17\x34\x48\x21\x8d\xa1\x00\x90\x39\x86\x15\x10\xa4\x35\xa4\x01\x9a\xa4\x90\x4a\xca\x0c\x94\x59\x8a\x92\x49\x4e\xc6\xc2\x45\x83\x38\xaf\xf2\x10\x5c\x58\x9e\xdb\xdd\x0d\xea\x33\x68\x46\xb8\x34\xa9\xbe\x35\xef\x0a\xab\xaf\x43\x50\x9e\x32\x36\x29\xe7\xb9\x0e\x6d\x2d\x2b\xb3\xd6\x22\x43\xb5\x27\xf6\x28\x36\x4b\x8b\x15\x2f\x09\x0a\xb0\xc4\x25\x38\xf6\x75\xc0\xc3\x9a\xee\x4e\xc5\xc6\xb8\x41\x2e\xf4\xf4\x04\x68\x43\xa3\x09\xe7\x65\x7d\xd6\xee\xd4\x93\x66\xa3\xc3\x4c\x4b\x55\x8a\xa6\x1b\xa5\x20\x54\x59\xdb\x83\xe6\xeb\x6b\x6e\xf7\x47\xf4\x55\xd6\xdd\x7f\x9f\x8b\xd5\x5a\x90\xa6\x15\x07\x9c\x93\xcd\x52\x78\xf0\x36\x6b\xb9\x1d\xa9\xaa\x89\xe6\xac\xed\x4e\x44\x11\xc6\x5f\xeb\x64\x7e\x58\x15\xd3\x39\x35\x2b\xd7\xa0\xdb\x30\xa6\xf9\x85\xd5\xe2\xcc\x65\x6c\x85\x17\xaf\x53\xb7\xbb\x20\xcb\xc5\xee\xd2\x2e\x30\xb3\x76\x2d\x37\x4b\xad\x52\x56\x2c\x3d\xee\xa5\x2b\x38\xc8\xfb\xe6\x4e\xd8\x4b\xa6\x76\x4a\xe7\xfe\xd3\xec\x05\x3c\x47\xd7\xfd\x03\x54\xd6\xa8\xc9\x6f\xc4\x0b\x10\x38\xf2\x3b\x09\xbe\x93\x80\x20\xc9\x1f\xfe\xbf\xb3\x3a\x4d\xd1\x34\x7b\xde\x41\x6c\xef\xee\x57\xdf\x2e\x68\xfc\x69\x7d\x0f\x48\xfa\xd9\x5d\x73\xfe\x4a\x74\x0b\x06\xbd\x8c\x2f\x1b\x85\x04\x97\xb2\x52\x42\x16\x92\x8b\x61\x22\xe6\x92\xba\xe7\xce\x73\xf3\x15\xe8\xaa\x8d\x4e\x0f\x25\xf2\x28\xed\xab\xb2\x74\x42\x95\x4f\x5f\x5b\x55\x16\xc5\xc4\xe8\x13\x18\x79\xea\xf5\xb2\x55\xa6\x8d\x2a\x5f\xa9\xf8\xb8\xe1\xa0\xd2\xa8\x05\x20\x67\xce\x9f\x39\xbb\xd7\xe9\x8c\xdd\x5d\x01\x03\x77\x3a\xce\x91\x0c\x17\x19\x0c\x15\xde\x83\x11\x0d\x0c\xbd\x5d\xcb\xa0\x21\xcd\x32\xdf\x08\x10\x0d\x0c\xb3\x4b\x00\x33\x80\x15\x22\x83\x61\x77\x59\x33\x8e\xf7\xab\x48\xa3\x81\xe1\x42\x95\xfc\x54\x34\x30\x7c\x78\xaf\x43\x34\x30\x42\xa8\x42\x9d\x8e\x06\x06\x90\xe1\x4a\xf7\x88\x70\xde\x95\x95\x47\x84\x13\x2e\xdd\x8e\x4a\x0f\x15\x2a\x8f\x8e\x0a\x87\x0e\x97\x20\x47\x84\x13\xaa\xc2\x65\x22\x82\x61\x43\xc5\xbc\x11\xc1\x70\xc7\xe5\xa3\x51\xa9\xe1\x43\x55\xb5\x11\xc1\x08\xc7\x65\x96\x11\x55\x19\x92\xc7\x60\x22\x32\x05\xc1\x71\x39\x62\x54\x30\x30\x54\xd5\xf8\x9c\x13\xa3\x9f\xb2\xdf\xfb\xf2\x71\x66\xdf\x08\x78\xf3\x06\xf0\x33\x07\x27\x3f\xec\x2b\x0f\x5c\xc9\xa1\x73\xdc\x7f\x81\xc1\xd6\x50\xbf\x4c\xd4\x3f\x48\xc7\xaf\x4a\x3d\xaa\x49\x3d\xb3\x63\x37\x38\x98\xd6\xf9\xed\x07\xf1\xef\xdf\xb6\x7b\x01\xad\xf5\xff\xff\xf7\x78\x8f\x20\xf9\x8d\xf8\x4d\x9e\x2e\x0d\x4b\x3f\xb3\x43\xf3\xf0\xde\xc5\x6d\x7a\xd8\x34\xdf\x43\xd9\x6e\x15\x3d\xba\x79\x71\xcb\xe0\x21\xbe\xe7\xec\xf7\x3b\x46\xfe\x94\xcd\x2b\x1f\x70\x2a\xc9\x29\xa5\x38\x0c\x75\xf6\x5f\xd8\x3b\x94\x82\x79\x8e\x52\x84\x6a\x9e\x9f\xd7\xdd\x7f\xdb\xbe\x39\x8a\x1f\xf7\x5f\xc8\xcf\xef\x9b\xff\x1a\xec\xaf\xa3\x14\x87\xb3\x81\xfd\x17\xfa\xb4\x52\x40\xe6\x84\x52\xf0\x17\x95\x82\xde\x28\x05\x73\xab\x52\x6c\x37\x5b\x3f\xa6\x14\xdb\x5d\xdf\x8f\x2b\x45\xf4\x0d\xfb\xe7\x95\x22\xf2\x16\x89\x0f\x38\xc0\xea\x94\x52\x1c\xce\xed\xf6\x5f\xf8\xd3\x4a\x01\x82\xeb\x58\x29\x84\xcb\x23\xc5\x41\x72\x27\x18\x32\x76\xd7\x7f\xd5\xe4\x6f\xa3\x26\x47\x73\xf7\xfd\x97\x7b\x22\xc0\xd0\x76\xa5\x87\x3d\xca\x7f\xb5\xe2\xe7\x6b\xc5\xd1\xa1\x0a\xbb\x2f\xec\x6e\x59\xfd\xdf\xbf\x79\xf6\xa3\xa7\xc5\x68\x8e\x3d\x7e\xd4\x67\xff\xc2\xe7\x3c\x7c\xc0\x59\x69\x27\x7a\xea\xf8\x8c\x88\xdd\x17\xf2\x7d\x4f\x3d\x70\xb8\xcb\xbe\xa7\xa2\xdb\xc2\x2f\x7c\xb6\xc3\x07\x9c\xa9\x77\xaa\xa7\x8e\x12\x78\xbb\x2f\x41\x94\xc6\xde\xb6\xef\xde\x73\xa6\xae\x87\xf1\xa3\x7d\xe1\x83\xb1\x1f\x3e\xee\xe9\xd7\xe8\xb9\x8f\x1f\x0d\x8f\x4f\xbb\xd8\x7d\x21\x7f\x72\xcf\x3d\x60\xd0\xbf\x46\xcf\x7d\xfc\xcc\xe8\xf8\x0c\x8f\xdd\x17\x36\x72\xcf\x45\xf7\x54\x1f\xd2\x73\x3f\xcd\xaf\x7d\x56\xcf\x6d\x96\x05\x76\x5f\xe0\x4f\xee\xb9\xa7\x8d\x96\x3f\xab\xe7\x3e\x7e\xb4\x3c\x5c\x41\xd9\x7d\xe6\x0f\x4e\x52\xd0\xa6\x96\xba\xe1\x25\xe2\x99\xc1\xbe\x5c\x82\x93\x7b\x1f\xb5\xa7\xeb\xc7\x3a\x3c\x78\xb6\xf1\x3d\x52\xdb\xac\xf4\xec\x3e\xd3\x1f\x2a\xb5\x07\x74\xf9\xd7\x92\x5a\xb0\x22\xb5\xfb\x4c\x7e\xac\xae\x3d\x30\x1d\xfc\x95\xa4\xb6\x59\x39\xdb\x7d\x66\x3f\x56\x6a\x0f\xa4\x65\x3f\x5a\x6a\x57\x56\xe1\x4e\xbc\x6b\x33\xea\x0a\xdc\xe6\x7d\x9b\x27\x57\xdf\xc8\xb3\x67\x85\x04\x47\xf1\xf8\xa7\x73\xed\x4b\xa7\xfc\xdf\x0e\x7e\xd0\x90\xe9\xe2\xed\xa4\x8f\x66\x01\x60\x79\x96\x64\x19\x76\xed\x16\x21\x64\x2e\x94\x42\x84\x88\x3a\x5a\x61\x38\x4d\x14\x3c\x24\x8a\x09\x13\xc5\x5c\x21\x8a\xe1\x48\x1e\xae\xe1\x6f\x6b\x57\xae\xcb\xff\xfa\x0b\x1a\x1f\xe8\x91\xd3\x2f\x76\x3a\x59\x41\x04\xcf\xd7\x04\x5c\x05\x04\x43\x6b\x69\x91\x01\x51\xa1\x85\x9f\xc8\x80\xe8\xf0\x62\x41\x54\x40\x4c\x38\xc1\x1c\x15\x10\x1b\x4e\x41\x46\x05\xf4\x2e\x6b\x15\x15\x10\x1f\x02\x74\xae\x2c\xe9\x2a\x20\x21\x94\x9d\x39\x57\x86\x71\x5d\x21\xc9\x10\xa4\xc8\xfd\x7f\x5c\x55\xf4\x88\x02\x1c\xd7\x15\x3d\x44\x13\x15\x9a\xa7\x45\x87\x44\x87\xe7\x0d\x91\x21\x31\xc7\x81\xec\xb9\x9a\x95\xeb\x80\xd8\x63\x40\xd1\x79\xe3\x8e\x83\xc4\xe8\x14\xf1\xa1\x68\x33\x32\x20\xe1\x38\x00\x8b\x4c\xd1\x51\x9d\xd1\x23\x76\x72\x54\x69\xc4\x3e\x42\x11\x3c\x06\x74\xbe\xd6\xe8\xde\x97\xcc\x3e\xa3\xda\xe8\xda\x3b\x05\xef\xa9\x37\x3a\xfb\x4a\xd9\x27\x78\xd7\x83\xb7\x0f\x21\x1a\xab\x88\xa1\x29\x84\x35\x9e\xe2\xa0\x4c\x53\x88\xc5\x08\x09\x0a\x86\xaa\xc0\x0b\x1c\xe0\x21\x2d\x23\x05\x28\xbc\x06\x31\xa9\x02\x15\x72\x94\x26\x53\x32\xc3\x40\x08\x81\x7f\x0e\x08\xd8\x24\xb7\x23\x27\x22\x0e\xb6\x69\x70\xdb\xc2\xf4\xb3\xe7\xae\x09\x24\x7d\xf6\xc0\x9d\xdd\xdd\xa3\x28\x21\xa8\x68\x2f\xb0\x43\x6c\x50\xc3\xb1\x9d\xe3\x9b\x19\x33\x15\xc7\xba\x42\x71\xd5\xae\x97\x2d\x14\x56\x9d\x36\x3f\x6f\x1b\xaf\x09\x94\x9c\x32\x45\xc6\xdf\xc1\x1a\x9c\x57\xe6\xef\xbb\x48\x87\x0a\xae\x13\xfb\x8f\x7e\xd3\x44\xbb\x5d\xde\xec\xb0\x4b\x82\x69\x42\xcd\xda\xcd\xa9\x5e\x9a\xd5\xbc\x14\x97\x18\xe4\x8a\x54\x19\x0b\x6a\xbb\xaa\x65\x72\xb1\xbc\xc1\xe4\x67\xad\x4a\xec\x55\xf4\x38\x7f\xb3\x47\x3a\xdd\x6e\x07\x7b\x3b\xc4\x42\x8a\xcf\x54\x17\x5d\x8d\x4a\x96\x86\xed\xc2\x8c\x7a\x1b\xac\x5c\x16\x4d\x61\x16\x95\xb2\x59\xd2\x65\x12\x14\xac\xb7\x5b\x35\xc3\x1b\x6c\x76\x5b\xcc\x9c\xb9\x7e\x40\xcf\xc9\x22\xf7\xcc\x8e\x9f\x9a\xf4\xda\x4a\x08\x6f\x06\x1e\xad\x4a\xee\x24\xfe\x5a\xa4\xbc\x64\x26\x21\x68\x8b\x92\xf5\x3a\x43\x89\xd4\x64\xb0\xac\x61\x4e\xb5\xdc\x64\x2e\x5b\x30\xcb\xed\xf8\x22\x47\xb3\x9c\x3e\xab\x74\x1b\x96\x9c\x26\x6d\x7a\x9c\x54\xd4\x8a\xe6\x09\x09\x6b\xa1\xe6\xd8\x57\xf3\xd5\x1c\xe8\xf3\xde\x5f\x2f\x87\x3b\x06\x0e\xf7\x89\xec\x3f\xa6\xf6\x3f\x06\x62\xaa\xc0\x64\x5c\xac\xd0\x4c\x2f\x91\xa2\xbc\x6c\x3b\x5d\x01\x75\x4a\x24\x4b\x78\x54\xe5\xf3\x75\xd6\x2a\x03\x51\xc0\x1d\x43\x5d\xe6\xbc\x56\x08\xde\x73\xe4\x15\xbd\xbf\xc4\x22\xcb\x6f\xf0\x07\xb0\xf6\xfc\xd7\x76\xfa\xe2\xf3\x9b\x3c\x38\x0e\xc0\x79\x2b\xb3\x45\x5c\x41\xfa\x70\x51\x42\xad\xaa\xc0\x26\x56\x9a\x2b\x60\x52\xb1\x9d\xf2\x6b\x77\x95\xe8\xe4\x47\x69\xbb\xc0\x8d\x66\xa3\xe0\xa1\x0a\xe3\xe4\x52\x7b\xfd\x0b\x68\x0d\x1f\x7b\x21\x86\x36\x75\x06\xf2\x56\x57\x9d\xf0\x89\x31\xef\x9e\x29\xee\xbf\x27\xa7\x36\x65\x7b\x34\xf3\x96\xac\x4a\x8b\x49\x2d\x4e\xd9\xd9\x72\x6c\x05\xb8\xfa\xd2\x70\x81\xa9\x95\xd2\xbd\x71\xad\xa3\x3b\xd3\x46\xac\x19\x3c\xc0\x8d\xdd\xcd\x0e\x6f\x9f\xff\x56\xa8\x7f\x8f\x68\xd9\x5e\x81\x7e\x26\xa8\xf2\xeb\xa5\x8d\x18\xfe\x3d\x7b\x07\x2f\x59\x13\xa3\xea\xcb\x23\xfd\xeb\xcb\x4f\x8b\x6f\x2f\x5e\x3c\xb6\xaf\x64\x5b\x9c\x0d\xe3\x37\xc9\x37\xe0\x95\xeb\x15\x79\x91\x1b\x9a\xba\x54\xc5\xa4\xda\x6a\x71\xed\xac\x92\xaa\x2d\xd8\x5a\x7c\x6e\x66\xdf\x14\xaa\x95\x02\x0c\xca\x53\x39\x03\x04\xfa\xdd\x6e\x91\x1b\x21\x15\x3b\x74\x9a\xc4\x83\x0a\x2b\x2e\x85\x24\x59\x75\x33\x92\x3e\x53\x00\x07\x40\x4b\xe0\x7b\x43\x7a\x5c\x1c\x8d\x85\x1a\xc7\x8c\x92\xd4\x2c\x60\x75\xcc\xe4\xe7\x89\x1d\xe5\xf1\xf9\x8e\x9e\x80\xfe\xdc\xa8\x5b\x9e\xf1\xe7\x49\x0f\x0e\xe5\x12\xb7\x07\xaa\x88\x29\x4f\x9f\xcd\x53\xd3\x4a\x47\xac\x09\x5c\x1d\xd4\x9b\x5e\x4b\x9d\x97\x53\xd9\x49\x2a\x9e\x6c\xe1\xc9\x4a\xad\x55\xbb\xa6\x6d\x29\x46\xb1\x1d\xe2\x3f\x51\x6f\xb7\x1b\x1b\xf9\xeb\xf1\xc4\x90\x6f\x53\xc2\x7c\x98\x03\x0d\x47\x60\x6d\x85\xab\x8c\x1d\x6f\x00\x87\x89\x85\x50\xac\xd4\x54\x61\xd4\x6e\x4b\x39\xa7\xd7\x78\x94\xff\xbd\x7e\x5d\x18\x0f\x0f\xfa\x47\x8f\xd2\x3f\x07\xf0\x5b\xed\x76\x6b\xb3\x8d\xd4\xae\xce\x7b\xf1\xb4\x1a\x57\x72\xcb\x72\xeb\x2d\x8e\xdf\xb2\x95\xd5\xe4\x8d\xeb\xa9\xf6\x5c\xd1\x1a\xab\x51\x56\x7b\x4d\xb7\xeb\xc9\x02\x94\x7c\xf9\x3e\xa2\x9f\x75\x1a\x6d\x4e\xfb\x38\xb0\x8f\xd0\xf5\xb0\xfd\x44\xef\x3f\xa9\x54\xc9\x91\x17\xec\xe7\xe0\xca\x95\x06\xed\x77\xdb\x70\x1f\xb6\x9f\xe8\xfe\xa1\x96\x28\x2d\x2f\xd9\xcf\xc1\x75\x72\x90\xdd\xdb\x4f\xd0\xfe\xce\x78\xe3\x01\x7d\x12\xb3\x0a\x30\xc5\xec\x9e\xf4\x93\xf2\xde\x6f\x26\xfd\x74\xfa\x0a\xf2\xc8\xba\x4a\x9f\x2f\x3f\x3b\x3a\x7d\xed\x76\xb3\xbe\x01\xe5\xc9\x7a\xb7\xce\x4a\x9c\x9d\x2a\x92\xc5\x5a\x6c\xde\x6b\x24\x85\x55\x77\xd6\x6d\x37\xa9\x85\x51\x35\x7a\xd3\x86\x0c\x52\xb3\x71\xad\x88\x03\xfd\x4c\xa5\x8c\xf2\x69\xfa\xde\xd9\xd7\xa9\xae\xf7\xe9\x4d\xee\xf5\xe5\x5e\x7f\xff\xc0\x78\x20\x89\xcd\x92\x7b\x9b\xbd\xbd\xf3\xbf\x7f\xed\x63\x17\xbf\x5f\x7d\x31\x16\xf6\xf7\xa3\xc4\x06\x9b\xc3\x54\xf5\x1d\x01\x4f\x8c\x0d\xdc\xfd\xf7\x7b\x75\x23\x35\x45\xcb\x40\xc1\x92\x7b\xa4\xe1\x53\x93\xc2\x76\x1e\x74\x89\x6f\x5b\xa7\x2f\x5f\x7e\xff\xae\x9b\xb5\x2c\x7c\xcb\xb3\xcd\xd2\x72\x69\x09\xa3\x19\x26\x73\xbd\x2c\x88\x4b\x4b\x75\x2c\xd8\x52\x65\x9c\xcd\x27\x38\x0f\xe2\x79\x4e\x57\xde\x5a\xa0\x1b\x97\x86\x43\x67\x9a\xe4\x19\xb5\xa0\xba\xdd\xc6\xd0\xe8\xe5\x17\x24\x13\xa3\xc8\x8c\x96\x26\x87\x93\x71\x7b\xdc\xc9\xa4\x12\xfa\x5f\x7f\xf9\x99\x74\xcb\xb6\xf0\x6e\xcb\x70\xf0\x77\x3d\x7b\xf4\x27\x49\xd7\xa7\xd0\x87\x6f\x7b\x96\x01\x64\x15\x08\x69\x15\x03\x8a\xe7\x04\xc8\x21\x8e\x52\x21\x0b\x78\x4c\x43\x8a\x06\x30\x38\x4d\x92\x83\xb4\x4a\xa9\x34\xa4\x78\x5e\x21\x31\xaf\x70\x58\xe0\x90\xba\x39\x5b\x82\x7c\xde\x34\x8f\xbd\x32\xcd\x63\x81\x00\xa9\xf3\x67\xc3\x6c\xef\x1e\xe5\x70\x1f\x9d\xe6\x85\x6d\xfd\x89\xd3\x3c\x31\xa4\x4a\xa7\xdd\x8a\x7f\xa1\xed\xb0\x90\x10\x01\xa9\x01\x53\x5d\x14\x96\xcc\xcc\x9b\xd5\x5e\x99\x8c\x9d\x74\x15\x56\x58\xe4\xc8\x59\x42\x99\x57\x24\x94\x34\x85\xb4\x67\xc5\xe0\xa4\x9d\x2e\xca\xb5\xee\x2a\xd9\xca\xad\x9a\x59\x34\x55\x26\xf1\x18\xa4\x14\xca\x4c\x23\x47\x58\x14\x79\x0f\x65\xbd\x4a\x22\xf6\xea\xcc\x41\x4a\xff\xeb\xce\x29\xdb\xc1\x75\xaf\xd9\xed\x81\x7e\xb8\xec\xce\x4e\xc3\x0e\x42\x8c\x28\xd3\xb0\xe0\x88\xe6\x3d\x3c\xf1\x74\xc8\x72\xea\x4a\x3c\x19\xbf\x14\x05\x7f\xc2\x97\xc7\x87\x0c\xed\xc9\x77\x18\xcf\x0e\xe1\xd2\x47\xe0\x7f\x8e\x6b\xf1\x2f\x7b\xcf\xcf\x2f\xac\xe3\xfe\xf5\x68\x98\xf9\x21\x61\x52\xb8\x0f\xfe\x76\x61\xdc\xa9\x50\xe8\xe0\x50\x93\x28\xfa\x3a\x6c\x85\xe0\xfd\x44\x7b\xb9\x07\x7f\xe0\x1f\xfe\xfd\x51\xce\xe7\xb9\x61\x0d\x29\x6b\x90\x24\x01\x0d\x10\xc7\x69\x58\x46\x48\x10\x20\xad\xd1\x90\xc2\x2a\xc3\x73\xb4\x20\xc8\x90\x53\xb0\x40\xd2\x8a\x00\x05\x96\x43\x24\x8d\x00\xd4\x20\x2f\x53\x88\x91\x31\xc3\xbf\x7c\x23\x84\xe7\x45\x35\xcc\xb5\xa8\x86\x02\x02\x79\xfe\xe4\xec\xed\xdd\xa3\x05\xe5\x47\xa3\x9a\xf0\x28\xf9\x6b\x24\xaf\x6f\x4a\xd6\x1c\x24\xaf\x8b\x03\x75\xc6\xf6\xea\x2b\xdd\xcb\x4f\xb8\x1c\x2c\x94\x97\xad\x4a\x59\x6a\xda\xec\x98\x55\xe2\x75\xd5\xe9\xa6\x3d\x4b\x6a\xc8\x35\x2a\x5e\x29\x95\xbb\x78\x34\x8a\x53\xd8\x26\x7b\x0a\x45\x32\x6e\x81\x89\x2d\x07\xcd\x62\x69\x99\x34\x6a\x39\xcb\x4a\x95\xbc\xee\xa4\xdc\xce\x0b\xfa\xdf\x28\x79\x7d\x20\xaf\x47\x93\x9b\xfe\x75\x2d\x79\x7d\x20\x8a\x28\x51\x0b\xd8\xeb\x5f\xf2\x00\x9f\x18\x96\xe5\x89\x2b\xf1\x64\xfc\x0f\x44\x6d\x25\xf1\xf8\x24\xae\x4f\x4c\xe6\x06\xa4\x9c\x4f\x46\x15\x8b\xb5\xae\x76\x21\x99\xeb\xa3\x3d\x88\x12\xee\x4d\xe6\x46\xf7\xc2\x17\x92\x51\x81\xcc\xcd\x5a\x91\x8e\xbf\x5b\xcc\xd8\x5d\x7e\x7f\x25\xf4\xbd\xe8\x7f\x8a\xbd\x3d\xc0\x7f\x85\x71\x36\x9e\xfb\x42\x14\xb7\xef\x9f\xff\xc3\xc9\xf6\x87\xed\x27\x7a\xff\x35\xec\x34\xaf\xdf\x96\xcc\xb5\x2b\x2c\x77\xa1\x7f\xa2\xd9\xcf\x03\x8b\x03\xb7\x47\xb1\xc9\x54\xae\xdd\x0b\x53\x1e\x8c\x77\x0f\x24\x23\xa3\xeb\x53\x70\x9d\x4c\x46\xee\xaf\x83\xf1\xfd\xd3\xe9\x3b\xbf\xb8\x17\x92\x5f\xf0\xe3\xa7\x27\x73\xdf\x12\x5a\xee\xc3\xe5\xf7\x00\x7d\xe7\x17\x77\x82\xeb\xd4\x2c\xea\x20\x7e\x8a\x32\x8b\x19\xd1\x7b\x78\x07\xf1\xc4\xe1\x75\x79\x16\xf5\xc4\x59\xdc\x3d\xf8\x37\xb3\xa8\x69\x1a\xc6\x27\x83\x6c\x25\x49\x8e\x2d\x77\xd8\xb3\xa9\x7c\x8d\x26\xeb\x95\xe1\x9b\x3c\x59\x09\x69\xe8\x29\x1d\xa8\xd4\xf3\x5e\x4a\xe3\xe9\x39\x50\xd9\x46\x33\xae\xb2\xc3\xfa\x60\xa5\x35\xc7\x73\xc7\xe2\x0a\xe9\x92\xbb\xca\x15\xf2\xa2\x81\x95\xd2\x12\xe0\x11\x68\x59\xf0\xf9\xc9\x61\x1a\x91\x48\x01\x2c\x16\x68\x9e\x03\x24\x10\x04\x96\x11\x64\x12\xf3\x80\x02\x32\x26\x59\x55\x63\x04\x9a\xc6\x0c\xc7\x93\xac\x42\xaa\x32\x07\x21\xcf\x08\x98\xc6\x3c\x42\x2a\xc0\xfe\xcb\x86\xf8\xcd\x2c\x2a\xea\x8e\x96\x3b\x4a\x80\x58\x9a\x01\xe7\x5f\xb9\xb5\xbe\x09\x5e\x42\xc5\xb4\x81\x52\xde\x39\x88\xdf\x53\x01\xf4\x53\x9c\x70\x32\x36\xdb\x68\x63\x5a\x3c\x1b\x69\x48\x3b\x7e\x6a\x99\xe4\xac\x58\xaf\xcc\xb3\x5e\x26\xc3\x8e\x61\x35\x4f\xe6\x72\x2b\x2a\x5d\xcf\x66\x5a\x0b\xa1\xb3\xd4\xdf\xca\xdd\x6c\xb9\x56\x2d\x93\xbd\xc9\x28\x6e\x37\xcb\xa6\x97\x17\xa7\x55\x8b\x81\xe9\xd7\x58\x85\xd3\x72\xe3\x99\x92\xd5\xb4\x52\xb1\x5d\x4a\xa6\x53\xe5\x54\x53\x4f\x5b\x4e\xae\x56\x8a\x9e\x4e\x8e\x14\xf4\xfc\xca\xf2\xfe\xeb\xfc\x84\xea\xa0\xd5\xbd\x01\xed\xa9\x6a\xa0\xf7\xb8\xaf\x4c\x68\x9e\x87\xff\x0c\xef\x57\xd2\xd0\xfb\x80\x3f\x88\xe8\xa2\x57\x5f\x04\xa4\xfc\x9c\xea\x8b\x7d\x09\x99\x4f\xcf\xc9\x91\x3f\xb5\xe7\xf7\xd3\xab\x97\xfc\xeb\xfc\x6a\xf0\x3a\x6a\xaf\x5e\xab\x5e\xfa\x7b\x4e\x78\xe7\xe2\xf1\x2c\xff\xde\xb1\x25\xbc\x42\x7c\xba\x7f\x4f\x0f\xb1\xbb\xa6\xcf\xc6\x7f\xba\xd2\xe0\x3c\xff\x8a\xf8\x33\x26\x2c\x05\xbd\xbb\xbc\x6d\xc2\x92\x58\x54\xb9\xd3\xab\xee\xc1\xf8\xf4\xe9\xd5\x4a\xe7\x03\xee\x70\xd7\x17\x52\xd3\xe9\x51\xd2\xe2\x64\xf5\x44\xf6\xa0\xc1\xbd\x63\xdb\xa9\x25\xae\xf7\x83\xea\xe5\x60\x37\xf7\x18\xfe\xc3\xca\xce\x7b\xf0\x6f\x82\xdd\x5e\x81\xf7\x24\x4e\xc4\x64\x4f\x7e\x93\x7b\xbc\x55\xd3\x87\x55\xa5\x2d\x29\xaf\xcd\x2c\x90\x0b\x49\x1b\x28\x0a\x10\x79\xaa\x6e\x8c\x9b\xb1\x41\x09\x76\xc8\x51\x92\x8e\x69\x56\xaf\x6d\xd1\x9c\xc7\x1b\x48\x98\xab\x02\x3f\xf7\x5a\xf3\x5c\xab\x44\x96\x2b\x62\x07\xbb\x03\x71\xfe\xec\x60\x17\xb0\x34\x62\x48\x96\xc6\x32\x62\x69\x0d\x2a\xaa\x8c\x54\x99\x67\x58\x59\xa3\x68\x9a\xa7\x79\x46\x53\x58\xc8\x42\x9a\x43\x2a\xa2\xb0\x4a\x09\x8a\xaa\x6a\xa4\xc6\x0a\x24\x04\x14\x25\xfb\xaf\x61\xf2\xff\x45\xdf\xe6\x18\xec\xd6\xbb\x14\xe3\x72\x10\x9e\x7f\x41\x9a\x7f\x13\xbc\x1c\x6f\x16\x09\x54\x31\x53\xe4\xb3\xb5\x59\x6d\x24\x17\x60\x56\xa4\x3a\xed\x61\xdd\x29\x8c\x87\x5d\x92\xd4\x32\xbc\x5b\xcc\x71\x63\x52\xaa\xcf\xf3\x9d\xb8\xd8\xa5\xc4\xe3\x97\x72\x87\xe7\x35\xef\x86\x9a\x08\x61\x43\xe1\x10\x5e\x7b\x36\x4f\x0b\x73\x5f\xa9\x1a\xd2\xab\xf1\x2a\xe3\xf4\x3c\xe9\x3a\x85\x84\x55\xc8\x4d\xdd\x38\xc9\xb4\xbd\x7c\x2a\xe1\xe8\xb6\x3b\x1d\x14\x6b\xf1\x16\xdb\x6d\x0d\x69\x6f\xde\x59\x0e\x5c\xae\xe5\x35\xe8\x64\x09\x2f\x2a\x25\x36\xff\xa6\x68\x6f\xf9\x02\x20\x3b\x66\x62\x34\x9a\x5b\xb4\xce\x57\x73\xda\x30\x97\xb9\x21\x0c\x3d\xd2\xd9\xe3\x50\xed\x80\xe7\xe0\xad\x21\x21\x99\x24\x8c\x78\x82\x2c\x92\xf9\xcc\xd2\x1b\xcc\xcb\xc0\xec\x91\x68\x39\xb1\x81\x50\xce\x2e\x66\xc5\xe4\xb2\xc2\x78\x09\x49\x49\x06\x3c\x52\xba\xe7\x94\x9d\x65\xb3\x3e\xbf\x46\xc4\x15\x73\x7e\x00\x7f\x69\x5e\x1c\x4f\x1e\xc0\x2f\x86\xf0\x47\x19\x4e\x36\x2f\xe1\x3a\xf9\xae\x95\x4b\xf8\x4f\x0e\xad\x0f\xc8\xa2\x62\xf5\xe2\xb1\x83\x77\x6d\x9f\x09\x55\x3f\xac\x2f\xd6\xf8\xf9\x83\x37\x1b\xe7\xee\x96\xc5\xbf\xa5\x41\xa6\x37\xee\x50\x03\x45\x74\x0a\x4b\xfd\x75\x69\x14\x9d\xaa\x50\x69\xcb\x8d\xda\x1c\xd1\x85\x62\xd1\x6e\x90\x55\x50\x31\x41\x2e\x56\x54\xd2\xae\x2d\x57\x40\xb1\x35\x15\x87\x59\xb7\x39\xac\x18\xc8\xca\xb2\x46\xc3\x53\xd3\x93\xda\x6b\xbe\x94\x8f\xe5\xaa\xa9\x65\x96\x5e\x3e\x3f\x8f\x00\x55\x52\x85\x2c\xad\x0a\x18\x62\x8a\x62\x69\x05\x0a\x1a\xd2\x58\xc4\x62\x85\x07\x0c\xe2\x11\x8f\x59\x44\xb3\x18\x52\xa4\xc0\xaa\x08\xd0\x00\x68\x50\x58\x7f\x53\x39\x9e\x03\xf0\xe5\x1b\xc1\x3d\x2f\x8f\x70\xb5\xc6\x8c\xe1\x18\x78\xf6\x0d\x32\xfe\x5d\xf6\x25\xb4\x99\xf6\xd1\x44\xc2\xd5\x1a\xb3\x9f\x32\xb1\x4d\x75\x46\x6c\x2d\x91\xac\x0c\xbb\xd9\xd0\xa8\x7d\x68\x05\xfb\x44\x42\xd6\xd6\x30\x25\xeb\xea\x30\xa1\xb2\x2c\x2d\x3a\x6f\x4e\xa1\x38\x84\x71\x03\xd1\x72\x11\x31\x3d\x33\x13\x2f\x15\xb9\x69\xba\x5d\x2f\x74\x9a\xf2\x84\x34\x27\x72\x21\x89\x48\x39\x5d\x67\x44\xc9\x4a\x66\x53\xf1\xf4\x32\xaf\x17\x06\x54\xd3\x28\x57\x26\x05\x2a\x9b\xae\x8f\x3a\x35\xfe\x93\x13\x09\xb9\x5f\x58\xde\xe7\x13\x09\x07\x13\xe9\x48\x13\xf9\x77\xf5\x6c\xd7\xb6\x15\xed\xaf\xf0\x44\xfe\x51\xfc\xb7\x6d\x6b\x3a\x8f\x3f\x08\xb6\xa3\x27\x12\x82\x11\xfd\xe7\x24\x12\xc0\xa4\x32\x12\x6b\x43\x1b\x2c\x56\x53\xb4\x3c\xed\x21\x0f\x56\x42\x7f\xe1\x89\x51\xea\x14\xfd\xd2\xbe\x7f\x7e\xe1\x95\x3f\xa5\x19\x5b\xbd\x93\xfa\x7e\x22\xbd\xe1\x2f\xc2\x44\x3e\xbb\xd7\xaf\xdb\x4a\xcd\x0f\xae\xda\x47\xe0\xbf\x23\x91\xe1\xf3\xdf\x13\x7f\x46\xe5\x80\x7f\x5d\x48\x24\x9c\xf7\x4d\x7b\x9e\xfe\x7e\x89\xb7\x93\xd1\x6e\xe6\xa0\x41\x84\xc8\xfb\x5d\xed\xe1\xb5\x5a\xd9\x83\xeb\xc0\x76\x23\xe3\x7f\x57\x7b\x78\x23\xfe\x4d\xb4\x8b\x07\x02\xa7\x4e\x13\xb0\x94\xa6\x1c\x47\x4f\x4e\xdf\x5c\x7b\x5a\x95\x63\x79\x67\xe0\x7a\x8e\x69\xb4\x64\x7e\x3e\x9b\xd2\xed\xb6\x34\x79\x2d\x4f\xad\x46\xc7\x74\xed\xbc\x53\x77\xdb\xd9\x91\xd8\x50\x72\x4a\x95\xef\xe6\xc6\xe2\x5b\x56\xad\xe4\x48\x76\xe4\x28\x4a\x3b\x53\x7f\x4d\x3d\x3d\x91\x40\x31\x2c\xc6\x0a\xd0\x48\x9a\x82\xb2\x2c\xcb\x88\x14\x54\x55\x51\x80\x40\x71\x18\xf2\x90\xa1\x10\xad\x2a\x3c\x16\x78\x4d\xe3\x38\x95\xc1\x82\x8a\x31\xa0\x49\x19\x33\xa4\x40\x21\xff\xf5\xeb\xec\xf3\xa2\xdd\xab\xb5\x87\x2c\xcb\x5d\x7a\x21\x3b\x27\x80\x97\xd0\x81\x2f\x8f\x06\xbb\x57\x4b\x0f\x7f\x4e\xf0\xb5\x73\x58\x97\xf6\x89\xee\x83\x5d\x89\x15\x47\xcb\x54\xac\x4b\x55\x6d\x85\x4d\x0f\x59\x13\x99\xbd\xd9\x38\xdb\x52\xe5\x32\xc5\x4f\xa7\x16\x9b\xec\x32\x25\x25\xae\xe4\xad\x74\x0d\xbd\x79\xaf\x89\x8a\x2d\xce\x53\x96\xd7\x34\x41\x66\x15\xd7\x38\x07\xd7\x27\x5d\x25\xdf\x6b\xa8\xb5\xd8\x44\x52\x5a\x56\x1c\x56\x45\xe9\x93\x83\xdd\x9f\x58\x2a\x74\x55\xde\x17\x82\xdd\x83\xc0\x22\x4a\xb0\xf9\x68\x19\xe2\x13\xf1\x47\x2a\x43\x3c\x08\x76\x33\x07\xcf\xff\xdd\xf6\x2c\xef\x53\x41\x67\x92\xca\xa7\xca\x96\x7e\x09\xe7\x7d\x52\x1f\x7e\x21\xfa\xc2\xa9\xb6\x93\xd7\x87\x04\x14\xf7\x96\xe1\xfc\xc4\x80\xc6\x6f\x9f\x3e\x68\xf3\x2b\x4c\x46\x4e\xcb\xe7\xd7\xa1\xef\x7d\xfa\x3f\x14\x7c\x5f\x2e\xf5\x8a\xd2\xc7\x0f\x97\x7a\x3d\x51\xc7\x22\x94\x7a\x35\xed\x64\x33\x57\x65\x34\x25\x36\x58\xd9\x9d\xea\x5b\xfb\xad\x6d\xc4\x7a\x6a\x1d\xb8\x94\xb6\x64\x59\xcd\xce\x6b\xa3\xc5\x4a\x98\x8f\x95\x76\xe2\xed\x0d\x8c\x24\x56\x4f\x89\x15\x0c\x2a\xdd\x96\x5c\x15\xe2\x53\x8f\xc9\x98\xea\xdc\x1c\xe4\x41\x8a\x1d\xd5\x17\x0d\x2d\xde\xe3\xc5\xda\xb3\x83\x56\x4c\x6b\x58\x96\x59\x84\x64\x46\xe3\x29\x55\xa3\x15\x20\xc8\xb4\x06\x34\x56\xe6\x59\x9e\xd3\x00\xe0\x79\x16\xb0\x02\x16\x04\x16\x03\x56\x46\x88\x63\x10\x52\xa0\xca\x23\x52\x50\x58\xfe\xe5\x1b\xc1\x6c\x37\xcc\x44\x7c\x9d\xc2\x41\xd0\x4a\x5d\x0b\x5a\x39\x9e\xa7\xf8\xb3\x51\xeb\xfa\xee\x3a\xa6\x3d\x3a\x14\xf0\x25\x8a\x25\x1c\x44\xad\x27\x47\xfe\x03\x2d\xfb\xf4\x34\xcc\x01\xfe\x1d\xbd\x35\x49\x1f\x74\x12\xc5\xd4\x70\x5c\x2e\xae\x94\x6a\x9a\xb5\x79\xf5\xad\x95\x2d\xb9\x39\xb2\x33\xf0\xbc\x8e\x14\x17\x13\x8d\x02\xca\x96\x95\x18\x99\x7e\x73\xd3\xb1\xa9\xc1\xc4\xf0\x68\x49\x4b\xf5\xe5\x54\x10\x7a\x75\x36\x21\x65\xd3\x74\xd9\xd4\x97\x45\xab\xf1\x46\xad\x94\x94\x23\xd4\xec\x5b\xa2\xd2\xd3\x05\x9f\xe1\xc8\xed\xe0\xd1\x7b\x4f\x8b\xa8\x30\x4e\xde\xda\xf7\xc7\x99\xeb\x96\x6d\xaf\x4f\xc1\x7f\x26\x55\x72\x19\xff\xbb\x51\xf1\xb3\x47\xf6\x80\x94\x5b\x3c\xcf\x2f\xea\x19\xaf\x2d\x02\xde\x5d\xfc\xfd\xc0\x82\x64\x48\x56\x91\xf1\x8f\x95\x68\xf8\x37\x1e\xa6\x91\x4c\xf7\x24\xb7\x52\xe9\x91\xb3\xf2\x9c\xef\xbe\x0d\x17\x70\x52\x53\x96\xf3\x61\x1d\x65\x20\xe8\x35\x79\x31\x9d\x9b\xd8\x0a\x58\x71\xb5\xce\xdb\xbc\xcb\xb2\x45\x8b\x61\x9b\x45\xbd\x9e\x2d\x70\x14\x18\x64\x6d\xa9\xa6\x74\x75\xd8\x49\xe5\xa6\x6a\xc1\xd1\xca\xf3\xca\x0c\x24\x9f\xbf\x08\xc8\x53\x1c\x02\x32\xa5\x62\x0d\x2a\x50\x55\x35\x55\x51\x31\x23\xd3\xb4\xac\x91\xbc\xca\x21\x00\x90\x40\x41\x5e\xe5\x39\x52\xd5\x00\xa7\x21\x28\xcb\x2c\xab\xd2\x0a\x4f\x41\x96\x54\xb8\xe0\xcd\xfc\xe0\x91\xd7\xc0\xdc\xe3\x61\x04\x70\x21\x2d\xb2\xbe\xe9\x9f\x70\x78\x78\xc4\x6b\xa0\x94\x77\x4e\x83\xef\x71\x30\x9f\xbd\xe3\x60\x7f\x65\x77\xf4\xd6\x32\x76\xad\x6a\xa4\xc8\xac\x94\x30\xc8\x16\xaf\x64\xcb\xac\x65\xbe\x52\xf6\x48\xd2\xd4\xb1\xc7\x8d\xdf\x46\xb5\x6c\xce\x83\xde\xb4\x5e\x44\xaf\xaf\xc0\x28\xd5\xe6\x2d\x9a\x2a\xf1\xb3\x98\xe5\xe5\x6b\xae\x48\x2b\x10\x27\xba\x9e\x90\xe9\x4d\xe2\x50\x48\x17\x87\x96\x8c\x40\x6d\xfe\x3c\x07\x73\xd0\x28\xc2\x0e\xad\xc7\x1d\xcc\xf3\xf0\x3f\xd1\xc1\xdc\xbb\xc3\xe1\x43\x0a\x36\xc3\x3c\x48\x3f\x85\xbe\xc7\x1d\x4c\xf4\x34\x47\x74\x07\x23\x3d\x86\xff\x41\x07\x83\x06\x62\x2c\x57\xad\x29\xb5\x4c\xb1\xde\x5c\xcc\x15\xea\x0d\xb7\x2d\x6c\xd4\xea\x02\x44\xd4\x14\xbd\xd5\x45\xc5\xa0\x10\x64\x24\x6f\x62\x5a\x9d\xdc\x22\x95\x68\x0e\x95\xd5\x32\xce\x62\xd2\x4c\xce\x53\x83\xd5\x2b\x9d\xc6\x14\xf9\x6a\x58\x71\x99\x6c\x4d\x2b\xaa\xe7\xb4\x53\xe2\xf3\xab\x4c\x28\x96\x51\x28\x85\x16\x34\x8a\x63\x99\xb5\x1b\xe1\x19\x56\x56\x10\x0b\x19\x92\x12\x58\x56\x23\x31\x64\x05\x04\x35\x06\x28\xaa\xcc\xf2\x0a\x86\x18\x03\x01\x71\x1a\x0f\x69\x06\x05\xe5\x77\xd4\x63\x05\x7c\xd7\xfc\x0a\x07\xaf\x54\xf0\x41\x92\x7f\x39\x3e\x5c\xf9\xd1\x0a\xbe\x0b\xe9\xf6\xe0\x8a\xbe\x93\x35\x80\xb7\xaf\xe0\x4b\xc4\xf3\x09\x7d\x96\x2b\x71\x40\x2f\x26\x72\x03\xb2\x59\x29\x0b\x72\xcc\x8c\x89\x93\xd7\x15\x48\x16\x52\x35\xa3\x95\x6e\xb4\x49\x57\xa9\xeb\xd3\x04\x40\xd6\xb2\x34\x2f\xd5\x59\x97\x69\x18\x28\x39\xf7\x52\xd6\xc2\xad\x5a\x08\xc0\xba\xda\xaa\x15\xcc\x2c\x44\xb8\x24\x2e\xf9\xec\xaf\x55\xc1\xf7\x68\x05\xdd\xa3\x55\x63\x45\x72\xc4\x26\x9e\x58\xc1\xf7\x99\xe3\xd9\x47\x54\xf0\x45\xad\xa0\x13\x9f\x54\xc1\xc7\x1d\x54\xe3\xbf\x5b\xcf\xbf\x2a\x8b\x7f\x6b\xcb\x5a\xaf\xb8\x4c\x55\x84\x5e\x72\xde\xc8\xa9\xd2\x6a\xa8\x75\xe2\x13\x4d\x2f\x74\x14\xa1\x66\xe8\x64\xce\x4c\xb4\x4c\xb5\x98\x95\x7a\x45\x5d\xed\x4c\xf8\x61\x29\x25\x61\xa7\xd2\xb2\xc7\xba\x5b\xac\x31\xbc\x9c\x62\xa0\xa7\x8e\xba\x6d\x29\x39\xa9\x0b\x63\x6b\x28\x96\x66\x89\xa7\xaf\x69\x92\x24\x92\x05\x45\x53\x30\x94\x69\x85\x06\x34\x50\x79\x59\x66\x39\x96\x57\x55\x52\xa0\x65\x55\x96\x81\xc2\xd1\x24\xcb\x01\x52\x95\x65\x4a\x46\x24\xd6\x04\x9e\xe7\x48\x8d\xa5\x10\xe5\xef\x04\xa4\x9e\xb7\xa6\x79\x75\x90\x25\x39\x8a\x66\xcf\x0e\xb2\xdb\xbb\x47\xaf\x55\x78\x74\x51\xf3\x42\xf4\x1e\x54\x4d\x44\x8a\xc6\xa9\x50\xd5\x43\xa0\xb5\xfb\x45\xc8\x62\x5b\xce\xe5\x62\xa0\x88\x8d\xd5\x42\xb7\x94\x54\x8e\x66\x0b\xd9\x65\xc2\x23\x99\x58\x56\x80\x16\x88\xd5\x29\xc8\xe7\x85\x55\xd9\x84\x9a\x9e\xef\x40\x4b\xb3\xa8\x74\xce\x2e\xb6\x5d\xf8\xd6\x06\xb1\x64\x6b\xe2\x00\x08\x10\x4c\x70\x62\x89\xcd\x16\x1c\xda\x4a\x14\xc5\xdc\x2d\xd1\xf8\x61\x52\xf5\x6c\x34\x2e\x3e\x56\x15\x96\xaf\xec\xe5\x7b\xe6\xba\x12\x0d\x3f\x0f\x7f\xb4\x68\x7c\xef\x71\x9e\x98\x04\x8f\x54\xa7\xfc\x6c\xfc\xef\xe5\x71\xd9\xe3\x3c\x92\xee\xfa\xc0\xd9\xc8\x35\x8f\xf4\x99\xf5\xed\xe2\x93\xfa\xea\xc1\x68\xdf\x6b\xbb\xfa\x90\x6b\x79\x6c\xb1\x9a\x49\xaa\xf3\xd2\x70\x68\xdb\x5a\x2e\x43\x35\x2d\x5a\xa3\x90\xd6\x65\xb2\x9a\x3c\xb7\xa8\x12\xec\xbe\xc6\x44\x53\x46\x6a\x4c\x53\x5a\x86\xee\x75\x56\x68\xd2\xed\xd2\xf9\xc6\x78\xd6\x95\xdb\x4e\x2f\xeb\x8a\x2b\x5b\x79\x9b\x19\x8a\xe4\x8a\x4f\x4f\x27\xc9\x2a\xcd\xb3\xaa\xac\xaa\x24\x54\x69\x96\xe4\x01\xc7\x72\x40\xa1\x11\x83\x38\x2c\xa8\x2c\xe6\x59\x46\x41\x50\x50\x64\x1a\x60\x16\xaa\x1c\x42\x1a\x47\x22\xa8\x61\xcc\xc8\x14\xab\xe2\xc0\x23\xc1\x27\x9d\xf0\x75\x83\x47\x12\x38\x78\xc1\x23\x09\x1c\xf5\x12\x7a\x3d\xcf\xa3\x27\x7c\x7d\xa2\x47\x3a\x38\x91\x2b\x21\x8c\xc6\x85\x0e\x7c\xa3\x66\x5c\x4d\x5b\xf2\xd5\x12\x1e\x49\x32\x68\x36\x73\x8c\xb1\x78\x1b\xe5\xc8\x84\xad\x77\x9d\x8a\xc7\xe9\x15\xc0\xc2\x9a\x3c\x1a\x40\xb5\xd1\x6c\x69\x38\x65\xcf\x14\xb2\x2a\x22\x6d\x90\xea\x2e\xbc\x41\x5b\x34\xdd\xe2\x74\x68\x26\xc6\xcb\x61\x42\xbc\xe9\x44\xae\xbb\x3d\x52\x84\x13\xa4\x9e\xea\x91\x1e\xc4\xff\x44\x8f\xf4\xe8\x09\x1c\x8f\x7a\xa4\xa7\xe0\x7f\xc0\x23\xfd\x4a\xf9\xb1\xab\xf9\xa7\x08\xb2\x7a\xa6\x47\x8a\x82\xff\x41\x8f\x94\x85\x8d\xde\x44\x46\x0e\x8e\x7b\x89\x78\x71\xce\x2f\xd8\x5a\x7d\xd6\x2e\x97\x86\xe3\x62\xe6\xad\x36\xac\x65\x8c\x04\x76\x59\x6a\x2a\x72\x5d\xe7\x35\x31\x6d\x64\x5f\x41\xbe\x5c\x17\xe8\x8a\x21\xac\x6a\x7c\x62\x12\x93\xca\x5a\x06\xa6\x5b\xc9\xce\x7c\xca\x56\x5a\x19\xb9\x50\x92\x9e\xbf\xcb\x49\xe1\x90\x4c\xf1\x34\xa5\x91\x88\x54\x68\x0d\x73\x82\x8a\x15\x4c\x6a\x1a\x90\x79\x4a\x00\x1a\x87\x04\x95\xa2\x15\x9a\x53\x64\x95\xc3\x14\x43\x52\xb4\xc6\xc9\x90\xd7\x58\x52\xd5\x14\x92\x0c\x3c\x12\xf5\x24\x8f\x44\x5f\xf5\x48\x3c\xbc\xe4\x91\x78\x78\xe8\x91\x82\xd7\xbc\x3d\xea\x91\x2e\xec\x25\x0d\x3c\x52\xa4\x25\xf1\xee\x15\x8f\x54\x89\x5b\xb2\x69\xf3\x05\x71\xd4\xa8\x68\xbc\x52\xab\x54\x0c\x31\xd5\x5d\xea\x8b\x58\x8e\x7c\x55\x3b\x76\x89\x6e\xeb\xb4\x54\xa8\x8a\x62\xbe\x9b\xb6\x3c\xc5\x1b\x26\x73\xcb\x1a\xad\xb8\xed\xd6\x72\x8e\x3a\x14\xcc\xc7\x47\xb8\xd6\xe9\xc9\x4b\x06\x26\x86\x46\x79\xd0\x8c\xb3\xb7\x2d\x89\x7f\xb6\x47\x3a\x53\x48\xf9\x69\x1e\x29\x19\x1d\xff\x87\x9c\x09\x75\x87\x47\x78\xb6\x47\xba\xb7\x50\x49\x14\x1f\xf4\x48\x1f\x58\x12\x70\xd2\x23\xfd\x24\x8f\x20\x7e\x40\x5f\xdd\x83\x7f\xe3\x91\xb8\x98\x3a\xed\x0c\xe7\x76\xb2\x9e\x63\xe2\x8b\x85\x48\xb3\x39\xb1\xac\x15\x52\x59\x7a\x58\x37\x01\xd2\x57\x83\x4e\x4a\xaf\xd9\xbc\x28\x9a\x4a\x07\x83\x25\x2c\xe5\x86\xf9\xd4\x60\xb9\x68\x37\x8b\x89\x89\xac\xf5\xac\x58\x9d\x49\xbc\x0e\x66\x45\xab\x97\xa9\xe4\x60\xba\x1a\x9f\x3c\x7f\xc9\x9d\xc1\x9a\xa0\x90\xac\x2c\xb3\x90\x51\xa1\x8a\x20\xe4\x01\x00\xbc\xac\x6a\x80\x56\x79\x92\xe7\x58\x9e\x62\x28\x8c\xa1\xa6\x20\x8e\x66\x38\x85\xc7\x0c\xc9\x6a\x32\x96\x05\xa0\x29\x0c\x13\x78\x24\xfa\x49\x59\xbb\x1b\x3c\x12\x4d\x9f\x5d\x73\xdf\xdd\x3d\x7a\x5d\xe8\xa3\x59\xbb\x4f\xf4\x48\x07\x59\xbb\x4a\x06\x66\x0a\x15\xc1\x60\x49\xa5\x04\x6a\x05\xd8\x2a\x03\xbd\xeb\x64\xa5\xde\x10\x67\x8a\xf5\x6e\xba\xc9\xb8\x56\xf2\xad\xc2\xa4\xad\xaa\xd4\x64\x94\xb6\x4b\x91\x65\x2e\xd7\xac\xbe\xb2\xd9\x2c\x5b\x53\x5e\x61\x4e\x4d\x02\x85\x65\xe7\x45\x1d\xd3\x99\x65\x9d\x9f\x4d\xe6\x73\xf2\x57\xcc\xda\x3d\xec\x91\x1e\xc4\xff\x44\x8f\xf4\x94\xd2\xd5\x07\x3c\xd2\x67\x97\xce\x8a\xe2\xaf\x5b\xa4\x76\xcd\x23\x7d\x66\xd6\x4c\xfc\x80\xbe\xba\x07\xff\xc6\x23\xd1\x72\xaf\x67\x73\xb0\xe8\xd4\xe7\xab\xb6\xe8\xbc\xd6\xa8\x4e\x02\xbb\x4a\xdd\x28\xd3\x3d\x2f\xad\xb4\xab\xe3\xa5\x52\xb0\xb9\x51\x47\xe1\xeb\x55\x73\xd1\x59\x69\x35\xca\x1d\x94\x04\xcb\x56\xb4\x49\x62\x61\xf5\x06\x64\xb1\xbd\x72\x1c\x71\x9a\xe0\x74\x39\x9f\x5d\xc6\xac\x54\xea\xe9\x65\xc6\x90\xe2\x68\xbc\x76\x07\x82\x2c\x60\x8d\x53\x65\x24\x20\x46\x95\x29\x8a\x12\x64\x8e\xd7\x54\xc4\x6b\x14\xcd\x71\x9c\x0c\x90\x46\x51\x32\xa2\x59\x1e\xa9\x8c\x42\xaa\x9a\x40\xb3\x2a\xad\xbe\x6c\x5f\x68\xff\xc8\x1a\x3d\xb8\xba\x46\x0f\x78\xfe\xfc\xf2\xd1\xf6\xee\xe1\x4b\xa2\x1f\x5d\xa3\xbf\x90\xab\x0b\xae\x08\x91\xf9\x99\x35\xfa\x64\x6a\xf5\x36\x1b\xd5\x12\x35\xbb\x2c\xe6\x0d\xad\x5a\xef\xa6\xec\xe2\x60\xe6\x2d\x95\x26\x65\xa6\xab\xc9\x1a\x03\xf4\x91\xea\xa6\xb3\x28\x51\xee\xcc\x49\xa6\x11\x6f\x0f\x3a\x64\x57\x1f\x39\x64\x32\x51\x95\xe8\x32\x4a\xb7\x61\x61\xac\xb8\xd4\xeb\xbc\x38\x36\x64\xba\x59\x77\x4a\xc5\x5f\x6b\x8d\xbe\x62\xf5\xe2\xcc\x4f\x5c\xa3\x7f\xf4\x94\x1f\x51\xfc\x79\x39\x9f\x93\x63\x6b\x22\xba\x2c\x2a\xd6\xeb\x45\x36\xaf\xc9\xe2\x19\x6b\xf4\x51\x4f\xf9\xd9\x8c\xad\x3a\xcf\x3a\x8c\x24\xb6\x0a\xa9\x5a\xb2\x67\xad\xc8\xf6\x9c\x4d\xd2\x32\xa7\x58\x92\xc0\xd4\x9b\xf3\x51\x45\xed\xe5\xb3\x72\xa2\x0e\xf5\x66\xdb\x2d\x57\x5a\x33\xd0\x6b\x7b\x69\x3a\x5f\x10\x44\xbd\xb9\xa8\xa4\x3a\x83\xb6\x6a\x4c\xac\x62\x19\x2a\x49\xc6\x1e\xc7\x24\x12\xad\x92\x1f\xb0\x46\x4f\x61\x01\x00\x12\xa8\x40\x40\x48\x96\xfd\x97\xa0\x01\x81\xa1\x78\x92\xe5\x79\x56\xe5\x38\x4e\x81\x2c\x09\x29\x4a\x61\x69\x8e\xd7\x80\x22\x40\x1e\x71\x02\x56\x68\x0c\x39\xff\xf5\xd8\x70\x13\xed\x47\x1f\x5b\xaf\x06\xf9\x10\x52\xdc\xd9\x53\x7a\xfd\xbb\xbb\x3a\xdd\xcd\xab\xdc\x1f\x1d\x5b\x2f\x9c\xad\x13\x5c\x11\x36\x02\x9c\x19\x5b\x53\xb9\xca\x54\x5d\x4d\x87\x9a\x1d\x53\x1b\xb9\x7c\xb7\x2b\x93\x6c\x63\x58\x4c\x14\x8b\x5d\x37\xbd\xb0\xda\x56\x1d\x64\xf3\x78\xa8\xbd\xc1\xb2\x9e\x6e\x79\xc5\x69\x17\x16\x9c\x76\xb9\xf1\xba\xac\x27\x32\xb1\xce\x4c\x53\xed\xee\x3c\x59\x55\x26\x3c\x33\x48\xd5\xe5\xe4\x78\x28\x57\x7b\xa5\x5f\x6b\x6c\x7d\xb4\xfe\xe8\x51\x7b\x2e\xd0\xb1\xf2\xeb\x33\xc7\xd6\x4f\xdc\x30\xf0\x11\xf5\x4f\x51\xeb\x8f\xc4\x27\x8d\xad\x51\xfd\xec\x66\x6c\x5d\xa6\x1c\x4b\xe1\x6c\x8a\xad\x5a\x2d\x23\xd9\x06\x50\xa8\x8c\xec\xe5\xbc\xb1\x04\x5c\x42\x79\x05\xaf\xa4\x5a\x5f\x76\x6d\x8a\xf5\x86\xbd\x44\xbb\xd8\xe0\x4c\xc1\x78\x03\xcd\xd6\x58\x19\xd5\xea\x33\xd3\xa1\x28\x94\xe6\xc5\x21\x55\xd0\x2a\xbd\x1a\xd9\x99\x4f\x6c\xb8\x82\xb7\xd6\x96\x7e\xf9\xf2\xfd\xfb\x97\xef\xdf\x89\x32\x1a\xe3\x1f\x04\x72\x5d\xec\xf5\x5d\x0f\x79\xee\xe1\xe7\xfe\x64\x84\x97\x7f\x12\xcd\xe5\x04\xff\x20\x92\x95\x72\xa3\x59\x17\x73\xe5\xe6\x9f\x44\x43\x19\xe0\x31\xfa\x41\x4c\xa6\xb2\x69\x28\x7f\x12\x95\xb9\x85\x9d\x1f\xc4\x1a\xe2\x97\x2f\x62\xb1\x29\xd5\x89\xa6\x98\x28\x4a\x44\xa5\x5c\xec\x1d\x42\xfc\x42\x10\x04\x21\xa6\x52\x07\xd0\xde\x21\x24\xaa\xf5\x5c\x49\xac\xf7\x88\x82\xd4\x23\x7e\x37\xd4\x77\xd4\xea\xb6\x33\xe9\x8f\x0d\xdd\x41\x81\x1b\x08\x7d\x7f\x12\xd5\x21\xa8\xa7\x28\x3f\x85\xf8\x2a\xf5\x5b\x4f\xe6\xb3\xed\x86\xbe\x06\xff\xeb\x2b\xb6\x8a\x37\x1f\xbd\xe5\x64\xfb\xd1\x70\xdd\x29\x76\xfa\x4f\xe1\xee\x18\xed\x29\xe6\x22\x11\x46\xb4\xca\xb9\x5a\x4b\x22\x7e\xdf\x37\xff\x46\xec\xdb\x6f\x3f\x07\x0f\xdc\x29\x9a\xe7\x74\xeb\xdd\x8c\xdf\xd5\xa9\xf6\x04\x07\xca\xd0\x9f\x20\xc7\x33\x14\x63\x82\xac\x03\x4e\x4e\xdf\x7e\x32\x67\xa7\x91\x5c\xe2\xf4\x02\x59\x37\x73\x7e\x10\x98\x9d\xe6\xfd\x5c\x83\x27\x73\x7f\x0e\xcd\x25\xfe\x2f\x92\x76\x55\x02\x81\x4a\xcb\x4b\x5f\xdb\xb7\x8c\xe4\xca\x29\xa9\x7b\x85\x87\x64\x5d\x12\x9b\x52\xd0\xf4\x18\x0a\x51\x29\x87\x8d\xa1\xd5\xc8\x95\x33\x84\xec\x39\x18\x1f\x5a\xd7\x79\x6a\x02\x1b\x7b\x9c\x9e\x00\xce\x6d\x14\x9d\xb1\x6b\x79\xd9\x47\x8a\x62\x4f\x2d\x2f\x32\x39\x7b\x10\x87\x94\x1c\xcd\x06\x8e\xe9\x09\x1a\x7f\x23\x36\x1f\xfa\x2e\x7e\x9b\x62\x4b\x79\x2f\x30\x79\xd9\x1f\x20\x77\xf0\x08\x65\xeb\xe7\x6f\x23\xeb\x50\xd3\xd6\x4f\x9d\xa2\xc6\xc4\xaa\xfe\x40\xc7\xed\x20\xdc\x46\x51\xd0\x76\x27\x9e\x6f\x04\x9a\x4c\x4c\x43\x09\x86\x03\xdb\x51\xcf\x0c\xd3\x7d\xbc\xd6\x0d\xff\x7e\x04\x4a\x37\x5e\x22\x20\x38\x04\xee\x90\x6c\xac\x69\x58\x09\xab\xda\xfb\x51\xcb\x50\xbf\x11\xbf\xf9\x0f\xff\x76\x8e\x58\x43\x7d\x12\x99\x86\x7a\x33\x81\x5b\xd5\x5b\x93\x17\x81\x68\x7b\xd2\x9f\x3c\x8b\xee\x0d\xac\x43\xd2\xcf\xb8\xaa\x48\x9c\x9c\x66\xc0\x5b\x3c\x8f\x81\x0d\xac\x33\x3a\x1d\x91\x85\x43\x08\xa7\x98\xb0\x27\x6b\xad\x1c\xd8\x91\x78\xd8\x10\xbf\x87\x11\x55\xf8\x97\x05\xed\x6e\xac\xdd\x1f\xaa\x1f\x97\xf5\x31\xb8\x43\x92\x83\xdf\x43\x34\x9e\xa6\xe8\x50\xae\xcf\x22\xeb\x1d\xcc\xdb\x86\xb7\x53\x04\x7a\x41\x97\x78\x8f\x74\xeb\x1e\x46\x74\x95\xbc\xa6\x7e\x9e\xa3\xae\x91\xc8\xc8\xc5\x0f\xfb\xcf\x53\xc0\x42\x94\xab\x38\x44\xe7\x61\xdb\xab\x04\xda\x9a\xf6\x80\xd3\x7a\x0f\xea\x26\xe2\xfc\x96\x97\x48\xf3\x69\xc7\xce\xd3\xc4\x17\x82\x77\x8d\xc8\x50\xf3\x5b\x28\x7d\x8e\x1c\x8f\xa0\xdd\x4a\xe5\x55\x69\x3e\x87\xb6\x9b\x68\xba\x4c\xcb\x96\x62\xd3\xb6\x47\xd3\xc9\x63\x14\x1d\xc3\xba\xb9\x47\x83\x78\xf7\x0c\x7d\x13\x64\x38\x7d\xcf\x18\xe3\xa7\x50\x18\x86\x76\x9b\xdd\x6e\x08\xfc\x46\x84\x49\xfe\x46\x6c\x86\x78\xc5\xb4\x5d\xac\xf6\x91\x77\x86\x89\x27\x8c\xdb\x1b\x38\xd7\x28\xbe\x33\x3a\x5a\x43\x7d\x9a\x74\xef\x10\xec\x55\xb9\x19\x96\x8a\x17\xfd\x50\xc8\xe1\xf6\x6d\xab\x8f\x54\xd5\xc1\xae\xfb\xa8\x40\xaf\x22\x38\x9a\xa7\x6d\x6e\x87\x66\x46\x41\xc3\x3b\x68\x7f\x5c\x0f\x2e\xc1\xbe\x4e\xf1\x09\x2b\x3b\x06\xb8\x89\xc2\xd7\xf0\xbc\xe5\x24\xfa\x1c\xfc\x22\xd4\xab\x61\xff\xba\xd1\x15\x42\x37\x31\xd4\x1a\xe4\x4e\x89\x9e\x44\xed\x29\xd0\x57\xc3\xb7\x5b\x35\xf9\x00\xf8\xb3\x95\xe1\x08\x74\x94\x78\xf3\x3c\xb8\xf1\xc4\x76\xd6\x03\xdf\x0c\x3b\xae\x61\x5b\xcf\x17\x74\x18\xc3\x75\xf2\x43\x0f\xdc\xce\xcc\x66\xe8\x89\x98\xa9\xb8\x4d\xfe\x07\x38\xae\x72\x72\xd0\xf6\x76\x26\x26\x0e\x9e\x19\xf6\xd4\xfd\x14\x6e\x4e\x21\xbb\xca\xd6\xa9\x87\x6e\xe7\x6f\x9b\x44\xf9\x30\x9e\xb6\x08\xae\xf2\x71\x36\xdb\x75\x0c\x7a\xe7\x6f\x3f\xc4\xb4\xc3\xd0\x4f\x4e\x80\xef\x35\xf0\x63\xa0\xc7\x53\xa8\x27\x59\xf8\x25\x14\xb7\xf0\x70\x65\x5e\x77\x11\xd9\xf3\xdc\xd7\x7b\xc0\x37\xd1\x7e\xdd\x89\x1d\x4e\xb6\x3f\x42\x6d\xde\xc3\x8f\x3c\xd5\xf7\x83\xb8\x9d\x23\xdf\x66\x18\xfb\xb2\x6d\x8f\x22\x4b\xf9\x02\xcc\xab\x21\xc2\xef\xbf\xab\xd8\x43\x86\xe9\x12\xdf\xff\xe7\x7f\x88\x17\xd7\x36\xd5\x83\xd5\xb4\x97\x1f\x3f\x3c\xbc\xf0\xbe\x7e\xfd\x46\x9c\x6f\xa8\xd8\xea\x6d\x0d\x83\x5c\xfc\xf9\xa6\xb2\x3d\xd5\x07\xde\x4d\xe8\x8f\x9a\x5e\x26\xe0\xa8\x69\x88\x84\xaf\x44\x27\x2b\xd5\xa5\x40\xc9\x88\xbf\x08\x8a\xba\x79\x21\xda\x50\xfb\xda\xc1\x32\x51\xba\xf0\x39\xcb\xd1\x1b\xb4\x44\xba\x52\x97\x72\x99\xf2\x6e\x09\x88\xa8\x4b\x69\xa9\x2e\x95\x93\x52\x23\xb4\x2a\xe2\xdf\xad\x94\x89\x56\x35\xb5\x56\x99\xba\xd4\x68\xd6\x73\xc9\xe6\xfa\xa7\x94\x54\x94\x9a\x12\x91\x14\x1b\x49\x31\x25\x5d\x58\x47\x5b\xcf\x3b\x8e\xbf\xf6\x43\xa9\x98\xe7\x09\xe3\x18\xcf\x95\x45\xb2\x73\x94\x1c\xcb\x27\x9c\x36\x3a\x29\xac\x4d\xa0\x7f\x65\x45\xf1\xac\x24\x36\x53\xd9\x9f\x2e\x87\x43\x3a\x4e\x49\x61\x9b\x25\xb8\xac\x30\xf7\x49\xe0\x7d\x52\xe9\x27\x8a\xe1\x0c\x31\xc7\xb2\x38\x91\x06\x7b\xae\x52\x84\x53\x1c\xbf\x82\x40\xce\xab\xc6\xbb\x1c\xd2\x2d\xda\x41\x20\x55\xc5\x2a\x31\x46\xd6\x14\x99\xe6\xf2\x88\xd2\x5c\x9a\x90\xba\xb9\x46\xb3\x11\xd0\x1c\x70\xf6\xc7\x08\x2f\xfb\x33\x64\x4e\x71\x7f\x0d\x11\x13\xa9\x7a\xa5\x7a\x48\xf8\xfe\xa9\x50\xcb\x60\x45\xfe\x8b\xdf\x3e\x8c\xe0\x34\xec\x3f\xb7\x2e\x32\x68\x1e\xc6\xfc\xbb\x2f\xb7\x8b\xd7\x5a\x48\xca\x00\x39\x48\xf1\xb0\x43\xcc\x90\xb3\x34\x2c\xfd\x77\xc8\x30\x5f\x89\x72\xa5\x19\x14\x30\x5d\x87\xe2\x23\xbd\x06\xe7\x4b\xa8\xb4\x34\x4c\xed\xfe\x60\xf0\xc5\xa4\x6f\x58\x3a\x76\xbd\xbe\x89\xd6\x7f\xfc\x48\xfb\xe5\x1b\xf1\x42\xbe\x7c\xfd\xf3\xbd\xae\x84\x00\x9d\x52\x96\x53\x92\x3e\x2e\x30\x18\xe1\xe5\xba\xc7\x8f\xe4\xb9\x4b\x98\xb8\x86\x6e\xad\x63\xfd\x1b\x04\xba\x7d\xe8\x84\x34\x58\xfa\xeb\x0d\xb2\x24\x02\x64\xd1\x9f\x9f\x63\x43\x1f\x78\x84\x61\x79\x58\xc7\x4e\xa8\x1b\xbf\x7f\x27\xe6\x98\x98\x1b\xa6\x49\xbc\x4d\xb1\xb3\x24\xe4\xe5\x16\xa1\x6b\x13\xde\x00\x79\x84\xe1\x12\xf3\xc1\xee\x57\xc3\x25\xbc\x01\x26\x34\xc3\x71\x3d\xc2\xf0\xf0\x98\x30\x2c\xff\x17\xc5\x1e\x4f\x6c\xd7\xf0\xf0\x5a\xb8\x37\x90\x75\x24\xed\x00\xf8\xae\x4a\xe0\xeb\x97\x50\xbf\x9e\x8c\x3a\xd7\x7d\xba\x1d\xca\xc6\xd3\x05\x56\xd7\x92\x59\x8b\xe9\x77\x56\xf8\xba\xa9\xb5\x5b\xb7\xd1\xf0\xde\x0f\x9e\x6e\x77\x1a\xd9\x41\x6c\xbe\x06\xe3\xda\x53\x47\x89\x06\x69\x1b\x84\xfa\x14\x07\x79\xbf\xb3\xcf\x6f\x86\xdb\xaa\xed\x7a\xba\x83\x1b\xb5\x22\xa1\x22\x0f\xad\xdd\x18\xa1\x4e\xc7\x13\x5f\xce\x26\xf6\xb0\x3f\x4e\xfe\xff\x00\x00\x00\xff\xff\x88\x15\x75\xcc\x95\x50\x01\x00") func tradesHorizonSqlBytes() ([]byte, error) { return bindataRead( @@ -568,7 +568,7 @@ func tradesHorizonSql() (*asset, error) { } info := bindataFileInfo{name: "trades-horizon.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x76, 0xf2, 0x65, 0x99, 0xb9, 0xff, 0x30, 0x40, 0xa8, 0x5f, 0x49, 0x5c, 0xa2, 0x4c, 0x99, 0xb7, 0x4d, 0xa8, 0xfa, 0x9d, 0xe5, 0x49, 0x86, 0x39, 0x75, 0x17, 0x2a, 0xc2, 0x28, 0xd6, 0x53, 0x54}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa4, 0x34, 0x18, 0x68, 0x8c, 0x5a, 0x30, 0x78, 0xc1, 0x3b, 0xd3, 0x2b, 0x35, 0x55, 0xfb, 0x20, 0xe5, 0x54, 0x8, 0x65, 0xd, 0xee, 0x97, 0x27, 0x8b, 0x59, 0xa4, 0x69, 0x88, 0x30, 0xab, 0xc8}} return a, nil } diff --git a/services/horizon/internal/test/scenarios/failed_transactions-horizon.sql b/services/horizon/internal/test/scenarios/failed_transactions-horizon.sql index 5886889086..a55231de42 100644 --- a/services/horizon/internal/test/scenarios/failed_transactions-horizon.sql +++ b/services/horizon/internal/test/scenarios/failed_transactions-horizon.sql @@ -1028,6 +1028,9 @@ CREATE TABLE accounts_signers ( -- we will query by signer so that is why signer is the first item in the composite key PRIMARY KEY (signer, account) ); +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; -- -- PostgreSQL database dump complete diff --git a/services/horizon/internal/test/scenarios/kahuna-horizon.sql b/services/horizon/internal/test/scenarios/kahuna-horizon.sql index 0f3adf2424..8008667c50 100644 --- a/services/horizon/internal/test/scenarios/kahuna-horizon.sql +++ b/services/horizon/internal/test/scenarios/kahuna-horizon.sql @@ -1619,6 +1619,10 @@ ALTER TABLE ONLY history_trades ALTER TABLE ONLY history_trades ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); +-- Added manually +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; -- -- PostgreSQL database dump complete diff --git a/services/horizon/internal/test/scenarios/pathed_payment-horizon.sql b/services/horizon/internal/test/scenarios/pathed_payment-horizon.sql index 577ba4e6b1..f1466021ee 100644 --- a/services/horizon/internal/test/scenarios/pathed_payment-horizon.sql +++ b/services/horizon/internal/test/scenarios/pathed_payment-horizon.sql @@ -1082,6 +1082,9 @@ CREATE TABLE accounts_signers ( -- we will query by signer so that is why signer is the first item in the composite key PRIMARY KEY (signer, account) ); +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; -- -- PostgreSQL database dump complete diff --git a/services/horizon/internal/test/scenarios/paths_strict_send-horizon.sql b/services/horizon/internal/test/scenarios/paths_strict_send-horizon.sql index 5cb2ce3a63..4fab92edf5 100644 --- a/services/horizon/internal/test/scenarios/paths_strict_send-horizon.sql +++ b/services/horizon/internal/test/scenarios/paths_strict_send-horizon.sql @@ -1205,6 +1205,10 @@ ALTER TABLE ONLY history_trades ALTER TABLE ONLY history_trades ADD CONSTRAINT history_trades_counter_asset_id_fkey FOREIGN KEY (counter_asset_id) REFERENCES history_assets(id); +-- added manually +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; -- -- PostgreSQL database dump complete diff --git a/services/horizon/internal/test/scenarios/trades-horizon.sql b/services/horizon/internal/test/scenarios/trades-horizon.sql index 9a376a6788..35a289694d 100644 --- a/services/horizon/internal/test/scenarios/trades-horizon.sql +++ b/services/horizon/internal/test/scenarios/trades-horizon.sql @@ -1060,6 +1060,9 @@ CREATE TABLE accounts_signers ( -- we will query by signer so that is why signer is the first item in the composite key PRIMARY KEY (signer, account) ); +ALTER TABLE history_transactions ADD account_muxed varchar(69) NULL, ADD fee_account_muxed varchar(69) NULL; +ALTER TABLE history_operations ADD source_account_muxed varchar(69) NULL; +ALTER TABLE history_effects ADD address_muxed varchar(69) NULL; -- -- PostgreSQL database dump complete From 6a326806bb7142122489736643d0840298d7773d Mon Sep 17 00:00:00 2001 From: tamirms Date: Tue, 25 May 2021 15:50:55 +0100 Subject: [PATCH 63/67] Deprecate captive-core-config-append-path in favor of captive-core-config-path (#3629) --- exp/services/captivecore/main.go | 3 +- .../testdata/invalid-captive-core-field.cfg | 12 +++++ ingest/ledgerbackend/toml.go | 33 ++++++++---- ingest/ledgerbackend/toml_test.go | 20 ++++++++ services/horizon/CHANGELOG.md | 4 +- services/horizon/internal/flags.go | 51 +++++++++++++++---- .../horizon/internal/integration/db_test.go | 2 +- .../internal/test/integration/integration.go | 2 +- 8 files changed, 103 insertions(+), 24 deletions(-) create mode 100644 ingest/ledgerbackend/testdata/invalid-captive-core-field.cfg diff --git a/exp/services/captivecore/main.go b/exp/services/captivecore/main.go index 2f33e400cb..264a40b2ea 100644 --- a/exp/services/captivecore/main.go +++ b/exp/services/captivecore/main.go @@ -53,7 +53,7 @@ func main() { ConfigKey: &binaryPath, }, &config.ConfigOption{ - Name: "captive-core-config-append-path", + Name: "captive-core-config-path", OptType: types.String, FlagDefault: "", Required: true, @@ -124,6 +124,7 @@ func main() { captiveCoreTomlParams.HistoryArchiveURLs = historyArchiveURLs captiveCoreTomlParams.NetworkPassphrase = networkPassphrase + captiveCoreTomlParams.Strict = true captiveCoreToml, err := ledgerbackend.NewCaptiveCoreTomlFromFile(configPath, captiveCoreTomlParams) if err != nil { logger.WithError(err).Fatal("Invalid captive core toml") diff --git a/ingest/ledgerbackend/testdata/invalid-captive-core-field.cfg b/ingest/ledgerbackend/testdata/invalid-captive-core-field.cfg new file mode 100644 index 0000000000..11cb9d83cc --- /dev/null +++ b/ingest/ledgerbackend/testdata/invalid-captive-core-field.cfg @@ -0,0 +1,12 @@ +# CATCHUP_RECENT is not supported by captive core +CATCHUP_RECENT=100 + +[[HOME_DOMAINS]] +HOME_DOMAIN="testnet.stellar.org" +QUALITY="MEDIUM" + +[[VALIDATORS]] +NAME="sdf_testnet_1" +HOME_DOMAIN="testnet.stellar.org" +PUBLIC_KEY="GDKXE2OZMJIPOSLNA6N6F2BVCI3O777I2OOC4BV7VOYUEHYX7RTRYA7Y" +ADDRESS="localhost:123" diff --git a/ingest/ledgerbackend/toml.go b/ingest/ledgerbackend/toml.go index 20668d5920..5d642e9466 100644 --- a/ingest/ledgerbackend/toml.go +++ b/ingest/ledgerbackend/toml.go @@ -212,8 +212,7 @@ func unmarshalTreeNode(t *toml.Tree, key string, dest interface{}) error { return tree.Unmarshal(dest) } -func (c *CaptiveCoreToml) unmarshal(data []byte) error { - var body captiveCoreTomlValues +func (c *CaptiveCoreToml) unmarshal(data []byte, strict bool) error { quorumSetEntries := map[string]QuorumSet{} historyEntries := map[string]History{} // The toml library has trouble with nested tables so we need to flatten all nested @@ -221,17 +220,11 @@ func (c *CaptiveCoreToml) unmarshal(data []byte) error { // In Marshal() we apply the inverse process to unflatten the nested tables. flattened, tablePlaceholders := flattenTables(string(data), []string{"QUORUM_SET", "HISTORY"}) - data = []byte(flattened) tree, err := toml.Load(flattened) if err != nil { return err } - err = toml.NewDecoder(bytes.NewReader(data)).Decode(&body) - if err != nil { - return err - } - for _, key := range tree.Keys() { originalKey, ok := tablePlaceholders.get(key) if !ok { @@ -252,6 +245,24 @@ func (c *CaptiveCoreToml) unmarshal(data []byte) error { } historyEntries[key] = h } + if err = tree.Delete(key); err != nil { + return err + } + } + + var body captiveCoreTomlValues + if withoutPlaceHolders, err := tree.Marshal(); err != nil { + return err + } else if err = toml.NewDecoder(bytes.NewReader(withoutPlaceHolders)).Strict(strict).Decode(&body); err != nil { + if message := err.Error(); strings.HasPrefix(message, "undecoded keys") { + return fmt.Errorf(strings.Replace( + message, + "undecoded keys", + "these fields are not supported by captive core", + 1, + )) + } + return err } c.tree = tree @@ -277,6 +288,8 @@ type CaptiveCoreTomlParams struct { // LogPath is the (optional) path in which to store Core logs, passed along // to Stellar Core's LOG_FILE_PATH. LogPath *string + // Strict is a flag which, if enabled, rejects Stellar Core toml fields which are not supported by captive core. + Strict bool } // NewCaptiveCoreTomlFromFile constructs a new CaptiveCoreToml instance by merging configuration @@ -288,7 +301,7 @@ func NewCaptiveCoreTomlFromFile(configPath string, params CaptiveCoreTomlParams) return nil, errors.Wrap(err, "could not load toml path") } - if err = captiveCoreToml.unmarshal(data); err != nil { + if err = captiveCoreToml.unmarshal(data, params.Strict); err != nil { return nil, errors.Wrap(err, "could not unmarshal captive core toml") } @@ -330,7 +343,7 @@ func (c *CaptiveCoreToml) clone() (*CaptiveCoreToml, error) { return nil, errors.Wrap(err, "could not marshal toml") } var cloned CaptiveCoreToml - if err = cloned.unmarshal(data); err != nil { + if err = cloned.unmarshal(data, false); err != nil { return nil, errors.Wrap(err, "could not unmarshal captive core toml") } return &cloned, nil diff --git a/ingest/ledgerbackend/toml_test.go b/ingest/ledgerbackend/toml_test.go index 3a9f7c92ad..6349665b0a 100644 --- a/ingest/ledgerbackend/toml_test.go +++ b/ingest/ledgerbackend/toml_test.go @@ -176,6 +176,15 @@ func TestCaptiveCoreTomlValidation(t *testing.T) { expectedError: "invalid captive core toml: found invalid validator entry which is missing " + "a QUALITY value: sdf_testnet_2", }, + { + name: "field not supported by captive core", + networkPassphrase: "Public Global Stellar Network ; September 2015", + appendPath: filepath.Join("testdata", "invalid-captive-core-field.cfg"), + httpPort: nil, + peerPort: nil, + logPath: nil, + expectedError: "could not unmarshal captive core toml: these fields are not supported by captive core: [\"CATCHUP_RECENT\"]", + }, } { t.Run(testCase.name, func(t *testing.T) { params := CaptiveCoreTomlParams{ @@ -184,6 +193,7 @@ func TestCaptiveCoreTomlValidation(t *testing.T) { HTTPPort: testCase.httpPort, PeerPort: testCase.peerPort, LogPath: testCase.logPath, + Strict: true, } _, err := NewCaptiveCoreTomlFromFile(testCase.appendPath, params) assert.EqualError(t, err, testCase.expectedError) @@ -228,6 +238,15 @@ func TestGenerateConfig(t *testing.T) { peerPort: newUint(12345), logPath: nil, }, + { + name: "online config with unsupported field in appendix", + mode: stellarCoreRunnerModeOnline, + appendPath: filepath.Join("testdata", "invalid-captive-core-field.cfg"), + expectedPath: filepath.Join("testdata", "expected-online-core.cfg"), + httpPort: newUint(6789), + peerPort: newUint(12345), + logPath: nil, + }, { name: "online config with no peer port", mode: stellarCoreRunnerModeOnline, @@ -274,6 +293,7 @@ func TestGenerateConfig(t *testing.T) { HTTPPort: testCase.httpPort, PeerPort: testCase.peerPort, LogPath: testCase.logPath, + Strict: false, } if testCase.appendPath != "" { captiveCoreToml, err = NewCaptiveCoreTomlFromFile(testCase.appendPath, params) diff --git a/services/horizon/CHANGELOG.md b/services/horizon/CHANGELOG.md index 05b9b25aeb..729b2c004e 100644 --- a/services/horizon/CHANGELOG.md +++ b/services/horizon/CHANGELOG.md @@ -15,7 +15,9 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). * Add more in-depth Prometheus metrics (count & duration) for db queries. -* Fix bug in `horizon db reingest range` command which required the `--ingest` flag to be set [3625](https://github.com/stellar/go/pull/3625)). +* Fix bug in `horizon db reingest range` command which required the `--ingest` flag to be set ([3625](https://github.com/stellar/go/pull/3625)). + +* Deprecate `--captive-core-config-append-path` in favor of `--captive-core-config-path`. The difference between the two flags is that `--captive-core-config-path` will validate the configuration file to reject any fields which are not supported by captive core ([3629](https://github.com/stellar/go/pull/3629)). * Add Multiplexed Account details to API responses (additional `_muxed` and `_muxed_id` optional fields following what's described in [SEP 23](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0023.md#horizon-api-changes)): * Transactions: `account_muxed`, `account_muxed_id`, `fee_account` and `fee_account_muxed`. diff --git a/services/horizon/internal/flags.go b/services/horizon/internal/flags.go index f534bb333d..4a96734841 100644 --- a/services/horizon/internal/flags.go +++ b/services/horizon/internal/flags.go @@ -28,8 +28,11 @@ const ( StellarCoreURLFlagName = "stellar-core-url" // StellarCoreBinaryPathName is the command line flag for configuring the path to the stellar core binary StellarCoreBinaryPathName = "stellar-core-binary-path" - // CaptiveCoreConfigAppendPathName is the command line flag for configuring the path to the captive core additional configuration - CaptiveCoreConfigAppendPathName = "captive-core-config-append-path" + // captiveCoreConfigAppendPathName is the command line flag for configuring the path to the captive core additional configuration + // Note captiveCoreConfigAppendPathName is deprecated in favor of CaptiveCoreConfigPathName + captiveCoreConfigAppendPathName = "captive-core-config-append-path" + // CaptiveCoreConfigPathName is the command line flag for configuring the path to the captive core configuration file + CaptiveCoreConfigPathName = "captive-core-config-path" captiveCoreMigrationHint = "If you are migrating from Horizon 1.x.y read the Migration Guide here: https://github.com/stellar/go/blob/master/services/horizon/internal/docs/captive_core.md" ) @@ -118,12 +121,39 @@ func Flags() (*Config, support.ConfigOptions) { ConfigKey: &config.RemoteCaptiveCoreURL, }, &support.ConfigOption{ - Name: CaptiveCoreConfigAppendPathName, + Name: captiveCoreConfigAppendPathName, OptType: types.String, FlagDefault: "", Required: false, - Usage: "path to additional configuration for the Stellar Core configuration file used by captive core. It must, at least, include enough details to define a quorum set", - ConfigKey: &config.CaptiveCoreConfigPath, + Usage: "DEPRECATED in favor of " + CaptiveCoreConfigPathName, + CustomSetValue: func(opt *support.ConfigOption) { + if val := viper.GetString(opt.Name); val != "" { + if viper.GetString(CaptiveCoreConfigPathName) != "" { + stdLog.Printf( + "both --%s and --%s are set. %s is deprecated so %s will be used instead", + captiveCoreConfigAppendPathName, + CaptiveCoreConfigPathName, + captiveCoreConfigAppendPathName, + CaptiveCoreConfigPathName, + ) + } else { + config.CaptiveCoreConfigPath = val + } + } + }, + }, + &support.ConfigOption{ + Name: CaptiveCoreConfigPathName, + OptType: types.String, + FlagDefault: "", + Required: false, + Usage: "path to the configuration file used by captive core. It must, at least, include enough details to define a quorum set. Any fields in the configuration file which are not supported by captive core will be rejected.", + CustomSetValue: func(opt *support.ConfigOption) { + if val := viper.GetString(opt.Name); val != "" { + config.CaptiveCoreConfigPath = val + config.CaptiveCoreTomlParams.Strict = true + } + }, }, &support.ConfigOption{ Name: "enable-captive-core-ingestion", @@ -489,9 +519,6 @@ func ApplyFlags(config *Config, flags support.ConfigOptions, options ApplyOption } } - // When running live ingestion a config file is required too - validateBothOrNeither(StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName) - // NOTE: If both of these are set (regardless of user- or PATH-supplied // defaults for the binary path), the Remote Captive Core URL // takes precedence. @@ -503,7 +530,7 @@ func ApplyFlags(config *Config, flags support.ConfigOptions, options ApplyOption if config.RemoteCaptiveCoreURL == "" && (binaryPath == "" || config.CaptiveCoreConfigPath == "") { if options.RequireCaptiveCoreConfig { stdLog.Fatalf("Invalid config: captive core requires that both --%s and --%s are set. %s", - StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName, captiveCoreMigrationHint) + StellarCoreBinaryPathName, CaptiveCoreConfigPathName, captiveCoreMigrationHint) } else { var err error config.CaptiveCoreTomlParams.HistoryArchiveURLs = config.HistoryArchiveURLs @@ -532,8 +559,12 @@ func ApplyFlags(config *Config, flags support.ConfigOptions, options ApplyOption } } else { if config.EnableCaptiveCoreIngestion && (config.CaptiveCoreBinaryPath != "" || config.CaptiveCoreConfigPath != "") { + captiveCoreConfigFlag := captiveCoreConfigAppendPathName + if viper.GetString(CaptiveCoreConfigPathName) != "" { + captiveCoreConfigFlag = CaptiveCoreConfigPathName + } stdLog.Fatalf("Invalid config: one or more captive core params passed (--%s or --%s) but --ingest not set. "+captiveCoreMigrationHint, - StellarCoreBinaryPathName, CaptiveCoreConfigAppendPathName) + StellarCoreBinaryPathName, captiveCoreConfigFlag) } if config.StellarCoreDatabaseURL != "" { stdLog.Fatalf("Invalid config: --%s passed but --ingest not set. ", StellarCoreDBURLFlagName) diff --git a/services/horizon/internal/integration/db_test.go b/services/horizon/internal/integration/db_test.go index e94a3440fc..b208bd40ea 100644 --- a/services/horizon/internal/integration/db_test.go +++ b/services/horizon/internal/integration/db_test.go @@ -98,7 +98,7 @@ func TestReingestDB(t *testing.T) { horizonConfig.StellarCoreDatabaseURL, "--stellar-core-binary-path", horizonConfig.CaptiveCoreBinaryPath, - "--captive-core-config-append-path", + "--captive-core-config-path", horizonConfig.CaptiveCoreConfigPath, "--enable-captive-core-ingestion=" + strconv.FormatBool(horizonConfig.EnableCaptiveCoreIngestion), "--network-passphrase", diff --git a/services/horizon/internal/test/integration/integration.go b/services/horizon/internal/test/integration/integration.go index fb2ea836ca..b50f470067 100644 --- a/services/horizon/internal/test/integration/integration.go +++ b/services/horizon/internal/test/integration/integration.go @@ -213,7 +213,7 @@ of accounts, subscribe to event streams, and more.`, "--stellar-core-binary-path", captiveCoreBinaryPath, - "--captive-core-config-append-path", + "--captive-core-config-path", captiveCoreConfigPath, "--captive-core-http-port", From 117f8eb69fc881f13168d5f81ab669b234c58f3f Mon Sep 17 00:00:00 2001 From: Leigh McCulloch Date: Fri, 28 May 2021 13:36:47 -0700 Subject: [PATCH 64/67] txnbuild: add AddSignatureDecorated (#3640) Add `AddSignatureDecorated` function to `Transaction`. The `Transaction` type has a `AddSignatureBase64` which is helpful when working with some SEPs where signatures and full signers are passed around, but sometimes people are exchanging the briefer decorated signatures. In that case there is no convenient way to attach the decorated signature to an existing transaction. The only methods available is to convert the `Transaction` to a `xdr.TransactionEnvelope`. But in that case there is no way to go back to a `Transaction` without round-tripping through Base64. --- txnbuild/CHANGELOG.md | 1 + txnbuild/transaction.go | 18 ++++++ txnbuild/transaction_test.go | 107 +++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+) diff --git a/txnbuild/CHANGELOG.md b/txnbuild/CHANGELOG.md index f5d7c9c400..548e3a69ae 100644 --- a/txnbuild/CHANGELOG.md +++ b/txnbuild/CHANGELOG.md @@ -8,6 +8,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ### New features * Add `SequenceNumber` function to `Transaction`. +* Add `AddSignatureDecorated` function to `Transaction`. ### Bug Fix diff --git a/txnbuild/transaction.go b/txnbuild/transaction.go index 425b2ce85d..fb0ce3a6a5 100644 --- a/txnbuild/transaction.go +++ b/txnbuild/transaction.go @@ -76,6 +76,13 @@ func concatSignatures( return extended, nil } +func concatSignatureDecorated(e xdr.TransactionEnvelope, signatures []xdr.DecoratedSignature, newSignatures []xdr.DecoratedSignature) ([]xdr.DecoratedSignature, error) { + extended := make([]xdr.DecoratedSignature, len(signatures)+len(newSignatures)) + copy(extended, signatures) + copy(extended[len(signatures):], newSignatures) + return extended, nil +} + func concatSignatureBase64(e xdr.TransactionEnvelope, signatures []xdr.DecoratedSignature, networkStr, publicKey, signature string) ([]xdr.DecoratedSignature, error) { if signature == "" { return nil, errors.New("signature not presented") @@ -305,6 +312,17 @@ func (t *Transaction) SignHashX(preimage []byte) (*Transaction, error) { return t.clone(extendedSignatures), nil } +// AddSignatureDecorated returns a new Transaction instance which extends the current instance +// with an additional decorated signature(s). +func (t *Transaction) AddSignatureDecorated(signature ...xdr.DecoratedSignature) (*Transaction, error) { + extendedSignatures, err := concatSignatureDecorated(t.envelope, t.Signatures(), signature) + if err != nil { + return nil, err + } + + return t.clone(extendedSignatures), nil +} + // AddSignatureBase64 returns a new Transaction instance which extends the current instance // with an additional signature derived from the given base64-encoded signature. func (t *Transaction) AddSignatureBase64(network, publicKey, signature string) (*Transaction, error) { diff --git a/txnbuild/transaction_test.go b/txnbuild/transaction_test.go index b75abaf672..2cca8d4b60 100644 --- a/txnbuild/transaction_test.go +++ b/txnbuild/transaction_test.go @@ -1577,6 +1577,113 @@ func TestSignWithSecretKey(t *testing.T) { assert.Equal(t, expected, actual, "base64 xdr should match") } +func TestAddSignatureDecorated(t *testing.T) { + kp0 := newKeypair0() + kp1 := newKeypair1() + txSource := NewSimpleAccount(kp0.Address(), int64(9605939170639897)) + tx1Source := NewSimpleAccount(kp0.Address(), int64(9605939170639897)) + createAccount := CreateAccount{ + Destination: "GCCOBXW2XQNUSL467IEILE6MMCNRR66SSVL4YQADUNYYNUVREF3FIV2Z", + Amount: "10", + SourceAccount: kp1.Address(), + } + + expected, err := newSignedTransaction( + TransactionParams{ + SourceAccount: &txSource, + IncrementSequenceNum: true, + Operations: []Operation{&createAccount}, + BaseFee: MinBaseFee, + Timebounds: NewInfiniteTimeout(), + }, + network.TestNetworkPassphrase, + kp0, kp1, + ) + assert.NoError(t, err) + + tx1, err := NewTransaction( + TransactionParams{ + SourceAccount: &tx1Source, + IncrementSequenceNum: true, + Operations: []Operation{&createAccount}, + BaseFee: MinBaseFee, + Timebounds: NewInfiniteTimeout(), + }, + ) + assert.NoError(t, err) + + // Same if signatures added separately. + { + var tx1sigs1 *Transaction + tx1sigs1, err = tx1.AddSignatureDecorated( + xdr.DecoratedSignature{ + Hint: kp0.Hint(), + Signature: func() xdr.Signature { + var sigBytes []byte + sigBytes, err = base64.StdEncoding.DecodeString("TVogR6tbrWLnOc1BsP/j+Qrxpja2NWNgeRIwujECYscRdMG7AMtnb3dkCT7sqlbSM0TTzlRh7G+BcVocYBtqBw==") + if err != nil { + require.NoError(t, err) + } + return xdr.Signature(sigBytes) + }(), + }, + ) + assert.NoError(t, err) + tx1sigs1, err = tx1sigs1.AddSignatureDecorated( + xdr.DecoratedSignature{ + Hint: kp1.Hint(), + Signature: func() xdr.Signature { + var sigBytes []byte + sigBytes, err = base64.StdEncoding.DecodeString("Iy77JteoW/FbeiuViZpgTyvrHP4BnBOeyVOjrdb5O/MpEMwcSlYXAkCBqPt4tBDil4jIcDDLhm7TsN6aUBkIBg==") + if err != nil { + require.NoError(t, err) + } + return xdr.Signature(sigBytes) + }(), + }, + ) + assert.NoError(t, err) + var actual string + actual, err = tx1sigs1.Base64() + assert.NoError(t, err) + assert.Equal(t, expected, actual, "base64 xdr should match") + } + + // Same if signatures added together. + { + var tx1sigs2 *Transaction + tx1sigs2, err = tx1.AddSignatureDecorated( + xdr.DecoratedSignature{ + Hint: kp0.Hint(), + Signature: func() xdr.Signature { + var sigBytes []byte + sigBytes, err = base64.StdEncoding.DecodeString("TVogR6tbrWLnOc1BsP/j+Qrxpja2NWNgeRIwujECYscRdMG7AMtnb3dkCT7sqlbSM0TTzlRh7G+BcVocYBtqBw==") + if err != nil { + require.NoError(t, err) + } + return xdr.Signature(sigBytes) + }(), + }, + xdr.DecoratedSignature{ + Hint: kp1.Hint(), + Signature: func() xdr.Signature { + var sigBytes []byte + sigBytes, err = base64.StdEncoding.DecodeString("Iy77JteoW/FbeiuViZpgTyvrHP4BnBOeyVOjrdb5O/MpEMwcSlYXAkCBqPt4tBDil4jIcDDLhm7TsN6aUBkIBg==") + if err != nil { + require.NoError(t, err) + } + return xdr.Signature(sigBytes) + }(), + }, + ) + assert.NoError(t, err) + var actual string + actual, err = tx1sigs2.Base64() + assert.NoError(t, err) + assert.Equal(t, expected, actual, "base64 xdr should match") + } +} + func TestAddSignatureBase64(t *testing.T) { kp0 := newKeypair0() kp1 := newKeypair1() From 2514f2febb0b97c7e2e2384f030bd12b0af41e3c Mon Sep 17 00:00:00 2001 From: tamirms Date: Tue, 1 Jun 2021 13:08:11 +0100 Subject: [PATCH 65/67] Fix transaction submission when handling large transaction payloads (#3643) The payload for the submit transaction endpoint is included as a query parameter in the horizon client. When a transaction has a lengthy XDR encoding, the request url can be too long which will cause the request to fail with a "HTTP 414 URI Too Long" error. To fix this issue I have moved the transaction payload into the POST body. --- clients/horizonclient/CHANGELOG.md | 1 + clients/horizonclient/account_request.go | 11 +++ clients/horizonclient/accounts_request.go | 11 +++ clients/horizonclient/asset_request.go | 11 +++ .../claimable_balance_request.go | 11 +++ clients/horizonclient/client.go | 84 ++++++++---------- clients/horizonclient/effect_request.go | 11 +++ clients/horizonclient/fee_stats_request.go | 15 +++- clients/horizonclient/ledger_request.go | 11 +++ clients/horizonclient/main.go | 2 + clients/horizonclient/main_test.go | 88 ++++++++++++++----- clients/horizonclient/offer_request.go | 11 +++ clients/horizonclient/operation_request.go | 11 +++ clients/horizonclient/order_book_request.go | 11 +++ clients/horizonclient/paths_request.go | 11 +++ .../strict_send_paths_request.go | 11 +++ clients/horizonclient/submit_request.go | 14 +++ .../trade_aggregation_request.go | 11 +++ clients/horizonclient/trade_request.go | 11 +++ clients/horizonclient/transaction_request.go | 11 +++ 20 files changed, 288 insertions(+), 70 deletions(-) diff --git a/clients/horizonclient/CHANGELOG.md b/clients/horizonclient/CHANGELOG.md index 35a74f5745..d2b82373ab 100644 --- a/clients/horizonclient/CHANGELOG.md +++ b/clients/horizonclient/CHANGELOG.md @@ -6,6 +6,7 @@ file. This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased * Added transaction and operation result codes to the horizonclient.Error string for easy glancing at string only errors for underlying cause. +* Fix bug in the transaction submission where requests with large transaction payloads fail with an HTTP 414 URI Too Long error ([#3643](https://github.com/stellar/go/pull/3643)). ## [v7.0.0](https://github.com/stellar/go/releases/tag/horizonclient-v7.0.0) - 2021-05-15 diff --git a/clients/horizonclient/account_request.go b/clients/horizonclient/account_request.go index a9ee2b71f0..91c85e024a 100644 --- a/clients/horizonclient/account_request.go +++ b/clients/horizonclient/account_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -46,3 +47,13 @@ func (ar AccountRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the account endpoint +func (ar AccountRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := ar.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/accounts_request.go b/clients/horizonclient/accounts_request.go index c42b9e2cd6..1d57a31232 100644 --- a/clients/horizonclient/accounts_request.go +++ b/clients/horizonclient/accounts_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -54,3 +55,13 @@ func (r AccountsRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the accounts endpoint +func (r AccountsRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := r.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/asset_request.go b/clients/horizonclient/asset_request.go index 65799b0e8e..f0a8f3c522 100644 --- a/clients/horizonclient/asset_request.go +++ b/clients/horizonclient/asset_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -27,3 +28,13 @@ func (ar AssetRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the assets endpoint +func (ar AssetRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := ar.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/claimable_balance_request.go b/clients/horizonclient/claimable_balance_request.go index 06631fff81..eb80c13249 100644 --- a/clients/horizonclient/claimable_balance_request.go +++ b/clients/horizonclient/claimable_balance_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -40,3 +41,13 @@ func (cbr ClaimableBalanceRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the claimable balances endpoint +func (cbr ClaimableBalanceRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := cbr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/client.go b/clients/horizonclient/client.go index e996f27b09..7add6a02fd 100644 --- a/clients/horizonclient/client.go +++ b/clients/horizonclient/client.go @@ -26,18 +26,13 @@ import ( // sendRequest builds the URL for the given horizon request and sends the url to a horizon server func (c *Client) sendRequest(hr HorizonRequest, resp interface{}) (err error) { - endpoint, err := hr.BuildURL() - if err != nil { - return - } - c.HorizonURL = c.fixHorizonURL() - _, ok := hr.(submitRequest) - if ok { - return c.sendRequestURL(c.HorizonURL+endpoint, "post", resp) + req, err := hr.HTTPRequest(c.HorizonURL) + if err != nil { + return err } - return c.sendRequestURL(c.HorizonURL+endpoint, "get", resp) + return c.sendHTTPRequest(req, resp) } // checkMemoRequired implements a memo required check as defined in @@ -105,36 +100,31 @@ func (c *Client) checkMemoRequired(transaction *txnbuild.Transaction) error { return nil } -// sendRequestURL sends a url to a horizon server. +// sendGetRequest sends a HTTP GET request to a horizon server. // It can be used for requests that do not implement the HorizonRequest interface. -func (c *Client) sendRequestURL(requestURL string, method string, a interface{}) (err error) { - var req *http.Request - - if method == "post" || method == "POST" { - req, err = http.NewRequest("POST", requestURL, nil) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value") - } else { - req, err = http.NewRequest("GET", requestURL, nil) - } - +func (c *Client) sendGetRequest(requestURL string, a interface{}) error { + req, err := http.NewRequest("GET", requestURL, nil) if err != nil { return errors.Wrap(err, "error creating HTTP request") } + return c.sendHTTPRequest(req, a) +} + +func (c *Client) sendHTTPRequest(req *http.Request, a interface{}) error { c.setClientAppHeaders(req) c.setDefaultClient() + if c.horizonTimeout == 0 { c.horizonTimeout = HorizonTimeout } ctx, cancel := context.WithTimeout(context.Background(), c.horizonTimeout) - resp, err := c.HTTP.Do(req.WithContext(ctx)) - if err != nil { - cancel() - return - } + defer cancel() - err = decodeResponse(resp, &a, c) - cancel() - return + if resp, err := c.HTTP.Do(req.WithContext(ctx)); err != nil { + return err + } else { + return decodeResponse(resp, &a, c) + } } // stream handles connections to endpoints that support streaming on a horizon server @@ -587,7 +577,7 @@ func (c *Client) Fund(addr string) (tx hProtocol.Transaction, err error) { return tx, errors.New("can't fund account from friendbot on production network") } friendbotURL := fmt.Sprintf("%sfriendbot?addr=%s", c.fixHorizonURL(), addr) - err = c.sendRequestURL(friendbotURL, "get", &tx) + err = c.sendGetRequest(friendbotURL, &tx) return } @@ -678,7 +668,7 @@ func (c *Client) FetchTimebounds(seconds int64) (txnbuild.Timebounds, error) { // Root loads the root endpoint of horizon func (c *Client) Root() (root hProtocol.Root, err error) { - err = c.sendRequestURL(c.fixHorizonURL(), "get", &root) + err = c.sendGetRequest(c.fixHorizonURL(), &root) return } @@ -689,67 +679,67 @@ func (c *Client) Version() string { // NextAccountsPage returns the next page of accounts. func (c *Client) NextAccountsPage(page hProtocol.AccountsPage) (accounts hProtocol.AccountsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &accounts) + err = c.sendGetRequest(page.Links.Next.Href, &accounts) return } // NextAssetsPage returns the next page of assets. func (c *Client) NextAssetsPage(page hProtocol.AssetsPage) (assets hProtocol.AssetsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &assets) + err = c.sendGetRequest(page.Links.Next.Href, &assets) return } // PrevAssetsPage returns the previous page of assets. func (c *Client) PrevAssetsPage(page hProtocol.AssetsPage) (assets hProtocol.AssetsPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &assets) + err = c.sendGetRequest(page.Links.Prev.Href, &assets) return } // NextLedgersPage returns the next page of ledgers. func (c *Client) NextLedgersPage(page hProtocol.LedgersPage) (ledgers hProtocol.LedgersPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &ledgers) + err = c.sendGetRequest(page.Links.Next.Href, &ledgers) return } // PrevLedgersPage returns the previous page of ledgers. func (c *Client) PrevLedgersPage(page hProtocol.LedgersPage) (ledgers hProtocol.LedgersPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &ledgers) + err = c.sendGetRequest(page.Links.Prev.Href, &ledgers) return } // NextEffectsPage returns the next page of effects. func (c *Client) NextEffectsPage(page effects.EffectsPage) (efp effects.EffectsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &efp) + err = c.sendGetRequest(page.Links.Next.Href, &efp) return } // PrevEffectsPage returns the previous page of effects. func (c *Client) PrevEffectsPage(page effects.EffectsPage) (efp effects.EffectsPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &efp) + err = c.sendGetRequest(page.Links.Prev.Href, &efp) return } // NextTransactionsPage returns the next page of transactions. func (c *Client) NextTransactionsPage(page hProtocol.TransactionsPage) (transactions hProtocol.TransactionsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &transactions) + err = c.sendGetRequest(page.Links.Next.Href, &transactions) return } // PrevTransactionsPage returns the previous page of transactions. func (c *Client) PrevTransactionsPage(page hProtocol.TransactionsPage) (transactions hProtocol.TransactionsPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &transactions) + err = c.sendGetRequest(page.Links.Prev.Href, &transactions) return } // NextOperationsPage returns the next page of operations. func (c *Client) NextOperationsPage(page operations.OperationsPage) (operations operations.OperationsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &operations) + err = c.sendGetRequest(page.Links.Next.Href, &operations) return } // PrevOperationsPage returns the previous page of operations. func (c *Client) PrevOperationsPage(page operations.OperationsPage) (operations operations.OperationsPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &operations) + err = c.sendGetRequest(page.Links.Prev.Href, &operations) return } @@ -765,25 +755,25 @@ func (c *Client) PrevPaymentsPage(page operations.OperationsPage) (operations.Op // NextOffersPage returns the next page of offers. func (c *Client) NextOffersPage(page hProtocol.OffersPage) (offers hProtocol.OffersPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &offers) + err = c.sendGetRequest(page.Links.Next.Href, &offers) return } // PrevOffersPage returns the previous page of offers. func (c *Client) PrevOffersPage(page hProtocol.OffersPage) (offers hProtocol.OffersPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &offers) + err = c.sendGetRequest(page.Links.Prev.Href, &offers) return } // NextTradesPage returns the next page of trades. func (c *Client) NextTradesPage(page hProtocol.TradesPage) (trades hProtocol.TradesPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &trades) + err = c.sendGetRequest(page.Links.Next.Href, &trades) return } // PrevTradesPage returns the previous page of trades. func (c *Client) PrevTradesPage(page hProtocol.TradesPage) (trades hProtocol.TradesPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &trades) + err = c.sendGetRequest(page.Links.Prev.Href, &trades) return } @@ -804,14 +794,14 @@ func (c *Client) HomeDomainForAccount(aid string) (string, error) { // NextTradeAggregationsPage returns the next page of trade aggregations from the current // trade aggregations response. func (c *Client) NextTradeAggregationsPage(page hProtocol.TradeAggregationsPage) (ta hProtocol.TradeAggregationsPage, err error) { - err = c.sendRequestURL(page.Links.Next.Href, "get", &ta) + err = c.sendGetRequest(page.Links.Next.Href, &ta) return } // PrevTradeAggregationsPage returns the previous page of trade aggregations from the current // trade aggregations response. func (c *Client) PrevTradeAggregationsPage(page hProtocol.TradeAggregationsPage) (ta hProtocol.TradeAggregationsPage, err error) { - err = c.sendRequestURL(page.Links.Prev.Href, "get", &ta) + err = c.sendGetRequest(page.Links.Prev.Href, &ta) return } diff --git a/clients/horizonclient/effect_request.go b/clients/horizonclient/effect_request.go index 232e3e059f..9597373a4d 100644 --- a/clients/horizonclient/effect_request.go +++ b/clients/horizonclient/effect_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" "github.com/stellar/go/protocols/horizon/effects" @@ -80,3 +81,13 @@ func (er EffectRequest) StreamEffects(ctx context.Context, client *Client, handl return nil }) } + +// HTTPRequest returns the http request for the effects endpoint +func (er EffectRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := er.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/fee_stats_request.go b/clients/horizonclient/fee_stats_request.go index a7e367be74..24c55a6483 100644 --- a/clients/horizonclient/fee_stats_request.go +++ b/clients/horizonclient/fee_stats_request.go @@ -1,6 +1,9 @@ package horizonclient -import "github.com/stellar/go/support/errors" +import ( + "github.com/stellar/go/support/errors" + "net/http" +) // BuildURL returns the url for getting fee stats about a running horizon instance func (fr feeStatsRequest) BuildURL() (endpoint string, err error) { @@ -11,3 +14,13 @@ func (fr feeStatsRequest) BuildURL() (endpoint string, err error) { return } + +// HTTPRequest returns the http request for the fee stats endpoint +func (fr feeStatsRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := fr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/ledger_request.go b/clients/horizonclient/ledger_request.go index 85b1388cff..cb9f85afb4 100644 --- a/clients/horizonclient/ledger_request.go +++ b/clients/horizonclient/ledger_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" hProtocol "github.com/stellar/go/protocols/horizon" @@ -40,6 +41,16 @@ func (lr LedgerRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the ledger endpoint +func (lr LedgerRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := lr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // LedgerHandler is a function that is called when a new ledger is received type LedgerHandler func(hProtocol.Ledger) diff --git a/clients/horizonclient/main.go b/clients/horizonclient/main.go index 62b897cad7..aeb8b6dddb 100644 --- a/clients/horizonclient/main.go +++ b/clients/horizonclient/main.go @@ -225,8 +225,10 @@ var DefaultPublicNetClient = &Client{ } // HorizonRequest contains methods implemented by request structs for horizon endpoints. +// Action needed in release: horizonclient-v8.0.0: remove BuildURL() type HorizonRequest interface { BuildURL() (string, error) + HTTPRequest(horizonURL string) (*http.Request, error) } // AccountsRequest struct contains data for making requests to the accounts endpoint of a horizon server. diff --git a/clients/horizonclient/main_test.go b/clients/horizonclient/main_test.go index dc935305a2..ab1aaab498 100644 --- a/clients/horizonclient/main_test.go +++ b/clients/horizonclient/main_test.go @@ -2,8 +2,8 @@ package horizonclient import ( "fmt" + "github.com/jarcoal/httpmock" "net/http" - "net/url" "testing" "time" @@ -835,8 +835,12 @@ func TestSubmitTransactionXDRRequest(t *testing.T) { // successful tx hmock.On( "POST", - "https://localhost/transactions?tx=AAAAABB90WssODNIgi6BHveqzxTRmIpvAFRyVNM%2BHm2GVuCcAAAAZAAABD0AAuV%2FAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAyTBGxOgfSApppsTnb%2FYRr6gOR8WT0LZNrhLh4y3FCgoAAAAXSHboAAAAAAAAAAABhlbgnAAAAEAivKe977CQCxMOKTuj%2BcWTFqc2OOJU8qGr9afrgu2zDmQaX5Q0cNshc3PiBwe0qw%2F%2BD%2FqJk5QqM5dYeSUGeDQP", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) resp, err := client.SubmitTransactionXDR(txXdr) if assert.NoError(t, err) { @@ -844,7 +848,7 @@ func TestSubmitTransactionXDRRequest(t *testing.T) { assert.Equal(t, resp.Links.Transaction.Href, "https://horizon-testnet.stellar.org/transactions/bcc7a97264dca0a51a63f7ea971b5e7458e334489673078bb2a34eb0cce910ca") assert.Equal(t, resp.Hash, "bcc7a97264dca0a51a63f7ea971b5e7458e334489673078bb2a34eb0cce910ca") assert.Equal(t, resp.Ledger, int32(354811)) - assert.Equal(t, resp.EnvelopeXdr, `AAAAABB90WssODNIgi6BHveqzxTRmIpvAFRyVNM+Hm2GVuCcAAAAZAAABD0AAuV/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAyTBGxOgfSApppsTnb/YRr6gOR8WT0LZNrhLh4y3FCgoAAAAXSHboAAAAAAAAAAABhlbgnAAAAEAivKe977CQCxMOKTuj+cWTFqc2OOJU8qGr9afrgu2zDmQaX5Q0cNshc3PiBwe0qw/+D/qJk5QqM5dYeSUGeDQP`) + assert.Equal(t, resp.EnvelopeXdr, txXdr) assert.Equal(t, resp.ResultXdr, "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAA=") assert.Equal(t, resp.ResultMetaXdr, `AAAAAQAAAAIAAAADAAVp+wAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwACBP/TuycHAAABD0AAuV+AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAVp+wAAAAAAAAAAEH3Rayw4M0iCLoEe96rPFNGYim8AVHJU0z4ebYZW4JwACBP/TuycHAAABD0AAuV/AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAMABWn7AAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAAIE/9O7JwcAAAEPQAC5X8AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEABWn7AAAAAAAAAAAQfdFrLDgzSIIugR73qs8U0ZiKbwBUclTTPh5thlbgnAAIE+gGdbQcAAAEPQAC5X8AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAABWn7AAAAAAAAAADJMEbE6B9ICmmmxOdv9hGvqA5HxZPQtk2uEuHjLcUKCgAAABdIdugAAAVp+wAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==`) } @@ -880,11 +884,16 @@ func TestSubmitTransactionRequest(t *testing.T) { tx, err = tx.Sign(network.TestNetworkPassphrase, kp) assert.NoError(t, err) + txXdr := "AAAAAgAAAAAFNPMlEPLB6oWPI/Zl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAEAAAAAAAAAAQAAAAAFNPMlEPLB6oWPI/Zl1sBEXxwv93ChUnv7KQK9KxrTtgAAAAAAAAAABfXhAAAAAAAAAAABKxrTtgAAAECmVMsI0W6JmfJNeLzgH+PseZA2AgYGZl8zaHgkOvhZw65Hj9OaCdw6yssG55qu7X2sauJAwfxaoTL4gwbmH94H" // successful tx with config.memo_required not found hmock.On( "POST", - "https://localhost/transactions?tx=AAAAAgAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAEAAAAAAAAAAQAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAAAAAAAABfXhAAAAAAAAAAABKxrTtgAAAECmVMsI0W6JmfJNeLzgH%2BPseZA2AgYGZl8zaHgkOvhZw65Hj9OaCdw6yssG55qu7X2sauJAwfxaoTL4gwbmH94H", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) hmock.On( "GET", @@ -944,11 +953,16 @@ func TestSubmitTransactionRequestMuxedAccounts(t *testing.T) { tx, err = tx.Sign(network.TestNetworkPassphrase, kp) assert.NoError(t, err) + txXdr := "AAAAAgAAAQAAAAAAyv66vgU08yUQ8sHqhY8j9mXWwERfHC/3cKFSe/spAr0rGtO2AAAAZAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAQAAAAAAAAABAAAAAAU08yUQ8sHqhY8j9mXWwERfHC/3cKFSe/spAr0rGtO2AAAAAAAAAAAF9eEAAAAAAAAAAAErGtO2AAAAQJvQkE9UVo/mfFBl/8ZPTzSUyVO4nvW0BYfnbowoBPEdRfLOLQz28v6sBKQc2b86NUfVHN5TQVo3+jH4nK9wVgk=" // successful tx with config.memo_required not found hmock.On( "POST", - "https://localhost/transactions?tx=AAAAAgAAAQAAAAAAyv66vgU08yUQ8sHqhY8j9mXWwERfHC%2F3cKFSe%2FspAr0rGtO2AAAAZAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAQAAAAAAAAABAAAAAAU08yUQ8sHqhY8j9mXWwERfHC%2F3cKFSe%2FspAr0rGtO2AAAAAAAAAAAF9eEAAAAAAAAAAAErGtO2AAAAQJvQkE9UVo%2FmfFBl%2F8ZPTzSUyVO4nvW0BYfnbowoBPEdRfLOLQz28v6sBKQc2b86NUfVHN5TQVo3%2BjH4nK9wVgk%3D", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) hmock.On( "GET", @@ -1012,8 +1026,12 @@ func TestSubmitFeeBumpTransaction(t *testing.T) { // successful tx with config.memo_required not found hmock.On( "POST", - "https://localhost/transactions?tx="+url.QueryEscape(feeBumpTxB64), - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, feeBumpTxB64) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) hmock.On( "GET", @@ -1089,11 +1107,16 @@ func TestSubmitTransactionWithOptionsRequest(t *testing.T) { assert.Equal(t, ok, false) } + txXdr := "AAAAAgAAAAAFNPMlEPLB6oWPI/Zl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAEAAAAAAAAAAQAAAAAFNPMlEPLB6oWPI/Zl1sBEXxwv93ChUnv7KQK9KxrTtgAAAAAAAAAABfXhAAAAAAAAAAABKxrTtgAAAECmVMsI0W6JmfJNeLzgH+PseZA2AgYGZl8zaHgkOvhZw65Hj9OaCdw6yssG55qu7X2sauJAwfxaoTL4gwbmH94H" // successful tx hmock.On( "POST", - "https://localhost/transactions?tx=AAAAAgAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAEAAAAAAAAAAQAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAAAAAAAABfXhAAAAAAAAAAABKxrTtgAAAECmVMsI0W6JmfJNeLzgH%2BPseZA2AgYGZl8zaHgkOvhZw65Hj9OaCdw6yssG55qu7X2sauJAwfxaoTL4gwbmH94H", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) _, err = client.SubmitTransactionWithOptions(tx, SubmitTxOpts{SkipMemoRequiredCheck: true}) assert.NoError(t, err) @@ -1101,8 +1124,12 @@ func TestSubmitTransactionWithOptionsRequest(t *testing.T) { // successful tx with config.memo_required not found hmock.On( "POST", - "https://localhost/transactions?tx=AAAAAgAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAEAAAAAAAAAAQAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAAAAAAAABfXhAAAAAAAAAAABKxrTtgAAAECmVMsI0W6JmfJNeLzgH%2BPseZA2AgYGZl8zaHgkOvhZw65Hj9OaCdw6yssG55qu7X2sauJAwfxaoTL4gwbmH94H", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) hmock.On( "GET", @@ -1123,10 +1150,15 @@ func TestSubmitTransactionWithOptionsRequest(t *testing.T) { assert.Equal(t, ErrAccountRequiresMemo, errors.Cause(err)) // skips memo check if tx includes a memo + txXdr = "AAAAAgAAAAAFNPMlEPLB6oWPI/Zl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAQAAAApIZWxsb1dvcmxkAAAAAAABAAAAAAAAAAEAAAAABTTzJRDyweqFjyP2ZdbARF8cL/dwoVJ7+ykCvSsa07YAAAAAAAAAAAX14QAAAAAAAAAAASsa07YAAABA7rDHZ+HcBIQbWByMZL3aT231WuwjOhxvb0c1i3vPzArUCE+HdCIJXq6Mk/xdhJj6QEEJrg15uAxke3P3k2vWCw==" hmock.On( "POST", - "https://localhost/transactions?tx=AAAAAgAAAAAFNPMlEPLB6oWPI%2FZl1sBEXxwv93ChUnv7KQK9KxrTtgAAAGQAAAAAAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAKAAAAAQAAAApIZWxsb1dvcmxkAAAAAAABAAAAAAAAAAEAAAAABTTzJRDyweqFjyP2ZdbARF8cL%2FdwoVJ7%2BykCvSsa07YAAAAAAAAAAAX14QAAAAAAAAAAASsa07YAAABA7rDHZ%2BHcBIQbWByMZL3aT231WuwjOhxvb0c1i3vPzArUCE%2BHdCIJXq6Mk%2FxdhJj6QEEJrg15uAxke3P3k2vWCw%3D%3D", - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, txXdr) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) tx, err = txnbuild.NewTransaction( txnbuild.TransactionParams{ @@ -1215,8 +1247,12 @@ func TestSubmitFeeBumpTransactionWithOptions(t *testing.T) { // successful tx hmock.On( "POST", - "https://localhost/transactions?tx="+url.QueryEscape(feeBumpTxB64), - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, feeBumpTxB64) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) _, err = client.SubmitFeeBumpTransactionWithOptions(feeBumpTx, SubmitTxOpts{SkipMemoRequiredCheck: true}) assert.NoError(t, err) @@ -1224,8 +1260,12 @@ func TestSubmitFeeBumpTransactionWithOptions(t *testing.T) { // successful tx with config.memo_required not found hmock.On( "POST", - "https://localhost/transactions?tx="+url.QueryEscape(feeBumpTxB64), - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, feeBumpTxB64) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) hmock.On( "GET", @@ -1270,8 +1310,12 @@ func TestSubmitFeeBumpTransactionWithOptions(t *testing.T) { // skips memo check if tx includes a memo hmock.On( "POST", - "https://localhost/transactions?tx="+url.QueryEscape(feeBumpTxB64), - ).ReturnString(200, txSuccess) + "https://localhost/transactions", + ).Return(func(request *http.Request) (*http.Response, error) { + val := request.FormValue("tx") + assert.Equal(t, val, feeBumpTxB64) + return httpmock.NewStringResponse(http.StatusOK, txSuccess), nil + }) tx, err = tx.Sign(network.TestNetworkPassphrase, kp) assert.NoError(t, err) diff --git a/clients/horizonclient/offer_request.go b/clients/horizonclient/offer_request.go index 28cdb4dbe4..510576d0e8 100644 --- a/clients/horizonclient/offer_request.go +++ b/clients/horizonclient/offer_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" hProtocol "github.com/stellar/go/protocols/horizon" @@ -50,6 +51,16 @@ func (or OfferRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the offers endpoint +func (or OfferRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := or.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // OfferHandler is a function that is called when a new offer is received type OfferHandler func(hProtocol.Offer) diff --git a/clients/horizonclient/operation_request.go b/clients/horizonclient/operation_request.go index 1cc08c3732..d947169f2d 100644 --- a/clients/horizonclient/operation_request.go +++ b/clients/horizonclient/operation_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" "github.com/stellar/go/protocols/horizon/operations" @@ -54,6 +55,16 @@ func (op OperationRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the operations endpoint +func (op OperationRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := op.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // setEndpoint sets the endpoint for the OperationRequest func (op *OperationRequest) setEndpoint(endpoint string) *OperationRequest { if endpoint == "payments" { diff --git a/clients/horizonclient/order_book_request.go b/clients/horizonclient/order_book_request.go index 8e855a7d0a..fee5547397 100644 --- a/clients/horizonclient/order_book_request.go +++ b/clients/horizonclient/order_book_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" hProtocol "github.com/stellar/go/protocols/horizon" @@ -37,6 +38,16 @@ func (obr OrderBookRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the order book endpoint +func (obr OrderBookRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := obr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // OrderBookHandler is a function that is called when a new order summary is received type OrderBookHandler func(hProtocol.OrderBookSummary) diff --git a/clients/horizonclient/paths_request.go b/clients/horizonclient/paths_request.go index 8f6c2bd309..ab603b59ea 100644 --- a/clients/horizonclient/paths_request.go +++ b/clients/horizonclient/paths_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -34,3 +35,13 @@ func (pr PathsRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the path payment endpoint +func (pr PathsRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := pr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/strict_send_paths_request.go b/clients/horizonclient/strict_send_paths_request.go index a1caaa0e26..14a494b404 100644 --- a/clients/horizonclient/strict_send_paths_request.go +++ b/clients/horizonclient/strict_send_paths_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "github.com/stellar/go/support/errors" @@ -33,3 +34,13 @@ func (pr StrictSendPathsRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the strict send path payment endpoint +func (pr StrictSendPathsRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := pr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/submit_request.go b/clients/horizonclient/submit_request.go index 839f38b2de..673e48f29f 100644 --- a/clients/horizonclient/submit_request.go +++ b/clients/horizonclient/submit_request.go @@ -2,7 +2,9 @@ package horizonclient import ( "fmt" + "net/http" "net/url" + "strings" "github.com/stellar/go/support/errors" ) @@ -19,3 +21,15 @@ func (sr submitRequest) BuildURL() (endpoint string, err error) { endpoint = fmt.Sprintf("%s?%s", sr.endpoint, query.Encode()) return endpoint, err } + +// HTTPRequest returns the http request for submitting transactions to a running horizon instance +func (sr submitRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + form := url.Values{} + form.Set("tx", sr.transactionXdr) + request, err := http.NewRequest("POST", horizonURL+sr.endpoint, strings.NewReader(form.Encode())) + if err != nil { + return nil, err + } + request.Header.Add("Content-Type", "application/x-www-form-urlencoded") + return request, nil +} diff --git a/clients/horizonclient/trade_aggregation_request.go b/clients/horizonclient/trade_aggregation_request.go index 13e2784b49..acb13e9ffb 100644 --- a/clients/horizonclient/trade_aggregation_request.go +++ b/clients/horizonclient/trade_aggregation_request.go @@ -2,6 +2,7 @@ package horizonclient import ( "fmt" + "net/http" "net/url" "strconv" @@ -36,3 +37,13 @@ func (ta TradeAggregationRequest) BuildURL() (endpoint string, err error) { return endpoint, err } + +// HTTPRequest returns the http request for the trade aggregations endpoint +func (ta TradeAggregationRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := ta.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} diff --git a/clients/horizonclient/trade_request.go b/clients/horizonclient/trade_request.go index 21afb69aa7..d9e8b20a91 100644 --- a/clients/horizonclient/trade_request.go +++ b/clients/horizonclient/trade_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" hProtocol "github.com/stellar/go/protocols/horizon" @@ -62,6 +63,16 @@ func (tr TradeRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the trades endpoint +func (tr TradeRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := tr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // TradeHandler is a function that is called when a new trade is received type TradeHandler func(hProtocol.Trade) diff --git a/clients/horizonclient/transaction_request.go b/clients/horizonclient/transaction_request.go index 89b715d1f2..edf002b5cb 100644 --- a/clients/horizonclient/transaction_request.go +++ b/clients/horizonclient/transaction_request.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "net/http" "net/url" hProtocol "github.com/stellar/go/protocols/horizon" @@ -47,6 +48,16 @@ func (tr TransactionRequest) BuildURL() (endpoint string, err error) { return endpoint, err } +// HTTPRequest returns the http request for the transactions endpoint +func (tr TransactionRequest) HTTPRequest(horizonURL string) (*http.Request, error) { + endpoint, err := tr.BuildURL() + if err != nil { + return nil, err + } + + return http.NewRequest("GET", horizonURL+endpoint, nil) +} + // TransactionHandler is a function that is called when a new transaction is received type TransactionHandler func(hProtocol.Transaction) From c92221fd6fb6ce316409283b306641bfd797bbd3 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Tue, 1 Jun 2021 14:42:42 +0200 Subject: [PATCH 66/67] services/horizon: Add recommended tcp_keepalives_* config to Admin guide (#3645) Add recommended Postgres `tcp_keepalives_*` config values to Horizon Admin guide to improve availability. --- services/horizon/internal/docs/admin.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/horizon/internal/docs/admin.md b/services/horizon/internal/docs/admin.md index a36ac2c2b9..ec300b7250 100644 --- a/services/horizon/internal/docs/admin.md +++ b/services/horizon/internal/docs/admin.md @@ -77,6 +77,13 @@ To prepare a database for Horizon's use, first you must ensure the database is b It is recommended to set `random_page_cost=1` in Postgres configuration if you are using SSD storage. With this setting Query Planner will make a better use of indexes, especially for `JOIN` queries. We have noticed a huge speed improvement for some queries. +To improve availability of both ingestion and frontend servers it's recommended to set the following values: +* `tcp_keepalives_idle`: 10 seconds, +* `tcp_keepalives_interval`: 1 second, +* `tcp_keepalives_count`: 5. + +With the config above, if there are no queries from a given client for 10 seconds, Postgres should start sending TCP keepalive packets. It will retry 5 times every second. If there is no response from the client after that time it will drop the connection. + ## Running Once your Horizon database is configured, you're ready to run Horizon. To run Horizon you simply run `horizon` or `horizon serve`, both of which start the HTTP server and start logging to standard out. When run, you should see some output that similar to: From 11f0c3f96df0ac113341d8a00fdc295fe30f246f Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Tue, 1 Jun 2021 14:59:04 +0200 Subject: [PATCH 67/67] xdr: Remove Price.Scan method (#3646) This commit removes `xdr.Price.Scan` method (implements Scanner[1] interface) because it's no longer used in `stellar/go` (since 599673d). The method was dependant on `github.com/lib/pq` so everyone who pulled `xdr` package had to add it to their dependencies. Close #3152. [1] https://golang.org/pkg/database/sql/#Scanner --- xdr/db.go | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/xdr/db.go b/xdr/db.go index 22d4fe72f3..224a88ac6d 100644 --- a/xdr/db.go +++ b/xdr/db.go @@ -5,8 +5,6 @@ import ( "encoding/hex" "errors" "fmt" - - "github.com/lib/pq" ) // This file contains implementations of the sql.Scanner interface for stellar xdr types @@ -76,24 +74,6 @@ func (t *Int64) Scan(src interface{}) error { return nil } -// Scan reads from a src into an xdr.Price -func (t *Price) Scan(src interface{}) error { - // assuming the price is represented as a two-element array [n,d] - arr := pq.Int64Array{} - err := arr.Scan(src) - - if err != nil { - return err - } - - if len(arr) != 2 { - return errors.New("price array should have exactly 2 elements") - } - - *t = Price{Int32(arr[0]), Int32(arr[1])} - return nil -} - // Scan reads from a src into an xdr.Hash func (t *Hash) Scan(src interface{}) error { decodedBytes, err := hex.DecodeString(string(src.([]uint8)))