ETH Price: $1,983.16 (+6.32%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Burn155808202022-09-21 9:16:591257 days ago1663751819IN
0x78e8D2bC...b8367dAc9
0 ETH0.000269364.43743918
Burn155808192022-09-21 9:16:471257 days ago1663751807IN
0x78e8D2bC...b8367dAc9
0 ETH0.000290474.78511287
Burn155808182022-09-21 9:16:351257 days ago1663751795IN
0x78e8D2bC...b8367dAc9
0 ETH0.000265864.37973902
Burn155808182022-09-21 9:16:351257 days ago1663751795IN
0x78e8D2bC...b8367dAc9
0 ETH0.000265864.37973902
Burn155808172022-09-21 9:16:231257 days ago1663751783IN
0x78e8D2bC...b8367dAc9
0 ETH0.000285574.70439684
Burn155808162022-09-21 9:16:111257 days ago1663751771IN
0x78e8D2bC...b8367dAc9
0 ETH0.000260634.29365967
Burn155808162022-09-21 9:16:111257 days ago1663751771IN
0x78e8D2bC...b8367dAc9
0 ETH0.000260634.29365967
Burn155808152022-09-21 9:15:591257 days ago1663751759IN
0x78e8D2bC...b8367dAc9
0 ETH0.000281314.63434485
Burn155808082022-09-21 9:14:351257 days ago1663751675IN
0x78e8D2bC...b8367dAc9
0 ETH0.000301254.39510574
Burn155808062022-09-21 9:14:111257 days ago1663751651IN
0x78e8D2bC...b8367dAc9
0 ETH0.000323854.72489356
Burn155808032022-09-21 9:13:351257 days ago1663751615IN
0x78e8D2bC...b8367dAc9
0 ETH0.000312514.55933861
Burn155808022022-09-21 9:13:231257 days ago1663751603IN
0x78e8D2bC...b8367dAc9
0 ETH0.000331224.83238499
Burn155808012022-09-21 9:13:111257 days ago1663751591IN
0x78e8D2bC...b8367dAc9
0 ETH0.000305694.4599298
Burn155808012022-09-21 9:13:111257 days ago1663751591IN
0x78e8D2bC...b8367dAc9
0 ETH0.000305694.4599298
Burn155807992022-09-21 9:12:471257 days ago1663751567IN
0x78e8D2bC...b8367dAc9
0 ETH0.000333064.85915106
Burn155807922022-09-21 9:11:231257 days ago1663751483IN
0x78e8D2bC...b8367dAc9
0 ETH0.000227383.31744338
Mint155738992022-09-20 9:47:591258 days ago1663667279IN
0x78e8D2bC...b8367dAc9
0 ETH0.001560955.7869668
Mint155738642022-09-20 9:40:591258 days ago1663666859IN
0x78e8D2bC...b8367dAc9
0 ETH0.001824056.24441318
Mint155738352022-09-20 9:35:111258 days ago1663666511IN
0x78e8D2bC...b8367dAc9
0 ETH0.001894356.48506782
Mint155719922022-09-20 3:23:231258 days ago1663644203IN
0x78e8D2bC...b8367dAc9
0 ETH0.002963210.98556838
Mint155719862022-09-20 3:22:111258 days ago1663644131IN
0x78e8D2bC...b8367dAc9
0 ETH0.0034130311.68406922
Mint155719762022-09-20 3:20:111258 days ago1663644011IN
0x78e8D2bC...b8367dAc9
0 ETH0.002577479.5555512
Mint155719702022-09-20 3:18:591258 days ago1663643939IN
0x78e8D2bC...b8367dAc9
0 ETH0.002630689.75281842
Mint155719582022-09-20 3:16:351258 days ago1663643795IN
0x78e8D2bC...b8367dAc9
0 ETH0.002114027.83739999
Update Sale155719512022-09-20 3:15:111258 days ago1663643711IN
0x78e8D2bC...b8367dAc9
0 ETH0.000537838.31076779
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AuctionMarket

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-09-21
*/

pragma solidity >=0.6.0 <0.8.0;

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

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

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

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Ownable : Function called by unauthorized user."
        );
        _;
    }

    function owner() external view returns (address ownerAddress) {
        ownerAddress = _owner;
    }

    function transferOwnership(address newOwner)
        public
        onlyOwner
        returns (bool success)
    {
        require(newOwner != address(0), "Ownable/transferOwnership : cannot transfer ownership to zero address");
        success = _transferOwnership(newOwner);
    }

    function renounceOwnership() external onlyOwner returns (bool success) {
        success = _transferOwnership(address(0));
    }

    function _transferOwnership(address newOwner) internal returns (bool success) {
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
        success = true;
    }
}
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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

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

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

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

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

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

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

    function approve(address to, uint256 tokenId) external;

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

    function setApprovalForAll(address operator, bool _approved) external;

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

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
interface IERC721Metadata is IERC721 {

    /**
     * @dev  Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev  Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev  Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC721Enumerable is IERC721 {
	
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

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

abstract contract ERC165 is IERC165 {
	
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


library SafeMath {
    /**
     * @dev  Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev  Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev  Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev  Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev  Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev  Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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  Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev  Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev  Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}
library Address {
    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

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

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

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

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

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

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

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev  Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev  Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev  Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev  Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev  Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev  Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev  Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev  Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev  Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev  Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev  Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev  Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev  Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev  Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev  Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev  Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
library Strings {
    /**
     * @dev  Converts a `uint256` to its ASCII `string` representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

abstract contract ERC721Pausable is  Context,Ownable {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    constructor () {
        _paused = false;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }


    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }


    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    
    function pause() onlyOwner whenNotPaused public {
        _paused = true;
        emit Paused(_msgSender());
    }

    function unpause() onlyOwner whenPaused public {
        _paused = false;
        emit Unpaused(_msgSender());
    }
	
}
abstract contract ERC721Fees is  Context,Ownable {
    event FeePaused();
	event FeeUnPaused();
	
	event CancelFeePaused();
	event CancelFeeUnPaused();
	
	event SetFee(uint feeRate);
	event SetCancelFee(uint feeRate);

    uint private _feeRate;
    uint private _cancelFeeRate;
	
    bool private _feePaused;
    bool private _cancelFeePaused;

    constructor (uint feeRate_,uint cancelFeeRate_) {
		_feeRate         = feeRate_;
		_cancelFeeRate   = cancelFeeRate_;
		
        _feePaused       = false;
        _cancelFeePaused = false;
    }
	
    function feeRate() public view virtual returns (uint) {
		if(feePaused() == true){
			return 0;
		}
		
        return _feeRate;
    }	
	
    function cancelFeeRate() public view virtual returns (uint) {
		if(cancelFeePaused() == true){
			return 0;
		}
		
        return _cancelFeeRate;
    }	
	
    function feePaused() public view virtual returns (bool) {
        return _feePaused;
    }	
	
    function cancelFeePaused() public view virtual returns (bool) {
        return _cancelFeePaused;
    }
	
    modifier whenNotFeePaused() {
        require(!feePaused(), "Pausable: paused");
        _;
    }

    modifier whenFeePaused() {
        require(feePaused(), "Pausable: not paused");
        _;
    }	
	
    modifier whenNotCancelFeePaused() {
        require(!cancelFeePaused(), "Pausable: paused");
        _;
    }

    modifier whenCancelFeePaused() {
        require(cancelFeePaused(), "Pausable: not paused");
        _;
    }
	
    function feePause() onlyOwner whenNotFeePaused public {
        _feePaused = true;
        emit FeePaused();
    }

    function feeUnPause() onlyOwner whenFeePaused public {
        _feePaused = false;
        emit FeeUnPaused();
    }	
	
    function cancelFeePause() onlyOwner whenNotCancelFeePaused public {
        _cancelFeePaused = true;
        emit CancelFeePaused();
    }

    function cancelFeeUnPause() onlyOwner whenCancelFeePaused public {
        _cancelFeePaused = false;
        emit CancelFeeUnPaused();
    }
	
		
    function setFee(uint feeRate_) onlyOwner public {
		require(feeRate_ <= 100, "Up to 100 commission");
		
        _feeRate = feeRate_;
        emit SetFee(feeRate_);
    }	
	
    function setCancelFee(uint feeRate_) onlyOwner public {
		require(feeRate_ <= 100, "Up to 100 commission");
		
        _cancelFeeRate = feeRate_;
        emit SetCancelFee(feeRate_);
    }	
}
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}


abstract contract ERC20Payment is Ownable{
	//허용된 토큰 주소
    mapping(address => bool) public acceptedTokens;
    bool public allAcceptedTokens;
	
	//수락할 토큰 추가
	function tokenAccepted(address tokenAddress) onlyOwner public returns (bool) {
		acceptedTokens[tokenAddress] = true;
		
		return true;
	}
	
	//수락된 토큰 제거
	function tokenDenial(address tokenAddress) onlyOwner  public returns (bool) {
		acceptedTokens[tokenAddress] = false;
		return true;
	}
	
	//전체 수락 설정
	function setAllAcceptedTokens(bool _allAcceptedTokens) onlyOwner  public returns (bool) {
		allAcceptedTokens = _allAcceptedTokens;
		return true;
	}
	
    modifier onlyAcceptedToken(address tokenAddress) {
		if(allAcceptedTokens == false){
			require(
				tokenAddress == address(0) || acceptedTokens[tokenAddress] == true,
				"ERC20Payment : Disallowed token"
			);
		}
        _;
    }	
	
}

abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable 
,ERC721Pausable
,ERC721Fees
,ERC20Payment
{
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using Strings for uint256;
	using EnumerableMap for EnumerableMap.UintToAddressMap;
	
	EnumerableMap.UintToAddressMap internal _tokenOwners;
	
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    mapping (address => EnumerableSet.UintSet) internal _holderTokens;

    mapping (uint256 => address) private _tokenApprovals;

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

    mapping (uint256 => string) internal _tokenURIs;

    string internal _baseURI;
	
    string private _name;

    string private _symbol;
	
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;	
    
	constructor (string memory name_, string memory symbol_) 
	 
	ERC721Fees(15,1)
		{
        _name = name_;
        _symbol = symbol_;
		_baseURI = "ipfs://";

        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
	
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _tokenOwners.get(tokenId);
    }
	
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data));
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId));
        address owner = _ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || _operatorApprovals[owner][spender]);
    }

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

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data));
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0));
        require(!_exists(tokenId));

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = _ownerOf(tokenId); // internal owner

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

        _approve(address(0), tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.set(tokenId, address(0));

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

    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(_ownerOf(tokenId) == from);
        require(to != address(0));

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId));
        _tokenURIs[tokenId] = _tokenURI;
    }

    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(_ownerOf(tokenId), to, tokenId); // internal owner
    }

			function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {
			require(!paused());
		}
	    
	
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId));

        return _tokenApprovals[tokenId];
    }	
	
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0));
        return _holderTokens[owner].length();
    }
	
    function setBaseURI(string memory baseURI_) onlyOwner public virtual {
        _setBaseURI(baseURI_);
    }	
	
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }
	
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId));

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _tokenOwners.length();
    }
	

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }
	
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }
	
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _ownerOf(tokenId);
    }

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

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


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner);

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()));

        _approve(to, tokenId);
    }

    /**
     * @dev  See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender());

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev  See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev  See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
		
        _transfer(from, to, tokenId);
    }

    /**
     * @dev  See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
				require(hasAuction(tokenId) == false);
				
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev  See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId));
				require(hasAuction(tokenId) == false);
				
        _safeTransfer(from, to, tokenId, _data);
    }	
	
		struct Offer {
        bool isForSale;
        address seller;
        uint minValue; 
		uint endTime;
		address tokenAddress;
    }
	
    struct Bid {
        bool hasBid;
        address bidder;
        uint value;
    }
	
	// NFT 경매 등록 목록
    mapping (uint256 => Offer) public offers;

    // NFT 입찰 목록
    mapping (uint256 => Bid) public bids;
	
	event CreateAuction(address indexed owner,uint _tokenId, uint _minValue,uint _endTime);
	event CancelAuction(uint _tokenId);
	event EndAuction(uint _tokenId,uint price);
	
	event Bidding(uint _tokenId,uint value);
	event CancelBid(uint _tokenId);
	
		//경매등록
	function _createAuction(address _tokenAddress,uint256 _tokenId, uint _minValue,uint _auctionTime) onlyAcceptedToken(_tokenAddress) internal virtual {
		require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 확인
		
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale != true);//현재 판매중인지 확인
		
        offers[_tokenId] = Offer(true, msg.sender, _minValue,block.timestamp + _auctionTime,_tokenAddress);
		emit CreateAuction(msg.sender, _tokenId, _minValue,block.timestamp + _auctionTime);
	}
	//경매취소
    function _cancelAuction(uint256 _tokenId) internal virtual {
       require(_ownerOf(_tokenId) == msg.sender);//토큰 소유자인지 체크
	   
	   Offer storage offer =  offers[_tokenId];
	   require(offer.isForSale == true);//현재 경매중인지 체크
	   
	   Bid storage bid = bids[_tokenId];
	   require(bid.hasBid != true);//입찰자가 있을경우 경매 취소 불가능

	   offers[_tokenId] = Offer(false, msg.sender, 0,0,address(0));
	   
	   emit CancelAuction(_tokenId);
    }
		
		//입찰하기
    function _bid(uint256 _tokenId,uint256 _value) internal virtual {
		require(_ownerOf(_tokenId) != msg.sender);//토큰 보유자
		
		Offer storage offer =  offers[_tokenId];
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우
		
		
        Bid storage existing = bids[_tokenId];
		
		if(offer.tokenAddress == address(0)){
			require(msg.value >= offer.minValue);//입찰 금액이 최소 입찰액보다 작은지 체크
			require(msg.value > existing.value);//입찰금액이 이전 입찰금액보다 적을경우 트랜잭션 취소
	        if (existing.value > 0) {
				//이전 입찰자에게 이더리움을 돌려줌
				address payable bidder = payable(existing.bidder);
				bidder.transfer(existing.value);
			}
			
			bids[_tokenId] = Bid(true, msg.sender, msg.value);
		}else{
			require(_value >= offer.minValue);//입찰 금액이 최소 입찰액보다 작은지 체크
			require(_value > existing.value);//입찰금액이 이전 입찰금액보다 적을경우 트랜잭션 취소
			if (existing.value > 0) {
				TransferHelper.safeTransfer(
					offer.tokenAddress, existing.bidder, existing.value
				);
			}
			
			TransferHelper.safeTransferFrom(
				offer.tokenAddress, msg.sender, address(this), _value
			);
			
			bids[_tokenId] = Bid(true, msg.sender, _value);
		}

		
		emit Bidding(_tokenId,msg.value);
    }	
		
		//입찰취소
    function _cancelBid(uint256 _tokenId) internal virtual {
		Offer storage offer =  offers[_tokenId];
		require(offer.isForSale == true);//경매가 진행중인지 체크
		require(block.timestamp < offer.endTime);//경매가 종료되었을 경우

        Bid storage bid = bids[_tokenId];
		require(bid.hasBid == true);
		require(bid.bidder == msg.sender);//입찰자가 본인인 경우
		
		uint cancelFee = bid.value * cancelFeeRate() / 1000;
		if(offer.tokenAddress == address(0)){
			address payable bidder = payable(bid.bidder);
			address payable seller = payable(offer.seller);
			
			bidder.transfer(bid.value - cancelFee);
			seller.transfer(cancelFee);
		}else{
			TransferHelper.safeTransfer(
				offer.tokenAddress, bid.bidder, bid.value - cancelFee
			);
			TransferHelper.safeTransfer(
				offer.tokenAddress, offer.seller, cancelFee
			);
		}
				
		bids[_tokenId] = Bid(false, address(0), 0);
		
		emit CancelBid(_tokenId);
    }
		
		//경매종료
    function _endAuction(uint256 _tokenId) internal virtual {
        Offer storage offer =  offers[_tokenId];
		require(block.timestamp >= offer.endTime);//경매 종료 시간이 아닐경우 오류
		require(offer.isForSale == true);//경매가 이미 종료된 경우
		
		address payable seller = payable(_ownerOf(_tokenId));
		
		Bid storage bid = bids[_tokenId];
		_transfer(offer.seller, bid.bidder, _tokenId);

        
		// 수수료
		uint _commissionValue = bid.value * feeRate() / 1000;
		uint _sellerValue = bid.value - _commissionValue;
		if(offer.tokenAddress == address(0)){
			seller.transfer(_sellerValue);//판매자에게 판매대금 지급
			
			address payable contractOwner = payable(_owner);
			contractOwner.transfer(_commissionValue);//발행자에게 수수료 지급
		}else{
			TransferHelper.safeTransfer(
				offer.tokenAddress, offer.seller, _sellerValue
			);
			TransferHelper.safeTransfer(
				offer.tokenAddress, _owner, _commissionValue
			);
		}
				
		emit EndAuction(_tokenId,bid.value);
		_resetAuction(_tokenId);
	}
	function _resetAuction(uint256 _tokenId) internal virtual {
        offers[_tokenId] = Offer(false, address(0), 0,0,address(0));
        bids[_tokenId] = Bid(false, address(0), 0);
	}
		
	
	
	function hasAuction(uint256 _tokenId) public view virtual returns (bool){
		Offer storage offer =  offers[_tokenId];
		if(offer.isForSale != true){
			return false;
		}
		
		return true;
	}
	
}


abstract contract ERC721Burnable is ERC721
{
	
    function burn(uint256 _tokenId) external payable{
        require(_isApprovedOrOwner(_msgSender(), _tokenId) || _owner == _msgSender(), "ERC721Burnable: caller is not owner nor approved");
		
				Offer storage offer =  offers[_tokenId];
		if(offer.isForSale == true){
			
			Bid storage bid = bids[_tokenId];
			if(bid.hasBid == true){
				address payable bidder = payable(bid.bidder);
				bidder.transfer(bid.value);
			}
			
			_resetAuction(_tokenId);
		}
				
        _burn(_tokenId);
    }

}
abstract
contract Market is
ERC721Burnable
{
    address payable public _contractOwner;

    mapping (uint => uint) public price;
    mapping (uint => bool) public listedMap;
		mapping (uint => address) public saleTokenAddresses;
	
    event Purchase(address indexed previousOwner, address indexed newOwner, uint price, uint nftID, string uri);

    event Minted(address indexed minter, uint256 price, uint nftID, string uri);

    event PriceUpdate(address indexed owner, uint oldPrice, uint newPrice, uint nftID);

    event NftListStatus(address indexed owner, uint nftID, bool isListed);
	
		
		//즉시 판매 생성
    function mint(address _tokenAddress,string memory _tokenURI, address _toAddress, uint256 _price) onlyAcceptedToken(_tokenAddress) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _price;
		saleTokenAddresses[_tokenId] = _tokenAddress;
        listedMap[_tokenId] = true;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _price, _tokenId, _tokenURI);

        return _tokenId;
    }
		
    function buy(uint _id) external payable {
        _validate(_id);

        address _previousOwner = ownerOf(_id);
        address _newOwner = msg.sender;

        _trade(_id);

        emit Purchase(_previousOwner, _newOwner, price[_id], _id, tokenURI(_id));
    }

    function _validate(uint _id) internal {
        bool isItemListed = listedMap[_id];
        require(_exists(_id));
        require(isItemListed);
        require(msg.sender != ownerOf(_id));
    }
	
	    function _trade(uint _id) internal {
        address payable contractOwner = payable(_owner);
        address payable _buyer = payable(msg.sender);
        address payable _owner = payable(ownerOf(_id));

        _transfer(_owner, _buyer, _id);
		
	
		uint _commissionValue = price[_id] * feeRate() / 1000;
		uint _sellerValue = price[_id] - _commissionValue;
		if(saleTokenAddresses[_id] == address(0)){
			require(msg.value >= price[_id]);
			
			_owner.transfer(_sellerValue);
			contractOwner.transfer(_commissionValue);
			
			// If buyer sent more than price, we send them back their rest of funds
			if (msg.value > price[_id]) {
				_buyer.transfer(msg.value - price[_id]);
			}
		}else{
			TransferHelper.safeTransferFrom(
				saleTokenAddresses[_id], msg.sender, _owner, _sellerValue
			);
			
			TransferHelper.safeTransferFrom(
				saleTokenAddresses[_id], msg.sender, contractOwner, _commissionValue
			);
		}
		

        listedMap[_id] = false;
    }
		
    function updatePrice(uint _tokenId, uint _price) public returns (bool) {
				require(hasAuction(_tokenId) == false);
		        uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
        price[_tokenId] = _price;

        emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
        return true;
    }
	
    function updateListingStatus(uint _tokenId, bool shouldBeListed) public returns (bool) {
        require(msg.sender == ownerOf(_tokenId));
		        require(hasAuction(_tokenId) == false);
		
        listedMap[_tokenId] = shouldBeListed;

        emit NftListStatus(msg.sender, _tokenId, shouldBeListed);

        return true;
    }	
	
	    function updateSale(address _tokenAddress,uint256 _tokenId, uint256 _price) onlyAcceptedToken(_tokenAddress) public returns (bool) {
		require(hasAuction(_tokenId) == false);
		uint oldPrice = price[_tokenId];
        require(msg.sender == ownerOf(_tokenId));
		
        price[_tokenId] = _price;
		saleTokenAddresses[_tokenId] = _tokenAddress;
		emit NftListStatus(msg.sender, _tokenId, true);
		
		if (listedMap[_tokenId] != true) {
			listedMap[_tokenId] = true;
			emit PriceUpdate(msg.sender, oldPrice, _price, _tokenId);
		}
        return true;
    }
	}


contract AuctionMarket is Market {
	
    constructor() ERC721("TOMS NFT", "TNFT") {
        
    }
	
		//경매 판매 생성
    function auctionMint(address _tokenAddress,string memory _tokenURI, address _toAddress,uint _minValue,uint _auctionTime) onlyAcceptedToken(_tokenAddress) public returns (uint) {
        uint _tokenId = totalSupply() + 1;
        price[_tokenId] = _minValue;

        _safeMint(_toAddress, _tokenId);
        _setTokenURI(_tokenId, _tokenURI);

        emit Minted(_toAddress, _minValue, _tokenId, _tokenURI);
		
		_createAuction(_tokenAddress,_tokenId,_minValue,_auctionTime);
        return _tokenId;
    }
	
	//경매생성
    function createAuction(address _tokenAddress,uint _tokenId, uint _minValue,uint _auctionTime)  onlyAcceptedToken(_tokenAddress) public virtual {
		require(listedMap[_tokenId] == false); // 즉시판매 진행중
		
		_createAuction(_tokenAddress,_tokenId,_minValue,_auctionTime);
    }	
		
	//경매취소
	function cancelAuction(uint _tokenId)  public virtual {
		
		_cancelAuction(_tokenId);
	}	
	
		//입찰
	function bid(uint _tokenId,uint256 _value) external payable {
		_bid(_tokenId,_value);
	}
		
		//입찰취소
	function cancelBid(uint _tokenId) external payable {
		
		_cancelBid(_tokenId);
	}	
		
	//경매종료
	function endAuction(uint _tokenId) external payable {
		
		_endAuction(_tokenId);
	}
	

	
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Bidding","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CancelBid","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"CancelFeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"CreateAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EndAuction","type":"event"},{"anonymous":false,"inputs":[],"name":"FeePaused","type":"event"},{"anonymous":false,"inputs":[],"name":"FeeUnPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isListed","type":"bool"}],"name":"NftListStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"}],"name":"PriceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"SetCancelFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"}],"name":"SetFee","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_contractOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"acceptedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allAcceptedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"auctionMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelFeePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelFeePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelFeeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minValue","type":"uint256"},{"internalType":"uint256","name":"_auctionTime","type":"uint256"}],"name":"createAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"endAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeUnPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listedMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"ownerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"saleTokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_allAcceptedTokens","type":"bool"}],"name":"setAllAcceptedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeRate_","type":"uint256"}],"name":"setCancelFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeRate_","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"tokenAccepted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"tokenDenial","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bool","name":"shouldBeListed","type":"bool"}],"name":"updateListingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updatePrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201825260088152671513d354c813919560c21b602080830191909152825180840190935260048352631513919560e21b9083015290600f6001620000636301ffc9a760e01b6200015f565b600180546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001805460ff60a01b191690556002919091556003556004805461ffff191690558151620000d990600e906020850190620001e4565b508051620000ef90600f906020840190620001e4565b5060408051808201909152600780825266697066733a2f2f60c81b60209092019182526200012091600d91620001e4565b50620001336380ac58cd60e01b6200015f565b62000145635b5e139f60e01b6200015f565b6200015763780e9d6360e01b6200015f565b505062000290565b6001600160e01b03198082161415620001bf576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200021c576000855562000267565b82601f106200023757805160ff191683800117855562000267565b8280016001018555821562000267579182015b82811115620002675782518255916020019190600101906200024a565b506200027592915062000279565b5090565b5b808211156200027557600081556001016200027a565b61479280620002a06000396000f3fe6080604052600436106103815760003560e01c806382367b2d116101d1578063b88d4fde11610102578063cb26cad2116100a0578063e939c1361161006f578063e939c13614610eff578063e985e9c514610f2b578063f146292114610f66578063f2fde38b14610f9057610381565b8063cb26cad214610dcb578063d16fd8d414610dfe578063d96a094a14610e13578063da14cbbc14610e3057610381565b8063c2fffd6b116100dc578063c2fffd6b14610d23578063c87b56dd14610d4d578063ca36716f14610d77578063ca52a43314610db657610381565b8063b88d4fde14610c0b578063b9a2de3a14610cdc578063bc8ba28f14610cf957610381565b80639703ef351161016f57806398214bcb1161014957806398214bcb14610b41578063a22cb46514610b73578063aedf795e14610bae578063b74e7c0f14610be157610381565b80639703ef3514610afa578063978bbdb914610b175780639819826a14610b2c57610381565b80638a72ea6a116101ab5780638a72ea6a14610a415780638da5cb5b14610aa657806395d89b4114610abb57806396b5a75514610ad057610381565b806382367b2d146109c957806382dc4a05146109f95780638456cb5914610a2c57610381565b806342966c68116102b6578063598647f81161025457806369fe0e2d1161022357806369fe0e2d146109425780636c0360eb1461096c57806370a0823114610981578063715018a6146109b457610381565b8063598647f81461089b5780635c975abb146108be57806361beb1d7146108d35780636352211e1461091857610381565b80634e79f1a1116102905780634e79f1a1146107965780634f6ccce7146107ab57806350f1c94f146107d557806355f804b3146107ea57610381565b806342966c681461065257806342f4997a1461066f5780634423c5f11461074457610381565b806326a49e37116103235780632f745c59116102fd5780632f745c59146105ac5780633c4da553146105e55780633f4ba83a146105fa57806342842e0e1461060f57610381565b806326a49e371461055857806327fbe123146105825780632bb3b1141461059757610381565b8063095ea7b31161035f578063095ea7b31461049e5780630f1dc180146104d957806318160ddd146104ee57806323b872dd1461051557610381565b806301ffc9a71461038657806306fdde03146103ce578063081812fc14610458575b600080fd5b34801561039257600080fd5b506103ba600480360360208110156103a957600080fd5b50356001600160e01b031916610fc3565b604080519115158252519081900360200190f35b3480156103da57600080fd5b506103e3610fe6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561041d578181015183820152602001610405565b50505050905090810190601f16801561044a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046457600080fd5b506104826004803603602081101561047b57600080fd5b503561107d565b604080516001600160a01b039092168252519081900360200190f35b3480156104aa57600080fd5b506104d7600480360360408110156104c157600080fd5b506001600160a01b0381351690602001356110ad565b005b3480156104e557600080fd5b506103ba611124565b3480156104fa57600080fd5b5061050361112d565b60408051918252519081900360200190f35b34801561052157600080fd5b506104d76004803603606081101561053857600080fd5b506001600160a01b0381358116916020810135909116906040013561113e565b34801561056457600080fd5b506105036004803603602081101561057b57600080fd5b5035611176565b34801561058e57600080fd5b506103ba611188565b3480156105a357600080fd5b50610482611196565b3480156105b857600080fd5b50610503600480360360408110156105cf57600080fd5b506001600160a01b0381351690602001356111a5565b3480156105f157600080fd5b506105036111d0565b34801561060657600080fd5b506104d76111f3565b34801561061b57600080fd5b506104d76004803603606081101561063257600080fd5b506001600160a01b038135811691602081013590911690604001356112df565b6104d76004803603602081101561066857600080fd5b503561130d565b34801561067b57600080fd5b50610503600480360360a081101561069257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106bc57600080fd5b8201836020820111156106ce57600080fd5b803590602001918460018302840111600160201b831117156106ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b03833516935050506020810135906040013561140a565b34801561075057600080fd5b5061076e6004803603602081101561076757600080fd5b5035611589565b6040805193151584526001600160a01b03909216602084015282820152519081900360600190f35b3480156107a257600080fd5b506104d76115b6565b3480156107b757600080fd5b50610503600480360360208110156107ce57600080fd5b5035611684565b3480156107e157600080fd5b506103ba61169a565b3480156107f657600080fd5b506104d76004803603602081101561080d57600080fd5b810190602081018135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460018302840111600160201b8311171561085a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116a3945050505050565b6104d7600480360360408110156108b157600080fd5b50803590602001356116f8565b3480156108ca57600080fd5b506103ba611702565b3480156108df57600080fd5b506104d7600480360360808110156108f657600080fd5b506001600160a01b038135169060208101359060408101359060600135611712565b34801561092457600080fd5b506104826004803603602081101561093b57600080fd5b50356117bf565b34801561094e57600080fd5b506104d76004803603602081101561096557600080fd5b50356117ca565b34801561097857600080fd5b506103e361189a565b34801561098d57600080fd5b50610503600480360360208110156109a457600080fd5b50356001600160a01b03166118fb565b3480156109c057600080fd5b506103ba611931565b3480156109d557600080fd5b506103ba600480360360408110156109ec57600080fd5b5080359060200135611987565b348015610a0557600080fd5b506103ba60048036036020811015610a1c57600080fd5b50356001600160a01b0316611a30565b348015610a3857600080fd5b506104d7611a45565b348015610a4d57600080fd5b50610a6b60048036036020811015610a6457600080fd5b5035611b17565b6040805195151586526001600160a01b0394851660208701528581019390935260608501919091529091166080830152519081900360a00190f35b348015610ab257600080fd5b50610482611b53565b348015610ac757600080fd5b506103e3611b62565b348015610adc57600080fd5b506104d760048036036020811015610af357600080fd5b5035611bc3565b6104d760048036036020811015610b1057600080fd5b5035611bcc565b348015610b2357600080fd5b50610503611bd5565b348015610b3857600080fd5b506104d7611bf8565b348015610b4d57600080fd5b506103ba60048036036040811015610b6457600080fd5b50803590602001351515611cc6565b348015610b7f57600080fd5b506104d760048036036040811015610b9657600080fd5b506001600160a01b0381351690602001351515611d60565b348015610bba57600080fd5b506103ba60048036036020811015610bd157600080fd5b50356001600160a01b0316611e1d565b348015610bed57600080fd5b5061048260048036036020811015610c0457600080fd5b5035611e92565b348015610c1757600080fd5b506104d760048036036080811015610c2e57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610c6857600080fd5b820183602082011115610c7a57600080fd5b803590602001918460018302840111600160201b83111715610c9b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ead945050505050565b6104d760048036036020811015610cf257600080fd5b5035611eec565b348015610d0557600080fd5b506103ba60048036036020811015610d1c57600080fd5b5035611ef5565b348015610d2f57600080fd5b506104d760048036036020811015610d4657600080fd5b5035611f0a565b348015610d5957600080fd5b506103e360048036036020811015610d7057600080fd5b5035611fdb565b348015610d8357600080fd5b506103ba60048036036060811015610d9a57600080fd5b506001600160a01b03813516906020810135906040013561222a565b348015610dc257600080fd5b506104d76123e7565b348015610dd757600080fd5b506103ba60048036036020811015610dee57600080fd5b50356001600160a01b03166124b6565b348015610e0a57600080fd5b506104d7612527565b6104d760048036036020811015610e2957600080fd5b50356125f7565b348015610e3c57600080fd5b5061050360048036036080811015610e5357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610e7d57600080fd5b820183602082011115610e8f57600080fd5b803590602001918460018302840111600160201b83111715610eb057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505050602001356126f4565b348015610f0b57600080fd5b506103ba60048036036020811015610f2257600080fd5b5035151561289e565b348015610f3757600080fd5b506103ba60048036036040811015610f4e57600080fd5b506001600160a01b0381358116916020013516612901565b348015610f7257600080fd5b506103ba60048036036020811015610f8957600080fd5b503561292f565b348015610f9c57600080fd5b506103ba60048036036020811015610fb357600080fd5b50356001600160a01b031661295e565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b820191906000526020600020905b81548152906001019060200180831161105557829003601f168201915b505050505090505b90565b6000611088826129f8565b61109157600080fd5b506000908152600a60205260409020546001600160a01b031690565b60006110b8826117bf565b9050806001600160a01b0316836001600160a01b031614156110d957600080fd5b806001600160a01b03166110eb612a05565b6001600160a01b0316148061110c575061110c81611107612a05565b612901565b61111557600080fd5b61111f8383612a09565b505050565b60065460ff1681565b60006111396007612a77565b905090565b61114f611149612a05565b82612a82565b61115857600080fd5b6111618161292f565b1561116b57600080fd5b61111f838383612b14565b60136020526000908152604090205481565b600454610100900460ff1690565b6012546001600160a01b031681565b6001600160a01b03821660009081526009602052604081206111c79083612bfc565b90505b92915050565b60006111da611188565b1515600114156111ec5750600061107a565b5060035490565b6001546001600160a01b0316331461123c5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611244611702565b61128c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6112c2612a05565b604080516001600160a01b039092168252519081900360200190a1565b6112e88161292f565b156112f257600080fd5b61111f83838360405180602001604052806000815250611ead565b611318611149612a05565b806113385750611326612a05565b6001546001600160a01b039081169116145b6113735760405162461bcd60e51b81526004018080602001828103825260308152602001806146e86030913960400191505060405180910390fd5b6000818152601060205260409020805460ff161515600114156113fd576000828152601160205260409020805460ff161515600114156113f257805460018201546040516101009092046001600160a01b03169182916108fc811502916000818181858888f193505050501580156113ef573d6000803e3d6000fd5b50505b6113fb83612c08565b505b61140682612ce8565b5050565b600654600090869060ff1661148b576001600160a01b038116158061144c57506001600160a01b03811660009081526005602052604090205460ff1615156001145b61148b576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b600061149561112d565b600101600081815260136020526040902086905590506114b58682612db7565b6114bf8188612dd1565b856001600160a01b03167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b486838a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561153657818101518382015260200161151e565b50505050905090810190601f1680156115635780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a261157e88828787612e02565b979650505050505050565b6011602052600090815260409020805460019091015460ff82169161010090046001600160a01b03169083565b6001546001600160a01b031633146115ff5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b61160761169a565b61164f576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6004805460ff191690556040517f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf90600090a1565b600080611692600784612ffc565b509392505050565b60045460ff1690565b6001546001600160a01b031633146116ec5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6116f581613018565b50565b611406828261302b565b600154600160a01b900460ff1690565b600654849060ff16611790576001600160a01b038116158061175157506001600160a01b03811660009081526005602052604090205460ff1615156001145b611790576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b60008481526014602052604090205460ff16156117ac57600080fd5b6117b885858585612e02565b5050505050565b60006111ca82613267565b6001546001600160a01b031633146118135760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6064811115611860576040805162461bcd60e51b81526020600482015260146024820152732ab8103a37901898181031b7b6b6b4b9b9b4b7b760611b604482015290519081900360640190fd5b60028190556040805182815290517e172ddfc5ae88d08b3de01a5a187667c37a5a53989e8c175055cb6c993792a79181900360200190a150565b600d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b60006001600160a01b03821661191057600080fd5b6001600160a01b03821660009081526009602052604090206111ca90612a77565b6001546000906001600160a01b0316331461197d5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6111396000613274565b60006119928361292f565b1561199c57600080fd5b6000838152601360205260409020546119b4846117bf565b6001600160a01b0316336001600160a01b0316146119d157600080fd5b6000848152601360209081526040918290208590558151838152908101859052808201869052905133917f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e0116919081900360600190a25060019392505050565b60056020526000908152604090205460ff1681565b6001546001600160a01b03163314611a8e5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611a96611702565b15611adb576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112c2612a05565b601060205260009081526040902080546001820154600283015460039093015460ff8316936001600160a01b0361010090940484169390911685565b6001546001600160a01b031690565b600f8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b6116f5816132d5565b6116f5816133fa565b6000611bdf61169a565b151560011415611bf15750600061107a565b5060025490565b6001546001600160a01b03163314611c415760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611c4961169a565b15611c8e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6004805460ff191660011790556040517f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa90600090a1565b6000611cd1836117bf565b6001600160a01b0316336001600160a01b031614611cee57600080fd5b611cf78361292f565b15611d0157600080fd5b600083815260146020908152604091829020805460ff1916851515908117909155825186815291820152815133927f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc928290030190a250600192915050565b611d68612a05565b6001600160a01b0316826001600160a01b03161415611d8657600080fd5b80600b6000611d93612a05565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611dd7612a05565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6001546000906001600160a01b03163314611e695760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506001600160a01b03166000908152600560205260409020805460ff1916600190811790915590565b6015602052600090815260409020546001600160a01b031681565b611ebe611eb8612a05565b83612a82565b611ec757600080fd5b611ed08261292f565b15611eda57600080fd5b611ee68484848461360e565b50505050565b6116f58161362e565b60146020526000908152604090205460ff1681565b6001546001600160a01b03163314611f535760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6064811115611fa0576040805162461bcd60e51b81526020600482015260146024820152732ab8103a37901898181031b7b6b6b4b9b9b4b7b760611b604482015290519081900360640190fd5b60038190556040805182815290517fb0bd0bcf4953b497ec896cb758888392f62fa6f295bfc13eee9b91900febb33d9181900360200190a150565b6060611fe6826129f8565b611fef57600080fd5b6000828152600c602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b50505050509050600061209361189a565b90508051600014156120a757509050610fe1565b8151156121685780826040516020018083805190602001908083835b602083106120e25780518252601f1990920191602091820191016120c3565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061212a5780518252601f19909201916020918201910161210b565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610fe1565b80612172856137eb565b6040516020018083805190602001908083835b602083106121a45780518252601f199092019160209182019101612185565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106121ec5780518252601f1990920191602091820191016121cd565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b600654600090849060ff166122ab576001600160a01b038116158061226c57506001600160a01b03811660009081526005602052604090205460ff1615156001145b6122ab576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b6122b48461292f565b156122be57600080fd5b6000848152601360205260409020546122d6856117bf565b6001600160a01b0316336001600160a01b0316146122f357600080fd5b6000858152601360209081526040808320879055601582529182902080546001600160a01b0319166001600160a01b038a161790558151878152600191810191909152815133927f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc928290030190a260008581526014602052604090205460ff1615156001146123db57600085815260146020908152604091829020805460ff191660011790558151838152908101869052808201879052905133917f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e0116919081900360600190a25b50600195945050505050565b6001546001600160a01b031633146124305760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b612438611188565b612480576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6004805461ff00191690556040517f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c90600090a1565b6001546000906001600160a01b031633146125025760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b6001546001600160a01b031633146125705760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b612578611188565b156125bd576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6004805461ff0019166101001790556040517f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933590600090a1565b612600816138c6565b600061260b826117bf565b9050336126178361391b565b806001600160a01b0316826001600160a01b03167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f660136000878152602001908152602001600020548661266a88611fdb565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126b357818101518382015260200161269b565b50505050905090810190601f1680156126e05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b600654600090859060ff16612775576001600160a01b038116158061273657506001600160a01b03811660009081526005602052604090205460ff1615156001145b612775576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b600061277f61112d565b600190810160008181526013602090815260408083208990556015825280832080546001600160a01b0319166001600160a01b038e1617905560149091529020805460ff191690921790915590506127d78582612db7565b6127e18187612dd1565b846001600160a01b03167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612858578181015183820152602001612840565b50505050905090810190601f1680156128855780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a29695505050505050565b6001546000906001600160a01b031633146128ea5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506006805460ff1916911515919091179055600190565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000818152601060205260408120805460ff161515600114612955576000915050610fe1565b50600192915050565b6001546000906001600160a01b031633146129aa5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6001600160a01b0382166129ef5760405162461bcd60e51b81526004018080602001828103825260458152602001806147186045913960600191505060405180910390fd5b6111ca82613274565b60006111ca600783613aea565b3390565b6000818152600a6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612a3e82613267565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111ca82613af6565b6000612a8d826129f8565b612a9657600080fd5b6000612aa183613267565b9050806001600160a01b0316846001600160a01b03161480612adc5750836001600160a01b0316612ad18461107d565b6001600160a01b0316145b80612b0c57506001600160a01b038082166000908152600b602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b2782613267565b6001600160a01b031614612b3a57600080fd5b6001600160a01b038216612b4d57600080fd5b612b58838383613afa565b612b63600082612a09565b6001600160a01b0383166000908152600960205260409020612b859082613b0c565b506001600160a01b0382166000908152600960205260409020612ba89082613b18565b50612bb560078284613b24565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006111c78383613b44565b6040805160a08101825260008082526020808301828152838501838152606080860185815260808701868152898752601086528887209751885495516001600160a01b03908116610100908102610100600160a81b031993151560ff19998a16178416178b55955160018b810191909155935160028b01559151600390990180549983166001600160a01b0319909a169990991790985588519283018952868352828601878152838a018881529a885260119096529790952090518154945190971690910295151592909116919091179092169290921781559151910155565b6000612cf382613267565b9050612d0181600084613afa565b612d0c600083612a09565b6000828152600c60205260409020546002600019610100600184161502019091160415612d4a576000828152600c60205260408120612d4a91614519565b6001600160a01b0381166000908152600960205260409020612d6c9083613b0c565b50612d7a6007836000613b24565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611406828260405180602001604052806000815250613ba8565b612dda826129f8565b612de357600080fd5b6000828152600c60209081526040909120825161111f9284019061455d565b600654849060ff16612e80576001600160a01b0381161580612e4157506001600160a01b03811660009081526005602052604090205460ff1615156001145b612e80576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b33612e8a85613267565b6001600160a01b031614612e9d57600080fd5b6000848152601060205260409020805460ff16151560011415612ebf57600080fd5b6040518060a00160405280600115158152602001336001600160a01b031681526020018581526020018442018152602001876001600160a01b03168152506010600087815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600101556060820151816002015560808201518160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec868686420160405180848152602001838152602001828152602001935050505060405180910390a2505050505050565b600080808061300b8686613bc8565b9097909650945050505050565b805161140690600d90602084019061455d565b3361303583613267565b6001600160a01b0316141561304957600080fd5b60008281526010602052604090206002810154421061306757600080fd5b600083815260116020526040902060038201546001600160a01b031661315b57816001015434101561309857600080fd5b806001015434116130a857600080fd5b6001810154156130f757805460018201546040516101009092046001600160a01b03169182916108fc811502916000818181858888f193505050501580156130f4573d6000803e3d6000fd5b50505b6040805160608101825260018082523360208084019182523484860190815260008a815260119092529490209251835491516001600160a01b031661010002610100600160a81b031991151560ff1990931692909217161782559151910155613227565b816001015483101561316c57600080fd5b8060010154831161317c57600080fd5b6001810154156131ae576003820154815460018301546131ae926001600160a01b039081169261010090041690613c43565b60038201546131c8906001600160a01b0316333086613da5565b60408051606081018252600180825233602080840191825283850188815260008a815260119092529490209251835491516001600160a01b031661010002610100600160a81b031991151560ff19909316929092171617825591519101555b6040805185815234602082015281517f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc66929181900390910190a150505050565b60006111ca600783613ef9565b6001546040516000916001600160a01b03808516929116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908490a350600180546001600160a01b0319166001600160a01b039290921691909117815590565b336132df82613267565b6001600160a01b0316146132f257600080fd5b6000818152601060205260409020805460ff16151560011461331357600080fd5b6000828152601160205260409020805460ff1615156001141561333557600080fd5b6040805160a081018252600080825233602080840191825283850183815260608501848152608086018581528a8652601084529487902095518654945160ff1990951690151517610100600160a81b0319166101006001600160a01b0395861602178655905160018601555160028501559151600390930180546001600160a01b0319169390911692909217909155815185815291517fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a32592929281900390910190a1505050565b6000818152601060205260409020805460ff16151560011461341b57600080fd5b8060020154421061342b57600080fd5b6000828152601160205260409020805460ff16151560011461344c57600080fd5b805461010090046001600160a01b0316331461346757600080fd5b60006103e86134746111d0565b8360010154028161348157fe5b600385015491900491506001600160a01b0316613527578154835460018401546040516001600160a01b036101009485900481169490930490921691839185900380156108fc02916000818181858888f193505050501580156134e8573d6000803e3d6000fd5b506040516001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561351f573d6000803e3d6000fd5b505050613575565b600383015482546001840154613552926001600160a01b039081169261010090041690849003613c43565b60038301548354613575916001600160a01b039081169161010090041683613c43565b604080516060810182526000808252602080830182815283850183815289845260118352928590209351845491516001600160a01b031661010002610100600160a81b031991151560ff199093169290921716178355905160019290920191909155815186815291517f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa79281900390910190a150505050565b613619848484612b14565b61362584848484613f05565b611ee657600080fd5b6000818152601060205260409020600281015442101561364d57600080fd5b805460ff16151560011461366057600080fd5b600061366b83613267565b60008481526011602052604090208354815492935090916136a3916001600160a01b0361010091829004811692919091041686612b14565b60006103e86136b0611bd5565b836001015402816136bd57fe5b60018401546003870154929091049250829003906001600160a01b0316613758576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015613714573d6000803e3d6000fd5b506001546040516001600160a01b0390911690819084156108fc029085906000818181858888f19350505050158015613751573d6000803e3d6000fd5b505061379a565b6003850154855461377b916001600160a01b039081169161010090041683613c43565b600385015460015461379a916001600160a01b03908116911684613c43565b600183015460408051888152602081019290925280517fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a9281900390910190a16137e386612c08565b505050505050565b60608161381057506040805180820190915260018152600360fc1b6020820152610fe1565b8160005b811561382857600101600a82049150613814565b60008167ffffffffffffffff8111801561384157600080fd5b506040519080825280601f01601f19166020018201604052801561386c576020820181803683370190505b50859350905060001982015b83156138bd57600a840660300160f81b8282806001900393508151811061389b57fe5b60200101906001600160f81b031916908160001a905350600a84049350613878565b50949350505050565b60008181526014602052604090205460ff166138e1826129f8565b6138ea57600080fd5b806138f457600080fd5b6138fd826117bf565b6001600160a01b0316336001600160a01b0316141561140657600080fd5b6001546001600160a01b0316336000613933846117bf565b9050613940818386612b14565b60006103e861394d611bd5565b600087815260136020526040902054028161396457fe5b600087815260136020908152604080832054601590925290912054929091049250829003906001600160a01b0316613a85576000868152601360205260409020543410156139b157600080fd5b6040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156139e7573d6000803e3d6000fd5b506040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015613a1e573d6000803e3d6000fd5b50600086815260136020526040902054341115613a80576000868152601360205260408082205490516001600160a01b03871692349290920380156108fc0292909190818181858888f19350505050158015613a7e573d6000803e3d6000fd5b505b613acd565b600086815260156020526040902054613aa9906001600160a01b0316338584613da5565b600086815260156020526040902054613acd906001600160a01b0316338785613da5565b50505060009283525050601460205260409020805460ff19169055565b60006111c7838361406d565b5490565b613b02611702565b1561111f57600080fd5b60006111c78383614085565b60006111c7838361414b565b6000613b3a84846001600160a01b038516614195565b90505b9392505050565b81546000908210613b865760405162461bcd60e51b81526004018080602001828103825260228152602001806145ff6022913960400191505060405180910390fd5b826000018281548110613b9557fe5b9060005260206000200154905092915050565b613bb2838361422c565b613bbf6000848484613f05565b61111f57600080fd5b815460009081908310613c0c5760405162461bcd60e51b81526004018080602001828103825260228152602001806146826022913960400191505060405180910390fd5b6000846000018481548110613c1d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613cbf5780518252601f199092019160209182019101613ca0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d21576040519150601f19603f3d011682016040523d82523d6000602084013e613d26565b606091505b5091509150818015613d54575080511580613d545750808060200190516020811015613d5157600080fd5b50515b6117b8576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310613e295780518252601f199092019160209182019101613e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613e8b576040519150601f19603f3d011682016040523d82523d6000602084013e613e90565b606091505b5091509150818015613ebe575080511580613ebe5750808060200190516020811015613ebb57600080fd5b50515b6137e35760405162461bcd60e51b81526004018080602001828103825260248152602001806146c46024913960400191505060405180910390fd5b60006111c783836142ca565b6000613f19846001600160a01b031661435a565b613f2557506001612b0c565b6000614033630a85bd0160e11b613f3a612a05565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613fa1578181015183820152602001613f89565b50505050905090810190601f168015613fce5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614621603291396001600160a01b0388169190614360565b9050600081806020019051602081101561404c57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561414157835460001980830191908101906000908790839081106140b857fe5b90600052602060002001549050808760000184815481106140d557fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061410557fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506111ca565b60009150506111ca565b6000614157838361406d565b61418d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556111ca565b5060006111ca565b6000828152600184016020526040812054806141fa575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613b3d565b8285600001600183038154811061420d57fe5b9060005260206000209060020201600101819055506000915050613b3d565b6001600160a01b03821661423f57600080fd5b614248816129f8565b1561425257600080fd5b61425e60008383613afa565b6001600160a01b03821660009081526009602052604090206142809082613b18565b5061428d60078284613b24565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548061432d576040805162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015290519081900360640190fd5b83600001600182038154811061433f57fe5b90600052602060002090600202016001015491505092915050565b3b151590565b6060613b3a8484600085856143748561435a565b6143c5576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106144035780518252601f1990920191602091820191016143e4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614465576040519150601f19603f3d011682016040523d82523d6000602084013e61446a565b606091505b509150915061157e82828660608315614484575081613b3d565b8251156144945782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156144de5781810151838201526020016144c6565b50505050905090810190601f16801561450b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50805460018160011615610100020316600290046000825580601f1061453f57506116f5565b601f0160209004906000526020600020908101906116f591906145e9565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261459357600085556145d9565b82601f106145ac57805160ff19168380011785556145d9565b828001600101855582156145d9579182015b828111156145d95782518255916020019190600101906145be565b506145e59291506145e9565b5090565b5b808211156145e557600081556001016145ea56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e647345524332305061796d656e74203a20446973616c6c6f77656420746f6b656e005472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a2646970667358221220ee4cad62ebddc3fa6a94ac5cca32fd7cf1380207a0bd33d7c67a4ee3d46c4a5964736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008544f4d53204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004544e465400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103815760003560e01c806382367b2d116101d1578063b88d4fde11610102578063cb26cad2116100a0578063e939c1361161006f578063e939c13614610eff578063e985e9c514610f2b578063f146292114610f66578063f2fde38b14610f9057610381565b8063cb26cad214610dcb578063d16fd8d414610dfe578063d96a094a14610e13578063da14cbbc14610e3057610381565b8063c2fffd6b116100dc578063c2fffd6b14610d23578063c87b56dd14610d4d578063ca36716f14610d77578063ca52a43314610db657610381565b8063b88d4fde14610c0b578063b9a2de3a14610cdc578063bc8ba28f14610cf957610381565b80639703ef351161016f57806398214bcb1161014957806398214bcb14610b41578063a22cb46514610b73578063aedf795e14610bae578063b74e7c0f14610be157610381565b80639703ef3514610afa578063978bbdb914610b175780639819826a14610b2c57610381565b80638a72ea6a116101ab5780638a72ea6a14610a415780638da5cb5b14610aa657806395d89b4114610abb57806396b5a75514610ad057610381565b806382367b2d146109c957806382dc4a05146109f95780638456cb5914610a2c57610381565b806342966c68116102b6578063598647f81161025457806369fe0e2d1161022357806369fe0e2d146109425780636c0360eb1461096c57806370a0823114610981578063715018a6146109b457610381565b8063598647f81461089b5780635c975abb146108be57806361beb1d7146108d35780636352211e1461091857610381565b80634e79f1a1116102905780634e79f1a1146107965780634f6ccce7146107ab57806350f1c94f146107d557806355f804b3146107ea57610381565b806342966c681461065257806342f4997a1461066f5780634423c5f11461074457610381565b806326a49e37116103235780632f745c59116102fd5780632f745c59146105ac5780633c4da553146105e55780633f4ba83a146105fa57806342842e0e1461060f57610381565b806326a49e371461055857806327fbe123146105825780632bb3b1141461059757610381565b8063095ea7b31161035f578063095ea7b31461049e5780630f1dc180146104d957806318160ddd146104ee57806323b872dd1461051557610381565b806301ffc9a71461038657806306fdde03146103ce578063081812fc14610458575b600080fd5b34801561039257600080fd5b506103ba600480360360208110156103a957600080fd5b50356001600160e01b031916610fc3565b604080519115158252519081900360200190f35b3480156103da57600080fd5b506103e3610fe6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561041d578181015183820152602001610405565b50505050905090810190601f16801561044a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046457600080fd5b506104826004803603602081101561047b57600080fd5b503561107d565b604080516001600160a01b039092168252519081900360200190f35b3480156104aa57600080fd5b506104d7600480360360408110156104c157600080fd5b506001600160a01b0381351690602001356110ad565b005b3480156104e557600080fd5b506103ba611124565b3480156104fa57600080fd5b5061050361112d565b60408051918252519081900360200190f35b34801561052157600080fd5b506104d76004803603606081101561053857600080fd5b506001600160a01b0381358116916020810135909116906040013561113e565b34801561056457600080fd5b506105036004803603602081101561057b57600080fd5b5035611176565b34801561058e57600080fd5b506103ba611188565b3480156105a357600080fd5b50610482611196565b3480156105b857600080fd5b50610503600480360360408110156105cf57600080fd5b506001600160a01b0381351690602001356111a5565b3480156105f157600080fd5b506105036111d0565b34801561060657600080fd5b506104d76111f3565b34801561061b57600080fd5b506104d76004803603606081101561063257600080fd5b506001600160a01b038135811691602081013590911690604001356112df565b6104d76004803603602081101561066857600080fd5b503561130d565b34801561067b57600080fd5b50610503600480360360a081101561069257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106bc57600080fd5b8201836020820111156106ce57600080fd5b803590602001918460018302840111600160201b831117156106ef57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b03833516935050506020810135906040013561140a565b34801561075057600080fd5b5061076e6004803603602081101561076757600080fd5b5035611589565b6040805193151584526001600160a01b03909216602084015282820152519081900360600190f35b3480156107a257600080fd5b506104d76115b6565b3480156107b757600080fd5b50610503600480360360208110156107ce57600080fd5b5035611684565b3480156107e157600080fd5b506103ba61169a565b3480156107f657600080fd5b506104d76004803603602081101561080d57600080fd5b810190602081018135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460018302840111600160201b8311171561085a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116a3945050505050565b6104d7600480360360408110156108b157600080fd5b50803590602001356116f8565b3480156108ca57600080fd5b506103ba611702565b3480156108df57600080fd5b506104d7600480360360808110156108f657600080fd5b506001600160a01b038135169060208101359060408101359060600135611712565b34801561092457600080fd5b506104826004803603602081101561093b57600080fd5b50356117bf565b34801561094e57600080fd5b506104d76004803603602081101561096557600080fd5b50356117ca565b34801561097857600080fd5b506103e361189a565b34801561098d57600080fd5b50610503600480360360208110156109a457600080fd5b50356001600160a01b03166118fb565b3480156109c057600080fd5b506103ba611931565b3480156109d557600080fd5b506103ba600480360360408110156109ec57600080fd5b5080359060200135611987565b348015610a0557600080fd5b506103ba60048036036020811015610a1c57600080fd5b50356001600160a01b0316611a30565b348015610a3857600080fd5b506104d7611a45565b348015610a4d57600080fd5b50610a6b60048036036020811015610a6457600080fd5b5035611b17565b6040805195151586526001600160a01b0394851660208701528581019390935260608501919091529091166080830152519081900360a00190f35b348015610ab257600080fd5b50610482611b53565b348015610ac757600080fd5b506103e3611b62565b348015610adc57600080fd5b506104d760048036036020811015610af357600080fd5b5035611bc3565b6104d760048036036020811015610b1057600080fd5b5035611bcc565b348015610b2357600080fd5b50610503611bd5565b348015610b3857600080fd5b506104d7611bf8565b348015610b4d57600080fd5b506103ba60048036036040811015610b6457600080fd5b50803590602001351515611cc6565b348015610b7f57600080fd5b506104d760048036036040811015610b9657600080fd5b506001600160a01b0381351690602001351515611d60565b348015610bba57600080fd5b506103ba60048036036020811015610bd157600080fd5b50356001600160a01b0316611e1d565b348015610bed57600080fd5b5061048260048036036020811015610c0457600080fd5b5035611e92565b348015610c1757600080fd5b506104d760048036036080811015610c2e57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b811115610c6857600080fd5b820183602082011115610c7a57600080fd5b803590602001918460018302840111600160201b83111715610c9b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611ead945050505050565b6104d760048036036020811015610cf257600080fd5b5035611eec565b348015610d0557600080fd5b506103ba60048036036020811015610d1c57600080fd5b5035611ef5565b348015610d2f57600080fd5b506104d760048036036020811015610d4657600080fd5b5035611f0a565b348015610d5957600080fd5b506103e360048036036020811015610d7057600080fd5b5035611fdb565b348015610d8357600080fd5b506103ba60048036036060811015610d9a57600080fd5b506001600160a01b03813516906020810135906040013561222a565b348015610dc257600080fd5b506104d76123e7565b348015610dd757600080fd5b506103ba60048036036020811015610dee57600080fd5b50356001600160a01b03166124b6565b348015610e0a57600080fd5b506104d7612527565b6104d760048036036020811015610e2957600080fd5b50356125f7565b348015610e3c57600080fd5b5061050360048036036080811015610e5357600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610e7d57600080fd5b820183602082011115610e8f57600080fd5b803590602001918460018302840111600160201b83111715610eb057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383351693505050602001356126f4565b348015610f0b57600080fd5b506103ba60048036036020811015610f2257600080fd5b5035151561289e565b348015610f3757600080fd5b506103ba60048036036040811015610f4e57600080fd5b506001600160a01b0381358116916020013516612901565b348015610f7257600080fd5b506103ba60048036036020811015610f8957600080fd5b503561292f565b348015610f9c57600080fd5b506103ba60048036036020811015610fb357600080fd5b50356001600160a01b031661295e565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b600e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b820191906000526020600020905b81548152906001019060200180831161105557829003601f168201915b505050505090505b90565b6000611088826129f8565b61109157600080fd5b506000908152600a60205260409020546001600160a01b031690565b60006110b8826117bf565b9050806001600160a01b0316836001600160a01b031614156110d957600080fd5b806001600160a01b03166110eb612a05565b6001600160a01b0316148061110c575061110c81611107612a05565b612901565b61111557600080fd5b61111f8383612a09565b505050565b60065460ff1681565b60006111396007612a77565b905090565b61114f611149612a05565b82612a82565b61115857600080fd5b6111618161292f565b1561116b57600080fd5b61111f838383612b14565b60136020526000908152604090205481565b600454610100900460ff1690565b6012546001600160a01b031681565b6001600160a01b03821660009081526009602052604081206111c79083612bfc565b90505b92915050565b60006111da611188565b1515600114156111ec5750600061107a565b5060035490565b6001546001600160a01b0316331461123c5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611244611702565b61128c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6112c2612a05565b604080516001600160a01b039092168252519081900360200190a1565b6112e88161292f565b156112f257600080fd5b61111f83838360405180602001604052806000815250611ead565b611318611149612a05565b806113385750611326612a05565b6001546001600160a01b039081169116145b6113735760405162461bcd60e51b81526004018080602001828103825260308152602001806146e86030913960400191505060405180910390fd5b6000818152601060205260409020805460ff161515600114156113fd576000828152601160205260409020805460ff161515600114156113f257805460018201546040516101009092046001600160a01b03169182916108fc811502916000818181858888f193505050501580156113ef573d6000803e3d6000fd5b50505b6113fb83612c08565b505b61140682612ce8565b5050565b600654600090869060ff1661148b576001600160a01b038116158061144c57506001600160a01b03811660009081526005602052604090205460ff1615156001145b61148b576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b600061149561112d565b600101600081815260136020526040902086905590506114b58682612db7565b6114bf8188612dd1565b856001600160a01b03167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b486838a6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561153657818101518382015260200161151e565b50505050905090810190601f1680156115635780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a261157e88828787612e02565b979650505050505050565b6011602052600090815260409020805460019091015460ff82169161010090046001600160a01b03169083565b6001546001600160a01b031633146115ff5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b61160761169a565b61164f576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6004805460ff191690556040517f0a9d058aff97d3ed3388247bac7d508f44a460217484407ce5bba66affc17daf90600090a1565b600080611692600784612ffc565b509392505050565b60045460ff1690565b6001546001600160a01b031633146116ec5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6116f581613018565b50565b611406828261302b565b600154600160a01b900460ff1690565b600654849060ff16611790576001600160a01b038116158061175157506001600160a01b03811660009081526005602052604090205460ff1615156001145b611790576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b60008481526014602052604090205460ff16156117ac57600080fd5b6117b885858585612e02565b5050505050565b60006111ca82613267565b6001546001600160a01b031633146118135760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6064811115611860576040805162461bcd60e51b81526020600482015260146024820152732ab8103a37901898181031b7b6b6b4b9b9b4b7b760611b604482015290519081900360640190fd5b60028190556040805182815290517e172ddfc5ae88d08b3de01a5a187667c37a5a53989e8c175055cb6c993792a79181900360200190a150565b600d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b60006001600160a01b03821661191057600080fd5b6001600160a01b03821660009081526009602052604090206111ca90612a77565b6001546000906001600160a01b0316331461197d5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6111396000613274565b60006119928361292f565b1561199c57600080fd5b6000838152601360205260409020546119b4846117bf565b6001600160a01b0316336001600160a01b0316146119d157600080fd5b6000848152601360209081526040918290208590558151838152908101859052808201869052905133917f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e0116919081900360600190a25060019392505050565b60056020526000908152604090205460ff1681565b6001546001600160a01b03163314611a8e5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611a96611702565b15611adb576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112c2612a05565b601060205260009081526040902080546001820154600283015460039093015460ff8316936001600160a01b0361010090940484169390911685565b6001546001600160a01b031690565b600f8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110725780601f1061104757610100808354040283529160200191611072565b6116f5816132d5565b6116f5816133fa565b6000611bdf61169a565b151560011415611bf15750600061107a565b5060025490565b6001546001600160a01b03163314611c415760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b611c4961169a565b15611c8e576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6004805460ff191660011790556040517f51f99560a97e6809d74ff4458c12419031c9b6d4d8eae6a6b26bf8386fb0c4fa90600090a1565b6000611cd1836117bf565b6001600160a01b0316336001600160a01b031614611cee57600080fd5b611cf78361292f565b15611d0157600080fd5b600083815260146020908152604091829020805460ff1916851515908117909155825186815291820152815133927f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc928290030190a250600192915050565b611d68612a05565b6001600160a01b0316826001600160a01b03161415611d8657600080fd5b80600b6000611d93612a05565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611dd7612a05565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6001546000906001600160a01b03163314611e695760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506001600160a01b03166000908152600560205260409020805460ff1916600190811790915590565b6015602052600090815260409020546001600160a01b031681565b611ebe611eb8612a05565b83612a82565b611ec757600080fd5b611ed08261292f565b15611eda57600080fd5b611ee68484848461360e565b50505050565b6116f58161362e565b60146020526000908152604090205460ff1681565b6001546001600160a01b03163314611f535760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6064811115611fa0576040805162461bcd60e51b81526020600482015260146024820152732ab8103a37901898181031b7b6b6b4b9b9b4b7b760611b604482015290519081900360640190fd5b60038190556040805182815290517fb0bd0bcf4953b497ec896cb758888392f62fa6f295bfc13eee9b91900febb33d9181900360200190a150565b6060611fe6826129f8565b611fef57600080fd5b6000828152600c602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b50505050509050600061209361189a565b90508051600014156120a757509050610fe1565b8151156121685780826040516020018083805190602001908083835b602083106120e25780518252601f1990920191602091820191016120c3565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061212a5780518252601f19909201916020918201910161210b565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610fe1565b80612172856137eb565b6040516020018083805190602001908083835b602083106121a45780518252601f199092019160209182019101612185565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106121ec5780518252601f1990920191602091820191016121cd565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b600654600090849060ff166122ab576001600160a01b038116158061226c57506001600160a01b03811660009081526005602052604090205460ff1615156001145b6122ab576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b6122b48461292f565b156122be57600080fd5b6000848152601360205260409020546122d6856117bf565b6001600160a01b0316336001600160a01b0316146122f357600080fd5b6000858152601360209081526040808320879055601582529182902080546001600160a01b0319166001600160a01b038a161790558151878152600191810191909152815133927f3fd63d9ca8dc693a1b9911e664951294721009a4f6239c862d6719a160a1edfc928290030190a260008581526014602052604090205460ff1615156001146123db57600085815260146020908152604091829020805460ff191660011790558151838152908101869052808201879052905133917f8647dab5101cbe18afb171756e9753802f9d66725bf2346b079b8b1a275e0116919081900360600190a25b50600195945050505050565b6001546001600160a01b031633146124305760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b612438611188565b612480576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6004805461ff00191690556040517f67592efac9ad4bc8a051561f7008dd48427e81ea709a2f61ad386fa68189b35c90600090a1565b6001546000906001600160a01b031633146125025760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b6001546001600160a01b031633146125705760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b612578611188565b156125bd576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6004805461ff0019166101001790556040517f6f941072281a73a3d1a56154741446c3752559d3c97ae913f09e25382677933590600090a1565b612600816138c6565b600061260b826117bf565b9050336126178361391b565b806001600160a01b0316826001600160a01b03167fef258f47a33a1cba99d81ea828f234ff5d6cb31034c0f79ecb5198f8c6d118f660136000878152602001908152602001600020548661266a88611fdb565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156126b357818101518382015260200161269b565b50505050905090810190601f1680156126e05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a3505050565b600654600090859060ff16612775576001600160a01b038116158061273657506001600160a01b03811660009081526005602052604090205460ff1615156001145b612775576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b600061277f61112d565b600190810160008181526013602090815260408083208990556015825280832080546001600160a01b0319166001600160a01b038e1617905560149091529020805460ff191690921790915590506127d78582612db7565b6127e18187612dd1565b846001600160a01b03167ff2cb5e52049d127ad1c335f1cc25f2fdbc911bec1beb2611f4c1e8b1c274d4b48583896040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612858578181015183820152602001612840565b50505050905090810190601f1680156128855780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a29695505050505050565b6001546000906001600160a01b031633146128ea5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b506006805460ff1916911515919091179055600190565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000818152601060205260408120805460ff161515600114612955576000915050610fe1565b50600192915050565b6001546000906001600160a01b031633146129aa5760405162461bcd60e51b815260040180806020018281038252602f815260200180614653602f913960400191505060405180910390fd5b6001600160a01b0382166129ef5760405162461bcd60e51b81526004018080602001828103825260458152602001806147186045913960600191505060405180910390fd5b6111ca82613274565b60006111ca600783613aea565b3390565b6000818152600a6020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612a3e82613267565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006111ca82613af6565b6000612a8d826129f8565b612a9657600080fd5b6000612aa183613267565b9050806001600160a01b0316846001600160a01b03161480612adc5750836001600160a01b0316612ad18461107d565b6001600160a01b0316145b80612b0c57506001600160a01b038082166000908152600b602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b2782613267565b6001600160a01b031614612b3a57600080fd5b6001600160a01b038216612b4d57600080fd5b612b58838383613afa565b612b63600082612a09565b6001600160a01b0383166000908152600960205260409020612b859082613b0c565b506001600160a01b0382166000908152600960205260409020612ba89082613b18565b50612bb560078284613b24565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006111c78383613b44565b6040805160a08101825260008082526020808301828152838501838152606080860185815260808701868152898752601086528887209751885495516001600160a01b03908116610100908102610100600160a81b031993151560ff19998a16178416178b55955160018b810191909155935160028b01559151600390990180549983166001600160a01b0319909a169990991790985588519283018952868352828601878152838a018881529a885260119096529790952090518154945190971690910295151592909116919091179092169290921781559151910155565b6000612cf382613267565b9050612d0181600084613afa565b612d0c600083612a09565b6000828152600c60205260409020546002600019610100600184161502019091160415612d4a576000828152600c60205260408120612d4a91614519565b6001600160a01b0381166000908152600960205260409020612d6c9083613b0c565b50612d7a6007836000613b24565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611406828260405180602001604052806000815250613ba8565b612dda826129f8565b612de357600080fd5b6000828152600c60209081526040909120825161111f9284019061455d565b600654849060ff16612e80576001600160a01b0381161580612e4157506001600160a01b03811660009081526005602052604090205460ff1615156001145b612e80576040805162461bcd60e51b815260206004820152601f60248201526000805160206146a4833981519152604482015290519081900360640190fd5b33612e8a85613267565b6001600160a01b031614612e9d57600080fd5b6000848152601060205260409020805460ff16151560011415612ebf57600080fd5b6040518060a00160405280600115158152602001336001600160a01b031681526020018581526020018442018152602001876001600160a01b03168152506010600087815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600101556060820151816002015560808201518160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f5e4dbe799442580e0983dedea209e02d0497b6e3383338a9e1ac3aa117b491ec868686420160405180848152602001838152602001828152602001935050505060405180910390a2505050505050565b600080808061300b8686613bc8565b9097909650945050505050565b805161140690600d90602084019061455d565b3361303583613267565b6001600160a01b0316141561304957600080fd5b60008281526010602052604090206002810154421061306757600080fd5b600083815260116020526040902060038201546001600160a01b031661315b57816001015434101561309857600080fd5b806001015434116130a857600080fd5b6001810154156130f757805460018201546040516101009092046001600160a01b03169182916108fc811502916000818181858888f193505050501580156130f4573d6000803e3d6000fd5b50505b6040805160608101825260018082523360208084019182523484860190815260008a815260119092529490209251835491516001600160a01b031661010002610100600160a81b031991151560ff1990931692909217161782559151910155613227565b816001015483101561316c57600080fd5b8060010154831161317c57600080fd5b6001810154156131ae576003820154815460018301546131ae926001600160a01b039081169261010090041690613c43565b60038201546131c8906001600160a01b0316333086613da5565b60408051606081018252600180825233602080840191825283850188815260008a815260119092529490209251835491516001600160a01b031661010002610100600160a81b031991151560ff19909316929092171617825591519101555b6040805185815234602082015281517f6fe605fcf3f0af8122bf2ca880af248fc500eed81268c984dc2f51f73d96fc66929181900390910190a150505050565b60006111ca600783613ef9565b6001546040516000916001600160a01b03808516929116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908490a350600180546001600160a01b0319166001600160a01b039290921691909117815590565b336132df82613267565b6001600160a01b0316146132f257600080fd5b6000818152601060205260409020805460ff16151560011461331357600080fd5b6000828152601160205260409020805460ff1615156001141561333557600080fd5b6040805160a081018252600080825233602080840191825283850183815260608501848152608086018581528a8652601084529487902095518654945160ff1990951690151517610100600160a81b0319166101006001600160a01b0395861602178655905160018601555160028501559151600390930180546001600160a01b0319169390911692909217909155815185815291517fbea0e66c2d42b9131695ceea7d1aaa21b37e93070cde19c9b5fbd686a32592929281900390910190a1505050565b6000818152601060205260409020805460ff16151560011461341b57600080fd5b8060020154421061342b57600080fd5b6000828152601160205260409020805460ff16151560011461344c57600080fd5b805461010090046001600160a01b0316331461346757600080fd5b60006103e86134746111d0565b8360010154028161348157fe5b600385015491900491506001600160a01b0316613527578154835460018401546040516001600160a01b036101009485900481169490930490921691839185900380156108fc02916000818181858888f193505050501580156134e8573d6000803e3d6000fd5b506040516001600160a01b0382169084156108fc029085906000818181858888f1935050505015801561351f573d6000803e3d6000fd5b505050613575565b600383015482546001840154613552926001600160a01b039081169261010090041690849003613c43565b60038301548354613575916001600160a01b039081169161010090041683613c43565b604080516060810182526000808252602080830182815283850183815289845260118352928590209351845491516001600160a01b031661010002610100600160a81b031991151560ff199093169290921716178355905160019290920191909155815186815291517f7687efe94566d20f7ebb8eff43bb57b2c014749dfd9ad179089e58c338ecdfa79281900390910190a150505050565b613619848484612b14565b61362584848484613f05565b611ee657600080fd5b6000818152601060205260409020600281015442101561364d57600080fd5b805460ff16151560011461366057600080fd5b600061366b83613267565b60008481526011602052604090208354815492935090916136a3916001600160a01b0361010091829004811692919091041686612b14565b60006103e86136b0611bd5565b836001015402816136bd57fe5b60018401546003870154929091049250829003906001600160a01b0316613758576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015613714573d6000803e3d6000fd5b506001546040516001600160a01b0390911690819084156108fc029085906000818181858888f19350505050158015613751573d6000803e3d6000fd5b505061379a565b6003850154855461377b916001600160a01b039081169161010090041683613c43565b600385015460015461379a916001600160a01b03908116911684613c43565b600183015460408051888152602081019290925280517fc87036081503cc1fd53dc456ee0c40aef140882f77b06b4b4b554fee2b60816a9281900390910190a16137e386612c08565b505050505050565b60608161381057506040805180820190915260018152600360fc1b6020820152610fe1565b8160005b811561382857600101600a82049150613814565b60008167ffffffffffffffff8111801561384157600080fd5b506040519080825280601f01601f19166020018201604052801561386c576020820181803683370190505b50859350905060001982015b83156138bd57600a840660300160f81b8282806001900393508151811061389b57fe5b60200101906001600160f81b031916908160001a905350600a84049350613878565b50949350505050565b60008181526014602052604090205460ff166138e1826129f8565b6138ea57600080fd5b806138f457600080fd5b6138fd826117bf565b6001600160a01b0316336001600160a01b0316141561140657600080fd5b6001546001600160a01b0316336000613933846117bf565b9050613940818386612b14565b60006103e861394d611bd5565b600087815260136020526040902054028161396457fe5b600087815260136020908152604080832054601590925290912054929091049250829003906001600160a01b0316613a85576000868152601360205260409020543410156139b157600080fd5b6040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156139e7573d6000803e3d6000fd5b506040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015613a1e573d6000803e3d6000fd5b50600086815260136020526040902054341115613a80576000868152601360205260408082205490516001600160a01b03871692349290920380156108fc0292909190818181858888f19350505050158015613a7e573d6000803e3d6000fd5b505b613acd565b600086815260156020526040902054613aa9906001600160a01b0316338584613da5565b600086815260156020526040902054613acd906001600160a01b0316338785613da5565b50505060009283525050601460205260409020805460ff19169055565b60006111c7838361406d565b5490565b613b02611702565b1561111f57600080fd5b60006111c78383614085565b60006111c7838361414b565b6000613b3a84846001600160a01b038516614195565b90505b9392505050565b81546000908210613b865760405162461bcd60e51b81526004018080602001828103825260228152602001806145ff6022913960400191505060405180910390fd5b826000018281548110613b9557fe5b9060005260206000200154905092915050565b613bb2838361422c565b613bbf6000848484613f05565b61111f57600080fd5b815460009081908310613c0c5760405162461bcd60e51b81526004018080602001828103825260228152602001806146826022913960400191505060405180910390fd5b6000846000018481548110613c1d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613cbf5780518252601f199092019160209182019101613ca0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d21576040519150601f19603f3d011682016040523d82523d6000602084013e613d26565b606091505b5091509150818015613d54575080511580613d545750808060200190516020811015613d5157600080fd5b50515b6117b8576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310613e295780518252601f199092019160209182019101613e0a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613e8b576040519150601f19603f3d011682016040523d82523d6000602084013e613e90565b606091505b5091509150818015613ebe575080511580613ebe5750808060200190516020811015613ebb57600080fd5b50515b6137e35760405162461bcd60e51b81526004018080602001828103825260248152602001806146c46024913960400191505060405180910390fd5b60006111c783836142ca565b6000613f19846001600160a01b031661435a565b613f2557506001612b0c565b6000614033630a85bd0160e11b613f3a612a05565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613fa1578181015183820152602001613f89565b50505050905090810190601f168015613fce5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001614621603291396001600160a01b0388169190614360565b9050600081806020019051602081101561404c57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561414157835460001980830191908101906000908790839081106140b857fe5b90600052602060002001549050808760000184815481106140d557fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061410557fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506111ca565b60009150506111ca565b6000614157838361406d565b61418d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556111ca565b5060006111ca565b6000828152600184016020526040812054806141fa575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613b3d565b8285600001600183038154811061420d57fe5b9060005260206000209060020201600101819055506000915050613b3d565b6001600160a01b03821661423f57600080fd5b614248816129f8565b1561425257600080fd5b61425e60008383613afa565b6001600160a01b03821660009081526009602052604090206142809082613b18565b5061428d60078284613b24565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548061432d576040805162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015290519081900360640190fd5b83600001600182038154811061433f57fe5b90600052602060002090600202016001015491505092915050565b3b151590565b6060613b3a8484600085856143748561435a565b6143c5576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106144035780518252601f1990920191602091820191016143e4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614465576040519150601f19603f3d011682016040523d82523d6000602084013e61446a565b606091505b509150915061157e82828660608315614484575081613b3d565b8251156144945782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156144de5781810151838201526020016144c6565b50505050905090810190601f16801561450b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50805460018160011615610100020316600290046000825580601f1061453f57506116f5565b601f0160209004906000526020600020908101906116f591906145e9565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261459357600085556145d9565b82601f106145ac57805160ff19168380011785556145d9565b828001600101855582156145d9579182015b828111156145d95782518255916020019190600101906145be565b506145e59291506145e9565b5090565b5b808211156145e557600081556001016145ea56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c65203a2046756e6374696f6e2063616c6c656420627920756e617574686f72697a656420757365722e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e647345524332305061796d656e74203a20446973616c6c6f77656420746f6b656e005472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444552433732314275726e61626c653a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665644f776e61626c652f7472616e736665724f776e657273686970203a2063616e6e6f74207472616e73666572206f776e65727368697020746f207a65726f2061646472657373a2646970667358221220ee4cad62ebddc3fa6a94ac5cca32fd7cf1380207a0bd33d7c67a4ee3d46c4a5964736f6c63430007060033

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

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000008544f4d53204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004544e465400000000000000000000000000000000000000000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 544f4d53204e4654000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 544e465400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57312:1430:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4021:150;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4021:150:0;-1:-1:-1;;;;;;4021:150:0;;:::i;:::-;;;;;;;;;;;;;;;;;;45074:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43121:173;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43121:173:0;;:::i;:::-;;;;-1:-1:-1;;;;;43121:173:0;;;;;;;;;;;;;;45296:270;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45296:270:0;;;;;;;;:::i;:::-;;37211:29;;;;;;;;;;;;;:::i;44462:117::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46209:245;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46209:245:0;;;;;;;;;;;;;;;;;:::i;53464:35::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53464:35:0;;:::i;34188:104::-;;;;;;;;;;;;;:::i;53418:37::-;;;;;;;;;;;;;:::i;44771:162::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44771:162:0;;;;;;;;:::i;33919:157::-;;;;;;;;;;;;;:::i;33068:119::-;;;;;;;;;;;;;:::i;46526:201::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46526:201:0;;;;;;;;;;;;;;;;;:::i;52848:510::-;;;;;;;;;;;;;;;;-1:-1:-1;52848:510:0;;:::i;57449:518::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57449:518:0;;;;;;;;;;;;;;;-1:-1:-1;;;57449:518:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57449:518:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57449:518:0;;-1:-1:-1;;;;;;;57449:518:0;;;;-1:-1:-1;;;57449:518:0;;;;;;;;;:::i;47437:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47437:36:0;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;47437:36:0;;;;;;;;;;;;;;;;;;;;34885:119;;;;;;;;;;;;;:::i;44590:172::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44590:172:0;;:::i;34086:92::-;;;;;;;;;;;;;:::i;43488:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43488:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43488:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43488:109:0;;-1:-1:-1;43488:109:0;;-1:-1:-1;;;;;43488:109:0:i;58418:91::-;;;;;;;;;;;;;;;;-1:-1:-1;58418:91:0;;;;;;;:::i;32635:86::-;;;;;;;;;;;;;:::i;57993:289::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57993:289:0;;;;;;;;;;;;;;;;;;:::i;44942:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44942:124:0;;:::i;35319:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35319:175:0;;:::i;43607:97::-;;;;;;;;;;;;;:::i;43304:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43304:175:0;-1:-1:-1;;;;;43304:175:0;;:::i;1299:130::-;;;;;;;;;;;;;:::i;56025:345::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56025:345:0;;;;;;;:::i;37158:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37158:46:0;-1:-1:-1;;;;;37158:46:0;;:::i;32943:117::-;;;;;;;;;;;;;:::i;47362:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47362:40:0;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;47362:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;892:102;;;;;;;;;;;;;:::i;45182:104::-;;;;;;;;;;;;;:::i;58307:92::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58307:92:0;;:::i;58534:85::-;;;;;;;;;;;;;;;;-1:-1:-1;58534:85:0;;:::i;33770:139::-;;;;;;;;;;;;;:::i;34760:117::-;;;;;;;;;;;;;:::i;56379:341::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56379:341:0;;;;;;;;;:::i;45639:266::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45639:266:0;;;;;;;;;;:::i;37275:142::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37275:142:0;-1:-1:-1;;;;;37275:142:0;;:::i;53550:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53550:51:0;;:::i;46799:282::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46799:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46799:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46799:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46799:282:0;;-1:-1:-1;46799:282:0;;-1:-1:-1;;;;;46799:282:0:i;58644:87::-;;;;;;;;;;;;;;;;-1:-1:-1;58644:87:0;;:::i;53506:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53506:39:0;;:::i;35504:193::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35504:193:0;;:::i;43713:741::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43713:741:0;;:::i;56731:571::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56731:571:0;;;;;;;;;;;;;:::i;35163:143::-;;;;;;;;;;;;;:::i;37451:138::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37451:138:0;-1:-1:-1;;;;;37451:138:0;;:::i;35014:141::-;;;;;;;;;;;;;:::i;54527:273::-;;;;;;;;;;;;;;;;-1:-1:-1;54527:273:0;;:::i;54011:506::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54011:506:0;;;;;;;;;;;;;;;-1:-1:-1;;;54011:506:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54011:506:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54011:506:0;;-1:-1:-1;;;;;;;54011:506:0;;;;-1:-1:-1;;;54011:506:0;;;;:::i;37620:152::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37620:152:0;;;;:::i;45977:164::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45977:164:0;;;;;;;;;;:::i;52586:196::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52586:196:0;;:::i;1002:289::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1002:289:0;-1:-1:-1;;;;;1002:289:0;;:::i;4021:150::-;-1:-1:-1;;;;;;4130:33:0;;4106:4;4130:33;;;;;;;;;;;;;4021:150;;;;:::o;45074:100::-;45161:5;45154:12;;;;;;;;-1:-1:-1;;45154:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45128:13;;45154:12;;45161:5;;45154:12;;45161:5;45154:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45074:100;;:::o;43121:173::-;43197:7;43225:16;43233:7;43225;:16::i;:::-;43217:25;;;;;;-1:-1:-1;43262:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43262:24:0;;43121:173::o;45296:270::-;45377:13;45393:16;45401:7;45393;:16::i;:::-;45377:32;;45434:5;-1:-1:-1;;;;;45428:11:0;:2;-1:-1:-1;;;;;45428:11:0;;;45420:20;;;;;;45477:5;-1:-1:-1;;;;;45461:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45461:21:0;;:62;;;;45486:37;45503:5;45510:12;:10;:12::i;:::-;45486:16;:37::i;:::-;45453:71;;;;;;45537:21;45546:2;45550:7;45537:8;:21::i;:::-;45296:270;;;:::o;37211:29::-;;;;;;:::o;44462:117::-;44523:7;44550:21;:12;:19;:21::i;:::-;44543:28;;44462:117;:::o;46209:245::-;46317:41;46336:12;:10;:12::i;:::-;46350:7;46317:18;:41::i;:::-;46309:50;;;;;;46374:19;46385:7;46374:10;:19::i;:::-;:28;46366:37;;;;;;46418:28;46428:4;46434:2;46438:7;46418:9;:28::i;53464:35::-;;;;;;;;;;;;;:::o;34188:104::-;34268:16;;;;;;;;34188:104::o;53418:37::-;;;-1:-1:-1;;;;;53418:37:0;;:::o;44771:162::-;-1:-1:-1;;;;;44895:20:0;;44868:7;44895:20;;;:13;:20;;;;;:30;;44919:5;44895:23;:30::i;:::-;44888:37;;44771:162;;;;;:::o;33919:157::-;33973:4;33987:17;:15;:17::i;:::-;:25;;34008:4;33987:25;33984:49;;;-1:-1:-1;34026:1:0;34019:8;;33984:49;-1:-1:-1;34054:14:0;;33919:157;:::o;33068:119::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32876:8:::1;:6;:8::i;:::-;32868:41;;;::::0;;-1:-1:-1;;;32868:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32868:41:0;;;;;;;;;;;;;::::1;;33126:7:::2;:15:::0;;-1:-1:-1;;;;33126:15:0::2;::::0;;33157:22:::2;33166:12;:10;:12::i;:::-;33157:22;::::0;;-1:-1:-1;;;;;33157:22:0;;::::2;::::0;;;;;;;::::2;::::0;;::::2;33068:119::o:0;46526:201::-;46634:19;46645:7;46634:10;:19::i;:::-;:28;46626:37;;;;;;46680:39;46697:4;46703:2;46707:7;46680:39;;;;;;;;;;;;:16;:39::i;52848:510::-;52915:42;52934:12;:10;:12::i;52915:42::-;:68;;;;52971:12;:10;:12::i;:::-;52961:6;;-1:-1:-1;;;;;52961:6:0;;;:22;;;52915:68;52907:129;;;;-1:-1:-1;;;52907:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53047:19;53070:16;;;:6;:16;;;;;53094:15;;;;:23;;:15;:23;53091:228;;;53129:15;53147:14;;;:4;:14;;;;;53170:10;;;;:18;;:10;:18;53167:113;;;53229:10;;;53263:9;;;53247:26;;53229:10;;;;-1:-1:-1;;;;;53229:10:0;;;;53247:26;;;;;53196:22;53247:26;53196:22;53247:26;53263:9;53229:10;53247:26;;;;;;;;;;;;;;;;;;;;;53167:113;;53290:23;53304:8;53290:13;:23::i;:::-;53091:228;;53335:15;53341:8;53335:5;:15::i;:::-;52848:510;;:::o;57449:518::-;37838:17;;57619:4;;57588:13;;37838:17;;37835:168;;-1:-1:-1;;;;;37885:26:0;;;;:66;;-1:-1:-1;;;;;;37915:28:0;;;;;;:14;:28;;;;;;;;:36;;:28;:36;37885:66;37871:126;;;;;-1:-1:-1;;;37871:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37871:126:0;;;;;;;;;;;;;;;57636:13:::1;57652;:11;:13::i;:::-;57668:1;57652:17;57680:15;::::0;;;:5:::1;:15;::::0;;;;:27;;;57652:17;-1:-1:-1;57720:31:0::1;57730:10:::0;57652:17;57720:9:::1;:31::i;:::-;57762:33;57775:8;57785:9;57762:12;:33::i;:::-;57820:10;-1:-1:-1::0;;;;;57813:50:0::1;;57832:9;57843:8;57853:9;57813:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57872:61;57887:13;57901:8;57910:9;57920:12;57872:14;:61::i;:::-;57951:8:::0;57449:518;-1:-1:-1;;;;;;;57449:518:0:o;47437:36::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47437:36:0;;;:::o;34885:119::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34453:11:::1;:9;:11::i;:::-;34445:44;;;::::0;;-1:-1:-1;;;34445:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34445:44:0;;;;;;;;;;;;;::::1;;34949:10:::2;:18:::0;;-1:-1:-1;;34949:18:0::2;::::0;;34983:13:::2;::::0;::::2;::::0;34962:5:::2;::::0;34983:13:::2;34885:119::o:0;44590:172::-;44665:7;;44707:22;:12;44723:5;44707:15;:22::i;:::-;-1:-1:-1;44685:44:0;44590:172;-1:-1:-1;;;44590:172:0:o;34086:92::-;34160:10;;;;34086:92;:::o;43488:109::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43568:21:::1;43580:8;43568:11;:21::i;:::-;43488:109:::0;:::o;58418:91::-;58483:21;58488:8;58497:6;58483:4;:21::i;32635:86::-;32706:7;;-1:-1:-1;;;32706:7:0;;;;;32635:86::o;57993:289::-;37838:17;;58106:13;;37838:17;;37835:168;;-1:-1:-1;;;;;37885:26:0;;;;:66;;-1:-1:-1;;;;;;37915:28:0;;;;;;:14;:28;;;;;;;;:36;;:28;:36;37885:66;37871:126;;;;;-1:-1:-1;;;37871:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37871:126:0;;;;;;;;;;;;;;;58149:19:::1;::::0;;;:9:::1;:19;::::0;;;;;::::1;;:28;58141:37;;;::::0;::::1;;58213:61;58228:13;58242:8;58251:9;58261:12;58213:14;:61::i;:::-;57993:289:::0;;;;;:::o;44942:124::-;45014:7;45041:17;45050:7;45041:8;:17::i;35319:175::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35392:3:::1;35380:8;:15;;35372:48;;;::::0;;-1:-1:-1;;;35372:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35372:48:0;;;;;;;;;;;;;::::1;;35435:8;:19:::0;;;35470:16:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;35319:175:::0;:::o;43607:97::-;43688:8;43681:15;;;;;;;;-1:-1:-1;;43681:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43655:13;;43681:15;;43688:8;;43681:15;;43688:8;43681:15;;;;;;;;;;;;;;;;;;;;;;;;43304:175;43376:7;-1:-1:-1;;;;;43404:19:0;;43396:28;;;;;;-1:-1:-1;;;;;43442:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;1299:130::-;783:6;;1356:12;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1391:30:::1;1418:1;1391:18;:30::i;56025:345::-:0;56090:4;56111:20;56122:8;56111:10;:20::i;:::-;:29;56103:38;;;;;;56154:13;56170:15;;;:5;:15;;;;;;56218:17;56176:8;56218:7;:17::i;:::-;-1:-1:-1;;;;;56204:31:0;:10;-1:-1:-1;;;;;56204:31:0;;56196:40;;;;;;56247:15;;;;:5;:15;;;;;;;;;:24;;;56289:51;;;;;;;;;;;;;;;;;;;56301:10;;56289:51;;;;;;;;;;-1:-1:-1;56358:4:0;;56025:345;-1:-1:-1;;;56025:345:0:o;37158:46::-;;;;;;;;;;;;;;;:::o;32943:117::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32776:8:::1;:6;:8::i;:::-;32775:9;32767:38;;;::::0;;-1:-1:-1;;;32767:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32767:38:0;;;;;;;;;;;;;::::1;;33012:4:::2;33002:14:::0;;-1:-1:-1;;;;33002:14:0::2;-1:-1:-1::0;;;33002:14:0::2;::::0;;33032:20:::2;33039:12;:10;:12::i;47362:40::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47362:40:0;;;;;;;;;;;:::o;892:102::-;980:6;;-1:-1:-1;;;;;980:6:0;;892:102::o;45182:104::-;45271:7;45264:14;;;;;;;;-1:-1:-1;;45264:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45238:13;;45264:14;;45271:7;;45264:14;;45271:7;45264:14;;;;;;;;;;;;;;;;;;;;;;;;58307:92;58370:24;58385:8;58370:14;:24::i;58534:85::-;58594:20;58605:8;58594:10;:20::i;33770:139::-;33818:4;33832:11;:9;:11::i;:::-;:19;;33847:4;33832:19;33829:43;;;-1:-1:-1;33865:1:0;33858:8;;33829:43;-1:-1:-1;33893:8:0;;33770:139;:::o;34760:117::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34349:11:::1;:9;:11::i;:::-;34348:12;34340:41;;;::::0;;-1:-1:-1;;;34340:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34340:41:0;;;;;;;;;;;;;::::1;;34825:10:::2;:17:::0;;-1:-1:-1;;34825:17:0::2;34838:4;34825:17;::::0;;34858:11:::2;::::0;::::2;::::0;34825:10:::2;::::0;34858:11:::2;34760:117::o:0;56379:341::-;56460:4;56499:17;56507:8;56499:7;:17::i;:::-;-1:-1:-1;;;;;56485:31:0;:10;-1:-1:-1;;;;;56485:31:0;;56477:40;;;;;;56538:20;56549:8;56538:10;:20::i;:::-;:29;56530:38;;;;;;56583:19;;;;:9;:19;;;;;;;;;:36;;-1:-1:-1;;56583:36:0;;;;;;;;;;56637:51;;;;;;;;;;;56651:10;;56637:51;;;;;;;;-1:-1:-1;56708:4:0;56379:341;;;;:::o;45639:266::-;45754:12;:10;:12::i;:::-;-1:-1:-1;;;;;45742:24:0;:8;-1:-1:-1;;;;;45742:24:0;;;45734:33;;;;;;45825:8;45780:18;:32;45799:12;:10;:12::i;:::-;-1:-1:-1;;;;;45780:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;45780:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;45780:53:0;;;;;;;;;;;45864:12;:10;:12::i;:::-;-1:-1:-1;;;;;45849:48:0;;45888:8;45849:48;;;;;;;;;;;;;;;;;;;;45639:266;;:::o;37275:142::-;783:6;;37346:4;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37357:28:0::1;;::::0;;;:14:::1;:28;::::0;;;;:35;;-1:-1:-1;;37357:35:0::1;37388:4;37357:35:::0;;::::1;::::0;;;37388:4;37275:142::o;53550:51::-;;;;;;;;;;;;-1:-1:-1;;;;;53550:51:0;;:::o;46799:282::-;46931:41;46950:12;:10;:12::i;:::-;46964:7;46931:18;:41::i;:::-;46923:50;;;;;;46988:19;46999:7;46988:10;:19::i;:::-;:28;46980:37;;;;;;47034:39;47048:4;47054:2;47058:7;47067:5;47034:13;:39::i;:::-;46799:282;;;;:::o;58644:87::-;58705:21;58717:8;58705:11;:21::i;53506:39::-;;;;;;;;;;;;;;;:::o;35504:193::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35583:3:::1;35571:8;:15;;35563:48;;;::::0;;-1:-1:-1;;;35563:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35563:48:0;;;;;;;;;;;;;::::1;;35626:14;:25:::0;;;35667:22:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;35504:193:::0;:::o;43713:741::-;43786:13;43820:16;43828:7;43820;:16::i;:::-;43812:25;;;;;;43850:23;43876:19;;;:10;:19;;;;;;;;43850:45;;;;;;;;;;;-1:-1:-1;;43850:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;43876:19;;43850:45;;;43876:19;43850:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43906:18;43927:9;:7;:9::i;:::-;43906:30;;44018:4;44012:18;44034:1;44012:23;44008:72;;;-1:-1:-1;44059:9:0;-1:-1:-1;44052:16:0;;44008:72;44184:23;;:27;44180:108;;44259:4;44265:9;44242:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44242:33:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44242:33:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44242:33:0;;;;;;;;;;;;;-1:-1:-1;;44242:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44228:48;;;;;;44180:108;44420:4;44426:18;:7;:16;:18::i;:::-;44403:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44403:42:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44403:42:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44403:42:0;;;;;;;;;;;;;-1:-1:-1;;44403:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44389:57;;;;43713:741;;;:::o;56731:571::-;37838:17;;56856:4;;56825:13;;37838:17;;37835:168;;-1:-1:-1;;;;;37885:26:0;;;;:66;;-1:-1:-1;;;;;;37915:28:0;;;;;;:14;:28;;;;;;;;:36;;:28;:36;37885:66;37871:126;;;;;-1:-1:-1;;;37871:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37871:126:0;;;;;;;;;;;;;;;56875:20:::1;56886:8;56875:10;:20::i;:::-;:29;56867:38;;;::::0;::::1;;56910:13;56926:15:::0;;;:5:::1;:15;::::0;;;;;56974:17:::1;56932:8:::0;56974:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;56960:31:0::1;:10;-1:-1:-1::0;;;;;56960:31:0::1;;56952:40;;;::::0;::::1;;57007:15;::::0;;;:5:::1;:15;::::0;;;;;;;:24;;;57036:18:::1;:28:::0;;;;;;:44;;-1:-1:-1;;;;;;57036:44:0::1;-1:-1:-1::0;;;;;57036:44:0;::::1;;::::0;;57090:41;;;;;-1:-1:-1;57090:41:0;;::::1;::::0;;;;;;57104:10:::1;::::0;57090:41:::1;::::0;;;;;;::::1;57144:19;::::0;;;:9:::1;:19;::::0;;;;;::::1;;:27;;:19:::0;:27:::1;57140:133;;57179:19;::::0;;;:9:::1;:19;::::0;;;;;;;;:26;;-1:-1:-1;;57179:26:0::1;57201:4;57179:26;::::0;;57216:51;;;;;;;::::1;::::0;;;;;;;;;;;57228:10:::1;::::0;57216:51:::1;::::0;;;;;;;;::::1;57140:133;-1:-1:-1::0;57290:4:0::1;::::0;56731:571;-1:-1:-1;;;;;56731:571:0:o;35163:143::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34689:17:::1;:15;:17::i;:::-;34681:50;;;::::0;;-1:-1:-1;;;34681:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34681:50:0;;;;;;;;;;;;;::::1;;35239:16:::2;:24:::0;;-1:-1:-1;;35239:24:0::2;::::0;;35279:19:::2;::::0;::::2;::::0;35258:5:::2;::::0;35279:19:::2;35163:143::o:0;37451:138::-;783:6;;37521:4;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37532:28:0::1;37563:5;37532:28:::0;;;:14:::1;:28;::::0;;;;:36;;-1:-1:-1;;37532:36:0::1;::::0;;-1:-1:-1;;37451:138:0:o;35014:141::-;783:6;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34573:17:::1;:15;:17::i;:::-;34572:18;34564:47;;;::::0;;-1:-1:-1;;;34564:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34564:47:0;;;;;;;;;;;;;::::1;;35091:16:::2;:23:::0;;-1:-1:-1;;35091:23:0::2;;;::::0;;35130:17:::2;::::0;::::2;::::0;35091:23;;35130:17:::2;35014:141::o:0;54527:273::-;54578:14;54588:3;54578:9;:14::i;:::-;54605:22;54630:12;54638:3;54630:7;:12::i;:::-;54605:37;-1:-1:-1;54673:10:0;54696:11;54703:3;54696:6;:11::i;:::-;54750:9;-1:-1:-1;;;;;54725:67:0;54734:14;-1:-1:-1;;;;;54725:67:0;;54761:5;:10;54767:3;54761:10;;;;;;;;;;;;54773:3;54778:13;54787:3;54778:8;:13::i;:::-;54725:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54527:273;;;:::o;54011:506::-;37838:17;;54157:4;;54126:13;;37838:17;;37835:168;;-1:-1:-1;;;;;37885:26:0;;;;:66;;-1:-1:-1;;;;;;37915:28:0;;;;;;:14;:28;;;;;;;;:36;;:28;:36;37885:66;37871:126;;;;;-1:-1:-1;;;37871:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37871:126:0;;;;;;;;;;;;;;;54174:13:::1;54190;:11;:13::i;:::-;54206:1;54190:17:::0;;::::1;54218:15;::::0;;;:5:::1;:15;::::0;;;;;;;:24;;;54247:18:::1;:28:::0;;;;;:44;;-1:-1:-1;;;;;;54247:44:0::1;-1:-1:-1::0;;;;;54247:44:0;::::1;;::::0;;54302:9:::1;:19:::0;;;;;:26;;-1:-1:-1;;54302:26:0::1;::::0;;::::1;::::0;;;54190:17;-1:-1:-1;54341:31:0::1;54351:10:::0;54190:17;54341:9:::1;:31::i;:::-;54383:33;54396:8;54406:9;54383:12;:33::i;:::-;54441:10;-1:-1:-1::0;;;;;54434:47:0::1;;54453:6;54461:8;54471:9;54434:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54501:8:::0;54011:506;-1:-1:-1;;;;;;54011:506:0:o;37620:152::-;783:6;;37702:4;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37713:17:0::1;:38:::0;;-1:-1:-1;;37713:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;37620:152:0:o;45977:164::-;-1:-1:-1;;;;;46098:25:0;;;46074:4;46098:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45977:164::o;52586:196::-;52653:4;52686:16;;;:6;:16;;;;;52710:15;;;;:23;;:15;:23;52707:51;;52747:5;52740:12;;;;;52707:51;-1:-1:-1;52773:4:0;;52586:196;-1:-1:-1;;52586:196:0:o;1002:289::-;783:6;;1100:12;;-1:-1:-1;;;;;783:6:0;769:10;:20;747:117;;;;-1:-1:-1;;;747:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1138:22:0;::::1;1130:104;;;;-1:-1:-1::0;;;1130:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1255:28;1274:8;1255:18;:28::i;39810:127::-:0;39875:4;39899:30;:12;39921:7;39899:21;:30::i;68:98::-;148:10;68:98;:::o;42800:178::-;42867:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;42867:29:0;-1:-1:-1;;;;;42867:29:0;;;;;;;;:24;;42921:17;42867:24;42921:8;:17::i;:::-;-1:-1:-1;;;;;42912:40:0;;;;;;;;;;;42800:178;;:::o;29576:123::-;29645:7;29672:19;29680:3;29672:7;:19::i;39945:296::-;40038:4;40063:16;40071:7;40063;:16::i;:::-;40055:25;;;;;;40091:13;40107:17;40116:7;40107:8;:17::i;:::-;40091:33;;40154:5;-1:-1:-1;;;;;40143:16:0;:7;-1:-1:-1;;;;;40143:16:0;;:51;;;;40187:7;-1:-1:-1;;;;;40163:31:0;:20;40175:7;40163:11;:20::i;:::-;-1:-1:-1;;;;;40163:31:0;;40143:51;:89;;;-1:-1:-1;;;;;;40198:25:0;;;;;;;:18;:25;;;;;;;;:34;;;;;;;;;;;;40143:89;40135:98;39945:296;-1:-1:-1;;;;39945:296:0:o;41407:490::-;41526:4;-1:-1:-1;;;;;41505:25:0;:17;41514:7;41505:8;:17::i;:::-;-1:-1:-1;;;;;41505:25:0;;41497:34;;;;;;-1:-1:-1;;;;;41550:16:0;;41542:25;;;;;;41580:39;41601:4;41607:2;41611:7;41580:20;:39::i;:::-;41684:29;41701:1;41705:7;41684:8;:29::i;:::-;-1:-1:-1;;;;;41726:19:0;;;;;;:13;:19;;;;;:35;;41753:7;41726:26;:35::i;:::-;-1:-1:-1;;;;;;41772:17:0;;;;;;:13;:17;;;;;:30;;41794:7;41772:21;:30::i;:::-;-1:-1:-1;41815:29:0;:12;41832:7;41841:2;41815:16;:29::i;:::-;;41881:7;41877:2;-1:-1:-1;;;;;41862:27:0;41871:4;-1:-1:-1;;;;;41862:27:0;;;;;;;;;;;41407:490;;;:::o;22186:137::-;22257:7;22292:22;22296:3;22308:5;22292:3;:22::i;52387:186::-;52475:40;;;;;;;;-1:-1:-1;52475:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52456:16;;;:6;:16;;;;;:59;;;;;;-1:-1:-1;;;;;52456:59:0;;;;;;;-1:-1:-1;;;;;;52456:59:0;;;-1:-1:-1;;52456:59:0;;;;;;;;;;;52475:40;52456:59;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52456:59:0;;;;;;;;;;52543:25;;;;;;;;;;;;;;;;;;;;;;52526:14;;;:4;:14;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52387:186::o;40915:484::-;40975:13;40991:17;41000:7;40991:8;:17::i;:::-;40975:33;;41039:48;41060:5;41075:1;41079:7;41039:20;:48::i;:::-;41100:29;41117:1;41121:7;41100:8;:29::i;:::-;41152:19;;;;:10;:19;;;;;41146:33;;-1:-1:-1;;41146:33:0;;;;;;;;;;;:38;41142:97;;41208:19;;;;:10;:19;;;;;41201:26;;;:::i;:::-;-1:-1:-1;;;;;41251:20:0;;;;;;:13;:20;;;;;:36;;41279:7;41251:27;:36::i;:::-;-1:-1:-1;41300:37:0;:12;41317:7;41334:1;41300:16;:37::i;:::-;-1:-1:-1;41355:36:0;;41383:7;;41379:1;;-1:-1:-1;;;;;41355:36:0;;;;;41379:1;;41355:36;40915:484;;:::o;40249:110::-;40325:26;40335:2;40339:7;40325:26;;;;;;;;;;;;:9;:26::i;41905:167::-;42005:16;42013:7;42005;:16::i;:::-;41997:25;;;;;;42033:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;47755:546::-;37838:17;;47871:13;;37838:17;;37835:168;;-1:-1:-1;;;;;37885:26:0;;;;:66;;-1:-1:-1;;;;;;37915:28:0;;;;;;:14;:28;;;;;;;;:36;;:28;:36;37885:66;37871:126;;;;;-1:-1:-1;;;37871:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37871:126:0;;;;;;;;;;;;;;;47938:10:::1;47916:18;47925:8:::0;47916::::1;:18::i;:::-;-1:-1:-1::0;;;;;47916:32:0::1;;47908:41;;;::::0;::::1;;47989:19;48012:16:::0;;;:6:::1;:16;::::0;;;;48041:15;;::::1;;:23;;:15:::0;:23:::1;;48033:32;;;::::0;::::1;;48130:79;;;;;;;;48136:4;48130:79;;;;;;48142:10;-1:-1:-1::0;;;;;48130:79:0::1;;;;;48154:9;48130:79;;;;48182:12;48164:15;:30;48130:79;;;;48195:13;-1:-1:-1::0;;;;;48130:79:0::1;;;::::0;48111:6:::1;:16;48118:8;48111:16;;;;;;;;;;;:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48111:98:0::1;;;;;-1:-1:-1::0;;;;;48111:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48111:98:0::1;;;;;-1:-1:-1::0;;;;;48111:98:0::1;;;;;;;;;48233:10;-1:-1:-1::0;;;;;48219:77:0::1;;48245:8;48255:9;48283:12;48265:15;:30;48219:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38013:1;47755:546:::0;;;;;:::o;30039:236::-;30119:7;;;;30179:22;30183:3;30195:5;30179:3;:22::i;:::-;30148:53;;;;-1:-1:-1;30039:236:0;-1:-1:-1;;;;;30039:236:0:o;42080:100::-;42153:19;;;;:8;;:19;;;;;:::i;48862:1403::-;48961:10;48939:18;48948:8;48939;:18::i;:::-;-1:-1:-1;;;;;48939:32:0;;;48931:41;;;;;;48999:19;49022:16;;;:6;:16;;;;;49069:13;;;;49051:15;:31;49043:40;;;;;;49136:20;49159:14;;;:4;:14;;;;;49185:18;;;;-1:-1:-1;;;;;49185:18:0;49182:1033;;49245:5;:14;;;49232:9;:27;;49224:36;;;;;;49344:8;:14;;;49332:9;:26;49324:35;;;;;;49451:14;;;;:18;49447:181;;49567:15;;;49606:14;;;49590:31;;49567:15;;;;-1:-1:-1;;;;;49567:15:0;;;;49590:31;;;;;49534:22;49590:31;49534:22;49590:31;49606:14;49567:15;49590:31;;;;;;;;;;;;;;;;;;;;;49447:181;;49655:32;;;;;;;;49659:4;49655:32;;;49665:10;49655:32;;;;;;;49677:9;49655:32;;;;;;-1:-1:-1;49638:14:0;;;:4;:14;;;;;;:49;;;;;;-1:-1:-1;;;;;49638:49:0;;;-1:-1:-1;;;;;;49638:49:0;;;-1:-1:-1;;49638:49:0;;;;;;;;;;;;;;;;49182:1033;;;49721:5;:14;;;49711:6;:24;;49703:33;;;;;;49817:8;:14;;;49808:6;:23;49800:32;;;;;;49918:14;;;;:18;49914:131;;49980:18;;;;50000:15;;49980:18;50017:14;;;49945:93;;-1:-1:-1;;;;;49980:18:0;;;;;50000:15;;;;49945:27;:93::i;:::-;50093:18;;;;50055:97;;-1:-1:-1;;;;;50093:18:0;50113:10;50133:4;50140:6;50055:31;:97::i;:::-;50180:29;;;;;;;;50184:4;50180:29;;;50190:10;50180:29;;;;;;;;;;;;;-1:-1:-1;50163:14:0;;;:4;:14;;;;;;:46;;;;;;-1:-1:-1;;;;;50163:46:0;;;-1:-1:-1;;;;;;50163:46:0;;;-1:-1:-1;;50163:46:0;;;;;;;;;;;;;;;;49182:1033;50230:27;;;;;;50247:9;50230:27;;;;;;;;;;;;;;;;;48862:1403;;;;:::o;39449:126::-;39515:7;39542:25;:12;39559:7;39542:16;:25::i;1437:193::-;1552:6;;1531:38;;1501:12;;-1:-1:-1;;;;;1531:38:0;;;;1552:6;;;1531:38;;1501:12;;1531:38;-1:-1:-1;1580:6:0;:17;;-1:-1:-1;;;;;;1580:17:0;-1:-1:-1;;;;;1580:17:0;;;;;;;;;;:6;1437:193::o;48324:510::-;48423:10;48401:18;48410:8;48401;:18::i;:::-;-1:-1:-1;;;;;48401:32:0;;48393:41;;;;;;48478:19;48501:16;;;:6;:16;;;;;48532:15;;;;:23;;:15;:23;48524:32;;;;;;48600:15;48618:14;;;:4;:14;;;;;48647:10;;;;:18;;:10;:18;;48639:27;;;;;;48745:40;;;;;;;;-1:-1:-1;48745:40:0;;;48758:10;48745:40;;;;;;;;;;;;;;;;;;;;;;;;;48726:16;;;:6;:16;;;;;;:59;;;;;;-1:-1:-1;;48726:59:0;;;;;;;-1:-1:-1;;;;;;48726:59:0;;-1:-1:-1;;;;;48726:59:0;;;;;;;;;-1:-1:-1;48726:59:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48726:59:0;;;;;;;;;;;;48803:23;;;;;;;;;;;;;;;;;48324:510;;;:::o;50294:976::-;50354:19;50377:16;;;:6;:16;;;;;50406:15;;;;:23;;:15;:23;50398:32;;;;;;50495:5;:13;;;50477:15;:31;50469:40;;;;;;50556:15;50574:14;;;:4;:14;;;;;50601:10;;;;:18;;:10;:18;50593:27;;;;;;50633:10;;;;;-1:-1:-1;;;;;50633:10:0;50647;50633:24;50625:33;;;;;;50698:14;50745:4;50727:15;:13;:15::i;:::-;50715:3;:9;;;:27;:34;;;;;50757:18;;;;50715:34;;;;-1:-1:-1;;;;;;50757:18:0;50754:423;;50829:10;;50879:12;;50829:10;50919:9;;;50903:38;;-1:-1:-1;;;;;50829:10:0;;;;;;;;50879:12;;;;;;;50829:10;;50919:21;;;50903:38;;;;;50796:22;50903:38;50796:22;50903:38;50919:21;50829:10;50903:38;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50947:26:0;;-1:-1:-1;;;;;50947:15:0;;;:26;;;;;50963:9;;50947:26;;;;50963:9;50947:15;:26;;;;;;;;;;;;;;;;;;;;;50754:423;;;;;51023:18;;;;51043:10;;51023:18;51055:9;;;50989:93;;-1:-1:-1;;;;;51023:18:0;;;;;51043:10;;;;51055:21;;;50989:27;:93::i;:::-;51122:18;;;;51142:12;;51088:83;;-1:-1:-1;;;;;51122:18:0;;;;;51142:12;;;51156:9;51088:27;:83::i;:::-;51204:25;;;;;;;;-1:-1:-1;51204:25:0;;;;;;;;;;;;;;;;51187:14;;;:4;:14;;;;;;:42;;;;;;-1:-1:-1;;;;;51187:42:0;;;-1:-1:-1;;;;;;51187:42:0;;;-1:-1:-1;;51187:42:0;;;;;;;;;;;;;51204:25;51187:42;;;;;;;;51243:19;;;;;;;;;;;;;;;;;50294:976;;;;:::o;39584:218::-;39698:28;39708:4;39714:2;39718:7;39698:9;:28::i;:::-;39745:48;39768:4;39774:2;39778:7;39787:5;39745:22;:48::i;:::-;39737:57;;;;;51298:1086;51365:19;51388:16;;;:6;:16;;;;;51436:13;;;;51417:15;:32;;51409:41;;;;;;51508:15;;;;:23;;:15;:23;51500:32;;;;;;51576:22;51609:18;51618:8;51609;:18::i;:::-;51637:15;51655:14;;;:4;:14;;;;;51684:12;;51698:10;;51576:52;;-1:-1:-1;51655:14:0;;51674:45;;-1:-1:-1;;;;;51684:12:0;;;;;;;;51698:10;;;;;51660:8;51674:9;:45::i;:::-;51752:21;51800:4;51788:9;:7;:9::i;:::-;51776:3;:9;;;:21;:28;;;;;51829:9;;;;51865:18;;;;51776:28;;;;;-1:-1:-1;51829:28:0;;;;-1:-1:-1;;;;;51865:18:0;51862:444;;51904:29;;-1:-1:-1;;;;;51904:15:0;;;:29;;;;;51920:12;;51904:29;;;;51920:12;51904:15;:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52021:6:0;;52034:40;;-1:-1:-1;;;;;52021:6:0;;;;;;52034:40;;;;;52057:16;;51981:29;52034:40;51981:29;52034:40;52057:16;52021:6;52034:40;;;;;;;;;;;;;;;;;;;;;51862:444;;;;52158:18;;;;52178:12;;52124:86;;-1:-1:-1;;;;;52158:18:0;;;;;52178:12;;;52192;52124:27;:86::i;:::-;52250:18;;;;;52270:6;52216:84;;-1:-1:-1;;;;;52250:18:0;;;;52270:6;52278:16;52216:27;:84::i;:::-;52341:9;;;;52321:30;;;;;;;;;;;;;;;;;;;;;;;;;52356:23;52370:8;52356:13;:23::i;:::-;51298:1086;;;;;;:::o;31660:746::-;31716:13;31937:10;31933:53;;-1:-1:-1;31964:10:0;;;;;;;;;;;;-1:-1:-1;;;31964:10:0;;;;;;31933:53;32011:5;31996:12;32052:78;32059:9;;32052:78;;32085:8;;32116:2;32108:10;;;;32052:78;;;32140:19;32172:6;32162:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32162:17:0;-1:-1:-1;32234:5:0;;-1:-1:-1;32140:39:0;-1:-1:-1;;;32206:10:0;;32250:117;32257:9;;32250:117;;32326:2;32319:4;:9;32314:2;:14;32301:29;;32283:6;32290:7;;;;;;;32283:15;;;;;;;;;;;:47;-1:-1:-1;;;;;32283:47:0;;;;;;;;-1:-1:-1;32353:2:0;32345:10;;;;32250:117;;;-1:-1:-1;32391:6:0;31660:746;-1:-1:-1;;;;31660:746:0:o;54808:201::-;54857:17;54877:14;;;:9;:14;;;;;;;;54910:12;54887:3;54910:7;:12::i;:::-;54902:21;;;;;;54942:12;54934:21;;;;;;54988:12;54996:3;54988:7;:12::i;:::-;-1:-1:-1;;;;;54974:26:0;:10;-1:-1:-1;;;;;54974:26:0;;;54966:35;;;;;55019:996;55105:6;;-1:-1:-1;;;;;55105:6:0;55156:10;55065:29;55211:12;55219:3;55211:7;:12::i;:::-;55178:46;;55237:30;55247:6;55255;55263:3;55237:9;:30::i;:::-;55279:21;55328:4;55316:9;:7;:9::i;:::-;55303:10;;;;:5;:10;;;;;;:22;:29;;;;;55337:17;55357:10;;;:5;:10;;;;;;;;;55394:18;:23;;;;;;;55303:29;;;;;-1:-1:-1;55357:29:0;;;;-1:-1:-1;;;;;55394:23:0;55391:578;;55459:10;;;;:5;:10;;;;;;55446:9;:23;;55438:32;;;;;;55481:29;;-1:-1:-1;;;;;55481:15:0;;;:29;;;;;55497:12;;55481:29;;;;55497:12;55481:15;:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55516:40:0;;-1:-1:-1;;;;;55516:22:0;;;:40;;;;;55539:16;;55516:40;;;;55539:16;55516:22;:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55659:10:0;;;;:5;:10;;;;;;55647:9;:22;55643:81;;;55706:10;;;;:5;:10;;;;;;;55678:39;;-1:-1:-1;;;;;55678:15:0;;;55694:9;:22;;;;55678:39;;;;;55694:22;;55678:39;;55706:10;55678:39;55694:22;55678:15;:39;;;;;;;;;;;;;;;;;;;;;55643:81;55391:578;;;55777:23;;;;:18;:23;;;;;;55739:101;;-1:-1:-1;;;;;55777:23:0;55802:10;55814:6;55822:12;55739:31;:101::i;:::-;55889:23;;;;:18;:23;;;;;;55851:112;;-1:-1:-1;;;;;55889:23:0;55914:10;55926:13;55941:16;55851:31;:112::i;:::-;-1:-1:-1;;;56002:5:0;55985:14;;;-1:-1:-1;;55985:9:0;:14;;;;;:22;;-1:-1:-1;;55985:22:0;;;55019:996::o;29336:151::-;29420:4;29444:35;29454:3;29474;29444:9;:35::i;26147:110::-;26230:19;;26147:110::o;42985:120::-;43090:8;:6;:8::i;:::-;43089:9;43081:18;;;;;21270:137;21340:4;21364:35;21372:3;21392:5;21364:7;:35::i;20962:131::-;21029:4;21053:32;21058:3;21078:5;21053:4;:32::i;28757:185::-;28846:4;28870:64;28875:3;28895;-1:-1:-1;;;;;28909:23:0;;28870:4;:64::i;:::-;28863:71;;28757:185;;;;;;:::o;17209:204::-;17304:18;;17276:7;;17304:26;-1:-1:-1;17296:73:0;;;;-1:-1:-1;;;17296:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17387:3;:11;;17399:5;17387:18;;;;;;;;;;;;;;;;17380:25;;17209:204;;;;:::o;40367:196::-;40463:18;40469:2;40473:7;40463:5;:18::i;:::-;40500:54;40531:1;40535:2;40539:7;40548:5;40500:22;:54::i;:::-;40492:63;;;;;26613:279;26717:19;;26680:7;;;;26717:27;-1:-1:-1;26709:74:0;;;;-1:-1:-1;;;26709:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26796:22;26821:3;:12;;26834:5;26821:19;;;;;;;;;;;;;;;;;;26796:44;;26859:5;:10;;;26871:5;:12;;;26851:33;;;;;26613:279;;;;;:::o;36099:361::-;36294:45;;;-1:-1:-1;;;;;36294:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36294:45:0;-1:-1:-1;;;36294:45:0;;;36283:57;;;;36248:12;;;;36283:10;;;;36294:45;36283:57;;;36294:45;36283:57;;36294:45;36283:57;;;;;;;;;;-1:-1:-1;;36283:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36247:93;;;;36359:7;:57;;;;-1:-1:-1;36371:11:0;;:16;;:44;;;36402:4;36391:24;;;;;;;;;;;;;;;-1:-1:-1;36391:24:0;36371:44;36351:101;;;;;-1:-1:-1;;;36351:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;36468:402;36693:51;;;-1:-1:-1;;;;;36693:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36693:51:0;-1:-1:-1;;;36693:51:0;;;36682:63;;;;36647:12;;;;36682:10;;;;36693:51;36682:63;;;36693:51;36682:63;;36693:51;36682:63;;;;;;;;;;-1:-1:-1;;36682:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36646:99;;;;36764:7;:57;;;;-1:-1:-1;36776:11:0;;:16;;:44;;;36807:4;36796:24;;;;;;;;;;;;;;;-1:-1:-1;36796:24:0;36776:44;36756:106;;;;-1:-1:-1;;;36756:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30868:171;30947:7;30998:30;31003:3;31023;30998:4;:30::i;42188:604::-;42309:4;42336:15;:2;-1:-1:-1;;;;;42336:13:0;;:15::i;:::-;42331:60;;-1:-1:-1;42375:4:0;42368:11;;42331:60;42401:23;42427:252;-1:-1:-1;;;42540:12:0;:10;:12::i;:::-;42567:4;42586:7;42608:5;42443:181;;;;;;-1:-1:-1;;;;;42443:181:0;;;;;;-1:-1:-1;;;;;42443:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42443:181:0;;;;;;;-1:-1:-1;;;;;42443:181:0;;;;;;;;;;;42427:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42427:15:0;;;:252;:15;:252::i;:::-;42401:278;;42690:13;42717:10;42706:32;;;;;;;;;;;;;;;-1:-1:-1;42706:32:0;-1:-1:-1;;;;;;42757:26:0;-1:-1:-1;;;42757:26:0;;-1:-1:-1;;;42188:604:0;;;;;;:::o;25926:125::-;25997:4;26021:17;;;:12;;;;;:17;;;;;;:22;;;25926:125::o;14908:1544::-;14974:4;15113:19;;;:12;;;:19;;;;;;15149:15;;15145:1300;;15584:18;;-1:-1:-1;;15535:14:0;;;;15584:22;;;;15511:21;;15584:3;;:22;;15871;;;;;;;;;;;;;;15851:42;;16017:9;15988:3;:11;;16000:13;15988:26;;;;;;;;;;;;;;;;;;;:38;;;;16094:23;;;16136:1;16094:12;;;:23;;;;;;16120:17;;;16094:43;;16246:17;;16094:3;;16246:17;;;;;;;;;;;;;;;;;;;;;;16341:3;:12;;:19;16354:5;16341:19;;;;;;;;;;;16334:26;;;16384:4;16377:11;;;;;;;;15145:1300;16428:5;16421:12;;;;;14317:414;14380:4;14402:21;14412:3;14417:5;14402:9;:21::i;:::-;14397:327;;-1:-1:-1;14440:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;14623:18;;14601:19;;;:12;;;:19;;;;;;:40;;;;14656:11;;14397:327;-1:-1:-1;14707:5:0;14700:12;;23424:692;23500:4;23635:17;;;:12;;;:17;;;;;;23669:13;23665:444;;-1:-1:-1;;23754:38:0;;;;;;;;;;;;;;;;;;23736:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;23951:19;;23931:17;;;:12;;;:17;;;;;;;:39;23985:11;;23665:444;24065:5;24029:3;:12;;24053:1;24042:8;:12;24029:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;24092:5;24085:12;;;;;40571:336;-1:-1:-1;;;;;40651:16:0;;40643:25;;;;;;40688:16;40696:7;40688;:16::i;:::-;40687:17;40679:26;;;;;;40718:45;40747:1;40751:2;40755:7;40718:20;:45::i;:::-;-1:-1:-1;;;;;40776:17:0;;;;;;:13;:17;;;;;:30;;40798:7;40776:21;:30::i;:::-;-1:-1:-1;40819:29:0;:12;40836:7;40845:2;40819:16;:29::i;:::-;-1:-1:-1;40866:33:0;;40891:7;;-1:-1:-1;;;;;40866:33:0;;;40883:1;;40866:33;;40883:1;;40866:33;40571:336;;:::o;27511:311::-;27577:7;27616:17;;;:12;;;:17;;;;;;27652:13;27644:56;;;;;-1:-1:-1;;;27644:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27754:3;:12;;27778:1;27767:8;:12;27754:26;;;;;;;;;;;;;;;;;;:33;;;27747:40;;;27511:311;;;;:::o;11217:176::-;11338:20;11377:8;;;11217:176::o;11909:195::-;12012:12;12044:52;12066:6;12074:4;12080:1;12083:12;12012;12598:18;12609:6;12598:10;:18::i;:::-;12590:60;;;;;-1:-1:-1;;;12590:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:12;12738:23;12765:6;-1:-1:-1;;;;;12765:11:0;12785:5;12793:4;12765:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12765:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12723:75;;;;12816:52;12834:7;12843:10;12855:12;12999;13028:7;13024:368;;;-1:-1:-1;13059:10:0;13052:17;;13024:368;13106:17;;:21;13102:279;;13209:10;13203:17;13270:15;13257:10;13253:2;13249:19;13242:44;13157:148;13352:12;13345:20;;-1:-1:-1;;;13345:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://ee4cad62ebddc3fa6a94ac5cca32fd7cf1380207a0bd33d7c67a4ee3d46c4a59

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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