ETH Price: $3,413.67 (-1.42%)
Gas: 5 Gwei

oktest (OKT)
 

Overview

TokenID

13

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
MintableERC721New

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-23
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;


/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal {}
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

interface IERC2981  {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
    external
    view
    returns (address receiver, uint256 royaltyAmount);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

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

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

    function approve(address to, uint256 tokenId) public;

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

    function setApprovalForAll(address operator, bool _approved) public;

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


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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {codehash := extcodehash(account)}
        return (codehash != accountHash && codehash != 0x0);
    }

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success,) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

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

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

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _initRegisterInterfaceForErc721() internal {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

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

        return _ownedTokensCount[owner].current();
    }

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

        return owner;
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transferFrom(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Internal function to safely mint a new token.
     * Reverts if the given token ID already exists.
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     * @param _data bytes data to send along with a safe transfer check
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

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

        _clearApproval(tokenId);

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

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This is an internal detail of the `ERC721` contract and its use is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
    internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
                IERC721Receiver(to).onERC721Received.selector,
                _msgSender(),
                from,
                tokenId,
                _data
            ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }

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

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

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

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

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

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

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

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

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

    function _initRegisterInterfaceForErc721Enumerable() internal {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

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

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

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

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

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

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

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use {ERC721-_burn} instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex;
        // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

library UintLibrary {
    function toString(uint256 _i) internal pure returns (string memory) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }
}

library StringLibrary {
    using UintLibrary for uint256;

    function append(string memory _a, string memory _b) internal pure returns (string memory) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory bab = new bytes(_ba.length + _bb.length);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) bab[k++] = _ba[i];
        for (uint i = 0; i < _bb.length; i++) bab[k++] = _bb[i];
        return string(bab);
    }

    function append(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) bbb[k++] = _ba[i];
        for (uint i = 0; i < _bb.length; i++) bbb[k++] = _bb[i];
        for (uint i = 0; i < _bc.length; i++) bbb[k++] = _bc[i];
        return string(bbb);
    }

    function recover(string memory message, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        bytes memory msgBytes = bytes(message);
        bytes memory fullMessage = concat(
            bytes("\x19Ethereum Signed Message:\n"),
            bytes(msgBytes.length.toString()),
            msgBytes,
            new bytes(0), new bytes(0), new bytes(0), new bytes(0)
        );
        return ecrecover(keccak256(fullMessage), v, r, s);
    }

    function concat(bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg) internal pure returns (bytes memory) {
        bytes memory resultBytes = new bytes(_ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i];
        for (uint i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i];
        for (uint i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i];
        for (uint i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i];
        for (uint i = 0; i < _be.length; i++) resultBytes[k++] = _be[i];
        for (uint i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i];
        for (uint i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i];
        return resultBytes;
    }
}

contract HasContractURI is ERC165 {

    string public contractURI;

    /*
     * bytes4(keccak256('contractURI()')) == 0xe8a3d485
     */
    bytes4 private constant _INTERFACE_ID_CONTRACT_URI = 0xe8a3d485;

    function _initRegisterInterfaceForContractURI() internal {
        _registerInterface(_INTERFACE_ID_CONTRACT_URI);
    }

    /**
     * @dev Internal function to set the contract URI
     * @param _contractURI string URI prefix to assign
     */
    function _setContractURI(string memory _contractURI) internal {
        contractURI = _contractURI;
    }
}

contract HasTokenURI {
    using StringLibrary for string;

    // Token URI prefix
    string public tokenURIPrefix;

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

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function _tokenURI(uint256 tokenId) internal view returns (string memory) {
        return tokenURIPrefix.append(_tokenURIs[tokenId]);
    }

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

    /**
     * @dev Internal function to set the token URI prefix.
     * @param _tokenURIPrefix string URI prefix to assign
     */
    function _setTokenURIPrefix(string memory _tokenURIPrefix) internal {
        tokenURIPrefix = _tokenURIPrefix;
    }

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

contract HasSecondarySaleFees is ERC165 {

    struct Copyright {
        address author;
        uint256 feeRateNumerator;
    }

    uint public constant feeRateDenominator = 10000;

    event SetCopyright(uint256 _tokenId, address _creator, address _author, uint256 _feeRateNumerator, uint256 _feeRateDenominator);

    /*
     * bytes4(keccak256('getCopyright(uint256)')) == 0x6f4eaff1
     */
    bytes4 private constant _INTERFACE_ID_COPYRIGHT = 0x6f4eaff1;

    function _initRegisterInterfaceForCopyright() internal {
        _registerInterface(_INTERFACE_ID_COPYRIGHT);
    }

    function getCopyright(uint256 _tokenId) public view returns (Copyright memory);
}

/**
 * @title Full ERC721 Token with support for tokenURIPrefix
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721BaseNew is HasSecondarySaleFees, ERC721, HasContractURI, HasTokenURI, ERC721Enumerable,IERC2981 {
    // Token name
    string public name;

    // Token symbol
    string public symbol;

    // id => copyright
    mapping(uint256 => Copyright) public copyrights;

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

    function _initRegisterInterfaceForErc2981() internal {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC2981);
    }


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

    function royaltyInfo(uint256 tokenId, uint256 salePrice)
    external
    view
    returns (address receiver, uint256 royaltyAmount){

        uint256  royaltyAmount = (salePrice * copyrights[tokenId].feeRateNumerator) / 10000;

        return ( copyrights[tokenId].author,royaltyAmount);
    }



    function _mint(uint256 _tokenId, address _receiver, Copyright[] memory _copyrightInfos) internal {
        // set copyright info
        uint256 copyrightLen = _copyrightInfos.length;
        //  相当于能设置一个版税版本
        require(copyrightLen <= 1,
            "ERC721Base: the length of copyrights must be <= 1");
        if (copyrightLen == 1) {
            require(_copyrightInfos[0].author != address(0),
                "ERC721Base: the author in copyright can't be zero"
            );
            require(_copyrightInfos[0].feeRateNumerator <= feeRateDenominator,
                "ERC721Base: the feeRate in copyright must be <= 1"
            );

            copyrights[_tokenId] = _copyrightInfos[0];
            emit SetCopyright(_tokenId, msg.sender, _copyrightInfos[0].author, _copyrightInfos[0].feeRateNumerator, feeRateDenominator);
        }

        _mint(_receiver, _tokenId);
    }

    function getCopyright(uint256 _tokenId) public view returns (Copyright memory){
        return copyrights[_tokenId];
    }

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

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);
        _clearTokenURI(tokenId);
    }
}

/**
 * @title MintableToken
 * @dev anyone can mint token.
 */
contract MintableERC721New is Ownable, ERC721BaseNew {
    uint256 private tokenIdCounter;
    bool private onlyInitOnce;

    event SetTokenURI(uint256 _tokenId, string _tokenURI);

    function init(
        string memory _name,
        string memory _symbol,
        address _newOwner,
        string memory _contractURI,
        string memory _tokenURIPrefix
    )
    public
    {
        require(!onlyInitOnce, "already initialized");

        name = _name;
        symbol = _symbol;
        contractURI = _contractURI;
        tokenURIPrefix = _tokenURIPrefix;
        _initRegisterInterfaceForErc165();
        _initRegisterInterfaceForErc721();
        _initRegisterInterfaceForErc721Metadata();
        _initRegisterInterfaceForErc721Enumerable();
        _initRegisterInterfaceForContractURI();
        _initRegisterInterfaceForCopyright();
        _initRegisterInterfaceForErc2981();
        _registerInterface(bytes4(keccak256('MINT_WITH_ADDRESS')));

        _transferOwnership(_newOwner);
        onlyInitOnce = true;
    }

    function mint(address _receiver, string memory _tokenURI, Copyright[] memory _copyrightInfos) public {
        // 1. get tokenID with auto-increment
        uint256 currentTokenId = tokenIdCounter;
        tokenIdCounter++;
        // 2. mint
        _mint(currentTokenId, _receiver, _copyrightInfos);
        // 3. set tokenURI
        _setTokenURI(currentTokenId, _tokenURI);
        emit SetTokenURI(currentTokenId, _tokenURI);
    }

    function setTokenURIPrefix(string memory tokenURIPrefix) public onlyOwner {
        _setTokenURIPrefix(tokenURIPrefix);
    }

    function setContractURI(string memory contractURI) public onlyOwner {
        _setContractURI(contractURI);
    }

    address public serverAddress;

    function setServerAddress(address targetAddress) public onlyOwner{
        serverAddress = targetAddress;
    }




}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"address","name":"_author","type":"address"},{"indexed":false,"internalType":"uint256","name":"_feeRateNumerator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_feeRateDenominator","type":"uint256"}],"name":"SetCopyright","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_tokenURI","type":"string"}],"name":"SetTokenURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"copyrights","outputs":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"feeRateNumerator","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeRateDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCopyright","outputs":[{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"feeRateNumerator","type":"uint256"}],"internalType":"struct HasSecondarySaleFees.Copyright","name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_tokenURIPrefix","type":"string"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"},{"components":[{"internalType":"address","name":"author","type":"address"},{"internalType":"uint256","name":"feeRateNumerator","type":"uint256"}],"internalType":"struct HasSecondarySaleFees.Copyright[]","name":"_copyrightInfos","type":"tuple[]"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"contractURI","type":"string"}],"name":"setContractURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"setServerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600062000016620000ba60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620000c2565b600033905090565b6144b380620000d26000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637ceffa581161010f578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d485146105cb578063e985e9c5146105e9578063f0b10c3614610619578063f2fde38b14610637576101f0565b8063b88d4fde14610543578063c0ac99831461055f578063c87b56dd1461057d578063db420fe3146105ad576101f0565b806395d89b41116100de57806395d89b41146104d157806399e0dd7c146104ef578063a22cb4651461050b578063b7ec823914610527576101f0565b80637ceffa58146104485780638da5cb5b146104795780638f32d59b14610497578063938e3d7b146104b5576101f0565b806342842e0e116101875780636f4eaff1116101565780636f4eaff1146103c257806370a08231146103f2578063715018a6146104225780637a5d8d171461042c576101f0565b806342842e0e1461032a57806347b64eb0146103465780634f6ccce7146103625780636352211e14610392576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad5780632a55205a146102c95780632f745c59146102fa576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360361020a91908101906130fc565b610653565b60405161021c9190613de7565b60405180910390f35b61022d6106bb565b60405161023a9190613e02565b60405180910390f35b61025d60048036036102589190810190613266565b610759565b60405161026a9190613d57565b60405180910390f35b61028d600480360361028891908101906130c0565b6107de565b005b610297610999565b6040516102a49190614161565b60405180910390f35b6102c760048036036102c29190810190612f3b565b6109a6565b005b6102e360048036036102de919081019061328f565b610a06565b6040516102f1929190613dbe565b60405180910390f35b610314600480360361030f91908101906130c0565b610a75565b6040516103219190614161565b60405180910390f35b610344600480360361033f9190810190612f3b565b610b1e565b005b610360600480360361035b9190810190612ed6565b610b3e565b005b61037c60048036036103779190810190613266565b610bc9565b6040516103899190614161565b60405180910390f35b6103ac60048036036103a79190810190613266565b610c33565b6040516103b99190613d57565b60405180910390f35b6103dc60048036036103d79190810190613266565b610ce5565b6040516103e99190614146565b60405180910390f35b61040c60048036036104079190810190612ed6565b610d72565b6040516104199190614161565b60405180910390f35b61042a610e31565b005b61044660048036036104419190810190613041565b610f37565b005b610462600480360361045d9190810190613266565b610fa4565b604051610470929190613dbe565b60405180910390f35b610481610fe8565b60405161048e9190613d57565b60405180910390f35b61049f611011565b6040516104ac9190613de7565b60405180910390f35b6104cf60048036036104ca919081019061314e565b61106f565b005b6104d96110c2565b6040516104e69190613e02565b60405180910390f35b6105096004803603610504919081019061314e565b611160565b005b61052560048036036105209190810190613005565b6111b3565b005b610541600480360361053c919081019061318f565b611334565b005b61055d60048036036105589190810190612f8a565b61145f565b005b6105676114c1565b6040516105749190613e02565b60405180910390f35b61059760048036036105929190810190613266565b61155f565b6040516105a49190613e24565b60405180910390f35b6105b56115b9565b6040516105c29190613d57565b60405180910390f35b6105d36115df565b6040516105e09190613e02565b60405180910390f35b61060360048036036105fe9190810190612eff565b61167d565b6040516106109190613de7565b60405180910390f35b610621611711565b60405161062e9190614161565b60405180910390f35b610651600480360361064c9190810190612ed6565b611717565b005b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b505050505081565b60006107648261176a565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90614006565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e982610c33565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906140c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108796117dc565b73ffffffffffffffffffffffffffffffffffffffff1614806108a857506108a7816108a26117dc565b61167d565b5b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90613f66565b60405180910390fd5b826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600b80549050905090565b6109b76109b16117dc565b826117e4565b6109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed906140e6565b60405180910390fd5b610a018383836118c2565b505050565b6000806000612710600f600087815260200190815260200160002060010154850281610a2e57fe5b049050600f600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b6000610a8083610d72565b8210610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab890613e46565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610b0b57fe5b9060005260206000200154905092915050565b610b398383836040518060200160405280600081525061145f565b505050565b610b46611011565b610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614046565b60405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610bd3610999565b8210610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90614106565b60405180910390fd5b600b8281548110610c2157fe5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613fc6565b60405180910390fd5b80915050919050565b610ced612bf5565b600f60008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613fa6565b60405180910390fd5b610e2a600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118e6565b9050919050565b610e39611011565b610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90614046565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006010549050601060008154809291906001019190505550610f5b8185846118f4565b610f658184611b2a565b7fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e8184604051610f969291906141cf565b60405180910390a150505050565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110536117dc565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b611077611011565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90614046565b60405180910390fd5b6110bf81611b80565b50565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111585780601f1061112d57610100808354040283529160200191611158565b820191906000526020600020905b81548152906001019060200180831161113b57829003601f168201915b505050505081565b611168611011565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90614046565b60405180910390fd5b6111b081611b9a565b50565b6111bb6117dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613f26565b60405180910390fd5b80600560006112366117dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e36117dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113289190613de7565b60405180910390a35050565b601160009054906101000a900460ff1615611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613f86565b60405180910390fd5b84600d908051906020019061139a929190612c25565b5083600e90805190602001906113b1929190612c25565b5081600690805190602001906113c8929190612c25565b5080600790805190602001906113df929190612c25565b506113e8611bb4565b6113f0611bc6565b6113f8611bd8565b611400611bea565b611408611bfc565b611410611c0e565b611418611c20565b61143460405161142790613d42565b6040518091039020611c32565b61143d83611d07565b6001601160006101000a81548160ff0219169083151502179055505050505050565b61147061146a6117dc565b836117e4565b6114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906140e6565b60405180910390fd5b6114bb84848484611e35565b50505050565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115575780601f1061152c57610100808354040283529160200191611557565b820191906000526020600020905b81548152906001019060200180831161153a57829003601f168201915b505050505081565b606061156a8261176a565b6115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090614086565b60405180910390fd5b6115b282611e91565b9050919050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116755780601f1061164a57610100808354040283529160200191611675565b820191906000526020600020905b81548152906001019060200180831161165857829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61271081565b61171f611011565b61175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590614046565b60405180910390fd5b61176781611d07565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b60006117ef8261176a565b61182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613f46565b60405180910390fd5b600061183983610c33565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118a857508373ffffffffffffffffffffffffffffffffffffffff1661189084610759565b73ffffffffffffffffffffffffffffffffffffffff16145b806118b957506118b8818561167d565b5b91505092915050565b6118cd838383611ff2565b6118d78382612221565b6118e182826123bf565b505050565b600081600001549050919050565b600081519050600181111561193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614126565b60405180910390fd5b6001811415611b1a57600073ffffffffffffffffffffffffffffffffffffffff168260008151811061196c57fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c6906140a6565b60405180910390fd5b612710826000815181106119df57fe5b6020026020010151602001511115611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390613ee6565b60405180910390fd5b81600081518110611a3957fe5b6020026020010151600f600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050507f0744eac43f2c274aeab710e028e1557486f24427dd812cb06edb74fe166e4dfc843384600081518110611ad857fe5b60200260200101516000015185600081518110611af157fe5b602002602001015160200151612710604051611b1195949392919061417c565b60405180910390a15b611b248385612486565b50505050565b611b338261176a565b611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6990614026565b60405180910390fd5b611b7c82826124a7565b5050565b8060069080519060200190611b96929190612c25565b5050565b8060079080519060200190611bb0929190612c25565b5050565b611bc46301ffc9a760e01b611c32565b565b611bd66380ac58cd60e01b611c32565b565b611be8635b5e139f60e01b611c32565b565b611bfa63780e9d6360e01b611c32565b565b611c0c63e8a3d48560e01b611c32565b565b611c1e636f4eaff160e01b611c32565b565b611c30632a55205a60e01b611c32565b565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9290613ea6565b60405180910390fd5b6001806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90613e86565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e408484846118c2565b611e4c848484846124d3565b611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290613e66565b60405180910390fd5b50505050565b6060611feb600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f3d5780601f10611f1257610100808354040283529160200191611f3d565b820191906000526020600020905b815481529060010190602001808311611f2057829003601f168201915b505050505060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fd85780601f10611fad57610100808354040283529160200191611fd8565b820191906000526020600020905b815481529060010190602001808311611fbb57829003601f168201915b50505050506126cd90919063ffffffff16565b9050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661201282610c33565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90614066565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90613f06565b60405180910390fd5b6120e181612810565b612128600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128ce565b61216f600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128f1565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006122796001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061290790919063ffffffff16565b90506000600a6000848152602001908152602001600020549050818114612366576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106122e657fe5b9060005260206000200154905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061233e57fe5b906000526020600020018190555081600a600083815260200190815260200160002081905550505b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036123b89190612ca5565b5050505050565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050600a600083815260200190815260200160002081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6124908282612951565b61249a82826123bf565b6124a381612b03565b5050565b806008600084815260200190815260200160002090805190602001906124ce929190612c25565b505050565b60006124f48473ffffffffffffffffffffffffffffffffffffffff16612b4f565b61250157600190506126c5565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b6125456117dc565b89888860405160240161255b9493929190613d72565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125c59190613d2b565b6000604051808303816000865af19150503d8060008114612602576040519150601f19603f3d011682016040523d82523d6000602084013e612607565b606091505b50915091508161265f576000815111156126245780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265690613e66565b60405180910390fd5b6000818060200190516126759190810190613125565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6060808390506060839050606081518351016040519080825280601f01601f1916602001820160405280156127115781602001600182028038833980820191505090505b509050600080905060008090505b845181101561278d5784818151811061273457fe5b602001015160f81c60f81b83838060010194508151811061275157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061271f565b5060008090505b8351811015612802578381815181106127a957fe5b602001015160f81c60f81b8383806001019450815181106127c657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612794565b508194505050505092915050565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128cb5760006003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6128e66001826000015461290790919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061294983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b9a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890613fe6565b60405180910390fd5b6129ca8161176a565b15612a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0190613ec6565b60405180910390fd5b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612aa3600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128f1565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612b9157506000801b8214155b92505050919050565b6000838311158290612be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd99190613e24565b60405180910390fd5b5060008385039050809150509392505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c6657805160ff1916838001178555612c94565b82800160010185558215612c94579182015b82811115612c93578251825591602001919060010190612c78565b5b509050612ca19190612cd1565b5090565b815481835581811115612ccc57818360005260206000209182019101612ccb9190612cd1565b5b505050565b612cf391905b80821115612cef576000816000905550600101612cd7565b5090565b90565b600081359050612d0581614414565b92915050565b600082601f830112612d1c57600080fd5b8135612d2f612d2a8261422c565b6141ff565b91508181835260208401935060208101905083856040840282011115612d5457600080fd5b60005b83811015612d845781612d6a8882612e75565b845260208401935060408301925050600181019050612d57565b5050505092915050565b600081359050612d9d8161442b565b92915050565b600081359050612db281614442565b92915050565b600081519050612dc781614442565b92915050565b600082601f830112612dde57600080fd5b8135612df1612dec82614254565b6141ff565b91508082526020830160208301858383011115612e0d57600080fd5b612e188382846143c1565b50505092915050565b600082601f830112612e3257600080fd5b8135612e45612e4082614280565b6141ff565b91508082526020830160208301858383011115612e6157600080fd5b612e6c8382846143c1565b50505092915050565b600060408284031215612e8757600080fd5b612e9160406141ff565b90506000612ea184828501612cf6565b6000830152506020612eb584828501612ec1565b60208301525092915050565b600081359050612ed081614459565b92915050565b600060208284031215612ee857600080fd5b6000612ef684828501612cf6565b91505092915050565b60008060408385031215612f1257600080fd5b6000612f2085828601612cf6565b9250506020612f3185828601612cf6565b9150509250929050565b600080600060608486031215612f5057600080fd5b6000612f5e86828701612cf6565b9350506020612f6f86828701612cf6565b9250506040612f8086828701612ec1565b9150509250925092565b60008060008060808587031215612fa057600080fd5b6000612fae87828801612cf6565b9450506020612fbf87828801612cf6565b9350506040612fd087828801612ec1565b925050606085013567ffffffffffffffff811115612fed57600080fd5b612ff987828801612dcd565b91505092959194509250565b6000806040838503121561301857600080fd5b600061302685828601612cf6565b925050602061303785828601612d8e565b9150509250929050565b60008060006060848603121561305657600080fd5b600061306486828701612cf6565b935050602084013567ffffffffffffffff81111561308157600080fd5b61308d86828701612e21565b925050604084013567ffffffffffffffff8111156130aa57600080fd5b6130b686828701612d0b565b9150509250925092565b600080604083850312156130d357600080fd5b60006130e185828601612cf6565b92505060206130f285828601612ec1565b9150509250929050565b60006020828403121561310e57600080fd5b600061311c84828501612da3565b91505092915050565b60006020828403121561313757600080fd5b600061314584828501612db8565b91505092915050565b60006020828403121561316057600080fd5b600082013567ffffffffffffffff81111561317a57600080fd5b61318684828501612e21565b91505092915050565b600080600080600060a086880312156131a757600080fd5b600086013567ffffffffffffffff8111156131c157600080fd5b6131cd88828901612e21565b955050602086013567ffffffffffffffff8111156131ea57600080fd5b6131f688828901612e21565b945050604061320788828901612cf6565b935050606086013567ffffffffffffffff81111561322457600080fd5b61323088828901612e21565b925050608086013567ffffffffffffffff81111561324d57600080fd5b61325988828901612e21565b9150509295509295909350565b60006020828403121561327857600080fd5b600061328684828501612ec1565b91505092915050565b600080604083850312156132a257600080fd5b60006132b085828601612ec1565b92505060206132c185828601612ec1565b9150509250929050565b6132d48161438b565b82525050565b6132e381614317565b82525050565b6132f281614305565b82525050565b61330181614305565b82525050565b61331081614329565b82525050565b6000613321826142ac565b61332b81856142cd565b935061333b8185602086016143d0565b61334481614403565b840191505092915050565b600061335a826142ac565b61336481856142de565b93506133748185602086016143d0565b80840191505092915050565b600061338b826142c2565b61339581856142e9565b93506133a58185602086016143d0565b6133ae81614403565b840191505092915050565b60006133c4826142b7565b6133ce81856142e9565b93506133de8185602086016143d0565b6133e781614403565b840191505092915050565b60006133ff602b836142e9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006134656032836142e9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134cb6026836142e9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613531601c836142e9565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b6000613571601c836142e9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135b16031836142e9565b91507f455243373231426173653a20746865206665655261746520696e20636f70797260008301527f69676874206d757374206265203c3d20310000000000000000000000000000006020830152604082019050919050565b60006136176024836142e9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061367d6019836142e9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136bd602c836142e9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137236038836142e9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137896013836142e9565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b60006137c9602a836142e9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f6029836142e9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138956020836142e9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138d5602c836142e9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061393b602c836142e9565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139a16020836142e9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006139e16029836142e9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a47602f836142e9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613aad6031836142e9565b91507f455243373231426173653a2074686520617574686f7220696e20636f7079726960008301527f6768742063616e2774206265207a65726f0000000000000000000000000000006020830152604082019050919050565b6000613b136021836142e9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b796031836142e9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613bdf602c836142e9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613c456011836142fa565b91507f4d494e545f574954485f414444524553530000000000000000000000000000006000830152601182019050919050565b6000613c856031836142e9565b91507f455243373231426173653a20746865206c656e677468206f6620636f7079726960008301527f67687473206d757374206265203c3d20310000000000000000000000000000006020830152604082019050919050565b604082016000820151613cf460008501826132e9565b506020820151613d076020850182613d0d565b50505050565b613d1681614381565b82525050565b613d2581614381565b82525050565b6000613d37828461334f565b915081905092915050565b6000613d4d82613c38565b9150819050919050565b6000602082019050613d6c60008301846132f8565b92915050565b6000608082019050613d8760008301876132da565b613d9460208301866132f8565b613da16040830185613d1c565b8181036060830152613db38184613316565b905095945050505050565b6000604082019050613dd360008301856132f8565b613de06020830184613d1c565b9392505050565b6000602082019050613dfc6000830184613307565b92915050565b60006020820190508181036000830152613e1c81846133b9565b905092915050565b60006020820190508181036000830152613e3e8184613380565b905092915050565b60006020820190508181036000830152613e5f816133f2565b9050919050565b60006020820190508181036000830152613e7f81613458565b9050919050565b60006020820190508181036000830152613e9f816134be565b9050919050565b60006020820190508181036000830152613ebf81613524565b9050919050565b60006020820190508181036000830152613edf81613564565b9050919050565b60006020820190508181036000830152613eff816135a4565b9050919050565b60006020820190508181036000830152613f1f8161360a565b9050919050565b60006020820190508181036000830152613f3f81613670565b9050919050565b60006020820190508181036000830152613f5f816136b0565b9050919050565b60006020820190508181036000830152613f7f81613716565b9050919050565b60006020820190508181036000830152613f9f8161377c565b9050919050565b60006020820190508181036000830152613fbf816137bc565b9050919050565b60006020820190508181036000830152613fdf81613822565b9050919050565b60006020820190508181036000830152613fff81613888565b9050919050565b6000602082019050818103600083015261401f816138c8565b9050919050565b6000602082019050818103600083015261403f8161392e565b9050919050565b6000602082019050818103600083015261405f81613994565b9050919050565b6000602082019050818103600083015261407f816139d4565b9050919050565b6000602082019050818103600083015261409f81613a3a565b9050919050565b600060208201905081810360008301526140bf81613aa0565b9050919050565b600060208201905081810360008301526140df81613b06565b9050919050565b600060208201905081810360008301526140ff81613b6c565b9050919050565b6000602082019050818103600083015261411f81613bd2565b9050919050565b6000602082019050818103600083015261413f81613c78565b9050919050565b600060408201905061415b6000830184613cde565b92915050565b60006020820190506141766000830184613d1c565b92915050565b600060a0820190506141916000830188613d1c565b61419e60208301876132cb565b6141ab60408301866132f8565b6141b86060830185613d1c565b6141c56080830184613d1c565b9695505050505050565b60006040820190506141e46000830185613d1c565b81810360208301526141f68184613380565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561422257600080fd5b8060405250919050565b600067ffffffffffffffff82111561424357600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561426b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561429757600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061431082614361565b9050919050565b600061432282614361565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143968261439d565b9050919050565b60006143a8826143af565b9050919050565b60006143ba82614361565b9050919050565b82818337600083830152505050565b60005b838110156143ee5780820151818401526020810190506143d3565b838111156143fd576000848401525b50505050565b6000601f19601f8301169050919050565b61441d81614305565b811461442857600080fd5b50565b61443481614329565b811461443f57600080fd5b50565b61444b81614335565b811461445657600080fd5b50565b61446281614381565b811461446d57600080fd5b5056fea365627a7a72315820d06d4735efc2a1d750da8f83a4efd3640d6e2b1eed3964e3045d63596d58c0bc6c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637ceffa581161010f578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d485146105cb578063e985e9c5146105e9578063f0b10c3614610619578063f2fde38b14610637576101f0565b8063b88d4fde14610543578063c0ac99831461055f578063c87b56dd1461057d578063db420fe3146105ad576101f0565b806395d89b41116100de57806395d89b41146104d157806399e0dd7c146104ef578063a22cb4651461050b578063b7ec823914610527576101f0565b80637ceffa58146104485780638da5cb5b146104795780638f32d59b14610497578063938e3d7b146104b5576101f0565b806342842e0e116101875780636f4eaff1116101565780636f4eaff1146103c257806370a08231146103f2578063715018a6146104225780637a5d8d171461042c576101f0565b806342842e0e1461032a57806347b64eb0146103465780634f6ccce7146103625780636352211e14610392576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad5780632a55205a146102c95780632f745c59146102fa576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360361020a91908101906130fc565b610653565b60405161021c9190613de7565b60405180910390f35b61022d6106bb565b60405161023a9190613e02565b60405180910390f35b61025d60048036036102589190810190613266565b610759565b60405161026a9190613d57565b60405180910390f35b61028d600480360361028891908101906130c0565b6107de565b005b610297610999565b6040516102a49190614161565b60405180910390f35b6102c760048036036102c29190810190612f3b565b6109a6565b005b6102e360048036036102de919081019061328f565b610a06565b6040516102f1929190613dbe565b60405180910390f35b610314600480360361030f91908101906130c0565b610a75565b6040516103219190614161565b60405180910390f35b610344600480360361033f9190810190612f3b565b610b1e565b005b610360600480360361035b9190810190612ed6565b610b3e565b005b61037c60048036036103779190810190613266565b610bc9565b6040516103899190614161565b60405180910390f35b6103ac60048036036103a79190810190613266565b610c33565b6040516103b99190613d57565b60405180910390f35b6103dc60048036036103d79190810190613266565b610ce5565b6040516103e99190614146565b60405180910390f35b61040c60048036036104079190810190612ed6565b610d72565b6040516104199190614161565b60405180910390f35b61042a610e31565b005b61044660048036036104419190810190613041565b610f37565b005b610462600480360361045d9190810190613266565b610fa4565b604051610470929190613dbe565b60405180910390f35b610481610fe8565b60405161048e9190613d57565b60405180910390f35b61049f611011565b6040516104ac9190613de7565b60405180910390f35b6104cf60048036036104ca919081019061314e565b61106f565b005b6104d96110c2565b6040516104e69190613e02565b60405180910390f35b6105096004803603610504919081019061314e565b611160565b005b61052560048036036105209190810190613005565b6111b3565b005b610541600480360361053c919081019061318f565b611334565b005b61055d60048036036105589190810190612f8a565b61145f565b005b6105676114c1565b6040516105749190613e02565b60405180910390f35b61059760048036036105929190810190613266565b61155f565b6040516105a49190613e24565b60405180910390f35b6105b56115b9565b6040516105c29190613d57565b60405180910390f35b6105d36115df565b6040516105e09190613e02565b60405180910390f35b61060360048036036105fe9190810190612eff565b61167d565b6040516106109190613de7565b60405180910390f35b610621611711565b60405161062e9190614161565b60405180910390f35b610651600480360361064c9190810190612ed6565b611717565b005b600060016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b505050505081565b60006107648261176a565b6107a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079a90614006565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e982610c33565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610851906140c6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108796117dc565b73ffffffffffffffffffffffffffffffffffffffff1614806108a857506108a7816108a26117dc565b61167d565b5b6108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90613f66565b60405180910390fd5b826003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000600b80549050905090565b6109b76109b16117dc565b826117e4565b6109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ed906140e6565b60405180910390fd5b610a018383836118c2565b505050565b6000806000612710600f600087815260200190815260200160002060010154850281610a2e57fe5b049050600f600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b6000610a8083610d72565b8210610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab890613e46565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610b0b57fe5b9060005260206000200154905092915050565b610b398383836040518060200160405280600081525061145f565b505050565b610b46611011565b610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90614046565b60405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610bd3610999565b8210610c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0b90614106565b60405180910390fd5b600b8281548110610c2157fe5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613fc6565b60405180910390fd5b80915050919050565b610ced612bf5565b600f60008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613fa6565b60405180910390fd5b610e2a600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118e6565b9050919050565b610e39611011565b610e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6f90614046565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006010549050601060008154809291906001019190505550610f5b8185846118f4565b610f658184611b2a565b7fd2d827dddfc9c9a02afc5fc68d3251684b36e213a7999ebd90a861f25df4077e8184604051610f969291906141cf565b60405180910390a150505050565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110536117dc565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b611077611011565b6110b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ad90614046565b60405180910390fd5b6110bf81611b80565b50565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111585780601f1061112d57610100808354040283529160200191611158565b820191906000526020600020905b81548152906001019060200180831161113b57829003601f168201915b505050505081565b611168611011565b6111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90614046565b60405180910390fd5b6111b081611b9a565b50565b6111bb6117dc565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613f26565b60405180910390fd5b80600560006112366117dc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e36117dc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113289190613de7565b60405180910390a35050565b601160009054906101000a900460ff1615611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613f86565b60405180910390fd5b84600d908051906020019061139a929190612c25565b5083600e90805190602001906113b1929190612c25565b5081600690805190602001906113c8929190612c25565b5080600790805190602001906113df929190612c25565b506113e8611bb4565b6113f0611bc6565b6113f8611bd8565b611400611bea565b611408611bfc565b611410611c0e565b611418611c20565b61143460405161142790613d42565b6040518091039020611c32565b61143d83611d07565b6001601160006101000a81548160ff0219169083151502179055505050505050565b61147061146a6117dc565b836117e4565b6114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a6906140e6565b60405180910390fd5b6114bb84848484611e35565b50505050565b60078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115575780601f1061152c57610100808354040283529160200191611557565b820191906000526020600020905b81548152906001019060200180831161153a57829003601f168201915b505050505081565b606061156a8261176a565b6115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090614086565b60405180910390fd5b6115b282611e91565b9050919050565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116755780601f1061164a57610100808354040283529160200191611675565b820191906000526020600020905b81548152906001019060200180831161165857829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61271081565b61171f611011565b61175e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175590614046565b60405180910390fd5b61176781611d07565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b60006117ef8261176a565b61182e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182590613f46565b60405180910390fd5b600061183983610c33565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118a857508373ffffffffffffffffffffffffffffffffffffffff1661189084610759565b73ffffffffffffffffffffffffffffffffffffffff16145b806118b957506118b8818561167d565b5b91505092915050565b6118cd838383611ff2565b6118d78382612221565b6118e182826123bf565b505050565b600081600001549050919050565b600081519050600181111561193e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193590614126565b60405180910390fd5b6001811415611b1a57600073ffffffffffffffffffffffffffffffffffffffff168260008151811061196c57fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c6906140a6565b60405180910390fd5b612710826000815181106119df57fe5b6020026020010151602001511115611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2390613ee6565b60405180910390fd5b81600081518110611a3957fe5b6020026020010151600f600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050507f0744eac43f2c274aeab710e028e1557486f24427dd812cb06edb74fe166e4dfc843384600081518110611ad857fe5b60200260200101516000015185600081518110611af157fe5b602002602001015160200151612710604051611b1195949392919061417c565b60405180910390a15b611b248385612486565b50505050565b611b338261176a565b611b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6990614026565b60405180910390fd5b611b7c82826124a7565b5050565b8060069080519060200190611b96929190612c25565b5050565b8060079080519060200190611bb0929190612c25565b5050565b611bc46301ffc9a760e01b611c32565b565b611bd66380ac58cd60e01b611c32565b565b611be8635b5e139f60e01b611c32565b565b611bfa63780e9d6360e01b611c32565b565b611c0c63e8a3d48560e01b611c32565b565b611c1e636f4eaff160e01b611c32565b565b611c30632a55205a60e01b611c32565b565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9290613ea6565b60405180910390fd5b6001806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e90613e86565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e408484846118c2565b611e4c848484846124d3565b611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290613e66565b60405180910390fd5b50505050565b6060611feb600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f3d5780601f10611f1257610100808354040283529160200191611f3d565b820191906000526020600020905b815481529060010190602001808311611f2057829003601f168201915b505050505060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fd85780601f10611fad57610100808354040283529160200191611fd8565b820191906000526020600020905b815481529060010190602001808311611fbb57829003601f168201915b50505050506126cd90919063ffffffff16565b9050919050565b8273ffffffffffffffffffffffffffffffffffffffff1661201282610c33565b73ffffffffffffffffffffffffffffffffffffffff1614612068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205f90614066565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90613f06565b60405180910390fd5b6120e181612810565b612128600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128ce565b61216f600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128f1565b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006122796001600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061290790919063ffffffff16565b90506000600a6000848152602001908152602001600020549050818114612366576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106122e657fe5b9060005260206000200154905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061233e57fe5b906000526020600020018190555081600a600083815260200190815260200160002081905550505b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036123b89190612ca5565b5050505050565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050600a600083815260200190815260200160002081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b6124908282612951565b61249a82826123bf565b6124a381612b03565b5050565b806008600084815260200190815260200160002090805190602001906124ce929190612c25565b505050565b60006124f48473ffffffffffffffffffffffffffffffffffffffff16612b4f565b61250157600190506126c5565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b6125456117dc565b89888860405160240161255b9493929190613d72565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516125c59190613d2b565b6000604051808303816000865af19150503d8060008114612602576040519150601f19603f3d011682016040523d82523d6000602084013e612607565b606091505b50915091508161265f576000815111156126245780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265690613e66565b60405180910390fd5b6000818060200190516126759190810190613125565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6060808390506060839050606081518351016040519080825280601f01601f1916602001820160405280156127115781602001600182028038833980820191505090505b509050600080905060008090505b845181101561278d5784818151811061273457fe5b602001015160f81c60f81b83838060010194508151811061275157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061271f565b5060008090505b8351811015612802578381815181106127a957fe5b602001015160f81c60f81b8383806001019450815181106127c657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612794565b508194505050505092915050565b600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128cb5760006003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6128e66001826000015461290790919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b600061294983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612b9a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890613fe6565b60405180910390fd5b6129ca8161176a565b15612a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0190613ec6565b60405180910390fd5b816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612aa3600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206128f1565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f9150808214158015612b9157506000801b8214155b92505050919050565b6000838311158290612be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd99190613e24565b60405180910390fd5b5060008385039050809150509392505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c6657805160ff1916838001178555612c94565b82800160010185558215612c94579182015b82811115612c93578251825591602001919060010190612c78565b5b509050612ca19190612cd1565b5090565b815481835581811115612ccc57818360005260206000209182019101612ccb9190612cd1565b5b505050565b612cf391905b80821115612cef576000816000905550600101612cd7565b5090565b90565b600081359050612d0581614414565b92915050565b600082601f830112612d1c57600080fd5b8135612d2f612d2a8261422c565b6141ff565b91508181835260208401935060208101905083856040840282011115612d5457600080fd5b60005b83811015612d845781612d6a8882612e75565b845260208401935060408301925050600181019050612d57565b5050505092915050565b600081359050612d9d8161442b565b92915050565b600081359050612db281614442565b92915050565b600081519050612dc781614442565b92915050565b600082601f830112612dde57600080fd5b8135612df1612dec82614254565b6141ff565b91508082526020830160208301858383011115612e0d57600080fd5b612e188382846143c1565b50505092915050565b600082601f830112612e3257600080fd5b8135612e45612e4082614280565b6141ff565b91508082526020830160208301858383011115612e6157600080fd5b612e6c8382846143c1565b50505092915050565b600060408284031215612e8757600080fd5b612e9160406141ff565b90506000612ea184828501612cf6565b6000830152506020612eb584828501612ec1565b60208301525092915050565b600081359050612ed081614459565b92915050565b600060208284031215612ee857600080fd5b6000612ef684828501612cf6565b91505092915050565b60008060408385031215612f1257600080fd5b6000612f2085828601612cf6565b9250506020612f3185828601612cf6565b9150509250929050565b600080600060608486031215612f5057600080fd5b6000612f5e86828701612cf6565b9350506020612f6f86828701612cf6565b9250506040612f8086828701612ec1565b9150509250925092565b60008060008060808587031215612fa057600080fd5b6000612fae87828801612cf6565b9450506020612fbf87828801612cf6565b9350506040612fd087828801612ec1565b925050606085013567ffffffffffffffff811115612fed57600080fd5b612ff987828801612dcd565b91505092959194509250565b6000806040838503121561301857600080fd5b600061302685828601612cf6565b925050602061303785828601612d8e565b9150509250929050565b60008060006060848603121561305657600080fd5b600061306486828701612cf6565b935050602084013567ffffffffffffffff81111561308157600080fd5b61308d86828701612e21565b925050604084013567ffffffffffffffff8111156130aa57600080fd5b6130b686828701612d0b565b9150509250925092565b600080604083850312156130d357600080fd5b60006130e185828601612cf6565b92505060206130f285828601612ec1565b9150509250929050565b60006020828403121561310e57600080fd5b600061311c84828501612da3565b91505092915050565b60006020828403121561313757600080fd5b600061314584828501612db8565b91505092915050565b60006020828403121561316057600080fd5b600082013567ffffffffffffffff81111561317a57600080fd5b61318684828501612e21565b91505092915050565b600080600080600060a086880312156131a757600080fd5b600086013567ffffffffffffffff8111156131c157600080fd5b6131cd88828901612e21565b955050602086013567ffffffffffffffff8111156131ea57600080fd5b6131f688828901612e21565b945050604061320788828901612cf6565b935050606086013567ffffffffffffffff81111561322457600080fd5b61323088828901612e21565b925050608086013567ffffffffffffffff81111561324d57600080fd5b61325988828901612e21565b9150509295509295909350565b60006020828403121561327857600080fd5b600061328684828501612ec1565b91505092915050565b600080604083850312156132a257600080fd5b60006132b085828601612ec1565b92505060206132c185828601612ec1565b9150509250929050565b6132d48161438b565b82525050565b6132e381614317565b82525050565b6132f281614305565b82525050565b61330181614305565b82525050565b61331081614329565b82525050565b6000613321826142ac565b61332b81856142cd565b935061333b8185602086016143d0565b61334481614403565b840191505092915050565b600061335a826142ac565b61336481856142de565b93506133748185602086016143d0565b80840191505092915050565b600061338b826142c2565b61339581856142e9565b93506133a58185602086016143d0565b6133ae81614403565b840191505092915050565b60006133c4826142b7565b6133ce81856142e9565b93506133de8185602086016143d0565b6133e781614403565b840191505092915050565b60006133ff602b836142e9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006134656032836142e9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134cb6026836142e9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613531601c836142e9565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b6000613571601c836142e9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135b16031836142e9565b91507f455243373231426173653a20746865206665655261746520696e20636f70797260008301527f69676874206d757374206265203c3d20310000000000000000000000000000006020830152604082019050919050565b60006136176024836142e9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061367d6019836142e9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006136bd602c836142e9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006137236038836142e9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006137896013836142e9565b91507f616c726561647920696e697469616c697a6564000000000000000000000000006000830152602082019050919050565b60006137c9602a836142e9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f6029836142e9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006138956020836142e9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006138d5602c836142e9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061393b602c836142e9565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139a16020836142e9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006139e16029836142e9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a47602f836142e9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613aad6031836142e9565b91507f455243373231426173653a2074686520617574686f7220696e20636f7079726960008301527f6768742063616e2774206265207a65726f0000000000000000000000000000006020830152604082019050919050565b6000613b136021836142e9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b796031836142e9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613bdf602c836142e9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613c456011836142fa565b91507f4d494e545f574954485f414444524553530000000000000000000000000000006000830152601182019050919050565b6000613c856031836142e9565b91507f455243373231426173653a20746865206c656e677468206f6620636f7079726960008301527f67687473206d757374206265203c3d20310000000000000000000000000000006020830152604082019050919050565b604082016000820151613cf460008501826132e9565b506020820151613d076020850182613d0d565b50505050565b613d1681614381565b82525050565b613d2581614381565b82525050565b6000613d37828461334f565b915081905092915050565b6000613d4d82613c38565b9150819050919050565b6000602082019050613d6c60008301846132f8565b92915050565b6000608082019050613d8760008301876132da565b613d9460208301866132f8565b613da16040830185613d1c565b8181036060830152613db38184613316565b905095945050505050565b6000604082019050613dd360008301856132f8565b613de06020830184613d1c565b9392505050565b6000602082019050613dfc6000830184613307565b92915050565b60006020820190508181036000830152613e1c81846133b9565b905092915050565b60006020820190508181036000830152613e3e8184613380565b905092915050565b60006020820190508181036000830152613e5f816133f2565b9050919050565b60006020820190508181036000830152613e7f81613458565b9050919050565b60006020820190508181036000830152613e9f816134be565b9050919050565b60006020820190508181036000830152613ebf81613524565b9050919050565b60006020820190508181036000830152613edf81613564565b9050919050565b60006020820190508181036000830152613eff816135a4565b9050919050565b60006020820190508181036000830152613f1f8161360a565b9050919050565b60006020820190508181036000830152613f3f81613670565b9050919050565b60006020820190508181036000830152613f5f816136b0565b9050919050565b60006020820190508181036000830152613f7f81613716565b9050919050565b60006020820190508181036000830152613f9f8161377c565b9050919050565b60006020820190508181036000830152613fbf816137bc565b9050919050565b60006020820190508181036000830152613fdf81613822565b9050919050565b60006020820190508181036000830152613fff81613888565b9050919050565b6000602082019050818103600083015261401f816138c8565b9050919050565b6000602082019050818103600083015261403f8161392e565b9050919050565b6000602082019050818103600083015261405f81613994565b9050919050565b6000602082019050818103600083015261407f816139d4565b9050919050565b6000602082019050818103600083015261409f81613a3a565b9050919050565b600060208201905081810360008301526140bf81613aa0565b9050919050565b600060208201905081810360008301526140df81613b06565b9050919050565b600060208201905081810360008301526140ff81613b6c565b9050919050565b6000602082019050818103600083015261411f81613bd2565b9050919050565b6000602082019050818103600083015261413f81613c78565b9050919050565b600060408201905061415b6000830184613cde565b92915050565b60006020820190506141766000830184613d1c565b92915050565b600060a0820190506141916000830188613d1c565b61419e60208301876132cb565b6141ab60408301866132f8565b6141b86060830185613d1c565b6141c56080830184613d1c565b9695505050505050565b60006040820190506141e46000830185613d1c565b81810360208301526141f68184613380565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561422257600080fd5b8060405250919050565b600067ffffffffffffffff82111561424357600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561426b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561429757600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061431082614361565b9050919050565b600061432282614361565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143968261439d565b9050919050565b60006143a8826143af565b9050919050565b60006143ba82614361565b9050919050565b82818337600083830152505050565b60005b838110156143ee5780820151818401526020810190506143d3565b838111156143fd576000848401525b50505050565b6000601f19601f8301169050919050565b61441d81614305565b811461442857600080fd5b50565b61443481614329565b811461443f57600080fd5b50565b61444b81614335565b811461445657600080fd5b50565b61446281614381565b811461446d57600080fd5b5056fea365627a7a72315820d06d4735efc2a1d750da8f83a4efd3640d6e2b1eed3964e3045d63596d58c0bc6c6578706572696d656e74616cf564736f6c63430005110040

Deployed Bytecode Sourcemap

54986:1950:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54986:1950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19298:135;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51247:18;;;:::i;:::-;;;;;;;;;;;;;;;;24184:204;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23466:425;;;;;;;;;;;;;;;;:::i;:::-;;38415:96;;;:::i;:::-;;;;;;;;;;;;;;;;25867:292;;;;;;;;;;;;;;;;:::i;:::-;;52225:302;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;38024:232;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;26821:134;;;;;;;;;;;;;;;;:::i;:::-;;56812:113;;;;;;;;;;;;;;;;:::i;:::-;;38857:199;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22807:228;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;53484:124;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22370:211;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2871:140;;;:::i;:::-;;56064:445;;;;;;;;;;;;;;;;:::i;:::-;;51348:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2060:79;;;:::i;:::-;;;;;;;;;;;;;;;;2426:94;;;:::i;:::-;;;;;;;;;;;;;;;;56652:115;;;;;;;;;;;;;;;;:::i;:::-;;51295:20;;;:::i;:::-;;;;;;;;;;;;;;;;56517:127;;;;;;;;;;;;;;;;:::i;:::-;;24689:254;;;;;;;;;;;;;;;;:::i;:::-;;55179:877;;;;;;;;;;;;;;;;:::i;:::-;;27692:272;;;;;;;;;;;;;;;;:::i;:::-;;48833:28;;;:::i;:::-;;;;;;;;;;;;;;;;53815:210;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;56775:28;;;:::i;:::-;;;;;;;;;;;;;;;;48188:25;;;:::i;:::-;;;;;;;;;;;;;;;;25273:147;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;50249:47;;;:::i;:::-;;;;;;;;;;;;;;;;3166:109;;;;;;;;;;;;;;;;:::i;:::-;;19298:135;19368:4;19392:20;:33;19413:11;19392:33;;;;;;;;;;;;;;;;;;;;;;;;;;;19385:40;;19298:135;;;:::o;51247:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24184:204::-;24243:7;24271:16;24279:7;24271;:16::i;:::-;24263:73;;;;;;;;;;;;;;;;;;;;;;24356:15;:24;24372:7;24356:24;;;;;;;;;;;;;;;;;;;;;24349:31;;24184:204;;;:::o;23466:425::-;23530:13;23546:16;23554:7;23546;:16::i;:::-;23530:32;;23587:5;23581:11;;:2;:11;;;;23573:57;;;;;;;;;;;;;;;;;;;;;;23667:5;23651:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23676:37;23693:5;23700:12;:10;:12::i;:::-;23676:16;:37::i;:::-;23651:62;23643:154;;;;;;;;;;;;;;;;;;;;;;23837:2;23810:15;:24;23826:7;23810:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23875:7;23871:2;23855:28;;23864:5;23855:28;;;;;;;;;;;;23466:425;;;:::o;38415:96::-;38459:7;38486:10;:17;;;;38479:24;;38415:96;:::o;25867:292::-;26011:41;26030:12;:10;:12::i;:::-;26044:7;26011:18;:41::i;:::-;26003:103;;;;;;;;;;;;;;;;;;;;;;26119:32;26133:4;26139:2;26143:7;26119:13;:32::i;:::-;25867:292;;;:::o;52225:302::-;52320:16;52338:21;52373:22;52451:5;52411:10;:19;52422:7;52411:19;;;;;;;;;;;:36;;;52399:9;:48;52398:58;;;;;;52373:83;;52478:10;:19;52489:7;52478:19;;;;;;;;;;;:26;;;;;;;;;;;;52505:13;52469:50;;;;;52225:302;;;;;:::o;38024:232::-;38104:7;38140:16;38150:5;38140:9;:16::i;:::-;38132:5;:24;38124:80;;;;;;;;;;;;;;;;;;;;;;38222:12;:19;38235:5;38222:19;;;;;;;;;;;;;;;38242:5;38222:26;;;;;;;;;;;;;;;;38215:33;;38024:232;;;;:::o;26821:134::-;26908:39;26925:4;26931:2;26935:7;26908:39;;;;;;;;;;;;:16;:39::i;:::-;26821:134;;;:::o;56812:113::-;2272:9;:7;:9::i;:::-;2264:54;;;;;;;;;;;;;;;;;;;;;;56904:13;56888;;:29;;;;;;;;;;;;;;;;;;56812:113;:::o;38857:199::-;38915:7;38951:13;:11;:13::i;:::-;38943:5;:21;38935:78;;;;;;;;;;;;;;;;;;;;;;39031:10;39042:5;39031:17;;;;;;;;;;;;;;;;39024:24;;38857:199;;;:::o;22807:228::-;22862:7;22882:13;22898:11;:20;22910:7;22898:20;;;;;;;;;;;;;;;;;;;;;22882:36;;22954:1;22937:19;;:5;:19;;;;22929:73;;;;;;;;;;;;;;;;;;;;;;23022:5;23015:12;;;22807:228;;;:::o;53484:124::-;53545:16;;:::i;:::-;53580:10;:20;53591:8;53580:20;;;;;;;;;;;53573:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53484:124;;;:::o;22370:211::-;22425:7;22470:1;22453:19;;:5;:19;;;;22445:74;;;;;;;;;;;;;;;;;;;;;;22539:34;:17;:24;22557:5;22539:24;;;;;;;;;;;;;;;:32;:34::i;:::-;22532:41;;22370:211;;;:::o;2871:140::-;2272:9;:7;:9::i;:::-;2264:54;;;;;;;;;;;;;;;;;;;;;;2970:1;2933:40;;2954:6;;;;;;;;;;;2933:40;;;;;;;;;;;;3001:1;2984:6;;:19;;;;;;;;;;;;;;;;;;2871:140::o;56064:445::-;56223:22;56248:14;;56223:39;;56273:14;;:16;;;;;;;;;;;;;56320:49;56326:14;56342:9;56353:15;56320:5;:49::i;:::-;56408:39;56421:14;56437:9;56408:12;:39::i;:::-;56463:38;56475:14;56491:9;56463:38;;;;;;;;;;;;;;;;56064:445;;;;:::o;51348:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2060:79::-;2098:7;2125:6;;;;;;;;;;;2118:13;;2060:79;:::o;2426:94::-;2466:4;2506:6;;;;;;;;;;;2490:22;;:12;:10;:12::i;:::-;:22;;;2483:29;;2426:94;:::o;56652:115::-;2272:9;:7;:9::i;:::-;2264:54;;;;;;;;;;;;;;;;;;;;;;56731:28;56747:11;56731:15;:28::i;:::-;56652:115;:::o;51295:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56517:127::-;2272:9;:7;:9::i;:::-;2264:54;;;;;;;;;;;;;;;;;;;;;;56602:34;56621:14;56602:18;:34::i;:::-;56517:127;:::o;24689:254::-;24775:12;:10;:12::i;:::-;24769:18;;:2;:18;;;;24761:56;;;;;;;;;;;;;;;;;;;;;;24869:8;24830:18;:32;24849:12;:10;:12::i;:::-;24830:32;;;;;;;;;;;;;;;:36;24863:2;24830:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;24922:2;24893:42;;24908:12;:10;:12::i;:::-;24893:42;;;24926:8;24893:42;;;;;;;;;;;;;;;24689:254;;:::o;55179:877::-;55404:12;;;;;;;;;;;55403:13;55395:45;;;;;;;;;;;;;;;;;;;;;;55460:5;55453:4;:12;;;;;;;;;;;;:::i;:::-;;55485:7;55476:6;:16;;;;;;;;;;;;:::i;:::-;;55517:12;55503:11;:26;;;;;;;;;;;;:::i;:::-;;55557:15;55540:14;:32;;;;;;;;;;;;:::i;:::-;;55583:33;:31;:33::i;:::-;55627;:31;:33::i;:::-;55671:41;:39;:41::i;:::-;55723:43;:41;:43::i;:::-;55777:38;:36;:38::i;:::-;55826:36;:34;:36::i;:::-;55873:34;:32;:34::i;:::-;55918:58;55944:30;;;;;;;;;;;;;;55918:18;:58::i;:::-;55989:29;56008:9;55989:18;:29::i;:::-;56044:4;56029:12;;:19;;;;;;;;;;;;;;;;;;55179:877;;;;;:::o;27692:272::-;27807:41;27826:12;:10;:12::i;:::-;27840:7;27807:18;:41::i;:::-;27799:103;;;;;;;;;;;;;;;;;;;;;;27913:43;27931:4;27937:2;27941:7;27950:5;27913:17;:43::i;:::-;27692:272;;;;:::o;48833:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53815:210::-;53873:13;53907:16;53915:7;53907;:16::i;:::-;53899:76;;;;;;;;;;;;;;;;;;;;;;53993:24;54009:7;53993:15;:24::i;:::-;53986:31;;53815:210;;;:::o;56775:28::-;;;;;;;;;;;;;:::o;48188:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25273:147::-;25353:4;25377:18;:25;25396:5;25377:25;;;;;;;;;;;;;;;:35;25403:8;25377:35;;;;;;;;;;;;;;;;;;;;;;;;;25370:42;;25273:147;;;;:::o;50249:47::-;50291:5;50249:47;:::o;3166:109::-;2272:9;:7;:9::i;:::-;2264:54;;;;;;;;;;;;;;;;;;;;;;3239:28;3258:8;3239:18;:28::i;:::-;3166:109;:::o;29157:155::-;29214:4;29231:13;29247:11;:20;29259:7;29247:20;;;;;;;;;;;;;;;;;;;;;29231:36;;29302:1;29285:19;;:5;:19;;;;29278:26;;;29157:155;;;:::o;842:98::-;887:15;922:10;915:17;;842:98;:::o;29682:333::-;29767:4;29792:16;29800:7;29792;:16::i;:::-;29784:73;;;;;;;;;;;;;;;;;;;;;;29868:13;29884:16;29892:7;29884;:16::i;:::-;29868:32;;29930:5;29919:16;;:7;:16;;;:51;;;;29963:7;29939:31;;:20;29951:7;29939:11;:20::i;:::-;:31;;;29919:51;:87;;;;29974:32;29991:5;29998:7;29974:16;:32::i;:::-;29919:87;29911:96;;;29682:333;;;;:::o;39440:245::-;39526:38;39546:4;39552:2;39556:7;39526:19;:38::i;:::-;39577:47;39610:4;39616:7;39577:32;:47::i;:::-;39637:40;39665:2;39669:7;39637:27;:40::i;:::-;39440:245;;;:::o;17949:114::-;18014:7;18041;:14;;;18034:21;;17949:114;;;:::o;52539:937::-;52678:20;52701:15;:22;52678:45;;52808:1;52792:12;:17;;52784:92;;;;;;;;;;;;;;;;;;;;;;52907:1;52891:12;:17;52887:543;;;52970:1;52933:39;;:15;52949:1;52933:18;;;;;;;;;;;;;;:25;;;:39;;;;52925:132;;;;;;;;;;;;;;;;;;;;;;50291:5;53080:15;53096:1;53080:18;;;;;;;;;;;;;;:35;;;:57;;53072:150;;;;;;;;;;;;;;;;;;;;;;53262:15;53278:1;53262:18;;;;;;;;;;;;;;53239:10;:20;53250:8;53239:20;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53300:118;53313:8;53323:10;53335:15;53351:1;53335:18;;;;;;;;;;;;;;:25;;;53362:15;53378:1;53362:18;;;;;;;;;;;;;;:35;;;50291:5;53300:118;;;;;;;;;;;;;;;;;;;52887:543;53442:26;53448:9;53459:8;53442:5;:26::i;:::-;52539:937;;;;:::o;54272:202::-;54358:16;54366:7;54358;:16::i;:::-;54350:73;;;;;;;;;;;;;;;;;;;;;;54434:32;54453:7;54462:3;54434:18;:32::i;:::-;54272:202;;:::o;48627:107::-;48714:12;48700:11;:26;;;;;;;;;;;;:::i;:::-;;48627:107;:::o;49808:119::-;49904:15;49887:14;:32;;;;;;;;;;;;:::i;:::-;;49808:119;:::o;18892:249::-;19093:40;18722:10;19112:20;;19093:18;:40::i;:::-;18892:249::o;21970:189::-;22111:40;21951:10;22130:20;;22111:18;:40::i;:::-;21970:189::o;52011:206::-;52160:49;51726:10;52179:29;;52160:18;:49::i;:::-;52011:206::o;37423:219::-;37583:51;37404:10;37602:31;;37583:18;:51::i;:::-;37423:219::o;48368:122::-;48436:46;48349:10;48455:26;;48436:18;:46::i;:::-;48368:122::o;50592:117::-;50658:43;50573:10;50677:23;;50658:18;:43::i;:::-;50592:117::o;51810:191::-;51952:41;51791:10;51971:21;;51952:18;:41::i;:::-;51810:191::o;19840:193::-;19931:10;19916:25;;:11;:25;;;;;19908:66;;;;;;;;;;;;;;;;;;;;;;20021:4;19985:20;:33;20006:11;19985:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;19840:193;:::o;3381:229::-;3475:1;3455:22;;:8;:22;;;;3447:73;;;;;;;;;;;;;;;;;;;;;;3565:8;3536:38;;3557:6;;;;;;;;;;;3536:38;;;;;;;;;;;;3594:8;3585:6;;:17;;;;;;;;;;;;;;;;;;3381:229;:::o;28683:272::-;28793:32;28807:4;28813:2;28817:7;28793:13;:32::i;:::-;28844:48;28867:4;28873:2;28877:7;28886:5;28844:22;:48::i;:::-;28836:111;;;;;;;;;;;;;;;;;;;;;;28683:272;;;;:::o;49163:142::-;49222:13;49255:42;49277:10;:19;49288:7;49277:19;;;;;;;;;;;49255:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;49248:49;;49163:142;;;:::o;33378:459::-;33492:4;33472:24;;:16;33480:7;33472;:16::i;:::-;:24;;;33464:78;;;;;;;;;;;;;;;;;;;;;;33575:1;33561:16;;:2;:16;;;;33553:65;;;;;;;;;;;;;;;;;;;;;;33631:23;33646:7;33631:14;:23::i;:::-;33667:35;:17;:23;33685:4;33667:23;;;;;;;;;;;;;;;:33;:35::i;:::-;33713:33;:17;:21;33731:2;33713:21;;;;;;;;;;;;;;;:31;:33::i;:::-;33782:2;33759:11;:20;33771:7;33759:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;33821:7;33817:2;33802:27;;33811:4;33802:27;;;;;;;;;;;;33378:459;;;:::o;42625:1174::-;42891:22;42916:32;42946:1;42916:12;:18;42929:4;42916:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;42891:57;;42959:18;42980:17;:26;42998:7;42980:26;;;;;;;;;;;;42959:47;;43127:14;43113:10;:28;43109:354;;43158:19;43180:12;:18;43193:4;43180:18;;;;;;;;;;;;;;;43199:14;43180:34;;;;;;;;;;;;;;;;43158:56;;43264:11;43231:12;:18;43244:4;43231:18;;;;;;;;;;;;;;;43250:10;43231:30;;;;;;;;;;;;;;;:44;;;;43394:10;43361:17;:30;43379:11;43361:30;;;;;;;;;;;:43;;;;43109:354;;43552:12;:18;43565:4;43552:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;42625:1174;;;;:::o;41447:186::-;41561:12;:16;41574:2;41561:16;;;;;;;;;;;;;;;:23;;;;41532:17;:26;41550:7;41532:26;;;;;;;;;;;:52;;;;41595:12;:16;41608:2;41595:16;;;;;;;;;;;;;;;41617:7;41595:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;41595:30:0;;;;;;;;;;;;;;;;;;;;;;41447:186;;:::o;39950:202::-;40014:24;40026:2;40030:7;40014:11;:24::i;:::-;40051:40;40079:2;40083:7;40051:27;:40::i;:::-;40104;40136:7;40104:31;:40::i;:::-;39950:202;;:::o;49552:111::-;49652:3;49630:10;:19;49641:7;49630:19;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;49552:111;;:::o;34489:1099::-;34607:4;34634:15;:2;:13;;;:15::i;:::-;34629:60;;34673:4;34666:11;;;;34629:60;34760:12;34774:23;34801:2;:7;;34866:2;34850:36;;;:45;;;;34914:12;:10;:12::i;:::-;34945:4;34968:7;34994:5;34809:205;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;34809:205:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;34809:205:0;34801:214;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;34759:256:0;;;;35031:7;35026:555;;35079:1;35059:10;:17;:21;35055:384;;;35227:10;35221:17;35288:15;35275:10;35271:2;35267:19;35260:44;35175:148;35363:60;;;;;;;;;;;;;;;;;;;35026:555;35471:13;35498:10;35487:32;;;;;;;;;;;;;;35471:48;;20546:10;35552:16;;35542:26;;;:6;:26;;;;35534:35;;;;;34489:1099;;;;;;;:::o;45773:422::-;45848:13;45874:16;45899:2;45874:28;;45913:16;45938:2;45913:28;;45952:16;45994:3;:10;45981:3;:10;:23;45971:34;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;45971:34:0;;;;45952:53;;46016:6;46025:1;46016:10;;46042:6;46051:1;46042:10;;46037:55;46058:3;:10;46054:1;:14;46037:55;;;46086:3;46090:1;46086:6;;;;;;;;;;;;;;;;46075:3;46079;;;;;;46075:8;;;;;;;;;;;:17;;;;;;;;;;;46070:3;;;;;;;46037:55;;;;46108:6;46117:1;46108:10;;46103:55;46124:3;:10;46120:1;:14;46103:55;;;46152:3;46156:1;46152:6;;;;;;;;;;;;;;;;46141:3;46145;;;;;;46141:8;;;;;;;;;;;:17;;;;;;;;;;;46136:3;;;;;;;46103:55;;;;46183:3;46169:18;;;;;;45773:422;;;;:::o;35756:175::-;35856:1;35820:38;;:15;:24;35836:7;35820:24;;;;;;;;;;;;;;;;;;;;;:38;;;35816:108;;35910:1;35875:15;:24;35891:7;35875:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;35816:108;35756:175;:::o;18260:110::-;18341:21;18360:1;18341:7;:14;;;:18;;:21;;;;:::i;:::-;18324:7;:14;;:38;;;;18260:110;:::o;18071:181::-;18243:1;18225:7;:14;;;:19;;;;;;;;;;;18071:181;:::o;9783:136::-;9841:7;9868:43;9872:1;9875;9868:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9861:50;;9783:136;;;;:::o;31767:335::-;31853:1;31839:16;;:2;:16;;;;31831:61;;;;;;;;;;;;;;;;;;;;;;31912:16;31920:7;31912;:16::i;:::-;31911:17;31903:58;;;;;;;;;;;;;;;;;;;;;;31997:2;31974:11;:20;31986:7;31974:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;32010:33;:17;:21;32028:2;32010:21;;;;;;;;;;;;;;;:31;:33::i;:::-;32086:7;32082:2;32061:33;;32078:1;32061:33;;;;;;;;;;;;31767:335;;:::o;41834:164::-;41938:10;:17;;;;41911:15;:24;41927:7;41911:24;;;;;;;;;;;:44;;;;41966:10;41982:7;41966:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;41966:24:0;;;;;;;;;;;;;;;;;;;;;;41834:164;:::o;14605:617::-;14665:4;14927:16;14954:19;14976:66;14954:88;;;;15144:7;15132:20;15120:32;;15183:11;15171:8;:23;;:42;;;;;15210:3;15198:15;;:8;:15;;15171:42;15163:51;;;;14605:617;;;:::o;10256:192::-;10342:7;10375:1;10370;:6;;10378:12;10362:29;;;;;;;;;;;;;;;;;;;;;;;;;10402:9;10418:1;10414;:5;10402:17;;10439:1;10432:8;;;10256:192;;;;;:::o;54986:1950::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;190:776;;330:3;323:4;315:6;311:17;307:27;297:2;;348:1;345;338:12;297:2;385:6;372:20;407:103;422:87;502:6;422:87;;;407:103;;;398:112;;527:5;552:6;545:5;538:21;582:4;574:6;570:17;560:27;;604:4;599:3;595:14;588:21;;657:6;704:3;696:4;688:6;684:17;679:3;675:27;672:36;669:2;;;721:1;718;711:12;669:2;746:1;731:229;756:6;753:1;750:13;731:229;;;814:3;836:60;892:3;880:10;836:60;;;831:3;824:73;920:4;915:3;911:14;904:21;;948:4;943:3;939:14;932:21;;788:172;778:1;775;771:9;766:14;;731:229;;;735:14;290:676;;;;;;;;974:124;;1051:6;1038:20;1029:29;;1063:30;1087:5;1063:30;;;1023:75;;;;;1105:128;;1184:6;1171:20;1162:29;;1196:32;1222:5;1196:32;;;1156:77;;;;;1240:132;;1323:6;1317:13;1308:22;;1335:32;1361:5;1335:32;;;1302:70;;;;;1380:440;;1481:3;1474:4;1466:6;1462:17;1458:27;1448:2;;1499:1;1496;1489:12;1448:2;1536:6;1523:20;1558:64;1573:48;1614:6;1573:48;;;1558:64;;;1549:73;;1642:6;1635:5;1628:21;1678:4;1670:6;1666:17;1711:4;1704:5;1700:16;1746:3;1737:6;1732:3;1728:16;1725:25;1722:2;;;1763:1;1760;1753:12;1722:2;1773:41;1807:6;1802:3;1797;1773:41;;;1441:379;;;;;;;;1829:442;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1986:6;1973:20;2008:65;2023:49;2065:6;2023:49;;;2008:65;;;1999:74;;2093:6;2086:5;2079:21;2129:4;2121:6;2117:17;2162:4;2155:5;2151:16;2197:3;2188:6;2183:3;2179:16;2176:25;2173:2;;;2214:1;2211;2204:12;2173:2;2224:41;2258:6;2253:3;2248;2224:41;;;1891:380;;;;;;;;2323:479;;2435:4;2423:9;2418:3;2414:19;2410:30;2407:2;;;2453:1;2450;2443:12;2407:2;2471:20;2486:4;2471:20;;;2462:29;;2543:1;2575:49;2620:3;2611:6;2600:9;2596:22;2575:49;;;2568:4;2561:5;2557:16;2550:75;2501:135;2698:2;2731:49;2776:3;2767:6;2756:9;2752:22;2731:49;;;2724:4;2717:5;2713:16;2706:75;2646:146;2401:401;;;;;2809:130;;2889:6;2876:20;2867:29;;2901:33;2928:5;2901:33;;;2861:78;;;;;2946:241;;3050:2;3038:9;3029:7;3025:23;3021:32;3018:2;;;3066:1;3063;3056:12;3018:2;3101:1;3118:53;3163:7;3154:6;3143:9;3139:22;3118:53;;;3108:63;;3080:97;3012:175;;;;;3194:366;;;3315:2;3303:9;3294:7;3290:23;3286:32;3283:2;;;3331:1;3328;3321:12;3283:2;3366:1;3383:53;3428:7;3419:6;3408:9;3404:22;3383:53;;;3373:63;;3345:97;3473:2;3491:53;3536:7;3527:6;3516:9;3512:22;3491:53;;;3481:63;;3452:98;3277:283;;;;;;3567:491;;;;3705:2;3693:9;3684:7;3680:23;3676:32;3673:2;;;3721:1;3718;3711:12;3673:2;3756:1;3773:53;3818:7;3809:6;3798:9;3794:22;3773:53;;;3763:63;;3735:97;3863:2;3881:53;3926:7;3917:6;3906:9;3902:22;3881:53;;;3871:63;;3842:98;3971:2;3989:53;4034:7;4025:6;4014:9;4010:22;3989:53;;;3979:63;;3950:98;3667:391;;;;;;4065:721;;;;;4229:3;4217:9;4208:7;4204:23;4200:33;4197:2;;;4246:1;4243;4236:12;4197:2;4281:1;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;;;4288:63;;4260:97;4388:2;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;;;4396:63;;4367:98;4496:2;4514:53;4559:7;4550:6;4539:9;4535:22;4514:53;;;4504:63;;4475:98;4632:2;4621:9;4617:18;4604:32;4656:18;4648:6;4645:30;4642:2;;;4688:1;4685;4678:12;4642:2;4708:62;4762:7;4753:6;4742:9;4738:22;4708:62;;;4698:72;;4583:193;4191:595;;;;;;;;4793:360;;;4911:2;4899:9;4890:7;4886:23;4882:32;4879:2;;;4927:1;4924;4917:12;4879:2;4962:1;4979:53;5024:7;5015:6;5004:9;5000:22;4979:53;;;4969:63;;4941:97;5069:2;5087:50;5129:7;5120:6;5109:9;5105:22;5087:50;;;5077:60;;5048:95;4873:280;;;;;;5160:779;;;;5356:2;5344:9;5335:7;5331:23;5327:32;5324:2;;;5372:1;5369;5362:12;5324:2;5407:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;;;5414:63;;5386:97;5542:2;5531:9;5527:18;5514:32;5566:18;5558:6;5555:30;5552:2;;;5598:1;5595;5588:12;5552:2;5618:63;5673:7;5664:6;5653:9;5649:22;5618:63;;;5608:73;;5493:194;5746:2;5735:9;5731:18;5718:32;5770:18;5762:6;5759:30;5756:2;;;5802:1;5799;5792:12;5756:2;5822:101;5915:7;5906:6;5895:9;5891:22;5822:101;;;5812:111;;5697:232;5318:621;;;;;;5946:366;;;6067:2;6055:9;6046:7;6042:23;6038:32;6035:2;;;6083:1;6080;6073:12;6035:2;6118:1;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;;;6125:63;;6097:97;6225:2;6243:53;6288:7;6279:6;6268:9;6264:22;6243:53;;;6233:63;;6204:98;6029:283;;;;;;6319:239;;6422:2;6410:9;6401:7;6397:23;6393:32;6390:2;;;6438:1;6435;6428:12;6390:2;6473:1;6490:52;6534:7;6525:6;6514:9;6510:22;6490:52;;;6480:62;;6452:96;6384:174;;;;;6565:261;;6679:2;6667:9;6658:7;6654:23;6650:32;6647:2;;;6695:1;6692;6685:12;6647:2;6730:1;6747:63;6802:7;6793:6;6782:9;6778:22;6747:63;;;6737:73;;6709:107;6641:185;;;;;6833:347;;6947:2;6935:9;6926:7;6922:23;6918:32;6915:2;;;6963:1;6960;6953:12;6915:2;7026:1;7015:9;7011:17;6998:31;7049:18;7041:6;7038:30;7035:2;;;7081:1;7078;7071:12;7035:2;7101:63;7156:7;7147:6;7136:9;7132:22;7101:63;;;7091:73;;6977:193;6909:271;;;;;7187:1167;;;;;;7399:3;7387:9;7378:7;7374:23;7370:33;7367:2;;;7416:1;7413;7406:12;7367:2;7479:1;7468:9;7464:17;7451:31;7502:18;7494:6;7491:30;7488:2;;;7534:1;7531;7524:12;7488:2;7554:63;7609:7;7600:6;7589:9;7585:22;7554:63;;;7544:73;;7430:193;7682:2;7671:9;7667:18;7654:32;7706:18;7698:6;7695:30;7692:2;;;7738:1;7735;7728:12;7692:2;7758:63;7813:7;7804:6;7793:9;7789:22;7758:63;;;7748:73;;7633:194;7858:2;7876:53;7921:7;7912:6;7901:9;7897:22;7876:53;;;7866:63;;7837:98;7994:2;7983:9;7979:18;7966:32;8018:18;8010:6;8007:30;8004:2;;;8050:1;8047;8040:12;8004:2;8070:63;8125:7;8116:6;8105:9;8101:22;8070:63;;;8060:73;;7945:194;8198:3;8187:9;8183:19;8170:33;8223:18;8215:6;8212:30;8209:2;;;8255:1;8252;8245:12;8209:2;8275:63;8330:7;8321:6;8310:9;8306:22;8275:63;;;8265:73;;8149:195;7361:993;;;;;;;;;8361:241;;8465:2;8453:9;8444:7;8440:23;8436:32;8433:2;;;8481:1;8478;8471:12;8433:2;8516:1;8533:53;8578:7;8569:6;8558:9;8554:22;8533:53;;;8523:63;;8495:97;8427:175;;;;;8609:366;;;8730:2;8718:9;8709:7;8705:23;8701:32;8698:2;;;8746:1;8743;8736:12;8698:2;8781:1;8798:53;8843:7;8834:6;8823:9;8819:22;8798:53;;;8788:63;;8760:97;8888:2;8906:53;8951:7;8942:6;8931:9;8927:22;8906:53;;;8896:63;;8867:98;8692:283;;;;;;8982:142;9073:45;9112:5;9073:45;;;9068:3;9061:58;9055:69;;;9131:137;9230:32;9256:5;9230:32;;;9225:3;9218:45;9212:56;;;9275:103;9348:24;9366:5;9348:24;;;9343:3;9336:37;9330:48;;;9385:113;9468:24;9486:5;9468:24;;;9463:3;9456:37;9450:48;;;9505:104;9582:21;9597:5;9582:21;;;9577:3;9570:34;9564:45;;;9616:343;;9726:38;9758:5;9726:38;;;9776:70;9839:6;9834:3;9776:70;;;9769:77;;9851:52;9896:6;9891:3;9884:4;9877:5;9873:16;9851:52;;;9924:29;9946:6;9924:29;;;9919:3;9915:39;9908:46;;9706:253;;;;;;9966:356;;10094:38;10126:5;10094:38;;;10144:88;10225:6;10220:3;10144:88;;;10137:95;;10237:52;10282:6;10277:3;10270:4;10263:5;10259:16;10237:52;;;10310:6;10305:3;10301:16;10294:23;;10074:248;;;;;;10329:347;;10441:39;10474:5;10441:39;;;10492:71;10556:6;10551:3;10492:71;;;10485:78;;10568:52;10613:6;10608:3;10601:4;10594:5;10590:16;10568:52;;;10641:29;10663:6;10641:29;;;10636:3;10632:39;10625:46;;10421:255;;;;;;10683:339;;10791:35;10820:5;10791:35;;;10838:71;10902:6;10897:3;10838:71;;;10831:78;;10914:52;10959:6;10954:3;10947:4;10940:5;10936:16;10914:52;;;10987:29;11009:6;10987:29;;;10982:3;10978:39;10971:46;;10771:251;;;;;;11030:380;;11190:67;11254:2;11249:3;11190:67;;;11183:74;;11290:34;11286:1;11281:3;11277:11;11270:55;11359:13;11354:2;11349:3;11345:12;11338:35;11401:2;11396:3;11392:12;11385:19;;11176:234;;;;11419:387;;11579:67;11643:2;11638:3;11579:67;;;11572:74;;11679:34;11675:1;11670:3;11666:11;11659:55;11748:20;11743:2;11738:3;11734:12;11727:42;11797:2;11792:3;11788:12;11781:19;;11565:241;;;;11815:375;;11975:67;12039:2;12034:3;11975:67;;;11968:74;;12075:34;12071:1;12066:3;12062:11;12055:55;12144:8;12139:2;12134:3;12130:12;12123:30;12181:2;12176:3;12172:12;12165:19;;11961:229;;;;12199:328;;12359:67;12423:2;12418:3;12359:67;;;12352:74;;12459:30;12455:1;12450:3;12446:11;12439:51;12518:2;12513:3;12509:12;12502:19;;12345:182;;;;12536:328;;12696:67;12760:2;12755:3;12696:67;;;12689:74;;12796:30;12792:1;12787:3;12783:11;12776:51;12855:2;12850:3;12846:12;12839:19;;12682:182;;;;12873:386;;13033:67;13097:2;13092:3;13033:67;;;13026:74;;13133:34;13129:1;13124:3;13120:11;13113:55;13202:19;13197:2;13192:3;13188:12;13181:41;13250:2;13245:3;13241:12;13234:19;;13019:240;;;;13268:373;;13428:67;13492:2;13487:3;13428:67;;;13421:74;;13528:34;13524:1;13519:3;13515:11;13508:55;13597:6;13592:2;13587:3;13583:12;13576:28;13632:2;13627:3;13623:12;13616:19;;13414:227;;;;13650:325;;13810:67;13874:2;13869:3;13810:67;;;13803:74;;13910:27;13906:1;13901:3;13897:11;13890:48;13966:2;13961:3;13957:12;13950:19;;13796:179;;;;13984:381;;14144:67;14208:2;14203:3;14144:67;;;14137:74;;14244:34;14240:1;14235:3;14231:11;14224:55;14313:14;14308:2;14303:3;14299:12;14292:36;14356:2;14351:3;14347:12;14340:19;;14130:235;;;;14374:393;;14534:67;14598:2;14593:3;14534:67;;;14527:74;;14634:34;14630:1;14625:3;14621:11;14614:55;14703:26;14698:2;14693:3;14689:12;14682:48;14758:2;14753:3;14749:12;14742:19;;14520:247;;;;14776:319;;14936:67;15000:2;14995:3;14936:67;;;14929:74;;15036:21;15032:1;15027:3;15023:11;15016:42;15086:2;15081:3;15077:12;15070:19;;14922:173;;;;15104:379;;15264:67;15328:2;15323:3;15264:67;;;15257:74;;15364:34;15360:1;15355:3;15351:11;15344:55;15433:12;15428:2;15423:3;15419:12;15412:34;15474:2;15469:3;15465:12;15458:19;;15250:233;;;;15492:378;;15652:67;15716:2;15711:3;15652:67;;;15645:74;;15752:34;15748:1;15743:3;15739:11;15732:55;15821:11;15816:2;15811:3;15807:12;15800:33;15861:2;15856:3;15852:12;15845:19;;15638:232;;;;15879:332;;16039:67;16103:2;16098:3;16039:67;;;16032:74;;16139:34;16135:1;16130:3;16126:11;16119:55;16202:2;16197:3;16193:12;16186:19;;16025:186;;;;16220:381;;16380:67;16444:2;16439:3;16380:67;;;16373:74;;16480:34;16476:1;16471:3;16467:11;16460:55;16549:14;16544:2;16539:3;16535:12;16528:36;16592:2;16587:3;16583:12;16576:19;;16366:235;;;;16610:381;;16770:67;16834:2;16829:3;16770:67;;;16763:74;;16870:34;16866:1;16861:3;16857:11;16850:55;16939:14;16934:2;16929:3;16925:12;16918:36;16982:2;16977:3;16973:12;16966:19;;16756:235;;;;17000:332;;17160:67;17224:2;17219:3;17160:67;;;17153:74;;17260:34;17256:1;17251:3;17247:11;17240:55;17323:2;17318:3;17314:12;17307:19;;17146:186;;;;17341:378;;17501:67;17565:2;17560:3;17501:67;;;17494:74;;17601:34;17597:1;17592:3;17588:11;17581:55;17670:11;17665:2;17660:3;17656:12;17649:33;17710:2;17705:3;17701:12;17694:19;;17487:232;;;;17728:384;;17888:67;17952:2;17947:3;17888:67;;;17881:74;;17988:34;17984:1;17979:3;17975:11;17968:55;18057:17;18052:2;18047:3;18043:12;18036:39;18103:2;18098:3;18094:12;18087:19;;17874:238;;;;18121:386;;18281:67;18345:2;18340:3;18281:67;;;18274:74;;18381:34;18377:1;18372:3;18368:11;18361:55;18450:19;18445:2;18440:3;18436:12;18429:41;18498:2;18493:3;18489:12;18482:19;;18267:240;;;;18516:370;;18676:67;18740:2;18735:3;18676:67;;;18669:74;;18776:34;18772:1;18767:3;18763:11;18756:55;18845:3;18840:2;18835:3;18831:12;18824:25;18877:2;18872:3;18868:12;18861:19;;18662:224;;;;18895:386;;19055:67;19119:2;19114:3;19055:67;;;19048:74;;19155:34;19151:1;19146:3;19142:11;19135:55;19224:19;19219:2;19214:3;19210:12;19203:41;19272:2;19267:3;19263:12;19256:19;;19041:240;;;;19290:381;;19450:67;19514:2;19509:3;19450:67;;;19443:74;;19550:34;19546:1;19541:3;19537:11;19530:55;19619:14;19614:2;19609:3;19605:12;19598:36;19662:2;19657:3;19653:12;19646:19;;19436:235;;;;19680:353;;19858:85;19940:2;19935:3;19858:85;;;19851:92;;19976:19;19972:1;19967:3;19963:11;19956:40;20024:2;20019:3;20015:12;20008:19;;19844:189;;;;20042:386;;20202:67;20266:2;20261:3;20202:67;;;20195:74;;20302:34;20298:1;20293:3;20289:11;20282:55;20371:19;20366:2;20361:3;20357:12;20350:41;20419:2;20414:3;20410:12;20403:19;;20188:240;;;;20521:494;20668:4;20663:3;20659:14;20753:4;20746:5;20742:16;20736:23;20765:63;20822:4;20817:3;20813:14;20799:12;20765:63;;;20688:146;20919:4;20912:5;20908:16;20902:23;20931:63;20988:4;20983:3;20979:14;20965:12;20931:63;;;20844:156;20641:374;;;;21022:103;21095:24;21113:5;21095:24;;;21090:3;21083:37;21077:48;;;21132:113;21215:24;21233:5;21215:24;;;21210:3;21203:37;21197:48;;;21252:262;;21396:93;21485:3;21476:6;21396:93;;;21389:100;;21506:3;21499:10;;21377:137;;;;;21521:372;;21720:148;21864:3;21720:148;;;21713:155;;21885:3;21878:10;;21701:192;;;;21900:213;;22018:2;22007:9;22003:18;21995:26;;22032:71;22100:1;22089:9;22085:17;22076:6;22032:71;;;21989:124;;;;;22120:663;;22356:3;22345:9;22341:19;22333:27;;22371:87;22455:1;22444:9;22440:17;22431:6;22371:87;;;22469:72;22537:2;22526:9;22522:18;22513:6;22469:72;;;22552;22620:2;22609:9;22605:18;22596:6;22552:72;;;22672:9;22666:4;22662:20;22657:2;22646:9;22642:18;22635:48;22697:76;22768:4;22759:6;22697:76;;;22689:84;;22327:456;;;;;;;;22790:324;;22936:2;22925:9;22921:18;22913:26;;22950:71;23018:1;23007:9;23003:17;22994:6;22950:71;;;23032:72;23100:2;23089:9;23085:18;23076:6;23032:72;;;22907:207;;;;;;23121:201;;23233:2;23222:9;23218:18;23210:26;;23247:65;23309:1;23298:9;23294:17;23285:6;23247:65;;;23204:118;;;;;23329:293;;23463:2;23452:9;23448:18;23440:26;;23513:9;23507:4;23503:20;23499:1;23488:9;23484:17;23477:47;23538:74;23607:4;23598:6;23538:74;;;23530:82;;23434:188;;;;;23629:301;;23767:2;23756:9;23752:18;23744:26;;23817:9;23811:4;23807:20;23803:1;23792:9;23788:17;23781:47;23842:78;23915:4;23906:6;23842:78;;;23834:86;;23738:192;;;;;23937:407;;24128:2;24117:9;24113:18;24105:26;;24178:9;24172:4;24168:20;24164:1;24153:9;24149:17;24142:47;24203:131;24329:4;24203:131;;;24195:139;;24099:245;;;;24351:407;;24542:2;24531:9;24527:18;24519:26;;24592:9;24586:4;24582:20;24578:1;24567:9;24563:17;24556:47;24617:131;24743:4;24617:131;;;24609:139;;24513:245;;;;24765:407;;24956:2;24945:9;24941:18;24933:26;;25006:9;25000:4;24996:20;24992:1;24981:9;24977:17;24970:47;25031:131;25157:4;25031:131;;;25023:139;;24927:245;;;;25179:407;;25370:2;25359:9;25355:18;25347:26;;25420:9;25414:4;25410:20;25406:1;25395:9;25391:17;25384:47;25445:131;25571:4;25445:131;;;25437:139;;25341:245;;;;25593:407;;25784:2;25773:9;25769:18;25761:26;;25834:9;25828:4;25824:20;25820:1;25809:9;25805:17;25798:47;25859:131;25985:4;25859:131;;;25851:139;;25755:245;;;;26007:407;;26198:2;26187:9;26183:18;26175:26;;26248:9;26242:4;26238:20;26234:1;26223:9;26219:17;26212:47;26273:131;26399:4;26273:131;;;26265:139;;26169:245;;;;26421:407;;26612:2;26601:9;26597:18;26589:26;;26662:9;26656:4;26652:20;26648:1;26637:9;26633:17;26626:47;26687:131;26813:4;26687:131;;;26679:139;;26583:245;;;;26835:407;;27026:2;27015:9;27011:18;27003:26;;27076:9;27070:4;27066:20;27062:1;27051:9;27047:17;27040:47;27101:131;27227:4;27101:131;;;27093:139;;26997:245;;;;27249:407;;27440:2;27429:9;27425:18;27417:26;;27490:9;27484:4;27480:20;27476:1;27465:9;27461:17;27454:47;27515:131;27641:4;27515:131;;;27507:139;;27411:245;;;;27663:407;;27854:2;27843:9;27839:18;27831:26;;27904:9;27898:4;27894:20;27890:1;27879:9;27875:17;27868:47;27929:131;28055:4;27929:131;;;27921:139;;27825:245;;;;28077:407;;28268:2;28257:9;28253:18;28245:26;;28318:9;28312:4;28308:20;28304:1;28293:9;28289:17;28282:47;28343:131;28469:4;28343:131;;;28335:139;;28239:245;;;;28491:407;;28682:2;28671:9;28667:18;28659:26;;28732:9;28726:4;28722:20;28718:1;28707:9;28703:17;28696:47;28757:131;28883:4;28757:131;;;28749:139;;28653:245;;;;28905:407;;29096:2;29085:9;29081:18;29073:26;;29146:9;29140:4;29136:20;29132:1;29121:9;29117:17;29110:47;29171:131;29297:4;29171:131;;;29163:139;;29067:245;;;;29319:407;;29510:2;29499:9;29495:18;29487:26;;29560:9;29554:4;29550:20;29546:1;29535:9;29531:17;29524:47;29585:131;29711:4;29585:131;;;29577:139;;29481:245;;;;29733:407;;29924:2;29913:9;29909:18;29901:26;;29974:9;29968:4;29964:20;29960:1;29949:9;29945:17;29938:47;29999:131;30125:4;29999:131;;;29991:139;;29895:245;;;;30147:407;;30338:2;30327:9;30323:18;30315:26;;30388:9;30382:4;30378:20;30374:1;30363:9;30359:17;30352:47;30413:131;30539:4;30413:131;;;30405:139;;30309:245;;;;30561:407;;30752:2;30741:9;30737:18;30729:26;;30802:9;30796:4;30792:20;30788:1;30777:9;30773:17;30766:47;30827:131;30953:4;30827:131;;;30819:139;;30723:245;;;;30975:407;;31166:2;31155:9;31151:18;31143:26;;31216:9;31210:4;31206:20;31202:1;31191:9;31187:17;31180:47;31241:131;31367:4;31241:131;;;31233:139;;31137:245;;;;31389:407;;31580:2;31569:9;31565:18;31557:26;;31630:9;31624:4;31620:20;31616:1;31605:9;31601:17;31594:47;31655:131;31781:4;31655:131;;;31647:139;;31551:245;;;;31803:407;;31994:2;31983:9;31979:18;31971:26;;32044:9;32038:4;32034:20;32030:1;32019:9;32015:17;32008:47;32069:131;32195:4;32069:131;;;32061:139;;31965:245;;;;32217:407;;32408:2;32397:9;32393:18;32385:26;;32458:9;32452:4;32448:20;32444:1;32433:9;32429:17;32422:47;32483:131;32609:4;32483:131;;;32475:139;;32379:245;;;;32631:407;;32822:2;32811:9;32807:18;32799:26;;32872:9;32866:4;32862:20;32858:1;32847:9;32843:17;32836:47;32897:131;33023:4;32897:131;;;32889:139;;32793:245;;;;33045:407;;33236:2;33225:9;33221:18;33213:26;;33286:9;33280:4;33276:20;33272:1;33261:9;33257:17;33250:47;33311:131;33437:4;33311:131;;;33303:139;;33207:245;;;;33459:407;;33650:2;33639:9;33635:18;33627:26;;33700:9;33694:4;33690:20;33686:1;33675:9;33671:17;33664:47;33725:131;33851:4;33725:131;;;33717:139;;33621:245;;;;33873:321;;34045:2;34034:9;34030:18;34022:26;;34059:125;34181:1;34170:9;34166:17;34157:6;34059:125;;;34016:178;;;;;34201:213;;34319:2;34308:9;34304:18;34296:26;;34333:71;34401:1;34390:9;34386:17;34377:6;34333:71;;;34290:124;;;;;34421:675;;34659:3;34648:9;34644:19;34636:27;;34674:71;34742:1;34731:9;34727:17;34718:6;34674:71;;;34756:80;34832:2;34821:9;34817:18;34808:6;34756:80;;;34847:72;34915:2;34904:9;34900:18;34891:6;34847:72;;;34930;34998:2;34987:9;34983:18;34974:6;34930:72;;;35013:73;35081:3;35070:9;35066:19;35057:6;35013:73;;;34630:466;;;;;;;;;35103:412;;35269:2;35258:9;35254:18;35246:26;;35283:71;35351:1;35340:9;35336:17;35327:6;35283:71;;;35402:9;35396:4;35392:20;35387:2;35376:9;35372:18;35365:48;35427:78;35500:4;35491:6;35427:78;;;35419:86;;35240:275;;;;;;35522:256;;35584:2;35578:9;35568:19;;35622:4;35614:6;35610:17;35721:6;35709:10;35706:22;35685:18;35673:10;35670:34;35667:62;35664:2;;;35742:1;35739;35732:12;35664:2;35762:10;35758:2;35751:22;35562:216;;;;;35785:327;;35967:18;35959:6;35956:30;35953:2;;;35999:1;35996;35989:12;35953:2;36034:4;36026:6;36022:17;36014:25;;36097:4;36091;36087:15;36079:23;;35890:222;;;;36119:321;;36262:18;36254:6;36251:30;36248:2;;;36294:1;36291;36284:12;36248:2;36361:4;36357:9;36350:4;36342:6;36338:17;36334:33;36326:41;;36425:4;36419;36415:15;36407:23;;36185:255;;;;36447:322;;36591:18;36583:6;36580:30;36577:2;;;36623:1;36620;36613:12;36577:2;36690:4;36686:9;36679:4;36671:6;36667:17;36663:33;36655:41;;36754:4;36748;36744:15;36736:23;;36514:255;;;;36776:121;;36869:5;36863:12;36853:22;;36834:63;;;;36904:118;;36994:5;36988:12;36978:22;;36959:63;;;;37029:122;;37123:5;37117:12;37107:22;;37088:63;;;;37159:162;;37273:6;37268:3;37261:19;37310:4;37305:3;37301:14;37286:29;;37254:67;;;;;37330:144;;37465:3;37450:18;;37443:31;;;;;37483:163;;37598:6;37593:3;37586:19;37635:4;37630:3;37626:14;37611:29;;37579:67;;;;;37655:145;;37791:3;37776:18;;37769:31;;;;;37808:91;;37870:24;37888:5;37870:24;;;37859:35;;37853:46;;;;37906:99;;37976:24;37994:5;37976:24;;;37965:35;;37959:46;;;;38012:85;;38085:5;38078:13;38071:21;38060:32;;38054:43;;;;38104:144;;38176:66;38169:5;38165:78;38154:89;;38148:100;;;;38255:121;;38328:42;38321:5;38317:54;38306:65;;38300:76;;;;38383:72;;38445:5;38434:16;;38428:27;;;;38462:129;;38549:37;38580:5;38549:37;;;38536:50;;38530:61;;;;38598:121;;38677:37;38708:5;38677:37;;;38664:50;;38658:61;;;;38726:108;;38805:24;38823:5;38805:24;;;38792:37;;38786:48;;;;38842:145;38923:6;38918:3;38913;38900:30;38979:1;38970:6;38965:3;38961:16;38954:27;38893:94;;;;38996:268;39061:1;39068:101;39082:6;39079:1;39076:13;39068:101;;;39158:1;39153:3;39149:11;39143:18;39139:1;39134:3;39130:11;39123:39;39104:2;39101:1;39097:10;39092:15;;39068:101;;;39184:6;39181:1;39178:13;39175:2;;;39249:1;39240:6;39235:3;39231:16;39224:27;39175:2;39045:219;;;;;39272:97;;39360:2;39356:7;39351:2;39344:5;39340:14;39336:28;39326:38;;39320:49;;;;39377:117;39446:24;39464:5;39446:24;;;39439:5;39436:35;39426:2;;39485:1;39482;39475:12;39426:2;39420:74;;39501:111;39567:21;39582:5;39567:21;;;39560:5;39557:32;39547:2;;39603:1;39600;39593:12;39547:2;39541:71;;39619:115;39687:23;39704:5;39687:23;;;39680:5;39677:34;39667:2;;39725:1;39722;39715:12;39667:2;39661:73;;39741:117;39810:24;39828:5;39810:24;;;39803:5;39800:35;39790:2;;39849:1;39846;39839:12;39790:2;39784:74;

Swarm Source

bzzr://d06d4735efc2a1d750da8f83a4efd3640d6e2b1eed3964e3045d63596d58c0bc
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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