ETH Price: $2,407.62 (-0.70%)

Token

CHAINGEAR (CHG)
 

Overview

Max Total Supply

22 CHG

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
7 CHG
0x002F9CaF40a444f20813DA783D152bdfAF42852F
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Chaingear

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-01-28
*/

pragma solidity 0.4.25;

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface ERC165 {

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceId The interface identifier, as specified in ERC-165
   * @dev Interface identification is specified in ERC-165. This function
   * uses less than 30,000 gas.
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

// File: openzeppelin-solidity/contracts/introspection/SupportsInterfaceWithLookup.sol

/**
 * @title SupportsInterfaceWithLookup
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract SupportsInterfaceWithLookup is ERC165 {

  bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7;
  /**
   * 0x01ffc9a7 ===
   *   bytes4(keccak256('supportsInterface(bytes4)'))
   */

  /**
   * @dev a mapping of interface id to whether or not it's supported
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev A contract implementing SupportsInterfaceWithLookup
   * implement ERC165 itself
   */
  constructor()
    public
  {
    _registerInterface(InterfaceId_ERC165);
  }

  /**
   * @dev implement supportsInterface(bytes4) using a lookup table
   */
  function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceId];
  }

  /**
   * @dev private method for registering an interface
   */
  function _registerInterface(bytes4 _interfaceId)
    internal
  {
    require(_interfaceId != 0xffffffff);
    supportedInterfaces[_interfaceId] = true;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Basic.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic is ERC165 {

  bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd;
  /*
   * 0x80ac58cd ===
   *   bytes4(keccak256('balanceOf(address)')) ^
   *   bytes4(keccak256('ownerOf(uint256)')) ^
   *   bytes4(keccak256('approve(address,uint256)')) ^
   *   bytes4(keccak256('getApproved(uint256)')) ^
   *   bytes4(keccak256('setApprovalForAll(address,bool)')) ^
   *   bytes4(keccak256('isApprovedForAll(address,address)')) ^
   *   bytes4(keccak256('transferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^
   *   bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)'))
   */

  bytes4 internal constant InterfaceId_ERC721Exists = 0x4f558e79;
  /*
   * 0x4f558e79 ===
   *   bytes4(keccak256('exists(uint256)'))
   */

  bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63;
  /**
   * 0x780e9d63 ===
   *   bytes4(keccak256('totalSupply()')) ^
   *   bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^
   *   bytes4(keccak256('tokenByIndex(uint256)'))
   */

  bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f;
  /**
   * 0x5b5e139f ===
   *   bytes4(keccak256('name()')) ^
   *   bytes4(keccak256('symbol()')) ^
   *   bytes4(keccak256('tokenURI(uint256)'))
   */

  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId)
    public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator)
    public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId)
    public;

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public;
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256 _tokenId);

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


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() external view returns (string _name);
  function symbol() external view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 internal constant ERC721_RECEIVED = 0x150b7a02;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   * after a `safetransfer`. This function MAY throw to revert and reject the
   * transfer. Return of other than the magic value MUST result in the
   * transaction being reverted.
   * Note: the contract address is always the message sender.
   * @param _operator The address which called `safeTransferFrom` function
   * @param _from The address which previously owned the token
   * @param _tokenId The NFT identifier which is being transferred
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes _data
  )
    public
    returns(bytes4);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: openzeppelin-solidity/contracts/AddressUtils.sol

/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param _addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address _addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721BasicToken.sol

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is SupportsInterfaceWithLookup, ERC721Basic {

  using SafeMath for uint256;
  using AddressUtils for address;

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

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

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

  /**
   * @dev Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokensCount[_owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

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

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

    tokenApprovals[_tokenId] = _to;
    emit Approval(owner, _to, _tokenId);
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * An operator is allowed to transfer all tokens of the sender on their behalf
   * @param _to operator address to set the approval
   * @param _approved representing the status of the approval to be set
   */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender);
    operatorApprovals[msg.sender][_to] = _approved;
    emit ApprovalForAll(msg.sender, _to, _approved);
  }

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

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
  {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    require(_from != address(0));
    require(_to != address(0));

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);

    emit Transfer(_from, _to, _tokenId);
  }

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

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * If the target address is a contract, it must implement `onERC721Received`,
   * which is called upon a safe transfer, and return the magic value
   * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
   * the transfer is reverted.
   * Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public
  {
    transferFrom(_from, _to, _tokenId);
    // solium-disable-next-line arg-overflow
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(
    address _spender,
    uint256 _tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(_tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      _spender == owner ||
      getApproved(_tokenId) == _spender ||
      isApprovedForAll(owner, _spender)
    );
  }

  /**
   * @dev Internal function to mint a new token
   * Reverts if the given token ID already exists
   * @param _to The address that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addTokenTo(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * Reverts if the token does not exist
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    clearApproval(_owner, _tokenId);
    removeTokenFrom(_owner, _tokenId);
    emit Transfer(_owner, address(0), _tokenId);
  }

  /**
   * @dev Internal function to clear current approval of a given token ID
   * Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(
      msg.sender, _from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Token.sol

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is SupportsInterfaceWithLookup, ERC721BasicToken, ERC721 {

  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) internal ownedTokens;

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

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

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

  // Optional mapping for token URIs
  mapping(uint256 => string) internal tokenURIs;

  /**
   * @dev Constructor function
   */
  constructor(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;

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

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

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

  /**
   * @dev Returns an URI for a given token ID
   * Throws if the token ID does not exist. May return an empty string.
   * @param _tokenId uint256 ID of the token to query
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    return tokenURIs[_tokenId];
  }

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

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

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

  /**
   * @dev Internal function to set the token URI for a given token
   * Reverts if the token ID does not exist
   * @param _tokenId uint256 ID of the token to set its URI
   * @param _uri string URI to assign
   */
  function _setTokenURI(uint256 _tokenId, string _uri) internal {
    require(exists(_tokenId));
    tokenURIs[_tokenId] = _uri;
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    // To prevent a gap in the array, we store the last token in the index of the token to delete, and
    // then delete the last slot.
    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    ownedTokens[_from][tokenIndex] = lastToken;
    // This also deletes the contents at the last position of the array
    ownedTokens[_from].length--;

    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

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

    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

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

    // Clear metadata (if any)
    if (bytes(tokenURIs[_tokenId]).length != 0) {
      delete tokenURIs[_tokenId];
    }

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

    allTokens[tokenIndex] = lastToken;
    allTokens[lastTokenIndex] = 0;

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }

}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


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


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

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

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

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

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/common/IDatabase.sol

interface IDatabase {
    
    function createEntry() external payable returns (uint256);
    function auth(uint256, address) external;
    function deleteEntry(uint256) external;
    function fundEntry(uint256) external payable;
    function claimEntryFunds(uint256, uint256) external;
    function updateEntryCreationFee(uint256) external;
    function updateDatabaseDescription(string) external;
    function addDatabaseTag(bytes32) external;
    function updateDatabaseTag(uint8, bytes32) external;
    function removeDatabaseTag(uint8) external;
    function readEntryMeta(uint256) external view returns (
        address,
        address,
        uint256,
        uint256,
        uint256,
        uint256
    );
    function getChaingearID() external view returns (uint256);
    function getEntriesIDs() external view returns (uint256[]);
    function getIndexByID(uint256) external view returns (uint256);
    function getEntryCreationFee() external view returns (uint256);
    function getEntriesStorage() external view returns (address);
    function getSchemaDefinition() external view returns (string);
    function getDatabaseBalance() external view returns (uint256);
    function getDatabaseDescription() external view returns (string);
    function getDatabaseTags() external view returns (bytes32[]);
    function getDatabaseSafe() external view returns (address);
    function getSafeBalance() external view returns (uint256);
    function getDatabaseInitStatus() external view returns (bool);
    function pause() external;
    function unpause() external;
    function transferAdminRights(address) external;
    function getAdmin() external view returns (address);
    function getPaused() external view returns (bool);
    function transferOwnership(address) external;
    function deletePayees() external;
}

// File: contracts/common/IDatabaseBuilder.sol

interface IDatabaseBuilder {
    
    function deployDatabase(
        address[],
        uint256[],
        string,
        string
    ) external returns (IDatabase);
    function setChaingearAddress(address) external;
    function getChaingearAddress() external view returns (address);
    function getOwner() external view returns (address);
}

// File: contracts/common/Safe.sol

/**
* @title Chaingear - the novel Ethereum database framework
* @author cyber•Congress, Valery litvin (@litvintech)
* @notice not audited, not recommend to use in mainnet
*/
contract Safe {
    
    address private owner;

    constructor() public
    {
        owner = msg.sender;
    }

    function()
        external
        payable
    {
        require(msg.sender == owner);
    }

    function claim(address _entryOwner, uint256 _amount)
        external
    {
        require(msg.sender == owner);
        require(_amount <= address(this).balance);
        require(_entryOwner != address(0));
        
        _entryOwner.transfer(_amount);
    }

    function getOwner()
        external
        view
        returns(address)
    {
        return owner;
    }
}

// File: contracts/common/IChaingear.sol

interface IChaingear {
    
    function addDatabaseBuilderVersion(
        string,
        IDatabaseBuilder,
        string,
        string
    ) external;
    function updateDatabaseBuilderDescription(string, string) external;
    function depricateDatabaseBuilder(string) external;
    function createDatabase(
        string,
        address[],
        uint256[],
        string,
        string
    ) external payable returns (address, uint256);
    function deleteDatabase(uint256) external;
    function fundDatabase(uint256) external payable;
    function claimDatabaseFunds(uint256, uint256) external;
    function updateCreationFee(uint256) external;
    function getAmountOfBuilders() external view returns (uint256);
    function getBuilderByID(uint256) external view returns(string);
    function getDatabaseBuilder(string) external view returns(address, string, string, bool);
    function getDatabasesIDs() external view returns (uint256[]);
    function getDatabaseIDByAddress(address) external view returns (uint256);
    function getDatabaseAddressByName(string) external view returns (address);
    function getDatabaseSymbolByID(uint256) external view returns (string);
    function getDatabaseIDBySymbol(string) external view returns (uint256);
    function getDatabase(uint256) external view returns (
        string,
        string,
        address,
        string,
        uint256,
        address,
        uint256
    );
    function getDatabaseBalance(uint256) external view returns (uint256, uint256);
    function getChaingearDescription() external pure returns (string);
    function getCreationFeeWei() external view returns (uint256);
    function getSafeBalance() external view returns (uint256);
    function getSafeAddress() external view returns (address);
    function getNameExist(string) external view returns (bool);
    function getSymbolExist(string) external view returns (bool);
}

// File: contracts/common/PaymentSplitter.sol

/**
 * @title PaymentSplitter
 * @dev This contract can be used when payments need to be received by a group
 * of people and split proportionately to some number of shares they own.
 */
contract PaymentSplitter {
    
    using SafeMath for uint256;

    uint256 internal totalShares;
    uint256 internal totalReleased;

    mapping(address => uint256) internal shares;
    mapping(address => uint256) internal released;
    address[] internal payees;
    
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    constructor (address[] _payees, uint256[] _shares)
        public
        payable
    {
        _initializePayess(_payees, _shares);
    }

    function ()
        external
        payable
    {
        emit PaymentReceived(msg.sender, msg.value);
    }

    function getTotalShares()
        external
        view
        returns (uint256)
    {
        return totalShares;
    }

    function getTotalReleased()
        external
        view
        returns (uint256)
    {
        return totalReleased;
    }

    function getShares(address _account)
        external
        view
        returns (uint256)
    {
        return shares[_account];
    }

    function getReleased(address _account)
        external
        view
        returns (uint256)
    {
        return released[_account];
    }

    function getPayee(uint256 _index)
        external
        view
        returns (address)
    {
        return payees[_index];
    }
    
    function getPayeesCount() 
        external
        view
        returns (uint256)
    {   
        return payees.length;
    }

    function release(address _account) 
        public
    {
        require(shares[_account] > 0);

        uint256 totalReceived = address(this).balance.add(totalReleased);
        uint256 payment = totalReceived.mul(shares[_account]).div(totalShares).sub(released[_account]);

        require(payment != 0);

        released[_account] = released[_account].add(payment);
        totalReleased = totalReleased.add(payment);

        _account.transfer(payment);
        
        emit PaymentReleased(_account, payment);
    }
    
    function _initializePayess(address[] _payees, uint256[] _shares)
        internal
    {
        require(payees.length == 0);
        require(_payees.length == _shares.length);
        require(_payees.length > 0 && _payees.length <= 8);

        for (uint256 i = 0; i < _payees.length; i++) {
            _addPayee(_payees[i], _shares[i]);
        }
    }

    function _addPayee(
        address _account,
        uint256 _shares
    ) 
        internal
    {
        require(_account != address(0));
        require(_shares > 0);
        require(shares[_account] == 0);

        payees.push(_account);
        shares[_account] = _shares;
        totalShares = totalShares.add(_shares);
        
        emit PayeeAdded(_account, _shares);
    }
}

// File: contracts/chaingear/FeeSplitterChaingear.sol

contract FeeSplitterChaingear is PaymentSplitter, Ownable {
    
    event PayeeAddressChanged(
        uint8 payeeIndex, 
        address oldAddress, 
        address newAddress
    );

    constructor(address[] _payees, uint256[] _shares)
        public
        payable
        PaymentSplitter(_payees, _shares)
    { }
    
    function changePayeeAddress(uint8 _payeeIndex, address _newAddress)
        external
        onlyOwner
    {
        require(_payeeIndex < 12);
        require(payees[_payeeIndex] != _newAddress);
        
        address oldAddress = payees[_payeeIndex];
        shares[_newAddress] = shares[oldAddress];
        released[_newAddress] = released[oldAddress];
        payees[_payeeIndex] = _newAddress;

        delete shares[oldAddress];
        delete released[oldAddress];

        emit PayeeAddressChanged(_payeeIndex, oldAddress, _newAddress);
    }

}

// File: contracts/common/ERC721MetadataValidation.sol

library ERC721MetadataValidation {

    function validateName(string _base) 
        internal
        pure
    {
        bytes memory _baseBytes = bytes(_base);
        for (uint i = 0; i < _baseBytes.length; i++) {
            require(_baseBytes[i] >= 0x61 && _baseBytes[i] <= 0x7A || _baseBytes[i] >= 0x30 && _baseBytes[i] <= 0x39 || _baseBytes[i] == 0x2D);
        }
    }

    function validateSymbol(string _base) 
        internal
        pure
    {
        bytes memory _baseBytes = bytes(_base);
        for (uint i = 0; i < _baseBytes.length; i++) {
            require(_baseBytes[i] >= 0x41 && _baseBytes[i] <= 0x5A || _baseBytes[i] >= 0x30 && _baseBytes[i] <= 0x39);
        }
    }
}

// File: contracts/chaingear/Chaingear.sol

/**
* @title Chaingear - the novel Ethereum database framework
* @author cyber•Congress, Valery litvin (@litvintech)
* @notice not audited, not recommend to use in mainnet
*/
contract Chaingear is IChaingear, Ownable, SupportsInterfaceWithLookup, Pausable, FeeSplitterChaingear, ERC721Token {

    using SafeMath for uint256;
    using ERC721MetadataValidation for string;

    /*
    *  Storage
    */

    struct DatabaseMeta {
        IDatabase databaseContract;
        address creatorOfDatabase;
        string versionOfDatabase;
        string linkABI;
        uint256 createdTimestamp;
        uint256 currentWei;
        uint256 accumulatedWei;
    }

    struct DatabaseBuilder {
        IDatabaseBuilder builderAddress;
        string linkToABI;
        string description;
        bool operational;
    }

    DatabaseMeta[] private databases;
    mapping(string => bool) private databasesNamesIndex;
    mapping(string => bool) private databasesSymbolsIndex;

    uint256 private headTokenID = 0;
    mapping(address => uint256) private databasesIDsByAddressesIndex;
    mapping(string => address) private databasesAddressesByNameIndex;
    mapping(uint256 => string) private databasesSymbolsByIDIndex;
    mapping(string => uint256) private databasesIDsBySymbolIndex;

    uint256 private amountOfBuilders = 0;
    mapping(uint256 => string) private buildersVersionIndex;
    mapping(string => DatabaseBuilder) private buildersVersion;

    Safe private chaingearSafe;
    uint256 private databaseCreationFeeWei = 10 ether;

    string private constant CHAINGEAR_DESCRIPTION = "The novel Ethereum database framework";
    bytes4 private constant INTERFACE_CHAINGEAR_EULER_ID = 0xea1db66f; 
    bytes4 private constant INTERFACE_DATABASE_V1_EULER_ID = 0xf2c320c4;
    bytes4 private constant INTERFACE_DATABASE_BUILDER_EULER_ID = 0xce8bbf93;
    
    /*
    *  Events
    */
    event DatabaseBuilderAdded(
        string version,
        IDatabaseBuilder builderAddress,
        string linkToABI,
        string description
    );
    event DatabaseDescriptionUpdated(string version, string description);
    event DatabaseBuilderDepricated(string version);
    event DatabaseCreated(
        string name,
        address databaseAddress,
        address creatorAddress,
        uint256 databaseChaingearID
    );
    event DatabaseDeleted(
        string name,
        address databaseAddress,
        address creatorAddress,
        uint256 databaseChaingearID
    );
    event DatabaseFunded(
        uint256 databaseID,
        address sender,
        uint256 amount
    );
    event DatabaseFundsClaimed(
        uint256 databaseID,
        address claimer,
        uint256 amount
    );    
    event CreationFeeUpdated(uint256 newFee);

    /*
    *  Constructor
    */

    constructor(address[] _beneficiaries, uint256[] _shares)
        public
        ERC721Token ("CHAINGEAR", "CHG")
        FeeSplitterChaingear (_beneficiaries, _shares)
    {
        chaingearSafe = new Safe();
        _registerInterface(INTERFACE_CHAINGEAR_EULER_ID);
    }

    /*
    *  Modifiers
    */

    modifier onlyOwnerOf(uint256 _databaseID){
        require(ownerOf(_databaseID) == msg.sender);
        _;
    }

    /*
    *  External functions
    */

    function addDatabaseBuilderVersion(
        string _version,
        IDatabaseBuilder _builderAddress,
        string _linkToABI,
        string _description
    )
        external
        onlyOwner
        whenNotPaused
    {
        require(buildersVersion[_version].builderAddress == address(0));

        SupportsInterfaceWithLookup support = SupportsInterfaceWithLookup(_builderAddress);
        require(support.supportsInterface(INTERFACE_DATABASE_BUILDER_EULER_ID));

        buildersVersion[_version] = (DatabaseBuilder(
        {
            builderAddress: _builderAddress,
            linkToABI: _linkToABI,
            description: _description,
            operational: true
        }));
        buildersVersionIndex[amountOfBuilders] = _version;
        amountOfBuilders = amountOfBuilders.add(1);
        
        emit DatabaseBuilderAdded(
            _version,
            _builderAddress,
            _linkToABI,
            _description
        );
    }

    function updateDatabaseBuilderDescription(string _version, string _description)
        external
        onlyOwner
        whenNotPaused
    {
        require(buildersVersion[_version].builderAddress != address(0));
        buildersVersion[_version].description = _description;    
        emit DatabaseDescriptionUpdated(_version, _description);
    }
    
    function depricateDatabaseBuilder(string _version)
        external
        onlyOwner
        whenPaused
    {
        require(buildersVersion[_version].builderAddress != address(0));
        require(buildersVersion[_version].operational == true);
        buildersVersion[_version].operational = false;
        emit DatabaseBuilderDepricated(_version);
    }

    function createDatabase(
        string    _version,
        address[] _beneficiaries,
        uint256[] _shares,
        string    _name,
        string    _symbol
    )
        external
        payable
        whenNotPaused
        returns (address, uint256)
    {
        _name.validateName();
        _symbol.validateSymbol();
        require(buildersVersion[_version].builderAddress != address(0));
        require(buildersVersion[_version].operational == true);
        require(databaseCreationFeeWei == msg.value);
        require(databasesNamesIndex[_name] == false);
        require(databasesSymbolsIndex[_symbol] == false);

        return _deployDatabase(
            _version,
            _beneficiaries,
            _shares,
            _name,
            _symbol
        );
    }

    function deleteDatabase(uint256 _databaseID)
        external
        onlyOwnerOf(_databaseID)
        whenNotPaused
    {
        uint256 databaseIndex = allTokensIndex[_databaseID];
        IDatabase database = databases[databaseIndex].databaseContract;
        require(database.getSafeBalance() == uint256(0));
        require(database.getPaused() == true);
        
        string memory databaseName = ERC721(database).name();
        string memory databaseSymbol = ERC721(database).symbol();
        
        delete databasesNamesIndex[databaseName];
        delete databasesSymbolsIndex[databaseSymbol];
        delete databasesIDsByAddressesIndex[database];  
        delete databasesIDsBySymbolIndex[databaseSymbol];
        delete databasesSymbolsByIDIndex[_databaseID];

        uint256 lastDatabaseIndex = databases.length.sub(1);
        DatabaseMeta memory lastDatabase = databases[lastDatabaseIndex];
        databases[databaseIndex] = lastDatabase;
        delete databases[lastDatabaseIndex];
        databases.length--;

        super._burn(msg.sender, _databaseID);
        database.transferOwnership(msg.sender);
        
        emit DatabaseDeleted(
            databaseName,
            database,
            msg.sender,
            _databaseID
        );
    }

    function fundDatabase(uint256 _databaseID)
        external
        whenNotPaused
        payable
    {
        require(exists(_databaseID) == true);
        uint256 databaseIndex = allTokensIndex[_databaseID];

        uint256 currentWei = databases[databaseIndex].currentWei.add(msg.value);
        databases[databaseIndex].currentWei = currentWei;

        uint256 accumulatedWei = databases[databaseIndex].accumulatedWei.add(msg.value);
        databases[databaseIndex].accumulatedWei = accumulatedWei;

        emit DatabaseFunded(_databaseID, msg.sender, msg.value);
        address(chaingearSafe).transfer(msg.value);
    }

    function claimDatabaseFunds(uint256 _databaseID, uint256 _amount)
        external
        onlyOwnerOf(_databaseID)
        whenNotPaused
    {
        uint256 databaseIndex = allTokensIndex[_databaseID];

        uint256 currentWei = databases[databaseIndex].currentWei;
        require(_amount <= currentWei);

        databases[databaseIndex].currentWei = currentWei.sub(_amount);

        emit DatabaseFundsClaimed(_databaseID, msg.sender, _amount);
        chaingearSafe.claim(msg.sender, _amount);
    }

    function updateCreationFee(uint256 _newFee)
        external
        onlyOwner
        whenPaused
    {
        databaseCreationFeeWei = _newFee;
        emit CreationFeeUpdated(_newFee);
    }

    /*
    *  Views
    */

    function getAmountOfBuilders()
        external
        view
        returns(uint256)
    {
        return amountOfBuilders;
    }

    function getBuilderByID(uint256 _id)
        external
        view
        returns(string)
    {
        return buildersVersionIndex[_id];
    }

    function getDatabaseBuilder(string _version)
        external
        view
        returns (
            address,
            string,
            string,
            bool
        )
    {
        return(
            buildersVersion[_version].builderAddress,
            buildersVersion[_version].linkToABI,
            buildersVersion[_version].description,
            buildersVersion[_version].operational
        );
    }

    function getDatabasesIDs()
        external
        view
        returns(uint256[])
    {
        return allTokens;
    }

    function getDatabaseIDByAddress(address _databaseAddress)
        external
        view
        returns(uint256)
    {
        uint256 databaseID = databasesIDsByAddressesIndex[_databaseAddress];
        return databaseID;
    }
    
    function getDatabaseAddressByName(string _name)
        external
        view
        returns(address)
    {
        return databasesAddressesByNameIndex[_name];
    }

    function getDatabaseSymbolByID(uint256 _databaseID)
        external
        view
        returns(string)
    {
        return databasesSymbolsByIDIndex[_databaseID];
    }

    function getDatabaseIDBySymbol(string _symbol)
        external
        view
        returns(uint256)
    {
        return databasesIDsBySymbolIndex[_symbol];
    }

    function getDatabase(uint256 _databaseID)
        external
        view
        returns (
            string,
            string,
            address,
            string,
            uint256,
            address,
            uint256
        )
    {
        uint256 databaseIndex = allTokensIndex[_databaseID];
        IDatabase databaseAddress = databases[databaseIndex].databaseContract;

        return (
            ERC721(databaseAddress).name(),
            ERC721(databaseAddress).symbol(),
            databaseAddress,
            databases[databaseIndex].versionOfDatabase,
            databases[databaseIndex].createdTimestamp,
            databaseAddress.getAdmin(),
            ERC721(databaseAddress).totalSupply()
        );
    }

    function getDatabaseBalance(uint256 _databaseID)
        external
        view
        returns (uint256, uint256)
    {
        uint256 databaseIndex = allTokensIndex[_databaseID];

        return (
            databases[databaseIndex].currentWei,
            databases[databaseIndex].accumulatedWei
        );
    }

    function getChaingearDescription()
        external
        pure
        returns (string)
    {
        return CHAINGEAR_DESCRIPTION;
    }

    function getCreationFeeWei()
        external
        view
        returns (uint256)
    {
        return databaseCreationFeeWei;
    }

    function getSafeBalance()
        external
        view
        returns (uint256)
    {
        return address(chaingearSafe).balance;
    }

    function getSafeAddress()
        external
        view
        returns (address)
    {
        return chaingearSafe;
    }

    function getNameExist(string _name)
        external
        view
        returns (bool)
    {
        return databasesNamesIndex[_name];
    }

    function getSymbolExist(string _symbol)
        external
        view
        returns (bool)
    {
        return databasesSymbolsIndex[_symbol];
    }

    /*
    *  Public functions
    */

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
        whenNotPaused
    {
        uint256 databaseIndex = allTokensIndex[_tokenId];
        IDatabase database = databases[databaseIndex].databaseContract;
        require(address(database).balance == 0);
        require(database.getPaused() == true);
        super.transferFrom(_from, _to, _tokenId);
        
        IDatabase databaseAddress = databases[databaseIndex].databaseContract;
        databaseAddress.deletePayees();
        databaseAddress.transferAdminRights(_to);
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    )
        public
        whenNotPaused
    {
        safeTransferFrom(
            _from,
            _to,
            _tokenId,
            ""
        );
    }

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes _data
    )
        public
        whenNotPaused
    {
        transferFrom(_from, _to, _tokenId);

        require(
            checkAndCallSafeTransfer(
                _from,
                _to,
                _tokenId,
                _data
        ));
    }

    /*
    *  Private functions
    */

    function _deployDatabase(
        string    _version,
        address[] _beneficiaries,
        uint256[] _shares,
        string    _name,
        string    _symbol
    )
        private
        returns (address, uint256)
    {
        IDatabaseBuilder builder = buildersVersion[_version].builderAddress;
        IDatabase databaseContract = builder.deployDatabase(
            _beneficiaries,
            _shares,
            _name,
            _symbol
        );

        address databaseAddress = address(databaseContract);

        SupportsInterfaceWithLookup support = SupportsInterfaceWithLookup(databaseAddress);
        require(support.supportsInterface(INTERFACE_DATABASE_V1_EULER_ID));
        require(support.supportsInterface(InterfaceId_ERC721));
        require(support.supportsInterface(InterfaceId_ERC721Metadata));
        require(support.supportsInterface(InterfaceId_ERC721Enumerable));

        DatabaseMeta memory database = (DatabaseMeta(
        {
            databaseContract: databaseContract,
            creatorOfDatabase: msg.sender,
            versionOfDatabase: _version,
            linkABI: buildersVersion[_version].linkToABI,
            createdTimestamp: block.timestamp,
            currentWei: 0,
            accumulatedWei: 0
        }));

        databases.push(database);

        databasesNamesIndex[_name] = true;
        databasesSymbolsIndex[_symbol] = true;

        uint256 newTokenID = headTokenID;
        databasesIDsByAddressesIndex[databaseAddress] = newTokenID;
        super._mint(msg.sender, newTokenID);
        databasesSymbolsByIDIndex[newTokenID] = _symbol;
        databasesIDsBySymbolIndex[_symbol] = newTokenID;
        databasesAddressesByNameIndex[_name] = databaseAddress;
        headTokenID = headTokenID.add(1);

        emit DatabaseCreated(
            _name,
            databaseAddress,
            msg.sender,
            newTokenID
        );

        databaseContract.transferAdminRights(msg.sender);
        return (databaseAddress, newTokenID);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getAmountOfBuilders","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"fundDatabase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getPayeesCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"string"}],"name":"getNameExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_databaseID","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"claimDatabaseFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabaseBalance","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTotalReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"deleteDatabase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChaingearDescription","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"string"}],"name":"getDatabaseAddressByName","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFee","type":"uint256"}],"name":"updateCreationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCreationFeeWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"},{"name":"_builderAddress","type":"address"},{"name":"_linkToABI","type":"string"},{"name":"_description","type":"string"}],"name":"addDatabaseBuilderVersion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"string"}],"name":"getDatabaseIDBySymbol","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSafeBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabaseSymbolByID","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getBuilderByID","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_version","type":"string"}],"name":"getDatabaseBuilder","outputs":[{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_payeeIndex","type":"uint8"},{"name":"_newAddress","type":"address"}],"name":"changePayeeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getReleased","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"},{"name":"_description","type":"string"}],"name":"updateDatabaseBuilderDescription","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_databaseAddress","type":"address"}],"name":"getDatabaseIDByAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getPayee","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSafeAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_symbol","type":"string"}],"name":"getSymbolExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"},{"name":"_beneficiaries","type":"address[]"},{"name":"_shares","type":"uint256[]"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"createDatabase","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"getShares","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_databaseID","type":"uint256"}],"name":"getDatabase","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"address"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDatabasesIDs","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_version","type":"string"}],"name":"depricateDatabaseBuilder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_beneficiaries","type":"address[]"},{"name":"_shares","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"builderAddress","type":"address"},{"indexed":false,"name":"linkToABI","type":"string"},{"indexed":false,"name":"description","type":"string"}],"name":"DatabaseBuilderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"description","type":"string"}],"name":"DatabaseDescriptionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"}],"name":"DatabaseBuilderDepricated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"databaseAddress","type":"address"},{"indexed":false,"name":"creatorAddress","type":"address"},{"indexed":false,"name":"databaseChaingearID","type":"uint256"}],"name":"DatabaseCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"databaseAddress","type":"address"},{"indexed":false,"name":"creatorAddress","type":"address"},{"indexed":false,"name":"databaseChaingearID","type":"uint256"}],"name":"DatabaseDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"databaseID","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DatabaseFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"databaseID","type":"uint256"},{"indexed":false,"name":"claimer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"DatabaseFundsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newFee","type":"uint256"}],"name":"CreationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"payeeIndex","type":"uint8"},{"indexed":false,"name":"oldAddress","type":"address"},{"indexed":false,"name":"newAddress","type":"address"}],"name":"PayeeAddressChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"}]

60806040526007805460ff1916905560006016819055601b55678ac7230489e80000601f553480156200003157600080fd5b506040516200549e3803806200549e83398101604081815282516020808501518385018452600985527f434841494e474541520000000000000000000000000000000000000000000000828601528351808501909452600384527f4348470000000000000000000000000000000000000000000000000000000000918401919091529084019301919083838181620000d38282640100000000620002a0810204565b505060058054600160a060020a031916331790556200011b7f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000347810204565b506200015290507f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b620001867f4f558e790000000000000000000000000000000000000000000000000000000064010000000062000347810204565b81516200019b90600c906020850190620004d0565b508051620001b190600d906020840190620004d0565b50620001e67f780e9d630000000000000000000000000000000000000000000000000000000064010000000062000347810204565b6200021a7f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b50506200022662000555565b604051809103906000f08015801562000243573d6000803e3d6000fd5b50601e8054600160a060020a031916600160a060020a0392909216919091179055620002987fea1db66f0000000000000000000000000000000000000000000000000000000064010000000062000347810204565b505062000586565b60045460009015620002b157600080fd5b8151835114620002c057600080fd5b60008351118015620002d457506008835111155b1515620002e057600080fd5b5060005b825181101562000342576200033983828151811015156200030157fe5b9060200190602002015183838151811015156200031a57fe5b90602001906020020151620003b4640100000000026401000000009004565b600101620002e4565b505050565b7fffffffff0000000000000000000000000000000000000000000000000000000080821614156200037757600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600660205260409020805460ff19166001179055565b600160a060020a0382161515620003ca57600080fd5b60008111620003d857600080fd5b600160a060020a03821660009081526002602052604090205415620003fc57600080fd5b60048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018054600160a060020a031916600160a060020a038416908117909155600090815260026020526040812082905554620004719082640100000000620004bc81026200352b1704565b60005560408051600160a060020a03841681526020810183905281517f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac929181900390910190a15050565b81810182811015620004ca57fe5b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200051357805160ff191683800117855562000543565b8280016001018555821562000543579182015b828111156200054357825182559160200191906001019062000526565b506200055192915062000566565b5090565b60405161019b806200530383390190565b6200058391905b808211156200055157600081556001016200056d565b90565b614d6d80620005966000396000f3006080604052600436106102835763ffffffff60e060020a6000350416625be27a81146102bf57806301ffc9a7146102e657806306fdde031461031c578063081812fc146103a6578063095ea7b3146103da57806318160ddd14610400578063191655871461041557806319fa8f50146104365780631d3451fe146104685780631ec0db03146104735780631ecbe4231461048857806323b872dd146104a85780632f745c59146104d25780633dc7ec98146104f65780633de31e66146105115780633f4ba83a1461054257806342842e0e146105575780634b14c0ef146105815780634f558e79146105965780634f6ccce7146105ae578063523e6a7b146105c65780635c975abb146105de5780636352211e146105f357806368013fdc1461060b5780636bf7aeee146106205780636fa237951461064057806370a082311461065857806370ed11311461067957806370f0ed8a1461068e578063715018a6146106d357806377cf929f146106e8578063791b4d4e14610708578063808d83c21461071d5780638456cb59146107355780638da5cb5b1461074a57806395d89b411461075f5780639832b57f14610774578063a22cb4651461078c578063a6fc235b146107b2578063ae32c2dc146108d4578063b4d11f35146108fb578063b88d4fde1461091c578063c493679a1461098b578063c87b56dd146109b7578063c8ca1802146109cf578063d13136fd146109f0578063d17b8f9814610a08578063d5002f2e14610a1d578063d8f5a71514610a32578063df59806f14610a52578063e985e9c514610ab8578063f04da65b14610adf578063f2fde38b14610b00578063f6afad4714610b21578063f945d25214610cbd578063fedaf8b014610d22575b6040805133815234602082015281517f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770929181900390910190a1005b3480156102cb57600080fd5b506102d4610d42565b60408051918252519081900360200190f35b3480156102f257600080fd5b50610308600160e060020a031960043516610d49565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610d68565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b257600080fd5b506103be600435610dfe565b60408051600160a060020a039092168252519081900360200190f35b3480156103e657600080fd5b506103fe600160a060020a0360043516602435610e19565b005b34801561040c57600080fd5b506102d4610ec2565b34801561042157600080fd5b506103fe600160a060020a0360043516610ec8565b34801561044257600080fd5b5061044b611044565b60408051600160e060020a03199092168252519081900360200190f35b6103fe600435611052565b34801561047f57600080fd5b506102d46111ca565b34801561049457600080fd5b5061030860048035602481019101356111d0565b3480156104b457600080fd5b506103fe600160a060020a0360043581169060243516604435611204565b3480156104de57600080fd5b506102d4600160a060020a03600435166024356113f1565b34801561050257600080fd5b506103fe60043560243561143e565b34801561051d57600080fd5b506105296004356115b4565b6040805192835260208301919091528051918290030190f35b34801561054e57600080fd5b506103fe611612565b34801561056357600080fd5b506103fe600160a060020a036004358116906024351660443561166f565b34801561058d57600080fd5b506102d46116a0565b3480156105a257600080fd5b506103086004356116a6565b3480156105ba57600080fd5b506102d46004356116c3565b3480156105d257600080fd5b506103fe6004356116f8565b3480156105ea57600080fd5b50610308611f99565b3480156105ff57600080fd5b506103be600435611fa2565b34801561061757600080fd5b50610331611fc6565b34801561062c57600080fd5b506103be6004803560248101910135612025565b34801561064c57600080fd5b506103fe60043561205e565b34801561066457600080fd5b506102d4600160a060020a03600435166120c1565b34801561068557600080fd5b506102d46120f4565b34801561069a57600080fd5b506103fe602460048035828101929082013591600160a060020a03823516916044358082019290810135916064359081019101356120fa565b3480156106df57600080fd5b506103fe612420565b3480156106f457600080fd5b506102d46004803560248101910135612481565b34801561071457600080fd5b506102d46124b0565b34801561072957600080fd5b506103316004356124c0565b34801561074157600080fd5b506103fe612561565b34801561075657600080fd5b506103be6125c0565b34801561076b57600080fd5b506103316125cf565b34801561078057600080fd5b50610331600435612630565b34801561079857600080fd5b506103fe600160a060020a0360043516602435151561269a565b3480156107be57600080fd5b506107d2600480356024810191013561271e565b6040518085600160a060020a0316600160a060020a03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019080838360005b8381101561083557818101518382015260200161081d565b50505050905090810190601f1680156108625780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561089557818101518382015260200161087d565b50505050905090810190601f1680156108c25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156108e057600080fd5b506103fe60ff60043516600160a060020a03602435166128f6565b34801561090757600080fd5b506102d4600160a060020a0360043516612a56565b34801561092857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103fe94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612a719650505050505050565b34801561099757600080fd5b506103fe6024600480358281019290820135918135918201910135612aa9565b3480156109c357600080fd5b50610331600435612bc7565b3480156109db57600080fd5b506102d4600160a060020a0360043516612c45565b3480156109fc57600080fd5b506103be600435612c60565b348015610a1457600080fd5b506103be612c8c565b348015610a2957600080fd5b506102d4612c9b565b348015610a3e57600080fd5b506103086004803560248101910135612ca1565b610a956024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612cd4565b60408051600160a060020a03909316835260208301919091528051918290030190f35b348015610ac457600080fd5b50610308600160a060020a0360043581169060243516612f66565b348015610aeb57600080fd5b506102d4600160a060020a0360043516612f94565b348015610b0c57600080fd5b506103fe600160a060020a0360043516612faf565b348015610b2d57600080fd5b50610b39600435612fd2565b60405180806020018060200188600160a060020a0316600160a060020a031681526020018060200187815260200186600160a060020a0316600160a060020a0316815260200185815260200184810384528b818151815260200191508051906020019080838360005b83811015610bba578181015183820152602001610ba2565b50505050905090810190601f168015610be75780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015610c1a578181015183820152602001610c02565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b5084810382528851815288516020918201918a019080838360005b83811015610c7a578181015183820152602001610c62565b50505050905090810190601f168015610ca75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cc957600080fd5b50610cd261339c565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d0e578181015183820152602001610cf6565b505050509050019250505060405180910390f35b348015610d2e57600080fd5b506103fe60048035602481019101356133f3565b601b545b90565b600160e060020a03191660009081526006602052604090205460ff1690565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b600090815260096020526040902054600160a060020a031690565b6000610e2482611fa2565b9050600160a060020a038381169082161415610e3f57600080fd5b33600160a060020a0382161480610e5b5750610e5b8133612f66565b1515610e6657600080fd5b6000828152600960205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60105490565b600160a060020a03811660009081526002602052604081205481908110610eee57600080fd5b600154610f039030319063ffffffff61352b16565b600160a060020a03841660009081526003602090815260408083205483546002909352922054929450610f5e92610f529190610f4690879063ffffffff61353816565b9063ffffffff61356116565b9063ffffffff61357616565b9050801515610f6c57600080fd5b600160a060020a038316600090815260036020526040902054610f95908263ffffffff61352b16565b600160a060020a038416600090815260036020526040902055600154610fc1908263ffffffff61352b16565b600155604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015610ffa573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60e060020a6301ffc9a70281565b6007546000908190819060ff161561106957600080fd5b611072846116a6565b151560011461108057600080fd5b600084815260116020526040902054601380549194506110c791349190869081106110a757fe5b90600052602060002090600702016005015461352b90919063ffffffff16565b9150816013848154811015156110d957fe5b9060005260206000209060070201600501819055506111213460138581548110151561110157fe5b90600052602060002090600702016006015461352b90919063ffffffff16565b90508060138481548110151561113357fe5b6000918252602091829020600660079092020101919091556040805186815233928101929092523482820152517f4cb5ac089edfdfb75f771ff0cd7c9eebaa766870290f70aec173bccfc5dd9d4d9181900360600190a1601e54604051600160a060020a03909116903480156108fc02916000818181858888f193505050501580156111c3573d6000803e3d6000fd5b5050505050565b60045490565b600060148383604051808383808284379091019485525050604051928390036020019092205460ff16925050505b92915050565b6007546000908190819060ff161561121b57600080fd5b60008481526011602052604090205460138054919450908490811061123c57fe5b6000918252602090912060079091020154600160a060020a0316915081311561126457600080fd5b81600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b505115156001146112dc57600080fd5b6112e7868686613588565b60138054849081106112f557fe5b60009182526020822060079091020154604080517ff36cf0040000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169350839263f36cf0049260048084019382900301818387803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505080600160a060020a031663b5106add866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156113d157600080fd5b505af11580156113e5573d6000803e3d6000fd5b50505050505050505050565b60006113fc836120c1565b821061140757600080fd5b600160a060020a0383166000908152600e6020526040902080548390811061142b57fe5b9060005260206000200154905092915050565b600080833361144c82611fa2565b600160a060020a03161461145f57600080fd5b60075460ff161561146f57600080fd5b60008581526011602052604090205460138054919450908490811061149057fe5b90600052602060002090600702016005015491508184111515156114b357600080fd5b6114c3828563ffffffff61357616565b60138054859081106114d157fe5b600091825260209182902060056007909202010191909155604080518781523392810192909252818101869052517f2ea7dca2a0a5f9aadef7c8b03a1ca8a2f62f221edfb33624ef188d08c50174d29181900360600190a1601e54604080517faad3ec96000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a039092169163aad3ec969160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b505050505050505050565b6000818152601160205260408120546013805483929190829081106115d557fe5b9060005260206000209060070201600501546013828154811015156115f657fe5b9060005260206000209060070201600601549250925050915091565b600554600160a060020a0316331461162957600080fd5b60075460ff16151561163a57600080fd5b6007805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60075460ff161561167f57600080fd5b61169b8383836020604051908101604052806000815250612a71565b505050565b60015490565b600090815260086020526040902054600160a060020a0316151590565b60006116cd610ec2565b82106116d857600080fd5b60108054839081106116e657fe5b90600052602060002001549050919050565b6000806060806000611708614af7565b863361171382611fa2565b600160a060020a03161461172657600080fd5b60075460ff161561173657600080fd5b60008881526011602052604090205460138054919850908890811061175757fe5b60009182526020808320600790920290910154604080517f791b4d4e0000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169950899263791b4d4e9260048084019382900301818787803b1580156117c357600080fd5b505af11580156117d7573d6000803e3d6000fd5b505050506040513d60208110156117ed57600080fd5b5051146117f957600080fd5b85600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561183757600080fd5b505af115801561184b573d6000803e3d6000fd5b505050506040513d602081101561186157600080fd5b5051151560011461187157600080fd5b85600160a060020a03166306fdde036040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156118ec57600080fd5b81019080805164010000000081111561190457600080fd5b8201602081018481111561191757600080fd5b815164010000000081118282018710171561193157600080fd5b5050929190505050945085600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156119b657600080fd5b8101908080516401000000008111156119ce57600080fd5b820160208101848111156119e157600080fd5b81516401000000008111828201871017156119fb57600080fd5b505092919050505093506014856040518082805190602001908083835b60208310611a375780518252601f199092019160209182019101611a18565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff191690558751601594899450925082918401908083835b60208310611a9c5780518252601f199092019160209182019101611a7d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382018520805460ff19169055600160a060020a038b16600090815260178352908120558751601a94899450925082918401908083835b60208310611b195780518252601f199092019160209182019101611afa565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206000908190558c81526019909152928320611b65939092509050614b47565b601354611b7990600163ffffffff61357616565b9250601383815481101515611b8a57fe5b60009182526020918290206040805160e0810182526007939093029091018054600160a060020a039081168452600180830154909116848601526002808301805485516101009482161594909402600019011691909104601f8101879004870283018701855280835294959294938601939192909190830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050918352505060038201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b505050505081526020016004820154815260200160058201548152602001600682015481525050915081601388815481101515611d1e57fe5b600091825260209182902083516007909202018054600160a060020a03928316600160a060020a03199182161782558484015160018301805491909416911617909155604083015180519192611d7c92600285019290910190614b8b565b5060608201518051611d98916003840191602090910190614b8b565b506080820151600482015560a0820151600582015560c0909101516006909101556013805484908110611dc757fe5b6000918252602082206007909102018054600160a060020a03199081168255600182018054909116905590611dff6002830182614b47565b611e0d600383016000614b47565b50600060048201819055600582018190556006909101556013805490611e37906000198301614c09565b50611e42338961362b565b604080517ff2fde38b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0388169163f2fde38b91602480830192600092919082900301818387803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050507fe535a54a09da6ce271820b4ad8ff363edca6d9c825770a1471ef054f2b715c1c8587338b604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b83811015611f52578181015183820152602001611f3a565b50505050905090810190601f168015611f7f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050565b60075460ff1681565b600081815260086020526040812054600160a060020a03168015156111fe57600080fd5b60408051606081018252602581527f546865206e6f76656c20457468657265756d206461746162617365206672616d60208201527f65776f726b0000000000000000000000000000000000000000000000000000009181019190915290565b6000601883836040518083838082843790910194855250506040519283900360200190922054600160a060020a03169250505092915050565b600554600160a060020a0316331461207557600080fd5b60075460ff16151561208657600080fd5b601f8190556040805182815290517f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a9181900360200190a150565b6000600160a060020a03821615156120d857600080fd5b50600160a060020a03166000908152600a602052604090205490565b601f5490565b600554600090600160a060020a0316331461211457600080fd5b60075460ff161561212457600080fd5b6000600160a060020a0316601d89896040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214915061216d905057600080fd5b506040805160e060020a6301ffc9a70281527fce8bbf9300000000000000000000000000000000000000000000000000000000600482015290518691600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050506040513d602081101561220657600080fd5b5051151561221357600080fd5b60806040519081016040528087600160a060020a0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160011515815250601d8989604051808383808284379190910194855250506040516020938190038401902084518154600160a060020a031916600160a060020a0390911617815584840151805191946122ff94506001860193500190614b8b565b506040820151805161231b916002840191602090910190614b8b565b50606091909101516003909101805460ff1916911515919091179055601b546000908152601c60205260409020612353908989614c35565b50601b5461236890600163ffffffff61352b16565b601b819055507fd2bbf027ae004cdd72961865da183414adaf0d8be52edea7628ca9c65968cabf88888888888888604051808060200187600160a060020a0316600160a060020a03168152602001806020018060200184810384528b8b82818152602001925080828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843760405192018290039c50909a5050505050505050505050a15050505050505050565b600554600160a060020a0316331461243757600080fd5b600554604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260058054600160a060020a0319169055565b6000601a8383604051808383808284379091019485525050604051928390036020019092205495945050505050565b601e54600160a060020a03163190565b60008181526019602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b50505050509050919050565b600554600160a060020a0316331461257857600080fd5b60075460ff161561258857600080fd5b6007805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600554600160a060020a031681565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b6000818152601c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a0382163314156126b057600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60006060806000601d868660405180838380828437909101948552505060405192839003602001832054600160a060020a031692601d92508991508890808383808284378201915050925050509081526020016040518091039020600101601d8888604051808383808284378201915050925050509081526020016040518091039020600201601d898960405180838380828437919091019485525050604080516020948190038501812060030154875460026101006001831615026000190190911604601f810187900487028301870190935282825260ff16949093508692508301828280156128505780601f1061282557610100808354040283529160200191612850565b820191906000526020600020905b81548152906001019060200180831161283357829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156128de5780601f106128b3576101008083540402835291602001916128de565b820191906000526020600020905b8154815290600101906020018083116128c157829003601f168201915b50505050509150935093509350935092959194509250565b600554600090600160a060020a0316331461291057600080fd5b600c60ff84161061292057600080fd5b81600160a060020a031660048460ff1681548110151561293c57fe5b600091825260209091200154600160a060020a0316141561295c57600080fd5b6004805460ff851690811061296d57fe5b6000918252602080832090910154600160a060020a039081168084526002835260408085205492871680865281862093909355818552600390935282842054918452919092209190915560048054919250839160ff86169081106129cd57fe5b600091825260208083209091018054600160a060020a03948516600160a060020a03199091161790558383168083526002825260408084208490556003835280842093909355825160ff881681529182015291841682820152517fc398d8c9c51e45217ea399888f960fe4f9f9abf5b744f80a1375ddca4ba988569181900360600190a1505050565b600160a060020a031660009081526003602052604090205490565b60075460ff1615612a8157600080fd5b612a8c848484611204565b612a9884848484613725565b1515612aa357600080fd5b50505050565b600554600160a060020a03163314612ac057600080fd5b60075460ff1615612ad057600080fd5b6000600160a060020a0316601d85856040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612b1a905057600080fd5b8181601d86866040518083838082843782019150509250505090815260200160405180910390206002019190612b51929190614c35565b507f8408cb44ca784ff58031c7a35df9537bd4cdfecf2ec952b72ef4e0faaeb9305c8484848460405180806020018060200183810383528787828181526020019250808284379091018481038352858152602001905085858082843760405192018290039850909650505050505050a150505050565b6060612bd2826116a6565b1515612bdd57600080fd5b60008281526012602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a031660009081526017602052604090205490565b6000600482815481101515612c7157fe5b600091825260209091200154600160a060020a031692915050565b601e54600160a060020a031690565b60005490565b600060158383604051808383808284379091019485525050604051928390036020019092205460ff169250505092915050565b600754600090819060ff1615612ce957600080fd5b612d2286868080601f01602080910402602001604051908101604052809392919081815260200183838082843750613892945050505050565b612d5b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613a3f945050505050565b6000600160a060020a0316601d8d8d6040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612da5905057600080fd5b601d8c8c604051808383808284379091019485525050604051928390036020019092206003015460ff1615156001149150612de1905057600080fd5b601f543414612def57600080fd5b60148686604051808383808284379091019485525050604051928390036020019092205460ff16159150612e24905057600080fd5b60158484604051808383808284379091019485525050604051928390036020019092205460ff16159150612e59905057600080fd5b612f538c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050508a8a8080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750613bb1945050505050565b915091509a509a98505050505050505050565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600160a060020a031660009081526002602052604090205490565b600554600160a060020a03163314612fc657600080fd5b612fcf81614664565b50565b606080600060606000806000806000601160008b815260200190815260200160002054915060138281548110151561300657fe5b60009182526020822060079091020154604080517f06fdde030000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216935083926306fdde039260048084019382900301818387803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130ac57600080fd5b8101908080516401000000008111156130c457600080fd5b820160208101848111156130d757600080fd5b81516401000000008111828201871017156130f157600080fd5b505092919050505081600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561313757600080fd5b505af115801561314b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561317457600080fd5b81019080805164010000000081111561318c57600080fd5b8201602081018481111561319f57600080fd5b81516401000000008111828201871017156131b957600080fd5b5050929190505050826013858154811015156131d157fe5b90600052602060002090600702016002016013868154811015156131f157fe5b90600052602060002090600702016004015485600160a060020a0316636e9960c36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561324157600080fd5b505af1158015613255573d6000803e3d6000fd5b505050506040513d602081101561326b57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a038916916318160ddd9160048083019260209291908290030181600087803b1580156132c857600080fd5b505af11580156132dc573d6000803e3d6000fd5b505050506040513d60208110156132f257600080fd5b50518354604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815291869183018282801561337a5780601f1061334f5761010080835404028352916020019161337a565b820191906000526020600020905b81548152906001019060200180831161335d57829003601f168201915b5050505050935098509850985098509850985098505050919395979092949650565b60606010805480602002602001604051908101604052809291908181526020018280548015610df457602002820191906000526020600020905b8154815260200190600101908083116133d6575050505050905090565b600554600160a060020a0316331461340a57600080fd5b60075460ff16151561341b57600080fd5b6000600160a060020a0316601d83836040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150613465905057600080fd5b601d8282604051808383808284379091019485525050604051928390036020019092206003015460ff16151560011491506134a1905057600080fd5b6000601d8383604051808383808284379190910194855250506040805160209481900385018120600301805460ff191696151596909617909555838552928401859052507f84f50d9477b65e771fb11cb0927ab3b1b51de63ce0027f9138e7759c9c9309c49285928592508190810184848082843760405192018290039550909350505050a15050565b818101828110156111fe57fe5b6000821515613549575060006111fe565b5081810281838281151561355957fe5b04146111fe57fe5b6000818381151561356e57fe5b049392505050565b60008282111561358257fe5b50900390565b61359233826146d5565b151561359d57600080fd5b600160a060020a03831615156135b257600080fd5b600160a060020a03821615156135c757600080fd5b6135d18382614734565b6135db8382614798565b6135e5828261489f565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061363a85856148e8565b600084815260126020526040902054600260001961010060018416150201909116041561367857600084815260126020526040812061367891614b47565b60008481526011602052604090205460105490935061369e90600163ffffffff61357616565b91506010828154811015156136af57fe5b90600052602060002001549050806010848154811015156136cc57fe5b600091825260208220019190915560108054849081106136e857fe5b6000918252602090912001556010805490613707906000198301614ca3565b50600093845260116020526040808520859055908452909220555050565b60008061373a85600160a060020a0316614938565b15156137495760019150613889565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156137dc5781810151838201526020016137c4565b50505050905090810190601f1680156138095780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561382b57600080fd5b505af115801561383f573d6000803e3d6000fd5b505050506040513d602081101561385557600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b8060005b815181101561169b5781517f6100000000000000000000000000000000000000000000000000000000000000908390839081106138cf57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613945575081517f7a000000000000000000000000000000000000000000000000000000000000009083908390811061392557fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b806139f1575081517f30000000000000000000000000000000000000000000000000000000000000009083908390811061397b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916101580156139f1575081517f3900000000000000000000000000000000000000000000000000000000000000908390839081106139d157fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613a2c57508181815181101515613a0557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602d60f860020a02145b1515613a3757600080fd5b600101613896565b8060005b815181101561169b5781517f410000000000000000000000000000000000000000000000000000000000000090839083908110613a7c57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613af2575081517f5a0000000000000000000000000000000000000000000000000000000000000090839083908110613ad257fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613b9e575081517f300000000000000000000000000000000000000000000000000000000000000090839083908110613b2857fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613b9e575081517f390000000000000000000000000000000000000000000000000000000000000090839083908110613b7e57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b1515613ba957600080fd5b600101613a43565b600080600080600080613bc2614af7565b6000601d8d6040518082805190602001908083835b60208310613bf65780518252601f199092019160209182019101613bd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a9004600160a060020a0316955085600160a060020a03166363c23d528d8d8d8d6040518563ffffffff1660e060020a0281526004018080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015613cb3578181015183820152602001613c9b565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015613cf2578181015183820152602001613cda565b50505050905001858103835287818151815260200191508051906020019080838360005b83811015613d2e578181015183820152602001613d16565b50505050905090810190601f168015613d5b5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015613d8e578181015183820152602001613d76565b50505050905090810190601f168015613dbb5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b50516040805160e060020a6301ffc9a70281527ff2c320c40000000000000000000000000000000000000000000000000000000060048201529051919650869550859450600160a060020a038516916301ffc9a7916024808201926020929091908290030181600087803b158015613e8157600080fd5b505af1158015613e95573d6000803e3d6000fd5b505050506040513d6020811015613eab57600080fd5b50511515613eb857600080fd5b6040805160e060020a6301ffc9a70281527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613f2357600080fd5b505af1158015613f37573d6000803e3d6000fd5b505050506040513d6020811015613f4d57600080fd5b50511515613f5a57600080fd5b6040805160e060020a6301ffc9a70281527f5b5e139f0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613fc557600080fd5b505af1158015613fd9573d6000803e3d6000fd5b505050506040513d6020811015613fef57600080fd5b50511515613ffc57600080fd5b6040805160e060020a6301ffc9a70281527f780e9d630000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b15801561406757600080fd5b505af115801561407b573d6000803e3d6000fd5b505050506040513d602081101561409157600080fd5b5051151561409e57600080fd5b60e06040519081016040528086600160a060020a0316815260200133600160a060020a031681526020018e8152602001601d8f6040518082805190602001908083835b602083106141005780518252601f1990920191602091820191016140e1565b518151600019602094850361010090810a8201928316921993909316919091179092529490920196875260408051978890038201882060019081018054601f600293821615909802909501909416049485018290048202880182019052838752909450919250508301828280156141b85780601f1061418d576101008083540402835291602001916141b8565b820191906000526020600020905b81548152906001019060200180831161419b57829003601f168201915b505050918352505042602080830191909152600060408084018290526060909301819052601380546001810180835591909252845160079092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054600160a060020a03948516600160a060020a0319918216178255878601517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09184018054919096169116179093559385015180519597509094879492936142a1937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09201920190614b8b565b50606082015180516142bd916003840191602090910190614b8b565b506080820151816004015560a0820151816005015560c08201518160060155505050600160148b6040518082805190602001908083835b602083106143135780518252601f1990920191602091820191016142f4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508a516001926015928d9290918291908401908083835b602083106143855780518252601f199092019160209182019101614366565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420805460ff1916951515959095179094555050601654600160a060020a03871660009081526017909352912081905590506143ec3382614940565b60008181526019602090815260409091208a5161440b928c0190614b8b565b5080601a8a6040518082805190602001908083835b6020831061443f5780518252601f199092019160209182019101614420565b51815160209384036101000a600019018019909216911617905292019485525060405193849003810184209490945550508b5186926018928e9290918291908401908083835b602083106144a45780518252601f199092019160209182019101614485565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092208054600160a060020a031916600160a060020a03949094169390931790925550506016546144fe90600161352b565b6016819055507fe7a9cb501fcfb0cf6c5f86d621f22b9b8df6891d9884abd1b0755e8ac4f5ce3f8a853384604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561459c578181015183820152602001614584565b50505050905090810190601f1680156145c95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1604080517fb5106add0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0387169163b5106add91602480830192600092919082900301818387803b15801561463957600080fd5b505af115801561464d573d6000803e3d6000fd5b50959f929e50919c50505050505050505050505050565b600160a060020a038116151561467957600080fd5b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360058054600160a060020a031916600160a060020a0392909216919091179055565b6000806146e183611fa2565b905080600160a060020a031684600160a060020a0316148061471c575083600160a060020a031661471184610dfe565b600160a060020a0316145b8061472c575061472c8185612f66565b949350505050565b81600160a060020a031661474782611fa2565b600160a060020a03161461475a57600080fd5b600081815260096020526040902054600160a060020a0316156147945760008181526009602052604090208054600160a060020a03191690555b5050565b60008060006147a7858561498f565b6000848152600f6020908152604080832054600160a060020a0389168452600e909252909120549093506147e290600163ffffffff61357616565b600160a060020a0386166000908152600e602052604090208054919350908390811061480a57fe5b9060005260206000200154905080600e600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561484a57fe5b6000918252602080832090910192909255600160a060020a0387168152600e90915260409020805490614881906000198301614ca3565b506000938452600f6020526040808520859055908452909220555050565b60006148ab8383614a18565b50600160a060020a039091166000908152600e6020908152604080832080546001810182559084528284208101859055938352600f909152902055565b6148f28282614734565b6148fc8282614798565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b61494a8282614a9c565b601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672015550565b81600160a060020a03166149a282611fa2565b600160a060020a0316146149b557600080fd5b600160a060020a0382166000908152600a60205260409020546149df90600163ffffffff61357616565b600160a060020a039092166000908152600a60209081526040808320949094559181526008909152208054600160a060020a0319169055565b600081815260086020526040902054600160a060020a031615614a3a57600080fd5b60008181526008602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600a909152902054614a7c90600161352b565b600160a060020a039092166000908152600a602052604090209190915550565b600160a060020a0382161515614ab157600080fd5b614abb828261489f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60e0604051908101604052806000600160a060020a031681526020016000600160a060020a0316815260200160608152602001606081526020016000815260200160008152602001600081525090565b50805460018160011615610100020316600290046000825580601f10614b6d5750612fcf565b601f016020900490600052602060002090810190612fcf9190614cc3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bcc57805160ff1916838001178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578251825591602001919060010190614bde565b50614c05929150614cc3565b5090565b81548183558181111561169b5760070281600702836000526020600020918201910161169b9190614cdd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c765782800160ff19823516178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578235825591602001919060010190614c88565b81548183558181111561169b5760008381526020902061169b9181019083015b610d4691905b80821115614c055760008155600101614cc9565b610d4691905b80821115614c05578054600160a060020a0319908116825560018201805490911690556000614d156002830182614b47565b614d23600383016000614b47565b50600060048201819055600582018190556006820155600701614ce35600a165627a7a7230582034e83603235a22e9c5d037b45500948ef0f2a3c50030a3a5b0fab73452e81dc40029608060405234801561001057600080fd5b5060008054600160a060020a03191633179055610169806100326000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663893d20e88114610064578063aad3ec9614610095575b600054600160a060020a0316331461006257600080fd5b005b34801561007057600080fd5b506100796100b9565b60408051600160a060020a039092168252519081900360200190f35b3480156100a157600080fd5b50610062600160a060020a03600435166024356100c8565b600054600160a060020a031690565b600054600160a060020a031633146100df57600080fd5b30318111156100ed57600080fd5b600160a060020a038216151561010257600080fd5b604051600160a060020a0383169082156108fc029083906000818181858888f19350505050158015610138573d6000803e3d6000fd5b5050505600a165627a7a723058203516617b9e9fa2cba89646e03cd0498b303e32bf1936f2bd93ff88f6aa21c8010029000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x6080604052600436106102835763ffffffff60e060020a6000350416625be27a81146102bf57806301ffc9a7146102e657806306fdde031461031c578063081812fc146103a6578063095ea7b3146103da57806318160ddd14610400578063191655871461041557806319fa8f50146104365780631d3451fe146104685780631ec0db03146104735780631ecbe4231461048857806323b872dd146104a85780632f745c59146104d25780633dc7ec98146104f65780633de31e66146105115780633f4ba83a1461054257806342842e0e146105575780634b14c0ef146105815780634f558e79146105965780634f6ccce7146105ae578063523e6a7b146105c65780635c975abb146105de5780636352211e146105f357806368013fdc1461060b5780636bf7aeee146106205780636fa237951461064057806370a082311461065857806370ed11311461067957806370f0ed8a1461068e578063715018a6146106d357806377cf929f146106e8578063791b4d4e14610708578063808d83c21461071d5780638456cb59146107355780638da5cb5b1461074a57806395d89b411461075f5780639832b57f14610774578063a22cb4651461078c578063a6fc235b146107b2578063ae32c2dc146108d4578063b4d11f35146108fb578063b88d4fde1461091c578063c493679a1461098b578063c87b56dd146109b7578063c8ca1802146109cf578063d13136fd146109f0578063d17b8f9814610a08578063d5002f2e14610a1d578063d8f5a71514610a32578063df59806f14610a52578063e985e9c514610ab8578063f04da65b14610adf578063f2fde38b14610b00578063f6afad4714610b21578063f945d25214610cbd578063fedaf8b014610d22575b6040805133815234602082015281517f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be770929181900390910190a1005b3480156102cb57600080fd5b506102d4610d42565b60408051918252519081900360200190f35b3480156102f257600080fd5b50610308600160e060020a031960043516610d49565b604080519115158252519081900360200190f35b34801561032857600080fd5b50610331610d68565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036b578181015183820152602001610353565b50505050905090810190601f1680156103985780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b257600080fd5b506103be600435610dfe565b60408051600160a060020a039092168252519081900360200190f35b3480156103e657600080fd5b506103fe600160a060020a0360043516602435610e19565b005b34801561040c57600080fd5b506102d4610ec2565b34801561042157600080fd5b506103fe600160a060020a0360043516610ec8565b34801561044257600080fd5b5061044b611044565b60408051600160e060020a03199092168252519081900360200190f35b6103fe600435611052565b34801561047f57600080fd5b506102d46111ca565b34801561049457600080fd5b5061030860048035602481019101356111d0565b3480156104b457600080fd5b506103fe600160a060020a0360043581169060243516604435611204565b3480156104de57600080fd5b506102d4600160a060020a03600435166024356113f1565b34801561050257600080fd5b506103fe60043560243561143e565b34801561051d57600080fd5b506105296004356115b4565b6040805192835260208301919091528051918290030190f35b34801561054e57600080fd5b506103fe611612565b34801561056357600080fd5b506103fe600160a060020a036004358116906024351660443561166f565b34801561058d57600080fd5b506102d46116a0565b3480156105a257600080fd5b506103086004356116a6565b3480156105ba57600080fd5b506102d46004356116c3565b3480156105d257600080fd5b506103fe6004356116f8565b3480156105ea57600080fd5b50610308611f99565b3480156105ff57600080fd5b506103be600435611fa2565b34801561061757600080fd5b50610331611fc6565b34801561062c57600080fd5b506103be6004803560248101910135612025565b34801561064c57600080fd5b506103fe60043561205e565b34801561066457600080fd5b506102d4600160a060020a03600435166120c1565b34801561068557600080fd5b506102d46120f4565b34801561069a57600080fd5b506103fe602460048035828101929082013591600160a060020a03823516916044358082019290810135916064359081019101356120fa565b3480156106df57600080fd5b506103fe612420565b3480156106f457600080fd5b506102d46004803560248101910135612481565b34801561071457600080fd5b506102d46124b0565b34801561072957600080fd5b506103316004356124c0565b34801561074157600080fd5b506103fe612561565b34801561075657600080fd5b506103be6125c0565b34801561076b57600080fd5b506103316125cf565b34801561078057600080fd5b50610331600435612630565b34801561079857600080fd5b506103fe600160a060020a0360043516602435151561269a565b3480156107be57600080fd5b506107d2600480356024810191013561271e565b6040518085600160a060020a0316600160a060020a03168152602001806020018060200184151515158152602001838103835286818151815260200191508051906020019080838360005b8381101561083557818101518382015260200161081d565b50505050905090810190601f1680156108625780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561089557818101518382015260200161087d565b50505050905090810190601f1680156108c25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156108e057600080fd5b506103fe60ff60043516600160a060020a03602435166128f6565b34801561090757600080fd5b506102d4600160a060020a0360043516612a56565b34801561092857600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526103fe94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612a719650505050505050565b34801561099757600080fd5b506103fe6024600480358281019290820135918135918201910135612aa9565b3480156109c357600080fd5b50610331600435612bc7565b3480156109db57600080fd5b506102d4600160a060020a0360043516612c45565b3480156109fc57600080fd5b506103be600435612c60565b348015610a1457600080fd5b506103be612c8c565b348015610a2957600080fd5b506102d4612c9b565b348015610a3e57600080fd5b506103086004803560248101910135612ca1565b610a956024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135612cd4565b60408051600160a060020a03909316835260208301919091528051918290030190f35b348015610ac457600080fd5b50610308600160a060020a0360043581169060243516612f66565b348015610aeb57600080fd5b506102d4600160a060020a0360043516612f94565b348015610b0c57600080fd5b506103fe600160a060020a0360043516612faf565b348015610b2d57600080fd5b50610b39600435612fd2565b60405180806020018060200188600160a060020a0316600160a060020a031681526020018060200187815260200186600160a060020a0316600160a060020a0316815260200185815260200184810384528b818151815260200191508051906020019080838360005b83811015610bba578181015183820152602001610ba2565b50505050905090810190601f168015610be75780820380516001836020036101000a031916815260200191505b5084810383528a5181528a516020918201918c019080838360005b83811015610c1a578181015183820152602001610c02565b50505050905090810190601f168015610c475780820380516001836020036101000a031916815260200191505b5084810382528851815288516020918201918a019080838360005b83811015610c7a578181015183820152602001610c62565b50505050905090810190601f168015610ca75780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cc957600080fd5b50610cd261339c565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d0e578181015183820152602001610cf6565b505050509050019250505060405180910390f35b348015610d2e57600080fd5b506103fe60048035602481019101356133f3565b601b545b90565b600160e060020a03191660009081526006602052604090205460ff1690565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b5050505050905090565b600090815260096020526040902054600160a060020a031690565b6000610e2482611fa2565b9050600160a060020a038381169082161415610e3f57600080fd5b33600160a060020a0382161480610e5b5750610e5b8133612f66565b1515610e6657600080fd5b6000828152600960205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60105490565b600160a060020a03811660009081526002602052604081205481908110610eee57600080fd5b600154610f039030319063ffffffff61352b16565b600160a060020a03841660009081526003602090815260408083205483546002909352922054929450610f5e92610f529190610f4690879063ffffffff61353816565b9063ffffffff61356116565b9063ffffffff61357616565b9050801515610f6c57600080fd5b600160a060020a038316600090815260036020526040902054610f95908263ffffffff61352b16565b600160a060020a038416600090815260036020526040902055600154610fc1908263ffffffff61352b16565b600155604051600160a060020a0384169082156108fc029083906000818181858888f19350505050158015610ffa573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810183905281517fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056929181900390910190a1505050565b60e060020a6301ffc9a70281565b6007546000908190819060ff161561106957600080fd5b611072846116a6565b151560011461108057600080fd5b600084815260116020526040902054601380549194506110c791349190869081106110a757fe5b90600052602060002090600702016005015461352b90919063ffffffff16565b9150816013848154811015156110d957fe5b9060005260206000209060070201600501819055506111213460138581548110151561110157fe5b90600052602060002090600702016006015461352b90919063ffffffff16565b90508060138481548110151561113357fe5b6000918252602091829020600660079092020101919091556040805186815233928101929092523482820152517f4cb5ac089edfdfb75f771ff0cd7c9eebaa766870290f70aec173bccfc5dd9d4d9181900360600190a1601e54604051600160a060020a03909116903480156108fc02916000818181858888f193505050501580156111c3573d6000803e3d6000fd5b5050505050565b60045490565b600060148383604051808383808284379091019485525050604051928390036020019092205460ff16925050505b92915050565b6007546000908190819060ff161561121b57600080fd5b60008481526011602052604090205460138054919450908490811061123c57fe5b6000918252602090912060079091020154600160a060020a0316915081311561126457600080fd5b81600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b505115156001146112dc57600080fd5b6112e7868686613588565b60138054849081106112f557fe5b60009182526020822060079091020154604080517ff36cf0040000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169350839263f36cf0049260048084019382900301818387803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505080600160a060020a031663b5106add866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050600060405180830381600087803b1580156113d157600080fd5b505af11580156113e5573d6000803e3d6000fd5b50505050505050505050565b60006113fc836120c1565b821061140757600080fd5b600160a060020a0383166000908152600e6020526040902080548390811061142b57fe5b9060005260206000200154905092915050565b600080833361144c82611fa2565b600160a060020a03161461145f57600080fd5b60075460ff161561146f57600080fd5b60008581526011602052604090205460138054919450908490811061149057fe5b90600052602060002090600702016005015491508184111515156114b357600080fd5b6114c3828563ffffffff61357616565b60138054859081106114d157fe5b600091825260209182902060056007909202010191909155604080518781523392810192909252818101869052517f2ea7dca2a0a5f9aadef7c8b03a1ca8a2f62f221edfb33624ef188d08c50174d29181900360600190a1601e54604080517faad3ec96000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a039092169163aad3ec969160448082019260009290919082900301818387803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b505050505050505050565b6000818152601160205260408120546013805483929190829081106115d557fe5b9060005260206000209060070201600501546013828154811015156115f657fe5b9060005260206000209060070201600601549250925050915091565b600554600160a060020a0316331461162957600080fd5b60075460ff16151561163a57600080fd5b6007805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b60075460ff161561167f57600080fd5b61169b8383836020604051908101604052806000815250612a71565b505050565b60015490565b600090815260086020526040902054600160a060020a0316151590565b60006116cd610ec2565b82106116d857600080fd5b60108054839081106116e657fe5b90600052602060002001549050919050565b6000806060806000611708614af7565b863361171382611fa2565b600160a060020a03161461172657600080fd5b60075460ff161561173657600080fd5b60008881526011602052604090205460138054919850908890811061175757fe5b60009182526020808320600790920290910154604080517f791b4d4e0000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169950899263791b4d4e9260048084019382900301818787803b1580156117c357600080fd5b505af11580156117d7573d6000803e3d6000fd5b505050506040513d60208110156117ed57600080fd5b5051146117f957600080fd5b85600160a060020a0316636805b84b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561183757600080fd5b505af115801561184b573d6000803e3d6000fd5b505050506040513d602081101561186157600080fd5b5051151560011461187157600080fd5b85600160a060020a03166306fdde036040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156118ec57600080fd5b81019080805164010000000081111561190457600080fd5b8201602081018481111561191757600080fd5b815164010000000081118282018710171561193157600080fd5b5050929190505050945085600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156119b657600080fd5b8101908080516401000000008111156119ce57600080fd5b820160208101848111156119e157600080fd5b81516401000000008111828201871017156119fb57600080fd5b505092919050505093506014856040518082805190602001908083835b60208310611a375780518252601f199092019160209182019101611a18565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff191690558751601594899450925082918401908083835b60208310611a9c5780518252601f199092019160209182019101611a7d565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382018520805460ff19169055600160a060020a038b16600090815260178352908120558751601a94899450925082918401908083835b60208310611b195780518252601f199092019160209182019101611afa565b51815160209384036101000a6000190180199092169116179052920194855250604080519485900382019094206000908190558c81526019909152928320611b65939092509050614b47565b601354611b7990600163ffffffff61357616565b9250601383815481101515611b8a57fe5b60009182526020918290206040805160e0810182526007939093029091018054600160a060020a039081168452600180830154909116848601526002808301805485516101009482161594909402600019011691909104601f8101879004870283018701855280835294959294938601939192909190830182828015611c515780601f10611c2657610100808354040283529160200191611c51565b820191906000526020600020905b815481529060010190602001808311611c3457829003601f168201915b505050918352505060038201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015611ce55780601f10611cba57610100808354040283529160200191611ce5565b820191906000526020600020905b815481529060010190602001808311611cc857829003601f168201915b505050505081526020016004820154815260200160058201548152602001600682015481525050915081601388815481101515611d1e57fe5b600091825260209182902083516007909202018054600160a060020a03928316600160a060020a03199182161782558484015160018301805491909416911617909155604083015180519192611d7c92600285019290910190614b8b565b5060608201518051611d98916003840191602090910190614b8b565b506080820151600482015560a0820151600582015560c0909101516006909101556013805484908110611dc757fe5b6000918252602082206007909102018054600160a060020a03199081168255600182018054909116905590611dff6002830182614b47565b611e0d600383016000614b47565b50600060048201819055600582018190556006909101556013805490611e37906000198301614c09565b50611e42338961362b565b604080517ff2fde38b0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0388169163f2fde38b91602480830192600092919082900301818387803b158015611ea257600080fd5b505af1158015611eb6573d6000803e3d6000fd5b505050507fe535a54a09da6ce271820b4ad8ff363edca6d9c825770a1471ef054f2b715c1c8587338b604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b83811015611f52578181015183820152602001611f3a565b50505050905090810190601f168015611f7f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15050505050505050565b60075460ff1681565b600081815260086020526040812054600160a060020a03168015156111fe57600080fd5b60408051606081018252602581527f546865206e6f76656c20457468657265756d206461746162617365206672616d60208201527f65776f726b0000000000000000000000000000000000000000000000000000009181019190915290565b6000601883836040518083838082843790910194855250506040519283900360200190922054600160a060020a03169250505092915050565b600554600160a060020a0316331461207557600080fd5b60075460ff16151561208657600080fd5b601f8190556040805182815290517f88a973fd5506071e0cf878b30898776c47d5250a7ee1e6ee0b36df3b03c7c16a9181900360200190a150565b6000600160a060020a03821615156120d857600080fd5b50600160a060020a03166000908152600a602052604090205490565b601f5490565b600554600090600160a060020a0316331461211457600080fd5b60075460ff161561212457600080fd5b6000600160a060020a0316601d89896040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214915061216d905057600080fd5b506040805160e060020a6301ffc9a70281527fce8bbf9300000000000000000000000000000000000000000000000000000000600482015290518691600160a060020a038316916301ffc9a7916024808201926020929091908290030181600087803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050506040513d602081101561220657600080fd5b5051151561221357600080fd5b60806040519081016040528087600160a060020a0316815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160011515815250601d8989604051808383808284379190910194855250506040516020938190038401902084518154600160a060020a031916600160a060020a0390911617815584840151805191946122ff94506001860193500190614b8b565b506040820151805161231b916002840191602090910190614b8b565b50606091909101516003909101805460ff1916911515919091179055601b546000908152601c60205260409020612353908989614c35565b50601b5461236890600163ffffffff61352b16565b601b819055507fd2bbf027ae004cdd72961865da183414adaf0d8be52edea7628ca9c65968cabf88888888888888604051808060200187600160a060020a0316600160a060020a03168152602001806020018060200184810384528b8b82818152602001925080828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843760405192018290039c50909a5050505050505050505050a15050505050505050565b600554600160a060020a0316331461243757600080fd5b600554604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260058054600160a060020a0319169055565b6000601a8383604051808383808284379091019485525050604051928390036020019092205495945050505050565b601e54600160a060020a03163190565b60008181526019602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b820191906000526020600020905b81548152906001019060200180831161253857829003601f168201915b50505050509050919050565b600554600160a060020a0316331461257857600080fd5b60075460ff161561258857600080fd5b6007805460ff191660011790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600554600160a060020a031681565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610df45780601f10610dc957610100808354040283529160200191610df4565b6000818152601c602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a0382163314156126b057600080fd5b336000818152600b60209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60006060806000601d868660405180838380828437909101948552505060405192839003602001832054600160a060020a031692601d92508991508890808383808284378201915050925050509081526020016040518091039020600101601d8888604051808383808284378201915050925050509081526020016040518091039020600201601d898960405180838380828437919091019485525050604080516020948190038501812060030154875460026101006001831615026000190190911604601f810187900487028301870190935282825260ff16949093508692508301828280156128505780601f1061282557610100808354040283529160200191612850565b820191906000526020600020905b81548152906001019060200180831161283357829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156128de5780601f106128b3576101008083540402835291602001916128de565b820191906000526020600020905b8154815290600101906020018083116128c157829003601f168201915b50505050509150935093509350935092959194509250565b600554600090600160a060020a0316331461291057600080fd5b600c60ff84161061292057600080fd5b81600160a060020a031660048460ff1681548110151561293c57fe5b600091825260209091200154600160a060020a0316141561295c57600080fd5b6004805460ff851690811061296d57fe5b6000918252602080832090910154600160a060020a039081168084526002835260408085205492871680865281862093909355818552600390935282842054918452919092209190915560048054919250839160ff86169081106129cd57fe5b600091825260208083209091018054600160a060020a03948516600160a060020a03199091161790558383168083526002825260408084208490556003835280842093909355825160ff881681529182015291841682820152517fc398d8c9c51e45217ea399888f960fe4f9f9abf5b744f80a1375ddca4ba988569181900360600190a1505050565b600160a060020a031660009081526003602052604090205490565b60075460ff1615612a8157600080fd5b612a8c848484611204565b612a9884848484613725565b1515612aa357600080fd5b50505050565b600554600160a060020a03163314612ac057600080fd5b60075460ff1615612ad057600080fd5b6000600160a060020a0316601d85856040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612b1a905057600080fd5b8181601d86866040518083838082843782019150509250505090815260200160405180910390206002019190612b51929190614c35565b507f8408cb44ca784ff58031c7a35df9537bd4cdfecf2ec952b72ef4e0faaeb9305c8484848460405180806020018060200183810383528787828181526020019250808284379091018481038352858152602001905085858082843760405192018290039850909650505050505050a150505050565b6060612bd2826116a6565b1515612bdd57600080fd5b60008281526012602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125555780601f1061252a57610100808354040283529160200191612555565b600160a060020a031660009081526017602052604090205490565b6000600482815481101515612c7157fe5b600091825260209091200154600160a060020a031692915050565b601e54600160a060020a031690565b60005490565b600060158383604051808383808284379091019485525050604051928390036020019092205460ff169250505092915050565b600754600090819060ff1615612ce957600080fd5b612d2286868080601f01602080910402602001604051908101604052809392919081815260200183838082843750613892945050505050565b612d5b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613a3f945050505050565b6000600160a060020a0316601d8d8d6040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150612da5905057600080fd5b601d8c8c604051808383808284379091019485525050604051928390036020019092206003015460ff1615156001149150612de1905057600080fd5b601f543414612def57600080fd5b60148686604051808383808284379091019485525050604051928390036020019092205460ff16159150612e24905057600080fd5b60158484604051808383808284379091019485525050604051928390036020019092205460ff16159150612e59905057600080fd5b612f538c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050508a8a8080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505089898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750613bb1945050505050565b915091509a509a98505050505050505050565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b600160a060020a031660009081526002602052604090205490565b600554600160a060020a03163314612fc657600080fd5b612fcf81614664565b50565b606080600060606000806000806000601160008b815260200190815260200160002054915060138281548110151561300657fe5b60009182526020822060079091020154604080517f06fdde030000000000000000000000000000000000000000000000000000000081529051600160a060020a03909216935083926306fdde039260048084019382900301818387803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156130ac57600080fd5b8101908080516401000000008111156130c457600080fd5b820160208101848111156130d757600080fd5b81516401000000008111828201871017156130f157600080fd5b505092919050505081600160a060020a03166395d89b416040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561313757600080fd5b505af115801561314b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561317457600080fd5b81019080805164010000000081111561318c57600080fd5b8201602081018481111561319f57600080fd5b81516401000000008111828201871017156131b957600080fd5b5050929190505050826013858154811015156131d157fe5b90600052602060002090600702016002016013868154811015156131f157fe5b90600052602060002090600702016004015485600160a060020a0316636e9960c36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561324157600080fd5b505af1158015613255573d6000803e3d6000fd5b505050506040513d602081101561326b57600080fd5b5051604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051600160a060020a038916916318160ddd9160048083019260209291908290030181600087803b1580156132c857600080fd5b505af11580156132dc573d6000803e3d6000fd5b505050506040513d60208110156132f257600080fd5b50518354604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815291869183018282801561337a5780601f1061334f5761010080835404028352916020019161337a565b820191906000526020600020905b81548152906001019060200180831161335d57829003601f168201915b5050505050935098509850985098509850985098505050919395979092949650565b60606010805480602002602001604051908101604052809291908181526020018280548015610df457602002820191906000526020600020905b8154815260200190600101908083116133d6575050505050905090565b600554600160a060020a0316331461340a57600080fd5b60075460ff16151561341b57600080fd5b6000600160a060020a0316601d83836040518083838082843790910194855250506040519283900360200190922054600160a060020a031692909214159150613465905057600080fd5b601d8282604051808383808284379091019485525050604051928390036020019092206003015460ff16151560011491506134a1905057600080fd5b6000601d8383604051808383808284379190910194855250506040805160209481900385018120600301805460ff191696151596909617909555838552928401859052507f84f50d9477b65e771fb11cb0927ab3b1b51de63ce0027f9138e7759c9c9309c49285928592508190810184848082843760405192018290039550909350505050a15050565b818101828110156111fe57fe5b6000821515613549575060006111fe565b5081810281838281151561355957fe5b04146111fe57fe5b6000818381151561356e57fe5b049392505050565b60008282111561358257fe5b50900390565b61359233826146d5565b151561359d57600080fd5b600160a060020a03831615156135b257600080fd5b600160a060020a03821615156135c757600080fd5b6135d18382614734565b6135db8382614798565b6135e5828261489f565b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080600061363a85856148e8565b600084815260126020526040902054600260001961010060018416150201909116041561367857600084815260126020526040812061367891614b47565b60008481526011602052604090205460105490935061369e90600163ffffffff61357616565b91506010828154811015156136af57fe5b90600052602060002001549050806010848154811015156136cc57fe5b600091825260208220019190915560108054849081106136e857fe5b6000918252602090912001556010805490613707906000198301614ca3565b50600093845260116020526040808520859055908452909220555050565b60008061373a85600160a060020a0316614938565b15156137495760019150613889565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b838110156137dc5781810151838201526020016137c4565b50505050905090810190601f1680156138095780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561382b57600080fd5b505af115801561383f573d6000803e3d6000fd5b505050506040513d602081101561385557600080fd5b5051600160e060020a031981167f150b7a020000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b8060005b815181101561169b5781517f6100000000000000000000000000000000000000000000000000000000000000908390839081106138cf57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613945575081517f7a000000000000000000000000000000000000000000000000000000000000009083908390811061392557fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b806139f1575081517f30000000000000000000000000000000000000000000000000000000000000009083908390811061397b57fe5b90602001015160f860020a900460f860020a02600160f860020a031916101580156139f1575081517f3900000000000000000000000000000000000000000000000000000000000000908390839081106139d157fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613a2c57508181815181101515613a0557fe5b90602001015160f860020a900460f860020a02600160f860020a031916602d60f860020a02145b1515613a3757600080fd5b600101613896565b8060005b815181101561169b5781517f410000000000000000000000000000000000000000000000000000000000000090839083908110613a7c57fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613af2575081517f5a0000000000000000000000000000000000000000000000000000000000000090839083908110613ad257fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b80613b9e575081517f300000000000000000000000000000000000000000000000000000000000000090839083908110613b2857fe5b90602001015160f860020a900460f860020a02600160f860020a03191610158015613b9e575081517f390000000000000000000000000000000000000000000000000000000000000090839083908110613b7e57fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b1515613ba957600080fd5b600101613a43565b600080600080600080613bc2614af7565b6000601d8d6040518082805190602001908083835b60208310613bf65780518252601f199092019160209182019101613bd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060000160009054906101000a9004600160a060020a0316955085600160a060020a03166363c23d528d8d8d8d6040518563ffffffff1660e060020a0281526004018080602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015613cb3578181015183820152602001613c9b565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015613cf2578181015183820152602001613cda565b50505050905001858103835287818151815260200191508051906020019080838360005b83811015613d2e578181015183820152602001613d16565b50505050905090810190601f168015613d5b5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015613d8e578181015183820152602001613d76565b50505050905090810190601f168015613dbb5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b50516040805160e060020a6301ffc9a70281527ff2c320c40000000000000000000000000000000000000000000000000000000060048201529051919650869550859450600160a060020a038516916301ffc9a7916024808201926020929091908290030181600087803b158015613e8157600080fd5b505af1158015613e95573d6000803e3d6000fd5b505050506040513d6020811015613eab57600080fd5b50511515613eb857600080fd5b6040805160e060020a6301ffc9a70281527f80ac58cd0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613f2357600080fd5b505af1158015613f37573d6000803e3d6000fd5b505050506040513d6020811015613f4d57600080fd5b50511515613f5a57600080fd5b6040805160e060020a6301ffc9a70281527f5b5e139f0000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b158015613fc557600080fd5b505af1158015613fd9573d6000803e3d6000fd5b505050506040513d6020811015613fef57600080fd5b50511515613ffc57600080fd5b6040805160e060020a6301ffc9a70281527f780e9d630000000000000000000000000000000000000000000000000000000060048201529051600160a060020a038516916301ffc9a79160248083019260209291908290030181600087803b15801561406757600080fd5b505af115801561407b573d6000803e3d6000fd5b505050506040513d602081101561409157600080fd5b5051151561409e57600080fd5b60e06040519081016040528086600160a060020a0316815260200133600160a060020a031681526020018e8152602001601d8f6040518082805190602001908083835b602083106141005780518252601f1990920191602091820191016140e1565b518151600019602094850361010090810a8201928316921993909316919091179092529490920196875260408051978890038201882060019081018054601f600293821615909802909501909416049485018290048202880182019052838752909450919250508301828280156141b85780601f1061418d576101008083540402835291602001916141b8565b820191906000526020600020905b81548152906001019060200180831161419b57829003601f168201915b505050918352505042602080830191909152600060408084018290526060909301819052601380546001810180835591909252845160079092027f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09081018054600160a060020a03948516600160a060020a0319918216178255878601517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09184018054919096169116179093559385015180519597509094879492936142a1937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09201920190614b8b565b50606082015180516142bd916003840191602090910190614b8b565b506080820151816004015560a0820151816005015560c08201518160060155505050600160148b6040518082805190602001908083835b602083106143135780518252601f1990920191602091820191016142f4565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508a516001926015928d9290918291908401908083835b602083106143855780518252601f199092019160209182019101614366565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420805460ff1916951515959095179094555050601654600160a060020a03871660009081526017909352912081905590506143ec3382614940565b60008181526019602090815260409091208a5161440b928c0190614b8b565b5080601a8a6040518082805190602001908083835b6020831061443f5780518252601f199092019160209182019101614420565b51815160209384036101000a600019018019909216911617905292019485525060405193849003810184209490945550508b5186926018928e9290918291908401908083835b602083106144a45780518252601f199092019160209182019101614485565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092208054600160a060020a031916600160a060020a03949094169390931790925550506016546144fe90600161352b565b6016819055507fe7a9cb501fcfb0cf6c5f86d621f22b9b8df6891d9884abd1b0755e8ac4f5ce3f8a853384604051808060200185600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828103825286818151815260200191508051906020019080838360005b8381101561459c578181015183820152602001614584565b50505050905090810190601f1680156145c95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1604080517fb5106add0000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0387169163b5106add91602480830192600092919082900301818387803b15801561463957600080fd5b505af115801561464d573d6000803e3d6000fd5b50959f929e50919c50505050505050505050505050565b600160a060020a038116151561467957600080fd5b600554604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360058054600160a060020a031916600160a060020a0392909216919091179055565b6000806146e183611fa2565b905080600160a060020a031684600160a060020a0316148061471c575083600160a060020a031661471184610dfe565b600160a060020a0316145b8061472c575061472c8185612f66565b949350505050565b81600160a060020a031661474782611fa2565b600160a060020a03161461475a57600080fd5b600081815260096020526040902054600160a060020a0316156147945760008181526009602052604090208054600160a060020a03191690555b5050565b60008060006147a7858561498f565b6000848152600f6020908152604080832054600160a060020a0389168452600e909252909120549093506147e290600163ffffffff61357616565b600160a060020a0386166000908152600e602052604090208054919350908390811061480a57fe5b9060005260206000200154905080600e600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561484a57fe5b6000918252602080832090910192909255600160a060020a0387168152600e90915260409020805490614881906000198301614ca3565b506000938452600f6020526040808520859055908452909220555050565b60006148ab8383614a18565b50600160a060020a039091166000908152600e6020908152604080832080546001810182559084528284208101859055938352600f909152902055565b6148f28282614734565b6148fc8282614798565b6040518190600090600160a060020a038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000903b1190565b61494a8282614a9c565b601080546000838152601160205260408120829055600182018355919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672015550565b81600160a060020a03166149a282611fa2565b600160a060020a0316146149b557600080fd5b600160a060020a0382166000908152600a60205260409020546149df90600163ffffffff61357616565b600160a060020a039092166000908152600a60209081526040808320949094559181526008909152208054600160a060020a0319169055565b600081815260086020526040902054600160a060020a031615614a3a57600080fd5b60008181526008602090815260408083208054600160a060020a031916600160a060020a0387169081179091558352600a909152902054614a7c90600161352b565b600160a060020a039092166000908152600a602052604090209190915550565b600160a060020a0382161515614ab157600080fd5b614abb828261489f565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60e0604051908101604052806000600160a060020a031681526020016000600160a060020a0316815260200160608152602001606081526020016000815260200160008152602001600081525090565b50805460018160011615610100020316600290046000825580601f10614b6d5750612fcf565b601f016020900490600052602060002090810190612fcf9190614cc3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614bcc57805160ff1916838001178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578251825591602001919060010190614bde565b50614c05929150614cc3565b5090565b81548183558181111561169b5760070281600702836000526020600020918201910161169b9190614cdd565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614c765782800160ff19823516178555614bf9565b82800160010185558215614bf9579182015b82811115614bf9578235825591602001919060010190614c88565b81548183558181111561169b5760008381526020902061169b9181019083015b610d4691905b80821115614c055760008155600101614cc9565b610d4691905b80821115614c05578054600160a060020a0319908116825560018201805490911690556000614d156002830182614b47565b614d23600383016000614b47565b50600060048201819055600582018190556006820155600701614ce35600a165627a7a7230582034e83603235a22e9c5d037b45500948ef0f2a3c50030a3a5b0fab73452e81dc40029

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _beneficiaries (address[]): 0xB52B7EdA722249499e3a28B5BB6c778ee0Ac462c
Arg [1] : _shares (uint256[]): 100

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 000000000000000000000000b52b7eda722249499e3a28b5bb6c778ee0ac462c
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064


Swarm Source

bzzr://3516617b9e9fa2cba89646e03cd0498b303e32bf1936f2bd93ff88f6aa21c801
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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