ETH Price: $3,284.33 (-9.71%)

Contract

0x0000000012a0592C154D552C410030E724b2eA00
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer193066872024-02-25 19:29:11298 days ago1708889351IN
0x00000000...724b2eA00
0 ETH0.0009556138.59351619
Transfer192995752024-02-24 19:37:35299 days ago1708803455IN
0x00000000...724b2eA00
0 ETH0.0007799633.91145403
Permit183448862023-10-13 23:55:59433 days ago1697241359IN
0x00000000...724b2eA00
0 ETH0.000295535.19029487
Transfer173701492023-05-30 7:04:11570 days ago1685430251IN
0x00000000...724b2eA00
0 ETH0.0012161649.09217052
Transfer173655722023-05-29 15:36:23570 days ago1685374583IN
0x00000000...724b2eA00
0 ETH0.0010681743.16018267
Transfer163878102023-01-12 2:42:59708 days ago1673491379IN
0x00000000...724b2eA00
0 ETH0.0004690618.94365326
Transfer160514632022-11-26 3:25:59755 days ago1669433159IN
0x00000000...724b2eA00
0 ETH0.0003218913
Transfer155529202022-09-17 11:11:23825 days ago1663413083IN
0x00000000...724b2eA00
0 ETH0.000143115.77706126
Transfer150597852022-07-02 0:25:41902 days ago1656721541IN
0x00000000...724b2eA00
0 ETH0.0008126832.82106068
Transfer150597822022-07-02 0:25:02902 days ago1656721502IN
0x00000000...724b2eA00
0 ETH0.0007273329.37423759
Transfer149134092022-06-06 6:14:20928 days ago1654496060IN
0x00000000...724b2eA00
0 ETH0.0010563842.6631721
Transfer148896822022-06-02 7:28:16932 days ago1654154896IN
0x00000000...724b2eA00
0 ETH0.0018021272.78061455
Transfer148836002022-06-01 7:34:04933 days ago1654068844IN
0x00000000...724b2eA00
0 ETH0.0008475634.22966196
Transfer148796462022-05-31 16:03:42933 days ago1654013022IN
0x00000000...724b2eA00
0 ETH0.0037103368.46901319
Transfer148790472022-05-31 13:50:09934 days ago1654005009IN
0x00000000...724b2eA00
0 ETH0.0017821532.87992604
Approve148747992022-05-30 21:04:38934 days ago1653944678IN
0x00000000...724b2eA00
0 ETH0.0020658843.87294758
Transfer148743192022-05-30 19:10:00934 days ago1653937800IN
0x00000000...724b2eA00
0 ETH0.0011720221.62329047
Transfer148723552022-05-30 11:46:37935 days ago1653911197IN
0x00000000...724b2eA00
0 ETH0.0013222140.9177308
Transfer148723502022-05-30 11:45:13935 days ago1653911113IN
0x00000000...724b2eA00
0 ETH0.0014661545.37223829
Transfer148723482022-05-30 11:44:04935 days ago1653911044IN
0x00000000...724b2eA00
0 ETH0.0018361537.16756168
Transfer148718622022-05-30 9:42:19935 days ago1653903739IN
0x00000000...724b2eA00
0 ETH0.0010840420
Transfer148690242022-05-29 22:23:45935 days ago1653863025IN
0x00000000...724b2eA00
0 ETH0.0011606531.28275152
Transfer148689242022-05-29 22:01:49935 days ago1653861709IN
0x00000000...724b2eA00
0 ETH0.0015808632
Transfer148689192022-05-29 22:00:27935 days ago1653861627IN
0x00000000...724b2eA00
0 ETH0.0016295830.06508471
Transfer148689122022-05-29 21:59:03935 days ago1653861543IN
0x00000000...724b2eA00
0 ETH0.0017344632
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
bbtCNV

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2022-01-30
*/

// SPDX-License-Identifier: WTFPL
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*///////////////////////////////////////////////////////////////
                             METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*///////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

interface ICNV {
    function mint(address to, uint256 amount) external returns (uint256);

    function totalSupply() external view returns (uint256);
}

/// @notice Concave Presale Token
/// @author 0xBarista & Dionysus (ConcaveFi)
contract bbtCNV is ERC20("Concave Presale Token (BBT)", "bbtCNV", 18) {

    /* ---------------------------------------------------------------------- */
    /*                                DEPENDENCIES                            */
    /* ---------------------------------------------------------------------- */

    using SafeTransferLib for ERC20;

    /* ---------------------------------------------------------------------- */
    /*                             IMMUTABLE STATE                            */
    /* ---------------------------------------------------------------------- */

    /// @notice FRAX tokenIn address
    ERC20 public immutable FRAX = ERC20(0x853d955aCEf822Db058eb8505911ED77F175b99e);

    /// @notice DAI tokenIn address
    ERC20 public immutable DAI = ERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F);

    /// @notice Error related to amount
    string constant AMOUNT_ERROR = "!AMOUNT";

    /// @notice Error related to token address
    string constant TOKEN_IN_ERROR = "!TOKEN_IN";

    /* ---------------------------------------------------------------------- */
    /*                              MUTABLE STATE                             */
    /* ---------------------------------------------------------------------- */

    /// @notice Address that is recipient of raised funds + access control
    address public treasury = 0x226e7AF139a0F34c6771DeB252F9988876ac1Ced;

    /// @notice Returns the current merkle root being used
    bytes32 public merkleRoot;

    /// @notice Returns an array of all merkle roots used
    bytes32[] public roots;

    /// @notice Returns the current pCNV price in DAI/FRAX
    uint256 public rate;

    /// @notice Returns the total amount of pCNV that has cumulatively been minted
    uint256 public totalMinted;

    /// @notice Returns if pCNV are redeemable for CNV
    // bool public redeemable;

    /// @notice Returns whether transfers are paused
    bool public transfersPaused;

    /* ---------------------------------------------------------------------- */
    /*                              STRUCTURED STATE                          */
    /* ---------------------------------------------------------------------- */

    /// @notice Structure of Participant vesting storage
    struct Participant {
        uint256 purchased; // amount (in total) of pCNV that user has purchased
        uint256 redeemed;  // amount (in total) of pCNV that user has redeemed
    }

    /// @notice             maps an account to vesting storage
    /// address             - account to check
    /// returns Participant - Structured vesting storage
    mapping(address => Participant) public participants;

    /// @notice             amount of DAI/FRAX user has spent for a specific root
    /// bytes32             - merkle root
    /// address             - account to check
    /// returns uint256     - amount in DAI/FRAX (denominated in ether) spent purchasing pCNV
    mapping(bytes32 => mapping(address => uint256)) public spentAmounts;

    /* ---------------------------------------------------------------------- */
    /*                                  EVENTS                                */
    /* ---------------------------------------------------------------------- */

    /// @notice Emitted when treasury changes treasury address
    /// @param  treasury address of new treasury
    event TreasurySet(address treasury);

    /// @notice             Emitted when a new round is set by treasury
    /// @param  merkleRoot  new merkle root
    /// @param  rate        new price of pCNV in DAI/FRAX
    event NewRound(bytes32 merkleRoot, uint256 rate);

    /// @notice             Emitted when maxSupply of pCNV is burned or minted to target
    /// @param  target      target to which to mint pCNV or burn if target = address(0)
    /// @param  amount      amount of pCNV minted to target or burned
    /// @param  totalMinted amount of pCNV minted to target or burned
    event Managed(address target, uint256 amount, uint256 totalMinted);

    /// @notice                 Emitted when pCNV minted via "mint()" or "mintWithPermit"
    /// @param  depositedFrom   address from which DAI/FRAX was deposited
    /// @param  mintedTo        address to which pCNV were minted to
    /// @param  amount          amount of pCNV minted
    /// @param  deposited       amount of DAI/FRAX deposited
    /// @param  totalMinted     total amount of pCNV minted so far
    event Minted(
        address indexed depositedFrom,
        address indexed mintedTo,
        uint256 amount,
        uint256 deposited,
        uint256 totalMinted
    );

    /* ---------------------------------------------------------------------- */
    /*                                MODIFIERS                               */
    /* ---------------------------------------------------------------------- */

    /// @notice only allows Concave treasury
    modifier onlyConcave() {
        require(msg.sender == treasury, "!CONCAVE");
        _;
    }

    /* ---------------------------------------------------------------------- */
    /*                              ONLY CONCAVE                              */
    /* ---------------------------------------------------------------------- */

    /// @notice Set a new treasury address if treasury
    function setTreasury(
        address _treasury
    ) external onlyConcave {
        treasury = _treasury;

        emit TreasurySet(_treasury);
    }

    /// @notice             Update merkle root and rate
    /// @param _merkleRoot  root of merkle tree
    /// @param _rate        price of pCNV in DAI/FRAX
    function setRound(
        bytes32 _merkleRoot,
        uint256 _rate
    ) external onlyConcave {
        // push new root to array of all roots - for viewing
        roots.push(_merkleRoot);
        // update merkle root
        merkleRoot = _merkleRoot;
        // update rate
        rate = _rate;

        emit NewRound(merkleRoot,rate);
    }

    /// @notice         Reduce an "amount" of available supply of pCNV or mint it to "target"
    /// @param target   address to which to mint; if address(0), will burn
    /// @param amount   to reduce from max supply or mint to "target"
    function manage(
        address target,
        uint256 amount
    ) external onlyConcave {

        totalMinted += amount;
        // mint target amount
        _mint(target, amount);

        emit Managed(target, amount, totalMinted);
    }

    /// @notice         Allows Concave to pause transfers in the event of a bug
    /// @param paused   if transfers should be paused or not
    function setTransfersPaused(bool paused) external onlyConcave {
        transfersPaused = paused;
    }

    /* ---------------------------------------------------------------------- */
    /*                              PUBLIC LOGIC                              */
    /* ---------------------------------------------------------------------- */

    /// @notice               mint pCNV by providing merkle proof and depositing DAI/FRAX
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI/FRAX)
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    function mint(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) external returns (uint256 amountOut) {
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice               mint pCNV by providing merkle proof and depositing DAI; uses EIP-2612 permit to save a transaction
    /// @param to             whitelisted address pCNV will be minted to
    /// @param tokenIn        address of tokenIn user wishes to deposit (DAI)
    /// @param maxAmount      max amount of DAI sender can deposit for pCNV, to verify merkle proof
    /// @param amountIn       amount of DAI sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove "to" and "maxAmount" are in merkle tree
    /// @param permitDeadline EIP-2612 : time when permit is no longer valid
    /// @param v              EIP-2612 : part of EIP-2612 signature
    /// @param r              EIP-2612 : part of EIP-2612 signature
    /// @param s              EIP-2612 : part of EIP-2612 signature
    function mintWithPermit(
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof,
        uint256 permitDeadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountOut) {
        // Make sure payment tokenIn is DAI
        require(tokenIn == address(DAI), TOKEN_IN_ERROR);
        // Approve tokens for spender - https://eips.ethereum.org/EIPS/eip-2612
        ERC20(tokenIn).permit(msg.sender, address(this), amountIn, permitDeadline, v, r, s);
        // allow sender to mint for "to"
        return _purchase(msg.sender, to, tokenIn, maxAmount, amountIn, proof);
    }

    /// @notice         transfer "amount" of tokens from msg.sender to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        require(!transfersPaused,"PAUSED");
        // default ERC20 transfer
        return super.transfer(to, amount);
    }

    /// @notice         transfer "amount" of tokens from "from" to "to"
    /// @dev            calls "_beforeTransfer" to update vesting storage for "from" and "to"
    /// @param from     address tokens are being transfered from
    /// @param to       address tokens are being sent to
    /// @param amount   number of tokens being transfered
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        require(!transfersPaused,"PAUSED");
        // default ERC20 transfer
        return super.transferFrom(from, to, amount);
    }

    /* ---------------------------------------------------------------------- */
    /*                             INTERNAL LOGIC                             */
    /* ---------------------------------------------------------------------- */

    /// @notice               Deposits FRAX/DAI for pCNV if merkle proof exists in specified round
    /// @param sender         address sending transaction
    /// @param to             whitelisted address purchased pCNV will be sent to
    /// @param tokenIn        address of tokenIn user wishes to deposit
    /// @param maxAmount      max amount of DAI/FRAX sender can deposit for pCNV
    /// @param amountIn       amount of DAI/FRAX sender wishes to deposit for pCNV
    /// @param proof          merkle proof to prove address and amount are in tree
    function _purchase(
        address sender,
        address to,
        address tokenIn,
        uint256 maxAmount,
        uint256 amountIn,
        bytes32[] calldata proof
    ) internal returns(uint256 amountOut) {
        // Make sure payment tokenIn is either DAI or FRAX
        require(tokenIn == address(DAI) || tokenIn == address(FRAX), TOKEN_IN_ERROR);

        // Require merkle proof with `to` and `maxAmount` to be successfully verified
        require(MerkleProof.verify(proof, merkleRoot, keccak256(abi.encodePacked(to, maxAmount))), "!PROOF");

        // Verify amount claimed by user does not surpass "maxAmount"
        uint256 newAmount = spentAmounts[merkleRoot][to] + amountIn; // save gas
        require(newAmount <= maxAmount, AMOUNT_ERROR);
        spentAmounts[merkleRoot][to] = newAmount;

        // Calculate rate of pCNV that should be returned for "amountIn"
        amountOut = amountIn * 1e18 / rate;

        // Interface storage for participant
        Participant storage participant = participants[to];

        // Increase participant.purchased to account for newly purchased tokens
        participant.purchased += amountOut;

        // Increase totalMinted to account for newly minted supply
        totalMinted += amountOut;

        // Transfer amountIn*ratio of tokenIn to treasury address
        ERC20(tokenIn).safeTransferFrom(sender, treasury, amountIn);

        // Mint tokens to address after pulling
        _mint(to, amountOut);

        emit Minted(sender, to, amountOut, amountIn, totalMinted);
    }


    /// @notice         Rescues accidentally sent tokens and ETH
    /// @param token    address of token to rescue, if address(0) rescue ETH
    function rescue(address token) external onlyConcave {
        if (token == address(0)) payable(treasury).transfer( address(this).balance );
        else ERC20(token).transfer(treasury, ERC20(token).balanceOf(address(this)));
    }
}

// © 2022 WTFPL – Do What the Fuck You Want to Public License.

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Managed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositedFrom","type":"address"},{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"deposited","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"NewRound","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"TreasurySet","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FRAX","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"permitDeadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participants","outputs":[{"internalType":"uint256","name":"purchased","type":"uint256"},{"internalType":"uint256","name":"redeemed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setTransfersPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"spentAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61012060405273853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff1660e09073ffffffffffffffffffffffffffffffffffffffff1660601b815250736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166101009073ffffffffffffffffffffffffffffffffffffffff1660601b81525073226e7af139a0f34c6771deb252f9988876ac1ced600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000fc57600080fd5b506040518060400160405280601b81526020017f436f6e636176652050726573616c6520546f6b656e20284242542900000000008152506040518060400160405280600681526020017f626274434e560000000000000000000000000000000000000000000000000000815250601282600090805190602001906200018392919062000266565b5081600190805190602001906200019c92919062000266565b508060ff1660808160ff1660f81b815250504660a08181525050620001c6620001d660201b60201c565b60c0818152505050505062000517565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516200020a9190620003d4565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016200024b959493929190620003ed565b60405160208183030381529060405280519060200120905090565b8280546200027490620004b2565b90600052602060002090601f016020900481019282620002985760008555620002e4565b82601f10620002b357805160ff1916838001178555620002e4565b82800160010185558215620002e4579182015b82811115620002e3578251825591602001919060010190620002c6565b5b509050620002f39190620002f7565b5090565b5b8082111562000312576000816000905550600101620002f8565b5090565b62000321816200046a565b82525050565b62000332816200047e565b82525050565b600081546200034781620004b2565b6200035381866200045f565b945060018216600081146200037157600181146200038357620003ba565b60ff19831686528186019350620003ba565b6200038e856200044a565b60005b83811015620003b25781548189015260018201915060208101905062000391565b838801955050505b50505092915050565b620003ce81620004a8565b82525050565b6000620003e2828462000338565b915081905092915050565b600060a08201905062000404600083018862000327565b62000413602083018762000327565b62000422604083018662000327565b620004316060830185620003c3565b62000440608083018462000316565b9695505050505050565b60008190508160005260206000209050919050565b600081905092915050565b6000620004778262000488565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620004cb57607f821691505b60208210811415620004e257620004e1620004e8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160f81c60a05160c05160e05160601c6101005160601c6131e26200057a60003960008181610f1701528181611467015261193e0152600081816110de015261199301526000610adb01526000610aa701526000610a8101526131e26000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806361d027b311610104578063a9059cbb116100a2578063d505accf11610071578063d505accf14610598578063dd62ed3e146105b4578063e0bab4c4146105e4578063f0f4426014610602576101da565b8063a9059cbb146104ea578063b0e4556f1461051a578063c2b40ae414610538578063c89380fd14610568576101da565b8063839006f2116100de578063839006f21461046257806395d89b411461047e57806396fb8b101461049c578063a2309ff8146104cc576101da565b806361d027b3146103e457806370a08231146104025780637ecebe0014610432576101da565b806323b872dd1161017c578063313ce5671161014b578063313ce5671461036e5780633644e5151461038c57806344e46dff146103aa5780634563f30a146103c6576101da565b806323b872dd146102e45780632c4e722e146103145780632eb4a7ab1461033257806330adf81f14610350576101da565b80630b0eee30116101b85780630b0eee301461025e5780630cf5e1561461027a578063103a34721461029657806318160ddd146102c6576101da565b806306fdde03146101df578063095ea7b3146101fd57806309e69ede1461022d575b600080fd5b6101e761061e565b6040516101f49190612ad8565b60405180910390f35b61021760048036038101906102129190612441565b6106ac565b6040516102249190612965565b60405180910390f35b6102476004803603810190610242919061215a565b61079e565b604051610255929190612bd5565b60405180910390f35b61027860048036038101906102739190612441565b6107c2565b005b610294600480360381019061028f919061251b565b6108b6565b005b6102b060048036038101906102ab91906124db565b6109be565b6040516102bd9190612bba565b60405180910390f35b6102ce6109e3565b6040516102db9190612bba565b60405180910390f35b6102fe60048036038101906102f991906121c7565b6109e9565b60405161030b9190612965565b60405180910390f35b61031c610a4f565b6040516103299190612bba565b60405180910390f35b61033a610a55565b6040516103479190612980565b60405180910390f35b610358610a5b565b6040516103659190612980565b60405180910390f35b610376610a7f565b6040516103839190612c35565b60405180910390f35b610394610aa3565b6040516103a19190612980565b60405180910390f35b6103c460048036038101906103bf9190612481565b610b00565b005b6103ce610bad565b6040516103db9190612965565b60405180910390f35b6103ec610bc0565b6040516103f9919061287b565b60405180910390f35b61041c6004803603810190610417919061215a565b610be6565b6040516104299190612bba565b60405180910390f35b61044c6004803603810190610447919061215a565b610bfe565b6040516104599190612bba565b60405180910390f35b61047c6004803603810190610477919061215a565b610c16565b005b610486610e85565b6040516104939190612ad8565b60405180910390f35b6104b660048036038101906104b191906122b4565b610f13565b6040516104c39190612bba565b60405180910390f35b6104d4611072565b6040516104e19190612bba565b60405180910390f35b61050460048036038101906104ff9190612441565b611078565b6040516105119190612965565b60405180910390f35b6105226110dc565b60405161052f9190612abd565b60405180910390f35b610552600480360381019061054d919061255b565b611100565b60405161055f9190612980565b60405180910390f35b610582600480360381019061057d919061221a565b611124565b60405161058f9190612bba565b60405180910390f35b6105b260048036038101906105ad919061239f565b611141565b005b6105ce60048036038101906105c99190612187565b611440565b6040516105db9190612bba565b60405180910390f35b6105ec611465565b6040516105f99190612abd565b60405180910390f35b61061c6004803603810190610617919061215a565b611489565b005b6000805461062b90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461065790612e74565b80156106a45780601f10610679576101008083540402835291602001916106a4565b820191906000526020600020905b81548152906001019060200180831161068757829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161078c9190612bba565b60405180910390a36001905092915050565b600c6020528060005260406000206000915090508060000154908060010154905082565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084990612b5a565b60405180910390fd5b80600a60008282546108649190612c97565b925050819055506108758282611594565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8282600a546040516108aa9392919061292e565b60405180910390a15050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612b5a565b60405180910390fd5b600882908060018154018082558091505060019003906000526020600020016000909190919091505581600781905550806009819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b506007546009546040516109b2929190612a4f565b60405180910390a15050565b600d602052816000526040600020602052806000526040600020600091509150505481565b60025481565b6000600b60009054906101000a900460ff1615610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612afa565b60405180910390fd5b610a46848484611664565b90509392505050565b60095481565b60075481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000004614610ad957610ad46118ae565b610afb565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612b5a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90612b5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d43573d6000803e3d6000fd5b50610e82565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dc1919061287b565b60206040518083038186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612588565b6040518363ffffffff1660e01b8152600401610e2e929190612905565b602060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8091906124ae565b505b50565b60018054610e9290612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90612e74565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29190612ad8565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b81526004016110219796959493929190612896565b600060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050611062338c8c8c8c8c8c61193a565b90509a9950505050505050505050565b600a5481565b6000600b60009054906101000a900460ff16156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612afa565b60405180910390fd5b6110d48383611dae565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6008818154811061111057600080fd5b906000526020600020016000915090505481565b60006111353388888888888861193a565b90509695505050505050565b42841015611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612b9a565b60405180910390fd5b600061118e610aa3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016112169695949392919061299b565b6040516020818303038152906040528051906020012060405160200161123d929190612844565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161127a9493929190612a78565b6020604051602081039080840390855afa15801561129c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561131057508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612b7a565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161142f9190612bba565b60405180910390a350505050505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090612b5a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f81604051611589919061287b565b60405180910390a150565b80600260008282546115a69190612c97565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116589190612bba565b60405180910390a35050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179a5782816117199190612d78565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e99190612d78565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161189a9190612bba565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516118e0919061282d565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161191f9594939291906129fc565b60405160208183030381529060405280519060200120905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806119e157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f9190612ad8565b60405180910390fd5b50611acf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548988604051602001611ab4929190612801565b60405160208183030381529060405280519060200120611ec2565b611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0590612b1a565b60405180910390fd5b600084600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b6e9190612c97565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be29190612ad8565b60405180910390fd5b5080600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954670de0b6b3a764000086611c5a9190612d1e565b611c649190612ced565b91506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254611cbd9190612c97565b9250508190555082600a6000828254611cd69190612c97565b92505081905550611d2c8a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16611ed9909392919063ffffffff16565b611d368984611594565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600a54604051611d9993929190612bfe565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dff9190612d78565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eb09190612bba565b60405180910390a36001905092915050565b600082611ecf8584611f9c565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050611f5681612011565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90612b3a565b60405180910390fd5b5050505050565b60008082905060005b8451811015612006576000858281518110611fc357611fc2612fb4565b5b60200260200101519050808311611fe557611fde838261205a565b9250611ff2565b611fef818461205a565b92505b508080611ffe90612ea6565b915050611fa5565b508091505092915050565b60003d8261202357806000803e806000fd5b806020811461203d576000811461204e5760009250612053565b816000803e60005115159250612053565b600192505b5050919050565b600082600052816020526040600020905092915050565b60008135905061208081613139565b92915050565b60008083601f84011261209c5761209b612fe8565b5b8235905067ffffffffffffffff8111156120b9576120b8612fe3565b5b6020830191508360208202830111156120d5576120d4612fed565b5b9250929050565b6000813590506120eb81613150565b92915050565b60008151905061210081613150565b92915050565b60008135905061211581613167565b92915050565b60008135905061212a8161317e565b92915050565b60008151905061213f8161317e565b92915050565b60008135905061215481613195565b92915050565b6000602082840312156121705761216f612ff7565b5b600061217e84828501612071565b91505092915050565b6000806040838503121561219e5761219d612ff7565b5b60006121ac85828601612071565b92505060206121bd85828601612071565b9150509250929050565b6000806000606084860312156121e0576121df612ff7565b5b60006121ee86828701612071565b93505060206121ff86828701612071565b92505060406122108682870161211b565b9150509250925092565b60008060008060008060a0878903121561223757612236612ff7565b5b600061224589828a01612071565b965050602061225689828a01612071565b955050604061226789828a0161211b565b945050606061227889828a0161211b565b935050608087013567ffffffffffffffff81111561229957612298612ff2565b5b6122a589828a01612086565b92509250509295509295509295565b6000806000806000806000806000806101208b8d0312156122d8576122d7612ff7565b5b60006122e68d828e01612071565b9a505060206122f78d828e01612071565b99505060406123088d828e0161211b565b98505060606123198d828e0161211b565b97505060808b013567ffffffffffffffff81111561233a57612339612ff2565b5b6123468d828e01612086565b965096505060a06123598d828e0161211b565b94505060c061236a8d828e01612145565b93505060e061237b8d828e01612106565b92505061010061238d8d828e01612106565b9150509295989b9194979a5092959850565b600080600080600080600060e0888a0312156123be576123bd612ff7565b5b60006123cc8a828b01612071565b97505060206123dd8a828b01612071565b96505060406123ee8a828b0161211b565b95505060606123ff8a828b0161211b565b94505060806124108a828b01612145565b93505060a06124218a828b01612106565b92505060c06124328a828b01612106565b91505092959891949750929550565b6000806040838503121561245857612457612ff7565b5b600061246685828601612071565b92505060206124778582860161211b565b9150509250929050565b60006020828403121561249757612496612ff7565b5b60006124a5848285016120dc565b91505092915050565b6000602082840312156124c4576124c3612ff7565b5b60006124d2848285016120f1565b91505092915050565b600080604083850312156124f2576124f1612ff7565b5b600061250085828601612106565b925050602061251185828601612071565b9150509250929050565b6000806040838503121561253257612531612ff7565b5b600061254085828601612106565b92505060206125518582860161211b565b9150509250929050565b60006020828403121561257157612570612ff7565b5b600061257f8482850161211b565b91505092915050565b60006020828403121561259e5761259d612ff7565b5b60006125ac84828501612130565b91505092915050565b6125be81612dac565b82525050565b6125d56125d082612dac565b612eef565b82525050565b6125e481612dbe565b82525050565b6125f381612dca565b82525050565b61260a61260582612dca565b612f01565b82525050565b6000815461261d81612e74565b6126278186612c70565b94506001821660008114612642576001811461265357612686565b60ff19831686528186019350612686565b61265c85612c50565b60005b8381101561267e5781548189015260018201915060208101905061265f565b838801955050505b50505092915050565b61269881612e0b565b82525050565b60006126a982612c65565b6126b38185612c7b565b93506126c3818560208601612e41565b6126cc81612ffc565b840191505092915050565b60006126e4600683612c7b565b91506126ef8261301a565b602082019050919050565b6000612707600283612c8c565b915061271282613043565b600282019050919050565b600061272a600683612c7b565b91506127358261306c565b602082019050919050565b600061274d601483612c7b565b915061275882613095565b602082019050919050565b6000612770600883612c7b565b915061277b826130be565b602082019050919050565b6000612793600e83612c7b565b915061279e826130e7565b602082019050919050565b60006127b6601783612c7b565b91506127c182613110565b602082019050919050565b6127d581612df4565b82525050565b6127ec6127e782612df4565b612f1d565b82525050565b6127fb81612dfe565b82525050565b600061280d82856125c4565b60148201915061281d82846127db565b6020820191508190509392505050565b60006128398284612610565b915081905092915050565b600061284f826126fa565b915061285b82856125f9565b60208201915061286b82846125f9565b6020820191508190509392505050565b600060208201905061289060008301846125b5565b92915050565b600060e0820190506128ab600083018a6125b5565b6128b860208301896125b5565b6128c560408301886127cc565b6128d260608301876127cc565b6128df60808301866127f2565b6128ec60a08301856125ea565b6128f960c08301846125ea565b98975050505050505050565b600060408201905061291a60008301856125b5565b61292760208301846127cc565b9392505050565b600060608201905061294360008301866125b5565b61295060208301856127cc565b61295d60408301846127cc565b949350505050565b600060208201905061297a60008301846125db565b92915050565b600060208201905061299560008301846125ea565b92915050565b600060c0820190506129b060008301896125ea565b6129bd60208301886125b5565b6129ca60408301876125b5565b6129d760608301866127cc565b6129e460808301856127cc565b6129f160a08301846127cc565b979650505050505050565b600060a082019050612a1160008301886125ea565b612a1e60208301876125ea565b612a2b60408301866125ea565b612a3860608301856127cc565b612a4560808301846125b5565b9695505050505050565b6000604082019050612a6460008301856125ea565b612a7160208301846127cc565b9392505050565b6000608082019050612a8d60008301876125ea565b612a9a60208301866127f2565b612aa760408301856125ea565b612ab460608301846125ea565b95945050505050565b6000602082019050612ad2600083018461268f565b92915050565b60006020820190508181036000830152612af2818461269e565b905092915050565b60006020820190508181036000830152612b13816126d7565b9050919050565b60006020820190508181036000830152612b338161271d565b9050919050565b60006020820190508181036000830152612b5381612740565b9050919050565b60006020820190508181036000830152612b7381612763565b9050919050565b60006020820190508181036000830152612b9381612786565b9050919050565b60006020820190508181036000830152612bb3816127a9565b9050919050565b6000602082019050612bcf60008301846127cc565b92915050565b6000604082019050612bea60008301856127cc565b612bf760208301846127cc565b9392505050565b6000606082019050612c1360008301866127cc565b612c2060208301856127cc565b612c2d60408301846127cc565b949350505050565b6000602082019050612c4a60008301846127f2565b92915050565b60008190508160005260206000209050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ca282612df4565b9150612cad83612df4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ce257612ce1612f27565b5b828201905092915050565b6000612cf882612df4565b9150612d0383612df4565b925082612d1357612d12612f56565b5b828204905092915050565b6000612d2982612df4565b9150612d3483612df4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6d57612d6c612f27565b5b828202905092915050565b6000612d8382612df4565b9150612d8e83612df4565b925082821015612da157612da0612f27565b5b828203905092915050565b6000612db782612dd4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e1682612e1d565b9050919050565b6000612e2882612e2f565b9050919050565b6000612e3a82612dd4565b9050919050565b60005b83811015612e5f578082015181840152602081019050612e44565b83811115612e6e576000848401525b50505050565b60006002820490506001821680612e8c57607f821691505b60208210811415612ea057612e9f612f85565b5b50919050565b6000612eb182612df4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee457612ee3612f27565b5b600182019050919050565b6000612efa82612f0b565b9050919050565b6000819050919050565b6000612f168261300d565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b61314281612dac565b811461314d57600080fd5b50565b61315981612dbe565b811461316457600080fd5b50565b61317081612dca565b811461317b57600080fd5b50565b61318781612df4565b811461319257600080fd5b50565b61319e81612dfe565b81146131a957600080fd5b5056fea26469706673582212206dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806361d027b311610104578063a9059cbb116100a2578063d505accf11610071578063d505accf14610598578063dd62ed3e146105b4578063e0bab4c4146105e4578063f0f4426014610602576101da565b8063a9059cbb146104ea578063b0e4556f1461051a578063c2b40ae414610538578063c89380fd14610568576101da565b8063839006f2116100de578063839006f21461046257806395d89b411461047e57806396fb8b101461049c578063a2309ff8146104cc576101da565b806361d027b3146103e457806370a08231146104025780637ecebe0014610432576101da565b806323b872dd1161017c578063313ce5671161014b578063313ce5671461036e5780633644e5151461038c57806344e46dff146103aa5780634563f30a146103c6576101da565b806323b872dd146102e45780632c4e722e146103145780632eb4a7ab1461033257806330adf81f14610350576101da565b80630b0eee30116101b85780630b0eee301461025e5780630cf5e1561461027a578063103a34721461029657806318160ddd146102c6576101da565b806306fdde03146101df578063095ea7b3146101fd57806309e69ede1461022d575b600080fd5b6101e761061e565b6040516101f49190612ad8565b60405180910390f35b61021760048036038101906102129190612441565b6106ac565b6040516102249190612965565b60405180910390f35b6102476004803603810190610242919061215a565b61079e565b604051610255929190612bd5565b60405180910390f35b61027860048036038101906102739190612441565b6107c2565b005b610294600480360381019061028f919061251b565b6108b6565b005b6102b060048036038101906102ab91906124db565b6109be565b6040516102bd9190612bba565b60405180910390f35b6102ce6109e3565b6040516102db9190612bba565b60405180910390f35b6102fe60048036038101906102f991906121c7565b6109e9565b60405161030b9190612965565b60405180910390f35b61031c610a4f565b6040516103299190612bba565b60405180910390f35b61033a610a55565b6040516103479190612980565b60405180910390f35b610358610a5b565b6040516103659190612980565b60405180910390f35b610376610a7f565b6040516103839190612c35565b60405180910390f35b610394610aa3565b6040516103a19190612980565b60405180910390f35b6103c460048036038101906103bf9190612481565b610b00565b005b6103ce610bad565b6040516103db9190612965565b60405180910390f35b6103ec610bc0565b6040516103f9919061287b565b60405180910390f35b61041c6004803603810190610417919061215a565b610be6565b6040516104299190612bba565b60405180910390f35b61044c6004803603810190610447919061215a565b610bfe565b6040516104599190612bba565b60405180910390f35b61047c6004803603810190610477919061215a565b610c16565b005b610486610e85565b6040516104939190612ad8565b60405180910390f35b6104b660048036038101906104b191906122b4565b610f13565b6040516104c39190612bba565b60405180910390f35b6104d4611072565b6040516104e19190612bba565b60405180910390f35b61050460048036038101906104ff9190612441565b611078565b6040516105119190612965565b60405180910390f35b6105226110dc565b60405161052f9190612abd565b60405180910390f35b610552600480360381019061054d919061255b565b611100565b60405161055f9190612980565b60405180910390f35b610582600480360381019061057d919061221a565b611124565b60405161058f9190612bba565b60405180910390f35b6105b260048036038101906105ad919061239f565b611141565b005b6105ce60048036038101906105c99190612187565b611440565b6040516105db9190612bba565b60405180910390f35b6105ec611465565b6040516105f99190612abd565b60405180910390f35b61061c6004803603810190610617919061215a565b611489565b005b6000805461062b90612e74565b80601f016020809104026020016040519081016040528092919081815260200182805461065790612e74565b80156106a45780601f10610679576101008083540402835291602001916106a4565b820191906000526020600020905b81548152906001019060200180831161068757829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161078c9190612bba565b60405180910390a36001905092915050565b600c6020528060005260406000206000915090508060000154908060010154905082565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084990612b5a565b60405180910390fd5b80600a60008282546108649190612c97565b925050819055506108758282611594565b7fc5c33ab5e6467a87a001b77efc45aa27f6890b08565b99b7101becae3d82320e8282600a546040516108aa9392919061292e565b60405180910390a15050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d90612b5a565b60405180910390fd5b600882908060018154018082558091505060019003906000526020600020016000909190919091505581600781905550806009819055507fc9714d3f318877e8200732d0c1e80981c397cbde2518a4b32c68d9ba1eab3b506007546009546040516109b2929190612a4f565b60405180910390a15050565b600d602052816000526040600020602052806000526040600020600091509150505481565b60025481565b6000600b60009054906101000a900460ff1615610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612afa565b60405180910390fd5b610a46848484611664565b90509392505050565b60095481565b60075481565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f00000000000000000000000000000000000000000000000000000000000000014614610ad957610ad46118ae565b610afb565b7fcb81026912554fbc7fae772c56a86d9c6d281c43ba476b2fc42f89348cba7f515b905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790612b5a565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b600b60009054906101000a900460ff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90612b5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d43573d6000803e3d6000fd5b50610e82565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dc1919061287b565b60206040518083038186803b158015610dd957600080fd5b505afa158015610ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e119190612588565b6040518363ffffffff1660e01b8152600401610e2e929190612905565b602060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8091906124ae565b505b50565b60018054610e9290612e74565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90612e74565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505081565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd29190612ad8565b60405180910390fd5b508973ffffffffffffffffffffffffffffffffffffffff1663d505accf33308b898989896040518863ffffffff1660e01b81526004016110219796959493929190612896565b600060405180830381600087803b15801561103b57600080fd5b505af115801561104f573d6000803e3d6000fd5b50505050611062338c8c8c8c8c8c61193a565b90509a9950505050505050505050565b600a5481565b6000600b60009054906101000a900460ff16156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612afa565b60405180910390fd5b6110d48383611dae565b905092915050565b7f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b6008818154811061111057600080fd5b906000526020600020016000915090505481565b60006111353388888888888861193a565b90509695505050505050565b42841015611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612b9a565b60405180910390fd5b600061118e610aa3565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016112169695949392919061299b565b6040516020818303038152906040528051906020012060405160200161123d929190612844565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161127a9493929190612a78565b6020604051602081039080840390855afa15801561129c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561131057508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61134f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134690612b7a565b60405180910390fd5b86600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258760405161142f9190612bba565b60405180910390a350505050505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611519576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151090612b5a565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f81604051611589919061287b565b60405180910390a150565b80600260008282546115a69190612c97565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116589190612bba565b60405180910390a35050565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461179a5782816117199190612d78565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e99190612d78565b9250508190555082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161189a9190612bba565b60405180910390a360019150509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516118e0919061282d565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161191f9594939291906129fc565b60405160208183030381529060405280519060200120905090565b60007f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806119e157507f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600981526020017f21544f4b454e5f494e000000000000000000000000000000000000000000000081525090611a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4f9190612ad8565b60405180910390fd5b50611acf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548988604051602001611ab4929190612801565b60405160208183030381529060405280519060200120611ec2565b611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0590612b1a565b60405180910390fd5b600084600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b6e9190612c97565b9050858111156040518060400160405280600781526020017f21414d4f554e540000000000000000000000000000000000000000000000000081525090611beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be29190612ad8565b60405180910390fd5b5080600d6000600754815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954670de0b6b3a764000086611c5a9190612d1e565b611c649190612ced565b91506000600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905082816000016000828254611cbd9190612c97565b9250508190555082600a6000828254611cd69190612c97565b92505081905550611d2c8a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16888b73ffffffffffffffffffffffffffffffffffffffff16611ed9909392919063ffffffff16565b611d368984611594565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f68c721f9a38584842eb66945b43c95066397ce5f2576fcc0588471c85d209d0c8589600a54604051611d9993929190612bfe565b60405180910390a35050979650505050505050565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dff9190612d78565b9250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611eb09190612bba565b60405180910390a36001905092915050565b600082611ecf8584611f9c565b1490509392505050565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff8416602482015282604482015260008060648360008a5af1915050611f5681612011565b611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c90612b3a565b60405180910390fd5b5050505050565b60008082905060005b8451811015612006576000858281518110611fc357611fc2612fb4565b5b60200260200101519050808311611fe557611fde838261205a565b9250611ff2565b611fef818461205a565b92505b508080611ffe90612ea6565b915050611fa5565b508091505092915050565b60003d8261202357806000803e806000fd5b806020811461203d576000811461204e5760009250612053565b816000803e60005115159250612053565b600192505b5050919050565b600082600052816020526040600020905092915050565b60008135905061208081613139565b92915050565b60008083601f84011261209c5761209b612fe8565b5b8235905067ffffffffffffffff8111156120b9576120b8612fe3565b5b6020830191508360208202830111156120d5576120d4612fed565b5b9250929050565b6000813590506120eb81613150565b92915050565b60008151905061210081613150565b92915050565b60008135905061211581613167565b92915050565b60008135905061212a8161317e565b92915050565b60008151905061213f8161317e565b92915050565b60008135905061215481613195565b92915050565b6000602082840312156121705761216f612ff7565b5b600061217e84828501612071565b91505092915050565b6000806040838503121561219e5761219d612ff7565b5b60006121ac85828601612071565b92505060206121bd85828601612071565b9150509250929050565b6000806000606084860312156121e0576121df612ff7565b5b60006121ee86828701612071565b93505060206121ff86828701612071565b92505060406122108682870161211b565b9150509250925092565b60008060008060008060a0878903121561223757612236612ff7565b5b600061224589828a01612071565b965050602061225689828a01612071565b955050604061226789828a0161211b565b945050606061227889828a0161211b565b935050608087013567ffffffffffffffff81111561229957612298612ff2565b5b6122a589828a01612086565b92509250509295509295509295565b6000806000806000806000806000806101208b8d0312156122d8576122d7612ff7565b5b60006122e68d828e01612071565b9a505060206122f78d828e01612071565b99505060406123088d828e0161211b565b98505060606123198d828e0161211b565b97505060808b013567ffffffffffffffff81111561233a57612339612ff2565b5b6123468d828e01612086565b965096505060a06123598d828e0161211b565b94505060c061236a8d828e01612145565b93505060e061237b8d828e01612106565b92505061010061238d8d828e01612106565b9150509295989b9194979a5092959850565b600080600080600080600060e0888a0312156123be576123bd612ff7565b5b60006123cc8a828b01612071565b97505060206123dd8a828b01612071565b96505060406123ee8a828b0161211b565b95505060606123ff8a828b0161211b565b94505060806124108a828b01612145565b93505060a06124218a828b01612106565b92505060c06124328a828b01612106565b91505092959891949750929550565b6000806040838503121561245857612457612ff7565b5b600061246685828601612071565b92505060206124778582860161211b565b9150509250929050565b60006020828403121561249757612496612ff7565b5b60006124a5848285016120dc565b91505092915050565b6000602082840312156124c4576124c3612ff7565b5b60006124d2848285016120f1565b91505092915050565b600080604083850312156124f2576124f1612ff7565b5b600061250085828601612106565b925050602061251185828601612071565b9150509250929050565b6000806040838503121561253257612531612ff7565b5b600061254085828601612106565b92505060206125518582860161211b565b9150509250929050565b60006020828403121561257157612570612ff7565b5b600061257f8482850161211b565b91505092915050565b60006020828403121561259e5761259d612ff7565b5b60006125ac84828501612130565b91505092915050565b6125be81612dac565b82525050565b6125d56125d082612dac565b612eef565b82525050565b6125e481612dbe565b82525050565b6125f381612dca565b82525050565b61260a61260582612dca565b612f01565b82525050565b6000815461261d81612e74565b6126278186612c70565b94506001821660008114612642576001811461265357612686565b60ff19831686528186019350612686565b61265c85612c50565b60005b8381101561267e5781548189015260018201915060208101905061265f565b838801955050505b50505092915050565b61269881612e0b565b82525050565b60006126a982612c65565b6126b38185612c7b565b93506126c3818560208601612e41565b6126cc81612ffc565b840191505092915050565b60006126e4600683612c7b565b91506126ef8261301a565b602082019050919050565b6000612707600283612c8c565b915061271282613043565b600282019050919050565b600061272a600683612c7b565b91506127358261306c565b602082019050919050565b600061274d601483612c7b565b915061275882613095565b602082019050919050565b6000612770600883612c7b565b915061277b826130be565b602082019050919050565b6000612793600e83612c7b565b915061279e826130e7565b602082019050919050565b60006127b6601783612c7b565b91506127c182613110565b602082019050919050565b6127d581612df4565b82525050565b6127ec6127e782612df4565b612f1d565b82525050565b6127fb81612dfe565b82525050565b600061280d82856125c4565b60148201915061281d82846127db565b6020820191508190509392505050565b60006128398284612610565b915081905092915050565b600061284f826126fa565b915061285b82856125f9565b60208201915061286b82846125f9565b6020820191508190509392505050565b600060208201905061289060008301846125b5565b92915050565b600060e0820190506128ab600083018a6125b5565b6128b860208301896125b5565b6128c560408301886127cc565b6128d260608301876127cc565b6128df60808301866127f2565b6128ec60a08301856125ea565b6128f960c08301846125ea565b98975050505050505050565b600060408201905061291a60008301856125b5565b61292760208301846127cc565b9392505050565b600060608201905061294360008301866125b5565b61295060208301856127cc565b61295d60408301846127cc565b949350505050565b600060208201905061297a60008301846125db565b92915050565b600060208201905061299560008301846125ea565b92915050565b600060c0820190506129b060008301896125ea565b6129bd60208301886125b5565b6129ca60408301876125b5565b6129d760608301866127cc565b6129e460808301856127cc565b6129f160a08301846127cc565b979650505050505050565b600060a082019050612a1160008301886125ea565b612a1e60208301876125ea565b612a2b60408301866125ea565b612a3860608301856127cc565b612a4560808301846125b5565b9695505050505050565b6000604082019050612a6460008301856125ea565b612a7160208301846127cc565b9392505050565b6000608082019050612a8d60008301876125ea565b612a9a60208301866127f2565b612aa760408301856125ea565b612ab460608301846125ea565b95945050505050565b6000602082019050612ad2600083018461268f565b92915050565b60006020820190508181036000830152612af2818461269e565b905092915050565b60006020820190508181036000830152612b13816126d7565b9050919050565b60006020820190508181036000830152612b338161271d565b9050919050565b60006020820190508181036000830152612b5381612740565b9050919050565b60006020820190508181036000830152612b7381612763565b9050919050565b60006020820190508181036000830152612b9381612786565b9050919050565b60006020820190508181036000830152612bb3816127a9565b9050919050565b6000602082019050612bcf60008301846127cc565b92915050565b6000604082019050612bea60008301856127cc565b612bf760208301846127cc565b9392505050565b6000606082019050612c1360008301866127cc565b612c2060208301856127cc565b612c2d60408301846127cc565b949350505050565b6000602082019050612c4a60008301846127f2565b92915050565b60008190508160005260206000209050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ca282612df4565b9150612cad83612df4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ce257612ce1612f27565b5b828201905092915050565b6000612cf882612df4565b9150612d0383612df4565b925082612d1357612d12612f56565b5b828204905092915050565b6000612d2982612df4565b9150612d3483612df4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d6d57612d6c612f27565b5b828202905092915050565b6000612d8382612df4565b9150612d8e83612df4565b925082821015612da157612da0612f27565b5b828203905092915050565b6000612db782612dd4565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612e1682612e1d565b9050919050565b6000612e2882612e2f565b9050919050565b6000612e3a82612dd4565b9050919050565b60005b83811015612e5f578082015181840152602081019050612e44565b83811115612e6e576000848401525b50505050565b60006002820490506001821680612e8c57607f821691505b60208210811415612ea057612e9f612f85565b5b50919050565b6000612eb182612df4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ee457612ee3612f27565b5b600182019050919050565b6000612efa82612f0b565b9050919050565b6000819050919050565b6000612f168261300d565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5041555345440000000000000000000000000000000000000000000000000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f2150524f4f460000000000000000000000000000000000000000000000000000600082015250565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b7f21434f4e43415645000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b61314281612dac565b811461314d57600080fd5b50565b61315981612dbe565b811461316457600080fd5b50565b61317081612dca565b811461317b57600080fd5b50565b61318781612df4565b811461319257600080fd5b50565b61319e81612dfe565b81146131a957600080fd5b5056fea26469706673582212206dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c64736f6c63430008070033

Deployed Bytecode Sourcemap

14970:13502:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1044:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2680:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17670:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21356:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20746:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17999:67;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1328:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25388:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16671:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16487:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1679:146;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1100:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5138:179;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21760:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16962:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16350:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1363:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1946:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28236:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1071:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23785:705;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16783:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24787:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15623:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16580:22;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22653:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4107:1023;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1416:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15748:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20421:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1044:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2680:217::-;2754:4;2804:6;2771:9;:21;2781:10;2771:21;;;;;;;;;;;;;;;:30;2793:7;2771:30;;;;;;;;;;;;;;;:39;;;;2849:7;2828:37;;2837:10;2828:37;;;2858:6;2828:37;;;;;;:::i;:::-;;;;;;;;2885:4;2878:11;;2680:217;;;;:::o;17670:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21356:253::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;21478:6:::1;21463:11;;:21;;;;;;;:::i;:::-;;;;;;;;21526;21532:6;21540;21526:5;:21::i;:::-;21565:36;21573:6;21581;21589:11;;21565:36;;;;;;;;:::i;:::-;;;;;;;;21356:253:::0;;:::o;20746:360::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20919:5:::1;20930:11;20919:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20997:11;20984:10;:24;;;;21050:5;21043:4;:12;;;;21073:25;21082:10;;21093:4;;21073:25;;;;;;;:::i;:::-;;;;;;;;20746:360:::0;;:::o;17999:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1328:26::-;;;;:::o;25388:279::-;25519:4;25545:15;;;;;;;;;;;25544:16;25536:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;25623:36;25642:4;25648:2;25652:6;25623:18;:36::i;:::-;25616:43;;25388:279;;;;;:::o;16671:19::-;;;;:::o;16487:25::-;;;;:::o;1679:146::-;1730:95;1679:146;:::o;1100:31::-;;;:::o;5138:179::-;5195:7;5239:16;5222:13;:33;:87;;5285:24;:22;:24::i;:::-;5222:87;;;5258:24;5222:87;5215:94;;5138:179;:::o;21760:105::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;21851:6:::1;21833:15;;:24;;;;;;;;;;;;;;;;;;21760:105:::0;:::o;16962:27::-;;;;;;;;;;;;;:::o;16350:68::-;;;;;;;;;;;;;:::o;1363:44::-;;;;;;;;;;;;;;;;;:::o;1946:41::-;;;;;;;;;;;;;;;;;:::o;28236:233::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;28320:1:::1;28303:19;;:5;:19;;;28299:162;;;28332:8;;;;;;;;;;;28324:26;;:51;28352:21;28324:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;28299:162;;;28397:5;28391:21;;;28413:8;;;;;;;;;;;28429:5;28423:22;;;28454:4;28423:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28391:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28299:162;28236:233:::0;:::o;1071:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23785:705::-;24062:17;24164:3;24145:23;;:7;:23;;;24170:14;;;;;;;;;;;;;;;;;24137:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;24283:7;24277:21;;;24299:10;24319:4;24326:8;24336:14;24352:1;24355;24358;24277:83;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24420:62;24430:10;24442:2;24446:7;24455:9;24466:8;24476:5;;24420:9;:62::i;:::-;24413:69;;23785:705;;;;;;;;;;;;:::o;16783:26::-;;;;:::o;24787:242::-;24891:4;24917:15;;;;;;;;;;;24916:16;24908:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;24995:26;25010:2;25014:6;24995:14;:26::i;:::-;24988:33;;24787:242;;;;:::o;15623:79::-;;;:::o;16580:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22653:283::-;22829:17;22866:62;22876:10;22888:2;22892:7;22901:9;22912:8;22922:5;;22866:9;:62::i;:::-;22859:69;;22653:283;;;;;;;;:::o;4107:1023::-;4335:15;4323:8;:27;;4315:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4548:14;4665:18;:16;:18::i;:::-;1730:95;4744:5;4751:7;4760:5;4767:6;:13;4774:5;4767:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;4784:8;4716:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4706:88;;;;;;4593:220;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4565:263;;;;;;4548:280;;4845:24;4872:26;4882:6;4890:1;4893;4896;4872:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4845:53;;4951:1;4923:30;;:16;:30;;;;:59;;;;;4977:5;4957:25;;:16;:25;;;4923:59;4915:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;5057:5;5018:9;:27;5028:16;5018:27;;;;;;;;;;;;;;;:36;5046:7;5018:36;;;;;;;;;;;;;;;:44;;;;4523:551;;5107:7;5091:31;;5100:5;5091:31;;;5116:5;5091:31;;;;;;:::i;:::-;;;;;;;;4107:1023;;;;;;;:::o;1416:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15748:78::-;;;:::o;20421:156::-;20068:8;;;;;;;;;;;20054:22;;:10;:22;;;20046:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;20520:9:::1;20509:8;;:20;;;;;;;;;;;;;;;;;;20547:22;20559:9;20547:22;;;;;;:::i;:::-;;;;;;;;20421:156:::0;:::o;5982:335::-;6068:6;6053:11;;:21;;;;;;;:::i;:::-;;;;;;;;6242:6;6225:9;:13;6235:2;6225:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;6298:2;6277:32;;6294:1;6277:32;;;6302:6;6277:32;;;;;;:::i;:::-;;;;;;;;5982:335;;:::o;3298:612::-;3420:4;3437:15;3455:9;:15;3465:4;3455:15;;;;;;;;;;;;;;;:27;3471:10;3455:27;;;;;;;;;;;;;;;;3437:45;;3546:17;3535:7;:28;3531:80;;3605:6;3595:7;:16;;;;:::i;:::-;3565:9;:15;3575:4;3565:15;;;;;;;;;;;;;;;:27;3581:10;3565:27;;;;;;;;;;;;;;;:46;;;;3531:80;3643:6;3624:9;:15;3634:4;3624:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;3817:6;3800:9;:13;3810:2;3800:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;3867:2;3852:26;;3861:4;3852:26;;;3871:6;3852:26;;;;;;:::i;:::-;;;;;;;;3898:4;3891:11;;;3298:612;;;;;:::o;5325:457::-;5390:7;5491:95;5625:4;5609:22;;;;;;:::i;:::-;;;;;;;;5654:14;5691:13;5735:4;5458:301;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5430:344;;;;;;5410:364;;5325:457;:::o;26487:1595::-;26692:17;26809:3;26790:23;;:7;:23;;;:51;;;;26836:4;26817:24;;:7;:24;;;26790:51;26843:14;;;;;;;;;;;;;;;;;26782:76;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26966:81;26985:5;;26966:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26992:10;;27031:2;27035:9;27014:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27004:42;;;;;;26966:18;:81::i;:::-;26958:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27142:17;27193:8;27162:12;:24;27175:10;;27162:24;;;;;;;;;;;:28;27187:2;27162:28;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;27142:59;;27245:9;27232;:22;;27256:12;;;;;;;;;;;;;;;;;27224:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;27311:9;27280:12;:24;27293:10;;27280:24;;;;;;;;;;;:28;27305:2;27280:28;;;;;;;;;;;;;;;:40;;;;27437:4;;27430;27419:8;:15;;;;:::i;:::-;:22;;;;:::i;:::-;27407:34;;27500:31;27534:12;:16;27547:2;27534:16;;;;;;;;;;;;;;;27500:50;;27669:9;27644:11;:21;;;:34;;;;;;;:::i;:::-;;;;;;;;27774:9;27759:11;;:24;;;;;;;:::i;:::-;;;;;;;;27863:59;27895:6;27903:8;;;;;;;;;;;27913;27869:7;27863:31;;;;:59;;;;;;:::i;:::-;27984:20;27990:2;27994:9;27984:5;:20::i;:::-;28037:2;28022:52;;28029:6;28022:52;;;28041:9;28052:8;28062:11;;28022:52;;;;;;;;:::i;:::-;;;;;;;;26711:1371;;26487:1595;;;;;;;;;:::o;2905:385::-;2975:4;3017:6;2992:9;:21;3002:10;2992:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;3191:6;3174:9;:13;3184:2;3174:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;3247:2;3226:32;;3235:10;3226:32;;;3251:6;3226:32;;;;;;:::i;:::-;;;;;;;;3278:4;3271:11;;2905:385;;;;:::o;13262:190::-;13387:4;13440;13411:25;13424:5;13431:4;13411:12;:25::i;:::-;:33;13404:40;;13262:190;;;;;:::o;7863:1242::-;8007:15;8141:4;8135:11;8261:66;8242:17;8235:93;8423:42;8417:4;8413:53;8409:1;8390:17;8386:25;8379:88;8564:42;8560:2;8556:51;8551:2;8532:17;8528:26;8521:87;8695:6;8690:2;8671:17;8667:26;8660:42;8995:1;8992;8987:3;8968:17;8965:1;8958:5;8951;8946:51;8932:65;;8044:964;9028:44;9061:10;9028:32;:44::i;:::-;9020:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;7996:1109;7863:1242;;;;:::o;13814:675::-;13897:7;13917:20;13940:4;13917:27;;13960:9;13955:497;13979:5;:12;13975:1;:16;13955:497;;;14013:20;14036:5;14042:1;14036:8;;;;;;;;:::i;:::-;;;;;;;;14013:31;;14079:12;14063;:28;14059:382;;14206:42;14221:12;14235;14206:14;:42::i;:::-;14191:57;;14059:382;;;14383:42;14398:12;14412;14383:14;:42::i;:::-;14368:57;;14059:382;13998:454;13993:3;;;;;:::i;:::-;;;;13955:497;;;;14469:12;14462:19;;;13814:675;;;;:::o;11448:1072::-;11529:12;11654:16;11734:10;11724:244;;11843:14;11840:1;11837;11822:36;11938:14;11935:1;11928:25;11724:244;11991:14;12024:2;12019:248;;;;12286:1;12281:99;;;;12486:1;12475:12;;11984:518;;12019:248;12121:14;12118:1;12115;12100:36;12248:1;12242:8;12235:16;12228:24;12217:35;;12019:248;;12281:99;12364:1;12353:12;;11984:518;;11563:950;11448:1072;;;:::o;14497:224::-;14565:13;14628:1;14622:4;14615:15;14657:1;14651:4;14644:15;14698:4;14692;14682:21;14673:30;;14497:224;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;169:568::-;242:8;252:6;302:3;295:4;287:6;283:17;279:27;269:122;;310:79;;:::i;:::-;269:122;423:6;410:20;400:30;;453:18;445:6;442:30;439:117;;;475:79;;:::i;:::-;439:117;589:4;581:6;577:17;565:29;;643:3;635:4;627:6;623:17;613:8;609:32;606:41;603:128;;;650:79;;:::i;:::-;603:128;169:568;;;;;:::o;743:133::-;786:5;824:6;811:20;802:29;;840:30;864:5;840:30;:::i;:::-;743:133;;;;:::o;882:137::-;936:5;967:6;961:13;952:22;;983:30;1007:5;983:30;:::i;:::-;882:137;;;;:::o;1025:139::-;1071:5;1109:6;1096:20;1087:29;;1125:33;1152:5;1125:33;:::i;:::-;1025:139;;;;:::o;1170:::-;1216:5;1254:6;1241:20;1232:29;;1270:33;1297:5;1270:33;:::i;:::-;1170:139;;;;:::o;1315:143::-;1372:5;1403:6;1397:13;1388:22;;1419:33;1446:5;1419:33;:::i;:::-;1315:143;;;;:::o;1464:135::-;1508:5;1546:6;1533:20;1524:29;;1562:31;1587:5;1562:31;:::i;:::-;1464:135;;;;:::o;1605:329::-;1664:6;1713:2;1701:9;1692:7;1688:23;1684:32;1681:119;;;1719:79;;:::i;:::-;1681:119;1839:1;1864:53;1909:7;1900:6;1889:9;1885:22;1864:53;:::i;:::-;1854:63;;1810:117;1605:329;;;;:::o;1940:474::-;2008:6;2016;2065:2;2053:9;2044:7;2040:23;2036:32;2033:119;;;2071:79;;:::i;:::-;2033:119;2191:1;2216:53;2261:7;2252:6;2241:9;2237:22;2216:53;:::i;:::-;2206:63;;2162:117;2318:2;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2289:118;1940:474;;;;;:::o;2420:619::-;2497:6;2505;2513;2562:2;2550:9;2541:7;2537:23;2533:32;2530:119;;;2568:79;;:::i;:::-;2530:119;2688:1;2713:53;2758:7;2749:6;2738:9;2734:22;2713:53;:::i;:::-;2703:63;;2659:117;2815:2;2841:53;2886:7;2877:6;2866:9;2862:22;2841:53;:::i;:::-;2831:63;;2786:118;2943:2;2969:53;3014:7;3005:6;2994:9;2990:22;2969:53;:::i;:::-;2959:63;;2914:118;2420:619;;;;;:::o;3045:1141::-;3167:6;3175;3183;3191;3199;3207;3256:3;3244:9;3235:7;3231:23;3227:33;3224:120;;;3263:79;;:::i;:::-;3224:120;3383:1;3408:53;3453:7;3444:6;3433:9;3429:22;3408:53;:::i;:::-;3398:63;;3354:117;3510:2;3536:53;3581:7;3572:6;3561:9;3557:22;3536:53;:::i;:::-;3526:63;;3481:118;3638:2;3664:53;3709:7;3700:6;3689:9;3685:22;3664:53;:::i;:::-;3654:63;;3609:118;3766:2;3792:53;3837:7;3828:6;3817:9;3813:22;3792:53;:::i;:::-;3782:63;;3737:118;3922:3;3911:9;3907:19;3894:33;3954:18;3946:6;3943:30;3940:117;;;3976:79;;:::i;:::-;3940:117;4089:80;4161:7;4152:6;4141:9;4137:22;4089:80;:::i;:::-;4071:98;;;;3865:314;3045:1141;;;;;;;;:::o;4192:1721::-;4348:6;4356;4364;4372;4380;4388;4396;4404;4412;4420;4469:3;4457:9;4448:7;4444:23;4440:33;4437:120;;;4476:79;;:::i;:::-;4437:120;4596:1;4621:53;4666:7;4657:6;4646:9;4642:22;4621:53;:::i;:::-;4611:63;;4567:117;4723:2;4749:53;4794:7;4785:6;4774:9;4770:22;4749:53;:::i;:::-;4739:63;;4694:118;4851:2;4877:53;4922:7;4913:6;4902:9;4898:22;4877:53;:::i;:::-;4867:63;;4822:118;4979:2;5005:53;5050:7;5041:6;5030:9;5026:22;5005:53;:::i;:::-;4995:63;;4950:118;5135:3;5124:9;5120:19;5107:33;5167:18;5159:6;5156:30;5153:117;;;5189:79;;:::i;:::-;5153:117;5302:80;5374:7;5365:6;5354:9;5350:22;5302:80;:::i;:::-;5284:98;;;;5078:314;5431:3;5458:53;5503:7;5494:6;5483:9;5479:22;5458:53;:::i;:::-;5448:63;;5402:119;5560:3;5587:51;5630:7;5621:6;5610:9;5606:22;5587:51;:::i;:::-;5577:61;;5531:117;5687:3;5714:53;5759:7;5750:6;5739:9;5735:22;5714:53;:::i;:::-;5704:63;;5658:119;5816:3;5843:53;5888:7;5879:6;5868:9;5864:22;5843:53;:::i;:::-;5833:63;;5787:119;4192:1721;;;;;;;;;;;;;:::o;5919:1199::-;6030:6;6038;6046;6054;6062;6070;6078;6127:3;6115:9;6106:7;6102:23;6098:33;6095:120;;;6134:79;;:::i;:::-;6095:120;6254:1;6279:53;6324:7;6315:6;6304:9;6300:22;6279:53;:::i;:::-;6269:63;;6225:117;6381:2;6407:53;6452:7;6443:6;6432:9;6428:22;6407:53;:::i;:::-;6397:63;;6352:118;6509:2;6535:53;6580:7;6571:6;6560:9;6556:22;6535:53;:::i;:::-;6525:63;;6480:118;6637:2;6663:53;6708:7;6699:6;6688:9;6684:22;6663:53;:::i;:::-;6653:63;;6608:118;6765:3;6792:51;6835:7;6826:6;6815:9;6811:22;6792:51;:::i;:::-;6782:61;;6736:117;6892:3;6919:53;6964:7;6955:6;6944:9;6940:22;6919:53;:::i;:::-;6909:63;;6863:119;7021:3;7048:53;7093:7;7084:6;7073:9;7069:22;7048:53;:::i;:::-;7038:63;;6992:119;5919:1199;;;;;;;;;;:::o;7124:474::-;7192:6;7200;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7375:1;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7346:117;7502:2;7528:53;7573:7;7564:6;7553:9;7549:22;7528:53;:::i;:::-;7518:63;;7473:118;7124:474;;;;;:::o;7604:323::-;7660:6;7709:2;7697:9;7688:7;7684:23;7680:32;7677:119;;;7715:79;;:::i;:::-;7677:119;7835:1;7860:50;7902:7;7893:6;7882:9;7878:22;7860:50;:::i;:::-;7850:60;;7806:114;7604:323;;;;:::o;7933:345::-;8000:6;8049:2;8037:9;8028:7;8024:23;8020:32;8017:119;;;8055:79;;:::i;:::-;8017:119;8175:1;8200:61;8253:7;8244:6;8233:9;8229:22;8200:61;:::i;:::-;8190:71;;8146:125;7933:345;;;;:::o;8284:474::-;8352:6;8360;8409:2;8397:9;8388:7;8384:23;8380:32;8377:119;;;8415:79;;:::i;:::-;8377:119;8535:1;8560:53;8605:7;8596:6;8585:9;8581:22;8560:53;:::i;:::-;8550:63;;8506:117;8662:2;8688:53;8733:7;8724:6;8713:9;8709:22;8688:53;:::i;:::-;8678:63;;8633:118;8284:474;;;;;:::o;8764:::-;8832:6;8840;8889:2;8877:9;8868:7;8864:23;8860:32;8857:119;;;8895:79;;:::i;:::-;8857:119;9015:1;9040:53;9085:7;9076:6;9065:9;9061:22;9040:53;:::i;:::-;9030:63;;8986:117;9142:2;9168:53;9213:7;9204:6;9193:9;9189:22;9168:53;:::i;:::-;9158:63;;9113:118;8764:474;;;;;:::o;9244:329::-;9303:6;9352:2;9340:9;9331:7;9327:23;9323:32;9320:119;;;9358:79;;:::i;:::-;9320:119;9478:1;9503:53;9548:7;9539:6;9528:9;9524:22;9503:53;:::i;:::-;9493:63;;9449:117;9244:329;;;;:::o;9579:351::-;9649:6;9698:2;9686:9;9677:7;9673:23;9669:32;9666:119;;;9704:79;;:::i;:::-;9666:119;9824:1;9849:64;9905:7;9896:6;9885:9;9881:22;9849:64;:::i;:::-;9839:74;;9795:128;9579:351;;;;:::o;9936:118::-;10023:24;10041:5;10023:24;:::i;:::-;10018:3;10011:37;9936:118;;:::o;10060:157::-;10165:45;10185:24;10203:5;10185:24;:::i;:::-;10165:45;:::i;:::-;10160:3;10153:58;10060:157;;:::o;10223:109::-;10304:21;10319:5;10304:21;:::i;:::-;10299:3;10292:34;10223:109;;:::o;10338:118::-;10425:24;10443:5;10425:24;:::i;:::-;10420:3;10413:37;10338:118;;:::o;10462:157::-;10567:45;10587:24;10605:5;10587:24;:::i;:::-;10567:45;:::i;:::-;10562:3;10555:58;10462:157;;:::o;10647:849::-;10752:3;10789:5;10783:12;10818:36;10844:9;10818:36;:::i;:::-;10870:88;10951:6;10946:3;10870:88;:::i;:::-;10863:95;;10989:1;10978:9;10974:17;11005:1;11000:137;;;;11151:1;11146:344;;;;10967:523;;11000:137;11084:4;11080:9;11069;11065:25;11060:3;11053:38;11120:6;11115:3;11111:16;11104:23;;11000:137;;11146:344;11213:41;11248:5;11213:41;:::i;:::-;11276:1;11290:154;11304:6;11301:1;11298:13;11290:154;;;11378:7;11372:14;11368:1;11363:3;11359:11;11352:35;11428:1;11419:7;11415:15;11404:26;;11326:4;11323:1;11319:12;11314:17;;11290:154;;;11473:6;11468:3;11464:16;11457:23;;11153:337;;10967:523;;10756:740;;10647:849;;;;:::o;11502:157::-;11602:50;11646:5;11602:50;:::i;:::-;11597:3;11590:63;11502:157;;:::o;11665:364::-;11753:3;11781:39;11814:5;11781:39;:::i;:::-;11836:71;11900:6;11895:3;11836:71;:::i;:::-;11829:78;;11916:52;11961:6;11956:3;11949:4;11942:5;11938:16;11916:52;:::i;:::-;11993:29;12015:6;11993:29;:::i;:::-;11988:3;11984:39;11977:46;;11757:272;11665:364;;;;:::o;12035:365::-;12177:3;12198:66;12262:1;12257:3;12198:66;:::i;:::-;12191:73;;12273:93;12362:3;12273:93;:::i;:::-;12391:2;12386:3;12382:12;12375:19;;12035:365;;;:::o;12406:400::-;12566:3;12587:84;12669:1;12664:3;12587:84;:::i;:::-;12580:91;;12680:93;12769:3;12680:93;:::i;:::-;12798:1;12793:3;12789:11;12782:18;;12406:400;;;:::o;12812:365::-;12954:3;12975:66;13039:1;13034:3;12975:66;:::i;:::-;12968:73;;13050:93;13139:3;13050:93;:::i;:::-;13168:2;13163:3;13159:12;13152:19;;12812:365;;;:::o;13183:366::-;13325:3;13346:67;13410:2;13405:3;13346:67;:::i;:::-;13339:74;;13422:93;13511:3;13422:93;:::i;:::-;13540:2;13535:3;13531:12;13524:19;;13183:366;;;:::o;13555:365::-;13697:3;13718:66;13782:1;13777:3;13718:66;:::i;:::-;13711:73;;13793:93;13882:3;13793:93;:::i;:::-;13911:2;13906:3;13902:12;13895:19;;13555:365;;;:::o;13926:366::-;14068:3;14089:67;14153:2;14148:3;14089:67;:::i;:::-;14082:74;;14165:93;14254:3;14165:93;:::i;:::-;14283:2;14278:3;14274:12;14267:19;;13926:366;;;:::o;14298:::-;14440:3;14461:67;14525:2;14520:3;14461:67;:::i;:::-;14454:74;;14537:93;14626:3;14537:93;:::i;:::-;14655:2;14650:3;14646:12;14639:19;;14298:366;;;:::o;14670:118::-;14757:24;14775:5;14757:24;:::i;:::-;14752:3;14745:37;14670:118;;:::o;14794:157::-;14899:45;14919:24;14937:5;14919:24;:::i;:::-;14899:45;:::i;:::-;14894:3;14887:58;14794:157;;:::o;14957:112::-;15040:22;15056:5;15040:22;:::i;:::-;15035:3;15028:35;14957:112;;:::o;15075:397::-;15215:3;15230:75;15301:3;15292:6;15230:75;:::i;:::-;15330:2;15325:3;15321:12;15314:19;;15343:75;15414:3;15405:6;15343:75;:::i;:::-;15443:2;15438:3;15434:12;15427:19;;15463:3;15456:10;;15075:397;;;;;:::o;15478:273::-;15609:3;15631:94;15721:3;15712:6;15631:94;:::i;:::-;15624:101;;15742:3;15735:10;;15478:273;;;;:::o;15757:663::-;15998:3;16020:148;16164:3;16020:148;:::i;:::-;16013:155;;16178:75;16249:3;16240:6;16178:75;:::i;:::-;16278:2;16273:3;16269:12;16262:19;;16291:75;16362:3;16353:6;16291:75;:::i;:::-;16391:2;16386:3;16382:12;16375:19;;16411:3;16404:10;;15757:663;;;;;:::o;16426:222::-;16519:4;16557:2;16546:9;16542:18;16534:26;;16570:71;16638:1;16627:9;16623:17;16614:6;16570:71;:::i;:::-;16426:222;;;;:::o;16654:878::-;16911:4;16949:3;16938:9;16934:19;16926:27;;16963:71;17031:1;17020:9;17016:17;17007:6;16963:71;:::i;:::-;17044:72;17112:2;17101:9;17097:18;17088:6;17044:72;:::i;:::-;17126;17194:2;17183:9;17179:18;17170:6;17126:72;:::i;:::-;17208;17276:2;17265:9;17261:18;17252:6;17208:72;:::i;:::-;17290:69;17354:3;17343:9;17339:19;17330:6;17290:69;:::i;:::-;17369:73;17437:3;17426:9;17422:19;17413:6;17369:73;:::i;:::-;17452;17520:3;17509:9;17505:19;17496:6;17452:73;:::i;:::-;16654:878;;;;;;;;;;:::o;17538:332::-;17659:4;17697:2;17686:9;17682:18;17674:26;;17710:71;17778:1;17767:9;17763:17;17754:6;17710:71;:::i;:::-;17791:72;17859:2;17848:9;17844:18;17835:6;17791:72;:::i;:::-;17538:332;;;;;:::o;17876:442::-;18025:4;18063:2;18052:9;18048:18;18040:26;;18076:71;18144:1;18133:9;18129:17;18120:6;18076:71;:::i;:::-;18157:72;18225:2;18214:9;18210:18;18201:6;18157:72;:::i;:::-;18239;18307:2;18296:9;18292:18;18283:6;18239:72;:::i;:::-;17876:442;;;;;;:::o;18324:210::-;18411:4;18449:2;18438:9;18434:18;18426:26;;18462:65;18524:1;18513:9;18509:17;18500:6;18462:65;:::i;:::-;18324:210;;;;:::o;18540:222::-;18633:4;18671:2;18660:9;18656:18;18648:26;;18684:71;18752:1;18741:9;18737:17;18728:6;18684:71;:::i;:::-;18540:222;;;;:::o;18768:775::-;19001:4;19039:3;19028:9;19024:19;19016:27;;19053:71;19121:1;19110:9;19106:17;19097:6;19053:71;:::i;:::-;19134:72;19202:2;19191:9;19187:18;19178:6;19134:72;:::i;:::-;19216;19284:2;19273:9;19269:18;19260:6;19216:72;:::i;:::-;19298;19366:2;19355:9;19351:18;19342:6;19298:72;:::i;:::-;19380:73;19448:3;19437:9;19433:19;19424:6;19380:73;:::i;:::-;19463;19531:3;19520:9;19516:19;19507:6;19463:73;:::i;:::-;18768:775;;;;;;;;;:::o;19549:664::-;19754:4;19792:3;19781:9;19777:19;19769:27;;19806:71;19874:1;19863:9;19859:17;19850:6;19806:71;:::i;:::-;19887:72;19955:2;19944:9;19940:18;19931:6;19887:72;:::i;:::-;19969;20037:2;20026:9;20022:18;20013:6;19969:72;:::i;:::-;20051;20119:2;20108:9;20104:18;20095:6;20051:72;:::i;:::-;20133:73;20201:3;20190:9;20186:19;20177:6;20133:73;:::i;:::-;19549:664;;;;;;;;:::o;20219:332::-;20340:4;20378:2;20367:9;20363:18;20355:26;;20391:71;20459:1;20448:9;20444:17;20435:6;20391:71;:::i;:::-;20472:72;20540:2;20529:9;20525:18;20516:6;20472:72;:::i;:::-;20219:332;;;;;:::o;20557:545::-;20730:4;20768:3;20757:9;20753:19;20745:27;;20782:71;20850:1;20839:9;20835:17;20826:6;20782:71;:::i;:::-;20863:68;20927:2;20916:9;20912:18;20903:6;20863:68;:::i;:::-;20941:72;21009:2;20998:9;20994:18;20985:6;20941:72;:::i;:::-;21023;21091:2;21080:9;21076:18;21067:6;21023:72;:::i;:::-;20557:545;;;;;;;:::o;21108:248::-;21214:4;21252:2;21241:9;21237:18;21229:26;;21265:84;21346:1;21335:9;21331:17;21322:6;21265:84;:::i;:::-;21108:248;;;;:::o;21362:313::-;21475:4;21513:2;21502:9;21498:18;21490:26;;21562:9;21556:4;21552:20;21548:1;21537:9;21533:17;21526:47;21590:78;21663:4;21654:6;21590:78;:::i;:::-;21582:86;;21362:313;;;;:::o;21681:419::-;21847:4;21885:2;21874:9;21870:18;21862:26;;21934:9;21928:4;21924:20;21920:1;21909:9;21905:17;21898:47;21962:131;22088:4;21962:131;:::i;:::-;21954:139;;21681:419;;;:::o;22106:::-;22272:4;22310:2;22299:9;22295:18;22287:26;;22359:9;22353:4;22349:20;22345:1;22334:9;22330:17;22323:47;22387:131;22513:4;22387:131;:::i;:::-;22379:139;;22106:419;;;:::o;22531:::-;22697:4;22735:2;22724:9;22720:18;22712:26;;22784:9;22778:4;22774:20;22770:1;22759:9;22755:17;22748:47;22812:131;22938:4;22812:131;:::i;:::-;22804:139;;22531:419;;;:::o;22956:::-;23122:4;23160:2;23149:9;23145:18;23137:26;;23209:9;23203:4;23199:20;23195:1;23184:9;23180:17;23173:47;23237:131;23363:4;23237:131;:::i;:::-;23229:139;;22956:419;;;:::o;23381:::-;23547:4;23585:2;23574:9;23570:18;23562:26;;23634:9;23628:4;23624:20;23620:1;23609:9;23605:17;23598:47;23662:131;23788:4;23662:131;:::i;:::-;23654:139;;23381:419;;;:::o;23806:::-;23972:4;24010:2;23999:9;23995:18;23987:26;;24059:9;24053:4;24049:20;24045:1;24034:9;24030:17;24023:47;24087:131;24213:4;24087:131;:::i;:::-;24079:139;;23806:419;;;:::o;24231:222::-;24324:4;24362:2;24351:9;24347:18;24339:26;;24375:71;24443:1;24432:9;24428:17;24419:6;24375:71;:::i;:::-;24231:222;;;;:::o;24459:332::-;24580:4;24618:2;24607:9;24603:18;24595:26;;24631:71;24699:1;24688:9;24684:17;24675:6;24631:71;:::i;:::-;24712:72;24780:2;24769:9;24765:18;24756:6;24712:72;:::i;:::-;24459:332;;;;;:::o;24797:442::-;24946:4;24984:2;24973:9;24969:18;24961:26;;24997:71;25065:1;25054:9;25050:17;25041:6;24997:71;:::i;:::-;25078:72;25146:2;25135:9;25131:18;25122:6;25078:72;:::i;:::-;25160;25228:2;25217:9;25213:18;25204:6;25160:72;:::i;:::-;24797:442;;;;;;:::o;25245:214::-;25334:4;25372:2;25361:9;25357:18;25349:26;;25385:67;25449:1;25438:9;25434:17;25425:6;25385:67;:::i;:::-;25245:214;;;;:::o;25546:144::-;25598:4;25621:3;25613:11;;25644:3;25641:1;25634:14;25678:4;25675:1;25665:18;25657:26;;25546:144;;;:::o;25696:99::-;25748:6;25782:5;25776:12;25766:22;;25696:99;;;:::o;25801:147::-;25902:11;25939:3;25924:18;;25801:147;;;;:::o;25954:169::-;26038:11;26072:6;26067:3;26060:19;26112:4;26107:3;26103:14;26088:29;;25954:169;;;;:::o;26129:148::-;26231:11;26268:3;26253:18;;26129:148;;;;:::o;26283:305::-;26323:3;26342:20;26360:1;26342:20;:::i;:::-;26337:25;;26376:20;26394:1;26376:20;:::i;:::-;26371:25;;26530:1;26462:66;26458:74;26455:1;26452:81;26449:107;;;26536:18;;:::i;:::-;26449:107;26580:1;26577;26573:9;26566:16;;26283:305;;;;:::o;26594:185::-;26634:1;26651:20;26669:1;26651:20;:::i;:::-;26646:25;;26685:20;26703:1;26685:20;:::i;:::-;26680:25;;26724:1;26714:35;;26729:18;;:::i;:::-;26714:35;26771:1;26768;26764:9;26759:14;;26594:185;;;;:::o;26785:348::-;26825:7;26848:20;26866:1;26848:20;:::i;:::-;26843:25;;26882:20;26900:1;26882:20;:::i;:::-;26877:25;;27070:1;27002:66;26998:74;26995:1;26992:81;26987:1;26980:9;26973:17;26969:105;26966:131;;;27077:18;;:::i;:::-;26966:131;27125:1;27122;27118:9;27107:20;;26785:348;;;;:::o;27139:191::-;27179:4;27199:20;27217:1;27199:20;:::i;:::-;27194:25;;27233:20;27251:1;27233:20;:::i;:::-;27228:25;;27272:1;27269;27266:8;27263:34;;;27277:18;;:::i;:::-;27263:34;27322:1;27319;27315:9;27307:17;;27139:191;;;;:::o;27336:96::-;27373:7;27402:24;27420:5;27402:24;:::i;:::-;27391:35;;27336:96;;;:::o;27438:90::-;27472:7;27515:5;27508:13;27501:21;27490:32;;27438:90;;;:::o;27534:77::-;27571:7;27600:5;27589:16;;27534:77;;;:::o;27617:126::-;27654:7;27694:42;27687:5;27683:54;27672:65;;27617:126;;;:::o;27749:77::-;27786:7;27815:5;27804:16;;27749:77;;;:::o;27832:86::-;27867:7;27907:4;27900:5;27896:16;27885:27;;27832:86;;;:::o;27924:139::-;27987:9;28020:37;28051:5;28020:37;:::i;:::-;28007:50;;27924:139;;;:::o;28069:126::-;28119:9;28152:37;28183:5;28152:37;:::i;:::-;28139:50;;28069:126;;;:::o;28201:113::-;28251:9;28284:24;28302:5;28284:24;:::i;:::-;28271:37;;28201:113;;;:::o;28320:307::-;28388:1;28398:113;28412:6;28409:1;28406:13;28398:113;;;28497:1;28492:3;28488:11;28482:18;28478:1;28473:3;28469:11;28462:39;28434:2;28431:1;28427:10;28422:15;;28398:113;;;28529:6;28526:1;28523:13;28520:101;;;28609:1;28600:6;28595:3;28591:16;28584:27;28520:101;28369:258;28320:307;;;:::o;28633:320::-;28677:6;28714:1;28708:4;28704:12;28694:22;;28761:1;28755:4;28751:12;28782:18;28772:81;;28838:4;28830:6;28826:17;28816:27;;28772:81;28900:2;28892:6;28889:14;28869:18;28866:38;28863:84;;;28919:18;;:::i;:::-;28863:84;28684:269;28633:320;;;:::o;28959:233::-;28998:3;29021:24;29039:5;29021:24;:::i;:::-;29012:33;;29067:66;29060:5;29057:77;29054:103;;;29137:18;;:::i;:::-;29054:103;29184:1;29177:5;29173:13;29166:20;;28959:233;;;:::o;29198:100::-;29237:7;29266:26;29286:5;29266:26;:::i;:::-;29255:37;;29198:100;;;:::o;29304:79::-;29343:7;29372:5;29361:16;;29304:79;;;:::o;29389:94::-;29428:7;29457:20;29471:5;29457:20;:::i;:::-;29446:31;;29389:94;;;:::o;29489:79::-;29528:7;29557:5;29546:16;;29489:79;;;:::o;29574:180::-;29622:77;29619:1;29612:88;29719:4;29716:1;29709:15;29743:4;29740:1;29733:15;29760:180;29808:77;29805:1;29798:88;29905:4;29902:1;29895:15;29929:4;29926:1;29919:15;29946:180;29994:77;29991:1;29984:88;30091:4;30088:1;30081:15;30115:4;30112:1;30105:15;30132:180;30180:77;30177:1;30170:88;30277:4;30274:1;30267:15;30301:4;30298:1;30291:15;30318:117;30427:1;30424;30417:12;30441:117;30550:1;30547;30540:12;30564:117;30673:1;30670;30663:12;30687:117;30796:1;30793;30786:12;30810:117;30919:1;30916;30909:12;30933:102;30974:6;31025:2;31021:7;31016:2;31009:5;31005:14;31001:28;30991:38;;30933:102;;;:::o;31041:94::-;31074:8;31122:5;31118:2;31114:14;31093:35;;31041:94;;;:::o;31141:156::-;31281:8;31277:1;31269:6;31265:14;31258:32;31141:156;:::o;31303:214::-;31443:66;31439:1;31431:6;31427:14;31420:90;31303:214;:::o;31523:156::-;31663:8;31659:1;31651:6;31647:14;31640:32;31523:156;:::o;31685:170::-;31825:22;31821:1;31813:6;31809:14;31802:46;31685:170;:::o;31861:158::-;32001:10;31997:1;31989:6;31985:14;31978:34;31861:158;:::o;32025:164::-;32165:16;32161:1;32153:6;32149:14;32142:40;32025:164;:::o;32195:173::-;32335:25;32331:1;32323:6;32319:14;32312:49;32195:173;:::o;32374:122::-;32447:24;32465:5;32447:24;:::i;:::-;32440:5;32437:35;32427:63;;32486:1;32483;32476:12;32427:63;32374:122;:::o;32502:116::-;32572:21;32587:5;32572:21;:::i;:::-;32565:5;32562:32;32552:60;;32608:1;32605;32598:12;32552:60;32502:116;:::o;32624:122::-;32697:24;32715:5;32697:24;:::i;:::-;32690:5;32687:35;32677:63;;32736:1;32733;32726:12;32677:63;32624:122;:::o;32752:::-;32825:24;32843:5;32825:24;:::i;:::-;32818:5;32815:35;32805:63;;32864:1;32861;32854:12;32805:63;32752:122;:::o;32880:118::-;32951:22;32967:5;32951:22;:::i;:::-;32944:5;32941:33;32931:61;;32988:1;32985;32978:12;32931:61;32880:118;:::o

Swarm Source

ipfs://6dcdb126719391a14240e2923bde42df1d48e65eb8f3e10507f95d12755dc64c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.