Contract 0x55c2Ee4f0a21c59F949f475e52415b5684280CB1 1

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe3cd2fc46587f9264471e17a2d04a23353a2f1f4d317a2d724f025801e08ae8bWithdraw90745092022-04-28 18:24:2124 days 7 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0xe8657511688f76a8b9c4d83d051ed3483791594f3082bebb3b44c04220a85ac9Withdraw90744902022-04-28 18:23:4324 days 7 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0xf33f4305f0f3fa5eb5e8582a32ad59a73589d65c8aec63310b7fbcc87ce00d6dDeposit90738552022-04-28 18:01:5624 days 7 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0296655625 31.25
0x8e2ce945924664387ce68d25c70ba146aaf26b9f38350b4d45388c29a2310c5aWithdraw90737292022-04-28 17:57:3924 days 7 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01036303125 31.25
0xc1225eb60911966538f2d873c577c13690606751c6ac3ede9ae8a0c7639f0d49Deposit90736312022-04-28 17:54:1524 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0293400625 31.25
0x364bdb46728bc6a93b1ed43464fa0782c1f67a44d66a025d997988545dae5696Deposit90735692022-04-28 17:52:0224 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0295028125 31.25
0xa0eda4642e63fef0774aa9cec197a9ee1a08bb39d7bc94b136228245bb003a28Deposit90734522022-04-28 17:48:0724 days 8 hrs ago0x827dfa07acd602f59e3b71b36ca0d158786b6471 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0295028125 31.25
0xaece41ab59f30a7da8baf428780e0bf6ba9a91e91c9fd1f3fef3287e4fbb3240Withdraw86930102022-04-18 19:17:0834 days 6 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021509375 31.25
0x2119bddcc936af4b09801aaa301ab7111afd077e252cd26dab9f9cd77ae4dc33Withdraw86905302022-04-18 17:43:1134 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021509375 31.25
0x1d620d6ef1a67741bce5a8416741af005893c4bcc28d34c23cc5678252daedc3Withdraw86903762022-04-18 17:37:4434 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0x6e9d19585bec2b5307099a111d8979be4c377191bf394f880b9805c25724c4b7Deposit86903242022-04-18 17:35:5534 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0296655625 31.25
0x4b5e263fada983d5747a361982d804cc90661a334eb6ce2079fbb271b040ad84Deposit86902842022-04-18 17:34:2834 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0295028125 31.25
0x406301c46d972e46083f4ca377f19de5a062d7ed668dc1afe3e941a5e99917b5Withdraw86902152022-04-18 17:32:1034 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021659375 31.25
0x4bff1cea50b95428bf7e7d3047eac21c8175c5128609442adf369f6ab677b126Withdraw86897022022-04-18 17:12:3834 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021509375 31.25
0x2cf9b8780259c98d9be271cb63d1e8f1ff4d125efe10626bcd061a67fbe66ed3Deposit86894012022-04-18 17:01:1034 days 8 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0301991875 31.25
0xca013f8da1042da6555df9cc6ff45631c8df0eb3f8f11c21c17254b8931b7dffDeposit86885492022-04-18 16:29:1134 days 9 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0301999375 31.25
0x648a7e5bf379f91bfd42de9326223464fe6130ea4c56f8f8d3744e96dac2c39bDeposit86885042022-04-18 16:27:0234 days 9 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0303626875 31.25
0xbe39e4225c5dfe0a468d682526e37cb65c001bbf3e64e180f40e85c92631b607Deposit86884902022-04-18 16:26:3134 days 9 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0297116875 31.25
0xe193793b99d3e7c5623243b92b246513b5853d472ff39f3c2c5bb18226a9380bDeposit86884082022-04-18 16:23:4634 days 9 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0298744375 31.25
0xcb9d8c49edbf1ae3d33e819b312a7824245f1acebdcdb87e7fc3d6c2b63f8a6dWithdraw85714912022-04-15 9:39:4137 days 16 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0xd72d89885bb40e34ada238fc1066d3221173dfd42f034f3f1a8f3d3a77db6d09Withdraw85714722022-04-15 9:39:0137 days 16 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0xef091ce5de939be320687d24a2aba8b3b886a1cd1f4ab3122b8838c98c5e5605Deposit85714422022-04-15 9:37:5237 days 16 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0298744375 31.25
0x8c9f7372413bf27fececbc7a871e61b391a9ba80c3c889785d7d0fe2756e01adWithdraw85703312022-04-15 8:54:1837 days 17 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb10 AVAX0.01021621875 31.25
0xfe572e1bb2fb36465bce463e17e6aaad92aed8c77b323554c94824f6fae7660eDeposit85703152022-04-15 8:53:4337 days 17 hrs ago0xc10c2d8dfaa8a571c922c714584fbf480873b0b0 IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.0300371875 31.25
0xcafa712d3c419c2746d3929917e3f364a7120bbe0a75ac80b02a512914f49297Deposit85461972022-04-14 16:03:3738 days 9 hrs ago0xb955db051bf09a645c26730752e28f5e3776088f IN  0x55c2ee4f0a21c59f949f475e52415b5684280cb11 AVAX0.02389955 25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe3cd2fc46587f9264471e17a2d04a23353a2f1f4d317a2d724f025801e08ae8b90745092022-04-28 18:24:2124 days 7 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xe8657511688f76a8b9c4d83d051ed3483791594f3082bebb3b44c04220a85ac990744902022-04-28 18:23:4324 days 7 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xf33f4305f0f3fa5eb5e8582a32ad59a73589d65c8aec63310b7fbcc87ce00d6d90738552022-04-28 18:01:5624 days 7 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x8e2ce945924664387ce68d25c70ba146aaf26b9f38350b4d45388c29a2310c5a90737292022-04-28 17:57:3924 days 7 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xc1225eb60911966538f2d873c577c13690606751c6ac3ede9ae8a0c7639f0d4990736312022-04-28 17:54:1524 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x364bdb46728bc6a93b1ed43464fa0782c1f67a44d66a025d997988545dae569690735692022-04-28 17:52:0224 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xa0eda4642e63fef0774aa9cec197a9ee1a08bb39d7bc94b136228245bb003a2890734522022-04-28 17:48:0724 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xaece41ab59f30a7da8baf428780e0bf6ba9a91e91c9fd1f3fef3287e4fbb324086930102022-04-18 19:17:0834 days 6 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0x2119bddcc936af4b09801aaa301ab7111afd077e252cd26dab9f9cd77ae4dc3386905302022-04-18 17:43:1134 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0x1d620d6ef1a67741bce5a8416741af005893c4bcc28d34c23cc5678252daedc386903762022-04-18 17:37:4434 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0x6e9d19585bec2b5307099a111d8979be4c377191bf394f880b9805c25724c4b786903242022-04-18 17:35:5534 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x4b5e263fada983d5747a361982d804cc90661a334eb6ce2079fbb271b040ad8486902842022-04-18 17:34:2834 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x406301c46d972e46083f4ca377f19de5a062d7ed668dc1afe3e941a5e99917b586902152022-04-18 17:32:1034 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0x4bff1cea50b95428bf7e7d3047eac21c8175c5128609442adf369f6ab677b12686897022022-04-18 17:12:3834 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0x2cf9b8780259c98d9be271cb63d1e8f1ff4d125efe10626bcd061a67fbe66ed386894012022-04-18 17:01:1034 days 8 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xca013f8da1042da6555df9cc6ff45631c8df0eb3f8f11c21c17254b8931b7dff86885492022-04-18 16:29:1134 days 9 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x648a7e5bf379f91bfd42de9326223464fe6130ea4c56f8f8d3744e96dac2c39b86885042022-04-18 16:27:0234 days 9 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xbe39e4225c5dfe0a468d682526e37cb65c001bbf3e64e180f40e85c92631b60786884902022-04-18 16:26:3134 days 9 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xe193793b99d3e7c5623243b92b246513b5853d472ff39f3c2c5bb18226a9380b86884082022-04-18 16:23:4634 days 9 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xcb9d8c49edbf1ae3d33e819b312a7824245f1acebdcdb87e7fc3d6c2b63f8a6d85714912022-04-15 9:39:4137 days 16 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xd72d89885bb40e34ada238fc1066d3221173dfd42f034f3f1a8f3d3a77db6d0985714722022-04-15 9:39:0137 days 16 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xef091ce5de939be320687d24a2aba8b3b886a1cd1f4ab3122b8838c98c5e560585714422022-04-15 9:37:5237 days 16 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0x8c9f7372413bf27fececbc7a871e61b391a9ba80c3c889785d7d0fe2756e01ad85703312022-04-15 8:54:1837 days 17 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d40 AVAX
0xfe572e1bb2fb36465bce463e17e6aaad92aed8c77b323554c94824f6fae7660e85703152022-04-15 8:53:4337 days 17 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
0xcafa712d3c419c2746d3929917e3f364a7120bbe0a75ac80b02a512914f4929785461972022-04-14 16:03:3738 days 9 hrs ago 0x55c2ee4f0a21c59f949f475e52415b5684280cb1 0xc4633dab621356f1b7432a9f0a166e359b8911d41 AVAX
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AvacashProxy

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2022-04-01
*/

/*
Original code extracted from:
https://etherscan.io/address/0x722122df12d4e14e13ac3b6895a86e84145b6967#code
License: MIT
See more in: https://etherscan.io/contract-license-types and
https://github.com/github/choosealicense.com/blob/gh-pages/_licenses/mit.txt
*/

// File 20 of 20 : SafeMath.sol
//

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File 19 of 20 : ITornadoTrees.sol
//

pragma solidity ^0.6.0;

interface ITornadoTrees {
  function registerDeposit(address instance, bytes32 commitment) external;

  function registerWithdrawal(address instance, bytes32 nullifier) external;
}

// File 18 of 20 : Math.sol
//

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

// File 17 of 20 : SafeERC20.sol
//

pragma solidity >=0.6.0 <0.8.0;

// import "./IERC20.sol";
// import "../../math/SafeMath.sol";
// import "../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File 16 of 20 : IERC20.sol
//

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File 15 of 20 : Address.sol
//

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File 14 of 20 : Proxy.sol
//

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internall call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 { revert(0, returndatasize()) }
            default { return(0, returndatasize()) }
        }
    }

    /**
     * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
     * and {_fallback} should delegate.
     */
    function _implementation() internal virtual view returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internall call site, it will return directly to the external caller.
     */
    function _fallback() internal {
        _beforeFallback();
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback () external payable {
        _fallback();
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
     * is empty.
     */
    receive () external payable {
        _fallback();
    }

    /**
     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
     * call, or as part of the Solidity `fallback` or `receive` functions.
     *
     * If overriden should call `super._beforeFallback()`.
     */
    function _beforeFallback() internal virtual {
    }
}

// File 13 of 20 : UpgradeableProxy.sol
//

pragma solidity >=0.6.0 <0.8.0;

// import "./Proxy.sol";
// import "../utils/Address.sol";

/**
 * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
 * implementation address that can be changed. This address is stored in storage in the location specified by
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
 * implementation behind the proxy.
 *
 * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
 * {TransparentUpgradeableProxy}.
 */
contract UpgradeableProxy is Proxy {
    /**
     * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
     *
     * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
     * function call, and allows initializating the storage of the proxy like a Solidity constructor.
     */
    constructor(address _logic, bytes memory _data) public payable {
        assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
        _setImplementation(_logic);
        if(_data.length > 0) {
            // solhint-disable-next-line avoid-low-level-calls
            (bool success,) = _logic.delegatecall(_data);
            require(success);
        }
    }

    /**
     * @dev Emitted when the implementation is upgraded.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @dev Returns the current implementation address.
     */
    function _implementation() internal override view returns (address impl) {
        bytes32 slot = _IMPLEMENTATION_SLOT;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            impl := sload(slot)
        }
    }

    /**
     * @dev Upgrades the proxy to a new implementation.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Stores a new address in the EIP1967 implementation slot.
     */
    function _setImplementation(address newImplementation) private {
        require(Address.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");

        bytes32 slot = _IMPLEMENTATION_SLOT;

        // solhint-disable-next-line no-inline-assembly
        assembly {
            sstore(slot, newImplementation)
        }
    }
}

// File 12 of 20 : TransparentUpgradeableProxy.sol
//

pragma solidity >=0.6.0 <0.8.0;

//import "./UpgradeableProxy.sol";

/**
 * @dev This contract implements a proxy that is upgradeable by an admin.
 *
 * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
 * clashing], which can potentially be used in an attack, this contract uses the
 * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
 * things that go hand in hand:
 *
 * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
 * that call matches one of the admin functions exposed by the proxy itself.
 * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
 * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
 * "admin cannot fallback to proxy target".
 *
 * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
 * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
 * to sudden errors when trying to call a function from the proxy implementation.
 *
 * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
 * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
 */
contract TransparentUpgradeableProxy is UpgradeableProxy {
    /**
     * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
     * optionally initialized with `_data` as explained in {UpgradeableProxy-constructor}.
     */
    constructor(address _logic, address admin_, bytes memory _data) public payable UpgradeableProxy(_logic, _data) {
        assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
        _setAdmin(admin_);
    }

    /**
     * @dev Emitted when the admin account has changed.
     */
    event AdminChanged(address previousAdmin, address newAdmin);

    /**
     * @dev Storage slot with the admin of the contract.
     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 private constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    /**
     * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
     */
    modifier ifAdmin() {
        if (msg.sender == _admin()) {
            _;
        } else {
            _fallback();
        }
    }

    /**
     * @dev Returns the current admin.
     *
     * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
     *
     * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
     * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
     * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
     */
    function admin() external ifAdmin returns (address admin_) {
        admin_ = _admin();
    }

    /**
     * @dev Returns the current implementation.
     *
     * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
     *
     * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
     * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
     * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
     */
    function implementation() external ifAdmin returns (address implementation_) {
        implementation_ = _implementation();
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     *
     * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
     */
    function changeAdmin(address newAdmin) external ifAdmin {
        require(newAdmin != address(0), "TransparentUpgradeableProxy: new admin is the zero address");
        emit AdminChanged(_admin(), newAdmin);
        _setAdmin(newAdmin);
    }

    /**
     * @dev Upgrade the implementation of the proxy.
     *
     * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
     */
    function upgradeTo(address newImplementation) external ifAdmin {
        _upgradeTo(newImplementation);
    }

    /**
     * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
     * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
     * proxied contract.
     *
     * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
     */
    function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
        _upgradeTo(newImplementation);
        // solhint-disable-next-line avoid-low-level-calls
        (bool success,) = newImplementation.delegatecall(data);
        require(success);
    }

    /**
     * @dev Returns the current admin.
     */
    function _admin() internal view returns (address adm) {
        bytes32 slot = _ADMIN_SLOT;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            adm := sload(slot)
        }
    }

    /**
     * @dev Stores a new address in the EIP1967 admin slot.
     */
    function _setAdmin(address newAdmin) private {
        bytes32 slot = _ADMIN_SLOT;

        // solhint-disable-next-line no-inline-assembly
        assembly {
            sstore(slot, newAdmin)
        }
    }

    /**
     * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
     */
    function _beforeFallback() internal override virtual {
        require(msg.sender != _admin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
        super._beforeFallback();
    }
}

// File 11 of 20 : Initializable.sol
//

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File 10 of 20 : ITornadoProxyV1.sol
//

pragma solidity ^0.6.0;

interface ITornadoProxyV1 {
  function updateInstance(address _instance, bool _update) external;
}

// File 9 of 20 : ENS.sol
//

pragma solidity ^0.6.0;

interface ENS {
  function resolver(bytes32 node) external view returns (Resolver);
}

interface Resolver {
  function addr(bytes32 node) external view returns (address);
}

contract EnsResolve {
  function resolve(bytes32 node) public view virtual returns (address) {
    ENS Registry = ENS(
      getChainId() == 1 ? 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e : 0x8595bFb0D940DfEDC98943FA8a907091203f25EE
    );
    return Registry.resolver(node).addr(node);
  }

  function bulkResolve(bytes32[] memory domains) public view returns (address[] memory result) {
    result = new address[](domains.length);
    for (uint256 i = 0; i < domains.length; i++) {
      result[i] = resolve(domains[i]);
    }
  }

  function getChainId() internal pure returns (uint256) {
    uint256 chainId;
    assembly {
      chainId := chainid()
    }
    return chainId;
  }
}

// File 8 of 20 : ITornadoInstance.sol
//

pragma solidity ^0.6.0;

interface ITornadoInstance {
  function token() external view returns (address);

  function denomination() external view returns (uint256);

  function deposit(bytes32 commitment) external payable;

  function withdraw(
    bytes calldata proof,
    bytes32 root,
    bytes32 nullifierHash,
    address payable recipient,
    address payable relayer,
    uint256 fee,
    uint256 refund
  ) external payable;
}

// File 7 of 20 : AvacashProxy.sol
// https://tornado.cash
/*
* d888888P                                           dP              a88888b.                   dP
*    88                                              88             d8'   `88                   88
*    88    .d8888b. 88d888b. 88d888b. .d8888b. .d888b88 .d8888b.    88        .d8888b. .d8888b. 88d888b.
*    88    88'  `88 88'  `88 88'  `88 88'  `88 88'  `88 88'  `88    88        88'  `88 Y8ooooo. 88'  `88
*    88    88.  .88 88       88    88 88.  .88 88.  .88 88.  .88 dP Y8.   .88 88.  .88       88 88    88
*    dP    `88888P' dP       dP    dP `88888P8 `88888P8 `88888P' 88  Y88888P' `88888P8 `88888P' dP    dP
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/

//

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

//import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
//import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
//import "@openzeppelin/contracts/math/Math.sol";
//import "./interfaces/ITornadoInstance.sol";
//import "./interfaces/ITornadoTrees.sol";

contract AvacashProxy {
  using SafeERC20 for IERC20;

  event EncryptedNote(address indexed sender, bytes encryptedNote);
  event InstanceStateUpdated(ITornadoInstance indexed instance, InstanceState state);
  event TornadoTreesUpdated(ITornadoTrees addr);

  enum InstanceState { DISABLED, ENABLED, MINEABLE }

  struct Instance {
    bool isERC20;
    IERC20 token;
    InstanceState state;
  }

  struct Tornado {
    ITornadoInstance addr;
    Instance instance;
  }

  ITornadoTrees public tornadoTrees;
  address public  governance;
  mapping(ITornadoInstance => Instance) public instances;

  modifier onlyGovernance() {
    require(msg.sender == governance, "Not authorized");
    _;
  }

  constructor(
    address _tornadoTrees,
    address _governance,
    Tornado[] memory _instances
  ) public {
    tornadoTrees = ITornadoTrees(_tornadoTrees);
    governance = _governance;

    for (uint256 i = 0; i < _instances.length; i++) {
      _updateInstance(_instances[i]);
    }
  }

  event NewGovernance(address newGovernance);

  function setNewGovernance(address _newGovernance) external onlyGovernance {
    governance = _newGovernance;
    emit NewGovernance(governance);
  }

  function deposit(
    ITornadoInstance _tornado,
    bytes32 _commitment,
    bytes calldata _encryptedNote
  ) external payable {
    Instance memory instance = instances[_tornado];
    require(instance.state != InstanceState.DISABLED, "The instance is not supported");

    if (instance.isERC20) {
      instance.token.safeTransferFrom(msg.sender, address(this), _tornado.denomination());
    }
    _tornado.deposit{ value: msg.value }(_commitment);

    if (instance.state == InstanceState.MINEABLE) {
      tornadoTrees.registerDeposit(address(_tornado), _commitment);
    }
    emit EncryptedNote(msg.sender, _encryptedNote);
  }


  function withdraw(
    ITornadoInstance _tornado,
    bytes calldata _proof,
    bytes32 _root,
    bytes32 _nullifierHash,
    address payable _recipient,
    address payable _relayer,
    uint256 _fee,
    uint256 _refund
  ) external payable {
    Instance memory instance = instances[_tornado];
    require(instance.state != InstanceState.DISABLED, "The instance is not supported");

    _tornado.withdraw{ value: msg.value }(_proof, _root, _nullifierHash, _recipient, _relayer, _fee, _refund);
    if (instance.state == InstanceState.MINEABLE) {
      tornadoTrees.registerWithdrawal(address(_tornado), _nullifierHash);
    }
  }

  function backupNotes(bytes[] calldata _encryptedNotes) external {
    for (uint256 i = 0; i < _encryptedNotes.length; i++) {
      emit EncryptedNote(msg.sender, _encryptedNotes[i]);
    }
  }

  function updateInstance(Tornado calldata _tornado) external onlyGovernance {
    _updateInstance(_tornado);
  }

  function setTornadoTreesContract(ITornadoTrees _tornadoTrees) external onlyGovernance {
    tornadoTrees = _tornadoTrees;
    emit TornadoTreesUpdated(_tornadoTrees);
  }

  /// @dev Method to claim junk and accidentally sent tokens
  function rescueTokens(
    IERC20 _token,
    address payable _to,
    uint256 _amount
  ) external onlyGovernance {
    require(_to != address(0), "TORN: can not send to zero address");

    if (_token == IERC20(0)) {
      // for Ether
      uint256 totalBalance = address(this).balance;
      uint256 balance = Math.min(totalBalance, _amount);
      _to.transfer(balance);
    } else {
      // any other erc20
      uint256 totalBalance = _token.balanceOf(address(this));
      uint256 balance = Math.min(totalBalance, _amount);
      require(balance > 0, "TORN: trying to send 0 balance");
      _token.safeTransfer(_to, balance);
    }
  }

  function _updateInstance(Tornado memory _tornado) internal {
    instances[_tornado.addr] = _tornado.instance;
    if (_tornado.instance.isERC20) {
      IERC20 token = IERC20(_tornado.addr.token());
      require(token == _tornado.instance.token, "Incorrect token");
      uint256 allowance = token.allowance(address(this), address(_tornado.addr));

      if (_tornado.instance.state != InstanceState.DISABLED && allowance == 0) {
        token.safeApprove(address(_tornado.addr), uint256(-1));
      } else if (_tornado.instance.state == InstanceState.DISABLED && allowance != 0) {
        token.safeApprove(address(_tornado.addr), 0);
      }
    }
    emit InstanceStateUpdated(_tornado.addr, _tornado.instance.state);
  }
}

// File 6 of 20 : AdminUpgradeableProxy.sol
// https://tornado.cash
/*
* d888888P                                           dP              a88888b.                   dP
*    88                                              88             d8'   `88                   88
*    88    .d8888b. 88d888b. 88d888b. .d8888b. .d888b88 .d8888b.    88        .d8888b. .d8888b. 88d888b.
*    88    88'  `88 88'  `88 88'  `88 88'  `88 88'  `88 88'  `88    88        88'  `88 Y8ooooo. 88'  `88
*    88    88.  .88 88       88    88 88.  .88 88.  .88 88.  .88 dP Y8.   .88 88.  .88       88 88    88
*    dP    `88888P' dP       dP    dP `88888P8 `88888P8 `88888P' 88  Y88888P' `88888P8 `88888P' dP    dP
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/

//
pragma solidity ^0.6.0;

//import "@openzeppelin/contracts/proxy/TransparentUpgradeableProxy.sol";

/**
 * @dev TransparentUpgradeableProxy where admin is allowed to call implementation methods.
 */
contract AdminUpgradeableProxy is TransparentUpgradeableProxy {
  /**
   * @dev Initializes an upgradeable proxy backed by the implementation at `_logic`.
   */
  constructor(
    address _logic,
    address _admin,
    bytes memory _data
  ) public payable TransparentUpgradeableProxy(_logic, _admin, _data) {}

  /**
   * @dev Override to allow admin access the fallback function.
   */
  function _beforeFallback() internal override {}
}

// File 5 of 20 : TornadoTrees.sol
// https://tornado.cash
/*
* d888888P                                           dP              a88888b.                   dP
*    88                                              88             d8'   `88                   88
*    88    .d8888b. 88d888b. 88d888b. .d8888b. .d888b88 .d8888b.    88        .d8888b. .d8888b. 88d888b.
*    88    88'  `88 88'  `88 88'  `88 88'  `88 88'  `88 88'  `88    88        88'  `88 Y8ooooo. 88'  `88
*    88    88.  .88 88       88    88 88.  .88 88.  .88 88.  .88 dP Y8.   .88 88.  .88       88 88    88
*    dP    `88888P' dP       dP    dP `88888P8 `88888P8 `88888P' 88  Y88888P' `88888P8 `88888P' dP    dP
* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;
/* pragma experimental ABIEncoderV2; */

//import "./interfaces/ITornadoTreesV1.sol";
//import "./interfaces/IBatchTreeUpdateVerifier.sol";
//import "@openzeppelin/upgrades-core/contracts/Initializable.sol";

/// @dev This contract holds a merkle tree of all tornado cash deposit and withdrawal events
contract TornadoTrees is Initializable {
  address public  governance;
  bytes32 public depositRoot;
  bytes32 public previousDepositRoot;
  bytes32 public withdrawalRoot;
  bytes32 public previousWithdrawalRoot;
  address public tornadoProxy;
  IBatchTreeUpdateVerifier public treeUpdateVerifier;
  ITornadoTreesV1 public  tornadoTreesV1;

  uint256 public constant CHUNK_TREE_HEIGHT = 8;
  uint256 public constant CHUNK_SIZE = 2**CHUNK_TREE_HEIGHT;
  uint256 public constant ITEM_SIZE = 32 + 20 + 4;
  uint256 public constant BYTES_SIZE = 32 + 32 + 4 + CHUNK_SIZE * ITEM_SIZE;
  uint256 public constant SNARK_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;

  mapping(uint256 => bytes32) public deposits;
  uint256 public depositsLength;
  uint256 public lastProcessedDepositLeaf;
  uint256 public  depositsV1Length;

  mapping(uint256 => bytes32) public withdrawals;
  uint256 public withdrawalsLength;
  uint256 public lastProcessedWithdrawalLeaf;
  uint256 public  withdrawalsV1Length;

  event DepositData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event WithdrawalData(address instance, bytes32 indexed hash, uint256 block, uint256 index);
  event VerifierUpdated(address newVerifier);
  event ProxyUpdated(address newProxy);

  struct TreeLeaf {
    bytes32 hash;
    address instance;
    uint32 block;
  }

  modifier onlyTornadoProxy {
    require(msg.sender == tornadoProxy, "Not authorized");
    _;
  }

  modifier onlyGovernance() {
    require(msg.sender == governance, "Only governance can perform this action");
    _;
  }

  struct SearchParams {
    uint256 depositsFrom;
    uint256 depositsStep;
    uint256 withdrawalsFrom;
    uint256 withdrawalsStep;
  }

  constructor(
    address _governance,
    ITornadoTreesV1 _tornadoTreesV1,
    SearchParams memory _searchParams
  ) public {
    governance = _governance;
    tornadoTreesV1 = _tornadoTreesV1;

    depositsV1Length = findArrayLength(
      _tornadoTreesV1,
      "deposits(uint256)",
      _searchParams.depositsFrom,
      _searchParams.depositsStep
    );

    withdrawalsV1Length = findArrayLength(
      _tornadoTreesV1,
      "withdrawals(uint256)",
      _searchParams.withdrawalsFrom,
      _searchParams.withdrawalsStep
    );
  }

  function initialize(address _tornadoProxy, IBatchTreeUpdateVerifier _treeUpdateVerifier) public initializer onlyGovernance {
    tornadoProxy = _tornadoProxy;
    treeUpdateVerifier = _treeUpdateVerifier;

    depositRoot = tornadoTreesV1.depositRoot();
    uint256 lastDepositLeaf = tornadoTreesV1.lastProcessedDepositLeaf();
    require(lastDepositLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedDepositLeaf = lastDepositLeaf;
    depositsLength = depositsV1Length;

    withdrawalRoot = tornadoTreesV1.withdrawalRoot();
    uint256 lastWithdrawalLeaf = tornadoTreesV1.lastProcessedWithdrawalLeaf();
    require(lastWithdrawalLeaf % CHUNK_SIZE == 0, "Incorrect TornadoTrees state");
    lastProcessedWithdrawalLeaf = lastWithdrawalLeaf;
    withdrawalsLength = withdrawalsV1Length;
  }

  /// @dev Queue a new deposit data to be inserted into a merkle tree
  function registerDeposit(address _instance, bytes32 _commitment) public onlyTornadoProxy {
    uint256 _depositsLength = depositsLength;
    deposits[_depositsLength] = keccak256(abi.encode(_instance, _commitment, blockNumber()));
    emit DepositData(_instance, _commitment, blockNumber(), _depositsLength);
    depositsLength = _depositsLength + 1;
  }

  /// @dev Queue a new withdrawal data to be inserted into a merkle tree
  function registerWithdrawal(address _instance, bytes32 _nullifierHash) public onlyTornadoProxy {
    uint256 _withdrawalsLength = withdrawalsLength;
    withdrawals[_withdrawalsLength] = keccak256(abi.encode(_instance, _nullifierHash, blockNumber()));
    emit WithdrawalData(_instance, _nullifierHash, blockNumber(), _withdrawalsLength);
    withdrawalsLength = _withdrawalsLength + 1;
  }

  /// @dev Insert a full batch of queued deposits into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateDepositTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedDepositLeaf;
    require(_currentRoot == depositRoot, "Proposed deposit root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect deposit insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 deposit = offset + i >= depositsV1Length ? deposits[offset + i] : tornadoTreesV1.deposits(offset + i);
      require(leafHash == deposit, "Incorrect deposit");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= depositsV1Length) {
        delete deposits[offset + i];
      } else {
        emit DepositData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid deposit tree update proof");

    previousDepositRoot = _currentRoot;
    depositRoot = _newRoot;
    lastProcessedDepositLeaf = offset + CHUNK_SIZE;
  }

  /// @dev Insert a full batch of queued withdrawals into a merkle tree
  /// @param _proof A snark proof that elements were inserted correctly
  /// @param _argsHash A hash of snark inputs
  /// @param _argsHash Current merkle tree root
  /// @param _newRoot Updated merkle tree root
  /// @param _pathIndices Merkle path to inserted batch
  /// @param _events A batch of inserted events (leaves)
  function updateWithdrawalTree(
    bytes calldata _proof,
    bytes32 _argsHash,
    bytes32 _currentRoot,
    bytes32 _newRoot,
    uint32 _pathIndices,
    TreeLeaf[CHUNK_SIZE] calldata _events
  ) public {
    uint256 offset = lastProcessedWithdrawalLeaf;
    require(_currentRoot == withdrawalRoot, "Proposed withdrawal root is invalid");
    require(_pathIndices == offset >> CHUNK_TREE_HEIGHT, "Incorrect withdrawal insert index");

    bytes memory data = new bytes(BYTES_SIZE);
    assembly {
      mstore(add(data, 0x44), _pathIndices)
      mstore(add(data, 0x40), _newRoot)
      mstore(add(data, 0x20), _currentRoot)
    }
    for (uint256 i = 0; i < CHUNK_SIZE; i++) {
      (bytes32 hash, address instance, uint32 blockNumber) = (_events[i].hash, _events[i].instance, _events[i].block);
      bytes32 leafHash = keccak256(abi.encode(instance, hash, blockNumber));
      bytes32 withdrawal = offset + i >= withdrawalsV1Length ? withdrawals[offset + i] : tornadoTreesV1.withdrawals(offset + i);
      require(leafHash == withdrawal, "Incorrect withdrawal");
      assembly {
        let itemOffset := add(data, mul(ITEM_SIZE, i))
        mstore(add(itemOffset, 0x7c), blockNumber)
        mstore(add(itemOffset, 0x78), instance)
        mstore(add(itemOffset, 0x64), hash)
      }
      if (offset + i >= withdrawalsV1Length) {
        delete withdrawals[offset + i];
      } else {
        emit WithdrawalData(instance, hash, blockNumber, offset + i);
      }
    }

    uint256 argsHash = uint256(sha256(data)) % SNARK_FIELD;
    require(argsHash == uint256(_argsHash), "Invalid args hash");
    require(treeUpdateVerifier.verifyProof(_proof, [argsHash]), "Invalid withdrawal tree update proof");

    previousWithdrawalRoot = _currentRoot;
    withdrawalRoot = _newRoot;
    lastProcessedWithdrawalLeaf = offset + CHUNK_SIZE;
  }

  function validateRoots(bytes32 _depositRoot, bytes32 _withdrawalRoot) public view {
    require(_depositRoot == depositRoot || _depositRoot == previousDepositRoot, "Incorrect deposit tree root");
    require(_withdrawalRoot == withdrawalRoot || _withdrawalRoot == previousWithdrawalRoot, "Incorrect withdrawal tree root");
  }

  /// @dev There is no array length getter for deposit and withdrawal arrays
  /// in the previous contract, so we have to find them length manually.
  /// Used only during deployment
  function findArrayLength(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 _from, // most likely array length after the proposal has passed
    uint256 _step // optimal step size to find first match, approximately equals dispersion
  ) internal view virtual returns (uint256) {
    // Find the segment with correct array length
    bool direction = elementExists(_tornadoTreesV1, _type, _from);
    do {
      _from = direction ? _from + _step : _from - _step;
    } while (direction == elementExists(_tornadoTreesV1, _type, _from));
    uint256 high = direction ? _from : _from + _step;
    uint256 low = direction ? _from - _step : _from;
    uint256 mid = (high + low) / 2;

    // Perform a binary search in this segment
    while (low < mid) {
      if (elementExists(_tornadoTreesV1, _type, mid)) {
        low = mid;
      } else {
        high = mid;
      }
      mid = (low + high) / 2;
    }
    return mid + 1;
  }

  function elementExists(
    ITornadoTreesV1 _tornadoTreesV1,
    string memory _type,
    uint256 index
  ) public view returns (bool success) {
    // Try to get the element. If it succeeds the array length is higher, it it reverts the length is equal or lower
    (success, ) = address(_tornadoTreesV1).staticcall{ gas: 2500 }(abi.encodeWithSignature(_type, index));
  }

  function setTornadoProxyContract(address _tornadoProxy) external onlyGovernance {
    tornadoProxy = _tornadoProxy;
    emit ProxyUpdated(_tornadoProxy);
  }
  function setVerifierContract(IBatchTreeUpdateVerifier _treeUpdateVerifier) external onlyGovernance {
    treeUpdateVerifier = _treeUpdateVerifier;
    emit VerifierUpdated(address(_treeUpdateVerifier));
  }

  function blockNumber() public view virtual returns (uint256) {
    return block.number;
  }
}

// File 4 of 20 : IBatchTreeUpdateVerifier.sol
//

pragma solidity ^0.6.0;

interface IBatchTreeUpdateVerifier {
  function verifyProof(bytes calldata proof, uint256[1] calldata input) external view returns (bool);
}

// File 3 of 20 : ITornadoTreesV1.sol
//

pragma solidity ^0.6.0;

interface ITornadoTreesV1 {
  function lastProcessedDepositLeaf() external view returns (uint256);

  function lastProcessedWithdrawalLeaf() external view returns (uint256);

  function depositRoot() external view returns (bytes32);

  function withdrawalRoot() external view returns (bytes32);

  function deposits(uint256 i) external view returns (bytes32);

  function withdrawals(uint256 i) external view returns (bytes32);

  function registerDeposit(address instance, bytes32 commitment) external;

  function registerWithdrawal(address instance, bytes32 nullifier) external;
}



// File 2 of 20 : Proposal.sol
/*
This is a proposal to update the TornadoTrees smart contract. It significantly reduces the cost of
updating tornado merkle trees by offloading onchain updates to zkSNARKs.

The proposal will:
- disable old tornado proxy
- deploy new contracts:
  - TornadoTrees - new contract for tree updates
  - AdminUpgradeableProxy - upgradeability proxy for TornadoTrees
  - AvacashProxy - new tornado proxy with ERC20 support
- migrate state from old TornadoTrees contract to the new one
- set deployed AdminUpgradeableProxy as new a tree contract in Miner

More info: https://torn.community/t/anonymity-mining-technical-overview/15
*/

pragma solidity ^0.6.0;
/* pragma experimental ABIEncoderV2; */

// import "tornado-trees/contracts/interfaces/ITornadoTreesV1.sol";
//import "tornado-trees/contracts/interfaces/IBatchTreeUpdateVerifier.sol";
//import "tornado-trees/contracts/TornadoTrees.sol";
//import "tornado-trees/contracts/AdminUpgradeableProxy.sol";
//import "tornado-anonymity-mining/contracts/AvacashProxy.sol";
//import "tornado-anonymity-mining/contracts/interfaces/ITornadoInstance.sol";
//import "torn-token/contracts/ENS.sol";
//import "./interfaces/ITornadoProxyV1.sol";
//import "./interfaces/IMiner.sol";


contract Proposal is EnsResolve {
  ITornadoTreesV1 public constant tornadoTreesV1 = ITornadoTreesV1(0x43a3bE4Ae954d9869836702AFd10393D3a7Ea417);
  ITornadoProxyV1 public constant tornadoProxyV1 = ITornadoProxyV1(0x905b63Fff465B9fFBF41DeA908CEb12478ec7601);
  IMiner public constant miner = IMiner(0x746Aebc06D2aE31B71ac51429A19D54E797878E9);

  event DeploymentOf(string name, address addr);

  address public  verifier;

  // params used to search for array lengths on V1 contracts
  uint256 private  depositsFrom;
  uint256 private  depositsStep;
  uint256 private  withdrawalsFrom;
  uint256 private  withdrawalsStep;

  constructor(
    address _verifier,
    uint256 _depositsFrom,
    uint256 _depositsStep,
    uint256 _withdrawalsFrom,
    uint256 _withdrawalsStep
  ) public {
    verifier = _verifier;
    depositsFrom = _depositsFrom;
    depositsStep = _depositsStep;
    withdrawalsFrom = _withdrawalsFrom;
    withdrawalsStep = _withdrawalsStep;
  }

  function executeProposal() public {
    // Disable all instances on old tornado proxy
    bytes32[4] memory miningInstances = getEthInstances();
    for (uint256 i = 0; i < miningInstances.length; i++) {
      tornadoProxyV1.updateInstance(resolve(miningInstances[i]), false);
    }

    // Deploy new TornadoTrees implementation
    TornadoTrees tornadoTreesImpl = new TornadoTrees(address(this), tornadoTreesV1, getSearchParams());
    emit DeploymentOf("TornadoTrees implementation", address(tornadoTreesImpl));


    // Deploy TornadoTrees upgradeable proxy
    AdminUpgradeableProxy upgradeableProxy = new AdminUpgradeableProxy(address(tornadoTreesImpl), address(this), "");
    TornadoTrees tornadoTrees = TornadoTrees(address(upgradeableProxy));
    emit DeploymentOf("TornadoTrees upgradeable proxy", address(upgradeableProxy));

    // Deploy new AvacashProxy
    AvacashProxy tornadoProxy = new AvacashProxy(address(tornadoTrees), address(this), getInstances());
    emit DeploymentOf("AvacashProxy", address(tornadoProxy));

    // Init tornado trees
    tornadoTrees.initialize(address(tornadoProxy), IBatchTreeUpdateVerifier(verifier));

    // Update TornadoTrees address on the mining contract
    miner.setTornadoTreesContract(address(tornadoTrees));
  }

  function getSearchParams() public view returns (TornadoTrees.SearchParams memory) {
    return
      TornadoTrees.SearchParams({
        depositsFrom: depositsFrom,
        depositsStep: depositsStep,
        withdrawalsFrom: withdrawalsFrom,
        withdrawalsStep: withdrawalsStep
      });
  }

  function getEthInstances() internal pure returns (bytes32[4] memory) {
    return [
      bytes32(0xc041982b4f77cbbd82ef3b9ea748738ac6c281d3f1af198770d29f75ac32d80a), // eth-01.tornadocash.eth
      bytes32(0x9e5bc9215eecd103644145a5db4f69d5efaf4885bb5bf968f8db271ec5cd539b), // eth-1.tornadocash.eth
      bytes32(0x917e42347647689051abc744f502bff342c76ad30c0670b46b305b2f7e1f893d), // eth-10.tornadocash.eth
      bytes32(0xddfc726d74f912f49389ef7471e75291969852ce7e5df0509a17bc1e46646985) //  eth-100.tornadocash.eth
    ];
  }

  function getErc20Instances() internal pure returns (bytes32[15] memory) {
    return [
      bytes32(0x95ad5771ba164db3fc73cc74d4436cb6a6babd7a2774911c69d8caae30410982), // dai-100.tornadocash.eth
      bytes32(0x109d0334da83a2c3a687972cc806b0eda52ee7a30f3e44e77b39ae2a20248321), // dai-1000.tornadocash.eth
      bytes32(0x3de4b55be5058f538617d5a6a72bff5b5850a239424b34cc5271021cfcc4ccc8), // dai-10000.tornadocash.eth
      bytes32(0xf50559e0d2f0213bcb8c67ad45b93308b46b9abdd5ca9c7044efc025fc557f59), // dai-100000.tornadocash.eth
      bytes32(0xc9395879ffcee571b0dfd062153b27d62a6617e0f272515f2eb6259fe829c3df), // cdai-5000.tornadocash.eth
      bytes32(0xf840ad6cba4dbbab0fa58a13b092556cd53a6eeff716a3c4a41d860a888b6155), // cdai-50000.tornadocash.eth
      bytes32(0x8e52ade66daf81cf3f50053e9bfca86a57d685eca96bf6c0b45da481806952b1), // cdai-500000.tornadocash.eth
      bytes32(0x0b86f5b8c2f9dcd95382a469480b35302eead707f3fd36359e346b59f3591de2), // cdai-5000000.tornadocash.eth
      bytes32(0xd49809328056ea7b7be70076070bf741ec1a27b86bebafdc484eee88c1834191), // usdc-100.tornadocash.eth
      bytes32(0x77e2b15eddc494b6da6cee0d797ed30ed3945f2c7de0150f16f0405a12e5665f), // usdc-1000.tornadocash.eth
      bytes32(0x36bab2c045f88613be6004ec1dc0c3937941fcf4d4cb78d814c933bf1cf25baf), // usdt-100.tornadocash.eth
      bytes32(0x7a3b0883165756c26821d9b8c9737166a156a78b478b17e42da72fba7a373356), // usdt-1000.tornadocash.eth
      bytes32(0x10ca74c40211fa1598f0531f35c7d54c19c808082aad53c72ad1fb22ea94ab83), // wbtc-01.tornadocash.eth
      bytes32(0x6cea0cba8e46fc4ffaf837edf544ba36e5a35503636c6bca4578e965ab640e2c), // wbtc-1.tornadocash.eth
      bytes32(0x82c57bf2f80547b5e31b92c1f92c4f8bc02ad0df3d27326373e9f55adda5bd15) //  wbtc-10.tornadocash.eth
    ];
  }

  function getInstances() public view returns (AvacashProxy.Tornado[] memory instances) {
    bytes32[4] memory miningInstances = getEthInstances();
    bytes32[15] memory allowedInstances = getErc20Instances();
    instances = new AvacashProxy.Tornado[](allowedInstances.length + miningInstances.length);

    for (uint256 i = 0; i < miningInstances.length; i++) {
      // Enable mining for ETH instances
      instances[i] = AvacashProxy.Tornado(
        ITornadoInstance(resolve(miningInstances[i])),
        AvacashProxy.Instance({ isERC20: false, token: IERC20(address(0)), state: AvacashProxy.InstanceState.MINEABLE })
      );
    }
    for (uint256 i = 0; i < allowedInstances.length; i++) {
      // ERC20 are only allowed on proxy without enabling mining for them
      ITornadoInstance instance = ITornadoInstance(resolve(allowedInstances[i]));
      instances[miningInstances.length + i] = AvacashProxy.Tornado({
        addr: instance,
        instance: AvacashProxy.Instance({
          isERC20: true,
          token: IERC20(instance.token()),
          state: AvacashProxy.InstanceState.ENABLED
        })
      });
    }
  }
}




// File 1 of 20 : IMiner.sol
//
pragma solidity ^0.6.0;

interface IMiner {
  function setTornadoTreesContract(address _tornadoTrees) external;
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tornadoTrees","type":"address"},{"internalType":"address","name":"_governance","type":"address"},{"components":[{"internalType":"contract ITornadoInstance","name":"addr","type":"address"},{"components":[{"internalType":"bool","name":"isERC20","type":"bool"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"enum AvacashProxy.InstanceState","name":"state","type":"uint8"}],"internalType":"struct AvacashProxy.Instance","name":"instance","type":"tuple"}],"internalType":"struct AvacashProxy.Tornado[]","name":"_instances","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"encryptedNote","type":"bytes"}],"name":"EncryptedNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract ITornadoInstance","name":"instance","type":"address"},{"indexed":false,"internalType":"enum AvacashProxy.InstanceState","name":"state","type":"uint8"}],"name":"InstanceStateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"}],"name":"NewGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ITornadoTrees","name":"addr","type":"address"}],"name":"TornadoTreesUpdated","type":"event"},{"inputs":[{"internalType":"bytes[]","name":"_encryptedNotes","type":"bytes[]"}],"name":"backupNotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITornadoInstance","name":"_tornado","type":"address"},{"internalType":"bytes32","name":"_commitment","type":"bytes32"},{"internalType":"bytes","name":"_encryptedNote","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITornadoInstance","name":"","type":"address"}],"name":"instances","outputs":[{"internalType":"bool","name":"isERC20","type":"bool"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"enum AvacashProxy.InstanceState","name":"state","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernance","type":"address"}],"name":"setNewGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITornadoTrees","name":"_tornadoTrees","type":"address"}],"name":"setTornadoTreesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tornadoTrees","outputs":[{"internalType":"contract ITornadoTrees","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract ITornadoInstance","name":"addr","type":"address"},{"components":[{"internalType":"bool","name":"isERC20","type":"bool"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"enum AvacashProxy.InstanceState","name":"state","type":"uint8"}],"internalType":"struct AvacashProxy.Instance","name":"instance","type":"tuple"}],"internalType":"struct AvacashProxy.Tornado","name":"_tornado","type":"tuple"}],"name":"updateInstance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITornadoInstance","name":"_tornado","type":"address"},{"internalType":"bytes","name":"_proof","type":"bytes"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32","name":"_nullifierHash","type":"bytes32"},{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"address payable","name":"_relayer","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_refund","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b506040516200396938038062003969833981810160405281019062000037919062000b03565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8151811015620000f857620000ea828281518110620000d657fe5b60200260200101516200010260201b60201c565b8080600101915050620000bb565b505050506200119b565b806020015160026000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160000160156101000a81548160ff02191690836002811115620001d657fe5b02179055509050508060200151600001511562000491576000816000015173ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023a57600080fd5b505afa1580156200024f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000275919062000ad7565b905081602001516020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614620002f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e79062000f07565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e3085600001516040518363ffffffff1660e01b81526004016200033392919062000e4a565b60206040518083038186803b1580156200034c57600080fd5b505afa15801562000361573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000387919062000b9e565b9050600060028111156200039757fe5b8360200151604001516002811115620003ac57fe5b14158015620003bb5750600081145b156200041d576200041783600001517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff16620004f060201b62000ef6179092919060201c565b6200048e565b600060028111156200042b57fe5b83602001516040015160028111156200044057fe5b1480156200044f575060008114155b156200048d576200048c836000015160008473ffffffffffffffffffffffffffffffffffffffff16620004f060201b62000ef6179092919060201c565b5b5b50505b806000015173ffffffffffffffffffffffffffffffffffffffff167f02826f62d88a4d9f1978eb9c06f8663f642d032908e65a915d5898f3585421c0826020015160400151604051620004e5919062000ea4565b60405180910390a250565b600081148062000590575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016200053a92919062000e4a565b60206040518083038186803b1580156200055357600080fd5b505afa15801562000568573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200058e919062000b9e565b145b620005d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005c99062000f6d565b60405180910390fd5b6200065d8363095ea7b360e01b8484604051602401620005f492919062000e77565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200066260201b60201c565b505050565b6060620006cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200073660201b62001054179092919060201c565b9050600081511115620007315780806020019051810190620006ee919062000b72565b62000730576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007279062000f4b565b60405180910390fd5b5b505050565b60606200074d84846000856200075660201b60201c565b90509392505050565b6060824710156200079e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007959062000ee5565b60405180910390fd5b620007af856200088560201b60201c565b620007f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007e89062000f29565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516200081d919062000e31565b60006040518083038185875af1925050503d80600081146200085c576040519150601f19603f3d011682016040523d82523d6000602084013e62000861565b606091505b5091509150620008798282866200089860201b60201c565b92505050949350505050565b600080823b905060008111915050919050565b60608315620008aa57829050620008fd565b600083511115620008be5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f4919062000ec1565b60405180910390fd5b9392505050565b600081519050620009158162001108565b92915050565b600082601f8301126200092d57600080fd5b8151620009446200093e8262000fbd565b62000f8f565b915081818352602084019350602081019050838560808402820111156200096a57600080fd5b60005b838110156200099e578162000983888262000a6d565b8452602084019350608083019250506001810190506200096d565b5050505092915050565b600081519050620009b98162001122565b92915050565b600081519050620009d0816200113c565b92915050565b600081519050620009e78162001156565b92915050565b600081519050620009fe8162001170565b92915050565b60006060828403121562000a1757600080fd5b62000a23606062000f8f565b9050600062000a3584828501620009a8565b600083015250602062000a4b84828501620009bf565b602083015250604062000a6184828501620009ed565b60408301525092915050565b60006080828403121562000a8057600080fd5b62000a8c604062000f8f565b9050600062000a9e84828501620009d6565b600083015250602062000ab48482850162000a04565b60208301525092915050565b60008151905062000ad18162001181565b92915050565b60006020828403121562000aea57600080fd5b600062000afa8482850162000904565b91505092915050565b60008060006060848603121562000b1957600080fd5b600062000b298682870162000904565b935050602062000b3c8682870162000904565b925050604084015167ffffffffffffffff81111562000b5a57600080fd5b62000b68868287016200091b565b9150509250925092565b60006020828403121562000b8557600080fd5b600062000b9584828501620009a8565b91505092915050565b60006020828403121562000bb157600080fd5b600062000bc18482850162000ac0565b91505092915050565b62000bd58162001018565b82525050565b600062000be88262000fe6565b62000bf4818562000ffc565b935062000c06818560208601620010b3565b80840191505092915050565b62000c1d816200109f565b82525050565b600062000c308262000ff1565b62000c3c818562001007565b935062000c4e818560208601620010b3565b62000c5981620010e9565b840191505092915050565b600062000c7360268362001007565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600062000cdb600f8362001007565b91507f496e636f727265637420746f6b656e00000000000000000000000000000000006000830152602082019050919050565b600062000d1d601d8362001007565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600062000d5f602a8362001007565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600062000dc760368362001007565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b62000e2b8162001095565b82525050565b600062000e3f828462000bdb565b915081905092915050565b600060408201905062000e61600083018562000bca565b62000e70602083018462000bca565b9392505050565b600060408201905062000e8e600083018562000bca565b62000e9d602083018462000e20565b9392505050565b600060208201905062000ebb600083018462000c12565b92915050565b6000602082019050818103600083015262000edd818462000c23565b905092915050565b6000602082019050818103600083015262000f008162000c64565b9050919050565b6000602082019050818103600083015262000f228162000ccc565b9050919050565b6000602082019050818103600083015262000f448162000d0e565b9050919050565b6000602082019050818103600083015262000f668162000d50565b9050919050565b6000602082019050818103600083015262000f888162000db8565b9050919050565b6000604051905081810181811067ffffffffffffffff8211171562000fb357600080fd5b8060405250919050565b600067ffffffffffffffff82111562000fd557600080fd5b602082029050602081019050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000620010258262001075565b9050919050565b60008115159050919050565b6000620010458262001018565b9050919050565b6000620010598262001018565b9050919050565b60008190506200107082620010fa565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620010ac8262001060565b9050919050565b60005b83811015620010d3578082015181840152602081019050620010b6565b83811115620010e3576000848401525b50505050565b6000601f19601f8301169050919050565b600381106200110557fe5b50565b620011138162001018565b81146200111f57600080fd5b50565b6200112d816200102c565b81146200113957600080fd5b50565b620011478162001038565b81146200115357600080fd5b50565b62001161816200104c565b81146200116d57600080fd5b50565b600381106200117e57600080fd5b50565b6200118c8162001095565b81146200119857600080fd5b50565b6127be80620011ab6000396000f3fe6080604052600436106100915760003560e01c8063b438689f11610059578063b438689f14610170578063cc6dc6681461018c578063cea9d26f146101b5578063e2658c9c146101de578063e7d460bb1461020757610091565b8063032bb4431461009657806313d98d13146100d55780633cb837fd146100f15780635aa6e6751461011c5780636485ba2a14610147575b600080fd5b3480156100a257600080fd5b506100bd60048036038101906100b89190611b5a565b610230565b6040516100cc9392919061222c565b60405180910390f35b6100ef60048036038101906100ea9190611b83565b610294565b005b3480156100fd57600080fd5b50610106610610565b604051610113919061231a565b60405180910390f35b34801561012857600080fd5b50610131610634565b60405161013e919061215f565b60405180910390f35b34801561015357600080fd5b5061016e60048036038101906101699190611a9d565b61065a565b005b61018a60048036038101906101859190611bef565b6106e6565b005b34801561019857600080fd5b506101b360048036038101906101ae9190611ce6565b61096c565b005b3480156101c157600080fd5b506101dc60048036038101906101d79190611b0b565b610a18565b005b3480156101ea57600080fd5b5061020560048036038101906102009190611cbd565b610cbf565b005b34801561021357600080fd5b5061022e60048036038101906102299190611a4b565b610dc9565b005b60026020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160159054906101000a900460ff16905083565b61029c6117b0565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160159054906101000a900460ff16600281111561037557fe5b600281111561038057fe5b8152505090506000600281111561039357fe5b816040015160028111156103a357fe5b14156103e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103db906123b2565b60405180910390fd5b80600001511561049d5761049c33308773ffffffffffffffffffffffffffffffffffffffff16638bca6d166040518163ffffffff1660e01b815260040160206040518083038186803b15801561043957600080fd5b505afa15801561044d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104719190611d38565b846020015173ffffffffffffffffffffffffffffffffffffffff1661106c909392919063ffffffff16565b5b8473ffffffffffffffffffffffffffffffffffffffff1663b214faa534866040518363ffffffff1660e01b81526004016104d79190612263565b6000604051808303818588803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050505060028081111561051557fe5b8160400151600281111561052557fe5b14156105b95760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c6758d6b86866040518363ffffffff1660e01b81526004016105869291906121da565b600060405180830381600087803b1580156105a057600080fd5b505af11580156105b4573d6000803e3d6000fd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff167ffa28df43db3553771f7209dcef046f3bdfea15870ab625dcda30ac58b82b4008848460405161060192919061227e565b60405180910390a25050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005b828290508110156106e1573373ffffffffffffffffffffffffffffffffffffffff167ffa28df43db3553771f7209dcef046f3bdfea15870ab625dcda30ac58b82b40088484848181106106ac57fe5b90506020028101906106be9190612492565b6040516106cc92919061227e565b60405180910390a2808060010191505061065d565b505050565b6106ee6117b0565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160159054906101000a900460ff1660028111156107c757fe5b60028111156107d257fe5b815250509050600060028111156107e557fe5b816040015160028111156107f557fe5b1415610836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082d906123b2565b60405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff166321a0adb6348b8b8b8b8b8b8b8b6040518a63ffffffff1660e01b815260040161087e9897969594939291906122a2565b6000604051808303818588803b15801561089757600080fd5b505af11580156108ab573d6000803e3d6000fd5b50505050506002808111156108bc57fe5b816040015160028111156108cc57fe5b14156109605760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301ae19208b886040518363ffffffff1660e01b815260040161092d9291906121da565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b505050505b50505050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f390612472565b60405180910390fd5b610a1581803603810190610a109190611d0f565b6110f5565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90612472565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f906123f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bae5760004790506000610b5e82846114bb565b90508373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ba6573d6000803e3d6000fd5b505050610cba565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610be9919061215f565b60206040518083038186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c399190611d38565b90506000610c4782846114bb565b905060008111610c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8390612432565b60405180910390fd5b610cb784828773ffffffffffffffffffffffffffffffffffffffff166114d49092919063ffffffff16565b50505b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690612472565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fd5ef75672982cb39cc849450302ce426d1655271003cae8a66cb533c12f86ecc81604051610dbe919061231a565b60405180910390a150565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090612472565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4f386975ea1c2f7cf1845b08bee00626fbb624ecad16254d63d9bb9ba86526de600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051610eeb919061215f565b60405180910390a150565b6000811480610f8f575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401610f3d92919061217a565b60206040518083038186803b158015610f5557600080fd5b505afa158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190611d38565b145b610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590612452565b60405180910390fd5b61104f8363095ea7b360e01b8484604051602401610fed929190612203565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061155a565b505050565b60606110638484600085611621565b90509392505050565b6110ef846323b872dd60e01b85858560405160240161108d939291906121a3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061155a565b50505050565b806020015160026000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160000160156101000a81548160ff021916908360028111156111c857fe5b02179055509050508060200151600001511561145e576000816000015173ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190611a74565b905081602001516020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190612392565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e3085600001516040518363ffffffff1660e01b815260040161131b92919061217a565b60206040518083038186803b15801561133357600080fd5b505afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b9190611d38565b90506000600281111561137a57fe5b836020015160400151600281111561138e57fe5b1415801561139c5750600081145b156113f5576113f083600001517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff16610ef69092919063ffffffff16565b61145b565b6000600281111561140257fe5b836020015160400151600281111561141657fe5b148015611424575060008114155b1561145a57611459836000015160008473ffffffffffffffffffffffffffffffffffffffff16610ef69092919063ffffffff16565b5b5b50505b806000015173ffffffffffffffffffffffffffffffffffffffff167f02826f62d88a4d9f1978eb9c06f8663f642d032908e65a915d5898f3585421c08260200151604001516040516114b09190612335565b60405180910390a250565b60008183106114ca57816114cc565b825b905092915050565b6115558363a9059cbb60e01b84846040516024016114f3929190612203565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061155a565b505050565b60606115bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166110549092919063ffffffff16565b905060008151111561161c57808060200190518101906115dc9190611ae2565b61161b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161290612412565b60405180910390fd5b5b505050565b606082471015611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d90612372565b60405180910390fd5b61166f85611736565b6116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a5906123d2565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516116d89190612148565b60006040518083038185875af1925050503d8060008114611715576040519150601f19603f3d011682016040523d82523d6000602084013e61171a565b606091505b509150915061172a828286611749565b92505050949350505050565b600080823b905060008111915050919050565b60608315611759578290506117a9565b60008351111561176c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a09190612350565b60405180910390fd5b9392505050565b6040518060600160405280600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060028111156117ee57fe5b81525090565b600081359050611803816126c0565b92915050565b600081519050611818816126c0565b92915050565b60008135905061182d816126d7565b92915050565b60008083601f84011261184557600080fd5b8235905067ffffffffffffffff81111561185e57600080fd5b60208301915083602082028301111561187657600080fd5b9250929050565b60008135905061188c816126ee565b92915050565b6000815190506118a1816126ee565b92915050565b6000813590506118b681612705565b92915050565b60008083601f8401126118ce57600080fd5b8235905067ffffffffffffffff8111156118e757600080fd5b6020830191508360018202830111156118ff57600080fd5b9250929050565b6000813590506119158161271c565b92915050565b60008135905061192a81612733565b92915050565b60008135905061193f8161274a565b92915050565b60008135905061195481612761565b92915050565b60006060828403121561196c57600080fd5b61197660606124e9565b905060006119868482850161187d565b600083015250602061199a84828501611906565b60208301525060406119ae84828501611945565b60408301525092915050565b6000608082840312156119cc57600080fd5b81905092915050565b6000608082840312156119e757600080fd5b6119f160406124e9565b90506000611a018482850161191b565b6000830152506020611a158482850161195a565b60208301525092915050565b600081359050611a3081612771565b92915050565b600081519050611a4581612771565b92915050565b600060208284031215611a5d57600080fd5b6000611a6b848285016117f4565b91505092915050565b600060208284031215611a8657600080fd5b6000611a9484828501611809565b91505092915050565b60008060208385031215611ab057600080fd5b600083013567ffffffffffffffff811115611aca57600080fd5b611ad685828601611833565b92509250509250929050565b600060208284031215611af457600080fd5b6000611b0284828501611892565b91505092915050565b600080600060608486031215611b2057600080fd5b6000611b2e86828701611906565b9350506020611b3f8682870161181e565b9250506040611b5086828701611a21565b9150509250925092565b600060208284031215611b6c57600080fd5b6000611b7a8482850161191b565b91505092915050565b60008060008060608587031215611b9957600080fd5b6000611ba78782880161191b565b9450506020611bb8878288016118a7565b935050604085013567ffffffffffffffff811115611bd557600080fd5b611be1878288016118bc565b925092505092959194509250565b60008060008060008060008060006101008a8c031215611c0e57600080fd5b6000611c1c8c828d0161191b565b99505060208a013567ffffffffffffffff811115611c3957600080fd5b611c458c828d016118bc565b98509850506040611c588c828d016118a7565b9650506060611c698c828d016118a7565b9550506080611c7a8c828d0161181e565b94505060a0611c8b8c828d0161181e565b93505060c0611c9c8c828d01611a21565b92505060e0611cad8c828d01611a21565b9150509295985092959850929598565b600060208284031215611ccf57600080fd5b6000611cdd84828501611930565b91505092915050565b600060808284031215611cf857600080fd5b6000611d06848285016119ba565b91505092915050565b600060808284031215611d2157600080fd5b6000611d2f848285016119d5565b91505092915050565b600060208284031215611d4a57600080fd5b6000611d5884828501611a36565b91505092915050565b611d6a8161256b565b82525050565b611d7981612559565b82525050565b611d888161257d565b82525050565b611d9781612589565b82525050565b6000611da9838561252c565b9350611db6838584612660565b611dbf836126a2565b840190509392505050565b6000611dd582612516565b611ddf818561253d565b9350611def81856020860161266f565b80840191505092915050565b611e0481612606565b82525050565b611e138161262a565b82525050565b611e228161264e565b82525050565b6000611e3382612521565b611e3d8185612548565b9350611e4d81856020860161266f565b611e56816126a2565b840191505092915050565b6000611e6e602683612548565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611ed4600f83612548565b91507f496e636f727265637420746f6b656e00000000000000000000000000000000006000830152602082019050919050565b6000611f14601d83612548565b91507f54686520696e7374616e6365206973206e6f7420737570706f727465640000006000830152602082019050919050565b6000611f54601d83612548565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000611f94602283612548565b91507f544f524e3a2063616e206e6f742073656e6420746f207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611ffa602a83612548565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000612060601e83612548565b91507f544f524e3a20747279696e6720746f2073656e6420302062616c616e636500006000830152602082019050919050565b60006120a0603683612548565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000612106600e83612548565b91507f4e6f7420617574686f72697a65640000000000000000000000000000000000006000830152602082019050919050565b612142816125fc565b82525050565b60006121548284611dca565b915081905092915050565b60006020820190506121746000830184611d70565b92915050565b600060408201905061218f6000830185611d70565b61219c6020830184611d70565b9392505050565b60006060820190506121b86000830186611d70565b6121c56020830185611d70565b6121d26040830184612139565b949350505050565b60006040820190506121ef6000830185611d70565b6121fc6020830184611d8e565b9392505050565b60006040820190506122186000830185611d70565b6122256020830184612139565b9392505050565b60006060820190506122416000830186611d7f565b61224e6020830185611dfb565b61225b6040830184611e19565b949350505050565b60006020820190506122786000830184611d8e565b92915050565b60006020820190508181036000830152612299818486611d9d565b90509392505050565b600060e08201905081810360008301526122bd818a8c611d9d565b90506122cc6020830189611d8e565b6122d96040830188611d8e565b6122e66060830187611d61565b6122f36080830186611d61565b61230060a0830185612139565b61230d60c0830184612139565b9998505050505050505050565b600060208201905061232f6000830184611e0a565b92915050565b600060208201905061234a6000830184611e19565b92915050565b6000602082019050818103600083015261236a8184611e28565b905092915050565b6000602082019050818103600083015261238b81611e61565b9050919050565b600060208201905081810360008301526123ab81611ec7565b9050919050565b600060208201905081810360008301526123cb81611f07565b9050919050565b600060208201905081810360008301526123eb81611f47565b9050919050565b6000602082019050818103600083015261240b81611f87565b9050919050565b6000602082019050818103600083015261242b81611fed565b9050919050565b6000602082019050818103600083015261244b81612053565b9050919050565b6000602082019050818103600083015261246b81612093565b9050919050565b6000602082019050818103600083015261248b816120f9565b9050919050565b600080833560016020038436030381126124ab57600080fd5b80840192508235915067ffffffffffffffff8211156124c957600080fd5b6020830192506001820236038313156124e157600080fd5b509250929050565b6000604051905081810181811067ffffffffffffffff8211171561250c57600080fd5b8060405250919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612564826125dc565b9050919050565b6000612576826125dc565b9050919050565b60008115159050919050565b6000819050919050565b600061259e82612559565b9050919050565b60006125b082612559565b9050919050565b60006125c282612559565b9050919050565b60008190506125d7826126b3565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061261182612618565b9050919050565b6000612623826125dc565b9050919050565b60006126358261263c565b9050919050565b6000612647826125dc565b9050919050565b6000612659826125c9565b9050919050565b82818337600083830152505050565b60005b8381101561268d578082015181840152602081019050612672565b8381111561269c576000848401525b50505050565b6000601f19601f8301169050919050565b600381106126bd57fe5b50565b6126c981612559565b81146126d457600080fd5b50565b6126e08161256b565b81146126eb57600080fd5b50565b6126f78161257d565b811461270257600080fd5b50565b61270e81612589565b811461271957600080fd5b50565b61272581612593565b811461273057600080fd5b50565b61273c816125a5565b811461274757600080fd5b50565b612753816125b7565b811461275e57600080fd5b50565b6003811061276e57600080fd5b50565b61277a816125fc565b811461278557600080fd5b5056fea26469706673582212206c24eb4a3ba3b71bd299a72bf87d4c9d0e252bbc00a6dc905900fb08c601d55964736f6c634300060c0033000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106000000000000000000000000209484169c126f69db7c83df8d7cd0cb3db2251900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106000000000000000000000000209484169c126f69db7c83df8d7cd0cb3db2251900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _tornadoTrees (address): 0x438f5071e2f7b90599aab4d82f4d24d0ecfde106
Arg [1] : _governance (address): 0x209484169c126f69db7c83df8d7cd0cb3db22519
Arg [2] : _instances (tuple[]): System.Object,System.Object,System.Object

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 000000000000000000000000438f5071e2f7b90599aab4d82f4d24d0ecfde106
Arg [1] : 000000000000000000000000209484169c126f69db7c83df8d7cd0cb3db22519
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000c4633dab621356f1b7432a9f0a166e359b8911d4
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 00000000000000000000000078359f9d6dbc24221a5027f9b6a89931922a0c0c
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 00000000000000000000000057a5f89999ab9ffcb7bb0133f49b28505a8f62b2
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed ByteCode Sourcemap

37897:4534:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38461:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39140:651;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38392:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38430:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40456:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39799:651;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40658:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41018:664;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40777:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38983:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38461:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39140:651::-;39280:24;;:::i;:::-;39307:9;:19;39317:8;39307:19;;;;;;;;;;;;;;;39280:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39359:22;39341:40;;;;;;;;:8;:14;;;:40;;;;;;;;;;39333:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;39428:8;:16;;;39424:122;;;39455:83;39487:10;39507:4;39514:8;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39455:8;:14;;;:31;;;;:83;;;;;;:::i;:::-;39424:122;39552:8;:16;;;39577:9;39589:11;39552:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39632:22;39614:40;;;;;;;;:8;:14;;;:40;;;;;;;;;39610:123;;;39665:12;;;;;;;;;;:28;;;39702:8;39713:11;39665:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39610:123;39758:10;39744:41;;;39770:14;;39744:41;;;;;;;:::i;:::-;;;;;;;;39140:651;;;;;:::o;38392:33::-;;;;;;;;;;;;:::o;38430:26::-;;;;;;;;;;;;;:::o;40456:196::-;40532:9;40527:120;40551:15;;:22;;40547:1;:26;40527:120;;;40608:10;40594:45;;;40620:15;;40636:1;40620:18;;;;;;;;;;;;;;;;;;:::i;:::-;40594:45;;;;;;;:::i;:::-;;;;;;;;40575:3;;;;;;;40527:120;;;;40456:196;;:::o;39799:651::-;40060:24;;:::i;:::-;40087:9;:19;40097:8;40087:19;;;;;;;;;;;;;;;40060:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40139:22;40121:40;;;;;;;;:8;:14;;;:40;;;;;;;;;;40113:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;40204:8;:17;;;40230:9;40242:6;;40250:5;40257:14;40273:10;40285:8;40295:4;40301:7;40204:105;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40338:22;40320:40;;;;;;;;:8;:14;;;:40;;;;;;;;;40316:129;;;40371:12;;;;;;;;;;:31;;;40411:8;40422:14;40371:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40316:129;39799:651;;;;;;;;;;:::o;40658:113::-;38577:10;;;;;;;;;;;38563:24;;:10;:24;;;38555:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40740:25:::1;40756:8;40740:25;;;;;;;;;;:::i;:::-;:15;:25::i;:::-;40658:113:::0;:::o;41018:664::-;38577:10;;;;;;;;;;;38563:24;;:10;:24;;;38555:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;41167:1:::1;41152:17;;:3;:17;;;;41144:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41238:1;41221:19;;:6;:19;;;41217:460;;;41271:20;41294:21;41271:44;;41324:15;41342:31;41351:12;41365:7;41342:8;:31::i;:::-;41324:49;;41382:3;:12;;:21;41395:7;41382:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41217:460;;;;;41452:20;41475:6;:16;;;41500:4;41475:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41452:54;;41515:15;41533:31;41542:12;41556:7;41533:8;:31::i;:::-;41515:49;;41591:1;41581:7;:11;41573:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;41636:33;41656:3;41661:7;41636:6;:19;;;;:33;;;;;:::i;:::-;41217:460;;;41018:664:::0;;;:::o;40777:173::-;38577:10;;;;;;;;;;;38563:24;;:10;:24;;;38555:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;40885:13:::1;40870:12;::::0;:28:::1;;;;;;;;;;;;;;;;;;40910:34;40930:13;40910:34;;;;;;:::i;:::-;;;;;;;;40777:173:::0;:::o;38983:151::-;38577:10;;;;;;;;;;;38563:24;;:10;:24;;;38555:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39077:14:::1;39064:10;;:27;;;;;;;;;;;;;;;;;;39103:25;39117:10;;;;;;;;;;;39103:25;;;;;;:::i;:::-;;;;;;;;38983:151:::0;:::o;8146:622::-;8525:1;8516:5;:10;8515:62;;;;8575:1;8532:5;:15;;;8556:4;8563:7;8532:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;8515:62;8507:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;8670:90;8690:5;8720:22;;;8744:7;8753:5;8697:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8670:19;:90::i;:::-;8146:622;;;:::o;17017:195::-;17120:12;17152:52;17174:6;17182:4;17188:1;17191:12;17152:21;:52::i;:::-;17145:59;;17017:195;;;;;:::o;7672:205::-;7773:96;7793:5;7823:27;;;7852:4;7858:2;7862:5;7800:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7773:19;:96::i;:::-;7672:205;;;;:::o;41688:740::-;41781:8;:17;;;41754:9;:24;41764:8;:13;;;41754:24;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41809:8;:17;;;:25;;;41805:546;;;41845:12;41867:8;:13;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41845:44;;41915:8;:17;;;:23;;;41906:32;;:5;:32;;;41898:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41967:17;41987:5;:15;;;42011:4;42026:8;:13;;;41987:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41967:74;;42083:22;42056:49;;;;;;;;:8;:17;;;:23;;;:49;;;;;;;;;;:67;;;;;42122:1;42109:9;:14;42056:67;42052:292;;;42136:54;42162:8;:13;;;42186:2;42136:5;:17;;;;:54;;;;;:::i;:::-;42052:292;;;42237:22;42210:49;;;;;;;;:8;:17;;;:23;;;:49;;;;;;;;;:67;;;;;42276:1;42263:9;:14;;42210:67;42206:138;;;42290:44;42316:8;:13;;;42332:1;42290:5;:17;;;;:44;;;;;:::i;:::-;42206:138;42052:292;41805:546;;;42383:8;:13;;;42362:60;;;42398:8;:17;;;:23;;;42362:60;;;;;;:::i;:::-;;;;;;;;41688:740;:::o;6323:106::-;6381:7;6412:1;6408;:5;:13;;6420:1;6408:13;;;6416:1;6408:13;6401:20;;6323:106;;;;:::o;7487:177::-;7570:86;7590:5;7620:23;;;7645:2;7649:5;7597:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7570:19;:86::i;:::-;7487:177;;;:::o;9792:761::-;10216:23;10242:69;10270:4;10242:69;;;;;;;;;;;;;;;;;10250:5;10242:27;;;;:69;;;;;:::i;:::-;10216:95;;10346:1;10326:10;:17;:21;10322:224;;;10468:10;10457:30;;;;;;;;;;;;:::i;:::-;10449:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10322:224;9792:761;;;:::o;18069:530::-;18196:12;18254:5;18229:21;:30;;18221:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;18321:18;18332:6;18321:10;:18::i;:::-;18313:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;18447:12;18461:23;18488:6;:11;;18508:5;18516:4;18488:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18446:75;;;;18539:52;18557:7;18566:10;18578:12;18539:17;:52::i;:::-;18532:59;;;;18069:530;;;;;;:::o;14099:422::-;14159:4;14367:12;14478:7;14466:20;14458:28;;14512:1;14505:4;:8;14498:15;;;14099:422;;;:::o;19605:742::-;19720:12;19749:7;19745:595;;;19780:10;19773:17;;;;19745:595;19914:1;19894:10;:17;:21;19890:439;;;20157:10;20151:17;20218:15;20205:10;20201:2;20197:19;20190:44;20105:148;20300:12;20293:20;;;;;;;;;;;:::i;:::-;;;;;;;;19605:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:134::-;;226:6;220:13;211:22;;238:33;265:5;238:33;:::i;:::-;205:71;;;;:::o;283:146::-;;371:6;358:20;349:29;;383:41;418:5;383:41;:::i;:::-;343:86;;;;:::o;452:363::-;;;593:3;586:4;578:6;574:17;570:27;560:2;;611:1;608;601:12;560:2;644:6;631:20;621:30;;671:18;663:6;660:30;657:2;;;703:1;700;693:12;657:2;737:4;729:6;725:17;713:29;;788:3;780:4;772:6;768:17;758:8;754:32;751:41;748:2;;;805:1;802;795:12;748:2;553:262;;;;;:::o;823:124::-;;900:6;887:20;878:29;;912:30;936:5;912:30;:::i;:::-;872:75;;;;:::o;954:128::-;;1035:6;1029:13;1020:22;;1047:30;1071:5;1047:30;:::i;:::-;1014:68;;;;:::o;1089:130::-;;1169:6;1156:20;1147:29;;1181:33;1208:5;1181:33;:::i;:::-;1141:78;;;;:::o;1240:336::-;;;1354:3;1347:4;1339:6;1335:17;1331:27;1321:2;;1372:1;1369;1362:12;1321:2;1405:6;1392:20;1382:30;;1432:18;1424:6;1421:30;1418:2;;;1464:1;1461;1454:12;1418:2;1498:4;1490:6;1486:17;1474:29;;1549:3;1541:4;1533:6;1529:17;1519:8;1515:32;1512:41;1509:2;;;1566:1;1563;1556:12;1509:2;1314:262;;;;;:::o;1584:158::-;;1678:6;1665:20;1656:29;;1690:47;1731:5;1690:47;:::i;:::-;1650:92;;;;:::o;1749:180::-;;1854:6;1841:20;1832:29;;1866:58;1918:5;1866:58;:::i;:::-;1826:103;;;;:::o;1936:172::-;;2037:6;2024:20;2015:29;;2049:54;2097:5;2049:54;:::i;:::-;2009:99;;;;:::o;2115:166::-;;2213:6;2200:20;2191:29;;2225:51;2270:5;2225:51;:::i;:::-;2185:96;;;;:::o;2323:646::-;;2438:4;2426:9;2421:3;2417:19;2413:30;2410:2;;;2456:1;2453;2446:12;2410:2;2474:20;2489:4;2474:20;:::i;:::-;2465:29;;2547:1;2579:46;2621:3;2612:6;2601:9;2597:22;2579:46;:::i;:::-;2572:4;2565:5;2561:16;2554:72;2504:133;2688:2;2721:63;2780:3;2771:6;2760:9;2756:22;2721:63;:::i;:::-;2714:4;2707:5;2703:16;2696:89;2647:149;2847:2;2880:67;2943:3;2934:6;2923:9;2919:22;2880:67;:::i;:::-;2873:4;2866:5;2862:16;2855:93;2806:153;2404:565;;;;:::o;3012:159::-;;3123:3;3114:6;3109:3;3105:16;3101:26;3098:2;;;3140:1;3137;3130:12;3098:2;3159:6;3150:15;;3091:80;;;;:::o;3212:522::-;;3326:4;3314:9;3309:3;3305:19;3301:30;3298:2;;;3344:1;3341;3334:12;3298:2;3362:20;3377:4;3362:20;:::i;:::-;3353:29;;3432:1;3464:74;3534:3;3525:6;3514:9;3510:22;3464:74;:::i;:::-;3457:4;3450:5;3446:16;3439:100;3392:158;3604:2;3637:75;3708:3;3699:6;3688:9;3684:22;3637:75;:::i;:::-;3630:4;3623:5;3619:16;3612:101;3560:164;3292:442;;;;:::o;3741:130::-;;3821:6;3808:20;3799:29;;3833:33;3860:5;3833:33;:::i;:::-;3793:78;;;;:::o;3878:134::-;;3962:6;3956:13;3947:22;;3974:33;4001:5;3974:33;:::i;:::-;3941:71;;;;:::o;4019:241::-;;4123:2;4111:9;4102:7;4098:23;4094:32;4091:2;;;4139:1;4136;4129:12;4091:2;4174:1;4191:53;4236:7;4227:6;4216:9;4212:22;4191:53;:::i;:::-;4181:63;;4153:97;4085:175;;;;:::o;4267:263::-;;4382:2;4370:9;4361:7;4357:23;4353:32;4350:2;;;4398:1;4395;4388:12;4350:2;4433:1;4450:64;4506:7;4497:6;4486:9;4482:22;4450:64;:::i;:::-;4440:74;;4412:108;4344:186;;;;:::o;4537:419::-;;;4687:2;4675:9;4666:7;4662:23;4658:32;4655:2;;;4703:1;4700;4693:12;4655:2;4766:1;4755:9;4751:17;4738:31;4789:18;4781:6;4778:30;4775:2;;;4821:1;4818;4811:12;4775:2;4849:91;4932:7;4923:6;4912:9;4908:22;4849:91;:::i;:::-;4831:109;;;;4717:229;4649:307;;;;;:::o;4963:257::-;;5075:2;5063:9;5054:7;5050:23;5046:32;5043:2;;;5091:1;5088;5081:12;5043:2;5126:1;5143:61;5196:7;5187:6;5176:9;5172:22;5143:61;:::i;:::-;5133:71;;5105:105;5037:183;;;;:::o;5227:535::-;;;;5387:2;5375:9;5366:7;5362:23;5358:32;5355:2;;;5403:1;5400;5393:12;5355:2;5438:1;5455:67;5514:7;5505:6;5494:9;5490:22;5455:67;:::i;:::-;5445:77;;5417:111;5559:2;5577:61;5630:7;5621:6;5610:9;5606:22;5577:61;:::i;:::-;5567:71;;5538:106;5675:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5654:98;5349:413;;;;;:::o;5769:291::-;;5898:2;5886:9;5877:7;5873:23;5869:32;5866:2;;;5914:1;5911;5904:12;5866:2;5949:1;5966:78;6036:7;6027:6;6016:9;6012:22;5966:78;:::i;:::-;5956:88;;5928:122;5860:200;;;;:::o;6067:665::-;;;;;6249:2;6237:9;6228:7;6224:23;6220:32;6217:2;;;6265:1;6262;6255:12;6217:2;6300:1;6317:78;6387:7;6378:6;6367:9;6363:22;6317:78;:::i;:::-;6307:88;;6279:122;6432:2;6450:53;6495:7;6486:6;6475:9;6471:22;6450:53;:::i;:::-;6440:63;;6411:98;6568:2;6557:9;6553:18;6540:32;6592:18;6584:6;6581:30;6578:2;;;6624:1;6621;6614:12;6578:2;6652:64;6708:7;6699:6;6688:9;6684:22;6652:64;:::i;:::-;6634:82;;;;6519:203;6211:521;;;;;;;:::o;6739:1327::-;;;;;;;;;;7022:3;7010:9;7001:7;6997:23;6993:33;6990:2;;;7039:1;7036;7029:12;6990:2;7074:1;7091:78;7161:7;7152:6;7141:9;7137:22;7091:78;:::i;:::-;7081:88;;7053:122;7234:2;7223:9;7219:18;7206:32;7258:18;7250:6;7247:30;7244:2;;;7290:1;7287;7280:12;7244:2;7318:64;7374:7;7365:6;7354:9;7350:22;7318:64;:::i;:::-;7300:82;;;;7185:203;7419:2;7437:53;7482:7;7473:6;7462:9;7458:22;7437:53;:::i;:::-;7427:63;;7398:98;7527:2;7545:53;7590:7;7581:6;7570:9;7566:22;7545:53;:::i;:::-;7535:63;;7506:98;7635:3;7654:61;7707:7;7698:6;7687:9;7683:22;7654:61;:::i;:::-;7644:71;;7614:107;7752:3;7771:61;7824:7;7815:6;7804:9;7800:22;7771:61;:::i;:::-;7761:71;;7731:107;7869:3;7888:53;7933:7;7924:6;7913:9;7909:22;7888:53;:::i;:::-;7878:63;;7848:99;7978:3;7997:53;8042:7;8033:6;8022:9;8018:22;7997:53;:::i;:::-;7987:63;;7957:99;6984:1082;;;;;;;;;;;:::o;8073:283::-;;8198:2;8186:9;8177:7;8173:23;8169:32;8166:2;;;8214:1;8211;8204:12;8166:2;8249:1;8266:74;8332:7;8323:6;8312:9;8308:22;8266:74;:::i;:::-;8256:84;;8228:118;8160:196;;;;:::o;8363:296::-;;8494:3;8482:9;8473:7;8469:23;8465:33;8462:2;;;8511:1;8508;8501:12;8462:2;8546:1;8563:80;8635:7;8626:6;8615:9;8611:22;8563:80;:::i;:::-;8553:90;;8525:124;8456:203;;;;:::o;8666:292::-;;8795:3;8783:9;8774:7;8770:23;8766:33;8763:2;;;8812:1;8809;8802:12;8763:2;8847:1;8864:78;8934:7;8925:6;8914:9;8910:22;8864:78;:::i;:::-;8854:88;;8826:122;8757:201;;;;:::o;8965:263::-;;9080:2;9068:9;9059:7;9055:23;9051:32;9048:2;;;9096:1;9093;9086:12;9048:2;9131:1;9148:64;9204:7;9195:6;9184:9;9180:22;9148:64;:::i;:::-;9138:74;;9110:108;9042:186;;;;:::o;9235:137::-;9334:32;9360:5;9334:32;:::i;:::-;9329:3;9322:45;9316:56;;:::o;9379:113::-;9462:24;9480:5;9462:24;:::i;:::-;9457:3;9450:37;9444:48;;:::o;9499:104::-;9576:21;9591:5;9576:21;:::i;:::-;9571:3;9564:34;9558:45;;:::o;9610:113::-;9693:24;9711:5;9693:24;:::i;:::-;9688:3;9681:37;9675:48;;:::o;9753:297::-;;9867:70;9930:6;9925:3;9867:70;:::i;:::-;9860:77;;9949:43;9985:6;9980:3;9973:5;9949:43;:::i;:::-;10014:29;10036:6;10014:29;:::i;:::-;10009:3;10005:39;9998:46;;9853:197;;;;;:::o;10058:356::-;;10186:38;10218:5;10186:38;:::i;:::-;10236:88;10317:6;10312:3;10236:88;:::i;:::-;10229:95;;10329:52;10374:6;10369:3;10362:4;10355:5;10351:16;10329:52;:::i;:::-;10402:6;10397:3;10393:16;10386:23;;10166:248;;;;;:::o;10421:154::-;10518:51;10563:5;10518:51;:::i;:::-;10513:3;10506:64;10500:75;;:::o;10582:168::-;10686:58;10738:5;10686:58;:::i;:::-;10681:3;10674:71;10668:82;;:::o;10757:158::-;10856:53;10903:5;10856:53;:::i;:::-;10851:3;10844:66;10838:77;;:::o;10922:347::-;;11034:39;11067:5;11034:39;:::i;:::-;11085:71;11149:6;11144:3;11085:71;:::i;:::-;11078:78;;11161:52;11206:6;11201:3;11194:4;11187:5;11183:16;11161:52;:::i;:::-;11234:29;11256:6;11234:29;:::i;:::-;11229:3;11225:39;11218:46;;11014:255;;;;;:::o;11277:375::-;;11437:67;11501:2;11496:3;11437:67;:::i;:::-;11430:74;;11537:34;11533:1;11528:3;11524:11;11517:55;11606:8;11601:2;11596:3;11592:12;11585:30;11643:2;11638:3;11634:12;11627:19;;11423:229;;;:::o;11661:315::-;;11821:67;11885:2;11880:3;11821:67;:::i;:::-;11814:74;;11921:17;11917:1;11912:3;11908:11;11901:38;11967:2;11962:3;11958:12;11951:19;;11807:169;;;:::o;11985:329::-;;12145:67;12209:2;12204:3;12145:67;:::i;:::-;12138:74;;12245:31;12241:1;12236:3;12232:11;12225:52;12305:2;12300:3;12296:12;12289:19;;12131:183;;;:::o;12323:329::-;;12483:67;12547:2;12542:3;12483:67;:::i;:::-;12476:74;;12583:31;12579:1;12574:3;12570:11;12563:52;12643:2;12638:3;12634:12;12627:19;;12469:183;;;:::o;12661:371::-;;12821:67;12885:2;12880:3;12821:67;:::i;:::-;12814:74;;12921:34;12917:1;12912:3;12908:11;12901:55;12990:4;12985:2;12980:3;12976:12;12969:26;13023:2;13018:3;13014:12;13007:19;;12807:225;;;:::o;13041:379::-;;13201:67;13265:2;13260:3;13201:67;:::i;:::-;13194:74;;13301:34;13297:1;13292:3;13288:11;13281:55;13370:12;13365:2;13360:3;13356:12;13349:34;13411:2;13406:3;13402:12;13395:19;;13187:233;;;:::o;13429:330::-;;13589:67;13653:2;13648:3;13589:67;:::i;:::-;13582:74;;13689:32;13685:1;13680:3;13676:11;13669:53;13750:2;13745:3;13741:12;13734:19;;13575:184;;;:::o;13768:391::-;;13928:67;13992:2;13987:3;13928:67;:::i;:::-;13921:74;;14028:34;14024:1;14019:3;14015:11;14008:55;14097:24;14092:2;14087:3;14083:12;14076:46;14150:2;14145:3;14141:12;14134:19;;13914:245;;;:::o;14168:314::-;;14328:67;14392:2;14387:3;14328:67;:::i;:::-;14321:74;;14428:16;14424:1;14419:3;14415:11;14408:37;14473:2;14468:3;14464:12;14457:19;;14314:168;;;:::o;14490:113::-;14573:24;14591:5;14573:24;:::i;:::-;14568:3;14561:37;14555:48;;:::o;14610:271::-;;14763:93;14852:3;14843:6;14763:93;:::i;:::-;14756:100;;14873:3;14866:10;;14744:137;;;;:::o;14888:222::-;;15015:2;15004:9;15000:18;14992:26;;15029:71;15097:1;15086:9;15082:17;15073:6;15029:71;:::i;:::-;14986:124;;;;:::o;15117:333::-;;15272:2;15261:9;15257:18;15249:26;;15286:71;15354:1;15343:9;15339:17;15330:6;15286:71;:::i;:::-;15368:72;15436:2;15425:9;15421:18;15412:6;15368:72;:::i;:::-;15243:207;;;;;:::o;15457:444::-;;15640:2;15629:9;15625:18;15617:26;;15654:71;15722:1;15711:9;15707:17;15698:6;15654:71;:::i;:::-;15736:72;15804:2;15793:9;15789:18;15780:6;15736:72;:::i;:::-;15819;15887:2;15876:9;15872:18;15863:6;15819:72;:::i;:::-;15611:290;;;;;;:::o;15908:333::-;;16063:2;16052:9;16048:18;16040:26;;16077:71;16145:1;16134:9;16130:17;16121:6;16077:71;:::i;:::-;16159:72;16227:2;16216:9;16212:18;16203:6;16159:72;:::i;:::-;16034:207;;;;;:::o;16248:333::-;;16403:2;16392:9;16388:18;16380:26;;16417:71;16485:1;16474:9;16470:17;16461:6;16417:71;:::i;:::-;16499:72;16567:2;16556:9;16552:18;16543:6;16499:72;:::i;:::-;16374:207;;;;;:::o;16588:492::-;;16795:2;16784:9;16780:18;16772:26;;16809:65;16871:1;16860:9;16856:17;16847:6;16809:65;:::i;:::-;16885:86;16967:2;16956:9;16952:18;16943:6;16885:86;:::i;:::-;16982:88;17066:2;17055:9;17051:18;17042:6;16982:88;:::i;:::-;16766:314;;;;;;:::o;17087:222::-;;17214:2;17203:9;17199:18;17191:26;;17228:71;17296:1;17285:9;17281:17;17272:6;17228:71;:::i;:::-;17185:124;;;;:::o;17316:326::-;;17471:2;17460:9;17456:18;17448:26;;17521:9;17515:4;17511:20;17507:1;17496:9;17492:17;17485:47;17546:86;17627:4;17618:6;17610;17546:86;:::i;:::-;17538:94;;17442:200;;;;;:::o;17649:1060::-;;18004:3;17993:9;17989:19;17981:27;;18055:9;18049:4;18045:20;18041:1;18030:9;18026:17;18019:47;18080:86;18161:4;18152:6;18144;18080:86;:::i;:::-;18072:94;;18177:72;18245:2;18234:9;18230:18;18221:6;18177:72;:::i;:::-;18260;18328:2;18317:9;18313:18;18304:6;18260:72;:::i;:::-;18343:88;18427:2;18416:9;18412:18;18403:6;18343:88;:::i;:::-;18442:89;18526:3;18515:9;18511:19;18502:6;18442:89;:::i;:::-;18542:73;18610:3;18599:9;18595:19;18586:6;18542:73;:::i;:::-;18626;18694:3;18683:9;18679:19;18670:6;18626:73;:::i;:::-;17975:734;;;;;;;;;;;:::o;18716:264::-;;18864:2;18853:9;18849:18;18841:26;;18878:92;18967:1;18956:9;18952:17;18943:6;18878:92;:::i;:::-;18835:145;;;;:::o;18987:254::-;;19130:2;19119:9;19115:18;19107:26;;19144:87;19228:1;19217:9;19213:17;19204:6;19144:87;:::i;:::-;19101:140;;;;:::o;19248:310::-;;19395:2;19384:9;19380:18;19372:26;;19445:9;19439:4;19435:20;19431:1;19420:9;19416:17;19409:47;19470:78;19543:4;19534:6;19470:78;:::i;:::-;19462:86;;19366:192;;;;:::o;19565:416::-;;19765:2;19754:9;19750:18;19742:26;;19815:9;19809:4;19805:20;19801:1;19790:9;19786:17;19779:47;19840:131;19966:4;19840:131;:::i;:::-;19832:139;;19736:245;;;:::o;19988:416::-;;20188:2;20177:9;20173:18;20165:26;;20238:9;20232:4;20228:20;20224:1;20213:9;20209:17;20202:47;20263:131;20389:4;20263:131;:::i;:::-;20255:139;;20159:245;;;:::o;20411:416::-;;20611:2;20600:9;20596:18;20588:26;;20661:9;20655:4;20651:20;20647:1;20636:9;20632:17;20625:47;20686:131;20812:4;20686:131;:::i;:::-;20678:139;;20582:245;;;:::o;20834:416::-;;21034:2;21023:9;21019:18;21011:26;;21084:9;21078:4;21074:20;21070:1;21059:9;21055:17;21048:47;21109:131;21235:4;21109:131;:::i;:::-;21101:139;;21005:245;;;:::o;21257:416::-;;21457:2;21446:9;21442:18;21434:26;;21507:9;21501:4;21497:20;21493:1;21482:9;21478:17;21471:47;21532:131;21658:4;21532:131;:::i;:::-;21524:139;;21428:245;;;:::o;21680:416::-;;21880:2;21869:9;21865:18;21857:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21955:131;22081:4;21955:131;:::i;:::-;21947:139;;21851:245;;;:::o;22103:416::-;;22303:2;22292:9;22288:18;22280:26;;22353:9;22347:4;22343:20;22339:1;22328:9;22324:17;22317:47;22378:131;22504:4;22378:131;:::i;:::-;22370:139;;22274:245;;;:::o;22526:416::-;;22726:2;22715:9;22711:18;22703:26;;22776:9;22770:4;22766:20;22762:1;22751:9;22747:17;22740:47;22801:131;22927:4;22801:131;:::i;:::-;22793:139;;22697:245;;;:::o;22949:416::-;;23149:2;23138:9;23134:18;23126:26;;23199:9;23193:4;23189:20;23185:1;23174:9;23170:17;23163:47;23224:131;23350:4;23224:131;:::i;:::-;23216:139;;23120:245;;;:::o;23372:506::-;;;23507:11;23494:25;23603:1;23597:4;23593:12;23582:8;23566:14;23562:29;23558:48;23538:18;23534:73;23524:2;;23621:1;23618;23611:12;23524:2;23652:18;23642:8;23638:33;23630:41;;23705:4;23692:18;23682:28;;23730:18;23722:6;23719:30;23716:2;;;23762:1;23759;23752:12;23716:2;23790;23784:4;23780:13;23772:21;;23844:4;23836:6;23832:17;23816:14;23812:38;23806:4;23802:49;23799:2;;;23864:1;23861;23854:12;23799:2;23462:416;;;;;;:::o;23885:256::-;;23947:2;23941:9;23931:19;;23985:4;23977:6;23973:17;24084:6;24072:10;24069:22;24048:18;24036:10;24033:34;24030:62;24027:2;;;24105:1;24102;24095:12;24027:2;24125:10;24121:2;24114:22;23925:216;;;;:::o;24148:121::-;;24241:5;24235:12;24225:22;;24206:63;;;:::o;24276:122::-;;24370:5;24364:12;24354:22;;24335:63;;;:::o;24406:162::-;;24520:6;24515:3;24508:19;24557:4;24552:3;24548:14;24533:29;;24501:67;;;;:::o;24577:144::-;;24712:3;24697:18;;24690:31;;;;:::o;24730:163::-;;24845:6;24840:3;24833:19;24882:4;24877:3;24873:14;24858:29;;24826:67;;;;:::o;24901:91::-;;24963:24;24981:5;24963:24;:::i;:::-;24952:35;;24946:46;;;:::o;24999:99::-;;25069:24;25087:5;25069:24;:::i;:::-;25058:35;;25052:46;;;:::o;25105:85::-;;25178:5;25171:13;25164:21;25153:32;;25147:43;;;:::o;25197:72::-;;25259:5;25248:16;;25242:27;;;:::o;25276:105::-;;25352:24;25370:5;25352:24;:::i;:::-;25341:35;;25335:46;;;:::o;25388:116::-;;25475:24;25493:5;25475:24;:::i;:::-;25464:35;;25458:46;;;:::o;25511:112::-;;25594:24;25612:5;25594:24;:::i;:::-;25583:35;;25577:46;;;:::o;25630:142::-;;25710:5;25699:16;;25716:51;25761:5;25716:51;:::i;:::-;25693:79;;;:::o;25779:121::-;;25852:42;25845:5;25841:54;25830:65;;25824:76;;;:::o;25907:72::-;;25969:5;25958:16;;25952:27;;;:::o;25986:149::-;;26079:51;26124:5;26079:51;:::i;:::-;26066:64;;26060:75;;;:::o;26142:122::-;;26235:24;26253:5;26235:24;:::i;:::-;26222:37;;26216:48;;;:::o;26271:163::-;;26371:58;26423:5;26371:58;:::i;:::-;26358:71;;26352:82;;;:::o;26441:129::-;;26541:24;26559:5;26541:24;:::i;:::-;26528:37;;26522:48;;;:::o;26577:142::-;;26672:42;26708:5;26672:42;:::i;:::-;26659:55;;26653:66;;;:::o;26727:145::-;26808:6;26803:3;26798;26785:30;26864:1;26855:6;26850:3;26846:16;26839:27;26778:94;;;:::o;26881:268::-;26946:1;26953:101;26967:6;26964:1;26961:13;26953:101;;;27043:1;27038:3;27034:11;27028:18;27024:1;27019:3;27015:11;27008:39;26989:2;26986:1;26982:10;26977:15;;26953:101;;;27069:6;27066:1;27063:13;27060:2;;;27134:1;27125:6;27120:3;27116:16;27109:27;27060:2;26930:219;;;;:::o;27157:97::-;;27245:2;27241:7;27236:2;27229:5;27225:14;27221:28;27211:38;;27205:49;;;:::o;27262:109::-;27349:1;27342:5;27339:12;27329:2;;27355:9;27329:2;27323:48;:::o;27378:117::-;27447:24;27465:5;27447:24;:::i;:::-;27440:5;27437:35;27427:2;;27486:1;27483;27476:12;27427:2;27421:74;:::o;27502:133::-;27579:32;27605:5;27579:32;:::i;:::-;27572:5;27569:43;27559:2;;27626:1;27623;27616:12;27559:2;27553:82;:::o;27642:111::-;27708:21;27723:5;27708:21;:::i;:::-;27701:5;27698:32;27688:2;;27744:1;27741;27734:12;27688:2;27682:71;:::o;27760:117::-;27829:24;27847:5;27829:24;:::i;:::-;27822:5;27819:35;27809:2;;27868:1;27865;27858:12;27809:2;27803:74;:::o;27884:145::-;27967:38;27999:5;27967:38;:::i;:::-;27960:5;27957:49;27947:2;;28020:1;28017;28010:12;27947:2;27941:88;:::o;28036:167::-;28130:49;28173:5;28130:49;:::i;:::-;28123:5;28120:60;28110:2;;28194:1;28191;28184:12;28110:2;28104:99;:::o;28210:159::-;28300:45;28339:5;28300:45;:::i;:::-;28293:5;28290:56;28280:2;;28360:1;28357;28350:12;28280:2;28274:95;:::o;28376:112::-;28463:1;28456:5;28453:12;28443:2;;28479:1;28476;28469:12;28443:2;28437:51;:::o;28495:117::-;28564:24;28582:5;28564:24;:::i;:::-;28557:5;28554:35;28544:2;;28603:1;28600;28593:12;28544:2;28538:74;:::o

Swarm Source

ipfs://6c24eb4a3ba3b71bd299a72bf87d4c9d0e252bbc00a6dc905900fb08c601d559
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading