ETH Price: $3,402.07 (-1.24%)
Gas: 3 Gwei

Contract

0x123641751a9Ba1502522Ef8936A18e101ca6ACD5
 

Overview

ETH Balance

0.00401001 ETH

Eth Value

$13.64 (@ $3,402.07/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...191648822024-02-05 21:58:11148 days ago1707170291IN
0x12364175...01ca6ACD5
0 ETH0.0005319921.57775063
Set Approval For...189097372024-01-01 2:51:11183 days ago1704077471IN
0x12364175...01ca6ACD5
0 ETH0.0002486210.09380831
Set Approval For...189097012024-01-01 2:43:59183 days ago1704077039IN
0x12364175...01ca6ACD5
0 ETH0.0004753110.2124885
Set Approval For...189075622023-12-31 19:31:59184 days ago1704051119IN
0x12364175...01ca6ACD5
0 ETH0.0005768712.37208097
Set Approval For...189067332023-12-31 16:45:59184 days ago1704041159IN
0x12364175...01ca6ACD5
0 ETH0.0008243417.71144883
Set Approval For...189042052023-12-31 8:14:47184 days ago1704010487IN
0x12364175...01ca6ACD5
0 ETH0.0006550314.04835578
Set Approval For...189040592023-12-31 7:45:11184 days ago1704008711IN
0x12364175...01ca6ACD5
0 ETH0.0006772714.52538004
Set Approval For...189040422023-12-31 7:41:47184 days ago1704008507IN
0x12364175...01ca6ACD5
0 ETH0.0005912912.68148629
Set Approval For...189038032023-12-31 6:53:23184 days ago1704005603IN
0x12364175...01ca6ACD5
0 ETH0.0005291611.34882018
Set Approval For...189037372023-12-31 6:40:11184 days ago1704004811IN
0x12364175...01ca6ACD5
0 ETH0.000484610.39595126
Set Approval For...189015552023-12-30 23:19:23185 days ago1703978363IN
0x12364175...01ca6ACD5
0 ETH0.0007563316.22091201
Set Approval For...188959272023-12-30 4:19:35185 days ago1703909975IN
0x12364175...01ca6ACD5
0 ETH0.0007281815.62116995
Set Approval For...188885542023-12-29 3:26:35186 days ago1703820395IN
0x12364175...01ca6ACD5
0 ETH0.0007872216.88336801
Set Approval For...188854142023-12-28 16:52:47187 days ago1703782367IN
0x12364175...01ca6ACD5
0 ETH0.0014949632.12003649
Set Approval For...188570592023-12-24 17:17:59191 days ago1703438279IN
0x12364175...01ca6ACD5
0 ETH0.0010187921.84994037
Set Approval For...188164602023-12-19 0:31:23197 days ago1702945883IN
0x12364175...01ca6ACD5
0 ETH0.002558554.97073236
Set Approval For...188013312023-12-16 21:35:47199 days ago1702762547IN
0x12364175...01ca6ACD5
0 ETH0.0020143943.20237464
Set Approval For...186666402023-11-28 0:46:11218 days ago1701132371IN
0x12364175...01ca6ACD5
0 ETH0.0007174329.12720912
Set Approval For...186261432023-11-22 8:38:59223 days ago1700642339IN
0x12364175...01ca6ACD5
0 ETH0.0012029625.79971886
Set Approval For...186071712023-11-19 16:53:35226 days ago1700412815IN
0x12364175...01ca6ACD5
0 ETH0.0010054621.56399913
Set Approval For...185453632023-11-11 1:17:23235 days ago1699665443IN
0x12364175...01ca6ACD5
0 ETH0.001327328.46636445
Set Approval For...184687102023-10-31 7:45:47245 days ago1698738347IN
0x12364175...01ca6ACD5
0 ETH0.0003699515.01989988
Set Approval For...184687102023-10-31 7:45:47245 days ago1698738347IN
0x12364175...01ca6ACD5
0 ETH0.0003703115.01989988
Set Approval For...184375602023-10-26 23:06:47250 days ago1698361607IN
0x12364175...01ca6ACD5
0 ETH0.0007491416.06670156
Set Approval For...184117432023-10-23 8:20:11253 days ago1698049211IN
0x12364175...01ca6ACD5
0 ETH0.000406458.71705996
View all transactions

Latest 9 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
175431562023-06-23 15:27:35375 days ago1687534055
0x12364175...01ca6ACD5
0.11 ETH
175431552023-06-23 15:27:23375 days ago1687534043
0x12364175...01ca6ACD5
0.05 ETH
175431502023-06-23 15:26:23375 days ago1687533983
0x12364175...01ca6ACD5
0.11 ETH
175431482023-06-23 15:25:59375 days ago1687533959
0x12364175...01ca6ACD5
0.02 ETH
175431462023-06-23 15:25:35375 days ago1687533935
0x12364175...01ca6ACD5
0.13 ETH
175431442023-06-23 15:25:11375 days ago1687533911
0x12364175...01ca6ACD5
0.018 ETH
175431432023-06-23 15:24:59375 days ago1687533899
0x12364175...01ca6ACD5
0.15 ETH
175431412023-06-23 15:24:35375 days ago1687533875
0x12364175...01ca6ACD5
0.04 ETH
175431402023-06-23 15:24:23375 days ago1687533863
0x12364175...01ca6ACD5
0.05 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Robobots

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-22
*/

// File: contracts/tokens/erc721.sol

// SPDX-License-Identifier: MIT AND GPL-3.0
pragma solidity ^0.8.0;

/**
 * @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
  );

  /**
   * @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)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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.
   * @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;

  /**
   * @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.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @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.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the 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);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single 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);

  /**
   * @notice Query if an address is an authorized operator for another 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);

}

// File: contracts/tokens/erc721-token-receiver.sol

pragma solidity ^0.8.0;

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

  /**
   * @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.
   * @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.
   * @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);

}

// File: contracts/utils/erc165.sol

pragma solidity ^0.8.0;

/**
 * @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.
   * 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);
    
}

// File: contracts/utils/supports-interface.sol

pragma solidity ^0.8.0;

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

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    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];
  }

}

// File: contracts/utils/address-utils.sol

pragma solidity ^0.8.0;

/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
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);
  }

}

// File: contracts/tokens/nf-token.sol

pragma solidity ^0.8.0;




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

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_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 receive 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 their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

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

  /**
   * @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_APPROVED_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()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @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)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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.
   * @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);
  }

  /**
   * @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.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @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);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @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 the 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);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single 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];
  }

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

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

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @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.
   * @dev Mints a new NFT.
   * @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);
  }

  /**
   * @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.
   * @dev Burns a 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);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which 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] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which 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] += 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
  {
    delete idToApproval[_tokenId];
  }

}

// File: contracts/tokens/erc721-metadata.sol

pragma solidity ^0.8.0;

/**
 * @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);

}

// File: contracts/NFTokenMetadata.sol

pragma solidity 0.8.6;


/**
 * @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 The baseUri for NFTokens.
     */
    string internal baseUri;

    /**
     * @dev Contract constructor.
     * @notice When implementing, don't forget to set nftName, nftSymbol, and baseUri
     */
    constructor()
    {
        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 concatenated baseURI and _tokenId string.
     */
    function tokenURI(
        uint256 _tokenId
    )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
    {
        return string(abi.encodePacked(baseUri, uint2str(_tokenId)));
    }

    function uint2str(uint _i) internal pure returns (string memory) {
    if (_i == 0) {
        return "0";
    }
    uint j = _i;
    uint length;
    while (j != 0) {
        length++;
        j /= 10;
    }
    bytes memory str = new bytes(length);
    while (_i != 0) {
        str[--length] = bytes1(uint8(48 + _i % 10));
        _i /= 10;
    }
    return string(str);
}

}

// File: contracts/ownership/ownable.sol

pragma solidity ^0.8.0;

/**
 * @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";

  /**
   * @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()
  {
    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;
  }

}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol

// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

// File: contracts/Robobots.sol

pragma solidity 0.8.6;



/**
 * @dev Robobots ERC721 & Marketplace.
 */
contract Robobots is NFTokenMetadata, Ownable {

    using SafeMath for uint256;

    string constant NOT_FOR_SALE = "004001";
    string constant NOT_FOR_SALE_TO_YOU = "004002";
    string constant INSUFFICIENT_VALUE = "004003";
    string constant BID_INFLATION = "004004";
    string constant MISSING_BID = "004005";
    string constant NOT_BIDDER = "004006";
    string constant INTERNAL_INCONSISTENCY = "004007";

    string public constant imageHash = "d4c5e36e00ab8cefae0f3c04ad14f71209e75897a9dd1a3e59a01a51be7dfbf0";
    uint256 public constant totalSupply = 10000;
    uint256 public constant feePercent = 1; // of 100 basis points, or 1%

    struct Offer {
        bool isForSale;
        uint tokenId;
        address seller;
        uint minValue;
        address onlySellTo; // optionally sell only to a specific address
    }

    struct Bid {
        bool hasBid;
        uint tokenId;
        address bidder;
        uint value;
    }

    // A record of tokens that are offered for sale at a minimum value, and optionally to a specific buyer
    mapping (uint => Offer) public offers;
    // A record of the highest bid per token
    mapping (uint => Bid) public bids;
    // Ether stored in the contract until a seller withdraws
    mapping (address => uint) public pendingWithdrawals;

    event PurchaseMade(uint indexed tokenId, uint value, address indexed fromAddress, address indexed toAddress);
    event OfferMade(uint indexed tokenId, uint minValue, address indexed toAddress);
    event OfferRemoved(uint indexed tokenId);
    event BidMade(uint indexed tokenId, uint value, address indexed fromAddress);
    event BidRemoved(uint indexed tokenId, uint value, address indexed fromAddress);

    /**
    * @dev Contract constructor. Sets metadata extension `name` and `symbol`.
    */
    constructor() {
        nftName = "robobots";
        nftSymbol = unicode"🤖";
        baseUri = "https://robobots-f79f8.web.app/metadata/bot";
    }

    function setBaseTokenURI(string calldata _baseUri) external onlyOwner {
        baseUri = _baseUri;
    }

    /**
    * @dev Mints a new NFT.
    * @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) external {
        require(_tokenId < totalSupply, NOT_VALID_NFT); // _tokenId should range from 0 to totalSupply-1
        super._mint(_to, _tokenId);
    }

    /**
    * @dev onlyOwner backdoor to allow multiple mints in one transaction
    * @param _to The addresses that will own a minted NFT.
    * @param _tokenIds to be minted by the msg.sender.
    */
    function mintAll(address[] memory _to, uint256[] memory _tokenIds) external onlyOwner {
        uint n = _to.length;
        for (uint i = 0; i < n; i++) {
            require(_tokenIds[i] < totalSupply, NOT_VALID_NFT);
            super._mint(_to[i], _tokenIds[i]);
        }
    }

    /**
    * @dev Put the token on sale at a minimum sale price.
    * @param _tokenId The token for sale, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted
    */
    function makeOffer(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) {
        offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, address(0));
        emit OfferMade(_tokenId, _minSalePriceInWei, address(0));
    }

    /**
    * @dev Like makeOffer, but the token may only be bought from a specific address.
    * @param _tokenId The token for sale, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted
    * @param _toAddress the only allowed buyer
    */
    function makeOfferToAddress(uint256 _tokenId, uint _minSalePriceInWei, address _toAddress) external canOperate(_tokenId) {
        offers[_tokenId] = Offer(true, _tokenId, msg.sender, _minSalePriceInWei, _toAddress);
        emit OfferMade(_tokenId, _minSalePriceInWei, _toAddress);
    }

    /**
    * @dev Remove the offer for this token.
    * @param _tokenId The token (previously) for sale, operated by msg.sender
    */
    function withdrawOffer(uint256 _tokenId) external canOperate(_tokenId) {
        _removeOffer(_tokenId);
    }

    /**
    * @dev Buy the token at the minimum sale price.
    * @param _tokenId The token for sale
    */
    function buy(uint256 _tokenId) external payable {
        // check that this is a valid purchase attempt
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        Offer memory offer = offers[_tokenId];
        require(offer.isForSale, NOT_FOR_SALE);
        require(offer.onlySellTo == address(0) || offer.onlySellTo == msg.sender, NOT_FOR_SALE_TO_YOU);
        require(msg.value >= offer.minValue, INSUFFICIENT_VALUE);
        address seller = offer.seller;
        require(seller == idToOwner[_tokenId], INTERNAL_INCONSISTENCY);

        // make the Transfer
        _transfer(msg.sender, _tokenId);


        // collect fee, and make proceeds available to seller
        uint256 fee = (msg.value.mul(feePercent)).div(100);
        uint256 proceeds = msg.value - fee;
        pendingWithdrawals[owner] += fee;
        pendingWithdrawals[seller] += proceeds;
        emit PurchaseMade(_tokenId, msg.value, seller, msg.sender);

        // Check for the case where there is a bid from the new owner and refund it.
        // Any other bid can stay in place.
        Bid memory bid = bids[_tokenId];
        if (bid.bidder == msg.sender) {
            // Delete bid and refund value
            pendingWithdrawals[msg.sender] += bid.value;
            _removeBid(_tokenId);
        }
    }

    /**
    * @dev Remove funds from this contract, after a sale and/or a withdrawn bid.
    */
    function withdrawFunds() external {
        uint amount = pendingWithdrawals[msg.sender];
        // Zero the pending refund before sending to prevent re-entrancy attacks
        pendingWithdrawals[msg.sender] = 0;
        payable(msg.sender).transfer(amount);
    }

    /**
    * @dev Make a bid for the token with msg.value.
    * @param _tokenId The coveted token
    */
    function makeBid(uint256 _tokenId) external payable {
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        require(idToOwner[_tokenId] != address(0), ZERO_ADDRESS);
        require(idToOwner[_tokenId] != msg.sender, BID_INFLATION);
        Bid memory existingBid = bids[_tokenId];
        require(msg.value > existingBid.value, INSUFFICIENT_VALUE);
        if (existingBid.value > 0) {
            pendingWithdrawals[existingBid.bidder] += existingBid.value; // refund the outbid bidder
        }
        bids[_tokenId] = Bid(true, _tokenId, msg.sender, msg.value);
        emit BidMade(_tokenId, msg.value, msg.sender);
    }

    /**
    * @dev Accept the highest bid, assuming a minimum sale price.
    * @param _tokenId The coveted token, operated by msg.sender
    * @param _minSalePriceInWei the minimum payment accepted, ensuring the bid has not just been reduced.
    */
    function acceptBid(uint256 _tokenId, uint _minSalePriceInWei) external canOperate(_tokenId) {
        address seller = msg.sender;
        Bid memory bid = bids[_tokenId];
        require(bid.hasBid, MISSING_BID);
        require(bid.value > 0, INTERNAL_INCONSISTENCY);
        require(bid.value >= _minSalePriceInWei, INSUFFICIENT_VALUE);

        // make the Transfer
        _transfer(bid.bidder, _tokenId);

        uint amount = bid.value;
        _removeBid(_tokenId);

        // collect fee, and make proceeds available to seller
        uint256 fee = (amount.mul(feePercent)).div(100);
        uint256 proceeds = amount - fee;
        pendingWithdrawals[owner] += fee;
        pendingWithdrawals[seller] += proceeds;
        emit PurchaseMade(_tokenId, bid.value, seller, bid.bidder);
    }

    /**
    * @dev Withdraw the bid for this token.
    * @param _tokenId The (once-)coveted token
    */
    function withdrawBid(uint256 _tokenId) external {
        require(_tokenId < totalSupply, NOT_VALID_NFT);
        require(idToOwner[_tokenId] != msg.sender, BID_INFLATION);
        Bid memory bid = bids[_tokenId];
        require(bid.bidder == msg.sender, NOT_BIDDER);
        uint amount = bid.value;
        _removeBid(_tokenId);
        // Refund the bid money
        payable(msg.sender).transfer(amount);
    }

    function _removeOffer(uint256 _tokenId) internal {
        if (offers[_tokenId].isForSale) {
            offers[_tokenId] = Offer(false, _tokenId, address(0), 0, address(0));
            emit OfferRemoved(_tokenId);
        }
    }

    function _removeBid(uint256 _tokenId) internal {
        Bid memory bid = bids[_tokenId];
        bids[_tokenId] = Bid(false, 0, address(0), 0);
        emit BidRemoved(_tokenId, bid.value, bid.bidder);
    }

    /**
    * @dev Transfers the ownership of an NFT from one address to another address.
    * Removes any existing offer for the token when ownership changes.
    * @param _to The new owner.
    * @param _tokenId The NFT to transfer.
    */
function _transfer(address _to, uint256 _tokenId) internal override {
    super._transfer(_to, _tokenId);
    _removeOffer(_tokenId);
}
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"BidRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OfferRemoved","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PurchaseMade","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":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"bids","outputs":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imageHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"makeBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_minSalePriceInWei","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"}],"name":"makeOfferToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mintAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"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":"","type":"address"}],"name":"pendingWithdrawals","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":"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":"string","name":"_baseUri","type":"string"}],"name":"setBaseTokenURI","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":"_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":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawOffer","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f726f626f626f747300000000000000000000000000000000000000000000000081525060059080519060200190620001939291906200021a565b506040518060400160405280600481526020017ff09fa4960000000000000000000000000000000000000000000000000000000081525060069080519060200190620001e19291906200021a565b506040518060600160405280602b815260200162005e78602b913960079080519060200190620002139291906200021a565b506200032f565b8280546200022890620002ca565b90600052602060002090601f0160209004810192826200024c576000855562000298565b82601f106200026757805160ff191683800117855562000298565b8280016001018555821562000298579182015b82811115620002975782518255916020019190600101906200027a565b5b509050620002a79190620002ab565b5090565b5b80821115620002c6576000816000905550600101620002ac565b5090565b60006002820490506001821680620002e357607f821691505b60208210811415620002fa57620002f962000300565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b39806200033f6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c6343000806003368747470733a2f2f726f626f626f74732d66373966382e7765622e6170702f6d657461646174612f626f74

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063ae0b61ba116100a0578063d96a094a1161006f578063d96a094a14610725578063e985e9c514610741578063f2fde38b1461077e578063f3f43703146107a7578063f3fe3bc3146107e4576101f9565b8063ae0b61ba1461066d578063b88d4fde14610696578063c87b56dd146106bf578063c99fef70146106fc576101f9565b80638a72ea6a116100dc5780638a72ea6a146105ad5780638da5cb5b146105ee57806395d89b4114610619578063a22cb46514610644576101f9565b806370a08231146104f15780637fd6f15c1461052e578063860d248a146105595780638610f04514610584576101f9565b806318160ddd1161019057806340c10f191161015f57806340c10f19146103f757806342842e0e146104205780634423c5f11461044957806351605d80146104895780636352211e146104b4576101f9565b806318160ddd1461036357806323b872dd1461038e57806324600fc3146103b757806330176e13146103ce576101f9565b8063081812fc116101cc578063081812fc146102b8578063095ea7b3146102f55780630eaaf4c81461031e578063175b230414610347576101f9565b806301ffc9a7146101fe57806302e9d5e41461023b57806305b7cdd31461026457806306fdde031461028d575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190615189565b61080f565b60405161023291906154ca565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061525d565b610876565b005b34801561027057600080fd5b5061028b6004803603810190610286919061525d565b610db2565b005b34801561029957600080fd5b506102a26110a8565b6040516102af919061557d565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da9190615230565b61113a565b6040516102ec9190615463565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906150d1565b611255565b005b34801561032a57600080fd5b5061034560048036038101906103409190615230565b611638565b005b610361600480360381019061035c9190615230565b611940565b005b34801561036f57600080fd5b50610378611e24565b604051610385919061559f565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190614fb6565b611e2a565b005b3480156103c357600080fd5b506103cc61227c565b005b3480156103da57600080fd5b506103f560048036038101906103f091906151e3565b61234f565b005b34801561040357600080fd5b5061041e600480360381019061041991906150d1565b61242e565b005b34801561042c57600080fd5b5061044760048036038101906104429190614fb6565b6124b9565b005b34801561045557600080fd5b50610470600480360381019061046b9190615230565b6124d9565b60405161048094939291906154e5565b60405180910390f35b34801561049557600080fd5b5061049e612536565b6040516104ab919061557d565b60405180910390f35b3480156104c057600080fd5b506104db60048036038101906104d69190615230565b612552565b6040516104e89190615463565b60405180910390f35b3480156104fd57600080fd5b5061051860048036038101906105139190614f49565b612638565b604051610525919061559f565b60405180910390f35b34801561053a57600080fd5b506105436126f2565b604051610550919061559f565b60405180910390f35b34801561056557600080fd5b5061056e6126f7565b60405161057b919061557d565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a69190615230565b612730565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190615230565b6128af565b6040516105e595949392919061552a565b60405180910390f35b3480156105fa57600080fd5b50610603612932565b6040516106109190615463565b60405180910390f35b34801561062557600080fd5b5061062e612958565b60405161063b919061557d565b60405180910390f35b34801561065057600080fd5b5061066b60048036038101906106669190615091565b6129ea565b005b34801561067957600080fd5b50610694600480360381019061068f9190615111565b612ae7565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190615009565b612caf565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190615230565b612d06565b6040516106f3919061557d565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e919061529d565b612e18565b005b61073f600480360381019061073a9190615230565b61310d565b005b34801561074d57600080fd5b5061076860048036038101906107639190614f76565b613811565b60405161077591906154ca565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190614f49565b6138a5565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190614f49565b613ad7565b6040516107db919061559f565b60405180910390f35b3480156107f057600080fd5b506107f9613aef565b604051610806919061557d565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061096f5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd919061557d565b60405180910390fd5b5060003390506000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481525050905080600001516040518060400160405280600681526020017f303034303035000000000000000000000000000000000000000000000000000081525090610b0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b06919061557d565b60405180910390fd5b5060008160600151116040518060400160405280600681526020017f303034303037000000000000000000000000000000000000000000000000000081525090610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86919061557d565b60405180910390fd5b5084816060015110156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06919061557d565b60405180910390fd5b50610c1e816040015187613b28565b600081606001519050610c3087613b3f565b6000610c596064610c4b600185613d0f90919063ffffffff16565b613d2590919063ffffffff16565b905060008183610c699190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610cdc919061568f565b9250508190555080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d32919061568f565b92505081905550836040015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a7fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd7968760600151604051610d9f919061559f565b60405180910390a4505050505050505050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610eab5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018581526020013373ffffffffffffffffffffffffffffffffffffffff168152602001848152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600073ffffffffffffffffffffffffffffffffffffffff16847f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc18560405161109a919061559f565b60405180910390a350505050565b6060600580546110b790615875565b80601f01602080910402602001604051908101604052809291908181526020018280546110e390615875565b80156111305780601f1061110557610100808354040283529160200191611130565b820191906000526020600020905b81548152906001019060200180831161111357829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120f919061557d565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061134e5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bc919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906114a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611499919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579919061557d565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906116b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ab919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303430303400000000000000000000000000000000000000000000000000008152509061178f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611786919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030343030360000000000000000000000000000000000000000000000000000815250906118e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d8919061557d565b60405180910390fd5b506000816060015190506118f483613b3f565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561193a573d6000803e3d6000fd5b50505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f919061557d565b60405180910390fd5b503373ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303034303034000000000000000000000000000000000000000000000000000081525090611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a919061557d565b60405180910390fd5b506000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050806060015134116040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c90919061557d565b60405180910390fd5b50600081606001511115611d06578060600151600b6000836040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfe919061568f565b925050819055505b60405180608001604052806001151581526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815260200134815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301559050503373ffffffffffffffffffffffffffffffffffffffff16827f2db9bd3d5e680e2159753ffc16e1709fb0e786ca24553a511f64e3c6a7d4b70a34604051611e18919061559f565b60405180910390a35050565b61271081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611efb57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80611f8c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa919061557d565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7919061557d565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906121bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b6919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225f919061557d565b60405180910390fd5b506122738686613b28565b50505050505050565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561234b573d6000803e3d6000fd5b5050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e919061557d565b60405180910390fd5b50818160079190612429929190614c55565b505050565b61271081106040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1919061557d565b60405180910390fd5b506124b58282613d3b565b5050565b6124d483838360405180602001604052806000815250613f29565b505050565b600a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905084565b604051806060016040528060408152602001615ac46040913981565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612629919061557d565b60405180910390fd5b50919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d8919061557d565b60405180910390fd5b506126eb826144f7565b9050919050565b600181565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806128295750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906128a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612897919061557d565b60405180910390fd5b506128aa83614540565b505050565b60096020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905085565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606006805461296790615875565b80601f016020809104026020016040519081016040528092919081815260200182805461299390615875565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612adb91906154ca565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba6919061557d565b60405180910390fd5b5060008251905060005b81811015612ca957612710838281518110612bd757612bd66159df565b5b6020026020010151106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4e919061557d565b60405180910390fd5b50612c96848281518110612c6e57612c6d6159df565b5b6020026020010151848381518110612c8957612c886159df565b5b6020026020010151613d3b565b8080612ca1906158d8565b915050612bb9565b50505050565b612cff85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613f29565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb919061557d565b60405180910390fd5b506007612df0846146cb565b604051602001612e0192919061543f565b604051602081830303815290604052915050919050565b8260006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612f115750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090612f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7f919061557d565b60405180910390fd5b506040518060a001604052806001151581526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff168152506009600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508273ffffffffffffffffffffffffffffffffffffffff16857f53658d2ac4988b1c671f54219e366b4c7cdebdbfd92fd0762b1524d9abbc5cc1866040516130fe919061559f565b60405180910390a35050505050565b61271081106040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090613189576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613180919061557d565b60405180910390fd5b506000600960008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905080600001516040518060400160405280600681526020017f303034303031000000000000000000000000000000000000000000000000000081525090613303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fa919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16148061337257503373ffffffffffffffffffffffffffffffffffffffff16816080015173ffffffffffffffffffffffffffffffffffffffff16145b6040518060400160405280600681526020017f3030343030320000000000000000000000000000000000000000000000000000815250906133e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e0919061557d565b60405180910390fd5b5080606001513410156040518060400160405280600681526020017f303034303033000000000000000000000000000000000000000000000000000081525090613469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613460919061557d565b60405180910390fd5b506000816040015190506001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303430303700000000000000000000000000000000000000000000000000008152509061354c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613543919061557d565b60405180910390fd5b506135573384613b28565b60006135806064613572600134613d0f90919063ffffffff16565b613d2590919063ffffffff16565b9050600081346135909190615770565b905081600b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613603919061568f565b9250508190555080600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613659919061568f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16867fb04d24cdcf6af8f0958f4d472da766e8b3f6ff75a3b24b3658f9bfa7c30dd796346040516136be919061559f565b60405180910390a46000600a60008781526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415613809578060600151600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137f8919061568f565b9250508190555061380886613b3f565b5b505050505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061396d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613964919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525090613a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0d919061557d565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915090505481565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b613b328282614829565b613b3b81614540565b5050565b6000600a60008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815250509050604051806080016040528060001515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600a600084815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155905050806040015173ffffffffffffffffffffffffffffffffffffffff16827f4a096bfd874de7130bbce9d6635f0a77646b227b594b1b1b34d174e05be363dc8360600151604051613d03919061559f565b60405180910390a35050565b60008183613d1d9190615716565b905092915050565b60008183613d3391906156e5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090613de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dda919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb5919061557d565b60405180910390fd5b50613ec982826148de565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480613ffa57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061408b5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090614102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f9919061557d565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030320000000000000000000000000000000000000000000000000000815250906141df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141d6919061557d565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030370000000000000000000000000000000000000000000000000000815250906142be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016142b5919061557d565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090614367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161435e919061557d565b60405180910390fd5b506143728787613b28565b6143918773ffffffffffffffffffffffffffffffffffffffff16614a66565b156144ed5760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b81526004016143d7949392919061547e565b602060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442991906151b6565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906144ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016144e1919061557d565b60405180910390fd5b50505b5050505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6009600082815260200190815260200160002060000160009054906101000a900460ff16156146c8576040518060a00160405280600015158152602001828152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152506009600083815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050807fe78251393d13c4f887458774ea505a80414b5608a0c963bb2e75da45811919f160405160405180910390a25b50565b60606000821415614713576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614824565b600082905060005b6000821461474557808061472e906158d8565b915050600a8261473e91906156e5565b915061471b565b60008167ffffffffffffffff81111561476157614760615a0e565b5b6040519080825280601f01601f1916602001820160405280156147935781602001600182028036833780820191505090505b5090505b6000851461481d57600a856147ac9190615921565b60306147b8919061568f565b60f81b81836147c69061584b565b935083815181106147da576147d96159df565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561481691906156e5565b9450614797565b8093505050505b919050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061486a82614ab1565b6148748183614aea565b61487e83836148de565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906149b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149af919061557d565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614a5b919061568f565b925050819055505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b8214158015614aa85750808214155b92505050919050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090614bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614bba919061557d565b60405180910390fd5b506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614c149190615770565b925050819055506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050565b828054614c6190615875565b90600052602060002090601f016020900481019282614c835760008555614cca565b82601f10614c9c57803560ff1916838001178555614cca565b82800160010185558215614cca579182015b82811115614cc9578235825591602001919060010190614cae565b5b509050614cd79190614cdb565b5090565b5b80821115614cf4576000816000905550600101614cdc565b5090565b6000614d0b614d06846155df565b6155ba565b90508083825260208201905082856020860282011115614d2e57614d2d615a47565b5b60005b85811015614d5e5781614d448882614dd8565b845260208401935060208301925050600181019050614d31565b5050509392505050565b6000614d7b614d768461560b565b6155ba565b90508083825260208201905082856020860282011115614d9e57614d9d615a47565b5b60005b85811015614dce5781614db48882614f34565b845260208401935060208301925050600181019050614da1565b5050509392505050565b600081359050614de781615a67565b92915050565b600082601f830112614e0257614e01615a42565b5b8135614e12848260208601614cf8565b91505092915050565b600082601f830112614e3057614e2f615a42565b5b8135614e40848260208601614d68565b91505092915050565b600081359050614e5881615a7e565b92915050565b600081359050614e6d81615a95565b92915050565b600081519050614e8281615a95565b92915050565b60008083601f840112614e9e57614e9d615a42565b5b8235905067ffffffffffffffff811115614ebb57614eba615a3d565b5b602083019150836001820283011115614ed757614ed6615a47565b5b9250929050565b60008083601f840112614ef457614ef3615a42565b5b8235905067ffffffffffffffff811115614f1157614f10615a3d565b5b602083019150836001820283011115614f2d57614f2c615a47565b5b9250929050565b600081359050614f4381615aac565b92915050565b600060208284031215614f5f57614f5e615a51565b5b6000614f6d84828501614dd8565b91505092915050565b60008060408385031215614f8d57614f8c615a51565b5b6000614f9b85828601614dd8565b9250506020614fac85828601614dd8565b9150509250929050565b600080600060608486031215614fcf57614fce615a51565b5b6000614fdd86828701614dd8565b9350506020614fee86828701614dd8565b9250506040614fff86828701614f34565b9150509250925092565b60008060008060006080868803121561502557615024615a51565b5b600061503388828901614dd8565b955050602061504488828901614dd8565b945050604061505588828901614f34565b935050606086013567ffffffffffffffff81111561507657615075615a4c565b5b61508288828901614e88565b92509250509295509295909350565b600080604083850312156150a8576150a7615a51565b5b60006150b685828601614dd8565b92505060206150c785828601614e49565b9150509250929050565b600080604083850312156150e8576150e7615a51565b5b60006150f685828601614dd8565b925050602061510785828601614f34565b9150509250929050565b6000806040838503121561512857615127615a51565b5b600083013567ffffffffffffffff81111561514657615145615a4c565b5b61515285828601614ded565b925050602083013567ffffffffffffffff81111561517357615172615a4c565b5b61517f85828601614e1b565b9150509250929050565b60006020828403121561519f5761519e615a51565b5b60006151ad84828501614e5e565b91505092915050565b6000602082840312156151cc576151cb615a51565b5b60006151da84828501614e73565b91505092915050565b600080602083850312156151fa576151f9615a51565b5b600083013567ffffffffffffffff81111561521857615217615a4c565b5b61522485828601614ede565b92509250509250929050565b60006020828403121561524657615245615a51565b5b600061525484828501614f34565b91505092915050565b6000806040838503121561527457615273615a51565b5b600061528285828601614f34565b925050602061529385828601614f34565b9150509250929050565b6000806000606084860312156152b6576152b5615a51565b5b60006152c486828701614f34565b93505060206152d586828701614f34565b92505060406152e686828701614dd8565b9150509250925092565b6152f9816157a4565b82525050565b615308816157b6565b82525050565b60006153198261564c565b6153238185615662565b9350615333818560208601615818565b61533c81615a56565b840191505092915050565b600061535282615657565b61535c8185615673565b935061536c818560208601615818565b61537581615a56565b840191505092915050565b600061538b82615657565b6153958185615684565b93506153a5818560208601615818565b80840191505092915050565b600081546153be81615875565b6153c88186615684565b945060018216600081146153e357600181146153f457615427565b60ff19831686528186019350615427565b6153fd85615637565b60005b8381101561541f57815481890152600182019150602081019050615400565b838801955050505b50505092915050565b6154398161580e565b82525050565b600061544b82856153b1565b91506154578284615380565b91508190509392505050565b600060208201905061547860008301846152f0565b92915050565b600060808201905061549360008301876152f0565b6154a060208301866152f0565b6154ad6040830185615430565b81810360608301526154bf818461530e565b905095945050505050565b60006020820190506154df60008301846152ff565b92915050565b60006080820190506154fa60008301876152ff565b6155076020830186615430565b61551460408301856152f0565b6155216060830184615430565b95945050505050565b600060a08201905061553f60008301886152ff565b61554c6020830187615430565b61555960408301866152f0565b6155666060830185615430565b61557360808301846152f0565b9695505050505050565b600060208201905081810360008301526155978184615347565b905092915050565b60006020820190506155b46000830184615430565b92915050565b60006155c46155d5565b90506155d082826158a7565b919050565b6000604051905090565b600067ffffffffffffffff8211156155fa576155f9615a0e565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561562657615625615a0e565b5b602082029050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061569a8261580e565b91506156a58361580e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156da576156d9615952565b5b828201905092915050565b60006156f08261580e565b91506156fb8361580e565b92508261570b5761570a615981565b5b828204905092915050565b60006157218261580e565b915061572c8361580e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561576557615764615952565b5b828202905092915050565b600061577b8261580e565b91506157868361580e565b92508282101561579957615798615952565b5b828203905092915050565b60006157af826157ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561583657808201518184015260208101905061581b565b83811115615845576000848401525b50505050565b60006158568261580e565b9150600082141561586a57615869615952565b5b600182039050919050565b6000600282049050600182168061588d57607f821691505b602082108114156158a1576158a06159b0565b5b50919050565b6158b082615a56565b810181811067ffffffffffffffff821117156158cf576158ce615a0e565b5b80604052505050565b60006158e38261580e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561591657615915615952565b5b600182019050919050565b600061592c8261580e565b91506159378361580e565b92508261594757615946615981565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b615a70816157a4565b8114615a7b57600080fd5b50565b615a87816157b6565b8114615a9257600080fd5b50565b615a9e816157c2565b8114615aa957600080fd5b50565b615ab58161580e565b8114615ac057600080fd5b5056fe64346335653336653030616238636566616530663363303461643134663731323039653735383937613964643161336535396130316135316265376466626630a2646970667358221220be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d64736f6c63430008060033

Deployed Bytecode Sourcemap

35492:9405:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8932:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42679:818;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25531:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18443:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16228:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43615:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41767:648;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36035:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15454:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41377:271;;;;;;;;;;;;;:::i;:::-;;37519:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37806:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14699:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36679:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35927:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17991:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17517:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36085:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27248:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39715:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36589:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;27368:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25785:136;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16991:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38226:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14079:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26111:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39275:291;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39947:1323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18895:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28193:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36781:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27192;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8932:172;9042:4;9065:19;:33;9085:12;9065:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9058:40;;8932:172;;;:::o;42679:818::-;42761:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42782:14:::1;42799:10;42782:27;;42820:14;42837:4;:14;42842:8;42837:14;;;;;;;;;;;42820:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;42870:3;:10;;;42882:11;;;;;;;;;;;;;;;;::::0;42862:32:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42925:1;42913:3;:9;;;:13;42928:22;;;;;;;;;;;;;;;;::::0;42905:46:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42983:18;42970:3;:9;;;:31;;43003:18;;;;;;;;;;;;;;;;::::0;42962:60:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43065:31;43075:3;:10;;;43087:8;43065:9;:31::i;:::-;43109:11;43123:3;:9;;;43109:23;;43143:20;43154:8;43143:10;:20::i;:::-;43239:11;43253:33;43282:3;43254:22;36122:1;43254:6;:10;;:22;;;;:::i;:::-;43253:28;;:33;;;;:::i;:::-;43239:47;;43297:16;43325:3;43316:6;:12;;;;:::i;:::-;43297:31;;43368:3;43339:18;:25;43358:5;;;;;;;;;;;43339:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;43412:8;43382:18;:26;43401:6;43382:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;43478:3;:10;;;43436:53;;43470:6;43436:53;;43449:8;43436:53;43459:3;:9;;;43436:53;;;;;;:::i;:::-;;;;;;;;42771:726;;;;;12188:189:::0;42679:818;;;:::o;38726:262::-;38808:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38848:65:::1;;;;;;;;38854:4;38848:65;;;;;;38860:8;38848:65;;;;38870:10;38848:65;;;;;;38882:18;38848:65;;;;38910:1;38848:65;;;;::::0;38829:6:::1;:16;38836:8;38829:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38977:1;38929:51;;38939:8;38929:51;38949:18;38929:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;38726:262;;;:::o;25531:128::-;25599:19;25644:7;25636:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25531:128;:::o;18443:183::-;18572:7;18548:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;18598:12:::1;:22;18611:8;18598:22;;;;;;;;;;;;;;;;;;;;;18591:29;;18443:183:::0;;;;:::o;16228:352::-;16341:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16369:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16389:18:::2;16410:9;:19;16420:8;16410:19;;;;;;;;;;;;;;;;;;;;;16389:40;;16457:10;16444:23;;:9;:23;;;;16469:8;;;;;;;;;;;;;;;;::::0;16436:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;16512:9;16487:12;:22;16500:8;16487:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;16565:8;16554:9;16533:41;;16542:10;16533:41;;;;;;;;;;;;16382:198;12370:1:::1;12188:189:::0;16228:352;;;:::o;43615:424::-;36073:5;43682:8;:22;43706:13;;;;;;;;;;;;;;;;;43674:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43762:10;43739:33;;:9;:19;43749:8;43739:19;;;;;;;;;;;;;;;;;;;;;:33;;;;43774:13;;;;;;;;;;;;;;;;;43731:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43799:14;43816:4;:14;43821:8;43816:14;;;;;;;;;;;43799:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43863:10;43849:24;;:3;:10;;;:24;;;43875:10;;;;;;;;;;;;;;;;;43841:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43897:11;43911:3;:9;;;43897:23;;43931:20;43942:8;43931:10;:20::i;:::-;44003:10;43995:28;;:36;44024:6;43995:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43663:376;;43615:424;:::o;41767:648::-;36073:5;41838:8;:22;41862:13;;;;;;;;;;;;;;;;;41830:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41926:1;41895:33;;:9;:19;41905:8;41895:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41930:12;;;;;;;;;;;;;;;;;41887:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41985:10;41962:33;;:9;:19;41972:8;41962:19;;;;;;;;;;;;;;;;;;;;;:33;;;;41997:13;;;;;;;;;;;;;;;;;41954:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42022:22;42047:4;:14;42052:8;42047:14;;;;;;;;;;;42022:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:11;:17;;;42080:9;:29;42111:18;;;;;;;;;;;;;;;;;42072:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42165:1;42145:11;:17;;;:21;42141:141;;;42225:11;:17;;;42183:18;:38;42202:11;:18;;;42183:38;;;;;;;;;;;;;;;;:59;;;;;;;:::i;:::-;;;;;;;;42141:141;42309:42;;;;;;;;42313:4;42309:42;;;;;;42319:8;42309:42;;;;42329:10;42309:42;;;;;;42341:9;42309:42;;;42292:4;:14;42297:8;42292:14;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42396:10;42367:40;;42375:8;42367:40;42385:9;42367:40;;;;;;:::i;:::-;;;;;;;;41819:596;41767:648;:::o;36035:43::-;36073:5;36035:43;:::o;15454:353::-;15587:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15615:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15635:18:::2;15656:9;:19;15666:8;15656:19;;;;;;;;;;;;;;;;;;;;;15635:40;;15704:5;15690:19;;:10;:19;;;15711:9;;;;;;;;;;;;;;;;::::0;15682:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15751:1;15736:17;;:3;:17;;;;15755:12;;;;;;;;;;;;;;;;::::0;15728:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;15777:24;15787:3;15792:8;15777:9;:24::i;:::-;15628:179;12813:1:::1;12568:252:::0;15454:353;;;;:::o;41377:271::-;41422:11;41436:18;:30;41455:10;41436:30;;;;;;;;;;;;;;;;41422:44;;41592:1;41559:18;:30;41578:10;41559:30;;;;;;;;;;;;;;;:34;;;;41612:10;41604:28;;:36;41633:6;41604:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41411:237;41377:271::o;37519:107::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37610:8:::1;;37600:7;:18;;;;;;;:::i;:::-;;37519:107:::0;;:::o;37806:205::-;36073:5;37879:8;:22;37903:13;;;;;;;;;;;;;;;;;37871:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;37977:26;37989:3;37994:8;37977:11;:26::i;:::-;37806:205;;:::o;14699:179::-;14829:43;14847:5;14854:3;14859:8;14829:43;;;;;;;;;;;;:17;:43::i;:::-;14699:179;;;:::o;36679:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35927:101::-;;;;;;;;;;;;;;;;;;;:::o;17991:208::-;18088:14;18123:9;:19;18133:8;18123:19;;;;;;;;;;;;;;;;;;;;;18114:28;;18175:1;18157:20;;:6;:20;;;;18179:13;;;;;;;;;;;;;;;;;18149:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17991:208;;;:::o;17517:204::-;17614:7;17659:1;17641:20;;:6;:20;;;;17663:12;;;;;;;;;;;;;;;;;17633:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17690:25;17708:6;17690:17;:25::i;:::-;17683:32;;17517:204;;;:::o;36085:38::-;36122:1;36085:38;:::o;27248:65::-;;;;;;;;;;;;;;;;;;;:::o;39715:112::-;39776:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39797:22:::1;39810:8;39797:12;:22::i;:::-;12188:189:::0;39715:112;;:::o;36589:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27368:20::-;;;;;;;;;;;;;:::o;25785:136::-;25855:21;25904:9;25894:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25785:136;:::o;16991:232::-;17148:9;17106:16;:28;17123:10;17106:28;;;;;;;;;;;;;;;:39;17135:9;17106:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;17196:9;17169:48;;17184:10;17169:48;;;17207:9;17169:48;;;;;;:::i;:::-;;;;;;;;16991:232;;:::o;38226:288::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38323:6:::1;38332:3;:10;38323:19;;38358:6;38353:154;38374:1;38370;:5;38353:154;;;36073:5;38405:9;38415:1;38405:12;;;;;;;;:::i;:::-;;;;;;;;:26;38433:13;;;;;;;;;;;;;;;;::::0;38397:50:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38462:33;38474:3;38478:1;38474:6;;;;;;;;:::i;:::-;;;;;;;;38482:9;38492:1;38482:12;;;;;;;;:::i;:::-;;;;;;;;38462:11;:33::i;:::-;38377:3;;;;;:::i;:::-;;;;38353:154;;;;38312:202;38226:288:::0;;:::o;14079:209::-;14236:46;14254:5;14261:3;14266:8;14276:5;;14236:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;14079:209;;;;;:::o;26111:231::-;26243:13;26219:8;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;;13003:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;26305:7:::1;26314:18;26323:8;26314;:18::i;:::-;26288:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26274:60;;26111:231:::0;;;;:::o;39275:291::-;39386:8;12195:18;12216:9;:19;12226:8;12216:19;;;;;;;;;;;;;;;;;;;;;12195:40;;12272:10;12258:24;;:10;:24;;;:68;;;;12286:16;:28;12303:10;12286:28;;;;;;;;;;;;;;;:40;12315:10;12286:40;;;;;;;;;;;;;;;;;;;;;;;;;12258:68;12335:21;;;;;;;;;;;;;;;;;12242:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39426:65:::1;;;;;;;;39432:4;39426:65;;;;;;39438:8;39426:65;;;;39448:10;39426:65;;;;;;39460:18;39426:65;;;;39480:10;39426:65;;;;::::0;39407:6:::1;:16;39414:8;39407:16;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39547:10;39507:51;;39517:8;39507:51;39527:18;39507:51;;;;;;:::i;:::-;;;;;;;;12188:189:::0;39275:291;;;;:::o;39947:1323::-;36073:5;40070:8;:22;40094:13;;;;;;;;;;;;;;;;;40062:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40119:18;40140:6;:16;40147:8;40140:16;;;;;;;;;;;40119:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40175:5;:15;;;40192:12;;;;;;;;;;;;;;;;;40167:38;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40252:1;40224:30;;:5;:16;;;:30;;;:64;;;;40278:10;40258:30;;:5;:16;;;:30;;;40224:64;40290:19;;;;;;;;;;;;;;;;;40216:94;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40342:5;:14;;;40329:9;:27;;40358:18;;;;;;;;;;;;;;;;;40321:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40388:14;40405:5;:12;;;40388:29;;40446:9;:19;40456:8;40446:19;;;;;;;;;;;;;;;;;;;;;40436:29;;:6;:29;;;40467:22;;;;;;;;;;;;;;;;;40428:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;40533:31;40543:10;40555:8;40533:9;:31::i;:::-;40642:11;40656:36;40688:3;40657:25;36122:1;40657:9;:13;;:25;;;;:::i;:::-;40656:31;;:36;;;;:::i;:::-;40642:50;;40703:16;40734:3;40722:9;:15;;;;:::i;:::-;40703:34;;40777:3;40748:18;:25;40767:5;;;;;;;;;;;40748:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40821:8;40791:18;:26;40810:6;40791:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;40887:10;40845:53;;40879:6;40845:53;;40858:8;40845:53;40868:9;40845:53;;;;;;:::i;:::-;;;;;;;;41042:14;41059:4;:14;41064:8;41059:14;;;;;;;;;;;41042:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41102:10;41088:24;;:3;:10;;;:24;;;41084:179;;;41207:3;:9;;;41173:18;:30;41192:10;41173:30;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;41231:20;41242:8;41231:10;:20::i;:::-;41084:179;39995:1275;;;;;39947:1323;:::o;18895:192::-;19023:4;19046:16;:24;19063:6;19046:24;;;;;;;;;;;;;;;:35;19071:9;19046:35;;;;;;;;;;;;;;;;;;;;;;;;;19039:42;;18895:192;;;;:::o;28193:238::-;27986:5;;;;;;;;;;;27972:19;;:10;:19;;;27993:17;;;;;;;;;;;;;;;;;27964:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28315:1:::1;28294:23;;:9;:23;;;;28319:31;;;;;;;;;;;;;;;;::::0;28286:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;28391:9;28363:38;;28384:5;;;;;;;;;;;28363:38;;;;;;;;;;;;28416:9;28408:5;;:17;;;;;;;;;;;;;;;;;;28193:238:::0;:::o;36781:51::-;;;;;;;;;;;;;;;;;:::o;27192:::-;;;;;;;;;;;;;;;;;;;:::o;44756:138::-;44831:30;44847:3;44852:8;44831:15;:30::i;:::-;44868:22;44881:8;44868:12;:22::i;:::-;44756:138;;:::o;44291:212::-;44349:14;44366:4;:14;44371:8;44366:14;;;;;;;;;;;44349:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44408:28;;;;;;;;44412:5;44408:28;;;;;;44419:1;44408:28;;;;44430:1;44408:28;;;;;;44434:1;44408:28;;;44391:4;:14;44396:8;44391:14;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44484:3;:10;;;44452:43;;44463:8;44452:43;44473:3;:9;;;44452:43;;;;;;:::i;:::-;;;;;;;;44338:165;44291:212;:::o;32052:98::-;32110:7;32141:1;32137;:5;;;;:::i;:::-;32130:12;;32052:98;;;;:::o;32451:::-;32509:7;32540:1;32536;:5;;;;:::i;:::-;32529:12;;32451:98;;;;:::o;19957:297::-;20078:1;20063:17;;:3;:17;;;;20082:12;;;;;;;;;;;;;;;;;20055:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20141:1;20110:33;;:9;:19;20120:8;20110:19;;;;;;;;;;;;;;;;;;;;;:33;;;20145:18;;;;;;;;;;;;;;;;;20102:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;20173:26;20185:3;20190:8;20173:11;:26::i;:::-;20239:8;20234:3;20213:35;;20230:1;20213:35;;;;;;;;;;;;19957:297;;:::o;22694:590::-;22842:8;12575:18;12596:9;:19;12606:8;12596:19;;;;;;;;;;;;;;;;;;;;;12575:40;;12652:10;12638:24;;:10;:24;;;:71;;;;12699:10;12673:36;;:12;:22;12686:8;12673:22;;;;;;;;;;;;;;;;;;;;;:36;;;12638:71;:122;;;;12720:16;:28;12737:10;12720:28;;;;;;;;;;;;;;;:40;12749:10;12720:40;;;;;;;;;;;;;;;;;;;;;;;;;12638:122;12769:30;;;;;;;;;;;;;;;;;12622:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22870:8:::1;13042:1;13011:33;;:9;:19;13021:8;13011:19;;;;;;;;;;;;;;;;;;;;;:33;;;;13046:13;;;;;;;;;;;;;;;;::::0;13003:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22890:18:::2;22911:9;:19;22921:8;22911:19;;;;;;;;;;;;;;;;;;;;;22890:40;;22959:5;22945:19;;:10;:19;;;22966:9;;;;;;;;;;;;;;;;::::0;22937:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23006:1;22991:17;;:3;:17;;;;23010:12;;;;;;;;;;;;;;;;::::0;22983:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23032:24;23042:3;23047:8;23032:9;:24::i;:::-;23069:16;:3;:14;;;:16::i;:::-;23065:214;;;23101:13;23137:3;23117:41;;;23159:10;23171:5;23178:8;23188:5;23117:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23101:93;;11413:10;23221:24;;23211:34;;;:6;:34;;;;23247:23;;;;;;;;;;;;;;;;::::0;23203:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;23092:187;23065:214;22883:401;12813:1:::1;12568:252:::0;22694:590;;;;;:::o;22253:163::-;22357:7;22383:19;:27;22403:6;22383:27;;;;;;;;;;;;;;;;22376:34;;22253:163;;;:::o;44047:236::-;44111:6;:16;44118:8;44111:16;;;;;;;;;;;:26;;;;;;;;;;;;44107:169;;;44173:49;;;;;;;;44179:5;44173:49;;;;;;44186:8;44173:49;;;;44204:1;44173:49;;;;;;44208:1;44173:49;;;;44219:1;44173:49;;;;;44154:6;:16;44161:8;44154:16;;;;;;;;;;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44255:8;44242:22;;;;;;;;;;44107:169;44047:236;:::o;26350:390::-;26400:13;26432:1;26426:2;:7;26422:42;;;26446:10;;;;;;;;;;;;;;;;;;;;;26422:42;26470:6;26479:2;26470:11;;26488;26506:60;26518:1;26513;:6;26506:60;;26532:8;;;;;:::i;:::-;;;;26556:2;26551:7;;;;;:::i;:::-;;;26506:60;;;26572:16;26601:6;26591:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26572:36;;26615:97;26628:1;26622:2;:7;26615:97;;26681:2;26676;:7;;;;:::i;:::-;26671:2;:12;;;;:::i;:::-;26658:27;;26642:3;26646:8;;;;:::i;:::-;;;;26642:13;;;;;;;;:::i;:::-;;;;;:43;;;;;;;;;;;26702:2;26696:8;;;;;:::i;:::-;;;26615:97;;;26732:3;26718:18;;;;;26350:390;;;;:::o;19278:288::-;19380:12;19395:9;:19;19405:8;19395:19;;;;;;;;;;;;;;;;;;;;;19380:34;;19421:24;19436:8;19421:14;:24::i;:::-;19454:30;19469:4;19475:8;19454:14;:30::i;:::-;19491:26;19503:3;19508:8;19491:11;:26::i;:::-;19551:8;19546:3;19531:29;;19540:4;19531:29;;;;;;;;;;;;19373:193;19278:288;;:::o;21715:242::-;21858:1;21827:33;;:9;:19;21837:8;21827:19;;;;;;;;;;;;;;;;;;;;;:33;;;21862:18;;;;;;;;;;;;;;;;;21819:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21912:3;21890:9;:19;21900:8;21890:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;21950:1;21922:19;:24;21942:3;21922:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;21715:242;;:::o;9610:780::-;9693:17;10134:16;10157:19;10179:66;10157:88;;;;10287:5;10275:18;10263:30;;10353:3;10341:15;;:8;:15;;:42;;;;;10372:11;10360:8;:23;;10341:42;10325:59;;9715:675;;9610:780;;;:::o;23417:110::-;23499:12;:22;23512:8;23499:22;;;;;;;;;;;;23492:29;;;;;;;;;;;23417:110;:::o;21214:234::-;21354:5;21331:28;;:9;:19;21341:8;21331:19;;;;;;;;;;;;;;;;;;;;;:28;;;21361:9;;;;;;;;;;;;;;;;;21323:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;21408:1;21378:19;:26;21398:5;21378:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;21423:9;:19;21433:8;21423:19;;;;;;;;;;;;21416:26;;;;;;;;;;;21214:234;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;769:722::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:2;;;1149:79;;:::i;:::-;1095:2;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;;;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1549:87;;;;:::o;1659:370::-;1730:5;1779:3;1772:4;1764:6;1760:17;1756:27;1746:2;;1787:79;;:::i;:::-;1746:2;1904:6;1891:20;1929:94;2019:3;2011:6;2004:4;1996:6;1992:17;1929:94;:::i;:::-;1920:103;;1736:293;;;;;:::o;2052:370::-;2123:5;2172:3;2165:4;2157:6;2153:17;2149:27;2139:2;;2180:79;;:::i;:::-;2139:2;2297:6;2284:20;2322:94;2412:3;2404:6;2397:4;2389:6;2385:17;2322:94;:::i;:::-;2313:103;;2129:293;;;;;:::o;2428:133::-;2471:5;2509:6;2496:20;2487:29;;2525:30;2549:5;2525:30;:::i;:::-;2477:84;;;;:::o;2567:137::-;2612:5;2650:6;2637:20;2628:29;;2666:32;2692:5;2666:32;:::i;:::-;2618:86;;;;:::o;2710:141::-;2766:5;2797:6;2791:13;2782:22;;2813:32;2839:5;2813:32;:::i;:::-;2772:79;;;;:::o;2870:552::-;2927:8;2937:6;2987:3;2980:4;2972:6;2968:17;2964:27;2954:2;;2995:79;;:::i;:::-;2954:2;3108:6;3095:20;3085:30;;3138:18;3130:6;3127:30;3124:2;;;3160:79;;:::i;:::-;3124:2;3274:4;3266:6;3262:17;3250:29;;3328:3;3320:4;3312:6;3308:17;3298:8;3294:32;3291:41;3288:2;;;3335:79;;:::i;:::-;3288:2;2944:478;;;;;:::o;3442:553::-;3500:8;3510:6;3560:3;3553:4;3545:6;3541:17;3537:27;3527:2;;3568:79;;:::i;:::-;3527:2;3681:6;3668:20;3658:30;;3711:18;3703:6;3700:30;3697:2;;;3733:79;;:::i;:::-;3697:2;3847:4;3839:6;3835:17;3823:29;;3901:3;3893:4;3885:6;3881:17;3871:8;3867:32;3864:41;3861:2;;;3908:79;;:::i;:::-;3861:2;3517:478;;;;;:::o;4001:139::-;4047:5;4085:6;4072:20;4063:29;;4101:33;4128:5;4101:33;:::i;:::-;4053:87;;;;:::o;4146:329::-;4205:6;4254:2;4242:9;4233:7;4229:23;4225:32;4222:2;;;4260:79;;:::i;:::-;4222:2;4380:1;4405:53;4450:7;4441:6;4430:9;4426:22;4405:53;:::i;:::-;4395:63;;4351:117;4212:263;;;;:::o;4481:474::-;4549:6;4557;4606:2;4594:9;4585:7;4581:23;4577:32;4574:2;;;4612:79;;:::i;:::-;4574:2;4732:1;4757:53;4802:7;4793:6;4782:9;4778:22;4757:53;:::i;:::-;4747:63;;4703:117;4859:2;4885:53;4930:7;4921:6;4910:9;4906:22;4885:53;:::i;:::-;4875:63;;4830:118;4564:391;;;;;:::o;4961:619::-;5038:6;5046;5054;5103:2;5091:9;5082:7;5078:23;5074:32;5071:2;;;5109:79;;:::i;:::-;5071:2;5229:1;5254:53;5299:7;5290:6;5279:9;5275:22;5254:53;:::i;:::-;5244:63;;5200:117;5356:2;5382:53;5427:7;5418:6;5407:9;5403:22;5382:53;:::i;:::-;5372:63;;5327:118;5484:2;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5455:118;5061:519;;;;;:::o;5586:963::-;5683:6;5691;5699;5707;5715;5764:3;5752:9;5743:7;5739:23;5735:33;5732:2;;;5771:79;;:::i;:::-;5732:2;5891:1;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5862:117;6018:2;6044:53;6089:7;6080:6;6069:9;6065:22;6044:53;:::i;:::-;6034:63;;5989:118;6146:2;6172:53;6217:7;6208:6;6197:9;6193:22;6172:53;:::i;:::-;6162:63;;6117:118;6302:2;6291:9;6287:18;6274:32;6333:18;6325:6;6322:30;6319:2;;;6355:79;;:::i;:::-;6319:2;6468:64;6524:7;6515:6;6504:9;6500:22;6468:64;:::i;:::-;6450:82;;;;6245:297;5722:827;;;;;;;;:::o;6555:468::-;6620:6;6628;6677:2;6665:9;6656:7;6652:23;6648:32;6645:2;;;6683:79;;:::i;:::-;6645:2;6803:1;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6774:117;6930:2;6956:50;6998:7;6989:6;6978:9;6974:22;6956:50;:::i;:::-;6946:60;;6901:115;6635:388;;;;;:::o;7029:474::-;7097:6;7105;7154:2;7142:9;7133:7;7129:23;7125:32;7122:2;;;7160:79;;:::i;:::-;7122:2;7280:1;7305:53;7350:7;7341:6;7330:9;7326:22;7305:53;:::i;:::-;7295:63;;7251:117;7407:2;7433:53;7478:7;7469:6;7458:9;7454:22;7433:53;:::i;:::-;7423:63;;7378:118;7112:391;;;;;:::o;7509:894::-;7627:6;7635;7684:2;7672:9;7663:7;7659:23;7655:32;7652:2;;;7690:79;;:::i;:::-;7652:2;7838:1;7827:9;7823:17;7810:31;7868:18;7860:6;7857:30;7854:2;;;7890:79;;:::i;:::-;7854:2;7995:78;8065:7;8056:6;8045:9;8041:22;7995:78;:::i;:::-;7985:88;;7781:302;8150:2;8139:9;8135:18;8122:32;8181:18;8173:6;8170:30;8167:2;;;8203:79;;:::i;:::-;8167:2;8308:78;8378:7;8369:6;8358:9;8354:22;8308:78;:::i;:::-;8298:88;;8093:303;7642:761;;;;;:::o;8409:327::-;8467:6;8516:2;8504:9;8495:7;8491:23;8487:32;8484:2;;;8522:79;;:::i;:::-;8484:2;8642:1;8667:52;8711:7;8702:6;8691:9;8687:22;8667:52;:::i;:::-;8657:62;;8613:116;8474:262;;;;:::o;8742:349::-;8811:6;8860:2;8848:9;8839:7;8835:23;8831:32;8828:2;;;8866:79;;:::i;:::-;8828:2;8986:1;9011:63;9066:7;9057:6;9046:9;9042:22;9011:63;:::i;:::-;9001:73;;8957:127;8818:273;;;;:::o;9097:529::-;9168:6;9176;9225:2;9213:9;9204:7;9200:23;9196:32;9193:2;;;9231:79;;:::i;:::-;9193:2;9379:1;9368:9;9364:17;9351:31;9409:18;9401:6;9398:30;9395:2;;;9431:79;;:::i;:::-;9395:2;9544:65;9601:7;9592:6;9581:9;9577:22;9544:65;:::i;:::-;9526:83;;;;9322:297;9183:443;;;;;:::o;9632:329::-;9691:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:2;;;9746:79;;:::i;:::-;9708:2;9866:1;9891:53;9936:7;9927:6;9916:9;9912:22;9891:53;:::i;:::-;9881:63;;9837:117;9698:263;;;;:::o;9967:474::-;10035:6;10043;10092:2;10080:9;10071:7;10067:23;10063:32;10060:2;;;10098:79;;:::i;:::-;10060:2;10218:1;10243:53;10288:7;10279:6;10268:9;10264:22;10243:53;:::i;:::-;10233:63;;10189:117;10345:2;10371:53;10416:7;10407:6;10396:9;10392:22;10371:53;:::i;:::-;10361:63;;10316:118;10050:391;;;;;:::o;10447:619::-;10524:6;10532;10540;10589:2;10577:9;10568:7;10564:23;10560:32;10557:2;;;10595:79;;:::i;:::-;10557:2;10715:1;10740:53;10785:7;10776:6;10765:9;10761:22;10740:53;:::i;:::-;10730:63;;10686:117;10842:2;10868:53;10913:7;10904:6;10893:9;10889:22;10868:53;:::i;:::-;10858:63;;10813:118;10970:2;10996:53;11041:7;11032:6;11021:9;11017:22;10996:53;:::i;:::-;10986:63;;10941:118;10547:519;;;;;:::o;11072:118::-;11159:24;11177:5;11159:24;:::i;:::-;11154:3;11147:37;11137:53;;:::o;11196:109::-;11277:21;11292:5;11277:21;:::i;:::-;11272:3;11265:34;11255:50;;:::o;11311:360::-;11397:3;11425:38;11457:5;11425:38;:::i;:::-;11479:70;11542:6;11537:3;11479:70;:::i;:::-;11472:77;;11558:52;11603:6;11598:3;11591:4;11584:5;11580:16;11558:52;:::i;:::-;11635:29;11657:6;11635:29;:::i;:::-;11630:3;11626:39;11619:46;;11401:270;;;;;:::o;11677:364::-;11765:3;11793:39;11826:5;11793:39;:::i;:::-;11848:71;11912:6;11907:3;11848:71;:::i;:::-;11841:78;;11928:52;11973:6;11968:3;11961:4;11954:5;11950:16;11928:52;:::i;:::-;12005:29;12027:6;12005:29;:::i;:::-;12000:3;11996:39;11989:46;;11769:272;;;;;:::o;12047:377::-;12153:3;12181:39;12214:5;12181:39;:::i;:::-;12236:89;12318:6;12313:3;12236:89;:::i;:::-;12229:96;;12334:52;12379:6;12374:3;12367:4;12360:5;12356:16;12334:52;:::i;:::-;12411:6;12406:3;12402:16;12395:23;;12157:267;;;;;:::o;12454:845::-;12557:3;12594:5;12588:12;12623:36;12649:9;12623:36;:::i;:::-;12675:89;12757:6;12752:3;12675:89;:::i;:::-;12668:96;;12795:1;12784:9;12780:17;12811:1;12806:137;;;;12957:1;12952:341;;;;12773:520;;12806:137;12890:4;12886:9;12875;12871:25;12866:3;12859:38;12926:6;12921:3;12917:16;12910:23;;12806:137;;12952:341;13019:38;13051:5;13019:38;:::i;:::-;13079:1;13093:154;13107:6;13104:1;13101:13;13093:154;;;13181:7;13175:14;13171:1;13166:3;13162:11;13155:35;13231:1;13222:7;13218:15;13207:26;;13129:4;13126:1;13122:12;13117:17;;13093:154;;;13276:6;13271:3;13267:16;13260:23;;12959:334;;12773:520;;12561:738;;;;;;:::o;13305:118::-;13392:24;13410:5;13392:24;:::i;:::-;13387:3;13380:37;13370:53;;:::o;13429:429::-;13606:3;13628:92;13716:3;13707:6;13628:92;:::i;:::-;13621:99;;13737:95;13828:3;13819:6;13737:95;:::i;:::-;13730:102;;13849:3;13842:10;;13610:248;;;;;:::o;13864:222::-;13957:4;13995:2;13984:9;13980:18;13972:26;;14008:71;14076:1;14065:9;14061:17;14052:6;14008:71;:::i;:::-;13962:124;;;;:::o;14092:640::-;14287:4;14325:3;14314:9;14310:19;14302:27;;14339:71;14407:1;14396:9;14392:17;14383:6;14339:71;:::i;:::-;14420:72;14488:2;14477:9;14473:18;14464:6;14420:72;:::i;:::-;14502;14570:2;14559:9;14555:18;14546:6;14502:72;:::i;:::-;14621:9;14615:4;14611:20;14606:2;14595:9;14591:18;14584:48;14649:76;14720:4;14711:6;14649:76;:::i;:::-;14641:84;;14292:440;;;;;;;:::o;14738:210::-;14825:4;14863:2;14852:9;14848:18;14840:26;;14876:65;14938:1;14927:9;14923:17;14914:6;14876:65;:::i;:::-;14830:118;;;;:::o;14954:541::-;15125:4;15163:3;15152:9;15148:19;15140:27;;15177:65;15239:1;15228:9;15224:17;15215:6;15177:65;:::i;:::-;15252:72;15320:2;15309:9;15305:18;15296:6;15252:72;:::i;:::-;15334;15402:2;15391:9;15387:18;15378:6;15334:72;:::i;:::-;15416;15484:2;15473:9;15469:18;15460:6;15416:72;:::i;:::-;15130:365;;;;;;;:::o;15501:652::-;15700:4;15738:3;15727:9;15723:19;15715:27;;15752:65;15814:1;15803:9;15799:17;15790:6;15752:65;:::i;:::-;15827:72;15895:2;15884:9;15880:18;15871:6;15827:72;:::i;:::-;15909;15977:2;15966:9;15962:18;15953:6;15909:72;:::i;:::-;15991;16059:2;16048:9;16044:18;16035:6;15991:72;:::i;:::-;16073:73;16141:3;16130:9;16126:19;16117:6;16073:73;:::i;:::-;15705:448;;;;;;;;:::o;16159:313::-;16272:4;16310:2;16299:9;16295:18;16287:26;;16359:9;16353:4;16349:20;16345:1;16334:9;16330:17;16323:47;16387:78;16460:4;16451:6;16387:78;:::i;:::-;16379:86;;16277:195;;;;:::o;16478:222::-;16571:4;16609:2;16598:9;16594:18;16586:26;;16622:71;16690:1;16679:9;16675:17;16666:6;16622:71;:::i;:::-;16576:124;;;;:::o;16706:129::-;16740:6;16767:20;;:::i;:::-;16757:30;;16796:33;16824:4;16816:6;16796:33;:::i;:::-;16747:88;;;:::o;16841:75::-;16874:6;16907:2;16901:9;16891:19;;16881:35;:::o;16922:311::-;16999:4;17089:18;17081:6;17078:30;17075:2;;;17111:18;;:::i;:::-;17075:2;17161:4;17153:6;17149:17;17141:25;;17221:4;17215;17211:15;17203:23;;17004:229;;;:::o;17239:311::-;17316:4;17406:18;17398:6;17395:30;17392:2;;;17428:18;;:::i;:::-;17392:2;17478:4;17470:6;17466:17;17458:25;;17538:4;17532;17528:15;17520:23;;17321:229;;;:::o;17556:141::-;17605:4;17628:3;17620:11;;17651:3;17648:1;17641:14;17685:4;17682:1;17672:18;17664:26;;17610:87;;;:::o;17703:98::-;17754:6;17788:5;17782:12;17772:22;;17761:40;;;:::o;17807:99::-;17859:6;17893:5;17887:12;17877:22;;17866:40;;;:::o;17912:168::-;17995:11;18029:6;18024:3;18017:19;18069:4;18064:3;18060:14;18045:29;;18007:73;;;;:::o;18086:169::-;18170:11;18204:6;18199:3;18192:19;18244:4;18239:3;18235:14;18220:29;;18182:73;;;;:::o;18261:148::-;18363:11;18400:3;18385:18;;18375:34;;;;:::o;18415:305::-;18455:3;18474:20;18492:1;18474:20;:::i;:::-;18469:25;;18508:20;18526:1;18508:20;:::i;:::-;18503:25;;18662:1;18594:66;18590:74;18587:1;18584:81;18581:2;;;18668:18;;:::i;:::-;18581:2;18712:1;18709;18705:9;18698:16;;18459:261;;;;:::o;18726:185::-;18766:1;18783:20;18801:1;18783:20;:::i;:::-;18778:25;;18817:20;18835:1;18817:20;:::i;:::-;18812:25;;18856:1;18846:2;;18861:18;;:::i;:::-;18846:2;18903:1;18900;18896:9;18891:14;;18768:143;;;;:::o;18917:348::-;18957:7;18980:20;18998:1;18980:20;:::i;:::-;18975:25;;19014:20;19032:1;19014:20;:::i;:::-;19009:25;;19202:1;19134:66;19130:74;19127:1;19124:81;19119:1;19112:9;19105:17;19101:105;19098:2;;;19209:18;;:::i;:::-;19098:2;19257:1;19254;19250:9;19239:20;;18965:300;;;;:::o;19271:191::-;19311:4;19331:20;19349:1;19331:20;:::i;:::-;19326:25;;19365:20;19383:1;19365:20;:::i;:::-;19360:25;;19404:1;19401;19398:8;19395:2;;;19409:18;;:::i;:::-;19395:2;19454:1;19451;19447:9;19439:17;;19316:146;;;;:::o;19468:96::-;19505:7;19534:24;19552:5;19534:24;:::i;:::-;19523:35;;19513:51;;;:::o;19570:90::-;19604:7;19647:5;19640:13;19633:21;19622:32;;19612:48;;;:::o;19666:149::-;19702:7;19742:66;19735:5;19731:78;19720:89;;19710:105;;;:::o;19821:126::-;19858:7;19898:42;19891:5;19887:54;19876:65;;19866:81;;;:::o;19953:77::-;19990:7;20019:5;20008:16;;19998:32;;;:::o;20036:307::-;20104:1;20114:113;20128:6;20125:1;20122:13;20114:113;;;20213:1;20208:3;20204:11;20198:18;20194:1;20189:3;20185:11;20178:39;20150:2;20147:1;20143:10;20138:15;;20114:113;;;20245:6;20242:1;20239:13;20236:2;;;20325:1;20316:6;20311:3;20307:16;20300:27;20236:2;20085:258;;;;:::o;20349:171::-;20388:3;20411:24;20429:5;20411:24;:::i;:::-;20402:33;;20457:4;20450:5;20447:15;20444:2;;;20465:18;;:::i;:::-;20444:2;20512:1;20505:5;20501:13;20494:20;;20392:128;;;:::o;20526:320::-;20570:6;20607:1;20601:4;20597:12;20587:22;;20654:1;20648:4;20644:12;20675:18;20665:2;;20731:4;20723:6;20719:17;20709:27;;20665:2;20793;20785:6;20782:14;20762:18;20759:38;20756:2;;;20812:18;;:::i;:::-;20756:2;20577:269;;;;:::o;20852:281::-;20935:27;20957:4;20935:27;:::i;:::-;20927:6;20923:40;21065:6;21053:10;21050:22;21029:18;21017:10;21014:34;21011:62;21008:2;;;21076:18;;:::i;:::-;21008:2;21116:10;21112:2;21105:22;20895:238;;;:::o;21139:233::-;21178:3;21201:24;21219:5;21201:24;:::i;:::-;21192:33;;21247:66;21240:5;21237:77;21234:2;;;21317:18;;:::i;:::-;21234:2;21364:1;21357:5;21353:13;21346:20;;21182:190;;;:::o;21378:176::-;21410:1;21427:20;21445:1;21427:20;:::i;:::-;21422:25;;21461:20;21479:1;21461:20;:::i;:::-;21456:25;;21500:1;21490:2;;21505:18;;:::i;:::-;21490:2;21546:1;21543;21539:9;21534:14;;21412:142;;;;:::o;21560:180::-;21608:77;21605:1;21598:88;21705:4;21702:1;21695:15;21729:4;21726:1;21719:15;21746:180;21794:77;21791:1;21784:88;21891:4;21888:1;21881:15;21915:4;21912:1;21905:15;21932:180;21980:77;21977:1;21970:88;22077:4;22074:1;22067:15;22101:4;22098:1;22091:15;22118:180;22166:77;22163:1;22156:88;22263:4;22260:1;22253:15;22287:4;22284:1;22277:15;22304:180;22352:77;22349:1;22342:88;22449:4;22446:1;22439:15;22473:4;22470:1;22463:15;22490:117;22599:1;22596;22589:12;22613:117;22722:1;22719;22712:12;22736:117;22845:1;22842;22835:12;22859:117;22968:1;22965;22958:12;22982:117;23091:1;23088;23081:12;23105:102;23146:6;23197:2;23193:7;23188:2;23181:5;23177:14;23173:28;23163:38;;23153:54;;;:::o;23213:122::-;23286:24;23304:5;23286:24;:::i;:::-;23279:5;23276:35;23266:2;;23325:1;23322;23315:12;23266:2;23256:79;:::o;23341:116::-;23411:21;23426:5;23411:21;:::i;:::-;23404:5;23401:32;23391:2;;23447:1;23444;23437:12;23391:2;23381:76;:::o;23463:120::-;23535:23;23552:5;23535:23;:::i;:::-;23528:5;23525:34;23515:2;;23573:1;23570;23563:12;23515:2;23505:78;:::o;23589:122::-;23662:24;23680:5;23662:24;:::i;:::-;23655:5;23652:35;23642:2;;23701:1;23698;23691:12;23642:2;23632:79;:::o

Swarm Source

ipfs://be539e2c3ccdf3b83c01ee223d1f01073960383b2543701df5fdfc0b4561789d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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