From ad82d17e61551b4c31477ae44b59cb66813c0ecc Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Tue, 16 Feb 2021 10:16:46 -0800 Subject: [PATCH 01/39] Renamed solo.Supply to solo.Saldo --- .../examples_core/micropay/micropay_test.go | 36 +++++++++---------- .../test/donatewithfeedback_test.go | 6 ++-- contracts/rust/erc20/test/fun_test.go | 34 +++++++++--------- .../rust/fairauction/test/fairauction_test.go | 4 +-- packages/solo/examples/example_test.go | 2 +- packages/solo/solo.go | 36 ++++++++++--------- .../testcore/sandbox_tests/2chains_test.go | 6 ++-- .../testcore/sandbox_tests/eventlog_test.go | 4 +-- 8 files changed, 65 insertions(+), 63 deletions(-) diff --git a/contracts/examples_core/micropay/micropay_test.go b/contracts/examples_core/micropay/micropay_test.go index d4433141e3..ce40d1de66 100644 --- a/contracts/examples_core/micropay/micropay_test.go +++ b/contracts/examples_core/micropay/micropay_test.go @@ -27,7 +27,7 @@ func TestSubmitPk(t *testing.T) { payer, payerPubKey := env.NewSignatureSchemeWithFundsAndPubKey() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, @@ -44,11 +44,11 @@ func TestOpenChannelFail(t *testing.T) { payer := env.NewSignatureSchemeWithFunds() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) provider := env.NewSignatureSchemeWithFunds() providerAddr := provider.Address() - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). @@ -59,7 +59,7 @@ func TestOpenChannelFail(t *testing.T) { cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) cAgentID := coretypes.NewAgentIDFromContractID(cID) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 0) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-1) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-1) } func TestOpenChannelOk(t *testing.T) { @@ -70,7 +70,7 @@ func TestOpenChannelOk(t *testing.T) { payer, payerPubKey := env.NewSignatureSchemeWithFundsAndPubKey() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, @@ -80,7 +80,7 @@ func TestOpenChannelOk(t *testing.T) { provider := env.NewSignatureSchemeWithFunds() providerAddr := provider.Address() - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo) req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). @@ -91,7 +91,7 @@ func TestOpenChannelOk(t *testing.T) { cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) cAgentID := coretypes.NewAgentIDFromContractID(cID) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-600-2) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-2) } func TestOpenChannelTwice(t *testing.T) { @@ -102,7 +102,7 @@ func TestOpenChannelTwice(t *testing.T) { payer, payerPubKey := env.NewSignatureSchemeWithFundsAndPubKey() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, @@ -112,7 +112,7 @@ func TestOpenChannelTwice(t *testing.T) { provider := env.NewSignatureSchemeWithFunds() providerAddr := provider.Address() - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) cAgentID := coretypes.NewAgentIDFromContractID(cID) @@ -124,13 +124,13 @@ func TestOpenChannelTwice(t *testing.T) { require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-600-2) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-2) _, err = chain.PostRequest(req, payer) require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600+600) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-600-600-3) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-600-3) ret, err := chain.CallView("micropay", FuncGetChannelInfo, ParamPayerAddress, payerAddr, @@ -159,7 +159,7 @@ func TestRevokeWarrant(t *testing.T) { payer, payerPubKey := env.NewSignatureSchemeWithFundsAndPubKey() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, @@ -169,7 +169,7 @@ func TestRevokeWarrant(t *testing.T) { provider := env.NewSignatureSchemeWithFunds() providerAddr := provider.Address() - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) cAgentID := coretypes.NewAgentIDFromContractID(cID) @@ -181,7 +181,7 @@ func TestRevokeWarrant(t *testing.T) { require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-600-2) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-2) ret, err := chain.CallView("micropay", FuncGetChannelInfo, ParamPayerAddress, payerAddr, @@ -248,7 +248,7 @@ func TestPayment(t *testing.T) { payer, payerPubKey := env.NewSignatureSchemeWithFundsAndPubKey() payerAddr := payer.Address() - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo) req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, @@ -258,7 +258,7 @@ func TestPayment(t *testing.T) { provider := env.NewSignatureSchemeWithFunds() providerAddr := provider.Address() - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo) req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). @@ -269,7 +269,7 @@ func TestPayment(t *testing.T) { cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) cAgentID := coretypes.NewAgentIDFromContractID(cID) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) - env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Supply-600-2) + env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-2) res, err := chain.CallView("micropay", FuncGetChannelInfo, ParamPayerAddress, payerAddr, @@ -300,7 +300,7 @@ func TestPayment(t *testing.T) { _, err = chain.PostRequest(req, provider) require.NoError(t, err) - env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Supply+42+41-1) + env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo+42+41-1) res, err = chain.CallView("micropay", FuncGetChannelInfo, ParamPayerAddress, payerAddr, diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go index 8691022a38..cf47722616 100644 --- a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go +++ b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go @@ -64,7 +64,7 @@ func TestDonateOnce(t *testing.T) { require.EqualValues(t, 42, tot) // 42 iota transferred from wallet to contract plus 1 used for transaction - chain.Env.AssertAddressBalance(donator1.Address(), balance.ColorIOTA, solo.Supply-42-1) + chain.Env.AssertAddressBalance(donator1.Address(), balance.ColorIOTA, solo.Saldo-42-1) // 42 iota transferred to contract chain.AssertAccountBalance(common.ContractAccount, balance.ColorIOTA, 42) // returned 1 used for transaction to wallet account @@ -103,9 +103,9 @@ func TestDonateTwice(t *testing.T) { require.EqualValues(t, 42+69, tot) // 42 iota transferred from wallet to contract plus 1 used for transaction - chain.Env.AssertAddressBalance(donator1.Address(), balance.ColorIOTA, solo.Supply-42-1) + chain.Env.AssertAddressBalance(donator1.Address(), balance.ColorIOTA, solo.Saldo-42-1) // 69 iota transferred from wallet to contract plus 1 used for transaction - chain.Env.AssertAddressBalance(donator2.Address(), balance.ColorIOTA, solo.Supply-69-1) + chain.Env.AssertAddressBalance(donator2.Address(), balance.ColorIOTA, solo.Saldo-69-1) // 42+69 iota transferred to contract chain.AssertAccountBalance(common.ContractAccount, balance.ColorIOTA, 42+69) // returned 1 used for transaction to wallet accounts diff --git a/contracts/rust/erc20/test/fun_test.go b/contracts/rust/erc20/test/fun_test.go index 60f821a3ac..9f5876deb1 100644 --- a/contracts/rust/erc20/test/fun_test.go +++ b/contracts/rust/erc20/test/fun_test.go @@ -20,7 +20,7 @@ func deployErc20(t *testing.T) *solo.Chain { creator = env.NewSignatureSchemeWithFunds() creatorAgentID = coretypes.NewAgentIDFromAddress(creator.Address()) err := chain.DeployWasmContract(nil, ScName, erc20file, - ParamSupply, solo.Supply, + ParamSupply, solo.Saldo, ParamCreator, creatorAgentID, ) require.NoError(t, err) @@ -32,9 +32,9 @@ func deployErc20(t *testing.T) *solo.Chain { sup, ok, err := codec.DecodeInt64(res.MustGet(ParamSupply)) require.NoError(t, err) require.True(t, ok) - require.EqualValues(t, sup, solo.Supply) + require.EqualValues(t, sup, solo.Saldo) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) return chain } @@ -79,7 +79,7 @@ func TestTransferOk1(t *testing.T) { _, err := chain.PostRequest(req, creator) require.NoError(t, err) - checkErc20Balance(chain, creatorAgentID, solo.Supply-amount) + checkErc20Balance(chain, creatorAgentID, solo.Saldo-amount) checkErc20Balance(chain, userAgentID, amount) } @@ -97,7 +97,7 @@ func TestTransferOk2(t *testing.T) { _, err := chain.PostRequest(req, creator) require.NoError(t, err) - checkErc20Balance(chain, creatorAgentID, solo.Supply-amount) + checkErc20Balance(chain, creatorAgentID, solo.Saldo-amount) checkErc20Balance(chain, userAgentID, amount) req = solo.NewCallParams(ScName, FuncTransfer, @@ -107,7 +107,7 @@ func TestTransferOk2(t *testing.T) { _, err = chain.PostRequest(req, user) require.NoError(t, err) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) } @@ -118,7 +118,7 @@ func TestTransferNotEnoughFunds1(t *testing.T) { userAgentID := coretypes.NewAgentIDFromAddress(user.Address()) amount := int64(1338) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) req := solo.NewCallParams(ScName, FuncTransfer, @@ -128,7 +128,7 @@ func TestTransferNotEnoughFunds1(t *testing.T) { _, err := chain.PostRequest(req, creator) require.Error(t, err) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) } @@ -139,7 +139,7 @@ func TestTransferNotEnoughFunds2(t *testing.T) { userAgentID := coretypes.NewAgentIDFromAddress(user.Address()) amount := int64(1338) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) req := solo.NewCallParams(ScName, FuncTransfer, @@ -149,7 +149,7 @@ func TestTransferNotEnoughFunds2(t *testing.T) { _, err := chain.PostRequest(req, user) require.Error(t, err) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) } @@ -173,7 +173,7 @@ func TestApprove(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) } @@ -190,7 +190,7 @@ func TestTransferFromOk1(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) req = solo.NewCallParams(ScName, FuncTransferFrom, @@ -202,7 +202,7 @@ func TestTransferFromOk1(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 50) - checkErc20Balance(chain, creatorAgentID, solo.Supply-50) + checkErc20Balance(chain, creatorAgentID, solo.Saldo-50) checkErc20Balance(chain, userAgentID, 50) } @@ -219,7 +219,7 @@ func TestTransferFromOk2(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) req = solo.NewCallParams(ScName, FuncTransferFrom, @@ -231,7 +231,7 @@ func TestTransferFromOk2(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 0) - checkErc20Balance(chain, creatorAgentID, solo.Supply-100) + checkErc20Balance(chain, creatorAgentID, solo.Saldo-100) checkErc20Balance(chain, userAgentID, 100) } @@ -248,7 +248,7 @@ func TestTransferFromFail(t *testing.T) { require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) req = solo.NewCallParams(ScName, FuncTransferFrom, @@ -260,6 +260,6 @@ func TestTransferFromFail(t *testing.T) { require.Error(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) - checkErc20Balance(chain, creatorAgentID, solo.Supply) + checkErc20Balance(chain, creatorAgentID, solo.Saldo) checkErc20Balance(chain, userAgentID, 0) } diff --git a/contracts/rust/fairauction/test/fairauction_test.go b/contracts/rust/fairauction/test/fairauction_test.go index fc3983ef62..6c46d4d079 100644 --- a/contracts/rust/fairauction/test/fairauction_test.go +++ b/contracts/rust/fairauction/test/fairauction_test.go @@ -28,7 +28,7 @@ func setupTest(t *testing.T) *solo.Chain { auctioneer = chain.Env.NewSignatureSchemeWithFunds() newColor, err := chain.Env.MintTokens(auctioneer, 10) require.NoError(t, err) - chain.Env.AssertAddressBalance(auctioneer.Address(), balance.ColorIOTA, solo.Supply-10) + chain.Env.AssertAddressBalance(auctioneer.Address(), balance.ColorIOTA, solo.Saldo-10) chain.Env.AssertAddressBalance(auctioneer.Address(), newColor, 10) tokenColor = newColor @@ -60,7 +60,7 @@ func TestFaStartAuction(t *testing.T) { chain.AssertAccountBalance(common.ContractAccount, tokenColor, 10) // auctioneer sent 25 deposit + 10 tokenColor + used 1 for request - chain.Env.AssertAddressBalance(auctioneer.Address(), balance.ColorIOTA, solo.Supply-35-1) + chain.Env.AssertAddressBalance(auctioneer.Address(), balance.ColorIOTA, solo.Saldo-35-1) // 1 used for request was sent back to auctioneer's account on chain account := coretypes.NewAgentIDFromSigScheme(auctioneer) chain.AssertAccountBalance(account, balance.ColorIOTA, 1) diff --git a/packages/solo/examples/example_test.go b/packages/solo/examples/example_test.go index 0bf5313658..df21389da5 100644 --- a/packages/solo/examples/example_test.go +++ b/packages/solo/examples/example_test.go @@ -30,7 +30,7 @@ func TestExample2(t *testing.T) { t.Logf("Address of the userWallet is: %s", userAddress) numIotas := env.GetAddressBalance(userAddress, balance.ColorIOTA) t.Logf("balance of the userWallet is: %d iota", numIotas) - env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Saldo) } func TestExample3(t *testing.T) { diff --git a/packages/solo/solo.go b/packages/solo/solo.go index b8fe1feeb8..f6a3a1e87e 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -36,9 +36,9 @@ import ( // DefaultTimeStep is a default step for the logical clock for each PostRequest call. const DefaultTimeStep = 1 * time.Millisecond -// default supply of tokens returned by the UTXODB faucet +// Saldo is the default amount of tokens returned by the UTXODB faucet // which is therefore the amount returned by NewSignatureSchemeWithFunds() and such -const Supply = 1337 +const Saldo = 1337 // Solo is a structure which contains global parameters of the test: one per test instance type Solo struct { @@ -148,17 +148,17 @@ func New(t *testing.T, debug bool, printStackTrace bool) *Solo { // NewChain deploys new chain instance. // -// If 'chainOriginator' is nil, new one is generated and solo.Supply (=1337) iotas are loaded from the UTXODB faucet. -// If 'validatorFeeTarget' is skipped, it is assumed equal to OriginatorAgentID +// If 'chainOriginator' is nil, new one is generated and solo.Saldo (=1337) iotas are loaded from the UTXODB faucet. +// If 'validatorFeeTarget' is skipped, it is assumed equal to OriginatorAgentID // To deploy the chai instance the following steps are performed: -// - chain signature scheme (private key), chain address and chain ID are created -// - empty virtual state is initialized -// - origin transaction is created by the originator and added to the UTXODB -// - 'init' request transaction to the 'root' contract is created and added to UTXODB -// - backlog processing threads (goroutines) are started -// - VM processor cache is initialized -// - 'init' request is run by the VM. The 'root' contracts deploys the rest of the core contracts: -// 'blob', 'accountsc', 'chainlog' +// - chain signature scheme (private key), chain address and chain ID are created +// - empty virtual state is initialized +// - origin transaction is created by the originator and added to the UTXODB +// - 'init' request transaction to the 'root' contract is created and added to UTXODB +// - backlog processing threads (goroutines) are started +// - VM processor cache is initialized +// - 'init' request is run by the VM. The 'root' contracts deploys the rest of the core contracts: +// 'blob', 'accountsc', 'chainlog' // Upon return, the chain is fully functional to process requests func (env *Solo) NewChain(chainOriginator signaturescheme.SignatureScheme, name string, validatorFeeTarget ...coretypes.AgentID) *Chain { env.logger.Infof("deploying new chain '%s'", name) @@ -291,7 +291,7 @@ func (ch *Chain) collateBatch() []vm.RequestRefWithFreeTokens { return ret } -// batchLoop mimics leaders's behavior in the Wasp committee +// batchLoop mimics leader's behavior in the Wasp committee func (ch *Chain) batchLoop() { for { batch := ch.collateBatch() @@ -314,15 +314,17 @@ func (ch *Chain) backlogLen() int { return len(ch.backlog) } -// NewSignatureSchemeWithFunds generates new ed25519 signature scheme and requests funds -// (equal to solo.Supply (=1337) iotas) from the UTXODB faucet. +// NewSignatureSchemeWithFunds generates new ed25519 signature scheme +// and requests some tokens from the UTXODB faucet. +// The amount of tokens is equal to solo.Saldo (=1337) iotas func (env *Solo) NewSignatureSchemeWithFunds() signaturescheme.SignatureScheme { ret, _ := env.NewSignatureSchemeWithFundsAndPubKey() return ret } -// NewSignatureSchemeWithFundsAndPubKey generates new ed25519 signature scheme and requests funds -// (equal to solo.Supply (=1337) iotas) from the UTXODB faucet. +// NewSignatureSchemeWithFundsAndPubKey generates new ed25519 signature scheme +// and requests some tokens from the UTXODB faucet. +// The amount of tokens is equal to solo.Saldo (=1337) iotas // Returns signature scheme interface and public key in binary form func (env *Solo) NewSignatureSchemeWithFundsAndPubKey() (signaturescheme.SignatureScheme, []byte) { ret, pubKeyBytes := env.NewSignatureSchemeAndPubKey() diff --git a/packages/vm/core/testcore/sandbox_tests/2chains_test.go b/packages/vm/core/testcore/sandbox_tests/2chains_test.go index 0dff5fdbd2..d54dbf607e 100644 --- a/packages/vm/core/testcore/sandbox_tests/2chains_test.go +++ b/packages/vm/core/testcore/sandbox_tests/2chains_test.go @@ -27,7 +27,7 @@ func test2Chains(t *testing.T, w bool) { userWallet := env.NewSignatureSchemeWithFunds() userAddress := userWallet.Address() userAgentID := coretypes.NewAgentIDFromAddress(userAddress) - env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Supply) + env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Saldo) chain1.AssertAccountBalance(contractAgentID1, balance.ColorIOTA, 0) chain1.AssertAccountBalance(contractAgentID2, balance.ColorIOTA, 0) @@ -45,7 +45,7 @@ func test2Chains(t *testing.T, w bool) { accountsAgentID1 := coretypes.NewAgentIDFromContractID(accounts.Interface.ContractID(chain1.ChainID)) accountsAgentID2 := coretypes.NewAgentIDFromContractID(accounts.Interface.ContractID(chain2.ChainID)) - env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Supply-43) + env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Saldo-43) chain1.AssertAccountBalance(userAgentID, balance.ColorIOTA, 1) chain2.AssertAccountBalance(userAgentID, balance.ColorIOTA, 0) chain1.AssertAccountBalance(contractAgentID1, balance.ColorIOTA, 0) @@ -69,7 +69,7 @@ func test2Chains(t *testing.T, w bool) { chain1.WaitForEmptyBacklog() chain2.WaitForEmptyBacklog() - env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Supply-47) + env.AssertAddressBalance(userAddress, balance.ColorIOTA, solo.Saldo-47) chain1.AssertAccountBalance(userAgentID, balance.ColorIOTA, 1) chain2.AssertAccountBalance(userAgentID, balance.ColorIOTA, 1) chain1.AssertAccountBalance(contractAgentID1, balance.ColorIOTA, 0) diff --git a/packages/vm/core/testcore/sandbox_tests/eventlog_test.go b/packages/vm/core/testcore/sandbox_tests/eventlog_test.go index cdd5ab83e1..062a6eeb14 100644 --- a/packages/vm/core/testcore/sandbox_tests/eventlog_test.go +++ b/packages/vm/core/testcore/sandbox_tests/eventlog_test.go @@ -144,7 +144,7 @@ func testChainLogGetNumRecords(t *testing.T, w bool) { req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, solo.Supply, + test_sandbox_sc.VarCounter, solo.Saldo, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) @@ -167,7 +167,7 @@ func testChainLogGetNumRecords(t *testing.T, w bool) { require.EqualValues(t, 2, strings.Count(str, "[req]")) require.EqualValues(t, 1, strings.Count(str, "[GenericData]")) require.EqualValues(t, 0, strings.Count(str, "[Event]")) - require.EqualValues(t, 1, strings.Count(str, strconv.FormatInt(solo.Supply, 10))) + require.EqualValues(t, 1, strings.Count(str, strconv.FormatInt(solo.Saldo, 10))) } func TestChainLogSandboxDeploy(t *testing.T) { run2(t, testChainLogSandboxDeploy) } From db3cb097570b348bcb1a13b556771a8b0ffb28cc Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Tue, 16 Feb 2021 10:18:33 -0800 Subject: [PATCH 02/39] Renamed common.DeployContract to StartChainAndDeployWasmContractByName --- contracts/common/deploy.go | 2 +- contracts/rust/dividend/test/dividend_test.go | 4 ++-- .../test/donatewithfeedback_test.go | 4 ++-- contracts/rust/fairauction/test/fairauction_test.go | 11 +++++------ contracts/rust/fairroulette/test/fairroulette_test.go | 4 ++-- contracts/rust/helloworld/test/helloworld_test.go | 4 ++-- contracts/rust/inccounter/test/inccounter_test.go | 6 +++--- contracts/rust/testcore/test/testcore_test.go | 4 ++-- .../rust/tokenregistry/test/tokenregistry_test.go | 4 ++-- 9 files changed, 21 insertions(+), 22 deletions(-) diff --git a/contracts/common/deploy.go b/contracts/common/deploy.go index 3674d96891..992d39f332 100644 --- a/contracts/common/deploy.go +++ b/contracts/common/deploy.go @@ -22,7 +22,7 @@ var ( CreatorWallet signaturescheme.SignatureScheme ) -func DeployContract(t *testing.T, scName string) *solo.Chain { +func StartChainAndDeployWasmContractByName(t *testing.T, scName string) *solo.Chain { wasmhost.HostTracing = TraceHost env := solo.New(t, Debug, StackTrace) CreatorWallet = env.NewSignatureSchemeWithFunds() diff --git a/contracts/rust/dividend/test/dividend_test.go b/contracts/rust/dividend/test/dividend_test.go index 9701ec2fbd..74e9bf17e5 100644 --- a/contracts/rust/dividend/test/dividend_test.go +++ b/contracts/rust/dividend/test/dividend_test.go @@ -11,11 +11,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go index cf47722616..651fa118b7 100644 --- a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go +++ b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go @@ -14,11 +14,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } diff --git a/contracts/rust/fairauction/test/fairauction_test.go b/contracts/rust/fairauction/test/fairauction_test.go index 6c46d4d079..b320f62d4a 100644 --- a/contracts/rust/fairauction/test/fairauction_test.go +++ b/contracts/rust/fairauction/test/fairauction_test.go @@ -12,7 +12,6 @@ import ( "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/kv/dict" "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/wasmlib" "github.com/stretchr/testify/require" "testing" "time" @@ -22,7 +21,7 @@ var auctioneer signaturescheme.SignatureScheme var tokenColor balance.Color func setupTest(t *testing.T) *solo.Chain { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) // set up auctioneer account and mint some tokens to auction off auctioneer = chain.Env.NewSignatureSchemeWithFunds() @@ -47,7 +46,7 @@ func setupTest(t *testing.T) *solo.Chain { } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } @@ -140,21 +139,21 @@ func TestFaOneBid(t *testing.T) { requireAgent(t, res, VarHighestBidder, coretypes.NewAgentIDFromSigScheme(bidder)) } -func requireAgent(t *testing.T, res dict.Dict, key wasmlib.Key, expected coretypes.AgentID) { +func requireAgent(t *testing.T, res dict.Dict, key string, expected coretypes.AgentID) { actual, exists, err := codec.DecodeAgentID(res.MustGet(kv.Key(key))) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, expected, actual) } -func requireInt64(t *testing.T, res dict.Dict, key wasmlib.Key, expected int64) { +func requireInt64(t *testing.T, res dict.Dict, key string, expected int64) { actual, exists, err := codec.DecodeInt64(res.MustGet(kv.Key(key))) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, expected, actual) } -func requireString(t *testing.T, res dict.Dict, key wasmlib.Key, expected string) { +func requireString(t *testing.T, res dict.Dict, key string, expected string) { actual, exists, err := codec.DecodeString(res.MustGet(kv.Key(key))) require.NoError(t, err) require.True(t, exists) diff --git a/contracts/rust/fairroulette/test/fairroulette_test.go b/contracts/rust/fairroulette/test/fairroulette_test.go index e71cc71ddb..fc163d0d35 100644 --- a/contracts/rust/fairroulette/test/fairroulette_test.go +++ b/contracts/rust/fairroulette/test/fairroulette_test.go @@ -11,11 +11,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } diff --git a/contracts/rust/helloworld/test/helloworld_test.go b/contracts/rust/helloworld/test/helloworld_test.go index a62be6fe7d..ec700a2c7a 100644 --- a/contracts/rust/helloworld/test/helloworld_test.go +++ b/contracts/rust/helloworld/test/helloworld_test.go @@ -12,11 +12,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } diff --git a/contracts/rust/inccounter/test/inccounter_test.go b/contracts/rust/inccounter/test/inccounter_test.go index 804ef8089c..0d0059d0ee 100644 --- a/contracts/rust/inccounter/test/inccounter_test.go +++ b/contracts/rust/inccounter/test/inccounter_test.go @@ -13,17 +13,17 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } func TestStateAfterDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) checkStateCounter(t, chain, nil) } diff --git a/contracts/rust/testcore/test/testcore_test.go b/contracts/rust/testcore/test/testcore_test.go index e71cc71ddb..fc163d0d35 100644 --- a/contracts/rust/testcore/test/testcore_test.go +++ b/contracts/rust/testcore/test/testcore_test.go @@ -11,11 +11,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } diff --git a/contracts/rust/tokenregistry/test/tokenregistry_test.go b/contracts/rust/tokenregistry/test/tokenregistry_test.go index e71cc71ddb..fc163d0d35 100644 --- a/contracts/rust/tokenregistry/test/tokenregistry_test.go +++ b/contracts/rust/tokenregistry/test/tokenregistry_test.go @@ -11,11 +11,11 @@ import ( ) func setupTest(t *testing.T) *solo.Chain { - return common.DeployContract(t, ScName) + return common.StartChainAndDeployWasmContractByName(t, ScName) } func TestDeploy(t *testing.T) { - chain := common.DeployContract(t, ScName) + chain := common.StartChainAndDeployWasmContractByName(t, ScName) _, err := chain.FindContract(ScName) require.NoError(t, err) } From d62c4a63eaa5fd3e321fd976533276d0241c68e3 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Tue, 16 Feb 2021 10:19:46 -0800 Subject: [PATCH 03/39] Removed experimental TinyGo code --- packages/vm/wasmclient/host.go | 89 ----- packages/vm/wasmhost/wasmgovm.go | 60 --- packages/vm/wasmlib/bytes.go | 146 -------- packages/vm/wasmlib/context.go | 357 ------------------ packages/vm/wasmlib/corecontracts.go | 53 --- packages/vm/wasmlib/exports.go | 44 --- packages/vm/wasmlib/hashtypes.go | 280 -------------- packages/vm/wasmlib/host.go | 81 ---- packages/vm/wasmlib/immutable.go | 406 -------------------- packages/vm/wasmlib/keys.go | 62 ---- packages/vm/wasmlib/mutable.go | 529 --------------------------- 11 files changed, 2107 deletions(-) delete mode 100644 packages/vm/wasmclient/host.go delete mode 100644 packages/vm/wasmhost/wasmgovm.go delete mode 100644 packages/vm/wasmlib/bytes.go delete mode 100644 packages/vm/wasmlib/context.go delete mode 100644 packages/vm/wasmlib/corecontracts.go delete mode 100644 packages/vm/wasmlib/exports.go delete mode 100644 packages/vm/wasmlib/hashtypes.go delete mode 100644 packages/vm/wasmlib/host.go delete mode 100644 packages/vm/wasmlib/immutable.go delete mode 100644 packages/vm/wasmlib/keys.go delete mode 100644 packages/vm/wasmlib/mutable.go diff --git a/packages/vm/wasmclient/host.go b/packages/vm/wasmclient/host.go deleted file mode 100644 index ae682a9c54..0000000000 --- a/packages/vm/wasmclient/host.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -// +build wasm - -package wasmclient - -import "github.com/iotaledger/wasp/packages/vm/wasmlib" - -//go:wasm-module wasplib -//export hostGetBytes -func hostGetBytes(objId int32, keyId int32, typeId int32, value *byte, size int32) int32 - -//go:wasm-module wasplib -//export hostGetKeyId -func hostGetKeyId(key *byte, size int32) int32 - -//go:wasm-module wasplib -//export hostGetObjectId -func hostGetObjectId(objId int32, keyId int32, typeId int32) int32 - -//go:wasm-module wasplib -//export hostSetBytes -func hostSetBytes(objId int32, keyId int32, typeId int32, value *byte, size int32) - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -// implements wasmlib.ScHost interface -type WasmVmHost struct{} - -func ConnectWasmHost() { - wasmlib.ConnectHost(WasmVmHost{}) -} - -func (w WasmVmHost) Exists(objId int32, keyId int32, typeId int32) bool { - // negative length (-1) means only test for existence - // returned size -1 indicates keyId not found (or error) - // this removes the need for a separate hostExists function - return hostGetBytes(objId, keyId, typeId, nil, -1) >= 0 -} - -func (w WasmVmHost) GetBytes(objId int32, keyId int32, typeId int32) []byte { - // first query expected length of bytes array - size := hostGetBytes(objId, keyId, typeId, nil, 0) - if size <= 0 { - return []byte(nil) - } - - // allocate a byte array in Wasm memory and - // copy the actual data bytes to Wasm byte array - bytes := make([]byte, size) - hostGetBytes(objId, keyId, typeId, &bytes[0], size) - return bytes -} - -func (w WasmVmHost) GetKeyIdFromBytes(bytes []byte) int32 { - size := int32(len(bytes)) - // &bytes[0] will panic on zero length slice, so use nil instead - // negative size indicates this was from bytes - if size == 0 { - return hostGetKeyId(nil, -1) - } - return hostGetKeyId(&bytes[0], -size-1) -} - -func (w WasmVmHost) GetKeyIdFromString(key string) int32 { - bytes := []byte(key) - size := int32(len(bytes)) - // &bytes[0] will panic on zero length slice, so use nil instead - // non-negative size indicates this was from string - if size == 0 { - return hostGetKeyId(nil, 0) - } - return hostGetKeyId(&bytes[0], size) -} - -func (w WasmVmHost) GetObjectId(objId int32, keyId int32, typeId int32) int32 { - return hostGetObjectId(objId, keyId, typeId) -} - -func (w WasmVmHost) SetBytes(objId int32, keyId int32, typeId int32, value []byte) { - // &bytes[0] will panic on zero length slice, so use nil instead - size := int32(len(value)) - if size == 0 { - hostSetBytes(objId, keyId, typeId, nil, size) - return - } - hostSetBytes(objId, keyId, typeId, &value[0], size) -} diff --git a/packages/vm/wasmhost/wasmgovm.go b/packages/vm/wasmhost/wasmgovm.go deleted file mode 100644 index 7393330fcf..0000000000 --- a/packages/vm/wasmhost/wasmgovm.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmhost - -import ( - "errors" - "github.com/iotaledger/wasp/packages/vm/wasmlib" - "strings" -) - -type WasmGoVM struct { - WasmVmBase - contract string - onLoad map[string]func() -} - -func NewWasmGoVM(onLoad map[string]func()) *WasmGoVM { - vm := &WasmGoVM{} - vm.onLoad = onLoad - return vm -} - -func (vm *WasmGoVM) LinkHost(impl WasmVM, host *WasmHost) error { - vm.WasmVmBase.LinkHost(impl, host) - wasmlib.ConnectHost(host) - return nil -} - -func (vm *WasmGoVM) LoadWasm(wasmData []byte) error { - contract := string(wasmData) - if !strings.HasPrefix(contract, "go:") { - return errors.New("WasmGoVM: not a Go contract: " + contract) - } - vm.contract = contract[3:] - onLoad, ok := vm.onLoad[vm.contract] - if !ok { - return errors.New("WasmGoVM: unknown contract: " + vm.contract) - } - onLoad() - return nil -} - -func (vm *WasmGoVM) RunFunction(functionName string) error { - // already ran on_load in LoadWasm, other functions are not supported - if functionName != "on_load" { - return errors.New("WasmGoVM: cannot run function: " + functionName) - } - return nil -} - -func (vm *WasmGoVM) RunScFunction(index int32) error { - wasmlib.ScCallEntrypoint(index) - return nil -} - -func (vm *WasmGoVM) UnsafeMemory() []byte { - // no need to communicate through Wasm mem pool - return nil -} diff --git a/packages/vm/wasmlib/bytes.go b/packages/vm/wasmlib/bytes.go deleted file mode 100644 index 7f0463dfc8..0000000000 --- a/packages/vm/wasmlib/bytes.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -type BytesDecoder struct { - data []byte -} - -func NewBytesDecoder(data []byte) *BytesDecoder { - return &BytesDecoder{data: data} -} - -func (d *BytesDecoder) Address() *ScAddress { - return NewScAddressFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) AgentId() *ScAgentId { - return NewScAgentIdFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) Bytes() []byte { - size := d.Int() - if len(d.data) < int(size) { - panic("Cannot decode bytes") - } - value := d.data[:size] - d.data = d.data[size:] - return value -} - -func (d *BytesDecoder) ChainId() *ScChainId { - return NewScChainIdFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) Color() *ScColor { - return NewScColorFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) ContractId() *ScContractId { - return NewScContractIdFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) Hash() *ScHash { - return NewScHashFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) Hname() ScHname { - return NewScHnameFromBytes(d.Bytes()) -} - -func (d *BytesDecoder) Int() int64 { - // leb128 decoder - val := int64(0) - s := 0 - for { - b := int8(d.data[0]) - d.data = d.data[1:] - val |= int64(b&0x7f) << s - if b >= 0 { - if int8(val>>s)&0x7f != b&0x7f { - panic("Integer too large") - } - // extend int7 sign to int8 - if (b & 0x40) != 0 { - b |= -0x80 - } - // extend int8 sign to int64 - return val | (int64(b) << s) - } - s += 7 - if s >= 64 { - panic("integer representation too long") - } - } -} - -func (d *BytesDecoder) String() string { - return string(d.Bytes()) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type BytesEncoder struct { - data []byte -} - -func NewBytesEncoder() *BytesEncoder { - return &BytesEncoder{data: make([]byte, 0, 128)} -} - -func (e *BytesEncoder) Address(value *ScAddress) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) AgentId(value *ScAgentId) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) Bytes(value []byte) *BytesEncoder { - e.Int(int64(len(value))) - e.data = append(e.data, value...) - return e -} - -func (e *BytesEncoder) ChainId(value *ScChainId) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) Color(value *ScColor) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) ContractId(value *ScContractId) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) Data() []byte { - return e.data -} - -func (e *BytesEncoder) Hash(value *ScHash) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) Hname(value ScHname) *BytesEncoder { - return e.Bytes(value.Bytes()) -} - -func (e *BytesEncoder) Int(value int64) *BytesEncoder { - // leb128 encoder - for { - b := byte(value) - s := b & 0x40 - value >>= 7 - if (value == 0 && s == 0) || (value == -1 && s != 0) { - e.data = append(e.data, b&0x7f) - return e - } - e.data = append(e.data, b|0x80) - } -} - -func (e *BytesEncoder) String(value string) *BytesEncoder { - return e.Bytes([]byte(value)) -} diff --git a/packages/vm/wasmlib/context.go b/packages/vm/wasmlib/context.go deleted file mode 100644 index 814b8fd645..0000000000 --- a/packages/vm/wasmlib/context.go +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -// encapsulates standard host entities into a simple interface - -package wasmlib - -import ( - "strconv" -) - -type PostRequestParams struct { - ContractId *ScContractId - Function ScHname - Params *ScMutableMap - Transfer balances - Delay int64 -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type balances interface { - mapId() int32 -} - -// used to retrieve any information that is related to colored token balances -type ScBalances struct { - balances ScImmutableMap -} - -// retrieve the balance for the specified token color -func (ctx ScBalances) Balance(color *ScColor) int64 { - return ctx.balances.GetInt(color).Value() -} - -// retrieve a list of all token colors that have a non-zero balance -func (ctx ScBalances) Colors() ScImmutableColorArray { - return ctx.balances.GetColorArray(KeyColor) -} - -// implements Balances interface -func (ctx ScBalances) mapId() int32 { - return ctx.balances.objId -} - -// retrieve the color of newly minted tokens -func (ctx ScBalances) Minted() *ScColor { - return NewScColorFromBytes(ctx.balances.GetBytes(MINT).Value()) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScTransfers struct { - transfers ScMutableMap -} - -// special constructor for simplifying single transfers -func NewScTransfer(color *ScColor, amount int64) ScTransfers { - balance := NewScTransfers() - balance.Add(color, amount) - return balance -} - -func NewScTransfers() ScTransfers { - return ScTransfers{transfers: *NewScMutableMap()} -} - -// implements Balances interface -func (ctx ScTransfers) mapId() int32 { - return ctx.transfers.objId -} - -// transfers the specified amount of tokens of the specified color -func (ctx ScTransfers) Add(color *ScColor, amount int64) { - ctx.transfers.GetInt(color).SetValue(amount) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScUtility struct { - utility ScMutableMap -} - -func (ctx ScUtility) AggregateBLSSignatures(pubKeys [][]byte, sigs [][]byte) ([]byte, []byte) { - encode := NewBytesEncoder() - encode.Int(int64(len(pubKeys))) - for _,pubKey := range pubKeys { - encode.Bytes(pubKey) - } - encode.Int(int64(len(sigs))) - for _, sig := range sigs { - encode.Bytes(sig) - } - aggregator := ctx.utility.GetBytes(KeyAggregateBls) - aggregator.SetValue(encode.Data()) - decode := NewBytesDecoder(aggregator.Value()) - return decode.Bytes(), decode.Bytes() -} - -// decodes the specified base58-encoded string value to its original bytes -func (ctx ScUtility) Base58Decode(value string) []byte { - ctx.utility.GetString(KeyBase58String).SetValue(value) - return ctx.utility.GetBytes(KeyBase58Bytes).Value() -} - -// encodes the specified bytes to a base-58-encoded string -func (ctx ScUtility) Base58Encode(value []byte) string { - ctx.utility.GetBytes(KeyBase58Bytes).SetValue(value) - return ctx.utility.GetString(KeyBase58String).Value() -} - -// hashes the specified value bytes using blake2b hashing and returns the resulting 32-byte hash -func (ctx ScUtility) HashBlake2b(value []byte) *ScHash { - hash := ctx.utility.GetBytes(KeyHashBlake2b) - hash.SetValue(value) - return NewScHashFromBytes(hash.Value()) -} - -// hashes the specified value bytes using sha3 hashing and returns the resulting 32-byte hash -func (ctx ScUtility) HashSha3(value []byte) *ScHash { - hash := ctx.utility.GetBytes(KeyHashSha3) - hash.SetValue(value) - return NewScHashFromBytes(hash.Value()) -} - -// hashes the specified value bytes using blake2b hashing and returns the resulting 32-byte hash -func (ctx ScUtility) Hname(value string) ScHname { - ctx.utility.GetString(KeyName).SetValue(value) - return ctx.utility.GetHname(KeyHname).Value() -} - -// generates a random value from 0 to max (exclusive max) using a deterministic RNG -func (ctx ScUtility) Random(max int64) int64 { - rnd := ctx.utility.GetInt(KeyRandom).Value() - return int64(uint64(rnd) % uint64(max)) -} - -// converts an integer to its string representation -func (ctx ScUtility) String(value int64) string { - return strconv.FormatInt(value, 10) -} - -func (ctx ScUtility) ValidBlsSignature(data []byte, pubKey []byte, signature []byte) bool { - bytes := NewBytesEncoder().Bytes(data).Bytes(pubKey).Bytes(signature).Data() - ctx.utility.GetBytes(KeyValidBls).SetValue(bytes) - return ctx.utility.GetInt(KeyValid).Value() != 0 -} - -func (ctx ScUtility) ValidED25519Signature(data []byte, pubKey []byte, signature []byte) bool { - bytes := NewBytesEncoder().Bytes(data).Bytes(pubKey).Bytes(signature).Data() - ctx.utility.GetBytes(KeyValidEd25519).SetValue(bytes) - return ctx.utility.GetInt(KeyValid).Value() != 0 -} - -// wrapper for simplified use by hashtypes -func base58Encode(bytes []byte) string { - return ScFuncContext{}.Utility().Base58Encode(bytes) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -// shared interface part of ScFuncContext and ScViewContext -type ScBaseContext struct { -} - -// access the current balances for all token colors -func (ctx ScBaseContext) Balances() ScBalances { - return ScBalances{Root.GetMap(KeyBalances).Immutable()} -} - -// retrieve the agent id of the owner of the chain this contract lives on -func (ctx ScBaseContext) ChainOwnerId() *ScAgentId { - return Root.GetAgentId(KeyChainOwnerId).Value() -} - -// retrieve the agent id of the creator of this contract -func (ctx ScBaseContext) ContractCreator() *ScAgentId { - return Root.GetAgentId(KeyContractCreator).Value() -} - -// retrieve the id of this contract -func (ctx ScBaseContext) ContractId() *ScContractId { - return Root.GetContractId(KeyContractId).Value() -} - -// logs informational text message -func (ctx ScBaseContext) Log(text string) { - Root.GetString(KeyLog).SetValue(text) -} - -// logs error text message and then panics -func (ctx ScBaseContext) Panic(text string) { - Root.GetString(KeyPanic).SetValue(text) -} - -// retrieve parameters passed to the smart contract function that was called -func (ctx ScBaseContext) Params() ScImmutableMap { - return Root.GetMap(KeyParams).Immutable() -} - -// panics if condition is not satisfied -func (ctx ScBaseContext) Require(cond bool, msg string) { - if !cond { - ctx.Panic(msg) - } -} - -// any results returned by the smart contract function call are returned here -func (ctx ScBaseContext) Results() ScMutableMap { - return Root.GetMap(KeyResults) -} - -// deterministic time stamp fixed at the moment of calling the smart contract -func (ctx ScBaseContext) Timestamp() int64 { - return Root.GetInt(KeyTimestamp).Value() -} - -// logs debugging trace text message -func (ctx ScBaseContext) Trace(text string) { - Root.GetString(KeyTrace).SetValue(text) -} - -// access diverse utility functions -func (ctx ScBaseContext) Utility() ScUtility { - return ScUtility{Root.GetMap(KeyUtility)} -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -// smart contract interface with mutable access to state -type ScFuncContext struct { - ScBaseContext -} - -//TODO parameter type checks - -// calls a smart contract function -func (ctx ScFuncContext) Call(hContract ScHname, hFunction ScHname, params *ScMutableMap, transfer balances) ScImmutableMap { - encode := NewBytesEncoder() - encode.Hname(hContract) - encode.Hname(hFunction) - if params != nil { - encode.Int(int64(params.objId)) - } else { - encode.Int(0) - } - if transfer != nil { - encode.Int(int64(transfer.mapId())) - } else { - encode.Int(0) - } - Root.GetBytes(KeyCall).SetValue(encode.Data()) - return Root.GetMap(KeyReturn).Immutable() -} - -// retrieve the agent id of the caller of the smart contract -func (ctx ScFuncContext) Caller() *ScAgentId { - return Root.GetAgentId(KeyCaller).Value() -} - -// calls a smart contract function on the current contract -func (ctx ScFuncContext) CallSelf(hFunction ScHname, params *ScMutableMap, transfer balances) ScImmutableMap { - return ctx.Call(ctx.ContractId().Hname(), hFunction, params, transfer) -} - -// deploys a smart contract -func (ctx ScFuncContext) Deploy(programHash *ScHash, name string, description string, params *ScMutableMap) { - encode := NewBytesEncoder() - encode.Hash(programHash) - encode.String(name) - encode.String(description) - if params != nil { - encode.Int(int64(params.objId)) - } else { - encode.Int(0) - } - Root.GetBytes(KeyDeploy).SetValue(encode.Data()) -} - -// signals an event on the node that external entities can subscribe to -func (ctx ScBaseContext) Event(text string) { - Root.GetString(KeyEvent).SetValue(text) -} - -// quick check to see if the caller of the smart contract was the specified originator agent -func (ctx ScFuncContext) From(originator *ScAgentId) bool { - return ctx.Caller().Equals(originator) -} - -// access the incoming balances for all token colors -func (ctx ScFuncContext) Incoming() ScBalances { - return ScBalances{Root.GetMap(KeyIncoming).Immutable()} -} - -// (delayed) posts a smart contract function -func (ctx ScFuncContext) Post(par *PostRequestParams) { - encode := NewBytesEncoder() - encode.ContractId(par.ContractId) - encode.Hname(par.Function) - if par.Params != nil { - encode.Int(int64(par.Params.objId)) - } else { - encode.Int(0) - } - if par.Transfer != nil { - encode.Int(int64(par.Transfer.mapId())) - } else { - encode.Int(0) - } - encode.Int(par.Delay) - Root.GetBytes(KeyPost).SetValue(encode.Data()) -} - -// access to mutable state storage -func (ctx ScFuncContext) State() ScMutableMap { - return Root.GetMap(KeyState) -} - -// transfer colored token amounts to the specified Tangle ledger address -func (ctx ScFuncContext) TransferToAddress(address *ScAddress, transfer balances) { - transfers := Root.GetMapArray(KeyTransfers) - tx := transfers.GetMap(transfers.Length()) - tx.GetAddress(KeyAddress).SetValue(address) - tx.GetInt(KeyBalances).SetValue(int64(transfer.mapId())) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -// smart contract interface with immutable access to state -type ScViewContext struct { - ScBaseContext -} - -// calls a smart contract function -func (ctx ScViewContext) Call(contract ScHname, function ScHname, params *ScMutableMap) ScImmutableMap { - encode := NewBytesEncoder() - encode.Hname(contract) - encode.Hname(function) - if params != nil { - encode.Int(int64(params.objId)) - } else { - encode.Int(0) - } - encode.Int(0) - Root.GetBytes(KeyCall).SetValue(encode.Data()) - return Root.GetMap(KeyReturn).Immutable() -} - -// calls a smart contract function on the current contract -func (ctx ScViewContext) CallSelf(function ScHname, params *ScMutableMap) ScImmutableMap { - return ctx.Call(ctx.ContractId().Hname(), function, params) -} - -// access to immutable state storage -func (ctx ScViewContext) State() ScImmutableMap { - return Root.GetMap(KeyState).Immutable() -} diff --git a/packages/vm/wasmlib/corecontracts.go b/packages/vm/wasmlib/corecontracts.go deleted file mode 100644 index 5dcce075ee..0000000000 --- a/packages/vm/wasmlib/corecontracts.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -const CoreAccounts = ScHname(0x3c4b5e02) -const CoreAccountsFuncDeposit = ScHname(0xbdc9102d) -const CoreAccountsFuncWithdrawToAddress = ScHname(0x26608cb5) -const CoreAccountsFuncWithdrawToChain = ScHname(0x437bc026) -const CoreAccountsViewAccounts = ScHname(0x3c4b5e02) -const CoreAccountsViewBalance = ScHname(0x84168cb4) -const CoreAccountsViewTotalAssets = ScHname(0xfab0f8d2) - -const CoreAccountsParamAgentID = Key("a") - -const CoreBlob = ScHname(0xfd91bc63) -const CoreBlobFuncStoreBlob = ScHname(0xddd4c281) -const CoreBlobViewGetBlobField = ScHname(0x1f448130) -const CoreBlobViewGetBlobInfo = ScHname(0xfde4ab46) -const CoreBlobViewListBlobs = ScHname(0x62ca7990) - -const CoreBlobParamField = Key("field") -const CoreBlobParamHash = Key("hash") - -const CoreEventlog = ScHname(0x661aa7d8) -const CoreEventlogViewGetNumRecords = ScHname(0x2f4b4a8c) -const CoreEventlogViewGetRecords = ScHname(0xd01a8085) - -const CoreEventlogParamContractHname = Key("contractHname") -const CoreEventlogParamFromTs = Key("fromTs") -const CoreEventlogParamMaxLastRecords = Key("maxLastRecords") -const CoreEventlogParamToTs = Key("toTs") - -const CoreRoot = ScHname(0xcebf5908) -const CoreRootFuncClaimChainOwnership = ScHname(0x03ff0fc0) -const CoreRootFuncDelegateChainOwnership = ScHname(0x93ecb6ad) -const CoreRootFuncDeployContract = ScHname(0x28232c27) -const CoreRootFuncGrantDeployPermission = ScHname(0xf440263a) -const CoreRootFuncRevokeDeployPermission = ScHname(0x850744f1) -const CoreRootFuncSetContractFee = ScHname(0x8421a42b) -const CoreRootFuncSetDefaultFee = ScHname(0x3310ecd0) -const CoreRootViewFindContract = ScHname(0xc145ca00) -const CoreRootViewGetChainInfo = ScHname(0x434477e2) -const CoreRootViewGetFeeInfo = ScHname(0x9fe54b48) - -const CoreRootParamChainOwner = Key("$$owner$$") -const CoreRootParamDeployer = Key("$$deployer$$") -const CoreRootParamDescription = Key("$$description$$") -const CoreRootParamHname = Key("$$hname$$") -const CoreRootParamName = Key("$$name$$") -const CoreRootParamOwnerFee = Key("$$ownerfee$$") -const CoreRootParamProgramHash = Key("$$proghash$$") -const CoreRootParamValidatorFee = Key("$$validatorfee$$") diff --git a/packages/vm/wasmlib/exports.go b/packages/vm/wasmlib/exports.go deleted file mode 100644 index d942eda756..0000000000 --- a/packages/vm/wasmlib/exports.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -var ( - funcs []func(ctx *ScFuncContext) - views []func(ctx *ScViewContext) -) - -//export on_call_entrypoint -func ScCallEntrypoint(index int32) { - if (index & 0x8000) != 0 { - views[index&0x7fff](&ScViewContext{}) - return - } - funcs[index](&ScFuncContext{}) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScExports struct { - exports ScMutableStringArray -} - -func NewScExports() ScExports { - exports := Root.GetStringArray(KeyExports) - // tell host what our highest predefined key is - // this helps detect missing or extra keys - exports.GetString(int32(KeyZzzzzzz)).SetValue("Go:KeyZzzzzzz") - return ScExports{exports: exports} -} - -func (ctx ScExports) AddFunc(name string, f func(ctx *ScFuncContext)) { - index := int32(len(funcs)) - funcs = append(funcs, f) - ctx.exports.GetString(index).SetValue(name) -} - -func (ctx ScExports) AddView(name string, f func(ctx *ScViewContext)) { - index := int32(len(views)) - views = append(views, f) - ctx.exports.GetString(index | 0x8000).SetValue(name) -} diff --git a/packages/vm/wasmlib/hashtypes.go b/packages/vm/wasmlib/hashtypes.go deleted file mode 100644 index 34e6dcec9b..0000000000 --- a/packages/vm/wasmlib/hashtypes.go +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -import ( - "encoding/binary" - "strconv" -) - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScAddress struct { - id [33]byte -} - -func NewScAddressFromBytes(bytes []byte) *ScAddress { - o := &ScAddress{} - if len(bytes) != len(o.id) { - logPanic("invalid address id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScAddress) AsAgentId() *ScAgentId { - a := &ScAgentId{} - // agent is address padded with zeroes - copy(a.id[:], o.id[:]) - return a -} - -func (o *ScAddress) Bytes() []byte { - return o.id[:] -} - -func (o *ScAddress) Equals(other *ScAddress) bool { - return o.id == other.id -} - -func (o *ScAddress) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScAddress) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScAgentId struct { - id [37]byte -} - -func NewScAgentIdFromBytes(bytes []byte) *ScAgentId { - o := &ScAgentId{} - if len(bytes) != len(o.id) { - logPanic("invalid agent id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScAgentId) Address() *ScAddress { - a := &ScAddress{} - copy(a.id[:], o.id[:]) - return a -} - -func (o *ScAgentId) Bytes() []byte { - return o.id[:] -} - -func (o *ScAgentId) Equals(other *ScAgentId) bool { - return o.id == other.id -} - -func (o *ScAgentId) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScAgentId) IsAddress() bool { - return o.Address().AsAgentId().Equals(o) -} - -func (o *ScAgentId) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScChainId struct { - id [33]byte -} - -func NewScChainIdFromBytes(bytes []byte) *ScChainId { - o := &ScChainId{} - if len(bytes) != len(o.id) { - logPanic("invalid chain id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScChainId) Bytes() []byte { - return o.id[:] -} - -func (o *ScChainId) Equals(other *ScChainId) bool { - return o.id == other.id -} - -func (o *ScChainId) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScChainId) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScColor struct { - id [32]byte -} - -var IOTA = &ScColor{} -var MINT = &ScColor{} - -func init() { - for i := range MINT.id { - MINT.id[i] = 0xff - } -} - -func NewScColorFromBytes(bytes []byte) *ScColor { - o := &ScColor{} - if len(bytes) != len(o.id) { - logPanic("invalid color id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScColor) Bytes() []byte { - return o.id[:] -} - -func (o *ScColor) Equals(other *ScColor) bool { - return o.id == other.id -} - -func (o *ScColor) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScColor) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScContractId struct { - id [37]byte -} - -func NewScContractId(chainId *ScChainId, hContract ScHname) *ScContractId { - o := &ScContractId{} - copy(o.id[:], chainId.Bytes()) - copy(o.id[33:], hContract.Bytes()) - return o -} - -func NewScContractIdFromBytes(bytes []byte) *ScContractId { - o := &ScContractId{} - if len(bytes) != len(o.id) { - logPanic("invalid contract id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScContractId) AsAgentId() *ScAgentId { - a := &ScAgentId{} - copy(a.id[:], o.id[:]) - return a -} - -func (o *ScContractId) Bytes() []byte { - return o.id[:] -} - -func (o *ScContractId) ChainId() *ScChainId { - c := &ScChainId{} - copy(c.id[:], o.id[:]) - return c -} - -func (o *ScContractId) Equals(other *ScContractId) bool { - return o.id == other.id -} - -func (o *ScContractId) Hname() ScHname { - return NewScHnameFromBytes(o.id[33:]) -} - -func (o *ScContractId) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScContractId) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScHash struct { - id [32]byte -} - -func NewScHashFromBytes(bytes []byte) *ScHash { - o := &ScHash{} - if len(bytes) != len(o.id) { - logPanic("invalid hash id length") - } - copy(o.id[:], bytes) - return o -} - -func (o *ScHash) Bytes() []byte { - return o.id[:] -} - -func (o *ScHash) Equals(other *ScHash) bool { - return o.id == other.id -} - -func (o *ScHash) KeyId() Key32 { - return GetKeyIdFromBytes(o.Bytes()) -} - -func (o *ScHash) String() string { - return base58Encode(o.id[:]) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScHname uint32 - -func NewScHname(name string) ScHname { - return ScFuncContext{}.Utility().Hname(name) -} - -func NewScHnameFromBytes(bytes []byte) ScHname { - return ScHname(binary.LittleEndian.Uint32(bytes)) -} - -func (hn ScHname) Bytes() []byte { - bytes := make([]byte, 4) - binary.LittleEndian.PutUint32(bytes, uint32(hn)) - return bytes -} - -func (hn ScHname) Equals(other ScHname) bool { - return hn == other -} - -func (hn ScHname) KeyId() Key32 { - return GetKeyIdFromBytes(hn.Bytes()) -} - -func (hn ScHname) String() string { - return strconv.FormatInt(int64(hn), 10) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -func logPanic(text string) { - ScBaseContext{}.Panic(text) -} diff --git a/packages/vm/wasmlib/host.go b/packages/vm/wasmlib/host.go deleted file mode 100644 index 9aa04635d6..0000000000 --- a/packages/vm/wasmlib/host.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -import "encoding/binary" - -const ( - // all TYPE_* values should exactly match the counterpart OBJTYPE_* values on the host! - TYPE_ARRAY int32 = 0x20 - - TYPE_ADDRESS int32 = 1 - TYPE_AGENT_ID int32 = 2 - TYPE_BYTES int32 = 3 - TYPE_CHAIN_ID int32 = 4 - TYPE_COLOR int32 = 5 - TYPE_CONTRACT_ID int32 = 6 - TYPE_HASH int32 = 7 - TYPE_HNAME int32 = 8 - TYPE_INT int32 = 9 - TYPE_MAP int32 = 10 - TYPE_STRING int32 = 11 -) - -var typeSizes = [...]int{0, 33, 37, 0, 33, 32, 37, 32, 4, 8, 0, 0} - -type ScHost interface { - Exists(objId int32, keyId int32, typeId int32) bool - GetBytes(objId int32, keyId int32, typeId int32) []byte - GetKeyIdFromBytes(bytes []byte) int32 - GetKeyIdFromString(key string) int32 - GetObjectId(objId int32, keyId int32, typeId int32) int32 - SetBytes(objId int32, keyId int32, typeId int32, value []byte) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -var host ScHost - -func ConnectHost(h ScHost) ScHost { - oldHost := host - host = h - return oldHost -} - -func Exists(objId int32, keyId Key32, typeId int32) bool { - return host.Exists(objId, int32(keyId), typeId) -} - -func GetBytes(objId int32, keyId Key32, typeId int32) []byte { - bytes := host.GetBytes(objId, int32(keyId), typeId) - if len(bytes) == 0 { - return make([]byte, typeSizes[typeId]) - } - return bytes -} - -func GetKeyIdFromBytes(bytes []byte) Key32 { - return Key32(host.GetKeyIdFromBytes(bytes)) -} - -func GetKeyIdFromString(key string) Key32 { - return Key32(host.GetKeyIdFromString(key)) -} - -func GetLength(objId int32) int32 { - return int32(binary.LittleEndian.Uint64(GetBytes(objId, KeyLength, TYPE_INT))) -} - -func GetObjectId(objId int32, keyId Key32, typeId int32) int32 { - return host.GetObjectId(objId, int32(keyId), typeId) -} - -func SetBytes(objId int32, keyId Key32, typeId int32, value []byte) { - host.SetBytes(objId, int32(keyId), typeId, value) -} - -func SetClear(objId int32) { - bytes := make([]byte, 8) - SetBytes(objId, KeyLength, TYPE_INT, bytes) -} diff --git a/packages/vm/wasmlib/immutable.go b/packages/vm/wasmlib/immutable.go deleted file mode 100644 index 084094026f..0000000000 --- a/packages/vm/wasmlib/immutable.go +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -import ( - "encoding/binary" - "strconv" -) - -type ScImmutableAddress struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableAddress) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_ADDRESS) -} - -func (o ScImmutableAddress) String() string { - return o.Value().String() -} - -func (o ScImmutableAddress) Value() *ScAddress { - return NewScAddressFromBytes(GetBytes(o.objId, o.keyId, TYPE_ADDRESS)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableAddressArray struct { - objId int32 -} - -func (o ScImmutableAddressArray) GetAddress(index int32) ScImmutableAddress { - return ScImmutableAddress{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableAddressArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableAgentId struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableAgentId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_AGENT_ID) -} - -func (o ScImmutableAgentId) String() string { - return o.Value().String() -} - -func (o ScImmutableAgentId) Value() *ScAgentId { - return NewScAgentIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_AGENT_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableAgentArray struct { - objId int32 -} - -func (o ScImmutableAgentArray) GetAgentId(index int32) ScImmutableAgentId { - return ScImmutableAgentId{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableAgentArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableBytes struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableBytes) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_BYTES) -} - -func (o ScImmutableBytes) String() string { - return base58Encode(o.Value()) -} - -func (o ScImmutableBytes) Value() []byte { - return GetBytes(o.objId, o.keyId, TYPE_BYTES) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableBytesArray struct { - objId int32 -} - -func (o ScImmutableBytesArray) GetBytes(index int32) ScImmutableBytes { - return ScImmutableBytes{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableBytesArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableChainId struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableChainId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_CHAIN_ID) -} - -func (o ScImmutableChainId) String() string { - return o.Value().String() -} - -func (o ScImmutableChainId) Value() *ScChainId { - return NewScChainIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_CHAIN_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableColor struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableColor) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_COLOR) -} - -func (o ScImmutableColor) String() string { - return o.Value().String() -} - -func (o ScImmutableColor) Value() *ScColor { - return NewScColorFromBytes(GetBytes(o.objId, o.keyId, TYPE_COLOR)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableColorArray struct { - objId int32 -} - -func (o ScImmutableColorArray) GetColor(index int32) ScImmutableColor { - return ScImmutableColor{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableColorArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableContractId struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableContractId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_CONTRACT_ID) -} - -func (o ScImmutableContractId) String() string { - return o.Value().String() -} - -func (o ScImmutableContractId) Value() *ScContractId { - return NewScContractIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_CONTRACT_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableHash struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableHash) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_HASH) -} - -func (o ScImmutableHash) String() string { - return o.Value().String() -} - -func (o ScImmutableHash) Value() *ScHash { - return NewScHashFromBytes(GetBytes(o.objId, o.keyId, TYPE_HASH)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableHashArray struct { - objId int32 -} - -func (o ScImmutableHashArray) GetHash(index int32) ScImmutableHash { - return ScImmutableHash{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableHashArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableHname struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableHname) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_HNAME) -} - -func (o ScImmutableHname) String() string { - return o.Value().String() -} - -func (o ScImmutableHname) Value() ScHname { - return NewScHnameFromBytes(GetBytes(o.objId, o.keyId, TYPE_HNAME)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableInt struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableInt) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_INT) -} - -func (o ScImmutableInt) String() string { - return strconv.FormatInt(o.Value(), 10) -} - -func (o ScImmutableInt) Value() int64 { - bytes := GetBytes(o.objId, o.keyId, TYPE_INT) - return int64(binary.LittleEndian.Uint64(bytes)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableIntArray struct { - objId int32 -} - -func (o ScImmutableIntArray) GetInt(index int32) ScImmutableInt { - return ScImmutableInt{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableIntArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableMap struct { - objId int32 -} - -func (o ScImmutableMap) GetAddress(key MapKey) ScImmutableAddress { - return ScImmutableAddress{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetAddressArray(key MapKey) ScImmutableAddressArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_ADDRESS|TYPE_ARRAY) - return ScImmutableAddressArray{objId: arrId} -} - -func (o ScImmutableMap) GetAgentId(key MapKey) ScImmutableAgentId { - return ScImmutableAgentId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetAgentIdArray(key MapKey) ScImmutableAgentArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_AGENT_ID|TYPE_ARRAY) - return ScImmutableAgentArray{objId: arrId} -} - -func (o ScImmutableMap) GetBytes(key MapKey) ScImmutableBytes { - return ScImmutableBytes{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetBytesArray(key MapKey) ScImmutableBytesArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_BYTES|TYPE_ARRAY) - return ScImmutableBytesArray{objId: arrId} -} - -func (o ScImmutableMap) GetChainId(key MapKey) ScImmutableChainId { - return ScImmutableChainId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetColor(key MapKey) ScImmutableColor { - return ScImmutableColor{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetColorArray(key MapKey) ScImmutableColorArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_COLOR|TYPE_ARRAY) - return ScImmutableColorArray{objId: arrId} -} - -func (o ScImmutableMap) GetContractId(key MapKey) ScImmutableContractId { - return ScImmutableContractId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetHash(key MapKey) ScImmutableHash { - return ScImmutableHash{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetHashArray(key MapKey) ScImmutableHashArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_HASH|TYPE_ARRAY) - return ScImmutableHashArray{objId: arrId} -} - -func (o ScImmutableMap) GetHname(key MapKey) ScImmutableHname { - return ScImmutableHname{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetInt(key MapKey) ScImmutableInt { - return ScImmutableInt{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetIntArray(key MapKey) ScImmutableIntArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_INT|TYPE_ARRAY) - return ScImmutableIntArray{objId: arrId} -} - -func (o ScImmutableMap) GetMap(key MapKey) ScImmutableMap { - mapId := GetObjectId(o.objId, key.KeyId(), TYPE_MAP) - return ScImmutableMap{objId: mapId} -} - -func (o ScImmutableMap) GetMapArray(key MapKey) ScImmutableMapArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_MAP|TYPE_ARRAY) - return ScImmutableMapArray{objId: arrId} -} - -func (o ScImmutableMap) GetString(key MapKey) ScImmutableString { - return ScImmutableString{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScImmutableMap) GetStringArray(key MapKey) ScImmutableStringArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_STRING|TYPE_ARRAY) - return ScImmutableStringArray{objId: arrId} -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableMapArray struct { - objId int32 -} - -func (o ScImmutableMapArray) GetMap(index int32) ScImmutableMap { - mapId := GetObjectId(o.objId, Key32(index), TYPE_MAP) - return ScImmutableMap{objId: mapId} -} - -func (o ScImmutableMapArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableString struct { - objId int32 - keyId Key32 -} - -func (o ScImmutableString) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_STRING) -} - -func (o ScImmutableString) String() string { - return o.Value() -} - -func (o ScImmutableString) Value() string { - bytes := GetBytes(o.objId, o.keyId, TYPE_STRING) - if bytes == nil { - return "" - } - return string(bytes) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScImmutableStringArray struct { - objId int32 -} - -func (o ScImmutableStringArray) GetString(index int32) ScImmutableString { - return ScImmutableString{objId: o.objId, keyId: Key32(index)} -} - -func (o ScImmutableStringArray) Length() int32 { - return GetLength(o.objId) -} diff --git a/packages/vm/wasmlib/keys.go b/packages/vm/wasmlib/keys.go deleted file mode 100644 index b83a3a31b0..0000000000 --- a/packages/vm/wasmlib/keys.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -type MapKey interface { - KeyId() Key32 -} - -type Key string - -func (key Key) KeyId() Key32 { - return GetKeyIdFromString(string(key)) -} - -type Key32 int32 - -func (key Key32) KeyId() Key32 { - return key -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -const ( - KeyAddress = Key32(-1) - KeyAggregateBls = Key32(-2) - KeyBalances = Key32(-3) - KeyBase58Bytes = Key32(-4) - KeyBase58String = Key32(-5) - KeyCall = Key32(-6) - KeyCaller = Key32(-7) - KeyChainOwnerId = Key32(-8) - KeyColor = Key32(-9) - KeyContractCreator = Key32(-10) - KeyContractId = Key32(-11) - KeyDeploy = Key32(-12) - KeyEvent = Key32(-13) - KeyExports = Key32(-14) - KeyHashBlake2b = Key32(-15) - KeyHashSha3 = Key32(-16) - KeyHname = Key32(-17) - KeyIncoming = Key32(-18) - KeyLength = Key32(-19) - KeyLog = Key32(-20) - KeyMaps = Key32(-21) - KeyName = Key32(-22) - KeyPanic = Key32(-23) - KeyParams = Key32(-24) - KeyPost = Key32(-25) - KeyRandom = Key32(-26) - KeyResults = Key32(-27) - KeyReturn = Key32(-28) - KeyState = Key32(-29) - KeyTimestamp = Key32(-30) - KeyTrace = Key32(-31) - KeyTransfers = Key32(-32) - KeyUtility = Key32(-33) - KeyValid = Key32(-34) - KeyValidBls = Key32(-35) - KeyValidEd25519 = Key32(-36) - KeyZzzzzzz = Key32(-37) -) diff --git a/packages/vm/wasmlib/mutable.go b/packages/vm/wasmlib/mutable.go deleted file mode 100644 index 20e6964063..0000000000 --- a/packages/vm/wasmlib/mutable.go +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package wasmlib - -import ( - "encoding/binary" - "strconv" -) - -var Root = ScMutableMap{objId: 1} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableAddress struct { - objId int32 - keyId Key32 -} - -func (o ScMutableAddress) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_ADDRESS) -} - -func (o ScMutableAddress) SetValue(value *ScAddress) { - SetBytes(o.objId, o.keyId, TYPE_ADDRESS, value.Bytes()) -} - -func (o ScMutableAddress) String() string { - return o.Value().String() -} - -func (o ScMutableAddress) Value() *ScAddress { - return NewScAddressFromBytes(GetBytes(o.objId, o.keyId, TYPE_ADDRESS)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableAddressArray struct { - objId int32 -} - -func (o ScMutableAddressArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableAddressArray) GetAddress(index int32) ScMutableAddress { - return ScMutableAddress{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableAddressArray) Immutable() ScImmutableAddressArray { - return ScImmutableAddressArray{objId: o.objId} -} - -func (o ScMutableAddressArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableAgentId struct { - objId int32 - keyId Key32 -} - -func (o ScMutableAgentId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_AGENT_ID) -} - -func (o ScMutableAgentId) SetValue(value *ScAgentId) { - SetBytes(o.objId, o.keyId, TYPE_AGENT_ID, value.Bytes()) -} - -func (o ScMutableAgentId) String() string { - return o.Value().String() -} - -func (o ScMutableAgentId) Value() *ScAgentId { - return NewScAgentIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_AGENT_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableAgentArray struct { - objId int32 -} - -func (o ScMutableAgentArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableAgentArray) GetAgentId(index int32) ScMutableAgentId { - return ScMutableAgentId{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableAgentArray) Immutable() ScImmutableAgentArray { - return ScImmutableAgentArray{objId: o.objId} -} - -func (o ScMutableAgentArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableBytes struct { - objId int32 - keyId Key32 -} - -func (o ScMutableBytes) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_BYTES) -} - -func (o ScMutableBytes) SetValue(value []byte) { - SetBytes(o.objId, o.keyId, TYPE_BYTES, value) -} - -func (o ScMutableBytes) String() string { - return base58Encode(o.Value()) -} - -func (o ScMutableBytes) Value() []byte { - return GetBytes(o.objId, o.keyId, TYPE_BYTES) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableBytesArray struct { - objId int32 -} - -func (o ScMutableBytesArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableBytesArray) GetBytes(index int32) ScMutableBytes { - return ScMutableBytes{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableBytesArray) Immutable() ScImmutableBytesArray { - return ScImmutableBytesArray{objId: o.objId} -} - -func (o ScMutableBytesArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableChainId struct { - objId int32 - keyId Key32 -} - -func (o ScMutableChainId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_CHAIN_ID) -} - -func (o ScMutableChainId) SetValue(value *ScChainId) { - SetBytes(o.objId, o.keyId, TYPE_CHAIN_ID, value.Bytes()) -} - -func (o ScMutableChainId) String() string { - return o.Value().String() -} - -func (o ScMutableChainId) Value() *ScChainId { - return NewScChainIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_CHAIN_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableColor struct { - objId int32 - keyId Key32 -} - -func (o ScMutableColor) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_COLOR) -} - -func (o ScMutableColor) SetValue(value *ScColor) { - SetBytes(o.objId, o.keyId, TYPE_COLOR, value.Bytes()) -} - -func (o ScMutableColor) String() string { - return o.Value().String() -} - -func (o ScMutableColor) Value() *ScColor { - return NewScColorFromBytes(GetBytes(o.objId, o.keyId, TYPE_COLOR)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableColorArray struct { - objId int32 -} - -func (o ScMutableColorArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableColorArray) GetColor(index int32) ScMutableColor { - return ScMutableColor{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableColorArray) Immutable() ScImmutableColorArray { - return ScImmutableColorArray{objId: o.objId} -} - -func (o ScMutableColorArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableContractId struct { - objId int32 - keyId Key32 -} - -func (o ScMutableContractId) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_CONTRACT_ID) -} - -func (o ScMutableContractId) SetValue(value *ScContractId) { - SetBytes(o.objId, o.keyId, TYPE_CONTRACT_ID, value.Bytes()) -} - -func (o ScMutableContractId) String() string { - return o.Value().String() -} - -func (o ScMutableContractId) Value() *ScContractId { - return NewScContractIdFromBytes(GetBytes(o.objId, o.keyId, TYPE_CONTRACT_ID)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableHash struct { - objId int32 - keyId Key32 -} - -func (o ScMutableHash) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_HASH) -} - -func (o ScMutableHash) SetValue(value *ScHash) { - SetBytes(o.objId, o.keyId, TYPE_HASH, value.Bytes()) -} - -func (o ScMutableHash) String() string { - return o.Value().String() -} - -func (o ScMutableHash) Value() *ScHash { - return NewScHashFromBytes(GetBytes(o.objId, o.keyId, TYPE_HASH)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableHashArray struct { - objId int32 -} - -func (o ScMutableHashArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableHashArray) GetHash(index int32) ScMutableHash { - return ScMutableHash{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableHashArray) Immutable() ScImmutableHashArray { - return ScImmutableHashArray{objId: o.objId} -} - -func (o ScMutableHashArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableHname struct { - objId int32 - keyId Key32 -} - -func (o ScMutableHname) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_HNAME) -} - -func (o ScMutableHname) SetValue(value ScHname) { - SetBytes(o.objId, o.keyId, TYPE_HNAME, value.Bytes()) -} - -func (o ScMutableHname) String() string { - return o.Value().String() -} - -func (o ScMutableHname) Value() ScHname { - return NewScHnameFromBytes(GetBytes(o.objId, o.keyId, TYPE_HNAME)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableInt struct { - objId int32 - keyId Key32 -} - -func (o ScMutableInt) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_INT) -} - -func (o ScMutableInt) SetValue(value int64) { - bytes := make([]byte, 8) - binary.LittleEndian.PutUint64(bytes, uint64(value)) - SetBytes(o.objId, o.keyId, TYPE_INT, bytes) -} - -func (o ScMutableInt) String() string { - return strconv.FormatInt(o.Value(), 10) -} - -func (o ScMutableInt) Value() int64 { - bytes := GetBytes(o.objId, o.keyId, TYPE_INT) - return int64(binary.LittleEndian.Uint64(bytes)) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableIntArray struct { - objId int32 -} - -func (o ScMutableIntArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableIntArray) GetInt(index int32) ScMutableInt { - return ScMutableInt{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableIntArray) Immutable() ScImmutableIntArray { - return ScImmutableIntArray{objId: o.objId} -} - -func (o ScMutableIntArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableMap struct { - objId int32 -} - -func NewScMutableMap() *ScMutableMap { - maps := Root.GetMapArray(KeyMaps) - return &ScMutableMap{objId: maps.GetMap(maps.Length()).objId} -} - -func (o ScMutableMap) Clear() { - SetClear(o.objId) -} - -func (o ScMutableMap) GetAddress(key MapKey) ScMutableAddress { - return ScMutableAddress{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetAddressArray(key MapKey) ScMutableAddressArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_ADDRESS|TYPE_ARRAY) - return ScMutableAddressArray{objId: arrId} -} - -func (o ScMutableMap) GetAgentId(key MapKey) ScMutableAgentId { - return ScMutableAgentId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetAgentIdArray(key MapKey) ScMutableAgentArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_AGENT_ID|TYPE_ARRAY) - return ScMutableAgentArray{objId: arrId} -} - -func (o ScMutableMap) GetBytes(key MapKey) ScMutableBytes { - return ScMutableBytes{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetBytesArray(key MapKey) ScMutableBytesArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_BYTES|TYPE_ARRAY) - return ScMutableBytesArray{objId: arrId} -} - -func (o ScMutableMap) GetChainId(key MapKey) ScMutableChainId { - return ScMutableChainId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetColor(key MapKey) ScMutableColor { - return ScMutableColor{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetColorArray(key MapKey) ScMutableColorArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_COLOR|TYPE_ARRAY) - return ScMutableColorArray{objId: arrId} -} - -func (o ScMutableMap) GetContractId(key MapKey) ScMutableContractId { - return ScMutableContractId{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetHash(key MapKey) ScMutableHash { - return ScMutableHash{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetHashArray(key MapKey) ScMutableHashArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_HASH|TYPE_ARRAY) - return ScMutableHashArray{objId: arrId} -} - -func (o ScMutableMap) GetHname(key MapKey) ScMutableHname { - return ScMutableHname{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetInt(key MapKey) ScMutableInt { - return ScMutableInt{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetIntArray(key MapKey) ScMutableIntArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_INT|TYPE_ARRAY) - return ScMutableIntArray{objId: arrId} -} - -func (o ScMutableMap) GetMap(key MapKey) ScMutableMap { - mapId := GetObjectId(o.objId, key.KeyId(), TYPE_MAP) - return ScMutableMap{objId: mapId} -} - -func (o ScMutableMap) GetMapArray(key MapKey) ScMutableMapArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_MAP|TYPE_ARRAY) - return ScMutableMapArray{objId: arrId} -} - -func (o ScMutableMap) GetString(key MapKey) ScMutableString { - return ScMutableString{objId: o.objId, keyId: key.KeyId()} -} - -func (o ScMutableMap) GetStringArray(key MapKey) ScMutableStringArray { - arrId := GetObjectId(o.objId, key.KeyId(), TYPE_STRING|TYPE_ARRAY) - return ScMutableStringArray{objId: arrId} -} - -func (o ScMutableMap) Immutable() ScImmutableMap { - return ScImmutableMap{objId: o.objId} -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableMapArray struct { - objId int32 -} - -func (o ScMutableMapArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableMapArray) GetMap(index int32) ScMutableMap { - mapId := GetObjectId(o.objId, Key32(index), TYPE_MAP) - return ScMutableMap{objId: mapId} -} - -func (o ScMutableMapArray) Immutable() ScImmutableMapArray { - return ScImmutableMapArray{objId: o.objId} -} - -func (o ScMutableMapArray) Length() int32 { - return GetLength(o.objId) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableString struct { - objId int32 - keyId Key32 -} - -func (o ScMutableString) Exists() bool { - return Exists(o.objId, o.keyId, TYPE_STRING) -} - -func (o ScMutableString) SetValue(value string) { - SetBytes(o.objId, o.keyId, TYPE_STRING, []byte(value)) -} - -func (o ScMutableString) String() string { - return o.Value() -} - -func (o ScMutableString) Value() string { - bytes := GetBytes(o.objId, o.keyId, TYPE_STRING) - if bytes == nil { - return "" - } - return string(bytes) -} - -// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ - -type ScMutableStringArray struct { - objId int32 -} - -func (o ScMutableStringArray) Clear() { - SetClear(o.objId) -} - -func (o ScMutableStringArray) GetString(index int32) ScMutableString { - return ScMutableString{objId: o.objId, keyId: Key32(index)} -} - -func (o ScMutableStringArray) Immutable() ScImmutableStringArray { - return ScImmutableStringArray{objId: o.objId} -} - -func (o ScMutableStringArray) Length() int32 { - return GetLength(o.objId) -} From 8ea4b080aacfa8003c0a927c5245f5fb9ad39246 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 17 Feb 2021 12:09:02 +0200 Subject: [PATCH 04/39] reorg sc utils --- contracts/examples_core/micropay/impl.go | 3 +- contracts/rust/testcore/test/consts.go | 2 +- packages/coretypes/sb_utils/base58.go | 13 +++ packages/coretypes/sb_utils/bls.go | 52 +++++++++ packages/coretypes/sb_utils/common.go | 29 +++++ packages/coretypes/sb_utils/ed25519.go | 30 ++++++ packages/coretypes/sb_utils/hashing.go | 20 ++++ packages/coretypes/utils_interface.go | 100 ++++-------------- packages/dashboard/chain.go | 4 +- packages/dashboard/chainblob.go | 6 +- .../test_sandbox_sc/testcore_bg.wasm | Bin 45410 -> 45580 bytes packages/vm/sandbox/sandbox.go | 3 +- packages/vm/sandbox/sandboxview.go | 3 +- packages/vm/viewcontext/sandbox.go | 3 +- packages/vm/wasmproc/scutility.go | 30 ++++-- 15 files changed, 199 insertions(+), 99 deletions(-) create mode 100644 packages/coretypes/sb_utils/base58.go create mode 100644 packages/coretypes/sb_utils/bls.go create mode 100644 packages/coretypes/sb_utils/common.go create mode 100644 packages/coretypes/sb_utils/ed25519.go create mode 100644 packages/coretypes/sb_utils/hashing.go diff --git a/contracts/examples_core/micropay/impl.go b/contracts/examples_core/micropay/impl.go index 3b068e18bd..699955dfd3 100644 --- a/contracts/examples_core/micropay/impl.go +++ b/contracts/examples_core/micropay/impl.go @@ -263,7 +263,8 @@ func processPayments(ctx coretypes.Sandbox, payments []*Payment, payerAddr, targ } data := paymentEssence(p.Ord, p.Amount, payerAddr, targetAddr) lastOrd = int64(p.Ord) - if !ctx.Utils().ValidED25519Signature(data, payerPubKey, p.SignatureShort) { + ok, err := ctx.Utils().ED25519().ValidSignature(data, payerPubKey, p.SignatureShort) + if !ok || err != nil { ctx.Log().Infof("wrong signature") notSettled = append(notSettled, p) continue diff --git a/contracts/rust/testcore/test/consts.go b/contracts/rust/testcore/test/consts.go index 6b5de0b781..5d3f5fb5fa 100644 --- a/contracts/rust/testcore/test/consts.go +++ b/contracts/rust/testcore/test/consts.go @@ -19,7 +19,7 @@ const ParamChainOwnerId = "chainOwnerID" const ParamContractCreator = "contractCreator" const ParamContractId = "contractID" const ParamCounter = "counter" -const ParamHash = "Hash" +const ParamHash = "Hashing" const ParamHname = "Hname" const ParamHnameContract = "hnameContract" const ParamHnameEP = "hnameEP" diff --git a/packages/coretypes/sb_utils/base58.go b/packages/coretypes/sb_utils/base58.go new file mode 100644 index 0000000000..a7cecc6061 --- /dev/null +++ b/packages/coretypes/sb_utils/base58.go @@ -0,0 +1,13 @@ +package sb_utils + +import "github.com/mr-tron/base58" + +type base58Util struct{} + +func (u base58Util) Decode(s string) ([]byte, error) { + return base58.Decode(s) +} + +func (u base58Util) Encode(data []byte) string { + return base58.Encode(data) +} diff --git a/packages/coretypes/sb_utils/bls.go b/packages/coretypes/sb_utils/bls.go new file mode 100644 index 0000000000..ebb27c04d5 --- /dev/null +++ b/packages/coretypes/sb_utils/bls.go @@ -0,0 +1,52 @@ +package sb_utils + +import ( + "fmt" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" + "go.dedis.ch/kyber/v3/pairing/bn256" + "go.dedis.ch/kyber/v3/sign/bdn" +) + +type blsUtil struct { +} + +var suite = bn256.NewSuite() + +func (u blsUtil) ValidSignature(data []byte, pubKeyBin []byte, signature []byte) (bool, error) { + pubKey := suite.G2().Point() + var err error + if err = pubKey.UnmarshalBinary(pubKeyBin); err != nil { + return false, fmt.Errorf("BLSUtil: wrong public key bytes") + } + return bdn.Verify(suite, pubKey, data, signature) == nil, nil +} + +func (u blsUtil) AddressFromPublicKey(pubKeyBin []byte) (address.Address, error) { + pubKey := suite.G2().Point() + if err := pubKey.UnmarshalBinary(pubKeyBin); err != nil { + return address.Address{}, fmt.Errorf("BLSUtil: wrong public key bytes") + } + return address.FromBLSPubKey(pubKeyBin), nil +} + +// AggregateBLSSignatures +// TODO: optimize redundant binary manipulation. +// Implement more flexible access to parts of SignatureShort +func (u blsUtil) AggregateBLSSignatures(pubKeysBin [][]byte, sigsBin [][]byte) ([]byte, []byte, error) { + if len(sigsBin) == 0 || len(pubKeysBin) != len(sigsBin) { + return nil, nil, fmt.Errorf("BLSUtil: number of public keys must be equal to the number of signatures and not empty") + } + sigs := make([]signaturescheme.Signature, len(sigsBin)) + for i := range sigs { + sigs[i] = signaturescheme.NewBLSSignature(pubKeysBin[i], sigsBin[i]) + } + ret, err := signaturescheme.AggregateBLSSignatures(sigs...) + if err != nil { + return nil, nil, fmt.Errorf("BLSUtil: %v", err) + } + pubKeyBin := ret.Bytes()[1 : 1+signaturescheme.BLSPublicKeySize] + sigBin := ret.Bytes()[1+signaturescheme.BLSPublicKeySize:] + + return pubKeyBin, sigBin, nil +} diff --git a/packages/coretypes/sb_utils/common.go b/packages/coretypes/sb_utils/common.go new file mode 100644 index 0000000000..b3c6f488db --- /dev/null +++ b/packages/coretypes/sb_utils/common.go @@ -0,0 +1,29 @@ +// package sb_utils implements Sandbox utility functoon +package sb_utils + +import ( + "github.com/iotaledger/wasp/packages/coretypes" +) + +type utilImpl struct { +} + +func NewUtils() coretypes.Utils { + return utilImpl{} +} + +func (u utilImpl) Base58() coretypes.Base58 { + return base58Util{} +} + +func (u utilImpl) Hashing() coretypes.Hashing { + return hashUtil{} +} + +func (u utilImpl) ED25519() coretypes.ED25519 { + return ed25519Util{} +} + +func (u utilImpl) BLS() coretypes.BLS { + return blsUtil{} +} diff --git a/packages/coretypes/sb_utils/ed25519.go b/packages/coretypes/sb_utils/ed25519.go new file mode 100644 index 0000000000..62c6098d25 --- /dev/null +++ b/packages/coretypes/sb_utils/ed25519.go @@ -0,0 +1,30 @@ +package sb_utils + +import ( + "fmt" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/hive.go/crypto/ed25519" +) + +type ed25519Util struct { +} + +func (u ed25519Util) ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) { + pk, _, err := ed25519.PublicKeyFromBytes(pubKey) + if err != nil { + return false, fmt.Errorf("ED255519Util: wrong public key bytes") + } + sig, _, err := ed25519.SignatureFromBytes(signature) + if err != nil { + return false, fmt.Errorf("ED255519Util: wrong signature bytes") + } + return pk.VerifySignature(data, sig), nil +} + +func (u ed25519Util) AddressFromPublicKey(pubKey []byte) (address.Address, error) { + pk, _, err := ed25519.PublicKeyFromBytes(pubKey) + if err != nil { + return address.Address{}, fmt.Errorf("ED255519Util: wrong public key bytes") + } + return address.FromED25519PubKey(pk), nil +} diff --git a/packages/coretypes/sb_utils/hashing.go b/packages/coretypes/sb_utils/hashing.go new file mode 100644 index 0000000000..2dcc7121ab --- /dev/null +++ b/packages/coretypes/sb_utils/hashing.go @@ -0,0 +1,20 @@ +package sb_utils + +import ( + "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/hashing" +) + +type hashUtil struct{} + +func (u hashUtil) Blake2b(data []byte) hashing.HashValue { + return hashing.HashDataBlake2b(data) +} + +func (u hashUtil) Sha3(data []byte) hashing.HashValue { + return hashing.HashSha3(data) +} + +func (u hashUtil) Hname(s string) coretypes.Hname { + return coretypes.Hn(s) +} diff --git a/packages/coretypes/utils_interface.go b/packages/coretypes/utils_interface.go index 1e21451c20..2544c4ba02 100644 --- a/packages/coretypes/utils_interface.go +++ b/packages/coretypes/utils_interface.go @@ -1,99 +1,37 @@ package coretypes import ( - "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" - "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/wasp/packages/hashing" - "github.com/mr-tron/base58" - "go.dedis.ch/kyber/v3/pairing/bn256" - "go.dedis.ch/kyber/v3/sign/bdn" ) // Utils implement various utilities which are faster on host side than on wasm VM // Implement deterministic stateless computations type Utils interface { - Base58Decode(s string) ([]byte, error) - Base58Encode(data []byte) string - HashBlake2b(data []byte) hashing.HashValue - HashSha3(data []byte) hashing.HashValue - Hname(s string) Hname - ValidED25519Signature(data []byte, pubKey []byte, signature []byte) bool - ValidBLSSignature(data []byte, pubKey []byte, signature []byte) bool - AggregateBLSSignatures(pubKeysBin [][]byte, sigsBin [][]byte) ([]byte, []byte) + Base58() Base58 + Hashing() Hashing + ED25519() ED25519 + BLS() BLS } -type utilImpl struct { - log LogInterface +type Hashing interface { + Blake2b(data []byte) hashing.HashValue + Sha3(data []byte) hashing.HashValue + Hname(name string) Hname } -func NewUtils(log LogInterface) Utils { - return utilImpl{log} +type Base58 interface { + Decode(s string) ([]byte, error) + Encode(data []byte) string } -func (u utilImpl) Base58Decode(s string) ([]byte, error) { - return base58.Decode(s) +type ED25519 interface { + ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) + AddressFromPublicKey(pubKey []byte) (address.Address, error) } -func (u utilImpl) Base58Encode(data []byte) string { - return base58.Encode(data) -} - -func (u utilImpl) HashBlake2b(data []byte) hashing.HashValue { - return hashing.HashDataBlake2b(data) -} - -func (u utilImpl) HashSha3(data []byte) hashing.HashValue { - return hashing.HashSha3(data) -} - -func (u utilImpl) Hname(s string) Hname { - return Hn(s) -} - -func (u utilImpl) ValidED25519Signature(data []byte, pubKey []byte, signature []byte) bool { - pk, _, err := ed25519.PublicKeyFromBytes(pubKey) - if err != nil { - u.log.Panicf("ValidED25519Signature: wrong public key bytes") - } - sig, _, err := ed25519.SignatureFromBytes(signature) - if err != nil { - u.log.Panicf("ValidED25519Signature: wrong signature bytes") - } - return pk.VerifySignature(data, sig) -} - -var suite = bn256.NewSuite() - -func (u utilImpl) ValidBLSSignature(data []byte, pubKeyBin []byte, sigBin []byte) bool { - pubKey := suite.G2().Point() - var err error - if err = pubKey.UnmarshalBinary(pubKeyBin); err != nil { - u.log.Panicf("ValidBLSSignature: wrong public key bytes") - } - err = bdn.Verify(suite, pubKey, data, sigBin) - if err != nil { - u.log.Infof("ValidBLSSignature: %v", err) - } - return err == nil -} - -// AggregateBLSSignatures -// TODO: optimize redundant binary manipulation. -// Implement more flexible access to parts of SignatureShort -func (u utilImpl) AggregateBLSSignatures(pubKeysBin [][]byte, sigsBin [][]byte) ([]byte, []byte) { - if len(sigsBin) == 0 || len(pubKeysBin) != len(sigsBin) { - u.log.Panicf("number of publik keys must be equal to the number of signatures and not empty") - } - sigs := make([]signaturescheme.Signature, len(sigsBin)) - for i := range sigs { - sigs[i] = signaturescheme.NewBLSSignature(pubKeysBin[i], sigsBin[i]) - } - ret, err := signaturescheme.AggregateBLSSignatures(sigs...) - if err != nil { - u.log.Panicf("AggregateBLSSignatures: %v", err) - } - pubKeyBin := ret.Bytes()[1 : 1+signaturescheme.BLSPublicKeySize] - sigBin := ret.Bytes()[1+signaturescheme.BLSPublicKeySize:] - - return pubKeyBin, sigBin +type BLS interface { + ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) + AddressFromPublicKey(pubKey []byte) (address.Address, error) + AggregateBLSSignatures(pubKeysBin [][]byte, sigsBin [][]byte) ([]byte, []byte, error) } diff --git a/packages/dashboard/chain.go b/packages/dashboard/chain.go index 726750be1d..301f2e3244 100644 --- a/packages/dashboard/chain.go +++ b/packages/dashboard/chain.go @@ -207,7 +207,7 @@ const tplChain = ` - + @@ -226,7 +226,7 @@ const tplChain = `

State

State index
{{.Block.StateIndex}}
-
State hash
{{.VirtualState.Hash}}
+
State hash
{{.VirtualState.Hashing}}
Last updated
{{formatTimestamp .Block.Timestamp}} in transaction {{.Block.StateTransactionID}}
diff --git a/packages/dashboard/chainblob.go b/packages/dashboard/chainblob.go index d37f02b764..8219fe1847 100644 --- a/packages/dashboard/chainblob.go +++ b/packages/dashboard/chainblob.go @@ -8,8 +8,8 @@ import ( "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/vm/core/blob" - "github.com/iotaledger/wasp/plugins/chains" "github.com/iotaledger/wasp/packages/webapi/httperrors" + "github.com/iotaledger/wasp/plugins/chains" "github.com/labstack/echo/v4" "github.com/mr-tron/base58" ) @@ -124,12 +124,12 @@ const tplChainBlob = ` {{define "body"}} {{if .Blob}} {{ $chainid := .ChainID }} - {{ $hash := .Hash }} + {{ $hash := .Hashing }}

Blob

-
Hash
{{hashref $hash}}
+
Hashing
{{hashref $hash}}
diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm b/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm index 1a31e5236ec15db67856e56d36e8d650cabf8de6..d9f751e1dd2da32174467a511788688ad5c56b97 100644 GIT binary patch delta 14231 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 H?=JgqlV2Te2*#U+(o4n?>^a`kR)Ieobrx*;YKK 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 diff --git a/packages/vm/sandbox/sandbox.go b/packages/vm/sandbox/sandbox.go index 2b8a092201..69cd35bd68 100644 --- a/packages/vm/sandbox/sandbox.go +++ b/packages/vm/sandbox/sandbox.go @@ -7,6 +7,7 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" @@ -28,7 +29,7 @@ func new(vmctx *vmcontext.VMContext) coretypes.Sandbox { } func (s *sandbox) Utils() coretypes.Utils { - return coretypes.NewUtils(s.Log()) + return sb_utils.NewUtils() } func (s *sandbox) ChainOwnerID() coretypes.AgentID { diff --git a/packages/vm/sandbox/sandboxview.go b/packages/vm/sandbox/sandboxview.go index 3214e95c12..9f844735aa 100644 --- a/packages/vm/sandbox/sandboxview.go +++ b/packages/vm/sandbox/sandboxview.go @@ -5,6 +5,7 @@ package sandbox import ( "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" "github.com/iotaledger/wasp/packages/vm/vmcontext" @@ -23,7 +24,7 @@ func newView(vmctx *vmcontext.VMContext) coretypes.SandboxView { } func (s sandboxView) Utils() coretypes.Utils { - return coretypes.NewUtils(s.Log()) + return sb_utils.NewUtils() } func (s sandboxView) ChainOwnerID() coretypes.AgentID { diff --git a/packages/vm/viewcontext/sandbox.go b/packages/vm/viewcontext/sandbox.go index d03bd6f3c5..b12ea0c85e 100644 --- a/packages/vm/viewcontext/sandbox.go +++ b/packages/vm/viewcontext/sandbox.go @@ -4,6 +4,7 @@ import ( "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/wasp/packages/coretypes" assert2 "github.com/iotaledger/wasp/packages/coretypes/assert" + "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" "github.com/iotaledger/wasp/packages/kv/kvdecoder" @@ -38,7 +39,7 @@ func newSandboxView(vctx *viewcontext, contractHname coretypes.Hname, params dic } func (s *sandboxview) Utils() coretypes.Utils { - return coretypes.NewUtils(s.Log()) + return sb_utils.NewUtils() } func (s *sandboxview) Params() dict.Dict { diff --git a/packages/vm/wasmproc/scutility.go b/packages/vm/wasmproc/scutility.go index e3f3527f5d..a804162027 100644 --- a/packages/vm/wasmproc/scutility.go +++ b/packages/vm/wasmproc/scutility.go @@ -126,15 +126,15 @@ func (o *ScUtility) SetBytes(keyId int32, typeId int32, bytes []byte) { case wasmhost.KeyAggregateBls: o.aggregatedBls = o.aggregateBLSSignatures(bytes) case wasmhost.KeyBase58Bytes: - o.base58Encoded = utils.Base58Encode(bytes) + o.base58Encoded = utils.Base58().Encode(bytes) case wasmhost.KeyBase58String: - o.base58Decoded, err = utils.Base58Decode(string(bytes)) + o.base58Decoded, err = utils.Base58().Decode(string(bytes)) case wasmhost.KeyHashBlake2b: - o.hash = utils.HashBlake2b(bytes) + o.hash = utils.Hashing().Blake2b(bytes) case wasmhost.KeyHashSha3: - o.hash = utils.HashSha3(bytes) + o.hash = utils.Hashing().Sha3(bytes) case wasmhost.KeyName: - o.hname = utils.Hname(string(bytes)) + o.hname = utils.Hashing().Hname(string(bytes)) case wasmhost.KeyValidBls: o.valid = o.validBLSSignature(bytes) case wasmhost.KeyValidEd25519: @@ -159,7 +159,11 @@ func (o *ScUtility) aggregateBLSSignatures(bytes []byte) []byte { for i := 0; i < count; i++ { sigsBin[i] = decode.Bytes() } - pubKeyBin, sigBin := o.vm.utils().AggregateBLSSignatures(pubKeysBin, sigsBin) + pubKeyBin, sigBin, err := o.vm.utils().BLS().AggregateBLSSignatures(pubKeysBin, sigsBin) + if err != nil { + // TODO return error + o.Panic(err.Error()) + } return NewBytesEncoder().Bytes(pubKeyBin).Bytes(sigBin).Data() } @@ -168,7 +172,12 @@ func (o *ScUtility) validBLSSignature(bytes []byte) bool { data := decode.Bytes() pubKey := decode.Bytes() signature := decode.Bytes() - return o.vm.utils().ValidBLSSignature(data, pubKey, signature) + ok, err := o.vm.utils().BLS().ValidSignature(data, pubKey, signature) + if err != nil { + // TODO return error + o.Panic(err.Error()) + } + return ok } func (o *ScUtility) validED25519Signature(bytes []byte) bool { @@ -176,5 +185,10 @@ func (o *ScUtility) validED25519Signature(bytes []byte) bool { data := decode.Bytes() pubKey := decode.Bytes() signature := decode.Bytes() - return o.vm.utils().ValidED25519Signature(data, pubKey, signature) + ok, err := o.vm.utils().ED25519().ValidSignature(data, pubKey, signature) + if err != nil { + // TODO return error + o.Panic(err.Error()) + } + return ok } From 9f507e55e5d11f10302193afdf48a2e8f34f67dc Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 17 Feb 2021 12:30:17 +0200 Subject: [PATCH 05/39] reorg sandbox utils --- contracts/examples_core/micropay/impl.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/examples_core/micropay/impl.go b/contracts/examples_core/micropay/impl.go index 699955dfd3..1fe83d04f7 100644 --- a/contracts/examples_core/micropay/impl.go +++ b/contracts/examples_core/micropay/impl.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" - "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/coretypes/assert" "github.com/iotaledger/wasp/packages/coretypes/cbalances" @@ -28,9 +27,8 @@ func publicKey(ctx coretypes.Sandbox) (dict.Dict, error) { par := kvdecoder.New(ctx.Params(), ctx.Log()) pubKeyBin := par.MustGetBytes(ParamPublicKey) - pubKey, _, err := ed25519.PublicKeyFromBytes(pubKeyBin) + addr, err := ctx.Utils().ED25519().AddressFromPublicKey(pubKeyBin) a.RequireNoError(err) - addr := address.FromED25519PubKey(pubKey) a.Require(addr == ctx.Caller().MustAddress(), "public key does not correspond to the caller's address") pkRegistry := collections.NewMap(ctx.State(), StateVarPublicKeys) From bace003940c9fba26a5ee46f767586ce811c6d37 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 17 Feb 2021 15:21:25 +0200 Subject: [PATCH 06/39] reorg sandbox utils --- contracts/rust/testcore/test/consts.go | 93 ------------------ contracts/rust/testcore/test/testcore_bg.wasm | Bin 45410 -> 0 bytes contracts/rust/testcore/test/testcore_test.go | 21 ---- packages/dashboard/chain.go | 4 +- packages/dashboard/chainblob.go | 4 +- 5 files changed, 4 insertions(+), 118 deletions(-) delete mode 100644 contracts/rust/testcore/test/consts.go delete mode 100644 contracts/rust/testcore/test/testcore_bg.wasm delete mode 100644 contracts/rust/testcore/test/testcore_test.go diff --git a/contracts/rust/testcore/test/consts.go b/contracts/rust/testcore/test/consts.go deleted file mode 100644 index 5d3f5fb5fa..0000000000 --- a/contracts/rust/testcore/test/consts.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -package test - -import ( - "github.com/iotaledger/wasp/packages/coretypes" -) - -const ScName = "testcore" -const ScDescription = "Core test for ISCP wasmlib Rust/Wasm library" -const ScHname = coretypes.Hname(0x370d33ad) - -const ParamAddress = "address" -const ParamAgentId = "agentID" -const ParamCaller = "caller" -const ParamChainId = "chainid" -const ParamChainOwnerId = "chainOwnerID" -const ParamContractCreator = "contractCreator" -const ParamContractId = "contractID" -const ParamCounter = "counter" -const ParamHash = "Hashing" -const ParamHname = "Hname" -const ParamHnameContract = "hnameContract" -const ParamHnameEP = "hnameEP" -const ParamHnameZero = "Hname-0" -const ParamInt64 = "int64" -const ParamInt64Zero = "int64-0" -const ParamIntValue = "intParamValue" -const ParamName = "intParamName" -const ParamString = "string" -const ParamStringZero = "string-0" - -const VarCounter = "counter" -const VarHnameEP = "hnameEP" - -const FuncCallOnChain = "callOnChain" -const FuncCheckContextFromFullEP = "checkContextFromFullEP" -const FuncDoNothing = "doNothing" -const FuncInit = "init" -const FuncPassTypesFull = "passTypesFull" -const FuncRunRecursion = "runRecursion" -const FuncSendToAddress = "sendToAddress" -const FuncSetInt = "setInt" -const FuncTestCallPanicFullEP = "testCallPanicFullEP" -const FuncTestCallPanicViewEPFromFull = "testCallPanicViewEPFromFull" -const FuncTestChainOwnerIDFull = "testChainOwnerIDFull" -const FuncTestContractIDFull = "testContractIDFull" -const FuncTestEventLogDeploy = "testEventLogDeploy" -const FuncTestEventLogEventData = "testEventLogEventData" -const FuncTestEventLogGenericData = "testEventLogGenericData" -const FuncTestPanicFullEP = "testPanicFullEP" -const FuncWithdrawToChain = "withdrawToChain" -const ViewCheckContextFromViewEP = "checkContextFromViewEP" -const ViewFibonacci = "fibonacci" -const ViewGetCounter = "getCounter" -const ViewGetInt = "getInt" -const ViewJustView = "justView" -const ViewPassTypesView = "passTypesView" -const ViewTestCallPanicViewEPFromView = "testCallPanicViewEPFromView" -const ViewTestChainOwnerIDView = "testChainOwnerIDView" -const ViewTestContractIDView = "testContractIDView" -const ViewTestPanicViewEP = "testPanicViewEP" -const ViewTestSandboxCall = "testSandboxCall" - -const HFuncCallOnChain = coretypes.Hname(0x95a3d123) -const HFuncCheckContextFromFullEP = coretypes.Hname(0xa56c24ba) -const HFuncDoNothing = coretypes.Hname(0xdda4a6de) -const HFuncInit = coretypes.Hname(0x1f44d644) -const HFuncPassTypesFull = coretypes.Hname(0x733ea0ea) -const HFuncRunRecursion = coretypes.Hname(0x833425fd) -const HFuncSendToAddress = coretypes.Hname(0x63ce4634) -const HFuncSetInt = coretypes.Hname(0x62056f74) -const HFuncTestCallPanicFullEP = coretypes.Hname(0x4c878834) -const HFuncTestCallPanicViewEPFromFull = coretypes.Hname(0xfd7e8c1d) -const HFuncTestChainOwnerIDFull = coretypes.Hname(0x2aff1167) -const HFuncTestContractIDFull = coretypes.Hname(0x95934282) -const HFuncTestEventLogDeploy = coretypes.Hname(0x96ff760a) -const HFuncTestEventLogEventData = coretypes.Hname(0x0efcf939) -const HFuncTestEventLogGenericData = coretypes.Hname(0x6a16629d) -const HFuncTestPanicFullEP = coretypes.Hname(0x24fdef07) -const HFuncWithdrawToChain = coretypes.Hname(0x437bc026) -const HViewCheckContextFromViewEP = coretypes.Hname(0x88ff0167) -const HViewFibonacci = coretypes.Hname(0x7940873c) -const HViewGetCounter = coretypes.Hname(0xb423e607) -const HViewGetInt = coretypes.Hname(0x1887e5ef) -const HViewJustView = coretypes.Hname(0x33b8972e) -const HViewPassTypesView = coretypes.Hname(0x1a5b87ea) -const HViewTestCallPanicViewEPFromView = coretypes.Hname(0x91b10c99) -const HViewTestChainOwnerIDView = coretypes.Hname(0x26586c33) -const HViewTestContractIDView = coretypes.Hname(0x28a02913) -const HViewTestPanicViewEP = coretypes.Hname(0x22bc4d72) -const HViewTestSandboxCall = coretypes.Hname(0x42d72b63) diff --git a/contracts/rust/testcore/test/testcore_bg.wasm b/contracts/rust/testcore/test/testcore_bg.wasm deleted file mode 100644 index 1a31e5236ec15db67856e56d36e8d650cabf8de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45410 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
- + @@ -226,7 +226,7 @@ const tplChain = `

State

State index
{{.Block.StateIndex}}
-
State hash
{{.VirtualState.Hashing}}
+
State hash
{{.VirtualState.Hash}}
Last updated
{{formatTimestamp .Block.Timestamp}} in transaction {{.Block.StateTransactionID}}
diff --git a/packages/dashboard/chainblob.go b/packages/dashboard/chainblob.go index 8219fe1847..15a1c55fed 100644 --- a/packages/dashboard/chainblob.go +++ b/packages/dashboard/chainblob.go @@ -124,12 +124,12 @@ const tplChainBlob = ` {{define "body"}} {{if .Blob}} {{ $chainid := .ChainID }} - {{ $hash := .Hashing }} + {{ $hash := .Hash }}

Blob

-
Hashing
{{hashref $hash}}
+
Hash
{{hashref $hash}}
From d583edc1464219b68f54bd1d3fb7cb919c7be947 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 17 Feb 2021 15:26:49 +0200 Subject: [PATCH 07/39] reorg sandbox utils --- packages/vm/sandbox/sandbox.go | 4 ++-- .../sb_utils => vm/sandbox/sandbox_utils}/base58.go | 5 ++++- .../sb_utils => vm/sandbox/sandbox_utils}/bls.go | 5 ++++- .../sb_utils => vm/sandbox/sandbox_utils}/common.go | 7 +++++-- .../sb_utils => vm/sandbox/sandbox_utils}/ed25519.go | 5 ++++- .../sb_utils => vm/sandbox/sandbox_utils}/hashing.go | 5 ++++- packages/vm/sandbox/sandboxview.go | 4 ++-- packages/vm/viewcontext/sandbox.go | 4 ++-- 8 files changed, 27 insertions(+), 12 deletions(-) rename packages/{coretypes/sb_utils => vm/sandbox/sandbox_utils}/base58.go (70%) rename packages/{coretypes/sb_utils => vm/sandbox/sandbox_utils}/bls.go (95%) rename packages/{coretypes/sb_utils => vm/sandbox/sandbox_utils}/common.go (73%) rename packages/{coretypes/sb_utils => vm/sandbox/sandbox_utils}/ed25519.go (90%) rename packages/{coretypes/sb_utils => vm/sandbox/sandbox_utils}/hashing.go (81%) diff --git a/packages/vm/sandbox/sandbox.go b/packages/vm/sandbox/sandbox.go index 69cd35bd68..d6db51c7c9 100644 --- a/packages/vm/sandbox/sandbox.go +++ b/packages/vm/sandbox/sandbox.go @@ -7,10 +7,10 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/packages/coretypes" - "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" + "github.com/iotaledger/wasp/packages/vm/sandbox/sandbox_utils" "github.com/iotaledger/wasp/packages/vm/vmcontext" ) @@ -29,7 +29,7 @@ func new(vmctx *vmcontext.VMContext) coretypes.Sandbox { } func (s *sandbox) Utils() coretypes.Utils { - return sb_utils.NewUtils() + return sandbox_utils.NewUtils() } func (s *sandbox) ChainOwnerID() coretypes.AgentID { diff --git a/packages/coretypes/sb_utils/base58.go b/packages/vm/sandbox/sandbox_utils/base58.go similarity index 70% rename from packages/coretypes/sb_utils/base58.go rename to packages/vm/sandbox/sandbox_utils/base58.go index a7cecc6061..72a6c19988 100644 --- a/packages/coretypes/sb_utils/base58.go +++ b/packages/vm/sandbox/sandbox_utils/base58.go @@ -1,4 +1,7 @@ -package sb_utils +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package sandbox_utils import "github.com/mr-tron/base58" diff --git a/packages/coretypes/sb_utils/bls.go b/packages/vm/sandbox/sandbox_utils/bls.go similarity index 95% rename from packages/coretypes/sb_utils/bls.go rename to packages/vm/sandbox/sandbox_utils/bls.go index ebb27c04d5..10a49046f6 100644 --- a/packages/coretypes/sb_utils/bls.go +++ b/packages/vm/sandbox/sandbox_utils/bls.go @@ -1,4 +1,7 @@ -package sb_utils +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package sandbox_utils import ( "fmt" diff --git a/packages/coretypes/sb_utils/common.go b/packages/vm/sandbox/sandbox_utils/common.go similarity index 73% rename from packages/coretypes/sb_utils/common.go rename to packages/vm/sandbox/sandbox_utils/common.go index b3c6f488db..0631fe5285 100644 --- a/packages/coretypes/sb_utils/common.go +++ b/packages/vm/sandbox/sandbox_utils/common.go @@ -1,5 +1,8 @@ -// package sb_utils implements Sandbox utility functoon -package sb_utils +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +// package sb_utils implements Sandbox utility functions +package sandbox_utils import ( "github.com/iotaledger/wasp/packages/coretypes" diff --git a/packages/coretypes/sb_utils/ed25519.go b/packages/vm/sandbox/sandbox_utils/ed25519.go similarity index 90% rename from packages/coretypes/sb_utils/ed25519.go rename to packages/vm/sandbox/sandbox_utils/ed25519.go index 62c6098d25..797cea691f 100644 --- a/packages/coretypes/sb_utils/ed25519.go +++ b/packages/vm/sandbox/sandbox_utils/ed25519.go @@ -1,4 +1,7 @@ -package sb_utils +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package sandbox_utils import ( "fmt" diff --git a/packages/coretypes/sb_utils/hashing.go b/packages/vm/sandbox/sandbox_utils/hashing.go similarity index 81% rename from packages/coretypes/sb_utils/hashing.go rename to packages/vm/sandbox/sandbox_utils/hashing.go index 2dcc7121ab..8d8e313f1b 100644 --- a/packages/coretypes/sb_utils/hashing.go +++ b/packages/vm/sandbox/sandbox_utils/hashing.go @@ -1,4 +1,7 @@ -package sb_utils +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package sandbox_utils import ( "github.com/iotaledger/wasp/packages/coretypes" diff --git a/packages/vm/sandbox/sandboxview.go b/packages/vm/sandbox/sandboxview.go index 9f844735aa..240157079f 100644 --- a/packages/vm/sandbox/sandboxview.go +++ b/packages/vm/sandbox/sandboxview.go @@ -5,9 +5,9 @@ package sandbox import ( "github.com/iotaledger/wasp/packages/coretypes" - "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" + "github.com/iotaledger/wasp/packages/vm/sandbox/sandbox_utils" "github.com/iotaledger/wasp/packages/vm/vmcontext" ) @@ -24,7 +24,7 @@ func newView(vmctx *vmcontext.VMContext) coretypes.SandboxView { } func (s sandboxView) Utils() coretypes.Utils { - return sb_utils.NewUtils() + return sandbox_utils.NewUtils() } func (s sandboxView) ChainOwnerID() coretypes.AgentID { diff --git a/packages/vm/viewcontext/sandbox.go b/packages/vm/viewcontext/sandbox.go index b12ea0c85e..0e036fe0cb 100644 --- a/packages/vm/viewcontext/sandbox.go +++ b/packages/vm/viewcontext/sandbox.go @@ -4,12 +4,12 @@ import ( "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/wasp/packages/coretypes" assert2 "github.com/iotaledger/wasp/packages/coretypes/assert" - "github.com/iotaledger/wasp/packages/coretypes/sb_utils" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/dict" "github.com/iotaledger/wasp/packages/kv/kvdecoder" "github.com/iotaledger/wasp/packages/vm" "github.com/iotaledger/wasp/packages/vm/core/root" + "github.com/iotaledger/wasp/packages/vm/sandbox/sandbox_utils" ) var ( @@ -39,7 +39,7 @@ func newSandboxView(vctx *viewcontext, contractHname coretypes.Hname, params dic } func (s *sandboxview) Utils() coretypes.Utils { - return sb_utils.NewUtils() + return sandbox_utils.NewUtils() } func (s *sandboxview) Params() dict.Dict { From 52ec019253eb4d9bf01065b1f3a9a8fb86f01113 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Thu, 18 Feb 2021 13:31:48 +0200 Subject: [PATCH 08/39] cleanup package structure --- articles/tutorial/01.md | 9 +++++---- contracts/{ => examples_core}/getproc.go | 12 ++++++------ .../donatewithfeedback/dwfclient/client.go | 0 .../donatewithfeedback/dwfimpl/impl.go | 2 +- .../{ => ignore}/donatewithfeedback/types.go | 0 .../{ => ignore}/fairauction/encode.go | 0 .../fairauction/faclient/client.go | 0 .../{ => ignore}/fairauction/impl.go | 0 .../{ => ignore}/fairauction/util.go | 0 .../fairroulette/frclient/client.go | 0 .../{ => ignore}/fairroulette/impl.go | 0 contracts/examples_core/inccounter/impl.go | 4 ++-- contracts/examples_core/micropay/interface.go | 4 ++-- .../sandbox_tests/test_sandbox_sc/interface.go | 4 ++-- packages/vm/hardcoded/locatevm.go | 17 ----------------- packages/vm/processors/getbuiltinvm.go | 18 ++++++++++++++++++ packages/vm/processors/processors.go | 6 +++--- packages/vm/viewcontext/viewcontext.go | 3 +-- packages/vm/vmcontext/internal.go | 4 ++-- 19 files changed, 42 insertions(+), 41 deletions(-) rename contracts/{ => examples_core}/getproc.go (62%) rename contracts/examples_core/{ => ignore}/donatewithfeedback/dwfclient/client.go (100%) rename contracts/examples_core/{ => ignore}/donatewithfeedback/dwfimpl/impl.go (98%) rename contracts/examples_core/{ => ignore}/donatewithfeedback/types.go (100%) rename contracts/examples_core/{ => ignore}/fairauction/encode.go (100%) rename contracts/examples_core/{ => ignore}/fairauction/faclient/client.go (100%) rename contracts/examples_core/{ => ignore}/fairauction/impl.go (100%) rename contracts/examples_core/{ => ignore}/fairauction/util.go (100%) rename contracts/examples_core/{ => ignore}/fairroulette/frclient/client.go (100%) rename contracts/examples_core/{ => ignore}/fairroulette/impl.go (100%) delete mode 100644 packages/vm/hardcoded/locatevm.go create mode 100644 packages/vm/processors/getbuiltinvm.go diff --git a/articles/tutorial/01.md b/articles/tutorial/01.md index bf29b6c982..2b3d66ed39 100644 --- a/articles/tutorial/01.md +++ b/articles/tutorial/01.md @@ -73,10 +73,11 @@ are automatically deployed on each new chain. You can see them listed in the tes The output fragment in the log `state transition #0 --> #1` means the state of the chain has changed from block index 0 (the origin index of the empty state) to block index 1. The state #0 is the empty origin state, the #1 always contains all core smart contracts deployed on the chain as well as other -variables of chain, such as _chainID_ and _chain owner ID. +variables of chain, such as _chainID_ and _chain owner ID_. -The _chainID_ and _chain owner ID_ are respectively ID of the deployed chain `Ygtcnzs4zHF3Ao9i5FytNT5oYykUvYtuJSSANuxohcoo` -and the address of the wallet (the private key) which deployed that chain `A/RxRUJAcHajNX1A3bFBdECxQVkNwELTnPfU7aNboEz9hN` -(with the prefix `/A` to indicate that the chain owner is an address, not a smart contract). +The _chainID_ and _chain owner ID_ are respectively ID of the deployed +chain `Ygtcnzs4zHF3Ao9i5FytNT5oYykUvYtuJSSANuxohcoo` and the address (in the form of _agent ID_) +from which the chain was deployed: `A/RxRUJAcHajNX1A3bFBdECxQVkNwELTnPfU7aNboEz9hN` +(the prefix `A/` indicates that the chain owner is an address, not a smart contract). Next: [Tokens and the Value Tangle](02.md) \ No newline at end of file diff --git a/contracts/getproc.go b/contracts/examples_core/getproc.go similarity index 62% rename from contracts/getproc.go rename to contracts/examples_core/getproc.go index 261e1c021b..2e4bc99d93 100644 --- a/contracts/getproc.go +++ b/contracts/examples_core/getproc.go @@ -1,7 +1,7 @@ // Copyright 2020 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -package contracts +package examples_core import ( "fmt" @@ -18,19 +18,19 @@ var ( allExamplesMutex = &sync.Mutex{} ) -// AddExampleProcessor adds new processor to the runtime registry of example processors. +// AddProcessor adds new processor to the runtime registry of example processors. // The 'proc' represents executable of the specific smart contract. // It must implement coretypes.Processor -func AddExampleProcessor(c *coreutil.ContractInterface) { +func AddProcessor(c *coreutil.ContractInterface) { allExamplesMutex.Lock() defer allExamplesMutex.Unlock() allExamples[c.ProgramHash] = c - fmt.Printf("----- AddExampleProcessor: name: '%s', program hash: %s, description: '%s'\n", + fmt.Printf("----- AddProcessor: name: '%s', program hash: %s, description: '%s'\n", c.Name, c.ProgramHash.String(), c.Description) } -// GetExampleProcessor retrieves smart contract processor (VM) by the hash (with existence flag) -func GetExampleProcessor(progHash hashing.HashValue) (coretypes.Processor, bool) { +// GetProcessor retrieves smart contract processor (VM) by the hash (with existence flag) +func GetProcessor(progHash hashing.HashValue) (coretypes.Processor, bool) { ret, ok := allExamples[progHash] if !ok { return nil, false diff --git a/contracts/examples_core/donatewithfeedback/dwfclient/client.go b/contracts/examples_core/ignore/donatewithfeedback/dwfclient/client.go similarity index 100% rename from contracts/examples_core/donatewithfeedback/dwfclient/client.go rename to contracts/examples_core/ignore/donatewithfeedback/dwfclient/client.go diff --git a/contracts/examples_core/donatewithfeedback/dwfimpl/impl.go b/contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go similarity index 98% rename from contracts/examples_core/donatewithfeedback/dwfimpl/impl.go rename to contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go index fd16e2398c..0f138e6939 100644 --- a/contracts/examples_core/donatewithfeedback/dwfimpl/impl.go +++ b/contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go @@ -9,7 +9,7 @@ import ( "time" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" - "github.com/iotaledger/wasp/contracts/examples_core/donatewithfeedback" + "github.com/iotaledger/wasp/contracts/examples_core/ignore/donatewithfeedback" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/kv/collections" diff --git a/contracts/examples_core/donatewithfeedback/types.go b/contracts/examples_core/ignore/donatewithfeedback/types.go similarity index 100% rename from contracts/examples_core/donatewithfeedback/types.go rename to contracts/examples_core/ignore/donatewithfeedback/types.go diff --git a/contracts/examples_core/fairauction/encode.go b/contracts/examples_core/ignore/fairauction/encode.go similarity index 100% rename from contracts/examples_core/fairauction/encode.go rename to contracts/examples_core/ignore/fairauction/encode.go diff --git a/contracts/examples_core/fairauction/faclient/client.go b/contracts/examples_core/ignore/fairauction/faclient/client.go similarity index 100% rename from contracts/examples_core/fairauction/faclient/client.go rename to contracts/examples_core/ignore/fairauction/faclient/client.go diff --git a/contracts/examples_core/fairauction/impl.go b/contracts/examples_core/ignore/fairauction/impl.go similarity index 100% rename from contracts/examples_core/fairauction/impl.go rename to contracts/examples_core/ignore/fairauction/impl.go diff --git a/contracts/examples_core/fairauction/util.go b/contracts/examples_core/ignore/fairauction/util.go similarity index 100% rename from contracts/examples_core/fairauction/util.go rename to contracts/examples_core/ignore/fairauction/util.go diff --git a/contracts/examples_core/fairroulette/frclient/client.go b/contracts/examples_core/ignore/fairroulette/frclient/client.go similarity index 100% rename from contracts/examples_core/fairroulette/frclient/client.go rename to contracts/examples_core/ignore/fairroulette/frclient/client.go diff --git a/contracts/examples_core/fairroulette/impl.go b/contracts/examples_core/ignore/fairroulette/impl.go similarity index 100% rename from contracts/examples_core/fairroulette/impl.go rename to contracts/examples_core/ignore/fairroulette/impl.go diff --git a/contracts/examples_core/inccounter/impl.go b/contracts/examples_core/inccounter/impl.go index 41c0a5c03f..cfa9b67cf6 100644 --- a/contracts/examples_core/inccounter/impl.go +++ b/contracts/examples_core/inccounter/impl.go @@ -2,7 +2,7 @@ package inccounter import ( "fmt" - "github.com/iotaledger/wasp/contracts" + "github.com/iotaledger/wasp/contracts/examples_core" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" @@ -49,7 +49,7 @@ const ( ) func init() { - contracts.AddExampleProcessor(Interface) + examples_core.AddProcessor(Interface) } func initialize(ctx coretypes.Sandbox) (dict.Dict, error) { diff --git a/contracts/examples_core/micropay/interface.go b/contracts/examples_core/micropay/interface.go index f030f83872..c09337d523 100644 --- a/contracts/examples_core/micropay/interface.go +++ b/contracts/examples_core/micropay/interface.go @@ -4,7 +4,7 @@ package micropay import ( - "github.com/iotaledger/wasp/contracts" + "github.com/iotaledger/wasp/contracts/examples_core" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" "time" @@ -32,7 +32,7 @@ func init() { coreutil.Func(FuncSettle, settle), coreutil.ViewFunc(FuncGetChannelInfo, getWarrantInfo), }) - contracts.AddExampleProcessor(Interface) + examples_core.AddProcessor(Interface) } const ( diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go b/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go index 67f068e361..7fc34bd8f2 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go +++ b/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go @@ -2,7 +2,7 @@ package test_sandbox_sc import ( - "github.com/iotaledger/wasp/contracts" + "github.com/iotaledger/wasp/contracts/examples_core" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" ) @@ -56,7 +56,7 @@ func init() { coreutil.ViewFunc(FuncJustView, testJustView), }) - contracts.AddExampleProcessor(Interface) + examples_core.AddProcessor(Interface) } const ( diff --git a/packages/vm/hardcoded/locatevm.go b/packages/vm/hardcoded/locatevm.go deleted file mode 100644 index f47fc19c24..0000000000 --- a/packages/vm/hardcoded/locatevm.go +++ /dev/null @@ -1,17 +0,0 @@ -package hardcoded - -import ( - "github.com/iotaledger/wasp/contracts" - "github.com/iotaledger/wasp/packages/hashing" - "github.com/iotaledger/wasp/packages/vm/core" -) - -func LocateHardcodedProgram(programHash hashing.HashValue) (string, bool) { - if _, err := core.GetProcessor(programHash); err == nil { - return core.VMType, true - } - if _, ok := contracts.GetExampleProcessor(programHash); ok { - return contracts.VMType, true - } - return "", false -} diff --git a/packages/vm/processors/getbuiltinvm.go b/packages/vm/processors/getbuiltinvm.go new file mode 100644 index 0000000000..7ef7912612 --- /dev/null +++ b/packages/vm/processors/getbuiltinvm.go @@ -0,0 +1,18 @@ +package processors + +import ( + "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/packages/hashing" + "github.com/iotaledger/wasp/packages/vm/core" +) + +// GetBuiltinProcessorType locates hardcoded processor: core contract or example +func GetBuiltinProcessorType(programHash hashing.HashValue) (string, bool) { + if _, err := core.GetProcessor(programHash); err == nil { + return core.VMType, true + } + if _, ok := examples_core.GetProcessor(programHash); ok { + return examples_core.VMType, true + } + return "", false +} diff --git a/packages/vm/processors/processors.go b/packages/vm/processors/processors.go index 7ce2ef8d31..c3a73c128b 100644 --- a/packages/vm/processors/processors.go +++ b/packages/vm/processors/processors.go @@ -2,7 +2,7 @@ package processors import ( "fmt" - "github.com/iotaledger/wasp/contracts" + "github.com/iotaledger/wasp/contracts/examples_core" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/vm/core" @@ -52,8 +52,8 @@ func (cps *ProcessorCache) newProcessor(programHash hashing.HashValue, programCo return err } - case contracts.VMType: - if proc, ok = contracts.GetExampleProcessor(programHash); !ok { + case examples_core.VMType: + if proc, ok = examples_core.GetProcessor(programHash); !ok { return fmt.Errorf("NewProcessor: can't load example processor with hash %s", programHash.String()) } diff --git a/packages/vm/viewcontext/viewcontext.go b/packages/vm/viewcontext/viewcontext.go index bae4e6e4c1..3da2640886 100644 --- a/packages/vm/viewcontext/viewcontext.go +++ b/packages/vm/viewcontext/viewcontext.go @@ -13,7 +13,6 @@ import ( "github.com/iotaledger/wasp/packages/state" "github.com/iotaledger/wasp/packages/vm/core/blob" "github.com/iotaledger/wasp/packages/vm/core/root" - "github.com/iotaledger/wasp/packages/vm/hardcoded" "github.com/iotaledger/wasp/packages/vm/processors" ) @@ -79,7 +78,7 @@ func (v *viewcontext) mustCallView(contractHname coretypes.Hname, epCode coretyp return nil, fmt.Errorf("failed to find contract %s: %v", contractHname, err) } proc, err := v.processors.GetOrCreateProcessor(contractRecord, func(programHash hashing.HashValue) (string, []byte, error) { - if vmtype, ok := hardcoded.LocateHardcodedProgram(programHash); ok { + if vmtype, ok := processors.GetBuiltinProcessorType(programHash); ok { return vmtype, nil, nil } return blob.LocateProgram(contractStateSubpartition(v.state, blob.Interface.Hname()), programHash) diff --git a/packages/vm/vmcontext/internal.go b/packages/vm/vmcontext/internal.go index 48ff4d2546..43428fd534 100644 --- a/packages/vm/vmcontext/internal.go +++ b/packages/vm/vmcontext/internal.go @@ -9,7 +9,7 @@ import ( "github.com/iotaledger/wasp/packages/vm/core/blob" "github.com/iotaledger/wasp/packages/vm/core/eventlog" "github.com/iotaledger/wasp/packages/vm/core/root" - "github.com/iotaledger/wasp/packages/vm/hardcoded" + "github.com/iotaledger/wasp/packages/vm/processors" ) // creditToAccount deposits transfer from request to chain account of of the called contract @@ -71,7 +71,7 @@ func (vmctx *VMContext) getFeeInfo() (balance.Color, int64, int64) { } func (vmctx *VMContext) getBinary(programHash hashing.HashValue) (string, []byte, error) { - vmtype, ok := hardcoded.LocateHardcodedProgram(programHash) + vmtype, ok := processors.GetBuiltinProcessorType(programHash) if ok { return vmtype, nil, nil } From 279245a2e3d9c04e8d0cf170f26fa01df4500d1a Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Thu, 18 Feb 2021 17:03:17 +0200 Subject: [PATCH 09/39] get rid of underscore in package names --- packages/vm/core/testcore/blob_deploy_test.go | 2 +- packages/vm/core/testcore/root_test.go | 12 ++-- .../2chains_test.go | 8 +-- .../{sandbox_tests => sbtests}/call_test.go | 46 ++++++------- .../check_ctx_test.go | 34 +++++----- .../eventlog_test.go | 62 +++++++++--------- .../init_fail_test.go | 16 ++--- .../misc_call_test.go | 24 +++---- .../sandbox_panic_test.go | 24 +++---- .../sbtestsc}/impl.go | 2 +- .../sbtestsc}/impl_accounts.go | 2 +- .../sbtestsc}/impl_check_ctx.go | 2 +- .../sbtestsc}/impl_misc.go | 2 +- .../sbtestsc}/interface.go | 2 +- .../sbtestsc}/testcore_bg.wasm | Bin .../{sandbox_tests => sbtests}/setup_test.go | 16 ++--- .../transfer_test.go | 22 +++---- .../{sandbox_tests => sbtests}/types_test.go | 8 +-- 18 files changed, 142 insertions(+), 142 deletions(-) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/2chains_test.go (93%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/call_test.go (55%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/check_ctx_test.go (55%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/eventlog_test.go (79%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/init_fail_test.go (55%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/misc_call_test.go (67%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/sandbox_panic_test.go (56%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/impl.go (99%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/impl_accounts.go (97%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/impl_check_ctx.go (99%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/impl_misc.go (99%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/interface.go (99%) rename packages/vm/core/testcore/{sandbox_tests/test_sandbox_sc => sbtests/sbtestsc}/testcore_bg.wasm (100%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/setup_test.go (89%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/transfer_test.go (92%) rename packages/vm/core/testcore/{sandbox_tests => sbtests}/types_test.go (82%) diff --git a/packages/vm/core/testcore/blob_deploy_test.go b/packages/vm/core/testcore/blob_deploy_test.go index d9cef374a0..c4aeaadef4 100644 --- a/packages/vm/core/testcore/blob_deploy_test.go +++ b/packages/vm/core/testcore/blob_deploy_test.go @@ -52,7 +52,7 @@ func TestBlobUploadTwice(t *testing.T) { require.EqualValues(t, binary, binBack) } -var wasmFile = "sandbox_tests/test_sandbox_sc/testcore_bg.wasm" +var wasmFile = "sbtests/sbtestsc/testcore_bg.wasm" func TestDeploy(t *testing.T) { env := solo.New(t, false, false) diff --git a/packages/vm/core/testcore/root_test.go b/packages/vm/core/testcore/root_test.go index 32781e9840..2d63ab20c0 100644 --- a/packages/vm/core/testcore/root_test.go +++ b/packages/vm/core/testcore/root_test.go @@ -4,7 +4,7 @@ package testcore import ( - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "testing" "github.com/iotaledger/wasp/packages/coretypes" @@ -67,7 +67,7 @@ func TestDeployExample(t *testing.T) { defer chain.WaitForEmptyBacklog() name := "testInc" - err := chain.DeployContract(nil, name, test_sandbox_sc.Interface.ProgramHash) + err := chain.DeployContract(nil, name, sbtestsc.Interface.ProgramHash) require.NoError(t, err) info, contracts := chain.GetInfo() @@ -90,7 +90,7 @@ func TestDeployExample(t *testing.T) { require.EqualValues(t, "N/A", rec.Description) require.EqualValues(t, 0, rec.OwnerFee) require.EqualValues(t, chain.OriginatorAgentID, rec.Creator) - require.EqualValues(t, test_sandbox_sc.Interface.ProgramHash, rec.ProgramHash) + require.EqualValues(t, sbtestsc.Interface.ProgramHash, rec.ProgramHash) recFind, err := chain.FindContract(name) require.NoError(t, err) @@ -103,10 +103,10 @@ func TestDeployDouble(t *testing.T) { defer chain.WaitForEmptyBacklog() name := "testInc" - err := chain.DeployContract(nil, name, test_sandbox_sc.Interface.ProgramHash) + err := chain.DeployContract(nil, name, sbtestsc.Interface.ProgramHash) require.NoError(t, err) - err = chain.DeployContract(nil, name, test_sandbox_sc.Interface.ProgramHash) + err = chain.DeployContract(nil, name, sbtestsc.Interface.ProgramHash) require.Error(t, err) info, contracts := chain.GetInfo() @@ -129,7 +129,7 @@ func TestDeployDouble(t *testing.T) { require.EqualValues(t, "N/A", rec.Description) require.EqualValues(t, 0, rec.OwnerFee) require.EqualValues(t, chain.OriginatorAgentID, rec.Creator) - require.EqualValues(t, test_sandbox_sc.Interface.ProgramHash, rec.ProgramHash) + require.EqualValues(t, sbtestsc.Interface.ProgramHash, rec.ProgramHash) } func TestChangeOwnerAuthorized(t *testing.T) { diff --git a/packages/vm/core/testcore/sandbox_tests/2chains_test.go b/packages/vm/core/testcore/sbtests/2chains_test.go similarity index 93% rename from packages/vm/core/testcore/sandbox_tests/2chains_test.go rename to packages/vm/core/testcore/sbtests/2chains_test.go index d54dbf607e..5137ed18c5 100644 --- a/packages/vm/core/testcore/sandbox_tests/2chains_test.go +++ b/packages/vm/core/testcore/sbtests/2chains_test.go @@ -1,11 +1,11 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/solo" "github.com/iotaledger/wasp/packages/vm/core/accounts" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -58,8 +58,8 @@ func test2Chains(t *testing.T, w bool) { chain2.AssertAccountBalance(accountsAgentID1, balance.ColorIOTA, 0) chain2.AssertAccountBalance(accountsAgentID2, balance.ColorIOTA, 0) - req = solo.NewCallParams(test_sandbox_sc.Name, test_sandbox_sc.FuncWithdrawToChain, - test_sandbox_sc.ParamChainID, chain1.ChainID, + req = solo.NewCallParams(sbtestsc.Name, sbtestsc.FuncWithdrawToChain, + sbtestsc.ParamChainID, chain1.ChainID, ).WithTransfer( balance.ColorIOTA, 3, ) diff --git a/packages/vm/core/testcore/sandbox_tests/call_test.go b/packages/vm/core/testcore/sbtests/call_test.go similarity index 55% rename from packages/vm/core/testcore/sandbox_tests/call_test.go rename to packages/vm/core/testcore/sbtests/call_test.go index a3f10e2239..b13d17bfd6 100644 --- a/packages/vm/core/testcore/sandbox_tests/call_test.go +++ b/packages/vm/core/testcore/sbtests/call_test.go @@ -1,10 +1,10 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -14,15 +14,15 @@ func testGetSet(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncSetInt, - test_sandbox_sc.ParamIntParamName, "ppp", - test_sandbox_sc.ParamIntParamValue, 314, + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncSetInt, + sbtestsc.ParamIntParamName, "ppp", + sbtestsc.ParamIntParamValue, 314, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) - ret, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncGetInt, - test_sandbox_sc.ParamIntParamName, "ppp") + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetInt, + sbtestsc.ParamIntParamName, "ppp") require.NoError(t, err) retInt, exists, err := codec.DecodeInt64(ret.MustGet("ppp")) @@ -36,18 +36,18 @@ func testCallRecursive(t *testing.T, w bool) { _, chain := setupChain(t, nil) cID, _ := setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncCallOnChain, - test_sandbox_sc.ParamIntParamValue, 31, - test_sandbox_sc.ParamHnameContract, cID.Hname(), - test_sandbox_sc.ParamHnameEP, coretypes.Hn(test_sandbox_sc.FuncRunRecursion), + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncCallOnChain, + sbtestsc.ParamIntParamValue, 31, + sbtestsc.ParamHnameContract, cID.Hname(), + sbtestsc.ParamHnameEP, coretypes.Hn(sbtestsc.FuncRunRecursion), ) ret, err := chain.PostRequest(req, nil) require.NoError(t, err) - ret, err = chain.CallView(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncGetCounter) + ret, err = chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncGetCounter) require.NoError(t, err) - r, exists, err := codec.DecodeInt64(ret.MustGet(test_sandbox_sc.VarCounter)) + r, exists, err := codec.DecodeInt64(ret.MustGet(sbtestsc.VarCounter)) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, 32, r) @@ -67,11 +67,11 @@ func testCallFibonacci(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - ret, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncGetFibonacci, - test_sandbox_sc.ParamIntParamValue, n, + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetFibonacci, + sbtestsc.ParamIntParamValue, n, ) require.NoError(t, err) - val, exists, err := codec.DecodeInt64(ret.MustGet(test_sandbox_sc.ParamIntParamValue)) + val, exists, err := codec.DecodeInt64(ret.MustGet(sbtestsc.ParamIntParamValue)) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, fibo(n), val) @@ -82,22 +82,22 @@ func testCallFibonacciIndirect(t *testing.T, w bool) { _, chain := setupChain(t, nil) cID, _ := setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncCallOnChain, - test_sandbox_sc.ParamIntParamValue, n, - test_sandbox_sc.ParamHnameContract, cID.Hname(), - test_sandbox_sc.ParamHnameEP, coretypes.Hn(test_sandbox_sc.FuncGetFibonacci), + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncCallOnChain, + sbtestsc.ParamIntParamValue, n, + sbtestsc.ParamHnameContract, cID.Hname(), + sbtestsc.ParamHnameEP, coretypes.Hn(sbtestsc.FuncGetFibonacci), ) ret, err := chain.PostRequest(req, nil) require.NoError(t, err) - r, exists, err := codec.DecodeInt64(ret.MustGet(test_sandbox_sc.ParamIntParamValue)) + r, exists, err := codec.DecodeInt64(ret.MustGet(sbtestsc.ParamIntParamValue)) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, fibo(n), r) - ret, err = chain.CallView(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncGetCounter) + ret, err = chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncGetCounter) require.NoError(t, err) - r, exists, err = codec.DecodeInt64(ret.MustGet(test_sandbox_sc.VarCounter)) + r, exists, err = codec.DecodeInt64(ret.MustGet(sbtestsc.VarCounter)) require.NoError(t, err) require.True(t, exists) require.EqualValues(t, 1, r) diff --git a/packages/vm/core/testcore/sandbox_tests/check_ctx_test.go b/packages/vm/core/testcore/sbtests/check_ctx_test.go similarity index 55% rename from packages/vm/core/testcore/sandbox_tests/check_ctx_test.go rename to packages/vm/core/testcore/sbtests/check_ctx_test.go index e515427ba6..9901c0974a 100644 --- a/packages/vm/core/testcore/sandbox_tests/check_ctx_test.go +++ b/packages/vm/core/testcore/sbtests/check_ctx_test.go @@ -1,9 +1,9 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -18,16 +18,16 @@ func testMainCallsFromFullEP(t *testing.T, w bool) { setupTestSandboxSC(t, chain, user, w) - contractID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(test_sandbox_sc.Interface.Name)) + contractID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(sbtestsc.Interface.Name)) agentID := coretypes.NewAgentIDFromContractID(contractID) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncCheckContextFromFullEP, - test_sandbox_sc.ParamChainID, chain.ChainID, - test_sandbox_sc.ParamAgentID, agentID, - test_sandbox_sc.ParamCaller, userAgentID, - test_sandbox_sc.ParamChainOwnerID, chain.OriginatorAgentID, - test_sandbox_sc.ParamContractID, contractID, - test_sandbox_sc.ParamContractCreator, userAgentID, + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncCheckContextFromFullEP, + sbtestsc.ParamChainID, chain.ChainID, + sbtestsc.ParamAgentID, agentID, + sbtestsc.ParamCaller, userAgentID, + sbtestsc.ParamChainOwnerID, chain.OriginatorAgentID, + sbtestsc.ParamContractID, contractID, + sbtestsc.ParamContractCreator, userAgentID, ) _, err := chain.PostRequest(req, user) require.NoError(t, err) @@ -43,15 +43,15 @@ func testMainCallsFromViewEP(t *testing.T, w bool) { setupTestSandboxSC(t, chain, user, w) - contractID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(test_sandbox_sc.Interface.Name)) + contractID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(sbtestsc.Interface.Name)) agentID := coretypes.NewAgentIDFromContractID(contractID) - _, err := chain.CallView(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncCheckContextFromViewEP, - test_sandbox_sc.ParamChainID, chain.ChainID, - test_sandbox_sc.ParamAgentID, agentID, - test_sandbox_sc.ParamChainOwnerID, chain.OriginatorAgentID, - test_sandbox_sc.ParamContractID, contractID, - test_sandbox_sc.ParamContractCreator, userAgentID, + _, err := chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncCheckContextFromViewEP, + sbtestsc.ParamChainID, chain.ChainID, + sbtestsc.ParamAgentID, agentID, + sbtestsc.ParamChainOwnerID, chain.OriginatorAgentID, + sbtestsc.ParamContractID, contractID, + sbtestsc.ParamContractCreator, userAgentID, ) require.NoError(t, err) } diff --git a/packages/vm/core/testcore/sandbox_tests/eventlog_test.go b/packages/vm/core/testcore/sbtests/eventlog_test.go similarity index 79% rename from packages/vm/core/testcore/sandbox_tests/eventlog_test.go rename to packages/vm/core/testcore/sbtests/eventlog_test.go index 062a6eeb14..c7212064a9 100644 --- a/packages/vm/core/testcore/sandbox_tests/eventlog_test.go +++ b/packages/vm/core/testcore/sbtests/eventlog_test.go @@ -1,4 +1,4 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/coretypes" @@ -7,7 +7,7 @@ import ( "github.com/iotaledger/wasp/packages/solo" "github.com/iotaledger/wasp/packages/vm/core/eventlog" "github.com/iotaledger/wasp/packages/vm/core/root" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "strconv" "strings" @@ -21,8 +21,8 @@ func testEventlogGetLast3(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) for i := 1; i < 6; i++ { - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, i, + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncEventLogGenericData, + sbtestsc.VarCounter, i, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) @@ -47,8 +47,8 @@ func testEventlogGetBetweenTs(t *testing.T, w bool) { var err error for i := 1; i < 6; i++ { req := solo.NewCallParams(SandboxSCName, - test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, i, + sbtestsc.FuncEventLogGenericData, + sbtestsc.VarCounter, i, ) _, err = chain.PostRequest(req, nil) require.NoError(t, err) @@ -58,7 +58,7 @@ func testEventlogGetBetweenTs(t *testing.T, w bool) { eventlog.ParamFromTs, 0, eventlog.ParamToTs, chain.State.Timestamp()-int64(1500*time.Millisecond), eventlog.ParamMaxLastRecords, 2, - eventlog.ParamContractHname, test_sandbox_sc.Interface.Hname(), + eventlog.ParamContractHname, sbtestsc.Interface.Hname(), ) require.NoError(t, err) @@ -71,8 +71,8 @@ func testEventLogEventData(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogEventData, + req := solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogEventData, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) @@ -80,14 +80,14 @@ func testEventLogEventData(t *testing.T, w bool) { res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetRecords, eventlog.ParamFromTs, 0, eventlog.ParamToTs, chain.State.Timestamp(), - eventlog.ParamContractHname, test_sandbox_sc.Interface.Hname(), + eventlog.ParamContractHname, sbtestsc.Interface.Hname(), ) require.NoError(t, err) array := collections.NewArrayReadOnly(res, eventlog.ParamRecords) require.EqualValues(t, 3, array.MustLen()) - str, err := chain.GetEventLogRecordsString(test_sandbox_sc.Interface.Name) + str, err := chain.GetEventLogRecordsString(sbtestsc.Interface.Name) require.NoError(t, err) t.Log(str) } @@ -101,9 +101,9 @@ func testEventLogDifferentCalls(t *testing.T, w bool) { count := 1 // events for i := 1; i <= 3; i++ { - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogEventData, - test_sandbox_sc.VarCounter, count, + req := solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogEventData, + sbtestsc.VarCounter, count, ) count++ _, err := chain.PostRequest(req, nil) @@ -111,9 +111,9 @@ func testEventLogDifferentCalls(t *testing.T, w bool) { } // generic for i := 1; i <= 2; i++ { - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, count, + req := solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogGenericData, + sbtestsc.VarCounter, count, ) count++ _, err := chain.PostRequest(req, nil) @@ -122,13 +122,13 @@ func testEventLogDifferentCalls(t *testing.T, w bool) { res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetRecords, eventlog.ParamFromTs, 0, eventlog.ParamToTs, chain.State.Timestamp(), - eventlog.ParamContractHname, test_sandbox_sc.Interface.Hname(), + eventlog.ParamContractHname, sbtestsc.Interface.Hname(), ) require.NoError(t, err) array := collections.NewArrayReadOnly(res, eventlog.ParamRecords) require.EqualValues(t, 11, array.MustLen()) - str, err := chain.GetEventLogRecordsString(test_sandbox_sc.Interface.Name) + str, err := chain.GetEventLogRecordsString(sbtestsc.Interface.Name) require.NoError(t, err) t.Log(str) @@ -143,14 +143,14 @@ func testChainLogGetNumRecords(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(SandboxSCName, - test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, solo.Saldo, + sbtestsc.FuncEventLogGenericData, + sbtestsc.VarCounter, solo.Saldo, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetNumRecords, - eventlog.ParamContractHname, test_sandbox_sc.Interface.Hname(), + eventlog.ParamContractHname, sbtestsc.Interface.Hname(), ) require.NoError(t, err) @@ -175,8 +175,8 @@ func testChainLogSandboxDeploy(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogDeploy, + req := solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogDeploy, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) @@ -203,22 +203,22 @@ func testChainLogMultiple(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogEventData, + req := solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogEventData, ) _, err := chain.PostRequest(req, nil) require.NoError(t, err) - req = solo.NewCallParams(test_sandbox_sc.Interface.Name, - test_sandbox_sc.FuncEventLogGenericData, - test_sandbox_sc.VarCounter, 33333, + req = solo.NewCallParams(sbtestsc.Interface.Name, + sbtestsc.FuncEventLogGenericData, + sbtestsc.VarCounter, 33333, ) _, err = chain.PostRequest(req, nil) require.NoError(t, err) /////Should return 4 logs records///// res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetRecords, - eventlog.ParamContractHname, test_sandbox_sc.Interface.Hname(), + eventlog.ParamContractHname, sbtestsc.Interface.Hname(), ) require.NoError(t, err) array := collections.NewArrayReadOnly(res, eventlog.ParamRecords) @@ -231,7 +231,7 @@ func testChainLogMultiple(t *testing.T, w bool) { require.EqualValues(t, 2, strings.Count(strRoot, "[req]")) require.EqualValues(t, 1, strings.Count(strRoot, "[deploy]")) - strTest, err := chain.GetEventLogRecordsString(test_sandbox_sc.Interface.Name) + strTest, err := chain.GetEventLogRecordsString(sbtestsc.Interface.Name) require.NoError(t, err) t.Log(strTest) require.EqualValues(t, 3, strings.Count(strTest, "[req]")) diff --git a/packages/vm/core/testcore/sandbox_tests/init_fail_test.go b/packages/vm/core/testcore/sbtests/init_fail_test.go similarity index 55% rename from packages/vm/core/testcore/sandbox_tests/init_fail_test.go rename to packages/vm/core/testcore/sbtests/init_fail_test.go index 32e398e6b8..669cddb7d2 100644 --- a/packages/vm/core/testcore/sandbox_tests/init_fail_test.go +++ b/packages/vm/core/testcore/sbtests/init_fail_test.go @@ -1,8 +1,8 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -10,29 +10,29 @@ import ( func TestSuccess(t *testing.T) { env := solo.New(t, false, false) chain := env.NewChain(nil, "chain1") - err := chain.DeployContract(nil, test_sandbox_sc.Name, test_sandbox_sc.Interface.ProgramHash) + err := chain.DeployContract(nil, sbtestsc.Name, sbtestsc.Interface.ProgramHash) require.NoError(t, err) } func TestFail(t *testing.T) { env := solo.New(t, false, false) chain := env.NewChain(nil, "chain1") - err := chain.DeployContract(nil, test_sandbox_sc.Name, test_sandbox_sc.Interface.ProgramHash, - test_sandbox_sc.ParamFail, 1) + err := chain.DeployContract(nil, sbtestsc.Name, sbtestsc.Interface.ProgramHash, + sbtestsc.ParamFail, 1) require.Error(t, err) } func TestFailRepeat(t *testing.T) { env := solo.New(t, false, false) chain := env.NewChain(nil, "chain1") - err := chain.DeployContract(nil, test_sandbox_sc.Name, test_sandbox_sc.Interface.ProgramHash, - test_sandbox_sc.ParamFail, 1) + err := chain.DeployContract(nil, sbtestsc.Name, sbtestsc.Interface.ProgramHash, + sbtestsc.ParamFail, 1) require.Error(t, err) _, rec := chain.GetInfo() require.EqualValues(t, 4, len(rec)) // repeat must succeed - err = chain.DeployContract(nil, test_sandbox_sc.Name, test_sandbox_sc.Interface.ProgramHash) + err = chain.DeployContract(nil, sbtestsc.Name, sbtestsc.Interface.ProgramHash) require.NoError(t, err) _, rec = chain.GetInfo() require.EqualValues(t, 5, len(rec)) diff --git a/packages/vm/core/testcore/sandbox_tests/misc_call_test.go b/packages/vm/core/testcore/sbtests/misc_call_test.go similarity index 67% rename from packages/vm/core/testcore/sandbox_tests/misc_call_test.go rename to packages/vm/core/testcore/sbtests/misc_call_test.go index 6d65eea003..8c2d25f578 100644 --- a/packages/vm/core/testcore/sandbox_tests/misc_call_test.go +++ b/packages/vm/core/testcore/sbtests/misc_call_test.go @@ -1,9 +1,9 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -13,10 +13,10 @@ func testChainOwnerIDView(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - ret, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncChainOwnerIDView) + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncChainOwnerIDView) require.NoError(t, err) - c := ret.MustGet(test_sandbox_sc.ParamChainOwnerID) + c := ret.MustGet(sbtestsc.ParamChainOwnerID) require.EqualValues(t, chain.OriginatorAgentID.Bytes(), c) } @@ -26,11 +26,11 @@ func testChainOwnerIDFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncChainOwnerIDFull) + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncChainOwnerIDFull) ret, err := chain.PostRequest(req, nil) require.NoError(t, err) - c := ret.MustGet(test_sandbox_sc.ParamChainOwnerID) + c := ret.MustGet(sbtestsc.ParamChainOwnerID) require.EqualValues(t, chain.OriginatorAgentID.Bytes(), c) } @@ -39,10 +39,10 @@ func testContractIDView(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - ret, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncContractIDView) + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncContractIDView) require.NoError(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(SandboxSCName)) - require.EqualValues(t, cID[:], ret.MustGet(test_sandbox_sc.VarContractID)) + require.EqualValues(t, cID[:], ret.MustGet(sbtestsc.VarContractID)) } func TestContractIDFull(t *testing.T) { run2(t, testContractIDFull) } @@ -50,11 +50,11 @@ func testContractIDFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncContractIDFull) + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncContractIDFull) ret, err := chain.PostRequest(req, nil) require.NoError(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(SandboxSCName)) - require.EqualValues(t, cID[:], ret.MustGet(test_sandbox_sc.VarContractID)) + require.EqualValues(t, cID[:], ret.MustGet(sbtestsc.VarContractID)) } func TestSandboxCall(t *testing.T) { run2(t, testSandboxCall) } @@ -62,9 +62,9 @@ func testSandboxCall(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - ret, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncSandboxCall) + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncSandboxCall) require.NoError(t, err) - d := ret.MustGet(test_sandbox_sc.VarSandboxCall) + d := ret.MustGet(sbtestsc.VarSandboxCall) require.EqualValues(t, "'solo' testing chain", string(d)) } diff --git a/packages/vm/core/testcore/sandbox_tests/sandbox_panic_test.go b/packages/vm/core/testcore/sbtests/sandbox_panic_test.go similarity index 56% rename from packages/vm/core/testcore/sandbox_tests/sandbox_panic_test.go rename to packages/vm/core/testcore/sbtests/sandbox_panic_test.go index 13bcec9b3c..e73a9157e9 100644 --- a/packages/vm/core/testcore/sandbox_tests/sandbox_panic_test.go +++ b/packages/vm/core/testcore/sbtests/sandbox_panic_test.go @@ -1,8 +1,8 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "strings" "testing" @@ -13,10 +13,10 @@ func testPanicFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncPanicFullEP) + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncPanicFullEP) _, err := chain.PostRequest(req, nil) require.Error(t, err) - require.EqualValues(t, 1, strings.Count(err.Error(), test_sandbox_sc.MsgFullPanic)) + require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgFullPanic)) } func TestPanicViewCall(t *testing.T) { run2(t, testPanicViewCall) } @@ -24,9 +24,9 @@ func testPanicViewCall(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - _, err := chain.CallView(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncPanicViewEP) + _, err := chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncPanicViewEP) require.Error(t, err) - require.EqualValues(t, 1, strings.Count(err.Error(), test_sandbox_sc.MsgViewPanic)) + require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgViewPanic)) } func TestCallPanicFull(t *testing.T) { run2(t, testCallPanicFull) } @@ -34,10 +34,10 @@ func testCallPanicFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncCallPanicFullEP) + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncCallPanicFullEP) _, err := chain.PostRequest(req, nil) require.Error(t, err) - require.EqualValues(t, 1, strings.Count(err.Error(), test_sandbox_sc.MsgFullPanic)) + require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgFullPanic)) } func TestCallPanicViewFromFull(t *testing.T) { run2(t, testCallPanicViewFromFull) } @@ -45,10 +45,10 @@ func testCallPanicViewFromFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncCallPanicViewEPFromFull) + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncCallPanicViewEPFromFull) _, err := chain.PostRequest(req, nil) require.Error(t, err) - require.EqualValues(t, 1, strings.Count(err.Error(), test_sandbox_sc.MsgViewPanic)) + require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgViewPanic)) } func TestCallPanicViewFromView(t *testing.T) { run2(t, testCallPanicViewFromView) } @@ -56,7 +56,7 @@ func testCallPanicViewFromView(t *testing.T, w bool) { _, chain := setupChain(t, nil) setupTestSandboxSC(t, chain, nil, w) - _, err := chain.CallView(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncCallPanicViewEPFromView) + _, err := chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncCallPanicViewEPFromView) require.Error(t, err) - require.EqualValues(t, 1, strings.Count(err.Error(), test_sandbox_sc.MsgViewPanic)) + require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgViewPanic)) } diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl.go similarity index 99% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl.go rename to packages/vm/core/testcore/sbtests/sbtestsc/impl.go index c10a758ca1..176e48db59 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl.go @@ -1,4 +1,4 @@ -package test_sandbox_sc +package sbtestsc import ( "fmt" diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_accounts.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_accounts.go similarity index 97% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_accounts.go rename to packages/vm/core/testcore/sbtests/sbtestsc/impl_accounts.go index 629f2172ff..4150790fdb 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_accounts.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_accounts.go @@ -1,4 +1,4 @@ -package test_sandbox_sc +package sbtestsc import ( "fmt" diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_check_ctx.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go similarity index 99% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_check_ctx.go rename to packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go index 2e25898400..4f2b079622 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_check_ctx.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go @@ -1,4 +1,4 @@ -package test_sandbox_sc +package sbtestsc import ( "github.com/iotaledger/wasp/packages/coretypes" diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_misc.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go similarity index 99% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_misc.go rename to packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go index c74c1f5a40..bba5b2dbc1 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/impl_misc.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go @@ -1,4 +1,4 @@ -package test_sandbox_sc +package sbtestsc import ( "github.com/iotaledger/wasp/packages/coretypes" diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go similarity index 99% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go rename to packages/vm/core/testcore/sbtests/sbtestsc/interface.go index 7fc34bd8f2..eb62ab9f84 100644 --- a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/interface.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go @@ -1,5 +1,5 @@ // smart contract for testing -package test_sandbox_sc +package sbtestsc import ( "github.com/iotaledger/wasp/contracts/examples_core" diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm similarity index 100% rename from packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm rename to packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm diff --git a/packages/vm/core/testcore/sandbox_tests/setup_test.go b/packages/vm/core/testcore/sbtests/setup_test.go similarity index 89% rename from packages/vm/core/testcore/sandbox_tests/setup_test.go rename to packages/vm/core/testcore/sbtests/setup_test.go index 8c90e35c5b..76d7e3c6c6 100644 --- a/packages/vm/core/testcore/sandbox_tests/setup_test.go +++ b/packages/vm/core/testcore/sbtests/setup_test.go @@ -1,4 +1,4 @@ -package sandbox_tests +package sbtests import ( "fmt" @@ -8,7 +8,7 @@ import ( "github.com/iotaledger/wasp/packages/solo" "github.com/iotaledger/wasp/packages/testutil" "github.com/iotaledger/wasp/packages/vm/core/root" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -24,8 +24,8 @@ const ( ) var ( - WasmFileTestcore = "test_sandbox_sc/testcore_bg.wasm" - WasmFileErc20 = "test_sandbox_sc/erc20_bg.wasm" + WasmFileTestcore = "sbtestsc/testcore_bg.wasm" + WasmFileErc20 = "sbtestsc/erc20_bg.wasm" SandboxSCName = "test_sandbox" ) @@ -67,13 +67,13 @@ func setupTestSandboxSC(t *testing.T, chain *solo.Chain, user signaturescheme.Si err = chain.DeployWasmContract(user, SandboxSCName, WasmFileTestcore) extraToken = 1 } else { - err = chain.DeployContract(user, SandboxSCName, test_sandbox_sc.Interface.ProgramHash) + err = chain.DeployContract(user, SandboxSCName, sbtestsc.Interface.ProgramHash) extraToken = 0 } require.NoError(t, err) - deployed := coretypes.NewContractID(chain.ChainID, coretypes.Hn(test_sandbox_sc.Interface.Name)) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncDoNothing) + deployed := coretypes.NewContractID(chain.ChainID, coretypes.Hn(sbtestsc.Interface.Name)) + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncDoNothing) _, err = chain.PostRequest(req, user) require.NoError(t, err) t.Logf("deployed test_sandbox'%s': %s", SandboxSCName, coretypes.Hn(SandboxSCName)) @@ -98,7 +98,7 @@ func setupERC20(t *testing.T, chain *solo.Chain, user signaturescheme.SignatureS ) require.NoError(t, err) - deployed := coretypes.NewContractID(chain.ChainID, coretypes.Hn(test_sandbox_sc.Interface.Name)) + deployed := coretypes.NewContractID(chain.ChainID, coretypes.Hn(sbtestsc.Interface.Name)) t.Logf("deployed erc20'%s': %s -- %s", ERC20_NAME, coretypes.Hn(ERC20_NAME), deployed) return deployed } diff --git a/packages/vm/core/testcore/sandbox_tests/transfer_test.go b/packages/vm/core/testcore/sbtests/transfer_test.go similarity index 92% rename from packages/vm/core/testcore/sandbox_tests/transfer_test.go rename to packages/vm/core/testcore/sbtests/transfer_test.go index 13a2d83672..bdf651aa04 100644 --- a/packages/vm/core/testcore/sandbox_tests/transfer_test.go +++ b/packages/vm/core/testcore/sbtests/transfer_test.go @@ -1,4 +1,4 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" @@ -7,7 +7,7 @@ import ( "github.com/iotaledger/wasp/packages/testutil" "github.com/iotaledger/wasp/packages/vm/core/accounts" "github.com/iotaledger/wasp/packages/vm/core/root" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -17,7 +17,7 @@ func testDoNothing(t *testing.T, w bool) { env, chain := setupChain(t, nil) cID, extraToken := setupTestSandboxSC(t, chain, nil, w) cAID := coretypes.NewAgentIDFromContractID(cID) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncDoNothing). + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncDoNothing). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, nil) require.NoError(t, err) @@ -37,7 +37,7 @@ func testDoNothingUser(t *testing.T, w bool) { userAgentID := coretypes.NewAgentIDFromAddress(user.Address()) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncDoNothing). + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncDoNothing). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, user) require.NoError(t, err) @@ -61,7 +61,7 @@ func testWithdrawToAddress(t *testing.T, w bool) { userAddress := user.Address() userAgentID := coretypes.NewAgentIDFromAddress(userAddress) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncDoNothing). + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncDoNothing). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, user) require.NoError(t, err) @@ -73,8 +73,8 @@ func testWithdrawToAddress(t *testing.T, w bool) { env.AssertAddressBalance(chain.OriginatorAddress, balance.ColorIOTA, testutil.RequestFundsAmount-1-4-extraToken) env.AssertAddressBalance(userAddress, balance.ColorIOTA, testutil.RequestFundsAmount-1-42) - req = solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncSendToAddress, - test_sandbox_sc.ParamAddress, userAddress, + req = solo.NewCallParams(SandboxSCName, sbtestsc.FuncSendToAddress, + sbtestsc.ParamAddress, userAddress, ) _, err = chain.PostRequest(req, nil) require.NoError(t, err) @@ -104,7 +104,7 @@ func testDoPanicUser(t *testing.T, w bool) { env.AssertAddressBalance(chain.OriginatorAddress, balance.ColorIOTA, testutil.RequestFundsAmount-1-4-extraToken) env.AssertAddressBalance(userAddress, balance.ColorIOTA, testutil.RequestFundsAmount) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncPanicFullEP). + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncPanicFullEP). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, user) require.Error(t, err) @@ -134,7 +134,7 @@ func testDoPanicUserFeeless(t *testing.T, w bool) { env.AssertAddressBalance(chain.OriginatorAddress, balance.ColorIOTA, testutil.RequestFundsAmount-1-4-extraToken) env.AssertAddressBalance(userAddress, balance.ColorIOTA, testutil.RequestFundsAmount) - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncPanicFullEP). + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncPanicFullEP). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, user) require.Error(t, err) @@ -187,7 +187,7 @@ func testDoPanicUserFee(t *testing.T, w bool) { env.AssertAddressBalance(chain.OriginatorAddress, balance.ColorIOTA, testutil.RequestFundsAmount-1-5-extraToken) env.AssertAddressBalance(userAddress, balance.ColorIOTA, testutil.RequestFundsAmount) - req = solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncPanicFullEP). + req = solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncPanicFullEP). WithTransfer(balance.ColorIOTA, 42) _, err = chain.PostRequest(req, user) require.Error(t, err) @@ -218,7 +218,7 @@ func testRequestToView(t *testing.T, w bool) { env.AssertAddressBalance(userAddress, balance.ColorIOTA, testutil.RequestFundsAmount) // sending request to the view entry point should return an error and invoke fallback for tokens - req := solo.NewCallParams(test_sandbox_sc.Interface.Name, test_sandbox_sc.FuncJustView). + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncJustView). WithTransfer(balance.ColorIOTA, 42) _, err := chain.PostRequest(req, user) require.Error(t, err) diff --git a/packages/vm/core/testcore/sandbox_tests/types_test.go b/packages/vm/core/testcore/sbtests/types_test.go similarity index 82% rename from packages/vm/core/testcore/sandbox_tests/types_test.go rename to packages/vm/core/testcore/sbtests/types_test.go index 503d62eead..541c9f53a3 100644 --- a/packages/vm/core/testcore/sandbox_tests/types_test.go +++ b/packages/vm/core/testcore/sbtests/types_test.go @@ -1,10 +1,10 @@ -package sandbox_tests +package sbtests import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/solo" - "github.com/iotaledger/wasp/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" "testing" ) @@ -14,7 +14,7 @@ func testTypesFull(t *testing.T, w bool) { _, chain := setupChain(t, nil) cID, _ := setupTestSandboxSC(t, chain, nil, w) - req := solo.NewCallParams(SandboxSCName, test_sandbox_sc.FuncPassTypesFull, + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncPassTypesFull, "string", "string", "string-0", "", "int64", 42, @@ -36,7 +36,7 @@ func testTypesView(t *testing.T, w bool) { _, chain := setupChain(t, nil) cID, _ := setupTestSandboxSC(t, chain, nil, w) - _, err := chain.CallView(SandboxSCName, test_sandbox_sc.FuncPassTypesView, + _, err := chain.CallView(SandboxSCName, sbtestsc.FuncPassTypesView, "string", "string", "string-0", "", "int64", 42, From a553f0c0c7929551056e0b01253c3664cc16c707 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Thu, 18 Feb 2021 17:13:01 +0200 Subject: [PATCH 10/39] get rid of underscore in package names --- contracts/{examples_core => native}/getproc.go | 2 +- .../ignore/donatewithfeedback/dwfclient/client.go | 0 .../ignore/donatewithfeedback/dwfimpl/impl.go | 2 +- .../ignore/donatewithfeedback/types.go | 0 .../{examples_core => native}/ignore/fairauction/encode.go | 0 .../ignore/fairauction/faclient/client.go | 0 .../{examples_core => native}/ignore/fairauction/impl.go | 0 .../{examples_core => native}/ignore/fairauction/util.go | 0 .../ignore/fairroulette/frclient/client.go | 0 .../{examples_core => native}/ignore/fairroulette/impl.go | 0 contracts/{examples_core => native}/inccounter/impl.go | 4 ++-- .../{examples_core => native}/inccounter/inccounter_test.go | 0 contracts/{examples_core => native}/micropay/impl.go | 0 contracts/{examples_core => native}/micropay/interface.go | 4 ++-- .../{examples_core => native}/micropay/micropay_test.go | 0 contracts/{examples_core => native}/micropay/payment.go | 0 contracts/{examples_core => native}/micropay/readme.md | 0 contracts/{examples_core => native}/tokenregistry/encode.go | 0 contracts/{examples_core => native}/tokenregistry/impl.go | 0 .../tokenregistry/trclient/client.go | 0 packages/vm/core/testcore/sbtests/sbtestsc/interface.go | 4 ++-- packages/vm/processors/getbuiltinvm.go | 6 +++--- packages/vm/processors/processors.go | 6 +++--- plugins/globals/plugin.go | 2 +- tools/cluster/tests/account_test.go | 2 +- tools/cluster/tests/deploy_test.go | 2 +- tools/cluster/tests/post_test.go | 2 +- 27 files changed, 18 insertions(+), 18 deletions(-) rename contracts/{examples_core => native}/getproc.go (98%) rename contracts/{examples_core => native}/ignore/donatewithfeedback/dwfclient/client.go (100%) rename contracts/{examples_core => native}/ignore/donatewithfeedback/dwfimpl/impl.go (98%) rename contracts/{examples_core => native}/ignore/donatewithfeedback/types.go (100%) rename contracts/{examples_core => native}/ignore/fairauction/encode.go (100%) rename contracts/{examples_core => native}/ignore/fairauction/faclient/client.go (100%) rename contracts/{examples_core => native}/ignore/fairauction/impl.go (100%) rename contracts/{examples_core => native}/ignore/fairauction/util.go (100%) rename contracts/{examples_core => native}/ignore/fairroulette/frclient/client.go (100%) rename contracts/{examples_core => native}/ignore/fairroulette/impl.go (100%) rename contracts/{examples_core => native}/inccounter/impl.go (98%) rename contracts/{examples_core => native}/inccounter/inccounter_test.go (100%) rename contracts/{examples_core => native}/micropay/impl.go (100%) rename contracts/{examples_core => native}/micropay/interface.go (93%) rename contracts/{examples_core => native}/micropay/micropay_test.go (100%) rename contracts/{examples_core => native}/micropay/payment.go (100%) rename contracts/{examples_core => native}/micropay/readme.md (100%) rename contracts/{examples_core => native}/tokenregistry/encode.go (100%) rename contracts/{examples_core => native}/tokenregistry/impl.go (100%) rename contracts/{examples_core => native}/tokenregistry/trclient/client.go (100%) diff --git a/contracts/examples_core/getproc.go b/contracts/native/getproc.go similarity index 98% rename from contracts/examples_core/getproc.go rename to contracts/native/getproc.go index 2e4bc99d93..dac9ba46a4 100644 --- a/contracts/examples_core/getproc.go +++ b/contracts/native/getproc.go @@ -1,7 +1,7 @@ // Copyright 2020 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -package examples_core +package native import ( "fmt" diff --git a/contracts/examples_core/ignore/donatewithfeedback/dwfclient/client.go b/contracts/native/ignore/donatewithfeedback/dwfclient/client.go similarity index 100% rename from contracts/examples_core/ignore/donatewithfeedback/dwfclient/client.go rename to contracts/native/ignore/donatewithfeedback/dwfclient/client.go diff --git a/contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go b/contracts/native/ignore/donatewithfeedback/dwfimpl/impl.go similarity index 98% rename from contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go rename to contracts/native/ignore/donatewithfeedback/dwfimpl/impl.go index 0f138e6939..05687a1b4e 100644 --- a/contracts/examples_core/ignore/donatewithfeedback/dwfimpl/impl.go +++ b/contracts/native/ignore/donatewithfeedback/dwfimpl/impl.go @@ -9,7 +9,7 @@ import ( "time" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" - "github.com/iotaledger/wasp/contracts/examples_core/ignore/donatewithfeedback" + "github.com/iotaledger/wasp/contracts/native/ignore/donatewithfeedback" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/kv/collections" diff --git a/contracts/examples_core/ignore/donatewithfeedback/types.go b/contracts/native/ignore/donatewithfeedback/types.go similarity index 100% rename from contracts/examples_core/ignore/donatewithfeedback/types.go rename to contracts/native/ignore/donatewithfeedback/types.go diff --git a/contracts/examples_core/ignore/fairauction/encode.go b/contracts/native/ignore/fairauction/encode.go similarity index 100% rename from contracts/examples_core/ignore/fairauction/encode.go rename to contracts/native/ignore/fairauction/encode.go diff --git a/contracts/examples_core/ignore/fairauction/faclient/client.go b/contracts/native/ignore/fairauction/faclient/client.go similarity index 100% rename from contracts/examples_core/ignore/fairauction/faclient/client.go rename to contracts/native/ignore/fairauction/faclient/client.go diff --git a/contracts/examples_core/ignore/fairauction/impl.go b/contracts/native/ignore/fairauction/impl.go similarity index 100% rename from contracts/examples_core/ignore/fairauction/impl.go rename to contracts/native/ignore/fairauction/impl.go diff --git a/contracts/examples_core/ignore/fairauction/util.go b/contracts/native/ignore/fairauction/util.go similarity index 100% rename from contracts/examples_core/ignore/fairauction/util.go rename to contracts/native/ignore/fairauction/util.go diff --git a/contracts/examples_core/ignore/fairroulette/frclient/client.go b/contracts/native/ignore/fairroulette/frclient/client.go similarity index 100% rename from contracts/examples_core/ignore/fairroulette/frclient/client.go rename to contracts/native/ignore/fairroulette/frclient/client.go diff --git a/contracts/examples_core/ignore/fairroulette/impl.go b/contracts/native/ignore/fairroulette/impl.go similarity index 100% rename from contracts/examples_core/ignore/fairroulette/impl.go rename to contracts/native/ignore/fairroulette/impl.go diff --git a/contracts/examples_core/inccounter/impl.go b/contracts/native/inccounter/impl.go similarity index 98% rename from contracts/examples_core/inccounter/impl.go rename to contracts/native/inccounter/impl.go index cfa9b67cf6..cd7f9c5e4b 100644 --- a/contracts/examples_core/inccounter/impl.go +++ b/contracts/native/inccounter/impl.go @@ -2,7 +2,7 @@ package inccounter import ( "fmt" - "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/contracts/native" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" @@ -49,7 +49,7 @@ const ( ) func init() { - examples_core.AddProcessor(Interface) + native.AddProcessor(Interface) } func initialize(ctx coretypes.Sandbox) (dict.Dict, error) { diff --git a/contracts/examples_core/inccounter/inccounter_test.go b/contracts/native/inccounter/inccounter_test.go similarity index 100% rename from contracts/examples_core/inccounter/inccounter_test.go rename to contracts/native/inccounter/inccounter_test.go diff --git a/contracts/examples_core/micropay/impl.go b/contracts/native/micropay/impl.go similarity index 100% rename from contracts/examples_core/micropay/impl.go rename to contracts/native/micropay/impl.go diff --git a/contracts/examples_core/micropay/interface.go b/contracts/native/micropay/interface.go similarity index 93% rename from contracts/examples_core/micropay/interface.go rename to contracts/native/micropay/interface.go index c09337d523..63dd48bab8 100644 --- a/contracts/examples_core/micropay/interface.go +++ b/contracts/native/micropay/interface.go @@ -4,7 +4,7 @@ package micropay import ( - "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/contracts/native" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" "time" @@ -32,7 +32,7 @@ func init() { coreutil.Func(FuncSettle, settle), coreutil.ViewFunc(FuncGetChannelInfo, getWarrantInfo), }) - examples_core.AddProcessor(Interface) + native.AddProcessor(Interface) } const ( diff --git a/contracts/examples_core/micropay/micropay_test.go b/contracts/native/micropay/micropay_test.go similarity index 100% rename from contracts/examples_core/micropay/micropay_test.go rename to contracts/native/micropay/micropay_test.go diff --git a/contracts/examples_core/micropay/payment.go b/contracts/native/micropay/payment.go similarity index 100% rename from contracts/examples_core/micropay/payment.go rename to contracts/native/micropay/payment.go diff --git a/contracts/examples_core/micropay/readme.md b/contracts/native/micropay/readme.md similarity index 100% rename from contracts/examples_core/micropay/readme.md rename to contracts/native/micropay/readme.md diff --git a/contracts/examples_core/tokenregistry/encode.go b/contracts/native/tokenregistry/encode.go similarity index 100% rename from contracts/examples_core/tokenregistry/encode.go rename to contracts/native/tokenregistry/encode.go diff --git a/contracts/examples_core/tokenregistry/impl.go b/contracts/native/tokenregistry/impl.go similarity index 100% rename from contracts/examples_core/tokenregistry/impl.go rename to contracts/native/tokenregistry/impl.go diff --git a/contracts/examples_core/tokenregistry/trclient/client.go b/contracts/native/tokenregistry/trclient/client.go similarity index 100% rename from contracts/examples_core/tokenregistry/trclient/client.go rename to contracts/native/tokenregistry/trclient/client.go diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go index eb62ab9f84..7088e491e7 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go @@ -2,7 +2,7 @@ package sbtestsc import ( - "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/contracts/native" "github.com/iotaledger/wasp/packages/coretypes/coreutil" "github.com/iotaledger/wasp/packages/hashing" ) @@ -56,7 +56,7 @@ func init() { coreutil.ViewFunc(FuncJustView, testJustView), }) - examples_core.AddProcessor(Interface) + native.AddProcessor(Interface) } const ( diff --git a/packages/vm/processors/getbuiltinvm.go b/packages/vm/processors/getbuiltinvm.go index 7ef7912612..0ea301b769 100644 --- a/packages/vm/processors/getbuiltinvm.go +++ b/packages/vm/processors/getbuiltinvm.go @@ -1,7 +1,7 @@ package processors import ( - "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/contracts/native" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/vm/core" ) @@ -11,8 +11,8 @@ func GetBuiltinProcessorType(programHash hashing.HashValue) (string, bool) { if _, err := core.GetProcessor(programHash); err == nil { return core.VMType, true } - if _, ok := examples_core.GetProcessor(programHash); ok { - return examples_core.VMType, true + if _, ok := native.GetProcessor(programHash); ok { + return native.VMType, true } return "", false } diff --git a/packages/vm/processors/processors.go b/packages/vm/processors/processors.go index c3a73c128b..59befa6342 100644 --- a/packages/vm/processors/processors.go +++ b/packages/vm/processors/processors.go @@ -2,7 +2,7 @@ package processors import ( "fmt" - "github.com/iotaledger/wasp/contracts/examples_core" + "github.com/iotaledger/wasp/contracts/native" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/vm/core" @@ -52,8 +52,8 @@ func (cps *ProcessorCache) newProcessor(programHash hashing.HashValue, programCo return err } - case examples_core.VMType: - if proc, ok = examples_core.GetProcessor(programHash); !ok { + case native.VMType: + if proc, ok = native.GetProcessor(programHash); !ok { return fmt.Errorf("NewProcessor: can't load example processor with hash %s", programHash.String()) } diff --git a/plugins/globals/plugin.go b/plugins/globals/plugin.go index 1dd58cd177..8b93d7f64b 100644 --- a/plugins/globals/plugin.go +++ b/plugins/globals/plugin.go @@ -3,7 +3,7 @@ package globals import ( "github.com/iotaledger/hive.go/node" - _ "github.com/iotaledger/wasp/contracts/examples_core/inccounter" + _ "github.com/iotaledger/wasp/contracts/native/inccounter" "github.com/iotaledger/wasp/packages/vm/viewcontext" ) diff --git a/tools/cluster/tests/account_test.go b/tools/cluster/tests/account_test.go index a8b9bbfdb8..ec247c6fb4 100644 --- a/tools/cluster/tests/account_test.go +++ b/tools/cluster/tests/account_test.go @@ -8,7 +8,7 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/client/chainclient" - "github.com/iotaledger/wasp/contracts/examples_core/inccounter" + "github.com/iotaledger/wasp/contracts/native/inccounter" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/kv/collections" diff --git a/tools/cluster/tests/deploy_test.go b/tools/cluster/tests/deploy_test.go index ffcf9d78db..5242114052 100644 --- a/tools/cluster/tests/deploy_test.go +++ b/tools/cluster/tests/deploy_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/iotaledger/wasp/client/chainclient" - "github.com/iotaledger/wasp/contracts/examples_core/inccounter" + "github.com/iotaledger/wasp/contracts/native/inccounter" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/codec" diff --git a/tools/cluster/tests/post_test.go b/tools/cluster/tests/post_test.go index 2307af30a7..80f16998a5 100644 --- a/tools/cluster/tests/post_test.go +++ b/tools/cluster/tests/post_test.go @@ -8,7 +8,7 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/client/chainclient" - "github.com/iotaledger/wasp/contracts/examples_core/inccounter" + "github.com/iotaledger/wasp/contracts/native/inccounter" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/kv/codec" From bcfc28d083c7466393c528cd2a4ce488fd39fac1 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Thu, 18 Feb 2021 14:19:58 -0800 Subject: [PATCH 11/39] added logging to all SC functions --- contracts/rust/dividend/src/dividend.rs | 4 + contracts/rust/dividend/test/dividend_bg.wasm | Bin 34244 -> 34493 bytes .../src/donatewithfeedback.rs | 14 ++- .../test/donatewithfeedback_bg.wasm | Bin 35898 -> 36202 bytes contracts/rust/erc20/src/erc20.rs | 7 +- contracts/rust/erc20/test/erc20_bg.wasm | Bin 33543 -> 33811 bytes contracts/rust/fairauction/src/fairauction.rs | 12 ++- .../rust/fairauction/test/fairauction_bg.wasm | Bin 42098 -> 42658 bytes .../rust/fairroulette/src/fairroulette.rs | 8 ++ .../fairroulette/test/fairroulette_bg.wasm | Bin 36492 -> 37038 bytes contracts/rust/helloworld/src/helloworld.rs | 2 +- .../rust/helloworld/test/helloworld_bg.wasm | Bin 15540 -> 15544 bytes contracts/rust/testcore/src/testcore.rs | 97 +++++++++++------- contracts/rust/testcore/test | Bin 0 -> 47418 bytes .../rust/tokenregistry/src/tokenregistry.rs | 8 ++ .../tokenregistry/test/tokenregistry_bg.wasm | Bin 31584 -> 32255 bytes .../test_sandbox_sc/testcore_bg.wasm | Bin 45580 -> 47418 bytes 17 files changed, 111 insertions(+), 41 deletions(-) create mode 100644 contracts/rust/testcore/test diff --git a/contracts/rust/dividend/src/dividend.rs b/contracts/rust/dividend/src/dividend.rs index 882e032eda..7518460580 100644 --- a/contracts/rust/dividend/src/dividend.rs +++ b/contracts/rust/dividend/src/dividend.rs @@ -7,6 +7,7 @@ use crate::*; use crate::types::*; pub fn func_divide(ctx: &ScFuncContext) { + ctx.log("dividend.divide"); let amount = ctx.balances().balance(&ScColor::IOTA); if amount == 0 { ctx.panic("Nothing to divide"); @@ -32,9 +33,11 @@ pub fn func_divide(ctx: &ScFuncContext) { let remainder = amount - parts; ctx.log(&("Remainder in contract: ".to_string() + &remainder.to_string())); } + ctx.log("dividend.divide ok"); } pub fn func_member(ctx: &ScFuncContext) { + ctx.log("dividend.member"); // only creator can add members ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -67,4 +70,5 @@ pub fn func_member(ctx: &ScFuncContext) { total_factor.set_value(total); members.get_bytes(size).set_value(&member.to_bytes()); ctx.log(&("Appended: ".to_string() + &member.address.to_string())); + ctx.log("dividend.member ok"); } diff --git a/contracts/rust/dividend/test/dividend_bg.wasm b/contracts/rust/dividend/test/dividend_bg.wasm index b04ab8d313ff18fe5ad232112b75f2e3dbef16f9..f9d4b0da97e21069765773e445e40a97ccd6c275 100644 GIT binary patch delta 6726 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 delta 6462 zcma)AdsI|Mn!i=Iy8#>IHXx#a+y)=bGw6heuSlWz!e^pU6EVi$BNQ_2fH!dm~ z48(Gk$>C(ogdE!p85wc*uvxN)nRWKK6J|rQX+~H@zJu2E$5&8S~_?kYmr6# z5!NP8@SmeytyiIaM}HUX*D)zF=ty_9TQ>y?&6Pl@2*E}P5 zt!R@gqV{3VzehbtGov=5T^mi~W6|?-Z7Z3YqYSh3eVGoS*9v=G(Qd5)@5qDO(Ni!h zE~daud{Zyx8mupld0TC)D7>k>ai$S5Yr2*>%0x(R9yhb%3eD0)FnFj2%Mb;J{h1os z=>nx1+530yXNv z{~B&~kL33ean)9$UXYk(+#sUYCa9074G__9OQ?^i4H9wFmQWv28zSO!lElC^4a7|u zjC(VM5?tk4*;bQv5_$h=w8gTKvpuy)+C4gOuU1 z+$~6Cs(RpL!Jae}|3DVyxJq;d5vCJb&Sg|yro(jly{fRvjVEGh3RIR*Ey;I`AC7@e zJ3WL>t)4C$oh)p4B7xB9U_zlmCQNGwv}j2FYeJf#07EgUB!L=VB;;}wb5dfVTTP() z8{YEX#2i(C*w(ddkCLSU1^XoU=L*bul#`HO9WJClkN65D2h@AjGN}tC2+vUgUn-jlv z17d*|IhZ|N`lrO=q+XbExlG|QHCR;ytSiIR;&hc2>acJ(+|NJ_nCcSaBThlZerE<9 z@6n76oolDQt_RLVb4P$5&eFtrj>}^zToXa&H+G;O)cm5Y9-aq-J({r_*~YTz%9<$SBx<%6 zwh{O}VE>BPF2y}$arc8eM7JYmnrIw?3GCg_MPRSU*e3>P#w4}YJxzXMP7eGJaZ(h= zaud^yBAB^{zQF6ms6n|8sqh*bz1WcHEYX9^IKq^37mvV#TX}H>ev@+@3D#u~a*O=ey5ZJn225LaFbxh589@Y@ptyrG| zi;$uXBCv>xxSBir17Pj4I=5VIN;g##b1-tmTYqT7>(>Ym^A%j5QY9y z?9a*yl!o^L?|pn8#n#75Dc+*cPOkb9$yI2(Nv@#a3`z)!gjxlQRL3$mSU3fWSdf`G ziEO=xy<~0N_wAqtbl>Qx+8Z}XF&tDZKwg>DOjY|P2`veUc$M}YqxP-5vi6-ahJh3^ zkY>DyiT6}?HSl!GcDh^C2?u$JK15M7X!a13f6baWM-|w}7)0A1lUv~!4AI^(M>$3j zIM4l4w)&!FAbaB&7vx|zT`;LR-7{M862j$52!s*Vpu#YDZ6>e5a~pAs#>t8^ z@~=5PeBi9?$z8xMpUz8Vmt|UB>4eMYdf*gu6QW!l%LN|$a8r`Xn&bE zk)LR#c~d@aC1p;Tg71N4aV}FAmsn+7l*z@%tuj3?PwvilCs}HvY}U(H@(b7n`Cfj} zV;9~aD;kyr+|+ob=C)n z61K^N+5Z;kb#gu6AVBY6VL)%TAsEGr+yOkOtZX5o1(~%z)3t_9L6q7h*)XCcOG|XB zc}x;51b7}}k9!Q1Tm;idjIsc9%c_BqQN;KbMy{|PA5iH95Ca`Kp(Cvfn8Trl(Xo)~ z11iJd2w-Ti-GvC?t-w*$JMDn5QK6nMllv&0@)S6dsM?HL6UWV{^1xbwI?UGB$k!ey zh{oo1OlpyR4@?7mT1Lesx;Q4PV#j9AgI&%_bP5y{fSSd;jYbMS+HiO1#sQF@BQ|s> zN}I0(CxieNa~1Av-7L{VmW2>m*a|ruLko`$fp63bCKR58ccShlA0L4y_AQ_;&j_3} zz%@D=g(iI(p-EsYG*N*gn_)DebqP&WcnD2^r&9?OhUkDNiGFmH&7zsYkugknU|XWZ z@>~qofw+Ojn5nt%I#^5~OOw}U=d!L&eNG)i?jD`Ho_9CNn{&7E-lop7d0*&Y`pPoV zR+gos-C35N9Qpx}0r@E0wI;7j1uo!AJtSMpW)ilQ<)lRv?%%(!)p(hkm*J_-Ewv<3 zhIin4k)Pg&f;CD|f==;crx*xRI{Y7cqx1V>8i(S~7lyyhPcNG1A}9jplrMTE>a!*c zf7c|hFPgzW4V|vYVCSS+k(Fqi1C}cU(7J|YQrr*So*!>)@EA7#D|KXauM0Ak?8QURmEeA2)m$2M+>Kd zc#6S-F^6DEQIaoz-hJ)m9@>P@Z^X(Y%im(bPG98)#&3mW-HMWlx3E!c1D{2j*FlkI zcqb2r z7y0(8o%}OWO_aXXv1#An%C%xgAnu^QOrTm(5aM=|T(dgIwl%C4r$uaa-d^3IC$t?$ zsB*D=oJ}8%&&ZBPUKq94S?kuapsZh)%bI1!x?}uSlPq2D*KE7UO4>eP6P(!In zWvf}(C2m-Eq+s-ANJM!ZzB`Q)U85W9CS8^{+hyyc)5`}C*g~Iai@*we zEf9&&Gk>P~NF`D<+A6vuAR44&Lq4mQvo?f^T24TiA-d2RPf?bej^h^u3c}PEm%frY~Tw}j)l5*2|-g{COJyyt?JOAOa zWR?}l5Qax~B&(2zBNFcWk5~U)dik68CU(*5DFKLK`bCJw1NE|V^GgXsbSO4|fX1z| zylN#Mcv-$$RlsjG%AZzEb|`Eur}&baE{_-84QgcWrr`waQ;?S%SJwc;aVX zDx6|~CI@8mSj6>n#fYX?0P+Co{pTkhPPlgzlc7X4+D7AMxoPX8iC1ViX#{)lsJ!#c z1bKa{xn#(yflOxNPmFlC(MeG5BQs2dw3g7zqZ599Gpvbs3aiN+o^UrLA9^w+o+c}l z!et=_PRJckF5pA2$f0eMWzUmq*;RRG+jnHew%Poil)-KJyyvXEv~2-)cxT%}s>uhR zI_>VTDpqaj!>8T}XSJeFY%gJP@~7LkxCdWV$)&h;J64REMf3=H=Zzgj48<`1>5TI5 zW_5h5*u{?w!yT;~bA>Gg5<~*vpa7UEe@O}zx%=s@G3^Z)CyM@t&KplV*l>7Jk1Faa zywCE1Q?hF3AS!UNzmVUnll%SivDbh0FM>D!=dUEz(&}fkhOlG2vbq`(JbGmz^wIb$ zC<@S)Tx;ySUi~u`+YTHq=5#y2@>}2a@u4R9!FLa0fy!N{_?;&Ct6fWAI&-&=y&)@i z-@{^y_B;sjfj#MIQEosr{=>Ln#(cL2-}6WzlvUp;d3jHr8N8?tJ(Ds;OZ9L~qZ#Z5i zrGfg2S(Z~}!v5pQ=WXs3?9>VA)`9}oEI+W& z6SS#W;CS&1%CiR+@UNpfuOArCJX(yQrGmTOq0#NAY4R^Geuq6Ia}F-d-UC?zSVz!j zqJQqmT~F^YckJ43?%cI~$A0q)__Xd3dG=uLxPDNy(Lct>_YY2I(eh6ROA_XfGc-4t zOVN{Xz$ND%%9*?$74vh!0EkU7@7}cC4SV0=?xf@4;MP$J+e=C6K1%X1Aie7$+^dl{6BNr BKa2nX diff --git a/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs b/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs index 71408396a3..b893641ef5 100644 --- a/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs +++ b/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs @@ -7,6 +7,7 @@ use crate::*; use crate::types::*; pub fn func_donate(ctx: &ScFuncContext) { + ctx.log("dwf.donate"); let p = ctx.params(); let mut donation = Donation { amount: ctx.incoming().balance(&ScColor::IOTA), @@ -16,7 +17,7 @@ pub fn func_donate(ctx: &ScFuncContext) { timestamp: ctx.timestamp(), }; if donation.amount == 0 || donation.feedback.len() == 0 { - donation.error = "error: empty feedback or donated amount = 0. The donated amount has been returned (if any)".to_string(); + donation.error = "error: empty feedback or donated amount = 0".to_string(); if donation.amount > 0 { ctx.transfer_to_address(&donation.donator.address(), &ScTransfers::new(&ScColor::IOTA, donation.amount)); donation.amount = 0; @@ -32,9 +33,12 @@ pub fn func_donate(ctx: &ScFuncContext) { largest_donation.set_value(donation.amount); } total_donated.set_value(total_donated.value() + donation.amount); + ctx.log("dwf.donate ok"); } pub fn func_withdraw(ctx: &ScFuncContext) { + ctx.log("dwf.withdraw"); + // only SC creator can withdraw donated funds ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -45,15 +49,19 @@ pub fn func_withdraw(ctx: &ScFuncContext) { amount = balance; } if amount == 0 { - ctx.log("DonateWithFeedback: nothing to withdraw"); + ctx.log("dwf.withdraw: nothing to withdraw"); return; } let sc_creator = ctx.contract_creator().address(); ctx.transfer_to_address(&sc_creator, &ScTransfers::new(&ScColor::IOTA, amount)); + + ctx.log("dwf.withdraw ok"); } pub fn view_donations(ctx: &ScViewContext) { + ctx.log("dwf.donations"); + let state = ctx.state(); let largest_donation = state.get_int(VAR_MAX_DONATION); let total_donated = state.get_int(VAR_TOTAL_DONATION); @@ -72,4 +80,6 @@ pub fn view_donations(ctx: &ScViewContext) { donation.get_string(VAR_FEEDBACK).set_value(&di.feedback); donation.get_int(VAR_TIMESTAMP).set_value(di.timestamp); } + + ctx.log("dwf.donations ok"); } diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm b/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm index 50cea6a9acd7a6c81697f10caa264c25f709780b..685159119dd29ca9f40fb10c4a1cb899260245b6 100644 GIT binary patch delta 7092 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 delta 6741 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

XBP)8Qx0QNrE05 zXF)R!92)14`a2}8$BTPgZN{o5GSNs=c(xGZm>wK{r|gZc zbI>!Gl!22V#D7YQZ+kDhKxip7&TI4$9CA-s?VSEq~IY=*MAeAFmd~*yRZB`T-uyy z@m#~LZ`#lvu9cS1H(=RGMgI3p9j=$WPyK6sAxiIq`uXE^;%b8ekhwW6M&feY4Bu5N zcjkg@|ISwemycn2o(%s0g!EE^Hr@EL3avzET9xP34|tmT=U2bp1^~>fg1Px2U4me#g6&=k=M8rtI}+a+|3V`eZvg+F&%JEm*oymcU?o z55N-GkDF;K@_KPvpKX@_v}>^ppJ2>`a>?aUHSqc}&o?>W*Unl@+*VT@(r=cQh~w{IfPQXlUtK>L?{Q+%DE7>k+AC`G5r-`_}?Yk#`$1&7I!fiJ;t zDt<4h&-RCWw}2fF=uh0{drQ?EIFeTFw6PPQ1Se+i{_2-(Bbz?`pOoid>Buh3(!X1( z;$X!{x66bg8Ou>WJ@}+=X%w0Pj32+H>dyxk@LxuXLy6pX4gZyq0pw~2qss`proJ04 z=A+b+@RPao+$Ku`?pgE!^gAnSw^mtIwVSPNwVSJUTVdd7+h^6E!+B;0AUfzJ^rQ+^ zbm)K!X_v_#s|$zb;M?AvLzB@aHx^VnMwwb6ji5`zF9z?ym=qO*4?F@l0H!0v=7W#S zSHfgklTcrC^xfDx%Vw$m6z3C6=6 L_!6(aY-##`sYom) diff --git a/contracts/rust/erc20/src/erc20.rs b/contracts/rust/erc20/src/erc20.rs index d5a2ba55e3..29b046f28d 100644 --- a/contracts/rust/erc20/src/erc20.rs +++ b/contracts/rust/erc20/src/erc20.rs @@ -158,25 +158,30 @@ pub fn view_allowance(ctx: &ScViewContext) { let allowances = ctx.state().get_map(¶m_account.value()); let allow = allowances.get_int(¶m_delegation.value()).value(); ctx.results().get_int(PARAM_AMOUNT).set_value(allow); + ctx.trace("erc20.allowance ok"); } // the view returns balance of the token held in the account // Input: // - PARAM_ACCOUNT: agentID pub fn view_balance_of(ctx: &ScViewContext) { + ctx.trace("erc20.balanceOf"); let p = ctx.params(); let param_account = p.get_agent_id(PARAM_ACCOUNT); ctx.require(param_account.exists(), "missing mandatory account"); let balances = ctx.state().get_map(VAR_BALANCES); let balance = balances.get_int(¶m_account.value()).value(); - ctx.results().get_int(PARAM_AMOUNT).set_value(balance) + ctx.results().get_int(PARAM_AMOUNT).set_value(balance); + ctx.trace("erc20.balanceOf ok"); } // the view returns total supply set when creating the contract (a constant). // Output: // - PARAM_SUPPLY: i64 pub fn view_total_supply(ctx: &ScViewContext) { + ctx.trace("erc20.totalSupply"); let supply = ctx.state().get_int(VAR_SUPPLY).value(); ctx.results().get_int(PARAM_SUPPLY).set_value(supply); + ctx.trace("erc20.totalSupply ok"); } diff --git a/contracts/rust/erc20/test/erc20_bg.wasm b/contracts/rust/erc20/test/erc20_bg.wasm index 4d6124dee50ee73a2bb3a8a59f1973e964ba34bb..97309ab76fe9f68539e752a1d3cab8f04a0327da 100644 GIT binary patch delta 5965 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 Q2+C|b$N08`f6t!(0}q?bga7~l diff --git a/contracts/rust/fairauction/src/fairauction.rs b/contracts/rust/fairauction/src/fairauction.rs index ccaa31d28a..f71aaf0b0a 100644 --- a/contracts/rust/fairauction/src/fairauction.rs +++ b/contracts/rust/fairauction/src/fairauction.rs @@ -15,6 +15,7 @@ const OWNER_MARGIN_MIN: i64 = 5; const OWNER_MARGIN_MAX: i64 = 100; pub fn func_finalize_auction(ctx: &ScFuncContext) { + ctx.log("fairauction.finalize"); // only SC itself can invoke this function ctx.require(ctx.caller() == ctx.contract_id().as_agent_id(), "no permission"); @@ -65,9 +66,11 @@ pub fn func_finalize_auction(ctx: &ScFuncContext) { transfer(ctx, &ctx.contract_creator(), &ScColor::IOTA, owner_fee - 1); transfer(ctx, &auction.highest_bidder, &auction.color, auction.num_tokens); transfer(ctx, &auction.creator, &ScColor::IOTA, auction.deposit + auction.highest_bid - owner_fee); + ctx.log("fairauction.finalize ok"); } pub fn func_place_bid(ctx: &ScFuncContext) { + ctx.log("fairauction.placeBid"); let p = ctx.params(); let param_color = p.get_color(PARAM_COLOR); @@ -113,9 +116,11 @@ pub fn func_place_bid(ctx: &ScFuncContext) { auction.highest_bidder = caller; auction_info.set_value(&auction.to_bytes()); } + ctx.log("fairauction.placeBid ok"); } pub fn func_set_owner_margin(ctx: &ScFuncContext) { + ctx.log("fairauction.setOwnerMargin"); // only SC creator can set owner margin ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -132,10 +137,11 @@ pub fn func_set_owner_margin(ctx: &ScFuncContext) { owner_margin = OWNER_MARGIN_MAX; } ctx.state().get_int(VAR_OWNER_MARGIN).set_value(owner_margin); - ctx.log("Updated owner margin"); + ctx.log("fairauction.setOwnerMargin ok"); } pub fn func_start_auction(ctx: &ScFuncContext) { + ctx.log("fairauction.startAuction"); let p = ctx.params(); let param_color = p.get_color(PARAM_COLOR); let param_description = p.get_string(PARAM_DESCRIPTION); @@ -224,10 +230,11 @@ pub fn func_start_auction(ctx: &ScFuncContext) { transfer: None, delay: duration * 60, }); - ctx.log("New auction started"); + ctx.log("fairauction.startAuction ok"); } pub fn view_get_info(ctx: &ScViewContext) { + ctx.log("fairauction.getInfo"); let p = ctx.params(); let param_color = p.get_color(PARAM_COLOR); @@ -257,6 +264,7 @@ pub fn view_get_info(ctx: &ScViewContext) { let bidder_list = current_auction.get_agent_id_array(VAR_BIDDER_LIST); results.get_int(VAR_BIDDERS).set_value(bidder_list.length() as i64); + ctx.log("fairauction.getInfo ok"); } fn transfer(ctx: &ScFuncContext, agent: &ScAgentId, color: &ScColor, amount: i64) { diff --git a/contracts/rust/fairauction/test/fairauction_bg.wasm b/contracts/rust/fairauction/test/fairauction_bg.wasm index bd1dd529060ddd3d7633af4d3d1c5cf28dd4a979..6ed2e05ca557bf22c999f4b7a9bc4fd47266e641 100644 GIT binary patch delta 9947 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 D!d4V# delta 9373 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 SZYl_F=D_#iGcvmA@c#pIS~EWY delta 7855 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 YRHcS{n|J6Q%3L1iK&Rg$XSCG+KL#tf4*&oF diff --git a/contracts/rust/helloworld/src/helloworld.rs b/contracts/rust/helloworld/src/helloworld.rs index ddf7997baf..1c7d789ca8 100644 --- a/contracts/rust/helloworld/src/helloworld.rs +++ b/contracts/rust/helloworld/src/helloworld.rs @@ -10,6 +10,6 @@ pub fn func_hello_world(ctx: &ScFuncContext) { } pub fn view_get_hello_world(ctx: &ScViewContext) { - ctx.log("Get Hello world!"); + ctx.log("Get 'Hello, world!'"); ctx.results().get_string(VAR_HELLO_WORLD).set_value("Hello, world!"); } diff --git a/contracts/rust/helloworld/test/helloworld_bg.wasm b/contracts/rust/helloworld/test/helloworld_bg.wasm index 0234e7e8801428803e84a480d391cfe84788f84f..8e5822faad46ae79d2e22298549edfa9cc0fece7 100644 GIT binary patch delta 689 zcmYjP&ubG=5T4mCQe9hju@-DieY;wdm}+gbv8lE89SpsQ0TmGnO06IgjK4sO2-T)G zhk(Ti7$FCR9*U=h74)FEf(H))gMUE|6^g-|hj^;<^22y|Gw+*u^UZw2dprMr-klsk z*E=;ZqhW!HB8{uG-F|>ITC(TZ{%%$2ee6R_>k+ziy@y90A-eQuWEekCI68=HbT%4FtUUE0q=AD1&UB%y zE%+d_jhFzb-Mhg_3t@*Li|vu(p-`?QSBnEbx zVOioVbIGqwzs*FOo62|e{Mb<9AGxi`LbE+4^eLHVAkge>wYN2+9%Cw@srjT9V^&o! zi=>Z++lrVf_dk`ARi|odR#Yvi4JuSrDl1p$?r4VBRU5sE6`F}1#4IhxCLEtPDkC!c zgrx?Q)R5Ncbe!fvo0$Urh?Na@Q7vBQ30?A!U+MnR5UoNWOLTZ_wy(kzbu3g@!vdM( zB5BE2^k(d)@p?-K$OSGlmS|r*+!vg_mP)0E#QpT0)SMl>uFyqw2bzr^u##XxF8~Di zbn!{j%lI>^%F#WHej&hK_En0HFXJuxJbrGgk0uC?RVZ+x8ZK!j^fS7k16b@^_%h@D PjUQp44l++86N`TVlsCX- delta 685 zcmYjPO=uHQ5T4mCQe9hjp$4?3zFn;*My*B@o7&dS!O%lRK}CduqE$qK!5`2fLTaP! zAz*L<_RvBP9z^yaY!5wD%t0ZCg5o*HNI?-i^q{9YuT6}HH}k%4-hA`JTO3~)e>d2L zesHR5)W8zYsw~d)R`(IE@-uf#?05GK)|kCPoDaTw!>yR(&X_B9Aa+^otJr?b1s`G; z5SN3FL!S*?=2}m|@+ZoWG&+fz3HJ^<~(uL<`h#26Zf-`MM ztGO~zeuGm$#)I1ubP%>#G}C-ZYioGdYbF%=eSAl|&b7CLr9dIoxE3G6UqSb=a~QVm zC{-jXTJ*8*x7g@PQCi@a#}B6eiMs}s>g6$Q4pC8nLOawb?;6%RCsNAL{gIIrRh>^W zY$l@3i9~Apf2n*!sy?%p(p*ytwUmxhf$t~svaa8W>saN{<0d&ipF)B==~G;4zQq@tnW8<|X2JM29-6iNJ0_+yQ!UKI%nBh--=Ql5*4NABwyC;7{D~1i7f-af>j`#+?B6#n{Z?Mn= JDsrNK@-HgwzTp4> diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index d9a0750167..252c43e119 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -10,7 +10,7 @@ const MSG_FULL_PANIC: &str = "========== panic FULL ENTRY POINT ========="; const MSG_VIEW_PANIC: &str = "========== panic VIEW ========="; pub fn func_call_on_chain(ctx: &ScFuncContext) { - ctx.log("calling callOnChain"); + ctx.log("testcore.callOnChain"); let p = ctx.params(); let param_hname_contract = p.get_hname(PARAM_HNAME_CONTRACT); @@ -44,10 +44,11 @@ pub fn func_call_on_chain(ctx: &ScFuncContext) { let ret_val = ret.get_int(PARAM_INT_VALUE); ctx.results().get_int(PARAM_INT_VALUE).set_value(ret_val.value()); + ctx.log("testcore.callOnChain ok"); } pub fn func_check_context_from_full_ep(ctx: &ScFuncContext) { - ctx.log("calling checkContextFromFullEP"); + ctx.log("testcore.checkContextFromFullEP"); let p = ctx.params(); let param_agent_id = p.get_agent_id(PARAM_AGENT_ID); @@ -63,18 +64,21 @@ pub fn func_check_context_from_full_ep(ctx: &ScFuncContext) { ctx.require(param_contract_id.value() == ctx.contract_id(), "fail: contractID"); ctx.require(param_agent_id.value() == ctx.contract_id().as_agent_id(), "fail: agentID"); ctx.require(param_contract_creator.value() == ctx.contract_creator(), "fail: contractCreator"); + ctx.log("testcore.checkContextFromFullEP ok"); } pub fn func_do_nothing(ctx: &ScFuncContext) { - ctx.log("calling doNothing"); + ctx.log("testcore.doNothing"); + ctx.log("testcore.doNothing ok"); } pub fn func_init(ctx: &ScFuncContext) { - ctx.log("calling init"); + ctx.log("testcore.init"); + ctx.log("testcore.init ok"); } pub fn func_pass_types_full(ctx: &ScFuncContext) { - ctx.log("calling passTypesFull"); + ctx.log("testcore.passTypesFull"); let p = ctx.params(); let param_hash = p.get_hash(PARAM_HASH); @@ -100,10 +104,11 @@ pub fn func_pass_types_full(ctx: &ScFuncContext) { ctx.require(param_string.value() == PARAM_STRING, "string wrong"); ctx.require(param_hname.value() == ScHname::new(PARAM_HNAME), "Hname wrong"); ctx.require(param_hname_zero.value() == ScHname(0), "Hname-0 wrong"); + ctx.log("testcore.passTypesFull ok"); } pub fn func_run_recursion(ctx: &ScFuncContext) { - ctx.log("calling runRecursion"); + ctx.log("testcore.runRecursion"); let p = ctx.params(); let param_int_value = p.get_int(PARAM_INT_VALUE); @@ -121,10 +126,11 @@ pub fn func_run_recursion(ctx: &ScFuncContext) { ctx.call_self(HFUNC_CALL_ON_CHAIN, Some(params), None); // TODO how would I return result of the call ??? ctx.results().get_int(PARAM_INT_VALUE).set_value(depth - 1); + ctx.log("testcore.runRecursion ok"); } pub fn func_send_to_address(ctx: &ScFuncContext) { - ctx.log("calling sendToAddress"); + ctx.log("testcore.sendToAddress"); ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -134,10 +140,11 @@ pub fn func_send_to_address(ctx: &ScFuncContext) { ctx.require(param_address.exists(), "missing mandatory address"); ctx.transfer_to_address(¶m_address.value(), &ctx.balances()); + ctx.log("testcore.sendToAddress ok"); } pub fn func_set_int(ctx: &ScFuncContext) { - ctx.log("calling setInt"); + ctx.log("testcore.setInt"); let p = ctx.params(); let param_int_value = p.get_int(PARAM_INT_VALUE); @@ -147,43 +154,50 @@ pub fn func_set_int(ctx: &ScFuncContext) { ctx.require(param_name.exists(), "missing mandatory name"); ctx.state().get_int(¶m_name.value()).set_value(param_int_value.value()); + ctx.log("testcore.setInt ok"); } pub fn func_test_call_panic_full_ep(ctx: &ScFuncContext) { - ctx.log("calling testCallPanicFullEP"); + ctx.log("testcore.testCallPanicFullEP"); ctx.call_self(HFUNC_TEST_PANIC_FULL_EP, None, None); + ctx.log("testcore.testCallPanicFullEP ok"); } pub fn func_test_call_panic_view_epfrom_full(ctx: &ScFuncContext) { - ctx.log("calling testCallPanicViewEPFromFull"); + ctx.log("testcore.testCallPanicViewEPFromFull"); ctx.call_self(HVIEW_TEST_PANIC_VIEW_EP, None, None); + ctx.log("testcore.testCallPanicViewEPFromFull ok"); } pub fn func_test_chain_owner_idfull(ctx: &ScFuncContext) { - ctx.log("calling testChainOwnerIDFull"); - ctx.results().get_agent_id(PARAM_CHAIN_OWNER_ID).set_value(&ctx.chain_owner_id()) + ctx.log("testcore.testChainOwnerIDFull"); + ctx.results().get_agent_id(PARAM_CHAIN_OWNER_ID).set_value(&ctx.chain_owner_id()); + ctx.log("testcore.testChainOwnerIDFull ok"); } pub fn func_test_contract_idfull(ctx: &ScFuncContext) { - ctx.log("calling testContractIDFull"); + ctx.log("testcore.testContractIDFull"); ctx.results().get_contract_id(PARAM_CONTRACT_ID).set_value(&ctx.contract_id()); + ctx.log("testcore.testContractIDFull ok"); } pub fn func_test_event_log_deploy(ctx: &ScFuncContext) { - ctx.log("calling testEventLogDeploy"); + ctx.log("testcore.testEventLogDeploy"); //Deploy the same contract with another name let program_hash = ctx.utility().hash_blake2b("test_sandbox".as_bytes()); ctx.deploy(&program_hash, CONTRACT_NAME_DEPLOYED, - "test contract deploy log", None) + "test contract deploy log", None); + ctx.log("testcore.testEventLogDeploy ok"); } pub fn func_test_event_log_event_data(ctx: &ScFuncContext) { - ctx.log("calling testEventLogEventData"); + ctx.log("testcore.testEventLogEventData"); ctx.event("[Event] - Testing Event..."); + ctx.log("testcore.testEventLogEventData ok"); } pub fn func_test_event_log_generic_data(ctx: &ScFuncContext) { - ctx.log("calling testEventLogGenericData"); + ctx.log("testcore.testEventLogGenericData"); let p = ctx.params(); let param_counter = p.get_int(PARAM_COUNTER); @@ -191,16 +205,18 @@ pub fn func_test_event_log_generic_data(ctx: &ScFuncContext) { ctx.require(param_counter.exists(), "missing mandatory counter"); let event = "[GenericData] Counter Number: ".to_string() + ¶m_counter.to_string(); - ctx.event(&event) + ctx.event(&event); + ctx.log("testcore.testEventLogGenericData ok"); } pub fn func_test_panic_full_ep(ctx: &ScFuncContext) { - ctx.log("calling testPanicFullEP"); - ctx.panic(MSG_FULL_PANIC) + ctx.log("testcore.testPanicFullEP"); + ctx.panic(MSG_FULL_PANIC); + ctx.log("testcore.testPanicFullEP ok"); } pub fn func_withdraw_to_chain(ctx: &ScFuncContext) { - ctx.log("calling withdrawToChain"); + ctx.log("testcore.withdrawToChain"); let p = ctx.params(); let param_chain_id = p.get_chain_id(PARAM_CHAIN_ID); @@ -217,12 +233,12 @@ pub fn func_withdraw_to_chain(ctx: &ScFuncContext) { transfer: Some(Box::new(transfers)), delay: 0, }); - ctx.log("==== success ===="); // TODO how to check if post was successful + ctx.log("testcore.withdrawToChain ok"); } pub fn view_check_context_from_view_ep(ctx: &ScViewContext) { - ctx.log("calling checkContextFromViewEP"); + ctx.log("testcore.checkContextFromViewEP"); let p = ctx.params(); let param_agent_id = p.get_agent_id(PARAM_AGENT_ID); @@ -236,10 +252,11 @@ pub fn view_check_context_from_view_ep(ctx: &ScViewContext) { ctx.require(param_contract_id.value() == ctx.contract_id(), "fail: contractID"); ctx.require(param_agent_id.value() == ctx.contract_id().as_agent_id(), "fail: agentID"); ctx.require(param_contract_creator.value() == ctx.contract_creator(), "fail: contractCreator"); + ctx.log("testcore.checkContextFromViewEP ok"); } pub fn view_fibonacci(ctx: &ScViewContext) { - ctx.log("calling fibonacci"); + ctx.log("testcore.fibonacci"); let p = ctx.params(); let param_int_value = p.get_int(PARAM_INT_VALUE); @@ -262,16 +279,18 @@ pub fn view_fibonacci(ctx: &ScViewContext) { let n2 = results2.get_int(PARAM_INT_VALUE).value(); ctx.results().get_int(PARAM_INT_VALUE).set_value(n1 + n2); + ctx.log("testcore.fibonacci ok"); } pub fn view_get_counter(ctx: &ScViewContext) { - ctx.log("calling getCounter"); + ctx.log("testcore.getCounter"); let counter = ctx.state().get_int(VAR_COUNTER); ctx.results().get_int(VAR_COUNTER).set_value(counter.value()); + ctx.log("testcore.getCounter ok"); } pub fn view_get_int(ctx: &ScViewContext) { - ctx.log("calling getInt"); + ctx.log("testcore.getInt"); let p = ctx.params(); let param_name = p.get_string(PARAM_NAME); @@ -282,14 +301,16 @@ pub fn view_get_int(ctx: &ScViewContext) { let value = ctx.state().get_int(&name); ctx.require(value.exists(), "param 'value' not found"); ctx.results().get_int(&name).set_value(value.value()); + ctx.log("testcore.getInt ok"); } pub fn view_just_view(ctx: &ScViewContext) { - ctx.log("calling justView"); + ctx.log("testcore.justView"); + ctx.log("testcore.justView ok"); } pub fn view_pass_types_view(ctx: &ScViewContext) { - ctx.log("calling passTypesView"); + ctx.log("testcore.passTypesView"); let p = ctx.params(); let param_hash = p.get_hash(PARAM_HASH); @@ -316,31 +337,37 @@ pub fn view_pass_types_view(ctx: &ScViewContext) { ctx.require(param_string_zero.value() == "", "string-0 wrong"); ctx.require(param_hname.value() == ScHname::new(PARAM_HNAME), "Hname wrong"); ctx.require(param_hname_zero.value() == ScHname(0), "Hname-0 wrong"); + ctx.log("testcore.passTypesView ok"); } pub fn view_test_call_panic_view_epfrom_view(ctx: &ScViewContext) { - ctx.log("calling testCallPanicViewEPFromView"); + ctx.log("testcore.testCallPanicViewEPFromView"); ctx.call_self(HVIEW_TEST_PANIC_VIEW_EP, None); + ctx.log("testcore.testCallPanicViewEPFromView ok"); } pub fn view_test_chain_owner_idview(ctx: &ScViewContext) { - ctx.log("calling testChainOwnerIDView"); - ctx.results().get_agent_id(PARAM_CHAIN_OWNER_ID).set_value(&ctx.chain_owner_id()) + ctx.log("testcore.testChainOwnerIDView"); + ctx.results().get_agent_id(PARAM_CHAIN_OWNER_ID).set_value(&ctx.chain_owner_id()); + ctx.log("testcore.testChainOwnerIDView ok"); } pub fn view_test_contract_idview(ctx: &ScViewContext) { - ctx.log("calling testContractIDView"); + ctx.log("testcore.testContractIDView"); ctx.results().get_contract_id(PARAM_CONTRACT_ID).set_value(&ctx.contract_id()); + ctx.log("testcore.testContractIDView ok"); } pub fn view_test_panic_view_ep(ctx: &ScViewContext) { - ctx.log("calling testPanicViewEP"); - ctx.panic(MSG_VIEW_PANIC) + ctx.log("testcore.testPanicViewEP"); + ctx.panic(MSG_VIEW_PANIC); + ctx.log("testcore.testPanicViewEP ok"); } pub fn view_test_sandbox_call(ctx: &ScViewContext) { - ctx.log("calling testSandboxCall"); + ctx.log("testcore.testSandboxCall"); let ret = ctx.call(CORE_ROOT, CORE_ROOT_VIEW_GET_CHAIN_INFO, None); let desc = ret.get_string("d").value(); ctx.results().get_string("sandboxCall").set_value(&desc); + ctx.log("testcore.testSandboxCall ok"); } diff --git a/contracts/rust/testcore/test b/contracts/rust/testcore/test new file mode 100644 index 0000000000000000000000000000000000000000..d12e5c8902257bf7c2a594e9491597257c7a8b6f GIT binary patch literal 47418 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 Iw$J{50a5%Zj{pDw literal 0 HcmV?d00001 diff --git a/contracts/rust/tokenregistry/src/tokenregistry.rs b/contracts/rust/tokenregistry/src/tokenregistry.rs index aa4624b310..f61472518e 100644 --- a/contracts/rust/tokenregistry/src/tokenregistry.rs +++ b/contracts/rust/tokenregistry/src/tokenregistry.rs @@ -7,6 +7,7 @@ use crate::*; use crate::types::*; pub fn func_mint_supply(ctx: &ScFuncContext) { + ctx.log("tokenregistry.mintSupply"); let p = ctx.params(); let param_description = p.get_string(PARAM_DESCRIPTION); let param_user_defined = p.get_string(PARAM_USER_DEFINED); @@ -38,9 +39,11 @@ pub fn func_mint_supply(ctx: &ScFuncContext) { registry.set_value(&token.to_bytes()); let colors = state.get_color_array(VAR_COLOR_LIST); colors.get_color(colors.length()).set_value(&minted); + ctx.log("tokenregistry.mintSupply ok"); } pub fn func_transfer_ownership(ctx: &ScFuncContext) { + ctx.log("tokenregistry.transferOwnership"); //TODO the one who can transfer token ownership ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -49,9 +52,11 @@ pub fn func_transfer_ownership(ctx: &ScFuncContext) { ctx.require(param_color.exists(), "missing mandatory color"); //TODO + ctx.log("tokenregistry.transferOwnership ok"); } pub fn func_update_metadata(ctx: &ScFuncContext) { + ctx.log("tokenregistry.updateMetadata"); //TODO the one who can change the token info ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); @@ -60,12 +65,15 @@ pub fn func_update_metadata(ctx: &ScFuncContext) { ctx.require(param_color.exists(), "missing mandatory color"); //TODO + ctx.log("tokenregistry.updateMetadata ok"); } pub fn view_get_info(ctx: &ScViewContext) { + ctx.log("tokenregistry.getInfo"); let p = ctx.params(); let param_color = p.get_color(PARAM_COLOR); ctx.require(param_color.exists(), "missing mandatory color"); //TODO + ctx.log("tokenregistry.getInfo ok"); } diff --git a/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm b/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm index 76f66e421197b5b9f0d5ee86514ce22b5b3dcc0a..150a04697e097ee1cab221161910bd59524c3f83 100644 GIT binary patch delta 8007 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 al=vvAukOia!$*0}$8nfZp+0-&`Tqlrq@K$F delta 7424 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 OVdF1#%4eQ={(k|8<^+%c diff --git a/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm b/packages/vm/core/testcore/sandbox_tests/test_sandbox_sc/testcore_bg.wasm index d9f751e1dd2da32174467a511788688ad5c56b97..d12e5c8902257bf7c2a594e9491597257c7a8b6f 100644 GIT binary patch literal 47418 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 Iw$J{50a5%Zj{pDw delta 20386 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 From a3f65be103e2be11709e9ffedda536e5e60175c7 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Thu, 18 Feb 2021 20:12:40 -0800 Subject: [PATCH 12/39] Implemented new util functions and updated Wasm --- .../test/example_tutorial_bg.wasm | Bin 29566 -> 29566 bytes contracts/rust/dividend/test/dividend_bg.wasm | Bin 34493 -> 34495 bytes .../test/donatewithfeedback_bg.wasm | Bin 36202 -> 36204 bytes contracts/rust/erc20/test/erc20_bg.wasm | Bin 33811 -> 33811 bytes .../rust/fairauction/test/fairauction_bg.wasm | Bin 42658 -> 42661 bytes .../fairroulette/test/fairroulette_bg.wasm | Bin 37038 -> 37040 bytes .../rust/helloworld/test/helloworld_bg.wasm | Bin 15544 -> 15544 bytes .../rust/inccounter/test/inccounter_bg.wasm | Bin 31658 -> 31658 bytes contracts/rust/testcore/test | Bin 47418 -> 47421 bytes .../tokenregistry/test/tokenregistry_bg.wasm | Bin 32255 -> 32255 bytes contracts/rust/update_hardcoded.bat | 2 +- contracts/rust/wasmlib/src/context.rs | 72 ++++++++------- contracts/rust/wasmlib/src/keys.rs | 74 ++++++++-------- .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47418 -> 47421 bytes packages/vm/wasmhost/wasmkeys.go | 82 +++++++++--------- packages/vm/wasmproc/scutility.go | 35 +++++--- tools/cluster/tests/wasm/inccounter_bg.wasm | Bin 31658 -> 31658 bytes 17 files changed, 147 insertions(+), 118 deletions(-) diff --git a/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm b/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm index 7244814c89267def7bb41f2b8325961392868baf..9e917bbe4de641edd3f596acaa7743ccf034fe21 100644 GIT binary patch delta 89 zcmezOjPc(y#tq;77&9mT@H1k}+^p^Yf|0R&vq)eo7i0S7S<&i@oOzDg0*p$Gj***B o#r$GsjNg1TL4Z;6%m4rXUjXq_AbtYG4}tg}5Z~GSE^&e&06au6<^TWy delta 89 zcmezOjPc(y#tq;77;`88@H1k}-K_2Zf|0Ruvq)eo7i0G3S<&i@oJEe>0*p$Gj?tS> o#r$GsOx}DnL4Z;6+yDRn-vIGTAbtVFPl5O^5I@-bE^&e&07F_a6951J diff --git a/contracts/rust/dividend/test/dividend_bg.wasm b/contracts/rust/dividend/test/dividend_bg.wasm index f9d4b0da97e21069765773e445e40a97ccd6c275..ca2ea0716bffd17bd47093450107a4c8cbc0d82d 100644 GIT binary patch delta 297 zcmdnn%e23jX#+1K6BFlTe#Xy?Q#Ug+UC?DT+CQx3F*iD8XE7*L7A z>6sAoV$;kdZNca%xs5XP%?B0HYG4W8~)VS!K*jAL=IO z=e3JRJ8}UOV delta 255 zcmdnr%e1$bX#+1K6DQMTe#Xy?lQ%OnUC?DT+I&TSHY20q<^n?(B_Opmn30pwaPsz; zejw={dyFx6GGAN@k0ArM0;2|lpaP?#!DPkwCdT=bo8ufLl$gz!L=>1DXEYpO&|qRP zW0Fx|QUHogeh?=m=E#u+loH8uoB)&+$Op`DWv& zZ(NM#leJR&f#j~#V~m-T8`Dw*%^A2A7&RCK6&M{2vQ!wjXG|_hH;*%85>a4s0Z=&BPL1?-%8j@kl@N{o(?lN}36fr8r$^cWe_H$N+!#?17g zZgO2|yLhxC7f=b4W33}I(50$C%NT$r)ohk2Tg}KAzxhP@0!G;{|NsAg0mM&%_z4g{ S1mb@{d=H54Y;LW5DhvQLAZ5A$ delta 283 zcmaDei|N%YrVZ?jOdL#;IT;@^-rM||G02)RZ?m1P0VAXN=6pLvejqi`cOeg>*=FOY zZ(NLKleJR&f#j~#V~n|z8`DyF%ow;87&RCK6&M{2CU>VdF;1KOEzMj)iP?-vM1jfi zMAHEV4JHONCK&}L1)$huuXHILM~*C@lt`B29-yp19#Do!lbOSuSpq03kp(o4iD8XE zIFO@|r81d2V;|7=QyB&9oJEe>0*p$Gj?t5y3rc~4I}7v}8M8OPD4fR3G@*WSLutEs zydxJ-36o=uBQwxNssc<33_x?LH_Mf+W@Jp>e5!l_qwKf;|Np-M;+H`D0*Idi@n0Z* N1jG+Ew^u$D1_0)tV`%^Y diff --git a/contracts/rust/erc20/test/erc20_bg.wasm b/contracts/rust/erc20/test/erc20_bg.wasm index 97309ab76fe9f68539e752a1d3cab8f04a0327da..8df2c383da1563240b2f4439cf5f2bd1f4e81317 100644 GIT binary patch delta 90 zcmbQ-!8EypX~UK{&OAqL0Y)W8$H>ilHy0QEXJ)jU z99!kGd3)JXMi8^2A4tBfIL4Sc`A50`WacVSK|2O+1x5`9K?O!fgDe#W?!}W;s~z~w zm_!tq967Rpgh-a-oXHETMJG2`i+}`y`~?jM7zCOb6_^y5G?^JDud9}rtWjkGw(I!h zW7T^>mej~jURdJ|X5C=4*?g?_3?pZrqqYE}5~E|}=GpaU*?=z1Y`et5xM8wQwp{-v-b2drf;6ybB>WG3#5dbi@}l6F@ADx j-!{cB|NsAg0mM&%_z4g{1mb%@d}8JT*0 delta 342 zcmZ2_mTA#hrVXNuOq`69#ToxH{hzs6jHxG<(Ps1F`1?GJwws%C-m@~MZ!RwS&kW=h zm%U_Uw4EGV(GMiwRvcr@o&2NRe=>8GD32`zw*sREgP;PVqrv2pRTe-6#bqv&-Kv`z z7fjZyaxhh5He(V|U~-((aDYLBiNTCXMuABIC?)|ElgLtH28t;F2^L321qMe&0Vbd@ zN7m$pRl?#N=FAX9Kns`{)(E5kr4+JMCLgcf547b&jqKzlHQr#>4Mw}oCu`3zauzvi z3ot4%I!14vSAUib=<=MlODv2RCfj#wGEJzToYmbf9`DEnRKo07A=VTePHZQWalLhh~Mm%C=Ox}DXZWRlo`Q-fMejxcj`50s7WUget$s(y@g60g| z3XB>If(nd|23aZ$+zTh~Om&boV-itda^%PY5+YfSQyLC12-GMrDKKd=bC@$v7EF^8 zhRDo7l3|$am?kmVDz$EMWZE8}J$31_la158fUc-Zzs<&(=cp~fsKn?Pxj89sH4|gf zWWK_QK)D5lx{QqJo6i+ZVr0zRoLG{<#JFMdsWMHb4|S8jmbHsVJ8}WFF*(*cG6S8c zD!`<`0JOSh^W<_tCdT;5ODi`^e)<3Z{|g{~3dB!<_zn<*z`xCfRhrC-3$YRjSc#2VMX**xa5LAFmsbixPQWEqp zfVlh)wIdZ@c$7LZVU)m>55~O#Iay5%8`Ql_zBYj^Z<41TFvYyJMeJI)kQF{_Tm;iy zZKl%7AgcHo@ImpI-hg9~NRK2Vs)<2{e6M`1L{Tv@%#e|$lcqZnl{7}=;lLE$qan#& zhbZXq1F~pE8poLGjjR6-+JVZsmZA~n^ops>6(uR#h8VKPC}-JzYHrE%ehnhPr{zrU z3?U=5g&q24-kcqR^H#xxeg3 hu*AuV41Kt+`%ZWxGziaxzxN{-S7Rz1%A@r_;1{m&cB%jX diff --git a/contracts/rust/helloworld/test/helloworld_bg.wasm b/contracts/rust/helloworld/test/helloworld_bg.wasm index 8e5822faad46ae79d2e22298549edfa9cc0fece7..7fc442e635d00470e1485851db51abbae26c9fe2 100644 GIT binary patch delta 33 pcmdl{xubGJl^JKAqqYE}5~E|}=4P{}Osp^d|NsARbFQT~GXUi$4mkh- delta 33 pcmdl{xubGJl^JJ|qqYE}5~E}E=4P{}OssGI|NsAVbFQT~GXUl74o3h0 diff --git a/contracts/rust/inccounter/test/inccounter_bg.wasm b/contracts/rust/inccounter/test/inccounter_bg.wasm index e556e94c3c44d6e5cd9af7b75c7d35667a09d60c..5a655ea8ac124451b4d4d2e64f6c03846aebeea1 100644 GIT binary patch delta 98 zcmZ4WopIH7#tlr~QWcKO3QQVI3?PCiD~aArVT2LOw8Py)fl}P8Fy_iWKwkJ%yZNhU{qpsjNCli^Ewx!-{#_wXnscD z&F7OBFf&$6E=ZSTOqkr2ej6y0mLbW?n7p|mcRMp<(d33)#mSL{VnVr&%nD2j%mPdb zERGym3XG1qlN$^5fyy@)CNsiK&@YY!3iTE%voQKi-dNrba)P4&E&!cJs@jA1Bkz%L4LDV<1#kJw8)UUTyVlNZphRL%hYchSP+k9+tI3r{FX1S>%jEwn{ji=q>iFV`? wVC3dvaAb6h-z+)(IJe@r|NsAg0pb@x{1k|v0P#a0z753xfcVa4#>JLm04zG62><{9 delta 448 zcmdn{iD}m-rVT2LOx(fGy#mSL{VnT(E%nD2j%mPdb zERGym3XG10lN$^5fyy@)CNsiK&@YY!3iTE%voQKj-dNrb&yEpDJ?+I(d$ZzH5k|)1 z$!61T@x(iF2{3YVF*q_hCU2IRewp{)P_ diff --git a/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm b/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm index 150a04697e097ee1cab221161910bd59524c3f83..a0499501f685c5b60a5cce732ab037de0b604349 100644 GIT binary patch delta 75 zcmezWoALi|#tpGrjPaY}v?dxbW^Vovb%2dC&rw@|QHjwpa`Vo_E>@-wb(>w&WtkYW cCMRdM34Zzi|NjdhehS1-fcW0#Uzw~T0Q}h|xc~qF delta 75 zcmezWoALi|#tpGrjLDnhv?dxb=5GEFb%2et$WdE>QHjwpdh^c2E>@-q^_yMOWtkZB cCMRdM34Z(k|Nk2xehI`cfcVkoUzw~T0Q2T1egFUf diff --git a/contracts/rust/update_hardcoded.bat b/contracts/rust/update_hardcoded.bat index 4a187b6226..dd12305028 100644 --- a/contracts/rust/update_hardcoded.bat +++ b/contracts/rust/update_hardcoded.bat @@ -1,5 +1,5 @@ @echo off for /d %%f in (*.) do if exist %%f\pkg\%%f*.wasm copy /y %%f\pkg\%%f*.wasm %%f\test\*.* -if exist testcore\pkg\testcore_bg.wasm copy /y testcore\pkg\testcore_bg.wasm ..\..\packages\vm\core\testcore\sandbox_tests\test_sandbox_sc\*.* +if exist testcore\pkg\testcore_bg.wasm copy /y testcore\pkg\testcore_bg.wasm ..\..\packages\vm\core\testcore\sbtests\sbtestsc\*.* if exist inccounter\pkg\inccounter_bg.wasm copy /y inccounter\pkg\inccounter_bg.wasm ..\..\tools\cluster\tests\wasm\*.* diff --git a/contracts/rust/wasmlib/src/context.rs b/contracts/rust/wasmlib/src/context.rs index bb0ee6e21b..0aafa8813f 100644 --- a/contracts/rust/wasmlib/src/context.rs +++ b/contracts/rust/wasmlib/src/context.rs @@ -100,8 +100,27 @@ pub struct ScUtility { } impl ScUtility { + // decodes the specified base58-encoded string value to its original bytes + pub fn base58_decode(&self, value: &str) -> Vec { + self.utility.get_string(&KEY_BASE58_STRING).set_value(value); + self.utility.get_bytes(&KEY_BASE58_BYTES).value() + } + + // encodes the specified bytes to a base-58-encoded string + pub fn base58_encode(&self, value: &[u8]) -> String { + self.utility.get_bytes(&KEY_BASE58_BYTES).set_value(value); + self.utility.get_string(&KEY_BASE58_STRING).value() + } + + // retrieves the address for the specified ED25519 public key + // retrieves the address for the specified BLS public key + pub fn bls_address_from_pubkey(&self, pub_key: &[u8]) -> ScAddress { + self.utility.get_bytes(&KEY_BLS_ADDRESS).set_value(pub_key); + self.utility.get_address(&KEY_ADDRESS).value() + } + // aggregates the specified multiple BLS signatures and public keys into a single one - pub fn aggregate_bls_signatures(&self, pub_keys_bin: &[&[u8]], sigs_bin: &[&[u8]]) -> (Vec, Vec) { + pub fn bls_aggregate_signatures(&self, pub_keys_bin: &[&[u8]], sigs_bin: &[&[u8]]) -> (Vec, Vec) { let mut encode = BytesEncoder::new(); encode.int(pub_keys_bin.len() as i64); for pub_key in pub_keys_bin { @@ -111,23 +130,36 @@ impl ScUtility { for sig in sigs_bin { encode.bytes(sig); } - let aggregator = self.utility.get_bytes(&KEY_AGGREGATE_BLS); + let aggregator = self.utility.get_bytes(&KEY_BLS_AGGREGATE); aggregator.set_value(&encode.data()); let aggregated = aggregator.value(); let mut decode = BytesDecoder::new(&aggregated); return (decode.bytes().to_vec(), decode.bytes().to_vec()); } - // decodes the specified base58-encoded string value to its original bytes - pub fn base58_decode(&self, value: &str) -> Vec { - self.utility.get_string(&KEY_BASE58_STRING).set_value(value); - self.utility.get_bytes(&KEY_BASE58_BYTES).value() + // checks if the specified BLS signature is valid + pub fn bls_valid_signature(&self, data: &[u8], pub_key: &[u8], signature: &[u8]) -> bool { + let mut encode = BytesEncoder::new(); + encode.bytes(data); + encode.bytes(pub_key); + encode.bytes(signature); + self.utility.get_bytes(&KEY_BLS_VALID).set_value(&encode.data()); + self.utility.get_int(&KEY_VALID).value() != 0 } - // encodes the specified bytes to a base-58-encoded string - pub fn base58_encode(&self, value: &[u8]) -> String { - self.utility.get_bytes(&KEY_BASE58_BYTES).set_value(value); - self.utility.get_string(&KEY_BASE58_STRING).value() + pub fn ed25519_address_from_pubkey(&self, pub_key: &[u8]) -> ScAddress { + self.utility.get_bytes(&KEY_ED25519_ADDRESS).set_value(pub_key); + self.utility.get_address(&KEY_ADDRESS).value() + } + + // checks if the specified ED25519 signature is valid + pub fn ed25519_valid_signature(&self, data: &[u8], pub_key: &[u8], signature: &[u8]) -> bool { + let mut encode = BytesEncoder::new(); + encode.bytes(data); + encode.bytes(pub_key); + encode.bytes(signature); + self.utility.get_bytes(&KEY_ED25519_VALID).set_value(&encode.data()); + self.utility.get_int(&KEY_VALID).value() != 0 } // hashes the specified value bytes using blake2b hashing and returns the resulting 32-byte hash @@ -155,26 +187,6 @@ impl ScUtility { let rnd = self.utility.get_int(&KEY_RANDOM).value(); (rnd as u64 % max as u64) as i64 } - - // checks if the specified BLS signature is valid - pub fn valid_bls_signature(&self, data: &[u8], pub_key: &[u8], signature: &[u8]) -> bool { - let mut encode = BytesEncoder::new(); - encode.bytes(data); - encode.bytes(pub_key); - encode.bytes(signature); - self.utility.get_bytes(&KEY_VALID_BLS).set_value(&encode.data()); - self.utility.get_int(&KEY_VALID).value() != 0 - } - - // checks if the specified ED25519 signature is valid - pub fn valid_ed25519_signature(&self, data: &[u8], pub_key: &[u8], signature: &[u8]) -> bool { - let mut encode = BytesEncoder::new(); - encode.bytes(data); - encode.bytes(pub_key); - encode.bytes(signature); - self.utility.get_bytes(&KEY_VALID_ED25519).set_value(&encode.data()); - self.utility.get_int(&KEY_VALID).value() != 0 - } } // wrapper function for simplified internal access to base58 encoding diff --git a/contracts/rust/wasmlib/src/keys.rs b/contracts/rust/wasmlib/src/keys.rs index 504f5ac8b0..f7d9094d1e 100644 --- a/contracts/rust/wasmlib/src/keys.rs +++ b/contracts/rust/wasmlib/src/keys.rs @@ -32,40 +32,42 @@ impl MapKey for Key32 { // @formatter:off pub const KEY_ADDRESS : Key32 = Key32(-1); -pub const KEY_AGGREGATE_BLS : Key32 = Key32(-2); -pub const KEY_BALANCES : Key32 = Key32(-3); -pub const KEY_BASE58_BYTES : Key32 = Key32(-4); -pub const KEY_BASE58_STRING : Key32 = Key32(-5); -pub const KEY_CALL : Key32 = Key32(-6); -pub const KEY_CALLER : Key32 = Key32(-7); -pub const KEY_CHAIN_OWNER_ID : Key32 = Key32(-8); -pub const KEY_COLOR : Key32 = Key32(-9); -pub const KEY_CONTRACT_CREATOR : Key32 = Key32(-10); -pub const KEY_CONTRACT_ID : Key32 = Key32(-11); -pub const KEY_DEPLOY : Key32 = Key32(-12); -pub const KEY_EVENT : Key32 = Key32(-13); -pub const KEY_EXPORTS : Key32 = Key32(-14); -pub const KEY_HASH_BLAKE2B : Key32 = Key32(-15); -pub const KEY_HASH_SHA3 : Key32 = Key32(-16); -pub const KEY_HNAME : Key32 = Key32(-17); -pub const KEY_INCOMING : Key32 = Key32(-18); -pub const KEY_LENGTH : Key32 = Key32(-19); -pub const KEY_LOG : Key32 = Key32(-20); -pub const KEY_MAPS : Key32 = Key32(-21); -pub const KEY_NAME : Key32 = Key32(-22); -pub const KEY_PANIC : Key32 = Key32(-23); -pub const KEY_PARAMS : Key32 = Key32(-24); -pub const KEY_POST : Key32 = Key32(-25); -pub const KEY_RANDOM : Key32 = Key32(-26); -pub const KEY_RESULTS : Key32 = Key32(-27); -pub const KEY_RETURN : Key32 = Key32(-28); -pub const KEY_STATE : Key32 = Key32(-29); -pub const KEY_TIMESTAMP : Key32 = Key32(-30); -pub const KEY_TRACE : Key32 = Key32(-31); -pub const KEY_TRANSFERS : Key32 = Key32(-32); -pub const KEY_UTILITY : Key32 = Key32(-33); -pub const KEY_VALID : Key32 = Key32(-34); -pub const KEY_VALID_BLS : Key32 = Key32(-35); -pub const KEY_VALID_ED25519 : Key32 = Key32(-36); -pub const KEY_ZZZZZZZ : Key32 = Key32(-37); +pub const KEY_BALANCES : Key32 = Key32(-2); +pub const KEY_BASE58_BYTES : Key32 = Key32(-3); +pub const KEY_BASE58_STRING : Key32 = Key32(-4); +pub const KEY_BLS_ADDRESS : Key32 = Key32(-5); +pub const KEY_BLS_AGGREGATE : Key32 = Key32(-6); +pub const KEY_BLS_VALID : Key32 = Key32(-7); +pub const KEY_CALL : Key32 = Key32(-8); +pub const KEY_CALLER : Key32 = Key32(-9); +pub const KEY_CHAIN_OWNER_ID : Key32 = Key32(-10); +pub const KEY_COLOR : Key32 = Key32(-11); +pub const KEY_CONTRACT_CREATOR : Key32 = Key32(-12); +pub const KEY_CONTRACT_ID : Key32 = Key32(-13); +pub const KEY_DEPLOY : Key32 = Key32(-14); +pub const KEY_ED25519_ADDRESS : Key32 = Key32(-15); +pub const KEY_ED25519_VALID : Key32 = Key32(-16); +pub const KEY_EVENT : Key32 = Key32(-17); +pub const KEY_EXPORTS : Key32 = Key32(-18); +pub const KEY_HASH_BLAKE2B : Key32 = Key32(-19); +pub const KEY_HASH_SHA3 : Key32 = Key32(-20); +pub const KEY_HNAME : Key32 = Key32(-21); +pub const KEY_INCOMING : Key32 = Key32(-22); +pub const KEY_LENGTH : Key32 = Key32(-23); +pub const KEY_LOG : Key32 = Key32(-24); +pub const KEY_MAPS : Key32 = Key32(-25); +pub const KEY_NAME : Key32 = Key32(-26); +pub const KEY_PANIC : Key32 = Key32(-27); +pub const KEY_PARAMS : Key32 = Key32(-28); +pub const KEY_POST : Key32 = Key32(-29); +pub const KEY_RANDOM : Key32 = Key32(-30); +pub const KEY_RESULTS : Key32 = Key32(-31); +pub const KEY_RETURN : Key32 = Key32(-32); +pub const KEY_STATE : Key32 = Key32(-33); +pub const KEY_TIMESTAMP : Key32 = Key32(-34); +pub const KEY_TRACE : Key32 = Key32(-35); +pub const KEY_TRANSFERS : Key32 = Key32(-36); +pub const KEY_UTILITY : Key32 = Key32(-37); +pub const KEY_VALID : Key32 = Key32(-38); +pub const KEY_ZZZZZZZ : Key32 = Key32(-39); // @formatter:on diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index d12e5c8902257bf7c2a594e9491597257c7a8b6f..12177833c5feec08821c5ee6ab0d62fe2c73569f 100644 GIT binary patch delta 455 zcmdn>iD~aArVT2LOw8Py)fl}P8Fy_iWKwkJ%yZNhU{qpsjNCli^Ewx!-{#_wXnscD z&F7OBFf&$6E=ZSTOqkr2ej6y0mLbW?n7p|mcRMp<(d33)#mSL{VnVr&%nD2j%mPdb zERGym3XG1qlN$^5fyy@)CNsiK&@YY!3iTE%voQKi-dNrba)P4&E&!cJs@jA1Bkz%L4LDV<1#kJw8)UUTyVlNZphRL%hYchSP+k9+tI3r{FX1S>%jEwn{ji=q>iFV`? wVC3dvaAb6h-z+)(IJe@r|NsAg0pb@x{1k|v0P#a0z753xfcVa4#>JLm04zG62><{9 delta 448 zcmdn{iD}m-rVT2LOx(fGy#mSL{VnT(E%nD2j%mPdb zERGym3XG10lN$^5fyy@)CNsiK&@YY!3iTE%voQKj-dNrb&yEpDJ?+I(d$ZzH5k|)1 z$!61T@x(iF2{3YVF*q_hCU2IRewp{)P_ diff --git a/packages/vm/wasmhost/wasmkeys.go b/packages/vm/wasmhost/wasmkeys.go index d8fe6e7752..8b9f05098a 100644 --- a/packages/vm/wasmhost/wasmkeys.go +++ b/packages/vm/wasmhost/wasmkeys.go @@ -2,54 +2,58 @@ package wasmhost const ( KeyAddress = int32(-1) - KeyAggregateBls = int32(-2) - KeyBalances = int32(-3) - KeyBase58Bytes = int32(-4) - KeyBase58String = int32(-5) - KeyCall = int32(-6) - KeyCaller = int32(-7) - KeyChainOwnerId = int32(-8) - KeyColor = int32(-9) - KeyContractCreator = int32(-10) - KeyContractId = int32(-11) - KeyDeploy = int32(-12) - KeyEvent = int32(-13) - KeyExports = int32(-14) - KeyHashBlake2b = int32(-15) - KeyHashSha3 = int32(-16) - KeyHname = int32(-17) - KeyIncoming = int32(-18) - KeyLength = int32(-19) - KeyLog = int32(-20) - KeyMaps = int32(-21) - KeyName = int32(-22) - KeyPanic = int32(-23) - KeyParams = int32(-24) - KeyPost = int32(-25) - KeyRandom = int32(-26) - KeyResults = int32(-27) - KeyReturn = int32(-28) - KeyState = int32(-29) - KeyTimestamp = int32(-30) - KeyTrace = int32(-31) - KeyTransfers = int32(-32) - KeyUtility = int32(-33) - KeyValid = int32(-34) - KeyValidBls = int32(-35) - KeyValidEd25519 = int32(-36) + KeyBalances = int32(-2) + KeyBase58Bytes = int32(-3) + KeyBase58String = int32(-4) + KeyBlsAddress = int32(-5) + KeyBlsAggregate = int32(-6) + KeyBlsValid = int32(-7) + KeyCall = int32(-8) + KeyCaller = int32(-9) + KeyChainOwnerId = int32(-10) + KeyColor = int32(-11) + KeyContractCreator = int32(-12) + KeyContractId = int32(-13) + KeyDeploy = int32(-14) + KeyEd25519Address = int32(-15) + KeyEd25519Valid = int32(-16) + KeyEvent = int32(-17) + KeyExports = int32(-18) + KeyHashBlake2b = int32(-19) + KeyHashSha3 = int32(-20) + KeyHname = int32(-21) + KeyIncoming = int32(-22) + KeyLength = int32(-23) + KeyLog = int32(-24) + KeyMaps = int32(-25) + KeyName = int32(-26) + KeyPanic = int32(-27) + KeyParams = int32(-28) + KeyPost = int32(-29) + KeyRandom = int32(-30) + KeyResults = int32(-31) + KeyReturn = int32(-32) + KeyState = int32(-33) + KeyTimestamp = int32(-34) + KeyTrace = int32(-35) + KeyTransfers = int32(-36) + KeyUtility = int32(-37) + KeyValid = int32(-38) // Treat this one like a version number. When anything changes // to the keys give this one a different value and make sure // the client side in wasplib is updated accordingly - KeyZzzzzzz = int32(-37) + KeyZzzzzzz = int32(-39) ) var keyMap = map[string]int32{ "address": KeyAddress, - "aggregateBls": KeyAggregateBls, "balances": KeyBalances, "base58Bytes": KeyBase58Bytes, "base58String": KeyBase58String, + "blsAddress": KeyBlsAddress, + "blsAggregate": KeyBlsAggregate, + "blsValid": KeyBlsValid, "call": KeyCall, "caller": KeyCaller, "chainOwnerId": KeyChainOwnerId, @@ -57,6 +61,8 @@ var keyMap = map[string]int32{ "contractCreator": KeyContractCreator, "contractId": KeyContractId, "deploy": KeyDeploy, + "ed25519Address": KeyEd25519Address, + "ed25519Valid": KeyEd25519Valid, "event": KeyEvent, "exports": KeyExports, "hashBlake2b": KeyHashBlake2b, @@ -79,6 +85,4 @@ var keyMap = map[string]int32{ "transfers": KeyTransfers, "utility": KeyUtility, "valid": KeyValid, - "validBls": KeyValidBls, - "validEd25519": KeyValidEd25519, } diff --git a/packages/vm/wasmproc/scutility.go b/packages/vm/wasmproc/scutility.go index a804162027..2e43885b83 100644 --- a/packages/vm/wasmproc/scutility.go +++ b/packages/vm/wasmproc/scutility.go @@ -4,6 +4,7 @@ package wasmproc import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/kv/codec" @@ -14,6 +15,7 @@ var TestMode = false type ScUtility struct { ScSandboxObject + address address.Address aggregatedBls []byte base58Decoded []byte base58Encoded string @@ -48,7 +50,9 @@ func (o *ScUtility) Exists(keyId int32, typeId int32) bool { func (o *ScUtility) GetBytes(keyId int32, typeId int32) []byte { switch keyId { - case wasmhost.KeyAggregateBls: + case wasmhost.KeyAddress: + return o.address.Bytes() + case wasmhost.KeyBlsAggregate: return o.aggregatedBls case wasmhost.KeyBase58Bytes: return o.base58Decoded @@ -93,12 +97,22 @@ func (o *ScUtility) getRandom8Bytes() []byte { func (o *ScUtility) GetTypeId(keyId int32) int32 { switch keyId { - case wasmhost.KeyAggregateBls: + case wasmhost.KeyAddress: + return wasmhost.OBJTYPE_ADDRESS + case wasmhost.KeyBlsAddress: + return wasmhost.OBJTYPE_BYTES + case wasmhost.KeyBlsAggregate: + return wasmhost.OBJTYPE_BYTES + case wasmhost.KeyBlsValid: return wasmhost.OBJTYPE_BYTES case wasmhost.KeyBase58Bytes: return wasmhost.OBJTYPE_BYTES case wasmhost.KeyBase58String: return wasmhost.OBJTYPE_STRING + case wasmhost.KeyEd25519Address: + return wasmhost.OBJTYPE_BYTES + case wasmhost.KeyEd25519Valid: + return wasmhost.OBJTYPE_BYTES case wasmhost.KeyHashBlake2b: return wasmhost.OBJTYPE_HASH case wasmhost.KeyHashSha3: @@ -111,10 +125,6 @@ func (o *ScUtility) GetTypeId(keyId int32) int32 { return wasmhost.OBJTYPE_INT case wasmhost.KeyValid: return wasmhost.OBJTYPE_INT - case wasmhost.KeyValidBls: - return wasmhost.OBJTYPE_BYTES - case wasmhost.KeyValidEd25519: - return wasmhost.OBJTYPE_BYTES } return 0 } @@ -123,7 +133,11 @@ func (o *ScUtility) SetBytes(keyId int32, typeId int32, bytes []byte) { utils := o.vm.utils() var err error switch keyId { - case wasmhost.KeyAggregateBls: + case wasmhost.KeyBlsAddress: + o.address, err = utils.BLS().AddressFromPublicKey(bytes) + case wasmhost.KeyEd25519Address: + o.address, err = utils.ED25519().AddressFromPublicKey(bytes) + case wasmhost.KeyBlsAggregate: o.aggregatedBls = o.aggregateBLSSignatures(bytes) case wasmhost.KeyBase58Bytes: o.base58Encoded = utils.Base58().Encode(bytes) @@ -135,9 +149,9 @@ func (o *ScUtility) SetBytes(keyId int32, typeId int32, bytes []byte) { o.hash = utils.Hashing().Sha3(bytes) case wasmhost.KeyName: o.hname = utils.Hashing().Hname(string(bytes)) - case wasmhost.KeyValidBls: + case wasmhost.KeyBlsValid: o.valid = o.validBLSSignature(bytes) - case wasmhost.KeyValidEd25519: + case wasmhost.KeyEd25519Valid: o.valid = o.validED25519Signature(bytes) default: o.invalidKey(keyId) @@ -161,7 +175,6 @@ func (o *ScUtility) aggregateBLSSignatures(bytes []byte) []byte { } pubKeyBin, sigBin, err := o.vm.utils().BLS().AggregateBLSSignatures(pubKeysBin, sigsBin) if err != nil { - // TODO return error o.Panic(err.Error()) } return NewBytesEncoder().Bytes(pubKeyBin).Bytes(sigBin).Data() @@ -174,7 +187,6 @@ func (o *ScUtility) validBLSSignature(bytes []byte) bool { signature := decode.Bytes() ok, err := o.vm.utils().BLS().ValidSignature(data, pubKey, signature) if err != nil { - // TODO return error o.Panic(err.Error()) } return ok @@ -187,7 +199,6 @@ func (o *ScUtility) validED25519Signature(bytes []byte) bool { signature := decode.Bytes() ok, err := o.vm.utils().ED25519().ValidSignature(data, pubKey, signature) if err != nil { - // TODO return error o.Panic(err.Error()) } return ok diff --git a/tools/cluster/tests/wasm/inccounter_bg.wasm b/tools/cluster/tests/wasm/inccounter_bg.wasm index e556e94c3c44d6e5cd9af7b75c7d35667a09d60c..5a655ea8ac124451b4d4d2e64f6c03846aebeea1 100644 GIT binary patch delta 98 zcmZ4WopIH7#tlr~QWcKO3QQVI3?PC Date: Fri, 19 Feb 2021 20:32:44 +0200 Subject: [PATCH 13/39] refactored util.ValidSignature --- contracts/native/micropay/impl.go | 3 +-- packages/coretypes/utils_interface.go | 4 ++-- packages/vm/sandbox/sandbox_utils/bls.go | 6 +++--- packages/vm/sandbox/sandbox_utils/ed25519.go | 8 ++++---- packages/vm/wasmproc/scutility.go | 12 ++---------- 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/contracts/native/micropay/impl.go b/contracts/native/micropay/impl.go index 1fe83d04f7..ddbe73db61 100644 --- a/contracts/native/micropay/impl.go +++ b/contracts/native/micropay/impl.go @@ -261,8 +261,7 @@ func processPayments(ctx coretypes.Sandbox, payments []*Payment, payerAddr, targ } data := paymentEssence(p.Ord, p.Amount, payerAddr, targetAddr) lastOrd = int64(p.Ord) - ok, err := ctx.Utils().ED25519().ValidSignature(data, payerPubKey, p.SignatureShort) - if !ok || err != nil { + if !ctx.Utils().ED25519().ValidSignature(data, payerPubKey, p.SignatureShort) { ctx.Log().Infof("wrong signature") notSettled = append(notSettled, p) continue diff --git a/packages/coretypes/utils_interface.go b/packages/coretypes/utils_interface.go index 2544c4ba02..248a7a20dc 100644 --- a/packages/coretypes/utils_interface.go +++ b/packages/coretypes/utils_interface.go @@ -26,12 +26,12 @@ type Base58 interface { } type ED25519 interface { - ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) + ValidSignature(data []byte, pubKey []byte, signature []byte) bool AddressFromPublicKey(pubKey []byte) (address.Address, error) } type BLS interface { - ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) + ValidSignature(data []byte, pubKey []byte, signature []byte) bool AddressFromPublicKey(pubKey []byte) (address.Address, error) AggregateBLSSignatures(pubKeysBin [][]byte, sigsBin [][]byte) ([]byte, []byte, error) } diff --git a/packages/vm/sandbox/sandbox_utils/bls.go b/packages/vm/sandbox/sandbox_utils/bls.go index 10a49046f6..50881b6bba 100644 --- a/packages/vm/sandbox/sandbox_utils/bls.go +++ b/packages/vm/sandbox/sandbox_utils/bls.go @@ -16,13 +16,13 @@ type blsUtil struct { var suite = bn256.NewSuite() -func (u blsUtil) ValidSignature(data []byte, pubKeyBin []byte, signature []byte) (bool, error) { +func (u blsUtil) ValidSignature(data []byte, pubKeyBin []byte, signature []byte) bool { pubKey := suite.G2().Point() var err error if err = pubKey.UnmarshalBinary(pubKeyBin); err != nil { - return false, fmt.Errorf("BLSUtil: wrong public key bytes") + return false } - return bdn.Verify(suite, pubKey, data, signature) == nil, nil + return bdn.Verify(suite, pubKey, data, signature) == nil } func (u blsUtil) AddressFromPublicKey(pubKeyBin []byte) (address.Address, error) { diff --git a/packages/vm/sandbox/sandbox_utils/ed25519.go b/packages/vm/sandbox/sandbox_utils/ed25519.go index 797cea691f..9081b40b51 100644 --- a/packages/vm/sandbox/sandbox_utils/ed25519.go +++ b/packages/vm/sandbox/sandbox_utils/ed25519.go @@ -12,16 +12,16 @@ import ( type ed25519Util struct { } -func (u ed25519Util) ValidSignature(data []byte, pubKey []byte, signature []byte) (bool, error) { +func (u ed25519Util) ValidSignature(data []byte, pubKey []byte, signature []byte) bool { pk, _, err := ed25519.PublicKeyFromBytes(pubKey) if err != nil { - return false, fmt.Errorf("ED255519Util: wrong public key bytes") + return false } sig, _, err := ed25519.SignatureFromBytes(signature) if err != nil { - return false, fmt.Errorf("ED255519Util: wrong signature bytes") + return false } - return pk.VerifySignature(data, sig), nil + return pk.VerifySignature(data, sig) } func (u ed25519Util) AddressFromPublicKey(pubKey []byte) (address.Address, error) { diff --git a/packages/vm/wasmproc/scutility.go b/packages/vm/wasmproc/scutility.go index 2e43885b83..1c64abb73d 100644 --- a/packages/vm/wasmproc/scutility.go +++ b/packages/vm/wasmproc/scutility.go @@ -185,11 +185,7 @@ func (o *ScUtility) validBLSSignature(bytes []byte) bool { data := decode.Bytes() pubKey := decode.Bytes() signature := decode.Bytes() - ok, err := o.vm.utils().BLS().ValidSignature(data, pubKey, signature) - if err != nil { - o.Panic(err.Error()) - } - return ok + return o.vm.utils().BLS().ValidSignature(data, pubKey, signature) } func (o *ScUtility) validED25519Signature(bytes []byte) bool { @@ -197,9 +193,5 @@ func (o *ScUtility) validED25519Signature(bytes []byte) bool { data := decode.Bytes() pubKey := decode.Bytes() signature := decode.Bytes() - ok, err := o.vm.utils().ED25519().ValidSignature(data, pubKey, signature) - if err != nil { - o.Panic(err.Error()) - } - return ok + return o.vm.utils().ED25519().ValidSignature(data, pubKey, signature) } From 94086a4dbe77ab3617213e64652a2a2529584792 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Fri, 19 Feb 2021 12:02:01 -0800 Subject: [PATCH 14/39] Fixed token transfer interface --- articles/tutorial/example-tutorial/src/lib.rs | 2 +- .../test/example_tutorial_bg.wasm | Bin 29566 -> 29417 bytes contracts/rust/README.md | 2 +- contracts/rust/dividend/README.md | 5 +- contracts/rust/dividend/src/dividend.rs | 2 +- contracts/rust/dividend/test/dividend_bg.wasm | Bin 34495 -> 34364 bytes .../src/donatewithfeedback.rs | 4 +- .../test/donatewithfeedback_bg.wasm | Bin 36204 -> 36046 bytes contracts/rust/erc20/test/fun_test.go | 20 +++--- contracts/rust/fairauction/src/fairauction.rs | 4 +- .../rust/fairauction/test/fairauction_bg.wasm | Bin 42661 -> 42361 bytes .../rust/fairroulette/src/fairroulette.rs | 6 +- .../fairroulette/test/fairroulette_bg.wasm | Bin 37040 -> 36758 bytes contracts/rust/inccounter/src/inccounter.rs | 4 +- contracts/rust/inccounter/src/lib.rs | 2 +- .../rust/inccounter/test/inccounter_bg.wasm | Bin 31658 -> 31561 bytes .../rust/inccounter/test/inccounter_test.go | 20 +++--- contracts/rust/testcore/src/lib.rs | 2 +- contracts/rust/testcore/src/testcore.rs | 5 +- contracts/rust/testcore/test | Bin 47421 -> 47093 bytes contracts/rust/wasmlib/README.md | 16 +++-- contracts/rust/wasmlib/src/bytes.rs | 4 +- contracts/rust/wasmlib/src/context.rs | 62 ++++++++---------- contracts/rust/wasmlib/src/mutable.rs | 18 ++--- .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47421 -> 47093 bytes tools/cluster/tests/wasm/inccounter_bg.wasm | Bin 31658 -> 31561 bytes 26 files changed, 87 insertions(+), 91 deletions(-) diff --git a/articles/tutorial/example-tutorial/src/lib.rs b/articles/tutorial/example-tutorial/src/lib.rs index 815fec6205..c3128ceffd 100644 --- a/articles/tutorial/example-tutorial/src/lib.rs +++ b/articles/tutorial/example-tutorial/src/lib.rs @@ -55,6 +55,6 @@ fn withdraw_iota(ctx: &ScFuncContext) { let bal = ctx.balances().balance(&ScColor::IOTA); if bal > 0 { - ctx.transfer_to_address(&caller.address(), &ScTransfers::new(&ScColor::IOTA, bal)) + ctx.transfer_to_address(&caller.address(), ScTransfers::new(&ScColor::IOTA, bal)) } } diff --git a/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm b/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm index 9e917bbe4de641edd3f596acaa7743ccf034fe21..c18db1be040906bce74aacce94165050edd95c97 100644 GIT binary patch delta 4247 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 C5!(*{ delta 4566 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 diff --git a/contracts/rust/README.md b/contracts/rust/README.md index e8c15f7034..096733ba7c 100644 --- a/contracts/rust/README.md +++ b/contracts/rust/README.md @@ -1,6 +1,6 @@ ## Smart Contracts -Note that most example smart contracts only show the concepts involved in creating them but should +Note that most example smart contracts only show the concepts involved in creating them but should not be taken as fully functional code. Sample smart contracts: diff --git a/contracts/rust/dividend/README.md b/contracts/rust/dividend/README.md index dd8125942b..94c567cdf5 100644 --- a/contracts/rust/dividend/README.md +++ b/contracts/rust/dividend/README.md @@ -2,6 +2,7 @@ Simple dividend smart contract -- Allows for setting up automatic dividend dispersal to a number of recipients according to distribution factors per - recipient. Any tokens sent to this contract will automatically be divided accordingly over these recipients. +- Allows for setting up automatic dividend dispersal to a number of recipients according to + distribution factors per recipient. Any tokens sent to this contract will automatically be divided + accordingly over these recipients. diff --git a/contracts/rust/dividend/src/dividend.rs b/contracts/rust/dividend/src/dividend.rs index 7518460580..808e97f230 100644 --- a/contracts/rust/dividend/src/dividend.rs +++ b/contracts/rust/dividend/src/dividend.rs @@ -23,7 +23,7 @@ pub fn func_divide(ctx: &ScFuncContext) { let part = amount * m.factor / total; if part != 0 { parts += part; - ctx.transfer_to_address(&m.address, &ScTransfers::new(&ScColor::IOTA, part)); + ctx.transfer_to_address(&m.address, ScTransfers::new(&ScColor::IOTA, part)); } } if parts != amount { diff --git a/contracts/rust/dividend/test/dividend_bg.wasm b/contracts/rust/dividend/test/dividend_bg.wasm index ca2ea0716bffd17bd47093450107a4c8cbc0d82d..cfc6b2c2340ced3d6fc1e626b846221df9e486b0 100644 GIT binary patch delta 5782 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 U`&+dcT+Q6Vf!_dW`N0GK2l4KQF#rGn delta 5971 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 0 { - ctx.transfer_to_address(&donation.donator.address(), &ScTransfers::new(&ScColor::IOTA, donation.amount)); + ctx.transfer_to_address(&donation.donator.address(), ScTransfers::new(&ScColor::IOTA, donation.amount)); donation.amount = 0; } } @@ -54,7 +54,7 @@ pub fn func_withdraw(ctx: &ScFuncContext) { } let sc_creator = ctx.contract_creator().address(); - ctx.transfer_to_address(&sc_creator, &ScTransfers::new(&ScColor::IOTA, amount)); + ctx.transfer_to_address(&sc_creator, ScTransfers::new(&ScColor::IOTA, amount)); ctx.log("dwf.withdraw ok"); } diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm b/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm index c2f55481ab50cc5d51afd1713d2fe9c304a0c889..24805bde158092277e5b506ed0021c6f7446998b 100644 GIT binary patch delta 5934 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 V;o)t16lVoDeuP&ysJiRm{{gG{h?oEX diff --git a/contracts/rust/erc20/test/fun_test.go b/contracts/rust/erc20/test/fun_test.go index 9f5876deb1..1090f1b6dd 100644 --- a/contracts/rust/erc20/test/fun_test.go +++ b/contracts/rust/erc20/test/fun_test.go @@ -41,7 +41,7 @@ func deployErc20(t *testing.T) *solo.Chain { func checkErc20Balance(e *solo.Chain, account coretypes.AgentID, amount int64) { res, err := e.CallView(ScName, ViewBalanceOf, ParamAccount, account, - ) + ) require.NoError(e.Env.T, err) sup, ok, err := codec.DecodeInt64(res.MustGet(ParamAmount)) require.NoError(e.Env.T, err) @@ -53,7 +53,7 @@ func checkErc20Allowance(e *solo.Chain, account coretypes.AgentID, delegation co res, err := e.CallView(ScName, ViewAllowance, ParamAccount, account, ParamDelegation, delegation, - ) + ) require.NoError(e.Env.T, err) del, ok, err := codec.DecodeInt64(res.MustGet(ParamAmount)) require.NoError(e.Env.T, err) @@ -93,7 +93,7 @@ func TestTransferOk2(t *testing.T) { req := solo.NewCallParams(ScName, FuncTransfer, ParamAccount, userAgentID, ParamAmount, amount, - ) + ) _, err := chain.PostRequest(req, creator) require.NoError(t, err) @@ -103,7 +103,7 @@ func TestTransferOk2(t *testing.T) { req = solo.NewCallParams(ScName, FuncTransfer, ParamAccount, creatorAgentID, ParamAmount, amount, - ) + ) _, err = chain.PostRequest(req, user) require.NoError(t, err) @@ -124,7 +124,7 @@ func TestTransferNotEnoughFunds1(t *testing.T) { req := solo.NewCallParams(ScName, FuncTransfer, ParamAccount, userAgentID, ParamAmount, amount, - ) + ) _, err := chain.PostRequest(req, creator) require.Error(t, err) @@ -145,7 +145,7 @@ func TestTransferNotEnoughFunds2(t *testing.T) { req := solo.NewCallParams(ScName, FuncTransfer, ParamAccount, creatorAgentID, ParamAmount, amount, - ) + ) _, err := chain.PostRequest(req, user) require.Error(t, err) @@ -168,7 +168,7 @@ func TestApprove(t *testing.T) { req := solo.NewCallParams(ScName, FuncApprove, ParamDelegation, userAgentID, ParamAmount, 100, - ) + ) _, err := chain.PostRequest(req, creator) require.NoError(t, err) @@ -185,7 +185,7 @@ func TestTransferFromOk1(t *testing.T) { req := solo.NewCallParams(ScName, FuncApprove, ParamDelegation, userAgentID, ParamAmount, 100, - ) + ) _, err := chain.PostRequest(req, creator) require.NoError(t, err) @@ -214,7 +214,7 @@ func TestTransferFromOk2(t *testing.T) { req := solo.NewCallParams(ScName, FuncApprove, ParamDelegation, userAgentID, ParamAmount, 100, - ) + ) _, err := chain.PostRequest(req, creator) require.NoError(t, err) @@ -243,7 +243,7 @@ func TestTransferFromFail(t *testing.T) { req := solo.NewCallParams(ScName, FuncApprove, ParamDelegation, userAgentID, ParamAmount, 100, - ) + ) _, err := chain.PostRequest(req, creator) require.NoError(t, err) diff --git a/contracts/rust/fairauction/src/fairauction.rs b/contracts/rust/fairauction/src/fairauction.rs index f71aaf0b0a..b83d5a928c 100644 --- a/contracts/rust/fairauction/src/fairauction.rs +++ b/contracts/rust/fairauction/src/fairauction.rs @@ -270,10 +270,10 @@ pub fn view_get_info(ctx: &ScViewContext) { fn transfer(ctx: &ScFuncContext, agent: &ScAgentId, color: &ScColor, amount: i64) { if agent.is_address() { // send back to original Tangle address - ctx.transfer_to_address(&agent.address(), &ScTransfers::new(color, amount)); + ctx.transfer_to_address(&agent.address(), ScTransfers::new(color, amount)); return; } // TODO not an address, deposit into account on chain - ctx.transfer_to_address(&agent.address(), &ScTransfers::new(color, amount)); + ctx.transfer_to_address(&agent.address(), ScTransfers::new(color, amount)); } diff --git a/contracts/rust/fairauction/test/fairauction_bg.wasm b/contracts/rust/fairauction/test/fairauction_bg.wasm index e5c43634daf36e4e744931befa52aa35f63d5e67..21668abe096e621bf099b3898759591995b43f9e 100644 GIT binary patch delta 7072 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 PoWTF-hDOJCsP2COM*ZK5 delta 7551 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 diff --git a/contracts/rust/fairroulette/src/fairroulette.rs b/contracts/rust/fairroulette/src/fairroulette.rs index a140f0cdd2..f73c7f1fef 100644 --- a/contracts/rust/fairroulette/src/fairroulette.rs +++ b/contracts/rust/fairroulette/src/fairroulette.rs @@ -64,7 +64,7 @@ pub fn func_pay_winners(ctx: &ScFuncContext) { if winners.is_empty() { ctx.log("Nobody wins!"); // compact separate bet deposit UTXOs into a single one - ctx.transfer_to_address(&sc_id.address(), &ScTransfers::new(&ScColor::IOTA, total_bet_amount)); + ctx.transfer_to_address(&sc_id.address(), ScTransfers::new(&ScColor::IOTA, total_bet_amount)); return; } @@ -76,7 +76,7 @@ pub fn func_pay_winners(ctx: &ScFuncContext) { let payout = total_bet_amount * bet.amount / total_win_amount; if payout != 0 { total_payout += payout; - ctx.transfer_to_address(&bet.better.address(), &ScTransfers::new(&ScColor::IOTA, payout)); + ctx.transfer_to_address(&bet.better.address(), ScTransfers::new(&ScColor::IOTA, payout)); } let text = "Pay ".to_string() + &payout.to_string() + " to " + &bet.better.to_string(); @@ -88,7 +88,7 @@ pub fn func_pay_winners(ctx: &ScFuncContext) { let remainder = total_bet_amount - total_payout; let text = "Remainder is ".to_string() + &remainder.to_string(); ctx.log(&text); - ctx.transfer_to_address(&sc_id.address(), &ScTransfers::new(&ScColor::IOTA, remainder)); + ctx.transfer_to_address(&sc_id.address(), ScTransfers::new(&ScColor::IOTA, remainder)); } ctx.log("fairroulette.payWinners ok"); } diff --git a/contracts/rust/fairroulette/test/fairroulette_bg.wasm b/contracts/rust/fairroulette/test/fairroulette_bg.wasm index c9c31d604116530b0fe7a84127d668fdc225206f..940f65a0bb48cc12fc0fb33250ff88bbfeacedc3 100644 GIT binary patch delta 8417 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 cUjy4L+5a&>r|cXEL5n;$P>Tt?F>q delta 2240 zcmaJ?eN2^A7(dTB?}ZEZ1rCXdz~trf5r_&ZLLepQCY#9kP(VPqdKCq_Bz~2W!o6gr zW@~<&xu&_5mFAjG-F2gd6xkvj8Jrt&JzzXBX4$M0o9vODIISH4C7%}EzLd2yoVF|&Q#j&&GIKkss zVq6?!JU*Vgnc(zuP%#zht(0B1w0!L|%VtlnsNJ?A)EV-I3b%zrFC;Gm*f1I%jVb)E@bE&PAfC$lLR7QA(d} zna5aT68Ff>Os`y=tKXZSL<9Qt{CpaU+?fBV$f}IGc+RE1Itm92Csek&8D%2JEB|m& zb>z@OKToMPzNt}CclJWDT9fa-J>aEUt47(%l0%WW=hJD*pu-$dB-|C;vI%!NmSS=+ zQno0^HKorM<_h>j#venI9MA)Gg~>zaUB?PKMwcjMT153CAN2$EF@ z2LdN33!G`uz0q8@pMrVJvx|tr2&Gh0(_kUENfQ^J@{G3?Nk>#<&n7#D-sCHArloxRD@hdxoBWL2#gB3+blK$ zGitII(GWT%kLlZRsY|CeH%uB-EQi~O!ZH`Q5Y?dG)SO0xdRO!9Nb)k9$kCZCE3j^D zDMBmcxAvv<8OO+25gs4V@3y{A)w;Uvt>~KPyh)tLa5V~CQ62+Ij1%MV(bwB2=aqOx z6hV$K_#pK|6b7VbnmE8180dr!$5Q}a1|>>O`scO+nxXCG`>-Be{u|}#J?;5=PDhCR z`fP_zoDnTAVAro3I%g*UN8Et0SHIpl8aAB=IIELy0ODXaj-wxygp-iOzz@8GcAJdn znA35$%ejSs0ZSapb;fB~n!^#>L?t_>6uSfYX@lbkAWy%xqI2GpmCdU%)>vak%rl@b zcTcYi;EpVlnQvm5$p8sY(j4-gxVGz-oD)_?Y7kAIBZ=3}I@*6t`bUsE{e#y~(BZ|(x>iq)yz z=r1F|bcptn=^0Zr5o?`peRXXIkW{d)hx+y2b(?99{(D^+EsxCYy+qWZ@AkD)v##%7 LfF$qkzxdQYlFQ)4 diff --git a/contracts/rust/inccounter/test/inccounter_test.go b/contracts/rust/inccounter/test/inccounter_test.go index 0d0059d0ee..3e798220f7 100644 --- a/contracts/rust/inccounter/test/inccounter_test.go +++ b/contracts/rust/inccounter/test/inccounter_test.go @@ -24,51 +24,51 @@ func TestDeploy(t *testing.T) { func TestStateAfterDeploy(t *testing.T) { chain := common.StartChainAndDeployWasmContractByName(t, ScName) - + checkStateCounter(t, chain, nil) } func TestIncrementOnce(t *testing.T) { chain := setupTest(t) - + req := solo.NewCallParams(ScName, FuncIncrement) _, err := chain.PostRequest(req, nil) require.NoError(t, err) - + checkStateCounter(t, chain, 1) } func TestIncrementTwice(t *testing.T) { chain := setupTest(t) - + req := solo.NewCallParams(ScName, FuncIncrement) _, err := chain.PostRequest(req, nil) require.NoError(t, err) - + req = solo.NewCallParams(ScName, FuncIncrement) _, err = chain.PostRequest(req, nil) require.NoError(t, err) - + checkStateCounter(t, chain, 2) } func TestIncrementRepeatThrice(t *testing.T) { chain := setupTest(t) - + req := solo.NewCallParams(ScName, FuncRepeatMany, ParamNumRepeats, 3, ).WithTransfer(balance.ColorIOTA, 1) // !!! posts to self _, err := chain.PostRequest(req, nil) require.NoError(t, err) - + chain.WaitForEmptyBacklog() - + checkStateCounter(t, chain, 4) } func TestIncrementCallIncrement(t *testing.T) { chain := setupTest(t) - + req := solo.NewCallParams(ScName, FuncCallIncrement) _, err := chain.PostRequest(req, nil) require.NoError(t, err) diff --git a/contracts/rust/testcore/src/lib.rs b/contracts/rust/testcore/src/lib.rs index 1707fc6f3c..5c318d9b63 100644 --- a/contracts/rust/testcore/src/lib.rs +++ b/contracts/rust/testcore/src/lib.rs @@ -1,8 +1,8 @@ // Copyright 2020 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 -use testcore::*; use consts::*; +use testcore::*; use wasmlib::*; mod testcore; diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index 252c43e119..1aa5046c8b 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -139,7 +139,8 @@ pub fn func_send_to_address(ctx: &ScFuncContext) { ctx.require(param_address.exists(), "missing mandatory address"); - ctx.transfer_to_address(¶m_address.value(), &ctx.balances()); + let balances = ScTransfers::new_transfers_from_balances(ctx.balances()); + ctx.transfer_to_address(¶m_address.value(), balances); ctx.log("testcore.sendToAddress ok"); } @@ -230,7 +231,7 @@ pub fn func_withdraw_to_chain(ctx: &ScFuncContext) { contract_id: target_contract_id, function: CORE_ACCOUNTS_FUNC_WITHDRAW_TO_CHAIN, params: None, - transfer: Some(Box::new(transfers)), + transfer: Some(transfers), delay: 0, }); // TODO how to check if post was successful diff --git a/contracts/rust/testcore/test b/contracts/rust/testcore/test index 12177833c5feec08821c5ee6ab0d62fe2c73569f..4468284cdfe56a00b8f78e87944dde3e13088917 100644 GIT binary patch delta 15014 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 G%Krw`8;(~1 delta 15444 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 diff --git a/contracts/rust/wasmlib/README.md b/contracts/rust/wasmlib/README.md index 5d04897b83..0448f65e31 100644 --- a/contracts/rust/wasmlib/README.md +++ b/contracts/rust/wasmlib/README.md @@ -1,15 +1,17 @@ ## WasmLib for Rust -`WasmLib` allows developers to use Rust to create smart contracts for ISCP that compile into Wasm and can run directly -ISCP-enabled Wasp nodes and on Solo environment. +`WasmLib` allows developers to use Rust to create smart contracts for ISCP that compile into Wasm +and can run directly ISCP-enabled Wasp nodes and on Solo environment. -`WasmLib` treats the programming of smart contracts as simple access to a key/value data and token storage where smart -contract properties, request parameters, token balances and the smart contract state can be accessed in a universal, -consistent way. +`WasmLib` treats the programming of smart contracts as simple access to a key/value data and token +storage where smart contract properties, request parameters, token balances and the smart contract +state can be accessed in a universal, consistent way. -The _wasmlib_ folder provides the interface to the VM sandbox provided by the Wasp node through _ScFuncContext_ and _ +The _wasmlib_ folder provides the interface to the VM sandbox provided by the Wasp node through _ +ScFuncContext_ and _ ScViewContext_. -The folder also contains a number of example smart contracts that can be used to learn how to use _ScFuncContext_ and _ +The folder also contains a number of example smart contracts that can be used to learn how to use _ +ScFuncContext_ and _ ScViewContext_ properly. diff --git a/contracts/rust/wasmlib/src/bytes.rs b/contracts/rust/wasmlib/src/bytes.rs index d747ffbd4f..a7ceab3327 100644 --- a/contracts/rust/wasmlib/src/bytes.rs +++ b/contracts/rust/wasmlib/src/bytes.rs @@ -3,7 +3,7 @@ use crate::hashtypes::*; -// decodes binary encoded data into its separate entities +// decodes separate entities from a byte buffer pub struct BytesDecoder<'a> { data: &'a [u8], } @@ -96,7 +96,7 @@ impl BytesDecoder<'_> { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ -// encodes entities into a binary data buffer +// encodes separate entities into a byte buffer pub struct BytesEncoder { data: Vec, } diff --git a/contracts/rust/wasmlib/src/context.rs b/contracts/rust/wasmlib/src/context.rs index 0aafa8813f..7183ea4337 100644 --- a/contracts/rust/wasmlib/src/context.rs +++ b/contracts/rust/wasmlib/src/context.rs @@ -15,21 +15,16 @@ pub(crate) static ROOT: ScMutableMap = ScMutableMap { obj_id: 1 }; // parameter structure required for ctx.post() pub struct PostRequestParams { //@formatter:off - pub contract_id: ScContractId, // full contract id (chain id + contract Hname) - pub function: ScHname, // Hname of the contract func or view to call - pub params: Option, // an optional map of parameters to pass to the function - pub transfer: Option>, // optional balances to transfer as part of the call - pub delay: i64, // delay in seconds before the function will be run + pub contract_id: ScContractId, // full contract id (chain id + contract Hname) + pub function: ScHname, // Hname of the contract func or view to call + pub params: Option, // an optional map of parameters to pass to the function + pub transfer: Option, // optional balances to transfer as part of the call + pub delay: i64, // delay in seconds before the function will be run //@formatter:on } // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ -// defines which map objects can be passed as a map of transfers to a function call or post -pub trait Balances { - fn map_id(&self) -> i32; -} - // used to retrieve any information that is related to colored token balances pub struct ScBalances { balances: ScImmutableMap, @@ -52,13 +47,6 @@ impl ScBalances { } } -// ScBalances can be used to transfer tokens to a function call -impl Balances for ScBalances { - fn map_id(&self) -> i32 { - self.balances.obj_id - } -} - // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // used to pass token transfer information to a function call @@ -69,9 +57,9 @@ pub struct ScTransfers { impl ScTransfers { // create a new transfers object and initialize it with the specified token transfer pub fn new(color: &ScColor, amount: i64) -> ScTransfers { - let balance = ScTransfers::new_transfers(); - balance.add(color, amount); - balance + let transfer = ScTransfers::new_transfers(); + transfer.add(color, amount); + transfer } // create a new transfer object ready to add token transfers @@ -79,19 +67,23 @@ impl ScTransfers { ScTransfers { transfers: ScMutableMap::new() } } + // create a new transfer object ready to add token transfers + pub fn new_transfers_from_balances(balances: ScBalances) -> ScTransfers { + let transfers = ScTransfers::new_transfers(); + let colors = balances.colors(); + for i in 0..colors.length() { + let color = colors.get_color(i).value(); + transfers.add(&color, balances.balance(&color)); + } + transfers + } + // add the specified token transfer to the transfer object pub fn add(&self, color: &ScColor, amount: i64) { self.transfers.get_int(color).set_value(amount); } } -// ScTransfers can be used to transfer tokens to a function call -impl Balances for ScTransfers { - fn map_id(&self) -> i32 { - self.transfers.obj_id - } -} - // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // provide access to utility functions that are handled by the host @@ -272,7 +264,7 @@ impl ScBaseContext for ScFuncContext {} impl ScFuncContext { // synchronously calls the specified smart contract function, // passing the provided parameters and token transfers to it - pub fn call(&self, hcontract: ScHname, hfunction: ScHname, params: Option, transfer: Option>) -> ScImmutableMap { + pub fn call(&self, hcontract: ScHname, hfunction: ScHname, params: Option, transfer: Option) -> ScImmutableMap { let mut encode = BytesEncoder::new(); encode.hname(&hcontract); encode.hname(&hfunction); @@ -281,8 +273,8 @@ impl ScFuncContext { } else { encode.int(0); } - if let Some(transfer) = transfer { - encode.int(transfer.map_id() as i64); + if let Some(transfers) = transfer { + encode.int(transfers.transfers.obj_id as i64); } else { encode.int(0); } @@ -294,8 +286,8 @@ impl ScFuncContext { pub fn caller(&self) -> ScAgentId { ROOT.get_agent_id(&KEY_CALLER).value() } // shorthand to synchronously call a smart contract function on the current contract - pub fn call_self(&self, hfunction: ScHname, params: Option, transfer: Option>) -> ScImmutableMap { - self.call(self.contract_id().hname(), hfunction, params, transfer) + pub fn call_self(&self, hfunction: ScHname, params: Option, transfers: Option) -> ScImmutableMap { + self.call(self.contract_id().hname(), hfunction, params, transfers) } // deploys a new instance of the specified smart contract on the current chain @@ -335,7 +327,7 @@ impl ScFuncContext { encode.int(0); } if let Some(transfer) = &par.transfer { - encode.int(transfer.map_id() as i64); + encode.int(transfer.transfers.obj_id as i64); } else { encode.int(0); } @@ -349,11 +341,11 @@ impl ScFuncContext { } // transfers the specified tokens to the specified Tangle ledger address - pub fn transfer_to_address(&self, address: &ScAddress, transfer: &T) { + pub fn transfer_to_address(&self, address: &ScAddress, transfer: ScTransfers) { let transfers = ROOT.get_map_array(&KEY_TRANSFERS); let tx = transfers.get_map(transfers.length()); tx.get_address(&KEY_ADDRESS).set_value(address); - tx.get_int(&KEY_BALANCES).set_value(transfer.map_id() as i64); + tx.get_int(&KEY_BALANCES).set_value(transfer.transfers.obj_id as i64); } } diff --git a/contracts/rust/wasmlib/src/mutable.rs b/contracts/rust/wasmlib/src/mutable.rs index 6756c475f4..fe91928fca 100644 --- a/contracts/rust/wasmlib/src/mutable.rs +++ b/contracts/rust/wasmlib/src/mutable.rs @@ -59,7 +59,7 @@ impl ScMutableAddressArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableAddressArray { - ScImmutableAddressArray{obj_id:self.obj_id} + ScImmutableAddressArray { obj_id: self.obj_id } } // number of items in array @@ -118,7 +118,7 @@ impl ScMutableAgentIdArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableAgentIdArray { - ScImmutableAgentIdArray{obj_id:self.obj_id} + ScImmutableAgentIdArray { obj_id: self.obj_id } } // number of items in array @@ -177,7 +177,7 @@ impl ScMutableBytesArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableBytesArray { - ScImmutableBytesArray{obj_id:self.obj_id} + ScImmutableBytesArray { obj_id: self.obj_id } } // number of items in array @@ -266,7 +266,7 @@ impl ScMutableColorArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableColorArray { - ScImmutableColorArray{obj_id:self.obj_id} + ScImmutableColorArray { obj_id: self.obj_id } } // number of items in array @@ -355,7 +355,7 @@ impl ScMutableHashArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableHashArray { - ScImmutableHashArray{obj_id:self.obj_id} + ScImmutableHashArray { obj_id: self.obj_id } } // number of items in array @@ -445,7 +445,7 @@ impl ScMutableIntArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableIntArray { - ScImmutableIntArray{obj_id:self.obj_id} + ScImmutableIntArray { obj_id: self.obj_id } } // number of items in array @@ -577,7 +577,7 @@ impl ScMutableMap { // get immutable version of map pub fn immutable(&self) -> ScImmutableMap { - ScImmutableMap{obj_id:self.obj_id} + ScImmutableMap { obj_id: self.obj_id } } } @@ -602,7 +602,7 @@ impl ScMutableMapArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableMapArray { - ScImmutableMapArray{obj_id:self.obj_id} + ScImmutableMapArray { obj_id: self.obj_id } } // number of items in array @@ -662,7 +662,7 @@ impl ScMutableStringArray { // get immutable version of array pub fn immutable(&self) -> ScImmutableStringArray { - ScImmutableStringArray{obj_id:self.obj_id} + ScImmutableStringArray { obj_id: self.obj_id } } // number of items in array diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index 12177833c5feec08821c5ee6ab0d62fe2c73569f..4468284cdfe56a00b8f78e87944dde3e13088917 100644 GIT binary patch delta 15014 zcmb7r3w%`7wfEWQ%nTDIAtz5J@fr4)2G8g*pL( zpn?Q8AVtI=ukZ$gEv2YIDWat<_2XLW-Bv)u^4-Dn#N+&JTd%jsA`ItnxT0NgK7B3n1^``E!k)I z0QnM_&*w!G(=^th17lvs3?pEG&cGj0dkhZ%&7&n~nwQ9khi({NpU*J#1kK}NhTo$n zGF|g~G|fmL7G9$xs2J;jk-fdWUN7@&31H~a4c!2d7i=|>sH3Loem~d(+W`U?9xt26 zCQlao*r3=`5R0?Gy+2{ASiqb;C#9gUc=COfca5Cc{qB;~>^qC*CO^POP3ZeNdz!t? z*5EpeYr!`51|BctDtnvtYsT|+{Ck@=cRqg7tX#P1fZSAu87=|DS8x3p3=PDq111iic&B8S*n_50mbYWu{rgTjV2^4m9 zi3LjE%rN80V=xTixny@)JR2wq(Bv#eOgubAlzN-M;1=&|aVed@Wx2jeH`x zM#O~WwS<&xz9O85a4lq=OJYUhu9B^9;dL!;gr_I3vw;QzHrW6@`C2g{X;;YwdOd67 zKOlfG)cukhXd&QIQ@GQ8Z1hFA06&WxQPGp1wt)`_xL^bHjFXY3)C?}UXalhFs zOxomhBgnwU^`C!`xJ8Wj;SYYCs$tg>r`^` zPgBcGIX|foThPL^98=lG1g1 z3M~}7GUwkKmfrTllF6_f(wV~Y{?4t#^7+oc^EK~k;y@GQ7Pb9?q&5?2ul*Nh-U&W3xC5JjI0Nt@0=imu_-s`Y>w~%W_zJ>|#Oe zekFKTn&nl!8jsrJQix855f?wwk;x)>exov!g|+Bc(;<)E0|| zi2x4GI9t$9_gG4a5Wum6%BaLvzJZt2h2*7l;pQdgcAwKuig+WhM-m&6gc*elN=p|- zsK;r0(lQ#_nKW}IEj$Iy`qpFON@PghzaMKR$)F4ii)D3^$1?cK`luwYrSpG3CaMd2 zigA%Zh9YBu0OoV!hA}^6@U=~1Zlr{r5idsiW}SJJ*k}RbgM9goF`xS%5Bc~R@gI>& zecew*NnsayR2Noctotd^w&HdAXOh>S#9M`Z*`LJU3v&m3g{Uxph^0vd0AB+^Wen(+ zVb&lP41SdH_Nl~#qJ8WM@t;MxxCe^|uqT=(6whM--s%};dqinTrtjny@Y^fKm1M>C zG05CZ@KG3VJb;T@6c!5+ep79;#*@sq(9)C4+E0%FyOXdTB({&jmI2#%lXj58_6N3q z)ZD@NtJK!TtOZYn8(v|+5iwL&)ZC=7G^`ftr;i3c5;b2GH%daG7a2J$FlAA5VLyFY zzTds!&a81Tg;SdY+zBdftfp% zh>k);N?F>lLZed36ruS=^ktl((*QXYhYs4^P0aCZVEn8yNh=C)3Yx>!-29F_;*PQ` zwy$Y&8DpK-9)umIz&~`X6jsM*I5DDo_^-vh@^SjwgW^niI{USFzg)2EP0`!#Vx8lq?7g0~hzWiA1}Uyp%_G-Oh$IVu%i^Uz%T?hg3!=-SxbF#8CtCUrVq2SX z`*FsWhzBZ$fXho2_pt5ai;5WuhZ-T2R|~u*ruR=D-b#s9g;9$sliB!R*EefCQz8y7uOj|8@! zus%uq1BE3MZy~H-Vrvw3GO&?o%-qiS4rI%$FG7x(fY*s^13+b&OCs3gtU5T|~S$phs+orIcvl*@89JGM{Dq z0ugtNk2}1o=x+W#;Q|UrBM%?X|CLZl3I#)e1C4)>>=GmhI8y~gP)3ELCXDbIbxkyD zW400D{i*}*B(Y>-wq{}ylXSki9$hsOQ@(YIkFR)8yqiz4;ru^c0z;h(hw)WUp{Fgc z9R*e9UJOiO>34b5W*Qz&dO$V_hlyXNI+I=)kRb7!4fQCE!YiV%oqio!cb7 zPnUxs{6lOQm@$;vTz>ZdsV%XspRHH{Y_i0<{A>eZJA%)r1M^2v`jdGJDHNK1l|bl@ zhZLHJNJlSFk5)ED6|>0`4vL7Zt$G%Urs9QJ);(P~cQki-JH z_Jo?$n89*V|CdNJ)M)X<2d1{g8;L*W$G;-Fu(CK(JS_exP9MnP^>K^0lgQ_x`&Eed zN6H{=Q;@hZI8&yY92NWs0{#^ds-)6QVJ%=?38<&SMu2rCpgsy)2CORqxtz$AfLzIH zOI-}ZsSM=uqF}Ub0 z2Cn?zasyX>aJfM|KYUP`KTgJyQV#@C`2p78AxH-Ft@%OG+EEX0SNQ=Gk!6c8tHN#b zgz5q1Q_RyK&X_V_Y5Fo?-7yadKnsmiyt=#CpbU8ulR}=vbccL)EuU`BpW9=CaDmWEI4F)5BGzEM*r<^iXN6jZM-6=1Har{$N*eerOUqEZ!g5 z1J(N1Lkn2XrtWu!+9%FU;(CZB8pMQ|hsE+?J^W`F$|)RTh{LFXC-m4T%&>MwVmqbzo#sPMqMzjT_qh z5DVy)7*SVbS4UQ2pIcsClCuV*$l}h+k7L8`KnBm}jp9eu-D0&np$*g2RhCJFRuiMV zRsb2`hWVI+pCvdGHIxnSBsc-d%!UsT?7=E$!$$~Cf>+z{F9=RVHnQQjReOT@Sj>_G zULu4K%bQK`A;D>=Ic)eZ1ZQKtvEenF0HpCLGjXN`9dzad06_B%Ggrv#^?0<__;2~I^BXT$5U)3UwHN z^O*Rt>cugGd>7sX`2~?W_Br1fl-B$$v3G2QZ4tj6Yq2lI)v>wktmrf@i=7scaYcG< zqqs0NUo0GVd*3b8v4hzuNrQ7C;J(}oSeG#N(o{;Eg;OD!rDz(_MD#NLhWKb);gDAi zoyGJgv5s0!;ndDDOe-TXp`c84r%Ewyd{8c->B==x0%DDCwK0UtOWg3VUZqd*RJPqj zq1eh%oz*CoUKOKV9zXruig!D3gqpd$^|q@`j~JGmknug(KKT!^C9ZnAo3%FMPmW@r zXxJOmwh7JF-20@t3}}vyXWH8Uw&4ku=8C2>ch@l1Eb=Dq(ChYy*C+N!In2VoBr+*8 zDSeqI#TOID^=jDNjPrUJ-b@^ZUA2Mi-HlFjcJINcy=4pEMDJH|GslY0?wP{A5!I7I zxX+w)AMU@LRDk6 z-;>uAK_-S_kvcq5D2vhl(vJrYXFYh(mjnyt;qInY_Z2XmGGX zIn zvT{N_MU@l03x^rzF_HE_*Si`Z6oL;oR0wKYXHt8*d4yWp32R68^=q3o-c`wtz70*Q z9`LiA13FRzvr_}Zo{HV%A&yK7(w>Uh2TbC3(}L4!-;{1)tbV$QmNt1nVJHi*`&1Sn zj;XGP*~+m{=rjFjJ<6@QN9^-BOR!E27tXwc|=m<_6f{05l`ews*b=x7Dt~E8+$)g z8b1M1V>rI?UqqwME!^o)ES?dH)nX`qf%Z*wk{9o14h~TRxdKKs?@{l}d>k)r^N{Mq zUs&B7-#DX6!!~NIt&U1mHPXf|Z9w;Q92PSy7y-V&X+3%;lb<+thd8Q@ra|_2iw01e z`!&ii)2imU1a0S?FYfL6Oi$-L3j4ifdCc!TF$)jh~?k=&TP$bYylh}s%uu}-x$zNMqKCV*<>Up!nGJ42vhc`$_KHS1Uxivl35 zQC`6pBKoWt*ko($J2&DZ(UCR{_3JQnuuYn@8=X-2+}>=leo3uL1JUvWI~LR)1uC2b zws0lM+Z<=cLJaTtEG5whJ|%Gr5YQQ<=6KXtTGig#&tLG!*$A%{7|pmEh-)@0`TCYx3jL|#YacchtWsFIM_{$KF)qBRz~l^ z{SVOrgU?gFM>nVp`w>h{ucUvx{+x}Y53vMPEyq`0c&tW+$0i{7CNXYiK~>Ak^mQ)X z@^JNL^3#f4Sm&|P_|`=rIYKlnzX%h^&)Ou0C&rt_$(bdnME^Wlzn(od{W#-VNXI7~42UBDFVu8g^qP~wj*DS)@?-zP)Jj|CEVQm9 zB&~oM*p<|ojSz$!h_89&>o1n^k3Qe94V8nX*=O#5pmrwDp5Ts*Om9=w@Cn5FR# zi8x^1)8;f#9#X)&_7e@l3u^Y$Em4`iZElT7D*kW8%=Qj+ZV**-i}ZDGiaB%VroK(( zJiaER;Iy5-N%3>y^SNQqUi@H2T%BblmWOpP$)U~kF_AMnzjrynAbqW&snMw_8=ig0 z1h&x7@Su!<5^*tJAgs&}`^D1PS&0oy<+3v5c45xDjg^X_^Tu?#u(Mh2WAR%6W|oQ_ z^Sb%!Uxp7(5l0q`Pc5$k&#(q|9@q!DX1_2OW@R^km`}rg4{9K;9wZ++YE?q#jkeH< z#J0?1C`qf5A(zg#J%gDh15*{0@P2}W1b>^{G|B=|J3HM&!i(|q`$YOnK~T@a0v`I% zVUa&?-wsxp5ChBW?rnHKAr8$S%^Jkt=g%>BG5He`axn;l^tE`wfY?u%?o%ZUJPXSk zZ4wMi!(PtDdMb@dbVAXJbZWufkzAEp;W2jrB^QzhOax4;w2KWwhj?4a z2f_{&Mg-~7$LYrhk!UtH(>k18g%N#7gm6-cmLY~L%rEkq{jqn@F&NDh+cJBm*IvNv zI-|jv=~}U7;b>n2Xt*T?E$jvjwb#$q(9M1)s9!+!BikJl4U5v9kA&YW43;8}+}jb? zS(d8`LE5s9qB}m;HL#mOgLYlDY*A1hwV^O|*pF@%ABbEF^r#;GUXMxTQsn-FBX)C* zh_Pi1#JO(S0IsOJ#iYk(cZzRP$fvH0-#u1)D=H5kMpd@Kj#rgDuAI;8GC@_L{6A>l zmIj%f)!0?Sr&|yPrEYvW8jR~|ca;E0Ke8T{OLT~}t|zbn*`s|!qoLds1&brBzZk#x zuGEjW0F{c~P~atcUn>qR?rk@&ZMfNZ{UyAg6oZzG!O_(-OM1nw>_P%Z>OlO+5b1MATNQ?=RHv zh%tl`gO}#8;bO|to`FNCDrkB-?O7AbJ#EVLFjU(xlgjby^45+cD!~O3b#6q$Z~&Zv}=ub ziK>{a?<73D+3838{>e`2Cl(~c_aFIlGT#3<@@lFj?2i(TYdRy_!tLGI?04!7ad&Ok zVfw9$Nq1T{zaqm1p(JN9smJOfjVwlft5Aa&Tiaup?^`&Xr)3F8Bymn3e>bPd z&|8+N5J_}`B+7E}`NVNMTOx8B8VBp5lqlx8RU*l$fh2M-lqcIr zWW2UkpHC-4jc+z1S;`-$j=?WcuTpAlP&iAA;l!Sbu@pwfYA0@z;#Wg#ei%Q=wR;?L zdbm4~D@%s*jGurOa3^3^Jap7TLW}T9}XInA`(&AUff41 z!jHFi#3w5X^z}^aTv5`NYWJa=R0Hb@*m_aBveYKRIk5`#4{RbGtj@3O-a-B>s(pTS zxA2=$=kR0nQ^-WNHNRdtKVga_oz<+ zr4ic@IMt<8C+=I-gM~%ys=TB#5W?Aen_}APQS6xbausKN#DJ&re5zGUeQE-BhsU0p z=&M5>GJWF6s%kM|^?g7dT0JC8ORwAvP;$jswC>}UXud!L1KA*w*7WPz+p@v^ASVJ$ z0aXGDRYinW@!FcZAi(i8lWNW%Xr^r-0+BMWbff6^R@R@W_NUd8e@$;)=pfRiC^7qK z@}Z}m&P!^&FdTn6t#^6YfS{V(T1erY=(UW%{q1LYasBDwY?-WGK_Rmy&VB5xd1xgB zp@VpfYElHnx9~zcC3@GslR74;j&b&){+Xa_5%|8mF02Qyls3HV5pRn6e~2pGCF&@p zcynghz(Q+am$Q{s7^3{y%+B2~9ftom0QKTWqfG8J46|O`|7;odN9&&*iw~uLe71A& z(DM`l9?D2q*OLSIA)=p-?M2esaO{6}ATpoS+D!U2rjrLfAum5>Cq57T(w4Fye$PA2 zp$K^c5=Xw~rOc@Qa{={tNFcrFvMwNgzBYBZlZuJ&ZZ}`b$C9s2L42JY?cz(V_;8xC zE~mO$m5@*wiVExrYIqSgeg=*os%c*vHh7GaD}>2aE{tzDYl8EjacGFYV(oQ^`3L;G1z@f>E=ZcW) zo_nsG4G_)Gg~yi4{YFTK3^HpX*yyL~8viSO56C0;r?7;h4#!kvq=J~DHiQp8FrD-D zMVYZ|eR^K~ZnupCgH&Aw72tPK=1%e8`cihg*swm`r>Y)tY<&iz@Z9?T5b4JHdkU_; zjFF4^$z4c}^y_Rai+=2_VOP85ylfFm>$|Y$#FqMTY`^$({e$?iVD*L}k-TK|KvEoP zKdS;g<8Dj!A?X!iyS0FL=6xACG*$A<7qm{9C zpPHP`oA=Ti7@8}^`x`C%e)`LeBXTa|jDS`jR0Zm1%4a148a3C6DZ)xRjR@cXF)8yl zaa?4I7sY1wThV({pW?hgu1tm+CQB3Nt-~ddM)BoA1!Ha$8#irDmOd27k$r;v4`RUP zQE6G=E$yR*zlh3GY}#CmuU^fYi!yt1Es*L^NNeKwssF|;Re3~6@j*9o%|ItfX2I8@ z=4vr*OOVxzC$>a7p)v|2$~JgyojAHBoU|RP;3@nV9_CW<$1S<|es_IK(dY&yDTysJ zPq~4guz(VjpHu-BrhR~xonmNO0AGk1-+mB0b+bdjFUK;)kDl+t8k&wi|DjKRI=$(I z9glcW4QX0Fu0&iOT$ae$RowmYfT?8yYD9Aho*}!HD8jh9;_{1{UHRh1o`=NMUCAjI z(PKWaKkrDNr#0;d!rXndL?oKpTtM6Xn$`)=LR|DmqZZ*RCIEi~_Y_xlSFkan+nxg4 zN6Y)7J;iu$*wZ<8#@tzR7g&$}FKgCAbN*@3BPiEQEr?!kxwTMbM1wy^sB*mDRLAyxyA4u4ycaUEkTP1$J7Cr!Sm6>(K{m7A}}k^T^zVi%J(P)UJa?8anjFMe}#y zyYWuC>5YqYOjjRVMAr{je_RfJ0N!uMHPFW6Aw?gA=ZxvIW(n{9J7X`Tm|6}Hf5D{4 zybk;s;5@*CahbS?=^eO+;G#ibCyA@XljEww<>+E4-rY2J0v?9T5o|c#N8lQ%Y2y6; zF}eLyO>Gq5DHxL`O|-cFIF5FlBK07S@U%KCq%SOD=no18%-DAG?s>M zw}7eyNPmk7jpsNCDOTe}(ZPy@?P#%pJuRXK3reWn5u0>70oO!a7XDgnN-|ssSBrT4 z;1G7V_~zihWKch6IzPbsJ-8-`&kp6MOv^B}Y{H;91^R&xAwAQSs{Kg3ez-WH459FF!1Sql*JstR7ypzZdOv)o4aVzKErb(|(F*?%99bg`0S#j#* G%Krw`8;(~1 delta 15444 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 diff --git a/tools/cluster/tests/wasm/inccounter_bg.wasm b/tools/cluster/tests/wasm/inccounter_bg.wasm index 5a655ea8ac124451b4d4d2e64f6c03846aebeea1..4e5ce45b6e3ea6e3b4c35115212ceb1779b15bf5 100644 GIT binary patch delta 2250 zcmbVNU2IfE6rMA4x7~KP?F5i6w6=F|Te_vNv_f}Vik7LASPK1PX-m5c3+;C6Z7UR% z7W=b}Mln7JWTM8O2mVAtP$ZWaV`9=E@iz)84@O@wF@^*a@kOE!;+ebKLLVg2O?Kv- znKS42JLjIg4WIu3M|>_Vfj<(31SF2Gel0OEp5~;$(p*4*kTk-WBZn}JF+wz|F_P_I z4ni~4O48FQbrMD?)ikD2rjZOnkR!mTgFyzqpp>~OXauELnvzVXX*7c=)%XS#5dv8h zm8YXJra9zhSPnip3WaN01HJ3oDhq-Q2ewakO?oGn9hjON$gZ2%m8)-kB0B!`{ynR6 z_B}p1k(FQnWS$tyJn=P*TVKHbCGHmD(jB70)HNQq8uQ%Q4Qug)i4#r-rxL#O!2CA)Y|6T?i)|Zu+0BWq4R$qsl zez&HKk>)Jw;v+=ve5^;m_gQ|m?cxQ8xcnwMpg1N9#WkC;PS^bA zfLiO7x(LmwRlbR75Vu}L!CFb{|8$!MG-&IETWEaLN`KS?Ff8>Ai(uHQ+Te98?sqfw z1|0z9fTDq$a;VX_Zd4i4HB$%O!8?}fL^w@@=)^~f?l1$CxPAeOP?#zr;s^{Hq!=&7 zd(&uoP+o1!U3xG;-8#`BK%M+4FW}`gUW#;nP{O7M68?Ia;GxvbA$60<@kxI2iHEMo z2Tqf(GH9!&XphPLNTZ`Rqtp5XzDN27G5Jp1*O^I1lqB6H0lG#f_1_);=8hI*J|szy z=_sR{ywv4D;t0sHrm@0igEnM=$^_t!@iJ~26iZ^0qjILH21cyEnsO=Zl?$3fu-A$= zhXI+(Eh}*Sy`=(IqgAb2TMfCatsJ^#d)pS@upnOQMnxKiqB~IWFovgOZptg07B4XB(X2txBDD{BT;AE_SrkK~Q7kVYiqH&I zX5_=6cuv2;ROanWQ^cJWItI1!`nF;@wk@8b4tEqnnLOWd7}vVan@}XnyGp`E#PtkN znuOmp!ViiGVo3!vi!ud2&?&+X5AFC7PJV;gxYL5kBoHa&Qh#C z_L3=EyQUy4uXM@GGCL|%5|=~U{TbL3R3S7bPi~*iR(*+J7iXTs2B?;m-AmdAXH8?- zyz1_*XBv8jsl!9wr~KfnycFG^FQnW@p_KcShvXaG(Te*^sYrRUwNwBc6a7=TR({)4 zi9sl;F081L@E)5V(!#_Qm;RmtY#~6*;qqB33*nvzmzIj_CufL&wM4mEn*57f1l2Z2 znjJVJ_=r3nseuytW27L({~dV?I^?MxpCtZkLBv-t-~M5Wx2IeuuJ+jy^Z!xd`h?br zv+vIBw?7=aM`t97(NcDq-@QDB1w=SvWQg;C+S8IpawU)6$yu9pP^xiZx2fgN(Vw{b0&{gM0TVLtfo zft9?~o0r#q7Z>96mBXjUdHd`xm-UseSdKVSv&6Ll)1l^!rdm_=0TWLA7NtH*iX4@b zed7W3UB$WP#DRb%yY@VSu3VfuguSG0X4_b`gDMb9woZ@q$GQ+|hhn`Dmp5bkphE8G cUjy4L+5a&>r|cXEL5n;$P>Tt?F>q delta 2240 zcmaJ?eN2^A7(dTB?}ZEZ1rCXdz~trf5r_&ZLLepQCY#9kP(VPqdKCq_Bz~2W!o6gr zW@~<&xu&_5mFAjG-F2gd6xkvj8Jrt&JzzXBX4$M0o9vODIISH4C7%}EzLd2yoVF|&Q#j&&GIKkss zVq6?!JU*Vgnc(zuP%#zht(0B1w0!L|%VtlnsNJ?A)EV-I3b%zrFC;Gm*f1I%jVb)E@bE&PAfC$lLR7QA(d} zna5aT68Ff>Os`y=tKXZSL<9Qt{CpaU+?fBV$f}IGc+RE1Itm92Csek&8D%2JEB|m& zb>z@OKToMPzNt}CclJWDT9fa-J>aEUt47(%l0%WW=hJD*pu-$dB-|C;vI%!NmSS=+ zQno0^HKorM<_h>j#venI9MA)Gg~>zaUB?PKMwcjMT153CAN2$EF@ z2LdN33!G`uz0q8@pMrVJvx|tr2&Gh0(_kUENfQ^J@{G3?Nk>#<&n7#D-sCHArloxRD@hdxoBWL2#gB3+blK$ zGitII(GWT%kLlZRsY|CeH%uB-EQi~O!ZH`Q5Y?dG)SO0xdRO!9Nb)k9$kCZCE3j^D zDMBmcxAvv<8OO+25gs4V@3y{A)w;Uvt>~KPyh)tLa5V~CQ62+Ij1%MV(bwB2=aqOx z6hV$K_#pK|6b7VbnmE8180dr!$5Q}a1|>>O`scO+nxXCG`>-Be{u|}#J?;5=PDhCR z`fP_zoDnTAVAro3I%g*UN8Et0SHIpl8aAB=IIELy0ODXaj-wxygp-iOzz@8GcAJdn znA35$%ejSs0ZSapb;fB~n!^#>L?t_>6uSfYX@lbkAWy%xqI2GpmCdU%)>vak%rl@b zcTcYi;EpVlnQvm5$p8sY(j4-gxVGz-oD)_?Y7kAIBZ=3}I@*6t`bUsE{e#y~(BZ|(x>iq)yz z=r1F|bcptn=^0Zr5o?`peRXXIkW{d)hx+y2b(?99{(D^+EsxCYy+qWZ@AkD)v##%7 LfF$qkzxdQYlFQ)4 From a4a88659824530f48ec3082e13a9b14865d2e84c Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sat, 20 Feb 2021 11:18:25 +0200 Subject: [PATCH 15/39] decouple properties from transaction --- packages/apilib/request.go | 1 + packages/coretypes/txproperties.go | 32 ++++++ packages/sctransaction/origin/origin_test.go | 1 + .../sctransaction/properties/interface.go | 63 ++++++++++++ .../{ => properties}/properties.go | 97 +++++-------------- packages/sctransaction/transaction.go | 29 +++--- packages/solo/solo.go | 1 + .../vm/statetxbuilder/statetxbuilder_test.go | 1 + plugins/globals/plugin.go | 3 +- tools/cluster/tests/wasp-cli_test.go | 2 + 10 files changed, 146 insertions(+), 84 deletions(-) create mode 100644 packages/coretypes/txproperties.go create mode 100644 packages/sctransaction/properties/interface.go rename packages/sctransaction/{ => properties}/properties.go (70%) diff --git a/packages/apilib/request.go b/packages/apilib/request.go index 1a49aa2864..3ca561668a 100644 --- a/packages/apilib/request.go +++ b/packages/apilib/request.go @@ -11,6 +11,7 @@ import ( "github.com/iotaledger/wasp/client/level1" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/sctransaction" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/iotaledger/wasp/packages/sctransaction/txbuilder" ) diff --git a/packages/coretypes/txproperties.go b/packages/coretypes/txproperties.go new file mode 100644 index 0000000000..e53f1f27f1 --- /dev/null +++ b/packages/coretypes/txproperties.go @@ -0,0 +1,32 @@ +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package coretypes + +import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" +) + +// SCTransactionProperties defines interface to the properties of +// syntactically and semantically valid smart contract transaction. +type SCTransactionProperties interface { + // address of the transaction sender. It may be address of the wallet or chain address + SenderAddress() *address.Address + // is it state transaction, i.e. transaction with the valid state section + IsState() bool + // is it origin transaction + IsOrigin() bool + // chain ID of the state section or panic if not a state transaction + MustChainID() *ChainID + // color of the state section or panic if not a state transaction + MustStateColor() *balance.Color + // number of minted tokens which are not request tokens + NumFreeMintedTokens() int64 + // all tokens sent to the address but not included into the requests to that address + // (normally 0. Needed for fallback processing otherwise those free tokens will be unaccounted + // for and essentially lost + FreeTokensForAddress(addr address.Address) ColoredBalances + // string representation + String() string +} diff --git a/packages/sctransaction/origin/origin_test.go b/packages/sctransaction/origin/origin_test.go index e5a9b823f1..3198664a99 100644 --- a/packages/sctransaction/origin/origin_test.go +++ b/packages/sctransaction/origin/origin_test.go @@ -8,6 +8,7 @@ import ( valuetransaction "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction" "github.com/iotaledger/goshimmer/dapps/waspconn/packages/utxodb" "github.com/iotaledger/wasp/packages/sctransaction" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/stretchr/testify/assert" ) diff --git a/packages/sctransaction/properties/interface.go b/packages/sctransaction/properties/interface.go new file mode 100644 index 0000000000..879b925ce1 --- /dev/null +++ b/packages/sctransaction/properties/interface.go @@ -0,0 +1,63 @@ +package properties + +import ( + "fmt" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" + "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/coretypes/cbalances" +) + +func (prop *properties) SenderAddress() *address.Address { + return &prop.senderAddress +} + +func (prop *properties) IsState() bool { + return prop.isState +} + +func (prop *properties) IsOrigin() bool { + return prop.isState +} + +func (prop *properties) MustChainID() *coretypes.ChainID { + if !prop.isState { + panic("MustChainID: must be a state transaction") + } + return &prop.chainID +} + +func (prop *properties) MustStateColor() *balance.Color { + if !prop.isState { + panic("MustStateColor: must be a state transaction") + } + return &prop.stateColor +} + +// NumFreeMintedTokens return total minted tokens minus number of requests +func (prop *properties) NumFreeMintedTokens() int64 { + if prop.isOrigin { + return 0 + } + return prop.numTotalMintedTokens - int64(prop.numRequests) +} + +func (prop *properties) FreeTokensForAddress(addr address.Address) coretypes.ColoredBalances { + if ret, ok := prop.freeTokensByAddress[addr]; ok { + return ret + } + return cbalances.Nil +} + +func (prop *properties) String() string { + ret := "---- Transaction:\n" + ret += fmt.Sprintf(" requests: %d\n", prop.numRequests) + ret += fmt.Sprintf(" senderAddress: %s\n", prop.senderAddress.String()) + ret += fmt.Sprintf(" isState: %v\n isOrigin: %v\n", prop.isState, prop.isOrigin) + ret += fmt.Sprintf(" chainAddress: %s\n", prop.chainAddress.String()) + ret += fmt.Sprintf(" chainID: %s\n stateColor: %s\n", prop.chainID.String(), prop.stateColor.String()) + ret += fmt.Sprintf(" timestamp: %d\n stateHash: %s\n", prop.timestamp, prop.stateHash.String()) + ret += fmt.Sprintf(" numMinted: %d\n", prop.numTotalMintedTokens) + ret += fmt.Sprintf(" data payload size: %d\n", prop.dataPayloadSize) + return ret +} diff --git a/packages/sctransaction/properties.go b/packages/sctransaction/properties/properties.go similarity index 70% rename from packages/sctransaction/properties.go rename to packages/sctransaction/properties/properties.go index 8938a505bd..b2b8404b00 100644 --- a/packages/sctransaction/properties.go +++ b/packages/sctransaction/properties/properties.go @@ -1,4 +1,9 @@ -package sctransaction +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +// package semantically analyzes parsed smart contract transaction +// return object with transaction properties or error if semantically incorrect +package properties import ( "errors" @@ -7,15 +12,16 @@ import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/coretypes/cbalances" "github.com/iotaledger/wasp/packages/hashing" + "github.com/iotaledger/wasp/packages/sctransaction" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/packages/txutil" ) -// Properties represents result of analysis and semantic check of the SC transaction +// properties represents result of analysis and semantic check of the SC transaction // SC transaction is a value transaction with successfully parsed data payload -type Properties struct { +type properties struct { // transaction ID txid valuetransaction.ID // senderAddress of the SC transaction. It is the only @@ -39,15 +45,20 @@ type Properties struct { // data payload len dataPayloadSize uint32 // number of minted tokens to any address - number of requests - numFreeMintedTokens int64 + numTotalMintedTokens int64 // free tokens: tokens with output to chain address - tokens transferred by requests - request tokens - chain token // In most cases it is empty, because all tokens should be transferred with requests // Free tokens normally should be returned to the sender freeTokensByAddress map[address.Address]coretypes.ColoredBalances } -func (tx *Transaction) calcProperties() (*Properties, error) { - ret := &Properties{ +func init() { + sctransaction.NewProperties = calcProperties +} + +// CalcProperties analyzes the transaction and returns its properties +func calcProperties(tx *sctransaction.Transaction) (coretypes.SCTransactionProperties, error) { + ret := &properties{ txid: tx.ID(), dataPayloadSize: tx.DataPayloadSize(), freeTokensByAddress: make(map[address.Address]coretypes.ColoredBalances), @@ -72,15 +83,15 @@ func (tx *Transaction) calcProperties() (*Properties, error) { return ret, nil } -func (prop *Properties) calcNumMinted(tx *Transaction) { - prop.numFreeMintedTokens = 0 +func (prop *properties) calcNumMinted(tx *sctransaction.Transaction) { + prop.numTotalMintedTokens = 0 tx.Transaction.Outputs().ForEach(func(addr address.Address, bals []*balance.Balance) bool { - prop.numFreeMintedTokens += txutil.BalanceOfColor(bals, balance.ColorNew) + prop.numTotalMintedTokens += txutil.BalanceOfColor(bals, balance.ColorNew) return true }) } -func (prop *Properties) analyzeSender(tx *Transaction) error { +func (prop *properties) analyzeSender(tx *sctransaction.Transaction) error { // check if the senderAddress is exactly one // only value transaction with one input address can be parsed as smart contract transactions // because we always need to deterministically identify the senderAddress @@ -98,15 +109,15 @@ func (prop *Properties) analyzeSender(tx *Transaction) error { return err } -func (prop *Properties) analyzeStateBlock(tx *Transaction) error { +func (prop *properties) analyzeStateBlock(tx *sctransaction.Transaction) error { stateSection, ok := tx.State() prop.isState = ok if !ok { return nil } - prop.timestamp = stateSection.timestamp - prop.stateHash = stateSection.stateHash + prop.timestamp = stateSection.Timestamp() + prop.stateHash = stateSection.StateHash() var err error @@ -143,7 +154,7 @@ func (prop *Properties) analyzeStateBlock(tx *Transaction) error { return nil } -func (prop *Properties) analyzeRequestBlocks(tx *Transaction) error { +func (prop *properties) analyzeRequestBlocks(tx *sctransaction.Transaction) error { if !prop.isState && len(tx.Requests()) == 0 { return errors.New("smart contract transaction which does not contain state block must contain at least one request") } @@ -205,61 +216,3 @@ func (prop *Properties) analyzeRequestBlocks(tx *Transaction) error { return err // TODO free minted tokens } - -func (prop *Properties) SenderAddress() *address.Address { - return &prop.senderAddress -} - -func (prop *Properties) IsState() bool { - return prop.isState -} - -func (prop *Properties) IsOrigin() bool { - return prop.isState -} - -func (prop *Properties) ChainAddress() address.Address { - return prop.chainAddress -} - -func (prop *Properties) MustChainID() *coretypes.ChainID { - if !prop.isState { - panic("MustChainID: must be a state transaction") - } - return &prop.chainID -} - -func (prop *Properties) MustStateColor() *balance.Color { - if !prop.isState { - panic("MustStateColor: must be a state transaction") - } - return &prop.stateColor -} - -// NumFreeMintedTokens return total minted tokens minus number of requests -func (prop *Properties) NumFreeMintedTokens() int64 { - if prop.isOrigin { - return 0 - } - return prop.numFreeMintedTokens - int64(prop.numRequests) -} - -func (prop *Properties) FreeTokensForAddress(addr address.Address) coretypes.ColoredBalances { - if ret, ok := prop.freeTokensByAddress[addr]; ok { - return ret - } - return cbalances.Nil -} - -func (prop *Properties) String() string { - ret := "---- Transaction:\n" - ret += fmt.Sprintf(" requests: %d\n", prop.numRequests) - ret += fmt.Sprintf(" senderAddress: %s\n", prop.senderAddress.String()) - ret += fmt.Sprintf(" isState: %v\n isOrigin: %v\n", prop.isState, prop.isOrigin) - ret += fmt.Sprintf(" chainAddress: %s\n", prop.chainAddress.String()) - ret += fmt.Sprintf(" chainID: %s\n stateColor: %s\n", prop.chainID.String(), prop.stateColor.String()) - ret += fmt.Sprintf(" timestamp: %d\n stateHash: %s\n", prop.timestamp, prop.stateHash.String()) - ret += fmt.Sprintf(" numMinted: %d\n", prop.numFreeMintedTokens) - ret += fmt.Sprintf(" data payload size: %d\n", prop.dataPayloadSize) - return ret -} diff --git a/packages/sctransaction/transaction.go b/packages/sctransaction/transaction.go index 1b3bde2db1..5fd8c94ca7 100644 --- a/packages/sctransaction/transaction.go +++ b/packages/sctransaction/transaction.go @@ -1,4 +1,7 @@ -// implement smart contract transaction. +// Copyright 2020 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +// implements smart contract transaction. // smart contract transaction is value transaction with special payload package sctransaction @@ -9,6 +12,7 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" valuetransaction "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction" + "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/util" "io" ) @@ -17,11 +21,14 @@ import ( // the stateSection and requestSection are parsed from the dataPayload of the value transaction type Transaction struct { *valuetransaction.Transaction - stateSection *StateSection - requestSection []*RequestSection - properties *Properties // cached properties. If nil, transaction is semantically validated and properties are calculated + stateSection *StateSection + requestSection []*RequestSection + cachedProperties coretypes.SCTransactionProperties // cached cachedProperties. If nil, transaction is semantically validated and cachedProperties are calculated } +// function which analyzes the transaction and calculates properties of it +var NewProperties func(transaction *Transaction) (coretypes.SCTransactionProperties, error) + // creates new sc transaction. It is immutable, i.e. tx hash is stable func NewTransaction(vtx *valuetransaction.Transaction, stateBlock *StateSection, requestBlocks []*RequestSection) (*Transaction, error) { ret := &Transaction{ @@ -55,17 +62,17 @@ func ParseValueTransaction(vtx *valuetransaction.Transaction) (*Transaction, err return ret, nil } -// Properties returns valid properties if sc transaction is semantically correct -func (tx *Transaction) Properties() (*Properties, error) { - if tx.properties != nil { - return tx.properties, nil +// Properties returns valid cachedProperties if sc transaction is semantically correct +func (tx *Transaction) Properties() (coretypes.SCTransactionProperties, error) { + if tx.cachedProperties != nil { + return tx.cachedProperties, nil } var err error - tx.properties, err = tx.calcProperties() - return tx.properties, err + tx.cachedProperties, err = NewProperties(tx) + return tx.cachedProperties, err } -func (tx *Transaction) MustProperties() *Properties { +func (tx *Transaction) MustProperties() coretypes.SCTransactionProperties { ret, err := tx.Properties() if err != nil { panic(err) diff --git a/packages/solo/solo.go b/packages/solo/solo.go index f6a3a1e87e..2669a94d17 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -21,6 +21,7 @@ import ( "github.com/iotaledger/wasp/packages/registry" "github.com/iotaledger/wasp/packages/sctransaction" "github.com/iotaledger/wasp/packages/sctransaction/origin" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/iotaledger/wasp/packages/sctransaction/txbuilder" "github.com/iotaledger/wasp/packages/state" "github.com/iotaledger/wasp/packages/testutil" diff --git a/packages/vm/statetxbuilder/statetxbuilder_test.go b/packages/vm/statetxbuilder/statetxbuilder_test.go index b36ddeadcf..304c1c9623 100644 --- a/packages/vm/statetxbuilder/statetxbuilder_test.go +++ b/packages/vm/statetxbuilder/statetxbuilder_test.go @@ -6,6 +6,7 @@ import ( "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/transaction" "github.com/iotaledger/hive.go/crypto/ed25519" "github.com/iotaledger/wasp/packages/hashing" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/stretchr/testify/require" "testing" ) diff --git a/plugins/globals/plugin.go b/plugins/globals/plugin.go index 8b93d7f64b..39678a7288 100644 --- a/plugins/globals/plugin.go +++ b/plugins/globals/plugin.go @@ -1,9 +1,10 @@ -// ony needed to link packages with examples +// needed to link packages with examples and to force link some packages package globals import ( "github.com/iotaledger/hive.go/node" _ "github.com/iotaledger/wasp/contracts/native/inccounter" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/iotaledger/wasp/packages/vm/viewcontext" ) diff --git a/tools/cluster/tests/wasp-cli_test.go b/tools/cluster/tests/wasp-cli_test.go index 3ff2ba4847..87306c2439 100644 --- a/tools/cluster/tests/wasp-cli_test.go +++ b/tools/cluster/tests/wasp-cli_test.go @@ -13,6 +13,7 @@ import ( "testing" "github.com/iotaledger/wasp/packages/hashing" + _ "github.com/iotaledger/wasp/packages/sctransaction/properties" "github.com/iotaledger/wasp/packages/vm/core/blob" "github.com/iotaledger/wasp/tools/cluster" "github.com/iotaledger/wasp/tools/cluster/testutil" @@ -172,6 +173,7 @@ func TestWaspCli1Chain(t *testing.T) { } func TestWaspCliContract(t *testing.T) { + w := NewWaspCliTest(t) w.Run("init") w.Run("request-funds") From b6344eb02512254c2ff63a296e2cc2975e26cb46 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sat, 20 Feb 2021 11:55:04 +0200 Subject: [PATCH 16/39] decouple properties from transaction --- packages/sctransaction/properties/interface.go | 2 ++ packages/sctransaction/properties/properties.go | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/sctransaction/properties/interface.go b/packages/sctransaction/properties/interface.go index 879b925ce1..dbc0f8bfb9 100644 --- a/packages/sctransaction/properties/interface.go +++ b/packages/sctransaction/properties/interface.go @@ -35,6 +35,8 @@ func (prop *properties) MustStateColor() *balance.Color { } // NumFreeMintedTokens return total minted tokens minus number of requests +// all of those tokens will be minted to other addresses than chain address +// after all requests will be settled, the remaining minted tokens will be free minted tokens. func (prop *properties) NumFreeMintedTokens() int64 { if prop.isOrigin { return 0 diff --git a/packages/sctransaction/properties/properties.go b/packages/sctransaction/properties/properties.go index b2b8404b00..dae269950b 100644 --- a/packages/sctransaction/properties/properties.go +++ b/packages/sctransaction/properties/properties.go @@ -63,7 +63,6 @@ func calcProperties(tx *sctransaction.Transaction) (coretypes.SCTransactionPrope dataPayloadSize: tx.DataPayloadSize(), freeTokensByAddress: make(map[address.Address]coretypes.ColoredBalances), } - if !tx.SignaturesValid() { return nil, fmt.Errorf("invalid signatures") } @@ -80,6 +79,10 @@ func calcProperties(tx *sctransaction.Transaction) (coretypes.SCTransactionPrope return nil, err } ret.calcNumMinted(tx) + + if int64(ret.numRequests) > ret.numTotalMintedTokens { + panic("int64(prop.numRequests) > prop.numTotalMintedTokens") + } return ret, nil } @@ -202,17 +205,21 @@ func (prop *properties) analyzeRequestBlocks(tx *sctransaction.Transaction) erro return true } if diff.Balance(balance.ColorNew) != 0 { + // semantical rule: we require number of minted tokens to the target chain exactly equal + // to the number of requests to that chain err = fmt.Errorf("wrong number of minted tokens in the output to the address %s", addr.String()) return false } if !diff.NonNegative() { + // metadata of transfer in the request ir wrong err = fmt.Errorf("mismatch between request metadata and outputs for address %s", addr.String()) return false } - // there are some free tokens for the address + // there are some free tokens for the address, i.e. + // there are more tokens in the outputs of the value transaction than tokens in the + // metadata. The Vm has to do something about it, otherwise they will become inaccessible prop.freeTokensByAddress[addr] = diff return true }) return err - // TODO free minted tokens } From c2f41c480bb4c8af572cfcf8b85a58cc58d9b82c Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sat, 20 Feb 2021 20:48:28 +0200 Subject: [PATCH 17/39] adjustments ins Solo and tx builder. Solo concurency tests --- .../example-tutorial/test/tutorial_test.go | 18 +-- .../native/inccounter/inccounter_test.go | 6 +- contracts/native/micropay/micropay_test.go | 26 ++-- contracts/rust/dividend/test/dividend_test.go | 6 +- .../test/donatewithfeedback_test.go | 6 +- contracts/rust/erc20/test/fun_test.go | 24 ++-- .../rust/fairauction/test/fairauction_test.go | 6 +- .../rust/helloworld/test/helloworld_test.go | 2 +- .../rust/inccounter/test/inccounter_test.go | 20 +-- contracts/rust/testcore/src/consts.rs | 1 + contracts/rust/testcore/src/lib.rs | 1 + contracts/rust/testcore/src/testcore.rs | 6 + packages/apilib/request.go | 5 + packages/coretypes/coretypes_test.go | 7 + packages/coretypes/coreutil/contract.go | 2 +- packages/coretypes/sandbox.go | 9 +- .../sctransaction/properties/properties.go | 2 +- packages/solo/fun.go | 6 +- packages/solo/req.go | 71 +++++---- packages/solo/run.go | 45 +++--- packages/solo/solo.go | 135 ++++++------------ packages/solo/solofun.go | 94 ++++++++++++ packages/solo/utils.go | 4 +- packages/txutil/vtxbuilder/vtxbuilder.go | 51 ------- packages/vm/core/testcore/accounts_test.go | 14 +- packages/vm/core/testcore/base_test.go | 4 +- packages/vm/core/testcore/blob_deploy_test.go | 10 +- packages/vm/core/testcore/fee_admin_test.go | 32 ++--- .../vm/core/testcore/fee_handling_test.go | 6 +- packages/vm/core/testcore/root_test.go | 8 +- .../vm/core/testcore/sbtests/2chains_test.go | 4 +- .../vm/core/testcore/sbtests/call_test.go | 6 +- .../core/testcore/sbtests/check_ctx_test.go | 2 +- .../core/testcore/sbtests/concurrency_test.go | 66 +++++++++ .../vm/core/testcore/sbtests/eventlog_test.go | 18 +-- .../core/testcore/sbtests/misc_call_test.go | 4 +- .../testcore/sbtests/sandbox_panic_test.go | 6 +- .../testcore/sbtests/sbtestsc/impl_misc.go | 7 + .../testcore/sbtests/sbtestsc/interface.go | 2 + .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47093 -> 47497 bytes .../vm/core/testcore/sbtests/setup_test.go | 4 +- .../vm/core/testcore/sbtests/transfer_test.go | 20 +-- .../vm/core/testcore/sbtests/types_test.go | 2 +- packages/vm/sandbox/sandbox.go | 4 + packages/vm/statetxbuilder/vtxbuilder.go | 30 ++-- packages/vm/vmcontext/general.go | 10 +- tools/cluster/tests/inccounter_solo_test.go | 4 +- 47 files changed, 468 insertions(+), 348 deletions(-) create mode 100644 packages/solo/solofun.go create mode 100644 packages/vm/core/testcore/sbtests/concurrency_test.go diff --git a/articles/tutorial/example-tutorial/test/tutorial_test.go b/articles/tutorial/example-tutorial/test/tutorial_test.go index 9ac7661da8..b951601d28 100644 --- a/articles/tutorial/example-tutorial/test/tutorial_test.go +++ b/articles/tutorial/example-tutorial/test/tutorial_test.go @@ -44,7 +44,7 @@ func TestTutorial3(t *testing.T) { // call contract to store string req := solo.NewCallParams("example1", "storeString", "paramString", "Hello, world!") - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) // call the contract to extract value of the 'paramString' and check @@ -65,7 +65,7 @@ func TestTutorial4(t *testing.T) { // call contract incorrectly req := solo.NewCallParams("example1", "storeString") - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.Error(t, err) } @@ -91,7 +91,7 @@ func TestTutorial5(t *testing.T) { // send 42 iotas from wallet to own account on-chain, controlled by the same wallet req := solo.NewCallParams(accounts.Name, accounts.FuncDeposit). WithTransfer(balance.ColorIOTA, 42) - _, err := chain.PostRequest(req, userWallet) + _, err := chain.PostRequestSync(req, userWallet) require.NoError(t, err) // check address balance: must be 43 (!) iotas less @@ -101,7 +101,7 @@ func TestTutorial5(t *testing.T) { // withdraw back all iotas req = solo.NewCallParams(accounts.Name, accounts.FuncWithdrawToAddress) - _, err = chain.PostRequest(req, userWallet) + _, err = chain.PostRequestSync(req, userWallet) require.NoError(t, err) // we are back to initial situation: IOTA is fee-less! @@ -131,7 +131,7 @@ func TestTutorial6(t *testing.T) { req := solo.NewCallParams("example1", "storeString", "paramString", "Hello, world!"). WithTransfer(balance.ColorIOTA, 42) - _, err = chain.PostRequest(req, userWallet) + _, err = chain.PostRequestSync(req, userWallet) require.NoError(t, err) chain.AssertAccountBalance(contractAgentID, balance.ColorIOTA, 42) @@ -162,7 +162,7 @@ func TestTutorial7(t *testing.T) { // missing parameter, will panic req := solo.NewCallParams("example1", "storeString"). WithTransfer(balance.ColorIOTA, 42) - _, err = chain.PostRequest(req, userWallet) + _, err = chain.PostRequestSync(req, userWallet) require.Error(t, err) chain.AssertAccountBalance(contractAgentID, balance.ColorIOTA, 0) @@ -190,7 +190,7 @@ func TestTutorial8(t *testing.T) { // the chain owner (default) send a request to the root contract to grant right to deploy // contract on the chain to the use req := solo.NewCallParams(root.Interface.Name, root.FuncGrantDeploy, root.ParamDeployer, userAgentID) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) // user deploys wasm smart contract on the chain under the name "example1" @@ -217,7 +217,7 @@ func TestTutorial8(t *testing.T) { // Result is 42 iotas moved to the smart contract's account req = solo.NewCallParams("example1", "storeString", "paramString", "Hello, world!"). WithTransfer(balance.ColorIOTA, 42) - _, err = chain.PostRequest(req, userWallet) + _, err = chain.PostRequestSync(req, userWallet) require.NoError(t, err) chain.AssertAccountBalance(contractAgentID, balance.ColorIOTA, 42) @@ -228,7 +228,7 @@ func TestTutorial8(t *testing.T) { // Out of 42 iotas 41 iota is coming back to the user's address, 1 iotas // is accrued to the user on chain req = solo.NewCallParams("example1", "withdrawIota") - _, err = chain.PostRequest(req, userWallet) + _, err = chain.PostRequestSync(req, userWallet) require.NoError(t, err) chain.AssertAccountBalance(contractAgentID, balance.ColorIOTA, 0) diff --git a/contracts/native/inccounter/inccounter_test.go b/contracts/native/inccounter/inccounter_test.go index e8b3c0a0f6..b5d4583828 100644 --- a/contracts/native/inccounter/inccounter_test.go +++ b/contracts/native/inccounter/inccounter_test.go @@ -54,7 +54,7 @@ func TestIncDefaultParam(t *testing.T) { require.NoError(t, err) checkCounter(chain, 17) - _, err = chain.PostRequest(solo.NewCallParams(incName, FuncIncCounter), nil) + _, err = chain.PostRequestSync(solo.NewCallParams(incName, FuncIncCounter), nil) require.NoError(t, err) checkCounter(chain, 18) chain.CheckAccountLedger() @@ -69,7 +69,7 @@ func TestIncParam(t *testing.T) { require.NoError(t, err) checkCounter(chain, 17) - _, err = chain.PostRequest(solo.NewCallParams(incName, FuncIncCounter, VarCounter, 3), nil) + _, err = chain.PostRequestSync(solo.NewCallParams(incName, FuncIncCounter, VarCounter, 3), nil) require.NoError(t, err) checkCounter(chain, 20) @@ -86,7 +86,7 @@ func TestIncWith1Post(t *testing.T) { req := solo.NewCallParams(incName, FuncIncAndRepeatOnceAfter5s). WithTransfer(balance.ColorIOTA, 1) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) // advance logical clock to unlock that timelocked request env.AdvanceClockBy(6 * time.Second) diff --git a/contracts/native/micropay/micropay_test.go b/contracts/native/micropay/micropay_test.go index ce40d1de66..0c66eb1e4c 100644 --- a/contracts/native/micropay/micropay_test.go +++ b/contracts/native/micropay/micropay_test.go @@ -32,7 +32,7 @@ func TestSubmitPk(t *testing.T) { req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) } @@ -53,7 +53,7 @@ func TestOpenChannelFail(t *testing.T) { req := solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). WithTransfer(balance.ColorIOTA, 600) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.Error(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) @@ -75,7 +75,7 @@ func TestOpenChannelOk(t *testing.T) { req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) provider := env.NewSignatureSchemeWithFunds() @@ -85,7 +85,7 @@ func TestOpenChannelOk(t *testing.T) { req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). WithTransfer(balance.ColorIOTA, 600) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) @@ -107,7 +107,7 @@ func TestOpenChannelTwice(t *testing.T) { req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) provider := env.NewSignatureSchemeWithFunds() @@ -120,13 +120,13 @@ func TestOpenChannelTwice(t *testing.T) { req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). WithTransfer(balance.ColorIOTA, 600) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) env.AssertAddressBalance(payerAddr, balance.ColorIOTA, solo.Saldo-600-2) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600+600) @@ -164,7 +164,7 @@ func TestRevokeWarrant(t *testing.T) { req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) provider := env.NewSignatureSchemeWithFunds() @@ -177,7 +177,7 @@ func TestRevokeWarrant(t *testing.T) { req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). WithTransfer(balance.ColorIOTA, 600) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) chain.AssertAccountBalance(cAgentID, balance.ColorIOTA, 600) @@ -200,7 +200,7 @@ func TestRevokeWarrant(t *testing.T) { req = solo.NewCallParams("micropay", FuncRevokeWarrant, ParamServiceAddress, providerAddr, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) env.AdvanceClockBy(30 * time.Minute) @@ -253,7 +253,7 @@ func TestPayment(t *testing.T) { req := solo.NewCallParams("micropay", FuncPublicKey, ParamPublicKey, payerPubKey, ) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) provider := env.NewSignatureSchemeWithFunds() @@ -263,7 +263,7 @@ func TestPayment(t *testing.T) { req = solo.NewCallParams("micropay", FuncAddWarrant, ParamServiceAddress, providerAddr). WithTransfer(balance.ColorIOTA, 600) - _, err = chain.PostRequest(req, payer) + _, err = chain.PostRequestSync(req, payer) require.NoError(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn("micropay")) @@ -297,7 +297,7 @@ func TestPayment(t *testing.T) { _ = arr.Push(pay1) _ = arr.Push(pay2) req = solo.NewCallParamsFromDic("micropay", FuncSettle, par) - _, err = chain.PostRequest(req, provider) + _, err = chain.PostRequestSync(req, provider) require.NoError(t, err) env.AssertAddressBalance(providerAddr, balance.ColorIOTA, solo.Saldo+42+41-1) diff --git a/contracts/rust/dividend/test/dividend_test.go b/contracts/rust/dividend/test/dividend_test.go index 74e9bf17e5..a7b8686f8b 100644 --- a/contracts/rust/dividend/test/dividend_test.go +++ b/contracts/rust/dividend/test/dividend_test.go @@ -28,7 +28,7 @@ func TestAddMemberOk(t *testing.T) { ParamAddress, member1.Address(), ParamFactor, 100, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) } @@ -38,7 +38,7 @@ func TestAddMemberFailMissingAddress(t *testing.T) { req := solo.NewCallParams(ScName, FuncMember, ParamFactor, 100, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } @@ -49,6 +49,6 @@ func TestAddMemberFailMissingFactor(t *testing.T) { req := solo.NewCallParams(ScName, FuncMember, ParamAddress, member1.Address(), ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go index 651fa118b7..320ac85d4b 100644 --- a/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go +++ b/contracts/rust/donatewithfeedback/test/donatewithfeedback_test.go @@ -47,7 +47,7 @@ func TestDonateOnce(t *testing.T) { req := solo.NewCallParams(ScName, FuncDonate, ParamFeedback, "Nice work!", ).WithTransfer(balance.ColorIOTA, 42) - _, err := chain.PostRequest(req, donator1) + _, err := chain.PostRequestSync(req, donator1) require.NoError(t, err) ret, err := chain.CallView( @@ -79,14 +79,14 @@ func TestDonateTwice(t *testing.T) { req := solo.NewCallParams(ScName, FuncDonate, ParamFeedback, "Nice work!", ).WithTransfer(balance.ColorIOTA, 42) - _, err := chain.PostRequest(req, donator1) + _, err := chain.PostRequestSync(req, donator1) require.NoError(t, err) donator2 := chain.Env.NewSignatureSchemeWithFunds() req = solo.NewCallParams(ScName, FuncDonate, ParamFeedback, "Exactly what I needed!", ).WithTransfer(balance.ColorIOTA, 69) - _, err = chain.PostRequest(req, donator2) + _, err = chain.PostRequestSync(req, donator2) require.NoError(t, err) ret, err := chain.CallView( diff --git a/contracts/rust/erc20/test/fun_test.go b/contracts/rust/erc20/test/fun_test.go index 1090f1b6dd..5eebb8d022 100644 --- a/contracts/rust/erc20/test/fun_test.go +++ b/contracts/rust/erc20/test/fun_test.go @@ -76,7 +76,7 @@ func TestTransferOk1(t *testing.T) { ParamAccount, userAgentID, ParamAmount, amount, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Balance(chain, creatorAgentID, solo.Saldo-amount) @@ -94,7 +94,7 @@ func TestTransferOk2(t *testing.T) { ParamAccount, userAgentID, ParamAmount, amount, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Balance(chain, creatorAgentID, solo.Saldo-amount) @@ -104,7 +104,7 @@ func TestTransferOk2(t *testing.T) { ParamAccount, creatorAgentID, ParamAmount, amount, ) - _, err = chain.PostRequest(req, user) + _, err = chain.PostRequestSync(req, user) require.NoError(t, err) checkErc20Balance(chain, creatorAgentID, solo.Saldo) @@ -125,7 +125,7 @@ func TestTransferNotEnoughFunds1(t *testing.T) { ParamAccount, userAgentID, ParamAmount, amount, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.Error(t, err) checkErc20Balance(chain, creatorAgentID, solo.Saldo) @@ -146,7 +146,7 @@ func TestTransferNotEnoughFunds2(t *testing.T) { ParamAccount, creatorAgentID, ParamAmount, amount, ) - _, err := chain.PostRequest(req, user) + _, err := chain.PostRequestSync(req, user) require.Error(t, err) checkErc20Balance(chain, creatorAgentID, solo.Saldo) @@ -169,7 +169,7 @@ func TestApprove(t *testing.T) { ParamDelegation, userAgentID, ParamAmount, 100, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) @@ -186,7 +186,7 @@ func TestTransferFromOk1(t *testing.T) { ParamDelegation, userAgentID, ParamAmount, 100, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) @@ -198,7 +198,7 @@ func TestTransferFromOk1(t *testing.T) { ParamRecipient, userAgentID, ParamAmount, 50, ) - _, err = chain.PostRequest(req, creator) + _, err = chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 50) @@ -215,7 +215,7 @@ func TestTransferFromOk2(t *testing.T) { ParamDelegation, userAgentID, ParamAmount, 100, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) @@ -227,7 +227,7 @@ func TestTransferFromOk2(t *testing.T) { ParamRecipient, userAgentID, ParamAmount, 100, ) - _, err = chain.PostRequest(req, creator) + _, err = chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 0) @@ -244,7 +244,7 @@ func TestTransferFromFail(t *testing.T) { ParamDelegation, userAgentID, ParamAmount, 100, ) - _, err := chain.PostRequest(req, creator) + _, err := chain.PostRequestSync(req, creator) require.NoError(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) @@ -256,7 +256,7 @@ func TestTransferFromFail(t *testing.T) { ParamRecipient, userAgentID, ParamAmount, 101, ) - _, err = chain.PostRequest(req, creator) + _, err = chain.PostRequestSync(req, creator) require.Error(t, err) checkErc20Allowance(chain, creatorAgentID, userAgentID, 100) diff --git a/contracts/rust/fairauction/test/fairauction_test.go b/contracts/rust/fairauction/test/fairauction_test.go index b320f62d4a..7adadd0590 100644 --- a/contracts/rust/fairauction/test/fairauction_test.go +++ b/contracts/rust/fairauction/test/fairauction_test.go @@ -40,7 +40,7 @@ func setupTest(t *testing.T) *solo.Chain { balance.ColorIOTA: 25, // deposit, must be >=minimum*margin tokenColor: 10, // the tokens to auction }) - _, err = chain.PostRequest(req, auctioneer) + _, err = chain.PostRequestSync(req, auctioneer) require.NoError(t, err) return chain } @@ -99,7 +99,7 @@ func TestFaOneBidTooLow(t *testing.T) { req := solo.NewCallParams(ScName, FuncPlaceBid, ParamColor, tokenColor, ).WithTransfer(balance.ColorIOTA, 100) - _, err := chain.PostRequest(req, auctioneer) + _, err := chain.PostRequestSync(req, auctioneer) require.Error(t, err) // wait for finalize_auction @@ -122,7 +122,7 @@ func TestFaOneBid(t *testing.T) { req := solo.NewCallParams(ScName, FuncPlaceBid, ParamColor, tokenColor, ).WithTransfer(balance.ColorIOTA, 500) - _, err := chain.PostRequest(req, bidder) + _, err := chain.PostRequestSync(req, bidder) require.NoError(t, err) // wait for finalize_auction diff --git a/contracts/rust/helloworld/test/helloworld_test.go b/contracts/rust/helloworld/test/helloworld_test.go index ec700a2c7a..8bdec61bd3 100644 --- a/contracts/rust/helloworld/test/helloworld_test.go +++ b/contracts/rust/helloworld/test/helloworld_test.go @@ -25,7 +25,7 @@ func TestFuncHelloWorld(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncHelloWorld) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) } diff --git a/contracts/rust/inccounter/test/inccounter_test.go b/contracts/rust/inccounter/test/inccounter_test.go index 3e798220f7..5ab0266a32 100644 --- a/contracts/rust/inccounter/test/inccounter_test.go +++ b/contracts/rust/inccounter/test/inccounter_test.go @@ -32,7 +32,7 @@ func TestIncrementOnce(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncIncrement) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkStateCounter(t, chain, 1) @@ -42,11 +42,11 @@ func TestIncrementTwice(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncIncrement) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) req = solo.NewCallParams(ScName, FuncIncrement) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) checkStateCounter(t, chain, 2) @@ -58,7 +58,7 @@ func TestIncrementRepeatThrice(t *testing.T) { req := solo.NewCallParams(ScName, FuncRepeatMany, ParamNumRepeats, 3, ).WithTransfer(balance.ColorIOTA, 1) // !!! posts to self - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.WaitForEmptyBacklog() @@ -70,7 +70,7 @@ func TestIncrementCallIncrement(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncCallIncrement) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkStateCounter(t, chain, 2) @@ -80,7 +80,7 @@ func TestIncrementCallIncrementRecurse5x(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncCallIncrementRecurse5x) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkStateCounter(t, chain, 6) @@ -90,7 +90,7 @@ func TestIncrementPostIncrement(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncPostIncrement).WithTransfer(balance.ColorIOTA, 1) // !!! posts to self - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.WaitForEmptyBacklog() @@ -102,7 +102,7 @@ func TestIncrementLocalStateInternalCall(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncLocalStateInternalCall) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkStateCounter(t, chain, 2) @@ -112,7 +112,7 @@ func TestIncrementLocalStateSandboxCall(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncLocalStateSandboxCall) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) // global var in wasm execution has no effect @@ -123,7 +123,7 @@ func TestIncrementLocalStatePost(t *testing.T) { chain := setupTest(t) req := solo.NewCallParams(ScName, FuncLocalStatePost).WithTransfer(balance.ColorIOTA, 1) // !!! posts to self - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.WaitForEmptyBacklog() diff --git a/contracts/rust/testcore/src/consts.rs b/contracts/rust/testcore/src/consts.rs index f4a7f03552..023cced7e0 100644 --- a/contracts/rust/testcore/src/consts.rs +++ b/contracts/rust/testcore/src/consts.rs @@ -51,6 +51,7 @@ pub const FUNC_TEST_PANIC_FULL_EP: &str = "testPanicFullEP"; pub const FUNC_WITHDRAW_TO_CHAIN: &str = "withdrawToChain"; pub const VIEW_CHECK_CONTEXT_FROM_VIEW_EP: &str = "checkContextFromViewEP"; pub const VIEW_FIBONACCI: &str = "fibonacci"; +pub const FUNC_INC_COUNTER: &str = "incCounter"; pub const VIEW_GET_COUNTER: &str = "getCounter"; pub const VIEW_GET_INT: &str = "getInt"; pub const VIEW_JUST_VIEW: &str = "justView"; diff --git a/contracts/rust/testcore/src/lib.rs b/contracts/rust/testcore/src/lib.rs index 5c318d9b63..9cf73bbfde 100644 --- a/contracts/rust/testcore/src/lib.rs +++ b/contracts/rust/testcore/src/lib.rs @@ -32,6 +32,7 @@ fn on_load() { exports.add_view(VIEW_FIBONACCI, view_fibonacci); exports.add_view(VIEW_GET_COUNTER, view_get_counter); exports.add_view(VIEW_GET_INT, view_get_int); + exports.add_func(FUNC_INC_COUNTER, func_inc_counter); exports.add_view(VIEW_JUST_VIEW, view_just_view); exports.add_view(VIEW_PASS_TYPES_VIEW, view_pass_types_view); exports.add_view(VIEW_TEST_CALL_PANIC_VIEW_EPFROM_VIEW, view_test_call_panic_view_epfrom_view); diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index 1aa5046c8b..989d0370a0 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -283,6 +283,12 @@ pub fn view_fibonacci(ctx: &ScViewContext) { ctx.log("testcore.fibonacci ok"); } +pub fn func_inc_counter(ctx: &ScFuncContext) { + ctx.log("testcore.incCounter"); + ctx.state().get_int(VAR_COUNTER).set_value(ctx.state().get_int(VAR_COUNTER).value()+1); + ctx.log("testcore.incCounter ok"); +} + pub fn view_get_counter(ctx: &ScViewContext) { ctx.log("testcore.getCounter"); let counter = ctx.state().get_int(VAR_COUNTER); diff --git a/packages/apilib/request.go b/packages/apilib/request.go index 3ca561668a..4ad8a6bb4a 100644 --- a/packages/apilib/request.go +++ b/packages/apilib/request.go @@ -5,6 +5,7 @@ package apilib import ( "fmt" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/wasp/packages/coretypes/requestargs" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" @@ -27,6 +28,7 @@ type CreateRequestTransactionParams struct { Level1Client level1.Level1Client SenderSigScheme signaturescheme.SignatureScheme RequestSectionParams []RequestSectionParams + Mint map[address.Address]int64 // free tokens to be minted from IOTA color Post bool WaitForConfirmation bool } @@ -55,6 +57,9 @@ func CreateRequestTransaction(par CreateRequestTransactionParams) (*sctransactio return nil, err } } + //for addr, amount := range par.Mint{ + // txb.MintColor + //} tx, err := txb.Build(false) //dump := txb.Dump() diff --git a/packages/coretypes/coretypes_test.go b/packages/coretypes/coretypes_test.go index dbdee2d9ee..214927e244 100644 --- a/packages/coretypes/coretypes_test.go +++ b/packages/coretypes/coretypes_test.go @@ -111,3 +111,10 @@ func TestHname(t *testing.T) { require.NoError(t, err) require.EqualValues(t, hn1, hn1back) } + +func TestHnameCollision(t *testing.T) { + hn1 := Hn("doNothing") + hn2 := Hn("incCounter") + + require.NotEqualValues(t, hn1, hn2) +} diff --git a/packages/coretypes/coreutil/contract.go b/packages/coretypes/coreutil/contract.go index f1ebf02e15..1f05500a8c 100644 --- a/packages/coretypes/coreutil/contract.go +++ b/packages/coretypes/coreutil/contract.go @@ -36,7 +36,7 @@ func Funcs(init Handler, fns []ContractFunctionInterface) map[coretypes.Hname]Co for _, f := range fns { hname := f.Hname() if _, ok := ret[hname]; ok { - panic(fmt.Sprintf("Duplicate function: %s", f.Name)) + panic(fmt.Sprintf("Duplicate function: %s (%s)", f.Name, hname.String())) } handlers := 0 diff --git a/packages/coretypes/sandbox.go b/packages/coretypes/sandbox.go index d263351707..b493c52276 100644 --- a/packages/coretypes/sandbox.go +++ b/packages/coretypes/sandbox.go @@ -34,6 +34,13 @@ type Sandbox interface { Call(target Hname, entryPoint Hname, params dict.Dict, transfer ColoredBalances) (dict.Dict, error) // RequestID of the request in the context of which is the current call RequestID() RequestID + // MintedSupply is number of free minted tokens, i.e. minted tokens which are sent to addresses + // other than chain address. It is a prove of how many tokens has been minted with the + // color of the transaction (after un-coloring all request tokens) + // It may be used in use-cases such as Token Registry. + // The color of the supply can be extracted from the RequestID + // It is read-only method, it returns same value for all requests and all calls in the context of the transaction + MintedSupply() int64 // GetTimestamp return current timestamp of the context GetTimestamp() int64 // GetEntropy 32 random bytes based on the hash of the current state transaction @@ -56,7 +63,7 @@ type Sandbox interface { Utils() Utils } -// PostRequestParams is parameters of the PostRequest call +// PostRequestParams is parameters of the PostRequestSync call type PostRequestParams struct { TargetContractID ContractID EntryPoint Hname diff --git a/packages/sctransaction/properties/properties.go b/packages/sctransaction/properties/properties.go index dae269950b..346ffd7f71 100644 --- a/packages/sctransaction/properties/properties.go +++ b/packages/sctransaction/properties/properties.go @@ -205,7 +205,7 @@ func (prop *properties) analyzeRequestBlocks(tx *sctransaction.Transaction) erro return true } if diff.Balance(balance.ColorNew) != 0 { - // semantical rule: we require number of minted tokens to the target chain exactly equal + // semantic rule: we require number of minted tokens to the target chain exactly equal // to the number of requests to that chain err = fmt.Errorf("wrong number of minted tokens in the output to the address %s", addr.String()) return false diff --git a/packages/solo/fun.go b/packages/solo/fun.go index 99f25484c3..33013a4c4e 100644 --- a/packages/solo/fun.go +++ b/packages/solo/fun.go @@ -106,7 +106,7 @@ func (ch *Chain) UploadBlob(sigScheme signaturescheme.SignatureScheme, params .. req.WithTransfer(balance.ColorIOTA, totalFee) } var res dict.Dict - res, err = ch.PostRequest(req, sigScheme) + res, err = ch.PostRequestSync(req, sigScheme) if err != nil { return } @@ -153,7 +153,7 @@ func (ch *Chain) UploadBlobOptimized(optimalSize int, sigScheme signaturescheme. req.WithTransfer(balance.ColorIOTA, totalFee) } var res dict.Dict - res, err = ch.PostRequest(req, sigScheme) + res, err = ch.PostRequestSync(req, sigScheme) if err != nil { return } @@ -239,7 +239,7 @@ func (ch *Chain) DeployContract(sigScheme signaturescheme.SignatureScheme, name par := []interface{}{root.ParamProgramHash, programHash, root.ParamName, name} par = append(par, params...) req := NewCallParams(root.Interface.Name, root.FuncDeployContract, par...) - _, err := ch.PostRequest(req, sigScheme) + _, err := ch.PostRequestSync(req, sigScheme) return err } diff --git a/packages/solo/req.go b/packages/solo/req.go index b9b689ccfc..60b4c3fb7b 100644 --- a/packages/solo/req.go +++ b/packages/solo/req.go @@ -45,7 +45,7 @@ func NewCallParamsFromDic(scName, funName string, par dict.Dict) *CallParams { return ret } -// NewCallParams creates structure which wraps in one object call parameters, used in PostRequest and callViewFull +// NewCallParams creates structure which wraps in one object call parameters, used in PostRequestSync and callViewFull // calls: // - 'scName' is a a name of the target smart contract // - 'funName' is a name of the target entry point (the function) of he smart contract program @@ -105,21 +105,13 @@ func toMap(params ...interface{}) map[string]interface{} { return par } -// PostRequest posts a request sent by the test program to the smart contract on the same or another chain: -// - creates a request transaction with the request block on it. The sigScheme is used to -// sign the inputs of the transaction or OriginatorSigScheme is used if parameter is nil -// - adds request transaction to UTXODB -// - runs the request in the VM. It results in new updated virtual state and a new transaction -// which anchors the state. -// - adds the resulting transaction to UTXODB -// - posts requests, contained in the resulting transaction to backlog queues of respective chains -// - returns the result of the call to the smart contract's entry point -// Note that in real network of Wasp nodes (the committee) posting the transaction is completely -// asynchronous, i.e. result of the call is not available to the originator of the post. -// -// Unlike the real Wasp environment, the 'solo' environment makes PostRequest a synchronous call. -// It makes it possible step-by-step debug of the smart contract logic. -func (ch *Chain) PostRequest(req *CallParams, sigScheme signaturescheme.SignatureScheme) (dict.Dict, error) { +// RequestFromParamsToLedger creates transaction with one request based on parameters and sigScheme +// Then it adds it to the ledger, atomically. +// Locking on the mutex is needed to prevent mess when several goroutines work on he same address +func (ch *Chain) RequestFromParamsToLedger(req *CallParams, sigScheme signaturescheme.SignatureScheme) *sctransaction.Transaction { + ch.Env.ledgerMutex.Lock() + defer ch.Env.ledgerMutex.Unlock() + if sigScheme == nil { sigScheme = ch.OriginatorSigScheme } @@ -138,13 +130,35 @@ func (ch *Chain) PostRequest(req *CallParams, sigScheme signaturescheme.Signatur require.NoError(ch.Env.T, err) tx.Sign(sigScheme) - err = ch.Env.utxoDB.AddTransaction(tx.Transaction) - if err != nil { - return nil, err - } + + _, err = tx.Properties() + require.NoError(ch.Env.T, err) + + err = ch.Env.AddToLedger(tx) + require.NoError(ch.Env.T, err) + return tx +} + +// PostRequestSync posts a request synchronously sent by the test program to the smart contract on the same or another chain: +// - creates a request transaction with the request block on it. The sigScheme is used to +// sign the inputs of the transaction or OriginatorSigScheme is used if parameter is nil +// - adds request transaction to UTXODB +// - runs the request in the VM. It results in new updated virtual state and a new transaction +// which anchors the state. +// - adds the resulting transaction to UTXODB +// - posts requests, contained in the resulting transaction to backlog queues of respective chains +// - returns the result of the call to the smart contract's entry point +// Note that in real network of Wasp nodes (the committee) posting the transaction is completely +// asynchronous, i.e. result of the call is not available to the originator of the post. +// +// Unlike the real Wasp environment, the 'solo' environment makes PostRequestSync a synchronous call. +// It makes it possible step-by-step debug of the smart contract logic. +// The call should be used only from the main thread (goroutine) +func (ch *Chain) PostRequestSync(req *CallParams, sigScheme signaturescheme.SignatureScheme) (dict.Dict, error) { + tx := ch.RequestFromParamsToLedger(req, sigScheme) reqID := coretypes.NewRequestID(tx.ID(), 0) - ch.Log.Infof("PostRequest: %s::%s -- %s", req.targetName, req.epName, reqID.String()) + ch.Log.Infof("PostRequestSync: %s::%s -- %s", req.targetName, req.epName, reqID.String()) r := vm.RequestRefWithFreeTokens{} r.Tx = tx @@ -186,14 +200,15 @@ func (ch *Chain) CallView(scName string, funName string, params ...interface{}) // // The call is needed in order to prevent finishing the test before all // asynchronous request between chains are processed. -// Otherwise waiting is not necessary because all PostRequest calls by the test itself +// Otherwise waiting is not necessary because all PostRequestSync calls by the test itself // are synchronous and are processed immediately func (ch *Chain) WaitForEmptyBacklog(maxWait ...time.Duration) { - maxDurationSet := len(maxWait) > 0 + maxw := 5 * time.Second var deadline time.Time - if maxDurationSet { - deadline = time.Now().Add(maxWait[0]) + if len(maxWait) > 0 { + maxw = maxWait[0] } + deadline = time.Now().Add(maxw) counter := 0 for { if counter%40 == 0 { @@ -201,9 +216,9 @@ func (ch *Chain) WaitForEmptyBacklog(maxWait ...time.Duration) { } counter++ if ch.backlogLen() > 0 { - time.Sleep(50 * time.Millisecond) - if maxDurationSet && deadline.Before(time.Now()) { - ch.Log.Warnf("exit due to timeout of max wait for %v", maxWait[0]) + time.Sleep(200 * time.Millisecond) + if time.Now().After(deadline) { + ch.Log.Warnf("exit due to timeout of max wait for %v", maxw) break } } else { diff --git a/packages/solo/run.go b/packages/solo/run.go index f70fea8f40..97548611ed 100644 --- a/packages/solo/run.go +++ b/packages/solo/run.go @@ -18,11 +18,21 @@ import ( "sync" ) +func (ch *Chain) validateBatch(batch []vm.RequestRefWithFreeTokens) { + for _, reqRef := range batch { + _, err := reqRef.Tx.Properties() + require.NoError(ch.Env.T, err) + } +} + func (ch *Chain) runBatch(batch []vm.RequestRefWithFreeTokens, trace string) (dict.Dict, error) { ch.Log.Debugf("runBatch ('%s')", trace) + ch.runVMMutex.Lock() defer ch.runVMMutex.Unlock() + ch.validateBatch(batch) + // solidify arguments for _, reqRef := range batch { if ok, err := reqRef.RequestSection().SolidifyArgs(ch.Env.registry); err != nil || !ok { @@ -60,12 +70,16 @@ func (ch *Chain) runBatch(batch []vm.RequestRefWithFreeTokens, trace string) (di wg.Wait() task.ResultTransaction.Sign(ch.ChainSigScheme) + // check semantic validity of the transaction + _, err = task.ResultTransaction.Properties() + require.NoError(ch.Env.T, err) + ch.settleStateTransition(task.VirtualState, task.ResultBlock, task.ResultTransaction) return callRes, callErr } func (ch *Chain) settleStateTransition(newState state.VirtualState, block state.Block, stateTx *sctransaction.Transaction) { - err := ch.Env.utxoDB.AddTransaction(stateTx.Transaction) + err := ch.Env.AddToLedger(stateTx) require.NoError(ch.Env.T, err) err = newState.ApplyBlock(block) @@ -84,34 +98,7 @@ func (ch *Chain) settleStateTransition(newState state.VirtualState, block state. ch.Log.Debugf("Batch processed: %s", batchShortStr(block.RequestIDs())) ch.Env.ClockStep() - - // dispatch requests among chains - ch.Env.glbMutex.Lock() - defer ch.Env.glbMutex.Unlock() - - reqRefByChain := make(map[coretypes.ChainID][]sctransaction.RequestRef) - for i, rsect := range ch.StateTx.Requests() { - chid := rsect.Target().ChainID() - _, ok := reqRefByChain[chid] - if !ok { - reqRefByChain[chid] = make([]sctransaction.RequestRef, 0) - } - reqRefByChain[chid] = append(reqRefByChain[chid], sctransaction.RequestRef{ - Tx: stateTx, - Index: uint16(i), - }) - } - for chid, reqs := range reqRefByChain { - chain, ok := ch.Env.chains[chid] - if !ok { - ch.Log.Infof("dispatching requests. Unknown chain: %s", chid.String()) - continue - } - chain.chPosted.Add(len(reqs)) - for _, reqRef := range reqs { - chain.chInRequest <- reqRef - } - } + ch.Env.EnqueueRequests(ch.StateTx) } func batchShortStr(reqIds []*coretypes.RequestID) string { diff --git a/packages/solo/solo.go b/packages/solo/solo.go index 2669a94d17..9017b9e34b 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -17,12 +17,10 @@ import ( "github.com/iotaledger/hive.go/logger" "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/dbprovider" - "github.com/iotaledger/wasp/packages/hashing" "github.com/iotaledger/wasp/packages/registry" "github.com/iotaledger/wasp/packages/sctransaction" "github.com/iotaledger/wasp/packages/sctransaction/origin" _ "github.com/iotaledger/wasp/packages/sctransaction/properties" - "github.com/iotaledger/wasp/packages/sctransaction/txbuilder" "github.com/iotaledger/wasp/packages/state" "github.com/iotaledger/wasp/packages/testutil" "github.com/iotaledger/wasp/packages/vm" @@ -34,7 +32,7 @@ import ( "go.uber.org/zap/zapcore" ) -// DefaultTimeStep is a default step for the logical clock for each PostRequest call. +// DefaultTimeStep is a default step for the logical clock for each PostRequestSync call. const DefaultTimeStep = 1 * time.Millisecond // Saldo is the default amount of tokens returned by the UTXODB faucet @@ -48,7 +46,8 @@ type Solo struct { logger *logger.Logger utxoDB *utxodb.UtxoDB registry coretypes.BlobCacheFull - glbMutex *sync.Mutex + glbMutex *sync.RWMutex + ledgerMutex *sync.RWMutex logicalTime time.Time timeStep time.Duration chains map[coretypes.ChainID]*Chain @@ -108,9 +107,7 @@ type Chain struct { chPosted sync.WaitGroup chInRequest chan sctransaction.RequestRef backlog []sctransaction.RequestRef - backlogMutex *sync.Mutex - batch []*sctransaction.RequestRef - batchMutex *sync.Mutex + backlogMutex *sync.RWMutex } var ( @@ -139,7 +136,8 @@ func New(t *testing.T, debug bool, printStackTrace bool) *Solo { logger: glbLogger, utxoDB: utxodb.New(), registry: reg, - glbMutex: &sync.Mutex{}, + glbMutex: &sync.RWMutex{}, + ledgerMutex: &sync.RWMutex{}, logicalTime: time.Now(), timeStep: DefaultTimeStep, chains: make(map[coretypes.ChainID]*Chain), @@ -192,9 +190,7 @@ func (env *Solo) NewChain(chainOriginator signaturescheme.SignatureScheme, name runVMMutex: &sync.Mutex{}, chInRequest: make(chan sctransaction.RequestRef), backlog: make([]sctransaction.RequestRef, 0), - backlogMutex: &sync.Mutex{}, - batch: nil, - batchMutex: &sync.Mutex{}, + backlogMutex: &sync.RWMutex{}, } env.AssertAddressBalance(ret.OriginatorAddress, balance.ColorIOTA, testutil.RequestFundsAmount) var err error @@ -246,6 +242,42 @@ func (env *Solo) NewChain(chainOriginator signaturescheme.SignatureScheme, name return ret } +// AddToLedger adds (synchronously confirms) transaction to the UTXODB ledger. Return error if it is +// invalid or double spend +func (env *Solo) AddToLedger(tx *sctransaction.Transaction) error { + return env.utxoDB.AddTransaction(tx.Transaction) +} + +// EnqueueRequests dispatches requests contained in the transaction among chains +func (env *Solo) EnqueueRequests(tx *sctransaction.Transaction) { + reqRefByChain := make(map[coretypes.ChainID][]sctransaction.RequestRef) + for i, rsect := range tx.Requests() { + chid := rsect.Target().ChainID() + _, ok := reqRefByChain[chid] + if !ok { + reqRefByChain[chid] = make([]sctransaction.RequestRef, 0) + } + reqRefByChain[chid] = append(reqRefByChain[chid], sctransaction.RequestRef{ + Tx: tx, + Index: uint16(i), + }) + } + env.glbMutex.RLock() + defer env.glbMutex.RUnlock() + + for chid, reqs := range reqRefByChain { + chain, ok := env.chains[chid] + if !ok { + env.logger.Infof("dispatching requests. Unknown chain: %s", chid.String()) + continue + } + chain.chPosted.Add(len(reqs)) + for _, reqRef := range reqs { + chain.chInRequest <- reqRef + } + } +} + func (ch *Chain) readRequestsLoop() { for r := range ch.chInRequest { ch.addToBacklog(r) @@ -261,7 +293,7 @@ func (ch *Chain) addToBacklog(r sctransaction.RequestRef) { ch.backlog = append(ch.backlog, r) tl := r.RequestSection().Timelock() if tl == 0 { - ch.Log.Infof("added to backlog: %s", r.RequestID().String()) + ch.Log.Infof("added to backlog: %s len: %d", r.RequestID().String(), len(ch.backlog)) } else { tlTime := time.Unix(int64(tl), 0) ch.Log.Infof("added to backlog: %s. Time locked for: %v", @@ -310,82 +342,7 @@ func (ch *Chain) batchLoop() { // backlogLen is a thread-safe function to return size of the current backlog func (ch *Chain) backlogLen() int { ch.chPosted.Wait() - ch.backlogMutex.Lock() - defer ch.backlogMutex.Unlock() + ch.backlogMutex.RLock() + defer ch.backlogMutex.RUnlock() return len(ch.backlog) } - -// NewSignatureSchemeWithFunds generates new ed25519 signature scheme -// and requests some tokens from the UTXODB faucet. -// The amount of tokens is equal to solo.Saldo (=1337) iotas -func (env *Solo) NewSignatureSchemeWithFunds() signaturescheme.SignatureScheme { - ret, _ := env.NewSignatureSchemeWithFundsAndPubKey() - return ret -} - -// NewSignatureSchemeWithFundsAndPubKey generates new ed25519 signature scheme -// and requests some tokens from the UTXODB faucet. -// The amount of tokens is equal to solo.Saldo (=1337) iotas -// Returns signature scheme interface and public key in binary form -func (env *Solo) NewSignatureSchemeWithFundsAndPubKey() (signaturescheme.SignatureScheme, []byte) { - ret, pubKeyBytes := env.NewSignatureSchemeAndPubKey() - _, err := env.utxoDB.RequestFunds(ret.Address()) - require.NoError(env.T, err) - return ret, pubKeyBytes -} - -// NewSignatureScheme generates new ed25519 signature scheme -func (env *Solo) NewSignatureScheme() signaturescheme.SignatureScheme { - ret, _ := env.NewSignatureSchemeAndPubKey() - return ret -} - -// NewSignatureSchemeAndPubKey generates new ed25519 signature scheme -// Returns signature scheme interface and public key in binary form -func (env *Solo) NewSignatureSchemeAndPubKey() (signaturescheme.SignatureScheme, []byte) { - keypair := ed25519.GenerateKeyPair() - ret := signaturescheme.ED25519(keypair) - env.AssertAddressBalance(ret.Address(), balance.ColorIOTA, 0) - return ret, keypair.PublicKey.Bytes() -} - -// MintTokens mints specified amount of new colored tokens in the given wallet (signature scheme) -// Returns the color of minted tokens: the hash of the transaction -func (env *Solo) MintTokens(wallet signaturescheme.SignatureScheme, amount int64) (balance.Color, error) { - allOuts := env.utxoDB.GetAddressOutputs(wallet.Address()) - txb, err := txbuilder.NewFromOutputBalances(allOuts) - require.NoError(env.T, err) - - if err = txb.MintColor(wallet.Address(), balance.ColorIOTA, amount); err != nil { - return balance.Color{}, err - } - tx := txb.BuildValueTransactionOnly(false) - tx.Sign(wallet) - - if err = env.utxoDB.AddTransaction(tx); err != nil { - return balance.Color{}, err - } - return balance.Color(tx.ID()), nil -} - -// DestroyColoredTokens uncolors specified amount of colored tokens, i.e. converts them into IOTAs -func (env *Solo) DestroyColoredTokens(wallet signaturescheme.SignatureScheme, color balance.Color, amount int64) error { - allOuts := env.utxoDB.GetAddressOutputs(wallet.Address()) - txb, err := txbuilder.NewFromOutputBalances(allOuts) - require.NoError(env.T, err) - - if err = txb.EraseColor(wallet.Address(), color, amount); err != nil { - return err - } - tx := txb.BuildValueTransactionOnly(false) - tx.Sign(wallet) - - return env.utxoDB.AddTransaction(tx) -} - -func (env *Solo) PutBlobDataIntoRegistry(data []byte) hashing.HashValue { - h, err := env.registry.PutBlob(data) - require.NoError(env.T, err) - env.logger.Infof("Solo::PutBlobDataIntoRegistry: len = %d, hash = %s", len(data), h) - return h -} diff --git a/packages/solo/solofun.go b/packages/solo/solofun.go new file mode 100644 index 0000000000..fc958bcef4 --- /dev/null +++ b/packages/solo/solofun.go @@ -0,0 +1,94 @@ +package solo + +import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/iotaledger/wasp/packages/hashing" + "github.com/iotaledger/wasp/packages/sctransaction/txbuilder" + "github.com/stretchr/testify/require" +) + +// NewSignatureSchemeWithFunds generates new ed25519 signature scheme +// and requests some tokens from the UTXODB faucet. +// The amount of tokens is equal to solo.Saldo (=1337) iotas +func (env *Solo) NewSignatureSchemeWithFunds() signaturescheme.SignatureScheme { + ret, _ := env.NewSignatureSchemeWithFundsAndPubKey() + return ret +} + +// NewSignatureSchemeWithFundsAndPubKey generates new ed25519 signature scheme +// and requests some tokens from the UTXODB faucet. +// The amount of tokens is equal to solo.Saldo (=1337) iotas +// Returns signature scheme interface and public key in binary form +func (env *Solo) NewSignatureSchemeWithFundsAndPubKey() (signaturescheme.SignatureScheme, []byte) { + env.ledgerMutex.Lock() + defer env.ledgerMutex.Unlock() + + ret, pubKeyBytes := env.NewSignatureSchemeAndPubKey() + _, err := env.utxoDB.RequestFunds(ret.Address()) + require.NoError(env.T, err) + return ret, pubKeyBytes +} + +// NewSignatureScheme generates new ed25519 signature scheme +func (env *Solo) NewSignatureScheme() signaturescheme.SignatureScheme { + ret, _ := env.NewSignatureSchemeAndPubKey() + return ret +} + +// NewSignatureSchemeAndPubKey generates new ed25519 signature scheme +// Returns signature scheme interface and public key in binary form +func (env *Solo) NewSignatureSchemeAndPubKey() (signaturescheme.SignatureScheme, []byte) { + keypair := ed25519.GenerateKeyPair() + ret := signaturescheme.ED25519(keypair) + env.AssertAddressBalance(ret.Address(), balance.ColorIOTA, 0) + return ret, keypair.PublicKey.Bytes() +} + +// MintTokens mints specified amount of new colored tokens in the given wallet (signature scheme) +// Returns the color of minted tokens: the hash of the transaction +func (env *Solo) MintTokens(wallet signaturescheme.SignatureScheme, amount int64) (balance.Color, error) { + env.ledgerMutex.Lock() + defer env.ledgerMutex.Unlock() + + allOuts := env.utxoDB.GetAddressOutputs(wallet.Address()) + txb, err := txbuilder.NewFromOutputBalances(allOuts) + require.NoError(env.T, err) + + if err = txb.MintColor(wallet.Address(), balance.ColorIOTA, amount); err != nil { + return balance.Color{}, err + } + tx := txb.BuildValueTransactionOnly(false) + tx.Sign(wallet) + + if err = env.utxoDB.AddTransaction(tx); err != nil { + return balance.Color{}, err + } + return balance.Color(tx.ID()), nil +} + +// DestroyColoredTokens uncolors specified amount of colored tokens, i.e. converts them into IOTAs +func (env *Solo) DestroyColoredTokens(wallet signaturescheme.SignatureScheme, color balance.Color, amount int64) error { + env.ledgerMutex.Lock() + defer env.ledgerMutex.Unlock() + + allOuts := env.utxoDB.GetAddressOutputs(wallet.Address()) + txb, err := txbuilder.NewFromOutputBalances(allOuts) + require.NoError(env.T, err) + + if err = txb.EraseColor(wallet.Address(), color, amount); err != nil { + return err + } + tx := txb.BuildValueTransactionOnly(false) + tx.Sign(wallet) + + return env.utxoDB.AddTransaction(tx) +} + +func (env *Solo) PutBlobDataIntoRegistry(data []byte) hashing.HashValue { + h, err := env.registry.PutBlob(data) + require.NoError(env.T, err) + env.logger.Infof("Solo::PutBlobDataIntoRegistry: len = %d, hash = %s", len(data), h) + return h +} diff --git a/packages/solo/utils.go b/packages/solo/utils.go index 444aa0cabd..67741e2e2c 100644 --- a/packages/solo/utils.go +++ b/packages/solo/utils.go @@ -13,7 +13,7 @@ func (ch *Chain) GrantDeployPermission(sigScheme signaturescheme.SignatureScheme } req := NewCallParams(root.Interface.Name, root.FuncGrantDeploy, root.ParamDeployer, deployerAgentID) - _, err := ch.PostRequest(req, sigScheme) + _, err := ch.PostRequestSync(req, sigScheme) return err } @@ -24,6 +24,6 @@ func (ch *Chain) RevokeDeployPermission(sigScheme signaturescheme.SignatureSchem } req := NewCallParams(root.Interface.Name, root.FuncRevokeDeploy, root.ParamDeployer, deployerAgentID) - _, err := ch.PostRequest(req, sigScheme) + _, err := ch.PostRequestSync(req, sigScheme) return err } diff --git a/packages/txutil/vtxbuilder/vtxbuilder.go b/packages/txutil/vtxbuilder/vtxbuilder.go index 3911c8ae31..9cce24e8f7 100644 --- a/packages/txutil/vtxbuilder/vtxbuilder.go +++ b/packages/txutil/vtxbuilder/vtxbuilder.go @@ -184,22 +184,6 @@ func (vtxb *Builder) GetInputBalance(col balance.Color) int64 { return ret } -// GetInputBalanceFromTransaction calculates what is available in inputs from outputs -// of the given transaction -func (vtxb *Builder) GetInputBalanceFromTransaction(col balance.Color, txid valuetransaction.ID) int64 { - if vtxb.finalized { - panic("can't use finalized transaction builder") - } - ret := int64(0) - for _, inp := range vtxb.inputBalancesByOutput { - if inp.outputId.TransactionID() != txid { - continue - } - ret += txutil.BalanceOfColor(inp.remain, col) - } - return ret -} - // Returns consumed and unconsumed total func subtractAmount(bals []*balance.Balance, col balance.Color, amount int64) (int64, int64) { if amount == 0 { @@ -320,41 +304,6 @@ func (vtxb *Builder) MintColor(targetAddr address.Address, sourceColor balance.C return nil } -func (vtxb *Builder) MoveToAddressFromTransaction(targetAddr address.Address, col balance.Color, amount int64, txid valuetransaction.ID) error { - if vtxb.finalized { - panic("using finalized transaction builder") - } - if vtxb.GetInputBalanceFromTransaction(col, txid) < amount { - return errorNotEnoughBalance - } - vtxb.moveAmountFromTransaction(targetAddr, col, col, amount, txid) - return nil -} - -func (vtxb *Builder) EraseColorFromTransaction(targetAddr address.Address, col balance.Color, amount int64, txid valuetransaction.ID) error { - if vtxb.finalized { - panic("using finalized transaction builder") - } - actualBalance := vtxb.GetInputBalanceFromTransaction(col, txid) - if actualBalance < amount { - return fmt.Errorf("EraseColorFromTransaction: not enough balance: need %d, found %d, color %s txid %s", - amount, actualBalance, col.String(), txid.String()) - } - vtxb.moveAmountFromTransaction(targetAddr, col, balance.ColorIOTA, amount, txid) - return nil -} - -func (vtxb *Builder) MintColorFromTransaction(targetAddr address.Address, col balance.Color, amount int64, txid valuetransaction.ID) error { - if vtxb.finalized { - panic("using finalized transaction builder") - } - if vtxb.GetInputBalanceFromTransaction(col, txid) < amount { - return errorNotEnoughBalance - } - vtxb.moveAmountFromTransaction(targetAddr, col, balance.ColorNew, amount, txid) - return nil -} - // Build build the final value transaction: not signed and without data payload func (vtxb *Builder) Build(useAllInputs bool) *valuetransaction.Transaction { diff --git a/packages/vm/core/testcore/accounts_test.go b/packages/vm/core/testcore/accounts_test.go index b69c5e92ba..423fecc19f 100644 --- a/packages/vm/core/testcore/accounts_test.go +++ b/packages/vm/core/testcore/accounts_test.go @@ -25,7 +25,7 @@ func TestAccountsRepeatInit(t *testing.T) { env := solo.New(t, false, false) chain := env.NewChain(nil, "chain1") req := solo.NewCallParams(accounts.Interface.Name, "init") - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) chain.CheckAccountLedger() } @@ -38,7 +38,7 @@ func TestAccountsBase1(t *testing.T) { newOwner := env.NewSignatureSchemeWithFunds() newOwnerAgentID := coretypes.NewAgentIDFromAddress(newOwner.Address()) req := solo.NewCallParams(root.Interface.Name, root.FuncDelegateChainOwnership, root.ParamChainOwner, newOwnerAgentID) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, 2) @@ -46,7 +46,7 @@ func TestAccountsBase1(t *testing.T) { chain.CheckAccountLedger() req = solo.NewCallParams(root.Interface.Name, root.FuncClaimChainOwnership) - _, err = chain.PostRequest(req, newOwner) + _, err = chain.PostRequestSync(req, newOwner) require.NoError(t, err) chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, 2) @@ -63,13 +63,13 @@ func TestAccountsDepositWithdrawToAddress(t *testing.T) { newOwnerAgentID := coretypes.NewAgentIDFromAddress(newOwner.Address()) req := solo.NewCallParams(accounts.Interface.Name, accounts.FuncDeposit). WithTransfer(balance.ColorIOTA, 42) - _, err := chain.PostRequest(req, newOwner) + _, err := chain.PostRequestSync(req, newOwner) require.NoError(t, err) chain.AssertAccountBalance(newOwnerAgentID, balance.ColorIOTA, 42+1) req = solo.NewCallParams(accounts.Interface.Name, accounts.FuncWithdrawToAddress) - _, err = chain.PostRequest(req, newOwner) + _, err = chain.PostRequestSync(req, newOwner) require.NoError(t, err) chain.AssertAccountBalance(newOwnerAgentID, balance.ColorIOTA, 0) env.AssertAddressBalance(newOwner.Address(), balance.ColorIOTA, testutil.RequestFundsAmount) @@ -84,13 +84,13 @@ func TestAccountsDepositWithdrawToChainFail(t *testing.T) { newOwnerAgentID := coretypes.NewAgentIDFromAddress(newOwner.Address()) req := solo.NewCallParams(accounts.Interface.Name, accounts.FuncDeposit). WithTransfer(balance.ColorIOTA, 42) - _, err := chain.PostRequest(req, newOwner) + _, err := chain.PostRequestSync(req, newOwner) require.NoError(t, err) chain.AssertAccountBalance(newOwnerAgentID, balance.ColorIOTA, 42+1) req = solo.NewCallParams(accounts.Interface.Name, accounts.FuncWithdrawToChain) - _, err = chain.PostRequest(req, newOwner) + _, err = chain.PostRequestSync(req, newOwner) require.Error(t, err) chain.AssertAccountBalance(newOwnerAgentID, balance.ColorIOTA, 42+2) env.AssertAddressBalance(newOwner.Address(), balance.ColorIOTA, testutil.RequestFundsAmount-42-2) diff --git a/packages/vm/core/testcore/base_test.go b/packages/vm/core/testcore/base_test.go index 88509785f3..6a68ef580d 100644 --- a/packages/vm/core/testcore/base_test.go +++ b/packages/vm/core/testcore/base_test.go @@ -12,7 +12,7 @@ func TestNoContractPost(t *testing.T) { chain := env.NewChain(nil, "chain1") req := solo.NewCallParams("dummyContract", "dummyEP") - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } @@ -29,7 +29,7 @@ func TestNoEPPost(t *testing.T) { chain := env.NewChain(nil, "chain1") req := solo.NewCallParams(root.Interface.Name, "dummyEP") - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } diff --git a/packages/vm/core/testcore/blob_deploy_test.go b/packages/vm/core/testcore/blob_deploy_test.go index c4aeaadef4..318eedc95a 100644 --- a/packages/vm/core/testcore/blob_deploy_test.go +++ b/packages/vm/core/testcore/blob_deploy_test.go @@ -17,7 +17,7 @@ func TestBlobRepeatInit(t *testing.T) { env := solo.New(t, false, false) chain := env.NewChain(nil, "chain1") req := solo.NewCallParams(blob.Interface.Name, "init") - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } @@ -110,7 +110,7 @@ func TestDeployGrant(t *testing.T) { req := solo.NewCallParams(root.Interface.Name, root.FuncGrantDeploy, root.ParamDeployer, user1AgentID, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) err = chain.DeployWasmContract(user1, "testCore", wasmFile) @@ -135,7 +135,7 @@ func TestRevokeDeploy(t *testing.T) { req := solo.NewCallParams(root.Interface.Name, root.FuncGrantDeploy, root.ParamDeployer, user1AgentID, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) err = chain.DeployWasmContract(user1, "testCore", wasmFile) @@ -147,7 +147,7 @@ func TestRevokeDeploy(t *testing.T) { req = solo.NewCallParams(root.Interface.Name, root.FuncRevokeDeploy, root.ParamDeployer, user1AgentID, ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) err = chain.DeployWasmContract(user1, "testInccounter2", wasmFile) @@ -166,7 +166,7 @@ func TestDeployGrantFail(t *testing.T) { req := solo.NewCallParams(root.Interface.Name, root.FuncGrantDeploy, root.ParamDeployer, user1AgentID, ) - _, err := chain.PostRequest(req, user1) + _, err := chain.PostRequestSync(req, user1) require.Error(t, err) err = chain.DeployWasmContract(user1, "testCore", wasmFile) diff --git a/packages/vm/core/testcore/fee_admin_test.go b/packages/vm/core/testcore/fee_admin_test.go index 7cecd6e0a6..e6fd1b6b30 100644 --- a/packages/vm/core/testcore/fee_admin_test.go +++ b/packages/vm/core/testcore/fee_admin_test.go @@ -35,7 +35,7 @@ func TestSetDefaultFeeNotAuthorized(t *testing.T) { user := env.NewSignatureSchemeWithFunds() req := solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, 1000) - _, err := chain.PostRequest(req, user) + _, err := chain.PostRequestSync(req, user) require.Error(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -50,7 +50,7 @@ func TestSetContractFeeNotAuthorized(t *testing.T) { user := env.NewSignatureSchemeWithFunds() req := solo.NewCallParams(root.Interface.Name, root.FuncSetContractFee, root.ParamOwnerFee, 1000) - _, err := chain.PostRequest(req, user) + _, err := chain.PostRequestSync(req, user) require.Error(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -65,7 +65,7 @@ func TestSetDefaultOwnerFeeOk(t *testing.T) { req := solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, 1000, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 1000, 0) checkFees(chain, accounts.Interface.Name, 1000, 0) @@ -79,7 +79,7 @@ func TestSetDefaultValidatorFeeOk(t *testing.T) { req := solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamValidatorFee, 499, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 499) checkFees(chain, accounts.Interface.Name, 0, 499) @@ -94,7 +94,7 @@ func TestSetDefaultFeeOk(t *testing.T) { root.ParamOwnerFee, 1000, root.ParamValidatorFee, 499, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 1000, 499) checkFees(chain, accounts.Interface.Name, 1000, 499) @@ -106,7 +106,7 @@ func TestSetDefaultFeeFailNegative1(t *testing.T) { chain := env.NewChain(nil, "chain1") req := solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, -2) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -119,7 +119,7 @@ func TestSetDefaultFeeFailNegative2(t *testing.T) { chain := env.NewChain(nil, "chain1") req := solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamValidatorFee, -100) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -135,7 +135,7 @@ func TestSetContractValidatorFeeOk(t *testing.T) { root.ParamHname, blob.Interface.Hname(), root.ParamValidatorFee, 1000, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -151,7 +151,7 @@ func TestSetContractOwnerFeeOk(t *testing.T) { root.ParamHname, accounts.Interface.Hname(), root.ParamOwnerFee, 499, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -167,7 +167,7 @@ func TestSetContractFeeWithDefault(t *testing.T) { root.ParamHname, blob.Interface.Hname(), root.ParamValidatorFee, 1000, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 0) @@ -177,7 +177,7 @@ func TestSetContractFeeWithDefault(t *testing.T) { req = solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, 499, ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 499, 0) @@ -190,7 +190,7 @@ func TestSetContractFeeWithDefault(t *testing.T) { // balance.ColorIOTA: 800, // }, // ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 499, 1999) @@ -206,7 +206,7 @@ func TestFeeNotEnough(t *testing.T) { root.ParamHname, root.Interface.Hname(), root.ParamValidatorFee, 499, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 499) @@ -217,7 +217,7 @@ func TestFeeNotEnough(t *testing.T) { req = solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, 1000, ) - _, err = chain.PostRequest(req, user) + _, err = chain.PostRequestSync(req, user) require.Error(t, err) checkFees(chain, root.Interface.Name, 0, 499) @@ -233,7 +233,7 @@ func TestFeeOwnerDontNeed(t *testing.T) { root.ParamHname, root.Interface.Hname(), root.ParamValidatorFee, 499, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 0, 499) @@ -243,7 +243,7 @@ func TestFeeOwnerDontNeed(t *testing.T) { req = solo.NewCallParams(root.Interface.Name, root.FuncSetDefaultFee, root.ParamOwnerFee, 1000, ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) checkFees(chain, root.Interface.Name, 1000, 499) diff --git a/packages/vm/core/testcore/fee_handling_test.go b/packages/vm/core/testcore/fee_handling_test.go index 66f060968c..b6c5505157 100644 --- a/packages/vm/core/testcore/fee_handling_test.go +++ b/packages/vm/core/testcore/fee_handling_test.go @@ -37,7 +37,7 @@ func TestBase(t *testing.T) { root.ParamHname, blob.Interface.Hname(), root.ParamOwnerFee, 1, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, 2) @@ -54,7 +54,7 @@ func TestFeeIsEnough1(t *testing.T) { root.ParamHname, blob.Interface.Hname(), root.ParamOwnerFee, 1, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, 2) @@ -80,7 +80,7 @@ func TestFeeIsEnough2(t *testing.T) { root.ParamHname, blob.Interface.Hname(), root.ParamOwnerFee, 2, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, 2) diff --git a/packages/vm/core/testcore/root_test.go b/packages/vm/core/testcore/root_test.go index 2d63ab20c0..da85677dcc 100644 --- a/packages/vm/core/testcore/root_test.go +++ b/packages/vm/core/testcore/root_test.go @@ -32,7 +32,7 @@ func TestRootRepeatInit(t *testing.T) { chain.CheckChain() req := solo.NewCallParams(root.Interface.Name, "init") - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) } @@ -140,14 +140,14 @@ func TestChangeOwnerAuthorized(t *testing.T) { newOwner := env.NewSignatureSchemeWithFunds() newOwnerAgentID := coretypes.NewAgentIDFromAddress(newOwner.Address()) req := solo.NewCallParams(root.Interface.Name, root.FuncDelegateChainOwnership, root.ParamChainOwner, newOwnerAgentID) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) info, _ := chain.GetInfo() require.EqualValues(t, chain.OriginatorAgentID, info.ChainOwnerID) req = solo.NewCallParams(root.Interface.Name, root.FuncClaimChainOwnership) - _, err = chain.PostRequest(req, newOwner) + _, err = chain.PostRequestSync(req, newOwner) require.NoError(t, err) info, _ = chain.GetInfo() @@ -162,7 +162,7 @@ func TestChangeOwnerUnauthorized(t *testing.T) { newOwner := env.NewSignatureSchemeWithFunds() newOwnerAgentID := coretypes.NewAgentIDFromAddress(newOwner.Address()) req := solo.NewCallParams(root.Interface.Name, root.FuncDelegateChainOwnership, root.ParamChainOwner, newOwnerAgentID) - _, err := chain.PostRequest(req, newOwner) + _, err := chain.PostRequestSync(req, newOwner) require.Error(t, err) info, _ := chain.GetInfo() diff --git a/packages/vm/core/testcore/sbtests/2chains_test.go b/packages/vm/core/testcore/sbtests/2chains_test.go index 5137ed18c5..3ac58bdb2f 100644 --- a/packages/vm/core/testcore/sbtests/2chains_test.go +++ b/packages/vm/core/testcore/sbtests/2chains_test.go @@ -39,7 +39,7 @@ func test2Chains(t *testing.T, w bool) { ).WithTransfer( balance.ColorIOTA, 42, ) - _, err := chain1.PostRequest(req, userWallet) + _, err := chain1.PostRequestSync(req, userWallet) require.NoError(t, err) accountsAgentID1 := coretypes.NewAgentIDFromContractID(accounts.Interface.ContractID(chain1.ChainID)) @@ -63,7 +63,7 @@ func test2Chains(t *testing.T, w bool) { ).WithTransfer( balance.ColorIOTA, 3, ) - _, err = chain2.PostRequest(req, userWallet) + _, err = chain2.PostRequestSync(req, userWallet) require.NoError(t, err) chain1.WaitForEmptyBacklog() diff --git a/packages/vm/core/testcore/sbtests/call_test.go b/packages/vm/core/testcore/sbtests/call_test.go index b13d17bfd6..aa30a7123d 100644 --- a/packages/vm/core/testcore/sbtests/call_test.go +++ b/packages/vm/core/testcore/sbtests/call_test.go @@ -18,7 +18,7 @@ func testGetSet(t *testing.T, w bool) { sbtestsc.ParamIntParamName, "ppp", sbtestsc.ParamIntParamValue, 314, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetInt, @@ -41,7 +41,7 @@ func testCallRecursive(t *testing.T, w bool) { sbtestsc.ParamHnameContract, cID.Hname(), sbtestsc.ParamHnameEP, coretypes.Hn(sbtestsc.FuncRunRecursion), ) - ret, err := chain.PostRequest(req, nil) + ret, err := chain.PostRequestSync(req, nil) require.NoError(t, err) ret, err = chain.CallView(sbtestsc.Interface.Name, sbtestsc.FuncGetCounter) @@ -87,7 +87,7 @@ func testCallFibonacciIndirect(t *testing.T, w bool) { sbtestsc.ParamHnameContract, cID.Hname(), sbtestsc.ParamHnameEP, coretypes.Hn(sbtestsc.FuncGetFibonacci), ) - ret, err := chain.PostRequest(req, nil) + ret, err := chain.PostRequestSync(req, nil) require.NoError(t, err) r, exists, err := codec.DecodeInt64(ret.MustGet(sbtestsc.ParamIntParamValue)) require.NoError(t, err) diff --git a/packages/vm/core/testcore/sbtests/check_ctx_test.go b/packages/vm/core/testcore/sbtests/check_ctx_test.go index 9901c0974a..e57d6c0098 100644 --- a/packages/vm/core/testcore/sbtests/check_ctx_test.go +++ b/packages/vm/core/testcore/sbtests/check_ctx_test.go @@ -29,7 +29,7 @@ func testMainCallsFromFullEP(t *testing.T, w bool) { sbtestsc.ParamContractID, contractID, sbtestsc.ParamContractCreator, userAgentID, ) - _, err := chain.PostRequest(req, user) + _, err := chain.PostRequestSync(req, user) require.NoError(t, err) } diff --git a/packages/vm/core/testcore/sbtests/concurrency_test.go b/packages/vm/core/testcore/sbtests/concurrency_test.go new file mode 100644 index 0000000000..ed985e641c --- /dev/null +++ b/packages/vm/core/testcore/sbtests/concurrency_test.go @@ -0,0 +1,66 @@ +package sbtests + +import ( + "github.com/iotaledger/wasp/packages/kv/kvdecoder" + "github.com/iotaledger/wasp/packages/solo" + "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" + "github.com/stretchr/testify/require" + "runtime" + "testing" + "time" +) + +func TestCounter(t *testing.T) { run2(t, testCounter) } +func testCounter(t *testing.T, w bool) { + _, chain := setupChain(t, nil) + setupTestSandboxSC(t, chain, nil, w) + + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncIncCounter) + for i := 0; i < 33; i++ { + _, err := chain.PostRequestSync(req, nil) + require.NoError(t, err) + } + + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetCounter) + require.NoError(t, err) + + deco := kvdecoder.New(ret, chain.Log) + res := deco.MustGetInt64(sbtestsc.VarCounter) + require.EqualValues(t, 33, res) +} + +func TestConcurrency(t *testing.T) { run2(t, testConcurrency) } +func testConcurrency(t *testing.T, w bool) { + //t.SkipNow() + _, chain := setupChain(t, nil) + setupTestSandboxSC(t, chain, nil, w) + + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncIncCounter) + + repeats := []int{100, 100, 100, 100, 100, 100, 100, 100, 100, 100} + sum := 0 + for _, i := range repeats { + sum += i + } + for r, n := range repeats { + go func(r, n int) { + for i := 0; i < n; i++ { + tx := chain.RequestFromParamsToLedger(req, nil) + chain.Env.EnqueueRequests(tx) + } + var m runtime.MemStats + runtime.ReadMemStats(&m) + t.Logf("++++++++++++++ #%d -- alloc: %d MB, total: %d MB GC: %d", + r, m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.NumGC) + }(r, n) + } + time.Sleep(1 * time.Second) + chain.WaitForEmptyBacklog(10 * time.Second) + + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetCounter) + require.NoError(t, err) + + deco := kvdecoder.New(ret, chain.Log) + res := deco.MustGetInt64(sbtestsc.VarCounter) + require.EqualValues(t, sum, res) +} diff --git a/packages/vm/core/testcore/sbtests/eventlog_test.go b/packages/vm/core/testcore/sbtests/eventlog_test.go index c7212064a9..bb20d218ab 100644 --- a/packages/vm/core/testcore/sbtests/eventlog_test.go +++ b/packages/vm/core/testcore/sbtests/eventlog_test.go @@ -24,7 +24,7 @@ func testEventlogGetLast3(t *testing.T, w bool) { req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncEventLogGenericData, sbtestsc.VarCounter, i, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) } @@ -50,7 +50,7 @@ func testEventlogGetBetweenTs(t *testing.T, w bool) { sbtestsc.FuncEventLogGenericData, sbtestsc.VarCounter, i, ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) } @@ -74,7 +74,7 @@ func testEventLogEventData(t *testing.T, w bool) { req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncEventLogEventData, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetRecords, @@ -106,7 +106,7 @@ func testEventLogDifferentCalls(t *testing.T, w bool) { sbtestsc.VarCounter, count, ) count++ - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) } // generic @@ -116,7 +116,7 @@ func testEventLogDifferentCalls(t *testing.T, w bool) { sbtestsc.VarCounter, count, ) count++ - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) } res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetRecords, @@ -146,7 +146,7 @@ func testChainLogGetNumRecords(t *testing.T, w bool) { sbtestsc.FuncEventLogGenericData, sbtestsc.VarCounter, solo.Saldo, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) res, err := chain.CallView(eventlog.Interface.Name, eventlog.FuncGetNumRecords, @@ -178,7 +178,7 @@ func testChainLogSandboxDeploy(t *testing.T, w bool) { req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncEventLogDeploy, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) //This call should return only one record which should be the type of TRDeploy @@ -206,14 +206,14 @@ func testChainLogMultiple(t *testing.T, w bool) { req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncEventLogEventData, ) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.NoError(t, err) req = solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncEventLogGenericData, sbtestsc.VarCounter, 33333, ) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) /////Should return 4 logs records///// diff --git a/packages/vm/core/testcore/sbtests/misc_call_test.go b/packages/vm/core/testcore/sbtests/misc_call_test.go index 8c2d25f578..1d6968ab91 100644 --- a/packages/vm/core/testcore/sbtests/misc_call_test.go +++ b/packages/vm/core/testcore/sbtests/misc_call_test.go @@ -27,7 +27,7 @@ func testChainOwnerIDFull(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncChainOwnerIDFull) - ret, err := chain.PostRequest(req, nil) + ret, err := chain.PostRequestSync(req, nil) require.NoError(t, err) c := ret.MustGet(sbtestsc.ParamChainOwnerID) @@ -51,7 +51,7 @@ func testContractIDFull(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncContractIDFull) - ret, err := chain.PostRequest(req, nil) + ret, err := chain.PostRequestSync(req, nil) require.NoError(t, err) cID := coretypes.NewContractID(chain.ChainID, coretypes.Hn(SandboxSCName)) require.EqualValues(t, cID[:], ret.MustGet(sbtestsc.VarContractID)) diff --git a/packages/vm/core/testcore/sbtests/sandbox_panic_test.go b/packages/vm/core/testcore/sbtests/sandbox_panic_test.go index e73a9157e9..1855a14dbc 100644 --- a/packages/vm/core/testcore/sbtests/sandbox_panic_test.go +++ b/packages/vm/core/testcore/sbtests/sandbox_panic_test.go @@ -14,7 +14,7 @@ func testPanicFull(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncPanicFullEP) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgFullPanic)) } @@ -35,7 +35,7 @@ func testCallPanicFull(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncCallPanicFullEP) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgFullPanic)) } @@ -46,7 +46,7 @@ func testCallPanicViewFromFull(t *testing.T, w bool) { setupTestSandboxSC(t, chain, nil, w) req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncCallPanicViewEPFromFull) - _, err := chain.PostRequest(req, nil) + _, err := chain.PostRequestSync(req, nil) require.Error(t, err) require.EqualValues(t, 1, strings.Count(err.Error(), sbtestsc.MsgViewPanic)) } diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go index bba5b2dbc1..73f96067fc 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_misc.go @@ -31,6 +31,13 @@ func callOnChain(ctx coretypes.Sandbox) (dict.Dict, error) { }), nil) } +func incCounter(ctx coretypes.Sandbox) (dict.Dict, error) { + state := kvdecoder.New(ctx.State(), ctx.Log()) + counter := state.MustGetInt64(VarCounter, 0) + ctx.State().Set(VarCounter, codec.EncodeInt64(counter+1)) + return nil, nil +} + func getCounter(ctx coretypes.SandboxView) (dict.Dict, error) { ret := dict.New() state := kvdecoder.New(ctx.State(), ctx.Log()) diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go index 7088e491e7..327a76431a 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go @@ -46,6 +46,7 @@ func init() { coreutil.Func(FuncSetInt, setInt), coreutil.ViewFunc(FuncGetInt, getInt), coreutil.ViewFunc(FuncGetFibonacci, getFibonacci), + coreutil.Func(FuncIncCounter, incCounter), coreutil.ViewFunc(FuncGetCounter, getCounter), coreutil.Func(FuncRunRecursion, runRecursion), @@ -92,6 +93,7 @@ const ( FuncGetInt = "getInt" FuncGetFibonacci = "fibonacci" FuncGetCounter = "getCounter" + FuncIncCounter = "incCounter" FuncRunRecursion = "runRecursion" FuncPassTypesFull = "passTypesFull" diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index 4468284cdfe56a00b8f78e87944dde3e13088917..4280c6fba92f0c14518ad1b67bde6269bd4f6b81 100644 GIT binary patch delta 19349 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 0 ret := int64(0) for _, inp := range vtxb.inputBalancesByOutput { + if takeFromTransaction && inp.outputId.TransactionID() != filterTxid[0] { + continue + } ret += txutil.BalanceOfColor(inp.remain, col) } return ret @@ -183,13 +187,17 @@ func addAmount(bals []*balance.Balance, col balance.Color, amount int64) []*bala } // don't do any validation, may panic -func (vtxb *vtxBuilder) moveAmount(targetAddr address.Address, origColor, targetColor balance.Color, amountToConsume int64) { +func (vtxb *vtxBuilder) moveAmount(targetAddr address.Address, origColor, targetColor balance.Color, amountToConsume int64, filterTxid ...valuetransaction.ID) { + takeFromTransaction := len(filterTxid) > 0 saveAmount := amountToConsume if amountToConsume == 0 { return } var consumedAmount int64 for i := range vtxb.inputBalancesByOutput { + if takeFromTransaction && vtxb.inputBalancesByOutput[i].outputId.TransactionID() != filterTxid[0] { + continue + } consumedAmount, amountToConsume = subtractAmount(vtxb.inputBalancesByOutput[i].remain, origColor, amountToConsume) vtxb.inputBalancesByOutput[i].consumed = addAmount(vtxb.inputBalancesByOutput[i].consumed, origColor, consumedAmount) if amountToConsume == 0 { @@ -213,30 +221,30 @@ func (vtxb *vtxBuilder) addToOutputs(targetAddr address.Address, col balance.Col } // MoveTokens move token without changing color -func (vtxb *vtxBuilder) MoveTokens(targetAddr address.Address, col balance.Color, amount int64) error { - if vtxb.GetInputBalance(col) < amount { +func (vtxb *vtxBuilder) MoveTokens(targetAddr address.Address, col balance.Color, amount int64, filterTxid ...valuetransaction.ID) error { + if vtxb.GetInputBalance(col, filterTxid...) < amount { return errorNotEnoughBalance } - vtxb.moveAmount(targetAddr, col, col, amount) + vtxb.moveAmount(targetAddr, col, col, amount, filterTxid...) return nil } -func (vtxb *vtxBuilder) EraseColor(targetAddr address.Address, col balance.Color, amount int64) error { - actualBalance := vtxb.GetInputBalance(col) +func (vtxb *vtxBuilder) EraseColor(targetAddr address.Address, col balance.Color, amount int64, filterTxid ...valuetransaction.ID) error { + actualBalance := vtxb.GetInputBalance(col, filterTxid...) if actualBalance < amount { return fmt.Errorf("EraseColor: not enough balance: need %d, found %d, color %s", amount, actualBalance, col.String()) } - vtxb.moveAmount(targetAddr, col, balance.ColorIOTA, amount) + vtxb.moveAmount(targetAddr, col, balance.ColorIOTA, amount, filterTxid...) return nil } // MintColor creates output of NewColor tokens out of inputs with specified color -func (vtxb *vtxBuilder) MintColor(targetAddr address.Address, sourceColor balance.Color, amount int64) error { - if vtxb.GetInputBalance(sourceColor) < amount { +func (vtxb *vtxBuilder) MintColor(targetAddr address.Address, sourceColor balance.Color, amount int64, filterTxid ...valuetransaction.ID) error { + if vtxb.GetInputBalance(sourceColor, filterTxid...) < amount { return errorNotEnoughBalance } - vtxb.moveAmount(targetAddr, sourceColor, balance.ColorNew, amount) + vtxb.moveAmount(targetAddr, sourceColor, balance.ColorNew, amount, filterTxid...) return nil } diff --git a/packages/vm/vmcontext/general.go b/packages/vm/vmcontext/general.go index 2f37f70fc7..25a04c70e4 100644 --- a/packages/vm/vmcontext/general.go +++ b/packages/vm/vmcontext/general.go @@ -59,7 +59,7 @@ func (vmctx *VMContext) Entropy() hashing.HashValue { // PostRequest creates a request section in the transaction with specified parameters // The transfer not include 1 iota for the request token but includes node fee, if eny func (vmctx *VMContext) PostRequest(par coretypes.PostRequestParams) bool { - vmctx.log.Debugw("-- PostRequest", + vmctx.log.Debugw("-- PostRequestSync", "target", par.TargetContractID.String(), "ep", par.EntryPoint.String(), "transfer", cbalances.Str(par.Transfer), @@ -68,11 +68,11 @@ func (vmctx *VMContext) PostRequest(par coretypes.PostRequestParams) bool { if !vmctx.debitFromAccount(myAgentID, cbalances.NewFromMap(map[balance.Color]int64{ balance.ColorIOTA: 1, })) { - vmctx.log.Debugf("-- PostRequest: not enough funds for request token") + vmctx.log.Debugf("-- PostRequestSync: not enough funds for request token") return false } if !vmctx.debitFromAccount(myAgentID, par.Transfer) { - vmctx.log.Debugf("-- PostRequest: not enough funds") + vmctx.log.Debugf("-- PostRequestSync: not enough funds") return false } reqParams := requestargs.New(nil) @@ -110,3 +110,7 @@ func (vmctx *VMContext) EventPublisher() vm.ContractEventPublisher { func (vmctx *VMContext) RequestID() coretypes.RequestID { return *vmctx.reqRef.RequestID() } + +func (vmctx *VMContext) NumFreeMinted() int64 { + return vmctx.reqRef.Tx.MustProperties().NumFreeMintedTokens() +} diff --git a/tools/cluster/tests/inccounter_solo_test.go b/tools/cluster/tests/inccounter_solo_test.go index 9b5db5ce4e..2e1d7fa9f5 100644 --- a/tools/cluster/tests/inccounter_solo_test.go +++ b/tools/cluster/tests/inccounter_solo_test.go @@ -26,7 +26,7 @@ func TestIncSoloInc(t *testing.T) { require.NoError(t, err) req := solo.NewCallParams(incName, "increment"). WithTransfer(balance.ColorIOTA, 1) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) ret, err := chain.CallView(incName, "getCounter") require.NoError(t, err) @@ -42,7 +42,7 @@ func TestIncSoloRepeatMany(t *testing.T) { require.NoError(t, err) req := solo.NewCallParams(incName, "repeatMany", varNumRepeats, 2). WithTransfer(balance.ColorIOTA, 1) - _, err = chain.PostRequest(req, nil) + _, err = chain.PostRequestSync(req, nil) require.NoError(t, err) chain.WaitForEmptyBacklog() ret, err := chain.CallView(incName, "getCounter") From c4d599bb692fcf058fd4f5b63efaf9a13c0ee4ba Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sun, 21 Feb 2021 09:35:51 +0200 Subject: [PATCH 18/39] concurency tests --- packages/solo/clock.go | 20 +++---- packages/solo/run.go | 2 +- packages/solo/solo.go | 2 + .../core/testcore/sbtests/concurrency_test.go | 58 +++++++++++++++++-- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/packages/solo/clock.go b/packages/solo/clock.go index 61253ce429..688c4bae71 100644 --- a/packages/solo/clock.go +++ b/packages/solo/clock.go @@ -7,15 +7,15 @@ import "time" // LogicalTime return current logical clock time on the 'solo' instance func (env *Solo) LogicalTime() time.Time { - env.glbMutex.Lock() - defer env.glbMutex.Unlock() + env.clockMutex.RLock() + defer env.clockMutex.RUnlock() return env.logicalTime } // AdvanceClockTo advances logical clock to the specific time moment in the (logical) future func (env *Solo) AdvanceClockTo(ts time.Time) { - env.glbMutex.Lock() - defer env.glbMutex.Unlock() + env.clockMutex.Lock() + defer env.clockMutex.Unlock() env.advanceClockTo(ts) } @@ -28,8 +28,8 @@ func (env *Solo) advanceClockTo(ts time.Time) { // AdvanceClockBy advances logical clock by time step func (env *Solo) AdvanceClockBy(step time.Duration) { - env.glbMutex.Lock() - defer env.glbMutex.Unlock() + env.clockMutex.Lock() + defer env.clockMutex.Unlock() env.advanceClockTo(env.logicalTime.Add(step)) env.logger.Infof("AdvanceClockBy: logical clock advanced by %v", step) @@ -37,8 +37,8 @@ func (env *Solo) AdvanceClockBy(step time.Duration) { // ClockStep advances logical clock by time step set by SetTimeStep func (env *Solo) ClockStep() { - env.glbMutex.Lock() - defer env.glbMutex.Unlock() + env.clockMutex.Lock() + defer env.clockMutex.Unlock() env.advanceClockTo(env.logicalTime.Add(env.timeStep)) env.logger.Infof("ClockStep: logical clock advanced by %v", env.timeStep) @@ -46,7 +46,7 @@ func (env *Solo) ClockStep() { // SetTimeStep sets default time step for the 'solo' instance func (env *Solo) SetTimeStep(step time.Duration) { - env.glbMutex.Lock() - defer env.glbMutex.Unlock() + env.clockMutex.Lock() + defer env.clockMutex.Unlock() env.timeStep = step } diff --git a/packages/solo/run.go b/packages/solo/run.go index 97548611ed..4ca64061ca 100644 --- a/packages/solo/run.go +++ b/packages/solo/run.go @@ -97,8 +97,8 @@ func (ch *Chain) settleStateTransition(newState state.VirtualState, block state. prevBlockIndex, ch.State.BlockIndex(), len(block.RequestIDs()), len(ch.StateTx.Requests())) ch.Log.Debugf("Batch processed: %s", batchShortStr(block.RequestIDs())) - ch.Env.ClockStep() ch.Env.EnqueueRequests(ch.StateTx) + ch.Env.ClockStep() } func batchShortStr(reqIds []*coretypes.RequestID) string { diff --git a/packages/solo/solo.go b/packages/solo/solo.go index 9017b9e34b..24f535f325 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -48,6 +48,7 @@ type Solo struct { registry coretypes.BlobCacheFull glbMutex *sync.RWMutex ledgerMutex *sync.RWMutex + clockMutex *sync.RWMutex logicalTime time.Time timeStep time.Duration chains map[coretypes.ChainID]*Chain @@ -137,6 +138,7 @@ func New(t *testing.T, debug bool, printStackTrace bool) *Solo { utxoDB: utxodb.New(), registry: reg, glbMutex: &sync.RWMutex{}, + clockMutex: &sync.RWMutex{}, ledgerMutex: &sync.RWMutex{}, logicalTime: time.Now(), timeStep: DefaultTimeStep, diff --git a/packages/vm/core/testcore/sbtests/concurrency_test.go b/packages/vm/core/testcore/sbtests/concurrency_test.go index ed985e641c..cb594b3a2f 100644 --- a/packages/vm/core/testcore/sbtests/concurrency_test.go +++ b/packages/vm/core/testcore/sbtests/concurrency_test.go @@ -1,11 +1,13 @@ package sbtests import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" + "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/kv/kvdecoder" "github.com/iotaledger/wasp/packages/solo" "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" - "runtime" "testing" "time" ) @@ -37,7 +39,7 @@ func testConcurrency(t *testing.T, w bool) { req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncIncCounter) - repeats := []int{100, 100, 100, 100, 100, 100, 100, 100, 100, 100} + repeats := []int{300, 100, 100, 100, 100, 100, 100, 100, 100, 100} sum := 0 for _, i := range repeats { sum += i @@ -48,10 +50,10 @@ func testConcurrency(t *testing.T, w bool) { tx := chain.RequestFromParamsToLedger(req, nil) chain.Env.EnqueueRequests(tx) } - var m runtime.MemStats - runtime.ReadMemStats(&m) - t.Logf("++++++++++++++ #%d -- alloc: %d MB, total: %d MB GC: %d", - r, m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.NumGC) + //var m runtime.MemStats + //runtime.ReadMemStats(&m) + //t.Logf("++++++++++++++ #%d -- alloc: %d MB, total: %d MB GC: %d", + // r, m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.NumGC) }(r, n) } time.Sleep(1 * time.Second) @@ -63,4 +65,48 @@ func testConcurrency(t *testing.T, w bool) { deco := kvdecoder.New(ret, chain.Log) res := deco.MustGetInt64(sbtestsc.VarCounter) require.EqualValues(t, sum, res) + + extraIota := 0 + if w { + extraIota = 1 + } + chain.AssertAccountBalance(chain.OriginatorAgentID, balance.ColorIOTA, int64(sum+3+extraIota)) +} + +func TestConcurrency2(t *testing.T) { run2(t, testConcurrency2) } +func testConcurrency2(t *testing.T, w bool) { + //t.SkipNow() + _, chain := setupChain(t, nil) + setupTestSandboxSC(t, chain, nil, w) + + req := solo.NewCallParams(SandboxSCName, sbtestsc.FuncIncCounter) + + repeats := []int{300, 100, 100, 100, 100, 100, 100, 100, 100, 100} + users := make([]signaturescheme.SignatureScheme, len(repeats)) + sum := 0 + for _, i := range repeats { + sum += i + } + for r, n := range repeats { + go func(r, n int) { + users[r] = chain.Env.NewSignatureSchemeWithFunds() + for i := 0; i < n; i++ { + tx := chain.RequestFromParamsToLedger(req, users[r]) + chain.Env.EnqueueRequests(tx) + } + }(r, n) + } + time.Sleep(1 * time.Second) + chain.WaitForEmptyBacklog(10 * time.Second) + + ret, err := chain.CallView(SandboxSCName, sbtestsc.FuncGetCounter) + require.NoError(t, err) + + deco := kvdecoder.New(ret, chain.Log) + res := deco.MustGetInt64(sbtestsc.VarCounter) + require.EqualValues(t, sum, res) + + for i := range users { + chain.AssertAccountBalance(coretypes.NewAgentIDFromAddress(users[i].Address()), balance.ColorIOTA, int64(repeats[i])) + } } From a036c11727f7dd3c8f06a302d1473deeac76360c Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sun, 21 Feb 2021 12:52:55 +0200 Subject: [PATCH 19/39] support for "MintedSupply" in apilib, sandbox and Solo --- contracts/rust/testcore/src/consts.rs | 2 + contracts/rust/testcore/src/lib.rs | 1 + contracts/rust/testcore/src/testcore.rs | 11 ++ packages/apilib/request.go | 3 +- packages/coretypes/sandbox.go | 2 +- .../sctransaction/txbuilder/sctxbuilder.go | 42 +++++++- packages/sctransaction/txbuilder/txb_test.go | 102 ++++++++++++++++++ packages/sctransaction/validate.go | 83 -------------- packages/solo/req.go | 26 ++++- packages/solo/solo.go | 2 +- packages/solo/solofun.go | 2 +- packages/txutil/vtxbuilder/newcolor.go | 2 +- packages/txutil/vtxbuilder/vtxb_test.go | 2 +- packages/txutil/vtxbuilder/vtxbuilder.go | 4 +- .../core/testcore/sbtests/check_ctx_test.go | 32 ++++++ .../testcore/sbtests/sbtestsc/impl_mint.go | 13 +++ .../testcore/sbtests/sbtestsc/interface.go | 4 +- .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47497 -> 47708 bytes 18 files changed, 238 insertions(+), 95 deletions(-) delete mode 100644 packages/sctransaction/validate.go create mode 100644 packages/vm/core/testcore/sbtests/sbtestsc/impl_mint.go diff --git a/contracts/rust/testcore/src/consts.rs b/contracts/rust/testcore/src/consts.rs index 023cced7e0..5b4c8ae4e9 100644 --- a/contracts/rust/testcore/src/consts.rs +++ b/contracts/rust/testcore/src/consts.rs @@ -17,6 +17,7 @@ pub const PARAM_CHAIN_OWNER_ID: &str = "chainOwnerID"; pub const PARAM_CONTRACT_CREATOR: &str = "contractCreator"; pub const PARAM_CONTRACT_ID: &str = "contractID"; pub const PARAM_COUNTER: &str = "counter"; +pub const PARAM_MINTED_SUPPLY: &str = "mintedSupply"; pub const PARAM_HASH: &str = "Hash"; pub const PARAM_HNAME: &str = "Hname"; pub const PARAM_HNAME_CONTRACT: &str = "hnameContract"; @@ -40,6 +41,7 @@ pub const FUNC_PASS_TYPES_FULL: &str = "passTypesFull"; pub const FUNC_RUN_RECURSION: &str = "runRecursion"; pub const FUNC_SEND_TO_ADDRESS: &str = "sendToAddress"; pub const FUNC_SET_INT: &str = "setInt"; +pub const FUNC_GET_MINTED_SUPPLY: &str = "getMintedSupply"; pub const FUNC_TEST_CALL_PANIC_FULL_EP: &str = "testCallPanicFullEP"; pub const FUNC_TEST_CALL_PANIC_VIEW_EPFROM_FULL: &str = "testCallPanicViewEPFromFull"; pub const FUNC_TEST_CHAIN_OWNER_IDFULL: &str = "testChainOwnerIDFull"; diff --git a/contracts/rust/testcore/src/lib.rs b/contracts/rust/testcore/src/lib.rs index 9cf73bbfde..1f3fa009fe 100644 --- a/contracts/rust/testcore/src/lib.rs +++ b/contracts/rust/testcore/src/lib.rs @@ -19,6 +19,7 @@ fn on_load() { exports.add_func(FUNC_RUN_RECURSION, func_run_recursion); exports.add_func(FUNC_SEND_TO_ADDRESS, func_send_to_address); exports.add_func(FUNC_SET_INT, func_set_int); + exports.add_func(FUNC_GET_MINTED_SUPPLY, func_get_minted_supply); exports.add_func(FUNC_TEST_CALL_PANIC_FULL_EP, func_test_call_panic_full_ep); exports.add_func(FUNC_TEST_CALL_PANIC_VIEW_EPFROM_FULL, func_test_call_panic_view_epfrom_full); exports.add_func(FUNC_TEST_CHAIN_OWNER_IDFULL, func_test_chain_owner_idfull); diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index 989d0370a0..acac5d3f07 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -158,6 +158,17 @@ pub fn func_set_int(ctx: &ScFuncContext) { ctx.log("testcore.setInt ok"); } +pub fn func_get_minted_supply(ctx: &ScFuncContext) { + ctx.log("testcore.getMintedSupply"); + + // TODO implement sandbox call + // ctx.get_minted_supply() -> i64 + + let minted_supply = 42; // dummy + ctx.results().get_int(PARAM_MINTED_SUPPLY).set_value(minted_supply); + ctx.log("testcore.setInt ok"); +} + pub fn func_test_call_panic_full_ep(ctx: &ScFuncContext) { ctx.log("testcore.testCallPanicFullEP"); ctx.call_self(HFUNC_TEST_PANIC_FULL_EP, None, None); diff --git a/packages/apilib/request.go b/packages/apilib/request.go index 4ad8a6bb4a..93b43f69c2 100644 --- a/packages/apilib/request.go +++ b/packages/apilib/request.go @@ -57,8 +57,9 @@ func CreateRequestTransaction(par CreateRequestTransactionParams) (*sctransactio return nil, err } } + txb.AddMinting(par.Mint) //for addr, amount := range par.Mint{ - // txb.MintColor + // txb.MintColoredTokens //} tx, err := txb.Build(false) diff --git a/packages/coretypes/sandbox.go b/packages/coretypes/sandbox.go index b493c52276..cec98efa25 100644 --- a/packages/coretypes/sandbox.go +++ b/packages/coretypes/sandbox.go @@ -35,7 +35,7 @@ type Sandbox interface { // RequestID of the request in the context of which is the current call RequestID() RequestID // MintedSupply is number of free minted tokens, i.e. minted tokens which are sent to addresses - // other than chain address. It is a prove of how many tokens has been minted with the + // other than chain address. It is a proof of how many tokens has been minted with the // color of the transaction (after un-coloring all request tokens) // It may be used in use-cases such as Token Registry. // The color of the supply can be extracted from the RequestID diff --git a/packages/sctransaction/txbuilder/sctxbuilder.go b/packages/sctransaction/txbuilder/sctxbuilder.go index f357749e2d..118ae9e13b 100644 --- a/packages/sctransaction/txbuilder/sctxbuilder.go +++ b/packages/sctransaction/txbuilder/sctxbuilder.go @@ -16,6 +16,7 @@ type Builder struct { *vtxbuilder.Builder stateBlock *sctransaction.StateSection requestBlocks []*sctransaction.RequestSection + mint map[address.Address]int64 } var ( @@ -30,6 +31,7 @@ func NewFromOutputBalances(outputBalances map[valuetransaction.OutputID][]*balan return &Builder{ Builder: vtxb, requestBlocks: make([]*sctransaction.RequestSection, 0), + mint: make(map[address.Address]int64), }, nil } @@ -38,10 +40,14 @@ func (txb *Builder) Clone() *Builder { Builder: txb.Builder.Clone(), stateBlock: txb.stateBlock.Clone(), requestBlocks: make([]*sctransaction.RequestSection, len(txb.requestBlocks)), + mint: make(map[address.Address]int64), } for i := range ret.requestBlocks { ret.requestBlocks[i] = txb.requestBlocks[i].Clone() } + for addr, amount := range txb.mint { + ret.mint[addr] = amount + } return ret } @@ -53,7 +59,7 @@ func (txb *Builder) CreateOriginStateSection(stateHash hashing.HashValue, origin if txb.stateBlock != nil { return errors.New("can't set state block twice") } - if err := txb.MintColor(*originAddress, balance.ColorIOTA, 1); err != nil { + if err := txb.MintColoredTokens(*originAddress, balance.ColorIOTA, 1); err != nil { return err } txb.stateBlock = sctransaction.NewStateSection(sctransaction.NewStateSectionParams{ @@ -77,7 +83,7 @@ func (txb *Builder) SetStateParams(stateIndex uint32, stateHash hashing.HashValu // token and adds respective outputs for the colored transfers func (txb *Builder) AddRequestSection(req *sctransaction.RequestSection) error { targetAddr := (address.Address)(req.Target().ChainID()) - if err := txb.MintColor(targetAddr, balance.ColorIOTA, 1); err != nil { + if err := txb.MintColoredTokens(targetAddr, balance.ColorIOTA, 1); err != nil { return err } var err error @@ -94,7 +100,39 @@ func (txb *Builder) AddRequestSection(req *sctransaction.RequestSection) error { return nil } +// AddMinting adds amounts to be minted from iotas to respective addresses +func (txb *Builder) AddMinting(mint map[address.Address]int64) { + for addr, amount := range mint { + if amount <= 0 { + continue + } + a, _ := txb.mint[addr] + txb.mint[addr] = a + amount + } +} + +func (txb *Builder) mintNewTokens() error { + for addr, amount := range txb.mint { + if amount <= 0 { + panic("mintNewTokens: internal error") + } + for _, reqBlk := range txb.requestBlocks { + targetAddr := address.Address(reqBlk.Target().ChainID()) + if addr == targetAddr { + return fmt.Errorf("mintNewTokens: new tokens cannot be minted to the request's target address") + } + } + if err := txb.Builder.MintColoredTokens(addr, balance.ColorIOTA, amount); err != nil { + return fmt.Errorf("mintNewTokens: %v", err) + } + } + return nil +} + func (txb *Builder) Build(useAllInputs bool) (*sctransaction.Transaction, error) { + if err := txb.mintNewTokens(); err != nil { + return nil, err + } return sctransaction.NewTransaction( txb.Builder.Build(useAllInputs), txb.stateBlock, diff --git a/packages/sctransaction/txbuilder/txb_test.go b/packages/sctransaction/txbuilder/txb_test.go index 777dcdc30e..57c2ffd83c 100644 --- a/packages/sctransaction/txbuilder/txb_test.go +++ b/packages/sctransaction/txbuilder/txb_test.go @@ -1,6 +1,10 @@ package txbuilder import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/goshimmer/dapps/waspconn/packages/waspconn" + "github.com/iotaledger/hive.go/crypto/ed25519" + "github.com/stretchr/testify/require" "testing" "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address/signaturescheme" @@ -84,6 +88,104 @@ func TestWithRequest(t *testing.T) { assert.Equal(t, int64(2), sum) } +func TestRequestSimple(t *testing.T) { + u := utxodb.New() + chainSigScheme := signaturescheme.RandBLS() + wallet := signaturescheme.ED25519(ed25519.GenerateKeyPair()) + _, err := u.RequestFunds(wallet.Address()) + assert.NoError(t, err) + + outs := u.GetAddressOutputs(wallet.Address()) + txb, err := NewFromOutputBalances(outs) + assert.NoError(t, err) + + err = txb.AddRequestSection(sctransaction.NewRequestSection(0, coretypes.NewContractID(coretypes.ChainID(chainSigScheme.Address()), 0), 1)) + assert.NoError(t, err) + + tx, err := txb.Build(false) + assert.NoError(t, err) + + tx.Sign(wallet) + assert.True(t, tx.SignaturesValid()) + + err = u.AddTransaction(tx.Transaction) + assert.NoError(t, err) + + outs = u.GetAddressOutputs(wallet.Address()) + bals, _ := waspconn.OutputBalancesByColor(outs) + require.NotPanics(t, func() { + require.EqualValues(t, utxodb.RequestFundsAmount-1, bals[balance.ColorIOTA]) + }) + + outs = u.GetAddressOutputs(chainSigScheme.Address()) + bals, _ = waspconn.OutputBalancesByColor(outs) + require.NotPanics(t, func() { + require.EqualValues(t, 1, bals[balance.Color(tx.ID())]) + }) +} + +func TestMintOk(t *testing.T) { + u := utxodb.New() + chainSigScheme := signaturescheme.RandBLS() + wallet := signaturescheme.ED25519(ed25519.GenerateKeyPair()) + _, err := u.RequestFunds(wallet.Address()) + assert.NoError(t, err) + + outs := u.GetAddressOutputs(wallet.Address()) + txb, err := NewFromOutputBalances(outs) + assert.NoError(t, err) + + err = txb.AddRequestSection(sctransaction.NewRequestSection(0, coretypes.NewContractID(coretypes.ChainID(chainSigScheme.Address()), 0), 1)) + assert.NoError(t, err) + + txb.AddMinting(map[address.Address]int64{ + wallet.Address(): 5, + }) + + tx, err := txb.Build(false) + assert.NoError(t, err) + + tx.Sign(wallet) + assert.True(t, tx.SignaturesValid()) + + err = u.AddTransaction(tx.Transaction) + assert.NoError(t, err) + + outs = u.GetAddressOutputs(wallet.Address()) + bals, _ := waspconn.OutputBalancesByColor(outs) + require.NotPanics(t, func() { + require.EqualValues(t, utxodb.RequestFundsAmount-1-5, bals[balance.ColorIOTA]) + require.EqualValues(t, 5, bals[balance.Color(tx.ID())]) + }) + + outs = u.GetAddressOutputs(chainSigScheme.Address()) + bals, _ = waspconn.OutputBalancesByColor(outs) + require.NotPanics(t, func() { + require.EqualValues(t, 1, bals[balance.Color(tx.ID())]) + }) +} + +func TestMintFail(t *testing.T) { + u := utxodb.New() + chainSigScheme := signaturescheme.RandBLS() + wallet := signaturescheme.ED25519(ed25519.GenerateKeyPair()) + _, err := u.RequestFunds(wallet.Address()) + assert.NoError(t, err) + + outs := u.GetAddressOutputs(wallet.Address()) + txb, err := NewFromOutputBalances(outs) + assert.NoError(t, err) + + err = txb.AddRequestSection(sctransaction.NewRequestSection(0, coretypes.NewContractID(coretypes.ChainID(chainSigScheme.Address()), 0), 1)) + assert.NoError(t, err) + + txb.AddMinting(map[address.Address]int64{ + chainSigScheme.Address(): 5, + }) + _, err = txb.Build(false) + assert.Error(t, err) +} + func TestNextState(t *testing.T) { u := utxodb.New() ownerSigSheme := signaturescheme.RandBLS() diff --git a/packages/sctransaction/validate.go b/packages/sctransaction/validate.go deleted file mode 100644 index 58c5cd0ddc..0000000000 --- a/packages/sctransaction/validate.go +++ /dev/null @@ -1,83 +0,0 @@ -package sctransaction - -import ( - "errors" - "fmt" - "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" - "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" - "github.com/iotaledger/wasp/packages/coretypes" - "github.com/iotaledger/wasp/packages/txutil" -) - -// validates state block and requests and returns if it origin state (if not error) -// address is address of the SC -func (tx *Transaction) ValidateBlocks(addr *address.Address) (bool, error) { - isOrigin, err := tx.validateStateBlock(addr) - if err != nil { - return false, err - } - return isOrigin, tx.validateRequests(isOrigin) -} - -// check correctness of the SC token -func (tx *Transaction) validateStateBlock(addr *address.Address) (bool, error) { - stateBlock, hasState := tx.State() - if !hasState { - return false, nil - } - - color := stateBlock.Color() - mayBeOrigin := color == balance.ColorNew - - balances, hasAddress := tx.OutputBalancesByAddress(*addr) - if !hasAddress { - // invalid state - return false, fmt.Errorf("invalid state block: SC state output not found") - } - outBalance := txutil.BalanceOfColor(balances, color) - expectedOutputBalance := int64(1) - if mayBeOrigin { - expectedOutputBalance += int64(len(tx.Requests())) - } - // expected 1 SC token if tx is not origin or 1 + number of request if color is MintColor (origin) - if outBalance != expectedOutputBalance { - return false, fmt.Errorf("non-existent or wrong output with SC token") - } - if mayBeOrigin && stateBlock.BlockIndex() != 0 { - return false, fmt.Errorf("origin transaction must have state index 0") - } - return mayBeOrigin, nil -} - -// check correctness of the request tokens -func (tx *Transaction) validateRequests(isOrigin bool) error { - newByTargetChain := make(map[coretypes.ChainID]int64) - tx.Outputs().ForEach(func(addr address.Address, bals []*balance.Balance) bool { - s := txutil.BalanceOfColor(bals, balance.ColorNew) - if s != 0 { - newByTargetChain[(coretypes.ChainID)(addr)] = s - } - return true - }) - for _, reqBlock := range tx.Requests() { - s, ok := newByTargetChain[reqBlock.Target().ChainID()] - if !ok { - return errors.New("invalid request tokens") - } - newByTargetChain[reqBlock.Target().ChainID()] = s - 1 - } - sum := int64(0) - for _, s := range newByTargetChain { - sum += s - if s != 0 && s != 1 { - return errors.New("invalid tokens") - } - } - if isOrigin && sum == 1 { - return nil - } - if !isOrigin && sum == 0 { - return nil - } - return errors.New("invalid tokens") -} diff --git a/packages/solo/req.go b/packages/solo/req.go index 60b4c3fb7b..094ff9f1ea 100644 --- a/packages/solo/req.go +++ b/packages/solo/req.go @@ -5,6 +5,7 @@ package solo import ( "fmt" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" "github.com/iotaledger/wasp/packages/coretypes/requestargs" "github.com/iotaledger/wasp/packages/kv" "github.com/iotaledger/wasp/packages/vm" @@ -28,6 +29,7 @@ type CallParams struct { epName string entryPoint coretypes.Hname transfer coretypes.ColoredBalances + mint map[address.Address]int64 args requestargs.RequestArgs } @@ -86,6 +88,17 @@ func (r *CallParams) WithTransfers(transfer map[balance.Color]int64) *CallParams return r } +// WithMinting adds minting part to the request transaction +// in the map

: all addresses should be different from the +// address of the target chain and amounts must be positive +func (r *CallParams) WithMinting(mint map[address.Address]int64) *CallParams { + r.mint = make(map[address.Address]int64) + for addr, amount := range mint { + r.mint[addr] = amount + } + return r +} + // makes map without hashing func toMap(params ...interface{}) map[string]interface{} { par := make(map[string]interface{}) @@ -126,6 +139,8 @@ func (ch *Chain) RequestFromParamsToLedger(req *CallParams, sigScheme signatures err = txb.AddRequestSection(reqSect) require.NoError(ch.Env.T, err) + txb.AddMinting(req.mint) + tx, err := txb.Build(false) require.NoError(ch.Env.T, err) @@ -155,6 +170,11 @@ func (ch *Chain) RequestFromParamsToLedger(req *CallParams, sigScheme signatures // It makes it possible step-by-step debug of the smart contract logic. // The call should be used only from the main thread (goroutine) func (ch *Chain) PostRequestSync(req *CallParams, sigScheme signaturescheme.SignatureScheme) (dict.Dict, error) { + _, ret, err := ch.PostRequestSyncTx(req, sigScheme) + return ret, err +} + +func (ch *Chain) PostRequestSyncTx(req *CallParams, sigScheme signaturescheme.SignatureScheme) (*sctransaction.Transaction, dict.Dict, error) { tx := ch.RequestFromParamsToLedger(req, sigScheme) reqID := coretypes.NewRequestID(tx.ID(), 0) @@ -162,7 +182,11 @@ func (ch *Chain) PostRequestSync(req *CallParams, sigScheme signaturescheme.Sign r := vm.RequestRefWithFreeTokens{} r.Tx = tx - return ch.runBatch([]vm.RequestRefWithFreeTokens{r}, "post") + ret, err := ch.runBatch([]vm.RequestRefWithFreeTokens{r}, "post") + if err != nil { + return nil, nil, err + } + return tx, ret, nil } // callViewFull calls the view entry point of the smart contract diff --git a/packages/solo/solo.go b/packages/solo/solo.go index 24f535f325..c9f7dc7a80 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -37,7 +37,7 @@ const DefaultTimeStep = 1 * time.Millisecond // Saldo is the default amount of tokens returned by the UTXODB faucet // which is therefore the amount returned by NewSignatureSchemeWithFunds() and such -const Saldo = 1337 +const Saldo = int64(1337) // Solo is a structure which contains global parameters of the test: one per test instance type Solo struct { diff --git a/packages/solo/solofun.go b/packages/solo/solofun.go index fc958bcef4..5ae55aa26d 100644 --- a/packages/solo/solofun.go +++ b/packages/solo/solofun.go @@ -56,7 +56,7 @@ func (env *Solo) MintTokens(wallet signaturescheme.SignatureScheme, amount int64 txb, err := txbuilder.NewFromOutputBalances(allOuts) require.NoError(env.T, err) - if err = txb.MintColor(wallet.Address(), balance.ColorIOTA, amount); err != nil { + if err = txb.MintColoredTokens(wallet.Address(), balance.ColorIOTA, amount); err != nil { return balance.Color{}, err } tx := txb.BuildValueTransactionOnly(false) diff --git a/packages/txutil/vtxbuilder/newcolor.go b/packages/txutil/vtxbuilder/newcolor.go index 2716c63708..d6e3661bbd 100644 --- a/packages/txutil/vtxbuilder/newcolor.go +++ b/packages/txutil/vtxbuilder/newcolor.go @@ -22,7 +22,7 @@ func NewColoredTokensTransaction(client level1.Level1Client, sigScheme signature if err != nil { return nil, err } - if err := txb.MintColor(addr, balance.ColorIOTA, amount); err != nil { + if err := txb.MintColoredTokens(addr, balance.ColorIOTA, amount); err != nil { return nil, err } tx := txb.Build(false) diff --git a/packages/txutil/vtxbuilder/vtxb_test.go b/packages/txutil/vtxbuilder/vtxb_test.go index 4b1f2276d1..35c34c1778 100644 --- a/packages/txutil/vtxbuilder/vtxb_test.go +++ b/packages/txutil/vtxbuilder/vtxb_test.go @@ -48,7 +48,7 @@ func TestColor(t *testing.T) { txb, err := NewFromOutputBalances(outs) assert.NoError(t, err) - err = txb.MintColor(targetAddress, balance.ColorIOTA, 10) + err = txb.MintColoredTokens(targetAddress, balance.ColorIOTA, 10) assert.NoError(t, err) tx := txb.Build(false) diff --git a/packages/txutil/vtxbuilder/vtxbuilder.go b/packages/txutil/vtxbuilder/vtxbuilder.go index 9cce24e8f7..aad9a2c4e0 100644 --- a/packages/txutil/vtxbuilder/vtxbuilder.go +++ b/packages/txutil/vtxbuilder/vtxbuilder.go @@ -292,8 +292,8 @@ func (vtxb *Builder) EraseColor(targetAddr address.Address, col balance.Color, a return nil } -// MintColor creates output of NewColor tokens out of inputs with specified color -func (vtxb *Builder) MintColor(targetAddr address.Address, sourceColor balance.Color, amount int64) error { +// MintColoredTokens creates output of NewColor tokens out of inputs with specified color +func (vtxb *Builder) MintColoredTokens(targetAddr address.Address, sourceColor balance.Color, amount int64) error { if vtxb.finalized { panic("using finalized transaction builder") } diff --git a/packages/vm/core/testcore/sbtests/check_ctx_test.go b/packages/vm/core/testcore/sbtests/check_ctx_test.go index e57d6c0098..4417aebd59 100644 --- a/packages/vm/core/testcore/sbtests/check_ctx_test.go +++ b/packages/vm/core/testcore/sbtests/check_ctx_test.go @@ -1,7 +1,10 @@ package sbtests import ( + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/address" + "github.com/iotaledger/goshimmer/dapps/valuetransfers/packages/balance" "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/kv/codec" "github.com/iotaledger/wasp/packages/solo" "github.com/iotaledger/wasp/packages/vm/core/testcore/sbtests/sbtestsc" "github.com/stretchr/testify/require" @@ -55,3 +58,32 @@ func testMainCallsFromViewEP(t *testing.T, w bool) { ) require.NoError(t, err) } + +func TestMintedSupplyOk(t *testing.T) { run2(t, testMintedSupplyOk) } +func testMintedSupplyOk(t *testing.T, w bool) { + _, chain := setupChain(t, nil) + + user := setupDeployer(t, chain) + setupTestSandboxSC(t, chain, user, w) + + supply := int64(42) + req := solo.NewCallParams(sbtestsc.Interface.Name, sbtestsc.FuncGetMintedSupply).WithMinting( + map[address.Address]int64{ + user.Address(): supply, + }, + ) + tx, ret, err := chain.PostRequestSyncTx(req, user) + require.NoError(t, err) + + extraIota := int64(0) + if w { + extraIota = 1 + } + chain.Env.AssertAddressBalance(user.Address(), balance.ColorIOTA, solo.Saldo-3-extraIota-supply) + chain.Env.AssertAddressBalance(user.Address(), balance.Color(tx.ID()), supply) + + supplyBack, ok, err := codec.DecodeInt64(ret.MustGet(sbtestsc.VarMintedSupply)) + require.NoError(t, err) + require.True(t, ok) + require.EqualValues(t, supply, supplyBack) +} diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/impl_mint.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_mint.go new file mode 100644 index 0000000000..ac5c533c72 --- /dev/null +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_mint.go @@ -0,0 +1,13 @@ +package sbtestsc + +import ( + "github.com/iotaledger/wasp/packages/coretypes" + "github.com/iotaledger/wasp/packages/kv/codec" + "github.com/iotaledger/wasp/packages/kv/dict" +) + +func getMintedSupply(ctx coretypes.Sandbox) (dict.Dict, error) { + ret := dict.New() + ret.Set(VarMintedSupply, codec.EncodeInt64(ctx.MintedSupply())) + return ret, nil +} diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go index 327a76431a..0a64155aa6 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/interface.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/interface.go @@ -26,6 +26,7 @@ func init() { coreutil.Func(FuncChainOwnerIDFull, testChainOwnerIDFull), coreutil.ViewFunc(FuncContractIDView, testContractIDView), coreutil.Func(FuncContractIDFull, testContractIDFull), + coreutil.Func(FuncGetMintedSupply, getMintedSupply), coreutil.Func(FuncEventLogGenericData, testEventLogGenericData), coreutil.Func(FuncEventLogEventData, testEventLogEventData), @@ -75,6 +76,7 @@ const ( FuncSandboxCall = "testSandboxCall" FuncCheckContextFromFullEP = "checkContextFromFullEP" FuncCheckContextFromViewEP = "checkContextFromViewEP" + FuncGetMintedSupply = "getMintedSupply" FuncPanicFullEP = "testPanicFullEP" FuncPanicViewEP = "testPanicViewEP" @@ -101,10 +103,10 @@ const ( //Variables VarCounter = "counter" - VarChainOwner = "chainOwner" VarContractID = "contractID" VarSandboxCall = "sandboxCall" VarContractNameDeployed = "exampleDeployTR" + VarMintedSupply = "mintedSupply" // parameters ParamFail = "initFailParam" diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index 4280c6fba92f0c14518ad1b67bde6269bd4f6b81..3da090a3d9e9179166942e0acc1e3683b7e40932 100644 GIT binary patch delta 14670 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 bZ<<*WE&R{ delta 14494 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 O=EiB_3Gw@%t@>Z}BHqma From 569b75a41ed9dd9f9e687f0e24efd482b6aeba55 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sun, 21 Feb 2021 12:53:49 +0200 Subject: [PATCH 20/39] support for "MintedSupply" in apilib, sandbox and Solo --- contracts/rust/testcore/src/testcore.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index acac5d3f07..d7e8676fcf 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -164,7 +164,7 @@ pub fn func_get_minted_supply(ctx: &ScFuncContext) { // TODO implement sandbox call // ctx.get_minted_supply() -> i64 - let minted_supply = 42; // dummy + let minted_supply = 42; // dummy for the core test to pass ctx.results().get_int(PARAM_MINTED_SUPPLY).set_value(minted_supply); ctx.log("testcore.setInt ok"); } From 56e11a5f936d80d062260729e6f78d00b7cd7b12 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Sun, 21 Feb 2021 12:54:37 +0200 Subject: [PATCH 21/39] support for "MintedSupply" in apilib, sandbox and Solo --- contracts/rust/testcore/src/testcore.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index d7e8676fcf..34ca654de8 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -162,7 +162,7 @@ pub fn func_get_minted_supply(ctx: &ScFuncContext) { ctx.log("testcore.getMintedSupply"); // TODO implement sandbox call - // ctx.get_minted_supply() -> i64 + // ctx.minted_supply() -> i64 let minted_supply = 42; // dummy for the core test to pass ctx.results().get_int(PARAM_MINTED_SUPPLY).set_value(minted_supply); From 2132387b49333c92abb981b5800d6d44486a5624 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Sun, 21 Feb 2021 15:27:21 -0800 Subject: [PATCH 22/39] Changed usage of *hashing.HashValue to using hashing.HashValue --- client/chainclient/status.go | 2 +- client/chainclient/uploadblob.go | 2 +- contracts/native/ignore/fairroulette/impl.go | 7 +++---- packages/hashing/hash.go | 15 +-------------- packages/kv/codec/encodego.go | 4 ++-- packages/kv/codec/hashvalue.go | 11 +++++------ packages/kv/kvdecoder/decoder.go | 4 ++-- packages/registry/blobcache.go | 4 ++-- packages/solo/fun.go | 16 ++++------------ packages/vm/core/blob/impl.go | 2 +- packages/vm/core/blob/internal.go | 2 +- .../testcore/sbtests/sbtestsc/impl_check_ctx.go | 4 ++-- packages/vm/processors/processors.go | 10 +++++----- packages/vm/vmcontext/deploy.go | 2 +- packages/webapi/model/statequery/statequery.go | 2 +- tools/cluster/chain.go | 4 ++-- 16 files changed, 34 insertions(+), 57 deletions(-) diff --git a/client/chainclient/status.go b/client/chainclient/status.go index 37eb4cf096..ee76e687ae 100644 --- a/client/chainclient/status.go +++ b/client/chainclient/status.go @@ -60,7 +60,7 @@ func (c *Client) FetchSCStatus(addCustomQueries func(query *statequery.Request)) StateTxId: res.StateTxId.ID(), Requests: res.Requests, - ProgramHash: res.Get(vmconst.VarNameProgramData).MustHashValue(), + ProgramHash: &res.Get(vmconst.VarNameProgramData).MustHashValue(), Description: description, OwnerAddress: res.Get(vmconst.VarNameOwnerAddress).MustAddress(), MinimumReward: minReward, diff --git a/client/chainclient/uploadblob.go b/client/chainclient/uploadblob.go index b6cea8f047..46d754345a 100644 --- a/client/chainclient/uploadblob.go +++ b/client/chainclient/uploadblob.go @@ -33,7 +33,7 @@ func (c *Client) UploadBlob(fields dict.Dict, waspHosts []string, quorum int, op } nodesMultiApi := multiclient.New(waspHosts) if err := nodesMultiApi.UploadData(fieldValues, quorum); err != nil { - return hashing.HashValue{}, nil, err + return hashing.NilHash, nil, err } blobHash := blob.MustGetBlobHash(fields) diff --git a/contracts/native/ignore/fairroulette/impl.go b/contracts/native/ignore/fairroulette/impl.go index f1bd84b185..e543081571 100644 --- a/contracts/native/ignore/fairroulette/impl.go +++ b/contracts/native/ignore/fairroulette/impl.go @@ -156,8 +156,8 @@ func placeBet(ctx coretypes.Sandbox) error { if collections.NewArray(state, StateVarLockedBets).MustLen() > 0 { ok := state.MustHas(StateVarEntropyFromLocking) if !ok { - ehv := ctx.GetEntropy() - state.Set(StateVarEntropyFromLocking, codec.EncodeHashValue(&ehv)) + entropy := codec.EncodeHashValue(ctx.GetEntropy()) + state.Set(StateVarEntropyFromLocking, entropy) } } @@ -305,8 +305,7 @@ func playAndDistribute(ctx coretypes.Sandbox) error { // the current context entropy, ok, _ := codec.DecodeHashValue(state.MustGet(StateVarEntropyFromLocking)) if !ok { - h := ctx.GetEntropy() - entropy = &h + entropy = ctx.GetEntropy() } // 'playing the wheel' means taking first 8 bytes of the entropy as uint64 number and diff --git a/packages/hashing/hash.go b/packages/hashing/hash.go index 8a707b4e01..4fc9d3b821 100644 --- a/packages/hashing/hash.go +++ b/packages/hashing/hash.go @@ -19,20 +19,7 @@ const HashSize = 32 type HashValue [HashSize]byte -var ( - NilHash = HashValue{} - AllFHash = makeAllFHash() -) - -func init() { -} - -func makeAllFHash() (h HashValue) { - for i := range h { - h[i] = 0xFF - } - return -} +var NilHash = HashValue{} func (h HashValue) Bytes() []byte { return h[:] diff --git a/packages/kv/codec/encodego.go b/packages/kv/codec/encodego.go index f02fe8cb44..5811318868 100644 --- a/packages/kv/codec/encodego.go +++ b/packages/kv/codec/encodego.go @@ -32,9 +32,9 @@ func Encode(v interface{}) []byte { case []byte: return vt case *hashing.HashValue: - return EncodeHashValue(vt) + return EncodeHashValue(*vt) case hashing.HashValue: - return EncodeHashValue(&vt) + return EncodeHashValue(vt) case *address.Address: return EncodeAddress(*vt) case address.Address: diff --git a/packages/kv/codec/hashvalue.go b/packages/kv/codec/hashvalue.go index b343928281..c1870de639 100644 --- a/packages/kv/codec/hashvalue.go +++ b/packages/kv/codec/hashvalue.go @@ -4,15 +4,14 @@ import ( "github.com/iotaledger/wasp/packages/hashing" ) -// TODO return value not pointer -func DecodeHashValue(b []byte) (*hashing.HashValue, bool, error) { +func DecodeHashValue(b []byte) (hashing.HashValue, bool, error) { if b == nil { - return nil, false, nil + return hashing.NilHash, false, nil } - ret, err := hashing.HashValueFromBytes(b) - return &ret, err == nil, err + r, err := hashing.HashValueFromBytes(b) + return r, err == nil, err } -func EncodeHashValue(value *hashing.HashValue) []byte { +func EncodeHashValue(value hashing.HashValue) []byte { return value[:] } diff --git a/packages/kv/kvdecoder/decoder.go b/packages/kv/kvdecoder/decoder.go index 486f54897c..d0d4447cbe 100644 --- a/packages/kv/kvdecoder/decoder.go +++ b/packages/kv/kvdecoder/decoder.go @@ -101,10 +101,10 @@ func (p *decoder) GetHashValue(key kv.Key, def ...hashing.HashValue) (hashing.Ha return [32]byte{}, fmt.Errorf("GetHashValue: decoding parameter '%s': %v", key, err) } if exists { - return *v, nil + return v, nil } if len(def) == 0 { - return hashing.HashValue{}, fmt.Errorf("GetHashValue: mandatory parameter '%s' does not exist", key) + return hashing.NilHash, fmt.Errorf("GetHashValue: mandatory parameter '%s' does not exist", key) } return def[0], nil } diff --git a/packages/registry/blobcache.go b/packages/registry/blobcache.go index 2a9c8cb1c5..79834d7dd2 100644 --- a/packages/registry/blobcache.go +++ b/packages/registry/blobcache.go @@ -27,7 +27,7 @@ func (r *Impl) PutBlob(data []byte, ttl ...time.Duration) (hashing.HashValue, er h := hashing.HashData(data) err := r.dbProvider.GetRegistryPartition().Set(dbKeyForBlob(h), data) if err != nil { - return hashing.HashValue{}, err + return hashing.NilHash, err } nowis := time.Now() cleanAfter := nowis.Add(coretypes.DefaultTTL).UnixNano() @@ -37,7 +37,7 @@ func (r *Impl) PutBlob(data []byte, ttl ...time.Duration) (hashing.HashValue, er if cleanAfter > 0 { err = r.dbProvider.GetRegistryPartition().Set(dbKeyForBlobTTL(h), codec.EncodeInt64(cleanAfter)) if err != nil { - return hashing.HashValue{}, err + return hashing.NilHash, err } } r.log.Infof("data blob has been stored. size: %d bytes, hash: %s", len(data), h) diff --git a/packages/solo/fun.go b/packages/solo/fun.go index 99f25484c3..dc7dc55de1 100644 --- a/packages/solo/fun.go +++ b/packages/solo/fun.go @@ -105,15 +105,12 @@ func (ch *Chain) UploadBlob(sigScheme signaturescheme.SignatureScheme, params .. if totalFee > 0 { req.WithTransfer(balance.ColorIOTA, totalFee) } - var res dict.Dict - res, err = ch.PostRequest(req, sigScheme) + res, err := ch.PostRequest(req, sigScheme) if err != nil { return } resBin := res.MustGet(blob.ParamHash) - var r *hashing.HashValue - var ok bool - r, ok, err = codec.DecodeHashValue(resBin) + ret, ok, err := codec.DecodeHashValue(resBin) if err != nil { return } @@ -121,7 +118,6 @@ func (ch *Chain) UploadBlob(sigScheme signaturescheme.SignatureScheme, params .. err = fmt.Errorf("interbal error: no hash returned") return } - ret = *r require.EqualValues(ch.Env.T, expectedHash, ret) return } @@ -152,15 +148,12 @@ func (ch *Chain) UploadBlobOptimized(optimalSize int, sigScheme signaturescheme. if totalFee > 0 { req.WithTransfer(balance.ColorIOTA, totalFee) } - var res dict.Dict - res, err = ch.PostRequest(req, sigScheme) + res, err := ch.PostRequest(req, sigScheme) if err != nil { return } resBin := res.MustGet(blob.ParamHash) - var r *hashing.HashValue - var ok bool - r, ok, err = codec.DecodeHashValue(resBin) + ret, ok, err := codec.DecodeHashValue(resBin) if err != nil { return } @@ -168,7 +161,6 @@ func (ch *Chain) UploadBlobOptimized(optimalSize int, sigScheme signaturescheme. err = fmt.Errorf("internal error: no hash returned") return } - ret = *r require.EqualValues(ch.Env.T, expectedHash, ret) return } diff --git a/packages/vm/core/blob/impl.go b/packages/vm/core/blob/impl.go index f8c08f6c98..19247fc5fd 100644 --- a/packages/vm/core/blob/impl.go +++ b/packages/vm/core/blob/impl.go @@ -48,7 +48,7 @@ func storeBlob(ctx coretypes.Sandbox) (dict.Dict, error) { } ret := dict.New() - ret.Set(ParamHash, codec.EncodeHashValue(&blobHash)) + ret.Set(ParamHash, codec.EncodeHashValue(blobHash)) directory.MustSetAt(blobHash[:], EncodeSize(totalSize)) diff --git a/packages/vm/core/blob/internal.go b/packages/vm/core/blob/internal.go index 1c9f7fb39f..7ae83ad269 100644 --- a/packages/vm/core/blob/internal.go +++ b/packages/vm/core/blob/internal.go @@ -115,7 +115,7 @@ func DecodeDirectory(blobs dict.Dict) (map[hashing.HashValue]uint32, error) { if err != nil { return nil, err } - ret[*h] = uint32(v) + ret[h] = v } return ret, nil } diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go index 4f2b079622..40d0fbcd9d 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl_check_ctx.go @@ -59,7 +59,7 @@ func passTypesFull(ctx coretypes.Sandbox) (dict.Dict, error) { hash, exists, err := codec.DecodeHashValue(ctx.Params().MustGet("Hash")) checkFull(ctx, exists, err) - if *hash != hashing.HashStrings("Hash") { + if hash != hashing.HashStrings("Hash") { ctx.Log().Panicf("wrong hash") } hname, exists, err := codec.DecodeHname(ctx.Params().MustGet("Hname")) @@ -104,7 +104,7 @@ func passTypesView(ctx coretypes.SandboxView) (dict.Dict, error) { } hash, exists, err := codec.DecodeHashValue(ctx.Params().MustGet("Hash")) checkView(ctx, exists, err) - if *hash != hashing.HashStrings("Hash") { + if hash != hashing.HashStrings("Hash") { ctx.Log().Panicf("wrong hash") } hname, exists, err := codec.DecodeHname(ctx.Params().MustGet("Hname")) diff --git a/packages/vm/processors/processors.go b/packages/vm/processors/processors.go index 59befa6342..48e8e6249f 100644 --- a/packages/vm/processors/processors.go +++ b/packages/vm/processors/processors.go @@ -42,7 +42,7 @@ func (cps *ProcessorCache) newProcessor(programHash hashing.HashValue, programCo var ok bool var err error - if cps.ExistsProcessor(&programHash) { + if cps.ExistsProcessor(programHash) { return nil } switch vmtype { @@ -67,8 +67,8 @@ func (cps *ProcessorCache) newProcessor(programHash hashing.HashValue, programCo return nil } -func (cps *ProcessorCache) ExistsProcessor(h *hashing.HashValue) bool { - _, ok := cps.processors[*h] +func (cps *ProcessorCache) ExistsProcessor(h hashing.HashValue) bool { + _, ok := cps.processors[h] return ok } @@ -97,8 +97,8 @@ func (cps *ProcessorCache) GetOrCreateProcessorByProgramHash(progHash hashing.Ha } // RemoveProcessor deletes processor from cache -func (cps *ProcessorCache) RemoveProcessor(h *hashing.HashValue) { +func (cps *ProcessorCache) RemoveProcessor(h hashing.HashValue) { cps.Lock() defer cps.Unlock() - delete(cps.processors, *h) + delete(cps.processors, h) } diff --git a/packages/vm/vmcontext/deploy.go b/packages/vm/vmcontext/deploy.go index 2857b02623..9db157439b 100644 --- a/packages/vm/vmcontext/deploy.go +++ b/packages/vm/vmcontext/deploy.go @@ -26,7 +26,7 @@ func (vmctx *VMContext) DeployContract(programHash hashing.HashValue, name strin // calling root contract from another contract to install contract // adding parameters specific to deployment par := initParams.Clone() - par.Set(root.ParamProgramHash, codec.EncodeHashValue(&programHash)) + par.Set(root.ParamProgramHash, codec.EncodeHashValue(programHash)) par.Set(root.ParamName, codec.EncodeString(name)) par.Set(root.ParamDescription, codec.EncodeString(description)) _, err = vmctx.Call(root.Interface.Hname(), coretypes.Hn(root.FuncDeployContract), par, nil) diff --git a/packages/webapi/model/statequery/statequery.go b/packages/webapi/model/statequery/statequery.go index 4363669912..b8e0ff71c3 100644 --- a/packages/webapi/model/statequery/statequery.go +++ b/packages/webapi/model/statequery/statequery.go @@ -219,7 +219,7 @@ func (r *QueryResult) MustAddress() address.Address { return v } -func (r *QueryResult) MustHashValue() *hashing.HashValue { +func (r *QueryResult) MustHashValue() hashing.HashValue { v, _, err := codec.DecodeHashValue(r.MustBytes()) if err != nil { panic(err) diff --git a/tools/cluster/chain.go b/tools/cluster/chain.go index 5e4e2e23a9..26172007cd 100644 --- a/tools/cluster/chain.go +++ b/tools/cluster/chain.go @@ -156,11 +156,11 @@ func (ch *Chain) DeployWasmContract(name string, description string, progBinary quorum := (2*len(ch.ApiHosts()))/3 + 1 programHash, tx, err := ch.OriginatorClient().UploadBlob(blobFieldValues, ch.ApiHosts(), quorum, 256) if err != nil { - return nil, hashing.HashValue{}, err + return nil, hashing.NilHash, err } err = ch.CommitteeMultiClient().WaitUntilAllRequestsProcessed(tx, 30*time.Second) if err != nil { - return nil, hashing.HashValue{}, err + return nil, hashing.NilHash, err } progBinaryBack, err := ch.GetBlobFieldValue(programHash, blob.VarFieldProgramBinary) From be650f12ca03a1f031bd647f9a1a121e44362037 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Mon, 22 Feb 2021 15:33:20 +0200 Subject: [PATCH 23/39] support for "MintedSupply" in apilib, sandbox and Solo --- packages/apilib/request.go | 3 --- packages/coretypes/sandbox.go | 2 +- packages/sctransaction/transaction.go | 4 ++-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/apilib/request.go b/packages/apilib/request.go index 93b43f69c2..888a9781c9 100644 --- a/packages/apilib/request.go +++ b/packages/apilib/request.go @@ -58,9 +58,6 @@ func CreateRequestTransaction(par CreateRequestTransactionParams) (*sctransactio } } txb.AddMinting(par.Mint) - //for addr, amount := range par.Mint{ - // txb.MintColoredTokens - //} tx, err := txb.Build(false) //dump := txb.Dump() diff --git a/packages/coretypes/sandbox.go b/packages/coretypes/sandbox.go index cec98efa25..12480b00ed 100644 --- a/packages/coretypes/sandbox.go +++ b/packages/coretypes/sandbox.go @@ -63,7 +63,7 @@ type Sandbox interface { Utils() Utils } -// PostRequestParams is parameters of the PostRequestSync call +// PostRequestParams is parameters of the PostRequest call type PostRequestParams struct { TargetContractID ContractID EntryPoint Hname diff --git a/packages/sctransaction/transaction.go b/packages/sctransaction/transaction.go index 5fd8c94ca7..d45bf69d95 100644 --- a/packages/sctransaction/transaction.go +++ b/packages/sctransaction/transaction.go @@ -23,7 +23,7 @@ type Transaction struct { *valuetransaction.Transaction stateSection *StateSection requestSection []*RequestSection - cachedProperties coretypes.SCTransactionProperties // cached cachedProperties. If nil, transaction is semantically validated and cachedProperties are calculated + cachedProperties coretypes.SCTransactionProperties } // function which analyzes the transaction and calculates properties of it @@ -62,7 +62,7 @@ func ParseValueTransaction(vtx *valuetransaction.Transaction) (*Transaction, err return ret, nil } -// Properties returns valid cachedProperties if sc transaction is semantically correct +// Properties returns valid properties if sc transaction is semantically correct func (tx *Transaction) Properties() (coretypes.SCTransactionProperties, error) { if tx.cachedProperties != nil { return tx.cachedProperties, nil From dbe97b964f64cb6bc381e2cb751bba9f8f77e81c Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Mon, 22 Feb 2021 16:53:53 +0200 Subject: [PATCH 24/39] support for "MintedSupply" in apilib, sandbox and Solo --- go.mod | 1 + go.sum | 1 + packages/chain/chain.go | 18 ++++++++++++++++-- packages/chain/chainimpl/interface.go | 2 +- .../sctransaction/properties/properties.go | 2 +- packages/sctransaction/transaction.go | 17 +++++++++++++++-- packages/solo/req.go | 18 +++++++++++++----- packages/solo/run.go | 1 + packages/solo/solo.go | 16 ++++++---------- 9 files changed, 55 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 699ae4925d..06f2ed5d27 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/prometheus/common v0.10.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.0 + github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a github.com/stretchr/testify v1.6.1 go.dedis.ch/kyber/v3 v3.0.13 go.nanomsg.org/mangos/v3 v3.0.1 diff --git a/go.sum b/go.sum index 33b856d219..1b5d7d8c40 100644 --- a/go.sum +++ b/go.sum @@ -920,6 +920,7 @@ github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a h1:AhmOdSHeswKHBjhsLs/7+1voOxT+LLrSk/Nxvk35fug= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/packages/chain/chain.go b/packages/chain/chain.go index 3c84b3115a..da4661243e 100644 --- a/packages/chain/chain.go +++ b/packages/chain/chain.go @@ -14,6 +14,7 @@ import ( "github.com/iotaledger/wasp/packages/registry" "github.com/iotaledger/wasp/packages/tcrypto" "github.com/iotaledger/wasp/packages/vm/processors" + "sync" ) type Chain interface { @@ -91,7 +92,7 @@ type Operator interface { IsRequestInBacklog(*coretypes.RequestID) bool } -var ConstructorNew func( +type chainConstructor func( chr *registry.ChainRecord, log *logger.Logger, netProvider peering.NetworkProvider, @@ -100,6 +101,19 @@ var ConstructorNew func( onActivation func(), ) Chain +var constructorNew chainConstructor +var constructorNewMutex sync.Mutex + +func RegisterChainConstructor(constr chainConstructor) { + constructorNewMutex.Lock() + defer constructorNewMutex.Unlock() + + if constructorNew != nil { + panic("RegisterChainConstructor: already registered") + } + constructorNew = constr +} + func New( chr *registry.ChainRecord, log *logger.Logger, @@ -108,5 +122,5 @@ func New( blobProvider coretypes.BlobCache, onActivation func(), ) Chain { - return ConstructorNew(chr, log, netProvider, dksProvider, blobProvider, onActivation) + return constructorNew(chr, log, netProvider, dksProvider, blobProvider, onActivation) } diff --git a/packages/chain/chainimpl/interface.go b/packages/chain/chainimpl/interface.go index c347f3647b..b84fbcaa1f 100644 --- a/packages/chain/chainimpl/interface.go +++ b/packages/chain/chainimpl/interface.go @@ -20,7 +20,7 @@ import ( ) func init() { - chain.ConstructorNew = newCommitteeObj + chain.RegisterChainConstructor(newCommitteeObj) } func (c *chainObj) IsOpenQueue() bool { diff --git a/packages/sctransaction/properties/properties.go b/packages/sctransaction/properties/properties.go index 346ffd7f71..fcd32574d2 100644 --- a/packages/sctransaction/properties/properties.go +++ b/packages/sctransaction/properties/properties.go @@ -53,7 +53,7 @@ type properties struct { } func init() { - sctransaction.NewProperties = calcProperties + sctransaction.RegisterSemanticAnalyzerConstructor(calcProperties) } // CalcProperties analyzes the transaction and returns its properties diff --git a/packages/sctransaction/transaction.go b/packages/sctransaction/transaction.go index d45bf69d95..9572f51cc1 100644 --- a/packages/sctransaction/transaction.go +++ b/packages/sctransaction/transaction.go @@ -15,6 +15,7 @@ import ( "github.com/iotaledger/wasp/packages/coretypes" "github.com/iotaledger/wasp/packages/util" "io" + "sync" ) // Smart contract transaction wraps value transaction @@ -27,7 +28,19 @@ type Transaction struct { } // function which analyzes the transaction and calculates properties of it -var NewProperties func(transaction *Transaction) (coretypes.SCTransactionProperties, error) +type constructorNew func(transaction *Transaction) (coretypes.SCTransactionProperties, error) + +var newProperties constructorNew +var newPropertiesMutex sync.Mutex + +func RegisterSemanticAnalyzerConstructor(constr constructorNew) { + newPropertiesMutex.Lock() + defer newPropertiesMutex.Unlock() + if newProperties != nil { + panic("RegisterSemanticAnalyzerConstructor: already registered") + } + newProperties = constr +} // creates new sc transaction. It is immutable, i.e. tx hash is stable func NewTransaction(vtx *valuetransaction.Transaction, stateBlock *StateSection, requestBlocks []*RequestSection) (*Transaction, error) { @@ -68,7 +81,7 @@ func (tx *Transaction) Properties() (coretypes.SCTransactionProperties, error) { return tx.cachedProperties, nil } var err error - tx.cachedProperties, err = NewProperties(tx) + tx.cachedProperties, err = newProperties(tx) return tx.cachedProperties, err } diff --git a/packages/solo/req.go b/packages/solo/req.go index 094ff9f1ea..c0a28c46f8 100644 --- a/packages/solo/req.go +++ b/packages/solo/req.go @@ -182,6 +182,7 @@ func (ch *Chain) PostRequestSyncTx(req *CallParams, sigScheme signaturescheme.Si r := vm.RequestRefWithFreeTokens{} r.Tx = tx + ch.reqCounter.Add(1) ret, err := ch.runBatch([]vm.RequestRefWithFreeTokens{r}, "post") if err != nil { return nil, nil, err @@ -239,16 +240,23 @@ func (ch *Chain) WaitForEmptyBacklog(maxWait ...time.Duration) { ch.Log.Infof("backlog length = %d", ch.backlogLen()) } counter++ + time.Sleep(200 * time.Millisecond) if ch.backlogLen() > 0 { - time.Sleep(200 * time.Millisecond) if time.Now().After(deadline) { ch.Log.Warnf("exit due to timeout of max wait for %v", maxw) - break + return } } else { - time.Sleep(10 * time.Millisecond) - if ch.backlogLen() == 0 { - break + emptyCounter := 0 + for i := 0; i < 5; i++ { + time.Sleep(100 * time.Millisecond) + if ch.backlogLen() != 0 { + break + } + emptyCounter++ + } + if emptyCounter >= 5 { + return } } } diff --git a/packages/solo/run.go b/packages/solo/run.go index 4ca64061ca..6d95aa6e85 100644 --- a/packages/solo/run.go +++ b/packages/solo/run.go @@ -60,6 +60,7 @@ func (ch *Chain) runBatch(batch []vm.RequestRefWithFreeTokens, trace string) (di require.NoError(ch.Env.T, err) callRes = callResult callErr = callError + ch.reqCounter.Add(int64(-len(task.Requests))) wg.Done() } diff --git a/packages/solo/solo.go b/packages/solo/solo.go index c9f7dc7a80..1c43b8313d 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -4,6 +4,7 @@ package solo import ( + "github.com/streadway/handy/atomic" "sync" "testing" "time" @@ -105,7 +106,7 @@ type Chain struct { // related to asynchronous backlog processing runVMMutex *sync.Mutex - chPosted sync.WaitGroup + reqCounter atomic.Int chInRequest chan sctransaction.RequestRef backlog []sctransaction.RequestRef backlogMutex *sync.RWMutex @@ -237,6 +238,7 @@ func (env *Solo) NewChain(chainOriginator signaturescheme.SignatureScheme, name r := vm.RequestRefWithFreeTokens{} r.Tx = initTx + ret.reqCounter.Add(1) _, err = ret.runBatch([]vm.RequestRefWithFreeTokens{r}, "new") require.NoError(env.T, err) @@ -273,7 +275,7 @@ func (env *Solo) EnqueueRequests(tx *sctransaction.Transaction) { env.logger.Infof("dispatching requests. Unknown chain: %s", chid.String()) continue } - chain.chPosted.Add(len(reqs)) + chain.reqCounter.Add(int64(len(reqs))) for _, reqRef := range reqs { chain.chInRequest <- reqRef } @@ -288,10 +290,7 @@ func (ch *Chain) readRequestsLoop() { func (ch *Chain) addToBacklog(r sctransaction.RequestRef) { ch.backlogMutex.Lock() - defer func() { - ch.backlogMutex.Unlock() - ch.chPosted.Done() - }() + defer ch.backlogMutex.Unlock() ch.backlog = append(ch.backlog, r) tl := r.RequestSection().Timelock() if tl == 0 { @@ -343,8 +342,5 @@ func (ch *Chain) batchLoop() { // backlogLen is a thread-safe function to return size of the current backlog func (ch *Chain) backlogLen() int { - ch.chPosted.Wait() - ch.backlogMutex.RLock() - defer ch.backlogMutex.RUnlock() - return len(ch.backlog) + return int(ch.reqCounter.Get()) } From 7b29f6fb92f4244c9829535f41aebc2a281ff0be Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Mon, 22 Feb 2021 18:39:49 +0200 Subject: [PATCH 25/39] use `atomic` from go.uber.org --- packages/solo/run.go | 2 +- packages/solo/solo.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/solo/run.go b/packages/solo/run.go index 6d95aa6e85..2fbf6f12e9 100644 --- a/packages/solo/run.go +++ b/packages/solo/run.go @@ -60,7 +60,7 @@ func (ch *Chain) runBatch(batch []vm.RequestRefWithFreeTokens, trace string) (di require.NoError(ch.Env.T, err) callRes = callResult callErr = callError - ch.reqCounter.Add(int64(-len(task.Requests))) + ch.reqCounter.Add(int32(-len(task.Requests))) wg.Done() } diff --git a/packages/solo/solo.go b/packages/solo/solo.go index 1c43b8313d..42b34d8c65 100644 --- a/packages/solo/solo.go +++ b/packages/solo/solo.go @@ -4,7 +4,7 @@ package solo import ( - "github.com/streadway/handy/atomic" + "go.uber.org/atomic" "sync" "testing" "time" @@ -106,7 +106,7 @@ type Chain struct { // related to asynchronous backlog processing runVMMutex *sync.Mutex - reqCounter atomic.Int + reqCounter atomic.Int32 chInRequest chan sctransaction.RequestRef backlog []sctransaction.RequestRef backlogMutex *sync.RWMutex @@ -275,7 +275,7 @@ func (env *Solo) EnqueueRequests(tx *sctransaction.Transaction) { env.logger.Infof("dispatching requests. Unknown chain: %s", chid.String()) continue } - chain.reqCounter.Add(int64(len(reqs))) + chain.reqCounter.Add(int32(len(reqs))) for _, reqRef := range reqs { chain.chInRequest <- reqRef } @@ -342,5 +342,5 @@ func (ch *Chain) batchLoop() { // backlogLen is a thread-safe function to return size of the current backlog func (ch *Chain) backlogLen() int { - return int(ch.reqCounter.Get()) + return int(ch.reqCounter.Load()) } From 99a70bb59a40cc189a0e45c5af53b0c4db244e1c Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Tue, 23 Feb 2021 15:43:52 -0800 Subject: [PATCH 26/39] Implemented MintedSupply and RequestId --- .../test/example_tutorial_bg.wasm | Bin 29417 -> 29359 bytes contracts/rust/dividend/test/dividend_bg.wasm | Bin 34364 -> 34370 bytes .../test/donatewithfeedback_bg.wasm | Bin 36046 -> 36052 bytes contracts/rust/erc20/test/erc20_bg.wasm | Bin 33811 -> 33817 bytes .../rust/fairauction/test/fairauction_bg.wasm | Bin 42361 -> 42222 bytes .../fairroulette/test/fairroulette_bg.wasm | Bin 36758 -> 36627 bytes .../rust/helloworld/test/helloworld_bg.wasm | Bin 15544 -> 15544 bytes .../rust/inccounter/test/inccounter_bg.wasm | Bin 31561 -> 31433 bytes contracts/rust/testcore/test | Bin 47093 -> 47132 bytes .../rust/tokenregistry/src/tokenregistry.rs | 17 +- .../tokenregistry/test/tokenregistry_bg.wasm | Bin 32255 -> 32261 bytes contracts/rust/wasmlib/src/bytes.rs | 11 ++ contracts/rust/wasmlib/src/context.rs | 30 +-- contracts/rust/wasmlib/src/hashtypes.rs | 149 +++++++++------ contracts/rust/wasmlib/src/host.rs | 5 +- contracts/rust/wasmlib/src/immutable.rs | 128 +++++++++++++ contracts/rust/wasmlib/src/keys.rs | 30 +-- contracts/rust/wasmlib/src/mutable.rs | 177 ++++++++++++++++++ packages/coretypes/requestid.go | 2 +- .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47708 -> 47132 bytes packages/vm/sandbox/sandbox.go | 1 + packages/vm/wasmhost/kvstorehost.go | 3 +- packages/vm/wasmhost/wasmkeys.go | 36 ++-- packages/vm/wasmproc/sccontext.go | 6 + tools/cluster/tests/wasm/inccounter_bg.wasm | Bin 31561 -> 31433 bytes 25 files changed, 481 insertions(+), 114 deletions(-) diff --git a/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm b/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm index c18db1be040906bce74aacce94165050edd95c97..0b060894a1239f4ad7d2f316facd422a7782700d 100644 GIT binary patch delta 3887 zcmZt|3s6+o_1*j4t_yFMT|UYm-ae3zCea7DWj2#@bNRuoIKXmUA(aB}2D>rSdU6bRiS-H8<5kI#s zuBblrgUj$b%VERtAzQ&aPeBU5LfbvQj(47hMe=V5;>s-R@Eg677>1{mKZkdo>Xp21 z&OL#D#3ozvki~M#yXhlH=5768e zzVEl9AcD{?uPza%qX-#`VX7u+Op}(z)6KyEoi3N5RmZ>^nwdIIF{HG%pl_U&D2DLD zV26tRIy6%y`!q&ey5W9kan%Kr7gFIvOJ#f+z9OV%K_XT3;8Bbw(}QC{tT;nRgX?j^ zDRkR)5^*B{>gC95bi9NM;b|8=&}hFLIYP%F6W{eSqW9-JcCtJlhFuIHf*#N=zAynY z)zCzY5IRWH1@DFF>>S()%Sj=UF_%cf=@olg(fmDLLo2%Mf_!K0)N^$7`Fv!&ovWgY zSR20LL>XWM`<*#fGGAPP_nh(U7<}Svu+tqzVG%hL7P@{hL7wt(%G2557tK61GQ`YN zMKF!E>5TG}kL77p#LRGFtQl65HmDMGL_|-fJT@}QxS@zqT6IKBLv_wY*T{G2!xxlL4@RQ{sdaaNC4YdmPh~usiaMX&4(56C65 z$XtRhIR+OKW~fwNXy$0LI0+9E<|Pmd(T<@-Er@eKi$DsX7BNtt=wLnYOyc^;PAr;n zy%Hr1!>vRLmMiJ)IHPW9L6M?8&{8zXA)}m|N%0fJQWg_5Q-4zOOy#i;n^T&f^x@5v zymnHPiX-Sls;{6A$EUVIr7^Eg1R7c<*p4||(XbOe$sy2L2x**xo)}*Y<9NZ_DO2E$ z)U^}T3_ay)Y_3!BiE^86A~d-Lkj>-Rarv-|*Y?*|`2IJsQ`L3=g{s zJbp>(={16y18b-hIRD_33-CW&{23feFi%McQR(<8l9O~aN$s|{z2@jm~bgn_$<(O4>Nn7Z`ZPEg~Mw{3pBMzm?m;*iop@Uxf+!PJSc1;*Xv6 z51AbXR;bTE{2FE}<)YfA@ul%Pc0|E37ien}6Wvm#n77bS7=?Ux73QLV(}mL##^^^! zN2OLbQ@KY|Fc`!N9u#`mLC7wekxCwKQ_6K&wt8FKR3jX|F82;G3+z@i|g4daIe^ntLmx2waJr?>&u=r z)(<_Nvsf;@VlwO$6~-yeIr2l)Vitu+_!y4JM`9Q2g_Z^9u~g$qmRmo@d+`bEC`scZ z$Kcb_7;8UaIE<90p}n_DHbjk}>gc?1NpeVWG(%>J8}OY{FZ&oSmCj|i;Oo+?04a2o zMY0?IAD7LNSt`80_)q@M@`ViLeXz6+<)v3-ao=mOvf@Q}XG0V`sBp5I@V|=4KO3#zNReJnx@OW^h8zHcIuVDX9~jP467a*77`p-mVJ1!dE2bGb3Jj9Qg~ zla>rcsPEfU@c9Zi3bwD*ncbhW(#bHRi&t%npeZ(o$7p;3E8uoC`6j%(N=&|P`iW^$ zCH~C2(uuyi0%CPkqUe8oh0TVw>W?Y2@ zH9A8%JhOTpKODRt#`Ks}a~uskQ?nY^(VFOmV=~-a+z7}EOujw@H0DYQYT?GlN;nD< z6`)rbv8MN;AJ)~zw%El19|9pRu5O{W8?;PuTf{Z@%0rABzhSuDRKObi(OaA>{5h*jibv!sMWTKsJqHC_^VxZ5 z*;qrTbs0|?VGi2+c!7u(NZV5Bog~2{AFuaNGU>75UK^WIi2l+ z{N{r2Um}hianZb63*T$bioJ_a7-GM|9mPuj!JYW5h2J&La|ho{x4EP=#4g9(hI=jU zR)Z>jTTXZvLQ@e6#g9DJ<*(b;ZgEG4xugsPm*Piz5MG04QZCy6-|ZXaP)c2uDU#@e IEj#x9AN^!x{Qv*} delta 3926 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 diff --git a/contracts/rust/dividend/test/dividend_bg.wasm b/contracts/rust/dividend/test/dividend_bg.wasm index cfc6b2c2340ced3d6fc1e626b846221df9e486b0..6f44585f96a41d61e9a73632dfa52f4e24680ddd 100644 GIT binary patch delta 2235 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 RlxX?zs9<7Z7%v{!{|^$Hab*Ai diff --git a/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm b/contracts/rust/donatewithfeedback/test/donatewithfeedback_bg.wasm index 24805bde158092277e5b506ed0021c6f7446998b..d578fbd99a4d279c7a3c53b98f5dd6444956fab3 100644 GIT binary patch delta 2780 zcmZ`*dr*|u6~E_x%gfy@-|{GL_;wAHhq|Bw3DATaTTqDsEMVe`P~MBYS5Ygn5Dkhn zW#*U>BczPBj!u&b^JS))HmN&?v@tbmQkzLT%*ZtSkxWQqJ5DDRg`T^xfTsOs&OP7n zoO91P_nhlYCzFpi;-kI|YH+1&N^NjFoonNjo6xL5=VfuUEHX%>Oh z-1qKLG{Zc|AqR$sHC$X0 zjfuHArPZp4_g}^4wAJtcJ5tkWeIqrDKN!Lh`%|%3hovz$fhYM*W?xMam!QDxM<=;D zj1TOqurSRSGH>>f&u_3PZ4I2k;k5MfGiRk2Mj;IXS_6%;GUCls)IM2AMV#gHh}tY} z%37p|aj7jP?IWg_;M=Bp+S)M%2Jo}=Dq1&YT;Q$&{a+cQ3JmGzvbq8KF+QghM(`&& zl`yK`&Z$?xq;Jaos}Bs~$~@cF!E7RGB~GN1GGjI^Nr?!3;(f#Aq%`o^rP^W;Mt@`TUS(PD$k9!Ywx_IJY?z8w*r8 zf?XvVzE+Txe*GdT{M0}*qdfc_Vn)`SdoYkB+#!~nN}EKUD&E!2&&+cAC{2asyysbb%eNmVonWZS6EHaBOa@WiF_o5dh`$2Jh;2p|D{l4s`aDljk`-}I&1^h?x zC79G-+u8*4XS;zxB?;Vh4iA@x`+g{s=QvcF;7NRU$numT7jnXXmN@9n*jbtdALFUg zlzCIMmIcGRdV1NI68wuJcDd=B?JwbvoFS?i zA}L3zrj1G(E1tpB z=J{B}2m0U2p9L^sQbo367RU73iZX6qECdKD%?FiT-;%^&d)2*Q_fbkUh{jNJh*9}I zeH2~Q&wv|0thU27d{7+^Z{fU#m++p- zVD%9b3$6{)^{3Lcfm|vHB1YdUJ7aCC#mQ z-|KJ(f4eWoe@I>r7BPym`_f?-uJ6d8yR@NWi!z+#i@)oL;8%k5Pda?TGDTP1XGFJ& zW{D>7tNr<*z!_W381p4EERY|*bD)Ed0A?J_it#6*e1Ir`XoUpyNNmK;1M4g;TxH>e za)^?NOxS%eJMH5IX*U_l0A?cTO9uH4Q6P~@!u{*WB)0)7H+M29*VqK7&Yx^Wv?Tf2hMUL)vJPenny9h|l1SL%k6$pLuC4oz{n> zUtfNQy};J2`2#k0W(JItRz5R$sk0zJ^HrHfC>NE(8!S}|Xe~*sL{+%$@Kf*?{nX(= zDyg5!qDWXuhoUQrmE`w+91hg z*c#mCN(p$2(02)4#}lsOzQ0B{Gp<8xcNnI2`{Co=Vf6p3s5^nyj&6HJ^a_>5kZ})D z1d$gXpm!Wq(n>;lI^=kT()wS zxID%DCvILTr5tj|#Ou delta 2691 zcmZ`*4^WiX5&!mmcW~#&h41)N?u3KyNFc~*Pt=13FyS=~h{OPn&_sf0@DH95As!Mf z|0MwtC&?@sAd%D|X-8Wfbv`@IG&EkUX`>~nnIRe5u`O-w44INn)3N>=0^N7V0h;z^ zcK7@3?%TI-ci)>E8)TmhvNNlI8Dz|aCQBFeK)$yJQhFf0T|W;uVqpT$#Z|xusM@lK zud$sae%JOW@ki{P#NW546aT{Q0zbwseu#MX;ytbJ_W30>M^ZGS#`qkN2@Jfxz%mDf z<#uR|tQmqJmjW2>wJ`qCLbm`2xy@S=Y0=e%egP2jyNdboNjVcCyGStvSf0i-x!4d8 z>nsq#6iwvTy)f%;{aAcBg!vEqC4L-FCHw=f;Gkm<^y=osQGjv$JZTM#>Pgym6PxPM zyV4GTb%dPVl9VG!8gS<2@9R#JqvE8Q+F}9Ln%i^$&|E5^ZVVP#>v?%J4J&)IL#2nGdrdqBiqU zQ41IM3u`G^?{hs3-*nY8R-Bcg7ystjN_MjC&$&BgQ1rsQ-y5M1AIwi)-}km(@}@C~D?W`C#V13cvO(eF|H}&A|7WG*(-Q2@ z&wv5El%Jk3w|r)1Myhv$LX#mzG2j+ikO!|~Nx`xNKh;Rh7IV(e8u^tFl6evz*9Qw$ z$YCEGq00OUKV6#!m+|ge4Q^q4kwcpzSIXTgNlt_4lko|fIXR8l_=s2_`_+DvB7O z;UoNdTMC@R2e)_8(EfCL1)DmIrX4j=;_b*}HjRB3vRDKa_#$@f*b+T?kRp&)H1neP z?(9T&T`Vd!TI@AyKTQlxutX0NzuraWF|4nNaqx+G6Fm-4pFHm|P98hhm0omu7vqhZ zQYxY5U5ODpAAzfLU!A(%qM=$T#Hi zaRM5skA^aEG9{p+Jn0b3=jC!HT~M)}PvD!o?Yk5{)Iq?kGG#lkRvtQ)!D-}IXG0rA z=rIx6K%r+noJJ*}6QPYFv=#_0tRWW;UfN9)RiY74FsU{Up2e)%9-4y-wKvQz6_SBJ zLzeSRK=SAz3h&~5J+to`#Wp3&bXWPTFpJr6;Fj9(|t?mDc|7B!k_!n@UYKeIU_a-q-atf#y|Sn;dfZo;D8Ej zZitIj)TN4p3Q7l{E$HG&oH}r#p_-=CvhO5J;xG2)ng+zZxAK!Xz0U(xxT-Oe9?4ye z>*W3=;rL#ooxNw$KW_{J>)+|^x=!>LqG_T(;g>HK6dngjS|&+S7?EL?!bzHDN$AW( zixyyoz9Wb%MB+ywqzBM`V5MaYRLMptmna zbYCNq&@UY*1QY*Pw_j3jn^9|uvDX}6GTliU1 z7c^mIa~xd2hUP4@-zfGHmY+2jsR?1Kq!G#`8ATG?TVgS#K7^a^!#=_y z+mPLRpM6`%j+Txr>nYkr^zB`eA}v3bb-3&kgdQMtlcebMU6SGmejMz`afa3`Ra7aJ zwChQVx!6cj%!?oY)8V#u6G|Z@CPcKOTlXAnH9F(0s+2~sh)Bo~{yu$+1mg71x?hkN PiHog(LE__B+I#T79C7so diff --git a/contracts/rust/erc20/test/erc20_bg.wasm b/contracts/rust/erc20/test/erc20_bg.wasm index 8df2c383da1563240b2f4439cf5f2bd1f4e81317..5cc4ac0b21d5719bd806fd0fb706eeeab1c4a104 100644 GIT binary patch delta 3850 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 Y@RD!qKh$es9AfRlf}g4A`|e%;2Wjt#;{X5v delta 6130 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 a@lvd%aWOtV)UE}}=4OzN7mp`(KlOiST#B>+ delta 3345 zcmZ`53s6+o^`857SKzVu77;;yZ`a={vfu|qK;`;d1pJ_&f+!-QvV7#TtTqKf#a~cC zj#wfzn#Lr~Xsc$O#!T%DGj*ogF*8XdYOATnl8&7kb*7HfX(zSkF5qX9?99FAp3gn+ z{O&o6@A6|O_<17$Mlxn1e&z@$DwxgxPpC9^A2>u zVb~8dEQeqh@s2}~Eu#&r3p*j;^keTR{$QkKjR?>ni9ZFMiKpPw@-QImDx~6#u*Hy$ z*6==9iqFG$gVX!g=mdZ?JQHyQoH#4;6fqt|cF_%5%&{)CyZ z!W%uM8VIyaEe6xcPST!+&!-g)9oI~M-_-7-dJTzZ6*%j?kSqX}MD+(St5A1x{j*m=yU^;Khp#6CnHd@4=Mt?)2Jx*>_8e;<37eGJK1m$Sg)5ufZKeuvgcEWHT|?G<_6Pn(v6Z>_E)mmjZQLoR3L$3hEw^7oRj z-{;%l8?RpA0=4gOFH7Pfbhi&X*L2PP0sxwHCWz>#v$-&XGaY;}(V5mt-H6U|^KJ!`T`+-@b$((q1U zEv011+JkTn@2ss3z9XxS>tF%qYhB_mxOUwdScIRhOSR-sTBN-~cWFBWh!Qjwb%2Up zMX7#)qJ<)$rFriZ1w+uw!T}O%$N#Qx{vjzEKPrv^2mY~m0%YNn;$&*F_6?5LD7I1k zG6})HFN!{SZkJ{!;iU~3RIX4GPf3_kG7hfO9)jg1qh7y_pOsilN2OIs*k7`eYC3ge zS+MNkNjyyFGADsl*|+hx8?z@ns6TP?PTL`?#URExsknOg(q)lV3-qrlW+;7wvEdeMSWt}Y^#W0=s&ZG0@FIxQ5F$OnZcVIrQcOomDLO{Ehm zy%Vb@0OVlK*65NANmMc*pQ`U&%jcj?r6g#sv23n!mzqhB{-sK)DA1PuSUFL9d99p$ ziKL=qVw|>qG)7hzP;GCk{(#y{RE-@HabZn2O|}O$dA5G4W*W$6+bHL9Aj<|~Q)C|; zDp)XXX`BXj>}iZO+YK5EBU(GHIP7ZJ#*Z4%(wJfy;S*;}UI?Kz z5^p!Anmxt=@eFB-cm9q=kSLxWA`|}+wXL|WvZ8E5VO?!W;g+p+Zbxk$duq~{RFp_- z60IRT2d_4@S=xqaERv|-k+K+qZMda*UwDY$05zI3W+du*hlAx2jbmW5BPc~DQZAwL z*NXFZW@+aM(+T^WU@$?{c8$b~J11D44Kk(@(MszXKH514O1+bJ4F`)mKw}X^%%e!k z;J7h+_cZtzn|IHf*iSsE={Z3g!P?@g&82#2)keLnYGdhk-L7iBpgzY(yJP(`2n!{t zb*Q&YfCkKHnPIs=G?|*qgS=d9Z;1_mM3_v@e+bG1{*R#aBp3TyQmsRG5&|_go~SDc z%CxQ{X!1!V?1{G=By1dEvIu1G4tlHiG#RZC!5Xs@nng>(A$%2`rEw8nt<|Fh$Ud%u Mfr*FMet7r)0XAcXWdHyG diff --git a/contracts/rust/helloworld/test/helloworld_bg.wasm b/contracts/rust/helloworld/test/helloworld_bg.wasm index 7fc442e635d00470e1485851db51abbae26c9fe2..f64dc07f57370a52e13016882a3b8e7e359f3a86 100644 GIT binary patch delta 48 zcmdl{xubG}tSKYUWI5AJAlYI1g;Pg>QHjwp+>vK}tJwiYM()jS7HW))4>#vpdNTt6 DcM1-A diff --git a/contracts/rust/inccounter/test/inccounter_bg.wasm b/contracts/rust/inccounter/test/inccounter_bg.wasm index 4e5ce45b6e3ea6e3b4c35115212ceb1779b15bf5..c7842d7ee373ae923fbebe3d8ea4a213c644b300 100644 GIT binary patch delta 4639 zcmZt}3s6+o_1(807Iqij!t(#@+m+Aq2T?%**^2=|Kn1Iaf`SObg8U@rqXewfn2xE$ zLsG}Ftx3?*d`Z_#Nz^ILn23!vrZp{{q>Y*UoFq-OwT&}rLeF_`*Ps>V-Fwfu=bn51 z=kEFcu=D?BBVRuDRWj2+1Z${C3hwUO+}zaJxw)mQzwd#b?)I*JVS#@x6F4(w7cX1A zusOdvD{j#}JL?A446sX)#kmlv&5VS5lsoCk!a!o(?Ue6D!_n?@HATJqW z>G&l>x{-Ed%_332I}HBMpn@L%?-l&Y-zMGSEbGg)E9fmUj;mWmKp&o(v15%81iOlHqVXzvDR-N`9 zRE!|&s-jEqYC_67Br@_TT=H2P9T@jv`AI@5OrIm1mUc(cqAY(Es5BR$RLPB#AlI+G9KKqNHto5xjvG*Ry6`{&Y(f+fVkCLtgwQ%@xPC=>;S z>qluh3iUzR36r!O8X6+yOrnv~mMqBn4u?pWcn@6+O?KKv+9xHI0S)TFE0I=L9*v~3 zR@S-gWJZnDXrgmSu^i2E7`mlr?-qw?79|chTYlqI13`7a8e>|{WY+Isy%;c}Q#6>E zkz#adaHd4OWyJ(uJqChfBqdN3B>4)XWgs{Leit0V#^IgdY@>39e1mGMCRq@Y>LTAH zi-O%>W?XXf2^GvmWti-rD;n}q7(d>Zr{OuXm6sly{KxleA ziLRPZUu8zA5WJh&k5t@>Z(rut9a#^r@mbFkc6&yB9`?3= zdOw=$7`zt#Ih%$TBD&eICob{=V>9r1R2jPr3!*n-QjA20WA2Sdciiq-Tg?0wji~lzy39&3G89iKJ|iAVY8W{MBpF7Og;mJX8%R`hMA4<# ziFP$Sxg5lXgA&SXWwnkFQd!|CMbWtluqi$Y&c-+1E%W^15@2J3 ziMl|0!YOZzsv!hfiAs!CCjJ)V!Ib1;N1!SxT0C+HMx1G~)+lT2qO5Z;e&o;;io=X# zi`iLCuU*4WkHUM-bieCQObMlCJxIy%5a={U5xm?i7%_*DcIZ1zFE{M8>-qI3z?@VR zd*-LKEz&ObnR2sU*6}%M{wFe3IZ*xGTyUNu_!b>(rf8Fq-@mTcw$)-Zi-?%=EIMic&}pz=|MB zmB3RLvr5mdls1ObN2yIrKl&(g&xMNg&A#PC`qTPh1?#EHC}F-XBO6N5d57V-%!6zc z3bGbPC`qrh0i`_oO7I9glC?+ee9Gnsgl1o3$2|J^oUsZh%PG>293&Ot(VW$64E~(h8-SN;l_Shtcb?M!G3)Jex8?&`Ftra1G-q{(r_D}Q2@{J#dZ;opUeNg6>AFe{f4M%VUaE= zcvOG>$GCnIW(u6_HDHCZZI+yY9^f$~j#D&Q7-kcimBO0e09RooI|~~MQ&5W1QW=gH zE?M~6(|E>DGMfbq1%sQbJQNt+!6V%K1`34dErLKaPBDw0^H`VeV)|)vz!G@8Xam~^ z*NW^o2D|ET>~tmJIOY-h|^ho@l*+LQ6|1Quq+#Dg>;!hfP3V@eAxK z*q5DRDe$*tzgG486Fh!TqIlydu+j+q+oZ7ww$emJgH6`CvPF4?gZ>gXI}h)dEMb3! zsM1u0w3nUpOqMoiSUQBQNHk|S#MMf%k8n%rP`;v^B?7EC9e#2zUXUtl$r4v+J%)pn z4XqV@DBxc!HllzFD^uA`XsX-?)vZ?erZR}V<1togS>b=llr)gFnHwvO+OYVvT39%v zUQIyp9()c+xf+35?ggqa7oc)wQt|XYdTLnlesv}BYbra3$OkL27!!z=V{Y~7Kp?;A zCDCXH(Z?^ZOlQ~N!<9Mk@v3!b$b!|6uvg%X)jh#)DaMl-28B`w_(dqI-oQ%W>FRvT z3T)2?Hx9B}+Qu2*0$)|n_fL};R-syMf|MHDV7V-ClbgRjgqMbKQS!p?670`4KKLVo zwOs3iud4JqAN(D`fn4u{59~oW6l2iK?@5Bq+~9*>AUJ^gNBR(xgs|`cFD#Y82Q|Bx z2^!Yq8_fI|+7OGyu{8zO5;T>`EtM1tl7l{nAgzFFYZBNdPuLG+X1W!N`0j>_YvZ7C z?Up-{h0F=2bxCYFELfMvvSItWj9Zwq3g+8&Wf4W$NVDT{7(2uE;zUdgd1Q$20!!coV z37V&4^J*MVZ|-FokkKf!Dp=JxQ+mZ4%*-zG_q-}951APRkZS?=QrPjKOgK~>&4f1K zMoc(mmtTSHO_3cYeqMqU0j1mxhQf?XD*WVqhE6zf#h){TxCObKk##~#K&peBuC8}J7is_xyHfakYv zV}%gfverK>NC_J$6?U}5vr;(RvXy1Rw=J@9^brbREs8k}&emj%jhfc=EC-%#ZCLyl zDlQCFo6~xthmDRolA=(H=0piXgaN*7F)M;y+YX_yfo-YgLZb!CE_E^spM=u3g`o|Y z>ddG|Q%NnxNSx3PU%*IPI5y_-wq>S|=V|Eo)s$d7KM%fc%hG)~J3IS6q_ux2G7&89 zFxchpXIXH~ogXU+>L0@iJDLzY2M&P+?p%u?N#L z^?*a2g!`IyZ0~H}Qop0GxxTG?M}J1&4#A|6gb>_c1W}#$S@t3ngU~6e4DOMtpW#fR_ce8GYmr;Jw#w~YTU+jz zWBeq6uKf%Wds6)i5DG)61~&90u^#wgPp;)S;*5x!@a~nt?|V`suOJkN*e`L$YlVN} zOnk~9us7fCI}>k^gha%yz}bLv4bFOn%H5l38A2!lp#c2IP(z+)dIxp(pg>7*B3OYR e%|5sm*Cbq!XT^PengB{vBhw0e2HtpZ@BaWaRTZcJ delta 4792 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 delta 15744 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 diff --git a/contracts/rust/tokenregistry/src/tokenregistry.rs b/contracts/rust/tokenregistry/src/tokenregistry.rs index f61472518e..ffe50b36f2 100644 --- a/contracts/rust/tokenregistry/src/tokenregistry.rs +++ b/contracts/rust/tokenregistry/src/tokenregistry.rs @@ -12,17 +12,19 @@ pub fn func_mint_supply(ctx: &ScFuncContext) { let param_description = p.get_string(PARAM_DESCRIPTION); let param_user_defined = p.get_string(PARAM_USER_DEFINED); - let minted = ctx.incoming().minted(); - if minted == ScColor::MINT { + let minted_supply = ctx.minted_supply(); + if minted_supply == 0 { ctx.panic("TokenRegistry: No newly minted tokens found"); } + let minted_color = ctx.minted_color(); let state = ctx.state(); - let registry = state.get_map(VAR_REGISTRY).get_bytes(&minted); + let registry = state.get_map(VAR_REGISTRY).get_bytes(&minted_color); if registry.exists() { - ctx.panic("TokenRegistry: Color already exists"); + // should never happen, because transaction id is unique + ctx.panic("TokenRegistry: registry for color already exists"); } let mut token = Token { - supply: ctx.incoming().balance(&minted), + supply: minted_supply, minted_by: ctx.caller(), owner: ctx.caller(), created: ctx.timestamp(), @@ -30,15 +32,12 @@ pub fn func_mint_supply(ctx: &ScFuncContext) { description: param_description.value(), user_defined: param_user_defined.value(), }; - if token.supply <= 0 { - ctx.panic("TokenRegistry: Insufficient supply"); - } if token.description.is_empty() { token.description += "no dscr"; } registry.set_value(&token.to_bytes()); let colors = state.get_color_array(VAR_COLOR_LIST); - colors.get_color(colors.length()).set_value(&minted); + colors.get_color(colors.length()).set_value(&minted_color); ctx.log("tokenregistry.mintSupply ok"); } diff --git a/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm b/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm index a0499501f685c5b60a5cce732ab037de0b604349..4574665fd382f0e5dea8b01937e54b51d5a8b26a 100644 GIT binary patch delta 8483 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 delta 8424 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 { } } + // decodes an ScRequestId from the byte buffer + pub fn request_id(&mut self) -> ScRequestId { + ScRequestId::from_bytes(self.bytes()) + } + // decodes an UTF-8 text string from the byte buffer pub fn string(&mut self) -> String { String::from_utf8_lossy(self.bytes()).to_string() @@ -177,6 +182,12 @@ impl BytesEncoder { } } + // encodes an ScRequestId into the byte buffer + pub fn request_id(&mut self, value: &ScRequestId) -> &BytesEncoder { + self.bytes(value.to_bytes()); + self + } + // encodes an UTF-8 text string into the byte buffer pub fn string(&mut self, value: &str) -> &BytesEncoder { self.bytes(value.as_bytes()); diff --git a/contracts/rust/wasmlib/src/context.rs b/contracts/rust/wasmlib/src/context.rs index 7183ea4337..5772fae170 100644 --- a/contracts/rust/wasmlib/src/context.rs +++ b/contracts/rust/wasmlib/src/context.rs @@ -40,11 +40,6 @@ impl ScBalances { pub fn colors(&self) -> ScImmutableColorArray { self.balances.get_color_array(&KEY_COLOR) } - - // retrieve the color of newly minted tokens - pub fn minted(&self) -> ScColor { - ScColor::from_bytes(&self.balances.get_bytes(&ScColor::MINT).value()) - } } // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ @@ -315,26 +310,39 @@ impl ScFuncContext { ScBalances { balances: ROOT.get_map(&KEY_INCOMING).immutable() } } + // retrieve the color of the tokens that were minted in this transaction + pub fn minted_color(&self) -> ScColor { ScColor::from_request_id(&self.request_id()) } + + // retrieve the amount of tokens that were minted in this transaction + pub fn minted_supply(&self) -> i64 { + ROOT.get_int(&KEY_MINTED).value() + } + // posts a request to asynchronously invoke the specified smart // contract function according to the specified request parameters - pub fn post(&self, par: &PostRequestParams) { + pub fn post(&self, req: &PostRequestParams) { let mut encode = BytesEncoder::new(); - encode.contract_id(&par.contract_id); - encode.hname(&par.function); - if let Some(params) = &par.params { + encode.contract_id(&req.contract_id); + encode.hname(&req.function); + if let Some(params) = &req.params { encode.int(params.obj_id as i64); } else { encode.int(0); } - if let Some(transfer) = &par.transfer { + if let Some(transfer) = &req.transfer { encode.int(transfer.transfers.obj_id as i64); } else { encode.int(0); } - encode.int(par.delay); + encode.int(req.delay); ROOT.get_bytes(&KEY_POST).set_value(&encode.data()); } + // retrieve the request id of this transaction + fn request_id(&self) -> ScRequestId { + ROOT.get_request_id(&KEY_REQUEST_ID).value() + } + // access to mutable state storage pub fn state(&self) -> ScMutableMap { ROOT.get_map(&KEY_STATE) diff --git a/contracts/rust/wasmlib/src/hashtypes.rs b/contracts/rust/wasmlib/src/hashtypes.rs index 791f74f03b..8c5e0b93e2 100644 --- a/contracts/rust/wasmlib/src/hashtypes.rs +++ b/contracts/rust/wasmlib/src/hashtypes.rs @@ -23,9 +23,9 @@ impl ScAddress { // returns agent id representation of this Tangle address pub fn as_agent_id(&self) -> ScAgentId { - let mut a = ScAgentId { id: [0; 37] }; - a.id[..33].copy_from_slice(&self.id[..33]); - a + let mut agent_id = ScAgentId { id: [0; 37] }; + agent_id.id[..33].copy_from_slice(&self.id[..33]); + agent_id } // convert to byte array representation @@ -62,9 +62,9 @@ impl ScAgentId { // gets Tangle address from agent id pub fn address(&self) -> ScAddress { - let mut a = ScAddress { id: [0; 33] }; - a.id[..33].copy_from_slice(&self.id[..33]); - a + let mut address = ScAddress { id: [0; 33] }; + address.id[..33].copy_from_slice(&self.id[..33]); + address } // checks to see if agent id represents a Tangle address @@ -124,43 +124,26 @@ impl MapKey for ScChainId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ -// container object for 37-byte contract ids +// container object for 32-byte token color #[derive(PartialEq, Clone)] -pub struct ScContractId { - id: [u8; 37], +pub struct ScColor { + id: [u8; 32], } -impl ScContractId { - // construct from chain id and contract name hash - pub fn new(chain_id: &ScChainId, hname: &ScHname) -> ScContractId { - let mut c = ScContractId { id: [0; 37] }; - c.id[..33].copy_from_slice(&chain_id.to_bytes()); - c.id[33..].copy_from_slice(&hname.to_bytes()); - c - } +impl ScColor { + // predefined colors + pub const IOTA: ScColor = ScColor { id: [0x00; 32] }; + pub const MINT: ScColor = ScColor { id: [0xff; 32] }; // construct from byte array - pub fn from_bytes(bytes: &[u8]) -> ScContractId { - ScContractId { id: bytes.try_into().expect("invalid contract id length") } - } - - // get agent id representation of contract id - pub fn as_agent_id(&self) -> ScAgentId { - let mut a = ScAgentId { id: [0x00; 37] }; - a.id[..].copy_from_slice(&self.id[..]); - a - } - - // get chain id of chain that contract is on - pub fn chain_id(&self) -> ScChainId { - let mut c = ScChainId { id: [0; 33] }; - c.id[..33].copy_from_slice(&self.id[..33]); - c + pub fn from_bytes(bytes: &[u8]) -> ScColor { + ScColor { id: bytes.try_into().expect("invalid color id length") } } - // get contract name hash for this contract - pub fn hname(&self) -> ScHname { - ScHname::from_bytes(&self.id[33..]) + pub fn from_request_id(request_id: &ScRequestId) -> ScColor { + let mut color = ScColor { id: [0x00; 32] }; + color.id[..].copy_from_slice(&request_id.id[..]); + color } // convert to byte array representation @@ -175,7 +158,7 @@ impl ScContractId { } // allow to be used as key in maps -impl MapKey for ScContractId { +impl MapKey for ScColor { fn get_id(&self) -> Key32 { get_key_id_from_bytes(self.to_bytes()) } @@ -183,20 +166,43 @@ impl MapKey for ScContractId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ -// container object for 32-byte token color +// container object for 37-byte contract ids #[derive(PartialEq, Clone)] -pub struct ScColor { - id: [u8; 32], +pub struct ScContractId { + id: [u8; 37], } -impl ScColor { - // predefined colors - pub const IOTA: ScColor = ScColor { id: [0x00; 32] }; - pub const MINT: ScColor = ScColor { id: [0xff; 32] }; +impl ScContractId { + // construct from chain id and contract name hash + pub fn new(chain_id: &ScChainId, hname: &ScHname) -> ScContractId { + let mut contract_id = ScContractId { id: [0; 37] }; + contract_id.id[..33].copy_from_slice(&chain_id.to_bytes()); + contract_id.id[33..].copy_from_slice(&hname.to_bytes()); + contract_id + } // construct from byte array - pub fn from_bytes(bytes: &[u8]) -> ScColor { - ScColor { id: bytes.try_into().expect("invalid color id length") } + pub fn from_bytes(bytes: &[u8]) -> ScContractId { + ScContractId { id: bytes.try_into().expect("invalid contract id length") } + } + + // get agent id representation of contract id + pub fn as_agent_id(&self) -> ScAgentId { + let mut agent_id = ScAgentId { id: [0x00; 37] }; + agent_id.id[..].copy_from_slice(&self.id[..]); + agent_id + } + + // get chain id of chain that contract is on + pub fn chain_id(&self) -> ScChainId { + let mut chain_id = ScChainId { id: [0; 33] }; + chain_id.id[..33].copy_from_slice(&self.id[..33]); + chain_id + } + + // get contract name hash for this contract + pub fn hname(&self) -> ScHname { + ScHname::from_bytes(&self.id[33..]) } // convert to byte array representation @@ -211,7 +217,7 @@ impl ScColor { } // allow to be used as key in maps -impl MapKey for ScColor { +impl MapKey for ScContractId { fn get_id(&self) -> Key32 { get_key_id_from_bytes(self.to_bytes()) } @@ -263,23 +269,13 @@ impl ScHname { // construct from byte array pub fn from_bytes(bytes: &[u8]) -> ScHname { - if bytes.len() != 4 { panic!("Hname should be 4 bytes"); } - let val = bytes[3] as u32; - let val = (val << 8) | (bytes[2] as u32); - let val = (val << 8) | (bytes[1] as u32); - let val = (val << 8) | (bytes[0] as u32); + let val = u32::from_le_bytes(bytes.try_into().expect("invalid hname length")); ScHname(val) } // convert to byte array representation pub fn to_bytes(&self) -> Vec { - let val = self.0; - let mut bytes: Vec = Vec::new(); - bytes.push((val >> 0) as u8); - bytes.push((val >> 8) as u8); - bytes.push((val >> 16) as u8); - bytes.push((val >> 24) as u8); - bytes + self.0.to_le_bytes().to_vec() } // human-readable string representation @@ -291,6 +287,39 @@ impl ScHname { // allow to be used as key in maps impl MapKey for ScHname { fn get_id(&self) -> Key32 { - get_key_id_from_bytes(&self.0.to_ne_bytes()) + get_key_id_from_bytes(&self.0.to_le_bytes()) } } + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + +// container object for 34-byte transaction request ids +#[derive(PartialEq, Clone)] +pub struct ScRequestId { + id: [u8; 34], +} + +impl ScRequestId { + // construct from byte array + pub fn from_bytes(bytes: &[u8]) -> ScRequestId { + ScRequestId { id: bytes.try_into().expect("invalid request id length") } + } + + // convert to byte array representation + pub fn to_bytes(&self) -> &[u8] { + &self.id + } + + // human-readable string representation + pub fn to_string(&self) -> String { + base58_encode(&self.id) + } +} + +// allow to be used as key in maps +impl MapKey for ScRequestId { + fn get_id(&self) -> Key32 { + get_key_id_from_bytes(self.to_bytes()) + } +} + diff --git a/contracts/rust/wasmlib/src/host.rs b/contracts/rust/wasmlib/src/host.rs index 3206798faf..23f57072e3 100644 --- a/contracts/rust/wasmlib/src/host.rs +++ b/contracts/rust/wasmlib/src/host.rs @@ -18,9 +18,10 @@ pub const TYPE_HASH: i32 = 7; pub const TYPE_HNAME: i32 = 8; pub const TYPE_INT: i32 = 9; pub const TYPE_MAP: i32 = 10; -pub const TYPE_STRING: i32 = 11; +pub const TYPE_REQUEST_ID: i32 = 11; +pub const TYPE_STRING: i32 = 12; -const TYPE_SIZES: &[usize] = &[0, 33, 37, 0, 33, 32, 37, 32, 4, 8, 0, 0]; +const TYPE_SIZES: &[usize] = &[0, 33, 37, 0, 33, 32, 37, 32, 4, 8, 0, 34, 0]; // any host function that gets called once the current request has // entered an error state will immediately return without action. diff --git a/contracts/rust/wasmlib/src/immutable.rs b/contracts/rust/wasmlib/src/immutable.rs index 47d36f9d2c..36e1e6a915 100644 --- a/contracts/rust/wasmlib/src/immutable.rs +++ b/contracts/rust/wasmlib/src/immutable.rs @@ -167,6 +167,25 @@ impl ScImmutableChainId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// immutable array of ScChainId +pub struct ScImmutableChainIdArray { + pub(crate) obj_id: i32 +} + +impl ScImmutableChainIdArray { + // index 0..length(), exclusive + pub fn get_chain_id(&self, index: i32) -> ScImmutableChainId { + ScImmutableChainId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for immutable ScColor in host map pub struct ScImmutableColor { obj_id: i32, @@ -236,6 +255,25 @@ impl ScImmutableContractId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// immutable array of ScContractId +pub struct ScImmutableContractIdArray { + pub(crate) obj_id: i32 +} + +impl ScImmutableContractIdArray { + // index 0..length(), exclusive + pub fn get_contract_id(&self, index: i32) -> ScImmutableContractId { + ScImmutableContractId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for immutable ScHash in host map pub struct ScImmutableHash { obj_id: i32, @@ -305,6 +343,25 @@ impl ScImmutableHname { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// immutable array of ScHname +pub struct ScImmutableHnameArray { + pub(crate) obj_id: i32 +} + +impl ScImmutableHnameArray { + // index 0..length(), exclusive + pub fn get_hname(&self, index: i32) -> ScImmutableHname { + ScImmutableHname { obj_id: self.obj_id, key_id: Key32(index) } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for immutable int64 in host map pub struct ScImmutableInt { obj_id: i32, @@ -393,6 +450,12 @@ impl ScImmutableMap { ScImmutableChainId { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScImmutableChainIdArray specified by key + pub fn get_chain_id_array(&self, key: &T) -> ScImmutableChainIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_CHAIN_ID | TYPE_ARRAY); + ScImmutableChainIdArray { obj_id: arr_id } + } + // get proxy for immutable ScColor field specified by key pub fn get_color(&self, key: &T) -> ScImmutableColor { ScImmutableColor { obj_id: self.obj_id, key_id: key.get_id() } @@ -409,6 +472,12 @@ impl ScImmutableMap { ScImmutableContractId { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScImmutableContractIdArray specified by key + pub fn get_contract_id_array(&self, key: &T) -> ScImmutableContractIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_CONTRACT_ID | TYPE_ARRAY); + ScImmutableContractIdArray { obj_id: arr_id } + } + // get proxy for immutable ScHash field specified by key pub fn get_hash(&self, key: &T) -> ScImmutableHash { ScImmutableHash { obj_id: self.obj_id, key_id: key.get_id() } @@ -425,6 +494,12 @@ impl ScImmutableMap { ScImmutableHname { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScImmutableHnameArray specified by key + pub fn get_hname_array(&self, key: &T) -> ScImmutableHnameArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_HNAME | TYPE_ARRAY); + ScImmutableHnameArray { obj_id: arr_id } + } + // get proxy for immutable int64 field specified by key pub fn get_int(&self, key: &T) -> ScImmutableInt { ScImmutableInt { obj_id: self.obj_id, key_id: key.get_id() } @@ -448,6 +523,17 @@ impl ScImmutableMap { ScImmutableMapArray { obj_id: arr_id } } + // get proxy for immutable ScRequestId field specified by key + pub fn get_request_id(&self, key: &T) -> ScImmutableRequestId { + ScImmutableRequestId { obj_id: self.obj_id, key_id: key.get_id() } + } + + // get proxy for ScImmutableRequestIdArray specified by key + pub fn get_request_id_array(&self, key: &T) -> ScImmutableRequestIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_REQUEST_ID | TYPE_ARRAY); + ScImmutableRequestIdArray { obj_id: arr_id } + } + // get proxy for immutable UTF-8 text string field specified by key pub fn get_string(&self, key: &T) -> ScImmutableString { ScImmutableString { obj_id: self.obj_id, key_id: key.get_id() } @@ -480,6 +566,48 @@ impl ScImmutableMapArray { } } +// proxy object for immutable ScRequestId in host map +pub struct ScImmutableRequestId { + obj_id: i32, + key_id: Key32, +} + +impl ScImmutableRequestId { + // check if object exists in host map + pub fn exists(&self) -> bool { + exists(self.obj_id, self.key_id, TYPE_REQUEST_ID) + } + + // human-readable string representation + pub fn to_string(&self) -> String { + self.value().to_string() + } + + // get value from host map + pub fn value(&self) -> ScRequestId { + ScRequestId::from_bytes(&get_bytes(self.obj_id, self.key_id, TYPE_REQUEST_ID)) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + +// immutable array of ScRequestId +pub struct ScImmutableRequestIdArray { + pub(crate) obj_id: i32 +} + +impl ScImmutableRequestIdArray { + // index 0..length(), exclusive + pub fn get_request_id(&self, index: i32) -> ScImmutableRequestId { + ScImmutableRequestId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // proxy object for immutable UTF-8 text string in host map diff --git a/contracts/rust/wasmlib/src/keys.rs b/contracts/rust/wasmlib/src/keys.rs index f7d9094d1e..b4fb1cb438 100644 --- a/contracts/rust/wasmlib/src/keys.rs +++ b/contracts/rust/wasmlib/src/keys.rs @@ -56,18 +56,20 @@ pub const KEY_INCOMING : Key32 = Key32(-22); pub const KEY_LENGTH : Key32 = Key32(-23); pub const KEY_LOG : Key32 = Key32(-24); pub const KEY_MAPS : Key32 = Key32(-25); -pub const KEY_NAME : Key32 = Key32(-26); -pub const KEY_PANIC : Key32 = Key32(-27); -pub const KEY_PARAMS : Key32 = Key32(-28); -pub const KEY_POST : Key32 = Key32(-29); -pub const KEY_RANDOM : Key32 = Key32(-30); -pub const KEY_RESULTS : Key32 = Key32(-31); -pub const KEY_RETURN : Key32 = Key32(-32); -pub const KEY_STATE : Key32 = Key32(-33); -pub const KEY_TIMESTAMP : Key32 = Key32(-34); -pub const KEY_TRACE : Key32 = Key32(-35); -pub const KEY_TRANSFERS : Key32 = Key32(-36); -pub const KEY_UTILITY : Key32 = Key32(-37); -pub const KEY_VALID : Key32 = Key32(-38); -pub const KEY_ZZZZZZZ : Key32 = Key32(-39); +pub const KEY_MINTED : Key32 = Key32(-26); +pub const KEY_NAME : Key32 = Key32(-27); +pub const KEY_PANIC : Key32 = Key32(-28); +pub const KEY_PARAMS : Key32 = Key32(-29); +pub const KEY_POST : Key32 = Key32(-30); +pub const KEY_RANDOM : Key32 = Key32(-31); +pub const KEY_REQUEST_ID : Key32 = Key32(-32); +pub const KEY_RESULTS : Key32 = Key32(-33); +pub const KEY_RETURN : Key32 = Key32(-34); +pub const KEY_STATE : Key32 = Key32(-35); +pub const KEY_TIMESTAMP : Key32 = Key32(-36); +pub const KEY_TRACE : Key32 = Key32(-37); +pub const KEY_TRANSFERS : Key32 = Key32(-38); +pub const KEY_UTILITY : Key32 = Key32(-39); +pub const KEY_VALID : Key32 = Key32(-40); +pub const KEY_ZZZZZZZ : Key32 = Key32(-41); // @formatter:on diff --git a/contracts/rust/wasmlib/src/mutable.rs b/contracts/rust/wasmlib/src/mutable.rs index fe91928fca..c3689b0902 100644 --- a/contracts/rust/wasmlib/src/mutable.rs +++ b/contracts/rust/wasmlib/src/mutable.rs @@ -11,6 +11,8 @@ use crate::host::*; use crate::immutable::*; use crate::keys::*; +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for mutable ScAddress in host map pub struct ScMutableAddress { obj_id: i32, @@ -218,6 +220,35 @@ impl ScMutableChainId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// mutable array of ScChainId +pub struct ScMutableChainIdArray { + pub(crate) obj_id: i32 +} + +impl ScMutableChainIdArray { + // empty the array + pub fn clear(&self) { + clear(self.obj_id); + } + + // index 0..length(), when length() a new one is appended + pub fn get_chain_id(&self, index: i32) -> ScMutableChainId { + ScMutableChainId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // get immutable version of array + pub fn immutable(&self) -> ScImmutableChainIdArray { + ScImmutableChainIdArray { obj_id: self.obj_id } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for mutable ScColor in host map pub struct ScMutableColor { obj_id: i32, @@ -307,6 +338,35 @@ impl ScMutableContractId { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// mutable array of ScContractId +pub struct ScMutableContractIdArray { + pub(crate) obj_id: i32 +} + +impl ScMutableContractIdArray { + // empty the array + pub fn clear(&self) { + clear(self.obj_id); + } + + // index 0..length(), when length() a new one is appended + pub fn get_contract_id(&self, index: i32) -> ScMutableContractId { + ScMutableContractId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // get immutable version of array + pub fn immutable(&self) -> ScImmutableContractIdArray { + ScImmutableContractIdArray { obj_id: self.obj_id } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for mutable ScHash in host map pub struct ScMutableHash { obj_id: i32, @@ -396,6 +456,35 @@ impl ScMutableHname { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// mutable array of ScHname +pub struct ScMutableHnameArray { + pub(crate) obj_id: i32 +} + +impl ScMutableHnameArray { + // empty the array + pub fn clear(&self) { + clear(self.obj_id); + } + + // index 0..length(), when length() a new one is appended + pub fn get_hname(&self, index: i32) -> ScMutableHname { + ScMutableHname { obj_id: self.obj_id, key_id: Key32(index) } + } + + // get immutable version of array + pub fn immutable(&self) -> ScImmutableHnameArray { + ScImmutableHnameArray { obj_id: self.obj_id } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for mutable int64 in host map pub struct ScMutableInt { obj_id: i32, @@ -509,6 +598,12 @@ impl ScMutableMap { ScMutableChainId { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScMutableChainIdArray specified by key + pub fn get_chain_id_array(&self, key: &T) -> ScMutableChainIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_CHAIN_ID | TYPE_ARRAY); + ScMutableChainIdArray { obj_id: arr_id } + } + // get proxy for mutable ScColor field specified by key pub fn get_color(&self, key: &T) -> ScMutableColor { ScMutableColor { obj_id: self.obj_id, key_id: key.get_id() } @@ -525,6 +620,12 @@ impl ScMutableMap { ScMutableContractId { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScMutableContractIdArray specified by key + pub fn get_contract_id_array(&self, key: &T) -> ScMutableContractIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_CONTRACT_ID | TYPE_ARRAY); + ScMutableContractIdArray { obj_id: arr_id } + } + // get proxy for mutable ScHash field specified by key pub fn get_hash(&self, key: &T) -> ScMutableHash { ScMutableHash { obj_id: self.obj_id, key_id: key.get_id() } @@ -541,6 +642,12 @@ impl ScMutableMap { ScMutableHname { obj_id: self.obj_id, key_id: key.get_id() } } + // get proxy for ScMutableHnameArray specified by key + pub fn get_hname_array(&self, key: &T) -> ScMutableHnameArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_HNAME | TYPE_ARRAY); + ScMutableHnameArray { obj_id: arr_id } + } + // get proxy for mutable int64 field specified by key pub fn get_int(&self, key: &T) -> ScMutableInt { ScMutableInt { obj_id: self.obj_id, key_id: key.get_id() } @@ -564,6 +671,17 @@ impl ScMutableMap { ScMutableMapArray { obj_id: arr_id } } + // get proxy for mutable ScRequestId field specified by key + pub fn get_request_id(&self, key: &T) -> ScMutableRequestId { + ScMutableRequestId { obj_id: self.obj_id, key_id: key.get_id() } + } + + // get proxy for ScMutableRequestIdArray specified by key + pub fn get_request_id_array(&self, key: &T) -> ScMutableRequestIdArray { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_REQUEST_ID | TYPE_ARRAY); + ScMutableRequestIdArray { obj_id: arr_id } + } + // get proxy for mutable UTF-8 text string field specified by key pub fn get_string(&self, key: &T) -> ScMutableString { ScMutableString { obj_id: self.obj_id, key_id: key.get_id() } @@ -613,6 +731,65 @@ impl ScMutableMapArray { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ +// proxy object for mutable ScRequestId in host map +pub struct ScMutableRequestId { + obj_id: i32, + key_id: Key32, +} + +impl ScMutableRequestId { + // check if object exists in host map + pub fn exists(&self) -> bool { + exists(self.obj_id, self.key_id, TYPE_REQUEST_ID) + } + + // set value in host map + pub fn set_value(&self, val: &ScRequestId) { + set_bytes(self.obj_id, self.key_id, TYPE_REQUEST_ID, val.to_bytes()); + } + + // human-readable string representation + pub fn to_string(&self) -> String { + self.value().to_string() + } + + // retrieve value from host map + pub fn value(&self) -> ScRequestId { + ScRequestId::from_bytes(&get_bytes(self.obj_id, self.key_id, TYPE_REQUEST_ID)) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + +// mutable array of ScRequestId +pub struct ScMutableRequestIdArray { + pub(crate) obj_id: i32 +} + +impl ScMutableRequestIdArray { + // empty the array + pub fn clear(&self) { + clear(self.obj_id); + } + + // index 0..length(), when length() a new one is appended + pub fn get_request_id(&self, index: i32) -> ScMutableRequestId { + ScMutableRequestId { obj_id: self.obj_id, key_id: Key32(index) } + } + + // get immutable version of array + pub fn immutable(&self) -> ScImmutableRequestIdArray { + ScImmutableRequestIdArray { obj_id: self.obj_id } + } + + // number of items in array + pub fn length(&self) -> i32 { + get_length(self.obj_id) + } +} + +// \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ + // proxy object for mutable UTF-8 text string in host map pub struct ScMutableString { obj_id: i32, diff --git a/packages/coretypes/requestid.go b/packages/coretypes/requestid.go index 683e418b64..d846c3848c 100644 --- a/packages/coretypes/requestid.go +++ b/packages/coretypes/requestid.go @@ -45,7 +45,7 @@ func NewRequestIDFromBytes(data []byte) (ret RequestID, err error) { } // Bytes returns requestID as a byte slice -func (rid *RequestID) Bytes() []byte { +func (rid RequestID) Bytes() []byte { return rid[:] } diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index 3da090a3d9e9179166942e0acc1e3683b7e40932..919c9d46d1612157373c2b8a9bc33efd64c2f3f5 100644 GIT binary patch delta 18602 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 delta 19434 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 delta 4792 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 Date: Tue, 23 Feb 2021 15:54:58 -0800 Subject: [PATCH 27/39] Fixed wrong copy to test folder --- contracts/rust/build_rust.bat | 2 +- contracts/rust/testcore/test | Bin 47132 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 contracts/rust/testcore/test diff --git a/contracts/rust/build_rust.bat b/contracts/rust/build_rust.bat index 8c8541ed5e..2a42a5a298 100644 --- a/contracts/rust/build_rust.bat +++ b/contracts/rust/build_rust.bat @@ -3,6 +3,6 @@ cd %1 if not exist src\lib.rs goto :xit echo compiling %1_bg.wasm wasm-pack build -copy /y pkg\%1_bg.wasm test +if exist test copy /y pkg\%1_bg.wasm test\*.* :xit cd .. diff --git a/contracts/rust/testcore/test b/contracts/rust/testcore/test deleted file mode 100644 index 919c9d46d1612157373c2b8a9bc33efd64c2f3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47132 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 X$AZNRx@dT5=aOa1)-UernEU?$c}$7< From c3a0262518910ae5ab58efae0b57f2f5d9434a73 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 24 Feb 2021 11:46:07 +0200 Subject: [PATCH 28/39] deprecate `Bytes()` for some of types based on byte arrays --- packages/coretypes/agentid.go | 2 +- packages/coretypes/chainid.go | 5 ----- packages/coretypes/contractid.go | 4 ++-- packages/coretypes/coretypes_test.go | 2 +- packages/coretypes/requestid.go | 11 +++-------- packages/vm/taskcontext.go | 2 +- 6 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/coretypes/agentid.go b/packages/coretypes/agentid.go index bbdff08e28..c8295b52b0 100644 --- a/packages/coretypes/agentid.go +++ b/packages/coretypes/agentid.go @@ -92,7 +92,7 @@ func (a AgentID) MustContractID() (ret ContractID) { return } -// Bytes AgentID as byte slice +// Deprecated: use a[:] instead func (a AgentID) Bytes() []byte { return a[:] } diff --git a/packages/coretypes/chainid.go b/packages/coretypes/chainid.go index 5d2eba2ab0..d023e66cf8 100644 --- a/packages/coretypes/chainid.go +++ b/packages/coretypes/chainid.go @@ -48,11 +48,6 @@ func NewRandomChainID() ChainID { return ChainID(address.RandomOfType(address.VersionBLS)) } -// Bytes returns the ChainID as byte slice. -func (chid ChainID) Bytes() []byte { - return chid[:] -} - // String human readable form (base58 encoding) func (chid ChainID) String() string { return address.Address(chid).String() diff --git a/packages/coretypes/contractid.go b/packages/coretypes/contractid.go index 5cbf0055db..fcc676c10d 100644 --- a/packages/coretypes/contractid.go +++ b/packages/coretypes/contractid.go @@ -82,7 +82,7 @@ const ( short_format = "%s..::%s" ) -// Bytes contract ID as byte slice +// Deprecated: use scid[:] instead func (scid ContractID) Bytes() []byte { return scid[:] } @@ -97,7 +97,7 @@ func (scid ContractID) Short() string { return fmt.Sprintf(short_format, scid.ChainID().String()[:8], scid.Hname().String()) } -// Read from reated +// Read from reader func (scid *ContractID) Read(r io.Reader) error { n, err := r.Read(scid[:]) if err != nil { diff --git a/packages/coretypes/coretypes_test.go b/packages/coretypes/coretypes_test.go index 214927e244..6c49bd198f 100644 --- a/packages/coretypes/coretypes_test.go +++ b/packages/coretypes/coretypes_test.go @@ -63,7 +63,7 @@ func TestRequestID(t *testing.T) { t.Logf("reqid = %s", reqid.String()) t.Logf("reqidShort = %s", reqid.Short()) - reqidback, err := NewRequestIDFromBytes(reqid.Bytes()) + reqidback, err := NewRequestIDFromBytes(reqid[:]) assert.NoError(t, err) assert.EqualValues(t, reqid, reqidback) diff --git a/packages/coretypes/requestid.go b/packages/coretypes/requestid.go index 683e418b64..c1ceff4570 100644 --- a/packages/coretypes/requestid.go +++ b/packages/coretypes/requestid.go @@ -44,12 +44,7 @@ func NewRequestIDFromBytes(data []byte) (ret RequestID, err error) { return } -// Bytes returns requestID as a byte slice -func (rid *RequestID) Bytes() []byte { - return rid[:] -} - -// TransactionID of the request ID +// TransactionID of the request ID (copy) func (rid *RequestID) TransactionID() *valuetransaction.ID { var ret valuetransaction.ID copy(ret[:], rid[:valuetransaction.IDLength]) @@ -62,7 +57,7 @@ func (rid *RequestID) Index() uint16 { } func (rid *RequestID) Write(w io.Writer) error { - _, err := w.Write(rid.Bytes()) + _, err := w.Write(rid[:]) return err } @@ -83,7 +78,7 @@ func (rid *RequestID) String() string { } func (rid *RequestID) Base58() string { - return base58.Encode(rid.Bytes()) + return base58.Encode(rid[:]) } func (rid *RequestID) Short() string { diff --git a/packages/vm/taskcontext.go b/packages/vm/taskcontext.go index b48ad5cb15..570a4d2a46 100644 --- a/packages/vm/taskcontext.go +++ b/packages/vm/taskcontext.go @@ -44,7 +44,7 @@ type VMTask struct { func BatchHash(reqids []coretypes.RequestID, ts int64, leaderIndex uint16) hashing.HashValue { var buf bytes.Buffer for i := range reqids { - buf.Write(reqids[i].Bytes()) + buf.Write(reqids[i][:]) } _ = util.WriteInt64(&buf, ts) _ = util.WriteUint16(&buf, leaderIndex) From d42a0a8e5ccb6a84f142a10cdb32871613b73996 Mon Sep 17 00:00:00 2001 From: joleeee Date: Wed, 24 Feb 2021 15:49:33 +0100 Subject: [PATCH 29/39] 03.md Tutorial minor fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit totorial → tutorial wasp-pack → wasm-pack --- articles/tutorial/03.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/articles/tutorial/03.md b/articles/tutorial/03.md index e0b413a473..b72da748bb 100644 --- a/articles/tutorial/03.md +++ b/articles/tutorial/03.md @@ -52,7 +52,7 @@ We assume you already have Rust and `wasm-pack` [installed](https://rustwasm.git We will be using the examples located in the `wasp repository` at [articles/tutorial/example-tutorial](example-tutorial) directory. -The `example-totorial` smart contract is a simple smart contract which stores a string in its state upon request and allows to +The `example-tutorial` smart contract is a simple smart contract which stores a string in its state upon request and allows to retrieve the stored string by calling a view. The smart contract also implements an entry point which allows the creator of the smart contract instance to withdraw all iotas contained in the smart contract's account on the chain. @@ -115,7 +115,7 @@ fn withdraw_iota(ctx: &ScFuncContext) { } } ``` -Running the `wasp-pack build` command will produce something like this: +Running the `wasm-pack build` command will produce something like this: ``` [INFO]: Checking for the Wasm target... [INFO]: Compiling to Wasm... @@ -130,4 +130,4 @@ Running the `wasp-pack build` command will produce something like this: The 30KB file `example_tutorial_bg.wasm` is the binary of the smart contract. We will be using it in further examples. The file contains everything needed to deploy the smart contract on a chain run by the Wasp network. -Next: [Deploying and running Rust smart contract](04.md) \ No newline at end of file +Next: [Deploying and running Rust smart contract](04.md) From 2b63e28195378c538b40e724328b8946f43a7f94 Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 24 Feb 2021 17:05:55 +0200 Subject: [PATCH 30/39] deleted deprecated methods --- contracts/native/ignore/fairroulette/impl.go | 4 ++-- packages/coretypes/agentid.go | 8 ++------ packages/coretypes/contractid.go | 9 ++------- packages/coretypes/requestid.go | 2 +- packages/vm/core/accounts/impl.go | 18 +++++++++--------- packages/vm/core/root/impl.go | 4 ++-- packages/vm/core/root/internal.go | 10 ++++++---- .../vm/core/testcore/sbtests/misc_call_test.go | 4 ++-- .../vm/core/testcore/sbtests/sbtestsc/impl.go | 4 ++-- packages/vm/wasmproc/sccontext.go | 13 +++++++++---- tools/wasp-cli/chain/accounts.go | 2 +- tools/wasp-cli/util/types.go | 2 +- 12 files changed, 39 insertions(+), 41 deletions(-) diff --git a/contracts/native/ignore/fairroulette/impl.go b/contracts/native/ignore/fairroulette/impl.go index e543081571..ae09788056 100644 --- a/contracts/native/ignore/fairroulette/impl.go +++ b/contracts/native/ignore/fairroulette/impl.go @@ -544,7 +544,7 @@ func (ps *PlayerStats) String() string { func withPlayerStats(ctx coretypes.Sandbox, player *coretypes.AgentID, f func(ps *PlayerStats)) error { statsDict := collections.NewMap(ctx.State(), StateVarPlayerStats) - b := statsDict.MustGetAt(player.Bytes()) + b := statsDict.MustGetAt(player[:]) stats, err := DecodePlayerStats(b) if err != nil { return err @@ -552,7 +552,7 @@ func withPlayerStats(ctx coretypes.Sandbox, player *coretypes.AgentID, f func(ps f(stats) - statsDict.MustSetAt(player.Bytes(), encodePlayerStats(stats)) + statsDict.MustSetAt(player[:], encodePlayerStats(stats)) return nil } diff --git a/packages/coretypes/agentid.go b/packages/coretypes/agentid.go index c8295b52b0..8c8ee4e052 100644 --- a/packages/coretypes/agentid.go +++ b/packages/coretypes/agentid.go @@ -92,17 +92,13 @@ func (a AgentID) MustContractID() (ret ContractID) { return } -// Deprecated: use a[:] instead -func (a AgentID) Bytes() []byte { - return a[:] -} - // String human readable string func (a AgentID) String() string { if a.IsAddress() { return "A/" + a.MustAddress().String() } - return "C/" + a.MustContractID().String() + cid := a.MustContractID() + return "C/" + cid.String() } // NewAgentIDFromString parses the human-readable string representation diff --git a/packages/coretypes/contractid.go b/packages/coretypes/contractid.go index fcc676c10d..7dbeb4a050 100644 --- a/packages/coretypes/contractid.go +++ b/packages/coretypes/contractid.go @@ -82,18 +82,13 @@ const ( short_format = "%s..::%s" ) -// Deprecated: use scid[:] instead -func (scid ContractID) Bytes() []byte { - return scid[:] -} - // String human readable representation of the contract ID :: -func (scid ContractID) String() string { +func (scid *ContractID) String() string { return fmt.Sprintf(long_format, scid.ChainID().String(), scid.Hname().String()) } // Short human readable representation in short form -func (scid ContractID) Short() string { +func (scid *ContractID) Short() string { return fmt.Sprintf(short_format, scid.ChainID().String()[:8], scid.Hname().String()) } diff --git a/packages/coretypes/requestid.go b/packages/coretypes/requestid.go index c1ceff4570..d72aaf5e2e 100644 --- a/packages/coretypes/requestid.go +++ b/packages/coretypes/requestid.go @@ -85,7 +85,7 @@ func (rid *RequestID) Short() string { return rid.String()[:8] + ".." } -func (rid RequestID) MarshalJSON() ([]byte, error) { +func (rid *RequestID) MarshalJSON() ([]byte, error) { return json.Marshal(rid.Base58()) } diff --git a/packages/vm/core/accounts/impl.go b/packages/vm/core/accounts/impl.go index 9b44574b7b..7c889c50b2 100644 --- a/packages/vm/core/accounts/impl.go +++ b/packages/vm/core/accounts/impl.go @@ -57,8 +57,7 @@ func deposit(ctx coretypes.Sandbox) (dict.Dict, error) { // funds currently are at the disposition of accounts, they are moved to the target succ := MoveBetweenAccounts(state, coretypes.NewAgentIDFromContractID(ctx.ContractID()), targetAgentID, ctx.IncomingTransfer()) - assert.NewAssert(ctx.Log()).Require(succ, - "internal error: failed to deposit to %s", ctx.Caller().String()) + assert.NewAssert(ctx.Log()).Require(succ, "internal error: failed to deposit to %s", ctx.Caller().String()) ctx.Log().Debugf("accounts.deposit.success: target: %s\n%s", targetAgentID, ctx.IncomingTransfer().String()) return nil, nil @@ -73,22 +72,22 @@ func withdrawToAddress(ctx coretypes.Sandbox) (dict.Dict, error) { a := assert.NewAssert(ctx.Log()) - caller := ctx.Caller() - a.Require(caller.IsAddress(), "caller must be an address") + a.Require(ctx.Caller().IsAddress(), "caller must be an address") - bals, ok := GetAccountBalances(state, caller) + bals, ok := GetAccountBalances(state, ctx.Caller()) if !ok { // empty balance, nothing to withdraw return nil, nil } + cid := ctx.ContractID() ctx.Log().Debugf("accounts.withdrawToAddress.begin: caller agentID: %s myContractId: %s", - caller.String(), ctx.ContractID().String()) + ctx.Caller().String(), cid.String()) sendTokens := cbalances.NewFromMap(bals) - addr := caller.MustAddress() + addr := ctx.Caller().MustAddress() // remove tokens from the chain ledger - a.Require(DebitFromAccount(state, caller, sendTokens), + a.Require(DebitFromAccount(state, ctx.Caller(), sendTokens), "accounts.withdrawToAddress.inconsistency. failed to remove tokens from the chain") // send tokens to address a.Require(ctx.TransferToAddress(addr, sendTokens), @@ -108,8 +107,9 @@ func withdrawToChain(ctx coretypes.Sandbox) (dict.Dict, error) { a := assert.NewAssert(ctx.Log()) caller := ctx.Caller() + cid := ctx.ContractID() ctx.Log().Debugf("accounts.withdrawToChain.begin: caller agentID: %s myContractId: %s", - caller.String(), ctx.ContractID().String()) + caller.String(), cid.String()) a.Require(!caller.IsAddress(), "caller must be a smart contract") diff --git a/packages/vm/core/root/impl.go b/packages/vm/core/root/impl.go index 3dc4e0c0bb..d10896a61e 100644 --- a/packages/vm/core/root/impl.go +++ b/packages/vm/core/root/impl.go @@ -320,7 +320,7 @@ func grantDeployPermission(ctx coretypes.Sandbox) (dict.Dict, error) { params := kvdecoder.New(ctx.Params(), ctx.Log()) deployer := params.MustGetAgentID(ParamDeployer) - collections.NewMap(ctx.State(), VarDeployPermissions).MustSetAt(deployer.Bytes(), []byte{0xFF}) + collections.NewMap(ctx.State(), VarDeployPermissions).MustSetAt(deployer[:], []byte{0xFF}) ctx.Event(fmt.Sprintf("[grant deploy permission] to agentID: %s", deployer)) return nil, nil } @@ -335,7 +335,7 @@ func revokeDeployPermission(ctx coretypes.Sandbox) (dict.Dict, error) { params := kvdecoder.New(ctx.Params(), ctx.Log()) deployer := params.MustGetAgentID(ParamDeployer) - collections.NewMap(ctx.State(), VarDeployPermissions).MustDelAt(deployer.Bytes()) + collections.NewMap(ctx.State(), VarDeployPermissions).MustDelAt(deployer[:]) ctx.Event(fmt.Sprintf("[revoke deploy permission] from agentID: %s", deployer)) return nil, nil } diff --git a/packages/vm/core/root/internal.go b/packages/vm/core/root/internal.go index 34a0d3115b..865d6465a9 100644 --- a/packages/vm/core/root/internal.go +++ b/packages/vm/core/root/internal.go @@ -153,13 +153,15 @@ func storeAndInitContract(ctx coretypes.Sandbox, rec *ContractRecord, initParams // isAuthorizedToDeploy checks if caller is authorized to deploy smart contract func isAuthorizedToDeploy(ctx coretypes.Sandbox) bool { - if ctx.Caller() == ctx.ChainOwnerID() { + caller := ctx.Caller() + if caller == ctx.ChainOwnerID() { // chain owner is always authorized return true } - if !ctx.Caller().IsAddress() { + if !caller.IsAddress() { // smart contract from the same chain is always authorize - return ctx.Caller().MustContractID().ChainID() == ctx.ContractID().ChainID() + return caller.MustContractID().ChainID() == ctx.ContractID().ChainID() } - return collections.NewMap(ctx.State(), VarDeployPermissions).MustHasAt(ctx.Caller().Bytes()) + + return collections.NewMap(ctx.State(), VarDeployPermissions).MustHasAt(caller[:]) } diff --git a/packages/vm/core/testcore/sbtests/misc_call_test.go b/packages/vm/core/testcore/sbtests/misc_call_test.go index 1d6968ab91..1d8d21f046 100644 --- a/packages/vm/core/testcore/sbtests/misc_call_test.go +++ b/packages/vm/core/testcore/sbtests/misc_call_test.go @@ -18,7 +18,7 @@ func testChainOwnerIDView(t *testing.T, w bool) { c := ret.MustGet(sbtestsc.ParamChainOwnerID) - require.EqualValues(t, chain.OriginatorAgentID.Bytes(), c) + require.EqualValues(t, chain.OriginatorAgentID[:], c) } func TestChainOwnerIDFull(t *testing.T) { run2(t, testChainOwnerIDFull) } @@ -31,7 +31,7 @@ func testChainOwnerIDFull(t *testing.T, w bool) { require.NoError(t, err) c := ret.MustGet(sbtestsc.ParamChainOwnerID) - require.EqualValues(t, chain.OriginatorAgentID.Bytes(), c) + require.EqualValues(t, chain.OriginatorAgentID[:], c) } func TestContractIDView(t *testing.T) { run2(t, testContractIDView) } diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/impl.go b/packages/vm/core/testcore/sbtests/sbtestsc/impl.go index 176e48db59..c0d0589b85 100644 --- a/packages/vm/core/testcore/sbtests/sbtestsc/impl.go +++ b/packages/vm/core/testcore/sbtests/sbtestsc/impl.go @@ -37,7 +37,7 @@ func testEventLogEventData(ctx coretypes.Sandbox) (dict.Dict, error) { func testChainOwnerIDView(ctx coretypes.SandboxView) (dict.Dict, error) { cOwnerID := ctx.ChainOwnerID() ret := dict.New() - ret.Set(ParamChainOwnerID, cOwnerID.Bytes()) + ret.Set(ParamChainOwnerID, cOwnerID[:]) return ret, nil } @@ -45,7 +45,7 @@ func testChainOwnerIDView(ctx coretypes.SandboxView) (dict.Dict, error) { func testChainOwnerIDFull(ctx coretypes.Sandbox) (dict.Dict, error) { cOwnerID := ctx.ChainOwnerID() ret := dict.New() - ret.Set(ParamChainOwnerID, cOwnerID.Bytes()) + ret.Set(ParamChainOwnerID, cOwnerID[:]) return ret, nil } diff --git a/packages/vm/wasmproc/sccontext.go b/packages/vm/wasmproc/sccontext.go index 34f99f2326..4d742dcbfa 100644 --- a/packages/vm/wasmproc/sccontext.go +++ b/packages/vm/wasmproc/sccontext.go @@ -62,15 +62,20 @@ func (o *ScContext) Exists(keyId int32, typeId int32) bool { } func (o *ScContext) GetBytes(keyId int32, typeId int32) []byte { + var aid coretypes.AgentID switch keyId { case wasmhost.KeyCaller: - return o.vm.ctx.Caller().Bytes() + aid = o.vm.ctx.Caller() + return aid[:] case wasmhost.KeyChainOwnerId: - return o.vm.chainOwnerID().Bytes() + aid = o.vm.chainOwnerID() + return aid[:] case wasmhost.KeyContractCreator: - return o.vm.contractCreator().Bytes() + aid = o.vm.contractCreator() + return aid[:] case wasmhost.KeyContractId: - return o.vm.contractID().Bytes() + cid := o.vm.contractID() + return cid[:] case wasmhost.KeyTimestamp: return codec.EncodeInt64(o.vm.ctx.GetTimestamp()) } diff --git a/tools/wasp-cli/chain/accounts.go b/tools/wasp-cli/chain/accounts.go index d6ec802fb4..c57304968d 100644 --- a/tools/wasp-cli/chain/accounts.go +++ b/tools/wasp-cli/chain/accounts.go @@ -41,7 +41,7 @@ func balanceCmd(args []string) { log.Check(err) ret, err := SCClient(accounts.Interface.Hname()).CallView(accounts.FuncBalance, dict.FromGoMap(map[kv.Key][]byte{ - accounts.ParamAgentID: agentID.Bytes(), + accounts.ParamAgentID: agentID[:], })) log.Check(err) diff --git a/tools/wasp-cli/util/types.go b/tools/wasp-cli/util/types.go index cd0141289a..d23cf5c495 100644 --- a/tools/wasp-cli/util/types.go +++ b/tools/wasp-cli/util/types.go @@ -23,7 +23,7 @@ func ValueFromString(vtype string, s string) []byte { case "agentid": agentid, err := coretypes.NewAgentIDFromString(s) log.Check(err) - return agentid.Bytes() + return agentid[:] case "file": return ReadFile(s) case "string": From 53a47d57d1b0d76888d9778ec2b8f923ad07d595 Mon Sep 17 00:00:00 2001 From: Jonas Elvedal Hole Date: Wed, 24 Feb 2021 16:41:23 +0100 Subject: [PATCH 31/39] add shell cp (eq. to cp.bat) --- articles/tutorial/example-tutorial/cp | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 articles/tutorial/example-tutorial/cp diff --git a/articles/tutorial/example-tutorial/cp b/articles/tutorial/example-tutorial/cp new file mode 100755 index 0000000000..8ab0c37074 --- /dev/null +++ b/articles/tutorial/example-tutorial/cp @@ -0,0 +1,2 @@ +#!/usr/bin/sh +cp pkg/example_tutorial_bg.wasm test From 1e3529d052340a93c7a3492dcaf098062944c5e4 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Wed, 24 Feb 2021 09:22:38 -0800 Subject: [PATCH 32/39] Fixed comment to suggestion --- packages/vm/sandbox/sandbox.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vm/sandbox/sandbox.go b/packages/vm/sandbox/sandbox.go index 56da1ff40f..46259d2a83 100644 --- a/packages/vm/sandbox/sandbox.go +++ b/packages/vm/sandbox/sandbox.go @@ -75,7 +75,7 @@ func (s *sandbox) RequestID() coretypes.RequestID { return s.vmctx.RequestID() } -// note: MintedColor() is RequestID().Bytes()[:32] +// note: MintedColor() is RequestID().TransactionID() func (s *sandbox) MintedSupply() int64 { return s.vmctx.NumFreeMinted() } From e90be944407224a0c3cdf2c67b6f5e0c445a06c5 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Wed, 24 Feb 2021 14:43:56 -0800 Subject: [PATCH 33/39] Make post() use parameters just like call(), also added post_self() --- contracts/rust/fairauction/src/fairauction.rs | 8 +---- .../rust/fairroulette/src/fairroulette.rs | 16 ++-------- contracts/rust/inccounter/src/inccounter.rs | 29 +++-------------- contracts/rust/testcore/src/testcore.rs | 10 ++---- contracts/rust/wasmlib/src/context.rs | 32 ++++++++----------- go.mod | 1 - go.sum | 5 --- 7 files changed, 23 insertions(+), 78 deletions(-) diff --git a/contracts/rust/fairauction/src/fairauction.rs b/contracts/rust/fairauction/src/fairauction.rs index b83d5a928c..fbce70b521 100644 --- a/contracts/rust/fairauction/src/fairauction.rs +++ b/contracts/rust/fairauction/src/fairauction.rs @@ -223,13 +223,7 @@ pub fn func_start_auction(ctx: &ScFuncContext) { let finalize_params = ScMutableMap::new(); finalize_params.get_color(VAR_COLOR).set_value(&auction.color); - ctx.post(&PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_FINALIZE_AUCTION, - params: Some(finalize_params), - transfer: None, - delay: duration * 60, - }); + ctx.post_self(HFUNC_FINALIZE_AUCTION, Some(finalize_params), None, duration * 60); ctx.log("fairauction.startAuction ok"); } diff --git a/contracts/rust/fairroulette/src/fairroulette.rs b/contracts/rust/fairroulette/src/fairroulette.rs index f73c7f1fef..9493c5b2ce 100644 --- a/contracts/rust/fairroulette/src/fairroulette.rs +++ b/contracts/rust/fairroulette/src/fairroulette.rs @@ -25,13 +25,7 @@ pub fn func_lock_bets(ctx: &ScFuncContext) { } bets.clear(); - ctx.post(&PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_PAY_WINNERS, - params: None, - transfer: None, - delay: 0, - }); + ctx.post_self(HFUNC_PAY_WINNERS, None, None, 0); ctx.log("fairroulette.lockBets ok"); } @@ -124,13 +118,7 @@ pub fn func_place_bet(ctx: &ScFuncContext) { if play_period < 10 { play_period = DEFAULT_PLAY_PERIOD; } - ctx.post(&PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_LOCK_BETS, - params: None, - transfer: None, - delay: play_period, - }); + ctx.post_self(HFUNC_LOCK_BETS, None, None, play_period); } ctx.log("fairroulette.placeBet ok"); } diff --git a/contracts/rust/inccounter/src/inccounter.rs b/contracts/rust/inccounter/src/inccounter.rs index ae95b93a8e..5e36fc0ba3 100644 --- a/contracts/rust/inccounter/src/inccounter.rs +++ b/contracts/rust/inccounter/src/inccounter.rs @@ -57,19 +57,12 @@ pub fn func_local_state_post(ctx: &ScFuncContext) { unsafe { LOCAL_STATE_MUST_INCREMENT = false; } - let request = PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_WHEN_MUST_INCREMENT, - params: None, - transfer: None, - delay: 0, - }; - ctx.post(&request); + ctx.post_self(HFUNC_WHEN_MUST_INCREMENT, None, None, 0); unsafe { LOCAL_STATE_MUST_INCREMENT = true; } - ctx.post(&request); - ctx.post(&request); + ctx.post_self(HFUNC_WHEN_MUST_INCREMENT, None, None, 0); + ctx.post_self(HFUNC_WHEN_MUST_INCREMENT, None, None, 0); // counter ends up as 0 } @@ -91,13 +84,7 @@ pub fn func_post_increment(ctx: &ScFuncContext) { let value = counter.value(); counter.set_value(value + 1); if value == 0 { - ctx.post(&PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_POST_INCREMENT, - params: None, - transfer: None, - delay: 0, - }); + ctx.post_self(HFUNC_POST_INCREMENT, None, None, 0); } } @@ -117,13 +104,7 @@ pub fn func_repeat_many(ctx: &ScFuncContext) { } } state_repeats.set_value(repeats - 1); - ctx.post(&PostRequestParams { - contract_id: ctx.contract_id(), - function: HFUNC_REPEAT_MANY, - params: None, - transfer: None, - delay: 0, - }); + ctx.post_self(HFUNC_REPEAT_MANY, None, None, 0); } pub fn func_when_must_increment(ctx: &ScFuncContext) { diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index 34ca654de8..4118603c12 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -238,13 +238,7 @@ pub fn func_withdraw_to_chain(ctx: &ScFuncContext) { //Deploy the same contract with another name let target_contract_id = ScContractId::new(¶m_chain_id.value(), &CORE_ACCOUNTS); let transfers = ScTransfers::new(&ScColor::IOTA, 2); - ctx.post(&PostRequestParams { - contract_id: target_contract_id, - function: CORE_ACCOUNTS_FUNC_WITHDRAW_TO_CHAIN, - params: None, - transfer: Some(transfers), - delay: 0, - }); + ctx.post(&target_contract_id, CORE_ACCOUNTS_FUNC_WITHDRAW_TO_CHAIN, None, Some(transfers), 0); // TODO how to check if post was successful ctx.log("testcore.withdrawToChain ok"); } @@ -296,7 +290,7 @@ pub fn view_fibonacci(ctx: &ScViewContext) { pub fn func_inc_counter(ctx: &ScFuncContext) { ctx.log("testcore.incCounter"); - ctx.state().get_int(VAR_COUNTER).set_value(ctx.state().get_int(VAR_COUNTER).value()+1); + ctx.state().get_int(VAR_COUNTER).set_value(ctx.state().get_int(VAR_COUNTER).value() + 1); ctx.log("testcore.incCounter ok"); } diff --git a/contracts/rust/wasmlib/src/context.rs b/contracts/rust/wasmlib/src/context.rs index 5772fae170..a3d87ad7e7 100644 --- a/contracts/rust/wasmlib/src/context.rs +++ b/contracts/rust/wasmlib/src/context.rs @@ -12,17 +12,6 @@ use crate::mutable::*; // all access to the objects in host's object tree starts here pub(crate) static ROOT: ScMutableMap = ScMutableMap { obj_id: 1 }; -// parameter structure required for ctx.post() -pub struct PostRequestParams { - //@formatter:off - pub contract_id: ScContractId, // full contract id (chain id + contract Hname) - pub function: ScHname, // Hname of the contract func or view to call - pub params: Option, // an optional map of parameters to pass to the function - pub transfer: Option, // optional balances to transfer as part of the call - pub delay: i64, // delay in seconds before the function will be run - //@formatter:on -} - // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // used to retrieve any information that is related to colored token balances @@ -318,26 +307,31 @@ impl ScFuncContext { ROOT.get_int(&KEY_MINTED).value() } - // posts a request to asynchronously invoke the specified smart - // contract function according to the specified request parameters - pub fn post(&self, req: &PostRequestParams) { + // asynchronously calls the specified smart contract function, + // passing the provided parameters and token transfers to it + pub fn post(&self, contract_id: &ScContractId, function: ScHname, params: Option, transfer: Option, delay: i64) { let mut encode = BytesEncoder::new(); - encode.contract_id(&req.contract_id); - encode.hname(&req.function); - if let Some(params) = &req.params { + encode.contract_id(contract_id); + encode.hname(&function); + if let Some(params) = ¶ms { encode.int(params.obj_id as i64); } else { encode.int(0); } - if let Some(transfer) = &req.transfer { + if let Some(transfer) = &transfer { encode.int(transfer.transfers.obj_id as i64); } else { encode.int(0); } - encode.int(req.delay); + encode.int(delay); ROOT.get_bytes(&KEY_POST).set_value(&encode.data()); } + // shorthand to asynchronously call a smart contract function on the current contract + pub fn post_self(&self, function: ScHname, params: Option, transfer: Option, delay: i64) { + self.post(&self.contract_id(), function, params, transfer, delay); + } + // retrieve the request id of this transaction fn request_id(&self) -> ScRequestId { ROOT.get_request_id(&KEY_REQUEST_ID).value() diff --git a/go.mod b/go.mod index 06f2ed5d27..699ae4925d 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,6 @@ require ( github.com/prometheus/common v0.10.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.7.0 - github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a github.com/stretchr/testify v1.6.1 go.dedis.ch/kyber/v3 v3.0.13 go.nanomsg.org/mangos/v3 v3.0.1 diff --git a/go.sum b/go.sum index 1b5d7d8c40..180a4c0147 100644 --- a/go.sum +++ b/go.sum @@ -386,13 +386,8 @@ github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:q github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/iotaledger/goshimmer v0.3.6-0.20210210201606-a80a3b2bdedf h1:UNcnYhH33M1PLIs+oJVcAAAHE6+YIdiM+ZA1+9/1P/M= -github.com/iotaledger/goshimmer v0.3.6-0.20210210201606-a80a3b2bdedf/go.mod h1:vLuGalqrZr51rdv9azuAUhpFLW0SCmIqklM9+CQZ/UM= github.com/iotaledger/goshimmer v0.3.7-0.20210214081859-29e3f77b4364 h1:eC+xYe4bOaEoUGYZUbRNTszW3FOueFtA1k49jvQTh+E= github.com/iotaledger/goshimmer v0.3.7-0.20210214081859-29e3f77b4364/go.mod h1:/2GYDt8T5I0rpSlN4paaNOuaJsinuTqk8xuwD4XvQM8= -github.com/iotaledger/hive.go v0.0.0-20210107100912-23832b944f60/go.mod h1:dFt9vuTF3FdDPx7ve+uSDiNrX2PW2eV8sq7N06jeaFw= -github.com/iotaledger/hive.go v0.0.0-20210125215505-ab692478030f h1:/H96EjsLzfyd097BaVwrJ/EUACz+TNe7+r4IPpNRDJg= -github.com/iotaledger/hive.go v0.0.0-20210125215505-ab692478030f/go.mod h1:dFt9vuTF3FdDPx7ve+uSDiNrX2PW2eV8sq7N06jeaFw= github.com/iotaledger/hive.go v0.0.0-20210209113323-87572778f0d9 h1:6mIpbk58DNc0LvYhds4scw0M2Z5F+lGU2ZUqiyNqawA= github.com/iotaledger/hive.go v0.0.0-20210209113323-87572778f0d9/go.mod h1:dFt9vuTF3FdDPx7ve+uSDiNrX2PW2eV8sq7N06jeaFw= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= From 0862b13b00ac9b7e41a72e7bcab6faa594aecbe2 Mon Sep 17 00:00:00 2001 From: Eric Hop Date: Wed, 24 Feb 2021 21:03:50 -0800 Subject: [PATCH 34/39] Renamed Int Int64 --- contracts/rust/dividend/src/dividend.rs | 6 +- contracts/rust/dividend/src/types.rs | 4 +- .../src/donatewithfeedback.rs | 18 +++--- .../rust/donatewithfeedback/src/types.rs | 8 +-- contracts/rust/erc20/src/erc20.rs | 36 +++++------ contracts/rust/fairauction/src/fairauction.rs | 26 ++++---- contracts/rust/fairauction/src/types.rs | 40 ++++++------- .../rust/fairauction/test/fairauction_bg.wasm | Bin 42222 -> 42181 bytes .../rust/fairroulette/src/fairroulette.rs | 10 ++-- contracts/rust/fairroulette/src/types.rs | 8 +-- .../fairroulette/test/fairroulette_bg.wasm | Bin 36627 -> 36533 bytes contracts/rust/inccounter/src/inccounter.rs | 24 ++++---- .../rust/inccounter/test/inccounter_bg.wasm | Bin 31433 -> 31242 bytes contracts/rust/testcore/src/testcore.rs | 56 +++++++++--------- contracts/rust/tokenregistry/src/types.rs | 12 ++-- .../tokenregistry/test/tokenregistry_bg.wasm | Bin 32261 -> 32165 bytes contracts/rust/wasmlib/src/bytes.rs | 8 +-- contracts/rust/wasmlib/src/context.rs | 48 +++++++-------- contracts/rust/wasmlib/src/host.rs | 6 +- contracts/rust/wasmlib/src/immutable.rs | 28 ++++----- contracts/rust/wasmlib/src/mutable.rs | 34 +++++------ .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47132 -> 47041 bytes packages/vm/wasmhost/kvstorehost.go | 2 +- packages/vm/wasmproc/bytes.go | 8 +-- packages/vm/wasmproc/sccontext.go | 16 ++--- packages/vm/wasmproc/scutility.go | 8 +-- tools/cluster/tests/wasm/inccounter_bg.wasm | Bin 31433 -> 31242 bytes 27 files changed, 203 insertions(+), 203 deletions(-) diff --git a/contracts/rust/dividend/src/dividend.rs b/contracts/rust/dividend/src/dividend.rs index 808e97f230..d87bb32d82 100644 --- a/contracts/rust/dividend/src/dividend.rs +++ b/contracts/rust/dividend/src/dividend.rs @@ -13,7 +13,7 @@ pub fn func_divide(ctx: &ScFuncContext) { ctx.panic("Nothing to divide"); } let state = ctx.state(); - let total_factor = state.get_int(VAR_TOTAL_FACTOR); + let total_factor = state.get_int64(VAR_TOTAL_FACTOR); let total = total_factor.value(); let members = state.get_bytes_array(VAR_MEMBERS); let mut parts = 0_i64; @@ -43,7 +43,7 @@ pub fn func_member(ctx: &ScFuncContext) { let p = ctx.params(); let address = p.get_address(PARAM_ADDRESS); - let factor = p.get_int(PARAM_FACTOR); + let factor = p.get_int64(PARAM_FACTOR); ctx.require(address.exists(), "missing mandatory address"); ctx.require(factor.exists(), "missing mandatory factor"); let member = Member { @@ -51,7 +51,7 @@ pub fn func_member(ctx: &ScFuncContext) { factor: factor.value(), }; let state = ctx.state(); - let total_factor = state.get_int(VAR_TOTAL_FACTOR); + let total_factor = state.get_int64(VAR_TOTAL_FACTOR); let mut total = total_factor.value(); let members = state.get_bytes_array(VAR_MEMBERS); let size = members.length(); diff --git a/contracts/rust/dividend/src/types.rs b/contracts/rust/dividend/src/types.rs index 57f06abed9..ee037c9035 100644 --- a/contracts/rust/dividend/src/types.rs +++ b/contracts/rust/dividend/src/types.rs @@ -15,14 +15,14 @@ impl Member { let mut decode = BytesDecoder::new(bytes); Member { address: decode.address(), - factor: decode.int(), + factor: decode.int64(), } } pub fn to_bytes(&self) -> Vec { let mut encode = BytesEncoder::new(); encode.address(&self.address); - encode.int(self.factor); + encode.int64(self.factor); return encode.data(); } } diff --git a/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs b/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs index 9c22503e35..3176f02d5a 100644 --- a/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs +++ b/contracts/rust/donatewithfeedback/src/donatewithfeedback.rs @@ -27,8 +27,8 @@ pub fn func_donate(ctx: &ScFuncContext) { let log = state.get_bytes_array(VAR_LOG); log.get_bytes(log.length()).set_value(&donation.to_bytes()); - let largest_donation = state.get_int(VAR_MAX_DONATION); - let total_donated = state.get_int(VAR_TOTAL_DONATION); + let largest_donation = state.get_int64(VAR_MAX_DONATION); + let total_donated = state.get_int64(VAR_TOTAL_DONATION); if donation.amount > largest_donation.value() { largest_donation.set_value(donation.amount); } @@ -44,7 +44,7 @@ pub fn func_withdraw(ctx: &ScFuncContext) { let balance = ctx.balances().balance(&ScColor::IOTA); let p = ctx.params(); - let mut amount = p.get_int(PARAM_AMOUNT).value(); + let mut amount = p.get_int64(PARAM_AMOUNT).value(); if amount == 0 || amount > balance { amount = balance; } @@ -63,22 +63,22 @@ pub fn view_donations(ctx: &ScViewContext) { ctx.log("dwf.donations"); let state = ctx.state(); - let largest_donation = state.get_int(VAR_MAX_DONATION); - let total_donated = state.get_int(VAR_TOTAL_DONATION); + let largest_donation = state.get_int64(VAR_MAX_DONATION); + let total_donated = state.get_int64(VAR_TOTAL_DONATION); let log = state.get_bytes_array(VAR_LOG); let results = ctx.results(); - results.get_int(VAR_MAX_DONATION).set_value(largest_donation.value()); - results.get_int(VAR_TOTAL_DONATION).set_value(total_donated.value()); + results.get_int64(VAR_MAX_DONATION).set_value(largest_donation.value()); + results.get_int64(VAR_TOTAL_DONATION).set_value(total_donated.value()); let donations = results.get_map_array(VAR_DONATIONS); let size = log.length(); for i in 0..size { let di = Donation::from_bytes(&log.get_bytes(i).value()); let donation = donations.get_map(i); - donation.get_int(VAR_AMOUNT).set_value(di.amount); + donation.get_int64(VAR_AMOUNT).set_value(di.amount); donation.get_string(VAR_DONATOR).set_value(&di.donator.to_string()); donation.get_string(VAR_ERROR).set_value(&di.error); donation.get_string(VAR_FEEDBACK).set_value(&di.feedback); - donation.get_int(VAR_TIMESTAMP).set_value(di.timestamp); + donation.get_int64(VAR_TIMESTAMP).set_value(di.timestamp); } ctx.log("dwf.donations ok"); diff --git a/contracts/rust/donatewithfeedback/src/types.rs b/contracts/rust/donatewithfeedback/src/types.rs index 339240c55b..c3b8fec5cb 100644 --- a/contracts/rust/donatewithfeedback/src/types.rs +++ b/contracts/rust/donatewithfeedback/src/types.rs @@ -17,21 +17,21 @@ impl Donation { pub fn from_bytes(bytes: &[u8]) -> Donation { let mut decode = BytesDecoder::new(bytes); Donation { - amount: decode.int(), + amount: decode.int64(), donator: decode.agent_id(), error: decode.string(), feedback: decode.string(), - timestamp: decode.int(), + timestamp: decode.int64(), } } pub fn to_bytes(&self) -> Vec { let mut encode = BytesEncoder::new(); - encode.int(self.amount); + encode.int64(self.amount); encode.agent_id(&self.donator); encode.string(&self.error); encode.string(&self.feedback); - encode.int(self.timestamp); + encode.int64(self.timestamp); return encode.data(); } } diff --git a/contracts/rust/erc20/src/erc20.rs b/contracts/rust/erc20/src/erc20.rs index 29b046f28d..01bf6957bf 100644 --- a/contracts/rust/erc20/src/erc20.rs +++ b/contracts/rust/erc20/src/erc20.rs @@ -16,7 +16,7 @@ pub fn func_approve(ctx: &ScFuncContext) { ctx.trace("erc20.approve"); let p = ctx.params(); - let param_amount = p.get_int(PARAM_AMOUNT); + let param_amount = p.get_int64(PARAM_AMOUNT); let param_delegation = p.get_agent_id(PARAM_DELEGATION); ctx.require(param_amount.exists(), "missing mandatory amount"); @@ -28,7 +28,7 @@ pub fn func_approve(ctx: &ScFuncContext) { // all allowances are in the map under the name of he owner let allowances = ctx.state().get_map(&ctx.caller()); - allowances.get_int(&delegation).set_value(amount); + allowances.get_int64(&delegation).set_value(amount); ctx.log("erc20.approve.success"); } @@ -42,20 +42,20 @@ pub fn func_init(ctx: &ScFuncContext) { let p = ctx.params(); let param_creator = p.get_agent_id(PARAM_CREATOR); - let param_supply = p.get_int(PARAM_SUPPLY); + let param_supply = p.get_int64(PARAM_SUPPLY); ctx.require(param_creator.exists(), "missing mandatory creator"); ctx.require(param_supply.exists(), "missing mandatory supply"); let supply = param_supply.value(); ctx.require(supply > 0, "erc20.on_init.fail: wrong 'supply' parameter"); - ctx.state().get_int(VAR_SUPPLY).set_value(supply); + ctx.state().get_int64(VAR_SUPPLY).set_value(supply); // we cannot use 'caller' here because on_init is always called from the 'root' // so, owner of the initial supply must be provided as a parameter PARAM_CREATOR to constructor (on_init) // assign the whole supply to creator let creator = param_creator.value(); - ctx.state().get_map(VAR_BALANCES).get_int(&creator).set_value(supply); + ctx.state().get_map(VAR_BALANCES).get_int64(&creator).set_value(supply); let t = "erc20.on_init.success. Supply: ".to_string() + &supply.to_string() + &", creator:".to_string() + &creator.to_string(); @@ -71,7 +71,7 @@ pub fn func_transfer(ctx: &ScFuncContext) { let p = ctx.params(); let param_account = p.get_agent_id(PARAM_ACCOUNT); - let param_amount = p.get_int(PARAM_AMOUNT); + let param_amount = p.get_int64(PARAM_AMOUNT); ctx.require(param_account.exists(), "missing mandatory account"); ctx.require(param_amount.exists(), "missing mandatory amount"); @@ -80,11 +80,11 @@ pub fn func_transfer(ctx: &ScFuncContext) { ctx.require(amount > 0, "erc20.transfer.fail: wrong 'amount' parameter"); let balances = ctx.state().get_map(VAR_BALANCES); - let source_balance = balances.get_int(&ctx.caller()); + let source_balance = balances.get_int64(&ctx.caller()); ctx.require(source_balance.value() >= amount, "erc20.transfer.fail: not enough funds"); let target_addr = param_account.value(); - let target_balance = balances.get_int(&target_addr); + let target_balance = balances.get_int64(&target_addr); let result = target_balance.value() + amount; ctx.require(result > 0, "erc20.transfer.fail: overflow"); @@ -104,7 +104,7 @@ pub fn func_transfer_from(ctx: &ScFuncContext) { let p = ctx.params(); let param_account = p.get_agent_id(PARAM_ACCOUNT); - let param_amount = p.get_int(PARAM_AMOUNT); + let param_amount = p.get_int64(PARAM_AMOUNT); let param_recipient = p.get_agent_id(PARAM_RECIPIENT); ctx.require(param_account.exists(), "missing mandatory account"); @@ -119,14 +119,14 @@ pub fn func_transfer_from(ctx: &ScFuncContext) { // allowances are in the map under the name of the account let allowances = ctx.state().get_map(&account); - let allowance = allowances.get_int(&recipient); + let allowance = allowances.get_int64(&recipient); ctx.require(allowance.value() >= amount, "erc20.transfer_from.fail: not enough allowance"); let balances = ctx.state().get_map(VAR_BALANCES); - let source_balance = balances.get_int(&account); + let source_balance = balances.get_int64(&account); ctx.require(source_balance.value() >= amount, "erc20.transfer_from.fail: not enough funds"); - let recipient_balance = balances.get_int(&recipient); + let recipient_balance = balances.get_int64(&recipient); let result = recipient_balance.value() + amount; ctx.require(result > 0, "erc20.transfer_from.fail: overflow"); @@ -156,8 +156,8 @@ pub fn view_allowance(ctx: &ScViewContext) { // all allowances of the address 'owner' are stored in the map of the same name let allowances = ctx.state().get_map(¶m_account.value()); - let allow = allowances.get_int(¶m_delegation.value()).value(); - ctx.results().get_int(PARAM_AMOUNT).set_value(allow); + let allow = allowances.get_int64(¶m_delegation.value()).value(); + ctx.results().get_int64(PARAM_AMOUNT).set_value(allow); ctx.trace("erc20.allowance ok"); } @@ -171,8 +171,8 @@ pub fn view_balance_of(ctx: &ScViewContext) { ctx.require(param_account.exists(), "missing mandatory account"); let balances = ctx.state().get_map(VAR_BALANCES); - let balance = balances.get_int(¶m_account.value()).value(); - ctx.results().get_int(PARAM_AMOUNT).set_value(balance); + let balance = balances.get_int64(¶m_account.value()).value(); + ctx.results().get_int64(PARAM_AMOUNT).set_value(balance); ctx.trace("erc20.balanceOf ok"); } @@ -181,7 +181,7 @@ pub fn view_balance_of(ctx: &ScViewContext) { // - PARAM_SUPPLY: i64 pub fn view_total_supply(ctx: &ScViewContext) { ctx.trace("erc20.totalSupply"); - let supply = ctx.state().get_int(VAR_SUPPLY).value(); - ctx.results().get_int(PARAM_SUPPLY).set_value(supply); + let supply = ctx.state().get_int64(VAR_SUPPLY).value(); + ctx.results().get_int64(PARAM_SUPPLY).set_value(supply); ctx.trace("erc20.totalSupply ok"); } diff --git a/contracts/rust/fairauction/src/fairauction.rs b/contracts/rust/fairauction/src/fairauction.rs index fbce70b521..89e729e294 100644 --- a/contracts/rust/fairauction/src/fairauction.rs +++ b/contracts/rust/fairauction/src/fairauction.rs @@ -125,7 +125,7 @@ pub fn func_set_owner_margin(ctx: &ScFuncContext) { ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); let p = ctx.params(); - let param_owner_margin = p.get_int(PARAM_OWNER_MARGIN); + let param_owner_margin = p.get_int64(PARAM_OWNER_MARGIN); ctx.require(param_owner_margin.exists(), "missing mandatory ownerMargin"); @@ -136,7 +136,7 @@ pub fn func_set_owner_margin(ctx: &ScFuncContext) { if owner_margin > OWNER_MARGIN_MAX { owner_margin = OWNER_MARGIN_MAX; } - ctx.state().get_int(VAR_OWNER_MARGIN).set_value(owner_margin); + ctx.state().get_int64(VAR_OWNER_MARGIN).set_value(owner_margin); ctx.log("fairauction.setOwnerMargin ok"); } @@ -145,8 +145,8 @@ pub fn func_start_auction(ctx: &ScFuncContext) { let p = ctx.params(); let param_color = p.get_color(PARAM_COLOR); let param_description = p.get_string(PARAM_DESCRIPTION); - let param_duration = p.get_int(PARAM_DURATION); - let param_minimum_bid = p.get_int(PARAM_MINIMUM_BID); + let param_duration = p.get_int64(PARAM_DURATION); + let param_minimum_bid = p.get_int64(PARAM_MINIMUM_BID); ctx.require(param_color.exists(), "missing mandatory color"); ctx.require(param_minimum_bid.exists(), "missing mandatory minimumBid"); @@ -184,7 +184,7 @@ pub fn func_start_auction(ctx: &ScFuncContext) { } let state = ctx.state(); - let mut owner_margin = state.get_int(VAR_OWNER_MARGIN).value(); + let mut owner_margin = state.get_int64(VAR_OWNER_MARGIN).value(); if owner_margin == 0 { owner_margin = OWNER_MARGIN_DEFAULT; } @@ -246,18 +246,18 @@ pub fn view_get_info(ctx: &ScViewContext) { let results = ctx.results(); results.get_color(VAR_COLOR).set_value(&auction.color); results.get_agent_id(VAR_CREATOR).set_value(&auction.creator); - results.get_int(VAR_DEPOSIT).set_value(auction.deposit); + results.get_int64(VAR_DEPOSIT).set_value(auction.deposit); results.get_string(VAR_DESCRIPTION).set_value(&auction.description); - results.get_int(VAR_DURATION).set_value(auction.duration); - results.get_int(VAR_HIGHEST_BID).set_value(auction.highest_bid); + results.get_int64(VAR_DURATION).set_value(auction.duration); + results.get_int64(VAR_HIGHEST_BID).set_value(auction.highest_bid); results.get_agent_id(VAR_HIGHEST_BIDDER).set_value(&auction.highest_bidder); - results.get_int(VAR_MINIMUM_BID).set_value(auction.minimum_bid); - results.get_int(VAR_NUM_TOKENS).set_value(auction.num_tokens); - results.get_int(VAR_OWNER_MARGIN).set_value(auction.owner_margin); - results.get_int(VAR_WHEN_STARTED).set_value(auction.when_started); + results.get_int64(VAR_MINIMUM_BID).set_value(auction.minimum_bid); + results.get_int64(VAR_NUM_TOKENS).set_value(auction.num_tokens); + results.get_int64(VAR_OWNER_MARGIN).set_value(auction.owner_margin); + results.get_int64(VAR_WHEN_STARTED).set_value(auction.when_started); let bidder_list = current_auction.get_agent_id_array(VAR_BIDDER_LIST); - results.get_int(VAR_BIDDERS).set_value(bidder_list.length() as i64); + results.get_int64(VAR_BIDDERS).set_value(bidder_list.length() as i64); ctx.log("fairauction.getInfo ok"); } diff --git a/contracts/rust/fairauction/src/types.rs b/contracts/rust/fairauction/src/types.rs index f19b73cb7f..c14b2c4635 100644 --- a/contracts/rust/fairauction/src/types.rs +++ b/contracts/rust/fairauction/src/types.rs @@ -25,15 +25,15 @@ impl Auction { Auction { color: decode.color(), creator: decode.agent_id(), - deposit: decode.int(), + deposit: decode.int64(), description: decode.string(), - duration: decode.int(), - highest_bid: decode.int(), + duration: decode.int64(), + highest_bid: decode.int64(), highest_bidder: decode.agent_id(), - minimum_bid: decode.int(), - num_tokens: decode.int(), - owner_margin: decode.int(), - when_started: decode.int(), + minimum_bid: decode.int64(), + num_tokens: decode.int64(), + owner_margin: decode.int64(), + when_started: decode.int64(), } } @@ -41,15 +41,15 @@ impl Auction { let mut encode = BytesEncoder::new(); encode.color(&self.color); encode.agent_id(&self.creator); - encode.int(self.deposit); + encode.int64(self.deposit); encode.string(&self.description); - encode.int(self.duration); - encode.int(self.highest_bid); + encode.int64(self.duration); + encode.int64(self.highest_bid); encode.agent_id(&self.highest_bidder); - encode.int(self.minimum_bid); - encode.int(self.num_tokens); - encode.int(self.owner_margin); - encode.int(self.when_started); + encode.int64(self.minimum_bid); + encode.int64(self.num_tokens); + encode.int64(self.owner_margin); + encode.int64(self.when_started); return encode.data(); } } @@ -66,17 +66,17 @@ impl Bid { pub fn from_bytes(bytes: &[u8]) -> Bid { let mut decode = BytesDecoder::new(bytes); Bid { - amount: decode.int(), - index: decode.int(), - timestamp: decode.int(), + amount: decode.int64(), + index: decode.int64(), + timestamp: decode.int64(), } } pub fn to_bytes(&self) -> Vec { let mut encode = BytesEncoder::new(); - encode.int(self.amount); - encode.int(self.index); - encode.int(self.timestamp); + encode.int64(self.amount); + encode.int64(self.index); + encode.int64(self.timestamp); return encode.data(); } } diff --git a/contracts/rust/fairauction/test/fairauction_bg.wasm b/contracts/rust/fairauction/test/fairauction_bg.wasm index a6fcd7ecb74e24ee3f22bf7c66e1455140f074b1..e743a0772e7c985767d52f7a6de587651e368024 100644 GIT binary patch delta 4622 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 Bet { let mut decode = BytesDecoder::new(bytes); Bet { - amount: decode.int(), + amount: decode.int64(), better: decode.agent_id(), - number: decode.int(), + number: decode.int64(), } } pub fn to_bytes(&self) -> Vec { let mut encode = BytesEncoder::new(); - encode.int(self.amount); + encode.int64(self.amount); encode.agent_id(&self.better); - encode.int(self.number); + encode.int64(self.number); return encode.data(); } } diff --git a/contracts/rust/fairroulette/test/fairroulette_bg.wasm b/contracts/rust/fairroulette/test/fairroulette_bg.wasm index e38b90b1682af1a629fd3df440e61a35b85db458..33a79027b6a58f788f93609e8ee2514d30ea9a57 100644 GIT binary patch delta 2872 zcmZuzeN2_t89&c?-wVjS7Y-Hm@?rCG$Hzq}UYm@|>c{R2WyM7)RE<;-xhRMi6f7WD z1YTr_T1%^(GFzq1x|-CjZZo;rhfA~3Y{}9sHS<5WF3Uc$rAubgWLwhik8Qu_y;p># zA)K%0<2>j0{GR8%`c3)$H>6j@29J{vf`(UL@!DSLOo$FaPKV)KX}K8AF&5|=Wf)lo z$&6eQWC)QVq%<-g6VepYkWvWKltN{CGDW6eXVVj&Jk#U#>Mc~}_pu1t+3@ev$LZPj zRuVROBbpZI^jc5u<8#!tKt~p6;{uh>;c(~30=-VWnkcs4z%)s!{yGg7mhHblFI`z5poy7bJ z#nk}jA5lELyF@8*>QEiE|8;gz*nZWPma{gj(>qt2?C0%lMK$shwq=)lN;1_ID&g%< zrxt~sr(T2jpV(WZ%L0$(9paTe!?JA1)T_ENP-3pP@x?kh;pi~27GyJ<#$sjzvqlX75*kZj~( zr#i0}3OCbveYeoEh9QmiV&LePsYY4#X{hED1;Yu*0hHpomJzs(fS??bTT2X{YD-L< zhU511zhpK)gP8zrhMHVJOGOQICvowoB9oH*nDF{*pJP<$lDZ4 z4%a%;`3RNa$cZli4(bhxQUPB}P^DfJju-$OiLk%RajoGesdHdX>NF$;!(so7g&8iT zw!#qdTAbF#)hYV}76n|gk{t)PmW&;BFlaQJ>?sttFSrRx-5OfD^^a`rQ{((hxO*~a z);VK!p8c+swbII3vU4L7Z!Hgcj z?mrwU*ISJoO97X#-~0IGOA~dU;s%#Cn}ddB)Mf83Qth8l9p)%M=)yVp3b>@Zo%C<3 zBsJD_=IG-HdwU*GHt~9NondCc7PZAwY{`Of(>lg$}RvK9m zY5K^Eppawq>3=kDLC4tC638D%m?6##fxq@-s`njeDa~2-@gQ|h&$bk-X6{v4a9JZm zDYH}hPD>D;e%BJ%Iqv1p2B&5jRrjRSn{mqZB-J6T9`!V`h=ViIa{F&gOtiFQ^f{kr z-Kft%$V^IdNy!^h)B5nf%G`MpAgpB~KbA+u^!0t$859Zr;>1w%y1w-(noUl$1|+?t zukPPVFC`!Bf1jvdf3NLvjCb4i__}REcQ!fK9{t~K>vY4xjT>gj7A4XLM<%D*18**l z<|7=+E}_Rtz_w2$f1LwB5UA})+@Z_q%8G`P9>P>>Wc6zkW>045c$D^nFrOS?>+ z2LL$p#Z@C%QNjPfr~*e86R#Ogc&Qwl>`ogSv{4>R#hHX40j3!!9?;}n{rf{laz}$k zgP%Bff~V)e>yd{uvV_$_<_`j6=BDzHN0p~}&|uIg3jbnY&p z>$@tJ3x`$+-|hMq7`L~38$Q~)dlbIj>fWMv9Nmo7nWO#beR&V>TYH)^IA3a3-|A_7 zxXeD5^rlYTRO;MgyY!m)9(;1*@oFk{EQzWr0ZzQ|1;uxO8Zboz25J&G;NeT(Q>pY>JK{M(`9RMaoLE%Jb>%y`V(RNgcv&U zD~!?pd|2=8KZEz&>)(NsqJgb+T(=JFzze=PP>Yj~2CSvR%i_Y*Stl>99pfZb8Ytl` zq=H=o_;LNt$@=QeON4Omtvfq8IeB{`VuW1CQFgUhpkmY$2r8`qdUB59`t%Dk6q_6D zB1d-*ew$9{yrCF%=)s|zbW9fy|Cy@hPJKX!^)F9tM`BlvB(RDN delta 2983 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 i64 let minted_supply = 42; // dummy for the core test to pass - ctx.results().get_int(PARAM_MINTED_SUPPLY).set_value(minted_supply); + ctx.results().get_int64(PARAM_MINTED_SUPPLY).set_value(minted_supply); ctx.log("testcore.setInt ok"); } @@ -212,7 +212,7 @@ pub fn func_test_event_log_generic_data(ctx: &ScFuncContext) { ctx.log("testcore.testEventLogGenericData"); let p = ctx.params(); - let param_counter = p.get_int(PARAM_COUNTER); + let param_counter = p.get_int64(PARAM_COUNTER); ctx.require(param_counter.exists(), "missing mandatory counter"); @@ -265,39 +265,39 @@ pub fn view_fibonacci(ctx: &ScViewContext) { ctx.log("testcore.fibonacci"); let p = ctx.params(); - let param_int_value = p.get_int(PARAM_INT_VALUE); + let param_int_value = p.get_int64(PARAM_INT_VALUE); ctx.require(param_int_value.exists(), "missing mandatory intValue"); let n = param_int_value.value(); if n == 0 || n == 1 { - ctx.results().get_int(PARAM_INT_VALUE).set_value(n); + ctx.results().get_int64(PARAM_INT_VALUE).set_value(n); return; } let params1 = ScMutableMap::new(); - params1.get_int(PARAM_INT_VALUE).set_value(n - 1); + params1.get_int64(PARAM_INT_VALUE).set_value(n - 1); let results1 = ctx.call_self(HVIEW_FIBONACCI, Some(params1)); - let n1 = results1.get_int(PARAM_INT_VALUE).value(); + let n1 = results1.get_int64(PARAM_INT_VALUE).value(); let params2 = ScMutableMap::new(); - params2.get_int(PARAM_INT_VALUE).set_value(n - 2); + params2.get_int64(PARAM_INT_VALUE).set_value(n - 2); let results2 = ctx.call_self(HVIEW_FIBONACCI, Some(params2)); - let n2 = results2.get_int(PARAM_INT_VALUE).value(); + let n2 = results2.get_int64(PARAM_INT_VALUE).value(); - ctx.results().get_int(PARAM_INT_VALUE).set_value(n1 + n2); + ctx.results().get_int64(PARAM_INT_VALUE).set_value(n1 + n2); ctx.log("testcore.fibonacci ok"); } pub fn func_inc_counter(ctx: &ScFuncContext) { ctx.log("testcore.incCounter"); - ctx.state().get_int(VAR_COUNTER).set_value(ctx.state().get_int(VAR_COUNTER).value() + 1); + ctx.state().get_int64(VAR_COUNTER).set_value(ctx.state().get_int64(VAR_COUNTER).value() + 1); ctx.log("testcore.incCounter ok"); } pub fn view_get_counter(ctx: &ScViewContext) { ctx.log("testcore.getCounter"); - let counter = ctx.state().get_int(VAR_COUNTER); - ctx.results().get_int(VAR_COUNTER).set_value(counter.value()); + let counter = ctx.state().get_int64(VAR_COUNTER); + ctx.results().get_int64(VAR_COUNTER).set_value(counter.value()); ctx.log("testcore.getCounter ok"); } @@ -310,9 +310,9 @@ pub fn view_get_int(ctx: &ScViewContext) { ctx.require(param_name.exists(), "missing mandatory name"); let name = param_name.value(); - let value = ctx.state().get_int(&name); + let value = ctx.state().get_int64(&name); ctx.require(value.exists(), "param 'value' not found"); - ctx.results().get_int(&name).set_value(value.value()); + ctx.results().get_int64(&name).set_value(value.value()); ctx.log("testcore.getInt ok"); } @@ -328,8 +328,8 @@ pub fn view_pass_types_view(ctx: &ScViewContext) { let param_hash = p.get_hash(PARAM_HASH); let param_hname = p.get_hname(PARAM_HNAME); let param_hname_zero = p.get_hname(PARAM_HNAME_ZERO); - let param_int64 = p.get_int(PARAM_INT64); - let param_int64_zero = p.get_int(PARAM_INT64_ZERO); + let param_int64 = p.get_int64(PARAM_INT64); + let param_int64_zero = p.get_int64(PARAM_INT64_ZERO); let param_string = p.get_string(PARAM_STRING); let param_string_zero = p.get_string(PARAM_STRING_ZERO); diff --git a/contracts/rust/tokenregistry/src/types.rs b/contracts/rust/tokenregistry/src/types.rs index e71938b075..bc20d5ee6a 100644 --- a/contracts/rust/tokenregistry/src/types.rs +++ b/contracts/rust/tokenregistry/src/types.rs @@ -19,24 +19,24 @@ impl Token { pub fn from_bytes(bytes: &[u8]) -> Token { let mut decode = BytesDecoder::new(bytes); Token { - created: decode.int(), + created: decode.int64(), description: decode.string(), minted_by: decode.agent_id(), owner: decode.agent_id(), - supply: decode.int(), - updated: decode.int(), + supply: decode.int64(), + updated: decode.int64(), user_defined: decode.string(), } } pub fn to_bytes(&self) -> Vec { let mut encode = BytesEncoder::new(); - encode.int(self.created); + encode.int64(self.created); encode.string(&self.description); encode.agent_id(&self.minted_by); encode.agent_id(&self.owner); - encode.int(self.supply); - encode.int(self.updated); + encode.int64(self.supply); + encode.int64(self.updated); encode.string(&self.user_defined); return encode.data(); } diff --git a/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm b/contracts/rust/tokenregistry/test/tokenregistry_bg.wasm index 4574665fd382f0e5dea8b01937e54b51d5a8b26a..00d9eb70d0198703835cdf8ad1abd34ce13e5cad 100644 GIT binary patch delta 1387 zcmb_cO>7%g5Z-ya4o-F*KN=Iebpva+X$^(guA;;hrT7V&P@2Svlpv0&UR4CC=%p1oR6=NPJwTB-pq2tcih7_(AkjN;q>aS9?56DjZd~@gnK$#z z%r`T;d=D<)g_RrH(qcoS45UE?Nj`h)5O0NA*tNSod?HyJs_m@>PMoeCcR#l@?$i5T z9a}v0#%ufO>oc{b=C=5oJD-26Y2$lXG{1(ow?o>D`|q`w>HW(@OXw19aI3na-gWRp z;T;F^x}-}_%JFWw4!XqZV6boM*Cghn1vE9f$d)=pq=2xvEnZbxnIIM}qEYeE*dg`2A5b=rq3`>E4#uf#Ny{CAzY9n&2(bcoVSocdtq8 z5jw{gqkbsy^U?NgSxlL*+v1^-R?+q(zZuPh?R=fx@*1&W?g$${QUMg5*d;JF&p(K< zTQYy|T$SBZnxg75lLlNwrDchikM3%g7zuzT3q8xovaT39=nkyS>{~@Jf6?-!GZ~c8F<<*igwGQHSsxCe-BG~LUfn;EUKLbt6LP0B!fp%?4q!6 z(SED{mfKeMuZTAX#lG*f`tGxECfOI_#Vfqn`xe@tLtZHG#^f$++cQb8=f6Tu{cj;L zC7fmHeytyz!JM#G{&TVuhB+PXZ<%LOfM`gY!kmWgKEkH&emj1A82)5K+)x%oa6huXSY2N003R_f$|m>;e%NbV6s% zp7f`r?ZLoVEV9cY-^Z-YV&jDncRqkbIH&$8db1TW`0;1zx`7ly3)L+%D(;MIHt=JoCGU zDjeC9med!4yrTm$7$D-10y1;rme>m;t`+`L@nCBnBgmUQcH(+r3k9DA{z)+p$M{BZ o1QI-5DqxJOr7vN?Jas$?BGmND`1Q`Lz#w0nS;kB{W^Z}^0TbC(KmY&$ delta 1528 zcmc&!T}&KR6rOWu7MAV;H!X#w+n?Dj$Tpe+yPI9Cw%uDLpz^b9vHZh!clmJuY1M)V z3sh}m(`aaJOib!en%JZdMs3E#Ck=^48*8jDq%S0z81f6%#mw0zS$KUYws6D#nLu3fr)gmk%+=4-uG)wO4i=TrHbeBjJNezf%P z{D9AFeY$_{g=eS2{F$fn^Cf!{&+R_?{I<1QG-t2SLM3(CNB#G9ur~_i*Y&%`v!-Th z2lPZ-Um{ZzOJs@9msT|4<2h5~<1w}w4lymDD%Moi!)Ifx1xG2yni2f@?_j4BO!D5K zku(y>HCW;mq>MnJ zm?*4?1WU(||DIWReydr0Om;`&+mpMnT_qL7QBlp4@=7F8<1}h9iKk5xZk7I!S-3`w z0k^vJH5O-@yc6-$h%Ag&Z%+d|6KiKzG*QH7(P&y8iS|6OF(P*y2R6R(qpI;^M5?(a z-X&{&{e{`_+6$~GiP065dQ8LqB6?Xb$#@NqsSB;Gn0feVIn_{4mb}tXO*8hF4K>AH zD@ct-LU@J2XY9L;J}RFC68(Vgjx)ncIBOb0XdkSy&Liv zyB61-4&sI?2=bh~)3F~QN>l#_i1RN2#6E!dBo(Dj`D>~*G%2(I^I~j<(v1tVQ-l~> zgcyoW5Hfmv58Xck2DoLi5Ob@Cm!EV3B%O zOWOXe^FAug1og&ZQZUG5+_FO_-e%ofVsyqVt}6IDH{I$4|4mJqLk$NN_|AV&Blq@H zP|l9^c!;{>vEDb~iSK$37QtK$L*Qvy-dBfMQ{O*h3w?J{?d^X^e$-!&x1ai_HujeW z)c&&pwT}$8xgbqQ|NLOL66v~Zbs(wIo+X?d$2A1Qhv99ZkshGhb1UoXtMA*rj;{qeWWSkNb@WsR|AUYEcN5_L&6Y z0?N9uzFW;2w#RN&nYfTopj098JW6cQBoKmHELuPpZdh`|o$6Kj3tYsQp&+XN2)uuB zMU#JKtIM;14$nf}Zm0vgQLN?Up { // decodes the next substring of bytes from the byte buffer pub fn bytes(&mut self) -> &[u8] { - let size = self.int() as usize; + let size = self.int64() as usize; if self.data.len() < size { panic!("Cannot decode bytes"); } @@ -62,7 +62,7 @@ impl BytesDecoder<'_> { // decodes an int64 from the byte buffer // note that ints are encoded using leb128 encoding - pub fn int(&mut self) -> i64 { + pub fn int64(&mut self) -> i64 { // leb128 decoder let mut val = 0_i64; let mut s = 0; @@ -126,7 +126,7 @@ impl BytesEncoder { // encodes a substring of bytes into the byte buffer pub fn bytes(&mut self, value: &[u8]) -> &BytesEncoder { - self.int(value.len() as i64); + self.int64(value.len() as i64); self.data.extend_from_slice(value); self } @@ -168,7 +168,7 @@ impl BytesEncoder { // encodes an int64 into the byte buffer // note that ints are encoded using leb128 encoding - pub fn int(&mut self, mut val: i64) -> &BytesEncoder { + pub fn int64(&mut self, mut val: i64) -> &BytesEncoder { // leb128 encoder loop { let b = val as u8; diff --git a/contracts/rust/wasmlib/src/context.rs b/contracts/rust/wasmlib/src/context.rs index a3d87ad7e7..ce36040cbe 100644 --- a/contracts/rust/wasmlib/src/context.rs +++ b/contracts/rust/wasmlib/src/context.rs @@ -22,7 +22,7 @@ pub struct ScBalances { impl ScBalances { // retrieve the balance for the specified token color pub fn balance(&self, color: &ScColor) -> i64 { - self.balances.get_int(color).value() + self.balances.get_int64(color).value() } // retrieve a list of all token colors that have a non-zero balance @@ -64,7 +64,7 @@ impl ScTransfers { // add the specified token transfer to the transfer object pub fn add(&self, color: &ScColor, amount: i64) { - self.transfers.get_int(color).set_value(amount); + self.transfers.get_int64(color).set_value(amount); } } @@ -98,11 +98,11 @@ impl ScUtility { // aggregates the specified multiple BLS signatures and public keys into a single one pub fn bls_aggregate_signatures(&self, pub_keys_bin: &[&[u8]], sigs_bin: &[&[u8]]) -> (Vec, Vec) { let mut encode = BytesEncoder::new(); - encode.int(pub_keys_bin.len() as i64); + encode.int64(pub_keys_bin.len() as i64); for pub_key in pub_keys_bin { encode.bytes(pub_key); } - encode.int(sigs_bin.len() as i64); + encode.int64(sigs_bin.len() as i64); for sig in sigs_bin { encode.bytes(sig); } @@ -120,7 +120,7 @@ impl ScUtility { encode.bytes(pub_key); encode.bytes(signature); self.utility.get_bytes(&KEY_BLS_VALID).set_value(&encode.data()); - self.utility.get_int(&KEY_VALID).value() != 0 + self.utility.get_int64(&KEY_VALID).value() != 0 } pub fn ed25519_address_from_pubkey(&self, pub_key: &[u8]) -> ScAddress { @@ -135,7 +135,7 @@ impl ScUtility { encode.bytes(pub_key); encode.bytes(signature); self.utility.get_bytes(&KEY_ED25519_VALID).set_value(&encode.data()); - self.utility.get_int(&KEY_VALID).value() != 0 + self.utility.get_int64(&KEY_VALID).value() != 0 } // hashes the specified value bytes using blake2b hashing and returns the resulting 32-byte hash @@ -160,7 +160,7 @@ impl ScUtility { // generates a random value from 0 to max (exclusive max) using a deterministic RNG pub fn random(&self, max: i64) -> i64 { - let rnd = self.utility.get_int(&KEY_RANDOM).value(); + let rnd = self.utility.get_int64(&KEY_RANDOM).value(); (rnd as u64 % max as u64) as i64 } } @@ -223,7 +223,7 @@ pub trait ScBaseContext { // deterministic time stamp fixed at the moment of calling the smart contract fn timestamp(&self) -> i64 { - ROOT.get_int(&KEY_TIMESTAMP).value() + ROOT.get_int64(&KEY_TIMESTAMP).value() } // logs debugging trace text message @@ -253,14 +253,14 @@ impl ScFuncContext { encode.hname(&hcontract); encode.hname(&hfunction); if let Some(params) = params { - encode.int(params.obj_id as i64); + encode.int64(params.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } if let Some(transfers) = transfer { - encode.int(transfers.transfers.obj_id as i64); + encode.int64(transfers.transfers.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } ROOT.get_bytes(&KEY_CALL).set_value(&encode.data()); ROOT.get_map(&KEY_RETURN).immutable() @@ -282,9 +282,9 @@ impl ScFuncContext { encode.string(name); encode.string(description); if let Some(params) = params { - encode.int(params.obj_id as i64); + encode.int64(params.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } ROOT.get_bytes(&KEY_DEPLOY).set_value(&encode.data()); } @@ -304,7 +304,7 @@ impl ScFuncContext { // retrieve the amount of tokens that were minted in this transaction pub fn minted_supply(&self) -> i64 { - ROOT.get_int(&KEY_MINTED).value() + ROOT.get_int64(&KEY_MINTED).value() } // asynchronously calls the specified smart contract function, @@ -314,16 +314,16 @@ impl ScFuncContext { encode.contract_id(contract_id); encode.hname(&function); if let Some(params) = ¶ms { - encode.int(params.obj_id as i64); + encode.int64(params.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } if let Some(transfer) = &transfer { - encode.int(transfer.transfers.obj_id as i64); + encode.int64(transfer.transfers.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } - encode.int(delay); + encode.int64(delay); ROOT.get_bytes(&KEY_POST).set_value(&encode.data()); } @@ -347,7 +347,7 @@ impl ScFuncContext { let transfers = ROOT.get_map_array(&KEY_TRANSFERS); let tx = transfers.get_map(transfers.length()); tx.get_address(&KEY_ADDRESS).set_value(address); - tx.get_int(&KEY_BALANCES).set_value(transfer.transfers.obj_id as i64); + tx.get_int64(&KEY_BALANCES).set_value(transfer.transfers.obj_id as i64); } } @@ -367,11 +367,11 @@ impl ScViewContext { encode.hname(&contract); encode.hname(&function); if let Some(params) = params { - encode.int(params.obj_id as i64); + encode.int64(params.obj_id as i64); } else { - encode.int(0); + encode.int64(0); } - encode.int(0); + encode.int64(0); ROOT.get_bytes(&KEY_CALL).set_value(&encode.data()); ROOT.get_map(&KEY_RETURN).immutable() } diff --git a/contracts/rust/wasmlib/src/host.rs b/contracts/rust/wasmlib/src/host.rs index 23f57072e3..6649a77677 100644 --- a/contracts/rust/wasmlib/src/host.rs +++ b/contracts/rust/wasmlib/src/host.rs @@ -16,7 +16,7 @@ pub const TYPE_COLOR: i32 = 5; pub const TYPE_CONTRACT_ID: i32 = 6; pub const TYPE_HASH: i32 = 7; pub const TYPE_HNAME: i32 = 8; -pub const TYPE_INT: i32 = 9; +pub const TYPE_INT64: i32 = 9; pub const TYPE_MAP: i32 = 10; pub const TYPE_REQUEST_ID: i32 = 11; pub const TYPE_STRING: i32 = 12; @@ -35,7 +35,7 @@ extern { } pub fn clear(obj_id: i32) { - set_bytes(obj_id, KEY_LENGTH, TYPE_INT, &0_i64.to_le_bytes()) + set_bytes(obj_id, KEY_LENGTH, TYPE_INT64, &0_i64.to_le_bytes()) } pub fn exists(obj_id: i32, key_id: Key32, type_id: i32) -> bool { @@ -78,7 +78,7 @@ pub fn get_key_id_from_string(key: &str) -> Key32 { } pub fn get_length(obj_id: i32) -> i32 { - let bytes = get_bytes(obj_id, KEY_LENGTH, TYPE_INT); + let bytes = get_bytes(obj_id, KEY_LENGTH, TYPE_INT64); i64::from_le_bytes(bytes.try_into().unwrap()) as i32 } diff --git a/contracts/rust/wasmlib/src/immutable.rs b/contracts/rust/wasmlib/src/immutable.rs index 36e1e6a915..8e46be5323 100644 --- a/contracts/rust/wasmlib/src/immutable.rs +++ b/contracts/rust/wasmlib/src/immutable.rs @@ -363,15 +363,15 @@ impl ScImmutableHnameArray { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // proxy object for immutable int64 in host map -pub struct ScImmutableInt { +pub struct ScImmutableInt64 { obj_id: i32, key_id: Key32, } -impl ScImmutableInt { +impl ScImmutableInt64 { // check if object exists in host map pub fn exists(&self) -> bool { - exists(self.obj_id, self.key_id, TYPE_INT) + exists(self.obj_id, self.key_id, TYPE_INT64) } // human-readable string representation @@ -381,7 +381,7 @@ impl ScImmutableInt { // get value from host map pub fn value(&self) -> i64 { - let bytes = get_bytes(self.obj_id, self.key_id, TYPE_INT); + let bytes = get_bytes(self.obj_id, self.key_id, TYPE_INT64); i64::from_le_bytes(bytes.try_into().expect("invalid i64 length")) } } @@ -389,14 +389,14 @@ impl ScImmutableInt { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // immutable array of int64 -pub struct ScImmutableIntArray { +pub struct ScImmutableInt64Array { pub(crate) obj_id: i32 } -impl ScImmutableIntArray { +impl ScImmutableInt64Array { // index 0..length(), exclusive - pub fn get_int(&self, index: i32) -> ScImmutableInt { - ScImmutableInt { obj_id: self.obj_id, key_id: Key32(index) } + pub fn get_int64(&self, index: i32) -> ScImmutableInt64 { + ScImmutableInt64 { obj_id: self.obj_id, key_id: Key32(index) } } // number of items in array @@ -501,14 +501,14 @@ impl ScImmutableMap { } // get proxy for immutable int64 field specified by key - pub fn get_int(&self, key: &T) -> ScImmutableInt { - ScImmutableInt { obj_id: self.obj_id, key_id: key.get_id() } + pub fn get_int64(&self, key: &T) -> ScImmutableInt64 { + ScImmutableInt64 { obj_id: self.obj_id, key_id: key.get_id() } } - // get proxy for ScImmutableIntArray specified by key - pub fn get_int_array(&self, key: &T) -> ScImmutableIntArray { - let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_INT | TYPE_ARRAY); - ScImmutableIntArray { obj_id: arr_id } + // get proxy for ScImmutableInt64Array specified by key + pub fn get_int64_array(&self, key: &T) -> ScImmutableInt64Array { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_INT64 | TYPE_ARRAY); + ScImmutableInt64Array { obj_id: arr_id } } // get proxy for ScImmutableMap specified by key diff --git a/contracts/rust/wasmlib/src/mutable.rs b/contracts/rust/wasmlib/src/mutable.rs index c3689b0902..f88bac1dcb 100644 --- a/contracts/rust/wasmlib/src/mutable.rs +++ b/contracts/rust/wasmlib/src/mutable.rs @@ -486,20 +486,20 @@ impl ScMutableHnameArray { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // proxy object for mutable int64 in host map -pub struct ScMutableInt { +pub struct ScMutableInt64 { obj_id: i32, key_id: Key32, } -impl ScMutableInt { +impl ScMutableInt64 { // check if object exists in host map pub fn exists(&self) -> bool { - exists(self.obj_id, self.key_id, TYPE_INT) + exists(self.obj_id, self.key_id, TYPE_INT64) } // set value in host map pub fn set_value(&self, val: i64) { - set_bytes(self.obj_id, self.key_id, TYPE_INT, &val.to_le_bytes()); + set_bytes(self.obj_id, self.key_id, TYPE_INT64, &val.to_le_bytes()); } // human-readable string representation @@ -509,7 +509,7 @@ impl ScMutableInt { // retrieve value from host map pub fn value(&self) -> i64 { - let bytes = get_bytes(self.obj_id, self.key_id, TYPE_INT); + let bytes = get_bytes(self.obj_id, self.key_id, TYPE_INT64); i64::from_le_bytes(bytes.try_into().expect("invalid i64 length")) } } @@ -517,24 +517,24 @@ impl ScMutableInt { // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // \\ // mutable array of int64 -pub struct ScMutableIntArray { +pub struct ScMutableInt64Array { pub(crate) obj_id: i32 } -impl ScMutableIntArray { +impl ScMutableInt64Array { // empty the array pub fn clear(&self) { clear(self.obj_id); } // index 0..length(), when length() a new one is appended - pub fn get_int(&self, index: i32) -> ScMutableInt { - ScMutableInt { obj_id: self.obj_id, key_id: Key32(index) } + pub fn get_int64(&self, index: i32) -> ScMutableInt64 { + ScMutableInt64 { obj_id: self.obj_id, key_id: Key32(index) } } // get immutable version of array - pub fn immutable(&self) -> ScImmutableIntArray { - ScImmutableIntArray { obj_id: self.obj_id } + pub fn immutable(&self) -> ScImmutableInt64Array { + ScImmutableInt64Array { obj_id: self.obj_id } } // number of items in array @@ -649,14 +649,14 @@ impl ScMutableMap { } // get proxy for mutable int64 field specified by key - pub fn get_int(&self, key: &T) -> ScMutableInt { - ScMutableInt { obj_id: self.obj_id, key_id: key.get_id() } + pub fn get_int64(&self, key: &T) -> ScMutableInt64 { + ScMutableInt64 { obj_id: self.obj_id, key_id: key.get_id() } } - // get proxy for ScMutableIntArray specified by key - pub fn get_int_array(&self, key: &T) -> ScMutableIntArray { - let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_INT | TYPE_ARRAY); - ScMutableIntArray { obj_id: arr_id } + // get proxy for ScMutableInt64Array specified by key + pub fn get_int64_array(&self, key: &T) -> ScMutableInt64Array { + let arr_id = get_object_id(self.obj_id, key.get_id(), TYPE_INT64 | TYPE_ARRAY); + ScMutableInt64Array { obj_id: arr_id } } // get proxy for ScMutableMap specified by key diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index 919c9d46d1612157373c2b8a9bc33efd64c2f3f5..c7387fb8ac48e52f09585a964914d3665958b524 100644 GIT binary patch delta 567 zcmXX@O=uHA6rT5XvuZ5O5NcQ~r9)~Y3Td`#H%TwLsc1nD3Ld25p$qO|o1`WOoA^VL zgOwKB9!BZGc&hf&9)$5A3Yy|cMeIRA>BXyfX!R`U+r`6t?|W~)@4d%NXBRhj@R<(1 zy2fIL0lwVwX84Uj@OO zCo5gX*TF_XiI9zJSEB*(c? zYM(}(|G((~?|@D!OI^HP2HNLM^>K&?RIPSdC;H*WGU1ikpD-fN)>DM#`h~p(0gmbO zy!_Qp$nAO-Y_-4PX{0Q*&!`u-n@BX@^a)o(>}>_S(fUowQhQy8W6GR6qJgD~^Me|_ irhESjVSe!&{aSn}2^lrIlmN)7^UD(vGCh27Z|EO4Vw;x$ delta 592 zcmX^3o@veprVT8Ne2gs24E$_tj0}uyoQ!Ofg&1GT>IzA_XgL@1CpmbBnCxQgVm!>) z3B;zmfrPzgY zZPjFEG~E2WL!KGv7xtd3K=N+SO<*`~?^R;d+kC56j1d^?ANxF5ftswQv?~Ju5htY- diff --git a/packages/vm/wasmhost/kvstorehost.go b/packages/vm/wasmhost/kvstorehost.go index e5b693a529..494b0b89c8 100644 --- a/packages/vm/wasmhost/kvstorehost.go +++ b/packages/vm/wasmhost/kvstorehost.go @@ -19,7 +19,7 @@ const ( OBJTYPE_CONTRACT_ID int32 = 6 OBJTYPE_HASH int32 = 7 OBJTYPE_HNAME int32 = 8 - OBJTYPE_INT int32 = 9 + OBJTYPE_INT64 int32 = 9 OBJTYPE_MAP int32 = 10 OBJTYPE_REQUEST_ID int32 = 11 OBJTYPE_STRING int32 = 12 diff --git a/packages/vm/wasmproc/bytes.go b/packages/vm/wasmproc/bytes.go index 27bfbcbf00..bacbffde48 100644 --- a/packages/vm/wasmproc/bytes.go +++ b/packages/vm/wasmproc/bytes.go @@ -12,7 +12,7 @@ func NewBytesDecoder(data []byte) *BytesDecoder { } func (d *BytesDecoder) Bytes() []byte { - size := d.Int() + size := d.Int64() if len(d.data) < int(size) { panic("Cannot decode bytes") } @@ -21,7 +21,7 @@ func (d *BytesDecoder) Bytes() []byte { return value } -func (d *BytesDecoder) Int() int64 { +func (d *BytesDecoder) Int64() int64 { // leb128 decoder val := int64(0) s := 0 @@ -58,7 +58,7 @@ func NewBytesEncoder() *BytesEncoder { } func (e *BytesEncoder) Bytes(value []byte) *BytesEncoder { - e.Int(int64(len(value))) + e.Int64(int64(len(value))) e.data = append(e.data, value...) return e } @@ -67,7 +67,7 @@ func (e *BytesEncoder) Data() []byte { return e.data } -func (e *BytesEncoder) Int(value int64) *BytesEncoder { +func (e *BytesEncoder) Int64(value int64) *BytesEncoder { // leb128 encoder for { b := byte(value) diff --git a/packages/vm/wasmproc/sccontext.go b/packages/vm/wasmproc/sccontext.go index 9c9f3ff904..fb640531ec 100644 --- a/packages/vm/wasmproc/sccontext.go +++ b/packages/vm/wasmproc/sccontext.go @@ -27,7 +27,7 @@ var typeIds = map[int32]int32{ wasmhost.KeyIncoming: wasmhost.OBJTYPE_MAP, wasmhost.KeyLog: wasmhost.OBJTYPE_STRING, wasmhost.KeyMaps: wasmhost.OBJTYPE_MAP | wasmhost.OBJTYPE_ARRAY, - wasmhost.KeyMinted: wasmhost.OBJTYPE_INT, + wasmhost.KeyMinted: wasmhost.OBJTYPE_INT64, wasmhost.KeyPanic: wasmhost.OBJTYPE_STRING, wasmhost.KeyParams: wasmhost.OBJTYPE_MAP, wasmhost.KeyPost: wasmhost.OBJTYPE_BYTES, @@ -35,7 +35,7 @@ var typeIds = map[int32]int32{ wasmhost.KeyResults: wasmhost.OBJTYPE_MAP, wasmhost.KeyReturn: wasmhost.OBJTYPE_MAP, wasmhost.KeyState: wasmhost.OBJTYPE_MAP, - wasmhost.KeyTimestamp: wasmhost.OBJTYPE_INT, + wasmhost.KeyTimestamp: wasmhost.OBJTYPE_INT64, wasmhost.KeyTrace: wasmhost.OBJTYPE_STRING, wasmhost.KeyTransfers: wasmhost.OBJTYPE_MAP | wasmhost.OBJTYPE_ARRAY, wasmhost.KeyUtility: wasmhost.OBJTYPE_MAP, @@ -146,8 +146,8 @@ func (o *ScContext) processCall(bytes []byte) { if err != nil { o.Panic(err.Error()) } - params := o.getParams(int32(decode.Int())) - transfer := o.getTransfer(int32(decode.Int())) + params := o.getParams(int32(decode.Int64())) + transfer := o.getTransfer(int32(decode.Int64())) o.Trace("CALL c'%s' f'%s'", contract.String(), function.String()) var results dict.Dict @@ -171,7 +171,7 @@ func (o *ScContext) processDeploy(bytes []byte) { } name := string(decode.Bytes()) description := string(decode.Bytes()) - params := o.getParams(int32(decode.Int())) + params := o.getParams(int32(decode.Int64())) o.Trace("DEPLOY c'%s' f'%s'", name, description) err = o.vm.ctx.DeployContract(programHash, name, description, params) if err != nil { @@ -190,9 +190,9 @@ func (o *ScContext) processPost(bytes []byte) { o.Panic(err.Error()) } o.Trace("POST c'%s' f'%s'", contract.String(), function.String()) - params := o.getParams(int32(decode.Int())) - transfer := o.getTransfer(int32(decode.Int())) - delay := decode.Int() + params := o.getParams(int32(decode.Int64())) + transfer := o.getTransfer(int32(decode.Int64())) + delay := decode.Int64() if delay < -1 { o.Panic("invalid delay: %d", delay) } diff --git a/packages/vm/wasmproc/scutility.go b/packages/vm/wasmproc/scutility.go index 1c64abb73d..7d392fd67f 100644 --- a/packages/vm/wasmproc/scutility.go +++ b/packages/vm/wasmproc/scutility.go @@ -122,9 +122,9 @@ func (o *ScUtility) GetTypeId(keyId int32) int32 { case wasmhost.KeyName: return wasmhost.OBJTYPE_STRING case wasmhost.KeyRandom: - return wasmhost.OBJTYPE_INT + return wasmhost.OBJTYPE_INT64 case wasmhost.KeyValid: - return wasmhost.OBJTYPE_INT + return wasmhost.OBJTYPE_INT64 } return 0 } @@ -163,12 +163,12 @@ func (o *ScUtility) SetBytes(keyId int32, typeId int32, bytes []byte) { func (o *ScUtility) aggregateBLSSignatures(bytes []byte) []byte { decode := NewBytesDecoder(bytes) - count := int(decode.Int()) + count := int(decode.Int64()) pubKeysBin := make([][]byte, count) for i := 0; i < count; i++ { pubKeysBin[i] = decode.Bytes() } - count = int(decode.Int()) + count = int(decode.Int64()) sigsBin := make([][]byte, count) for i := 0; i < count; i++ { sigsBin[i] = decode.Bytes() diff --git a/tools/cluster/tests/wasm/inccounter_bg.wasm b/tools/cluster/tests/wasm/inccounter_bg.wasm index c7842d7ee373ae923fbebe3d8ea4a213c644b300..53558f28538082ed15aee660fcebb8d77eb6eae7 100644 GIT binary patch delta 1336 zcmZ{kTTGlq6oBW<|1Y;)w!^mC%hob%!EzB?L>9IbVHS|f7Rqf|SS|}J3uQsTmNvAo zfDcy0ddtLzCf178wlP-G-x#bfjY(tG2W@Ojlg0;=Ho+%-C^0d{dS=UNd@!5;%zS6g znK^ULnf-bLmhZu9>mFSrR+EX)6qBZz2uVz&NkpTR>bizMl1vB!C7@B02FV)H6>8K% zK__UaC1^4iyseMgCMSZSf${NRcw+jjwmIv$92 zMKh!P_4FkBOH-8A_YW^i~8C?Za8u*QG3ZnoG zvaYBaN{p9_{xt1&#e)9WB(A@SAt};Cy0{es<30DUCU6^XRP@p9WCJcqh~e+m>9V16$Ve9S>I35LJAh|Xg!x&!As zWDKozTBUhZ77s>UH4Tljg^MY5`E6bpN~YYC+*a1_1E17-4Vpb%%{H5nQcGD-lzoEzZzUEy%u6cC7UMcSXe(}l-Yc=EMOkJp1Ug>jNak&{6H}0N& zWrnp&E!c~G1HnCTP%fg(kmrH{=#zg0=V8A*(LaH5y?-3*Wt@2#-q<;;E=aO%8^K z`IeuBy6x&+lWdyg&}uNmTc>c#JhA!$CZ?zcJx4#p;t^47;IRZVaDFmZ{T-#de6@3-SWm1V zmN&N$JC^q5{LoJQ=*-}m(DKG@x|4V=`W6X7(9 zC~+m}_ExP%Cwi(5I^``=6jwltd8YUn;IO)P48Sj&OGeS&EV&MTGxXYV23_Va-WWi$ zY$&URa`VHoXSQ6wMf#Ra+`WX96k=kxcw_MsE)oaAGFm%P-eAPiy-1PV(#**FJ>WpUF{@R|!vj~Rr`@Zk_F zUICzs$f0!71xNt`;AdP1wQ3d)+z1qKmy6;uxd!eyg|#QbZtyxBxT>l^-bK_Ypg!k2 z?!su+f6>gXsD}~!2|_op@J;C04GZP*aRFjjFdd4hT^T2*)*l|_QFKaWw7q(<5!ZDZ z;zulxcv(=si61MRB3J^iDy#`Df!E^swgmo1;WUwyz!%OUen})J@MVR!33~#6uW+hJ z$xZ}rt3ZZG-Nd{>R&`XsZaLQxMti@*gVOoCqbjowFWren3gD^L=OVmGHXreu&yQpR zRLZY{Zdo22x4eT;Bv*rb;E;57mOH&D81Rq`>*#la`CC6Pb(Vuy{@!^W^5tMxL3%!M zya$xV6|@BMet&6wP-pEZa1f6yt$=t{RT)8CE7q;L@s6K9`QjtHpWy{7t*GnfmR10j ziduQUD+Ya1>z26r=iS9=iWAYPx@^>(yw|;)rX-JQ5!cTt{mZeQ2~_I6o@KP5&`F#< z7}_uGVJ~`>;n_|6BAX-yaOOHO+{6)%@53iu)JE}ZULN4^97 z?PzcGXUVLAAbQgSyP#EGKK1Ayq>V*OM=};q{ z?~kE!dl0wgxU*~??no^|F_S! Date: Fri, 26 Feb 2021 12:14:22 +0200 Subject: [PATCH 35/39] update MintedSupply test in testcore --- contracts/rust/testcore/src/testcore.rs | 7 +------ packages/solo/req.go | 4 ++-- .../sbtests/sbtestsc/testcore_bg.wasm | Bin 47041 -> 47245 bytes 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/contracts/rust/testcore/src/testcore.rs b/contracts/rust/testcore/src/testcore.rs index a6198d00cf..1e9c6a5044 100644 --- a/contracts/rust/testcore/src/testcore.rs +++ b/contracts/rust/testcore/src/testcore.rs @@ -160,12 +160,7 @@ pub fn func_set_int(ctx: &ScFuncContext) { pub fn func_get_minted_supply(ctx: &ScFuncContext) { ctx.log("testcore.getMintedSupply"); - - // TODO implement sandbox call - // ctx.minted_supply() -> i64 - - let minted_supply = 42; // dummy for the core test to pass - ctx.results().get_int64(PARAM_MINTED_SUPPLY).set_value(minted_supply); + ctx.results().get_int64(PARAM_MINTED_SUPPLY).set_value(ctx.minted_supply()); ctx.log("testcore.setInt ok"); } diff --git a/packages/solo/req.go b/packages/solo/req.go index c0a28c46f8..f7b1a48aad 100644 --- a/packages/solo/req.go +++ b/packages/solo/req.go @@ -248,14 +248,14 @@ func (ch *Chain) WaitForEmptyBacklog(maxWait ...time.Duration) { } } else { emptyCounter := 0 - for i := 0; i < 5; i++ { + for i := 0; i < 3; i++ { time.Sleep(100 * time.Millisecond) if ch.backlogLen() != 0 { break } emptyCounter++ } - if emptyCounter >= 5 { + if emptyCounter >= 3 { return } } diff --git a/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm b/packages/vm/core/testcore/sbtests/sbtestsc/testcore_bg.wasm index c7387fb8ac48e52f09585a964914d3665958b524..d617014831a973aff5fd74f8693d41a00d6b8f2f 100644 GIT binary patch delta 16034 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 Date: Mon, 1 Mar 2021 20:42:43 -0800 Subject: [PATCH 36/39] Initial tutorial --- contracts/rust/README.md | 91 +++--- contracts/rust/Tutorial.md | 69 ++++ contracts/rust/dividend/src/consts.rs | 4 + contracts/rust/dividend/src/dividend.rs | 299 ++++++++++++++---- contracts/rust/dividend/src/lib.rs | 2 +- contracts/rust/dividend/src/types.rs | 28 -- contracts/rust/dividend/test/dividend_bg.wasm | Bin 34370 -> 31152 bytes contracts/rust/wasmlib/README.md | 22 +- contracts/rust/wasmlib/docs/Access.md | 42 +++ contracts/rust/wasmlib/docs/Calls.md | 4 + contracts/rust/wasmlib/docs/Context.md | 100 ++++++ contracts/rust/wasmlib/docs/Incoming.md | 94 ++++++ contracts/rust/wasmlib/docs/Overview.md | 31 ++ contracts/rust/wasmlib/docs/Params.md | 65 ++++ contracts/rust/wasmlib/docs/Proxies.md | 56 ++++ contracts/rust/wasmlib/docs/State.md | 53 ++++ contracts/rust/wasmlib/docs/Views.md | 56 ++++ packages/vm/wasmproc/wasmprocessor.go | 2 + 18 files changed, 870 insertions(+), 148 deletions(-) create mode 100644 contracts/rust/Tutorial.md delete mode 100644 contracts/rust/dividend/src/types.rs create mode 100644 contracts/rust/wasmlib/docs/Access.md create mode 100644 contracts/rust/wasmlib/docs/Calls.md create mode 100644 contracts/rust/wasmlib/docs/Context.md create mode 100644 contracts/rust/wasmlib/docs/Incoming.md create mode 100644 contracts/rust/wasmlib/docs/Overview.md create mode 100644 contracts/rust/wasmlib/docs/Params.md create mode 100644 contracts/rust/wasmlib/docs/Proxies.md create mode 100644 contracts/rust/wasmlib/docs/State.md create mode 100644 contracts/rust/wasmlib/docs/Views.md diff --git a/contracts/rust/README.md b/contracts/rust/README.md index 096733ba7c..1b3290739c 100644 --- a/contracts/rust/README.md +++ b/contracts/rust/README.md @@ -1,37 +1,39 @@ ## Smart Contracts -Note that most example smart contracts only show the concepts involved in creating them but should -not be taken as fully functional code. +Note that most example smart contracts only show the concepts involved in +creating them but should not be taken as fully functional code yet. Sample smart contracts: - dividend - Allows for setting up automatic dividend dispersal to a number of recipients according to - distribution factors per recipient. Any tokens sent to this contract will automatically be divided - accordingly over these recipients. + Allows for setting up automatic dividend dispersal to a number of recipients + according to distribution factors per recipient. Any tokens sent to this + contract will automatically be divided accordingly over these recipients. - donatewithfeedback - Allows for donations and registers feedback associated with the donation. The contract owner can - at any point decide to withdraw donated funds from the contract. + Allows for donations and registers feedback associated with the donation. The + contract owner can at any point decide to withdraw donated funds from the + contract. - erc20 - Experimental implementation of an ERC20 smart contract as first introduced by Ethereum. + Experimental implementation of an ERC20 smart contract as first introduced by + Ethereum. - fairauction - Allows an auctioneer to auction a number of tokens. The contract owner takes a small fee. The - contract guarantees that the tokens will be sent to the highest bidder, and that the losing - bidders will be completely refunded. Everyone involved stakes their tokens, so there is no - possibility for anyone to cheat. + Allows an auctioneer to auction a number of tokens. The contract owner takes a + small fee. The contract guarantees that the tokens will be sent to the highest + bidder, and that the losing bidders will be completely refunded. Everyone + involved stakes their tokens, so there is no possibility for anyone to cheat. - fairroulette - A simple betting contract. Betters can bet on a random color and after a predefined time period - the contract will automatically pay the total bet amount proportionally to the bet size of the - winners. + A simple betting contract. Betters can bet on a random color and after a + predefined time period the contract will automatically pay the total bet + amount proportionally to the bet size of the winners. - helloworld @@ -39,49 +41,34 @@ Sample smart contracts: - inccounter - A simple test contract. All it does is increment a counter value. It is also used to test basic - ISCP capabilities, like persisting state, batching requests, and sending (time-locked) requests - from a contract. + A simple test contract. All it does is increment a counter value. It is also + used to test basic ISCP capabilities, like persisting state, batching + requests, and sending (time-locked) requests from a contract. -- tokenregistry - - Mints and registers colored tokens in a token registry. +- testcore -### How to create your own Go smart contracts + Helper smart contract to test the core functionality. -Building a Go smart contract is very simple when using the GoLand IntelliJ based development -environment. Open the _ -wasp_ folder in your Goland, which then provides you with the Go workspace. - -The easiest way to create a new contract is to copy the _helloworld.go_ file and _helloworld_ sub -folder in the _ -contracts_ sub folder to properly named new copies within the _contracts_ sub folder. +- tokenregistry -To build the new smart contract select _Run->Edit Configurations_. Add a new configuration based on -the _Shell Script_ -template, type the _name_ of the new configuration, select _tinygo_build.bat_ -in the _wasp_ root as the _Script Path_, enter the name of the new contract as the _script options_, -and select the _ -wasp_ root as the _Working Directory_, and the new folder as the _working directory_. You can now -run this configuration to compile the smart contract directly to Wasm. Once compilation is -successful you will find the resulting Wasm file in the _wasp/wasm_ folder. + Mints and registers colored tokens in a token registry. ### How to create your own Rust smart contracts -Building a Rust smart contract is very simple when using the Rust plugin in any IntelliJ based -development environment. Open the _rust_ sub folder in your IntelliJ, which then provides you with -the Rust workspace. - -The easiest way to create a new contract is to copy the _helloworld_ folder in the _contracts_ -sub folder to a properly named new folder within the _contracts_ sub folder. Next, change the fields -in the first section of the new folder's _cargo.toml_ file to match your preferences. Make sure the -package name equals the folder name. Finally, add the new folder to the workspace in the _ -cargo.toml_ in the _rust_ sub folder. - -To build the new smart contract select _Run->Edit Configurations_. Add a new configuration based on -the _wasmpack_ -template, type the _name_ of the new configuration, type the _command_ -`build`, and select the new folder as the _working directory_. You can now run this configuration to -compile the smart contract directly to Wasm. Once compilation is successful you will find the +Building a Rust smart contract is very simple when using the Rust plugin in any +IntelliJ based development environment. Open the _contracts/rust_ sub folder in +your IntelliJ, which then provides you with the Rust workspace. + +The easiest way to create a new contract is to copy the _helloworld_ folder to a +properly named new folder within the _rust_ sub folder. Next, change the fields +in the first section of the new folder's _cargo.toml_ file to match your +preferences. Make sure the package name equals the folder name. Finally, add the +new folder to the workspace in the _cargo.toml_ in the _contracts/rust_ folder. + +To build the new smart contract select _Run->Edit Configurations_. Add a new +configuration based on the _wasmpack_ template, type the _name_ of the new +configuration, type the _command_ `build`, and select the new folder as the +_working directory_. You can now run this configuration to compile the smart +contract directly to Wasm. Once compilation is successful you will find the resulting Wasm file in the _pkg_ sub folder of the new folder. diff --git a/contracts/rust/Tutorial.md b/contracts/rust/Tutorial.md new file mode 100644 index 0000000000..625fe93cc6 --- /dev/null +++ b/contracts/rust/Tutorial.md @@ -0,0 +1,69 @@ +## How to write Smart Contracts for ISCP + +The Iota Smart Contracts Protocol (ISCP) provides us with a very flexible way of +programming smart contracts. It does this by providing a sandboxed API that +allows you to interact with the ISCP without any security risks. The actual +implementation of the Virtual Machine (VM) that runs in the sandbox environment +is left to whomever wants to create one. Of course, we are providing an example +implementation of such a VM which allows anyone to get a taste of what it is +like to program a smart contract for the ISCP. + +Our particular VM uses WebAssembly (Wasm) as in intermediate language and uses +the open source Wasmtime runtime environment to run the Wasm code. Because Wasm +code runs in its own memory space and cannot access anything outside that memory +by design, Wasm code is ideally suited for secure smart contracts. The Wasm +runtime will provide access to functionality that is needed for the smart +contracts to be able to do their thing, but nothing more. In our case all we do +is provide access to the ISCP sandbox environment. + +The ISCP sandbox environment enables the following: + +- Access to smart contract meta data +- Access to parameter data for smart contract functions +- Access to the smart contract state data +- A way to return data to the caller of the smart contract function +- Access to tokens owned by the smart contract and ability to move them +- Ability to call other smart contract functions +- Access to logging functionality +- Access to a number of utility functions provided by the host + +Our choice of Wasm was guided by the desire to be able to program smart +contracts from any language. Since more and more languages are becoming capable +of generating the intermediate Wasm code this will eventually allow developers +to choose a language they are familiar with. To that end we designed the +interface to the ISCP sandboxed environment as a simple library that enables +access to the ISCP sandbox from within the Wasm environment. This library, for +obvious reasons, has been named WasmLib for now. + +So why do we need a library to access the sandbox functionality? Why can't we +call the ISCP sandbox functions directly? The reason for that is same reason +that Wasm is secure. There is no way for the Wasm code to access any memory +outside its own memory space. Therefore, any data that is governed by the ISCP +sandbox has to be copied in and out of that memory space through well-defined +channels in the Wasm runtime. To make this whole process as seamless as possible +the WasmLib interface provides proxy objects to hide the underlying data +transfers between the separate systems. + +We tried to keep things as simple and understandable as possible, and therefore +decided upon two kinds of key/value proxy objects. Arrays and maps. The +underlying ISCP sandbox provides access to its data in the form of key/value +stores that can have arbitrary byte data for both key and value. The proxy +objects channel those in easier to use data types, with the necessary type +conversions hidden within WasmLib, while still keeping the option open to use +arbitrary byte strings for keys and values. + +Our initial implementation of WasmLib has been created for the Rust programming +language, because this language had the most advanced and stable support for +generating Wasm code at the time when we started implementing our Wasm VM +environment. + +Here is a list of topics this tutorial will cover: + +* [WasmLib Overview](wasmlib/docs/Overview.md) +* [Proxy Objects](wasmlib/docs/Proxies.md) +* [Function Call Context](wasmlib/docs/Context.md) +* [Function Parameters](wasmlib/docs/Params.md) +* [Smart Contract State](wasmlib/docs/State.md) +* [Incoming Token Transfers](wasmlib/docs/Incoming.md) +* [Limiting Access](wasmlib/docs/Access.md) +* [View Functions](wasmlib/docs/Views.md) diff --git a/contracts/rust/dividend/src/consts.rs b/contracts/rust/dividend/src/consts.rs index ad546089fe..d3beaa8c54 100644 --- a/contracts/rust/dividend/src/consts.rs +++ b/contracts/rust/dividend/src/consts.rs @@ -11,11 +11,15 @@ pub const SC_HNAME: ScHname = ScHname(0xcce2e239); pub const PARAM_ADDRESS: &str = "address"; pub const PARAM_FACTOR: &str = "factor"; +pub const VAR_FACTOR: &str = "factor"; +pub const VAR_MEMBER_LIST: &str = "memberList"; pub const VAR_MEMBERS: &str = "members"; pub const VAR_TOTAL_FACTOR: &str = "totalFactor"; pub const FUNC_DIVIDE: &str = "divide"; pub const FUNC_MEMBER: &str = "member"; +pub const VIEW_GET_FACTOR: &str = "getFactor"; pub const HFUNC_DIVIDE: ScHname = ScHname(0xc7878107); pub const HFUNC_MEMBER: ScHname = ScHname(0xc07da2cb); +pub const HVIEW_GET_FACTOR: ScHname = ScHname(0x0ee668fe); diff --git a/contracts/rust/dividend/src/dividend.rs b/contracts/rust/dividend/src/dividend.rs index d87bb32d82..c9071e9988 100644 --- a/contracts/rust/dividend/src/dividend.rs +++ b/contracts/rust/dividend/src/dividend.rs @@ -1,74 +1,265 @@ // Copyright 2020 IOTA Stiftung // SPDX-License-Identifier: Apache-2.0 +// This example implements 'dividend', a simple smart contract that can automatically disperse +// iota tokens which are sent to the contract to a group of member addresses according +// to predefined division factors. The intent is to showcase basic functionality of WasmLib +// through a minimal implementation and not to come up with a complete real-world solution. + use wasmlib::*; use crate::*; -use crate::types::*; -pub fn func_divide(ctx: &ScFuncContext) { - ctx.log("dividend.divide"); - let amount = ctx.balances().balance(&ScColor::IOTA); - if amount == 0 { - ctx.panic("Nothing to divide"); +// 'member' is a function that can be used by the entity that created the 'dividend' smart +// contract on the chain to define the group of member addresses and dispersal factors prior +// to starting to send tokens to the smart contract's 'divide' function. The 'member' function +// takes 2 parameters, that are both required: +// - 'address', which is an Address to use as member in the group, and +// - 'factor', which is an Int64 relative dispersal factor +// The 'member' function will save the address/factor combination in its state and also calculate +// and store a running sum of all factors so that the 'divide' function can simply use these values +pub fn func_member(ctx: &ScFuncContext) { + + // Log the fact that we have initiated the 'member' Func in the log on the host. + ctx.log("dividend.member"); + + // Only the smart contract creator can add members, so we require that the caller agent id + // is equal to the contract creator's agent id. Otherwise we panic out with an error message. + ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); + + // Now it is time to check the parameters. + // First we create an ScImmutableMap proxy to the params map on the host. + let p = ctx.params(); + + // Create an ScImmutableAddress proxy to the 'address' parameter that is still stored + // in the map on the host. Note that we use constants defined in consts.rs to prevent + // typos in name strings. This is good practice and will save time in the long run. + let param_address = p.get_address(PARAM_ADDRESS); + + // Require that the mandatory 'address' parameter actually exists in the map on the host. + // If it doesn't we panic out with an error message. + ctx.require(param_address.exists(), "missing mandatory address"); + + // Now that we are sure that the 'address' parameter actually exists we can + // retrieve its actual value into an ScAddress value object + let address = param_address.value(); + + // Create an ScImmutableInt64 proxy to the 'factor' parameter that is still stored + // in the map on the host. Note how the get_xxx() method defines what type we expect. + let param_factor = p.get_int64(PARAM_FACTOR); + + // Require that the mandatory 'factor' parameter actually exists in the map on the host. + // If it doesn't we panic out with an error message. + ctx.require(param_factor.exists(), "missing mandatory factor"); + + // Now that we are sure that the 'factor' parameter actually exists we can + // retrieve its actual value into an i64. Note that we use Rust's built-in + // data types when manipulating Int64, String, or Bytes value objects. + let factor = param_factor.value(); + + // As an extra requirement we check that the 'factor' parameter value is not negative. + // If it is, we panic out with an error message. Note how we use an if expression here. + // We could have achieved the same in a single line by using the require() method instead: + // ctx.require(factor >= 0, "negative factor"); + // Using the require() method reduces typing and enhances readability. + if factor < 0 { + ctx.panic("negative factor"); } + + // Now that we have sorted out the parameters we will start using the state storage on the host. + // First we create an ScMutableMap proxy to the state storage map on the host. let state = ctx.state(); + + // We will store the address/factor combinations in a key/value sub-map inside the state map + // Create an ScMutableMap proxy to a map named 'members' in the state storage. If there is no + // 'members' map present yet this will automatically create an empty map on the host. + let members = state.get_map(VAR_MEMBERS); + + // Now we create sn ScMutableInt64 proxy for the value stored in the 'members' map under the + // key defined by the 'address' parameter we retrieved earlier. + let current_factor = members.get_int64(&address); + + // Next we check to see if this key/value combination already exists in the 'members' map + if !current_factor.exists() { + // If it does not exist yet then we have to add this new address to the 'memberList' array + // We create an ScMutableAddressArray proxy to an Address array named 'memberList' in the + // state storage. Again, if the array did not exist yet is will automatically be created. + let member_list = state.get_address_array(VAR_MEMBER_LIST); + + // Now we will append the new address to the memberList array. + // First we determine the current length of the array. + let length = member_list.length(); + + // Next we create an ScMutableAddress proxy to the Address value that lives at that index + // in the memberList array. + let new_address = member_list.get_address(length); + + // And finally we do the actual appending of the new address to the array by telling the + // proxy to set the value it refers to to the value of the 'address' parameter. + new_address.set_value(&address); + } + + // Create an ScMutable Int64 proxy named 'totalFactor' to the value in state storage. + // Note that we don't care whether this value exists or not, because if it doesn't + // WasmLib will act as if it has the default value of zero. let total_factor = state.get_int64(VAR_TOTAL_FACTOR); - let total = total_factor.value(); - let members = state.get_bytes_array(VAR_MEMBERS); - let mut parts = 0_i64; - let size = members.length(); + + // Now we calculate the new running total sum of factors by first getting the current + // value of 'totalFactor' from the state storage, then subtracting the current value + // of the factor associated with the 'address' parameter, if any exists. Again, if the + // associated value doesn't exist, WasmLib will assume zero. Finally we add the factor + // retrieved from the parameters, resulting in the new totalFactor. + let new_total_factor = total_factor.value() - current_factor.value() + factor; + + // Now we store the new totalFactor in the state storage + total_factor.set_value(new_total_factor); + + // And we also store the factor from the parameters under the address from the parameters + // in the state storage the proxy refers to + current_factor.set_value(factor); + + // Finally, we log the fact that we have successfully completed execution + // of the 'member' Func in the log on the host. + ctx.log("dividend.member ok"); +} + +// 'divide' is a function that will take any iotas it receives and properly disperse them +// to the addresses in the member list according to the associated dispersion factors. +// Anyone can send iota tokens to this function and they will automatically be passed on +// to the member list. Note that this function does not deal with fractions. It simply +// truncates the calculated amount to the nearest lower integer and keeps any remaining +// iotas in its own account. They will be added to any next round of tokens received +// prior to calculation the new dispersion amounts. +pub fn func_divide(ctx: &ScFuncContext) { + + // Log the fact that we have initiated the 'divide' Func in the log on the host. + ctx.log("dividend.divide"); + + // Create ScBalances proxy to the total account balances for this smart contract + // Note that ScBalances wraps an ScImmutableMap of token color/amount combinations + // in a simpler to use interface. Note that we are using the balances() method + // here instead of the incoming() method because there could still me some iotas + // remaining in our account from a previous round. + let balances = ctx.balances(); + + // Retrieve the amount of plain iota tokens from the account balance + let amount = balances.balance(&ScColor::IOTA); + + // Create an ScMutableMap proxy to the state storage map on the host. + let state = ctx.state(); + + // retrieve the totalFactor value from the state storage through an + // ScmutableInt64 proxy + let total_factor = state.get_int64(VAR_TOTAL_FACTOR).value(); + + // note that it is useless to try to divide anything less than totalFactor + // iotas because every member would receive zero iotas + if amount < total_factor { + // log the fact that we have nothing to do to the host log + ctx.log("dividend.divide: nothing to divide"); + + // And exit the function. Note that we could not have used a require() + // statement here, because that would have indicated an error and caused + // a panic out of the function, returning any amount of tokens that was + // intended to be dispersed to the members. By gracefully exiting instead + // we keep these tokens into our account ready for dispersal in a next round. + return; + } + + // Create an ScMutableMap proxy to the 'members' map in the state storage. + let members = state.get_map(VAR_MEMBERS); + + // Create an ScMutableAddressArray proxy to the 'memberList' Address array + // in the state storage. + let member_list = state.get_address_array(VAR_MEMBER_LIST); + + // Determine the current length of the memberList array. + let size = member_list.length(); + + // loop through all indexes of the memberList array for i in 0..size { - let m = Member::from_bytes(&members.get_bytes(i).value()); - let part = amount * m.factor / total; - if part != 0 { - parts += part; - ctx.transfer_to_address(&m.address, ScTransfers::new(&ScColor::IOTA, part)); + // Retrieve the next address from the memberList array through + // an ScMutableAddress proxy referring the value at the required index. + let address = member_list.get_address(i).value(); + + // Retrieve the factor associated with the address from the members map + // through an ScMutableInt64 proxy referring the value in the map. + let factor = members.get_int64(&address).value(); + + // calculate the fair share of iotas to disperse to this member based + // on the factor we just retrieved. Note that the result will been truncated. + let share = amount * factor / total_factor; + + // is there anything to disperse to this member? + if share > 0 { + // Yes, so let's set up an ScTransfers proxy that transfers the calculated + // amount of iotas. Note that ScTransfers wraps an ScMutableMap of token + // color/amount combinations in a simpler to use interface. The constructor + // we use here creates and initializes a single token color transfer in a + // single statement. The actual color and amount values passed in will be + // stored in a new map on the host. + let transfers = ScTransfers::new(&ScColor::IOTA, share); + + // Perform the actual transfer of tokens from the smart contract to the member + // address. The transfer_to_address() method receives the address value and + // the proxy to the new transfers map on the host, and will call the + // corresponding host sandbox function with these values. + ctx.transfer_to_address(&address, transfers); } } - if parts != amount { - // note we truncated the calculations down to the nearest integer - // there could be some small remainder left in the contract, but - // that will be picked up in the next round as part of the balance - let remainder = amount - parts; - ctx.log(&("Remainder in contract: ".to_string() + &remainder.to_string())); - } + + // Finally, we log the fact that we have successfully completed execution + // of the 'divide' Func in the log on the host. ctx.log("dividend.divide ok"); } -pub fn func_member(ctx: &ScFuncContext) { - ctx.log("dividend.member"); - // only creator can add members - ctx.require(ctx.caller() == ctx.contract_creator(), "no permission"); +// 'getFactor' is a simple example of a View function. It will retrieve the +// factor associated with the (mandatory) address parameter it was provided with. +pub fn view_get_factor(ctx: &ScViewContext) { + // Log the fact that we have initiated the 'getFactor' View in the log on the host. + ctx.log("dividend.getFactor"); + + // Now it is time to check the parameter. + // First we create an ScImmutableMap proxy to the params map on the host. let p = ctx.params(); - let address = p.get_address(PARAM_ADDRESS); - let factor = p.get_int64(PARAM_FACTOR); - ctx.require(address.exists(), "missing mandatory address"); - ctx.require(factor.exists(), "missing mandatory factor"); - let member = Member { - address: address.value(), - factor: factor.value(), - }; + + // Create an ScImmutableAddress proxy to the 'address' parameter that is still stored + // in the map on the host. + let param_address= p.get_address(PARAM_ADDRESS); + + // Require that the mandatory 'address' parameter actually exists in the map on the host. + // If it doesn't we panic out with an error message. + ctx.require(param_address.exists(), "missing mandatory address"); + + // Now that we are sure that the 'address' parameter actually exists we can + // retrieve its actual value into an ScAddress value object + let address = param_address.value(); + + // Now that we have sorted out the parameter we will access the state storage on the host. + // First we create an ScImmutableMap proxy to the state storage map on the host. + // Note that this is an *immutable* map, as opposed to the mutable map we get when + // we call the state() method on an ScFuncContext. let state = ctx.state(); - let total_factor = state.get_int64(VAR_TOTAL_FACTOR); - let mut total = total_factor.value(); - let members = state.get_bytes_array(VAR_MEMBERS); - let size = members.length(); - for i in 0..size { - let m = Member::from_bytes(&members.get_bytes(i).value()); - if m.address == member.address { - total -= m.factor; - total += member.factor; - total_factor.set_value(total); - members.get_bytes(i).set_value(&member.to_bytes()); - ctx.log(&("Updated: ".to_string() + &member.address.to_string())); - return; - } - } - total += member.factor; - total_factor.set_value(total); - members.get_bytes(size).set_value(&member.to_bytes()); - ctx.log(&("Appended: ".to_string() + &member.address.to_string())); - ctx.log("dividend.member ok"); + + // Create an ScImmutableMap proxy to the 'members' map in the state storage. + // Note that again, this is an *immutable* map as opposed to the mutable map we + // get from the mutable state map we get through ScFuncContext. + let members = state.get_map(VAR_MEMBERS); + + // Retrieve the factor associated with the address parameter through + // an ScImmutableInt64 proxy to the value stored in the 'members' map. + let factor = members.get_int64(&address).value(); + + // Create an ScMutableMap proxy to the map on the host that will store the + // key/value pairs that we want to return from this View function + let results = ctx.results(); + + // Set the value associated with the 'factor' key to the factor we got from + // the members map through an ScMutableInt64 proxy to the results map. + results.get_int64(VAR_FACTOR).set_value(factor); + + // Finally, we log the fact that we have successfully completed execution + // of the 'getFactor' View in the log on the host. + ctx.log("dividend.getFactor ok"); } diff --git a/contracts/rust/dividend/src/lib.rs b/contracts/rust/dividend/src/lib.rs index 9abaab97de..5883244ad2 100644 --- a/contracts/rust/dividend/src/lib.rs +++ b/contracts/rust/dividend/src/lib.rs @@ -7,11 +7,11 @@ use wasmlib::*; mod consts; mod dividend; -mod types; #[no_mangle] fn on_load() { let exports = ScExports::new(); exports.add_func(FUNC_DIVIDE, func_divide); exports.add_func(FUNC_MEMBER, func_member); + exports.add_view(VIEW_GET_FACTOR, view_get_factor); } diff --git a/contracts/rust/dividend/src/types.rs b/contracts/rust/dividend/src/types.rs deleted file mode 100644 index ee037c9035..0000000000 --- a/contracts/rust/dividend/src/types.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2020 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -use wasmlib::*; - -//@formatter:off -pub struct Member { - pub address: ScAddress, // address of dividend recipient - pub factor: i64, // relative division factor -} -//@formatter:on - -impl Member { - pub fn from_bytes(bytes: &[u8]) -> Member { - let mut decode = BytesDecoder::new(bytes); - Member { - address: decode.address(), - factor: decode.int64(), - } - } - - pub fn to_bytes(&self) -> Vec { - let mut encode = BytesEncoder::new(); - encode.address(&self.address); - encode.int64(self.factor); - return encode.data(); - } -} diff --git a/contracts/rust/dividend/test/dividend_bg.wasm b/contracts/rust/dividend/test/dividend_bg.wasm index 6f44585f96a41d61e9a73632dfa52f4e24680ddd..f1da7cb0fec5da50f09035dfaded306d3adc7e80 100644 GIT binary patch delta 10202 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 H@|XS(PJ{7E delta 12919 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 = 0, "invalid factor"); +``` + +The first thing we do is access the ScImmutableMap proxy object to the +parameters in raw form through the params() method of the function context. +Next, we create an ScImmutableAddress proxy object by asking the params proxy +map to interpret the value for key "address" as an Address. Then we use the +exists() method of ScImmutableAddress to verify that params_address actually +exists in the key/value map on the host. Next, we use the require() method of +the context to verify that this is so and otherwise log an error message in the +host log and panic() out of this call. You can use the require() method anywhere +you need to be sure of a condition. And finally we retrieve the actual value of +the "address" parameter as an ScAddress by calling the value() method of the +proxy object. + +Note that panicking out of the function call is the only way to signal that an +error has occurred. It will cause the host to roll back any changes that were +made to the state and return any tokens that were transferred as part of the +function call (minus any fees, if fees are required). Smart contracts are not +equipped to deal with unexpected errors and should therefore always abort and +roll back when an error condition occurs to prevent the error to propagate into +the state as invalid data. You will notice that whenever a special non-fatal +error condition can occur that could be handled by the smart contract correctly +we will provide a method to explicitly test for that condition. + +In the second part of the above code excerpt we do the same thing for the +"factor" parameter that we did for the "address" parameter, except that in this +case we expect it to be an Int64 value instead of an Address. And we also +double-check that the value is not negative in another call to the require() +method of the context. + +Next: [Smart Contract State](State.md) \ No newline at end of file diff --git a/contracts/rust/wasmlib/docs/Proxies.md b/contracts/rust/wasmlib/docs/Proxies.md new file mode 100644 index 0000000000..155fbfb85e --- /dev/null +++ b/contracts/rust/wasmlib/docs/Proxies.md @@ -0,0 +1,56 @@ +## Proxy Objects + +As stated before, ISCP data is held in key/value stores. In their essence these +are simple, straight-forward key/value dictionaries. Because the data that needs +to be stored by smart contracts can be more complex and hierarchical we provide +a way to build these hierarchical data structures on top of these key/value +stores. To that end we provide a way to nest data structures within a single +key/value store, and hide the complexity of building the more complex keys this +requires. The nested structure is much similar to that used in JSON. We +distinguish two specific kind of container objects: maps and arrays. + +A map is a key/value store where the key is one of our supported value objects. +The value associated with a key can again be one of our supported value objects, +but it can also be another container object (map or array), or a serializable +structured object that consists of a number of value objects. + +An array can be seen as a special kind of key/value store, where the key is an +integer value with the property that keys form a sequence from 0 to N-1 for an +array with N elements. Arrays always store elements of the same data type, which +can be one of the value objects, or a map object. We do not support arrays of +arrays at this moment. + +Maps and arrays are proxy container objects that refer to corresponding +container objects in a hierarchical tree of objects that are created as needed +and live in storage on the host. These proxy container objects are used to get +to the specific proxy value objects that in turn represent the corresponding +data values stored on the host. The way that they are used makes sure that they +have implied (im)mutability and value types. This allows us to leverage the +compiler's type checking to make sure that the constraints on these values are +not unwittingly being broken. These constraints will also be checked at runtime +on the host to prevent malicious client code from bypassing these constraints. + +The proxy value objects can be used to determine the existence of a specific +value on the host, and to get and/or set the data value on the host. + +To facilitate the distinction between mutability and immutability the proxy +objects come in two flavors. Mutable objects will provide mutable access to +everything in their object tree, while immutable objects only allow immutable +access to everything in their object tree. + +WasmLib provides a full set of all possible permutations of (im)mutability, +value type + map, and array. The proxy objects provided are named accordingly. +We decided on a simple, consistent naming scheme. All proxy object names start +with Sc (as in Smart Contract), followed by Immutable or Mutable, followed by +one of the value type names above or Map. In the case where it is an array the +name is subsequently followed by Array. + +Examples: + +- ScMutableInt - proxy to mutable int value +- ScImmutableString - proxy to immutable string value +- ScImmutableColorArray - proxy to immutable array of immutable color values +- ScMutableMap - proxy to mutable map +- ScImmutableMapArray - proxy to immutable array of immutable map + +Next: [Function Call Context](Context.md) diff --git a/contracts/rust/wasmlib/docs/State.md b/contracts/rust/wasmlib/docs/State.md new file mode 100644 index 0000000000..b8f0796c4c --- /dev/null +++ b/contracts/rust/wasmlib/docs/State.md @@ -0,0 +1,53 @@ +## Smart Contract State + +Now that we have the parameters to the function sorted out it's time to update +the smart contract state: + +```rust +let state = ctx.state(); + +let members = state.get_map("members"); +let current_factor = members.get_int64(&address); +if ! current_factor.exists() { + // add new address to member list + let member_list = state.get_address_array("memberList"); + member_list.get_address(member_list.length()).set_value(&address); +} + +let total_factor = state.get_int64("totalFactor"); +total_factor.set_value(total_factor.value() - current_factor.value() + factor); +current_factor.set_value(factor); +``` + +The first thing we do is access the ScMutableMap proxy object to the state +key/value store through the state() method of the function context. Note that +initially we start out with a totally empty state, and that with every update to +the state we keep track of the type of value we have set. The host will prevent +any attempt to access the data stored in the state storage as a different value +type. + +Now that we can access the state we start out by creating an ScMutableMap proxy +to the map named "members" that will store the address/factor key/value pairs. +If this map does not exist on the host yet, it will be automatically created as +an empty map. We then use the address we got from the parameters as key to +create a proxy to the current value of the factor for that address. We check if +there already is a value stored there and if not then we need to add the address +to the list of members. We do that by creating an ScAddressArray proxy to an +array named "memberList" that contains all the addresses we have added as +members thus far. We append to the array by getting the ScAddress proxy for the +value stored at the index equal to the current length of the array, i.e. one +item beyond the current last element, and set the Address value stored there to +the address we got from the parameters. + +The next step is to calculate the running total of all factors and store that in +the state. We create an ScInt64 proxy for the Int64 value named +"TotalFactor" in the state map, and then calculate the new total by retrieving +the current value of the total through the proxy, then subtracting the value +currently stored under the address, which in case the value was not present yet +will be the default value zero, and then add the factor we extracted from the +parameters. And finally we store the factor from the parameters as the new +current factor for that address. + +This completes the logic for the "member" function. + +Next: [Incoming Token Transfers](Incoming.md) diff --git a/contracts/rust/wasmlib/docs/Views.md b/contracts/rust/wasmlib/docs/Views.md new file mode 100644 index 0000000000..8ff9309e24 --- /dev/null +++ b/contracts/rust/wasmlib/docs/Views.md @@ -0,0 +1,56 @@ +## View Functions + +```Rust +// 'getFactor' is a simple example of a View function. It will retrieve the +// factor associated with the (mandatory) address parameter it was provided with. +pub fn view_get_factor(ctx: &ScViewContext) { + + // Log the fact that we have initiated the 'getFactor' View in the log on the host. + ctx.log("dividend.getFactor"); + + // Now it is time to check the parameter. + // First we create an ScImmutableMap proxy to the params map on the host. + let p = ctx.params(); + + // Create an ScImmutableAddress proxy to the 'address' parameter that is still stored + // in the map on the host. + let param_address= p.get_address(PARAM_ADDRESS); + + // Require that the mandatory 'address' parameter actually exists in the map on the host. + // If it doesn't we panic out with an error message. + ctx.require(param_address.exists(), "missing mandatory address"); + + // Now that we are sure that the 'address' parameter actually exists we can + // retrieve its actual value into an ScAddress value object + let address = param_address.value(); + + // Now that we have sorted out the parameter we will access the state storage on the host. + // First we create an ScImmutableMap proxy to the state storage map on the host. + // Note that this is an *immutable* map, as opposed to the mutable map we get when + // we call the state() method on an ScFuncContext. + let state = ctx.state(); + + // Create an ScImmutableMap proxy to the 'members' map in the state storage. + // Note that again, this is an *immutable* map as opposed to the mutable map we + // get from the mutable state map we get through ScFuncContext. + let members = state.get_map(VAR_MEMBERS); + + // Retrieve the factor associated with the address parameter through + // an ScImmutableInt64 proxy to the value stored in the 'members' map. + let factor = members.get_int64(&address).value(); + + // Create an ScMutableMap proxy to the map on the host that will store the + // key/value pairs that we want to return from this View function + let results = ctx.results(); + + // Set the value associated with the 'factor' key to the factor we got from + // the members map through an ScMutableInt64 proxy to the results map. + results.get_int64(VAR_FACTOR).set_value(factor); + + // Finally, we log the fact that we have successfully completed execution + // of the 'getFactor' View in the log on the host. + ctx.log("dividend.getFactor ok"); +} +``` + +Next: [Calling Functions](Calls.md) \ No newline at end of file diff --git a/packages/vm/wasmproc/wasmprocessor.go b/packages/vm/wasmproc/wasmprocessor.go index 52136bbf83..7c9ea2d896 100644 --- a/packages/vm/wasmproc/wasmprocessor.go +++ b/packages/vm/wasmproc/wasmprocessor.go @@ -24,6 +24,8 @@ const ViewCopyAllState = "copy_all_state" var GoWasmVM wasmhost.WasmVM +//TODO make sure that init function can only be called once, or only be called by contract creator + // NewWasmProcessor creates new wasm processor. func NewWasmProcessor(vm wasmhost.WasmVM, logger *logger.Logger) (*wasmProcessor, error) { host := &wasmProcessor{} From a7f32f70c82645bf228aac99b797bfa7e4365b5e Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 3 Mar 2021 14:14:27 +0200 Subject: [PATCH 37/39] architecture doc added --- contracts/rust/wasmlib/docs/Context.md | 8 +++---- contracts/rust/wasmlib/docs/Overview.md | 26 ++++++++++----------- contracts/rust/wasmlib/docs/Proxies.md | 10 ++++---- docs/ISCP architecture description v2.pdf | Bin 0 -> 1205817 bytes 4 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 docs/ISCP architecture description v2.pdf diff --git a/contracts/rust/wasmlib/docs/Context.md b/contracts/rust/wasmlib/docs/Context.md index a15a42252c..c009e53cb6 100644 --- a/contracts/rust/wasmlib/docs/Context.md +++ b/contracts/rust/wasmlib/docs/Context.md @@ -16,8 +16,8 @@ contract functions in the ISCP: To support this function type distinction, Func and View each receive a separate, different function call context, and only the functionality that is necessary for their implementation is provided through their respective contexts -ScFuncContext and ScViewContext. ScViewContext only provides a limited, -immutable subset of the functionality provided by ScFuncContext. Again, the +`ScFuncContext` and `ScViewContext`. `ScViewContext` only provides a limited, +immutable subset of the functionality provided by `ScFuncContext`. Again, the compiler will prevent the programmer from using the wrong functionality in the wrong context. @@ -52,9 +52,9 @@ fn on_load() { } ``` -As you can see this on_load() function first creates the required ScExports +As you can see this on_load() function first creates the required `ScExports` context and then proceeds to define two Funcs named "divide" and "member" by -calling the add_func() method of the ScExports object and then one View named +calling the add_func() method of the `ScExports` object and then one View named "getFactor" by calling its add_view() method. The second parameter to these methods is the smart contract function associated with the name specified. These methods will also automatically assign unique identifiers and then send it all diff --git a/contracts/rust/wasmlib/docs/Overview.md b/contracts/rust/wasmlib/docs/Overview.md index 30bfa15514..5b5dee15dc 100644 --- a/contracts/rust/wasmlib/docs/Overview.md +++ b/contracts/rust/wasmlib/docs/Overview.md @@ -2,22 +2,22 @@ WasmLib provides direct support for the following value data types: -- Int64 - We currently only directly support 64-bit integer values. -- Bytes - An arbitrary-length byte array. -- String - An UTF-8 encoded string value. -- Address - A 33-byte Tangle address. -- AgentId - A 37-byte ISCP Agent id. -- ChainId - A 33-byte ISCP Chain id. -- Color - A 32-byte token color id. -- ContractId - A 37-byte ISCP smart contract id. -- Hash - A 32-byte hash values. -- Hname - A 4-byte unsigned integer hash value derived from a name string. -- RequestId - A 34-byte transaction request id. +- `Int64` - We currently only directly support 64-bit integer values. +- `Bytes` - An arbitrary-length byte array. +- `String` - An UTF-8 encoded string value. +- `Address` - A 33-byte Tangle address. +- `AgentId` - A 37-byte ISCP Agent id. +- `ChainId` - A 33-byte ISCP Chain id. +- `Color` - A 32-byte token color id. +- `ContractId` - A 37-byte ISCP smart contract id. +- `Hash` - A 32-byte hash values. +- `Hname` - A 4-byte unsigned integer hash value derived from a name string. +- `RequestId` - A 34-byte transaction request id. The first three are basic value data types found in all programming languages, whereas the other types are ISCP-specific value data types. More detailed -explanations about their specific use can be found in the documentation of the -ISCP. Each of these value data types has the ability to serialize into and +explanations about their specific use can be found in the [documentation of the +ISCP](../../../../articles/docs/coretypes.md). Each of these value data types has the ability to serialize into and deserialize from a byte array. Each value data type can also be used as a key to our key/value proxy objects. diff --git a/contracts/rust/wasmlib/docs/Proxies.md b/contracts/rust/wasmlib/docs/Proxies.md index 155fbfb85e..4c8ea452c4 100644 --- a/contracts/rust/wasmlib/docs/Proxies.md +++ b/contracts/rust/wasmlib/docs/Proxies.md @@ -47,10 +47,10 @@ name is subsequently followed by Array. Examples: -- ScMutableInt - proxy to mutable int value -- ScImmutableString - proxy to immutable string value -- ScImmutableColorArray - proxy to immutable array of immutable color values -- ScMutableMap - proxy to mutable map -- ScImmutableMapArray - proxy to immutable array of immutable map +- `ScMutableInt` - proxy to mutable int value +- `ScImmutableString` - proxy to immutable string value +- `ScImmutableColorArray` - proxy to immutable array of immutable color values +- `ScMutableMap` - proxy to mutable map +- `ScImmutableMapArray` - proxy to immutable array of immutable map Next: [Function Call Context](Context.md) diff --git a/docs/ISCP architecture description v2.pdf b/docs/ISCP architecture description v2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a873542a1aff2def952d60c258fab2eae40c7f4 GIT binary patch literal 1205817 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ν_Rhw zAx|KZzEY{}bpYuvo#$Ct-0{EmD6oW{GHJanEkq+3-#Jd&=g8LPB za_C;g7JO!DnR+Gs^CwX>4ocRW@k(@rVvP1o#T8H_S8lqLR#b+ez;v=rNx36&rK}Y6 z^C_kx2SV_=V(yoX25d(-9!1?->s@7-lc;hgQ)DwaKC?vlON~O_RFVBl>X`7EL0f>g z+G^F6!c%E+LbmcWz$>#(-Ba9E`7;J*k5`UIA$qR*g*L%j>E6IN)D5UJwVS_HU0bwJ zyeRd7z^jQtw9`*#RI;%lt6KSNG4xKzIF90V0YNh2Y1dFfw{eJo-b7moX;B)eLzSO+ zPL=jZiFjf>Od;vvxKvzuoGncLUmUy4KKY`OvOE#H5&nr^+WKl#FHgo&eJxKnIs4F7 z?Y@CPYJudq5dp4RPyxFhL^{(Nzxz21mKHXnUsP%i)xZV0is4o3h^i@P>yDa!Zsi-N zrelxwxzeEea&P+|nRIMq`;lM6-5nXx| z3wm%bW}sY)4>U2p#cgPgLVM-~DMjoEJj!xF5AM)72To@_NY$19BmJbt#RB%98qdKc_JIgXkfvf%aVSU zV+t+eHq#RI(wW!hg5EzCTk4`ilD0vI8KHO#85M;@iXkMAiO^j}<5)g!Nl<*tmVvv?A_&*k(mqq0ZocRgE)@P9E-mz8 zdk<`9LW*5#yL68LMBRg}1m2`pI#q(4~Eg30L8WGcbgG zJ9}~Uh#+*aDu|AHepLc)0|zX>*mfGi2y)<5iMVJxozjpa2~V?Drns{?5C^}47E?J4 zeo)D0iD=2{`REhXhmr?G=EFHIvz7)S4PtJ7VUlY|$aa_$j6D%Lk(5!&T5BSGj!?FJ zT&JrZU+SZ+&(>On2FhCQz+1(vEONm*Bl80aio`;g-vUIOjZeNStpRkIqvA0&{ zR8~MYcis1&hmZ5$>5q$D2x8gn-%v$@+vNqbM6Li1Y858oeLBlJxU52W^?|U!XEi42 z)F@zUDb!7V7q5}oyWoY%MQ@}9>lMd8G7h@!7@JulV`SNnEH*tei4v{lvnAOE%L-d( zn+LK341m)oGfWYkhckOv9?!uX$Y2!<_$OC_Y@W_K!>Y~ASNv~}j@IFZ-_Z6G6cXn) z8Kj=k`x-(Tk6!MV*r)CHIuv`egAV!Or%%XJNPr`48X9`ttmoJ#ekJoCX_O%o7LjAq zdaQav`+EQ?wM;j;r>Bs;Q0mbX*q~a;^aH3tKBK5;_P7Vl810A_Tqn(a+lem2Hv%%` z;vahzfJ(y{R`^o+xy^_Z5WPJFBKCcuknzO*DveF7=pYtj12NFr5! zaRTugIQt5A_~?DaV;g|`c$v?LAA*pVTMtLnYk&$W2#%Pl?`so5O~VuesEe||uROqu z9d+)&DXF^+prw)X7)I3DTg==_Y1SE=1b+ZKw5n~)n^u*LT8|gpqxB+X#(6X(z5Lbb zoKOGUqmB_22$?$Eo^xZQxEpKKQgZ`Fu~MLh&KM_EAWGNCJGWn{^x~RcPk}h<|GP-X z(!ORvvu#n{7>2Vr{OwsV`gTFdE!evd$h+-t=3vT+%jlKf0sV_VC?{!dn5uxY8_)+sQNMU?RhU9b!k_e_`hv`QrWusBjH-OD z$MHUx8yI2N32F= zl%_FQ^M|cCD)P8VO7{f(J2>IA5~-TXX3H9DhwbB4!215{%x9pB1XC(AbTOzxlj5wD z{(bs{On&R=fPCvo>uvurQt=wI`vEDx4H&PI*`qYrK@?w=EJ*s01V_kV4#?AhpiSu#&F(nB z@(ZFNLe!Bs21oG|OhXkyO+rt>J(rYwC>Wl|!CHv=mlZK?9rCI9kA6h{UHn@6M=n|PJuG;1d9>;KtCN0ro1}Z7s@qMfKq$u2)&4comE!f%!Lf7) z+?7~DQ}_v)BhlCcB->11k30s+j)07UFh3b%DNVe%vJkilYnWsb@>YQvdGZ)h9&R8b zhR#0lA`y8VnPeQ^%?V{pfjvkaNNNSJXEBUIS-JkL}2AC{EVKmDc+vCwUg-G>7) zkPkwR^gmrwQ$F4GqpS$7=i^qgqe&dl(Z9Y|%j3+8Cwwt%t3V&me;Lo$@Rk58s3i6J z6@i7a&AQteh=HY|d&eYrNH8r(AJ7)yb&-D|$oTLM-Zt3}Pv`VUZ7s~`a>%g-5qIsm z-+baj7#kJvh(e5*3AB;Yaj`L3sy$^}WUnUbd~tjaWT=0wva=p;>~=HOFxRlY*zF|d zkc0u6MIYSl20fhfz3Dqct&p8VX+ziQYojfgxXUYwJ4Z4KQJ+GLPg7mNz8+RSDj3z7 z%BNQP$r{xRKj*;L&CR60$unhTX$cN<_O$`Q0A$I1TtOe`>`*J3UZo%>a!d z>YN^cfR`08dQteJ8OLPue3Ph*>Vs5F!8Jf+9$`A4u1d3ufrg$^#6VhXyEU~iL*lV$ zk;|xw4#ODdAm{eD>*t|8sKcb891tzr(g46VaC8A)a4BZ31ZO6f@u7}BmYQoRKpabS z%0Tj8B#5+>`%zvMmEh$_E7um7Vs>80+=!AX@zeWQxVhP&$i8TV~ex-}PV zq7mT}j{Sr_7%9YsBWq1%8s>QVa#9s2kA8boxjVQXGV z8669uAPRgB*wN3#ubTc+RJ>y6J?))?($D|Z&A!v#=7#1JM|hEHWF3wVp&2|bTz<`r zL7o3m`-7tAI+rjzkJ zG$mlVLwse~b+77W_C@v<@iuzedP4{j2Ys>b^>!0>W4dA0<-#5Mt`+wyFFMP}(t*kC zNbQ*8$gS#8`*fR+)s%Ks=g!mgz2~{{rSYTj-u&5Yc6EJqoqL0RL-E*r;pm?Nu4rNL z+%Po?il!K(_?@0#Fg$?s$?G3tdX{|ug?H7(O);;#8 z57dYCy4roKZ7;p~*Lz8?Z>~{%uBqO-X8JDl;D+?Hy>v&n+I)EnB}{B_tJRPSTMc;) zh9r|29xbW!{ixSq`^GgJ=gMy!VO#VI0|TvmO{uuSFu`26d+H;sKDNPsfjyQH&IEP5 zo(hi6u&5alb`koa@jR?d`qMG06ZV6xXIi3hngc~cVg&??{1087Z2fG>$}gq2x_>WH zI!M1HKVF;8L%ZkY72FpWlz;N2)_VFO5*Ln>9{6&d*ThJ@KArwN((jJ5Vo`DKJ$Ot| z-GUd%)qrY2M(S8p=APg_d2SgEvA*y*=4CI+m!xe(hE1?kn$Lj4e2wA^s-vPi%OeMC zR$PcXdBkL%rU_d#ywNs@Q{R^D*nN7m@t4(T0WEhh9KTa|xdKJhzi?H6ng{fr>POp@ zUg3&PMQOf&G;wj_!$?gn1Ip7(q(oC*-AaGkf2C$s5etUMp3~ay1+BGS3PDILlyg*w z7+sO!$i!l5hp_@)omJCN>?Wa#@?#ON z1@Mtg&5$06s04g{O(o^|XhJ9h#4jEjrCO0@SM`~-s*=yh10S(S{Q-<EIlqa|Fr~w8jZ9*A&2*}w_;dXT^7p@X&FvD9q4)%y)-*B|AXvWiAx6|o?<@596 zeeZT#8rx3y2(|&4%yzG{p3&BgIB--YRYZoOgDp^}%`fsh0sW7|7hm&b7~*8DMvIx8 z@szEb++QA{_NcH9C&ryF3O&J=`tF3?8>Ay2^*m=!E2ZPRwVD|!HR>6_77K+VDu}5D z5-BC2&;b+(?Tdm4ID7h|P?$^Zf67rZX_U#Udr#f{Cq`YH5Z;kE8=c{FST!@)7nnhs zTwvTvf^P%z2D!Yh<2oIz>>z95lquc;$5MzKm0yHAg7o^7WiE?&N{Q<6?^P3U?BmeY zofDMk8oiTGx`a<9){2YV;YnIaj3wUPVa{8jxSIpVOdAab7E9qxWwVdjS*!ifj7GdX zY1S+s{s;<1th6$^sWRAUt%b+ZM~B?6bfI%(suE*n?8Wi?4sgq+mJZAS*^z7?LB}<( zHM47Tn&*c}O4>fNlwzLhrjvlBQ)O#mcZ<1+qCb-v=C>}Jg8*n!gf6O~?{=s!)|Cwd zR<(l70^zwFLtat9Z@3*FirIMVX#qrKr7U z&_B(OMBMVf9Zx6{OoXw%=BzgD845iuhAlEh+oY6_M;FS5Vg($QJBDOn*CQ(9j5L$c zHT6zN&b5{|E>>UbA&!$mCgNN{qMOHCRCCfK=u4abd^$W#_MbqrO|K?*#6iW(-;+#~ zPdKF|<9zI_nFVmY2OkQZZP$G_y*zt!+Y8=bXsS-8x(aGrSv!ji%rm;}ddgn3UH<&S z_>x}pFdn3OqAFi^E(%z?Tzr9gJ&&L~8LwiqIsX&dy!2)1oRJVH2!l?t#6vgzW_%4L zi`#*(J0W_t)$}0scxZ`!=}FwT#ViBAx3Y~#wAy=eH;+3QbT$9S`OC0afn0EyG5G~;Zo< z&d%{4WitD3^o7U^3`VK6k-URjWzZrkj6@t>44lnsD;?Jlva~N+7FbJlN6q8QhU2DD zLAvkw%`$PaUmeWMCD$r=}0GK!>cbX-fCPYXY8{9*SO%GI zkG)Eh^R!AcyQx68D3Va9YH5Je>`sfAO2qScsaNKuXe7ShP*V`~Avg_{5w1?`!LZ_O z{=oD#iO0tTZU1YAF3%9WMkFBReWLo_{8{}O z<=FYza2ZFE`B91b9l7J4&?|)eN~OmT?*8-*Z%Ch*Spk=1M^blccl0*V2IUszCS^JP z7Cy>dpn$I$9`XqBkz1FJ-0ZEAlCTPh@~+Sp(G9_S#*9%MaiXF!;x<3+B9K6+7IIt& z)4Y^4yAeBFlm6cF4}gVzv|`)qXH3YGfXR~TdmvVX;&=En+#v~$t4yZ0khlV_0hb66 zds-Zj4T>GTZ6A%iZQkeI@QIICJP3PX&P0uqRUOVgdE=QxYp)%O3e1`okuilkvCCCv zBkLf>lC@H#LTuWB{>|Bw8$WmmcY;B9bKi}gzfe-ZVj8O? ze89TnZ*tE&j(Y#dr%~~DempYR4{5iMkAo4|vJ8p-;y3N;#nXnKhK5X4SOlQ)knQ5_ zAPm5n8f`Jpf9_z8mlB^9^n6qtd&CqM^y~!KZ^(L;v;5T>q?x-=BX=EmIW<_(`u3}% z>~?G{^6<>_ZBW8)d*YKSx&A1~F8SCl26KvfQu^So^{ZpLyq$!*^f0^NtDGkg1uJr* z6hu03(F9~Mr8`f9%VgSJAD@w_U)TENO(*4Fy z81^WasQ5VQinCbs!&F4N`nP@9zUXVlIxZ%w*GCIE>VnmUMS-H%a=zQi+M}(+`Bl1> zQuAKc6yxY7P8a;}1W>wT_Q3-O>A1a7mp>_+Mw3SC(p#f69JDYXnF=7!m^$-XKr{># zL;w`0r+e^;DO{9h#{`*Qy;|XT&KQ}&H~whu36MKurJyGNtL6U5f)E|7o@lbXJAa7Y zgS?YWs}a+ou8LuA?+qlOC5#PE)>2l;VP8S`k)Z+hV%`;#S&y@FNv>2pS_9;w@+=P{ z0#3x@8IQ!g0tUJQ$47aF%Och1TTicvP`n@4Irn(0@OK~Yk2XD@J6zArjwXe)5WQbt zw)bf(#JJwtMR7OlPG?2cy_bh*cUkqkE!p;4RIg{(*%!pI>8r-H4kJL!TlJ6hr`C34 z`2#04+5rT`1=)TKW7DmSO3|Z6^%`w}k|&Sw!8F5qbVb;C-f4MJtnwk>2JF{Ks>K?i ziMD$6Gj>MUC+*;LTeq|G6fKrlw)OKyAu8{)yv~53>5EKB{;dZSVPq)p8qC zOu)c5)^$X7n70yZ*S)!w_51#Fv$cE7B+t}vmu!F6IzIN*G9~sR6CkR!Y(8jS!@kno zC2a$N;IwWX(;Nw7G4u$0O2pbwPvA|((R|J9FyU1+82~C71Mkb)8b9wa`VY~QZE(!y zU|)-I*ow92bj*^)05Tx1YP!_^&HFC9O}7P4*r&Bm%Q4Bm%DKv0g#*E7MYz9Ee2O|% z*8U1qV54R%xcEY&A;<=lwyiqN<`$84Dy7kFaG}(BfHpS^-%!<(gvAfV`0n-jTWk2z z!}Q+2Qg-_p>AqFP>?xYi=0hejeRde#TCx^x0QBrsBtn)rlguF zQm}0;O|7^a2VznG;&Q`3q%w5^IpPri9^fuR0(+OtCCVv(G%+!9`nW< zh^r_!RS#$>)DCszZK~g|{4!HH^N$V>Sgt3#+#zr%O{ozWIT5NEr#a&w7$c=qsFHX# zaKQL zF3Jn?JAvai)OXWI?d<$)d@}l;)LjURf20<`XEl9D6<-j!4$tqTaInjt65Jgtmdgzb zbvpAHj*QErb+|ckf1fwH2@VP1USs3V$nR?c72wB!&G2O^-idIz5n_IUWWX*PqIml+#%FxN8M>A`I@hq(A|%B`yz zv3~Qo&bD_Sw|Q2pqviA$kYJW+5U1tR&0G4FOEEG#Pr^&s7R^R9$^|qxFBF@j(tV{T zRX=s4%INi9++$n+CC ztzE0ttdvBk#veAxOaqUz@pD%mn&ES_>ndAIC+^F=H0^Qib1myunHFH1RjrGCovlMy zs@1u}w}obvJgH~l)Gf%W0sba(2a;A&BTlo4nrL)ya)0&c8d=+MMaByfzj?D{e#PpP zHH%tN$}!5i%ZD=mqK$@)-7d4`3}@v;@zyI2gdKaB;bCpv6qJva9FK>cEa!Mu*zR{5 z59YaJlm#%uSF8sB%js6=)9TaXpW+a&+BB8*bFT%CTcyqSs zM=m|HASw#n_tEV<%|=(2Rp>j+^aba?S$I3RV$Ky=L^sR$+H8^+8D~gW-?)?kJ|jHF zp3&)CC#c9!6}A~tCt6vdDWdT*K;J5nqs?#P9DqRWsd0RepOe6}B$cEoPq14kYyC22O)2vk+5Wtb!sfs{1)^?$ z^d7qxF10YKZL8HHg-^h$^T9xMXUNB%36$aqrfmf{wQ&6Q$};_2Q1HZtp(wJg5_Bo6hZ`Phcn*Ia?az^xn2!+`J zWG87#2n2yLF+aFpFyO`sAFnk5YO%^}Xh~~9X;3*-ur+s2#46vkLiAiREC^3tii`Fp zO#HAB57;GoN8zJPb3QL-_!wePA}g)@F+d`>TLDz?1Wvz%NlG0`@@23O!8o){O%uHQ zC9#jfII&IP9gJsh8+A*SM`3%p%h&paun+za^D*QJ@nawxK}Patez%~gQ9BdsqN?iW zY2X3lHy8V|B34RO=*SI}gb*ow$1`f}Fo8yY3Rddb0smw74-8Gw&)H8$0|#3f8V04c za!vfCuyP?FePVTzy#dKEShW{Wh~2M)okTHA4;I!mjm*g#spfCnD`|{MbVP}zxr*}i zK=T8f(rv8}@AhqzT7jGFk^fc-%rB$&C%A<6n^?*fTD0Lv66k zBAOB2$K695htCJFy}7IwSc0J;g4M%)(Cb!Mjb{NB6SOP zEGMNLI+Pm}E+q&dQ9Qc^N7R?!43Cy($7}foEDtv`9gmD;_p<@HMv_EnG1x~mjb*%L z!DDeWfz>WOE`8CoFJu?X^;&GnI4yDe2Uqj%KDvfElfghPZovucg0ra)L|e0ZRBibz zyP0D2uQVhI6%o`}D7{xeWR^(MpfxFCwreO zf6|Mo7gSVM{D2e39q^u!_Ji3{$_2fqAp%gW?@q5f(`)a)>=eAPj#VRgOQZ~f>jEx2 zNKFYV5#9oSu1ZcR75h+P*uEfCdq&JblM}sjDl&F&jLWa#{vk)i+<6W@zQ9?FW3kvZu=+ies3PCHP z@LHZUgrCuu3TE00kEy}B3+9F7P6?6B#g0V*>pLZLe=ht=Fgd_Ia{lOnkj;bnk0Gg4 zO%3$?Xd6a+AAveshVKCerZ$QK8n1NT?V^7jsI=A+om+vo-e3ddCm9>c+b4QkvzbP> z)H~_XIL42N@p*sws!`nZmk!IcVa9NRDHfX3=S(1xB;FVmAqO$TJA*(R-{luJ)DwSG zKwYozK=mpE{}IMi zrsPJngDMCq5=1hL@sbp23>I-^>Eos7YDHk-UH&6xi*SOm6obe0inZ<%U3wTj5jt1X zw7+HY-T#)D5H+Kgde*dgoy3)al@IxMsVQ&>ijWvp^qbRHv&D*o#F>zWyUVvT%Kp2) zuFsQ^=+(RDtzJS3P7tNuXur=Yi?KP3M@UhZ07^ zlv_5N>McfskkltlY0PicVfa;%CRkLuSFLLGsMzs~8AKvPjUn^vIZ@x~2pmu&t+w)Ota?Oqpgi&UDG2r0y@_uK`%=81B9NJ~=?!~BLgXVF)M4%Ovc5p=%55xjc zZj*D>*jpoHMV5U%i0*Q)hd6AVq}g3(_l#dM!I*xVkLy@2WiY`|EbKcy{Q>0dsO4b6 z9ww^+(4__nYUeAy`l=u})u>utD&3SPxBAJOG_V0}=gw@mOzfEyYzs`JH~^{DPZ&-i zfv@k(w@#i4-X4awxlT6qKhf*%R-ZIn(lp6`V2H8JPW#@pWxD&pS7(_{RFoo&l}IwJ zeoldf0QI*wed_Ev$nSK8sGAjR_Udg@hl{yd6{H#Cc2B=IfphcH&u`;KokfTQbkdK! z+O|g>W^`o4hcCbwN{EqQrJzCY?}5|uHS~@dI55-Azt!Jd7Abdo={chM4^)^8N%RGz zdOsDc3>PYdM;*SHorFCl&=)Y*FSnxYjR!4ju95clH#IFZZ18s4QS{#rIh8p7OBrK9 z5>QCQ6Q=!NPxVftgp`z!0<9JJxgQl9VDGvFbvXs?Ukz|sPjW#Zb5z3Uxj(QXz%z6u^CKpOk;aehNj8T(i+B=2lm2x_Msx9&{~c9MLj&TKK8e1&j7bGbE<+UpsO@}u zYIr_AJNo0KVrrPsr}QH1LaGFJ?wtzrE%tUJq8%~iH|`=8rmFG=F# ziQ`nX3i3nG{C0jYCd7un+fHm$>BpHL78+;Sw>pcF;F)y466}6YO}XFM**`Me9)={? zQXHRv(g@}LlB+lOg#A<%ov4o!Y@H}kG(}<{ccgw0M9^&GemDjlyns@>|H_!nW{2;D zJHhyZ+hAwL>(?g*Xy3rq+qnBa`q?JuuR~w@3DmJZrPZ6eEILDp&;QCGn2ChDGxERh z4T8aj_!Oy&_#A@4W(U)g>&~SsZ2#K&yoq=?PyX9EkMX`68(yjd-AS2(3!(7+B8Fz< zpY0tL-30wLY0ayHmt`NW((BE2;?#mx&3}BL8*n;K*HM3tyNBbAVV?bp6=gB)%O0-@^-a!&gc>umiaz@&y8{HNO~ zSO+I|_SEq4y*|oP;O*PU+PZ`aa>Be*)4+Ck3Yo2B-(=fcj6-iVWEz(|w;38x^ga z*T$0e-~Z9MLmv;>!rB6{!77jpEZY5c*idT{woE#3M`=7nPJotc<z6w! zXsVNQ;Vm|lbhJ`#H!!%=Tm;xBWA9iU5Fz=)HDlSk3N8URcC7YH3p&SQ;gHk8R#-B zuyJDf$OdE8<1($V;^>z%dPHBi!9K0^^V`_b^)W<56;k87Uj?6JdLI61$7pSj9}df3 z&=w||{v4q;e&40v_)>^9cKCP?%x@_9FrLX>(?iLhDP{0oSrFS|f#2~^h@hvMmoF%t z{$2fj{Xlaks2B4zZ{!w3Xoc^mkYv>OZ}gXXl{vUS94G%>e5vUk8`_{lv@7%Q4urED z>`OGg^=orRcQun!NXtOtQZX`4Ji$#&Lc9ZT*t~C8++e9_JmI;p z{r(SjE+GBd4S(JYS{RYL#Ip6dq@QOtONIm*Iw$+mX4Xh*cTQPiL1Y{G85ZRb+=6(7 zaYdW)gt9Hh!FM)A*X`>BmOj;RbE9X**XIPIep7h*ND+|I&!eyn2-wVku2ZNJpRZ+s z2S3d@I%HmzFVsI8cv7mSX=`Y;B|@46hxaG$R_^|0aic7IokRjjsuHdUpcB68l^iz5 z*4`XaZGt%&;HmYJSBq*H3}Gg0LZjzvaOCCIANY3?Ne4k2=14VYj;=F)+ZOey#@q=} zU4Gm4x7s|CGkL!eta`A7N25jvGRd?Tfm$RKg=*H1_$LmR&l_}kC+JWM1yIdK5U14& z)ywChOEMY$7h5FgU0MzyOp1j5rJD62#;6hUm(Tkx$)xvRte0Tgg8;3T*Grab2#zgz zq9(v9@#BUOIFe=}|8ungRtaQ-2!(2SNRkN{#1geafkCi+4s5|)Us%yF)SFCZZUVbn?Pdn6jER6Y^7RH3j;VP8jXp~0YoY=KA# zFBhx)MNIb5S2J`@vHHQ&P|$Rc_$-apn(KbcV}DhDIbYj4-;Sy5GahI}J}4hb6g{fW zE@79f|0k%xGG-gINoX7ukS2e^N-_cgi>2Yqw78fbcLDdT{w=P{T!r>r z!{2%4eTMT~`|c|3F{v{R-F*IR(H1Ef<%zG5HKyy24FW%gd~3*3aEm9~)YJZA@uP6M zPFl6!hj0un$g4#RFW8-0rBj&uLhO{0J~Z~Rj6<|HU&SANZ@pilMeq0L*5J$DLP)O$ zfo*v#F4$zh7<(-7pdS9<_xuTko!Bed>_gs?4V@jkWn_^~2s z4;ZHJc>)^iFY;y&-U%uz9gRVwM;6G5Ih?m2_cI#Tc^I?Ow^nYp)-BY-2(o8RxYZ8a zi67>R^uXCGyN598xmaTGZEI+-)-Aq~iS{f=-KJ0W0zYt_-1;DP)8D4Ds%MH=k195p zGlxNX1xzYF&MbFzF-L1uJ}t&zm`;tIs9;g&@Z>%7TA252G&QN{?a4gQhrT@0$;HsY znP<4+0L*ei?kU(n3ducEgP}IcEDo&S%$Wmu}&+7EBoKk=!Dg z`e-`+hNgcRHBRnAq#^TBXgB$%J8&epDYi@G%aoU-F<6%g+LJNna zU!QBLN6x3RlG{COY0?#`m=TgiFO}rC(c<(ui60qJGyWVu&yyvtB@0i9WDsoUY7kBWNe|1AIEjgrpEltxHCatJjaw`9M}5?CQ@fMb z&t}PtYCa_FfK>9A%aWipbPAc7^x8|Ci^0gZ9%~RlucpQ6vs?#8fP~;N?oAM(N0Hjb z>EkLpc&+4~8e&c;K;P~m8D7{Nhz994XGpo77f;!Qs{3;AiTO2UZt*L z!Z>*p9V;Z6iGYdlbBVCF&y@uI%Ju5r8wbiH-kOO%DO8}nE8&r)$9tuv$N5b!zFVaS zEP0mW(=~EIX`|ob5PM2K&fX4HTgxm_ zA(WqA5I~yZuxueHXF~(l5iiBxh7e9$N5Dy+s@0sE4cJMYOfP_$kK`)EEP~I_ltsx@ zA`Aw}RERL-YvWW+x3X;^{)W#xG7s9XU2#n8&Nf9kczEwO{!W{L9Ol$0UdwVr^B!ro8(dQT8-9-&n3(sW{BJmUSn(SSEtR`nsp7+JGK<^3{@XfyQ$^ zqZB(^oB6CB#G<@87N?5v(*IuZM`t~es(wFd)9eR+jV@v56jYl41yg(g-=-8ih4U-Yg%HOLCXY#QqILu>q!>Mtj`-zD-0j@M6RFX{)?@56TOu zheIaap?%R!Jw4;R!SpjO^ZcrsZmD?S$~Q`<4Gl9Waiz?rfjnTMff+ju=D5;>47UiA z@W@1t3~-`!<}|%fQ<1rf1!h!lrt+$fy!W}&HDC4TnA~vPj5EI~w(c9|amf<$>D+fx zNprH~s6L&uKp{&X*|ug6asJ6<~p zCBe0dftG5R7hy*WE|2G%wwVno$e^Gu1{rL=(3C{5wmP!)>tfmD3-kK{;E4{8PC7Ws z^`mEr-CZHES<*N>YBS@os+xP}f-=gBjKxu$coZ!!bv1I&5UnjW-q~_bnqRw;bpap~ zL^BLn?d0gzRQ${*LBx7L$jxl;iiz|Vx?A{`TjO~v!_Owl(f2E$$SMiO?n2lIe91V4 z8de88B!fPZuI0bbjG;O`a62!MvcTKPv|B<+dh`)Yw|g%RulY(701 zt0<$~PievmA?ZXOO=@BtIYvK}btN{@7hC<_=gN_CdoTQ3lmY1gY*V1;a05_Gt=(6k zEs?^T|3fP1|39fvaX z%HXm7Q1C>|?Cc%zSeTgqN2(Sz)uY$N;=HzXW1}}=^X_<1{C{6OIYrZNc8VmMm^ed% z_~(`6hY^s+ao|2RTMH@d<@ReUtMsCwQOFz7b+_D&hY(FNlP1_uhv?l9hbr6@f-$0W zF~ckMH{-{NzcdNi{@#u<{e28gEQ0X@7@%meVzV9VZN`h}6SpGLpRi-|fp7KKj3kj# z;4%bLgzEVfViuLp&WHTVoLpaJ?>FIunH+5J4Uh)fpQ_&99xeXs)E-12#8gnZXj{fJ zI7m$;zc>D2kM%l&8nV{}asEx}z1gs(!}`jx6UgEDS&R1J)N{aR#__>S=m!!ExJ{;l zU)s@*0yCMFM$!_pRT3dGaS1{sXTt#_DD=@RB~lPaOQaxZWY}t*GvxxpaT?205TcI+ zjUxLkgAjpGh#mojYfMKJfhf%{N5{VdF(#JR`fITF7c~(X2!?4WoQ*mqu8w2_i_5QB z#vSEea@!O6Ui1NI2lx!Z9ijm~8>n0nrYL%(5|&^*hMB+|bsxwmB&@y>@)ZiU0r)?G zc5q@f@Sk9@NGT*c8f*$s)3y`8Is|_O9SD4`>wXCYWrtaGgzfo#*gP}A250kpNTEc1 ziG97PdcS^J8@;%zQ1t~s<;T<@eUXx74Oqk-Ux_ab^0cJ z@Z*f!@XnE8PS2C0dtnWmF;_eJcgOB-{!_ZVOM&9;*M-ns<(*>(8;Vg_+CHm}$qjCU z;&#a<-Zy{QTYP~lF@I5~|LeVpc=pZhVl)Flp>nm5VlZsCgW%&u6c6$qkO#?&sgJ?+ z?W^JQGi7r->G|f6&5n}0o@06^p#lL{_a_&(25L${^$>g}$d)lV4x&fV3;T!jYqQ6r zN7wrANo6^Frz@-PI+aTFZkj4&msaL#vCp&~2?3PUceB61INW&p<0YR3qe@b^9I5Ov zy`qLeO^R^}iO7C5YyW-FqL1mi<<7%Ak<6aJkr@*Qt1JWWa>B6E-nvPTBb#;R@cq!{ zA1Moc_I$$j^1H!S%ZayBlG1D-zpej8-CIS))wGMcxVyW%Hx9wwo#27s?(Q1g-8~RI zxVyW%yGwB2e1G`YSnI64_Ba=3Uz`g@(ao%>k6 zS3A=et|nVSiPBtf8(-{j515nmtJkyAi^`+3;zP(zh}yAp8Y;zZ?$*Ew4x0jW zqbJUk@!)sxOqyo@K)kg^9gLL%|8oLH@`uZsa!zF3l{lEFtc+w+C&_cXrdLTk)qvZ) zAfv>dtw9%8o`fx>THl;VyXx@@-RfEDG_dve2)%%K@Xwz;!^TM~yt9zDp8xrVP z(2tg~87ydpiv?s?s{*3KH+IH~S}brH7c4s8wF4%uMYTcR2$x7?_}9GFaJT0o2?Ew{ z3Y)c+x98Rf0_tD;*4EW1@^06X`^LiwVRTJ8+8A2p3jJr?yZX3Q($dye;iaZ5vn|zj znpj08o?}+=l7woN6gqC~?LcW+62*e#OdicgCQ5Y8j{Ct~+)nAALIQ)Yv1N^}8o7=J z3dG*A!&IsIXR2_qT<{UTm>sNOREig2>ivqyY612b7@hh7O!$Z;8pz2tbl8Xj&#Yx%FCD5<)oQw^s3GNs0Lt?bv%6ek zlG)$tWaCaaew!jkAC!tB8HEcwc3*MJ82nIn?+!A!aGKie_YMn;0o6ds-&KxH7bUz z{2WvfSb2SzsNEXLJyAiR`~L69V?V#6Lz-!C;RR2ViChsMK$x?fKP0zs`hz`BKX4KF z0C)I2lFRLMk9Y%@bdGQ?YI-N1gu+hKHC9M;k33;)CQm9))l^&3YcU)xsPNVJxg zcFl?FC^ZQ*h$i1256oLpnQ}|5p3p_iJ&9_ntO-GO)^@t}+_W zFBoVvj>RbS*l%8Z{eR+1o7H~NZZ)HoPt0Zt>68=FTnJCW3S@VKNc8ek9INDHcbjQ{ z6Xpi`<*u!YSZ1NE1A3wK3uc z#E6nJF%>PJz3g~D@OcF*aar`56sTVv;}{K`G0e;up*h0oInV zO*?fxbOvdvWgKaO#ZmN|A;G<3%zUwSZCm$rJuC)6(6{*LiK~tzq`R8;s@xk<-YH_WP`&n~8Ex_G@0J@x#3hj(6V=eeu-Ddc_RPRV^$%# z{8#Nlt{=sW#g?R4qTf@0UTdE|!dUT3>VN0<4s(`^?yq5`?#F1# zsudZ4v*yz7!+Z*E&?IxCltQnf+@8>4JVB-nLYqU?5il+93 z77kj~9mO>wljkB0o~XM!Gt6v{+AsPIIL-VFM&&2CUF-W$#jc6_?h~lvAwRU1B=6Ui z@0=rTC}NYuhq`}Uo2SZS>F6`0wuhrxY)WHP7l|`$+p={q`81t$CR?_CYw^U7%zNb; zk(z>$t6|L?|3jyHa&1QK7(ZkLz~*PJStcvwIpCUOX=MUxYyE!oJ#aZDM_(%so8triT_eiD<#6ba(rZ}8!^5{mU>RrjPa#CRn)Vs z_KznyTC0}E4LkL?`fmoV=)CkqZA)fl`kmXyY49>nwAJ1zgZiO{^IrlN*YN@Q>-~%;zjtwq>7@WsZQjSQ=LL` z?`3u@neD!&dt0vCQr7#U%YjdNN>Y{kz+89qT_2VCyXAn4{L&l1UkQVY0mYA35hl(G zoIwen%o|zyEH#GjUA@QH}uq zoB!6MG33hy#a#Nr#k3hp!006ccgwp!6vVuS=UGY3MYtx0!{K{aW$W?H%)rM@@w_i7 za?BgeZgL{?s+MeLbp()LUMWgy`$6yob2k3G$| zn};rV7V)(f-E86(qWk{Ych{*CtsP+U{%dxo@Hw(5C zys43c6%WR5R$h~MTM}oL^LLOSK9={^L@Cd5wXc!Mo2Cl@#9jcM>Qz}h*v35CfCS6d zi%<^eNUey3vHF^_!h6s6_>D2a_br_-tS3ezpej!({Ap5+;+%LlXH+5Sopz9O{Q?3` zgX-i*xKHo{`Vl?J-` zIglYD*{+xL8w?H-`=x~rC7hZ5<)hcX{NA9+ClSzjkgPm3R@X0Y9m?0v=I)9uddYuO z&HFJY92r-*z}-5uAwO^%ddztydNas~7B|y1$T${}B%Jsqp@cO#(`feR?l$wlr_K(z zxyKkBn!M|?wd3Jq`7EXfL}VobkKsZzP=lszwJ(guGiJGk&6Dq(L81O>#-!B%-%V4p!tmG0miFv(?ERz4HpNo`n#=2yO(JCY}=aed|s?>)fFAeu5ZXVkG?5 zmtRzvag=O-&kLLzYoxW`V_zZO)c)l?xn!n!F{{`~4bmZlz;OTL{(e!>@Mspj}mKi=Ht5gyDcee9C-=OlN#4{_(c48dg!=IJDy3a=`sq=HY$o~|8AYF!qAB>w8fh_ zdv49qB?${s6a=g66SurD6bi2LaDL?k{mRSoh_0hsX}lHoZOwn0#MY_ED_5~MEBYCZ z%aWFDTIPvBdRe#!xZ1nF7A1MU@f|YvXF}J18!Z3lp|YU0wT+_#kroj%JNw57TIr+Y z_$>d~-v6J+|Li9JQF8nf?D(hrr}{r7^JmHOS+ahXY@g*PkK>ca@yX-(aRwaeeZ*{_+4HA(wyn0Or3u0P|lSfcY;E!2Fj7 z_}KFP?{R;50Or3u0LxzoB4Y@a-~Pu|By{{O1S_Q_-W_dI~rMky!(G^GRhhmntlJckLBZP_=n97U?$?=VkY`HQsKM($AKT|0{$`>m5dy0 zoa_yZ9Ef;$h!{m(9mSO$KjJC>dL+*Ban1Z~10UZ&Nqd+r%iw_VN4Q zcKvgVg1wD_vXSG*>oO{ch!HWW7`ZwUF-lr}H!%|WEQLQy$&cpzQ$^X)-pRo6Z@V0b z03UV!74uQ}sPa$v=Hr_GCjr7g9s7Tg2!V(h@bRwx=M)uZIxE(z>_}c4m5T=;imn|% zqQI3WV-B#OufFWi3Pj*(Z~O{pQY6%s2)$S4;?*?(q?J5TgdqpxA3els=c3QIg7xo@ z#dkj5E3YkIcA&$ zW4oKZVk(|<%MW4QsmA4H95rQMGtUU#=DicUhs2gN9^K6lCR(D!Ym$H3vDd$Mzdeq~ z?YD=&UN`7Co-r!b8~L31V36Q>FY&*(#phiCL`>x8oXLfrp;$z)Yj3kffXL#YKGkkV916a(Mo=>2Wln%QmkD=))RNW`cpUBO-R=N~r?Z25@> z%1DgnP=?xzphB)^4k2A;xRXxm83;4mO(GE zR7q_B&&7wtsYQx}77IqE!VuLDdR16v+^8-$U;5RB)YxUeq?f?qMllMU0#(*d?!E(z zPLvOl_?ye$-w;}02hZSS#eAeoN149`xfzztUTx`48rI3k4P z=?0V_r-6mf@QeR@&PJ|!MfW=agDL+9rDXh5eL4O!xEc- zvaKqN!e^Ahs!jHod%yB7I6I0Tfm&_G>g9dK9}Ua*PY=&+?dBsP4-@qFO(7x2v=K=D zZU@5*0vP)NcLD@}?t~X14Zg*_aXzZY7RJnlw4mi{6|{TwO)(MfSM^N+*MlRIaC#a$ zZ!y> zN(lTK+2m6Rkjt8$AwPVCsve;YJWymo%xx2fB->CC?usN*oK%9{^FkC^W|4xcR5VYWTf$$nJnel)-!}o~Otl&P zWwv)Q>eDg`>4U& z#lSu?@0MlNrc^|cD#!}iV~n$Za~MNltllbilw1Lia6(>GO|K%bbH|_nM11pBbYXaoz@U@2NM zBB10`x8jxkak$)rnmh%-2M60+sumuz-1HkD?z9S^zxuB|Yg7r}gJY~}RDH)Nzz(L< zi$F-CyDSYl)XtEH53sQK^9>k5C}w8Dn{M}~#xjomj`?@y%Ke%8K@0s5rzfFT-fgC6 zu3lmrh<@K5IxKz!St%DGK|0H!U%zZ_QsBKBz?v~n0qJ{(DyX&CLn?Jmp?3tNuD}a{ zcP8Iwf6!QbG&^?~ zFF6U0;w1-@(@Tq2h{%xKfJSI&xJuKJCJaW7CQ$z}s}K0* zLQiog#1q{?vF-$_tvi*sD-?r3psUNTq?Z&6p>Z$toI5}Y{s`|`A&tPpPH|z+)%U=b zGlx5fItRvS994At&c6EG*JT8---7nU3ftdifjc^R>oI(%Prc%))$jJiZmXr=v^(nm z`ywyMF%|0vD>jU4x-Sk`_c<4r^eH_hzbg2&b)lQW{In9bhSSeBG*wO8D?u}Hi=3|x z=qIY!8fXXMjCVe{je7_eTP{>-|r=APg*1U6uH{9QKge^ny@-_Td;t6sG#gf6=D?RN_} zJO$TjNDJ^R$Ez5syFb>tF*f+JkX;8KTJp@m9I1>|q=_VxTvn6A47(p#U)dF9uz(td zHEGXmM+uZ&;?{DjCK3LSU=u?`*>C;)j~}*qS0@X2&GWbpVHCX;^*YGDcBLT}1dXb3 zyKp)z4^Ogw$CEZuJ{(r$7=lYn+O=Cs6Ab~}kO{gTgpYj8H#;x8#JTCpcY{N0c3(|p zE5FR0==52!&nmZ-l}fVc@6EHSY9ARSt4Py(s}MY%Ox8MZHXOs-PvjC zJ$4z`L~ocnNe^NX%9gMTdyz@&5 zcj=+p(KJlte#%MnGG`>O3vJv;hAA7UdBXiRZ{fa@?0yIBFT}+AZyNrOBmG-W{zJn7 zY@eFP_NjUQnq&OXSoTlNWB=5=PsIX!Diz>UrvRTC5BSu00Q)EJQ{w@j8V~r?c)+K| z12{glk>gVvIX<$AUHf6pH?(_c+yX8L>n zn3?|an3?|an3?|an3?|an3?|an3?|an3?|aK6c#xS38&ipFF@P??aORY2SxIewLp+ zz+c{f*6hE3`TwzIe@v48Z#Da$j{W;e{@+fp${1OjIGPeMGk?5W|5dZCqF31A-m-LK zCqR#nb(oppOv75d*KIq!JL@s9CV@}h_?ZSI>3$thQlJv(L#=ZrmcC3iS?yw|>)Jk*AJzpTw<+tkXRKb*MxygZ)uyxk-- zW;@&PFTNJN|7gMDT_roJS{M%A$>hsJoO=j831D;RIFKiN<9I9-@ZkNxc$Up~?&$4a=kwHh((@KMHFcK#w)$SC!u?Y1^W;&aiupVX>C<{)CbDGL z>qK+R_rwXGaAhxed6^Leyg3wvlq+t>{W0#BuGU`IavxH^&NJMX*qEa-R z@|}LLI|8R=lK7Q_%t&N{WU=dmTZh`2qqqDuKo#zZAdag0#~ zyx!c*pz1mr;Yu5!la1rLu{>)9$(Z8T_ghCYHagCu7kyD*ykJUNKe!`$m|;T|69{kV zM8mwB{r-mS>7aEGFr3{iaRG8ypg6=@xb@#dkZEu+MZ_OD5P7SbAO(-*&L#aMdG}UX zkE!*fzh}80w-gr@3~BumkJG1MvWn8D7{XDI$>4#O0H_NSvrd%+OwK&4Vkwu)o2x1+)F?l@sX7TO^>!yepGthsry+jX;#f(F%jKk$sV z@hbKd>V%*6W@!R-aR~*6R9)I4FT`0j7bc8HCYb7&ZO0@@5e-_(s2E85jHE3hF{oCY zR<7--!Zj3xmq^ zOT%GYAcR0Kh=w%+@Z)o%D6A=H)(qDGRzK!o^*z%Yhl z1kmt>u$?VLFmhV#+gDXJjX1Mc{ocdL5Hqj%5Jjv5IiADB;$S|8jrTxgq6i!Y%q?o7 z)SgLqFk7Krp+BLp*1t%uz*>T=n7%_0w_Vgz%oJ3ogW4;N`JT@9tyQ{IA3H+353R;q zEgOIR4w0#Bknewyn?H+@VS5ck715I21wWI4I5*HroY<%~QkI@BVEJ9laA=qGeq6Robr-SfdM9Th1Px7Vcl#jY z(d!VXwwGhuX@QK-g_*r4VK|UE>G3G|t@4~92f2F(UXPs`Eiknp zTcew<7IwVR8>Y_na7Hj=%Rt2x@ivgDj}{b%eha?&D^nFnMne$OkP~8hQmi%sKw*32 z5~)lnCO^Gux25ay4{$5_!?*9#q%dwhXeA!SF}qvCak=Gsh(ij@4JEZQ&y^Solgzhi zNSpqKAvB&3>{L8cjl|J0I%6buB-HwUTHAN`PbfnZ(vWwb^+PL){9u+%uszdr3cC45 z;)a47T3?-KRylv-a%lb_RlW>sk-FfFwe0fZD@6oT&0n3O(*RX?qy_=McXPEg=#8wS zJKx8cYLMRiV<)xg?{v+PK}=FV3tjw#E^?-+~v3TaymH7Eo53?rXnAU^s*$uq1;FI}2?rsxSU~B}qqz ztQ(yPb}HnacM!In3oFIBPp?Z>l8DzIScOZ8%d1esw&DAMb z?5)l;A?@v2or9h*l=PEzF34KUJ}4^fg7ooA#Yayr?XI&Pv6;cdL5#;YXZDUmKDMe$2nC<$Zob|PuT!#xO>}=MLozeAOxL#PFVt943 zQ$XXa*gU-hvd2WYFnyIBw$U6djb^ogrSW-V`-Nm6VK%g`Hv3$C2D?Uz$vlBe6*RS$ zXd+oLpDxuCTv+C<8?D=lUGf`&$MLQGW|BYtZa>>xDE6e-G;fB*Ff5T%}Dsp{%Liw^{WI6_2Urdq5clDAH%ND*n zrSGY10}E|d&(%WG(r|3mHc8nLXW%Agnhec<{BxRgjQCQ-^b37_t%L4q!HO`c{rS7t z3gYHhY27zla+TNHa_hkozwJCf$+c`R7hNGxiPcc%EDZpy`Hnr%+Sg$qWD@LI#%>&q zY9|gJ)MkS;cp&jgU5b=yCJWEhUP8`N?QDVxbZKLagUi zQ)Mqbm0C$}SvR06ojM4Ttx3hE;(5PsoQ8~|;fd6s5Dh`OMS-bAry~8r~dRyCm2UUH# z=KF6Wfqzu--~RL;LD|nx>;L7TEZ`%o&HU-ujQ=-7v@HLFJO0znfA{_WW(W>tBvTM*_DR}K=Xg(prJrUU0q%>g8V!MP;jBDfVW@xk(^44(lgF+GUKR}SnS{o zBa_J2hx9YK4-Nxx-aV&x-ut@n-rfd!dUmgy6Hr^Z`?jI~LUynBA-d_zZ z;Rbvv5C`}>e7IzM9o|pNcy0 z+TTtDOBoPekzTG^W>Agf<+Y3Q2=bznA@^Ba^~P@K*SHF6m4@P7-KSjwIJyoki2E}M z;B+GRs7$~L5jU0BGYCy9>%v}d1)~W}FFQqVI&mPKxEV5JsKt z(*$0_9}CTKkGZHl@w%VuaBkK}X7yfPNg~>Gi*D}Cn7p4gzt5=~wGiLzKu-5LSnKEF zq)Y|@C6}qbj=;F`B%1e=TVx(r;vfDD<*P5?*ipIeIpK0T7{a}1b@U(701zqDf(8Z z@7Ewx1Y^-0bVd-FrR4cj@VuqgCA`{-Y)0P9K)z)tid^L%>4D4Xk9@0RbTSs5XxDOrgmzf3N187 z01JE#nc4d3*J;D$AADeE+p_h>l4JFAkLmk2t1%t20h=REaLn@tMqxD|(JKigPYFld z*tIt9mm}7aw5k7>-DEWR2U|(Zj@WWac-VcE3m5~7&EPAOT<>zv_c_dOAhgd!-Hw}1 zrbCMwydd(ANja~TZU%fsF5or|J^afYT-+qRett;?!(px1IkHL$6{lAhmn+wokjA&7 ze^hL?yOa=W;qmxm2;r=#N(`-e`VgomRBf|+odphmN;cvgS=)iB2Z})>$P;zkyJBW* zr13xjy4yB=4=98Yo8+4kWmu`3#64YCJpD*{yt&QP0K*r4d^3iYKNlQ~NkOOtKtdC+ z47ft20quc`-TJDc^8!JZOO`$^E>eCc!@gM2Fdqm-gm6k*)QLa=YjDYGH^<65w&T_iE2cl3#Gc}XhR2*`cN1Zj{4}JXG8U~L+ISDJ&AW6G#yJ0L~ zpJmfbUYIeip{`ka*eshVA zK|9mp?+2!?c4rzG7ga^Lp;lRNAlOSHFm)avzi!PC{+yrhzp)f{x7PR~cT9*M@qOSI zV`Mb*Ac6TIMROi1MsyXYzRx3Q{n1AGK|)O@ElCjzkekM@r9Wr!@U5X^>hz*}-BIjO zXe#84q3K_A+Lf>0XP!;YLCty*_`t_Dcr8Qi4jjqa zA|}i`i8@eYtzfb^CpUD!Ak}^^2K6cu3a+4UrNv}6(`6C??vXoq8n#PNt1o3MCVZI0 zpX20~!-7PxUB?)0X)-C+wlTPtN{;^E07h&viMhuBoE|TTbO+KLubQF14=;%I0zs39 zouwtD6&tt%@_@iV@iI%)7hsz>xpRHTT-M`#n;Slyh1aO_r4piYKQgO~7QpjsD-~od zJvXcZ&s7joP4<8Qf2}d5XlOGXip=Ts3#zB7T7VgMJnruZZ7@5qj}(256|Y|*3}z{K-%@Z_kq>}tZuUngZaNo*~RW0}w7m51{l zf3uOYp;he}Cg>g3U%9OqI#3<51^Ch|qvS#dY9p~7t>n*XXX5|%`cm4|!8CxCAC6F& z2xpMkC?hMpo(Kmc%7G;A?U^TQx?B0ZA;5jEApRgIJ7ugJ$0MciW1sG^PpE-qfEp&+MIm2tig^ zDI<*Z5*lcrRkPz2xc)iu7|dx8;F#~P4FGLFS2)e$bTJTmswDN3C4VXyY}X(l4UyGf z#OoK%v1!5g9){6CX^TR@xks)!RV8FN1v?kDYULm1?9r8c%0W`)uSaBWXN}`ftnIm= zVw4#)8His^G0yOFl0~{n0vd)`f`)35(H!Fzthxi8G=( zpS8R67D2Yj7CfsWDcZLtW>aHWp=$6=ND$F3V6w1Fkew({Omx>&`hf_6v29XUB9xj! zs{n5<)_%cLbdQM8ZZV@2^w0`d`(Q*)p_XPeP=rZn2z+u+7b2?0ChNpL2p;%!Ny+K_ zFPIJ~WIixAYdW1T652Jsq```*ArL=^#i<|%^uZjk83t8G=p*YRt7?CAz6 z;Y9MpZVr0xaR_Qq`h%Xjrs%c(RbKoqb>rbdqh_9!8k5SV;!)98oMki2ZZ=oogzBX0 zp)L{`DA4t!hq)^%2LtI93AV5togGQ=J# z3-f7;tAhB=NHw!|W|yGx(Lm%2A*GoYNQ${Zon4tRF*ZUgY${4x#z2gWeQoF_WHcRs z0omxG4Bs&V5zv?%V}L>s=CUQ!!nE2w86^@-x=4JXHtwo>s^Biq7sF|;N*iS#-DGlf z^!nZ;vI0R!jUMCbac=YRSv{CpsmW0~4BbLGxC@&(78dz}i0pPR9h;so`ez_b6*C97 znEI;N%~J&sQmxp-Pr{=k+-CUV8J{YuC1o1$|Ch`R+8!lO_sV0%O|x1 zo&HjX1GpY4UUbI8_QkDd={)TcTSk>?ke*8C4QPH9oEWBv#F~7v5DxJ<-IGnxo$X%g zOR=)GKdobFG|sE^6cTA7oG|bRRZ5U_0=M)$g2*@hlBm9FavjbQzlX#@mFlgq(HfA` zABkF}w$x;@3!BqUL;^@?DG=4wr7CI2R@Y!A>6AzQUR}ZD`6CQi2@SavafP5qr+;c^ zkeRur1;5p+(bftnTtFL#jc4;TuXSG+p$IR!#Ct5DThEERV-{{bvk6!yFk;sDIB(Q?FlBRV`p98%;vB*(O6j=It3pS`kTwV|I%t_WjBI0R49yHrpIs1s-&J{}i~M9Q zqJz3`exN_4ixwb_B6TIz0p1j2&SXzls}++Lc0dI?42KKxGhQ3lVN(F*OSMJ*pe$NY zone0A46wDvF%pE=GF1Sn(EW)oetLB*sS39uI$qc$A?^$IW$Rgy^mwt6NU?_FMKbhi-&w!vtk0PFX;DV7=0iQ)!E(eq$7_4Ih#5jnM0@ARSl z>L+xo!{$Fc?z}i*8-7rrc<~pH*OhgGIWC9J{|G{P6#%dF_%4YT%gF`0kCGL~ z=PPoG04E02B($vm8t=3UeWHFU+y~+-;43<93C?zB8bAy6k~@^6&69=St6U~h+B6{}j#R0h`US3U{&$DEc9g z&Nzcef(n7JE{Gzakd(hwr0T-qr>2(^W#3(`O1)yFc;S|!K5k${={*&PHZ1#`+=2VxDJzz_xH z7ur;d*YOT-LFnzUQ^1s0b|$?leQ?RekGFzYbCrN2JuBln$Ki>es5+h62_x{$oy2JR zsG1QSowspO=!(J-(H7t>1$eRzoe^{-cOuB0?DF@i3E@AcwwU82$ z6W464fsItJQWA5Q?AgmPqP%*3a`pAk8d!dfNP`PMTjUb`!5%nhX>1)d|6nqtBu-LHJ$XlrU=9EHFU$Z)rQ zzXYA=5+mz{wYpasFkHw@Yxhuf}^1z?{455&oab}lLnH? z_?#X{q8hK}a+?d?H?WPJ7zMBOh?`~MDPm{TWWY%9Iv#AcMvmjszOLH6=gk8{)R%;# zixduP94IXWTqt7wdY-nnE;Bf^z_wyVuk1Vko&7w8^(jevEu#0)e zjI3;`$ZK^mvBF2nr92b5rN)r*PRDlYzwFysbCi2DHHS8}bLYfezZ(hK?=I%g#yPVl^82(V=nMGZgl{FFy#a z?*YGb%Jd|lVskV$LmG%urMQc+lfj|i_5G%n)H7PObf^s=Y+{K?i7ulA1~-7O)YD-z zT$>S>H%6ws%A8;ffSiXfLpdb_jGGKR5(Qb-HXhC(W5-O~>!K1TZ!tS6(e7xW7Q{MjUJWH3)c46-zv>`z9I`3aeZ^#wCAU+Oanf$l--ak{x|Bi9} zM||(^yz>87v%!FmWvI-bbL5Qw;}XpO8tnsoELmm#oKOG18vA4YA7X$1oPvL!m;Y1j zkB#GF^}zo#_J_w2=e3|Vdkyr{tpg|=oNnpQH3HZvpSSBCpZBvHpT{DS z#_J88_jkyAPwls6ZhD`$w-dA1Xnvpf%bm*oo97M(+OHNKVZ+%8j^1WR95=#lZ=tg5 zhw~c_Cy4K~@6_T&fzB(St#AiB$%y>k^^`_IF4XU+^19y7ITba@MT|b45^pyFb5q&v zFFQAcO8wFAZcl$Y2ounV`*zo+&!0rot}$s16{s68-voU?2qV6&D0NHyDxhl*yiTTy zoB391LAjj8PloJ&J#8*@0nNI1vln15HH1`2Nb;1^35h!i8J-5C*XXQ67k@uRn-2HA z(Nsmsk8e|xIyjB_5cHX2_aN`OHRw!{eC||;;%r&RbcR6r@!E;S`;mET7RyZJ4}e2~ zAZr9IIHFT=yd2;xjdEr}1ZS-yM(NM`ZQ!I?%aPBP@Q|}bUP3A+ggg4lmvE6~pku3( z$5#2uYGBXo)uFxK=S3C!zCDpf_bQr0d8Aews_Ux<&79T_-V~TsE_P>T)#0JRqk01s zRDM1U0&_e0mTZJ(*jc`=Y+kEliAUp$9)G=-{=EXPQGY{WS@Xg$Y}=Eb4~W5&b}RP! z)4pD5(xi@7o#Cmo@Z5+R0yI22n`4tzS%{+hNvEvBSg(gHb*dH>Y1ub8Adg{URbI7_>KAawro7m^j_3*nvhM88<=noc z?Dcj2ZI)v%G~#ducQMJ%k~InNdfcjdOyGx2(c#QvV5pq6uZ2HV8B-V?84N1bYVHob zSwa2I=PiZi39s9%^xK$G#jAv@OtkE^f7vFe1%QbFcz)2(XrcCP!t%~(Nj!UtUXJF9 z!HXwC-BXz2umn;$0fsBh1HJQx|}E+Uy36oVPrjndf}XOV26X>IE3ZXYbV3O zdT4MN;1XEUA@96+=6|`{5=b?@fOL4WDM901cBQ^V1bMS8D#*c zLoImz6+%Dc2Q4tB7HM&G#lL;WmxzpSqj6~gq*w~zDF=f z!8*3X&7L-KweTlwPd!~|Y`X(%Ro6y?6*ZxjR7&dMNbf~n|r~?&kf{jX@ zu=V#pKxiaiLh`8is?%E}57uhB%33g8*5!sx%9%=k0A|ap0JJJ*RZ3lyHK&J$27MQl z-3L2I(ZvpNy1Cx|;)=#J_<61`7O!8?$2*nU=r7#T+@*-KM7q4(=Po=e+?U;)P-4H&A6`e#?FBqu_=?^YL z-7#`r*)Ldw3!JT$;Kp6k+G0x*$e|qho|Q>~cTZykR+*&jvy0K_dtsqc5j}2&<&Smh z0|4m~%#=Jy0UdDM9P0D1V<$Hr=pVnP=&jTj+?MLoyWC}ewT~P^CFc@gDTt@YPd~ad zH*gxa%TBeS!aq=oiFUuweDz!dth9ve)ypHAJ@^7~U4-A?E7Fq%Y-D#q;LEwGVrGhw3eN^7Y_46o_P{+#xj&k6`6N8b0j0r_bw1l{f!iRX^ zCDzZtI+em`WZU4!>rY75D;cW}4r?|dRfbNaboE1H1%eu&EwW!j%1}|nXXE>Dj&})f z4=RuH)l!YYbmh~Lp(XK{J?ahGNXFfRjYhqki(E#s(zP%2(sA_cP-bl! zn$~sC-)y=2s|QBDrim?oC3y&!yFw$un(Ep%a@eE%qJAghbVwG&HWEr@(&c27LZ&h* zuT!G+ou!DFFVGsf*8Kr*n(1gC?k9CR2Q`m7XJo;26EU{wd1G!28Fl zOQhv4h%u*I8OGG|=CjCoId%^wSJ*PNh6LF#B1ca3{GY|x!PUzS-s-wQCQVAO(^&e_ z35NL2XE|sYxkjUh4}co$w*0l$4l{qc5YTK-{-1q^(F>46yQ@r zG4}pyIN=AYWCB$Q;+PBjLv{%_g$$hqe-d0$QeFZGw`ck)vS)tBUU;{KyTLlXRE}Nu z(Ud)aP}W)owATzhy^y;to;|pTrLl~KigYG_Zr!*?BlpFMlm#1)LNqs$x2T-qC*YNw zJCG;O@S8VnvKt{=pwr!o+4EvF_=ZmO5;7Xr^1W|lxE(LMGtR+21-TokozlajFRh7X zLKxDtEKRiNA9mq^FVi1`uiN`ODJ5gxgu?KCKk~h!?(lCOOG`#tdf-?ubPhACSDBlE z%+y}zE*VBpg5iqL+e_Y_Z~8gJzppjym2Gn$WZBuzOFcz~`Q8>gyO|7wh{|G11-*Qh zYn@pNYR%@#wbrl;%KSb5Ow7J)UkcHUS%0|>uTgNT)o`;L=U+ZJYi1RE;OS6dV@~{v zpLi+Qr!H^6P1lCvtILvo-4H8tL4KyY1G8FXgJB6NAV-4}UQr8X+k>?n@y;z^zlu++o~Q;M4_Vx~4k&+kRE6f%qB4XhmgD+?1W)(n zm;vTU8nfi7NIYu*(aL?J)X`M&RZk#h(b5-K6*mEDzh{x9A7mvKLQMD==;6dRk!r5z zKvJCJG8Y5OCG-*$G*x1yt7}hkX5mlmp{LrYo@wy6czQlF1$Ouo*-Aq#jmeU!J<3bKJJFgM8AwSD2}_Ecq-z9ia+QKi7_(zw-yJG zA65K8rhR?*HFE+Ysc!DcbNI3Ec&#s-5Xej;T zOoa7JDUHDObt;`c@=T`)sL!@#y-D`fOdK6)x7E+YZqCR@Z1UZ>5Is~T^km!aa z5GF=-`(7LHk?+PP(A^(~R0F^91X?sl;ISD8wEDm#`{7G&1pP5B zL8;n~b6?z|p-kw_wLEe-&WPbT*^%NS+Jji5*gV)7wt%aqiRNpJM;b-hZ0ffO+zGMY zO3M$0S6x(;f5~|AJi*9zhY%m>cYLuOIzT%*%42JmVE~Gwh6*T{fC~Urn8e)`>p?lv1d@T7H-3fn)2FR zJ2jpTPyXr4)txKk10svekSH z90>XiMUf*(U8NgPW-3gvIcXIqry?=^wEv5}_kfCW$^JzV0TBfyXOt#4IW##aIp-#W z(&Q#LNrI>cK{67W*npC0a?T(*gM=mr$r+R=5`68MIePAY&fGUM_ucjG|E*W7Mc4YO zzWS>6uKlapRl9bLeH`skE>q|~M_>HKy7D~rp!ROw0kl#D@^0eTsAIh=uTN5$;Y@Gp z+f~3Z;lRCnc&HIg+w6t*LA2Tx%YD3fm|YakuHEgNV`mEZm>orh%eaH>P$Soupmk1C zYv?uY!0-8<(o+z_-v=*CF_W;BLfjo}s>a;m4v%{eSjsV+{-}AIO(>s{A~gT4)>}lg zGIvTn#7rHxroMiE|F@90?y*H~g)g?xO_ECrGG<7W?@JXIYoOjG`c03xEPkLq|IPI~ zH>^K)bhSyCdFxIgwKaRYk}wYMWEpQ{OhEkjQR#ryWhI$ybZt`9lF>0qE+hDKg|1_I zARyr=M~<7Tc277|yK(*DV<&c#3i5BZA3<;0cFhR+q&YCJtmX`Nc@A9%1AS;67#`0G z=TZzF2J@wTY+L*~ZTM+$fS~>0{!D#9uGG2%7tt&dT3(&x@DVlGs=>4f#qOePm95Wo z;kWBHK;=GTdf|6}sD$aorwpeQtSfCH)~x#I4I69pt>j-G2lQa33SgpLR&bZ$O?-aB z=ioV9>NTIW3t(#p-(DlIsvXn4y@FSxMGw-NuBckNy~-sm^M-lZDBya3Kg!!hz)=t6 zr=;5RU_3lV){pf~La5rOHb&lN(HkJ*+O_A5w~{_=$MoT4JbAcwo9ToHC=f}_)MK*^ zb7RZ^V0F8epU2ZUU3a@Oixp!BsY#?f1$3^p-QH2|NV;?}V(g|(mVW@DU|!&X<+$UI z2~({cPvzdy6`$|Nn7mlY3n*_LL0Gh@Y85VFYzYIbeOMqvPkm%?dxl}4;v-tQrYZVc z{A|sJqi9DPZf1=;r$ccZrmHyO)>s7&XIb6UEM|*I&AJxfg>$%H_&mdAV^ix>&CX`8 z8CQJzT+b7;FjtJQkl0XWtXVKy|AuJNr^lu_=H+VXsp?@hh%JUk3Yajcclm8o|*{0eHTb| z5PS@4W6JjM;Fx-ERwVB-K%7PorX4#NXn1GDM(Gu(-uv%tzO-$y>8dMzYxXEln>#lx zRXGb`Uvi>p$?1vYtiH*E_HS+YsH5TE5(CPkxqm0_ESv7c8oAx`F*MT3I z(bsR8JQ+Fnn0hU!N%Ux!TF{QbIT6mn@JI~2x@rq7 zQP&{t(Ior8r-yB{GHEg~VWxN`JJz+Chth_2PJ*|jZy)>7f4V!k=E6jmYmgL6ftnSX zSiQk3l|M<~>SHG(cl`zrSr zh7v)x&U9)HNAS0gSr0tsyZW0EQTVx?!@dQjFkcsIMwGw$C*8V|mYhi-$ve}Z5&xXOKwHp23q2N6=bSWz9Xdoeoeub~ zJ`y`&-?;f~T~U0H_5gu0v#gqWqYyiLTD?*8LGHyY-m$5)?(G_4y`H5Q!-DR}RlC5X zrmvlNLWi-uiHXd&iBtV*9cTHboz|a5yAR?86>Lcku->7yu zl{9)^xG-nf)q_(hT)>%w={Rq^MWteqe=fdsiiDFMrVqAG&Ze$AeV^%K%u+J{EEc~G z&O)_*BlG-BQFx!ti}-d{^UKGm2Ju4v!p4R|mbShX@dPOJSR^Ftu__bx;PXqZCPsUY zAaEkS)A@yfq(kt21`VB78;|Dt27r?mY!mMM&OvYtzDfNsNRouV@be93!*VwnUafUj zyhV^~Sg|+OT3{rfBvHItW=XU(Rh@1)kSb{#A>ggWZAs&SaMPw;M(FZ!e}}#kwZ_<} zv)@}3^oP)dD%WqP7y$K^+o)9w;3}{|Is-_~Dc()8K`fS5onsgOh$N_vN;Y}Jy`X$u z2T_LE1U{e+foJnw?aEK%ik8iX5dx~_w0gsV>6S5FD-6>>d6dTc^AGhIVzo;0isx8; zY@f$!PCG2)&ZxhC(|Tw>z(l`J(;i^DP!I3*crJ2qqdoh;ibBOX#X>W8ZFup8MA7#z z8wbvrF)Ru6>uktEx7AJ);#(X|mr|@2ecu1D@c-k?*dGhrKNtT0esb*pgDd~s1{x5k zmBruuJs9w!JzxC&v>e)F!#_H00R59)f#2WxgKE-t?rxe^Fd1h@7iXs*J}88L_^oho zM(aQ37HHRgRz~*^SD%Vjb~d(XPZsE7 zjodmO5cl7`M*Qw+;*Z+=(FSgPJ4^JLHC`UHYY6T?4zLOFq0brq+KKo+_5BmZePwwi zd5jx3FfeYQ|1iGKV#r|NU}586W8vUnd&u#SftiI3$VT~qlZTU)hl!Pq^+zE$Zr!?thl@vyhljp~hK!2!-wxkD zU=ZToc!qWR<_!P_CgF{ngg3r-V9=tg`bWU{Tfn)6jfHy?^Tus-vf6!&8<^NPZr;YZ ziEacY)-80iFmIxpLr6qSN`H%ljGXte9()wQCuHtXfh(=W2yuP&+c<+_PzS$&c61p9 zj5+3gtDvxqoBQinba7N@y4*y6?(bjv@pA(c>n1i1I*peQO)yMMTr6ztKQi3FB)myV zL`*`jW&VB%i&q=M$N#GAGxp=?))9c~_Zf`4H*cU@a+4543gcVWpUV9IqyGm{;3m&% zUu#9Kh+yS}lN>x=jwS8{8NUMh8uS&&nsR7GDKt57A3QsLrTQ zv(9~=d>$dOO7zL30vub|Uv1Hv7+m95Ul!lW!h84MB{NOzB}avS7}F^Qw&vfs!ry-w zrCN0O#!*Ete-wP%b97sa8qevb1uso>Ry0lUs_qb}jueRYiD4RHO=I=Ftj?$vyVeqE z^NDaaB-h8*G>_-j&*T>lrzE3MCrL}xzWqG-7?9r1fM;fZ%ZO$vW> z#ZPqyuvTaR0y&377K3#&eiDEsRexKcV^(f~hxvu)UsqTkO{3KRZUp>~dkK6seaR~2 z*pR!lE$?{x!w;h38kdJCm%w5j`zG09Ky239P;_^OnMNm0X4#P_07OXn19gW7AJzXi zm*c<2o>(}Wljh#F?q*6*gj$Z{W)*D-AKa2QC-G3!!%lXHuXfm4_s-`ZWctg1sUPzq zFy48@vbh~E<5wI5`H#7oyji{)T3?Z=?D8Q06vun_dsagI2Oa%xTcq4g08e#L_ZPmo zZ*nRJiU|9@{k)N4BT|A0xd0smQYJAN6(Kg5f=|x?ezv=a*gp59V~Naxc2~OCx29;8 zW33V7yLKgqjN;u51mr)sE2_-w;B3d zE&EBom?N!dCN_Yf2v`tXhWW&Pt%%zsK3Td>LaqjC>kxH2+#x$twJaK91twMj!|HT( zuURe(Yi-9B9y?kW(QCL{bqFLUS~B@uRsk&|C_kmtKmCkiC+SmtBZ<^yVqC3dUV!kM zm$^;v0arrWs`rZyVDo%j>%H_!?$upZQGIfj2Kb@H;33}b-*R1fWd~F=!Hz3f)>Kq{90XWSWi{-Eh_KgLFNU!k3G;9@r0KyB@P0u?Hp;1xJI?Be zjgok`CR7+ceGUFz|4gwgCxr)?{IzNa*JDD%ruBLy{zp};uIz9&!LqRu_kOE)$~&r6 zbSH9PScVNg^gG4|t(f#`a*s{A_$_IJEzU}{jCQ%M zCW(5tc8Me@;GlJq3|uK0C9j^&Rs1p9I#ZAsyqLib=W7(hoAHbFYNXlpn2}W$Lw?+j z;mQUf*ANcvWOx7<@Fc?XvXiP#saQIMC`>mxuRSO)$~~){fdTAG2u9XY@qcLONhjHS zBA5UCoaoaVjZk;)jPd5n5EtKtTdO)J7iAWHFbsUBr|1rT_bBEd$TMn`NwOagX7Mvl z!0zlD1Z#N`{eH&9W^ME6HYX7fMUBI#&rbCn!z%JkWVcrn@w(rjt{NC@{WV2a;J*5d zkR`mAP4x6};#MaAq{xY4q1rDv)Qiv0}eGQgNK9<(fUav))%0vtco7K}X&0yB1BecY_g5@L%yfnqICBBdtNJwHmH=Xk5XN>j&b>AT4 zSx`PVl4Cj8KwJ2vw5&QxAF#x``0W9lY&k<;51_?PvK`tktDlwC4=5ns$kxZQ9mbj; z$6AA|&+A9vh4C{tE)@6l;<%#Ev)I~3P8YbIr{rt7&CET$cCycOo7|fbZ_H2|0jq6I-!IJR{)G**Qssdm5AY zU=x}!vd>mN@zLAr@VMkK&E)8W*HLYq(-OVA8O31tDzKK692Ke2DL39{?<6VK^PapyT^C}mFYn<%zXj(eeR_%dUPyn~vfc6?^t#-^7FP`?D6%BhbscVKKqu9h{+>9Ts{7N%WAqC0z z9K|+mz!7{f4aov2iXL`M)R`e!b5qHiTV3zlTp^EmQ2d!Sd>n)w|lxPa80H`0d2ij=P@wN6BjMZI8r z7Pe!YtaXSYaTu5fFs2Y;iFhq(m8Ol)Fv{opBJz-puHmfEcjwzItX^{J+Es>`UA2os z+#r6u6g7Cw13GyDVOP>32ZP{FSkuh20<(EwZ8!EH_L`fCcGad1SgHQ1#!)U?CNU7C zp3{zSxE;UWMY?jMEkIyUnCcF4HLcRAZ>3={Ruw(r`1H zk~TawXeu~#)7es1z5@z0FH&H+xAGeQ)zN)Jj*5F>_@#vP6M#Cxyg3_@-R^<4k>XHn z7=#gz6PBPEb#L(vn-Bqe%B2<(8N@C|H(#Q2&Qh~^-=cr&#Be&HJ1#Nw#8lI$#Gz8x z4S`HC$$^74ta#gTszfY|4pK4)vw_;m5IAK?Oc?8UygR6^iZb4UL)U~|jQsd!m0`h{ zZH(W3l~!zS-?qGC&Pw$i5H|#h9uwb~cfIPvPvWJcp&<8YA`?(xpu~r>a=9T2UdzgQ zk%ISGbI`-K%=AF(8!9@t90sl4^iMgaJ@bNcs7TGZa_zoNF9CN*A@c?6+a(~tWvK(- zfFf&f1lHP|5Nlb;3w0xA6T_(p7E^RTQIIfa=gqdr3556pLpvuUaV9YSJk1>t;cF?} zl2j`aG3+m2e8rC$%SOP#TE)ugCscih&}dcPiWD74@WqLmET*pcsxL=x<#|L|eC?Y( zQlxtae8oN?5w*hZJowP(jlro@cu|YMt8L7@2lPY!%mv5nGYxD+MoFgcTk}-;z@O(U zeBWj1GfMCp#uvD++{t!pg+V=|mgPH((Z@#!bMj)j+8~~E=E#yQ!X#OZl*(6ju9vDc zlF`~1qs*>-%RNGI7o<>B?g*1em5lBRa|%b1DNkwgd@KKS7L*(9&F|s;`+yi#kGokOTkp({>&Ir?61&6+8ffM|44Gq+Rk!^;v&MYi`NhzTL8>af6F2z0#I-Xuw=mgpnX1mHse9#My9ZUIFE+Ed?3mBuFza!k@c*sHEKA;jZLudp|?$x4O3@$d*Ao^JO_+yQnYxYSU^hE;@xyT3p{8r$Knh zaPNt6yQ2yb2azBS0sExNCsqRNT0F?KFK$pXfeWN(Mjr!%s?I8^aDg>sa7EUnAPL_s z!EOmI+f6st0^-DUB5F?#z!LynMpHy;T(Eru6I-5$gEw4urN|^d+>?vEwmb|!+Pt1d z53~z2H(Koj`hC2HJPIVF&r;M}csmyf5y`6ui;+sn0h0F!X_&VXEgM5+QnM$J<2!>8 z(c>^othVk5QUHgYfQ3<4nHKS!e@@E@Y`bsmo(8+nO*XHpOcv5{QGZkgZ<2nYv_a__ zsz_F^UDlUadyNomf*|GXbb+b|;*S`Tew-?!2#xTm;u|-cW4l&WX-$IgLGB6{$|*2F zKs3SmQ;oj;I}rP^MES@aNtfykTMu^iqs+;IUJdl7*2X)vay3Kz2+v+~)!hV62lA%6 z(*$*zBwetafVx^iRC+TzjQGxD_g|_>HWD3K$aReJZPELodnpu{lip z;*hD8;Mc_eDIGw{j`vEPgad#rk{sKzRBiJn=d?|ZRG)=ka&8orv{sL_QU283qNsvB`4kt7h zTkM#?!e|XAkS@VnlLabpPWk!`w_H{;HSLYv(TFg@vb2e+;*YELW!=BA5JRO{`941t zWq9`(eJ!(?4jT4;7cCWy;CXw0qdCHN?GBU|WM&KHn^krcT27n%iVM&lMr=QI`ryGnxRkYcQNSiW$n{QJ* ziQT+!rzS+eCgV^5u*B&_a1^2Q?BRp}g^7rYPZ3KW*74OOiv&H01xGKNDoi;H?=DLf z*pQNLvco}6)~hN|S3U#UM%zzNxp5fCsT?KbWa3H`x6xLl{T>wkUdDbZMYv~DBrmcL zXs4^1+pqxr%=D?hRgs5YCJ>t#w+loyey#X|uRLZncom)yaD%QM@pdYr@4Dc(iU?w2 z;s@!iB-3ntO;nH)8-*}ch-isQXdmLu-QoqjZTSrUL#Xq~eInGR7ryB68hs2wT28aKgJrYC6Rx`w3=R79;{L<7SGVaO1@*X$m4!nAEQivSkj*iBX1m7u zBM;HFILEc#!ebv4jsSwhouVN_?&Cw9(^AsH03txs!ci>)m^vaEnL&5q?`amRQHg|8 z48-TE%)^=G6N6Xn>Ft$*s!R%|lFU$_oIkE+o3|S9ti9vIE6%ns&j9J4bZ@^XVCO1* zfc;c@szvnurW)6ZR8Q>b4>Dh4K}6cxNwHie#4%(HlDGOuURcSLZqD`YfN$KVVaY`W4#r@c)HR40&K z4i4#e^5(5B7h4y=$G zCFO=rEPCFwsn;{Q%9&thT4^iYu*or>EegGqekDY#4zbnkHzw8Q8fM>Ja|y{O`G$L$ z%6;P_HTFmILb4?ysw#mTF=4-`@oFySa;H!`v`1>Gwtk__@+anjT8S{L7lxyLDMql0 z1gjQIYiwq18Urn;rqNet2QolaPjMd*9oSTU&eo!Go`Ny;3wk25Ir5AdqSa2< zUjxh~XALV4E7wQpblBMz1$TbOpp$7r=3$qCc>Sjj$6T4Lxf=XQ##stkTA$0`G3)-J z<)P=IcTeR_`D4cb%S z)f$AMUt-OBkvlwoE;cdp?$E|gS$9cmV_Qe3Fv;GaH>ba?{fCwZ*wzC*bJZOWP8-vS zFbVG*bX`cmZen*E&|xadBXZHRCMhKEN=pp6Wz-oO1`-mRiWl#txi!{JnIDptu+ z?#)sjZq3#O4yP*zN@I~p3_2jx2&O>iP7p5Pr5PRe$XmsGC8nnmC2BE96s1nSE^s&c zl~!y{J)?Vqp2+sv%W=JWJ_b@kLY_MHJApUNa6nFTlW}(azrj`Fi^iX}XUZn$jI&oJ zC^oSWx@X-g4&vRcvyXNOYt{1Q^S?yQc~I8RWlQ>RB1Ovv($0}gK5zmfhKwbtjsPMW zK|mQzXjouyvVKD){xgcyH*S-rhM9`<3AB1CF5Qu*1EbKmM2EN}*&$mB zioia$&X7K)F`d{#y}U16LWBK-18uoza&&h`M-b4+*&CAqc}+?@)3_Yux6CL$)!lpl zD#A=iqMiMT<)Aj~Q}te6Wv$MA>-_N^H^*1Burg{8l6Y=j9IXc?%JpR=!%GCVc3?>Y z=jT4LnJQ(Mhh}s`G=3Re)ivzd*&_zoePhK3?hc`<|(cDI^}frxUsMB*ph6CHAiAK z>E$6@Sq}0H(c~v>uf%S~QS(8>(Mz#AJ{-1@@_f`lO_L1~eca&SePF?yPLc+L`!u

TlSHvHqh?H*bgTnqlYGPovN?_|Bm)?57*qPr*%TT}!g7-74FaBxzL4GFVLEV|8h zKchDMwHSk!@oPEfhVCEBF#q_ge5moceDE7b!j!r0ulQ3^1+wv)PsT8Q*yu=xyhF!s z$4)#mUt|O!gk6WWr?`#w-7U-}2bBpfG0!q8aRb-9XbZVO{NQ8=hoU{c)?zEUIDw;Q zr{#%1v_i2MY^!rrYRD~mj{Q2HA3td!^&+B zxWv1h3)7)z(9E_i)_)+Et;#VDryZFcT$1fWT4~kKbs^V^+~CAtf$uY3@}DoLQJp7^ z=a`(~Gbc$2ZcXP?vhG@#k`9fpS*lSh+OG8>K|Ntn(Cq=-b%)NjT!T z_5={(kScT#0uIwUsqSes5UEo>Ij_(*HT(Av_mFa-Px2w}7c{Wiu3_A3i>P$rXYJ2@Lh);{kxSdodGgTDANKrlk+q^^oW{NXV(P-lS zsZQlP44Z@1wp5}BUhJczFrx@9QP3|dfFL!@-tXXrBVA90YF9>_kTD=JWa2#38@d9VoU;pMP7(-G9amhEiQ&Z*X z#5l+oC=;QX=vP2rV|&_aP;B61&W|s@)kUmr@!Qk!y$9_cVbX34x(^5S){O%Pc2#BM zG)Ad;Lep8Gf^Tu2OQ__Iiaf5)w&UX~=PSz6EyFP)HZPOvir$9;NOGxGz9u<62V|dR zsrN4VzduUh@xPA&@xZ{4Zp|AS6)}xaO-~6UOE8U53iSnuaR$)c!Y!RjZ=3{u$LLkp zwNJ|@`&!4cHHxBw1A}`6@&wMsfokdNAi^$#XZBv1I5P>nqhbnrv=EaH|Vu4odx1+SA>XJ~fbUIPUliZIh8ZuLZS(a|J1OP!s;Rsn> zy}CwNa9(YfuZ9X--?^0#A z^D9-e9@pWm;X#uIvY9DRaQ`$vgx`aWNL{{bgqgnK)QNu z)2)0cMNtg*Es7=@WM`_@S4U21)+uY&cB1np(>767bzy&}PCh}|VXmFcEqXo4I6^u; z?&W&j5n&=SIU1}*H3u?57PJzoXE%7%zc)>Khsqye^XT>V94y2RpZd7m>ISc0YT`i# zuePlf>6)#GM)ama{3pZk^4Zi7d98Js6WV&>a*D)n%?k2E^TKkqMZkPvfwH~e-lEdD z`XcFfJA%=UppT5b<5a7V!AaNRc>3xzI)axwSIo=>2QN&DMywZ| zC+rV}n0%7xQdJ|!Xe#5{DQ_GEbvMzR7LbC$E@6S{xT&eReBCifZ3jc@8ebDHn#)cA z$=Fsbzk`93+f;Xhbuxdx@Rl5S*v4NaY(14%zuXDWAy#Y5Ep99187FLs^dM-xiqy9j zNmFl<4GZYC0!pW_U`n*Is3gEGDWbLLtNG2VLW{k8jq(cGYiPuj$DUluiI4F%uQmAV z>_g`oQ|mj^;tZLG28KYJ;qeOJG1`OjXDdyB1<&kcSH6+1yFN9nQX#7@Ka8H&&eUCU z+*t0=t7c?d)qwJ`_ySn)*;0Yy`@NZQouQByE4@%>$4?mRZ!vD+|D}$6_BS0F@|QX? z$!hmceVJsVf7ws_nCJ?gbnx;!g>#|Agx*ZND$U#XkRw(F)g35+Q6;ihc*L6G ztZK7cf|81k(7etFwX|pcjEm$u2BXO1D4nGIdbqRN(AXC0mQH48ARSegLe=JEi$$uD z4zN*QJHtjPb&TUq%;V}NJ6(a8ZYsZmh~F*Ia1mlVbT*Pq!{6E>Tl zwwYunRg7jV$``fzP+|L32qfzGu!^2h)}-@Isxz#Nr$`qDJj=alvb6N%^xF5@1=gen zD?G1t&+i^HFXuRV+GMrV;Thk|3?B_`>M4k1rnf`sRj5bL97ce%pQyaI=mE#j2pci=IU4zOtQ!9%CR9hj{PbZE5kQZM73|iFL#JCf{H88B;HL+lhfHmjD zcMO>L*}JF4AYnwl+N@KvGl2z8EWz_KB2T&zh$wqvUO`0{0^nsMvF3ht!eA@u8D-|M zKaQavDuy9W^^ZcNr!d- zV}x}XqbmbyI#w1#eT9et14ln44<8A05gi~3<^on9qPeHFk|~c!%<7XzDl;N3mNL3u zPG*i$UyRVC=BIUDNy$uEr3*bm&)2YQ{-rT9uIZe+#3stEj@ZZhR80!rb` z^c8xDEO`;at^A%yRiI@lhOFwLvyw6?Ub=EpdbYy*x)HXc@)4@C_aZ&@sF@L?V}E^Z z5#iONewe9>RTWVJNT*)sxGlmF0@o!k!ro5B+x)qO;Z)Mx`OSaw?1Y*j#dh4 z4JcJCl5hI!ofcz0gYzaC+Bun$Vp$LQ%ov5$ zeb#!hpWvI~lY;ee8%e>M$6c%S3(rI7?WH%$4=cYSmbIPkdRUI*p2PN12&E)V)^@w; z+BR?8pzkd()yf&1tD%K1D?7+WuyIRnDq%+xl2Q{6S`Zu0!rKuAzg=Rm>={GM=8{U} z31buCU&Xq-*`4y8pC2cC_o;3K#0I5ONwtqe zh(5Du{P+lG<95E5ev{_^bNkir{y~HKpBqHoApN=B#bUW)@`9LiI7_$rIAmI!dtB1Z z`d%BxUG@K3CIOY7&im(N*=MUNztR30To1lJh}M|g?~M4;g8{00iLMC$kV-Sq{s=cuey7p@&{eK>s@DiUO*wCa1anJKQu6Y35;E{3{lA96j~BtVACvrd-}j zLqKn*#@j%72*MxX-uQ{(OSBmM*@#I2*x;nOj~{fMsRQ-JH|FvM_RLD4kIrgy@xLAt zb9w3UnEfw=0WvWLJJ8iZKZb-Ykp$Mys z**Y+z0BkgFVnyhB_(<&0@7VLVf47*!U|I#Sa7tx4Wh0n%DzTLi!JQM)n}@5T2P3d< zmP4IFzq7AaUt{~pQAuYxFK3*5%U?l1IM|1lF{#^+fJ5kjpy6((_|t}S0HVM*ZU?x8 zu*{}g%NbBZt2K`e8ibl&$X8A2zhJl-r{em8*b4$HE$@$Cj)OBg^BedH*gUC7rA<0@ zD>-^PanP)=+pzz#C|7ALze3#&@;HCYYAG|8wm%p5Sa&J#$%sxVzHCZeNrT>GXsP|l zH}~)^kOQDwtys$R_MXK#A)?geXfEN9XYxayETXXLZGQP!1%Ce`p-#Ah>+-6F*={jx zRdw~tp;k|4lWO%^ZgIUsmFG%2M0IFj+#pui_bMC8aERdVoJZD~oC0vd92W%F1~$WM zcH*|f73~t*6B6wg#;?G2eJsPbw%km0*^NkW6G-*6QwhZ2rKvnutS9Q@8W-;q7foJ| z*&r*Cg8@|dxkj;xijh(5w>_O~UX+Fgho*A?GLYQ;0bdIe96C0bM~{l$(3S!73HZT@ z_9J>!A_B+~?3H#PPUcOxJ&w5A-GT%YKeIH;`0XQUfJ%)O=Qy2*-Hd-(F0#;ucK)h2`gN;^8@JZkGwo{_> z(nPp}6&`_AtAgju-H_xj)}MUDze`c+uUE_-xt2fb%~M4`VU=Gd$WJO#mlbf+2$+%S z3t}O_3xn@<372@qI_YGZcyUTk)NN`N?W8HCSi$|&vV=d^0-B=Q0AI|8So7-S%!KiI zC{lIe>(1@3TWm-7yif&1(eK;dzQVMS9stznDm3-Y@fNAN9`t#7=F~W;>9W{r^MjH| za>pTU3JP$=5W%#wLsf0gsc zvj^P%g2mSDZ{Hc;H%ngb@Q@bMdX{Mv+T$lB2M+m;(eqr|T)gE_O0hPZOKj9X7p!zn zWnxguH1*XEyMaR8%{b7ykUbjw?AmGJL|5W(#Bpw6wK2<@d(W<=c(lpy)i z>3hj{sk9chJ#aCm@G;1%_YLzwIhTE3;kQg1?Ina#*6X)|zIP?rD>t;azhi`jFNsM$ z^A>C1GP(0`FHWH~B=IfC$|ag2Z#`qlm;6rP)!p_ue|a`Ci3)IiAr(q{ zE>GtjM^}(Kur)kl{znb(%9StI0OBVM#-?QI>e4j$NI*soxK@1;Ros@rN;H?J zp#g(`)ykf8HO&GI;&v$3jXNxv-b<;c%3hGb+$PoGu5`%0ilYI(6J(F>G5;MeY;460$rH?0^wmg{njGa-p9mSYBb-7T_@ z>(7AhB*y8wS7yFvq_nkf7l8mXzQ}$G9yf6vHdpJbVbN$|aSYzguU2qV&zh-v>L}P~ zRR4T+Z2$Dj9;V%8>_P>ybo;VsB2&2lTx^+@Vr5p>y{=GleaB4ATl5{wTP=e9aRBK^ z4k<0a5YLrsCenr~;Wu->T3K0j_61~iFoxer52+b;i_>AgL5iIFZM=@T{uvY+*uhg8 z$t$-$=6F1XS>a6Qm{xv!y#v%vz?!oQE}YsO2@eiMK`vC%@EV`Jz+m9WU(h{Qe%D@W z=>$~ERZa;$Q-1VH-C-PTVX|Ia71CZMrc+aciy+`$LXwQvu+QauNY5+J7Var>@UC@9 zxm~u*sGphszLC%^?e-B{(Y~V7g(qSgn>a2hU+f8&-eW7#2O>d}z=Gr+WF53P+f-?) zQS1Je@ns}a_6xoyYyAxEtuk}zKnYd9a)k}WA=FIWG_(P?uC3UE>)EH<1=f&T%rwpO zy7^Q2oR4a=X^rB2;qH8l0&dG0UMyJQ1&8*M3Jsr6)Dd~c3E&eUd_!5M^As%W&B5#fFg|@}}*adH7xXQ0l)tOOPe8-Rz zn!)EXdL#QbTTw_hD-K7cO>S>=B7@oA598eU^StsJ9_&LDS#ND#+&3?&;OK_~eR}{$ zcYa_&_6x39g?BJ3U)eQSh>vO2H}PE~ck=$am{L>xp`dj+C^JvUETKO8cZ}(Kev^z< zNZNkgfA58KmDvPI=ohcp7WOq|jn8{CjLeKgShdep)<4kX#UXw3 z+j#hIJ1^qw%Qua}EUFvIJIWuAmbx=b?5Pw;wcaWHr`YrN1iq3ZjcfEimLD_+d~Np~ zV~^A$(4@{-;VPvpap?wM>0TRQC7(Pj!y_*f2)swD&wC=e-1FJ z1(##rF*2nVss6(L|8MVO>cgV~6B0&j{M-97e#JlhY5nonj^(vpSDdYSudwf!ITxmUUhvc!r`mkSmp-eGE5We3O-tdBG09c^>$3KsXJ|; zjgMauQx~nWKeu?m5BE6EE}dw;eVX z(c4(vUx7A&i|ki%P0gh>s=6$TO6qI!>0BtSzc)fVTc(!tbwkXtIM;?+lFEJad_xK_ zenZO2y}(0mt7~<^*lK$Jd2zQ@cJ0tuWRcOe0otnFtO;^pV0vpaa&IbU%+D>gdQzt% zA{}4U-R~$p8j6u#UJtI%I9`D{bC&O(NlsdnkIvcHb?X(q;ILSSm6(-z6>ISY$yT{Yv*B1ZzPn=6uAcfpd}Gz8Z{|E&H3(yDcRm=N64f4CSdN;j4z+RO(B_7;Nu5hOgO} z{S`&`uteLpt?pgZo12px8^$}%7xjX^+&e@51_!{GMAh8tQchbN^4~F71m+rEEKF9; ze8-UIJsNgtu6Mm4fAkG>em?PS_If`et^eCmdc0WQJFKFxv8dU4?~#_?K_RZiv#LG8 zmXUD3qdD$kgn#Ep$q0XckLK#{7!8>=<=2fHYmtX}H`pP^E2sNu?#_p9YW+1=d%kKV z#}*I7&+hy$HOBWpXw1UD(U^90W3K(Z{+-5@9^cD+k)C?+?{G%q=H}wY#=qB?dyl>e zouB`|(in3+edU%Drr#ynUFmPV+pX)DNUQwlIe$^VUX4F6|DBwnDO&cLgn!6h@vz&` z57|SDHNL3FugjzvTYF^?oO!~hf)qh-$w;f|I) zeVe-TAF_uQYqacLdv_0PFEjz?UFz@Ep2bh2(a64h+RoFp0xfyz@%)FZ7=(KIXxZad z7e&h+d&S)457|SDHCpywh_9@BIGe$pYE5s=`Sv@Y(Wq+Lp|U}E`U|Q+qo4Ae1OvB# zz0h=rJeQVmzJYXl-`}lzW*aTmOS$STX|6}2H6_Y5CR_pg5^L3HG@9A1HZn!y;5I6E zE&MVR0}BkF;5rE#iwxeM58XYJ5}9@M5TcxM8Owb#EPS47Jc))_^2cXrh-Du0b3{Wd z7a9jWpks$!{&EVSo4Y7CLU7#U0)~;C) z4Y3Jm92BjxJGYPmyu3kbX=AfBP<-T*i@qoX;=eWQ_dQ%b& zv6eH=5kDXnje}^2l{6Ucd57^YF#5gwgC7w4gVAV+{Trhn{Hu)CtiSgIVt+6i4Y7Y? zbkx7f=sYx|(GdHC(P)VM8>1EeRYvQg8LjqrMtlC9(V71OqtndHgf_qlw-joeFXOr; zH_&jq=1C}+!ujC3#5&b%*h%H^PlJ8j>VsTb(wc8FBh3-}hW-`2$2lS2|0Z`^`!29B6Jq3 z*F-njP(X3e?TW&9WHfJgFl`1uW`JFotau(3yY3gKQeCC{s=Ljn9U`|DQ$lSrQfi+2 zis7%7q+IkCm_^yoqr$ybYPVlLx$-SG3uA~gn?_{4*ZOkOX3pNC8QLJoe*O9o zI+;0h=3znmbzk%y?j7SIi3|48=GRV7>=8~29zznSvCJnG2X;fg6$@Zfu_ISCcOB1z z5}TBR|Af%RzZ3fC`G3-2(C_^u&AGAa=!G}Peq_(LzAW<6i&hg0yJ#Zq3cmG3T8O)9 zNXS`qgKm3kq-6T6azkSJ09c%QUYk?T*5EZ+F?jZ$aCq`}4tqEMmk#486kPxtBClS0X;^P{rIt zRSO+M*aW%8T$c>j=>A{qy#-Vq%epQ)fdC0Xf_rdxcL*-QVKQ-oyGw!-g1fuBySuvt z_Yh>_9)ioAOZHl8zrFVzXWw()80X!0<{YE@@2cwh%euPjt6z3@cUDFXo-8Notz23_ z67Bp>2LtwlxZQ{Uk&$Wn>&WC^|DO@^ADILGov3!U%GP%Hag0~l^nt3@6q8Tun1k&>g&N-OFH0uCTg`eAwP>02 zVpY;3qrC4O2K;ig$8Q!PQdKWQO8vyY2geRuYO}YN_|s`*jXSnjO_ax3r)D2agALmg zNon2XR5#PRoZkVUo&<&lcqX(tisMy+O?8~KMk3o8n!mY|)HyL!44*v~Y|#YfFu8q% zTKy~Yf1sh_y;Hm|P4BmWe=e=F{vp-x0k3q`1hI7W#MAFlAluY`&`^Jfh59S~DI)5x z_^-10=ixXXHxt6yn8b4Q*j*?u8%*^Ffe;Op*BPrhTlJ`W6GS;pi{*D^^)CJjrBbb` zWtXj#B(zui?ht+5O!T|*8462P*8^jbx6{fFufL0%9xRaNJOj47c?jEd^e=4P6)WI# z3(Jb8l)_y!qqEzA`lO~$Mag2fJXzjASW{}f;DTfA1+6Roj(NJYjzON|;}cacp=SUr z?{r(k0wYI8Y88)QX5|$5CNFxS9`}-SP`PXgD_%YD6D=(j=4P^(F8uwFjz9v4jDxRZ z+cIYosDalgxJw2+C)o$Fbmkn`Xb0c*sq!~qI>sH&2gHYJihOOb-cO1qqCsHCi6(={ zT|>0u?7q=PYz35T)xM5mN0#A{i~^%2@?hyI8>A~2_DiA9-e%rJ5e+`=l|;yvkb+CQ znN5iTlON~Az!KTD%RgksRtF~4(%tYX2JD(3J87Su0f@3G{v#mTv7&*5NdDNW+c9aA zQhi>=X~B96CJZ?Zp$zfP2lP>tS*oWMpG8;NHaAa0DQ)e+B*#K=dE18N{VCM3>$*ms znT&}ay|xaYJ9t!^>BpC$*RCvN9Sa2W`5mN^ue zEF5Ud(>!8cxhz=;aOBkIgZI zm-lRY$U1c=X!==`2MBK*4rwVmb&_jSE%!rJy!kb2B%}`UMS-3Zc%GH_rQvY8yR`TC6K>=a`EvB5>Y>?6K$c}sT78bnX8<=lN*3QUfTgPnj2{1zQ#BmjaXhE`Lj801;y)Kjf9xeN+)(D6WOsMt#znX@647htVImHB46;c)|wqR4^sNPL4`Hhxm8 zI@(-_aT81+szaLMxfg9diE2>;LE3zwa7tPC7xdTuYRyf$LfvxjwgO6_U_+eMq*HP?Gng{Pm z7_`gPF+)7_S zJrXH{7qjz3dct3*>s;Q=AQ`#59H$GXLy>2BV1|=s7$M`4-j2Tk<6SMV|~4MBtbYAuTO4FP37X0ouTr1qm<3T~M9Zws9wKe&g=;nQHvcig3KG3 z#KR+UV}s$SN+40Zf#y-at;G zEIC@9x8LX=34Z80mA+VTTri)(OqGnKjaUBsYC=Lz5VE-_A#tX|9327d0Slz-_{)*S z2fq)DNy*=}njxJKE95wQoBo!u|JV_g;Br3PfvKt`S_zvU-FFvV&1#p9i=vf6CAX`V zp@n@+pe`<_E955l)wdbo(A;#g_#~pKK#-&N%dgIgl~QcTiIFLN5&|Cz^o5qhbc9;k z*NHivKsuJq59@3pqOg(V_8E`^PI7H9@WaPQsad0%4 z)Q(%CPUVh0Nwq3{+cbd_VX+%XV9Kq!(O0wG85jKe3R48es9+zM;y4vsw=}Rxj;X!j zj!x6<9<8JjLWQ{H;l~!Q=Aa>=B|yJ60uHNE^CUZ-bD5O1oay}rk?1AG@<>zv*cM2S z$v1rxEG)M{Hf|_dAQtNHU^P`Sef1PI!~gCHe{_<&SZyDpRo<&mw{VtBx;Hu|q#BE! z+A`m;eOaj2#x7~AUnRI^hLUuA#+Z`Qc#ZBYJC;~5)M&gPSPW=UfleFRTiev*jpTs# zC?Zcg%1uVtCG4@t9Jr+BoSXskqx>(-B^LZu5Yh{T{C*`N^+C z*7EW^G7VP?64kgXy78P-urT!ou6@C^!E&!Z>se`0q)#>6- zONn|U>ez9=;ai$3UV8Nu&)q!P`-7JBcv<6vqygl03W7}8r8CAN4(Vj`CSXdKMneM{ z-%`NkK%!~q4IVQLp#GK?OgW;l%#i7-3@#5k*TF*HF?OkCJpjv=YL-t!?3!#IF=2{{ zE62u6NEcY?Dq8+r04jSa=QGZmFskuwmefy?3fM=Q@BQ4kOId`$OWz*YZD2eo_l{X! z6I6;fOEn+SQNvGX+)IfEjys|P`E^tCV@##0^8z@&~2sl=b< zedlnDSKX-7r3;ttZ4AkE+V6sjx+op4@7L%wYs`;Si;k{P0nY<9_#>7ClD!G)3D;1E ziX&%&D*-I`qp|N(aU%^hMz;Pz?|WnZ_BBKzNhPwO&2iNnlupUuHd!$R-ekqF@bhz(5c6`XpCV~4Dvj6% z@&OQ?U3m+Xo&hK{rn+;kJQ^A%Lgvbrbr3l;S)Q|RArBv$i;8=BR8M(SEqRaAYK@I8 zR`aFDG~N)`kFt@#$htO56yn%~moD1G4JZNK9b+xaX2?rbi(9Ofbz)iB6z4I_n2y|m z+=a+A4=N!aaq*rAt&RNlCDd#Jrqb~(4rEl(Qz{9z8AzM<$uoFAK0IXib8 z;u!P2JCYt^Jts=1j__He1`iUDMXz76YpKNSv91PpS23!8-N`=MVx>2?!2wBls5Pg= z)|c#5VjRm~G8H)`<6)92CrT$6mHFkd`@^C0LG;}Df$no4h}Amrf4ra0(|5mq$wOxzPIGju)F1;7Cm$U@-O!At1;b5V9 zyyf=kJPAC{T30PJz-RbAtol#8@QD5>R2BeqLrHF=mnU# zrKu{k8W{)k@o_ORkAS6Ts#0GOCRu|7?2Za;>(T>){`m|Hzy;kxUT_lL9ULlu5n%Zj zi2;Cku;GR=_)=rN>Z0gR`s`0zw0~!^>|bW{Ul&2;Dh4qHS!S^vk7r?`T!;odq{Gu> z%j&a&n5xh})`m<3sP?NRN&ul9Jvp25!?wHkTHmzZT2I_Q=roL~m1neT%#=o?ZSgDI zQ4Fu~dc_(lZkMvDusL%(lxY;ru%zRWAsFJ@x<5a@IDDP(AqG@72k(%LD ztKaZCt6mAS3SxdyjrSu}OJS(@H(mV3wkxhHgWa1%>&IWUD2oWnp8>9)Y`**>c1U#IRPgvD#~y1|FcN6G(0uK#wSzh`UzOb#v44cE$5*}m(`1dS-P;4atued>6&ATJHeX#2+=YsFJy7mx+=#DZz|spU!#Ciu&%g$a=nspWvy{V_T)NHAQZddLSWS0j$rnm!k z$&bjz|L366KYJ$rJ`5FGsIS%bSA)0C^1#V+#+6?U-lqSCUPa|-qmPbYx~-O4IrV-< z@JhL&Bt+BsHafM=*(Ymy=|GU2`dIVP(>qh#iq9o3<^oB|ju4A|_5nDTgU3Y+@m8-Q zL+Q|bBn~6~f>8J7vw+Fkc`?D2NUc=CK$6p|VUS2D>CZ~x3Hq3ovKAwD5Jg-cjPFU|9$!Bw?^11z3&dR1o)++MGC8iZE|{xZ z8IU%QlrH&gdd<(RC{#|!OTP=`p;3yHXkkygY|ZMoBur-#)19xt4x#-l^78&CqpP__ zOFVS7LTp@ItOsaxOp4xA%pG+CD48d*fytcIvxUoprK1bhQdT}}wy23!ZJNEB=#ZC5 z+37ba$Zg`&g!GOtR}daIH`=xJTZ>$&nAl{Eq@U8p>4{SGAj)o3p+1KvwF)Iv5Uws^ zp~o+6j?7LJ;v|$a>-7-qA|iZKD0;^rc{-H%;kW)Uc}VhLuj`1Wxl&g_=l_%bB{msM zS_sTpnnNguBcQHzV31A}4q45Ul2cU=zhw-U$z+F4LcMPPwhW@Gw!Ad5nsqH=o=zDv zCKC_$^Y3kE-PZOBDhz(eoi0|~9Gx?emlG@4|EyXhJtXFl_wr6jJHk=PzW-B>sk~j2 zB9kzTYDAX^fDk^xaPwif}&f-p>5vjOeL&LzPU$ zUB3KP)N0fe_G52%p2-V_?Fw91nz@|$-K2U~b4GVOR)}#Qh{4_795&jbpwQ*y5hw{{ z=XUk@%Bg&dxXbXdo#Z;-y{dWqw257FU2fgkM;grz*YSk4ZeA%sY0Y$2aQ!WNHo31tgO^*u(nCpV~(8UEhTUCyD&~9%a_EJ!2qUdZ%i{=sS*+$}rf;?8Y z)%GH1jTWE`e;l}$L4J;o{-(m8dGKHgwJ4*9mhYPjDke7fF~=GFq@}Gk+x&unCu=zq zp4wSzvFwNp4=!tzPBG>g@RNWF2$43oY2&?(y!o^vm*1nsi~8lgDhi%Zs?ufyal?#A zHBrN8B0tq*Rj~=h86Ses77VHRbPEhDUUJZ|q$N(@NV6J#G%9+#^u2@)L-Wv2Gy@wE z7y7<3FZ z&XfvFrK+l*({1R=v>$U)iGS@$`>Y3*>_@Czh#p%F8cIJe(UgUdm)P&pz%X2Yc|Rrp zg@$y{LwmV9!C*bX0wpFUYe?WFpx+wbt?aNR)k<}{0BxuY^+lIER$u7Gg+rq@*;TWx4R{ zcSJ!7!9u4AAQ6*v(J-&u;10bJWcn&KL8CW0T8sPM+ylYn#gA03lG2LR%+pe2gc}dv zprxzE?VcvZI|+Q*=ynG(w`qT)JI*mb+KTV42MBsPqgg~EZxw)yZG)3)=Wr9dK1=F2 z%v2c)d@7B`EYs$3CY$57-?UNtDTqn=S+4MX4LLV!%vbQ@P=q88#Liz)NO3n1l}~XG zKwOZwlbA^JYBnLP#yU&FuX-BqXzGwKBpl>o`YO#O4H?960QrPb|00$@Lf&f5OvHH? z)`v|-+UE`|k2kDIHk=8QHAY1(Ug=r@5NHXO+>JL=@ZhDh$VQY+VaY?(v9j9R2xcKj zu|parH?6+>Z?b`|w|{QN|3#7QKPRsE>qz+f12pNMAAZFne|b{>KG`o<@OXcY8xrC_ zhEvsVDcQVa1@ScXe${^r&iIq|`7Qdd#~=UH%*}sNDDkfhey8F8_c}*`bbn~)#J_u` z`;Qt`(yD;?f1)n--#zhvM3*k>_a^%PV*UQDGC$-~WJ!;7$H#s_cu@z(NkFZb6mG=H z!5nTu_2L(OPto7>J^#t*`JbS_YXOw!rGM~9_N();zd6^EFt>6tc7XWFveI`l{+oxa z-(6j?v2w8e#naWNv}2u>h}9-k&&>)!4+r@c4fAh)~CK_Q~2yTFb0 zTP@VpOWWONZ|33A^UPBHhldO6r00vR``$rYlbfeb?a&z|WTjhS>D|E;FLAwz^~LRQ z-Mf!APZvzLDp&Haj_3J49ZYP^^bS_KD5`x*yzsXFboWzOM}jG^aQ$rzks!C>&$G+O zjY#EzK_MiCXE#M?*;StVI~w+}L}QSzUY0j1*;YG9x+UvJ^_>h3#sI z5_RbaF)zDalilmTxj_SYJZTl>X>d35iF2S~5v<<9VgWJVeLUvZpsdUVapH=6RH}@F zw(e?HMg|%yLfvCuSWbP??E&jj)GzwUE;Ddtk2_?JobLAD{7?zhG0a099@G|Yc9j=B zn*QRtUhq?HuRCJ;$+fW6%(*Htm_4BNRkiA5_zQg})s!sRGd0mxtP|mTOechEELtB0 zspTo|RVwz@Cg&oyx3-NLU~4qo_{f+Qk=$?$&eIz8;RscxlJnFOVawxfeoRd>T+yfx z`yuH^tLBsjak@P1{Nnz|!Y%zdjF=-0(>(bvW?{3yC8hJ_kw`AZR)B-?nk2Vn z8l<4jk;#6exKy3=x#_1FC!InbLa```WK9lE{;5}<%rY-dA0F@CiC}8f6V2E0oHoAX zBo#cJQZsY$pf&VET9Qx&g7nfdZL}EheefiRpo$t}ckFYE+zCH-sIv=I9MMg}8SP=;{x#*a|IAeog;}``=rY}&=ptLkW;AEmu{r7rD2`?=~qJk-TH3Igl z431*YN71z+ZD2v#T*7E+4o-Muv3#fcJY$)`-nTb$xFEAL4y5S%h9Soae#JNR_>R>T zBL{_x3wUy{z8H$E#AXtU8>kFaXfiLu&X7xv%Fq%vPDDHieBwx)q;q&jpo2zaRO-bv zfS=hzL-UM_cSj8SU{&52w?omhvy50TyzQ8uQQBB=fIhV`c*ot7M%pxub@rifZ4S21 zHPcVv{DXhTAu|5jrdw=y_fl^9k4j=H3bcJ`q;6Nn<&1Gw^23HfD(YWA; zUAa%3-*^DukxEGsJgk^XEt=v8+S7@?hZ(5F5v6zmzP4|EyGp@c-1Wr=&xaO2nwXOW zjN;ubAR(m{3Qa+P$L`)BT?9C$ld@FGtH&*NBhozlR^?O2PgmumgqlXij&0W|hD1?u}Ie8;^Eov;xtFO&k4Q={puWuIVe9|*Rh^QpRZxNXU zH@lS3;lnXJwH##S(=6k47kXm<(8>4XnOPp*;lLxw3*vcRy7}ZanpFthI>=A2n1_LzCbJ^)zg_vAM(*V^$_IvouWmez4(a~XlcGHPfyAbz4C z_+|zICm|=nNB?kh10AM74!$tUX1v%Cwpn%JPx+zeC#iXUBoUi-{v&7TH*cFY7`5-h z^Kq5bp@@vna*tze7$#^dGjf6q?Saw?7zBA((xo_u`c8v6hv%q^BVC^ZJ#K!u_ZSJK z-wsKtkO#`?ar;Lw=FMh(A?o?gBug;ppP;DYIO&;VzBkPWu!Qb16Q-I&i2vwq#-CHOrRj)@qv3+eQl zJrvf-*v7}~LpSI(4`_trHQAe%Ef36-Hx)~}P~JnF@le*ggzODG4x2X2x)E|TKXQl) zPj^#xduC3p zV`A*uYWd|!mK0&#HOww$d0ZDpdx-2Y9i-^2M!~o~<<@)yr z5v#Flml~MnTPUtQ#CM7&KQ%8-_zJ3Ep($2S{GnU>TAy^XSNShd-aZ|g;;0>`PraI*3+I`^(7lnx`cKeYa* z%C|elzSLB2hVf!&2MqLUk>rd-apWJSDjDL3M?nPX&;mx$o}tdih85CF!BQYp)aZ3) z*Wa&jY|kxQ~>dd`vx8HhdA8ll6E~>5xjGiwbxs2 zUMz?v1M<;QnL1U;k>ZZk9K%U6&S%wo1{|mM8F`NyI!?5y^B(WgQ575V<5e5y9g!6I zl0gHz=q(j_NLendwg$Pz0D)}+*HLHtA8*kOl(@FH-Zh_p1aA$IQY!}(c&)qWRKVHb zG7HTKs~XJ2FY?ytu69xEpO3#zw^}B9_PTtniT^0Dy>r8Y#J~ehA})HEde`@os9=^V)OUVd!7dHH#p-@d!7lc@g7w3TeP{fjRDzdN zVQ$Q8DfvKb-%#Akn@bVOrO2!(-B?n9GLG#?;rA1f$Cx_SI`V7&L@Cx{VvF6)=PlCc zC6We@!%2(i=}%K16Wuf_0-&iZL3p&pP%<&VCRinzc)#HJVsFBtlU7bPpt zSKr_B{etueJ1tdU4ytuT9x6zx#RQa6GU|0gtN(H-^fQx}J(&w~TkMlp_u=x-)m>ju zg=2@I;@)~ji??saM=S4e*>r=}ITGP2$C*Sr-Q$>5c3G4!hJ)^PQzvg$-oPl>3&m!9 zZJJ!8!UOeq=_gp%)vTQ#UAuVK&`q9FkzR|nd6Rm4?Ug*tx9gS@ma=e{op9i|R-_Y46e*3nw54I2)JM&d6yhIjtwT?f zx}DU5?##H6c$JBQp#z+bPi8sc+3@5EJ1JbUPkeNqo&53b+@VgU#R7l#HV|}85}V5a zcyYGf6)7;4gp9zs{jJr{cJ!>5Y+3w+BZpEewr+_yL%Nqb0~-_A;EVrb2^U}6_7e?r zba1a{C>#=!$a^O&63bKWl-v;>tq3SVf{P4C7lnzXN;AUmi%lpEq>lq2A%q)w_YQ~C z<4^N)C~z25yBr_5>jhj4t*q-&EO3N6J@9urA8wvjOZhQkPoM5j9?&Z_GPo$2(*sGtTL0b((1}5P~YFwoR39mewpIgs{_h8LT2{i%qau z%@LmG8IzK_eXtHeqB1QzH|MwLxYUl4PMneOq7p%^fAIF{IWvN2&1GSEI<@8 zEst}Y%Q_d8*J3$XX(<_4NjofF`lbE&CS)t{2|5Ee@CD&VLBjK>T{IxcjSi;x0m9KNQkevwQD8TW=1KPdXtB9VQM%ITPnD^3{zclU0zPQ0UcH!W$(w1 z-ADcgxmTEm!v>a37h?wQZi|!o?R4932jY{tewiD>KHX&FI}3lFA&u1583bNEEl# z8q@7xF~0izgzS>y%rSnC?7x)Zz6eot?s6cG%IPLjeUozo)6l~zcqongQ)Nka9&~JC zhEuxg<)!YMSMjn#4pA}dJ5(AVFvJBnkc)G%lH6~3%42TC2zD3viBif&ILt~$WEW_& zKeQUaFZax-okS$G`?eBCUt>C*y$5G2D$ntaWNUeRR;rhJIx?vk5mz~jS>6mOK1EI_ zYB$k5Dc6c`O=JX3h*pn|ejunx4WIo-*K7bDnnukJgTa@1h8QVAeU;^T7#bL>`Y=g5 zZ?9{OxSa&N9qUzB`HtT=%1L*zz&*T@NcqaIuj`rA4_{1b)p*WnGb~X+T>e9cG(AlpKS;|>t;WhG zQ1f}UAkkU|4Xj;R0>v1yyacl5%Ye&<0w74X%(rD?T(y4>Y|IqZ|KhA5$v4k2eju)O(Y}u9$Khc=f54%0VPHcPET6oR+;XbayJ!wAEG%+8xayZhl@#$Af4+0s@_RSfqhw`b&IaT+nS2#XYgDFm-XcYg<Va-I zQ;|2f0sk-+*&+AnZPDaoAe!e!v}b+`9C~>piv4GKc!ZFIiScG;@Z}o0RTCzjmDw8i zI%Q|lc;AFNA^LXyL$ZMH3jzK+f}Yxw)otM49K zoHJSBdNKTjM;H}}r00v^Gj!T}&n1%LaV*KI^C_i)6)83{<3li9erS6UjyZzoJI~%J zMs5lG6~eA;Lxt0lgP|M~p$1s^%E9=SMw&)iJq?lmPs3G~>0A@yfMrcw1}}2b6M)JGd56KJTClYthSZ_jsr`kjS%hKN5ZRYZKw-J7YLJy_aTsA+xtXfmh;@B%gBZ_2su}TX zSQwm8C4oBS_zEijz7adLGHFQ|2Fx#EJzKPoSN$?`o}ED$sw@E$%FJOk?)6M3pL@8Y zh>XpSXC$cbTZ=JeQ}l6aP=qkif=T3Fd8$v{BN#B}CkXn}`kiods=!3cm=U~{0n#8U zB$=ag_pFtQ(YLZyJ7oXPpXAQiv06IkXspX-SOnh0pq9<_D_k~`vC8Kr zHfk6{Opbiyuz1-M8~zGxr#*+^S%or$2A9PTERK8UU$RnLrYmi4%=w*WvMG4UiRYQd zR!}?7f|sn`G(p!~jT&i1f31gAwbrCYE6L&EiSjj~y33{d)@2YDhJ~Blr_KK0LN96I zXC)P~<(7FlWv^7Tr^l%3j6dC=I9Hy2Dx59qD>AT+D*bHrK9MfLeZ$x3V|bfPGNwz# z%s`i1r6$#y)xs8H4@YxBpfPXm2h5K`+2q->A9`NX)D@wE(@9eJU@4NBGZo!bNSDT0 zCMT}Ig`jJhL;s#}CZ1k;Gv9Si1CZ2OtI1(l*I?WnvZi12>~OEnvhj;ifOStASA}RZ zJ^2bwVPXzCVD-E)2y+)Hf&7x^IVTMUeTo|0k8cpCL}Ea2wb(DwyrCKSRTj;m9}4YT zZog27rEU+!eG8id>0$PZGk9*>j@X-l6-$9kLJCYu92w@E@*}L8Zgss|vSur&qX=@F*FRNL9q&9fbhNDXZaj;Xjz ze;PR(&zA?MEjgC5)=SB{O4+^W;CG1!vHM4U$Yaj@;C+uwCT21ZIKfR(XMbNklJI>H zzhy4z_@m#v$i6W5LTKnZJK-Rnv=`4cl*+-qYjcwuL1cms6|6fJjXe|IRsP%&B`Wt_ zbJ*?tYozGJo8a{D{=v+Z3$o8DQTTj$8*_4%)V`KsMSjgU!G}D{Sl;T<3C$GJu9+VE zF}YQ_pU(nD@`$X*5NQ)*{FGu>4w_;p_N$1kq85nDy6xe-@ZLTH<06o&x*1c#u|E!q z?4LCYa&|4N=eNh!D{L;*x_YceBzkB&6*!+L6>YbbB7Z}kvtJ>Me^TNWbwM*~mp*NN zzu8{Jl0G`hnJA{~6|KY7xOVh)HYADx-kroF9(|=~9oN~h7BS6X@;nY(Uv+IY3b?~R zQ`sCMZ-m}M`TRks{-Ac6wh`|~RyUqEwB^V|#pFPsPe7UAXQA%&uKmvFi#A4qB*qzd zLL!S+PC>s6s$*&4HR=cdAvLLQpAh3wZuyU4mWvY==cykieAS9KRGTj} z!uBD>lw-C=8T^`tl(f+0nIHQ|&6f9AwSS&#b_QRgvu8Jz!vFBWFyA>DvoO^)&uH2Kfn}1qW7Q&E?X6f7PRJf9i!$LXwS| z7c@Q>Q+pekOBN?YJ4&yX@3~m(^9GJZ5-WpuIa>EefYi)dj_g_v$>X9d9hoSiU4qg( zgr&EYCoqh>mYgD=O(V7=I?};>%dyZ53{33wzK@CzM=JJ70=L;mCU z>hB8I=H*R0>FHWGj@G9JUW#!}pJb&aC{ek{ZaQ4*t(Up2o_)TV9`FYXu(w^$OI=q6 zkzOnC4aP4kHr0}<#oEB$u=^_I(>fLNv|ImtH>+?g^r3Z$6AZzp^BkZBdhJ+bP`-B* zh6av!Us-xjPn<}5TXnD!C|4pjfjo3@7}ry)myvV5&sEecm_%Q(E__#}9z1I7Uds4H zZPLp=jw6+Pw4liiTY-;4jK1^7O!cbVP{~qT(35F655S)1s?C0BrP0-!NC=#oCNw@v_S<3q(w}K5uaJ z_^LP(!}V5`8}h0(e)NcEBTaduT(UFn?UJ>I>_wXQ+;j1^EuQf?z>RaiAECl@`CbRT zPD=cCV~C5Y?p(wiv!|immaEqKFqi`xWbKJanr!V}nLB2^=+x-oj$S+keeU>uf`(@5 zFubs14YAF-`7`5-pYibCSp<3naiOFoq4-Yq+(zatbsJUOsvm`VCXS%FEo&)2uq5Vy zSo|frbhoAy;h%PFT+556`*3ABO_I12=4YSDQ`kw6@?>rj`yFC^wZ}>{l2m3Hv=K)A z6cGbTEY-dI4fOVpw>diPIn@7@_gV&612_(;^ zxqLy_%vie&>@;QLIRqsn<)2=cFCjke%H~)q0YOwnm^Cl7RJ;gYnKi`~dWD&=exqB%!d!r0%jCcUvd4S(k0NcF8^@-3y{@t*&h1%a{{|MNz{{^u76O{W6uluh8<=BW>Ie&xs ze!;{fAkZH%KR<+EVPhp`<@p6NRQ~mf6LR%Sd49QKhurfU{mVUy4z`9W#!e6{kx5ZZ z0s^BMe{v#blD3B6Xd=I#MSnj_6GPxdbp-mpnlB`;e}v_@{uM0u z%RPUCz9AzA${J;K7u&cVs^7cB63@%cO8jf{k}1ON&OBBKcT1D;m^q5!xTuyC+1;NW24 z;Njt3BD_IBc=ZYa0~rPJ4K@Z24mJiB79Jr55gtAn0Tvc9Juw+26%8#7E)fGW12r=R zH4XJInLxqA!y~*zKu178r^ds=qyD#l&s_l2m$0wl-oZeT0-#Z$U{Il+`v8QHqCx>+ zAO}ccfBV6~L%o27c?tar5^eYf00jdB1p|$Q3I_}Q0tOld00j*LsSYYU8VL&*IyNh( zu#%d+lXHAc-AfEiEK(JqzGHN3Ty^c#^b9+Pvcu;XG7(i!Hk$zsId?aOsIQozU(UuE zl~K<*rMQH#OWr1g2_A$uG|V6Te<=m@3n&;^I7l2jDx?`9jNxHkKvMjg2nre%28~te z1v&`^CJURgzCEn)XHxd)>g?_*5i*Cf^XFv%A|xRs6)Hdo@TmNIwf^Vy|C<)@IH0h? zxER|8T3Lfis2GD%GDSpxv<3Hd^gjPLv>BmRKrB@VsVna z$vdRD9RfdNaHg`LHTAO3$^lO#g*L_l}QkTRfLh?lXTZTbc7Q8)`o_Y8&AN*-!K`kZe{I97x^+XHey+N09rleyfe!#&+Y&0l zR;xpV>{fMy+=K$lFErZmO3lZs>e~)`LEBrU=(Q^_$}e^%n1C8@;q}`V8Yt%$lm_{W z(SbM-4i+t>B^8;oxxY6YRH!xn9F$3SO-m}KbIyheKaypF6fm{4#Bxbhku%E6?itYU z#d8L`z8m=ixVXuDLSTUAn=Q~Z2kAqmW)9b{=XYOLY6}Fw6*3r}EoO&4( zIMbJTAX(Gf7%BzLR}${>0p~!GpOE0}u>L@JhC=+|PF~RLgMRs*ZR|G^u9aJ2pwQ2qKV6+EfmJRc$Y4{cKBWribf`1}dxyJ}PcI za;2q%b%eH2raw$_I@dqE7l^K#PgxMPS0kH`$Zw7DFiQ_KKc`Iu$uxY`vN(J@=Wf2? zF)|BQwFEjn1AO?1A2yx=ArFqU@hXP8 zjplM~C$&T0nbo&J#d50s;Unz@C1(!TantYq_dW1`68ms?Fw{qA*MEE~_Zmoh%<9Aw zpN6ULRuJ0F0r6_ZzLi6kR!~}9R?a4ux@3#&!0>)!4@eypoHusOw6Q3zIwwdW5=maC zvR;P$8fb`m`7=roJLke|`|HEpfnxKVLG!#y?MmzFLhhOpjCRoMUiE$AURq0YYQ#+p zvye(=B->S|<+tJ_dgf-M+U1P6=^Wb9kEA;Lb1J$Bl|Yl?MTyD}k9>7)5ZQ^>uI=qw zQ#9tQRrNrD+0yRd!Nib4?N zW!9xK!fFIT(>+n5xH37VTT~`!pG(D;XSsw-s}c#6C_aTP&W7u$jQfIpqBPa`ntLB- z&OP5*HE6z`yENVnF2zj8M2oR+XOeWXCUmTdH~GBTuq=gAnUsay66D&Jo>3ZiZRt{7 zyKI(cv}Bxoo@2H%$SV_)mSVQ%{N&?UGhVpJ8Euo`P6rMs$yCr*nk6NVJ{)SpRMKp* zQ+;Y-g5mjT>8NFKKBi~SlWxUZGADhI(mEI-yJW>7t@M=_k4~ehWPy}}T^>nCiQ55> zsZ=Xv1r%X$AKW$N!bRI%ou;X3n5TZM#An}DF_p3xsA6~z%wDzvy<)gJC?U^Pt6w7= z*8%I!2hJF?wh#swPS?uqXe4bfG(;a5KIITCI_Skk9>M%Xj94{H>jaCd@GZH_QM-I` z?N}+Yo@0-!Yc7wzXfKJOZ64n!ykMFz;~=UXeJH&mN_vzU3Qo7iME7+v@jUAC`aJG% z&xmc}IZ09;k&w(4gBQP9FlJuBd)!D%%F)eTsPtSj(KZK_cy{4*mbAoVFodoVVW6@MD=GAsiRs-1 zc|N{pcbYzu=((lYaG(3h+dL)?u{`!xG!mG}nyB!y@P0l$Qn`|49%Z-qG8pic^>uhG zX6>AA#Y90)PM*m_EFCH)-^<_}h`Ik3QYuW~*WMBV<$BDYtoKS?HrF9ojHeZ9;-)P} z1&3sARLCp!TSJzqid}myfsw3}&gJEKc~;};YSH7CY31T#;@>RJHa{hO6RmB}P^V#8 zbSP!F&aoA7dDMPS+svaTW_#P}@#a++${dP$$2NV{_PoWI#Xj9M_ln}<&D?0gp*Gl3 zdx5dIpnPU)GvIq^F3?@N_-18JCuXCWKY=fU#<`%hU1jLT)RPT}Y52Vy=n`CU80|FW zJyv)qYmz_L)ZS1aHgz#wJ-V)zg=<4`5HMhypfxw&l2EZAZE1+PhCA+F;5es**Jp9A zqw=Jf(CU_N<3z*op3~O(y%uP7c20iJS-z+8M&=hckk@0qv$26nMoVBh&uJ`G6-`pB zu>gsKx%iQyK_mFMVIOrp=gx_p!HOeAiJ+Q^XTXL5Z9(b! z6nahJE|ap>{8atJ0#Tv33}-i89dOROyGVkovqzGMp|fP?smQ|?J^I)gi7z`qf~-ze zveiqMW=W0A3A*LW9F3L+n+568+<_Krv-giEnSE@>hX2Lhd&f1EcYC8aSjIkx5v7iR zAfb&wK!|`2gdQ*?A+*3qCo~CF0=5~DA~=A6geE~#b|BP%gl3~lC-kB;ArO!*)th}8@m2> z+yW8&aD`!%bOgePK_E07;+j|hIY)qQH!G*u_w}-e=L97$N-g%PGY%4ulZlSbDmdMs zL-V$Ja(-xS2G~!^g>2WVNFUiDZZK(upd)n}L&;Hofc6@N+{e0|E{D{9( z54^tc5gcmkcVKn!ZujzDp6xi=IeoeJXO;yFk>~cP42T9|+0!r>YT-5tW$L{AUgHGe z)Vjqm_$RM;(LQg{ z?;QVfB%((jubMvk3S=yHmi#k1|MxLh2SCRO@5iezT%*RLT53??@2AH1kIx|vOot_E zW|6;C?oO($@Yn`S_#Dk>|6Lb032+~lA$fjx(Zz1{0Rz6>WH=TEC#|teQ3wAXWkO? z*5T-uYBc%|8jZH7wTT;CX;p+Vc3>d1bQ=mgvqM(C)fOUepB1UMdWbGOoZ2$12zjVJ z=Dm!YQP(IZ>GW5|wHEbe(zqId-(^qs z%?;ui#Fg3DtSqGEU_++@^ye~T$0z2S(#o>|H&jDhVn*YUWi^rJ5^T`vHgW3LQ8XvE zk;WOBK~%~K_d|b0+GzL1)^(orx&;*~olp;xub&`l?WX3&sJ=|EY9o)qL!4n#DA>dz zda^0=WRfkfZ9yRZjo>8Sx02xm1_!5{F5+Kx>x-}`?VVO19{Vs1$ECZ%Xpy3cF#cq? zbi814DIK9U#idnZMQlGDu1v$c-QE~}X*_yR6?bji&wu^BDFU}v4Y73pFw z%9{0MJJ7IMZ+orhl|aXb65^X^dqW3^+xg`IE{#4L3mL+BQT;cWN6#*IQ}mo)@jCtT zEEo_}7|)^1Vv`&=D%wQn5Zl3XwyfC8eV(F3`6--lW$QQ!y-%5Ldod$4S~p(sYG1^K z>ROWRvmd8&n+m4XbhB$j(5%?_F}LV7tl;j4U{-JlrtB_N zm0R`6E6cm@vo|G1`qkSQ4D8(#12-1rDhW43PX|`~aEFaKWzCKRH|3~-oG!q(yYXf* z6QR+?iH{L-fZMZ3yC!#kedm4lYq=b*xQnr-c6Q-`IE_?;(C$f_>s{|w$!>{a z?wflZvp}v7DLMD%_B0n?*-E#KAu*_Z^hyGlr(946zSauMm4D_utQ=lSVPCQJ*}LEz z$*}k`5yN$xgdVM)hM}joo^+`}1qMeiK`)xQCAi?ELS``9t>f5GTD)78T6>W;-QwB8 zM1p+0w*Hfpiv}dRMpwwd20$)APXbES1P{W}D{h6y&4O$@^f@V?tO6f6L3k?7KNRYZ z=G1kmIqux=*if6dt3hGTHhzpcZierzH)#^G3RGusH0eWF$UZrP(>GJjo_tn2ftT4U z5iNDgFs_(_Ldpq>eh(gxM6Q6V2)T#Ryc|FhL{%*(habU*L#zA5EY+jq3Uh|fGHwfoPYP@qZt!sRO z>6D1vXR`$tkP(C0EJjzUJ#HNTpm)8j_XlNA=H%sQ+ z01W*WY8(dx=uRoXRB%E6uZcqp;s%;;4~wV9rjDW!&|y)8{^y!@tN=9z0CG~a4c710 zb*KuL;fleM-c_u5@>&AVD+7#ztC*MjT9b$8{LOsP`UOeppwbTUOlRN1kVB}+<~M;@ zB+5Y>Zl_&)%ck9WCxt;y>IVmc<;VdTQgI11C{$T#F|O&p+pueKmnnzrs$*7f2OqLU zcRjHJio43CCo;3SaeF7t($10IJXZ(IvZYmupxOyq8= zUI|^(0OS3q9JKtowBrdg1iuEF4X*0bhuZB?Ezuxf?4b1I8~cqaLzzs-C=7cQDEvV| zjDsJfyEu#8uzGU0s=#&*g4GO!!}07JhZuv#H;fW|v=!h{YIqK{j~oMR{=VDqH@MiX zo|AraJU9+)?Ni2*&7TvW9m_YAq@RzTwp#M6Z<$7}ts;bb4am`%0zBz!jIauC!CsTh zS+Wh*HmPp3*3G7LOGC4%^M`t52GJ2E?+h>bgeSkA(Gws=91r;|-Me zSPc5Ge33444CG#l+)=!q7PckjMNWO$QZR;MBdA14Suq{wC#dq4`QS*m-27s#OI5=u zO#?5mXFNt*dP8m@5JHnu#Us37gFD)a8AE94^&gnOmoUf>`1u%ep+QqLy}4d(>GBzI zy0@R;`yTO%Nh_l8F-}6#&6+iig@$ z4d}szs2x9;*ZFmW@?bD&uBIgc21ne{M3z!TZfxA|B#Ln9#y^)5B`FDs`s z{Fdn)(b`WEUA)qiilRQ!-15qoDgO1t19x~c=uovd0iC=kzXc*QZr|%S+Bd$5pSsHP z+zTofh+7`zuQ|l6g87384Sh_NK3vce*<1D4!CyNYb<+iPrn66rWo#)20-=FEN##Qh z-4C|rUB05@E)QqJp15{?DEh`XGkOpU>eB8mcLV&*Q)xHMqvW^e2E!EpTw0&t?DWv2)u;aBgalE1Gr^aY1J? zF**}6=B__cU5#kUyu(*ox^UXPys94Ja|mQ&)z#8GSl~R$n!?%wu{C9o((eXpTT7x< zkL3@0q+O5*qT-vyL}bwV0m(p^?7>mksDbRko@&46|ETf)+Hvpspf2nZQ5bWY#5;m*rsY?*#u?Gr$@4YnmH+jHz;XbhCj|zW|UAev$*CdnTOC6SRjB1i!jH>_A81tGpJVI zmyI-U)cW@YL1tIhAfvpO&t}a~NSDC%)OF3$0Y?;eqsueV(Z`uC*Co7oIzdy-X*WD( z^=Wo~m42^~y`2KZNnSF!uLH}QvM50Bx&Z8Y^oKV@7AeN7y8E{UR$GAF^f2O+Bk$Q| zTnBJpWhlUl4L!O@cKteCrPwI%okq2?6)yMH76=T$U=eK&?-F^_Hp}k^eYuwXNV%S> zd~PmXN;U>q!!0|nZNho+MY-#DVc2A@sVgRCUOmX)F8*x7q$q*aG#Vx?svrOp^9w zHeya`t*qyL?}Vyb`LbO%!4^=;|yJZ@mVKM?-MSdPm=spZ?u(g^G_au(ebqS)Y-_zvn7fpq4pC#HW22*wOe-T6A+B}g zpDXCDiun4@uDEL++%X5ewQ8vL`->?hhVes*b4_$}_Kw-3-mKrILJ5A&Nkim{f}a~Z zS(40lD_h*EKJ>+uDFE=?GXw2v>{x3QBKjQ$u@Va4J*>Rujq`A^< z;ORrLse&k?Os&2-DvURimE=hxNv_NfsNX#D*-IHncs;BqC{>1)^IdR~nut=bd=i{V z1$f?r!;s+BYD_^D_u;RXUfE7pOr*lRCXMahaM)ws9zgb7dvGl4wgKf9nzf%xD;);E zw80hh2AEVACLONCYy)CVlP(BmVsXARQr`=yufKF)?_b}ms8K^xzpV?0CpK*!jrhnaJqR8K=itGQ1+JA-Pf2R=d3BDi9O_H5|wL!<2ca!fM zdH?z2CUzFtdU~syh@dMOK4NDTAD*imZh4IJh^7yIeDt@raQ_wV^`EZs$TC9ymxspL zu?6wKy8d*R;7#44JI~r?awHplDu^2{gsh3dP^j=I;Mfn*XT> z4+h(nnTl&zw-R!+8&)O%SY~M+3YtI!WDisJ+EEsdzi5=_JoT9E8;-gOg~4r8m_)Be zEHamQ=c>n2%=O*_X@SoZYD5>3RazMxgo^C?SFGN+ny%%UuvIXLul}W&YqV z@m$yvZSF6=JKS`_?@v}m{KeNIKVGT*lT{7>Wb5bN_ZznV6a}$A+4?~VzsTQ-Lg1f# z{onNeCiee_J)c$SH&;fG9#_TC52I{7XDVCICIs29N>=ohDiMu%nNwNun;N%I3n^4! z7gPIg+^RKp0gMrgG*`6%dIpIzIw*jQ1(aA`uTOhi$WsuxS<&*@(k(UPg;&#XRzU%3 zNdesPcwbPZZ9#xE{midWZXmYA%G!N)M6jf&&QLNq&`^``(epL&{c0uwJo~tGkNdi((%I*{$NLmYk**%{`2ILbZa?o9dQr$F%xzOzbrKLAIZZ>H+1gpu~r-UdH$ zYgG(_80%eo9R9m>yV0nES3N+S%gcBNhaMl+H5#JNEta#Ok%HTo6zvtVWmo*Jv>8h7 zwjA;JgceLeKtIdQqgsN24ueR z(G(O2DT4ZJB(j1u$B28*cMsY&J~{?p`qUq@$9JT$Uu_R0Is0XeX9~z{`-L|S@O>X! z9W4~a`qIg#bGzfj&ggg6Q=`)(c&Np*ZN3AclE8|r%f4i)W=744$B8xNnjqber+Hnv zCC;HP28-NLBDAk`(TqQaln>r!ZKPy%lV01HZT~2 zf36hfAr(3$uDZnr`@NC6U69eI$im(4cx&58J{vQco9Y}K) zo$`@*H@kOCvikQ1&88vUM_t=zVWE6{{96IUFs8KpF zasO_XcVcCr*8qLU@Zw%hHbb2Jl`6U3E|qLgT{N@6Z=nT*CdS-26!8x6<@R?Q@xQ+# zvVTeMr9lEsWJDWQ-poeWXL97qIcUc;gw5(6Q zfqtKr;-GKdLfa})pz98!IbmkDHs0r_ltxp7HEpRxPDTeDTL zT+Q8+J*PIYUcdz&1cJ50HTmf;+~a-Q?r1Z(}Sr zewiQr6wQtRiIz4znZo3uZR5s+WA=>OqFsd)THV+BGa7%kt&~lP>$G8w3UdXcfJ3u? z2nc26Gn437SYF;WlSX>WbW}2VFXMXMefmN3-qjl#?&e?G!CIg1rf7Ho$q``z3I%PDKEn`$I zzzCBpT;u17*C`M}n1Sx1wa}X$fItF>AlSll(O*Abi#d6%R1;(;0-7Jw?`=~T%p56g zIlhj4!)rRoY(1$`FI=&!4S|QQtQ_!5oGSNr``)c?#B)|My`^bfwaidc5c|WL2kv7Vez@=%kA)4}t95mZz)lz$6?^ zq-!Yrb;NyPCE_fL@5r)R@!Pho7cSoWvVVx^Jvd%FdIqdXuLlXCZfgD^T+;Z(nqb1@ zorqKTSBb5x^}(h1={3#Qy?-1tcC*uITxpXjd}&L_^xQwxk~n&de5fnXs^;p(9U+uM zi=6mKj_e@Q&U1Bo!(E6_ak0sh0*Ycr6n4X%#Z7|ghGz*;_>J1^y02mKG(DcWG|F`}QoMwJVC}~bGggNO4 z-v~`FJGZgCsiOO^iRG`4!%aK9m8p67@k7B0vpgS+-P3ps!ujl+A9>6GP&A_^nM^Hw zacbyw5G}ke|I-P}xa0L6`Q>}|0|=~IJLhxCh@(_m2~elvkr^HN{oht|V%2Y?ZzNpl z*PdV0RId$hLMkMVKVKW*`w~1KCu37ef2m+LmQTj9k+Yd0>GcTc9B^jrrFYt3MAnXw zDx0mIjy>b242o&39_w&MTcn?SIcmAt(Ha`3g$~P;_bvhJxmJT;>Pp#kPN4&h2OaU; z*?q`$U2_ck-3>hi1})`8p~QDLZ7T6lg%C8F>+xtt?AI>S9G|GIj1eh(Pj}PY#o3r< zshSU-LuhZ$#z`w$ZWvAFWs&!sPuYr;m$FLOpdeQCcP1neS+Q@Wy!zDcSiRtx!8R7p zP?N`H%mdj+89T{XA#<#t{{DUU9T#7pXFlIO5iC=w9ge3bCiUs}Ly|S^s;3FbyVN*V zyu&fp%9kFl295l>eA-1QBiUE@HZ^#WQ`j)pzYf*h7@n6?nOpW2ZmJ->P*G4ZnZ{_4 zWKn&PYD`cN42_zIdslMrY!a8lL@!3Y`*L}lXnkGqs^(xGV{zT$3SLugs%q&& ziW2!7ADLkiG__9@)&Mp$szM&yZTfw;w} zRP1fuEM-?aGnj|M1>bu+rDB1|k@>^*|HijJAn_8M*lMbxO1FZV??0OP#%D>a8z$dQ zszh_GBsr|**%FBtFR_wgg$G9+i+0C3)+qaVZC;XLV{hR;p_W>cJIVzGo=?3bKT$P; zIAbjNNggrJYPfQ*<+HMT3J-^obzGLlcxY$mnB+irtuh&%6Z?)l061zzrc+=b8Y(V}EGl(@3Q9hmQ7xHJ7Xmiz1%i9HRT4 zvG*6rNDd$=6&P@$KSMwf?}ixgz>icKqgrjxRAgA%hahCdn+sA?hFl5mUZ}DeI;njS zlW+WZJvnsUj=rV)``wVOSyxfS` zo%@@VZ}+1tE-jMpxJ1rIH>GHRH11WE+^yAB-!8p(t6s;FvJib-EXn)fuV*Sdr*2~B z0ZN2q#q$q+d4drF82HtV6LDAS`X~3PBM%Asr>K=3Rd8cre4veFj4*JwpiyhQ{Oh&5 zIEnP`!@Xg}qJzTy5a#7|*jF0TVypAyaW|+4y#XH|Ww}mtC}@ zHCp)nRDz){AxNACT#5G+Qi=l@)R^VvPA&6wwaNX)MU~Zn^=;W>k)u71)7*Q=h5_*# z_Zroo1PpTb%T0zn1h@}e6S19GVVM~5YD9u>_UA;XSXRW4=Egd9U$SR_dVXrmz@n1} zQ+_+kz!GK%rQ>e*metmp$IW(HjHYNo8helsJ#)&o$KjWp;(&~jS8Slb(dE`e9A(Sp zV!8ig$BlwV!;+O)&cfG%@`HH^+3DK_F7b{*Qk4*{2WyUUI$@IS-e!8u`Eu)xSOMv*)E=$*|krP$H$D+#NXyLEuurx^u*y|1AUJO(? zC$F4m$0HvO6()?%CcmixtHw&le_XTR#F~VWZR3hFh5&!V9v}jGgqD%e;7zS-L~M5O z3%!?H%81|v;%Xf@R7Ev!V_w>6-P^7m+rX?A!02P`X~38L)C(Fku8;bh?|JQ&&!9e{ z_UtXpB7G#Ys?axce*A<@pD?vuWECRDp91MYVMWL1-Z=~iw>QqKu=3%>?x-`Cqn_iPNrsgGZ*Fhw z6D$bnfO6QVN&aalLftEet8~IPtKztWOoCM{pkA4uLhZ#=^3c^0t+u>m6*uExE7zu0 z7c|x^pLzsbVl>qy9XZ$1PXfMX&v$28}$oJd!;~&tew{C4Ir=L zJdyC!L8OJH>;(tueXR^5dNY`n<*jXRp+ra^5eq5|&V=Ys!3iee+Hjk!Mem2JkuGRU zt7bo!q&En8_LA>ZbYo*R9jF+Uq6ZYJf zQKch0qIJj=ckXOg>{z`$XJ!OOP&qx1H~NIwsn#3>c9GFaBDA~$QI z>I~yU!P&u6gv3$lN=#!{_t{{&plEaf41-t7nby}gH-E#MCn?a;yi7L9C{j?7)O8rn zDEx5urIVC(FE4QK#@!*sbsS|=Nr-ZZIZ?c}Z5G65>ki{`;WcrRSEvKpiobR_ej zA#K%F4IOOnt{&7^3{En3F@g8x+m;(kEv?AZtZNYvgk-jH0#kGfS0D*^y-R^3dq+Qz zHO6Rb>1Gt1?lz^7u$F^+Q0{Y2btCS#K5VYDbOG9k=6vs5K5wKR9LdWN{WO~8O`2v3 zA8ZY%;u3~!Bw6PqIiHI~snylzM}xWw-~yV*EUcheT-&!DD`D%cdm(50)$JQf-9nSD z2nY_u!n&Yd$Ia++kTd^YktE;qj&>Tn`^x3 z%D#S)Hyy%+Vb`LIJB0D-28=k$dlv2y)Ye&g@UB&oCo8q(kxWflJX&}9hYvM|PXdZe z-=WdA!%1_%7mF{0uTNA7SG%ZXxU?2nXUA8LGC*qi)G(ktz2*XEPU8*;0qJposc|}x z5uhNoWQDmx$7b+mnDcbW?P5G zdeX;=OxdWOdb9ols0*I%6zDsOS9Q3|8(dAo-|jaD-%Zh#`^2Gf%7HF4Bs*7V@*Cd) z3-L^~(M6(6;IH}a1L-98U}^~IRi z3^@^C_oTt#rxy-2I=GX;|>ZF{>QD1CNl@Du%iB*Le%;G7ws z_ccNyS09sfzEM-e@XNOD&(VcEFHmOP_!fIB_^3qjiCJdq++JW}u#4M#VpER9S;yI* zz3qI15ZwRhWRSVuTJFWC3*!PUE;hrjfQ0t1uXztfX%b*|@WpWq1#Ae#Sj2>8Pg=i62MG6KmeKm0I>GOoBH-3s zq@$8<;451W6BaLx%9fd1z8$hY_Gw6Z!zRu3{HdOv!>z!mjj??9SsQ7aGqRc*8B(Iv zA!wn*yGn4rm+OvWm&o-#>d&%X1O**epi#hAv^#cbl!e&F!`h`8AkhsDe9 z9r!%%-8a9-+}LRoML)F&u%C5>+XDSk$@>VMcD>H4XnhzOD**j5$R~J61TG?{h(h(E z9;2<^!3CY1zzl%eN0JpR_aD&YKe~>*^>kCzk}e zo$&)YO;r4~;GU-)Aq5XZy{z=f&bGxsy(HMHP+UuR2{24IORj;>T@k-W^CKRUIF{4F zueOe4w|Wjm$>XgwJ8!_xW>8sDeVQZF7NwuHtL`=z+QEP)Kea5SoJ~g8FxAS8>O%@9 z`mKr)7=tecU-ZqjvO|D|tdu+D7c9VDqHTe`@IdxCE7G#ADWX^^??E(C${8p7;V_mH zUE`{D{=M2WS8Y5StsSNf6ZH*D)Q_nb=8*%>)nA=s{FbW838-KX<^nCg{TB*B0xwF| zG-MKu7QsXYFm2va2u>4m8LAO)r_IfMBAe{AS^B{&>R5dm$q}5)K(4Gye8qVA^zX$f zPtOssj3fsIAEY(Ary?%}OIiC)N!LACglURqrrE}h;6HBAa}&oVjK-=G@D;IALo8ke z1@Hl9q;4^g_&Pw$?^}aiy@iM;gDU|&1%o!gj zZUC!NrCcv!V|r$m6JPIl&|=bwP7vl$aZuTzmw6s#J>^LkJbVMWhHyjq#1Wz04|vb& z(NMhPMo%p6Og1$x+fyO6_0)w!;WyFpR*do#1`HNZVcoW|>=g>GGH=KXWD9jXUxy50 zeJou4Fmen(oIJ&e1W8z!jbl_3a5sHIyo)}Ccr2)!oObnFGN6;jHh)+Ox=bAdPk*ec zz6w^VMmnB~ny&C-sgOj1vIi|B{U9lq-&;`{i1g%bipx>^Q_~THRs$d3GAcCZz0nMB z6gOp?sU`W1FKUA{&#D??BGh2KYES+(rGTVvr}NARP8|kj)`o~_*;GEvgwB&BQdCl> z6^9ok)89W;!A6AKAa$*aozC0Ie(T?lv|G1Z^Gz+QIessoe_=MGI-`ow;~0n4W!yKs z^)(7sKGTupCe*@$s=f%gOq1&$`4XHk>L)4bN!|nl;f9SGZ&tLQpl>?<1g&W=Nj3S+ zyVuuHn}NM5{n+ma6N%zdZXp7ZUIXD*^h&~Ai+mRgq#Rf>*>fXU9=`HrD=`5s8cka! zKX-;2G<+ONXfL=U=AF_PM%2=Dx7BxxeS*>t5UY-6NtWtk1yPfOSK1=INpT+Pc3D2I zL*ogYcWO;3R&UvFsjd(GJ>-DOqt#oa#e&c(jyV$!?Do1|Q%hWG| z*nhUBKAST1T(pwmMW)POU&vO*HPzg_p!l|SCn)=ocrLbSB2v2*G(@*B6SHLLz;MqxIPQ*JY-@1DHqJIc>L$#b` z?`yJ!%de1=@?CN=Fany!s~GWkO*J%Ea@TMkHm$3;o!b-QXH6Iwb;y5Vj)ipR4$1C5 z*#2EqgJ!V+LaJHS1?sc!NnF#EXQK`9;8L3LQ8{u;-(z}A6yL#N~3YgcUZD(N-DCf zYjj z(lZP|7bQ|eD_qa@(Y+RWBv}SQ#=?OA)Ff*Pw`*MO%iyHd1}^q(+c8Uk@!K&nFKF>j zsgQ4cs%SM7{|fWcrybnzVR_-VQx(Is3lK9e#$&75xvLvNcjpm=Yp46-^?jqGqhkil z-$?wrFn<0mj)N=a9C}D5sl}``OT7r5P^zNRn_^kujWzSGUye*^KgH61im!5P-2p+T(GzXACc-7<_xU3p~*4gn~)sg)xP&Y}B+lFaJY- zUgm|evv^+HUDkvs^?E5zt zKTJqSLM3)2jtHXt4w_#h8*{E3|JYnI6joq|8gL%>O2gp#E5!=eksfc=F)_DNJZ;>{ zfqvP;y}eB(HFd3p2lt~x{Izo?2VRcVes+DC3T~M~Wi6$57~;6oAFBnU&l>_JU3PI? z@y5(fWd75(B%vCF8V)X4ktkZXDS7Wrl{3MhUgfw;P+17;JaL0F3&?s~8q`pvQjXb0 zf)pEKanQ(Xye_XAcq2C_?I-5lq%TN?{B@mQAfV&&m+7>jy4_c}QC7|U}_}8dSbm8zmY+u9~_Tkbl!L+ z2&ZZI^F~@W%V!LYIp}}P6x9D{#itA1F7bGoEZ#6bOu6w8uomM@wH0XQA$ni!{ctB8 z6g!+aB+DF|lcMKlsfF{3?;?4|4{ZQ7ao^l~NxgCD)n1a8e1R0*Ju=@%SzkXbA|D+P zawkaND{cFHxU$uD@kq=*E?$Te^)A{w;D`51U&egSGL5l^H-8RfDut=u0oYy8YofG9 zWPfnSm40{e;nY+|_mHkVkvwP!>PhbUwJZxh`Q)d&zsA^me(^)SY_X^0zB^djOJTU9 z^&d#X0>tAeULzryHF@jHVwnr$LT%a2etmtlv>4XVGyCFJ$}LcHOXeM+n>se;z5b&3 zAr32pEoQo@k@qmws$~mm6rGvVyW0^t2KZ!CjTq^_nR;iJ_{Ph-cV!)tanjBhEyT}! znTBD7V7+^%V;3BcHZZPWx`ri?7{SD4V;gX5=SUo&DbfrmyPF>=$n+jQ*G7rW`?355 z)4w#goFpeEn!%c90de)v?KxnM3>*{!vKhoGmn$d)N)O4;xVhMRB6@=npC|+~Ka~AW zqOQc=IVz(pdVCAXM3;IyQBF|mU2^Xgm94CKeDZFG8FJ{14c1EK-GK2%?=tK4)Ks=t zd{-Az1OJD7=r0w5zT;DA7`lk1>SkfqbzGc7(APNTsFByaxZAw8F zaMh5nZ9?*m1%v1W0*oUI*VAIUI6LH{NAa3hDdMObv6FqfwvC5KZ6Xu75A2JJmoR{z zrhPT$37C4J_QS@wd-Ev5`1iHrC;K$f1rP72IVW#r#*oNyfKueCZv2Rfg3csp<+Cq9 zCJI61CexF2U?^V6Q7pZ%;ohCp<}bUfg7pwPOO?ubI>$4+SbJA()An{q1QPkWA}pr} ztVK541`idm`*V9yKrvx9n)u)nN2dbwF5U%H`Xc^0kp7tBMWiMK2sCYKlxNx!H-=sq z(z=&#JoGuW>D7{R@{nHoyi2z0sDV-AY(c-dp%uT43+l+ub+cfV349dByH< z17^HAFSesErRwu^LNmpwZ%na@*~;$i(RNDQ6%ZttpZXY01i)YTr!#zzB8`_Fo^F1x zgfSMx6BAM^_6 z^|sII214Eml_+Sa$tpYtkZFyjx%Yf4dh7~{Zdx{086Wf%JU>0Qd70?JT1jV4{_+ac z&Ro}NL?J2{#{vVB=~Dd@I8JoV8IP>z(xrQaBVMcX>d;b?XI@yTZ881$I1*$L&Fh_j z{M9xVsLql2E|0BhdTm&Y;U(Z2ZuxpkG=_38L zOUh@>kG@g+IcZYQG$1!S_LBt&F3q(vJy9^`HN>lHP*Fw(qn&+Qy@S)0o+gew5AV`R zUy*XGo|_^B!lv1xnZL>O-dndw*qqa0L%d|(7ts~Bv$=jGz!eVdHX?G;Wl{6tO1zl|itT3W^K5#Yqdh)tHSH0EvH>-jC{>$=8X)%Cc|&2+kRsrIyk{jGBQ6oHZ(sH$j2Pr`g9 z=%ki`iqS~3aDQ=g9+9^ks7aL1-GQh>p((CG>6c%i*;Y}oNZksW#q52;W&vs99L^AB zHKopdZ+=h=@8N<(uF}#@wR>o!1%W#drQ5rwFT5LO=z5UJS+@B>Ka+RcVLd1egVFPl7d+()FSq;U)uc6y zH5$gqF8|ozXSU^PqX7zCgtXS%W=31_9S-3{z95!5+o++qV+5yIw8f5%njiifp8*pU zyRPE8aSWcR=T*S!Mq=I}C0Q3<7-)u!E(Z3eIYy6yX`kq1A`v+MnUWqSnrPG;;J}81 z7%*O$F0q(1*j4ggy$ z;g*Wl^k3gnTrMG^J^@CFW()$-!QmLMRPh*`^l5p>a%v%AaGqC2Xc>r6uCHQy?VUDM zsL!wTsp!)@bP)Y?w(7&!#~EmOzwB9unr?Yqs%ZUOO4UPbe;E-hC4n2M>bSoBD+T@1z{7 z@^RES(ig`V^D%hTR9E z<8PK|q;pv}@}1>cl72WNnU@~TtP{{f9}Gfu_k4&gHmP^+5`rU;F#gpJ>ZiJ0p&x^3 zJ9>iV9hQ-os(jC`Ro!4s+Qgp-Ht05+b)p4~%+w&prrX(qK@8snUJC-0@|W;)?|#!m zo`b@rPf+n%e_R8t-&1nWCiQrN8v;^!k|9hx&-M-==cmLB8B)Y_l&JQwb0u#9(i&A^bm{O+NSAPC zkmF;n+baWIVz=R8m|p@V7o2ZNqDwzK(d|{oNAo$3$86pt=KnASTvRxOtL4w^00=MUM!QiS*%j z3kj1~#A>_5_9hASGz|*4IOTP*$h!RmDQfa*p!Z+Jo6$yCMyLE>v z?ig6k0?!HAfaP4Qvn1!pj0Ny+7%qGno^b1GePB?TdXBx7K6Q3FKkP$3UWqzG+IfmX z!G+++q9gc`R&J|H4$qO1I(lxuow@EQAb{lsg zOCjh=fqwLRLI|2y?yx|P*=w9zha(W7r1X^4Tdx!+xQcHH-koi#+tQE8SzQg&3p-Dz z`qQHB>xUIxN(fgLO%=+Uh;YvA*GNP-W6ySSgDt!Xhs%Z_UF^_3HFz*_cADZAOSs_1 z|71Ftc-)7RYD}HQSf6jsY-5j(PSEN@#rMb$v)MRO1>%YgZvueaCtRgHwE-gB%f1sT z>CeCFNTaLey_>4JwdGR4>{X|^#juaFvIO;=2Y_lpDvsiZR<|F^NrN*EM7(-}MFXoOX}v2D$*F=p!WtL)5e+=}$W+Z-YG? zFO|Z=^2#70>c;yHl~~<*OrfW3K3c{vwU=`G^uPcy;?< zU-IwI_>Y=z|9PO)zhB+I+WzNJPoCB1UUINUdPpbdwDO3)XOw4&c%}N2$?2Wwc!hsO z`rnVA*7%1XBT@(6H{Ji{((2h~1CFX+pTte<@KyfX`KoPo0e1dhSf}ClJ3st|gZnOq zhhb|!g=H&;f8;wLh}P#jaqo0Xa7KzVN~0=51|+8FjQ-%V1bFor%41OasA=2=Y9k_m zc`x+!eroAT@-$o5t+Jk^h0Xi*>UukSZ<2r8wxdP+&l3``cA`TX9v|EP+V#Yq>p1q4 z?#uk$yfmvu_4uKys(-huABx$0e0t7H_wqEmxGgU@;l$)$yZ*X@W{`J)$LN1w^#8Mu z_u}mnze>HDx&z9PkLnPEm1x$D1XAIVJv|US<8Zu(F{PZD#j^A{biD$JfNi zKm9*q&U-q6y;Q%ckbyfpKg>M(VcA>9Ufd?H@Lg>Jd^ACdEq? z_rsC!>q&pt9Jk?}LUv!VymoTGc;$vps+MnjWo4I!a7;}VFvrLw(iZOjN%Y@0{s~5% z?`JOm#U}2cIMl8FR%tULAc0}XnkmT>>9mBv&*@wX869wFyx9F0&zf8Y!rouBx}?@d zw*8;;yj(Wc?#h2NeMigx|HS*p4=NE9r?2b?4lC_wQg(dwX1NfX7imnSk-(D5AoCXC zon#nFO07*t4v9kd@g4Z>{=Z1A@s!NptCco&y?&Xl-S9epftUZt=l{;{|Ig0@GgG6! z*zhxsSB&E$S9PPm)+!fKnpq>PuhO+n$s)&R?g=c1JN_c{tkB zuvN5itq`U2h9lYQ&PqA6d36ren#Y_^4VjsYqht;!RZCP8gUetbcwR2-3TgoxHjke)lbv?&27Pk1RMXecq9K?GbcaQf?J+AHQ8JDC0K+I#dOL?Ml zOlbrzamcomIz6b}dPGVZ3omf5-p-7Rz~cor+>jbv6Ovt6LF+6VhKKCDv;v4~HhUaJ z!Dgx&hCsL|;z^`cng^Y`qEcv0Z4YUVtp_lhmnsnUKO zB64#Oi_cDV!VF*!_8A2;yQ$h{m!(S6o1gB-x~SL$vuo)VmXIhU{AwZLb^i19NdrTsfzFhak6uivW=76!(NCK8qvcOEr@la+7oV1b37D zTK%Nm>TM5aabb>4fnvju;V+c2$r3OW3GILn&*ea-P2*5+p0dSQ#a@L)ewyx;$-M*R z%OD5rX^zn;%bkP!w(bQUw?Kz$tbIh53sx4eH{1ZZ74Rw=yS)ka52jf6m zB=J)gNe>21{hiPMlYLaj8}~>#s=oSzHZ~K=;dUYt~V+9rudHf zJA@W~9x{U$J3V7rg2lQb;*{$akCDerdPWjM-sIP_$dWcUIKqU(5X>3M+g6R4_g$Tp zUGthE+{m2xOE=@N?DNT_DLiGe~Z;$a_t1Ft~ZPrlXpTs}>3R=>V$)E;B zD40~_J(cT;rk;z`?$ou99-}+l=0$4WTKPOWMcDGNs=kI9q$FNb$%~yXRx27hkzXru zFGW=l5o#C!lSs0TEoXN@}A7cgfSPn3flJ=bij_MrN!lQe(P0-^(R$sJuTZTJ)LwDD(cw6XTp7PEOzkpTvA0*Ga)|yw6M4=|C70P_McDX96{iS$lEtTR%_% zL7-obRVKtAtsp0w9*jNv(lO_WE4aPsagNAmE7+iuUs%-eY3V#)!h*BzUF<6t{3Z1P z2YVT|c)3YGvc;zphnjIcfD{rzn)bf?POl<>~g`B2xnV=rrzzeHl3)MKIh3r zbi&gjEeR_kArb1rZCpxs7!M$Y>vKS$F($GE+{c>oT|uZTx{PYjxkyP=(wu=YxfY3A zWgFM#26?Ro7%blYnI_v~=NKpV>iE=(HLNkoX{e%3&3o|Zfwiqr8ta05>s?bdu7hq^ zC5SdE**YQ$dZ_g;|3XBOE}ij^RS93Fb%Whvc5&W(7aIJS%ugUypOFAFl}#*3!~Hu%RA zteVB$qJ^6%3LYul=@K2dbkCs6V$^pRRv5x4)z5TJqxpC{rH!xlAs$1IS+sUx^qHfLQ5sk z*a^X?)NN@S8RE!e;wm0w57=37U+~|2HNSqP$a<+M`wW?R#YscYydkd1I1huI%{&P7 zvy=&nxw$cw>tee)bn?|fVTC*0YRP?$WCr^M_W`5z4(fsdzA@?}gveC+)n`2sxerIrry<=5wh;l44$mIZP zG;fCL-GCjHkrO1XzNl)3ue>^BESQ;$iJ6dCk5+~-4M)}0b<-T<)A8TbycNsVE*#8{ zi<+hRd_rHsbhOpHxD}-tJ4p)x+hH@5MhxYjjoPwW`*%{V@OtGu>CFhYyEZ~1kpe1FuH(;2Mb+{qr{wH0`Ip>suP8?`w%y8h|6&5~ zSDFly%3Y5r?Un#niJx&)(7(=eRX4sO(PS>eRw8Xma70IlXh2G5Y9E3_wQi^o`W$oQ zpR%RoxUWvA@t71;GDXQsnazeZ;KVbaa+~vK2fMBy+=AnNxjeP|arNm_+MQ1GPHTy2 z#HnP>=>AM(ReCQ1F+?bl97+{p({PIYXnf{b>_L4ad9E+qSg;a?>^`qV^Ux!0-@*&~ zSiUTvygtjorIP19c?e~dRm^UgtQ0LP)v}zX4J5ZR`OCTd@}7^aY!G-Jyv^y^vGq)f zy64HPPkXC^{|aKkt*xW6@jk)<`~iM9*7E8mmfRN78GOC~mlmQIbC;0TEJ^dICvj); zlL8vhj50<{9HZ%oW{7sC&?A*mR9L4uqeW3}bQ~hvy{nluQ&)1<#CT1UdL}I}(_-}I zUAlJLNcHU1DP~;fR6f+8L;G%4|A>ES)buLrAe9-RbwjeNZ85>s(-^0xBd%6vpW6fp zE*jC9A!IkuzJfSyL%fxqQ&K5_!hcO^upHVq&?u_C*up6mn&gZ>q(4l4ey)O(Qtbft zFu)03B=H@_-&a3&?I~KuS=T(t>#zx)L^ieN^BC*bx$m-JjGpW>C@CqClTWj40&Elv zaB@ntYZBsc#OG>w^EI(?kl9Jlf#dx$Z|c2%edS)M<^nHWlI*ROlo6|wnA5Sc144a> zTH4W)tFaG2l9zxkC)# zo6|`a1szR7jzKHbEwBW#bGgYu?0P?x8L9D0aS0AWOT!L&~S4X+fiq;QibA1Hke1pHObEiOD$R@Fd{s+7or z!&4$?hV{ZOr{q$2^pD15rAuiUwoRQ%wTL?LQQ1Bpnji;GO3KKC^YQ;`>!Oq#i&Q2} z22$oG{nJXH?CtMC8P6I894&01Cye(0C@`teDcL7@i;zynfv%$eOyLLaxjni z8nbgeshlm7@f<0A=jE$*WuubPo2P(O@MQSPpr6}9oYhnFVbP&RDFU@!{lGoEH%p8L|%o~!j0>2|p6cB@6CW7atai2V%@RNW}$Rv641 zA6Jzbl9(_T2Ft3UAq?BN&vq-<=-huxXdXEn8#RV)KL001z6 z=^vyBx%g)gMeomSS+q8@H1sGus!p}d@&5D`6v(x@Sib4NMQ#yw({3QzotbGoT8etJ z(nv@p7QD{}kEaDRbijv-$ygvYDC)-!t6mE1ojIEv-PMSK+^wxNOKnrp`atW4IOEb2 zN0eyn^%c_N=(y%<-Rm=?pn<$VJCa5TnX@lTR*Mr{I)wQeq#I6Dci_G>#Ku4`!1QJg>^6 zl5DFYV1*g9O@%iiP=fv&_qTpFR>|{BO>%1QqHHhSF5imRwwaUskaINUE64&IiGU*( zWp!<7Xkv8(S$m>_nGu13!%@-?M~pO0I@MB&tvn#aLj5U0!6_lw@>1ieyzm12ElL(b z((p)NWxk(bi~ybMgi~SL@T#yc%qHB-lh27F>49sO=FTHlD8@2{0Md!r8{Ai_+hgO~ z?JejP`7&SX1;uCHn1pxFB92>gC#07%#gD)ta6=IY0K`W+EKr%W#wH`bf;Po!8M%(D zsD|5mh}6c=OFexX?c(rI#Dl;$^@QS2j2I;M>^P2lJe@SI?f%-9RhTkpSlv6BE(?I~ z_*P0Zyl>hs$SHk(#TMAq&Z`8uGqIU&ffI>suRS7E3&z;Q45Gm;nqNU@Gg#0&nQe5- z&#!A9!jnT-@_EN+CozDHQnT1<1Xd;XOJ1iHS6IC;>|+!MRM^mf1d^IfDRA?dref#Tq-HbCAW3eLGiVJ!M(yDc{o2=%GIKrra7L(H&6v})JBRH3nkE?%>Fsq!5S(HNz zf2LiwLCde1p6bxM{|;{Ya%xofUU)DkZx}w4e+tlihrrvR2&C3jl#w&w9CFy^s(}W% z){Y3JW77jsEN^E#l7|gBZwtM^&aiCdYj94MXsV=7LOn*`XEK#CvZ$4W0F1$Ln9vU4 zO`=n9*m{2IY`oK|3s&pCYZP;ISUq=DT)P?}fdw)7Dz&C0pj$~vE;jxY?f%-NyJg>{ zr8{sH4jU+9R_Bv{zygVgGw$eNBVp4^Br@*~fWutjHqVypg$tEuMQV0QUGINH9N!+5r)1=jtu(p>)0i8uT z5-Zn@hKp)da(YjTBl_*Hi1R_H?guP~0T%_jYRdi(+eDn0q!t7@Lq>yqhEk`dRV(1(~)$x+d&DIXrHX2w80>Jmb( z^><&kTzZ6>uiWLNhiSVDhPfcJ1vZ>!#6GKBYMt6j#l74)XOWRh(M@;u2-ngQHKl0q=lMr%ikX9lzP%b8vLawW=-da$YC3Z~QCh zee8UKrMrFZ|->+us zJT;FQE|OECE-&WuB4E3SbROJi-e&ZjqyG_MBpaJr%HMhA0*+{O$B)RFxC<60CrP(T#_w+Y_%0oSUy^+N2HxXQ;=27NKFi} zf*}fsWegp**NTzQ8T$%)=B}P>M5M$9#@TWao6&VqL?%>^lCC*Yzzt*H*Qz&FWa z^B3*djSFizn(~aJ3k^H8tM5)2tnw#BTE_%*t=t%t3hYw|-w1BoTpTigg-`wkSJX`7 ztSBEH?3^EIf3bCUOxGE~BoZBT1+aC9Dvs#-G^q3C3G37N4miXi^**t-wBfe7qaMsZ zDC=_Kis-iS1ze9GvudSfm6uqHFWA3L|eH4IUj>_TA-4=Oj=tO;?FEof1>%nx8R zSw0^(Zbx0wIQndn7G(FC)x5t((GVxSe~>wS6nIGB%gfzdJ*#WBEu* zGJ)v(rnz6aA*dap(I6yKzvCpwm8NgzG+@rW98HqN(o>s{YUs*retyL=wXG>EvN zZAKeDv87nrMZ%ObQ^GRrm5n7Jp?v~HD3}~7@#1Zh73k`X*d1}Jt)w(j51pQod|B&+ z=s>>QHgWHo)Tq9*XF9q_02w5|TI*JiuZLA@hL$${O*GDuD<~~Biph-(2YQRo!-fOf z7udNvvo8wD9`tHnR574qyLcsAF&YjJ5RksXf#Bmc?=Pp9$uSQug;j8Jewe$`ICYCA z89+%d#0%jc8XoQjkYg3%>MQ=ChtQ$z5^z03^AAN$bfag#t~RK)YDG%X_#zquK7Q;n z7)%W|W)0<6>?dO)M4Y=j~p7^tDMp(bhZ%4Z0f zFZcW)gi}KTOF27)vDXNhg+LXSH-@@rhL~66P4fe{FZmLV2#pwDfrl}N1h)W0d<~%z zMW#4_56!;AlTld4;FbR=6Ecs;B7=N)>HK1-FdgWJLiCGsHxtR>rh zF#C&Tk7qu1PE~=^gf|v-tVvrTEnA3?R?dizNK(HLK)Sw<7X&&f=Q`@gw{ggGia`Xx zQ#7^Pb9@{wKi^tnvgTL0T|A^RHLljq_&3P>93XQSU2y{aiw)+}{Z({(m1aIoyD``0XJ{d8spdHe*+IlA<<42uYOP#OZtq z@6Ik_KMlBX72^q{w0`P@d%OHBzIoWfD{HaGZ&o-oM3gJyg5kpj>3AKIG2i6nYp*K1 z{Gb5)&;R!3Z$;m&5ZwA8adj;_#%U*Kbjk?*Gha&2(UG08V@@pgJaQ|384@j%m->}m zrkJlgzcqsOl}IIR{rUdKX@Qe+1-{GPRz`Xj2_3p6L35p4xvg?(Ic{eM-XiwVvpiLt z=lervgs0S(D1lO837eJQ>%qR3(-upc?PsU%qjACCYX7P6_@qx_X7Px6)lP zH}m@;o%mjl&|~1>lZsvKRaT?EpVIyB^;F;COlR$Iv1b_HZ7chJNDANUA??pI-VFJ_ z{nY!9x7roBZwC2>>}Wv|Fk2wP%%A%7bzZZMu7Fm_tZcc4VTJL{={2(aR87|ACBBO8 zidd3=teYMG%Op0E)qH^Rp#1ch*HN1#3o(C=y%`sh2~NKMpKFCqL>ZvCqAg)A+R8Gx z2{H~~lkXe+q7A9ZVh4w{r`+zH;34RS#U(I3OpBwVDb}g{B#%F7Hvb9o=%2PmDl zTwcH8N_yAPez(IQJwbhgbbh?q`YvlZvEQCkCn2%E?fYY8GL?I+@PQG#BGp{*_9H{E zs}nueX*c%6y`g)}I+6W$fBpapt-dwVO8TGI=g(T6|2tX^kuDAjHQXd}O}{#uf*sMB z)IG~kbl(xi9k!Vit>UZ`P~Rizu>bN@(!qtCQWoRwiTNlRij`#OJ*gvkZ^#TU!g76P z2*(jKe0J@vWC0LUmw=Wy-VEP!(p~wvDsbRz@Gk zr``y@Jc=ag&NeANGpKz4)W?J(@nd&@{B!Dwpwx0x=k#Ne z4t+x5XQudVPRg*2CH2oLtz9fvJl`n3%5y59G__*NXJ4<;2X+Trw*I*E#H{3H{?LLior}h9X&$D3 z9nh%w_-;m%vCM!tv+N>uh5QC~J_P@BH5K6|g{V*Es^t>KpKp`{AePC7vKj9WvHy0_ zK_Di5g{e^4g|}XThadddZ}h)koLF}yOSEQ=!U{v>WCnbC<$D?je`XxBkek=Hh?9Aw zT}2bt(K`=1sSet=`1gQSt8s)^qtv3@wET|0<4u3p{Bx2=|75U8^2Y*J&wGw9#~V4i z@;GXFa3wH6{#NF{BrvCU&eHS2=d!Eb_@=uN`ZuTifOmO^#W-^8VZX(f@oT}unsp#S z%KP6g(IKmxbXvnuuFa@#ezq?0B8f4QDhK5Tgg1T5WnKnWH83MjH!06tVvO3-sIs&| z3#1iionnijQX~VWcv8^ZMHzNDGA@-%Ll*6R#@x!diAad9(1~~}6mZE7oi*JRp$))) z7KT43U7~+`0^^icU_SiiXdTbfOse2M(mLtf?RVJ%6hv6UT^>d-RWUFkB9w_%xg^YT zUrn;}$Y{s%L8WLgI%@%752qs-F@^&I2cfPP8^t@TjA0U%iKLTm+8jQ;-nVIaaE!NZ zhitU>gVEVr{n`skU1jknup?KW6{Bp^;lpq9KJ-j>XDM!9m0^UzFw{@XGGK8l3x%tt z{oN7_i8F@n5yRlsT5WtYSU=7-_`HYqt-F%WB#LDqNijx4Nx{0G_VB1egF9PXTnaH2 zp&E|+xhYIY6dU3Q1MI?La@F{dc`t%&WKzMKqQ8!rtQFhcv?+$-=2tn zwdS(>0~_JUqqvO5OdqvTLGgEG77OQCt5^3q{PlPKnK(*3$G2(p`~BZ=qtf3Xr1KIY zPaGA49|gT~U%IZL^#gqLz=-T=E59qHcUztBZ()aq0{xQfkm2l?cd8#QR9Ci{3bz~* zE!yzVV6RUa1noOC|F@GkWHK2#nmDrf(Q}aNT7O!cLuD2lYpD)BJy`O{@CaH4XZ;n# zS4PXizO6h$%DK~gOrn|BUZs&d$zy;mNf;vL9#byo&NInfW@?9kv-6LnzNL&08$0m( z+Yr(Mg-q_#;I#G{o~@XLJbjVUINnmKis~^;M~7YX#UW$xnNj{lA#R6)Tv(Wmd&;j0}qepkzyCJ@#NU~tX4!H#KDR*(S0SDtdpG7GkfBG zdh98kDZvTeXs!erbVZk>0bX-+WWjAB$b5XFzv30GZ&q@$!=d zV-Y5PJ}}bFf6Kd|%P!Q$L!gc}tBkLzS(thIR!K8Hnl1#SlrC33;`f`eTB(1qy#=lr z%O7@;1M>n@*b7O)_0(bO2q#mAImJ-5O z0!ESh0Q*CIoAf&&DMZI`%Ts{vL$il#p6k?tv)c)DS##p24Cl!KbCK1lnbUI)?OMEn zDq5%T+*g&5LURugG*%7SM^<0@vkcZ`ZVMfw=riZjG~x6Bmi{h^u8SL^RD4=|`d84% z@af(UrkUVTtAG-~FukjTgPRA&$fTt4iv!wV?`4A8?9EzE(sFa=1et@irgd2td)IoeTZ*5RYuZ-$nOYLC z0Xiu4z2Uh6jdIM$wLhwv2etA0u)x;KVijd5Wd3A%&8kgDmyNu{gqX~`0dG~csv?+^ z%&!eB2)qka5E?$4H+ZXiv)n8>)g-TInt%u^vg%V4 z*)Pb3%T%%sYe=tzN}{xKy7|CP(Ub?H7YQO?6jzwu9XW!bn6EL^i0Ji=_<1Y!TQfFL ztmz1&bvc+;wf%~6X-BY)S6NOejRDQg6UCffQhx5hpt?3)t%R6}$USM1cDa*%yg9408l%<9Ij2TgRV?Fkahy5j0=6$g3Q)TUlR)&gZhLL5E7;X;|nq{Cv71i zOA^IlGM))~B9dh$b!dE24&@oWrJOBPtA!a4kYh`)8?lZ+DQ<7wFkiX^kvLsFXwN$D z;UQc+#9EB7HRn^Ck_`9UY;ZEpYKqlD&}8J~iIsj;`X{$UD@hA_9vM)2worNook(*M zJ}PBm5{1Cnx1>~%(~a;g%!|sFxsUfVJpS8Tdsx1b9K>4FvaB1p_`|GdYW|wh$Vge% zR%q3E=Y{6uYKzCVI@$CAB1A0VclfDAoy|8!zU`u*L*J|m_oV+D2KU6%_TTwiW&3`_ zNc|WszW28R|8nJ4B&8o?bReebuF3sJt%E?DIW4$oS0Gw;SnOqT&4-OwRga8VyAS>~ z2mBAMYc#%bIvu{zJ3+_w0qMHWBc*p;-Z$kRY}y4cUh$l2-Y28}6?D&_b;yWEpuglJ zQ{*^|z|pXxrtm{Z@0LyF8gp$e>j~8tnbKz{VwjOWeF()wz^4V^?8~IU;2DzTfy6ym zU#4F9oQ|P&J|C)KRtAdU7<}=q9j&+-%{^Wk`T5S{-=7ii=|372`hVBHeyd2)-#Ahy z+n~)yb$Ing#!C1y;HWn{qC{nSavc;~9(cO_boFb{q3b}=z2%gfAL@))aKd;F>+qrb zUCKv?EZi?uZ*+ZrRNmO=X|i_C|DQ(%hO<^~lrsGqYsujc&%D+j`A$cHHxgL(@A*YA9BaM0 z(`;M&VO-%V=wiY*>g>oj7A@#oiUc4!0ojr#u{K9zx2=awx4LjYImG^uDG?C-n4~Tf zH5u)ZbK(>79EX7d|BaG{ca0;v*pR7%1&qX^_N#M-8ALNr`CB7;ev@&T4nmeCM^4ym zSZsOgkK8tDd5|R-zql%Yl~<4>1r3qq@muaO_rCP7XjJUo91yy@`!HI=#se6J{G;8?BI39J;#0=2%rmbp0r0u0M?|%a z+P#|2nvT|%F9_d({P2@Ml&sN}`Jc+a--{ov(ZA)gi{0F7+>Xte0(K%U9Bm%Y_s^_o zQY5@$7xN*ZUqK?LoS+EE7ySGT?m{0B#&De#wGTCFO4>`hRUO}BhhzkhwBO|dk*Jsd zVJ7aMzi$6n-}|Tid#N;KbB^iHh76dc^OqW3+2F1TmY#1`Dt*>_b_2z4tJvBRNa0_6 zHGjRa^;}Cd^Ao`|BiIyRd8j97MKMaFOFUFsd#~y44s>qZjaiD{y(;EEyTe_W`jfE> zUHdh5wKdwiV5JP6vOTm{Dsr(gy*bo-@E`p@DBICwU_C00yEJFy)y$54l%Tit4?lD% zzI$z#5B*E#-ixWQSFlmws=`-LfS!-=UWK81C9l-~PtCu-8~={0?d*7*a@mMoj%qH} zmcd;?YQ;*u&JDP`QpADN`$?YFgmO)6PDT@!lOPLiA03je{pa z_py@ZtG^$y)zTQ`|0iPoXA$c^f9-KSa|Ui*!6wT(YCh-oTC3x$KgVcRRzFPi^u7|j zM@TyR#(V{=*S`H_T48{BFSdlaYyh+m~IT z)UDi0{(XC>$3N^0+Aq3iM(1`R$T2L}`$W?6MeIBXbY9}P^8>L%6t@>FrsnrsS`L2h z(!BChQ^AuIm4Hq^`Z)t>vEWzZIj565KW=^j;&Wd?ke4YkpIlw1lOsE zj+C4w1=4BNb#aZ#b;%~V8gT1^4Uf&l-ByX)>MhM826xIrvZEnB+2IJ<$6N8lOfwmb zAxB_6J{D)osvNHq+o-^&eIlL-BJVMOtNv_#Nj2@n2zr8Qs-k)7lFSJ0!kSF z;Ekpxb!ZrYf)1=Ie!NjBuXQ85Quy2{LfUE(^R-bF*o!;eJbdl(x@>kV z@d^dcd&_$gy}ZV`OZ|MW$5T}IR|Tjngk?niT~>gQf?)LW60pkMewpp8GIQkI4O-niso;U5lUAC0m*^>%}GgXA2N(Y1!Ms4H*2!?(Hz zbq?N>2s!_Uz5j_l$^YZw3)J>|bW1Ct*6o$w>rJUJ#q%J-)L*MR1kE`F-ZG#owPz9G zJytIhqLkB75iv1a<_e=q^wxZj5tUU$FWsNZxo_72NpNtbXoOa`hmji z&jExLgRE>8(yB{AX`6u9{_-4oAscj;18(jvJ$SIjM=Fxrfr^K^luoS#P3%qZzbXT|nqhK3h(zT^*5z{q%*>39s@7-Eq zgAkJ_CxnTItQ6c1h+sWS1-#n2RCMrhuCBn8Wx-Q()!O>OR&#ys>3TqElza%zYei+} z8uDzAi_wtxGrFf^Mw)x(zI7h&GaQnrGhsqBR(PQtf`SDb{z94=L5u)E$eSHK5b)Aj zpN$aITPIl6CJvi6%iyTZ3fA*aNN}AcB<#v^aaCoqzIEBB8eXmImfrza;}w15$Z`w8 zk>SYEB_xC=p|Q9{GQ|?tkls9V5q7%f7D=AlYv6>1#X@#voJDsvQ+y+wF`Ixph=2zh zab+sa@Tb?g@20|)dYn#iTP7B!ZB<_@mVJlfD;tsF|Mk}7;YT~|&C#&uhv-*XOMm}csyIJo5uLUi)hO!axP>-Q}{4cHgwI48E0R&=5 zf_GU+C!>85#g+-(;Uc7iCh{gmc%6M2Vx6nX42H}I0R|E`(VdWNr4#_D5Kq#&C zsBkndvH$^xBBKDY1ivcxUcOqf&PVCer1C1_bkMu9vnvoA90mmt-;-Q$@fcZlzLfff zI1y(-5u6VC{-e3%qPk!wiDD5Xx10xdmFb0>NIFmn1QXmb|BjQ=(8A)0}J&>d3C9PmxBy~ zMbZQFIbJItXVuMLT4c(QpHGXt7bDdBEEwY;8x|BEZP+$RUb|Q#qgmEC&H7f%!i6vV zdHAPM9C}OvO_B)4 zDoo4`Go7j2=o0vB!chiE^Y7uHINRSrBlto|%>TSE$r9wmk8jo#vh}7t*bvo0yUnqeN%PG>3iulShzm;W#S6JA=$%4 zEIkP%dl|O-E?TYw2v8v9`A?R8;Ju{CforYqLoFrN=kOm401*w*SAN(b`ORIke}FNy zf!@vgPpTeVV_u-3+5D5BhU=d?Q)|*Z-!m1<iitF`A=c&mhB z&Bnb^`jay`>%7OFsXw;oe)Sl%Z{MEU0ngr0)2xI+NM0lN+7Dw&{(Qf#<3NCI^HQ~7 z%TP&cqkiT27CDsPUZa%T7Hv6A0C?8ZER6zF}?dTGj2vr)iN!3?bY~4%<0( zH67-XNFFxaxO;F@mm^CeZWi>@^&fr#cqISZ2e%aiMzM*k&GNw^{QOIaD^x}~^lR^X zb!2^u+w^+NRnH)U#Uhi>d6$K5-U4*(Pa(M{i3|L%&eBk?Z8aoSjj}uI*^9VCMmsz( zGo%8I^ERKG#T7F3>5`**kX z`-cOad+*T6tvwWs%R70B7ng9*($q%epR0&4XMt~bvH-z)CJ^X9>LIs3)4?&;j^xO! zHykht*gpYk=g#{CvH??$nU{lrp+KV+0-S%C4`-1+z!T+98k2D)W!m0;|NZE{Z~Pm= zO#f<}_PwsZ+u&XL-t5;M`<@9}%6z}!9TUA-JF9r|$?y5`=5fE{3)GtcoGW(qLJ%9v z_5Tu4FZrNMt~U*r=JNXDc*ae`LZh$Bx!`#WLi(Ivji4mq)2aKrLX#21{e#TB^6gb_EoJ`6}}WEi%|Am3Su&nW&9 z9?^BFe#ZI`c4jsx-v8$t&H5p>5yy$q+4cIIr_?9C{2ZQSY1AgcT)HzH(%s9BL%QI1 zC$R~+kq@-8T0M-7#W_}JNTqhfdP|7R3%Y}~dzX&rNhCF?lP~&bdnq?b1mN^?dZYEu zZ};ne7d1ja@YVDW@&AM)lHbGvEQjwE^3}Oft<{qd^f3J?Mewlic6TrXJh_dkgOB% zuhRjXW=?$afxEiq)~urlIq_TdNj5J^vz3QwWaG)ee)z#JJCFCD2Z7|bP?LR5X=I;1 zB&SlY#3g1Ca|&RTh|lx7cEo+3|I5U8pl`+gvivveV)qT2pGCx-$fT8;_1aTDE+db2__jXL&=;(5)^8MY3xBROfp zf^oCS;l7`1Wtet5MX~7%%r6hM+qgw8-Km@kw4FV%xk_2@6!HgfKggIU8M%8uKw!RI z6i(r4!hpwXPliEX90d!3JYp744syUx;__S{z#($4kEIJ|PuH?jdTgUyop2se{VBQ2 z9UZHM{VNa$o@67(ieN}TU{V$#2O;;AoeQhDPw2_xoSj}*aN<49l9reS0mLRMV|?Z{ z*JqfTaMP=f9yPfK#d)2#HTAR%=fF}zx1yMtFF1$?BOt>x6NCm`NX)eJ zug?eY_rFiF^2HD7`v>Aqt&Q{t{m^qjh(_x1Uyk;WYLr2y8{s4A^0e0on9yYx08IA; zyPPd#FmMx&ctFA;E0fddrv4SqM1}mBg0W?0JLQhfWucdhpO~kC%Q&-QwZxP(Cvv9G z9Ou<8b|cAT`IxV&NGyx0%0u`XSk-V$v@}nHZF|hZ?5sj(nOdhpBuVvAwptNyvt59^ zb%&yl6)APw(vkr2xz+32P^kEK3HhjTje6KVS_N@SXDDjN||JGoZ^5f z-!{7M24&H=Nh23j%fl+P_=MxGaEmTU(p-h+2mN$o6F9m!!hLZ-)Phu1*C+oli2wrs?SXIaxBRY`0$c=Y!W)1j6pf}_40~Yly zMe|l{!WPOxa0eb`B_W|>5BmVI5X2CEqMG@HV#i!_Q`uSAnBd}y^soEHt%s@Hmlh2L zY(m;Y59KJ$J?z>f;_zY$@+T|FMOg0L%LSE=N3~HZ@|^_@Jyv~1Fikn;@DH=?xbm)1 zt<8#Tl6)f`oUr;2%)ZIs1Q+E4MavP2DWu!hpbg$u<-Wwk6mgC&tW;rHB#tc zK@7lc+Xm|ap0}R)r)wIYAyv51wV#A=!|TxyCPqd@UqLd7luG^z8bqbqYPVksr*zqt z^j$P|$Xm(9VAlaGFNzt#Ot)(2xLeLu`q5O|U(`9E&0Qw1&-t4X0Tvrr&CD!wy76si z{G54*1WY$A%|YEu2E}`6eCG&3dIQ1C%*gCPpQ2Cm5gHfuHMBy?vYT(@FNe55V7Etk zv}IsSh8l)P;=T7XYq69_JP&}=(A&-h%bB2)z|8)y%YU2Bdlu?ALxUO%$B!ohban*h z4&M*r50O1!KFFb_hkCci`3NN6-UAMm!pxy2VgA@I?gfZOThzVZ&S!7^j~#9f9NJ5i z1nntBM9)j6Ey#Y{+C!e>_VOpGav@8KCw^VF=k~h35BjYcRE%Y8WN!m2c?D9^>jJy? zZyxeC#nbggBkf924~s-5xJA?izl3qUolZjN1!Oi^9x}fa%xu1;`_k5r^=+A6Cb-~e z?sPWw4n;?#W2!J*y#s0AP(p^fU^D~Y-IJ_xD{^=`26q zVux52s)2n<&qz<6Z#G3jAF{erz0@Cgo|-bYHUFZjC0#198XOPM_MkD77YDN zDDPLV2{o{i1MrK&FwAZV1<#q0F^p7qWO|LyYc2OGYUVt^%%0ZAHG5=7h7q~TteWup zGyIH(Fv6=!wCm{U)zRc2zb?&3r${9J$-IWL2`4HbzO|5{NzN?lLCHLE&0{i3gq%bHma!Y9mry#7L~He%K9Oa+>?X#()#8CJ)p;$Ak)u~2z>E+tKVpAVvU)p z%%OI^*cnrsvZgVaMm#sq@L-Deg_q?QGcs}5PvZ-dw))Hsx|o$ps_U$TMvC-ShKGTi zj@pb2V)RR{y9d+x@K)wUtEtzz2K7Q=*^1jNvjmEe!=g)bKtZ6_%`A_%>m^plZ1Y<8 z3mQYawCcK}WVr(B(kR{^QV;T>6rD>rRP#ziyc^RGwb>OEAX0{XSLmDZ%3x8 z#>W%cgpqF7t{vpR5KA>XvxBM$Km0l^$#IC3lptm5tBjxQdNizZ7s=BUyrVKqTHas|cehUtgX zoaUy8Z1|TY0)B?PbmIK0(D`wl{0yV;?jGGBV<#kAG}zPW9Ql;=8?W@)QxJQKGfwQ# z1i%P>ZrAFt?#M2m2Tcjbl5rMVh`V*gjmI)Z>`Eio0selxcx|@+O#n#WRxj62+%+3- zg(5e(1(s#m8BO9|SkSqXy_y=*c1wG8S10{p5AwpF;z}YiUQe|83BK{guVW(bhG;e(SoD(lZLgr&Dwz z+_HqDNMz+qhB*hEn8`bpQ90ABq1XeRx2>FHdl`XMr*s4cIZ z2V*z%CdP@m8Ez<8sfn2Zpc1F+3;ZS5bdEa*F6c8Yv6fZzWLMQ@>ow|6%-*>o+n~#5 ztfHk^)~qcx0pN1=D1>r0?nDtoy0eoi*LD%Aw4RKElyh%4qlqr|Z&M5JXlYY#_Yl#> zHq=}FDp_?{n#QKkzO}u6^JE?IE4{My~K&e1#a)z z5`TgtD*sWRZOmDVo<|Ywu=3ZmJRx@>+5dxZxIc->y(c=jQ>+t23|5O* zcwDTeCc65#tx4eeUGvHG$|1uZ%VSkdPS4N;;XpMBVwK}$gHjT)Whmqzw4N{ZwK9|k z>9dtF=Rk3WG2JLWT5bE%GhEIrQR*rSd8vPe)+U!dCOEebtiG%qFJu+B)8koeQFPGf zi?g{{MD0z>LbzgiKCELkXj#=#yBonSTYIAJAExJ5fO{jG`Bbti42q!r`iSbMI=AO5^IvMl$=U zjI0{9CYxb#tl9ko_bCSA#Z{7b)g02Wu0pSM2fZcUi<2RofC!g$p(cl>(wyKXdF_UsX~g>X z9lr)GzT%HlvhjQWK(b17ZPI@#nh-rYs=(uc#DnVsOUPbjQwW5i(uk~d**?d2ov4e0 zrFrWkAFK%BQQVFe7D{MBP!#7Z1_7ZlW%UkPzBdoQY#FHJ8C!iwIIbscCnR?SlXHiV zfxSHm4tI^~Ub{7{BIbF*!@~8^8M6?;xq>&Hm=;R|gHJ$NbPfEm6lW&C3wMt}wJx#Rn47 z7f7$;u)$U9JI3E8E?WTY1#-LkwF?Usitk~9KSo?S)cSR+=K zrkh0&PKk?Y{+o@DN*NZp`EhdZN&=St7klp=*HpUi`{P&#MFt_DH1|*?v_T0~uu()z z5RwpDK5L$Z?fl=WTDddm0v{s{c#)$O*27-O&}DklTJLOw~k&E0WPmNku+)DIjW zm{J9RUO-9=*s!Ct8p>q3;Zp=&YiK{LUUM%obtzcO%%vWoUu;qH8Js#bERuA?Jt(Ga z({j5YW{I?XQ(9lA2LWg4i!Bs3g}tF>7{4DHDAh%F=3Hqblj801kp0xeJ;2@W-%g+m zRgF9m*pLO)R7sbtVUbmqh{-XioI>wF;eFbDFQ6h&Ol)x{mE*V4!i@p`xr%CBTBbMT zH~W0bD#zzhDui1g6g5~Ku<8W_7J7go!!lw0W(ojRbs&+92uvDJpjEUls)868WgWf3 zSCL^i&lL>Y{rP*?}?`r0=zZ1;P*EZ#Eam55C~&N!RyC$x$MG9`4Y;vpPRuLK5MH z2f*3-#_LbPvtrDa%yc-p*rmXn77?8#Qp+&6*)>DqTWm^~ z&V(<`%NLPajvmn^TJoQ}TRl`;mi2Jb$WT1JogAw|fosd(;dcI;euCq0bNA+j3abz- zMOPAO@2MVR<|1w`ft(lj2dVoo?nw9+S6jv^`d5!AJqj^gyWwp&gA>KYS3Gh8)`o-( z1O-2I8x>_1u*|7`_X4FwL~KNh-?tk&)WPi2@_&)3uuBtPDl(T80m~(Eqn!#8b$w%5 zZ{})CVXKRU_Eo=ln9jd!GsMmEXhGq&ueIP!{6+Xfp;db;SyK)vt^@sG=URz1w9Mk1 zfklNgOPH(+qa(0$G6vn;vcD)*8F=RBlo9NteNKwFo{m~7ia{C!)Cy^{tArigPhV^K z-=1XuF;6navxfe$rK}dy+6r}JXgN)0M5D%rg~?{S)PSzOQ!%%J`;1bRZ0=`n1Cmu1 zB=LxCBkU6#v1zFIUm3xFM1I~mp1GE+3~8(640|xvz@HVi9`l7m$SR7E^CT+!2#PGT zESsB;@U7_|ZqY|r8gao&eBxUqA{pwXZ20TSk0bf%48HR2M_3JU!Ov|4vF^oWwk+>O zts>^#2Di}f2_-1)_;-*hz4`Byrb+RBS7o zqUMCoBzO@$r?Umm%ldjevRaF&v0NWs!ZR>Dx|+zQW~5;83xtmK2}jNQZEhW*FYIy) zV`J!yV`Fm|4R_g`KuRoXam2K?y`dU@+`7F5++C%Es{ z3hbT1xuj#Od*waT^L&uQZP#mACuf=r0azFKITwQ`G0FJ4PjJWd&iZ094V%~iO*C6H ztp$>|eklEpLP4JKt$8X-OY$YXKtMz)Id|Fq-*IeViP7x&`b{NGF3CyvQ408_3hbIr zxq8y3)O&t}>Uc+?RH=@a^!uVN{`!?Z6r*KoOiB459wvhdyoiR%ZqZAT?6pdtezhf>e=1M|EluQqweQOF zd@T7$1*DxBgIXihA$col(%li;VR!n;tg80mgiLcjWpYfz_cWzIApsaz?Nr6vl}FQz zOFZiy8@`RUY5e_VBL{0A{JC-#Pd-z{FMkmKeJ5i9i6MB)75m(vUNx$ z*{v)}f(fiMaZ@ z`V2K`>ATwvMxO@FH3vQ~|2pWLa^Y2^rk)h(D z!gkkfRU11QvX8fwaVC#TZZbJuh@e0mnvNn6Hdb>~sl8|~?&DuLSlpM+J-nCyIKN#jG}&c1?8u~ZEqt|SJB05qr>vfWfro@dy__{u`C}* zvg#8WdaZiN-*-!kDM&-@-6R${;RtxxM66j>EIN^j%i#O8T{%VvmGPnTo+~l}Y4aK= z{LX-iUN0MvPPcC39eIv&PtiOb`g(<-sZ|_Lt7HM}A-1h$==dH~85fVSfX-?{h9=1P zRX5XVeRD{vx5Ak%B%kty!_C1<%g!vtcR!V|Pzs;XM>p$E2Pz|$;jWAm#j=aD2@^%h zV06>M60W#``6l{3k0yVso2M(Se;LP?Gms@hyRDL^YTQNWWUZz-}x^18rh3Tbu`udf7K@4+kaL9n_sb?Kd)ovkEHzO+tSZK)@ zO~Hbl@QWYvd#jQ-hRPN%T{J&Kxo2QeREqM&H;^Y?dtf?0M!W(;MVFZ|Pi>XyeYx4< zl(suTxN&CdN6l~06Y!%hWp75Mv zoPG8p%(kTM{fbJU|BvXA{YQKqmoI|gKHga@ANICK9R-L!8EmvkR+UAq#>*KPT$(Yr zdS%XxMX8TNb-~IjE`@h{Z`O;ev6a1z49DJc*_>;-W3TdTX_ZnHkqddm3Q)$d9KGkR8<$ZRfUg3WOEh;3tLd>Oa+eb4E}3*W}UJGFa^3BZUj)=xRu*Tu7esqp+Tvf=n|I_ zH+WP9O_iJ>()>`d_2~_3-+0PNI`LuVNJHg|qw~H%%OSe#>tgz6!{krKIJU!W0h{9; zNi2$3Kf6)2->g{!EW_7basP2-oaPfw+=s9o@*Q2DfNE^EbriE&d{ z>-;sTsFv|D#-D zz83m#(*H7n-v4<_^?xtA=@3u++ZxW*0y_lJSFc+6Cqv<0#KH^$=tA%fICRr+IlPY;f{g{MsOx zcm89az{us477D3hkKtbMY)nz^p*nyr!u8r6R0$Z0a!mA%2qA0W@g29l)y)ZkGfT}EQQcAds2IPt8*LJWVPL7&Ua4A%=T7* zlC}TFZ8wEJMCgmP;W}@#CEAl3as4_Bh^`J>8+B8NJ5|F}kO%MF(KWmX!hlVb(bd*_ zqOS!O?JM^>866#0-5T-xRi z`xs;IHDtxFbMr3RPsYy6`4KvvhrP{xtK1Pqvw;44YDW% z_QKe<4p&$a)4N%4INP&=uI8Ni3#kGv^rqI0GnVR0m!P{nG*=!B?rf8N=G!n@$*bmj zVcflP{|>XIc*mrSVM!95zrK4Ry`EIY4iHgaKNBHEhq_ms-#GcJ<<2jWqp5=Vlrhxw zgZ1r(-oQd}K{^|>6NsXPasquRT3k==0(@m5<}OXLC>M9Qk=d+wO{VfK9BW?s9wHg~ z7Q`V{o8t1kKz?|~!E9W;m&YZx1?-U5WPEk^VnV4bzkmv8I!YW)>S$5(Rh}A^DH&d& z-G)qwFt_kzt6d}n%d{x;;aBS z3cHukAZuLS;4>J|JwE#(F+x%L$02Z|V}%n&xsHN0EqMd^SUi$CD5+gB_uXenKmU+bTHQi; z&T;X-)(Q?s>pJ#oucCR(Tys_QQL5R>CRLEQpF8<_d{-4YoC{aiT%LdkGTeACr=Bi; ziW7F<2;3eNoyD*P1EMh&cy&ZP0vi!<+r6(EeV~;#si0DFQmnYzIxn^$&>}p~qcD>f z(-&hAt1pg^*_AEiFZ@A1-Mq#gK0$rc)f^s|srH2&-pX8MRnxC@M3l( z)Kihaip{sWl*pPU(_ejRo?dkYL zoenXqjZnWZ1BB7loq=7+1#Vw5?NaGnT;0B8aCs-NGa8*24~H8k04coIFF`#zke6c8 zcj;HZKGObypVuA7WVzhtGKvYIwYIb|5 zelHEzR?+@SS0Ch0D0KNpKIR<%q-15z&bMF<&^O{P#7|@{MD&-137t5R9fAZJphlElzCd5H59P>+3eo0TO98#jQdVy>+sE3O}UOeMv4RBo+qwhRA4)tj%*NHifpJ>za;c|r|wc?SMTgRPVxj&fQ2U0JZHuEZf`+631UvG2h7($ z1yPHi$xE0YQ%XZ1ZH~ma>C&hTsB?GPfG8U99c;DmeEF_QseeO_;^-%{9@px%XC?dn zr1AI$Vm!Ib7ARh0Y*iFJdMW8*4&Gzli7fG|O2kp8>2od=8 zMj4AOFX9?-A*vZX1QA@qJ4aBcLZ9K1lYrcWRfI#E!bMF+@=))1Jc%GH)R3ViAiu)Fl)U-6-^0=IzbV`cZ(7PCr{B>eMRsd`(~2yQY=It-kpY`PyCmN5R6`N!X(` z+6x{nD_Qfl&qd{)k>|yz5j+{#d70;5YZN^O#>$ULbved&vi5z3R@md%5YrM@oe#TN zkywAE;2m2P3mB><$M_W;wIkrkE?|O?dtbt$s7&O*(xOL=zlmd^EgrBiptW6RY`tNRX1-Bz+PlALB6}RZ6~|l3{q0F& zQ2Gs)@so z+kQsqu(Z6Fg)iMok44kOh1PPBP}~A}hLQMyqR!I;^AaNz;G##heYV~WQY?*5d4dq| zo6Hz`XwC)V>p^S&fV3uq=u6lXhG(1ICBtjV6ji^MCAg8tS90Zu6I|XtZ}6LCQW^Mn zy5ZeQdl^nceMcK>$qop8oQs_=zM?NNz=GyWQQheupt?U|I-fyeCT|X6=daY};C$VU zge095mYK0eX}4QEMNiOwfqSYKt~!DqzwN5TF)!!x6Nya|rWqmaJ7 zW?Z2V>|p}+3rECU?^B26vr(})vdXJOF?}(G6&#DbK)#Ayz2S@%+>sR>uEpVH;UL`` zA7fACM(61Bxkkr5LmLaVrT&aN*n}LhaEasIX+yd1U&Ny)X)ruE6jz0n+&}`f)dBWUTsA@V-ozE~1;{9Ufn1p%bUGdyBS4 zSR^{*3#G+255lySx2m_8d(5n}ezk!@JhV@3BXCp4`{kQ9;~YG0UrqQw*@JG<@j~bA zW#=u;u70f~Ts{w0K3Lfb%VcXJEB~Tg1S?;i&eC_UWUuj-2(Fc#TO22&&|{`Iw+E}6 z|CE$HT~@1 zGs*q!vruG+g!R$m#2=-|ttGxE=q5t5(^Her?yZK-?^ zf0&XPCG6SC8m91;M;=3mxy2@|KW>S2P%#WwjEB&!8Jb2*c;AQjSBe{h`ZX_PzwR^PNOl=gL!p+ai*^4^@@604}8>cnI_wx>hSVe?5xW(e=V-s`=sOgS{Vxam2_XBE8?oT320i z2ZOuvLwO^PuxjpCT9iqL!;=ly@{-$!;Hc2###v=|QlaZt0*Y|aFtOH{M~zr^_gwg3 zC1)L-sg-T()u6E5zdlY9f0MGLJL^?fA)W|BN%PH4HQ)L0CdR7I#qSY)xdBD3*g;=+ z#$VAF>$|9c-!^!b5x~Q$f?xg=*ry*ivf!rDo&eNPOFso>2LkF0;>rLvkGB4(|GBxz z+R|qqkjD$2J39u{tfAet1+FcYAJX}aS$SOHH+&_>KOMa8-kl$lVu;hw0|h^Mb{`=Y zx|7Da7RTMB|GAwV6!S++%--So{;6HIl3nd_{fNojgPFff`n^7{{rlH6E^B{2zxx-3 zfAgiIlUIZGem}VIZhtFu{O7s_?(E-BAR>A`ByRt)K=7gWzaRUBtqsSfBzS$d{!}~o z_k%wE!FyNMt|GUN_x*A3^zS*IZ2bA-*8e_ z2{I1-Yk<4 zVVs;sUE`Z%UKq#OrH(q?*VX;Pu~H@Y{T~ogoBwwqq~D!%-N7+ej8hF|jTz~}tF;55 z(B6s-Z*}M|Y4!9ENyRN5NdXG#?)76fO$L^S9c_1@uxa{-evB@JDYFDb;T3<3GaIjy z?IX(3-530Qbxo?qq`dZV8a1B58f70XW_7)>BC*J;BUk_E)2^;!PuI=v>|eBFsJW#I zxna?ES!R1;Qjf4ctQl)kCyfk!n70{5#PxDjUkw2E;t=e+XZrGT<% z&yKo+=mQ7Tj{2!}rs?Q@6Xi21-8;L#N-^pA2)$hTNAAMflCCU@yaccJLS6FHs3J zwX+>_e{QIqAQ2yo{ZWZO5)H#vYRO8}xN>Z1nc7XV8Y`|WmhdJGaC1G_WWua1*_h9*FKZ?%O3r;U5r_szR%?j;R zN4Fa;=9lSgbjBn;}1Kw%-3{s+{`~-nEdveV&R36kI@acW6I^aq~vJu+pELcSdoklKBnDQsb zquf=`C9;OP>q&(lEixj9-b9TdVO!-Zkgf>xQP(zSvD|zxV61p8&lm5ZHBR&gqrGFd zO!@F%X)%2FS>re8OFoe57XgR$7(-($X0x115^jFrvDyVL5lLfk==?z6_iGmY+rG(f zdd)^34bpDpXYr0xa+g*`=KG(s zvjbV?X_!xGby;YW`@fyaA?6X?{qdsHueso=2(K#Bp*4gbmpB~a`2H~$gwGRXm>)*qICSJW$9dr2 zD^q8M{XNt1YRy->`<8xltb_Fb32-~o_zj)SQ+IAIm3sqzh4q`5$=|>J**W!`O$mQS zI9>xg+lX&GG1-4kcx6Jbj!ht3T_E}g|7nq2)F@|M!DY!GzqVxTSK}-@Ea%#bs=4{q zNOQlMv+VOOp>ssmKmLUy$tU8gk$yGjf%;Pw75LJDulIrTS98Ag?qX}}e`mq`yM`Jx zt>*<$5Y0%pw$&lZV{%0g-vtK9XYk=}@~u0kURl0~O3UUu{WskG_sW0EWr4TRPiFjk zBe@RE%=&NF0L$qXim=rpLXrD2zP{AD8Q&1Wj*->6dkk#XMfypoMM|dn`;6+uvKthe zEWGZW?Acg{8T-f#(2TWpM@b5~QQeCG?;sDr9t9y756<=#ift518a3liXd5L)`F@tXXjCvE9qPW%_RSmN| z>>FCNQVMkNZ|$FT(b^QHwl99+NYO>|LV9;ae6FfgeT-R2P+>#tSG>gWbL66;dK@k! zxY~LR8)`ueL?^nMxk7F(U6_j33Pv=uRCFO+F&Oq5D4h*^@h~NFV&UZ2Nu8cfi<{<0 zzzpQDQqgc>cjWQE^T2+>4C4a#IeygTI-;0GE*LZBQ&IwXPb~Z{oetqh8Vw^GhV*W9 zYQ~(uTJkXb!W>Rd>b-D`4$S6J;dZ_D_W7NhEsp!Gpr~BI7|4KB#9!Dfd+{ezRWr%u zLpKs9R~Ch_(EysGQrufIG1l%`n&k4(Ha4q)?(=aL{35cbSl9Q#rmj>}L7ZuOWbuT{ zp2VT(5!s8unO7Iwv6|IA?h^>@GF}}IF|QKtemEB0@R>{Chn|X0G#L@QXZp(h_wjfg zv-vRpcR}v`Ju}v@w}sz5delwD*mn@c%ElAMf(nsK*nG|{nQ3dSq$Rc&B!Em8fPdG0 z&VdA~n_>Xb{DXl4H!?qSM*rnOdJ_HQh->4vbg+;0%N>gHbjF{(+&@3HJ@wa;3@5i1 zf0Ih$_@3QL|4*;~1*|t#s@Uh*oxjiB=x=TGCgN>7?^)?(?ZL7ntGpsZH;5dVfVZCjSYdLuac2WEF zB+Y6&gzn&YtrdRrhoLc5CT!b9TSm1S1wf$slwLY1)w^lPwSZuFH=zQn^jAB5H%f%g)OCQ&@PU~8_ zQQ==WI{PW=BDDv8n`F`p)mnftK z!YRynHAy$U`|cNKp`Y^Gfn$MfB!{-jBA!65)_9&X5J7QA5Am@t95P=xPI@~z*!$w8 zkoK{bzudKjb)0c-Go+<2O+Ywl3-&DS3w80GpR&GiJRf!gl-61lk<$3esl;QD_}eXZ zBe5t2c4uu2MFKSM`ab_VTXVodi<>6BHBa-#vK*?eSsKY>UN&YjAtPo*tab*3lkDwJ zAbjEIZS?K(++*HUiH^~IY&D1HY=t&^7AML;G(pKWq zSg(vyqLH^(Q6Om_XS#th=!0$zZsf2}O_s;6_@1*0wi_Dl+}Os)t@TGA}3&6QkWGQh+p>u{sG8siNW! zX(>E#o2o|%a#CM7E>q5Kn-Jgbp35w|p~Id*dsvS_qcOAWm`i2w{j5Gui_2|iiPZ=X zCF{r!(lMQk7qSS`n{>#9q9WYU6Jjdhgkc*w=<7*~_Dxykt{a|qh=&bDxKZB3@djcn zWUuh<*Ad@8@2ha>^It2#<>)=}mZe{~pb`c(mqb)Ni&>+d06G*bY#2adu(^R1Oplw< z1x58m!NGONy0CWbl+*dTw{wB>3L9J@Q;6f-2K&# zX8Pd(FxI!u@8siPdBvqTcZU0v7k7UCXOpDUtf&<~m1CRuomJm8fxqlo*w97)%qIVW zNFDFUnk&~VXqCA-u5fLux{0XuXDM&p(e#zB7#|VpM1L#Kw``K0`mPw+)t0L!G5)Mh z(YI`5uC9(`wRzw5kSY7KJjUO$F?ldnp%wdoakUk~&nFh#OqHUIA>50e7TpSXN;H*? z?`&<*hyc3eCRQ5%H5$?99TC5P%b)khiF5N4#a~MPFL*EN;qioG78^;Wm?SX8;egXbjNnm+tvd7}Mr0{Jz;B&?|YyIn+f^Xkf zx{CDQhW%Ur@~wsbFSwr-RWRP+0$ozvp{}l|+OB>Ve=#YxPGS#mV>u7e#YJ0&w6$?z zE@R~E@gATulsb>kR2gqh;O9P@H=6-O4AruyKz5quL38m4Ya{W0%xEfl=O3hCmF<`K zzm@V}^E$Zx-Qv@SB_JP9L6LkAig-y@|~6Mp4C`gg6ka$~b`%6KMTV3ywKi2L6#U>wah}m=QM`|VvbFxr#>EiDDCpH)-_VEq zyygnJ@$F+NHWrhgTI>dY<+3@rEpwnJEq&U$<7@cAxq>mz{nF1*{K|(sh!#ShwH)-` z;xkY4=l1ta7qb<0k4(GVW$(@x(SAM*V}PO7$bWOE^Qi9#d3P+kI8kR+Wrco>FAB^OYy8%s|3x5WkH;74~HA;4lg9DYK8@4 zfqA$JN}pX`L1ubskOhTz{M`f?iWH3=?N_#ywfEP!t43O_9G1sm;IL#$vSwYeL|;F^ zxZ&6SQn0qz(AT=0D!britLfC{Va(pp_vkRAq9%|Un#MMe*%c4q(yI>{vnzr*>47=U zDY=dS`n#$?V&7$fn{airikoz=!nWE*XO*P_hUFsaE%@AJa567DWaA6R+VQ);pZ{Ov z)^a(6y0Xu&)0WGxu@Ri3q2W?u(LYI7oO4e!%{<0 zMNvd@)W*+;E6VP^zo^**3V(t0CDPxSTwlx>26|k9fbI$_8GgZj8b$wocrQ7*R*9=#W0bH3N!_mT6ya>F51yS zXaua^hY@M(*zZT?o?Ul!LumD&p~+S>G2x{QHMaEg<($;Ny#1d>+W$#c*@ToJV;4yA z@dCBe{GRU}{+OVr(-IViKAS=IT8Q8=6z-l3*Spy_Z5Izc;5c~khHR{tmg|}48f{jM zwx~p<$2jgRNqfMNA$BY}Xb{GzmUk2@%0B*=DL9WY016i@AmR&(JI{HYW|KSC#p5lz z$o1TFGK4h1z4!z%g=pFgl6}_ZjA4+~tR6)jj?lRgIb&Zs5w(g90HKzC4!z1Y4ynJ| zqKx>aX!A?MgW17%8&*!)|6l599XDOxCs)nb%oQ`gEr(uB{U%o-ruw_2O#xfd=I7r{ z`LF-}lisQ{fq(m`PX0%qY3EEClD5F`1HPXRT>W@d(u~iOSr9vbAt;MR#HFZIK-rWs z!RWSf{8C{x4u>bOA+K^R(~iAY;X1l-B#%1mKrBVw*i`2176gutzoEDyYM4{E@8sH3 zQedc9x{EY?{e`2&9AkrND3ik9f4wcbbIC8b$9;2wty*5@tifwdcf^!X#bLztM8TO)^ z!TvG0KDKGnO_@zVayz5XSE*%LC)NN6?u{u5nT7C&4Fto6}3ym$OP-=pNn4_Si6OxFhm00dyr#~d6Qer4m^2i(&5LQ98wrfuVIgRsnW##-PPj^l|v z(9+5YHzgauVDKO$ZtxT8en`z1j<~Llzg;8!J9c%~*}a_Zf4`=9olBNwzE=7vLR$aO z49MWrQk(OR$tBk9nN@5Oi$R@P#Y>7PE5q)a4783Ezlo{P7h=0mS+FV7zVScwt{SfN zvOGYiy)(JOM*+evBL>HdONJjr)Zp9{&vdL-(8tPPF7>SW7P-i_)`ldQweEL@?xy=a z4=k%MJI-Imm_CW8_~}?W zny!7NwScVK+}wEC)@xWV6WPCnloUD^k+I_$kx^ebj2Eo zQ)q-jsh!;bHjKTZH2j`9m$e((0!RarFwMh5gVda*3ME@RW*w0jYlIoS3TlYfzuv7E zYFoz8+*U0s@F1^o;d%e2fLE8CgDd<@|5Rw z`w4(}69WKcgYZEt7;)q3*J^%;c6l8*@A%Q`1Vi1vny$oCPbyJ>oIlsvjY_F;da`=G zq0-~^tGb>U8?VT~w67{jHeYpazgzhIME{y6{-Rs4w`YR?sYaI!q(s7blc6&@yRAF@ z*K(iC>KbiWj@~e2!g%3#&mG|_?@-<}zB#Nf1n>1CdWlH`pxSlJwbR?mE$$AD6%1~R z>wOl~<8rjTQo5=#36iseURIeF#94rak)(TlaPa)iIj-2q0oSh z+1i>rd8dIp5rVvp!n3r>hT1HR5QfHv#(A+pa2}c}fwT|NfhzZW^1E>+ve2jiuF~^l zOi?Xa-tn68ePUDJt%Sx}SqW5&SkisRXYj!E<>6UlS+a7XByWK} zd6OiiqdUQXzsYDwD449~OjnRKaI3Xrbfyo%O2a|uZ5g~NS7CKNjct-d{%CxC~ndu@xO=HGD@#0Ha~z#myXYkuik@$})77D%V4g~|a6f}o+@J1s4nNErofcUSB=oh%G%>`rNM z8{OUu=R|WcYtDD1KPy@yrUl>cfa=10yfiVNGK|%{7IVN98R=i-N9)md=G7T0D*Bg9 z^D>Qq=#C9uOM|A-_m2Xx@G9O0qsI-FuPyem1Rq7Xk%dLc>aHwYAe`n>X7?6$nKY-RAWf+kjAeO}gA*zVE_QiY4vA0OV|2X4Q*jii zw+JV}UI){NTK))V#GDezZwy&CjNE zOQ5{U7Y-|!u0EF?Ao;W@!J~ag(S%NqjI0mtWRC>q6nEa$?8#CJ_R0>vaF8@>B?*P% zV=FshwWb4>BF^@7&%s+IJ|*ZxJ;DwsWR95OqYDwtK+3_MoF3i)w4FyB6=CGwfZyJW z=xkfa5MUA6vo2CwdA4YEH4G55eQjKpWpF1+p+dsIq@pf|v?nWo5h=hgL_a@JiE<;B zGJOwUh9zGd80^q2z^i4<>8?S+^J2~{1l3M;Y*Z#UkM3UEG)AiKatpVj;;WQ9;M9V_ zlKZ3L=4W^7D!*{No2;K@R8I`}%_>=R>1Mm8a0*Km%mY$pk8~4riLO1ivUc9-v_z@; zQe8S|rO@Hd4%)=Z$aQyYcB#Yj*%R0rKhe zXvxTI3-y-10i^S$3ro`O?3}uWL_7hT1ou0_uom`#zwY+892G3wcC4{H2=W_AJXJC5 zwnPml;4uZkWen8t@NN16IT-`<(gN@v3?a3}Ctu~qj|KMmsRE^&C!;N_Zj1l#w=0&JcDrwtpk-cap*~otp6VoA-!6u1o zf&u<9N*@fZ_8q@)+-xYZS{;5AA^38Mj4=&z1lkje6Qmo~)9Tjr^vGajXPf7T0|}{3 z>;$iEFm<&GO}7%bWllbVqL<k$%UoZ+~d#YXDv5-3(frnUQ7ixwI6 z%KJRnCtBJ3#P*^xA?*$kuFIaaz}4bQ^9J}eU2l8eE%XbvH(Q&C^CjVe`50@NfuIm< zI7seR0?b&ivg_nv`NClMT4pvIrqsv#)M3oDb?pNN_x8q7MIH7I3<~~GwI;rF6}b5c zUG_>(QMnMw#_RUHo!`(@eSE0chvQ$X3-xV+26+wB)n$j9T65z5dj0i$w{hi#G2z?j zvqSx*DCfxRGv{A_9n^eF|4CF~&GpawxY;+AA902&gXtwUEk2Vz1B8F@S>e!S8B9nN zvFYVw4sYvUFHXWDRF9|4i{}T_i$}K>oFe zt$(YZ3hmmy+W00V!yqMKnDe9iyS9`4K01LEKg?uuHYd%?Q57)Wv%lL&Dl;`W5G0CGC%ln0Q`q@u)&{~#@$%TxA@K>|m)sPdJ6fG7R z3Nu}q-Z#=eLIIqC5-(nOQs$jn9hm{k1X;?0{XJofOXoed`c%5S$mBL^Fx7ED{QBYX>TXXxnHg zeD-5J9D6*CB8OkhybBmon*d>NB619&lDe{K^-rcg-tOHNfZjtzMj*Ki@Y|Em~y^&O_563;7Zjt z!!xxOjLwe$5S;CB35QRUIt%VmP$zM3%wpWQ8VO`eu&yL*s9$e3QI7%w4}qa^il>hy z$4uBZG3}l~2Te^{ch!qU>}B~f1i*fXa=qfT0-^f^@iT##g$HAuR%a${`YCmA$roViOB%0v%|-rt+d(Q^S%Oc<8NvQP1__G z-(MKce5@BuTvzv3$RzjKS>I5eui1E z=rcoG(mwK^cNNxl@aPRuQCXzdXwSYR1@X3qxW~z4j9*w<-HJ`CRA0bX_yuUN_oRWa&D1EYI`WVua%{-5V4WKtl;Z% zPn@qkl8TF>Yk9a881%b{Lv+TYI*Iiea5hWfhn>Yzdht?NX_>{XUvn(QbePFeEbh?Y ztXcL@XR(aSU`3&JM4lm@+wj&8Ul)dKMLhu)Ul7rNRdf-7>S|&;{p!c#Y#iNq&N*sW zhX}jc7G#f+ZQ?A6%S6vtvFgRSBz?-tq|StqZ{!vPm@OJv9{^D?j2ca=zTL5CbWxs2 z<+cc&%ik59?OJPK)Ul-?RSKO1+&23to%;=Y9Tp>-oc<}G+^|7?gTh)@Z*^WBFHk9? zf|%{9QArYH_L}Q@RgVwL_E??HD-KWVi!$bEC(e6`2M>6zI1`*&$CPyR7kfl`udMYM z+VXZ>uBCN|&*;qnxE$Xn`*?8iXp7gm#4p#JTtV&1xu6SS?)5x=nQhlC&(@i`u3zYM ztFZ)35b!jzioplDZQ2HN8EDRpFF4+NwOn%u7A8Wv9v5fv0O_i)w+y1ZL5LM#MK&O zU}&=*UZh%atJ7n11uWv(SQWYf%zwo>D!y6w``i-Qt8Fb&2R2o9Pi>Ph>Z&(t z>6)(O7R55n-z;^N$T3Np)r(o=Vaf$t(H^c(Xwr zdL(|0=!->v{@!N$);X!4inBwSX60?$l}J+kD?F}y%TN%p0SUIeCO+#eKD8#?8`UC! z#7sAx5lso&JF7yvvzpW9>HE{3spP5hE?JkUL>MD9XMsi}6e?u+6PAhQc4@FQDSaaV zTYo@ER@@w@0NUz0etwfGG00MMsxR#QoCzPPJQ;Qx8e^*68Oi8p^bh{Vn z)ob1gS5$pxC}+Q{rC4M1g(J4L*OiKw4RZ*Qd@S#PD^RH!7CDC!Iu&)`*gg*|Jk3cr zTCzFY*i+hD$}H^@t1w@7{V`fkAQI!7Q z>V(SKEk#@kA5`Et7RFx6i|?XskFLkeZmD-p>nkiXoElYAU(X-D^T$x)P`Yb@Zc&$S z{N>0@-qC_KqHj9*jPxf#1H5Yl8Jzp!W5~4lw`jPY4#kvl_YSyk1N~ykj6^QQH>@Y&=Mtv>2gQ=mjK|c*_)PRBoGO+)}!^4Ax(ET%ensWl!;- z)wq$ty$5excTtw|aixpFNnWI`^b zz!kD@Bq=8!j*GK!Sa2o@r5CJapPx2=1M)_^c{b}{n6%XDHV&*kRmQ`EIq|O z{Wj2I|93q5@z8Mp2pOP)H?ki8@xdl^(8GPpg$H2K!=~>{6)$jHQJcIZr>IdkTD z-?O=r1Y0R8#6aO}9Tf3oAt}5%Zf+sE*&4Q*^3l5c$Bs>z${?uhvr!=Ftvx8g(rFhU zk8+NM>n_FD^I!!9B@a5B8((XueD=sC=UD?gi|{*zZEf)(m)?h?Jz7+PZRD_^o-+Qr zbnq{w;H5~@V4(SKSFj&OhpFbb^+1AGlq6BuRF;MP~=}Rz}L)zo@)ve}hu|Q(e zyD%Q!ihVL7pjnLAySi})Nt4Atib+r3AgE&2+(`uDx|ehI8UE*ATj2i?_WXBFE~XkK ziJY~}(zPfG{1nT!b5*FUwf@#!F*j9PqHWQWRFi(lo+eyGnV5OzthrG244vnP)t}Er zma}VmsEFf4344JLlmYLp^~%u(Ld(Jy2os zDP;<0K%N(|{|xBFm7pjHKOH3EVJgSDw0iTi1TjZHj$>yyIF3E#xYR|~!dq^l zV;F1^3S&dFSHmoy$)Gz8>ii(xT^aU11rjq=5Ps^_DCYvM-q>GM8tL+Ed_90G2(#N2 zyL9tITCMPHcbeWSwhA{}zk)-`gN}E>*}nb*zx}mQ{>Al{(szc8!j_bJG z{aQXlH}R7>y%mK_Qr`by@4e%i%J#MKsH2XfsECMCWCQ^XZImV;paTH`140r)OHeuq zMIfOgiX&14q)Q;EK}dtp1B7Bhx|9f^_f9AR(nP>F&OM`ZX2yHY=l<^RzVG?mlRuKR z*IsMwoxRrnuJ(PNCw8BJs6!?>;+OcPVzNIxx12lxJ9RTM%B0oKWb>|K1NyxAjD?C& zMJ%D{;ewV95J;g`sy9qgDNplm%OSF^Cp}o5b}0TRQ)rsP-BJqCX6PD^d3u{i5Wj2l zhjnhq+FS`&1o4PQk~+?DXQMc)&?0}Dvif$P?&J@+HL4JWPk@_F53o&7j-hQ6_{*|k zFfA<@Qvs&Q1Xw?uZIOFp6z3u}TQ7W)nh#|Ym2v#HKMnxwYN}`SG1gC4TE_|Op9tb!46wRk7>6yzF6ahS zi!1WI*%lpHuY4hM>DMd=-n;d6^aaS=ZM!Zncd>U(p;&nTljSY|!5dof{%#UhfA9jp zV}QexvsaoOSGmV7SH@v6CnoM4(s5sd!^fQyLHr+1sIN@iP9^>v`O^fPVmALfe?gg7 zo&olani$Rw(-axl?VSS$NiKVcv{yj3e~?Lj1jo<^GcH_+Z}y#9y{IV0eUHOA_Y}GB z;NQ*&$^Ar|c6qL+DK*>QlfS$03gAHS)7NMIc%c#1)XdT-lxRw~Kw2gD0OSYmZ!9nV~_#U{7*##{;L3}*5|iIN`0g% ztz$pRPt5QwB9!{&Nzb>3e~nA_+Epl}eSc3a8Mw4RK;b8g>Cr@`dO}{kfRWKHdE*>m zo^xQl27z^yg&5ELQ=?ApD=2vW?`Hkq-mJf6K8*fi1_DNS#f3DYv!X7>_DxpqEh5D( z!c1tP#Z5~kIjwZ1e3;2tYyg;b1bGDxZG1ScJr?K zN=PDyMPXty@Y>|f9=jKS)_efqh_W}bOl`5e^1ia=mGOSR*|nOb4Z$JQZ;kW!-I={p z{>f6s=+W_yp^;L*CHP0b|5IGGC$?XdKCY?MHmvY{!Z+P^(9SPo6QdZk>(-6d?oF-_ z54T^Q7OvHFSWud{{I`e~|J#l^Xq|x!Zq+&u0C!2Ws`6lP@5S!Mk-glL4yp?l4k^k3 z9EK^GwEvIV@PFAJ{;P)V<>vC|Dzw$eb%h5BaXo%9n7sGbI@J6K_+NT_XquZ_UW<9~ z(qYxV)1!aW_V)`BaABy-!oT`k4mc+rXLq1h(c7-D-`V#fwlJ?Ezle^yF9NKalsM{k z@`rogS5>`Vd@y{-4muS?YVSYJ(lR6X_}RPOp1$w8E_`-L$Z$;Pr@6sh4860f*v093(FBZA9v*rx#rNc2?4C`;RI&dMo!f1l)&w z*!y>v_GGIne1Gtf*SkAQk59F4Uv4|tzn~5oQ+Zrx#a0m9`1eKsuRh+URZr;0%%J3c zv&$aO(n-OCf-VZaeXLc6lBE_yD`rsI;UydvPn& zQ!~_uE-b$cd~TQWL1^{lt=Gy=UthF1gxg)RcRag77k+!LleggsDJGGzreGgtXHpYw zoqigoHJmxq^_-u*mwoNZoQ}j*2m9j2IeAiSwf3a(^J2-kE1d={3@CCjVgnC!TmZ+z zCrSe`Z=&dku0*)<{FKX3M;*+E7KGvN5=xjPi>8nZP9IwAQ`GJw& zGj}J+GbcO>ZI4k@#yS>v3 zWMtF>+`-V4^3q(B9*4jx1T(6AEI)1LS(tDSZ1iqil4#wMbo-_B+Q=Y9=G#y8n}yR|Ox{;lIeh z_i8^WQV{d(w_sF9=26m9=LAV%Fa5;>l_;7g3?hwmZR*j|*Pgp~9(Rm;;=KYFA$T+S zMs~UFO^&p3DV63BZ`o4pV3p*QMZJNR8%7Y0)H*LOUpNrRBLMH7QM~8+BqMNy&YCep z0Cn|Q8qhWn2W`vPI~@6J2zxw=b*|6gv3MD@tzXEXv-tzBkg!&=4T75w#JrHQDwKb^ zyQ0GqCosOWyRxN=GnTO=5yQrJf&38@{*qd}>`r2>Kv zi@4#wbx~051*FO_TDn-;rBnCSaxu!RNwl)HyHQu^^ z2qU{G<;|th#+fs`4}_-F12#C{%6Y@xyfW|yz3&p&C!!MR@`;L9L!(i$H#q*;R_wj`H*-*` zSj&|DY@bJ;0F-E8xpmovDf&KQCW%6FK18{H_o)MLsv;881|5CB?xA2u<*{4CznZ`eLo zks$NYavTgR563OJ8-Tgb%_ta{vG2d31^%#NX8rn%(7eb!7%#RH%gdwX&ta#AA^Lp+ zZfp$m@+yEpmu?~I6%|siM`x7H_MTz%Q7j}aq@{BDVW?FYuQ#&a*9a1GOLRF(RpAw( z`m!`TIlfrp6^nE)Y5>jIlMs=$Q`p7aV^qWyrITjsT&60F^~ZV= z8^6n;&qi>=q=4XGA;{Sv%3)&0hP%cJ5X8~20$9_AYRB6cw`KYMDay9Ny-bGNOciH4 zHGlUD4tv|9D!k2`3L^^{`J=|A#=JB%|8$J9Wjh)_j~%8=b7U&uEH(MUkB92UgLSGU zO;WJ49z~E(069L9C;SgJfNiYy98y2ZBoj-T%0Y(b%WPK&1vSx#7WM*1DUA#J?LjBe zz62W8CiMY2!L(WjC?PcG54csZcl?d8@|#tcBA=fEpIG9(=q8dJXF|EP)TWiSBMLL~ z2^2CT+k=LWRMjB8__q7{fkDR=V+*-W8TQ8h1cZ>h(w?hqer4b>1^*k`><6GW1m6Ut z;CH=dBshMg>6{}fXAf>->05oWvE|0Ye|O59k zZ~tx5a-hvt&BH~wwsDP{-|Y8`x_>#T`HRT^{>9F}xX8Doc8&jW1*@%je-?Bv(|3A2Qe_(hD~3@Rf~1;wC^$ZXs+0A|6b@CmJ~=m`_WD+9He z*&dQGb+KKGbf%nNR-?6rMlDH@9nsY6)z>f{7wKKD={VnlN@Q z6S7QX-6-hpha6#EV^U-Nf)=dOc`5DMMf?n)$O7VRflEO>jBQ@+fN%Ip}MjJRPx*xdFL8%uI z@enU-l;rQYxz4KdH#2BDv*hx~XhaEkU*v6DwIJ507=#{0i70dX?FGNeN;rjtBlu^`Qb^oK-$Sd|l5ri3bSu-WWFz=C zu6>as+4+NXyoKU@t9*WbLBAAkY%B#o$MIOw7r8 z>KYF@-IOqAU0dE+ig>Aj;8g(gA))OpPF}lX%sJjK$LCvTNQ>-@w|Yud<>ROv2D5HV zo3aYyR+we)eoXG&Tj~4>a4@T2OyQ_!DT_wB<7AJCL<`o46!$C0kFXFt^vq1K^Sc8@ zLq64Nv2SWI;xe20&m$&djJT2Gb5k5wI*x=w#;&FN6b_|=aTj01wGHFP)HiXCWg>C1 zJ+2yw=jR)sMU1`Da!&@Q@CT7$EEEo1UzeHm5Yh?jMxUMIHDY$^^XCJ@PE^Jy`?$HX zann8RhpKOp9E^GulODdj3$_pdp5>O!%0MlP6DlYibdEybz!(@ov@>L-@ZJ}?Z{K12 z`eeOyR2VN34|(oj16s-xu;08cy zZ8)tW`$E_18=9(8R%zSIAibI0`u(TnjW3a=_>ezD4(69LA}sJ_@G;V;mk&1PN7_n)P*LwxBgX>x7jx$l~Oxg)gs4cIhCjk$4oS_ z-Rh-o>hh*IvN~3;l(o2sp1w!(!l6jrJjPWH1H?D}$1C&KFjPuKU(a@UC(Nm&TcI<^ z0OnPWMffc4GI%-HQh1|7A4Btetgmy_z_S!)L`u~KlU>AX@4{Ol16iE{4-$+jX0c*& zV%ndFklv{{58Sz`N1a$OYOVFap-+Irrfwc)d*jkKCu&2G)8{YR2hX`?;$jmi>Y;V^ z*5_t9Dp^2+?26j0d%_h36Ph2jw7}flJcYNl=FCTbsg73fEd(~4$!3L7G*wwAw^#;J z+8?uxFe3wJY&(M>@zD4JOFBBy(xpI;g*$^+Tt1(P%OkA80a?dc>8uBD9PN<{A!#a z2m0LDpH9}h7Yyz5E8;#r){j&vvZ$6Hrg$}>Z3WI2I5&r9NH6KbZ&I{$*%NKPM#}u5 zsgdot9+Q_-`IZsA#}vFswQkK`AK7PD`aP3^%e0_SFI*;x-1wSHLg|gvBXCOh)!4kk z!U$1o)I2qHP4-5%fn*hIxC?}QIb|v4y!Gp5C|$ykIDK>)Olg z0pbtgAFCCRzR8vz$DKM&KqAk>z07I;siX*^jpi~hmzdh_qetW2&+|JTkEs^m(as}% zMr{@Dn!jb(&9_bSJQSbvv0cOT#K}|nC*0?92jsA2`9AXpN#5BiJB!SimQn2Dl4+tN zm+>f<0%-SDh1tmE=*XtzeDQ1(pnK;C2c4%rK`N93TA*P48?cNSnBTbu)>tQq^9RDk z%X-T(0~*dQ=%b8@uJ{f~@Hjn`jn9Dg??XQo^bGelci^6=>t2;dY zBlAB&F!PsJ`DWyQmC*1n3;a(gIQ}yIHzId_^#GF$6D-R?q^%EFX{K^r`dj)vzu#?X zQq=4eXKn^OcjwNy{fz?u7`WaN>6$`!p%rmdNqXWt2PL;KqnaG5#6v2b3qhBz;%}w3%PG-ZI8M|8C?_=1-S(C zF;7^IO9MB8iG6YM@ z!yH$fje(LWj5Vc%3qeW7cP{}rRCV&7{p%bnGC1EmVp(HJA%5vjd8?fbi4GP=uo=UQ z9H!3_`V&CB5WvM(2-rbby$v`t0X9~WJv#Ix=u++0)o!)PvsLpj-`%gw*`YIj0>UC9 zk`^VbwqOZ6XxFdL zj?`1m3l-+s@N@MPnFx-sTJzuVkYDoy0ROom*hY@oSWe1BqEOVu9b3B&y0#S@7+A9c z73>G?>?QT()q9pmCPaJNc!IPH20xTI)mK@~zmJ`BJ46g@Saix8nEUA?IX2EuIfmh} zL=h3$G}z_3_s(5Ali3#jj0$tXabk)|X*5`vr;TD0M}PeOB_udTdAmahRVVOZxP!A3 zDH^Bqy4FcZ4E(4Bp31|)g;5y2A5bC_m7!2%? zHAOkE)W~0-z|l0Kij~_Pw`(r=F(;9cDH%6x%MnINKXQS^!>Kp;MQo12LDpG!E0xdlCT2U3nKI^p<4CcWwPo6qEo~YwQ9hmB&P>BbD zlqdebuY=Fwf6*x>R%VcauKbzf6L6bPf`f*(dl4< zqW*zM6SZitIfo_@`cn&s*uzvQnqPH3U9lI>kqaL*Lb#Kna8da14|Xvav^hRu7ob~6 zlH(EqJ!uivi_f53skm9kf@|Nj>1ls=I)$+`)ebD69`t@R`KG8E0=ItkG#YMV+{CYY zZH^lr(=dkc;jkx(04eU`ib9g_5&3rAZ;UEcxYW=)b3VivWxJ9aB1#3|8{}#=SDm6j zl2tbM7;lG^R|CV))l{Tt;&@gDRdr1iW)%C zQn`7(<2LK?_s*ypzNZU?b`jYrf{;?odPdy+&BLmS(WiQWeQuqpiIXTggoXLuQQA}L z>`VSR!Lbo?dW>pd8X(Z^Co4rA{OEz=F+Ryk4Ii?L)Pkj*u8=@NUB7oJ{B8n7%OJzZ z*RZvAd@gr1G0RHf1$la23CNgs<<^zRK?|$T95E4RD8s#BAC@62J3S;mVlxRJMoqI0!WND6QV5)TC`;3URA$Uh$)vR8C|x;np0;Vg z#(6!GZV5@wCM(;5uGxqW$G12{hvNevlf^OS#9g|H0}KN_*0*zaBpit)9EmmXE&w`m+u|ip`{j`-^UGH*O!utGe29PN5_h&vay8Pfd-a?p zz1WgJnnJa95;@n~P)3_|>?rkd3GJflNV@H#KMK8xuy&niIjMMA3m_4Rsb1VS;M6?;l>RLj4R3B8DSXDlCpxAQJ}enu@Obj`vdQ1j-Jql zCn38wRxmNlYtXF2HBB&qm(<4YxkV;c;)GLi*B0!;_-;C#k}X0+K44Rl3`K2C?GY@` z1ejVw5oUe+Cuy(#cw}bdxy}8&*?K>G%*U9AXJ4p2MhT6yigssLjE&$Pvyjbhj}SDA zj1%MV-HDa?*>w$me!gM}&12d{6bg0g@Bv7BP=`=&&HgnPrMr7M9l(9B#o(=8 z@X+r&xv}ZqGdGTcd{2Fq-&**baBnj~9=FdL#yrV#tyosSZ#?Io zQP_)e<=f}SD<*eL*Om##lB?mjg>g3{wmNSpNoL;{&+A}y+2dJ1bs81;!h@B36_}Lp zNLLaCC&OWawC&m66*HsHyNXk4=I-#>SM|SV7Zhy2YZDr&dl7>r5 zOVeeFYN2_wXL1fM#`wj}sjiQYie(#wc`{6tg;Yx|YZj5KIq;b+RUP%ra7NjDlPq0t zdJv|sdu>C{DV0H}nUE+k4C4z&cX>#N2)P-v`spR_O29o@;qNp}K8S{~!z!EPJ>>Ek zlCb_sk+r))7cVTT9`%*#-Y<=*_f6myf|bs%i{m!+iMx?4yZS^Sj)@K~+&8=YF0LuQ zj#XPIzNM%dmE}PcA&3Cin97&(&sjm|bv$aEyH;E%nWlmX(@g$asAjF>?$_Nn0IGt7aZ zZ_V$4m_k$-Okt!P!&Kt*z2XJt`v+>=j;XSU;-!{ZyjXBXRwjqgj)U{2k;*T)rY8l9 zhqsS+-oJ41!@(XmC3GZG=VpOTJ46b)Os_x2_Z-GjV)4P&fVj;7+(|x)=CPs?x}=~x z!ZpErADdOz!|oP0_@#sPK86O<8p#3&Z9Z{SCs{;J3TM++#Si4 zY~G&6ucZFe2n$M{q6M97a03zou7v2Y1D_^N=4OoqCu7nmes!W&AMsaT8-BQ^zHX*NaU1<}f_6WTJQ zp>T<1-BU=!n4iQ+fyVl6m_f@A8phdBo>{{8BAzDZe&iIO1Q1x}%N;~`I_^gsLocA! z1O%8sVrlVH?RHkO~mO#vR|H(xtT#quPQ7P}(>|)aX6tN>^?*fl{i}mo^Q@ zs;Y=T^YoJTh-EUzoAVXNWUO^7X7FcwWpGnj2C9q&c1Ul5!v zSOpIj9oSsX4TE8k98@Vw%?}*+_S!WDdL9wiv3!R0zEP~fM1h+JhCDcC@MDlVF`#)o zaRi$;_-v|Ez)mN7j09~Xh-8weiwjUu>G|g_(T?8h#viThtEKWWdup{R4w_j}W8^(h zxQ|Id%1jkjev}fZcBM(zy{{-w876G<8l8ZJv7(p;Yh*9S(Z?#qR2J$wLvkSe@i<4z zGDT-`Y3sFi;_uguUi>Y=Km7R%HD$=3S2FfL{I#H6UqJ#~2fh*n z0nXrAvH?Tm{l;s}006fF^b(*+TGfJB*84Pvexno*6Re{OGFx9~`-yPo)J%UzqFd(G zidXjAh7l`Q$MG>u26KS*j-QK;VhXZ9f+7cvUypPN1x%6gj$|H&BTFX7W3nv9CavkEmB1!pcWMvip)RJGdrqU+JBZg zwGu1_wVv+MF7>vk$`3VPu1_ktI#|DWi!>c4do%fY+{l(uqL*A7qkuox;#|tbV`W08 zG4a=kr8deie;JP)K4pJk`PEmS0QqQ^qNiE>b+hwkz?qmpPr=;NSqMxgX9XF`QeZ;v zUr+y9V4FB{ST0DSdL#Yw4SU})%d7X01ikcp5bWQyK{y?imTjY5tsTnv1h~h~5z)QL z!i*UR;R7FN>?~sr!4JSCEAwYS@+XUkm}}3_-&rtRXBytIDS;cdjeX*7W9!eMm@ogL zQT4=h|Hv%W;eeE1y&a8H9v2bhRP5Tyc&eN%vZj*^f5mOBFg)i|V7iRv@RY#58sGWwJ#)B)D{& z|Dr0@I;9uY9QrO+DGG-S0$1I1eP87(OTmF*<5A>%?YOG*3Ox$mg5i-K z5_X4~`2igk6AIpiAN87sR<;D&@qArf_|^?k-jp7UZ6_Gp2E7PQ91wf?)4CM0{k`Az zJ*ikskhOILV!RVP5H)YG{_8Vij|c#1cNOd{QpOHd4h-9mtIs+K8ad)b(ji)41?2ak zxKen6!2pYn+z!jlzsloT~C_!}`Bj>oJ!LoP$@cRri=c zXI8#5r%Eqe>N@3LIK&Y%R4Nar2J4ijB$r4_VOh10Ue{Yrs`=Cwc!7# zs6(&>X(4R7;IlB8+k5zFOiTgA-x4QNfmbTVtT)9S%BzYTS#4BP5jh{br-tFq>haI` zu<}!YO7EV z8%;+Tr-^n)jHP8p-cc6U%$K|jM^OR_cjZXMeN!}^9=FvsG}z*YC2_{o*gFm!LqhG# z8?ExCN!#HcEYByEIJc?QpWTXTELbKNR6x=-b+ziOL?mv&vJHf`!2B0gT87;Kh8NjvoAaYcP;Z6_RT)Kt@F1*BTe;Xs9>r5~M~E!bIM z?JfZi&>UJR3SpkYroJ>%fXv+JLn?$le@gRmmK>iB_UvL%XSYZ4&UOz`tg?qmamrc zu1$7R`kfCzG4b*Xr}tkYw?B(Ui6&GefM6qG-C(_gU+(>@>HGCfanFl<+*DAu+lB78 zK4apSfInFyDbJyskVh^);V^l9>(3Vg9Japo#9Mbf{+3BByR;|hTmN?saHPxC$uJ(? zf5xV8KpN{c@oJh-dZ{jzEVEH$9_j!5jxT1G_q6fi=Z+(Q@<(4zKVGZ+rp>62hcv7O zTSrbx-*4L4_vgN9cn;k)p+=f0mFL)4-h-Ef`GIIO=A+?6zBz*SF%82nTr@|>FMSW0p|k=bups64W!B9^|m-<{n(dB zLw*$Yc#k+K`h?@&W*-|;@D&Fe+i-0vvR0hLS)DUJ^rbcEe5r)wM%8m^__yG$qE7zO zCU`+WC9VEw^8ohr+!Rxyn!t`~%cX&=9!v}ufS-)D&uAvO?6z|D1L||}O5T7Ioq9>_ z9s&9kUi`Oej_}G|-{i#gaHjPg>r9)3dCw$x!%7>x!XL;G@s8oXAi~|N*R?{FEupWt zk#J2hc}@Okasni@6$pI@f`RV0wVx9{ zQ0z164}&S;NSrn15h=zOTkuOy1;W5r7Zr5?twh&%qv&N`q5EVGc!*5l{Dv6^3i8tM z1HG%>c=MdkIu2Z6G( zlBmgjnC&piCc7ez(*H~^QfoCLg%(Df|8tjmrcAUhZ#HW5X7_+;uY$CHhprPb)42&n znIUkvq{DI!@=pbM<3p8B)l&IHE1TRKD3+Zc&q^vdpBcFFs9C#~LYcyOBz%2;|6u4= z>4A>VyPc5*_3xa^S#-mNN!znW&a1U+*@trYje%@N4i9(q(W0>d@{ zz1P*eTfN1-Va5)Ofze3WSYvfXNh5C4nt6)s5{G`H_DeJWgP|?oAJX7Z#%FmApZ^ zY4$A)(;ia(wYM+2jy>hs%vU2tndCS`3x7~+{#NNekL(-fOOWo6o3;7h57h!E%}~-& zM6e~RQ(LqU!Oh4F$H{~SnJ2{v0fvW?WBqVvk_D_pnUMp? zaE3SqfA{Be=gy71xoUVD@KfDq`}`I6Htzm)c5{dHo9+Jn=4*0ho!?lGMs(7=hB^Oe~|c$epdbrgueYN z`uXN(AoP&E#aGnx?-9^e#H-2)?1uo|e{^%4wX@0Dnd5Krg>nZnU&(COszmYcCUacJ zDo@{9(r|~7!Z{8VUZnX!2bhKyL{S^^bN4`W^6_^67Ig8+ZA^vU!6U;djV-k+NvmPi8T{+GWpMSTz(-+%Wu*LK9mmd7YRWHk) zwOst;s)CtkCT!C5lR(YK;uG(cAO@<`x^kH6+1@b))E@;6@7VlYKT06lSw<#iHwRpMwx;QKMW0&hvei853Wirr_*Bg&iL^Xb>$lR<$|iT+83hb9zmC0!L)FxhyF}+H>>D-Eqs!EyG5S2o3dZ}*91niQ-RXvvJIaQ|Pf9I!X5jw3i>5O~e ze)*BI4OM^WaMkl?FujKm{qvbi+SRx46+DnBtm|{ej5=r=btl=OF=?__F1L^FZrKY4 zc~qN;+TWV#;FE*8E^%c3OxSq5vj6@}vr%eDn+|V-Nt1b=>g<5C z)To9Idfj^{%-`{5L%CaT*>>J0R!LSALEQbJPAJ06)1NaaKh{cX?L&=`;cZ#2gMId? zSTD9mj)+s$HjftIKn>Dhlcp;|1sI(6;ANbbQbrI$j9+7iUZM^N$ zP621dRQmgHF~z-};r$rhp2>=tvgg7==21)x0)sTD!N)#69z3ca)qD0GR+_>9fdzm> zj(jj@6yq5e>_MZ}-G2sPBSokZ}X%T1d)`B04+@~!0OVWouTE|s+UYo7qLj1Bv3(QcsdO8fJx zgRhTyy=-6AyT65%ZBtr2`6a=R1@wc&-*Sh3Nw6EA`&Y$>O3mFR&n6t&U|VInjeNcS zWd~;=Lt9c%r}36t5cih^`&F;A{lzr58A;PA>(RfRKWx^!7xLx4zMK#Km$-2w8F?Tn z%tDXyeCvG>5B<2di$!*CP?YpQ!iihuluLhi1g&kasB#4CNx1#F!~E(5_t#8azXu2W z9wLAJbLM~M^FKu81ZY{^{bpNX>3rZ!6X3bQXT7x_0kQx12EXt7N}91N^nC$-UAmwt zwerjeD#>ua7GUST+Z-CBKhBrce)v-_>-y(QeX-N{^e>`V`vSji{E2$WHOUB%P~6IX z{&jTr_az)C`}*>Zg`8{FW^SrSw-O{@006hYyoSEM;Iv-|8(-lXonYcs4pMa>1Wn(m&=>)lLqZxFwX9RO0Q?VMx|l zKlmlY3mBfHV%*N&`V#Z|a}HFGrKD;9``*&F8}UK6zl82U2&?fQpoYBivN(e2a99}i zv1m-TTOd660Lv8#36#A#Kc4m2IC??oOXzIZL`AlzU=%tI%F&;I&^_c>rM~*h6;)-4 z`GI;GFEC$1By}UGrhIJeQKs%`{W4MWWtjCeEgT;u#8Dt_Z1BvO7wRjDV;gPn`V!iG z=>)s4JYxen+}~)Xo*_J>@+Ab_k;chn^(E>5W0@dVR&@lP#WdOQhfgXu5=10`l+~yo zamvHCxmW6~{oFVLx5_kw9-v2ZlgaqF!rQfj^XBy{XFdUTd=2h=a=e9eQub@i-<>?L z;)*oh`ce;HYXk`RoGsBs^UZtkba!1QHLi>s@A~}_#7jLRO5hSe zKI?OH{}*&3`)g9BJwaayns#qss*;gpz<2+#ar5`D^&gJDLEodp17-M_{|GpI6|iIJ zkH99UsXqa>_uu?Oxg3wdFE(dR_zjcp`1oiT^&|@&hfo0R)cER&5S0+yscTzk)H9bS zB`@!;_`MBWve>kp$-`OH9qv_q@~3kDDK@rU<2NT0+eY|vuH4?35S$%Ca$(;8s185q z>!N;&vK+e4=2lO}RV%rLJb>WoodT%R-8C$bb5WON*ZdkTK0U-+ykZA0FG3uT=RR60 z7gk<36ez zEXhkjV?DKKNor~gG!l{X-DsV!SvKW^U6;L~=EHtt_Imo;w2Zn6ZtJNB{kpt<#DJjf zrPUOr8kBQZS#3ZuePAM;Avb~MW-N)uV4&VMpwXP2JSq(WiL(&t638{EajOVM#VqqP zS8`3P+@>}WC_-bPoHNnM4|-o2$=#wgsWVa8KGpdnB~3L~{eX@s3NI}?sOAr};LlKH z4gJ`0rq4}~)KV%wQ3bUZ(hBQiqsOk0hcdKa9@DfX3PnU|6gC@II%?kki=}zH7RoG{ z;8jtjJDtO)^Rgh-BWh+=L7}0&J0qtb{megEK%*)W@lvQ3hTuz3mpfriqf7I!%xpO> z^^HH)EJ;drMBt$wV7>VV-PZW55mKjk1P#Zrp!Y`WDN!F?o=}?D)6x+_AchGedoGAS z>9n+m>`6lp(&N?^A?e-XeK*@9#7hQG{J^>_4YFOV7d(LETe)O$2t@uwWVWdP^}?K9-F!agBcpy z3U=A3@8ZM#A{koPb5SfT^rQL*8H-uiYDm3XG1#5Ks+mqX>V_5&bb*3A6X3xpa$Puf zt`z$!bAJ}E>70w$Nbq+l9q&A(AnXXDW>So=s*3DuOhE)TT@y~21C}WzgiGy;*iJ6ixmVf-(na4*Q1A+7;D;-qu z2a7OEr^RV*!HxTM&5=Ct&E|-rE$n*ORe{rw1y+<{COy4J*DU;r=qKI`(*zbUe6r}m zRL66FgSTE$m95wNx}Uv=Ps05Z8Y-g+wU-U1Voww?;a70g9@_mrw6%i`Dd)91m7*DD z*6gj!akzir8aFYI*`g-xqHi~q+x$Q;zAtE9a?yz~=X>Gg#O0LAP772Kqz6dN-~S7O z_l&iN(|!mA6FsJ7(9P|WMYKz|VdXd1w22Ps=#4W;R4_p##|@H`^de?%ejoeYiV093 zpKRv<}=u!;VUnMi?|4jJtd5q-JMq|l}buMfCvj+eyTTO>Q?nn zG9(`@k27J)7^~1M&zNkuG6p41$#in6or{^{57v9|YSF9m8l+zIEYY;D=Jh9lM;W`0 zW2cx#yhd>E5y+)-mae8_HYJ$PQ0ga!cFh1BD9+%ghCbI47oGiu)}v6PiUp6{=gCQ{ zx-zYzrax}$At~DFr>$K932a!R!bc$Ob&7YL3vVRO;?1P!jM~>JbvWe*e$(aT28LIq zsH%%?5*X)iUFiUqwd`{m$m`9Hy7wR;oW%h~tbRC{U_+h>H0%lh=Cugt zoEb@oNRQj5h=cyJ6|B%Kx>LYea;q3U{65dCKS9(8NVM*RI4gPxfxNL{b9u8e>|HGKHX!Y}SQK6UfZW^?PbdDQn@C;!_oHnifx<>ZsJN=a=L`HcWp4Op=dh;s~q#p`mFx zw=DAo=2hc+DQ74yoqoW5iG--9JWzDH*9>lKXo8kXs#t>TXhxG1ZERy%4?6ouXU?7w z0_!8Y+DwRL98z0qF+3?oRWBo9MuLtYpPzx13SV44)@?$_h(x`P!nnOvo5RAzah$zc zsJeh$$c0sDdz<6!);+8S+)bDXg~PWAgBiU&J0t9KQS{{$vY-r6z(XH2ZwM#R0=WvW z{oG`WUsCeT)o4BGoxa)iupWJ$9UHw{){4R~J;hkG5 zH{RqxZ|}VF=fTGxV?^CgdU-zIP4_KGdVNr|x!HS&-lFKSo*qU)T$DZx_+I>1%MM0T1E z(#a6MH=9zI_U;1=8wrL-ar|DGM*b2%?hEq@3T-qk@~}y)g;I+*L|))#des_wUAVAx zeJtYi`PM7_wUE-VlI%IBo*}Q7$rOkArtx-au@S3R*p-qQZq8TRir>{{BB`tdQ?)#p z-6&Xqkk0L$S8UM3oiUG$I$@)u5Q=jQ>lrhAv~oG(4WEza$b}UUMZk8|d~fft*CuBE zp3?C-dDh`~I*!FPMGXxX%!~R^7`H7qkH|Gd<@aF&n&k%u^clImQ$zIpelGc|Pi=Mg zUq?BGV49qbA!5U2yGfWd@}lfAmWDY7P*%T0)-RrA+i#TBsn|RKEJi zJuAI8FOY|@(fNd^Ik+vY>d;esA|G!4V^N1WXKVUWXcu`bj5mhBA)LLw@}fyKDJj_| z*WCFhhJZ99F+@p*=FFXreU}zX00My`gawYWp|$!+_5H}c1Zk~hs)4R4w-CdsKb1(&RlvR$G_vaO%jnT~QxV+4T|2wOc`Le^(ZU zyCxEiBXfKpd}fWW88drFpJWiD_|J?^UA-5UZr&u{uQez1P*(J*5Uy7UFMahXQ6DAu zG(&L&BkzVbV7BJp=o*j8MrEz){Q$fN9tb;drqgLqZODEJiMTRXXw)}elAkEv*~kw% zJvHbxAt4I$*QMZd5BvlGg!l59#;v;?%6N?|qaZ)*rpx3>Ec6KLhgN*v+$maak-2s4 z^};Vm7Nfs-eWZWdC~2nQ*`D7YWo`!QUsSveaQYR1x$i4_koFbHc~jxH_wK~+_N)qi z@1FNtf`9b8H|0-+y{{gN&v?uX#eN9C>MWbQsZ+fec-!*!uLYf$7%a^$Sx4;6eBo&C zTRe|;Rp+}rox4Np^K^Kx49CFV1dLZ0dp94nU`YfVXuNLOGHN9%F;L!m;1l5M!T#mx z`{yf+0sDUZN4Ez6M85XzZr(iBJ<)7+_`)Bzqb>n{d<6LCs4<5AbgBOdIoG|(@rXG( zBD4bShSWrin`>)1F)aS!p( zeC;TxAvrnc}p6y*-DQ+*9gDwre zAosho(G%MB+h0=s=jpvI{i1B0A5Y)8?+vrrShfoN5(>LK3oaho(0JlDq!vcs6xLbh z+T4q+CH=ebe?ON0A6v_t)yI!)ysv_my&AVD`82&A>ALGwn}InX0mkIUBDi^jo@T3Z z>?>0rR?5pOz3fP?=Kaxa$XmZ$>Co|`P3M$;W)O0|v;Vza{d+6>?A(g&9;<}e*o11%N3jV`-oF~EOZ)q z4pmJ)KfkBF_UJ=G9wIZ_zlQ}~XYxTV^on&X`gXDAGv7Jb(eQ1T*xJjOgeC19kd899 zTEphglq`r=Q%cy|#F@*yJpz^qH|eADXekW)o!6>_WQ?jVAvt@-u@sROlk_n}SkSa; zfaS6A&b)-+u@E!MA^8AxdPk#?^>dc_->aayU9OosQh+EIW0t0S(3Xifje{bg68F%; za!%GY?a@Wv73@~miG#ByV8tr@vgVhqG(aXS<>qkH5$n^=DB`s;21n2cHsqh8*y47g zLX8WfxCde`SStp$VDmr|c#X^ilr2-!rf;e5lnfIO3yC^VlYYJ#=p;!?OjS>yQ*>=n zIu@o=Y?Ns=yQ|$b5;OsilQ>seV-*6;iKeqY=nBJBjnXoSzb0Yz}PHPCzLb=f@OExTib_gUH=PV|zBxGL}%*ZpcPt}%I@~oj#?$H;shv<#3q`v3s&t8?D zOln^$!yAYD=jUlSwa-16Ypg;^!{Pno`2*Fq-y(wA=|BMumjxDSir2i8OmUb;MQ%W* z!D6;*lN8Cl{8kmAa8unBnVO7(BYcBSn*bZjz`Cd&opyD|)y^YX`A9hD$jR;E*${$+ zhfZ^~ckV^)2hAlKMr}}Bd(=%sWPXkzCOaX6*xg+zIsT?{c^$rd5=}|%sw9)~ES6|< zLS9Uw(&Q@UyYXdwolC7QM5^$7f^`Bb8pZ={#-J)d`d>`P>P=Zg2@(uk7pU6yN67y5 z&utrn_V!U4gdGAoD(Z#^T^r8T^?~-#8-^d+{mTamlMjrUsPRN`mW8Bz05wG9X?Ng zU#ENX^s;Wl`iVCJk;KK~k=S|Py*A_fXEV1wDaLLGmv@X0w8rXJDMqN8R)g9M=4pz} zWprBD>`wS9CB2u`cG{bgzOkp5_fp@4Y#0rF3FPjnSdouReC^_vAeIOErm8tCU8%|3 z3;3Q{=Epg3J-6r&R_F2(SCgl9{=$xk)7Gu1xuLBn>%uoDbav$)Ff`Bk1#JpgY(F)N zqgdMf;)(-qiM7h9{#p4yTmH>2-6p$l7!#661B8AIiLF?X%Q42w%dz6kyY-F5cfg!~ zF%8zKvvZ9g&>&(nh06((-rGAuImsFd4o%e#9skBa?}y$f>|1)%bpEr(vp1&D3sS%S zBxyPCG+st^MC0xLbn~x|PCQ0Y(~G!e(Yv*T-!@qlOfW`&#Ab5j*J5)4_N_IATJc(K zMG#Au;!7^3<@nt7Qv1FH&XIOWmH7zro`>W&dx7lyFtm}knGRhI9ZZ~Qk^FeMNYHKL zOeJg1S062*7vV}@*FoJ5Iq$Q};LtX=Qn%MugRyBHF-iV-lLf97D> zKT;Q3SBN~V{aH!P12;OI3csm_l|y}lnj_X!fgXseU?$K+Sat9qCLyhaItX{dHW1k- zV-SV-K?V9~$*(DqUZ8nl@P3zT8?If*sc*Y~UUc(BcchRTkfPL`sIp8@03y&|CUd!z z=HoihLpWwl9=!jxg-JKeDn_V>au}|osZcC>y_v5(RA`+{RydT(yt78$(|SKAFs9d< z+w*Sz#bBXTYds9l98W)-_eA)^=^x-$^Xxw}z=in3B304qybk9C zWeOL+fJ`|;bQY~wA&dGX5e~b#AyuCKUakDOn%wV+drd^&O>$ak&iW_{dH?BXXb#H0 zCZ{^MFCmRajg^{L{3h)+scSDH9Q>M7&VGPcV3xmsy<64q{8|@&)daPIY+X2~w;>o- zZkO#Cf>RDGTM-mZVF-_na?#R?Xe^Jc>iuemZ-Q_a<>456NpU+ZMEemU#|YP`{tBqa z6n=*IYH;Zbti|{=HLpjBhsUYF!swAr03!FxfAT{12p+T1t|^lDrl(6{u;w%;++n!T4Bk3F}#TL+P%-IBB>UmBw?}K zG!IOrzSef@d?3^`RBmmw$5aIk0C?3(NHFKKBtrxPC&J8kINBUpR0PbTtTxr`DEiYa z-FEXphb)jUMkXX5yRIcKXO}a9M2MVkMa}5<4&~((M1fnT9z{}kbnK?VcRtjQerb@P zXE^uv-p+K#KnZ82srVM}~iCbMMYOiHlRH-TFXQ&7w)? zZwjBvi!L_d%d=!516S3BolJuo@$^1Al2Df;YtI;7t<|QZkDNpXIt!^7$cQoCwVg+rJI91wQB8zg2l_5x0 z!6AUGl)_ziq+9N#@H&sF#dODXKxXBVh*Q!r@S>JzLNhiml^Ovlsd`}MMbyzjek1_I zIOSwft%HSa%5e@ZnMTU+sV6U`Gte8G$R0=-7F3Q)qw&RhFn+n2do$92Wu^&jmzFv3~aD{T0C>PP&nFh!RY{4cypK*2@GFnDW9+&l0~xtm1GWq7Fl8|MU&TRC~M2 zGyZ2#F=?tj7-3O=Ff{bR5(VEH+U$9|2ONznczXbJ`XAh~`OjOZ&rJum=EaB`U{dli zb^%merXtqC9F0o}2zB0sw8yD BCorjg=EKO2JjqM*1xtN+dQAJZnEIQ2d?g|-ft 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

2An7n*i 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

jL@~r0f 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%0D*Q%2|XN7NRJat2i;FM(XW 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
  • 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
    7QpDyzmaE^lv}{>fZ7^>3D|1$b&vXbPA8&Zr888 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 Date: Wed, 3 Mar 2021 14:18:53 +0200 Subject: [PATCH 38/39] architecture doc added --- contracts/rust/wasmlib/docs/Overview.md | 2 +- {articles => docs}/docs/accounts.md | 0 {articles => docs}/docs/coretypes.md | 0 {articles => docs}/docs/deploy.md | 0 {articles => docs}/docs/publisher.md | 0 {articles => docs}/docs/runwasp.md | 0 {articles => docs}/intro/todo/deploy.md | 0 {articles => docs}/intro/todo/dwf.md | 0 {articles => docs}/intro/todo/tr-fa.md | 0 {articles => docs}/intro/utxo.md | 0 {articles => docs}/tutorial/01.md | 0 {articles => docs}/tutorial/02.md | 0 {articles => docs}/tutorial/03.md | 0 {articles => docs}/tutorial/04.md | 0 {articles => docs}/tutorial/05.md | 0 {articles => docs}/tutorial/06.md | 0 {articles => docs}/tutorial/07.md | 0 {articles => docs}/tutorial/08.md | 0 {articles => docs}/tutorial/09.md | 0 {articles => docs}/tutorial/10.md | 0 {articles => docs}/tutorial/11.md | 0 {articles => docs}/tutorial/SC-structure.png | Bin {articles => docs}/tutorial/accounts.md | 0 {articles => docs}/tutorial/accounts.png | Bin {articles => docs}/tutorial/blob.md | 0 {articles => docs}/tutorial/call_view.png | Bin {articles => docs}/tutorial/coresc.md | 0 {articles => docs}/tutorial/eventlog.md | 0 .../tutorial/example-tutorial/Cargo.lock | 0 .../tutorial/example-tutorial/Cargo.toml | 0 .../tutorial/example-tutorial/LICENSE | 0 .../tutorial/example-tutorial/README.md | 0 {articles => docs}/tutorial/example-tutorial/cp | 0 .../tutorial/example-tutorial/cp.bat | 0 .../tutorial/example-tutorial/src/lib.rs | 0 .../test/example_tutorial_bg.wasm | Bin .../example-tutorial/test/tutorial_test.go | 0 {articles => docs}/tutorial/install.md | 0 {articles => docs}/tutorial/invoking.md | 0 {articles => docs}/tutorial/iscp_accounts.md | 0 {articles => docs}/tutorial/readme.md | 0 {articles => docs}/tutorial/root.md | 0 {articles => docs}/tutorial/send_request.png | Bin readme.md | 16 ++++++++-------- 44 files changed, 9 insertions(+), 9 deletions(-) rename {articles => docs}/docs/accounts.md (100%) rename {articles => docs}/docs/coretypes.md (100%) rename {articles => docs}/docs/deploy.md (100%) rename {articles => docs}/docs/publisher.md (100%) rename {articles => docs}/docs/runwasp.md (100%) rename {articles => docs}/intro/todo/deploy.md (100%) rename {articles => docs}/intro/todo/dwf.md (100%) rename {articles => docs}/intro/todo/tr-fa.md (100%) rename {articles => docs}/intro/utxo.md (100%) rename {articles => docs}/tutorial/01.md (100%) rename {articles => docs}/tutorial/02.md (100%) rename {articles => docs}/tutorial/03.md (100%) rename {articles => docs}/tutorial/04.md (100%) rename {articles => docs}/tutorial/05.md (100%) rename {articles => docs}/tutorial/06.md (100%) rename {articles => docs}/tutorial/07.md (100%) rename {articles => docs}/tutorial/08.md (100%) rename {articles => docs}/tutorial/09.md (100%) rename {articles => docs}/tutorial/10.md (100%) rename {articles => docs}/tutorial/11.md (100%) rename {articles => docs}/tutorial/SC-structure.png (100%) rename {articles => docs}/tutorial/accounts.md (100%) rename {articles => docs}/tutorial/accounts.png (100%) rename {articles => docs}/tutorial/blob.md (100%) rename {articles => docs}/tutorial/call_view.png (100%) rename {articles => docs}/tutorial/coresc.md (100%) rename {articles => docs}/tutorial/eventlog.md (100%) rename {articles => docs}/tutorial/example-tutorial/Cargo.lock (100%) rename {articles => docs}/tutorial/example-tutorial/Cargo.toml (100%) rename {articles => docs}/tutorial/example-tutorial/LICENSE (100%) rename {articles => docs}/tutorial/example-tutorial/README.md (100%) rename {articles => docs}/tutorial/example-tutorial/cp (100%) mode change 100755 => 100644 rename {articles => docs}/tutorial/example-tutorial/cp.bat (100%) rename {articles => docs}/tutorial/example-tutorial/src/lib.rs (100%) rename {articles => docs}/tutorial/example-tutorial/test/example_tutorial_bg.wasm (100%) rename {articles => docs}/tutorial/example-tutorial/test/tutorial_test.go (100%) rename {articles => docs}/tutorial/install.md (100%) rename {articles => docs}/tutorial/invoking.md (100%) rename {articles => docs}/tutorial/iscp_accounts.md (100%) rename {articles => docs}/tutorial/readme.md (100%) rename {articles => docs}/tutorial/root.md (100%) rename {articles => docs}/tutorial/send_request.png (100%) diff --git a/contracts/rust/wasmlib/docs/Overview.md b/contracts/rust/wasmlib/docs/Overview.md index 5b5dee15dc..408f199d94 100644 --- a/contracts/rust/wasmlib/docs/Overview.md +++ b/contracts/rust/wasmlib/docs/Overview.md @@ -17,7 +17,7 @@ WasmLib provides direct support for the following value data types: The first three are basic value data types found in all programming languages, whereas the other types are ISCP-specific value data types. More detailed explanations about their specific use can be found in the [documentation of the -ISCP](../../../../articles/docs/coretypes.md). Each of these value data types has the ability to serialize into and +ISCP](../../../../docs/docs/coretypes.md). Each of these value data types has the ability to serialize into and deserialize from a byte array. Each value data type can also be used as a key to our key/value proxy objects. diff --git a/articles/docs/accounts.md b/docs/docs/accounts.md similarity index 100% rename from articles/docs/accounts.md rename to docs/docs/accounts.md diff --git a/articles/docs/coretypes.md b/docs/docs/coretypes.md similarity index 100% rename from articles/docs/coretypes.md rename to docs/docs/coretypes.md diff --git a/articles/docs/deploy.md b/docs/docs/deploy.md similarity index 100% rename from articles/docs/deploy.md rename to docs/docs/deploy.md diff --git a/articles/docs/publisher.md b/docs/docs/publisher.md similarity index 100% rename from articles/docs/publisher.md rename to docs/docs/publisher.md diff --git a/articles/docs/runwasp.md b/docs/docs/runwasp.md similarity index 100% rename from articles/docs/runwasp.md rename to docs/docs/runwasp.md diff --git a/articles/intro/todo/deploy.md b/docs/intro/todo/deploy.md similarity index 100% rename from articles/intro/todo/deploy.md rename to docs/intro/todo/deploy.md diff --git a/articles/intro/todo/dwf.md b/docs/intro/todo/dwf.md similarity index 100% rename from articles/intro/todo/dwf.md rename to docs/intro/todo/dwf.md diff --git a/articles/intro/todo/tr-fa.md b/docs/intro/todo/tr-fa.md similarity index 100% rename from articles/intro/todo/tr-fa.md rename to docs/intro/todo/tr-fa.md diff --git a/articles/intro/utxo.md b/docs/intro/utxo.md similarity index 100% rename from articles/intro/utxo.md rename to docs/intro/utxo.md diff --git a/articles/tutorial/01.md b/docs/tutorial/01.md similarity index 100% rename from articles/tutorial/01.md rename to docs/tutorial/01.md diff --git a/articles/tutorial/02.md b/docs/tutorial/02.md similarity index 100% rename from articles/tutorial/02.md rename to docs/tutorial/02.md diff --git a/articles/tutorial/03.md b/docs/tutorial/03.md similarity index 100% rename from articles/tutorial/03.md rename to docs/tutorial/03.md diff --git a/articles/tutorial/04.md b/docs/tutorial/04.md similarity index 100% rename from articles/tutorial/04.md rename to docs/tutorial/04.md diff --git a/articles/tutorial/05.md b/docs/tutorial/05.md similarity index 100% rename from articles/tutorial/05.md rename to docs/tutorial/05.md diff --git a/articles/tutorial/06.md b/docs/tutorial/06.md similarity index 100% rename from articles/tutorial/06.md rename to docs/tutorial/06.md diff --git a/articles/tutorial/07.md b/docs/tutorial/07.md similarity index 100% rename from articles/tutorial/07.md rename to docs/tutorial/07.md diff --git a/articles/tutorial/08.md b/docs/tutorial/08.md similarity index 100% rename from articles/tutorial/08.md rename to docs/tutorial/08.md diff --git a/articles/tutorial/09.md b/docs/tutorial/09.md similarity index 100% rename from articles/tutorial/09.md rename to docs/tutorial/09.md diff --git a/articles/tutorial/10.md b/docs/tutorial/10.md similarity index 100% rename from articles/tutorial/10.md rename to docs/tutorial/10.md diff --git a/articles/tutorial/11.md b/docs/tutorial/11.md similarity index 100% rename from articles/tutorial/11.md rename to docs/tutorial/11.md diff --git a/articles/tutorial/SC-structure.png b/docs/tutorial/SC-structure.png similarity index 100% rename from articles/tutorial/SC-structure.png rename to docs/tutorial/SC-structure.png diff --git a/articles/tutorial/accounts.md b/docs/tutorial/accounts.md similarity index 100% rename from articles/tutorial/accounts.md rename to docs/tutorial/accounts.md diff --git a/articles/tutorial/accounts.png b/docs/tutorial/accounts.png similarity index 100% rename from articles/tutorial/accounts.png rename to docs/tutorial/accounts.png diff --git a/articles/tutorial/blob.md b/docs/tutorial/blob.md similarity index 100% rename from articles/tutorial/blob.md rename to docs/tutorial/blob.md diff --git a/articles/tutorial/call_view.png b/docs/tutorial/call_view.png similarity index 100% rename from articles/tutorial/call_view.png rename to docs/tutorial/call_view.png diff --git a/articles/tutorial/coresc.md b/docs/tutorial/coresc.md similarity index 100% rename from articles/tutorial/coresc.md rename to docs/tutorial/coresc.md diff --git a/articles/tutorial/eventlog.md b/docs/tutorial/eventlog.md similarity index 100% rename from articles/tutorial/eventlog.md rename to docs/tutorial/eventlog.md diff --git a/articles/tutorial/example-tutorial/Cargo.lock b/docs/tutorial/example-tutorial/Cargo.lock similarity index 100% rename from articles/tutorial/example-tutorial/Cargo.lock rename to docs/tutorial/example-tutorial/Cargo.lock diff --git a/articles/tutorial/example-tutorial/Cargo.toml b/docs/tutorial/example-tutorial/Cargo.toml similarity index 100% rename from articles/tutorial/example-tutorial/Cargo.toml rename to docs/tutorial/example-tutorial/Cargo.toml diff --git a/articles/tutorial/example-tutorial/LICENSE b/docs/tutorial/example-tutorial/LICENSE similarity index 100% rename from articles/tutorial/example-tutorial/LICENSE rename to docs/tutorial/example-tutorial/LICENSE diff --git a/articles/tutorial/example-tutorial/README.md b/docs/tutorial/example-tutorial/README.md similarity index 100% rename from articles/tutorial/example-tutorial/README.md rename to docs/tutorial/example-tutorial/README.md diff --git a/articles/tutorial/example-tutorial/cp b/docs/tutorial/example-tutorial/cp old mode 100755 new mode 100644 similarity index 100% rename from articles/tutorial/example-tutorial/cp rename to docs/tutorial/example-tutorial/cp diff --git a/articles/tutorial/example-tutorial/cp.bat b/docs/tutorial/example-tutorial/cp.bat similarity index 100% rename from articles/tutorial/example-tutorial/cp.bat rename to docs/tutorial/example-tutorial/cp.bat diff --git a/articles/tutorial/example-tutorial/src/lib.rs b/docs/tutorial/example-tutorial/src/lib.rs similarity index 100% rename from articles/tutorial/example-tutorial/src/lib.rs rename to docs/tutorial/example-tutorial/src/lib.rs diff --git a/articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm b/docs/tutorial/example-tutorial/test/example_tutorial_bg.wasm similarity index 100% rename from articles/tutorial/example-tutorial/test/example_tutorial_bg.wasm rename to docs/tutorial/example-tutorial/test/example_tutorial_bg.wasm diff --git a/articles/tutorial/example-tutorial/test/tutorial_test.go b/docs/tutorial/example-tutorial/test/tutorial_test.go similarity index 100% rename from articles/tutorial/example-tutorial/test/tutorial_test.go rename to docs/tutorial/example-tutorial/test/tutorial_test.go diff --git a/articles/tutorial/install.md b/docs/tutorial/install.md similarity index 100% rename from articles/tutorial/install.md rename to docs/tutorial/install.md diff --git a/articles/tutorial/invoking.md b/docs/tutorial/invoking.md similarity index 100% rename from articles/tutorial/invoking.md rename to docs/tutorial/invoking.md diff --git a/articles/tutorial/iscp_accounts.md b/docs/tutorial/iscp_accounts.md similarity index 100% rename from articles/tutorial/iscp_accounts.md rename to docs/tutorial/iscp_accounts.md diff --git a/articles/tutorial/readme.md b/docs/tutorial/readme.md similarity index 100% rename from articles/tutorial/readme.md rename to docs/tutorial/readme.md diff --git a/articles/tutorial/root.md b/docs/tutorial/root.md similarity index 100% rename from articles/tutorial/root.md rename to docs/tutorial/root.md diff --git a/articles/tutorial/send_request.png b/docs/tutorial/send_request.png similarity index 100% rename from articles/tutorial/send_request.png rename to docs/tutorial/send_request.png diff --git a/readme.md b/readme.md index e2de5b0290..ff05db1ae9 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ introduction](https://blog.iota.org/an-introduction-to-iota-smart-contracts-16ea into ISCP. A _smart contract_ is a distributed software agent that stores its state in the -[UTXO ledger](articles/intro/utxo.md), and evolves with each _request_ sent to +[UTXO ledger](docs/intro/utxo.md), and evolves with each _request_ sent to the contrct. Since the UTXO ledger is immutable, by extension the smart contract state is also immutable. @@ -60,16 +60,16 @@ tests). ## Run -- [How to run a Wasp node on Pollen](articles/docs/runwasp.md) -- [Using `wasp-cli` to deploy a chain and a contract](articles/docs/deploy.md) +- [How to run a Wasp node on Pollen](docs/docs/runwasp.md) +- [Using `wasp-cli` to deploy a chain and a contract](docs/docs/deploy.md) ## Learn -- [Exploring IOTA Smart Contracts](articles/tutorial/readme.md) -- [UTXO ledger and digital assets](articles/intro/utxo.md) -- [Core types](articles/docs/coretypes.md) -- [On-chain accounts](articles/docs/accounts.md) -- [Wasp Publisher](articles/docs/publisher.md) +- [Exploring IOTA Smart Contracts](docs/tutorial/readme.md) +- [UTXO ledger and digital assets](docs/intro/utxo.md) +- [Core types](docs/docs/coretypes.md) +- [On-chain accounts](docs/docs/accounts.md) +- [Wasp Publisher](docs/docs/publisher.md) ## Tools From 6585e0bdce9bdd866ccaf30db17eef1b2cd2f18d Mon Sep 17 00:00:00 2001 From: lunfardo314 Date: Wed, 3 Mar 2021 14:20:17 +0200 Subject: [PATCH 39/39] architecture doc added --- plugins/banner/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/banner/plugin.go b/plugins/banner/plugin.go index 74a49ee092..b194f5efd4 100644 --- a/plugins/banner/plugin.go +++ b/plugins/banner/plugin.go @@ -11,7 +11,7 @@ const PluginName = "Banner" const ( // AppVersion version number - AppVersion = "v0.1.0" + AppVersion = "v0.1.1" // AppName app code name AppName = "Wasp"
  • c!vj5BFPT*VGK>)I4V$E(L&Dl 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�jFD4NF^OpDTE->Tj0*~j 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≺X3TP2K9%!|#(I0H3|{NrP5eqxTg&GC4nR&WHo|9P!6?2i zV;RV1G6!1@rOibLG&+p>LwA6VXFHKEuLI-Eguk;srCyNyP-hsu@y3U`n&eSQ>4v`K z>%?Fw>?MFeePg+f75Vb+uQmjjjHk=ee0H++`q*tK*2Ntg#(7PgkAO$j?O6LTiGBw} z)@(F^eStvgC*eh{#I%mtB#4b(UKMOcVUN`|EO^VeU@4Zc#$+Ku<@Fvg{3YMTgEMx% zEETn~xrmU8Tv^?{HL!M&iw`(m@_CsUiw*W{iadV;hRk#%rDJ27fzG%d=|)gHP&+_h z0g$f%w-Tr*9}+lrdl_0kQhmBQpRyEpdJYT6bPDiQJg>VEztJ z!g!K&_CV$uew9sRsMVkGswR3fdXCGClG_Vad=h^y#QCQ3Zvj#%R@^V~fY&8|oZ@D$ zQ}@#^Rv-0QU;+!>X;q@NdY--^eFP+7>Sn!K>6BxvW~@}l zh%5Px6neRN60$(Qyxy{Y7K4agSC(P?cSu&wz#;+_Pc2*IRs6*Xs2awf^8+U@Vd z;spCc2-l;YDXrkcs-P1!d8<}+%^4Bp8j4r9Si5Ig&4ty3 zo-B=TGky*eWFF$^k-QuiC2n7?v?VcPDQi^8%p#PGjfRD@@UEjuz39N^c5I#zAt#)j ze$Kr2^Jw3dRv@4sxudSaml(sgMDwOO-oO=@)$EeCZw`>ZR~Om=$1LY0t-yCOPm#yJ#j_q@ivx>WCe$E}M2?o~?*B z;m{381DrN&hgY~VcQxEE5q$J;yy95%KJ|* z_`&o{k#VxM!`zuO0u-~V z#zotP1x*eI9T?KJ3L$!e+tiH(CwNJCG5c%LFg6Bu@o;-lzBse_!Lzi{1pfZrZ%+3Qmk}xd^YxoL(O$cKkHzPk7rpPG>uf{=H| zls`X*b*T|7k>Js-)>+o4Z&QnwSiGTO26l>+jG0zPt*K>XHtIy}n(*V%)*Wdo6Cz{j zD2mfYK;Z(t>m+$bq^v0M9Mx>P{{M%)w+@TrN&CHt5gZ1G;O+zo!3oZw!5zZj9^4^< zGx!W{K?ZjXn&9rP!QCN9fV{K2k>A=m&wK52_Q`L-u=gfjsv zX1gOVpa3GW!WfzE;(}E%gipQwJ8Fr~LIa*n^P29kswcA6->j$t#c(clM*W&SMcTEt zxUU?JCm9k>nIwRw1aDvW7d1}q75X5uQV3#TgjW);Fp*X$W1r zP$yGeL2jk3Ae!G`X_iRF$Z-?GIw@T~B44i|(uF5!jAH-h5k0IzenILZ(W=g@JB>s+`C&PR+qoZtzW^ zl4HUq^RP|`jwsf9;h0i6X&IS0pW3v!Gc+dE*;7hYp)Mm-A?}TBFu)3&)EM}(-{~!; zTTv0;l5xg*J6w&hO;8Zr3h35JoiOO_HMn~}Tzerpqb;{I?1_K3rSnFyNoI}JtDp%A zX}W#27H?NLyO`QjdBnx zpE|9xofx@gGD|>u##reNj+1$(|DM#^$ApiHM=VhAX?&7ZO>t6;XV**XNu_&Mo>C06 z2AWws*T$ew`Fho^?+7Q@3Kq3+A>B;&3W|CmJ`qAw8WN-`6x;&!FAhceN^bWDmAt|kF z2|?`D9uO0EggEbWy`4uyRaSkHwk_~lru(wHTOneP;?GOa?+2Q{wRPNoAGf1gEsu0P z4J>}0Dqn~{KT1vOi7e&!vIVmvhgmGDDkdtkJQ~{F*M1-8;S^E3mKnNe03hEsMqlCl zL+f~^Na-07IbjOnzD9_4Pc=xv9F=PZ^0+AfX^EL_v~Mzg14F4DXSv=XuN>)cIX`xS zN=Tx44f9v=bWQB$!mGXeqkrz8pt+Ppw^FBzB5iFHY#bJ6p$&kRK=CU?_%L7HOHs{B zl=vWJm#k1UZ1s{DnDbGcCv6V`JqK*0LO~NwoZk@;%xTLPKAjiPs${O!2N;OKfO)Sa zVwd~7yL+Br(wJ6UA9%4BN+aOv*s_z=@9{9>&B{Gp<%QPW5bp3{#~8jVx;rLV9iTqd z@=|*`pkI{56~a(SNgK3EMY460tOA~sOYDRV&}pcbNctEm;SK*~T}ODF5;OzuU5wea zsd!f(w*ueM_UQlQiT3SRr3d#qr4$LPfDL-)C-7C~ zsc9}k-YLvVgZr*J4Mg5|IZZRW`=R9onu_RfCcaGeCAAjZmvZB5iMZ}>ZwIY<-tuG> z+UBTHt6Pq2in_2%`8=#*rS~h`W)0L6&+`+>eVEBrsLoa>jICMCV0Z~_QRrF>9lGjM z+r~RY?qhOtt+mg1%8HkM8kaxHyomlYfmZRKoIj6&R*N%Q4SBALB|0xu$yJ$O0Wjag z2aDl4)*IJ2p1u*!)3k7xMQ1WJOw-;H+}8laD!o@L^AlR!Svjz%3MNCk}8A zhjqrUDfpj%yZbq=2x2e&yNonK6>xNtBu+d*h4H+*DV$gpO3%h_(p7g}oNv8>fUvcL zL3}d4fRR}vc|Jy zu&jDc=ke6q5_NS@JGKADl^Q>UYndH)WR@Prcm4yg&QL|?c?>a+sfEwe8JgHKQ*x9ls z$NPLh=he>zyNs1fNwOy;n7^DKZB{q2uuO?{wB555` ztOOobQUjxjhnmZ2hKv&9+VIS2c_vk#E(_>6!UEl0=Y3jjS!=3!GHC!A!Ih=9Qf8jr zN^7(Hx_O|@aH5iuvJ?6KBC{BQ_$uG1PMO5CFjA@pl>8TVWv!54SzAS-It^}Y`&2JO zQ?Tc-Rrq8+pn!$*8%wvMBi4ybymcb{0XETkR_7}b+GK&!nAyaUjr^JGimF|^GTteX z^HAU^fSyCro-bU58NCBM?usR2nvIPWGYzCF$4W@i2uGhcx_M-9)vmEp-MGSofm1rVrluGhoDfN7(na^g`i&y7TIGzBW^k~q zMAlSX|0L6SCmjbB=Zvf}QW7_#PKYKg>7M4qCMi=wVn^J(ONhsi9%@IF=Eb&aQ{vfw8qw*?gNNrD2zkmrSFvs=kl2fuy z7@aP)cFOB2fWL`2J&ZF9D9N}IGq2IVW5-#v5nfdUnX?iKG^-FYV9%fed3wik4*-$` zRk?14z9Yoce$g==PhmwA>?n4^O(PbIb5pLX9OUFWHCTF?FOv=RVuB{9n)EO^QdX=+ z&$`ditAnVhYZ@1iu6Yvj4~2n{&FslfJR&& z=-jMo7-c_gv#F9&sEHAifk$Rbf+jut)s|W@E%s4xW#jMhM^*8Tr=jvO!A%0xl3$6) z!8(~a<5H%adUB;PNGUq1NwVtIiFkwU<{b_?xdd|D3S7LMOEWtN!g@NowsH;<5SnmV zJO)Boy z0M3+g!@(Ti3TiAqIwSQx2mN+EB9e!-)8XcLr{Ggpzxw1vzg0@-Qj=9Q4WO)RN^mJD z9A6glZ6rFKG^~m1TBhrRBCiyCQbV9e-yFWQejh$%dP=Ax^_ULVxNWY#<07?6wI@DEr!C={YUK0nK@P=O5qrxk=WLp9k}?Y~h4e{9XPKmS-okNo_W;xkgc<@&4lZ?} zG;y8d*2=dJCCsQRoad9m4Y5Gxs~_=&)H`GGa%KB?l7ZQA@cUz!W)`>zG(JI`&==xR zU_-+yfE$M`WvCzI{+EY57zmtfG%r@&xMv*1sxxp2lX*rC?w!d!o4s>zLLeVZ@NloL zFE)FGiPZ>EHRM6&jI)Nz%VxrT6O{=*A3KCmG0gy9g`R9zIC)zD%{{RVzwrLi_|{jg zs@4uSr1{snj;m|BxXGMEuAQ}rdVS9JkUsG=%xGE$-Ba*PZNaQQDA^`czDbMUVt40` zWVln3J0oahc|m+m9yEKQ>HPB(VrhsUeaHtk-qB;RIUU(q9LF zf0U_=If-W2E9fWeo;C>_+io^W-^L@BV8|J!$f_;9+uw$C;K2OmUshCoG4gfQ)H}dl9$2H-tE8=X|2XaL{ ziBuUCgB~)kV`7wdIaxJD;1uVHGS>?d`1W)B+4?whYD3g_gbI<0tUI9+kH@CcH(q)t z*rZ)gTh?#+Tpm00vtRis>WikVQIALN!9&I(tyo?wc%N2rIaPwrzj>d)+QU(yr4T^K$h_(hNk_?0w* zM;eYh7$_+0As}81z4`Hu_ou@H@*a^+t;+cHs`9-bt}{UqfA7{h=a*7=XcpR-=kJ~roWnTWr5qSZwm9mRjj1KA1v17QA7KQ>^!tw)(SF62v1~P>$p*kZsP^-MYcO&; zBGzDQ#eq=D3T`-?nRr;bD)=k3i{9Q+VDxbjb&-GuvXpyc7JiHRwwMzO@L0jufur1nekCCxJ@B{;z@)VO>A1rCTUGt<|NWXoyrbg4IK^>K(sojthe|3UOGlS_GKUx(3YWF3*3$8J`+3e^ z)rY~9`)ave1){DrRp#6k*WH)k#+5`2AI%3vS!%>;J8<5gmrKRu!qAz|<8#7~o%t_f zil)avjm2@c7pY2I))3gAb5ilbpd9LMLk0^5N^D$BI!eF)bNL4|cOSczMww zkd)p)LRUcbI_ZP2YshY#U*t(mB(6lne6HzpQb><;2phi)l}>jJAZ?5amnMsZ8Lu{| zw-~cBZVFAdU&_oD{PoDKxfHAHS11YxA2W%hm$+L*eTIJ( zV(lCErM9;Gc02hLZvd-T_zHe+I(RR^8QE;<`|exDukS;Mvixd3i+x#>(Xti}*HXYV zJ24M|&DBhoE94$U6ESg$5ZNm2U>FpShyZF&LR>VMt7Zkv@=xY$H9qo4yQB}tOfmx! zOH3(O!xc=OukSGp_PB^(bd@!le@F0-Smc^!hoC`>>UI6kV5#{s)PsYNLKvK=ix+&? z5O!)IXCeDU_N6~G1_BKZYZtG^2c;Fc)y*DsYHcIkh)4yz$SzleRe$cXs5aEjyBs&~ zG^2U(SmWs*mI!$AuP|FFWV<#ijTX5Y5cdwGoO8>a|nD6 zZhf0g-(}cEt1!=XPWT5^ID67kM_*A3_(?C0!-GZ~68}f%`0dJE-&LrZUC1MN8Bu7O?7?&^#mM{9rN(kO3ngdO z+YaRJ8uDQb7nB4?L&G?l>uXgor!Q2?V3qZKnv;Q8t<4;GE$u&k@OX>G0r#?od z`5o8C&=So;CkuBvaY&FmF(fxBh_ug;Ly;wTXnSC={Blp2!lV{SI-3qRiCa5@*v|(_ z$v0G=bt(5;7(kRdq#T7>hvJQ*F8=V92UcDx)F7H-@yDyg11gchSwlIT8+4iVFamt4Q(Ye^O`B0`;j_p=FO(bCdw%!gft|d$n0=W7 zA!DMBv{I_dg^S8dq_ewdYtq4RfyN62E`qmp^xiPdo_ zN*oAq(4@0PU*5v9Xk^KedLQ3$`Z-n=v`?ETyGO$7h2dHsZI+bMI;AcFt+84DGB^`z4DGDm(bhNpvI<}7qxMVmBId{uRbCUxSYDQ&MaOLI- zuFw76pd%m}J;np=y{s?lXGwafqbEHd{-oyN%6wclX}G3ra8&HdxEVz`jJ04zK6Uvz zhq?TVtE580=xRNb(ZYi*8h{-lxv2k~v$`LyK413a71}8l2rSk~nPX(d<($hL(au*1 zlaU=G3JlS%mF21g59p%u?iY4Bo@Ib$E12PqkHNFKsTwrYc~ZXkZuh@E=iY_Gb(m;% z)_vRrY(56uAgcRwOfnXH+14ugAP1w1YJZ$6&cfL0E54sL+SJ2(QNYGE;bUBhwnAdA z4kt!(f`!y!@+#<;M{3zZL@2W!y9QR_BL2yM`JxxxQ3&^-cUzGUEpI-Gn3aDO7WwU7 zL-1kK0e&ID`FuyepJN`C{oZ9Hxr}^Rb%S$C?z{UXbKURrWlCOC0P66sBpOfS>+6XB z2|eMLIq>-JpK_AzPoX}0Bbrc5o8NvkM1GfrO zqJVreJ@XZI^6k*#IT%Nh@m7-ELc#0M+#L(a$K4ZS>_yyE@7Juh<0pAxBgcBYn{=tc zgU;D*UBvPlqjQTO&Kk4Q?+CP2isQQuTjOS%8sN;t7!}y4H|0^F;XR&9>Dmz=F{&^> z{@2&6&*rz|8vQ(^xBjMOAx6Rqbg9e)RFE@r39YPU;>ZA$KW5gld5Jt?Ni>3lIc!R| zSk0&){aM_s8%ItFXN(M$C{b*n`C`FExzD}0DaGjV0k2Z+?Sq}+P|WB;n4#9s&TGFg zlwE?6oR@g!?i2t&sYyqhMSXjGv&L(_uP4=@(9Ua8r=ypn_9|B=t4_*_>Xe|~?`89w z96cdCS1_sVv71GTLkA#mcf@-5QtNg#Z+w+W$U@|poi`qrMHlU8-++e#mir9Fz$7j< z59*V9e%C zXT=d*1(tB}{f_(zh|)NT{X*&%Q+kf@_P3J{UdnIZpVQ}!y)D}IS#2o)Ff_O2&(saK ze@5MS5ViACHsiITo?~*7+!yp#+KqHFyE%ki1b`N-s*@~3p#V4;yj8F4WuA9VE25o< zg`sB{#;B!&ETZal(eWJtkF?2-*B5l`G4!$z25K}7lmDg#8O{%#Zb(O}INsFxj-Ugi z-Gpmfq*G2?yrl zp36GtD-}!S6s)DJ3c=hyrf190KNyxNa=`a>^6&xmJ}}X$C8uLtVH@&<79(X`5!aiZ z2l~JC4%g?r?tnbp);(*jpAu3%*Qok&!4d;RPo6o$WhIq~Lag>*S~%`FVp&T#FFlRu z%;KV=y6*3mn5_kX+v(UA5?h(l3!eY&jOikd4K?qO&#wzmyHdpWG?osXO@>>s-+9bV z+2$Akun3JGE?2-Bsw&KIrT!D2=9*O{H9jDWxCTkn^>618O9sEC?pa%0^^n@F`ri-F1NbaJw@%ByE-3xN|0JJNT#3_{ zo8Qb2wjv<5IXbU8?O9XNtpxhHe?~H@i<@>2%P=-ocesxal-C76F8g5s8A97YRgWU0y%)8>e* zR|_Z0u5%RH@N8(`Y^X9qwD*K4QbXfly+Bs_#muW-ni$26tdB{-m*B25LWHhORVz+& zQ;#!M`W!qa8&JU}|3owsO{cMg|QjJcp&b*lVD_cd6EW z){Kl8Gq5`4%OUvSYNa-?S05v$i2O~i*uF#{jf}5}^D{OL%jr3#WtIbvPS3EWiFR%s z9PFjueX)W%9OKq#Nh1b_uL=+4hCXHtnK|H(Hh=hlfTma~qe~>$j&m%9o4;bxBWIEQ zTAp^RTguX$<`kMVvp73Z)62=~xdIwyhBT%c&kIn!WyGNsbV^{5PX;r@+4`Q%qXXMCrYlMCf zO%Roo{2l2Tk6B=4Vg;OyX)=F~_ciPi;S+^%c)nKrJ%tj6b>2PXqYpUSE>I$~ z59W^j%GPt6$9j8p>6i+F394S2fjYT;kuM`(y2c`VQ|=g4z^{{nNv>n9^VGm91P-vZ zG+$k3eAwnP--IXE5e7+;XI9Kwr#8!YJg>m+N2_tq&^t~_K7Y$7wfgpYDI|V0yEavM z8J`L(`S;5Dz%Rkz9{w=xM53LEnprJ`43quPYI^GN$s`z~iy2iZ4_ZT+m4;&^hbG%u zf1_!qE~-|xQqFT_xckqmd2-!0_i*f4wfI54ay)dyi&lMT!ism#q+f>JC-{5R|5ff% zB!p$-T2{Gv8>PH`?K2D>x9!zZLaV-6z!Bs*GCDw@ zGC3f6AGaiBWW zkaJ|aE@e4tPt`oyC$h?E#-X%U<@im;lE$bnja%Bdq~KUVftXN!ud!3BiF0J2@=QFb zjjUyDqPDheU5tvFfg{JDt%BCduEMNk+auiV4tlKN3FVHavZ%QrDrN@ojCnMHw?{Xt zgz4(Iaq0a!e-N53skN-({@c>`TosiHw8pi;do0eqq)d>N6xdj%q=Tfft^&52=}PmQ zM^LRb#n-MH(jfB6;^Y|;qStZN#i_Ng5^6a(7z)+3KYiZm<8p<^Sy%?AL?Fo%``apvN*PC9^3WH#;yT_&n^XuoD(>~tw zjYK{FL;G^W{-LWZeetY6g!`S(K{{Og7LIy^emiU}kVQ|{Cd7j2k_rS@Z+O|QS{B$#&8eoI|;$d*a% z>v|szj%gcF{zFN>PnYzyU@+o?cjZz%wrAy{t}dd;oDIyP&F|O&i8t8SXaPe^r{ydu zX%)?TMGYQE8&bxQOmM^YAm2jP}b$ax5)I@W!8j>qyu(;-V8u_8dKKwKCp zYI%B6vMg*+a+{e*PglCuuC62@!TWa3$u1w3f$(S?zIv)xBrEt9zO&+3&YrvmvgJIw z)GnYU(gp8HgN~Jz7DjCjJYv$MTxe+O`EAg zvt~+lm;k3YixW1wqOAdr128YLt^`NOY_@VVmWqn2x!AzSD?X6Hi6$jPEf}LYYfxpp zRes!;Yoc@)+rhXJ;Lm{s^sGj;3m*~S z-5{ky?tNx{lyV>LF0pAd=PQ&|lB4im)sj^W#KBlq$j9hWp$*vksHefINUm@vr?8dy zb+>kq^wmR&KY?Q2SeV1d3BE*NGRxR(597No11GTkW;my=gAK?%>h_AKCgWyB^<|Z( zg9E)S1Ra9IJ80WSGHGRGYly*@eS@BnTX3j*a%c$^xP{LGzVB5zWZ@?*<@1qa)+ZpR zQy<8R3Y>?;GDk<95t0xK(`7xMJ`*z&`;bBcf3G~7qeWj#Ls#;B#OC1t&z-C5*EzG-Y?^^V<(r%TIA zgN_>n_2fVDIeYqN&!1Be+W%-8^G80B$%d_GaunM0OSjXMj{yfkKl0&TPdrTu-H1m@(q+!^LVbyRT-4Nd&*^uZp42{WB}$}P0;aW1 zN*1&Zvdh2v+_4B-Ygaw_=LR6wrGE>=WbO|x)PcWak#uI`nytPvx7ki6i^I7S@XOtD zWuj6)V&1@)5*-I$DT`N`LxNtWdoPhSSEcce`dV(7U3_^X*{9NWV|dlPnwg4IB+ms_ zke6Z!wSRqP5V_+oVWTP$171_pQc7&=7rC7z6>7>plp!mNDDR<19$sTQP)&kc&)1Wp z_uwWHqzsQgy+TIZ40ws7-LMI(#QvRWN6JF-!H+$Vw}0LPA(`-^KB_yX`S!zt^viq$ zNCLe0^UEgsk7k3O8FVc>>;S)hjcuavY~^pOtxDZ~FbSBX=BD~fTf{$VU|2Opwyuu< z*UnBJ(3L+yk2^w5&F6xTw_$S%cW|-o@HJpb*M7ZXQIHRJcn0<94d6u4`B-QH7 zyVKyj0fuk82IhQ|0-44o8&%lG4bPdDGf+{n=cyE)PmEO-w*=|J9105_qZrj}6&G(# z&EOGK*B|fBm2~*Bix8H*!O%|wOGp@D==pmKD)*t@v}qDai3yW2tOwi~6@vFF{#OLv z{{)Nmmp8Dk=;e+)tyWv$XMEw9aptJ~0UK^C&tWQ$PP45nE<;R!UU~oW>z-0q0!nJw6MFC3F~3HBN)+!%3l^W%cK;|pUscCkv2t!8F@aOJrX9> zPD~XH9%?@gxaJDjTv3%+R-=o2XEla5qCr^y%jWpgWJ!|rIH)lIzWdVl;^-pkPrGiu z%-<2z;M!@s=lp*+L;i7T)mst6{HdQUV*Ir4t_=$ctuetj9f^OQ;@I#yef#=WvH52a z*B=wBi|+06AtikKv+QRb@=!R}7S7$C+Hv{2*~iC?iRppzr=6ppwQe-;a<6?`R7-zO zP!Ws<8LAdritASXF18<~%CEI>FyX-dBPNj{zQe~WE$1R*=hw}5k-5i0c>YQ8DiLra z_gn4FE#_d$gs()UZ?oHD`A#osAREzlmACgjg)uUu)khR8;IlO$hkcd{ujt_{aS6z5 z7H(&gp~+!n1^^iQ0LZzK1$)c#ua-N!+0rl;bDY9@xUCjx9WX(U8?XUnj-cASTM|Ry z{7vg7A~hDMmW&!`3BikjL^_;Q=TtFTE7Kw~C&88K4LINwYH(x0fr5{)uJ9X;#m*|8 z6cqtRx$@}&^t`??TjNzl3%^LWOb)`&Sx#fjyeOS1aB3*op@dN`w@6pR2pqjU{Bawa z^2qov<(`fuk*_XnfjQobZNfBOa$^N|&`Z1D#5+&S_qr-DS->x6%D^CW|N zPZ&Y)U*9H9Ve9PJ+khS9f$z3J>nSkr4#_9i3M@9en^~Rll;!A(wL*de_EDira zaW!x2CqeTUN)xV}s_ptq#noxBOHIR=)gfIkUZ!DkbT-!MG%;E$u=3|{i7%27X0-aS zOJu1gdhm}{Nr^Hvzpu%Fi^~>hV`s|2j6QNPDKO@%KOWfYh>i)tFW0LB5Aoi;r_4k^ z;rm|`@QZ-)CqZVWx+x@lD&KT|JXr<0N~LEcmPItsB)HlMt&ET?aJriOGIjsOefXV+ z!{EKXf^QB}@yp_;2`4aCB%5JKyr%+1Xg8GrY4t8uQ@itCyns#?DHqO)XSgDl!qMwt z1xo)i(|l%S`pb@JtNMsZu8ERWIRrd@11wh_mXKiciPTiSBtvTrD^rGLxqxR!LCJZM z`b81~ugRX+BQ48t^O%&#Ik?O5S8XI!rl@@NYqHN%dh>_d;-8Xe?2p{_!B-BqS(zJ* z3Cyi~=6#X-qy!v+7ZC;*kJiS%eMfkW@R%p#kJS*p-ZoNnkmNPhBKrS!v*SK$W^`{M zIU%4_?zM?0Y|FRJAqHN=1k8o=aMfl9>jtnhwE#NSY4`H%(uU%eSD!#?bm%ZYs4x~u zfD!@T#4?c8q8#hjm*ZKSlYX~Rhx>TcE-%iVU68Rz(q;v!)WRnoOpJ_^W@g*vk(ESz zphBQ-_*NB;pdd5bswcD7Oe0fn%6`R2I!M}G3NHDhpeM@>-Mg>(FEspL?ZKf^ zo@8FtZd96Fx8+1xHGPPMat`ns3=VpUbTFdwTn$rG`lV}VbbZF3^qPYaB7T1J#}@fd z3LeANlx5!h!-AcTbK<$f$vK+&97#c}oFUb*$TYOA0ihjR z9`oMr=I8%p*%hY#%=#~b7u6V9*HU z7wOw{OOH8H*EC6&^_lj2;J7C1=}lK2qUzPD-I$fAkg=EN=e zEtY%i^%w+}I%VusUlV#%ZT=b%I@5KAts>#;MHsTO*KV8;=3-M}vRwV_?bf!o)o|e=J!;_9w|2(7!HO zgMeZC;*aYO+QkER(NMU2gB?23Z`6+EvbV~yFW(xQ*e_xZ+q+-M=jt;j^CHP|*SH9e z>1+Pn+D3sQC{ZC^7<5W4X{p3timf7LevRbEL+TjKd~cv#uIRHp5ue8X91G*%wX*KXw=-GQr+MiJ!>UYoq}88j&~wZLBE2u7f$aZE{tWbi>&IbKA&sUsJT?TDpq zmmE^AIGsw2DD_)~5E_k|AuJSO-VPOWqkbmvbCwl$>|WD%F^~lt&Z-5oG%9T?cEz?y zl`8M&DsAdwkU^Tf!OU0`KIH;Cl6bCBow&K6Vu5G5W(&Hkdf~DBv0CC)d3jw%JNoMC zD7cVKzE9Z@D=|`Ps?}!(Q>>;nllUm;Pw;z7rSeyHvT3;Rpj8XPkX)6%LS?{{h)p7M ztx}UjtrF>~>HuBD(ZcCDl;@$T9e7qgAS=k88FiC|Ll3HoN~}4kySsW59#E)oy}MJm zBKTpfEbJUk%pGBrR8HCFFl$|FNRt_$o`qO9m3X=Amd9WqcdE(i6+I6sbnc#Z>EN3_ z(U?n31fZ%wETt@?iK6rNvILHICM;#|&i5vI`%WKiXQc#imt(U4qvB)nWo?(1z-YMy%&-a z^C?I#Ph4Lmp)&5&p3JG`tJ!!C>4B_%B^YAjs=Q>83~Ngi@6|c#vMa=~IF}WVoK>sl zJ;jJQRgiI7rq}2r%i0{wx-$=twneC5$zhvk8dSnXFAgbcpS>)lP|-Vj{FN*|aX(-?`Q~F5Y zX6Oq9(m(Bb|KlGc_ur3B^1n4#z|R{UFY4Io(wDxyLEx+YtGa)9a-vN8Vvocj&BSi| zIXB=~uH$ku>LZGQx-WHDuiVVbdXxxNW8OPbxp10sc|mB&Jg^*kODFF9)w>pxS1+gK z&AYbCl1RPWN+y!a3ms%ROGTQvnd6vPueg>o?9{TLb%$$-^9Uu|(Fe&t(CuYEdGC*9 zFzo&Y>t04m!PoEu1CQ||@00VJjh|J1BI57;pVORK`foN=a8b<^Zo4^^sjKcq@7~mgA#2bB=5T_~ZX##glJB zp*NQ(L@x9YWX4xQt+ZTEl37)}Nir71Wz?>ixlk13?x4s1+H ze=Zub+@YQ|b)u&JxC^Kkf}($u+n_%Ptho=>$^6)v7b36DF{@1%X)5kJdKL05V`MMS ze%6pf#Q9kn-f;DHWH!B!ZiNC_Z{TgtDb9sx*38SLs%DVymh~%Q{3edG_y5WLXQT1L z-JWsKEv$458*0Tx6HVkvTsQfNo7K~J%e>I#IsG(c5$g=+x~$qxW6NrGUR|jZRdbVh z)sSu2tB(j61#kX(G5q6Sf2C+9=~eL*gSQZvh_`8RuBoslJZo=Cl&{^)9Gx#|TT>oU z(fbIYJ2J? zsRH~@c*0w_m<(PYUb?-=@DN`>d9PR;@$bs`Jiz}@_PxaXR)4oBX?Kb!Q`ai<9^T+z zcgTOO5M)1_7ON)UEc~{C=&Z1a`^VAYXP4_AJ?JIdQlm#rJMgHpw_l$7aE3lTl%sF- z<7gcAqXg+N1KG<9v5eNukI8{w??~&(Uo3#H)hCI69C;fuUJ8CV2oPPk|8^bInF)=} zEAc-K{&_6_?;S&I79&|4X4=d|lKz&ol$A5m_89;`E3{oK_s4%3ffBK zK=efMa34?fNZdcp=6@}H@3M-vomeAAMM)Ws4QluMpKO=?m-p5FQ}BPd?fCB=o&%$} z1e;`|DxMh|S!@Z(bF6Rw+GX?qbnScJXH4x(oSYp^jcifiDSMC=3NJUsQ;I(&1O+MB zr7UfnO&#G!8zW~^2~%Tx6H^Lyc~d)cXA250ULHOQVPTXX)!kF}^>rf`Y5=}Vh95TX z!#r9LBoXXMzJ2Vxzwf2{7%2*0;k(Go9hrup@ewy}>Jyn{D(!Zj?1>{D5?`krVw1b8 zj1zLo?d8K3;oD71?-gjX;N^b0lHcvvQR$7^L$|Ai?L$m{BFnBN&9=+a{oSXxtF`Ir z!oJVihQ1G&$j69cDqo2LH>Gu!mQ_7GK(Ws~&j}XJ&e*SV_da0H0{Hpdwy)N=R|y0d zm>cD;T6i11{ZytHquTmPm3lDAwr zvY!KL39hA&TDL;tur*|9O^@mH7A2xnzUt^d8Toob6@rx#uYseZ^ae6^in`6MAB~dH;F`n|t2xS?jP{`+PgC|S&lf$$AQ_^wceepID%@%DubVW1#XOX; zuDc2rm5aG2S5<@}O(f;^U~a0b1V*(vbFwuKpM(p$aovVqVd^_c-DUm=IVH6?)eHD5 z4UW{eJoyFse0={KMX^Ccq<|aFf_HL9_-lt|?R)O_!ZeKc96=YDW0oJqW~BrL`%XZ+%G#0Ji!3Inz1$_W@lI?zM9N%ICl+7vW6i7KAZ4xMLS!Wt>E%d zgX@qiDs6JOO*7*qmi?Qhpo#=`PNrZLp6F@FeXS5jgPf%_^!{hK4AO~om+ywSPj5&c z%)gg!wZdCv@)l6>=w@z2zWmCB>G$a+TS8u^D4)5Ej)8@WUa(+k|?6Rl*l>z)IO}M6{?O^oK z;yNQ(5}hLW#mq<**@tt{(ED=+uc@x@;j8m*s8k^;UB0nrw!pqHO&?ZNv#%eym)9%J zSmFJw98uGpLcm9MRaQ0{`oIlDuyH*1yz(+PgfTq0(}Em9b@UC1M0_xAV5-f-Ft328 zl-zo!z;m?+6kj%;d{Jc&j$rMOxA?ke;E`$p9uszgo%D>`^wo6U<2Osn)QvBAdr6o% z2#T=63h{Q=^9ElK@RO3?H?$nS@`${r6fn|~bIAS`b}_O^G-}1TT~7pIB+N;p&U1U| zY=K=MNj$-|0_4G82X*u8sSx45BxEhWEXm0M~rw7N7qRZc)9& zQ;!bGG!#F#=o&5EC(Jgl9Yohe9Y~_uFr^5Q0+07cu!2QTk+1;6s;JV+0f|JIY7#N4 zOWc!jSogwaNpX>uMF98+oKoP*rG8&QyMTiOK+0n(d>92*A`w%7PEgH0SN zQ)=VpY-2BY=I-~RB@6n6%UI;~mL9)I9T`KV4G7a{s6rNgRrNG57ReOyIzS2~i$CdY zJ$jqds-Rl}<_tub8g9%JH1ljpe!8?O^vE`v?XW`yEo=JC^^13r7pt!$KR+6LxC~Az z?@4rs+K|_5@;HsX82X~a_pD4HW%qsn&r`IiFUyZ9DJ9sv3GAQq26Rb>Ae1J(F_Xxk z2c476k^)bPaf=@&DnC~^ZjH@;0$H$)UR?iz1as8MV7kycB#5tVi$M39W8XBE_NENY z7q7uOONnxjxVn9B`$2(G@1xKM8^{M?(dl~nj0YWm4%YJNu6XPOdR0}6<3Qd% z_Oj1K6=GUpd2y&tZx-LckgNG8rdTB&>f2?2TW zBhL>kUYJ`;b2;7F3f~o5&uJ?11B%A_+BPY_^_JovP$2?iT4iKdoyUw`A|av$nr=!P z88+yWKbu1wh}beUwwrGK;E=2wnvngx(Azgpd#aRatm@h!TQGPBbu{ECZ|&MG+B^3h zo)ue<*&x{Ysd+u;UNUo*^~#e;IBn)A;M+#8AzJA!aZOFDCA3Qy`phH33F~j^zP)V2SP7$7x6jpCSMayyoocy zy>?D!ia)2~FCKf>Ypp-kz`>r!@aWNy_|{vUJlO&Kp*|Tx0(oW9$*gk@L>ruO*O2W( z9yB!1H37{!jRTQ)Gfxy&k&acZri*te!dyPxzkfY)jpzNQSDc+)O&Aa`uKZ2v7-eg? zow>)SO1hpuUo!5h99Zv}8_+{qhRS4KzEghwbkt%Xnd55UOXSXbf-$wUsUV^xa^kJ` z)aDeRplYUTyz)iJKa=^#%2y-uRuD`icfk6 zgm%8mT4>@h?W0EJ<@Y#S_!gXoB~_nBETu3rlBv*$Cy9o)w`}%N?Rls=QJYq&RKZmFfsYgrKP1QA- zQTsd>J@7|E3Kp+(vAMV&-Zqblu()=`{meIN0(oRkc9T+OH{|?fj?1T;N4Pb-Pw5y$ z&wad#bs2I&iDcb`c`k8$dN8#;&qp;qR@=45l0{HjEB*Y^3M+JT+4Y{CgEX5PAx2KcF~Vx z@(YU}5*eWhfV{|8qFm|LX%&~79j_bhs)-<&TXg1#$=N7<|5{~ z2e8v9gc^qa&;l#7Dv?9^)OW)fYjn;nuk;d&byH_7-ch%A+CW`xV{jjqY1s#E#7Zod z|6nHBymOeg|Fb+?Xj99#uMF5t!d&^wM~(9g{)uyKS~C=4|3$ z1!K8!+LFsY1bCpZqzTlQY75j`i%2dS;;iii=l z=J^Q}PgS9xXx|cjhC7VpYqZj-BbT1uqU4xwH>(C8zxY`@6xXlAl-y%C(-?-867(RR ze8B&R35pRPXz2!LV?qkP6olI~9EIhQ_Z9nDq#{-8e??CIGQy(EE?rqL6eF5>-ut8RJ#6q`#Y za;%1@6TFR$`9?9cYtxgD2)mhhV2sA>`m8|G#i|jfRPb;T?OxyFzTVNgs0(?ff=I_0 z*FtYo*$E9{?9B%RFP*mKjxJD*s(afGT|?6*jul~;va1r4t6tNn&F0ljF}fs(+LSG# z@+q0J(f8J-9bQJv{l&mL<=}06~(b4USi7+=iXUpWuTZ4_55b{?A6;piQl%0-^ z^=*pkM8O0PyQ$D*M`SPx*vsKzJp*)vsqtGgRq-LfQc-lstC!J4z4>X3DjYTkz0Wo9 zVZxNtLW(q%^~Q^;zT!b~?Uakhw$-=3VU++(cPXO*3+mZEPbl4y3`@KmZXksG%WEwD09 z<>vghVLOY{pA0_a`enMbmjQ-o=X^qqwBpuD?2LWk`it*325CWy^4<1g^1*%%Z0Nmu z^R6?@KNY*WYOwkoLw2|{93OjW>8meJZ@P`H|31N72t0>cArP;Z)GC$&m~;7ka`X{U zF#5LaAH8gr-@NQM*48#a2SQCkrq@iM+X{r*g!F? zu`z&ttc*;AY#dBKSmpHWL7X6Awm&%)j2vtn?G20^2!FWn!ta2hia?P2{>POlGa(Zz z^B;V?ydb|Gl*=FYMHrcx2$?|oeq>J%x?%-g{XhbKT)hU#{7L_ik+ZikP&5L9?4Xwu z5+S5lGI|Fjq!+i+GcgkQc^3S676+O4Lqrj1?`Q!0(@qBvZ~zi|Zwo>ab(o`$Tw6PLpiGYlXn?yAD~5Kt*G>J zl@u^!JHJI!MosAyn@}va@`({c?B>q+tfHC@?k|D=fFXDZgf95KKp~mX7%b@RwnsH; zaHr#D)uSdNZIH{#MU`#CMLC`qP`#V~ zT-R#?JBkzvONV}lCwqb*{bB@9_C>0|!|-V+?H0MvI_|x%=h{B?rj8iILy`(9 z%jP&c3n+`@MqD$oUSF~1BOno!4^%_YWEMY47P>6t_;sEkja%@Ol=T52}0Yc~O`1=ft)X*ZRP^FuJ%BM2CsMA(uMEt3axUS;%q z=uF)4#E+{~>y8q|7LC3*T9X3XB8QSRCncG|5UB;1r~+#OI-1D9e(4%3qH#nQgP7Ym z8u0kRA|$#F0^x*Q|!}uFz08t6k~c^^0*h1a@#KHEln1Tf`xRjs|!BL;Wnw z_k|w|Z7AzLgB>O8S0yghhb()+SdMpMm#X$PI$~>L`@Ytg2`vyM0pIc(!3mTyW-35K z<#000 zgP1B(to9AHLT2(z6&NpnM1rC6s~mXEzz#k!Q>yIXI_uC4ok4IZSiSV8v^-7A9= zCpkI`6W-pQ6$X@Z+*;Gwy!X2=cKofC;IkUYX+!jh6g3wh3&bXz=f#n0Bd&-%u%8%cHU zEw1P`uHyC*Ov%G|a5ow5$xO}IaL+-gD<)1>L^9zRk>t(8F@g*1Z4pcoM6zF}cCNJ; zhM3d*cqj$?^Me6G{g(-a>$BKu#{;tlO&G2Xc$u%hhz@LeQ}A~7@Lw^zeBdN_{%jwo zrB1;x)aq<7;rl)GI3j_o!rlan#GVDb!=6MPx$~2cNy+o-190fmH#vKfgGZt2pW@8O|*5O~DS z04z~9JYGf2ONj{IvF2+=cg-APHJS0_0uS^K9ln|ABF^O=#eU>KFk)&`wfh%&E(op+#B!DkiTy@z%)iE10> z(4oxTu66!a5lqQZuQR8)A z)cU+#f~2HP{e7CNhy%Sewh!}rbewpcn(8QSpM#1uBS)rH7?KtnP4fex*3=YNGhYIy zXUYT+q=Z`8@4&@}KA~4`#=4!d~ zIUk)Jy7YU1n!cWikgu7MSSb8~EW@&ILaJ%(OL#c&pJhwt3#( zGCiKCC!X>yQa1Nxs?sGjb*INEW9xa#%#P*g^TwznAW#qAbHT|TuE<5vrxnbU5RNDq z=vu28E-+P$$9!z@6p^()?tnp;o?SP7U$=vFhlC{w_)GhtRc_f ztFR6VfpJX1b*p0t^Ji8BiIK5KH@TVOC~B`*HW!RfOvf#F))9JnoUbmP^`W;54Pwux zTCnT*y7&)4=BpjYRK>gG$H;z;nAlR~tUM8a|1l(eP!fame2q$4ulJOOL3JmfsG?+QDwmAjP~3YjN))!MImU;ci8SA4pHJx4reG| zA)eA87anGUUH&q~8k<=3RCJ&@ibt#=-J~EH^99vb3~5u&0KQF>o(T*OGcM(sl^t`2 zz5z~B*T`nqbM6&2K9Mj_8{fb=E2RM=kFdvWr_W}D=&xwdb9s7by=ynpoDfDs6_yq9 zmfIz1EWPn)cfzCC((Pa978osSWG&MG`eeKZkPU%6zD2A&v|q{~;(N!wpodb!zU}d8 zFiAF{++l6fn+nS@T?ujF>587GTP@Fk^Eh*NN-clD&=Vo_k|ACj)S3I{M<7 z`Zx(3Gegzl&H)d*k-%n0W9@lWu$Wr0(s<)nOU&ke`d2JRmc>yOIx@=+gQM168Z}#p zEeUz|@6uQ+lv^hCrOuMZ9Z8otg@lVM4C!BPA_~W8dU*?V6nx}Ec_+vPHB@(7QK-|u z*)Oxz5NT%lLhv=)m*EjZ-llNBPUpS`9n)D$k33?JqgMe93s-vZjqBa=L3#MgBVb_k z_^31;bT?+i$kk2DFihwcL$7lcQ9A3$fO!D~8b}fGi&4)L)v~;RUUWjyBkSUl#5|L! zt3zS3gESHqn&~FRCUax_$an~NZ&8{e2wWYwz2Y=6%|)wD;;_sYd)Z^77ZGaC&>3pr zD7zaaveo@3vZd-3Obu+pAg-&Z1@+#}L&=eb>1%!z@z_>mU-VGVbCSYS5cwR`zJ7L# zcb`}->dWO{fiB=_y<;+|Z7=o)F-Xm(sABLXb(`BWuDs+J1Y79Lgt*`r>!@|#;#0*h zrNCUdsl240b%?BNT9m&fWmDQN;NCuHzC^NEv4kDn&}5T;huwrj%k|2mONoOzNG#Al zmcAL@g|b;Px$2>ba(i*&W{yXaDs^)Z+8lqXT0oIZ)8}Old6ZW1@)@m|!1)p8VR8`e z#~~SaFkw#G#dK1>hBP9ND>I_k9X9CGJjIkK!({|4Vh<_(JN8B4t(_q zS%Xs#XhL(-l3ZsEwNh)TkPD`7kqMM314;0*vx^^+m=dtBO+sX=X0N*Eg@&vr>CR=bgGkGA_hnJ*TUl>I`2=CF zRAnejQnjj^Y`HI3Uas6Kx#0>0#md%4MmAN{iZ65;Fui7J?~2L38){}TXdLmi^)pb| z@88XQ;5;5Yx&173tYq5E#Lwl{1BU;|v+!(_WmQ{p1}M;cD$w$h>4JD0SFcs;3%KMY zq5_yeD{EOzUymbpP$vQ1H5eGHXs(>)1%_glhuM|(a}MYV-fzC1r*q)u5-$jy;mmIp z;Om+h{faI)(f6Y}6JN#I=7p1ShhUQ^xwtLfz?|OZE}!as5RD%x)3X@Bzg-k;=ChJ; zmn6g>)wNN6r==QjldB=Ai^%l>Ry+GkzL&|`Jn1kGCO>;$+WVmkd;+Ku=D|)L*ST<@ z>Ih`ZXS;9KbYNImoigZ<$;8HAeefs*CJFWeav|U%Kv)B#^L(#&T)_~6|JQ<;I0XnZ zaw&|lQ{ZxWuD_r2VC@C4rojHwR2dmB;Le&Z4{0NLUk@kM^TCe}I?uS5oF0jg>eCJX zbE;FWS&7f~D7}oKd#rNBvCkQ09uDi*pkNoh&=D!cPi&u=%C)3!^4HJ4iA1eMmT{f( z`rLBD6uz4q8#yb68&kpSHUVhyuU?w68pNQ^SyO{se_=d52=w+d&0L-_HuSG^f5*^Q`M`XxyH5&C zDXQ=K^huk3#RMB~Lz2W+8QFGieg92edzf;k7_Svh%x94vph35Q)(B$9<|6j|ZI_r? z+aea%sy2be(mNwBr%~x|u`^7_?&e(M8%n(yISpqU4%-pg}TdxzMxyU5*e=U9>>1KUHm4bIJj z_GC8lCNN59hFj~{T1~Vj*Zs>qowCEGaicV}D%W9{)rOE?1Ivii0#cz<3 zvJUCDsO4>tb}eqkkZOt>DbjqiRE&F?L+h@^#>tTzg@CzyU0lOWc>dgei$o4u9F{#- z1kCvRKZ}F3Ry9OzViTMaYH%l9t598O~ti{8Y+n|$qADiP&u`)V^r1^(XJ(& ztD7t+?^uFyFJy`L4reVOCTm_7^qE71z~YL)6=qLdzFb$GSF<(=H#iw1Y&G8XJ6G+` zQCZv1qq@Lv+MYX|95lCO0VzOsXM9Gg2rs#iNyoKPZOUYtyU z>ZrmwG~%|j4dt`)>VAv0iSW!~?6~ejFzi*v!Y%xPNy%5hfFJsa|uz9-X9nTF(T<>hp9 z*O|7FvT{%aL>N>Db!uFDl+(2$+&+xlqvUx;%y~3uYxoU!s>rWY#@O0~m?fwmIZx+q z?`-qUQ?`FPufV)~7c5T(py3)rC@l!F&8b?YJx*jQq`v4oZCND!>bxJl{gu~A4;)rH z6AyViwJL<+;-&4ZrZECyebJ!;oG$c6Kj9P!oW}dzI(_w^&&{Dz{k9EPrS$UJ)3rys z(8Q+2aXQenb7r5^I&h$F0Ji*!XW+bA-Cq@*+E1PfQ1Y#NE_{kbJC}?GS`_ZX9C7VI z-#Ji4p^>%V=y6SHb-6N~RY&&jn zwNOb5B`llN15?9>F!#v#WDXqQtz-1f@-5R*WFKha8LIn^3(&lQ5>6e2WeNk~4cj}V ze53*uhEs%jP+T)^Y+~{~iSZ7EL}0D1M_7dIWsE&_3AV*7CB-KpTpwcC!ahpf%!LcQ z|LmWqU!$tWmJ35=xQi#d?9zs~wYYXgS;h+K$igr6_-+w@i|iWhh|G9fY#Y*D6N|EmBmy_&4Pxsk!2IIZ1r;?FHUTXIEhPgPB^BilC1B9d z(6G;8QDI?GDRD4xDF2s_$94en^JnAW#^7MYfM>{H;K*Q)-2gn0sXvdWh(;)ANC@y} zV9!CR+AjcL&mh1co})lPJ%2QOXkMXOnFz;%Ubx>?i#9C96ah=eUveoQJO4{37ze(GM$ImiJ+q6 z7+3L6?9@ou%lW1qHNDmt8#JgkCL4-aoA*t@~+}$fVUMtaq<7<(8&HVcFnH zi^e?{(Se-RpX@$yPsxkY4IOgtMz`^TtsPkwG(Q#V`Wy0?Bm88KdP>Iq`Czgmtw!^j zXq+xBP7eJ`-~41p(R@laW8H;(v&j`>Punm(XJq~JS-6@xv!E0+Rwx!#IUvt4idhB) zZJ&_W5;;9R!ljMTy#5K|>AebVGA;@ql}6O%ge z`6$)q3Ps2>7_Z+Us09W3(Muz0aZ~1-ZhZakX%wjM#Samiw#skNd{z})!OL!G9suHo z#}$pL!MceOOb!(8zLU)w_k;3jcXwTM50d~m>c1O;N3&ZA+ZJ8_HRUG}{4Tce2obbn zpN>4Y#Qj$q815LS=B#(Ix63NnNBn;m{;#@99+Z9SxJKsLot0F}vuO8O6kQ*j7OMgMqMX@ZD8p*T?;S?1b%)Vm=AvGPllTmQDkw`VZ0`qb!F~ zN##h89+}%Q`oq|b7}#~-6(pT1X=CN(DrPOfW1PXfLZ#l++U_EbuqGYieiC_cxaiGxDR^2RV? z6YAc+X~_PlB3DxE*ImSvZRUnTov(Jr(At3@|6b%txBpXS)!=2_cbpm|PrAFFGE?`O z(|5vR8mM|wkly-8C2Mcsiee4*EO-+ zfth2J%}_R};z80_b7{sv7{(D-yAG{@#tLO=tg;#gjSqqCuNo^3t1yw7o0 zF5C|vWIl_$RLRfdqp}D1jSY&h%EGX!PHHZ73)R&V5aXbGH#ra-x6nF_-s7#uqAI zF`NsmObS!q$(+UZc;}9RbJn*7Bk1nSh>$OKEo_R}4vDOg{x32TQqZW5plF}ZxM<@z380vWSn-mI^cbLOM)TNe zu?1^L3uqKe$E8Pk4A3%k2lP3|d%kz=%N-GA(b(!KN}#rh#70xrN}fDj23qo1wAcUh zFC`P_Bfy5rhVVg#rHiEe>MZUIX=^i%ug_*G53~VkI~1JKzm+A5$f@FV_Q!PRz2{qjUD&MfLL;=w1GKfc^T` zdWlJIQ&eysN40&1i2K#tD43k*wP||FhjX!y%S)J!j|c%(8BfB0oWVLLUD$T&;eHwTTTXwH;J>Pq)?by3!{FZOJExv&=P=-H ztrl+Feq=^>e0 zW3@T{QEjo^+M%T4HSU^M^9=?KE3ZQrK=VONs-AjEJvW|fUSFE6&3%cg%frou({d%U zgn*O70weas#G46?KzdgP)Mf?dpzZX_K`WkJmJDXiOq4Hely&!qV&nUW`JCA=A=ryX zQk549`l!v6q!`Z&vc$S-nX(asMS*I-_je9?D)JL}SDis~MJ8+nSwVsRj{q3o_u9?Z zL$42xH>;~YHIB%Pwr9$HQC73J!-sm^jUO5@aWp$yoRT=0`t|DeBEFT>#42b+K?L49 zFt;mUKak32KC8=BUX^k2qz`g3;p;IqUW2Rob{+X{s_CerF;z6bNR zabwfIe;Wb!(a_Wo`9(}>{zY9S5e*LBbX5yM8O}}%{zv_wz(+u{Tx-x+i3xt&VR6yK zwj+N5t%k33K?zTw@pk60<@<$&h9gnEu&-F@J&B-oXeDxaFcQa?h(`}cCNQ}W!kKkS zITk;`e=M~bny3;bau^g%k+^^n7pvHr)w`)JS2L^3GVs%9nb-4M*F)5QrBywcJu_@^ zG#yY;T|*Mb`K>>N@|bb6?Ixl5D)3I%8#+VNmg0;VrGvq9!e7F@~$M+QE(vQzSN&@%6s{LoG3l^7y&De8C9&+dw~-clA0X6d|XVu^l!b^k2MFHTOrlZ7eEjC~5nvD+#n9I0*72PtO(78#xT%gWfx z2@8``$VH6W^2xyFsclT`fboQDasy@6eGUd`7u%D}x$MDGrY~7NwX{us(d2tg@b?^f z)a`)?10Q)@t{q3T+3zG}k>cKiqE|OaF!^50b;N6+i8&Sz?j#isONn^N7Vi!Y<*2fR z1SN3j6a>$i8$WMEg8rch|(&YGgrSb%3UCC zm@weMn%xK!>QNOiQxcr`(E-1tnW*v(u3K_Af+SheJNH|%8mmDIxAGrl#U34JZ?gKt zJFdV}N5F1XxBTsm*wwt-XDjqb5)T7SCHk)1{OnOLwqVU;>=Tlc3?xIYu+8?u&u z_02zTqOz^5$)se94sr*=eU*-0V*EpAEoi7%+roS-azBSj$|}sIImLTnGh&NL z`1FeY;S43Jd$divMKI7?Z|L~2s<8UzKE=N8=I9RCdF`73=rGUy+9XZGd^RKDD8NHr z`)VZ&Zwn)PLOqNlTz}8Oaql=~0QA=hb-$=NvKbWPq(fG9bqYLfuY9y9OA>$;JA@q&; zVQD-w!I%uwR!}Z}GxI8?t2WA!s3B_d>^o|uesCoXCf>5M1KWkZ%aS#tpkLqXEsdu$#UMT0ecDJ35oJc1gaJ z)KDiR-WN=dgh5G#`f`3VA5WgenqbM^uf{BBSUEv#g(1ytgWTAc!XViSBsEjgkv2x09eKtqVqO?e2RMnbo zlu12kR&q%4f{U0#5q>X$!=V`m8Lbd9A7g4;E!UvS+e!{2m`^i7-6wR4swYV#o7st5 z9+gdFvslNw8B9E}W|v0DXz>|R#&-VM6g@2uJ*>VCY0z$GP`88jM-D|aojc-qpI^hu znIF9xBF#jG73<<>Slz1Xh+o7pXrTG|=pSzb*tw+Z>Yv3QmTciZ5nSzvh*MT&fZT61 z98gaL;t9BS&633jDv!a@H&29MGvK_xe^BwWB@;>o+1t%9LoCzYyB8O~wF793O7rnz zM$qOXu{4a>w!%R>Z!f!4=%gvw3TJZLqwY=4Vn4v}=Bva%lRQlycMOc$S?Q0 z^$h1j-NU9xJp`WSgsaoaa$RyPMw_#T_${Y3b6aa{aL@3N}fU4#{_ z>)IvY$y?F_le|)~M|dK@{%`TkMyACS@Gs<$XGp*4gTG-!KI-fA&lo9#l`2gJ%9&qa znNiU5aSpm|mGHdSAUPdzvd&TJP!$Dj_xJF=1bHqpk?uJz%cD!@kXELd(BG@&L3`h_^V%ze3_DvP)kt|Hd5%cTYe)yQpN$dfYOTTmX6`uecj zfpq+4o2`M$&FMU()gN>J_)9@8gzD2R|0g0~&(0&PC|FJy_)^g|D!$K#{V#&OO;lO9 zfVdHfs%1cO^HU1vF9J_DyC`cKSsOZLbu0IDX_Q+VHRfe1Fke6SqAT-`2DBI1zKQX! zK^V@3UKmMc&mCvcYr_A%9PppA!bhZ^n2|SsUgkY$W3O;?w2SzQ@WaKoSeG#18;kuy2mOe+PjG(7p)Q;1Fcd+@l-kw z{7ZX^%-81KcffNh_dgI}VOm}y@fL%cAsr~eso~t~KM-E-LES$PUZAEyqV(bk)5|m? z`X9)y?f#C!w;xb10>=D~qEj=xe}1CmpJ?&>nARU?ahGr%N6bn&IMEX);*;ovRhSW* zMSH)?6X%oY>;J|~`bMsg)~)-zU+(1&_U3W)&vnO*?-;C!QoAV1l!zs1aCczErcKZW z5MXm8Fjqy8=jucfiWuk%x|lmCGYVf2=okOn_5|^3G-+r5*B}$j{?{A%pAf>H+I;Je zfNQcs^zWcu%0d41ve&;i^Ybr2Cg=)XW$Vk~zt6FWZEY7UQOAS|3C+&{-M6V=hEuOF zB~C5QsYF~44&a-wCWe`#u44xxvxX(VMICR?yeW_X$F9d zeUkn2jEH_d@2fko>@4$>5N?*3zVi3{g(Uf;{hE)2zsmT#FaYpZ)%X|vkG~W^s9sJz z5Ih3xH6nHAWN$pb_hbBndJy+-SX$I?5Zf<3zmP|TUlX!mWWS0%@b6a+M6xd1j?9rs zB5D4BJxA=A7)zBR<1W|MFlT?+j2m4{!_;(1Zyr9_S1Q6G5gPq!20>Y6oX*I|Vu=A7 zG|cNlh|)t^u^F1@%I`~dhuZbIpe#J70|L^}m3Yn=XN@IvxH386vbrp0aW5;C89Q9} zWITP0me`g7Fa9+9e{)jpFRT-U%RWJ%pXvC2J(GV+VPoeuWVppWi ztg1A~<#M3L^}srDWlK*KPGob~Ijp_vvAh(A<=}s3?Jlpc%pUh zY`HsbN`aXj=zpNg{h^|a{iXJFxx%DO&PJ?bMsG0QPn9P+AeT8XD@V)+g&Nn+1RbN* zI>bvX61SPoM@Q1(>i2yzmUki7chFDu+3v%#ug?*3_J=C`TJIvN-fV7vj-p%~W~?1z zJ|t0Q2ty`~gUM6h0$P_vRp$yuSg>+^vfL%qodScDDm8LES2=+cvs~&>~O?^~cy#9eQ)>o4>x-5!UOBR$hoNG{ZnL&-(fmz59#ZC`wl zt5xFkyr`+z564-e{r7(9|HJ^}xBUK7pNT)@!MC63z&CcQz0m7a3s(ytHfQ4)Djo8x zJx-VVBmIB1Glx(Se*|pR>h>6W7}AQBL_Y!s%-e#7@B1}A{AMrcyZ7Xr2S;-cun5S+ zM=b(JM9kq!nzV7TB6UJ#7n?*UWEOqdi|< zbs3~xlc-JiXcd1X2Kx@d<4VoiLZsE50=zJMfMGpM-|4|UrkJBfZv+L?+@WW)px}JR znn*dEIr%&-vIw_fRY#l^IJ8JWLy7QSh^;D}_kf2Hq*=A?-qkS1w1wS7Lqm%L5pf=6v0rVM3{E5_ zx^_>3SM=?d(u} zWF?X1c0e(4QPf#7Qq<&MB->=`Z^RZ@x1w!*#o|0Ym|iJA0$3@;Ya|r0LX4P%OQoL& z(sj#zAQ-SL&_G2-4lO3ZYpfGP#z~8{ey*T!pww7wmp4sD{%I0kr9rVXpgxoA<p?63YU~#jA9MpRA=p5o9gw~X~F%irq)^hp^ zrn8JCJEg^Q$FzHE*_5RuviYTtlB+c# zhfVcWm4f-g>gJmIGdq_gMm2(cu6)i9(+WEJ=WP~PB|a&+H?ui&NL{8GCc$}mAIw;;3O>Nf>UQssL z7U`#73Oxe)Rh|L6LQdZ`<*qAOC$gCgtelTJU8wSC?x|9{h8wm_#NaRy53|ZtLN-pZ zFjpKK@09TxaeXlJnG5L&=UIaodL3-$V8JGp7+c(F4Ik&J)z{=u)`8A2Tc2e*69{Lm zfox(#maVGayXQn)0`uA>i?K{g75`A#uH*G_p#_grRGJ&b$dEwLjf^Pcs5E6k{lV(7 zIggL9YWF6s`L@p3>lmM$5bgnvcXGH*3DZ(;T)R2Xj?qTlxA^D{^jS2nvXdGo6wwqf z0BJ=F7eODXa~dUuwPn3#zty^ikG%X+t`=>Zp_0{IG_JE{E^NPvg6X9y`@N{%h8oSJ z(?tdCBE`(iZ&x5_#sbtIy5<@;w6JqapX@g8B8Z4sL)^!}G_aQj(_;sMVr&XWv?bif z&MyPqRA^mDB?Kv%S!jc}X7Pj^A}b~wYmu?)^PKDtRusaEe0x_Lu7YO@OL39s@AJ8n z77vz`FLSs*`Yf}V(KQp zNJzP-0)P?zt=D5zfQ< zxh#sEIbQ8B=@(1&Thb#qpQ5|6g~0uVYE5el&HMY`SgJe%4tSV1?BXTfhkXXwg~(&S zn4?P6K+VLE#iNK2i^@v;4ll_wavmV5KC2a4j${6+Mzk*!+d&hBn%seC?*Qn00UDc$ zghKuaFv53MMU=oj#H&Rrc}W#;=t*}9Y0c(QrPPz}#Ml#C*E(Z@%W|V@2>GfIJ ztt+O$;jsK@YP7-ZEl%Qe{Nj|kj({>DZBSqKEfxunvt?JW=+(DIcR};Z33O$BLF)(3 zsj-yggbZAM_Sw=QsfPXUm=d9Bfmx(%rfw{&_MS&*hadj_8h>2Twea~UfIhaeMjLym;P4Heq@IUIyCOsYk`c)j&C-6drKbH15&&Z>$g4W~!In}-x zzdUIetvJTE491H2S;m4{ z76y^5w*krBdD4W`avLMv%0RP%udZp0a|k$YH{~g%oGM(5H_hU$q02}u=m9~il%w8gEORrqf?tz+$F}lOeB~B`DZ#;>xokBzARuT#zb|b6nTgi z(P&ESDm)4-q0Uv|EZC!&N~w48JV1efMr3z(;v0EqSZRB6+htki2iCLYc1WFy-^^@8 zMV|%?oXuX(&|r)-4m)uqh9=SBOdvbRyY-iIvWY0=Z0+Jp*KO;n7aAnrm8hVqb|z{2 zyNbGfo}$7Owmy!iw+6<nE**QP+EARE8Sh^s?a0<~;b&YQR5~?B!eT2#QY(Bf&o3#J4J5`_judk?OthiE`(yBm-Eqb zNIAp~dovV-S##awz4VoG4qxL3#jySWvqL{%1TS(46|y^~ox^)(fTCq%TDjhLJrTX_ zFguz+`@(91J-j?;GWxJp+b6=V0&KW$mpYm8!E4auPw4oGzy;t9S^qyLMBrO#1DEug zQdQ`_CY7;Flo!4+t6|>eZGwxk?J6sS(CXBp5u?A_@r#>*p*K-6UNqF*{?FiW5phu! zH3C0UWPAfC+XA30OlP-gC34NZ?Su_|L}j{@W5aPv{c%v|&^m^)(N<2@>vR8#+u%gU z0me$e3KR?sjdV&=_MaqO$TDRPJ^53FzxiIjpbxwAr(`1hSSnZh*}4@J6<>+{kf}Os zLvisgJHRfa}#n>AZ=A1#{}o;u+#Rcz>|llljKRZR^@cK^AtssZg=9z7(&@)#Oe)bn1&X>dSbe=MjY)w7j*vSa0OA-UQMx-Kte==mqiA8x%W; zn*=%3IXQN8W@t@17L}?9s7KYz9nZmA_PUk zVI*p*FU3`ht3B_|Cq)-)xH(KFVXoE7MuPR}mfDS9Uj#rvjLK~(STBX5qh3~xik0fx ze~VvM#B0hOvHGN_N(VE3EX$eqT>2e}e-b<8_k?ao)iMgL4bo zVPqn%LFU$CNVs{eGI0~+s#>|yHI=cw&0p;hN;HP^QeeAYW$Y7i3FRx$ZrW0{j^qbG zYw}#_8Lijk?ECTPg1Jhtp@Q(+aq(_S(w7#>@;u}Qk#`rD$GAp4)aAWOfDdM-U?@*Z_j>g|*!v2wIF@Z)+#$F_2<|>;aQEOI z+y-}t0KwfI5_|>=8a%;*ySqCC5+D!~;LR42z0W!C$UXPId*A!s@O^Z3Pt~fb?wYDv ztJnJfim-Y9CMMEj96Sw8$<-cow><;AOp<_9;$qF1H|85ms;AOSZ+ca6#3`#9#A(T- zcUxIewo%aa;E6NkGjt^*$1CHppIVk0#(BI1vVO@y&i>FYqC0>$!lGwR4OZLBq#--Y zsx;TM(=xu0nu))M$|YP!XiCk*Yr>C6OfQjRnXpCWaGI~HbFF*R{d|`%7l$`5CtPI+ zAnqY@Y*8659k^oWrg`;5h|OEeik`#v$Xow&vTigv9=aMzK?8?I*d9~e`Eo>L^XWK= zESJE@mTq>u>4`thdZiDpl~g!c^N497VbfN1<*3VghFKV*c({7iFkJ)6I+KR+TII9HOaATQcB>K7UQUZ8u!sS|H(?9YtB{6<)6Guqai@ z;5jljC?KbgKn+y4z^M$y8j-v;t@7}pY8{9=97h17t)8~hYMq6PCRRO_vrsL~&|uTUlJ+R?(O4_g6B;J`b{=Pu!d)Ax{*+OG-4p5Y&6qD9tEwl&p-j zJz45QHl^yJj-P+ikzf~15jUdf!$47FF;%U_((Q+OW|7LYT7v>_`82KTGG5ODKczq6 zW>yFXvB#w(owAD0bNpgVgEd;XR5Dt>VrZ73fv8bV%1WFE_Lb1}ZgbR%b%w)7-w=8J zX`kU(lc|x?4?5*EoL^OvrBemM){^puXQOyNT{2L!;avcs*;1Fn-m{Nz?E|E))MlO>=;yuqqz>^awQSh;@ccGoX!wBsyB-G*7;5pC-brWMiIoBet zLDkWSMLFmV$J#$RR5oD0dTtfP>k^tI*MEm1)KPVr3F{ zT3;-^ZRMM)WKkMNU$JyaImC*k;xt2p_z?#|YF?9^6`MB6784~?m$#8BOGy}S_bM4O zKp|l48k&;4olXy#yXK~=PoolBN*QVTTH8%@dxdi1;E`q`4(O(ydA;TsTlK&Lx_4q$ zUe9>CrRDfs$&iUjwWLFcNTRx3we@Hjn!s6CD$FN^Fu?KT*NwtG2a;j?>gZw7FQo&? zfu{!(YgBYPy%ksaTzi*0xHYfTm>QQyh?BL78(r)ZOe>a^8%^RTqO5g!%V@%~+G(UQZgK05t^$nsjs&Y|MO-zxNRH`pc z;+t1sM#js`6%RhzRKxDq#L;>o{P;pV?HTj?Gm!|EFdxhe!%+6UTJZ~xMkYgOO0k=J zdamy7p-vvVNd^)3y-f<&%8rMj(IVwj=Xegn$~cY;u0m=d2=snr?-9vjqgi{x7Gu>KfW8ev>7k^SNj0 z%tiX+mbIo0ne*qWj7}C*GU+kNkCZ~V`1N8XHIzn#@c?8 zxod_xiOEHq+RCa|tpW)}5+SCuhur(Xfdk@~vg6C~o)a%G3auhfWL-CktHH2%wLv*a_!_alJSQ}2;99>`EUdhOWDZ4ON??8}LTJjx_g%~97b!?O0ko&b`_oD4_M>)P;4FM+1SDS){T zI)x?hXkuZ0YqcBgQBGwmdg|iE#jvzYkfu4kL%J(BfN*$5%D`=FT`Y+Tzh>`)(Ovh9 z-Q+7ZhG*;VcfgY^mqHBOjQ&D+1g|X?kTrQVD&3U?MD-1r0^4E{UlUpdu&y(qR`A&12YWvZ;#hSGE z9^}2;{f?nT19O1>+g`)zJ~+uU(x~Ee!}w(1BvLs`scNm#Y=HwEXFU)yk2IKzUlXEC z5_rD1T}RT3Z3a9WloAI%g_oC{fxfts83kT`jE;JX=6u6fRe`*SN82v(`XY-aQK@Wn zsGvK&tbF~LLmjVkOsexBjG<6(qsjIKl3qK)YwVL6%UANE`#wM=H~r$oCtWZ1x`4E{ z5Tl$ybQs~)nE45<2dxIfjFzZoX;(?li|gir*N5L#+55;0H=Cf}zcZ%=dRSP>OJnzD z#WR1AFooE6Qn_iFUahZj3&bi=I~EQoFzY1^DM-lD?-uNFoXreGRS{#Aw>CY0!R1@B zoR`!=Er!=YF%mw0cdibc-Cf75%qu>tHDGYJq z=g2O_?C;M434PLu& ziJ}CUic*L@k|SrYJ?cbnb-PcCKFdi&lR-c29Q17G&<(dxy@+;WOi?PDyMGAlxDUzB z*1ce>GB6Fb_ysi!Q1LkR(ravZ$j+s1ELGQQp}&=qlen;+a=+7a0+5vCEf~*_a*!1Z zU5nSBnlV-1yse?#(6lFEpiW8*E{|fp=8)?;xIGiTJX>fA|9zx)1pIBq%daN6qvT%J3nr{74J zc{InLm8k8ns;bukXE@G{`PZA3M={&OL=3X$>MF8M6g3l+LhgXF4Db!qH&`-@Z(atf zTQUs?E^lmNT^bT;-I}jGXZrJAPL$&uJh(uy;MQM<(q6_*v3LV&Q z7GI|B|3rtW$GmHALtDwwd<)W_(%sRB`?*OX; zn?6^5?$SUw3Bl~V=1M79Z6QW#Z>=h1epq=%M{r3z=Pt;r@pw4^!*vGYIu&Y7yW^-w z>QUl0^{P2AjGC90+)YZwd!barg7H}{wzMD>M|p6$CvKx7*_%@%YoGUU5FPsKhaeOI z4yvwj9FG1kdkqAD0gyVG!kX}lKaC)2)(*W@dDzJs~IYjv;c zrwwviW9pX0MqqAUF0x~F@kEXs0pm?&vdt0cR1p}EQfgj`hg(|@Pp|36bx>U1*F&zH z5RJ$DrbS56@nXXrr~!xT7gz1-!`6MY`#-BydHy9QbV*KEZhAOw*bv496#ZK8Yr)5o z({OlsOoS&WZ=L2jbf0+0OXieN?uzAw%vmohY8wU3vxTxV@6QPlzxhxRDh|7Pddn-w z0r8vyt`|@1*u^4`Z*kN-X=ise$S5fJ{2EJlz_3!?b#;MmK*}T4t?(RYc%~P$D=M(w z|2f1`{LMCKh7s}-;dsBKTgRC^i<_z5IPy02B5Tn`2`W(ZXJda)p?$IUXibxsyx<;A zFRy!DP#73_H2d8HaFKDUH4ZKpm4lpH5D*g!(Bwy z|KO)Ym7G>+2UY`M;h1SoT%{EK6A_alffDBW0u}SIGL&N4#;yBhpi@cu2X}$r%*+@H zAW_4K#{@1Yz>dCIki!O-bK8|>53OlIvA%^VIRs^RF@o{OL;Hm|#rurJ>* z#_o>bnxQ1@AJQz{zKq6=g6!Y5kX@jL=!(JT6J*$qG}HYxWR*vPY&ji%98}Ca9m;Q= zWQP@~b1bE0+<06B%_g_CHnZ?>#7(otE;u50cr<4}JhO0slREI1i$pP*H_O_Vl)9oa zTK8WkPI_;{-Puck^74)S@Y<*O=mAXBPm;-d*R z{~0ni6?-04GVB0v4|=Ehj8=F90+~QHFW(-;?G7^9FHv3jH$vhrdhST4QXiO)>QC1{ z1On96__P4%EJIrPN(T7M^xhMi1f-_?uDQFtnmBC{p2|w=e|q+CVOsQKmGd)5?7I0J z(AbvPCQ+LsOyU0eIguOuL_!su4L~{R(a~6V2uOp#`C>#ybttQIO-CsCt_^O?|phszEZA@d6;d^s6 z{iSYI!h*fqjyUJ8uqA$)ghR1bRrR+9x~_XDy2cb#>6Z&yOs1n!246G!^Ocqc?xEy? zDgqyal>eey$mxIF=i+x+PStrmjCaagEx#u=SvIvw>jl5kpLk1tVmfcCp#BLnV$}cz z1w;JlB+=CWU~SOGMdGqm&;O29A~YCiooedmVy%PpxQk1P9|-@CUX&Y*3zq z+l%+%j%@_*lE4cs+>9@IN>6BJNUKiQXZpUEW;zIL3vuDcs>Z4mH79cW=;&)ab?q|k z+t5PR(q@$ll~&Nb#PvDU=A?a0>8D~x;z|$5Yoz9ve+qBN>N>@*K9bXPgHWdA^;GwK zVImJSAlpGgNBdgLPfEI`$|JScX{LQ`+V@ckb4uNH)BDCExtyLXl>ylfAd;w4fyS_JWeRgAN`zCvasDGD0Q9B!X(5 zoDoixeeA*Kx|GhnmGKcqaU= zX3FhcdLOFVMY=M)=bVu;2j)-_u9FvW)n=mHhONYdgjlaDHGwshw0xz$Zddu3D#WOKwVxG#)ju7%fw9$IK!@++wNxsC{kl04Co?3!=q<5w%KP)mB(+P@1bVL z5N7m8sSd*Che3GkaL{>SUFX zcr36FS|n3p#t{iUCP{-&1*AdAYDu@E(FK%NZ|c_jNPfjtDkq&iNK$4ipKV5lL35vt%60NM*&cg7c-B z5gAMI@E*zUV9ZJbhBOt);s`|}%J)ac4V3lW_~-UUCJrX@Z_AQ~H80k^)rJ~XM?Gb2 zGOE6}I$apU;eOPxzb2+>VYNScjg8B^>@`oW0b1kLVlUHhFOnA&A5ntDDtAO}&s^!1 zuK~dRl-bIP3>RPJjBwy9uAiL1qDob6kJf~`PyHjkcBGO~SD z=~}%arO}e9In+IP?W#semwgFDc!_q&<{QUYNTGAdd^w&ufTccmQ!iqDT&zXFqnF7b z7ksN~TJD;?A*E^bImku>BsW?781O73oDI5V`EqVma<+U`Lcny^B~wpYbxTogUk&)~ zlNT#nWLPW`DC$6oa9^s|ef^o5i|PcIQf?ct=CBUA)Wj_H%~X5TfyS9-mU&J^TS`5@ z4IlfuLboCj28n7V&@&NgP-}LOhC!8@NzI)eeR}>LN@aR&c)kQ^f*3j%zhHz@&aG*+A`q2js zG}|WCqXq!00Xbj2&}5899D7xLYTunjtq4tB_t)ofPyJYC*l6gfL~SRh>Eyj;(BQHt?m*pdu-K* z!(Up<>0qw=OQl8DdcxL`n9 znwEsxOAhO!;iXH^$^Ytt94rs-e+2mZs2C?Q0CHzCpudzI*PkuzM zuCGCS-sJ}?`;rT%)}`&rXR5Fz0aSPV-y507X;tU-XRIW49(wV6>vChMr%LQ`eQCi`gel}xGq z%*c@_51e#TlflhItW{Ft(w2<_GRse(pf%Z0k0Kr;5FRkv-%_n80z z0z@X~K6FCzaJ?i|8BT z;UbMVRvm~c!BE^;lbR?Ld#yWr!DJb=K2g*QP){Iq*1_(Q}_@2JM|veF7tRxj0O zQx%(-mG{sy@1dahw8u>G0_mJr9uoMUnA8`^+p?B5bV=~zSp;=T6%;ui8KQ6x5$% zRrHSG?}dE+Ed0+;YX61cMvqdEy*Q7sjK#u{O@&NFILemySl_Y|&vp2V{@T)iRjv8i zy8MAGQR=AUvSQV8^?r0Qvt=5GUdX7d^D&B5&OiYFVs|eP_a!oEb$tA;fv; zIGSiLeU5^zhP|CqhB%kz1WP=uk-k9O?r~7ur*A*q%wQ&bWvo-_FzQxK;x91N1%C^x zen`wiKOJ(2)8sL`g-sd#HF}!tA;AO1pSHZCZYeSj!FrT8B5T`tNNgFyX4;SbPb;)_ z*2uEqDjkZlpP!ao0_flCOxMsBL_fxPBwt1H;R90kqOW2J`w`hDB#hUZQ!RnULMLHe z%*>?Q6lkl;E_w0T80A-c^&f`;=B%e(^y#TwfO>S&kBQ^&0mMKNmgpS0x3r%q)YyNW zPuW!z+mCE61C|}HHoLkRH&Jr9QI@zgV>wY;G7$}$(pu5m8{b0-yQ94pA&>@Z=Ho3I z9AEorySp{WJS+Eo30(H_>mHija5$YZ6&e3EC(7F<>B_$FVKVW`k67i-8|R4nFWu(j zF9=1(a(`TUDBC%^LB>OMi}2`t@5iNS#?=ktx8#r6-J4{TBJQEY5`XMuGcN!0rH6d~ z`m@F#;vKO5sSZidD|U_pQ!S+&(prVdLzfNFC8`q_Pk`~h)5i*7-k12Ip>+czk}lwH4)WGhIFon8GEDOO7dhr*PBG}S>8|=R$K26X8`KRZx!%%iy4@EE+v~EKyuP>@QcLvZ?9q0Ad;^n`S{~efzzo_cr z^yfTBKn=)UqWt!4(kSKc#m1uXY~Job9IYW1K!uV1ZU?qiHI=imi?*HkPfHgEp{EeI zE8_;y2l2ljVd?V00}~=exb5Plc*cWbC6}ktyBVRIAN_A!hLUjCs=HRY8zIONDA)Z?dkqbp_{F+yavM5ZDnBxCncKWX zUXe3MDZ}nUxBqM=l9)=p!WPR7Y%{fSW>)m#4}F5X`5uuhR%`*CqV38d#{IIy^`bf&Gmhw%-q8^Q z!F#AX^&*o~M%x=h*mxI%`fP{iXnH-9q6@j1$PqKXo2=)0)0&1h2TJFA4u;&(k>{8P zu8aqf?p@qSZ&om<0jCZ9(W^`a3&5e;#loj`A3wtKyw<2v7_=0575 zM{#?0^4-m_={gi%i0Kna6i60L7;7*pyItsdF~^dP8`T^ip@S=RGA#E@TWTiC#Y7M0 zk$oE#N}MMxY`*a-d=Z%`_mEOb7kpG4uOBAx7G;#IoL`Za4QFEo&U8m$YM!D`J~<6d ziSf%&k4E?$le&1343!Kt9gYnBrJvM+s; zW!r{2ls1~Dl%`($>8bd2s(OA!!_q32%+l{OUR<;J2G&pe&@#Ms$0}H`N^+NpnHJ5C z^j$hT94>D0_7OT)pq*!cKP<=Na#lhPrZdRWmTnioEuysL*hR|7ht3+f`&=s$*1F?e zOjMD7%0zW-+o7FTg}8Ia=lth6^5=MlP4v>BoU8;^Tr?t+!_}>!YjQ|>5EDE?p8FBc z0?Sszf?^>ZjsntoSvOS|wIAoE-RyLf{;t@~6x_N){($rUBVOIAC8a9kc(nZl>|6Rk zVemi}z#xr0WtcK&Kb8HLc>aa3N*;hEx7`PEi@(zb(7&HDjP+RIe;_Y-kSNd2J!fY4 zR{1YU5Y%GO0rUSA6(qmy%~eV)kOEB@x5#^_AXU22HFHQB3bx<@3Q9f|srl?0(}%d=fL;>MYf-(&_5T^=AUb8 zPR*TQKrVaxM$rp2{Bptc>=4HtkBU^;NEmb%J=h&8Ndv;_mzmM%1kP?-;UWHyM%A`7 z>1**&+8S1CnTJQy5_K>&A->y{K(G}nQ`Fa?s9xH9-DF+8iX5V5cLP_-x1id)9TMY{*5yz(d9>gkJvh0Tc!qt-7w1)N zSnXO17y$xQf>m=Zl^Vh|n_U40#sYGxry(*f%FIH1wEfMM1|rd5{(-B#Et^1&2g7+^Q$*^)mHW;5NG|Ew%L@!uUCK33rZ1?-2Qg> zhQWzaB1pI_*H;UtrB_3;cVuL;#SMHF4QvRtoheOo35aFEw$L=#dy8)cKGLSr#2Q*N zP%dgmNM(_UmQPDa4^fHgHJ8O)%9<-EL5(BU)Z}$f9;uMo4Ger~o#yN*9*%k=Fw{sw zJiU)hupZe`{Sw^au6dCgLBBnuQ6MyUb>ht7^08{PMFF{mjK?8tk-MjmQk?`nA<0nF zRkflU0N5%72qDfesL5&DtI{k@oCJ*zkl^(`*|V}dHHk~&uSw}Uy&ZVkJW6+Y$Jr{b zg(^~5f0T`0wm+Gi`25|X3;%xfzO6rE)lnz{g7nEuvXt$U3piQj=`wJo!70jS`5rev z#9K@2WxX|aj0K0zwJmE@b90rZHf@_5xVq?Wc>JJ_I|H}rbBy0hI8%vWa1($i%;BQ| zySVp6xk%f@P)_a50G)J-=}y{aRz&XtkxIH9FWVQx>eU_*T|iQLsAhXXEiu*REM?76 zM`qcv5SwRFZMaHmxLT}mKZ{)d_!0`WAzyQ4ujt1|EfjsO zz?4ksJ?KpR7yN^G|~1Tg*UJDg|zmeAs7)qcYNQ!`Du^weL7a6;<&-a}KXx zkEsH2c!iqD8(h`NIM~Q0ijBLH=L=*M1->+RNcFPMy{ZgxP@@=cQ5^KcNQL-Cy*QIQY-6OMoXX&07mA1I{m-BK@2Njxrv7+8{(lrS`-erX zci^Xe;P1geqc^?tmJ{g~nLKx4Uy8m;N&e1t%l3c+-7WXGP_qa24r|?14&d3IfqHc~ z6KvXjC&0%XG5~H$#v=_t2q5`($2<_-bMX8DciixA?RdrBjQ-m@;lH`Rc0O6kig)hz z-JcrYbrsIW!mD=l*V~rreiw#lJXU=m%N-pzUoG2hhuqXa=)$pr&gEh4jHT-O_H1M# z{>iHs4-fUnTKh}v=s!t3@KE;G}f?u)Tk{I{astcTCtSLLjem9Vf^^>=jWCrOZDeY92^|ULKX+@0)~Q|7+C#R|dg<4et-%|IcO|_z6@$_`n!YO8(jXb7QOp zwcmIGh&j6Py0wJ;pnf11{BKx%{(a&YNPx1vCe_^P1xKXWvF=jC)#-&Q6JUl%|%ZgzH4ZI$nmU*XRb;Ib z$%^q*@tXE{@h0N^4xa68$gZUDGx2QZRH$1Te2hwp$Fa0)qjm_VnrW)Rac%`?I3yF~ z^=C<15ebg`o8&iE9!d+cZ-G}SjMMHZcJjl+I?jgZgYy}JRX|3{10~e3j;6x??}Y6X zAe9cB*J7aQtob#TA|2DMgIwiixi!>_N4J*8gz(T z^U|ZkG)Kz?_bUE{@~}3iZdcg${FHcbgAm78#V-Zhm_O(+tahjlD^(N&p0SFdKje@O zP!k4EU-a$3{C8#ys}ndbFmiNAW0vFDb1+RC1W7lu>x}CYjXC;b z%@38#jw)hlt%J zxcP*t4zN*iJ*nX_xgm@@S}Jz8?It_k*5o&n_VS2W@M9P}n-=?Sn|LAvP=x?UL`N~) zvg^J73)z3r#fqByKa}T`&6YH1c47`yWR`idUA)XGQzxIF#9hD(tC`QJISS^5^Qd(6 zAlaXJ|HX;p>F`~i17qMuvM&_z@!4NUhMfMuNcmTow(bCx4*X@2ak)r=qK|uQRR_x= zq99@WCVElZE(NAp>0Wm)5O*qUIYxlIc)d=F91sAGta_IHdhIzaAT|9+nZ}k12XXXl z!(j&HR!au%D=e%eOV?8hsFZ)3PU5dS`11-MZ)~x28v}^OFh%y*wET4saJT1WdCMGa zH9~Q>Ji{uK>Ci2iy`MHush;F%Pv|{V%w0fSV;_o^zd5T(0~CkR#O(Zr{8&Zk@Z-YD zny%D*UDOPFQ8euf_eMUox}ztqi2Fx&PQ_NU;=3fzVDTWb;&3Z&`VBg71eQn{bT1Q{ z!=|Bn17-BhLYahX3E2P72{*rsYwTdiRj*|9ED*nk`e5VXUMyXAP);MBB8%ozSRm=L zCm985*<*c&P}C>>WcBAg`$Ou-ZsNZS)$tE)`8Se3wzq%qc>agTjDM`}-+NE`M@j$j zG{n-PzBywLtcYnuC4XACfR5)RKPUL8(9DI1~MM~qFxz~0+Ox;e`a z1OvaZ4}=Fk0FB2z4td_gjRr_=8&48L<5klj7B>H#F3es8qzzrA&|j;$TJ{L-=Vh0^;A2g6SQ zZ}h4pr8N4K534G0{3d)J0Np1G7wZ|hHKG-Z<%d2fs!}#&v~$dbq|4#NauLzC37NVw zx0uTVK=P%1lCt9z07^<$J|VYejx%uXD-1T#|M-adf21Vr{lZ@pJO4uA{J>o-ZDZ$V z;R2x{wli_FcpxBtpb`cE01#4S6jwJF3ln=3ubdOZrMRVjEdTuKaaX7*|94PgQ1R_w zT=8M4PZ#DzUnpVj-3L9RwCYLoDiScSKvY`HfY-aU(7 zdwloJ={vQx>&^N%k;ivmO1s~EQ)%5-c_;Y&>nJ#7^3&Dj#`XD8diPoS=^FWJU`@E= z{ZYBI9-XJG0BQZ_4V^jdYmk8drpp`4F9f$|2S(rWZ63K>wY^F&F@MGL5gtwIADT7@edizW1A>^F=NrniEtw0f4xYZmlHuRLQE9vRR2 z**YboQyCbkBmf;r42V?U|p7uQ{DGELhuIaXUDbbe{lIIm}i8V+e6sR19UqXl5 z@GQnbZK6JCbGs|pbUHc9cnHf44>@@gb!rTKAFHBlUPU?c>sN$2Rlhsu06Qn5W3Mi| z^a{Z9an39u3Q?0GCnRH7+*aQkejUr{3Gw7ki#+@cIHxYRxWP&~Eb%0{8|QRH)G*Lf zjP}}A-g+g;nC){Q41yNiE-o7}(1g^5q->ljb=14uK9bPm1(Q~5GXpE`92Mw5vRr?E zatz5>_N6;Cvi1BOLi3>ntCQ%HFZ3s9D`%J)6)jeE8-BQ7_`*HLKHNr+1V4p#vfZi- z<{?;)s}~LG3zt4=TYe#vb|1!WMYcq4lAVyK zr|}F`b{kJQYk(j?d|W|7XM#UPRFhaP>cYO6W1Lae4|%F1VBSk@gD2RM&z9rWle70^ zx-m|iXN3Kg8t-SjFow4C&{*u_F$Hk^-W2by!FovYdS09JWylaL>C@zkDG^e|x)`_% z^W)^=p^4(o? zH9lWm<@ZaNyzpamThl{?&(b}y>K>EEvpjtK!Q#2jBE+9U_yoJlyx`Taz!=5n4dJyn+J=uPV+Upy_aS_ZE z+DfC^s=o7L+Cjh1Wzw*IwB+*zw@{04nb}dN?Rd-RuFgA*#&blo?+1?=NbmWs%&!e{ zkGIWEB)(p29?jIO?Zvg<`#S2A3*VNGUdMc_=v89??n?G8VOhlUK_pu}BxD{?Jm+>LFQ4!4Szn~y6wvxizr7kYcAOo}cRQ{6 zDjk9pkwnIKSU7+19Oi&2U#?KIs#y2cwovn4^8sm_aJCMfPL{ zzJ;XAb&n;PRg5PiH#z%NLzu)hh&oME;<%G$_|QxHt?}mtUs%Rpio9Yop2~G=F&2@o ze1#(dHyPWBy}h1bQikdCd}G@mMrp2KeS(!jY~6_4^L-5hx?C1~WWYPU3X#t34LSVqXwV2a}$szol<1E7}BN=*)<%n^fLj4z2uiu?W0XBTLx&k?z*9BlMMcxFe;NuUPDC=hBqx8eKnUMle#LTA{%EOU% zXX@+WDZI6zK2HifreDDeJU-ONfqubYtn1yW{UOQNv6E-!AhauYv?->HhH_-Ee^gfb z9mp+6ey&-&7bJobdc3ZA<0qsQ&FxTQMorL+Z|zQmW>7R|f1E>v?#LZ_)$>;2tBzco zK}5b`wLaG;pnYd>P5 zQ}<3w)oGr|@aa)RQFM&MekLl~g}s~$5{pB*rl2h+h|Uze66P0sO|jsyupgA1^d&MP zW`2(}X?+XHt;BHk&@ll635N5jFul!_q}Q$)nnTQRg-S}P48|Y2mb@HGNY_nz4Z6<;W4%U?;1SC% z9t}4pzj_JWoRGh2nF@xao22)uq?q&PL9lmK{5d!=T-J987it@cQ(uGE#WfY+c7$KoDTlw9kCB{NzArf9<7|3~ zNqXYH73=lF1%F%e9@_Ox)@gIM%uWW8G7{0V$J2>_?&YNRwa$D>>Wt_;eIbb$>Dpsy zz^?n4FQ@uv1=)C&5yTmu4`?DNDV@S}xQoC7-}c<4bWv33GO7uNT;#3a#5gfd%Q1Z#wEb z_R@=LBpxRTw)N9bawF8+g{jjh6(-)@gog;LcA;17)WL{oq zw+^8Y5$ni&5Bfe|?_#=v+*mund|KVBecPhx)vhn<=8*wZjfAhp>pCdw<#~+`d`fma z$r7>p=5%spE27?KR>^(KaITH6jtVt{%x@4eCXg}f{Ut>|3|Dr5I?TC@wHoSf{P>le zo)_vh2%8?4NIxXjFNPs}8!Pd)%3p6PJ8qyjT3ylT8{Fl4K{O|Hhj)ALSNasIs`qpP zZ0$TB-+0{VM7Ebn;pb)6CX~MXu(@gh7}j*`mMDRC5$vRW&L6?}alklNS)?tDHMQp0 znp{#0BRnEdeOv}J-0xf_&|(e)PBC3Boi*>|eVtfc9ED7tMdLZgTWzu|`Q02;w$uI& z4j}9o^!q$ml$W0!FvKBB1p))TGnFlKxMw6)q1=RQ~;nH697>7B) z3xFGGW2iY##wZ)OPqcN1dIi?53{zPM%(OhvYwUChTW3fTYofi`kE?qP)SGUw&$|$) zl#j&Ln*48NZCMO0=1b?=Kx(#qN2QGscb~UuZp2h>D6awn3~rK`o>gGNh}uO{`!~#K zf}6RVeWHrJvd6XA$3yA`0-X`V*}ZTO7pt`svL3!14doUf^xQrqOx=sUwdbrf+kQi_`&r<8W)4ot&xa719J5#Ajpys< zX!&uZ3Jwg_rh$`_FRym(?qZ(gwxKJLW2d}bTL1j=B30} z?Q6NaN~`l(&QM%AcPrPP{&IT-9F5b%^@5M5seC=4GXq1p>}Cp4DP`7z=?LmaWs>BE zc}rEk0L_jyJ$0jv9~-`j`iS&Gt0#MTXG&sc$7xYQsnRO)71Q}@&B7rt$;kQ+Gmhpw zwlF)CP#J}igcAm9m-3VFL@a3tb_l-sa{Kq-rR_GXPDSDrB=lT4MNf+tw#oH3)l^*# z4v*SeVm>&{U>fouDXUl{gHDM=RY+M32Ovp&{OcJv9!SL>`wen$5% zIEO-!5sRyjswTZ(kcg(jqY32M8$7x^%ae^^$i}wx?JkY(e1yi?PG_rGdiE6BI?{dU z`K7eYLS@&9=5^f0(pf?vs%!Qc2Jp%Kb2rbZ?Mm$;=&DWm%37Gic8_PwVE6YZta)~2 z_;rQnl;iwK)DdNbB)J9E_#P4xW}jHLnNQQ*#e{-6-tR40r*YlKAdRG%yhU4~nY}ff zKvq&ie&x5-8;@|6t}*p3_+!~|7_%kLigzsChuL^C{zlJt1UF9Kzg`ZRTn}A2j@_yu zTE(b`7j=tW;rLV>9f5N1VFwvovj0j~9=1(K73lbi3ioN5-Xj_xjI7OoUepHi?%dAZ4`yFnDr zU(aN?C^&hze$6K=4ADd(wfuTrnuCjzg7cv+$QcjhjQclv(%g_T4`~1-4fs+1nTw;D zx`i90O>EC3r774nEWF$(*yQX@tSrQTKT7<5l>4QrIx40>3$x#<)Zygequ}Rwko8M* z)ZJX%&D?(Lk1GW?J4B$jlf^GRw6gd`IfmS_Uv%kT3q2^+;x=xs&n#Rd9POPP9e%kF zd=zXFj&_bN>P{wRkg}2%9yVqcYBG@a{CZi##l*qY($U2pQZd_uMlLC#@t}{(TG&`w zyHNl*A#&8+P2GNNz^^@eXw5?>*tBiT-K;4%*m)q5eplnUxw#-W@~0kuKYzatg()vB zCk+J+4Fv@a`GdM&f|7tjfP+VXheJSsM?geGKtjPpK|w}F!NqulhDm@+NJxN-k55cS z^O%@~iWDE8f|-JfmX3juf#@*{I}1HK4Lt+>FG8RZ5fM?4P;gLCaOjEgiRu64&;5HS zEF>6AIBHmEN+=jCXjm-h`yMD#NK=3RJXmHB5aHoqVW5#9-|AsPLBqmA!@;1UA;BOb zz{5lO1p^BQkA;AU{e%NY3>Tl0M^)3r*)6FSiIZ2u(lsbCxn^P#kBUw_^>xvvS}*|@ zx2a2AC!d6SLD!kIy2r~6LK@nTLNkbLVu&nQNYxM3LXI$S@UYMbkndQrAoW1O!NbA8 zz(Df+k_8$D77LdX4*Q9!GY6NL2~H5@+3U{4nhEhw_lroTIbkT55_HqL{+ z*8xEgtbepJK&p)SoHDxAo=HXTlz>E2{V=vG@{`Q`CsA|1vBcsLtcGURb-vHA;i2Bv zUmA*mmDL~%DRm$Td+9N(@|K1<)sq5_ByV!6a13jwJ$nwq@6~@edmG;mNwHk|0o3;}e1&Rr>x^C2{#dqu-h^3Wr4cU$sm1)c|dU zzI5MME*auB?lz426@9$WFJyg$xSGJ1bLqTYNVRyE((E>F*&#qgYLjgQV9Hj!O7P9S zE4+uoBt=1I!FT-Vc}-mx*eCLRuexNRVfcn;LYDqX86Z`?CMHAd9gg%DgGm+i&2cCG zb0Jx7Ni{rQ@w)K|J;o|$?Qt2GB-u?ow_Q4!=HY(iA!)w7_wTgYU)vnTWmHddOb?+K z#7U5*;`HnylJc&`S<$@5AfgLKnbtiKp1nBw$X!2^uwp-<*~F7o)e<`)#^W43M_xr0 z3B`H`p7pS2GPEmcA3Y2hJMiI`{YWzL!m!P?dkxL&nQB3B-HEn}A=`9X3FnRyjpH}! z8I7ta#+c8`bn%brQOm*Zy@kpKHYYRUwcx#Hqe%jcjGihCma?nw5Br6z8L^aYgsg04 za5SfuR#egLX$2{hst6>wy|)!qZlC7i^|hZ!_u5rfmPF+pxwxYayF0!rbgP+49P|GU z)%P4(%p*Fvqyev5P1met;V@eW=QD3V3ky|-(^D~WBM}-7)>*egMjBg2U`cV9vkJgY zquQO@;d4I%#}0Xb!L#QD!yei7RtGmLyzm8#;E1DghV7&Rlz=RTgB;~^N~iUMM=(%Z zF<#mo9UG;r#A`B|+LOzs9U2l`CnKq0!m+L4ezMDFd}A<}Mg{TH-^AM)|d8@ zSf+gWrC5t+ZXs_DY+{l(xx$~;lOlYTBkDY3^d|vV`gDvt@aP&*qbGEI>F?^}SclP* z$q2c4_3^)X%|J_D-tG%{F|Dozr{mb(z%GY8gBvQ9GhM!fw5| zH~YZ>y*PodQJu*%7Tm)7+Mi(0$!~ zh}5ozwyeRmOWe5*d9GF!g;lQG&j0=d2@=!@{||KN9=cs;2)QdNqG^Z-&6=>nlQkq**3A)o?M zLJz$t~U@+_CxN9Sg?F z`(`cHTJw3HIo~<68orboAdDfhN;V}y#Z;Zx?_r1q8dsmQ`Xkx4GdWob4+R+1!p5Gj zV7--wDp&{&1DDl!1h<5$BfAU;_K{`_u)-%rp?-Z0sYKlE*(o8QoRv+Q5#_QA|y%ldz704?_xS=<1nx}iBjN!Z&9 z^oCK{^z>!njNUgkOeK~0jaEE=dR#?PuQej(qG#w-%gNQSIyD|7M+Ypx5=uw+=4_GE z`elKcpzNrGYFnNJ&S9_Gmbhd3-kccUtSEa7;}fbDxxAOTlZHIcIFTDr+mvU|x#`PD zx_~E#y7p6%6Ag*aE|hdvG?1xk~LJl?qjHYsXtRxz*=gaB>KU>$_UL;`~bTo)1%{ zN+ZfDmwdXpKEulpMVBLEm}h%p12oIQgMZRuwEY~z0 zr15aqT=hHjidn7<{jJ*6GKuOY807jXYJG0@fR^!w(nt`QliP<$^HX0Hy|xFEXCa?h z$=HPkBgs!F)oO0{Q|4$4cj#LcG>sV=D55lOm63rUCNu2;X!=H#3z=E%U?DGJI?X{%IVg@xXb-Oso> zkd1Npgc!VH?7q_EO@&8SvS5SWRUQXUiQ){3N(v$w6m%R6!nu-$PQmzE^O0kE$_rk5 zRAFW~hgLaUMaGqdPI~&pm!?byaG~j3x1sG~L<1R`NxDJy+lwI23;!;-MR4>S;aJl}m-4(XEZV>Z zbMXijlw4uQ!G&19w>_Xl{*lqNVo!;@OX|u!H+%epNe-gyxIG9XzMAww!tVp)*MkMo zBQpktEOqxEY9}E_hA$iY?u6JDed%FMBUMzMeZ2IT0M?BMOs6mLQQJH&sLVh`Cn&6#X?V={VDgfN4LvTvE$=ntLoN#NnQ<3VkkRHLbhY?rl%jd7hsD zw_2H}6KKi@WtS|KZ3ew>hT}|fgjk-^eHMRg$tz{5R%v*qZhwI-a1`+bZ$6}oi1Adj zgPA|>?vB#YrVKb3!;iyT)g;d9=oKWcG+BAjoYm3b4AEV=S`l@UhRa@Qzg zQv}*Ktxaa$}x+B$&88DMJdD`c~ZX%~8*%`^ML~#kXYn6}DOq2G=4T0+^7aS9hQQx*IjW^h# z%7!($Ts=NVnz}AhnC?b;*Dv>fHO~*}*p2gix!^Xzu$ewrd-L(_#ya93YUPDBo>Pc8 zh-^W5;skx;4oRUOK;_;!4gNtxVC#kW0g@{(2dyuhUXH@(8H_{tuEmt_%~B_-$QMz7 z7i9~g-h=_qS+4rshD9{(#FHwrz4`8Tt}VZV8nq7}Q#Wjx^+$hvK9Q;%701|h#R>d^ zK`b|$F0OT-=o<`z{7iT!Aqx25%~XApi}tk-Aas2heIwarOTRy8E&<-*Hs(G&-osT+ z$q=)eWRWe(irdkT&-o}FK5S|OdcfuhGqHn!25rhnDTuCpaaY@o~#^QCvfrFuU1q@)X$A$ZKs~M2$4t}2z zhKC}9n${i4X@wvPtKy+(pd}3##X(JX05N`n)Cgm z0U{|IZgNeVD~ng-6?)>sT1P^HwVWLJFW^Ry1(+ri(I9t_crs~;T@q2T-EwZwj&n%V zr$kCUJ-#HGG_mX2c+_JJiNJ?#pC)IAKv8Sw?LA@c%EGmNaXXi zjC%~ZrY2=7vTDVJ=;J27ja%Ie+KlwGjl$bj4|u(S^cIY5 zr2F&Nikwt0Ms^~;;b-gqPL>l1qkWc0xd&o5Y#zS)8XMoox-Kaz8NR6J@J3C}y*S5W zYm+%ww5Y5g&n;mec%92{IdUxw&skE-#-D(cws%amRK1|GScx;LYmm6 zcVo;ULS2ET2!8wHY12-ZX?Ert3(y)3uc(ZcWQ@&vRa21z4#rnbV9UaOTwqe3Nl70_ zpiFbq+MW69Z0J5=3Js)K-32OckbMQSawrZ@pNaGEm&o#k)45I@IZJ$@S#=F6qViX$ zZjum!aO=lHcw)w5IEqU)7>Fq>Z`?NT11eDj9`oSikl!IE{~vL&ZqR8KfNvD=fDFXB zK3&v!O8;SiGdxQ5Jmuyp(PpO@qvYckHF5nqeXD=GE-CsT)_FoG$50N*p(s$*bOtgQGIslEhlAy~wd50gD~U($GNjN*}dqw&;IdL~^gr)HJ6Y@Y*a065^2(J3WkK{w&{i=!ocRut<&m zxt{m}%lB)T;n|-65i!qdg8}?gHAp+xjz3j)X4uodT-mI{TDHX<8azuRF0l7#*uLhG zyHt*rfw?2)nTeQXl5w%~?t8IJp#V~1sBboasnIV?ER~&sckDD-NVy+uw-}Whxg^<5 zKqk#xwg}JqSpErh%gcY1+FEz{HTY57bN;r=;pjTh6<0%%u+!8<(M5QNe|ZJuA=FrB z)0wfSm1b$gB@H0n`9yS(;&KEmlsjrtI-gZPF`=)bXj|Y8#wdM0++SuzYDxlTEogA? zu4{Au2%^cGNW{`ox|-z&?#e7$-;qo++q-(pmt{GAxV4k1o|p4MO=l)`O6#&f)e?M?o$1w57K=q=mZDWg?X0x5PejXQSm!t^o z;Df>H4J@>(4$3^@P&4ngk$6Hr{A^80`wm-Nr$p=`oL!7HrWZYeV2SH8cBwNk(1+~S z5(tYUiu*@QTlwoI0sv02F1Dvm=5`i^#}gkg)7yKogP^C6R@SGNRO~gK`v^3XHzc*Z zY#)_2XitgdRq1|uLGb2;TycoQ&S*Qv1Um#vJ8^av?OmHYVay%9H>Twv++ovXlrHIl zS$-z+hvR0P@*L5i*%O<6cU+Szgwa4){wP19a3MdwAfzn%MpnENwOiJgvsvYpzR*A~ z>!~KI2@|hsjncX~o`lg#uflXZZK0LMKTx;=q_0WesFG0Tie;jMh`O1rPN}P#*VWZ& zMSaU2*XOk3JZJy*w(yaIMP_c(rir?&b@PNV@4oDpfg}RL8s)Qy536a`?<5b!oEL&4 z{0gIftf!0NGNiDeKbuL?&Uei=(vt_JZT07ChR{`b`U+n5TdQ#_F5q2tv=(lIL3!xS z3n_&Q159P}qg=~F{q(ajv2XOB<}rX)5?lbF>IygSYcrJLjiFwtj{|oxj`H z^qWKqt5n}i4C$?FU8hKRr!=ZCmJ5B9pI9c!@R)oT>37i3)vHfdKm76$2YWb95QlrJKA1YlTTZMUDCjR2zd%vnpzAt!l6< zzMs7St&_wA=(Ml3Avd>f_c=~^S?ZxhqLe%^U)Ec#q$;0&S>ndUsoV{)#0|k|T_E6Z zBk(*kaP9Bfew()q@>0$oXBLO-L!;L4w~0!xr=+=4wCH32f(bUt-FgJ zokEld!s=~R94Bu@C}pTnaj=OO?LH>!nJl_A73w}4o z4*H-tC$kP~v$2NzP^1?(G!1sMl=tp5x_SbWdc%tYdEP^d^JT$h&6qc6c%mUHgez~A z6#_Pbux4=0x?q|3C_30OZmmQ`nQ|T(kCKtPus^bGYO;O9IOJcbF^6u6wvis=a2!6K z4}WozeqLa6;q>Y8#lUxc2Y(5*nmFvZ)L-}2HP;xi<-zLCOe7!d5KjNGv!!-^8ocu~ zX@^PuJfF#UKHMWZ|GO?(>E0)yS&^XlTsaQ={Dh@Wc1h>aWv7 z3^7ysgqCvja8FZ!*rD?rqbYs`S0dVkW%#hn1~H(+!V=&1CrrHeI&Yd1`N=Km3v<0G z%DJLaO~o#N*0ir zrGPZNhR!3{;&p^0CI4_7X9-6Ugze7Xq4QVE8=|}#AGd799Wo7tvl-j2#Izr0c)9sA zQ8Xcqx`5|*ppUAIJi79@%()%>{qz*Ba2@ZC)T0Ny2k2YI7k2{|>Sox-&~$1qs2Zwg z^0$>&65;D9joTQ{zz$}D&Tz91)Hd~IYN^L`<+(!u0#Wd|k}5E5aV-!RZ!Jj_g zrDZvdrKzp;!gL;x5v|yp;9ddgKj`ir44IUjZWQNdW*6iqq2zevmLfsDhbp`-z(I;kFP2be3%c8k#h3smr}6Y8Y(!5~C|#cA3LF z3sr*?hT;%5Q5mEC3xr2=%0wi9LaAql@)zFe>W!Tr>ZpaVvMZSju(bs}_XfGjnL-Cj zPXmLQ?E2pG?CoxG3R>GX0Yb*F?rW_(auemL!+vxuqJ zvZTP1TS*1_;G&a6-uLnOSM0ja?509I=>zIq#MWjRa~Zyxf(P<4(dOJWi00JF-GSJI znaDoZ*4wpkFW-f%^_r9iieq-$Ay|)XqD44W=OY#0R|3y_mp>~7N#t~t5#)vo9HF5+ zHAlL3A-B^9FbTN2449~+V_I6AkIuJi^Qs?I>4DYVkudIOF`rn?+PgXr`cbw^WOsr; zgoP1>1^l{1#Qsxr^yHseuG^pfVI$tA*zhnw>%P3in7tGluYNlscG%R#Fno9*DWI}n ztnten6?-n*g4JD-5kiY)HvRvKfl<1)MQ19Go5+8dHg+cy^DZ=#-M!jhmQ5G!FS7LB z-}*I2d4Vk`X}9Q?x$-#4`|kUHIyWSgMqhJ;PIxXME>EF=O|JEfH``cW3 z7H$@8*`{bKN$R%U?_+z{*6)0Hr^?gDL3lOBL2Dt>85Vds$!EE(L)WkSt>Zx8zW z@M(C_w5FHmyuzE=yc*b?dckTmTAxwI(%WQFL^YP2O6UC72LE%b|6jFO3STpDNa4@* zB{f#kF@>sX%6e9=l=I9nO_zrl2!A6d_kjH=rdZaLjPG6*yOR$IJIKgtYU0x?STQyt}f8D@OYE!`qFf zo7*Oc9qW8d??y>cQ7!4^porq3Ann>m%Y#iIHL9!1_jShDcEgvgl1Cj`_WF8LcLhpl zcaf$y=h*RL;nJ?b$-A%+f^FpVIs*I6GOfQO6=O&$vqECL5|tfc)nEvpcA?-ERG_sc zAKoL#$noTQ5@DGiR9TV4pzDR6DxQV#G^ex@#KA&j&Ik>0(wuvDHb~N^k5}@qpcYtN zhX!?4EN&YE(2>50My#iG5osgsV+RjW51-k{htkXOM5Xfq2pC9Bm&eoM{I(v#O!i#C zDzrSQtlhqXOecn?J242=H^Z)*4PzJfGG1VjVBAnJ@ZjTz6Er{!3C;NtS@aVyY;9|v zo3}1f+rX7gKfi_1^iA^?%RF!hN~wXoH5{I93%})KXXg>%b?ndPz}go(IAF-CA&a&v zBX`WJ9kGdjRhVhPV)5w-@4L^8=eUtEUf*1+F_-Q_?UPa%46_v50gaVKof9aMyd!Rq z!vhRfQs60$Ffm&kJrw#30++(3M?2grW0Ptbp4>ms+3sD`uaxk3kC}ZQv?Z%M1xnPa zAK{0Sxj0Eu%rH=n4;X-y;S zlw^V2^G>V}*LN?z1HZ3J`_wAW=S*}M*c5Nl>}urSs|L9*c5)!daFY%QgT07-=lnF@ zm{91^BP;8tt4Y)I(RLUgkNP7e%#WT>)(G>+-5_uW`xYK)NY)U%tfxlr;&~&8HYWto_Atd@_719Wr+Yre{H*vdSFk=CKwg5;0zumWM=A z5~_X`+ebRhX|b#h<9K(Rl{T?)WT{*o73;Pyr$W*kXq@CX73*gjBL=Q3v>Z`$-L$Z* zkQOtU?A$k5t+Tx29aO~$Nz$K|U`c+qb-Ss!U+lq{I@D^tZ9v}1lM1#fdVZa2DM?r= zWQPSA9fe0d())Z)Hpoj9XN*6nMhc=&cmc$Wxs|P3R;tu}-}gAi6WL<(hhm+Eg?&iK zcoXx(6=xp2-EU0BWsNv$JapNsg!SQG|J+h!h*N(MbqYnH8VpU0DYEnO?(@fb(%8Nx zwImjWnJDAp1`#zm?2}auYUKU|By$$ceAF5&^zfwAHM;QTBesuv)5OCUdB^X)-kEwj zcsErtYs5WK_r1*wlY&kw-Ttbp2dUB>OY&&Y}-lUQo+fmFEkkJUx z=Mrh@vKm~w8yAwc-R#XqLLsMnJ5zLN(&_nf+iWr)L)+j_zzKC8R+^r5n~hNtoAM5~ z9TRHhh^iZE(cX+`+MId1+I)*H8#|)tZ0UTq7A+tMr)}SX?vM(p>sKx+xEEE;@#I}a z8*2A9IazX>ze$SzjWT33g2x7Fyp*vc1^B9*w(ZPM40<8=fuM0)^z2eYmxO z@d>yy#u&s zaNhc=eaV_#H*@N36Lf6%MwzNv1z*J_hERD8B;gyzoR0WRjfR{)Wmr@2P3^N<+t`{(f)g{PhdM122DtUGlwcFGA~43TeV^ z!FU=8UAIN%_J=g+hCin{GguK~sdTHb`Rabx9Ux2Z=0NU8Z2q zovNf-{=>N3v+0ZztG2}f5~wkp*M&U>Sm~3zro2NsShOc3jPT+G8H#(*GN_wty!3rf zbbbGGCEVbyxZC%15UJ)y=#$~3-V{4dRP+n4ob15SUIM{SWh))gj3}<;B6pq=J^LKp z3FG2aL3~VBrJ~|?Ohb-`$tjXY`b`%81^1=OrU{8mrrSLc($v>$_z&(e(2ImBuY!mV z79@)^jO6%qOyQ>|NY?v|Za;7194N>&&h?eR*|6;g|Mo*$Tc*sCZQ zcnr6M88?@XpEhZhx!rS;_LY=u8a)d4bKRreklNiVj3c3ZBIQmh`Y@qwK*@SL3&oQ>TTGu=E>CnRBrxH%#4f z&M-W48Uvy$1eM{sdeA-%WWDedoBqj}wZf=y$o#X7749C|)&(*5#BZbECzYELRs+Rf zxEO@$-=2Up0>VR{Qv?iDdMX1by8a^)@b%}K2;sbD$a?WQDiu}N&%oNxxUIKe5fGxf zFOhu4E9#+PN*L&dO4a``JZrbU!LeIwsNLXE40dNmh{L)hcDosrlDwI4Wc?zN^WE{Q zbWJSkjqOr&l@GyEA_y5H`cW-XQx1;%j>&MFVkrO}1a5ijycK`P| zaD6ygOMRVwZF8xh!H`Z)(9>UA_OHUF!?Vuaa*wHfc@2s=Ll;NlhalVa z;06Erkrv8|au${^)_;=Whrb@r@%t3iMI-n3n!~T1Now|Mjj5XbOg6=mue%Sc+Z_{G zSh({J{#20us->XyU0lcKc2hEswT^BzD_>@3(-GvuaUx7@iA{& zyy_QLG-gGp9ZAU8<@XuqplhsM>9Od-74Sog_@J87HM*5^tJW;IqIV8oz)lc4C0W-? z17Q7lGB4$HcasI4wVsU{iyOVWnsjnp+w=_`X`*X>+}~`YlKmjAUriqfXKL>3JR`^; z>Um($m7D!)Xl2|#=?Ih{75wEg*o|aiXL~J!RPDrLq{7s_Izk&$bkJjG`Pm*P;GMW4 zRa)A9rzr)(_zHqre$3X zA-bp0!rL}B^D9L%d73p_d4BfP{Hsk{cl@AB^A{LBp|T=(Q8KtQ0S=6eczOM+3zB`$ zehS+>lUF|Ro{Mv}ut`{>ue^vw1-XWCe}w%wNxQ><~qyVVQcRULhU zWtwIl@|Rb6V;7-%SYG`o5_`eVL$pMM@9dv1d%^KP#s#l=*u#8txBH8iSSss}cbvP) z=HuDCU7EVO8!umi#xB*T(&bvFnatM1po(g0OStTZx`b5tpiW;SwvKl4ae z{FOtMiFj({PNky7Pe24o*OA#CtW>MY^0c;{?m?2uJU_7S!jL$Fcirhw?^xVKT;1Ju zti5PAsU{_%^F~_;!7|+E8%I_ZtwXXnCh9@at^ucN4{`jke5cwS_LNA8IVL_PKx;cu ziI=^WLnks`DxkCJv(s*kE)e@rIz~FP{8Y^`FVvFC=ha7Ip?ex}21tq3XUW!EGEYxu z(D<0CY+i&1+$Z`P+rYJTjRi3(mT`)^7$q;w_?|Vc>U{gi3fpjc5KR1)PV4=<^>w@e z3sG5$U6C?w`b7t5E+D zZvF)9UsuW#Dk&lu&7~~IeH*D6q zQGRe*Y2{(*A&84?@02Q zBC7qdh6ECIJF2Q>#N{$e2;`ZvZiVtMLluJ5VK3(h0CS{lL3E0Ko1I%#$tp#>A`w*C z^~RR+ZXVlBdhxBd0PyV(@{(1Kso+6ip*<` zgTUD=Vmcq+aq-ammR;pQr|NXF(`<;5IS*EpLA?Kx>OM3C8W<@Xx$*W$)fB3rq_MUK zOc4>Kh_twx<>Bqfw5YJ_z3i_%a1Ot9y*b8a1{On<8hm?VKYiSndg9J&GnG&?lc;y0 zsXM!^m*{#OC;Bcj>At2Qjc22@ndp(T?8%gLVvB8Yx&qGy*w|{IP``_^{*X$Ed2T~g zl9U8YbHe`r48I9{4KLKL z9)G%^`0x{;>_N8Kz~`I2HE_DeXxu5jU)EwX&-SKBXY9Wk#Ou;mez8CDWd7E{ps+zK z`|o`i+GoiFRQu|NgkK$BggwA$@8# z)gu39-i;~eLh~nJt*NQyhp9zx%TQmu-)K_mjsn}H&!bJOO4G3LQ%}WH!K6d!V^}ZQ z5mijxX1Gr*RWf2}EjXT1l+T*6RwUwe994t4ZrQ`BtGyb8grBwtYv*~qhebyU)OGZv z+76U}K6VzSQ)UUGI)pzYKzj$6lH{I+`X3u!bwBv6T(YG8;(dA%YX_b)edc8LL}8gR zzbWExf5kr+G5=(k#ed?xb0*K@@=x~A?ywr#_TO;vX45|&-wXZ)EcJddVVxPVy@#Vm zO4FRtOqG&l&Z&9IVG$gD|9U(Cx!&(}Y)tYe?c5{VG3?-?_X`Va5DWX~Bly1`>2F}n zsUY$jk>dT8={gMv(Q(eIi3diVEciB;eJ#f=n>&Kq`C%0p}L z|pIz+n57PK2 zYg3AzVl=2zAIX(hNN8r+$L@|%*~#gq_hJZNg&}$9g>2cvo+<%ZyUg@%y zQQHU-h3OiOyr3IHt50!U=A3Ohm4UtT&jz#(tsf0Q{xDNh@bgqtr)(!^iq&uJ`7*ie zCA32dSS}Ag$?b$NhSkvt>W*%fxQ!>E6BA0qb;+%CaZNRFx&cU_p}((Pzcq(91qE$u zSVUL$?*r_{uh#PB%$4x_4`Yy$mk6W#JfxQQsTtM?A}s?ympf!POXTH;FXEbY7cW?D zLk}A1PD24Mlb?M1#9)4s1A;wU@(Rnt(=%Af{%zbcT+=wdlsH&kjb%zoBaHn@*gjV>M)*q#?`+t$^0?DERDuE6^6Yl*(k)SdfU*fBGKLUvQ&Jg7U1j{P*P`U}GWXn=nVNcM z(w;+5^E`7>oX4KxVV9tnm-7PIp;`6UPRN73!vAzEhr7;~6qZ!ybv*loF9)^B+Q^M< zYoZTzX$7vylrlgRw98*rnH$FPO9!#=G5$LC{#%Wc|GN!Un$uL2<5|Rp5LJYIIte9* z=!+$1<*kL;jGNAzG$v?_V;2w8OX)#J(EN8)=d1N2VrOGi+ieGZOsd9!r`?8KZ3m=n z&}R4Mk+V~&B#=d{3)iAzxp7%hZv| zz0yB)aZ8HHyIv2B(#2p6_iW4t$dNfsX>p=~t3s&DJI5t)%MlP3Xf(?&;TCg?SjAu_xc=hjFyyY0eFi}ou^=_{#c_-h|k__Sbp0L<;>=?92huASmagnnOOqV$^c+vw#C57ik{P$&NInZ5}l_ZWwk7QdifJmDpWO~kaoRzgz>`q>1# zbo7d2>7+*q6qPK+A%F2`+A>Mhu7cZPANfWD=Wy|LO_ggwqrC@eQ4unvN5nX^7)mx# zdmo-ndM)%;dpcyUgWsro1O;8$wJoCq{Gv$w^IEj$>pcRQ-a0) zCqf$eQ)~fu6jhetxJ7#QYes@bCJ)n(JL75)W+B-(V3=)d)^4w(Ey4ke2`5pJn|~ag zpPPDis2jZT1Mo_6!nZ=Zp|mE54)7dh)4F+Od9H;v7_ZU3uGvte=#Dr!(b?WJ=`R8G zw{Hjm-3Id#55lGo7j`CurUoR7U-zI(cJpfmtILF^i}xArfZuBG2S>Y#z(vxOfR+}a z$&5UKehlXR56!=EL!4kAwUshW&)dl2D&?4^EC~Xm9|C^ZdFF8piupW~EGu&~8XRA% zaWFt-RU7oU9q*1m{>*HJ$NQlCx)Mah!EDIFn%Ju7GMkTs`01rmDF?StZ$ExZRnNUq z*@s84%gnSGS7%WRJUGxWRb^D(W`gnxuJQBf{F=M-d9@k?FJi71b(b< z%h@nhLk_$1W+36^x*J~WrQ@3G{|x9LYU5}Vh+iv?#_f`LB)e>6Yd`(AIR0DWf`n`{*Q z%~!aZy>x9@-)YjPO84C+IwY;Yy^=$OUdXKhmHb%%Aftk#ZKLim!vJxpT$bgjJX7ej zGbVMNy<9~CMWahC#I&bxCEMUCO}9MN-{=HKG7r_fczBK%k9|=$081PnrIXQ&lyZ^NSTK>ZCxmwA`0urjXCmLw7V2sJ_nG zp%Q1$V)q>-$(%iZ#8l@E(kIm$RLuN{Z(l`Lag=3ks(|v}BeqB+IL+z53`7lJ3B8sP z?{`M^=gP{;N5t*u!tc{xTol#%SOhk+zTgohWMw<(8fuzx18fhhE8~T>E5)Cb>0tyA z;!>Q&F!5brb%vF7nB5Dzph$+68Dm4JGS+PfT(j@4}@<N%2dU3AHtymj9k0xR1rJ;QL3X4L$MZ`QBPC9j_;jcRmO zxwyIdm_S8$=0%75k3nc)$%Ih}6LreV(?sqY+ceIyUMT*&xJe*!>};-6tF z2ZG7x4^N|)Gy0ONA+m2?g%#J>HE`=yjvxEuLx4?eyuN0WRHBSLqIi+U?Z5qDVHUSRB6Omlx;ubLQXG9l1ce&KD4Fd02AEEvDIK+VlG@y6u|PYUMR6IhHk zHOUjNB^&H&>QoF(=f@iw%{b>q?KhS4tK$wp?gbD>p1@fNcfS_k^Ns-)A$b+o^#xlJ zU!NN1^3lDlywdhThRC@j#tWh0-caD}zB;iSTnw=BcKTAhF*4=5W#X&Z;jMUCc?DxE z<)4nmn4#agzvKRoaX*2I+U~H3s`vj1TKr4D-uly1dd>O%;USIrlZYvZ{6fV=)PqZV zwMos4U&zU2ng0Vn6R6bEq}yU_{q>0?#)MvSczV~@&*S#bHoi%LY^CDy-kM1z#A3s=%E#pmi`YH@3&TL>EXRT8@F$v2@IyNIZH1TL|x4Uj! zAjx4gj`k)o+m*d*t?CceNtt&)0gNpd<+fi_t&V;ImiH=)X+iLc%8}1&$A*_rQloK3 zZ5qKwHk0b zHn27qh9R|dsgB25)icK);<6GU0wae4MAE=!8GTiDWXyGOUz&EfTedWbM z+QYk*8xB$qB3$SXm7>givrw90%jmqIdVI~Htw0n^^;RU_i{vc1j|r*e@@8V$C? z$~lD8s%{jr<o%d05&1k~(Y?b{L72+qrNN4?0&z<7wMR9THvEJBlnz)k1H=GW3 z!uR_{K23(@J2humM>>#L+u`+Ld9%_QdAQ z#Ed(M?|no@UMBO<=UHhHbn7H2nh2(>FCJ<(%TR1Jig-FQlio?Nnr&=}4QCDTLN;0x zhAnrzGv%RSW?W}5;5exN;>galG#Bjq6CiAeYwcoJU(Hzl8i5=pUPYf8p~!d#zQ4y} zZ5Pv5M#jnt5U*LJw94{XAAL&!&$zEFVGC{SFXnpte7BS>DHHbQ-tMsx!$g<-*dik% zfo04VmTNq!SE8 z!Ih=l9xhX&5_5iz%Rd2}W907FRRwxqvh(i3LTT3+Xip=iwrl#(3~I z`k`TOTP;XnN?KT&1)p;l1EQwy69WS0GC=pil_b;knso14P1}+y95qb|aSpp|zIh($ zOQ5D9sa(eRaH9~~C2G@1elTpYGO?>w zwRIYrARa$%KJ{kxYK#lR35*K2>_QbP-nd`<2-$Gz+g> zpw5$)2Y_OQ&707jrCK+#mgR`$?7$bYIvsnCu zpC~P}_PW1}Z`L&<-;5|J-lbH!fxKz{WeDwxwQU_F^;%r%dHCtxP83vr?eOsN5;>id znki4J{Fq43*MOl}nqdl>Lo*`m*>&bxDJyXHBa>0v0iCj!P0al05)!k#;qjUh-z=+V zodTnRVNR~6bzcK~LId61u)v8O3A?Ofn7OvP$~^(G+!)gdfHHf=9gK3?QD5J_Yo}i~ z1ZgXNCGlq5y?QU-Pee5fbc6k_oaa}mi6?CxUEC)qb?NAFI>ilh-q50&KD$!ygrUh$ z9E!nnPoIFr&(5v)m$|eQWcuw_tyjppXypY<2%?${HrK0p(Pg;^R7wLnAtB&c+j%Y7 z{eZn3PU;0{@mW*E7FR2f7L2$j98cQN4y!RJ`iOzMTFHRGJ3bX3@BD3{+W!P7Eu)MD zAo@A(`IS{F3>TPjyb8zWq_}uL`3(Wwbk;ETV9yT(UdTLMmtk$Q8c(OuWToo(QJoHY z>qsXz*Unb#>KZMu%Rp8#F`R7~oU8OKtfSn##!5{AeQ}FuXJ~BWB1Ca6DzWl7{XT>I ze%pPEGtH3_kW@&4=9Gd|`--k>S!}0DK0-;QTDQ<^ogeT<_)qFw9yQjyM3%? zc`2=3%`!?ML;A3~^0Xt5*CT)TCMPqCz){FMLMn={b2w_-@$$2v97lKR`o+TX68;a; z?8!^Qq(Egt$u}`3bZjq8I6%=V4`YQR{Hh?@Ipsr8LaxbBCoJRif zklIjEo&m3N;oKpgXd@Fl(maf|KvNV!I3l+E-mrwE>5^~3U5T^sY>SGGxECg1>*n{3w6KzFWm&jNVS$cabD zSh%j(iw!lAGfy*yKGwEH2t9t|w7tQMOMD(EVR-a7wV`1qiex~%>MdXYcL8J-(&mTE z+UO|TKtI~;!Z!KVOf?wFXUHM0T4cOOc-MIjaOA=su({Y~lFcj9IOm-=Q61i?6;inY zjv^iB^9eV$?Z?!-SD>dmYH1YbWwT(a+ikA?K7ATr2PKhFQGmv!$1CVPbV>h|Trii`@Z!AwC!^ zx~~kQrVoJxCEWxMs~HojjMRtD-x0HnJR!?LjK*?B2t_uzvXef9sZAe4nuFzJo)L;2 zk32nJNd|}wc#3>G>T3(gb^DPq&6}1<1$A%;&z`4s4$96|X`xpc1Q3n}HxhC$+I7c9 z*$hh8$A>ZqtoMT+2Gnho`MNfYO>`Nn>8e_6m@bd1aHZ2D*Fhf%;- zZ`ZNg*a61a90S2jM8*ex+-Fc5s-K1@7}{>-G1F3v^ihc(%)MYRbKkbg(D4_SG2r?{ zaxq2OJ}#rF#Nlk23U_o?mIUIglIa|7I%ryt-jU-utVWlne5yDj^>)E!50;hDOn9^h z`?>@{Rs__Z2TR$)b}(0L92->eh5k2y&@#44XW-=N}7;G`Ly#K4^7>Gg3@QGUG2H zgO$5H%Um2J-5d(NCA(({8DV_`RsJdUH8TunHa^KLK8I_yxDP4_p9@{%YKjj4DRsNG zXOc^={FD-Q{PJ03K77%(0{Kir%+_VpjL_BW>!sBERfA33tw4r3o_$7?l(BxQ^n~7Y zd+XL8E_BAsE^x23?GRDouM(xt%XxzBIKTdw3b=}{_}bGO2xbKF za|u){qzGPf7oVgvOSI9vb6IZeux^c*h+LlvnH$^#myYN{1-G1QRK0wc3ag@IGa;-E z75XTUlui5bGwdBMAuvRlc5{#ssJjnYTPcy(@r=s0Ra215ENg5V1;rTOhVbLLGqgUD zep=vBIOErr67ShFaN4=g zcf9C_iRi9nmQmWHl31%Vb!aL2KZCuY$fg<*`bY?%)x46@RZnRbW=2wqT(uyiy@>WU4PW!?^JHhqze5(2h%sk zZ>}t)9__(vSEO3}GFYsrWUjT^lyjgJ;e!5{3 z^}-`=xrm$Y|6uREqnc{lbzhJwRg~UDihu|r(g`Tidj|z1v-Up>m}8EahdJ`hanJj{uHOYC zckD1{zDrvOx>muB-AG<24PAWZwWROzcGJj!`u<&DMqv!slLsl?)x_B}{KHSoX_7kJ zszD{WWniYc`(jK0F_gf0w3Y^8QgT~x(Gq^J5gafpQdlv23N2|;-}BKjAU0_vOiVwW zo28+pkslNuliuXvkD{&%TQ7@Y>KiJCNDc1|Vm1k^y|ZbrcL@#Hm9|V_R$`8=IKq9k znzwl(o^tf9wi2%r5#<^Voi#9A>Xf@6T-o}JCylj)aID+5hq`AU$z8y;xlz2B^rxf%hKCdxss4O$iq-IJiHp3EHX_C%Qh+4gEqjlLGBgXXOH$ayJln*i8$EBZ_7EH-M;oi8&DLgC zbT?K|%T(-(r)vr|-qg@ApcZ{S*%8sw7&#pgyqOgQ5!x8lDwk00{PeXd-IbEwG>RE* zZ0LtXt$Dw|d9h{eaOirzCasFM(KOkP+iSk-nn~_ZRg}^L14@ZY!Xq4ROzkiC9rS*b ze$C>Q3#vk#>M_-292t9yXczD%Ogym8K;v}l%(v97X& zG$idryV$;2X>-9>OA(NjCViSs13${F1*KKUYQZffD{GFs${Hs7Hslk$m(1?~ETx@! zh>{ds#7j|1?1xV-?A@oL>=RnZ05m}yL4(5^YT<7#D=cml*4$FlnpG|9lVeX@!gl?* z`X$pZbFIF^O0WE0)9mx8_zMQ1q5@cm65oxN_M!>$5RY>|-ERuamkh6I3R-h&Q8>(- z)o=uxklVw_nA8XA{prpyQ9WWNmwK>FFxuiNq~@Dlo59!n?qz=B;Be-$wEXIg&2MxF z+SH_n)2ZimJC%KxW)?_nVQI7xsO9d1FzPRc&!rGD1PUCzy`v-2gyr1*ji2XSFf*#i z1+W>LV|9TTk6Zbr8CtzZX{27t9>f(Hq1imETb}xCE1nXrWe>J*E+})ir>1p_8$3?9 zT}pBkTV)mESAW?=NqSHrc$5D| zas0V8#{8b|BoP}n`^I&?yd`h;gSN_B7?Skn#4>mxT{~RF}y>@ z4rE9617CaXmTGfRE=wV^9)S6q-bgXqcC&_}`spiRqW{3;q6EWO2nREOP5VzNm$ zufbByw<~X1SXG{^(W9LK632!pvd#~;B0J}E_IZ5<9@CPndsVxPagOml_c6kCSg4de zFslU9OHf0nA1H}K379uMWje-afH+wn_VB&j(r*I6_{*mZeZL+)+7VU^ z6LQ6Efr`qjVfR9U`fcvlQoE_WgHhN!Uk)KkWVb^yS-|H&vKSL1z@{Jc3D<9ecbl=a z_~x4KUinVN*^Gi>aaFyacQ4z=dwfGI{I${mwL1|Hp~h~}GGAc!~p)nZZZbeXAkCxwf{-M|zB@XR)>>?WdNSBRas; zqNqAxT|)cjNlM3T7xOl8@*@~=Lgbgn)JMNIUTEUkLUSrJiIX!zd~&!fag*^t?Vqb3 zK2WMEJ=st43kqhscTsa{QWA&VZhWcaXx~;SY!PDH^TaKCG6&h`aKkGo*sw*aQF&lU z8vf?PE;2>i3g2iJiFi>K#l5BT$QdF?gX8;34Z2ikr=PC1c9mChiK*1a#Z14bJ#Em@ z=T6W-_mkOvViyadS_?Kyc@0Wf`0G0YiYq+xuePYntAT{@Pt3dU(xJMn+6iR{q9f7x zx?lkKQ6KJ3Z*Tsjd+{P=_C;Yl_p#5< zyO)|y@Q%s%U)&UllIRe+fDb#S@JlPi%jafn<}MP{h2bhnk>^ua=j^Ae%*O<+n3qmw ztl)gTz*dxz!r1U^B?wm-`Uc0ozm%3tz-7C}2_^)|!lJZlvJi7i_ivdPY7skbQq%a7 z6JLluZGHR3+GRc0e9Q!=v7Y@yOz6}SlceKf#pIFvMhGXkQ5C8ic*maXadAyxPGL_q ze5};tO|$u)q*mxXx9!2={1TB~R?;2S7wO{mJPHisvyu_jQ_~Xg^P#1(TBxK^&-2i1 zo;P`3LqssvhY-R}lW!Q0genviQzHp1EB8RpQl-dR?zhEp-6ZTLDP)%&K0^0qefItJ zcsH)y6nu1u9;n4tn@CYyVWCm7K^%`(N{huvW1`eY+9QMI$KNIGi8R#|=l3I;)GpX3 zSQo6l)^{tBz&2wGSCE8NKUPcgyEWR#0<){29Y~Wh0AckCRP62=KE_qkmErt^ow8c2 z1YI!mvhfvI-VPp1%T0i~?mp0ml*~XuIm-;{hWE5{zEVC`UVp%$kT@N}T2LQ;%UsI_ zoY8M)QPEAznTLe&vp-7PB;r~&-jes$t8j1c^W>-f1OM;X*96p@kHi_o|uO9!gLMqiu39(nCV>*{ZLnR z;>W830f$QdQxq}sCIR7G4KdNl;~n5I6hoTu*2HLPgv4k|1f_=)bmL)v7DmRroJ{+Q zZj&^~2yEWClHTBVl}##lKh`t&unj*ie((Ds;n|yU!MKqM@0`0KA+^pOb6oAcpiBg* zWr-bBHc*bnS1tPDV8bhn#2IZcJNM#~hN)7HXP&)aW^kiS9aOF6o4Nmqu6|) zsqD_nT)ycC9AAPr5wzCQ&fQ%Ek8)$`r=(z*eAJ~_Ng8a+ehcqz<>=dG9xzyqAYAXF zqJ!M?F?Fg_sM|TS$b5d+ejSa0D~r#`b#|5pdZRWZqkr+=K>sEXW3;POMt4Mm+ANf? z@?mv3$S?5EQ<0}>uk8$q{3WX^idk2h78xqYPD-NYI%UmhEY`7>7q?D)IXHrgD&dR; zQ>XObN+DSH+>)FmZxSq$hIK+T=n=d6Mro`o^4^ypo4*O-78=|)cyI=e&B(8QKl!M* zBq^kc#7G|@q}#@HHIA#ApPO)yX5c+NWj8LidDFCE%!x5dKh}Iua0xyasA<-qG{u6F;Z)c)Rra7ZJZkpD)^{ z8L#$kjk1I(xBlA9dR97R!esu$U#BO(Z!kDbs+Hh3K~~sLp>e;_IV?5!O@?0pLKsIH z%rPT*wF7gmD2tSc<4Mc{LL154-YmE(W>r`P@ZQ{>|8;j;4K3ihTqmB)+CKIeV^>c^%3b?NnwCW!xl{SjA*w{UQy*dS9ARx_pBoJ1P4y| zc8tLCo4TI<0X9`uG!+3Ll9VKf?O~hwy;JJUZNJeIT?;CUg74J#`&?)5`6Bt*f+W`^OAaxA zdtz=0mJj`+=F_v(^=RqfBJx1kmHBy;=pc`S`)x!&9zOW#J^cadqhtZ|x{F+w`ot1# zY*G%XhLr(>CxTxaJq6IwFtGDo$;bvCXb*6m9`NkgjKWRCxA%C!pUiZWiYl;zRbf6K z`jT8os#AJXecNWxdZwx$1s2DPsrMw)&6RmdHMEs$5nTmsXcRVfEw{f@{oS zh9Bi?IIq!Oi~ccPX;CPA8LKrfZq+V{bZt|-)WngeOf=Af+@$7p&k0u4$IUo})QihY ztIid>jda9~6eTlh<5i_)YDvSQkTcz&#DZc+ff7e?;SvJE8wsRT!7>k41wbr@!!d?k zn3zWe?ggUk=$EfJgO0eyPB(iwM}HGseY;Tfl~6kKE{Agrr<-)$pTV#Y$#GX0Xz?a? zVN;Uanyv8|ZK$*trFmK!3>fE}MxG0h*(&lS^nKK|53^TLIcx=1zi?@?&>H%3hw zP&yDmWLQW@g$f^-ZEWe}HI4gLv`t!2&bqdY9pNmAG=hjX<*KnfJ$f`j>{{U>;}s_= zJmNvpin*CgQ!Ac$r-edi|SVepy4!&8w^pciCVj&!+0&yi=|Gq7##36b+h>f65X1)Z2eJpPlCjIIyBr{UDPdc75Gla= zdLlu~MHpcCyCG)pa}6LO)>~6aRtxgZSEYW{&8S z+7W?r`-cvA3cKh>ySn}fbn_Q7z7fRNymDk9rAq5N z6jjCRLo%_P8hgsD#Jw?sl<_Uay@q+v{#k`qBAsu!Yk~VD6V=Tbs%S_JNyto0FF1bG zzIl$z+t1kV5D6d1iUzW!o<8vTBT4^H3BS!>43E?RS1lK;S%KSi8n=EEVC}rFq8YO! ze-k|Y^-6pQ5f}&|4XH1ZG%2n)fn}vZ*6$mlbqp`x+`jcTa*)8A>sI%tQU9VoL+mEM zobqVC=;CjJ*WeFH!64M=F)51Z$Jim>Q62VnvcCEXQadA6Pt^B5Cy}UK*e;N^vd~yg ze+s%i3K$e{fUvz6ABAO_wKPifMiNJ;GxHwo5K5XCZ~MX0cUjLr^Eoth2It&*o2k)- zpFgEO-I0Eu4Zur9PM!)r4C|CPTG(8|BtG-+F<+gyPHRy_<#)xztid;#F96w^Z%8(= zBqV@WA9hiEdv@!c8=H@R6I6y9EE&&PmBnN^OEnu40KY4PiJe7!BRr3}eo|&s`ss{b z)(aaI;fw#8xdNG$3eZE%d5=x5o6-ai*O+!P<{G-z!vPI` z>wU?Vo0|mA5iAEqK0p-Ay+DjVlY27VTz4B2Ts=oK6)?yvEOmXBXWS_Ie2w5jY$Nxm z(pAU_DNwdlTv9nz6-7Qr52jA1c2gxdhY_@4=2VcbU_OR-T3T z`0QCj21p32%BxdyP^l<&%T4Lyehn-q!Q+e}G1<3D*m5{8CR)kTF0UGIbayMs=8UmN z?-Lwe%0PW&moK<~OlO>q{NNjs7@oX6>oW3|F+Z=>V&BJH2vo^m=+=uF*z{jwcOFy+ z1haeTpEiMuZI*ZC646Mv!eoyxm!hjYSrBQw(|4m%{&ul2!gSBk&2m=7@K?G!C zG>;-QtVZ$c1)UNjl1$77ygFrK1YU8)fijkyR71w~H-e#>dy>`O{7jE&yl+XwJ7jbk z4U`4^Ch#auDNq*{PfSzg0;m_QvqJ_4BU7| zEw84?xMN!wAqq3^+RqLvTFaHqn7P#bWavu$5OC9|ei2-T+h*f|9QPm75D<|?t8d6u zBx-0GS(WY^zoW6gw=Gx{&ktCx_RW04yL2=j`Sk3qA$)wp$*|g|aYXW5p>EnQ1ai)G z=bU1f?l%Fs$knJL3IQh2pPvcMLuqae)T_W?2Sp z6E)3QSE2-c&uiLA1MJj`Ri{VRnv!li;r{h`_(+zt83P^*!>{FY+TRO#e%f<uf}5NQ<7DriD^}af$n>opF3(r&<+>(58MW}Ak{v{%=5bsMUM9##{tcg# zX;cZu{bUHyvdJKqx;?g+XvEQ?d0^wBFymNEpz@r>)|VQmZ+C>=)?Yt}+!(l{SSB$& zpy|G!xmOP67CNb=AI*<>a@J{|eFLb=s-#ud2eCG0rMN%l+EFyio!>H}%CvsE5m#in+kN@!w(iH!XK7osh^w9DSwPF;e@bA&0FydvVEnpV?IcZ z`nCEpKGwiOn6{ucP4nOg6IVbJBRrXlmXjaz?v1ozV=T|_u=&;$ufEM@mUolj%+Hit^7@JxtPnu=avWi5g`)5~CuJN$8Zpbf)!}%9=8KK9%z5u3a@( zR4^ykCQmv&L-VMKk`pRGPT1JwK}8!vwd*@(s(+tA_kx#hyo_P-nZ&-83g@gJ-zTHa z_!7;)QC^0|>if4I?)7u_ezT;MURtH0h_5wp9W|@1Ig`I*q2$^$tHoks0^qn0mG3&B z20Tn_@%P~eJW=!-HF^5e^KKfQ@vmgZ+fEsj7Ly*Hq^mMxK4Hv9HJ5#UIy#t_ek6Xt zn0obo+SF>4k>QW5FX%M;Mw#$LQ;SU-_e5I+8Jn8A(Q2eIzRo&)ru65bj4|uy*fVRz< ztVdreyx%2SIH}5>R^|a_VKl;KY*k^gP{M7X?yMBEXORHM-R z#zd>4PB#Z*_>IrT_P!R6`iwmHZ;~Fc5b@Lsxwlxjco;OvB{E1@g5^ft4<(<_zPiSA zqHplV_MM^88(Wf(p9)zLIElqqV<)2NCol!GB~8V(b78q3aXXb?2P=v|bk|v?ZVo(V z2Hlxu;qns7FA}M9t!`L26$1c732D=jMz-i5vhYE?dZIYYz<*RG~?#x&V6d%uVHuk93H$hz2Vd>|M3}hQsdE-FbYxt9T24p)|;8{W9K;S8e{?bL(MEns3gW8ROJ%VaYH zl}mf}IcBD!`H&_k%py2Y?sLXIY+S`K_y>NI?uE?mrkUhw^jnvFGh{)$l{W@uoTZNmhS?uxKpZrDjUn|o(CV=~oAF5ng7D}({Envb&p zE`lhKpmIT+(rag3cTuDNk;&rF@er?tx= z49{W$j-KCY*S$VCCQ2GqNm+b0SA4ckliz9#Z_--NuQNh7GWA)tk1udMv)2u2j$CU} z-zw)R0^j$WkbIvkj6byu1$Yp~^$2KirV=mB zqHkN3JqMc1RFNIsKL@6iWAlm6=tzV`(~0|;Z?^Tej;Dw)4pYY2wip;r$8c<1UvbYW z?ZHR84~Sb`W*J`Px$T>7t<%#sFe-|twC2cJ@DK(O6D95~(Oy-;KhmC2Tm2?TLjC*# zbQ35yH@wH9L*&YKTbYk8VreY2bu)?EaLUNw4GAAW^g5^Y;Vq)T?BG<0^KkT!RlQQb zaKmH=yq6o)sky@-j{$5#09RWz9k*lp!n z4rPD8E7FS)7+H+kCn_UcUTK_rjfh#l0a;bkF=Jj~0q7*t=Dj{Ejk*_<#Q@NbzkA@u zJTU?2;_CIV+3GdyH4l=gnL1DyAIfY{;BY#IXYSAAKiNze zV}*~$Kx;XZZvykg>{7L7Zg|mBCBUcw!_)V6(Zjw*wT4IY zHk%c+My+Yp#|^97|1mA6JKYg$dF^y!cJCd-&2c4VrgNaaH${`sUC};SfkCxXPx=cX)jAogbaCDz=N#a&I2G z@0_9N^_CYoljB*tTGjqc#E(&q=dPdMeQ2^CpFW5yHx4U57YCjx9n9p%V&+k+V#FRYQIZivr491gvb>J zw*$(A>6{ycO}?Aay_G3PmJ*~z)2s{MN*fdX zg-f6l{Sq$WVK2FDdpLI}JS6`FbWF)Hyl7MDL9>8K=HeOfs5N`0Dk=id<6Y zD>gWEWu&77y3Ec%zgw1|&RyoTmN0G1Mhq{Tit&cRM8~4@A`bpT!YTftAB+Mw7{;X00`TXD0;R~g+g5E zn3tb|-O~zP{i+@TdE&l(rks~j(+o;qiqON4J=92kqB66raaUBb{Rl0ytx_2XbnK3I znEv1r+vNiBpcvuW{P$q4uanMgiqkWiZt%CdIC9)tyERd<`zgVPrPqagYyJmh+iMz> zIp$&02+j*9r?Qqw>)k-vlF7^uxHe7~z88U^_!!rq-~-y|I9Jz@)k+ruiQ-D_Q3j*R zeFFs-2YcXi7kf+H!-YZl?loG&q-oi7!v)E>pSKI|fx!C(rC^l3H+8OT z`O+i+jEBOx{(-$GLN?kcUeJRcbt(e3;t~cc>&9D60mFA9-RcSNknVSS8{@T6^@8@H zD*?NSZjtw;$H=#(ZH7xUFU>RbxZ(pv1r~;(f{g+Pfo7wwe(weR+OH%b!zpf(m zsP*Z=BANO<=)oyHA405L3lDV#m&;dyJumN{jG;e%==a=znqpCZ7+;2h z9e>EyoiCZf+u;XiU2*Z($^U~muK%e$xqm#g|Mic5tqvAD42PTBFCyjz%Yz&wH3)oT zQ`*NT82{#uA=K;J_A&0LtldUK<9S|o*f&)Fi`4X&>y(CxbBFNxdP1x0#iIYCFR1u- zG_ZJ5F1W+Qm4$?_=}L{Rq%u^)>57OIXa!+cY8W7D9T#mEa|H?;?7y0lFpcI#Z-KUL z9Sssk9meUjZCcd#BSuuigupEpTl=CXQWTmYWeqt)tL}-Har(`BkG-?pGG$klo=iG6 zAyG}{A2#51t%n`?ZLQ<-3rf|*8}Cu3qqiHep-SaKcFmcHxE)Zgq>`hZ+nerwF|h>> zXD(;T)jW@cX*s*;(_~3g0~5@uw8%-2DCWua#lA64t^0ZqY z7R7}_KZL!4+jp`PPWn0cE z^=CTTADdLEJX(uxAje~*@wy)qEF@O*kt1gRlZu6q%T{TAMZ~E7CZ4TWs)pS*Lf?zuS*e|FFeAHJ}Ql)Kc#z_UV^R z*4PbCOmdP1S22?&LN4`g{TLpSFqWcZEJOjXp$D2c%*;qk*f7#hhOX~Mh2``=L`^hr zk3q4{xhE<_{F&sIpslYPJu@vd>k&sDdQ?Xgv}(AYiUH`PX$(4zl{GVnTDTL-USL2V zvyj|!QwpNKjM5DzW~D|zDE&J#<5Qw!U0t%Mv~MHup^}$TUjnf7X(Kg|=_o<#j9kcY&4PWQznZG;G<@9}s1?5_+@OFgOPgr>nDbkw|bisWm9 zA6O?(h)aq~i*a(SGjztY@*DJO=yC8w(nQvYi$;H8TxHj{3yhJp zN_Wqcx|*?a0fzO-m|hjVps4J8aob&(1-;F$L@ZKR^3bS7fsr|@jV+dY5<(ozG*u7H zY$Bp|1W4R~UWb^HHLecoJ9loqjM5tTq5pF1`NbX{zwCo2@65d%eLh)%1MP76F(j)1 zMEXyBKFXAm@o*hzRscf~fr@6tMqRs3GSAqN5T3}TXkyHI8U|}r_y7aTG;bU!vrqwk zKmSc&{KVT%E?bRhGgcm-^qkpSukiK$iRnE-k93Mw#RPqmA^s<9SkFQ2Xg}K8T$0uy zD#Iss(7UoXrL;XE&E* zTFrh*weY6dQ&U8vmFr4jE%eYpe{e&t?eJVzg!q)SF?FrmLiT9fqoB+eE6*WblWezs zDDkMrIvLqNSYX@xtRJs|=ptBa0TyZ_ z7sNX-lgffF)SqA1YYPGop+POpJR%3|YwY+4u($q}W|ZN=jtb{W2DhA?jstafB6zrt zqyg#qVJ_u`g@sXRgmJcsb)uXljke(AE6)<=cnbWj!q`QXfHJH)l^k)ZQWumnt9Z-;wm z^R85M9J@?(vhEF&fXJg}vzIr2q5fV~1>Wqf()uy~+J*HvyI7Wgc=*CeUfFlpSbnXmj5N z>$ap}oYgH$;NmnObobWiqFIFC)!!HVd&See7+rWfruI@HORI?@%{oiK-KU{7^zAbq zZ$Pi&i^BnZp+obR(+DGd9HVQ+HfvV+l=I|t<})dC`Z4~3-Z(P$C#$F){lI^J;X{l^ z0m8yfd_7%vaBzPnevA#W}oFZ0TUy{Ew!YkO%O?GeK7A}KMQWxQPXAZ!hXf56Rc(&<^4SSAHP$T ztM;fF)|`?ZHhHC2X;+r?M@D^v{l9E(__iF&@Rlbsy+C8O2Mod*7pqWu?n(B-Rxu9q z!fUg=D7IK7?r0Wq|NwPe=_|u~vxnB7;^<4agfL@^eL0E(L97^Y=}v(QTdv zLWUYfbjAuYg~0p37QyZOeMkGiH#AtTl;{KqZ^CkjKcu8%w7SeMCRM!gv>wSijM$Fx zODuiMOO1AZ`-bBM-6rAQ-`nBO&NaK9{!_2eKM^unDPr7QX|>)@E|j4yxE}Ap?3TH( z7G*hkvRRn~1)EpyTNt8%x}W)oy^&2U_7&v`DLS01S_fpGynXu#rI%hrl>PgQ^D8Z$ zGBAE>0a06->v?@Jq}bLR%%@{&2qh^ljJ1hA*Sp!+NcZnI7hL)O-Gg4IO>cKO_yQ{S z(v6HyjQ3wE8Q6ScJ49{lA5t3pc}MyWGNb-~+J~aM;pKmdaBGU|oG=vcEGdY8w&Eha z5NwCNtO*Z@f4?%OqjEvOgPdML&K{FZh8Uw4p*8?R>2kXm}5%} zg(5JBHIgz!>6g1B*~O0LoU2>M7a#=6$O)58AKrl3Dt}*C-t48QKv`&goDa}2&~dK> zn_%iu->Ks3Bi>DiMo5`N|b9 zz3hT@cXy#C>LOTvy;0aWSLU4NidT&W7t5slHFx=IAg1qhiGWh*RJbFc!?Ne7}9(f~n>04W<9n>?iEmOh&= zCxQu#)kUv7uW07*TH2(Gn?i|kKNvuZ9|D`!tpx-y_mn__UFGAt#P+AH%yRQ`HO`rr zNTXgYqB|w=(ss7J_KEq`o*!t`ACIC#>CbC@=@XiJaISfk;Wnz>(4Rx1`y9@Jj}0d) z14c{RfKiCC-vm>Ep!vZ9xM-R-?m9u^IY0BzY7~vASYxKFrmFz4xZeS?=Q_9a2jrB)|FES{B=d?l*LyFl}Se~=vA}jz5F>?9Pkr;5`)>aka^=Pwa zbt_!Qbux3&26!srCwXzVRbiQ^c<`p$U8}Cu4S!lsv)xC$Ww!F&8~e_BF&W?Es-Rn;Dy<_$JEhW-?W3%?AEO3ObS(bM6j zBlXY_x67^Ml1}i%%OH6}m$OA2=YBHV?41T;EF!1Q&*1ys5FP_oOhkijlj2ynFTP$1S=SKFRy~s6kt_^jb9vrxZGfikKzUuV_apg z;N!Lkr}|%(+p`|@YwE{X4bH1(&ToPqwCTCPf@w2manm_LIQ5zqLmJL~mu3X(n?awy z{8f5PS~T3@l%Z;R$_TB@Q&}1l)Egb`XzNAnBQ5WCYNSVPED}>9u<^Q=#vzdgbQ~4U zg>H@)_O2DTD%3Vn@&c3idicMmU+a`MXCc0J*vn7D8NNudB9CcGR?}s>xEumwG}a`5ntmkv#7?UB=oL$%-p?Z3;{zgm zI>+$#Q2AbZWyivtB5zU!T>WcB<_2R->)h9Fz)##7!U_5TP0^rty@G1~mIw90BI!9G zn2AjfSGLE5e|3K(X}*7~#uLpwPgj?KbqmhUPQSU&BC-}0`G-ZlKH&m8CFKTWw7 zJd^;(PoKKSbeR-p|4~JI$`+q$`=cqk@KtoiKdNXi0y4riXL2cGqsu6qiAuxOdvwky zLo#r^!v3w|HPt>#8o(+vu?2i>({nZ;tF@Qd9}#~#fkgIi?AIY5S4BcNwIRG*s1yev zWVMl+8sw4RW(96;3)8i$&UX}e)i-kkISKF%yfwNI79=04i9Ua;bESsFrS%$c;OgOZ zgJZPbZp6C$A6y>LNND+v@wLN;Dtt#I6)}%*E#4dYe zpO2joym3#(x5*f^qmc7H1^bPmfNN8gcWe2tlK8;kwxqrl_x&chg-SFc^Fpn-#<)pN zqU1%Nzr(wz0`pDJPlPpc`GsU#Jg^}A=RKZ4zz+6o0;gmv>(*N*l`$0|h@cS`BSNm5 z7AQquHQEQ!{F8M#D&EtwG-WTseW9#B`S5WpLGljH47I9j?p zaVzr+3%=w0oOXpoNunKi_o11|Up%L6$|sKE&01CT{`Y-}y2y&$6Y=GJa5iluX?-Vy zNn;}<67DbBg+>iDG8V3h=K$jwkjq40UpuY>M!Sq@Q&_l$X&u?7kd9LP_e*Gz!Noz^|$ zH-YK*^CUC&q}n8ckN@m_|Kqnm#od3w26*uQ1zNQQA08nwr()wG$ZBO^pd#)q&h82L zxD?J$iHLhxodbTXJ0}_FQBYkL>Pb&0nTX!#*@tP60?~DO-uy&g^cVz-h2Jy$+K^Y% zxJ3?=eZ%Lgz8aUyHV^o2XR{@VsUEGB7|knUD9w5Dx&t5BCMi}VDe=4o_fyzRBdA1t znzlvn(KE{#M?6%vm6z+?r#+Eg?^*T}^ktJVc1Kt*Vp4gAsXv5W)AHeb4E1Vi*Z#q9 zHd@lxq7F>xn+DY!X0wae{Q68+M=oL!ARRd$nXLLKS6~6R+k~*w7p!j7kB?C9k!D>; zriKe3-m(I8StBi940tkqi8LU1%Pnnn+SM-$9j4x-Q7dJLBp(zW^ z_D<~O;=v8181GO}gy@vH*T-Z)Vlp${8}#+8tf1=|_oFm;kBE5R7f)iUQAR@&9C!)A z6nn>CW#GW@la)@Sp^=^e)v-}8@4?zXDD zo7kvm#HYnRGoxeJFZplkK!)Af{q(nLIG~oc&&g3k$Umz*X9$6!YF&8lHl@ewY1UfZ z?f6J=TFE9~IPWQoyU}N^C8Y}*YWB+^_HK)(N0!3xnC?oXv)%(XiLY0~?hXKI9wVjg5dr#OV6Y4dZw_s-QFroKrG`0~Ut2fT2lc#$ll>)=>`XD?JAnf5ciml|vj+DE0G8Foe<%G9$cKcSLh2L`c2n0eyU z+h%JRANy{+FRLi^N}KVC-vo#d%hVw>M9Be3J1n_m3{78m-&Hl5kM=BTZ(jnR6)r;W zwjQ>KUL)#+6to%k583~!AHFYxsHjsde0VXcg;q#P3KNd-9!vgagOQvZgEj} zgmkZlIL7^3<~e1&mOAIm$|191vsUQFlYmR}L74A1`-K~;kCiN6M8OBE(#k-*Me(yw zhs||QlACfOlVrxUyrT!=&$RTYKE@TtNcBC8k;#jMSl)0#tX$-M^KaU5sx85Lb8(|8 zBvT$6WNV2V^-gWUr71F9>#(Zv-Hm5^Z6@JastcR#AdfCFl$d6;xUuILD^DP|4;dk9 zb==<_IWc8ycqV@GQA;PmPcK2{!-4IACIzdO|0B@e$wxzE^TKDmbCc6nnrmZLLZbdW zpxwfSFLZm)Q1V_$>+AfQfHP6O$05NYQ%j&dDUO1RGLaIe5re=SsI;VTHyiUPx;bNL z$XjF?y06vwcVqV-!^r=oy1VMcTXOpf0{Hw(&0TCah8qP`!L$Xi;BX|=^wO){UqMCCquVrOUlm-M2I*>{Ho9%4;_# zV_6WtD_`=%aAv3ZnBQ(sY9;NH)u#;oiItzi+huSShOePI--~N!JU4WEF`l1=U$ngx zbMbzWXu?=l&_)aTL=V5*`!V$ABpsRulNANi^k#pqB=_f}{LhyX#=w91apKaSR4d*Z z8(76QF2)0Y2K;jPv!=VTOk2|iuJJ-2&$14+Y-$$2vfC7zs8k5l{8{xsPf~h&;`(3ZU$g1;#JKksZtcChnwQnz$XR?~GjE3Y>*hQ~ zhky}klYv$w*KrT8I)*lPq;`Opv9sv7R9zi2-?r)axoO)zXu^J7>yQgSOr70JhJY+) z+0_mSO|c$kYL+NbRyI=p9}1s;{HX#pmtd?wXC@gK0UxA|@CH(SI%9Ty?6|6WLd_@7_X8TKPUUaz?y%%(F^#>6Ta9>1K2C_ZzQ!2b{NU^- z310Ju{JBi>qIyO)P<>R7F~8-E{XMlvoZn52b~2)Gtls0*LA!0blj#|=)TDVuVjXkU z4&4(>w+3mFrTBDqn&4O7v&WW1u_|U=cyt2xJ-EUz{H@W1mR4Z1(MV@c{}-NX&)TbA zh|&HU(+`|8un_n=rb)dZ&}IDRSRK^!kREZ}d{vHt^q?K>x`!%ECP1 zS6uWyRQoxc66PkDUtI)CE00pYYhRcWo0_RgewplaCFK^IGPAM}mtmCD(@s;f4P0&!q zeqczQMMxDh)F1~fB_m9HJVXQ`<03eiT@G@yv&bBi{(jmK?AoHN60ZNRo*w_XW6ah6 zjlH*ws&iS>MRAwlPH^{$Yp{vCOCY$r6Ewk{iCb{D;4Z;s0txQ!7BmnfoSC)u?z8)L zuhI9M(LL_{v5GPH>YL^MJa5%k@75z=E{*AD?U|sLs=DG~vHNwDe9%_hDSm6yv#ziT zCZZ@08P5xp&MCFpj9^K@IYpIA^PEE0^xPMmWw|e-^dCPX(+dlxo*CP;7}CVv{&4v$FEmsw%1`IcFUNNK6F#+*f^f zG(LMkeSvyi`q(#1@qx+HQ5=WL(ye_cEPl5Kk2`q|NUf!UHbfsjWd6=`C!7i}@>A8k zL!PILL3mgHm74JXJ!SoE`@60n-x>YOod*BbBQRf-(-r0L^4V?Cxu>$UDzq$p_T?IgYfN4&ea6^SXd%psQlz<@jBBrXYqrPp0 z9`9bX4lasBhfZD_dDeDuC?kLdF+Tmv+MxBahQd>)34Ghf2y=a0`D zo~PJBB*WVWJ~%zUewod@Tn$gD7zZX#OueA?Gf?8%k@BHiEf3TMe5m%1z5+&VBYJE+ zv|OY}j2Pr2zrmpB>J;&RE+MYbFZ93P$!y8}bRPpV-}(Hot8^`mJSuhl@~w`E`#mgrz^Z`7Z0Se}%}8I>Wxp#Uv!gKTP@)Y=3V@=9-x+ z8@hw95a+Gi)Oo#!I^>4E{Xu)vc8nGIE${kUU;R<2XogheW1U?y==x%q|x%m#49aYYre((3aS zhc-q-1-e#yL$l%8%;{KsFbOJpLzfS|ygAmM(1?H;g5-)a67DE16WuED@VXAPnDQ`{ zdmUlku^a$^DG9-KCcHwmSB#b#pCp&6sH9_!^}Fgt6Ny??~C#y%Hk1}@(`#1exE{Z;{#S_)kzTgh=Y`l1$T!pg^j%Z7%L4TNHUG>6So291$v4BGOJ}aYQXIBd2DhQb8sQW7)BE7CoYt_m z;#Bey&E9fQS?%;onvuH9rHj1H98{qQgTHF5CUN?P5TvI_NvgkAU-wAkG>~3$Jl|=5 zx_>mxQthetDinA^+3;_@wQOK-vyCI@e!)ix$~S7|fSeJgq>puiD4O{^0eJsgem z6B*n`mFDp3(=7`yZK2hXyN;5f#(hn1g+qz7uCdR7(=vV^+kSocWLf-W3o}A0VTUF|xu0_2oH`0x{VDKf zuhO_aiXr7sxNre-l+ihu>Jjo_&&OBS(qk_XY1k{)*InaTUk{La7Xp$yokk1{WurF<@2!p$@e1`xbiFlxWMbJ}z% zZvVRApr|}@f9uMOatBR2b?X}a3Vnh+XbUx6Wndat^aC@Gs^_bZ@FKzy*qY_gBJkYU zqxqsmRlDY6IKUPo=L6RVW~Ov3+?f%ii7&S#U2z%W3EkSmZ)C8g`QD|%hYnZ=vq)t% z>Jo)=--YJ4$?G1BOrCfe_$icUA3qvt#H2GNK3x|)MVE>IU%6T4$ zeu>6_5OP&Gg_}>=B3U_3vyE)+RiIVRZlC26k2ZmoJZZZv{~BZRoju(LL9NA%V&%LK z++wKZ6ytG4`FFz7Tb)bdYDI={EO~M`8<><|7!&$5{di%Mm@j=r=ZJ8gT*O?VaX*y0 zePKaW6NE0=Q9UH5kVvSgbZiSI23X`g$tdW z;!2f`w#rs8BGE~hZ!qFCk9eIUM=T4i3j9Ej zLi1!b){~8xveb9^(Mm(z#+XD_*HUA$zxzN#-D3U2NyL}sY2ohkpUS z*2z^3DfT){SW~-%PuG)3OL-Sn9s|z?i{Q0RJ?Oq7bHyX$N$+*}kCeizhwYw#<(TA;)& zZ$ek4!gT^kWWs|V)-%ca@TeuIBlAb>hB_@$_*Z49I~^>9g1u?aITaAdsXLQ4!M1V% zG>nJ(g{*p^A2DS=JMW$Q_;5cRz`=OJeC8+k?JpDgHjdK3toISe!c)WPx7TgvJsxa7 zi_l|qO8h-FI@h@?SS>$L-F&|3AI36Eg?~66&&A&E$V3f!vNk>CcU?bVIu{i4l&n6F z6GX~H=OiRMa0^SVCgs{d7B`w8igGd`*L#2HKK%(za$iS+Slseqt@0Y9bM^wS*SCLd zxGD6?xpYt~JKwE+nIe5wmTd zIQDGZJT3ITH*!jx48L@!fA8I(>0Df2W-0Tn*2jMaUf880{54}~->gMqz|uqF$n!`3 z3qRjnm|_Xbsh@dlt005iYLX6deiQeOlwl<%(K`jMC*poH=QSKros7#X;Q^8J2mH$n) z`FmZ}`ZTpG&5zGk-2<0!?!;@Ol*4nh z0UaR*rf5E{gqxHKyxjwg-BXN{E$Hy^P92f#m8XFj8=6GMQ@G&qq07xlIPfHU_)oEq zVj6z`5y=Do1<6Y~Il5aoy1P*ba6^7or(jpIFt;(0aPp=wfV^{1@N#ld@IkQuTMBkn z6IX~&3NCK`KYglOxH);anpwC}{H6rb-tICQ?hrcg$D0g*f{XWeI_eNA0O1LcRQ~uK z$O+*6%@F>K0mu#U^-ntw#Ln|?Ayi$R%rq?AA-P~zl>$<*Yg%}_Q?Sc9m{?gz{NpM4 zkEa|YbH5YOaCh}EbN@4!ZWP>{kU&1p5MH7R3GwfxyJ@k}UG`qDG=on}P?t0$&vDd?%%`-3Lh%{`#)oe2Lc*OGX%+js0Uje%>U-e`)iu}+T?m(cgvqk7)u7JTW)FUh|W z7J$2!C=Gwbg|4x>?lh!gZ2L9Vy#8`1lpN_NT2d9Pq)LbOav_4#Z1sy6N9)l+#&GPL z458jdEJC79HMYFkqrl2u*x8fS`R=bxEie15v9}Im;ejWqN4Qcq0s8`6H21(CnajL7F$+&GyS z{HA`JUOY-knJS{#H#!-%J}sL>1Y^Ahi|6x5*oluwabEU*tt}o88D`t9(eo35osD%lDdXV% z49&x|+Cb+PN=#ewWdo|t^!odoXOyU)e4oz*LKFohc#Y6c@TW-P68p0wQM5WK_Aovq zHBOMem4mGhCC1Rlmy&NHDWdfneif(+XO5h6K zrA*}vEy(hR>&2)k6g1RuS+HhDoMf%pT|I99l5$a)6hZCC>D_$%X0R*o-P;q$p%A~i zkDp(ejd39qdVcHY_Qq;d!KTt0O2kI@*dWxlGk0}Orl;~mqYGaYba^c)!&+y(qm+Wu z$`e7u4=xDp#71t*)}kUwG3R2}qunb(o2rBM)$h zlQ-Qyf8&J%+ae)Ywm6!fA*CiVCN-Pj{(hq|E(KoVL_{7{FGF#RQ)+$%CN&uFG&_aS z0?a2N#3j3CYW7JxHhL-v7D8MGaDNk*Ifm(v0yV@dd})VDD-R~^wKJ?Gi3V;NDIB8@xt7X<`Qj zhlJw7viX39Jl;B^@u+zpi2htcVOhd8m^xT&wu#i-kXuzkks8)X)*zRc?B_VKpg6ok z*)&q|&}-Jb1!95TNPfys6sG{0Iv8Q;S3N<$7*7>sB%t<_k`eS?*GG&ZZO??Zp6%}Q z?l1aBntvL*#_A@L2)WKqHI$SU?KPR)e9IL<-^Y$rfEZ0#J$FG`r$$^LHWrQ~B3m4w zdTQ{LPOi6DkyV=R6!ID`)&`YbB0qygA;q=zGW4=;djP-eU7oCwk-T9*v!saPx9Tgm zv>CKzbxi3}=1X3DPmrJ>Aloa6uQ;H+BMp9jPSRynING(e+TB?n=i9#94au~cO&Mia z#AwVwd1IF|7yRNoHrc6|&Z(vo&N)dL$x2Ikmn2h}sD?j6r8s|UIHnV6nqd`q zS#C)4CRnE*ny66B#89SK={0bfW8e&mjWWvEHtiNJ3+2K_USk2od-opRpiM?dre%zH zixPEAIN{|v0X}7?eb5hg%iE;g8@GIFSAQT~rR=C_uh1fv*z^b1gOP&tO!KsOnSqvTsFSh=n^?s!f!b-!&|f7 zP=Ki?7svZ)SV2{9v99xp-iWkPTOV8M(&W^#70U}xVy4K>+uRPC?PSY4v7l*G zh$>%Jf(7Naug}JeD($_IG9E32n0ZS9uS>=v95U=aR4>ZpSlx7|j)6;%TEShNfD{U` zWq;jfwKz#%PQ+I%A2kte%Y$bStj1A`5Bd=RDA40Gk=GN-V(mu1`Yh?I5Y-$#`aZ%c zJQwxhqf(NHz}+19D=+(z5z-U;%^a56T?|YyqBbSBCc_JV3Rc#7_nj@1m_<5-ymy-t zp6IOf%;PHyF(1MiM|W&YGwjZ;nH$#nAPxCRlj;u(*(0~BIHcG3js|rh_1ODBH19-J zB$aweGmC&>y_xBL=C9Q^veMFdPgW1e=Y<+?k3SmK5V!!3Djq+V#&=KWs^Po z4z}y^KH~1r3Dlg1w=y2(bRq8_U?b&2?sJ-BC+Xn(ILpDt7W3IUIT%LU-!pbx^nkAr zGN*a)VB)`Rb{Howy#rlT0bP`f4q9#PH+EZsFfRuPVxQkci(cBYh^b)ADp`M{)ki~{ z^2OboaWmwrXclMUa+>BvlYHOVfPZr`%kXS&9qvr|io?yI%8a=tYrf#5b9qodezKu3 zo9qbJfMqexv{0S2yIH@6`%CDY^Hof;^;0^M@RXeeADqW`cU|*$f$kn^4s3)(#H3Jm zCPBw)O4F7;VV>07nm!gWIU>m3X)tfIF%_~7d1ee6{vp}|1_s4*-OCmWxC~aD}ZH9kKXMIF6IXX zxx5uc=gpVLU+SCUWLK1;tH?o5 za0NJq;n`d?@}>+?DMyvjaxA6y13!^7_bfOP1+S37l*4PfMq|uBGWwF!vdvQUc${su ziQ2ptJ2BAV0yvGOI5l9@uaG$A$r&XdI+B0gCf40(5sV=8;0*ek?yScpxfzK zqgOS9-7D#GBL^%8_psJgxT?Pvy!L9C#>uS|NW*SCT!?}(K%+Wx1A=RS3udt z$YD@nyxvr%l_IFse6Q;q3@x|tLdw0^tPGS&Kkq5Vh*~5M5|9W@52`$Z#?7xm!0uQ} zvu?2+79@}g9QX`4EB6B3zxTQ>>rgR{?w!X)8e#!{JeHYd64l7!6j;|S_gy&Z%(hvu z={P=k%!J{LD<Cv3h+{hufY9%NQaei{6`Ug0( zvwS;pZ z^6+ChSnA$#Kn{M~RVPSt%n}s(Dna}p4hs3i-%s7ts#EHe=eyz(^}*_=rRVO8Dd7{I zroUvs>r5io6cC ze*Ms}sw@=hHMPiNP@?>X3|uV5^_$tIr_S4-^zDEOvkzn4d$b=K{8~E9kPzV>u24Y> zi2~we_|#p(k*Vf1dz5zPp^7lh-%lm)063oLDyAPl1cn!LifHQ6Gp}7xytR{&TehQ- zu5>_myg=Hk8T1=&;kcGlSNFtEDX&je<~1=!R9bc@`jLwflQY(5j0q012xw#*oAdSS zY`$^KaeaP%GVl+&XNY~(S5YlM&+T?PgOXC&P?1MN^VWgwT*@qb<`b5wvAl8i3f%US zK&a=JV1M(CG$VH{*|R<5o$qCIUV_1!_L->u?P|S~BLS=vqZ2~HuRmK6c&lb-Jx26! zoeTuj6$#094R8^;h^9|B_7wfX2pqyeViO~1j{kh8Pc`jo_qZOrDHs=hAaGWn(AjA8 z9imLuk})X$t)^_-#t-RGA-{=8w6U>Sla*7XIi0{b>s@{IoH*gvW%+nI2kev0BjtU$ z#hv-bumt+?O&D3T_?lzf;P~Zr?cxym#qUq^&7#*nnGNSvA<|+BDQs1S`GwG-2Zed* zV)~l9D%Fi#$1dc41BkQ7wi!&*aZ|T;R1zJ@>+lT*v$q(}+wmQ@%5CO6wS|SpJimNI zlIFQhW7sE<{8-75y9Q&{V}pm+Ux}E$uYR(8lSfLPIvqsoa4DelW;p?w(np8w!*`vR zs&m~fjiyJWt=eKC+B;MIHoNa@8oW`sZzjk-g@tI|U1EcAyNOOi^?X0WOGC;P(zAL;~?YB_m+hRWY@-F#A&wq07Ywpb+5wBSnbt;6ITc zaQ&71;CG;ZR+NN|yPK+otE7{Ivy`9%_}G2IK2!JL#Cjwe33Uw}GdECvUE|CwAsxS~XUW!uI?>wm49Xf@`Q$ifrVrS;>d>usZAI-I5=2DSolBv zK*M0c;^3;mVN-H)0n|<4@x&3RxJ`reFYsLwB{b^3Y<;_YS%yM`g~W;liv=YH^{oCc zQU7iI|F{MO))3;u_BNwDL^G7bei8Ws9A#ooh_Vc2m3EU$YG{e@kf29Lp{r`^bzJ0gf8XC;Q;}x=@ob@o46V`zQDPPft#x zn9#;~%{^sJBHb#Wxi%}(DXc9lo)G4@3fz&Kqnk{>Oh3O4Ldf35vK^CaDHB?iHZ>PB zeuyXXVnD2FiA9%$@u%7Nj;g_6bN@#rM{6Jl5`*nRfWDR36% zDIidtck}?PJ1m|)q-f{EpN_a6;)Z$0{bItKy_&A}shdu9S|UC)g&)qX#fwba+>*sP zr2ZtrwEu3m2bQs0taZYIS`Hf2{`^ebQFqWTEm~OD{a1k*Z^>eR80?yhG<4Obagx=V zc6CZY>H_DVDdQf;4L!1+bCHj}H)b;xG8%mE9TE6P0ZYjXMUzyLR3QaqgcPvaLfd># zFJ)}V(!%WPloG^mh_A~{q}8U0?g{K~%Kfs!ZdctOmj`K{=LHfUK9((Lw?p4G&;t=k8T6B{^&%ISo-m>mgU)W zc?>fP0X*1%bQO*um%PrcGYkWl!I=tc!&Km{kO({~DF!{DzQ<@yfp;Wa;pD zT@(aDmeiLrx#o=xngXcmtYzMjs1la{8!Dgq&rvz`=l_}`1VMm%>2Khk0Riq1T>GB_ z_qZ?rHAjGMf{ywF*P8pf|HieV5L~NMNa?_nBA}6ipv{bxffp?y1a~S1EYqN#DV?^t zvbnrEHSHoowW%r}%P!-p(~TLa(#KkaV9vj*=>Jz$6dHMWZ?Vd7W3Qkb)+q!Z%HNzk zI73#%Yi?@~(vd4BiipKm^MX2j^RG~!Q`b1l7a+UO?#jpOCAttaVj#L;(BLR|KQwFl zxrg`0G7)UF>u7)OUkjbk>|fJjx$1El)Byddc1KYFqV-m*;xgS|q$Fa(k-kT>C}#Wy z9+uc-?6GK$u9oO7UlN}k~gNeo=EJf?+a?8w?w6HvnuBIuN z|3ypSjP4ATKg3^>6JisqQt8l)A*@Jm9y6RiUF_UuW1fz>`N}$l|29)mK1TSlGj(+6 zIwfv+hm!waO5@YJ-<=}0^4QcSyVhX@D@5W*W;EX)*UbvR6hDB?e9*#iI-lR8_B``O zJ9TLFcyE9qc;5(yRfH9bJZVDVirCuv*#tyxa2Yo1oJQ_2mZU9vqC6Xhw#$;6kr$dP(7rKw+0fYku7M>s1q5K z2{9t;5heZ{LHvw#l7rP|6V;|jC*Pz%w}m~mt%7w&r+}sQNnwI3euKYWE>IU!6%Xf< zj1Aruoyu@1D~A)sK&f0xhb9BR{m|03j=(=|6-~ByQZvf62)w2@)`D$0v%8JVsFp}n zF<2d~elC>ejJ!#meHe=BC!mO{*w(ziW!@6chl<%KXEKVx5uT}WmPoupn^;b;<+}Zb z^B&S&c;tR}7vR6^E`#YMeIV=c{+s5{*Jn(b>9M#{*x*^kU6wRjj}C$N`uBq)e>N1F z0cpYX+hN2|E&RMWsca1cnO7gI!64hNQLnm0n^GTVeD4kXnF|lv_E5Dp4DOwQJ~c9$ zV&a&XM{v}<++EPupsCGl9autj0=41-N&Ea63t4}f6zqtI$C&XC(Vf~nW3;rZuHIVd z*V$z_VN0#a)E2JdWw#UlNbwz!P)kAo(p~=BtyzD$+)yI7s$@Pe0}t<7JCcOr?Rw2w zbDgS}TI`I;^H|?NL1~(iI~>Nk<@%4T8gB?0!CF?AT2(Lgp!-Rz{-x6!s=p{e&4Ay+ zx8qV-|G~Al8<258c_u{WIPoZW--J)qfpu*xQ;|b?N8sTV02v42ji(+Re5WVdvk2gS zjSdle*gKVtU>B52kHYW`UlMD3hLlQe*G6d#<;0`5L2mhBeSxeoAaKtz4ZCn;f_0TU zNsA7JT0ROyn~`m5KmBRJK&qO~r>TytSK~@%G=-@p{F~9hh^O5QelhQKj=C&Jo(o(^ zO$`80i}E&wrn2s;Ghc0u_Hm)4HVSyDpG2$Cw1N_RGZ^CAU!bz9tM4dzMpA?kQE;57 z{e$Ff_G{;~$vn|G8Fmri>w#9Msr?20W;~ofL z&Y_n|X0!V4755j4vtvg?&T{3s%J;Cath0V3`!8&prONE-5NJpK^mal{n%zgcE|)Wi z;=062OeDJa8UfbWCMW?v$8qb-U&k}-Gi(?{@i59RcS^g7i7HbUUr}6RTv^C2TCjea z!@znC?|}FI$*bpp0z>hqRCKHwWhjtei+?a<2wg8yuB(COMg(Jlnw8BE=vhAI;8_}F zsd~YR6*(oP9yx4YD{Y}h3zW{Fk#?&is#Htatu}Cc%N+Mb9S?Uky@C6JcVe=-bAdbB z_kgZJD{5c+GX_P}>O_9$4v7I{l3qr}TfVQibqvwhLDTPQ)NBEl0$ZIL(t;kE(bA2U z4jFqBX4G8~_2R;Ea;$VUUlI!|iZYJ+e)+Qi7IRA0pFv8LyP1jI16s8XawXuNstEWs zg;Zfl*@|JoA$)$#gNWqRwaGNiTq1^%h_mhS2Za6E}GyEW#ZE6RvUwycKWxrrJ0w2ExcC^AeX%0C}3ov|) z*cOjSGju3q7yzawrJtEnU82=p4eBO^lVr*F?=jA++I_l`vjhjUMz(5~O@6Ota$j4QBz@(J5AXsVd0-KU};$MP|AEtfV+KV+Y% zWm#wnTPl~cKxRGzV0%!v*_5;_gr5GS-(y@g;nLzQM=xu_Cs|Hx$fBACN>yX*CsA{K z7Zo+hc#dJAC^SVTKErJ`xQ~dmdV#9FMLAbgm)$#gRZMGMyi_E;&02+kj?t)(=Yl`=pE&~R82)-g(q9VwFaM1#mVHTMVqBun*PDM_BLSA zp*i~*#MNACrdZA-?meqi`2wYoyZ?Iqtr-t>N)#$a$ypD%ptcbg-zxR5Jp3k6y%Ws` z$Qg8#6zRedmNSP2+6A?MX{`cpJ3Ft`uASoTRV$_bbS=DLH(8S_;At2*Vx1>t#_odI z)@qyW7cBZC9kKWplR*h+na+hKegL=(hFrAW^JdhwK5cH)5=xKge2<9H_;H2C;#Ywx zI`UP1%t|p;_df2si-)M)di{pwA8k1|>;eVr{=nk^K8s1EjX_P%(b?jvBbzgp0zI1P z%GWNdCgt8{_*xgF!uOK^ZoOBpfMZ*EpcUYUW8%)i;_s^><|ZHevLm;3g|`RAG1wi` z^jLBHGc2|PyLt|w@x@s1maEw~RXKjVKxxP)mq*y7LC%(Sfu!W-4{BQK41(`GM@Sc@ z%d!GJTNp`N?0T)t9QrGl7hM(xOH9TC%|f)7d+Uwm6>Oj8_O+VoXlbMav1|jght-28 z{Fx$K?(AF>J3KoPJb70IyQ;&<{PZoMJ@oF#y{<6=%HtH&U!W{@{ZbcBXgsy@nI#e$ zK?wzQMPs`b+gNz=rEF;vQNdW6t0C)$_C?EMhN!gFPCP+wipKcyl5U7!Db;MOx)32k-fa95HsitLxztm zwSjr1B~4`{L^SVGhot6whEFS}MVK7*9%l~n8Q?H6`D0rX1_l;nNqHjohpWRlebAYoF&eqE)$+nB+>sk@48!%Tp0xz^4Jka@;$L z&pw%PWh1;RV#FGD1pCkvn>=CddO>6*w5Y{xD(Ml*VEI_vv62Zm;F0A_mCYpqIy?#b zkS9K>V{6$O>08gT3~P|N66@-B5}L|G3s>#%4U^>(b(@*2xYb208a^VaX6zG2J??@{ z8)~-lw3zS(p59f`(AL4#Y#!pBQ;i0-GVq-H@~|5KaG4Rb%|G{wu*CJ#&}&8a=|l{o z_J|*JiS&XEAldeo@id-}GndM8welMyRUa|W45HS_P7UIO9cz~FrCvObrma=ic;{Y1 z8M)pYC9w)h3`e0#A(}HRr8w_$64Rn-tDhw#KNoaS0nUdkoQ8NvFc|B3cwEPPRH7X9 z$vT1peDkGBRjIc22I7I$svDn{-+|x7MuN+20diH*T62s7;E+v(9H+D1@58IGW@-EA%9BbKx1;O%p9unXpW~e`LCar@or8T zW%XX5)ZxXb=-N{OgZ%l5tUDGhMs%uK)e0V#mGo2QWj*}iV~WEZfsFT|`)ZcQH*?K; z?p({%Y)(gcU>gB$zKa$r9{pYOb+i4GGoq584wloFZ+C&fyw@YOuCk$ z75c*H^y*th)2Uf3lZ$$PNl5+dX&l4V{@1t%vQv;;!0vF%sjW|=X=a6?9`*vpF3`7P zTVt?bmwv?(Hfu%;h&eE8y$I=NE| zukGf{LERekL2j>2e;|9nPl%8DK1@3Rr?)dtyL6;qYp%b-a=9}nvz`%XX<08ZO6Pky z=E=&vpv%uz8NpG@#QC}5wy;Xv#Rngx*D6OXo? zGE8^VW>uTr*KlwC?vVe@hHgvL?y#DqaDDq+@m%B&KHc47xmNAx8zJF{v)>){tzG1t zZFh2K`GN@5YURY!VR>P=3{@2h3XgC&%a_{lV8fM<;BImuXsOa>>BQ5i-}qI_UppZM zK|u+4oqn{mH_V-* z#-Eguq-ENx@e*mRy(HFzRd}SXtlw;sD%IHS?5`;w&gRv&(TWl0qzI21+Y@SFfDqQ4fslg3u_GW7y zg8@IZ$Fuj**=mvHghtpF+WT}ucEV*!vGRKNAkgd!)aQ=j{Z$u@01Vk?NkLK?ii*l;`l`BBGyk_@}l!4=4Bt#W19?DTBlo(lYJuG?N z8x8t+Xm_IasFI-MGA+tyuUZI+I9C5ixa1v|*9WE8>UBgsE%c<@T%7r4MI4pq0+TZ! z%W#q!R${UAKuo;4So{!>!!TnrMvOX1R$35Fk4?qO{_$98!41%qGAJN>R@_8=nLZLQ zB*2y;--ds}t2yKNi;)2$49a+Y>k||J>4y-5w-}%KAfkDM+1gRraR(v5BBf>!hHGVv zUofC!3K>W(7z|_{U-C}DqDhP+#$4MBng>PnheS2 zW&2CmNTdFC77#K`xEiBPu)iKNEfBpLJCQThw8@1()ii&)64%W^+Sf4RCp~-DDWDqw z%396jCdt6O)Jl(u-su?Qd+a8jW0oS=Jswayv+xVz`$zW<3Lf)8b`hi0EY5AvJ$wnx& zc=}e1tPlC^>9&TE@rgLohRnnftyl!-3P!Jsro>arU8Txy!z=hDdf38RVkYdHfi|<> zlVg&Bay>4q9?sB{9PxAv#im@f3wGFcTAD;zj{Mo>a?1-`004lhtEtX7EX3@%aJ1y- zm^!DEkonlP@_82I@Swayu2_J<#dk7XD02aYFI{|vz~G*9AtJb6GiFU)prYla=(|s)8D*XY-u`m-hq*ZKTb6l2TDvIp(e{%9(vbYE<>^2#O{>f=EyYn&(P8an|b z$0}^^>vNxB%L4@)O`j-G7FUKec#R{ge_cb#RUqHgUEDZkRZ0?I(v|VSgdF-k$_y#L zOX@dX6=L3~Zc~7M)SerFo$oc6CkU2(bRGB5k$k`F&hN*bP}7qA{fdI&lM!dpUor>s zkCTWzHx+anYt>`GGsv93xZ-^LqnXs>(k2}atP@daQt=+!g6k=CBw6W4EmQU4`o8jn<9g8b zs7I5Px}4rzB7%*ap1dgES472%ZT`kp1&IRTnXx3Dl~e5xED=i-sa4Ax>LM&afm%A! z!tQyPqOk$zO7^-&4K6!2N+#>n(q!2l1I|*-qFK2*vIrx&XrtPz;189`U)M`#jykrD z>DTR7C9|DkM?r5h+=m zhU1J_8?lc;?on~Pjw0IC2>#)Hx$5~Go%^s`t_1#L%$5v;f4AQw0^9hEg zIe6ra4QUI3AZN59k0T>FZXI~)i*sClCYN1WQZbJ>*nrl}z)~If6Tl9#xV@nv823rF zqiR0MHO5=LDQyD}7eb2<3SkZz*waN-GiJ;g8=)Yp0D`zGJLQ7HR}+~P9TBl=mds~D zDSal6w8Y$U3zU{^sip6iA27Y0nH%bq@ha!veI5skr)Efvjmnw~qgO>jf4wss%7)ro{w{XoJsS}Ru7lxqL; zKnNwtj2ss=H#4ugP{vy(F0MAiP-T)qcCD4(sk!BHi5zu>lCWh1gU&4Aq@5mivJVeH z&bokWwn`)l-Wbaa;TT}UHf{Q)R5s$H{|&2(@KM3O)JLJbNc!>&qKwpRX=Ty^?fDuN zEYY|piG14o>Dd+oH3JXc>Bc>^jAD5q@2B}$_-O%!lGe#zYl3AJ2rDL&yO6tOm+JS~ zn%#g7fW4-HQSZGF9XoDo?us0VVgbq8iPHogQ6brO4mtHGTqzZizT&BXGu`rQPS{m+hCh zYrFT%>g)y(JTsygUom)_lD`h-(g2v5mkyZEWT10@pr&OUO!SZ+tcU?WnJGw@yH)WB zJMT;AlWHhf8u;KR$*r`4W8x!;6-S=@WLW#SQv^oCa2)f)jVh&ivy;=PM3ZIBtQ%aK z3XYY-Qt(bIQ`0Crc7L!M(c=9$u}yMI-YzK6C^|X&Y^jI6Jpzt3d_N^g1zq}kfrN(X zkPClXG+Hv7xjc{{l~VF!)7--BoQsPZk5C3qjU#FLZNach3k?mZ!62*)34GIoL9GbI z)!G96)x~hgLfedg=ZvpjKH)fVt}Q2S-A!zo%~UNpiktpqhZ4(bn%^?D`rHuW3-vbh+4@xpA~0@lBvGRer}Dii1B5C@+d8h< zM9(zNEd@N2{&&+=6Kdatgr0`ufb;Ir;dGAt4>6 zbe~i4ppqGzD%w$-r5YhGsyQZBq$!ExefCLS3fL&u*THt0ERuqy5&0E@NrdTULJ>xG z8IVacr%IOUK1O2TUJPHYO~Vbx5j7HmvP2|cRxgpA1{ltcF)_RfiIAz`f zfc)eb?XSb+thWNu5Yd$y6e&FcPkh}C(rl!+J~v$cwu`Hwo^DKZD;PY|G`|3NrlE0N zkY&Q8(G5sdKJ(JEZ*&8loxj6N8XG9xzDVIyIb&ng83N2ao zx{W~O>OZ@RR_b-$GFiMVRp0-t%yo$^w>Z#|nP{fwm2qtD_r4W>AyF6=fHY$%R|!&6 z%e0}kVWPE9$XbjUmxN5E(@&_Ayy+6jdzfe%jPb4EWKn(k>fhcojCarp+RRdMzysmeu_=q|M`f_h;}w|Nq}@vO+;&9f0FiK2n)4Bn;@D zl`p*2TVjxx-?#c1p*B;zy}V+bYU0N>q-HtFHKDtA3bj0!g zLd5WgTo13xN9yo|LHZ#1D{l?z|2TR!d_Ee6Z?DnIrSxg`L_vT{V@uEbQ?sGiw~)JE zmPI_X-P>mzvPP|Q==Br65n;8Cr?QMvb5T>vYXU7?XJa0a23&K<;Pwg1X(EawD;tw5 zmNUuam-L;s>qpLZut%U0|ecq{!R_x{O z{YOhv&e-_1XzoEZsML0;6~7^#^pyGCl6YO15mhqHuOo3$Hrvq6>;GIXDpO0Rsv z3W3Vn-<0FG+hbO!dB{4zVDMBYxL5OkxK;nJqkm;st##OhbXn)Y#;rS@t-yKAVV(sh zi4vm4zy_u87L!FZsw++|)tZVXFu2@uW=!xdvjkst@^ z7h@n(R73z=zzjhcauyhdjASH=A~56}hA25BIg3ip z2n-oSqJjhg2`cJqT-V*b-|qeHyYJoi`VXeNsqU(-aO%|g{mv8 z`p>ejpNxR0y{P7YUEZVY?sWtXqlfk$fD3hLu5_CU%iIvyEgU?D&e_Lev6H)iN*kv=yrcVji{N?vY5@?HAa&^U*Z04-;=Nyq@cr>v0@Mv| z{qZKEU#VV!P_Jw_Esy>-yUQs=@^;@2e(z(y$`o+>Oq_IKS?24?-#g|NVSaf;x_Z<# zveBuafdY~N&krj!e=`tm*Uz&E71V0AkrnbD(g$q_=&!}~x&Iu7U~MAdcPaNnpNK|HKpf~I3|7?5W|7vtA5Y$SD ztoqBuFKP6v(TPC#D)`xTHu44(FIDGfm^q%bxj7ZOXeVtQKdvFsbZ-sH{jek`$kBpW zWe*LML^o{DHT4P>aX_F*O@$)1@bK`chcQvoX>CL-bX=Vy`iv|_z9G|!rEr4?60(A{ znZez{u2MtMd|sj{(J{jr{avFFhL?qlGr1fs=@Y3eoTYs+>1@-2xm4Vq3C=39Xb(xk znK1BwAyLF7?&O~X`Nz-Yf3gSi*HV`94nCvGb)jgaNtMX_LCLWNC^^@C?sB~V;d@g$ zJvphqvZd(CKg=IYeWjo88!lM(&#yi`r)<@V7|liwiK`Vf&alWh!QxZu0&THiEX5j) zbkwTET+^-otKV?`etxUStbT9y`#BvJDek$pPgreocq5EwV8&3U$ZG+4T1?J4!5N7K z7FwP&JaHL%><-t8D!I`Jb=$1;@cs^;3!e!&IW(zNR1NjqsO`j{OJzJ2UrO^-1#_`f z)S4E~l`(YwoFa1;JH&LKw|4dd+Gyuwbc^YHZUqyclHr~j#u|^LN7P^R{K6g`#<`quj3BzYWkx%~h4e~1+V*OrJQke;Cd!HqetmM-5x z%g#4XdA-@_Q!6jOb?Y+keaEB8dk^BTRoGV0wULTg4T#YtHgIu3c&_7SS!PrSvBHmv8UcPE*&ak! z9$J%&`t6l;x(B`hUE;X==dAz8nFaH!5CoBHzj8DTwWBynmpOR|yt$F~ttOz?iV(P% z$Xm_RA5l14IstUF!0N4oX5lT{Wt? z;>;xPEb~#^27&$yGM#+s-%k!|U_b>xq#k_8(8N)$2@jMWHQN^-sT;Je$bafVE*m2=+fTC9E52Nv_Pbmbbig#QJv81f zbKm;K)2HE9pEPr>KZxr)kh~~zUDHBzRHIWBQXb12J}UpI8=S4dalar=+1@yLY!KIb zb=DH99IpVbVMnMYadoxt`=N%7K{(kQOrAl`Sb_~R(6ahu>8g&d4s-Hz(sUw{joLme+q9pURH7dI zK&x6`IU#;fPKR4i;ML<3&gX5bGU=L0)U{Gr;dsYn-##zMmU1a7B87lmMih*$bex#+ z-_YDfIz}LBQZzZ{JkVv{f~*|9mrQn$)m+6=v{zbuai3squ8mrhu$wHw=Rfi$53f8YBcy&BO2Rf5=tKL#;kIS#>_ROA5f^- zsulVa>?JVfC}D*PNXGP*yF{wyFKpS=pEVA287l#zX^&K9vZ=Af6S{85T+{O_-c=~5 zz24ThH?Rd5jiY3DS~DbW=bQOB5tgZ#lP;o(NsolRz4UQ=*;I+Cn(qrDR?H)%Th>Xt z(N%ULWaJX_7Rl9~&BtT|FRb|K*^)Jg@33iw;@p|%LR6SJoD>@kt4S{Iy|d_Qb5o#D zvmQdmK=a!zv=B)|gPOBN2so^CMNhFbTLK$nBX;Rt3E|Kxak_DiW`RnX)W(x0oKO=M zqerLRE2q7&#+l^a%1E~L%7$;G2S>vy2jDJF*!Bu|sq`<|ZTrw~&+({t`){=l2R%&Eq-psf*ju9AJjy54jMb38o-k`h=R7kA`QM|M~~ zNe%jRyKO2qcU3A(*G##?WTvVJzr;y!jd8I3NMuaC%{rPhxg<8+^`jLMEM;-GK#Zs^ zN+8#UnVkTF+qCo*+L*GNOTOP8-$EvE8EM%Op`er}Ec*f1rw`8!Gei3*mu6Q2B3tzX z^?-e!7713R9G0j3gyR{$_?#@ER?mbJdbrAG4sS zFNWi4*=vgQuIi{KjL#|9Mlb2T&e^jKugKGmP=9dsnV7S1YW5&c_PS(a`2-^uzzv=& z>*!2JW+H=GJ0ILvQBJExzw8SsZhjWtH1aJ=PGfC%uAaNJ4J^a zG8>khc*~2ulYotZV*8E94kKjrGa;$jrmyNe%cP?Vj|NISp1s(m*h|w)V2hpEXU2o9 z<&e_)zOeEToYv!#Tq*a|!6P72Zys6QoL6sOS*n$U#l(s>=PHyD7c_md^p>Urlbujt z2}$vGQ~b@2e9|$eF>k7}wr4Hf_ryL_5V^B=-?zLZ8dOq?W^Ap3u)sN-`swimnIhzj zT^Qa&s21OSEVh96<*=U3{cPUpdoC}po6MVKMIlKOdwt9H`li_Es;g{5xQ1qjYwxJ( zIHV%kSr=0<>Ml)!g)qJv=$nudhDbq(?|YS9i*4a1u0C@(ddMPM7_@9N&`$_Y)BL#Yoc}VS=v?Mh zLoA0^{dnI@ddmB?*U&YoZ!Zm&Dz1!XpMNmNk+d@8R}>PnQ{iypoUpTd(d|3PvDhR| z>~lUI>!WY`g(lJbht?DjfS-Mvk@y*1va}lTjz=m(%cnJ>R5Hxh1IZ{8qCo+Cf~V(Hqy&af3&3Udr77ju8xfXlQqo|f4b+e+h=v>Ies-f zAn;R{oYBXK8E*abiJ$PZr2%ak|{HD}(Y;)bPDAty57Mnb3CG;+kg0#peJ~MeB9K~6)A_o|GwwZvN z2sU$5TQv98yV{ z0LDpDePo_Ux7UlUVJk;Kb|4T4{o8z@^*dro%AXc|Cwax}1@u3!4$tpe-9qiT@RGB} zZSp18=wFNJOCn7*NC;NTV@0L@St{KqUIz(C{94i8UT{ik5%qpw|GW=01{&CD=zmQs zc`&=MiuYd;UYA1OHq>6}o%^amCMvQc6a48CJvs)zT7dF8qm!7-6K0z8Yl0IQ0*rk= zm)tl*rhX+c58mNu(XlcFfvWO*_OKzViwG_;M@Tip`ZX{Oqze^0kdXdyKQ~akvdk|8 zQ=~bkqZl+MBtnpglD&_E8}*c;eB6*e`tX&Jk=_Xy>=YM`HojZLSCT}|zWh}f;D|Z{t_TnhR7rT}Am!Rbr5Lvj$wTrXP(u*uB=VOen)E8kJ<>+9F{LINNxp z(f8m;+NJxkeL14G(N>LgT2mpyP^p{tPu9jmAyzA2h-J-$G#8&4${cD;Bd#Mz5zKCC zmMH98-=Ud#qKw2#)%%dMx9YscS6c726Xh_9W5D(&C@ zNbCt+chl!#%$;N!FpCpvv<-=~vyVwp;-|{*t4;8x$K$sXy8{Wb?L0nc4{dndXkUoc z1G7_TbemUV!S9Q}k);CJ_b6=3GxTcClHL1hp$N(TbsC=B?Q;I>Teasm%r{55IIb;e znDJ=AH1Eem>lh3-sAS!u4&RgwS)#XS#i)O#8oasC$RFokca((E8LZuSprHOKiuz+g zT7SOJPV4)mv^s2=uk+jO;~LtxTHgZOV>_n85tt3S@XsXgRqIN7^+|P@!ACJMF;S+2 zpTv^FuJs;LD(iC-^sFj{s+9G$7b4@TR3hMP`EUUqCYbwfCOG@gRg1qUD68E4DQ_FbgZQ7>Chk zq~Al0M#COkC`+*P0zsbw?LqfmSa@tYeefpw>hm4+iEp8@`{ky{!Txv9$_tx77=H+H z)?-_M)FlEeCwQxwPu798f^fEeHK$A^Rr;_@U3Rr!H~oc*g~{RXpg1zhm-maa9+x<7 z;Os=m(-|*q_WD#_Dx4O~$0-?G$X4pHSh~C_E4;*5tT9wrY^@qL#4auBJ7#X=*en$Gj3rGUDLMlXEL*sw(K#;_7Ss&>qnwFppE+9f0+4+f`e z-+l*Ou(h5&oO`|v+QBV6pHn*NxV7nO1ydk&i9(dL95lH^Ze6i&LQkWspQX*rE>kah zTzX0DE)sbgL_?hx85LFOt3jmrv@?5jz5wuTC}d4cx*RQMQ%Ro+)PT9UO1G=!hj1=w z_2_x2o3UEa8`Ydps;e6t zAspFMY7?(D_R7d(5EY*j6#5)>zPO`;!c#B~XO!>|P1c+7o?Hsl}m+K*8h{ z#){ldK_%b%K@SBZ{i&9di@~M32=A-Tx=G7L_VsrJ^w=+;3R57Q$Kl}^#>RKp?2L-_ z_%scNr-9zLn&?Lk^BaS<6lu4^qCT|LcFEba6F0I*%Ucs5B4CT@m0g+?PB|jDs}lV8$F8f;j+(i)HN$Z*xoq%Q5I=Y=jq6$ zT!HHMdG;jHsT2~?4@Om{@1R>v5Mt~%Z;4kRqB78v_Js$cnV*s$Ouc(fO6k4x z_S$!lz?Co8sVh%7X>Uc8kWEF>Qb*DiOPBP{TUVJi4HQw0o-Vj!C$ai0y#f*$f%fv4 z@(#y0IL8Adk+JG~l{m5q3&o*$yA0HT>9M55gy(8S=Zc|C?G)W3akf?%F;w`hlV8ekIdj11nZroi6 zZ18^1;(Pb-_RHs&9FHcHKfe%c|7VQA(l?s#UfZ1HL7Y^@H|cJ}OftWl1-mNein%*I z>#n~gMJXW+U`xvTD2RY8OwQN5&(oC|w0;BH+H*|5m`L+^BuZB@=EJRaE|G&Ax(Xt- z%TKGME*x6~eXB8_xPtPz@}ZyTt5tU?o+cjWX4J!PRHo0%C=UXr>G4jW?GN<%--E_M zeP1AN9t7#$dk>Smd#Lc@JLq!7!bG^&3!&TpySbdDqevq3qsmpzQW2o9hLrDNw z@SK&Z<~wZ&5XM8BJb+Ak^$K32Yyl6mU+|sC!oi{jhe6Z4Zg_6#Of;fOg*mIBY2w<~ zKPrWY?=lPLDl1W2+jxj;+MU~e*&QP3;iHx{)doe~t>=8E(c~Yt}9w!*^e+M-? zjaKl!R;BwSerr1S{M7Hg;pgu|lOw{sPXd|6X7_)c-i6-h-4PG`ga@c|&g>O`KoY<+ z=Pp=%oGk7smb`;mh1d1wA`I9?)E)`k%+2A9F&x-5=D!KT|AkGMYeK7@6R7(sdTgbh zt}F#_|Gu*Pk^6a~OGL1oN!tX)?S=x568r9}*<6K!u?;?+QJ7YceD-b7Ie*Y!4u)Tv z_5RBTo;cnf$}fUZh=re8DBT~$=J3%OF;#m=k_UFO;WzIOud15%t#Tqf92&KaQ)mzk@iMZx)^r(ywplN<{7M^5mWJPwHt{E|9 z&=y!`D_{$JMPIeK@ zp-w@bLw>WNpOZUjmi6k>2o`OAlV2$)AZZ&drd?*FFvbq+%Uz}f*7>Qbnpp&#B#O-# z3?>)=rBWZS0SK$U;D((2Xe!G!UiqkMC2yAaM}iOzSC!aPv*FA|zz-=EKPS)%aH6b7 z*d;4JBbOTF-b_JWd=*{<2s$8wB&XGBS0$olJ**PNl4&px* z*5Hi%uiutT)&Q27d5#Rv;(dmpuH7CGp1Io3rhsTN3Q1ksH4z~wh_zC$tCk5{g5tt0 ztZ6f)A8G|iX(389oX;v}Gup1y2>9(WGEOeBpav1L1Ligqp_(QiWZ!nHua%B zjL#$FP8z4 zKcb<`0AThAfMQ%Z!KXd&5+CVQU-E(Ng-L5C(ixPh{|P#N5z7=`2iP*85DCK**&tJs zsqQne_H!EgUWkuE3XdMypYvT!*Ab%Vfb)Om1DV}@bD2AkElxF1E|_Yi%Xv7(J<9#g zcMw=dXRYD&A6RaAaZUYt9F<*pJ(WI*u?swgfHq|Soz=TW9Y>{?Y9xLubRBAk8FfEh zuk$QJ&iuzpzRLM+QS&(q01)3H75$t)NOMl77|LB8b$)gAS%hWuUT({pJL5hUl>JM_ zg~gZzXY*v<&X;xFUb$Ze&Dqa8r||XBi{I+c!orUv`y_g2R#-?DqV9RwIbBJqAjvBa zE(^2Fjt|yTFIcVuqN~zlX!v{_$3UQ9#ot@|Z-4*RrXk-oPF^G`RV(?e{p!52!4%F@ zwU<{c9n-QVGkitPNa~?-(E5DOuD%7#Snvr3aE1fy8?VVhAi^g<^9V3JBG39H0ZcRn z_+Q_teFrfBD>I(rGVaf)E(6Z8F73xjX`?7viQbdC{5N*D7y^wh`44x+F@dS?48dRk zA%g#>*}&@0lJ>{Te+fr^L8Q5UfMzL!ei}gZ!ZM(Y>5#Q~)`3KNU zcI?Ht{*e$RqPndRI>rIr{jEk_(gD$NZjM!$NP%#q010u3pXS4Q0m9z^pq+rTs5G+e z;!dajS2EWe)24)eEW;w2G*E38?*I_|=ORosq)Hj^4l%e*4t)Kekm#ndzh@Wy1&J>E zdz#X}Akl-;ZbW-A7>KB+k^5yaqL@s33Qv5CT`JpeyZ5`|joLoQrbjJDgYdh4Z-F0m zbsnGY%cqX-pn>*p-M}WdrWZ5>$j#POsA#yQI%qpQn7QjhY$gXBR*y%`Rc{5F2kq7_ zHG|s%)Z51ug*+wlgq3yl5+GKIhbrv&z{<}m6##qzdemtEnSYyzj3SlqM;U(p`A4FS zxy?T^qXD%Pba8*NyHGlY*p|(YD+o7M##Nq>CvOfp>0&DyskA>|6{b{jyI8|uBoWxh zFjqL8E6$hjJ=g;+UDB1aB>3cPPI_fQjOjw|vyBT9=64v|pToUzWGF7F4c(I4NGPBYMy?C02wl&C3fL!Zdm_=Mbn{Ql95ZU%$XXbJp0RKsV=|lX~*0kG%9P4lGZ^?fTP9u|R z`YAr2(mH{=Lpi*jG>>dp7BOa4pWJot(vsJ@scyqlGEH_OwMoic@i{ApEj7f5_*<<5 z==PbB7ihA`LS_{QXC_6bU{o56pdqr%nU-noFgMnrX7)%9mMQv0RrpEzStASNoXusC zI68P!dqi0h5gg8}h=j{|=zBMB<0+mE!iHHLh&PUzDLSsw!1g_-oGyA+K_LdV>Ll8! zSerP0^2{i{kDvIdqPS10uLCGj!##%J37w6s@f*=O8|kH9vr7IrP~TAZlpm3doX$#5 zjb-S~kc*g&Dbumq=z2KIBdJP{^#xO25_3WxTHniB%-m4Y(M(~i#XW9r*04~-#X&aS zh3jFMOCKnYc31E^1gU+<7gEWK+ZN;sH$|5&Vn*XP;<5T0H@p4v!i36YC+IlyU$*yT zYL>DfX%jcmb8=b?4qRzScy3K<5iG6ImD_ot1-}&EnsUj%m|LdMg?!G-t-fo{)XGZ? zI~8J&MMF+zqP+Zga_*F7Cs8BD*}HJ>S@N|LSC}PptlPOt7#rP{Uuc?oIupp8O3ny0{4zD zAE=O{PN=S;V(UAI{Q-{Hy(>dL*e~{|ko(1Xg&uKSxrmd$fgckxcg`fV{u&K_2y>#6$b=Qdd z4>_ZA7`GJRMZ*JnnmY%euVO<}V?7l+qs9k#zlQE5$201GciSm;)f`MmwzA!*ZI2Ei zQV^a}w?S8jl-DHOr?g=EytcfeBH6pKQOHh+-?K$k>Ne(Vldm7Cwgi#h+1gv$M5lFrEDdM0Y8? z!4sxiHXOl9p#?!ikae_lieGj?i;2cHX)hKbG(zE1{Xh`Br-_Gke{gj)&GboaPFSX+ zmq%Wkw)qL>lfvC4a$#~cR51ygXkfyF!B8la*&GN(85Uu7Bh|3)ydtLb4tJ7S>37g; zMxmI@PP6?hCI|h!AC69W+J$H8#h*?8y2ktJyyqhcP|2l>K>{W73Ex46Etyw*0owSj zNnY0Wg;O^86Fl)}Q;0zga-@D}{h~T8J4s4tto4xt!bvVxph-#Q*>LOJ#p6r#zvpq` z_02CSVS6or4Wa;e^nX9I|F2I3J;Ci-I0UN}cZSKxd5)yU&lviSsxwPR z^WXYaXY0MeZ^j6GVy2K4k8k>FBS{F1--&8+nPMwwF|9mW9JJ*|ozVjGd5n{A}Zj=&^C0dSQ1`7>CnpHCe|qx^rx6rzHDzgP=Ti zfMjpZjf{o18qCaI1&b!!fya*p$_w202jLU>gFyckJ38Q^Cstu2svRL7L*ts?`?!Au z&_Z9IvScpyrC&px205+s|1I*~zg?wrcm7)L#)|0wtrfijh_-PynAEgGJ5n$iFhpx* zt%+9a!P!Pqrekw6!lb9lV*RZRN#rEC<` zRFn{>G`Ih4%i?j(9GS<#1~QZ_PVj&9P*j)63)7ub&ylGH=Kb}2F5ZL;)d5;?nm)^y_%F50{GODdBYplN$RIqtFpv-}!@3kFDic%8X{_!~Dm<^c2sXo*v zXoWv{B)z)PFtW=ex#P)?e*%C0*`2KY)j!k7KrJQAN_i>>5*s9dkpZULz2wz#Lezm@ z_qnk#LiORbiJ0bVh?zBJmettF=PB)F{=_bQTuo)-Ffug$R}ze^zGYuQ+iSYJA?Fkk zN*q<-xt;;c@Ruv8liA}di>>OWE>a9meb{y^5i*B5ao^glCVek4tTu`n(-Ve#)&1_x zncz+}I*<5pGIq>U2|5Vb<+T~F5Fz1dW)7+IzIF<)jZI^oh##;N$p;50fknuAi#MAczcNcENYhCtC8W^1AB=~#v0du=Ot50@;KIL0qgXrOA1 zohw!f;^@-p2t=;tM>yQdP!TdKqNm?ngU0Zfmfzho`Nj995eTX zk=-1`RFS7jMK83=S3_V)+$&8+`!TyUbNMHvWpP>8YyOXTsT{IfW;e-n`~rB=iJUAd z8aDYH(zKfFi_R^n85yifteXi;cCkG{z8%wTbL)PiNsCUqRx&ecxlJ6(xO=_pxdEBr4!F zDBxo0A;8FK@G$x0sP~95xivG~vyDt9^p2X1ecdi?utp73)&a}Zo3oKZ%k&*w{ zFpYCx>LXh9dAHSX+W?uk5F0zfZgk@aeOVr|WL|%)C`O`cPy#b&nm(teR+6L#^Qb?! zyS@GfZ~w}TlZ2%deD07Cuz0K^m7gY+9rIh^FeYxhQcRuu){}T0=o_8-GoSC9K~!N^ zJ2eU6KYf5SVrGa{N%q}{A=1Dcg_*+yJTc*QsG>S2n{zUxh{Kgl3|?5q2|+76SUH&Q{c>At`@BwXm$#m-32)He|zYd ziK^L%dKKY6Wd-Ku(D%?>dy><+xz~1}449jLpwd84pnsd_|B{LQ>@yuEgZbPcF^p42M7x|cLsXych zV87V>C@!1R*-wt>qos1*g%P-O>Abd)ygjiuYllmW zLv7^noPW!&)knnL?Q|fVqnoQ~tLvGJPF(7+wS&hc9~gMxB3Sf~d!A;2n%a(weR_2t zVYTGQG>cU7M!l#Cr+o?Gh2fZ?6$@J`lc+P91?F6q$d|rsQTUiSa%zKe=-Q;!XEmD{ zc5;auO-2#6G3atxcsFp9mm0buG(n7@;2WLy5Zni~B*6 zjHvmx)FxHTsN}PA_6el{xPkDY)ovvpq;)kK_sK4V!$|TS(Y{P?qOrQYJL;{yHRoz0 zHiqnrzf4<0%$!JXu3K9;R*0%r$F#%RrZ2$Ffuk#Dm+bjBLnVdLo3b)xBg;z;mT~y` zyYfn}2s(;{$o~X)FYuH?BD71S){fv@I`A%|1rGjW=mFq`n zm8Zh^{WN&`sP-Ee%!G=v>9^kh-<<9N11@O!=98f~-HzIj`00*rIbHjyEt*Dza%rzy z$5d3QfglO@vR-7*nr})SD$Xd1oo!QRyP;#zPqpwv(M45;e5B1mu%WYDRt>UfSnT<s#|h zM>;Zgq0v>5xOY<#DNZ-@hTMo>>hD=o_PnyzGf_&?|9l+x!qfB{k~7lTeVecBWnTRS zmcbxBH!Fi-`#KK+t=@~zPAs!B&$v#Ib;MO>TrZ#8aP8Jme0?>Mk*}^-ZW$J!g|nOx z=y!gF2~&zf_<{O+AIRk)WNn#6>sI(u;}9aa_h>oyRt>@R1@kl4uIvRl^UD!(VdKS1 z67XLe@Qkcb*CFi14sGGsU6sw|ghAGEhLab`GbJGuU>o;Gwoc>m#b&eyE(}k?`%9Ii zDq|9#X(l#Z+7RNsmY{NHqPPavDa&D9XZ>N1dcwWB7&!=o=^rSmxHS|QUn$poPYNgd zRmu|*IWzum`nJ`Z#@k9>6I#ama6*7>;Loyn_T1BAE)z~-V zx8kY>*kpOG%Mu~c$eeB5Cor(>9Tmx6{S0bOV-oZS15vfHzd0JfjKjO+0H0cbeYC0? zX!e7Abp8)R2ME-6H`9H$zF+=pAKQ3%KEcsF8lM`IxorP&|I=}>izUA~Ro<1{j)aKE z$wr7jLTW1j;pJo*Qtsis2s6vY*}CG$Q$-Ib$fqeV(Tip5yhn;br69C8+fkdH?Ecn+ zpzEaGi^2?_4xhJEJDy2?m$N`nd1biv8>OrI&f}@zw=)0*!1@Kgd3KZ!OUEs#$z#(I zh1P3k^qICN`~@JY$WX}-saH?Fm@Ed%(;cf|{CuB&=t}z^f4_^5bx=B5l4%&MV>qZ8 z8pgdg%st1gRMgQN6#T2C=H1jScP1+Gn5&ydIhfh4dDyLkaEniuhE!O-gCb@1@%Vpz z3f~{!J?4M8``4$m|M4Q(R!9@F9V^7erP8nPj$(Q*D_ zd+7e9Ti_J6q-zhTIF(*^ztCL_T^}Fgx!E%tp-KQG@L_T& zluiJ|P#T~~Tpp6P5F3Q&OWd135Z+qoPBPnS(Hri<18AUtEkxi?CYSayL!%zUBDli86J1%B_C#_Go3_O)r6Pj#B?63!tD{8XPK z7-@C{aj|sy&7;z-S$O$r_#Z>H*Evon9hN(mk^j8XX(rsA+>@jv3sDt@l#-HyXzr%y z>4(Vz(G0Fs(Dq-D2(1h{m!oOEiQ zi!E$}bOjtmEIxhd+DfR=+&;m1qL>9n0w%fm*IgE`Eu8Kc7f(0_$|Q)FNNQb{TDI@V zSbKRxNhfq$dHK0oLba$BQ>lWFrZQ&Z_o>C{1Ls6Ug+*7QBq7ig{OfS>#;MEI zXg#^%j!SvL*|Cuwt@)w6^bgMNoOvE~mdmp$uc}XjMO&phW!@9f`}O>TQM2Dk2>bu7 zV1M|44AnNH9wQa4T!@`5Xa1zz0T-4-Bb-o=v2*=00yw?M2mKMBN#=7o`1c1CLlZjzC~UDGrguVXG8d--|yXe{Drc;5`+ZSCse(hZWh>K|M!d z_-vuL>-b9#EBOh1WCB%wmzP_AL@+tp7FYj)+boqNhm1@=hl|HZrntZ)xjl)qX~a#G zEneYEMtRD*&4D~d)5qZYUQt;JcoDfw@3qS$k3Y{Z#N(9J_{@Hk~z8UBV1wWj%ngi+yTa z8I!ObH<;SG+~$NUNuDGXUWNKf7ZO8p_6a5~%9^Q6W!XrWkp&fYZP$AF%+zgXk@be` zEO?tU$GJ{pJJDg<8FM$4N4ayoY`&b*tLiZn+cod$J?HE^1u}{KX!N9wR7dijU!SmX z*rJbIR7=rqS< zLu|rvHPAkmB(y&Zp3`G|jEhqmPeIw^;ms`)d0sXj$ zK{z*Yya-7=_``5AW@MKQ)4i9eXeOzurQT7b#cm~Iq@RxLC4jrrJhz}|oC3ZYZ8qRi zDf;cXGllh{xbM1F2BTFD!aH@NOMQ-I@H~-cl1uF?ZJ<*IS8AtIj>V4xf$}T*IVuzG|o2GXKCu^gT|{)xwnMM`f@GFs0QJo)k>}C;Uk5o zXX!6?aI;?}8$3WRkXkW{+Cpsl`aJ|UD13*T)zMP)ZkPF%hcdKh;bjU-jGW1~?`MdZ zB?@hlUne0jo1px_Tjeo?<*HCTt_Kf zQa)(Dz8Ubv;NA$WQIeE$%bebh?E;VY?2weja%fJZl37xKZK!Wh#9%HiFNn<63IQ)e zNZw~=@uHme?*^(Xomrw%*Z4zjwN9ysM!I3ibV7^fK^-O{&z&WNI@LY~Tf8A4$Kk|CN+BKc0R#xefDHjqY2NgD+$VE-FUg;yFut-eeFJ~cJIif`$+?6av8wzl(nd785wUD>YV2^ z(5-Exy27-?5>dzrRN6gTK`^b*d>z3VSJby#i%*s<;@ z->JMk8d4Hj&SLfovuK_CY@9WOitP@3ZR1(02g-h1X@+w*Hq~(KEeUbWw2HIvTeT*t zS$jfg6_x%cxFM0TgUB_1SnIPaafF9fBBRx^JRpfWkhH?R7l=G#%xfpKH};yDY#I@ty(5@w3G4>V4Aav@ z$$2meKzGQqIR~@W62}S=v-&C=h|ra6DJHYT*#3_M@f(6{Nc!xedID$?)4ZWYOiJub zi2ml@T&#zLZmfkZW#z*z7}MT3d19I|omJQ<;GNl2`e)7Wa{Keg4GT;Xhl3HK{V5?s z8nN-$2SdeDGsDuCdOy3{ehZ1X{pa+5gOz>yZJqa@TLph|5dQE>`7I26SHf@utWj~+ zPUM)kb7pn0dPX>Rt+wy**_QJuwQ02R=;9Ko+cRM{7g_v*}`uu!`Mt5zSWF1Dn*&J8bXfIT1M3GIZow zsZ+6YaK`kzt%lTob=GaE9)^16=GIm>>70JA9hfjy8z!qFsGo^)yyJppdU{OvB-a5x>*C5HhFFBLTH7}t zYf1<~UQ9#?70+E8Uw+45U#7P1)`c85K4*=Qo@d%4fW__8lbp1-1qQxzC1ZE>GSrP^ zt4hTv81{E2AJo4+I1Uc)+5(N}B$Io0>#sZAXqXz@s!wzPtDM zL^iuFpNdsoYl-o|QrX_#Ob~5OJ!G6=)@f4h zW!%6%(2KYT>iu%v)S%91G*+L=H^4E&F|p=moYLc3bkjhu0uW*NsWX({u2c-6Ni8QN z-(rK9aV8NCJIoUfkRd*5Dvg7_H~zXb1wt3=QV?mD5EKpO@~yP#iRKx>mBM%k^)K#~ z_BY^Q<~vvKw%o!n70YXuK#fYYNm1Nvfq2UEk?*tO7y*2&ogn*_u?3XDbF{ zAHVK{X16qKSWvqm^9Nbvv#he zQ*?Q3I?`F^dQkjQ$oXYpr_nEfcRb+ie>eR0$b=KLo-pfPLK{MHv3$!9he>TLP;1`y zoe4)bnYUDhqP=CaLAlzDRw-$KQjqbkN;*c?Xuc`DeA=K~-*|Q2oUUw=+OQ|4o+E@d z2)=YW;oF6W@0A&nlyRF+tjX~Y=8O~cmsnH~630~!&b}4acHVNA;O_J`nE6zt|H=F5 z@+-J=!UPxcVUkpK~=(~rS&eVSsrs=YQYSe z8HG!3agK9l5b(rITI|cZrL>_`l)$)RC0$;`ct@FIzV-KVjq{hXWNnGR{4h>< zWH@qUk$9oc$r0&KH`I$1_e#DRwKj%+lq3e1d5)jY`r$wmbx@VrV}lBwwab+E7fWMK z$==`1;!2mMhca>FYpR2aG>%aRMcTEgl(Y>{T{lWHIwpMPV#@Hrtqz`E&MD~2?s)&0 z5`46Fo7Hs$HYrlNIWig_Wn=K-q;{$&C!XQH2j3bLLTJgirkBRG>r)SxQ(dF*`-OwS zF>yZZLxtlq9TnjB)l931>XR2bosf_rQ!ua4%TzXH;96O+8cpCgvkbXy8J$cfyJt(w zc3vy|aTRCmCJli;P{ z7v=WmGJ1SDxvTLJvWTIWLhy;7YY+C4k2!P^OeUx0WH(m1%CBLa;&2z21RhdGFYXK` zwkw9>GBFn&t(kmsVYxQ~Qce*f6I751)b;wH*fStMoSxm-uXAg+%F{#Ci2dX=bsLDI zld8R|sTB62C2W+Ye3&iLHDJOcs&qUp>%Bx|30a{#8Wp^I(h~ewuS2PrqiJq0;7!ar)vC1 zD4U8wBgvJA51L9x=JDggV@g8#YBWM}!Td4}`GwB$;w^+Emrj>w8T7enLZOE?3&Vsk z*Ur1n!~=`z`{anuTEEh=nIPo4`|3E=aBMgpX%n}!w!^6^|5{`^SXTnR2I39vU{HO< zK^*{3{%ZE1+_hYoq^TrshB#x5vyUSk^|(9Gv-4#ZZ;8)YmpPrFswHJWQ{?lKs` zq!?>6_;|6)3O*O5vSqDHAByd1I9lDRJEz@9#8g>c#&l}MlhJ%QX-$`10H3-QVWOD| zomJ+>Co1reEig=uCDKa>aOH$&G~MF6C+C}xX-^m(Fqf=_B-IJeJ=e3zh^1vG9GN|! z>rocznQ(Iw_R^(~P}jv-GE>$SyC-Z%03R5t^)ZgqmF~$f>hz-JEIWF4Tf;7O!$LaM zvcI8KMcJ0Wv!%rGwpuM8UF(Wj^Wt|bg&Grz*%w&Y<(8v=5+H*A;Y;ogjA;`K>#owT z=izM~6I^tqUdj}z-Rzd>ECUEho}XRPi+U6$rpQERER~GDlRPKL--s-xW9o@54nL!J z8n`sz>dBzT=Wr<&XJVE0YtCBh?%GUmW@$wcwSUKY9%c}hVL2v(46+nN;~{s@XYKJ zT!5;tLBoHY*OTVUq33C{h-S^|l}x~@;Vyh(NS!ym?=Lofw0{2rzMY00k8PB^adr^k zRpLBAiT83gPwXJB{ymxP?Lw7zl9@F;*-TkQ+M9fsJoPQw9rQO^R)tEXpG4$Cu=_vA znVXf-TP}q`?3f7>BFlS6s&QLbXeN)!F~5L*iP>H3%*MbX?n!uMmx#L*WHOH-W~`8p zYob!MMogyTBbtMM_;CFBl514{Cuf6y(WC<@Z(;uw?*1>L2bR`rEUdrPrvnMD{zmAy za{tdn{k#WI+tVE0;i)oCdj6|6z4P*iR6z--aOdb1*?BQwCk&;K!+0mDE4eqRU|l1A z280wzL|Vsk!UxZmc?)`HCpyT*bw#%I+IH}Riqy(#2K#+6Bw2?^qb`7t>9HL>O@yJ#J+=!Y5mm`XqB3&+0}3)%^tk?~akldvLBy z(W*;(niLA^Lpp=awwps1p&vRXB17Wf9=I6=>g*xrn$%}$f}h&R0#d3nl2UBeVzUE* zD4p_OekJZ(JZ9n@O>0yqg_yaL%FcKxn%FP(Vmqu`s9B(~cz}V0OGVQ+(M<1pb!Ki- z;QXErs4^``C9l5Q8QH_ewQ#q!JgNkimJl4mFf&Rma^-MpZM)2hJj1hPwA0#iG!t*3 z@{;$;p7hh9EU8$|txh~H{p+4e!_+~TJq;PsE=z+(h<$GTaH%!=h(w>M>PRnMBz*pO z>Ppq{toa15>{(D@`_4HE@3CHrEV}&_ zsaV#I&J*P!gTk2gMPA|cLH}JHZ}QjS*T{>zeBjIKp1G#ekS(@)W&5oo~|cJRZ4zGLx?`^s^TKIpm&GmL$O+eXh5bZ zVxPBPJ&(xg|B8rvEN3L9;=^pYx{lz4quVU>CfQ&i6H@Ac?g9OioA!525f(8%28x8T zvZ=fRHJjR!t4X$wyKza5t4$|tA|ap16Lb&rQyuy$t54+ms`r1LxUY1tN1eJWCI50l z{<0M)R@J{*9_+s&8s`xS=N#!@F7(sYvUKHXCRXLh@j*2OLU>JloY(S+FhHqB7-@zH z?w*X#Kwz0>)7OX!>TY~`9U6nGGKUvtw+v!#1;>gRLp2KpjE&`$L>4yPFIO~ph3kGB zvOE0ey5S)NqH@HE_)d-U#-3*{e6!g_4e1$S=%P|;|M^H@O`RV7_PA}L|GaW~vek-le?{$;zZ@78s}}8$`j^yR z`^$laUjg8BB>$3H?7te=6}qdtCIi8LNiFVQ4GehJ7ydUaLv#Xts-jyi+2dt1s8Dl) zXH-;vQC&>HkWbPj2|?95;6y{3WBwg$WH{AA_RJ^j<*Ug=!Z7L^CpBU)PCo=@&=dfQ z|EIuBkHB9sFn@aYzr7#llkrax@5mpR;(reAlpzA(d~XLE!Iq~$I%!tr zO>!V>?4rBgVbvX5{Qxsr^(-O*@s{d<;adgGj&h^~1OE5TAW$@^UaM2p!`ok|PL07K!kNqH z$z3B1Wutfm%^11Jh+*C1A4>F=OkuKNzCq8({=wP$Z^C|=tNF#2*o>FVUvZvbuZ7H( zC4HV`x5#e_t$ikXg*P=)*lrlrkIVo z&CR3A!=vjXg-Nz7L(xYrK1W3uqXFOm&_{(P2Z0b~Zq8)MjLwYKu8#rdDy&h(X#??D zoW+(AfJ2*))0JD-C;a|%ODazm@1?>*WU~~ri&u+^H)utO?s1N,k()d0k90LdWq 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

    HashHashing Size (bytes)
    HashingHash Size (bytes)