Contract 0xF3C810ad2a6D1f8e4Eb618c7B7e97FD70651D1Dd

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd2ce0d44991040a9bae6dcc46acb9f4582b656993df50e61808b6be0d8ba004eTransfer100386712021-06-25 9:29:1384 days 7 hrs ago0xe838322a009c160001cb458f0faf5c8ad6434c07 IN  0xf3c810ad2a6d1f8e4eb618c7b7e97fd70651d1dd0 BNB0.0004002
0x1d0a032bd02b26ff93fae87a6dc20bbc5eab7852e8ff29d304a55c15d85240a3Auto Mint100379782021-06-25 8:54:3484 days 7 hrs ago0xe838322a009c160001cb458f0faf5c8ad6434c07 IN  0xf3c810ad2a6d1f8e4eb618c7b7e97fd70651d1dd0 BNB0.00238291
[ Download CSV Export 
Latest 2 internal transactions
Parent Txn Hash Block From To Value
0xcff509f55580bc2d5da7e1c038315d3ec76c524218766754ca347f50e6dbd55c100378582021-06-25 8:48:3484 days 7 hrs ago 0xf5249722aa48ac6f947dca06e69cae1c0eea5042 0xf3c810ad2a6d1f8e4eb618c7b7e97fd70651d1dd0 BNB
0xcff509f55580bc2d5da7e1c038315d3ec76c524218766754ca347f50e6dbd55c100378582021-06-25 8:48:3484 days 7 hrs ago 0xf5249722aa48ac6f947dca06e69cae1c0eea5042  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x7ab2b1ddb1974396565cae4c709f7910253bbd41

Contract Name:
ERC721Matcha

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-02
*/

/**

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWWWWWWWWWWWWWMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMWWNXXKKKKKKKXXXXKKKKKKXXNWWMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMWNXKKKKXXNWWWWMMWWWWMWWWWNXXXKKKXNWMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMWNXKKKXNWMMMMMMMMMNOdxKWMMMMMMMMWNXKKKXNWMMMMMMMMMMMMMM
MMMMMMMMMMMMMWXKKKNWMMMMMMMMMMMMNx:;;l0WMMMMMMMMMMMWNK0KXWMMMMMMMMMMMM
MMMMMMMMMMMWXKKXWMMMMMMMMMMMMMMXd:;;;;cOWMMMMMMMMMMMMMWXKKXWMMMMMMMMMM
MMMMMMMMMWNKKXWMMMMMMMMMMMMMMWKo;;col:;:kNMMMMMMMMMMMMMMWX0KNWMMMMMMMM
MMMMMMMMWX0XWMMMMMMMMMMMMMMMWOl;;oKWXkc;:dXMMMMMMMMMMMMMMMWX0XWMMMMMMM
MMMMMMMNKKNWMMMMMMMMMMMMMMMNkc;:dXMMMWOc;;oKWMMMMMMMMMMMMMMWNKKNMMMMMM
MMMMMMNKKNMMMMMMMMMMMMMMMMNx:;:xNMMMMMW0l;;l0WMMMMMMMWMMMMMMMNKKNMMMMM
MMMMMNKKNMMMMMMMMMMMMMMMMXd:;ckNMMMMMMMMKo:;cOWMMMMXkxkXWMMMMMNKKNMMMM
MMMMWK0NMMMMMMMMMMMMMMMWKo;;l0WMMMMMMMMMMXx:;:xNMMW0lccxXMMMMMMN0KWMMM
MMMMX0XWMMMMMMWWMMMMMMWOl;;oKWMMMMMMMMMMMMNkc;:dXMMNklcoKMMMMMMMX0XMMM
MMMWKKNMMWK0OkkkkkkKWNkc;:dXMMMMMMMMMMMMMMMWOl;;oKWMXdcxNMMMMMMMNKKWMM
MMMN0XWMMWNXX0OdlccdKOc;:xNMMMWXKKXNWNNNNWWMW0o;;l0WNkdKWMMMMMMMWX0NMM
MMMX0XMMMMMMMMMN0dlcdOxoONMMMMW0xdddddodxk0KNWXd:;l0Kx0WMMMMMMMMMX0XMM
MMMX0NMMMMMMMMMMWXxlcoOXWMMMMWKkolclodkKNNNNWWMNxcxOkKWMMMMMMMMMMX0XMM
MMMX0XMMMMMMMMMMMMNklclkNMMWXklccodxdodKWMMMMMMMNKOkKWMMMMMMMMMMMX0XMM
MMMN0XWMMMMMMMMMMMMNOoclxXN0occcdKX0xlco0WMMMMMMNOOXMMMMMMMMMMMMMX0NMM
MMMWKKWMMMMMMMMMMMMMW0dccoxocccdKWMWNklclONMMMMXOONMMMMMMMMMMMMMWKKWMM
MMMMX0XMMMMMMMMMMMMMMWKdcccccco0WMMMMNOoclkNWWKk0NMMMMMMMMMMMMMMX0XWMM
MMMMWKKNMMMMMMMMMMMMMMMXxlcccckNMMMMMMW0oclxK0kKWMMMMMMMMMMMMMMNKKWMMM
MMMMMN0KWMMMMMMMMMMMMMMMNklccoKWMMMMMMMWKdlcoxKWMMMMMMMMMMMMMMWK0NMMMM
MMMMMMN0KWMMMMMMMMMMMMMMMNOod0KXWMMMMMMNK0xoxXWMMMMMMMMMMMMMMWK0NMMMMM
MMMMMMMN0KNMMMMMMMMMMMMMMMWXKkll0WMMMMXdcoOKNMMMMMMMMMMMMMMMNK0NMMMMMM
MMMMMMMMNK0XWMMMMMMMMMMMMMMMNd:;cOWMWKo:;c0WMMMMMMMMMMMMMMWX0KNMMMMMMM
MMMMMMMMMWXKKNWMMMMMMMMMMMMMMXd:;cx0kl;;l0WMMMMMMMMMMMMMWNKKXWMMMMMMMM
MMMMMMMMMMMWX0KNWMMMMMMMMMMMMMNkc;;::;:oKWMMMMMMMMMMMMWNK0XWMMMMMMMMMM
MMMMMMMMMMMMMNXKKXNWMMMMMMMMMMMWOc;;;:dXMMMMMMMMMMMWNXKKXWMMMMMMMMMMMM
MMMMMMMMMMMMMMMWNKKKXNWMMMMMMMMMW0l:ckNMMMMMMMMMWNXKKKNWMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMWNXKKKXXNWWWMMMMX0KWMMMWWWNXXKKKXNWMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMWWNXXKKKKKXXXXXXXXXXKKKKXXNWWMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMWWNNNNNNNNNNNNWWWMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM


---------------------- [ WPSmartContracts.com ] ----------------------

                       [ Blockchain Made Easy ]


    |
    |  ERC-721 NFT Marketplace
    |
    |----------------------------
    |
    |  Flavors
    |
    |  >  Matcha: Fully featured ERC-721 Token, with Buy, 
    |     Sell and Auction NFT Marketplace
    |


*/

pragma solidity ^0.5.7;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract 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
    );

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either {approve} or {setApproveForAll}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either {approve} or {setApproveForAll}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    function approve(address to, uint256 tokenId) public;

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

    function setApprovalForAll(address operator, bool _approved) public;

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public;
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a {IERC721-safeTransfer}. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public returns (bytes4);
}

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

        return c;
    }

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

        return c;
    }

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

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

        return c;
    }

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

        return c;
    }

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash =
            0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     */
    function toPayable(address account)
        internal
        pure
        returns (address payable)
    {
        return address(uint160(account));
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        external
        view
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping(uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor() public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement {IERC721Receiver-onERC721Received},
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public {
        transferFrom(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

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

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(
            ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval =
            IERC721Receiver(to).onERC721Received(
                msg.sender,
                from,
                tokenId,
                _data
            );
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account)
        internal
        view
        returns (bool)
    {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

contract MinterRole {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private _minters;

    constructor() internal {
        _addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(
            isMinter(msg.sender),
            "MinterRole: caller does not have the Minter role"
        );
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return _minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(msg.sender);
    }

    function _addMinter(address account) internal {
        _minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        _minters.remove(account);
        emit MinterRemoved(account);
    }
}

/**
 * @title ERC721Mintable
 * @dev ERC721 minting logic.
 */
contract ERC721Mintable is ERC721, MinterRole {

    bool public anyoneCanMint;
    
    /**
     * @dev Options to activate or deactivate mint ability
     */

    function _setMintableOption(bool _anyoneCanMint) internal {
        anyoneCanMint = _anyoneCanMint;
    }

    /**
     * @dev Function to mint tokens.
     * @param to The address that will receive the minted tokens.
     * @param tokenId The token id to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(address to, uint256 tokenId)
        public
        onlyMinter
        returns (bool)
    {
        _mint(to, tokenId);
        return true;
    }

    function canIMint() public view returns (bool) {
        return anyoneCanMint || isMinter(msg.sender);
    }

    /**
     * Open modifier to anyone can mint possibility
     */
    modifier onlyMinter() {
        string memory mensaje;
        require(
            canIMint(),
            "MinterRole: caller does not have the Minter role"
        );
        _;
    }

}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract 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);
}

contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _tokenURIs[tokenId];
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

}

/**
 * @title ERC721MetadataMintable
 * @dev ERC721 minting logic with metadata.
 */
contract ERC721MetadataMintable is ERC721, ERC721Metadata, MinterRole {
    /**
     * @dev Function to mint tokens.
     * @param to The address that will receive the minted tokens.
     * @param tokenId The token id to mint.
     * @param tokenURI The token URI of the minted token.
     * @return A boolean that indicates if the operation was successful.
     */
    function mintWithTokenURI(address to, uint256 tokenId, string memory tokenURI) public onlyMinter returns (bool) {
        _mint(to, tokenId);
        _setTokenURI(tokenId, tokenURI);
        return true;
    }
}

/**
 * @title ERC721
 * Full ERC-721 Token with automint function
 */

contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata, ERC721Mintable, ERC721MetadataMintable {

    uint256 autoTokenId;
    constructor (string memory name, string memory symbol, bool _anyoneCanMint) public 
        ERC721Mintable() 
        ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks

        _setMintableOption(_anyoneCanMint);

    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        return _tokensOfOwner(owner);
    }

    function setTokenURI(uint256 tokenId, string memory uri) public {
        _setTokenURI(tokenId, uri);
    }

    /**
     * @dev Function to mint tokens with automatic ID
     * @param to The address that will receive the minted tokens.
     * @return A boolean that indicates if the operation was successful.
     */
    function autoMint(string memory tokenURI, address to) public onlyMinter returns (bool) {
        do {
            autoTokenId++;
        } while(_exists(autoTokenId));
        _mint(to, autoTokenId);
        _setTokenURI(autoTokenId, tokenURI);
        return true;
    }

    /**
     * @dev Function to transfer tokens
     * @param to The address that will receive the minted tokens.
     * @param tokenId the token ID
     */
    function transfer(
        address to,
        uint256 tokenId
    ) public {
        _transferFrom(msg.sender, to, tokenId);
    }

}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be aplied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 */
contract ReentrancyGuard {
    // counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

/**
 * @title ERC721Matcha
 * ERC-721 Marketplace
 */

contract ERC721Matcha is ERC721Full, ReentrancyGuard {

    using SafeMath for uint256;

    using Address for address payable;

    // admin address, the owner of the marketplace
    address payable admin;

    address public contract_owner;

    // commission rate is a value from 0 to 100
    uint256 commissionRate;

    // last price sold or auctioned
    mapping(uint256 => uint256) public soldFor;
    
    // Mapping from token ID to sell price in Ether or to bid price, depending if it is an auction or not
    mapping(uint256 => uint256) public sellBidPrice;

    // Mapping payment address for tokenId 
    mapping(uint256 => address payable) private _wallets;

    event Sale(uint256 indexed tokenId, address indexed from, address indexed to, uint256 value);
    event Commission(uint256 indexed tokenId, address indexed to, uint256 value, uint256 rate, uint256 total);

    /*

    index   _isAuction  _sellBidPrice   Meaning
    0       true        0               Item 0 is on auction and no bids so far
    1       true        10              Item 1 is on auction and the last bid is for 10 Ethers
    2       false       0               Item 2 is not on auction nor for sell
    3       false       10              Item 3 is on sale for 10 Ethers

    */

    // Auction data
    struct Auction {

        // Parameters of the auction. Times are either
        // absolute unix timestamps (seconds since 1970-01-01)
        // or time periods in seconds.
        address payable beneficiary;
        uint auctionEnd;

        // Current state of the auction.
        address payable highestBidder;
        uint highestBid;

        // Set to true at the end, disallows any change
        bool open;

        // minimum reserve price in wei
        uint256 reserve;

    }

    // mapping auctions for each tokenId
    mapping(uint256 => Auction) public auctions;

    // Events that will be fired on changes.
    event Refund(address bidder, uint amount);
    event HighestBidIncreased(address indexed bidder, uint amount, uint256 tokenId);
    event AuctionEnded(address winner, uint amount);

    event LimitSell(address indexed from, address indexed to, uint256 amount);
    event LimitBuy(address indexed from, address indexed to, uint256 amount);
    event MarketSell(address indexed from, address indexed to, uint256 amount);
    event MarketBuy(address indexed from, address indexed to, uint256 amount);


    constructor(address _owner, address payable _admin, uint256 _commissionRate, string memory name, string memory symbol, bool _anyoneCanMint) public 
        ERC721Full(name, symbol, _anyoneCanMint) {
        admin = _admin;
        contract_owner = _owner;
        require(_commissionRate<=100, "ERC721Matcha: Commission rate has to be between 0 and 100");
        commissionRate = _commissionRate;
    }

    function canSell(uint256 tokenId) public view returns (bool) {
        return (ownerOf(tokenId)==msg.sender && !auctions[tokenId].open);
    }

    // Sell option for a fixed price
    function sell(uint256 tokenId, uint256 price, address payable wallet) public {

        // onlyOwner
        require(ownerOf(tokenId)==msg.sender, "ERC721Matcha: Only owner can sell this item");

        // cannot set a price if auction is activated
        require(!auctions[tokenId].open, "ERC721Matcha: Cannot sell an item which has an active auction");

        // set sell price for index
        sellBidPrice[tokenId] = price;

        // If price is zero, means not for sale
        if (price>0) {

            // approve the Index to the current contract
            approve(address(this), tokenId);
            
            // set wallet payment
            _wallets[tokenId] = wallet;
            
        }

    }

    // simple function to return the price of a tokenId
    // returns: sell price, bid price, sold price, only one can be non zero
    function getPrice(uint256 tokenId) public view returns (uint256, uint256, uint256) {
        if (sellBidPrice[tokenId]>0) return (sellBidPrice[tokenId], 0, 0);
        if (auctions[tokenId].highestBid>0) return (0, auctions[tokenId].highestBid, 0);
        return (0, 0, soldFor[tokenId]);
    }

    function canBuy(uint256 tokenId) public view returns (uint256) {
        if (!auctions[tokenId].open && sellBidPrice[tokenId]>0 && sellBidPrice[tokenId]>0 && getApproved(tokenId) == address(this)) {
            return sellBidPrice[tokenId];
        } else {
            return 0;
        }
    }

    // Buy option
    function buy(uint256 tokenId) public payable nonReentrant {

        // is on sale
        require(!auctions[tokenId].open && sellBidPrice[tokenId]>0, "ERC721Matcha: The collectible is not for sale");

        // transfer funds
        require(msg.value >= sellBidPrice[tokenId], "ERC721Matcha: Not enough funds");

        // transfer ownership
        address owner = ownerOf(tokenId);

        require(msg.sender!=owner, "ERC721Matcha: The seller cannot buy his own collectible");

        // we need to call a transferFrom from this contract, which is the one with permission to sell the NFT
        callOptionalReturn(this, abi.encodeWithSelector(this.transferFrom.selector, owner, msg.sender, tokenId));

        // calculate amounts
        uint256 amount4admin = msg.value.mul(commissionRate).div(100);
        uint256 amount4owner = msg.value.sub(amount4admin);

        // to owner
        (bool success, ) = _wallets[tokenId].call.value(amount4owner)("");
        require(success, "Transfer failed.");

        // to admin
        (bool success2, ) = admin.call.value(amount4admin)("");
        require(success2, "Transfer failed.");

        // close the sell
        sellBidPrice[tokenId] = 0;
        _wallets[tokenId] = address(0);

        soldFor[tokenId] = msg.value;

        emit Sale(tokenId, owner, msg.sender, msg.value);
        emit Commission(tokenId, owner, msg.value, commissionRate, amount4admin);

    }

    function canAuction(uint256 tokenId) public view returns (bool) {
        return (ownerOf(tokenId)==msg.sender && !auctions[tokenId].open && sellBidPrice[tokenId]==0);
    }

    // Instantiate an auction contract for a tokenId
    function createAuction(uint256 tokenId, uint _closingTime, address payable _beneficiary, uint256 _reservePrice) public {

        require(sellBidPrice[tokenId]==0, "ERC721Matcha: The selected NFT is open for sale, cannot be auctioned");
        require(!auctions[tokenId].open, "ERC721Matcha: The selected NFT already has an auction");
        require(ownerOf(tokenId)==msg.sender, "ERC721Matcha: Only owner can auction this item");

        auctions[tokenId].beneficiary = _beneficiary;
        auctions[tokenId].auctionEnd = _closingTime;
        auctions[tokenId].reserve = _reservePrice;
        auctions[tokenId].open = true;

        // approve the Index to the current contract
        approve(address(this), tokenId);

    }

    function canBid(uint256 tokenId) public view returns (bool) {
        if (!msg.sender.isContract() &&
            auctions[tokenId].open &&
            now <= auctions[tokenId].auctionEnd &&
            msg.sender != ownerOf(tokenId) &&
            getApproved(tokenId) == address(this)
        ) {
            return true;
        } else {
            return false;
        }
    }

    /// Bid on the auction with the value sent
    /// together with this transaction.
    /// The value will only be refunded if the
    /// auction is not won.
    function bid(uint256 tokenId) public payable nonReentrant {
        // No arguments are necessary, all
        // information is already part of
        // the transaction. The keyword payable
        // is required for the function to
        // be able to receive Ether.

        // Contracts cannot bid, because they can block the auction with a reentrant attack
        require(!msg.sender.isContract(), "No script kiddies");

        // auction has to be opened
        require(auctions[tokenId].open, "No opened auction found");

        // approve was lost
        require(getApproved(tokenId) == address(this), "Cannot complete the auction");

        // Revert the call if the bidding
        // period is over.
        require(
            now <= auctions[tokenId].auctionEnd,
            "Auction already ended."
        );

        // If the bid is not higher, send the
        // money back.
        require(
            msg.value > auctions[tokenId].highestBid,
            "There already is a higher bid."
        );

        address owner = ownerOf(tokenId);
        require(msg.sender!=owner, "ERC721Matcha: The owner cannot bid his own collectible");

        // return the funds to the previous bidder, if there is one
        if (auctions[tokenId].highestBid>0) {
            (bool success, ) = auctions[tokenId].highestBidder.call.value(auctions[tokenId].highestBid)("");
            require(success, "Transfer failed.");
            emit Refund(auctions[tokenId].highestBidder, auctions[tokenId].highestBid);
        }

        // now store the bid data
        auctions[tokenId].highestBidder = msg.sender;
        auctions[tokenId].highestBid = msg.value;
        emit HighestBidIncreased(msg.sender, msg.value, tokenId);

    }

    // anyone can execute withdraw if auction is opened and 
    // the bid time expired and the reserve was not met
    // or
    // the auction is openen but the contract is unable to transfer
    function canWithdraw(uint256 tokenId) public view returns (bool) {
        if (auctions[tokenId].open && 
            (
                (
                    now >= auctions[tokenId].auctionEnd &&
                    auctions[tokenId].highestBid > 0 &&
                    auctions[tokenId].highestBid<auctions[tokenId].reserve
                ) || 
                getApproved(tokenId) != address(this)
            )
        ) {
            return true;
        } else {
            return false;
        }
    }

    /// Withdraw a bid when the auction is not finalized
    function withdraw(uint256 tokenId) public nonReentrant returns (bool) {

        require(canWithdraw(tokenId), "Conditions to withdraw are not met");

        // transfer funds to highest bidder always
        if (auctions[tokenId].highestBid > 0) {
            (bool success, ) = auctions[tokenId].highestBidder.call.value(auctions[tokenId].highestBid)("");
            require(success, "Transfer failed.");
        }

        // finalize the auction
        delete auctions[tokenId];

    }

    function canFinalize(uint256 tokenId) public view returns (bool) {
        if (auctions[tokenId].open && 
            now >= auctions[tokenId].auctionEnd &&
            (
                auctions[tokenId].highestBid>=auctions[tokenId].reserve || 
                auctions[tokenId].highestBid==0
            )
        ) {
            return true;
        } else {
            return false;
        }
    }

    // implement the auctionFinalize including the NFT transfer logic
    function auctionFinalize(uint256 tokenId) public nonReentrant {

        require(canFinalize(tokenId), "Cannot finalize");

        if (auctions[tokenId].highestBid>0) {

            // transfer the ownership of token to the highest bidder
            address payable highestBidder = auctions[tokenId].highestBidder;

            // calculate payment amounts
            uint256 amount4admin = auctions[tokenId].highestBid.mul(commissionRate).div(100);
            uint256 amount4owner = auctions[tokenId].highestBid.sub(amount4admin);

            // to owner
            (bool success, ) = auctions[tokenId].beneficiary.call.value(amount4owner)("");
            require(success, "Transfer failed.");

            // to admin
            (bool success2, ) = admin.call.value(amount4admin)("");
            require(success2, "Transfer failed.");

            emit Sale(tokenId, auctions[tokenId].beneficiary, highestBidder, auctions[tokenId].highestBid);
            emit Commission(tokenId, auctions[tokenId].beneficiary, auctions[tokenId].highestBid, commissionRate, amount4admin);

            // transfer ownership
            address owner = ownerOf(tokenId);

            // we need to call a transferFrom from this contract, which is the one with permission to sell the NFT
            // transfer the NFT to the auction's highest bidder
            callOptionalReturn(this, abi.encodeWithSelector(this.transferFrom.selector, owner, highestBidder, tokenId));

            soldFor[tokenId] = auctions[tokenId].highestBid;

        }

        emit AuctionEnded(auctions[tokenId].highestBidder, auctions[tokenId].highestBid);

        // finalize the auction
        delete auctions[tokenId];

    }

    // Bid query functions
    function highestBidder(uint256 tokenId) public view returns (address payable) {
        return auctions[tokenId].highestBidder;
    }

    function highestBid(uint256 tokenId) public view returns (uint256) {
        return auctions[tokenId].highestBid;
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC721 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC721: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC721: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC721: ERC20 operation did not succeed");
        }
    }

    // update contract fields
    function updateAdmin(address payable _admin, uint256 _commissionRate, bool _anyoneCanMint) public {
        require(msg.sender==contract_owner, "Only contract owner can do this");
        admin=_admin;
        commissionRate=_commissionRate;
        anyoneCanMint=_anyoneCanMint;
    }

}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address payable","name":"_admin","type":"address"},{"internalType":"uint256","name":"_commissionRate","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bool","name":"_anyoneCanMint","type":"bool"}],"payable":false,"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":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"Commission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"HighestBidIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LimitBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LimitSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MarketBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MarketSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Sale","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"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"anyoneCanMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"auctionFinalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctions","outputs":[{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"auctionEnd","type":"uint256"},{"internalType":"address payable","name":"highestBidder","type":"address"},{"internalType":"uint256","name":"highestBid","type":"uint256"},{"internalType":"bool","name":"open","type":"bool"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"tokenURI","type":"string"},{"internalType":"address","name":"to","type":"address"}],"name":"autoMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canBid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canFinalize","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canIMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canSell","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contract_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_closingTime","type":"uint256"},{"internalType":"address payable","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_reservePrice","type":"uint256"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"highestBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"highestBidder","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"mintWithTokenURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address payable","name":"wallet","type":"address"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sellBidPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"soldFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_admin","type":"address"},{"internalType":"uint256","name":"_commissionRate","type":"uint256"},{"internalType":"bool","name":"_anyoneCanMint","type":"bool"}],"name":"updateAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200447a3803806200447a833981810160405260c08110156200003757600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200006b57600080fd5b9083019060208201858111156200008157600080fd5b82516401000000008111828201881017156200009c57600080fd5b82525081516020918201929091019080838360005b83811015620000cb578181015183820152602001620000b1565b50505050905090810190601f168015620000f95780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011d57600080fd5b9083019060208201858111156200013357600080fd5b82516401000000008111828201881017156200014e57600080fd5b82525081516020918201929091019080838360005b838110156200017d57818101518382015260200162000163565b50505050905090810190601f168015620001ab5780820380516001836020036101000a031916815260200191505b5060405260200151915083905082828282620001d76301ffc9a760e01b6001600160e01b036200030816565b620001f26380ac58cd60e01b6001600160e01b036200030816565b6200020d63780e9d6360e01b6001600160e01b036200030816565b815162000222906009906020850190620004e8565b5080516200023890600a906020840190620004e8565b5062000254635b5e139f60e01b6001600160e01b036200030816565b506200026b9050336001600160e01b036200038d16565b6200027f816001600160e01b03620003df16565b50506001600f5550601080546001600160a01b038088166001600160a01b03199283161790925560118054928916929091169190911790556064841115620002f95760405162461bcd60e51b81526004018080602001828103825260398152602001806200441f6039913960400191505060405180910390fd5b505050601255506200058d9050565b6001600160e01b0319808216141562000368576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b620003a881600c620003f260201b6200371f1790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b600d805460ff1916911515919091179055565b6200040782826001600160e01b036200047f16565b156200045a576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620004c85760405162461bcd60e51b8152600401808060200182810382526022815260200180620044586022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200052b57805160ff19168380011785556200055b565b828001600101855582156200055b579182015b828111156200055b5782518255916020019190600101906200053e565b50620005699291506200056d565b5090565b6200058a91905b8082111562000569576000815560010162000574565b90565b613e82806200059d6000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063b1cb48ef116100c1578063dc16bd431161007a578063dc16bd4314610d88578063e4e2bfe414610db2578063e757223014610ddc578063e985e9c514610e24578063ee1b59e414610e5f578063fbe85f0614610e7457610293565b8063b1cb48ef14610bc2578063b2ecfad414610c07578063b88d4fde14610c31578063c87b56dd14610d02578063d04c698314610d2c578063d96a094a14610d6b57610293565b8063a22cb46511610113578063a22cb46514610ab2578063a36b146214610aed578063a9059cbb14610b17578063aa271e1a14610b50578063b13fbe9614610b83578063b14c63c514610b9857610293565b806370a08231146109755780638462151c146109a857806389f4c0b114610a2b57806395d89b4114610a55578063983b2d5614610a6a5780639865027514610a9d57610293565b8063384f58eb116101fe5780634f558e79116101b75780634f558e79146107075780634f6ccce71461073157806350bb4e7f1461075b578063571a26a01461082157806361a09c971461088f5780636352211e1461094b57610293565b8063384f58eb146106055780633ca88a2f1461061a57806340c10f191461064457806342842e0e1461067d578063451df52e146106c0578063454a2ab3146106ea57610293565b806318160ddd1161025057806318160ddd146104df5780631ac70f6f146104f457806323b872dd1461051e578063263f5877146105615780632e1a7d4d146105a25780632f745c59146105cc57610293565b806301ffc9a71461029857806306fdde03146102e0578063081812fc1461036a578063095ea7b3146103b0578063162094c4146103eb578063172b099d146104a3575b600080fd5b3480156102a457600080fd5b506102cc600480360360208110156102bb57600080fd5b50356001600160e01b031916610e9e565b604080519115158252519081900360200190f35b3480156102ec57600080fd5b506102f5610ec1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032f578181015183820152602001610317565b50505050905090810190601f16801561035c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037657600080fd5b506103946004803603602081101561038d57600080fd5b5035610f58565b604080516001600160a01b039092168252519081900360200190f35b3480156103bc57600080fd5b506103e9600480360360408110156103d357600080fd5b506001600160a01b038135169060200135610fba565b005b3480156103f757600080fd5b506103e96004803603604081101561040e57600080fd5b81359190810190604081016020820135600160201b81111561042f57600080fd5b82018360208201111561044157600080fd5b803590602001918460018302840111600160201b8311171561046257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506110cb945050505050565b3480156104af57600080fd5b506104cd600480360360208110156104c657600080fd5b50356110d9565b60408051918252519081900360200190f35b3480156104eb57600080fd5b506104cd6110eb565b34801561050057600080fd5b506102cc6004803603602081101561051757600080fd5b50356110f1565b34801561052a57600080fd5b506103e96004803603606081101561054157600080fd5b506001600160a01b03813581169160208101359091169060400135611143565b34801561056d57600080fd5b506103e96004803603606081101561058457600080fd5b506001600160a01b0381351690602081013590604001351515611198565b3480156105ae57600080fd5b506102cc600480360360208110156105c557600080fd5b503561122e565b3480156105d857600080fd5b506104cd600480360360408110156105ef57600080fd5b506001600160a01b0381351690602001356113d9565b34801561061157600080fd5b50610394611458565b34801561062657600080fd5b506104cd6004803603602081101561063d57600080fd5b5035611467565b34801561065057600080fd5b506102cc6004803603604081101561066757600080fd5b506001600160a01b0381351690602001356114ed565b34801561068957600080fd5b506103e9600480360360608110156106a057600080fd5b506001600160a01b03813581169160208101359091169060400135611548565b3480156106cc57600080fd5b50610394600480360360208110156106e357600080fd5b5035611563565b6103e96004803603602081101561070057600080fd5b5035611581565b34801561071357600080fd5b506102cc6004803603602081101561072a57600080fd5b5035611996565b34801561073d57600080fd5b506104cd6004803603602081101561075457600080fd5b50356119a1565b34801561076757600080fd5b506102cc6004803603606081101561077e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107ad57600080fd5b8201836020820111156107bf57600080fd5b803590602001918460018302840111600160201b831117156107e057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a07945050505050565b34801561082d57600080fd5b5061084b6004803603602081101561084457600080fd5b5035611a6d565b604080516001600160a01b0397881681526020810196909652939095168484015260608401919091521515608083015260a082019290925290519081900360c00190f35b34801561089b57600080fd5b506102cc600480360360408110156108b257600080fd5b810190602081018135600160201b8111156108cc57600080fd5b8201836020820111156108de57600080fd5b803590602001918460018302840111600160201b831117156108ff57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b03169150611ab49050565b34801561095757600080fd5b506103946004803603602081101561096e57600080fd5b5035611b2b565b34801561098157600080fd5b506104cd6004803603602081101561099857600080fd5b50356001600160a01b0316611b7f565b3480156109b457600080fd5b506109db600480360360208110156109cb57600080fd5b50356001600160a01b0316611be7565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a175781810151838201526020016109ff565b505050509050019250505060405180910390f35b348015610a3757600080fd5b506102cc60048036036020811015610a4e57600080fd5b5035611c48565b348015610a6157600080fd5b506102f5611cdd565b348015610a7657600080fd5b506103e960048036036020811015610a8d57600080fd5b50356001600160a01b0316611d3e565b348015610aa957600080fd5b506103e9611d8c565b348015610abe57600080fd5b506103e960048036036040811015610ad557600080fd5b506001600160a01b0381351690602001351515611d97565b348015610af957600080fd5b506104cd60048036036020811015610b1057600080fd5b5035611e63565b348015610b2357600080fd5b506103e960048036036040811015610b3a57600080fd5b506001600160a01b038135169060200135611e75565b348015610b5c57600080fd5b506102cc60048036036020811015610b7357600080fd5b50356001600160a01b0316611e80565b348015610b8f57600080fd5b506102cc611e93565b348015610ba457600080fd5b506104cd60048036036020811015610bbb57600080fd5b5035611e9c565b348015610bce57600080fd5b506103e960048036036080811015610be557600080fd5b508035906020810135906001600160a01b036040820135169060600135611eb1565b348015610c1357600080fd5b506102cc60048036036020811015610c2a57600080fd5b5035611ff2565b348015610c3d57600080fd5b506103e960048036036080811015610c5457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610c8e57600080fd5b820183602082011115610ca057600080fd5b803590602001918460018302840111600160201b83111715610cc157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612029945050505050565b348015610d0e57600080fd5b506102f560048036036020811015610d2557600080fd5b503561207b565b348015610d3857600080fd5b506103e960048036036060811015610d4f57600080fd5b50803590602081013590604001356001600160a01b0316612156565b6103e960048036036020811015610d8157600080fd5b5035612245565b348015610d9457600080fd5b506103e960048036036020811015610dab57600080fd5b503561265b565b348015610dbe57600080fd5b506102cc60048036036020811015610dd557600080fd5b5035612ab4565b348015610de857600080fd5b50610e0660048036036020811015610dff57600080fd5b5035612b2c565b60408051938452602084019290925282820152519081900360600190f35b348015610e3057600080fd5b506102cc60048036036040811015610e4757600080fd5b506001600160a01b0381358116916020013516612bab565b348015610e6b57600080fd5b506102cc612bd9565b348015610e8057600080fd5b506102cc60048036036020811015610e9757600080fd5b5035612bf6565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4d5780601f10610f2257610100808354040283529160200191610f4d565b820191906000526020600020905b815481529060010190602001808311610f3057829003601f168201915b505050505090505b90565b6000610f6382612c8b565b610f9e5760405162461bcd60e51b815260040180806020018281038252602c815260200180613bcd602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610fc582611b2b565b9050806001600160a01b0316836001600160a01b031614156110185760405162461bcd60e51b8152600401808060200182810382526021815260200180613ce36021913960400191505060405180910390fd5b336001600160a01b038216148061103457506110348133612bab565b61106f5760405162461bcd60e51b8152600401808060200182810382526038815260200180613aaf6038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6110d58282612ca8565b5050565b60146020526000908152604090205481565b60075490565b6000336110fd83611b2b565b6001600160a01b0316148015611125575060008281526016602052604090206004015460ff16155b801561113d5750600082815260146020526040902054155b92915050565b61114d3382612d0b565b6111885760405162461bcd60e51b8152600401808060200182810382526031815260200180613d316031913960400191505060405180910390fd5b611193838383612daf565b505050565b6011546001600160a01b031633146111f7576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636f6e7472616374206f776e65722063616e20646f207468697300604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b039490941693909317909255601255600d805460ff1916911515919091179055565b600f80546001019081905560009061124583612bf6565b6112805760405162461bcd60e51b8152600401808060200182810382526022815260200180613df66022913960400191505060405180910390fd5b6000838152601660205260409020600301541561134857600083815260166020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d80600081146112f8576040519150601f19603f3d011682016040523d82523d6000602084013e6112fd565b606091505b5050905080611346576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b505b600083815260166020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff1916905560050155600f5481146113d3576040805162461bcd60e51b815260206004820152601f6024820152600080516020613952833981519152604482015290519081900360640190fd5b50919050565b60006113e483611b7f565b82106114215760405162461bcd60e51b815260040180806020018281038252602b8152602001806139a0602b913960400191505060405180910390fd5b6001600160a01b038316600090815260056020526040902080548390811061144557fe5b9060005260206000200154905092915050565b6011546001600160a01b031681565b60008181526016602052604081206004015460ff16158015611496575060008281526014602052604090205415155b80156114af575060008281526014602052604090205415155b80156114cb5750306114c083610f58565b6001600160a01b0316145b156114e55750600081815260146020526040902054610ebc565b506000610ebc565b600060606114f9612bd9565b6115345760405162461bcd60e51b8152600401808060200182810382526030815260200180613b5b6030913960400191505060405180910390fd5b61153e8484612dce565b5060019392505050565b61119383838360405180602001604052806000815250612029565b6000908152601660205260409020600201546001600160a01b031690565b600f80546001019081905561159533612deb565b156115db576040805162461bcd60e51b81526020600482015260116024820152704e6f20736372697074206b69646469657360781b604482015290519081900360640190fd5b60008281526016602052604090206004015460ff16611641576040805162461bcd60e51b815260206004820152601760248201527f4e6f206f70656e65642061756374696f6e20666f756e64000000000000000000604482015290519081900360640190fd5b3061164b83610f58565b6001600160a01b0316146116a6576040805162461bcd60e51b815260206004820152601b60248201527f43616e6e6f7420636f6d706c657465207468652061756374696f6e0000000000604482015290519081900360640190fd5b600082815260166020526040902060010154421115611705576040805162461bcd60e51b815260206004820152601660248201527520bab1ba34b7b71030b63932b0b23c9032b73232b21760511b604482015290519081900360640190fd5b600082815260166020526040902060030154341161176a576040805162461bcd60e51b815260206004820152601e60248201527f546865726520616c7265616479206973206120686967686572206269642e0000604482015290519081900360640190fd5b600061177583611b2b565b9050336001600160a01b03821614156117bf5760405162461bcd60e51b8152600401808060200182810382526036815260200180613e186036913960400191505060405180910390fd5b600083815260166020526040902060030154156118e757600083815260166020526040808220600281015460039091015491516001600160a01b0390911691908381818185875af1925050503d8060008114611837576040519150601f19603f3d011682016040523d82523d6000602084013e61183c565b606091505b5050905080611885576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b600084815260166020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d929181900390910190a1505b6000838152601660209081526040918290206002810180546001600160a01b031916339081179091553460039092018290558351918252918101869052825191927fdafc4a123c6bb3b49dd38a0cba299808581a0126a37248a5f1102d5e5fa0633792918290030190a250600f5481146110d5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613952833981519152604482015290519081900360640190fd5b600061113d82612c8b565b60006119ab6110eb565b82106119e85760405162461bcd60e51b815260040180806020018281038252602c815260200180613d62602c913960400191505060405180910390fd5b600782815481106119f557fe5b90600052602060002001549050919050565b60006060611a13612bd9565b611a4e5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b5b6030913960400191505060405180910390fd5b611a588585612dce565b611a628484612ca8565b506001949350505050565b6016602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909160ff9091169086565b60006060611ac0612bd9565b611afb5760405162461bcd60e51b8152600401808060200182810382526030815260200180613b5b6030913960400191505060405180910390fd5b600e805460010190819055611b0f90612c8b565b611afb57611b1f83600e54612dce565b61153e600e5485612ca8565b6000818152600160205260408120546001600160a01b03168061113d5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b116029913960400191505060405180910390fd5b60006001600160a01b038216611bc65760405162461bcd60e51b815260040180806020018281038252602a815260200180613ae7602a913960400191505060405180910390fd5b6001600160a01b038216600090815260036020526040902061113d90612e22565b6060611bf282612e26565b805480602002602001604051908101604052809291908181526020018280548015611c3c57602002820191906000526020600020905b815481526020019060010190808311611c28575b50505050509050919050565b6000611c5333612deb565b158015611c71575060008281526016602052604090206004015460ff165b8015611c8e57506000828152601660205260409020600101544211155b8015611cb45750611c9e82611b2b565b6001600160a01b0316336001600160a01b031614155b8015611cd0575030611cc583610f58565b6001600160a01b0316145b156114e557506001610ebc565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f4d5780601f10610f2257610100808354040283529160200191610f4d565b6060611d48612bd9565b611d835760405162461bcd60e51b8152600401808060200182810382526030815260200180613b5b6030913960400191505060405180910390fd5b6110d582612e40565b611d9533612e88565b565b6001600160a01b038216331415611df5576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60136020526000908152604090205481565b6110d5338383612daf565b600061113d600c8363ffffffff612ed016565b600d5460ff1681565b60009081526016602052604090206003015490565b60008481526014602052604090205415611efc5760405162461bcd60e51b8152600401808060200182810382526044815260200180613c9f6044913960600191505060405180910390fd5b60008481526016602052604090206004015460ff1615611f4d5760405162461bcd60e51b815260040180806020018281038252603581526020018061391d6035913960400191505060405180910390fd5b33611f5785611b2b565b6001600160a01b031614611f9c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613972602e913960400191505060405180910390fd5b600084815260166020526040902080546001600160a01b0319166001600160a01b0384161781556001808201859055600582018390556004909101805460ff19169091179055611fec3085610fba565b50505050565b600033611ffe83611b2b565b6001600160a01b031614801561113d57505060009081526016602052604090206004015460ff161590565b612034848484611143565b61204084848484612f37565b611fec5760405162461bcd60e51b81526004018080602001828103825260328152602001806139cb6032913960400191505060405180910390fd5b606061208682612c8b565b6120c15760405162461bcd60e51b815260040180806020018281038252602f815260200180613c70602f913960400191505060405180910390fd5b6000828152600b602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015611c3c5780601f1061212957610100808354040283529160200191611c3c565b820191906000526020600020905b8154815290600101906020018083116121375750939695505050505050565b3361216084611b2b565b6001600160a01b0316146121a55760405162461bcd60e51b815260040180806020018281038252602b8152602001806139fd602b913960400191505060405180910390fd5b60008381526016602052604090206004015460ff16156121f65760405162461bcd60e51b815260040180806020018281038252603d815260200180613db9603d913960400191505060405180910390fd5b60008381526014602052604090208290558115611193576122173084610fba565b600083815260156020526040902080546001600160a01b0383166001600160a01b0319909116179055505050565b600f80546001019081905560008281526016602052604090206004015460ff1615801561227f575060008281526014602052604090205415155b6122ba5760405162461bcd60e51b815260040180806020018281038252602d815260200180613d04602d913960400191505060405180910390fd5b60008281526014602052604090205434101561231d576040805162461bcd60e51b815260206004820152601e60248201527f4552433732314d61746368613a204e6f7420656e6f7567682066756e64730000604482015290519081900360640190fd5b600061232883611b2b565b9050336001600160a01b03821614156123725760405162461bcd60e51b8152600401808060200182810382526037815260200180613a4c6037913960400191505060405180910390fd5b604080516001600160a01b038316602482015233604482015260648082018690528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526123ca90309061306a565b60006123f260646123e66012543461320c90919063ffffffff16565b9063ffffffff61326c16565b90506000612406348363ffffffff6132d616565b60008681526015602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d8060008114612463576040519150601f19603f3d011682016040523d82523d6000602084013e612468565b606091505b50509050806124b1576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b6010546040516000916001600160a01b03169085908381818185875af1925050503d80600081146124fe576040519150601f19603f3d011682016040523d82523d6000602084013e612503565b606091505b505090508061254c576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b60008781526014602090815260408083208390556015825280832080546001600160a01b0319169055601382529182902034908190558251908152915133926001600160a01b038916928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe9281900390910190a4601254604080513481526020810192909252818101869052516001600160a01b0387169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb9181900360600190a35050505050600f5481146110d5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613952833981519152604482015290519081900360640190fd5b600f80546001019081905561266f82612ab4565b6126b2576040805162461bcd60e51b815260206004820152600f60248201526e43616e6e6f742066696e616c697a6560881b604482015290519081900360640190fd5b600082815260166020526040902060030154156129c957600082815260166020526040812060028101546012546003909201546001600160a01b039091169291612709916064916123e6919063ffffffff61320c16565b6000858152601660205260408120600301549192509061272f908363ffffffff6132d616565b60008681526016602052604080822054905192935090916001600160a01b039091169083908381818185875af1925050503d806000811461278c576040519150601f19603f3d011682016040523d82523d6000602084013e612791565b606091505b50509050806127da576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b6010546040516000916001600160a01b03169085908381818185875af1925050503d8060008114612827576040519150601f19603f3d011682016040523d82523d6000602084013e61282c565b606091505b5050905080612875576040805162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015290519081900360640190fd5b6000878152601660209081526040918290208054600390910154835190815292516001600160a01b03808a16949216928b927f88863d5e20f64464b554931394e2e4b6f09c10015147215bf26b3ba5070acebe929081900390910190a4600087815260166020908152604091829020805460039091015460125484519182529281019290925281830187905291516001600160a01b039092169189917fef7a63d352d8b0f42e35d7f8bd277ba75ba2ff721a50eaad4c62f1ee6561d5eb919081900360600190a3600061294788611b2b565b604080516001600160a01b0380841660248301528916604482015260648082018c90528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790529091506129a490309061306a565b5050506000858152601660209081526040808320600301546013909252909120555050505b600082815260166020908152604091829020600281015460039091015483516001600160a01b0390921682529181019190915281517fdaec4582d5d9595688c8c98545fdd1c696d41c6aeaeb636737e84ed2f5c00eda929181900390910190a1600082815260166020526040812080546001600160a01b031990811682556001820183905560028201805490911690556003810182905560048101805460ff1916905560050155600f5481146110d5576040805162461bcd60e51b815260206004820152601f6024820152600080516020613952833981519152604482015290519081900360640190fd5b60008181526016602052604081206004015460ff168015612ae657506000828152601660205260409020600101544210155b8015611cd0575060008281526016602052604090206005810154600390910154101580611cd057506000828152601660205260409020600301546114e557506001610ebc565b6000818152601460205260408120548190819015612b5d575050506000818152601460205260408120549080612ba4565b60008481526016602052604090206003015415612b8f5750505060008181526016602052604081206003015481612ba4565b50505060008181526013602052604081205481905b9193909250565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600d5460009060ff1680612bf15750612bf133611e80565b905090565b60008181526016602052604081206004015460ff168015611cd057506000828152601660205260409020600101544210801590612c43575060008281526016602052604090206003015415155b8015612c65575060008281526016602052604090206005810154600390910154105b80611cd0575030612c7583610f58565b6001600160a01b0316146114e557506001610ebc565b6000908152600160205260409020546001600160a01b0316151590565b612cb182612c8b565b612cec5760405162461bcd60e51b815260040180806020018281038252602c815260200180613bf9602c913960400191505060405180910390fd5b6000828152600b60209081526040909120825161119392840190613864565b6000612d1682612c8b565b612d515760405162461bcd60e51b815260040180806020018281038252602c815260200180613a83602c913960400191505060405180910390fd5b6000612d5c83611b2b565b9050806001600160a01b0316846001600160a01b03161480612d975750836001600160a01b0316612d8c84610f58565b6001600160a01b0316145b80612da75750612da78185612bab565b949350505050565b612dba838383613333565b612dc48382613477565b611193828261356c565b612dd882826135aa565b612de2828261356c565b6110d5816136db565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590612da75750141592915050565b5490565b6001600160a01b0316600090815260056020526040902090565b612e51600c8263ffffffff61371f16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b612e99600c8263ffffffff6137a016565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b038216612f175760405162461bcd60e51b8152600401808060200182810382526022815260200180613c256022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000612f4b846001600160a01b0316612deb565b612f5757506001612da7565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015612fd1578181015183820152602001612fb9565b50505050905090810190601f168015612ffe5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561302057600080fd5b505af1158015613034573d6000803e3d6000fd5b505050506040513d602081101561304a57600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b61307c826001600160a01b0316612deb565b6130cd576040805162461bcd60e51b815260206004820181905260248201527f536166654552433732313a2063616c6c20746f206e6f6e2d636f6e7472616374604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061310b5780518252601f1990920191602091820191016130ec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461316d576040519150601f19603f3d011682016040523d82523d6000602084013e613172565b606091505b5091509150816131b35760405162461bcd60e51b8152600401808060200182810382526021815260200180613b3a6021913960400191505060405180910390fd5b805115611fec578080602001905160208110156131cf57600080fd5b5051611fec5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d8e602b913960400191505060405180910390fd5b60008261321b5750600061113d565b8282028284828161322857fe5b04146132655760405162461bcd60e51b8152600401808060200182810382526021815260200180613bac6021913960400191505060405180910390fd5b9392505050565b60008082116132c2576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816132cd57fe5b04949350505050565b60008282111561332d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b826001600160a01b031661334682611b2b565b6001600160a01b03161461338b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613c476029913960400191505060405180910390fd5b6001600160a01b0382166133d05760405162461bcd60e51b8152600401808060200182810382526024815260200180613a286024913960400191505060405180910390fd5b6133d981613807565b6001600160a01b03831660009081526003602052604090206133fa90613844565b6001600160a01b038216600090815260036020526040902061341b9061385b565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600560205260408120546134a190600163ffffffff6132d616565b60008381526006602052604090205490915080821461353c576001600160a01b03841660009081526005602052604081208054849081106134de57fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b03168152602001908152602001600020838154811061351c57fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b03841660009081526005602052604090208054906135659060001983016138e2565b5050505050565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b6001600160a01b038216613605576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61360e81612c8b565b15613660576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020908152604080832080546001600160a01b0319166001600160a01b03871690811790915583526003909152902061369f9061385b565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546000838152600860205260408120829055600182018355919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155565b6137298282612ed0565b1561377b576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6137aa8282612ed0565b6137e55760405162461bcd60e51b8152600401808060200182810382526021815260200180613b8b6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000818152600260205260409020546001600160a01b03161561384157600081815260026020526040902080546001600160a01b03191690555b50565b805461385790600163ffffffff6132d616565b9055565b80546001019055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106138a557805160ff19168380011785556138d2565b828001600101855582156138d2579182015b828111156138d25782518255916020019190600101906138b7565b506138de929150613902565b5090565b815481835581811115611193576000838152602090206111939181019083015b610f5591905b808211156138de576000815560010161390856fe4552433732314d61746368613a205468652073656c6563746564204e465420616c72656164792068617320616e2061756374696f6e5265656e7472616e637947756172643a207265656e7472616e742063616c6c004552433732314d61746368613a204f6e6c79206f776e65722063616e2061756374696f6e2074686973206974656d455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732314d61746368613a204f6e6c79206f776e65722063616e2073656c6c2074686973206974656d4552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732314d61746368613a205468652073656c6c65722063616e6e6f742062757920686973206f776e20636f6c6c65637469626c654552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e536166654552433732313a206c6f772d6c6576656c2063616c6c206661696c65644d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732314d61746368613a205468652073656c6563746564204e4654206973206f70656e20666f722073616c652c2063616e6e6f742062652061756374696f6e65644552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732314d61746368613a2054686520636f6c6c65637469626c65206973206e6f7420666f722073616c654552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243373231456e756d657261626c653a20676c6f62616c20696e646578206f7574206f6620626f756e6473536166654552433732313a204552433230206f7065726174696f6e20646964206e6f7420737563636565644552433732314d61746368613a2043616e6e6f742073656c6c20616e206974656d2077686963682068617320616e206163746976652061756374696f6e436f6e646974696f6e7320746f20776974686472617720617265206e6f74206d65744552433732314d61746368613a20546865206f776e65722063616e6e6f742062696420686973206f776e20636f6c6c65637469626c65a265627a7a72315820feb3cf66541a12cde5ea33f6cacbe1309b0df9b2b93dd904e90eac24c47e0de464736f6c634300051100324552433732314d61746368613a20436f6d6d697373696f6e20726174652068617320746f206265206265747765656e203020616e6420313030526f6c65733a206163636f756e7420697320746865207a65726f206164647265737300000000000000000000000046e9eddf02ae3cd666b5025c12f4b4b7cd82289500000000000000000000000046e9eddf02ae3cd666b5025c12f4b4b7cd822895000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000046e616d6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000673796d626f6c0000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

44631:15163:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14725:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14725:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14725:167:0;-1:-1:-1;;;;;;14725:167:0;;:::i;:::-;;;;;;;;;;;;;;;;;;39603:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39603:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39603:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19687:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19687:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19687:241:0;;:::i;:::-;;;;-1:-1:-1;;;;;19687:241:0;;;;;;;;;;;;;;18959:435;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18959:435:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18959:435:0;;;;;;;;:::i;:::-;;42171:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42171:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42171:109:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42171:109:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42171:109:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42171:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42171:109:0;;-1:-1:-1;42171:109:0;;-1:-1:-1;;;;;42171:109:0:i;45169:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45169:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45169:47:0;;:::i;:::-;;;;;;;;;;;;;;;;33485:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33485:96:0;;;:::i;50744:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50744:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50744:175:0;;:::i;21433:361::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21433:361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21433:361:0;;;;;;;;;;;;;;;;;:::i;59499:290::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59499:290:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;59499:290:0;;;;;;;;;;;;;;;:::i;54900:505::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54900:505:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54900:505:0;;:::i;33094:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33094:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33094:232:0;;;;;;;;:::i;44852:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44852:29:0;;;:::i;48938:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48938:301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48938:301:0;;:::i;30440:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30440:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30440:167:0;;;;;;;;:::i;22456:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22456:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22456:168:0;;;;;;;;;;;;;;;;;:::i;57687:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57687:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57687:135:0;;:::i;52302:1797::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52302:1797:0;;:::i;41929:102::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41929:102:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41929:102:0;;:::i;33927:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33927:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33927:199:0;;:::i;41222:213::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41222:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;41222:213:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41222:213:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41222:213:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41222:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41222:213:0;;-1:-1:-1;41222:213:0;;-1:-1:-1;;;;;41222:213:0:i;46524:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46524:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46524:43:0;;:::i;:::-;;;;-1:-1:-1;;;;;46524:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42502:278;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42502:278:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42502:278:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;42502:278:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42502:278:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42502:278:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42502:278:0;;-1:-1:-1;;;42502:278:0;;-1:-1:-1;;;;;42502:278:0;;-1:-1:-1;42502:278:0;;-1:-1:-1;42502:278:0:i;18263:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18263:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18263:265:0;;:::i;17789:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17789:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17789:248:0;-1:-1:-1;;;;;17789:248:0;;:::i;42039:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42039:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42039:124:0;-1:-1:-1;;;;;42039:124:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42039:124:0;;;;;;;;;;;;;;;;;51735:393;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51735:393:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51735:393:0;;:::i;39803:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39803:89:0;;;:::i;29391:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29391:92:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29391:92:0;-1:-1:-1;;;;;29391:92:0;;:::i;29491:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29491:77:0;;;:::i;20229:248::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20229:248:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20229:248:0;;;;;;;;;;:::i;45007:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45007:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45007:42:0;;:::i;42950:136::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42950:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42950:136:0;;;;;;;;:::i;29274:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29274:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29274:109:0;-1:-1:-1;;;;;29274:109:0;;:::i;29965:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29965:25:0;;;:::i;57830:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57830:121:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57830:121:0;;:::i;50981:746::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50981:746:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;50981:746:0;;;;;;;;-1:-1:-1;;;;;50981:746:0;;;;;;;;;;:::i;47553:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47553:144:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47553:144:0;;:::i;23359:348::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23359:348:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;23359:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;23359:348:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23359:348:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23359:348:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23359:348:0;;-1:-1:-1;23359:348:0;;-1:-1:-1;;;;;23359:348:0:i;40099:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40099:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40099:205:0;;:::i;47743:746::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47743:746:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47743:746:0;;;;;;;;;;;-1:-1:-1;;;;;47743:746:0;;:::i;49266:1470::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49266:1470:0;;:::i;55908:1743::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55908:1743:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55908:1743:0;;:::i;55413:416::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55413:416:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55413:416:0;;:::i;48631:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48631:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48631:299:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20807:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20807:179:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20807:179:0;;;;;;;;;;:::i;30615:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30615:110:0;;;:::i;54306:528::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54306:528:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54306:528:0;;:::i;14725:167::-;-1:-1:-1;;;;;;14851:33:0;;14822:4;14851:33;;;;;;;;;;;;;14725:167;;;;:::o;39603:85::-;39675:5;39668:12;;;;;;;;-1:-1:-1;;39668:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39642:13;;39668:12;;39675:5;;39668:12;;39675:5;39668:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39603:85;;:::o;19687:241::-;19746:7;19788:16;19796:7;19788;:16::i;:::-;19766:110;;;;-1:-1:-1;;;19766:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19896:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19896:24:0;;19687:241::o;18959:435::-;19023:13;19039:16;19047:7;19039;:16::i;:::-;19023:32;;19080:5;-1:-1:-1;;;;;19074:11:0;:2;-1:-1:-1;;;;;19074:11:0;;;19066:57;;;;-1:-1:-1;;;19066:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19158:10;-1:-1:-1;;;;;19158:19:0;;;;:58;;;19181:35;19198:5;19205:10;19181:16;:35::i;:::-;19136:164;;;;-1:-1:-1;;;19136:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19313:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19313:29:0;-1:-1:-1;;;;;19313:29:0;;;;;;;;;19358:28;;19313:24;;19358:28;;;;;;;18959:435;;;:::o;42171:109::-;42246:26;42259:7;42268:3;42246:12;:26::i;:::-;42171:109;;:::o;45169:47::-;;;;;;;;;;;;;:::o;33485:96::-;33556:10;:17;33485:96;:::o;50744:175::-;50802:4;50845:10;50827:16;50835:7;50827;:16::i;:::-;-1:-1:-1;;;;;50827:28:0;;:55;;;;-1:-1:-1;50860:17:0;;;;:8;:17;;;;;:22;;;;;50859:23;50827:55;:83;;;;-1:-1:-1;50886:21:0;;;;:12;:21;;;;;;:24;50827:83;50819:92;50744:175;-1:-1:-1;;50744:175:0:o;21433:361::-;21625:39;21644:10;21656:7;21625:18;:39::i;:::-;21603:138;;;;-1:-1:-1;;;21603:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21754:32;21768:4;21774:2;21778:7;21754:13;:32::i;:::-;21433:361;;;:::o;59499:290::-;59628:14;;-1:-1:-1;;;;;59628:14:0;59616:10;:26;59608:70;;;;;-1:-1:-1;;;59608:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59689:5;:12;;-1:-1:-1;;;;;;59689:12:0;-1:-1:-1;;;;;59689:12:0;;;;;;;;;;;59712:14;:30;59753:13;:28;;-1:-1:-1;;59753:28:0;;;;;;;;;;59499:290::o;54900:505::-;44395:13;:18;;44412:1;44395:18;;;;;54964:4;;54991:20;55003:7;54991:11;:20::i;:::-;54983:67;;;;-1:-1:-1;;;54983:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55150:1;55119:17;;;:8;:17;;;;;:28;;;:32;55115:211;;55169:12;55187:17;;;:8;:17;;;;;;:31;;;;55230:28;;;;;55187:76;;-1:-1:-1;;;;;55187:31:0;;;;55230:28;55169:12;55187:76;55169:12;55187:76;55230:28;55187:31;:76;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;55168:95:0;;;55286:7;55278:36;;;;;-1:-1:-1;;;55278:36:0;;;;;;;;;;;;-1:-1:-1;;;55278:36:0;;;;;;;;;;;;;;;55115:211;;55378:17;;;;:8;:17;;;;;55371:24;;-1:-1:-1;;;;;;55371:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55371:24:0;;;;;;44507:13;;44491:29;;44483:73;;;;;-1:-1:-1;;;44483:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44483:73:0;;;;;;;;;;;;;;;54900:505;;;;:::o;33094:232::-;33174:7;33210:16;33220:5;33210:9;:16::i;:::-;33202:5;:24;33194:80;;;;-1:-1:-1;;;33194:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33292:19:0;;;;;;:12;:19;;;;;:26;;33312:5;;33292:26;;;;;;;;;;;;;;33285:33;;33094:232;;;;:::o;44852:29::-;;;-1:-1:-1;;;;;44852:29:0;;:::o;48938:301::-;48992:7;49017:17;;;:8;:17;;;;;:22;;;;;49016:23;:50;;;;-1:-1:-1;49065:1:0;49043:21;;;:12;:21;;;;;;:23;;49016:50;:77;;;;-1:-1:-1;49092:1:0;49070:21;;;:12;:21;;;;;;:23;;49016:77;:118;;;;-1:-1:-1;49129:4:0;49097:20;49109:7;49097:11;:20::i;:::-;-1:-1:-1;;;;;49097:37:0;;49016:118;49012:220;;;-1:-1:-1;49158:21:0;;;;:12;:21;;;;;;49151:28;;49012:220;-1:-1:-1;49219:1:0;49212:8;;30440:167;30537:4;30837:21;30891:10;:8;:10::i;:::-;30869:108;;;;-1:-1:-1;;;30869:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30559:18;30565:2;30569:7;30559:5;:18::i;:::-;-1:-1:-1;30595:4:0;;30440:167;-1:-1:-1;;;30440:167:0:o;22456:168::-;22577:39;22594:4;22600:2;22604:7;22577:39;;;;;;;;;;;;:16;:39::i;57687:135::-;57748:15;57783:17;;;:8;:17;;;;;:31;;;-1:-1:-1;;;;;57783:31:0;;57687:135::o;52302:1797::-;44395:13;:18;;44412:1;44395:18;;;;;52693:23;:10;:21;:23::i;:::-;52692:24;52684:54;;;;;-1:-1:-1;;;52684:54:0;;;;;;;;;;;;-1:-1:-1;;;52684:54:0;;;;;;;;;;;;;;;52796:17;;;;:8;:17;;;;;:22;;;;;52788:58;;;;;-1:-1:-1;;;52788:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52928:4;52896:20;52908:7;52896:11;:20::i;:::-;-1:-1:-1;;;;;52896:37:0;;52888:77;;;;;-1:-1:-1;;;52888:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53078:17;;;;:8;:17;;;;;:28;;;53071:3;:35;;53049:107;;;;;-1:-1:-1;;;53049:107:0;;;;;;;;;;;;-1:-1:-1;;;53049:107:0;;;;;;;;;;;;;;;53274:17;;;;:8;:17;;;;;:28;;;53262:9;:40;53240:120;;;;;-1:-1:-1;;;53240:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53373:13;53389:16;53397:7;53389;:16::i;:::-;53373:32;-1:-1:-1;53424:10:0;-1:-1:-1;;;;;53424:17:0;;;;53416:84;;;;-1:-1:-1;;;53416:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53615:1;53586:17;;;:8;:17;;;;;:28;;;:30;53582:298;;53634:12;53652:17;;;:8;:17;;;;;;:31;;;;53695:28;;;;;53652:76;;-1:-1:-1;;;;;53652:31:0;;;;53695:28;53634:12;53652:76;53634:12;53652:76;53695:28;53652:31;:76;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;53633:95:0;;;53751:7;53743:36;;;;;-1:-1:-1;;;53743:36:0;;;;;;;;;;;;-1:-1:-1;;;53743:36:0;;;;;;;;;;;;;;;53806:17;;;;:8;:17;;;;;;;;;:31;;;;53839:28;;;;;53799:69;;-1:-1:-1;;;;;53806:31:0;;;53799:69;;;;;;;;;;;;;;;;;;;;;;53582:298;;53927:17;;;;:8;:17;;;;;;;;;:31;;;:44;;-1:-1:-1;;;;;;53927:44:0;53961:10;53927:44;;;;;;54013:9;53982:28;;;;:40;;;54038:51;;;;;;;;;;;;;53961:10;;54038:51;;;;;;;;;44471:1;44507:13;;44491:12;:29;44483:73;;;;;-1:-1:-1;;;44483:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44483:73:0;;;;;;;;;;;;;;41929:102;41983:4;42007:16;42015:7;42007;:16::i;33927:199::-;33985:7;34021:13;:11;:13::i;:::-;34013:5;:21;34005:78;;;;-1:-1:-1;;;34005:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34101:10;34112:5;34101:17;;;;;;;;;;;;;;;;34094:24;;33927:199;;;:::o;41222:213::-;41328:4;30837:21;30891:10;:8;:10::i;:::-;30869:108;;;;-1:-1:-1;;;30869:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41345:18;41351:2;41355:7;41345:5;:18::i;:::-;41374:31;41387:7;41396:8;41374:12;:31::i;:::-;-1:-1:-1;41423:4:0;;41222:213;-1:-1:-1;;;;41222:213:0:o;46524:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46524:43:0;;;;;;;;;;;;;;;;;;:::o;42502:278::-;42583:4;30837:21;30891:10;:8;:10::i;:::-;30869:108;;;;-1:-1:-1;;;30869:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42618:11;:13;;;;;;;;42650:20;;:7;:20::i;:::-;42600:72;;42682:22;42688:2;42692:11;;42682:5;:22::i;:::-;42715:35;42728:11;;42741:8;42715:12;:35::i;18263:265::-;18318:7;18354:20;;;:11;:20;;;;;;-1:-1:-1;;;;;18354:20:0;18407:19;18385:110;;;;-1:-1:-1;;;18385:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17789:248;17844:7;-1:-1:-1;;;;;17886:19:0;;17864:111;;;;-1:-1:-1;;;17864:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17995:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;42039:124::-;42098:16;42134:21;42149:5;42134:14;:21::i;:::-;42127:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42039:124;;;:::o;51735:393::-;51789:4;51811:23;:10;:21;:23::i;:::-;51810:24;:63;;;;-1:-1:-1;51851:17:0;;;;:8;:17;;;;;:22;;;;;51810:63;:115;;;;-1:-1:-1;51897:17:0;;;;:8;:17;;;;;:28;;;51890:3;:35;;51810:115;:162;;;;;51956:16;51964:7;51956;:16::i;:::-;-1:-1:-1;;;;;51942:30:0;:10;-1:-1:-1;;;;;51942:30:0;;;51810:162;:216;;;;-1:-1:-1;52021:4:0;51989:20;52001:7;51989:11;:20::i;:::-;-1:-1:-1;;;;;51989:37:0;;51810:216;51806:315;;;-1:-1:-1;52060:4:0;52053:11;;39803:89;39877:7;39870:14;;;;;;;;-1:-1:-1;;39870:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39844:13;;39870:14;;39877:7;;39870:14;;39877:7;39870:14;;;;;;;;;;;;;;;;;;;;;;;;29391:92;30837:21;30891:10;:8;:10::i;:::-;30869:108;;;;-1:-1:-1;;;30869:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:19;29467:7;29456:10;:19::i;29491:77::-;29535:25;29549:10;29535:13;:25::i;:::-;29491:77::o;20229:248::-;-1:-1:-1;;;;;20309:16:0;;20315:10;20309:16;;20301:54;;;;;-1:-1:-1;;;20301:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20387:10;20368:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;20368:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;20368:45:0;;;;;;;;;;20429:40;;;;;;;20368:34;;20387:10;20429:40;;;;;;;;;;;20229:248;;:::o;45007:42::-;;;;;;;;;;;;;:::o;42950:136::-;43040:38;43054:10;43066:2;43070:7;43040:13;:38::i;29274:109::-;29330:4;29354:21;:8;29367:7;29354:21;:12;:21;:::i;29965:25::-;;;;;;:::o;57830:121::-;57888:7;57915:17;;;:8;:17;;;;;:28;;;;57830:121::o;50981:746::-;51121:21;;;;:12;:21;;;;;;:24;51113:105;;;;-1:-1:-1;;;51113:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51238:17;;;;:8;:17;;;;;:22;;;;;51237:23;51229:89;;;;-1:-1:-1;;;51229:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51355:10;51337:16;51345:7;51337;:16::i;:::-;-1:-1:-1;;;;;51337:28:0;;51329:87;;;;-1:-1:-1;;;51329:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51429:17;;;;:8;:17;;;;;:44;;-1:-1:-1;;;;;;51429:44:0;-1:-1:-1;;;;;51429:44:0;;;;;-1:-1:-1;51484:28:0;;;:43;;;51538:25;;;:41;;;51590:22;;;;:29;;-1:-1:-1;;51590:29:0;;;;;;51686:31;51702:4;51429:17;51686:7;:31::i;:::-;50981:746;;;;:::o;47553:144::-;47608:4;47651:10;47633:16;47641:7;47633;:16::i;:::-;-1:-1:-1;;;;;47633:28:0;;:55;;;;-1:-1:-1;;47666:17:0;;;;:8;:17;;;;;:22;;;;;47665:23;;47553:144::o;23359:348::-;23509:31;23522:4;23528:2;23532:7;23509:12;:31::i;:::-;23573:48;23596:4;23602:2;23606:7;23615:5;23573:22;:48::i;:::-;23551:148;;;;-1:-1:-1;;;23551:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40099:205;40157:13;40191:16;40199:7;40191;:16::i;:::-;40183:76;;;;-1:-1:-1;;;40183:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40277:19;;;;:10;:19;;;;;;;;;40270:26;;;;;;-1:-1:-1;;40270:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40277:19;;40270:26;;40277:19;40270:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40270:26:0;;40099:205;-1:-1:-1;;;;;;40099:205:0:o;47743:746::-;47881:10;47863:16;47871:7;47863;:16::i;:::-;-1:-1:-1;;;;;47863:28:0;;47855:84;;;;-1:-1:-1;;;47855:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48016:17;;;;:8;:17;;;;;:22;;;;;48015:23;48007:97;;;;-1:-1:-1;;;48007:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48154:21;;;;:12;:21;;;;;:29;;;48249:7;;48245:235;;48333:31;48349:4;48356:7;48333;:31::i;:::-;48428:17;;;;:8;:17;;;;;:26;;-1:-1:-1;;;;;48428:26:0;;-1:-1:-1;;;;;;48428:26:0;;;;;;47743:746;;;:::o;49266:1470::-;44395:13;:18;;44412:1;44395:18;;;;;:13;49369:17;;;:8;:17;;;;;:22;;;;;49368:23;:50;;;;-1:-1:-1;49417:1:0;49395:21;;;:12;:21;;;;;;:23;;49368:50;49360:108;;;;-1:-1:-1;;;49360:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49529:21;;;;:12;:21;;;;;;49516:9;:34;;49508:77;;;;;-1:-1:-1;;;49508:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49629:13;49645:16;49653:7;49645;:16::i;:::-;49629:32;-1:-1:-1;49682:10:0;-1:-1:-1;;;;;49682:17:0;;;;49674:85;;;;-1:-1:-1;;;49674:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49909:78;;;-1:-1:-1;;;;;49909:78:0;;;;;;49967:10;49909:78;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;49909:78:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;49884:104:0;;49903:4;;49884:18;:104::i;:::-;50031:20;50054:38;50088:3;50054:29;50068:14;;50054:9;:13;;:29;;;;:::i;:::-;:33;:38;:33;:38;:::i;:::-;50031:61;-1:-1:-1;50103:20:0;50126:27;:9;50031:61;50126:27;:13;:27;:::i;:::-;50188:12;50206:17;;;:8;:17;;;;;;;:46;;50103:50;;-1:-1:-1;50188:12:0;;-1:-1:-1;;;;;50206:17:0;;;;50103:50;;50188:12;50206:46;50188:12;50206:46;50103:50;50206:17;:46;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;50187:65:0;;;50271:7;50263:36;;;;;-1:-1:-1;;;50263:36:0;;;;;;;;;;;;-1:-1:-1;;;50263:36:0;;;;;;;;;;;;;;;50353:5;;:34;;50334:13;;-1:-1:-1;;;;;50353:5:0;;50370:12;;50334:13;50353:34;50334:13;50353:34;50370:12;50353:5;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;50333:54:0;;;50406:8;50398:37;;;;;-1:-1:-1;;;50398:37:0;;;;;;;;;;;;-1:-1:-1;;;50398:37:0;;;;;;;;;;;;;;;50499:1;50475:21;;;:12;:21;;;;;;;;:25;;;50511:8;:17;;;;;:30;;-1:-1:-1;;;;;;50511:30:0;;;50554:7;:16;;;;;;50573:9;50554:28;;;;50600:43;;;;;;;50621:10;;-1:-1:-1;;;;;50600:43:0;;;50488:7;;50600:43;;;;;;;;;;50697:14;;50659:67;;;50686:9;50659:67;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50659:67:0;;;50670:7;;50659:67;;;;;;;;;44471:1;;;;;44507:13;;44491:12;:29;44483:73;;;;;-1:-1:-1;;;44483:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44483:73:0;;;;;;;;;;;;;;55908:1743;44395:13;:18;;44412:1;44395:18;;;;;55991:20;56003:7;55991:11;:20::i;:::-;55983:48;;;;;-1:-1:-1;;;55983:48:0;;;;;;;;;;;;-1:-1:-1;;;55983:48:0;;;;;;;;;;;;;;;56077:1;56048:17;;;:8;:17;;;;;:28;;;:30;56044:1435;;56167:29;56199:17;;;:8;:17;;;;;:31;;;;56345:14;;56312:28;;;;;-1:-1:-1;;;;;56199:31:0;;;;56167:29;56312:57;;56365:3;;56312:48;;:28;:48;:32;:48;:::i;:57::-;56384:20;56407:17;;;:8;:17;;;;;:28;;;56289:80;;-1:-1:-1;56384:20:0;56407:46;;56289:80;56407:46;:32;:46;:::i;:::-;56496:12;56514:17;;;:8;:17;;;;;;:29;:58;;56384:69;;-1:-1:-1;56496:12:0;;-1:-1:-1;;;;;56514:29:0;;;;56384:69;;56496:12;56514:58;56496:12;56514:58;56384:69;56514:29;:58;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56495:77:0;;;56595:7;56587:36;;;;;-1:-1:-1;;;56587:36:0;;;;;;;;;;;;-1:-1:-1;;;56587:36:0;;;;;;;;;;;;;;;56685:5;;:34;;56666:13;;-1:-1:-1;;;;;56685:5:0;;56702:12;;56666:13;56685:34;56666:13;56685:34;56702:12;56685:5;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;56665:54:0;;;56742:8;56734:37;;;;;-1:-1:-1;;;56734:37:0;;;;;;;;;;;;-1:-1:-1;;;56734:37:0;;;;;;;;;;;;;;;56807:17;;;;:8;:17;;;;;;;;;:29;;56853:28;;;;;56793:89;;;;;;;-1:-1:-1;;;;;56793:89:0;;;;56807:29;;;56816:7;;56793:89;;;;;;;;;;;56922:17;;;;:8;:17;;;;;;;;;:29;;56953:28;;;;;56983:14;;56902:110;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56922:29:0;;;;56931:7;;56902:110;;;;;;;;;;57064:13;57080:16;57088:7;57080;:16::i;:::-;57319:81;;;-1:-1:-1;;;;;57319:81:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;57319:81:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;57064:32:0;;-1:-1:-1;57294:107:0;;57313:4;;57294:18;:107::i;:::-;-1:-1:-1;;;57437:17:0;;;;:8;:17;;;;;;;;:28;;;57418:7;:16;;;;;;:47;-1:-1:-1;;;56044:1435:0;57509:17;;;;:8;:17;;;;;;;;;:31;;;;57542:28;;;;;57496:75;;-1:-1:-1;;;;;57509:31:0;;;57496:75;;;;;;;;;;;;;;;;;;;;;;57624:17;;;;:8;:17;;;;;57617:24;;-1:-1:-1;;;;;;57617:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57617:24:0;;;;;;44507:13;;44491:29;;44483:73;;;;;-1:-1:-1;;;44483:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44483:73:0;;;;;;;;;;;;;;55413:416;55472:4;55493:17;;;:8;:17;;;;;:22;;;;;:75;;;;-1:-1:-1;55540:17:0;;;;:8;:17;;;;;:28;;;55533:3;:35;;55493:75;:234;;;;-1:-1:-1;55634:17:0;;;;:8;:17;;;;;:25;;;;55604:28;;;;;:55;;;:108;;-1:-1:-1;55681:17:0;;;;:8;:17;;;;;:28;;;55489:333;;-1:-1:-1;55761:4:0;55754:11;;48631:299;48687:7;48729:21;;;:12;:21;;;;;;48687:7;;;;48729:23;48725:65;;-1:-1:-1;;;48762:21:0;;;;:12;:21;;;;;;;;48754:36;;48725:65;48834:1;48805:17;;;:8;:17;;;;;:28;;;:30;48801:79;;-1:-1:-1;;;48845:1:0;48848:17;;;:8;:17;;;;;:28;;;48845:1;48837:43;;48801:79;-1:-1:-1;;;48899:1:0;48905:16;;;:7;:16;;;;;;48899:1;;48631:299;;;;;;:::o;20807:179::-;-1:-1:-1;;;;;20943:25:0;;;20914:4;20943:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20807:179::o;30615:110::-;30680:13;;30656:4;;30680:13;;;:37;;;30697:20;30706:10;30697:8;:20::i;:::-;30673:44;;30615:110;:::o;54306:528::-;54365:4;54386:17;;;:8;:17;;;;;:22;;;;;:346;;;;-1:-1:-1;54475:17:0;;;;:8;:17;;;;;:28;;;54468:3;:35;;;;:92;;-1:-1:-1;54559:1:0;54528:17;;;:8;:17;;;;;:28;;;:32;;54468:92;:171;;;;-1:-1:-1;54614:17:0;;;;:8;:17;;;;;:25;;;;54585:28;;;;;:54;54468:171;54445:272;;;-1:-1:-1;54712:4:0;54680:20;54692:7;54680:11;:20::i;:::-;-1:-1:-1;;;;;54680:37:0;;54382:445;;-1:-1:-1;54766:4:0;54759:11;;23909:155;23966:4;23999:20;;;:11;:20;;;;;;-1:-1:-1;;;;;23999:20:0;24037:19;;;23909:155::o;40551:195::-;40637:16;40645:7;40637;:16::i;:::-;40629:73;;;;-1:-1:-1;;;40629:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40713:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;24434:428::-;24546:4;24590:16;24598:7;24590;:16::i;:::-;24568:110;;;;-1:-1:-1;;;24568:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24689:13;24705:16;24713:7;24705;:16::i;:::-;24689:32;;24751:5;-1:-1:-1;;;;;24740:16:0;:7;-1:-1:-1;;;;;24740:16:0;;:64;;;;24797:7;-1:-1:-1;;;;;24773:31:0;:20;24785:7;24773:11;:20::i;:::-;-1:-1:-1;;;;;24773:31:0;;24740:64;:113;;;;24821:32;24838:5;24845:7;24821:16;:32::i;:::-;24732:122;24434:428;-1:-1:-1;;;;24434:428:0:o;34510:245::-;34596:38;34616:4;34622:2;34626:7;34596:19;:38::i;:::-;34647:47;34680:4;34686:7;34647:32;:47::i;:::-;34707:40;34735:2;34739:7;34707:27;:40::i;35020:202::-;35084:24;35096:2;35100:7;35084:11;:24::i;:::-;35121:40;35149:2;35153:7;35121:27;:40::i;:::-;35174;35206:7;35174:31;:40::i;11280:845::-;11340:4;12025:20;;11855:66;12074:15;;;;;:42;;-1:-1:-1;12093:23:0;;;12066:51;-1:-1:-1;;11280:845:0:o;13495:114::-;13587:14;;13495:114::o;35434:126::-;-1:-1:-1;;;;;35533:19:0;35496:17;35533:19;;;:12;:19;;;;;;35434:126::o;29576:122::-;29633:21;:8;29646:7;29633:21;:12;:21;:::i;:::-;29670:20;;-1:-1:-1;;;;;29670:20:0;;;;;;;;29576:122;:::o;29706:130::-;29766:24;:8;29782:7;29766:24;:15;:24;:::i;:::-;29806:22;;-1:-1:-1;;;;;29806:22:0;;;;;;;;29706:130;:::o;28581:235::-;28680:4;-1:-1:-1;;;;;28710:21:0;;28702:68;;;;-1:-1:-1;;;28702:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28788:20:0;:11;:20;;;;;;;;;;;;;;;28581:235::o;26968:481::-;27124:4;27146:15;:2;-1:-1:-1;;;;;27146:13:0;;:15::i;:::-;27141:60;;-1:-1:-1;27185:4:0;27178:11;;27141:60;27242:153;;-1:-1:-1;;;27242:153:0;;27297:10;27242:153;;;;;;-1:-1:-1;;;;;27242:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27213:13;;27242:36;;;;;;27297:10;;27326:4;;27349:7;;27375:5;;27242:153;;;;;;;;;;;27213:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27242:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27242:153:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27242:153:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27242:153:0;-1:-1:-1;;;;;;27414:26:0;-1:-1:-1;;;27414:26:0;;-1:-1:-1;;26968:481:0;;;;;;:::o;58342:1118::-;58947:27;58955:5;-1:-1:-1;;;;;58947:25:0;;:27::i;:::-;58939:72;;;;;-1:-1:-1;;;58939:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59085:12;59099:23;59134:5;-1:-1:-1;;;;;59126:19:0;59146:4;59126:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;59126:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;59084:67:0;;;;59170:7;59162:53;;;;-1:-1:-1;;;59162:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59232:17;;:21;59228:225;;59374:10;59363:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59363:30:0;59355:86;;;;-1:-1:-1;;;59355:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8846:470;8904:7;9148:6;9144:47;;-1:-1:-1;9178:1:0;9171:8;;9144:47;9215:5;;;9219:1;9215;:5;:1;9239:5;;;;;:10;9231:56;;;;-1:-1:-1;;;9231:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:1;8846:470;-1:-1:-1;;;8846:470:0:o;9784:333::-;9842:7;9941:1;9937;:5;9929:44;;;;;-1:-1:-1;;;9929:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9984:9;10000:1;9996;:5;;;;;;;9784:333;-1:-1:-1;;;;9784:333:0:o;8411:184::-;8469:7;8502:1;8497;:6;;8489:49;;;;;-1:-1:-1;;;8489:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8561:5:0;;;8411:184::o;25836:530::-;25998:4;-1:-1:-1;;;;;25978:24:0;:16;25986:7;25978;:16::i;:::-;-1:-1:-1;;;;;25978:24:0;;25956:115;;;;-1:-1:-1;;;25956:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26090:16:0;;26082:65;;;;-1:-1:-1;;;26082:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26160:23;26175:7;26160:14;:23::i;:::-;-1:-1:-1;;;;;26196:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;26242:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;26288:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;26288:25:0;-1:-1:-1;;;;;26288:25:0;;;;;;;;;26331:27;;26288:20;;26331:27;;;;;;;25836:530;;;:::o;37039:1148::-;-1:-1:-1;;;;;37330:18:0;;37305:22;37330:18;;;:12;:18;;;;;:25;:32;;37360:1;37330:32;:29;:32;:::i;:::-;37373:18;37394:26;;;:17;:26;;;;;;37305:57;;-1:-1:-1;37527:28:0;;;37523:328;;-1:-1:-1;;;;;37594:18:0;;37572:19;37594:18;;;:12;:18;;;;;:34;;37613:14;;37594:34;;;;;;;;;;;;;;37572:56;;37678:11;37645:12;:18;37658:4;-1:-1:-1;;;;;37645:18:0;-1:-1:-1;;;;;37645:18:0;;;;;;;;;;;;37664:10;37645:30;;;;;;;;;;;;;;;;;;;:44;;;;37762:30;;;:17;:30;;;;;:43;;;37523:328;-1:-1:-1;;;;;37940:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;37940:27:0;;;:::i;:::-;;37039:1148;;;;:::o;35861:186::-;-1:-1:-1;;;;;35975:16:0;;;;;;;:12;:16;;;;;;;;:23;;35946:26;;;:17;:26;;;;;:52;;;36009:16;;;39:1:-1;23:18;;45:23;;36009:30:0;;;;;;;;35861:186::o;25115:335::-;-1:-1:-1;;;;;25187:16:0;;25179:61;;;;;-1:-1:-1;;;25179:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25260:16;25268:7;25260;:16::i;:::-;25259:17;25251:58;;;;;-1:-1:-1;;;25251:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25322:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;25322:25:0;-1:-1:-1;;;;;25322:25:0;;;;;;;;25358:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;25409;;25434:7;;-1:-1:-1;;;;;25409:33:0;;;25426:1;;25409:33;;25426:1;;25409:33;25115:335;;:::o;36248:164::-;36352:10;:17;;36325:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;36380:24:0;;;;;;;36248:164::o;28045:178::-;28123:18;28127:4;28133:7;28123:3;:18::i;:::-;28122:19;28114:63;;;;;-1:-1:-1;;;28114:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28188:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;28188:27:0;28211:4;28188:27;;;28045:178::o;28303:183::-;28383:18;28387:4;28393:7;28383:3;:18::i;:::-;28375:64;;;;-1:-1:-1;;;28375:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28450:20:0;28473:5;28450:20;;;;;;;;;;;:28;;-1:-1:-1;;28450:28:0;;;28303:183::o;27617:175::-;27717:1;27681:24;;;:15;:24;;;;;;-1:-1:-1;;;;;27681:24:0;:38;27677:108;;27771:1;27736:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;27736:37:0;;;27677:108;27617:175;:::o;13716:110::-;13797:14;;:21;;13816:1;13797:21;:18;:21;:::i;:::-;13780:38;;13716:110::o;13617:91::-;13681:19;;13699:1;13681:19;;;13617:91::o;44631:15163::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44631:15163:0;;;-1:-1:-1;44631:15163:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://feb3cf66541a12cde5ea33f6cacbe1309b0df9b2b93dd904e90eac24c47e0de4
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading