ETH Price: $3,058.48 (+1.13%)
Gas: 3 Gwei

Token

CryptoServalGame (CSG)
 

Overview

Max Total Supply

579 CSG

Holders

156

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*🙎🏼‍♂️.eth
Balance
2 CSG
0xb44b8f1f521d4b0f6643481eebd43e4583232c76
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CryptoServal is a game based on smart contracts running on the Ethereum blockchain, centered around breedable, collectible, and fighting creatures.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoServalV2

Compiler Version
v0.5.0+commit.1d4f565a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-05-24
*/

// File: node_modules\openzeppelin-solidity\contracts\introspection\IERC165.sol

pragma solidity ^0.5.0;

/**
 * @title IERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {
    /**
     * @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: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721.sol

pragma solidity ^0.5.0;


/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);

    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 memory data) public;
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol

pragma solidity ^0.5.0;

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

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

pragma solidity ^0.5.0;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Address.sol

pragma solidity ^0.5.0;

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * 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 account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) 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.
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}

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

pragma solidity ^0.5.0;


/**
 * @title ERC165
 * @author Matt Condon (@shrugs)
 * @dev Implements ERC165 using a lookup table.
 */
contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    /**
     * 0x01ffc9a7 ===
     *     bytes4(keccak256('supportsInterface(bytes4)'))
     */

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

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

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

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

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

pragma solidity ^0.5.0;






/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;

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

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

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

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

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

    bytes4 private constant _INTERFACE_ID_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)'))
     */

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

    /**
     * @dev Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0));
        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 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
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId));
        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));

        _transferFrom(from, to, tokenId);
    }

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

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

    /**
     * @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) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     *    is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        address owner = ownerOf(tokenId);
        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
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0));
        require(!_exists(tokenId));

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to] = _ownedTokensCount[to].add(1);

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

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

        _clearApproval(tokenId);

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

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

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

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

        _clearApproval(tokenId);

        _ownedTokensCount[from] = _ownedTokensCount[from].sub(1);
        _ownedTokensCount[to] = _ownedTokensCount[to].add(1);

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @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 _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Enumerable.sol

pragma solidity ^0.5.0;


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

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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Enumerable.sol

pragma solidity ^0.5.0;




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

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

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

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

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

    /**
     * @dev Constructor function
     */
    constructor () public {
        // register the supported interface to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner));
        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 transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
    */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

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

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

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

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

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Metadata.sol

pragma solidity ^0.5.0;


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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Metadata.sol

pragma solidity ^0.5.0;




contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

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

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

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        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) external view returns (string memory) {
        require(_exists(tokenId));
        return _tokenURIs[tokenId];
    }

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

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

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

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Full.sol

pragma solidity ^0.5.0;




/**
 * @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 ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}

// File: contracts\GameData.sol

pragma solidity 0.5.0;


contract GameData {
    struct Animal {
        uint256 wildAnimalId;
        uint256 xp;
        uint16 effectiveness;
        uint16[3] accessories;      
    }
}

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

pragma solidity ^0.5.0;

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

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return 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 OwnershipTransferred(_owner, address(0));
        _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: contracts\Restricted.sol

pragma solidity 0.5.0;



contract Restricted is Ownable {
    mapping(address => bool) private addressIsAdmin;
    bool private isActive = true;

    modifier onlyAdmin() {
        require(addressIsAdmin[msg.sender] || msg.sender == owner(), "Sender is not admin");
        _;
    }

    modifier contractIsActive() {
        require(isActive, "Contract is not active");
        _;
    }

    function addAdmin(address adminAddress) public onlyOwner {
        addressIsAdmin[adminAddress] = true;
    }

    function removeAdmin(address adminAddress) public onlyOwner {
        addressIsAdmin[adminAddress] = false;
    }

    function pauseContract() public onlyOwner {
        isActive = false;
    }

    function activateContract() public onlyOwner {
        isActive = true;
    }
}

// File: contracts\IDnaRepository.sol

pragma solidity 0.5.0;


contract IDnaRepository {
    function getDna(uint256 _dnaId)
        public
        view
        returns(
            uint animalId,
            address owner,
            uint16 effectiveness,
            uint256 id
        );
}

// File: contracts\IServal.sol

pragma solidity 0.5.0;



contract IServal is IDnaRepository {
    function getAnimal(uint256 _animalId)
        public
        view
        returns(
            uint256 countryId,
            bytes32 name,
            uint8 rarity,
            uint256 currentValue,
            uint256 targetValue,
            address owner,
            uint256 id
        );
}

// File: contracts\IMarketplace.sol

pragma solidity 0.5.0;


contract IMarketplace {
    function createAuction(
        uint256 _tokenId,
        uint128 startPrice,
        uint128 endPrice,
        uint128 duration
    )
        external;
}

// File: contracts\CryptoServalV2.sol

pragma solidity 0.5.0;









contract CryptoServalV2 is ERC721Full("CryptoServalGame", "CSG"), GameData, Restricted {
    address private servalChainAddress;
    IServal private cryptoServalContract;
    IDnaRepository private dnaRepositoryContract;
    IMarketplace private marketplaceContract;

    mapping(uint256 => bool) private usedNonces;
    mapping(address => uint256) private addressToGems;

    mapping(bytes32 => bool) private withdrawnHashedContractAnimals;
    mapping(bytes32 => bool) private withdrawnHashedRepositoryAnimals;

    Animal[] internal animals;

    uint256 private syncCost = 0.003 ether;
    uint256 private spawnCost = 0.01 ether;

    uint256 private spawnWindow = 1 hours;
    uint256[3] private rarityToSpawnGemCost = [30, 60, 90];

    using SafeMath for uint256;

    event GemsAddedEvent(
        address to,
        uint256 gemAmount
    );

    event XpAddedEvent(
        uint256 animalId,
        uint256 xpAmount
    );

    event AccessoryAddedEvent(
        uint256 animalId,
        uint8 accessorySlot,
        uint16 accessoryId
    );

    function setServalChainAddress(address newServalChainAddress) external onlyAdmin() {
        servalChainAddress = newServalChainAddress;
    }

    function setCryptoServalContract(address cryptoServalContractAddress) external onlyAdmin() {
        cryptoServalContract = IServal(cryptoServalContractAddress);
    }

    function setDnaRepositoryContract(address dnaRepositoryContractAddress) external onlyAdmin() {
        dnaRepositoryContract = IDnaRepository(dnaRepositoryContractAddress);
    }

    function setMarketplaceContract(address marketplaceContractAddress) external onlyAdmin() {
        marketplaceContract = IMarketplace(marketplaceContractAddress);
    }

    function setSyncCost(uint256 _syncCost) external onlyAdmin() {
        syncCost = _syncCost;
    }

    function setSpawnCost(uint256 _spawnCost) external onlyAdmin() {
        spawnCost = _spawnCost;
    }

    function setRarityToSpawnGemCost(uint8 index, uint256 targetValue) external onlyAdmin {
        rarityToSpawnGemCost[index] = targetValue;
    }

    function sequenceContractDna(uint256 wildAnimalId, uint256[] calldata dnaIds) external {
        require(!isWithdrawnFromContract(msg.sender, wildAnimalId), "Animal was already minted from contract");  
        withdrawnHashedContractAnimals[keccak256(abi.encodePacked(msg.sender, wildAnimalId))] = true;
        sequenceDna(wildAnimalId, dnaIds, cryptoServalContract);  
    }

    function sequenceRepositoryDna(uint256 wildAnimalId, uint256[] calldata dnaIds) external {
        require(!isWithdrawnFromRepository(msg.sender, wildAnimalId), "Animal was already minted from repository");  
        withdrawnHashedRepositoryAnimals[keccak256(abi.encodePacked(msg.sender, wildAnimalId))] = true;
        sequenceDna(wildAnimalId, dnaIds, dnaRepositoryContract);  
    }

    function spawnOffspring(
        uint256 wildAnimalId,
        uint16 effectiveness,
        uint256 timestamp,
        uint256 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
        )
        external
        payable
        usesNonce(nonce)
        spawnPriced()
    {        
        require(now < timestamp.add(spawnWindow), "Animal spawn expired");
        require(effectiveness <= 100, "Invalid effectiveness");
        require(isServalChainSigner(
                keccak256(abi.encodePacked(wildAnimalId, effectiveness, timestamp, nonce, msg.sender, this)),
                v,
                r,
                s
            ), "Invalid signature");

        uint8 rarity;
        (, , rarity, , , ,) = cryptoServalContract.getAnimal(wildAnimalId);
        // SafeMath reverts if sender does not have enough gems
        addressToGems[msg.sender] = addressToGems[msg.sender].sub(rarityToSpawnGemCost[rarity]);
        mintAnimal(wildAnimalId, effectiveness, msg.sender);
    }
        
    function requestGems(
        uint256 amount,
        uint256 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
        )
        external
        payable        
        usesNonce(nonce)
        syncPriced()
    {
        require(isServalChainSigner(
            keccak256(abi.encodePacked(amount, nonce, msg.sender, this)), v, r, s),
            "Invalid signature"
            );        
        addGems(msg.sender, amount);        
    }

    function addXp(
        uint256 animalId,
        uint256 xpToAdd,
        uint256 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
        )
        external
        payable
        syncPriced()
        usesNonce(nonce)
    {
        require(isServalChainSigner(
            keccak256(abi.encodePacked(animalId, xpToAdd, nonce, msg.sender, this)), v, r, s),
            "Invalid signature"
            );
        animals[animalId].xp = animals[animalId].xp.add(xpToAdd);

        emit XpAddedEvent(animalId, xpToAdd);
    }
      
    function addAccessories(
        uint256 animalId,
        uint8 accessorySlot,
        uint16 accessoryId,
        uint256 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
        )
        external
        payable
        syncPriced()      
        usesNonce(nonce)
    {
        require(isServalChainSigner(
                keccak256(abi.encodePacked(animalId, accessorySlot, accessoryId, nonce, msg.sender, this)),
                v,
                r,
                s
            ),
            "Invalid signature"
            );        
        require(msg.sender == ownerOf(animalId));
        require(animals[animalId].accessories[accessorySlot] == 0);     
        
        animals[animalId].accessories[accessorySlot] = accessoryId;
        emit AccessoryAddedEvent(animalId, accessorySlot, accessoryId);
    }

    function fuseAnimal(uint256 animalId) external payable syncPriced() {        
        Animal memory animal = animals[animalId];

        address wildAnimalOwner;
        uint8 rarity;
        (, , rarity, , , wildAnimalOwner,) = cryptoServalContract.getAnimal(animal.wildAnimalId);
        
        uint256 gemsToAdd = uint256(animal.effectiveness).div(4);
        uint256 rarityMultiplier = uint256(rarity).add(1);

        if (gemsToAdd > 2) {            
            gemsToAdd = gemsToAdd.mul(rarityMultiplier);
        }

        _burn(msg.sender, animalId);
        delete animals[animalId];

        addGems(msg.sender, gemsToAdd);
        addGems(wildAnimalOwner, rarityMultiplier.mul(5));
    }

    function createAuction(
        uint256 _tokenId,
        uint128 startPrice,
        uint128 endPrice,
        uint128 duration
    )
        external
    {
        // approve, not a transfer, let marketplace confirm the original owner and take ownership
        approve(address(marketplaceContract), _tokenId);
        marketplaceContract.createAuction(_tokenId, startPrice, endPrice, duration);
    } 

    function getAnimal(uint256 animalId)
    external
    view
    returns(
        address owner,
        uint256 wildAnimalId,
        uint256 xp,
        uint16 effectiveness,
        uint16[3] memory accessories
    )
    {
        Animal memory animal = animals[animalId];
        return (
            ownerOf(animalId),
            animal.wildAnimalId,
            animal.xp,
            animal.effectiveness,
            animal.accessories
        );
    }

    function getPlayerAnimals(address playerAddress)
        external
        view
        returns(uint256[] memory)
    {
        return _tokensOfOwner(playerAddress);
    }

    function getPlayerGems(address addr) external view returns(uint256) {
        return addressToGems[addr];
    }

    function getSyncCost() external view returns(uint256) {
        return syncCost;
    }

    function getSpawnCost() external view returns(uint256) {
        return spawnCost;
    }

    function getRarityToSpawnGemCost(uint8 index) public view returns(uint256) {
        return rarityToSpawnGemCost[index];
    }

    function isWithdrawnFromContract(address owner, uint256 wildAnimalId) public view returns(bool) {
        return withdrawnHashedContractAnimals[keccak256(abi.encodePacked(owner, wildAnimalId))];
    }

    function isWithdrawnFromRepository(address owner, uint256 wildAnimalId) public view returns(bool) {
        return withdrawnHashedRepositoryAnimals[keccak256(abi.encodePacked(owner, wildAnimalId))]; 
    }

    function isServalChainSigner(bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) public view returns (bool) {
        return servalChainAddress == ecrecover(msgHash, v, r, s);
    }

    function withdrawContract() public onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

    function sequenceDna(uint256 animalToSpawn, uint256[] memory dnaIds, IDnaRepository dnaContract) private {
        uint256 highestEffectiveness = 0;
        uint256 sumOfEffectiveness = 0;

        require(!hasDuplicateMember(dnaIds), "DNA array contains the same cards");
        
        for (uint256 i = 0; i < dnaIds.length; i++) {
            uint animalId;
            address owner;
            uint16 effectiveness;
            uint256 id;

            (animalId, owner, effectiveness, id) = dnaContract.getDna(dnaIds[i]);

            require(animalId == animalToSpawn, "Provided DNA has incorrect wild animal id");
            require(msg.sender == owner, "Sender is not owner of DNA");

            if (effectiveness > highestEffectiveness) { 
                highestEffectiveness = effectiveness;
            }

            sumOfEffectiveness = sumOfEffectiveness.add(effectiveness);
        }
        
        uint256 effectivenessBonus = (sumOfEffectiveness.sub(highestEffectiveness)).div(10); 
        uint256 finalEffectiveness = highestEffectiveness.add(effectivenessBonus);
        if (finalEffectiveness > 100) {
            addGems(msg.sender, finalEffectiveness.sub(100));
            
            finalEffectiveness = 100;            
        }
        
        mintAnimal(animalToSpawn, uint16(finalEffectiveness), msg.sender);
    }

    function hasDuplicateMember(uint256[] memory uintArray) private pure returns(bool) {
        uint256 uintArrayLength = uintArray.length;
        for (uint256 i = 0; i < uintArrayLength - 1; i++) {
            for (uint256 u = i + 1; u < uintArrayLength; u++) {
                if (uintArray[i] == uintArray[u]) {
                    return true;
                }
            }
        }

        return false;
    }

    function mintAnimal(uint256 wildAnimalId, uint16 effectiveness, address mintTo) private
    {
        Animal memory animal = Animal(
            wildAnimalId,
            0,
            effectiveness,
            [uint16(0), uint16(0), uint16(0)]
        ); 
        uint256 id = animals.length; // id before push
        animals.push(animal);
        _mint(mintTo, id);
    }

    function addGems(address receiver, uint256 gemsCount) private {
        addressToGems[receiver] = addressToGems[receiver].add(gemsCount);

        emit GemsAddedEvent(receiver, gemsCount);
    }

    modifier usesNonce(uint256 nonce) {
        require(!usedNonces[nonce], "Nonce already used");
        usedNonces[nonce] = true;
        _;
    }

    modifier syncPriced() {
        require(msg.value == syncCost, "Sync price not paid");
        _;
    }

    modifier spawnPriced() {
        require(msg.value == spawnCost, "Mint price not paid");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint128"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"animalId","type":"uint256"},{"name":"xpToAdd","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"addXp","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"marketplaceContractAddress","type":"address"}],"name":"setMarketplaceContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"}],"name":"isWithdrawnFromContract","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":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"effectiveness","type":"uint16"},{"name":"timestamp","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"spawnOffspring","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"msgHash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"isServalChainSigner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"cryptoServalContractAddress","type":"address"}],"name":"setCryptoServalContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"requestGems","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint8"}],"name":"getRarityToSpawnGemCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_syncCost","type":"uint256"}],"name":"setSyncCost","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":false,"inputs":[],"name":"pauseContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"animalId","type":"uint256"}],"name":"getAnimal","outputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"},{"name":"xp","type":"uint256"},{"name":"effectiveness","type":"uint16"},{"name":"accessories","type":"uint16[3]"}],"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":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"addAdmin","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":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"}],"name":"isWithdrawnFromRepository","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"dnaIds","type":"uint256[]"}],"name":"sequenceContractDna","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":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activateContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint8"},{"name":"targetValue","type":"uint256"}],"name":"setRarityToSpawnGemCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"dnaIds","type":"uint256[]"}],"name":"sequenceRepositoryDna","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spawnCost","type":"uint256"}],"name":"setSpawnCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSyncCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSpawnCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newServalChainAddress","type":"address"}],"name":"setServalChainAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"playerAddress","type":"address"}],"name":"getPlayerAnimals","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"animalId","type":"uint256"}],"name":"fuseAnimal","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"dnaRepositoryContractAddress","type":"address"}],"name":"setDnaRepositoryContract","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getPlayerGems","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"animalId","type":"uint256"},{"name":"accessorySlot","type":"uint8"},{"name":"accessoryId","type":"uint16"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"addAccessories","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"gemAmount","type":"uint256"}],"name":"GemsAddedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"animalId","type":"uint256"},{"indexed":false,"name":"xpAmount","type":"uint256"}],"name":"XpAddedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"animalId","type":"uint256"},{"indexed":false,"name":"accessorySlot","type":"uint8"},{"indexed":false,"name":"accessoryId","type":"uint16"}],"name":"AccessoryAddedEvent","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":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"}]

60806040526001600e60006101000a81548160ff021916908315150217905550660aa87bee538000601755662386f26fc10000601855610e10601955606060405190810160405280601e60ff168152602001603c60ff168152602001605a60ff16815250601a9060036200007592919062000390565b506040805190810160405280601081526020017f43727970746f53657276616c47616d65000000000000000000000000000000008152506040805190810160405280600381526020017f43534700000000000000000000000000000000000000000000000000000000008152508181620001216301ffc9a77c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b6200015e6380ac58cd7c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b6200019b63780e9d637c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b8160099080519060200190620001b3929190620003da565b5080600a9080519060200190620001cc929190620003da565b506200020a635b5e139f7c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b5050505033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a362000489565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515156200032457600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8260038101928215620003c7579160200282015b82811115620003c6578251829060ff16905591602001919060010190620003a4565b5b509050620003d6919062000461565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200041d57805160ff19168380011785556200044e565b828001600101855582156200044e579182015b828111156200044d57825182559160200191906001019062000430565b5b5090506200045d919062000461565b5090565b6200048691905b808211156200048257600081600090555060010162000468565b5090565b90565b615c1c80620004996000396000f3fe608060405260043610610251576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063011879db1461025657806301ffc9a7146102e557806306fdde0314610357578063081812fc146103e7578063095ea7b3146104625780630f1211f8146104bd5780631102610e146105205780631785f53c1461057157806318160ddd146105c257806322c02de5146105ed57806323b872dd1461066057806328bac61a146106db5780632d0270ce1461074c5780632f745c59146107c057806330114c311461082f57806330c9430c146108805780633cbaa632146108d95780633d7988b71461092b57806342842e0e14610966578063439766ce146109e157806345d3cc81146109f85780634f6ccce714610abf5780636352211e14610b0e5780637048027514610b8957806370a0823114610bda578063715018a614610c3f57806372586af514610c565780637ad0d4f014610cc95780638da5cb5b14610d595780638f32d59b14610db05780638fda356d14610ddf57806395d89b4114610df657806399c1c3d014610e865780639da9df3e14610ece578063a0f10e7414610ee5578063a22cb46514610f75578063a387669e14610fd2578063a5e687e31461100d578063b57eba2a14611038578063b7f0709614611063578063b88d4fde146110b4578063ba622ddc146111c6578063c87b56dd1461126c578063cfdd5da114611320578063e23e5e171461134e578063e985e9c51461139f578063f2fde38b14611428578063f61a73fc14611479578063fde9e2b6146114de575b600080fd5b34801561026257600080fd5b506102e36004803603608081101561027957600080fd5b810190808035906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff169060200190929190505050611552565b005b3480156102f157600080fd5b5061033d6004803603602081101561030857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506116b1565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ac578082015181840152602081019050610391565b50505050905090810190601f1680156103d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f357600080fd5b506104206004803603602081101561040a57600080fd5b81019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046e57600080fd5b506104bb6004803603604081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061180b565b005b61051e600480360360c08110156104d357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611950565b005b34801561052c57600080fd5b5061056f6004803603602081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c67565b005b34801561057d57600080fd5b506105c06004803603602081101561059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b3480156105ce57600080fd5b506105d7611e17565b6040518082815260200191505060405180910390f35b3480156105f957600080fd5b506106466004803603604081101561061057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e24565b604051808215151515815260200191505060405180910390f35b34801561066c57600080fd5b506106d96004803603606081101561068357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eb8565b005b61074a600480360360e08110156106f157600080fd5b8101908080359060200190929190803561ffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611edd565b005b34801561075857600080fd5b506107a66004803603608081101561076f57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061246f565b604051808215151515815260200191505060405180910390f35b3480156107cc57600080fd5b50610819600480360360408110156107e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612532565b6040518082815260200191505060405180910390f35b34801561083b57600080fd5b5061087e6004803603602081101561085257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125a9565b005b6108d7600480360360a081101561089657600080fd5b810190808035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506126eb565b005b3480156108e557600080fd5b50610915600480360360208110156108fc57600080fd5b81019080803560ff16906020019092919050505061296d565b6040518082815260200191505060405180910390f35b34801561093757600080fd5b506109646004803603602081101561094e57600080fd5b810190808035906020019092919050505061298a565b005b34801561097257600080fd5b506109df6004803603606081101561098957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a92565b005b3480156109ed57600080fd5b506109f6612ab3565b005b348015610a0457600080fd5b50610a3160048036036020811015610a1b57600080fd5b8101908080359060200190929190505050612ae3565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018361ffff1661ffff16815260200182600360200280838360005b83811015610aa8578082015181840152602081019050610a8d565b505050509050019550505050505060405180910390f35b348015610acb57600080fd5b50610af860048036036020811015610ae257600080fd5b8101908080359060200190929190505050612bf9565b6040518082815260200191505060405180910390f35b348015610b1a57600080fd5b50610b4760048036036020811015610b3157600080fd5b8101908080359060200190929190505050612c31565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9557600080fd5b50610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612caf565b005b348015610be657600080fd5b50610c2960048036036020811015610bfd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1d565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612da1565b005b348015610c6257600080fd5b50610caf60048036036040811015610c7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e75565b604051808215151515815260200191505060405180910390f35b348015610cd557600080fd5b50610d5760048036036040811015610cec57600080fd5b810190808035906020019092919080359060200190640100000000811115610d1357600080fd5b820183602082011115610d2557600080fd5b80359060200191846020830284011164010000000083111715610d4757600080fd5b9091929391929390505050612f09565b005b348015610d6557600080fd5b50610d6e6130b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc56130e0565b604051808215151515815260200191505060405180910390f35b348015610deb57600080fd5b50610df4613138565b005b348015610e0257600080fd5b50610e0b613168565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e9257600080fd5b50610ecc60048036036040811015610ea957600080fd5b81019080803560ff1690602001909291908035906020019092919050505061320a565b005b348015610eda57600080fd5b50610ee3613324565b005b348015610ef157600080fd5b50610f7360048036036040811015610f0857600080fd5b810190808035906020019092919080359060200190640100000000811115610f2f57600080fd5b820183602082011115610f4157600080fd5b80359060200191846020830284011164010000000083111715610f6357600080fd5b9091929391929390505050613397565b005b348015610f8157600080fd5b50610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613544565b005b348015610fde57600080fd5b5061100b60048036036020811015610ff557600080fd5b8101908080359060200190929190505050613680565b005b34801561101957600080fd5b50611022613788565b6040518082815260200191505060405180910390f35b34801561104457600080fd5b5061104d613792565b6040518082815260200191505060405180910390f35b34801561106f57600080fd5b506110b26004803603602081101561108657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061379c565b005b3480156110c057600080fd5b506111c4600480360360808110156110d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113e57600080fd5b82018360208201111561115057600080fd5b8035906020019184600183028401116401000000008311171561117257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138de565b005b3480156111d257600080fd5b50611215600480360360208110156111e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613906565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561125857808201518184015260208101905061123d565b505050509050019250505060405180910390f35b34801561127857600080fd5b506112a56004803603602081101561128f57600080fd5b8101908080359060200190929190505050613967565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112e55780820151818401526020810190506112ca565b50505050905090810190601f1680156113125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61134c6004803603602081101561133657600080fd5b8101908080359060200190929190505050613a30565b005b34801561135a57600080fd5b5061139d6004803603602081101561137157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d8f565b005b3480156113ab57600080fd5b5061140e600480360360408110156113c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ed1565b604051808215151515815260200191505060405180910390f35b34801561143457600080fd5b506114776004803603602081101561144b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b34801561148557600080fd5b506114c86004803603602081101561149c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f84565b6040518082815260200191505060405180910390f35b611550600480360360e08110156114f457600080fd5b8101908080359060200190929190803560ff169060200190929190803561ffff16906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050613fcd565b005b61157e601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561180b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663011879db858585856040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180858152602001846fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001945050505050600060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b5050505050505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b05780601f10611785576101008083540402835291602001916117b0565b820191906000526020600020905b81548152906001019060200180831161179357829003601f168201915b5050505050905090565b60006117c5826143f1565b15156117d057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061181682612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561185357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061189357506118928133613ed1565b5b151561189e57600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601754341415156119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff16151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611b548787873330604051602001808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040516020818303038152906040528051906020012085858561246f565b1515611bc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b611bfb86601689815481101515611bdb57fe5b90600052602060002090600402016001015461446390919063ffffffff16565b601688815481101515611c0a57fe5b9060005260206000209060040201600101819055507f7bea0315f14559f9a02f1c2d9d8beb6bc45e21861fed12daf11d8b4c43efe2418787604051808381526020018281526020019250505060405180910390a150505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cf15750611cc26130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611db16130e0565b1515611dbc57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600780549050905090565b6000601460008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec23382614484565b1515611ecd57600080fd5b611ed8838383614519565b505050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515611f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060185434141515612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d696e74207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b61202e6019548761446390919063ffffffff16565b421015156120a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f416e696d616c20737061776e206578706972656400000000000000000000000081525060200191505060405180910390fd5b60648761ffff1611151515612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e76616c6964206566666563746976656e657373000000000000000000000081525060200191505060405180910390fd5b61221a888888883330604051602001808781526020018661ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561228e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc818a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b15801561231f57600080fd5b505afa158015612333573d6000803e3d6000fd5b505050506040513d60e081101561234957600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192939495509091929394509091925090915090505080915050612416601a8260ff166003811015156123c657fe5b0154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061246489893361455f565b505050505050505050565b600060018585858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156124ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600061253d83612d1d565b8210151561254a57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561259657fe5b9060005260206000200154905092915050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061263357506126046130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156126a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515612782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060175434141515612827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b6128e786863330604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019450505050506040516020818303038152906040528051906020012085858561246f565b151561295b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6129653387614661565b505050505050565b6000601a8260ff1660038110151561298157fe5b01549050919050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a1457506129e56130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612a88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060178190555050565b612aae83838360206040519081016040528060008152506138de565b505050565b612abb6130e0565b1515612ac657600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080600080612af1615a09565b612af9615a2c565b601687815481101515612b0857fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015612bba576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b815790505b5050505050815250509050612bce87612c31565b8160000151826020015183604001518460600151809050955095509550955095505091939590929450565b6000612c03611e17565b82101515612c1057600080fd5b600782815481101515612c1f57fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ca657600080fd5b80915050919050565b612cb76130e0565b1515612cc257600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d5a57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612da96130e0565b1515612db457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601560008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b612f133384611e24565b151515612fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d206381526020017f6f6e74726163740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601460003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b183838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6131406130e0565b151561314b57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132005780601f106131d557610100808354040283529160200191613200565b820191906000526020600020905b8154815290600101906020018083116131e357829003601f168201915b5050505050905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061329457506132656130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601a8360ff1660038110151561331b57fe5b01819055505050565b61332c6130e0565b151561333757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613394573d6000803e3d6000fd5b50565b6133a13384612e75565b15151561343c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d207281526020017f65706f7369746f7279000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601560003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555061353f83838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561357f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061370a57506136db6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561377e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060188190555050565b6000601754905090565b6000601854905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061382657506137f76130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6138e9848484611eb8565b6138f584848484614b14565b151561390057600080fd5b50505050565b606061391182614d37565b80548060200260200160405190810160405280929190818152602001828054801561395b57602002820191906000526020600020905b815481526020019060010190808311613947575b50505050509050919050565b6060613972826143f1565b151561397d57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a245780601f106139f957610100808354040283529160200191613a24565b820191906000526020600020905b815481529060010190602001808311613a0757829003601f168201915b50505050509050919050565b60175434141515613aa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b613ab1615a2c565b601682815481101515613ac057fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015613b72576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613b395790505b5050505050815250509050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc8184600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b158015613c1357600080fd5b505afa158015613c27573d6000803e3d6000fd5b505050506040513d60e0811015613c3d57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505090919293949550909192939450909192509091505080935081925050506000613cc56004856040015161ffff16614d7f90919063ffffffff16565b90506000613ce060018460ff1661446390919063ffffffff16565b90506002821115613d0157613cfe8183614da990919063ffffffff16565b91505b613d0b3387614de7565b601686815481101515613d1a57fe5b906000526020600020906004020160008082016000905560018201600090556002820160006101000a81549061ffff0219169055600382016000613d5e9190615a5f565b5050613d6a3383614661565b613d8784613d82600584614da990919063ffffffff16565b614661565b505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e195750613dea6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613e8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f6d6130e0565b1515613f7857600080fd5b613f8181614e46565b50565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175434141515614046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff161515156140dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061422a888888883330604051602001808781526020018660ff1660ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018561ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561429e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6142a788612c31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156142e057600080fd5b60006016898154811015156142f157fe5b90600052602060002090600402016003018860ff1660038110151561431257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1614151561433c57600080fd5b8560168981548110151561434c57fe5b90600052602060002090600402016003018860ff1660038110151561436d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055507f626443cd9ab4a50fbd6c420a0a3a0e6b95c7bf3db7ec295b6c67bc13bd0f6a9b888888604051808481526020018360ff1660ff1681526020018261ffff1661ffff168152602001935050505060405180910390a15050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080828401905083811015151561447a57600080fd5b8091505092915050565b60008061449083612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806144ff57508373ffffffffffffffffffffffffffffffffffffffff166144e7846117ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80614510575061450f8185613ed1565b5b91505092915050565b614524838383614f42565b61452e83826151a7565b614538828261534b565b505050565b600082821115151561454e57600080fd5b600082840390508091505092915050565b614567615a2c565b608060405190810160405280858152602001600081526020018461ffff168152602001606060405190810160405280600061ffff1661ffff168152602001600061ffff1661ffff168152602001600061ffff1661ffff1681525081525090506000601680549050905060168290806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548161ffff021916908361ffff16021790555060608201518160030190600361464c929190615a66565b5050505061465a8382615412565b5050505050565b6146b381601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa78cb306635f790294a937ca6e6f846b5782f8c6f7ec2b774d6f05cf9eece7498282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000809050600080905061477884615433565b151515614813576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f444e4120617272617920636f6e7461696e73207468652073616d65206361726481526020017f730000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008090505b8451811015614a93576000806000808773ffffffffffffffffffffffffffffffffffffffff1663422627c38a8781518110151561485257fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060806040518083038186803b1580156148ac57600080fd5b505afa1580156148c0573d6000803e3d6000fd5b505050506040513d60808110156148d657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508094508195508296508397505050505089841415156149b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f50726f766964656420444e412068617320696e636f72726563742077696c642081526020017f616e696d616c206964000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74206f776e6572206f6620444e4100000000000081525060200191505060405180910390fd5b868261ffff161115614a69578161ffff1696505b614a808261ffff168761446390919063ffffffff16565b9550505050508080600101915050614819565b506000614abc600a614aae858561453d90919063ffffffff16565b614d7f90919063ffffffff16565b90506000614ad3828561446390919063ffffffff16565b90506064811115614b0057614afb33614af660648461453d90919063ffffffff16565b614661565b606490505b614b0b87823361455f565b50505050505050565b6000614b358473ffffffffffffffffffffffffffffffffffffffff166154c5565b1515614b445760019050614d2f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c3b578082015181840152602081019050614c20565b50505050905090810190601f168015614c685780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c8a57600080fd5b505af1158015614c9e573d6000803e3d6000fd5b505050506040513d6020811015614cb457600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050919050565b60008082111515614d8f57600080fd5b60008284811515614d9c57fe5b0490508091505092915050565b600080831415614dbc5760009050614de1565b60008284029050828482811515614dcf57fe5b04141515614ddc57600080fd5b809150505b92915050565b614df182826154d8565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050141515614e4257600b60008281526020019081526020016000206000614e419190615b03565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16614f6282612c31565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614fc057600080fd5b614fc981615512565b61501c6001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150b26001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006151ff6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061453d90919063ffffffff16565b905060006006600084815260200190815260200160002054905081811415156152f2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561527057fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156152ca57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036153449190615b4b565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b61541c82826155d2565b615426828261534b565b61542f8161576b565b5050565b6000808251905060008090505b600182038110156154b95760006001820190505b828110156154ab57848181518110151561546a57fe5b90602001906020020151858381518110151561548257fe5b90602001906020020151141561549e57600193505050506154c0565b8080600101915050615454565b508080600101915050615440565b5060009150505b919050565b600080823b905060008111915050919050565b6154e282826157b7565b6154ec82826151a7565b6000600660008381526020019081526020016000208190555061550e8161594b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156155cf5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561560e57600080fd5b615617816143f1565b15151561562357600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506156c86001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b8173ffffffffffffffffffffffffffffffffffffffff166157d782612c31565b73ffffffffffffffffffffffffffffffffffffffff161415156157f957600080fd5b61580281615512565b6158556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000615966600160078054905061453d90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561599157fe5b90600052602060002001549050806007838154811015156159ae57fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036159e99190615b4b565b506000600860008681526020019081526020016000208190555050505050565b606060405190810160405280600390602082028038833980820191505090505090565b60c0604051908101604052806000815260200160008152602001600061ffff168152602001615a59615b77565b81525090565b5060009055565b826003600f01601090048101928215615af25791602002820160005b83821115615ac257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615a82565b8015615af05782816101000a81549061ffff0219169055600201602081600101049283019260010302615ac2565b505b509050615aff9190615b9a565b5090565b50805460018160011615610100020316600290046000825580601f10615b295750615b48565b601f016020900490600052602060002090810190615b479190615bcb565b5b50565b815481835581811115615b7257818360005260206000209182019101615b719190615bcb565b5b505050565b606060405190810160405280600390602082028038833980820191505090505090565b615bc891905b80821115615bc457600081816101000a81549061ffff021916905550600101615ba0565b5090565b90565b615bed91905b80821115615be9576000816000905550600101615bd1565b5090565b9056fea165627a7a723058205f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc43478560029

Deployed Bytecode

0x608060405260043610610251576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063011879db1461025657806301ffc9a7146102e557806306fdde0314610357578063081812fc146103e7578063095ea7b3146104625780630f1211f8146104bd5780631102610e146105205780631785f53c1461057157806318160ddd146105c257806322c02de5146105ed57806323b872dd1461066057806328bac61a146106db5780632d0270ce1461074c5780632f745c59146107c057806330114c311461082f57806330c9430c146108805780633cbaa632146108d95780633d7988b71461092b57806342842e0e14610966578063439766ce146109e157806345d3cc81146109f85780634f6ccce714610abf5780636352211e14610b0e5780637048027514610b8957806370a0823114610bda578063715018a614610c3f57806372586af514610c565780637ad0d4f014610cc95780638da5cb5b14610d595780638f32d59b14610db05780638fda356d14610ddf57806395d89b4114610df657806399c1c3d014610e865780639da9df3e14610ece578063a0f10e7414610ee5578063a22cb46514610f75578063a387669e14610fd2578063a5e687e31461100d578063b57eba2a14611038578063b7f0709614611063578063b88d4fde146110b4578063ba622ddc146111c6578063c87b56dd1461126c578063cfdd5da114611320578063e23e5e171461134e578063e985e9c51461139f578063f2fde38b14611428578063f61a73fc14611479578063fde9e2b6146114de575b600080fd5b34801561026257600080fd5b506102e36004803603608081101561027957600080fd5b810190808035906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff169060200190929190505050611552565b005b3480156102f157600080fd5b5061033d6004803603602081101561030857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506116b1565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ac578082015181840152602081019050610391565b50505050905090810190601f1680156103d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f357600080fd5b506104206004803603602081101561040a57600080fd5b81019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046e57600080fd5b506104bb6004803603604081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061180b565b005b61051e600480360360c08110156104d357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611950565b005b34801561052c57600080fd5b5061056f6004803603602081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c67565b005b34801561057d57600080fd5b506105c06004803603602081101561059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b3480156105ce57600080fd5b506105d7611e17565b6040518082815260200191505060405180910390f35b3480156105f957600080fd5b506106466004803603604081101561061057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e24565b604051808215151515815260200191505060405180910390f35b34801561066c57600080fd5b506106d96004803603606081101561068357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eb8565b005b61074a600480360360e08110156106f157600080fd5b8101908080359060200190929190803561ffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611edd565b005b34801561075857600080fd5b506107a66004803603608081101561076f57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061246f565b604051808215151515815260200191505060405180910390f35b3480156107cc57600080fd5b50610819600480360360408110156107e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612532565b6040518082815260200191505060405180910390f35b34801561083b57600080fd5b5061087e6004803603602081101561085257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125a9565b005b6108d7600480360360a081101561089657600080fd5b810190808035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506126eb565b005b3480156108e557600080fd5b50610915600480360360208110156108fc57600080fd5b81019080803560ff16906020019092919050505061296d565b6040518082815260200191505060405180910390f35b34801561093757600080fd5b506109646004803603602081101561094e57600080fd5b810190808035906020019092919050505061298a565b005b34801561097257600080fd5b506109df6004803603606081101561098957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a92565b005b3480156109ed57600080fd5b506109f6612ab3565b005b348015610a0457600080fd5b50610a3160048036036020811015610a1b57600080fd5b8101908080359060200190929190505050612ae3565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018361ffff1661ffff16815260200182600360200280838360005b83811015610aa8578082015181840152602081019050610a8d565b505050509050019550505050505060405180910390f35b348015610acb57600080fd5b50610af860048036036020811015610ae257600080fd5b8101908080359060200190929190505050612bf9565b6040518082815260200191505060405180910390f35b348015610b1a57600080fd5b50610b4760048036036020811015610b3157600080fd5b8101908080359060200190929190505050612c31565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9557600080fd5b50610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612caf565b005b348015610be657600080fd5b50610c2960048036036020811015610bfd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1d565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612da1565b005b348015610c6257600080fd5b50610caf60048036036040811015610c7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e75565b604051808215151515815260200191505060405180910390f35b348015610cd557600080fd5b50610d5760048036036040811015610cec57600080fd5b810190808035906020019092919080359060200190640100000000811115610d1357600080fd5b820183602082011115610d2557600080fd5b80359060200191846020830284011164010000000083111715610d4757600080fd5b9091929391929390505050612f09565b005b348015610d6557600080fd5b50610d6e6130b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc56130e0565b604051808215151515815260200191505060405180910390f35b348015610deb57600080fd5b50610df4613138565b005b348015610e0257600080fd5b50610e0b613168565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e9257600080fd5b50610ecc60048036036040811015610ea957600080fd5b81019080803560ff1690602001909291908035906020019092919050505061320a565b005b348015610eda57600080fd5b50610ee3613324565b005b348015610ef157600080fd5b50610f7360048036036040811015610f0857600080fd5b810190808035906020019092919080359060200190640100000000811115610f2f57600080fd5b820183602082011115610f4157600080fd5b80359060200191846020830284011164010000000083111715610f6357600080fd5b9091929391929390505050613397565b005b348015610f8157600080fd5b50610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613544565b005b348015610fde57600080fd5b5061100b60048036036020811015610ff557600080fd5b8101908080359060200190929190505050613680565b005b34801561101957600080fd5b50611022613788565b6040518082815260200191505060405180910390f35b34801561104457600080fd5b5061104d613792565b6040518082815260200191505060405180910390f35b34801561106f57600080fd5b506110b26004803603602081101561108657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061379c565b005b3480156110c057600080fd5b506111c4600480360360808110156110d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113e57600080fd5b82018360208201111561115057600080fd5b8035906020019184600183028401116401000000008311171561117257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138de565b005b3480156111d257600080fd5b50611215600480360360208110156111e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613906565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561125857808201518184015260208101905061123d565b505050509050019250505060405180910390f35b34801561127857600080fd5b506112a56004803603602081101561128f57600080fd5b8101908080359060200190929190505050613967565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112e55780820151818401526020810190506112ca565b50505050905090810190601f1680156113125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61134c6004803603602081101561133657600080fd5b8101908080359060200190929190505050613a30565b005b34801561135a57600080fd5b5061139d6004803603602081101561137157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d8f565b005b3480156113ab57600080fd5b5061140e600480360360408110156113c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ed1565b604051808215151515815260200191505060405180910390f35b34801561143457600080fd5b506114776004803603602081101561144b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b34801561148557600080fd5b506114c86004803603602081101561149c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f84565b6040518082815260200191505060405180910390f35b611550600480360360e08110156114f457600080fd5b8101908080359060200190929190803560ff169060200190929190803561ffff16906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050613fcd565b005b61157e601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561180b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663011879db858585856040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180858152602001846fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001945050505050600060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b5050505050505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b05780601f10611785576101008083540402835291602001916117b0565b820191906000526020600020905b81548152906001019060200180831161179357829003601f168201915b5050505050905090565b60006117c5826143f1565b15156117d057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061181682612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561185357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061189357506118928133613ed1565b5b151561189e57600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601754341415156119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff16151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611b548787873330604051602001808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040516020818303038152906040528051906020012085858561246f565b1515611bc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b611bfb86601689815481101515611bdb57fe5b90600052602060002090600402016001015461446390919063ffffffff16565b601688815481101515611c0a57fe5b9060005260206000209060040201600101819055507f7bea0315f14559f9a02f1c2d9d8beb6bc45e21861fed12daf11d8b4c43efe2418787604051808381526020018281526020019250505060405180910390a150505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cf15750611cc26130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611db16130e0565b1515611dbc57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600780549050905090565b6000601460008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec23382614484565b1515611ecd57600080fd5b611ed8838383614519565b505050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515611f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060185434141515612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d696e74207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b61202e6019548761446390919063ffffffff16565b421015156120a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f416e696d616c20737061776e206578706972656400000000000000000000000081525060200191505060405180910390fd5b60648761ffff1611151515612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e76616c6964206566666563746976656e657373000000000000000000000081525060200191505060405180910390fd5b61221a888888883330604051602001808781526020018661ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561228e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc818a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b15801561231f57600080fd5b505afa158015612333573d6000803e3d6000fd5b505050506040513d60e081101561234957600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192939495509091929394509091925090915090505080915050612416601a8260ff166003811015156123c657fe5b0154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061246489893361455f565b505050505050505050565b600060018585858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156124ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600061253d83612d1d565b8210151561254a57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561259657fe5b9060005260206000200154905092915050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061263357506126046130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156126a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515612782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060175434141515612827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b6128e786863330604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019450505050506040516020818303038152906040528051906020012085858561246f565b151561295b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6129653387614661565b505050505050565b6000601a8260ff1660038110151561298157fe5b01549050919050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a1457506129e56130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612a88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060178190555050565b612aae83838360206040519081016040528060008152506138de565b505050565b612abb6130e0565b1515612ac657600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080600080612af1615a09565b612af9615a2c565b601687815481101515612b0857fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015612bba576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b815790505b5050505050815250509050612bce87612c31565b8160000151826020015183604001518460600151809050955095509550955095505091939590929450565b6000612c03611e17565b82101515612c1057600080fd5b600782815481101515612c1f57fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ca657600080fd5b80915050919050565b612cb76130e0565b1515612cc257600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d5a57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612da96130e0565b1515612db457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601560008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b612f133384611e24565b151515612fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d206381526020017f6f6e74726163740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601460003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b183838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6131406130e0565b151561314b57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132005780601f106131d557610100808354040283529160200191613200565b820191906000526020600020905b8154815290600101906020018083116131e357829003601f168201915b5050505050905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061329457506132656130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601a8360ff1660038110151561331b57fe5b01819055505050565b61332c6130e0565b151561333757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613394573d6000803e3d6000fd5b50565b6133a13384612e75565b15151561343c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d207281526020017f65706f7369746f7279000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601560003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555061353f83838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561357f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061370a57506136db6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561377e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060188190555050565b6000601754905090565b6000601854905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061382657506137f76130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6138e9848484611eb8565b6138f584848484614b14565b151561390057600080fd5b50505050565b606061391182614d37565b80548060200260200160405190810160405280929190818152602001828054801561395b57602002820191906000526020600020905b815481526020019060010190808311613947575b50505050509050919050565b6060613972826143f1565b151561397d57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a245780601f106139f957610100808354040283529160200191613a24565b820191906000526020600020905b815481529060010190602001808311613a0757829003601f168201915b50505050509050919050565b60175434141515613aa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b613ab1615a2c565b601682815481101515613ac057fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015613b72576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613b395790505b5050505050815250509050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc8184600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b158015613c1357600080fd5b505afa158015613c27573d6000803e3d6000fd5b505050506040513d60e0811015613c3d57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505090919293949550909192939450909192509091505080935081925050506000613cc56004856040015161ffff16614d7f90919063ffffffff16565b90506000613ce060018460ff1661446390919063ffffffff16565b90506002821115613d0157613cfe8183614da990919063ffffffff16565b91505b613d0b3387614de7565b601686815481101515613d1a57fe5b906000526020600020906004020160008082016000905560018201600090556002820160006101000a81549061ffff0219169055600382016000613d5e9190615a5f565b5050613d6a3383614661565b613d8784613d82600584614da990919063ffffffff16565b614661565b505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e195750613dea6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613e8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f6d6130e0565b1515613f7857600080fd5b613f8181614e46565b50565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175434141515614046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff161515156140dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061422a888888883330604051602001808781526020018660ff1660ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018561ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561429e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6142a788612c31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156142e057600080fd5b60006016898154811015156142f157fe5b90600052602060002090600402016003018860ff1660038110151561431257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1614151561433c57600080fd5b8560168981548110151561434c57fe5b90600052602060002090600402016003018860ff1660038110151561436d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055507f626443cd9ab4a50fbd6c420a0a3a0e6b95c7bf3db7ec295b6c67bc13bd0f6a9b888888604051808481526020018360ff1660ff1681526020018261ffff1661ffff168152602001935050505060405180910390a15050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080828401905083811015151561447a57600080fd5b8091505092915050565b60008061449083612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806144ff57508373ffffffffffffffffffffffffffffffffffffffff166144e7846117ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80614510575061450f8185613ed1565b5b91505092915050565b614524838383614f42565b61452e83826151a7565b614538828261534b565b505050565b600082821115151561454e57600080fd5b600082840390508091505092915050565b614567615a2c565b608060405190810160405280858152602001600081526020018461ffff168152602001606060405190810160405280600061ffff1661ffff168152602001600061ffff1661ffff168152602001600061ffff1661ffff1681525081525090506000601680549050905060168290806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548161ffff021916908361ffff16021790555060608201518160030190600361464c929190615a66565b5050505061465a8382615412565b5050505050565b6146b381601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa78cb306635f790294a937ca6e6f846b5782f8c6f7ec2b774d6f05cf9eece7498282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000809050600080905061477884615433565b151515614813576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f444e4120617272617920636f6e7461696e73207468652073616d65206361726481526020017f730000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008090505b8451811015614a93576000806000808773ffffffffffffffffffffffffffffffffffffffff1663422627c38a8781518110151561485257fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060806040518083038186803b1580156148ac57600080fd5b505afa1580156148c0573d6000803e3d6000fd5b505050506040513d60808110156148d657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508094508195508296508397505050505089841415156149b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f50726f766964656420444e412068617320696e636f72726563742077696c642081526020017f616e696d616c206964000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74206f776e6572206f6620444e4100000000000081525060200191505060405180910390fd5b868261ffff161115614a69578161ffff1696505b614a808261ffff168761446390919063ffffffff16565b9550505050508080600101915050614819565b506000614abc600a614aae858561453d90919063ffffffff16565b614d7f90919063ffffffff16565b90506000614ad3828561446390919063ffffffff16565b90506064811115614b0057614afb33614af660648461453d90919063ffffffff16565b614661565b606490505b614b0b87823361455f565b50505050505050565b6000614b358473ffffffffffffffffffffffffffffffffffffffff166154c5565b1515614b445760019050614d2f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c3b578082015181840152602081019050614c20565b50505050905090810190601f168015614c685780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c8a57600080fd5b505af1158015614c9e573d6000803e3d6000fd5b505050506040513d6020811015614cb457600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050919050565b60008082111515614d8f57600080fd5b60008284811515614d9c57fe5b0490508091505092915050565b600080831415614dbc5760009050614de1565b60008284029050828482811515614dcf57fe5b04141515614ddc57600080fd5b809150505b92915050565b614df182826154d8565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050141515614e4257600b60008281526020019081526020016000206000614e419190615b03565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16614f6282612c31565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614fc057600080fd5b614fc981615512565b61501c6001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150b26001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006151ff6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061453d90919063ffffffff16565b905060006006600084815260200190815260200160002054905081811415156152f2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561527057fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156152ca57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036153449190615b4b565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b61541c82826155d2565b615426828261534b565b61542f8161576b565b5050565b6000808251905060008090505b600182038110156154b95760006001820190505b828110156154ab57848181518110151561546a57fe5b90602001906020020151858381518110151561548257fe5b90602001906020020151141561549e57600193505050506154c0565b8080600101915050615454565b508080600101915050615440565b5060009150505b919050565b600080823b905060008111915050919050565b6154e282826157b7565b6154ec82826151a7565b6000600660008381526020019081526020016000208190555061550e8161594b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156155cf5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561560e57600080fd5b615617816143f1565b15151561562357600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506156c86001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b8173ffffffffffffffffffffffffffffffffffffffff166157d782612c31565b73ffffffffffffffffffffffffffffffffffffffff161415156157f957600080fd5b61580281615512565b6158556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000615966600160078054905061453d90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561599157fe5b90600052602060002001549050806007838154811015156159ae57fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036159e99190615b4b565b506000600860008681526020019081526020016000208190555050505050565b606060405190810160405280600390602082028038833980820191505090505090565b60c0604051908101604052806000815260200160008152602001600061ffff168152602001615a59615b77565b81525090565b5060009055565b826003600f01601090048101928215615af25791602002820160005b83821115615ac257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615a82565b8015615af05782816101000a81549061ffff0219169055600201602081600101049283019260010302615ac2565b505b509050615aff9190615b9a565b5090565b50805460018160011615610100020316600290046000825580601f10615b295750615b48565b601f016020900490600052602060002090810190615b479190615bcb565b5b50565b815481835581811115615b7257818360005260206000209182019101615b719190615bcb565b5b505050565b606060405190810160405280600390602082028038833980820191505090505090565b615bc891905b80821115615bc457600081816101000a81549061ffff021916905550600101615ba0565b5090565b90565b615bed91905b80821115615be9576000816000905550600101615bd1565b5090565b9056fea165627a7a723058205f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc43478560029

Deployed Bytecode Sourcemap

36798:11726:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43439:414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43439:414:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43439:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7232:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7232:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7232:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30136:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30136:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30136:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11338:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11338:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11338:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10746:299;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10746:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10746:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41271:556;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41271:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38413:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38413:170:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38413:170:0;;;;;;;;;;;;;;;;;;;;;;35430:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35430:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35430:115:0;;;;;;;;;;;;;;;;;;;;;;21871:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21871:96:0;;;;;;;;;;;;;;;;;;;;;;;44983:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44983:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44983:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12928:184;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12928:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12928:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39752:1026;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39752:1026:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45408:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45408:179:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45408:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21528:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21528:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21528:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38048:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38048:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38048:169:0;;;;;;;;;;;;;;;;;;;;;;40794:469;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40794:469:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44847:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44847:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44847:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38591:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38591:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38591:100:0;;;;;;;;;;;;;;;;;;;;13765:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13765:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13765:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35553:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35553:77:0;;;;;;43862:478;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43862:478:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43862:478:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43862:478:0;;;;;;;;;;;;;;;;;;;;22312:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22312:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22312:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10134:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10134:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10134:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35311:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35311:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35311:111:0;;;;;;;;;;;;;;;;;;;;;;9750:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9750:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9750:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34092:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34092:140:0;;;;;;45193:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45193:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45193:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38965:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38965:381:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38965:381:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38965:381:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38965:381:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38965:381:0;;;;;;;;;;;;;;;33379:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33379:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33714:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33714:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35638:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35638:79:0;;;;;;30335:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30335:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30335:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38811:146;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38811:146:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38811:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45595:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45595:106:0;;;;;;39354:390;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39354:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39354:390:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39354:390:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39354:390:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39354:390:0;;;;;;;;;;;;;;;11792:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11792:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11792:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38699:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38699:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38699:104:0;;;;;;;;;;;;;;;;;;;;44653:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44653:88:0;;;;;;;;;;;;;;;;;;;;;;;44749:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44749:90:0;;;;;;;;;;;;;;;;;;;;;;;37896:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37896:144:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37896:144:0;;;;;;;;;;;;;;;;;;;;;;14618:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14618:214:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14618:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14618:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14618:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14618:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14618:214:0;;;;;;;;;;;;;;;;;;44348:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44348:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44348:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;44348:176:0;;;;;;;;;;;;;;;;;30630:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30630:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30630:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30630:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42710:721;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42710:721:0;;;;;;;;;;;;;;;;;;;;38225:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38225:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38225:180:0;;;;;;;;;;;;;;;;;;;;;;12338:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12338:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12338:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34409:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34409:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34409:109:0;;;;;;;;;;;;;;;;;;;;;;44532:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44532:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44532:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41841:861;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41841:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43439:414;43712:47;43728:19;;;;;;;;;;;43750:8;43712:7;:47::i;:::-;43770:19;;;;;;;;;;;:33;;;43804:8;43814:10;43826:8;43836;43770:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43770:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43770:75:0;;;;43439:414;;;;:::o;7232:135::-;7302:4;7326:20;:33;7347:11;7326:33;;;;;;;;;;;;;;;;;;;;;;;;;;;7319:40;;7232:135;;;:::o;30136:85::-;30175:13;30208:5;30201:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30136:85;:::o;11338:154::-;11397:7;11425:16;11433:7;11425;:16::i;:::-;11417:25;;;;;;;;11460:15;:24;11476:7;11460:24;;;;;;;;;;;;;;;;;;;;;11453:31;;11338:154;;;:::o;10746:299::-;10810:13;10826:16;10834:7;10826;:16::i;:::-;10810:32;;10867:5;10861:11;;:2;:11;;;;10853:20;;;;;;;;10906:5;10892:19;;:10;:19;;;:58;;;;10915:35;10932:5;10939:10;10915:16;:35::i;:::-;10892:58;10884:67;;;;;;;;10991:2;10964:15;:24;10980:7;10964:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11029:7;11025:2;11009:28;;11018:5;11009:28;;;;;;;;;;;;10746:299;;;:::o;41271:556::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41508:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;41539:115;41600:8;41610:7;41619:5;41626:10;41638:4;41583:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41583:60:0;;;41573:71;;;;;;41646:1;41649;41652;41539:19;:115::i;:::-;41531:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41737:33;41762:7;41737;41745:8;41737:17;;;;;;;;;;;;;;;;;;;;:20;;;:24;;:33;;;;:::i;:::-;41714:7;41722:8;41714:17;;;;;;;;;;;;;;;;;;;;:20;;:56;;;;41788:31;41801:8;41811:7;41788:31;;;;;;;;;;;;;;;;;;;;;;;;48396:1;41271:556;;;;;;:::o;38413:170::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38548:26;38513:19;;:62;;;;;;;;;;;;;;;;;;38413:170;:::o;35430:115::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35532:5;35501:14;:28;35516:12;35501:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35430:115;:::o;21871:96::-;21915:7;21942:10;:17;;;;21935:24;;21871:96;:::o;44983:202::-;45073:4;45097:30;:80;45155:5;45162:12;45138:37;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45138:37:0;;;45128:48;;;;;;45097:80;;;;;;;;;;;;;;;;;;;;;45090:87;;44983:202;;;;:::o;12928:184::-;13019:39;13038:10;13050:7;13019:18;:39::i;:::-;13011:48;;;;;;;;13072:32;13086:4;13092:2;13096:7;13072:13;:32::i;:::-;12928:184;;;:::o;39752:1026::-;40013:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;48468:9;;48455;:22;48447:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40081:26;40095:11;;40081:9;:13;;:26;;;;:::i;:::-;40075:3;:32;40067:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40168:3;40151:13;:20;;;;40143:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40216:205;40281:12;40295:13;40310:9;40321:5;40328:10;40340:4;40264:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;40264:81:0;;;40254:92;;;;;;40365:1;40385;40405;40216:19;:205::i;:::-;40208:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40456:12;40501:20;;;;;;;;;;;:30;;;40532:12;40501:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40501:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40501:44:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40501:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40479:66;;;;;;;;;;;;;;;;;;;;;;;;;;;40649:59;40679:20;40700:6;40679:28;;;;;;;;;;;;;40649:13;:25;40663:10;40649:25;;;;;;;;;;;;;;;;:29;;:59;;;;:::i;:::-;40621:13;:25;40635:10;40621:25;;;;;;;;;;;;;;;:87;;;;40719:51;40730:12;40744:13;40759:10;40719;:51::i;:::-;48512:1;39752:1026;;;;;;;;:::o;45408:179::-;45506:4;45552:27;45562:7;45571:1;45574;45577;45552:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45552:27:0;;;;;;;;45530:49;;:18;;;;;;;;;;;:49;;;45523:56;;45408:179;;;;;;:::o;21528:185::-;21608:7;21644:16;21654:5;21644:9;:16::i;:::-;21636:5;:24;21628:33;;;;;;;;21679:12;:19;21692:5;21679:19;;;;;;;;;;;;;;;21699:5;21679:26;;;;;;;;;;;;;;;;;;21672:33;;21528:185;;;;:::o;38048:169::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38181:27;38150:20;;:59;;;;;;;;;;;;;;;;;;38048:169;:::o;40794:469::-;40995:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41048:104;41109:6;41117:5;41124:10;41136:4;41092:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41092::0;;;41082:60;;;;;;41144:1;41147;41150;41048:19;:104::i;:::-;41040:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41220:27;41228:10;41240:6;41220:7;:27::i;:::-;40794:469;;;;;;:::o;44847:128::-;44913:7;44940:20;44961:5;44940:27;;;;;;;;;;;;;44933:34;;44847:128;;;:::o;38591:100::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38674:9;38663:8;:20;;;;38591:100;:::o;13765:134::-;13852:39;13869:4;13875:2;13879:7;13852:39;;;;;;;;;;;;;:16;:39::i;:::-;13765:134;;;:::o;35553:77::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35617:5;35606:8;;:16;;;;;;;;;;;;;;;;;;35553:77::o;43862:478::-;43946:13;43970:20;44001:10;44022:20;44053:28;;:::i;:::-;44105:20;;:::i;:::-;44128:7;44136:8;44128:17;;;;;;;;;;;;;;;;;;;;44105:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44178:17;44186:8;44178:7;:17::i;:::-;44210:6;:19;;;44244:6;:9;;;44268:6;:20;;;44303:6;:18;;;44156:176;;;;;;;;;;;;;;43862:478;;;;;;;:::o;22312:151::-;22370:7;22406:13;:11;:13::i;:::-;22398:5;:21;22390:30;;;;;;;;22438:10;22449:5;22438:17;;;;;;;;;;;;;;;;;;22431:24;;22312:151;;;:::o;10134:181::-;10189:7;10209:13;10225:11;:20;10237:7;10225:20;;;;;;;;;;;;;;;;;;;;;10209:36;;10281:1;10264:19;;:5;:19;;;;10256:28;;;;;;;;10302:5;10295:12;;;10134:181;;;:::o;35311:111::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35410:4;35379:14;:28;35394:12;35379:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;35311:111;:::o;9750:153::-;9805:7;9850:1;9833:19;;:5;:19;;;;9825:28;;;;;;;;9871:17;:24;9889:5;9871:24;;;;;;;;;;;;;;;;9864:31;;9750:153;;;:::o;34092:140::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;34191:1;34154:40;;34175:6;;;;;;;;;;;34154:40;;;;;;;;;;;;34222:1;34205:6;;:19;;;;;;;;;;;;;;;;;;34092:140::o;45193:207::-;45285:4;45309:32;:82;45369:5;45376:12;45352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45352:37:0;;;45342:48;;;;;;45309:82;;;;;;;;;;;;;;;;;;;;;45302:89;;45193:207;;;;:::o;38965:381::-;39072:49;39096:10;39108:12;39072:23;:49::i;:::-;39071:50;39063:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39266:4;39178:30;:85;39236:10;39248:12;39219:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39219:42:0;;;39209:53;;;;;;39178:85;;;;;;;;;;;;:92;;;;;;;;;;;;;;;;;;39281:55;39293:12;39307:6;;39281:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39281:55:0;;;;;;39315:20;;;;;;;;;;;39281:11;:55::i;:::-;38965:381;;;:::o;33379:79::-;33417:7;33444:6;;;;;;;;;;;33437:13;;33379:79;:::o;33714:92::-;33754:4;33792:6;;;;;;;;;;;33778:20;;:10;:20;;;33771:27;;33714:92;:::o;35638:79::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35705:4;35694:8;;:15;;;;;;;;;;;;;;;;;;35638:79::o;30335:89::-;30376:13;30409:7;30402:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30335:89;:::o;38811:146::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38938:11;38908:20;38929:5;38908:27;;;;;;;;;;;;:41;;;;38811:146;;:::o;45595:106::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;45651:10;:19;;:42;45679:4;45671:21;;;45651:42;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45651:42:0;45595:106::o;39354:390::-;39463:51;39489:10;39501:12;39463:25;:51::i;:::-;39462:52;39454:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39663:4;39573:32;:87;39633:10;39645:12;39616:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39616:42:0;;;39606:53;;;;;;39573:87;;;;;;;;;;;;:94;;;;;;;;;;;;;;;;;;39678:56;39690:12;39704:6;;39678:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39678:56:0;;;;;;39712:21;;;;;;;;;;;39678:11;:56::i;:::-;39354:390;;;:::o;11792:217::-;11878:10;11872:16;;:2;:16;;;;11864:25;;;;;;;;11937:8;11900:18;:30;11919:10;11900:30;;;;;;;;;;;;;;;:34;11931:2;11900:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;11988:2;11961:40;;11976:10;11961:40;;;11992:8;11961:40;;;;;;;;;;;;;;;;;;;;;;11792:217;;:::o;38699:104::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38785:10;38773:9;:22;;;;38699:104;:::o;44653:88::-;44698:7;44725:8;;44718:15;;44653:88;:::o;44749:90::-;44795:7;44822:9;;44815:16;;44749:90;:::o;37896:144::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38011:21;37990:18;;:42;;;;;;;;;;;;;;;;;;37896:144;:::o;14618:214::-;14725:31;14738:4;14744:2;14748:7;14725:12;:31::i;:::-;14775:48;14798:4;14804:2;14808:7;14817:5;14775:22;:48::i;:::-;14767:57;;;;;;;;14618:214;;;;:::o;44348:176::-;44446:16;44487:29;44502:13;44487:14;:29::i;:::-;44480:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44348:176;;;:::o;30630:154::-;30688:13;30722:16;30730:7;30722;:16::i;:::-;30714:25;;;;;;;;30757:10;:19;30768:7;30757:19;;;;;;;;;;;30750:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30630:154;;;:::o;42710:721::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42797:20;;:::i;:::-;42820:7;42828:8;42820:17;;;;;;;;;;;;;;;;;;;;42797:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42850:23;42884:12;42944:20;;;;;;;;;;;:30;;;42975:6;:19;;;42944:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42944:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42944:51:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42944:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42907:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43016:17;43036:36;43070:1;43044:6;:20;;;43036:29;;:33;;:36;;;;:::i;:::-;43016:56;;43083:24;43110:22;43130:1;43118:6;43110:15;;:19;;:22;;;;:::i;:::-;43083:49;;43161:1;43149:9;:13;43145:101;;;43203:31;43217:16;43203:9;:13;;:31;;;;:::i;:::-;43191:43;;43145:101;43258:27;43264:10;43276:8;43258:5;:27::i;:::-;43303:7;43311:8;43303:17;;;;;;;;;;;;;;;;;;;;;43296:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43333:30;43341:10;43353:9;43333:7;:30::i;:::-;43374:49;43382:15;43399:23;43420:1;43399:16;:20;;:23;;;;:::i;:::-;43374:7;:49::i;:::-;48396:1;;;;;42710:721;:::o;38225:180::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38368:28;38329:21;;:68;;;;;;;;;;;;;;;;;;38225:180;:::o;12338:147::-;12418:4;12442:18;:25;12461:5;12442:25;;;;;;;;;;;;;;;:35;12468:8;12442:35;;;;;;;;;;;;;;;;;;;;;;;;;12435:42;;12338:147;;;;:::o;34409:109::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;34482:28;34501:8;34482:18;:28::i;:::-;34409:109;:::o;44532:113::-;44591:7;44618:13;:19;44632:4;44618:19;;;;;;;;;;;;;;;;44611:26;;44532:113;;;:::o;41841:861::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42126:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;42157:203;42222:8;42232:13;42247:11;42260:5;42267:10;42279:4;42205:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42205:79:0;;;42195:90;;;;;;42304:1;42324;42344;42157:19;:203::i;:::-;42149:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42450:17;42458:8;42450:7;:17::i;:::-;42436:31;;:10;:31;;;42428:40;;;;;;;;42535:1;42487:7;42495:8;42487:17;;;;;;;;;;;;;;;;;;;;:29;;42517:13;42487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;42479:58;;;;;;;;42610:11;42563:7;42571:8;42563:17;;;;;;;;;;;;;;;;;;;;:29;;42593:13;42563:44;;;;;;;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;42637:57;42657:8;42667:13;42682:11;42637:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48396:1;41841:861;;;;;;;:::o;15028:155::-;15085:4;15102:13;15118:11;:20;15130:7;15118:20;;;;;;;;;;;;;;;;;;;;;15102:36;;15173:1;15156:19;;:5;:19;;;;15149:26;;;15028:155;;;:::o;4741:150::-;4799:7;4819:9;4835:1;4831;:5;4819:17;;4860:1;4855;:6;;4847:15;;;;;;;;4882:1;4875:8;;;4741:150;;;;:::o;15555:249::-;15640:4;15657:13;15673:16;15681:7;15673;:16::i;:::-;15657:32;;15719:5;15708:16;;:7;:16;;;:51;;;;15752:7;15728:31;;:20;15740:7;15728:11;:20::i;:::-;:31;;;15708:51;:87;;;;15763:32;15780:5;15787:7;15763:16;:32::i;:::-;15708:87;15700:96;;;15555:249;;;;:::o;22846:245::-;22932:38;22952:4;22958:2;22962:7;22932:19;:38::i;:::-;22983:47;23016:4;23022:7;22983:32;:47::i;:::-;23043:40;23071:2;23075:7;23043:27;:40::i;:::-;22846:245;;;:::o;4505:150::-;4563:7;4596:1;4591;:6;;4583:15;;;;;;;;4609:9;4625:1;4621;:5;4609:17;;4646:1;4639:8;;;4505:150;;;;:::o;47541:387::-;47645:20;;:::i;:::-;47668:136;;;;;;;;;47689:12;47668:136;;;;47716:1;47668:136;;;;47732:13;47668:136;;;;;;;;;;;;;;;47768:1;47668:136;;;;;;;;47779:1;47668:136;;;;;;;;47790:1;47668:136;;;;;;;;;;47645:159;;47816:10;47829:7;:14;;;;47816:27;;47872:7;47885:6;47872:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;47872:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;47903:17;47909:6;47917:2;47903:5;:17::i;:::-;47541:387;;;;;:::o;47936:198::-;48035:38;48063:9;48035:13;:23;48049:8;48035:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;48009:13;:23;48023:8;48009:23;;;;;;;;;;;;;;;:64;;;;48091:35;48106:8;48116:9;48091:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;47936:198;;:::o;45709:1389::-;45825:28;45856:1;45825:32;;45868:26;45897:1;45868:30;;45920:26;45939:6;45920:18;:26::i;:::-;45919:27;45911:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46010:9;46022:1;46010:13;;46005:631;46029:6;:13;46025:1;:17;46005:631;;;46064:13;46092;46120:20;46155:10;46221:11;:18;;;46240:6;46247:1;46240:9;;;;;;;;;;;;;;;;;;46221:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46221:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46221:29:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46221:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46182:68;;;;;;;;;;;;;;;;46287:13;46275:8;:25;46267:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46383:5;46369:19;;:10;:19;;;46361:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46456:20;46440:13;:36;;;46436:114;;;46521:13;46498:36;;;;46436:114;46587:37;46610:13;46587:37;;:18;:22;;:37;;;;:::i;:::-;46566:58;;46005:631;;;;46044:3;;;;;;;46005:631;;;;46656:26;46685:54;46736:2;46686:44;46709:20;46686:18;:22;;:44;;;;:::i;:::-;46685:50;;:54;;;;:::i;:::-;46656:83;;46751:26;46780:44;46805:18;46780:20;:24;;:44;;;;:::i;:::-;46751:73;;46860:3;46839:18;:24;46835:170;;;46880:48;46888:10;46900:27;46923:3;46900:18;:22;;:27;;;;:::i;:::-;46880:7;:48::i;:::-;46978:3;46957:24;;46835:170;47025:65;47036:13;47058:18;47079:10;47025;:65::i;:::-;45709:1389;;;;;;;:::o;18546:356::-;18668:4;18695:15;:2;:13;;;:15::i;:::-;18694:16;18690:60;;;18734:4;18727:11;;;;18690:60;18762:13;18794:2;18778:36;;;18815:10;18827:4;18833:7;18842:5;18778:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18778:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18778:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18778:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18778:70:0;;;;;;;;;;;;;;;;18762:86;;8214:10;18877:16;;18867:26;;;:6;:26;;;;18859:35;;;18546:356;;;;;;;:::o;24420:126::-;24482:17;24519:12;:19;24532:5;24519:19;;;;;;;;;;;;;;;24512:26;;24420:126;;;:::o;4066:303::-;4124:7;4223:1;4219;:5;4211:14;;;;;;;;4236:9;4252:1;4248;:5;;;;;;;;4236:17;;4360:1;4353:8;;;4066:303;;;;:::o;3500:433::-;3558:7;3807:1;3802;:6;3798:47;;;3832:1;3825:8;;;;3798:47;3857:9;3873:1;3869;:5;3857:17;;3902:1;3897;3893;:5;;;;;;;;:10;3885:19;;;;;;;;3924:1;3917:8;;;3500:433;;;;;:::o;31475:247::-;31542:27;31554:5;31561:7;31542:11;:27::i;:::-;31659:1;31628:10;:19;31639:7;31628:19;;;;;;;;;;;31622:33;;;;;;;;;;;;;;;;:38;;31618:97;;;31684:10;:19;31695:7;31684:19;;;;;;;;;;;;31677:26;;;;:::i;:::-;31618:97;31475:247;;:::o;34668:187::-;34762:1;34742:22;;:8;:22;;;;34734:31;;;;;;;;34810:8;34781:38;;34802:6;;;;;;;;;;;34781:38;;;;;;;;;;;;34839:8;34830:6;;:17;;;;;;;;;;;;;;;;;;34668:187;:::o;17598:414::-;17712:4;17692:24;;:16;17700:7;17692;:16::i;:::-;:24;;;17684:33;;;;;;;;17750:1;17736:16;;:2;:16;;;;17728:25;;;;;;;;17766:23;17781:7;17766:14;:23::i;:::-;17828:30;17856:1;17828:17;:23;17846:4;17828:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;17802:17;:23;17820:4;17802:23;;;;;;;;;;;;;;;:56;;;;17893:28;17919:1;17893:17;:21;17911:2;17893:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;17869:17;:21;17887:2;17869:21;;;;;;;;;;;;;;;:52;;;;17957:2;17934:11;:20;17946:7;17934:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;17996:7;17992:2;17977:27;;17986:4;17977:27;;;;;;;;;;;;17598:414;;;:::o;26023:1148::-;26289:22;26314:32;26344:1;26314:12;:18;26327:4;26314:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;26289:57;;26357:18;26378:17;:26;26396:7;26378:26;;;;;;;;;;;;26357:47;;26525:14;26511:10;:28;;26507:328;;;26556:19;26578:12;:18;26591:4;26578:18;;;;;;;;;;;;;;;26597:14;26578:34;;;;;;;;;;;;;;;;;;26556:56;;26662:11;26629:12;:18;26642:4;26629:18;;;;;;;;;;;;;;;26648:10;26629:30;;;;;;;;;;;;;;;;;:44;;;;26779:10;26746:17;:30;26764:11;26746:30;;;;;;;;;;;:43;;;;26507:328;;26924:12;:18;26937:4;26924:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;26023:1148;;;;:::o;24847:186::-;24961:12;:16;24974:2;24961:16;;;;;;;;;;;;;;;:23;;;;24932:17;:26;24950:7;24932:26;;;;;;;;;;;:52;;;;24995:12;:16;25008:2;24995:16;;;;;;;;;;;;;;;25017:7;24995:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;24995:30:0;;;;;;;;;;;;;;;;;;;;;;24847:186;;:::o;23354:202::-;23418:24;23430:2;23434:7;23418:11;:24::i;:::-;23455:40;23483:2;23487:7;23455:27;:40::i;:::-;23508;23540:7;23508:31;:40::i;:::-;23354:202;;:::o;47106:427::-;47183:4;47200:23;47226:9;:16;47200:42;;47258:9;47270:1;47258:13;;47253:248;47295:1;47277:15;:19;47273:1;:23;47253:248;;;47323:9;47339:1;47335;:5;47323:17;;47318:172;47346:15;47342:1;:19;47318:172;;;47407:9;47417:1;47407:12;;;;;;;;;;;;;;;;;;47391:9;47401:1;47391:12;;;;;;;;;;;;;;;;;;:28;47387:88;;;47451:4;47444:11;;;;;;;47387:88;47363:3;;;;;;;47318:172;;;;47298:3;;;;;;;47253:248;;;;47520:5;47513:12;;;47106:427;;;;:::o;5731:627::-;5791:4;5808:12;6315:7;6303:20;6295:28;;6349:1;6342:4;:8;6335:15;;;5731:627;;;:::o;23837:372::-;23904:27;23916:5;23923:7;23904:11;:27::i;:::-;23944:48;23977:5;23984:7;23944:32;:48::i;:::-;24142:1;24113:17;:26;24131:7;24113:26;;;;;;;;;;;:30;;;;24156:45;24193:7;24156:36;:45::i;:::-;23837:372;;:::o;19069:175::-;19169:1;19133:38;;:15;:24;19149:7;19133:24;;;;;;;;;;;;;;;;;;;;;:38;;;;19129:108;;;19223:1;19188:15;:24;19204:7;19188:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19129:108;19069:175;:::o;16055:286::-;16141:1;16127:16;;:2;:16;;;;16119:25;;;;;;;;16164:16;16172:7;16164;:16::i;:::-;16163:17;16155:26;;;;;;;;16217:2;16194:11;:20;16206:7;16194:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;16254:28;16280:1;16254:17;:21;16272:2;16254:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;16230:17;:21;16248:2;16230:21;;;;;;;;;;;;;;;:52;;;;16325:7;16321:2;16300:33;;16317:1;16300:33;;;;;;;;;;;;16055:286;;:::o;25234:164::-;25338:10;:17;;;;25311:15;:24;25327:7;25311:24;;;;;;;;;;;:44;;;;25366:10;25382:7;25366:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;25366:24:0;;;;;;;;;;;;;;;;;;;;;;25234:164;:::o;16623:314::-;16718:5;16698:25;;:16;16706:7;16698;:16::i;:::-;:25;;;16690:34;;;;;;;;16737:23;16752:7;16737:14;:23::i;:::-;16800:31;16829:1;16800:17;:24;16818:5;16800:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;16773:17;:24;16791:5;16773:24;;;;;;;;;;;;;;;:58;;;;16873:1;16842:11;:20;16854:7;16842:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;16921:7;16917:1;16893:36;;16902:5;16893:36;;;;;;;;;;;;16623:314;;:::o;27466:1082::-;27719:22;27744:24;27766:1;27744:10;:17;;;;:21;;:24;;;;:::i;:::-;27719:49;;27779:18;27800:15;:24;27816:7;27800:24;;;;;;;;;;;;27779:45;;28151:19;28173:10;28184:14;28173:26;;;;;;;;;;;;;;;;;;28151:48;;28237:11;28212:10;28223;28212:22;;;;;;;;;;;;;;;;;:36;;;;28348:10;28317:15;:28;28333:11;28317:28;;;;;;;;;;;:41;;;;28482:10;:19;;;;;;;;;;;;:::i;:::-;;28539:1;28512:15;:24;28528:7;28512:24;;;;;;;;;;;:28;;;;27466:1082;;;;:::o;36798:11726::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36798:11726:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36798:11726:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://5f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc4347856
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.