ETH Price: $3,633.87 (+1.37%)

Token

ERC-20: the.art_Club Membership (the.art_Club Membership)
 

Overview

Max Total Supply

96 the.art_Club Membership

Holders

28

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
guefaraman.eth
Balance
5 the.art_Club Membership
0x49E48A45578C9FbF8ee4321Ae189787743aF1c2F
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:
NFTPassTokens

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-02
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.12;



/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they mayb be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice The contract MUST allow multiple operators per owner.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}



/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @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 Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}



/**
 * @dev Math operations with safety checks that throw on error. This contract is based on the
 * source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol.
 */
library SafeMath
{
  
  string constant OVERFLOW = "008001";
  string constant SUBTRAHEND_GREATER_THEN_MINUEND = "008002";
  string constant DIVISION_BY_ZERO = "008003";

  /**
   * @dev Multiplies two numbers, reverts on overflow.
   * @param _factor1 Factor number.
   * @param _factor2 Factor number.
   * @return product The product of the two factors.
   */
  function mul(
    uint256 _factor1,
    uint256 _factor2
  )
    internal
    pure
    returns (uint256 product)
  {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_factor1 == 0)
    {
      return 0;
    }

    product = _factor1 * _factor2;
    require(product / _factor1 == _factor2, OVERFLOW);
  }

  /**
   * @dev Integer division of two numbers, truncating the quotient, reverts on division by zero.
   * @param _dividend Dividend number.
   * @param _divisor Divisor number.
   * @return quotient The quotient.
   */
  function div(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 quotient)
  {
    // Solidity automatically asserts when dividing by 0, using all gas.
    require(_divisor > 0, DIVISION_BY_ZERO);
    quotient = _dividend / _divisor;
    // assert(_dividend == _divisor * quotient + _dividend % _divisor); // There is no case in which this doesn't hold.
  }

  /**
   * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
   * @param _minuend Minuend number.
   * @param _subtrahend Subtrahend number.
   * @return difference Difference.
   */
  function sub(
    uint256 _minuend,
    uint256 _subtrahend
  )
    internal
    pure
    returns (uint256 difference)
  {
    require(_subtrahend <= _minuend, SUBTRAHEND_GREATER_THEN_MINUEND);
    difference = _minuend - _subtrahend;
  }

  /**
   * @dev Adds two numbers, reverts on overflow.
   * @param _addend1 Number.
   * @param _addend2 Number.
   * @return sum Sum.
   */
  function add(
    uint256 _addend1,
    uint256 _addend2
  )
    internal
    pure
    returns (uint256 sum)
  {
    sum = _addend1 + _addend2;
    require(sum >= _addend1, OVERFLOW);
  }

  /**
    * @dev Divides two numbers and returns the remainder (unsigned integer modulo), reverts when
    * dividing by zero.
    * @param _dividend Number.
    * @param _divisor Number.
    * @return remainder Remainder.
    */
  function mod(
    uint256 _dividend,
    uint256 _divisor
  )
    internal
    pure
    returns (uint256 remainder)
  {
    require(_divisor != 0, DIVISION_BY_ZERO);
    remainder = _dividend % _divisor;
  }

}





/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * @notice This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}



/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

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

}


/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using SafeMath for uint256;
  using AddressUtils for address;

  
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROWED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can recieve NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of his tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   * @param _from Sender of NFT (if address is zero address it indicates token creation).
   * @param _to Receiver of NFT (if address is zero address it indicates token destruction).
   * @param _tokenId The NFT that got transfered.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   * @param _owner Owner of NFT.
   * @param _approved Address that we are approving.
   * @param _tokenId NFT which we are approving.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   * @param _owner Owner of NFT.
   * @param _operator Address to which we are setting operator rights.
   * @param _approved Status of operator rights(true if operator rights are given and false if
   * revoked).
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender], NOT_OWNER_OR_OPERATOR);
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROWED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they maybe be permanently lost.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice This works even if sender doesn't own any tokens at the time.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
   * invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @dev Actually preforms the transfer.
   * @notice Does NO checks.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @dev Removes a NFT from owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] = ownerToNFTokenCount[_from] - 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @dev Assignes a new NFT to owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] = ownerToNFTokenCount[_to].add(1);
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    if (idToApproval[_tokenId] != address(0))
    {
      delete idToApproval[_tokenId];
    }
  }

}







/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}


/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  constructor()
    public
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    if (bytes(idToUri[_tokenId]).length != 0)
    {
      delete idToUri[_tokenId];
    }
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}






/**
 * @dev Optional enumeration extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Enumerable
{

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}


/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenEnumerable is
  NFToken,
  ERC721Enumerable
{

  
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;

  /**
   * @dev Contract constructor.
   */
  constructor()
    public
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @dev Removes a NFT from an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    delete idToOwner[_tokenId];

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length - 1;

    if (lastTokenIndex != tokenToRemoveIndex)
    {
      uint256 lastToken = ownerToIds[_from][lastTokenIndex];
      ownerToIds[_from][tokenToRemoveIndex] = lastToken;
      idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    }

    ownerToIds[_from].pop();
  }

  /**
   * @dev Assignes a new NFT to an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;

    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override
    virtual
    view
    returns (uint256)
  {
    return ownerToIds[_owner].length;
  }
}



/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";
  bool public constant DEVELOPED_BY_SERGEY_CHEKRIY = true;

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
    public
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}



contract NFTPassTokens is
  NFTokenEnumerable,
  NFTokenMetadata,
  Ownable
{
  
  uint256 mint_price = 100000000000000000; //wei (0,1 eth)
  string public nftUrl = '';
 
  
  uint256 next_token_id = 1;
  uint256 max_token_id = 10;
                
 
 
 
  /**
   * @dev not bullet-proof check, but additional measure, actually we require specific (contract) address, 
   * which is key (see onlymanagingContract)
   */
  function isContract(address _addr) 
    internal
    view    
    returns (bool)
  {
      uint32 size;
      assembly {
          size := extcodesize(_addr)
      }
      
      return (size > 0);
  }
  
  function concatenate(
        string memory a,
        string memory b)
        internal 
        pure
        returns(string memory) {
            return string(abi.encodePacked(a, b));
  }
  
  /**
   * @dev Contract constructor. Sets metadata extension `name` and `symbol`.
   */
  constructor()
    public
  {
    nftName = "the.art_Club Membership";
    nftSymbol = "the.art_Club Membership";
    nftUrl = "https://nft.nonfungible-art.net/nftpass.json";
  }
  
  function getMintPrice() external view returns(uint256){
      return mint_price;
  }
  
  function setMintPrice(uint256 new_price) external onlyOwner {
      mint_price = new_price;
  }
  
  function getMaxTokenId() external view returns(uint256){
      return max_token_id;
  }
  
  function setMaxTokenId(uint256 new_max_token_id) external onlyOwner {
      max_token_id = new_max_token_id;
  }
  
  
 /**
  * @dev only to be used if you do not have minted tokens, 
  * all minted tokens will become unusable 
  */
  function setNFTName(string calldata new_name) external onlyOwner{
          nftName = new_name;
  }
  
  /**
  * @dev only to be used if you do not have minted tokens, 
  * all minted tokens will become unusable 
  */
  function setNFTSymbol(string calldata new_symbol) external onlyOwner{
          nftSymbol = new_symbol;
  }
  
  /**
  * @dev only to be used if you do not have minted tokens, 
  * all minted tokens will become unusable 
  */
  function setNFTUrl(string calldata new_url) external onlyOwner{
          nftUrl = new_url;
  }
  
  
  
  
  /**
   * @dev returns contract balance
   */
  function getContractBalance() 
     public 
     view 
     returns (uint256) 
  {
     return address(this).balance;
  }

  /**
   * @dev sends eth from contract balance to specified address
   * @param sendTo address to send amount
   * @param amount - amount to send (should be less than current balance)
   */
  function withdraw(
      address payable sendTo, 
      uint256 amount
  ) 
      external 
      onlyOwner 
  {
      require(address(this).balance >= amount, "unsufficient funds");
      sendTo.transfer(amount);
  }
   
  
  function isFreeTokenId(uint256 _tokenId) public view returns (bool){
      if (bytes(idToUri[_tokenId]).length != 0){
          return false;
      } else {
          return true;
      }
  }
  

  

  
  
    
  function mint(
    address _to,
    uint256 amount //amount tokens to mint, max 5
  ) 
    external
    payable
  {
    require(amount >= 1 && amount <=5,"1 to 5 tokens can be minted");
    require((next_token_id+amount-1) <= max_token_id, "with this amount we will be over max_token_id");
    
    uint256 val = msg.value.div(amount);
    require(val == mint_price, "you should send value of [mint_price] X [amount]");
    
    for (uint256 i=0; i< amount; i++){
        while (!isFreeTokenId(next_token_id)){
            next_token_id++;
        }
        uint256 _tokenId = next_token_id;
        
        
        super._mint(_to, _tokenId);
        super._setTokenUri(_tokenId, nftUrl);
        
        next_token_id++;
    }
  }
       
  /**
   * @dev Removes a NFT from owner.
   * @param _tokenId Which NFT we want to remove.
   */
  function burn(
    uint256 _tokenId
  )
    external
  {
    require(msg.sender == owner || idToOwner[_tokenId] == msg.sender, "no rights to burn");
    
    super._burn(_tokenId);
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._mint(_to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override(NFTokenMetadata, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._burn(_tokenId);
    if (bytes(idToUri[_tokenId]).length != 0)
    {
      delete idToUri[_tokenId];
    }
  }

  /**
   * @dev Removes a NFT from an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._removeNFToken(_from, _tokenId);
  }

  /**
   * @dev Assignes a new NFT to an address.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._addNFToken(_to, _tokenId);
  }

   /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override(NFToken, NFTokenEnumerable)
    view
    returns (uint256)
  {
    return NFTokenEnumerable._getOwnerNFTCount(_owner);
  }
  
  function hasPass(
    address _wallet
  )
    external
    view
    returns (bool)
  {
    require(_wallet != address(0), ZERO_ADDRESS);
    return (_getOwnerNFTCount(_wallet) > 0);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPED_BY_SERGEY_CHEKRIY","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isFreeTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_max_token_id","type":"uint256"}],"name":"setMaxTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_name","type":"string"}],"name":"setNFTName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_symbol","type":"string"}],"name":"setNFTSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_url","type":"string"}],"name":"setNFTUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"sendTo","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600d5560405180602001604052806000815250600e908051906020019062000037929190620002a9565b506001600f55600a6010553480156200004f57600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601781526020017f7468652e6172745f436c7562204d656d626572736869700000000000000000008152506009908051906020019062000222929190620002a9565b506040518060400160405280601781526020017f7468652e6172745f436c7562204d656d62657273686970000000000000000000815250600a908051906020019062000270929190620002a9565b506040518060600160405280602c81526020016200565f602c9139600e9080519060200190620002a2929190620002a9565b506200034f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ec57805160ff19168380011785556200031d565b828001600101855582156200031d579182015b828111156200031c578251825591602001919060010190620002ff565b5b5090506200032c919062000330565b5090565b5b808211156200034b57600081600090555060010162000331565b5090565b615300806200035f6000396000f3fe6080604052600436106102045760003560e01c80636f9fb98a11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610e00578063f2fde38b14610e87578063f3fe3bc314610ed8578063f3fef3a314610f68578063f4a0a52814610fc357610204565b8063b88d4fde14610c24578063bf5e797614610cf4578063c87b56dd14610d1f578063d00dc74214610dd357610204565b80638ea7f033116100e75780638ea7f03314610a54578063937cde2014610aa557806395d89b4114610b0c578063a22cb46514610b9c578063a7f93ebd14610bf957610204565b80636f9fb98a146108f357806370a082311461091e578063860d248a146109835780638da5cb5b14610a1357610204565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461073b57806342842e0e1461078957806342966c68146108045780634f6ccce71461083f5780636352211e1461088e57610204565b806323b872dd146105455780632f745c59146105c05780633caa10dc1461062f5780633fb9337b146106b557610204565b806309de27d4116101d757806309de27d4146103c9578063131cdcf21461044f57806318160ddd146104df578063202fcbbd1461050a57610204565b806301ffc9a71461020957806306fdde0314610279578063081812fc14610309578063095ea7b31461036e575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ffe565b60405180821515815260200191505060405180910390f35b34801561028557600080fd5b5061028e611065565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102ce5780820151818401526020810190506102b3565b50505050905090810190601f1680156102fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031557600080fd5b506103426004803603602081101561032c57600080fd5b8101908080359060200190929190505050611107565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561037a57600080fd5b506103c76004803603604081101561039157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611287565b005b3480156103d557600080fd5b5061044d600480360360208110156103ec57600080fd5b810190808035906020019064010000000081111561040957600080fd5b82018360208201111561041b57600080fd5b8035906020019184600183028401116401000000008311171561043d57600080fd5b9091929391929390505050611799565b005b34801561045b57600080fd5b506104646118dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104a4578082015181840152602081019050610489565b50505050905090810190601f1680156104d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104eb57600080fd5b506104f461197b565b6040518082815260200191505060405180910390f35b34801561051657600080fd5b506105436004803603602081101561052d57600080fd5b8101908080359060200190929190505050611988565b005b34801561055157600080fd5b506105be6004803603606081101561056857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac0565b005b3480156105cc57600080fd5b50610619600480360360408110156105e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120a6565b6040518082815260200191505060405180910390f35b34801561063b57600080fd5b506106b36004803603602081101561065257600080fd5b810190808035906020019064010000000081111561066f57600080fd5b82018360208201111561068157600080fd5b803590602001918460018302840111640100000000831117156106a357600080fd5b9091929391929390505050612227565b005b3480156106c157600080fd5b50610739600480360360208110156106d857600080fd5b81019080803590602001906401000000008111156106f557600080fd5b82018360208201111561070757600080fd5b8035906020019184600183028401116401000000008311171561072957600080fd5b909192939192939050505061236b565b005b6107876004803603604081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124af565b005b34801561079557600080fd5b50610802600480360360608110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612713565b005b34801561081057600080fd5b5061083d6004803603602081101561082757600080fd5b8101908080359060200190929190505050612733565b005b34801561084b57600080fd5b506108786004803603602081101561086257600080fd5b810190808035906020019092919050505061286b565b6040518082815260200191505060405180910390f35b34801561089a57600080fd5b506108c7600480360360208110156108b157600080fd5b8101908080359060200190929190505050612971565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108ff57600080fd5b50610908612abc565b6040518082815260200191505060405180910390f35b34801561092a57600080fd5b5061096d6004803603602081101561094157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ac4565b6040518082815260200191505060405180910390f35b34801561098f57600080fd5b50610998612be3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d85780820151818401526020810190506109bd565b50505050905090810190601f168015610a055780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a1f57600080fd5b50610a28612c1c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a8d60048036036020811015610a7757600080fd5b8101908080359060200190929190505050612c42565b60405180821515815260200191505060405180910390f35b348015610ab157600080fd5b50610af460048036036020811015610ac857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c85565b60405180821515815260200191505060405180910390f35b348015610b1857600080fd5b50610b21612da7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b61578082015181840152602081019050610b46565b50505050905090810190601f168015610b8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ba857600080fd5b50610bf760048036036040811015610bbf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e49565b005b348015610c0557600080fd5b50610c0e612f48565b6040518082815260200191505060405180910390f35b348015610c3057600080fd5b50610cf260048036036080811015610c4757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610cae57600080fd5b820183602082011115610cc057600080fd5b80359060200191846001830284011164010000000083111715610ce257600080fd5b9091929391929390505050612f52565b005b348015610d0057600080fd5b50610d09612fa9565b6040518082815260200191505060405180910390f35b348015610d2b57600080fd5b50610d5860048036036020811015610d4257600080fd5b8101908080359060200190929190505050612fb3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d98578082015181840152602081019050610d7d565b50505050905090810190601f168015610dc55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ddf57600080fd5b50610de86131ab565b60405180821515815260200191505060405180910390f35b348015610e0c57600080fd5b50610e6f60048036036040811015610e2357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b0565b60405180821515815260200191505060405180910390f35b348015610e9357600080fd5b50610ed660048036036020811015610eaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613244565b005b348015610ee457600080fd5b50610eed613540565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f2d578082015181840152602081019050610f12565b50505050905090810190601f168015610f5a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f7457600080fd5b50610fc160048036036040811015610f8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613579565b005b348015610fcf57600080fd5b50610ffc60048036036020811015610fe657600080fd5b8101908080359060200190929190505050613768565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110fd5780601f106110d2576101008083540402835291602001916110fd565b820191906000526020600020905b8154815290600101906020018083116110e057829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061124a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561120f5780820151818401526020810190506111f4565b50505050905090810190601f16801561123c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113805750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611421578082015181840152602081019050611406565b50505050905090810190601f16801561144e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061159e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611563578082015181840152602081019050611548565b50505050905090810190601f1680156115905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116a857808201518184015260208101905061168d565b50505050905090810190601f1680156116d55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561188b578082015181840152602081019050611870565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508181600e91906118d8929190615108565b505050565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b505050505081565b6000600580549050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ab5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a7a578082015181840152602081019050611a5f565b50505050905090810190601f168015611aa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508060108190555050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b9157503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611c225750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cc3578082015181840152602081019050611ca8565b50505050905090810190601f168015611cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611e40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e05578082015181840152602081019050611dea565b50505050905090810190601f168015611e325780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f49578082015181840152602081019050611f2e565b50505050905090810190601f168015611f765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205757808201518184015260208101905061203c565b50505050905090810190601f1680156120845780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061209d86866138a0565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561218e578082015181840152602081019050612173565b50505050905090810190601f1680156121bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061221457fe5b9060005260206000200154905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612354576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123195780820151818401526020810190506122fe565b50505050905090810190601f1680156123465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50818160099190612366929190615108565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561245d578082015181840152602081019050612442565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508181600a91906124aa929190615108565b505050565b600181101580156124c1575060058111155b612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f3120746f203520746f6b656e732063616e206265206d696e746564000000000081525060200191505060405180910390fd5b601054600182600f5401031115612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061526e602d913960400191505060405180910390fd5b60006125aa823461395590919063ffffffff16565b9050600d548114612606576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061529b6030913960400191505060405180910390fd5b60005b8281101561270d575b61261d600f54612c42565b61263857600f60008154809291906001019190505550612612565b6000600f5490506126498582613a49565b6126ed81600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126e35780601f106126b8576101008083540402835291602001916126e3565b820191906000526020600020905b8154815290600101906020018083116126c657829003601f168201915b5050505050613aa0565b600f60008154809291906001019190505550508080600101915050612609565b50505050565b61272e83838360405180602001604052806000815250613c0f565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ed57503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f6e6f2072696768747320746f206275726e00000000000000000000000000000081525060200191505060405180910390fd5b6128688161447c565b50565b600060058054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090612951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129165780820151818401526020810190506128fb565b50505050905090810190601f1680156129435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506005828154811061295f57fe5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612ab6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7b578082015181840152602081019050612a60565b50505050905090810190601f168015612aa85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50919050565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612bd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b97578082015181840152602081019050612b7c565b50505050905090810190601f168015612bc45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612bdc826144d7565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600b600084815260200190815260200160002080546001816001161561010002031660029004905014612c7b5760009050612c80565b600190505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612d93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d58578082015181840152602081019050612d3d565b50505050905090810190601f168015612d855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000612d9f836144d7565b119050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e3f5780601f10612e1457610100808354040283529160200191612e3f565b820191906000526020600020905b815481529060010190602001808311612e2257829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6000600d54905090565b612fa285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613c0f565b5050505050565b6000601054905090565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130bb5780820151818401526020810190506130a0565b50505050905090810190601f1680156130e85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600b60008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561319e5780601f106131735761010080835404028352916020019161319e565b820191906000526020600020905b81548152906001019060200180831161318157829003601f168201915b5050505050915050919050565b600181565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613371576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561333657808201518184015260208101905061331b565b50505050905090810190601f1680156133635780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30313830303200000000000000000000000000000000000000000000000000008152509061347f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613444578082015181840152602081019050613429565b50505050905090810190601f1680156134715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906136a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561366b578082015181840152602081019050613650565b50505050905090810190601f1680156136985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508047101561371d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f756e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613763573d6000803e3d6000fd5b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613895576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561385a57808201518184015260208101905061383f565b50505050905090810190601f1680156138875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080600d8190555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506138e1826144e9565b6138eb818361458a565b6138f58383614598565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082116040518060400160405280600681526020017f303038303033000000000000000000000000000000000000000000000000000081525090613a36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139fb5780820151818401526020810190506139e0565b50505050905090810190601f168015613a285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50818381613a4057fe5b04905092915050565b613a5382826145a6565b600581908060018154018082558091505060019003906000526020600020016000909190919091505560016005805490500360066000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ba6578082015181840152602081019050613b8b565b50505050905090810190601f168015613bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5081600b60008581526020019081526020016000209080519060200190613c09929190615188565b50505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ce057503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80613d715750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613e4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e12578082015181840152602081019050613df7565b50505050905090810190601f168015613e3f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f54578082015181840152602081019050613f39565b50505050905090810190601f168015613f815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906140d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561409857808201518184015260208101905061407d565b50505050905090810190601f1680156140c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906141e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141a657808201518184015260208101905061418b565b50505050905090810190601f1680156141d35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506141ec87876138a0565b61420b8773ffffffffffffffffffffffffffffffffffffffff1661485e565b156144725760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156142bf5780820151818401526020810190506142a4565b50505050905090810190601f1680156142ec5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561430e57600080fd5b505af1158015614322573d6000803e3d6000fd5b505050506040513d602081101561433857600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061446f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614434578082015181840152602081019050614419565b50505050905090810190601f1680156144615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505b5050505050505050565b614485816148a9565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050146144d457600b600082815260200190815260200160002060006144d39190615208565b5b50565b60006144e282614967565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614587576002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b61459482826149b3565b5050565b6145a28282614cc1565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906146b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561467857808201518184015260208101905061465d565b50505050905090810190601f1680156146a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906147f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156147b857808201518184015260208101905061479d565b50505050905090810190601f1680156147e55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506147fe8282614598565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156148a05750808214155b92505050919050565b6148b281614f1a565b600060066000838152602001908152602001600020549050600060016005805490500390506000600582815481106148e657fe5b90600052602060002001549050806005848154811061490157fe5b9060005260206000200181905550600580548061491a57fe5b600190038181906000526020600020016000905590558260066000838152602001908152602001600020819055506000600660008681526020019081526020016000208190555050505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ab6578082015181840152602081019050614a9b565b50505050905090810190601f168015614ae35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050039050818114614c5d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614bdd57fe5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c3557fe5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480614ca557fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090614e00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614dc5578082015181840152602081019050614daa565b50505050905090810190601f168015614df25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500360086000838152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061505b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615020578082015181840152602081019050615005565b50505050905090810190601f16801561504d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061509d836144e9565b6150a7818461458a565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061514957803560ff1916838001178555615177565b82800160010185558215615177579182015b8281111561517657823582559160200191906001019061515b565b5b5090506151849190615250565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151c957805160ff19168380011785556151f7565b828001600101855582156151f7579182015b828111156151f65782518255916020019190600101906151db565b5b5090506152049190615250565b5090565b50805460018160011615610100020316600290046000825580601f1061522e575061524d565b601f01602090049060005260206000209081019061524c9190615250565b5b50565b5b80821115615269576000816000905550600101615251565b509056fe77697468207468697320616d6f756e742077652077696c6c206265206f766572206d61785f746f6b656e5f6964796f752073686f756c642073656e642076616c7565206f66205b6d696e745f70726963655d2058205b616d6f756e745da2646970667358221220440bd8aefa9eb12e7c797edd302d7e83ae86fa70ea8461081ffba0f4f44ce55e64736f6c634300060c003368747470733a2f2f6e66742e6e6f6e66756e6769626c652d6172742e6e65742f6e6674706173732e6a736f6e

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636f9fb98a11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610e00578063f2fde38b14610e87578063f3fe3bc314610ed8578063f3fef3a314610f68578063f4a0a52814610fc357610204565b8063b88d4fde14610c24578063bf5e797614610cf4578063c87b56dd14610d1f578063d00dc74214610dd357610204565b80638ea7f033116100e75780638ea7f03314610a54578063937cde2014610aa557806395d89b4114610b0c578063a22cb46514610b9c578063a7f93ebd14610bf957610204565b80636f9fb98a146108f357806370a082311461091e578063860d248a146109835780638da5cb5b14610a1357610204565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461073b57806342842e0e1461078957806342966c68146108045780634f6ccce71461083f5780636352211e1461088e57610204565b806323b872dd146105455780632f745c59146105c05780633caa10dc1461062f5780633fb9337b146106b557610204565b806309de27d4116101d757806309de27d4146103c9578063131cdcf21461044f57806318160ddd146104df578063202fcbbd1461050a57610204565b806301ffc9a71461020957806306fdde0314610279578063081812fc14610309578063095ea7b31461036e575b600080fd5b34801561021557600080fd5b506102616004803603602081101561022c57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610ffe565b60405180821515815260200191505060405180910390f35b34801561028557600080fd5b5061028e611065565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102ce5780820151818401526020810190506102b3565b50505050905090810190601f1680156102fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031557600080fd5b506103426004803603602081101561032c57600080fd5b8101908080359060200190929190505050611107565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561037a57600080fd5b506103c76004803603604081101561039157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611287565b005b3480156103d557600080fd5b5061044d600480360360208110156103ec57600080fd5b810190808035906020019064010000000081111561040957600080fd5b82018360208201111561041b57600080fd5b8035906020019184600183028401116401000000008311171561043d57600080fd5b9091929391929390505050611799565b005b34801561045b57600080fd5b506104646118dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104a4578082015181840152602081019050610489565b50505050905090810190601f1680156104d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104eb57600080fd5b506104f461197b565b6040518082815260200191505060405180910390f35b34801561051657600080fd5b506105436004803603602081101561052d57600080fd5b8101908080359060200190929190505050611988565b005b34801561055157600080fd5b506105be6004803603606081101561056857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac0565b005b3480156105cc57600080fd5b50610619600480360360408110156105e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120a6565b6040518082815260200191505060405180910390f35b34801561063b57600080fd5b506106b36004803603602081101561065257600080fd5b810190808035906020019064010000000081111561066f57600080fd5b82018360208201111561068157600080fd5b803590602001918460018302840111640100000000831117156106a357600080fd5b9091929391929390505050612227565b005b3480156106c157600080fd5b50610739600480360360208110156106d857600080fd5b81019080803590602001906401000000008111156106f557600080fd5b82018360208201111561070757600080fd5b8035906020019184600183028401116401000000008311171561072957600080fd5b909192939192939050505061236b565b005b6107876004803603604081101561075157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506124af565b005b34801561079557600080fd5b50610802600480360360608110156107ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612713565b005b34801561081057600080fd5b5061083d6004803603602081101561082757600080fd5b8101908080359060200190929190505050612733565b005b34801561084b57600080fd5b506108786004803603602081101561086257600080fd5b810190808035906020019092919050505061286b565b6040518082815260200191505060405180910390f35b34801561089a57600080fd5b506108c7600480360360208110156108b157600080fd5b8101908080359060200190929190505050612971565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156108ff57600080fd5b50610908612abc565b6040518082815260200191505060405180910390f35b34801561092a57600080fd5b5061096d6004803603602081101561094157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ac4565b6040518082815260200191505060405180910390f35b34801561098f57600080fd5b50610998612be3565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109d85780820151818401526020810190506109bd565b50505050905090810190601f168015610a055780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a1f57600080fd5b50610a28612c1c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a8d60048036036020811015610a7757600080fd5b8101908080359060200190929190505050612c42565b60405180821515815260200191505060405180910390f35b348015610ab157600080fd5b50610af460048036036020811015610ac857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c85565b60405180821515815260200191505060405180910390f35b348015610b1857600080fd5b50610b21612da7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b61578082015181840152602081019050610b46565b50505050905090810190601f168015610b8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ba857600080fd5b50610bf760048036036040811015610bbf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612e49565b005b348015610c0557600080fd5b50610c0e612f48565b6040518082815260200191505060405180910390f35b348015610c3057600080fd5b50610cf260048036036080811015610c4757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610cae57600080fd5b820183602082011115610cc057600080fd5b80359060200191846001830284011164010000000083111715610ce257600080fd5b9091929391929390505050612f52565b005b348015610d0057600080fd5b50610d09612fa9565b6040518082815260200191505060405180910390f35b348015610d2b57600080fd5b50610d5860048036036020811015610d4257600080fd5b8101908080359060200190929190505050612fb3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d98578082015181840152602081019050610d7d565b50505050905090810190601f168015610dc55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610ddf57600080fd5b50610de86131ab565b60405180821515815260200191505060405180910390f35b348015610e0c57600080fd5b50610e6f60048036036040811015610e2357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b0565b60405180821515815260200191505060405180910390f35b348015610e9357600080fd5b50610ed660048036036020811015610eaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613244565b005b348015610ee457600080fd5b50610eed613540565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f2d578082015181840152602081019050610f12565b50505050905090810190601f168015610f5a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f7457600080fd5b50610fc160048036036040811015610f8b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613579565b005b348015610fcf57600080fd5b50610ffc60048036036020811015610fe657600080fd5b8101908080359060200190929190505050613768565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110fd5780601f106110d2576101008083540402835291602001916110fd565b820191906000526020600020905b8154815290600101906020018083116110e057829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061124a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561120f5780820151818401526020810190506111f4565b50505050905090810190601f16801561123c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113805750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f30303330303300000000000000000000000000000000000000000000000000008152509061145c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611421578082015181840152602081019050611406565b50505050905090810190601f16801561144e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061159e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611563578082015181840152602081019050611548565b50505050905090810190601f1680156115905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030380000000000000000000000000000000000000000000000000000815250906116e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116a857808201518184015260208101905061168d565b50505050905090810190601f1680156116d55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561188b578082015181840152602081019050611870565b50505050905090810190601f1680156118b85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508181600e91906118d8929190615108565b505050565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119735780601f1061194857610100808354040283529160200191611973565b820191906000526020600020905b81548152906001019060200180831161195657829003601f168201915b505050505081565b6000600580549050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611ab5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a7a578082015181840152602081019050611a5f565b50505050905090810190601f168015611aa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508060108190555050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b9157503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611c225750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611cc3578082015181840152602081019050611ca8565b50505050905090810190601f168015611cf05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611e40576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e05578082015181840152602081019050611dea565b50505050905090810190601f168015611e325780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090611f84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f49578082015181840152602081019050611f2e565b50505050905090810190601f168015611f765780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205757808201518184015260208101905061203c565b50505050905090810190601f1680156120845780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5061209d86866138a0565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561218e578082015181840152602081019050612173565b50505050905090810190601f1680156121bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061221457fe5b9060005260206000200154905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612354576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156123195780820151818401526020810190506122fe565b50505050905090810190601f1680156123465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50818160099190612366929190615108565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612498576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561245d578082015181840152602081019050612442565b50505050905090810190601f16801561248a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508181600a91906124aa929190615108565b505050565b600181101580156124c1575060058111155b612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f3120746f203520746f6b656e732063616e206265206d696e746564000000000081525060200191505060405180910390fd5b601054600182600f5401031115612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061526e602d913960400191505060405180910390fd5b60006125aa823461395590919063ffffffff16565b9050600d548114612606576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061529b6030913960400191505060405180910390fd5b60005b8281101561270d575b61261d600f54612c42565b61263857600f60008154809291906001019190505550612612565b6000600f5490506126498582613a49565b6126ed81600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126e35780601f106126b8576101008083540402835291602001916126e3565b820191906000526020600020905b8154815290600101906020018083116126c657829003601f168201915b5050505050613aa0565b600f60008154809291906001019190505550508080600101915050612609565b50505050565b61272e83838360405180602001604052806000815250613c0f565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127ed57503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61285f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f6e6f2072696768747320746f206275726e00000000000000000000000000000081525060200191505060405180910390fd5b6128688161447c565b50565b600060058054905082106040518060400160405280600681526020017f303035303037000000000000000000000000000000000000000000000000000081525090612951576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129165780820151818401526020810190506128fb565b50505050905090810190601f1680156129435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506005828154811061295f57fe5b90600052602060002001549050919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612ab6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7b578082015181840152602081019050612a60565b50505050905090810190601f168015612aa85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50919050565b600047905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612bd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b97578082015181840152602081019050612b7c565b50505050905090810190601f168015612bc45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612bdc826144d7565b9050919050565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600b600084815260200190815260200160002080546001816001161561010002031660029004905014612c7b5760009050612c80565b600190505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612d93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612d58578082015181840152602081019050612d3d565b50505050905090810190601f168015612d855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000612d9f836144d7565b119050919050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e3f5780601f10612e1457610100808354040283529160200191612e3f565b820191906000526020600020905b815481529060010190602001808311612e2257829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6000600d54905090565b612fa285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613c0f565b5050505050565b6000601054905090565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156130bb5780820151818401526020810190506130a0565b50505050905090810190601f1680156130e85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600b60008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561319e5780601f106131735761010080835404028352916020019161319e565b820191906000526020600020905b81548152906001019060200180831161318157829003601f168201915b5050505050915050919050565b600181565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613371576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561333657808201518184015260208101905061331b565b50505050905090810190601f1680156133635780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30313830303200000000000000000000000000000000000000000000000000008152509061347f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613444578082015181840152602081019050613429565b50505050905090810190601f1680156134715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906136a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561366b578082015181840152602081019050613650565b50505050905090810190601f1680156136985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508047101561371d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f756e73756666696369656e742066756e6473000000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613763573d6000803e3d6000fd5b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090613895576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561385a57808201518184015260208101905061383f565b50505050905090810190601f1680156138875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080600d8190555050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506138e1826144e9565b6138eb818361458a565b6138f58383614598565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082116040518060400160405280600681526020017f303038303033000000000000000000000000000000000000000000000000000081525090613a36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156139fb5780820151818401526020810190506139e0565b50505050905090810190601f168015613a285780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50818381613a4057fe5b04905092915050565b613a5382826145a6565b600581908060018154018082558091505060019003906000526020600020016000909190919091505560016005805490500360066000838152602001908152602001600020819055505050565b81600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ba6578082015181840152602081019050613b8b565b50505050905090810190601f168015613bd35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5081600b60008581526020019081526020016000209080519060200190613c09929190615188565b50505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ce057503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80613d715750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090613e4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e12578082015181840152602081019050613df7565b50505050905090810190601f168015613e3f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f54578082015181840152602081019050613f39565b50505050905090810190601f168015613f815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906140d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561409857808201518184015260208101905061407d565b50505050905090810190601f1680156140c55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906141e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141a657808201518184015260208101905061418b565b50505050905090810190601f1680156141d35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506141ec87876138a0565b61420b8773ffffffffffffffffffffffffffffffffffffffff1661485e565b156144725760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156142bf5780820151818401526020810190506142a4565b50505050905090810190601f1680156142ec5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561430e57600080fd5b505af1158015614322573d6000803e3d6000fd5b505050506040513d602081101561433857600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f30303330303500000000000000000000000000000000000000000000000000008152509061446f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614434578082015181840152602081019050614419565b50505050905090810190601f1680156144615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505b5050505050505050565b614485816148a9565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050146144d457600b600082815260200190815260200160002060006144d39190615208565b5b50565b60006144e282614967565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614587576002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b61459482826149b3565b5050565b6145a28282614cc1565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906146b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561467857808201518184015260208101905061465d565b50505050905090810190601f1680156146a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906147f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156147b857808201518184015260208101905061479d565b50505050905090810190601f1680156147e55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506147fe8282614598565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156148a05750808214155b92505050919050565b6148b281614f1a565b600060066000838152602001908152602001600020549050600060016005805490500390506000600582815481106148e657fe5b90600052602060002001549050806005848154811061490157fe5b9060005260206000200181905550600580548061491a57fe5b600190038181906000526020600020016000905590558260066000838152602001908152602001600020819055506000600660008681526020019081526020016000208190555050505050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614ab6578082015181840152602081019050614a9b565b50505050905090810190601f168015614ae35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050039050818114614c5d576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614bdd57fe5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c3557fe5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480614ca557fe5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090614e00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614dc5578082015181840152602081019050614daa565b50505050905090810190601f168015614df25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500360086000838152602001908152602001600020819055505050565b80600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061505b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615020578082015181840152602081019050615005565b50505050905090810190601f16801561504d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060006001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061509d836144e9565b6150a7818461458a565b82600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061514957803560ff1916838001178555615177565b82800160010185558215615177579182015b8281111561517657823582559160200191906001019061515b565b5b5090506151849190615250565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106151c957805160ff19168380011785556151f7565b828001600101855582156151f7579182015b828111156151f65782518255916020019190600101906151db565b5b5090506152049190615250565b5090565b50805460018160011615610100020316600290046000825580601f1061522e575061524d565b601f01602090049060005260206000209081019061524c9190615250565b5b50565b5b80821115615269576000816000905550600101615251565b509056fe77697468207468697320616d6f756e742077652077696c6c206265206f766572206d61785f746f6b656e5f6964796f752073686f756c642073656e642076616c7565206f66205b6d696e745f70726963655d2058205b616d6f756e745da2646970667358221220440bd8aefa9eb12e7c797edd302d7e83ae86fa70ea8461081ffba0f4f44ce55e64736f6c634300060c0033

Deployed Bytecode Sourcemap

39590:7061:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11289:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29322:120;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22261:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20050:352;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41744:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39739:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33489:120;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41036:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19276:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34186:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41280:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41508:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42706:760;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18519:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43581:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33750:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21809:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41911:127;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21339:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38322:65;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38502:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42479:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;46452:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29558:128;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20813:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40740:86;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17900:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40939:89;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29839:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38392:55;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22713:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39339:238;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38266:51;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42240:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40834:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11289:172;11399:4;11422:19;:33;11442:12;11422:33;;;;;;;;;;;;;;;;;;;;;;;;;;;11415:40;;11289:172;;;:::o;29322:120::-;29390:19;29429:7;29421:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29322:120;:::o;22261:183::-;22390:7;22366:8;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;;16812:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22416:12:::1;:22;22429:8;22416:22;;;;;;;;;;;;;;;;;;;;;22409:29;;22261:183:::0;;;;:::o;20050:352::-;20163:8;16025:18;16046:9;:19;16056:8;16046:19;;;;;;;;;;;;;;;;;;;;;16025:40;;16094:10;16080:24;;:10;:24;;;:68;;;;16108:16;:28;16125:10;16108:28;;;;;;;;;;;;;;;:40;16137:10;16108:40;;;;;;;;;;;;;;;;;;;;;;;;;16080:68;16150:21;;;;;;;;;;;;;;;;;16072:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20191:8:::1;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;::::0;16812:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20211:18:::2;20232:9;:19;20242:8;20232:19;;;;;;;;;;;;;;;;;;;;;20211:40;;20279:10;20266:23;;:9;:23;;;;20291:8;;;;;;;;;;;;;;;;::::0;20258:42:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20334:9;20309:12;:22;20322:8;20309:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;20387:8;20376:9;20355:41;;20364:10;20355:41;;;;;;;;;;;;16876:1;16179::::1;20050:352:::0;;;;:::o;41744:97::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41828:7:::1;;41819:6;:16;;;;;;;:::i;:::-;;41744:97:::0;;:::o;39739:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33489:120::-;33564:7;33590:6;:13;;;;33583:20;;33489:120;:::o;41036:114::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41128:16:::1;41113:12;:31;;;;41036:114:::0;:::o;19276:353::-;19409:8;16384:18;16405:9;:19;16415:8;16405:19;;;;;;;;;;;;;;;;;;;;;16384:40;;16461:10;16447:24;;:10;:24;;;:71;;;;16508:10;16482:36;;:12;:22;16495:8;16482:22;;;;;;;;;;;;;;;;;;;;;:36;;;16447:71;:122;;;;16529:16;:28;16546:10;16529:28;;;;;;;;;;;;;;;:40;16558:10;16529:40;;;;;;;;;;;;;;;;;;;;;;;;;16447:122;16578:30;;;;;;;;;;;;;;;;;16431:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19437:8:::1;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;::::0;16812:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19457:18:::2;19478:9;:19;19488:8;19478:19;;;;;;;;;;;;;;;;;;;;;19457:40;;19526:5;19512:19;;:10;:19;;;19533:9;;;;;;;;;;;;;;;;::::0;19504:39:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19573:1;19558:17;;:3;:17;;;;19577:12;;;;;;;;;;;;;;;;::::0;19550:40:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19599:24;19609:3;19614:8;19599:9;:24::i;:::-;16876:1;16622::::1;19276:353:::0;;;;;:::o;34186:251::-;34314:7;34350:10;:18;34361:6;34350:18;;;;;;;;;;;;;;;:25;;;;34341:6;:34;34377:13;;;;;;;;;;;;;;;;;34333:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34405:10;:18;34416:6;34405:18;;;;;;;;;;;;;;;34424:6;34405:26;;;;;;;;;;;;;;;;34398:33;;34186:251;;;;:::o;41280:101::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41367:8:::1;;41357:7;:18;;;;;;;:::i;:::-;;41280:101:::0;;:::o;41508:109::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41601:10:::1;;41589:9;:22;;;;;;;:::i;:::-;;41508:109:::0;;:::o;42706:760::-;42851:1;42841:6;:11;;:25;;;;;42865:1;42856:6;:10;;42841:25;42833:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42940:12;;42934:1;42927:6;42913:13;;:20;:22;42912:40;;42904:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43015:11;43029:21;43043:6;43029:9;:13;;:21;;;;:::i;:::-;43015:35;;43072:10;;43065:3;:17;43057:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43153:9;43148:313;43169:6;43166:1;:9;43148:313;;;43192:79;43200:28;43214:13;;43200;:28::i;:::-;43192:79;;43244:13;;:15;;;;;;;;;;;;;43192:79;;;43281:16;43300:13;;43281:32;;43344:26;43356:3;43361:8;43344:11;:26::i;:::-;43381:36;43400:8;43410:6;43381:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:36::i;:::-;43438:13;;:15;;;;;;;;;;;;;43148:313;43177:3;;;;;;;43148:313;;;;42706:760;;;:::o;18519:179::-;18649:43;18667:5;18674:3;18679:8;18649:43;;;;;;;;;;;;:17;:43::i;:::-;18519:179;;;:::o;43581:192::-;43669:5;;;;;;;;;;;43655:19;;:10;:19;;;:56;;;;43701:10;43678:33;;:9;:19;43688:8;43678:19;;;;;;;;;;;;;;;;;;;;;:33;;;43655:56;43647:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43746:21;43758:8;43746:11;:21::i;:::-;43581:192;:::o;33750:199::-;33850:7;33886:6;:13;;;;33877:6;:22;33901:13;;;;;;;;;;;;;;;;;33869:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33929:6;33936;33929:14;;;;;;;;;;;;;;;;33922:21;;33750:199;;;:::o;21809:208::-;21906:14;21941:9;:19;21951:8;21941:19;;;;;;;;;;;;;;;;;;;;;21932:28;;21993:1;21975:20;;:6;:20;;;;21997:13;;;;;;;;;;;;;;;;;21967:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21809:208;;;:::o;41911:127::-;41983:7;42011:21;42004:28;;41911:127;:::o;21339:204::-;21436:7;21481:1;21463:20;;:6;:20;;;;21485:12;;;;;;;;;;;;;;;;;21455:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21512:25;21530:6;21512:17;:25::i;:::-;21505:32;;21339:204;;;:::o;38322:65::-;;;;;;;;;;;;;;;;;;;:::o;38502:20::-;;;;;;;;;;;;;:::o;42479:197::-;42541:4;42594:1;42565:7;:17;42573:8;42565:17;;;;;;;;;;;42559:31;;;;;;;;;;;;;;;;:36;42555:116;;42616:5;42609:12;;;;42555:116;42657:4;42650:11;;42479:197;;;;:::o;46452:194::-;46534:4;46577:1;46558:21;;:7;:21;;;;46581:12;;;;;;;;;;;;;;;;;46550:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46638:1;46609:26;46627:7;46609:17;:26::i;:::-;:30;46601:39;;46452:194;;;:::o;29558:128::-;29628:21;29671:9;29661:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29558:128;:::o;20813:232::-;20970:9;20928:16;:28;20945:10;20928:28;;;;;;;;;;;;;;;:39;20957:9;20928:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;21018:9;20991:48;;21006:10;20991:48;;;21029:9;20991:48;;;;;;;;;;;;;;;;;;;;20813:232;;:::o;40740:86::-;40786:7;40810:10;;40803:17;;40740:86;:::o;17900:209::-;18057:46;18075:5;18082:3;18087:8;18097:5;;18057:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;17900:209;;;;;:::o;40939:89::-;40986:7;41010:12;;41003:19;;40939:89;:::o;29839:181::-;29965:13;29941:8;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;;16812:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29997:7:::1;:17;30005:8;29997:17;;;;;;;;;;;29990:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29839:181:::0;;;;:::o;38392:55::-;38443:4;38392:55;:::o;22713:192::-;22841:4;22864:16;:24;22881:6;22864:24;;;;;;;;;;;;;;;:35;22889:9;22864:35;;;;;;;;;;;;;;;;;;;;;;;;;22857:42;;22713:192;;;;:::o;39339:238::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39461:1:::1;39440:23;;:9;:23;;;;39465:31;;;;;;;;;;;;;;;;::::0;39432:65:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39537:9;39509:38;;39530:5;;;;;;;;;;;39509:38;;;;;;;;;;;;39562:9;39554:5;;:17;;;;;;;;;;;;;;;;;;39339:238:::0;:::o;38266:51::-;;;;;;;;;;;;;;;;;;;:::o;42240:226::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42399:6:::1;42374:21;:31;;42366:62;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42437:6;:15;;:23;42453:6;42437:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42240:226:::0;;:::o;40834:97::-;39132:5;;;;;;;;;;;39118:19;;:10;:19;;;39139:17;;;;;;;;;;;;;;;;;39110:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40916:9:::1;40903:10;:22;;;;40834:97:::0;:::o;23096:275::-;23185:12;23200:9;:19;23210:8;23200:19;;;;;;;;;;;;;;;;;;;;;23185:34;;23226:24;23241:8;23226:14;:24::i;:::-;23259:30;23274:4;23280:8;23259:14;:30::i;:::-;23296:26;23308:3;23313:8;23296:11;:26::i;:::-;23356:8;23351:3;23336:29;;23345:4;23336:29;;;;;;;;;;;;23096:275;;;:::o;8478:409::-;8581:16;8702:1;8691:8;:12;8705:16;;;;;;;;;;;;;;;;;8683:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8752:8;8740:9;:20;;;;;;8729:31;;8478:409;;;;:::o;34828:218::-;34940:26;34952:3;34957:8;34940:11;:26::i;:::-;34973:6;34985:8;34973:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35039:1;35023:6;:13;;;;:17;35001:9;:19;35011:8;35001:19;;;;;;;;;;;:39;;;;34828:218;;:::o;31035:157::-;31142:8;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;;16812:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31182:4:::1;31162:7;:17;31170:8;31162:17;;;;;;;;;;;:24;;;;;;;;;;;;:::i;:::-;;31035:157:::0;;;:::o;26554:590::-;26702:8;16384:18;16405:9;:19;16415:8;16405:19;;;;;;;;;;;;;;;;;;;;;16384:40;;16461:10;16447:24;;:10;:24;;;:71;;;;16508:10;16482:36;;:12;:22;16495:8;16482:22;;;;;;;;;;;;;;;;;;;;;:36;;;16447:71;:122;;;;16529:16;:28;16546:10;16529:28;;;;;;;;;;;;;;;:40;16558:10;16529:40;;;;;;;;;;;;;;;;;;;;;;;;;16447:122;16578:30;;;;;;;;;;;;;;;;;16431:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26730:8:::1;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;::::0;16812:57:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26750:18:::2;26771:9;:19;26781:8;26771:19;;;;;;;;;;;;;;;;;;;;;26750:40;;26819:5;26805:19;;:10;:19;;;26826:9;;;;;;;;;;;;;;;;::::0;26797:39:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26866:1;26851:17;;:3;:17;;;;26870:12;;;;;;;;;;;;;;;;::::0;26843:40:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26892:24;26902:3;26907:8;26892:9;:24::i;:::-;26929:16;:3;:14;;;:16::i;:::-;26925:214;;;26961:13;26997:3;26977:41;;;27019:10;27031:5;27038:8;27048:5;26977:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;26961:93;;13502:10;27081:24;;27071:34;;;:6;:34;;;;27107:23;;;;;;;;;;;;;;;;::::0;27063:68:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26925:214;;16876:1;16622::::1;26554:590:::0;;;;;;:::o;30423:217::-;30517:21;30529:8;30517:11;:21::i;:::-;30586:1;30557:7;:17;30565:8;30557:17;;;;;;;;;;;30551:31;;;;;;;;;;;;;;;;:36;30547:88;;30610:7;:17;30618:8;30610:17;;;;;;;;;;;;30603:24;;;;:::i;:::-;30547:88;30423:217;:::o;46236:208::-;46369:7;46395:43;46431:6;46395:35;:43::i;:::-;46388:50;;46236:208;;;:::o;27277:173::-;27390:1;27356:36;;:12;:22;27369:8;27356:22;;;;;;;;;;;;;;;;;;;;;:36;;;27352:93;;27415:12;:22;27428:8;27415:22;;;;;;;;;;;;27408:29;;;;;;;;;;;27352:93;27277:173;:::o;45293:193::-;45431:49;45464:5;45471:8;45431:32;:49::i;:::-;45293:193;;:::o;45758:183::-;45891:44;45921:3;45926:8;45891:29;:44::i;:::-;45758:183;;:::o;23762:297::-;23883:1;23868:17;;:3;:17;;;;23887:12;;;;;;;;;;;;;;;;;23860:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23946:1;23915:33;;:9;:19;23925:8;23915:19;;;;;;;;;;;;;;;;;;;;;:33;;;23950:18;;;;;;;;;;;;;;;;;23907:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23978:26;23990:3;23995:8;23978:11;:26::i;:::-;24044:8;24039:3;24018:35;;24035:1;24018:35;;;;;;;;;;;;23762:297;;:::o;11898:780::-;11981:17;12422:16;12445:19;12467:66;12445:88;;;;12575:5;12563:18;12551:30;;12641:3;12629:15;;:8;:15;;:42;;;;;12660:11;12648:8;:23;;12629:42;12613:59;;11898:780;;;;;:::o;35449:495::-;35543:21;35555:8;35543:11;:21::i;:::-;35573:18;35594:9;:19;35604:8;35594:19;;;;;;;;;;;;35573:40;;35620:22;35661:1;35645:6;:13;;;;:17;35620:42;;35669:17;35689:6;35696:14;35689:22;;;;;;;;;;;;;;;;35669:42;;35741:9;35720:6;35727:10;35720:18;;;;;;;;;;;;;;;:30;;;;35759:6;:12;;;;;;;;;;;;;;;;;;;;;;;;35898:10;35875:9;:20;35885:9;35875:20;;;;;;;;;;;:33;;;;35937:1;35915:9;:19;35925:8;35915:19;;;;;;;;;;;:23;;;;35449:495;;;;:::o;37708:175::-;37826:7;37852:10;:18;37863:6;37852:18;;;;;;;;;;;;;;;:25;;;;37845:32;;37708:175;;;:::o;36223:602::-;36377:5;36354:28;;:9;:19;36364:8;36354:19;;;;;;;;;;;;;;;;;;;;;:28;;;36384:9;;;;;;;;;;;;;;;;;36346:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36408:9;:19;36418:8;36408:19;;;;;;;;;;;;36401:26;;;;;;;;;;;36436;36465:14;:24;36480:8;36465:24;;;;;;;;;;;;36436:53;;36496:22;36548:1;36521:10;:17;36532:5;36521:17;;;;;;;;;;;;;;;:24;;;;:28;36496:53;;36580:18;36562:14;:36;36558:230;;36614:17;36634:10;:17;36645:5;36634:17;;;;;;;;;;;;;;;36652:14;36634:33;;;;;;;;;;;;;;;;36614:53;;36716:9;36676:10;:17;36687:5;36676:17;;;;;;;;;;;;;;;36694:18;36676:37;;;;;;;;;;;;;;;:49;;;;36762:18;36734:14;:25;36749:9;36734:25;;;;;;;;;;;:46;;;;36558:230;;36796:10;:17;36807:5;36796:17;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;;;;;;36223:602;;;;:::o;37097:317::-;37254:1;37223:33;;:9;:19;37233:8;37223:19;;;;;;;;;;;;;;;;;;;;;:33;;;37258:18;;;;;;;;;;;;;;;;;37215:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37306:3;37284:9;:19;37294:8;37284:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;37318:10;:15;37329:3;37318:15;;;;;;;;;;;;;;;37339:8;37318:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37407:1;37382:10;:15;37393:3;37382:15;;;;;;;;;;;;;;;:22;;;;:26;37355:14;:24;37370:8;37355:24;;;;;;;;;;;:53;;;;37097:317;;:::o;24462:282::-;24550:8;16851:1;16820:33;;:9;:19;16830:8;16820:19;;;;;;;;;;;;;;;;;;;;;:33;;;;16855:13;;;;;;;;;;;;;;;;;16812:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24570:18:::1;24591:9;:19;24601:8;24591:19;;;;;;;;;;;;;;;;;;;;;24570:40;;24617:24;24632:8;24617:14;:24::i;:::-;24648:36;24663:10;24675:8;24648:14;:36::i;:::-;24729:8;24725:1;24696:42;;24705:10;24696:42;;;;;;;;;;;;16876:1;24462:282:::0;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://440bd8aefa9eb12e7c797edd302d7e83ae86fa70ea8461081ffba0f4f44ce55e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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