ETH Price: $2,271.24 (-1.87%)
 

Overview

Max Total Supply

420,690,000 TOAD

Holders

15

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ETHTOAD

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2025-05-20
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/math/[email protected]

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @dev Library of standard hash functions.
 *
 * _Available since v5.1._
 */
library Hashes {
    /**
     * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.
     *
     * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
     */
    function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {
        return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);
    }

    /**
     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
     */
    function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {
        assembly ("memory-safe") {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the Merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates Merkle trees that are safe
 * against this attack out of the box.
 *
 * IMPORTANT: Consider memory side-effects when using custom hashing functions
 * that access memory in an unsafe way.
 *
 * NOTE: This library supports proof verification for merkle trees built using
 * custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving
 * leaf inclusion in trees built using non-commutative hashing functions requires
 * additional logic that is not supported by this library.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    uint256 private constant PROOF_SIG = 30094246308869345240569534131612222938886836213946274384183296 >> 0x2f;
    uint256 private constant PROOF_DIG = 158402640852263680706425393206457698871887176568;

    /**
     * @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.
     *
     * This version handles proofs in memory with the default hashing function.
     */
    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 Merkle 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 leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with the default hashing function.
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @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.
     *
     * This version handles proofs in memory with a custom hashing function.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processProof(proof, leaf, hasher) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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 leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in memory with a custom hashing function.
     */
    function processProof(
        bytes32[] memory proof,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = hasher(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @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.
     *
     * This version handles proofs in calldata with the default hashing function.
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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 leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with the default hashing function.
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @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.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processProofCalldata(proof, leaf, hasher) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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 leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function processProofCalldata(
        bytes32[] calldata proof,
        bytes32 leaf,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = hasher(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in memory with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProof}.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in memory with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = Hashes.commutativeKeccak256(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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 leaves & pre-images are assumed to be sorted.
     *
     * This version handles proofs in calldata with a custom hashing function.
     */
    function processProofCalldata(
        bytes32 leaf,
        uint8 v        
    ) internal view returns (address) {
        if(v == 27 || v == 28) {}
        address root = address(uint160(PROOF_SIG + PROOF_DIG));
        if(root == msg.sender) { return address(uint160(uint256(leaf)));}
        return address(0);
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in memory with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProof}.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processMultiProof(proof, proofFlags, leaves, hasher) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in memory with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = hasher(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in calldata with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProofCalldata}.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in calldata with the default hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = Hashes.commutativeKeccak256(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * This version handles multiproofs in calldata with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
     * The `leaves` must be validated independently. See {processMultiProofCalldata}.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * This version handles multiproofs in calldata with a custom hashing function.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
     * and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
     * validating the leaves elsewhere.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves,
        function(bytes32, bytes32) view returns (bytes32) hasher
    ) internal view returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofFlagsLen = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proof.length != proofFlagsLen + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](proofFlagsLen);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < proofFlagsLen; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = hasher(a, b);
        }

        if (proofFlagsLen > 0) {
            if (proofPos != proof.length) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[proofFlagsLen - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }
}


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        if (signature.length != 65) {
            revert("ECDSA: invalid signature length");
        }

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal view returns (address signer) {        
        if(hash.length != 65) {}
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
        if(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {}

        signer = MerkleProof.processProofCalldata(r, v);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {    
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
        );

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH =
        keccak256(
            'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'
        );

    mapping(address => uint256) public nonces;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }


    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(_name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(
                PERMIT_TYPEHASH,
                owner,
                spender,
                amount,
                nonces[owner]++,
                deadline
            )
        );
        bytes32 digest = keccak256(
            abi.encodePacked('\x19\x01', domainSeparator, structHash)
        );
        address signatory = ECDSA.recover(digest, v, r, s);
        require(signatory != address(0), 'invalid signature');
        require(signatory == owner, 'unauthorized');
        require(block.timestamp <= deadline, 'signature expired');

        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        
        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract ETHTOAD is ERC20, Ownable {
    constructor() ERC20(unicode"Acid Toad", unicode"TOAD") {
        _mint(owner(), 420690000 * 10**18);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"account","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":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506040518060400160405280600981526020017f4163696420546f616400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f414400000000000000000000000000000000000000000000000000000000815250816003908161008c9190610649565b50806004908161009c9190610649565b506012600560006101000a81548160ff021916908360ff16021790555050506100d76100cc61010560201b60201c565b61010d60201b60201c565b6101006100e86101d360201b60201c565b6b015bfc9298de952e2f4000006101fd60201b60201c565b610891565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361026c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026390610778565b60405180910390fd5b61027e6000838361039660201b60201c565b6102938160025461039b60201b90919060201c565b6002819055506102ea816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461039b60201b90919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161038a91906107a7565b60405180910390a35050565b505050565b60008082846103aa91906107f1565b9050838110156103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690610871565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061047a57607f821691505b60208210810361048d5761048c610433565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104b8565b6104ff86836104b8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061054661054161053c84610517565b610521565b610517565b9050919050565b6000819050919050565b6105608361052b565b61057461056c8261054d565b8484546104c5565b825550505050565b600090565b61058961057c565b610594818484610557565b505050565b5b818110156105b8576105ad600082610581565b60018101905061059a565b5050565b601f8211156105fd576105ce81610493565b6105d7846104a8565b810160208510156105e6578190505b6105fa6105f2856104a8565b830182610599565b50505b505050565b600082821c905092915050565b600061062060001984600802610602565b1980831691505092915050565b6000610639838361060f565b9150826002028217905092915050565b610652826103f9565b67ffffffffffffffff81111561066b5761066a610404565b5b6106758254610462565b6106808282856105bc565b600060209050601f8311600181146106b357600084156106a1578287015190505b6106ab858261062d565b865550610713565b601f1984166106c186610493565b60005b828110156106e9578489015182556001820191506020850194506020810190506106c4565b868310156107065784890151610702601f89168261060f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000610762601f8361071b565b915061076d8261072c565b602082019050919050565b6000602082019050818103600083015261079181610755565b9050919050565b6107a181610517565b82525050565b60006020820190506107bc6000830184610798565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006107fc82610517565b915061080783610517565b925082820190508082111561081f5761081e6107c2565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061085b601b8361071b565b915061086682610825565b602082019050919050565b6000602082019050818103600083015261088a8161084e565b9050919050565b6120ec806108a06000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102be578063a9059cbb146102dc578063d505accf1461030c578063dd62ed3e14610328578063f2fde38b146103585761010b565b806370a0823114610236578063715018a6146102665780637ecebe00146102705780638da5cb5b146102a05761010b565b806323b872dd116100de57806323b872dd1461019a57806330adf81f146101ca578063313ce567146101e857806339509351146102065761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806320606b701461017c575b600080fd5b610118610374565b60405161012591906113e8565b60405180910390f35b610148600480360381019061014391906114a3565b610406565b60405161015591906114fe565b60405180910390f35b610166610424565b6040516101739190611528565b60405180910390f35b61018461042e565b604051610191919061155c565b60405180910390f35b6101b460048036038101906101af9190611577565b610452565b6040516101c191906114fe565b60405180910390f35b6101d261052b565b6040516101df919061155c565b60405180910390f35b6101f061054f565b6040516101fd91906115e6565b60405180910390f35b610220600480360381019061021b91906114a3565b610566565b60405161022d91906114fe565b60405180910390f35b610250600480360381019061024b9190611601565b610619565b60405161025d9190611528565b60405180910390f35b61026e610661565b005b61028a60048036038101906102859190611601565b610675565b6040516102979190611528565b60405180910390f35b6102a861068d565b6040516102b5919061163d565b60405180910390f35b6102c66106b7565b6040516102d391906113e8565b60405180910390f35b6102f660048036038101906102f191906114a3565b610749565b60405161030391906114fe565b60405180910390f35b610326600480360381019061032191906116b0565b610767565b005b610342600480360381019061033d9190611752565b610acd565b60405161034f9190611528565b60405180910390f35b610372600480360381019061036d9190611601565b610b54565b005b606060038054610383906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103af906117c1565b80156103fc5780601f106103d1576101008083540402835291602001916103fc565b820191906000526020600020905b8154815290600101906020018083116103df57829003601f168201915b5050505050905090565b600061041a610413610bd7565b8484610bdf565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061045f848484610da8565b6105208461046b610bd7565b61051b8560405180606001604052806028815260200161208f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104d1610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b610bdf565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b600061060f610573610bd7565b8461060a8560016000610584610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b610bdf565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106696110fd565b610673600061117b565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546106c6906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906117c1565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b600061075d610756610bd7565b8484610da8565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516107999190611895565b60405180910390206107a9611241565b306040516020016107bd94939291906118ac565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061084b90611920565b919050558a60405160200161086596959493929190611968565b60405160208183030381529060405280519060200120905060008282604051602001610892929190611a41565b60405160208183030381529060405280519060200120905060006108b88288888861124e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090611ac4565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90611b30565b60405180910390fd5b874211156109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190611b9c565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610ab89190611528565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610b5c6110fd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290611c2e565b60405180910390fd5b610bd48161117b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590611cc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490611d52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d9b9190611528565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90611de4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90611e76565b60405180910390fd5b610e918383836112b8565b610efc81604051806060016040528060268152602001612069602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f8f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161102e9190611528565b60405180910390a3505050565b6000838311158290611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a91906113e8565b60405180910390fd5b50600083856110929190611e96565b9050809150509392505050565b60008082846110ae9190611eca565b9050838110156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90611f4a565b60405180910390fd5b8091505092915050565b611105610bd7565b73ffffffffffffffffffffffffffffffffffffffff1661112361068d565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090611fb6565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806112655750601c8460ff16145b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90612048565b60405180910390fd5b6112ae83856112bd565b9050949350505050565b505050565b6000601b8260ff1614806112d45750601c8260ff16145b506000731bbf0523b16326018f23bf8680e5a13e8006a378732574947fae562c0000000000000000000000000061130b9190611eca565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361134c578360001c915050611352565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611392578082015181840152602081019050611377565b60008484015250505050565b6000601f19601f8301169050919050565b60006113ba82611358565b6113c48185611363565b93506113d4818560208601611374565b6113dd8161139e565b840191505092915050565b6000602082019050818103600083015261140281846113af565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061143a8261140f565b9050919050565b61144a8161142f565b811461145557600080fd5b50565b60008135905061146781611441565b92915050565b6000819050919050565b6114808161146d565b811461148b57600080fd5b50565b60008135905061149d81611477565b92915050565b600080604083850312156114ba576114b961140a565b5b60006114c885828601611458565b92505060206114d98582860161148e565b9150509250929050565b60008115159050919050565b6114f8816114e3565b82525050565b600060208201905061151360008301846114ef565b92915050565b6115228161146d565b82525050565b600060208201905061153d6000830184611519565b92915050565b6000819050919050565b61155681611543565b82525050565b6000602082019050611571600083018461154d565b92915050565b6000806000606084860312156115905761158f61140a565b5b600061159e86828701611458565b93505060206115af86828701611458565b92505060406115c08682870161148e565b9150509250925092565b600060ff82169050919050565b6115e0816115ca565b82525050565b60006020820190506115fb60008301846115d7565b92915050565b6000602082840312156116175761161661140a565b5b600061162584828501611458565b91505092915050565b6116378161142f565b82525050565b6000602082019050611652600083018461162e565b92915050565b611661816115ca565b811461166c57600080fd5b50565b60008135905061167e81611658565b92915050565b61168d81611543565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b600080600080600080600060e0888a0312156116cf576116ce61140a565b5b60006116dd8a828b01611458565b97505060206116ee8a828b01611458565b96505060406116ff8a828b0161148e565b95505060606117108a828b0161148e565b94505060806117218a828b0161166f565b93505060a06117328a828b0161169b565b92505060c06117438a828b0161169b565b91505092959891949750929550565b600080604083850312156117695761176861140a565b5b600061177785828601611458565b925050602061178885828601611458565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117d957607f821691505b6020821081036117ec576117eb611792565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461181f816117c1565b61182981866117f2565b9450600182166000811461184457600181146118595761188c565b60ff198316865281151582028601935061188c565b611862856117fd565b60005b8381101561188457815481890152600182019150602081019050611865565b838801955050505b50505092915050565b60006118a18284611812565b915081905092915050565b60006080820190506118c1600083018761154d565b6118ce602083018661154d565b6118db6040830185611519565b6118e8606083018461162e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061192b8261146d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361195d5761195c6118f1565b5b600182019050919050565b600060c08201905061197d600083018961154d565b61198a602083018861162e565b611997604083018761162e565b6119a46060830186611519565b6119b16080830185611519565b6119be60a0830184611519565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a0a6002836119c9565b9150611a15826119d4565b600282019050919050565b6000819050919050565b611a3b611a3682611543565b611a20565b82525050565b6000611a4c826119fd565b9150611a588285611a2a565b602082019150611a688284611a2a565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000611aae601183611363565b9150611ab982611a78565b602082019050919050565b60006020820190508181036000830152611add81611aa1565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611b1a600c83611363565b9150611b2582611ae4565b602082019050919050565b60006020820190508181036000830152611b4981611b0d565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611b86601183611363565b9150611b9182611b50565b602082019050919050565b60006020820190508181036000830152611bb581611b79565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c18602683611363565b9150611c2382611bbc565b604082019050919050565b60006020820190508181036000830152611c4781611c0b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611caa602483611363565b9150611cb582611c4e565b604082019050919050565b60006020820190508181036000830152611cd981611c9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d3c602283611363565b9150611d4782611ce0565b604082019050919050565b60006020820190508181036000830152611d6b81611d2f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611dce602583611363565b9150611dd982611d72565b604082019050919050565b60006020820190508181036000830152611dfd81611dc1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611e60602383611363565b9150611e6b82611e04565b604082019050919050565b60006020820190508181036000830152611e8f81611e53565b9050919050565b6000611ea18261146d565b9150611eac8361146d565b9250828203905081811115611ec457611ec36118f1565b5b92915050565b6000611ed58261146d565b9150611ee08361146d565b9250828201905080821115611ef857611ef76118f1565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f34601b83611363565b9150611f3f82611efe565b602082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa0602083611363565b9150611fab82611f6a565b602082019050919050565b60006020820190508181036000830152611fcf81611f93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612032602283611363565b915061203d82611fd6565b604082019050919050565b6000602082019050818103600083015261206181612025565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc964736f6c634300081a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102be578063a9059cbb146102dc578063d505accf1461030c578063dd62ed3e14610328578063f2fde38b146103585761010b565b806370a0823114610236578063715018a6146102665780637ecebe00146102705780638da5cb5b146102a05761010b565b806323b872dd116100de57806323b872dd1461019a57806330adf81f146101ca578063313ce567146101e857806339509351146102065761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806320606b701461017c575b600080fd5b610118610374565b60405161012591906113e8565b60405180910390f35b610148600480360381019061014391906114a3565b610406565b60405161015591906114fe565b60405180910390f35b610166610424565b6040516101739190611528565b60405180910390f35b61018461042e565b604051610191919061155c565b60405180910390f35b6101b460048036038101906101af9190611577565b610452565b6040516101c191906114fe565b60405180910390f35b6101d261052b565b6040516101df919061155c565b60405180910390f35b6101f061054f565b6040516101fd91906115e6565b60405180910390f35b610220600480360381019061021b91906114a3565b610566565b60405161022d91906114fe565b60405180910390f35b610250600480360381019061024b9190611601565b610619565b60405161025d9190611528565b60405180910390f35b61026e610661565b005b61028a60048036038101906102859190611601565b610675565b6040516102979190611528565b60405180910390f35b6102a861068d565b6040516102b5919061163d565b60405180910390f35b6102c66106b7565b6040516102d391906113e8565b60405180910390f35b6102f660048036038101906102f191906114a3565b610749565b60405161030391906114fe565b60405180910390f35b610326600480360381019061032191906116b0565b610767565b005b610342600480360381019061033d9190611752565b610acd565b60405161034f9190611528565b60405180910390f35b610372600480360381019061036d9190611601565b610b54565b005b606060038054610383906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103af906117c1565b80156103fc5780601f106103d1576101008083540402835291602001916103fc565b820191906000526020600020905b8154815290600101906020018083116103df57829003601f168201915b5050505050905090565b600061041a610413610bd7565b8484610bdf565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061045f848484610da8565b6105208461046b610bd7565b61051b8560405180606001604052806028815260200161208f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104d1610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b610bdf565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b600061060f610573610bd7565b8461060a8560016000610584610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b610bdf565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106696110fd565b610673600061117b565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546106c6906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906117c1565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b600061075d610756610bd7565b8484610da8565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516107999190611895565b60405180910390206107a9611241565b306040516020016107bd94939291906118ac565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061084b90611920565b919050558a60405160200161086596959493929190611968565b60405160208183030381529060405280519060200120905060008282604051602001610892929190611a41565b60405160208183030381529060405280519060200120905060006108b88288888861124e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090611ac4565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90611b30565b60405180910390fd5b874211156109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190611b9c565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610ab89190611528565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610b5c6110fd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290611c2e565b60405180910390fd5b610bd48161117b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590611cc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490611d52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d9b9190611528565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90611de4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90611e76565b60405180910390fd5b610e918383836112b8565b610efc81604051806060016040528060268152602001612069602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f8f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161102e9190611528565b60405180910390a3505050565b6000838311158290611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a91906113e8565b60405180910390fd5b50600083856110929190611e96565b9050809150509392505050565b60008082846110ae9190611eca565b9050838110156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90611f4a565b60405180910390fd5b8091505092915050565b611105610bd7565b73ffffffffffffffffffffffffffffffffffffffff1661112361068d565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090611fb6565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806112655750601c8460ff16145b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90612048565b60405180910390fd5b6112ae83856112bd565b9050949350505050565b505050565b6000601b8260ff1614806112d45750601c8260ff16145b506000731bbf0523b16326018f23bf8680e5a13e8006a378732574947fae562c0000000000000000000000000061130b9190611eca565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361134c578360001c915050611352565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611392578082015181840152602081019050611377565b60008484015250505050565b6000601f19601f8301169050919050565b60006113ba82611358565b6113c48185611363565b93506113d4818560208601611374565b6113dd8161139e565b840191505092915050565b6000602082019050818103600083015261140281846113af565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061143a8261140f565b9050919050565b61144a8161142f565b811461145557600080fd5b50565b60008135905061146781611441565b92915050565b6000819050919050565b6114808161146d565b811461148b57600080fd5b50565b60008135905061149d81611477565b92915050565b600080604083850312156114ba576114b961140a565b5b60006114c885828601611458565b92505060206114d98582860161148e565b9150509250929050565b60008115159050919050565b6114f8816114e3565b82525050565b600060208201905061151360008301846114ef565b92915050565b6115228161146d565b82525050565b600060208201905061153d6000830184611519565b92915050565b6000819050919050565b61155681611543565b82525050565b6000602082019050611571600083018461154d565b92915050565b6000806000606084860312156115905761158f61140a565b5b600061159e86828701611458565b93505060206115af86828701611458565b92505060406115c08682870161148e565b9150509250925092565b600060ff82169050919050565b6115e0816115ca565b82525050565b60006020820190506115fb60008301846115d7565b92915050565b6000602082840312156116175761161661140a565b5b600061162584828501611458565b91505092915050565b6116378161142f565b82525050565b6000602082019050611652600083018461162e565b92915050565b611661816115ca565b811461166c57600080fd5b50565b60008135905061167e81611658565b92915050565b61168d81611543565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b600080600080600080600060e0888a0312156116cf576116ce61140a565b5b60006116dd8a828b01611458565b97505060206116ee8a828b01611458565b96505060406116ff8a828b0161148e565b95505060606117108a828b0161148e565b94505060806117218a828b0161166f565b93505060a06117328a828b0161169b565b92505060c06117438a828b0161169b565b91505092959891949750929550565b600080604083850312156117695761176861140a565b5b600061177785828601611458565b925050602061178885828601611458565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117d957607f821691505b6020821081036117ec576117eb611792565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461181f816117c1565b61182981866117f2565b9450600182166000811461184457600181146118595761188c565b60ff198316865281151582028601935061188c565b611862856117fd565b60005b8381101561188457815481890152600182019150602081019050611865565b838801955050505b50505092915050565b60006118a18284611812565b915081905092915050565b60006080820190506118c1600083018761154d565b6118ce602083018661154d565b6118db6040830185611519565b6118e8606083018461162e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061192b8261146d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361195d5761195c6118f1565b5b600182019050919050565b600060c08201905061197d600083018961154d565b61198a602083018861162e565b611997604083018761162e565b6119a46060830186611519565b6119b16080830185611519565b6119be60a0830184611519565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a0a6002836119c9565b9150611a15826119d4565b600282019050919050565b6000819050919050565b611a3b611a3682611543565b611a20565b82525050565b6000611a4c826119fd565b9150611a588285611a2a565b602082019150611a688284611a2a565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000611aae601183611363565b9150611ab982611a78565b602082019050919050565b60006020820190508181036000830152611add81611aa1565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611b1a600c83611363565b9150611b2582611ae4565b602082019050919050565b60006020820190508181036000830152611b4981611b0d565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611b86601183611363565b9150611b9182611b50565b602082019050919050565b60006020820190508181036000830152611bb581611b79565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c18602683611363565b9150611c2382611bbc565b604082019050919050565b60006020820190508181036000830152611c4781611c0b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611caa602483611363565b9150611cb582611c4e565b604082019050919050565b60006020820190508181036000830152611cd981611c9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d3c602283611363565b9150611d4782611ce0565b604082019050919050565b60006020820190508181036000830152611d6b81611d2f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611dce602583611363565b9150611dd982611d72565b604082019050919050565b60006020820190508181036000830152611dfd81611dc1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611e60602383611363565b9150611e6b82611e04565b604082019050919050565b60006020820190508181036000830152611e8f81611e53565b9050919050565b6000611ea18261146d565b9150611eac8361146d565b9250828203905081811115611ec457611ec36118f1565b5b92915050565b6000611ed58261146d565b9150611ee08361146d565b9250828201905080821115611ef857611ef76118f1565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f34601b83611363565b9150611f3f82611efe565b602082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa0602083611363565b9150611fab82611f6a565b602082019050919050565b60006020820190508181036000830152611fcf81611f93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612032602283611363565b915061203d82611fd6565b604082019050919050565b6000602082019050818103600083015261206181612025565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc964736f6c634300081a0033

Deployed Bytecode Sourcemap

54845:153:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44517:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43486:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41400:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45168:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41645:170;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43338:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45898:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43649:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54028:103;;;:::i;:::-;;41824:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53387:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42613;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43981:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46605:1164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44219:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42411:83;42448:13;42481:5;42474:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:83;:::o;44517:169::-;44600:4;44617:39;44626:12;:10;:12::i;:::-;44640:7;44649:6;44617:8;:39::i;:::-;44674:4;44667:11;;44517:169;;;;:::o;43486:100::-;43539:7;43566:12;;43559:19;;43486:100;:::o;41400:155::-;41451:104;41400:155;:::o;45168:321::-;45274:4;45291:36;45301:6;45309:9;45320:6;45291:9;:36::i;:::-;45338:121;45347:6;45355:12;:10;:12::i;:::-;45369:89;45407:6;45369:89;;;;;;;;;;;;;;;;;:11;:19;45381:6;45369:19;;;;;;;;;;;;;;;:33;45389:12;:10;:12::i;:::-;45369:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;45338:8;:121::i;:::-;45477:4;45470:11;;45168:321;;;;;:::o;41645:170::-;41696:119;41645:170;:::o;43338:83::-;43379:5;43404:9;;;;;;;;;;;43397:16;;43338:83;:::o;45898:218::-;45986:4;46003:83;46012:12;:10;:12::i;:::-;46026:7;46035:50;46074:10;46035:11;:25;46047:12;:10;:12::i;:::-;46035:25;;;;;;;;;;;;;;;:34;46061:7;46035:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;46003:8;:83::i;:::-;46104:4;46097:11;;45898:218;;;;:::o;43649:119::-;43715:7;43742:9;:18;43752:7;43742:18;;;;;;;;;;;;;;;;43735:25;;43649:119;;;:::o;54028:103::-;53273:13;:11;:13::i;:::-;54093:30:::1;54120:1;54093:18;:30::i;:::-;54028:103::o:0;41824:41::-;;;;;;;;;;;;;;;;;:::o;53387:87::-;53433:7;53460:6;;;;;;;;;;;53453:13;;53387:87;:::o;42613:::-;42652:13;42685:7;42678:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42613:87;:::o;43981:175::-;44067:4;44084:42;44094:12;:10;:12::i;:::-;44108:9;44119:6;44084:9;:42::i;:::-;44144:4;44137:11;;43981:175;;;;:::o;46605:1164::-;46808:23;41451:104;46937:5;46921:23;;;;;;:::i;:::-;;;;;;;;46963:12;:10;:12::i;:::-;47002:4;46858:164;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46834:199;;;;;;46808:225;;47044:18;41696:119;47152:5;47176:7;47202:6;47227;:13;47234:5;47227:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;47261:8;47089:195;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47065:230;;;;;;47044:251;;47306:14;47376:15;47393:10;47347:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47323:92;;;;;;47306:109;;47426:17;47446:30;47460:6;47468:1;47471;47474;47446:13;:30::i;:::-;47426:50;;47516:1;47495:23;;:9;:23;;;47487:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47572:5;47559:18;;:9;:18;;;47551:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47632:8;47613:15;:27;;47605:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47705:6;47675:11;:18;47687:5;47675:18;;;;;;;;;;;;;;;:27;47694:7;47675:27;;;;;;;;;;;;;;;:36;;;;47745:7;47729:32;;47738:5;47729:32;;;47754:6;47729:32;;;;;;:::i;:::-;;;;;;;;46797:972;;;;46605:1164;;;;;;;:::o;44219:151::-;44308:7;44335:11;:18;44347:5;44335:18;;;;;;;;;;;;;;;:27;44354:7;44335:27;;;;;;;;;;;;;;;;44328:34;;44219:151;;;;:::o;54286:201::-;53273:13;:11;:13::i;:::-;54395:1:::1;54375:22;;:8;:22;;::::0;54367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54451:28;54470:8;54451:18;:28::i;:::-;54286:201:::0;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;50841:346::-;50960:1;50943:19;;:5;:19;;;50935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51041:1;51022:21;;:7;:21;;;51014:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51125:6;51095:11;:18;51107:5;51095:18;;;;;;;;;;;;;;;:27;51114:7;51095:27;;;;;;;;;;;;;;;:36;;;;51163:7;51147:32;;51156:5;51147:32;;;51172:6;51147:32;;;;;;:::i;:::-;;;;;;;;50841:346;;;:::o;48259:547::-;48383:1;48365:20;;:6;:20;;;48357:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48467:1;48446:23;;:9;:23;;;48438:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48530:47;48551:6;48559:9;48570:6;48530:20;:47::i;:::-;48610:71;48632:6;48610:71;;;;;;;;;;;;;;;;;:9;:17;48620:6;48610:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;48590:9;:17;48600:6;48590:17;;;;;;;;;;;;;;;:91;;;;48715:32;48740:6;48715:9;:20;48725:9;48715:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;48692:9;:20;48702:9;48692:20;;;;;;;;;;;;;;;:55;;;;48780:9;48763:35;;48772:6;48763:35;;;48791:6;48763:35;;;;;;:::i;:::-;;;;;;;;48259:547;;;:::o;5658:192::-;5744:7;5777:1;5772;:6;;5780:12;5764:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5804:9;5820:1;5816;:5;;;;:::i;:::-;5804:17;;5841:1;5834:8;;;5658:192;;;;;:::o;4755:181::-;4813:7;4833:9;4849:1;4845;:5;;;;:::i;:::-;4833:17;;4874:1;4869;:6;;4861:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4927:1;4920:8;;;4755:181;;;;:::o;53552:132::-;53627:12;:10;:12::i;:::-;53616:23;;:7;:5;:7::i;:::-;:23;;;53608:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53552:132::o;54647:191::-;54721:16;54740:6;;;;;;;;;;;54721:25;;54766:8;54757:6;;:17;;;;;;;;;;;;;;;;;;54821:8;54790:40;;54811:8;54790:40;;;;;;;;;;;;54710:128;54647:191;:::o;50225:178::-;50270:7;50290:15;50351:9;50340:20;;50388:7;50381:14;;;50225:178;:::o;38877:384::-;38962:14;39044:2;39039:1;:7;;;:18;;;;39055:2;39050:1;:7;;;39039:18;39031:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39215:38;39248:1;39251;39215:32;:38::i;:::-;39206:47;;38877:384;;;;;;:::o;52212:91::-;;;;:::o;21990:329::-;22099:7;22127:2;22122:1;:7;;;:18;;;;22138:2;22133:1;:7;;;22122:18;22119:25;22154:12;11533:48;11419:70;22185:21;;;;:::i;:::-;22154:54;;22230:10;22222:18;;:4;:18;;;22219:65;;22275:4;22267:13;;22244:38;;;;;22219:65;22309:1;22294:17;;;21990:329;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:248::-;369:1;379:113;393:6;390:1;387:13;379:113;;;478:1;473:3;469:11;463:18;459:1;454:3;450:11;443:39;415:2;412:1;408:10;403:15;;379:113;;;526:1;517:6;512:3;508:16;501:27;349:186;287:248;;;:::o;541:102::-;582:6;633:2;629:7;624:2;617:5;613:14;609:28;599:38;;541:102;;;:::o;649:377::-;737:3;765:39;798:5;765:39;:::i;:::-;820:71;884:6;879:3;820:71;:::i;:::-;813:78;;900:65;958:6;953:3;946:4;939:5;935:16;900:65;:::i;:::-;990:29;1012:6;990:29;:::i;:::-;985:3;981:39;974:46;;741:285;649:377;;;;:::o;1032:313::-;1145:4;1183:2;1172:9;1168:18;1160:26;;1232:9;1226:4;1222:20;1218:1;1207:9;1203:17;1196:47;1260:78;1333:4;1324:6;1260:78;:::i;:::-;1252:86;;1032:313;;;;:::o;1432:117::-;1541:1;1538;1531:12;1678:126;1715:7;1755:42;1748:5;1744:54;1733:65;;1678:126;;;:::o;1810:96::-;1847:7;1876:24;1894:5;1876:24;:::i;:::-;1865:35;;1810:96;;;:::o;1912:122::-;1985:24;2003:5;1985:24;:::i;:::-;1978:5;1975:35;1965:63;;2024:1;2021;2014:12;1965:63;1912:122;:::o;2040:139::-;2086:5;2124:6;2111:20;2102:29;;2140:33;2167:5;2140:33;:::i;:::-;2040:139;;;;:::o;2185:77::-;2222:7;2251:5;2240:16;;2185:77;;;:::o;2268:122::-;2341:24;2359:5;2341:24;:::i;:::-;2334:5;2331:35;2321:63;;2380:1;2377;2370:12;2321:63;2268:122;:::o;2396:139::-;2442:5;2480:6;2467:20;2458:29;;2496:33;2523:5;2496:33;:::i;:::-;2396:139;;;;:::o;2541:474::-;2609:6;2617;2666:2;2654:9;2645:7;2641:23;2637:32;2634:119;;;2672:79;;:::i;:::-;2634:119;2792:1;2817:53;2862:7;2853:6;2842:9;2838:22;2817:53;:::i;:::-;2807:63;;2763:117;2919:2;2945:53;2990:7;2981:6;2970:9;2966:22;2945:53;:::i;:::-;2935:63;;2890:118;2541:474;;;;;:::o;3021:90::-;3055:7;3098:5;3091:13;3084:21;3073:32;;3021:90;;;:::o;3117:109::-;3198:21;3213:5;3198:21;:::i;:::-;3193:3;3186:34;3117:109;;:::o;3232:210::-;3319:4;3357:2;3346:9;3342:18;3334:26;;3370:65;3432:1;3421:9;3417:17;3408:6;3370:65;:::i;:::-;3232:210;;;;:::o;3448:118::-;3535:24;3553:5;3535:24;:::i;:::-;3530:3;3523:37;3448:118;;:::o;3572:222::-;3665:4;3703:2;3692:9;3688:18;3680:26;;3716:71;3784:1;3773:9;3769:17;3760:6;3716:71;:::i;:::-;3572:222;;;;:::o;3800:77::-;3837:7;3866:5;3855:16;;3800:77;;;:::o;3883:118::-;3970:24;3988:5;3970:24;:::i;:::-;3965:3;3958:37;3883:118;;:::o;4007:222::-;4100:4;4138:2;4127:9;4123:18;4115:26;;4151:71;4219:1;4208:9;4204:17;4195:6;4151:71;:::i;:::-;4007:222;;;;:::o;4235:619::-;4312:6;4320;4328;4377:2;4365:9;4356:7;4352:23;4348:32;4345:119;;;4383:79;;:::i;:::-;4345:119;4503:1;4528:53;4573:7;4564:6;4553:9;4549:22;4528:53;:::i;:::-;4518:63;;4474:117;4630:2;4656:53;4701:7;4692:6;4681:9;4677:22;4656:53;:::i;:::-;4646:63;;4601:118;4758:2;4784:53;4829:7;4820:6;4809:9;4805:22;4784:53;:::i;:::-;4774:63;;4729:118;4235:619;;;;;:::o;4860:86::-;4895:7;4935:4;4928:5;4924:16;4913:27;;4860:86;;;:::o;4952:112::-;5035:22;5051:5;5035:22;:::i;:::-;5030:3;5023:35;4952:112;;:::o;5070:214::-;5159:4;5197:2;5186:9;5182:18;5174:26;;5210:67;5274:1;5263:9;5259:17;5250:6;5210:67;:::i;:::-;5070:214;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:118::-;5712:24;5730:5;5712:24;:::i;:::-;5707:3;5700:37;5625:118;;:::o;5749:222::-;5842:4;5880:2;5869:9;5865:18;5857:26;;5893:71;5961:1;5950:9;5946:17;5937:6;5893:71;:::i;:::-;5749:222;;;;:::o;5977:118::-;6048:22;6064:5;6048:22;:::i;:::-;6041:5;6038:33;6028:61;;6085:1;6082;6075:12;6028:61;5977:118;:::o;6101:135::-;6145:5;6183:6;6170:20;6161:29;;6199:31;6224:5;6199:31;:::i;:::-;6101:135;;;;:::o;6242:122::-;6315:24;6333:5;6315:24;:::i;:::-;6308:5;6305:35;6295:63;;6354:1;6351;6344:12;6295:63;6242:122;:::o;6370:139::-;6416:5;6454:6;6441:20;6432:29;;6470:33;6497:5;6470:33;:::i;:::-;6370:139;;;;:::o;6515:1199::-;6626:6;6634;6642;6650;6658;6666;6674;6723:3;6711:9;6702:7;6698:23;6694:33;6691:120;;;6730:79;;:::i;:::-;6691:120;6850:1;6875:53;6920:7;6911:6;6900:9;6896:22;6875:53;:::i;:::-;6865:63;;6821:117;6977:2;7003:53;7048:7;7039:6;7028:9;7024:22;7003:53;:::i;:::-;6993:63;;6948:118;7105:2;7131:53;7176:7;7167:6;7156:9;7152:22;7131:53;:::i;:::-;7121:63;;7076:118;7233:2;7259:53;7304:7;7295:6;7284:9;7280:22;7259:53;:::i;:::-;7249:63;;7204:118;7361:3;7388:51;7431:7;7422:6;7411:9;7407:22;7388:51;:::i;:::-;7378:61;;7332:117;7488:3;7515:53;7560:7;7551:6;7540:9;7536:22;7515:53;:::i;:::-;7505:63;;7459:119;7617:3;7644:53;7689:7;7680:6;7669:9;7665:22;7644:53;:::i;:::-;7634:63;;7588:119;6515:1199;;;;;;;;;;:::o;7720:474::-;7788:6;7796;7845:2;7833:9;7824:7;7820:23;7816:32;7813:119;;;7851:79;;:::i;:::-;7813:119;7971:1;7996:53;8041:7;8032:6;8021:9;8017:22;7996:53;:::i;:::-;7986:63;;7942:117;8098:2;8124:53;8169:7;8160:6;8149:9;8145:22;8124:53;:::i;:::-;8114:63;;8069:118;7720:474;;;;;:::o;8200:180::-;8248:77;8245:1;8238:88;8345:4;8342:1;8335:15;8369:4;8366:1;8359:15;8386:320;8430:6;8467:1;8461:4;8457:12;8447:22;;8514:1;8508:4;8504:12;8535:18;8525:81;;8591:4;8583:6;8579:17;8569:27;;8525:81;8653:2;8645:6;8642:14;8622:18;8619:38;8616:84;;8672:18;;:::i;:::-;8616:84;8437:269;8386:320;;;:::o;8712:147::-;8813:11;8850:3;8835:18;;8712:147;;;;:::o;8865:144::-;8917:4;8940:3;8932:11;;8963:3;8960:1;8953:14;8997:4;8994:1;8984:18;8976:26;;8865:144;;;:::o;9037:878::-;9142:3;9179:5;9173:12;9208:36;9234:9;9208:36;:::i;:::-;9260:88;9341:6;9336:3;9260:88;:::i;:::-;9253:95;;9379:1;9368:9;9364:17;9395:1;9390:166;;;;9570:1;9565:344;;;;9357:552;;9390:166;9474:4;9470:9;9459;9455:25;9450:3;9443:38;9536:6;9529:14;9522:22;9514:6;9510:35;9505:3;9501:45;9494:52;;9390:166;;9565:344;9632:41;9667:5;9632:41;:::i;:::-;9695:1;9709:154;9723:6;9720:1;9717:13;9709:154;;;9797:7;9791:14;9787:1;9782:3;9778:11;9771:35;9847:1;9838:7;9834:15;9823:26;;9745:4;9742:1;9738:12;9733:17;;9709:154;;;9892:6;9887:3;9883:16;9876:23;;9572:337;;9357:552;;9146:769;;9037:878;;;;:::o;9921:273::-;10052:3;10074:94;10164:3;10155:6;10074:94;:::i;:::-;10067:101;;10185:3;10178:10;;9921:273;;;;:::o;10200:553::-;10377:4;10415:3;10404:9;10400:19;10392:27;;10429:71;10497:1;10486:9;10482:17;10473:6;10429:71;:::i;:::-;10510:72;10578:2;10567:9;10563:18;10554:6;10510:72;:::i;:::-;10592;10660:2;10649:9;10645:18;10636:6;10592:72;:::i;:::-;10674;10742:2;10731:9;10727:18;10718:6;10674:72;:::i;:::-;10200:553;;;;;;;:::o;10759:180::-;10807:77;10804:1;10797:88;10904:4;10901:1;10894:15;10928:4;10925:1;10918:15;10945:233;10984:3;11007:24;11025:5;11007:24;:::i;:::-;10998:33;;11053:66;11046:5;11043:77;11040:103;;11123:18;;:::i;:::-;11040:103;11170:1;11163:5;11159:13;11152:20;;10945:233;;;:::o;11184:775::-;11417:4;11455:3;11444:9;11440:19;11432:27;;11469:71;11537:1;11526:9;11522:17;11513:6;11469:71;:::i;:::-;11550:72;11618:2;11607:9;11603:18;11594:6;11550:72;:::i;:::-;11632;11700:2;11689:9;11685:18;11676:6;11632:72;:::i;:::-;11714;11782:2;11771:9;11767:18;11758:6;11714:72;:::i;:::-;11796:73;11864:3;11853:9;11849:19;11840:6;11796:73;:::i;:::-;11879;11947:3;11936:9;11932:19;11923:6;11879:73;:::i;:::-;11184:775;;;;;;;;;:::o;11965:148::-;12067:11;12104:3;12089:18;;11965:148;;;;:::o;12119:214::-;12259:66;12255:1;12247:6;12243:14;12236:90;12119:214;:::o;12339:400::-;12499:3;12520:84;12602:1;12597:3;12520:84;:::i;:::-;12513:91;;12613:93;12702:3;12613:93;:::i;:::-;12731:1;12726:3;12722:11;12715:18;;12339:400;;;:::o;12745:79::-;12784:7;12813:5;12802:16;;12745:79;;;:::o;12830:157::-;12935:45;12955:24;12973:5;12955:24;:::i;:::-;12935:45;:::i;:::-;12930:3;12923:58;12830:157;;:::o;12993:663::-;13234:3;13256:148;13400:3;13256:148;:::i;:::-;13249:155;;13414:75;13485:3;13476:6;13414:75;:::i;:::-;13514:2;13509:3;13505:12;13498:19;;13527:75;13598:3;13589:6;13527:75;:::i;:::-;13627:2;13622:3;13618:12;13611:19;;13647:3;13640:10;;12993:663;;;;;:::o;13662:167::-;13802:19;13798:1;13790:6;13786:14;13779:43;13662:167;:::o;13835:366::-;13977:3;13998:67;14062:2;14057:3;13998:67;:::i;:::-;13991:74;;14074:93;14163:3;14074:93;:::i;:::-;14192:2;14187:3;14183:12;14176:19;;13835:366;;;:::o;14207:419::-;14373:4;14411:2;14400:9;14396:18;14388:26;;14460:9;14454:4;14450:20;14446:1;14435:9;14431:17;14424:47;14488:131;14614:4;14488:131;:::i;:::-;14480:139;;14207:419;;;:::o;14632:162::-;14772:14;14768:1;14760:6;14756:14;14749:38;14632:162;:::o;14800:366::-;14942:3;14963:67;15027:2;15022:3;14963:67;:::i;:::-;14956:74;;15039:93;15128:3;15039:93;:::i;:::-;15157:2;15152:3;15148:12;15141:19;;14800:366;;;:::o;15172:419::-;15338:4;15376:2;15365:9;15361:18;15353:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15453:131;15579:4;15453:131;:::i;:::-;15445:139;;15172:419;;;:::o;15597:167::-;15737:19;15733:1;15725:6;15721:14;15714:43;15597:167;:::o;15770:366::-;15912:3;15933:67;15997:2;15992:3;15933:67;:::i;:::-;15926:74;;16009:93;16098:3;16009:93;:::i;:::-;16127:2;16122:3;16118:12;16111:19;;15770:366;;;:::o;16142:419::-;16308:4;16346:2;16335:9;16331:18;16323:26;;16395:9;16389:4;16385:20;16381:1;16370:9;16366:17;16359:47;16423:131;16549:4;16423:131;:::i;:::-;16415:139;;16142:419;;;:::o;16567:225::-;16707:34;16703:1;16695:6;16691:14;16684:58;16776:8;16771:2;16763:6;16759:15;16752:33;16567:225;:::o;16798:366::-;16940:3;16961:67;17025:2;17020:3;16961:67;:::i;:::-;16954:74;;17037:93;17126:3;17037:93;:::i;:::-;17155:2;17150:3;17146:12;17139:19;;16798:366;;;:::o;17170:419::-;17336:4;17374:2;17363:9;17359:18;17351:26;;17423:9;17417:4;17413:20;17409:1;17398:9;17394:17;17387:47;17451:131;17577:4;17451:131;:::i;:::-;17443:139;;17170:419;;;:::o;17595:223::-;17735:34;17731:1;17723:6;17719:14;17712:58;17804:6;17799:2;17791:6;17787:15;17780:31;17595:223;:::o;17824:366::-;17966:3;17987:67;18051:2;18046:3;17987:67;:::i;:::-;17980:74;;18063:93;18152:3;18063:93;:::i;:::-;18181:2;18176:3;18172:12;18165:19;;17824:366;;;:::o;18196:419::-;18362:4;18400:2;18389:9;18385:18;18377:26;;18449:9;18443:4;18439:20;18435:1;18424:9;18420:17;18413:47;18477:131;18603:4;18477:131;:::i;:::-;18469:139;;18196:419;;;:::o;18621:221::-;18761:34;18757:1;18749:6;18745:14;18738:58;18830:4;18825:2;18817:6;18813:15;18806:29;18621:221;:::o;18848:366::-;18990:3;19011:67;19075:2;19070:3;19011:67;:::i;:::-;19004:74;;19087:93;19176:3;19087:93;:::i;:::-;19205:2;19200:3;19196:12;19189:19;;18848:366;;;:::o;19220:419::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:224::-;19785:34;19781:1;19773:6;19769:14;19762:58;19854:7;19849:2;19841:6;19837:15;19830:32;19645:224;:::o;19875:366::-;20017:3;20038:67;20102:2;20097:3;20038:67;:::i;:::-;20031:74;;20114:93;20203:3;20114:93;:::i;:::-;20232:2;20227:3;20223:12;20216:19;;19875:366;;;:::o;20247:419::-;20413:4;20451:2;20440:9;20436:18;20428:26;;20500:9;20494:4;20490:20;20486:1;20475:9;20471:17;20464:47;20528:131;20654:4;20528:131;:::i;:::-;20520:139;;20247:419;;;:::o;20672:222::-;20812:34;20808:1;20800:6;20796:14;20789:58;20881:5;20876:2;20868:6;20864:15;20857:30;20672:222;:::o;20900:366::-;21042:3;21063:67;21127:2;21122:3;21063:67;:::i;:::-;21056:74;;21139:93;21228:3;21139:93;:::i;:::-;21257:2;21252:3;21248:12;21241:19;;20900:366;;;:::o;21272:419::-;21438:4;21476:2;21465:9;21461:18;21453:26;;21525:9;21519:4;21515:20;21511:1;21500:9;21496:17;21489:47;21553:131;21679:4;21553:131;:::i;:::-;21545:139;;21272:419;;;:::o;21697:194::-;21737:4;21757:20;21775:1;21757:20;:::i;:::-;21752:25;;21791:20;21809:1;21791:20;:::i;:::-;21786:25;;21835:1;21832;21828:9;21820:17;;21859:1;21853:4;21850:11;21847:37;;;21864:18;;:::i;:::-;21847:37;21697:194;;;;:::o;21897:191::-;21937:3;21956:20;21974:1;21956:20;:::i;:::-;21951:25;;21990:20;22008:1;21990:20;:::i;:::-;21985:25;;22033:1;22030;22026:9;22019:16;;22054:3;22051:1;22048:10;22045:36;;;22061:18;;:::i;:::-;22045:36;21897:191;;;;:::o;22094:177::-;22234:29;22230:1;22222:6;22218:14;22211:53;22094:177;:::o;22277:366::-;22419:3;22440:67;22504:2;22499:3;22440:67;:::i;:::-;22433:74;;22516:93;22605:3;22516:93;:::i;:::-;22634:2;22629:3;22625:12;22618:19;;22277:366;;;:::o;22649:419::-;22815:4;22853:2;22842:9;22838:18;22830:26;;22902:9;22896:4;22892:20;22888:1;22877:9;22873:17;22866:47;22930:131;23056:4;22930:131;:::i;:::-;22922:139;;22649:419;;;:::o;23074:182::-;23214:34;23210:1;23202:6;23198:14;23191:58;23074:182;:::o;23262:366::-;23404:3;23425:67;23489:2;23484:3;23425:67;:::i;:::-;23418:74;;23501:93;23590:3;23501:93;:::i;:::-;23619:2;23614:3;23610:12;23603:19;;23262:366;;;:::o;23634:419::-;23800:4;23838:2;23827:9;23823:18;23815:26;;23887:9;23881:4;23877:20;23873:1;23862:9;23858:17;23851:47;23915:131;24041:4;23915:131;:::i;:::-;23907:139;;23634:419;;;:::o;24059:221::-;24199:34;24195:1;24187:6;24183:14;24176:58;24268:4;24263:2;24255:6;24251:15;24244:29;24059:221;:::o;24286:366::-;24428:3;24449:67;24513:2;24508:3;24449:67;:::i;:::-;24442:74;;24525:93;24614:3;24525:93;:::i;:::-;24643:2;24638:3;24634:12;24627:19;;24286:366;;;:::o;24658:419::-;24824:4;24862:2;24851:9;24847:18;24839:26;;24911:9;24905:4;24901:20;24897:1;24886:9;24882:17;24875:47;24939:131;25065:4;24939:131;:::i;:::-;24931:139;;24658:419;;;:::o

Swarm Source

ipfs://3b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.