ETH Price: $3,525.70 (+5.10%)
Gas: 7.94 Gwei

Token

Amygdala (AMY)
 

Overview

Max Total Supply

2,500 AMY

Holders

1,235

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 AMY
0x61b2889889591267229b8d05a7893ebe3822a8a0
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:
Amygdala

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-14
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Counters.sol

// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV // Deprecated in v4.8
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. 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.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address, RecoverError)
    {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @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)
    {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs &
            bytes32(
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            );
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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.
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @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 pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * 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 Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n",
                    Strings.toString(s.length),
                    s
                )
            );
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a 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 leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

interface IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 */
interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity >=0.7.0 <0.9.0;

contract Amygdala is ERC721, Ownable {
    using ECDSA for bytes32;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private supply;
    address private signerAddress = 0x3546bba3D0e308894223C828bB2A3664b8748071;
    string public uriPrefix = "";
    string public uriSuffix = ".json";
    string public hiddenMetadataUri;

    uint256 public cost = 0.0 ether;
    uint256 public maxSupply = 2500;
    uint256 public maxMintAmountPerTx = 250;
    uint256 public nftPerAddressLimit = 250;

    bool public paused = false;
    bool public revealed = false;
    bool public onlyWhitelisted = true;

    bytes32 public merkleRoot = 0x1f326643335daabb5d7873451234ca21f4e6b50e79ca2f9c5492309bd37547ff;

    constructor() ERC721("Amygdala", "AMY") {
        setHiddenMetadataUri(
            "ipfs://QmQw6QSnYjqkF23QvJzb5SY2hHfVLNsp27AK7bjHqutvSA/hidden.json"
        );
    }

    modifier mintCompliance(uint256 _mintAmount) {
        require(
            _mintAmount > 0 && _mintAmount <= maxMintAmountPerTx,
            "Invalid mint amount!"
        );
        require(
            supply.current() + _mintAmount <= maxSupply,
            "Max supply exceeded!"
        );
        _;
    }

    function verifyAddressSigner(bytes memory signature)
        private
        view
        returns (bool)
    {
        bytes32 messageHash = keccak256(abi.encodePacked(msg.sender));
        return
            signerAddress ==
            messageHash.toEthSignedMessageHash().recover(signature);
    }

    function totalSupply() public view returns (uint256) {
        return supply.current();
    }

    function mint(uint256 _mintAmount)
        public
        payable
        mintCompliance(_mintAmount)
    {
        require(!paused, "The contract is paused!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        require(!onlyWhitelisted, "Whitelisted is on!");
        uint256 ownerTokenCount = balanceOf(msg.sender);
        require(ownerTokenCount < nftPerAddressLimit, "Max supply exceeded!");
        _mintLoop(msg.sender, _mintAmount);
    }

    function mintForWhitelisted(
        uint256 _mintAmount,
        bytes32[] calldata _merkleProof
    ) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused!");
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        if (onlyWhitelisted == true) {
            require(isWhitelisted(_merkleProof), "User is not whitelisted");
        }
        uint256 ownerTokenCount = balanceOf(msg.sender);
        require(ownerTokenCount < nftPerAddressLimit, "Max supply exceeded!");
        _mintLoop(msg.sender, _mintAmount);
    }

    function mintForWhitelistedContract(
        uint256 _mintAmount,
        bytes memory signature
    ) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused!");
        require(verifyAddressSigner(signature), "SIGNATURE_VALIDATION_FAILED");
        uint256 ownerTokenCount = balanceOf(msg.sender);
        require(ownerTokenCount < nftPerAddressLimit, "Max supply exceeded!");
        _mintLoop(msg.sender, _mintAmount);
    }

    function isWhitelisted(bytes32[] calldata _merkleProof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

    function checkingWhitelisted(
        address sender,
        bytes32[] calldata _merkleProof
    ) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(sender));
        return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

    function mintForAddress(uint256 _mintAmount, address _receiver)
        public
        mintCompliance(_mintAmount)
        onlyOwner
    {
        _mintLoop(_receiver, _mintAmount);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (
            ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply
        ) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return hiddenMetadataUri;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        _tokenId.toString(),
                        uriSuffix
                    )
                )
                : "";
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }

    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx)
        public
        onlyOwner
    {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri)
        public
        onlyOwner
    {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

    function setOnlyWhitelisted(bool _state) public onlyOwner {
        onlyWhitelisted = _state;
    }

    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function withdraw() public onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function _mintLoop(address _receiver, uint256 _mintAmount) internal {
        for (uint256 i = 0; i < _mintAmount; i++) {
            supply.increment();
            _safeMint(_receiver, supply.current());
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkingWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintForWhitelisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintForWhitelistedContract","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600880546001600160a01b031916733546bba3d0e308894223c828bb2a3664b874807117905560a060408190526000608081905262000041916009916200023f565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200007091600a916200023f565b506000600c556109c4600d5560fa600e819055600f556010805462ffffff1916620100001790557f1f326643335daabb5d7873451234ca21f4e6b50e79ca2f9c5492309bd37547ff601155348015620000c857600080fd5b506040805180820182526008815267416d796764616c6160c01b602080830191825283518085019094526003845262414d5960e81b90840152815191929162000114916000916200023f565b5080516200012a9060019060208401906200023f565b50505062000147620001416200017160201b60201c565b62000175565b6200016b6040518060800160405280604181526020016200310260419139620001c7565b62000322565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6006546001600160a01b03163314620002265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200023b90600b9060208401906200023f565b5050565b8280546200024d90620002e5565b90600052602060002090601f016020900481019282620002715760008555620002bc565b82601f106200028c57805160ff1916838001178555620002bc565b82800160010185558215620002bc579182015b82811115620002bc5782518255916020019190600101906200029f565b50620002ca929150620002ce565b5090565b5b80821115620002ca5760008155600101620002cf565b600181811c90821680620002fa57607f821691505b602082108114156200031c57634e487b7160e01b600052602260045260246000fd5b50919050565b612dd080620003326000396000f3fe60806040526004361061027d5760003560e01c806370a082311161014f578063a22cb465116100c1578063d0eb26b01161007a578063d0eb26b014610729578063d5abeb0114610749578063e0a808531461075f578063e985e9c51461077f578063efbd73f4146107c8578063f2fde38b146107e857600080fd5b8063a22cb4651461067e578063a45ba8e71461069e578063b071401b146106b3578063b88d4fde146106d3578063ba7d2c76146106f3578063c87b56dd1461070957600080fd5b80637f89449e116101135780637f89449e146105e25780638da5cb5b1461060257806394354fd01461062057806395d89b41146106365780639c70b5121461064b578063a0712d681461066b57600080fd5b806370a082311461055a578063715018a61461057a5780637892bdad1461058f5780637cb64759146105a25780637ec4a659146105c257600080fd5b80633c952764116101f35780634fdd43cb116101ac5780634fdd43cb146104b757806351830227146104d75780635503a0e8146104f65780635c975abb1461050b57806362b99ad4146105255780636352211e1461053a57600080fd5b80633c952764146104025780633ccfd60b14610422578063403424891461043757806342842e0e1461044a578063438b63001461046a57806344a0d68a1461049757600080fd5b806313faede61161024557806313faede61461035357806316ba10e01461037757806316c38b3c1461039757806318160ddd146103b757806323b872dd146103cc5780632eb4a7ab146103ec57600080fd5b806301ffc9a714610282578063069824fb146102b757806306fdde03146102d7578063081812fc146102f9578063095ea7b314610331575b600080fd5b34801561028e57600080fd5b506102a261029d36600461280f565b610808565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d2366004612799565b61085a565b3480156102e357600080fd5b506102ec6108d9565b6040516102ae9190612aa0565b34801561030557600080fd5b506103196103143660046127f6565b61096b565b6040516001600160a01b0390911681526020016102ae565b34801561033d57600080fd5b5061035161034c36600461276f565b610a05565b005b34801561035f57600080fd5b50610369600c5481565b6040519081526020016102ae565b34801561038357600080fd5b50610351610392366004612849565b610b1b565b3480156103a357600080fd5b506103516103b23660046127db565b610b5c565b3480156103c357600080fd5b50610369610b99565b3480156103d857600080fd5b506103516103e736600461264e565b610ba9565b3480156103f857600080fd5b5061036960115481565b34801561040e57600080fd5b5061035161041d3660046127db565b610bda565b34801561042e57600080fd5b50610351610c20565b6103516104453660046128e8565b610cbe565b34801561045657600080fd5b5061035161046536600461264e565b610dd8565b34801561047657600080fd5b5061048a610485366004612600565b610df3565b6040516102ae9190612a5c565b3480156104a357600080fd5b506103516104b23660046127f6565b610ed4565b3480156104c357600080fd5b506103516104d2366004612849565b610f03565b3480156104e357600080fd5b506010546102a290610100900460ff1681565b34801561050257600080fd5b506102ec610f40565b34801561051757600080fd5b506010546102a29060ff1681565b34801561053157600080fd5b506102ec610fce565b34801561054657600080fd5b506103196105553660046127f6565b610fdb565b34801561056657600080fd5b50610369610575366004612600565b611052565b34801561058657600080fd5b506103516110d9565b61035161059d3660046128b5565b61110f565b3480156105ae57600080fd5b506103516105bd3660046127f6565b611294565b3480156105ce57600080fd5b506103516105dd366004612849565b6112c3565b3480156105ee57600080fd5b506102a26105fd3660046126f2565b611300565b34801561060e57600080fd5b506006546001600160a01b0316610319565b34801561062c57600080fd5b50610369600e5481565b34801561064257600080fd5b506102ec611381565b34801561065757600080fd5b506010546102a29062010000900460ff1681565b6103516106793660046127f6565b611390565b34801561068a57600080fd5b50610351610699366004612745565b6114f0565b3480156106aa57600080fd5b506102ec6114fb565b3480156106bf57600080fd5b506103516106ce3660046127f6565b611508565b3480156106df57600080fd5b506103516106ee36600461268a565b611537565b3480156106ff57600080fd5b50610369600f5481565b34801561071557600080fd5b506102ec6107243660046127f6565b611569565b34801561073557600080fd5b506103516107443660046127f6565b6116e8565b34801561075557600080fd5b50610369600d5481565b34801561076b57600080fd5b5061035161077a3660046127db565b611717565b34801561078b57600080fd5b506102a261079a36600461261b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d457600080fd5b506103516107e3366004612892565b61175b565b3480156107f457600080fd5b50610351610803366004612600565b6117f3565b60006001600160e01b031982166380ac58cd60e01b148061083957506001600160e01b03198216635b5e139f60e01b145b8061085457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516001600160601b03193360601b16602082015260009081906034016040516020818303038152906040528051906020012090506108d184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061188b565b949350505050565b6060600080546108e890612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461091490612cac565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1082610fdb565b9050806001600160a01b0316836001600160a01b03161415610a7e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e0565b336001600160a01b0382161480610a9a5750610a9a813361079a565b610b0c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e0565b610b1683836118a1565b505050565b6006546001600160a01b03163314610b455760405162461bcd60e51b81526004016109e090612b33565b8051610b5890600a906020840190612460565b5050565b6006546001600160a01b03163314610b865760405162461bcd60e51b81526004016109e090612b33565b6010805460ff1916911515919091179055565b6000610ba460075490565b905090565b610bb3338261190f565b610bcf5760405162461bcd60e51b81526004016109e090612bcd565b610b16838383611a02565b6006546001600160a01b03163314610c045760405162461bcd60e51b81526004016109e090612b33565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b03163314610c4a5760405162461bcd60e51b81526004016109e090612b33565b6000610c5e6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610ca8576040519150601f19603f3d011682016040523d82523d6000602084013e610cad565b606091505b5050905080610cbb57600080fd5b50565b81600081118015610cd15750600e548111155b610ced5760405162461bcd60e51b81526004016109e090612b05565b600d5481610cfa60075490565b610d049190612c1e565b1115610d225760405162461bcd60e51b81526004016109e090612b9f565b60105460ff1615610d455760405162461bcd60e51b81526004016109e090612b68565b610d4e82611ba2565b610d9a5760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016109e0565b6000610da533611052565b9050600f548110610dc85760405162461bcd60e51b81526004016109e090612b9f565b610dd23385611c3e565b50505050565b610b1683838360405180602001604052806000815250611537565b60606000610e0083611052565b905060008167ffffffffffffffff811115610e1d57610e1d612d6e565b604051908082528060200260200182016040528015610e46578160200160208202803683370190505b509050600160005b8381108015610e5f5750600d548211155b15610eca576000610e6f83610fdb565b9050866001600160a01b0316816001600160a01b03161415610eb75782848381518110610e9e57610e9e612d58565b602090810291909101015281610eb381612ce7565b9250505b82610ec181612ce7565b93505050610e4e565b5090949350505050565b6006546001600160a01b03163314610efe5760405162461bcd60e51b81526004016109e090612b33565b600c55565b6006546001600160a01b03163314610f2d5760405162461bcd60e51b81526004016109e090612b33565b8051610b5890600b906020840190612460565b600a8054610f4d90612cac565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990612cac565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b505050505081565b60098054610f4d90612cac565b6000818152600260205260408120546001600160a01b0316806108545760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e0565b60006001600160a01b0382166110bd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e0565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111035760405162461bcd60e51b81526004016109e090612b33565b61110d6000611c7b565b565b826000811180156111225750600e548111155b61113e5760405162461bcd60e51b81526004016109e090612b05565b600d548161114b60075490565b6111559190612c1e565b11156111735760405162461bcd60e51b81526004016109e090612b9f565b60105460ff16156111965760405162461bcd60e51b81526004016109e090612b68565b83600c546111a49190612c4a565b3410156111e95760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109e0565b60105462010000900460ff1615156001141561125557611209838361085a565b6112555760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c697374656400000000000000000060448201526064016109e0565b600061126033611052565b9050600f5481106112835760405162461bcd60e51b81526004016109e090612b9f565b61128d3386611c3e565b5050505050565b6006546001600160a01b031633146112be5760405162461bcd60e51b81526004016109e090612b33565b601155565b6006546001600160a01b031633146112ed5760405162461bcd60e51b81526004016109e090612b33565b8051610b58906009906020840190612460565b6040516001600160601b0319606085901b166020820152600090819060340160405160208183030381529060405280519060200120905061137884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061188b565b95945050505050565b6060600180546108e890612cac565b806000811180156113a35750600e548111155b6113bf5760405162461bcd60e51b81526004016109e090612b05565b600d54816113cc60075490565b6113d69190612c1e565b11156113f45760405162461bcd60e51b81526004016109e090612b9f565b60105460ff16156114175760405162461bcd60e51b81526004016109e090612b68565b81600c546114259190612c4a565b34101561146a5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109e0565b60105462010000900460ff16156114b85760405162461bcd60e51b815260206004820152601260248201527157686974656c6973746564206973206f6e2160701b60448201526064016109e0565b60006114c333611052565b9050600f5481106114e65760405162461bcd60e51b81526004016109e090612b9f565b610b163384611c3e565b610b58338383611ccd565b600b8054610f4d90612cac565b6006546001600160a01b031633146115325760405162461bcd60e51b81526004016109e090612b33565b600e55565b611541338361190f565b61155d5760405162461bcd60e51b81526004016109e090612bcd565b610dd284848484611d9c565b6000818152600260205260409020546060906001600160a01b03166115e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e0565b601054610100900460ff1661168957600b805461160490612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461163090612cac565b801561167d5780601f106116525761010080835404028352916020019161167d565b820191906000526020600020905b81548152906001019060200180831161166057829003601f168201915b50505050509050919050565b6000611693611dcf565b905060008151116116b357604051806020016040528060008152506116e1565b806116bd84611dde565b600a6040516020016116d19392919061295b565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146117125760405162461bcd60e51b81526004016109e090612b33565b600f55565b6006546001600160a01b031633146117415760405162461bcd60e51b81526004016109e090612b33565b601080549115156101000261ff0019909216919091179055565b8160008111801561176e5750600e548111155b61178a5760405162461bcd60e51b81526004016109e090612b05565b600d548161179760075490565b6117a19190612c1e565b11156117bf5760405162461bcd60e51b81526004016109e090612b9f565b6006546001600160a01b031633146117e95760405162461bcd60e51b81526004016109e090612b33565b610b168284611c3e565b6006546001600160a01b0316331461181d5760405162461bcd60e51b81526004016109e090612b33565b6001600160a01b0381166118825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e0565b610cbb81611c7b565b6000826118988584611edc565b14949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d682610fdb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e0565b600061199383610fdb565b9050806001600160a01b0316846001600160a01b031614806119ce5750836001600160a01b03166119c38461096b565b6001600160a01b0316145b806108d157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166108d1565b826001600160a01b0316611a1582610fdb565b6001600160a01b031614611a7d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e0565b6001600160a01b038216611adf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e0565b611aea6000826118a1565b6001600160a01b0383166000908152600360205260408120805460019290611b13908490612c69565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b41908490612c1e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080513360601b6001600160601b031916602080830191909152825160148184030181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190611c269084611f50565b6008546001600160a01b039081169116149392505050565b60005b81811015610b1657611c57600780546001019055565b611c6983611c6460075490565b611f6c565b80611c7381612ce7565b915050611c41565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d2f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e0565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611da7848484611a02565b611db384848484611f86565b610dd25760405162461bcd60e51b81526004016109e090612ab3565b6060600980546108e890612cac565b606081611e025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e2c5780611e1681612ce7565b9150611e259050600a83612c36565b9150611e06565b60008167ffffffffffffffff811115611e4757611e47612d6e565b6040519080825280601f01601f191660200182016040528015611e71576020820181803683370190505b5090505b84156108d157611e86600183612c69565b9150611e93600a86612d02565b611e9e906030612c1e565b60f81b818381518110611eb357611eb3612d58565b60200101906001600160f81b031916908160001a905350611ed5600a86612c36565b9450611e75565b600081815b8451811015611f48576000858281518110611efe57611efe612d58565b60200260200101519050808311611f245760008381526020829052604090209250611f35565b600081815260208490526040902092505b5080611f4081612ce7565b915050611ee1565b509392505050565b6000806000611f5f8585612093565b91509150611f48816120d9565b610b58828260405180602001604052806000815250612227565b60006001600160a01b0384163b1561208857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fca903390899088908890600401612a1f565b602060405180830381600087803b158015611fe457600080fd5b505af1925050508015612014575060408051601f3d908101601f191682019092526120119181019061282c565b60015b61206e573d808015612042576040519150601f19603f3d011682016040523d82523d6000602084013e612047565b606091505b5080516120665760405162461bcd60e51b81526004016109e090612ab3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506108d1565b506001949350505050565b6000808251604114156120ca5760208301516040840151606085015160001a6120be8782858561225a565b945094505050506120d2565b506000905060025b9250929050565b60008160048111156120ed576120ed612d42565b14156120f65750565b600181600481111561210a5761210a612d42565b14156121585760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e0565b600281600481111561216c5761216c612d42565b14156121ba5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e0565b60038160048111156121ce576121ce612d42565b1415610cbb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e0565b612231838361231e565b61223e6000848484611f86565b610b165760405162461bcd60e51b81526004016109e090612ab3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122915750600090506003612315565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122e5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661230e57600060019250925050612315565b9150600090505b94509492505050565b6001600160a01b0382166123745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e0565b6000818152600260205260409020546001600160a01b0316156123d95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e0565b6001600160a01b0382166000908152600360205260408120805460019290612402908490612c1e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461246c90612cac565b90600052602060002090601f01602090048101928261248e57600085556124d4565b82601f106124a757805160ff19168380011785556124d4565b828001600101855582156124d4579182015b828111156124d45782518255916020019190600101906124b9565b506124e09291506124e4565b5090565b5b808211156124e057600081556001016124e5565b600067ffffffffffffffff8084111561251457612514612d6e565b604051601f8501601f19908116603f0116810190828211818310171561253c5761253c612d6e565b8160405280935085815286868601111561255557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461258657600080fd5b919050565b60008083601f84011261259d57600080fd5b50813567ffffffffffffffff8111156125b557600080fd5b6020830191508360208260051b85010111156120d257600080fd5b8035801515811461258657600080fd5b600082601f8301126125f157600080fd5b6116e1838335602085016124f9565b60006020828403121561261257600080fd5b6116e18261256f565b6000806040838503121561262e57600080fd5b6126378361256f565b91506126456020840161256f565b90509250929050565b60008060006060848603121561266357600080fd5b61266c8461256f565b925061267a6020850161256f565b9150604084013590509250925092565b600080600080608085870312156126a057600080fd5b6126a98561256f565b93506126b76020860161256f565b925060408501359150606085013567ffffffffffffffff8111156126da57600080fd5b6126e6878288016125e0565b91505092959194509250565b60008060006040848603121561270757600080fd5b6127108461256f565b9250602084013567ffffffffffffffff81111561272c57600080fd5b6127388682870161258b565b9497909650939450505050565b6000806040838503121561275857600080fd5b6127618361256f565b9150612645602084016125d0565b6000806040838503121561278257600080fd5b61278b8361256f565b946020939093013593505050565b600080602083850312156127ac57600080fd5b823567ffffffffffffffff8111156127c357600080fd5b6127cf8582860161258b565b90969095509350505050565b6000602082840312156127ed57600080fd5b6116e1826125d0565b60006020828403121561280857600080fd5b5035919050565b60006020828403121561282157600080fd5b81356116e181612d84565b60006020828403121561283e57600080fd5b81516116e181612d84565b60006020828403121561285b57600080fd5b813567ffffffffffffffff81111561287257600080fd5b8201601f8101841361288357600080fd5b6108d1848235602084016124f9565b600080604083850312156128a557600080fd5b823591506126456020840161256f565b6000806000604084860312156128ca57600080fd5b83359250602084013567ffffffffffffffff81111561272c57600080fd5b600080604083850312156128fb57600080fd5b82359150602083013567ffffffffffffffff81111561291957600080fd5b612925858286016125e0565b9150509250929050565b60008151808452612947816020860160208601612c80565b601f01601f19169290920160200192915050565b60008451602061296e8285838a01612c80565b8551918401916129818184848a01612c80565b8554920191600090600181811c908083168061299e57607f831692505b8583108114156129bc57634e487b7160e01b85526022600452602485fd5b8080156129d057600181146129e157612a0e565b60ff19851688528388019550612a0e565b60008b81526020902060005b85811015612a065781548a8201529084019088016129ed565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a529083018461292f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a9457835183529284019291840191600101612a78565b50909695505050505050565b6020815260006116e1602083018461292f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612c3157612c31612d16565b500190565b600082612c4557612c45612d2c565b500490565b6000816000190483118215151615612c6457612c64612d16565b500290565b600082821015612c7b57612c7b612d16565b500390565b60005b83811015612c9b578181015183820152602001612c83565b83811115610dd25750506000910152565b600181811c90821680612cc057607f821691505b60208210811415612ce157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cfb57612cfb612d16565b5060010190565b600082612d1157612d11612d2c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cbb57600080fdfea2646970667358221220742cc37d6159442b6813f325688b7d814301effe18325cd2c447969c9b8eb8be64736f6c63430008070033697066733a2f2f516d51773651536e596a716b46323351764a7a6235535932684866564c4e73703237414b37626a487175747653412f68696464656e2e6a736f6e

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806370a082311161014f578063a22cb465116100c1578063d0eb26b01161007a578063d0eb26b014610729578063d5abeb0114610749578063e0a808531461075f578063e985e9c51461077f578063efbd73f4146107c8578063f2fde38b146107e857600080fd5b8063a22cb4651461067e578063a45ba8e71461069e578063b071401b146106b3578063b88d4fde146106d3578063ba7d2c76146106f3578063c87b56dd1461070957600080fd5b80637f89449e116101135780637f89449e146105e25780638da5cb5b1461060257806394354fd01461062057806395d89b41146106365780639c70b5121461064b578063a0712d681461066b57600080fd5b806370a082311461055a578063715018a61461057a5780637892bdad1461058f5780637cb64759146105a25780637ec4a659146105c257600080fd5b80633c952764116101f35780634fdd43cb116101ac5780634fdd43cb146104b757806351830227146104d75780635503a0e8146104f65780635c975abb1461050b57806362b99ad4146105255780636352211e1461053a57600080fd5b80633c952764146104025780633ccfd60b14610422578063403424891461043757806342842e0e1461044a578063438b63001461046a57806344a0d68a1461049757600080fd5b806313faede61161024557806313faede61461035357806316ba10e01461037757806316c38b3c1461039757806318160ddd146103b757806323b872dd146103cc5780632eb4a7ab146103ec57600080fd5b806301ffc9a714610282578063069824fb146102b757806306fdde03146102d7578063081812fc146102f9578063095ea7b314610331575b600080fd5b34801561028e57600080fd5b506102a261029d36600461280f565b610808565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d2366004612799565b61085a565b3480156102e357600080fd5b506102ec6108d9565b6040516102ae9190612aa0565b34801561030557600080fd5b506103196103143660046127f6565b61096b565b6040516001600160a01b0390911681526020016102ae565b34801561033d57600080fd5b5061035161034c36600461276f565b610a05565b005b34801561035f57600080fd5b50610369600c5481565b6040519081526020016102ae565b34801561038357600080fd5b50610351610392366004612849565b610b1b565b3480156103a357600080fd5b506103516103b23660046127db565b610b5c565b3480156103c357600080fd5b50610369610b99565b3480156103d857600080fd5b506103516103e736600461264e565b610ba9565b3480156103f857600080fd5b5061036960115481565b34801561040e57600080fd5b5061035161041d3660046127db565b610bda565b34801561042e57600080fd5b50610351610c20565b6103516104453660046128e8565b610cbe565b34801561045657600080fd5b5061035161046536600461264e565b610dd8565b34801561047657600080fd5b5061048a610485366004612600565b610df3565b6040516102ae9190612a5c565b3480156104a357600080fd5b506103516104b23660046127f6565b610ed4565b3480156104c357600080fd5b506103516104d2366004612849565b610f03565b3480156104e357600080fd5b506010546102a290610100900460ff1681565b34801561050257600080fd5b506102ec610f40565b34801561051757600080fd5b506010546102a29060ff1681565b34801561053157600080fd5b506102ec610fce565b34801561054657600080fd5b506103196105553660046127f6565b610fdb565b34801561056657600080fd5b50610369610575366004612600565b611052565b34801561058657600080fd5b506103516110d9565b61035161059d3660046128b5565b61110f565b3480156105ae57600080fd5b506103516105bd3660046127f6565b611294565b3480156105ce57600080fd5b506103516105dd366004612849565b6112c3565b3480156105ee57600080fd5b506102a26105fd3660046126f2565b611300565b34801561060e57600080fd5b506006546001600160a01b0316610319565b34801561062c57600080fd5b50610369600e5481565b34801561064257600080fd5b506102ec611381565b34801561065757600080fd5b506010546102a29062010000900460ff1681565b6103516106793660046127f6565b611390565b34801561068a57600080fd5b50610351610699366004612745565b6114f0565b3480156106aa57600080fd5b506102ec6114fb565b3480156106bf57600080fd5b506103516106ce3660046127f6565b611508565b3480156106df57600080fd5b506103516106ee36600461268a565b611537565b3480156106ff57600080fd5b50610369600f5481565b34801561071557600080fd5b506102ec6107243660046127f6565b611569565b34801561073557600080fd5b506103516107443660046127f6565b6116e8565b34801561075557600080fd5b50610369600d5481565b34801561076b57600080fd5b5061035161077a3660046127db565b611717565b34801561078b57600080fd5b506102a261079a36600461261b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107d457600080fd5b506103516107e3366004612892565b61175b565b3480156107f457600080fd5b50610351610803366004612600565b6117f3565b60006001600160e01b031982166380ac58cd60e01b148061083957506001600160e01b03198216635b5e139f60e01b145b8061085457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516001600160601b03193360601b16602082015260009081906034016040516020818303038152906040528051906020012090506108d184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061188b565b949350505050565b6060600080546108e890612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461091490612cac565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a1082610fdb565b9050806001600160a01b0316836001600160a01b03161415610a7e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e0565b336001600160a01b0382161480610a9a5750610a9a813361079a565b610b0c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e0565b610b1683836118a1565b505050565b6006546001600160a01b03163314610b455760405162461bcd60e51b81526004016109e090612b33565b8051610b5890600a906020840190612460565b5050565b6006546001600160a01b03163314610b865760405162461bcd60e51b81526004016109e090612b33565b6010805460ff1916911515919091179055565b6000610ba460075490565b905090565b610bb3338261190f565b610bcf5760405162461bcd60e51b81526004016109e090612bcd565b610b16838383611a02565b6006546001600160a01b03163314610c045760405162461bcd60e51b81526004016109e090612b33565b60108054911515620100000262ff000019909216919091179055565b6006546001600160a01b03163314610c4a5760405162461bcd60e51b81526004016109e090612b33565b6000610c5e6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610ca8576040519150601f19603f3d011682016040523d82523d6000602084013e610cad565b606091505b5050905080610cbb57600080fd5b50565b81600081118015610cd15750600e548111155b610ced5760405162461bcd60e51b81526004016109e090612b05565b600d5481610cfa60075490565b610d049190612c1e565b1115610d225760405162461bcd60e51b81526004016109e090612b9f565b60105460ff1615610d455760405162461bcd60e51b81526004016109e090612b68565b610d4e82611ba2565b610d9a5760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016109e0565b6000610da533611052565b9050600f548110610dc85760405162461bcd60e51b81526004016109e090612b9f565b610dd23385611c3e565b50505050565b610b1683838360405180602001604052806000815250611537565b60606000610e0083611052565b905060008167ffffffffffffffff811115610e1d57610e1d612d6e565b604051908082528060200260200182016040528015610e46578160200160208202803683370190505b509050600160005b8381108015610e5f5750600d548211155b15610eca576000610e6f83610fdb565b9050866001600160a01b0316816001600160a01b03161415610eb75782848381518110610e9e57610e9e612d58565b602090810291909101015281610eb381612ce7565b9250505b82610ec181612ce7565b93505050610e4e565b5090949350505050565b6006546001600160a01b03163314610efe5760405162461bcd60e51b81526004016109e090612b33565b600c55565b6006546001600160a01b03163314610f2d5760405162461bcd60e51b81526004016109e090612b33565b8051610b5890600b906020840190612460565b600a8054610f4d90612cac565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990612cac565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b505050505081565b60098054610f4d90612cac565b6000818152600260205260408120546001600160a01b0316806108545760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e0565b60006001600160a01b0382166110bd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e0565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146111035760405162461bcd60e51b81526004016109e090612b33565b61110d6000611c7b565b565b826000811180156111225750600e548111155b61113e5760405162461bcd60e51b81526004016109e090612b05565b600d548161114b60075490565b6111559190612c1e565b11156111735760405162461bcd60e51b81526004016109e090612b9f565b60105460ff16156111965760405162461bcd60e51b81526004016109e090612b68565b83600c546111a49190612c4a565b3410156111e95760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109e0565b60105462010000900460ff1615156001141561125557611209838361085a565b6112555760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f742077686974656c697374656400000000000000000060448201526064016109e0565b600061126033611052565b9050600f5481106112835760405162461bcd60e51b81526004016109e090612b9f565b61128d3386611c3e565b5050505050565b6006546001600160a01b031633146112be5760405162461bcd60e51b81526004016109e090612b33565b601155565b6006546001600160a01b031633146112ed5760405162461bcd60e51b81526004016109e090612b33565b8051610b58906009906020840190612460565b6040516001600160601b0319606085901b166020820152600090819060340160405160208183030381529060405280519060200120905061137884848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915084905061188b565b95945050505050565b6060600180546108e890612cac565b806000811180156113a35750600e548111155b6113bf5760405162461bcd60e51b81526004016109e090612b05565b600d54816113cc60075490565b6113d69190612c1e565b11156113f45760405162461bcd60e51b81526004016109e090612b9f565b60105460ff16156114175760405162461bcd60e51b81526004016109e090612b68565b81600c546114259190612c4a565b34101561146a5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016109e0565b60105462010000900460ff16156114b85760405162461bcd60e51b815260206004820152601260248201527157686974656c6973746564206973206f6e2160701b60448201526064016109e0565b60006114c333611052565b9050600f5481106114e65760405162461bcd60e51b81526004016109e090612b9f565b610b163384611c3e565b610b58338383611ccd565b600b8054610f4d90612cac565b6006546001600160a01b031633146115325760405162461bcd60e51b81526004016109e090612b33565b600e55565b611541338361190f565b61155d5760405162461bcd60e51b81526004016109e090612bcd565b610dd284848484611d9c565b6000818152600260205260409020546060906001600160a01b03166115e85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109e0565b601054610100900460ff1661168957600b805461160490612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461163090612cac565b801561167d5780601f106116525761010080835404028352916020019161167d565b820191906000526020600020905b81548152906001019060200180831161166057829003601f168201915b50505050509050919050565b6000611693611dcf565b905060008151116116b357604051806020016040528060008152506116e1565b806116bd84611dde565b600a6040516020016116d19392919061295b565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146117125760405162461bcd60e51b81526004016109e090612b33565b600f55565b6006546001600160a01b031633146117415760405162461bcd60e51b81526004016109e090612b33565b601080549115156101000261ff0019909216919091179055565b8160008111801561176e5750600e548111155b61178a5760405162461bcd60e51b81526004016109e090612b05565b600d548161179760075490565b6117a19190612c1e565b11156117bf5760405162461bcd60e51b81526004016109e090612b9f565b6006546001600160a01b031633146117e95760405162461bcd60e51b81526004016109e090612b33565b610b168284611c3e565b6006546001600160a01b0316331461181d5760405162461bcd60e51b81526004016109e090612b33565b6001600160a01b0381166118825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e0565b610cbb81611c7b565b6000826118988584611edc565b14949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906118d682610fdb565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166119885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e0565b600061199383610fdb565b9050806001600160a01b0316846001600160a01b031614806119ce5750836001600160a01b03166119c38461096b565b6001600160a01b0316145b806108d157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166108d1565b826001600160a01b0316611a1582610fdb565b6001600160a01b031614611a7d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e0565b6001600160a01b038216611adf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e0565b611aea6000826118a1565b6001600160a01b0383166000908152600360205260408120805460019290611b13908490612c69565b90915550506001600160a01b0382166000908152600360205260408120805460019290611b41908490612c1e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080513360601b6001600160601b031916602080830191909152825160148184030181526034830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060548401526070808401829052845180850390910181526090909301909352815191012060009190611c269084611f50565b6008546001600160a01b039081169116149392505050565b60005b81811015610b1657611c57600780546001019055565b611c6983611c6460075490565b611f6c565b80611c7381612ce7565b915050611c41565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d2f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e0565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611da7848484611a02565b611db384848484611f86565b610dd25760405162461bcd60e51b81526004016109e090612ab3565b6060600980546108e890612cac565b606081611e025750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e2c5780611e1681612ce7565b9150611e259050600a83612c36565b9150611e06565b60008167ffffffffffffffff811115611e4757611e47612d6e565b6040519080825280601f01601f191660200182016040528015611e71576020820181803683370190505b5090505b84156108d157611e86600183612c69565b9150611e93600a86612d02565b611e9e906030612c1e565b60f81b818381518110611eb357611eb3612d58565b60200101906001600160f81b031916908160001a905350611ed5600a86612c36565b9450611e75565b600081815b8451811015611f48576000858281518110611efe57611efe612d58565b60200260200101519050808311611f245760008381526020829052604090209250611f35565b600081815260208490526040902092505b5080611f4081612ce7565b915050611ee1565b509392505050565b6000806000611f5f8585612093565b91509150611f48816120d9565b610b58828260405180602001604052806000815250612227565b60006001600160a01b0384163b1561208857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611fca903390899088908890600401612a1f565b602060405180830381600087803b158015611fe457600080fd5b505af1925050508015612014575060408051601f3d908101601f191682019092526120119181019061282c565b60015b61206e573d808015612042576040519150601f19603f3d011682016040523d82523d6000602084013e612047565b606091505b5080516120665760405162461bcd60e51b81526004016109e090612ab3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506108d1565b506001949350505050565b6000808251604114156120ca5760208301516040840151606085015160001a6120be8782858561225a565b945094505050506120d2565b506000905060025b9250929050565b60008160048111156120ed576120ed612d42565b14156120f65750565b600181600481111561210a5761210a612d42565b14156121585760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e0565b600281600481111561216c5761216c612d42565b14156121ba5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e0565b60038160048111156121ce576121ce612d42565b1415610cbb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e0565b612231838361231e565b61223e6000848484611f86565b610b165760405162461bcd60e51b81526004016109e090612ab3565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122915750600090506003612315565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122e5573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661230e57600060019250925050612315565b9150600090505b94509492505050565b6001600160a01b0382166123745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e0565b6000818152600260205260409020546001600160a01b0316156123d95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e0565b6001600160a01b0382166000908152600360205260408120805460019290612402908490612c1e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461246c90612cac565b90600052602060002090601f01602090048101928261248e57600085556124d4565b82601f106124a757805160ff19168380011785556124d4565b828001600101855582156124d4579182015b828111156124d45782518255916020019190600101906124b9565b506124e09291506124e4565b5090565b5b808211156124e057600081556001016124e5565b600067ffffffffffffffff8084111561251457612514612d6e565b604051601f8501601f19908116603f0116810190828211818310171561253c5761253c612d6e565b8160405280935085815286868601111561255557600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461258657600080fd5b919050565b60008083601f84011261259d57600080fd5b50813567ffffffffffffffff8111156125b557600080fd5b6020830191508360208260051b85010111156120d257600080fd5b8035801515811461258657600080fd5b600082601f8301126125f157600080fd5b6116e1838335602085016124f9565b60006020828403121561261257600080fd5b6116e18261256f565b6000806040838503121561262e57600080fd5b6126378361256f565b91506126456020840161256f565b90509250929050565b60008060006060848603121561266357600080fd5b61266c8461256f565b925061267a6020850161256f565b9150604084013590509250925092565b600080600080608085870312156126a057600080fd5b6126a98561256f565b93506126b76020860161256f565b925060408501359150606085013567ffffffffffffffff8111156126da57600080fd5b6126e6878288016125e0565b91505092959194509250565b60008060006040848603121561270757600080fd5b6127108461256f565b9250602084013567ffffffffffffffff81111561272c57600080fd5b6127388682870161258b565b9497909650939450505050565b6000806040838503121561275857600080fd5b6127618361256f565b9150612645602084016125d0565b6000806040838503121561278257600080fd5b61278b8361256f565b946020939093013593505050565b600080602083850312156127ac57600080fd5b823567ffffffffffffffff8111156127c357600080fd5b6127cf8582860161258b565b90969095509350505050565b6000602082840312156127ed57600080fd5b6116e1826125d0565b60006020828403121561280857600080fd5b5035919050565b60006020828403121561282157600080fd5b81356116e181612d84565b60006020828403121561283e57600080fd5b81516116e181612d84565b60006020828403121561285b57600080fd5b813567ffffffffffffffff81111561287257600080fd5b8201601f8101841361288357600080fd5b6108d1848235602084016124f9565b600080604083850312156128a557600080fd5b823591506126456020840161256f565b6000806000604084860312156128ca57600080fd5b83359250602084013567ffffffffffffffff81111561272c57600080fd5b600080604083850312156128fb57600080fd5b82359150602083013567ffffffffffffffff81111561291957600080fd5b612925858286016125e0565b9150509250929050565b60008151808452612947816020860160208601612c80565b601f01601f19169290920160200192915050565b60008451602061296e8285838a01612c80565b8551918401916129818184848a01612c80565b8554920191600090600181811c908083168061299e57607f831692505b8583108114156129bc57634e487b7160e01b85526022600452602485fd5b8080156129d057600181146129e157612a0e565b60ff19851688528388019550612a0e565b60008b81526020902060005b85811015612a065781548a8201529084019088016129ed565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a529083018461292f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612a9457835183529284019291840191600101612a78565b50909695505050505050565b6020815260006116e1602083018461292f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b602080825260149082015273496e76616c6964206d696e7420616d6f756e742160601b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f54686520636f6e74726163742069732070617573656421000000000000000000604082015260600190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612c3157612c31612d16565b500190565b600082612c4557612c45612d2c565b500490565b6000816000190483118215151615612c6457612c64612d16565b500290565b600082821015612c7b57612c7b612d16565b500390565b60005b83811015612c9b578181015183820152602001612c83565b83811115610dd25750506000910152565b600181811c90821680612cc057607f821691505b60208210811415612ce157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cfb57612cfb612d16565b5060010190565b600082612d1157612d11612d2c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cbb57600080fdfea2646970667358221220742cc37d6159442b6813f325688b7d814301effe18325cd2c447969c9b8eb8be64736f6c63430008070033

Deployed Bytecode Sourcemap

31298:7187:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23034:355;;;;;;;;;;-1:-1:-1;23034:355:0;;;;;:::i;:::-;;:::i;:::-;;;11199:14:1;;11192:22;11174:41;;11162:2;11147:18;23034:355:0;;;;;;;;34580:256;;;;;;;;;;-1:-1:-1;34580:256:0;;;;;:::i;:::-;;:::i;24034:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25251:308::-;;;;;;;;;;-1:-1:-1;25251:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9860:32:1;;;9842:51;;9830:2;9815:18;25251:308:0;9696:203:1;24832:411:0;;;;;;;;;;-1:-1:-1;24832:411:0;;;;;:::i;:::-;;:::i;:::-;;31682:31;;;;;;;;;;;;;;;;;;;11372:25:1;;;11360:2;11345:18;31682:31:0;11226:177:1;37557:106:0;;;;;;;;;;-1:-1:-1;37557:106:0;;;;;:::i;:::-;;:::i;37671:83::-;;;;;;;;;;-1:-1:-1;37671:83:0;;;;;:::i;:::-;;:::i;32893:95::-;;;;;;;;;;;;;:::i;25984:376::-;;;;;;;;;;-1:-1:-1;25984:376:0;;;;;:::i;:::-;;:::i;31963:94::-;;;;;;;;;;;;;;;;37762:101;;;;;;;;;;-1:-1:-1;37762:101:0;;;;;:::i;:::-;;:::i;37983:147::-;;;;;;;;;;;;;:::i;34097:475::-;;;;;;:::i;:::-;;:::i;26368:185::-;;;;;;;;;;-1:-1:-1;26368:185:0;;;;;:::i;:::-;;:::i;35320:743::-;;;;;;;;;;-1:-1:-1;35320:743:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37019:80::-;;;;;;;;;;-1:-1:-1;37019:80:0;;;;;:::i;:::-;;:::i;37274:161::-;;;;;;;;;;-1:-1:-1;37274:161:0;;;;;:::i;:::-;;:::i;31885:28::-;;;;;;;;;;-1:-1:-1;31885:28:0;;;;;;;;;;;31602:33;;;;;;;;;;;;;:::i;31852:26::-;;;;;;;;;;-1:-1:-1;31852:26:0;;;;;;;;31567:28;;;;;;;;;;;;;:::i;23700:326::-;;;;;;;;;;-1:-1:-1;23700:326:0;;;;;:::i;:::-;;:::i;23397:295::-;;;;;;;;;;-1:-1:-1;23397:295:0;;;;;:::i;:::-;;:::i;12465:103::-;;;;;;;;;;;;;:::i;33491:598::-;;;;;;:::i;:::-;;:::i;37871:104::-;;;;;;;;;;-1:-1:-1;37871:104:0;;;;;:::i;:::-;;:::i;37443:106::-;;;;;;;;;;-1:-1:-1;37443:106:0;;;;;:::i;:::-;;:::i;34844:267::-;;;;;;;;;;-1:-1:-1;34844:267:0;;;;;:::i;:::-;;:::i;12242:87::-;;;;;;;;;;-1:-1:-1;12315:6:0;;-1:-1:-1;;;;;12315:6:0;12242:87;;31758:39;;;;;;;;;;;;;;;;24142:104;;;;;;;;;;;;;:::i;31920:34::-;;;;;;;;;;-1:-1:-1;31920:34:0;;;;;;;;;;;32996:487;;;;;;:::i;:::-;;:::i;25567:187::-;;;;;;;;;;-1:-1:-1;25567:187:0;;;;;:::i;:::-;;:::i;31642:31::-;;;;;;;;;;;;;:::i;37107:159::-;;;;;;;;;;-1:-1:-1;37107:159:0;;;;;:::i;:::-;;:::i;26561:365::-;;;;;;;;;;-1:-1:-1;26561:365:0;;;;;:::i;:::-;;:::i;31804:39::-;;;;;;;;;;;;;;;;36071:727;;;;;;;;;;-1:-1:-1;36071:727:0;;;;;:::i;:::-;;:::i;36901:110::-;;;;;;;;;;-1:-1:-1;36901:110:0;;;;;:::i;:::-;;:::i;31720:31::-;;;;;;;;;;;;;;;;36806:87;;;;;;;;;;-1:-1:-1;36806:87:0;;;;;:::i;:::-;;:::i;25762:214::-;;;;;;;;;;-1:-1:-1;25762:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;25933:25:0;;;25904:4;25933:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25762:214;35119:193;;;;;;;;;;-1:-1:-1;35119:193:0;;;;;:::i;:::-;;:::i;12576:238::-;;;;;;;;;;-1:-1:-1;12576:238:0;;;;;:::i;:::-;;:::i;23034:355::-;23181:4;-1:-1:-1;;;;;;23223:40:0;;-1:-1:-1;;;23223:40:0;;:105;;-1:-1:-1;;;;;;;23280:48:0;;-1:-1:-1;;;23280:48:0;23223:105;:158;;;-1:-1:-1;;;;;;;;;;20247:40:0;;;23345:36;23203:178;23034:355;-1:-1:-1;;23034:355:0:o;34580:256::-;34731:28;;-1:-1:-1;;;;;;34748:10:0;7484:2:1;7480:15;7476:53;34731:28:0;;;7464:66:1;34684:4:0;;;;7546:12:1;;34731:28:0;;;;;;;;;;;;34721:39;;;;;;34706:54;;34778:50;34797:12;;34778:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34811:10:0;;;-1:-1:-1;34823:4:0;;-1:-1:-1;34778:18:0;:50::i;:::-;34771:57;34580:256;-1:-1:-1;;;;34580:256:0:o;24034:100::-;24088:13;24121:5;24114:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24034:100;:::o;25251:308::-;25372:7;27383:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27383:16:0;25397:110;;;;-1:-1:-1;;;25397:110:0;;18719:2:1;25397:110:0;;;18701:21:1;18758:2;18738:18;;;18731:30;18797:34;18777:18;;;18770:62;-1:-1:-1;;;18848:18:1;;;18841:42;18900:19;;25397:110:0;;;;;;;;;-1:-1:-1;25527:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25527:24:0;;25251:308::o;24832:411::-;24913:13;24929:23;24944:7;24929:14;:23::i;:::-;24913:39;;24977:5;-1:-1:-1;;;;;24971:11:0;:2;-1:-1:-1;;;;;24971:11:0;;;24963:57;;;;-1:-1:-1;;;24963:57:0;;20671:2:1;24963:57:0;;;20653:21:1;20710:2;20690:18;;;20683:30;20749:34;20729:18;;;20722:62;-1:-1:-1;;;20800:18:1;;;20793:31;20841:19;;24963:57:0;20469:397:1;24963:57:0;2702:10;-1:-1:-1;;;;;25055:21:0;;;;:62;;-1:-1:-1;25080:37:0;25097:5;2702:10;25762:214;:::i;25080:37::-;25033:168;;;;-1:-1:-1;;;25033:168:0;;16765:2:1;25033:168:0;;;16747:21:1;16804:2;16784:18;;;16777:30;16843:34;16823:18;;;16816:62;16914:26;16894:18;;;16887:54;16958:19;;25033:168:0;16563:420:1;25033:168:0;25214:21;25223:2;25227:7;25214:8;:21::i;:::-;24902:341;24832:411;;:::o;37557:106::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37633:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;37557:106:::0;:::o;37671:83::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37731:6:::1;:15:::0;;-1:-1:-1;;37731:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37671:83::o;32893:95::-;32937:7;32964:16;:6;346:14;;254:114;32964:16;32957:23;;32893:95;:::o;25984:376::-;26193:41;2702:10;26226:7;26193:18;:41::i;:::-;26171:140;;;;-1:-1:-1;;;26171:140:0;;;;;;;:::i;:::-;26324:28;26334:4;26340:2;26344:7;26324:9;:28::i;37762:101::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37831:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;37831:24:0;;::::1;::::0;;;::::1;::::0;;37762:101::o;37983:147::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;38032:7:::1;38053;12315:6:::0;;-1:-1:-1;;;;;12315:6:0;;12242:87;38053:7:::1;-1:-1:-1::0;;;;;38045:21:0::1;38074;38045:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38031:69;;;38119:2;38111:11;;;::::0;::::1;;38020:110;37983:147::o:0;34097:475::-;34233:11;32338:1;32324:11;:15;:52;;;;;32358:18;;32343:11;:33;;32324:52;32302:122;;;;-1:-1:-1;;;32302:122:0;;;;;;;:::i;:::-;32491:9;;32476:11;32457:16;:6;346:14;;254:114;32457:16;:30;;;;:::i;:::-;:43;;32435:113;;;;-1:-1:-1;;;32435:113:0;;;;;;;:::i;:::-;34266:6:::1;::::0;::::1;;34265:7;34257:43;;;;-1:-1:-1::0;;;34257:43:0::1;;;;;;;:::i;:::-;34319:30;34339:9;34319:19;:30::i;:::-;34311:70;;;::::0;-1:-1:-1;;;34311:70:0;;16057:2:1;34311:70:0::1;::::0;::::1;16039:21:1::0;16096:2;16076:18;;;16069:30;16135:29;16115:18;;;16108:57;16182:18;;34311:70:0::1;15855:351:1::0;34311:70:0::1;34392:23;34418:21;34428:10;34418:9;:21::i;:::-;34392:47;;34476:18;;34458:15;:36;34450:69;;;;-1:-1:-1::0;;;34450:69:0::1;;;;;;;:::i;:::-;34530:34;34540:10;34552:11;34530:9;:34::i;:::-;34246:326;34097:475:::0;;;:::o;26368:185::-;26506:39;26523:4;26529:2;26533:7;26506:39;;;;;;;;;;;;:16;:39::i;35320:743::-;35407:16;35441:23;35467:17;35477:6;35467:9;:17::i;:::-;35441:43;;35495:30;35542:15;35528:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35528:30:0;-1:-1:-1;35495:63:0;-1:-1:-1;35594:1:0;35569:22;35646:377;35685:15;35667;:33;:64;;;;;35722:9;;35704:14;:27;;35667:64;35646:377;;;35758:25;35786:23;35794:14;35786:7;:23::i;:::-;35758:51;;35851:6;-1:-1:-1;;;;;35830:27:0;:17;-1:-1:-1;;;;;35830:27:0;;35826:153;;;35911:14;35878:13;35892:15;35878:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;35946:17;;;;:::i;:::-;;;;35826:153;35995:16;;;;:::i;:::-;;;;35743:280;35646:377;;;-1:-1:-1;36042:13:0;;35320:743;-1:-1:-1;;;;35320:743:0:o;37019:80::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37079:4:::1;:12:::0;37019:80::o;37274:161::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37389:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;31602:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31567:28::-;;;;;;;:::i;23700:326::-;23817:7;23858:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23858:16:0;23907:19;23885:110;;;;-1:-1:-1;;;23885:110:0;;17601:2:1;23885:110:0;;;17583:21:1;17640:2;17620:18;;;17613:30;17679:34;17659:18;;;17652:62;-1:-1:-1;;;17730:18:1;;;17723:39;17779:19;;23885:110:0;17399:405:1;23397:295:0;23514:7;-1:-1:-1;;;;;23561:19:0;;23539:111;;;;-1:-1:-1;;;23539:111:0;;17190:2:1;23539:111:0;;;17172:21:1;17229:2;17209:18;;;17202:30;17268:34;17248:18;;;17241:62;-1:-1:-1;;;17319:18:1;;;17312:40;17369:19;;23539:111:0;16988:406:1;23539:111:0;-1:-1:-1;;;;;;23668:16:0;;;;;:9;:16;;;;;;;23397:295::o;12465:103::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;12530:30:::1;12557:1;12530:18;:30::i;:::-;12465:103::o:0;33491:598::-;33628:11;32338:1;32324:11;:15;:52;;;;;32358:18;;32343:11;:33;;32324:52;32302:122;;;;-1:-1:-1;;;32302:122:0;;;;;;;:::i;:::-;32491:9;;32476:11;32457:16;:6;346:14;;254:114;32457:16;:30;;;;:::i;:::-;:43;;32435:113;;;;-1:-1:-1;;;32435:113:0;;;;;;;:::i;:::-;33661:6:::1;::::0;::::1;;33660:7;33652:43;;;;-1:-1:-1::0;;;33652:43:0::1;;;;;;;:::i;:::-;33734:11;33727:4;;:18;;;;:::i;:::-;33714:9;:31;;33706:63;;;::::0;-1:-1:-1;;;33706:63:0;;21840:2:1;33706:63:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;-1:-1:-1;;;21898:18:1;;;21891:49;21957:18;;33706:63:0::1;21638:343:1::0;33706:63:0::1;33784:15;::::0;;;::::1;;;:23;;33803:4;33784:23;33780:119;;;33832:27;33846:12;;33832:13;:27::i;:::-;33824:63;;;::::0;-1:-1:-1;;;33824:63:0;;16413:2:1;33824:63:0::1;::::0;::::1;16395:21:1::0;16452:2;16432:18;;;16425:30;16491:25;16471:18;;;16464:53;16534:18;;33824:63:0::1;16211:347:1::0;33824:63:0::1;33909:23;33935:21;33945:10;33935:9;:21::i;:::-;33909:47;;33993:18;;33975:15;:36;33967:69;;;;-1:-1:-1::0;;;33967:69:0::1;;;;;;;:::i;:::-;34047:34;34057:10;34069:11;34047:9;:34::i;:::-;33641:448;33491:598:::0;;;;:::o;37871:104::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37943:10:::1;:24:::0;37871:104::o;37443:106::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37519:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;34844:267::-:0;35010:24;;-1:-1:-1;;;;;;7484:2:1;7480:15;;;7476:53;35010:24:0;;;7464:66:1;34968:4:0;;;;7546:12:1;;35010:24:0;;;;;;;;;;;;35000:35;;;;;;34985:50;;35053;35072:12;;35053:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35086:10:0;;;-1:-1:-1;35098:4:0;;-1:-1:-1;35053:18:0;:50::i;:::-;35046:57;34844:267;-1:-1:-1;;;;;34844:267:0:o;24142:104::-;24198:13;24231:7;24224:14;;;;;:::i;32996:487::-;33088:11;32338:1;32324:11;:15;:52;;;;;32358:18;;32343:11;:33;;32324:52;32302:122;;;;-1:-1:-1;;;32302:122:0;;;;;;;:::i;:::-;32491:9;;32476:11;32457:16;:6;346:14;;254:114;32457:16;:30;;;;:::i;:::-;:43;;32435:113;;;;-1:-1:-1;;;32435:113:0;;;;;;;:::i;:::-;33126:6:::1;::::0;::::1;;33125:7;33117:43;;;;-1:-1:-1::0;;;33117:43:0::1;;;;;;;:::i;:::-;33199:11;33192:4;;:18;;;;:::i;:::-;33179:9;:31;;33171:63;;;::::0;-1:-1:-1;;;33171:63:0;;21840:2:1;33171:63:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;-1:-1:-1;;;21898:18:1;;;21891:49;21957:18;;33171:63:0::1;21638:343:1::0;33171:63:0::1;33254:15;::::0;;;::::1;;;33253:16;33245:47;;;::::0;-1:-1:-1;;;33245:47:0;;18011:2:1;33245:47:0::1;::::0;::::1;17993:21:1::0;18050:2;18030:18;;;18023:30;-1:-1:-1;;;18069:18:1;;;18062:48;18127:18;;33245:47:0::1;17809:342:1::0;33245:47:0::1;33303:23;33329:21;33339:10;33329:9;:21::i;:::-;33303:47;;33387:18;;33369:15;:36;33361:69;;;;-1:-1:-1::0;;;33361:69:0::1;;;;;;;:::i;:::-;33441:34;33451:10;33463:11;33441:9;:34::i;25567:187::-:0;25694:52;2702:10;25727:8;25737;25694:18;:52::i;31642:31::-;;;;;;;:::i;37107:159::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;37218:18:::1;:40:::0;37107:159::o;26561:365::-;26750:41;2702:10;26783:7;26750:18;:41::i;:::-;26728:140;;;;-1:-1:-1;;;26728:140:0;;;;;;;:::i;:::-;26879:39;26893:4;26899:2;26903:7;26912:5;26879:13;:39::i;36071:727::-;27359:4;27383:16;;;:7;:16;;;;;;36190:13;;-1:-1:-1;;;;;27383:16:0;36221:114;;;;-1:-1:-1;;;36221:114:0;;20255:2:1;36221:114:0;;;20237:21:1;20294:2;20274:18;;;20267:30;20333:34;20313:18;;;20306:62;-1:-1:-1;;;20384:18:1;;;20377:45;20439:19;;36221:114:0;20053:411:1;36221:114:0;36352:8;;;;;;;36348:74;;36393:17;36386:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36071:727;;;:::o;36348:74::-;36434:28;36465:10;:8;:10::i;:::-;36434:41;;36537:1;36512:14;36506:28;:32;:284;;;;;;;;;;;;;;;;;36630:14;36671:19;:8;:17;:19::i;:::-;36717:9;36587:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36506:284;36486:304;36071:727;-1:-1:-1;;;36071:727:0:o;36901:110::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;36976:18:::1;:27:::0;36901:110::o;36806:87::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;36868:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;36868:17:0;;::::1;::::0;;;::::1;::::0;;36806:87::o;35119:193::-;35223:11;32338:1;32324:11;:15;:52;;;;;32358:18;;32343:11;:33;;32324:52;32302:122;;;;-1:-1:-1;;;32302:122:0;;;;;;;:::i;:::-;32491:9;;32476:11;32457:16;:6;346:14;;254:114;32457:16;:30;;;;:::i;:::-;:43;;32435:113;;;;-1:-1:-1;;;32435:113:0;;;;;;;:::i;:::-;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23:::1;12369:68;;;;-1:-1:-1::0;;;12369:68:0::1;;;;;;;:::i;:::-;35271:33:::2;35281:9;35292:11;35271:9;:33::i;12576:238::-:0;12315:6;;-1:-1:-1;;;;;12315:6:0;2702:10;12377:23;12369:68;;;;-1:-1:-1;;;12369:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12679:22:0;::::1;12657:110;;;::::0;-1:-1:-1;;;12657:110:0;;13369:2:1;12657:110:0::1;::::0;::::1;13351:21:1::0;13408:2;13388:18;;;13381:30;13447:34;13427:18;;;13420:62;-1:-1:-1;;;13498:18:1;;;13491:36;13544:19;;12657:110:0::1;13167:402:1::0;12657:110:0::1;12778:28;12797:8;12778:18;:28::i;17708:190::-:0;17833:4;17886;17857:25;17870:5;17877:4;17857:12;:25::i;:::-;:33;;17708:190;-1:-1:-1;;;;17708:190:0:o;29637:174::-;29712:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29712:29:0;-1:-1:-1;;;;;29712:29:0;;;;;;;;:24;;29766:23;29712:24;29766:14;:23::i;:::-;-1:-1:-1;;;;;29757:46:0;;;;;;;;;;;29637:174;;:::o;27429:452::-;27558:4;27383:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27383:16:0;27580:110;;;;-1:-1:-1;;;27580:110:0;;15644:2:1;27580:110:0;;;15626:21:1;15683:2;15663:18;;;15656:30;15722:34;15702:18;;;15695:62;-1:-1:-1;;;15773:18:1;;;15766:42;15825:19;;27580:110:0;15442:408:1;27580:110:0;27701:13;27717:23;27732:7;27717:14;:23::i;:::-;27701:39;;27770:5;-1:-1:-1;;;;;27759:16:0;:7;-1:-1:-1;;;;;27759:16:0;;:64;;;;27816:7;-1:-1:-1;;;;;27792:31:0;:20;27804:7;27792:11;:20::i;:::-;-1:-1:-1;;;;;27792:31:0;;27759:64;:113;;;-1:-1:-1;;;;;;25933:25:0;;;25904:4;25933:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27840:32;25762:214;29066:563;29239:4;-1:-1:-1;;;;;29212:31:0;:23;29227:7;29212:14;:23::i;:::-;-1:-1:-1;;;;;29212:31:0;;29190:122;;;;-1:-1:-1;;;29190:122:0;;19845:2:1;29190:122:0;;;19827:21:1;19884:2;19864:18;;;19857:30;19923:34;19903:18;;;19896:62;-1:-1:-1;;;19974:18:1;;;19967:39;20023:19;;29190:122:0;19643:405:1;29190:122:0;-1:-1:-1;;;;;29331:16:0;;29323:65;;;;-1:-1:-1;;;29323:65:0;;14482:2:1;29323:65:0;;;14464:21:1;14521:2;14501:18;;;14494:30;14560:34;14540:18;;;14533:62;-1:-1:-1;;;14611:18:1;;;14604:34;14655:19;;29323:65:0;14280:400:1;29323:65:0;29453:29;29470:1;29474:7;29453:8;:29::i;:::-;-1:-1:-1;;;;;29495:15:0;;;;;;:9;:15;;;;;:20;;29514:1;;29495:15;:20;;29514:1;;29495:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29526:13:0;;;;;;:9;:13;;;;;:18;;29543:1;;29526:13;:18;;29543:1;;29526:18;:::i;:::-;;;;-1:-1:-1;;29555:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29555:21:0;-1:-1:-1;;;;;29555:21:0;;;;;;;;;29594:27;;29555:16;;29594:27;;;;;;;29066:563;;;:::o;32576:309::-;32732:28;;;32749:10;7484:2:1;7480:15;-1:-1:-1;;;;;;7476:53:1;32732:28:0;;;;7464:66:1;;;;32732:28:0;;;;;;;;;7546:12:1;;;32732:28:0;;32722:39;;;;;;9343:66:1;10475:58:0;;;9331:79:1;9426:12;;;;9419:28;;;10475:58:0;;;;;;;;;;9463:12:1;;;;10475:58:0;;;10447:101;;;;;32678:4;;32722:39;32822:55;;32867:9;32822:44;:55::i;:::-;32792:13;;-1:-1:-1;;;;;32792:13:0;;;:85;;;;32576:309;-1:-1:-1;;;32576:309:0:o;38138:226::-;38222:9;38217:140;38241:11;38237:1;:15;38217:140;;;38274:18;:6;465:19;;483:1;465:19;;;376:127;38274:18;38307:38;38317:9;38328:16;:6;346:14;;254:114;38328:16;38307:9;:38::i;:::-;38254:3;;;;:::i;:::-;;;;38217:140;;12822:191;12915:6;;;-1:-1:-1;;;;;12932:17:0;;;-1:-1:-1;;;;;;12932:17:0;;;;;;;12965:40;;12915:6;;;12932:17;12915:6;;12965:40;;12896:16;;12965:40;12885:128;12822:191;:::o;29819:315::-;29974:8;-1:-1:-1;;;;;29965:17:0;:5;-1:-1:-1;;;;;29965:17:0;;;29957:55;;;;-1:-1:-1;;;29957:55:0;;14887:2:1;29957:55:0;;;14869:21:1;14926:2;14906:18;;;14899:30;14965:27;14945:18;;;14938:55;15010:18;;29957:55:0;14685:349:1;29957:55:0;-1:-1:-1;;;;;30023:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30023:46:0;;;;;;;;;;30085:41;;11174::1;;;30085::0;;11147:18:1;30085:41:0;;;;;;;29819:315;;;:::o;26934:352::-;27091:28;27101:4;27107:2;27111:7;27091:9;:28::i;:::-;27152:48;27175:4;27181:2;27185:7;27194:5;27152:22;:48::i;:::-;27130:148;;;;-1:-1:-1;;;27130:148:0;;;;;;;:::i;38372:110::-;38432:13;38465:9;38458:16;;;;;:::i;1074:532::-;1130:13;1160:10;1156:53;;-1:-1:-1;;1187:10:0;;;;;;;;;;;;-1:-1:-1;;;1187:10:0;;;;;1074:532::o;1156:53::-;1234:5;1219:12;1275:78;1282:9;;1275:78;;1308:8;;;;:::i;:::-;;-1:-1:-1;1331:10:0;;-1:-1:-1;1339:2:0;1331:10;;:::i;:::-;;;1275:78;;;1363:19;1395:6;1385:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1385:17:0;;1363:39;;1413:154;1420:10;;1413:154;;1447:11;1457:1;1447:11;;:::i;:::-;;-1:-1:-1;1516:10:0;1524:2;1516:5;:10;:::i;:::-;1503:24;;:2;:24;:::i;:::-;1490:39;;1473:6;1480;1473:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1473:56:0;;;;;;;;-1:-1:-1;1544:11:0;1553:2;1544:11;;:::i;:::-;;;1413:154;;18259:707;18369:7;18417:4;18369:7;18432:497;18456:5;:12;18452:1;:16;18432:497;;;18490:20;18513:5;18519:1;18513:8;;;;;;;;:::i;:::-;;;;;;;18490:31;;18556:12;18540;:28;18536:382;;19069:13;19124:15;;;19160:4;19153:15;;;19207:4;19191:21;;18668:57;;18536:382;;;19069:13;19124:15;;;19160:4;19153:15;;;19207:4;19191:21;;18845:57;;18536:382;-1:-1:-1;18470:3:0;;;;:::i;:::-;;;;18432:497;;;-1:-1:-1;18946:12:0;18259:707;-1:-1:-1;;;18259:707:0:o;6406:263::-;6511:7;6537:17;6556:18;6578:27;6589:4;6595:9;6578:10;:27::i;:::-;6536:69;;;;6616:18;6628:5;6616:11;:18::i;27889:110::-;27965:26;27975:2;27979:7;27965:26;;;;;;;;;;;;:9;:26::i;30142:980::-;30297:4;-1:-1:-1;;;;;30318:13:0;;13312:20;13360:8;30314:801;;30371:175;;-1:-1:-1;;;30371:175:0;;-1:-1:-1;;;;;30371:36:0;;;;;:175;;2702:10;;30465:4;;30492:7;;30522:5;;30371:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30371:175:0;;;;;;;;-1:-1:-1;;30371:175:0;;;;;;;;;;;;:::i;:::-;;;30350:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30729:13:0;;30725:320;;30772:108;;-1:-1:-1;;;30772:108:0;;;;;;;:::i;30725:320::-;30995:6;30989:13;30980:6;30976:2;30972:15;30965:38;30350:710;-1:-1:-1;;;;;;30610:51:0;-1:-1:-1;;;30610:51:0;;-1:-1:-1;30603:58:0;;30314:801;-1:-1:-1;31099:4:0;30142:980;;;;;;:::o;4825:779::-;4933:7;4942:12;4976:9;:16;4996:2;4976:22;4972:625;;;5320:4;5305:20;;5299:27;5370:4;5355:20;;5349:27;5428:4;5413:20;;5407:27;5015:9;5399:36;5471:25;5482:4;5399:36;5299:27;5349;5471:10;:25::i;:::-;5464:32;;;;;;;;;4972:625;-1:-1:-1;5545:1:0;;-1:-1:-1;5549:35:0;4972:625;4825:779;;;;;:::o;3218:521::-;3296:20;3287:5;:29;;;;;;;;:::i;:::-;;3283:449;;;3218:521;:::o;3283:449::-;3394:29;3385:5;:38;;;;;;;;:::i;:::-;;3381:351;;;3440:34;;-1:-1:-1;;;3440:34:0;;12237:2:1;3440:34:0;;;12219:21:1;12276:2;12256:18;;;12249:30;12315:26;12295:18;;;12288:54;12359:18;;3440:34:0;12035:348:1;3381:351:0;3505:35;3496:5;:44;;;;;;;;:::i;:::-;;3492:240;;;3557:41;;-1:-1:-1;;;3557:41:0;;12590:2:1;3557:41:0;;;12572:21:1;12629:2;12609:18;;;12602:30;12668:33;12648:18;;;12641:61;12719:18;;3557:41:0;12388:355:1;3492:240:0;3629:30;3620:5;:39;;;;;;;;:::i;:::-;;3616:116;;;3676:44;;-1:-1:-1;;;3676:44:0;;15241:2:1;3676:44:0;;;15223:21:1;15280:2;15260:18;;;15253:30;15319:34;15299:18;;;15292:62;-1:-1:-1;;;15370:18:1;;;15363:32;15412:19;;3676:44:0;15039:398:1;28007:321:0;28137:18;28143:2;28147:7;28137:5;:18::i;:::-;28188:54;28219:1;28223:2;28227:7;28236:5;28188:22;:54::i;:::-;28166:154;;;;-1:-1:-1;;;28166:154:0;;;;;;;:::i;7935:1557::-;8066:7;;9027:66;9001:92;;8983:200;;;-1:-1:-1;9136:1:0;;-1:-1:-1;9140:30:0;9120:51;;8983:200;9297:24;;;9280:14;9297:24;;;;;;;;;11635:25:1;;;11708:4;11696:17;;11676:18;;;11669:45;;;;11730:18;;;11723:34;;;11773:18;;;11766:34;;;9297:24:0;;11607:19:1;;9297:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9297:24:0;;-1:-1:-1;;9297:24:0;;;-1:-1:-1;;;;;;;9336:20:0;;9332:103;;9389:1;9393:29;9373:50;;;;;;;9332:103;9455:6;-1:-1:-1;9463:20:0;;-1:-1:-1;7935:1557:0;;;;;;;;:::o;28336:382::-;-1:-1:-1;;;;;28416:16:0;;28408:61;;;;-1:-1:-1;;;28408:61:0;;18358:2:1;28408:61:0;;;18340:21:1;;;18377:18;;;18370:30;18436:34;18416:18;;;18409:62;18488:18;;28408:61:0;18156:356:1;28408:61:0;27359:4;27383:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27383:16:0;:30;28480:58;;;;-1:-1:-1;;;28480:58:0;;13776:2:1;28480:58:0;;;13758:21:1;13815:2;13795:18;;;13788:30;13854;13834:18;;;13827:58;13902:18;;28480:58:0;13574:352:1;28480:58:0;-1:-1:-1;;;;;28609:13:0;;;;;;:9;:13;;;;;:18;;28626:1;;28609:13;:18;;28626:1;;28609:18;:::i;:::-;;;;-1:-1:-1;;28638:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28638:21:0;-1:-1:-1;;;;;28638:21:0;;;;;;;;28677:33;;28638:16;;;28677:33;;28638:16;;28677:33;28336:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:367::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:55;;973:1;970;963:12;922:55;-1:-1:-1;996:20:1;;1039:18;1028:30;;1025:50;;;1071:1;1068;1061:12;1025:50;1108:4;1100:6;1096:17;1084:29;;1168:3;1161:4;1151:6;1148:1;1144:14;1136:6;1132:27;1128:38;1125:47;1122:67;;;1185:1;1182;1175:12;1200:160;1265:20;;1321:13;;1314:21;1304:32;;1294:60;;1350:1;1347;1340:12;1365:220;1407:5;1460:3;1453:4;1445:6;1441:17;1437:27;1427:55;;1478:1;1475;1468:12;1427:55;1500:79;1575:3;1566:6;1553:20;1546:4;1538:6;1534:17;1500:79;:::i;1590:186::-;1649:6;1702:2;1690:9;1681:7;1677:23;1673:32;1670:52;;;1718:1;1715;1708:12;1670:52;1741:29;1760:9;1741:29;:::i;1781:260::-;1849:6;1857;1910:2;1898:9;1889:7;1885:23;1881:32;1878:52;;;1926:1;1923;1916:12;1878:52;1949:29;1968:9;1949:29;:::i;:::-;1939:39;;1997:38;2031:2;2020:9;2016:18;1997:38;:::i;:::-;1987:48;;1781:260;;;;;:::o;2046:328::-;2123:6;2131;2139;2192:2;2180:9;2171:7;2167:23;2163:32;2160:52;;;2208:1;2205;2198:12;2160:52;2231:29;2250:9;2231:29;:::i;:::-;2221:39;;2279:38;2313:2;2302:9;2298:18;2279:38;:::i;:::-;2269:48;;2364:2;2353:9;2349:18;2336:32;2326:42;;2046:328;;;;;:::o;2379:537::-;2474:6;2482;2490;2498;2551:3;2539:9;2530:7;2526:23;2522:33;2519:53;;;2568:1;2565;2558:12;2519:53;2591:29;2610:9;2591:29;:::i;:::-;2581:39;;2639:38;2673:2;2662:9;2658:18;2639:38;:::i;:::-;2629:48;;2724:2;2713:9;2709:18;2696:32;2686:42;;2779:2;2768:9;2764:18;2751:32;2806:18;2798:6;2795:30;2792:50;;;2838:1;2835;2828:12;2792:50;2861:49;2902:7;2893:6;2882:9;2878:22;2861:49;:::i;:::-;2851:59;;;2379:537;;;;;;;:::o;2921:511::-;3016:6;3024;3032;3085:2;3073:9;3064:7;3060:23;3056:32;3053:52;;;3101:1;3098;3091:12;3053:52;3124:29;3143:9;3124:29;:::i;:::-;3114:39;;3204:2;3193:9;3189:18;3176:32;3231:18;3223:6;3220:30;3217:50;;;3263:1;3260;3253:12;3217:50;3302:70;3364:7;3355:6;3344:9;3340:22;3302:70;:::i;:::-;2921:511;;3391:8;;-1:-1:-1;3276:96:1;;-1:-1:-1;;;;2921:511:1:o;3437:254::-;3502:6;3510;3563:2;3551:9;3542:7;3538:23;3534:32;3531:52;;;3579:1;3576;3569:12;3531:52;3602:29;3621:9;3602:29;:::i;:::-;3592:39;;3650:35;3681:2;3670:9;3666:18;3650:35;:::i;3696:254::-;3764:6;3772;3825:2;3813:9;3804:7;3800:23;3796:32;3793:52;;;3841:1;3838;3831:12;3793:52;3864:29;3883:9;3864:29;:::i;:::-;3854:39;3940:2;3925:18;;;;3912:32;;-1:-1:-1;;;3696:254:1:o;3955:437::-;4041:6;4049;4102:2;4090:9;4081:7;4077:23;4073:32;4070:52;;;4118:1;4115;4108:12;4070:52;4158:9;4145:23;4191:18;4183:6;4180:30;4177:50;;;4223:1;4220;4213:12;4177:50;4262:70;4324:7;4315:6;4304:9;4300:22;4262:70;:::i;:::-;4351:8;;4236:96;;-1:-1:-1;3955:437:1;-1:-1:-1;;;;3955:437:1:o;4397:180::-;4453:6;4506:2;4494:9;4485:7;4481:23;4477:32;4474:52;;;4522:1;4519;4512:12;4474:52;4545:26;4561:9;4545:26;:::i;4582:180::-;4641:6;4694:2;4682:9;4673:7;4669:23;4665:32;4662:52;;;4710:1;4707;4700:12;4662:52;-1:-1:-1;4733:23:1;;4582:180;-1:-1:-1;4582:180:1:o;4767:245::-;4825:6;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4933:9;4920:23;4952:30;4976:5;4952:30;:::i;5017:249::-;5086:6;5139:2;5127:9;5118:7;5114:23;5110:32;5107:52;;;5155:1;5152;5145:12;5107:52;5187:9;5181:16;5206:30;5230:5;5206:30;:::i;5271:450::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:52;;;5409:1;5406;5399:12;5361:52;5449:9;5436:23;5482:18;5474:6;5471:30;5468:50;;;5514:1;5511;5504:12;5468:50;5537:22;;5590:4;5582:13;;5578:27;-1:-1:-1;5568:55:1;;5619:1;5616;5609:12;5568:55;5642:73;5707:7;5702:2;5689:16;5684:2;5680;5676:11;5642:73;:::i;5911:254::-;5979:6;5987;6040:2;6028:9;6019:7;6015:23;6011:32;6008:52;;;6056:1;6053;6046:12;6008:52;6092:9;6079:23;6069:33;;6121:38;6155:2;6144:9;6140:18;6121:38;:::i;6170:505::-;6265:6;6273;6281;6334:2;6322:9;6313:7;6309:23;6305:32;6302:52;;;6350:1;6347;6340:12;6302:52;6386:9;6373:23;6363:33;;6447:2;6436:9;6432:18;6419:32;6474:18;6466:6;6463:30;6460:50;;;6506:1;6503;6496:12;6680:388;6757:6;6765;6818:2;6806:9;6797:7;6793:23;6789:32;6786:52;;;6834:1;6831;6824:12;6786:52;6870:9;6857:23;6847:33;;6931:2;6920:9;6916:18;6903:32;6958:18;6950:6;6947:30;6944:50;;;6990:1;6987;6980:12;6944:50;7013:49;7054:7;7045:6;7034:9;7030:22;7013:49;:::i;:::-;7003:59;;;6680:388;;;;;:::o;7073:257::-;7114:3;7152:5;7146:12;7179:6;7174:3;7167:19;7195:63;7251:6;7244:4;7239:3;7235:14;7228:4;7221:5;7217:16;7195:63;:::i;:::-;7312:2;7291:15;-1:-1:-1;;7287:29:1;7278:39;;;;7319:4;7274:50;;7073:257;-1:-1:-1;;7073:257:1:o;7569:1527::-;7793:3;7831:6;7825:13;7857:4;7870:51;7914:6;7909:3;7904:2;7896:6;7892:15;7870:51;:::i;:::-;7984:13;;7943:16;;;;8006:55;7984:13;7943:16;8028:15;;;8006:55;:::i;:::-;8150:13;;8083:20;;;8123:1;;8210;8232:18;;;;8285;;;;8312:93;;8390:4;8380:8;8376:19;8364:31;;8312:93;8453:2;8443:8;8440:16;8420:18;8417:40;8414:167;;;-1:-1:-1;;;8480:33:1;;8536:4;8533:1;8526:15;8566:4;8487:3;8554:17;8414:167;8597:18;8624:110;;;;8748:1;8743:328;;;;8590:481;;8624:110;-1:-1:-1;;8659:24:1;;8645:39;;8704:20;;;;-1:-1:-1;8624:110:1;;8743:328;22241:1;22234:14;;;22278:4;22265:18;;8838:1;8852:169;8866:8;8863:1;8860:15;8852:169;;;8948:14;;8933:13;;;8926:37;8991:16;;;;8883:10;;8852:169;;;8856:3;;9052:8;9045:5;9041:20;9034:27;;8590:481;-1:-1:-1;9087:3:1;;7569:1527;-1:-1:-1;;;;;;;;;;;7569:1527:1:o;9904:488::-;-1:-1:-1;;;;;10173:15:1;;;10155:34;;10225:15;;10220:2;10205:18;;10198:43;10272:2;10257:18;;10250:34;;;10320:3;10315:2;10300:18;;10293:31;;;10098:4;;10341:45;;10366:19;;10358:6;10341:45;:::i;:::-;10333:53;9904:488;-1:-1:-1;;;;;;9904:488:1:o;10397:632::-;10568:2;10620:21;;;10690:13;;10593:18;;;10712:22;;;10539:4;;10568:2;10791:15;;;;10765:2;10750:18;;;10539:4;10834:169;10848:6;10845:1;10842:13;10834:169;;;10909:13;;10897:26;;10978:15;;;;10943:12;;;;10870:1;10863:9;10834:169;;;-1:-1:-1;11020:3:1;;10397:632;-1:-1:-1;;;;;;10397:632:1:o;11811:219::-;11960:2;11949:9;11942:21;11923:4;11980:44;12020:2;12009:9;12005:18;11997:6;11980:44;:::i;12748:414::-;12950:2;12932:21;;;12989:2;12969:18;;;12962:30;13028:34;13023:2;13008:18;;13001:62;-1:-1:-1;;;13094:2:1;13079:18;;13072:48;13152:3;13137:19;;12748:414::o;13931:344::-;14133:2;14115:21;;;14172:2;14152:18;;;14145:30;-1:-1:-1;;;14206:2:1;14191:18;;14184:50;14266:2;14251:18;;13931:344::o;18930:356::-;19132:2;19114:21;;;19151:18;;;19144:30;19210:34;19205:2;19190:18;;19183:62;19277:2;19262:18;;18930:356::o;19291:347::-;19493:2;19475:21;;;19532:2;19512:18;;;19505:30;19571:25;19566:2;19551:18;;19544:53;19629:2;19614:18;;19291:347::o;20871:344::-;21073:2;21055:21;;;21112:2;21092:18;;;21085:30;-1:-1:-1;;;21146:2:1;21131:18;;21124:50;21206:2;21191:18;;20871:344::o;21220:413::-;21422:2;21404:21;;;21461:2;21441:18;;;21434:30;21500:34;21495:2;21480:18;;21473:62;-1:-1:-1;;;21566:2:1;21551:18;;21544:47;21623:3;21608:19;;21220:413::o;22294:128::-;22334:3;22365:1;22361:6;22358:1;22355:13;22352:39;;;22371:18;;:::i;:::-;-1:-1:-1;22407:9:1;;22294:128::o;22427:120::-;22467:1;22493;22483:35;;22498:18;;:::i;:::-;-1:-1:-1;22532:9:1;;22427:120::o;22552:168::-;22592:7;22658:1;22654;22650:6;22646:14;22643:1;22640:21;22635:1;22628:9;22621:17;22617:45;22614:71;;;22665:18;;:::i;:::-;-1:-1:-1;22705:9:1;;22552:168::o;22725:125::-;22765:4;22793:1;22790;22787:8;22784:34;;;22798:18;;:::i;:::-;-1:-1:-1;22835:9:1;;22725:125::o;22855:258::-;22927:1;22937:113;22951:6;22948:1;22945:13;22937:113;;;23027:11;;;23021:18;23008:11;;;23001:39;22973:2;22966:10;22937:113;;;23068:6;23065:1;23062:13;23059:48;;;-1:-1:-1;;23103:1:1;23085:16;;23078:27;22855:258::o;23118:380::-;23197:1;23193:12;;;;23240;;;23261:61;;23315:4;23307:6;23303:17;23293:27;;23261:61;23368:2;23360:6;23357:14;23337:18;23334:38;23331:161;;;23414:10;23409:3;23405:20;23402:1;23395:31;23449:4;23446:1;23439:15;23477:4;23474:1;23467:15;23331:161;;23118:380;;;:::o;23503:135::-;23542:3;-1:-1:-1;;23563:17:1;;23560:43;;;23583:18;;:::i;:::-;-1:-1:-1;23630:1:1;23619:13;;23503:135::o;23643:112::-;23675:1;23701;23691:35;;23706:18;;:::i;:::-;-1:-1:-1;23740:9:1;;23643:112::o;23760:127::-;23821:10;23816:3;23812:20;23809:1;23802:31;23852:4;23849:1;23842:15;23876:4;23873:1;23866:15;23892:127;23953:10;23948:3;23944:20;23941:1;23934:31;23984:4;23981:1;23974:15;24008:4;24005:1;23998:15;24024:127;24085:10;24080:3;24076:20;24073:1;24066:31;24116:4;24113:1;24106:15;24140:4;24137:1;24130:15;24156:127;24217:10;24212:3;24208:20;24205:1;24198:31;24248:4;24245:1;24238:15;24272:4;24269:1;24262:15;24288:127;24349:10;24344:3;24340:20;24337:1;24330:31;24380:4;24377:1;24370:15;24404:4;24401:1;24394:15;24420:131;-1:-1:-1;;;;;;24494:32:1;;24484:43;;24474:71;;24541:1;24538;24531:12

Swarm Source

ipfs://742cc37d6159442b6813f325688b7d814301effe18325cd2c447969c9b8eb8be
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.